[
  {
    "path": ".eslintignore",
    "content": "node_modules\ndist\ndist-dts\nexamples\n**/*.js\n**/*.mjs\n**/*.cjs\n**/playground\nintegration-tests/tests/prisma/*/client\nintegration-tests/tests/prisma/*/drizzle\ndrizzle-kit/*\n"
  },
  {
    "path": ".eslintrc.yaml",
    "content": "root: true\nextends:\n  - 'eslint:recommended'\n  - 'plugin:@typescript-eslint/recommended'\n  - 'plugin:unicorn/recommended'\nparser: '@typescript-eslint/parser'\nparserOptions:\n  project: './tsconfig.json'\nplugins:\n  - import\n  - unused-imports\n  - no-instanceof\n  - drizzle-internal\noverrides:\n  - files:\n      - '**/tests/**/*.ts'\n      - '**/type-tests/**/*.ts'\n    rules:\n      import/extensions: 'off'\n      no-instanceof: 'off'\n  - files: 'eslint-plugin-drizzle/**/*'\n    rules:\n      import/extensions: 'off'\nrules:\n  '@typescript-eslint/consistent-type-imports':\n    - error\n    - disallowTypeAnnotations: false\n      fixStyle: separate-type-imports\n  '@typescript-eslint/no-import-type-side-effects': 'error'\n  import/no-cycle: error\n  import/no-self-import: error\n  import/no-empty-named-blocks: error\n  unused-imports/no-unused-imports: error\n  import/no-useless-path-segments: error\n  import/newline-after-import: error\n  import/no-duplicates: error\n  import/extensions:\n    - error\n    - always\n    - ignorePackages: true\n  '@typescript-eslint/no-explicit-any': 'off'\n  '@typescript-eslint/no-non-null-assertion': 'off'\n  '@typescript-eslint/no-namespace': 'off'\n  '@typescript-eslint/no-unused-vars':\n    - error\n    - argsIgnorePattern: '^_'\n      varsIgnorePattern: '^_'\n  '@typescript-eslint/ban-types':\n    - error\n    - extendDefaults: true\n      types:\n        '{}' : false\n  '@typescript-eslint/no-this-alias': 'off'\n  '@typescript-eslint/no-var-requires': 'off'\n  'unicorn/prefer-node-protocol': 'off'\n  'unicorn/prefer-top-level-await': 'off'\n  'unicorn/prevent-abbreviations': 'off'\n  'unicorn/prefer-switch': 'off'\n  'unicorn/catch-error-name': 'off'\n  'unicorn/no-null': 'off'\n  'unicorn/numeric-separators-style': 'off'\n  'unicorn/explicit-length-check': 'off'\n  'unicorn/filename-case': 'off'\n  'unicorn/prefer-module': 'off'\n  'unicorn/no-array-reduce': 'off'\n  'unicorn/no-nested-ternary': 'off'\n  'unicorn/no-useless-undefined':\n    - error\n    - checkArguments: false\n  'unicorn/no-this-assignment': 'off'\n  'unicorn/empty-brace-spaces': 'off'\n  'unicorn/no-thenable': 'off'\n  'unicorn/consistent-function-scoping': 'off'\n  'unicorn/prefer-type-error': 'off'\n  'unicorn/relative-url-style': 'off'\n  'eqeqeq': 'error'\n  'no-instanceof/no-instanceof': 'error'\n  'drizzle-internal/require-entity-kind': 'error'\n  'unicorn/prefer-string-replace-all': 'off'\n  'unicorn/no-process-exit': 'off'\n  '@typescript-eslint/ban-ts-comment': 'off'\n  '@typescript-eslint/no-empty-interface': 'off'\n  '@typescript-eslint/no-unsafe-declaration-merging': 'off'\n  'no-inner-declarations': 'off'\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: drizzle-team\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\nlfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-template.yaml",
    "content": "name: \"Bug Report\"\ndescription: Report an issue or possible bug\ntitle: \"[BUG]:\"\nlabels: [\"bug\"]\n\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thank you for taking the time to file a bug report! Please provide as much information as possible.\n        \n  - type: checkboxes\n    id: verified\n    attributes:\n      label: Report hasn't been filed before.\n      options:\n        - label: I have verified that the bug I'm about to report hasn't been filed before.\n          required: true\n\n  - type: input\n    attributes:\n      label: What version of `drizzle-orm` are you using?\n      description: You can check the version by opening the `package.json` file in your project.\n      placeholder: 0.0.0\n    validations:\n      required: true\n\n  - type: input\n    attributes:\n      label: What version of `drizzle-kit` are you using?\n      description: You can check the version by opening the `package.json` file in your project.\n      placeholder: 0.0.0\n    validations:\n      required: true\n\n  - type: input\n    attributes:\n      label: Other packages\n      description: If this bug is related to one of the other first-party packages we maintain, please list them here alongside their version.\n      placeholder: drizzle-zod@0.0.0, drizzle-valibot@0.0.0\n    validations:\n      required: false\n\n  - type: textarea\n    attributes:\n      label: Describe the Bug\n      description: |\n        To fill this field, please answer the following:\n          - What is the undesired behavior?\n          - What are the steps to reproduce it?\n          - What is the desired result?\n\n        If the issue is more specific, consider answering the following questions if you think they may be relevant:\n          - What database engine are you using? Are you using a specific cloud provider? Which one?\n          - Do you think this bug pertains to a specific database driver? Which one?\n          - Are you working in a monorepo?\n          - If this is a bug related to types: What Typescript version are you using? What's the content of your tsconfig.json file?\n          - If you're using a runtime that isn't Node.js: Which one? What version? Have you verified that this isn't an issue with the runtime itself?\n    validations:\n      required: true\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: true\ncontact_links:\n  - name: Ask a question\n    url: https://discord.gg/JGrkEU4Scj\n    about: Ask questions and discuss with other community members in Discord\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/docs-template.yaml",
    "content": "name: \"Documentation Enhancement\"\ndescription: Suggest documentation improvements\ntitle: \"[DOCS]:\"\nlabels: [\"docs\"]\n\nbody:\n  - type: checkboxes\n    id: verified\n    attributes:\n      label: Enhancement hasn't been filed before.\n      options:\n        - label: I have verified this enhancement I'm about to request hasn't been suggested before.\n          required: true\n\n  - type: textarea\n    attributes:\n      label: Describe the enhancement you want to request\n      description: What do you want to change or add to the documentation?\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-template.yaml",
    "content": "name: \"Feature Request\"\ndescription: Suggest new feature\ntitle: \"[FEATURE]:\"\nlabels: [\"enhancement\"]\n\nbody:\n  - type: checkboxes\n    id: verified\n    attributes:\n      label: Feature hasn't been suggested before.\n      options:\n        - label: I have verified this feature I'm about to request hasn't been suggested before.\n          required: true\n\n  - type: textarea\n    attributes:\n      label: Describe the enhancement you want to request\n      description: What do you want to change or add? What are the benefits of implementing this?\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "name: \"CodeQL\"\n\non:\n  push:\n    branches: [ 'main', 'beta' ]\n  pull_request:\n    # The branches below must be a subset of the branches above\n    branches: [ 'main' ]\n  schedule:\n    - cron: '44 16 * * 0'\n\njobs:\n  analyze:\n    name: Analyze\n    runs-on: ubuntu-22.04\n    permissions:\n      actions: read\n      contents: read\n      security-events: write\n\n    strategy:\n      fail-fast: false\n      matrix:\n        language: [ 'javascript' ]\n        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]\n        # Use only 'java' to analyze code written in Java, Kotlin or both\n        # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both\n        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support\n\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v4\n\n    # Initializes the CodeQL tools for scanning.\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v3\n      with:\n        languages: ${{ matrix.language }}\n        # If you wish to specify custom queries, you can do so here or in a config file.\n        # By default, queries listed here will override any specified in a config file.\n        # Prefix the list here with \"+\" to use these queries and those in the config file.\n\n        # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs\n        # queries: security-extended,security-and-quality\n\n\n    # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift).\n    # If this step fails, then you should remove it and run the build manually (see below)\n    - name: Autobuild\n      uses: github/codeql-action/autobuild@v3\n\n    # ℹ️ Command-line programs to run using the OS shell.\n    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun\n\n    #   If the Autobuild fails above, remove it and uncomment the following three lines.\n    #   modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.\n\n    # - run: |\n    #     echo \"Run, Build Application using script\"\n    #     ./location_of_script_within_repo/buildscript.sh\n\n    - name: Perform CodeQL Analysis\n      uses: github/codeql-action/analyze@v3\n      with:\n        category: \"/language:${{matrix.language}}\"\n"
  },
  {
    "path": ".github/workflows/release-feature-branch.yaml",
    "content": "name: Release (feature branch)\n\non:\n  workflow_call:\n    secrets:\n      PLANETSCALE_CONNECTION_STRING:\n        required: true\n      NEON_CONNECTION_STRING:\n        required: true\n      # NEON_HTTP_CONNECTION_STRING:\n      #   required: true\n      TIDB_CONNECTION_STRING:\n        required: true\n      XATA_API_KEY:\n        required: true\n      XATA_BRANCH:\n        required: true\n      LIBSQL_REMOTE_URL:\n        required: true\n      LIBSQL_REMOTE_TOKEN:\n        required: true\n\njobs:\n  test:\n    # only run on all pushes or pull requests from forks\n    if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository\n    strategy:\n      matrix:\n        shard:\n          - gel\n          - planetscale\n          - singlestore-core\n          - singlestore-proxy\n          - singlestore-prefixed\n          - singlestore-custom\n          - neon-http\n          - neon-serverless\n          - drizzle-orm\n          - drizzle-kit\n          - drizzle-zod\n          - drizzle-seed\n          - drizzle-typebox\n          - drizzle-valibot\n          - drizzle-arktype\n          - other\n    runs-on: ubuntu-22.04\n    services:\n      postgres-postgis:\n        image: postgis/postgis:16-3.4\n        env:\n          POSTGRES_USER: postgres\n          POSTGRES_PASSWORD: postgres\n          POSTGRES_DB: drizzle\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 54322:5432\n      postgres-vector:\n        image: pgvector/pgvector:pg16\n        env:\n          POSTGRES_USER: postgres\n          POSTGRES_PASSWORD: postgres\n          POSTGRES_DB: drizzle\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 54321:5432\n      postgres:\n        image: postgres:14\n        env:\n          POSTGRES_USER: postgres\n          POSTGRES_PASSWORD: postgres\n          POSTGRES_DB: drizzle\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 55433:5432\n      mysql:\n        image: mysql:8\n        env:\n          MYSQL_ROOT_PASSWORD: root\n          MYSQL_DATABASE: drizzle\n        options: >-\n          --health-cmd \"mysqladmin ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 33306:3306\n      singlestore:\n        image: ghcr.io/singlestore-labs/singlestoredb-dev:latest\n        env:\n          ROOT_PASSWORD: singlestore\n        ports:\n          - 33307:3306\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: '20.19'\n          registry-url: 'https://registry.npmjs.org'\n\n      - uses: pnpm/action-setup@v3\n        name: Install pnpm\n        id: pnpm-install\n        with:\n          version: latest\n          run_install: false\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        shell: bash\n        run: |\n          echo \"STORE_PATH=$(pnpm store path --silent)\" >> $GITHUB_OUTPUT\n\n      - uses: actions/cache@v4\n        name: Setup pnpm cache\n        with:\n          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n\n      - name: Install dependencies\n        run: pnpm install\n\n      - name: Build Prisma client\n        working-directory: drizzle-orm\n        run: pnpm prisma generate --schema src/prisma/schema.prisma\n\n      - name: Build\n        run: pnpm build\n\n      - name: Run tests\n        env:\n          PG_CONNECTION_STRING: postgres://postgres:postgres@localhost:55433/drizzle\n          PG_VECTOR_CONNECTION_STRING: postgres://postgres:postgres@localhost:54321/drizzle\n          PG_POSTGIS_CONNECTION_STRING: postgres://postgres:postgres@localhost:54322/drizzle\n          MYSQL_CONNECTION_STRING: mysql://root:root@localhost:33306/drizzle\n          PLANETSCALE_CONNECTION_STRING: ${{ secrets.PLANETSCALE_CONNECTION_STRING }}\n          NEON_CONNECTION_STRING: ${{ secrets.NEON_CONNECTION_STRING }}\n          # NEON_HTTP_CONNECTION_STRING: postgres://postgres:postgres@db.localtest.me:5432/postgres\n          NEON_HTTP_CONNECTION_STRING: ${{ secrets.NEON_CONNECTION_STRING }}\n          NEON_SERVERLESS_CONNECTION_STRING: postgres://postgres:postgres@localhost:5445/postgres\n          TIDB_CONNECTION_STRING: ${{ secrets.TIDB_CONNECTION_STRING }}\n          XATA_API_KEY: ${{ secrets.XATA_API_KEY }}\n          XATA_BRANCH: ${{ secrets.XATA_BRANCH }}\n          LIBSQL_URL: file:local.db\n          LIBSQL_REMOTE_URL: ${{ secrets.LIBSQL_REMOTE_URL }}\n          LIBSQL_REMOTE_TOKEN: ${{ secrets.LIBSQL_REMOTE_TOKEN }}\n          SINGLESTORE_CONNECTION_STRING: singlestore://root:singlestore@localhost:33307/\n        working-directory: integration-tests\n        run: |\n          if [[ ${{ github.event_name }} != \"push\" && \"${{ github.event.pull_request.head.repo.full_name }}\" != \"${{ github.repository }}\" ]]; then\n            export SKIP_EXTERNAL_DB_TESTS=1\n          fi\n\n          case ${{ matrix.shard }} in\n\n            gel)\n              if [[ -z \"$SKIP_EXTERNAL_DB_TESTS\" ]]; then\n                pnpm vitest run tests/gel\n              fi\n            ;;\n\n            planetscale)\n              if [[ -z \"$SKIP_EXTERNAL_DB_TESTS\" ]]; then\n                pnpm vitest run \\\n                  tests/mysql/mysql-planetscale.test.ts \\\n                  tests/relational/mysql.planetscale-v1.test.ts \\\n                  tests/relational/mysql.planetscale.test.ts\n              fi\n            ;;\n\n            singlestore-core)\n              pnpm vitest run tests/singlestore/singlestore.test.ts\n            ;;\n\n            singlestore-proxy)\n              pnpm vitest run tests/singlestore/singlestore-proxy.test.ts\n            ;;\n\n            singlestore-prefixed)\n              pnpm vitest run tests/singlestore/singlestore-prefixed.test.ts\n            ;;\n\n            singlestore-custom)\n              pnpm vitest run tests/singlestore/singlestore-custom.test.ts\n            ;;\n\n            neon-http)\n              if [[ -z \"$SKIP_EXTERNAL_DB_TESTS\" ]]; then\n                pnpm vitest run tests/pg/neon-http.test.ts tests/pg/neon-http-batch.test.ts\n              fi\n            ;;\n\n            neon-serverless)\n              docker compose -f docker-neon.yml up -d\n              pnpm vitest run --config=./vitest-ci.config.ts tests/pg/neon-serverless.test.ts\n              docker compose -f docker-neon.yml down\n            ;;\n\n            drizzle-orm|drizzle-kit|drizzle-zod|drizzle-seed|drizzle-typebox|drizzle-valibot|drizzle-arktype)\n              (cd .. && pnpm test --filter ${{ matrix.shard }})\n            ;;\n\n            other)\n              pnpm vitest run \\\n                --exclude tests/gel \\\n                --exclude tests/mysql/mysql-planetscale.test.ts \\\n                --exclude tests/relational/mysql.planetscale-v1.test.ts \\\n                --exclude tests/relational/mysql.planetscale.test.ts \\\n                --exclude tests/singlestore/singlestore.test.ts \\\n                --exclude tests/singlestore/singlestore-proxy.test.ts \\\n                --exclude tests/singlestore/singlestore-prefixed.test.ts \\\n                --exclude tests/singlestore/singlestore-custom.test.ts \\\n                --exclude tests/pg/neon-http.test.ts \\\n                --exclude tests/pg/neon-http-batch.test.ts \\\n                --exclude tests/pg/neon-serverless.test.ts\n            ;;\n\n          esac\n\n  attw:\n    # only run on all pushes or pull requests from forks\n    if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository\n    strategy:\n      matrix:\n        package:\n          - drizzle-orm\n          - drizzle-kit\n          - drizzle-zod\n          - drizzle-seed\n          - drizzle-typebox\n          - drizzle-valibot\n          - drizzle-arktype\n          - eslint-plugin-drizzle\n    runs-on: ubuntu-22.04\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: '22'\n          registry-url: 'https://registry.npmjs.org'\n\n      - uses: pnpm/action-setup@v3\n        name: Install pnpm\n        id: pnpm-install\n        with:\n          version: latest\n          run_install: false\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        shell: bash\n        run: |\n          echo \"STORE_PATH=$(pnpm store path --silent)\" >> $GITHUB_OUTPUT\n\n      - uses: actions/cache@v4\n        name: Setup pnpm cache\n        with:\n          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n\n      - name: Install dependencies\n        run: pnpm install\n\n      - name: Install Bun\n        uses: oven-sh/setup-bun@v2\n\n      - name: Check preconditions\n        id: checks\n        shell: bash\n        working-directory: ${{ matrix.package }}\n        run: |\n          old_version=\"$(jq -r .version package.json)\"\n          version=\"$old_version-$(git rev-parse --short HEAD)\"\n          npm version $version\n          tag=\"${{ github.ref_name }}\"\n          is_version_published=\"$(npm view ${{ matrix.package }} versions --json | jq -r '.[] | select(. == \"'$version'\") | . == \"'$version'\"')\"\n\n          if [[ \"$is_version_published\" == \"true\" ]]; then\n            echo \"\\`${{ matrix.package }}$version\\` already published, adding tag \\`$tag\\`\" >> $GITHUB_STEP_SUMMARY\n            npm dist-tag add ${{ matrix.package }}@$version $tag\n          else\n            {\n              echo \"version=$version\"\n              echo \"tag=$tag\"\n              echo \"has_new_release=true\"\n            } >> $GITHUB_OUTPUT\n          fi\n\n      - name: Build Prisma client\n        if: steps.checks.outputs.has_new_release == 'true'\n        working-directory: drizzle-orm\n        run: pnpm prisma generate --schema src/prisma/schema.prisma\n\n      - name: Build\n        if: steps.checks.outputs.has_new_release == 'true'\n        run: pnpm build\n      \n      - name: Pack\n        if: steps.checks.outputs.has_new_release == 'true'\n        working-directory: ${{ matrix.package }}\n        run: npm run pack\n  \n      - name: Run @arethetypeswrong/cli\n        if: steps.checks.outputs.has_new_release == 'true'\n        working-directory: ${{ matrix.package }}\n        run: bunx attw package.tgz\n\n  release:\n    # only run on all pushes or pull requests from forks\n    if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository\n    needs:\n      - test\n      - attw\n    strategy:\n      matrix:\n        package:\n          - drizzle-orm\n          - drizzle-kit\n          - drizzle-zod\n          - drizzle-seed\n          - drizzle-typebox\n          - drizzle-valibot\n          - drizzle-arktype\n          - eslint-plugin-drizzle\n    runs-on: ubuntu-22.04\n    permissions:\n      contents: read\n      id-token: write # for OIDC\n    # force empty so npm can use OIDC\n    env:\n      NODE_AUTH_TOKEN: \"\"   \n      NPM_TOKEN: \"\"\n    steps:\n      - uses: actions/checkout@v5\n      - uses: pnpm/action-setup@v4\n        with: { run_install: false }\n      - uses: actions/setup-node@v6\n        with: { node-version: '24', cache: 'pnpm', cache-dependency-path: pnpm-lock.yaml }\n      - run: pnpm install --frozen-lockfile --prefer-offline\n    \n      # >= 11.5.1 for trusted publishing\n      - name: Update NPM\n        run: npm install -g npm@latest\n\n      # nuke, so npm can use OIDC\n      - name: Remove temp npmrc\n        run: rm -f \"$NPM_CONFIG_USERCONFIG\"\n\n      - name: Check preconditions\n        id: checks\n        shell: bash\n        working-directory: ${{ matrix.package }}\n        run: |\n          old_version=\"$(jq -r .version package.json)\"\n          version=\"$old_version-$(git rev-parse --short HEAD)\"\n          npm version $version\n          tag=\"${{ github.ref_name }}\"\n          is_version_published=\"$(npm view ${{ matrix.package }} versions --json | jq -r '.[] | select(. == \"'$version'\") | . == \"'$version'\"')\"\n\n          if [[ \"$is_version_published\" == \"true\" ]]; then\n            echo \"\\`${{ matrix.package }}$version\\` already published, adding tag \\`$tag\\`\" >> $GITHUB_STEP_SUMMARY\n          else\n            {\n              echo \"version=$version\"\n              echo \"tag=$tag\"\n              echo \"has_new_release=true\"\n            } >> $GITHUB_OUTPUT\n          fi\n\n      - name: Build Prisma client\n        working-directory: drizzle-orm\n        run: pnpm prisma generate --schema src/prisma/schema.prisma\n\n      - name: Build\n        if: steps.checks.outputs.has_new_release == 'true'\n        run: pnpm build\n\n      - name: Pack\n        if: steps.checks.outputs.has_new_release == 'true'\n        working-directory: ${{ matrix.package }}\n        shell: bash\n        run: npm run pack\n\n      - name: Publish\n        if: github.event_name == 'push' && steps.checks.outputs.has_new_release == 'true'\n        working-directory: ${{ matrix.package }}\n        shell: bash\n        run: |\n          tag=\"${{ steps.checks.outputs.tag }}\"\n          version=\"${{ steps.checks.outputs.version }}\"\n\n          echo \"Publishing ${{ matrix.package }}@$tag using version $version\"\n          npm run publish -- --tag $tag\n\n          echo \"npm: \\`${{ matrix.package }}@$tag | ${{ matrix.package }}@$version\\`\" >> $GITHUB_STEP_SUMMARY\n\n          # Post release message to Discord\n          # curl -X POST -H \"Content-Type: application/json\" -d \"{\\\"embeds\\\": [{\\\"title\\\": \\\"New \\`${{ matrix.package }}\\` release! 🎉\\\", \\\"url\\\": \\\"https://www.npmjs.com/package/${{ matrix.package }}/v/$version\\\", \\\"color\\\": \\\"12907856\\\", \\\"fields\\\": [{\\\"name\\\": \\\"Version\\\", \\\"value\\\": \\\"\\`$version\\`\\\"}, {\\\"name\\\": \\\"Tag\\\", \\\"value\\\": \\\"\\`$tag\\`\\\"}]}]}\" ${{ secrets.DISCORD_DEV_RELEASE_WEBHOOK_URL }}\n\n"
  },
  {
    "path": ".github/workflows/release-latest.yaml",
    "content": "name: Release (latest)\n\non:\n  workflow_call:\n    secrets:\n      PLANETSCALE_CONNECTION_STRING:\n        required: true\n      NEON_CONNECTION_STRING:\n        required: true\n      # NEON_HTTP_CONNECTION_STRING:\n      #   required: true\n      TIDB_CONNECTION_STRING:\n        required: true\n      XATA_API_KEY:\n        required: true\n      XATA_BRANCH:\n        required: true\n      LIBSQL_REMOTE_URL:\n        required: true\n      LIBSQL_REMOTE_TOKEN:\n        required: true\n\njobs:\n  test:\n    strategy:\n      matrix:\n        shard:\n          - gel\n          - planetscale\n          - singlestore-core\n          - singlestore-proxy\n          - singlestore-prefixed\n          - singlestore-custom\n          - neon-http\n          - neon-serverless\n          - drizzle-orm\n          - drizzle-kit\n          - drizzle-zod\n          - drizzle-seed\n          - drizzle-typebox\n          - drizzle-valibot\n          - drizzle-arktype\n          - other\n    runs-on: ubuntu-22.04\n    services:\n      postgres-postgis:\n        image: postgis/postgis:16-3.4\n        env:\n          POSTGRES_USER: postgres\n          POSTGRES_PASSWORD: postgres\n          POSTGRES_DB: drizzle\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 54322:5432\n      postgres-vector:\n        image: pgvector/pgvector:pg16\n        env:\n          POSTGRES_USER: postgres\n          POSTGRES_PASSWORD: postgres\n          POSTGRES_DB: drizzle\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 54321:5432\n      postgres:\n        image: postgres:14\n        env:\n          POSTGRES_USER: postgres\n          POSTGRES_PASSWORD: postgres\n          POSTGRES_DB: drizzle\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 55433:5432\n      mysql:\n        image: mysql:8\n        env:\n          MYSQL_ROOT_PASSWORD: root\n          MYSQL_DATABASE: drizzle\n        options: >-\n          --health-cmd \"mysqladmin ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 33306:3306\n      singlestore:\n        image: ghcr.io/singlestore-labs/singlestoredb-dev:latest\n        env:\n          ROOT_PASSWORD: singlestore\n        ports:\n          - 33307:3306\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: '20.19'\n          registry-url: 'https://registry.npmjs.org'\n\n      - uses: pnpm/action-setup@v3\n        name: Install pnpm\n        id: pnpm-install\n        with:\n          version: latest\n          run_install: false\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        shell: bash\n        run: |\n          echo \"STORE_PATH=$(pnpm store path --silent)\" >> $GITHUB_OUTPUT\n\n      - uses: actions/cache@v4\n        name: Setup pnpm cache\n        with:\n          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n\n      - name: Install dependencies\n        run: pnpm install\n\n      - name: Build Prisma client\n        working-directory: drizzle-orm\n        run: pnpm prisma generate --schema src/prisma/schema.prisma\n\n      - name: Build\n        run: pnpm build\n\n      - name: Run tests\n        env:\n          PG_CONNECTION_STRING: postgres://postgres:postgres@localhost:55433/drizzle\n          PG_VECTOR_CONNECTION_STRING: postgres://postgres:postgres@localhost:54321/drizzle\n          PG_POSTGIS_CONNECTION_STRING: postgres://postgres:postgres@localhost:54322/drizzle\n          MYSQL_CONNECTION_STRING: mysql://root:root@localhost:33306/drizzle\n          PLANETSCALE_CONNECTION_STRING: ${{ secrets.PLANETSCALE_CONNECTION_STRING }}\n          NEON_CONNECTION_STRING: ${{ secrets.NEON_CONNECTION_STRING }}\n          # NEON_HTTP_CONNECTION_STRING: postgres://postgres:postgres@db.localtest.me:5432/postgres\n          NEON_HTTP_CONNECTION_STRING: ${{ secrets.NEON_CONNECTION_STRING }}\n          NEON_SERVERLESS_CONNECTION_STRING: postgres://postgres:postgres@localhost:5445/postgres\n          TIDB_CONNECTION_STRING: ${{ secrets.TIDB_CONNECTION_STRING }}\n          XATA_API_KEY: ${{ secrets.XATA_API_KEY }}\n          XATA_BRANCH: ${{ secrets.XATA_BRANCH }}\n          LIBSQL_URL: file:local.db\n          LIBSQL_REMOTE_URL: ${{ secrets.LIBSQL_REMOTE_URL }}\n          LIBSQL_REMOTE_TOKEN: ${{ secrets.LIBSQL_REMOTE_TOKEN }}\n          SINGLESTORE_CONNECTION_STRING: singlestore://root:singlestore@localhost:33307/\n        working-directory: integration-tests\n        run: |\n          case ${{ matrix.shard }} in\n\n            gel)\n              pnpm vitest run tests/gel\n            ;;\n\n            planetscale)\n              pnpm vitest run \\\n                tests/mysql/mysql-planetscale.test.ts \\\n                tests/relational/mysql.planetscale-v1.test.ts \\\n                tests/relational/mysql.planetscale.test.ts\n            ;;\n\n            singlestore-core)\n              pnpm vitest run tests/singlestore/singlestore.test.ts\n            ;;\n\n            singlestore-proxy)\n              pnpm vitest run tests/singlestore/singlestore-proxy.test.ts\n            ;;\n\n            singlestore-prefixed)\n              pnpm vitest run tests/singlestore/singlestore-prefixed.test.ts\n            ;;\n\n            singlestore-custom)\n              pnpm vitest run tests/singlestore/singlestore-custom.test.ts\n            ;;\n\n            neon-http)\n              pnpm vitest run tests/pg/neon-http.test.ts tests/pg/neon-http-batch.test.ts\n            ;;\n\n            neon-serverless)\n              docker compose -f docker-neon.yml up -d\n              pnpm vitest run tests/pg/neon-serverless.test.ts\n              docker compose -f docker-neon.yml down\n            ;;\n\n            drizzle-orm|drizzle-kit|drizzle-zod|drizzle-seed|drizzle-typebox|drizzle-valibot|drizzle-arktype)\n              (cd .. && pnpm test --filter ${{ matrix.shard }})\n            ;;\n\n            other)\n              pnpm vitest run \\\n                --exclude tests/gel \\\n                --exclude tests/mysql/mysql-planetscale.test.ts \\\n                --exclude tests/relational/mysql.planetscale-v1.test.ts \\\n                --exclude tests/relational/mysql.planetscale.test.ts \\\n                --exclude tests/singlestore/singlestore.test.ts \\\n                --exclude tests/singlestore/singlestore-proxy.test.ts \\\n                --exclude tests/singlestore/singlestore-prefixed.test.ts \\\n                --exclude tests/singlestore/singlestore-custom.test.ts \\\n                --exclude tests/pg/neon-http.test.ts \\\n                --exclude tests/pg/neon-http-batch.test.ts \\\n                --exclude tests/pg/neon-serverless.test.ts\n            ;;\n\n          esac\n\n  attw:\n    strategy:\n      matrix:\n        package:\n          - drizzle-orm\n          - drizzle-kit\n          - drizzle-zod\n          - drizzle-seed\n          - drizzle-typebox\n          - drizzle-valibot\n          - drizzle-arktype\n          - eslint-plugin-drizzle\n    runs-on: ubuntu-22.04\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: '18.18'\n          registry-url: 'https://registry.npmjs.org'\n\n      - uses: pnpm/action-setup@v3\n        name: Install pnpm\n        id: pnpm-install\n        with:\n          version: latest\n          run_install: false\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        shell: bash\n        run: |\n          echo \"STORE_PATH=$(pnpm store path --silent)\" >> $GITHUB_OUTPUT\n\n      - uses: actions/cache@v4\n        name: Setup pnpm cache\n        with:\n          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n\n      - name: Install dependencies\n        run: pnpm install\n\n      - name: Install Bun\n        uses: oven-sh/setup-bun@v2\n\n      - name: Check preconditions\n        id: checks\n        shell: bash\n        working-directory: ${{ matrix.package }}\n        run: |\n          latest=\"$(npm view --json ${{ matrix.package }} dist-tags.latest | jq -r)\"\n          version=\"$(jq -r .version package.json)\"\n          is_version_published=\"$(npm view ${{ matrix.package }} versions --json | jq -r '.[] | select(. == \"'$version'\") | . == \"'$version'\"')\"\n\n          if [[ \"$is_version_published\" == \"false\" && \"$latest\" != \"$version\" ]]; then\n            {\n              echo \"version=$version\"\n              echo \"has_new_release=true\"\n              echo \"changelog_path=$changelogPath\"\n            } >> $GITHUB_OUTPUT\n          fi\n\n      - name: Build Prisma client\n        if: steps.checks.outputs.has_new_release == 'true'\n        working-directory: drizzle-orm\n        run: pnpm prisma generate --schema src/prisma/schema.prisma\n\n      - name: Build\n        if: steps.checks.outputs.has_new_release == 'true'\n        run: pnpm build\n      \n      - name: Pack\n        if: steps.checks.outputs.has_new_release == 'true'\n        working-directory: ${{ matrix.package }}\n        run: npm run pack\n  \n      - name: Run @arethetypeswrong/cli\n        if: steps.checks.outputs.has_new_release == 'true'\n        working-directory: ${{ matrix.package }}\n        run: bunx attw package.tgz\n\n  release:\n    permissions:\n      contents: write # for creating GitHub releases\n      id-token: write # for OIDC\n    needs:\n      - test\n      - attw\n    strategy:\n      fail-fast: false\n      matrix:\n        package:\n          - drizzle-orm\n          - drizzle-kit\n          - drizzle-zod\n          - drizzle-seed\n          - drizzle-typebox\n          - drizzle-valibot\n          - drizzle-arktype\n          - eslint-plugin-drizzle\n    runs-on: ubuntu-22.04\n    # force empty so npm can use OIDC\n    env:\n      NODE_AUTH_TOKEN: \"\"\n      NPM_TOKEN: \"\"\n    services:\n      postgres-postgis:\n        image: postgis/postgis:16-3.4\n        env:\n          POSTGRES_USER: postgres\n          POSTGRES_PASSWORD: postgres\n          POSTGRES_DB: drizzle\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 54322:5432\n      postgres-vector:\n        image: pgvector/pgvector:pg16\n        env:\n          POSTGRES_USER: postgres\n          POSTGRES_PASSWORD: postgres\n          POSTGRES_DB: drizzle\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 54321:5432\n      postgres:\n        image: postgres:14\n        env:\n          POSTGRES_USER: postgres\n          POSTGRES_PASSWORD: postgres\n          POSTGRES_DB: drizzle\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 55433:5432\n      mysql:\n        image: mysql:8\n        env:\n          MYSQL_ROOT_PASSWORD: root\n          MYSQL_DATABASE: drizzle\n        options: >-\n          --health-cmd \"mysqladmin ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 33306:3306\n    steps:\n      - uses: actions/checkout@v5\n      - uses: pnpm/action-setup@v4\n        with: { run_install: false }\n      - uses: actions/setup-node@v6\n        with: { node-version: '24', cache: 'pnpm', cache-dependency-path: pnpm-lock.yaml }\n      - run: pnpm install --frozen-lockfile --prefer-offline\n    \n      # >= 11.5.1 for trusted publishing\n      - name: Update NPM\n        run: npm install -g npm@latest\n\n      # nuke, so npm can use OIDC\n      - name: Remove temp npmrc\n        run: rm -f \"$NPM_CONFIG_USERCONFIG\"\n\n      - name: Check preconditions\n        id: checks\n        shell: bash\n        working-directory: ${{ matrix.package }}\n        run: |\n          latest=\"$(npm view --json ${{ matrix.package }} dist-tags.latest | jq -r)\"\n          version=\"$(jq -r .version package.json)\"\n          is_version_published=\"$(npm view ${{ matrix.package }} versions --json | jq -r '.[] | select(. == \"'$version'\") | . == \"'$version'\"')\"\n\n          if [[ \"$is_version_published\" == \"true\" ]]; then\n            echo \"\\`${{ matrix.package }}@$version\\` already published, adding tag \\`latest\\`\" >> $GITHUB_STEP_SUMMARY\n          elif [[ \"$latest\" != \"$version\" ]]; then\n            echo \"Latest:  $latest\"\n            echo \"Current: $version\"\n\n            changelogPath=$(node -e \"console.log(require('path').resolve('..', 'changelogs', '${{ matrix.package }}', '$version.md'))\")\n            if [[ ! -f \"$changelogPath\" ]]; then\n              echo \"::error::Changelog for version $version not found: $changelogPath\"\n              exit 1\n            fi\n\n            {\n              echo \"version=$version\"\n              echo \"has_new_release=true\"\n              echo \"changelog_path=$changelogPath\"\n            } >> $GITHUB_OUTPUT\n          else\n            echo \"Already up to date: $version\"\n            echo \"\\`$version\\` is already latest on NPM\" >> $GITHUB_STEP_SUMMARY\n          fi\n\n      - name: Build Prisma client\n        if: steps.checks.outputs.has_new_release == 'true'\n        working-directory: drizzle-orm\n        run: pnpm prisma generate --schema src/prisma/schema.prisma\n\n      - name: Build\n        if: steps.checks.outputs.has_new_release == 'true'\n        run: pnpm build\n\n      - name: Pack\n        if: steps.checks.outputs.has_new_release == 'true'\n        working-directory: ${{ matrix.package }}\n        shell: bash\n        run: npm run pack\n      \n      - name: Publish\n        if: steps.checks.outputs.has_new_release == 'true'\n        working-directory: ${{ matrix.package }}\n        shell: bash\n        run: |\n          version=\"${{ steps.checks.outputs.version }}\"\n\n          echo \"Publishing ${{ matrix.package }}@$version\"\n          npm run publish\n\n          echo \"npm: \\`+ ${{ matrix.package }}@$version\\`\" >> $GITHUB_STEP_SUMMARY\n\n          # Post release message to Discord\n          # curl -X POST -H \"Content-Type: application/json\" -d \"{\\\"embeds\\\": [{\\\"title\\\": \\\"New \\`${{ matrix.package }}\\` release! 🎉\\\", \\\"url\\\": \\\"https://www.npmjs.com/package/${{ matrix.package }}\\\", \\\"color\\\": \\\"12907856\\\", \\\"fields\\\": [{\\\"name\\\": \\\"Tag\\\", \\\"value\\\": \\\"\\`$tag\\`\\\"}]}]}\" ${{ secrets.DISCORD_RELEASE_WEBHOOK_URL }}\n\n      - name: Create GitHub release for ORM package\n        uses: actions/github-script@v6\n        if: matrix.package == 'drizzle-orm' && steps.checks.outputs.has_new_release == 'true'\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          script: |\n            try {\n              const fs = require(\"fs\");\n              const path = require(\"path\");\n\n              const version = \"${{ steps.checks.outputs.version }}\";\n              const changelog = fs.readFileSync(\"${{ steps.checks.outputs.changelog_path }}\", \"utf8\");\n\n              const release = await github.rest.repos.createRelease({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                tag_name: `${version}`,\n                name: `${version}`,\n                body: changelog,\n              });\n\n              await github.rest.repos.uploadReleaseAsset({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                release_id: release.data.id,\n                name: `${{ matrix.package }}-${version}-dist.tgz`,\n                data: fs.readFileSync(path.resolve(\"${{ matrix.package }}\", \"package.tgz\")),\n              });\n            } catch (e) {\n              core.setFailed(e.message);\n            }\n\n      - name: Create GitHub release for KIT package\n        uses: actions/github-script@v6\n        if: matrix.package == 'drizzle-kit' && steps.checks.outputs.has_new_release == 'true'\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          script: |\n            try {\n              const fs = require(\"fs\");\n              const path = require(\"path\");\n\n              const version = \"${{ steps.checks.outputs.version }}\";\n              const changelog = fs.readFileSync(\"${{ steps.checks.outputs.changelog_path }}\", \"utf8\");\n\n              const release = await github.rest.repos.createRelease({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                tag_name: `drizzle-kit@${version}`,\n                name: `drizzle-kit@${version}`,\n                body: changelog,\n              });\n\n              await github.rest.repos.uploadReleaseAsset({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                release_id: release.data.id,\n                name: `${{ matrix.package }}-${version}-dist.tgz`,\n                data: fs.readFileSync(path.resolve(\"${{ matrix.package }}\", \"package.tgz\")),\n              });\n            } catch (e) {\n              core.setFailed(e.message);\n            }\n"
  },
  {
    "path": ".github/workflows/router.yaml",
    "content": "name: Release Router\n\non:\n  push:\n    branches-ignore:\n      - main\n  pull_request:\n  workflow_dispatch:\n\njobs:\n  switch:\n    runs-on: ubuntu-24.04\n    outputs:\n      target: ${{ steps.route.outputs.target }}\n    steps:\n      - name: Route release\n        id: route\n        shell: bash\n        run: |\n          HEAD_REPO=\"${{ github.event.pull_request.head.repo.full_name }}\"\n          if [[ \"$GITHUB_EVENT_NAME\" == \"workflow_dispatch\" && \"${GITHUB_REF##*/}\" == \"main\" ]]; then\n            echo \"target=latest\" >> $GITHUB_OUTPUT\n          # only run on all pushes or pull requests from forks\n          elif [[ \"$GITHUB_EVENT_NAME\" == \"push\" ]] || [[ \"$HEAD_REPO\" != \"$GITHUB_REPOSITORY\" ]]; then\n            echo \"target=feature\" >> $GITHUB_OUTPUT\n          else\n            echo \"target=skip\" >> $GITHUB_OUTPUT\n          fi\n\n  run-feature:\n    needs: switch\n    if: needs.switch.outputs.target == 'feature'\n    uses: ./.github/workflows/release-feature-branch.yaml\n    secrets:\n      PLANETSCALE_CONNECTION_STRING: ${{ secrets.PLANETSCALE_CONNECTION_STRING }}\n      NEON_CONNECTION_STRING: ${{ secrets.NEON_CONNECTION_STRING }}\n      # NEON_HTTP_CONNECTION_STRING: ${{ secrets.NEON_CONNECTION_STRING }}\n      TIDB_CONNECTION_STRING: ${{ secrets.TIDB_CONNECTION_STRING }}\n      XATA_API_KEY: ${{ secrets.XATA_API_KEY }}\n      XATA_BRANCH: ${{ secrets.XATA_BRANCH }}\n      LIBSQL_REMOTE_URL: ${{ secrets.LIBSQL_REMOTE_URL }}\n      LIBSQL_REMOTE_TOKEN: ${{ secrets.LIBSQL_REMOTE_TOKEN }}\n\n  run-latest:\n    needs: switch\n    if: needs.switch.outputs.target == 'latest'\n    uses: ./.github/workflows/release-latest.yaml\n    secrets:\n      PLANETSCALE_CONNECTION_STRING: ${{ secrets.PLANETSCALE_CONNECTION_STRING }}\n      NEON_CONNECTION_STRING: ${{ secrets.NEON_CONNECTION_STRING }}\n      # NEON_HTTP_CONNECTION_STRING: ${{ secrets.NEON_CONNECTION_STRING }}\n      TIDB_CONNECTION_STRING: ${{ secrets.TIDB_CONNECTION_STRING }}\n      XATA_API_KEY: ${{ secrets.XATA_API_KEY }}\n      XATA_BRANCH: ${{ secrets.XATA_BRANCH }}\n      LIBSQL_REMOTE_URL: ${{ secrets.LIBSQL_REMOTE_URL }}\n      LIBSQL_REMOTE_TOKEN: ${{ secrets.LIBSQL_REMOTE_TOKEN }}"
  },
  {
    "path": ".github/workflows/unpublish-release-feature-branch.yaml",
    "content": "name: Unpublish release (feature branch)\n\non: delete\n\njobs:\n  unpublish-release:\n    if: github.event.ref_type == 'branch' && github.event.ref != 'refs/heads/main' && github.event.ref != 'refs/heads/beta'\n    strategy:\n      matrix:\n        package:\n          - drizzle-orm\n          - drizzle-kit\n          - drizzle-zod\n          - drizzle-typebox\n          - drizzle-valibot\n          - drizzle-arktype\n          - eslint-plugin-drizzle\n    runs-on: ubuntu-22.04\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: '22'\n          registry-url: 'https://registry.npmjs.org'\n\n      - name: Unpublish\n        run: |\n          tag=\"${{ github.event.ref }}\"\n          tag=\"${tag#refs/heads/}\"\n          echo \"Unpublishing ${{ matrix.package }}@$tag\"\n          npm dist-tag rm ${{ matrix.package }} $tag\n\n          echo \"npm: \\`- ${{ matrix.package }}@$tag\\`\" >> $GITHUB_STEP_SUMMARY\n        working-directory: ${{ matrix.package }}\n        env:\n          NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\n.vscode\ndist\ndist.new\n*.tsbuildinfo\n*.tgz\n/*.sql\n.cache\n.turbo\n.rollup.cache\ndist-dts\nrollup.config-*.mjs\n*.log\n.DS_Store\ndrizzle-seed/src/dev"
  },
  {
    "path": ".markdownlint.yaml",
    "content": "no-inline-html: false\nfirst-line-h1: false\nline-length: false\nMD010:\n  spaces_per_tab: 2\n"
  },
  {
    "path": ".npmrc",
    "content": "# prefer-workspace-packages = true\n"
  },
  {
    "path": ".nvmrc",
    "content": "22"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\nhelp@drizzle.team.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nWelcome! We're glad you're interested in Drizzle ORM and want to help us make it better.\n\nDrizzle ORM is owned by [Drizzle Team](https://drizzle.team) and maintained by community members, mainly by our core contributors ([@AndriiSherman](https://github.com/AndriiSherman), [@AlexBlokh](https://github.com/AlexBlokh), [@dankochetov](https://github.com/dankochetov)). Everything that is going to be merged should be approved by all core contributors members.\n\n---\n\nThere are many ways you can contribute to the Drizzle ORM project:\n\n- [Submitting bug reports](#bug-report)\n- [Submitting feature request](#feature-request)\n- [Providing feedback](#feedback)\n- [Contribution guidelines](#contribution-guidelines)\n\n## <a name=\"bug-report\"></a> Submitting bug report\n\nTo report a bug or issue, please use our [issue form](https://github.com/drizzle-team/drizzle-orm/issues/new/choose) and choose Bug Report.\n\n## <a name=\"feature-request\"></a> Submitting feature request\n\nTo request a feature, please use our [issue form](https://github.com/drizzle-team/drizzle-orm/issues/new/choose) and choose Feature Request.\n\n## <a name=\"feedback\"></a> Providing feedback\n\nThere are several ways you can provide feedback:\n\n- You can join our [Discord server](https://discord.gg/yfjTbVXMW4) and provide feedback there.\n- You can add new ticket in [Discussions](https://github.com/drizzle-team/drizzle-orm/discussions).\n- Mention our [Twitter account](https://twitter.com/DrizzleOrm).\n\n## <a name=\"contribution-guidelines\"></a> Contribution guidelines\n\n- [Pre-contribution setup](#pre-contribution)\n  - [Installing Node](#installing-node)\n  - [Installing pnpm](#installing-pnpm)\n  - [Installing Docker](#installing-docker)\n  - [Cloning the repository](#cloning-the-repository)\n  - [Repository structure](#repository-structure)\n  - [Building the project](#building-the-project)\n- [Commit message guidelines](#commit-message-guidelines)\n- [Contributing to `drizzle-orm`](#contributing-orm)\n  - [Project structure](#project-structure-orm)\n  - [Running tests](#running-tests-orm)\n  - [PR guidelines](#pr-guidelines-orm)\n- [Contributing to `drizzle-kit`](#contributing-kit)\n  - [Project structure](#project-structure-kit)\n  - [Running tests](#running-tests-kit)\n  - [PR guidelines](#pr-guidelines-kit)\n\n## <a name=\"pre-contribution\"></a> Pre-contribution setup\n\n### <a name=\"installing-node\"></a> Installing Node\n\n```bash\n# https://github.com/nvm-sh/nvm#install--update-script\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash\nnvm install 18.13.0\nnvm use 18.13.0\n```\n\n### <a name=\"installing-pnpm\"></a> Installing pnpm\n\n```bash\n# https://pnpm.io/installation\nnpm install -g pnpm\n```\n\n### <a name=\"installing-docker\"></a> Installing Docker\n\n```bash\n# https://docs.docker.com/get-docker/\n# Use Docker's guide to install Docker for your OS.\n```\n\n### <a name=\"cloning-the-repository\"></a> Cloning the repository\n\n```bash\ngit clone https://github.com/drizzle-team/drizzle-orm.git\ncd drizzle-orm\n```\n\n### <a name=\"repository-structure\"></a> Repository structure\n\n- 📂 `drizzle-orm/`\n\n  orm core package with all main logic for each dialect\n\n- 📂 `drizzle-kit/`\n\n  kit core package with all main logic and tests for each dialect\n\n- 📂 `drizzle-typebox/`\n\n  all the code related to drizzle+typebox extension\n\n- 📂 `drizzle-valibot/`\n\n  all the code related to drizzle+valibot extension\n\n- 📂 `drizzle-zod/`\n\n  all the code related to drizzle+zod extension\n\n- 📂 `eslint-plugin-drizzle/`\n\n  all the code related to drizzle eslint plugin\n\n- 📂 `changelogs/`\n\n  all changelogs for drizzle-orm, drizzle-kit, drizzle-typebox, drizzle-zod, drizzle-valibot modules\n\n- 📂 `examples/`\n\n  package with Drizzle ORM usage examples\n\n- 📂 `integration-tests/`\n\n  package with all type of tests for each supported database\n\n### <a name=\"building-the-project\"></a> Building the project\n\nRun the following script from the root folder to build the whole monorepo. Running it from a specific package folder will only build that package.\n\n```bash\npnpm install && pnpm build\n```\n\n## <a name=\"commit-message-guidelines\"></a> Commit message guidelines\n\nWe have specific rules on how commit messages should be structured.\n\nIt's important to make sure your commit messages are clear, concise, and informative to make it easier for others to understand the changes you are making.\n\nAll commit messages should follow the pattern below:\n\n```\n<subject>\n<BLANK LINE>\n<body>\n```\n\nExample:\n\n```\nAdd groupBy error message\n\nIn specific case, groupBy was responding with unreadable error\n...\n```\n\n> [!WARNING]\n> All commits should be signed before submitting a PR. Please check the documentation on [how to sign commits](https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification).\n\n## <a name=\"contributing-orm\"></a> Contributing to `drizzle-orm`\n\n### <a name=\"project-structure-orm\"></a> Project structure\n\n- 📂 `pg-core/`, `mysql-core/`, `sqlite-core/`\n  \n  core packages for each dialect with all the main logic for relation and query builder\n\n- 📂 `sql/`\n\n  package containing all expressions and SQL template implementation\n\n- All other folders are for each specific driver that Drizzle ORM supports.\n\n### <a name=\"running-tests-orm\"></a> Running tests\n\nAll tests for Drizzle ORM are integration tests that simulate real databases with different queries and responses from each database. Each file in `integration-tests` has a list of different scenarios for different dialects and drivers. Each file creates a Docker container with the needed database and runs the test cases there. After every test is run, the Docker container will be deleted.\n\nIf you have added additional logic to a core package, make sure that all tests completed without any failures.\n\n> [!NOTE]\n> If you have added data types or a feature for query building, you need to create additional test cases using the new API to ensure it works properly.\n\nIf you are in the root of the repository, run all integration tests with the following script:\n\n```bash\ncd integration-tests && pnpm test\n```\n\n### <a name=\"pr-guidelines-orm\"></a> PR guidelines\n\n1. PR titles should follow the pattern below:\n\n   ```\n   [<dialect name>]: <subject>\n   ```\n\n   Example:\n\n   ```\n   [Pg] Add PostGIS extension support\n   ```\n\n2. PRs should contain a detailed description of everything that was changed.\n\n3. Commit messages should follow the [message style guidelines](#commit-message-guidelines).\n\n4. PRs should implement:\n   - Tests for features that were added.\n   - Tests for bugs that were fixed.\n\n> [!NOTE]\n> To understand how tests should be created and run, please check the [Running tests](#running-tests-orm) section.\n\n## <a name=\"contributing-kit\"></a> Contributing to `drizzle-kit`\n\n### <a name=\"project-structure-kit\"></a> Project structure\n\n- 📂 `cli/`\n  - 📄 `schema.ts`\n\n    all the commands defined using brocli\n\n  - 📂 `commands/`\n\n    all the business logic for drizzle-kit commands\n\n- 📂 `extensions/`\n\n  all the extension helpers for databases\n\n- 📂 `serializer/`\n\n  all the necessary logic to read from the Drizzle ORM schema and convert it to a common JSON format, as well as the logic to introspect all tables, types, and other database elements and convert them to a common JSON format\n\n- 📄 `introspect-pg.ts`, `introspect-mysql.ts`, `introspect-sqlite.ts`\n\n  these files are responsible for mapping JSON snapshots to TypeScript files during introspect commands\n\n- 📄 `snapshotsDiffer.ts`\n\n  this file handles the mapping from JSON snapshot format to JSON statement objects.\n\n- 📄 `jsonStatements.ts`\n\n  this file defines JSON statement types, interfaces, and helper functions.\n\n- 📄 `sqlgenerator.ts`\n\n  this file converts JSON statements to SQL strings.\n\n### <a name=\"running-tests-kit\"></a> Running tests\n\nAll tests for Drizzle Kit are integration tests that simulate real databases with different queries and responses from each database. Each file in `drizzle-kit/tests` has a list of different scenarios for different commands. Each file creates a Docker container with the needed database and runs the test cases there. After every test is run, the Docker container will be deleted. We test MySQL, PostgreSQL (using PGlite), and SQLite.\n\nIf you are in the root of the repository, run all Drizzle Kit tests with the following script:\n\n```bash\ncd drizzle-kit && pnpm test\n```\n\n### <a name=\"pr-guidelines-kit\"></a> PR guidelines\n\n1. PR titles should follow the pattern below:\n\n   ```\n   [<dialect name>-kit]: <subject>\n   ```\n\n   Example:\n\n   ```\n   [Pg-kit] Add PostGIS extension support\n   ```\n\n2. PRs should contain a detailed description of everything that was changed.\n\n3. Commit messages should follow the [message style guidelines](#commit-message-guidelines).\n\n4. PRs should implement:\n   - Tests for features that were added.\n   - Tests for bugs that were fixed.\n\n> [!NOTE]\n> To understand how tests should be created and run, please check the [Running tests](#running-tests-kit) section.\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"center\">\n  <img src=\"./misc/readme/logo-github-sq-dark.svg#gh-dark-mode-only\" />\n  <img src=\"./misc/readme/logo-github-sq-light.svg#gh-light-mode-only\" />\n</div>\n\n<br/>\n<div align=\"center\">\n  <h3>Headless ORM for NodeJS, TypeScript and JavaScript 🚀</h3>\n  <a href=\"https://orm.drizzle.team\">Website</a> •\n  <a href=\"https://orm.drizzle.team/docs/overview\">Documentation</a> •\n  <a href=\"https://x.com/drizzleorm\">Twitter</a> •\n  <a href=\"https://driz.link/discord\">Discord</a>\n</div>\n\n<br/>\n<br/>\n\n### What's Drizzle?\nDrizzle is a modern TypeScript ORM developers [wanna use in their next project](https://stateofdb.com/tools/drizzle). \nIt is [lightweight](https://bundlephobia.com/package/drizzle-orm) at only ~7.4kb minified+gzipped, and it's tree shakeable with exactly 0 dependencies. \n\n**Drizzle supports every PostgreSQL, MySQL and SQLite database**, including serverless ones like [Turso](https://orm.drizzle.team/docs/get-started-sqlite#turso), [Neon](https://orm.drizzle.team/docs/get-started-postgresql#neon), [Xata](https://orm.drizzle.team/docs/connect-xata), [PlanetScale](https://orm.drizzle.team/docs/get-started-mysql#planetscale), [Cloudflare D1](https://orm.drizzle.team/docs/get-started-sqlite#cloudflare-d1), [FlyIO LiteFS](https://fly.io/docs/litefs/), [Vercel Postgres](https://orm.drizzle.team/docs/get-started-postgresql#vercel-postgres), [Supabase](https://orm.drizzle.team/docs/get-started-postgresql#supabase) and [AWS Data API](https://orm.drizzle.team/docs/get-started-postgresql#aws-data-api). No bells and whistles, no Rust binaries, no serverless adapters, everything just works out of the box.\n\n**Drizzle is serverless-ready by design**. It works in every major JavaScript runtime like NodeJS, Bun, Deno, Cloudflare Workers, Supabase functions, any Edge runtime, and even in browsers.  \nWith Drizzle you can be [**fast out of the box**](https://orm.drizzle.team/benchmarks) and save time and costs while never introducing any data proxies into your infrastructure. \n\nWhile you can use Drizzle as a JavaScript library, it shines with TypeScript. It lets you [**declare SQL schemas**](https://orm.drizzle.team/docs/sql-schema-declaration) and build both [**relational**](https://orm.drizzle.team/docs/rqb) and [**SQL-like queries**](https://orm.drizzle.team/docs/select), while keeping the balance between type-safety and extensibility for toolmakers to build on top.  \n\n### Ecosystem\nWhile Drizzle ORM remains a thin typed layer on top of SQL, we made a set of tools for people to have best possible developer experience.  \n  \nDrizzle comes with a powerful [**Drizzle Kit**](https://orm.drizzle.team/kit-docs/overview) CLI companion for you to have hassle-free migrations. It can generate SQL migration files for you or apply schema changes directly to the database.  \n  \nWe also have [**Drizzle Studio**](https://orm.drizzle.team/drizzle-studio/overview) for you to effortlessly browse and manipulate data in your database of choice.\n\n### Documentation\nCheck out the full documentation on [the website](https://orm.drizzle.team/docs/overview).\n\n### Our sponsors ❤️\n<p align=\"center\">\n<a href=\"https://drizzle.team\" target=\"_blank\">\n<img src='https://api.drizzle.team/v2/sponsors/svg'/>\n</a>\n</p>\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Reporting a Vulnerability\n\nIf you have a security issue to report, please contact us at [security@drizzle.team](mailto:security@drizzle.team).\n"
  },
  {
    "path": "changelogs/README.md",
    "content": "# Release flow\n\n- Push feature branch\n- GitHub workflow publishes new feature tag to NPM\n- Bump package versions manually\n- (Optional) Create and merge PR to beta\n- (Optional) GitHub workflow publishes new beta version to NPM\n- Create PR to main\n- TODO: GitHub workflow checks if changelog is present for every package version\n- Resolve all conflicts, bump versions if necessary\n- Merge PR\n- GitHub workflow publishes new latest version to NPM and removes feature tag from NPM\n"
  },
  {
    "path": "changelogs/drizzle-arktype/0.1.2.md",
    "content": "`drizzle-arktype` is a plugin for [Drizzle ORM](https://github.com/drizzle-team/drizzle-orm) that allows you to generate [arktype](https://arktype.io/) schemas from Drizzle ORM schemas.\n\n**Features**\n\n- Create a select schema for tables, views and enums.\n- Create insert and update schemas for tables.\n- Supports all dialects: PostgreSQL, MySQL and SQLite.\n\n# Usage\n\n```ts\nimport { pgEnum, pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-arktype';\nimport { type } from 'arktype';\n\nconst users = pgTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n\trole: text('role', { enum: ['admin', 'user'] }).notNull(),\n\tcreatedAt: timestamp('created_at').notNull().defaultNow(),\n});\n\n// Schema for inserting a user - can be used to validate API requests\nconst insertUserSchema = createInsertSchema(users);\n\n// Schema for updating a user - can be used to validate API requests\nconst updateUserSchema = createUpdateSchema(users);\n\n// Schema for selecting a user - can be used to validate API responses\nconst selectUserSchema = createSelectSchema(users);\n\n// Overriding the fields\nconst insertUserSchema = createInsertSchema(users, {\n\trole: type('string'),\n});\n\n// Refining the fields - useful if you want to change the fields before they become nullable/optional in the final schema\nconst insertUserSchema = createInsertSchema(users, {\n\tid: (schema) => schema.atLeast(1),\n\trole: type('string'),\n});\n\n// Usage\n\nconst isUserValid = parse(insertUserSchema, {\n\tname: 'John Doe',\n\temail: 'johndoe@test.com',\n\trole: 'admin',\n});\n```\n\nthanks @L-Mario564"
  },
  {
    "path": "changelogs/drizzle-arktype/0.1.3.md",
    "content": "- TS language server performance improvements\n- Fixed [Buffer is not defined using drizzle-arktype client side with vite](https://github.com/drizzle-team/drizzle-orm/issues/4383)\n- Fixed [[BUG]: drizzle-arktype Buffer is undefined](https://github.com/drizzle-team/drizzle-orm/issues/4371)"
  },
  {
    "path": "changelogs/drizzle-kit/0.23.2.md",
    "content": "- Fixed a bug in PostgreSQL with push and introspect where the `schemaFilter` object was passed. It was detecting enums even in schemas that were not defined in the schemaFilter.\n- Fixed the `drizzle-kit up` command to work as expected, starting from the sequences release.\n"
  },
  {
    "path": "changelogs/drizzle-kit/0.24.0.md",
    "content": "## Breaking changes (for SQLite users)\n\n#### Fixed [Composite primary key order is not consistent](https://github.com/drizzle-team/drizzle-kit-mirror/issues/342) by removing `sort` in SQLite and to be consistant with the same logic in PostgreSQL and MySQL\n\nThe issue that may arise for SQLite users with any driver using composite primary keys is that the order in the database may differ from the Drizzle schema.\n\n- If you are using `push`, you **MAY** be prompted to update your table with a new order of columns in the composite primary key. You will need to either change it manually in the database or push the changes, but this may lead to data loss, etc.\n\n- If you are using `generate`, you **MAY** also be prompted to update your table with a new order of columns in the composite primary key. You can either keep that migration or skip it by emptying the SQL migration file.\n\nIf nothing works for you and you are blocked, please reach out to me @AndriiSherman. I will try to help you!\n\n\n## Bug fixes\n\n- [[BUG] When using double type columns, import is not inserted](https://github.com/drizzle-team/drizzle-kit-mirror/issues/403) - thanks @Karibash\n- [[BUG] A number value is specified as the default for a column of type char](https://github.com/drizzle-team/drizzle-kit-mirror/issues/404) - thanks @Karibash\n- [[BUG]: Array default in migrations are wrong](https://github.com/drizzle-team/drizzle-orm/issues/2621) - thanks @L-Mario564\n- [[FEATURE]: Simpler default array fields](https://github.com/drizzle-team/drizzle-orm/issues/2709) - thanks @L-Mario564\n- [[BUG]: drizzle-kit generate succeeds but generates invalid SQL for default([]) - Postgres](https://github.com/drizzle-team/drizzle-orm/issues/2432) - thanks @L-Mario564\n- [[BUG]: Incorrect type for array column default value](https://github.com/drizzle-team/drizzle-orm/issues/2334) - thanks @L-Mario564\n- [[BUG]: error: column is of type integer[] but default expression is of type integer](https://github.com/drizzle-team/drizzle-orm/issues/2224) - thanks @L-Mario564\n- [[BUG]: Default value in array generating wrong migration file](https://github.com/drizzle-team/drizzle-orm/issues/1003) - thanks @L-Mario564\n- [[BUG]: enum as array, not possible?](https://github.com/drizzle-team/drizzle-orm/issues/1564) - thanks @L-Mario564"
  },
  {
    "path": "changelogs/drizzle-kit/0.24.1.md",
    "content": "## Bug fixes\n\n> Big thanks to @L-Mario564 for his [PR](https://github.com/drizzle-team/drizzle-orm/pull/2804). It conflicted in most cases with a PR that was merged, but we incorporated some of his logic. Merging it would have caused more problems and taken more time to resolve, so we just took a few things from his PR, like removing \"::<type>\" mappings in introspect and some array type default handlers\n\n### What was fixed\n\n1. The Drizzle Kit CLI was not working properly for the `introspect` command.\n2. Added the ability to use column names with special characters for all dialects.\n3. Included PostgreSQL sequences in the introspection process.\n4. Reworked array type introspection and added all test cases.\n5. Fixed all (we hope) default issues in PostgreSQL, where `::<type>` was included in the introspected output.\n6. `preserve` casing option was broken\n\n### Tickets that were closed\n\n- [[BUG]: invalid schema generation with drizzle-kit introspect:pg](https://github.com/drizzle-team/drizzle-orm/issues/1210)\n- [[BUG][mysql introspection]: TS error when introspect column including colon](https://github.com/drizzle-team/drizzle-orm/issues/1928)\n- [[BUG]: Unhandled defaults when introspecting postgres db](https://github.com/drizzle-team/drizzle-orm/issues/1625)\n- [[BUG]: PostgreSQL Enum Naming and Schema Typing Issue](https://github.com/drizzle-team/drizzle-orm/issues/2315)\n- [[BUG]: drizzle-kit instrospect command generates syntax error on varchar column types](https://github.com/drizzle-team/drizzle-orm/issues/2714)\n- [[BUG]: Introspecting varchar[] type produces syntactically invalid schema.ts](https://github.com/drizzle-team/drizzle-orm/issues/1633)\n- [[BUG]: introspect:pg column not using generated enum name](https://github.com/drizzle-team/drizzle-orm/issues/1648)\n- [[BUG]: drizzle-kit introspect casing \"preserve\" config not working](https://github.com/drizzle-team/drizzle-orm/issues/2773)\n- [[BUG]: drizzle-kit introspect fails on required param that is defined](https://github.com/drizzle-team/drizzle-orm/issues/2719)\n- [[BUG]: Error when running npx drizzle-kit introspect: \"Expected object, received string\"](https://github.com/drizzle-team/drizzle-orm/issues/2657)\n- [[BUG]: Missing index names when running introspect command [MYSQL]](https://github.com/drizzle-team/drizzle-orm/issues/2525)\n- [[BUG]: drizzle-kit introspect TypeError: Cannot read properties of undefined (reading 'toLowerCase')](https://github.com/drizzle-team/drizzle-orm/issues/2338)\n- [[BUG]: Wrong column name when using PgEnum.array()](https://github.com/drizzle-team/drizzle-orm/issues/2100)\n- [[BUG]: Incorrect Schema Generated when introspecting extisting pg database](https://github.com/drizzle-team/drizzle-orm/issues/1985)\n- [[⚠️🐞BUG]: index() missing argument after introspection, causes tsc error that fails the build](https://github.com/drizzle-team/drizzle-orm/issues/1870)\n- [[BUG]: drizzle-kit introspect small errors](https://github.com/drizzle-team/drizzle-orm/issues/1738)\n- [[BUG]: Missing bigint import in drizzle-kit introspect](https://github.com/drizzle-team/drizzle-orm/issues/1020)"
  },
  {
    "path": "changelogs/drizzle-kit/0.24.2.md",
    "content": "## New Features\n\n### 🎉 Support for `pglite` driver\n\nYou can now use pglite with all drizzle-kit commands, including Drizzle Studio!\n\n```ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  dialect: \"postgresql\",\n  driver: \"pglite\",\n  schema: \"./schema.ts\",\n  dbCredentials: {\n    url: \"local-pg.db\",\n  },\n  verbose: true,\n  strict: true,\n});\n```\n\n## Bug fixes\n\n- mysql-kit: fix GENERATED ALWAYS AS ... NOT NULL - [#2824](https://github.com/drizzle-team/drizzle-orm/pull/2824)"
  },
  {
    "path": "changelogs/drizzle-kit/0.25.0.md",
    "content": "## Breaking changes and migrate guide for Turso users\n\nIf you are using Turso and libsql, you will need to upgrade your `drizzle.config` and `@libsql/client` package.\n\n1. This version of drizzle-orm will only work with `@libsql/client@0.10.0` or higher if you are using the `migrate` function. For other use cases, you can continue using previous versions(But the suggestion is to upgrade)\nTo install the latest version, use the command:\n\n```bash\nnpm i @libsql/client@latest\n```\n\n2. Previously, we had a common `drizzle.config` for SQLite and Turso users, which allowed a shared strategy for both dialects. Starting with this release, we are introducing the turso dialect in drizzle-kit. We will evolve and improve Turso as a separate dialect with its own migration strategies.\n\n**Before**\n\n```ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  dialect: \"sqlite\",\n  schema: \"./schema.ts\",\n  out: \"./drizzle\",\n  dbCredentials: {\n    url: \"database.db\",\n  },\n  breakpoints: true,\n  verbose: true,\n  strict: true,\n});\n```\n\n**After**\n\n```ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  dialect: \"turso\",\n  schema: \"./schema.ts\",\n  out: \"./drizzle\",\n  dbCredentials: {\n    url: \"database.db\",\n  },\n  breakpoints: true,\n  verbose: true,\n  strict: true,\n});\n```\n\nIf you are using only SQLite, you can use `dialect: \"sqlite\"`\n\n## LibSQL/Turso and Sqlite migration updates\n\n### SQLite \"generate\" and \"push\" statements updates\n\nStarting from this release, we will no longer generate comments like this:\n\n```sql\n      '/*\\n SQLite does not support \"Changing existing column type\" out of the box, we do not generate automatic migration for that, so it has to be done manually'\n      + '\\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php'\n      + '\\n                  https://www.sqlite.org/lang_altertable.html'\n      + '\\n                  https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3'\n      + \"\\n\\n Due to that we don't generate migration automatically and it has to be done manually\"\n      + '\\n*/'\n```\n\nWe will generate a set of statements, and you can decide if it's appropriate to create data-moving statements instead. Here is an example of the SQL file you'll receive now:\n\n```sql\nPRAGMA foreign_keys=OFF;\n--> statement-breakpoint\nCREATE TABLE `__new_worker` (\n  `id` integer PRIMARY KEY NOT NULL,\n  `name` text NOT NULL,\n  `salary` text NOT NULL,\n  `job_id` integer,\n  FOREIGN KEY (`job_id`) REFERENCES `job`(`id`) ON UPDATE no action ON DELETE no action\n);\n--> statement-breakpoint\nINSERT INTO `__new_worker`(\"id\", \"name\", \"salary\", \"job_id\") SELECT \"id\", \"name\", \"salary\", \"job_id\" FROM `worker`;\n--> statement-breakpoint\nDROP TABLE `worker`;\n--> statement-breakpoint\nALTER TABLE `__new_worker` RENAME TO `worker`;\n--> statement-breakpoint\nPRAGMA foreign_keys=ON;\n```\n\n### LibSQL/Turso \"generate\" and \"push\" statements updates\n\nSince LibSQL supports more ALTER statements than SQLite, we can generate more statements without recreating your schema and moving all the data, which can be potentially dangerous for production environments.\n\nLibSQL and Turso will now have a separate dialect in the Drizzle config file, meaning that we will evolve Turso and LibSQL independently from SQLite and will aim to support as many features as Turso/LibSQL offer.\n\nWith the updated LibSQL migration strategy, you will have the ability to:\n\n- **Change Data Type**: Set a new data type for existing columns.\n- **Set and Drop Default Values**: Add or remove default values for existing columns.\n- **Set and Drop NOT NULL**: Add or remove the NOT NULL constraint on existing columns.\n- **Add References to Existing Columns**: Add foreign key references to existing columns\n\nYou can find more information in the [LibSQL documentation](https://github.com/tursodatabase/libsql/blob/main/libsql-sqlite3/doc/libsql_extensions.md#altering-columns)\n\n### LIMITATIONS\n\n- Dropping or altering an index will cause table recreation.\n\nThis is because LibSQL/Turso does not support dropping this type of index.\n\n```sql\nCREATE TABLE `users` (\n  `id` integer NOT NULL,\n  `name` integer,\n  `age` integer PRIMARY KEY NOT NULL\n  FOREIGN KEY (`name`) REFERENCES `users1`(\"id\") ON UPDATE no action ON DELETE no action\n);\n```\n\n- If the table has indexes, altering columns will cause table recreation.\n- Drizzle-Kit will drop the indexes, modify the columns, and then recreate the indexes.\n- Adding or dropping composite foreign keys is not supported and will cause table recreation\n\n### NOTES\n\n- You can create a reference on any column type, but if you want to insert values, the referenced column must have a unique index or primary key.\n\n```sql\nCREATE TABLE parent(a PRIMARY KEY, b UNIQUE, c, d, e, f);\nCREATE UNIQUE INDEX i1 ON parent(c, d);\nCREATE INDEX i2 ON parent(e);\nCREATE UNIQUE INDEX i3 ON parent(f COLLATE nocase);\n\nCREATE TABLE child1(f, g REFERENCES parent(a));                        -- Ok\nCREATE TABLE child2(h, i REFERENCES parent(b));                        -- Ok\nCREATE TABLE child3(j, k, FOREIGN KEY(j, k) REFERENCES parent(c, d));  -- Ok\nCREATE TABLE child4(l, m REFERENCES parent(e));                        -- Error!\nCREATE TABLE child5(n, o REFERENCES parent(f));                        -- Error!\nCREATE TABLE child6(p, q, FOREIGN KEY(p, q) REFERENCES parent(b, c));  -- Error!\nCREATE TABLE child7(r REFERENCES parent(c));                           -- Error!\n```\n\n> **NOTE**: The foreign key for the table child5 is an error because, although the parent key column has a unique index, the index uses a different collating sequence.\n\nSee more: https://www.sqlite.org/foreignkeys.html\n\n## New `casing` param in `drizzle-orm` and `drizzle-kit`\n\nThere are more improvements you can make to your schema definition. The most common way to name your variables in a database and in TypeScript code is usually `snake_case` in the database and `camelCase` in the code. For this case, in Drizzle, you can now define a naming strategy in your database to help Drizzle map column keys automatically. Let's take a table from the previous example and make it work with the new casing API in Drizzle\n\nTable can now become:\n```ts\nimport { pgTable } from \"drizzle-orm/pg-core\";\n\nexport const ingredients = pgTable(\"ingredients\", (t) => ({\n  id: t.uuid().defaultRandom().primaryKey(),\n  name: t.text().notNull(),\n  description: t.text(),\n  inStock: t.boolean().default(true),\n}));\n```\nAs you can see, `inStock` doesn't have a database name alias, but by defining the casing configuration at the connection level, all queries will automatically map it to `snake_case`\n\n```ts\nconst db = await drizzle('node-postgres', { connection: '', casing: 'snake_case' })\n```\n\nFor `drizzle-kit` migrations generation you should also specify `casing` param in drizzle config, so you can be sure you casing strategy will be applied to drizzle-kit as well\n\n```ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  dialect: \"postgresql\",\n  schema: \"./schema.ts\",\n  dbCredentials: {\n    url: \"postgresql://postgres:password@localhost:5432/db\",\n  },\n  casing: \"snake_case\",\n});\n```"
  },
  {
    "path": "changelogs/drizzle-kit/0.26.0.md",
    "content": "# New Features\n\n## Checks support in `drizzle-kit`\n\nYou can use drizzle-kit to manage your `check` constraint defined in drizzle-orm schema definition\n\nFor example current drizzle table:\n\n```ts\nimport { sql } from \"drizzle-orm\";\nimport { check, pgTable } from \"drizzle-orm/pg-core\";\n\nexport const users = pgTable(\n  \"users\",\n  (c) => ({\n    id: c.uuid().defaultRandom().primaryKey(),\n    username: c.text().notNull(),\n    age: c.integer(),\n  }),\n  (table) => ({\n    checkConstraint: check(\"age_check\", sql`${table.age} > 21`),\n  })\n);\n```\n\nwill be generated into\n\n```sql\nCREATE TABLE IF NOT EXISTS \"users\" (\n  \"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n  \"username\" text NOT NULL,\n  \"age\" integer,\n  CONSTRAINT \"age_check\" CHECK (\"users\".\"age\" > 21)\n);\n```\n\nThe same is supported in all dialects\n\n### Limitations\n\n- `generate` will work as expected for all check constraint changes.\n- `push` will detect only check renames and will recreate the constraint. All other changes to SQL won't be detected and will be ignored.\n\nSo, if you want to change the constraint's SQL definition using only `push`, you would need to manually comment out the constraint, `push`, then put it back with the new SQL definition and `push` one more time.\n\n## Views support in `drizzle-kit`\n\nYou can use drizzle-kit to manage your `views` defined in drizzle-orm schema definition. It will work with all existing dialects and view options\n\n### PostgreSQL\n\nFor example current drizzle table:\n\n```ts\nimport { sql } from \"drizzle-orm\";\nimport {\n  check,\n  pgMaterializedView,\n  pgTable,\n  pgView,\n} from \"drizzle-orm/pg-core\";\n\nexport const users = pgTable(\n  \"users\",\n  (c) => ({\n    id: c.uuid().defaultRandom().primaryKey(),\n    username: c.text().notNull(),\n    age: c.integer(),\n  }),\n  (table) => ({\n    checkConstraint: check(\"age_check\", sql`${table.age} > 21`),\n  })\n);\n\nexport const simpleView = pgView(\"simple_users_view\").as((qb) =>\n  qb.select().from(users)\n);\n\nexport const materializedView = pgMaterializedView(\n  \"materialized_users_view\"\n).as((qb) => qb.select().from(users));\n```\n\nwill be generated into\n\n```sql\nCREATE TABLE IF NOT EXISTS \"users\" (\n  \"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n  \"username\" text NOT NULL,\n  \"age\" integer,\n  CONSTRAINT \"age_check\" CHECK (\"users\".\"age\" > 21)\n);\n\nCREATE VIEW \"public\".\"simple_users_view\" AS (select \"id\", \"username\", \"age\" from \"users\");\n\nCREATE MATERIALIZED VIEW \"public\".\"materialized_users_view\" AS (select \"id\", \"username\", \"age\" from \"users\");\n```\n\nViews supported in all dialects, but materialized views are supported only in PostgreSQL\n\n#### Limitations\n\n- `generate` will work as expected for all view changes\n- `push` limitations:\n\n1. If you want to change the view's SQL definition using only `push`, you would need to manually comment out the view, `push`, then put it back with the new SQL definition and `push` one more time.\n\n## Updates for PostgreSQL enums behavior\n\nWe've updated enum behavior in Drizzle with PostgreSQL:\n\n- Add value after or before in enum: With this change, Drizzle will now respect the order of values in the enum and allow adding new values after or before a specific one.\n\n- Support for dropping a value from an enum: In this case, Drizzle will attempt to alter all columns using the enum to text, then drop the existing enum and create a new one with the updated set of values. After that, all columns previously using the enum will be altered back to the new enum.\n\n> If the deleted enum value was used by a column, this process will result in a database error.\n\n- Support for dropping an enum\n\n- Support for moving enums between schemas\n\n- Support for renaming enums\n"
  },
  {
    "path": "changelogs/drizzle-kit/0.26.1.md",
    "content": "- Fix `data is malformed` for views"
  },
  {
    "path": "changelogs/drizzle-kit/0.26.2.md",
    "content": "- Updated internal versions for the drizzle-kit and drizzle-orm packages. Changes were introduced in the last minor release, and you are required to upgrade both packages to ensure they work as expected"
  },
  {
    "path": "changelogs/drizzle-kit/0.27.0.md",
    "content": "> This version of `drizzle-jit` requires `drizzle-orm@0.36.0` to enable all new features\n\n# New Features\n\n## Row-Level Security (RLS)\n\nWith Drizzle, you can enable Row-Level Security (RLS) for any Postgres table, create policies with various options, and define and manage the roles those policies apply to.\n\nDrizzle supports a raw representation of Postgres policies and roles that can be used in any way you want. This works with popular Postgres database providers such as `Neon` and `Supabase`.\n\nIn Drizzle, we have specific predefined RLS roles and functions for RLS with both database providers, but you can also define your own logic.\n\n### Enable RLS\n\nIf you just want to enable RLS on a table without adding policies, you can use `.enableRLS()`\n\nAs mentioned in the PostgreSQL documentation:\n\n> If no policy exists for the table, a default-deny policy is used, meaning that no rows are visible or can be modified. \nOperations that apply to the whole table, such as TRUNCATE and REFERENCES, are not subject to row security.\n\n```ts\nimport { integer, pgTable } from 'drizzle-orm/pg-core';\n\nexport const users = pgTable('users', {\n\tid: integer(),\n}).enableRLS();\n```\n\n> If you add a policy to a table, RLS will be enabled automatically. So, there’s no need to explicitly enable RLS when adding policies to a table.\n\n### Roles\n\nCurrently, Drizzle supports defining roles with a few different options, as shown below. Support for more options will be added in a future release.\n\n```ts\nimport { pgRole } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin', { createRole: true, createDb: true, inherit: true });\n```\n\nIf a role already exists in your database, and you don’t want drizzle-kit to ‘see’ it or include it in migrations, you can mark the role as existing.\n\n```ts\nimport { pgRole } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin').existing();\n```\n\n### Policies\n\nTo fully leverage RLS, you can define policies within a Drizzle table.\n\n> In PostgreSQL, policies should be linked to an existing table. Since policies are always associated with a specific table, we decided that policy definitions should be defined as a parameter of `pgTable`\n\n**Example of pgPolicy with all available properties**\n```ts\nimport { sql } from 'drizzle-orm';\nimport { integer, pgPolicy, pgRole, pgTable } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin');\n\nexport const users = pgTable('users', {\n\tid: integer(),\n}, (t) => [\n\tpgPolicy('policy', {\n\t\tas: 'permissive',\n\t\tto: admin,\n\t\tfor: 'delete',\n\t\tusing: sql``,\n\t\twithCheck: sql``,\n\t}),\n]);\n```\n\n**Link Policy to an existing table**\n\nThere are situations where you need to link a policy to an existing table in your database. \nThe most common use case is with database providers like `Neon` or `Supabase`, where you need to add a policy \nto their existing tables. In this case, you can use the `.link()` API\n\n```ts\nimport { sql } from \"drizzle-orm\";\nimport { pgPolicy } from \"drizzle-orm/pg-core\";\nimport { authenticatedRole, realtimeMessages } from \"drizzle-orm/supabase\";\n\nexport const policy = pgPolicy(\"authenticated role insert policy\", {\n  for: \"insert\",\n  to: authenticatedRole,\n  using: sql``,\n}).link(realtimeMessages);\n```\n\n### Migrations\n\nIf you are using drizzle-kit to manage your schema and roles, there may be situations where you want to refer to roles that are not defined in your Drizzle schema. In such cases, you may want drizzle-kit to skip managing these roles without having to define each role in your drizzle schema and marking it with `.existing()`.\n\nIn these cases, you can use `entities.roles` in `drizzle.config.ts`. For a complete reference, refer to the the [`drizzle.config.ts`](https://orm.drizzle.team/docs/drizzle-config-file) documentation.\n\nBy default, `drizzle-kit` does not manage roles for you, so you will need to enable this feature in `drizzle.config.ts`.\n\n```ts {12-14}\n// drizzle.config.ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  dialect: 'postgresql',\n  schema: \"./drizzle/schema.ts\",\n  dbCredentials: {\n    url: process.env.DATABASE_URL!\n  },\n  verbose: true,\n  strict: true,\n  entities: {\n    roles: true\n  }\n});\n```\n\nIn case you need additional configuration options, let's take a look at a few more examples.\n\n**You have an `admin` role and want to exclude it from the list of manageable roles**\n\n```ts\n// drizzle.config.ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  ...\n  entities: {\n    roles: {\n      exclude: ['admin']\n    }\n  }\n});\n```\n\n**You have an `admin` role and want to include it in the list of manageable roles**\n\n```ts\n// drizzle.config.ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  ...\n  entities: {\n    roles: {\n      include: ['admin']\n    }\n  }\n});\n```\n\n**If you are using `Neon` and want to exclude Neon-defined roles, you can use the provider option**\n\n```ts\n// drizzle.config.ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  ...\n  entities: {\n    roles: {\n      provider: 'neon'\n    }\n  }\n});\n```\n\n**If you are using `Supabase` and want to exclude Supabase-defined roles, you can use the provider option**\n\n```ts\n// drizzle.config.ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  ...\n  entities: {\n    roles: {\n      provider: 'supabase'\n    }\n  }\n});\n```\n\n> You may encounter situations where Drizzle is slightly outdated compared to new roles specified by your database provider. \nIn such cases, you can use the `provider` option and `exclude` additional roles:\n\n```ts\n// drizzle.config.ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  ...\n  entities: {\n    roles: {\n      provider: 'supabase',\n      exclude: ['new_supabase_role']\n    }\n  }\n});\n```\n\n### RLS on views\n\nWith Drizzle, you can also specify RLS policies on views. For this, you need to use `security_invoker` in the view's WITH options. Here is a small example:\n\n```ts {5}\n...\n\nexport const roomsUsersProfiles = pgView(\"rooms_users_profiles\")\n  .with({\n    securityInvoker: true,\n  })\n  .as((qb) =>\n    qb\n      .select({\n        ...getTableColumns(roomsUsers),\n        email: profiles.email,\n      })\n      .from(roomsUsers)\n      .innerJoin(profiles, eq(roomsUsers.userId, profiles.id))\n  );\n```\n\n### Using with Neon\n\nThe Neon Team helped us implement their vision of a wrapper on top of our raw policies API. We defined a specific \n`/neon` import with the `crudPolicy` function that includes predefined functions and Neon's default roles.\n\nHere's an example of how to use the `crudPolicy` function:\n\n```ts\nimport { crudPolicy } from 'drizzle-orm/neon';\nimport { integer, pgRole, pgTable } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin');\n\nexport const users = pgTable('users', {\n\tid: integer(),\n}, (t) => [\n\tcrudPolicy({ role: admin, read: true, modify: false }),\n]);\n```\n\nThis policy is equivalent to:\n\n```ts\nimport { sql } from 'drizzle-orm';\nimport { integer, pgPolicy, pgRole, pgTable } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin');\n\nexport const users = pgTable('users', {\n\tid: integer(),\n}, (t) => [\n\tpgPolicy(`crud-${admin.name}-policy-insert`, {\n\t\tfor: 'insert',\n\t\tto: admin,\n\t\twithCheck: sql`false`,\n\t}),\n\tpgPolicy(`crud-${admin.name}-policy-update`, {\n\t\tfor: 'update',\n\t\tto: admin,\n\t\tusing: sql`false`,\n\t\twithCheck: sql`false`,\n\t}),\n\tpgPolicy(`crud-${admin.name}-policy-delete`, {\n\t\tfor: 'delete',\n\t\tto: admin,\n\t\tusing: sql`false`,\n\t}),\n\tpgPolicy(`crud-${admin.name}-policy-select`, {\n\t\tfor: 'select',\n\t\tto: admin,\n\t\tusing: sql`true`,\n\t}),\n]);\n```\n\n`Neon` exposes predefined `authenticated` and `anaonymous` roles and related functions. If you are using `Neon` for RLS, you can use these roles, which are marked as existing, and the related functions in your RLS queries.\n\n```ts\n// drizzle-orm/neon\nexport const authenticatedRole = pgRole('authenticated').existing();\nexport const anonymousRole = pgRole('anonymous').existing();\n\nexport const authUid = (userIdColumn: AnyPgColumn) => sql`(select auth.user_id() = ${userIdColumn})`;\n```\n\nFor example, you can use the `Neon` predefined roles and functions like this:\n\n\n```ts\nimport { sql } from 'drizzle-orm';\nimport { authenticatedRole } from 'drizzle-orm/neon';\nimport { integer, pgPolicy, pgRole, pgTable } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin');\n\nexport const users = pgTable('users', {\n\tid: integer(),\n}, (t) => [\n\tpgPolicy(`policy-insert`, {\n\t\tfor: 'insert',\n\t\tto: authenticatedRole,\n\t\twithCheck: sql`false`,\n\t}),\n]);\n```\n\n### Using with Supabase\n\nWe also have a `/supabase` import with a set of predefined roles marked as existing, which you can use in your schema. \nThis import will be extended in a future release with more functions and helpers to make using RLS and `Supabase` simpler.\n\n```ts\n// drizzle-orm/supabase\nexport const anonRole = pgRole('anon').existing();\nexport const authenticatedRole = pgRole('authenticated').existing();\nexport const serviceRole = pgRole('service_role').existing();\nexport const postgresRole = pgRole('postgres_role').existing();\nexport const supabaseAuthAdminRole = pgRole('supabase_auth_admin').existing();\n```\n\nFor example, you can use the `Supabase` predefined roles like this:\n\n```ts\nimport { sql } from 'drizzle-orm';\nimport { serviceRole } from 'drizzle-orm/supabase';\nimport { integer, pgPolicy, pgRole, pgTable } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin');\n\nexport const users = pgTable('users', {\n\tid: integer(),\n}, (t) => [\n\tpgPolicy(`policy-insert`, {\n\t\tfor: 'insert',\n\t\tto: serviceRole,\n\t\twithCheck: sql`false`,\n\t}),\n]);\n```\n\nThe `/supabase` import also includes predefined tables and functions that you can use in your application\n\n```ts\n// drizzle-orm/supabase\n\nconst auth = pgSchema('auth');\nexport const authUsers = auth.table('users', {\n\tid: uuid().primaryKey().notNull(),\n});\n\nconst realtime = pgSchema('realtime');\nexport const realtimeMessages = realtime.table(\n\t'messages',\n\t{\n\t\tid: bigserial({ mode: 'bigint' }).primaryKey(),\n\t\ttopic: text().notNull(),\n\t\textension: text({\n\t\t\tenum: ['presence', 'broadcast', 'postgres_changes'],\n\t\t}).notNull(),\n\t},\n);\n\nexport const authUid = sql`(select auth.uid())`;\nexport const realtimeTopic = sql`realtime.topic()`;\n```\n\nThis allows you to use it in your code, and Drizzle Kit will treat them as existing databases,\nusing them only as information to connect to other entities\n\n```ts\nimport { foreignKey, pgPolicy, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { sql } from \"drizzle-orm/sql\";\nimport { authenticatedRole, authUsers } from \"drizzle-orm/supabase\";\n\nexport const profiles = pgTable(\n  \"profiles\",\n  {\n    id: uuid().primaryKey().notNull(),\n    email: text().notNull(),\n  },\n  (table) => [\n    foreignKey({\n      columns: [table.id],\n\t  // reference to the auth table from Supabase\n      foreignColumns: [authUsers.id],\n      name: \"profiles_id_fk\",\n    }).onDelete(\"cascade\"),\n    pgPolicy(\"authenticated can view all profiles\", {\n      for: \"select\",\n\t  // using predefined role from Supabase\n      to: authenticatedRole,\n      using: sql`true`,\n    }),\n  ]\n);\n```\n\nLet's check an example of adding a policy to a table that exists in `Supabase`\n\n```ts\nimport { sql } from \"drizzle-orm\";\nimport { pgPolicy } from \"drizzle-orm/pg-core\";\nimport { authenticatedRole, realtimeMessages } from \"drizzle-orm/supabase\";\n\nexport const policy = pgPolicy(\"authenticated role insert policy\", {\n  for: \"insert\",\n  to: authenticatedRole,\n  using: sql``,\n}).link(realtimeMessages);\n```\n\n# Bug fixes\n\n- [[BUG]: Studio + mysql default mode, wrong format related timezone](https://github.com/drizzle-team/drizzle-orm/issues/2747)\n- [[BUG]: Drizzle Studio CORS error](https://github.com/drizzle-team/drizzle-orm/issues/1857)\n- [[BUG]: TIMESTAMPS showing up incorrectly on drizzle studio](https://github.com/drizzle-team/drizzle-orm/issues/2549)"
  },
  {
    "path": "changelogs/drizzle-kit/0.27.1.md",
    "content": "- Fix: [[BUG]: When using RLS policies and Views, the view is the last clause generated](https://github.com/drizzle-team/drizzle-orm/issues/3378)"
  },
  {
    "path": "changelogs/drizzle-kit/0.27.2.md",
    "content": "- Fix [[BUG]: Undefined properties when using drizzle-kit push](https://github.com/drizzle-team/drizzle-orm/issues/3391)\n- Fix TypeError: Cannot read properties of undefined (reading 'isRLSEnabled')\n- Fix push bugs, when pushing a schema with linked policy to a table from `drizzle-orm/supabase`\n"
  },
  {
    "path": "changelogs/drizzle-kit/0.28.0.md",
    "content": "# Improvements\n\n- Added an OHM static imports checker to identify unexpected imports within a chain of imports in the drizzle-kit repo. For example, it checks if drizzle-orm is imported before drizzle-kit and verifies if the drizzle-orm import is available in your project.\n- [Adding more columns to Supabase auth.users table schema](https://github.com/drizzle-team/drizzle-orm/issues/3327) - thanks @nicholasdly\n\n# Bug Fixes\n\n- [[BUG]: [drizzle-kit]: Fix breakpoints option cannot be disabled](https://github.com/drizzle-team/drizzle-orm/issues/2828) - thanks @klotztech\n- [[BUG]: drizzle-kit introspect: SMALLINT import missing and incorrect DECIMAL UNSIGNED handling](https://github.com/drizzle-team/drizzle-orm/issues/2950) - thanks @L-Mario564\n- [Unsigned tinyints preventing migrations](https://github.com/drizzle-team/drizzle-orm/issues/1571) - thanks @L-Mario564\n- [[BUG]: Can't parse float(8,2) from database (precision and scale and/or unsigned breaks float types)](https://github.com/drizzle-team/drizzle-orm/issues/3285) - thanks @L-Mario564\n- [[BUG]: PgEnum generated migration doesn't escape single quotes](https://github.com/drizzle-team/drizzle-orm/issues/1272) - thanks @L-Mario564\n- [[BUG]: single quote not escaped correctly in migration file](https://github.com/drizzle-team/drizzle-orm/issues/2184) - thanks @L-Mario564\n- [[BUG]: Migrations does not escape single quotes](https://github.com/drizzle-team/drizzle-orm/issues/1765) - thanks @L-Mario564\n- [[BUG]: Issue with quoted default string values](https://github.com/drizzle-team/drizzle-orm/issues/2122) - thanks @L-Mario564\n- [[BUG]: SQl commands in wrong roder](https://github.com/drizzle-team/drizzle-orm/issues/2390) - thanks @L-Mario564\n- [[BUG]: Time with precision in drizzle-orm/pg-core adds double-quotes around type](https://github.com/drizzle-team/drizzle-orm/issues/1804) - thanks @L-Mario564\n- [[BUG]: Postgres push fails due to lack of quotes](https://github.com/drizzle-team/drizzle-orm/issues/2396) - thanks @L-Mario564\n- [[BUG]: TypeError: Cannot read properties of undefined (reading 'compositePrimaryKeys')](https://github.com/drizzle-team/drizzle-orm/issues/2344) - thanks @L-Mario564\n- [[BUG]: drizzle-kit introspect generates CURRENT_TIMESTAMP without sql operator on date column](https://github.com/drizzle-team/drizzle-orm/issues/2899) - thanks @L-Mario564\n- [[BUG]: Drizzle-kit introspect doesn't pull correct defautl statement](https://github.com/drizzle-team/drizzle-orm/issues/2905) - thanks @L-Mario564\n- [[BUG]: Problem on MacBook - This statement does not return data. Use run() instead](https://github.com/drizzle-team/drizzle-orm/issues/2623) - thanks @L-Mario564\n- [[BUG]: Enum column names that are used as arrays are not quoted](https://github.com/drizzle-team/drizzle-orm/issues/2598) - thanks @L-Mario564\n- [[BUG]: drizzle-kit generate ignores index operators](https://github.com/drizzle-team/drizzle-orm/issues/2935) - thanks @L-Mario564\n- [dialect param config error message is wrong](https://github.com/drizzle-team/drizzle-orm/issues/3427) - thanks @L-Mario564\n- [[BUG]: Error setting default enum field values](https://github.com/drizzle-team/drizzle-orm/issues/2299) - thanks @L-Mario564\n- [[BUG]: drizzle-kit does not respect the order of columns configured in primaryKey()](https://github.com/drizzle-team/drizzle-orm/issues/2326) - thanks @L-Mario564\n- [[BUG]: Cannot drop Unique Constraint MySQL](https://github.com/drizzle-team/drizzle-orm/issues/998) - thanks @L-Mario564\n"
  },
  {
    "path": "changelogs/drizzle-kit/0.28.1.md",
    "content": "# Bug fixes\n\n- Fixed typos in repository: thanks @armandsalle, @masto, @wackbyte, @Asher-JH, @MaxLeiter\n- [fix: wrong dialect set in mysql/sqlite introspect](https://github.com/drizzle-team/drizzle-orm/pull/2865)"
  },
  {
    "path": "changelogs/drizzle-kit/0.29.0.md",
    "content": "# New Dialects\n\n### 🎉 `SingleStore` dialect is now available in Drizzle\n\nThanks to the SingleStore team for creating a PR with all the necessary changes to support the MySQL-compatible part of SingleStore. You can already start using it with Drizzle. The SingleStore team will also help us iterate through updates and make more SingleStore-specific features available in Drizzle\n\n```ts\nimport 'dotenv/config';\nimport { defineConfig } from 'drizzle-kit';\n\nexport default defineConfig({\n  dialect: 'singlestore',\n  out: './drizzle',\n  schema: './src/db/schema.ts',\n  dbCredentials: {\n    url: process.env.DATABASE_URL!,\n  },\n});\n```\n\nYou can check out our [Getting started guides](https://orm.drizzle.team/docs/get-started/singlestore-new) to try SingleStore!\n\n# New Drivers\n\n### 🎉 `SQLite Durable Objects` driver is now available in Drizzle\n\nYou can now query SQLite Durable Objects in Drizzle!\n\nFor the full example, please check our [Get Started](https://orm.drizzle.team/docs/get-started/do-new) Section\n\n```ts\nimport 'dotenv/config';\nimport { defineConfig } from 'drizzle-kit';\nexport default defineConfig({\n  out: './drizzle',\n  schema: './src/db/schema.ts',\n  dialect: 'sqlite',\n  driver: 'durable-sqlite',\n});\n```"
  },
  {
    "path": "changelogs/drizzle-kit/0.29.1.md",
    "content": "- Fix SingleStore generate migrations command"
  },
  {
    "path": "changelogs/drizzle-kit/0.30.0.md",
    "content": "Starting from this update, the PostgreSQL dialect will align with the behavior of all other dialects. It will no longer include `IF NOT EXISTS`, `$DO`, or similar statements, which could cause incorrect DDL statements to not fail when an object already exists in the database and should actually fail.\n\nThis change marks our first step toward several major upgrades we are preparing:\n\n- An updated and improved migration workflow featuring commutative migrations, a revised folder structure, and enhanced collaboration capabilities for migrations.\n- Better support for Xata migrations.\n- Compatibility with CockroachDB (achieving full compatibility will only require removing serial fields from the migration folder)."
  },
  {
    "path": "changelogs/drizzle-kit/0.30.1.md",
    "content": "# New Features\n\n### `drizzle-kit export`\n\nTo make drizzle-kit integration with other migration tools, like Atlas much easier, we've prepared a new command called `export`. It will translate your drizzle schema in SQL representation(DDL) statements and outputs to the console\n\n```ts\n// schema.ts\nimport { pgTable, serial, text } from 'drizzle-orm/pg-core'\n\nexport const users = pgTable('users', {\n\tid: serial('id').primaryKey(),\n\temail: text('email').notNull(),\n\tname: text('name')\n});\n```\nRunning\n```bash\nnpx drizzle-kit export\n```\n\nwill output this string to console\n```bash\nCREATE TABLE \"users\" (\n        \"id\" serial PRIMARY KEY NOT NULL,\n        \"email\" text NOT NULL,\n        \"name\" text\n);\n```\n\nBy default, the only option for now is `--sql`, so the output format will be SQL DDL statements. In the future, we will support additional output formats to accommodate more migration tools\n\n```bash\nnpx drizzle-kit export --sql\n```"
  },
  {
    "path": "changelogs/drizzle-kit/0.30.2.md",
    "content": "- Fix certificates generation utility for Drizzle Studio; [[BUG]: [drizzle-kit]: drizzle-kit dependency on drizzle-studio perms error](https://github.com/drizzle-team/drizzle-orm/issues/3729)"
  },
  {
    "path": "changelogs/drizzle-kit/0.30.3.md",
    "content": "# SingleStore `push` and `generate` improvements\n\nAs SingleStore did not support certain DDL statements before this release, you might encounter an error indicating that some schema changes cannot be applied due to a database issue. Starting from this version, drizzle-kit will detect such cases and initiate table recreation with data transfer between the tables\n\n# Bug fixes\n\n- [[BUG] If the index name is the same as the generated name, it will be empty and a type error will occur](https://github.com/drizzle-team/drizzle-orm/issues/3420)"
  },
  {
    "path": "changelogs/drizzle-kit/0.30.4.md",
    "content": "- Fix bug that generates incorrect syntax when introspect in mysql\n- Fix a bug that caused incorrect syntax output when introspect in unsigned columns"
  },
  {
    "path": "changelogs/drizzle-kit/0.30.5.md",
    "content": "# New Features \n\n## Added `Gel` dialect support and `gel-js` client support\n\nDrizzle is getting a new `Gel` dialect with its own types and Gel-specific logic. In this first iteration, almost all query-building features have been copied from the `PostgreSQL` dialect since Gel is fully PostgreSQL-compatible. The only change in this iteration is the data types. The Gel dialect has a different set of available data types, and all mappings for these types have been designed to avoid any extra conversions on Drizzle's side. This means you will insert and select exactly the same data as supported by the Gel protocol.\n\nDrizzle + Gel integration will work only through `drizzle-kit pull`. Drizzle won't support `generate`, `migrate`, or `push` features in this case. Instead, drizzle-kit is used solely to pull the Drizzle schema from the Gel database, which can then be used in your `drizzle-orm` queries.\n\nThe Gel + Drizzle workflow:\n\n1. Use the `gel` CLI to manage your schema.\n2. Use the `gel` CLI to generate and apply migrations to the database.\n3. Use drizzle-kit to pull the Gel database schema into a Drizzle schema.\n4. Use drizzle-orm with gel-js to query the Gel database.\n\nOn the drizzle-kit side you can now use `dialect: \"gel\"`\n\n```ts\n// drizzle.config.ts\nimport { defineConfig } from 'drizzle-kit';\n\nexport default defineConfig({\n  dialect: 'gel',\n});\n```\n\nFor a complete Get Started tutorial you can use our new guides:\n\n- [Get Started with Drizzle and Gel in a new project](https://orm.drizzle.team/docs/get-started/gel-new)\n- [Get Started with Drizzle and Gel in a existing project](https://orm.drizzle.team/docs/get-started/gel-existing)"
  },
  {
    "path": "changelogs/drizzle-kit/0.30.6.md",
    "content": "### Bug fixes\n\n- [[BUG]: d1 push locally is not working](https://github.com/drizzle-team/drizzle-orm/issues/4099) - thanks @mabels and @RomanNabukhotnyi\n- [[BUG] Cloudflare D1: drizzle-kit push is not working (error 7500 SQLITE_AUTH)](https://github.com/drizzle-team/drizzle-orm/issues/3728) - thanks @mabels and @RomanNabukhotnyi"
  },
  {
    "path": "changelogs/drizzle-kit/0.31.0.md",
    "content": "## Features and improvements\n\n### Enum DDL improvements\n\nFor situations where you drop an `enum` value or reorder values in an `enum`, there is no native way to do this in PostgreSQL. To handle these cases, `drizzle-kit` used to:\n\n- Change the column data types from the enum to text\n- Drop the old enum\n- Add the new enum\n- Change the column data types back to the new enum\n\nHowever, there were a few scenarios that weren’t covered: `PostgreSQL` wasn’t updating default expressions for columns when their data types changed\n\nTherefore, for cases where you either change a column’s data type from an `enum` to some other type, drop an `enum` value, or reorder `enum` values, we now do the following:\n\n- Change the column data types from the enum to text\n- Set the default using the ::text expression\n- Drop the old enum\n- Add the new enum\n- Change the column data types back to the new enum\n- Set the default using the ::<new_enum> expression\n\n### `esbuild` version upgrade\n\nFor `drizzle-kit` we upgraded the version to latest (`0.25.2`), thanks @paulmarsicloud\n\n## Bug fixes\n\n- [[BUG]: Error on Malformed Array Literal](https://github.com/drizzle-team/drizzle-orm/issues/2715) - thanks @Kratious\n- [[BUG]: Postgres drizzle-kit: Error while pulling indexes from a table with json/jsonb deep field index](https://github.com/drizzle-team/drizzle-orm/issues/2744) - thanks @Kratious\n- [goog-vulnz flags CVE-2024-24790 in esbuild 0.19.7](https://github.com/drizzle-team/drizzle-orm/issues/4045)"
  },
  {
    "path": "changelogs/drizzle-kit/0.31.1.md",
    "content": "### Fixed `drizzle-kit pull` bugs when using Gel extensions.\n\nBecause Gel extensions create schema names containing `::` (for example, `ext::auth`), Drizzle previously handled these names incorrectly. Starting with this release, you can use Gel extensions without any problems. Here’s what you should do:\n\n1. Enable extensions schemas in `drizzle.config.ts`\n\n```ts\nimport  { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  dialect: 'gel',\n  schemaFilter: ['ext::auth', 'public']\n});\n```\n\n2. Run `drizzle-kit pull`\n\n3. Done!\n"
  },
  {
    "path": "changelogs/drizzle-kit/0.31.10.md",
    "content": "- Updated to `hanji@0.0.8` - native bun `stringWidth`, `stripANSI` support, errors for non-TTY environments  \n- We've migrated away from `esbuild-register` to `tsx` loader, it will now allow to use `drizzle-kit` seamlessly with both `ESM` and `CJS` modules  \n- We've also added native `Bun` and `Deno` launch support, which will not trigger `tsx` loader and utilise native `bun` and `deno` imports capabilities and faster startup times"
  },
  {
    "path": "changelogs/drizzle-kit/0.31.2.md",
    "content": "### Bug fixes\n\n- Fixed relations extraction to not interfere with Drizzle Studio."
  },
  {
    "path": "changelogs/drizzle-kit/0.31.3.md",
    "content": "- Internal changes to Studio context. Added `databaseName` and `packageName` properties for Studio"
  },
  {
    "path": "changelogs/drizzle-kit/0.31.4.md",
    "content": "- Fixed `halfvec`, `bit` and `sparsevec` type generation bug in drizzle-kit"
  },
  {
    "path": "changelogs/drizzle-kit/0.31.5.md",
    "content": "- Add casing support to studio configuration and related functions"
  },
  {
    "path": "changelogs/drizzle-kit/0.31.6.md",
    "content": "### Bug fixes\n\n- [[BUG]: Importing drizzle-kit/api fails in ESM modules](https://github.com/drizzle-team/drizzle-orm/issues/2853)"
  },
  {
    "path": "changelogs/drizzle-kit/0.31.7.md",
    "content": "### Bug fixes\n\n- [[BUG]: Drizzle Kit push to Postgres 18 produces unecessary DROP SQL when the schema was NOT changed](https://github.com/drizzle-team/drizzle-orm/issues/4944)"
  },
  {
    "path": "changelogs/drizzle-kit/0.31.8.md",
    "content": "### Bug fixes\n\n- Fixed `algorythm` => `algorithm` typo.\n- Fixed external dependencies in build configuration.\n"
  },
  {
    "path": "changelogs/drizzle-kit/0.31.9.md",
    "content": "- drizzle-kit api improvements for D1 connections"
  },
  {
    "path": "changelogs/drizzle-orm/0.12.0-beta.23.md",
    "content": "# drizzle-orm 0.12.0-beta.23\n\n- Added new row mapping mechanism as `mapResultRowV2`, `mapResultRow` will be replaced by it in the future.\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.12.0-beta.24.md",
    "content": "# drizzle-orm 0.12.0-beta.24\n\n- Made `.execute()` method public in query builders.\n- Added `name()` function for escaping entity names inside queries.\n- (internal) Removed old row mapper implementation.\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.13.0.md",
    "content": "# drizzle-orm 0.13.0\n\n- Release 🎉\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.13.1.md",
    "content": "# drizzle-orm 0.13.1\n\n- Fix mysql peer dependency range\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.14.1.md",
    "content": "# drizzle-orm 0.14.1\n\n- Bumped everything to 0.14.1.\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.14.2.md",
    "content": "# drizzle-orm 0.14.2\n\n- Bumped everything to 0.14.2"
  },
  {
    "path": "changelogs/drizzle-orm/0.15.0.md",
    "content": "# drizzle-orm 0.15.0\n\n- Minor upgrade for all modules, due to adding version for api\n- Add internal version for ORM api and npm version"
  },
  {
    "path": "changelogs/drizzle-orm/0.15.1.md",
    "content": "# drizzle-orm 0.15.1\n\n- Add schema symbol to table\n- Append schema before table name in SQLWrapper if it exists"
  },
  {
    "path": "changelogs/drizzle-orm/0.15.2.md",
    "content": "# drizzle-orm 0.15.2\n\nInternal release\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.15.3.md",
    "content": "# drizzle-orm 0.15.3\n\nInternal release\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.16.0.md",
    "content": "# drizzle-orm 0.16.0\n\n- Bump all packages to 0.16.0\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.16.1.md",
    "content": "# drizzle-orm 0.16.0\n\n- Fix peer dependency error for >=0.16 drizzle packages\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.17.0.md",
    "content": "## ❗ All ORM packages are now merged into `drizzle-orm`\n\nStarting from release `0.17.0` and onwards, all dialect-specific packages are merged into `drizzle-orm`. Legacy ORM packages will be archived.\n\n### Import paths changes\n\n#### PostgreSQL\n\n- `import { ... } from 'drizzle-orm-pg'` -> `import { ... } from 'drizzle-orm/pg-core'`\n- `import { ... } from 'drizzle-orm-pg/node'` -> `import { ... } from 'drizzle-orm/node-postgres'`\n- `import { ... } from 'drizzle-orm-pg/neondb'` -> `import { ... } from 'drizzle-orm/neon'`\n- `import { ... } from 'drizzle-orm-pg/postgres.js'` -> `import { ... } from 'drizzle-orm/postgres.js'`\n\n#### MySQL\n\n- `import { ... } from 'drizzle-orm-mysql'` -> `import { ... } from 'drizzle-orm/mysql-core'`\n- `import { ... } from 'drizzle-orm-mysql/mysql2'` -> `import { ... } from 'drizzle-orm/mysql2'`\n\n#### SQLite\n\n- `import { ... } from 'drizzle-orm-sqlite'` -> `import { ... } from 'drizzle-orm/sqlite-core'`\n- `import { ... } from 'drizzle-orm-sqlite/better-sqlite3'` -> `import { ... } from 'drizzle-orm/better-sqlite3'`\n- `import { ... } from 'drizzle-orm-sqlite/d1'` -> `import { ... } from 'drizzle-orm/d1'`\n- `import { ... } from 'drizzle-orm-sqlite/bun'` -> `import { ... } from 'drizzle-orm/bun-sqlite'`\n- `import { ... } from 'drizzle-orm-sqlite/sql.js'` -> `import { ... } from 'drizzle-orm/sql.js'`\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.17.1.md",
    "content": "- Added feature showcase section to README\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.17.2.md",
    "content": "- Fixed package.json require path in 'drizzle-orm/version'\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.17.3.md",
    "content": "We have released [AWS Data API support](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html) for PostgreSQL\n\n---\n\nConnection example\n\n```typescript\nimport { drizzle, migrate } from 'drizzle-orm/aws-data-api/pg';\n\nconst rdsClient = new RDSDataClient({});\n\nconst db = drizzle(rdsClient, {\n  database: '',\n  secretArn: '',\n  resourceArn: '',\n});\n\nawait migrate(db, { migrationsFolder: '' });\n```\n\n> **Note**:\n> All drizzle pg data types are working well with data api, except of `interval`. This type is not yet mapped in proper way"
  },
  {
    "path": "changelogs/drizzle-orm/0.17.4.md",
    "content": "We have released [SQLite Proxy Driver](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/sqlite-proxy)\n\n---\n\nPerfect way to setup custom logic for database calls instead of predefined drivers\n\nShould work well with serverless apps 🚀\n\n```typescript\n// Custom Proxy HTTP driver\n  const db = drizzle(async (sql, params, method) => {\n    try {\n      const rows = await axios.post('http://localhost:3000/query', { sql, params, method });\n\n      return { rows: rows.data };\n    } catch (e: any) {\n      console.error('Error from sqlite proxy server: ', e.response.data)\n      return { rows: [] };\n    }\n  });\n```\n\n> For more example you can check [full documentation](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/sqlite-proxy)"
  },
  {
    "path": "changelogs/drizzle-orm/0.17.5.md",
    "content": "We have released [Planetscale Serverless](https://github.com/planetscale/database-js) driver support\n\n---\n\nUsage example:\n\n```typescript\nimport { drizzle } from 'drizzle-orm/planetscale-serverless';\nimport { connect } from '@planetscale/database';\n\n// create the connection\nconst connection = connect({\n  host: process.env['DATABASE_HOST'],\n  username: process.env['DATABASE_USERNAME'],\n  password: process.env['DATABASE_PASSWORD'],\n});\n\nconst db = drizzle(connection);\n```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.17.6.md",
    "content": "Fix circular dependency for query building on all pg and mysql drivers\n\nMoved all aws data api typings specific logic to dialect from sql to prevent circular dependency issues"
  },
  {
    "path": "changelogs/drizzle-orm/0.17.7.md",
    "content": "- Fix [#158](https://github.com/drizzle-team/drizzle-orm/issues/158) issue. Method `.returning()` was working incorrectly with `.get()` method in sqlite dialect\n- Fix SQLite Proxy driver mapping bug\n- Add test cases for SQLite Proxy driver\n- Add additional example for SQLite Proxy Server setup to handle `.get()` as well"
  },
  {
    "path": "changelogs/drizzle-orm/0.18.0.md",
    "content": "- Improved join result types for partial selects (refer to the [docs](/docs/joins.md) page for more information)\n- Renamed import paths for Postgres.js and SQL.js drivers to avoid bundling errors:\n  - `drizzle-orm/postgres.js` -> `drizzle-orm/postgres-js`\n  - `drizzle-orm/sql.js` -> `drizzle-orm/sql-js`\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.19.0.md",
    "content": "- Implemented selecting and joining a subquery. Example usage:\n\n  ```ts\n  const sq = db\n    .select({\n      categoryId: courseCategoriesTable.id,\n      category: courseCategoriesTable.name,\n      total: sql`count(${courseCategoriesTable.id})`.as<number>(),\n    })\n    .from(courseCategoriesTable)\n    .groupBy(courseCategoriesTable.id, courseCategoriesTable.name)\n    .subquery('sq');\n  ```\n\n  After that, just use the subquery instead of a table as usual.\n\n- ❗ Replaced `db.select(table).fields({ ... })` syntax with `db.select({ ... }).from(table)` to look more like its SQL counterpart.\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.19.1.md",
    "content": "## Changelog\n\n---\n\n- Add `char` data type support for postgresql by @AlexandrLi in [#177](https://github.com/drizzle-team/drizzle-orm/pull/177)\n- Adding new section with `New Contributors` for release notes. Took this template from [bun](https://github.com/oven-sh/bun) release notes pattern\n\n## New Contributors\n\n---\n\n- @AlexandrLi made their first contribution in [#177](https://github.com/drizzle-team/drizzle-orm/pull/177)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.20.0.md",
    "content": "\n- 🎉 **Implemented support for WITH clause ([docs](/drizzle-orm/src/pg-core/README.md#with-clause)). Example usage:**\n\n  ```ts\n  const sq = db\n    .select()\n    .from(users)\n    .prepareWithSubquery('sq');\n\n  const result = await db\n    .with(sq)\n    .select({\n      id: sq.id,\n      name: sq.name,\n      total: sql<number>`count(${sq.id})::int`(),\n    })\n    .from(sq)\n    .groupBy(sq.id, sq.name);\n  ```\n\n- 🐛 Fixed various bugs with selecting/joining of subqueries.\n- ❗ Renamed `.subquery('alias')` to `.as('alias')`.\n- ❗ ``sql`query`.as<type>()`` is now ``sql<type>`query`()``. Old syntax is still supported, but is deprecated and will be removed in one of the next releases.\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.20.1.md",
    "content": "- 🎉 Added `{ logger: true }` shorthand to `drizzle()` to enable query logging. See [logging docs](/drizzle-orm/src/pg-core/README.md#logging) for detailed logging configuration.\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.20.2.md",
    "content": "- 🎉 Added PostgreSQL network data types:\n  - `inet`\n  - `cidr`\n  - `macaddr`\n  - `macaddr8`\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.20.3.md",
    "content": "- 🎉 Added support for locking clauses in SELECT (`SELECT ... FOR UPDATE`):\n\n  PostgreSQL\n\n  ```ts\n  await db\n    .select()\n    .from(users)\n    .for('update')\n    .for('no key update', { of: users })\n    .for('no key update', { of: users, skipLocked: true })\n    .for('share', { of: users, noWait: true });\n  ```\n\n  MySQL\n\n  ```ts\n  await db.select().from(users).for('update');\n  await db.select().from(users).for('share', { skipLocked: true });\n  await db.select().from(users).for('update', { noWait: true });\n  ```\n\n- 🎉🐛 Custom column types now support returning `SQL` from `toDriver()` method in addition to the `driverData` type from generic.\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.21.0.md",
    "content": "## Drizzle ORM 0.21.0 was released 🎉\n\n- Added support for new migration folder structure and breakpoints feature, described in drizzle-kit release section\n- Fix `onUpdateNow()` expression generation for default migration statement\n\n</br>\n\n### Support for PostgreSQL array types\n\n---\n\n```ts\nexport const salEmp = pgTable('sal_emp', {\n  name: text('name').notNull(),\n  payByQuarter: integer('pay_by_quarter').array(),\n  schedule: text('schedule').array().array(),\n});\n\nexport const tictactoe = pgTable('tictactoe', {\n  squares: integer('squares').array(3).array(3),\n});\n```\n\ndrizzle kit will generate\n\n```sql\nCREATE TABLE sal_emp (\n  name            text,\n  pay_by_quarter  integer[],\n  schedule        text[][]\n);\n\nCREATE TABLE tictactoe (\n  squares   integer[3][3]\n);\n```\n\n</br>\n\n### Added composite primary key support to PostgreSQL and MySQL\n\n---\n\nPostgreSQL\n\n```ts\nimport { primaryKey } from 'drizzle-orm/pg-core';\n\nexport const cpkTable = pgTable('table', {\n  column1: integer('column1').default(10).notNull(),\n  column2: integer('column2'),\n  column3: integer('column3'),\n}, (table) => ({\n  cpk: primaryKey(table.column1, table.column2),\n}));\n```\n\nMySQL\n\n```ts\nimport { primaryKey } from 'drizzle-orm/mysql-core';\n\nexport const cpkTable = mysqlTable('table', {\n  simple: int('simple'),\n  columnNotNull: int('column_not_null').notNull(),\n  columnDefault: int('column_default').default(100),\n}, (table) => ({\n  cpk: primaryKey(table.simple, table.columnDefault),\n}));\n```\n\n---\n\n## Drizzle Kit 0.17.0 was released 🎉\n\n## Breaking changes\n\n### Folder structure was migrated to newer version\n\nBefore running any new migrations `drizzle-kit` will ask you to upgrade in a first place\n\nMigration file structure < 0.17.0\n\n```plaintext\n📦 <project root>\n └ 📂 migrations\n    └ 📂 20221207174503\n       ├ 📜 migration.sql\n       ├ 📜 snapshot.json\n    └ 📂 20230101104503\n       ├ 📜 migration.sql\n       ├ 📜 snapshot.json\n```\n\nMigration file structure >= 0.17.0\n\n```plaintext\n📦 <project root>\n └ 📂 migrations\n    └ 📂 meta\n      ├ 📜 _journal.json\n      ├ 📜 0000_snapshot.json\n      ├ 📜 0001_snapshot.json\n    └ 📜 0000_icy_stranger.sql\n    └ 📜 0001_strange_avengers.sql\n```\n\n## Upgrading to 0.17.0\n\n---\n\n![](/changelogs/media/up_mysql.gif)\n\nTo easily migrate from previous folder structure to new you need to run `up` command in drizzle kit. It's a great helper to upgrade your migrations to new format on each drizzle kit major update\n\n```bash\ndrizzle-kit up:<dialect> # dialects: `pg`, `mysql`, `sqlite`\n\n# example for pg\ndrizzle-kit up:pg\n```\n\n</br>\n\n## New Features\n\n### New `drizzle-kit` command called `drop`\n\n</br>\n\nIn a case you think some of migrations were generated in a wrong way or you have made migration simultaneously with other developers you can easily rollback it by running simple command\n\n> **Warning**:\n> Make sure you are dropping migrations that were not applied to your database\n\n```bash\ndrizzle-kit drop\n```\n\nThis command will show you a list of all migrations you have and you'll need just to choose migration you want to drop. After that `drizzle-kit` will do all the hard work on deleting migration files\n\n![](/changelogs/media/drop.gif)\n\n</br>\n\n### New `drizzle-kit` option `--breakpoints` for `generate` and `introspect` commands\n\nIf particular driver doesn't support running multiple quries in 1 execution you can use `--breakpoints`.\n\n`drizzle-kit` will generate current sql\n\n```sql\nCREATE TABLE `users` (\n  `id` int PRIMARY KEY NOT NULL,\n  `full_name` text NOT NULL,\n);\n--> statement-breakpoint\nCREATE TABLE `table` (\n  `id` int PRIMARY KEY NOT NULL,\n  `phone` int,\n);\n```\n\nUsing it `drizzle-orm` will split all sql files by statements and execute them separately\n\n</br>\n\n### Add `drizzle-kit introspect` for MySQL dialect\n\nYou can introspect your mysql database using `introspect:mysql` command\n\n```bash\ndrizzle-kit introspect:mysql --out ./migrations --connectionString mysql://user:password@127.0.0.1:3306/database\n```\n\n![](/changelogs/media/introspect_mysql.gif)\n\n</br>\n\n### Support for glob patterns for schema path\n\nUsage example in `cli`\n\n```bash\ndrizzle-kit generate:pg --out ./migrations --schema ./core/**/*.ts ./database/schema.ts\n```\n\nUsage example in `drizzle.config`\n\n```text\n{\n  \"out: \"./migrations\", \n  \"schema\": [\"./core/**/*.ts\", \"./database/schema.ts\"]\n}\n```\n\n## Bug Fixes and improvements\n\n### Postgres dialect\n\n---\n\n**GitHub issue fixes**\n\n- [pg] char is undefined during introspection [#9](https://github.com/drizzle-team/drizzle-kit-mirror/issues/9)\n- when unknown type is detected, would be nice to emit a TODO comment instead of undefined [#8](https://github.com/drizzle-team/drizzle-kit-mirror/issues/8)\n- \"post_id\" integer DEFAULT currval('posts_id_seq'::regclass) generates invalid TS [#7](https://github.com/drizzle-team/drizzle-kit-mirror/issues/7)\n- \"ip\" INET NOT NULL is not supported [#6](https://github.com/drizzle-team/drizzle-kit-mirror/issues/6)\n- \"id\" UUID NOT NULL DEFAULT uuid_generate_v4() type is not supported [#5](https://github.com/drizzle-team/drizzle-kit-mirror/issues/5)\n- array fields end up as \"undefined\" in the schema [#4](https://github.com/drizzle-team/drizzle-kit-mirror/issues/4)\n- timestamp is not in the import statement in schema.ts [#3](https://github.com/drizzle-team/drizzle-kit-mirror/issues/3)\n- generated enums are not camel cased [#2](https://github.com/drizzle-team/drizzle-kit-mirror/issues/2)\n\n**Introspect improvements**\n\n- Add support for composite PK's generation;\n- Add support for `cidr`, `inet`, `macaddr`, `macaddr8`, `smallserial`\n- Add interval fields generation in schema, such as `minute to second`, `day to hour`, etc.\n- Add default values for `numerics`\n- Add default values for `enums`\n\n### MySQL dialect\n\n---\n\n**Migration generation improvements**\n\n- Add `autoincrement` create, delete and update handling\n- Add `on update current_timestamp` handling for timestamps\n- Add data type changing, using `modify`\n- Add `not null` changing, using `modify`\n- Add `default` drop and create statements\n- Fix `defaults` generation bugs, such as escaping, date strings, expressions, etc\n\n**Introspect improvements**\n\n- Add `autoincrement` to all supported types\n- Add `fsp` for time based data types\n- Add precision and scale for `double`\n- Make time `{ mode: \"string\" }` by default\n- Add defaults to `json`, `decimal` and `binary` datatypes\n- Add `enum` data type generation\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.21.1.md",
    "content": "- 🎉 Added support for `HAVING` clause\n- 🎉 Added support for referencing selected fields in `.where()`, `.having()`, `.groupBy()` and `.orderBy()` using an optional callback:\n\n  ```ts\n  await db\n    .select({\n      id: citiesTable.id,\n      name: sql<string>`upper(${citiesTable.name})`.as('upper_name'),\n      usersCount: sql<number>`count(${users2Table.id})::int`.as('users_count'),\n    })\n    .from(citiesTable)\n    .leftJoin(users2Table, eq(users2Table.cityId, citiesTable.id))\n    .where(({ name }) => sql`length(${name}) >= 3`)\n    .groupBy(citiesTable.id)\n    .having(({ usersCount }) => sql`${usersCount} > 0`)\n    .orderBy(({ name }) => name);\n  ```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.22.0.md",
    "content": "- 🎉 Introduced a standalone query builder that can be used without a DB connection:\n\n  ```ts\n  import { queryBuilder as qb } from 'drizzle-orm/pg-core';\n\n  const query = qb.select().from(users).where(eq(users.name, 'Dan'));\n  const { sql, params } = query.toSQL();\n  ```\n\n- 🎉 Improved `WITH ... SELECT` subquery creation syntax to more resemble SQL:\n\n  **Before**:\n  \n  ```ts\n  const regionalSales = db\n    .select({\n      region: orders.region,\n      totalSales: sql`sum(${orders.amount})`.as<number>('total_sales'),\n  })\n  .from(orders)\n  .groupBy(orders.region)\n  .prepareWithSubquery('regional_sales');\n\n  await db.with(regionalSales).select(...).from(...);\n  ```\n\n  **After**:\n  \n  ```ts\n  const regionalSales = db\n    .$with('regional_sales')\n    .as(\n      db\n        .select({\n          region: orders.region,\n          totalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n        })\n        .from(orders)\n        .groupBy(orders.region),\n    );\n\n  await db.with(regionalSales).select(...).from(...);\n  ```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.0.md",
    "content": "- 🎉 Added Knex and Kysely adapters! They allow you to manage the schemas and migrations with Drizzle and query the data with your favorite query builder. See documentation for more details:\n  - [Knex adapter](https://github.com/drizzle-team/drizzle-knex)\n  - [Kysely adapter](https://github.com/drizzle-team/drizzle-kysely)\n\n- 🎉 Added \"type maps\" to all entities. You can access them via the special `_` property. For example:\n\n  ```ts\n  const users = mysqlTable('users', {\n    id: int('id').primaryKey(),\n    name: text('name').notNull(),\n  });\n\n  type UserFields = typeof users['_']['columns'];\n  type InsertUser = typeof users['_']['model']['insert'];\n  ```\n\n  Full documentation on the type maps is coming soon.\n\n- 🎉 Added `.$type()` method to all column builders to allow overriding the data type. It also replaces the optional generics on columns.\n\n  ```ts\n  // Before\n  const test = mysqlTable('test', {\n    jsonField: json<Data>('json_field'),\n  });\n\n  // After\n  const test = mysqlTable('test', {\n    jsonField: json('json_field').$type<Data>(),\n  });\n  ```\n\n- ❗ Changed syntax for text-based enum columns:\n  \n    ```ts\n    // Before\n    const test = mysqlTable('test', {\n      role: text<'admin' | 'user'>('role'),\n    });\n  \n    // After\n    const test = mysqlTable('test', {\n      role: text('role', { enum: ['admin', 'user'] }),\n    });\n    ```\n\n- 🎉 Allowed passing an array of values into `.insert().values()` directly without spreading:\n\n  ```ts\n  const users = mysqlTable('users', {\n    id: int('id').primaryKey(),\n    name: text('name').notNull(),\n  });\n\n  await users.insert().values([\n    { name: 'John' },\n    { name: 'Jane' },\n  ]);\n  ```\n\n  The spread syntax is now deprecated and will be removed in one of the next releases.\n\n- 🎉 Added \"table creators\" to allow for table name customization:\n\n  ```ts\n  import { mysqlTableCreator } from 'drizzle-orm/mysql-core';\n\n  const mysqlTable = mysqlTableCreator((name) => `myprefix_${name}`);\n\n  const users = mysqlTable('users', {\n    id: int('id').primaryKey(),\n    name: text('name').notNull(),\n  });\n\n  // Users table is a normal table, but its name is `myprefix_users` in runtime\n  ```\n\n- 🎉 Implemented support for selecting/joining raw SQL expressions:\n  \n  ```ts\n  // select current_date + s.a as dates from generate_series(0,14,7) as s(a);\n  const result = await db\n    .select({\n      dates: sql`current_date + s.a`,\n    })\n    .from(sql`generate_series(0,14,7) as s(a)`);\n  ```\n\n- 🐛 Fixed a lot of bugs from user feedback on GitHub and Discord (thank you! ❤). Fixes #293 #301 #276 #269 #253 #311 #312\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.1.md",
    "content": "- 🐛 Re-export `InferModel` from `drizzle-orm`\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.10.md",
    "content": "- 🐛 Add missing config argument to transactions API\n- 🐛 Fix Postgres and MySQL schema declaration (#427)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.11.md",
    "content": "- 🐛 Fix migrator function for PostgreSQL\n\n> Would suggest to upgrade to this version anyone who is using postgres dialect. `0.23.9` and `0.23.10` are broken for postgresql migrations\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.12.md",
    "content": "- 🐛 Fixed multi-level join results (e.g. joining a subquery with a nested join)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.13.md",
    "content": "- 🎉 All enum and text enum columns now have a properly typed `enumValues` property\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.2.md",
    "content": "- 🐛 Rolled back some breaking changes for drizzle-kit\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.3.md",
    "content": "- 🎉 Added [libSQL](https://libsql.org/) support\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.4.md",
    "content": "- 🐛 Fixed broken types in Kysely and Knex adapters\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.5.md",
    "content": "- 🐛 Various minor bugfixes\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.6.md",
    "content": "- 🐛 Fixed referencing the selected aliased field in the same query\n- 🐛 Fixed decimal column data type in MySQL\n- 🐛 Fixed mode autocompletion for integer column in SQLite\n- 🐛 Fixed extra parentheses in the generated SQL for the `IN` operator (#382)\n- 🐛 Fixed regression in `pgEnum.enumValues` type (#358)\n- 🎉 Allowed readonly arrays to be passed to `pgEnum`\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.7.md",
    "content": "- 🎉 Added `INSERT IGNORE` support for MySQL (#305)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.8.md",
    "content": "- 🎉 Fixed dates timezone differences for timestamps in Postgres and MySQL (contributed by @AppelBoomHD via #288)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.23.9.md",
    "content": "# Transactions support 🎉\n\nYou can now use transactions with all the supported databases and drivers.\n\n`node-postgres` example:\n\n```ts\nawait db.transaction(async (tx) => {\n  await tx.insert(users).values(newUser);\n  await tx.update(users).set({ name: 'Mr. Dan' }).where(eq(users.name, 'Dan'));\n  await tx.delete(users).where(eq(users.name, 'Dan'));\n});\n```\n\nFor more information, see transactions docs:\n\n- [PostgreSQL](/drizzle-orm/src/pg-core/README.md#transactions)\n- [MySQL](/drizzle-orm/src/mysql-core/README.md#transactions)\n- [SQLite](/drizzle-orm/src/sqlite-core/README.md#transactions)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.24.0.md",
    "content": "- 🎉 Added iterator support to `mysql2` (sponsored by @rizen ❤)\n- ❗ `.prepare()` in MySQL no longer requires a name argument\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.24.1.md",
    "content": "### Bugs\n\n🐛 Fix onConflict targets in [#475](https://github.com/drizzle-team/drizzle-orm/pull/475) - thanks @wkunert ❤️\n\n### Documentation\n\n> Thanks to @tmcw we have started our way to get JSDoc documentation\n\n📄 JSDoc for conditions in [#467](https://github.com/drizzle-team/drizzle-orm/pull/467) - thanks @tmcw ❤️"
  },
  {
    "path": "changelogs/drizzle-orm/0.24.2.md",
    "content": "- 🐛 Pool connections opened for transactions are now closed after the transaction is committed or rolled back\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.24.3.md",
    "content": "- 🐛 Fixed query generation when selecting from alias\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.24.4.md",
    "content": "- 🐛 Added verbose error when .values() is called without values (#441)\n- 🐛 Fixed nested PG arrays mapping (#460)\n- ❗ Removed spread syntax in .values() (#269)\n- 🐛 Fixed passing undefined as field value to insert/update (#375)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.24.5.md",
    "content": "- Add possibility to have placeholders in `.limit()` and `.offset()`\n\n```ts\nconst stmt = db\n  .select({\n    id: usersTable.id,\n    name: usersTable.name,\n  })\n  .from(usersTable)\n  .limit(placeholder('limit'))\n  .offset(placeholder('offset'))\n  .prepare('stmt');\n\nconst result = await stmt.execute({ limit: 1, offset: 1 });\n```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.25.0.md",
    "content": "# ESM support\n\n- 🎉 Added ESM support! You can now use `drizzle-orm` in both ESM and CJS environments.\n- 🎉 Added code minification and source maps.\n- ❗ Removed several nested import paths. Most notably, everything from `drizzle-orm/sql` and `drizzle-orm/expressions` should now be imported from `drizzle-orm` instead.\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.25.1.md",
    "content": "- 🐛 Fix package.json `exports` field\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.25.2.md",
    "content": "- 🎉 Documentation improvements (#495, #507)\n- 🎉 Added `\"sideEffects\": false` to package.json (#515)\n- 🐛 Fixed AWS Data API driver migrations (#510)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.25.3.md",
    "content": "- 🐛 Fix `pg` imports in ESM mode (#505)\n- 🐛 Add \"types\" and \"default\" fields to \"exports\" entries in package.json (#511)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.25.4.md",
    "content": "- 🎉 Added support for [Vercel Postgres](https://vercel.com/docs/storage/vercel-postgres/quickstart)\n\n```typescript\nimport { drizzle } from 'drizzle-orm/vercel-postgres';\nimport { sql } from \"@vercel/postgres\";\n\nconst db = drizzle(sql);\n\ndb.select(...)\n```\n\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.26.0.md",
    "content": "# Drizzle ORM 0.26.0 is here 🎉\n\n## README docs are fully tranferred to web\n\nThe documentation has been completely reworked and updated with additional examples and explanations. You can find it here: https://orm.drizzle.team.\n\nFurthermore, the entire documentation has been made open source, allowing you to edit and add any information you deem important for the community.\n\nVisit https://github.com/drizzle-team/drizzle-orm-docs to access the open-sourced documentation.\n\nAdditionally, you can create specific documentation issues in this repository\n\n## New Features\n\nIntroducing our first helper built on top of Drizzle Core API syntax: **the Relational Queries!** 🎉\n\nWith Drizzle RQ you can do:\n\n1. Any amount of relations that will be mapped for you\n2. Including or excluding! specific columns. You can also combine these options\n3. Harness the flexibility of the `where` statements, allowing you to define custom conditions beyond the predefined ones available in the Drizzle Core API.\n4. Expand the functionality by incorporating additional extras columns using SQL templates. For more examples, refer to the documentation.\n\nMost importantly, regardless of the size of your query, Drizzle will always generate a **SINGLE optimized query**. \n\nThis efficiency extends to the usage of **Prepared Statements**, which are fully supported within the Relational Query Builder.\n\nFor more info: [Prepared Statements in Relational Query Builder](https://orm.drizzle.team/rqb#prepared-statements)\n\n\n**Example of setting one-to-many relations**\n\n> As you can observe, `relations` are a distinct concept that coexists alongside the main Drizzle schema. You have the flexibility to opt-in or opt-out of them at any time without affecting the `drizzle-kit` migrations or the logic for Core API's types and runtime.\n\n```ts\nimport { integer, serial, text, pgTable } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n \nexport const users = pgTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n \nexport const usersConfig = relations(users, ({ many }) => ({\n\tposts: many(posts),\n}));\n \nexport const posts = pgTable('posts', {\n\tid: serial('id').primaryKey(),\n\tcontent: text('content').notNull(),\n\tauthorId: integer('author_id').notNull(),\n});\n \nexport const postsConfig = relations(posts, ({ one }) => ({\n\tauthor: one(users, { fields: [posts.authorId], references: [users.id] }),\n}));\n```\n\n**Example of querying you database**\n\nStep 1: Provide all tables and relations to `drizzle` function\n\n> `drizzle` import depends on the database driver you're using\n\n```ts\nimport * as schema from './schema';\nimport { drizzle } from 'drizzle-orm/...';\n \nconst db = drizzle(client, { schema });\n \nawait db.query.users.findMany(...);\n```\n\nIf you have schema in multiple files\n\n```ts\nimport * as schema1 from './schema1';\nimport * as schema2 from './schema2';\nimport { drizzle } from 'drizzle-orm/...';\n \nconst db = drizzle(client, { schema: { ...schema1, ...schema2 } });\n \nawait db.query.users.findMany(...);\n```\n\nStep 2: Query your database with Relational Query Builder\n\n**Select all users**\n```ts\nconst users = await db.query.users.findMany();\n```\n**Select first users**\n> `.findFirst()` will add limit 1 to the query\n```ts\nconst user = await db.query.users.findFirst();\n```\n**Select all users**\nGet all posts with just `id`, `content` and include `comments`\n```ts\nconst posts = await db.query.posts.findMany({\n\tcolumns: {\n\t\tid: true,\n\t\tcontent: true,\n\t},\n\twith: {\n\t\tcomments: true,\n\t}\n});\n```\n**Select all posts excluding `content` column**\n```ts\nconst posts = await db.query.posts.findMany({\n\tcolumns: {\n\t\tcontent: false,\n\t},\n});\n```\n\nFor more examples you can check [full docs](https://orm.drizzle.team/rqb) for Relational Queries\n\n## Bug fixes\n\n- 🐛 Fixed partial joins with prefixed tables (#542)\n\n## Drizzle Kit updates\n\n### New ways to define drizzle config file\n\nYou can now specify the configuration not only in the `.json` format but also in `.ts` and `.js` formats.\n\n</br>\n\n**TypeScript example**\n```ts\nimport { Config } from \"drizzle-kit\";\n\nexport default {\n  schema: \"\",\n  connectionString: process.env.DB_URL,\n  out: \"\",\n  breakpoints: true\n} satisfies Config;\n```\n\n**JavaScript example**\n```js\n/** @type { import(\"drizzle-kit\").Config } */\nexport default {\n    schema: \"\",\n  connectionString: \"\",\n  out: \"\",\n  breakpoints: true\n};\n```\n\n## New commands 🎉\n\n### `drizzle-kit push:mysql`\n\nYou can now push your MySQL schema directly to the database without the need to create and manage migration files. This feature proves to be particularly useful for rapid local development and when working with PlanetScale databases.\n\nBy pushing the MySQL schema directly to the database, you can streamline the development process and avoid the overhead of managing migration files. This allows for more efficient iteration and quick deployment of schema changes during local development.\n\n### How to setup your codebase for drizzle-kit push feature?\n\n1. For this feature, you need to create a `drizzle.config.[ts|js|json]` file. We recommend using `.ts` or `.js` files as they allow you to easily provide the database connection information as secret variables\n\n    You'll need to specify `schema` and `connectionString`(or `db`, `port`, `host`, `password`, etc.) to make `drizzle-kit push:mysql` work\n\n`drizzle.config.ts` example\n```ts copy\nimport { Config } from \"src\";\n\nexport default {\n  schema: \"./schema.ts\",\n  connectionString: process.env.DB_URL,\n} satisfies Config;\n```\n\n2. Run `drizzle-kit push:mysql`\n\n3. If Drizzle detects any potential `data-loss` issues during a migration, it will prompt you to approve whether the data should be truncated or not in order to ensure a successful migration\n\n4. Approve or reject the action that Drizzle needs to perform in order to push your schema changes to the database.\n\n5. Done ✅"
  },
  {
    "path": "changelogs/drizzle-orm/0.26.1.md",
    "content": "- 🐛 Fixed including multiple relations on the same level in RQB (#599)\n- 🐛 Updated migrators for relational queries support (#601)\n- 🐛 Fixed invoking .findMany() without arguments\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.26.2.md",
    "content": "- 🐛 Fixed upsert targeting composite keys for SQLite (#521)\n- 🐛 AWS Data API+Postgres: fixed adding of typings when merging queries (#517)\n- 🐛 Fixed \"on conflict\" with \"where\" clause for Postgres (#651)\n- 🐛 Various GitHub docs community fixes and improvements ♥ (#547, #548, #587, #606, #609, #625)\n- **Experimental**: added OpenTelemetry support for Postgres\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.26.3.md",
    "content": "- Disabled OTEL integration due to the top-level await issues\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.26.4.md",
    "content": "- 🐛 Fixed AWS Data API mapping in relational queries (#677, #681)\n- 🐛 Allowed using named self-relations (#678)\n- 🐛 Fixed querying relations with composite FKs (#683)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.26.5.md",
    "content": "- 🎉 Added bigint mode to SQLite (#558)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.27.0.md",
    "content": "## Correct behavior when installed in a monorepo (multiple Drizzle instances)\n\nReplacing all `instanceof` statements with a custom `is()` function allowed us to handle multiple Drizzle packages interacting properly.\n\n**It also fixes one of our biggest Discord tickets: `maximum call stack exceeded` 🎉**\n\nYou should now use `is()` instead of `instanceof` to check if specific objects are instances of specific Drizzle types. It might be useful if you are building something on top of the Drizzle API.\n\n```ts\nimport { is, Column } from 'drizzle-orm'\n\nif (is(value, Column)) {\n  // value's type is narrowed to Column\n}\n```\n\n## `distinct` clause support\n\n```ts\nawait db.selectDistinct().from(usersDistinctTable).orderBy(\n  usersDistinctTable.id,\n  usersDistinctTable.name,\n);\n```\n\nAlso, `distinct on` clause is available for PostgreSQL:\n\n```ts\nawait db.selectDistinctOn([usersDistinctTable.id]).from(usersDistinctTable).orderBy(\n  usersDistinctTable.id,\n);\n\nawait db.selectDistinctOn([usersDistinctTable.name], { name: usersDistinctTable.name }).from(\n  usersDistinctTable,\n).orderBy(usersDistinctTable.name);\n```\n\n## `bigint` and `boolean` support for SQLite\n\nContributed by @MrRahulRamkumar (#558), @raducristianpopa (#411) and @meech-ward (#725)\n\n```ts\nconst users = sqliteTable('users', {\n  bigintCol: blob('bigint', { mode: 'bigint' }).notNull(),\n  boolCol: integer('bool', { mode: 'boolean' }).notNull(),\n});\n```\n\n## DX improvements\n\n- Added verbose type error when relational queries are used on a database type without a schema generic\n- Fix `where` callback in RQB for tables without relations\n\n## Various docs improvements\n\n- Fix joins docs typo (#522) by @arjunyel\n- Add Supabase guide to readme (#690) by @saltcod\n- Make the column type in sqlite clearer (#717) by @shairez\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.27.1.md",
    "content": "- 🎉 Added support for [Neon HTTP driver](https://neon.tech/docs/serverless/serverless-driver)\n\n```typescript\nimport { neon, neonConfig } from '@neondatabase/serverless';\nimport { drizzle } from 'drizzle-orm/neon-http';\n\nneonConfig.fetchConnectionCache = true;\n\nconst sql = neon(process.env.DRIZZLE_DATABASE_URL!);\nconst db = drizzle(sql);\n\ndb.select(...)\n```"
  },
  {
    "path": "changelogs/drizzle-orm/0.27.2.md",
    "content": "## 🎉 Added support for `UNIQUE` constraints in PostgreSQL, MySQL, SQLite\n\nFor PostgreSQL, unique constraints can be defined at the column level for single-column constraints, and in the third parameter for multi-column constraints. In both cases, it will be possible to define a custom name for the constraint. Additionally, PostgreSQL will receive the `NULLS NOT DISTINCT` option to restrict having more than one NULL value in a table. [Reference](https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-UNIQUE-CONSTRAINTS)\n\nExamples that just shows a different `unique` usage. Please don't search a real usage for those tables\n\n```ts\n// single column\nconst table = pgTable('table', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull().unique(),\n  state: char('state', { length: 2 }).unique('custom'),\n  field: char('field', { length: 2 }).unique('custom_field', { nulls: 'not distinct' }),\n});\n// multiple columns\nconst table = pgTable('table', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull(),\n  state: char('state', { length: 2 }),\n}, (t) => ({\n  first: unique('custom_name').on(t.name, t.state).nullsNotDistinct(),\n  second: unique('custom_name1').on(t.name, t.state),\n}));\n```\n\nFor MySQL, everything will be the same except for the `NULLS NOT DISTINCT` option. It appears that MySQL does not support it\n\nExamples that just shows a different `unique` usage. Please don't search a real usage for those tables\n\n```ts\n// single column\nconst table = mysqlTable('table', {\n    id: serial('id').primaryKey(),\n    name: text('name').notNull().unique(),\n    state: text('state').unique('custom'),\n    field: text('field').unique('custom_field'),\n});\n// multiple columns\nconst table = mysqlTable('cities1', {\n    id: serial('id').primaryKey(),\n    name: text('name').notNull(),\n    state: text('state'),\n}, (t) => ({\n    first: unique().on(t.name, t.state),\n    second: unique('custom_name1').on(t.name, t.state),\n}));\n```\n\nIn SQLite unique constraints are the same as unique indexes. As long as you can specify a name for the unique index in SQLite - we will treat all unique constraints as unique indexes in internal implementation\n\n```ts\n// single column\nconst table = sqliteTable('table', {\n    id: int('id').primaryKey(),\n    name: text('name').notNull().unique(),\n    state: text('state').unique('custom'),\n    field: text('field').unique(),\n});\n// multiple columns\nconst table = sqliteTable('table', {\n    id: int('id').primaryKey(),\n    name: text('name').notNull(),\n    state: text('state'),\n}, (t) => ({\n    first: unique().on(t.name, t.state),\n    second: unique('custom').on(t.name, t.state),\n}));\n```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.28.0.md",
    "content": "## Breaking changes\n\n### Removed support for filtering by nested relations\n\nCurrent example won't work in `0.28.0`:\n\n```ts\nconst usersWithPosts = await db.query.users.findMany({\n  where: (table, { sql }) => (sql`json_array_length(${table.posts}) > 0`),\n  with: {\n    posts: true,\n  },\n});\n```\n\nThe `table` object in the `where` callback won't have fields from `with` and `extras`. We removed them to be able to build more efficient relational queries, which improved row reads and performance.\n\nIf you have used those fields in the `where` callback before, there are several workarounds:\n\n1. Applying those filters manually on the code level after the rows are fetched;\n2. Using the core API.\n\n### Added Relational Queries `mode` config for `mysql2` driver\n\nDrizzle relational queries always generate exactly one SQL statement to run on the database and it has certain caveats. To have best in class support for every database out there we've introduced modes.\n\nDrizzle relational queries use lateral joins of subqueries under the hood and for now PlanetScale does not support them.\n\nWhen using `mysql2` driver with regular MySQL database - you should specify mode: \"default\".\nWhen using `mysql2` driver with PlanetScale - you need to specify mode: \"planetscale\".\n\n```ts\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport mysql from 'mysql2/promise';\nimport * as schema from './schema';\n\nconst connection = await mysql.createConnection({\n  uri: process.env.PLANETSCALE_DATABASE_URL,\n});\n\nconst db = drizzle(connection, { schema, mode: 'planetscale' });\n```\n\n## Improved IntelliSense performance for large schemas\n\nWe've run the diagnostics on a database schema with 85 tables, 666 columns, 26 enums, 172 indexes and 133 foreign keys. We've optimized internal types which resulted in **430%** speed up in IntelliSense.\n\n## Improved Relational Queries Permormance and Read Usage\n\nIn this release we've fully changed a way query is generated for Relational Queri API.\n\nAs a summary we've made current set of changes in query generation startegy:\n\n1. Lateral Joins: In the new version we're utilizing lateral joins, denoted by the \"LEFT JOIN LATERAL\" clauses, to retrieve specific data from related tables efficiently For MySQL in PlanetScale and SQLite, we've used simple subquery selects, which improved a query plan and overall performance\n\n2. Selective Data Retrieval: In the new version we're retrieving only the necessary data from tables. This targeted data retrieval reduces the amount of unnecessary information fetched, resulting in a smaller dataset to process and faster execution.\n\n3. Reduced Aggregations: In the new version we've reduced the number of aggregation functions (e.g., COUNT, json_agg). By using json_build_array directly within the lateral joins, drizzle is aggregating the data in a more streamlined manner, leading to improved query performance.\n\n4. Simplified Grouping: In the new version the GROUP BY clause is removed, as the lateral joins and subqueries already handle data aggregation more efficiently.\n\nFor this drizzle query\n\n```ts\nconst items = await db.query.comments.findMany({\n  limit,\n  orderBy: comments.id,\n  with: {\n    user: {\n      columns: { name: true },\n    },\n    post: {\n      columns: { title: true },\n      with: {\n        user: {\n          columns: { name: true },\n        },\n      },\n    },\n  },\n});\n```\n\nQuery that Drizzle generates now\n\n```sql\nselect \"comments\".\"id\",\n       \"comments\".\"user_id\",\n       \"comments\".\"post_id\",\n       \"comments\".\"content\",\n       \"comments_user\".\"data\" as \"user\",\n       \"comments_post\".\"data\" as \"post\"\nfrom \"comments\"\n         left join lateral (select json_build_array(\"comments_user\".\"name\") as \"data\"\n                            from (select *\n                                  from \"users\" \"comments_user\"\n                                  where \"comments_user\".\"id\" = \"comments\".\"user_id\"\n                                  limit 1) \"comments_user\") \"comments_user\" on true\n         left join lateral (select json_build_array(\"comments_post\".\"title\", \"comments_post_user\".\"data\") as \"data\"\n                            from (select *\n                                  from \"posts\" \"comments_post\"\n                                  where \"comments_post\".\"id\" = \"comments\".\"post_id\"\n                                  limit 1) \"comments_post\"\n                                     left join lateral (select json_build_array(\"comments_post_user\".\"name\") as \"data\"\n                                                        from (select *\n                                                              from \"users\" \"comments_post_user\"\n                                                              where \"comments_post_user\".\"id\" = \"comments_post\".\"user_id\"\n                                                              limit 1) \"comments_post_user\") \"comments_post_user\"\n                                               on true) \"comments_post\" on true\norder by \"comments\".\"id\"\nlimit 1\n```\n\nQuery generated before:\n\n```sql\nSELECT \"id\",\n       \"user_id\",\n       \"post_id\",\n       \"content\",\n       \"user\"::JSON,\n       \"post\"::JSON\nFROM\n  (SELECT \"comments\".*,\n          CASE\n              WHEN count(\"comments_post\".\"id\") = 0 THEN '[]'\n              ELSE json_agg(json_build_array(\"comments_post\".\"title\", \"comments_post\".\"user\"::JSON))::text\n          END AS \"post\"\n   FROM\n     (SELECT \"comments\".*,\n             CASE\n                 WHEN count(\"comments_user\".\"id\") = 0 THEN '[]'\n                 ELSE json_agg(json_build_array(\"comments_user\".\"name\"))::text\n             END AS \"user\"\n      FROM \"comments\"\n      LEFT JOIN\n        (SELECT \"comments_user\".*\n         FROM \"users\" \"comments_user\") \"comments_user\" ON \"comments\".\"user_id\" = \"comments_user\".\"id\"\n      GROUP BY \"comments\".\"id\",\n               \"comments\".\"user_id\",\n               \"comments\".\"post_id\",\n               \"comments\".\"content\") \"comments\"\n   LEFT JOIN\n     (SELECT \"comments_post\".*\n      FROM\n        (SELECT \"comments_post\".*,\n                CASE\n                    WHEN count(\"comments_post_user\".\"id\") = 0 THEN '[]'\n                    ELSE json_agg(json_build_array(\"comments_post_user\".\"name\"))\n                END AS \"user\"\n         FROM \"posts\" \"comments_post\"\n         LEFT JOIN\n           (SELECT \"comments_post_user\".*\n            FROM \"users\" \"comments_post_user\") \"comments_post_user\" ON \"comments_post\".\"user_id\" = \"comments_post_user\".\"id\"\n         GROUP BY \"comments_post\".\"id\") \"comments_post\") \"comments_post\" ON \"comments\".\"post_id\" = \"comments_post\".\"id\"\n   GROUP BY \"comments\".\"id\",\n            \"comments\".\"user_id\",\n            \"comments\".\"post_id\",\n            \"comments\".\"content\",\n            \"comments\".\"user\") \"comments\"\nLIMIT 1\n```\n\n## Possibility to insert rows with default values for all columns\n\nYou can now provide an empty object or an array of empty objects, and Drizzle will insert all defaults into the database.\n\n```ts\n// Insert 1 row with all defaults\nawait db.insert(usersTable).values({});\n\n// Insert 2 rows with all defaults\nawait db.insert(usersTable).values([{}, {}]);\n```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.28.1.md",
    "content": "- 🐛 Fixed Postgres array-related issues introduced by 0.28.0 (#983, #992)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.28.2.md",
    "content": "## The community contributions release 🎉\n\n### Internal Features and Changes\n1. Added a set of tests for d1. Thanks to @AdiRishi!\n2. Fixed issues in internal documentation. Thanks to @balazsorban44 and @pyk!\n\n### Bug Fixes\n1. Resolved the issue of truncating timestamp milliseconds for MySQL. Thanks to @steviec!\n2. Corrected the type of the get() method for sqlite-based dialects. Issue #565 has been closed. Thanks to @stefanmaric!\n3. Rectified the sqlite-proxy bug that caused the query to execute twice. Thanks to @mosch!\n\n### New packages 🎉\n\nAdded a support for [Typebox](https://github.com/sinclairzx81/typebox) in [drizzle-typebox](https://orm.drizzle.team/docs/typebox) package. Thanks to @Bulbang!\n\nPlease check documentation page for more usage examples: https://orm.drizzle.team/docs/typebox\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.28.3.md",
    "content": "- 🎉 Added SQLite simplified query API\n\n- 🎉 Added `.$defaultFn()` / `.$default()` methods to column builders\n\nYou can specify any logic and any implementation for a function like `cuid()` for runtime defaults. Drizzle won't limit you in the number of implementations you can add.\n\n> Note: This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`\n\n```ts\nimport { varchar, mysqlTable } from \"drizzle-orm/mysql-core\";\nimport { createId } from '@paralleldrive/cuid2';\n\nconst table = mysqlTable('table', {\n\tid: varchar('id', { length: 128 }).$defaultFn(() => createId()),\n});\n```\n\n- 🎉 Added `table.$inferSelect` / `table._.inferSelect` and `table.$inferInsert` / `table._.inferInsert` for more convenient table model type inference\n\n- 🛠 Deprecated `InferModel` type in favor of more explicit `InferSelectModel` and `InferInsertModel`\n\n```ts\nimport { InferSelectModel, InferInsertModel } from 'drizzle-orm'\n\nconst usersTable = pgTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull(),\n  verified: boolean('verified').notNull().default(false),\n  jsonb: jsonb('jsonb').$type<string[]>(),\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n});\n\ntype SelectUser = typeof usersTable.$inferSelect;\ntype InsertUser = typeof usersTable.$inferInsert;\n\ntype SelectUser2 = InferSelectModel<typeof usersTable>;\ntype InsertUser2 = InferInsertModel<typeof usersTable>;\n```\n\n- 🛠 Disabled `.d.ts` files bundling\n- 🐛 Fixed sqlite-proxy and SQL.js response from `.get()` when the result is empty\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.28.4.md",
    "content": "- 🐛 Fixed imports in ESM-based projects (#1088)\n- 🐛 Fixed type error on Postgres table definitions (#1089)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.28.5.md",
    "content": "- 🐛 Fixed incorrect OpenTelemetry type import that caused a runtime error\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.28.6.md",
    "content": "## Changes\n\n> **Note**:\n> MySQL `datetime` with `mode: 'date'` will now store dates in UTC strings and retrieve data in UTC as well to align with MySQL behavior for `datetime`. If you need a different behavior and want to handle `datetime` mapping in a different way, please use `mode: 'string'` or [Custom Types](https://orm.drizzle.team/docs/custom-types) implementation\n\nCheck [Fix Datetime mapping for MySQL](https://github.com/drizzle-team/drizzle-orm/pull/1082) for implementation details\n\n## New Features\n\n### 🎉 `LibSQL` batch api support\n\nReference: https://docs.turso.tech/reference/client-access/javascript-typescript-sdk#execute-a-batch-of-statements\n\nBatch API usage example:\n\n```ts\nconst batchResponse = await db.batch([\n\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({\n\t\tid: usersTable.id,\n\t}),\n\tdb.update(usersTable).set({ name: 'Dan' }).where(eq(usersTable.id, 1)),\n\tdb.query.usersTable.findMany({}),\n\tdb.select().from(usersTable).where(eq(usersTable.id, 1)),\n\tdb.select({ id: usersTable.id, invitedBy: usersTable.invitedBy }).from(\n\t\tusersTable,\n\t),\n]);\n```\n\nType for `batchResponse` in this example would be:\n\n```ts\ntype BatchResponse = [\n\t{\n\t\tid: number;\n\t}[],\n\tResultSet,\n\t{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t}[],\n\t{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t}[],\n\t{\n\t\tid: number;\n\t\tinvitedBy: number | null;\n\t}[],\n];\n```\n\nAll possible builders that can be used inside `db.batch`:\n\n```ts\n`db.all()`,\n`db.get()`,\n`db.values()`,\n`db.run()`,\n`db.query.<table>.findMany()`,\n`db.query.<table>.findFirst()`,\n`db.select()...`,\n`db.update()...`,\n`db.delete()...`,\n`db.insert()...`,\n```\n\nMore usage examples here: [integration-tests/tests/libsql-batch.test.ts](https://github.com/drizzle-team/drizzle-orm/pull/1161/files#diff-17253895532e520545027dd48dcdbac2d69a5a49d594974e6d55d7502f89b838R248) and in [docs](https://orm.drizzle.team/docs/batch-api)\n\n### 🎉 Add json mode for text in SQLite\n\nExample\n\n```ts\nconst test = sqliteTable('test', {\n\tdataTyped: text('data_typed', { mode: 'json' }).$type<{ a: 1 }>().notNull(),\n});\n```\n\n### 🎉 Add `.toSQL()` to Relational Query API calls\n\nExample\n\n```ts\nconst query = db.query.usersTable.findFirst().toSQL();\n```\n\n### 🎉 Added new PostgreSQL operators for Arrays - thanks @L-Mario564\n\nList of operators and usage examples\n`arrayContains`, `arrayContained`, `arrayOverlaps`\n\n```ts\nconst contains = await db.select({ id: posts.id }).from(posts)\n\t.where(arrayContains(posts.tags, ['Typescript', 'ORM']));\n\nconst contained = await db.select({ id: posts.id }).from(posts)\n\t.where(arrayContained(posts.tags, ['Typescript', 'ORM']));\n\nconst overlaps = await db.select({ id: posts.id }).from(posts)\n\t.where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']));\n\nconst withSubQuery = await db.select({ id: posts.id }).from(posts)\n\t.where(arrayContains(\n\t\tposts.tags,\n\t\tdb.select({ tags: posts.tags }).from(posts).where(eq(posts.id, 1)),\n\t));\n```\n\n### 🎉 Add more SQL operators for where filter function in Relational Queries - thanks @cayter!\n\n**Before**\n\n```ts\nimport { inArray } from \"drizzle-orm/pg-core\";\n\nawait db.users.findFirst({\n  where: (table, _) => inArray(table.id, [ ... ])\n})\n```\n\n**After**\n\n```ts\nawait db.users.findFirst({\n  where: (table, { inArray }) => inArray(table.id, [ ... ])\n})\n```\n\n## Bug Fixes\n\n- 🐛 [Correct where in on conflict in sqlite](https://github.com/drizzle-team/drizzle-orm/pull/1076) - Thanks @hanssonduck!\n- 🐛 [Fix libsql/client type import](https://github.com/drizzle-team/drizzle-orm/pull/1122) - Thanks @luisfvieirasilva!\n- 🐛 [Fix: raw sql query not being mapped properly on RDS](https://github.com/drizzle-team/drizzle-orm/pull/1071) - Thanks @boian-ivanov\n- 🐛 [Fix Datetime mapping for MySQL](https://github.com/drizzle-team/drizzle-orm/pull/1082) - thanks @Angelelz\n- 🐛 [Fix smallserial generating as serial](https://github.com/drizzle-team/drizzle-orm/pull/1127) - thanks @L-Mario564\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.29.0.md",
    "content": "> Drizzle ORM version `0.29.0` will require a minimum Drizzle Kit version of `0.20.0`, and vice versa. Therefore, when upgrading to a newer version of Drizzle ORM, you will also need to upgrade Drizzle Kit. This may result in some breaking changes throughout the versions, especially if you need to upgrade Drizzle Kit and your Drizzle ORM version is older than `<0.28.0`\n\n## New Features\n\n### 🎉 MySQL `unsigned` option for bigint\n\nYou can now specify `bigint unsigned` type\n\n```ts\nconst table = mysqlTable('table', {\n  id: bigint('id', { mode: 'number', unsigned: true }),\n});\n```\n\nRead more in [docs](https://orm.drizzle.team/docs/column-types/mysql#bigint)\n\n### 🎉 Improved query builder types\n\nStarting from `0.29.0` by default, as all the query builders in Drizzle try to conform to SQL as much as possible, you can only invoke most of the methods once. For example, in a SELECT statement there might only be one WHERE clause, so you can only invoke .where() once:\n\n```ts\nconst query = db\n  .select()\n  .from(users)\n  .where(eq(users.id, 1))\n  .where(eq(users.name, 'John')); // ❌ Type error - where() can only be invoked once\n```\n\nThis behavior is useful for conventional query building, i.e. when you create the whole query at once. However, it becomes a problem when you want to build a query dynamically, i.e. if you have a shared function that takes a query builder and enhances it. To solve this problem, Drizzle provides a special 'dynamic' mode for query builders, which removes the restriction of invoking methods only once. To enable it, you need to call .$dynamic() on a query builder.\n\nLet's see how it works by implementing a simple withPagination function that adds LIMIT and OFFSET clauses to a query based on the provided page number and an optional page size:\n\n```ts\nfunction withPagination<T extends PgSelect>(\n  qb: T,\n  page: number,\n  pageSize: number = 10,\n) {\n  return qb.limit(pageSize).offset(page * pageSize);\n}\n\nconst query = db.select().from(users).where(eq(users.id, 1));\nwithPagination(query, 1); // ❌ Type error - the query builder is not in dynamic mode\n\nconst dynamicQuery = query.$dynamic();\nwithPagination(dynamicQuery, 1); // ✅ OK\n```\n\nNote that the withPagination function is generic, which allows you to modify the result type of the query builder inside it, for example by adding a join:\n\n```ts\nfunction withFriends<T extends PgSelect>(qb: T) {\n  return qb.leftJoin(friends, eq(friends.userId, users.id));\n}\n\nlet query = db.select().from(users).where(eq(users.id, 1)).$dynamic();\nquery = withFriends(query);\n```\n\nRead more in [docs](https://orm.drizzle.team/docs/dynamic-query-building)\n\n### 🎉 Possibility to specify name for primary keys and foreign keys\n\nThere is an issue when constraint names exceed the 64-character limit of the database. This causes the database engine to truncate the name, potentially leading to issues. Starting from `0.29.0`, you have the option to specify custom names for both `primaryKey()` and `foreignKey()`. We have also deprecated the old `primaryKey()` syntax, which can still be used but will be removed in future releases\n\n```ts\nconst table = pgTable('table', {\n  id: integer('id'),\n  name: text('name'),\n}, (table) => ({\n  cpk: primaryKey({ name: 'composite_key', columns: [table.id, table.name] }),\n  cfk: foreignKey({\n    name: 'fkName',\n    columns: [table.id],\n    foreignColumns: [table.name],\n  }),\n}));\n```\n\nRead more in [docs](https://orm.drizzle.team/docs/indexes-constraints#composite-primary-key)\n\n### 🎉 Read Replicas Support\n\nYou can now use the Drizzle `withReplica` function to specify different database connections for read replicas and the main instance for write operations. By default, `withReplicas` will use a random read replica for read operations and the main instance for all other data modification operations. You can also specify custom logic for choosing which read replica connection to use. You have the freedom to make any weighted, custom decision for that. Here are some usage examples:\n\n```ts\nconst primaryDb = drizzle(client);\nconst read1 = drizzle(client);\nconst read2 = drizzle(client);\n\nconst db = withReplicas(primaryDb, [read1, read2]);\n\n// read from primary\ndb.$primary.select().from(usersTable);\n\n// read from either read1 connection or read2 connection\ndb.select().from(usersTable)\n\n// use primary database for delete operation\ndb.delete(usersTable).where(eq(usersTable.id, 1))\n```\n\nImplementation example of custom logic for selecting read replicas, where the first replica has a 70% chance of being chosen, and the second replica has a 30% chance of being chosen. Note that you can implement any type of random selection for read replicas\n\n```ts\nconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n    const weight = [0.7, 0.3];\n    let cumulativeProbability = 0;\n    const rand = Math.random();\n\n    for (const [i, replica] of replicas.entries()) {\n      cumulativeProbability += weight[i]!;\n      if (rand < cumulativeProbability) return replica;\n    }\n    return replicas[0]!\n});\n```\n\n`withReplicas` function is available for all dialects in Drizzle ORM\n\nRead more in [docs](https://orm.drizzle.team/docs/read-replicas)\n\n### 🎉 Set operators support (UNION, UNION ALL, INTERSECT, INTERSECT ALL, EXCEPT, EXCEPT ALL)\n\nHuge thanks to @Angelelz for the significant contribution he made, from API discussions to proper type checks and runtime logic, along with an extensive set of tests. This greatly assisted us in delivering this feature in this release\n\nUsage examples:\nAll set operators can be used in a two ways: `import approach` or `builder approach`\n\n##### Import approach\n```ts\nimport { union } from 'drizzle-orm/pg-core'\n\nconst allUsersQuery = db.select().from(users);\nconst allCustomersQuery = db.select().from(customers);\n\nconst result = await union(allUsersQuery, allCustomersQuery)\n```\n\n##### Builder approach\n```ts\nconst result = await db.select().from(users).union(db.select().from(customers));\n```\n\nRead more in [docs](https://orm.drizzle.team/docs/set-operations)\n\n### 🎉 New MySQL Proxy Driver\n\nA new driver has been released, allowing you to create your own implementation for an HTTP driver using a MySQL database. You can find usage examples in the `./examples/mysql-proxy` folder\n\nYou need to implement two endpoints on your server that will be used for queries and migrations(Migrate endpoint is optional and only if you want to use drizzle migrations). Both the server and driver implementation are up to you, so you are not restricted in any way. You can add custom mappings, logging, and much more\n\nYou can find both server and driver implementation examples in the `./examples/mysql-proxy` folder\n\n```ts\n// Driver\nimport axios from 'axios';\nimport { eq } from 'drizzle-orm/expressions';\nimport { drizzle } from 'drizzle-orm/mysql-proxy';\nimport { migrate } from 'drizzle-orm/mysql-proxy/migrator';\nimport { cities, users } from './schema';\n\nasync function main() {\n  const db = drizzle(async (sql, params, method) => {\n    try {\n      const rows = await axios.post(`${process.env.REMOTE_DRIVER}/query`, {\n        sql,\n        params,\n        method,\n      });\n\n      return { rows: rows.data };\n    } catch (e: any) {\n      console.error('Error from pg proxy server:', e.response.data);\n      return { rows: [] };\n    }\n  });\n\n  await migrate(db, async (queries) => {\n    try {\n      await axios.post(`${process.env.REMOTE_DRIVER}/migrate`, { queries });\n    } catch (e) {\n      console.log(e);\n      throw new Error('Proxy server cannot run migrations');\n    }\n  }, { migrationsFolder: 'drizzle' });\n\n  await db.insert(cities).values({ id: 1, name: 'name' });\n\n  await db.insert(users).values({\n    id: 1,\n    name: 'name',\n    email: 'email',\n    cityId: 1,\n  });\n\n  const usersToCityResponse = await db.select().from(users).leftJoin(\n    cities,\n    eq(users.cityId, cities.id),\n  );\n}\n```\n\n### 🎉 New PostgreSQL Proxy Driver\n\nSame as MySQL you can now implement your own http driver for PostgreSQL database. You can find usage examples in the `./examples/pg-proxy` folder\n\nYou need to implement two endpoints on your server that will be used for queries and migrations (Migrate endpoint is optional and only if you want to use drizzle migrations). Both the server and driver implementation are up to you, so you are not restricted in any way. You can add custom mappings, logging, and much more\n\nYou can find both server and driver implementation examples in the `./examples/pg-proxy` folder\n\n```ts\nimport axios from 'axios';\nimport { eq } from 'drizzle-orm/expressions';\nimport { drizzle } from 'drizzle-orm/pg-proxy';\nimport { migrate } from 'drizzle-orm/pg-proxy/migrator';\nimport { cities, users } from './schema';\n\nasync function main() {\n  const db = drizzle(async (sql, params, method) => {\n    try {\n      const rows = await axios.post(`${process.env.REMOTE_DRIVER}/query`, { sql, params, method });\n\n      return { rows: rows.data };\n    } catch (e: any) {\n      console.error('Error from pg proxy server:', e.response.data);\n      return { rows: [] };\n    }\n  });\n\n  await migrate(db, async (queries) => {\n    try {\n      await axios.post(`${process.env.REMOTE_DRIVER}/query`, { queries });\n    } catch (e) {\n      console.log(e);\n      throw new Error('Proxy server cannot run migrations');\n    }\n  }, { migrationsFolder: 'drizzle' });\n\n  const insertedCity = await db.insert(cities).values({ id: 1, name: 'name' }).returning();\n  const insertedUser = await db.insert(users).values({ id: 1, name: 'name', email: 'email', cityId: 1 });\n  const usersToCityResponse = await db.select().from(users).leftJoin(cities, eq(users.cityId, cities.id));\n}\n```\n\n### 🎉 `D1` Batch API support\n\nReference: https://developers.cloudflare.com/d1/platform/client-api/#dbbatch\n\nBatch API usage example:\n\n```ts\nconst batchResponse = await db.batch([\n  db.insert(usersTable).values({ id: 1, name: 'John' }).returning({\n    id: usersTable.id,\n  }),\n  db.update(usersTable).set({ name: 'Dan' }).where(eq(usersTable.id, 1)),\n  db.query.usersTable.findMany({}),\n  db.select().from(usersTable).where(eq(usersTable.id, 1)),\n  db.select({ id: usersTable.id, invitedBy: usersTable.invitedBy }).from(\n    usersTable,\n  ),\n]);\n```\n\nType for `batchResponse` in this example would be:\n\n```ts\ntype BatchResponse = [\n  {\n    id: number;\n  }[],\n  D1Result,\n  {\n    id: number;\n    name: string;\n    verified: number;\n    invitedBy: number | null;\n  }[],\n  {\n    id: number;\n    name: string;\n    verified: number;\n    invitedBy: number | null;\n  }[],\n  {\n    id: number;\n    invitedBy: number | null;\n  }[],\n];\n```\n\nAll possible builders that can be used inside `db.batch`:\n\n```ts\n`db.all()`,\n`db.get()`,\n`db.values()`,\n`db.run()`,\n`db.query.<table>.findMany()`,\n`db.query.<table>.findFirst()`,\n`db.select()...`,\n`db.update()...`,\n`db.delete()...`,\n`db.insert()...`,\n```\n\nMore usage examples here: [integration-tests/tests/d1-batch.test.ts](https://github.com/drizzle-team/drizzle-orm/blob/beta/integration-tests/tests/d1-batch.test.ts) and in [docs](https://orm.drizzle.team/docs/batch-api)\n\n---\n## Drizzle Kit 0.20.0\n\n1. New way to define drizzle.config using `defineConfig` function\n2. Possibility to access Cloudflare D1 with Drizzle Studio using wrangler.toml file\n3. Drizzle Studio is migrating to https://local.drizzle.studio/\n4. `bigint unsigned` support\n5. `primaryKeys` and `foreignKeys` now can have custom names\n6. Environment variables are now automatically fetched \n7. Some bug fixes and improvements\n\nYou can read more about drizzle-kit updates [here](https://github.com/drizzle-team/drizzle-kit-mirror/releases/tag/v0.20.0)"
  },
  {
    "path": "changelogs/drizzle-orm/0.29.1.md",
    "content": "# Fixes\n\n- Forward args correctly when using withReplica feature #1536. Thanks @Angelelz\n- Fix selectDistinctOn not working with multiple columns #1466. Thanks @L-Mario564\n\n# New Features/Helpers\n\n## 🎉 Detailed JSDoc for all query builders in all dialects - thanks @realmikesolo\n\nYou can now access more information, hints, documentation links, etc. while developing and using JSDoc right in your IDE. Previously, we had them only for filter expressions, but now you can see them for all parts of the Drizzle query builder\n\n## 🎉 New helpers for aggregate functions in SQL - thanks @L-Mario564\n\n>  Remember, aggregation functions are often used with the GROUP BY clause of the SELECT statement. So if you are selecting using aggregating functions and other columns in one query, \nbe sure to use the `.groupBy` clause\n\nHere is a list of functions and equivalent using `sql` template\n\n**count**\n```ts\nawait db.select({ value: count() }).from(users);\nawait db.select({ value: count(users.id) }).from(users);\n\n// It's equivalent to writing\nawait db.select({ \n  value: sql`count('*'))`.mapWith(Number) \n}).from(users);\nawait db.select({ \n  value: sql`count(${users.id})`.mapWith(Number) \n}).from(users);\n```\n\n**countDistinct**\n```ts\nawait db.select({ value: countDistinct(users.id) }).from(users);\n\n// It's equivalent to writing\nawait db.select({ \n  value: sql`count(${users.id})`.mapWith(Number) \n}).from(users);\n```\n\n**avg**\n```ts\nawait db.select({ value: avg(users.id) }).from(users);\n\n// It's equivalent to writing\nawait db.select({ \n  value: sql`avg(${users.id})`.mapWith(String) \n}).from(users);\n```\n\n**avgDistinct**\n```ts\nawait db.select({ value: avgDistinct(users.id) }).from(users);\n\n// It's equivalent to writing\nawait db.select({ \n  value: sql`avg(distinct ${users.id})`.mapWith(String) \n}).from(users);\n```\n\n**sum**\n```ts\nawait db.select({ value: sum(users.id) }).from(users);\n\n// It's equivalent to writing\nawait db.select({ \n  value: sql`sum(${users.id})`.mapWith(String) \n}).from(users);\n```\n\n**sumDistinct**\n```ts\nawait db.select({ value: sumDistinct(users.id) }).from(users);\n\n// It's equivalent to writing\nawait db.select({ \n  value: sql`sum(distinct ${users.id})`.mapWith(String) \n}).from(users);\n```\n\n**max**\n```ts\nawait db.select({ value: max(users.id) }).from(users);\n\n// It's equivalent to writing\nawait db.select({ \n  value: sql`max(${expression})`.mapWith(users.id) \n}).from(users);\n```\n\n**min**\n```ts\nawait db.select({ value: min(users.id) }).from(users);\n\n// It's equivalent to writing\nawait db.select({ \n  value: sql`min(${users.id})`.mapWith(users.id) \n}).from(users);\n```\n\n# New Packages\n## 🎉 ESLint Drizzle Plugin\n\nFor cases where it's impossible to perform type checks for specific scenarios, or where it's possible but error messages would be challenging to understand, we've decided to create an ESLint package with recommended rules. This package aims to assist developers in handling crucial scenarios during development\n\n> Big thanks to @Angelelz for initiating the development of this package and transferring it to the Drizzle Team's npm\n\n## Install\n\n```sh\n[ npm | yarn | pnpm | bun ] install eslint eslint-plugin-drizzle\n```\nYou can install those packages for typescript support in your IDE\n```sh\n[ npm | yarn | pnpm | bun ] install @typescript-eslint/eslint-plugin @typescript-eslint/parser\n```\n\n## Usage\n\nCreate a `.eslintrc.yml` file, add `drizzle` to the `plugins`, and specify the rules you want to use. You can find a list of all existing rules below\n\n```yml\nroot: true\nparser: '@typescript-eslint/parser'\nparserOptions:\n  project: './tsconfig.json'\nplugins:\n  - drizzle\nrules:\n  'drizzle/enforce-delete-with-where': \"error\"\n  'drizzle/enforce-update-with-where': \"error\"\n```\n\n### All config\n\nThis plugin exports an [`all` config](src/configs/all.js) that makes use of all rules (except for deprecated ones).\n\n```yml\nroot: true\nextends:\n  - \"plugin:drizzle/all\"\nparser: '@typescript-eslint/parser'\nparserOptions:\n  project: './tsconfig.json'\nplugins:\n  - drizzle\n```\n\nAt the moment, `all` is equivalent to `recommended`\n\n```yml\nroot: true\nextends:\n  - \"plugin:drizzle/recommended\"\nparser: '@typescript-eslint/parser'\nparserOptions:\n  project: './tsconfig.json'\nplugins:\n  - drizzle\n```\n\n## Rules\n\n**enforce-delete-with-where**: Enforce using `delete` with the`.where()` clause in the `.delete()` statement. Most of the time, you don't need to delete all rows in the table and require some kind of `WHERE` statements.\n\n**Error Message**:\n```\nWithout `.where(...)` you will delete all the rows in a table. If you didn't want to do it, please use `db.delete(...).where(...)` instead. Otherwise you can ignore this rule here\n```\n\nOptionally, you can define a `drizzleObjectName` in the plugin options that accept a `string` or `string[]`. This is useful when you have objects or classes with a delete method that's not from Drizzle. Such a `delete` method will trigger the ESLint rule. To avoid that, you can define the name of the Drizzle object that you use in your codebase (like db) so that the rule would only trigger if the delete method comes from this object:\n\nExample, config 1:\n```json\n\"rules\": {\n  \"drizzle/enforce-delete-with-where\": [\"error\"]\n}\n```\n\n```ts\nclass MyClass {\n  public delete() {\n    return {}\n  }\n}\n\nconst myClassObj = new MyClass();\n\n// ---> Will be triggered by ESLint Rule\nmyClassObj.delete()\n\nconst db = drizzle(...)\n// ---> Will be triggered by ESLint Rule\ndb.delete()\n```\n\nExample, config 2:\n```json\n\"rules\": {\n  \"drizzle/enforce-delete-with-where\": [\"error\", { \"drizzleObjectName\": [\"db\"] }],\n}\n```\n```ts\nclass MyClass {\n  public delete() {\n    return {}\n  }\n}\n\nconst myClassObj = new MyClass();\n\n// ---> Will NOT be triggered by ESLint Rule\nmyClassObj.delete()\n\nconst db = drizzle(...)\n// ---> Will be triggered by ESLint Rule\ndb.delete()\n```\n\n**enforce-update-with-where**: Enforce using `update` with the`.where()` clause in the `.update()` statement. Most of the time, you don't need to update all rows in the table and require some kind of `WHERE` statements.\n\n**Error Message**:\n```\nWithout `.where(...)` you will update all the rows in a table. If you didn't want to do it, please use `db.update(...).set(...).where(...)` instead. Otherwise you can ignore this rule here\n```\n\nOptionally, you can define a `drizzleObjectName` in the plugin options that accept a `string` or `string[]`. This is useful when you have objects or classes with a delete method that's not from Drizzle. Such as `update` method will trigger the ESLint rule. To avoid that, you can define the name of the Drizzle object that you use in your codebase (like db) so that the rule would only trigger if the delete method comes from this object:\n\nExample, config 1:\n```json\n\"rules\": {\n  \"drizzle/enforce-update-with-where\": [\"error\"]\n}\n```\n\n```ts\nclass MyClass {\n  public update() {\n    return {}\n  }\n}\n\nconst myClassObj = new MyClass();\n\n// ---> Will be triggered by ESLint Rule\nmyClassObj.update()\n\nconst db = drizzle(...)\n// ---> Will be triggered by ESLint Rule\ndb.update()\n```\n\nExample, config 2:\n```json\n\"rules\": {\n  \"drizzle/enforce-update-with-where\": [\"error\", { \"drizzleObjectName\": [\"db\"] }],\n}\n```\n```ts\nclass MyClass {\n  public update() {\n    return {}\n  }\n}\n\nconst myClassObj = new MyClass();\n\n// ---> Will NOT be triggered by ESLint Rule\nmyClassObj.update()\n\nconst db = drizzle(...)\n// ---> Will be triggered by ESLint Rule\ndb.update()\n```"
  },
  {
    "path": "changelogs/drizzle-orm/0.29.2.md",
    "content": "## Fixes\n\n- Added improvements to the planescale relational tests #1579 - thanks @Angelelz\n- [Pg] FIX: correct string escaping for empty PgArrays #1640 - thanks @Angelelz\n- Fix wrong syntax for exists fn in sqlite #1647 - thanks @Angelelz\n- Properly handle dates in AWS Data API\n- Fix Hermes mixins constructor issue\n\n## ESLint Drizzle Plugin, v0.2.3\n\n```\nnpm i eslint-plugin-drizzle@0.2.3\n```\n\n🎉 **[ESLint] Add support for functions and improve error messages #1586 - thanks @ngregrichardson**\n\n- Allowed Drizzle object to be or to be retrieved from a function, e.g.\n- Added better context to the suggestion in the error message.\n\n## New Drivers\n\n### 🎉 Expo SQLite Driver is available\n\nFor starting with Expo SQLite Driver, you need to install `expo-sqlite` and `drizzle-orm` packages.\n\n```bash\nnpm install drizzle-orm expo-sqlite@next\n```\n\nThen, you can use it like this:\n\n```ts\nimport { drizzle } from \"drizzle-orm/expo-sqlite\";\nimport { openDatabaseSync } from \"expo-sqlite/next\";\n\nconst expoDb = openDatabaseSync(\"db.db\");\n\nconst db = drizzle(expoDb);\n\nawait db.select().from(...)...\n\n// or\n\ndb.select().from(...).then(...);\n\n// or\n\ndb.select().from(...).all();\n```\n\nIf you want to use Drizzle Migrations, you need to update babel and metro configuration files.\n\n1. Install `babel-plugin-inline-import` package.\n\n```bash\nnpm install babel-plugin-inline-import\n```\n\n2. Update `babel.config.js` and `metro.config.js` files.\n\nbabel.config.js\n\n```diff\nmodule.exports = function(api) {\n  api.cache(true);\n\n  return {\n    presets: ['babel-preset-expo'],\n+   plugins: [[\"inline-import\", { \"extensions\": [\".sql\"] }]]\n  };\n};\n```\n\nmetro.config.js\n\n```diff\nconst { getDefaultConfig } = require('expo/metro-config');\n\n/** @type {import('expo/metro-config').MetroConfig} */\nconst config = getDefaultConfig(__dirname);\n\n+config.resolver.sourceExts.push('sql');\n\nmodule.exports = config;\n```\n\n3. Create `drizzle.config.ts` file in your project root folder.\n\n```ts\nimport type { Config } from 'drizzle-kit';\n\nexport default {\n\tschema: './db/schema.ts',\n\tout: './drizzle',\n\tdriver: 'expo',\n} satisfies Config;\n```\n\nAfter creating schema file and drizzle.config.ts file, you can generate migrations like this:\n\n```bash\nnpx drizzle-kit generate:sqlite\n```\n\nThen you need to import `migrations.js` file in your `App.tsx` file from `./drizzle` folder and use hook `useMigrations` or `migrate` function.\n\n```tsx\nimport { drizzle } from \"drizzle-orm/expo-sqlite\";\nimport { openDatabaseSync } from \"expo-sqlite/next\";\nimport { useMigrations } from 'drizzle-orm/expo-sqlite/migrator';\nimport migrations from './drizzle/migrations';\n\nconst expoDb = openDatabaseSync(\"db.db\");\n\nconst db = drizzle(expoDb);\n\nexport default function App() {\n    const { success, error } = useMigrations(db, migrations);\n\n    if (error) {\n        return (\n            <View>\n                <Text>Migration error: {error.message}</Text>\n            </View>\n        );\n    }\n\n    if (!success) {\n        return (\n            <View>\n                <Text>Migration is in progress...</Text>\n            </View>\n        );\n    }\n\n    return ...your application component;\n}\n```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.29.3.md",
    "content": "- fix: make expo peer dependencies optional #1714\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.29.4.md",
    "content": "## New Features\n\n### 🎉 **Neon HTTP Batch**\n\nFor more info you can check [Neon docs](https://neon.tech/docs/serverless/serverless-driver#issue-multiple-queries-with-the-transaction-function)\n\n**Example**\n\n```ts\nconst batchResponse: BatchType = await db.batch([\n\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({\n\t\tid: usersTable.id,\n\t}),\n\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\tdb.query.usersTable.findMany({}),\n\tdb.query.usersTable.findFirst({}),\n]);\n```\n\n```ts\ntype BatchType = [\n\t{\n\t\tid: number;\n\t}[],\n\tNeonHttpQueryResult<never>,\n\t{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t}[],\n\t{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t} | undefined,\n];\n```\n\n## Improvements\n\nThanks to the `database-js` and `PlanetScale` teams, we have updated the default behavior and instances of `database-js`.\n\nAs suggested by the `database-js` core team, you should use the `Client` instance instead of `connect()`:\n\n```typescript\nimport { Client } from '@planetscale/database';\nimport { drizzle } from 'drizzle-orm/planetscale-serverless';\n\n// create the connection\nconst client = new Client({\n\thost: process.env['DATABASE_HOST'],\n\tusername: process.env['DATABASE_USERNAME'],\n\tpassword: process.env['DATABASE_PASSWORD'],\n});\n\nconst db = drizzle(client);\n```\n\n> Warning: In this version, there are no breaking changes, but starting from version `0.30.0`, you will encounter an error if you attempt to use anything other than a `Client` instance.\n>\n> We suggest starting to change connections to PlanetScale now to prevent any runtime errors in the future.\n\nPreviously our docs stated to use `connect()` and only this function was can be passed to drizzle. In this realase we are adding support for `new Client()` and deprecating `connect()`, by suggesting from `database-js` team. In this release you will see a `warning` when trying to pass `connect()` function result:\n\n**Warning text**\n\n```mdx\nWarning: You need to pass an instance of Client:\n\nimport { Client } from \"@planetscale/database\";\n\nconst client = new Client({\n  host: process.env[\"DATABASE_HOST\"],\n  username: process.env[\"DATABASE_USERNAME\"],\n  password: process.env[\"DATABASE_PASSWORD\"],\n});\n\nconst db = drizzle(client);\n\nStarting from version 0.30.0, you will encounter an error if you attempt to use anything other than a Client instance.\n\nPlease make the necessary changes now to prevent any runtime errors in the future\n```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.29.5.md",
    "content": "## New Features\n\n### 🎉 WITH UPDATE, WITH DELETE, WITH INSERT - thanks @L-Mario564\n\nYou can now use `WITH` statements with [INSERT](https://orm.drizzle.team/docs/insert#with-insert-clause), [UPDATE](https://orm.drizzle.team/docs/update#with-update-clause) and [DELETE](https://orm.drizzle.team/docs/delete#with-delete-clause) statements\n\nUsage examples\n\n```ts\nconst averageAmount = db.$with('average_amount').as(\n\tdb.select({ value: sql`avg(${orders.amount})`.as('value') }).from(orders),\n);\nconst result = await db\n\t.with(averageAmount)\n\t.delete(orders)\n\t.where(gt(orders.amount, sql`(select * from ${averageAmount})`))\n\t.returning({\n\t\tid: orders.id,\n\t});\n```\n\nGenerated SQL:\n\n```sql\nwith \"average_amount\" as (select avg(\"amount\") as \"value\" from \"orders\") \ndelete from \"orders\" \nwhere \"orders\".\"amount\" > (select * from \"average_amount\") \nreturning \"id\"\n```\n\nFor more examples for all statements, check docs:\n\n- [with insert docs](https://orm.drizzle.team/docs/insert#with-insert-clause)\n- [with update docs](https://orm.drizzle.team/docs/update#with-update-clause)\n- [with delete docs](https://orm.drizzle.team/docs/delete#with-delete-clause)\n\n### 🎉 Possibility to specify custom schema and custom name for migrations table - thanks @g3r4n\n\n- **Custom table for migrations**\n\nBy default, all information about executed migrations will be stored in the database inside the `__drizzle_migrations` table,\nand for PostgreSQL, inside the `drizzle` schema. However, you can configure where to store those records.\n\nTo add a custom table name for migrations stored inside your database, you should use the `migrationsTable` option\n\nUsage example\n\n```ts\nawait migrate(db, {\n\tmigrationsFolder: './drizzle',\n\tmigrationsTable: 'my_migrations',\n});\n```\n\n- **Custom schema for migrations**\n\n> Works only with PostgreSQL databases\n\nTo add a custom schema name for migrations stored inside your database, you should use the `migrationsSchema` option\n\nUsage example\n\n```ts\nawait migrate(db, {\n\tmigrationsFolder: './drizzle',\n\tmigrationsSchema: 'custom',\n});\n```\n\n### 🎉 SQLite Proxy batch and Relational Queries support\n\n- You can now use `.query.findFirst` and `.query.findMany` syntax with sqlite proxy driver\n\n- SQLite Proxy supports batch requests, the same as it's done for all other drivers. Check full [docs](https://orm.drizzle.team/docs/batch-api)\n\n  You will need to specify a specific callback for batch queries and handle requests to proxy server:\n\n```ts\nimport { drizzle } from 'drizzle-orm/sqlite-proxy';\n\ntype ResponseType = { rows: any[][] | any[] }[];\n\nconst db = drizzle(\n\tasync (sql, params, method) => {\n\t\t// single query logic\n\t},\n\t// new batch callback\n\tasync (\n\t\tqueries: {\n\t\t\tsql: string;\n\t\t\tparams: any[];\n\t\t\tmethod: 'all' | 'run' | 'get' | 'values';\n\t\t}[],\n\t) => {\n\t\ttry {\n\t\t\tconst result: ResponseType = await axios.post(\n\t\t\t\t'http://localhost:3000/batch',\n\t\t\t\t{ queries },\n\t\t\t);\n\n\t\t\treturn result;\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error from sqlite proxy server:', e);\n\t\t\tthrow e;\n\t\t}\n\t},\n);\n```\n\nAnd then you can use `db.batch([])` method, that will proxy all queries\n\n> Response from the batch should be an array of raw values (an array within an array), in the same order as they were sent to the proxy server\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.30.0.md",
    "content": "## Breaking Changes\n\nThe Postgres timestamp mapping has been changed to align all drivers with the same behavior.\n\n❗ We've modified the `postgres.js` driver instance to always return strings for dates, and then Drizzle will provide you with either strings of mapped dates, depending on the selected `mode`. The only issue you may encounter is that once you provide the `postgres.js`` driver instance inside Drizzle, the behavior of this object will change for dates, which will always be strings.\n\nWe've made this change as a minor release, just as a warning, that:\n\n- If you were using timestamps and were waiting for a specific response, the behavior will now be changed.\n  When mapping to the driver, we will always use `.toISOString` for both timestamps with timezone and without timezone.\n\n- If you were using the `postgres.js` driver outside of Drizzle, all `postgres.js` clients passed to Drizzle will have mutated behavior for dates. All dates will be strings in the response.\n\nParsers that were changed for `postgres.js`.\n\n```ts\nconst transparentParser = (val: any) => val;\n\n// Override postgres.js default date parsers: https://github.com/porsager/postgres/discussions/761\nfor (const type of ['1184', '1082', '1083', '1114']) {\n\tclient.options.parsers[type as any] = transparentParser;\n\tclient.options.serializers[type as any] = transparentParser;\n}\n```\n\nIdeally, as is the case with almost all other drivers, we should have the possibility to mutate mappings on a per-query basis, which means that the driver client won't be mutated. We will be reaching out to the creator of the `postgres.js` library to inquire about the possibility of specifying per-query mapping interceptors and making this flow even better for all users.\n\nIf we've overlooked this capability and it is already available with `postgres.js``, please ping us in our Discord!\n\nA few more references for timestamps without and with timezones can be found in our [docs](http://orm.drizzle.team/docs/column-types/pg#timestamp)\n\n## Bug fixed in this release\n\n- [BUG]: timestamp with mode string is returned as Date object instead of string - #806\n- [BUG]: Dates are always dates #971\n- [BUG]: Inconsistencies when working with timestamps and corresponding datetime objects in javascript. #1176\n- [BUG]: timestamp columns showing string type, however actually returning a Date object. #1185\n- [BUG]: Wrong data type for postgres date colum #1407\n- [BUG]: invalid timestamp conversion when using PostgreSQL with TimeZone set to UTC #1587\n- [BUG]: Postgres insert into timestamp with time zone removes milliseconds #1061\n- [BUG]: update timestamp field (using AWS Data API) #1164\n- [BUG]: Invalid date from relational queries #895\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.30.1.md",
    "content": "## New Features\n\n### 🎉 OP-SQLite driver Support\n\nUsage Example\n\n```ts\nimport { open } from '@op-engineering/op-sqlite';\nimport { drizzle } from 'drizzle-orm/op-sqlite';\n\nconst opsqlite = open({\n\tname: 'myDB',\n});\nconst db = drizzle(opsqlite);\n\nawait db.select().from(users);\n```\n\nFor more usage and setup details, please check our [op-sqlite docs](http://orm.drizzle.team/docs/get-started-sqlite#op-sqlite)\n\n### Bug fixes\n\n- Migration hook fixed for Expo driver\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.30.10.md",
    "content": "## New Features\n\n### 🎉 `.if()` function added to all WHERE expressions\n\n#### Select all users after cursors if a cursor value was provided\n\n```ts\nfunction getUsersAfter(cursor?: number) {\n    return db.select().from(users).where(\n        gt(users.id, cursor).if(cursor)\n    );\n}\n```\n\n## Bug Fixes\n\n- Fixed internal mappings for sessions `.all`, `.values`, `.execute` functions in AWS DataAPI\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.30.2.md",
    "content": "## Improvements\n\nLibSQL migrations have been updated to utilize batch execution instead of transactions. As stated in the [documentation](https://docs.turso.tech/sdk/ts/reference#batch-transactions), LibSQL now supports batch operations\n\n> A batch consists of multiple SQL statements executed sequentially within an implicit transaction. The backend handles the transaction: success commits all changes, while any failure results in a full rollback with no modifications.\n\n## Bug fixed\n\n- [Sqlite] Fix findFirst query for bun:sqlite #1885 - thanks @shaileshaanand\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.30.3.md",
    "content": "- 🎉 Added raw query support (`db.execute(...)`) to batch API in Neon HTTP driver\n- 🐛 Fixed `@neondatabase/serverless` HTTP driver types issue (#1945, neondatabase/serverless#66)\n- 🐛 Fixed sqlite-proxy driver `.run()` result\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.30.4.md",
    "content": "## New Features\n\n### 🎉 xata-http driver support\n\nAccording their **[official website](https://xata.io)**, Xata is a Postgres data platform with a focus on reliability, scalability, and developer experience. The Xata Postgres service is currently in beta, please see the [Xata docs](https://xata.io/docs/postgres) on how to enable it in your account.\n\nDrizzle ORM natively supports both the `xata` driver with `drizzle-orm/xata` package and the **[`postgres`](#postgresjs)** or **[`pg`](#node-postgres)** drivers for accessing a Xata Postgres database.\n\nThe following example use the Xata generated client, which you obtain by running the [xata init](https://xata.io/docs/getting-started/installation) CLI command.\n\n```bash\npnpm add drizzle-orm @xata.io/client\n```\n\n```ts\nimport { drizzle } from 'drizzle-orm/xata-http';\nimport { getXataClient } from './xata'; // Generated client\n\nconst xata = getXataClient();\nconst db = drizzle(xata);\n\nconst result = await db.select().from(...);\n```\n\nYou can also connect to Xata using `pg` or `postgres.js` drivers"
  },
  {
    "path": "changelogs/drizzle-orm/0.30.5.md",
    "content": "## New Features\n\n### 🎉 `$onUpdate` functionality for PostgreSQL, MySQL and SQLite\n\nAdds a dynamic update value to the column.\nThe function will be called when the row is updated, and the returned value will be used as the column value if none is provided.\nIf no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.\n\n> Note: This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\n```ts\nconst usersOnUpdate = pgTable('users_on_update', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull(),\n  updateCounter: integer('update_counter').default(sql`1`).$onUpdateFn(() => sql`update_counter + 1`),\n  updatedAt: timestamp('updated_at', { mode: 'date', precision: 3 }).$onUpdate(() => new Date()),\n  alwaysNull: text('always_null').$type<string | null>().$onUpdate(() => null),\n});\n```\n\n## Fixes\n\n- [BUG]: insertions on columns with the smallserial datatype are not optional - #1848\n\nThanks @Angelelz and @gabrielDonnantuoni!\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.30.6.md",
    "content": "## New Features\n\n### 🎉 PGlite driver Support\n\nPGlite is a WASM Postgres build packaged into a TypeScript client library that enables you to run Postgres in the browser, Node.js and Bun, with no need to install any other dependencies. It is only 2.6mb gzipped.\n\nIt can be used as an ephemeral in-memory database, or with persistence either to the file system (Node/Bun) or indexedDB (Browser).\n\nUnlike previous \"Postgres in the browser\" projects, PGlite does not use a Linux virtual machine - it is simply Postgres in WASM.\n\nUsage Example\n```ts\nimport { PGlite } from '@electric-sql/pglite';\nimport { drizzle } from 'drizzle-orm/pglite';\n\n// In-memory Postgres\nconst client = new PGlite();\nconst db = drizzle(client);\n\nawait db.select().from(users);\n```\n---\nThere are currently 2 limitations, that should be fixed on Pglite side:\n\n- [Attempting to refresh a materialised view throws error](https://github.com/electric-sql/pglite/issues/63)\n\n- [Attempting to SET TIME ZONE throws error](https://github.com/electric-sql/pglite/issues/62)"
  },
  {
    "path": "changelogs/drizzle-orm/0.30.7-preview.md",
    "content": "- 🎉 Added custom schema support to enums in Postgres:\n  ```ts\n  import { pgSchema } from 'drizzle-orm/pg-core';\n\n  const mySchema = pgSchema('mySchema');\n  const colors = mySchema.enum('colors', ['red', 'green', 'blue']);\n  ```\n\n- 🐛 Split `where` clause in Postgres `.onConflictDoUpdate` method into `setWhere` and `targetWhere` clauses, to support both `where` cases in `on conflict ...` clause (#1628, #1302)\n- 🐛 Fix query generation for `where` clause in Postgres `.onConflictDoNothing` method, as it was placed in a wrong spot (#1628)"
  },
  {
    "path": "changelogs/drizzle-orm/0.30.7.md",
    "content": "## Bug fixes\n\n- Add mappings for `@vercel/postgres` package\n- Fix interval mapping for `neon` drivers - #1542"
  },
  {
    "path": "changelogs/drizzle-orm/0.30.8.md",
    "content": "- 🎉 Added custom schema support to enums in Postgres (fixes #669 via #2048):\n\n  ```ts\n  import { pgSchema } from 'drizzle-orm/pg-core';\n\n  const mySchema = pgSchema('mySchema');\n  const colors = mySchema.enum('colors', ['red', 'green', 'blue']);\n  ```\n\n- 🎉 Changed D1 `migrate()` function to use batch API (#2137)\n- 🐛 Split `where` clause in Postgres `.onConflictDoUpdate` method into `setWhere` and `targetWhere` clauses, to support both `where` cases in `on conflict ...` clause (fixes #1628, #1302 via #2056)\n- 🐛 Fixed query generation for `where` clause in Postgres `.onConflictDoNothing` method, as it was placed in a wrong spot (fixes #1628 via #2056)\n- 🐛 Fixed multiple issues with AWS Data API driver (fixes #1931, #1932, #1934, #1936 via #2119)\n- 🐛 Fix inserting and updating array values in AWS Data API (fixes #1912 via #1911)\n\nThanks @hugo082 and @livingforjesus!\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.30.9.md",
    "content": "- 🐛 Fixed migrator in AWS Data API\n- Added `setWhere` and `targetWhere` fields to `.onConflictDoUpdate()` config in SQLite instead of single `where` field\n- 🛠️ Added schema information to Drizzle instances via `db._.fullSchema`\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.31.0-beta.md",
    "content": "## Breaking changes\n\n### PostgreSQL indexes API was changed\n\nThe previous Drizzle+PostgreSQL indexes API was incorrect and was not aligned with the PostgreSQL documentation. The good thing is that it was not used in queries, and drizzle-kit didn't support all properties for indexes. This means we can now change the API to the correct one and provide full support for it in drizzle-kit\n\nPrevious API\n\n- No way to define SQL expressions inside `.on`.\n- `.using` and `.on` in our case are the same thing, so the API is incorrect here.\n- `.asc()`, `.desc()`, `.nullsFirst()`, and `.nullsLast()` should be specified for each column or expression on indexes, but not on an index itself.\n\n```ts\n// Index declaration reference\nindex('name')\n  .on(table.column1, table.column2, ...) or .onOnly(table.column1, table.column2, ...)\n  .concurrently()\n  .using(sql``) // sql expression\n  .asc() or .desc()\n  .nullsFirst() or .nullsLast()\n  .where(sql``) // sql expression\n```\n\nCurrent API\n\n```ts\n// First example, with `.on()`\nindex('name')\n  .on(table.column1.asc(), table.column2.nullsFirst(), ...) or .onOnly(table.column1.desc().nullsLast(), table.column2, ...)\n  .concurrently()\n  .where(sql``)\n  .with({ fillfactor: '70' })\n\n// Second Example, with `.using()`\nindex('name')\n  .using('btree', table.column1.asc(), sql`lower(${table.column2})`, table.column1.op('text_ops'))\n  .where(sql``) // sql expression\n  .with({ fillfactor: '70' })\n```\n\n## New Features\n\n### 🎉 \"pg_vector\" extension support\n\n> There is no specific code to create an extension inside the Drizzle schema. We assume that if you are using vector types, indexes, and queries, you have a PostgreSQL database with the `pg_vector` extension installed.\n\nYou can now specify indexes for `pg_vector` and utilize `pg_vector` functions for querying, ordering, etc.\n\nLet's take a few examples of `pg_vector` indexes from the `pg_vector` docs and translate them to Drizzle\n\n#### L2 distance, Inner product and Cosine distance\n\n```ts\n// CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);\n// CREATE INDEX ON items USING hnsw (embedding vector_ip_ops);\n// CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops);\n\nconst table = pgTable('items', {\n    embedding: vector('embedding', { dimensions: 3 })\n}, (table) => ({\n    l2: index('l2_index').using('hnsw', table.embedding.op('vector_l2_ops'))\n    ip: index('ip_index').using('hnsw', table.embedding.op('vector_ip_ops'))\n    cosine: index('cosine_index').using('hnsw', table.embedding.op('vector_cosine_ops'))\n}))\n```\n\n#### L1 distance, Hamming distance and Jaccard distance - added in pg_vector 0.7.0 version\n\n```ts\n// CREATE INDEX ON items USING hnsw (embedding vector_l1_ops);\n// CREATE INDEX ON items USING hnsw (embedding bit_hamming_ops);\n// CREATE INDEX ON items USING hnsw (embedding bit_jaccard_ops);\n\nconst table = pgTable('table', {\n    embedding: vector('embedding', { dimensions: 3 })\n}, (table) => ({\n    l1: index('l1_index').using('hnsw', table.embedding.op('vector_l1_ops'))\n    hamming: index('hamming_index').using('hnsw', table.embedding.op('bit_hamming_ops'))\n    bit: index('bit_jaccard_index').using('hnsw', table.embedding.op('bit_jaccard_ops'))\n}))\n```\n\nFor queries, you can use predefined functions for vectors or create custom ones using the SQL template operator.\n\nYou can also use the following helpers:\n\n```ts\nimport { l2Distance, l1Distance, innerProduct, \n          cosineDistance, hammingDistance, jaccardDistance } from 'drizzle-orm'\n\nl2Distance(table.column, [3, 1, 2]) // table.column <-> '[3, 1, 2]'\nl1Distance(table.column, [3, 1, 2]) // table.column <+> '[3, 1, 2]'\n\ninnerProduct(table.column, [3, 1, 2]) // table.column <#> '[3, 1, 2]'\ncosineDistance(table.column, [3, 1, 2]) // table.column <=> '[3, 1, 2]'\n\nhammingDistance(table.column, '101') // table.column <~> '101'\njaccardDistance(table.column, '101') // table.column <%> '101'\n```\n\nIf `pg_vector` has some other functions to use, you can replicate implimentation from existing one we have. Here is how it can be done\n\n```ts\nexport function l2Distance(\n  column: SQLWrapper | AnyColumn,\n  value: number[] | string[] | TypedQueryBuilder<any> | string,\n): SQL {\n  if (is(value, TypedQueryBuilder<any>) || typeof value === 'string') {\n    return sql`${column} <-> ${value}`;\n  }\n  return sql`${column} <-> ${JSON.stringify(value)}`;\n}\n```\n\nName it as you wish and change the operator. This example allows for a numbers array, strings array, string, or even a select query. Feel free to create any other type you want or even contribute and submit a PR\n\n#### Examples\n\nLet's take a few examples of `pg_vector` queries from the `pg_vector` docs and translate them to Drizzle\n\n```ts\nimport { l2Distance } from 'drizzle-orm';\n\n// SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;\ndb.select().from(items).orderBy(l2Distance(items.embedding, [3,1,2]))\n\n// SELECT embedding <-> '[3,1,2]' AS distance FROM items;\ndb.select({ distance: l2Distance(items.embedding, [3,1,2]) })\n\n// SELECT * FROM items ORDER BY embedding <-> (SELECT embedding FROM items WHERE id = 1) LIMIT 5;\nconst subquery = db.select({ embedding: items.embedding }).from(items).where(eq(items.id, 1));\ndb.select().from(items).orderBy(l2Distance(items.embedding, subquery)).limit(5)\n\n// SELECT (embedding <#> '[3,1,2]') * -1 AS inner_product FROM items;\ndb.select({ innerProduct: sql`(${maxInnerProduct(items.embedding, [3,1,2])}) * -1` }).from(items)\n\n// and more!\n```\n\n- 🛠️ Fixed RQB behavior for tables with same names in different schemas\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.31.0.md",
    "content": "## Breaking changes\n\n> Note: `drizzle-orm@0.31.0` can be used with `drizzle-kit@0.22.0` or higher. The same applies to Drizzle Kit. If you run a Drizzle Kit command, it will check and prompt you for an upgrade (if needed). You can check for Drizzle Kit updates. [below](#drizzle-kit-updates-drizzle-kit0220)\n\n### PostgreSQL indexes API was changed\n\nThe previous Drizzle+PostgreSQL indexes API was incorrect and was not aligned with the PostgreSQL documentation. The good thing is that it was not used in queries, and drizzle-kit didn't support all properties for indexes. This means we can now change the API to the correct one and provide full support for it in drizzle-kit\n\nPrevious API\n\n- No way to define SQL expressions inside `.on`.\n- `.using` and `.on` in our case are the same thing, so the API is incorrect here.\n- `.asc()`, `.desc()`, `.nullsFirst()`, and `.nullsLast()` should be specified for each column or expression on indexes, but not on an index itself.\n\n```ts\n// Index declaration reference\nindex('name')\n  .on(table.column1, table.column2, ...) or .onOnly(table.column1, table.column2, ...)\n  .concurrently()\n  .using(sql``) // sql expression\n  .asc() or .desc()\n  .nullsFirst() or .nullsLast()\n  .where(sql``) // sql expression\n```\n\nCurrent API\n\n```ts\n// First example, with `.on()`\nindex('name')\n  .on(table.column1.asc(), table.column2.nullsFirst(), ...) or .onOnly(table.column1.desc().nullsLast(), table.column2, ...)\n  .concurrently()\n  .where(sql``)\n  .with({ fillfactor: '70' })\n\n// Second Example, with `.using()`\nindex('name')\n  .using('btree', table.column1.asc(), sql`lower(${table.column2})`, table.column1.op('text_ops'))\n  .where(sql``) // sql expression\n  .with({ fillfactor: '70' })\n```\n\n## New Features\n\n### 🎉 \"pg_vector\" extension support\n\n> There is no specific code to create an extension inside the Drizzle schema. We assume that if you are using vector types, indexes, and queries, you have a PostgreSQL database with the `pg_vector` extension installed.\n\nYou can now specify indexes for `pg_vector` and utilize `pg_vector` functions for querying, ordering, etc.\n\nLet's take a few examples of `pg_vector` indexes from the `pg_vector` docs and translate them to Drizzle\n\n#### L2 distance, Inner product and Cosine distance\n\n```ts\n// CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);\n// CREATE INDEX ON items USING hnsw (embedding vector_ip_ops);\n// CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops);\n\nconst table = pgTable('items', {\n    embedding: vector('embedding', { dimensions: 3 })\n}, (table) => ({\n    l2: index('l2_index').using('hnsw', table.embedding.op('vector_l2_ops'))\n    ip: index('ip_index').using('hnsw', table.embedding.op('vector_ip_ops'))\n    cosine: index('cosine_index').using('hnsw', table.embedding.op('vector_cosine_ops'))\n}))\n```\n\n#### L1 distance, Hamming distance and Jaccard distance - added in pg_vector 0.7.0 version\n\n```ts\n// CREATE INDEX ON items USING hnsw (embedding vector_l1_ops);\n// CREATE INDEX ON items USING hnsw (embedding bit_hamming_ops);\n// CREATE INDEX ON items USING hnsw (embedding bit_jaccard_ops);\n\nconst table = pgTable('table', {\n    embedding: vector('embedding', { dimensions: 3 })\n}, (table) => ({\n    l1: index('l1_index').using('hnsw', table.embedding.op('vector_l1_ops'))\n    hamming: index('hamming_index').using('hnsw', table.embedding.op('bit_hamming_ops'))\n    bit: index('bit_jaccard_index').using('hnsw', table.embedding.op('bit_jaccard_ops'))\n}))\n```\n\nFor queries, you can use predefined functions for vectors or create custom ones using the SQL template operator.\n\nYou can also use the following helpers:\n\n```ts\nimport { l2Distance, l1Distance, innerProduct, \n          cosineDistance, hammingDistance, jaccardDistance } from 'drizzle-orm'\n\nl2Distance(table.column, [3, 1, 2]) // table.column <-> '[3, 1, 2]'\nl1Distance(table.column, [3, 1, 2]) // table.column <+> '[3, 1, 2]'\n\ninnerProduct(table.column, [3, 1, 2]) // table.column <#> '[3, 1, 2]'\ncosineDistance(table.column, [3, 1, 2]) // table.column <=> '[3, 1, 2]'\n\nhammingDistance(table.column, '101') // table.column <~> '101'\njaccardDistance(table.column, '101') // table.column <%> '101'\n```\n\nIf `pg_vector` has some other functions to use, you can replicate implimentation from existing one we have. Here is how it can be done\n\n```ts\nexport function l2Distance(\n  column: SQLWrapper | AnyColumn,\n  value: number[] | string[] | TypedQueryBuilder<any> | string,\n): SQL {\n  if (is(value, TypedQueryBuilder<any>) || typeof value === 'string') {\n    return sql`${column} <-> ${value}`;\n  }\n  return sql`${column} <-> ${JSON.stringify(value)}`;\n}\n```\n\nName it as you wish and change the operator. This example allows for a numbers array, strings array, string, or even a select query. Feel free to create any other type you want or even contribute and submit a PR\n\n#### Examples\n\nLet's take a few examples of `pg_vector` queries from the `pg_vector` docs and translate them to Drizzle\n\n```ts\nimport { l2Distance } from 'drizzle-orm';\n\n// SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;\ndb.select().from(items).orderBy(l2Distance(items.embedding, [3,1,2]))\n\n// SELECT embedding <-> '[3,1,2]' AS distance FROM items;\ndb.select({ distance: l2Distance(items.embedding, [3,1,2]) })\n\n// SELECT * FROM items ORDER BY embedding <-> (SELECT embedding FROM items WHERE id = 1) LIMIT 5;\nconst subquery = db.select({ embedding: items.embedding }).from(items).where(eq(items.id, 1));\ndb.select().from(items).orderBy(l2Distance(items.embedding, subquery)).limit(5)\n\n// SELECT (embedding <#> '[3,1,2]') * -1 AS inner_product FROM items;\ndb.select({ innerProduct: sql`(${maxInnerProduct(items.embedding, [3,1,2])}) * -1` }).from(items)\n\n// and more!\n```\n\n## 🎉 New PostgreSQL types: `point`, `line`\n\nYou can now use `point` and `line` from [PostgreSQL Geometric Types](https://www.postgresql.org/docs/current/datatype-geometric.html)\n\nType `point` has 2 modes for mappings from the database: `tuple` and `xy`.\n\n- `tuple` will be accepted for insert and mapped on select to a tuple. So, the database Point(1,2) will be typed as [1,2] with drizzle.\n\n- `xy` will be accepted for insert and mapped on select to an object with x, y coordinates. So, the database Point(1,2) will be typed as `{ x: 1, y: 2 }` with drizzle\n\n```ts\nconst items = pgTable('items', {\n point: point('point'),\n pointObj: point('point_xy', { mode: 'xy' }),\n});\n```\n\nType `line` has 2 modes for mappings from the database: `tuple` and `abc`.\n\n- `tuple` will be accepted for insert and mapped on select to a tuple. So, the database Line{1,2,3} will be typed as [1,2,3] with drizzle.\n\n- `abc` will be accepted for insert and mapped on select to an object with a, b, and c constants from the equation `Ax + By + C = 0`. So, the database Line{1,2,3} will be typed as `{ a: 1, b: 2, c: 3 }` with drizzle.\n\n```ts\nconst items = pgTable('items', {\n line: line('line'),\n lineObj: point('line_abc', { mode: 'abc' }),\n});\n```\n\n## 🎉 Basic \"postgis\" extension support\n\n> There is no specific code to create an extension inside the Drizzle schema. We assume that if you are using postgis types, indexes, and queries, you have a PostgreSQL database with the `postgis` extension installed.\n\n`geometry` type from postgis extension:\n\n```ts\nconst items = pgTable('items', {\n  geo: geometry('geo', { type: 'point' }),\n  geoObj: geometry('geo_obj', { type: 'point', mode: 'xy' }),\n  geoSrid: geometry('geo_options', { type: 'point', mode: 'xy', srid: 4000 }),\n});\n```\n\n**mode**\nType `geometry` has 2 modes for mappings from the database: `tuple` and `xy`.\n\n- `tuple` will be accepted for insert and mapped on select to a tuple. So, the database geometry will be typed as [1,2] with drizzle.\n- `xy` will be accepted for insert and mapped on select to an object with x, y coordinates. So, the database geometry will be typed as `{ x: 1, y: 2 }` with drizzle\n\n**type**\n\nThe current release has a predefined type: `point`, which is the `geometry(Point)` type in the PostgreSQL PostGIS extension. You can specify any string there if you want to use some other type\n\n# Drizzle Kit updates: `drizzle-kit@0.22.0`\n\n> Release notes here are partially duplicated from [drizzle-kit@0.22.0]()\n\n## New Features\n\n### 🎉 Support for new types\n\nDrizzle Kit can now handle:\n\n- `point` and `line` from PostgreSQL\n- `vector` from the PostgreSQL `pg_vector` extension\n- `geometry` from the PostgreSQL `PostGIS` extension\n\n### 🎉 New param in drizzle.config - `extensionsFilters`\n\nThe PostGIS extension creates a few internal tables in the `public` schema. This means that if you have a database with the PostGIS extension and use `push` or `introspect`, all those tables will be included in `diff` operations. In this case, you would need to specify `tablesFilter`, find all tables created by the extension, and list them in this parameter.\n\nWe have addressed this issue so that you won't need to take all these steps. Simply specify `extensionsFilters` with the name of the extension used, and Drizzle will skip all the necessary tables.\n\nCurrently, we only support the `postgis` option, but we plan to add more extensions if they create tables in the `public` schema.\n\nThe `postgis` option will skip the `geography_columns`, `geometry_columns`, and `spatial_ref_sys` tables\n```ts\nimport { defineConfig } from 'drizzle-kit'\n\nexport default defaultConfig({\n  dialect: \"postgresql\",\n  extensionsFilters: [\"postgis\"],\n})\n```\n\n## Improvements\n\n### Update zod schemas for database credentials and write tests to all the positive/negative cases\n\n- support full set of SSL params in kit config, provide types from node:tls connection\n\n```ts\nimport { defineConfig } from 'drizzle-kit'\n\nexport default defaultConfig({\n  dialect: \"postgresql\",\n  dbCredentials: {\n    ssl: true, //\"require\" | \"allow\" | \"prefer\" | \"verify-full\" | options from node:tls\n  }\n})\n```\n\n```ts\nimport { defineConfig } from 'drizzle-kit'\n\nexport default defaultConfig({\n  dialect: \"mysql\",\n  dbCredentials: {\n    ssl: \"\", // string | SslOptions (ssl options from mysql2 package)\n  }\n})\n```\n\n### Normilized SQLite urls for `libsql` and `better-sqlite3` drivers\n\nThose drivers have different file path patterns, and Drizzle Kit will accept both and create a proper file path format for each\n\n### Updated MySQL and SQLite index-as-expression behavior\n\nIn this release MySQL and SQLite will properly map expressions into SQL query. Expressions won't be escaped in string but columns will be\n\n```ts\nexport const users = sqliteTable(\n  'users',\n  {\n    id: integer('id').primaryKey(),\n    email: text('email').notNull(),\n  },\n  (table) => ({\n    emailUniqueIndex: uniqueIndex('emailUniqueIndex').on(sql`lower(${table.email})`),\n  }),\n);\n\n```\n```sql\n-- before\nCREATE UNIQUE INDEX `emailUniqueIndex` ON `users` (`lower(\"users\".\"email\")`);\n\n-- now\nCREATE UNIQUE INDEX `emailUniqueIndex` ON `users` (lower(\"email\"));\n```\n\n## Bug Fixes\n\n- [BUG]: multiple constraints not added (only the first one is generated) - [#2341](https://github.com/drizzle-team/drizzle-orm/issues/2341) \n- Drizzle Studio: Error: Connection terminated unexpectedly - [#435](https://github.com/drizzle-team/drizzle-kit-mirror/issues/435)\n- Unable to run sqlite migrations local - [#432](https://github.com/drizzle-team/drizzle-kit-mirror/issues/432)\n- error: unknown option '--config' - [#423](https://github.com/drizzle-team/drizzle-kit-mirror/issues/423)\n\n\n## How `push` and `generate` works for indexes\n\n### Limitations\n\n#### You should specify a name for your index manually if you have an index on at least one expression\n\nExample\n\n```ts\nindex().on(table.id, table.email) // will work well and name will be autogeneretaed\nindex('my_name').on(table.id, table.email) // will work well\n\n// but\n\nindex().on(sql`lower(${table.email})`) // error\nindex('my_name').on(sql`lower(${table.email})`) // will work well\n```\n\n#### Push won't generate statements if these fields(list below) were changed in an existing index:\n\n- expressions inside `.on()` and `.using()`\n- `.where()` statements\n- operator classes `.op()` on columns\n\nIf you are using `push` workflows and want to change these fields in the index, you would need to:\n\n- Comment out the index\n- Push\n- Uncomment the index and change those fields\n- Push again\n\nFor the `generate` command, `drizzle-kit` will be triggered by any changes in the index for any property in the new drizzle indexes API, so there are no limitations here.\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.31.1.md",
    "content": "# New Features\n\n## Live Queries 🎉\n\nAs of `v0.31.1` Drizzle ORM now has native support for Expo SQLite Live Queries!\nWe've implemented a native `useLiveQuery` React Hook which observes necessary database changes and automatically re-runs database queries. It works with both SQL-like and Drizzle Queries:\n\n```tsx\nimport { useLiveQuery, drizzle } from 'drizzle-orm/expo-sqlite';\nimport { openDatabaseSync } from 'expo-sqlite/next';\nimport { users } from './schema';\nimport { Text } from 'react-native';\n\nconst expo = openDatabaseSync('db.db');\nconst db = drizzle(expo);\n\nconst App = () => {\n  // Re-renders automatically when data changes\n  const { data } = useLiveQuery(db.select().from(users));\n\n  // const { data, error, updatedAt } = useLiveQuery(db.query.users.findFirst());\n  // const { data, error, updatedAt } = useLiveQuery(db.query.users.findMany());\n\n\n  return <Text>{JSON.stringify(data)}</Text>;\n};\n\nexport default App;\n```\n\nWe've intentionally not changed the API of ORM itself to stay with conventional React Hook API, so we have `useLiveQuery(databaseQuery)` as opposed to `db.select().from(users).useLive()` or `db.query.users.useFindMany()`\n\nWe've also decided to provide `data`, `error` and `updatedAt` fields as a result of hook for concise explicit error handling following practices of `React Query` and `Electric SQL`"
  },
  {
    "path": "changelogs/drizzle-orm/0.31.2.md",
    "content": "- 🎉 Added support for TiDB Cloud Serverless driver:\n\n  ```ts\n  import { connect } from '@tidbcloud/serverless';\n  import { drizzle } from 'drizzle-orm/tidb-serverless';\n\n  const client = connect({ url: '...' });\n  const db = drizzle(client);\n  await db.select().from(...);\n  ```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.31.3.md",
    "content": "### Bug fixed\n\n- 🛠️ Fixed RQB behavior for tables with same names in different schemas\n- 🛠️ Fixed [BUG]: Mismatched type hints when using RDS Data API - #2097\n\n### New Prisma-Drizzle extension  \n\n```ts\nimport { PrismaClient } from '@prisma/client';\nimport { drizzle } from 'drizzle-orm/prisma/pg';\nimport { User } from './drizzle';\n\nconst prisma = new PrismaClient().$extends(drizzle());\nconst users = await prisma.$drizzle.select().from(User);\n```\n\nFor more info, check docs: https://orm.drizzle.team/docs/prisma\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.31.4.md",
    "content": "- Mark prisma clients package as optional - thanks @Cherry"
  },
  {
    "path": "changelogs/drizzle-orm/0.32.0-beta.md",
    "content": "# Preview release for `drizzle-orm@0.32.0` and `drizzle-kit@0.23.0`\n\n> It's not mandatory to upgrade both packages, but if you want to use the new features in both queries and migrations, you will need to upgrade both packages\n\n## New Features\n\n### 🎉 PostgreSQL Sequences\n\nYou can now specify sequences in Postgres within any schema you need and define all the available properties\n\n##### **Example**\n\n```ts\nimport { pgSchema, pgSequence } from \"drizzle-orm/pg-core\";\n\n// No params specified\nexport const customSequence = pgSequence(\"name\");\n\n// Sequence with params\nexport const customSequence = pgSequence(\"name\", {\n      startWith: 100,\n      maxValue: 10000,\n      minValue: 100,\n      cycle: true,\n      cache: 10,\n      increment: 2\n});\n\n// Sequence in custom schema\nexport const customSchema = pgSchema('custom_schema');\n\nexport const customSequence = customSchema.sequence(\"name\");\n```\n\n### 🎉 PostgreSQL Identity Columns\n\n[Source](https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_serial): As mentioned, the `serial` type in Postgres is outdated and should be deprecated. Ideally, you should not use it. `Identity columns` are the recommended way to specify sequences in your schema, which is why we are introducing the `identity columns` feature\n\n##### **Example**\n\n```ts\nimport { pgTable, integer, text } from 'drizzle-orm/pg-core' \n\nexport const ingredients = pgTable(\"ingredients\", {\n  id: integer(\"id\").primaryKey().generatedAlwaysAsIdentity({ startWith: 1000 }),\n  name: text(\"name\").notNull(),\n  description: text(\"description\"),\n});\n```\n\nYou can specify all properties available for sequences in the `.generatedAlwaysAsIdentity()` function. Additionally, you can specify custom names for these sequences\n\nPostgreSQL docs [reference](https://www.postgresql.org/docs/current/sql-createtable.html#SQL-CREATETABLE-PARMS-GENERATED-IDENTITY).\n\n### 🎉 PostgreSQL Generated Columns\n\nYou can now specify generated columns on any column supported by PostgreSQL to use with generated columns\n\n##### **Example** with generated column for `tsvector`\n\n> Note: we will add `tsVector` column type before latest release\n\n```ts\nimport { SQL, sql } from \"drizzle-orm\";\nimport { customType, index, integer, pgTable, text } from \"drizzle-orm/pg-core\";\n\nconst tsVector = customType<{ data: string }>({\n  dataType() {\n    return \"tsvector\";\n  },\n});\n\nexport const test = pgTable(\n  \"test\",\n  {\n    id: integer(\"id\").primaryKey().generatedAlwaysAsIdentity(),\n    content: text(\"content\"),\n    contentSearch: tsVector(\"content_search\", {\n      dimensions: 3,\n    }).generatedAlwaysAs(\n      (): SQL => sql`to_tsvector('english', ${test.content})`\n    ),\n  },\n  (t) => ({\n    idx: index(\"idx_content_search\").using(\"gin\", t.contentSearch),\n  })\n);\n```\n\nIn case you don't need to reference any columns from your table, you can use just `sql` template or a `string`\n\n```ts\nexport const users = pgTable(\"users\", {\n  id: integer(\"id\"),\n  name: text(\"name\"),\n  generatedName: text(\"gen_name\").generatedAlwaysAs(sql`hello world!`),\n  generatedName1: text(\"gen_name1\").generatedAlwaysAs(\"hello world!\"),\n}),\n```\n\n### 🎉 MySQL Generated Columns\n\nYou can now specify generated columns on any column supported by MySQL to use with generated columns\n\nYou can specify both `stored` and `virtual` options, for more info you can check [MySQL docs](https://dev.mysql.com/doc/refman/8.4/en/create-table-generated-columns.html)\n\nAlso MySQL has a few limitation for such columns usage, which is described [here](https://dev.mysql.com/doc/refman/8.4/en/alter-table-generated-columns.html)\n\nDrizzle Kit will also have limitations for `push` command:\n\n1. You can't change the generated constraint expression and type using `push`. Drizzle-kit will ignore this change. To make it work, you would need to `drop the column`, `push`, and then `add a column with a new expression`. This was done due to the complex mapping from the database side, where the schema expression will be modified on the database side and, on introspection, we will get a different string. We can't be sure if you changed this expression or if it was changed and formatted by the database. As long as these are generated columns and `push` is mostly used for prototyping on a local database, it should be fast to `drop` and `create` generated columns. Since these columns are `generated`, all the data will be restored\n\n2. `generate` should have no limitations\n\n##### **Example**\n\n```ts\nexport const users = mysqlTable(\"users\", {\n  id: int(\"id\"),\n  id2: int(\"id2\"),\n  name: text(\"name\"),\n  generatedName: text(\"gen_name\").generatedAlwaysAs(\n    (): SQL => sql`${schema2.users.name} || 'hello'`,\n    { mode: \"stored\" }\n  ),\n  generatedName1: text(\"gen_name1\").generatedAlwaysAs(\n    (): SQL => sql`${schema2.users.name} || 'hello'`,\n    { mode: \"virtual\" }\n  ),\n}),\n```\n\nIn case you don't need to reference any columns from your table, you can use just `sql` template or a `string` in `.generatedAlwaysAs()`\n\n### 🎉 SQLite Generated Columns\n\nYou can now specify generated columns on any column supported by SQLite to use with generated columns\n\nYou can specify both `stored` and `virtual` options, for more info you can check [SQLite docs](https://www.sqlite.org/gencol.html)\n\nAlso SQLite has a few limitation for such columns usage, which is described [here](https://www.sqlite.org/gencol.html)\n\nDrizzle Kit will also have limitations for `push` and `generate` command:\n\n1. You can't change the generated constraint expression with the stored type in an existing table. You would need to delete this table and create it again. This is due to SQLite limitations for such actions. We will handle this case in future releases (it will involve the creation of a new table with data migration).\n\n2. You can't add a `stored` generated expression to an existing column for the same reason as above. However, you can add a `virtual` expression to an existing column.\n\n3. You can't change a `stored` generated expression in an existing column for the same reason as above. However, you can change a `virtual` expression.\n\n4. You can't change the generated constraint type from `virtual` to `stored` for the same reason as above. However, you can change from `stored` to `virtual`.\n\n## New Drizzle Kit features\n\n### 🎉 Migrations support for all the new orm features\n\nPostgreSQL sequences, identity columns and generated columns for all dialects\n\n### 🎉 New flag `--force` for `drizzle-kit push`\n\nYou can auto-accept all data-loss statements using the push command. It's only available in CLI parameters. Make sure you always use it if you are fine with running data-loss statements on your database\n\n### 🎉 New `migrations` flag `prefix`\n\nYou can now customize migration file prefixes to make the format suitable for your migration tools:\n\n- `index` is the default type and will result in `0001_name.sql` file names;\n- `supabase` and `timestamp` are equal and will result in `20240627123900_name.sql` file names;\n- `unix` will result in unix seconds prefixes `1719481298_name.sql` file names;\n- `none` will omit the prefix completely;\n\n\n##### **Example**: Supabase migrations format\n```ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  dialect: \"postgresql\",\n  migrations: {\n    prefix: 'supabase'\n  }\n});\n\n```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.32.0.md",
    "content": "# Release notes for `drizzle-orm@0.32.0` and `drizzle-kit@0.23.0`\n\n> It's not mandatory to upgrade both packages, but if you want to use the new features in both queries and migrations, you will need to upgrade both packages\n\n## New Features\n\n### 🎉 MySQL `$returningId()` function\n\nMySQL itself doesn't have native support for `RETURNING` after using `INSERT`. There is only one way to do it for `primary keys` with `autoincrement` (or `serial`) types, where you can access `insertId` and `affectedRows` fields. We've prepared an automatic way for you to handle such cases with Drizzle and automatically receive all inserted IDs as separate objects\n\n```ts\nimport { boolean, int, text, mysqlTable } from 'drizzle-orm/mysql-core';\n\nconst usersTable = mysqlTable('users', {\n  id: int('id').primaryKey(),\n  name: text('name').notNull(),\n  verified: boolean('verified').notNull().default(false),\n});\n\n\nconst result = await db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]).$returningId();\n//    ^? { id: number }[]\n```\n\nAlso with Drizzle, you can specify a `primary key` with `$default` function that will generate custom primary keys at runtime. We will also return those generated keys for you in the `$returningId()` call\n\n```ts\nimport { varchar, text, mysqlTable } from 'drizzle-orm/mysql-core';\nimport { createId } from '@paralleldrive/cuid2';\n\nconst usersTableDefFn = mysqlTable('users_default_fn', {\n  customId: varchar('id', { length: 256 }).primaryKey().$defaultFn(createId),\n  name: text('name').notNull(),\n});\n\n\nconst result = await db.insert(usersTableDefFn).values([{ name: 'John' }, { name: 'John1' }]).$returningId();\n//  ^? { customId: string }[]\n```\n\n> If there is no primary keys -> type will be `{}[]` for such queries\n\n### 🎉 PostgreSQL Sequences\n\nYou can now specify sequences in Postgres within any schema you need and define all the available properties\n\n##### **Example**\n\n```ts\nimport { pgSchema, pgSequence } from \"drizzle-orm/pg-core\";\n\n// No params specified\nexport const customSequence = pgSequence(\"name\");\n\n// Sequence with params\nexport const customSequence = pgSequence(\"name\", {\n      startWith: 100,\n      maxValue: 10000,\n      minValue: 100,\n      cycle: true,\n      cache: 10,\n      increment: 2\n});\n\n// Sequence in custom schema\nexport const customSchema = pgSchema('custom_schema');\n\nexport const customSequence = customSchema.sequence(\"name\");\n```\n\n### 🎉 PostgreSQL Identity Columns\n\n[Source](https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_serial): As mentioned, the `serial` type in Postgres is outdated and should be deprecated. Ideally, you should not use it. `Identity columns` are the recommended way to specify sequences in your schema, which is why we are introducing the `identity columns` feature\n\n##### **Example**\n\n```ts\nimport { pgTable, integer, text } from 'drizzle-orm/pg-core' \n\nexport const ingredients = pgTable(\"ingredients\", {\n  id: integer(\"id\").primaryKey().generatedAlwaysAsIdentity({ startWith: 1000 }),\n  name: text(\"name\").notNull(),\n  description: text(\"description\"),\n});\n```\n\nYou can specify all properties available for sequences in the `.generatedAlwaysAsIdentity()` function. Additionally, you can specify custom names for these sequences\n\nPostgreSQL docs [reference](https://www.postgresql.org/docs/current/sql-createtable.html#SQL-CREATETABLE-PARMS-GENERATED-IDENTITY).\n\n### 🎉 PostgreSQL Generated Columns\n\nYou can now specify generated columns on any column supported by PostgreSQL to use with generated columns\n\n##### **Example** with generated column for `tsvector`\n\n> Note: we will add `tsVector` column type before latest release\n\n```ts\nimport { SQL, sql } from \"drizzle-orm\";\nimport { customType, index, integer, pgTable, text } from \"drizzle-orm/pg-core\";\n\nconst tsVector = customType<{ data: string }>({\n  dataType() {\n    return \"tsvector\";\n  },\n});\n\nexport const test = pgTable(\n  \"test\",\n  {\n    id: integer(\"id\").primaryKey().generatedAlwaysAsIdentity(),\n    content: text(\"content\"),\n    contentSearch: tsVector(\"content_search\", {\n      dimensions: 3,\n    }).generatedAlwaysAs(\n      (): SQL => sql`to_tsvector('english', ${test.content})`\n    ),\n  },\n  (t) => ({\n    idx: index(\"idx_content_search\").using(\"gin\", t.contentSearch),\n  })\n);\n```\n\nIn case you don't need to reference any columns from your table, you can use just `sql` template or a `string`\n\n```ts\nexport const users = pgTable(\"users\", {\n  id: integer(\"id\"),\n  name: text(\"name\"),\n  generatedName: text(\"gen_name\").generatedAlwaysAs(sql`hello world!`),\n  generatedName1: text(\"gen_name1\").generatedAlwaysAs(\"hello world!\"),\n}),\n```\n\n### 🎉 MySQL Generated Columns\n\nYou can now specify generated columns on any column supported by MySQL to use with generated columns\n\nYou can specify both `stored` and `virtual` options, for more info you can check [MySQL docs](https://dev.mysql.com/doc/refman/8.4/en/create-table-generated-columns.html)\n\nAlso MySQL has a few limitation for such columns usage, which is described [here](https://dev.mysql.com/doc/refman/8.4/en/alter-table-generated-columns.html)\n\nDrizzle Kit will also have limitations for `push` command:\n\n1. You can't change the generated constraint expression and type using `push`. Drizzle-kit will ignore this change. To make it work, you would need to `drop the column`, `push`, and then `add a column with a new expression`. This was done due to the complex mapping from the database side, where the schema expression will be modified on the database side and, on introspection, we will get a different string. We can't be sure if you changed this expression or if it was changed and formatted by the database. As long as these are generated columns and `push` is mostly used for prototyping on a local database, it should be fast to `drop` and `create` generated columns. Since these columns are `generated`, all the data will be restored\n\n2. `generate` should have no limitations\n\n##### **Example**\n\n```ts\nexport const users = mysqlTable(\"users\", {\n  id: int(\"id\"),\n  id2: int(\"id2\"),\n  name: text(\"name\"),\n  generatedName: text(\"gen_name\").generatedAlwaysAs(\n    (): SQL => sql`${schema2.users.name} || 'hello'`,\n    { mode: \"stored\" }\n  ),\n  generatedName1: text(\"gen_name1\").generatedAlwaysAs(\n    (): SQL => sql`${schema2.users.name} || 'hello'`,\n    { mode: \"virtual\" }\n  ),\n}),\n```\n\nIn case you don't need to reference any columns from your table, you can use just `sql` template or a `string` in `.generatedAlwaysAs()`\n\n### 🎉 SQLite Generated Columns\n\nYou can now specify generated columns on any column supported by SQLite to use with generated columns\n\nYou can specify both `stored` and `virtual` options, for more info you can check [SQLite docs](https://www.sqlite.org/gencol.html)\n\nAlso SQLite has a few limitation for such columns usage, which is described [here](https://www.sqlite.org/gencol.html)\n\nDrizzle Kit will also have limitations for `push` and `generate` command:\n\n1. You can't change the generated constraint expression with the stored type in an existing table. You would need to delete this table and create it again. This is due to SQLite limitations for such actions. We will handle this case in future releases (it will involve the creation of a new table with data migration).\n\n2. You can't add a `stored` generated expression to an existing column for the same reason as above. However, you can add a `virtual` expression to an existing column.\n\n3. You can't change a `stored` generated expression in an existing column for the same reason as above. However, you can change a `virtual` expression.\n\n4. You can't change the generated constraint type from `virtual` to `stored` for the same reason as above. However, you can change from `stored` to `virtual`.\n\n## New Drizzle Kit features\n\n### 🎉 Migrations support for all the new orm features\n\nPostgreSQL sequences, identity columns and generated columns for all dialects\n\n### 🎉 New flag `--force` for `drizzle-kit push`\n\nYou can auto-accept all data-loss statements using the push command. It's only available in CLI parameters. Make sure you always use it if you are fine with running data-loss statements on your database\n\n### 🎉 New `migrations` flag `prefix`\n\nYou can now customize migration file prefixes to make the format suitable for your migration tools:\n\n- `index` is the default type and will result in `0001_name.sql` file names;\n- `supabase` and `timestamp` are equal and will result in `20240627123900_name.sql` file names;\n- `unix` will result in unix seconds prefixes `1719481298_name.sql` file names;\n- `none` will omit the prefix completely;\n\n\n##### **Example**: Supabase migrations format\n```ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  dialect: \"postgresql\",\n  migrations: {\n    prefix: 'supabase'\n  }\n});\n\n```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.32.1.md",
    "content": "- Fix typings for indexes and allow creating indexes on 3+ columns mixing columns and expressions - thanks @lbguilherme!\n- Added support for \"limit 0\" in all dialects - closes [#2011](https://github.com/drizzle-team/drizzle-orm/issues/2011) - thanks @sillvva!\n- Make inArray and notInArray accept empty list, closes [#1295](https://github.com/drizzle-team/drizzle-orm/issues/1295) - thanks @RemiPeruto!\n- fix typo in lt typedoc - thanks @dalechyn!\n- fix wrong example in README.md - thanks @7flash!"
  },
  {
    "path": "changelogs/drizzle-orm/0.32.2.md",
    "content": "- Fix AWS Data API type hints bugs in RQB\n- Fix set transactions in MySQL bug - thanks @roguesherlock\n- Add forwaring dependencies within useLiveQuery, fixes [#2651](https://github.com/drizzle-team/drizzle-orm/issues/2651) - thanks @anstapol \n- Export additional types from SQLite package, like `AnySQLiteUpdate` - thanks @veloii"
  },
  {
    "path": "changelogs/drizzle-orm/0.33.0.md",
    "content": "## Breaking changes (for some of postgres.js users)\n\n#### Bugs fixed for this breaking change\n\n- [Open\n[BUG]: jsonb always inserted as a json string when using postgres-js](https://github.com/drizzle-team/drizzle-orm/issues/724)\n- [[BUG]: jsonb type on postgres implement incorrectly](https://github.com/drizzle-team/drizzle-orm/issues/1511)\n\n> As we are doing with other drivers, we've changed the behavior of PostgreSQL-JS to pass raw JSON values, the same as you see them in the database. So if you are using the PostgreSQL-JS driver and passing data to Drizzle elsewhere, please check the new behavior of the client after it is passed to Drizzle.\n\n> We will update it to ensure it does not override driver behaviors, but this will be done as a complex task for everything in Drizzle in other releases\n\nIf you were using `postgres-js` with `jsonb` fields, you might have seen stringified objects in your database, while drizzle insert and select operations were working as expected.\n\nYou need to convert those fields from strings to actual JSON objects. To do this, you can use the following query to update your database:\n\n**if you are using jsonb:**\n```sql\nupdate table_name\nset jsonb_column = (jsonb_column #>> '{}')::jsonb;\n```\n\n**if you are using json:**\n```sql\nupdate table_name\nset json_column = (json_column #>> '{}')::json;\n```\n\nWe've tested it in several cases, and it worked well, but only if all stringified objects are arrays or objects. If you have primitives like strings, numbers, booleans, etc., you can use this query to update all the fields\n\n**if you are using jsonb:**\n```sql\nUPDATE table_name\nSET jsonb_column = CASE\n    -- Convert to JSONB if it is a valid JSON object or array\n    WHEN jsonb_column #>> '{}' LIKE '{%' OR jsonb_column #>> '{}' LIKE '[%' THEN\n        (jsonb_column #>> '{}')::jsonb\n    ELSE\n        jsonb_column\nEND\nWHERE\n    jsonb_column IS NOT NULL;\n```\n\n**if you are using json:**\n```sql\nUPDATE table_name\nSET json_column = CASE\n    -- Convert to JSON if it is a valid JSON object or array\n    WHEN json_column #>> '{}' LIKE '{%' OR json_column #>> '{}' LIKE '[%' THEN\n        (json_column #>> '{}')::json\n    ELSE\n        json_column\nEND\nWHERE json_column IS NOT NULL;\n```\n\nIf nothing works for you and you are blocked, please reach out to me @AndriiSherman. I will try to help you!\n\n## Bug Fixes\n\n- [[BUG]: boolean mode not working with prepared statements (bettersqlite)](https://github.com/drizzle-team/drizzle-orm/issues/2568) - thanks @veloii\n- [[BUG]: isTable helper function is not working](https://github.com/drizzle-team/drizzle-orm/issues/2672) - thanks @hajek-raven\n- [[BUG]: Documentation is outdated on inArray and notInArray Methods](https://github.com/drizzle-team/drizzle-orm/issues/2690) - thanks @RemiPeruto"
  },
  {
    "path": "changelogs/drizzle-orm/0.34.0.md",
    "content": "## Breaking changes and migrate guide for Turso users\n\nIf you are using Turso and libsql, you will need to upgrade your `drizzle.config` and `@libsql/client` package.\n\n1. This version of drizzle-orm will only work with `@libsql/client@0.10.0` or higher if you are using the `migrate` function. For other use cases, you can continue using previous versions(But the suggestion is to upgrade)\nTo install the latest version, use the command:\n\n```bash\nnpm i @libsql/client@latest\n```\n\n2. Previously, we had a common `drizzle.config` for SQLite and Turso users, which allowed a shared strategy for both dialects. Starting with this release, we are introducing the turso dialect in drizzle-kit. We will evolve and improve Turso as a separate dialect with its own migration strategies.\n\n**Before**\n\n```ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  dialect: \"sqlite\",\n  schema: \"./schema.ts\",\n  out: \"./drizzle\",\n  dbCredentials: {\n    url: \"database.db\",\n  },\n  breakpoints: true,\n  verbose: true,\n  strict: true,\n});\n```\n\n**After**\n\n```ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  dialect: \"turso\",\n  schema: \"./schema.ts\",\n  out: \"./drizzle\",\n  dbCredentials: {\n    url: \"database.db\",\n  },\n  breakpoints: true,\n  verbose: true,\n  strict: true,\n});\n```\n\nIf you are using only SQLite, you can use `dialect: \"sqlite\"`\n\n## LibSQL/Turso and Sqlite migration updates\n\n### SQLite \"generate\" and \"push\" statements updates\n\nStarting from this release, we will no longer generate comments like this:\n\n```sql\n      '/*\\n SQLite does not support \"Changing existing column type\" out of the box, we do not generate automatic migration for that, so it has to be done manually'\n      + '\\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php'\n      + '\\n                  https://www.sqlite.org/lang_altertable.html'\n      + '\\n                  https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3'\n      + \"\\n\\n Due to that we don't generate migration automatically and it has to be done manually\"\n      + '\\n*/'\n```\n\nWe will generate a set of statements, and you can decide if it's appropriate to create data-moving statements instead. Here is an example of the SQL file you'll receive now:\n\n```sql\nPRAGMA foreign_keys=OFF;\n--> statement-breakpoint\nCREATE TABLE `__new_worker` (\n  `id` integer PRIMARY KEY NOT NULL,\n  `name` text NOT NULL,\n  `salary` text NOT NULL,\n  `job_id` integer,\n  FOREIGN KEY (`job_id`) REFERENCES `job`(`id`) ON UPDATE no action ON DELETE no action\n);\n--> statement-breakpoint\nINSERT INTO `__new_worker`(\"id\", \"name\", \"salary\", \"job_id\") SELECT \"id\", \"name\", \"salary\", \"job_id\" FROM `worker`;\n--> statement-breakpoint\nDROP TABLE `worker`;\n--> statement-breakpoint\nALTER TABLE `__new_worker` RENAME TO `worker`;\n--> statement-breakpoint\nPRAGMA foreign_keys=ON;\n```\n\n### LibSQL/Turso \"generate\" and \"push\" statements updates\n\nSince LibSQL supports more ALTER statements than SQLite, we can generate more statements without recreating your schema and moving all the data, which can be potentially dangerous for production environments.\n\nLibSQL and Turso will now have a separate dialect in the Drizzle config file, meaning that we will evolve Turso and LibSQL independently from SQLite and will aim to support as many features as Turso/LibSQL offer.\n\nWith the updated LibSQL migration strategy, you will have the ability to:\n\n- **Change Data Type**: Set a new data type for existing columns.\n- **Set and Drop Default Values**: Add or remove default values for existing columns.\n- **Set and Drop NOT NULL**: Add or remove the NOT NULL constraint on existing columns.\n- **Add References to Existing Columns**: Add foreign key references to existing columns\n\nYou can find more information in the [LibSQL documentation](https://github.com/tursodatabase/libsql/blob/main/libsql-sqlite3/doc/libsql_extensions.md#altering-columns)\n\n### LIMITATIONS\n\n- Dropping or altering an index will cause table recreation.\n\nThis is because LibSQL/Turso does not support dropping this type of index.\n\n```sql\nCREATE TABLE `users` (\n  `id` integer NOT NULL,\n  `name` integer,\n  `age` integer PRIMARY KEY NOT NULL\n  FOREIGN KEY (`name`) REFERENCES `users1`(\"id\") ON UPDATE no action ON DELETE no action\n);\n```\n\n- If the table has indexes, altering columns will cause table recreation.\n- Drizzle-Kit will drop the indexes, modify the columns, and then recreate the indexes.\n- Adding or dropping composite foreign keys is not supported and will cause table recreation\n\n### NOTES\n\n- You can create a reference on any column type, but if you want to insert values, the referenced column must have a unique index or primary key.\n\n```sql\nCREATE TABLE parent(a PRIMARY KEY, b UNIQUE, c, d, e, f);\nCREATE UNIQUE INDEX i1 ON parent(c, d);\nCREATE INDEX i2 ON parent(e);\nCREATE UNIQUE INDEX i3 ON parent(f COLLATE nocase);\n\nCREATE TABLE child1(f, g REFERENCES parent(a));                        -- Ok\nCREATE TABLE child2(h, i REFERENCES parent(b));                        -- Ok\nCREATE TABLE child3(j, k, FOREIGN KEY(j, k) REFERENCES parent(c, d));  -- Ok\nCREATE TABLE child4(l, m REFERENCES parent(e));                        -- Error!\nCREATE TABLE child5(n, o REFERENCES parent(f));                        -- Error!\nCREATE TABLE child6(p, q, FOREIGN KEY(p, q) REFERENCES parent(b, c));  -- Error!\nCREATE TABLE child7(r REFERENCES parent(c));                           -- Error!\n```\n\n> **NOTE**: The foreign key for the table child5 is an error because, although the parent key column has a unique index, the index uses a different collating sequence.\n\nSee more: https://www.sqlite.org/foreignkeys.html\n\n## A new and easy way to start using drizzle\n\nCurrent and the only way to do, is to define client yourself and pass it to drizzle\n\n```ts\nconst client = new Pool({ url: '' });\ndrizzle(client, { logger: true });\n```\n\nBut we want to introduce you to a new API, which is a simplified method in addition to the existing one.\n\nMost clients will have a few options to connect, starting with the easiest and most common one, and allowing you to control your client connection as needed.\n\nLet's use `node-postgres` as an example, but the same pattern can be applied to all other clients\n\n```ts\n// Finally, one import for all available clients and dialects!\nimport { drizzle } from 'drizzle-orm'\n\n// Choose a client and use a connection URL — nothing else is needed!\nconst db1 = await drizzle(\"node-postgres\", process.env.POSTGRES_URL);\n\n// If you need to pass a logger, schema, or other configurations, you can use an object and specify the client-specific URL in the connection\nconst db2 = await drizzle(\"node-postgres\", {\n  connection: process.env.POSTGRES_URL,\n  logger: true\n});\n\n// And finally, if you need to use full client/driver-specific types in connections, you can use a URL or host/port/etc. as an object inferred from the underlying client connection types\nconst db3 = await drizzle(\"node-postgres\", {\n  connection: {\n    connectionString: process.env.POSTGRES_URL,\n  },\n});\n\nconst db4 = await drizzle(\"node-postgres\", {\n  connection: {\n    user: process.env.DB_USER,\n    password: process.env.DB_PASSWORD,\n    host: process.env.DB_HOST,\n    port: process.env.DB_PORT,\n    database: process.env.DB_NAME,\n    ssl: true,\n  },\n});\n```\n\nA few clients will have a slightly different API due to their specific behavior. Let's take a look at them:\n\nFor `aws-data-api-pg`, Drizzle will require `resourceArn`, `database`, and `secretArn`, along with any other AWS Data API client types for the connection, such as credentials, region, etc.\n\n```ts\ndrizzle(\"aws-data-api-pg\", {\n  connection: {\n    resourceArn: \"\",\n    database: \"\",\n    secretArn: \"\",\n  },\n});\n```\n\nFor `d1`, the CloudFlare Worker types as described in the [documentation](https://developers.cloudflare.com/d1/get-started/) here will be required.\n\n```ts\ndrizzle(\"d1\", {\n  connection: env.DB // CloudFlare Worker Types\n})\n```\n\nFor `vercel-postgres`, nothing is needed since Vercel automatically retrieves the `POSTGRES_URL` from the `.env` file. You can check this [documentation](https://vercel.com/docs/storage/vercel-postgres/quickstart) for more info\n\n```ts\ndrizzle(\"vercel-postgres\")\n```\n\n> Note that the first example with the client is still available and not deprecated. You can use it if you don't want to await the drizzle object. The new way of defining drizzle is designed to make it easier to import from one place and get autocomplete for all the available clients\n\n## Optional names for columns and callback in drizzle table\n\nWe believe that schema definition in Drizzle is extremely powerful and aims to be as close to SQL as possible while adding more helper functions for JS runtime values. \n\nHowever, there are a few areas that could be improved, which we addressed in this release. These include:\n\n- Unnecessary database column names when TypeScript keys are essentially just copies of them\n- A callback that provides all column types available for a specific table.\n\nLet's look at an example with PostgreSQL (this applies to all the dialects supported by Drizzle)\n\n**Previously**\n```ts\nimport { boolean, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\n  \nexport const ingredients = pgTable(\"ingredients\", {\n  id: uuid(\"id\").defaultRandom().primaryKey(),\n  name: text(\"name\").notNull(),\n  description: text(\"description\"),\n  inStock: boolean(\"in_stock\").default(true),\n});\n```\n\nThe previous table definition will still be valid in the new release, but it can be replaced with this instead\n\n```ts\nimport { pgTable } from \"drizzle-orm/pg-core\";\n\nexport const ingredients = pgTable(\"ingredients\", (t) => ({\n  id: t.uuid().defaultRandom().primaryKey(),\n  name: t.text().notNull(),\n  description: t.text(),\n  inStock: t.boolean(\"in_stock\").default(true),\n}));\n```\n\n## New `casing` param in `drizzle-orm` and `drizzle-kit`\n\nThere are more improvements you can make to your schema definition. The most common way to name your variables in a database and in TypeScript code is usually `snake_case` in the database and `camelCase` in the code. For this case, in Drizzle, you can now define a naming strategy in your database to help Drizzle map column keys automatically. Let's take a table from the previous example and make it work with the new casing API in Drizzle\n\nTable can now become:\n```ts\nimport { pgTable } from \"drizzle-orm/pg-core\";\n\nexport const ingredients = pgTable(\"ingredients\", (t) => ({\n  id: t.uuid().defaultRandom().primaryKey(),\n  name: t.text().notNull(),\n  description: t.text(),\n  inStock: t.boolean().default(true),\n}));\n```\nAs you can see, `inStock` doesn't have a database name alias, but by defining the casing configuration at the connection level, all queries will automatically map it to `snake_case`\n\n```ts\nconst db = await drizzle('node-postgres', { connection: '', casing: 'snake_case' })\n```\n\nFor `drizzle-kit` migrations generation you should also specify `casing` param in drizzle config, so you can be sure you casing strategy will be applied to drizzle-kit as well\n\n```ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  dialect: \"postgresql\",\n  schema: \"./schema.ts\",\n  dbCredentials: {\n    url: \"postgresql://postgres:password@localhost:5432/db\",\n  },\n  casing: \"snake_case\",\n});\n```\n\n## New \"count\" API\n\nBefore this release to count entities in a table, you would need to do this:\n\n```ts\nconst res = await db.select({ count: sql`count(*)` }).from(users);\nconst count = res[0].count;\n```\n\nThe new API will look like this:\n\n```ts\n// how many users are in the database\nconst count: number = await db.$count(users);\n\n// how many users with the name \"Dan\" are in the database\nconst count: number = await db.$count(users, eq(name, \"Dan\"));\n```\n\nThis can also work as a subquery and within relational queries\n\n```ts\nconst users = await db.select({\n    ...users,\n    postsCount: db.$count(posts, eq(posts.authorId, users.id))\n});\n\nconst users = await db.query.users.findMany({\n    extras: {\n        postsCount: db.$count(posts, eq(posts.authorId, users.id))\n    }\n})\n```\n\n## Ability to execute raw strings instead of using SQL templates for raw queries\n\nPreviously, you would have needed to do this to execute a raw query with Drizzle\n\n```ts\nimport { sql } from 'drizzle-orm'\n\ndb.execute(sql`select * from ${users}`);\n// or\ndb.execute(sql.raw(`select * from ${users}`));\n```\n\nYou can now do this as well\n\n```ts\ndb.execute('select * from users')\n```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.34.1.md",
    "content": "- Fixed dynamic imports for CJS and MJS in the `/connect` module"
  },
  {
    "path": "changelogs/drizzle-orm/0.35.0.md",
    "content": "# Important change after 0.34.0 release\n\n## Updated the init Drizzle database API\n\nThe API from version 0.34.0 turned out to be unusable and needs to be changed. You can read more about our decisions in [this discussion](https://github.com/drizzle-team/drizzle-orm/discussions/3097)\n\nIf you still want to use the new API introduced in 0.34.0, which can create driver clients for you under the hood, you can now do so\n```ts\nimport { drizzle } from \"drizzle-orm/node-postgres\";\n\nconst db = drizzle(process.env.DATABASE_URL);\n// or\nconst db = drizzle({\n  connection: process.env.DATABASE_URL\n});\nconst db = drizzle({\n  connection: {\n    user: \"...\",\n    password: \"...\",\n    host: \"...\",\n    port: 4321,\n    db: \"...\",\n  },\n});\n\n// if you need to pass logger or schema\nconst db = drizzle({\n  connection: process.env.DATABASE_URL,\n  logger: true,\n  schema: schema,\n});\n```\n\nin order to not introduce breaking change - we will still leave support for deprecated API until V1 release. \nIt will degrade autocomplete performance in connection params due to `DatabaseDriver` | `ConnectionParams` types collision, \nbut that's a decent compromise against breaking changes\n\n```ts\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport { Pool } from \"pg\";\n\nconst client = new Pool({ connectionString: process.env.DATABASE_URL });\nconst db = drizzle(client); // deprecated but available\n\n// new version\nconst db = drizzle({\n  client: client,\n});\n```\n\n# New Features\n\n## New .orderBy() and .limit() functions in update and delete statements SQLite and MySQL\n\nYou now have more options for the `update` and `delete` query builders in MySQL and SQLite\n\n**Example**\n\n```ts\nawait db.update(usersTable).set({ verified: true }).limit(2).orderBy(asc(usersTable.name));\n\nawait db.delete(usersTable).where(eq(usersTable.verified, false)).limit(1).orderBy(asc(usersTable.name));\n```\n\n## New `drizzle.mock()` function\n\nThere were cases where you didn't need to provide a driver to the Drizzle object, and this served as a workaround\n```ts\nconst db = drizzle({} as any)\n```\n\nNow you can do this using a mock function\n```ts\nconst db = drizzle.mock()\n```\n\nThere is no valid production use case for this, but we used it in situations where we needed to check types, etc., without making actual database calls or dealing with driver creation. If anyone was using it, please switch to using mocks now\n\n# Internal updates\n\n- Upgraded TS in codebase to the version 5.6.3\n\n# Bug fixes\n\n- [[BUG]: New $count API error with @neondatabase/serverless](https://github.com/drizzle-team/drizzle-orm/issues/3081)"
  },
  {
    "path": "changelogs/drizzle-orm/0.35.1.md",
    "content": "- Updated internal versions for the drizzle-kit and drizzle-orm packages. Changes were introduced in the last minor release, and you are required to upgrade both packages to ensure they work as expected"
  },
  {
    "path": "changelogs/drizzle-orm/0.35.2.md",
    "content": "- Fix issues with importing in several environments after updating the Drizzle driver implementation\n\nWe've added approximately 240 tests to check the ESM and CJS builds for all the drivers we have. You can check them [here](https://github.com/drizzle-team/drizzle-orm/tree/main/integration-tests/js-tests/driver-init)\n\n- Fixed [[BUG]: Type Error in PgTransaction Missing $client Property After Upgrading to drizzle-orm@0.35.1](https://github.com/drizzle-team/drizzle-orm/issues/3140)\n- Fixed [[BUG]: New critical Build error drizzle 0.35.0 deploying on Cloudflare ](https://github.com/drizzle-team/drizzle-orm/issues/3137)"
  },
  {
    "path": "changelogs/drizzle-orm/0.35.3.md",
    "content": "# New LibSQL driver modules\n\nDrizzle now has native support for all `@libsql/client` driver variations:\n\n1. `@libsql/client` - defaults to node import, automatically changes to web if target or platform is set for bundler, e.g. `esbuild --platform=browser`\n\n```ts\nimport { drizzle } from 'drizzle-orm/libsql';\n\nconst db = drizzle({ connection: {\n  url: process.env.DATABASE_URL, \n  authToken: process.env.DATABASE_AUTH_TOKEN \n}});\n```\n\n2. `@libsql/client/node`  node compatible module, supports :memory:, file, wss, http and turso connection protocols\n\n```ts\nimport { drizzle } from 'drizzle-orm/libsql/node';\n\nconst db = drizzle({ connection: {\n  url: process.env.DATABASE_URL, \n  authToken: process.env.DATABASE_AUTH_TOKEN \n}});\n```\n\n3. `@libsql/client/web`  module for fullstack web frameworks like next, nuxt, astro, etc.\n\n```ts\nimport { drizzle } from 'drizzle-orm/libsql/web';\n\nconst db = drizzle({ connection: {\n  url: process.env.DATABASE_URL, \n  authToken: process.env.DATABASE_AUTH_TOKEN \n}});\n```\n\n4. `@libsql/client/http`  module for http and https connection protocols\n\n```ts\nimport { drizzle } from 'drizzle-orm/libsql/http';\n\nconst db = drizzle({ connection: {\n  url: process.env.DATABASE_URL, \n  authToken: process.env.DATABASE_AUTH_TOKEN \n}});\n```\n\n5. `@libsql/client/ws`  module for ws and wss connection protocols\n\n```ts\nimport { drizzle } from 'drizzle-orm/libsql/ws';\n\nconst db = drizzle({ connection: {\n  url: process.env.DATABASE_URL, \n  authToken: process.env.DATABASE_AUTH_TOKEN \n}});\n```\n\n6. `@libsql/client/sqlite3`  module for :memory: and file connection protocols\n\n```ts\nimport { drizzle } from 'drizzle-orm/libsql/wasm';\n\nconst db = drizzle({ connection: {\n  url: process.env.DATABASE_URL, \n  authToken: process.env.DATABASE_AUTH_TOKEN \n}});\n```\n\n7. `@libsql/client-wasm`  Separate experimental package for WASM\n\n```ts\nimport { drizzle } from 'drizzle-orm/libsql';\n\nconst db = drizzle({ connection: {\n  url: process.env.DATABASE_URL, \n  authToken: process.env.DATABASE_AUTH_TOKEN \n}});\n```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.36.0.md",
    "content": "> This version of `drizzle-orm` requires `drizzle-kit@0.27.0` to enable all new features\n\n# New Features\n\n## Row-Level Security (RLS)\n\nWith Drizzle, you can enable Row-Level Security (RLS) for any Postgres table, create policies with various options, and define and manage the roles those policies apply to.\n\nDrizzle supports a raw representation of Postgres policies and roles that can be used in any way you want. This works with popular Postgres database providers such as `Neon` and `Supabase`.\n\nIn Drizzle, we have specific predefined RLS roles and functions for RLS with both database providers, but you can also define your own logic.\n\n### Enable RLS\n\nIf you just want to enable RLS on a table without adding policies, you can use `.enableRLS()`\n\nAs mentioned in the PostgreSQL documentation:\n\n> If no policy exists for the table, a default-deny policy is used, meaning that no rows are visible or can be modified. \nOperations that apply to the whole table, such as TRUNCATE and REFERENCES, are not subject to row security.\n\n```ts\nimport { integer, pgTable } from 'drizzle-orm/pg-core';\n\nexport const users = pgTable('users', {\n\tid: integer(),\n}).enableRLS();\n```\n\n> If you add a policy to a table, RLS will be enabled automatically. So, there’s no need to explicitly enable RLS when adding policies to a table.\n\n### Roles\n\nCurrently, Drizzle supports defining roles with a few different options, as shown below. Support for more options will be added in a future release.\n\n```ts\nimport { pgRole } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin', { createRole: true, createDb: true, inherit: true });\n```\n\nIf a role already exists in your database, and you don’t want drizzle-kit to ‘see’ it or include it in migrations, you can mark the role as existing.\n\n```ts\nimport { pgRole } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin').existing();\n```\n\n### Policies\n\nTo fully leverage RLS, you can define policies within a Drizzle table.\n\n> In PostgreSQL, policies should be linked to an existing table. Since policies are always associated with a specific table, we decided that policy definitions should be defined as a parameter of `pgTable`\n\n**Example of pgPolicy with all available properties**\n```ts\nimport { sql } from 'drizzle-orm';\nimport { integer, pgPolicy, pgRole, pgTable } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin');\n\nexport const users = pgTable('users', {\n\tid: integer(),\n}, (t) => [\n\tpgPolicy('policy', {\n\t\tas: 'permissive',\n\t\tto: admin,\n\t\tfor: 'delete',\n\t\tusing: sql``,\n\t\twithCheck: sql``,\n\t}),\n]);\n```\n\n**Link Policy to an existing table**\n\nThere are situations where you need to link a policy to an existing table in your database. \nThe most common use case is with database providers like `Neon` or `Supabase`, where you need to add a policy \nto their existing tables. In this case, you can use the `.link()` API\n\n```ts\nimport { sql } from \"drizzle-orm\";\nimport { pgPolicy } from \"drizzle-orm/pg-core\";\nimport { authenticatedRole, realtimeMessages } from \"drizzle-orm/supabase\";\n\nexport const policy = pgPolicy(\"authenticated role insert policy\", {\n  for: \"insert\",\n  to: authenticatedRole,\n  using: sql``,\n}).link(realtimeMessages);\n```\n\n### Migrations\n\nIf you are using drizzle-kit to manage your schema and roles, there may be situations where you want to refer to roles that are not defined in your Drizzle schema. In such cases, you may want drizzle-kit to skip managing these roles without having to define each role in your drizzle schema and marking it with `.existing()`.\n\nIn these cases, you can use `entities.roles` in `drizzle.config.ts`. For a complete reference, refer to the the [`drizzle.config.ts`](https://orm.drizzle.team/docs/drizzle-config-file) documentation.\n\nBy default, `drizzle-kit` does not manage roles for you, so you will need to enable this feature in `drizzle.config.ts`.\n\n```ts {12-14}\n// drizzle.config.ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  dialect: 'postgresql',\n  schema: \"./drizzle/schema.ts\",\n  dbCredentials: {\n    url: process.env.DATABASE_URL!\n  },\n  verbose: true,\n  strict: true,\n  entities: {\n    roles: true\n  }\n});\n```\n\nIn case you need additional configuration options, let's take a look at a few more examples.\n\n**You have an `admin` role and want to exclude it from the list of manageable roles**\n\n```ts\n// drizzle.config.ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  ...\n  entities: {\n    roles: {\n      exclude: ['admin']\n    }\n  }\n});\n```\n\n**You have an `admin` role and want to include it in the list of manageable roles**\n\n```ts\n// drizzle.config.ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  ...\n  entities: {\n    roles: {\n      include: ['admin']\n    }\n  }\n});\n```\n\n**If you are using `Neon` and want to exclude Neon-defined roles, you can use the provider option**\n\n```ts\n// drizzle.config.ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  ...\n  entities: {\n    roles: {\n      provider: 'neon'\n    }\n  }\n});\n```\n\n**If you are using `Supabase` and want to exclude Supabase-defined roles, you can use the provider option**\n\n```ts\n// drizzle.config.ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  ...\n  entities: {\n    roles: {\n      provider: 'supabase'\n    }\n  }\n});\n```\n\n> You may encounter situations where Drizzle is slightly outdated compared to new roles specified by your database provider. \nIn such cases, you can use the `provider` option and `exclude` additional roles:\n\n```ts\n// drizzle.config.ts\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  ...\n  entities: {\n    roles: {\n      provider: 'supabase',\n      exclude: ['new_supabase_role']\n    }\n  }\n});\n```\n\n### RLS on views\n\nWith Drizzle, you can also specify RLS policies on views. For this, you need to use `security_invoker` in the view's WITH options. Here is a small example:\n\n```ts {5}\n...\n\nexport const roomsUsersProfiles = pgView(\"rooms_users_profiles\")\n  .with({\n    securityInvoker: true,\n  })\n  .as((qb) =>\n    qb\n      .select({\n        ...getTableColumns(roomsUsers),\n        email: profiles.email,\n      })\n      .from(roomsUsers)\n      .innerJoin(profiles, eq(roomsUsers.userId, profiles.id))\n  );\n```\n\n### Using with Neon\n\nThe Neon Team helped us implement their vision of a wrapper on top of our raw policies API. We defined a specific \n`/neon` import with the `crudPolicy` function that includes predefined functions and Neon's default roles.\n\nHere's an example of how to use the `crudPolicy` function:\n\n```ts\nimport { crudPolicy } from 'drizzle-orm/neon';\nimport { integer, pgRole, pgTable } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin');\n\nexport const users = pgTable('users', {\n\tid: integer(),\n}, (t) => [\n\tcrudPolicy({ role: admin, read: true, modify: false }),\n]);\n```\n\nThis policy is equivalent to:\n\n```ts\nimport { sql } from 'drizzle-orm';\nimport { integer, pgPolicy, pgRole, pgTable } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin');\n\nexport const users = pgTable('users', {\n\tid: integer(),\n}, (t) => [\n\tpgPolicy(`crud-${admin.name}-policy-insert`, {\n\t\tfor: 'insert',\n\t\tto: admin,\n\t\twithCheck: sql`false`,\n\t}),\n\tpgPolicy(`crud-${admin.name}-policy-update`, {\n\t\tfor: 'update',\n\t\tto: admin,\n\t\tusing: sql`false`,\n\t\twithCheck: sql`false`,\n\t}),\n\tpgPolicy(`crud-${admin.name}-policy-delete`, {\n\t\tfor: 'delete',\n\t\tto: admin,\n\t\tusing: sql`false`,\n\t}),\n\tpgPolicy(`crud-${admin.name}-policy-select`, {\n\t\tfor: 'select',\n\t\tto: admin,\n\t\tusing: sql`true`,\n\t}),\n]);\n```\n\n`Neon` exposes predefined `authenticated` and `anaonymous` roles and related functions. If you are using `Neon` for RLS, you can use these roles, which are marked as existing, and the related functions in your RLS queries.\n\n```ts\n// drizzle-orm/neon\nexport const authenticatedRole = pgRole('authenticated').existing();\nexport const anonymousRole = pgRole('anonymous').existing();\n\nexport const authUid = (userIdColumn: AnyPgColumn) => sql`(select auth.user_id() = ${userIdColumn})`;\n```\n\nFor example, you can use the `Neon` predefined roles and functions like this:\n\n\n```ts\nimport { sql } from 'drizzle-orm';\nimport { authenticatedRole } from 'drizzle-orm/neon';\nimport { integer, pgPolicy, pgRole, pgTable } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin');\n\nexport const users = pgTable('users', {\n\tid: integer(),\n}, (t) => [\n\tpgPolicy(`policy-insert`, {\n\t\tfor: 'insert',\n\t\tto: authenticatedRole,\n\t\twithCheck: sql`false`,\n\t}),\n]);\n```\n\n### Using with Supabase\n\nWe also have a `/supabase` import with a set of predefined roles marked as existing, which you can use in your schema. \nThis import will be extended in a future release with more functions and helpers to make using RLS and `Supabase` simpler.\n\n```ts\n// drizzle-orm/supabase\nexport const anonRole = pgRole('anon').existing();\nexport const authenticatedRole = pgRole('authenticated').existing();\nexport const serviceRole = pgRole('service_role').existing();\nexport const postgresRole = pgRole('postgres_role').existing();\nexport const supabaseAuthAdminRole = pgRole('supabase_auth_admin').existing();\n```\n\nFor example, you can use the `Supabase` predefined roles like this:\n\n```ts\nimport { sql } from 'drizzle-orm';\nimport { serviceRole } from 'drizzle-orm/supabase';\nimport { integer, pgPolicy, pgRole, pgTable } from 'drizzle-orm/pg-core';\n\nexport const admin = pgRole('admin');\n\nexport const users = pgTable('users', {\n\tid: integer(),\n}, (t) => [\n\tpgPolicy(`policy-insert`, {\n\t\tfor: 'insert',\n\t\tto: serviceRole,\n\t\twithCheck: sql`false`,\n\t}),\n]);\n```\n\nThe `/supabase` import also includes predefined tables and functions that you can use in your application\n\n```ts\n// drizzle-orm/supabase\n\nconst auth = pgSchema('auth');\nexport const authUsers = auth.table('users', {\n\tid: uuid().primaryKey().notNull(),\n});\n\nconst realtime = pgSchema('realtime');\nexport const realtimeMessages = realtime.table(\n\t'messages',\n\t{\n\t\tid: bigserial({ mode: 'bigint' }).primaryKey(),\n\t\ttopic: text().notNull(),\n\t\textension: text({\n\t\t\tenum: ['presence', 'broadcast', 'postgres_changes'],\n\t\t}).notNull(),\n\t},\n);\n\nexport const authUid = sql`(select auth.uid())`;\nexport const realtimeTopic = sql`realtime.topic()`;\n```\n\nThis allows you to use it in your code, and Drizzle Kit will treat them as existing databases,\nusing them only as information to connect to other entities\n\n```ts\nimport { foreignKey, pgPolicy, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { sql } from \"drizzle-orm/sql\";\nimport { authenticatedRole, authUsers } from \"drizzle-orm/supabase\";\n\nexport const profiles = pgTable(\n  \"profiles\",\n  {\n    id: uuid().primaryKey().notNull(),\n    email: text().notNull(),\n  },\n  (table) => [\n    foreignKey({\n      columns: [table.id],\n\t  // reference to the auth table from Supabase\n      foreignColumns: [authUsers.id],\n      name: \"profiles_id_fk\",\n    }).onDelete(\"cascade\"),\n    pgPolicy(\"authenticated can view all profiles\", {\n      for: \"select\",\n\t  // using predefined role from Supabase\n      to: authenticatedRole,\n      using: sql`true`,\n    }),\n  ]\n);\n```\n\nLet's check an example of adding a policy to a table that exists in `Supabase`\n\n```ts\nimport { sql } from \"drizzle-orm\";\nimport { pgPolicy } from \"drizzle-orm/pg-core\";\nimport { authenticatedRole, realtimeMessages } from \"drizzle-orm/supabase\";\n\nexport const policy = pgPolicy(\"authenticated role insert policy\", {\n  for: \"insert\",\n  to: authenticatedRole,\n  using: sql``,\n}).link(realtimeMessages);\n```\n\n# Bug fixes\n\n- [[BUG]: postgres-js driver throws error when using new { client } constructor arguments ](https://github.com/drizzle-team/drizzle-orm/issues/3176)"
  },
  {
    "path": "changelogs/drizzle-orm/0.36.1.md",
    "content": "# Bug Fixes\n\n- [[BUG]: Using sql.placeholder with limit and/or offset for a prepared statement produces TS error](https://github.com/drizzle-team/drizzle-orm/issues/2146) - thanks @L-Mario564\n- [[BUG] If a query I am trying to modify with a dynamic query (....$dynamic()) contains any placeholders, I'm getting an error that says No value for placeholder.... provided](https://github.com/drizzle-team/drizzle-orm/issues/2272) - thanks @L-Mario564\n- [[BUG]: Error thrown when trying to insert an array of new rows using generatedAlwaysAsIdentity() for the id column](https://github.com/drizzle-team/drizzle-orm/issues/2849) - thanks @L-Mario564\n- [[BUG]: Unable to Use BigInt Types with Bun and Drizzle](https://github.com/drizzle-team/drizzle-orm/issues/2603) - thanks @L-Mario564\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.36.2.md",
    "content": "# New Features\n\n- [Support more types in like, notLike, ilike and notIlike expressions](https://github.com/drizzle-team/drizzle-orm/pull/2805)\n\n\n# Bug and typo fixes\n\n- Fixed typos in repository: thanks @armandsalle, @masto, @wackbyte, @Asher-JH, @MaxLeiter\n\n- [Fixed .generated behavior with non-strict tsconfig](https://github.com/drizzle-team/drizzle-orm/pull/3542)\n- [Fix Drizzle ORM for expo-sqlite](https://github.com/drizzle-team/drizzle-orm/pull/3197)\n- [Fixed lack of schema name on columns in sql](https://github.com/drizzle-team/drizzle-orm/pull/3531)\n- [fix: Adjust neon http driver entity kind](https://github.com/drizzle-team/drizzle-orm/pull/3424)\n- [Export PgIntegerBuilderInitial type](https://github.com/drizzle-team/drizzle-orm/pull/2846)\n- [[MySQL] Correct $returningId() implementation to correctly store selected fields](https://github.com/drizzle-team/drizzle-orm/pull/2975)"
  },
  {
    "path": "changelogs/drizzle-orm/0.36.3.md",
    "content": "# New Features\n\n## Support for `UPDATE ... FROM` in PostgreSQL and SQLite\n\nAs the SQLite documentation mentions:\n\n> [!NOTE]\n> The UPDATE-FROM idea is an extension to SQL that allows an UPDATE statement to be driven by other tables in the database.\nThe \"target\" table is the specific table that is being updated. With UPDATE-FROM you can join the target table\nagainst other tables in the database in order to help compute which rows need updating and what\nthe new values should be on those rows\n\nSimilarly, the PostgreSQL documentation states:\n\n> [!NOTE]\n> A table expression allowing columns from other tables to appear in the WHERE condition and update expressions\n\nDrizzle also supports this feature starting from this version\n\nFor example, current query:\n\n```ts\nawait db\n  .update(users)\n  .set({ cityId: cities.id })\n  .from(cities)\n  .where(and(eq(cities.name, 'Seattle'), eq(users.name, 'John')))\n```\n\nWill generate this sql\n\n```sql\nupdate \"users\" set \"city_id\" = \"cities\".\"id\" \nfrom \"cities\" \nwhere (\"cities\".\"name\" = $1 and \"users\".\"name\" = $2)\n\n-- params: [ 'Seattle', 'John' ]\n```\n\nYou can also alias tables that are joined (in PG, you can also alias the updating table too).\n\n```ts\nconst c = alias(cities, 'c');\nawait db\n  .update(users)\n  .set({ cityId: c.id })\n  .from(c);\n```\n\nWill generate this sql\n\n```sql\nupdate \"users\" set \"city_id\" = \"c\".\"id\" \nfrom \"cities\" \"c\"\n```\n\nIn PostgreSQL, you can also return columns from the joined tables.\n\n```ts\nconst updatedUsers = await db\n  .update(users)\n  .set({ cityId: cities.id })\n  .from(cities)\n  .returning({ id: users.id, cityName: cities.name });\n```\n\nWill generate this sql\n\n```sql\nupdate \"users\" set \"city_id\" = \"cities\".\"id\" \nfrom \"cities\" \nreturning \"users\".\"id\", \"cities\".\"name\"\n```\n\n## Support for `INSERT INTO ... SELECT` in all dialects\n\nAs the SQLite documentation mentions:\n\n> [!NOTE]\n> The second form of the INSERT statement contains a SELECT statement instead of a VALUES clause.\nA new entry is inserted into the table for each row of data returned by executing the SELECT statement.\nIf a column-list is specified, the number of columns in the result of the SELECT must be the same as\nthe number of items in the column-list. Otherwise, if no column-list is specified, the number of\ncolumns in the result of the SELECT must be the same as the number of columns in the table.\nAny SELECT statement, including compound SELECTs and SELECT statements with ORDER BY and/or LIMIT clauses,\nmay be used in an INSERT statement of this form.\n\n> [!CAUTION]\n> To avoid a parsing ambiguity, the SELECT statement should always contain a WHERE clause, even if that clause is simply \"WHERE true\", if the upsert-clause is present. Without the WHERE clause, the parser does not know if the token \"ON\" is part of a join constraint on the SELECT, or the beginning of the upsert-clause.\n\nAs the PostgreSQL documentation mentions:\n> [!NOTE]\n> A query (SELECT statement) that supplies the rows to be inserted\n\nAnd as the MySQL documentation mentions:\n\n> [!NOTE]\n> With INSERT ... SELECT, you can quickly insert many rows into a table from the result of a SELECT statement, which can select from one or many tables\n\nDrizzle supports the current syntax for all dialects, and all of them share the same syntax. Let's review some common scenarios and API usage.\nThere are several ways to use select inside insert statements, allowing you to choose your preferred approach:\n\n- You can pass a query builder inside the select function.\n- You can use a query builder inside a callback.\n- You can pass an SQL template tag with any custom select query you want to use\n\n**Query Builder**\n\n```ts\nconst insertedEmployees = await db\n  .insert(employees)\n  .select(\n    db.select({ name: users.name }).from(users).where(eq(users.role, 'employee'))\n  )\n  .returning({\n    id: employees.id,\n    name: employees.name\n  });\n```\n\n```ts\nconst qb = new QueryBuilder();\nawait db.insert(employees).select(\n    qb.select({ name: users.name }).from(users).where(eq(users.role, 'employee'))\n);\n```\n\n**Callback**\n\n```ts\nawait db.insert(employees).select(\n    () => db.select({ name: users.name }).from(users).where(eq(users.role, 'employee'))\n);\n```\n\n```ts\nawait db.insert(employees).select(\n    (qb) => qb.select({ name: users.name }).from(users).where(eq(users.role, 'employee'))\n);\n```\n\n**SQL template tag**\n\n```ts\nawait db.insert(employees).select(\n    sql`select \"users\".\"name\" as \"name\" from \"users\" where \"users\".\"role\" = 'employee'`\n);\n```\n\n```ts\nawait db.insert(employees).select(\n    () => sql`select \"users\".\"name\" as \"name\" from \"users\" where \"users\".\"role\" = 'employee'`\n);\n```\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.36.4.md",
    "content": "# New Package: `drizzle-seed`\n\n> [!NOTE]\n> `drizzle-seed` can only be used with `drizzle-orm@0.36.4` or higher. Versions lower than this may work at runtime but could have type issues and identity column issues, as this patch was introduced in `drizzle-orm@0.36.4`\n\n## Full Reference\n\nThe full API reference and package overview can be found in our [official documentation](https://orm.drizzle.team/docs/seed-overview)\n\n## Basic Usage\n\nIn this example we will create 10 users with random names and ids\n\n```ts {12}\nimport { pgTable, integer, text } from \"drizzle-orm/pg-core\";\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport { seed } from \"drizzle-seed\";\n\nconst users = pgTable(\"users\", {\n  id: integer().primaryKey(),\n  name: text().notNull(),\n});\n\nasync function main() {\n  const db = drizzle(process.env.DATABASE_URL!);\n  await seed(db, { users });\n}\n\nmain();\n```\n\n## Options\n\n**`count`**\n\nBy default, the `seed` function will create 10 entities.\nHowever, if you need more for your tests, you can specify this in the seed options object\n\n```ts\nawait seed(db, schema, { count: 1000 });\n```\n\n**`seed`**\n\nIf you need a seed to generate a different set of values for all subsequent runs, you can define a different number\nin the `seed` option. Any new number will generate a unique set of values\n\n```ts\nawait seed(db, schema, { seed: 12345 });\n```\n\nThe full API reference and package overview can be found in our [official documentation](https://orm.drizzle.team/docs/seed-overview)\n\n# Features\n\n## Added `OVERRIDING SYSTEM VALUE` api to db.insert()\n\nIf you want to force you own values for `GENERATED ALWAYS AS IDENTITY` columns, you can use `OVERRIDING SYSTEM VALUE`\n\nAs PostgreSQL docs mentions\n> In an INSERT command, if ALWAYS is selected, a user-specified value is only accepted if the INSERT statement specifies OVERRIDING SYSTEM VALUE. If BY DEFAULT is selected, then the user-specified value takes precedence\n\n```ts\nawait db.insert(identityColumnsTable).overridingSystemValue().values([\n  { alwaysAsIdentity: 2 },\n]);\n```\n\n## Added `.$withAuth()` API for Neon HTTP driver\n\nUsing this API, Drizzle will send you an auth token to authorize your query. It can be used with any query available in Drizzle by simply adding `.$withAuth()` before it. This token will be used for a specific query\n\nExamples\n\n```ts\nconst token = 'HdncFj1Nm'\n\nawait db.$withAuth(token).select().from(usersTable);\nawait db.$withAuth(token).update(usersTable).set({ name: 'CHANGED' }).where(eq(usersTable.name, 'TARGET'))\n```\n\n# Bug Fixes\n\n- [[BUG]: TypeScript error Please install '@neondatabase/serverless' to allow Drizzle ORM to connect to the database](https://github.com/drizzle-team/drizzle-orm/issues/3521)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.37.0.md",
    "content": "# New Dialects\n\n### 🎉 `SingleStore` dialect is now available in Drizzle\n\nThanks to the SingleStore team for creating a PR with all the necessary changes to support the MySQL-compatible part of SingleStore. You can already start using it with Drizzle. The SingleStore team will also help us iterate through updates and make more SingleStore-specific features available in Drizzle\n\n```ts\nimport { int, singlestoreTable, varchar } from 'drizzle-orm/singlestore-core';\nimport { drizzle } from 'drizzle-orm/singlestore';\n\nexport const usersTable = singlestoreTable('users_table', {\n  id: int().primaryKey(),\n  name: varchar({ length: 255 }).notNull(),\n  age: int().notNull(),\n  email: varchar({ length: 255 }).notNull().unique(),\n});\n\n...\n\nconst db = drizzle(process.env.DATABASE_URL!);\n\ndb.select()...\n```\n\nYou can check out our [Getting started guides](https://orm.drizzle.team/docs/get-started/singlestore-new) to try SingleStore!\n\n# New Drivers\n\n### 🎉 `SQLite Durable Objects` driver is now available in Drizzle\n\nYou can now query SQLite Durable Objects in Drizzle!\n\nFor the full example, please check our [Get Started](https://orm.drizzle.team/docs/get-started/do-new) Section\n\n```ts\n/// <reference types=\"@cloudflare/workers-types\" />\nimport { drizzle, DrizzleSqliteDODatabase } from 'drizzle-orm/durable-sqlite';\nimport { DurableObject } from 'cloudflare:workers'\nimport { migrate } from 'drizzle-orm/durable-sqlite/migrator';\nimport migrations from '../drizzle/migrations';\nimport { usersTable } from './db/schema';\n\nexport class MyDurableObject1 extends DurableObject {\n  storage: DurableObjectStorage;\n  db: DrizzleSqliteDODatabase<any>;\n\n  constructor(ctx: DurableObjectState, env: Env) {\n    super(ctx, env);\n    this.storage = ctx.storage;\n    this.db = drizzle(this.storage, { logger: false });\n  }\n\n    async migrate() {\n        migrate(this.db, migrations);\n    }\n\n  async insert(user: typeof usersTable.$inferInsert) {\n        await this.db.insert(usersTable).values(user);\n    }\n\n  async select() {\n        return this.db.select().from(usersTable);\n    }\n}\n\nexport default {\n  /**\n   * This is the standard fetch handler for a Cloudflare Worker\n   *\n   * @param request - The request submitted to the Worker from the client\n   * @param env - The interface to reference bindings declared in wrangler.toml\n   * @param ctx - The execution context of the Worker\n   * @returns The response to be sent back to the client\n   */\n  async fetch(request: Request, env: Env): Promise<Response> {\n    const id: DurableObjectId = env.MY_DURABLE_OBJECT1.idFromName('durable-object');\n    const stub = env.MY_DURABLE_OBJECT1.get(id);\n    await stub.migrate();\n\n    await stub.insert({\n      name: 'John',\n      age: 30,\n      email: 'john@example.com',\n      })\n    console.log('New user created!')\n  \n    const users = await stub.select();\n    console.log('Getting all users from the database: ', users)\n\n        return new Response();\n    }\n}\n```\n\n# Bug fixes\n\n- [[BUG]: $with is undefined on withReplicas](https://github.com/drizzle-team/drizzle-orm/issues/1834)\n- [[BUG]: Neon serverless driver accepts authToken as a promise, but the $withAuth does not](https://github.com/drizzle-team/drizzle-orm/issues/3597)"
  },
  {
    "path": "changelogs/drizzle-orm/0.38.0.md",
    "content": "# Types breaking changes\n\nA few internal types were changed and extra generic types for length of column types were added in this release. It won't affect anyone, unless you are using those internal types for some custom wrappers, logic, etc. Here is a list of all types that were changed, so if you are relying on those, please review them before upgrading\n\n- `MySqlCharBuilderInitial`\n- `MySqlVarCharBuilderInitial`\n- `PgCharBuilderInitial`\n- `PgArrayBuilder`\n- `PgArray`\n- `PgVarcharBuilderInitial`\n- `PgBinaryVectorBuilderInitial`\n- `PgBinaryVectorBuilder`\n- `PgBinaryVector`\n- `PgHalfVectorBuilderInitial`\n- `PgHalfVectorBuilder`\n- `PgHalfVector`\n- `PgVectorBuilderInitial`\n- `PgVectorBuilder`\n- `PgVector`\n- `SQLiteTextBuilderInitial`\n\n# New Features\n\n- Added new function `getViewSelectedFields`\n- Added `$inferSelect` function to views\n- Added `InferSelectViewModel` type for views\n- Added `isView` function\n\n# Validator packages updates\n\n- `drizzle-zod` has been completely rewritten. You can find detailed information about it [here](https://github.com/drizzle-team/drizzle-orm/blob/main/changelogs/drizzle-zod/0.6.0.md)\n- `drizzle-valibot` has been completely rewritten. You can find detailed information about it [here](https://github.com/drizzle-team/drizzle-orm/blob/main/changelogs/drizzle-valibot/0.3.0.md)\n- `drizzle-typebox` has been completely rewritten. You can find detailed information about it [here](https://github.com/drizzle-team/drizzle-orm/blob/main/changelogs/drizzle-typebox/0.2.0.md)\n\nThanks to @L-Mario564 for making more updates than we expected to be shipped in this release. We'll copy his message from a PR regarding improvements made in this release:\n\n- Output for all packages are now unminified, makes exploring the compiled code easier when published to npm.\n- Smaller footprint. Previously, we imported the column types at runtime for each dialect, meaning that for example, if you're just using Postgres then you'd likely only have drizzle-orm and drizzle-orm/pg-core in the build output of your app; however, these packages imported all dialects which could lead to mysql-core and sqlite-core being bundled as well even if they're unused in your app. This is now fixed.\n- Slight performance gain. To determine the column data type we used the is function which performs a few checks to ensure the column data type matches. This was slow, as these checks would pile up every quickly when comparing all data types for many fields in a table/view. The easier and faster alternative is to simply go off of the column's columnType property.\n- Some changes had to be made at the type level in the ORM package for better compatibility with drizzle-valibot.\n\nAnd a set of new features\n\n- `createSelectSchema` function now also accepts views and enums.\n- New function: `createUpdateSchema`, for use in updating queries.\n- New function: `createSchemaFactory`, to provide more advanced options and to avoid bloating the parameters of the other schema functions\n\n# Bug fixes\n\n- [[FEATURE]: publish packages un-minified](https://github.com/drizzle-team/drizzle-orm/issues/2247)\n- [Don't allow unknown keys in drizzle-zod refinement](https://github.com/drizzle-team/drizzle-orm/issues/573)\n- [[BUG]:drizzle-zod not working with pgSchema](https://github.com/drizzle-team/drizzle-orm/issues/1458)\n- [Add createUpdateSchema to drizzle-zod](https://github.com/drizzle-team/drizzle-orm/issues/503)\n- [[BUG]:drizzle-zod produces wrong type](https://github.com/drizzle-team/drizzle-orm/issues/1110)\n- [[BUG]:Drizzle-zod:Boolean and Serial types from Schema are defined as enum<unknown> when using CreateInsertSchema and CreateSelectSchema](https://github.com/drizzle-team/drizzle-orm/issues/1327)\n- [[BUG]: Drizzle typebox enum array wrong schema and type](https://github.com/drizzle-team/drizzle-orm/issues/1345)\n- [[BUG]:drizzle-zod not working with pgSchema](https://github.com/drizzle-team/drizzle-orm/issues/1458)\n- [[BUG]: drizzle-zod not parsing arrays correctly](https://github.com/drizzle-team/drizzle-orm/issues/1609)\n- [[BUG]: Drizzle typebox not supporting array](https://github.com/drizzle-team/drizzle-orm/issues/1810)\n- [[FEATURE]: Export factory functions from drizzle-zod to allow usage with extended Zod classes](https://github.com/drizzle-team/drizzle-orm/issues/2245)\n- [[FEATURE]: Add support for new pipe syntax for drizzle-valibot](https://github.com/drizzle-team/drizzle-orm/issues/2358)\n- [[BUG]: drizzle-zod's createInsertSchema() can't handle column of type vector](https://github.com/drizzle-team/drizzle-orm/issues/2424)\n- [[BUG]: drizzle-typebox fails to map geometry column to type-box schema](https://github.com/drizzle-team/drizzle-orm/issues/2516)\n- [[BUG]: drizzle-valibot does not provide types for returned schemas](https://github.com/drizzle-team/drizzle-orm/issues/2521)\n- [[BUG]: Drizzle-typebox types SQLite real field to string](https://github.com/drizzle-team/drizzle-orm/issues/2524)\n- [[BUG]: drizzle-zod: documented usage generates type error with exactOptionalPropertyTypes](https://github.com/drizzle-team/drizzle-orm/issues/2550)\n- [[BUG]: drizzle-zod does not respect/count db type range](https://github.com/drizzle-team/drizzle-orm/issues/2737)\n- [[BUG]: drizzle-zod not overriding optional](https://github.com/drizzle-team/drizzle-orm/issues/2755)\n- [[BUG]:drizzle-zod doesn't accept custom id value](https://github.com/drizzle-team/drizzle-orm/issues/2957)\n- [[FEATURE]: Support for Database Views in Drizzle Zod](https://github.com/drizzle-team/drizzle-orm/issues/3398)\n- [[BUG]: drizzle-valibot return type any](https://github.com/drizzle-team/drizzle-orm/issues/3621)\n- [[BUG]: drizzle-zod Type generation results in undefined types](https://github.com/drizzle-team/drizzle-orm/issues/3645)\n- [[BUG]: GeneratedAlwaysAs](https://github.com/drizzle-team/drizzle-orm/issues/3511)\n- [[FEATURE]: $inferSelect on a view](https://github.com/drizzle-team/drizzle-orm/issues/2610)\n- [[BUG]:Can't infer props from view in schema](https://github.com/drizzle-team/drizzle-orm/issues/3392)\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.38.1.md",
    "content": "- Closed [[FEATURE]: Add more flexible typing for usage with exactOptionalPropertyTypes](https://github.com/drizzle-team/drizzle-orm/issues/2742)"
  },
  {
    "path": "changelogs/drizzle-orm/0.38.2.md",
    "content": "# New features\n\n## `USE INDEX`, `FORCE INDEX` and `IGNORE INDEX` for MySQL\n\nIn MySQL, the statements USE INDEX, FORCE INDEX, and IGNORE INDEX are hints used in SQL queries to influence how the query optimizer selects indexes. These hints provide fine-grained control over index usage, helping optimize performance when the default behavior of the optimizer is not ideal.\n\n### Use Index\n\nThe `USE INDEX` hint suggests to the optimizer which indexes to consider when processing the query. The optimizer is not forced to use these indexes but will prioritize them if they are suitable.\n\n```ts \nexport const users = mysqlTable('users', {\n  id: int('id').primaryKey(),\n  name: varchar('name', { length: 100 }).notNull(),\n}, () => [usersTableNameIndex]);\n\nconst usersTableNameIndex = index('users_name_index').on(users.name);\n\nawait db.select()\n  .from(users, { useIndex: usersTableNameIndex })\n  .where(eq(users.name, 'David'));\n```\n\n### Ignore Index\n\nThe `IGNORE INDEX` hint tells the optimizer to avoid using specific indexes for the query. MySQL will consider all other indexes (if any) or perform a full table scan if necessary.\n\n```ts\nexport const users = mysqlTable('users', {\n  id: int('id').primaryKey(),\n  name: varchar('name', { length: 100 }).notNull(),\n}, () => [usersTableNameIndex]);\n\nconst usersTableNameIndex = index('users_name_index').on(users.name);\n\nawait db.select()\n  .from(users, { ignoreIndex: usersTableNameIndex })\n  .where(eq(users.name, 'David'));\n```\n\n### Force Index\n\nThe `FORCE INDEX` hint forces the optimizer to use the specified index(es) for the query. If the specified index cannot be used, MySQL will not fall back to other indexes; it might resort to a full table scan instead.\n\n```ts copy\nexport const users = mysqlTable('users', {\n  id: int('id').primaryKey(),\n  name: varchar('name', { length: 100 }).notNull(),\n}, () => [usersTableNameIndex]);\n\nconst usersTableNameIndex = index('users_name_index').on(users.name);\n\nawait db.select()\n  .from(users, { forceIndex: usersTableNameIndex })\n  .where(eq(users.name, 'David'));\n```\n\nYou can also combine those hints and use multiple indexes in a query if you need"
  },
  {
    "path": "changelogs/drizzle-orm/0.38.3.md",
    "content": "- Fix incorrect deprecation detection for table declarations"
  },
  {
    "path": "changelogs/drizzle-orm/0.38.4.md",
    "content": "- New SingleStore type `vector` - thanks @mitchwadair\n- Fix wrong DROP INDEX statement generation, [#3866](https://github.com/drizzle-team/drizzle-orm/pull/3866) - thanks @WaciX\n- Typo fixes - thanks @stephan281094"
  },
  {
    "path": "changelogs/drizzle-orm/0.39.0.md",
    "content": "# New features\n\n## Bun SQL driver support\nYou can now use the new Bun SQL driver released in Bun v1.2.0 with Drizzle\n\n```ts\nimport { drizzle } from 'drizzle-orm/bun-sql';\n\nconst db = drizzle(process.env.PG_DB_URL!);\n\nconst result = await db.select().from(...);\n```\n\nor you can use Bun SQL instance\n\n```ts\nimport { drizzle } from 'drizzle-orm/bun-sqlite';\nimport { SQL } from 'bun';\n\nconst client = new SQL(process.env.PG_DB_URL!);\nconst db = drizzle({ client });\n\nconst result = await db.select().from(...);\n```\n\nCurrent Limitations:\n\n- `json` and `jsonb` inserts and selects currently perform an additional `JSON.stringify` on the Bun SQL side. Once this is removed, they should work properly. You can always use custom types and redefine the mappers to and from the database.\n- `datetime`, `date`, and `timestamp` will not work properly when using `mode: string` in Drizzle. This is due to Bun's API limitations, which prevent custom parsers for queries. As a result, Drizzle cannot control the response sent from Bun SQL to Drizzle. Once this feature is added to Bun SQL, it should work as expected.\n- `array` types currently have issues in Bun SQL.\n\n> You can check more in [Bun docs](https://bun.sh/docs/api/sql)\n>\n> You can check more getting started examples in [Drizzle docs](https://orm.drizzle.team/docs/get-started/bun-sql-new)\n\n## WITH now supports INSERT, UPDATE, DELETE and raw sql template\n\n**`with` and `insert`**\n\n```ts\nconst users = pgTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull(),\n});\n\nconst sq = db.$with('sq').as(\n    db.insert(users).values({ name: 'John' }).returning(),\n);\n\nconst result = await db.with(sq).select().from(sq);\n```\n\n**`with` and `update`**\n\n```ts\nconst users = pgTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull(),\n});\n\nconst sq = db.$with('sq').as(\n    db.update(users).set({ age: 25 }).where(eq(users.name, 'John')).returning(),\n);\nconst result = await db.with(sq).select().from(sq);\n```\n\n**`with` and `delete`**\n\n```ts\nconst users = pgTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull(),\n});\n\nconst sq = db.$with('sq').as(\n  db.delete(users).where(eq(users.name, 'John')).returning(),\n);\n\nconst result = await db.with(sq).select().from(sq);\n```\n\n**`with` and `sql`**\n\n```ts\nconst users = pgTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull(),\n});\n\nconst sq = db.$with('sq', {\n  userId: users.id,\n  data: {\n    name: users.name,\n  },\n}).as(sql`select * from ${users} where ${users.name} = 'John'`);\n\nconst result = await db.with(sq).select().from(sq);\n```\n\n## New tables in `/neon` import\n\nIn this release you can use `neon_identity` schema and `users_sync` table inside this schema by just importing it from `/neon`\n\n```ts\n// \"drizzle-orm/neon\"\nconst neonIdentitySchema = pgSchema('neon_identity');\n\n/**\n * Table schema of the `users_sync` table used by Neon Identity.\n * This table automatically synchronizes and stores user data from external authentication providers.\n *\n * @schema neon_identity\n * @table users_sync\n */\nexport const usersSync = neonIdentitySchema.table('users_sync', {\n  rawJson: jsonb('raw_json').notNull(),\n  id: text().primaryKey().notNull(),\n  name: text(),\n  email: text(),\n  createdAt: timestamp('created_at', { withTimezone: true, mode: 'string' }),\n  deletedAt: timestamp('deleted_at', { withTimezone: true, mode: 'string' }),\n});\n```\n\n# Utils and small improvements\n\n## `getViewName` util function\n\n```ts\nimport { getViewName } from 'drizzle-orm/sql'\n\nexport const user = pgTable(\"user\", {\n  id: serial(),\n  name: text(),\n  email: text(),\n});\n\nexport const userView = pgView(\"user_view\").as((qb) => qb.select().from(user));\n\nconst viewName = getViewName(userView)\n```\n\n# Bug fixed and GitHub issue closed\n\n- [[FEATURE]: allow INSERT in CTEs (WITH clauses)](https://github.com/drizzle-team/drizzle-orm/issues/2078)\n- [[FEATURE]: Support Raw SQL in CTE Query Builder](https://github.com/drizzle-team/drizzle-orm/issues/2168)\n- [[FEATURE]: include pre-defined database objects related to Neon Identity in drizzle-orm](https://github.com/drizzle-team/drizzle-orm/issues/3959)\n- [[BUG]: $count is undefined on withReplicas](https://github.com/drizzle-team/drizzle-orm/issues/3951)\n- [[FEATURE]: get[Materialized]ViewName, ie getTableName but for (materialized) views.](https://github.com/drizzle-team/drizzle-orm/issues/3946)\n- [[BUG]: $count API error with vercel-postgres](https://github.com/drizzle-team/drizzle-orm/issues/3710)\n- [[BUG]: Cannot use schema.coerce on refining drizzle-zod types](https://github.com/drizzle-team/drizzle-orm/issues/3842)\n- [[FEATURE]: Type Coercion in drizzle-zod](https://github.com/drizzle-team/drizzle-orm/issues/776)\n- [[BUG]: The inferred type of X cannot be named without a reference to ../../../../../node_modules/drizzle-zod/schema.types.internal.mjs](https://github.com/drizzle-team/drizzle-orm/issues/3732)\n- [[BUG]: drizzle-zod excessively deep and possibly infinite types](https://github.com/drizzle-team/drizzle-orm/issues/3869)"
  },
  {
    "path": "changelogs/drizzle-orm/0.39.1.md",
    "content": "- Fixed SQLite onConflict clauses being overwritten instead of stacked - [#2276](https://github.com/drizzle-team/drizzle-orm/issues/2276)\n- Added view support to `aliasedTable()`\n- Fixed sql builder prefixing aliased views and tables with their schema"
  },
  {
    "path": "changelogs/drizzle-orm/0.39.2.md",
    "content": "- To be compatible with latest Neon Auth feature we renamed the pre-defined schema internally, from `neon_identity` to `neon_auth` - thanks @pffigueiredo"
  },
  {
    "path": "changelogs/drizzle-orm/0.39.3.md",
    "content": "- Remove `react` from peerDependencies\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.40.0.md",
    "content": "# New Features \n\n## Added `Gel` dialect support and `gel-js` client support\n\nDrizzle is getting a new `Gel` dialect with its own types and Gel-specific logic. In this first iteration, almost all query-building features have been copied from the `PostgreSQL` dialect since Gel is fully PostgreSQL-compatible. The only change in this iteration is the data types. The Gel dialect has a different set of available data types, and all mappings for these types have been designed to avoid any extra conversions on Drizzle's side. This means you will insert and select exactly the same data as supported by the Gel protocol.\n\nDrizzle + Gel integration will work only through `drizzle-kit pull`. Drizzle won't support `generate`, `migrate`, or `push` features in this case. Instead, drizzle-kit is used solely to pull the Drizzle schema from the Gel database, which can then be used in your `drizzle-orm` queries.\n\nThe Gel + Drizzle workflow:\n\n1. Use the `gel` CLI to manage your schema.\n2. Use the `gel` CLI to generate and apply migrations to the database.\n3. Use drizzle-kit to pull the Gel database schema into a Drizzle schema.\n4. Use drizzle-orm with gel-js to query the Gel database.\n\nHere is a small example of how to connect to Gel using Drizzle:\n\n```typescript copy\n// Make sure to install the 'gel' package \nimport { drizzle } from \"drizzle-orm/gel\";\nimport { createClient } from \"gel\";\n\nconst gelClient = createClient();\nconst db = drizzle({ client: gelClient });\n\nconst result = await db.execute('select 1');\n```\n\nOn the drizzle-kit side you can now use `dialect: \"gel\"`\n\n```ts\n// drizzle.config.ts\nimport { defineConfig } from 'drizzle-kit';\n\nexport default defineConfig({\n  dialect: 'gel',\n});\n```\n\nFor a complete Get Started tutorial you can use our new guides:\n\n- [Get Started with Drizzle and Gel in a new project](https://orm.drizzle.team/docs/get-started/gel-new)\n- [Get Started with Drizzle and Gel in a existing project](https://orm.drizzle.team/docs/get-started/gel-existing)"
  },
  {
    "path": "changelogs/drizzle-orm/0.40.1.md",
    "content": "#### Updates to `neon-http` for `@neondatabase/serverless@1.0.0` - thanks @jawj\n\nStarting from this version, drizzle-orm will be compatible with both `@neondatabase/serverless` <1.0 and >1.0"
  },
  {
    "path": "changelogs/drizzle-orm/0.41.0.md",
    "content": "- `bigint`, `number` modes for `SQLite`, `MySQL`, `PostgreSQL`, `SingleStore` `decimal` & `numeric` column types  \n- Changed behavior of `sql-js` query preparation to query prebuild instead of db-side prepare due to need to manually free prepared queries, removed `.free()` method  \n- Fixed `MySQL`, `SingleStore` `varchar` allowing not specifying `length` in config  \n- Fixed `MySQL`, `SingleStore` `binary`, `varbinary` data\\\\type mismatches  \n- Fixed `numeric`\\\\`decimal` data\\\\type mismatches: [#1290](https://github.com/drizzle-team/drizzle-orm/issues/1290), [#1453](https://github.com/drizzle-team/drizzle-orm/issues/1453)  \n- Fixed `drizzle-studio` + `AWS Data Api` connection issue: [#3224](https://github.com/drizzle-team/drizzle-orm/issues/3224)  \n- Fixed `isConfig` utility function checking types of wrong fields  \n- Enabled `supportBigNumbers` in auto-created `mysql2` driver instances  \n- Fixed custom schema tables querying in RQBv1: [#4060](https://github.com/drizzle-team/drizzle-orm/issues/4060)  \n- Removed in-driver mapping for postgres types `1231` (`numeric[]`), `1115` (`timestamp[]`), `1185` (`timestamp_with_timezone[]`), `1187` (`interval[]`), `1182` (`date[]`), preventing precision loss and data\\\\type mismatches  \n- Fixed `SQLite` `buffer`-mode `blob` sometimes returning `number[]`"
  },
  {
    "path": "changelogs/drizzle-orm/0.42.0.md",
    "content": "## Features\n\n### Duplicate imports removal\n\nWhen importing from `drizzle-orm` using custom loaders, you may encounter issues such as: `SyntaxError: The requested module 'drizzle-orm' does not provide an export named 'eq'`\n\nThis issue arose because there were duplicated exports in `drizzle-orm`. To address this, we added a set of tests that checks every file in `drizzle-orm` to ensure all exports are valid. These tests will fail if any new duplicated exports appear.\n\nIn this release, we’ve removed all duplicated exports, so you should no longer encounter this issue.\n\n### `pgEnum` and `mysqlEnum` now can accept both strings and TS enums\n\nIf you provide a TypeScript enum, all your types will be inferred as that enum - so you can insert and retrieve enum values directly. If you provide a string union, it will work as before.\n\n```ts\nenum Test {\n  a = 'a',\n  b = 'b',\n  c = 'c',\n}\n\nconst tableWithTsEnums = mysqlTable('enums_test_case', {\n  id: serial().primaryKey(),\n  enum1: mysqlEnum(Test).notNull(),\n  enum2: mysqlEnum(Test).default(Test.a),\n});\n\nawait db.insert(tableWithTsEnums).values([\n  { id: 1, enum1: Test.a, enum2: Test.b, enum3: Test.c },\n  { id: 2, enum1: Test.a, enum3: Test.c },\n  { id: 3, enum1: Test.a },\n]);\n\nconst res = await db.select().from(tableWithTsEnums);\n\nexpect(res).toEqual([\n  { id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n  { id: 2, enum1: 'a', enum2: 'a', enum3: 'c' },\n  { id: 3, enum1: 'a', enum2: 'a', enum3: 'b' },\n]);\n```\n\n## Improvements\n- Make `inArray` accept `ReadonlyArray` as a value - thanks @Zamiell\n- Pass row type parameter to `@planetscale/database`'s execute - thanks @ayrton\n- New `InferEnum` type - thanks @totigm\n\n## Issues closed\n\n- [Add first-class support for TS native enums](https://github.com/drizzle-team/drizzle-orm/issues/332)\n- [[FEATURE]: support const enums](https://github.com/drizzle-team/drizzle-orm/issues/2798)\n- [[BUG]: SyntaxError: The requested module 'drizzle-orm' does not provide an export named 'lte'](https://github.com/drizzle-team/drizzle-orm/issues/4079)"
  },
  {
    "path": "changelogs/drizzle-orm/0.43.0.md",
    "content": "## Features\n\n- Added `cross join` \\([#1414](https://github.com/drizzle-team/drizzle-orm/issues/1414)\\)\n- Added lateral `left`, `inner`, `cross` joins to `PostgreSQL`, `MySQL`, `Gel`, `SingleStore`\n- Added drizzle connection attributes to `SingleStore`'s driver instances  \n\n## Fixes\n\n- Removed unsupported by dialect `full join` from `MySQL` select api  \n- Forced `Gel` columns to always have explicit schema & table prefixes due to potential errors caused by lack of such prefix in subquery's selection when there's already a column bearing same name in context  \n- Added missing export for `PgTextBuilderInitial` type  \n- Removed outdated `IfNotImported` type check from `SingleStore` driver initializer  \n- Fixed incorrect type inferrence for insert and update models with non-strict `tsconfig`s \\([#2654](https://github.com/drizzle-team/drizzle-orm/issues/2654)\\)  \n- Fixed invalid spelling of `nowait` flag \\([#3554](https://github.com/drizzle-team/drizzle-orm/issues/3554)\\)\n- [Add join lateral support](https://github.com/drizzle-team/drizzle-orm/issues/420)\n- [Remove .fullJoin() from MySQL API](https://github.com/drizzle-team/drizzle-orm/issues/1125)"
  },
  {
    "path": "changelogs/drizzle-orm/0.43.1.md",
    "content": "## Fixes\n\n- [Fixed incorrect types of schema enums in PostgreSQL](https://github.com/drizzle-team/drizzle-orm/issues/4421)"
  },
  {
    "path": "changelogs/drizzle-orm/0.44.0.md",
    "content": "## Error handling\n\nStarting from this version, we’ve introduced a new `DrizzleQueryError` that wraps all errors from database drivers and provides a set of useful information:\n\n1. A proper stack trace to identify which exact `Drizzle` query failed\n2. The generated SQL string and its parameters\n3. The original stack trace from the driver that caused the DrizzleQueryError\n\n## Drizzle `cache` module\n\nDrizzle sends every query straight to your database by default. There are no hidden actions, no automatic caching or invalidation - you’ll always see exactly what runs. If you want caching, you must opt in.\n\nBy default, Drizzle uses a explicit caching strategy (i.e. `global: false`), so nothing is ever cached unless you ask. This prevents surprises or hidden performance traps in your application. Alternatively, you can flip on all caching (global: true) so that every select will look in cache first.\n\nOut first native integration was built together with Upstash team and let you natively use `upstash` as a cache for your drizzle queries\n\n```ts\nimport { upstashCache } from \"drizzle-orm/cache/upstash\";\nimport { drizzle } from \"drizzle-orm/...\";\n\nconst db = drizzle(process.env.DB_URL!, {\n  cache: upstashCache({\n    // 👇 Redis credentials (optional — can also be pulled from env vars)\n    url: '<UPSTASH_URL>',\n    token: '<UPSTASH_TOKEN>',\n    // 👇 Enable caching for all queries by default (optional)\n    global: true,\n    // 👇 Default cache behavior (optional)\n    config: { ex: 60 }\n  })\n});\n```\n\nYou can also implement your own cache, as Drizzle exposes all the necessary APIs, such as get, put, mutate, etc.\nYou can find full implementation details on the [website](https://orm.drizzle.team/docs/cache#custom-cache)\n\n```ts\nimport Keyv from \"keyv\";\nexport class TestGlobalCache extends Cache {\n  private globalTtl: number = 1000;\n  // This object will be used to store which query keys were used\n  // for a specific table, so we can later use it for invalidation.\n  private usedTablesPerKey: Record<string, string[]> = {};\n  constructor(private kv: Keyv = new Keyv()) {\n    super();\n  }\n  // For the strategy, we have two options:\n  // - 'explicit': The cache is used only when .$withCache() is added to a query.\n  // - 'all': All queries are cached globally.\n  // The default behavior is 'explicit'.\n  override strategy(): \"explicit\" | \"all\" {\n    return \"all\";\n  }\n  // This function accepts query and parameters that cached into key param,\n  // allowing you to retrieve response values for this query from the cache.\n  override async get(key: string): Promise<any[] | undefined> {\n    ...\n  }\n  // This function accepts several options to define how cached data will be stored:\n  // - 'key': A hashed query and parameters.\n  // - 'response': An array of values returned by Drizzle from the database.\n  // - 'tables': An array of tables involved in the select queries. This information is needed for cache invalidation.\n  //\n  // For example, if a query uses the \"users\" and \"posts\" tables, you can store this information. Later, when the app executes\n  // any mutation statements on these tables, you can remove the corresponding key from the cache.\n  // If you're okay with eventual consistency for your queries, you can skip this option.\n  override async put(\n    key: string,\n    response: any,\n    tables: string[],\n    config?: CacheConfig,\n  ): Promise<void> {\n    ...\n  }\n  // This function is called when insert, update, or delete statements are executed.\n  // You can either skip this step or invalidate queries that used the affected tables.\n  //\n  // The function receives an object with two keys:\n  // - 'tags': Used for queries labeled with a specific tag, allowing you to invalidate by that tag.\n  // - 'tables': The actual tables affected by the insert, update, or delete statements,\n  //   helping you track which tables have changed since the last cache update.\n  override async onMutate(params: {\n    tags: string | string[];\n    tables: string | string[] | Table<any> | Table<any>[];\n  }): Promise<void> {\n    ...\n  }\n}\n```\n\nFor more usage example you can check our [docs](https://orm.drizzle.team/docs/cache#cache-usage-examples)"
  },
  {
    "path": "changelogs/drizzle-orm/0.44.1.md",
    "content": "- [[BUG]: Drizzle can no longer run on Durable Objects](https://github.com/drizzle-team/drizzle-orm/issues/4586)"
  },
  {
    "path": "changelogs/drizzle-orm/0.44.2.md",
    "content": "- [BUG]: Fixed type issues with joins with certain variations of `tsconfig`: [#4535](https://github.com/drizzle-team/drizzle-orm/issues/4535), [#4457](https://github.com/drizzle-team/drizzle-orm/issues/4457)"
  },
  {
    "path": "changelogs/drizzle-orm/0.44.3.md",
    "content": "- Fixed types of `$client` for clients created by drizzle function\n\n```ts\nawait db.$client.[...]\n```\n\n- Added the `updated_at` column to the `neon_auth.users_sync` table definition."
  },
  {
    "path": "changelogs/drizzle-orm/0.44.4.md",
    "content": "- Fix wrong DrizzleQueryError export. thanks @nathankleyn"
  },
  {
    "path": "changelogs/drizzle-orm/0.44.5.md",
    "content": "- Fixed invalid usage of `.one()` in `durable-sqlite` session\n- Fixed spread operator related crash in sqlite `blob` columns\n- Better browser support for sqlite `blob` columns \n- Improved sqlite `blob` mapping"
  },
  {
    "path": "changelogs/drizzle-orm/0.44.6.md",
    "content": "- feat: add $replicas reference #4874\n"
  },
  {
    "path": "changelogs/drizzle-orm/0.44.7.md",
    "content": "- fix durable sqlite transaction return value #3746 - thanks @joaocstro"
  },
  {
    "path": "changelogs/drizzle-orm/0.45.0.md",
    "content": "- Fixed pg-native Pool detection in node-postgres transactions  \n- Allowed subqueries in select fields  \n- Updated typo algorythm => algorithm  \n- Fixed `$onUpdate` not handling `SQL` values (fixes [#2388](https://github.com/drizzle-team/drizzle-orm/issues/2388), tests implemented by [L-Mario564](https://github.com/L-Mario564) in [#2911](https://github.com/drizzle-team/drizzle-orm/pull/2911))\n- Fixed `pg` mappers not handling `Date` instances in `bun-sql:postgresql` driver responses for `date`, `timestamp` types (fixes [#4493](https://github.com/drizzle-team/drizzle-orm/issues/4493))  "
  },
  {
    "path": "changelogs/drizzle-orm/0.45.1.md",
    "content": "- Fixed pg-native Pool detection in node-postgres transactions breaking in environments with forbidden `require()` ([#5107](https://github.com/drizzle-team/drizzle-orm/issues/5107))  "
  },
  {
    "path": "changelogs/drizzle-orm-mysql/0.14.1.md",
    "content": "# drizzle-orm-mysql 0.14.1\n\n- Release support for mysql. Currently mysql module is up-to-date with `pg` and `sqlite`"
  },
  {
    "path": "changelogs/drizzle-orm-mysql/0.14.2.md",
    "content": "# drizzle-orm-mysql 0.14.2\n\n- Bumped everything to 0.14.2"
  },
  {
    "path": "changelogs/drizzle-orm-mysql/0.14.3.md",
    "content": "# drizzle-orm-mysql 0.14.3\n\n- Fill author field in package.json\n"
  },
  {
    "path": "changelogs/drizzle-orm-mysql/0.15.0.md",
    "content": "# drizzle-orm-mysql 0.15.0\n\n- Bumped everything to 0.15.0"
  },
  {
    "path": "changelogs/drizzle-orm-mysql/0.15.1.md",
    "content": "# drizzle-orm-mysql 0.15.1\n\nAdd support for schemas -> [MySQL schemas](https://dev.mysql.com/doc/refman/8.0/en/create-database.html) \n\n\n> **Warning**\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n---\n\n## Breaking changes\n- `foreignKey()` function api changes. Previously you need to pass callback function with table columns for FK. Right now no need for callback, just object with data for FK\n\n#### Before\n```typescript\nexport const usersTable = mysqlTable('userstest', {\n\tid: serial('id').primaryKey(),\n\thomeCity: text('name').notNull(),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n}, (users) => ({\n\t// foreignKey has a callback as param\n\tusersCityFK: foreignKey(() => { columns: [users.homeCity], foreignColumns: [cities.id] }),\n}));\n```\n\n#### Now\n```typescript\nexport const usersTable = mysqlTable('userstest', {\n\tid: serial('id').primaryKey(),\n\thomeCity: text('name').notNull(),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n}, (users) => ({\n\t// foreignKey has a callback as param\n\tusersCityFK: foreignKey({ columns: [users.homeCity], foreignColumns: [cities.id] }),\n}));\n```\n---\n\n- Change enum initializing strategy for mysql\n\nYou should use\n``` typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular']).notNull().default('known')\n```\n\ninstead of \n``` typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n```\n\nUsage example in table schema\n``` typescript\nconst tableWithEnums = mysqlTable('enums_test_case', {\n\tid: serial('id').primaryKey(),\n\tenum1: mysqlEnum('enum1', ['a', 'b', 'c']).notNull(),\n\tenum2: mysqlEnum('enum2', ['a', 'b', 'c']).default('a'),\n\tenum3: mysqlEnum('enum3', ['a', 'b', 'c']).notNull().default('b'),\n});\n```"
  },
  {
    "path": "changelogs/drizzle-orm-mysql/0.15.2.md",
    "content": "# drizzle-orm-mysql 0.15.2\n\nInternal release\n"
  },
  {
    "path": "changelogs/drizzle-orm-mysql/0.15.3.md",
    "content": "# drizzle-orm-mysql 0.15.3\n\nInternal release\n"
  },
  {
    "path": "changelogs/drizzle-orm-mysql/0.16.0.md",
    "content": "# drizzle-orm-mysql 0.16.0\n\n- Bump all packages to 0.16.0\n"
  },
  {
    "path": "changelogs/drizzle-orm-mysql/0.16.1.md",
    "content": "# drizzle-orm-mysql 0.16.1\n\n- Add possibility to define database custom data types\n\nExample usage:\n\n```typescript\nconst customText = customType<{ data: string }>({\n\tdataType() {\n\t\treturn 'text';\n\t},\n});\n\nconst usersTable = mysqlTable('users', {\n\tname: customText('name').notNull(),\n});\n```\n\n For more examples please check [docs](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.lite.md)"
  },
  {
    "path": "changelogs/drizzle-orm-mysql/0.16.2.md",
    "content": "# drizzle-orm-mysql 0.16.2\n\n- Fix peer dependency error for >=0.16 drizzle packages\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.12.0-beta.40.md",
    "content": "# drizzle-orm-pg 0.12.0-beta.40\n\n- Added prepared statements and placeholders support.\n- Refactored `.select().fields()` to allow fields from joined tables and nested objects structure, removed partial selects from joins.\n- Allowed passing query builders to `db.execute`.\n- Optimized INSERT query generation for single values by skipping columns without values.\n- Exposed `table` property from index config.\n- Removed testing utils.\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.13.0.md",
    "content": "# drizzle-orm-pg 0.13.0\n\n- Release 🎉\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.13.1.md",
    "content": "# drizzle-orm-pg 0.13.1\n\n- Implemented node-pg prepared statements usage via adding `name` argument to `.prepare()` method.\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.13.2.md",
    "content": "# drizzle-orm-pg 0.13.2\n\n- Fix prepared statements usage.\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.13.3.md",
    "content": "# drizzle-orm-pg 0.13.3\n\n- Implemented NeonDB serverless driver support.\n- (internal) Added `session.all()` and `session.values()` methods.\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.13.4.md",
    "content": "# drizzle-orm-pg 0.13.4\n\n- Fixed types for IndexBuilder.\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.14.0.md",
    "content": "# drizzle-orm-pg 0.14.0\n\n- Separated migrations functionality to a separate import:\n```typescript\nimport { migrate } from 'drizzle-orm-pg/node/migrate';\n```\n- Replaced `await new PgConnector(client).connect()` with `drizzle(client)`.\n- `import { PgConnector } from 'drizzle-orm-pg` -> `import { drizzle } from 'drizzle-orm-pg/node`.\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.14.1.md",
    "content": "# drizzle-orm-pg 0.14.1\n\n- Bumped everything to 0.14.1.\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.14.2.md",
    "content": "# drizzle-orm-pg 0.14.2\n\n- Bumped everything to 0.14.2"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.14.3.md",
    "content": "# drizzle-orm-pg 0.14.3\n\n- Fixed `.onConflict` statement query builder. In previous versions target column was mapped together with table name\n- Added documentation examples for `onConflict`\n- Added documentation examples for returning statements for insert/update/delete\n- Add more tests for `onConflict` query builder"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.14.4.md",
    "content": "# drizzle-orm-pg 0.14.4\n\n- Fill author field in package.json\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.15.0.md",
    "content": "# drizzle-orm-pg 0.15.0\n\n- Set `notNull` to `true` in runtime, when `.primaryKey()` function was used in `ColumnBuilder`\n- Set `no action` for `OnDelete` and `OnUpdate` in runtime by default\n- Add internal version for ORM api\n- Index name now becomes optional. You can write either `index('usersNameIdx')` or `index()`. In last case, drizzle will generate index name automatically based on table and column index was created on\n\n## Breaking changes\n`foreignKey()` function api changes. Previosuly you need to pass callback function with table columns for FK. Right now no need for callback, just object with data for FK\n\n#### Before\n```typescript\nexport const usersTable = pgTable(\n\t'users_table',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\tuuid: uuid('uuid').defaultRandom().notNull(),\n\t\thomeCity: integer('home_city').notNull()\n\t},\n\t(users) => ({\n\t\t// foreignKey had a callback as param\n\t\tusersCityFK: foreignKey(() => ({ columns: [users.homeCity], foreignColumns: [cities.id] })),\n\t}),\n);\n```\n\n#### Now\n```typescript\nexport const usersTable = pgTable(\n\t'users_table',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\tuuid: uuid('uuid').defaultRandom().notNull(),\n\t\thomeCity: integer('home_city').notNull()\n\t},\n\t(users) => ({\n\t\t// foreignKey doesn't have a callback as param\n\t\tusersCityFK: foreignKey({ columns: [users.homeCity], foreignColumns: [cities.id] }),\n\t}),\n);\n```"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.15.1.md",
    "content": "# drizzle-orm-pg 0.15.1\n\nAdd support for schemas -> [PostgreSQL schemas](https://www.postgresql.org/docs/current/ddl-schemas.html) \n\n---\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\n\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\n\n> **Warning**\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = pgTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: jsonb<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = pgSchema('mySchema');\n\nconst usersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: jsonb<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n});\n```"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.15.2.md",
    "content": "# drizzle-orm-pg 0.15.2\n\nInternal release\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.15.3.md",
    "content": "# drizzle-orm-pg 0.15.3\n\nInternal release\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.16.0.md",
    "content": "# drizzle-orm-pg 0.16.0\n\n- Implemented [postgres.js](https://github.com/porsager/postgres) driver support ([docs](/drizzle-orm-pg/src/postgres-js/README.md))\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.16.1.md",
    "content": "# drizzle-orm-pg 0.16.1\n\n- Fix documentation links\n"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.16.2.md",
    "content": "- Add possibility to define database custom data types\n\nExample usage:\n\n```typescript\nconst customText = customType<{ data: string }>({\n\tdataType() {\n\t\treturn 'text';\n\t},\n});\n\nconst usersTable = pgTable('users', {\n\tname: customText('name').notNull(),\n});\n```\n\nFor more examples please check [docs](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.lite.md)"
  },
  {
    "path": "changelogs/drizzle-orm-pg/0.16.3.md",
    "content": "# drizzle-orm-pg 0.16.3\n\n- Fix peer dependency error for >=0.16 drizzle packages\n"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.12.0-beta.17.md",
    "content": "# drizzle-orm-sqlite 0.12.0-beta.17\n\n- Refactored `.select().fields()` to allow fields from joined tables and nested objects structure, removed partial selects from joins.\n- Replaced `.execute()` in query builders and prepared statements with `.run()`, `.all()`, `.get()`, `.values()`.\n"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.12.0-beta.18.md",
    "content": "# drizzle-orm-sqlite 0.12.0-beta.18\n\n- Updated `better-sqlite3` and `@types/better-sqlite3` peer dependency from `<8` to `<9`.\n"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.12.0-beta.19.md",
    "content": "# drizzle-orm-sqlite 0.12.0-beta.19\n\n- Fix bug with running migrations. `Error: SqliteError: near \"SCHEMA\": syntax error` was fixed\n"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.12.0-beta.20.md",
    "content": "# drizzle-orm-sqlite 0.12.0-beta.20\n\n- Fix bug with running migrations for async driver. `Error: SqliteError: near \"SCHEMA\": syntax error` was fixed\n- Fix `Statement does not return any data - use run()` error, when no fields were provided to prepared statement\n"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.12.0-beta.21.md",
    "content": "# drizzle-orm-sqlite 0.12.0-beta.21\n\n- Fixed `db.all` logic for all drivers.\n- Allowed passing query builders to raw query execution methods.\n- Optimized INSERT query generation for single values by skipping columns without values.\n- Exposed `table` property from index config.\n"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.13.0.md",
    "content": "# drizzle-orm-sqlite 0.13.0\n\n- Release 🎉\n"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.14.1.md",
    "content": "# drizzle-orm-sqlite 0.14.1\n\n- Separated migrations functionality to a separate import:\n```typescript\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrate';\n```\n- Replaced `await new SQLiteConnector(client).connect()` with `drizzle(client)`.\n- `import { SQLiteConnector } from 'drizzle-orm-sqlite` -> `import { drizzle } from 'drizzle-orm-pg/better-sqlite3`.\n"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.14.2.md",
    "content": "# drizzle-orm-sqlite 0.14.2\n\n- Bumped everything to 0.14.2"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.14.3.md",
    "content": "# drizzle-orm-sqlite 0.14.3\n\n- `RangeError: The supplied SQL string contains more than one statement` error on migrations was fixed\n\n    Created `.exec()` method for session, that will run query without prepared statments\n\n- Fix `defaultNow()` method query generation by adding missin `\"()\"`.\n\n    Previously default value was generated as \n    ```sql\n    cast((julianday('now') - 2440587.5)*86400000 as integer)\n    ``` \n    \n    Currently default value looks like\n    ```sql\n    (cast((julianday('now') - 2440587.5)*86400000 as integer))\n    ```\n\n- Create test cases for both issues"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.14.4.md",
    "content": "# drizzle-orm-sqlite 0.14.4\n\n- Fix adding autoincrement to `drizzle-kit` migrations"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.14.5.md",
    "content": "# drizzle-orm-sqlite 0.14.5\n\n- Remove upper bound restriction from `@cloudflare/workers-types` peer dependency\n- Fill author field in package.json\n"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.15.0.md",
    "content": "# drizzle-orm-sqlite 0.15.0\n\n- Add composite PK's on table schema definition\n\n#### Usage example\n```typescript\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n```"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.15.2.md",
    "content": "# drizzle-orm-sqlite 0.15.2\n\nInternal release\n"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.15.3.md",
    "content": "# drizzle-orm-sqlite 0.15.3\n\nInternal release\n"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.15.4.md",
    "content": "# drizzle-orm-sqlite 0.15.4\n\n- Implemented [sql.js](https://github.com/sql-js/sql.js/) driver support (allows you to use SQLite in the browser)\n"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.16.0.md",
    "content": "# drizzle-orm-sqlite 0.16.0\n\n- Bump all packages to 0.16.0\n"
  },
  {
    "path": "changelogs/drizzle-orm-sqlite/0.16.1.md",
    "content": "# drizzle-orm-sqlite 0.16.1\n\n- Fix peer dependency error for >=0.16 drizzle packages\n"
  },
  {
    "path": "changelogs/drizzle-seed/0.1.1.md",
    "content": "# Initial Release\n\n> [!NOTE]\n> `drizzle-seed` can only be used with `drizzle-orm@0.36.4` or higher. Versions lower than this may work at runtime but could have type issues and identity column issues, as this patch was introduced in `drizzle-orm@0.36.4`\n\n## Full Reference\n\nThe full API reference and package overview can be found in our [official documentation](https://orm.drizzle.team/docs/seed-overview)\n\n## Basic Usage\n\nIn this example we will create 10 users with random names and ids\n\n```ts {12}\nimport { pgTable, integer, text } from \"drizzle-orm/pg-core\";\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport { seed } from \"drizzle-seed\";\n\nconst users = pgTable(\"users\", {\n  id: integer().primaryKey(),\n  name: text().notNull(),\n});\n\nasync function main() {\n  const db = drizzle(process.env.DATABASE_URL!);\n  await seed(db, { users });\n}\n\nmain();\n```\n\n## Options\n\n**`count`**\n\nBy default, the `seed` function will create 10 entities.\nHowever, if you need more for your tests, you can specify this in the seed options object\n\n```ts\nawait seed(db, schema, { count: 1000 });\n```\n\n**`seed`**\n\nIf you need a seed to generate a different set of values for all subsequent runs, you can define a different number\nin the `seed` option. Any new number will generate a unique set of values\n\n```ts\nawait seed(db, schema, { seed: 12345 });\n```\n\nThe full API reference and package overview can be found in our [official documentation](https://orm.drizzle.team/docs/seed-overview)"
  },
  {
    "path": "changelogs/drizzle-seed/0.1.2.md",
    "content": "- Fixed: [[BUG]: drizzle-seed reset fails without @electric-sql/pglite installed](https://github.com/drizzle-team/drizzle-orm/issues/3603)\n- Fixed: [[BUG]: TypeScript type error in drizzle-seed with schema passed to drizzle in IDE](https://github.com/drizzle-team/drizzle-orm/issues/3599)"
  },
  {
    "path": "changelogs/drizzle-seed/0.1.3.md",
    "content": "## Bug fixes\n\n- https://github.com/drizzle-team/drizzle-orm/issues/3644\n- seeding a table with columns that have .default(sql``) will result in an error\n\n## Features\n\n- added support for postgres uuid columns\n\nExample\n\n```ts\nimport { pgTable, uuid } from \"drizzle-orm/pg-core\";\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport { seed } from \"drizzle-seed\";\n\nconst users = pgTable(\"users\", {\n  uuid: uuid(\"uuid\"),\n});\n\nasync function main() {\n  const db = drizzle(process.env.DATABASE_URL!);\n  //  You can let it seed automatically\n  //  await seed(db, { users });\n\n  // Alternatively, you can manually specify the generator in refine.\n  await seed(db, { users }, { count: 1000 }).refine((funcs) => ({\n    users: {\n      columns: {\n        uuid: funcs.uuid(),\n      },\n    },\n  }));\n}\n\nmain();\n```\n\n##\n\n- added support for postgres array columns\n\nExample\n\n```ts\nimport { pgTable, integer, text, varchar } from \"drizzle-orm/pg-core\";\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport { seed } from \"drizzle-seed\";\n\nconst users = pgTable(\"users\", {\n  id: integer().primaryKey(),\n  name: text().notNull(),\n  phone_numbers: varchar({ length: 256 }).array(),\n});\n```\n\nYou can specify the `arraySize` parameter in generator options, like `funcs.phoneNumber({ arraySize: 3 })`, to generate 1D arrays.\n\n```ts\nasync function main() {\n  const db = drizzle(process.env.DATABASE_URL!);\n  await seed(db, { users }, { count: 1000 }).refine((funcs) => ({\n    users: {\n      columns: {\n        phone_numbers: funcs.phoneNumber({ arraySize: 3 }),\n      },\n    },\n  }));\n}\n\nmain();\n```\n\nAlternatively, you can let it seed automatically, and it will handle arrays of any dimension.\n\n```ts\nasync function main() {\n  const db = drizzle(process.env.DATABASE_URL!);\n  await seed(db, { users });\n}\n\nmain();\n```\n\n##\n\n- added support for cyclic tables\n\nYou can now seed tables with cyclic relations.\n\n```ts\nimport type { AnyPgColumn } from \"drizzle-orm/pg-core\";\nimport {\n  foreignKey,\n  integer,\n  pgTable,\n  serial,\n  varchar,\n} from \"drizzle-orm/pg-core\";\n\nexport const modelTable = pgTable(\n  \"model\",\n  {\n    id: serial().primaryKey(),\n    name: varchar().notNull(),\n    defaultImageId: integer(),\n  },\n  (t) => [\n    foreignKey({\n      columns: [t.defaultImageId],\n      foreignColumns: [modelImageTable.id],\n    }),\n  ]\n);\n\nexport const modelImageTable = pgTable(\"model_image\", {\n  id: serial().primaryKey(),\n  url: varchar().notNull(),\n  caption: varchar(),\n  modelId: integer()\n    .notNull()\n    .references((): AnyPgColumn => modelTable.id),\n});\n\nasync function main() {\n  const db = drizzle(process.env.DATABASE_URL!);\n  await seed(db, { modelTable, modelImageTable });\n}\n\nmain();\n```\n"
  },
  {
    "path": "changelogs/drizzle-seed/0.2.1.md",
    "content": "## API updates\n\nWe are introducing a new parameter, `version`, to the `seed` function options. This parameter, which controls generator versioning, has been added to make it easier to update deterministic generators in the future. Since values should remain consistent after each regeneration, it is crucial to provide a well-designed API for gradual updates\n\n```ts\nawait seed(db, schema, { version: '2' });\n```\n\n#### Example:\n\n> This is not an actual API change; it is just an example of how we will proceed with `drizzle-seed` versioning\n\nFor example, `lastName` generator was changed, and new version, `V2`, of this generator became available.\n\nLater, `firstName` generator was changed, making `V3` version of this generator available.\n\n|                  |       `V1`       |      `V2`       |   `V3(latest)`   |\n| :--------------: | :--------------: | :-------------: | :--------------: |\n| **LastNameGen**  | `LastNameGenV1`  | `LastNameGenV2` |                  |\n| **FirstNameGen** | `FirstNameGenV1` |                 | `FirstNameGenV3` |\n\n\n##### Use the `firstName` generator of version 3 and the `lastName` generator of version 2\n```ts\nawait seed(db, schema);\n```\n\nIf you are not ready to use latest generator version right away, you can specify max version to use\n\n##### Use the `firstName` generator of version 1 and the `lastName` generator of version 2\n```ts\nawait seed(db, schema, { version: '2' });\n```\n\n##### Use the `firstName` generator of version 1 and the `lastName` generator of version 1.\n```ts\nawait seed(db, schema, { version: '1' });\n```\n\nEach update with breaking changes for generators will be documented on our docs and in release notes, explaining which version you should use, if you are not ready to upgrade the way generators works\n\n## Breaking changes\n\n### `interval` unique generator was changed and upgraded to v2\n\n```ts\nawait seed(db, { table }).refine((f) => ({\n  table: {\n    columns: {\n      // this function usage will output different values with the same `seed` number from previous version\n      column1: f.interval({ isUnique: true }),\n    }\n  }\n}))\n```\n\n**Reason for upgrade**\nAn older version of the generator could produce intervals like `1 minute 60 seconds` and `2 minutes 0 seconds`, treating them as distinct intervals.\nHowever, when the `1 minute 60 seconds` interval is inserted into a PostgreSQL database, it is automatically converted to `2 minutes 0 seconds`. As a result, attempting to insert the `2 minutes 0 seconds` interval into a unique column afterwards will cause an error\n\n**Usage**\n```ts\nawait seed(db, schema);\n// or explicit\nawait seed(db, schema, { version: '2' });\n```\n\n**Switch to the old version**\n```ts\nawait seed(db, schema, { version: '1' });\n```\n\n### `string` generators were changed and upgraded to v2\n\n```ts\nawait seed(db, { table }).refine((f) => ({\n  table: {\n    columns: {\n      // this function will output different values with the same `seed` number from previous version\n      column1: f.string(),\n    }\n  }\n}))\n```\n\n**Reason to upgrade**\n\nAbility to generate a unique string based on the length of the text column (e.g., `varchar(20)`)\n\n#### PostgreSQL changes\n\nDefault generators for `text`, `varchar`, `char` will output different values with the same `seed` number from previous version.\n\n```ts\n// schema.ts\nimport * as p from 'drizzle-orm/pg-core'\n\nexport const table = p.pgTable('table', {\n  column1: p.text(),\n  column2: p.varchar(),\n  column3: p.char()\n});\n\n// index.ts\n...\n// this will be affected with new changes\nawait seed(db, { table });\n```\n\n**Switch to the old version**\n```ts\nawait seed(db, schema, { version: '' });\n```\n\n#### MySQL changes\n\nDefault generators for `text`, `char`, `varchar`, `binary`, `varbinary` will output different values with the same `seed` number.\n\n```ts\n// schema.ts\nimport * as p from 'drizzle-orm/mysql-core'\n\nexport const table = p.mysqlTable('table', {\n  column1: p.text(),\n  column2: p.char(),\n  column3: p.varchar({ length: 256 }),\n  column4: p.binary(),\n  column5: p.varbinary({ length: 256 }),\n});\n\n// index.ts\n...\n// this will be affected with new changes\nawait seed(db, {table})\n```\n\n**Switch to the old version**\n```ts\nawait seed(db, schema, { version: '1' });\n```\n\n#### SQLite changes\n\nDefault generators for `text`, `numeric`, `blob`, `blobbuffer` will output different values with the same `seed` number.\n```ts\n// schema.ts\nimport * as p from 'drizzle-orm/sqlite-core'\n\nexport const table = p.sqliteTable('table', {\n  column1: p.text(),\n  column2: p.numeric(),\n  column3: p.blob({ mode:'buffer' }),\n  column4: p.blob(),\n});\n\n// index.ts\n...\n// this will be affected with new changes\nawait seed(db, { table })\n```\n\n\n## Bug fixes\n- Seeding a table with a foreign key referencing another table, without including the second table in the schema, will cause the seeding process to get stuck\n- [[BUG]: seeding postgresql char column doesn't respect length option](https://github.com/drizzle-team/drizzle-orm/issues/3774)\n"
  },
  {
    "path": "changelogs/drizzle-seed/0.3.0.md",
    "content": "# New features\n\n## Drizzle Relations support\n\nThe `seed` function can now accept Drizzle Relations objects and treat them as foreign key constraints\n\n\n```ts\n// schema.ts\nimport { integer, serial, text, pgTable } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\nexport const users = pgTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull(),\n});\nexport const usersRelations = relations(users, ({ many }) => ({\n  posts: many(posts),\n}));\nexport const posts = pgTable('posts', {\n  id: serial('id').primaryKey(),\n  content: text('content').notNull(),\n  authorId: integer('author_id').notNull(),\n});\nexport const postsRelations = relations(posts, ({ one }) => ({\n  author: one(users, { fields: [posts.authorId], references: [users.id] }),\n}));\n```\n\n```ts\n// index.ts\nimport { seed } from \"drizzle-seed\";\nimport * as schema from './schema.ts'\n\nasync function main() {\n  const db = drizzle(process.env.DATABASE_URL!);\n  await seed(db, schema);\n}\n\nmain();\n```"
  },
  {
    "path": "changelogs/drizzle-seed/0.3.1.md",
    "content": "## Bug fixes\n\n- Combining a reference in a table schema (foreign key constraint) with a one-to-many relation for the same two tables defined in the constraint causes the seeder to duplicate these relations and enter an infinite loop.\n\nExample:\n\n```ts\n// schema.ts\nimport { integer, pgTable, text } from \"drizzle-orm/pg-core\";\nimport { relations } from \"drizzle-orm/relations\";\n\nexport const users = pgTable(\"users\", {\n  id: integer().primaryKey(),\n  name: text(),\n  email: text(),\n});\n\nexport const posts = pgTable(\"posts\", {\n  id: integer().primaryKey(),\n  content: text(),\n  userId: integer().references(() => users.id),\n});\n\nexport const postsRelation = relations(posts, ({ one }) => ({\n  user: one(users, {\n    fields: [posts.userId],\n    references: [users.id],\n  }),\n}));\n```\n\nNow, seeding with the schema above will trigger a warning.\n\n```\nYou are providing a one-to-many relation between the 'users' and 'posts' tables,\nwhile the 'posts' table object already has foreign key constraint in the schema referencing 'users' table.\nIn this case, the foreign key constraint will be used.\n```\n"
  },
  {
    "path": "changelogs/drizzle-typebox/0.1.0.md",
    "content": "# drizzle-typebox 0.1.0\n\n- Initial release"
  },
  {
    "path": "changelogs/drizzle-typebox/0.1.1.md",
    "content": "- 🐛 Fixed imports in ESM projects\n"
  },
  {
    "path": "changelogs/drizzle-typebox/0.2.0.md",
    "content": "This version fully updates `drizzle-typebox` integration and makes sure it's compatible with newer typebox versions\n\n# Breaking Changes\n\n> You must also have Drizzle ORM v0.38.0 or greater and Typebox v0.34.8 or greater installed.\n\n- When refining a field, if a schema is provided instead of a callback function, it will ignore the field's nullability and optional status.\n- Some data types have more specific schemas for improved validation\n\n# Improvements\n\nThanks to @L-Mario564 for making more updates than we expected to be shipped in this release. We'll copy his message from a PR regarding improvements made in this release:\n\n- Output for all packages are now unminified, makes exploring the compiled code easier when published to npm.\n- Smaller footprint. Previously, we imported the column types at runtime for each dialect, meaning that for example, if you're just using Postgres then you'd likely only have drizzle-orm and drizzle-orm/pg-core in the build output of your app; however, these packages imported all dialects which could lead to mysql-core and sqlite-core being bundled as well even if they're unused in your app. This is now fixed.\n- Slight performance gain. To determine the column data type we used the is function which performs a few checks to ensure the column data type matches. This was slow, as these checks would pile up every quickly when comparing all data types for many fields in a table/view. The easier and faster alternative is to simply go off of the column's columnType property.\n\n# New features\n\n- `createSelectSchema` function now also accepts views and enums.\n\n```ts\nimport { pgEnum } from 'drizzle-orm/pg-core';\nimport { createSelectSchema } from 'drizzle-typebox';\nimport { Value } from '@sinclair/typebox/value';\n\nconst roles = pgEnum('roles', ['admin', 'basic']);\nconst rolesSchema = createSelectSchema(roles);\nconst parsed: 'admin' | 'basic' = Value.Parse(rolesSchema, ...);\n\nconst usersView = pgView('users_view').as((qb) => qb.select().from(users).where(gt(users.age, 18)));\nconst usersViewSchema = createSelectSchema(usersView);\nconst parsed: { id: number; name: string; age: number } = Value.Parse(usersViewSchema, ...);\n```\n\n- New function: `createUpdateSchema`, for use in updating queries.\n\n```ts copy\nimport { pgTable, text, integer } from 'drizzle-orm/pg-core';\nimport { createUpdateSchema } from 'drizzle-typebox';\nimport { Value } from '@sinclair/typebox/value';\n\nconst users = pgTable('users', {\n  id: integer().generatedAlwaysAsIdentity().primaryKey(),\n  name: text().notNull(),\n  age: integer().notNull()\n});\n\nconst userUpdateSchema = createUpdateSchema(users);\n\nconst user = { id: 5, name: 'John' };\nconst parsed: { name?: string | undefined, age?: number | undefined } = Value.Parse(userUpdateSchema, user); // Error: `id` is a generated column, it can't be updated\n\nconst user = { age: 35 };\nconst parsed: { name?: string | undefined, age?: number | undefined } = Value.Parse(userUpdateSchema, user); // Will parse successfully\nawait db.update(users).set(parsed).where(eq(users.name, 'Jane'));\n```\n\n- New function: `createSchemaFactory`, to provide more advanced options and to avoid bloating the parameters of the other schema functions\n\n```ts copy\nimport { pgTable, text, integer } from 'drizzle-orm/pg-core';\nimport { createSchemaFactory } from 'drizzle-typebox';\nimport { t } from 'elysia'; // Extended Typebox instance\n\nconst users = pgTable('users', {\n  id: integer().generatedAlwaysAsIdentity().primaryKey(),\n  name: text().notNull(),\n  age: integer().notNull()\n});\n\nconst { createInsertSchema } = createSchemaFactory({ typeboxInstance: t });\n\nconst userInsertSchema = createInsertSchema(users, {\n  // We can now use the extended instance\n  name: (schema) => t.Number({ ...schema }, { error: '`name` must be a string' })\n});\n```\n\n- Full support for PG arrays\n\n```ts\npg.dataType().array(...);\n\n// Schema\nType.Array(baseDataTypeSchema, { minItems: size, maxItems: size });\n```"
  },
  {
    "path": "changelogs/drizzle-typebox/0.2.1.md",
    "content": "# Added support for SingleStore dialect\n\n```ts\nimport { singlestoreTable, text, int } from 'drizzle-orm/singlestore-core';\nimport { createSelectSchema } from 'drizzle-typebox';\nimport { Value } from '@sinclair/typebox/value';\n\nconst users = singlestoreTable('users', {\n  id: int().primaryKey(),\n  name: text().notNull(),\n  age: int().notNull()\n});\n\nconst userSelectSchema = createSelectSchema(users);\n\nconst rows = await db.select({ id: users.id, name: users.name }).from(users).limit(1);\nconst parsed: { id: number; name: string; age: number } = Value.Parse(userSelectSchema, rows[0]);  // Error: `age` is not returned in the above query\n\nconst rows = await db.select().from(users).limit(1);\nconst parsed: { id: number; name: string; age: number } = Value.Parse(userSelectSchema, rows[0]);  // Will parse successfully\n```\n\n# Bug fixes\n\n- [[BUG]: drizzle-typebox infers integer() as TString](https://github.com/drizzle-team/drizzle-orm/issues/3756)"
  },
  {
    "path": "changelogs/drizzle-typebox/0.3.0.md",
    "content": "# Bug fixed and GitHub issue closed\n\n- [[BUG]: The inferred type of X cannot be named without a reference to ../../../../../node_modules/drizzle-zod/schema.types.internal.mjs](https://github.com/drizzle-team/drizzle-orm/issues/3732)\n- [[BUG]: drizzle-zod excessively deep and possibly infinite types](https://github.com/drizzle-team/drizzle-orm/issues/3869)"
  },
  {
    "path": "changelogs/drizzle-typebox/0.3.1.md",
    "content": "- Exports all types, including internal ones to avoid type issues.\n- Properly handle infinitely recursive types in custom JSON column types.\n\nthanks @L-Mario564"
  },
  {
    "path": "changelogs/drizzle-typebox/0.3.2.md",
    "content": "- Functions `getColumns`, `handleColumns` and `handleEnum` were exported from `drizzle-typebox`"
  },
  {
    "path": "changelogs/drizzle-typebox/0.3.3.md",
    "content": "- TS language server performance improvements"
  },
  {
    "path": "changelogs/drizzle-valibot/0.1.0.md",
    "content": "# drizzle-valibot 0.1.0\n\n- Initial release"
  },
  {
    "path": "changelogs/drizzle-valibot/0.1.1.md",
    "content": "- 🐛 Fixed imports in ESM projects\n"
  },
  {
    "path": "changelogs/drizzle-valibot/0.2.0.md",
    "content": "Use updated types introduced in valibot `0.20.0`:\n\n- `enumType` -> `picklist`\n- `nullType` -> `null_`\n\nMinimum supported valibot version is now `0.20.0`.\n"
  },
  {
    "path": "changelogs/drizzle-valibot/0.3.0.md",
    "content": "This version fully updates `drizzle-valibot` integration and makes sure it's compatible with newer valibot versions\n\n# Breaking Changes\n\n> You must also have Drizzle ORM v0.38.0 or greater and Valibot v1.0.0-beta.7 or greater installed.\n\n- When refining a field, if a schema is provided instead of a callback function, it will ignore the field's nullability and optional status.\n- Some data types have more specific schemas for improved validation\n\n# Improvements\n\nThanks to @L-Mario564 for making more updates than we expected to be shipped in this release. We'll copy his message from a PR regarding improvements made in this release:\n\n- Output for all packages are now unminified, makes exploring the compiled code easier when published to npm.\n- Smaller footprint. Previously, we imported the column types at runtime for each dialect, meaning that for example, if you're just using Postgres then you'd likely only have drizzle-orm and drizzle-orm/pg-core in the build output of your app; however, these packages imported all dialects which could lead to mysql-core and sqlite-core being bundled as well even if they're unused in your app. This is now fixed.\n- Slight performance gain. To determine the column data type we used the is function which performs a few checks to ensure the column data type matches. This was slow, as these checks would pile up every quickly when comparing all data types for many fields in a table/view. The easier and faster alternative is to simply go off of the column's columnType property.\n- Some changes had to be made at the type level in the ORM package for better compatibility with drizzle-valibot.\n\n# New features\n\n- `createSelectSchema` function now also accepts views and enums.\n\n```ts copy\nimport { pgEnum } from 'drizzle-orm/pg-core';\nimport { createSelectSchema } from 'drizzle-valibot';\nimport { parse } from 'valibot';\n\nconst roles = pgEnum('roles', ['admin', 'basic']);\nconst rolesSchema = createSelectSchema(roles);\nconst parsed: 'admin' | 'basic' = parse(rolesSchema, ...);\n\nconst usersView = pgView('users_view').as((qb) => qb.select().from(users).where(gt(users.age, 18)));\nconst usersViewSchema = createSelectSchema(usersView);\nconst parsed: { id: number; name: string; age: number } = parse(usersViewSchema, ...);\n```\n\n- New function: `createUpdateSchema`, for use in updating queries.\n\n```ts copy\nimport { pgTable, text, integer } from 'drizzle-orm/pg-core';\nimport { createUpdateSchema } from 'drizzle-valibot';\nimport { parse } from 'valibot';\n\nconst users = pgTable('users', {\n  id: integer().generatedAlwaysAsIdentity().primaryKey(),\n  name: text().notNull(),\n  age: integer().notNull()\n});\n\nconst userUpdateSchema = createUpdateSchema(users);\n\nconst user = { id: 5, name: 'John' };\nconst parsed: { name?: string | undefined, age?: number | undefined } = parse(userUpdateSchema, user); // Error: `id` is a generated column, it can't be updated\n\nconst user = { age: 35 };\nconst parsed: { name?: string | undefined, age?: number | undefined } = parse(userUpdateSchema, user); // Will parse successfully\nawait db.update(users).set(parsed).where(eq(users.name, 'Jane'));\n```\n\n- Full support for PG arrays\n\n```ts\npg.dataType().array(...);\n\n// Schema\nz.array(baseDataTypeSchema).length(size);\n```"
  },
  {
    "path": "changelogs/drizzle-valibot/0.3.1.md",
    "content": "# Added support for SingleStore dialect\n\n```ts\nimport { singlestoreTable, text, int } from 'drizzle-orm/singlestore-core';\nimport { createSelectSchema } from 'drizzle-valibot';\nimport { parse } from 'valibot';\n\nconst users = singlestoreTable('users', {\n  id: int().primaryKey(),\n  name: text().notNull(),\n  age: int().notNull()\n});\n\nconst userSelectSchema = createSelectSchema(users);\nconst rows = await db.select({ id: users.id, name: users.name }).from(users).limit(1);\nconst parsed: { id: number; name: string; age: number } = parse(userSelectSchema, rows[0]); // Error: `age` is not returned in the above query\nconst rows = await db.select().from(users).limit(1);\nconst parsed: { id: number; name: string; age: number } = parse(userSelectSchema, rows[0]); // Will parse successfully\n```\n\n# Bug fixes\n\n- [[BUG]: drizzle-valibot throws Type instantiation is excessively deep and possibly infinite. for refinements](https://github.com/drizzle-team/drizzle-orm/issues/3751)\n"
  },
  {
    "path": "changelogs/drizzle-valibot/0.4.0.md",
    "content": "# Bug fixed and GitHub issue closed\n\n- [[BUG]: The inferred type of X cannot be named without a reference to ../../../../../node_modules/drizzle-zod/schema.types.internal.mjs](https://github.com/drizzle-team/drizzle-orm/issues/3732)\n- [[BUG]: drizzle-zod excessively deep and possibly infinite types](https://github.com/drizzle-team/drizzle-orm/issues/3869)"
  },
  {
    "path": "changelogs/drizzle-valibot/0.4.1.md",
    "content": "- Exports all types, including internal ones to avoid type issues.\n- Properly handle infinitely recursive types in custom JSON column types.\n\nthanks @L-Mario564"
  },
  {
    "path": "changelogs/drizzle-valibot/0.4.2.md",
    "content": "- TS language server performance improvements"
  },
  {
    "path": "changelogs/drizzle-zod/0.1.0.md",
    "content": "# drizzle-zod 0.1.0\n\n- Initial release\n- Added insert schema generation for Postgres\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.1.1.md",
    "content": "# drizzle-zod 0.1.1\n\nInternal release\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.1.2.md",
    "content": "# drizzle-zod 0.1.2\n\n- Fix peer dependency error for >=0.16 drizzle packages\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.1.3.md",
    "content": "# drizzle-zod 0.1.3\n\n- Fix import for 0.17 drizzle-orm"
  },
  {
    "path": "changelogs/drizzle-zod/0.1.4.md",
    "content": "- 🐛 Updated logic for drizzle-orm 0.23.2\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.2.0.md",
    "content": "- 🎉 Added select schema support\n- 🎉 Added SQLite support\n- ❗ Changed imports from `drizzle-zod/pg` to `drizzle-zod` for all dialects\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.2.1.md",
    "content": "- 🐛 Fix insert schemas generation\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.3.0.md",
    "content": "- 🎉 Added MySQL support\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.3.1.md",
    "content": "- Fix drizzle-zod default refine type in [479](https://github.com/drizzle-team/drizzle-orm/pull/479) - thanks @hugo-clemente ❤️ "
  },
  {
    "path": "changelogs/drizzle-zod/0.3.2.md",
    "content": "- 🐛 Fixed a bug in schema types inference\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.4.0.md",
    "content": "# ESM support\n\n- 🎉 Added ESM support! You can now use `drizzle-zod` in both ESM and CJS environments.\n- 🎉 Added code minification and source maps.\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.4.1.md",
    "content": "- 🐛 Add \"exports\" field to package.json\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.4.2.md",
    "content": "- 🐛 Fixed autoincrement columns not being optional in drizzle-zod (#652)\n- 🐛 Added length check for text fields in drizzle-zod (#658)\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.4.3.md",
    "content": "- 🎉 Added PgDateString to drizzle-zod (#665)\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.4.4.md",
    "content": "- Fixed drizzle-zod not enforcing string lengths (#691) by @TiltedToast\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.5.0.md",
    "content": "- Added compatibility with Drizzle 0.28.0\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.5.1.md",
    "content": "- 🐛 Fixed imports in ESM projects\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.6.0.md",
    "content": "This version fully updates `drizzle-zod` integration and makes sure it's compatible with newer zod versions\n\n# Breaking Changes\n\n> You must also have Drizzle ORM v0.38.0 or greater and Zod v3.0.0 or greater installed.\n\n- When refining a field, if a schema is provided instead of a callback function, it will ignore the field's nullability and optional status.\n- Some data types have more specific schemas for improved validation\n\n# Improvements\n\nThanks to @L-Mario564 for making more updates than we expected to be shipped in this release. We'll copy his message from a PR regarding improvements made in this release:\n\n- Output for all packages are now unminified, makes exploring the compiled code easier when published to npm.\n- Smaller footprint. Previously, we imported the column types at runtime for each dialect, meaning that for example, if you're just using Postgres then you'd likely only have drizzle-orm and drizzle-orm/pg-core in the build output of your app; however, these packages imported all dialects which could lead to mysql-core and sqlite-core being bundled as well even if they're unused in your app. This is now fixed.\n- Slight performance gain. To determine the column data type we used the is function which performs a few checks to ensure the column data type matches. This was slow, as these checks would pile up every quickly when comparing all data types for many fields in a table/view. The easier and faster alternative is to simply go off of the column's columnType property.\n\n# New features\n\n- `createSelectSchema` function now also accepts views and enums.\n\n```ts copy\nimport { pgEnum } from 'drizzle-orm/pg-core';\nimport { createSelectSchema } from 'drizzle-zod';\n\nconst roles = pgEnum('roles', ['admin', 'basic']);\nconst rolesSchema = createSelectSchema(roles);\nconst parsed: 'admin' | 'basic' = rolesSchema.parse(...);\n\nconst usersView = pgView('users_view').as((qb) => qb.select().from(users).where(gt(users.age, 18)));\nconst usersViewSchema = createSelectSchema(usersView);\nconst parsed: { id: number; name: string; age: number } = usersViewSchema.parse(...);\n```\n\n- New function: `createUpdateSchema`, for use in updating queries.\n\n```ts copy\nimport { pgTable, text, integer } from 'drizzle-orm/pg-core';\nimport { createUpdateSchema } from 'drizzle-zod';\n\nconst users = pgTable('users', {\n  id: integer().generatedAlwaysAsIdentity().primaryKey(),\n  name: text().notNull(),\n  age: integer().notNull()\n});\n\nconst userUpdateSchema = createUpdateSchema(users);\n\nconst user = { id: 5, name: 'John' };\nconst parsed: { name?: string | undefined, age?: number | undefined } = userUpdateSchema.parse(user); // Error: `id` is a generated column, it can't be updated\n\nconst user = { age: 35 };\nconst parsed: { name?: string | undefined, age?: number | undefined } = userUpdateSchema.parse(user); // Will parse successfully\nawait db.update(users).set(parsed).where(eq(users.name, 'Jane'));\n```\n\n- New function: `createSchemaFactory`, to provide more advanced options and to avoid bloating the parameters of the other schema functions\n\n```ts copy\nimport { pgTable, text, integer } from 'drizzle-orm/pg-core';\nimport { createSchemaFactory } from 'drizzle-zod';\nimport { z } from '@hono/zod-openapi'; // Extended Zod instance\n\nconst users = pgTable('users', {\n  id: integer().generatedAlwaysAsIdentity().primaryKey(),\n  name: text().notNull(),\n  age: integer().notNull()\n});\n\nconst { createInsertSchema } = createSchemaFactory({ zodInstance: z });\n\nconst userInsertSchema = createInsertSchema(users, {\n  // We can now use the extended instance\n  name: (schema) => schema.openapi({ example: 'John' })\n});\n```\n\n- Full support for PG arrays\n\n```ts\npg.dataType().array(...);\n\n// Schema\nz.array(baseDataTypeSchema).length(size);\n```"
  },
  {
    "path": "changelogs/drizzle-zod/0.6.1.md",
    "content": "# New Features\n\n## Added support for SingleStore dialect\n\n```ts\nimport { singlestoreTable, text, int } from 'drizzle-orm/singlestore-core';\nimport { createSelectSchema } from 'drizzle-zod';\n\nconst users = singlestoreTable('users', {\n  id: int().primaryKey(),\n  name: text().notNull(),\n  age: int().notNull()\n});\n\nconst userSelectSchema = createSelectSchema(users);\nconst rows = await db.select({ id: users.id, name: users.name }).from(users).limit(1);\nconst parsed: { id: number; name: string; age: number } = userSelectSchema.parse(rows[0]); // Error: `age` is not returned in the above query\n\nconst rows = await db.select().from(users).limit(1);\nconst parsed: { id: number; name: string; age: number } = userSelectSchema.parse(rows[0]); // Will parse successfully\n```\n\n# Bug fixes\n\n- [[BUG]: refining schema using createSelectSchema is not working with drizzle-kit 0.6.0](https://github.com/drizzle-team/drizzle-orm/issues/3735)\n- [[BUG]: drizzle-zod inferring types incorrectly](https://github.com/drizzle-team/drizzle-orm/issues/3734)"
  },
  {
    "path": "changelogs/drizzle-zod/0.7.0.md",
    "content": "# Improvements\n\n## Added type coercion support\n\n**Use case: Type coercion**\n\n```ts copy\nimport { pgTable, timestamp } from 'drizzle-orm/pg-core';\nimport { createSchemaFactory } from 'drizzle-zod';\nimport { z } from 'zod';\n\nconst users = pgTable('users', {\n  ...,\n  createdAt: timestamp().notNull()\n});\n\nconst { createInsertSchema } = createSchemaFactory({\n  // This configuration will only coerce dates. Set `coerce` to `true` to coerce all data types or specify others\n  coerce: {\n    date: true\n  }\n});\n\nconst userInsertSchema = createInsertSchema(users);\n// The above is the same as this:\nconst userInsertSchema = z.object({\n  ...,\n  createdAt: z.coerce.date()\n});\n```\n\n# Bug fixed and GitHub issue closed\n\n- [[BUG]: Cannot use schema.coerce on refining drizzle-zod types](https://github.com/drizzle-team/drizzle-orm/issues/3842)\n- [[FEATURE]: Type Coercion in drizzle-zod](https://github.com/drizzle-team/drizzle-orm/issues/776)\n- [[BUG]: The inferred type of X cannot be named without a reference to ../../../../../node_modules/drizzle-zod/schema.types.internal.mjs](https://github.com/drizzle-team/drizzle-orm/issues/3732)\n- [[BUG]: drizzle-zod excessively deep and possibly infinite types](https://github.com/drizzle-team/drizzle-orm/issues/3869)\n"
  },
  {
    "path": "changelogs/drizzle-zod/0.7.1.md",
    "content": "### Bug fixes\n\n- [[BUG]: createInsertSchema from drizzle-zod@0.6.1 does not infer types correctly but returns unknown for every value](https://github.com/drizzle-team/drizzle-orm/issues/3907)\n- [[BUG]: drizzle-zod excessively deep and possibly infinite types](https://github.com/drizzle-team/drizzle-orm/issues/3869)\n\nthanks @L-Mario564"
  },
  {
    "path": "changelogs/drizzle-zod/0.8.0.md",
    "content": "- Support for Zod v4: Starting with this release, `drizzle-zod` now requires Zod v3.25 or later"
  },
  {
    "path": "changelogs/drizzle-zod/0.8.1.md",
    "content": "- Support for Zod v4: Starting with this release, `drizzle-zod` now requires Zod v3.25.1 or later\n\nThis version was released to resolve several compatibility issues with the `ZodObject` type, which were fixed in `drizzle-orm@0.8.1`, so version `0.8.0` can be skipped"
  },
  {
    "path": "changelogs/drizzle-zod/0.8.2.md",
    "content": "- [[BUG]: drizzle-zod: incorrect inferred types for columns .generatedAlwaysAsIdentity()](https://github.com/drizzle-team/drizzle-orm/issues/4553)"
  },
  {
    "path": "changelogs/drizzle-zod/0.8.3.md",
    "content": "- Update peerDeps for zod"
  },
  {
    "path": "changelogs/eslint-plugin-drizzle/0.2.0.md",
    "content": "# eslint-plugin-drizzle 0.1.0\n\n- Initial release\n- 2 rules available\n"
  },
  {
    "path": "changelogs/eslint-plugin-drizzle/0.2.1.md",
    "content": "# eslint-plugin-drizzle 0.2.1\n\n- Update README.md\n- Change error text message"
  },
  {
    "path": "changelogs/eslint-plugin-drizzle/0.2.2.md",
    "content": "# eslint-plugin-drizzle 0.2.2\n\n- fix: Correct detection of `drizzleObjectName` when it's a nested object\n"
  },
  {
    "path": "changelogs/eslint-plugin-drizzle/0.2.3.md",
    "content": "# eslint-plugin-drizzle 0.2.3\n\n- Added better context to the suggestion in the error message\n- fix: Correct detection of `drizzleObjectName` when it's retrieved from or is a function\n- chore: Refactored duplicate code in `utils/options.ts` into `isDrizzleObjName` function"
  },
  {
    "path": "docs/custom-types.lite.md",
    "content": "# Common way of defining custom types\n\n> [!NOTE]\n> For more advanced documentation about defining custom data types in PostgreSQL and MySQL, please check [`custom-types.md`](custom-types.md).\n\n## Examples\n\nBest way to see, how customType definition is working - is to check how existing data types in postgres and mysql could be defined using `customType` function from Drizzle ORM\n\n### Postgres Data Types using `node-postgres` driver\n\n---\n\n#### **Serial**\n\n```typescript\nconst customSerial = customType<{ data: number; notNull: true; default: true }>(\n  {\n    dataType() {\n      return 'serial';\n    },\n  },\n);\n```\n\n#### **Text**\n\n```typescript\nconst customText = customType<{ data: string }>({\n  dataType() {\n    return 'text';\n  },\n});\n```\n\n#### **Boolean**\n\n```typescript\nconst customBoolean = customType<{ data: boolean }>({\n  dataType() {\n    return 'boolean';\n  },\n});\n```\n\n#### **Jsonb**\n\n```typescript\nconst customJsonb = <TData>(name: string) =>\n  customType<{ data: TData; driverData: string }>({\n    dataType() {\n      return 'jsonb';\n    },\n    toDriver(value: TData): string {\n      return JSON.stringify(value);\n    },\n  })(name);\n```\n\n#### **Timestamp**\n\n```typescript\nconst customTimestamp = customType<\n  {\n    data: Date;\n    driverData: string;\n    config: { withTimezone: boolean; precision?: number };\n  }\n>({\n  dataType(config) {\n    const precision = typeof config.precision !== 'undefined'\n      ? ` (${config.precision})`\n      : '';\n    return `timestamp${precision}${\n      config.withTimezone ? ' with time zone' : ''\n    }`;\n  },\n  fromDriver(value: string): Date {\n    return new Date(value);\n  },\n});\n```\n\n#### Usage for all types will be same as defined functions in Drizzle ORM\n\n```typescript\nconst usersTable = pgTable('users', {\n  id: customSerial('id').primaryKey(),\n  name: customText('name').notNull(),\n  verified: customBoolean('verified').notNull().default(false),\n  jsonb: customJsonb<string[]>('jsonb'),\n  createdAt: customTimestamp('created_at', { withTimezone: true }).notNull()\n    .default(sql`now()`),\n});\n```\n\n### MySql Data Types using `mysql2` driver\n\n---\n\n#### **Serial**\n\n```typescript\nconst customSerial = customType<{ data: number; notNull: true; default: true }>(\n  {\n    dataType() {\n      return 'serial';\n    },\n  },\n);\n```\n\n#### **Text**\n\n```typescript\nconst customText = customType<{ data: string }>({\n  dataType() {\n    return 'text';\n  },\n});\n```\n\n#### **Boolean**\n\n```typescript\nconst customBoolean = customType<{ data: boolean }>({\n  dataType() {\n    return 'boolean';\n  },\n  fromDriver(value) {\n    if (typeof value === 'boolean') {\n      return value;\n    }\n    return value === 1;\n  },\n});\n```\n\n#### **Json**\n\n```typescript\nconst customJson = <TData>(name: string) =>\n  customType<{ data: TData; driverData: string }>({\n    dataType() {\n      return 'json';\n    },\n    toDriver(value: TData): string {\n      return JSON.stringify(value);\n    },\n  })(name);\n```\n\n#### **Timestamp**\n\n```typescript\nconst customTimestamp = customType<\n  { data: Date; driverData: string; config: { fsp: number } }\n>({\n  dataType(config) {\n    const precision = typeof config.fsp !== 'undefined'\n      ? ` (${config.fsp})`\n      : '';\n    return `timestamp${precision}`;\n  },\n  fromDriver(value: string): Date {\n    return new Date(value);\n  },\n});\n```\n\n#### Usage for all types will be same as defined functions in Drizzle ORM\n\n```typescript\nconst usersTable = mysqlTable('userstest', {\n  id: customSerial('id').primaryKey(),\n  name: customText('name').notNull(),\n  verified: customBoolean('verified').notNull().default(false),\n  jsonb: customJson<string[]>('jsonb'),\n  createdAt: customTimestamp('created_at', { fsp: 2 }).notNull().default(\n    sql`now()`,\n  ),\n});\n```\n\nYou can check ts-doc for types and param definition\n\n````typescript\nexport type CustomTypeValues = {\n  /**\n   * Required type for custom column, that will infer proper type model\n   *\n   * Examples:\n   *\n   * If you want your column to be `string` type after selecting/or on inserting - use `data: string`. Like `text`, `varchar`\n   *\n   * If you want your column to be `number` type after selecting/or on inserting - use `data: number`. Like `integer`\n   */\n  data: unknown;\n\n  /**\n   * Type helper, that represents what type database driver is accepting for specific database data type\n   */\n  driverData?: unknown;\n\n  /**\n   * What config type should be used for {@link CustomTypeParams} `dataType` generation\n   */\n  config?: unknown;\n\n  /**\n   * Whether the config argument should be required or not\n   * @default false\n   */\n  configRequired?: boolean;\n\n  /**\n   * If your custom data type should be notNull by default you can use `notNull: true`\n   *\n   * @example\n   * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n   *    dataType() {\n   *      return 'serial';\n   *    },\n   * });\n   */\n  notNull?: boolean;\n\n  /**\n   * If your custom data type has default you can use `default: true`\n   *\n   * @example\n   * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n   *    dataType() {\n   *      return 'serial';\n   *    },\n   * });\n   */\n  default?: boolean;\n};\n\nexport interface CustomTypeParams<T extends Partial<CustomTypeValues>> {\n  /**\n   * Database data type string representation, that is used for migrations\n   * @example\n   * ```\n   * `jsonb`, `text`\n   * ```\n   *\n   * If database data type needs additional params you can use them from `config` param\n   * @example\n   * ```\n   * `varchar(256)`, `numeric(2,3)`\n   * ```\n   *\n   * To make `config` be of specific type please use config generic in {@link CustomTypeValues}\n   *\n   * @example\n   * Usage example\n   * ```\n   *   dataType() {\n   *     return 'boolean';\n   *   },\n   * ```\n   * Or\n   * ```\n   *   dataType(config) {\n   *     return typeof config.length !== 'undefined' ? `varchar(${config.length})` : `varchar`;\n   *   }\n   * ```\n   */\n  dataType: (config: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined)) => string;\n\n  /**\n   * Optional mapping function, between user input and driver\n   * @example\n   * For example, when using jsonb we need to map JS/TS object to string before writing to database\n   * ```\n   * toDriver(value: TData): string {\n   *   return JSON.stringify(value);\n   * }\n   * ```\n   */\n  toDriver?: (value: T['data']) => T['driverData'] | SQL;\n\n  /**\n   * Optional mapping function, that is responsible for data mapping from database to JS/TS code\n   * @example\n   * For example, when using timestamp we need to map string Date representation to JS Date\n   * ```\n   * fromDriver(value: string): Date {\n   *  return new Date(value);\n   * },\n   * ```\n   */\n  fromDriver?: (value: T['driverData']) => T['data'];\n}\n````\n"
  },
  {
    "path": "docs/custom-types.md",
    "content": "# How to define custom types\n\nDrizzle ORM has a big set of predefined column types for different SQL databases. But still there are additional types that are not supported by Drizzle ORM (yet). That could be native pg types or extension types\n\nHere are some instructions on how to create and use your own types with Drizzle ORM\n\n---\n\n## Abstract view on column builder pattern in Drizzle ORM\n\nEach type creation should use 2 classes:\n\n- `ColumnBuilder` - class, that is responsible for generating whole set of needed fields for column creation\n- `Column` - class, that is representing Columns itself, that is used in query generation, migration mapping, etc.\n\n  Each module has it's own class, representing `ColumnBuilder` or `Column`:\n- For `pg` -> `PgColumnBuilder` and `PgColumn`\n- For `mysql` -> `MySqlColumnBuilder` and `MySqlColumn`\n- For `sqlite` -> `SQLiteColumnBuilder` and `SQLiteColumn`\n\n### Builder class explanation - (postgresql text data type example)\n\n- Builder class is responsible for storing TS return type for specific database datatype and override build function to return ready to use column in table\n\n- `TData` - extends return type for column. Current example will infer string type for current datatype used in schema definition\n\n```typescript\nexport class PgTextBuilder<TData extends string = string>\n  extends PgColumnBuilder<\n    ColumnBuilderConfig<{ data: TData; driverParam: string }>\n  >\n{\n  \n\n  build<TTableName extends string>(\n    table: AnyPgTable<{ name: TTableName }>,\n  ): PgText<TTableName, TData> {\n    return new PgText(table, this.config);\n  }\n}\n```\n\n> [!WARNING]\n> `$pgColumnBuilderBrand` should be changed and be equal to class name for new data type builder\n\n### Column class explanation - (postgresql text data type example)\n\n---\nColumn class has set of types/functions, that could be overridden to get needed behavior for custom type\n\n- `TData` - extends return type for column. Current example will infer string type for current datatype used in schema definition\n\n- `getSQLType()` - function, that shows datatype name in database and will be used in migration generation\n\n- `mapFromDriverValue()` - interceptor between database and select query execution. If you want to modify/map/change value for specific data type, it could be done here\n\n#### Usage example for jsonb type\n\n```typescript\noverride mapToDriverValue(value: TData): string {\n  return JSON.stringify(value);\n}\n```\n\n- `mapToDriverValue` - interceptor between user input for insert/update queries and database query. If you want to modify/map/change value for specific data type, it could be done here\n\n#### Usage example for int type\n\n```typescript\noverride mapFromDriverValue(value: number | string): number {\n  if (typeof value === 'string') {\n    return parseInt(value);\n  }\n  return value;\n}\n```\n\n#### Column class example\n\n```typescript\nexport class PgText<TTableName extends string, TData extends string>\n  extends PgColumn<ColumnConfig<{ tableName: TTableName; data: TData; driverParam: string }>> {\n  \n\n  constructor(table: AnyPgTable<{ name: TTableName }>, builder: PgTextBuilder<TData>['config']) {\n    super(table, builder);\n  }\n\n  getSQLType(): string {\n    return 'text';\n  }\n\n  override mapFromDriverValue(value: string): TData {\n    return value as TData\n  }\n\n  override mapToDriverValue(value: TData): string {\n    return value\n  }\n}\n```\n\n> [!WARNING]\n> `$pgColumnBrand` should be changed and be equal to class name for new data type\n\n### Full text data type for PostgreSQL example\n\nFor more postgres data type examples you could check [here](/drizzle-orm/src/pg-core/columns)\n\n```typescript\nimport { ColumnConfig, ColumnBuilderConfig } from 'drizzle-orm';\nimport { AnyPgTable } from 'drizzle-orm/pg-core';\n\nimport { PgColumn, PgColumnBuilder } from './common';\n\nexport class PgTextBuilder<TData extends string = string>\n  extends PgColumnBuilder<\n    ColumnBuilderConfig<{ data: TData; driverParam: string }>\n  >\n{\n  \n\n  build<TTableName extends string>(\n    table: AnyPgTable<{ name: TTableName }>,\n  ): PgText<TTableName, TData> {\n    return new PgText(table, this.config);\n  }\n}\n\nexport class PgText<TTableName extends string, TData extends string>\n  extends PgColumn<\n    ColumnConfig<{ tableName: TTableName; data: TData; driverParam: string }>\n  >\n{\n  \n\n  constructor(\n    table: AnyPgTable<{ name: TTableName }>,\n    builder: PgTextBuilder<TData>['config'],\n  ) {\n    super(table, builder);\n  }\n\n  getSQLType(): string {\n    return 'text';\n  }\n}\n\nexport function text<T extends string = string>(\n  name: string,\n): PgTextBuilder<T> {\n  return new PgTextBuilder(name);\n}\n```\n\n## Custom data type example\n\n> [!NOTE]\n> We will check example on pg module, but current pattern applies to all dialects, that are currently supported by Drizzle ORM\n\n### Setting up CITEXT datatype\n\n> [!NOTE]\n> This type is available only with extensions and used for example, just to show how you could setup any data type you want. Extension support will come soon\n\n### CITEXT data type example\n\n```typescript\nexport class PgCITextBuilder<TData extends string = string> extends PgColumnBuilder<\n  PgColumnBuilderHKT,\n  ColumnBuilderConfig<{ data: TData; driverParam: string }>\n> {\n  protected $pgColumnBuilderBrand: string = 'PgCITextBuilder';\n  \n  build<TTableName extends string>(table: AnyPgTable<{ name: TTableName }>): PgCIText<TTableName, TData> {\n    return new PgCIText(table, this.config);\n  }\n}\n\nexport class PgCIText<TTableName extends string, TData extends string>\n  extends PgColumn<PgColumnHKT, ColumnConfig<{ tableName: TTableName; data: TData; driverParam: string }>>\n{\n  \n\n  constructor(table: AnyPgTable<{ name: TTableName }>, builder: PgCITextBuilder<TData>['config']) {\n    super(table, builder);\n  }\n\n  getSQLType(): string {\n    return 'citext';\n  }\n}\n\nexport function citext<T extends string = string>(name: string): PgCITextBuilder<T> {\n  return new PgCITextBuilder(name);\n}\n```\n\n#### Usage example\n\n```typescript\nconst table = pgTable('table', {\n  id: integer('id').primaryKey(),\n  ciname: citext('ciname')\n})\n```\n\n## Contributing by adding new custom types in Drizzle ORM\n\nYou could add your created custom data types to Drizzle ORM, so everyone can use it.\n\nEach data type should be placed in separate file in `columns` folder and PR open with tag `new-data-type:pg` | `new-data-type:sqlite` | `new-data-type:mysql`\n\nFor more Contribution information - please check [CONTRIBUTING.md](../CONTRIBUTING.md)\n"
  },
  {
    "path": "docs/joins.md",
    "content": "# Drizzle ORM - Joins\n\nAs with other parts of Drizzle ORM, the joins syntax is a balance between the SQL-likeness and type safety.\nHere's an example of how a common \"one-to-many\" relationship can be modelled.\n\n```typescript\nconst users = pgTable('users', {\n  id: serial('id').primaryKey(),\n  firstName: text('first_name').notNull(),\n  lastName: text('last_name'),\n  cityId: int('city_id').references(() => cities.id),\n});\n\nconst cities = pgTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull(),\n});\n```\n\nNow, let's select all cities with all users that live in that city.\n\nThis is how you'd write it in raw SQL:\n\n```sql\nselect\n  cities.id as city_id,\n  cities.name as city_name,\n  users.id as user_id,\n  users.first_name,\n  users.last_name\nfrom cities\nleft join users on users.city_id = cities.id\n```\n\nAnd here's how to do the same with Drizzle ORM:\n\n```typescript\nconst rows = await db\n  .select({\n      cityId: cities.id,\n      cityName: cities.name,\n      userId: users.id,\n      firstName: users.firstName,\n      lastName: users.lastName,\n    })\n  .from(cities)\n  .leftJoin(users, eq(users.cityId, cities.id));\n```\n\n`rows` will have the following type:\n\n```typescript\n{\n  cityId: number;\n  cityName: string;\n  userId: number | null;\n  firstName: string | null;\n  lastName: string | null;\n}[]\n```\n\nAs you can see, all the joined columns have been nullified. This might do the trick if you're using joins to form a single row of results, but in our case we have two separate entities in our row - a city and a user.\nIt might not be very convenient to check every field for nullability separately (or, even worse, just add an `!` after every field to \"make compiler happy\"). It would be much more useful if you could somehow run a single check\nto verify that the user was joined and all of its fields are available.\n\n**To achieve that, you can group the fields of a certain table in a nested object inside of `.select()`:**\n\n```typescript\nconst rows = await db\n  .select({\n    cityId: cities.id,\n    cityName: cities.name,\n    user: {\n      id: users.id,\n      firstName: users.firstName,\n      lastName: users.lastName,\n    },\n  })\n  .from(cities)\n  .leftJoin(users, eq(users.cityId, cities.id));\n```\n\nIn that case, the ORM will use dark TypeScript magic (as if it wasn't already) and figure out that you have a nested object where all the fields belong to the same table. So, the `rows` type will now look like this:\n\n```typescript\n{\n  cityId: number;\n  cityName: string;\n  user: {\n    id: number;\n    firstName: string;\n    lastName: string | null;\n  } | null;\n}\n```\n\nThis is much more convenient! Now, you can just do a single check for `row.user !== null`, and all the user fields will become available.\n\n---\n\nNote that you can group any fields in a nested object however you like, but the single check optimization will only be applied to a certain nested object if all its fields belong to the same table.\nSo, for example, you can group the city fields, too:\n\n```typescript\n.select({\n  city: {\n    id: cities.id,\n    name: cities.name,\n  },\n  user: {\n    id: users.id,\n    firstName: users.firstName,\n    lastName: users.lastName,\n  },\n})\n```\n\nAnd the result type will look like this:\n\n```typescript\n{\n  city: {\n    id: number;\n    name: string;\n  };\n  user: {\n    id: number;\n    firstName: string;\n    lastName: string | null;\n  } | null;\n}\n```\n\n---\n\nIf you just need all the fields from all the tables you're selecting and joining, you can simply omit the argument of the `.select()` method altogether:\n\n```typescript\nconst rows = await db.select().from(cities).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n> [!NOTE]\n> In this case, the Drizzle table/column names will be used as the keys in the result object.\n\n```typescript\n{\n  cities: {\n    id: number;\n    name: string;\n  };\n  users: {\n    id: number;\n    firstName: string;\n    lastName: string | null;\n    cityId: number | null;\n  } | null;\n}[]\n```\n\n---\n\nThere are cases where you'd want to select all the fields from one table, but pick fields from others. In that case, instead of listing all the table fields, you can just pass a table:\n\n```typescript\n.select({\n  cities, // shorthand for \"cities: cities\", the key can be anything\n  user: {\n    firstName: users.firstName,\n  },\n})\n```\n\n```typescript\n{\n  cities: {\n    id: number;\n    name: string;\n  };\n  user: {\n    firstName: string;\n  } | null;\n}\n```\n\n---\n\nBut what happens if you group columns from multiple tables in the same nested object? Nothing, really - they will still be all individually nullable, just grouped under the same object (as you might expect!):\n\n```typescript\n.select({\n  id: cities.id,\n  cityAndUser: {\n    cityName: cities.name,\n    userId: users.id,\n    firstName: users.firstName,\n    lastName: users.lastName,\n  }\n})\n```\n\n```typescript\n{\n  id: number;\n  cityAndUser: {\n    cityName: string;\n    userId: number | null;\n    firstName: string | null;\n    lastName: string | null;\n  };\n}\n```\n\n## Aggregating results\n\nOK, so you have obtained all the cities and the users for every city. But what you **really** wanted is a **list** of users for every city, and what you currently have is an array of `city-user?` combinations. So, how do you transform it?\nThat's the neat part - you can do that however you'd like! No hand-holding here.\n\nFor example, one of the ways to do that would be `Array.reduce()`:\n\n```typescript\nimport { InferModel } from 'drizzle-orm';\n\ntype User = InferModel<typeof users>;\ntype City = InferModel<typeof cities>;\n\nconst rows = await db\n  .select({\n    city: cities,\n    user: users,\n  })\n  .from(cities)\n  .leftJoin(users, eq(users.cityId, cities.id));\n\nconst result = rows.reduce<Record<number, { city: City; users: User[] }>>(\n  (acc, row) => {\n    const city = row.city;\n    const user = row.user;\n\n    if (!acc[city.id]) {\n      acc[city.id] = { city, users: [] };\n    }\n\n    if (user) {\n      acc[city.id].users.push(user);\n    }\n\n    return acc;\n  },\n  {},\n);\n```\n"
  },
  {
    "path": "docs/table-introspect-api.md",
    "content": "# Table introspect API\n\n## Get table information\n\n```ts\nimport { pgTable, getTableConfig } from 'drizzle-orm/pg-core';\n\nconst table = pgTable(...);\n\nconst {\n  columns,\n  indexes,\n  foreignKeys,\n  checks,\n  primaryKeys,\n  name,\n  schema,\n} = getTableConfig(table);\n```\n\n## Get table columns map\n\n```ts\nimport { pgTable, getTableColumns } from 'drizzle-orm/pg-core';\n\nconst table = pgTable('table', {\n  id: integer('id').primaryKey(),\n  name: text('name'),\n});\n\nconst columns/*: { id: ..., name: ... } */ = getTableColumns(table);\n```\n"
  },
  {
    "path": "dprint.json",
    "content": "{\n\t\"typescript\": {\n\t\t\"useTabs\": true,\n\t\t\"quoteStyle\": \"preferSingle\",\n\t\t\"quoteProps\": \"asNeeded\",\n\t\t\"arrowFunction.useParentheses\": \"force\",\n\t\t\"jsx.quoteStyle\": \"preferSingle\"\n\t},\n\t\"json\": {\n\t\t\"useTabs\": true\n\t},\n\t\"markdown\": {},\n\t\"includes\": [\"**/*.{ts,tsx,js,jsx,cjs,mjs,json}\"],\n\t\"excludes\": [\n\t\t\"**/node_modules\",\n\t\t\"dist\",\n\t\t\"dist-dts\",\n\t\t\"dist.new\",\n\t\t\"**/drizzle/**/meta\",\n\t\t\"**/drizzle2/**/meta\",\n\t\t\"**/*snapshot.json\",\n\t\t\"**/_journal.json\",\n\t\t\"**/tsup.config*.mjs\",\n\t\t\"**/.sst\",\n\t\t\"integration-tests/tests/prisma/*/client\",\n\t\t\"integration-tests/tests/prisma/*/drizzle\"\n\t],\n\t\"plugins\": [\n\t\t\"https://plugins.dprint.dev/typescript-0.91.1.wasm\",\n\t\t\"https://plugins.dprint.dev/json-0.19.3.wasm\",\n\t\t\"https://plugins.dprint.dev/markdown-0.17.1.wasm\"\n\t]\n}\n"
  },
  {
    "path": "drizzle-arktype/README.md",
    "content": "`drizzle-arktype` is a plugin for [Drizzle ORM](https://github.com/drizzle-team/drizzle-orm) that allows you to generate [arktype](https://arktype.io/) schemas from Drizzle ORM schemas.\n\n**Features**\n\n- Create a select schema for tables, views and enums.\n- Create insert and update schemas for tables.\n- Supports all dialects: PostgreSQL, MySQL and SQLite.\n\n# Usage\n\n```ts\nimport { pgEnum, pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-arktype';\nimport { type } from 'arktype';\n\nconst users = pgTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n\trole: text('role', { enum: ['admin', 'user'] }).notNull(),\n\tcreatedAt: timestamp('created_at').notNull().defaultNow(),\n});\n\n// Schema for inserting a user - can be used to validate API requests\nconst insertUserSchema = createInsertSchema(users);\n\n// Schema for updating a user - can be used to validate API requests\nconst updateUserSchema = createUpdateSchema(users);\n\n// Schema for selecting a user - can be used to validate API responses\nconst selectUserSchema = createSelectSchema(users);\n\n// Overriding the fields\nconst insertUserSchema = createInsertSchema(users, {\n\trole: type('string'),\n});\n\n// Refining the fields - useful if you want to change the fields before they become nullable/optional in the final schema\nconst insertUserSchema = createInsertSchema(users, {\n\tid: (schema) => schema.atLeast(1),\n\trole: type('string'),\n});\n\n// Usage\n\nconst isUserValid = parse(insertUserSchema, {\n\tname: 'John Doe',\n\temail: 'johndoe@test.com',\n\trole: 'admin',\n});\n```\n"
  },
  {
    "path": "drizzle-arktype/benchmarks/types.ts",
    "content": "import { bench, setup } from '@ark/attest';\nimport { type } from 'arktype';\nimport { boolean, integer, pgTable, text } from 'drizzle-orm/pg-core';\nimport { createSelectSchema } from '~/index.ts';\n\nconst users = pgTable('users', {\n\tid: integer().primaryKey(),\n\tfirstName: text().notNull(),\n\tmiddleName: text(),\n\tlastName: text().notNull(),\n\tage: integer().notNull(),\n\tadmin: boolean().notNull().default(false),\n});\n\nconst teardown = setup();\n\nbench('select schema', () => {\n\treturn createSelectSchema(users);\n}).types([13129, 'instantiations']);\n\nbench('select schema with refinements', () => {\n\treturn createSelectSchema(users, {\n\t\tfirstName: (t) => t.atMostLength(100),\n\t\tmiddleName: (t) => t.atMostLength(100),\n\t\tlastName: (t) => t.atMostLength(100),\n\t\tage: type.number.atLeast(1),\n\t});\n}).types([21631, 'instantiations']);\n\nteardown();\n"
  },
  {
    "path": "drizzle-arktype/package.json",
    "content": "{\n\t\"name\": \"drizzle-arktype\",\n\t\"version\": \"0.1.3\",\n\t\"description\": \"Generate arktype schemas from Drizzle ORM schemas\",\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"build\": \"tsx scripts/build.ts\",\n\t\t\"b\": \"pnpm build\",\n\t\t\"test:types\": \"cd tests && tsc\",\n\t\t\"pack\": \"(cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz\",\n\t\t\"publish\": \"npm publish package.tgz\",\n\t\t\"test\": \"vitest run\",\n\t\t\"bench:types\": \"tsx ./benchmarks/types.ts\"\n\t},\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./index.d.mts\",\n\t\t\t\t\"default\": \"./index.mjs\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./index.d.cjs\",\n\t\t\t\t\"default\": \"./index.cjs\"\n\t\t\t},\n\t\t\t\"types\": \"./index.d.ts\",\n\t\t\t\"default\": \"./index.mjs\"\n\t\t}\n\t},\n\t\"main\": \"./index.cjs\",\n\t\"module\": \"./index.mjs\",\n\t\"types\": \"./index.d.ts\",\n\t\"publishConfig\": {\n\t\t\"provenance\": true\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git+https://github.com/drizzle-team/drizzle-orm.git\"\n\t},\n\t\"keywords\": [\n\t\t\"arktype\",\n\t\t\"validate\",\n\t\t\"validation\",\n\t\t\"schema\",\n\t\t\"drizzle\",\n\t\t\"orm\",\n\t\t\"pg\",\n\t\t\"mysql\",\n\t\t\"postgresql\",\n\t\t\"postgres\",\n\t\t\"sqlite\",\n\t\t\"database\",\n\t\t\"sql\",\n\t\t\"typescript\",\n\t\t\"ts\"\n\t],\n\t\"author\": \"Drizzle Team\",\n\t\"license\": \"Apache-2.0\",\n\t\"peerDependencies\": {\n\t\t\"arktype\": \">=2.0.0\",\n\t\t\"drizzle-orm\": \">=0.36.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@ark/attest\": \"^0.45.8\",\n\t\t\"@rollup/plugin-typescript\": \"^11.1.0\",\n\t\t\"@types/node\": \"^18.15.10\",\n\t\t\"arktype\": \"^2.1.10\",\n\t\t\"cpy\": \"^10.1.0\",\n\t\t\"drizzle-orm\": \"link:../drizzle-orm/dist\",\n\t\t\"json-rules-engine\": \"7.3.1\",\n\t\t\"rimraf\": \"^5.0.0\",\n\t\t\"rollup\": \"^3.29.5\",\n\t\t\"tsx\": \"^4.19.3\",\n\t\t\"vite-tsconfig-paths\": \"^4.3.2\",\n\t\t\"vitest\": \"^3.1.3\",\n\t\t\"zx\": \"^7.2.2\"\n\t}\n}\n"
  },
  {
    "path": "drizzle-arktype/rollup.config.ts",
    "content": "import typescript from '@rollup/plugin-typescript';\nimport { defineConfig } from 'rollup';\n\nexport default defineConfig([\n\t{\n\t\tinput: 'src/index.ts',\n\t\toutput: [\n\t\t\t{\n\t\t\t\tformat: 'esm',\n\t\t\t\tdir: 'dist',\n\t\t\t\tentryFileNames: '[name].mjs',\n\t\t\t\tchunkFileNames: '[name]-[hash].mjs',\n\t\t\t\tsourcemap: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tformat: 'cjs',\n\t\t\t\tdir: 'dist',\n\t\t\t\tentryFileNames: '[name].cjs',\n\t\t\t\tchunkFileNames: '[name]-[hash].cjs',\n\t\t\t\tsourcemap: true,\n\t\t\t},\n\t\t],\n\t\texternal: [\n\t\t\t/^drizzle-orm\\/?/,\n\t\t\t'arktype',\n\t\t],\n\t\tplugins: [\n\t\t\ttypescript({\n\t\t\t\ttsconfig: 'tsconfig.build.json',\n\t\t\t}),\n\t\t],\n\t},\n]);\n"
  },
  {
    "path": "drizzle-arktype/scripts/build.ts",
    "content": "#!/usr/bin/env -S pnpm tsx\nimport 'zx/globals';\nimport cpy from 'cpy';\n\nawait fs.remove('dist');\nawait $`rollup --config rollup.config.ts --configPlugin typescript`;\nawait $`resolve-tspaths`;\nawait fs.copy('README.md', 'dist/README.md');\nawait cpy('dist/**/*.d.ts', 'dist', {\n\trename: (basename) => basename.replace(/\\.d\\.ts$/, '.d.mts'),\n});\nawait cpy('dist/**/*.d.ts', 'dist', {\n\trename: (basename) => basename.replace(/\\.d\\.ts$/, '.d.cts'),\n});\nawait fs.copy('package.json', 'dist/package.json');\nawait $`scripts/fix-imports.ts`;\n"
  },
  {
    "path": "drizzle-arktype/scripts/fix-imports.ts",
    "content": "#!/usr/bin/env -S pnpm tsx\nimport 'zx/globals';\n\nimport path from 'node:path';\nimport { parse, print, visit } from 'recast';\nimport parser from 'recast/parsers/typescript';\n\nfunction resolvePathAlias(importPath: string, file: string) {\n\tif (importPath.startsWith('~/')) {\n\t\tconst relativePath = path.relative(path.dirname(file), path.resolve('dist.new', importPath.slice(2)));\n\t\timportPath = relativePath.startsWith('.') ? relativePath : './' + relativePath;\n\t}\n\n\treturn importPath;\n}\n\nfunction fixImportPath(importPath: string, file: string, ext: string) {\n\timportPath = resolvePathAlias(importPath, file);\n\n\tif (!/\\..*\\.(js|ts)$/.test(importPath)) {\n\t\treturn importPath;\n\t}\n\n\treturn importPath.replace(/\\.(js|ts)$/, ext);\n}\n\nconst cjsFiles = await glob('dist/**/*.{cjs,d.cts}');\n\nawait Promise.all(cjsFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitCallExpression(path) {\n\t\t\tif (path.value.callee.type === 'Identifier' && path.value.callee.name === 'require') {\n\t\t\t\tpath.value.arguments[0].value = fixImportPath(path.value.arguments[0].value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = resolvePathAlias(path.value.argument.value, file);\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n\nlet esmFiles = await glob('dist/**/*.{js,d.ts}');\n\nawait Promise.all(esmFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = fixImportPath(path.value.argument.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.js');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n\nesmFiles = await glob('dist/**/*.{mjs,d.mts}');\n\nawait Promise.all(esmFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.mjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.mjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.mjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = fixImportPath(path.value.argument.value, file, '.mjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.mjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n"
  },
  {
    "path": "drizzle-arktype/src/column.ts",
    "content": "import { type Type, type } from 'arktype';\nimport type { Column, ColumnBaseConfig } from 'drizzle-orm';\nimport type {\n\tMySqlBigInt53,\n\tMySqlChar,\n\tMySqlDouble,\n\tMySqlFloat,\n\tMySqlInt,\n\tMySqlMediumInt,\n\tMySqlReal,\n\tMySqlSerial,\n\tMySqlSmallInt,\n\tMySqlText,\n\tMySqlTinyInt,\n\tMySqlVarChar,\n\tMySqlYear,\n} from 'drizzle-orm/mysql-core';\nimport type {\n\tPgArray,\n\tPgBigInt53,\n\tPgBigSerial53,\n\tPgBinaryVector,\n\tPgChar,\n\tPgDoublePrecision,\n\tPgGeometry,\n\tPgGeometryObject,\n\tPgHalfVector,\n\tPgInteger,\n\tPgLineABC,\n\tPgLineTuple,\n\tPgPointObject,\n\tPgPointTuple,\n\tPgReal,\n\tPgSerial,\n\tPgSmallInt,\n\tPgSmallSerial,\n\tPgUUID,\n\tPgVarchar,\n\tPgVector,\n} from 'drizzle-orm/pg-core';\nimport type {\n\tSingleStoreBigInt53,\n\tSingleStoreChar,\n\tSingleStoreDouble,\n\tSingleStoreFloat,\n\tSingleStoreInt,\n\tSingleStoreMediumInt,\n\tSingleStoreReal,\n\tSingleStoreSerial,\n\tSingleStoreSmallInt,\n\tSingleStoreText,\n\tSingleStoreTinyInt,\n\tSingleStoreVarChar,\n\tSingleStoreYear,\n} from 'drizzle-orm/singlestore-core';\nimport type { SQLiteInteger, SQLiteReal, SQLiteText } from 'drizzle-orm/sqlite-core';\nimport { CONSTANTS } from './constants.ts';\nimport { isColumnType, isWithEnum } from './utils.ts';\n\nexport const literalSchema = type.string.or(type.number).or(type.boolean).or(type.null);\nexport const jsonSchema = literalSchema.or(type.unknown.as<any>().array()).or(type.object.as<Record<string, any>>());\nexport const bufferSchema = type.unknown.narrow((value) => value instanceof Buffer).as<Buffer>().describe( // eslint-disable-line no-instanceof/no-instanceof\n\t'a Buffer instance',\n);\n\nexport function columnToSchema(column: Column): Type {\n\tlet schema!: Type;\n\n\tif (isWithEnum(column)) {\n\t\tschema = column.enumValues.length ? type.enumerated(...column.enumValues) : type.string;\n\t}\n\n\tif (!schema) {\n\t\t// Handle specific types\n\t\tif (isColumnType<PgGeometry<any> | PgPointTuple<any>>(column, ['PgGeometry', 'PgPointTuple'])) {\n\t\t\tschema = type([type.number, type.number]);\n\t\t} else if (\n\t\t\tisColumnType<PgPointObject<any> | PgGeometryObject<any>>(column, ['PgGeometryObject', 'PgPointObject'])\n\t\t) {\n\t\t\tschema = type({\n\t\t\t\tx: type.number,\n\t\t\t\ty: type.number,\n\t\t\t});\n\t\t} else if (isColumnType<PgHalfVector<any> | PgVector<any>>(column, ['PgHalfVector', 'PgVector'])) {\n\t\t\tschema = column.dimensions\n\t\t\t\t? type.number.array().exactlyLength(column.dimensions)\n\t\t\t\t: type.number.array();\n\t\t} else if (isColumnType<PgLineTuple<any>>(column, ['PgLine'])) {\n\t\t\tschema = type([type.number, type.number, type.number]);\n\t\t} else if (isColumnType<PgLineABC<any>>(column, ['PgLineABC'])) {\n\t\t\tschema = type({\n\t\t\t\ta: type.number,\n\t\t\t\tb: type.number,\n\t\t\t\tc: type.number,\n\t\t\t});\n\t\t} // Handle other types\n\t\telse if (isColumnType<PgArray<any, any>>(column, ['PgArray'])) {\n\t\t\tconst arraySchema = columnToSchema(column.baseColumn).array();\n\t\t\tschema = column.size ? arraySchema.exactlyLength(column.size) : arraySchema;\n\t\t} else if (column.dataType === 'array') {\n\t\t\tschema = type.unknown.array();\n\t\t} else if (column.dataType === 'number') {\n\t\t\tschema = numberColumnToSchema(column);\n\t\t} else if (column.dataType === 'bigint') {\n\t\t\tschema = bigintColumnToSchema(column);\n\t\t} else if (column.dataType === 'boolean') {\n\t\t\tschema = type.boolean;\n\t\t} else if (column.dataType === 'date') {\n\t\t\tschema = type.Date;\n\t\t} else if (column.dataType === 'string') {\n\t\t\tschema = stringColumnToSchema(column);\n\t\t} else if (column.dataType === 'json') {\n\t\t\tschema = jsonSchema;\n\t\t} else if (column.dataType === 'custom') {\n\t\t\tschema = type.unknown;\n\t\t} else if (column.dataType === 'buffer') {\n\t\t\tschema = bufferSchema;\n\t\t}\n\t}\n\n\tif (!schema) {\n\t\tschema = type.unknown;\n\t}\n\n\treturn schema;\n}\n\nfunction numberColumnToSchema(column: Column): Type<number, any> {\n\tlet unsigned = column.getSQLType().includes('unsigned');\n\tlet min!: number;\n\tlet max!: number;\n\tlet integer = false;\n\n\tif (isColumnType<MySqlTinyInt<any> | SingleStoreTinyInt<any>>(column, ['MySqlTinyInt', 'SingleStoreTinyInt'])) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT8_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT8_UNSIGNED_MAX : CONSTANTS.INT8_MAX;\n\t\tinteger = true;\n\t} else if (\n\t\tisColumnType<PgSmallInt<any> | PgSmallSerial<any> | MySqlSmallInt<any> | SingleStoreSmallInt<any>>(column, [\n\t\t\t'PgSmallInt',\n\t\t\t'PgSmallSerial',\n\t\t\t'MySqlSmallInt',\n\t\t\t'SingleStoreSmallInt',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT16_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT16_UNSIGNED_MAX : CONSTANTS.INT16_MAX;\n\t\tinteger = true;\n\t} else if (\n\t\tisColumnType<\n\t\t\tPgReal<any> | MySqlFloat<any> | MySqlMediumInt<any> | SingleStoreFloat<any> | SingleStoreMediumInt<any>\n\t\t>(column, [\n\t\t\t'PgReal',\n\t\t\t'MySqlFloat',\n\t\t\t'MySqlMediumInt',\n\t\t\t'SingleStoreFloat',\n\t\t\t'SingleStoreMediumInt',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT24_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT24_UNSIGNED_MAX : CONSTANTS.INT24_MAX;\n\t\tinteger = isColumnType(column, ['MySqlMediumInt', 'SingleStoreMediumInt']);\n\t} else if (\n\t\tisColumnType<PgInteger<any> | PgSerial<any> | MySqlInt<any> | SingleStoreInt<any>>(column, [\n\t\t\t'PgInteger',\n\t\t\t'PgSerial',\n\t\t\t'MySqlInt',\n\t\t\t'SingleStoreInt',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT32_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT32_UNSIGNED_MAX : CONSTANTS.INT32_MAX;\n\t\tinteger = true;\n\t} else if (\n\t\tisColumnType<\n\t\t\t| PgDoublePrecision<any>\n\t\t\t| MySqlReal<any>\n\t\t\t| MySqlDouble<any>\n\t\t\t| SingleStoreReal<any>\n\t\t\t| SingleStoreDouble<any>\n\t\t\t| SQLiteReal<any>\n\t\t>(column, [\n\t\t\t'PgDoublePrecision',\n\t\t\t'MySqlReal',\n\t\t\t'MySqlDouble',\n\t\t\t'SingleStoreReal',\n\t\t\t'SingleStoreDouble',\n\t\t\t'SQLiteReal',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT48_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT48_UNSIGNED_MAX : CONSTANTS.INT48_MAX;\n\t} else if (\n\t\tisColumnType<\n\t\t\t| PgBigInt53<any>\n\t\t\t| PgBigSerial53<any>\n\t\t\t| MySqlBigInt53<any>\n\t\t\t| MySqlSerial<any>\n\t\t\t| SingleStoreBigInt53<any>\n\t\t\t| SingleStoreSerial<any>\n\t\t\t| SQLiteInteger<any>\n\t\t>(\n\t\t\tcolumn,\n\t\t\t[\n\t\t\t\t'PgBigInt53',\n\t\t\t\t'PgBigSerial53',\n\t\t\t\t'MySqlBigInt53',\n\t\t\t\t'MySqlSerial',\n\t\t\t\t'SingleStoreBigInt53',\n\t\t\t\t'SingleStoreSerial',\n\t\t\t\t'SQLiteInteger',\n\t\t\t],\n\t\t)\n\t) {\n\t\tunsigned = unsigned || isColumnType(column, ['MySqlSerial', 'SingleStoreSerial']);\n\t\tmin = unsigned ? 0 : Number.MIN_SAFE_INTEGER;\n\t\tmax = Number.MAX_SAFE_INTEGER;\n\t\tinteger = true;\n\t} else if (isColumnType<MySqlYear<any> | SingleStoreYear<any>>(column, ['MySqlYear', 'SingleStoreYear'])) {\n\t\tmin = 1901;\n\t\tmax = 2155;\n\t\tinteger = true;\n\t} else {\n\t\tmin = Number.MIN_SAFE_INTEGER;\n\t\tmax = Number.MAX_SAFE_INTEGER;\n\t}\n\n\treturn (integer ? type.keywords.number.integer : type.number).atLeast(min).atMost(max);\n}\n\n/** @internal */\nexport const unsignedBigintNarrow = (v: bigint, ctx: { mustBe: (expected: string) => false }) =>\n\tv < 0n ? ctx.mustBe('greater than') : v > CONSTANTS.INT64_UNSIGNED_MAX ? ctx.mustBe('less than') : true;\n\n/** @internal */\nexport const bigintNarrow = (v: bigint, ctx: { mustBe: (expected: string) => false }) =>\n\tv < CONSTANTS.INT64_MIN ? ctx.mustBe('greater than') : v > CONSTANTS.INT64_MAX ? ctx.mustBe('less than') : true;\n\nfunction bigintColumnToSchema(column: Column): Type {\n\tconst unsigned = column.getSQLType().includes('unsigned');\n\treturn type.bigint.narrow(unsigned ? unsignedBigintNarrow : bigintNarrow);\n}\n\nfunction stringColumnToSchema(column: Column): Type {\n\tif (isColumnType<PgUUID<ColumnBaseConfig<'string', 'PgUUID'>>>(column, ['PgUUID'])) {\n\t\treturn type(/^[\\da-f]{8}(?:-[\\da-f]{4}){3}-[\\da-f]{12}$/iu).describe('a RFC-4122-compliant UUID');\n\t}\n\tif (\n\t\tisColumnType<\n\t\t\tPgBinaryVector<\n\t\t\t\tColumnBaseConfig<'string', 'PgBinaryVector'> & {\n\t\t\t\t\tdimensions: number;\n\t\t\t\t}\n\t\t\t>\n\t\t>(column, ['PgBinaryVector'])\n\t) {\n\t\treturn type(`/^[01]{${column.dimensions}}$/`)\n\t\t\t.describe(`a string containing ones or zeros while being ${column.dimensions} characters long`);\n\t}\n\n\tlet max: number | undefined;\n\tlet fixed = false;\n\n\tif (isColumnType<PgVarchar<any> | SQLiteText<any>>(column, ['PgVarchar', 'SQLiteText'])) {\n\t\tmax = column.length;\n\t} else if (\n\t\tisColumnType<MySqlVarChar<any> | SingleStoreVarChar<any>>(column, ['MySqlVarChar', 'SingleStoreVarChar'])\n\t) {\n\t\tmax = column.length ?? CONSTANTS.INT16_UNSIGNED_MAX;\n\t} else if (isColumnType<MySqlText<any> | SingleStoreText<any>>(column, ['MySqlText', 'SingleStoreText'])) {\n\t\tif (column.textType === 'longtext') {\n\t\t\tmax = CONSTANTS.INT32_UNSIGNED_MAX;\n\t\t} else if (column.textType === 'mediumtext') {\n\t\t\tmax = CONSTANTS.INT24_UNSIGNED_MAX;\n\t\t} else if (column.textType === 'text') {\n\t\t\tmax = CONSTANTS.INT16_UNSIGNED_MAX;\n\t\t} else {\n\t\t\tmax = CONSTANTS.INT8_UNSIGNED_MAX;\n\t\t}\n\t}\n\n\tif (\n\t\tisColumnType<PgChar<any> | MySqlChar<any> | SingleStoreChar<any>>(column, [\n\t\t\t'PgChar',\n\t\t\t'MySqlChar',\n\t\t\t'SingleStoreChar',\n\t\t])\n\t) {\n\t\tmax = column.length;\n\t\tfixed = true;\n\t}\n\n\treturn max && fixed ? type.string.exactlyLength(max) : max ? type.string.atMostLength(max) : type.string;\n}\n"
  },
  {
    "path": "drizzle-arktype/src/column.types.ts",
    "content": "import { Type, type } from 'arktype';\nimport type { Column } from 'drizzle-orm';\nimport type { Json } from './utils.ts';\n\nexport type ArktypeNullable<TSchema> = Type<type.infer<TSchema> | null>;\n\nexport type ArktypeOptional<TSchema> = [Type<type.infer<TSchema>>, '?'];\n\nexport type GetArktypeType<\n\tTColumn extends Column,\n> = TColumn['_']['columnType'] extends\n\t'PgJson' | 'PgJsonb' | 'MySqlJson' | 'SingleStoreJson' | 'SQLiteTextJson' | 'SQLiteBlobJson'\n\t? unknown extends TColumn['_']['data'] ? Type<Json> : Type<TColumn['_']['data']>\n\t: Type<TColumn['_']['data']>;\n\ntype HandleSelectColumn<\n\tTSchema,\n\tTColumn extends Column,\n> = TColumn['_']['notNull'] extends true ? TSchema\n\t: ArktypeNullable<TSchema>;\n\ntype HandleInsertColumn<\n\tTSchema,\n\tTColumn extends Column,\n> = TColumn['_']['notNull'] extends true ? TColumn['_']['hasDefault'] extends true ? ArktypeOptional<TSchema>\n\t: TSchema\n\t: ArktypeOptional<ArktypeNullable<TSchema>>;\n\ntype HandleUpdateColumn<\n\tTSchema,\n\tTColumn extends Column,\n> = TColumn['_']['notNull'] extends true ? ArktypeOptional<TSchema>\n\t: ArktypeOptional<ArktypeNullable<TSchema>>;\n\nexport type HandleColumn<\n\tTType extends 'select' | 'insert' | 'update',\n\tTColumn extends Column,\n> = TType extends 'select' ? HandleSelectColumn<GetArktypeType<TColumn>, TColumn>\n\t: TType extends 'insert' ? HandleInsertColumn<GetArktypeType<TColumn>, TColumn>\n\t: TType extends 'update' ? HandleUpdateColumn<GetArktypeType<TColumn>, TColumn>\n\t: GetArktypeType<TColumn>;\n"
  },
  {
    "path": "drizzle-arktype/src/constants.ts",
    "content": "export const CONSTANTS = {\n\tINT8_MIN: -128,\n\tINT8_MAX: 127,\n\tINT8_UNSIGNED_MAX: 255,\n\tINT16_MIN: -32768,\n\tINT16_MAX: 32767,\n\tINT16_UNSIGNED_MAX: 65535,\n\tINT24_MIN: -8388608,\n\tINT24_MAX: 8388607,\n\tINT24_UNSIGNED_MAX: 16777215,\n\tINT32_MIN: -2147483648,\n\tINT32_MAX: 2147483647,\n\tINT32_UNSIGNED_MAX: 4294967295,\n\tINT48_MIN: -140737488355328,\n\tINT48_MAX: 140737488355327,\n\tINT48_UNSIGNED_MAX: 281474976710655,\n\tINT64_MIN: -9223372036854775808n,\n\tINT64_MAX: 9223372036854775807n,\n\tINT64_UNSIGNED_MAX: 18446744073709551615n,\n};\n"
  },
  {
    "path": "drizzle-arktype/src/index.ts",
    "content": "export { bufferSchema, jsonSchema, literalSchema } from './column.ts';\nexport * from './column.types.ts';\nexport * from './schema.ts';\nexport * from './schema.types.internal.ts';\nexport * from './schema.types.ts';\nexport * from './utils.ts';\n"
  },
  {
    "path": "drizzle-arktype/src/schema.ts",
    "content": "import { Type, type } from 'arktype';\nimport { Column, getTableColumns, getViewSelectedFields, is, isTable, isView, SQL } from 'drizzle-orm';\nimport type { Table, View } from 'drizzle-orm';\nimport type { PgEnum } from 'drizzle-orm/pg-core';\nimport { columnToSchema } from './column.ts';\nimport type { Conditions } from './schema.types.internal.ts';\nimport type { CreateInsertSchema, CreateSelectSchema, CreateUpdateSchema } from './schema.types.ts';\nimport { isPgEnum } from './utils.ts';\n\nfunction getColumns(tableLike: Table | View) {\n\treturn isTable(tableLike) ? getTableColumns(tableLike) : getViewSelectedFields(tableLike);\n}\n\nfunction handleColumns(\n\tcolumns: Record<string, any>,\n\trefinements: Record<string, any>,\n\tconditions: Conditions,\n): Type {\n\tconst columnSchemas: Record<string, Type> = {};\n\n\tfor (const [key, selected] of Object.entries(columns)) {\n\t\tif (!is(selected, Column) && !is(selected, SQL) && !is(selected, SQL.Aliased) && typeof selected === 'object') {\n\t\t\tconst columns = isTable(selected) || isView(selected) ? getColumns(selected) : selected;\n\t\t\tcolumnSchemas[key] = handleColumns(columns, refinements[key] ?? {}, conditions);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst refinement = refinements[key];\n\t\tif (\n\t\t\trefinement !== undefined\n\t\t\t&& (typeof refinement !== 'function' || (typeof refinement === 'function' && refinement.expression !== undefined))\n\t\t) {\n\t\t\tcolumnSchemas[key] = refinement;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst column = is(selected, Column) ? selected : undefined;\n\t\tconst schema = column ? columnToSchema(column) : type.unknown;\n\t\tconst refined = typeof refinement === 'function' ? refinement(schema) : schema;\n\n\t\tif (conditions.never(column)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tcolumnSchemas[key] = refined;\n\t\t}\n\n\t\tif (column) {\n\t\t\tif (conditions.nullable(column)) {\n\t\t\t\tcolumnSchemas[key] = columnSchemas[key]!.or(type.null);\n\t\t\t}\n\n\t\t\tif (conditions.optional(column)) {\n\t\t\t\tcolumnSchemas[key] = columnSchemas[key]!.optional() as any;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn type(columnSchemas);\n}\n\nexport const createSelectSchema = ((\n\tentity: Table | View | PgEnum<[string, ...string[]]>,\n\trefine?: Record<string, any>,\n) => {\n\tif (isPgEnum(entity)) {\n\t\treturn type.enumerated(...entity.enumValues);\n\t}\n\tconst columns = getColumns(entity);\n\treturn handleColumns(columns, refine ?? {}, {\n\t\tnever: () => false,\n\t\toptional: () => false,\n\t\tnullable: (column) => !column.notNull,\n\t}) as any;\n}) as CreateSelectSchema;\n\nexport const createInsertSchema = ((\n\tentity: Table,\n\trefine?: Record<string, any>,\n) => {\n\tconst columns = getColumns(entity);\n\treturn handleColumns(columns, refine ?? {}, {\n\t\tnever: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',\n\t\toptional: (column) => !column.notNull || (column.notNull && column.hasDefault),\n\t\tnullable: (column) => !column.notNull,\n\t}) as any;\n}) as CreateInsertSchema;\n\nexport const createUpdateSchema = ((\n\tentity: Table,\n\trefine?: Record<string, any>,\n) => {\n\tconst columns = getColumns(entity);\n\treturn handleColumns(columns, refine ?? {}, {\n\t\tnever: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',\n\t\toptional: () => true,\n\t\tnullable: (column) => !column.notNull,\n\t}) as any;\n}) as CreateUpdateSchema;\n"
  },
  {
    "path": "drizzle-arktype/src/schema.types.internal.ts",
    "content": "import type { Type, type } from 'arktype';\nimport type { Column, DrizzleTypeError, SelectedFieldsFlat, Simplify, Table, View } from 'drizzle-orm';\nimport type { ArktypeNullable, ArktypeOptional, GetArktypeType, HandleColumn } from './column.types.ts';\nimport type { ColumnIsGeneratedAlwaysAs, GetSelection } from './utils.ts';\n\nexport interface Conditions {\n\tnever: (column?: Column) => boolean;\n\toptional: (column: Column) => boolean;\n\tnullable: (column: Column) => boolean;\n}\n\ntype GenericSchema = type.cast<unknown> | [type.cast<unknown>, '?'];\n\ntype BuildRefineField<T> = T extends GenericSchema ? ((schema: T) => GenericSchema) | GenericSchema : never;\n\nexport type BuildRefine<\n\tTColumns extends Record<string, any>,\n> = {\n\t[K in keyof TColumns as TColumns[K] extends Column | SelectedFieldsFlat<Column> | Table | View ? K : never]?:\n\t\tTColumns[K] extends Column ? BuildRefineField<GetArktypeType<TColumns[K]>>\n\t\t\t: BuildRefine<GetSelection<TColumns[K]>>;\n};\n\ntype HandleRefinement<\n\tTType extends 'select' | 'insert' | 'update',\n\tTRefinement,\n\tTColumn extends Column,\n> = TRefinement extends (schema: any) => GenericSchema ? (\n\t\tTColumn['_']['notNull'] extends true ? ReturnType<TRefinement>\n\t\t\t: ArktypeNullable<ReturnType<TRefinement>>\n\t) extends infer TSchema ? TType extends 'update' ? ArktypeOptional<TSchema>\n\t\t: TSchema\n\t: Type<any>\n\t: TRefinement;\n\ntype IsRefinementDefined<\n\tTRefinements extends Record<string | symbol | number, any> | undefined,\n\tTKey extends string | symbol | number,\n> = TRefinements extends object ? TRefinements[TKey] extends GenericSchema | ((schema: any) => any) ? true\n\t: false\n\t: false;\n\nexport type BuildSchema<\n\tTType extends 'select' | 'insert' | 'update',\n\tTColumns extends Record<string, any>,\n\tTRefinements extends Record<string, any> | undefined,\n> = type.instantiate<\n\tSimplify<\n\t\t{\n\t\t\treadonly [K in keyof TColumns as ColumnIsGeneratedAlwaysAs<TColumns[K]> extends true ? never : K]:\n\t\t\t\tTColumns[K] extends infer TColumn extends Column\n\t\t\t\t\t? IsRefinementDefined<TRefinements, K> extends true\n\t\t\t\t\t\t? HandleRefinement<TType, TRefinements[K & keyof TRefinements], TColumn>\n\t\t\t\t\t: HandleColumn<TType, TColumn>\n\t\t\t\t\t: TColumns[K] extends infer TNested extends SelectedFieldsFlat<Column> | Table | View ? BuildSchema<\n\t\t\t\t\t\t\tTType,\n\t\t\t\t\t\t\tGetSelection<TNested>,\n\t\t\t\t\t\t\tTRefinements extends object ? TRefinements[K & keyof TRefinements] : undefined\n\t\t\t\t\t\t>\n\t\t\t\t\t: any;\n\t\t}\n\t>\n>;\n\nexport type NoUnknownKeys<\n\tTRefinement extends Record<string, any>,\n\tTCompare extends Record<string, any>,\n> = {\n\t[K in keyof TRefinement]: K extends keyof TCompare\n\t\t? TRefinement[K] extends Record<string, GenericSchema> ? NoUnknownKeys<TRefinement[K], TCompare[K]>\n\t\t: TRefinement[K]\n\t\t: DrizzleTypeError<`Found unknown key in refinement: \"${K & string}\"`>;\n};\n"
  },
  {
    "path": "drizzle-arktype/src/schema.types.ts",
    "content": "import type { Type } from 'arktype';\nimport type { Table, View } from 'drizzle-orm';\nimport type { PgEnum } from 'drizzle-orm/pg-core';\nimport type { BuildRefine, BuildSchema, NoUnknownKeys } from './schema.types.internal.ts';\n\nexport interface CreateSelectSchema {\n\t<TTable extends Table>(table: TTable): BuildSchema<'select', TTable['_']['columns'], undefined>;\n\t<\n\t\tTTable extends Table,\n\t\tTRefine extends BuildRefine<TTable['_']['columns']>,\n\t>(\n\t\ttable: TTable,\n\t\trefine?: NoUnknownKeys<TRefine, TTable['$inferSelect']>,\n\t): BuildSchema<'select', TTable['_']['columns'], TRefine>;\n\n\t<TView extends View>(view: TView): BuildSchema<'select', TView['_']['selectedFields'], undefined>;\n\t<\n\t\tTView extends View,\n\t\tTRefine extends BuildRefine<TView['_']['selectedFields']>,\n\t>(\n\t\tview: TView,\n\t\trefine: NoUnknownKeys<TRefine, TView['$inferSelect']>,\n\t): BuildSchema<'select', TView['_']['selectedFields'], TRefine>;\n\n\t<TEnum extends PgEnum<any>>(enum_: TEnum): Type<TEnum['enumValues'][number]>;\n}\n\nexport interface CreateInsertSchema {\n\t<TTable extends Table>(table: TTable): BuildSchema<'insert', TTable['_']['columns'], undefined>;\n\t<\n\t\tTTable extends Table,\n\t\tTRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>>,\n\t>(\n\t\ttable: TTable,\n\t\trefine?: NoUnknownKeys<TRefine, TTable['$inferInsert']>,\n\t): BuildSchema<'insert', TTable['_']['columns'], TRefine>;\n}\n\nexport interface CreateUpdateSchema {\n\t<TTable extends Table>(table: TTable): BuildSchema<'update', TTable['_']['columns'], undefined>;\n\t<\n\t\tTTable extends Table,\n\t\tTRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>>,\n\t>(\n\t\ttable: TTable,\n\t\trefine?: TRefine,\n\t): BuildSchema<'update', TTable['_']['columns'], TRefine>;\n}\n"
  },
  {
    "path": "drizzle-arktype/src/utils.ts",
    "content": "import type { type } from 'arktype';\nimport type { Column, SelectedFieldsFlat, Table, View } from 'drizzle-orm';\nimport type { PgEnum } from 'drizzle-orm/pg-core';\nimport type { literalSchema } from './column.ts';\n\nexport function isColumnType<T extends Column>(column: Column, columnTypes: string[]): column is T {\n\treturn columnTypes.includes(column.columnType);\n}\n\nexport function isWithEnum(column: Column): column is typeof column & { enumValues: [string, ...string[]] } {\n\treturn 'enumValues' in column && Array.isArray(column.enumValues) && column.enumValues.length > 0;\n}\n\nexport const isPgEnum: (entity: any) => entity is PgEnum<[string, ...string[]]> = isWithEnum as any;\n\ntype Literal = type.infer<typeof literalSchema>;\nexport type Json = Literal | Record<string, any> | any[];\n\nexport type ColumnIsGeneratedAlwaysAs<TColumn> = TColumn extends Column\n\t? TColumn['_']['identity'] extends 'always' ? true\n\t: TColumn['_']['generated'] extends { type: 'byDefault' } | undefined ? false\n\t: true\n\t: false;\n\nexport type GetSelection<T extends SelectedFieldsFlat<Column> | Table | View> = T extends Table ? T['_']['columns']\n\t: T extends View ? T['_']['selectedFields']\n\t: T;\n"
  },
  {
    "path": "drizzle-arktype/tests/mysql.test.ts",
    "content": "import { Type, type } from 'arktype';\nimport { type Equal, sql } from 'drizzle-orm';\nimport { customType, int, json, mysqlSchema, mysqlTable, mysqlView, serial, text } from 'drizzle-orm/mysql-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport { test } from 'vitest';\nimport { bigintNarrow, jsonSchema, unsignedBigintNarrow } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSelectSchema, createUpdateSchema } from '../src';\nimport { Expect, expectSchemaShape } from './utils.ts';\n\nconst intSchema = type.keywords.number.integer.atLeast(CONSTANTS.INT32_MIN).atMost(CONSTANTS.INT32_MAX);\nconst serialNumberModeSchema = type.keywords.number.integer.atLeast(0).atMost(Number.MAX_SAFE_INTEGER);\nconst textSchema = type.string.atMostLength(CONSTANTS.INT16_UNSIGNED_MAX);\n\ntest('table - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table in schema - select', (tc) => {\n\tconst schema = mysqlSchema('test');\n\tconst table = schema.table('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = type({\n\t\tid: serialNumberModeSchema.optional(),\n\t\tname: textSchema,\n\t\tage: intSchema.or(type.null).optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = type({\n\t\tid: serialNumberModeSchema.optional(),\n\t\tname: textSchema.optional(),\n\t\tage: intSchema.or(type.null).optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view qb - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = mysqlView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = type({ id: serialNumberModeSchema, age: type('unknown.any') });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view columns - select', (t) => {\n\tconst view = mysqlView('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = type({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view with nested fields - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = mysqlView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tid: table.id,\n\t\t\tnested: {\n\t\t\t\tname: table.name,\n\t\t\t\tage: sql``.as('age'),\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = type({\n\t\tid: serialNumberModeSchema,\n\t\tnested: type({ name: textSchema, age: type('unknown.any') }),\n\t\ttable: type({ id: serialNumberModeSchema, name: textSchema }),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null),\n\t\tc2: intSchema,\n\t\tc3: intSchema.or(type.null),\n\t\tc4: intSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null).optional(),\n\t\tc2: intSchema,\n\t\tc3: intSchema.or(type.null).optional(),\n\t\tc4: intSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - update', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null).optional(),\n\t\tc2: intSchema.optional(),\n\t\tc3: intSchema.or(type.null).optional(),\n\t\tc4: intSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null),\n\t\tc2: intSchema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (t) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = type.string.atLeastLength(1).atMostLength(100);\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null),\n\t\tc2: intSchema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null).optional(),\n\t\tc2: intSchema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null).optional(),\n\t\tc2: intSchema.atMost(1000).optional(),\n\t\tc3: type.string.pipe(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine view - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int(),\n\t\tc3: int(),\n\t\tc4: int(),\n\t\tc5: int(),\n\t\tc6: int(),\n\t});\n\tconst view = mysqlView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tc1: table.c1,\n\t\t\tc2: table.c2,\n\t\t\tc3: table.c3,\n\t\t\tnested: {\n\t\t\t\tc4: table.c4,\n\t\t\t\tc5: table.c5,\n\t\t\t\tc6: table.c6,\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t\tnested: {\n\t\t\tc5: (schema) => schema.atMost(1000),\n\t\t\tc6: type.string.pipe(Number),\n\t\t},\n\t\ttable: {\n\t\t\tc2: (schema) => schema.atMost(1000),\n\t\t\tc3: type.string.pipe(Number),\n\t\t},\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null),\n\t\tc2: intSchema.atMost(1000).or(type.null),\n\t\tc3: type.string.pipe(Number),\n\t\tnested: type({\n\t\t\tc4: intSchema.or(type.null),\n\t\t\tc5: intSchema.atMost(1000).or(type.null),\n\t\t\tc6: type.string.pipe(Number),\n\t\t}),\n\t\ttable: type({\n\t\t\tc1: intSchema.or(type.null),\n\t\t\tc2: intSchema.atMost(1000).or(type.null),\n\t\t\tc3: type.string.pipe(Number),\n\t\t\tc4: intSchema.or(type.null),\n\t\t\tc5: intSchema.or(type.null),\n\t\t\tc6: intSchema.or(type.null),\n\t\t}),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('all data types', (t) => {\n\tconst table = mysqlTable('test', ({\n\t\tbigint,\n\t\tbinary,\n\t\tboolean,\n\t\tchar,\n\t\tdate,\n\t\tdatetime,\n\t\tdecimal,\n\t\tdouble,\n\t\tfloat,\n\t\tint,\n\t\tjson,\n\t\tmediumint,\n\t\tmysqlEnum,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\ttext,\n\t\ttime,\n\t\ttimestamp,\n\t\ttinyint,\n\t\tvarchar,\n\t\tvarbinary,\n\t\tyear,\n\t\tlongtext,\n\t\tmediumtext,\n\t\ttinytext,\n\t}) => ({\n\t\tbigint1: bigint({ mode: 'number' }).notNull(),\n\t\tbigint2: bigint({ mode: 'bigint' }).notNull(),\n\t\tbigint3: bigint({ unsigned: true, mode: 'number' }).notNull(),\n\t\tbigint4: bigint({ unsigned: true, mode: 'bigint' }).notNull(),\n\t\tbinary: binary({ length: 10 }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\tchar1: char({ length: 10 }).notNull(),\n\t\tchar2: char({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tdate1: date({ mode: 'date' }).notNull(),\n\t\tdate2: date({ mode: 'string' }).notNull(),\n\t\tdatetime1: datetime({ mode: 'date' }).notNull(),\n\t\tdatetime2: datetime({ mode: 'string' }).notNull(),\n\t\tdecimal1: decimal().notNull(),\n\t\tdecimal2: decimal({ unsigned: true }).notNull(),\n\t\tdouble1: double().notNull(),\n\t\tdouble2: double({ unsigned: true }).notNull(),\n\t\tfloat1: float().notNull(),\n\t\tfloat2: float({ unsigned: true }).notNull(),\n\t\tint1: int().notNull(),\n\t\tint2: int({ unsigned: true }).notNull(),\n\t\tjson: json().notNull(),\n\t\tmediumint1: mediumint().notNull(),\n\t\tmediumint2: mediumint({ unsigned: true }).notNull(),\n\t\tenum: mysqlEnum('enum', ['a', 'b', 'c']).notNull(),\n\t\treal: real().notNull(),\n\t\tserial: serial().notNull(),\n\t\tsmallint1: smallint().notNull(),\n\t\tsmallint2: smallint({ unsigned: true }).notNull(),\n\t\ttext1: text().notNull(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttime: time().notNull(),\n\t\ttimestamp1: timestamp({ mode: 'date' }).notNull(),\n\t\ttimestamp2: timestamp({ mode: 'string' }).notNull(),\n\t\ttinyint1: tinyint().notNull(),\n\t\ttinyint2: tinyint({ unsigned: true }).notNull(),\n\t\tvarchar1: varchar({ length: 10 }).notNull(),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tvarbinary: varbinary({ length: 10 }).notNull(),\n\t\tyear: year().notNull(),\n\t\tlongtext1: longtext().notNull(),\n\t\tlongtext2: longtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\tmediumtext1: mediumtext().notNull(),\n\t\tmediumtext2: mediumtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttinytext1: tinytext().notNull(),\n\t\ttinytext2: tinytext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({\n\t\tbigint1: type.keywords.number.integer.atLeast(Number.MIN_SAFE_INTEGER).atMost(Number.MAX_SAFE_INTEGER),\n\t\tbigint2: type.bigint.narrow(bigintNarrow),\n\t\tbigint3: type.keywords.number.integer.atLeast(0).atMost(Number.MAX_SAFE_INTEGER),\n\t\tbigint4: type.bigint.narrow(unsignedBigintNarrow),\n\t\tbinary: type.string,\n\t\tboolean: type.boolean,\n\t\tchar1: type.string.exactlyLength(10),\n\t\tchar2: type.enumerated('a', 'b', 'c'),\n\t\tdate1: type.Date,\n\t\tdate2: type.string,\n\t\tdatetime1: type.Date,\n\t\tdatetime2: type.string,\n\t\tdecimal1: type.string,\n\t\tdecimal2: type.string,\n\t\tdouble1: type.number.atLeast(CONSTANTS.INT48_MIN).atMost(CONSTANTS.INT48_MAX),\n\t\tdouble2: type.number.atLeast(0).atMost(CONSTANTS.INT48_UNSIGNED_MAX),\n\t\tfloat1: type.number.atLeast(CONSTANTS.INT24_MIN).atMost(CONSTANTS.INT24_MAX),\n\t\tfloat2: type.number.atLeast(0).atMost(CONSTANTS.INT24_UNSIGNED_MAX),\n\t\tint1: type.keywords.number.integer.atLeast(CONSTANTS.INT32_MIN).atMost(CONSTANTS.INT32_MAX),\n\t\tint2: type.keywords.number.integer.atLeast(0).atMost(CONSTANTS.INT32_UNSIGNED_MAX),\n\t\tjson: jsonSchema,\n\t\tmediumint1: type.keywords.number.integer.atLeast(CONSTANTS.INT24_MIN).atMost(CONSTANTS.INT24_MAX),\n\t\tmediumint2: type.keywords.number.integer.atLeast(0).atMost(CONSTANTS.INT24_UNSIGNED_MAX),\n\t\tenum: type.enumerated('a', 'b', 'c'),\n\t\treal: type.number.atLeast(CONSTANTS.INT48_MIN).atMost(CONSTANTS.INT48_MAX),\n\t\tserial: type.keywords.number.integer.atLeast(0).atMost(Number.MAX_SAFE_INTEGER),\n\t\tsmallint1: type.keywords.number.integer.atLeast(CONSTANTS.INT16_MIN).atMost(CONSTANTS.INT16_MAX),\n\t\tsmallint2: type.keywords.number.integer.atLeast(0).atMost(CONSTANTS.INT16_UNSIGNED_MAX),\n\t\ttext1: type.string.atMostLength(CONSTANTS.INT16_UNSIGNED_MAX),\n\t\ttext2: type.enumerated('a', 'b', 'c'),\n\t\ttime: type.string,\n\t\ttimestamp1: type.Date,\n\t\ttimestamp2: type.string,\n\t\ttinyint1: type.keywords.number.integer.atLeast(CONSTANTS.INT8_MIN).atMost(CONSTANTS.INT8_MAX),\n\t\ttinyint2: type.keywords.number.integer.atLeast(0).atMost(CONSTANTS.INT8_UNSIGNED_MAX),\n\t\tvarchar1: type.string.atMostLength(10),\n\t\tvarchar2: type.enumerated('a', 'b', 'c'),\n\t\tvarbinary: type.string,\n\t\tyear: type.keywords.number.integer.atLeast(1901).atMost(2155),\n\t\tlongtext1: type.string.atMostLength(CONSTANTS.INT32_UNSIGNED_MAX),\n\t\tlongtext2: type.enumerated('a', 'b', 'c'),\n\t\tmediumtext1: type.string.atMostLength(CONSTANTS.INT24_UNSIGNED_MAX),\n\t\tmediumtext2: type.enumerated('a', 'b', 'c'),\n\t\ttinytext1: type.string.atMostLength(CONSTANTS.INT8_UNSIGNED_MAX),\n\t\ttinytext2: type.enumerated('a', 'b', 'c'),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: Type<TopLevelCondition, {}> = type('unknown.any') as any;\n\tconst table = mysqlTable('test', {\n\t\tjson: json().$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = type({\n\t\tjson: TopLevelCondition.or(type.null),\n\t});\n\tExpect<Equal<type.infer<typeof result>, type.infer<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = mysqlTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: type.string });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = mysqlTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: type.string });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = mysqlTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: type.string });\n}\n\n/* Disallow unknown keys in view qb - select */ {\n\tconst table = mysqlTable('test', { id: int() });\n\tconst view = mysqlView('test').as((qb) => qb.select().from(table));\n\tconst nestedSelect = mysqlView('test').as((qb) => qb.select({ table }).from(table));\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: type.string });\n\t// @ts-expect-error\n\tcreateSelectSchema(nestedSelect, { table: { unknown: type.string } });\n}\n\n/* Disallow unknown keys in view columns - select */ {\n\tconst view = mysqlView('test', { id: int() }).as(sql``);\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: type.string });\n}\n"
  },
  {
    "path": "drizzle-arktype/tests/pg.test.ts",
    "content": "import { Type, type } from 'arktype';\nimport { type Equal, sql } from 'drizzle-orm';\nimport {\n\tcustomType,\n\tinteger,\n\tjson,\n\tjsonb,\n\tpgEnum,\n\tpgMaterializedView,\n\tpgSchema,\n\tpgTable,\n\tpgView,\n\tserial,\n\ttext,\n} from 'drizzle-orm/pg-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport { test } from 'vitest';\nimport { bigintNarrow, jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSelectSchema, createUpdateSchema } from '../src';\nimport { Expect, expectEnumValues, expectSchemaShape } from './utils.ts';\n\nconst integerSchema = type.keywords.number.integer.atLeast(CONSTANTS.INT32_MIN).atMost(CONSTANTS.INT32_MAX);\nconst textSchema = type.string;\n\ntest('table - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table in schema - select', (tc) => {\n\tconst schema = pgSchema('test');\n\tconst table = schema.table('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: integer().generatedAlwaysAsIdentity().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: integer(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = type({ name: textSchema, age: integerSchema.or(type.null).optional() });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: integer().generatedAlwaysAsIdentity().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: integer(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = type({\n\t\tname: textSchema.optional(),\n\t\tage: integerSchema.or(type.null).optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view qb - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = pgView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = type({ id: integerSchema, age: type('unknown.any') });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view columns - select', (t) => {\n\tconst view = pgView('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = type({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('materialized view qb - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = pgMaterializedView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = type({ id: integerSchema, age: type('unknown.any') });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('materialized view columns - select', (t) => {\n\tconst view = pgView('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = type({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view with nested fields - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = pgMaterializedView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tid: table.id,\n\t\t\tnested: {\n\t\t\t\tname: table.name,\n\t\t\t\tage: sql``.as('age'),\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = type({\n\t\tid: integerSchema,\n\t\tnested: { name: textSchema, age: type('unknown.any') },\n\t\ttable: { id: integerSchema, name: textSchema },\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('enum - select', (t) => {\n\tconst enum_ = pgEnum('test', ['a', 'b', 'c']);\n\n\tconst result = createSelectSchema(enum_);\n\tconst expected = type.enumerated('a', 'b', 'c');\n\texpectEnumValues(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().default(1),\n\t\tc4: integer().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({\n\t\tc1: integerSchema.or(type.null),\n\t\tc2: integerSchema,\n\t\tc3: integerSchema.or(type.null),\n\t\tc4: integerSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().default(1),\n\t\tc4: integer().notNull().default(1),\n\t\tc5: integer().generatedAlwaysAs(1),\n\t\tc6: integer().generatedAlwaysAsIdentity(),\n\t\tc7: integer().generatedByDefaultAsIdentity(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = type({\n\t\tc1: integerSchema.or(type.null).optional(),\n\t\tc2: integerSchema,\n\t\tc3: integerSchema.or(type.null).optional(),\n\t\tc4: integerSchema.optional(),\n\t\tc7: integerSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n});\n\ntest('nullability - update', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().default(1),\n\t\tc4: integer().notNull().default(1),\n\t\tc5: integer().generatedAlwaysAs(1),\n\t\tc6: integer().generatedAlwaysAsIdentity(),\n\t\tc7: integer().generatedByDefaultAsIdentity(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = type({\n\t\tc1: integerSchema.or(type.null).optional(),\n\t\tc2: integerSchema.optional(),\n\t\tc3: integerSchema.or(type.null).optional(),\n\t\tc4: integerSchema.optional(),\n\t\tc7: integerSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\tconst expected = type({\n\t\tc1: integerSchema.or(type.null),\n\t\tc2: integerSchema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (t) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = type.string.atLeastLength(1).atMostLength(100);\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = type({\n\t\tc1: integerSchema.or(type.null),\n\t\tc2: integerSchema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t\tc4: integer().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\tconst expected = type({\n\t\tc1: integerSchema.or(type.null).optional(),\n\t\tc2: integerSchema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t\tc4: integer().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\tconst expected = type({\n\t\tc1: integerSchema.or(type.null).optional(),\n\t\tc2: integerSchema.atMost(1000).optional(),\n\t\tc3: type.string.pipe(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine view - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer(),\n\t\tc3: integer(),\n\t\tc4: integer(),\n\t\tc5: integer(),\n\t\tc6: integer(),\n\t});\n\tconst view = pgView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tc1: table.c1,\n\t\t\tc2: table.c2,\n\t\t\tc3: table.c3,\n\t\t\tnested: {\n\t\t\t\tc4: table.c4,\n\t\t\t\tc5: table.c5,\n\t\t\t\tc6: table.c6,\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t\tnested: {\n\t\t\tc5: (schema) => schema.atMost(1000),\n\t\t\tc6: type.string.pipe(Number),\n\t\t},\n\t\ttable: {\n\t\t\tc2: (schema) => schema.atMost(1000),\n\t\t\tc3: type.string.pipe(Number),\n\t\t},\n\t});\n\tconst expected = type({\n\t\tc1: integerSchema.or(type.null),\n\t\tc2: integerSchema.atMost(1000).or(type.null),\n\t\tc3: type.string.pipe(Number),\n\t\tnested: type({\n\t\t\tc4: integerSchema.or(type.null),\n\t\t\tc5: integerSchema.atMost(1000).or(type.null),\n\t\t\tc6: type.string.pipe(Number),\n\t\t}),\n\t\ttable: type({\n\t\t\tc1: integerSchema.or(type.null),\n\t\t\tc2: integerSchema.atMost(1000).or(type.null),\n\t\t\tc3: type.string.pipe(Number),\n\t\t\tc4: integerSchema.or(type.null),\n\t\t\tc5: integerSchema.or(type.null),\n\t\t\tc6: integerSchema.or(type.null),\n\t\t}),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('all data types', (t) => {\n\tconst table = pgTable('test', ({\n\t\tbigint,\n\t\tbigserial,\n\t\tbit,\n\t\tboolean,\n\t\tdate,\n\t\tchar,\n\t\tcidr,\n\t\tdoublePrecision,\n\t\tgeometry,\n\t\thalfvec,\n\t\tinet,\n\t\tinteger,\n\t\tinterval,\n\t\tjson,\n\t\tjsonb,\n\t\tline,\n\t\tmacaddr,\n\t\tmacaddr8,\n\t\tnumeric,\n\t\tpoint,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\tsmallserial,\n\t\ttext,\n\t\tsparsevec,\n\t\ttime,\n\t\ttimestamp,\n\t\tuuid,\n\t\tvarchar,\n\t\tvector,\n\t}) => ({\n\t\tbigint1: bigint({ mode: 'number' }).notNull(),\n\t\tbigint2: bigint({ mode: 'bigint' }).notNull(),\n\t\tbigserial1: bigserial({ mode: 'number' }).notNull(),\n\t\tbigserial2: bigserial({ mode: 'bigint' }).notNull(),\n\t\tbit: bit({ dimensions: 5 }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\tdate1: date({ mode: 'date' }).notNull(),\n\t\tdate2: date({ mode: 'string' }).notNull(),\n\t\tchar1: char({ length: 10 }).notNull(),\n\t\tchar2: char({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tcidr: cidr().notNull(),\n\t\tdoublePrecision: doublePrecision().notNull(),\n\t\tgeometry1: geometry({ type: 'point', mode: 'tuple' }).notNull(),\n\t\tgeometry2: geometry({ type: 'point', mode: 'xy' }).notNull(),\n\t\thalfvec: halfvec({ dimensions: 3 }).notNull(),\n\t\tinet: inet().notNull(),\n\t\tinteger: integer().notNull(),\n\t\tinterval: interval().notNull(),\n\t\tjson: json().notNull(),\n\t\tjsonb: jsonb().notNull(),\n\t\tline1: line({ mode: 'abc' }).notNull(),\n\t\tline2: line({ mode: 'tuple' }).notNull(),\n\t\tmacaddr: macaddr().notNull(),\n\t\tmacaddr8: macaddr8().notNull(),\n\t\tnumeric: numeric().notNull(),\n\t\tpoint1: point({ mode: 'xy' }).notNull(),\n\t\tpoint2: point({ mode: 'tuple' }).notNull(),\n\t\treal: real().notNull(),\n\t\tserial: serial().notNull(),\n\t\tsmallint: smallint().notNull(),\n\t\tsmallserial: smallserial().notNull(),\n\t\ttext1: text().notNull(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\tsparsevec: sparsevec({ dimensions: 3 }).notNull(),\n\t\ttime: time().notNull(),\n\t\ttimestamp1: timestamp({ mode: 'date' }).notNull(),\n\t\ttimestamp2: timestamp({ mode: 'string' }).notNull(),\n\t\tuuid: uuid().notNull(),\n\t\tvarchar1: varchar({ length: 10 }).notNull(),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tvector: vector({ dimensions: 3 }).notNull(),\n\t\tarray1: integer().array().notNull(),\n\t\tarray2: integer().array().array(2).notNull(),\n\t\tarray3: varchar({ length: 10 }).array().array(2).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({\n\t\tbigint1: type.keywords.number.integer.atLeast(Number.MIN_SAFE_INTEGER).atMost(Number.MAX_SAFE_INTEGER),\n\t\tbigint2: type.bigint.narrow(bigintNarrow),\n\t\tbigserial1: type.keywords.number.integer.atLeast(Number.MIN_SAFE_INTEGER).atMost(Number.MAX_SAFE_INTEGER),\n\t\tbigserial2: type.bigint.narrow(bigintNarrow),\n\t\tbit: type(/^[01]{5}$/).describe('a string containing ones or zeros while being 5 characters long'),\n\t\tboolean: type.boolean,\n\t\tdate1: type.Date,\n\t\tdate2: type.string,\n\t\tchar1: type.string.exactlyLength(10),\n\t\tchar2: type.enumerated('a', 'b', 'c'),\n\t\tcidr: type.string,\n\t\tdoublePrecision: type.number.atLeast(CONSTANTS.INT48_MIN).atMost(CONSTANTS.INT48_MAX),\n\t\tgeometry1: type([type.number, type.number]),\n\t\tgeometry2: type({ x: type.number, y: type.number }),\n\t\thalfvec: type.number.array().exactlyLength(3),\n\t\tinet: type.string,\n\t\tinteger: type.keywords.number.integer.atLeast(CONSTANTS.INT32_MIN).atMost(CONSTANTS.INT32_MAX),\n\t\tinterval: type.string,\n\t\tjson: jsonSchema,\n\t\tjsonb: jsonSchema,\n\t\tline1: type({ a: type.number, b: type.number, c: type.number }),\n\t\tline2: type([type.number, type.number, type.number]),\n\t\tmacaddr: type.string,\n\t\tmacaddr8: type.string,\n\t\tnumeric: type.string,\n\t\tpoint1: type({ x: type.number, y: type.number }),\n\t\tpoint2: type([type.number, type.number]),\n\t\treal: type.number.atLeast(CONSTANTS.INT24_MIN).atMost(CONSTANTS.INT24_MAX),\n\t\tserial: type.keywords.number.integer.atLeast(CONSTANTS.INT32_MIN).atMost(CONSTANTS.INT32_MAX),\n\t\tsmallint: type.keywords.number.integer.atLeast(CONSTANTS.INT16_MIN).atMost(CONSTANTS.INT16_MAX),\n\t\tsmallserial: type.keywords.number.integer.atLeast(CONSTANTS.INT16_MIN).atMost(CONSTANTS.INT16_MAX),\n\t\ttext1: type.string,\n\t\ttext2: type.enumerated('a', 'b', 'c'),\n\t\tsparsevec: type.string,\n\t\ttime: type.string,\n\t\ttimestamp1: type.Date,\n\t\ttimestamp2: type.string,\n\t\tuuid: type(/^[\\da-f]{8}(?:-[\\da-f]{4}){3}-[\\da-f]{12}$/iu).describe('a RFC-4122-compliant UUID'),\n\t\tvarchar1: type.string.atMostLength(10),\n\t\tvarchar2: type.enumerated('a', 'b', 'c'),\n\t\tvector: type.number.array().exactlyLength(3),\n\t\tarray1: integerSchema.array(),\n\t\tarray2: integerSchema.array().array().exactlyLength(2),\n\t\tarray3: type.string.atMostLength(10).array().array().exactlyLength(2),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: Type<TopLevelCondition, {}> = type('unknown.any') as any;\n\tconst table = pgTable('test', {\n\t\tjson: json().$type<TopLevelCondition>().notNull(),\n\t\tjsonb: jsonb().$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = type({\n\t\tjson: TopLevelCondition,\n\t\tjsonb: TopLevelCondition.or(type.null),\n\t});\n\tExpect<Equal<type.infer<typeof result>, type.infer<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = pgTable('test', { id: integer() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: type.string });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = pgTable('test', { id: integer() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: type.string });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = pgTable('test', { id: integer() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: type.string });\n}\n\n/* Disallow unknown keys in view qb - select */ {\n\tconst table = pgTable('test', { id: integer() });\n\tconst view = pgView('test').as((qb) => qb.select().from(table));\n\tconst mView = pgMaterializedView('test').as((qb) => qb.select().from(table));\n\tconst nestedSelect = pgView('test').as((qb) => qb.select({ table }).from(table));\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: type.string });\n\t// @ts-expect-error\n\tcreateSelectSchema(mView, { unknown: type.string });\n\t// @ts-expect-error\n\tcreateSelectSchema(nestedSelect, { table: { unknown: type.string } });\n}\n\n/* Disallow unknown keys in view columns - select */ {\n\tconst view = pgView('test', { id: integer() }).as(sql``);\n\tconst mView = pgView('test', { id: integer() }).as(sql``);\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: type.string });\n\t// @ts-expect-error\n\tcreateSelectSchema(mView, { unknown: type.string });\n}\n"
  },
  {
    "path": "drizzle-arktype/tests/singlestore.test.ts",
    "content": "import { Type, type } from 'arktype';\nimport { type Equal } from 'drizzle-orm';\nimport { customType, int, json, serial, singlestoreSchema, singlestoreTable, text } from 'drizzle-orm/singlestore-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport { test } from 'vitest';\nimport { bigintNarrow, jsonSchema, unsignedBigintNarrow } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSelectSchema, createUpdateSchema } from '../src';\nimport { Expect, expectSchemaShape } from './utils.ts';\n\nconst intSchema = type.keywords.number.integer.atLeast(CONSTANTS.INT32_MIN).atMost(CONSTANTS.INT32_MAX);\nconst serialNumberModeSchema = type.keywords.number.integer.atLeast(0).atMost(Number.MAX_SAFE_INTEGER);\nconst textSchema = type.string.atMostLength(CONSTANTS.INT16_UNSIGNED_MAX);\n\ntest('table - select', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table in schema - select', (tc) => {\n\tconst schema = singlestoreSchema('test');\n\tconst table = schema.table('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = type({\n\t\tid: serialNumberModeSchema.optional(),\n\t\tname: textSchema,\n\t\tage: intSchema.or(type.null).optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = type({\n\t\tid: serialNumberModeSchema.optional(),\n\t\tname: textSchema.optional(),\n\t\tage: intSchema.or(type.null).optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n// TODO: SingleStore doesn't support views yet. Add these tests when they're added\n\n// test('view qb - select', (t) => {\n// \tconst table = singlestoreTable('test', {\n// \t\tid: serial().primaryKey(),\n// \t\tname: text().notNull(),\n// \t});\n// \tconst view = mysqlView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n// \tconst result = createSelectSchema(view);\n// \tconst expected = v.object({ id: serialNumberModeSchema, age: v.any() });\n// \texpectSchemaShape(t, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\n// test('view columns - select', (t) => {\n// \tconst view = mysqlView('test', {\n// \t\tid: serial().primaryKey(),\n// \t\tname: text().notNull(),\n// \t}).as(sql``);\n\n// \tconst result = createSelectSchema(view);\n// \tconst expected = v.object({ id: serialNumberModeSchema, name: textSchema });\n// \texpectSchemaShape(t, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\n// test('view with nested fields - select', (t) => {\n// \tconst table = singlestoreTable('test', {\n// \t\tid: serial().primaryKey(),\n// \t\tname: text().notNull(),\n// \t});\n// \tconst view = mysqlView('test').as((qb) =>\n// \t\tqb.select({\n// \t\t\tid: table.id,\n// \t\t\tnested: {\n// \t\t\t\tname: table.name,\n// \t\t\t\tage: sql``.as('age'),\n// \t\t\t},\n// \t\t\ttable,\n// \t\t}).from(table)\n// \t);\n\n// \tconst result = createSelectSchema(view);\n// \tconst expected = v.object({\n// \t\tid: serialNumberModeSchema,\n// \t\tnested: v.object({ name: textSchema, age: v.any() }),\n// \t\ttable: v.object({ id: serialNumberModeSchema, name: textSchema }),\n// \t});\n// \texpectSchemaShape(t, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\ntest('nullability - select', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null),\n\t\tc2: intSchema,\n\t\tc3: intSchema.or(type.null),\n\t\tc4: intSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null).optional(),\n\t\tc2: intSchema,\n\t\tc3: intSchema.or(type.null).optional(),\n\t\tc4: intSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - update', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null).optional(),\n\t\tc2: intSchema.optional(),\n\t\tc3: intSchema.or(type.null).optional(),\n\t\tc4: intSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null),\n\t\tc2: intSchema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (t) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = type.string.atLeastLength(1).atMostLength(100);\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null),\n\t\tc2: intSchema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null).optional(),\n\t\tc2: intSchema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null).optional(),\n\t\tc2: intSchema.atMost(1000).optional(),\n\t\tc3: type.string.pipe(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n// test('refine view - select', (t) => {\n// \tconst table = singlestoreTable('test', {\n// \t\tc1: int(),\n// \t\tc2: int(),\n// \t\tc3: int(),\n// \t\tc4: int(),\n// \t\tc5: int(),\n// \t\tc6: int(),\n// \t});\n// \tconst view = mysqlView('test').as((qb) =>\n// \t\tqb.select({\n// \t\t\tc1: table.c1,\n// \t\t\tc2: table.c2,\n// \t\t\tc3: table.c3,\n// \t\t\tnested: {\n// \t\t\t\tc4: table.c4,\n// \t\t\t\tc5: table.c5,\n// \t\t\t\tc6: table.c6,\n// \t\t\t},\n// \t\t\ttable,\n// \t\t}).from(table)\n// \t);\n\n// \tconst result = createSelectSchema(view, {\n// \t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n// \t\tc3: v.pipe(type.string, v.transform(Number)),\n// \t\tnested: {\n// \t\t\tc5: (schema) => v.pipe(schema, v.maxValue(1000)),\n// \t\t\tc6: v.pipe(type.string, v.transform(Number)),\n// \t\t},\n// \t\ttable: {\n// \t\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n// \t\t\tc3: v.pipe(type.string, v.transform(Number)),\n// \t\t},\n// \t});\n// \tconst expected = v.object({\n// \t\tc1: v.nullable(intSchema),\n// \t\tc2: v.nullable(v.pipe(intSchema, v.maxValue(1000))),\n// \t\tc3: v.pipe(type.string, v.transform(Number)),\n// \t\tnested: v.object({\n// \t\t\tc4: v.nullable(intSchema),\n// \t\t\tc5: v.nullable(v.pipe(intSchema, v.maxValue(1000))),\n// \t\t\tc6: v.pipe(type.string, v.transform(Number)),\n// \t\t}),\n// \t\ttable: v.object({\n// \t\t\tc1: v.nullable(intSchema),\n// \t\t\tc2: v.nullable(v.pipe(intSchema, v.maxValue(1000))),\n// \t\t\tc3: v.pipe(type.string, v.transform(Number)),\n// \t\t\tc4: v.nullable(intSchema),\n// \t\t\tc5: v.nullable(intSchema),\n// \t\t\tc6: v.nullable(intSchema),\n// \t\t}),\n// \t});\n// \texpectSchemaShape(t, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\ntest('all data types', (t) => {\n\tconst table = singlestoreTable('test', ({\n\t\tbigint,\n\t\tbinary,\n\t\tboolean,\n\t\tchar,\n\t\tdate,\n\t\tdatetime,\n\t\tdecimal,\n\t\tdouble,\n\t\tfloat,\n\t\tint,\n\t\tjson,\n\t\tmediumint,\n\t\tsinglestoreEnum,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\ttext,\n\t\ttime,\n\t\ttimestamp,\n\t\ttinyint,\n\t\tvarchar,\n\t\tvarbinary,\n\t\tyear,\n\t\tlongtext,\n\t\tmediumtext,\n\t\ttinytext,\n\t}) => ({\n\t\tbigint1: bigint({ mode: 'number' }).notNull(),\n\t\tbigint2: bigint({ mode: 'bigint' }).notNull(),\n\t\tbigint3: bigint({ unsigned: true, mode: 'number' }).notNull(),\n\t\tbigint4: bigint({ unsigned: true, mode: 'bigint' }).notNull(),\n\t\tbinary: binary({ length: 10 }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\tchar1: char({ length: 10 }).notNull(),\n\t\tchar2: char({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tdate1: date({ mode: 'date' }).notNull(),\n\t\tdate2: date({ mode: 'string' }).notNull(),\n\t\tdatetime1: datetime({ mode: 'date' }).notNull(),\n\t\tdatetime2: datetime({ mode: 'string' }).notNull(),\n\t\tdecimal1: decimal().notNull(),\n\t\tdecimal2: decimal({ unsigned: true }).notNull(),\n\t\tdouble1: double().notNull(),\n\t\tdouble2: double({ unsigned: true }).notNull(),\n\t\tfloat1: float().notNull(),\n\t\tfloat2: float({ unsigned: true }).notNull(),\n\t\tint1: int().notNull(),\n\t\tint2: int({ unsigned: true }).notNull(),\n\t\tjson: json().notNull(),\n\t\tmediumint1: mediumint().notNull(),\n\t\tmediumint2: mediumint({ unsigned: true }).notNull(),\n\t\tenum: singlestoreEnum('enum', ['a', 'b', 'c']).notNull(),\n\t\treal: real().notNull(),\n\t\tserial: serial().notNull(),\n\t\tsmallint1: smallint().notNull(),\n\t\tsmallint2: smallint({ unsigned: true }).notNull(),\n\t\ttext1: text().notNull(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttime: time().notNull(),\n\t\ttimestamp1: timestamp({ mode: 'date' }).notNull(),\n\t\ttimestamp2: timestamp({ mode: 'string' }).notNull(),\n\t\ttinyint1: tinyint().notNull(),\n\t\ttinyint2: tinyint({ unsigned: true }).notNull(),\n\t\tvarchar1: varchar({ length: 10 }).notNull(),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tvarbinary: varbinary({ length: 10 }).notNull(),\n\t\tyear: year().notNull(),\n\t\tlongtext1: longtext().notNull(),\n\t\tlongtext2: longtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\tmediumtext1: mediumtext().notNull(),\n\t\tmediumtext2: mediumtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttinytext1: tinytext().notNull(),\n\t\ttinytext2: tinytext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({\n\t\tbigint1: type.keywords.number.integer.atLeast(Number.MIN_SAFE_INTEGER).atMost(Number.MAX_SAFE_INTEGER),\n\t\tbigint2: type.bigint.narrow(bigintNarrow),\n\t\tbigint3: type.keywords.number.integer.atLeast(0).atMost(Number.MAX_SAFE_INTEGER),\n\t\tbigint4: type.bigint.narrow(unsignedBigintNarrow),\n\t\tbinary: type.string,\n\t\tboolean: type.boolean,\n\t\tchar1: type.string.exactlyLength(10),\n\t\tchar2: type.enumerated('a', 'b', 'c'),\n\t\tdate1: type.Date,\n\t\tdate2: type.string,\n\t\tdatetime1: type.Date,\n\t\tdatetime2: type.string,\n\t\tdecimal1: type.string,\n\t\tdecimal2: type.string,\n\t\tdouble1: type.number.atLeast(CONSTANTS.INT48_MIN).atMost(CONSTANTS.INT48_MAX),\n\t\tdouble2: type.number.atLeast(0).atMost(CONSTANTS.INT48_UNSIGNED_MAX),\n\t\tfloat1: type.number.atLeast(CONSTANTS.INT24_MIN).atMost(CONSTANTS.INT24_MAX),\n\t\tfloat2: type.number.atLeast(0).atMost(CONSTANTS.INT24_UNSIGNED_MAX),\n\t\tint1: type.keywords.number.integer.atLeast(CONSTANTS.INT32_MIN).atMost(CONSTANTS.INT32_MAX),\n\t\tint2: type.keywords.number.integer.atLeast(0).atMost(CONSTANTS.INT32_UNSIGNED_MAX),\n\t\tjson: jsonSchema,\n\t\tmediumint1: type.keywords.number.integer.atLeast(CONSTANTS.INT24_MIN).atMost(CONSTANTS.INT24_MAX),\n\t\tmediumint2: type.keywords.number.integer.atLeast(0).atMost(CONSTANTS.INT24_UNSIGNED_MAX),\n\t\tenum: type.enumerated('a', 'b', 'c'),\n\t\treal: type.number.atLeast(CONSTANTS.INT48_MIN).atMost(CONSTANTS.INT48_MAX),\n\t\tserial: type.keywords.number.integer.atLeast(0).atMost(Number.MAX_SAFE_INTEGER),\n\t\tsmallint1: type.keywords.number.integer.atLeast(CONSTANTS.INT16_MIN).atMost(CONSTANTS.INT16_MAX),\n\t\tsmallint2: type.keywords.number.integer.atLeast(0).atMost(CONSTANTS.INT16_UNSIGNED_MAX),\n\t\ttext1: type.string.atMostLength(CONSTANTS.INT16_UNSIGNED_MAX),\n\t\ttext2: type.enumerated('a', 'b', 'c'),\n\t\ttime: type.string,\n\t\ttimestamp1: type.Date,\n\t\ttimestamp2: type.string,\n\t\ttinyint1: type.keywords.number.integer.atLeast(CONSTANTS.INT8_MIN).atMost(CONSTANTS.INT8_MAX),\n\t\ttinyint2: type.keywords.number.integer.atLeast(0).atMost(CONSTANTS.INT8_UNSIGNED_MAX),\n\t\tvarchar1: type.string.atMostLength(10),\n\t\tvarchar2: type.enumerated('a', 'b', 'c'),\n\t\tvarbinary: type.string,\n\t\tyear: type.keywords.number.integer.atLeast(1901).atMost(2155),\n\t\tlongtext1: type.string.atMostLength(CONSTANTS.INT32_UNSIGNED_MAX),\n\t\tlongtext2: type.enumerated('a', 'b', 'c'),\n\t\tmediumtext1: type.string.atMostLength(CONSTANTS.INT24_UNSIGNED_MAX),\n\t\tmediumtext2: type.enumerated('a', 'b', 'c'),\n\t\ttinytext1: type.string.atMostLength(CONSTANTS.INT8_UNSIGNED_MAX),\n\t\ttinytext2: type.enumerated('a', 'b', 'c'),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: Type<TopLevelCondition, {}> = type('unknown.any') as any;\n\tconst table = singlestoreTable('test', {\n\t\tjson: json().$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = type({\n\t\tjson: TopLevelCondition.or(type.null),\n\t});\n\tExpect<Equal<type.infer<typeof result>, type.infer<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = singlestoreTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: type.string });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = singlestoreTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: type.string });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = singlestoreTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: type.string });\n}\n\n// /* Disallow unknown keys in view qb - select */ {\n// \tconst table = singlestoreTable('test', { id: int() });\n// \tconst view = mysqlView('test').as((qb) => qb.select().from(table));\n// \tconst nestedSelect = mysqlView('test').as((qb) => qb.select({ table }).from(table));\n// \t// @ts-expect-error\n// \tcreateSelectSchema(view, { unknown: type.string });\n// \t// @ts-expect-error\n// \tcreateSelectSchema(nestedSelect, { table: { unknown: type.string } });\n// }\n\n// /* Disallow unknown keys in view columns - select */ {\n// \tconst view = mysqlView('test', { id: int() }).as(sql``);\n// \t// @ts-expect-error\n// \tcreateSelectSchema(view, { unknown: type.string });\n// }\n"
  },
  {
    "path": "drizzle-arktype/tests/sqlite.test.ts",
    "content": "import { Type, type } from 'arktype';\nimport { type Equal, sql } from 'drizzle-orm';\nimport { blob, customType, int, sqliteTable, sqliteView, text } from 'drizzle-orm/sqlite-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport { test } from 'vitest';\nimport { bigintNarrow, bufferSchema, jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSelectSchema, createUpdateSchema } from '../src';\nimport { Expect, expectSchemaShape } from './utils.ts';\n\nconst intSchema = type.keywords.number.integer.atLeast(Number.MIN_SAFE_INTEGER).atMost(Number.MAX_SAFE_INTEGER);\nconst textSchema = type.string;\n\ntest('table - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({ id: intSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = type({ id: intSchema.optional(), name: textSchema, age: intSchema.or(type.null).optional() });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = type({\n\t\tid: intSchema.optional(),\n\t\tname: textSchema.optional(),\n\t\tage: intSchema.or(type.null).optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view qb - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t});\n\tconst view = sqliteView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = type({ id: intSchema, age: type('unknown.any') });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view columns - select', (t) => {\n\tconst view = sqliteView('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = type({ id: intSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view with nested fields - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t});\n\tconst view = sqliteView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tid: table.id,\n\t\t\tnested: {\n\t\t\t\tname: table.name,\n\t\t\t\tage: sql``.as('age'),\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = type({\n\t\tid: intSchema,\n\t\tnested: type({ name: textSchema, age: type('unknown.any') }),\n\t\ttable: type({ id: intSchema, name: textSchema }),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null),\n\t\tc2: intSchema,\n\t\tc3: intSchema.or(type.null),\n\t\tc4: intSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null).optional(),\n\t\tc2: intSchema,\n\t\tc3: intSchema.or(type.null).optional(),\n\t\tc4: intSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - update', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null).optional(),\n\t\tc2: intSchema.optional(),\n\t\tc3: intSchema.or(type.null).optional(),\n\t\tc4: intSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null),\n\t\tc2: intSchema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (t) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = type.string.atLeastLength(1).atMostLength(100);\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null),\n\t\tc2: intSchema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null).optional(),\n\t\tc2: intSchema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null).optional(),\n\t\tc2: intSchema.atMost(1000).optional(),\n\t\tc3: type.string.pipe(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine view - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int(),\n\t\tc3: int(),\n\t\tc4: int(),\n\t\tc5: int(),\n\t\tc6: int(),\n\t});\n\tconst view = sqliteView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tc1: table.c1,\n\t\t\tc2: table.c2,\n\t\t\tc3: table.c3,\n\t\t\tnested: {\n\t\t\t\tc4: table.c4,\n\t\t\t\tc5: table.c5,\n\t\t\t\tc6: table.c6,\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view, {\n\t\tc2: (schema) => schema.atMost(1000),\n\t\tc3: type.string.pipe(Number),\n\t\tnested: {\n\t\t\tc5: (schema) => schema.atMost(1000),\n\t\t\tc6: type.string.pipe(Number),\n\t\t},\n\t\ttable: {\n\t\t\tc2: (schema) => schema.atMost(1000),\n\t\t\tc3: type.string.pipe(Number),\n\t\t},\n\t});\n\tconst expected = type({\n\t\tc1: intSchema.or(type.null),\n\t\tc2: intSchema.atMost(1000).or(type.null),\n\t\tc3: type.string.pipe(Number),\n\t\tnested: type({\n\t\t\tc4: intSchema.or(type.null),\n\t\t\tc5: intSchema.atMost(1000).or(type.null),\n\t\t\tc6: type.string.pipe(Number),\n\t\t}),\n\t\ttable: type({\n\t\t\tc1: intSchema.or(type.null),\n\t\t\tc2: intSchema.atMost(1000).or(type.null),\n\t\t\tc3: type.string.pipe(Number),\n\t\t\tc4: intSchema.or(type.null),\n\t\t\tc5: intSchema.or(type.null),\n\t\t\tc6: intSchema.or(type.null),\n\t\t}),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('all data types', (t) => {\n\tconst table = sqliteTable('test', ({\n\t\tblob,\n\t\tinteger,\n\t\tnumeric,\n\t\treal,\n\t\ttext,\n\t}) => ({\n\t\tblob1: blob({ mode: 'buffer' }).notNull(),\n\t\tblob2: blob({ mode: 'bigint' }).notNull(),\n\t\tblob3: blob({ mode: 'json' }).notNull(),\n\t\tinteger1: integer({ mode: 'number' }).notNull(),\n\t\tinteger2: integer({ mode: 'boolean' }).notNull(),\n\t\tinteger3: integer({ mode: 'timestamp' }).notNull(),\n\t\tinteger4: integer({ mode: 'timestamp_ms' }).notNull(),\n\t\tnumeric: numeric().notNull(),\n\t\treal: real().notNull(),\n\t\ttext1: text({ mode: 'text' }).notNull(),\n\t\ttext2: text({ mode: 'text', length: 10 }).notNull(),\n\t\ttext3: text({ mode: 'text', enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttext4: text({ mode: 'json' }).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = type({\n\t\tblob1: bufferSchema,\n\t\tblob2: type.bigint.narrow(bigintNarrow),\n\t\tblob3: jsonSchema,\n\t\tinteger1: type.keywords.number.integer.atLeast(Number.MIN_SAFE_INTEGER).atMost(Number.MAX_SAFE_INTEGER),\n\t\tinteger2: type.boolean,\n\t\tinteger3: type.Date,\n\t\tinteger4: type.Date,\n\t\tnumeric: type.string,\n\t\treal: type.number.atLeast(CONSTANTS.INT48_MIN).atMost(CONSTANTS.INT48_MAX),\n\t\ttext1: type.string,\n\t\ttext2: type.string.atMostLength(10),\n\t\ttext3: type.enumerated('a', 'b', 'c'),\n\t\ttext4: jsonSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: Type<TopLevelCondition, {}> = type('unknown.any') as any;\n\tconst table = sqliteTable('test', {\n\t\tjson1: text({ mode: 'json' }).$type<TopLevelCondition>().notNull(),\n\t\tjson2: blob({ mode: 'json' }).$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = type({\n\t\tjson1: TopLevelCondition,\n\t\tjson2: TopLevelCondition.or(type.null),\n\t});\n\tExpect<Equal<type.infer<typeof result>, type.infer<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = sqliteTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: type.string });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = sqliteTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: type.string });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = sqliteTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: type.string });\n}\n\n/* Disallow unknown keys in view qb - select */ {\n\tconst table = sqliteTable('test', { id: int() });\n\tconst view = sqliteView('test').as((qb) => qb.select().from(table));\n\tconst nestedSelect = sqliteView('test').as((qb) => qb.select({ table }).from(table));\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: type.string });\n\t// @ts-expect-error\n\tcreateSelectSchema(nestedSelect, { table: { unknown: type.string } });\n}\n\n/* Disallow unknown keys in view columns - select */ {\n\tconst view = sqliteView('test', { id: int() }).as(sql``);\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: type.string });\n}\n"
  },
  {
    "path": "drizzle-arktype/tests/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"module\": \"esnext\",\n\t\t\"target\": \"esnext\",\n\t\t\"noEmit\": true,\n\t\t\"rootDir\": \"..\",\n\t\t\"outDir\": \"./.cache\"\n\t},\n\t\"include\": [\".\", \"../src\"]\n}\n"
  },
  {
    "path": "drizzle-arktype/tests/utils.ts",
    "content": "import { Type } from 'arktype';\nimport { expect, type TaskContext } from 'vitest';\n\nexport function expectSchemaShape<T extends Type<any, any>>(t: TaskContext, expected: T) {\n\treturn {\n\t\tfrom(actual: T) {\n\t\t\texpect(actual.json).toStrictEqual(expected.json);\n\t\t\texpect(actual.expression).toStrictEqual(expected.expression);\n\t\t},\n\t};\n}\n\nexport const expectEnumValues = expectSchemaShape;\n\nexport function Expect<_ extends true>() {}\n"
  },
  {
    "path": "drizzle-arktype/tsconfig.build.json",
    "content": "{\n\t\"extends\": \"./tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"rootDir\": \"src\"\n\t},\n\t\"include\": [\"src\"]\n}\n"
  },
  {
    "path": "drizzle-arktype/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"outDir\": \"dist\",\n\t\t\"baseUrl\": \".\",\n\t\t\"declaration\": true,\n\t\t\"noEmit\": true,\n\t\t\"paths\": {\n\t\t\t\"~/*\": [\"src/*\"]\n\t\t}\n\t},\n\t\"include\": [\"src\", \"*.ts\", \"benchmarks\"]\n}\n"
  },
  {
    "path": "drizzle-arktype/vitest.config.ts",
    "content": "import tsconfigPaths from 'vite-tsconfig-paths';\nimport { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n\ttest: {\n\t\tinclude: [\n\t\t\t'tests/**/*.test.ts',\n\t\t],\n\t\texclude: [\n\t\t\t'tests/bun/**/*',\n\t\t],\n\t\ttypecheck: {\n\t\t\ttsconfig: 'tsconfig.json',\n\t\t},\n\t\ttestTimeout: 100000,\n\t\thookTimeout: 100000,\n\t\tisolate: false,\n\t\tpoolOptions: {\n\t\t\tthreads: {\n\t\t\t\tsingleThread: true,\n\t\t\t},\n\t\t},\n\t},\n\tplugins: [tsconfigPaths()],\n});\n"
  },
  {
    "path": "drizzle-kit/.gitignore",
    "content": "/*\n**/.DS_Store\n\n!src\n!imports-checker\n!tests\n!vitest.config.ts\n!README.md\n!CONTRIBUTING.md\n!schema.ts\n\n!.eslint\n!.gitignore\n!package.json\n!tsconfig.json\n!tsconfig.cli-types.json\n!tsconfig.build.json\n!pnpm-lock.yaml\n!.github\n!build.ts\n!build.dev.ts\n\ntests/test.ts\n\n!patches\n"
  },
  {
    "path": "drizzle-kit/README.md",
    "content": "## Drizzle Kit\n\nDrizzle Kit is a CLI migrator tool for Drizzle ORM. It is probably the one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n<https://github.com/drizzle-team/drizzle-kit-mirror> - is a mirror repository for issues.\n\n## Documentation\n\nCheck the full documentation on [the website](https://orm.drizzle.team/kit-docs/overview).\n\n### How it works\n\nDrizzle Kit traverses a schema module and generates a snapshot to compare with the previous version, if there is one.\nBased on the difference, it will generate all needed SQL migrations. If there are any cases that can't be resolved automatically, such as renames, it will prompt the user for input.\n\nFor example, for this schema module:\n\n```typescript\n// src/db/schema.ts\n\nimport { integer, pgTable, serial, text, varchar } from \"drizzle-orm/pg-core\";\n\nconst users = pgTable(\"users\", {\n    id: serial(\"id\").primaryKey(),\n    fullName: varchar(\"full_name\", { length: 256 }),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\", table.fullName),\n  })\n);\n\nexport const authOtp = pgTable(\"auth_otp\", {\n  id: serial(\"id\").primaryKey(),\n  phone: varchar(\"phone\", { length: 256 }),\n  userId: integer(\"user_id\").references(() => users.id),\n});\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n \"id\" SERIAL PRIMARY KEY,\n \"phone\" character varying(256),\n \"user_id\" INT\n);\n\nCREATE TABLE IF NOT EXISTS users (\n \"id\" SERIAL PRIMARY KEY,\n \"full_name\" character varying(256)\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\n### Installation & configuration\n\n```shell\nnpm install -D drizzle-kit\n```\n\nRunning with CLI options:\n\n```jsonc\n// package.json\n{\n \"scripts\": {\n  \"generate\": \"drizzle-kit generate --out migrations-folder --schema src/db/schema.ts\"\n }\n}\n```\n\n```shell\nnpm run generate\n```\n"
  },
  {
    "path": "drizzle-kit/build.dev.ts",
    "content": "import * as esbuild from 'esbuild';\nimport { cpSync } from 'node:fs';\n\nconst driversPackages = [\n\t// postgres drivers\n\t'pg',\n\t'postgres',\n\t'@vercel/postgres',\n\t'@neondatabase/serverless',\n\t//  mysql drivers\n\t'mysql2',\n\t'@planetscale/database',\n\t// sqlite drivers\n\t'@libsql/client',\n\t'better-sqlite3',\n];\n\nesbuild.buildSync({\n\tentryPoints: ['./src/utils.ts'],\n\tbundle: true,\n\toutfile: 'dist/utils.js',\n\tformat: 'cjs',\n\ttarget: 'node16',\n\tplatform: 'node',\n\texternal: ['drizzle-orm', 'esbuild', ...driversPackages],\n\tbanner: {\n\t\tjs: `#!/usr/bin/env -S node --loader @esbuild-kit/esm-loader --no-warnings`,\n\t},\n});\n\nesbuild.buildSync({\n\tentryPoints: ['./src/cli/index.ts'],\n\tbundle: true,\n\toutfile: 'dist/index.cjs',\n\tformat: 'cjs',\n\ttarget: 'node16',\n\tplatform: 'node',\n\texternal: [\n\t\t'commander',\n\t\t'json-diff',\n\t\t'glob',\n\t\t'esbuild',\n\t\t'drizzle-orm',\n\t\t...driversPackages,\n\t],\n\tbanner: {\n\t\tjs: `#!/usr/bin/env -S node --loader ./dist/loader.mjs --no-warnings`,\n\t},\n});\n\ncpSync('./src/loader.mjs', 'dist/loader.mjs');\n"
  },
  {
    "path": "drizzle-kit/build.ts",
    "content": "/// <reference types=\"bun-types\" />\nimport * as esbuild from 'esbuild';\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport * as tsup from 'tsup';\nimport pkg from './package.json';\n\nconst driversPackages = [\n\t// postgres drivers\n\t'pg',\n\t'postgres',\n\t'@vercel/postgres',\n\t'@neondatabase/serverless',\n\t'@electric-sql/pglite',\n\t//  mysql drivers\n\t'mysql2',\n\t'@planetscale/database',\n\t// sqlite drivers\n\t'@libsql/client',\n\t'better-sqlite3',\n\t'bun:sqlite',\n];\n\nesbuild.buildSync({\n\tentryPoints: ['./src/utils.ts'],\n\tbundle: true,\n\toutfile: 'dist/utils.js',\n\tformat: 'cjs',\n\ttarget: 'node16',\n\tplatform: 'node',\n\texternal: [\n\t\t'commander',\n\t\t'json-diff',\n\t\t'glob',\n\t\t'esbuild',\n\t\t'drizzle-orm',\n\t\t...driversPackages,\n\t],\n\tbanner: {\n\t\tjs: `#!/usr/bin/env node`,\n\t},\n});\n\nesbuild.buildSync({\n\tentryPoints: ['./src/utils.ts'],\n\tbundle: true,\n\toutfile: 'dist/utils.mjs',\n\tformat: 'esm',\n\ttarget: 'node16',\n\tplatform: 'node',\n\texternal: [\n\t\t'commander',\n\t\t'json-diff',\n\t\t'glob',\n\t\t'esbuild',\n\t\t'drizzle-orm',\n\t\t...driversPackages,\n\t],\n\tbanner: {\n\t\tjs: `#!/usr/bin/env node`,\n\t},\n});\n\nesbuild.buildSync({\n\tentryPoints: ['./src/cli/index.ts'],\n\tbundle: true,\n\toutfile: 'dist/bin.cjs',\n\tformat: 'cjs',\n\ttarget: 'node16',\n\tplatform: 'node',\n\tdefine: {\n\t\t'process.env.DRIZZLE_KIT_VERSION': `\"${pkg.version}\"`,\n\t},\n\texternal: [\n\t\t'esbuild',\n\t\t'drizzle-orm',\n\t\t...driversPackages,\n\t],\n\tbanner: {\n\t\tjs: `#!/usr/bin/env node`,\n\t},\n});\n\nconst main = async () => {\n\tawait tsup.build({\n\t\tentryPoints: ['./src/index.ts'],\n\t\toutDir: './dist',\n\t\texternal: [\n\t\t\t'esbuild',\n\t\t\t'drizzle-orm',\n\t\t\t...driversPackages,\n\t\t],\n\t\tsplitting: false,\n\t\tdts: true,\n\t\tformat: ['cjs', 'esm'],\n\t\toutExtension: (ctx) => {\n\t\t\tif (ctx.format === 'cjs') {\n\t\t\t\treturn {\n\t\t\t\t\tdts: '.d.ts',\n\t\t\t\t\tjs: '.js',\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdts: '.d.mts',\n\t\t\t\tjs: '.mjs',\n\t\t\t};\n\t\t},\n\t});\n\n\tawait tsup.build({\n\t\tentryPoints: ['./src/api.ts'],\n\t\toutDir: './dist',\n\t\texternal: [\n\t\t\t'esbuild',\n\t\t\t'drizzle-orm',\n\t\t\t...driversPackages,\n\t\t],\n\t\tsplitting: false,\n\t\tdts: true,\n\t\tformat: ['cjs', 'esm'],\n\t\tbanner: (ctx) => {\n\t\t\t/**\n\t\t\t * fix dynamic require in ESM (\"glob\" -> \"fs.realpath\" requires 'fs' module)\n\t\t\t * @link https://github.com/drizzle-team/drizzle-orm/issues/2853\n\t\t\t */\n\t\t\tif (ctx.format === 'esm') {\n\t\t\t\treturn {\n\t\t\t\t\tjs: \"import { createRequire } from 'module'; const require = createRequire(import.meta.url);\",\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\toutExtension: (ctx) => {\n\t\t\tif (ctx.format === 'cjs') {\n\t\t\t\treturn {\n\t\t\t\t\tdts: '.d.ts',\n\t\t\t\t\tjs: '.js',\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdts: '.d.mts',\n\t\t\t\tjs: '.mjs',\n\t\t\t};\n\t\t},\n\t});\n\n\tconst apiCjs = readFileSync('./dist/api.js', 'utf8').replace(/await import\\(/g, 'require(');\n\twriteFileSync('./dist/api.js', apiCjs);\n};\n\nmain().catch((e) => {\n\tconsole.error(e);\n\tprocess.exit(1);\n});\n"
  },
  {
    "path": "drizzle-kit/imports-checker/analyze.ts",
    "content": "import { readFileSync } from 'fs';\nimport type { Node } from 'ohm-js';\nimport JSImports from './grammar/grammar.ohm-bundle';\n\nexport type CollectionItem = {\n\ttype: 'data' | 'types';\n\tsource: string;\n};\n\nfunction recursiveRun(...args: Node[]): boolean {\n\tfor (const arg of args) {\n\t\tif (\n\t\t\targ.ctorName === 'Rest'\n\t\t\t|| arg.ctorName === 'comment'\n\t\t\t|| arg.ctorName === 'stringLiteral'\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (\n\t\t\targ.ctorName === 'ImportExpr_From'\n\t\t\t|| arg.ctorName === 'ImportExpr_NoFrom'\n\t\t) {\n\t\t\targ['analyze']();\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.isTerminal()) continue;\n\n\t\tfor (const c of arg.children) {\n\t\t\tif (!recursiveRun(c)) return false;\n\t\t}\n\t}\n\n\treturn true;\n}\nfunction init(collection: CollectionItem[]) {\n\tconst semantics = JSImports.createSemantics();\n\n\tsemantics.addOperation('analyze', {\n\t\tJSImports(arg0, arg1) {\n\t\t\trecursiveRun(arg0, arg1);\n\t\t},\n\n\t\tImportExpr_From(kImport, importInner, kFrom, importSource) {\n\t\t\tconst ruleName = importInner.children[0]!.ctorName;\n\t\t\tconst importType = ruleName === 'ImportInner_Type' || ruleName === 'ImportInner_Types'\n\t\t\t\t? 'types'\n\t\t\t\t: 'data';\n\n\t\t\tcollection.push({\n\t\t\t\tsource: importSource.children[1]!.sourceString!,\n\t\t\t\ttype: importType,\n\t\t\t});\n\t\t},\n\n\t\tImportExpr_NoFrom(kImport, importSource) {\n\t\t\tcollection.push({\n\t\t\t\tsource: importSource.children[1]!.sourceString!,\n\t\t\t\ttype: 'data',\n\t\t\t});\n\t\t},\n\t});\n\n\treturn semantics;\n}\n\nexport function analyze(path: string) {\n\tconst file = readFileSync(path).toString();\n\tconst match = JSImports.match(file, 'JSImports');\n\n\tif (match.failed()) throw new Error(`Failed to parse file: ${path}`);\n\tconst collection: CollectionItem[] = [];\n\n\tinit(collection)(match)['analyze']();\n\treturn collection;\n}\n"
  },
  {
    "path": "drizzle-kit/imports-checker/checker.ts",
    "content": "import fs from 'fs';\nimport m from 'micromatch';\nimport { dirname, join as joinPath, relative, resolve as resolvePath } from 'path';\nimport { analyze } from './analyze';\n\ntype External = {\n\tfile: string;\n\timport: string;\n\ttype: 'data' | 'types';\n};\n\nexport type Issue = {\n\tfile: string;\n\timports: IssueImport[];\n\taccessChains: ChainLink[][];\n};\n\nexport type IssueImport = {\n\tname: string;\n\ttype: 'data' | 'types';\n};\n\nexport type ChainLink = {\n\tfile: string;\n\timport: string;\n};\n\ntype ListMode = 'whitelist' | 'blacklist';\n\nclass ImportAnalyzer {\n\tprivate localImportRegex = /^(\\.?\\.?\\/|\\.\\.?$)/;\n\tprivate importedFileFormatRegex = /^.*\\.(ts|tsx|mts|cts|js|jsx|mjs|cjs|json)$/i;\n\n\tprivate visited: Set<string> = new Set<string>();\n\n\tprivate externals: External[] = [];\n\tprivate accessChains: Record<string, ChainLink[][]> = {};\n\n\tconstructor(\n\t\tprivate basePath: string,\n\t\tprivate entry: string,\n\t\tprivate listMode: ListMode,\n\t\tprivate readonly wantedList: string[],\n\t\tprivate localPaths: string[],\n\t\tprivate logger?: boolean,\n\t\tprivate ignoreTypes?: boolean,\n\t) {}\n\n\tprivate isDirectory = (path: string) => {\n\t\ttry {\n\t\t\treturn fs.lstatSync(path).isDirectory();\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tprivate isFile = (path: string) => {\n\t\ttry {\n\t\t\treturn fs.lstatSync(path).isFile();\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tprivate localizePath = (path: string) => relative(resolvePath(this.basePath), resolvePath(path));\n\n\tprivate isCustomLocal = (importTarget: string) =>\n\t\t!!this.localPaths.find(\n\t\t\t(l) =>\n\t\t\t\timportTarget === l\n\t\t\t\t|| importTarget.startsWith(l.endsWith('/') ? l : `${l}/`),\n\t\t);\n\tprivate isLocal = (importTarget: string) =>\n\t\tthis.localImportRegex.test(importTarget)\n\t\t|| this.isCustomLocal(importTarget);\n\tprivate isTsFormat = (path: string) => this.importedFileFormatRegex.test(path);\n\n\tprivate resolveCustomLocalPath = (\n\t\tabsoluteBase: string,\n\t\tbase: string,\n\t\ttarget: string,\n\t): string => {\n\t\treturn joinPath(absoluteBase, target);\n\t};\n\n\tprivate resolveTargetFile = (path: string): string => {\n\t\tif (this.isFile(path)) return path;\n\n\t\tconst formats = [\n\t\t\t'.ts',\n\t\t\t'.mts',\n\t\t\t'.cts',\n\t\t\t'.tsx',\n\t\t\t'.js',\n\t\t\t'.mjs',\n\t\t\t'.cjs',\n\t\t\t'.jsx',\n\t\t];\n\n\t\tfor (const format of formats) {\n\t\t\tconst indexPath = joinPath(path, `/index${format}`);\n\t\t\tif (this.isFile(indexPath)) return indexPath;\n\n\t\t\tconst formatFilePath = `${path}${format}`;\n\t\t\tif (this.isFile(formatFilePath)) return formatFilePath;\n\t\t}\n\n\t\treturn path;\n\t};\n\n\tprivate resolveTargetPath = (\n\t\tabsoluteBase: string,\n\t\tbase: string,\n\t\ttarget: string,\n\t): string => {\n\t\tif (this.isCustomLocal(target)) {\n\t\t\treturn this.resolveTargetFile(\n\t\t\t\tthis.resolveCustomLocalPath(absoluteBase, base, target),\n\t\t\t);\n\t\t}\n\n\t\tconst dir = this.isDirectory(base) ? base : dirname(base);\n\t\tconst joined = joinPath(dir, target);\n\n\t\treturn this.resolveTargetFile(joined);\n\t};\n\n\tprivate _analyzeImports = (\n\t\ttarget: string = this.entry,\n\t\tbasePath: string = this.basePath,\n\t\taccessChain: ChainLink[] = [],\n\t) => {\n\t\tif (this.visited.has(target)) return;\n\n\t\tconst locals: string[] = [];\n\n\t\ttry {\n\t\t\tif (this.logger) console.log(`${this.localizePath(target)}`);\n\n\t\t\tconst imports = analyze(target);\n\n\t\t\tfor (const { source: i, type } of imports) {\n\t\t\t\tif (this.ignoreTypes && type === 'types') continue;\n\n\t\t\t\tif (this.isLocal(i)) {\n\t\t\t\t\tlocals.push(i);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthis.externals.push({\n\t\t\t\t\tfile: this.localizePath(target),\n\t\t\t\t\timport: i,\n\t\t\t\t\ttype: type,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthrow e;\n\t\t} finally {\n\t\t\tthis.visited.add(target);\n\t\t}\n\n\t\tfor (const local of locals) {\n\t\t\tconst transformedTarget = this.resolveTargetPath(basePath, target, local);\n\n\t\t\tconst localChain = [\n\t\t\t\t...accessChain,\n\t\t\t\t{\n\t\t\t\t\tfile: this.localizePath(target),\n\t\t\t\t\timport: local,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst localized = this.localizePath(transformedTarget);\n\n\t\t\tif (this.accessChains[localized]) {\n\t\t\t\tthis.accessChains[localized].push(localChain);\n\t\t\t} else this.accessChains[localized] = [localChain];\n\n\t\t\tif (this.isTsFormat(transformedTarget)) {\n\t\t\t\tthis._analyzeImports(transformedTarget, basePath, localChain);\n\t\t\t} else {\n\t\t\t\tthrow new Error(`unrecognized: ${localized}`);\n\t\t\t}\n\t\t}\n\t};\n\n\tpublic analyzeImports = () => {\n\t\tconst entryLocalized = this.localizePath(this.entry);\n\t\tif (!this.accessChains[entryLocalized]) {\n\t\t\tthis.accessChains[entryLocalized] = [[]];\n\t\t}\n\n\t\tthis._analyzeImports();\n\n\t\tconst rawIssues = this.listMode === 'whitelist'\n\t\t\t? this.externals.filter((e) => !m([e.import], this.wantedList).length)\n\t\t\t: this.externals.filter((e) => m([e.import], this.wantedList).length);\n\n\t\tconst issueMap: Record<string, Issue> = {};\n\t\tfor (const { file, import: i, type } of rawIssues) {\n\t\t\tif (issueMap[file]) {\n\t\t\t\tissueMap[file].imports.push({\n\t\t\t\t\tname: i,\n\t\t\t\t\ttype,\n\t\t\t\t});\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tissueMap[file] = {\n\t\t\t\tfile,\n\t\t\t\timports: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: i,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\taccessChains: this.accessChains[file]!,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tissues: Object.entries(issueMap).map(([file, data]) => {\n\t\t\t\tfor (const chain of data.accessChains) {\n\t\t\t\t\tchain.push({\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\timport: '',\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\t\t\t}),\n\t\t\taccessChains: this.accessChains,\n\t\t};\n\t};\n}\n\nexport type CustomLocalPathResolver = (\n\tbasePath: string,\n\tpath: string,\n\ttarget: string,\n) => string;\n\nexport type AnalyzeImportsConfig =\n\t& {\n\t\tbasePath: string;\n\t\tentry: string;\n\t\tlogger?: boolean;\n\t\tignoreTypes?: boolean;\n\t\tlocalPaths?: string[];\n\t}\n\t& (\n\t\t| {\n\t\t\tblackList: string[];\n\t\t}\n\t\t| {\n\t\t\twhiteList: string[];\n\t\t}\n\t);\n\ntype AnyAnalyzeImportsConfig = {\n\tbasePath: string;\n\tentry: string;\n\tblackList?: string[];\n\twhiteList?: string[];\n\tlogger?: boolean;\n\tignoreTypes?: boolean;\n\tlocalPaths?: string[];\n};\n\nexport function analyzeImports(cfg: AnalyzeImportsConfig) {\n\tconst {\n\t\tbasePath,\n\t\tblackList,\n\t\twhiteList,\n\t\tentry,\n\t\tlocalPaths: localImports,\n\t\tignoreTypes,\n\t\tlogger,\n\t} = cfg as AnyAnalyzeImportsConfig;\n\tconst mode = whiteList ? 'whitelist' : 'blacklist';\n\tconst wantedList = blackList ?? whiteList!;\n\n\tconst analyzer = new ImportAnalyzer(\n\t\tjoinPath(basePath),\n\t\tjoinPath(entry),\n\t\tmode,\n\t\twantedList,\n\t\tlocalImports ?? [],\n\t\tlogger,\n\t\tignoreTypes,\n\t);\n\n\treturn analyzer.analyzeImports();\n}\n"
  },
  {
    "path": "drizzle-kit/imports-checker/grammar/grammar.ohm",
    "content": "JSImports {\n    JSImports = (Expr \";\"?)*\n\n    Expr = \n    | comment\n    | stringLiteral\n    | ImportExpr\n    | Rest\n\n    ImportExpr =\n    | \"import\" ImportInner \"from\" importSource -- From\n    | \"import\" importSource -- NoFrom\n\n    Rest = (~(ImportExpr | comment | stringLiteral) any)+\n\n    ImportInner = \n    | (\"type\" \"{\" NonemptyListOf<ImportExtendedSelectionTypeless, \",\"> \",\"? \"}\")            -- Type\n    | (\"{\" NonemptyListOf<ImportExtendedSelectionTypes, \",\"> \",\"? \"}\")                      -- Types\n    | (\"{\" NonemptyListOf<ImportExtendedSelection, \",\"> \",\"? \"}\")                           -- Extended\n    | (identifier (\",\" \"type\"? \"{\" NonemptyListOf<ImportExtendedSelection, \",\"> \",\"? \"}\")?) -- Mixed\n    | (\"*\" (\"as\" identifier)?)                                                              -- All\n    | (identifier (\"as\" identifier)?)                                                       -- Default\n    \n\n    ImportExtendedSelection = TypeImport | Import\n    ImportExtendedSelectionTypes = TypeImport\n    ImportExtendedSelectionTypeless = Import\n\n    Import = identifier (\"as\" identifier)?\n    TypeImport = \"type\" Import (\"as\" identifier)?\n\n    identifier = letter alnum*\n    quote = \"\\\"\" | \"'\" | \"`\"\n    notQuote = ~quote any\n    importSource =\n    | \"\\\"\" notQuote+ \"\\\"\"\n    | \"'\" notQuote+ \"'\"\n    | \"`\" notQuote+ \"`\"\n\n    lineTerminator = \"\\n\" | \"\\r\" | \"\\u2028\" | \"\\u2029\"\n    lineTerminatorSequence = \"\\n\" | \"\\r\" ~\"\\n\" | \"\\u2028\" | \"\\u2029\" | \"\\r\\n\"\n    \n    comment = multiLineComment | singleLineComment\n\n    multiLineComment = \"/*\" (~\"*/\" any)* \"*/\"\n    singleLineComment = \"//\" (~lineTerminator any)*\n\n    stringLiteral =\n    | \"\\\"\" doubleStringCharacter* \"\\\"\"\n    | \"'\" singleStringCharacter* \"'\"\n    | \"`\" templateStringCharacter* \"`\"\n    doubleStringCharacter =\n    | ~(\"\\\"\" | \"\\\\\" | lineTerminator) any   -- NonEscaped\n    | \"\\\\\" escapeSequence                   -- Escaped\n    | lineContinuation                      -- LineContinuation\n    singleStringCharacter =\n    | ~(\"'\" | \"\\\\\" | lineTerminator) any    -- NonEscaped\n    | \"\\\\\" escapeSequence                   -- Escaped\n    | lineContinuation                      -- LineContinuation\n    templateStringCharacter = \n    | ~ (\"`\" | \"\\\\\") any                    -- NonEscaped\n    | \"\\\\\" escapeSequence                        -- Escaped\n    lineContinuation = \"\\\\\" lineTerminatorSequence\n    escapeSequence = unicodeEscapeSequence | hexEscapeSequence | octalEscapeSequence | characterEscapeSequence\n    characterEscapeSequence = singleEscapeCharacter | nonEscapeCharacter\n    singleEscapeCharacter = \"'\" | \"\\\"\" | \"\\\\\" | \"b\" | \"f\" | \"n\" | \"r\" | \"t\" | \"v\"\n    nonEscapeCharacter = ~(escapeCharacter | lineTerminator) any\n    escapeCharacter = singleEscapeCharacter | decimalDigit | \"x\" | \"u\"\n    octalEscapeSequence =\n    | zeroToThree octalDigit octalDigit     -- Whole\n    | fourToSeven octalDigit                -- EightTimesfourToSeven\n    | zeroToThree octalDigit ~decimalDigit  -- EightTimesZeroToThree\n    | octalDigit ~decimalDigit              -- Octal\n    hexEscapeSequence = \"x\" hexDigit hexDigit\n    unicodeEscapeSequence = \"u\" hexDigit hexDigit hexDigit hexDigit\n\n    zeroToThree = \"0\"..\"3\"\n    fourToSeven = \"4\"..\"7\"\n    decimalDigit = \"0\"..\"9\"\n    nonZeroDigit = \"1\"..\"9\"\n    octalDigit = \"0\"..\"7\"\n\n    regularExpressionLiteral = \"/\" regularExpressionBody \"/\" regularExpressionFlags\n    regularExpressionBody = regularExpressionFirstChar regularExpressionChar*\n    regularExpressionFirstChar =\n    | ~(\"*\" | \"\\\\\" | \"/\" | \"[\") regularExpressionNonTerminator\n    | regularExpressionBackslashSequence\n    | regularExpressionClass\n    regularExpressionChar = ~(\"\\\\\" | \"/\" | \"[\") regularExpressionNonTerminator\n    | regularExpressionBackslashSequence\n    | regularExpressionClass\n    regularExpressionBackslashSequence = \"\\\\\" regularExpressionNonTerminator\n    regularExpressionNonTerminator = ~(lineTerminator) any\n    regularExpressionClass = \"[\" regularExpressionClassChar* \"]\"\n    regularExpressionClassChar =\n    | ~(\"]\" | \"\\\\\") regularExpressionNonTerminator\n    | regularExpressionBackslashSequence\n    regularExpressionFlags = identifierPart*\n\n    multiLineCommentNoNL = \"/*\" (~(\"*/\" | lineTerminator) any)* \"*/\"\n\n    identifierStart =\n    | letter | \"$\" | \"_\"\n    | \"\\\\\" unicodeEscapeSequence -- escaped\n    identifierPart =\n    | identifierStart | unicodeCombiningMark\n    | unicodeDigit | unicodeConnectorPunctuation\n    | \"\\u200C\" | \"\\u200D\"\n    letter += unicodeCategoryNl\n    unicodeCategoryNl\n    = \"\\u2160\"..\"\\u2182\" | \"\\u3007\" | \"\\u3021\"..\"\\u3029\"\n    unicodeDigit (a digit)\n    = \"\\u0030\"..\"\\u0039\" | \"\\u0660\"..\"\\u0669\" | \"\\u06F0\"..\"\\u06F9\" | \"\\u0966\"..\"\\u096F\" | \"\\u09E6\"..\"\\u09EF\" | \"\\u0A66\"..\"\\u0A6F\" | \"\\u0AE6\"..\"\\u0AEF\" | \"\\u0B66\"..\"\\u0B6F\" | \"\\u0BE7\"..\"\\u0BEF\" | \"\\u0C66\"..\"\\u0C6F\" | \"\\u0CE6\"..\"\\u0CEF\" | \"\\u0D66\"..\"\\u0D6F\" | \"\\u0E50\"..\"\\u0E59\" | \"\\u0ED0\"..\"\\u0ED9\" | \"\\u0F20\"..\"\\u0F29\" | \"\\uFF10\"..\"\\uFF19\"\n\n    unicodeCombiningMark (a Unicode combining mark)\n    = \"\\u0300\"..\"\\u0345\" | \"\\u0360\"..\"\\u0361\" | \"\\u0483\"..\"\\u0486\" | \"\\u0591\"..\"\\u05A1\" | \"\\u05A3\"..\"\\u05B9\" | \"\\u05BB\"..\"\\u05BD\" | \"\\u05BF\"..\"\\u05BF\" | \"\\u05C1\"..\"\\u05C2\" | \"\\u05C4\"..\"\\u05C4\" | \"\\u064B\"..\"\\u0652\" | \"\\u0670\"..\"\\u0670\" | \"\\u06D6\"..\"\\u06DC\" | \"\\u06DF\"..\"\\u06E4\" | \"\\u06E7\"..\"\\u06E8\" | \"\\u06EA\"..\"\\u06ED\" | \"\\u0901\"..\"\\u0902\" | \"\\u093C\"..\"\\u093C\" | \"\\u0941\"..\"\\u0948\" | \"\\u094D\"..\"\\u094D\" | \"\\u0951\"..\"\\u0954\" | \"\\u0962\"..\"\\u0963\" | \"\\u0981\"..\"\\u0981\" | \"\\u09BC\"..\"\\u09BC\" | \"\\u09C1\"..\"\\u09C4\" | \"\\u09CD\"..\"\\u09CD\" | \"\\u09E2\"..\"\\u09E3\" | \"\\u0A02\"..\"\\u0A02\" | \"\\u0A3C\"..\"\\u0A3C\" | \"\\u0A41\"..\"\\u0A42\" | \"\\u0A47\"..\"\\u0A48\" | \"\\u0A4B\"..\"\\u0A4D\" | \"\\u0A70\"..\"\\u0A71\" | \"\\u0A81\"..\"\\u0A82\" | \"\\u0ABC\"..\"\\u0ABC\" | \"\\u0AC1\"..\"\\u0AC5\" | \"\\u0AC7\"..\"\\u0AC8\" | \"\\u0ACD\"..\"\\u0ACD\" | \"\\u0B01\"..\"\\u0B01\" | \"\\u0B3C\"..\"\\u0B3C\" | \"\\u0B3F\"..\"\\u0B3F\" | \"\\u0B41\"..\"\\u0B43\" | \"\\u0B4D\"..\"\\u0B4D\" | \"\\u0B56\"..\"\\u0B56\" | \"\\u0B82\"..\"\\u0B82\" | \"\\u0BC0\"..\"\\u0BC0\" | \"\\u0BCD\"..\"\\u0BCD\" | \"\\u0C3E\"..\"\\u0C40\" | \"\\u0C46\"..\"\\u0C48\" | \"\\u0C4A\"..\"\\u0C4D\" | \"\\u0C55\"..\"\\u0C56\" | \"\\u0CBF\"..\"\\u0CBF\" | \"\\u0CC6\"..\"\\u0CC6\" | \"\\u0CCC\"..\"\\u0CCD\" | \"\\u0D41\"..\"\\u0D43\" | \"\\u0D4D\"..\"\\u0D4D\" | \"\\u0E31\"..\"\\u0E31\" | \"\\u0E34\"..\"\\u0E3A\" | \"\\u0E47\"..\"\\u0E4E\" | \"\\u0EB1\"..\"\\u0EB1\" | \"\\u0EB4\"..\"\\u0EB9\" | \"\\u0EBB\"..\"\\u0EBC\" | \"\\u0EC8\"..\"\\u0ECD\" | \"\\u0F18\"..\"\\u0F19\" | \"\\u0F35\"..\"\\u0F35\" | \"\\u0F37\"..\"\\u0F37\" | \"\\u0F39\"..\"\\u0F39\" | \"\\u0F71\"..\"\\u0F7E\" | \"\\u0F80\"..\"\\u0F84\" | \"\\u0F86\"..\"\\u0F87\" | \"\\u0F90\"..\"\\u0F95\" | \"\\u0F97\"..\"\\u0F97\" | \"\\u0F99\"..\"\\u0FAD\" | \"\\u0FB1\"..\"\\u0FB7\" | \"\\u0FB9\"..\"\\u0FB9\" | \"\\u20D0\"..\"\\u20DC\" | \"\\u20E1\"..\"\\u20E1\" | \"\\u302A\"..\"\\u302F\" | \"\\u3099\"..\"\\u309A\" | \"\\uFB1E\"..\"\\uFB1E\" | \"\\uFE20\"..\"\\uFE23\"\n\n    unicodeConnectorPunctuation = \"\\u005F\" | \"\\u203F\"..\"\\u2040\" | \"\\u30FB\" | \"\\uFE33\"..\"\\uFE34\" | \"\\uFE4D\"..\"\\uFE4F\" | \"\\uFF3F\" | \"\\uFF65\"\n    unicodeSpaceSeparator = \"\\u2000\"..\"\\u200B\" | \"\\u3000\"\n\n}"
  },
  {
    "path": "drizzle-kit/imports-checker/grammar/grammar.ohm-bundle.d.ts",
    "content": "// AUTOGENERATED FILE\n// This file was generated from grammar.ohm by `ohm generateBundles`.\n\nimport { BaseActionDict, Grammar, IterationNode, Node, NonterminalNode, Semantics, TerminalNode } from 'ohm-js';\n\nexport interface JSImportsActionDict<T> extends BaseActionDict<T> {\n\tJSImports?: (this: NonterminalNode, arg0: IterationNode, arg1: IterationNode) => T;\n\tExpr?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tImportExpr_From?: (\n\t\tthis: NonterminalNode,\n\t\targ0: TerminalNode,\n\t\targ1: NonterminalNode,\n\t\targ2: TerminalNode,\n\t\targ3: NonterminalNode,\n\t) => T;\n\tImportExpr_NoFrom?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode) => T;\n\tImportExpr?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tRest?: (this: NonterminalNode, arg0: IterationNode) => T;\n\tImportInner_Type?: (\n\t\tthis: NonterminalNode,\n\t\targ0: TerminalNode,\n\t\targ1: TerminalNode,\n\t\targ2: NonterminalNode,\n\t\targ3: IterationNode,\n\t\targ4: TerminalNode,\n\t) => T;\n\tImportInner_Types?: (\n\t\tthis: NonterminalNode,\n\t\targ0: TerminalNode,\n\t\targ1: NonterminalNode,\n\t\targ2: IterationNode,\n\t\targ3: TerminalNode,\n\t) => T;\n\tImportInner_Extended?: (\n\t\tthis: NonterminalNode,\n\t\targ0: TerminalNode,\n\t\targ1: NonterminalNode,\n\t\targ2: IterationNode,\n\t\targ3: TerminalNode,\n\t) => T;\n\tImportInner_Mixed?: (\n\t\tthis: NonterminalNode,\n\t\targ0: NonterminalNode,\n\t\targ1: IterationNode,\n\t\targ2: IterationNode,\n\t\targ3: IterationNode,\n\t\targ4: IterationNode,\n\t\targ5: IterationNode,\n\t\targ6: IterationNode,\n\t) => T;\n\tImportInner_All?: (this: NonterminalNode, arg0: TerminalNode, arg1: IterationNode, arg2: IterationNode) => T;\n\tImportInner_Default?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode, arg2: IterationNode) => T;\n\tImportInner?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tImportExtendedSelection?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tImportExtendedSelectionTypes?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tImportExtendedSelectionTypeless?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tImport?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode, arg2: IterationNode) => T;\n\tTypeImport?: (\n\t\tthis: NonterminalNode,\n\t\targ0: TerminalNode,\n\t\targ1: NonterminalNode,\n\t\targ2: IterationNode,\n\t\targ3: IterationNode,\n\t) => T;\n\tidentifier?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode) => T;\n\tquote?: (this: NonterminalNode, arg0: TerminalNode) => T;\n\tnotQuote?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\timportSource?: (this: NonterminalNode, arg0: TerminalNode, arg1: IterationNode, arg2: TerminalNode) => T;\n\tlineTerminator?: (this: NonterminalNode, arg0: TerminalNode) => T;\n\tlineTerminatorSequence?: (this: NonterminalNode, arg0: TerminalNode) => T;\n\tcomment?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tmultiLineComment?: (this: NonterminalNode, arg0: TerminalNode, arg1: IterationNode, arg2: TerminalNode) => T;\n\tsingleLineComment?: (this: NonterminalNode, arg0: TerminalNode, arg1: IterationNode) => T;\n\tstringLiteral?: (this: NonterminalNode, arg0: TerminalNode, arg1: IterationNode, arg2: TerminalNode) => T;\n\tdoubleStringCharacter_NonEscaped?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tdoubleStringCharacter_Escaped?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode) => T;\n\tdoubleStringCharacter_LineContinuation?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tdoubleStringCharacter?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tsingleStringCharacter_NonEscaped?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tsingleStringCharacter_Escaped?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode) => T;\n\tsingleStringCharacter_LineContinuation?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tsingleStringCharacter?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\ttemplateStringCharacter_NonEscaped?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\ttemplateStringCharacter_Escaped?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode) => T;\n\ttemplateStringCharacter?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tlineContinuation?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode) => T;\n\tescapeSequence?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tcharacterEscapeSequence?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tsingleEscapeCharacter?: (this: NonterminalNode, arg0: TerminalNode) => T;\n\tnonEscapeCharacter?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tescapeCharacter?: (this: NonterminalNode, arg0: NonterminalNode | TerminalNode) => T;\n\toctalEscapeSequence_Whole?: (\n\t\tthis: NonterminalNode,\n\t\targ0: NonterminalNode,\n\t\targ1: NonterminalNode,\n\t\targ2: NonterminalNode,\n\t) => T;\n\toctalEscapeSequence_EightTimesfourToSeven?: (\n\t\tthis: NonterminalNode,\n\t\targ0: NonterminalNode,\n\t\targ1: NonterminalNode,\n\t) => T;\n\toctalEscapeSequence_EightTimesZeroToThree?: (\n\t\tthis: NonterminalNode,\n\t\targ0: NonterminalNode,\n\t\targ1: NonterminalNode,\n\t) => T;\n\toctalEscapeSequence_Octal?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\toctalEscapeSequence?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\thexEscapeSequence?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode, arg2: NonterminalNode) => T;\n\tunicodeEscapeSequence?: (\n\t\tthis: NonterminalNode,\n\t\targ0: TerminalNode,\n\t\targ1: NonterminalNode,\n\t\targ2: NonterminalNode,\n\t\targ3: NonterminalNode,\n\t\targ4: NonterminalNode,\n\t) => T;\n\tzeroToThree?: (this: NonterminalNode, arg0: TerminalNode) => T;\n\tfourToSeven?: (this: NonterminalNode, arg0: TerminalNode) => T;\n\tdecimalDigit?: (this: NonterminalNode, arg0: TerminalNode) => T;\n\tnonZeroDigit?: (this: NonterminalNode, arg0: TerminalNode) => T;\n\toctalDigit?: (this: NonterminalNode, arg0: TerminalNode) => T;\n\tregularExpressionLiteral?: (\n\t\tthis: NonterminalNode,\n\t\targ0: TerminalNode,\n\t\targ1: NonterminalNode,\n\t\targ2: TerminalNode,\n\t\targ3: NonterminalNode,\n\t) => T;\n\tregularExpressionBody?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode) => T;\n\tregularExpressionFirstChar?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tregularExpressionChar?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tregularExpressionBackslashSequence?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode) => T;\n\tregularExpressionNonTerminator?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tregularExpressionClass?: (this: NonterminalNode, arg0: TerminalNode, arg1: IterationNode, arg2: TerminalNode) => T;\n\tregularExpressionClassChar?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tregularExpressionFlags?: (this: NonterminalNode, arg0: IterationNode) => T;\n\tmultiLineCommentNoNL?: (this: NonterminalNode, arg0: TerminalNode, arg1: IterationNode, arg2: TerminalNode) => T;\n\tidentifierStart_escaped?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode) => T;\n\tidentifierStart?: (this: NonterminalNode, arg0: NonterminalNode | TerminalNode) => T;\n\tidentifierPart?: (this: NonterminalNode, arg0: NonterminalNode | TerminalNode) => T;\n\tletter?: (this: NonterminalNode, arg0: NonterminalNode) => T;\n\tunicodeCategoryNl?: (this: NonterminalNode, arg0: TerminalNode) => T;\n\tunicodeDigit?: (this: NonterminalNode, arg0: TerminalNode) => T;\n\tunicodeCombiningMark?: (this: NonterminalNode, arg0: TerminalNode) => T;\n\tunicodeConnectorPunctuation?: (this: NonterminalNode, arg0: TerminalNode) => T;\n\tunicodeSpaceSeparator?: (this: NonterminalNode, arg0: TerminalNode) => T;\n}\n\nexport interface JSImportsSemantics extends Semantics {\n\taddOperation<T>(name: string, actionDict: JSImportsActionDict<T>): this;\n\textendOperation<T>(name: string, actionDict: JSImportsActionDict<T>): this;\n\taddAttribute<T>(name: string, actionDict: JSImportsActionDict<T>): this;\n\textendAttribute<T>(name: string, actionDict: JSImportsActionDict<T>): this;\n}\n\nexport interface JSImportsGrammar extends Grammar {\n\tcreateSemantics(): JSImportsSemantics;\n\textendSemantics(superSemantics: JSImportsSemantics): JSImportsSemantics;\n}\n\ndeclare const grammar: JSImportsGrammar;\nexport default grammar;\n"
  },
  {
    "path": "drizzle-kit/imports-checker/grammar/grammar.ohm-bundle.js",
    "content": "import { makeRecipe } from 'ohm-js';\nconst result = makeRecipe([\n\t'grammar',\n\t{\n\t\tsource:\n\t\t\t'JSImports {\\n    JSImports = (Expr \";\"?)*\\n\\n    Expr = \\n    | comment\\n    | stringLiteral\\n    | ImportExpr\\n    | Rest\\n\\n    ImportExpr =\\n    | \"import\" ImportInner \"from\" importSource -- From\\n    | \"import\" importSource -- NoFrom\\n\\n    Rest = (~(ImportExpr | comment | stringLiteral) any)+\\n\\n    ImportInner = \\n    | (\"type\" \"{\" NonemptyListOf<ImportExtendedSelectionTypeless, \",\"> \",\"? \"}\")            -- Type\\n    | (\"{\" NonemptyListOf<ImportExtendedSelectionTypes, \",\"> \",\"? \"}\")                      -- Types\\n    | (\"{\" NonemptyListOf<ImportExtendedSelection, \",\"> \",\"? \"}\")                           -- Extended\\n    | (identifier (\",\" \"type\"? \"{\" NonemptyListOf<ImportExtendedSelection, \",\"> \",\"? \"}\")?) -- Mixed\\n    | (\"*\" (\"as\" identifier)?)                                                              -- All\\n    | (identifier (\"as\" identifier)?)                                                       -- Default\\n    \\n\\n    ImportExtendedSelection = TypeImport | Import\\n    ImportExtendedSelectionTypes = TypeImport\\n    ImportExtendedSelectionTypeless = Import\\n\\n    Import = identifier (\"as\" identifier)?\\n    TypeImport = \"type\" Import (\"as\" identifier)?\\n\\n    identifier = letter alnum*\\n    quote = \"\\\\\"\" | \"\\'\" | \"`\"\\n    notQuote = ~quote any\\n    importSource =\\n    | \"\\\\\"\" notQuote+ \"\\\\\"\"\\n    | \"\\'\" notQuote+ \"\\'\"\\n    | \"`\" notQuote+ \"`\"\\n\\n    lineTerminator = \"\\\\n\" | \"\\\\r\" | \"\\\\u2028\" | \"\\\\u2029\"\\n    lineTerminatorSequence = \"\\\\n\" | \"\\\\r\" ~\"\\\\n\" | \"\\\\u2028\" | \"\\\\u2029\" | \"\\\\r\\\\n\"\\n    \\n    comment = multiLineComment | singleLineComment\\n\\n    multiLineComment = \"/*\" (~\"*/\" any)* \"*/\"\\n    singleLineComment = \"//\" (~lineTerminator any)*\\n\\n    stringLiteral =\\n    | \"\\\\\"\" doubleStringCharacter* \"\\\\\"\"\\n    | \"\\'\" singleStringCharacter* \"\\'\"\\n    | \"`\" templateStringCharacter* \"`\"\\n    doubleStringCharacter =\\n    | ~(\"\\\\\"\" | \"\\\\\\\\\" | lineTerminator) any   -- NonEscaped\\n    | \"\\\\\\\\\" escapeSequence                   -- Escaped\\n    | lineContinuation                      -- LineContinuation\\n    singleStringCharacter =\\n    | ~(\"\\'\" | \"\\\\\\\\\" | lineTerminator) any    -- NonEscaped\\n    | \"\\\\\\\\\" escapeSequence                   -- Escaped\\n    | lineContinuation                      -- LineContinuation\\n    templateStringCharacter = \\n    | ~ (\"`\" | \"\\\\\\\\\") any                    -- NonEscaped\\n    | \"\\\\\\\\\" escapeSequence                        -- Escaped\\n    lineContinuation = \"\\\\\\\\\" lineTerminatorSequence\\n    escapeSequence = unicodeEscapeSequence | hexEscapeSequence | octalEscapeSequence | characterEscapeSequence\\n    characterEscapeSequence = singleEscapeCharacter | nonEscapeCharacter\\n    singleEscapeCharacter = \"\\'\" | \"\\\\\"\" | \"\\\\\\\\\" | \"b\" | \"f\" | \"n\" | \"r\" | \"t\" | \"v\"\\n    nonEscapeCharacter = ~(escapeCharacter | lineTerminator) any\\n    escapeCharacter = singleEscapeCharacter | decimalDigit | \"x\" | \"u\"\\n    octalEscapeSequence =\\n    | zeroToThree octalDigit octalDigit     -- Whole\\n    | fourToSeven octalDigit                -- EightTimesfourToSeven\\n    | zeroToThree octalDigit ~decimalDigit  -- EightTimesZeroToThree\\n    | octalDigit ~decimalDigit              -- Octal\\n    hexEscapeSequence = \"x\" hexDigit hexDigit\\n    unicodeEscapeSequence = \"u\" hexDigit hexDigit hexDigit hexDigit\\n\\n    zeroToThree = \"0\"..\"3\"\\n    fourToSeven = \"4\"..\"7\"\\n    decimalDigit = \"0\"..\"9\"\\n    nonZeroDigit = \"1\"..\"9\"\\n    octalDigit = \"0\"..\"7\"\\n\\n    regularExpressionLiteral = \"/\" regularExpressionBody \"/\" regularExpressionFlags\\n    regularExpressionBody = regularExpressionFirstChar regularExpressionChar*\\n    regularExpressionFirstChar =\\n    | ~(\"*\" | \"\\\\\\\\\" | \"/\" | \"[\") regularExpressionNonTerminator\\n    | regularExpressionBackslashSequence\\n    | regularExpressionClass\\n    regularExpressionChar = ~(\"\\\\\\\\\" | \"/\" | \"[\") regularExpressionNonTerminator\\n    | regularExpressionBackslashSequence\\n    | regularExpressionClass\\n    regularExpressionBackslashSequence = \"\\\\\\\\\" regularExpressionNonTerminator\\n    regularExpressionNonTerminator = ~(lineTerminator) any\\n    regularExpressionClass = \"[\" regularExpressionClassChar* \"]\"\\n    regularExpressionClassChar =\\n    | ~(\"]\" | \"\\\\\\\\\") regularExpressionNonTerminator\\n    | regularExpressionBackslashSequence\\n    regularExpressionFlags = identifierPart*\\n\\n    multiLineCommentNoNL = \"/*\" (~(\"*/\" | lineTerminator) any)* \"*/\"\\n\\n    identifierStart =\\n    | letter | \"$\" | \"_\"\\n    | \"\\\\\\\\\" unicodeEscapeSequence -- escaped\\n    identifierPart =\\n    | identifierStart | unicodeCombiningMark\\n    | unicodeDigit | unicodeConnectorPunctuation\\n    | \"\\\\u200C\" | \"\\\\u200D\"\\n    letter += unicodeCategoryNl\\n    unicodeCategoryNl\\n    = \"\\\\u2160\"..\"\\\\u2182\" | \"\\\\u3007\" | \"\\\\u3021\"..\"\\\\u3029\"\\n    unicodeDigit (a digit)\\n    = \"\\\\u0030\"..\"\\\\u0039\" | \"\\\\u0660\"..\"\\\\u0669\" | \"\\\\u06F0\"..\"\\\\u06F9\" | \"\\\\u0966\"..\"\\\\u096F\" | \"\\\\u09E6\"..\"\\\\u09EF\" | \"\\\\u0A66\"..\"\\\\u0A6F\" | \"\\\\u0AE6\"..\"\\\\u0AEF\" | \"\\\\u0B66\"..\"\\\\u0B6F\" | \"\\\\u0BE7\"..\"\\\\u0BEF\" | \"\\\\u0C66\"..\"\\\\u0C6F\" | \"\\\\u0CE6\"..\"\\\\u0CEF\" | \"\\\\u0D66\"..\"\\\\u0D6F\" | \"\\\\u0E50\"..\"\\\\u0E59\" | \"\\\\u0ED0\"..\"\\\\u0ED9\" | \"\\\\u0F20\"..\"\\\\u0F29\" | \"\\\\uFF10\"..\"\\\\uFF19\"\\n\\n    unicodeCombiningMark (a Unicode combining mark)\\n    = \"\\\\u0300\"..\"\\\\u0345\" | \"\\\\u0360\"..\"\\\\u0361\" | \"\\\\u0483\"..\"\\\\u0486\" | \"\\\\u0591\"..\"\\\\u05A1\" | \"\\\\u05A3\"..\"\\\\u05B9\" | \"\\\\u05BB\"..\"\\\\u05BD\" | \"\\\\u05BF\"..\"\\\\u05BF\" | \"\\\\u05C1\"..\"\\\\u05C2\" | \"\\\\u05C4\"..\"\\\\u05C4\" | \"\\\\u064B\"..\"\\\\u0652\" | \"\\\\u0670\"..\"\\\\u0670\" | \"\\\\u06D6\"..\"\\\\u06DC\" | \"\\\\u06DF\"..\"\\\\u06E4\" | \"\\\\u06E7\"..\"\\\\u06E8\" | \"\\\\u06EA\"..\"\\\\u06ED\" | \"\\\\u0901\"..\"\\\\u0902\" | \"\\\\u093C\"..\"\\\\u093C\" | \"\\\\u0941\"..\"\\\\u0948\" | \"\\\\u094D\"..\"\\\\u094D\" | \"\\\\u0951\"..\"\\\\u0954\" | \"\\\\u0962\"..\"\\\\u0963\" | \"\\\\u0981\"..\"\\\\u0981\" | \"\\\\u09BC\"..\"\\\\u09BC\" | \"\\\\u09C1\"..\"\\\\u09C4\" | \"\\\\u09CD\"..\"\\\\u09CD\" | \"\\\\u09E2\"..\"\\\\u09E3\" | \"\\\\u0A02\"..\"\\\\u0A02\" | \"\\\\u0A3C\"..\"\\\\u0A3C\" | \"\\\\u0A41\"..\"\\\\u0A42\" | \"\\\\u0A47\"..\"\\\\u0A48\" | \"\\\\u0A4B\"..\"\\\\u0A4D\" | \"\\\\u0A70\"..\"\\\\u0A71\" | \"\\\\u0A81\"..\"\\\\u0A82\" | \"\\\\u0ABC\"..\"\\\\u0ABC\" | \"\\\\u0AC1\"..\"\\\\u0AC5\" | \"\\\\u0AC7\"..\"\\\\u0AC8\" | \"\\\\u0ACD\"..\"\\\\u0ACD\" | \"\\\\u0B01\"..\"\\\\u0B01\" | \"\\\\u0B3C\"..\"\\\\u0B3C\" | \"\\\\u0B3F\"..\"\\\\u0B3F\" | \"\\\\u0B41\"..\"\\\\u0B43\" | \"\\\\u0B4D\"..\"\\\\u0B4D\" | \"\\\\u0B56\"..\"\\\\u0B56\" | \"\\\\u0B82\"..\"\\\\u0B82\" | \"\\\\u0BC0\"..\"\\\\u0BC0\" | \"\\\\u0BCD\"..\"\\\\u0BCD\" | \"\\\\u0C3E\"..\"\\\\u0C40\" | \"\\\\u0C46\"..\"\\\\u0C48\" | \"\\\\u0C4A\"..\"\\\\u0C4D\" | \"\\\\u0C55\"..\"\\\\u0C56\" | \"\\\\u0CBF\"..\"\\\\u0CBF\" | \"\\\\u0CC6\"..\"\\\\u0CC6\" | \"\\\\u0CCC\"..\"\\\\u0CCD\" | \"\\\\u0D41\"..\"\\\\u0D43\" | \"\\\\u0D4D\"..\"\\\\u0D4D\" | \"\\\\u0E31\"..\"\\\\u0E31\" | \"\\\\u0E34\"..\"\\\\u0E3A\" | \"\\\\u0E47\"..\"\\\\u0E4E\" | \"\\\\u0EB1\"..\"\\\\u0EB1\" | \"\\\\u0EB4\"..\"\\\\u0EB9\" | \"\\\\u0EBB\"..\"\\\\u0EBC\" | \"\\\\u0EC8\"..\"\\\\u0ECD\" | \"\\\\u0F18\"..\"\\\\u0F19\" | \"\\\\u0F35\"..\"\\\\u0F35\" | \"\\\\u0F37\"..\"\\\\u0F37\" | \"\\\\u0F39\"..\"\\\\u0F39\" | \"\\\\u0F71\"..\"\\\\u0F7E\" | \"\\\\u0F80\"..\"\\\\u0F84\" | \"\\\\u0F86\"..\"\\\\u0F87\" | \"\\\\u0F90\"..\"\\\\u0F95\" | \"\\\\u0F97\"..\"\\\\u0F97\" | \"\\\\u0F99\"..\"\\\\u0FAD\" | \"\\\\u0FB1\"..\"\\\\u0FB7\" | \"\\\\u0FB9\"..\"\\\\u0FB9\" | \"\\\\u20D0\"..\"\\\\u20DC\" | \"\\\\u20E1\"..\"\\\\u20E1\" | \"\\\\u302A\"..\"\\\\u302F\" | \"\\\\u3099\"..\"\\\\u309A\" | \"\\\\uFB1E\"..\"\\\\uFB1E\" | \"\\\\uFE20\"..\"\\\\uFE23\"\\n\\n    unicodeConnectorPunctuation = \"\\\\u005F\" | \"\\\\u203F\"..\"\\\\u2040\" | \"\\\\u30FB\" | \"\\\\uFE33\"..\"\\\\uFE34\" | \"\\\\uFE4D\"..\"\\\\uFE4F\" | \"\\\\uFF3F\" | \"\\\\uFF65\"\\n    unicodeSpaceSeparator = \"\\\\u2000\"..\"\\\\u200B\" | \"\\\\u3000\"\\n\\n}',\n\t},\n\t'JSImports',\n\tnull,\n\t'JSImports',\n\t{\n\t\tJSImports: ['define', { sourceInterval: [16, 40] }, null, [], ['star', { sourceInterval: [28, 40] }, [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [29, 38] },\n\t\t\t['app', { sourceInterval: [29, 33] }, 'Expr', []],\n\t\t\t['opt', { sourceInterval: [34, 38] }, ['terminal', { sourceInterval: [34, 37] }, ';']],\n\t\t]]],\n\t\tExpr: ['define', { sourceInterval: [46, 115] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [58, 115] },\n\t\t\t['app', { sourceInterval: [60, 67] }, 'comment', []],\n\t\t\t['app', { sourceInterval: [74, 87] }, 'stringLiteral', []],\n\t\t\t['app', { sourceInterval: [94, 104] }, 'ImportExpr', []],\n\t\t\t['app', { sourceInterval: [111, 115] }, 'Rest', []],\n\t\t]],\n\t\tImportExpr_From: ['define', { sourceInterval: [140, 188] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [140, 180] },\n\t\t\t['terminal', { sourceInterval: [140, 148] }, 'import'],\n\t\t\t['app', { sourceInterval: [149, 160] }, 'ImportInner', []],\n\t\t\t['terminal', { sourceInterval: [161, 167] }, 'from'],\n\t\t\t['app', { sourceInterval: [168, 180] }, 'importSource', []],\n\t\t]],\n\t\tImportExpr_NoFrom: ['define', { sourceInterval: [195, 226] }, null, [], ['seq', { sourceInterval: [195, 216] }, [\n\t\t\t'terminal',\n\t\t\t{ sourceInterval: [195, 203] },\n\t\t\t'import',\n\t\t], ['app', { sourceInterval: [204, 216] }, 'importSource', []]]],\n\t\tImportExpr: ['define', { sourceInterval: [121, 226] }, null, [], ['alt', { sourceInterval: [138, 226] }, [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [140, 180] },\n\t\t\t'ImportExpr_From',\n\t\t\t[],\n\t\t], ['app', { sourceInterval: [195, 216] }, 'ImportExpr_NoFrom', []]]],\n\t\tRest: ['define', { sourceInterval: [232, 285] }, null, [], ['plus', { sourceInterval: [239, 285] }, ['seq', {\n\t\t\tsourceInterval: [240, 283],\n\t\t}, ['not', { sourceInterval: [240, 279] }, [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [242, 278] },\n\t\t\t['app', { sourceInterval: [242, 252] }, 'ImportExpr', []],\n\t\t\t['app', { sourceInterval: [255, 262] }, 'comment', []],\n\t\t\t['app', { sourceInterval: [265, 278] }, 'stringLiteral', []],\n\t\t]], ['app', { sourceInterval: [280, 283] }, 'any', []]]]],\n\t\tImportInner_Type: ['define', { sourceInterval: [312, 405] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [312, 386] },\n\t\t\t['terminal', { sourceInterval: [313, 319] }, 'type'],\n\t\t\t['terminal', { sourceInterval: [320, 323] }, '{'],\n\t\t\t['app', { sourceInterval: [324, 376] }, 'NonemptyListOf', [[\n\t\t\t\t'app',\n\t\t\t\t{ sourceInterval: [339, 370] },\n\t\t\t\t'ImportExtendedSelectionTypeless',\n\t\t\t\t[],\n\t\t\t], ['terminal', { sourceInterval: [372, 375] }, ',']]],\n\t\t\t['opt', { sourceInterval: [377, 381] }, ['terminal', { sourceInterval: [377, 380] }, ',']],\n\t\t\t['terminal', { sourceInterval: [382, 385] }, '}'],\n\t\t]],\n\t\tImportInner_Types: ['define', { sourceInterval: [412, 506] }, null, [], ['seq', { sourceInterval: [412, 476] }, [\n\t\t\t'terminal',\n\t\t\t{ sourceInterval: [413, 416] },\n\t\t\t'{',\n\t\t], ['app', { sourceInterval: [417, 466] }, 'NonemptyListOf', [[\n\t\t\t'app',\n\t\t\t{ sourceInterval: [432, 460] },\n\t\t\t'ImportExtendedSelectionTypes',\n\t\t\t[],\n\t\t], ['terminal', { sourceInterval: [462, 465] }, ',']]], ['opt', { sourceInterval: [467, 471] }, ['terminal', {\n\t\t\tsourceInterval: [467, 470],\n\t\t}, ',']], ['terminal', { sourceInterval: [472, 475] }, '}']]],\n\t\tImportInner_Extended: ['define', { sourceInterval: [513, 610] }, null, [], ['seq', { sourceInterval: [513, 572] }, [\n\t\t\t'terminal',\n\t\t\t{ sourceInterval: [514, 517] },\n\t\t\t'{',\n\t\t], ['app', { sourceInterval: [518, 562] }, 'NonemptyListOf', [[\n\t\t\t'app',\n\t\t\t{ sourceInterval: [533, 556] },\n\t\t\t'ImportExtendedSelection',\n\t\t\t[],\n\t\t], ['terminal', { sourceInterval: [558, 561] }, ',']]], ['opt', { sourceInterval: [563, 567] }, ['terminal', {\n\t\t\tsourceInterval: [563, 566],\n\t\t}, ',']], ['terminal', { sourceInterval: [568, 571] }, '}']]],\n\t\tImportInner_Mixed: ['define', { sourceInterval: [617, 711] }, null, [], ['seq', { sourceInterval: [617, 702] }, [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [618, 628] },\n\t\t\t'identifier',\n\t\t\t[],\n\t\t], ['opt', { sourceInterval: [629, 701] }, [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [630, 699] },\n\t\t\t['terminal', { sourceInterval: [630, 633] }, ','],\n\t\t\t['opt', { sourceInterval: [634, 641] }, ['terminal', { sourceInterval: [634, 640] }, 'type']],\n\t\t\t['terminal', { sourceInterval: [642, 645] }, '{'],\n\t\t\t['app', { sourceInterval: [646, 690] }, 'NonemptyListOf', [[\n\t\t\t\t'app',\n\t\t\t\t{ sourceInterval: [661, 684] },\n\t\t\t\t'ImportExtendedSelection',\n\t\t\t\t[],\n\t\t\t], ['terminal', { sourceInterval: [686, 689] }, ',']]],\n\t\t\t['opt', { sourceInterval: [691, 695] }, ['terminal', { sourceInterval: [691, 694] }, ',']],\n\t\t\t['terminal', { sourceInterval: [696, 699] }, '}'],\n\t\t]]]],\n\t\tImportInner_All: ['define', { sourceInterval: [718, 810] }, null, [], ['seq', { sourceInterval: [718, 742] }, [\n\t\t\t'terminal',\n\t\t\t{ sourceInterval: [719, 722] },\n\t\t\t'*',\n\t\t], ['opt', { sourceInterval: [723, 741] }, ['seq', { sourceInterval: [724, 739] }, ['terminal', {\n\t\t\tsourceInterval: [724, 728],\n\t\t}, 'as'], ['app', { sourceInterval: [729, 739] }, 'identifier', []]]]]],\n\t\tImportInner_Default: ['define', { sourceInterval: [817, 913] }, null, [], ['seq', { sourceInterval: [817, 848] }, [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [818, 828] },\n\t\t\t'identifier',\n\t\t\t[],\n\t\t], ['opt', { sourceInterval: [829, 847] }, ['seq', { sourceInterval: [830, 845] }, ['terminal', {\n\t\t\tsourceInterval: [830, 834],\n\t\t}, 'as'], ['app', { sourceInterval: [835, 845] }, 'identifier', []]]]]],\n\t\tImportInner: ['define', { sourceInterval: [291, 913] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [310, 913] },\n\t\t\t['app', { sourceInterval: [312, 386] }, 'ImportInner_Type', []],\n\t\t\t['app', { sourceInterval: [412, 476] }, 'ImportInner_Types', []],\n\t\t\t['app', { sourceInterval: [513, 572] }, 'ImportInner_Extended', []],\n\t\t\t['app', { sourceInterval: [617, 702] }, 'ImportInner_Mixed', []],\n\t\t\t['app', { sourceInterval: [718, 742] }, 'ImportInner_All', []],\n\t\t\t['app', { sourceInterval: [817, 848] }, 'ImportInner_Default', []],\n\t\t]],\n\t\tImportExtendedSelection: ['define', { sourceInterval: [924, 969] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [950, 969] },\n\t\t\t['app', { sourceInterval: [950, 960] }, 'TypeImport', []],\n\t\t\t['app', { sourceInterval: [963, 969] }, 'Import', []],\n\t\t]],\n\t\tImportExtendedSelectionTypes: ['define', { sourceInterval: [974, 1015] }, null, [], [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [1005, 1015] },\n\t\t\t'TypeImport',\n\t\t\t[],\n\t\t]],\n\t\tImportExtendedSelectionTypeless: ['define', { sourceInterval: [1020, 1060] }, null, [], [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [1054, 1060] },\n\t\t\t'Import',\n\t\t\t[],\n\t\t]],\n\t\tImport: ['define', { sourceInterval: [1066, 1104] }, null, [], ['seq', { sourceInterval: [1075, 1104] }, [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [1075, 1085] },\n\t\t\t'identifier',\n\t\t\t[],\n\t\t], ['opt', { sourceInterval: [1086, 1104] }, ['seq', { sourceInterval: [1087, 1102] }, ['terminal', {\n\t\t\tsourceInterval: [1087, 1091],\n\t\t}, 'as'], ['app', { sourceInterval: [1092, 1102] }, 'identifier', []]]]]],\n\t\tTypeImport: ['define', { sourceInterval: [1109, 1154] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [1122, 1154] },\n\t\t\t['terminal', { sourceInterval: [1122, 1128] }, 'type'],\n\t\t\t['app', { sourceInterval: [1129, 1135] }, 'Import', []],\n\t\t\t['opt', { sourceInterval: [1136, 1154] }, ['seq', { sourceInterval: [1137, 1152] }, ['terminal', {\n\t\t\t\tsourceInterval: [1137, 1141],\n\t\t\t}, 'as'], ['app', { sourceInterval: [1142, 1152] }, 'identifier', []]]],\n\t\t]],\n\t\tidentifier: ['define', { sourceInterval: [1160, 1186] }, null, [], ['seq', { sourceInterval: [1173, 1186] }, [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [1173, 1179] },\n\t\t\t'letter',\n\t\t\t[],\n\t\t], ['star', { sourceInterval: [1180, 1186] }, ['app', { sourceInterval: [1180, 1185] }, 'alnum', []]]]],\n\t\tquote: ['define', { sourceInterval: [1191, 1215] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [1199, 1215] },\n\t\t\t['terminal', { sourceInterval: [1199, 1203] }, '\"'],\n\t\t\t['terminal', { sourceInterval: [1206, 1209] }, \"'\"],\n\t\t\t['terminal', { sourceInterval: [1212, 1215] }, '`'],\n\t\t]],\n\t\tnotQuote: ['define', { sourceInterval: [1220, 1241] }, null, [], ['seq', { sourceInterval: [1231, 1241] }, ['not', {\n\t\t\tsourceInterval: [1231, 1237],\n\t\t}, ['app', { sourceInterval: [1232, 1237] }, 'quote', []]], ['app', { sourceInterval: [1238, 1241] }, 'any', []]]],\n\t\timportSource: ['define', { sourceInterval: [1246, 1334] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [1265, 1334] },\n\t\t\t['seq', { sourceInterval: [1267, 1286] }, ['terminal', { sourceInterval: [1267, 1271] }, '\"'], ['plus', {\n\t\t\t\tsourceInterval: [1272, 1281],\n\t\t\t}, ['app', { sourceInterval: [1272, 1280] }, 'notQuote', []]], [\n\t\t\t\t'terminal',\n\t\t\t\t{ sourceInterval: [1282, 1286] },\n\t\t\t\t'\"',\n\t\t\t]],\n\t\t\t['seq', { sourceInterval: [1293, 1310] }, ['terminal', { sourceInterval: [1293, 1296] }, \"'\"], ['plus', {\n\t\t\t\tsourceInterval: [1297, 1306],\n\t\t\t}, ['app', { sourceInterval: [1297, 1305] }, 'notQuote', []]], [\n\t\t\t\t'terminal',\n\t\t\t\t{ sourceInterval: [1307, 1310] },\n\t\t\t\t\"'\",\n\t\t\t]],\n\t\t\t['seq', { sourceInterval: [1317, 1334] }, ['terminal', { sourceInterval: [1317, 1320] }, '`'], ['plus', {\n\t\t\t\tsourceInterval: [1321, 1330],\n\t\t\t}, ['app', { sourceInterval: [1321, 1329] }, 'notQuote', []]], [\n\t\t\t\t'terminal',\n\t\t\t\t{ sourceInterval: [1331, 1334] },\n\t\t\t\t'`',\n\t\t\t]],\n\t\t]],\n\t\tlineTerminator: ['define', { sourceInterval: [1340, 1390] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [1357, 1390] },\n\t\t\t['terminal', { sourceInterval: [1357, 1361] }, '\\n'],\n\t\t\t['terminal', { sourceInterval: [1364, 1368] }, '\\r'],\n\t\t\t['terminal', { sourceInterval: [1371, 1379] }, '\\u2028'],\n\t\t\t['terminal', { sourceInterval: [1382, 1390] }, '\\u2029'],\n\t\t]],\n\t\tlineTerminatorSequence: ['define', { sourceInterval: [1395, 1468] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [1420, 1468] },\n\t\t\t['terminal', { sourceInterval: [1420, 1424] }, '\\n'],\n\t\t\t['seq', { sourceInterval: [1427, 1437] }, ['terminal', { sourceInterval: [1427, 1431] }, '\\r'], ['not', {\n\t\t\t\tsourceInterval: [1432, 1437],\n\t\t\t}, ['terminal', { sourceInterval: [1433, 1437] }, '\\n']]],\n\t\t\t['terminal', { sourceInterval: [1440, 1448] }, '\\u2028'],\n\t\t\t['terminal', { sourceInterval: [1451, 1459] }, '\\u2029'],\n\t\t\t['terminal', { sourceInterval: [1462, 1468] }, '\\r\\n'],\n\t\t]],\n\t\tcomment: ['define', { sourceInterval: [1478, 1524] }, null, [], ['alt', { sourceInterval: [1488, 1524] }, [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [1488, 1504] },\n\t\t\t'multiLineComment',\n\t\t\t[],\n\t\t], ['app', { sourceInterval: [1507, 1524] }, 'singleLineComment', []]]],\n\t\tmultiLineComment: ['define', { sourceInterval: [1530, 1571] }, null, [], ['seq', { sourceInterval: [1549, 1571] }, [\n\t\t\t'terminal',\n\t\t\t{ sourceInterval: [1549, 1553] },\n\t\t\t'/*',\n\t\t], ['star', { sourceInterval: [1554, 1566] }, ['seq', { sourceInterval: [1555, 1564] }, ['not', {\n\t\t\tsourceInterval: [1555, 1560],\n\t\t}, ['terminal', { sourceInterval: [1556, 1560] }, '*/']], ['app', { sourceInterval: [1561, 1564] }, 'any', []]]], [\n\t\t\t'terminal',\n\t\t\t{ sourceInterval: [1567, 1571] },\n\t\t\t'*/',\n\t\t]]],\n\t\tsingleLineComment: ['define', { sourceInterval: [1576, 1623] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [1596, 1623] },\n\t\t\t['terminal', { sourceInterval: [1596, 1600] }, '//'],\n\t\t\t['star', { sourceInterval: [1601, 1623] }, ['seq', { sourceInterval: [1602, 1621] }, ['not', {\n\t\t\t\tsourceInterval: [1602, 1617],\n\t\t\t}, ['app', { sourceInterval: [1603, 1617] }, 'lineTerminator', []]], [\n\t\t\t\t'app',\n\t\t\t\t{ sourceInterval: [1618, 1621] },\n\t\t\t\t'any',\n\t\t\t\t[],\n\t\t\t]]],\n\t\t]],\n\t\tstringLiteral: ['define', { sourceInterval: [1629, 1759] }, null, [], ['alt', { sourceInterval: [1649, 1759] }, [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [1651, 1683] },\n\t\t\t['terminal', { sourceInterval: [1651, 1655] }, '\"'],\n\t\t\t['star', { sourceInterval: [1656, 1678] }, [\n\t\t\t\t'app',\n\t\t\t\t{ sourceInterval: [1656, 1677] },\n\t\t\t\t'doubleStringCharacter',\n\t\t\t\t[],\n\t\t\t]],\n\t\t\t['terminal', { sourceInterval: [1679, 1683] }, '\"'],\n\t\t], ['seq', { sourceInterval: [1690, 1720] }, ['terminal', { sourceInterval: [1690, 1693] }, \"'\"], ['star', {\n\t\t\tsourceInterval: [1694, 1716],\n\t\t}, ['app', { sourceInterval: [1694, 1715] }, 'singleStringCharacter', []]], ['terminal', {\n\t\t\tsourceInterval: [1717, 1720],\n\t\t}, \"'\"]], ['seq', { sourceInterval: [1727, 1759] }, ['terminal', { sourceInterval: [1727, 1730] }, '`'], ['star', {\n\t\t\tsourceInterval: [1731, 1755],\n\t\t}, ['app', { sourceInterval: [1731, 1754] }, 'templateStringCharacter', []]], ['terminal', {\n\t\t\tsourceInterval: [1756, 1759],\n\t\t}, '`']]]],\n\t\tdoubleStringCharacter_NonEscaped: ['define', { sourceInterval: [1794, 1845] }, null, [], ['seq', {\n\t\t\tsourceInterval: [1794, 1829],\n\t\t}, ['not', { sourceInterval: [1794, 1825] }, [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [1796, 1824] },\n\t\t\t['terminal', { sourceInterval: [1796, 1800] }, '\"'],\n\t\t\t['terminal', { sourceInterval: [1803, 1807] }, '\\\\'],\n\t\t\t['app', { sourceInterval: [1810, 1824] }, 'lineTerminator', []],\n\t\t]], ['app', { sourceInterval: [1826, 1829] }, 'any', []]]],\n\t\tdoubleStringCharacter_Escaped: ['define', { sourceInterval: [1852, 1900] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [1852, 1871] },\n\t\t\t['terminal', { sourceInterval: [1852, 1856] }, '\\\\'],\n\t\t\t['app', { sourceInterval: [1857, 1871] }, 'escapeSequence', []],\n\t\t]],\n\t\tdoubleStringCharacter_LineContinuation: ['define', { sourceInterval: [1907, 1964] }, null, [], [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [1907, 1923] },\n\t\t\t'lineContinuation',\n\t\t\t[],\n\t\t]],\n\t\tdoubleStringCharacter: ['define', { sourceInterval: [1764, 1964] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [1792, 1964] },\n\t\t\t['app', { sourceInterval: [1794, 1829] }, 'doubleStringCharacter_NonEscaped', []],\n\t\t\t['app', { sourceInterval: [1852, 1871] }, 'doubleStringCharacter_Escaped', []],\n\t\t\t['app', { sourceInterval: [1907, 1923] }, 'doubleStringCharacter_LineContinuation', []],\n\t\t]],\n\t\tsingleStringCharacter_NonEscaped: ['define', { sourceInterval: [1999, 2050] }, null, [], ['seq', {\n\t\t\tsourceInterval: [1999, 2033],\n\t\t}, ['not', { sourceInterval: [1999, 2029] }, [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [2001, 2028] },\n\t\t\t['terminal', { sourceInterval: [2001, 2004] }, \"'\"],\n\t\t\t['terminal', { sourceInterval: [2007, 2011] }, '\\\\'],\n\t\t\t['app', { sourceInterval: [2014, 2028] }, 'lineTerminator', []],\n\t\t]], ['app', { sourceInterval: [2030, 2033] }, 'any', []]]],\n\t\tsingleStringCharacter_Escaped: ['define', { sourceInterval: [2057, 2105] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [2057, 2076] },\n\t\t\t['terminal', { sourceInterval: [2057, 2061] }, '\\\\'],\n\t\t\t['app', { sourceInterval: [2062, 2076] }, 'escapeSequence', []],\n\t\t]],\n\t\tsingleStringCharacter_LineContinuation: ['define', { sourceInterval: [2112, 2169] }, null, [], [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [2112, 2128] },\n\t\t\t'lineContinuation',\n\t\t\t[],\n\t\t]],\n\t\tsingleStringCharacter: ['define', { sourceInterval: [1969, 2169] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [1997, 2169] },\n\t\t\t['app', { sourceInterval: [1999, 2033] }, 'singleStringCharacter_NonEscaped', []],\n\t\t\t['app', { sourceInterval: [2057, 2076] }, 'singleStringCharacter_Escaped', []],\n\t\t\t['app', { sourceInterval: [2112, 2128] }, 'singleStringCharacter_LineContinuation', []],\n\t\t]],\n\t\ttemplateStringCharacter_NonEscaped: ['define', { sourceInterval: [2207, 2258] }, null, [], ['seq', {\n\t\t\tsourceInterval: [2207, 2225],\n\t\t}, ['not', { sourceInterval: [2207, 2221] }, ['alt', { sourceInterval: [2210, 2220] }, ['terminal', {\n\t\t\tsourceInterval: [2210, 2213],\n\t\t}, '`'], ['terminal', { sourceInterval: [2216, 2220] }, '\\\\']]], [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [2222, 2225] },\n\t\t\t'any',\n\t\t\t[],\n\t\t]]],\n\t\ttemplateStringCharacter_Escaped: ['define', { sourceInterval: [2265, 2318] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [2265, 2284] },\n\t\t\t['terminal', { sourceInterval: [2265, 2269] }, '\\\\'],\n\t\t\t['app', { sourceInterval: [2270, 2284] }, 'escapeSequence', []],\n\t\t]],\n\t\ttemplateStringCharacter: ['define', { sourceInterval: [2174, 2318] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [2205, 2318] },\n\t\t\t['app', { sourceInterval: [2207, 2225] }, 'templateStringCharacter_NonEscaped', []],\n\t\t\t['app', { sourceInterval: [2265, 2284] }, 'templateStringCharacter_Escaped', []],\n\t\t]],\n\t\tlineContinuation: ['define', { sourceInterval: [2323, 2369] }, null, [], ['seq', { sourceInterval: [2342, 2369] }, [\n\t\t\t'terminal',\n\t\t\t{ sourceInterval: [2342, 2346] },\n\t\t\t'\\\\',\n\t\t], ['app', { sourceInterval: [2347, 2369] }, 'lineTerminatorSequence', []]]],\n\t\tescapeSequence: ['define', { sourceInterval: [2374, 2480] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [2391, 2480] },\n\t\t\t['app', { sourceInterval: [2391, 2412] }, 'unicodeEscapeSequence', []],\n\t\t\t['app', { sourceInterval: [2415, 2432] }, 'hexEscapeSequence', []],\n\t\t\t['app', { sourceInterval: [2435, 2454] }, 'octalEscapeSequence', []],\n\t\t\t['app', { sourceInterval: [2457, 2480] }, 'characterEscapeSequence', []],\n\t\t]],\n\t\tcharacterEscapeSequence: ['define', { sourceInterval: [2485, 2553] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [2511, 2553] },\n\t\t\t['app', { sourceInterval: [2511, 2532] }, 'singleEscapeCharacter', []],\n\t\t\t['app', { sourceInterval: [2535, 2553] }, 'nonEscapeCharacter', []],\n\t\t]],\n\t\tsingleEscapeCharacter: ['define', { sourceInterval: [2558, 2635] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [2582, 2635] },\n\t\t\t['terminal', { sourceInterval: [2582, 2585] }, \"'\"],\n\t\t\t['terminal', { sourceInterval: [2588, 2592] }, '\"'],\n\t\t\t['terminal', { sourceInterval: [2595, 2599] }, '\\\\'],\n\t\t\t['terminal', { sourceInterval: [2602, 2605] }, 'b'],\n\t\t\t['terminal', { sourceInterval: [2608, 2611] }, 'f'],\n\t\t\t['terminal', { sourceInterval: [2614, 2617] }, 'n'],\n\t\t\t['terminal', { sourceInterval: [2620, 2623] }, 'r'],\n\t\t\t['terminal', { sourceInterval: [2626, 2629] }, 't'],\n\t\t\t['terminal', { sourceInterval: [2632, 2635] }, 'v'],\n\t\t]],\n\t\tnonEscapeCharacter: ['define', { sourceInterval: [2640, 2700] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [2661, 2700] },\n\t\t\t['not', { sourceInterval: [2661, 2696] }, ['alt', { sourceInterval: [2663, 2695] }, [\n\t\t\t\t'app',\n\t\t\t\t{ sourceInterval: [2663, 2678] },\n\t\t\t\t'escapeCharacter',\n\t\t\t\t[],\n\t\t\t], ['app', { sourceInterval: [2681, 2695] }, 'lineTerminator', []]]],\n\t\t\t['app', { sourceInterval: [2697, 2700] }, 'any', []],\n\t\t]],\n\t\tescapeCharacter: ['define', { sourceInterval: [2705, 2771] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [2723, 2771] },\n\t\t\t['app', { sourceInterval: [2723, 2744] }, 'singleEscapeCharacter', []],\n\t\t\t['app', { sourceInterval: [2747, 2759] }, 'decimalDigit', []],\n\t\t\t['terminal', { sourceInterval: [2762, 2765] }, 'x'],\n\t\t\t['terminal', { sourceInterval: [2768, 2771] }, 'u'],\n\t\t]],\n\t\toctalEscapeSequence_Whole: ['define', { sourceInterval: [2804, 2850] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [2804, 2837] },\n\t\t\t['app', { sourceInterval: [2804, 2815] }, 'zeroToThree', []],\n\t\t\t['app', { sourceInterval: [2816, 2826] }, 'octalDigit', []],\n\t\t\t['app', { sourceInterval: [2827, 2837] }, 'octalDigit', []],\n\t\t]],\n\t\toctalEscapeSequence_EightTimesfourToSeven: ['define', { sourceInterval: [2857, 2919] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [2857, 2879] },\n\t\t\t['app', { sourceInterval: [2857, 2868] }, 'fourToSeven', []],\n\t\t\t['app', { sourceInterval: [2869, 2879] }, 'octalDigit', []],\n\t\t]],\n\t\toctalEscapeSequence_EightTimesZeroToThree: ['define', { sourceInterval: [2926, 2988] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [2926, 2962] },\n\t\t\t['app', { sourceInterval: [2926, 2937] }, 'zeroToThree', []],\n\t\t\t['app', { sourceInterval: [2938, 2948] }, 'octalDigit', []],\n\t\t\t['not', { sourceInterval: [2949, 2962] }, ['app', { sourceInterval: [2950, 2962] }, 'decimalDigit', []]],\n\t\t]],\n\t\toctalEscapeSequence_Octal: ['define', { sourceInterval: [2995, 3041] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [2995, 3019] },\n\t\t\t['app', { sourceInterval: [2995, 3005] }, 'octalDigit', []],\n\t\t\t['not', { sourceInterval: [3006, 3019] }, ['app', { sourceInterval: [3007, 3019] }, 'decimalDigit', []]],\n\t\t]],\n\t\toctalEscapeSequence: ['define', { sourceInterval: [2776, 3041] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [2802, 3041] },\n\t\t\t['app', { sourceInterval: [2804, 2837] }, 'octalEscapeSequence_Whole', []],\n\t\t\t['app', { sourceInterval: [2857, 2879] }, 'octalEscapeSequence_EightTimesfourToSeven', []],\n\t\t\t['app', { sourceInterval: [2926, 2962] }, 'octalEscapeSequence_EightTimesZeroToThree', []],\n\t\t\t['app', { sourceInterval: [2995, 3019] }, 'octalEscapeSequence_Octal', []],\n\t\t]],\n\t\thexEscapeSequence: ['define', { sourceInterval: [3046, 3087] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [3066, 3087] },\n\t\t\t['terminal', { sourceInterval: [3066, 3069] }, 'x'],\n\t\t\t['app', { sourceInterval: [3070, 3078] }, 'hexDigit', []],\n\t\t\t['app', { sourceInterval: [3079, 3087] }, 'hexDigit', []],\n\t\t]],\n\t\tunicodeEscapeSequence: ['define', { sourceInterval: [3092, 3155] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [3116, 3155] },\n\t\t\t['terminal', { sourceInterval: [3116, 3119] }, 'u'],\n\t\t\t['app', { sourceInterval: [3120, 3128] }, 'hexDigit', []],\n\t\t\t['app', { sourceInterval: [3129, 3137] }, 'hexDigit', []],\n\t\t\t['app', { sourceInterval: [3138, 3146] }, 'hexDigit', []],\n\t\t\t['app', { sourceInterval: [3147, 3155] }, 'hexDigit', []],\n\t\t]],\n\t\tzeroToThree: ['define', { sourceInterval: [3161, 3183] }, null, [], [\n\t\t\t'range',\n\t\t\t{ sourceInterval: [3175, 3183] },\n\t\t\t'0',\n\t\t\t'3',\n\t\t]],\n\t\tfourToSeven: ['define', { sourceInterval: [3188, 3210] }, null, [], [\n\t\t\t'range',\n\t\t\t{ sourceInterval: [3202, 3210] },\n\t\t\t'4',\n\t\t\t'7',\n\t\t]],\n\t\tdecimalDigit: ['define', { sourceInterval: [3215, 3238] }, null, [], [\n\t\t\t'range',\n\t\t\t{ sourceInterval: [3230, 3238] },\n\t\t\t'0',\n\t\t\t'9',\n\t\t]],\n\t\tnonZeroDigit: ['define', { sourceInterval: [3243, 3266] }, null, [], [\n\t\t\t'range',\n\t\t\t{ sourceInterval: [3258, 3266] },\n\t\t\t'1',\n\t\t\t'9',\n\t\t]],\n\t\toctalDigit: ['define', { sourceInterval: [3271, 3292] }, null, [], [\n\t\t\t'range',\n\t\t\t{ sourceInterval: [3284, 3292] },\n\t\t\t'0',\n\t\t\t'7',\n\t\t]],\n\t\tregularExpressionLiteral: ['define', { sourceInterval: [3298, 3377] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [3325, 3377] },\n\t\t\t['terminal', { sourceInterval: [3325, 3328] }, '/'],\n\t\t\t['app', { sourceInterval: [3329, 3350] }, 'regularExpressionBody', []],\n\t\t\t['terminal', { sourceInterval: [3351, 3354] }, '/'],\n\t\t\t['app', { sourceInterval: [3355, 3377] }, 'regularExpressionFlags', []],\n\t\t]],\n\t\tregularExpressionBody: ['define', { sourceInterval: [3382, 3455] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [3406, 3455] },\n\t\t\t['app', { sourceInterval: [3406, 3432] }, 'regularExpressionFirstChar', []],\n\t\t\t['star', { sourceInterval: [3433, 3455] }, [\n\t\t\t\t'app',\n\t\t\t\t{ sourceInterval: [3433, 3454] },\n\t\t\t\t'regularExpressionChar',\n\t\t\t\t[],\n\t\t\t]],\n\t\t]],\n\t\tregularExpressionFirstChar: ['define', { sourceInterval: [3460, 3621] }, null, [], ['alt', {\n\t\t\tsourceInterval: [3493, 3621],\n\t\t}, ['seq', { sourceInterval: [3495, 3551] }, ['not', { sourceInterval: [3495, 3520] }, [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [3497, 3519] },\n\t\t\t['terminal', { sourceInterval: [3497, 3500] }, '*'],\n\t\t\t['terminal', { sourceInterval: [3503, 3507] }, '\\\\'],\n\t\t\t['terminal', { sourceInterval: [3510, 3513] }, '/'],\n\t\t\t['terminal', { sourceInterval: [3516, 3519] }, '['],\n\t\t]], ['app', { sourceInterval: [3521, 3551] }, 'regularExpressionNonTerminator', []]], [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [3558, 3592] },\n\t\t\t'regularExpressionBackslashSequence',\n\t\t\t[],\n\t\t], ['app', { sourceInterval: [3599, 3621] }, 'regularExpressionClass', []]]],\n\t\tregularExpressionChar: ['define', { sourceInterval: [3626, 3770] }, null, [], ['alt', {\n\t\t\tsourceInterval: [3650, 3770],\n\t\t}, ['seq', { sourceInterval: [3650, 3700] }, ['not', { sourceInterval: [3650, 3669] }, [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [3652, 3668] },\n\t\t\t['terminal', { sourceInterval: [3652, 3656] }, '\\\\'],\n\t\t\t['terminal', { sourceInterval: [3659, 3662] }, '/'],\n\t\t\t['terminal', { sourceInterval: [3665, 3668] }, '['],\n\t\t]], ['app', { sourceInterval: [3670, 3700] }, 'regularExpressionNonTerminator', []]], [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [3707, 3741] },\n\t\t\t'regularExpressionBackslashSequence',\n\t\t\t[],\n\t\t], ['app', { sourceInterval: [3748, 3770] }, 'regularExpressionClass', []]]],\n\t\tregularExpressionBackslashSequence: ['define', { sourceInterval: [3775, 3847] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [3812, 3847] },\n\t\t\t['terminal', { sourceInterval: [3812, 3816] }, '\\\\'],\n\t\t\t['app', { sourceInterval: [3817, 3847] }, 'regularExpressionNonTerminator', []],\n\t\t]],\n\t\tregularExpressionNonTerminator: ['define', { sourceInterval: [3852, 3906] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [3885, 3906] },\n\t\t\t['not', { sourceInterval: [3885, 3902] }, ['app', { sourceInterval: [3887, 3901] }, 'lineTerminator', []]],\n\t\t\t['app', { sourceInterval: [3903, 3906] }, 'any', []],\n\t\t]],\n\t\tregularExpressionClass: ['define', { sourceInterval: [3911, 3971] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [3936, 3971] },\n\t\t\t['terminal', { sourceInterval: [3936, 3939] }, '['],\n\t\t\t['star', { sourceInterval: [3940, 3967] }, [\n\t\t\t\t'app',\n\t\t\t\t{ sourceInterval: [3940, 3966] },\n\t\t\t\t'regularExpressionClassChar',\n\t\t\t\t[],\n\t\t\t]],\n\t\t\t['terminal', { sourceInterval: [3968, 3971] }, ']'],\n\t\t]],\n\t\tregularExpressionClassChar: ['define', { sourceInterval: [3976, 4096] }, null, [], ['alt', {\n\t\t\tsourceInterval: [4009, 4096],\n\t\t}, ['seq', { sourceInterval: [4011, 4055] }, ['not', { sourceInterval: [4011, 4024] }, [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [4013, 4023] },\n\t\t\t['terminal', { sourceInterval: [4013, 4016] }, ']'],\n\t\t\t['terminal', { sourceInterval: [4019, 4023] }, '\\\\'],\n\t\t]], ['app', { sourceInterval: [4025, 4055] }, 'regularExpressionNonTerminator', []]], [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [4062, 4096] },\n\t\t\t'regularExpressionBackslashSequence',\n\t\t\t[],\n\t\t]]],\n\t\tregularExpressionFlags: ['define', { sourceInterval: [4101, 4141] }, null, [], ['star', {\n\t\t\tsourceInterval: [4126, 4141],\n\t\t}, ['app', { sourceInterval: [4126, 4140] }, 'identifierPart', []]]],\n\t\tmultiLineCommentNoNL: ['define', { sourceInterval: [4147, 4211] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [4170, 4211] },\n\t\t\t['terminal', { sourceInterval: [4170, 4174] }, '/*'],\n\t\t\t['star', { sourceInterval: [4175, 4206] }, ['seq', { sourceInterval: [4176, 4204] }, ['not', {\n\t\t\t\tsourceInterval: [4176, 4200],\n\t\t\t}, ['alt', { sourceInterval: [4178, 4199] }, ['terminal', { sourceInterval: [4178, 4182] }, '*/'], [\n\t\t\t\t'app',\n\t\t\t\t{ sourceInterval: [4185, 4199] },\n\t\t\t\t'lineTerminator',\n\t\t\t\t[],\n\t\t\t]]], ['app', { sourceInterval: [4201, 4204] }, 'any', []]]],\n\t\t\t['terminal', { sourceInterval: [4207, 4211] }, '*/'],\n\t\t]],\n\t\tidentifierStart_escaped: ['define', { sourceInterval: [4266, 4303] }, null, [], [\n\t\t\t'seq',\n\t\t\t{ sourceInterval: [4266, 4292] },\n\t\t\t['terminal', { sourceInterval: [4266, 4270] }, '\\\\'],\n\t\t\t['app', { sourceInterval: [4271, 4292] }, 'unicodeEscapeSequence', []],\n\t\t]],\n\t\tidentifierStart: ['define', { sourceInterval: [4217, 4303] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [4239, 4303] },\n\t\t\t['app', { sourceInterval: [4241, 4247] }, 'letter', []],\n\t\t\t['terminal', { sourceInterval: [4250, 4253] }, '$'],\n\t\t\t['terminal', { sourceInterval: [4256, 4259] }, '_'],\n\t\t\t['app', { sourceInterval: [4266, 4292] }, 'identifierStart_escaped', []],\n\t\t]],\n\t\tidentifierPart: ['define', { sourceInterval: [4308, 4444] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [4329, 4444] },\n\t\t\t['app', { sourceInterval: [4331, 4346] }, 'identifierStart', []],\n\t\t\t['app', { sourceInterval: [4349, 4369] }, 'unicodeCombiningMark', []],\n\t\t\t['app', { sourceInterval: [4376, 4388] }, 'unicodeDigit', []],\n\t\t\t['app', { sourceInterval: [4391, 4418] }, 'unicodeConnectorPunctuation', []],\n\t\t\t['terminal', { sourceInterval: [4425, 4433] }, '‌'],\n\t\t\t['terminal', { sourceInterval: [4436, 4444] }, '‍'],\n\t\t]],\n\t\tletter: ['extend', { sourceInterval: [4449, 4476] }, null, [], [\n\t\t\t'app',\n\t\t\t{ sourceInterval: [4459, 4476] },\n\t\t\t'unicodeCategoryNl',\n\t\t\t[],\n\t\t]],\n\t\tunicodeCategoryNl: ['define', { sourceInterval: [4481, 4555] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [4505, 4555] },\n\t\t\t['range', { sourceInterval: [4505, 4523] }, 'Ⅰ', 'ↂ'],\n\t\t\t['terminal', { sourceInterval: [4526, 4534] }, '〇'],\n\t\t\t['range', { sourceInterval: [4537, 4555] }, '〡', '〩'],\n\t\t]],\n\t\tunicodeDigit: ['define', { sourceInterval: [4560, 4922] }, 'a digit', [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [4589, 4922] },\n\t\t\t['range', { sourceInterval: [4589, 4607] }, '0', '9'],\n\t\t\t['range', { sourceInterval: [4610, 4628] }, '٠', '٩'],\n\t\t\t['range', { sourceInterval: [4631, 4649] }, '۰', '۹'],\n\t\t\t['range', { sourceInterval: [4652, 4670] }, '०', '९'],\n\t\t\t['range', { sourceInterval: [4673, 4691] }, '০', '৯'],\n\t\t\t['range', { sourceInterval: [4694, 4712] }, '੦', '੯'],\n\t\t\t['range', { sourceInterval: [4715, 4733] }, '૦', '૯'],\n\t\t\t['range', { sourceInterval: [4736, 4754] }, '୦', '୯'],\n\t\t\t['range', { sourceInterval: [4757, 4775] }, '௧', '௯'],\n\t\t\t['range', { sourceInterval: [4778, 4796] }, '౦', '౯'],\n\t\t\t['range', { sourceInterval: [4799, 4817] }, '೦', '೯'],\n\t\t\t['range', { sourceInterval: [4820, 4838] }, '൦', '൯'],\n\t\t\t['range', { sourceInterval: [4841, 4859] }, '๐', '๙'],\n\t\t\t['range', { sourceInterval: [4862, 4880] }, '໐', '໙'],\n\t\t\t['range', { sourceInterval: [4883, 4901] }, '༠', '༩'],\n\t\t\t['range', { sourceInterval: [4904, 4922] }, '０', '９'],\n\t\t]],\n\t\tunicodeCombiningMark: ['define', { sourceInterval: [4928, 6659] }, 'a Unicode combining mark', [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [4982, 6659] },\n\t\t\t['range', { sourceInterval: [4982, 5000] }, '̀', 'ͅ'],\n\t\t\t['range', { sourceInterval: [5003, 5021] }, '͠', '͡'],\n\t\t\t['range', { sourceInterval: [5024, 5042] }, '҃', '҆'],\n\t\t\t['range', { sourceInterval: [5045, 5063] }, '֑', '֡'],\n\t\t\t['range', { sourceInterval: [5066, 5084] }, '֣', 'ֹ'],\n\t\t\t['range', { sourceInterval: [5087, 5105] }, 'ֻ', 'ֽ'],\n\t\t\t['range', { sourceInterval: [5108, 5126] }, 'ֿ', 'ֿ'],\n\t\t\t['range', { sourceInterval: [5129, 5147] }, 'ׁ', 'ׂ'],\n\t\t\t['range', { sourceInterval: [5150, 5168] }, 'ׄ', 'ׄ'],\n\t\t\t['range', { sourceInterval: [5171, 5189] }, 'ً', 'ْ'],\n\t\t\t['range', { sourceInterval: [5192, 5210] }, 'ٰ', 'ٰ'],\n\t\t\t['range', { sourceInterval: [5213, 5231] }, 'ۖ', 'ۜ'],\n\t\t\t['range', { sourceInterval: [5234, 5252] }, '۟', 'ۤ'],\n\t\t\t['range', { sourceInterval: [5255, 5273] }, 'ۧ', 'ۨ'],\n\t\t\t['range', { sourceInterval: [5276, 5294] }, '۪', 'ۭ'],\n\t\t\t['range', { sourceInterval: [5297, 5315] }, 'ँ', 'ं'],\n\t\t\t['range', { sourceInterval: [5318, 5336] }, '़', '़'],\n\t\t\t['range', { sourceInterval: [5339, 5357] }, 'ु', 'ै'],\n\t\t\t['range', { sourceInterval: [5360, 5378] }, '्', '्'],\n\t\t\t['range', { sourceInterval: [5381, 5399] }, '॑', '॔'],\n\t\t\t['range', { sourceInterval: [5402, 5420] }, 'ॢ', 'ॣ'],\n\t\t\t['range', { sourceInterval: [5423, 5441] }, 'ঁ', 'ঁ'],\n\t\t\t['range', { sourceInterval: [5444, 5462] }, '়', '়'],\n\t\t\t['range', { sourceInterval: [5465, 5483] }, 'ু', 'ৄ'],\n\t\t\t['range', { sourceInterval: [5486, 5504] }, '্', '্'],\n\t\t\t['range', { sourceInterval: [5507, 5525] }, 'ৢ', 'ৣ'],\n\t\t\t['range', { sourceInterval: [5528, 5546] }, 'ਂ', 'ਂ'],\n\t\t\t['range', { sourceInterval: [5549, 5567] }, '਼', '਼'],\n\t\t\t['range', { sourceInterval: [5570, 5588] }, 'ੁ', 'ੂ'],\n\t\t\t['range', { sourceInterval: [5591, 5609] }, 'ੇ', 'ੈ'],\n\t\t\t['range', { sourceInterval: [5612, 5630] }, 'ੋ', '੍'],\n\t\t\t['range', { sourceInterval: [5633, 5651] }, 'ੰ', 'ੱ'],\n\t\t\t['range', { sourceInterval: [5654, 5672] }, 'ઁ', 'ં'],\n\t\t\t['range', { sourceInterval: [5675, 5693] }, '઼', '઼'],\n\t\t\t['range', { sourceInterval: [5696, 5714] }, 'ુ', 'ૅ'],\n\t\t\t['range', { sourceInterval: [5717, 5735] }, 'ે', 'ૈ'],\n\t\t\t['range', { sourceInterval: [5738, 5756] }, '્', '્'],\n\t\t\t['range', { sourceInterval: [5759, 5777] }, 'ଁ', 'ଁ'],\n\t\t\t['range', { sourceInterval: [5780, 5798] }, '଼', '଼'],\n\t\t\t['range', { sourceInterval: [5801, 5819] }, 'ି', 'ି'],\n\t\t\t['range', { sourceInterval: [5822, 5840] }, 'ୁ', 'ୃ'],\n\t\t\t['range', { sourceInterval: [5843, 5861] }, '୍', '୍'],\n\t\t\t['range', { sourceInterval: [5864, 5882] }, 'ୖ', 'ୖ'],\n\t\t\t['range', { sourceInterval: [5885, 5903] }, 'ஂ', 'ஂ'],\n\t\t\t['range', { sourceInterval: [5906, 5924] }, 'ீ', 'ீ'],\n\t\t\t['range', { sourceInterval: [5927, 5945] }, '்', '்'],\n\t\t\t['range', { sourceInterval: [5948, 5966] }, 'ా', 'ీ'],\n\t\t\t['range', { sourceInterval: [5969, 5987] }, 'ె', 'ై'],\n\t\t\t['range', { sourceInterval: [5990, 6008] }, 'ొ', '్'],\n\t\t\t['range', { sourceInterval: [6011, 6029] }, 'ౕ', 'ౖ'],\n\t\t\t['range', { sourceInterval: [6032, 6050] }, 'ಿ', 'ಿ'],\n\t\t\t['range', { sourceInterval: [6053, 6071] }, 'ೆ', 'ೆ'],\n\t\t\t['range', { sourceInterval: [6074, 6092] }, 'ೌ', '್'],\n\t\t\t['range', { sourceInterval: [6095, 6113] }, 'ു', 'ൃ'],\n\t\t\t['range', { sourceInterval: [6116, 6134] }, '്', '്'],\n\t\t\t['range', { sourceInterval: [6137, 6155] }, 'ั', 'ั'],\n\t\t\t['range', { sourceInterval: [6158, 6176] }, 'ิ', 'ฺ'],\n\t\t\t['range', { sourceInterval: [6179, 6197] }, '็', '๎'],\n\t\t\t['range', { sourceInterval: [6200, 6218] }, 'ັ', 'ັ'],\n\t\t\t['range', { sourceInterval: [6221, 6239] }, 'ິ', 'ູ'],\n\t\t\t['range', { sourceInterval: [6242, 6260] }, 'ົ', 'ຼ'],\n\t\t\t['range', { sourceInterval: [6263, 6281] }, '່', 'ໍ'],\n\t\t\t['range', { sourceInterval: [6284, 6302] }, '༘', '༙'],\n\t\t\t['range', { sourceInterval: [6305, 6323] }, '༵', '༵'],\n\t\t\t['range', { sourceInterval: [6326, 6344] }, '༷', '༷'],\n\t\t\t['range', { sourceInterval: [6347, 6365] }, '༹', '༹'],\n\t\t\t['range', { sourceInterval: [6368, 6386] }, 'ཱ', 'ཾ'],\n\t\t\t['range', { sourceInterval: [6389, 6407] }, 'ྀ', '྄'],\n\t\t\t['range', { sourceInterval: [6410, 6428] }, '྆', '྇'],\n\t\t\t['range', { sourceInterval: [6431, 6449] }, 'ྐ', 'ྕ'],\n\t\t\t['range', { sourceInterval: [6452, 6470] }, 'ྗ', 'ྗ'],\n\t\t\t['range', { sourceInterval: [6473, 6491] }, 'ྙ', 'ྭ'],\n\t\t\t['range', { sourceInterval: [6494, 6512] }, 'ྱ', 'ྷ'],\n\t\t\t['range', { sourceInterval: [6515, 6533] }, 'ྐྵ', 'ྐྵ'],\n\t\t\t['range', { sourceInterval: [6536, 6554] }, '⃐', '⃜'],\n\t\t\t['range', { sourceInterval: [6557, 6575] }, '⃡', '⃡'],\n\t\t\t['range', { sourceInterval: [6578, 6596] }, '〪', '〯'],\n\t\t\t['range', { sourceInterval: [6599, 6617] }, '゙', '゚'],\n\t\t\t['range', { sourceInterval: [6620, 6638] }, 'ﬞ', 'ﬞ'],\n\t\t\t['range', { sourceInterval: [6641, 6659] }, '︠', '︣'],\n\t\t]],\n\t\tunicodeConnectorPunctuation: ['define', { sourceInterval: [6665, 6799] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [6695, 6799] },\n\t\t\t['terminal', { sourceInterval: [6695, 6703] }, '_'],\n\t\t\t['range', { sourceInterval: [6706, 6724] }, '‿', '⁀'],\n\t\t\t['terminal', { sourceInterval: [6727, 6735] }, '・'],\n\t\t\t['range', { sourceInterval: [6738, 6756] }, '︳', '︴'],\n\t\t\t['range', { sourceInterval: [6759, 6777] }, '﹍', '﹏'],\n\t\t\t['terminal', { sourceInterval: [6780, 6788] }, '＿'],\n\t\t\t['terminal', { sourceInterval: [6791, 6799] }, '･'],\n\t\t]],\n\t\tunicodeSpaceSeparator: ['define', { sourceInterval: [6804, 6857] }, null, [], [\n\t\t\t'alt',\n\t\t\t{ sourceInterval: [6828, 6857] },\n\t\t\t['range', { sourceInterval: [6828, 6846] }, ' ', '​'],\n\t\t\t['terminal', { sourceInterval: [6849, 6857] }, '　'],\n\t\t]],\n\t},\n]);\nexport default result;\n"
  },
  {
    "path": "drizzle-kit/imports-checker/index.ts",
    "content": "import chalk from 'chalk';\nimport { analyzeImports, ChainLink } from './checker';\n\nconst issues = analyzeImports({\n\tbasePath: './drizzle-kit',\n\tlocalPaths: ['src'],\n\twhiteList: [\n\t\t'@drizzle-team/brocli',\n\t\t'json-diff',\n\t\t'path',\n\t\t'fs',\n\t\t'fs/*',\n\t\t'url',\n\t\t'zod',\n\t\t'node:*',\n\t\t'hono',\n\t\t'glob',\n\t\t'hono/*',\n\t\t'hono/**/*',\n\t\t'@hono/*',\n\t\t'crypto',\n\t\t'hanji',\n\t],\n\tentry: './drizzle-kit/src/cli/index.ts',\n\tlogger: true,\n\tignoreTypes: true,\n}).issues;\n\nconst chainToString = (chains: ChainLink[]) => {\n\tif (chains.length === 0) throw new Error();\n\n\tlet out = chains[0]!.file + '\\n';\n\tlet indentation = 0;\n\tfor (let chain of chains) {\n\t\tout += ' '.repeat(indentation)\n\t\t\t+ '└'\n\t\t\t+ chain.import\n\t\t\t+ ` ${chalk.gray(chain.file)}\\n`;\n\t\tindentation += 1;\n\t}\n\treturn out;\n};\n\nconsole.log();\nfor (const issue of issues) {\n\tconsole.log(chalk.red(issue.imports.map((it) => it.name).join('\\n')));\n\tconsole.log(issue.accessChains.map((it) => chainToString(it)).join('\\n'));\n}\n"
  },
  {
    "path": "drizzle-kit/package.json",
    "content": "{\n\t\"name\": \"drizzle-kit\",\n\t\"version\": \"0.31.10\",\n\t\"homepage\": \"https://orm.drizzle.team\",\n\t\"keywords\": [\n\t\t\"drizzle\",\n\t\t\"orm\",\n\t\t\"pg\",\n\t\t\"mysql\",\n\t\t\"singlestore\",\n\t\t\"postgresql\",\n\t\t\"postgres\",\n\t\t\"sqlite\",\n\t\t\"database\",\n\t\t\"sql\",\n\t\t\"typescript\",\n\t\t\"ts\",\n\t\t\"drizzle-kit\",\n\t\t\"migrations\",\n\t\t\"schema\"\n\t],\n\t\"publishConfig\": {\n\t\t\"provenance\": true\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git+https://github.com/drizzle-team/drizzle-orm.git\"\n\t},\n\t\"author\": \"Drizzle Team\",\n\t\"license\": \"MIT\",\n\t\"bin\": {\n\t\t\"drizzle-kit\": \"./bin.cjs\"\n\t},\n\t\"scripts\": {\n\t\t\"api\": \"tsx ./dev/api.ts\",\n\t\t\"migrate:old\": \"drizzle-kit generate:mysql\",\n\t\t\"cli\": \"tsx ./src/cli/index.ts\",\n\t\t\"test\": \"pnpm tsc && TEST_CONFIG_PATH_PREFIX=./tests/cli/ vitest\",\n\t\t\"build\": \"rm -rf ./dist && tsx build.ts && cp package.json dist/ && attw --pack dist\",\n\t\t\"build:dev\": \"rm -rf ./dist && tsx build.dev.ts && tsc -p tsconfig.cli-types.json && chmod +x ./dist/index.cjs\",\n\t\t\"pack\": \"cp package.json README.md dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz\",\n\t\t\"tsc\": \"tsc -p tsconfig.build.json --noEmit\",\n\t\t\"publish\": \"npm publish package.tgz\"\n\t},\n\t\"dependencies\": {\n\t\t\"@drizzle-team/brocli\": \"^0.10.2\",\n\t\t\"@esbuild-kit/esm-loader\": \"^2.5.5\",\n\t\t\"esbuild\": \"^0.25.4\",\n\t\t\"tsx\": \"^4.21.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@arethetypeswrong/cli\": \"^0.15.3\",\n\t\t\"@aws-sdk/client-rds-data\": \"^3.556.0\",\n\t\t\"@cloudflare/workers-types\": \"^4.20230518.0\",\n\t\t\"@electric-sql/pglite\": \"^0.2.12\",\n\t\t\"@hono/node-server\": \"^1.9.0\",\n\t\t\"@hono/zod-validator\": \"^0.2.1\",\n\t\t\"@libsql/client\": \"^0.10.0\",\n\t\t\"@neondatabase/serverless\": \"^0.9.1\",\n\t\t\"@originjs/vite-plugin-commonjs\": \"^1.0.3\",\n\t\t\"@planetscale/database\": \"^1.16.0\",\n\t\t\"@types/better-sqlite3\": \"^7.6.13\",\n\t\t\"@types/dockerode\": \"^3.3.28\",\n\t\t\"@types/glob\": \"^8.1.0\",\n\t\t\"@types/json-diff\": \"^1.0.3\",\n\t\t\"@types/micromatch\": \"^4.0.9\",\n\t\t\"@types/minimatch\": \"^5.1.2\",\n\t\t\"@types/node\": \"^18.11.15\",\n\t\t\"@types/pg\": \"^8.10.7\",\n\t\t\"@types/pluralize\": \"^0.0.33\",\n\t\t\"@types/semver\": \"^7.5.5\",\n\t\t\"@types/uuid\": \"^9.0.8\",\n\t\t\"@types/ws\": \"^8.5.10\",\n\t\t\"@typescript-eslint/eslint-plugin\": \"^7.2.0\",\n\t\t\"@typescript-eslint/parser\": \"^7.2.0\",\n\t\t\"@vercel/postgres\": \"^0.8.0\",\n\t\t\"ava\": \"^5.1.0\",\n\t\t\"better-sqlite3\": \"^11.9.1\",\n\t\t\"bun-types\": \"^0.6.6\",\n\t\t\"camelcase\": \"^7.0.1\",\n\t\t\"chalk\": \"^5.2.0\",\n\t\t\"commander\": \"^12.1.0\",\n\t\t\"dockerode\": \"^4.0.6\",\n\t\t\"dotenv\": \"^16.0.3\",\n\t\t\"drizzle-kit\": \"0.25.0-b1faa33\",\n\t\t\"drizzle-orm\": \"workspace:./drizzle-orm/dist\",\n\t\t\"env-paths\": \"^3.0.0\",\n\t\t\"esbuild-node-externals\": \"^1.9.0\",\n\t\t\"eslint\": \"^8.57.0\",\n\t\t\"eslint-config-prettier\": \"^9.1.0\",\n\t\t\"eslint-plugin-prettier\": \"^5.1.3\",\n\t\t\"gel\": \"^2.0.0\",\n\t\t\"get-port\": \"^6.1.2\",\n\t\t\"glob\": \"^8.1.0\",\n\t\t\"hanji\": \"^0.0.8\",\n\t\t\"hono\": \"^4.7.9\",\n\t\t\"json-diff\": \"1.0.6\",\n\t\t\"micromatch\": \"^4.0.8\",\n\t\t\"minimatch\": \"^7.4.3\",\n\t\t\"mysql2\": \"3.14.1\",\n\t\t\"node-fetch\": \"^3.3.2\",\n\t\t\"ohm-js\": \"^17.1.0\",\n\t\t\"pg\": \"^8.11.5\",\n\t\t\"pluralize\": \"^8.0.0\",\n\t\t\"postgres\": \"^3.4.4\",\n\t\t\"prettier\": \"^3.5.3\",\n\t\t\"semver\": \"^7.7.2\",\n\t\t\"superjson\": \"^2.2.1\",\n\t\t\"tsup\": \"^8.3.5\",\n\t\t\"typescript\": \"^5.6.3\",\n\t\t\"uuid\": \"^9.0.1\",\n\t\t\"vite-tsconfig-paths\": \"^4.3.2\",\n\t\t\"vitest\": \"^3.1.3\",\n\t\t\"ws\": \"^8.18.2\",\n\t\t\"zod\": \"^3.20.2\",\n\t\t\"zx\": \"^8.3.2\"\n\t},\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./index.d.mts\",\n\t\t\t\t\"default\": \"./index.mjs\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./index.d.ts\",\n\t\t\t\t\"default\": \"./index.js\"\n\t\t\t},\n\t\t\t\"types\": \"./index.d.mts\",\n\t\t\t\"default\": \"./index.mjs\"\n\t\t},\n\t\t\"./api\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./api.d.mts\",\n\t\t\t\t\"default\": \"./api.mjs\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./api.d.ts\",\n\t\t\t\t\"default\": \"./api.js\"\n\t\t\t},\n\t\t\t\"types\": \"./api.d.mts\",\n\t\t\t\"default\": \"./api.mjs\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "drizzle-kit/patches/difflib@0.2.4.patch",
    "content": "diff --git a/lib/difflib.js b/lib/difflib.js\nindex 80d250e7e18bdc972df3621ee5c05ffff0e3659f..94916f33dbae0d3eea6f74e2c619c4c6f52cc125 100644\n--- a/lib/difflib.js\n+++ b/lib/difflib.js\n@@ -17,7 +17,7 @@ Function restore(delta, which):\n \n Function unifiedDiff(a, b):\n     For two lists of strings, return a delta in unified diff format.\n-\n+.\n Class SequenceMatcher:\n     A flexible class for comparing pairs of sequences of any type.\n \n@@ -75,7 +75,7 @@ Class Differ:\n \n   SequenceMatcher = (function() {\n \n-    SequenceMatcher.name = 'SequenceMatcher';\n+    // SequenceMatcher.name = 'SequenceMatcher';\n \n     /*\n       SequenceMatcher is a flexible class for comparing pairs of sequences of\n@@ -737,7 +737,7 @@ Class Differ:\n \n   Differ = (function() {\n \n-    Differ.name = 'Differ';\n+    // Differ.name = 'Differ';\n \n     /*\n       Differ is a class for comparing sequences of lines of text, and\n"
  },
  {
    "path": "drizzle-kit/src/@types/utils.ts",
    "content": "declare global {\n\tinterface String {\n\t\ttrimChar(char: string): string;\n\t\tsquashSpaces(): string;\n\t\tcapitalise(): string;\n\t\tcamelCase(): string;\n\t\tsnake_case(): string;\n\n\t\tconcatIf(it: string, condition: boolean): string;\n\t}\n\n\tinterface Array<T> {\n\t\trandom(): T;\n\t}\n}\n\nimport camelcase from 'camelcase';\n\nString.prototype.trimChar = function(char: string) {\n\tlet start = 0;\n\tlet end = this.length;\n\n\twhile (start < end && this[start] === char) ++start;\n\twhile (end > start && this[end - 1] === char) --end;\n\n\t// this.toString() due to ava deep equal issue with String { \"value\" }\n\treturn start > 0 || end < this.length\n\t\t? this.substring(start, end)\n\t\t: this.toString();\n};\n\nString.prototype.squashSpaces = function() {\n\treturn this.replace(/  +/g, ' ').trim();\n};\n\nString.prototype.camelCase = function() {\n\treturn camelcase(String(this));\n};\n\nString.prototype.capitalise = function() {\n\treturn this && this.length > 0\n\t\t? `${this[0].toUpperCase()}${this.slice(1)}`\n\t\t: String(this);\n};\n\nString.prototype.concatIf = function(it: string, condition: boolean) {\n\treturn condition ? `${this}${it}` : String(this);\n};\n\nString.prototype.snake_case = function() {\n\treturn this && this.length > 0 ? `${this.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)}` : String(this);\n};\n\nArray.prototype.random = function() {\n\treturn this[~~(Math.random() * this.length)];\n};\n\nexport {};\n"
  },
  {
    "path": "drizzle-kit/src/api.ts",
    "content": "/// <reference types=\"@cloudflare/workers-types\" />\nimport type { PGlite } from '@electric-sql/pglite';\nimport { randomUUID } from 'crypto';\nimport { is } from 'drizzle-orm';\nimport { LibSQLDatabase } from 'drizzle-orm/libsql';\nimport { AnyMySqlTable, getTableConfig as mysqlTableConfig, MySqlTable } from 'drizzle-orm/mysql-core';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\nimport { AnyPgTable, getTableConfig as pgTableConfig, PgDatabase, PgTable } from 'drizzle-orm/pg-core';\nimport { Relations } from 'drizzle-orm/relations';\nimport { SingleStoreDriverDatabase } from 'drizzle-orm/singlestore';\nimport {\n\tAnySingleStoreTable,\n\tgetTableConfig as singlestoreTableConfig,\n\tSingleStoreTable,\n} from 'drizzle-orm/singlestore-core';\nimport { AnySQLiteTable, SQLiteTable } from 'drizzle-orm/sqlite-core';\nimport {\n\tcolumnsResolver,\n\tenumsResolver,\n\tindPolicyResolver,\n\tmySqlViewsResolver,\n\tpolicyResolver,\n\troleResolver,\n\tschemasResolver,\n\tsequencesResolver,\n\tsqliteViewsResolver,\n\ttablesResolver,\n\tviewsResolver,\n} from './cli/commands/migrate';\nimport { pgPushIntrospect } from './cli/commands/pgIntrospect';\nimport { pgSuggestions } from './cli/commands/pgPushUtils';\nimport { updateUpToV6 as upPgV6, updateUpToV7 as upPgV7 } from './cli/commands/pgUp';\nimport { sqlitePushIntrospect } from './cli/commands/sqliteIntrospect';\nimport { logSuggestionsAndReturn } from './cli/commands/sqlitePushUtils';\nimport type { CasingType } from './cli/validations/common';\nimport type { MysqlCredentials } from './cli/validations/mysql';\nimport type { PostgresCredentials } from './cli/validations/postgres';\nimport type { SingleStoreCredentials } from './cli/validations/singlestore';\nimport type { SqliteCredentials } from './cli/validations/sqlite';\nimport { getTablesFilterByExtensions } from './extensions/getTablesFilterByExtensions';\nimport { originUUID } from './global';\nimport type { Config } from './index';\nimport { MySqlSchema as MySQLSchemaKit, mysqlSchema, squashMysqlScheme } from './serializer/mysqlSchema';\nimport { generateMySqlSnapshot } from './serializer/mysqlSerializer';\nimport { prepareFromExports } from './serializer/pgImports';\nimport { PgSchema as PgSchemaKit, pgSchema, squashPgScheme } from './serializer/pgSchema';\nimport { generatePgSnapshot } from './serializer/pgSerializer';\nimport {\n\tSingleStoreSchema as SingleStoreSchemaKit,\n\tsinglestoreSchema,\n\tsquashSingleStoreScheme,\n} from './serializer/singlestoreSchema';\nimport { generateSingleStoreSnapshot } from './serializer/singlestoreSerializer';\nimport { SQLiteSchema as SQLiteSchemaKit, sqliteSchema, squashSqliteScheme } from './serializer/sqliteSchema';\nimport { generateSqliteSnapshot } from './serializer/sqliteSerializer';\nimport type { Setup } from './serializer/studio';\nimport type { DB, SQLiteDB } from './utils';\nimport { certs } from './utils/certs';\nexport type DrizzleSnapshotJSON = PgSchemaKit;\nexport type DrizzleSQLiteSnapshotJSON = SQLiteSchemaKit;\nexport type DrizzleMySQLSnapshotJSON = MySQLSchemaKit;\nexport type DrizzleSingleStoreSnapshotJSON = SingleStoreSchemaKit;\n\nexport const generateDrizzleJson = (\n\timports: Record<string, unknown>,\n\tprevId?: string,\n\tschemaFilters?: string[],\n\tcasing?: CasingType,\n): PgSchemaKit => {\n\tconst prepared = prepareFromExports(imports);\n\n\tconst id = randomUUID();\n\n\tconst snapshot = generatePgSnapshot(\n\t\tprepared.tables,\n\t\tprepared.enums,\n\t\tprepared.schemas,\n\t\tprepared.sequences,\n\t\tprepared.roles,\n\t\tprepared.policies,\n\t\tprepared.views,\n\t\tprepared.matViews,\n\t\tcasing,\n\t\tschemaFilters,\n\t);\n\n\treturn {\n\t\t...snapshot,\n\t\tid,\n\t\tprevId: prevId ?? originUUID,\n\t};\n};\n\nexport const generateMigration = async (\n\tprev: DrizzleSnapshotJSON,\n\tcur: DrizzleSnapshotJSON,\n) => {\n\tconst { applyPgSnapshotsDiff } = await import('./snapshotsDiffer');\n\n\tconst validatedPrev = pgSchema.parse(prev);\n\tconst validatedCur = pgSchema.parse(cur);\n\n\tconst squashedPrev = squashPgScheme(validatedPrev);\n\tconst squashedCur = squashPgScheme(validatedCur);\n\n\tconst { sqlStatements, _meta } = await applyPgSnapshotsDiff(\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\tschemasResolver,\n\t\tenumsResolver,\n\t\tsequencesResolver,\n\t\tpolicyResolver,\n\t\tindPolicyResolver,\n\t\troleResolver,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\tviewsResolver,\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t);\n\n\treturn sqlStatements;\n};\n\nexport const pushSchema = async (\n\timports: Record<string, unknown>,\n\tdrizzleInstance: PgDatabase<any>,\n\tschemaFilters?: string[],\n\ttablesFilter?: string[],\n\textensionsFilters?: Config['extensionsFilters'],\n) => {\n\tconst { applyPgSnapshotsDiff } = await import('./snapshotsDiffer');\n\tconst { sql } = await import('drizzle-orm');\n\tconst filters = (tablesFilter ?? []).concat(\n\t\tgetTablesFilterByExtensions({ extensionsFilters, dialect: 'postgresql' }),\n\t);\n\n\tconst db: DB = {\n\t\tquery: async (query: string, params?: any[]) => {\n\t\t\tconst res = await drizzleInstance.execute(sql.raw(query));\n\t\t\treturn res.rows;\n\t\t},\n\t};\n\n\tconst cur = generateDrizzleJson(imports);\n\tconst { schema: prev } = await pgPushIntrospect(\n\t\tdb,\n\t\tfilters,\n\t\tschemaFilters ?? ['public'],\n\t\tundefined,\n\t);\n\n\tconst validatedPrev = pgSchema.parse(prev);\n\tconst validatedCur = pgSchema.parse(cur);\n\n\tconst squashedPrev = squashPgScheme(validatedPrev, 'push');\n\tconst squashedCur = squashPgScheme(validatedCur, 'push');\n\n\tconst { statements } = await applyPgSnapshotsDiff(\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\tschemasResolver,\n\t\tenumsResolver,\n\t\tsequencesResolver,\n\t\tpolicyResolver,\n\t\tindPolicyResolver,\n\t\troleResolver,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\tviewsResolver,\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t\t'push',\n\t);\n\n\tconst { shouldAskForApprove, statementsToExecute, infoToPrint } = await pgSuggestions(db, statements);\n\n\treturn {\n\t\thasDataLoss: shouldAskForApprove,\n\t\twarnings: infoToPrint,\n\t\tstatementsToExecute,\n\t\tapply: async () => {\n\t\t\tfor (const dStmnt of statementsToExecute) {\n\t\t\t\tawait db.query(dStmnt);\n\t\t\t}\n\t\t},\n\t};\n};\n\nexport const startStudioPostgresServer = async (\n\timports: Record<string, unknown>,\n\tcredentials: PostgresCredentials | {\n\t\tdriver: 'pglite';\n\t\tclient: PGlite;\n\t},\n\toptions?: {\n\t\thost?: string;\n\t\tport?: number;\n\t\tcasing?: CasingType;\n\t},\n) => {\n\tconst { drizzleForPostgres } = await import('./serializer/studio');\n\n\tconst pgSchema: Record<string, Record<string, AnyPgTable>> = {};\n\tconst relations: Record<string, Relations> = {};\n\n\tObject.entries(imports).forEach(([k, t]) => {\n\t\tif (is(t, PgTable)) {\n\t\t\tconst schema = pgTableConfig(t).schema || 'public';\n\t\t\tpgSchema[schema] = pgSchema[schema] || {};\n\t\t\tpgSchema[schema][k] = t;\n\t\t}\n\n\t\tif (is(t, Relations)) {\n\t\t\trelations[k] = t;\n\t\t}\n\t});\n\n\tconst setup = await drizzleForPostgres(credentials, pgSchema, relations, [], options?.casing);\n\tawait startServerFromSetup(setup, options);\n};\n\n// SQLite\n\nexport const generateSQLiteDrizzleJson = async (\n\timports: Record<string, unknown>,\n\tprevId?: string,\n\tcasing?: CasingType,\n): Promise<SQLiteSchemaKit> => {\n\tconst { prepareFromExports } = await import('./serializer/sqliteImports');\n\n\tconst prepared = prepareFromExports(imports);\n\n\tconst id = randomUUID();\n\n\tconst snapshot = generateSqliteSnapshot(prepared.tables, prepared.views, casing);\n\n\treturn {\n\t\t...snapshot,\n\t\tid,\n\t\tprevId: prevId ?? originUUID,\n\t};\n};\n\nexport const generateSQLiteMigration = async (\n\tprev: DrizzleSQLiteSnapshotJSON,\n\tcur: DrizzleSQLiteSnapshotJSON,\n) => {\n\tconst { applySqliteSnapshotsDiff } = await import('./snapshotsDiffer');\n\n\tconst validatedPrev = sqliteSchema.parse(prev);\n\tconst validatedCur = sqliteSchema.parse(cur);\n\n\tconst squashedPrev = squashSqliteScheme(validatedPrev);\n\tconst squashedCur = squashSqliteScheme(validatedCur);\n\n\tconst { sqlStatements } = await applySqliteSnapshotsDiff(\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\tsqliteViewsResolver,\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t);\n\n\treturn sqlStatements;\n};\n\nexport const pushSQLiteSchema = async (\n\timports: Record<string, unknown>,\n\tdrizzleInstance: LibSQLDatabase<any>,\n) => {\n\tconst { applySqliteSnapshotsDiff } = await import('./snapshotsDiffer');\n\tconst { sql } = await import('drizzle-orm');\n\n\tconst db: SQLiteDB = {\n\t\tquery: async (query: string, params?: any[]) => {\n\t\t\tconst res = drizzleInstance.all<any>(sql.raw(query));\n\t\t\treturn res;\n\t\t},\n\t\trun: async (query: string) => {\n\t\t\treturn Promise.resolve(drizzleInstance.run(sql.raw(query))).then(\n\t\t\t\t() => {},\n\t\t\t);\n\t\t},\n\t};\n\n\tconst cur = await generateSQLiteDrizzleJson(imports);\n\tconst { schema: prev } = await sqlitePushIntrospect(db, []);\n\n\tconst validatedPrev = sqliteSchema.parse(prev);\n\tconst validatedCur = sqliteSchema.parse(cur);\n\n\tconst squashedPrev = squashSqliteScheme(validatedPrev, 'push');\n\tconst squashedCur = squashSqliteScheme(validatedCur, 'push');\n\n\tconst { statements, _meta } = await applySqliteSnapshotsDiff(\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\tsqliteViewsResolver,\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t\t'push',\n\t);\n\n\tconst { shouldAskForApprove, statementsToExecute, infoToPrint } = await logSuggestionsAndReturn(\n\t\tdb,\n\t\tstatements,\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\t_meta!,\n\t);\n\n\treturn {\n\t\thasDataLoss: shouldAskForApprove,\n\t\twarnings: infoToPrint,\n\t\tstatementsToExecute,\n\t\tapply: async () => {\n\t\t\tfor (const dStmnt of statementsToExecute) {\n\t\t\t\tawait db.query(dStmnt);\n\t\t\t}\n\t\t},\n\t};\n};\n\nexport const startStudioSQLiteServer = async (\n\timports: Record<string, unknown>,\n\tcredentials: SqliteCredentials | {\n\t\tdriver: 'd1';\n\t\tbinding: D1Database;\n\t},\n\toptions?: {\n\t\thost?: string;\n\t\tport?: number;\n\t\tcasing?: CasingType;\n\t},\n) => {\n\tconst { drizzleForSQLite } = await import('./serializer/studio');\n\n\tconst sqliteSchema: Record<string, Record<string, AnySQLiteTable>> = {};\n\tconst relations: Record<string, Relations> = {};\n\n\tObject.entries(imports).forEach(([k, t]) => {\n\t\tif (is(t, SQLiteTable)) {\n\t\t\tconst schema = 'public'; // sqlite does not have schemas\n\t\t\tsqliteSchema[schema] = sqliteSchema[schema] || {};\n\t\t\tsqliteSchema[schema][k] = t;\n\t\t}\n\n\t\tif (is(t, Relations)) {\n\t\t\trelations[k] = t;\n\t\t}\n\t});\n\n\tconst setup = await drizzleForSQLite(credentials, sqliteSchema, relations, [], options?.casing);\n\tawait startServerFromSetup(setup, options);\n};\n\n// MySQL\n\nexport const generateMySQLDrizzleJson = async (\n\timports: Record<string, unknown>,\n\tprevId?: string,\n\tcasing?: CasingType,\n): Promise<MySQLSchemaKit> => {\n\tconst { prepareFromExports } = await import('./serializer/mysqlImports');\n\n\tconst prepared = prepareFromExports(imports);\n\n\tconst id = randomUUID();\n\n\tconst snapshot = generateMySqlSnapshot(prepared.tables, prepared.views, casing);\n\n\treturn {\n\t\t...snapshot,\n\t\tid,\n\t\tprevId: prevId ?? originUUID,\n\t};\n};\n\nexport const generateMySQLMigration = async (\n\tprev: DrizzleMySQLSnapshotJSON,\n\tcur: DrizzleMySQLSnapshotJSON,\n) => {\n\tconst { applyMysqlSnapshotsDiff } = await import('./snapshotsDiffer');\n\n\tconst validatedPrev = mysqlSchema.parse(prev);\n\tconst validatedCur = mysqlSchema.parse(cur);\n\n\tconst squashedPrev = squashMysqlScheme(validatedPrev);\n\tconst squashedCur = squashMysqlScheme(validatedCur);\n\n\tconst { sqlStatements } = await applyMysqlSnapshotsDiff(\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\tmySqlViewsResolver,\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t);\n\n\treturn sqlStatements;\n};\n\nexport const pushMySQLSchema = async (\n\timports: Record<string, unknown>,\n\tdrizzleInstance: MySql2Database<any>,\n\tdatabaseName: string,\n) => {\n\tconst { applyMysqlSnapshotsDiff } = await import('./snapshotsDiffer');\n\tconst { logSuggestionsAndReturn } = await import(\n\t\t'./cli/commands/mysqlPushUtils'\n\t);\n\tconst { mysqlPushIntrospect } = await import(\n\t\t'./cli/commands/mysqlIntrospect'\n\t);\n\tconst { sql } = await import('drizzle-orm');\n\n\tconst db: DB = {\n\t\tquery: async (query: string, params?: any[]) => {\n\t\t\tconst res = await drizzleInstance.execute(sql.raw(query));\n\t\t\treturn res[0] as unknown as any[];\n\t\t},\n\t};\n\tconst cur = await generateMySQLDrizzleJson(imports);\n\tconst { schema: prev } = await mysqlPushIntrospect(db, databaseName, []);\n\n\tconst validatedPrev = mysqlSchema.parse(prev);\n\tconst validatedCur = mysqlSchema.parse(cur);\n\n\tconst squashedPrev = squashMysqlScheme(validatedPrev);\n\tconst squashedCur = squashMysqlScheme(validatedCur);\n\n\tconst { statements } = await applyMysqlSnapshotsDiff(\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\tmySqlViewsResolver,\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t\t'push',\n\t);\n\n\tconst { shouldAskForApprove, statementsToExecute, infoToPrint } = await logSuggestionsAndReturn(\n\t\tdb,\n\t\tstatements,\n\t\tvalidatedCur,\n\t);\n\n\treturn {\n\t\thasDataLoss: shouldAskForApprove,\n\t\twarnings: infoToPrint,\n\t\tstatementsToExecute,\n\t\tapply: async () => {\n\t\t\tfor (const dStmnt of statementsToExecute) {\n\t\t\t\tawait db.query(dStmnt);\n\t\t\t}\n\t\t},\n\t};\n};\n\nexport const startStudioMySQLServer = async (\n\timports: Record<string, unknown>,\n\tcredentials: MysqlCredentials,\n\toptions?: {\n\t\thost?: string;\n\t\tport?: number;\n\t\tcasing?: CasingType;\n\t},\n) => {\n\tconst { drizzleForMySQL } = await import('./serializer/studio');\n\n\tconst mysqlSchema: Record<string, Record<string, AnyMySqlTable>> = {};\n\tconst relations: Record<string, Relations> = {};\n\n\tObject.entries(imports).forEach(([k, t]) => {\n\t\tif (is(t, MySqlTable)) {\n\t\t\tconst schema = mysqlTableConfig(t).schema || 'public';\n\t\t\tmysqlSchema[schema] = mysqlSchema[schema] || {};\n\t\t\tmysqlSchema[schema][k] = t;\n\t\t}\n\n\t\tif (is(t, Relations)) {\n\t\t\trelations[k] = t;\n\t\t}\n\t});\n\n\tconst setup = await drizzleForMySQL(credentials, mysqlSchema, relations, [], options?.casing);\n\tawait startServerFromSetup(setup, options);\n};\n\n// SingleStore\n\nexport const generateSingleStoreDrizzleJson = async (\n\timports: Record<string, unknown>,\n\tprevId?: string,\n\tcasing?: CasingType,\n): Promise<SingleStoreSchemaKit> => {\n\tconst { prepareFromExports } = await import('./serializer/singlestoreImports');\n\n\tconst prepared = prepareFromExports(imports);\n\n\tconst id = randomUUID();\n\n\tconst snapshot = generateSingleStoreSnapshot(prepared.tables, /* prepared.views, */ casing);\n\n\treturn {\n\t\t...snapshot,\n\t\tid,\n\t\tprevId: prevId ?? originUUID,\n\t};\n};\n\nexport const generateSingleStoreMigration = async (\n\tprev: DrizzleSingleStoreSnapshotJSON,\n\tcur: DrizzleSingleStoreSnapshotJSON,\n) => {\n\tconst { applySingleStoreSnapshotsDiff } = await import('./snapshotsDiffer');\n\n\tconst validatedPrev = singlestoreSchema.parse(prev);\n\tconst validatedCur = singlestoreSchema.parse(cur);\n\n\tconst squashedPrev = squashSingleStoreScheme(validatedPrev);\n\tconst squashedCur = squashSingleStoreScheme(validatedCur);\n\n\tconst { sqlStatements } = await applySingleStoreSnapshotsDiff(\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\t/* singleStoreViewsResolver, */\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t\t'push',\n\t);\n\n\treturn sqlStatements;\n};\n\nexport const pushSingleStoreSchema = async (\n\timports: Record<string, unknown>,\n\tdrizzleInstance: SingleStoreDriverDatabase<any>,\n\tdatabaseName: string,\n) => {\n\tconst { applySingleStoreSnapshotsDiff } = await import('./snapshotsDiffer');\n\tconst { logSuggestionsAndReturn } = await import(\n\t\t'./cli/commands/singlestorePushUtils'\n\t);\n\tconst { singlestorePushIntrospect } = await import(\n\t\t'./cli/commands/singlestoreIntrospect'\n\t);\n\tconst { sql } = await import('drizzle-orm');\n\n\tconst db: DB = {\n\t\tquery: async (query: string) => {\n\t\t\tconst res = await drizzleInstance.execute(sql.raw(query));\n\t\t\treturn res[0] as unknown as any[];\n\t\t},\n\t};\n\tconst cur = await generateSingleStoreDrizzleJson(imports);\n\tconst { schema: prev } = await singlestorePushIntrospect(db, databaseName, []);\n\n\tconst validatedPrev = singlestoreSchema.parse(prev);\n\tconst validatedCur = singlestoreSchema.parse(cur);\n\n\tconst squashedPrev = squashSingleStoreScheme(validatedPrev);\n\tconst squashedCur = squashSingleStoreScheme(validatedCur);\n\n\tconst { statements } = await applySingleStoreSnapshotsDiff(\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\t/* singleStoreViewsResolver, */\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t\t'push',\n\t);\n\n\tconst { shouldAskForApprove, statementsToExecute, infoToPrint } = await logSuggestionsAndReturn(\n\t\tdb,\n\t\tstatements,\n\t\tvalidatedCur,\n\t\tvalidatedPrev,\n\t);\n\n\treturn {\n\t\thasDataLoss: shouldAskForApprove,\n\t\twarnings: infoToPrint,\n\t\tstatementsToExecute,\n\t\tapply: async () => {\n\t\t\tfor (const dStmnt of statementsToExecute) {\n\t\t\t\tawait db.query(dStmnt);\n\t\t\t}\n\t\t},\n\t};\n};\n\nexport const startStudioSingleStoreServer = async (\n\timports: Record<string, unknown>,\n\tcredentials: SingleStoreCredentials,\n\toptions?: {\n\t\thost?: string;\n\t\tport?: number;\n\t\tcasing?: CasingType;\n\t},\n) => {\n\tconst { drizzleForSingleStore } = await import('./serializer/studio');\n\n\tconst singleStoreSchema: Record<string, Record<string, AnySingleStoreTable>> = {};\n\tconst relations: Record<string, Relations> = {};\n\n\tObject.entries(imports).forEach(([k, t]) => {\n\t\tif (is(t, SingleStoreTable)) {\n\t\t\tconst schema = singlestoreTableConfig(t).schema || 'public';\n\t\t\tsingleStoreSchema[schema] = singleStoreSchema[schema] || {};\n\t\t\tsingleStoreSchema[schema][k] = t;\n\t\t}\n\n\t\tif (is(t, Relations)) {\n\t\t\trelations[k] = t;\n\t\t}\n\t});\n\n\tconst setup = await drizzleForSingleStore(credentials, singleStoreSchema, relations, [], options?.casing);\n\tawait startServerFromSetup(setup, options);\n};\n\nconst startServerFromSetup = async (setup: Setup, options?: {\n\thost?: string;\n\tport?: number;\n}) => {\n\tconst { prepareServer } = await import('./serializer/studio');\n\n\tconst server = await prepareServer(setup);\n\n\tconst host = options?.host || '127.0.0.1';\n\tconst port = options?.port || 4983;\n\tconst { key, cert } = (await certs()) || {};\n\tserver.start({\n\t\thost,\n\t\tport,\n\t\tkey,\n\t\tcert,\n\t\tcb: (err) => {\n\t\t\tif (err) {\n\t\t\t\tconsole.error(err);\n\t\t\t} else {\n\t\t\t\tconsole.log(`Studio is running at ${key ? 'https' : 'http'}://${host}:${port}`);\n\t\t\t}\n\t\t},\n\t});\n};\n\nexport const upPgSnapshot = (snapshot: Record<string, unknown>) => {\n\tif (snapshot.version === '5') {\n\t\treturn upPgV7(upPgV6(snapshot));\n\t}\n\tif (snapshot.version === '6') {\n\t\treturn upPgV7(snapshot);\n\t}\n\treturn snapshot;\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/_es5.ts",
    "content": "const _ = '';\nexport default _;\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/check.ts",
    "content": "import { Dialect } from '../../schemaValidator';\nimport { prepareOutFolder, validateWithReport } from '../../utils';\n\nexport const checkHandler = (out: string, dialect: Dialect) => {\n\tconst { snapshots } = prepareOutFolder(out, dialect);\n\tconst report = validateWithReport(snapshots, dialect);\n\n\tif (report.nonLatest.length > 0) {\n\t\tconsole.log(\n\t\t\treport.nonLatest\n\t\t\t\t.map((it) => {\n\t\t\t\t\treturn `${it} is not of the latest version, please run \"drizzle-kit up\"`;\n\t\t\t\t})\n\t\t\t\t.join('\\n'),\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\tif (report.malformed.length) {\n\t\tconst message = report.malformed\n\t\t\t.map((it) => {\n\t\t\t\treturn `${it} data is malformed`;\n\t\t\t})\n\t\t\t.join('\\n');\n\t\tconsole.log(message);\n\t}\n\n\tconst collisionEntries = Object.entries(report.idsMap).filter(\n\t\t(it) => it[1].snapshots.length > 1,\n\t);\n\n\tconst message = collisionEntries\n\t\t.map((it) => {\n\t\t\tconst data = it[1];\n\t\t\treturn `[${\n\t\t\t\tdata.snapshots.join(\n\t\t\t\t\t', ',\n\t\t\t\t)\n\t\t\t}] are pointing to a parent snapshot: ${data.parent}/snapshot.json which is a collision.`;\n\t\t})\n\t\t.join('\\n');\n\n\tif (message) {\n\t\tconsole.log(message);\n\t}\n\n\tconst abort = report.malformed.length!! || collisionEntries.length > 0;\n\n\tif (abort) {\n\t\tprocess.exit(1);\n\t}\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/drop.ts",
    "content": "import chalk from 'chalk';\nimport { readFileSync, rmSync, writeFileSync } from 'fs';\nimport fs from 'fs';\nimport { render } from 'hanji';\nimport { join } from 'path';\nimport { Journal } from '../../utils';\nimport { DropMigrationView } from '../views';\nimport { embeddedMigrations } from './migrate';\n\nexport const dropMigration = async ({\n\tout,\n\tbundle,\n}: {\n\tout: string;\n\tbundle: boolean;\n}) => {\n\tconst metaFilePath = join(out, 'meta', '_journal.json');\n\tconst journal = JSON.parse(readFileSync(metaFilePath, 'utf-8')) as Journal;\n\n\tif (journal.entries.length === 0) {\n\t\tconsole.log(\n\t\t\t`[${chalk.blue('i')}] no migration entries found in ${metaFilePath}`,\n\t\t);\n\t\treturn;\n\t}\n\n\tconst result = await render(new DropMigrationView(journal.entries));\n\tif (result.status === 'aborted') return;\n\n\tdelete journal.entries[journal.entries.indexOf(result.data!)];\n\n\tconst resultJournal: Journal = {\n\t\t...journal,\n\t\tentries: journal.entries.filter(Boolean),\n\t};\n\tconst sqlFilePath = join(out, `${result.data.tag}.sql`);\n\tconst snapshotFilePath = join(\n\t\tout,\n\t\t'meta',\n\t\t`${result.data.tag.split('_')[0]}_snapshot.json`,\n\t);\n\trmSync(sqlFilePath);\n\trmSync(snapshotFilePath);\n\twriteFileSync(metaFilePath, JSON.stringify(resultJournal, null, 2));\n\n\tif (bundle) {\n\t\tfs.writeFileSync(\n\t\t\tjoin(out, `migrations.js`),\n\t\t\tembeddedMigrations(resultJournal),\n\t\t);\n\t}\n\n\tconsole.log(\n\t\t`[${chalk.green('✓')}] ${\n\t\t\tchalk.bold(\n\t\t\t\tresult.data.tag,\n\t\t\t)\n\t\t} migration successfully dropped`,\n\t);\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/introspect.ts",
    "content": "import chalk from 'chalk';\nimport { writeFileSync } from 'fs';\nimport { render, renderWithTask } from 'hanji';\nimport { Minimatch } from 'minimatch';\nimport { join } from 'path';\nimport { plural, singular } from 'pluralize';\nimport { GelSchema } from 'src/serializer/gelSchema';\nimport { drySingleStore, SingleStoreSchema, squashSingleStoreScheme } from 'src/serializer/singlestoreSchema';\nimport { assertUnreachable, originUUID } from '../../global';\nimport { schemaToTypeScript as gelSchemaToTypeScript } from '../../introspect-gel';\nimport { schemaToTypeScript as mysqlSchemaToTypeScript } from '../../introspect-mysql';\nimport { paramNameFor, schemaToTypeScript as postgresSchemaToTypeScript } from '../../introspect-pg';\nimport { schemaToTypeScript as singlestoreSchemaToTypeScript } from '../../introspect-singlestore';\nimport { schemaToTypeScript as sqliteSchemaToTypeScript } from '../../introspect-sqlite';\nimport { fromDatabase as fromGelDatabase } from '../../serializer/gelSerializer';\nimport { dryMySql, MySqlSchema, squashMysqlScheme } from '../../serializer/mysqlSchema';\nimport { fromDatabase as fromMysqlDatabase } from '../../serializer/mysqlSerializer';\nimport { dryPg, type PgSchema, squashPgScheme } from '../../serializer/pgSchema';\nimport { fromDatabase as fromPostgresDatabase } from '../../serializer/pgSerializer';\nimport { fromDatabase as fromSingleStoreDatabase } from '../../serializer/singlestoreSerializer';\nimport { drySQLite, type SQLiteSchema, squashSqliteScheme } from '../../serializer/sqliteSchema';\nimport { fromDatabase as fromSqliteDatabase } from '../../serializer/sqliteSerializer';\nimport {\n\tapplyLibSQLSnapshotsDiff,\n\tapplyMysqlSnapshotsDiff,\n\tapplyPgSnapshotsDiff,\n\tapplySingleStoreSnapshotsDiff,\n\tapplySqliteSnapshotsDiff,\n} from '../../snapshotsDiffer';\nimport { prepareOutFolder } from '../../utils';\nimport { Entities } from '../validations/cli';\nimport type { Casing, Prefix } from '../validations/common';\nimport { GelCredentials } from '../validations/gel';\nimport { LibSQLCredentials } from '../validations/libsql';\nimport type { MysqlCredentials } from '../validations/mysql';\nimport type { PostgresCredentials } from '../validations/postgres';\nimport { SingleStoreCredentials } from '../validations/singlestore';\nimport type { SqliteCredentials } from '../validations/sqlite';\nimport { IntrospectProgress } from '../views';\nimport {\n\tcolumnsResolver,\n\tenumsResolver,\n\tindPolicyResolver,\n\tmySqlViewsResolver,\n\tpolicyResolver,\n\troleResolver,\n\tschemasResolver,\n\tsequencesResolver,\n\tsqliteViewsResolver,\n\ttablesResolver,\n\tviewsResolver,\n\twriteResult,\n} from './migrate';\n\nexport const introspectPostgres = async (\n\tcasing: Casing,\n\tout: string,\n\tbreakpoints: boolean,\n\tcredentials: PostgresCredentials,\n\ttablesFilter: string[],\n\tschemasFilter: string[],\n\tprefix: Prefix,\n\tentities: Entities,\n) => {\n\tconst { preparePostgresDB } = await import('../connections');\n\tconst db = await preparePostgresDB(credentials);\n\n\tconst matchers = tablesFilter.map((it) => {\n\t\treturn new Minimatch(it);\n\t});\n\n\tconst filter = (tableName: string) => {\n\t\tif (matchers.length === 0) return true;\n\n\t\tlet flags: boolean[] = [];\n\n\t\tfor (let matcher of matchers) {\n\t\t\tif (matcher.negate) {\n\t\t\t\tif (!matcher.match(tableName)) {\n\t\t\t\t\tflags.push(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matcher.match(tableName)) {\n\t\t\t\tflags.push(true);\n\t\t\t}\n\t\t}\n\n\t\tif (flags.length > 0) {\n\t\t\treturn flags.every(Boolean);\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst progress = new IntrospectProgress(true);\n\n\tconst res = await renderWithTask(\n\t\tprogress,\n\t\tfromPostgresDatabase(\n\t\t\tdb,\n\t\t\tfilter,\n\t\t\tschemasFilter,\n\t\t\tentities,\n\t\t\t(stage, count, status) => {\n\t\t\t\tprogress.update(stage, count, status);\n\t\t\t},\n\t\t),\n\t);\n\n\tconst schema = { id: originUUID, prevId: '', ...res } as PgSchema;\n\tconst ts = postgresSchemaToTypeScript(schema, casing);\n\tconst relationsTs = relationsToTypeScript(schema, casing);\n\tconst { internal, ...schemaWithoutInternals } = schema;\n\n\tconst schemaFile = join(out, 'schema.ts');\n\twriteFileSync(schemaFile, ts.file);\n\tconst relationsFile = join(out, 'relations.ts');\n\twriteFileSync(relationsFile, relationsTs.file);\n\tconsole.log();\n\n\tconst { snapshots, journal } = prepareOutFolder(out, 'postgresql');\n\n\tif (snapshots.length === 0) {\n\t\tconst { sqlStatements, _meta } = await applyPgSnapshotsDiff(\n\t\t\tsquashPgScheme(dryPg),\n\t\t\tsquashPgScheme(schema),\n\t\t\tschemasResolver,\n\t\t\tenumsResolver,\n\t\t\tsequencesResolver,\n\t\t\tpolicyResolver,\n\t\t\tindPolicyResolver,\n\t\t\troleResolver,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tviewsResolver,\n\t\t\tdryPg,\n\t\t\tschema,\n\t\t);\n\n\t\twriteResult({\n\t\t\tcur: schema,\n\t\t\tsqlStatements,\n\t\t\tjournal,\n\t\t\t_meta,\n\t\t\toutFolder: out,\n\t\t\tbreakpoints,\n\t\t\ttype: 'introspect',\n\t\t\tprefixMode: prefix,\n\t\t});\n\t} else {\n\t\trender(\n\t\t\t`[${\n\t\t\t\tchalk.blue(\n\t\t\t\t\t'i',\n\t\t\t\t)\n\t\t\t}] No SQL generated, you already have migrations in project`,\n\t\t);\n\t}\n\n\trender(\n\t\t`[${\n\t\t\tchalk.green(\n\t\t\t\t'✓',\n\t\t\t)\n\t\t}] Your schema file is ready ➜ ${chalk.bold.underline.blue(schemaFile)} 🚀`,\n\t);\n\trender(\n\t\t`[${\n\t\t\tchalk.green(\n\t\t\t\t'✓',\n\t\t\t)\n\t\t}] Your relations file is ready ➜ ${\n\t\t\tchalk.bold.underline.blue(\n\t\t\t\trelationsFile,\n\t\t\t)\n\t\t} 🚀`,\n\t);\n\tprocess.exit(0);\n};\n\nexport const introspectGel = async (\n\tcasing: Casing,\n\tout: string,\n\tbreakpoints: boolean,\n\tcredentials: GelCredentials | undefined,\n\ttablesFilter: string[],\n\tschemasFilter: string[],\n\tprefix: Prefix,\n\tentities: Entities,\n) => {\n\tconst { prepareGelDB } = await import('../connections');\n\tconst db = await prepareGelDB(credentials);\n\n\tconst matchers = tablesFilter.map((it) => {\n\t\treturn new Minimatch(it);\n\t});\n\n\tconst filter = (tableName: string) => {\n\t\tif (matchers.length === 0) return true;\n\n\t\tlet flags: boolean[] = [];\n\n\t\tfor (let matcher of matchers) {\n\t\t\tif (matcher.negate) {\n\t\t\t\tif (!matcher.match(tableName)) {\n\t\t\t\t\tflags.push(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matcher.match(tableName)) {\n\t\t\t\tflags.push(true);\n\t\t\t}\n\t\t}\n\n\t\tif (flags.length > 0) {\n\t\t\treturn flags.every(Boolean);\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst progress = new IntrospectProgress(true);\n\n\tconst res = await renderWithTask(\n\t\tprogress,\n\t\tfromGelDatabase(\n\t\t\tdb,\n\t\t\tfilter,\n\t\t\tschemasFilter,\n\t\t\tentities,\n\t\t\t(stage, count, status) => {\n\t\t\t\tprogress.update(stage, count, status);\n\t\t\t},\n\t\t),\n\t);\n\n\tconst schema = { id: originUUID, prevId: '', ...res } as GelSchema;\n\tconst ts = gelSchemaToTypeScript(schema, casing);\n\tconst relationsTs = relationsToTypeScript(schema, casing);\n\tconst { internal, ...schemaWithoutInternals } = schema;\n\n\tconst schemaFile = join(out, 'schema.ts');\n\twriteFileSync(schemaFile, ts.file);\n\tconst relationsFile = join(out, 'relations.ts');\n\twriteFileSync(relationsFile, relationsTs.file);\n\tconsole.log();\n\n\t// const { snapshots, journal } = prepareOutFolder(out, 'gel');\n\n\t// if (snapshots.length === 0) {\n\t// \tconst { sqlStatements, _meta } = await applyGelSnapshotsDiff(\n\t// \t\tsquashGelScheme(dryGel),\n\t// \t\tsquashGelScheme(schema),\n\t// \t\tschemasResolver,\n\t// \t\tenumsResolver,\n\t// \t\tsequencesResolver,\n\t// \t\tpolicyResolver,\n\t// \t\tindPolicyResolver,\n\t// \t\troleResolver,\n\t// \t\ttablesResolver,\n\t// \t\tcolumnsResolver,\n\t// \t\tviewsResolver,\n\t// \t\tdryPg,\n\t// \t\tschema,\n\t// \t);\n\n\t// \twriteResult({\n\t// \t\tcur: schema,\n\t// \t\tsqlStatements,\n\t// \t\tjournal,\n\t// \t\t_meta,\n\t// \t\toutFolder: out,\n\t// \t\tbreakpoints,\n\t// \t\ttype: 'introspect',\n\t// \t\tprefixMode: prefix,\n\t// \t});\n\t// } else {\n\t// \trender(\n\t// \t\t`[${\n\t// \t\t\tchalk.blue(\n\t// \t\t\t\t'i',\n\t// \t\t\t)\n\t// \t\t}] No SQL generated, you already have migrations in project`,\n\t// \t);\n\t// }\n\n\trender(\n\t\t`[${\n\t\t\tchalk.green(\n\t\t\t\t'✓',\n\t\t\t)\n\t\t}] Your schema file is ready ➜ ${chalk.bold.underline.blue(schemaFile)} 🚀`,\n\t);\n\trender(\n\t\t`[${\n\t\t\tchalk.green(\n\t\t\t\t'✓',\n\t\t\t)\n\t\t}] Your relations file is ready ➜ ${\n\t\t\tchalk.bold.underline.blue(\n\t\t\t\trelationsFile,\n\t\t\t)\n\t\t} 🚀`,\n\t);\n\tprocess.exit(0);\n};\n\nexport const introspectMysql = async (\n\tcasing: Casing,\n\tout: string,\n\tbreakpoints: boolean,\n\tcredentials: MysqlCredentials,\n\ttablesFilter: string[],\n\tprefix: Prefix,\n) => {\n\tconst { connectToMySQL } = await import('../connections');\n\tconst { db, database } = await connectToMySQL(credentials);\n\n\tconst matchers = tablesFilter.map((it) => {\n\t\treturn new Minimatch(it);\n\t});\n\n\tconst filter = (tableName: string) => {\n\t\tif (matchers.length === 0) return true;\n\n\t\tlet flags: boolean[] = [];\n\n\t\tfor (let matcher of matchers) {\n\t\t\tif (matcher.negate) {\n\t\t\t\tif (!matcher.match(tableName)) {\n\t\t\t\t\tflags.push(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matcher.match(tableName)) {\n\t\t\t\tflags.push(true);\n\t\t\t}\n\t\t}\n\n\t\tif (flags.length > 0) {\n\t\t\treturn flags.every(Boolean);\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst progress = new IntrospectProgress();\n\tconst res = await renderWithTask(\n\t\tprogress,\n\t\tfromMysqlDatabase(db, database, filter, (stage, count, status) => {\n\t\t\tprogress.update(stage, count, status);\n\t\t}),\n\t);\n\n\tconst schema = { id: originUUID, prevId: '', ...res } as MySqlSchema;\n\tconst ts = mysqlSchemaToTypeScript(schema, casing);\n\tconst relationsTs = relationsToTypeScript(schema, casing);\n\tconst { internal, ...schemaWithoutInternals } = schema;\n\n\tconst schemaFile = join(out, 'schema.ts');\n\twriteFileSync(schemaFile, ts.file);\n\tconst relationsFile = join(out, 'relations.ts');\n\twriteFileSync(relationsFile, relationsTs.file);\n\tconsole.log();\n\n\tconst { snapshots, journal } = prepareOutFolder(out, 'mysql');\n\n\tif (snapshots.length === 0) {\n\t\tconst { sqlStatements, _meta } = await applyMysqlSnapshotsDiff(\n\t\t\tsquashMysqlScheme(dryMySql),\n\t\t\tsquashMysqlScheme(schema),\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tmySqlViewsResolver,\n\t\t\tdryMySql,\n\t\t\tschema,\n\t\t);\n\n\t\twriteResult({\n\t\t\tcur: schema,\n\t\t\tsqlStatements,\n\t\t\tjournal,\n\t\t\t_meta,\n\t\t\toutFolder: out,\n\t\t\tbreakpoints,\n\t\t\ttype: 'introspect',\n\t\t\tprefixMode: prefix,\n\t\t});\n\t} else {\n\t\trender(\n\t\t\t`[${\n\t\t\t\tchalk.blue(\n\t\t\t\t\t'i',\n\t\t\t\t)\n\t\t\t}] No SQL generated, you already have migrations in project`,\n\t\t);\n\t}\n\n\trender(\n\t\t`[${\n\t\t\tchalk.green(\n\t\t\t\t'✓',\n\t\t\t)\n\t\t}] Your schema file is ready ➜ ${chalk.bold.underline.blue(schemaFile)} 🚀`,\n\t);\n\trender(\n\t\t`[${\n\t\t\tchalk.green(\n\t\t\t\t'✓',\n\t\t\t)\n\t\t}] Your relations file is ready ➜ ${\n\t\t\tchalk.bold.underline.blue(\n\t\t\t\trelationsFile,\n\t\t\t)\n\t\t} 🚀`,\n\t);\n\tprocess.exit(0);\n};\n\nexport const introspectSingleStore = async (\n\tcasing: Casing,\n\tout: string,\n\tbreakpoints: boolean,\n\tcredentials: SingleStoreCredentials,\n\ttablesFilter: string[],\n\tprefix: Prefix,\n) => {\n\tconst { connectToSingleStore } = await import('../connections');\n\tconst { db, database } = await connectToSingleStore(credentials);\n\n\tconst matchers = tablesFilter.map((it) => {\n\t\treturn new Minimatch(it);\n\t});\n\n\tconst filter = (tableName: string) => {\n\t\tif (matchers.length === 0) return true;\n\n\t\tlet flags: boolean[] = [];\n\n\t\tfor (let matcher of matchers) {\n\t\t\tif (matcher.negate) {\n\t\t\t\tif (!matcher.match(tableName)) {\n\t\t\t\t\tflags.push(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matcher.match(tableName)) {\n\t\t\t\tflags.push(true);\n\t\t\t}\n\t\t}\n\n\t\tif (flags.length > 0) {\n\t\t\treturn flags.every(Boolean);\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst progress = new IntrospectProgress();\n\tconst res = await renderWithTask(\n\t\tprogress,\n\t\tfromSingleStoreDatabase(db, database, filter, (stage, count, status) => {\n\t\t\tprogress.update(stage, count, status);\n\t\t}),\n\t);\n\n\tconst schema = { id: originUUID, prevId: '', ...res } as SingleStoreSchema;\n\tconst ts = singlestoreSchemaToTypeScript(schema, casing);\n\tconst { internal, ...schemaWithoutInternals } = schema;\n\n\tconst schemaFile = join(out, 'schema.ts');\n\twriteFileSync(schemaFile, ts.file);\n\tconsole.log();\n\n\tconst { snapshots, journal } = prepareOutFolder(out, 'postgresql');\n\n\tif (snapshots.length === 0) {\n\t\tconst { sqlStatements, _meta } = await applySingleStoreSnapshotsDiff(\n\t\t\tsquashSingleStoreScheme(drySingleStore),\n\t\t\tsquashSingleStoreScheme(schema),\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\t/* singleStoreViewsResolver, */\n\t\t\tdrySingleStore,\n\t\t\tschema,\n\t\t);\n\n\t\twriteResult({\n\t\t\tcur: schema,\n\t\t\tsqlStatements,\n\t\t\tjournal,\n\t\t\t_meta,\n\t\t\toutFolder: out,\n\t\t\tbreakpoints,\n\t\t\ttype: 'introspect',\n\t\t\tprefixMode: prefix,\n\t\t});\n\t} else {\n\t\trender(\n\t\t\t`[${\n\t\t\t\tchalk.blue(\n\t\t\t\t\t'i',\n\t\t\t\t)\n\t\t\t}] No SQL generated, you already have migrations in project`,\n\t\t);\n\t}\n\n\trender(\n\t\t`[${\n\t\t\tchalk.green(\n\t\t\t\t'✓',\n\t\t\t)\n\t\t}] You schema file is ready ➜ ${chalk.bold.underline.blue(schemaFile)} 🚀`,\n\t);\n\tprocess.exit(0);\n};\n\nexport const introspectSqlite = async (\n\tcasing: Casing,\n\tout: string,\n\tbreakpoints: boolean,\n\tcredentials: SqliteCredentials,\n\ttablesFilter: string[],\n\tprefix: Prefix,\n) => {\n\tconst { connectToSQLite } = await import('../connections');\n\tconst db = await connectToSQLite(credentials);\n\n\tconst matchers = tablesFilter.map((it) => {\n\t\treturn new Minimatch(it);\n\t});\n\n\tconst filter = (tableName: string) => {\n\t\tif (matchers.length === 0) return true;\n\n\t\tlet flags: boolean[] = [];\n\n\t\tfor (let matcher of matchers) {\n\t\t\tif (matcher.negate) {\n\t\t\t\tif (!matcher.match(tableName)) {\n\t\t\t\t\tflags.push(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matcher.match(tableName)) {\n\t\t\t\tflags.push(true);\n\t\t\t}\n\t\t}\n\n\t\tif (flags.length > 0) {\n\t\t\treturn flags.every(Boolean);\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst progress = new IntrospectProgress();\n\tconst res = await renderWithTask(\n\t\tprogress,\n\t\tfromSqliteDatabase(db, filter, (stage, count, status) => {\n\t\t\tprogress.update(stage, count, status);\n\t\t}),\n\t);\n\n\tconst schema = { id: originUUID, prevId: '', ...res } as SQLiteSchema;\n\tconst ts = sqliteSchemaToTypeScript(schema, casing);\n\tconst relationsTs = relationsToTypeScript(schema, casing);\n\n\t// check orm and orm-pg api version\n\n\tconst schemaFile = join(out, 'schema.ts');\n\twriteFileSync(schemaFile, ts.file);\n\tconst relationsFile = join(out, 'relations.ts');\n\twriteFileSync(relationsFile, relationsTs.file);\n\tconsole.log();\n\n\tconst { snapshots, journal } = prepareOutFolder(out, 'sqlite');\n\n\tif (snapshots.length === 0) {\n\t\tconst { sqlStatements, _meta } = await applySqliteSnapshotsDiff(\n\t\t\tsquashSqliteScheme(drySQLite),\n\t\t\tsquashSqliteScheme(schema),\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tsqliteViewsResolver,\n\t\t\tdrySQLite,\n\t\t\tschema,\n\t\t);\n\n\t\twriteResult({\n\t\t\tcur: schema,\n\t\t\tsqlStatements,\n\t\t\tjournal,\n\t\t\t_meta,\n\t\t\toutFolder: out,\n\t\t\tbreakpoints,\n\t\t\ttype: 'introspect',\n\t\t\tprefixMode: prefix,\n\t\t});\n\t} else {\n\t\trender(\n\t\t\t`[${\n\t\t\t\tchalk.blue(\n\t\t\t\t\t'i',\n\t\t\t\t)\n\t\t\t}] No SQL generated, you already have migrations in project`,\n\t\t);\n\t}\n\n\trender(\n\t\t`[${\n\t\t\tchalk.green(\n\t\t\t\t'✓',\n\t\t\t)\n\t\t}] You schema file is ready ➜ ${chalk.bold.underline.blue(schemaFile)} 🚀`,\n\t);\n\trender(\n\t\t`[${\n\t\t\tchalk.green(\n\t\t\t\t'✓',\n\t\t\t)\n\t\t}] You relations file is ready ➜ ${\n\t\t\tchalk.bold.underline.blue(\n\t\t\t\trelationsFile,\n\t\t\t)\n\t\t} 🚀`,\n\t);\n\tprocess.exit(0);\n};\n\nexport const introspectLibSQL = async (\n\tcasing: Casing,\n\tout: string,\n\tbreakpoints: boolean,\n\tcredentials: LibSQLCredentials,\n\ttablesFilter: string[],\n\tprefix: Prefix,\n) => {\n\tconst { connectToLibSQL } = await import('../connections');\n\tconst db = await connectToLibSQL(credentials);\n\n\tconst matchers = tablesFilter.map((it) => {\n\t\treturn new Minimatch(it);\n\t});\n\n\tconst filter = (tableName: string) => {\n\t\tif (matchers.length === 0) return true;\n\n\t\tlet flags: boolean[] = [];\n\n\t\tfor (let matcher of matchers) {\n\t\t\tif (matcher.negate) {\n\t\t\t\tif (!matcher.match(tableName)) {\n\t\t\t\t\tflags.push(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matcher.match(tableName)) {\n\t\t\t\tflags.push(true);\n\t\t\t}\n\t\t}\n\n\t\tif (flags.length > 0) {\n\t\t\treturn flags.every(Boolean);\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst progress = new IntrospectProgress();\n\tconst res = await renderWithTask(\n\t\tprogress,\n\t\tfromSqliteDatabase(db, filter, (stage, count, status) => {\n\t\t\tprogress.update(stage, count, status);\n\t\t}),\n\t);\n\n\tconst schema = { id: originUUID, prevId: '', ...res } as SQLiteSchema;\n\tconst ts = sqliteSchemaToTypeScript(schema, casing);\n\tconst relationsTs = relationsToTypeScript(schema, casing);\n\n\t// check orm and orm-pg api version\n\n\tconst schemaFile = join(out, 'schema.ts');\n\twriteFileSync(schemaFile, ts.file);\n\tconst relationsFile = join(out, 'relations.ts');\n\twriteFileSync(relationsFile, relationsTs.file);\n\tconsole.log();\n\n\tconst { snapshots, journal } = prepareOutFolder(out, 'sqlite');\n\n\tif (snapshots.length === 0) {\n\t\tconst { sqlStatements, _meta } = await applyLibSQLSnapshotsDiff(\n\t\t\tsquashSqliteScheme(drySQLite),\n\t\t\tsquashSqliteScheme(schema),\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tsqliteViewsResolver,\n\t\t\tdrySQLite,\n\t\t\tschema,\n\t\t);\n\n\t\twriteResult({\n\t\t\tcur: schema,\n\t\t\tsqlStatements,\n\t\t\tjournal,\n\t\t\t_meta,\n\t\t\toutFolder: out,\n\t\t\tbreakpoints,\n\t\t\ttype: 'introspect',\n\t\t\tprefixMode: prefix,\n\t\t});\n\t} else {\n\t\trender(\n\t\t\t`[${\n\t\t\t\tchalk.blue(\n\t\t\t\t\t'i',\n\t\t\t\t)\n\t\t\t}] No SQL generated, you already have migrations in project`,\n\t\t);\n\t}\n\n\trender(\n\t\t`[${\n\t\t\tchalk.green(\n\t\t\t\t'✓',\n\t\t\t)\n\t\t}] Your schema file is ready ➜ ${chalk.bold.underline.blue(schemaFile)} 🚀`,\n\t);\n\trender(\n\t\t`[${\n\t\t\tchalk.green(\n\t\t\t\t'✓',\n\t\t\t)\n\t\t}] Your relations file is ready ➜ ${\n\t\t\tchalk.bold.underline.blue(\n\t\t\t\trelationsFile,\n\t\t\t)\n\t\t} 🚀`,\n\t);\n\tprocess.exit(0);\n};\n\nconst withCasing = (value: string, casing: Casing) => {\n\tif (casing === 'preserve') {\n\t\treturn value;\n\t}\n\tif (casing === 'camel') {\n\t\treturn value.camelCase();\n\t}\n\n\tassertUnreachable(casing);\n};\n\nexport const relationsToTypeScript = (\n\tschema: {\n\t\ttables: Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tschema?: string;\n\t\t\t\tforeignKeys: Record<\n\t\t\t\t\tstring,\n\t\t\t\t\t{\n\t\t\t\t\t\tname: string;\n\t\t\t\t\t\ttableFrom: string;\n\t\t\t\t\t\tcolumnsFrom: string[];\n\t\t\t\t\t\ttableTo: string;\n\t\t\t\t\t\tschemaTo?: string;\n\t\t\t\t\t\tcolumnsTo: string[];\n\t\t\t\t\t\tonUpdate?: string | undefined;\n\t\t\t\t\t\tonDelete?: string | undefined;\n\t\t\t\t\t}\n\t\t\t\t>;\n\t\t\t}\n\t\t>;\n\t},\n\tcasing: Casing,\n) => {\n\tconst imports: string[] = [];\n\tconst tableRelations: Record<\n\t\tstring,\n\t\t{\n\t\t\tname: string;\n\t\t\ttype: 'one' | 'many';\n\t\t\ttableFrom: string;\n\t\t\tschemaFrom?: string;\n\t\t\tcolumnFrom: string;\n\t\t\ttableTo: string;\n\t\t\tschemaTo?: string;\n\t\t\tcolumnTo: string;\n\t\t\trelationName?: string;\n\t\t}[]\n\t> = {};\n\n\tObject.values(schema.tables).forEach((table) => {\n\t\tObject.values(table.foreignKeys).forEach((fk) => {\n\t\t\tconst tableNameFrom = paramNameFor(fk.tableFrom, table.schema);\n\t\t\tconst tableNameTo = paramNameFor(fk.tableTo, fk.schemaTo);\n\t\t\tconst tableFrom = withCasing(tableNameFrom.replace(/:+/g, ''), casing);\n\t\t\tconst tableTo = withCasing(tableNameTo.replace(/:+/g, ''), casing);\n\t\t\tconst columnFrom = withCasing(fk.columnsFrom[0], casing);\n\t\t\tconst columnTo = withCasing(fk.columnsTo[0], casing);\n\n\t\t\timports.push(tableTo, tableFrom);\n\n\t\t\t// const keyFrom = `${schemaFrom}.${tableFrom}`;\n\t\t\tconst keyFrom = tableFrom;\n\n\t\t\tif (!tableRelations[keyFrom]) {\n\t\t\t\ttableRelations[keyFrom] = [];\n\t\t\t}\n\n\t\t\ttableRelations[keyFrom].push({\n\t\t\t\tname: singular(tableTo),\n\t\t\t\ttype: 'one',\n\t\t\t\ttableFrom,\n\t\t\t\tcolumnFrom,\n\t\t\t\ttableTo,\n\t\t\t\tcolumnTo,\n\t\t\t});\n\n\t\t\t// const keyTo = `${schemaTo}.${tableTo}`;\n\t\t\tconst keyTo = tableTo;\n\n\t\t\tif (!tableRelations[keyTo]) {\n\t\t\t\ttableRelations[keyTo] = [];\n\t\t\t}\n\n\t\t\ttableRelations[keyTo].push({\n\t\t\t\tname: plural(tableFrom),\n\t\t\t\ttype: 'many',\n\t\t\t\ttableFrom: tableTo,\n\t\t\t\tcolumnFrom: columnTo,\n\t\t\t\ttableTo: tableFrom,\n\t\t\t\tcolumnTo: columnFrom,\n\t\t\t});\n\t\t});\n\t});\n\n\tconst uniqueImports = [...new Set(imports)];\n\n\tconst importsTs = `import { relations } from \"drizzle-orm/relations\";\\nimport { ${\n\t\tuniqueImports.join(\n\t\t\t', ',\n\t\t)\n\t} } from \"./schema\";\\n\\n`;\n\n\tconst relationStatements = Object.entries(tableRelations).map(\n\t\t([table, relations]) => {\n\t\t\tconst hasOne = relations.some((it) => it.type === 'one');\n\t\t\tconst hasMany = relations.some((it) => it.type === 'many');\n\n\t\t\t// * change relation names if they are duplicated or if there are multiple relations between two tables\n\t\t\tconst preparedRelations = relations.map(\n\t\t\t\t(relation, relationIndex, originArray) => {\n\t\t\t\t\tlet name = relation.name;\n\t\t\t\t\tlet relationName;\n\t\t\t\t\tconst hasMultipleRelations = originArray.some(\n\t\t\t\t\t\t(it, originIndex) => relationIndex !== originIndex && it.tableTo === relation.tableTo,\n\t\t\t\t\t);\n\t\t\t\t\tif (hasMultipleRelations) {\n\t\t\t\t\t\trelationName = relation.type === 'one'\n\t\t\t\t\t\t\t? `${relation.tableFrom}_${relation.columnFrom}_${relation.tableTo}_${relation.columnTo}`\n\t\t\t\t\t\t\t: `${relation.tableTo}_${relation.columnTo}_${relation.tableFrom}_${relation.columnFrom}`;\n\t\t\t\t\t}\n\t\t\t\t\tconst hasDuplicatedRelation = originArray.some(\n\t\t\t\t\t\t(it, originIndex) => relationIndex !== originIndex && it.name === relation.name,\n\t\t\t\t\t);\n\t\t\t\t\tif (hasDuplicatedRelation) {\n\t\t\t\t\t\tname = `${relation.name}_${relation.type === 'one' ? relation.columnFrom : relation.columnTo}`;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...relation,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\trelationName,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst fields = preparedRelations.map((relation) => {\n\t\t\t\tif (relation.type === 'one') {\n\t\t\t\t\treturn `\\t${relation.name}: one(${relation.tableTo}, {\\n\\t\\tfields: [${relation.tableFrom}.${relation.columnFrom}],\\n\\t\\treferences: [${relation.tableTo}.${relation.columnTo}]${\n\t\t\t\t\t\trelation.relationName\n\t\t\t\t\t\t\t? `,\\n\\t\\trelationName: \"${relation.relationName}\"`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\\n\\t}),`;\n\t\t\t\t} else {\n\t\t\t\t\treturn `\\t${relation.name}: many(${relation.tableTo}${\n\t\t\t\t\t\trelation.relationName\n\t\t\t\t\t\t\t? `, {\\n\\t\\trelationName: \"${relation.relationName}\"\\n\\t}`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}),`;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn `export const ${table}Relations = relations(${table}, ({${hasOne ? 'one' : ''}${\n\t\t\t\thasOne && hasMany ? ', ' : ''\n\t\t\t}${hasMany ? 'many' : ''}}) => ({\\n${fields.join('\\n')}\\n}));`;\n\t\t},\n\t);\n\n\treturn {\n\t\tfile: importsTs + relationStatements.join('\\n\\n'),\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/libSqlPushUtils.ts",
    "content": "import chalk from 'chalk';\n\nimport { JsonStatement } from 'src/jsonStatements';\nimport { findAddedAndRemoved, SQLiteDB } from 'src/utils';\nimport { SQLiteSchemaInternal, SQLiteSchemaSquashed, SQLiteSquasher } from '../../serializer/sqliteSchema';\nimport {\n\tCreateSqliteIndexConvertor,\n\tfromJson,\n\tLibSQLModifyColumn,\n\tSQLiteCreateTableConvertor,\n\tSQLiteDropTableConvertor,\n\tSqliteRenameTableConvertor,\n} from '../../sqlgenerator';\n\nexport const getOldTableName = (\n\ttableName: string,\n\tmeta: SQLiteSchemaInternal['_meta'],\n) => {\n\tfor (const key of Object.keys(meta.tables)) {\n\t\tconst value = meta.tables[key];\n\t\tif (`\"${tableName}\"` === value) {\n\t\t\treturn key.substring(1, key.length - 1);\n\t\t}\n\t}\n\treturn tableName;\n};\n\nexport const _moveDataStatements = (\n\ttableName: string,\n\tjson: SQLiteSchemaSquashed,\n\tdataLoss: boolean = false,\n) => {\n\tconst statements: string[] = [];\n\n\tconst newTableName = `__new_${tableName}`;\n\n\t// create table statement from a new json2 with proper name\n\tconst tableColumns = Object.values(json.tables[tableName].columns);\n\tconst referenceData = Object.values(json.tables[tableName].foreignKeys);\n\tconst compositePKs = Object.values(\n\t\tjson.tables[tableName].compositePrimaryKeys,\n\t).map((it) => SQLiteSquasher.unsquashPK(it));\n\tconst checkConstraints = Object.values(json.tables[tableName].checkConstraints);\n\n\tconst fks = referenceData.map((it) => SQLiteSquasher.unsquashPushFK(it));\n\n\tconst mappedCheckConstraints: string[] = checkConstraints.map((it) =>\n\t\tit.replaceAll(`\"${tableName}\".`, `\"${newTableName}\".`)\n\t\t\t.replaceAll(`\\`${tableName}\\`.`, `\\`${newTableName}\\`.`)\n\t\t\t.replaceAll(`${tableName}.`, `${newTableName}.`)\n\t\t\t.replaceAll(`'${tableName}'.`, `\\`${newTableName}\\`.`)\n\t);\n\n\t// create new table\n\tstatements.push(\n\t\tnew SQLiteCreateTableConvertor().convert({\n\t\t\ttype: 'sqlite_create_table',\n\t\t\ttableName: newTableName,\n\t\t\tcolumns: tableColumns,\n\t\t\treferenceData: fks,\n\t\t\tcompositePKs,\n\t\t\tcheckConstraints: mappedCheckConstraints,\n\t\t}),\n\t);\n\n\t// move data\n\tif (!dataLoss) {\n\t\tconst columns = Object.keys(json.tables[tableName].columns).map(\n\t\t\t(c) => `\"${c}\"`,\n\t\t);\n\n\t\tstatements.push(\n\t\t\t`INSERT INTO \\`${newTableName}\\`(${\n\t\t\t\tcolumns.join(\n\t\t\t\t\t', ',\n\t\t\t\t)\n\t\t\t}) SELECT ${columns.join(', ')} FROM \\`${tableName}\\`;`,\n\t\t);\n\t}\n\n\tstatements.push(\n\t\tnew SQLiteDropTableConvertor().convert({\n\t\t\ttype: 'drop_table',\n\t\t\ttableName: tableName,\n\t\t\tschema: '',\n\t\t}),\n\t);\n\n\t// rename table\n\tstatements.push(\n\t\tnew SqliteRenameTableConvertor().convert({\n\t\t\tfromSchema: '',\n\t\t\ttableNameFrom: newTableName,\n\t\t\ttableNameTo: tableName,\n\t\t\ttoSchema: '',\n\t\t\ttype: 'rename_table',\n\t\t}),\n\t);\n\n\tfor (const idx of Object.values(json.tables[tableName].indexes)) {\n\t\tstatements.push(\n\t\t\tnew CreateSqliteIndexConvertor().convert({\n\t\t\t\ttype: 'create_index',\n\t\t\t\ttableName: tableName,\n\t\t\t\tschema: '',\n\t\t\t\tdata: idx,\n\t\t\t}),\n\t\t);\n\t}\n\treturn statements;\n};\n\nexport const libSqlLogSuggestionsAndReturn = async (\n\tconnection: SQLiteDB,\n\tstatements: JsonStatement[],\n\tjson1: SQLiteSchemaSquashed,\n\tjson2: SQLiteSchemaSquashed,\n\tmeta: SQLiteSchemaInternal['_meta'],\n) => {\n\tlet shouldAskForApprove = false;\n\tconst statementsToExecute: string[] = [];\n\tconst infoToPrint: string[] = [];\n\n\tconst tablesToRemove: string[] = [];\n\tconst columnsToRemove: string[] = [];\n\tconst tablesToTruncate: string[] = [];\n\n\tfor (const statement of statements) {\n\t\tif (statement.type === 'drop_table') {\n\t\t\tconst res = await connection.query<{ count: string }>(\n\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.tableName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} table with ${count} items`,\n\t\t\t\t);\n\t\t\t\ttablesToRemove.push(statement.tableName);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t\tconst fromJsonStatement = fromJson([statement], 'turso', 'push', json2);\n\t\t\tstatementsToExecute.push(\n\t\t\t\t...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]),\n\t\t\t);\n\t\t} else if (statement.type === 'alter_table_drop_column') {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tconst res = await connection.query<{ count: string }>(\n\t\t\t\t`select count(*) as count from \\`${tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.columnName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} column in ${tableName} table with ${count} items`,\n\t\t\t\t);\n\t\t\t\tcolumnsToRemove.push(`${tableName}_${statement.columnName}`);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\n\t\t\tconst fromJsonStatement = fromJson([statement], 'turso', 'push', json2);\n\t\t\tstatementsToExecute.push(\n\t\t\t\t...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]),\n\t\t\t);\n\t\t} else if (\n\t\t\tstatement.type === 'sqlite_alter_table_add_column'\n\t\t\t&& statement.column.notNull\n\t\t\t&& !statement.column.default\n\t\t) {\n\t\t\tconst newTableName = statement.tableName;\n\t\t\tconst res = await connection.query<{ count: string }>(\n\t\t\t\t`select count(*) as count from \\`${newTableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to add not-null ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.column.name,\n\t\t\t\t\t\t)\n\t\t\t\t\t} column without default value, which contains ${count} items`,\n\t\t\t\t);\n\n\t\t\t\ttablesToTruncate.push(newTableName);\n\t\t\t\tstatementsToExecute.push(`delete from ${newTableName};`);\n\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\n\t\t\tconst fromJsonStatement = fromJson([statement], 'turso', 'push', json2);\n\t\t\tstatementsToExecute.push(\n\t\t\t\t...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]),\n\t\t\t);\n\t\t} else if (statement.type === 'alter_table_alter_column_set_notnull') {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tif (\n\t\t\t\tstatement.type === 'alter_table_alter_column_set_notnull'\n\t\t\t\t&& typeof statement.columnDefault === 'undefined'\n\t\t\t) {\n\t\t\t\tconst res = await connection.query<{ count: string }>(\n\t\t\t\t\t`select count(*) as count from \\`${tableName}\\``,\n\t\t\t\t);\n\t\t\t\tconst count = Number(res[0].count);\n\t\t\t\tif (count > 0) {\n\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t`· You're about to add not-null constraint to ${\n\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\tstatement.columnName,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} column without default value, which contains ${count} items`,\n\t\t\t\t\t);\n\n\t\t\t\t\ttablesToTruncate.push(tableName);\n\t\t\t\t\tstatementsToExecute.push(`delete from \\`${tableName}\\``);\n\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst modifyStatements = new LibSQLModifyColumn().convert(statement, json2);\n\n\t\t\tstatementsToExecute.push(\n\t\t\t\t...(Array.isArray(modifyStatements) ? modifyStatements : [modifyStatements]),\n\t\t\t);\n\t\t} else if (statement.type === 'recreate_table') {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tlet dataLoss = false;\n\n\t\t\tconst oldTableName = getOldTableName(tableName, meta);\n\n\t\t\tconst prevColumnNames = Object.keys(json1.tables[oldTableName].columns);\n\t\t\tconst currentColumnNames = Object.keys(json2.tables[tableName].columns);\n\t\t\tconst { removedColumns, addedColumns } = findAddedAndRemoved(\n\t\t\t\tprevColumnNames,\n\t\t\t\tcurrentColumnNames,\n\t\t\t);\n\n\t\t\tif (removedColumns.length) {\n\t\t\t\tfor (const removedColumn of removedColumns) {\n\t\t\t\t\tconst res = await connection.query<{ count: string }>(\n\t\t\t\t\t\t`select count(\\`${tableName}\\`.\\`${removedColumn}\\`) as count from \\`${tableName}\\``,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst count = Number(res[0].count);\n\t\t\t\t\tif (count > 0) {\n\t\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\t\tremovedColumn,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} column in ${tableName} table with ${count} items`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcolumnsToRemove.push(removedColumn);\n\t\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (addedColumns.length) {\n\t\t\t\tfor (const addedColumn of addedColumns) {\n\t\t\t\t\tconst [res] = await connection.query<{ count: string }>(\n\t\t\t\t\t\t`select count(*) as count from \\`${tableName}\\``,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst columnConf = json2.tables[tableName].columns[addedColumn];\n\n\t\t\t\t\tconst count = Number(res.count);\n\t\t\t\t\tif (count > 0 && columnConf.notNull && !columnConf.default) {\n\t\t\t\t\t\tdataLoss = true;\n\n\t\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t\t`· You're about to add not-null ${\n\t\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\t\taddedColumn,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} column without default value to table, which contains ${count} items`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t\t\ttablesToTruncate.push(tableName);\n\n\t\t\t\t\t\tstatementsToExecute.push(`DELETE FROM \\`${tableName}\\`;`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// check if some tables referencing current for pragma\n\t\t\tconst tablesReferencingCurrent: string[] = [];\n\n\t\t\tfor (const table of Object.values(json2.tables)) {\n\t\t\t\tconst tablesRefs = Object.values(json2.tables[table.name].foreignKeys)\n\t\t\t\t\t.filter((t) => SQLiteSquasher.unsquashPushFK(t).tableTo === tableName)\n\t\t\t\t\t.map((it) => SQLiteSquasher.unsquashPushFK(it).tableFrom);\n\n\t\t\t\ttablesReferencingCurrent.push(...tablesRefs);\n\t\t\t}\n\n\t\t\tif (!tablesReferencingCurrent.length) {\n\t\t\t\tstatementsToExecute.push(..._moveDataStatements(tableName, json2, dataLoss));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// recreate table\n\t\t\tstatementsToExecute.push(\n\t\t\t\t..._moveDataStatements(tableName, json2, dataLoss),\n\t\t\t);\n\t\t} else if (\n\t\t\tstatement.type === 'alter_table_alter_column_set_generated'\n\t\t\t|| statement.type === 'alter_table_alter_column_drop_generated'\n\t\t) {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tconst res = await connection.query<{ count: string }>(\n\t\t\t\t`select count(\"${statement.columnName}\") as count from \\`${tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.columnName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} column in ${tableName} table with ${count} items`,\n\t\t\t\t);\n\t\t\t\tcolumnsToRemove.push(`${tableName}_${statement.columnName}`);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t\tconst fromJsonStatement = fromJson([statement], 'turso', 'push', json2);\n\t\t\tstatementsToExecute.push(\n\t\t\t\t...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]),\n\t\t\t);\n\t\t} else {\n\t\t\tconst fromJsonStatement = fromJson([statement], 'turso', 'push', json2);\n\t\t\tstatementsToExecute.push(\n\t\t\t\t...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]),\n\t\t\t);\n\t\t}\n\t}\n\n\treturn {\n\t\tstatementsToExecute: [...new Set(statementsToExecute)],\n\t\tshouldAskForApprove,\n\t\tinfoToPrint,\n\t\tcolumnsToRemove: [...new Set(columnsToRemove)],\n\t\ttablesToTruncate: [...new Set(tablesToTruncate)],\n\t\ttablesToRemove: [...new Set(tablesToRemove)],\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/migrate.ts",
    "content": "import fs from 'fs';\nimport {\n\tprepareMySqlDbPushSnapshot,\n\tprepareMySqlMigrationSnapshot,\n\tpreparePgDbPushSnapshot,\n\tpreparePgMigrationSnapshot,\n\tprepareSingleStoreDbPushSnapshot,\n\tprepareSingleStoreMigrationSnapshot,\n\tprepareSQLiteDbPushSnapshot,\n\tprepareSqliteMigrationSnapshot,\n} from '../../migrationPreparator';\n\nimport chalk from 'chalk';\nimport { render } from 'hanji';\nimport path, { join } from 'path';\nimport { SingleStoreSchema, singlestoreSchema, squashSingleStoreScheme } from 'src/serializer/singlestoreSchema';\nimport { TypeOf } from 'zod';\nimport type { CommonSchema } from '../../schemaValidator';\nimport { MySqlSchema, mysqlSchema, squashMysqlScheme, ViewSquashed } from '../../serializer/mysqlSchema';\nimport { PgSchema, pgSchema, Policy, Role, squashPgScheme, View } from '../../serializer/pgSchema';\nimport { SQLiteSchema, sqliteSchema, squashSqliteScheme, View as SQLiteView } from '../../serializer/sqliteSchema';\nimport {\n\tapplyLibSQLSnapshotsDiff,\n\tapplyMysqlSnapshotsDiff,\n\tapplyPgSnapshotsDiff,\n\tapplySingleStoreSnapshotsDiff,\n\tapplySqliteSnapshotsDiff,\n\tColumn,\n\tColumnsResolverInput,\n\tColumnsResolverOutput,\n\tEnum,\n\tPolicyResolverInput,\n\tPolicyResolverOutput,\n\tResolverInput,\n\tResolverOutput,\n\tResolverOutputWithMoved,\n\tRolesResolverInput,\n\tRolesResolverOutput,\n\tSequence,\n\tTable,\n\tTablePolicyResolverInput,\n\tTablePolicyResolverOutput,\n} from '../../snapshotsDiffer';\nimport { assertV1OutFolder, Journal, prepareMigrationFolder } from '../../utils';\nimport { prepareMigrationMetadata } from '../../utils/words';\nimport { CasingType, Driver, Prefix } from '../validations/common';\nimport { withStyle } from '../validations/outputs';\nimport {\n\tisRenamePromptItem,\n\tRenamePropmtItem,\n\tResolveColumnSelect,\n\tResolveSchemasSelect,\n\tResolveSelect,\n\tResolveSelectNamed,\n\tschema,\n} from '../views';\nimport { ExportConfig, GenerateConfig } from './utils';\n\nexport type Named = {\n\tname: string;\n};\n\nexport type NamedWithSchema = {\n\tname: string;\n\tschema: string;\n};\n\nexport const schemasResolver = async (\n\tinput: ResolverInput<Table>,\n): Promise<ResolverOutput<Table>> => {\n\ttry {\n\t\tconst { created, deleted, renamed } = await promptSchemasConflict(\n\t\t\tinput.created,\n\t\t\tinput.deleted,\n\t\t);\n\n\t\treturn { created: created, deleted: deleted, renamed: renamed };\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const tablesResolver = async (\n\tinput: ResolverInput<Table>,\n): Promise<ResolverOutputWithMoved<Table>> => {\n\ttry {\n\t\tconst { created, deleted, moved, renamed } = await promptNamedWithSchemasConflict(\n\t\t\tinput.created,\n\t\t\tinput.deleted,\n\t\t\t'table',\n\t\t);\n\n\t\treturn {\n\t\t\tcreated: created,\n\t\t\tdeleted: deleted,\n\t\t\tmoved: moved,\n\t\t\trenamed: renamed,\n\t\t};\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const viewsResolver = async (\n\tinput: ResolverInput<View>,\n): Promise<ResolverOutputWithMoved<View>> => {\n\ttry {\n\t\tconst { created, deleted, moved, renamed } = await promptNamedWithSchemasConflict(\n\t\t\tinput.created,\n\t\t\tinput.deleted,\n\t\t\t'view',\n\t\t);\n\n\t\treturn {\n\t\t\tcreated: created,\n\t\t\tdeleted: deleted,\n\t\t\tmoved: moved,\n\t\t\trenamed: renamed,\n\t\t};\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const mySqlViewsResolver = async (\n\tinput: ResolverInput<ViewSquashed & { schema: '' }>,\n): Promise<ResolverOutputWithMoved<ViewSquashed>> => {\n\ttry {\n\t\tconst { created, deleted, moved, renamed } = await promptNamedWithSchemasConflict(\n\t\t\tinput.created,\n\t\t\tinput.deleted,\n\t\t\t'view',\n\t\t);\n\n\t\treturn {\n\t\t\tcreated: created,\n\t\t\tdeleted: deleted,\n\t\t\tmoved: moved,\n\t\t\trenamed: renamed,\n\t\t};\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\n/* export const singleStoreViewsResolver = async (\n\tinput: ResolverInput<SingleStoreViewSquashed & { schema: '' }>,\n): Promise<ResolverOutputWithMoved<SingleStoreViewSquashed>> => {\n\ttry {\n\t\tconst { created, deleted, moved, renamed } = await promptNamedWithSchemasConflict(\n\t\t\tinput.created,\n\t\t\tinput.deleted,\n\t\t\t'view',\n\t\t);\n\n\t\treturn {\n\t\t\tcreated: created,\n\t\t\tdeleted: deleted,\n\t\t\tmoved: moved,\n\t\t\trenamed: renamed,\n\t\t};\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n}; */\n\nexport const sqliteViewsResolver = async (\n\tinput: ResolverInput<SQLiteView & { schema: '' }>,\n): Promise<ResolverOutputWithMoved<SQLiteView>> => {\n\ttry {\n\t\tconst { created, deleted, moved, renamed } = await promptNamedWithSchemasConflict(\n\t\t\tinput.created,\n\t\t\tinput.deleted,\n\t\t\t'view',\n\t\t);\n\n\t\treturn {\n\t\t\tcreated: created,\n\t\t\tdeleted: deleted,\n\t\t\tmoved: moved,\n\t\t\trenamed: renamed,\n\t\t};\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const sequencesResolver = async (\n\tinput: ResolverInput<Sequence>,\n): Promise<ResolverOutputWithMoved<Sequence>> => {\n\ttry {\n\t\tconst { created, deleted, moved, renamed } = await promptNamedWithSchemasConflict(\n\t\t\tinput.created,\n\t\t\tinput.deleted,\n\t\t\t'sequence',\n\t\t);\n\n\t\treturn {\n\t\t\tcreated: created,\n\t\t\tdeleted: deleted,\n\t\t\tmoved: moved,\n\t\t\trenamed: renamed,\n\t\t};\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const roleResolver = async (\n\tinput: RolesResolverInput<Role>,\n): Promise<RolesResolverOutput<Role>> => {\n\tconst result = await promptNamedConflict(\n\t\tinput.created,\n\t\tinput.deleted,\n\t\t'role',\n\t);\n\treturn {\n\t\tcreated: result.created,\n\t\tdeleted: result.deleted,\n\t\trenamed: result.renamed,\n\t};\n};\n\nexport const policyResolver = async (\n\tinput: TablePolicyResolverInput<Policy>,\n): Promise<TablePolicyResolverOutput<Policy>> => {\n\tconst result = await promptColumnsConflicts(\n\t\tinput.tableName,\n\t\tinput.created,\n\t\tinput.deleted,\n\t);\n\treturn {\n\t\ttableName: input.tableName,\n\t\tschema: input.schema,\n\t\tcreated: result.created,\n\t\tdeleted: result.deleted,\n\t\trenamed: result.renamed,\n\t};\n};\n\nexport const indPolicyResolver = async (\n\tinput: PolicyResolverInput<Policy>,\n): Promise<PolicyResolverOutput<Policy>> => {\n\tconst result = await promptNamedConflict(\n\t\tinput.created,\n\t\tinput.deleted,\n\t\t'policy',\n\t);\n\treturn {\n\t\tcreated: result.created,\n\t\tdeleted: result.deleted,\n\t\trenamed: result.renamed,\n\t};\n};\n\nexport const enumsResolver = async (\n\tinput: ResolverInput<Enum>,\n): Promise<ResolverOutputWithMoved<Enum>> => {\n\ttry {\n\t\tconst { created, deleted, moved, renamed } = await promptNamedWithSchemasConflict(\n\t\t\tinput.created,\n\t\t\tinput.deleted,\n\t\t\t'enum',\n\t\t);\n\n\t\treturn {\n\t\t\tcreated: created,\n\t\t\tdeleted: deleted,\n\t\t\tmoved: moved,\n\t\t\trenamed: renamed,\n\t\t};\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const columnsResolver = async (\n\tinput: ColumnsResolverInput<Column>,\n): Promise<ColumnsResolverOutput<Column>> => {\n\tconst result = await promptColumnsConflicts(\n\t\tinput.tableName,\n\t\tinput.created,\n\t\tinput.deleted,\n\t);\n\treturn {\n\t\ttableName: input.tableName,\n\t\tschema: input.schema,\n\t\tcreated: result.created,\n\t\tdeleted: result.deleted,\n\t\trenamed: result.renamed,\n\t};\n};\n\nexport const prepareAndMigratePg = async (config: GenerateConfig) => {\n\tconst outFolder = config.out;\n\tconst schemaPath = config.schema;\n\tconst casing = config.casing;\n\n\ttry {\n\t\tassertV1OutFolder(outFolder);\n\n\t\tconst { snapshots, journal } = prepareMigrationFolder(\n\t\t\toutFolder,\n\t\t\t'postgresql',\n\t\t);\n\n\t\tconst { prev, cur, custom } = await preparePgMigrationSnapshot(\n\t\t\tsnapshots,\n\t\t\tschemaPath,\n\t\t\tcasing,\n\t\t);\n\n\t\tconst validatedPrev = pgSchema.parse(prev);\n\t\tconst validatedCur = pgSchema.parse(cur);\n\n\t\tif (config.custom) {\n\t\t\twriteResult({\n\t\t\t\tcur: custom,\n\t\t\t\tsqlStatements: [],\n\t\t\t\tjournal,\n\t\t\t\toutFolder,\n\t\t\t\tname: config.name,\n\t\t\t\tbreakpoints: config.breakpoints,\n\t\t\t\ttype: 'custom',\n\t\t\t\tprefixMode: config.prefix,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst squashedPrev = squashPgScheme(validatedPrev);\n\t\tconst squashedCur = squashPgScheme(validatedCur);\n\n\t\tconst { sqlStatements, _meta } = await applyPgSnapshotsDiff(\n\t\t\tsquashedPrev,\n\t\t\tsquashedCur,\n\t\t\tschemasResolver,\n\t\t\tenumsResolver,\n\t\t\tsequencesResolver,\n\t\t\tpolicyResolver,\n\t\t\tindPolicyResolver,\n\t\t\troleResolver,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tviewsResolver,\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\n\t\twriteResult({\n\t\t\tcur,\n\t\t\tsqlStatements,\n\t\t\tjournal,\n\t\t\toutFolder,\n\t\t\tname: config.name,\n\t\t\tbreakpoints: config.breakpoints,\n\t\t\tprefixMode: config.prefix,\n\t\t});\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\n\nexport const prepareAndExportPg = async (config: ExportConfig) => {\n\tconst schemaPath = config.schema;\n\n\ttry {\n\t\tconst { prev, cur } = await preparePgMigrationSnapshot(\n\t\t\t[], // no snapshots before\n\t\t\tschemaPath,\n\t\t\tundefined,\n\t\t);\n\n\t\tconst validatedPrev = pgSchema.parse(prev);\n\t\tconst validatedCur = pgSchema.parse(cur);\n\n\t\tconst squashedPrev = squashPgScheme(validatedPrev);\n\t\tconst squashedCur = squashPgScheme(validatedCur);\n\n\t\tconst { sqlStatements } = await applyPgSnapshotsDiff(\n\t\t\tsquashedPrev,\n\t\t\tsquashedCur,\n\t\t\tschemasResolver,\n\t\t\tenumsResolver,\n\t\t\tsequencesResolver,\n\t\t\tpolicyResolver,\n\t\t\tindPolicyResolver,\n\t\t\troleResolver,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tviewsResolver,\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\n\t\tconsole.log(sqlStatements.join('\\n'));\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\n\nexport const preparePgPush = async (\n\tcur: PgSchema,\n\tprev: PgSchema,\n) => {\n\tconst validatedPrev = pgSchema.parse(prev);\n\tconst validatedCur = pgSchema.parse(cur);\n\n\tconst squashedPrev = squashPgScheme(validatedPrev, 'push');\n\tconst squashedCur = squashPgScheme(validatedCur, 'push');\n\n\tconst { sqlStatements, statements, _meta } = await applyPgSnapshotsDiff(\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\tschemasResolver,\n\t\tenumsResolver,\n\t\tsequencesResolver,\n\t\tpolicyResolver,\n\t\tindPolicyResolver,\n\t\troleResolver,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\tviewsResolver,\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t\t'push',\n\t);\n\n\treturn { sqlStatements, statements, squashedPrev, squashedCur };\n};\n\n// Not needed for now\nfunction mysqlSchemaSuggestions(\n\tcurSchema: TypeOf<typeof mysqlSchema>,\n\tprevSchema: TypeOf<typeof mysqlSchema>,\n) {\n\tconst suggestions: string[] = [];\n\tconst usedSuggestions: string[] = [];\n\tconst suggestionTypes = {\n\t\tserial: withStyle.errorWarning(\n\t\t\t`We deprecated the use of 'serial' for MySQL starting from version 0.20.0. In MySQL, 'serial' is simply an alias for 'bigint unsigned not null auto_increment unique,' which creates all constraints and indexes for you. This may make the process less explicit for both users and drizzle-kit push commands`,\n\t\t),\n\t};\n\n\tfor (const table of Object.values(curSchema.tables)) {\n\t\tfor (const column of Object.values(table.columns)) {\n\t\t\tif (column.type === 'serial') {\n\t\t\t\tif (!usedSuggestions.includes('serial')) {\n\t\t\t\t\tsuggestions.push(suggestionTypes['serial']);\n\t\t\t\t}\n\n\t\t\t\tconst uniqueForSerial = Object.values(\n\t\t\t\t\tprevSchema.tables[table.name].uniqueConstraints,\n\t\t\t\t).find((it) => it.columns[0] === column.name);\n\n\t\t\t\tsuggestions.push(\n\t\t\t\t\t`\\n`\n\t\t\t\t\t\t+ withStyle.suggestion(\n\t\t\t\t\t\t\t`We are suggesting to change ${\n\t\t\t\t\t\t\t\tchalk.blue(\n\t\t\t\t\t\t\t\t\tcolumn.name,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} column in ${\n\t\t\t\t\t\t\t\tchalk.blueBright(\n\t\t\t\t\t\t\t\t\ttable.name,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} table from serial to bigint unsigned\\n\\n${\n\t\t\t\t\t\t\t\tchalk.blueBright(\n\t\t\t\t\t\t\t\t\t`bigint(\"${column.name}\", { mode: \"number\", unsigned: true }).notNull().autoincrement().unique(${\n\t\t\t\t\t\t\t\t\t\tuniqueForSerial?.name ? `\"${uniqueForSerial?.name}\"` : ''\n\t\t\t\t\t\t\t\t\t})`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn suggestions;\n}\n\n// Intersect with prepareAnMigrate\nexport const prepareMySQLPush = async (\n\tschemaPath: string | string[],\n\tsnapshot: MySqlSchema,\n\tcasing: CasingType | undefined,\n) => {\n\ttry {\n\t\tconst { prev, cur } = await prepareMySqlDbPushSnapshot(\n\t\t\tsnapshot,\n\t\t\tschemaPath,\n\t\t\tcasing,\n\t\t);\n\n\t\tconst validatedPrev = mysqlSchema.parse(prev);\n\t\tconst validatedCur = mysqlSchema.parse(cur);\n\n\t\tconst squashedPrev = squashMysqlScheme(validatedPrev);\n\t\tconst squashedCur = squashMysqlScheme(validatedCur);\n\n\t\tconst { sqlStatements, statements } = await applyMysqlSnapshotsDiff(\n\t\t\tsquashedPrev,\n\t\t\tsquashedCur,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tmySqlViewsResolver,\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t\t'push',\n\t\t);\n\n\t\treturn { sqlStatements, statements, validatedCur, validatedPrev };\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tprocess.exit(1);\n\t}\n};\n\nexport const prepareAndMigrateMysql = async (config: GenerateConfig) => {\n\tconst outFolder = config.out;\n\tconst schemaPath = config.schema;\n\tconst casing = config.casing;\n\n\ttry {\n\t\t// TODO: remove\n\t\tassertV1OutFolder(outFolder);\n\n\t\tconst { snapshots, journal } = prepareMigrationFolder(outFolder, 'mysql');\n\t\tconst { prev, cur, custom } = await prepareMySqlMigrationSnapshot(\n\t\t\tsnapshots,\n\t\t\tschemaPath,\n\t\t\tcasing,\n\t\t);\n\n\t\tconst validatedPrev = mysqlSchema.parse(prev);\n\t\tconst validatedCur = mysqlSchema.parse(cur);\n\n\t\tif (config.custom) {\n\t\t\twriteResult({\n\t\t\t\tcur: custom,\n\t\t\t\tsqlStatements: [],\n\t\t\t\tjournal,\n\t\t\t\toutFolder,\n\t\t\t\tname: config.name,\n\t\t\t\tbreakpoints: config.breakpoints,\n\t\t\t\ttype: 'custom',\n\t\t\t\tprefixMode: config.prefix,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst squashedPrev = squashMysqlScheme(validatedPrev);\n\t\tconst squashedCur = squashMysqlScheme(validatedCur);\n\n\t\tconst { sqlStatements, statements, _meta } = await applyMysqlSnapshotsDiff(\n\t\t\tsquashedPrev,\n\t\t\tsquashedCur,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tmySqlViewsResolver,\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\n\t\twriteResult({\n\t\t\tcur,\n\t\t\tsqlStatements,\n\t\t\tjournal,\n\t\t\t_meta,\n\t\t\toutFolder,\n\t\t\tname: config.name,\n\t\t\tbreakpoints: config.breakpoints,\n\t\t\tprefixMode: config.prefix,\n\t\t});\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\n\n// Not needed for now\nfunction singleStoreSchemaSuggestions(\n\tcurSchema: TypeOf<typeof singlestoreSchema>,\n\tprevSchema: TypeOf<typeof singlestoreSchema>,\n) {\n\tconst suggestions: string[] = [];\n\tconst usedSuggestions: string[] = [];\n\tconst suggestionTypes = {\n\t\t// TODO: Check if SingleStore has serial type\n\t\tserial: withStyle.errorWarning(\n\t\t\t`We deprecated the use of 'serial' for SingleStore starting from version 0.20.0. In SingleStore, 'serial' is simply an alias for 'bigint unsigned not null auto_increment unique,' which creates all constraints and indexes for you. This may make the process less explicit for both users and drizzle-kit push commands`,\n\t\t),\n\t};\n\n\tfor (const table of Object.values(curSchema.tables)) {\n\t\tfor (const column of Object.values(table.columns)) {\n\t\t\tif (column.type === 'serial') {\n\t\t\t\tif (!usedSuggestions.includes('serial')) {\n\t\t\t\t\tsuggestions.push(suggestionTypes['serial']);\n\t\t\t\t}\n\n\t\t\t\tconst uniqueForSerial = Object.values(\n\t\t\t\t\tprevSchema.tables[table.name].uniqueConstraints,\n\t\t\t\t).find((it) => it.columns[0] === column.name);\n\n\t\t\t\tsuggestions.push(\n\t\t\t\t\t`\\n`\n\t\t\t\t\t\t+ withStyle.suggestion(\n\t\t\t\t\t\t\t`We are suggesting to change ${\n\t\t\t\t\t\t\t\tchalk.blue(\n\t\t\t\t\t\t\t\t\tcolumn.name,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} column in ${\n\t\t\t\t\t\t\t\tchalk.blueBright(\n\t\t\t\t\t\t\t\t\ttable.name,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} table from serial to bigint unsigned\\n\\n${\n\t\t\t\t\t\t\t\tchalk.blueBright(\n\t\t\t\t\t\t\t\t\t`bigint(\"${column.name}\", { mode: \"number\", unsigned: true }).notNull().autoincrement().unique(${\n\t\t\t\t\t\t\t\t\t\tuniqueForSerial?.name ? `\"${uniqueForSerial?.name}\"` : ''\n\t\t\t\t\t\t\t\t\t})`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn suggestions;\n}\n\n// Intersect with prepareAnMigrate\nexport const prepareSingleStorePush = async (\n\tschemaPath: string | string[],\n\tsnapshot: SingleStoreSchema,\n\tcasing: CasingType | undefined,\n) => {\n\ttry {\n\t\tconst { prev, cur } = await prepareSingleStoreDbPushSnapshot(\n\t\t\tsnapshot,\n\t\t\tschemaPath,\n\t\t\tcasing,\n\t\t);\n\n\t\tconst validatedPrev = singlestoreSchema.parse(prev);\n\t\tconst validatedCur = singlestoreSchema.parse(cur);\n\n\t\tconst squashedPrev = squashSingleStoreScheme(validatedPrev);\n\t\tconst squashedCur = squashSingleStoreScheme(validatedCur);\n\n\t\tconst { sqlStatements, statements } = await applySingleStoreSnapshotsDiff(\n\t\t\tsquashedPrev,\n\t\t\tsquashedCur,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\t/* singleStoreViewsResolver, */\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t\t'push',\n\t\t);\n\n\t\treturn { sqlStatements, statements, validatedCur, validatedPrev };\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tprocess.exit(1);\n\t}\n};\n\nexport const prepareAndMigrateSingleStore = async (config: GenerateConfig) => {\n\tconst outFolder = config.out;\n\tconst schemaPath = config.schema;\n\tconst casing = config.casing;\n\n\ttry {\n\t\t// TODO: remove\n\t\tassertV1OutFolder(outFolder);\n\n\t\tconst { snapshots, journal } = prepareMigrationFolder(outFolder, 'singlestore');\n\t\tconst { prev, cur, custom } = await prepareSingleStoreMigrationSnapshot(\n\t\t\tsnapshots,\n\t\t\tschemaPath,\n\t\t\tcasing,\n\t\t);\n\n\t\tconst validatedPrev = singlestoreSchema.parse(prev);\n\t\tconst validatedCur = singlestoreSchema.parse(cur);\n\n\t\tif (config.custom) {\n\t\t\twriteResult({\n\t\t\t\tcur: custom,\n\t\t\t\tsqlStatements: [],\n\t\t\t\tjournal,\n\t\t\t\toutFolder,\n\t\t\t\tname: config.name,\n\t\t\t\tbreakpoints: config.breakpoints,\n\t\t\t\ttype: 'custom',\n\t\t\t\tprefixMode: config.prefix,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst squashedPrev = squashSingleStoreScheme(validatedPrev);\n\t\tconst squashedCur = squashSingleStoreScheme(validatedCur);\n\n\t\tconst { sqlStatements, _meta } = await applySingleStoreSnapshotsDiff(\n\t\t\tsquashedPrev,\n\t\t\tsquashedCur,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\t/* singleStoreViewsResolver, */\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\n\t\twriteResult({\n\t\t\tcur,\n\t\t\tsqlStatements,\n\t\t\tjournal,\n\t\t\t_meta,\n\t\t\toutFolder,\n\t\t\tname: config.name,\n\t\t\tbreakpoints: config.breakpoints,\n\t\t\tprefixMode: config.prefix,\n\t\t});\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\n\nexport const prepareAndExportSinglestore = async (config: ExportConfig) => {\n\tconst schemaPath = config.schema;\n\n\ttry {\n\t\tconst { prev, cur } = await prepareSingleStoreMigrationSnapshot(\n\t\t\t[],\n\t\t\tschemaPath,\n\t\t\tundefined,\n\t\t);\n\n\t\tconst validatedPrev = singlestoreSchema.parse(prev);\n\t\tconst validatedCur = singlestoreSchema.parse(cur);\n\n\t\tconst squashedPrev = squashSingleStoreScheme(validatedPrev);\n\t\tconst squashedCur = squashSingleStoreScheme(validatedCur);\n\n\t\tconst { sqlStatements, _meta } = await applySingleStoreSnapshotsDiff(\n\t\t\tsquashedPrev,\n\t\t\tsquashedCur,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\t/* singleStoreViewsResolver, */\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\n\t\tconsole.log(sqlStatements.join('\\n'));\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\n\nexport const prepareAndExportMysql = async (config: ExportConfig) => {\n\tconst schemaPath = config.schema;\n\n\ttry {\n\t\tconst { prev, cur, custom } = await prepareMySqlMigrationSnapshot(\n\t\t\t[],\n\t\t\tschemaPath,\n\t\t\tundefined,\n\t\t);\n\n\t\tconst validatedPrev = mysqlSchema.parse(prev);\n\t\tconst validatedCur = mysqlSchema.parse(cur);\n\n\t\tconst squashedPrev = squashMysqlScheme(validatedPrev);\n\t\tconst squashedCur = squashMysqlScheme(validatedCur);\n\n\t\tconst { sqlStatements, statements, _meta } = await applyMysqlSnapshotsDiff(\n\t\t\tsquashedPrev,\n\t\t\tsquashedCur,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tmySqlViewsResolver,\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\n\t\tconsole.log(sqlStatements.join('\\n'));\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\n\nexport const prepareAndMigrateSqlite = async (config: GenerateConfig) => {\n\tconst outFolder = config.out;\n\tconst schemaPath = config.schema;\n\tconst casing = config.casing;\n\n\ttry {\n\t\tassertV1OutFolder(outFolder);\n\n\t\tconst { snapshots, journal } = prepareMigrationFolder(outFolder, 'sqlite');\n\t\tconst { prev, cur, custom } = await prepareSqliteMigrationSnapshot(\n\t\t\tsnapshots,\n\t\t\tschemaPath,\n\t\t\tcasing,\n\t\t);\n\n\t\tconst validatedPrev = sqliteSchema.parse(prev);\n\t\tconst validatedCur = sqliteSchema.parse(cur);\n\n\t\tif (config.custom) {\n\t\t\twriteResult({\n\t\t\t\tcur: custom,\n\t\t\t\tsqlStatements: [],\n\t\t\t\tjournal,\n\t\t\t\toutFolder,\n\t\t\t\tname: config.name,\n\t\t\t\tbreakpoints: config.breakpoints,\n\t\t\t\tbundle: config.bundle,\n\t\t\t\ttype: 'custom',\n\t\t\t\tprefixMode: config.prefix,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst squashedPrev = squashSqliteScheme(validatedPrev);\n\t\tconst squashedCur = squashSqliteScheme(validatedCur);\n\n\t\tconst { sqlStatements, _meta } = await applySqliteSnapshotsDiff(\n\t\t\tsquashedPrev,\n\t\t\tsquashedCur,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tsqliteViewsResolver,\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\n\t\twriteResult({\n\t\t\tcur,\n\t\t\tsqlStatements,\n\t\t\tjournal,\n\t\t\t_meta,\n\t\t\toutFolder,\n\t\t\tname: config.name,\n\t\t\tbreakpoints: config.breakpoints,\n\t\t\tbundle: config.bundle,\n\t\t\tprefixMode: config.prefix,\n\t\t\tdriver: config.driver,\n\t\t});\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\n\nexport const prepareAndExportSqlite = async (config: ExportConfig) => {\n\tconst schemaPath = config.schema;\n\n\ttry {\n\t\tconst { prev, cur } = await prepareSqliteMigrationSnapshot(\n\t\t\t[],\n\t\t\tschemaPath,\n\t\t\tundefined,\n\t\t);\n\n\t\tconst validatedPrev = sqliteSchema.parse(prev);\n\t\tconst validatedCur = sqliteSchema.parse(cur);\n\n\t\tconst squashedPrev = squashSqliteScheme(validatedPrev);\n\t\tconst squashedCur = squashSqliteScheme(validatedCur);\n\n\t\tconst { sqlStatements, _meta } = await applySqliteSnapshotsDiff(\n\t\t\tsquashedPrev,\n\t\t\tsquashedCur,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tsqliteViewsResolver,\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\n\t\tconsole.log(sqlStatements.join('\\n'));\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\n\nexport const prepareAndMigrateLibSQL = async (config: GenerateConfig) => {\n\tconst outFolder = config.out;\n\tconst schemaPath = config.schema;\n\tconst casing = config.casing;\n\n\ttry {\n\t\tassertV1OutFolder(outFolder);\n\n\t\tconst { snapshots, journal } = prepareMigrationFolder(outFolder, 'sqlite');\n\t\tconst { prev, cur, custom } = await prepareSqliteMigrationSnapshot(\n\t\t\tsnapshots,\n\t\t\tschemaPath,\n\t\t\tcasing,\n\t\t);\n\n\t\tconst validatedPrev = sqliteSchema.parse(prev);\n\t\tconst validatedCur = sqliteSchema.parse(cur);\n\n\t\tif (config.custom) {\n\t\t\twriteResult({\n\t\t\t\tcur: custom,\n\t\t\t\tsqlStatements: [],\n\t\t\t\tjournal,\n\t\t\t\toutFolder,\n\t\t\t\tname: config.name,\n\t\t\t\tbreakpoints: config.breakpoints,\n\t\t\t\tbundle: config.bundle,\n\t\t\t\ttype: 'custom',\n\t\t\t\tprefixMode: config.prefix,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst squashedPrev = squashSqliteScheme(validatedPrev);\n\t\tconst squashedCur = squashSqliteScheme(validatedCur);\n\n\t\tconst { sqlStatements, _meta } = await applyLibSQLSnapshotsDiff(\n\t\t\tsquashedPrev,\n\t\t\tsquashedCur,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tsqliteViewsResolver,\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\n\t\twriteResult({\n\t\t\tcur,\n\t\t\tsqlStatements,\n\t\t\tjournal,\n\t\t\t_meta,\n\t\t\toutFolder,\n\t\t\tname: config.name,\n\t\t\tbreakpoints: config.breakpoints,\n\t\t\tbundle: config.bundle,\n\t\t\tprefixMode: config.prefix,\n\t\t});\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\n\nexport const prepareAndExportLibSQL = async (config: ExportConfig) => {\n\tconst schemaPath = config.schema;\n\n\ttry {\n\t\tconst { prev, cur, custom } = await prepareSqliteMigrationSnapshot(\n\t\t\t[],\n\t\t\tschemaPath,\n\t\t\tundefined,\n\t\t);\n\n\t\tconst validatedPrev = sqliteSchema.parse(prev);\n\t\tconst validatedCur = sqliteSchema.parse(cur);\n\n\t\tconst squashedPrev = squashSqliteScheme(validatedPrev);\n\t\tconst squashedCur = squashSqliteScheme(validatedCur);\n\n\t\tconst { sqlStatements, _meta } = await applyLibSQLSnapshotsDiff(\n\t\t\tsquashedPrev,\n\t\t\tsquashedCur,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tsqliteViewsResolver,\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\n\t\tconsole.log(sqlStatements.join('\\n'));\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\n\nexport const prepareSQLitePush = async (\n\tschemaPath: string | string[],\n\tsnapshot: SQLiteSchema,\n\tcasing: CasingType | undefined,\n) => {\n\tconst { prev, cur } = await prepareSQLiteDbPushSnapshot(snapshot, schemaPath, casing);\n\n\tconst validatedPrev = sqliteSchema.parse(prev);\n\tconst validatedCur = sqliteSchema.parse(cur);\n\n\tconst squashedPrev = squashSqliteScheme(validatedPrev, 'push');\n\tconst squashedCur = squashSqliteScheme(validatedCur, 'push');\n\n\tconst { sqlStatements, statements, _meta } = await applySqliteSnapshotsDiff(\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\tsqliteViewsResolver,\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t\t'push',\n\t);\n\n\treturn {\n\t\tsqlStatements,\n\t\tstatements,\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\tmeta: _meta,\n\t};\n};\n\nexport const prepareLibSQLPush = async (\n\tschemaPath: string | string[],\n\tsnapshot: SQLiteSchema,\n\tcasing: CasingType | undefined,\n) => {\n\tconst { prev, cur } = await prepareSQLiteDbPushSnapshot(snapshot, schemaPath, casing);\n\n\tconst validatedPrev = sqliteSchema.parse(prev);\n\tconst validatedCur = sqliteSchema.parse(cur);\n\n\tconst squashedPrev = squashSqliteScheme(validatedPrev, 'push');\n\tconst squashedCur = squashSqliteScheme(validatedCur, 'push');\n\n\tconst { sqlStatements, statements, _meta } = await applyLibSQLSnapshotsDiff(\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\tsqliteViewsResolver,\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t\t'push',\n\t);\n\n\treturn {\n\t\tsqlStatements,\n\t\tstatements,\n\t\tsquashedPrev,\n\t\tsquashedCur,\n\t\tmeta: _meta,\n\t};\n};\n\nconst freeeeeeze = (obj: any) => {\n\tObject.freeze(obj);\n\tfor (let key in obj) {\n\t\tif (obj.hasOwnProperty(key) && typeof obj[key] === 'object') {\n\t\t\tfreeeeeeze(obj[key]);\n\t\t}\n\t}\n};\n\nexport const promptColumnsConflicts = async <T extends Named>(\n\ttableName: string,\n\tnewColumns: T[],\n\tmissingColumns: T[],\n) => {\n\tif (newColumns.length === 0 || missingColumns.length === 0) {\n\t\treturn { created: newColumns, renamed: [], deleted: missingColumns };\n\t}\n\tconst result: { created: T[]; renamed: { from: T; to: T }[]; deleted: T[] } = {\n\t\tcreated: [],\n\t\trenamed: [],\n\t\tdeleted: [],\n\t};\n\n\tlet index = 0;\n\tlet leftMissing = [...missingColumns];\n\n\tdo {\n\t\tconst created = newColumns[index];\n\n\t\tconst renames: RenamePropmtItem<T>[] = leftMissing.map((it) => {\n\t\t\treturn { from: it, to: created };\n\t\t});\n\n\t\tconst promptData: (RenamePropmtItem<T> | T)[] = [created, ...renames];\n\n\t\tconst { status, data } = await render(\n\t\t\tnew ResolveColumnSelect<T>(tableName, created, promptData),\n\t\t);\n\t\tif (status === 'aborted') {\n\t\t\tconsole.error('ERROR');\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (isRenamePromptItem(data)) {\n\t\t\tconsole.log(\n\t\t\t\t`${chalk.yellow('~')} ${data.from.name} › ${data.to.name} ${\n\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t'column will be renamed',\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tresult.renamed.push(data);\n\t\t\t// this will make [item1, undefined, item2]\n\t\t\tdelete leftMissing[leftMissing.indexOf(data.from)];\n\t\t\t// this will make [item1, item2]\n\t\t\tleftMissing = leftMissing.filter(Boolean);\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t`${chalk.green('+')} ${data.name} ${\n\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t'column will be created',\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tresult.created.push(created);\n\t\t}\n\t\tindex += 1;\n\t} while (index < newColumns.length);\n\tconsole.log(\n\t\tchalk.gray(`--- all columns conflicts in ${tableName} table resolved ---\\n`),\n\t);\n\n\tresult.deleted.push(...leftMissing);\n\treturn result;\n};\n\nexport const promptNamedConflict = async <T extends Named>(\n\tnewItems: T[],\n\tmissingItems: T[],\n\tentity: 'role' | 'policy',\n): Promise<{\n\tcreated: T[];\n\trenamed: { from: T; to: T }[];\n\tdeleted: T[];\n}> => {\n\tif (missingItems.length === 0 || newItems.length === 0) {\n\t\treturn {\n\t\t\tcreated: newItems,\n\t\t\trenamed: [],\n\t\t\tdeleted: missingItems,\n\t\t};\n\t}\n\n\tconst result: {\n\t\tcreated: T[];\n\t\trenamed: { from: T; to: T }[];\n\t\tdeleted: T[];\n\t} = { created: [], renamed: [], deleted: [] };\n\tlet index = 0;\n\tlet leftMissing = [...missingItems];\n\tdo {\n\t\tconst created = newItems[index];\n\t\tconst renames: RenamePropmtItem<T>[] = leftMissing.map((it) => {\n\t\t\treturn { from: it, to: created };\n\t\t});\n\n\t\tconst promptData: (RenamePropmtItem<T> | T)[] = [created, ...renames];\n\n\t\tconst { status, data } = await render(\n\t\t\tnew ResolveSelectNamed<T>(created, promptData, entity),\n\t\t);\n\t\tif (status === 'aborted') {\n\t\t\tconsole.error('ERROR');\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (isRenamePromptItem(data)) {\n\t\t\tconsole.log(\n\t\t\t\t`${chalk.yellow('~')} ${data.from.name} › ${data.to.name} ${\n\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t`${entity} will be renamed/moved`,\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\n\t\t\tif (data.from.name !== data.to.name) {\n\t\t\t\tresult.renamed.push(data);\n\t\t\t}\n\n\t\t\tdelete leftMissing[leftMissing.indexOf(data.from)];\n\t\t\tleftMissing = leftMissing.filter(Boolean);\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t`${chalk.green('+')} ${data.name} ${\n\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t`${entity} will be created`,\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tresult.created.push(created);\n\t\t}\n\t\tindex += 1;\n\t} while (index < newItems.length);\n\tconsole.log(chalk.gray(`--- all ${entity} conflicts resolved ---\\n`));\n\tresult.deleted.push(...leftMissing);\n\treturn result;\n};\n\nexport const promptNamedWithSchemasConflict = async <T extends NamedWithSchema>(\n\tnewItems: T[],\n\tmissingItems: T[],\n\tentity: 'table' | 'enum' | 'sequence' | 'view',\n): Promise<{\n\tcreated: T[];\n\trenamed: { from: T; to: T }[];\n\tmoved: { name: string; schemaFrom: string; schemaTo: string }[];\n\tdeleted: T[];\n}> => {\n\tif (missingItems.length === 0 || newItems.length === 0) {\n\t\treturn {\n\t\t\tcreated: newItems,\n\t\t\trenamed: [],\n\t\t\tmoved: [],\n\t\t\tdeleted: missingItems,\n\t\t};\n\t}\n\n\tconst result: {\n\t\tcreated: T[];\n\t\trenamed: { from: T; to: T }[];\n\t\tmoved: { name: string; schemaFrom: string; schemaTo: string }[];\n\t\tdeleted: T[];\n\t} = { created: [], renamed: [], moved: [], deleted: [] };\n\tlet index = 0;\n\tlet leftMissing = [...missingItems];\n\tdo {\n\t\tconst created = newItems[index];\n\t\tconst renames: RenamePropmtItem<T>[] = leftMissing.map((it) => {\n\t\t\treturn { from: it, to: created };\n\t\t});\n\n\t\tconst promptData: (RenamePropmtItem<T> | T)[] = [created, ...renames];\n\n\t\tconst { status, data } = await render(\n\t\t\tnew ResolveSelect<T>(created, promptData, entity),\n\t\t);\n\t\tif (status === 'aborted') {\n\t\t\tconsole.error('ERROR');\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (isRenamePromptItem(data)) {\n\t\t\tconst schemaFromPrefix = !data.from.schema || data.from.schema === 'public'\n\t\t\t\t? ''\n\t\t\t\t: `${data.from.schema}.`;\n\t\t\tconst schemaToPrefix = !data.to.schema || data.to.schema === 'public'\n\t\t\t\t? ''\n\t\t\t\t: `${data.to.schema}.`;\n\n\t\t\tconsole.log(\n\t\t\t\t`${chalk.yellow('~')} ${schemaFromPrefix}${data.from.name} › ${schemaToPrefix}${data.to.name} ${\n\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t`${entity} will be renamed/moved`,\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\n\t\t\tif (data.from.name !== data.to.name) {\n\t\t\t\tresult.renamed.push(data);\n\t\t\t}\n\n\t\t\tif (data.from.schema !== data.to.schema) {\n\t\t\t\tresult.moved.push({\n\t\t\t\t\tname: data.from.name,\n\t\t\t\t\tschemaFrom: data.from.schema || 'public',\n\t\t\t\t\tschemaTo: data.to.schema || 'public',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tdelete leftMissing[leftMissing.indexOf(data.from)];\n\t\t\tleftMissing = leftMissing.filter(Boolean);\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t`${chalk.green('+')} ${data.name} ${\n\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t`${entity} will be created`,\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tresult.created.push(created);\n\t\t}\n\t\tindex += 1;\n\t} while (index < newItems.length);\n\tconsole.log(chalk.gray(`--- all ${entity} conflicts resolved ---\\n`));\n\tresult.deleted.push(...leftMissing);\n\treturn result;\n};\n\nexport const promptSchemasConflict = async <T extends Named>(\n\tnewSchemas: T[],\n\tmissingSchemas: T[],\n): Promise<{ created: T[]; renamed: { from: T; to: T }[]; deleted: T[] }> => {\n\tif (missingSchemas.length === 0 || newSchemas.length === 0) {\n\t\treturn { created: newSchemas, renamed: [], deleted: missingSchemas };\n\t}\n\n\tconst result: { created: T[]; renamed: { from: T; to: T }[]; deleted: T[] } = {\n\t\tcreated: [],\n\t\trenamed: [],\n\t\tdeleted: [],\n\t};\n\tlet index = 0;\n\tlet leftMissing = [...missingSchemas];\n\tdo {\n\t\tconst created = newSchemas[index];\n\t\tconst renames: RenamePropmtItem<T>[] = leftMissing.map((it) => {\n\t\t\treturn { from: it, to: created };\n\t\t});\n\n\t\tconst promptData: (RenamePropmtItem<T> | T)[] = [created, ...renames];\n\n\t\tconst { status, data } = await render(\n\t\t\tnew ResolveSchemasSelect<T>(created, promptData),\n\t\t);\n\t\tif (status === 'aborted') {\n\t\t\tconsole.error('ERROR');\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (isRenamePromptItem(data)) {\n\t\t\tconsole.log(\n\t\t\t\t`${chalk.yellow('~')} ${data.from.name} › ${data.to.name} ${\n\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t'schema will be renamed',\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tresult.renamed.push(data);\n\t\t\tdelete leftMissing[leftMissing.indexOf(data.from)];\n\t\t\tleftMissing = leftMissing.filter(Boolean);\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t`${chalk.green('+')} ${data.name} ${\n\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t'schema will be created',\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tresult.created.push(created);\n\t\t}\n\t\tindex += 1;\n\t} while (index < newSchemas.length);\n\tconsole.log(chalk.gray('--- all schemas conflicts resolved ---\\n'));\n\tresult.deleted.push(...leftMissing);\n\treturn result;\n};\n\nexport const BREAKPOINT = '--> statement-breakpoint\\n';\n\nexport const writeResult = ({\n\tcur,\n\tsqlStatements,\n\tjournal,\n\t_meta = {\n\t\tcolumns: {},\n\t\tschemas: {},\n\t\ttables: {},\n\t},\n\toutFolder,\n\tbreakpoints,\n\tname,\n\tbundle = false,\n\ttype = 'none',\n\tprefixMode,\n\tdriver,\n}: {\n\tcur: CommonSchema;\n\tsqlStatements: string[];\n\tjournal: Journal;\n\t_meta?: any;\n\toutFolder: string;\n\tbreakpoints: boolean;\n\tprefixMode: Prefix;\n\tname?: string;\n\tbundle?: boolean;\n\ttype?: 'introspect' | 'custom' | 'none';\n\tdriver?: Driver;\n}) => {\n\tif (type === 'none') {\n\t\tconsole.log(schema(cur));\n\n\t\tif (sqlStatements.length === 0) {\n\t\t\tconsole.log('No schema changes, nothing to migrate 😴');\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// append entry to _migrations.json\n\t// append entry to _journal.json->entries\n\t// dialect in _journal.json\n\t// append sql file to out folder\n\t// append snapshot file to meta folder\n\tconst lastEntryInJournal = journal.entries[journal.entries.length - 1];\n\tconst idx = typeof lastEntryInJournal === 'undefined' ? 0 : lastEntryInJournal.idx + 1;\n\n\tconst { prefix, tag } = prepareMigrationMetadata(idx, prefixMode, name);\n\n\tconst toSave = JSON.parse(JSON.stringify(cur));\n\ttoSave['_meta'] = _meta;\n\n\t// todo: save results to a new migration folder\n\tconst metaFolderPath = join(outFolder, 'meta');\n\tconst metaJournal = join(metaFolderPath, '_journal.json');\n\n\tfs.writeFileSync(\n\t\tjoin(metaFolderPath, `${prefix}_snapshot.json`),\n\t\tJSON.stringify(toSave, null, 2),\n\t);\n\n\tconst sqlDelimiter = breakpoints ? BREAKPOINT : '\\n';\n\tlet sql = sqlStatements.join(sqlDelimiter);\n\n\tif (type === 'introspect') {\n\t\tsql =\n\t\t\t`-- Current sql file was generated after introspecting the database\\n-- If you want to run this migration please uncomment this code before executing migrations\\n/*\\n${sql}\\n*/`;\n\t}\n\n\tif (type === 'custom') {\n\t\tconsole.log('Prepared empty file for your custom SQL migration!');\n\t\tsql = '-- Custom SQL migration file, put your code below! --';\n\t}\n\n\tjournal.entries.push({\n\t\tidx,\n\t\tversion: cur.version,\n\t\twhen: +new Date(),\n\t\ttag,\n\t\tbreakpoints: breakpoints,\n\t});\n\n\tfs.writeFileSync(metaJournal, JSON.stringify(journal, null, 2));\n\n\tfs.writeFileSync(`${outFolder}/${tag}.sql`, sql);\n\n\t// js file with .sql imports for React Native / Expo and Durable Sqlite Objects\n\tif (bundle) {\n\t\tconst js = embeddedMigrations(journal, driver);\n\t\tfs.writeFileSync(`${outFolder}/migrations.js`, js);\n\t}\n\n\trender(\n\t\t`[${\n\t\t\tchalk.green(\n\t\t\t\t'✓',\n\t\t\t)\n\t\t}] Your SQL migration file ➜ ${\n\t\t\tchalk.bold.underline.blue(\n\t\t\t\tpath.join(`${outFolder}/${tag}.sql`),\n\t\t\t)\n\t\t} 🚀`,\n\t);\n};\n\nexport const embeddedMigrations = (journal: Journal, driver?: Driver) => {\n\tlet content = driver === 'expo'\n\t\t? '// This file is required for Expo/React Native SQLite migrations - https://orm.drizzle.team/quick-sqlite/expo\\n\\n'\n\t\t: '';\n\n\tcontent += \"import journal from './meta/_journal.json';\\n\";\n\tjournal.entries.forEach((entry) => {\n\t\tcontent += `import m${entry.idx.toString().padStart(4, '0')} from './${entry.tag}.sql';\\n`;\n\t});\n\n\tcontent += `\n  export default {\n    journal,\n    migrations: {\n      ${\n\t\tjournal.entries\n\t\t\t.map((it) => `m${it.idx.toString().padStart(4, '0')}`)\n\t\t\t.join(',\\n')\n\t}\n    }\n  }\n  `;\n\treturn content;\n};\n\nexport const prepareSnapshotFolderName = () => {\n\tconst now = new Date();\n\treturn `${now.getFullYear()}${two(now.getUTCMonth() + 1)}${\n\t\ttwo(\n\t\t\tnow.getUTCDate(),\n\t\t)\n\t}${two(now.getUTCHours())}${two(now.getUTCMinutes())}${\n\t\ttwo(\n\t\t\tnow.getUTCSeconds(),\n\t\t)\n\t}`;\n};\n\nconst two = (input: number): string => {\n\treturn input.toString().padStart(2, '0');\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/mysqlIntrospect.ts",
    "content": "import { renderWithTask } from 'hanji';\nimport { Minimatch } from 'minimatch';\nimport { originUUID } from '../../global';\nimport type { MySqlSchema } from '../../serializer/mysqlSchema';\nimport { fromDatabase } from '../../serializer/mysqlSerializer';\nimport type { DB } from '../../utils';\nimport { ProgressView } from '../views';\n\nexport const mysqlPushIntrospect = async (\n\tdb: DB,\n\tdatabaseName: string,\n\tfilters: string[],\n) => {\n\tconst matchers = filters.map((it) => {\n\t\treturn new Minimatch(it);\n\t});\n\n\tconst filter = (tableName: string) => {\n\t\tif (matchers.length === 0) return true;\n\n\t\tlet flags: boolean[] = [];\n\n\t\tfor (let matcher of matchers) {\n\t\t\tif (matcher.negate) {\n\t\t\t\tif (!matcher.match(tableName)) {\n\t\t\t\t\tflags.push(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matcher.match(tableName)) {\n\t\t\t\tflags.push(true);\n\t\t\t}\n\t\t}\n\n\t\tif (flags.length > 0) {\n\t\t\treturn flags.every(Boolean);\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst progress = new ProgressView(\n\t\t'Pulling schema from database...',\n\t\t'Pulling schema from database...',\n\t);\n\tconst res = await renderWithTask(\n\t\tprogress,\n\t\tfromDatabase(db, databaseName, filter),\n\t);\n\n\tconst schema = { id: originUUID, prevId: '', ...res } as MySqlSchema;\n\tconst { internal, ...schemaWithoutInternals } = schema;\n\treturn { schema: schemaWithoutInternals };\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/mysqlPushUtils.ts",
    "content": "import chalk from 'chalk';\nimport { render } from 'hanji';\nimport { TypeOf } from 'zod';\nimport { JsonAlterColumnTypeStatement, JsonStatement } from '../../jsonStatements';\nimport { mysqlSchema, MySqlSquasher } from '../../serializer/mysqlSchema';\nimport type { DB } from '../../utils';\nimport { Select } from '../selector-ui';\nimport { withStyle } from '../validations/outputs';\n\nexport const filterStatements = (\n\tstatements: JsonStatement[],\n\tcurrentSchema: TypeOf<typeof mysqlSchema>,\n\tprevSchema: TypeOf<typeof mysqlSchema>,\n) => {\n\treturn statements.filter((statement) => {\n\t\tif (statement.type === 'alter_table_alter_column_set_type') {\n\t\t\t// Don't need to handle it on migrations step and introspection\n\t\t\t// but for both it should be skipped\n\t\t\tif (\n\t\t\t\tstatement.oldDataType.startsWith('tinyint')\n\t\t\t\t&& statement.newDataType.startsWith('boolean')\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tstatement.oldDataType.startsWith('bigint unsigned')\n\t\t\t\t&& statement.newDataType.startsWith('serial')\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tstatement.oldDataType.startsWith('serial')\n\t\t\t\t&& statement.newDataType.startsWith('bigint unsigned')\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_set_default') {\n\t\t\tif (\n\t\t\t\tstatement.newDefaultValue === false\n\t\t\t\t&& statement.oldDefaultValue === 0\n\t\t\t\t&& statement.newDataType === 'boolean'\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tstatement.newDefaultValue === true\n\t\t\t\t&& statement.oldDefaultValue === 1\n\t\t\t\t&& statement.newDataType === 'boolean'\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (statement.type === 'delete_unique_constraint') {\n\t\t\tconst unsquashed = MySqlSquasher.unsquashUnique(statement.data);\n\t\t\t// only if constraint was removed from a serial column, than treat it as removed\n\t\t\t// const serialStatement = statements.find(\n\t\t\t//   (it) => it.type === \"alter_table_alter_column_set_type\"\n\t\t\t// ) as JsonAlterColumnTypeStatement;\n\t\t\t// if (\n\t\t\t//   serialStatement?.oldDataType.startsWith(\"bigint unsigned\") &&\n\t\t\t//   serialStatement?.newDataType.startsWith(\"serial\") &&\n\t\t\t//   serialStatement.columnName ===\n\t\t\t//     MySqlSquasher.unsquashUnique(statement.data).columns[0]\n\t\t\t// ) {\n\t\t\t//   return false;\n\t\t\t// }\n\t\t\t// Check if uniqueindex was only on this column, that is serial\n\n\t\t\t// if now serial and was not serial and was unique index\n\t\t\tif (\n\t\t\t\tunsquashed.columns.length === 1\n\t\t\t\t&& currentSchema.tables[statement.tableName].columns[unsquashed.columns[0]]\n\t\t\t\t\t\t.type === 'serial'\n\t\t\t\t&& prevSchema.tables[statement.tableName].columns[unsquashed.columns[0]]\n\t\t\t\t\t\t.type === 'serial'\n\t\t\t\t&& currentSchema.tables[statement.tableName].columns[unsquashed.columns[0]]\n\t\t\t\t\t\t.name === unsquashed.columns[0]\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_drop_notnull') {\n\t\t\t// only if constraint was removed from a serial column, than treat it as removed\n\t\t\tconst serialStatement = statements.find(\n\t\t\t\t(it) => it.type === 'alter_table_alter_column_set_type',\n\t\t\t) as JsonAlterColumnTypeStatement;\n\t\t\tif (\n\t\t\t\tserialStatement?.oldDataType.startsWith('bigint unsigned')\n\t\t\t\t&& serialStatement?.newDataType.startsWith('serial')\n\t\t\t\t&& serialStatement.columnName === statement.columnName\n\t\t\t\t&& serialStatement.tableName === statement.tableName\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (statement.newDataType === 'serial' && !statement.columnNotNull) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (statement.columnAutoIncrement) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t});\n};\n\nexport const logSuggestionsAndReturn = async (\n\tdb: DB,\n\tstatements: JsonStatement[],\n\tjson2: TypeOf<typeof mysqlSchema>,\n) => {\n\tlet shouldAskForApprove = false;\n\tconst statementsToExecute: string[] = [];\n\tconst infoToPrint: string[] = [];\n\n\tconst tablesToRemove: string[] = [];\n\tconst columnsToRemove: string[] = [];\n\tconst schemasToRemove: string[] = [];\n\tconst tablesToTruncate: string[] = [];\n\n\tfor (const statement of statements) {\n\t\tif (statement.type === 'drop_table') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.tableName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} table with ${count} items`,\n\t\t\t\t);\n\t\t\t\ttablesToRemove.push(statement.tableName);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_drop_column') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.columnName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} column in ${statement.tableName} table with ${count} items`,\n\t\t\t\t);\n\t\t\t\tcolumnsToRemove.push(`${statement.tableName}_${statement.columnName}`);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'drop_schema') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from information_schema.tables where table_schema = \\`${statement.name}\\`;`,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.name,\n\t\t\t\t\t\t)\n\t\t\t\t\t} schema with ${count} tables`,\n\t\t\t\t);\n\t\t\t\tschemasToRemove.push(statement.name);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_set_type') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to change ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.columnName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} column type from ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.oldDataType,\n\t\t\t\t\t\t)\n\t\t\t\t\t} to ${chalk.underline(statement.newDataType)} with ${count} items`,\n\t\t\t\t);\n\t\t\t\tstatementsToExecute.push(`truncate table ${statement.tableName};`);\n\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_drop_default') {\n\t\t\tif (statement.columnNotNull) {\n\t\t\t\tconst res = await db.query(\n\t\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t\t);\n\n\t\t\t\tconst count = Number(res[0].count);\n\t\t\t\tif (count > 0) {\n\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t`· You're about to remove default value from ${\n\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\tstatement.columnName,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} not-null column with ${count} items`,\n\t\t\t\t\t);\n\n\t\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\t\tstatementsToExecute.push(`truncate table ${statement.tableName};`);\n\n\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// shouldAskForApprove = true;\n\t\t} else if (statement.type === 'alter_table_alter_column_set_notnull') {\n\t\t\tif (typeof statement.columnDefault === 'undefined') {\n\t\t\t\tconst res = await db.query(\n\t\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t\t);\n\n\t\t\t\tconst count = Number(res[0].count);\n\t\t\t\tif (count > 0) {\n\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t`· You're about to set not-null constraint to ${\n\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\tstatement.columnName,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} column without default, which contains ${count} items`,\n\t\t\t\t\t);\n\n\t\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\t\tstatementsToExecute.push(`truncate table ${statement.tableName};`);\n\n\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_drop_pk') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t);\n\n\t\t\t// if drop pk and json2 has autoincrement in table -> exit process with error\n\t\t\tif (\n\t\t\t\tObject.values(json2.tables[statement.tableName].columns).filter(\n\t\t\t\t\t(column) => column.autoincrement,\n\t\t\t\t).length > 0\n\t\t\t) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`${\n\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t`You have removed the primary key from a ${statement.tableName} table without removing the auto-increment property from this table. As the database error states: 'there can be only one auto column, and it must be defined as a key. Make sure to remove autoincrement from ${statement.tableName} table`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to change ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.tableName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} primary key. This statements may fail and you table may left without primary key`,\n\t\t\t\t);\n\n\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'delete_composite_pk') {\n\t\t\t// if drop pk and json2 has autoincrement in table -> exit process with error\n\t\t\tif (\n\t\t\t\tObject.values(json2.tables[statement.tableName].columns).filter(\n\t\t\t\t\t(column) => column.autoincrement,\n\t\t\t\t).length > 0\n\t\t\t) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`${\n\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t`You have removed the primary key from a ${statement.tableName} table without removing the auto-increment property from this table. As the database error states: 'there can be only one auto column, and it must be defined as a key. Make sure to remove autoincrement from ${statement.tableName} table`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_add_column') {\n\t\t\tif (\n\t\t\t\tstatement.column.notNull\n\t\t\t\t&& typeof statement.column.default === 'undefined'\n\t\t\t) {\n\t\t\t\tconst res = await db.query(\n\t\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t\t);\n\t\t\t\tconst count = Number(res[0].count);\n\t\t\t\tif (count > 0) {\n\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t`· You're about to add not-null ${\n\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\tstatement.column.name,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} column without default value, which contains ${count} items`,\n\t\t\t\t\t);\n\n\t\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\t\tstatementsToExecute.push(`truncate table ${statement.tableName};`);\n\n\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (statement.type === 'create_unique_constraint') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tconst unsquashedUnique = MySqlSquasher.unsquashUnique(statement.data);\n\t\t\t\tconsole.log(\n\t\t\t\t\t`· You're about to add ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tunsquashedUnique.name,\n\t\t\t\t\t\t)\n\t\t\t\t\t} unique constraint to the table, which contains ${count} items. If this statement fails, you will receive an error from the database. Do you want to truncate ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.tableName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} table?\\n`,\n\t\t\t\t);\n\t\t\t\tconst { status, data } = await render(\n\t\t\t\t\tnew Select([\n\t\t\t\t\t\t'No, add the constraint without truncating the table',\n\t\t\t\t\t\t`Yes, truncate the table`,\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\tif (data?.index === 1) {\n\t\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\t\tstatementsToExecute.push(`truncate table ${statement.tableName};`);\n\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tstatementsToExecute,\n\t\tshouldAskForApprove,\n\t\tinfoToPrint,\n\t\tcolumnsToRemove: [...new Set(columnsToRemove)],\n\t\tschemasToRemove: [...new Set(schemasToRemove)],\n\t\ttablesToTruncate: [...new Set(tablesToTruncate)],\n\t\ttablesToRemove: [...new Set(tablesToRemove)],\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/mysqlUp.ts",
    "content": "import chalk from 'chalk';\nimport fs, { writeFileSync } from 'fs';\nimport path from 'path';\nimport { Column, MySqlSchema, MySqlSchemaV4, MySqlSchemaV5, mysqlSchemaV5, Table } from '../../serializer/mysqlSchema';\nimport { prepareOutFolder, validateWithReport } from '../../utils';\n\nexport const upMysqlHandler = (out: string) => {};\n\nexport const upMySqlHandlerV4toV5 = (obj: MySqlSchemaV4): MySqlSchemaV5 => {\n\tconst mappedTables: Record<string, Table> = {};\n\n\tfor (const [key, table] of Object.entries(obj.tables)) {\n\t\tconst mappedColumns: Record<string, Column> = {};\n\t\tfor (const [ckey, column] of Object.entries(table.columns)) {\n\t\t\tlet newDefault: any = column.default;\n\t\t\tlet newType: string = column.type;\n\t\t\tlet newAutoIncrement: boolean | undefined = column.autoincrement;\n\n\t\t\tif (column.type.toLowerCase().startsWith('datetime')) {\n\t\t\t\tif (typeof column.default !== 'undefined') {\n\t\t\t\t\tif (column.default.startsWith(\"'\") && column.default.endsWith(\"'\")) {\n\t\t\t\t\t\tnewDefault = `'${\n\t\t\t\t\t\t\tcolumn.default\n\t\t\t\t\t\t\t\t.substring(1, column.default.length - 1)\n\t\t\t\t\t\t\t\t.replace('T', ' ')\n\t\t\t\t\t\t\t\t.slice(0, 23)\n\t\t\t\t\t\t}'`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewDefault = column.default.replace('T', ' ').slice(0, 23);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewType = column.type.toLowerCase().replace('datetime (', 'datetime(');\n\t\t\t} else if (column.type.toLowerCase() === 'date') {\n\t\t\t\tif (typeof column.default !== 'undefined') {\n\t\t\t\t\tif (column.default.startsWith(\"'\") && column.default.endsWith(\"'\")) {\n\t\t\t\t\t\tnewDefault = `'${\n\t\t\t\t\t\t\tcolumn.default\n\t\t\t\t\t\t\t\t.substring(1, column.default.length - 1)\n\t\t\t\t\t\t\t\t.split('T')[0]\n\t\t\t\t\t\t}'`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewDefault = column.default.split('T')[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnewType = column.type.toLowerCase().replace('date (', 'date(');\n\t\t\t} else if (column.type.toLowerCase().startsWith('timestamp')) {\n\t\t\t\tif (typeof column.default !== 'undefined') {\n\t\t\t\t\tif (column.default.startsWith(\"'\") && column.default.endsWith(\"'\")) {\n\t\t\t\t\t\tnewDefault = `'${\n\t\t\t\t\t\t\tcolumn.default\n\t\t\t\t\t\t\t\t.substring(1, column.default.length - 1)\n\t\t\t\t\t\t\t\t.replace('T', ' ')\n\t\t\t\t\t\t\t\t.slice(0, 23)\n\t\t\t\t\t\t}'`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewDefault = column.default.replace('T', ' ').slice(0, 23);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnewType = column.type\n\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t.replace('timestamp (', 'timestamp(');\n\t\t\t} else if (column.type.toLowerCase().startsWith('time')) {\n\t\t\t\tnewType = column.type.toLowerCase().replace('time (', 'time(');\n\t\t\t} else if (column.type.toLowerCase().startsWith('decimal')) {\n\t\t\t\tnewType = column.type.toLowerCase().replace(', ', ',');\n\t\t\t} else if (column.type.toLowerCase().startsWith('enum')) {\n\t\t\t\tnewType = column.type.toLowerCase();\n\t\t\t} else if (column.type.toLowerCase().startsWith('serial')) {\n\t\t\t\tnewAutoIncrement = true;\n\t\t\t}\n\t\t\tmappedColumns[ckey] = {\n\t\t\t\t...column,\n\t\t\t\tdefault: newDefault,\n\t\t\t\ttype: newType,\n\t\t\t\tautoincrement: newAutoIncrement,\n\t\t\t};\n\t\t}\n\n\t\tmappedTables[key] = {\n\t\t\t...table,\n\t\t\tcolumns: mappedColumns,\n\t\t\tcompositePrimaryKeys: {},\n\t\t\tuniqueConstraints: {},\n\t\t\tcheckConstraint: {},\n\t\t};\n\t}\n\n\treturn {\n\t\tversion: '5',\n\t\tdialect: obj.dialect,\n\t\tid: obj.id,\n\t\tprevId: obj.prevId,\n\t\ttables: mappedTables,\n\t\tschemas: obj.schemas,\n\t\t_meta: {\n\t\t\tschemas: {} as Record<string, string>,\n\t\t\ttables: {} as Record<string, string>,\n\t\t\tcolumns: {} as Record<string, string>,\n\t\t},\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/pgIntrospect.ts",
    "content": "import { renderWithTask } from 'hanji';\nimport { Minimatch } from 'minimatch';\nimport { originUUID } from '../../global';\nimport type { PgSchema, PgSchemaInternal } from '../../serializer/pgSchema';\nimport { fromDatabase } from '../../serializer/pgSerializer';\nimport type { DB } from '../../utils';\nimport type { Entities } from '../validations/cli';\nimport { ProgressView } from '../views';\n\nexport const pgPushIntrospect = async (\n\tdb: DB,\n\tfilters: string[],\n\tschemaFilters: string[],\n\tentities: Entities,\n\ttsSchema?: PgSchemaInternal,\n) => {\n\tconst matchers = filters.map((it) => {\n\t\treturn new Minimatch(it);\n\t});\n\n\tconst filter = (tableName: string) => {\n\t\tif (matchers.length === 0) return true;\n\n\t\tlet flags: boolean[] = [];\n\n\t\tfor (let matcher of matchers) {\n\t\t\tif (matcher.negate) {\n\t\t\t\tif (!matcher.match(tableName)) {\n\t\t\t\t\tflags.push(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matcher.match(tableName)) {\n\t\t\t\tflags.push(true);\n\t\t\t}\n\t\t}\n\n\t\tif (flags.length > 0) {\n\t\t\treturn flags.every(Boolean);\n\t\t}\n\t\treturn false;\n\t};\n\tconst progress = new ProgressView(\n\t\t'Pulling schema from database...',\n\t\t'Pulling schema from database...',\n\t);\n\tconst res = await renderWithTask(\n\t\tprogress,\n\t\tfromDatabase(db, filter, schemaFilters, entities, undefined, tsSchema),\n\t);\n\n\tconst schema = { id: originUUID, prevId: '', ...res } as PgSchema;\n\tconst { internal, ...schemaWithoutInternals } = schema;\n\treturn { schema: schemaWithoutInternals };\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/pgPushUtils.ts",
    "content": "import chalk from 'chalk';\nimport { render } from 'hanji';\nimport type { JsonStatement } from '../../jsonStatements';\nimport { PgSquasher } from '../../serializer/pgSchema';\nimport { fromJson } from '../../sqlgenerator';\nimport type { DB } from '../../utils';\nimport { Select } from '../selector-ui';\n\n// export const filterStatements = (statements: JsonStatement[]) => {\n//   return statements.filter((statement) => {\n//     if (statement.type === \"alter_table_alter_column_set_type\") {\n//       // Don't need to handle it on migrations step and introspection\n//       // but for both it should be skipped\n//       if (\n//         statement.oldDataType.startsWith(\"tinyint\") &&\n//         statement.newDataType.startsWith(\"boolean\")\n//       ) {\n//         return false;\n//       }\n//     } else if (statement.type === \"alter_table_alter_column_set_default\") {\n//       if (\n//         statement.newDefaultValue === false &&\n//         statement.oldDefaultValue === 0 &&\n//         statement.newDataType === \"boolean\"\n//       ) {\n//         return false;\n//       }\n//       if (\n//         statement.newDefaultValue === true &&\n//         statement.oldDefaultValue === 1 &&\n//         statement.newDataType === \"boolean\"\n//       ) {\n//         return false;\n//       }\n//     }\n//     return true;\n//   });\n// };\n\nfunction concatSchemaAndTableName(schema: string | undefined, table: string) {\n\treturn schema ? `\"${schema}\".\"${table}\"` : `\"${table}\"`;\n}\n\nfunction tableNameWithSchemaFrom(\n\tschema: string | undefined,\n\ttableName: string,\n\trenamedSchemas: Record<string, string>,\n\trenamedTables: Record<string, string>,\n) {\n\tconst newSchemaName = schema ? (renamedSchemas[schema] ? renamedSchemas[schema] : schema) : undefined;\n\n\tconst newTableName = renamedTables[concatSchemaAndTableName(newSchemaName, tableName)]\n\t\t? renamedTables[concatSchemaAndTableName(newSchemaName, tableName)]\n\t\t: tableName;\n\n\treturn concatSchemaAndTableName(newSchemaName, newTableName);\n}\n\nexport const pgSuggestions = async (db: DB, statements: JsonStatement[]) => {\n\tlet shouldAskForApprove = false;\n\tconst statementsToExecute: string[] = [];\n\tconst infoToPrint: string[] = [];\n\n\tconst tablesToRemove: string[] = [];\n\tconst columnsToRemove: string[] = [];\n\tconst schemasToRemove: string[] = [];\n\tconst tablesToTruncate: string[] = [];\n\tconst matViewsToRemove: string[] = [];\n\n\tlet renamedSchemas: Record<string, string> = {};\n\tlet renamedTables: Record<string, string> = {};\n\n\tfor (const statement of statements) {\n\t\tif (statement.type === 'rename_schema') {\n\t\t\trenamedSchemas[statement.to] = statement.from;\n\t\t} else if (statement.type === 'rename_table') {\n\t\t\trenamedTables[concatSchemaAndTableName(statement.toSchema, statement.tableNameTo)] = statement.tableNameFrom;\n\t\t} else if (statement.type === 'drop_table') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from ${\n\t\t\t\t\ttableNameWithSchemaFrom(statement.schema, statement.tableName, renamedSchemas, renamedTables)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(`· You're about to delete ${chalk.underline(statement.tableName)} table with ${count} items`);\n\t\t\t\t// statementsToExecute.push(\n\t\t\t\t//   `truncate table ${tableNameWithSchemaFrom(statement)} cascade;`\n\t\t\t\t// );\n\t\t\t\ttablesToRemove.push(statement.tableName);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'drop_view' && statement.materialized) {\n\t\t\tconst res = await db.query(`select count(*) as count from \"${statement.schema ?? 'public'}\".\"${statement.name}\"`);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to delete \"${chalk.underline(statement.name)}\" materialized view with ${count} items`,\n\t\t\t\t);\n\n\t\t\t\tmatViewsToRemove.push(statement.name);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_drop_column') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from ${\n\t\t\t\t\ttableNameWithSchemaFrom(statement.schema, statement.tableName, renamedSchemas, renamedTables)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\tchalk.underline(statement.columnName)\n\t\t\t\t\t} column in ${statement.tableName} table with ${count} items`,\n\t\t\t\t);\n\t\t\t\tcolumnsToRemove.push(`${statement.tableName}_${statement.columnName}`);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'drop_schema') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from information_schema.tables where table_schema = '${statement.name}';`,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(`· You're about to delete ${chalk.underline(statement.name)} schema with ${count} tables`);\n\t\t\t\tschemasToRemove.push(statement.name);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_set_type') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from ${\n\t\t\t\t\ttableNameWithSchemaFrom(statement.schema, statement.tableName, renamedSchemas, renamedTables)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to change ${chalk.underline(statement.columnName)} column type from ${\n\t\t\t\t\t\tchalk.underline(statement.oldDataType)\n\t\t\t\t\t} to ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.newDataType,\n\t\t\t\t\t\t)\n\t\t\t\t\t} with ${count} items`,\n\t\t\t\t);\n\t\t\t\tstatementsToExecute.push(\n\t\t\t\t\t`truncate table ${\n\t\t\t\t\t\ttableNameWithSchemaFrom(statement.schema, statement.tableName, renamedSchemas, renamedTables)\n\t\t\t\t\t} cascade;`,\n\t\t\t\t);\n\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_drop_pk') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from ${\n\t\t\t\t\ttableNameWithSchemaFrom(statement.schema, statement.tableName, renamedSchemas, renamedTables)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to change ${\n\t\t\t\t\t\tchalk.underline(statement.tableName)\n\t\t\t\t\t} primary key. This statements may fail and you table may left without primary key`,\n\t\t\t\t);\n\n\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\n\t\t\tconst tableNameWithSchema = tableNameWithSchemaFrom(\n\t\t\t\tstatement.schema,\n\t\t\t\tstatement.tableName,\n\t\t\t\trenamedSchemas,\n\t\t\t\trenamedTables,\n\t\t\t);\n\n\t\t\tconst pkNameResponse = await db.query(\n\t\t\t\t`SELECT constraint_name FROM information_schema.table_constraints\n        WHERE table_schema = '${\n\t\t\t\t\ttypeof statement.schema === 'undefined' || statement.schema === '' ? 'public' : statement.schema\n\t\t\t\t}'\n            AND table_name = '${statement.tableName}'\n            AND constraint_type = 'PRIMARY KEY';`,\n\t\t\t);\n\n\t\t\tstatementsToExecute.push(\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} DROP CONSTRAINT \"${pkNameResponse[0].constraint_name}\"`,\n\t\t\t);\n\t\t\t// we will generate statement for drop pk here and not after all if-else statements\n\t\t\tcontinue;\n\t\t} else if (statement.type === 'alter_table_add_column') {\n\t\t\tif (statement.column.notNull && typeof statement.column.default === 'undefined') {\n\t\t\t\tconst res = await db.query(\n\t\t\t\t\t`select count(*) as count from ${\n\t\t\t\t\t\ttableNameWithSchemaFrom(statement.schema, statement.tableName, renamedSchemas, renamedTables)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tconst count = Number(res[0].count);\n\t\t\t\tif (count > 0) {\n\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t`· You're about to add not-null ${\n\t\t\t\t\t\t\tchalk.underline(statement.column.name)\n\t\t\t\t\t\t} column without default value, which contains ${count} items`,\n\t\t\t\t\t);\n\n\t\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\t\tstatementsToExecute.push(\n\t\t\t\t\t\t`truncate table ${\n\t\t\t\t\t\t\ttableNameWithSchemaFrom(statement.schema, statement.tableName, renamedSchemas, renamedTables)\n\t\t\t\t\t\t} cascade;`,\n\t\t\t\t\t);\n\n\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (statement.type === 'create_unique_constraint') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from ${\n\t\t\t\t\ttableNameWithSchemaFrom(statement.schema, statement.tableName, renamedSchemas, renamedTables)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tconst unsquashedUnique = PgSquasher.unsquashUnique(statement.data);\n\t\t\t\tconsole.log(\n\t\t\t\t\t`· You're about to add ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tunsquashedUnique.name,\n\t\t\t\t\t\t)\n\t\t\t\t\t} unique constraint to the table, which contains ${count} items. If this statement fails, you will receive an error from the database. Do you want to truncate ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.tableName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} table?\\n`,\n\t\t\t\t);\n\t\t\t\tconst { status, data } = await render(\n\t\t\t\t\tnew Select(['No, add the constraint without truncating the table', `Yes, truncate the table`]),\n\t\t\t\t);\n\t\t\t\tif (data?.index === 1) {\n\t\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\t\tstatementsToExecute.push(\n\t\t\t\t\t\t`truncate table ${\n\t\t\t\t\t\t\ttableNameWithSchemaFrom(statement.schema, statement.tableName, renamedSchemas, renamedTables)\n\t\t\t\t\t\t} cascade;`,\n\t\t\t\t\t);\n\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst stmnt = fromJson([statement], 'postgresql', 'push');\n\t\tif (typeof stmnt !== 'undefined') {\n\t\t\tstatementsToExecute.push(...stmnt);\n\t\t}\n\t}\n\n\treturn {\n\t\tstatementsToExecute: [...new Set(statementsToExecute)],\n\t\tshouldAskForApprove,\n\t\tinfoToPrint,\n\t\tmatViewsToRemove: [...new Set(matViewsToRemove)],\n\t\tcolumnsToRemove: [...new Set(columnsToRemove)],\n\t\tschemasToRemove: [...new Set(schemasToRemove)],\n\t\ttablesToTruncate: [...new Set(tablesToTruncate)],\n\t\ttablesToRemove: [...new Set(tablesToRemove)],\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/pgUp.ts",
    "content": "import chalk from 'chalk';\nimport { writeFileSync } from 'fs';\nimport {\n\tColumn,\n\tIndex,\n\tPgSchema,\n\tPgSchemaV4,\n\tPgSchemaV5,\n\tpgSchemaV5,\n\tPgSchemaV6,\n\tpgSchemaV6,\n\tTable,\n\tTableV5,\n} from '../../serializer/pgSchema';\nimport { prepareOutFolder, validateWithReport } from '../../utils';\n\nexport const upPgHandler = (out: string) => {\n\tconst { snapshots } = prepareOutFolder(out, 'postgresql');\n\tconst report = validateWithReport(snapshots, 'postgresql');\n\n\treport.nonLatest\n\t\t.map((it) => ({\n\t\t\tpath: it,\n\t\t\traw: report.rawMap[it]!! as Record<string, any>,\n\t\t}))\n\t\t.forEach((it) => {\n\t\t\tconst path = it.path;\n\n\t\t\tlet resultV6 = it.raw;\n\t\t\tif (it.raw.version === '5') {\n\t\t\t\tresultV6 = updateUpToV6(it.raw);\n\t\t\t}\n\n\t\t\tconst result = updateUpToV7(resultV6);\n\n\t\t\tconsole.log(`[${chalk.green('✓')}] ${path}`);\n\n\t\t\twriteFileSync(path, JSON.stringify(result, null, 2));\n\t\t});\n\n\tconsole.log(\"Everything's fine 🐶🔥\");\n};\n\nexport const updateUpToV6 = (json: Record<string, any>): PgSchemaV6 => {\n\tconst schema = pgSchemaV5.parse(json);\n\tconst tables = Object.fromEntries(\n\t\tObject.entries(schema.tables).map((it) => {\n\t\t\tconst table = it[1];\n\t\t\tconst schema = table.schema || 'public';\n\t\t\treturn [`${schema}.${table.name}`, table];\n\t\t}),\n\t);\n\tconst enums = Object.fromEntries(\n\t\tObject.entries(schema.enums).map((it) => {\n\t\t\tconst en = it[1];\n\t\t\treturn [\n\t\t\t\t`public.${en.name}`,\n\t\t\t\t{\n\t\t\t\t\tname: en.name,\n\t\t\t\t\tschema: 'public',\n\t\t\t\t\tvalues: Object.values(en.values),\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t);\n\treturn {\n\t\t...schema,\n\t\tversion: '6',\n\t\tdialect: 'postgresql',\n\t\ttables: tables,\n\t\tenums,\n\t};\n};\n\n// Changed index format stored in snapshot for PostgreSQL in 0.22.0\nexport const updateUpToV7 = (json: Record<string, any>): PgSchema => {\n\tconst schema = pgSchemaV6.parse(json);\n\tconst tables = Object.fromEntries(\n\t\tObject.entries(schema.tables).map((it) => {\n\t\t\tconst table = it[1];\n\t\t\tconst mappedIndexes = Object.fromEntries(\n\t\t\t\tObject.entries(table.indexes).map((idx) => {\n\t\t\t\t\tconst { columns, ...rest } = idx[1];\n\t\t\t\t\tconst mappedColumns = columns.map<Index['columns'][number]>((it) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\texpression: it,\n\t\t\t\t\t\t\tisExpression: false,\n\t\t\t\t\t\t\tasc: true,\n\t\t\t\t\t\t\tnulls: 'last',\n\t\t\t\t\t\t\topClass: undefined,\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t\treturn [idx[0], { columns: mappedColumns, with: {}, ...rest }];\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn [it[0], { ...table, indexes: mappedIndexes, policies: {}, isRLSEnabled: false, checkConstraints: {} }];\n\t\t}),\n\t);\n\n\treturn {\n\t\t...schema,\n\t\tversion: '7',\n\t\tdialect: 'postgresql',\n\t\tsequences: {},\n\t\ttables: tables,\n\t\tpolicies: {},\n\t\tviews: {},\n\t\troles: {},\n\t};\n};\n\n// major migration with of folder structure, etc...\nexport const upPgHandlerV4toV5 = (obj: PgSchemaV4): PgSchemaV5 => {\n\tconst mappedTables: Record<string, TableV5> = {};\n\n\tfor (const [key, table] of Object.entries(obj.tables)) {\n\t\tconst mappedColumns: Record<string, Column> = {};\n\t\tfor (const [ckey, column] of Object.entries(table.columns)) {\n\t\t\tlet newDefault: any = column.default;\n\t\t\tlet newType: string = column.type;\n\t\t\tif (column.type.toLowerCase() === 'date') {\n\t\t\t\tif (typeof column.default !== 'undefined') {\n\t\t\t\t\tif (column.default.startsWith(\"'\") && column.default.endsWith(\"'\")) {\n\t\t\t\t\t\tnewDefault = `'${\n\t\t\t\t\t\t\tcolumn.default\n\t\t\t\t\t\t\t\t.substring(1, column.default.length - 1)\n\t\t\t\t\t\t\t\t.split('T')[0]\n\t\t\t\t\t\t}'`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewDefault = column.default.split('T')[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (column.type.toLowerCase().startsWith('timestamp')) {\n\t\t\t\tif (typeof column.default !== 'undefined') {\n\t\t\t\t\tif (column.default.startsWith(\"'\") && column.default.endsWith(\"'\")) {\n\t\t\t\t\t\tnewDefault = `'${\n\t\t\t\t\t\t\tcolumn.default\n\t\t\t\t\t\t\t\t.substring(1, column.default.length - 1)\n\t\t\t\t\t\t\t\t.replace('T', ' ')\n\t\t\t\t\t\t\t\t.slice(0, 23)\n\t\t\t\t\t\t}'`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewDefault = column.default.replace('T', ' ').slice(0, 23);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnewType = column.type\n\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t.replace('timestamp (', 'timestamp(');\n\t\t\t} else if (column.type.toLowerCase().startsWith('time')) {\n\t\t\t\tnewType = column.type.toLowerCase().replace('time (', 'time(');\n\t\t\t} else if (column.type.toLowerCase().startsWith('interval')) {\n\t\t\t\tnewType = column.type.toLowerCase().replace(' (', '(');\n\t\t\t}\n\t\t\tmappedColumns[ckey] = { ...column, default: newDefault, type: newType };\n\t\t}\n\n\t\tmappedTables[key] = {\n\t\t\t...table,\n\t\t\tcolumns: mappedColumns,\n\t\t\tcompositePrimaryKeys: {},\n\t\t\tuniqueConstraints: {},\n\t\t};\n\t}\n\n\treturn {\n\t\tversion: '5',\n\t\tdialect: obj.dialect,\n\t\tid: obj.id,\n\t\tprevId: obj.prevId,\n\t\ttables: mappedTables,\n\t\tenums: obj.enums,\n\t\tschemas: obj.schemas,\n\t\t_meta: {\n\t\t\tschemas: {} as Record<string, string>,\n\t\t\ttables: {} as Record<string, string>,\n\t\t\tcolumns: {} as Record<string, string>,\n\t\t},\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/push.ts",
    "content": "import chalk from 'chalk';\nimport { randomUUID } from 'crypto';\nimport { render } from 'hanji';\nimport { serializePg } from 'src/serializer';\nimport { fromJson } from '../../sqlgenerator';\nimport { Select } from '../selector-ui';\nimport { Entities } from '../validations/cli';\nimport { CasingType } from '../validations/common';\nimport { LibSQLCredentials } from '../validations/libsql';\nimport type { MysqlCredentials } from '../validations/mysql';\nimport { withStyle } from '../validations/outputs';\nimport type { PostgresCredentials } from '../validations/postgres';\nimport { SingleStoreCredentials } from '../validations/singlestore';\nimport type { SqliteCredentials } from '../validations/sqlite';\nimport { libSqlLogSuggestionsAndReturn } from './libSqlPushUtils';\nimport {\n\tfilterStatements as mySqlFilterStatements,\n\tlogSuggestionsAndReturn as mySqlLogSuggestionsAndReturn,\n} from './mysqlPushUtils';\nimport { pgSuggestions } from './pgPushUtils';\nimport {\n\tfilterStatements as singleStoreFilterStatements,\n\tlogSuggestionsAndReturn as singleStoreLogSuggestionsAndReturn,\n} from './singlestorePushUtils';\nimport { logSuggestionsAndReturn as sqliteSuggestions } from './sqlitePushUtils';\n\nexport const mysqlPush = async (\n\tschemaPath: string | string[],\n\tcredentials: MysqlCredentials,\n\ttablesFilter: string[],\n\tstrict: boolean,\n\tverbose: boolean,\n\tforce: boolean,\n\tcasing: CasingType | undefined,\n) => {\n\tconst { connectToMySQL } = await import('../connections');\n\tconst { mysqlPushIntrospect } = await import('./mysqlIntrospect');\n\n\tconst { db, database } = await connectToMySQL(credentials);\n\n\tconst { schema } = await mysqlPushIntrospect(db, database, tablesFilter);\n\tconst { prepareMySQLPush } = await import('./migrate');\n\n\tconst statements = await prepareMySQLPush(schemaPath, schema, casing);\n\n\tconst filteredStatements = mySqlFilterStatements(\n\t\tstatements.statements ?? [],\n\t\tstatements.validatedCur,\n\t\tstatements.validatedPrev,\n\t);\n\n\ttry {\n\t\tif (filteredStatements.length === 0) {\n\t\t\trender(`[${chalk.blue('i')}] No changes detected`);\n\t\t} else {\n\t\t\tconst {\n\t\t\t\tshouldAskForApprove,\n\t\t\t\tstatementsToExecute,\n\t\t\t\tcolumnsToRemove,\n\t\t\t\ttablesToRemove,\n\t\t\t\ttablesToTruncate,\n\t\t\t\tinfoToPrint,\n\t\t\t} = await mySqlLogSuggestionsAndReturn(\n\t\t\t\tdb,\n\t\t\t\tfilteredStatements,\n\t\t\t\tstatements.validatedCur,\n\t\t\t);\n\n\t\t\tconst filteredSqlStatements = fromJson(filteredStatements, 'mysql');\n\n\t\t\tconst uniqueSqlStatementsToExecute: string[] = [];\n\t\t\tstatementsToExecute.forEach((ss) => {\n\t\t\t\tif (!uniqueSqlStatementsToExecute.includes(ss)) {\n\t\t\t\t\tuniqueSqlStatementsToExecute.push(ss);\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst uniqueFilteredSqlStatements: string[] = [];\n\t\t\tfilteredSqlStatements.forEach((ss) => {\n\t\t\t\tif (!uniqueFilteredSqlStatements.includes(ss)) {\n\t\t\t\t\tuniqueFilteredSqlStatements.push(ss);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (verbose) {\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\n\t\t\t\t\twithStyle.warning('You are about to execute current statements:'),\n\t\t\t\t);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\n\t\t\t\t\t[...uniqueSqlStatementsToExecute, ...uniqueFilteredSqlStatements]\n\t\t\t\t\t\t.map((s) => chalk.blue(s))\n\t\t\t\t\t\t.join('\\n'),\n\t\t\t\t);\n\t\t\t\tconsole.log();\n\t\t\t}\n\n\t\t\tif (!force && strict) {\n\t\t\t\tif (!shouldAskForApprove) {\n\t\t\t\t\tconst { status, data } = await render(\n\t\t\t\t\t\tnew Select(['No, abort', `Yes, I want to execute all statements`]),\n\t\t\t\t\t);\n\t\t\t\t\tif (data?.index === 0) {\n\t\t\t\t\t\trender(`[${chalk.red('x')}] All changes were aborted`);\n\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!force && shouldAskForApprove) {\n\t\t\t\tconsole.log(withStyle.warning('Found data-loss statements:'));\n\t\t\t\tconsole.log(infoToPrint.join('\\n'));\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.red.bold(\n\t\t\t\t\t\t'THIS ACTION WILL CAUSE DATA LOSS AND CANNOT BE REVERTED\\n',\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tconsole.log(chalk.white('Do you still want to push changes?'));\n\n\t\t\t\tconst { status, data } = await render(\n\t\t\t\t\tnew Select([\n\t\t\t\t\t\t'No, abort',\n\t\t\t\t\t\t`Yes, I want to${\n\t\t\t\t\t\t\ttablesToRemove.length > 0\n\t\t\t\t\t\t\t\t? ` remove ${tablesToRemove.length} ${tablesToRemove.length > 1 ? 'tables' : 'table'},`\n\t\t\t\t\t\t\t\t: ' '\n\t\t\t\t\t\t}${\n\t\t\t\t\t\t\tcolumnsToRemove.length > 0\n\t\t\t\t\t\t\t\t? ` remove ${columnsToRemove.length} ${columnsToRemove.length > 1 ? 'columns' : 'column'},`\n\t\t\t\t\t\t\t\t: ' '\n\t\t\t\t\t\t}${\n\t\t\t\t\t\t\ttablesToTruncate.length > 0\n\t\t\t\t\t\t\t\t? ` truncate ${tablesToTruncate.length} ${tablesToTruncate.length > 1 ? 'tables' : 'table'}`\n\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t}`\n\t\t\t\t\t\t\t.replace(/(^,)|(,$)/g, '')\n\t\t\t\t\t\t\t.replace(/ +(?= )/g, ''),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\tif (data?.index === 0) {\n\t\t\t\t\trender(`[${chalk.red('x')}] All changes were aborted`);\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const dStmnt of uniqueSqlStatementsToExecute) {\n\t\t\t\tawait db.query(dStmnt);\n\t\t\t}\n\n\t\t\tfor (const statement of uniqueFilteredSqlStatements) {\n\t\t\t\tawait db.query(statement);\n\t\t\t}\n\t\t\tif (filteredStatements.length > 0) {\n\t\t\t\trender(`[${chalk.green('✓')}] Changes applied`);\n\t\t\t} else {\n\t\t\t\trender(`[${chalk.blue('i')}] No changes detected`);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(e);\n\t}\n};\n\nexport const singlestorePush = async (\n\tschemaPath: string | string[],\n\tcredentials: SingleStoreCredentials,\n\ttablesFilter: string[],\n\tstrict: boolean,\n\tverbose: boolean,\n\tforce: boolean,\n\tcasing: CasingType | undefined,\n) => {\n\tconst { connectToSingleStore } = await import('../connections');\n\tconst { singlestorePushIntrospect } = await import('./singlestoreIntrospect');\n\n\tconst { db, database } = await connectToSingleStore(credentials);\n\n\tconst { schema } = await singlestorePushIntrospect(\n\t\tdb,\n\t\tdatabase,\n\t\ttablesFilter,\n\t);\n\tconst { prepareSingleStorePush } = await import('./migrate');\n\n\tconst statements = await prepareSingleStorePush(schemaPath, schema, casing);\n\n\tconst filteredStatements = singleStoreFilterStatements(\n\t\tstatements.statements ?? [],\n\t\tstatements.validatedCur,\n\t\tstatements.validatedPrev,\n\t);\n\n\ttry {\n\t\tif (filteredStatements.length === 0) {\n\t\t\trender(`[${chalk.blue('i')}] No changes detected`);\n\t\t} else {\n\t\t\tconst {\n\t\t\t\tshouldAskForApprove,\n\t\t\t\tstatementsToExecute,\n\t\t\t\tcolumnsToRemove,\n\t\t\t\ttablesToRemove,\n\t\t\t\ttablesToTruncate,\n\t\t\t\tinfoToPrint,\n\t\t\t\tschemasToRemove,\n\t\t\t} = await singleStoreLogSuggestionsAndReturn(\n\t\t\t\tdb,\n\t\t\t\tfilteredStatements,\n\t\t\t\tstatements.validatedCur,\n\t\t\t\tstatements.validatedPrev,\n\t\t\t);\n\n\t\t\tif (verbose) {\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\n\t\t\t\t\twithStyle.warning('You are about to execute current statements:'),\n\t\t\t\t);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(statementsToExecute.map((s) => chalk.blue(s)).join('\\n'));\n\t\t\t\tconsole.log();\n\t\t\t}\n\n\t\t\tif (!force && strict) {\n\t\t\t\tif (!shouldAskForApprove) {\n\t\t\t\t\tconst { status, data } = await render(\n\t\t\t\t\t\tnew Select(['No, abort', `Yes, I want to execute all statements`]),\n\t\t\t\t\t);\n\t\t\t\t\tif (data?.index === 0) {\n\t\t\t\t\t\trender(`[${chalk.red('x')}] All changes were aborted`);\n\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!force && shouldAskForApprove) {\n\t\t\t\tconsole.log(withStyle.warning('Found data-loss statements:'));\n\t\t\t\tconsole.log(infoToPrint.join('\\n'));\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.red.bold(\n\t\t\t\t\t\t'THIS ACTION WILL CAUSE DATA LOSS AND CANNOT BE REVERTED\\n',\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tconsole.log(chalk.white('Do you still want to push changes?'));\n\n\t\t\t\tconst { status, data } = await render(\n\t\t\t\t\tnew Select([\n\t\t\t\t\t\t'No, abort',\n\t\t\t\t\t\t`Yes, I want to${\n\t\t\t\t\t\t\ttablesToRemove.length > 0\n\t\t\t\t\t\t\t\t? ` remove ${tablesToRemove.length} ${tablesToRemove.length > 1 ? 'tables' : 'table'},`\n\t\t\t\t\t\t\t\t: ' '\n\t\t\t\t\t\t}${\n\t\t\t\t\t\t\tcolumnsToRemove.length > 0\n\t\t\t\t\t\t\t\t? ` remove ${columnsToRemove.length} ${columnsToRemove.length > 1 ? 'columns' : 'column'},`\n\t\t\t\t\t\t\t\t: ' '\n\t\t\t\t\t\t}${\n\t\t\t\t\t\t\ttablesToTruncate.length > 0\n\t\t\t\t\t\t\t\t? ` truncate ${tablesToTruncate.length} ${tablesToTruncate.length > 1 ? 'tables' : 'table'}`\n\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t}`\n\t\t\t\t\t\t\t.replace(/(^,)|(,$)/g, '')\n\t\t\t\t\t\t\t.replace(/ +(?= )/g, ''),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\tif (data?.index === 0) {\n\t\t\t\t\trender(`[${chalk.red('x')}] All changes were aborted`);\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const dStmnt of statementsToExecute) {\n\t\t\t\tawait db.query(dStmnt);\n\t\t\t}\n\n\t\t\tif (filteredStatements.length > 0) {\n\t\t\t\trender(`[${chalk.green('✓')}] Changes applied`);\n\t\t\t} else {\n\t\t\t\trender(`[${chalk.blue('i')}] No changes detected`);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(e);\n\t}\n};\n\nexport const pgPush = async (\n\tschemaPath: string | string[],\n\tverbose: boolean,\n\tstrict: boolean,\n\tcredentials: PostgresCredentials,\n\ttablesFilter: string[],\n\tschemasFilter: string[],\n\tentities: Entities,\n\tforce: boolean,\n\tcasing: CasingType | undefined,\n) => {\n\tconst { preparePostgresDB } = await import('../connections');\n\tconst { pgPushIntrospect } = await import('./pgIntrospect');\n\n\tconst db = await preparePostgresDB(credentials);\n\tconst serialized = await serializePg(schemaPath, casing, schemasFilter);\n\n\tconst { schema } = await pgPushIntrospect(db, tablesFilter, schemasFilter, entities, serialized);\n\n\tconst { preparePgPush } = await import('./migrate');\n\n\tconst statements = await preparePgPush(\n\t\t{ id: randomUUID(), prevId: schema.id, ...serialized },\n\t\tschema,\n\t);\n\n\ttry {\n\t\tif (statements.sqlStatements.length === 0) {\n\t\t\trender(`[${chalk.blue('i')}] No changes detected`);\n\t\t} else {\n\t\t\t// const filteredStatements = filterStatements(statements.statements);\n\t\t\tconst {\n\t\t\t\tshouldAskForApprove,\n\t\t\t\tstatementsToExecute,\n\t\t\t\tcolumnsToRemove,\n\t\t\t\ttablesToRemove,\n\t\t\t\tmatViewsToRemove,\n\t\t\t\ttablesToTruncate,\n\t\t\t\tinfoToPrint,\n\t\t\t\tschemasToRemove,\n\t\t\t} = await pgSuggestions(db, statements.statements);\n\n\t\t\tif (verbose) {\n\t\t\t\tconsole.log();\n\t\t\t\t// console.log(chalk.gray('Verbose logs:'));\n\t\t\t\tconsole.log(\n\t\t\t\t\twithStyle.warning('You are about to execute current statements:'),\n\t\t\t\t);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(statementsToExecute.map((s) => chalk.blue(s)).join('\\n'));\n\t\t\t\tconsole.log();\n\t\t\t}\n\n\t\t\tif (!force && strict) {\n\t\t\t\tif (!shouldAskForApprove) {\n\t\t\t\t\tconst { status, data } = await render(\n\t\t\t\t\t\tnew Select(['No, abort', `Yes, I want to execute all statements`]),\n\t\t\t\t\t);\n\t\t\t\t\tif (data?.index === 0) {\n\t\t\t\t\t\trender(`[${chalk.red('x')}] All changes were aborted`);\n\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!force && shouldAskForApprove) {\n\t\t\t\tconsole.log(withStyle.warning('Found data-loss statements:'));\n\t\t\t\tconsole.log(infoToPrint.join('\\n'));\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.red.bold(\n\t\t\t\t\t\t'THIS ACTION WILL CAUSE DATA LOSS AND CANNOT BE REVERTED\\n',\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tconsole.log(chalk.white('Do you still want to push changes?'));\n\n\t\t\t\tconst { status, data } = await render(\n\t\t\t\t\tnew Select([\n\t\t\t\t\t\t'No, abort',\n\t\t\t\t\t\t`Yes, I want to${\n\t\t\t\t\t\t\ttablesToRemove.length > 0\n\t\t\t\t\t\t\t\t? ` remove ${tablesToRemove.length} ${tablesToRemove.length > 1 ? 'tables' : 'table'},`\n\t\t\t\t\t\t\t\t: ' '\n\t\t\t\t\t\t}${\n\t\t\t\t\t\t\tcolumnsToRemove.length > 0\n\t\t\t\t\t\t\t\t? ` remove ${columnsToRemove.length} ${columnsToRemove.length > 1 ? 'columns' : 'column'},`\n\t\t\t\t\t\t\t\t: ' '\n\t\t\t\t\t\t}${\n\t\t\t\t\t\t\ttablesToTruncate.length > 0\n\t\t\t\t\t\t\t\t? ` truncate ${tablesToTruncate.length} ${tablesToTruncate.length > 1 ? 'tables' : 'table'}`\n\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t}${\n\t\t\t\t\t\t\tmatViewsToRemove.length > 0\n\t\t\t\t\t\t\t\t? ` remove ${matViewsToRemove.length} ${\n\t\t\t\t\t\t\t\t\tmatViewsToRemove.length > 1 ? 'materialized views' : 'materialize view'\n\t\t\t\t\t\t\t\t},`\n\t\t\t\t\t\t\t\t: ' '\n\t\t\t\t\t\t}`\n\t\t\t\t\t\t\t.replace(/(^,)|(,$)/g, '')\n\t\t\t\t\t\t\t.replace(/ +(?= )/g, ''),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\tif (data?.index === 0) {\n\t\t\t\t\trender(`[${chalk.red('x')}] All changes were aborted`);\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const dStmnt of statementsToExecute) {\n\t\t\t\tawait db.query(dStmnt);\n\t\t\t}\n\n\t\t\tif (statements.statements.length > 0) {\n\t\t\t\trender(`[${chalk.green('✓')}] Changes applied`);\n\t\t\t} else {\n\t\t\t\trender(`[${chalk.blue('i')}] No changes detected`);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\n\nexport const sqlitePush = async (\n\tschemaPath: string | string[],\n\tverbose: boolean,\n\tstrict: boolean,\n\tcredentials: SqliteCredentials,\n\ttablesFilter: string[],\n\tforce: boolean,\n\tcasing: CasingType | undefined,\n) => {\n\tconst { connectToSQLite } = await import('../connections');\n\tconst { sqlitePushIntrospect } = await import('./sqliteIntrospect');\n\n\tconst db = await connectToSQLite(credentials);\n\tconst { schema } = await sqlitePushIntrospect(db, tablesFilter);\n\tconst { prepareSQLitePush } = await import('./migrate');\n\n\tconst statements = await prepareSQLitePush(schemaPath, schema, casing);\n\n\tif (statements.sqlStatements.length === 0) {\n\t\trender(`\\n[${chalk.blue('i')}] No changes detected`);\n\t} else {\n\t\tconst {\n\t\t\tshouldAskForApprove,\n\t\t\tstatementsToExecute,\n\t\t\tcolumnsToRemove,\n\t\t\ttablesToRemove,\n\t\t\ttablesToTruncate,\n\t\t\tinfoToPrint,\n\t\t\tschemasToRemove,\n\t\t} = await sqliteSuggestions(\n\t\t\tdb,\n\t\t\tstatements.statements,\n\t\t\tstatements.squashedPrev,\n\t\t\tstatements.squashedCur,\n\t\t\tstatements.meta!,\n\t\t);\n\n\t\tif (verbose && statementsToExecute.length > 0) {\n\t\t\tconsole.log();\n\t\t\tconsole.log(\n\t\t\t\twithStyle.warning('You are about to execute current statements:'),\n\t\t\t);\n\t\t\tconsole.log();\n\t\t\tconsole.log(statementsToExecute.map((s) => chalk.blue(s)).join('\\n'));\n\t\t\tconsole.log();\n\t\t}\n\n\t\tif (!force && strict) {\n\t\t\tif (!shouldAskForApprove) {\n\t\t\t\tconst { status, data } = await render(\n\t\t\t\t\tnew Select(['No, abort', `Yes, I want to execute all statements`]),\n\t\t\t\t);\n\t\t\t\tif (data?.index === 0) {\n\t\t\t\t\trender(`[${chalk.red('x')}] All changes were aborted`);\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!force && shouldAskForApprove) {\n\t\t\tconsole.log(withStyle.warning('Found data-loss statements:'));\n\t\t\tconsole.log(infoToPrint.join('\\n'));\n\t\t\tconsole.log();\n\t\t\tconsole.log(\n\t\t\t\tchalk.red.bold(\n\t\t\t\t\t'THIS ACTION WILL CAUSE DATA LOSS AND CANNOT BE REVERTED\\n',\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconsole.log(chalk.white('Do you still want to push changes?'));\n\n\t\t\tconst { status, data } = await render(\n\t\t\t\tnew Select([\n\t\t\t\t\t'No, abort',\n\t\t\t\t\t`Yes, I want to${\n\t\t\t\t\t\ttablesToRemove.length > 0\n\t\t\t\t\t\t\t? ` remove ${tablesToRemove.length} ${tablesToRemove.length > 1 ? 'tables' : 'table'},`\n\t\t\t\t\t\t\t: ' '\n\t\t\t\t\t}${\n\t\t\t\t\t\tcolumnsToRemove.length > 0\n\t\t\t\t\t\t\t? ` remove ${columnsToRemove.length} ${columnsToRemove.length > 1 ? 'columns' : 'column'},`\n\t\t\t\t\t\t\t: ' '\n\t\t\t\t\t}${\n\t\t\t\t\t\ttablesToTruncate.length > 0\n\t\t\t\t\t\t\t? ` truncate ${tablesToTruncate.length} ${tablesToTruncate.length > 1 ? 'tables' : 'table'}`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}`\n\t\t\t\t\t\t.trimEnd()\n\t\t\t\t\t\t.replace(/(^,)|(,$)/g, '')\n\t\t\t\t\t\t.replace(/ +(?= )/g, ''),\n\t\t\t\t]),\n\t\t\t);\n\t\t\tif (data?.index === 0) {\n\t\t\t\trender(`[${chalk.red('x')}] All changes were aborted`);\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\n\t\tif (statementsToExecute.length === 0) {\n\t\t\trender(`\\n[${chalk.blue('i')}] No changes detected`);\n\t\t} else {\n\t\t\t// D1-HTTP does not support transactions\n\t\t\t// there might a be a better way to fix this\n\t\t\t// in the db connection itself\n\t\t\tconst isNotD1 = !('driver' in credentials && credentials.driver === 'd1-http');\n\t\t\tisNotD1 ?? await db.run('begin');\n\t\t\ttry {\n\t\t\t\tfor (const dStmnt of statementsToExecute) {\n\t\t\t\t\tawait db.run(dStmnt);\n\t\t\t\t}\n\t\t\t\tisNotD1 ?? await db.run('commit');\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\tisNotD1 ?? await db.run('rollback');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\trender(`[${chalk.green('✓')}] Changes applied`);\n\t\t}\n\t}\n};\n\nexport const libSQLPush = async (\n\tschemaPath: string | string[],\n\tverbose: boolean,\n\tstrict: boolean,\n\tcredentials: LibSQLCredentials,\n\ttablesFilter: string[],\n\tforce: boolean,\n\tcasing: CasingType | undefined,\n) => {\n\tconst { connectToLibSQL } = await import('../connections');\n\tconst { sqlitePushIntrospect } = await import('./sqliteIntrospect');\n\n\tconst db = await connectToLibSQL(credentials);\n\tconst { schema } = await sqlitePushIntrospect(db, tablesFilter);\n\n\tconst { prepareLibSQLPush } = await import('./migrate');\n\n\tconst statements = await prepareLibSQLPush(schemaPath, schema, casing);\n\n\tif (statements.sqlStatements.length === 0) {\n\t\trender(`\\n[${chalk.blue('i')}] No changes detected`);\n\t} else {\n\t\tconst {\n\t\t\tshouldAskForApprove,\n\t\t\tstatementsToExecute,\n\t\t\tcolumnsToRemove,\n\t\t\ttablesToRemove,\n\t\t\ttablesToTruncate,\n\t\t\tinfoToPrint,\n\t\t} = await libSqlLogSuggestionsAndReturn(\n\t\t\tdb,\n\t\t\tstatements.statements,\n\t\t\tstatements.squashedPrev,\n\t\t\tstatements.squashedCur,\n\t\t\tstatements.meta!,\n\t\t);\n\n\t\tif (verbose && statementsToExecute.length > 0) {\n\t\t\tconsole.log();\n\t\t\tconsole.log(\n\t\t\t\twithStyle.warning('You are about to execute current statements:'),\n\t\t\t);\n\t\t\tconsole.log();\n\t\t\tconsole.log(statementsToExecute.map((s) => chalk.blue(s)).join('\\n'));\n\t\t\tconsole.log();\n\t\t}\n\n\t\tif (!force && strict) {\n\t\t\tif (!shouldAskForApprove) {\n\t\t\t\tconst { status, data } = await render(\n\t\t\t\t\tnew Select(['No, abort', `Yes, I want to execute all statements`]),\n\t\t\t\t);\n\t\t\t\tif (data?.index === 0) {\n\t\t\t\t\trender(`[${chalk.red('x')}] All changes were aborted`);\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!force && shouldAskForApprove) {\n\t\t\tconsole.log(withStyle.warning('Found data-loss statements:'));\n\t\t\tconsole.log(infoToPrint.join('\\n'));\n\t\t\tconsole.log();\n\t\t\tconsole.log(\n\t\t\t\tchalk.red.bold(\n\t\t\t\t\t'THIS ACTION WILL CAUSE DATA LOSS AND CANNOT BE REVERTED\\n',\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconsole.log(chalk.white('Do you still want to push changes?'));\n\n\t\t\tconst { status, data } = await render(\n\t\t\t\tnew Select([\n\t\t\t\t\t'No, abort',\n\t\t\t\t\t`Yes, I want to${\n\t\t\t\t\t\ttablesToRemove.length > 0\n\t\t\t\t\t\t\t? ` remove ${tablesToRemove.length} ${tablesToRemove.length > 1 ? 'tables' : 'table'},`\n\t\t\t\t\t\t\t: ' '\n\t\t\t\t\t}${\n\t\t\t\t\t\tcolumnsToRemove.length > 0\n\t\t\t\t\t\t\t? ` remove ${columnsToRemove.length} ${columnsToRemove.length > 1 ? 'columns' : 'column'},`\n\t\t\t\t\t\t\t: ' '\n\t\t\t\t\t}${\n\t\t\t\t\t\ttablesToTruncate.length > 0\n\t\t\t\t\t\t\t? ` truncate ${tablesToTruncate.length} ${tablesToTruncate.length > 1 ? 'tables' : 'table'}`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}`\n\t\t\t\t\t\t.trimEnd()\n\t\t\t\t\t\t.replace(/(^,)|(,$)/g, '')\n\t\t\t\t\t\t.replace(/ +(?= )/g, ''),\n\t\t\t\t]),\n\t\t\t);\n\t\t\tif (data?.index === 0) {\n\t\t\t\trender(`[${chalk.red('x')}] All changes were aborted`);\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\n\t\tif (statementsToExecute.length === 0) {\n\t\t\trender(`\\n[${chalk.blue('i')}] No changes detected`);\n\t\t} else {\n\t\t\tawait db.batchWithPragma!(statementsToExecute);\n\t\t\trender(`[${chalk.green('✓')}] Changes applied`);\n\t\t}\n\t}\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/singlestoreIntrospect.ts",
    "content": "import { renderWithTask } from 'hanji';\nimport { Minimatch } from 'minimatch';\nimport { originUUID } from '../../global';\nimport type { SingleStoreSchema } from '../../serializer/singlestoreSchema';\nimport { fromDatabase } from '../../serializer/singlestoreSerializer';\nimport type { DB } from '../../utils';\nimport { ProgressView } from '../views';\n\nexport const singlestorePushIntrospect = async (\n\tdb: DB,\n\tdatabaseName: string,\n\tfilters: string[],\n) => {\n\tconst matchers = filters.map((it) => {\n\t\treturn new Minimatch(it);\n\t});\n\n\tconst filter = (tableName: string) => {\n\t\tif (matchers.length === 0) return true;\n\n\t\tlet flags: boolean[] = [];\n\n\t\tfor (let matcher of matchers) {\n\t\t\tif (matcher.negate) {\n\t\t\t\tif (!matcher.match(tableName)) {\n\t\t\t\t\tflags.push(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matcher.match(tableName)) {\n\t\t\t\tflags.push(true);\n\t\t\t}\n\t\t}\n\n\t\tif (flags.length > 0) {\n\t\t\treturn flags.every(Boolean);\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst progress = new ProgressView(\n\t\t'Pulling schema from database...',\n\t\t'Pulling schema from database...',\n\t);\n\tconst res = await renderWithTask(\n\t\tprogress,\n\t\tfromDatabase(db, databaseName, filter),\n\t);\n\n\tconst schema = { id: originUUID, prevId: '', ...res } as SingleStoreSchema;\n\tconst { internal, ...schemaWithoutInternals } = schema;\n\treturn { schema: schemaWithoutInternals };\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/singlestorePushUtils.ts",
    "content": "import chalk from 'chalk';\nimport { render } from 'hanji';\nimport { fromJson } from 'src/sqlgenerator';\nimport { TypeOf } from 'zod';\nimport { JsonAlterColumnTypeStatement, JsonStatement } from '../../jsonStatements';\nimport { Column, SingleStoreSchemaSquashed, SingleStoreSquasher } from '../../serializer/singlestoreSchema';\nimport { singlestoreSchema } from '../../serializer/singlestoreSchema';\nimport { type DB, findAddedAndRemoved } from '../../utils';\nimport { Select } from '../selector-ui';\nimport { withStyle } from '../validations/outputs';\n\nexport const filterStatements = (\n\tstatements: JsonStatement[],\n\tcurrentSchema: TypeOf<typeof singlestoreSchema>,\n\tprevSchema: TypeOf<typeof singlestoreSchema>,\n) => {\n\treturn statements.filter((statement) => {\n\t\tif (statement.type === 'alter_table_alter_column_set_type') {\n\t\t\t// Don't need to handle it on migrations step and introspection\n\t\t\t// but for both it should be skipped\n\t\t\tif (\n\t\t\t\tstatement.oldDataType.startsWith('tinyint')\n\t\t\t\t&& statement.newDataType.startsWith('boolean')\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tstatement.oldDataType.startsWith('bigint unsigned')\n\t\t\t\t&& statement.newDataType.startsWith('serial')\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tstatement.oldDataType.startsWith('serial')\n\t\t\t\t&& statement.newDataType.startsWith('bigint unsigned')\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_set_default') {\n\t\t\tif (\n\t\t\t\tstatement.newDefaultValue === false\n\t\t\t\t&& statement.oldDefaultValue === 0\n\t\t\t\t&& statement.newDataType === 'boolean'\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tstatement.newDefaultValue === true\n\t\t\t\t&& statement.oldDefaultValue === 1\n\t\t\t\t&& statement.newDataType === 'boolean'\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (statement.type === 'delete_unique_constraint') {\n\t\t\tconst unsquashed = SingleStoreSquasher.unsquashUnique(statement.data);\n\t\t\t// only if constraint was removed from a serial column, than treat it as removed\n\t\t\t// const serialStatement = statements.find(\n\t\t\t//   (it) => it.type === \"alter_table_alter_column_set_type\"\n\t\t\t// ) as JsonAlterColumnTypeStatement;\n\t\t\t// if (\n\t\t\t//   serialStatement?.oldDataType.startsWith(\"bigint unsigned\") &&\n\t\t\t//   serialStatement?.newDataType.startsWith(\"serial\") &&\n\t\t\t//   serialStatement.columnName ===\n\t\t\t//     SingleStoreSquasher.unsquashUnique(statement.data).columns[0]\n\t\t\t// ) {\n\t\t\t//   return false;\n\t\t\t// }\n\t\t\t// Check if uniqueindex was only on this column, that is serial\n\n\t\t\t// if now serial and was not serial and was unique index\n\t\t\tif (\n\t\t\t\tunsquashed.columns.length === 1\n\t\t\t\t&& currentSchema.tables[statement.tableName].columns[unsquashed.columns[0]]\n\t\t\t\t\t\t.type === 'serial'\n\t\t\t\t&& prevSchema.tables[statement.tableName].columns[unsquashed.columns[0]]\n\t\t\t\t\t\t.type === 'serial'\n\t\t\t\t&& currentSchema.tables[statement.tableName].columns[unsquashed.columns[0]]\n\t\t\t\t\t\t.name === unsquashed.columns[0]\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_drop_notnull') {\n\t\t\t// only if constraint was removed from a serial column, than treat it as removed\n\t\t\tconst serialStatement = statements.find(\n\t\t\t\t(it) => it.type === 'alter_table_alter_column_set_type',\n\t\t\t) as JsonAlterColumnTypeStatement;\n\t\t\tif (\n\t\t\t\tserialStatement?.oldDataType.startsWith('bigint unsigned')\n\t\t\t\t&& serialStatement?.newDataType.startsWith('serial')\n\t\t\t\t&& serialStatement.columnName === statement.columnName\n\t\t\t\t&& serialStatement.tableName === statement.tableName\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (statement.newDataType === 'serial' && !statement.columnNotNull) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (statement.columnAutoIncrement) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t});\n};\n\nexport function findColumnTypeAlternations(\n\tcolumns1: Record<string, Column>,\n\tcolumns2: Record<string, Column>,\n): string[] {\n\tconst changes: string[] = [];\n\n\tfor (const key in columns1) {\n\t\tif (columns1.hasOwnProperty(key) && columns2.hasOwnProperty(key)) {\n\t\t\tconst col1 = columns1[key];\n\t\t\tconst col2 = columns2[key];\n\t\t\tif (col1.type !== col2.type) {\n\t\t\t\tchanges.push(col2.name);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn changes;\n}\n\nexport const logSuggestionsAndReturn = async (\n\tdb: DB,\n\tstatements: JsonStatement[],\n\tjson2: TypeOf<typeof singlestoreSchema>,\n\tjson1: TypeOf<typeof singlestoreSchema>,\n) => {\n\tlet shouldAskForApprove = false;\n\tconst statementsToExecute: string[] = [];\n\tconst infoToPrint: string[] = [];\n\n\tconst tablesToRemove: string[] = [];\n\tconst columnsToRemove: string[] = [];\n\tconst schemasToRemove: string[] = [];\n\tconst tablesToTruncate: string[] = [];\n\n\tfor (const statement of statements) {\n\t\tif (statement.type === 'drop_table') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.tableName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} table with ${count} items`,\n\t\t\t\t);\n\t\t\t\ttablesToRemove.push(statement.tableName);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_drop_column') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.columnName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} column in ${statement.tableName} table with ${count} items`,\n\t\t\t\t);\n\t\t\t\tcolumnsToRemove.push(`${statement.tableName}_${statement.columnName}`);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'drop_schema') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from information_schema.tables where table_schema = \\`${statement.name}\\`;`,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.name,\n\t\t\t\t\t\t)\n\t\t\t\t\t} schema with ${count} tables`,\n\t\t\t\t);\n\t\t\t\tschemasToRemove.push(statement.name);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_set_type') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to change ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.columnName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} column type from ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.oldDataType,\n\t\t\t\t\t\t)\n\t\t\t\t\t} to ${chalk.underline(statement.newDataType)} with ${count} items`,\n\t\t\t\t);\n\t\t\t\tstatementsToExecute.push(`truncate table ${statement.tableName};`);\n\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_drop_default') {\n\t\t\tif (statement.columnNotNull) {\n\t\t\t\tconst res = await db.query(\n\t\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t\t);\n\n\t\t\t\tconst count = Number(res[0].count);\n\t\t\t\tif (count > 0) {\n\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t`· You're about to remove default value from ${\n\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\tstatement.columnName,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} not-null column with ${count} items`,\n\t\t\t\t\t);\n\n\t\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\t\tstatementsToExecute.push(`truncate table ${statement.tableName};`);\n\n\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// shouldAskForApprove = true;\n\t\t} else if (statement.type === 'alter_table_alter_column_set_notnull') {\n\t\t\tif (typeof statement.columnDefault === 'undefined') {\n\t\t\t\tconst res = await db.query(\n\t\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t\t);\n\n\t\t\t\tconst count = Number(res[0].count);\n\t\t\t\tif (count > 0) {\n\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t`· You're about to set not-null constraint to ${\n\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\tstatement.columnName,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} column without default, which contains ${count} items`,\n\t\t\t\t\t);\n\n\t\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\t\tstatementsToExecute.push(`truncate table ${statement.tableName};`);\n\n\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_drop_pk') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t);\n\n\t\t\t// if drop pk and json2 has autoincrement in table -> exit process with error\n\t\t\tif (\n\t\t\t\tObject.values(json2.tables[statement.tableName].columns).filter(\n\t\t\t\t\t(column) => column.autoincrement,\n\t\t\t\t).length > 0\n\t\t\t) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`${\n\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t`You have removed the primary key from a ${statement.tableName} table without removing the auto-increment property from this table. As the database error states: 'there can be only one auto column, and it must be defined as a key. Make sure to remove autoincrement from ${statement.tableName} table`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to change ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.tableName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} primary key. This statements may fail and you table may left without primary key`,\n\t\t\t\t);\n\n\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\t\t} else if (statement.type === 'delete_composite_pk') {\n\t\t\t// if drop pk and json2 has autoincrement in table -> exit process with error\n\t\t\tif (\n\t\t\t\tObject.values(json2.tables[statement.tableName].columns).filter(\n\t\t\t\t\t(column) => column.autoincrement,\n\t\t\t\t).length > 0\n\t\t\t) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`${\n\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t`You have removed the primary key from a ${statement.tableName} table without removing the auto-increment property from this table. As the database error states: 'there can be only one auto column, and it must be defined as a key. Make sure to remove autoincrement from ${statement.tableName} table`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_add_column') {\n\t\t\tif (\n\t\t\t\tstatement.column.notNull\n\t\t\t\t&& typeof statement.column.default === 'undefined'\n\t\t\t) {\n\t\t\t\tconst res = await db.query(\n\t\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t\t);\n\t\t\t\tconst count = Number(res[0].count);\n\t\t\t\tif (count > 0) {\n\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t`· You're about to add not-null ${\n\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\tstatement.column.name,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} column without default value, which contains ${count} items`,\n\t\t\t\t\t);\n\n\t\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\t\tstatementsToExecute.push(`truncate table ${statement.tableName};`);\n\n\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (statement.type === 'create_unique_constraint') {\n\t\t\tconst res = await db.query(\n\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tconst unsquashedUnique = SingleStoreSquasher.unsquashUnique(statement.data);\n\t\t\t\tconsole.log(\n\t\t\t\t\t`· You're about to add ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tunsquashedUnique.name,\n\t\t\t\t\t\t)\n\t\t\t\t\t} unique constraint to the table, which contains ${count} items. If this statement fails, you will receive an error from the database. Do you want to truncate ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.tableName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} table?\\n`,\n\t\t\t\t);\n\t\t\t\tconst { status, data } = await render(\n\t\t\t\t\tnew Select([\n\t\t\t\t\t\t'No, add the constraint without truncating the table',\n\t\t\t\t\t\t`Yes, truncate the table`,\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\tif (data?.index === 1) {\n\t\t\t\t\ttablesToTruncate.push(statement.tableName);\n\t\t\t\t\tstatementsToExecute.push(`truncate table ${statement.tableName};`);\n\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (statement.type === 'singlestore_recreate_table') {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tconst prevColumns = json1.tables[tableName].columns;\n\t\t\tconst currentColumns = json2.tables[tableName].columns;\n\t\t\tconst { removedColumns, addedColumns } = findAddedAndRemoved(\n\t\t\t\tObject.keys(prevColumns),\n\t\t\t\tObject.keys(currentColumns),\n\t\t\t);\n\n\t\t\tif (removedColumns.length) {\n\t\t\t\tfor (const removedColumn of removedColumns) {\n\t\t\t\t\tconst res = await db.query<{ count: string }>(\n\t\t\t\t\t\t`select count(\\`${tableName}\\`.\\`${removedColumn}\\`) as count from \\`${tableName}\\``,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst count = Number(res[0].count);\n\t\t\t\t\tif (count > 0) {\n\t\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\t\tremovedColumn,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} column in ${tableName} table with ${count} items`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcolumnsToRemove.push(removedColumn);\n\t\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (addedColumns.length) {\n\t\t\t\tfor (const addedColumn of addedColumns) {\n\t\t\t\t\tconst [res] = await db.query<{ count: string }>(\n\t\t\t\t\t\t`select count(*) as count from \\`${tableName}\\``,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst columnConf = json2.tables[tableName].columns[addedColumn];\n\n\t\t\t\t\tconst count = Number(res.count);\n\t\t\t\t\tif (count > 0 && columnConf.notNull && !columnConf.default) {\n\t\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t\t`· You're about to add not-null ${\n\t\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\t\taddedColumn,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} column without default value to table, which contains ${count} items`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t\t\ttablesToTruncate.push(tableName);\n\n\t\t\t\t\t\tstatementsToExecute.push(`TRUNCATE TABLE \\`${tableName}\\`;`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst columnWithChangedType = findColumnTypeAlternations(prevColumns, currentColumns);\n\t\t\tfor (const column of columnWithChangedType) {\n\t\t\t\tconst [res] = await db.query<{ count: string }>(\n\t\t\t\t\t`select count(*) as count from \\`${tableName}\\` WHERE \\`${tableName}\\`.\\`${column}\\` IS NOT NULL;`,\n\t\t\t\t);\n\n\t\t\t\tconst count = Number(res.count);\n\t\t\t\tif (count > 0) {\n\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t`· You're about recreate ${chalk.underline(tableName)} table with data type changing for ${\n\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} column, which contains ${count} items`,\n\t\t\t\t\t);\n\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t\ttablesToTruncate.push(tableName);\n\n\t\t\t\t\tstatementsToExecute.push(`TRUNCATE TABLE \\`${tableName}\\`;`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst stmnt = fromJson([statement], 'singlestore', 'push');\n\t\tif (typeof stmnt !== 'undefined') {\n\t\t\tstatementsToExecute.push(...stmnt);\n\t\t}\n\t}\n\n\treturn {\n\t\tstatementsToExecute,\n\t\tshouldAskForApprove,\n\t\tinfoToPrint,\n\t\tcolumnsToRemove: [...new Set(columnsToRemove)],\n\t\tschemasToRemove: [...new Set(schemasToRemove)],\n\t\ttablesToTruncate: [...new Set(tablesToTruncate)],\n\t\ttablesToRemove: [...new Set(tablesToRemove)],\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/singlestoreUp.ts",
    "content": "export const upSinglestoreHandler = (out: string) => {};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/sqliteIntrospect.ts",
    "content": "import { renderWithTask } from 'hanji';\nimport { Minimatch } from 'minimatch';\nimport { originUUID } from '../../global';\nimport { schemaToTypeScript } from '../../introspect-sqlite';\nimport type { SQLiteSchema } from '../../serializer/sqliteSchema';\nimport { fromDatabase } from '../../serializer/sqliteSerializer';\nimport type { SQLiteDB } from '../../utils';\nimport type { Casing } from '../validations/common';\nimport type { SqliteCredentials } from '../validations/sqlite';\nimport { IntrospectProgress, ProgressView } from '../views';\n\nexport const sqliteIntrospect = async (\n\tcredentials: SqliteCredentials,\n\tfilters: string[],\n\tcasing: Casing,\n) => {\n\tconst { connectToSQLite } = await import('../connections');\n\tconst db = await connectToSQLite(credentials);\n\n\tconst matchers = filters.map((it) => {\n\t\treturn new Minimatch(it);\n\t});\n\n\tconst filter = (tableName: string) => {\n\t\tif (matchers.length === 0) return true;\n\n\t\tlet flags: boolean[] = [];\n\n\t\tfor (let matcher of matchers) {\n\t\t\tif (matcher.negate) {\n\t\t\t\tif (!matcher.match(tableName)) {\n\t\t\t\t\tflags.push(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matcher.match(tableName)) {\n\t\t\t\tflags.push(true);\n\t\t\t}\n\t\t}\n\n\t\tif (flags.length > 0) {\n\t\t\treturn flags.every(Boolean);\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst progress = new IntrospectProgress();\n\tconst res = await renderWithTask(\n\t\tprogress,\n\t\tfromDatabase(db, filter, (stage, count, status) => {\n\t\t\tprogress.update(stage, count, status);\n\t\t}),\n\t);\n\n\tconst schema = { id: originUUID, prevId: '', ...res } as SQLiteSchema;\n\tconst ts = schemaToTypeScript(schema, casing);\n\treturn { schema, ts };\n};\n\nexport const sqlitePushIntrospect = async (db: SQLiteDB, filters: string[]) => {\n\tconst matchers = filters.map((it) => {\n\t\treturn new Minimatch(it);\n\t});\n\n\tconst filter = (tableName: string) => {\n\t\tif (matchers.length === 0) return true;\n\n\t\tlet flags: boolean[] = [];\n\n\t\tfor (let matcher of matchers) {\n\t\t\tif (matcher.negate) {\n\t\t\t\tif (!matcher.match(tableName)) {\n\t\t\t\t\tflags.push(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matcher.match(tableName)) {\n\t\t\t\tflags.push(true);\n\t\t\t}\n\t\t}\n\n\t\tif (flags.length > 0) {\n\t\t\treturn flags.every(Boolean);\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst progress = new ProgressView(\n\t\t'Pulling schema from database...',\n\t\t'Pulling schema from database...',\n\t);\n\tconst res = await renderWithTask(progress, fromDatabase(db, filter));\n\n\tconst schema = { id: originUUID, prevId: '', ...res } as SQLiteSchema;\n\treturn { schema };\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/sqlitePushUtils.ts",
    "content": "import chalk from 'chalk';\n\nimport { SQLiteSchemaInternal, SQLiteSchemaSquashed, SQLiteSquasher } from '../../serializer/sqliteSchema';\nimport {\n\tCreateSqliteIndexConvertor,\n\tfromJson,\n\tSQLiteCreateTableConvertor,\n\tSQLiteDropTableConvertor,\n\tSqliteRenameTableConvertor,\n} from '../../sqlgenerator';\n\nimport type { JsonStatement } from '../../jsonStatements';\nimport { findAddedAndRemoved, type SQLiteDB } from '../../utils';\n\nexport const _moveDataStatements = (\n\ttableName: string,\n\tjson: SQLiteSchemaSquashed,\n\tdataLoss: boolean = false,\n) => {\n\tconst statements: string[] = [];\n\n\tconst newTableName = `__new_${tableName}`;\n\n\t// create table statement from a new json2 with proper name\n\tconst tableColumns = Object.values(json.tables[tableName].columns);\n\tconst referenceData = Object.values(json.tables[tableName].foreignKeys);\n\tconst compositePKs = Object.values(\n\t\tjson.tables[tableName].compositePrimaryKeys,\n\t).map((it) => SQLiteSquasher.unsquashPK(it));\n\tconst checkConstraints = Object.values(json.tables[tableName].checkConstraints);\n\n\tconst mappedCheckConstraints: string[] = checkConstraints.map((it) =>\n\t\tit.replaceAll(`\"${tableName}\".`, `\"${newTableName}\".`)\n\t\t\t.replaceAll(`\\`${tableName}\\`.`, `\\`${newTableName}\\`.`)\n\t\t\t.replaceAll(`${tableName}.`, `${newTableName}.`)\n\t\t\t.replaceAll(`'${tableName}'.`, `\\`${newTableName}\\`.`)\n\t);\n\n\tconst fks = referenceData.map((it) => SQLiteSquasher.unsquashPushFK(it));\n\n\t// create new table\n\tstatements.push(\n\t\tnew SQLiteCreateTableConvertor().convert({\n\t\t\ttype: 'sqlite_create_table',\n\t\t\ttableName: newTableName,\n\t\t\tcolumns: tableColumns,\n\t\t\treferenceData: fks,\n\t\t\tcompositePKs,\n\t\t\tcheckConstraints: mappedCheckConstraints,\n\t\t}),\n\t);\n\n\t// move data\n\tif (!dataLoss) {\n\t\tconst columns = Object.keys(json.tables[tableName].columns).map(\n\t\t\t(c) => `\"${c}\"`,\n\t\t);\n\n\t\tstatements.push(\n\t\t\t`INSERT INTO \\`${newTableName}\\`(${\n\t\t\t\tcolumns.join(\n\t\t\t\t\t', ',\n\t\t\t\t)\n\t\t\t}) SELECT ${columns.join(', ')} FROM \\`${tableName}\\`;`,\n\t\t);\n\t}\n\n\tstatements.push(\n\t\tnew SQLiteDropTableConvertor().convert({\n\t\t\ttype: 'drop_table',\n\t\t\ttableName: tableName,\n\t\t\tschema: '',\n\t\t}),\n\t);\n\n\t// rename table\n\tstatements.push(\n\t\tnew SqliteRenameTableConvertor().convert({\n\t\t\tfromSchema: '',\n\t\t\ttableNameFrom: newTableName,\n\t\t\ttableNameTo: tableName,\n\t\t\ttoSchema: '',\n\t\t\ttype: 'rename_table',\n\t\t}),\n\t);\n\n\tfor (const idx of Object.values(json.tables[tableName].indexes)) {\n\t\tstatements.push(\n\t\t\tnew CreateSqliteIndexConvertor().convert({\n\t\t\t\ttype: 'create_index',\n\t\t\t\ttableName: tableName,\n\t\t\t\tschema: '',\n\t\t\t\tdata: idx,\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn statements;\n};\n\nexport const getOldTableName = (\n\ttableName: string,\n\tmeta: SQLiteSchemaInternal['_meta'],\n) => {\n\tfor (const key of Object.keys(meta.tables)) {\n\t\tconst value = meta.tables[key];\n\t\tif (`\"${tableName}\"` === value) {\n\t\t\treturn key.substring(1, key.length - 1);\n\t\t}\n\t}\n\treturn tableName;\n};\n\nexport const getNewTableName = (\n\ttableName: string,\n\tmeta: SQLiteSchemaInternal['_meta'],\n) => {\n\tif (typeof meta.tables[`\"${tableName}\"`] !== 'undefined') {\n\t\treturn meta.tables[`\"${tableName}\"`].substring(\n\t\t\t1,\n\t\t\tmeta.tables[`\"${tableName}\"`].length - 1,\n\t\t);\n\t}\n\treturn tableName;\n};\n\nexport const logSuggestionsAndReturn = async (\n\tconnection: SQLiteDB,\n\tstatements: JsonStatement[],\n\tjson1: SQLiteSchemaSquashed,\n\tjson2: SQLiteSchemaSquashed,\n\tmeta: SQLiteSchemaInternal['_meta'],\n) => {\n\tlet shouldAskForApprove = false;\n\tconst statementsToExecute: string[] = [];\n\tconst infoToPrint: string[] = [];\n\n\tconst tablesToRemove: string[] = [];\n\tconst columnsToRemove: string[] = [];\n\tconst schemasToRemove: string[] = [];\n\tconst tablesToTruncate: string[] = [];\n\n\tfor (const statement of statements) {\n\t\tif (statement.type === 'drop_table') {\n\t\t\tconst res = await connection.query<{ count: string }>(\n\t\t\t\t`select count(*) as count from \\`${statement.tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tstatement.tableName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} table with ${count} items`,\n\t\t\t\t);\n\t\t\t\ttablesToRemove.push(statement.tableName);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\n\t\t\tconst fromJsonStatement = fromJson([statement], 'sqlite', 'push');\n\t\t\tstatementsToExecute.push(\n\t\t\t\t...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]),\n\t\t\t);\n\t\t} else if (statement.type === 'alter_table_drop_column') {\n\t\t\tconst tableName = statement.tableName;\n\t\t\tconst columnName = statement.columnName;\n\n\t\t\tconst res = await connection.query<{ count: string }>(\n\t\t\t\t`select count(\\`${tableName}\\`.\\`${columnName}\\`) as count from \\`${tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tcolumnName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} column in ${tableName} table with ${count} items`,\n\t\t\t\t);\n\t\t\t\tcolumnsToRemove.push(`${tableName}_${statement.columnName}`);\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\n\t\t\tconst fromJsonStatement = fromJson([statement], 'sqlite', 'push');\n\t\t\tstatementsToExecute.push(\n\t\t\t\t...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]),\n\t\t\t);\n\t\t} else if (\n\t\t\tstatement.type === 'sqlite_alter_table_add_column'\n\t\t\t&& (statement.column.notNull && !statement.column.default)\n\t\t) {\n\t\t\tconst tableName = statement.tableName;\n\t\t\tconst columnName = statement.column.name;\n\t\t\tconst res = await connection.query<{ count: string }>(\n\t\t\t\t`select count(*) as count from \\`${tableName}\\``,\n\t\t\t);\n\t\t\tconst count = Number(res[0].count);\n\t\t\tif (count > 0) {\n\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t`· You're about to add not-null ${\n\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\tcolumnName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} column without default value, which contains ${count} items`,\n\t\t\t\t);\n\n\t\t\t\ttablesToTruncate.push(tableName);\n\t\t\t\tstatementsToExecute.push(`delete from ${tableName};`);\n\n\t\t\t\tshouldAskForApprove = true;\n\t\t\t}\n\n\t\t\tconst fromJsonStatement = fromJson([statement], 'sqlite', 'push');\n\t\t\tstatementsToExecute.push(\n\t\t\t\t...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]),\n\t\t\t);\n\t\t} else if (statement.type === 'recreate_table') {\n\t\t\tconst tableName = statement.tableName;\n\t\t\tconst oldTableName = getOldTableName(tableName, meta);\n\n\t\t\tlet dataLoss = false;\n\n\t\t\tconst prevColumnNames = Object.keys(json1.tables[oldTableName].columns);\n\t\t\tconst currentColumnNames = Object.keys(json2.tables[tableName].columns);\n\t\t\tconst { removedColumns, addedColumns } = findAddedAndRemoved(\n\t\t\t\tprevColumnNames,\n\t\t\t\tcurrentColumnNames,\n\t\t\t);\n\n\t\t\tif (removedColumns.length) {\n\t\t\t\tfor (const removedColumn of removedColumns) {\n\t\t\t\t\tconst res = await connection.query<{ count: string }>(\n\t\t\t\t\t\t`select count(\\`${tableName}\\`.\\`${removedColumn}\\`) as count from \\`${tableName}\\``,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst count = Number(res[0].count);\n\t\t\t\t\tif (count > 0) {\n\t\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t\t`· You're about to delete ${\n\t\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\t\tremovedColumn,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} column in ${tableName} table with ${count} items`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcolumnsToRemove.push(removedColumn);\n\t\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (addedColumns.length) {\n\t\t\t\tfor (const addedColumn of addedColumns) {\n\t\t\t\t\tconst [res] = await connection.query<{ count: string }>(\n\t\t\t\t\t\t`select count(*) as count from \\`${tableName}\\``,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst columnConf = json2.tables[tableName].columns[addedColumn];\n\n\t\t\t\t\tconst count = Number(res.count);\n\t\t\t\t\tif (count > 0 && columnConf.notNull && !columnConf.default) {\n\t\t\t\t\t\tdataLoss = true;\n\t\t\t\t\t\tinfoToPrint.push(\n\t\t\t\t\t\t\t`· You're about to add not-null ${\n\t\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\t\taddedColumn,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} column without default value to table, which contains ${count} items`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tshouldAskForApprove = true;\n\t\t\t\t\t\ttablesToTruncate.push(tableName);\n\n\t\t\t\t\t\tstatementsToExecute.push(`DELETE FROM \\`${tableName}\\`;`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// check if some tables referencing current for pragma\n\t\t\tconst tablesReferencingCurrent: string[] = [];\n\n\t\t\tfor (const table of Object.values(json2.tables)) {\n\t\t\t\tconst tablesRefs = Object.values(json2.tables[table.name].foreignKeys)\n\t\t\t\t\t.filter((t) => SQLiteSquasher.unsquashPushFK(t).tableTo === tableName)\n\t\t\t\t\t.map((it) => SQLiteSquasher.unsquashPushFK(it).tableFrom);\n\n\t\t\t\ttablesReferencingCurrent.push(...tablesRefs);\n\t\t\t}\n\n\t\t\tif (!tablesReferencingCurrent.length) {\n\t\t\t\tstatementsToExecute.push(..._moveDataStatements(tableName, json2, dataLoss));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [{ foreign_keys: pragmaState }] = await connection.query<{\n\t\t\t\tforeign_keys: number;\n\t\t\t}>(`PRAGMA foreign_keys;`);\n\n\t\t\tif (pragmaState) {\n\t\t\t\tstatementsToExecute.push(`PRAGMA foreign_keys=OFF;`);\n\t\t\t}\n\t\t\tstatementsToExecute.push(..._moveDataStatements(tableName, json2, dataLoss));\n\t\t\tif (pragmaState) {\n\t\t\t\tstatementsToExecute.push(`PRAGMA foreign_keys=ON;`);\n\t\t\t}\n\t\t} else {\n\t\t\tconst fromJsonStatement = fromJson([statement], 'sqlite', 'push');\n\t\t\tstatementsToExecute.push(\n\t\t\t\t...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]),\n\t\t\t);\n\t\t}\n\t}\n\n\treturn {\n\t\tstatementsToExecute,\n\t\tshouldAskForApprove,\n\t\tinfoToPrint,\n\t\tcolumnsToRemove: [...new Set(columnsToRemove)],\n\t\tschemasToRemove: [...new Set(schemasToRemove)],\n\t\ttablesToTruncate: [...new Set(tablesToTruncate)],\n\t\ttablesToRemove: [...new Set(tablesToRemove)],\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/sqliteUp.ts",
    "content": "import chalk from 'chalk';\nimport { writeFileSync } from 'fs';\nimport { mapEntries } from 'src/global';\nimport { SQLiteSchema, sqliteSchemaV5 } from 'src/serializer/sqliteSchema';\nimport { prepareOutFolder, validateWithReport } from 'src/utils';\n\nexport const upSqliteHandler = (out: string) => {\n\tconst { snapshots } = prepareOutFolder(out, 'sqlite');\n\tconst report = validateWithReport(snapshots, 'sqlite');\n\n\treport.nonLatest\n\t\t.map((it) => ({\n\t\t\tpath: it,\n\t\t\traw: report.rawMap[it]!! as Record<string, any>,\n\t\t}))\n\t\t.forEach((it) => {\n\t\t\tconst path = it.path;\n\t\t\tconst result = updateUpToV6(it.raw);\n\n\t\t\tconsole.log(`[${chalk.green('✓')}] ${path}`);\n\n\t\t\twriteFileSync(path, JSON.stringify(result, null, 2));\n\t\t});\n\n\tconsole.log(\"Everything's fine 🐶🔥\");\n};\n\nconst updateUpToV6 = (json: Record<string, any>): SQLiteSchema => {\n\tconst schema = sqliteSchemaV5.parse(json);\n\n\tconst tables = mapEntries(schema.tables, (tableKey, table) => {\n\t\tconst columns = mapEntries(table.columns, (key, value) => {\n\t\t\tif (\n\t\t\t\tvalue.default\n\t\t\t\t&& (typeof value.default === 'object' || Array.isArray(value.default))\n\t\t\t) {\n\t\t\t\tvalue.default = `'${JSON.stringify(value.default)}'`;\n\t\t\t}\n\t\t\treturn [key, value];\n\t\t});\n\t\ttable.columns = columns;\n\t\treturn [tableKey, table];\n\t});\n\n\treturn {\n\t\t...schema,\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: tables,\n\t\tviews: {},\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/commands/utils.ts",
    "content": "import chalk from 'chalk';\nimport { existsSync } from 'fs';\nimport { render } from 'hanji';\nimport { join, resolve } from 'path';\nimport { object, string } from 'zod';\nimport { getTablesFilterByExtensions } from '../../extensions/getTablesFilterByExtensions';\nimport { assertUnreachable } from '../../global';\nimport { type Dialect, dialect } from '../../schemaValidator';\nimport { prepareFilenames } from '../../serializer';\nimport type { Entities } from '../validations/cli';\nimport { pullParams, pushParams } from '../validations/cli';\nimport type { Casing, CasingType, CliConfig, Driver, Prefix } from '../validations/common';\nimport { configCommonSchema, configMigrations, wrapParam } from '../validations/common';\nimport type { GelCredentials } from '../validations/gel';\nimport { gelCredentials, printConfigConnectionIssues as printIssuesGel } from '../validations/gel';\nimport type { LibSQLCredentials } from '../validations/libsql';\nimport { libSQLCredentials, printConfigConnectionIssues as printIssuesLibSQL } from '../validations/libsql';\nimport type { MysqlCredentials } from '../validations/mysql';\nimport { mysqlCredentials, printConfigConnectionIssues as printIssuesMysql } from '../validations/mysql';\nimport { outputs } from '../validations/outputs';\nimport type { PostgresCredentials } from '../validations/postgres';\nimport { postgresCredentials, printConfigConnectionIssues as printIssuesPg } from '../validations/postgres';\nimport type { SingleStoreCredentials } from '../validations/singlestore';\nimport {\n\tprintConfigConnectionIssues as printIssuesSingleStore,\n\tsinglestoreCredentials,\n} from '../validations/singlestore';\nimport type { SqliteCredentials } from '../validations/sqlite';\nimport { printConfigConnectionIssues as printIssuesSqlite, sqliteCredentials } from '../validations/sqlite';\nimport { studioCliParams, studioConfig } from '../validations/studio';\nimport { error } from '../views';\n\n// NextJs default config is target: es5, which esbuild-register can't consume\nconst assertES5 = async () => {\n\ttry {\n\t\tawait import('./_es5');\n\t} catch (e: any) {\n\t\tif ('errors' in e && Array.isArray(e.errors) && e.errors.length > 0) {\n\t\t\tconst es5Error = (e.errors as any[]).filter((it) => it.text?.includes(`(\"es5\") is not supported yet`)).length > 0;\n\t\t\tif (es5Error) {\n\t\t\t\tconsole.log(\n\t\t\t\t\terror(\n\t\t\t\t\t\t`Please change compilerOptions.target from 'es5' to 'es6' or above in your tsconfig.json`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\t\tconsole.error(e);\n\t\tprocess.exit(1);\n\t}\n};\n\nexport class InMemoryMutex {\n\tprivate lockPromise: Promise<void> | null = null;\n\n\tasync withLock<T>(fn: () => Promise<T>): Promise<T> {\n\t\t// Wait for any existing lock\n\t\twhile (this.lockPromise) {\n\t\t\tawait this.lockPromise;\n\t\t}\n\n\t\tlet resolveLock: (() => void) | undefined;\n\t\tthis.lockPromise = new Promise<void>((resolve) => {\n\t\t\tresolveLock = resolve;\n\t\t});\n\n\t\ttry {\n\t\t\treturn await fn();\n\t\t} finally {\n\t\t\tthis.lockPromise = null;\n\t\t\tresolveLock!(); // non-null assertion: TS now knows it's definitely assigned\n\t\t}\n\t}\n}\n\nconst registerMutex = new InMemoryMutex();\n\nlet tsxRegistered = false;\nconst ensureTsxRegistered = () => {\n\tif (tsxRegistered) return;\n\n\tconst isBun = typeof (globalThis as any).Bun !== 'undefined';\n\tconst isDeno = typeof (globalThis as any).Deno !== 'undefined';\n\tif (isBun || isDeno) {\n\t\ttsxRegistered = true;\n\t\treturn;\n\t}\n\n\tconst tsx = require('tsx/cjs/api');\n\ttsx.register();\n\ttsxRegistered = true;\n};\n\nexport const safeRegister = async <T>(fn: () => Promise<T>) => {\n\treturn registerMutex.withLock(async () => {\n\t\tensureTsxRegistered();\n\t\tawait assertES5();\n\t\treturn fn();\n\t});\n};\n\nexport const prepareCheckParams = async (\n\toptions: {\n\t\tconfig?: string;\n\t\tdialect?: Dialect;\n\t\tout?: string;\n\t},\n\tfrom: 'cli' | 'config',\n): Promise<{ out: string; dialect: Dialect }> => {\n\tconst config = from === 'config'\n\t\t? await drizzleConfigFromFile(options.config as string | undefined)\n\t\t: options;\n\n\tif (!config.out || !config.dialect) {\n\t\tlet text = `Please provide required params for AWS Data API driver:\\n`;\n\t\tconsole.log(error(text));\n\t\tconsole.log(wrapParam('database', config.out));\n\t\tconsole.log(wrapParam('secretArn', config.dialect));\n\t\tprocess.exit(1);\n\t}\n\treturn { out: config.out, dialect: config.dialect };\n};\n\nexport const prepareDropParams = async (\n\toptions: {\n\t\tconfig?: string;\n\t\tout?: string;\n\t\tdriver?: Driver;\n\t\tdialect?: Dialect;\n\t},\n\tfrom: 'cli' | 'config',\n): Promise<{ out: string; bundle: boolean }> => {\n\tconst config = from === 'config'\n\t\t? await drizzleConfigFromFile(options.config as string | undefined)\n\t\t: options;\n\n\tif (config.dialect === 'gel') {\n\t\tconsole.log(\n\t\t\terror(\n\t\t\t\t`You can't use 'drop' command with Gel dialect`,\n\t\t\t),\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\treturn { out: config.out || 'drizzle', bundle: config.driver === 'expo' };\n};\n\nexport type GenerateConfig = {\n\tdialect: Dialect;\n\tschema: string | string[];\n\tout: string;\n\tbreakpoints: boolean;\n\tname?: string;\n\tprefix: Prefix;\n\tcustom: boolean;\n\tbundle: boolean;\n\tcasing?: CasingType;\n\tdriver?: Driver;\n};\n\nexport type ExportConfig = {\n\tdialect: Dialect;\n\tschema: string | string[];\n\tsql: boolean;\n};\n\nexport const prepareGenerateConfig = async (\n\toptions: {\n\t\tconfig?: string;\n\t\tschema?: string;\n\t\tout?: string;\n\t\tbreakpoints?: boolean;\n\t\tcustom?: boolean;\n\t\tname?: string;\n\t\tdialect?: Dialect;\n\t\tdriver?: Driver;\n\t\tprefix?: Prefix;\n\t\tcasing?: CasingType;\n\t},\n\tfrom: 'config' | 'cli',\n): Promise<GenerateConfig> => {\n\tconst config = from === 'config' ? await drizzleConfigFromFile(options.config) : options;\n\n\tconst { schema, out, breakpoints, dialect, driver, casing } = config;\n\n\tif (!schema || !dialect) {\n\t\tconsole.log(error('Please provide required params:'));\n\t\tconsole.log(wrapParam('schema', schema));\n\t\tconsole.log(wrapParam('dialect', dialect));\n\t\tconsole.log(wrapParam('out', out, true));\n\t\tprocess.exit(1);\n\t}\n\n\tconst fileNames = prepareFilenames(schema);\n\tif (fileNames.length === 0) {\n\t\trender(`[${chalk.blue('i')}] No schema file in ${schema} was found`);\n\t\tprocess.exit(0);\n\t}\n\n\tconst prefix = ('migrations' in config ? config.migrations?.prefix : options.prefix)\n\t\t|| 'index';\n\n\treturn {\n\t\tdialect: dialect,\n\t\tname: options.name,\n\t\tcustom: options.custom || false,\n\t\tprefix,\n\t\tbreakpoints: breakpoints ?? true,\n\t\tschema: schema,\n\t\tout: out || 'drizzle',\n\t\tbundle: driver === 'expo' || driver === 'durable-sqlite',\n\t\tcasing,\n\t\tdriver,\n\t};\n};\n\nexport const prepareExportConfig = async (\n\toptions: {\n\t\tconfig?: string;\n\t\tschema?: string;\n\t\tdialect?: Dialect;\n\t\tsql: boolean;\n\t},\n\tfrom: 'config' | 'cli',\n): Promise<ExportConfig> => {\n\tconst config = from === 'config' ? await drizzleConfigFromFile(options.config, true) : options;\n\n\tconst { schema, dialect, sql } = config;\n\n\tif (!schema || !dialect) {\n\t\tconsole.log(error('Please provide required params:'));\n\t\tconsole.log(wrapParam('schema', schema));\n\t\tconsole.log(wrapParam('dialect', dialect));\n\t\tprocess.exit(1);\n\t}\n\n\tconst fileNames = prepareFilenames(schema);\n\tif (fileNames.length === 0) {\n\t\trender(`[${chalk.blue('i')}] No schema file in ${schema} was found`);\n\t\tprocess.exit(0);\n\t}\n\treturn {\n\t\tdialect: dialect,\n\t\tschema: schema,\n\t\tsql: sql,\n\t};\n};\n\nexport const flattenDatabaseCredentials = (config: any) => {\n\tif ('dbCredentials' in config) {\n\t\tconst { dbCredentials, ...rest } = config;\n\t\treturn {\n\t\t\t...rest,\n\t\t\t...dbCredentials,\n\t\t};\n\t}\n\treturn config;\n};\n\nconst flattenPull = (config: any) => {\n\tif ('dbCredentials' in config) {\n\t\tconst { dbCredentials, introspect, ...rest } = config;\n\t\treturn {\n\t\t\t...rest,\n\t\t\t...dbCredentials,\n\t\t\tcasing: introspect?.casing,\n\t\t};\n\t}\n\treturn config;\n};\n\nexport const preparePushConfig = async (\n\toptions: Record<string, unknown>,\n\tfrom: 'cli' | 'config',\n): Promise<\n\t(\n\t\t| {\n\t\t\tdialect: 'mysql';\n\t\t\tcredentials: MysqlCredentials;\n\t\t}\n\t\t| {\n\t\t\tdialect: 'postgresql';\n\t\t\tcredentials: PostgresCredentials;\n\t\t}\n\t\t| {\n\t\t\tdialect: 'sqlite';\n\t\t\tcredentials: SqliteCredentials;\n\t\t}\n\t\t| {\n\t\t\tdialect: 'turso';\n\t\t\tcredentials: LibSQLCredentials;\n\t\t}\n\t\t| {\n\t\t\tdialect: 'singlestore';\n\t\t\tcredentials: SingleStoreCredentials;\n\t\t}\n\t) & {\n\t\tschemaPath: string | string[];\n\t\tverbose: boolean;\n\t\tstrict: boolean;\n\t\tforce: boolean;\n\t\ttablesFilter: string[];\n\t\tschemasFilter: string[];\n\t\tcasing?: CasingType;\n\t\tentities?: Entities;\n\t}\n> => {\n\tconst raw = flattenDatabaseCredentials(\n\t\tfrom === 'config'\n\t\t\t? await drizzleConfigFromFile(options.config as string | undefined)\n\t\t\t: options,\n\t);\n\n\traw.verbose ||= options.verbose; // if provided in cli to debug\n\traw.strict ||= options.strict; // if provided in cli only\n\n\tconst parsed = pushParams.safeParse(raw);\n\n\tif (parsed.error) {\n\t\tconsole.log(error('Please provide required params:'));\n\t\tconsole.log(wrapParam('dialect', raw.dialect));\n\t\tconsole.log(wrapParam('schema', raw.schema));\n\t\tprocess.exit(1);\n\t}\n\n\tconst config = parsed.data;\n\n\tconst schemaFiles = prepareFilenames(config.schema);\n\tif (schemaFiles.length === 0) {\n\t\trender(`[${chalk.blue('i')}] No schema file in ${config.schema} was found`);\n\t\tprocess.exit(0);\n\t}\n\n\tconst tablesFilterConfig = config.tablesFilter;\n\tconst tablesFilter = tablesFilterConfig\n\t\t? typeof tablesFilterConfig === 'string'\n\t\t\t? [tablesFilterConfig]\n\t\t\t: tablesFilterConfig\n\t\t: [];\n\n\tconst schemasFilterConfig = config.schemaFilter;\n\n\tconst schemasFilter = schemasFilterConfig\n\t\t? typeof schemasFilterConfig === 'string'\n\t\t\t? [schemasFilterConfig]\n\t\t\t: schemasFilterConfig\n\t\t: [];\n\n\ttablesFilter.push(...getTablesFilterByExtensions(config));\n\n\tif (config.dialect === 'postgresql') {\n\t\tconst parsed = postgresCredentials.safeParse(config);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesPg(config);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\treturn {\n\t\t\tdialect: 'postgresql',\n\t\t\tschemaPath: config.schema,\n\t\t\tstrict: config.strict ?? false,\n\t\t\tverbose: config.verbose ?? false,\n\t\t\tforce: (options.force as boolean) ?? false,\n\t\t\tcredentials: parsed.data,\n\t\t\tcasing: config.casing,\n\t\t\ttablesFilter,\n\t\t\tschemasFilter,\n\t\t\tentities: config.entities,\n\t\t};\n\t}\n\n\tif (config.dialect === 'mysql') {\n\t\tconst parsed = mysqlCredentials.safeParse(config);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesMysql(config);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\treturn {\n\t\t\tdialect: 'mysql',\n\t\t\tschemaPath: config.schema,\n\t\t\tstrict: config.strict ?? false,\n\t\t\tverbose: config.verbose ?? false,\n\t\t\tforce: (options.force as boolean) ?? false,\n\t\t\tcredentials: parsed.data,\n\t\t\tcasing: config.casing,\n\t\t\ttablesFilter,\n\t\t\tschemasFilter,\n\t\t};\n\t}\n\n\tif (config.dialect === 'singlestore') {\n\t\tconst parsed = singlestoreCredentials.safeParse(config);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesSingleStore(config);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\treturn {\n\t\t\tdialect: 'singlestore',\n\t\t\tschemaPath: config.schema,\n\t\t\tstrict: config.strict ?? false,\n\t\t\tverbose: config.verbose ?? false,\n\t\t\tforce: (options.force as boolean) ?? false,\n\t\t\tcredentials: parsed.data,\n\t\t\ttablesFilter,\n\t\t\tschemasFilter,\n\t\t};\n\t}\n\n\tif (config.dialect === 'sqlite') {\n\t\tconst parsed = sqliteCredentials.safeParse(config);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesSqlite(config, 'push');\n\t\t\tprocess.exit(1);\n\t\t}\n\t\treturn {\n\t\t\tdialect: 'sqlite',\n\t\t\tschemaPath: config.schema,\n\t\t\tstrict: config.strict ?? false,\n\t\t\tverbose: config.verbose ?? false,\n\t\t\tforce: (options.force as boolean) ?? false,\n\t\t\tcredentials: parsed.data,\n\t\t\tcasing: config.casing,\n\t\t\ttablesFilter,\n\t\t\tschemasFilter,\n\t\t};\n\t}\n\n\tif (config.dialect === 'turso') {\n\t\tconst parsed = libSQLCredentials.safeParse(config);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesSqlite(config, 'push');\n\t\t\tprocess.exit(1);\n\t\t}\n\t\treturn {\n\t\t\tdialect: 'turso',\n\t\t\tschemaPath: config.schema,\n\t\t\tstrict: config.strict ?? false,\n\t\t\tverbose: config.verbose ?? false,\n\t\t\tforce: (options.force as boolean) ?? false,\n\t\t\tcredentials: parsed.data,\n\t\t\tcasing: config.casing,\n\t\t\ttablesFilter,\n\t\t\tschemasFilter,\n\t\t};\n\t}\n\n\tif (config.dialect === 'gel') {\n\t\tconsole.log(\n\t\t\terror(\n\t\t\t\t`You can't use 'push' command with Gel dialect`,\n\t\t\t),\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\tassertUnreachable(config.dialect);\n};\n\nexport const preparePullConfig = async (\n\toptions: Record<string, unknown>,\n\tfrom: 'cli' | 'config',\n): Promise<\n\t(\n\t\t| {\n\t\t\tdialect: 'mysql';\n\t\t\tcredentials: MysqlCredentials;\n\t\t}\n\t\t| {\n\t\t\tdialect: 'postgresql';\n\t\t\tcredentials: PostgresCredentials;\n\t\t}\n\t\t| {\n\t\t\tdialect: 'sqlite';\n\t\t\tcredentials: SqliteCredentials;\n\t\t}\n\t\t| {\n\t\t\tdialect: 'turso';\n\t\t\tcredentials: LibSQLCredentials;\n\t\t}\n\t\t| {\n\t\t\tdialect: 'singlestore';\n\t\t\tcredentials: SingleStoreCredentials;\n\t\t}\n\t\t| {\n\t\t\tdialect: 'gel';\n\t\t\tcredentials?: GelCredentials;\n\t\t}\n\t) & {\n\t\tout: string;\n\t\tbreakpoints: boolean;\n\t\tcasing: Casing;\n\t\ttablesFilter: string[];\n\t\tschemasFilter: string[];\n\t\tprefix: Prefix;\n\t\tentities: Entities;\n\t}\n> => {\n\tconst raw = flattenPull(\n\t\tfrom === 'config'\n\t\t\t? await drizzleConfigFromFile(options.config as string | undefined)\n\t\t\t: options,\n\t);\n\tconst parsed = pullParams.safeParse(raw);\n\n\tif (parsed.error) {\n\t\tconsole.log(error('Please provide required params:'));\n\t\tconsole.log(wrapParam('dialect', raw.dialect));\n\t\tprocess.exit(1);\n\t}\n\n\tconst config = parsed.data;\n\tconst dialect = config.dialect;\n\n\tconst tablesFilterConfig = config.tablesFilter;\n\tconst tablesFilter = tablesFilterConfig\n\t\t? typeof tablesFilterConfig === 'string'\n\t\t\t? [tablesFilterConfig]\n\t\t\t: tablesFilterConfig\n\t\t: [];\n\n\tif (config.extensionsFilters) {\n\t\tif (\n\t\t\tconfig.extensionsFilters.includes('postgis')\n\t\t\t&& dialect === 'postgresql'\n\t\t) {\n\t\t\ttablesFilter.push(\n\t\t\t\t...['!geography_columns', '!geometry_columns', '!spatial_ref_sys'],\n\t\t\t);\n\t\t}\n\t}\n\n\tconst schemasFilterConfig = config.schemaFilter; // TODO: consistent naming\n\tconst schemasFilter = schemasFilterConfig\n\t\t? typeof schemasFilterConfig === 'string'\n\t\t\t? [schemasFilterConfig]\n\t\t\t: schemasFilterConfig\n\t\t: [];\n\n\tif (dialect === 'postgresql') {\n\t\tconst parsed = postgresCredentials.safeParse(config);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesPg(config);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\treturn {\n\t\t\tdialect: 'postgresql',\n\t\t\tout: config.out,\n\t\t\tbreakpoints: config.breakpoints,\n\t\t\tcasing: config.casing,\n\t\t\tcredentials: parsed.data,\n\t\t\ttablesFilter,\n\t\t\tschemasFilter,\n\t\t\tprefix: config.migrations?.prefix || 'index',\n\t\t\tentities: config.entities,\n\t\t};\n\t}\n\n\tif (dialect === 'mysql') {\n\t\tconst parsed = mysqlCredentials.safeParse(config);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesMysql(config);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\treturn {\n\t\t\tdialect: 'mysql',\n\t\t\tout: config.out,\n\t\t\tbreakpoints: config.breakpoints,\n\t\t\tcasing: config.casing,\n\t\t\tcredentials: parsed.data,\n\t\t\ttablesFilter,\n\t\t\tschemasFilter,\n\t\t\tprefix: config.migrations?.prefix || 'index',\n\t\t\tentities: config.entities,\n\t\t};\n\t}\n\n\tif (dialect === 'singlestore') {\n\t\tconst parsed = singlestoreCredentials.safeParse(config);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesSingleStore(config);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\treturn {\n\t\t\tdialect: 'singlestore',\n\t\t\tout: config.out,\n\t\t\tbreakpoints: config.breakpoints,\n\t\t\tcasing: config.casing,\n\t\t\tcredentials: parsed.data,\n\t\t\ttablesFilter,\n\t\t\tschemasFilter,\n\t\t\tprefix: config.migrations?.prefix || 'index',\n\t\t\tentities: config.entities,\n\t\t};\n\t}\n\n\tif (dialect === 'sqlite') {\n\t\tconst parsed = sqliteCredentials.safeParse(config);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesSqlite(config, 'pull');\n\t\t\tprocess.exit(1);\n\t\t}\n\t\treturn {\n\t\t\tdialect: 'sqlite',\n\t\t\tout: config.out,\n\t\t\tbreakpoints: config.breakpoints,\n\t\t\tcasing: config.casing,\n\t\t\tcredentials: parsed.data,\n\t\t\ttablesFilter,\n\t\t\tschemasFilter,\n\t\t\tprefix: config.migrations?.prefix || 'index',\n\t\t\tentities: config.entities,\n\t\t};\n\t}\n\n\tif (dialect === 'turso') {\n\t\tconst parsed = libSQLCredentials.safeParse(config);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesLibSQL(config, 'pull');\n\t\t\tprocess.exit(1);\n\t\t}\n\t\treturn {\n\t\t\tdialect,\n\t\t\tout: config.out,\n\t\t\tbreakpoints: config.breakpoints,\n\t\t\tcasing: config.casing,\n\t\t\tcredentials: parsed.data,\n\t\t\ttablesFilter,\n\t\t\tschemasFilter,\n\t\t\tprefix: config.migrations?.prefix || 'index',\n\t\t\tentities: config.entities,\n\t\t};\n\t}\n\n\tif (dialect === 'gel') {\n\t\tconst parsed = gelCredentials.safeParse(config);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesGel(config);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\treturn {\n\t\t\tdialect,\n\t\t\tout: config.out,\n\t\t\tbreakpoints: config.breakpoints,\n\t\t\tcasing: config.casing,\n\t\t\tcredentials: parsed.data,\n\t\t\ttablesFilter,\n\t\t\tschemasFilter,\n\t\t\tprefix: config.migrations?.prefix || 'index',\n\t\t\tentities: config.entities,\n\t\t};\n\t}\n\n\tassertUnreachable(dialect);\n};\n\nexport const prepareStudioConfig = async (options: Record<string, unknown>) => {\n\tconst params = studioCliParams.parse(options);\n\tconst config = await drizzleConfigFromFile(params.config);\n\tconst result = studioConfig.safeParse(config);\n\tif (!result.success) {\n\t\tif (!('dialect' in config)) {\n\t\t\tconsole.log(outputs.studio.noDialect());\n\t\t}\n\t\tprocess.exit(1);\n\t}\n\n\tif (!('dbCredentials' in config)) {\n\t\tconsole.log(outputs.studio.noCredentials());\n\t\tprocess.exit(1);\n\t}\n\tconst { host, port } = params;\n\tconst { dialect, schema, casing } = result.data;\n\tconst flattened = flattenDatabaseCredentials(config);\n\n\tif (dialect === 'postgresql') {\n\t\tconst parsed = postgresCredentials.safeParse(flattened);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesPg(flattened as Record<string, unknown>);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst credentials = parsed.data;\n\t\treturn {\n\t\t\tdialect,\n\t\t\tschema,\n\t\t\thost,\n\t\t\tport,\n\t\t\tcredentials,\n\t\t\tcasing,\n\t\t};\n\t}\n\n\tif (dialect === 'mysql') {\n\t\tconst parsed = mysqlCredentials.safeParse(flattened);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesMysql(flattened as Record<string, unknown>);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst credentials = parsed.data;\n\t\treturn {\n\t\t\tdialect,\n\t\t\tschema,\n\t\t\thost,\n\t\t\tport,\n\t\t\tcredentials,\n\t\t\tcasing,\n\t\t};\n\t}\n\n\tif (dialect === 'singlestore') {\n\t\tconst parsed = singlestoreCredentials.safeParse(flattened);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesSingleStore(flattened as Record<string, unknown>);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst credentials = parsed.data;\n\t\treturn {\n\t\t\tdialect,\n\t\t\tschema,\n\t\t\thost,\n\t\t\tport,\n\t\t\tcredentials,\n\t\t\tcasing,\n\t\t};\n\t}\n\n\tif (dialect === 'sqlite') {\n\t\tconst parsed = sqliteCredentials.safeParse(flattened);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesSqlite(flattened as Record<string, unknown>, 'studio');\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst credentials = parsed.data;\n\t\treturn {\n\t\t\tdialect,\n\t\t\tschema,\n\t\t\thost,\n\t\t\tport,\n\t\t\tcredentials,\n\t\t\tcasing,\n\t\t};\n\t}\n\n\tif (dialect === 'turso') {\n\t\tconst parsed = libSQLCredentials.safeParse(flattened);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesLibSQL(flattened as Record<string, unknown>, 'studio');\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst credentials = parsed.data;\n\t\treturn {\n\t\t\tdialect,\n\t\t\tschema,\n\t\t\thost,\n\t\t\tport,\n\t\t\tcredentials,\n\t\t\tcasing,\n\t\t};\n\t}\n\n\tif (dialect === 'gel') {\n\t\tconsole.log(\n\t\t\terror(\n\t\t\t\t`You can't use 'studio' command with Gel dialect`,\n\t\t\t),\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\tassertUnreachable(dialect);\n};\n\nexport const migrateConfig = object({\n\tdialect,\n\tout: string().optional().default('drizzle'),\n\tmigrations: configMigrations,\n});\n\nexport const prepareMigrateConfig = async (configPath: string | undefined) => {\n\tconst config = await drizzleConfigFromFile(configPath);\n\tconst parsed = migrateConfig.safeParse(config);\n\tif (parsed.error) {\n\t\tconsole.log(error('Please provide required params:'));\n\t\tconsole.log(wrapParam('dialect', config.dialect));\n\t\tprocess.exit(1);\n\t}\n\n\tconst { dialect, out } = parsed.data;\n\tconst { schema, table } = parsed.data.migrations || {};\n\tconst flattened = flattenDatabaseCredentials(config);\n\n\tif (dialect === 'postgresql') {\n\t\tconst parsed = postgresCredentials.safeParse(flattened);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesPg(flattened as Record<string, unknown>);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst credentials = parsed.data;\n\t\treturn {\n\t\t\tdialect,\n\t\t\tout,\n\t\t\tcredentials,\n\t\t\tschema,\n\t\t\ttable,\n\t\t};\n\t}\n\n\tif (dialect === 'mysql') {\n\t\tconst parsed = mysqlCredentials.safeParse(flattened);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesMysql(flattened as Record<string, unknown>);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst credentials = parsed.data;\n\t\treturn {\n\t\t\tdialect,\n\t\t\tout,\n\t\t\tcredentials,\n\t\t\tschema,\n\t\t\ttable,\n\t\t};\n\t}\n\n\tif (dialect === 'singlestore') {\n\t\tconst parsed = singlestoreCredentials.safeParse(flattened);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesSingleStore(flattened as Record<string, unknown>);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst credentials = parsed.data;\n\t\treturn {\n\t\t\tdialect,\n\t\t\tout,\n\t\t\tcredentials,\n\t\t\tschema,\n\t\t\ttable,\n\t\t};\n\t}\n\n\tif (dialect === 'sqlite') {\n\t\tconst parsed = sqliteCredentials.safeParse(flattened);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesSqlite(flattened as Record<string, unknown>, 'migrate');\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst credentials = parsed.data;\n\t\treturn {\n\t\t\tdialect,\n\t\t\tout,\n\t\t\tcredentials,\n\t\t\tschema,\n\t\t\ttable,\n\t\t};\n\t}\n\tif (dialect === 'turso') {\n\t\tconst parsed = libSQLCredentials.safeParse(flattened);\n\t\tif (!parsed.success) {\n\t\t\tprintIssuesLibSQL(flattened as Record<string, unknown>, 'migrate');\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst credentials = parsed.data;\n\t\treturn {\n\t\t\tdialect,\n\t\t\tout,\n\t\t\tcredentials,\n\t\t\tschema,\n\t\t\ttable,\n\t\t};\n\t}\n\n\tif (dialect === 'gel') {\n\t\tconsole.log(\n\t\t\terror(\n\t\t\t\t`You can't use 'migrate' command with Gel dialect`,\n\t\t\t),\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\tassertUnreachable(dialect);\n};\n\nexport const drizzleConfigFromFile = async (\n\tconfigPath?: string,\n\tisExport?: boolean,\n): Promise<CliConfig> => {\n\tconst prefix = process.env.TEST_CONFIG_PATH_PREFIX || '';\n\n\tconst defaultTsConfigExists = existsSync(resolve(join(prefix, 'drizzle.config.ts')));\n\tconst defaultJsConfigExists = existsSync(resolve(join(prefix, 'drizzle.config.js')));\n\texistsSync(\n\t\tjoin(resolve('drizzle.config.json')),\n\t);\n\n\tconst defaultConfigPath = defaultTsConfigExists\n\t\t? 'drizzle.config.ts'\n\t\t: defaultJsConfigExists\n\t\t? 'drizzle.config.js'\n\t\t: 'drizzle.config.json';\n\n\tif (!configPath && !isExport) {\n\t\tconsole.log(\n\t\t\tchalk.gray(\n\t\t\t\t`No config path provided, using default '${defaultConfigPath}'`,\n\t\t\t),\n\t\t);\n\t}\n\n\tconst path: string = resolve(join(prefix, configPath ?? defaultConfigPath));\n\n\tif (!existsSync(path)) {\n\t\tconsole.log(`${path} file does not exist`);\n\t\tprocess.exit(1);\n\t}\n\n\tif (!isExport) console.log(chalk.grey(`Reading config file '${path}'`));\n\n\treturn safeRegister(async () => {\n\t\tconst required = require(`${path}`);\n\t\tconst content = required.default ?? required;\n\n\t\t// --- get response and then check by each dialect independently\n\t\tconst res = configCommonSchema.safeParse(content);\n\t\tif (!res.success) {\n\t\t\tconsole.log(res.error);\n\t\t\tif (!('dialect' in content)) {\n\t\t\t\tconsole.log(error(\"Please specify 'dialect' param in config file\"));\n\t\t\t}\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\treturn res.data;\n\t});\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/connections.ts",
    "content": "/// <reference types=\"@cloudflare/workers-types\" />\nimport type { PGlite } from '@electric-sql/pglite';\nimport type { AwsDataApiPgQueryResult, AwsDataApiSessionOptions } from 'drizzle-orm/aws-data-api/pg';\nimport type { MigrationConfig } from 'drizzle-orm/migrator';\nimport type { PreparedQueryConfig } from 'drizzle-orm/pg-core';\nimport fetch from 'node-fetch';\nimport ws from 'ws';\nimport { assertUnreachable } from '../global';\nimport type { ProxyParams } from '../serializer/studio';\nimport {\n\ttype DB,\n\tLibSQLDB,\n\tnormalisePGliteUrl,\n\tnormaliseSQLiteUrl,\n\ttype Proxy,\n\ttype SQLiteDB,\n\ttype TransactionProxy,\n} from '../utils';\nimport { assertPackages, checkPackage } from './utils';\nimport { GelCredentials } from './validations/gel';\nimport { LibSQLCredentials } from './validations/libsql';\nimport type { MysqlCredentials } from './validations/mysql';\nimport { withStyle } from './validations/outputs';\nimport type { PostgresCredentials } from './validations/postgres';\nimport { SingleStoreCredentials } from './validations/singlestore';\nimport type { SqliteCredentials } from './validations/sqlite';\n\nexport const preparePostgresDB = async (\n\tcredentials: PostgresCredentials | {\n\t\tdriver: 'pglite';\n\t\tclient: PGlite;\n\t},\n): Promise<\n\tDB & {\n\t\tpackageName:\n\t\t\t| '@aws-sdk/client-rds-data'\n\t\t\t| 'pglite'\n\t\t\t| 'pg'\n\t\t\t| 'postgres'\n\t\t\t| '@vercel/postgres'\n\t\t\t| '@neondatabase/serverless';\n\t\tproxy: Proxy;\n\t\ttransactionProxy: TransactionProxy;\n\t\tmigrate: (config: string | MigrationConfig) => Promise<void>;\n\t}\n> => {\n\tif ('driver' in credentials) {\n\t\tconst { driver } = credentials;\n\t\tif (driver === 'aws-data-api') {\n\t\t\tassertPackages('@aws-sdk/client-rds-data');\n\t\t\tconst { RDSDataClient, ExecuteStatementCommand, TypeHint } = await import(\n\t\t\t\t'@aws-sdk/client-rds-data'\n\t\t\t);\n\t\t\tconst { AwsDataApiSession, drizzle } = await import(\n\t\t\t\t'drizzle-orm/aws-data-api/pg'\n\t\t\t);\n\t\t\tconst { migrate } = await import('drizzle-orm/aws-data-api/pg/migrator');\n\t\t\tconst { PgDialect } = await import('drizzle-orm/pg-core');\n\n\t\t\tconst config: AwsDataApiSessionOptions = {\n\t\t\t\tdatabase: credentials.database,\n\t\t\t\tresourceArn: credentials.resourceArn,\n\t\t\t\tsecretArn: credentials.secretArn,\n\t\t\t};\n\t\t\tconst rdsClient = new RDSDataClient();\n\t\t\tconst session = new AwsDataApiSession(\n\t\t\t\trdsClient,\n\t\t\t\tnew PgDialect(),\n\t\t\t\tundefined,\n\t\t\t\tconfig,\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tconst db = drizzle(rdsClient, config);\n\t\t\tconst migrateFn = async (config: MigrationConfig) => {\n\t\t\t\treturn migrate(db, config);\n\t\t\t};\n\n\t\t\tconst query = async (sql: string, params: any[]) => {\n\t\t\t\tconst prepared = session.prepareQuery(\n\t\t\t\t\t{ sql, params: params ?? [] },\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t\tconst result = await prepared.all();\n\t\t\t\treturn result as any[];\n\t\t\t};\n\t\t\tconst proxy = async (params: ProxyParams) => {\n\t\t\t\tconst prepared = session.prepareQuery<\n\t\t\t\t\tPreparedQueryConfig & {\n\t\t\t\t\t\texecute: AwsDataApiPgQueryResult<unknown>;\n\t\t\t\t\t\tvalues: AwsDataApiPgQueryResult<unknown[]>;\n\t\t\t\t\t}\n\t\t\t\t>(\n\t\t\t\t\t{\n\t\t\t\t\t\tsql: params.sql,\n\t\t\t\t\t\tparams: params.params ?? [],\n\t\t\t\t\t\ttypings: params.typings,\n\t\t\t\t\t},\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tparams.mode === 'array',\n\t\t\t\t);\n\t\t\t\tif (params.mode === 'array') {\n\t\t\t\t\tconst result = await prepared.values();\n\t\t\t\t\treturn result.rows;\n\t\t\t\t}\n\t\t\t\tconst result = await prepared.execute();\n\t\t\t\treturn result.rows;\n\t\t\t};\n\t\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\t\tthrow new Error('Transaction not supported');\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tpackageName: '@aws-sdk/client-rds-data',\n\t\t\t\tquery,\n\t\t\t\tproxy,\n\t\t\t\ttransactionProxy,\n\t\t\t\tmigrate: migrateFn,\n\t\t\t};\n\t\t}\n\n\t\tif (driver === 'pglite') {\n\t\t\tassertPackages('@electric-sql/pglite');\n\t\t\tconst { PGlite, types } = await import('@electric-sql/pglite');\n\t\t\tconst { drizzle } = await import('drizzle-orm/pglite');\n\t\t\tconst { migrate } = await import('drizzle-orm/pglite/migrator');\n\n\t\t\tconst pglite = 'client' in credentials ? credentials.client : new PGlite(normalisePGliteUrl(credentials.url));\n\t\t\tawait pglite.waitReady;\n\t\t\tconst drzl = drizzle(pglite);\n\t\t\tconst migrateFn = async (config: MigrationConfig) => {\n\t\t\t\treturn migrate(drzl, config);\n\t\t\t};\n\n\t\t\tconst parsers = {\n\t\t\t\t[types.TIMESTAMP]: (value: any) => value,\n\t\t\t\t[types.TIMESTAMPTZ]: (value: any) => value,\n\t\t\t\t[types.INTERVAL]: (value: any) => value,\n\t\t\t\t[types.DATE]: (value: any) => value,\n\t\t\t};\n\n\t\t\tconst query = async <T>(sql: string, params: any[] = []) => {\n\t\t\t\tconst result = await pglite.query(sql, params, {\n\t\t\t\t\tparsers,\n\t\t\t\t});\n\t\t\t\treturn result.rows as T[];\n\t\t\t};\n\n\t\t\tconst proxy = async (params: ProxyParams) => {\n\t\t\t\tconst preparedParams = preparePGliteParams(params.params || []);\n\t\t\t\tconst result = await pglite.query(params.sql, preparedParams, {\n\t\t\t\t\trowMode: params.mode,\n\t\t\t\t\tparsers,\n\t\t\t\t});\n\t\t\t\treturn result.rows;\n\t\t\t};\n\n\t\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\t\tconst results: any[] = [];\n\t\t\t\ttry {\n\t\t\t\t\tawait pglite.transaction(async (tx) => {\n\t\t\t\t\t\tfor (const query of queries) {\n\t\t\t\t\t\t\tconst result = await tx.query(query.sql, undefined, {\n\t\t\t\t\t\t\t\tparsers,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tresults.push(result.rows);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tresults.push(error as Error);\n\t\t\t\t}\n\t\t\t\treturn results;\n\t\t\t};\n\n\t\t\treturn { packageName: 'pglite', query, proxy, transactionProxy, migrate: migrateFn };\n\t\t}\n\n\t\tassertUnreachable(driver);\n\t}\n\n\tif (await checkPackage('pg')) {\n\t\tconsole.log(withStyle.info(`Using 'pg' driver for database querying`));\n\t\tconst { default: pg } = await import('pg');\n\t\tconst { drizzle } = await import('drizzle-orm/node-postgres');\n\t\tconst { migrate } = await import('drizzle-orm/node-postgres/migrator');\n\n\t\tconst ssl = 'ssl' in credentials\n\t\t\t? credentials.ssl === 'prefer'\n\t\t\t\t\t|| credentials.ssl === 'require'\n\t\t\t\t\t|| credentials.ssl === 'allow'\n\t\t\t\t? { rejectUnauthorized: false }\n\t\t\t\t: credentials.ssl === 'verify-full'\n\t\t\t\t? {}\n\t\t\t\t: credentials.ssl\n\t\t\t: {};\n\n\t\t// Override pg default date parsers\n\t\tconst types: { getTypeParser: typeof pg.types.getTypeParser } = {\n\t\t\t// @ts-ignore\n\t\t\tgetTypeParser: (typeId, format) => {\n\t\t\t\tif (typeId === pg.types.builtins.TIMESTAMPTZ) {\n\t\t\t\t\treturn (val) => val;\n\t\t\t\t}\n\t\t\t\tif (typeId === pg.types.builtins.TIMESTAMP) {\n\t\t\t\t\treturn (val) => val;\n\t\t\t\t}\n\t\t\t\tif (typeId === pg.types.builtins.DATE) {\n\t\t\t\t\treturn (val) => val;\n\t\t\t\t}\n\t\t\t\tif (typeId === pg.types.builtins.INTERVAL) {\n\t\t\t\t\treturn (val) => val;\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\treturn pg.types.getTypeParser(typeId, format);\n\t\t\t},\n\t\t};\n\n\t\tconst client = 'url' in credentials\n\t\t\t? new pg.Pool({ connectionString: credentials.url, max: 1 })\n\t\t\t: new pg.Pool({ ...credentials, ssl, max: 1 });\n\n\t\tconst db = drizzle(client);\n\t\tconst migrateFn = async (config: MigrationConfig) => {\n\t\t\treturn migrate(db, config);\n\t\t};\n\n\t\tconst query = async (sql: string, params?: any[]) => {\n\t\t\tconst result = await client.query({\n\t\t\t\ttext: sql,\n\t\t\t\tvalues: params ?? [],\n\t\t\t\ttypes,\n\t\t\t});\n\t\t\treturn result.rows;\n\t\t};\n\n\t\tconst proxy: Proxy = async (params) => {\n\t\t\tconst result = await client.query({\n\t\t\t\ttext: params.sql,\n\t\t\t\tvalues: params.params,\n\t\t\t\t...(params.mode === 'array' && { rowMode: 'array' }),\n\t\t\t\ttypes,\n\t\t\t});\n\t\t\treturn result.rows;\n\t\t};\n\n\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\tconst results: any[] = [];\n\t\t\tconst tx = await client.connect();\n\t\t\ttry {\n\t\t\t\tawait tx.query('BEGIN');\n\t\t\t\tfor (const query of queries) {\n\t\t\t\t\tconst result = await tx.query({\n\t\t\t\t\t\ttext: query.sql,\n\t\t\t\t\t\ttypes,\n\t\t\t\t\t});\n\t\t\t\t\tresults.push(result.rows);\n\t\t\t\t}\n\t\t\t\tawait tx.query('COMMIT');\n\t\t\t} catch (error) {\n\t\t\t\tawait tx.query('ROLLBACK');\n\t\t\t\tresults.push(error as Error);\n\t\t\t} finally {\n\t\t\t\ttx.release();\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t\treturn { packageName: 'pg', query, proxy, transactionProxy, migrate: migrateFn };\n\t}\n\n\tif (await checkPackage('postgres')) {\n\t\tconsole.log(\n\t\t\twithStyle.info(`Using 'postgres' driver for database querying`),\n\t\t);\n\t\tconst postgres = await import('postgres');\n\n\t\tconst { drizzle } = await import('drizzle-orm/postgres-js');\n\t\tconst { migrate } = await import('drizzle-orm/postgres-js/migrator');\n\n\t\tconst client = 'url' in credentials\n\t\t\t? postgres.default(credentials.url, { max: 1 })\n\t\t\t: postgres.default({ ...credentials, max: 1 });\n\n\t\tconst transparentParser = (val: any) => val;\n\n\t\t// Override postgres.js default date parsers: https://github.com/porsager/postgres/discussions/761\n\t\tfor (const type of ['1184', '1082', '1083', '1114']) {\n\t\t\tclient.options.parsers[type as any] = transparentParser;\n\t\t\tclient.options.serializers[type as any] = transparentParser;\n\t\t}\n\t\tclient.options.serializers['114'] = transparentParser;\n\t\tclient.options.serializers['3802'] = transparentParser;\n\n\t\tconst db = drizzle(client);\n\t\tconst migrateFn = async (config: MigrationConfig) => {\n\t\t\treturn migrate(db, config);\n\t\t};\n\n\t\tconst query = async (sql: string, params?: any[]) => {\n\t\t\tconst result = await client.unsafe(sql, params ?? []);\n\t\t\treturn result as any[];\n\t\t};\n\n\t\tconst proxy: Proxy = async (params) => {\n\t\t\tif (params.mode === 'array') {\n\t\t\t\treturn await client.unsafe(params.sql, params.params).values();\n\t\t\t}\n\t\t\treturn await client.unsafe(params.sql, params.params);\n\t\t};\n\n\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\tconst results: any[] = [];\n\t\t\ttry {\n\t\t\t\tawait client.begin(async (sql) => {\n\t\t\t\t\tfor (const query of queries) {\n\t\t\t\t\t\tconst result = await sql.unsafe(query.sql);\n\t\t\t\t\t\tresults.push(result);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tresults.push(error as Error);\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t\treturn { packageName: 'postgres', query, proxy, transactionProxy, migrate: migrateFn };\n\t}\n\n\tif (await checkPackage('@vercel/postgres')) {\n\t\tconsole.log(\n\t\t\twithStyle.info(`Using '@vercel/postgres' driver for database querying`),\n\t\t);\n\t\tconsole.log(\n\t\t\twithStyle.fullWarning(\n\t\t\t\t\"'@vercel/postgres' can only connect to remote Neon/Vercel Postgres/Supabase instances through a websocket\",\n\t\t\t),\n\t\t);\n\t\tconst { VercelPool, types: pgTypes } = await import('@vercel/postgres');\n\t\tconst { drizzle } = await import('drizzle-orm/vercel-postgres');\n\t\tconst { migrate } = await import('drizzle-orm/vercel-postgres/migrator');\n\t\tconst ssl = 'ssl' in credentials\n\t\t\t? credentials.ssl === 'prefer'\n\t\t\t\t\t|| credentials.ssl === 'require'\n\t\t\t\t\t|| credentials.ssl === 'allow'\n\t\t\t\t? { rejectUnauthorized: false }\n\t\t\t\t: credentials.ssl === 'verify-full'\n\t\t\t\t? {}\n\t\t\t\t: credentials.ssl\n\t\t\t: {};\n\n\t\t// Override @vercel/postgres default date parsers\n\t\tconst types: { getTypeParser: typeof pgTypes.getTypeParser } = {\n\t\t\t// @ts-ignore\n\t\t\tgetTypeParser: (typeId, format) => {\n\t\t\t\tif (typeId === pgTypes.builtins.TIMESTAMPTZ) {\n\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t}\n\t\t\t\tif (typeId === pgTypes.builtins.TIMESTAMP) {\n\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t}\n\t\t\t\tif (typeId === pgTypes.builtins.DATE) {\n\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t}\n\t\t\t\tif (typeId === pgTypes.builtins.INTERVAL) {\n\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\treturn pgTypes.getTypeParser(typeId, format);\n\t\t\t},\n\t\t};\n\n\t\tconst client = 'url' in credentials\n\t\t\t? new VercelPool({ connectionString: credentials.url })\n\t\t\t: new VercelPool({ ...credentials, ssl });\n\n\t\tawait client.connect();\n\n\t\tconst db = drizzle(client);\n\t\tconst migrateFn = async (config: MigrationConfig) => {\n\t\t\treturn migrate(db, config);\n\t\t};\n\n\t\tconst query = async (sql: string, params?: any[]) => {\n\t\t\tconst result = await client.query({\n\t\t\t\ttext: sql,\n\t\t\t\tvalues: params ?? [],\n\t\t\t\ttypes,\n\t\t\t});\n\t\t\treturn result.rows;\n\t\t};\n\n\t\tconst proxy: Proxy = async (params) => {\n\t\t\tconst result = await client.query({\n\t\t\t\ttext: params.sql,\n\t\t\t\tvalues: params.params,\n\t\t\t\t...(params.mode === 'array' && { rowMode: 'array' }),\n\t\t\t\ttypes,\n\t\t\t});\n\t\t\treturn result.rows;\n\t\t};\n\n\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\tconst results: any[] = [];\n\t\t\tconst tx = await client.connect();\n\t\t\ttry {\n\t\t\t\tawait tx.query('BEGIN');\n\t\t\t\tfor (const query of queries) {\n\t\t\t\t\tconst result = await tx.query({\n\t\t\t\t\t\ttext: query.sql,\n\t\t\t\t\t\ttypes,\n\t\t\t\t\t});\n\t\t\t\t\tresults.push(result.rows);\n\t\t\t\t}\n\t\t\t\tawait tx.query('COMMIT');\n\t\t\t} catch (error) {\n\t\t\t\tawait tx.query('ROLLBACK');\n\t\t\t\tresults.push(error as Error);\n\t\t\t} finally {\n\t\t\t\ttx.release();\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t\treturn { packageName: '@vercel/postgres', query, proxy, transactionProxy, migrate: migrateFn };\n\t}\n\n\tif (await checkPackage('@neondatabase/serverless')) {\n\t\tconsole.log(\n\t\t\twithStyle.info(\n\t\t\t\t`Using '@neondatabase/serverless' driver for database querying`,\n\t\t\t),\n\t\t);\n\t\tconsole.log(\n\t\t\twithStyle.fullWarning(\n\t\t\t\t\"'@neondatabase/serverless' can only connect to remote Neon/Vercel Postgres/Supabase instances through a websocket\",\n\t\t\t),\n\t\t);\n\t\tconst { Pool, neonConfig, types: pgTypes } = await import('@neondatabase/serverless');\n\t\tconst { drizzle } = await import('drizzle-orm/neon-serverless');\n\t\tconst { migrate } = await import('drizzle-orm/neon-serverless/migrator');\n\n\t\tconst ssl = 'ssl' in credentials\n\t\t\t? credentials.ssl === 'prefer'\n\t\t\t\t\t|| credentials.ssl === 'require'\n\t\t\t\t\t|| credentials.ssl === 'allow'\n\t\t\t\t? { rejectUnauthorized: false }\n\t\t\t\t: credentials.ssl === 'verify-full'\n\t\t\t\t? {}\n\t\t\t\t: credentials.ssl\n\t\t\t: {};\n\n\t\t// Override @neondatabase/serverless default date parsers\n\t\tconst types: { getTypeParser: typeof pgTypes.getTypeParser } = {\n\t\t\t// @ts-ignore\n\t\t\tgetTypeParser: (typeId, format) => {\n\t\t\t\tif (typeId === pgTypes.builtins.TIMESTAMPTZ) {\n\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t}\n\t\t\t\tif (typeId === pgTypes.builtins.TIMESTAMP) {\n\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t}\n\t\t\t\tif (typeId === pgTypes.builtins.DATE) {\n\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t}\n\t\t\t\tif (typeId === pgTypes.builtins.INTERVAL) {\n\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\treturn pgTypes.getTypeParser(typeId, format);\n\t\t\t},\n\t\t};\n\n\t\tconst client = 'url' in credentials\n\t\t\t? new Pool({ connectionString: credentials.url, max: 1 })\n\t\t\t: new Pool({ ...credentials, max: 1, ssl });\n\t\tneonConfig.webSocketConstructor = ws;\n\n\t\tconst db = drizzle(client);\n\t\tconst migrateFn = async (config: MigrationConfig) => {\n\t\t\treturn migrate(db, config);\n\t\t};\n\n\t\tconst query = async (sql: string, params?: any[]) => {\n\t\t\tconst result = await client.query({\n\t\t\t\ttext: sql,\n\t\t\t\tvalues: params ?? [],\n\t\t\t\ttypes,\n\t\t\t});\n\t\t\treturn result.rows;\n\t\t};\n\n\t\tconst proxy: Proxy = async (params: ProxyParams) => {\n\t\t\tconst result = await client.query({\n\t\t\t\ttext: params.sql,\n\t\t\t\tvalues: params.params,\n\t\t\t\t...(params.mode === 'array' && { rowMode: 'array' }),\n\t\t\t\ttypes,\n\t\t\t});\n\t\t\treturn result.rows;\n\t\t};\n\n\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\tconst results: any[] = [];\n\t\t\tconst tx = await client.connect();\n\t\t\ttry {\n\t\t\t\tawait tx.query('BEGIN');\n\t\t\t\tfor (const query of queries) {\n\t\t\t\t\tconst result = await tx.query({\n\t\t\t\t\t\ttext: query.sql,\n\t\t\t\t\t\ttypes,\n\t\t\t\t\t});\n\t\t\t\t\tresults.push(result.rows);\n\t\t\t\t}\n\t\t\t\tawait tx.query('COMMIT');\n\t\t\t} catch (error) {\n\t\t\t\tawait tx.query('ROLLBACK');\n\t\t\t\tresults.push(error as Error);\n\t\t\t} finally {\n\t\t\t\ttx.release();\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t\treturn { packageName: '@neondatabase/serverless', query, proxy, transactionProxy, migrate: migrateFn };\n\t}\n\n\tconsole.error(\n\t\t\"To connect to Postgres database - please install either of 'pg', 'postgres', '@neondatabase/serverless' or '@vercel/postgres' drivers\",\n\t);\n\tprocess.exit(1);\n};\n\nexport const prepareGelDB = async (\n\tcredentials?: GelCredentials,\n): Promise<\n\tDB & {\n\t\tpackageName: 'gel';\n\t\tproxy: Proxy;\n\t\ttransactionProxy: TransactionProxy;\n\t}\n> => {\n\tif (await checkPackage('gel')) {\n\t\tconst gel = await import('gel');\n\n\t\tlet client: ReturnType<typeof gel.createClient>;\n\t\tif (!credentials) {\n\t\t\tclient = gel.createClient();\n\t\t\ttry {\n\t\t\t\tawait client.querySQL(`select 1;`);\n\t\t\t} catch (error: any) {\n\t\t\t\tif (error instanceof gel.ClientConnectionError) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`It looks like you forgot to link the Gel project or provide the database credentials.\nTo link your project, please refer https://docs.geldata.com/reference/cli/gel_instance/gel_instance_link, or add the dbCredentials to your configuration file.`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} else if ('url' in credentials) {\n\t\t\t'tlsSecurity' in credentials\n\t\t\t\t? client = gel.createClient({ dsn: credentials.url, tlsSecurity: credentials.tlsSecurity, concurrency: 1 })\n\t\t\t\t: client = gel.createClient({ dsn: credentials.url, concurrency: 1 });\n\t\t} else {\n\t\t\tgel.createClient({ ...credentials, concurrency: 1 });\n\t\t}\n\n\t\tconst query = async (sql: string, params?: any[]) => {\n\t\t\tconst result = params?.length ? await client.querySQL(sql, params) : await client.querySQL(sql);\n\t\t\treturn result as any[];\n\t\t};\n\n\t\tconst proxy: Proxy = async (params: ProxyParams) => {\n\t\t\tconst { method, mode, params: sqlParams, sql, typings } = params;\n\n\t\t\tlet result: any[];\n\t\t\tswitch (mode) {\n\t\t\t\tcase 'array':\n\t\t\t\t\tresult = sqlParams?.length\n\t\t\t\t\t\t? await client.withSQLRowMode('array').querySQL(sql, sqlParams)\n\t\t\t\t\t\t: await client.withSQLRowMode('array').querySQL(sql);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'object':\n\t\t\t\t\tresult = sqlParams?.length ? await client.querySQL(sql, sqlParams) : await client.querySQL(sql);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\n\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\tconst result: any[] = [];\n\t\t\ttry {\n\t\t\t\tawait client.transaction(async (tx) => {\n\t\t\t\t\tfor (const query of queries) {\n\t\t\t\t\t\tconst res = await tx.querySQL(query.sql);\n\t\t\t\t\t\tresult.push(res);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tresult.push(error as Error);\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\n\t\treturn { packageName: 'gel', query, proxy, transactionProxy };\n\t}\n\n\tconsole.error(\n\t\t\"To connect to gel database - please install 'edgedb' driver\",\n\t);\n\tprocess.exit(1);\n};\n\nconst parseSingleStoreCredentials = (credentials: SingleStoreCredentials) => {\n\tif ('url' in credentials) {\n\t\tconst url = credentials.url;\n\n\t\tconst connectionUrl = new URL(url);\n\t\tconst pathname = connectionUrl.pathname;\n\n\t\tconst database = pathname.split('/')[pathname.split('/').length - 1];\n\t\tif (!database) {\n\t\t\tconsole.error(\n\t\t\t\t'You should specify a database name in connection string (singlestore://USER:PASSWORD@HOST:PORT/DATABASE)',\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\treturn { database, url };\n\t} else {\n\t\treturn {\n\t\t\tdatabase: credentials.database,\n\t\t\tcredentials,\n\t\t};\n\t}\n};\n\nexport const connectToSingleStore = async (\n\tit: SingleStoreCredentials,\n): Promise<{\n\tdb: DB;\n\tpackageName: 'mysql2';\n\tproxy: Proxy;\n\ttransactionProxy: TransactionProxy;\n\tdatabase: string;\n\tmigrate: (config: MigrationConfig) => Promise<void>;\n}> => {\n\tconst result = parseSingleStoreCredentials(it);\n\n\tif (await checkPackage('mysql2')) {\n\t\tconst { createConnection } = await import('mysql2/promise');\n\t\tconst { drizzle } = await import('drizzle-orm/singlestore');\n\t\tconst { migrate } = await import('drizzle-orm/singlestore/migrator');\n\n\t\tconst connection = result.url\n\t\t\t? await createConnection(result.url)\n\t\t\t: await createConnection(result.credentials!); // needed for some reason!\n\n\t\tconst db = drizzle(connection);\n\t\tconst migrateFn = async (config: MigrationConfig) => {\n\t\t\treturn migrate(db, config);\n\t\t};\n\n\t\tawait connection.connect();\n\t\tconst query: DB['query'] = async <T>(\n\t\t\tsql: string,\n\t\t\tparams?: any[],\n\t\t): Promise<T[]> => {\n\t\t\tconst res = await connection.execute(sql, params);\n\t\t\treturn res[0] as any;\n\t\t};\n\n\t\tconst proxy: Proxy = async (params: ProxyParams) => {\n\t\t\tconst result = await connection.query({\n\t\t\t\tsql: params.sql,\n\t\t\t\tvalues: params.params,\n\t\t\t\trowsAsArray: params.mode === 'array',\n\t\t\t});\n\t\t\treturn result[0] as any[];\n\t\t};\n\n\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\tconst results: any[] = [];\n\t\t\ttry {\n\t\t\t\tawait connection.beginTransaction();\n\t\t\t\tfor (const query of queries) {\n\t\t\t\t\tconst res = await connection.query(query.sql);\n\t\t\t\t\tresults.push(res[0]);\n\t\t\t\t}\n\t\t\t\tawait connection.commit();\n\t\t\t} catch (error) {\n\t\t\t\tawait connection.rollback();\n\t\t\t\tresults.push(error as Error);\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t\treturn {\n\t\t\tdb: { query },\n\t\t\tpackageName: 'mysql2',\n\t\t\tproxy,\n\t\t\ttransactionProxy,\n\t\t\tdatabase: result.database,\n\t\t\tmigrate: migrateFn,\n\t\t};\n\t}\n\n\tconsole.error(\n\t\t\"To connect to SingleStore database - please install 'mysql2' driver\",\n\t);\n\tprocess.exit(1);\n};\n\nconst parseMysqlCredentials = (credentials: MysqlCredentials) => {\n\tif ('url' in credentials) {\n\t\tconst url = credentials.url;\n\n\t\tconst connectionUrl = new URL(url);\n\t\tconst pathname = connectionUrl.pathname;\n\n\t\tconst database = pathname.split('/')[pathname.split('/').length - 1];\n\t\tif (!database) {\n\t\t\tconsole.error(\n\t\t\t\t'You should specify a database name in connection string (mysql://USER:PASSWORD@HOST:PORT/DATABASE)',\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\treturn { database, url };\n\t} else {\n\t\treturn {\n\t\t\tdatabase: credentials.database,\n\t\t\tcredentials,\n\t\t};\n\t}\n};\n\nexport const connectToMySQL = async (\n\tit: MysqlCredentials,\n): Promise<{\n\tdb: DB;\n\tpackageName: 'mysql2' | '@planetscale/database';\n\tproxy: Proxy;\n\ttransactionProxy: TransactionProxy;\n\tdatabase: string;\n\tmigrate: (config: MigrationConfig) => Promise<void>;\n}> => {\n\tconst result = parseMysqlCredentials(it);\n\n\tif (await checkPackage('mysql2')) {\n\t\tconst { createConnection } = await import('mysql2/promise');\n\t\tconst { drizzle } = await import('drizzle-orm/mysql2');\n\t\tconst { migrate } = await import('drizzle-orm/mysql2/migrator');\n\n\t\tconst connection = result.url\n\t\t\t? await createConnection(result.url)\n\t\t\t: await createConnection(result.credentials!); // needed for some reason!\n\n\t\tconst db = drizzle(connection);\n\t\tconst migrateFn = async (config: MigrationConfig) => {\n\t\t\treturn migrate(db, config);\n\t\t};\n\n\t\tconst typeCast = (field: any, next: any) => {\n\t\t\tif (field.type === 'TIMESTAMP' || field.type === 'DATETIME' || field.type === 'DATE') {\n\t\t\t\treturn field.string();\n\t\t\t}\n\t\t\treturn next();\n\t\t};\n\n\t\tawait connection.connect();\n\t\tconst query: DB['query'] = async <T>(\n\t\t\tsql: string,\n\t\t\tparams?: any[],\n\t\t): Promise<T[]> => {\n\t\t\tconst res = await connection.execute({\n\t\t\t\tsql,\n\t\t\t\tvalues: params,\n\t\t\t\ttypeCast,\n\t\t\t});\n\t\t\treturn res[0] as any;\n\t\t};\n\n\t\tconst proxy: Proxy = async (params: ProxyParams) => {\n\t\t\tconst result = await connection.query({\n\t\t\t\tsql: params.sql,\n\t\t\t\tvalues: params.params,\n\t\t\t\trowsAsArray: params.mode === 'array',\n\t\t\t\ttypeCast,\n\t\t\t});\n\t\t\treturn result[0] as any[];\n\t\t};\n\n\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\tconst results: any[] = [];\n\t\t\ttry {\n\t\t\t\tawait connection.beginTransaction();\n\t\t\t\tfor (const query of queries) {\n\t\t\t\t\tconst res = await connection.query(query.sql);\n\t\t\t\t\tresults.push(res[0]);\n\t\t\t\t}\n\t\t\t\tawait connection.commit();\n\t\t\t} catch (error) {\n\t\t\t\tawait connection.rollback();\n\t\t\t\tresults.push(error as Error);\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t\treturn {\n\t\t\tdb: { query },\n\t\t\tpackageName: 'mysql2',\n\t\t\tproxy,\n\t\t\ttransactionProxy,\n\t\t\tdatabase: result.database,\n\t\t\tmigrate: migrateFn,\n\t\t};\n\t}\n\n\tif (await checkPackage('@planetscale/database')) {\n\t\tconst { Client } = await import('@planetscale/database');\n\t\tconst { drizzle } = await import('drizzle-orm/planetscale-serverless');\n\t\tconst { migrate } = await import(\n\t\t\t'drizzle-orm/planetscale-serverless/migrator'\n\t\t);\n\n\t\tconst connection = new Client(result);\n\n\t\tconst db = drizzle(connection);\n\t\tconst migrateFn = async (config: MigrationConfig) => {\n\t\t\treturn migrate(db, config);\n\t\t};\n\n\t\tconst query = async <T>(sql: string, params?: any[]): Promise<T[]> => {\n\t\t\tconst res = await connection.execute(sql, params);\n\t\t\treturn res.rows as T[];\n\t\t};\n\t\tconst proxy: Proxy = async (params: ProxyParams) => {\n\t\t\tconst result = await connection.execute(\n\t\t\t\tparams.sql,\n\t\t\t\tparams.params,\n\t\t\t\tparams.mode === 'array' ? { as: 'array' } : undefined,\n\t\t\t);\n\t\t\treturn result.rows;\n\t\t};\n\n\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\tconst results: any[] = [];\n\t\t\ttry {\n\t\t\t\tawait connection.transaction(async (tx) => {\n\t\t\t\t\tfor (const query of queries) {\n\t\t\t\t\t\tconst res = await tx.execute(query.sql);\n\t\t\t\t\t\tresults.push(res.rows);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tresults.push(error as Error);\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t\treturn {\n\t\t\tdb: { query },\n\t\t\tpackageName: '@planetscale/database',\n\t\t\tproxy,\n\t\t\ttransactionProxy,\n\t\t\tdatabase: result.database,\n\t\t\tmigrate: migrateFn,\n\t\t};\n\t}\n\n\tconsole.error(\n\t\t\"To connect to MySQL database - please install either of 'mysql2' or '@planetscale/database' drivers\",\n\t);\n\tprocess.exit(1);\n};\n\nconst prepareSqliteParams = (params: any[], driver?: string) => {\n\treturn params.map((param) => {\n\t\tif (\n\t\t\tparam\n\t\t\t&& typeof param === 'object'\n\t\t\t&& 'type' in param\n\t\t\t&& 'value' in param\n\t\t\t&& param.type === 'binary'\n\t\t) {\n\t\t\tconst value = typeof param.value === 'object'\n\t\t\t\t? JSON.stringify(param.value)\n\t\t\t\t: (param.value as string);\n\n\t\t\tif (driver === 'd1-http' || driver === 'd1') {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\treturn Buffer.from(value);\n\t\t}\n\t\treturn param;\n\t});\n};\n\nconst preparePGliteParams = (params: any[]) => {\n\treturn params.map((param) => {\n\t\tif (\n\t\t\tparam\n\t\t\t&& typeof param === 'object'\n\t\t\t&& 'type' in param\n\t\t\t&& 'value' in param\n\t\t\t&& param.type === 'binary'\n\t\t) {\n\t\t\tconst value = typeof param.value === 'object'\n\t\t\t\t? JSON.stringify(param.value)\n\t\t\t\t: (param.value as string);\n\n\t\t\treturn value;\n\t\t}\n\t\treturn param;\n\t});\n};\n\nexport type D1Credentials = {\n\tdriver: 'd1';\n\tbinding: D1Database;\n};\n\nexport const connectToD1 = async (\n\td1: D1Database,\n): Promise<\n\t& SQLiteDB\n\t& {\n\t\tpackageName: 'd1';\n\t\tmigrate: (config: MigrationConfig) => Promise<void>;\n\t\tproxy: Proxy;\n\t\ttransactionProxy: TransactionProxy;\n\t}\n> => {\n\tconst db: SQLiteDB = {\n\t\tquery: async <T>(sql: string, params?: any[]) => {\n\t\t\tconst stmt = d1.prepare(sql);\n\t\t\tconst boundStmt = params && params.length > 0 ? stmt.bind(...params) : stmt;\n\t\t\tconst result = await boundStmt.all<T>();\n\t\t\treturn (result.results ?? []) as T[];\n\t\t},\n\t\trun: async (query: string) => {\n\t\t\tconst stmt = d1.prepare(query);\n\t\t\tawait stmt.run();\n\t\t},\n\t};\n\n\tconst proxy: Proxy = async (params) => {\n\t\tconst preparedParams = prepareSqliteParams(params.params || [], 'd1');\n\t\tconst stmt = d1.prepare(params.sql);\n\t\tconst boundStmt = preparedParams.length > 0 ? stmt.bind(...preparedParams) : stmt;\n\n\t\ttry {\n\t\t\tif (params.mode === 'array') {\n\t\t\t\treturn await boundStmt.raw();\n\t\t\t}\n\t\t\tconst result = await boundStmt.all();\n\t\t\treturn result.results ?? [];\n\t\t} catch (error: any) {\n\t\t\t// D1 doesn't allow certain introspection queries (sqlite_master with pragma functions)\n\t\t\t// Return empty array for SQLITE_AUTH errors on these system queries\n\t\t\tif (error?.message?.includes('SQLITE_AUTH') || error?.message?.includes('not authorized')) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\tconst results: any[] = [];\n\t\ttry {\n\t\t\t// D1 doesn't support true transactions via binding, use batch instead\n\t\t\tconst statements = queries.map((q) => d1.prepare(q.sql));\n\t\t\tconst batchResults = await d1.batch(statements);\n\t\t\tfor (const result of batchResults) {\n\t\t\t\tresults.push(result.results ?? []);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tresults.push(error as Error);\n\t\t}\n\t\treturn results;\n\t};\n\n\tconst { drizzle } = await import('drizzle-orm/d1');\n\tconst { migrate } = await import('drizzle-orm/d1/migrator');\n\tconst drzl = drizzle(d1);\n\tconst migrateFn = async (config: MigrationConfig) => {\n\t\treturn migrate(drzl, config);\n\t};\n\n\treturn { ...db, packageName: 'd1', proxy, transactionProxy, migrate: migrateFn };\n};\n\nexport const connectToSQLite = async (\n\tcredentials: SqliteCredentials,\n): Promise<\n\t& SQLiteDB\n\t& {\n\t\tpackageName: 'd1-http' | '@libsql/client' | 'better-sqlite3';\n\t\tmigrate: (config: MigrationConfig) => Promise<void>;\n\t\tproxy: Proxy;\n\t\ttransactionProxy: TransactionProxy;\n\t}\n> => {\n\tif ('driver' in credentials) {\n\t\tconst { driver } = credentials;\n\t\tif (driver === 'd1-http') {\n\t\t\tconst { drizzle } = await import('drizzle-orm/sqlite-proxy');\n\t\t\tconst { migrate } = await import('drizzle-orm/sqlite-proxy/migrator');\n\n\t\t\ttype D1Response =\n\t\t\t\t| {\n\t\t\t\t\tsuccess: true;\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tresults:\n\t\t\t\t\t\t\t| any[]\n\t\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\tcolumns: string[];\n\t\t\t\t\t\t\t\trows: any[][];\n\t\t\t\t\t\t\t};\n\t\t\t\t\t}[];\n\t\t\t\t}\n\t\t\t\t| {\n\t\t\t\t\tsuccess: false;\n\t\t\t\t\terrors: { code: number; message: string }[];\n\t\t\t\t};\n\n\t\t\tconst remoteCallback: Parameters<typeof drizzle>[0] = async (\n\t\t\t\tsql,\n\t\t\t\tparams,\n\t\t\t\tmethod,\n\t\t\t) => {\n\t\t\t\tconst res = await fetch(\n\t\t\t\t\t`https://api.cloudflare.com/client/v4/accounts/${credentials.accountId}/d1/database/${credentials.databaseId}/${\n\t\t\t\t\t\tmethod === 'values' ? 'raw' : 'query'\n\t\t\t\t\t}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\tbody: JSON.stringify({ sql, params }),\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\t\tAuthorization: `Bearer ${credentials.token}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst data = (await res.json()) as D1Response;\n\n\t\t\t\tif (!data.success) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\tdata.errors.map((it) => `${it.code}: ${it.message}`).join('\\n'),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst result = data.result[0].results;\n\t\t\t\tconst rows = Array.isArray(result) ? result : result.rows;\n\n\t\t\t\treturn {\n\t\t\t\t\trows,\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst remoteBatchCallback = async (\n\t\t\t\tqueries: {\n\t\t\t\t\tsql: string;\n\t\t\t\t}[],\n\t\t\t) => {\n\t\t\t\tconst sql = queries.map((q) => q.sql).join('; ');\n\t\t\t\tconst res = await fetch(\n\t\t\t\t\t`https://api.cloudflare.com/client/v4/accounts/${credentials.accountId}/d1/database/${credentials.databaseId}/query`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\tbody: JSON.stringify({ sql }),\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\t\tAuthorization: `Bearer ${credentials.token}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst data = (await res.json()) as D1Response;\n\n\t\t\t\tif (!data.success) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\tdata.errors.map((it) => `${it.code}: ${it.message}`).join('\\n'),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst rows = data.result.map((result) => {\n\t\t\t\t\tconst res = result.results;\n\t\t\t\t\treturn Array.isArray(res) ? res : res.rows;\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\trows,\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst drzl = drizzle(remoteCallback);\n\t\t\tconst migrateFn = async (config: MigrationConfig) => {\n\t\t\t\treturn migrate(\n\t\t\t\t\tdrzl,\n\t\t\t\t\tasync (queries) => {\n\t\t\t\t\t\tfor (const query of queries) {\n\t\t\t\t\t\t\tawait remoteCallback(query, [], 'run');\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tconst db: SQLiteDB = {\n\t\t\t\tquery: async <T>(sql: string, params?: any[]) => {\n\t\t\t\t\tconst res = await remoteCallback(sql, params || [], 'all');\n\t\t\t\t\treturn res.rows as T[];\n\t\t\t\t},\n\t\t\t\trun: async (query: string) => {\n\t\t\t\t\tawait remoteCallback(query, [], 'run');\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst proxy: Proxy = async (params) => {\n\t\t\t\tconst preparedParams = prepareSqliteParams(params.params || [], 'd1-http');\n\t\t\t\tconst result = await remoteCallback(\n\t\t\t\t\tparams.sql,\n\t\t\t\t\tpreparedParams,\n\t\t\t\t\tparams.mode === 'array' ? 'values' : 'all',\n\t\t\t\t);\n\n\t\t\t\treturn result.rows;\n\t\t\t};\n\t\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\t\tconst result = await remoteBatchCallback(queries);\n\t\t\t\treturn result.rows;\n\t\t\t};\n\t\t\treturn { ...db, packageName: 'd1-http', proxy, transactionProxy, migrate: migrateFn };\n\t\t} else {\n\t\t\tassertUnreachable(driver);\n\t\t}\n\t}\n\n\tif (await checkPackage('@libsql/client')) {\n\t\tconst { createClient } = await import('@libsql/client');\n\t\tconst { drizzle } = await import('drizzle-orm/libsql');\n\t\tconst { migrate } = await import('drizzle-orm/libsql/migrator');\n\n\t\tconst client = createClient({\n\t\t\turl: normaliseSQLiteUrl(credentials.url, 'libsql'),\n\t\t});\n\t\tconst drzl = drizzle(client);\n\t\tconst migrateFn = async (config: MigrationConfig) => {\n\t\t\treturn migrate(drzl, config);\n\t\t};\n\n\t\tconst db: SQLiteDB = {\n\t\t\tquery: async <T>(sql: string, params?: any[]) => {\n\t\t\t\tconst res = await client.execute({ sql, args: params || [] });\n\t\t\t\treturn res.rows as T[];\n\t\t\t},\n\t\t\trun: async (query: string) => {\n\t\t\t\tawait client.execute(query);\n\t\t\t},\n\t\t};\n\n\t\ttype Transaction = Awaited<ReturnType<typeof client.transaction>>;\n\n\t\tconst proxy = async (params: ProxyParams) => {\n\t\t\tconst preparedParams = prepareSqliteParams(params.params || []);\n\t\t\tconst result = await client.execute({\n\t\t\t\tsql: params.sql,\n\t\t\t\targs: preparedParams,\n\t\t\t});\n\n\t\t\tif (params.mode === 'array') {\n\t\t\t\treturn result.rows.map((row) => Object.values(row));\n\t\t\t} else {\n\t\t\t\treturn result.rows;\n\t\t\t}\n\t\t};\n\n\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\tconst results: (any[] | Error)[] = [];\n\t\t\tlet transaction: Transaction | null = null;\n\t\t\ttry {\n\t\t\t\ttransaction = await client.transaction();\n\t\t\t\tfor (const query of queries) {\n\t\t\t\t\tconst result = await transaction.execute(query.sql);\n\t\t\t\t\tresults.push(result.rows);\n\t\t\t\t}\n\t\t\t\tawait transaction.commit();\n\t\t\t} catch (error) {\n\t\t\t\tresults.push(error as Error);\n\t\t\t\tawait transaction?.rollback();\n\t\t\t} finally {\n\t\t\t\ttransaction?.close();\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t\treturn { ...db, packageName: '@libsql/client', proxy, transactionProxy, migrate: migrateFn };\n\t}\n\n\tif (await checkPackage('better-sqlite3')) {\n\t\tconst { default: Database } = await import('better-sqlite3');\n\t\tconst { drizzle } = await import('drizzle-orm/better-sqlite3');\n\t\tconst { migrate } = await import('drizzle-orm/better-sqlite3/migrator');\n\n\t\tconst sqlite = new Database(\n\t\t\tnormaliseSQLiteUrl(credentials.url, 'better-sqlite'),\n\t\t);\n\t\tconst drzl = drizzle(sqlite);\n\t\tconst migrateFn = async (config: MigrationConfig) => {\n\t\t\treturn migrate(drzl, config);\n\t\t};\n\n\t\tconst db: SQLiteDB = {\n\t\t\tquery: async <T>(sql: string, params: any[] = []) => {\n\t\t\t\treturn sqlite.prepare(sql).bind(params).all() as T[];\n\t\t\t},\n\t\t\trun: async (query: string) => {\n\t\t\t\tsqlite.prepare(query).run();\n\t\t\t},\n\t\t};\n\n\t\tconst proxy: Proxy = async (params) => {\n\t\t\tconst preparedParams = prepareSqliteParams(params.params || []);\n\t\t\tif (\n\t\t\t\tparams.method === 'values'\n\t\t\t\t|| params.method === 'get'\n\t\t\t\t|| params.method === 'all'\n\t\t\t) {\n\t\t\t\treturn sqlite\n\t\t\t\t\t.prepare(params.sql)\n\t\t\t\t\t.raw(params.mode === 'array')\n\t\t\t\t\t.all(preparedParams);\n\t\t\t}\n\n\t\t\tsqlite.prepare(params.sql).run(preparedParams);\n\n\t\t\treturn [];\n\t\t};\n\n\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\tconst results: (any[] | Error)[] = [];\n\n\t\t\tconst tx = sqlite.transaction((queries: Parameters<TransactionProxy>[0]) => {\n\t\t\t\tfor (const query of queries) {\n\t\t\t\t\tlet result: any[] = [];\n\t\t\t\t\tif (query.method === 'values' || query.method === 'get' || query.method === 'all') {\n\t\t\t\t\t\tresult = sqlite\n\t\t\t\t\t\t\t.prepare(query.sql)\n\t\t\t\t\t\t\t.all();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsqlite.prepare(query.sql).run();\n\t\t\t\t\t}\n\t\t\t\t\tresults.push(result);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\ttx(queries);\n\t\t\t} catch (error) {\n\t\t\t\tresults.push(error as Error);\n\t\t\t}\n\n\t\t\treturn results;\n\t\t};\n\n\t\treturn { ...db, packageName: 'better-sqlite3', proxy, transactionProxy, migrate: migrateFn };\n\t}\n\n\tconsole.log(\n\t\t\"Please install either 'better-sqlite3' or '@libsql/client' for Drizzle Kit to connect to SQLite databases\",\n\t);\n\tprocess.exit(1);\n};\n\nexport const connectToLibSQL = async (credentials: LibSQLCredentials): Promise<\n\t& LibSQLDB\n\t& {\n\t\tpackageName: '@libsql/client';\n\t\tmigrate: (config: MigrationConfig) => Promise<void>;\n\t\tproxy: Proxy;\n\t\ttransactionProxy: TransactionProxy;\n\t}\n> => {\n\tif (await checkPackage('@libsql/client')) {\n\t\tconst { createClient } = await import('@libsql/client');\n\t\tconst { drizzle } = await import('drizzle-orm/libsql');\n\t\tconst { migrate } = await import('drizzle-orm/libsql/migrator');\n\n\t\tconst client = createClient({\n\t\t\turl: normaliseSQLiteUrl(credentials.url, 'libsql'),\n\t\t\tauthToken: credentials.authToken,\n\t\t});\n\t\tconst drzl = drizzle(client);\n\t\tconst migrateFn = async (config: MigrationConfig) => {\n\t\t\treturn migrate(drzl, config);\n\t\t};\n\n\t\tconst db: LibSQLDB = {\n\t\t\tquery: async <T>(sql: string, params?: any[]) => {\n\t\t\t\tconst res = await client.execute({ sql, args: params || [] });\n\t\t\t\treturn res.rows as T[];\n\t\t\t},\n\t\t\trun: async (query: string) => {\n\t\t\t\tawait client.execute(query);\n\t\t\t},\n\t\t\tbatchWithPragma: async (queries: string[]) => {\n\t\t\t\tawait client.migrate(queries);\n\t\t\t},\n\t\t};\n\n\t\ttype Transaction = Awaited<ReturnType<typeof client.transaction>>;\n\n\t\tconst proxy = async (params: ProxyParams) => {\n\t\t\tconst preparedParams = prepareSqliteParams(params.params || []);\n\t\t\tconst result = await client.execute({\n\t\t\t\tsql: params.sql,\n\t\t\t\targs: preparedParams,\n\t\t\t});\n\n\t\t\tif (params.mode === 'array') {\n\t\t\t\treturn result.rows.map((row) => Object.values(row));\n\t\t\t} else {\n\t\t\t\treturn result.rows;\n\t\t\t}\n\t\t};\n\n\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\tconst results: (any[] | Error)[] = [];\n\t\t\tlet transaction: Transaction | null = null;\n\t\t\ttry {\n\t\t\t\ttransaction = await client.transaction();\n\t\t\t\tfor (const query of queries) {\n\t\t\t\t\tconst result = await transaction.execute(query.sql);\n\t\t\t\t\tresults.push(result.rows);\n\t\t\t\t}\n\t\t\t\tawait transaction.commit();\n\t\t\t} catch (error) {\n\t\t\t\tresults.push(error as Error);\n\t\t\t\tawait transaction?.rollback();\n\t\t\t} finally {\n\t\t\t\ttransaction?.close();\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t\treturn { ...db, packageName: '@libsql/client', proxy, transactionProxy, migrate: migrateFn };\n\t}\n\n\tconsole.log(\n\t\t\"Please install '@libsql/client' for Drizzle Kit to connect to LibSQL databases\",\n\t);\n\tprocess.exit(1);\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/index.ts",
    "content": "import { command, run } from '@drizzle-team/brocli';\nimport chalk from 'chalk';\nimport { check, drop, exportRaw, generate, migrate, pull, push, studio, up } from './schema';\nimport { ormCoreVersions } from './utils';\n\nconst version = async () => {\n\tconst { npmVersion } = await ormCoreVersions();\n\tconst ormVersion = npmVersion ? `drizzle-orm: v${npmVersion}` : '';\n\tconst envVersion = process.env.DRIZZLE_KIT_VERSION;\n\tconst kitVersion = envVersion ? `v${envVersion}` : '--';\n\tconst versions = `drizzle-kit: ${kitVersion}\\n${ormVersion}`;\n\tconsole.log(chalk.gray(versions), '\\n');\n};\n\nconst legacyCommand = (name: string, newName: string) => {\n\treturn command({\n\t\tname,\n\t\thidden: true,\n\t\thandler: () => {\n\t\t\tconsole.log(\n\t\t\t\t`This command is deprecated, please use updated '${newName}' command (see https://orm.drizzle.team/kit-docs/upgrade-21#how-to-migrate-to-0210)`,\n\t\t\t);\n\t\t},\n\t});\n};\n\nconst legacy = [\n\tlegacyCommand('generate:pg', 'generate'),\n\tlegacyCommand('generate:mysql', 'generate'),\n\tlegacyCommand('generate:sqlite', 'generate'),\n\tlegacyCommand('push:pg', 'push'),\n\tlegacyCommand('push:mysql', 'push'),\n\tlegacyCommand('push:sqlite', 'push'),\n\tlegacyCommand('introspect:pg', 'introspect'),\n\tlegacyCommand('introspect:mysql', 'introspect'),\n\tlegacyCommand('introspect:sqlite', 'introspect'),\n\tlegacyCommand('up:pg', 'up'),\n\tlegacyCommand('up:mysql', 'up'),\n\tlegacyCommand('up:sqlite', 'up'),\n\tlegacyCommand('check:pg', 'check'),\n\tlegacyCommand('check:mysql', 'check'),\n\tlegacyCommand('check:sqlite', 'check'),\n];\n\nrun([generate, migrate, pull, push, studio, up, check, drop, exportRaw, ...legacy], {\n\tname: 'drizzle-kit',\n\tversion: version,\n});\n"
  },
  {
    "path": "drizzle-kit/src/cli/schema.ts",
    "content": "import { boolean, command, number, string } from '@drizzle-team/brocli';\nimport chalk from 'chalk';\nimport 'dotenv/config';\nimport { mkdirSync } from 'fs';\nimport { renderWithTask } from 'hanji';\nimport { dialects } from 'src/schemaValidator';\nimport '../@types/utils';\nimport { assertUnreachable } from '../global';\nimport type { Setup } from '../serializer/studio';\nimport { assertV1OutFolder } from '../utils';\nimport { certs } from '../utils/certs';\nimport { checkHandler } from './commands/check';\nimport { dropMigration } from './commands/drop';\nimport { upMysqlHandler } from './commands/mysqlUp';\nimport { upPgHandler } from './commands/pgUp';\nimport { upSinglestoreHandler } from './commands/singlestoreUp';\nimport { upSqliteHandler } from './commands/sqliteUp';\nimport {\n\tprepareCheckParams,\n\tprepareDropParams,\n\tprepareExportConfig,\n\tprepareGenerateConfig,\n\tprepareMigrateConfig,\n\tpreparePullConfig,\n\tpreparePushConfig,\n\tprepareStudioConfig,\n} from './commands/utils';\nimport { assertOrmCoreVersion, assertPackages, assertStudioNodeVersion, ormVersionGt } from './utils';\nimport { assertCollisions, drivers, prefixes } from './validations/common';\nimport { withStyle } from './validations/outputs';\nimport { error, grey, MigrateProgress } from './views';\n\nconst optionDialect = string('dialect')\n\t.enum(...dialects)\n\t.desc(\n\t\t`Database dialect: 'gel', 'postgresql', 'mysql', 'sqlite', 'turso' or 'singlestore'`,\n\t);\nconst optionOut = string().desc(\"Output folder, 'drizzle' by default\");\nconst optionConfig = string().desc('Path to drizzle config file');\nconst optionBreakpoints = boolean().desc(\n\t`Prepare SQL statements with breakpoints`,\n);\n\nconst optionDriver = string()\n\t.enum(...drivers)\n\t.desc('Database driver');\n\nconst optionCasing = string().enum('camelCase', 'snake_case').desc('Casing for serialization');\n\nexport const generate = command({\n\tname: 'generate',\n\toptions: {\n\t\tconfig: optionConfig,\n\t\tdialect: optionDialect,\n\t\tdriver: optionDriver,\n\t\tcasing: optionCasing,\n\t\tschema: string().desc('Path to a schema file or folder'),\n\t\tout: optionOut,\n\t\tname: string().desc('Migration file name'),\n\t\tbreakpoints: optionBreakpoints,\n\t\tcustom: boolean()\n\t\t\t.desc('Prepare empty migration file for custom SQL')\n\t\t\t.default(false),\n\t\tprefix: string()\n\t\t\t.enum(...prefixes)\n\t\t\t.default('index'),\n\t},\n\ttransform: async (opts) => {\n\t\tconst from = assertCollisions(\n\t\t\t'generate',\n\t\t\topts,\n\t\t\t['prefix', 'name', 'custom'],\n\t\t\t['driver', 'breakpoints', 'schema', 'out', 'dialect', 'casing'],\n\t\t);\n\t\treturn prepareGenerateConfig(opts, from);\n\t},\n\thandler: async (opts) => {\n\t\tawait assertOrmCoreVersion();\n\t\tawait assertPackages('drizzle-orm');\n\n\t\t// const parsed = cliConfigGenerate.parse(opts);\n\n\t\tconst {\n\t\t\tprepareAndMigratePg,\n\t\t\tprepareAndMigrateMysql,\n\t\t\tprepareAndMigrateSqlite,\n\t\t\tprepareAndMigrateLibSQL,\n\t\t\tprepareAndMigrateSingleStore,\n\t\t} = await import('./commands/migrate');\n\n\t\tconst dialect = opts.dialect;\n\t\tif (dialect === 'postgresql') {\n\t\t\tawait prepareAndMigratePg(opts);\n\t\t} else if (dialect === 'mysql') {\n\t\t\tawait prepareAndMigrateMysql(opts);\n\t\t} else if (dialect === 'sqlite') {\n\t\t\tawait prepareAndMigrateSqlite(opts);\n\t\t} else if (dialect === 'turso') {\n\t\t\tawait prepareAndMigrateLibSQL(opts);\n\t\t} else if (dialect === 'singlestore') {\n\t\t\tawait prepareAndMigrateSingleStore(opts);\n\t\t} else if (dialect === 'gel') {\n\t\t\tconsole.log(\n\t\t\t\terror(\n\t\t\t\t\t`You can't use 'generate' command with Gel dialect`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t} else {\n\t\t\tassertUnreachable(dialect);\n\t\t}\n\t},\n});\n\nexport const migrate = command({\n\tname: 'migrate',\n\toptions: {\n\t\tconfig: optionConfig,\n\t},\n\ttransform: async (opts) => {\n\t\treturn await prepareMigrateConfig(opts.config);\n\t},\n\thandler: async (opts) => {\n\t\tawait assertOrmCoreVersion();\n\t\tawait assertPackages('drizzle-orm');\n\n\t\tconst { dialect, schema, table, out, credentials } = opts;\n\t\ttry {\n\t\t\tif (dialect === 'postgresql') {\n\t\t\t\tif ('driver' in credentials) {\n\t\t\t\t\tconst { driver } = credentials;\n\t\t\t\t\tif (driver === 'aws-data-api') {\n\t\t\t\t\t\tif (!(await ormVersionGt('0.30.10'))) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"To use 'aws-data-api' driver - please update drizzle-orm to the latest version\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (driver === 'pglite') {\n\t\t\t\t\t\tif (!(await ormVersionGt('0.30.6'))) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"To use 'pglite' driver - please update drizzle-orm to the latest version\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertUnreachable(driver);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst { preparePostgresDB } = await import('./connections');\n\t\t\t\tconst { migrate } = await preparePostgresDB(credentials);\n\t\t\t\tawait renderWithTask(\n\t\t\t\t\tnew MigrateProgress(),\n\t\t\t\t\tmigrate({\n\t\t\t\t\t\tmigrationsFolder: out,\n\t\t\t\t\t\tmigrationsTable: table,\n\t\t\t\t\t\tmigrationsSchema: schema,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else if (dialect === 'mysql') {\n\t\t\t\tconst { connectToMySQL } = await import('./connections');\n\t\t\t\tconst { migrate } = await connectToMySQL(credentials);\n\t\t\t\tawait renderWithTask(\n\t\t\t\t\tnew MigrateProgress(),\n\t\t\t\t\tmigrate({\n\t\t\t\t\t\tmigrationsFolder: out,\n\t\t\t\t\t\tmigrationsTable: table,\n\t\t\t\t\t\tmigrationsSchema: schema,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else if (dialect === 'singlestore') {\n\t\t\t\tconst { connectToSingleStore } = await import('./connections');\n\t\t\t\tconst { migrate } = await connectToSingleStore(credentials);\n\t\t\t\tawait renderWithTask(\n\t\t\t\t\tnew MigrateProgress(),\n\t\t\t\t\tmigrate({\n\t\t\t\t\t\tmigrationsFolder: out,\n\t\t\t\t\t\tmigrationsTable: table,\n\t\t\t\t\t\tmigrationsSchema: schema,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else if (dialect === 'sqlite') {\n\t\t\t\tconst { connectToSQLite } = await import('./connections');\n\t\t\t\tconst { migrate } = await connectToSQLite(credentials);\n\t\t\t\tawait renderWithTask(\n\t\t\t\t\tnew MigrateProgress(),\n\t\t\t\t\tmigrate({\n\t\t\t\t\t\tmigrationsFolder: opts.out,\n\t\t\t\t\t\tmigrationsTable: table,\n\t\t\t\t\t\tmigrationsSchema: schema,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else if (dialect === 'turso') {\n\t\t\t\tconst { connectToLibSQL } = await import('./connections');\n\t\t\t\tconst { migrate } = await connectToLibSQL(credentials);\n\t\t\t\tawait renderWithTask(\n\t\t\t\t\tnew MigrateProgress(),\n\t\t\t\t\tmigrate({\n\t\t\t\t\t\tmigrationsFolder: opts.out,\n\t\t\t\t\t\tmigrationsTable: table,\n\t\t\t\t\t\tmigrationsSchema: schema,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else if (dialect === 'gel') {\n\t\t\t\tconsole.log(\n\t\t\t\t\terror(\n\t\t\t\t\t\t`You can't use 'migrate' command with Gel dialect`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t} else {\n\t\t\t\tassertUnreachable(dialect);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tprocess.exit(0);\n\t},\n});\n\nconst optionsFilters = {\n\ttablesFilter: string().desc('Table name filters'),\n\tschemaFilters: string().desc('Schema name filters'),\n\textensionsFilters: string().desc(\n\t\t'`Database extensions internal database filters',\n\t),\n} as const;\n\nconst optionsDatabaseCredentials = {\n\turl: string().desc('Database connection URL'),\n\thost: string().desc('Database host'),\n\tport: string().desc('Database port'),\n\tuser: string().desc('Database user'),\n\tpassword: string().desc('Database password'),\n\tdatabase: string().desc('Database name'),\n\tssl: string().desc('ssl mode'),\n\t// Turso\n\tauthToken: string('auth-token').desc('Database auth token [Turso]'),\n\t// gel\n\ttlsSecurity: string('tlsSecurity').desc('tls security mode'),\n\t// specific cases\n\tdriver: optionDriver,\n} as const;\n\nexport const push = command({\n\tname: 'push',\n\toptions: {\n\t\tconfig: optionConfig,\n\t\tdialect: optionDialect,\n\t\tcasing: optionCasing,\n\t\tschema: string().desc('Path to a schema file or folder'),\n\t\t...optionsFilters,\n\t\t...optionsDatabaseCredentials,\n\t\tverbose: boolean()\n\t\t\t.desc('Print all statements for each push')\n\t\t\t.default(false),\n\t\tstrict: boolean().desc('Always ask for confirmation').default(false),\n\t\tforce: boolean()\n\t\t\t.desc(\n\t\t\t\t'Auto-approve all data loss statements. Note: Data loss statements may truncate your tables and data',\n\t\t\t)\n\t\t\t.default(false),\n\t},\n\ttransform: async (opts) => {\n\t\tconst from = assertCollisions(\n\t\t\t'push',\n\t\t\topts,\n\t\t\t['force', 'verbose', 'strict'],\n\t\t\t[\n\t\t\t\t'schema',\n\t\t\t\t'dialect',\n\t\t\t\t'driver',\n\t\t\t\t'url',\n\t\t\t\t'host',\n\t\t\t\t'port',\n\t\t\t\t'user',\n\t\t\t\t'password',\n\t\t\t\t'database',\n\t\t\t\t'ssl',\n\t\t\t\t'authToken',\n\t\t\t\t'schemaFilters',\n\t\t\t\t'extensionsFilters',\n\t\t\t\t'tablesFilter',\n\t\t\t\t'casing',\n\t\t\t\t'tlsSecurity',\n\t\t\t],\n\t\t);\n\n\t\treturn preparePushConfig(opts, from);\n\t},\n\thandler: async (config) => {\n\t\tawait assertPackages('drizzle-orm');\n\t\tawait assertOrmCoreVersion();\n\n\t\tconst {\n\t\t\tdialect,\n\t\t\tschemaPath,\n\t\t\tstrict,\n\t\t\tverbose,\n\t\t\tcredentials,\n\t\t\ttablesFilter,\n\t\t\tschemasFilter,\n\t\t\tforce,\n\t\t\tcasing,\n\t\t\tentities,\n\t\t} = config;\n\n\t\ttry {\n\t\t\tif (dialect === 'mysql') {\n\t\t\t\tconst { mysqlPush } = await import('./commands/push');\n\t\t\t\tawait mysqlPush(\n\t\t\t\t\tschemaPath,\n\t\t\t\t\tcredentials,\n\t\t\t\t\ttablesFilter,\n\t\t\t\t\tstrict,\n\t\t\t\t\tverbose,\n\t\t\t\t\tforce,\n\t\t\t\t\tcasing,\n\t\t\t\t);\n\t\t\t} else if (dialect === 'postgresql') {\n\t\t\t\tif ('driver' in credentials) {\n\t\t\t\t\tconst { driver } = credentials;\n\t\t\t\t\tif (driver === 'aws-data-api') {\n\t\t\t\t\t\tif (!(await ormVersionGt('0.30.10'))) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"To use 'aws-data-api' driver - please update drizzle-orm to the latest version\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (driver === 'pglite') {\n\t\t\t\t\t\tif (!(await ormVersionGt('0.30.6'))) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"To use 'pglite' driver - please update drizzle-orm to the latest version\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertUnreachable(driver);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst { pgPush } = await import('./commands/push');\n\t\t\t\tawait pgPush(\n\t\t\t\t\tschemaPath,\n\t\t\t\t\tverbose,\n\t\t\t\t\tstrict,\n\t\t\t\t\tcredentials,\n\t\t\t\t\ttablesFilter,\n\t\t\t\t\tschemasFilter,\n\t\t\t\t\tentities,\n\t\t\t\t\tforce,\n\t\t\t\t\tcasing,\n\t\t\t\t);\n\t\t\t} else if (dialect === 'sqlite') {\n\t\t\t\tconst { sqlitePush } = await import('./commands/push');\n\t\t\t\tawait sqlitePush(\n\t\t\t\t\tschemaPath,\n\t\t\t\t\tverbose,\n\t\t\t\t\tstrict,\n\t\t\t\t\tcredentials,\n\t\t\t\t\ttablesFilter,\n\t\t\t\t\tforce,\n\t\t\t\t\tcasing,\n\t\t\t\t);\n\t\t\t} else if (dialect === 'turso') {\n\t\t\t\tconst { libSQLPush } = await import('./commands/push');\n\t\t\t\tawait libSQLPush(\n\t\t\t\t\tschemaPath,\n\t\t\t\t\tverbose,\n\t\t\t\t\tstrict,\n\t\t\t\t\tcredentials,\n\t\t\t\t\ttablesFilter,\n\t\t\t\t\tforce,\n\t\t\t\t\tcasing,\n\t\t\t\t);\n\t\t\t} else if (dialect === 'singlestore') {\n\t\t\t\tconst { singlestorePush } = await import('./commands/push');\n\t\t\t\tawait singlestorePush(\n\t\t\t\t\tschemaPath,\n\t\t\t\t\tcredentials,\n\t\t\t\t\ttablesFilter,\n\t\t\t\t\tstrict,\n\t\t\t\t\tverbose,\n\t\t\t\t\tforce,\n\t\t\t\t\tcasing,\n\t\t\t\t);\n\t\t\t} else if (dialect === 'gel') {\n\t\t\t\tconsole.log(\n\t\t\t\t\terror(\n\t\t\t\t\t\t`You can't use 'push' command with Gel dialect`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t} else {\n\t\t\t\tassertUnreachable(dialect);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t\tprocess.exit(0);\n\t},\n});\n\nexport const check = command({\n\tname: 'check',\n\toptions: {\n\t\tconfig: optionConfig,\n\t\tdialect: optionDialect,\n\t\tout: optionOut,\n\t},\n\ttransform: async (opts) => {\n\t\tconst from = assertCollisions('check', opts, [], ['dialect', 'out']);\n\t\treturn prepareCheckParams(opts, from);\n\t},\n\thandler: async (config) => {\n\t\tawait assertOrmCoreVersion();\n\n\t\tconst { out, dialect } = config;\n\t\tcheckHandler(out, dialect);\n\t\tconsole.log(\"Everything's fine 🐶🔥\");\n\t},\n});\n\nexport const up = command({\n\tname: 'up',\n\toptions: {\n\t\tconfig: optionConfig,\n\t\tdialect: optionDialect,\n\t\tout: optionOut,\n\t},\n\ttransform: async (opts) => {\n\t\tconst from = assertCollisions('check', opts, [], ['dialect', 'out']);\n\t\treturn prepareCheckParams(opts, from);\n\t},\n\thandler: async (config) => {\n\t\tawait assertOrmCoreVersion();\n\n\t\tconst { out, dialect } = config;\n\t\tawait assertPackages('drizzle-orm');\n\n\t\tif (dialect === 'postgresql') {\n\t\t\tupPgHandler(out);\n\t\t}\n\n\t\tif (dialect === 'mysql') {\n\t\t\tupMysqlHandler(out);\n\t\t}\n\n\t\tif (dialect === 'sqlite' || dialect === 'turso') {\n\t\t\tupSqliteHandler(out);\n\t\t}\n\n\t\tif (dialect === 'singlestore') {\n\t\t\tupSinglestoreHandler(out);\n\t\t}\n\n\t\tif (dialect === 'gel') {\n\t\t\tconsole.log(\n\t\t\t\terror(\n\t\t\t\t\t`You can't use 'up' command with Gel dialect`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t},\n});\n\nexport const pull = command({\n\tname: 'introspect',\n\taliases: ['pull'],\n\toptions: {\n\t\tconfig: optionConfig,\n\t\tdialect: optionDialect,\n\t\tout: optionOut,\n\t\tbreakpoints: optionBreakpoints,\n\t\tcasing: string('introspect-casing').enum('camel', 'preserve'),\n\t\t...optionsFilters,\n\t\t...optionsDatabaseCredentials,\n\t},\n\ttransform: async (opts) => {\n\t\tconst from = assertCollisions(\n\t\t\t'introspect',\n\t\t\topts,\n\t\t\t[],\n\t\t\t[\n\t\t\t\t'dialect',\n\t\t\t\t'driver',\n\t\t\t\t'out',\n\t\t\t\t'url',\n\t\t\t\t'host',\n\t\t\t\t'port',\n\t\t\t\t'user',\n\t\t\t\t'password',\n\t\t\t\t'database',\n\t\t\t\t'ssl',\n\t\t\t\t'authToken',\n\t\t\t\t'casing',\n\t\t\t\t'breakpoints',\n\t\t\t\t'tablesFilter',\n\t\t\t\t'schemaFilters',\n\t\t\t\t'extensionsFilters',\n\t\t\t\t'tlsSecurity',\n\t\t\t],\n\t\t);\n\t\treturn preparePullConfig(opts, from);\n\t},\n\thandler: async (config) => {\n\t\tawait assertPackages('drizzle-orm');\n\t\tawait assertOrmCoreVersion();\n\n\t\tconst {\n\t\t\tdialect,\n\t\t\tcredentials,\n\t\t\tout,\n\t\t\tcasing,\n\t\t\tbreakpoints,\n\t\t\ttablesFilter,\n\t\t\tschemasFilter,\n\t\t\tprefix,\n\t\t\tentities,\n\t\t} = config;\n\t\tmkdirSync(out, { recursive: true });\n\n\t\tconsole.log(\n\t\t\tgrey(\n\t\t\t\t`Pulling from [${\n\t\t\t\t\tschemasFilter\n\t\t\t\t\t\t.map((it) => `'${it}'`)\n\t\t\t\t\t\t.join(', ')\n\t\t\t\t}] list of schemas`,\n\t\t\t),\n\t\t);\n\t\tconsole.log();\n\n\t\ttry {\n\t\t\tif (dialect === 'postgresql') {\n\t\t\t\tif ('driver' in credentials) {\n\t\t\t\t\tconst { driver } = credentials;\n\t\t\t\t\tif (driver === 'aws-data-api') {\n\t\t\t\t\t\tif (!(await ormVersionGt('0.30.10'))) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"To use 'aws-data-api' driver - please update drizzle-orm to the latest version\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (driver === 'pglite') {\n\t\t\t\t\t\tif (!(await ormVersionGt('0.30.6'))) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"To use 'pglite' driver - please update drizzle-orm to the latest version\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertUnreachable(driver);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst { introspectPostgres } = await import('./commands/introspect');\n\t\t\t\tawait introspectPostgres(\n\t\t\t\t\tcasing,\n\t\t\t\t\tout,\n\t\t\t\t\tbreakpoints,\n\t\t\t\t\tcredentials,\n\t\t\t\t\ttablesFilter,\n\t\t\t\t\tschemasFilter,\n\t\t\t\t\tprefix,\n\t\t\t\t\tentities,\n\t\t\t\t);\n\t\t\t} else if (dialect === 'mysql') {\n\t\t\t\tconst { introspectMysql } = await import('./commands/introspect');\n\t\t\t\tawait introspectMysql(\n\t\t\t\t\tcasing,\n\t\t\t\t\tout,\n\t\t\t\t\tbreakpoints,\n\t\t\t\t\tcredentials,\n\t\t\t\t\ttablesFilter,\n\t\t\t\t\tprefix,\n\t\t\t\t);\n\t\t\t} else if (dialect === 'sqlite') {\n\t\t\t\tconst { introspectSqlite } = await import('./commands/introspect');\n\t\t\t\tawait introspectSqlite(\n\t\t\t\t\tcasing,\n\t\t\t\t\tout,\n\t\t\t\t\tbreakpoints,\n\t\t\t\t\tcredentials,\n\t\t\t\t\ttablesFilter,\n\t\t\t\t\tprefix,\n\t\t\t\t);\n\t\t\t} else if (dialect === 'turso') {\n\t\t\t\tconst { introspectLibSQL } = await import('./commands/introspect');\n\t\t\t\tawait introspectLibSQL(\n\t\t\t\t\tcasing,\n\t\t\t\t\tout,\n\t\t\t\t\tbreakpoints,\n\t\t\t\t\tcredentials,\n\t\t\t\t\ttablesFilter,\n\t\t\t\t\tprefix,\n\t\t\t\t);\n\t\t\t} else if (dialect === 'singlestore') {\n\t\t\t\tconst { introspectSingleStore } = await import('./commands/introspect');\n\t\t\t\tawait introspectSingleStore(\n\t\t\t\t\tcasing,\n\t\t\t\t\tout,\n\t\t\t\t\tbreakpoints,\n\t\t\t\t\tcredentials,\n\t\t\t\t\ttablesFilter,\n\t\t\t\t\tprefix,\n\t\t\t\t);\n\t\t\t} else if (dialect === 'gel') {\n\t\t\t\tconst { introspectGel } = await import('./commands/introspect');\n\t\t\t\tawait introspectGel(\n\t\t\t\t\tcasing,\n\t\t\t\t\tout,\n\t\t\t\t\tbreakpoints,\n\t\t\t\t\tcredentials,\n\t\t\t\t\ttablesFilter,\n\t\t\t\t\tschemasFilter,\n\t\t\t\t\tprefix,\n\t\t\t\t\tentities,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tassertUnreachable(dialect);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t\tprocess.exit(0);\n\t},\n});\n\nexport const drop = command({\n\tname: 'drop',\n\toptions: {\n\t\tconfig: optionConfig,\n\t\tout: optionOut,\n\t\tdriver: optionDriver,\n\t},\n\ttransform: async (opts) => {\n\t\tconst from = assertCollisions('check', opts, [], ['driver', 'out']);\n\t\treturn prepareDropParams(opts, from);\n\t},\n\thandler: async (config) => {\n\t\tawait assertOrmCoreVersion();\n\n\t\tassertV1OutFolder(config.out);\n\t\tawait dropMigration(config);\n\t},\n});\n\nexport const studio = command({\n\tname: 'studio',\n\toptions: {\n\t\tconfig: optionConfig,\n\t\tport: number().desc('Custom port for drizzle studio [default=4983]'),\n\t\thost: string().desc('Custom host for drizzle studio [default=0.0.0.0]'),\n\t\tverbose: boolean()\n\t\t\t.default(false)\n\t\t\t.desc('Print all stataments that are executed by Studio'),\n\t},\n\thandler: async (opts) => {\n\t\tawait assertOrmCoreVersion();\n\t\tawait assertPackages('drizzle-orm');\n\n\t\tassertStudioNodeVersion();\n\n\t\tconst {\n\t\t\tdialect,\n\t\t\tschema: schemaPath,\n\t\t\tport,\n\t\t\thost,\n\t\t\tcredentials,\n\t\t\tcasing,\n\t\t} = await prepareStudioConfig(opts);\n\n\t\tconst {\n\t\t\tdrizzleForPostgres,\n\t\t\tpreparePgSchema,\n\t\t\tprepareMySqlSchema,\n\t\t\tdrizzleForMySQL,\n\t\t\tprepareSQLiteSchema,\n\t\t\tdrizzleForSQLite,\n\t\t\tprepareSingleStoreSchema,\n\t\t\tdrizzleForSingleStore,\n\t\t\tdrizzleForLibSQL,\n\t\t} = await import('../serializer/studio');\n\n\t\tlet setup: Setup;\n\t\ttry {\n\t\t\tif (dialect === 'postgresql') {\n\t\t\t\tif ('driver' in credentials) {\n\t\t\t\t\tconst { driver } = credentials;\n\t\t\t\t\tif (driver === 'aws-data-api') {\n\t\t\t\t\t\tif (!(await ormVersionGt('0.30.10'))) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"To use 'aws-data-api' driver - please update drizzle-orm to the latest version\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (driver === 'pglite') {\n\t\t\t\t\t\tif (!(await ormVersionGt('0.30.6'))) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"To use 'pglite' driver - please update drizzle-orm to the latest version\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertUnreachable(driver);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst { schema, relations, files } = schemaPath\n\t\t\t\t\t? await preparePgSchema(schemaPath)\n\t\t\t\t\t: { schema: {}, relations: {}, files: [] };\n\t\t\t\tsetup = await drizzleForPostgres(credentials, schema, relations, files, casing);\n\t\t\t} else if (dialect === 'mysql') {\n\t\t\t\tconst { schema, relations, files } = schemaPath\n\t\t\t\t\t? await prepareMySqlSchema(schemaPath)\n\t\t\t\t\t: { schema: {}, relations: {}, files: [] };\n\t\t\t\tsetup = await drizzleForMySQL(credentials, schema, relations, files, casing);\n\t\t\t} else if (dialect === 'sqlite') {\n\t\t\t\tconst { schema, relations, files } = schemaPath\n\t\t\t\t\t? await prepareSQLiteSchema(schemaPath)\n\t\t\t\t\t: { schema: {}, relations: {}, files: [] };\n\t\t\t\tsetup = await drizzleForSQLite(credentials, schema, relations, files, casing);\n\t\t\t} else if (dialect === 'turso') {\n\t\t\t\tconst { schema, relations, files } = schemaPath\n\t\t\t\t\t? await prepareSQLiteSchema(schemaPath)\n\t\t\t\t\t: { schema: {}, relations: {}, files: [] };\n\t\t\t\tsetup = await drizzleForLibSQL(credentials, schema, relations, files, casing);\n\t\t\t} else if (dialect === 'singlestore') {\n\t\t\t\tconst { schema, relations, files } = schemaPath\n\t\t\t\t\t? await prepareSingleStoreSchema(schemaPath)\n\t\t\t\t\t: { schema: {}, relations: {}, files: [] };\n\t\t\t\tsetup = await drizzleForSingleStore(\n\t\t\t\t\tcredentials,\n\t\t\t\t\tschema,\n\t\t\t\t\trelations,\n\t\t\t\t\tfiles,\n\t\t\t\t\tcasing,\n\t\t\t\t);\n\t\t\t} else if (dialect === 'gel') {\n\t\t\t\tconsole.log(\n\t\t\t\t\terror(\n\t\t\t\t\t\t`You can't use 'studio' command with Gel dialect`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t} else {\n\t\t\t\tassertUnreachable(dialect);\n\t\t\t}\n\n\t\t\tconst { prepareServer } = await import('../serializer/studio');\n\n\t\t\tconst server = await prepareServer(setup);\n\n\t\t\tconsole.log();\n\t\t\tconsole.log(\n\t\t\t\twithStyle.fullWarning(\n\t\t\t\t\t'Drizzle Studio is currently in Beta. If you find anything that is not working as expected or should be improved, feel free to create an issue on GitHub: https://github.com/drizzle-team/drizzle-kit-mirror/issues/new or write to us on Discord: https://discord.gg/WcRKz2FFxN',\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst { key, cert } = (await certs()) || {};\n\t\t\tserver.start({\n\t\t\t\thost,\n\t\t\t\tport,\n\t\t\t\tkey,\n\t\t\t\tcert,\n\t\t\t\tcb: (err, _address) => {\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\tconsole.error(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst queryParams: { port?: number; host?: string } = {};\n\t\t\t\t\t\tif (port !== 4983) {\n\t\t\t\t\t\t\tqueryParams.port = port;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (host !== '127.0.0.1') {\n\t\t\t\t\t\t\tqueryParams.host = host;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst queryString = Object.keys(queryParams)\n\t\t\t\t\t\t\t.map((key: keyof { port?: number; host?: string }) => {\n\t\t\t\t\t\t\t\treturn `${key}=${queryParams[key]}`;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.join('&');\n\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`\\nDrizzle Studio is up and running on ${\n\t\t\t\t\t\t\t\tchalk.blue(\n\t\t\t\t\t\t\t\t\t`https://local.drizzle.studio${queryString ? `?${queryString}` : ''}`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t\tprocess.exit(0);\n\t\t}\n\t},\n});\n\nexport const exportRaw = command({\n\tname: 'export',\n\tdesc: 'Generate diff between current state and empty state in specified formats: sql',\n\toptions: {\n\t\tsql: boolean('sql').default(true).desc('Generate as sql'),\n\t\tconfig: optionConfig,\n\t\tdialect: optionDialect,\n\t\tschema: string().desc('Path to a schema file or folder'),\n\t},\n\ttransform: async (opts) => {\n\t\tconst from = assertCollisions('export', opts, ['sql'], ['dialect', 'schema']);\n\t\treturn prepareExportConfig(opts, from);\n\t},\n\thandler: async (opts) => {\n\t\tawait assertOrmCoreVersion();\n\t\tawait assertPackages('drizzle-orm');\n\n\t\tconst {\n\t\t\tprepareAndExportPg,\n\t\t\tprepareAndExportMysql,\n\t\t\tprepareAndExportSqlite,\n\t\t\tprepareAndExportLibSQL,\n\t\t\tprepareAndExportSinglestore,\n\t\t} = await import(\n\t\t\t'./commands/migrate'\n\t\t);\n\n\t\tconst dialect = opts.dialect;\n\t\tif (dialect === 'postgresql') {\n\t\t\tawait prepareAndExportPg(opts);\n\t\t} else if (dialect === 'mysql') {\n\t\t\tawait prepareAndExportMysql(opts);\n\t\t} else if (dialect === 'sqlite') {\n\t\t\tawait prepareAndExportSqlite(opts);\n\t\t} else if (dialect === 'turso') {\n\t\t\tawait prepareAndExportLibSQL(opts);\n\t\t} else if (dialect === 'singlestore') {\n\t\t\tawait prepareAndExportSinglestore(opts);\n\t\t} else if (dialect === 'gel') {\n\t\t\tconsole.log(\n\t\t\t\terror(\n\t\t\t\t\t`You can't use 'export' command with Gel dialect`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t} else {\n\t\t\tassertUnreachable(dialect);\n\t\t}\n\t},\n});\n"
  },
  {
    "path": "drizzle-kit/src/cli/selector-ui.ts",
    "content": "import chalk from 'chalk';\nimport { Prompt, SelectState } from 'hanji';\n\nexport class Select extends Prompt<{ index: number; value: string }> {\n\tprivate readonly data: SelectState<{ label: string; value: string }>;\n\n\tconstructor(items: string[]) {\n\t\tsuper();\n\t\tthis.on('attach', (terminal) => terminal.toggleCursor('hide'));\n\t\tthis.on('detach', (terminal) => terminal.toggleCursor('show'));\n\n\t\tthis.data = new SelectState(\n\t\t\titems.map((it) => ({ label: it, value: `${it}-value` })),\n\t\t);\n\t\tthis.data.bind(this);\n\t}\n\n\trender(status: 'idle' | 'submitted' | 'aborted'): string {\n\t\tif (status === 'submitted' || status === 'aborted') return '';\n\n\t\tlet text = ``;\n\t\tthis.data.items.forEach((it, idx) => {\n\t\t\ttext += idx === this.data.selectedIdx\n\t\t\t\t? `${chalk.green('❯ ' + it.label)}`\n\t\t\t\t: `  ${it.label}`;\n\t\t\ttext += idx != this.data.items.length - 1 ? '\\n' : '';\n\t\t});\n\n\t\treturn text;\n\t}\n\n\tresult() {\n\t\treturn {\n\t\t\tindex: this.data.selectedIdx,\n\t\t\tvalue: this.data.items[this.data.selectedIdx]!.value!,\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "drizzle-kit/src/cli/utils.ts",
    "content": "import semver from 'semver';\nimport { err, warning } from './views';\n\nexport const assertExists = (it?: any) => {\n\tif (!it) throw new Error();\n};\n\nexport const ormVersionGt = async (version: string) => {\n\tconst { npmVersion } = await import('drizzle-orm/version');\n\tif (!semver.gte(npmVersion, version)) {\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nexport const assertStudioNodeVersion = () => {\n\tif (semver.gte(process.version, '18.0.0')) return;\n\n\terr('Drizzle Studio requires NodeJS v18 or above');\n\tprocess.exit(1);\n};\n\nexport const checkPackage = async (it: string) => {\n\ttry {\n\t\tawait import(it);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\nexport const assertPackages = async (...pkgs: string[]) => {\n\ttry {\n\t\tfor (let i = 0; i < pkgs.length; i++) {\n\t\t\tconst it = pkgs[i];\n\t\t\tawait import(it);\n\t\t}\n\t} catch (e) {\n\t\terr(\n\t\t\t`please install required packages: ${\n\t\t\t\tpkgs\n\t\t\t\t\t.map((it) => `'${it}'`)\n\t\t\t\t\t.join(' ')\n\t\t\t}`,\n\t\t);\n\t\tprocess.exit(1);\n\t}\n};\n\n// ex: either pg or postgres are needed\nexport const assertEitherPackage = async (\n\t...pkgs: string[]\n): Promise<string[]> => {\n\tconst availables = [] as string[];\n\tfor (let i = 0; i < pkgs.length; i++) {\n\t\ttry {\n\t\t\tconst it = pkgs[i];\n\t\t\tawait import(it);\n\t\t\tavailables.push(it);\n\t\t} catch (e) {}\n\t}\n\n\tif (availables.length > 0) {\n\t\treturn availables;\n\t}\n\n\terr(\n\t\t`Please install one of those packages are needed: ${\n\t\t\tpkgs\n\t\t\t\t.map((it) => `'${it}'`)\n\t\t\t\t.join(' or ')\n\t\t}`,\n\t);\n\tprocess.exit(1);\n};\n\nconst requiredApiVersion = 10;\nexport const assertOrmCoreVersion = async () => {\n\ttry {\n\t\tconst { compatibilityVersion } = await import('drizzle-orm/version');\n\n\t\tawait import('drizzle-orm/relations');\n\n\t\tif (compatibilityVersion && compatibilityVersion === requiredApiVersion) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!compatibilityVersion || compatibilityVersion < requiredApiVersion) {\n\t\t\tconsole.log(\n\t\t\t\t'This version of drizzle-kit requires newer version of drizzle-orm\\nPlease update drizzle-orm package to the latest version 👍',\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t'This version of drizzle-kit is outdated\\nPlease update drizzle-kit package to the latest version 👍',\n\t\t\t);\n\t\t}\n\t} catch (e) {\n\t\tconsole.log('Please install latest version of drizzle-orm');\n\t}\n\tprocess.exit(1);\n};\n\nexport const ormCoreVersions = async () => {\n\ttry {\n\t\tconst { compatibilityVersion, npmVersion } = await import(\n\t\t\t'drizzle-orm/version'\n\t\t);\n\t\treturn { compatibilityVersion, npmVersion };\n\t} catch (e) {\n\t\treturn {};\n\t}\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/validations/cli.ts",
    "content": "import { array, boolean, intersection, literal, object, string, TypeOf, union } from 'zod';\nimport { dialect } from '../../schemaValidator';\nimport { casing, casingType, prefix } from './common';\n\nexport const cliConfigGenerate = object({\n\tdialect: dialect.optional(),\n\tschema: union([string(), string().array()]).optional(),\n\tout: string().optional().default('./drizzle'),\n\tconfig: string().optional(),\n\tname: string().optional(),\n\tprefix: prefix.optional(),\n\tbreakpoints: boolean().optional().default(true),\n\tcustom: boolean().optional().default(false),\n}).strict();\n\nexport type CliConfigGenerate = TypeOf<typeof cliConfigGenerate>;\n\nexport const pushParams = object({\n\tdialect: dialect,\n\tcasing: casingType.optional(),\n\tschema: union([string(), string().array()]),\n\ttablesFilter: union([string(), string().array()]).optional(),\n\tschemaFilter: union([string(), string().array()])\n\t\t.optional()\n\t\t.default(['public']),\n\textensionsFilters: literal('postgis').array().optional(),\n\tverbose: boolean().optional(),\n\tstrict: boolean().optional(),\n\tentities: object({\n\t\troles: boolean().or(object({\n\t\t\tprovider: string().optional(),\n\t\t\tinclude: string().array().optional(),\n\t\t\texclude: string().array().optional(),\n\t\t})).optional().default(false),\n\t}).optional(),\n}).passthrough();\n\nexport type PushParams = TypeOf<typeof pushParams>;\n\nexport const pullParams = object({\n\tconfig: string().optional(),\n\tdialect: dialect,\n\tout: string().optional().default('drizzle'),\n\ttablesFilter: union([string(), string().array()]).optional(),\n\tschemaFilter: union([string(), string().array()])\n\t\t.optional()\n\t\t.default(['public']),\n\textensionsFilters: literal('postgis').array().optional(),\n\tcasing,\n\tbreakpoints: boolean().optional().default(true),\n\tmigrations: object({\n\t\tprefix: prefix.optional().default('index'),\n\t}).optional(),\n\tentities: object({\n\t\troles: boolean().or(object({\n\t\t\tprovider: string().optional(),\n\t\t\tinclude: string().array().optional(),\n\t\t\texclude: string().array().optional(),\n\t\t})).optional().default(false),\n\t}).optional(),\n}).passthrough();\n\nexport type Entities = TypeOf<typeof pullParams>['entities'];\n\nexport type PullParams = TypeOf<typeof pullParams>;\n\nexport const configCheck = object({\n\tdialect: dialect.optional(),\n\tout: string().optional(),\n});\n\nexport const cliConfigCheck = intersection(\n\tobject({\n\t\tconfig: string().optional(),\n\t}),\n\tconfigCheck,\n);\n\nexport type CliCheckConfig = TypeOf<typeof cliConfigCheck>;\n"
  },
  {
    "path": "drizzle-kit/src/cli/validations/common.ts",
    "content": "import chalk from 'chalk';\nimport { UnionToIntersection } from 'hono/utils/types';\nimport { any, boolean, enum as enum_, literal, object, string, TypeOf, union } from 'zod';\nimport { dialect } from '../../schemaValidator';\nimport { outputs } from './outputs';\n\nexport type Commands =\n\t| 'introspect'\n\t| 'generate'\n\t| 'check'\n\t| 'up'\n\t| 'drop'\n\t| 'push'\n\t| 'export';\n\ntype Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;\ntype IsUnion<T> = [T] extends [UnionToIntersection<T>] ? false : true;\ntype LastTupleElement<TArr extends any[]> = TArr extends [\n\t...start: infer _,\n\tend: infer Last,\n] ? Last\n\t: never;\n\nexport type UniqueArrayOfUnion<TUnion, TArray extends TUnion[]> = Exclude<\n\tTUnion,\n\tTArray[number]\n> extends never ? [TUnion]\n\t: [...TArray, Exclude<TUnion, TArray[number]>];\n\nexport const assertCollisions = <\n\tT extends Record<string, unknown>,\n\tTKeys extends (keyof T)[],\n\tTRemainingKeys extends Exclude<keyof T, TKeys[number] | 'config'>[],\n\tExhaustive extends TRemainingKeys,\n\tUNIQ extends UniqueArrayOfUnion<TRemainingKeys[number], Exhaustive>,\n>(\n\tcommand: Commands,\n\toptions: T,\n\twhitelist: Exclude<TKeys, 'config'>,\n\tremainingKeys: UniqueArrayOfUnion<TRemainingKeys[number], Exhaustive>,\n): IsUnion<LastTupleElement<UNIQ>> extends false ? 'cli' | 'config' : TKeys => {\n\tconst { config, ...rest } = options;\n\n\tlet atLeastOneParam = false;\n\tfor (const key of Object.keys(rest)) {\n\t\tif (whitelist.includes(key)) continue;\n\n\t\tatLeastOneParam = atLeastOneParam || rest[key] !== undefined;\n\t}\n\n\tif (!config && atLeastOneParam) {\n\t\treturn 'cli' as any;\n\t}\n\n\tif (!atLeastOneParam) {\n\t\treturn 'config' as any;\n\t}\n\n\t// if config and cli - return error - write a reason\n\tconsole.log(outputs.common.ambiguousParams(command));\n\tprocess.exit(1);\n};\n\nexport const sqliteDriversLiterals = [\n\tliteral('d1-http'),\n\tliteral('expo'),\n\tliteral('durable-sqlite'),\n] as const;\n\nexport const postgresqlDriversLiterals = [\n\tliteral('aws-data-api'),\n\tliteral('pglite'),\n] as const;\n\nexport const prefixes = [\n\t'index',\n\t'timestamp',\n\t'supabase',\n\t'unix',\n\t'none',\n] as const;\nexport const prefix = enum_(prefixes);\nexport type Prefix = (typeof prefixes)[number];\n\n{\n\tconst _: Prefix = '' as TypeOf<typeof prefix>;\n}\n\nexport const casingTypes = ['snake_case', 'camelCase'] as const;\nexport const casingType = enum_(casingTypes);\nexport type CasingType = (typeof casingTypes)[number];\n\nexport const sqliteDriver = union(sqliteDriversLiterals);\nexport const postgresDriver = union(postgresqlDriversLiterals);\nexport const driver = union([sqliteDriver, postgresDriver]);\n\nexport const configMigrations = object({\n\ttable: string().optional(),\n\tschema: string().optional(),\n\tprefix: prefix.optional().default('index'),\n}).optional();\n\nexport const configCommonSchema = object({\n\tdialect: dialect,\n\tschema: union([string(), string().array()]).optional(),\n\tout: string().optional(),\n\tbreakpoints: boolean().optional().default(true),\n\tverbose: boolean().optional().default(false),\n\tdriver: driver.optional(),\n\ttablesFilter: union([string(), string().array()]).optional(),\n\tschemaFilter: union([string(), string().array()]).default(['public']),\n\tmigrations: configMigrations,\n\tdbCredentials: any().optional(),\n\tcasing: casingType.optional(),\n\tsql: boolean().default(true),\n}).passthrough();\n\nexport const casing = union([literal('camel'), literal('preserve')]).default(\n\t'camel',\n);\n\nexport const introspectParams = object({\n\tschema: union([string(), string().array()]).optional(),\n\tout: string().optional().default('./drizzle'),\n\tbreakpoints: boolean().default(true),\n\ttablesFilter: union([string(), string().array()]).optional(),\n\tschemaFilter: union([string(), string().array()]).default(['public']),\n\tintrospect: object({\n\t\tcasing,\n\t}).default({ casing: 'camel' }),\n});\n\nexport type IntrospectParams = TypeOf<typeof introspectParams>;\nexport type Casing = TypeOf<typeof casing>;\n\nexport const configIntrospectCliSchema = object({\n\tschema: union([string(), string().array()]).optional(),\n\tout: string().optional().default('./drizzle'),\n\tbreakpoints: boolean().default(true),\n\ttablesFilter: union([string(), string().array()]).optional(),\n\tschemaFilter: union([string(), string().array()]).default(['public']),\n\tintrospectCasing: union([literal('camel'), literal('preserve')]).default(\n\t\t'camel',\n\t),\n});\n\nexport const configGenerateSchema = object({\n\tschema: union([string(), string().array()]),\n\tout: string().optional().default('./drizzle'),\n\tbreakpoints: boolean().default(true),\n});\n\nexport type GenerateSchema = TypeOf<typeof configGenerateSchema>;\n\nexport const configPushSchema = object({\n\tdialect: dialect,\n\tschema: union([string(), string().array()]),\n\ttablesFilter: union([string(), string().array()]).optional(),\n\tschemaFilter: union([string(), string().array()]).default(['public']),\n\tverbose: boolean().default(false),\n\tstrict: boolean().default(false),\n\tout: string().optional(),\n});\n\nexport type CliConfig = TypeOf<typeof configCommonSchema>;\nexport const drivers = ['d1-http', 'expo', 'aws-data-api', 'pglite', 'durable-sqlite'] as const;\nexport type Driver = (typeof drivers)[number];\nconst _: Driver = '' as TypeOf<typeof driver>;\n\nexport const wrapParam = (\n\tname: string,\n\tparam: any | undefined,\n\toptional: boolean = false,\n\ttype?: 'url' | 'secret',\n) => {\n\tconst check = `[${chalk.green('✓')}]`;\n\tconst cross = `[${chalk.red('x')}]`;\n\tif (typeof param === 'string') {\n\t\tif (param.length === 0) {\n\t\t\treturn `    ${cross} ${name}: ''`;\n\t\t}\n\t\tif (type === 'secret') {\n\t\t\treturn `    ${check} ${name}: '*****'`;\n\t\t} else if (type === 'url') {\n\t\t\treturn `    ${check} ${name}: '${param.replace(/(?<=:\\/\\/[^:\\n]*:)([^@]*)/, '****')}'`;\n\t\t}\n\t\treturn `    ${check} ${name}: '${param}'`;\n\t}\n\tif (optional) {\n\t\treturn chalk.gray(`        ${name}?: `);\n\t}\n\treturn `    ${cross} ${name}: ${chalk.gray('undefined')}`;\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/validations/gel.ts",
    "content": "import { coerce, literal, object, string, TypeOf, undefined as undefinedType, union } from 'zod';\nimport { error } from '../views';\nimport { wrapParam } from './common';\n\nexport const gelCredentials = union([\n\tobject({\n\t\tdriver: undefinedType(),\n\t\thost: string().min(1),\n\t\tport: coerce.number().min(1).optional(),\n\t\tuser: string().min(1).optional(),\n\t\tpassword: string().min(1).optional(),\n\t\tdatabase: string().min(1),\n\t\ttlsSecurity: union([\n\t\t\tliteral('insecure'),\n\t\t\tliteral('no_host_verification'),\n\t\t\tliteral('strict'),\n\t\t\tliteral('default'),\n\t\t]).optional(),\n\t}).transform((o) => {\n\t\tdelete o.driver;\n\t\treturn o as Omit<typeof o, 'driver'>;\n\t}),\n\tobject({\n\t\tdriver: undefinedType(),\n\t\turl: string().min(1),\n\t\ttlsSecurity: union([\n\t\t\tliteral('insecure'),\n\t\t\tliteral('no_host_verification'),\n\t\t\tliteral('strict'),\n\t\t\tliteral('default'),\n\t\t]).optional(),\n\t}).transform<{\n\t\turl: string;\n\t\ttlsSecurity?:\n\t\t\t| 'insecure'\n\t\t\t| 'no_host_verification'\n\t\t\t| 'strict'\n\t\t\t| 'default';\n\t}>((o) => {\n\t\tdelete o.driver;\n\t\treturn o;\n\t}),\n\tobject({\n\t\tdriver: undefinedType(),\n\t}).transform<undefined>((o) => {\n\t\treturn undefined;\n\t}),\n]);\n\nexport type GelCredentials = TypeOf<typeof gelCredentials>;\n\nexport const printConfigConnectionIssues = (\n\toptions: Record<string, unknown>,\n) => {\n\tif ('url' in options) {\n\t\tlet text = `Please provide required params for Gel driver:\\n`;\n\t\tconsole.log(error(text));\n\t\tconsole.log(wrapParam('url', options.url, false, 'url'));\n\t\tprocess.exit(1);\n\t}\n\n\tif ('host' in options || 'database' in options) {\n\t\tlet text = `Please provide required params for Gel driver:\\n`;\n\t\tconsole.log(error(text));\n\t\tconsole.log(wrapParam('host', options.host));\n\t\tconsole.log(wrapParam('port', options.port, true));\n\t\tconsole.log(wrapParam('user', options.user, true));\n\t\tconsole.log(wrapParam('password', options.password, true, 'secret'));\n\t\tconsole.log(wrapParam('database', options.database));\n\t\tconsole.log(wrapParam('tlsSecurity', options.tlsSecurity, true));\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(\n\t\terror(\n\t\t\t`Either connection \"url\" or \"host\", \"database\" are required for Gel database connection`,\n\t\t),\n\t);\n\tprocess.exit(1);\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/validations/libsql.ts",
    "content": "import { softAssertUnreachable } from 'src/global';\nimport { object, string, TypeOf } from 'zod';\nimport { error } from '../views';\nimport { wrapParam } from './common';\n\nexport const libSQLCredentials = object({\n\turl: string().min(1),\n\tauthToken: string().min(1).optional(),\n});\n\nexport type LibSQLCredentials = {\n\turl: string;\n\tauthToken?: string;\n};\n\nconst _: LibSQLCredentials = {} as TypeOf<typeof libSQLCredentials>;\n\nexport const printConfigConnectionIssues = (\n\toptions: Record<string, unknown>,\n\tcommand: 'generate' | 'migrate' | 'push' | 'pull' | 'studio',\n) => {\n\tlet text = `Please provide required params for 'turso' dialect:\\n`;\n\tconsole.log(error(text));\n\tconsole.log(wrapParam('url', options.url));\n\tconsole.log(wrapParam('authToken', options.authToken, true, 'secret'));\n\tprocess.exit(1);\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/validations/mysql.ts",
    "content": "import { boolean, coerce, object, string, TypeOf, union } from 'zod';\nimport { error } from '../views';\nimport { wrapParam } from './common';\nimport { outputs } from './outputs';\n\nexport const mysqlCredentials = union([\n\tobject({\n\t\thost: string().min(1),\n\t\tport: coerce.number().min(1).optional(),\n\t\tuser: string().min(1).optional(),\n\t\tpassword: string().min(1).optional(),\n\t\tdatabase: string().min(1),\n\t\tssl: union([\n\t\t\tstring(),\n\t\t\tobject({\n\t\t\t\tpfx: string().optional(),\n\t\t\t\tkey: string().optional(),\n\t\t\t\tpassphrase: string().optional(),\n\t\t\t\tcert: string().optional(),\n\t\t\t\tca: union([string(), string().array()]).optional(),\n\t\t\t\tcrl: union([string(), string().array()]).optional(),\n\t\t\t\tciphers: string().optional(),\n\t\t\t\trejectUnauthorized: boolean().optional(),\n\t\t\t}),\n\t\t]).optional(),\n\t}),\n\tobject({\n\t\turl: string().min(1),\n\t}),\n]);\n\nexport type MysqlCredentials = TypeOf<typeof mysqlCredentials>;\n\nexport const printCliConnectionIssues = (options: any) => {\n\tconst { uri, host, database } = options || {};\n\n\tif (!uri && (!host || !database)) {\n\t\tconsole.log(outputs.mysql.connection.required());\n\t}\n};\n\nexport const printConfigConnectionIssues = (\n\toptions: Record<string, unknown>,\n) => {\n\tif ('url' in options) {\n\t\tlet text = `Please provide required params for MySQL driver:\\n`;\n\t\tconsole.log(error(text));\n\t\tconsole.log(wrapParam('url', options.url, false, 'url'));\n\t\tprocess.exit(1);\n\t}\n\n\tlet text = `Please provide required params for MySQL driver:\\n`;\n\tconsole.log(error(text));\n\tconsole.log(wrapParam('host', options.host));\n\tconsole.log(wrapParam('port', options.port, true));\n\tconsole.log(wrapParam('user', options.user, true));\n\tconsole.log(wrapParam('password', options.password, true, 'secret'));\n\tconsole.log(wrapParam('database', options.database));\n\tconsole.log(wrapParam('ssl', options.ssl, true));\n\tprocess.exit(1);\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/validations/outputs.ts",
    "content": "import chalk from 'chalk';\nimport { sqliteDriversLiterals } from './common';\n\nexport const withStyle = {\n\terror: (str: string) => `${chalk.red(`${chalk.white.bgRed(' Invalid input ')} ${str}`)}`,\n\twarning: (str: string) => `${chalk.white.bgGray(' Warning ')} ${str}`,\n\terrorWarning: (str: string) => `${chalk.red(`${chalk.white.bgRed(' Warning ')} ${str}`)}`,\n\tfullWarning: (str: string) => `${chalk.black.bgYellow(' Warning ')} ${chalk.bold(str)}`,\n\tsuggestion: (str: string) => `${chalk.white.bgGray(' Suggestion ')} ${str}`,\n\tinfo: (str: string) => `${chalk.grey(str)}`,\n};\n\nexport const outputs = {\n\tstudio: {\n\t\tdrivers: (param: string) =>\n\t\t\twithStyle.error(\n\t\t\t\t`\"${param}\" is not a valid driver. Available drivers: \"pg\", \"mysql2\", \"better-sqlite\", \"libsql\", \"turso\". You can read more about drizzle.config: https://orm.drizzle.team/kit-docs/config-reference`,\n\t\t\t),\n\t\tnoCredentials: () =>\n\t\t\twithStyle.error(\n\t\t\t\t`Please specify a 'dbCredentials' param in config. It will help drizzle to know how to query you database. You can read more about drizzle.config: https://orm.drizzle.team/kit-docs/config-reference`,\n\t\t\t),\n\t\tnoDriver: () =>\n\t\t\twithStyle.error(\n\t\t\t\t`Please specify a 'driver' param in config. It will help drizzle to know how to query you database. You can read more about drizzle.config: https://orm.drizzle.team/kit-docs/config-reference`,\n\t\t\t),\n\t\tnoDialect: () =>\n\t\t\twithStyle.error(\n\t\t\t\t`Please specify 'dialect' param in config, either of 'postgresql', 'mysql', 'sqlite', turso or singlestore`,\n\t\t\t),\n\t},\n\tcommon: {\n\t\tambiguousParams: (command: string) =>\n\t\t\twithStyle.error(\n\t\t\t\t`You can't use both --config and other cli options for ${command} command`,\n\t\t\t),\n\t\tschema: (command: string) => withStyle.error(`\"--schema\" is a required field for ${command} command`),\n\t},\n\tpostgres: {\n\t\tconnection: {\n\t\t\trequired: () =>\n\t\t\t\twithStyle.error(\n\t\t\t\t\t`Either \"url\" or \"host\", \"database\" are required for database connection`,\n\t\t\t\t),\n\t\t\tawsDataApi: () =>\n\t\t\t\twithStyle.error(\n\t\t\t\t\t\"You need to provide 'database', 'secretArn' and 'resourceArn' for Drizzle Kit to connect to AWS Data API\",\n\t\t\t\t),\n\t\t},\n\t},\n\tmysql: {\n\t\tconnection: {\n\t\t\tdriver: () => withStyle.error(`Only \"mysql2\" is available options for \"--driver\"`),\n\t\t\trequired: () =>\n\t\t\t\twithStyle.error(\n\t\t\t\t\t`Either \"url\" or \"host\", \"database\" are required for database connection`,\n\t\t\t\t),\n\t\t},\n\t},\n\tsqlite: {\n\t\tconnection: {\n\t\t\tdriver: () => {\n\t\t\t\tconst listOfDrivers = sqliteDriversLiterals\n\t\t\t\t\t.map((it) => `'${it.value}'`)\n\t\t\t\t\t.join(', ');\n\t\t\t\treturn withStyle.error(\n\t\t\t\t\t`Either ${listOfDrivers} are available options for 'driver' param`,\n\t\t\t\t);\n\t\t\t},\n\t\t\turl: (driver: string) =>\n\t\t\t\twithStyle.error(\n\t\t\t\t\t`\"url\" is a required option for driver \"${driver}\". You can read more about drizzle.config: https://orm.drizzle.team/kit-docs/config-reference`,\n\t\t\t\t),\n\t\t\tauthToken: (driver: string) =>\n\t\t\t\twithStyle.error(\n\t\t\t\t\t`\"authToken\" is a required option for driver \"${driver}\". You can read more about drizzle.config: https://orm.drizzle.team/kit-docs/config-reference`,\n\t\t\t\t),\n\t\t},\n\t\tintrospect: {},\n\t\tpush: {},\n\t},\n\tsinglestore: {\n\t\tconnection: {\n\t\t\tdriver: () => withStyle.error(`Only \"mysql2\" is available options for \"--driver\"`),\n\t\t\trequired: () =>\n\t\t\t\twithStyle.error(\n\t\t\t\t\t`Either \"url\" or \"host\", \"database\" are required for database connection`,\n\t\t\t\t),\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/validations/postgres.ts",
    "content": "import { boolean, coerce, literal, object, string, TypeOf, undefined, union } from 'zod';\nimport { error } from '../views';\nimport { wrapParam } from './common';\n\nexport const postgresCredentials = union([\n\tobject({\n\t\tdriver: undefined(),\n\t\thost: string().min(1),\n\t\tport: coerce.number().min(1).optional(),\n\t\tuser: string().min(1).optional(),\n\t\tpassword: string().min(1).optional(),\n\t\tdatabase: string().min(1),\n\t\tssl: union([\n\t\t\tliteral('require'),\n\t\t\tliteral('allow'),\n\t\t\tliteral('prefer'),\n\t\t\tliteral('verify-full'),\n\t\t\tboolean(),\n\t\t\tobject({}).passthrough(),\n\t\t]).optional(),\n\t}).transform((o) => {\n\t\tdelete o.driver;\n\t\treturn o as Omit<typeof o, 'driver'>;\n\t}),\n\tobject({\n\t\tdriver: undefined(),\n\t\turl: string().min(1),\n\t}).transform<{ url: string }>((o) => {\n\t\tdelete o.driver;\n\t\treturn o;\n\t}),\n\tobject({\n\t\tdriver: literal('aws-data-api'),\n\t\tdatabase: string().min(1),\n\t\tsecretArn: string().min(1),\n\t\tresourceArn: string().min(1),\n\t}),\n\tobject({\n\t\tdriver: literal('pglite'),\n\t\turl: string().min(1),\n\t}),\n]);\n\nexport type PostgresCredentials = TypeOf<typeof postgresCredentials>;\n\nexport const printConfigConnectionIssues = (\n\toptions: Record<string, unknown>,\n) => {\n\tif (options.driver === 'aws-data-api') {\n\t\tlet text = `Please provide required params for AWS Data API driver:\\n`;\n\t\tconsole.log(error(text));\n\t\tconsole.log(wrapParam('database', options.database));\n\t\tconsole.log(wrapParam('secretArn', options.secretArn, false, 'secret'));\n\t\tconsole.log(wrapParam('resourceArn', options.resourceArn, false, 'secret'));\n\t\tprocess.exit(1);\n\t}\n\n\tif ('url' in options) {\n\t\tlet text = `Please provide required params for Postgres driver:\\n`;\n\t\tconsole.log(error(text));\n\t\tconsole.log(wrapParam('url', options.url, false, 'url'));\n\t\tprocess.exit(1);\n\t}\n\n\tif ('host' in options || 'database' in options) {\n\t\tlet text = `Please provide required params for Postgres driver:\\n`;\n\t\tconsole.log(error(text));\n\t\tconsole.log(wrapParam('host', options.host));\n\t\tconsole.log(wrapParam('port', options.port, true));\n\t\tconsole.log(wrapParam('user', options.user, true));\n\t\tconsole.log(wrapParam('password', options.password, true, 'secret'));\n\t\tconsole.log(wrapParam('database', options.database));\n\t\tconsole.log(wrapParam('ssl', options.ssl, true));\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(\n\t\terror(\n\t\t\t`Either connection \"url\" or \"host\", \"database\" are required for PostgreSQL database connection`,\n\t\t),\n\t);\n\tprocess.exit(1);\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/validations/singlestore.ts",
    "content": "import { boolean, coerce, object, string, TypeOf, union } from 'zod';\nimport { error } from '../views';\nimport { wrapParam } from './common';\nimport { outputs } from './outputs';\n\nexport const singlestoreCredentials = union([\n\tobject({\n\t\thost: string().min(1),\n\t\tport: coerce.number().min(1).optional(),\n\t\tuser: string().min(1).optional(),\n\t\tpassword: string().min(1).optional(),\n\t\tdatabase: string().min(1),\n\t\tssl: union([\n\t\t\tstring(),\n\t\t\tobject({\n\t\t\t\tpfx: string().optional(),\n\t\t\t\tkey: string().optional(),\n\t\t\t\tpassphrase: string().optional(),\n\t\t\t\tcert: string().optional(),\n\t\t\t\tca: union([string(), string().array()]).optional(),\n\t\t\t\tcrl: union([string(), string().array()]).optional(),\n\t\t\t\tciphers: string().optional(),\n\t\t\t\trejectUnauthorized: boolean().optional(),\n\t\t\t}),\n\t\t]).optional(),\n\t}),\n\tobject({\n\t\turl: string().min(1),\n\t}),\n]);\n\nexport type SingleStoreCredentials = TypeOf<typeof singlestoreCredentials>;\n\nexport const printCliConnectionIssues = (options: any) => {\n\tconst { uri, host, database } = options || {};\n\n\tif (!uri && (!host || !database)) {\n\t\tconsole.log(outputs.singlestore.connection.required());\n\t}\n};\n\nexport const printConfigConnectionIssues = (\n\toptions: Record<string, unknown>,\n) => {\n\tif ('url' in options) {\n\t\tlet text = `Please provide required params for SingleStore driver:\\n`;\n\t\tconsole.log(error(text));\n\t\tconsole.log(wrapParam('url', options.url, false, 'url'));\n\t\tprocess.exit(1);\n\t}\n\n\tlet text = `Please provide required params for SingleStore driver:\\n`;\n\tconsole.log(error(text));\n\tconsole.log(wrapParam('host', options.host));\n\tconsole.log(wrapParam('port', options.port, true));\n\tconsole.log(wrapParam('user', options.user, true));\n\tconsole.log(wrapParam('password', options.password, true, 'secret'));\n\tconsole.log(wrapParam('database', options.database));\n\tconsole.log(wrapParam('ssl', options.ssl, true));\n\tprocess.exit(1);\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/validations/sqlite.ts",
    "content": "import { softAssertUnreachable } from 'src/global';\nimport { literal, object, string, TypeOf, undefined, union } from 'zod';\nimport { error } from '../views';\nimport { sqliteDriver, wrapParam } from './common';\n\nexport const sqliteCredentials = union([\n\tobject({\n\t\tdriver: literal('turso'),\n\t\turl: string().min(1),\n\t\tauthToken: string().min(1).optional(),\n\t}),\n\tobject({\n\t\tdriver: literal('d1-http'),\n\t\taccountId: string().min(1),\n\t\tdatabaseId: string().min(1),\n\t\ttoken: string().min(1),\n\t}),\n\tobject({\n\t\tdriver: undefined(),\n\t\turl: string().min(1),\n\t}).transform<{ url: string }>((o) => {\n\t\tdelete o.driver;\n\t\treturn o;\n\t}),\n]);\n\nexport type SqliteCredentials =\n\t| {\n\t\tdriver: 'd1-http';\n\t\taccountId: string;\n\t\tdatabaseId: string;\n\t\ttoken: string;\n\t}\n\t| {\n\t\turl: string;\n\t};\n\nconst _: SqliteCredentials = {} as TypeOf<typeof sqliteCredentials>;\n\nexport const printConfigConnectionIssues = (\n\toptions: Record<string, unknown>,\n\tcommand: 'generate' | 'migrate' | 'push' | 'pull' | 'studio',\n) => {\n\tconst parsedDriver = sqliteDriver.safeParse(options.driver);\n\tconst driver = parsedDriver.success ? parsedDriver.data : ('' as never);\n\n\tif (driver === 'expo') {\n\t\tif (command === 'migrate') {\n\t\t\tconsole.log(\n\t\t\t\terror(\n\t\t\t\t\t`You can't use 'migrate' command with Expo SQLite, please follow migration instructions in our docs - https://orm.drizzle.team/docs/get-started-sqlite#expo-sqlite`,\n\t\t\t\t),\n\t\t\t);\n\t\t} else if (command === 'studio') {\n\t\t\tconsole.log(\n\t\t\t\terror(\n\t\t\t\t\t`You can't use 'studio' command with Expo SQLite, please use Expo Plugin https://www.npmjs.com/package/expo-drizzle-studio-plugin`,\n\t\t\t\t),\n\t\t\t);\n\t\t} else if (command === 'pull') {\n\t\t\tconsole.log(error(\"You can't use 'pull' command with Expo SQLite\"));\n\t\t} else if (command === 'push') {\n\t\t\tconsole.log(error(\"You can't use 'push' command with Expo SQLite\"));\n\t\t} else {\n\t\t\tconsole.log(error('Unexpected error with expo driver 🤔'));\n\t\t}\n\t\tprocess.exit(1);\n\t} else if (driver === 'd1-http') {\n\t\tlet text = `Please provide required params for D1 HTTP driver:\\n`;\n\t\tconsole.log(error(text));\n\t\tconsole.log(wrapParam('accountId', options.accountId));\n\t\tconsole.log(wrapParam('databaseId', options.databaseId));\n\t\tconsole.log(wrapParam('token', options.token, false, 'secret'));\n\t\tprocess.exit(1);\n\t} else if (driver === 'durable-sqlite') {\n\t\tif (command === 'migrate') {\n\t\t\tconsole.log(\n\t\t\t\terror(\n\t\t\t\t\t`You can't use 'migrate' command with SQLite Durable Objects`,\n\t\t\t\t),\n\t\t\t);\n\t\t} else if (command === 'studio') {\n\t\t\tconsole.log(\n\t\t\t\terror(\n\t\t\t\t\t`You can't use 'studio' command with SQLite Durable Objects`,\n\t\t\t\t),\n\t\t\t);\n\t\t} else if (command === 'pull') {\n\t\t\tconsole.log(error(\"You can't use 'pull' command with SQLite Durable Objects\"));\n\t\t} else if (command === 'push') {\n\t\t\tconsole.log(error(\"You can't use 'push' command with SQLite Durable Objects\"));\n\t\t} else {\n\t\t\tconsole.log(error('Unexpected error with SQLite Durable Object driver 🤔'));\n\t\t}\n\t\tprocess.exit(1);\n\t} else {\n\t\tsoftAssertUnreachable(driver);\n\t}\n\n\tlet text = `Please provide required params:\\n`;\n\tconsole.log(error(text));\n\tconsole.log(wrapParam('url', options.url));\n\tprocess.exit(1);\n};\n"
  },
  {
    "path": "drizzle-kit/src/cli/validations/studio.ts",
    "content": "import { coerce, intersection, object, string, TypeOf, union } from 'zod';\nimport { dialect } from '../../schemaValidator';\nimport { casingType } from './common';\nimport { mysqlCredentials } from './mysql';\nimport { postgresCredentials } from './postgres';\nimport { sqliteCredentials } from './sqlite';\n\nexport const credentials = intersection(\n\tpostgresCredentials,\n\tmysqlCredentials,\n\tsqliteCredentials,\n);\n\nexport type Credentials = TypeOf<typeof credentials>;\n\nexport const studioCliParams = object({\n\tport: coerce.number().optional().default(4983),\n\thost: string().optional().default('127.0.0.1'),\n\tconfig: string().optional(),\n});\n\nexport const studioConfig = object({\n\tdialect,\n\tschema: union([string(), string().array()]).optional(),\n\tcasing: casingType.optional(),\n});\n"
  },
  {
    "path": "drizzle-kit/src/cli/views.ts",
    "content": "import chalk from 'chalk';\nimport { Prompt, render, SelectState, TaskView } from 'hanji';\nimport type { CommonSchema } from '../schemaValidator';\nimport { objectValues } from '../utils';\nimport type { Named, NamedWithSchema } from './commands/migrate';\n\nexport const warning = (msg: string) => {\n\trender(`[${chalk.yellow('Warning')}] ${msg}`);\n};\nexport const err = (msg: string) => {\n\trender(`${chalk.bold.red('Error')} ${msg}`);\n};\n\nexport const info = (msg: string, greyMsg: string = ''): string => {\n\treturn `${chalk.blue.bold('Info:')} ${msg} ${greyMsg ? chalk.grey(greyMsg) : ''}`.trim();\n};\nexport const grey = (msg: string): string => {\n\treturn chalk.grey(msg);\n};\n\nexport const error = (error: string, greyMsg: string = ''): string => {\n\treturn `${chalk.bgRed.bold(' Error ')} ${error} ${greyMsg ? chalk.grey(greyMsg) : ''}`.trim();\n};\n\nexport const schema = (schema: CommonSchema): string => {\n\ttype TableEntry = (typeof schema)['tables'][keyof (typeof schema)['tables']];\n\tconst tables = Object.values(schema.tables) as unknown as TableEntry[];\n\n\tlet msg = chalk.bold(`${tables.length} tables\\n`);\n\n\tmsg += tables\n\t\t.map((t) => {\n\t\t\tconst columnsCount = Object.values(t.columns).length;\n\t\t\tconst indexesCount = Object.values(t.indexes).length;\n\t\t\tlet foreignKeys: number = 0;\n\t\t\t// Singlestore doesn't have foreign keys\n\t\t\tif (schema.dialect !== 'singlestore') {\n\t\t\t\t// @ts-expect-error\n\t\t\t\tforeignKeys = Object.values(t.foreignKeys).length;\n\t\t\t}\n\n\t\t\treturn `${chalk.bold.blue(t.name)} ${\n\t\t\t\tchalk.gray(\n\t\t\t\t\t`${columnsCount} columns ${indexesCount} indexes ${foreignKeys} fks`,\n\t\t\t\t)\n\t\t\t}`;\n\t\t})\n\t\t.join('\\n');\n\n\tmsg += '\\n';\n\n\tconst enums = objectValues(\n\t\t'enums' in schema\n\t\t\t? 'values' in schema['enums']\n\t\t\t\t? schema['enums']\n\t\t\t\t: {}\n\t\t\t: {},\n\t);\n\n\tif (enums.length > 0) {\n\t\tmsg += '\\n';\n\t\tmsg += chalk.bold(`${enums.length} enums\\n`);\n\n\t\tmsg += enums\n\t\t\t.map((it) => {\n\t\t\t\treturn `${chalk.bold.blue(it.name)} ${\n\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t`[${Object.values(it.values).join(', ')}]`,\n\t\t\t\t\t)\n\t\t\t\t}`;\n\t\t\t})\n\t\t\t.join('\\n');\n\t\tmsg += '\\n';\n\t}\n\treturn msg;\n};\n\nexport interface RenamePropmtItem<T> {\n\tfrom: T;\n\tto: T;\n}\n\nexport const isRenamePromptItem = <T extends Named>(\n\titem: RenamePropmtItem<T> | T,\n): item is RenamePropmtItem<T> => {\n\treturn 'from' in item && 'to' in item;\n};\n\nexport class ResolveColumnSelect<T extends Named> extends Prompt<\n\tRenamePropmtItem<T> | T\n> {\n\tprivate readonly data: SelectState<RenamePropmtItem<T> | T>;\n\n\tconstructor(\n\t\tprivate readonly tableName: string,\n\t\tprivate readonly base: Named,\n\t\tdata: (RenamePropmtItem<T> | T)[],\n\t) {\n\t\tsuper();\n\t\tthis.on('attach', (terminal) => terminal.toggleCursor('hide'));\n\t\tthis.data = new SelectState(data);\n\t\tthis.data.bind(this);\n\t}\n\n\trender(status: 'idle' | 'submitted' | 'aborted'): string {\n\t\tif (status === 'submitted' || status === 'aborted') {\n\t\t\treturn '\\n';\n\t\t}\n\n\t\tlet text = `\\nIs ${\n\t\t\tchalk.bold.blue(\n\t\t\t\tthis.base.name,\n\t\t\t)\n\t\t} column in ${\n\t\t\tchalk.bold.blue(\n\t\t\t\tthis.tableName,\n\t\t\t)\n\t\t} table created or renamed from another column?\\n`;\n\n\t\tconst isSelectedRenamed = isRenamePromptItem(\n\t\t\tthis.data.items[this.data.selectedIdx],\n\t\t);\n\n\t\tconst selectedPrefix = isSelectedRenamed\n\t\t\t? chalk.yellow('❯ ')\n\t\t\t: chalk.green('❯ ');\n\n\t\tconst labelLength: number = this.data.items\n\t\t\t.filter((it) => isRenamePromptItem(it))\n\t\t\t.map((it: RenamePropmtItem<T>) => {\n\t\t\t\treturn this.base.name.length + 3 + it['from'].name.length;\n\t\t\t})\n\t\t\t.reduce((a, b) => {\n\t\t\t\tif (a > b) {\n\t\t\t\t\treturn a;\n\t\t\t\t}\n\t\t\t\treturn b;\n\t\t\t}, 0);\n\n\t\tthis.data.items.forEach((it, idx) => {\n\t\t\tconst isSelected = idx === this.data.selectedIdx;\n\t\t\tconst isRenamed = isRenamePromptItem(it);\n\t\t\tconst title = isRenamed\n\t\t\t\t? `${it.from.name} › ${it.to.name}`.padEnd(labelLength, ' ')\n\t\t\t\t: it.name.padEnd(labelLength, ' ');\n\t\t\tconst label = isRenamed\n\t\t\t\t? `${chalk.yellow('~')} ${title} ${chalk.gray('rename column')}`\n\t\t\t\t: `${chalk.green('+')} ${title} ${chalk.gray('create column')}`;\n\n\t\t\ttext += isSelected ? `${selectedPrefix}${label}` : `  ${label}`;\n\t\t\ttext += idx !== this.data.items.length - 1 ? '\\n' : '';\n\t\t});\n\t\treturn text;\n\t}\n\n\tresult(): RenamePropmtItem<T> | T {\n\t\treturn this.data.items[this.data.selectedIdx]!;\n\t}\n}\n\nexport const tableKey = (it: NamedWithSchema) => {\n\treturn it.schema === 'public' || !it.schema\n\t\t? it.name\n\t\t: `${it.schema}.${it.name}`;\n};\n\nexport class ResolveSelectNamed<T extends Named> extends Prompt<\n\tRenamePropmtItem<T> | T\n> {\n\tprivate readonly state: SelectState<RenamePropmtItem<T> | T>;\n\n\tconstructor(\n\t\tprivate readonly base: T,\n\t\tdata: (RenamePropmtItem<T> | T)[],\n\t\tprivate readonly entityType: 'role' | 'policy',\n\t) {\n\t\tsuper();\n\t\tthis.on('attach', (terminal) => terminal.toggleCursor('hide'));\n\t\tthis.state = new SelectState(data);\n\t\tthis.state.bind(this);\n\t}\n\n\trender(status: 'idle' | 'submitted' | 'aborted'): string {\n\t\tif (status === 'submitted' || status === 'aborted') {\n\t\t\treturn '';\n\t\t}\n\t\tconst key = this.base.name;\n\n\t\tlet text = `\\nIs ${chalk.bold.blue(key)} ${this.entityType} created or renamed from another ${this.entityType}?\\n`;\n\n\t\tconst isSelectedRenamed = isRenamePromptItem(\n\t\t\tthis.state.items[this.state.selectedIdx],\n\t\t);\n\n\t\tconst selectedPrefix = isSelectedRenamed\n\t\t\t? chalk.yellow('❯ ')\n\t\t\t: chalk.green('❯ ');\n\n\t\tconst labelLength: number = this.state.items\n\t\t\t.filter((it) => isRenamePromptItem(it))\n\t\t\t.map((_) => {\n\t\t\t\tconst it = _ as RenamePropmtItem<T>;\n\t\t\t\tconst keyFrom = it.from.name;\n\t\t\t\treturn key.length + 3 + keyFrom.length;\n\t\t\t})\n\t\t\t.reduce((a, b) => {\n\t\t\t\tif (a > b) {\n\t\t\t\t\treturn a;\n\t\t\t\t}\n\t\t\t\treturn b;\n\t\t\t}, 0);\n\n\t\tconst entityType = this.entityType;\n\t\tthis.state.items.forEach((it, idx) => {\n\t\t\tconst isSelected = idx === this.state.selectedIdx;\n\t\t\tconst isRenamed = isRenamePromptItem(it);\n\n\t\t\tconst title = isRenamed\n\t\t\t\t? `${it.from.name} › ${it.to.name}`.padEnd(labelLength, ' ')\n\t\t\t\t: it.name.padEnd(labelLength, ' ');\n\n\t\t\tconst label = isRenamed\n\t\t\t\t? `${chalk.yellow('~')} ${title} ${chalk.gray(`rename ${entityType}`)}`\n\t\t\t\t: `${chalk.green('+')} ${title} ${chalk.gray(`create ${entityType}`)}`;\n\n\t\t\ttext += isSelected ? `${selectedPrefix}${label}` : `  ${label}`;\n\t\t\ttext += idx !== this.state.items.length - 1 ? '\\n' : '';\n\t\t});\n\t\treturn text;\n\t}\n\n\tresult(): RenamePropmtItem<T> | T {\n\t\treturn this.state.items[this.state.selectedIdx]!;\n\t}\n}\n\nexport class ResolveSelect<T extends NamedWithSchema> extends Prompt<\n\tRenamePropmtItem<T> | T\n> {\n\tprivate readonly state: SelectState<RenamePropmtItem<T> | T>;\n\n\tconstructor(\n\t\tprivate readonly base: T,\n\t\tdata: (RenamePropmtItem<T> | T)[],\n\t\tprivate readonly entityType: 'table' | 'enum' | 'sequence' | 'view' | 'role',\n\t) {\n\t\tsuper();\n\t\tthis.on('attach', (terminal) => terminal.toggleCursor('hide'));\n\t\tthis.state = new SelectState(data);\n\t\tthis.state.bind(this);\n\t\tthis.base = base;\n\t}\n\n\trender(status: 'idle' | 'submitted' | 'aborted'): string {\n\t\tif (status === 'submitted' || status === 'aborted') {\n\t\t\treturn '';\n\t\t}\n\t\tconst key = tableKey(this.base);\n\n\t\tlet text = `\\nIs ${chalk.bold.blue(key)} ${this.entityType} created or renamed from another ${this.entityType}?\\n`;\n\n\t\tconst isSelectedRenamed = isRenamePromptItem(\n\t\t\tthis.state.items[this.state.selectedIdx],\n\t\t);\n\n\t\tconst selectedPrefix = isSelectedRenamed\n\t\t\t? chalk.yellow('❯ ')\n\t\t\t: chalk.green('❯ ');\n\n\t\tconst labelLength: number = this.state.items\n\t\t\t.filter((it) => isRenamePromptItem(it))\n\t\t\t.map((_) => {\n\t\t\t\tconst it = _ as RenamePropmtItem<T>;\n\t\t\t\tconst keyFrom = tableKey(it.from);\n\t\t\t\treturn key.length + 3 + keyFrom.length;\n\t\t\t})\n\t\t\t.reduce((a, b) => {\n\t\t\t\tif (a > b) {\n\t\t\t\t\treturn a;\n\t\t\t\t}\n\t\t\t\treturn b;\n\t\t\t}, 0);\n\n\t\tconst entityType = this.entityType;\n\t\tthis.state.items.forEach((it, idx) => {\n\t\t\tconst isSelected = idx === this.state.selectedIdx;\n\t\t\tconst isRenamed = isRenamePromptItem(it);\n\n\t\t\tconst title = isRenamed\n\t\t\t\t? `${tableKey(it.from)} › ${tableKey(it.to)}`.padEnd(labelLength, ' ')\n\t\t\t\t: tableKey(it).padEnd(labelLength, ' ');\n\n\t\t\tconst label = isRenamed\n\t\t\t\t? `${chalk.yellow('~')} ${title} ${chalk.gray(`rename ${entityType}`)}`\n\t\t\t\t: `${chalk.green('+')} ${title} ${chalk.gray(`create ${entityType}`)}`;\n\n\t\t\ttext += isSelected ? `${selectedPrefix}${label}` : `  ${label}`;\n\t\t\ttext += idx !== this.state.items.length - 1 ? '\\n' : '';\n\t\t});\n\t\treturn text;\n\t}\n\n\tresult(): RenamePropmtItem<T> | T {\n\t\treturn this.state.items[this.state.selectedIdx]!;\n\t}\n}\n\nexport class ResolveSchemasSelect<T extends Named> extends Prompt<\n\tRenamePropmtItem<T> | T\n> {\n\tprivate readonly state: SelectState<RenamePropmtItem<T> | T>;\n\n\tconstructor(private readonly base: Named, data: (RenamePropmtItem<T> | T)[]) {\n\t\tsuper();\n\t\tthis.on('attach', (terminal) => terminal.toggleCursor('hide'));\n\t\tthis.state = new SelectState(data);\n\t\tthis.state.bind(this);\n\t\tthis.base = base;\n\t}\n\n\trender(status: 'idle' | 'submitted' | 'aborted'): string {\n\t\tif (status === 'submitted' || status === 'aborted') {\n\t\t\treturn '';\n\t\t}\n\n\t\tlet text = `\\nIs ${\n\t\t\tchalk.bold.blue(\n\t\t\t\tthis.base.name,\n\t\t\t)\n\t\t} schema created or renamed from another schema?\\n`;\n\t\tconst isSelectedRenamed = isRenamePromptItem(\n\t\t\tthis.state.items[this.state.selectedIdx],\n\t\t);\n\t\tconst selectedPrefix = isSelectedRenamed\n\t\t\t? chalk.yellow('❯ ')\n\t\t\t: chalk.green('❯ ');\n\n\t\tconst labelLength: number = this.state.items\n\t\t\t.filter((it) => isRenamePromptItem(it))\n\t\t\t.map((it: RenamePropmtItem<T>) => {\n\t\t\t\treturn this.base.name.length + 3 + it['from'].name.length;\n\t\t\t})\n\t\t\t.reduce((a, b) => {\n\t\t\t\tif (a > b) {\n\t\t\t\t\treturn a;\n\t\t\t\t}\n\t\t\t\treturn b;\n\t\t\t}, 0);\n\n\t\tthis.state.items.forEach((it, idx) => {\n\t\t\tconst isSelected = idx === this.state.selectedIdx;\n\t\t\tconst isRenamed = isRenamePromptItem(it);\n\t\t\tconst title = isRenamed\n\t\t\t\t? `${it.from.name} › ${it.to.name}`.padEnd(labelLength, ' ')\n\t\t\t\t: it.name.padEnd(labelLength, ' ');\n\t\t\tconst label = isRenamed\n\t\t\t\t? `${chalk.yellow('~')} ${title} ${chalk.gray('rename schema')}`\n\t\t\t\t: `${chalk.green('+')} ${title} ${chalk.gray('create schema')}`;\n\n\t\t\ttext += isSelected ? `${selectedPrefix}${label}` : `  ${label}`;\n\t\t\ttext += idx !== this.state.items.length - 1 ? '\\n' : '';\n\t\t});\n\t\treturn text;\n\t}\n\n\tresult(): RenamePropmtItem<T> | T {\n\t\treturn this.state.items[this.state.selectedIdx]!;\n\t}\n}\n\nclass Spinner {\n\tprivate offset: number = 0;\n\tprivate readonly iterator: () => void;\n\n\tconstructor(private readonly frames: string[]) {\n\t\tthis.iterator = () => {\n\t\t\tthis.offset += 1;\n\t\t\tthis.offset %= frames.length - 1;\n\t\t};\n\t}\n\n\tpublic tick = () => {\n\t\tthis.iterator();\n\t};\n\n\tpublic value = () => {\n\t\treturn this.frames[this.offset];\n\t};\n}\n\nconst _frames = function(values: string[]): () => string {\n\tlet index = 0;\n\tconst iterator = () => {\n\t\tconst frame = values[index];\n\t\tindex += 1;\n\t\tindex %= values.length;\n\t\treturn frame!;\n\t};\n\treturn iterator;\n};\n\ntype ValueOf<T> = T[keyof T];\nexport type IntrospectStatus = 'fetching' | 'done';\nexport type IntrospectStage =\n\t| 'tables'\n\t| 'columns'\n\t| 'enums'\n\t| 'indexes'\n\t| 'policies'\n\t| 'checks'\n\t| 'fks'\n\t| 'views';\n\ntype IntrospectState = {\n\t[key in IntrospectStage]: {\n\t\tcount: number;\n\t\tname: string;\n\t\tstatus: IntrospectStatus;\n\t};\n};\n\nexport class IntrospectProgress extends TaskView {\n\tprivate readonly spinner: Spinner = new Spinner('⣷⣯⣟⡿⢿⣻⣽⣾'.split(''));\n\tprivate timeout: NodeJS.Timeout | undefined;\n\n\tprivate state: IntrospectState = {\n\t\ttables: {\n\t\t\tcount: 0,\n\t\t\tname: 'tables',\n\t\t\tstatus: 'fetching',\n\t\t},\n\t\tcolumns: {\n\t\t\tcount: 0,\n\t\t\tname: 'columns',\n\t\t\tstatus: 'fetching',\n\t\t},\n\t\tenums: {\n\t\t\tcount: 0,\n\t\t\tname: 'enums',\n\t\t\tstatus: 'fetching',\n\t\t},\n\t\tindexes: {\n\t\t\tcount: 0,\n\t\t\tname: 'indexes',\n\t\t\tstatus: 'fetching',\n\t\t},\n\t\tfks: {\n\t\t\tcount: 0,\n\t\t\tname: 'foreign keys',\n\t\t\tstatus: 'fetching',\n\t\t},\n\t\tpolicies: {\n\t\t\tcount: 0,\n\t\t\tname: 'policies',\n\t\t\tstatus: 'fetching',\n\t\t},\n\t\tchecks: {\n\t\t\tcount: 0,\n\t\t\tname: 'check constraints',\n\t\t\tstatus: 'fetching',\n\t\t},\n\t\tviews: {\n\t\t\tcount: 0,\n\t\t\tname: 'views',\n\t\t\tstatus: 'fetching',\n\t\t},\n\t};\n\n\tconstructor(private readonly hasEnums: boolean = false) {\n\t\tsuper();\n\t\tthis.timeout = setInterval(() => {\n\t\t\tthis.spinner.tick();\n\t\t\tthis.requestLayout();\n\t\t}, 128);\n\n\t\tthis.on('detach', () => clearInterval(this.timeout));\n\t}\n\n\tpublic update(\n\t\tstage: IntrospectStage,\n\t\tcount: number,\n\t\tstatus: IntrospectStatus,\n\t) {\n\t\tthis.state[stage].count = count;\n\t\tthis.state[stage].status = status;\n\t\tthis.requestLayout();\n\t}\n\n\tprivate formatCount = (count: number) => {\n\t\tconst width: number = Math.max.apply(\n\t\t\tnull,\n\t\t\tObject.values(this.state).map((it) => it.count.toFixed(0).length),\n\t\t);\n\n\t\treturn count.toFixed(0).padEnd(width, ' ');\n\t};\n\n\tprivate statusText = (spinner: string, stage: ValueOf<IntrospectState>) => {\n\t\tconst { name, count } = stage;\n\t\tconst isDone = stage.status === 'done';\n\n\t\tconst prefix = isDone ? `[${chalk.green('✓')}]` : `[${spinner}]`;\n\n\t\tconst formattedCount = this.formatCount(count);\n\t\tconst suffix = isDone\n\t\t\t? `${formattedCount} ${name} fetched`\n\t\t\t: `${formattedCount} ${name} fetching`;\n\n\t\treturn `${prefix} ${suffix}\\n`;\n\t};\n\n\trender(): string {\n\t\tlet info = '';\n\t\tconst spin = this.spinner.value();\n\t\tinfo += this.statusText(spin, this.state.tables);\n\t\tinfo += this.statusText(spin, this.state.columns);\n\t\tinfo += this.hasEnums ? this.statusText(spin, this.state.enums) : '';\n\t\tinfo += this.statusText(spin, this.state.indexes);\n\t\tinfo += this.statusText(spin, this.state.fks);\n\t\tinfo += this.statusText(spin, this.state.policies);\n\t\tinfo += this.statusText(spin, this.state.checks);\n\t\tinfo += this.statusText(spin, this.state.views);\n\n\t\treturn info;\n\t}\n}\n\nexport class MigrateProgress extends TaskView {\n\tprivate readonly spinner: Spinner = new Spinner('⣷⣯⣟⡿⢿⣻⣽⣾'.split(''));\n\tprivate timeout: NodeJS.Timeout | undefined;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.timeout = setInterval(() => {\n\t\t\tthis.spinner.tick();\n\t\t\tthis.requestLayout();\n\t\t}, 128);\n\n\t\tthis.on('detach', () => clearInterval(this.timeout));\n\t}\n\n\trender(status: 'pending' | 'done' | 'rejected'): string {\n\t\tif (status === 'pending' || status === 'rejected') {\n\t\t\tconst spin = this.spinner.value();\n\t\t\treturn `[${spin}] applying migrations...`;\n\t\t}\n\t\treturn `[${chalk.green('✓')}] migrations applied successfully!`;\n\t}\n}\n\nexport class ProgressView extends TaskView {\n\tprivate readonly spinner: Spinner = new Spinner('⣷⣯⣟⡿⢿⣻⣽⣾'.split(''));\n\tprivate timeout: NodeJS.Timeout | undefined;\n\n\tconstructor(\n\t\tprivate readonly progressText: string,\n\t\tprivate readonly successText: string,\n\t) {\n\t\tsuper();\n\t\tthis.timeout = setInterval(() => {\n\t\t\tthis.spinner.tick();\n\t\t\tthis.requestLayout();\n\t\t}, 128);\n\n\t\tthis.on('detach', () => clearInterval(this.timeout));\n\t}\n\n\trender(status: 'pending' | 'done' | 'rejected'): string {\n\t\tif (status === 'pending' || status === 'rejected') {\n\t\t\tconst spin = this.spinner.value();\n\t\t\treturn `[${spin}] ${this.progressText}\\n`;\n\t\t}\n\t\treturn `[${chalk.green('✓')}] ${this.successText}\\n`;\n\t}\n}\n\nexport class DropMigrationView<T extends { tag: string }> extends Prompt<T> {\n\tprivate readonly data: SelectState<T>;\n\n\tconstructor(data: T[]) {\n\t\tsuper();\n\t\tthis.on('attach', (terminal) => terminal.toggleCursor('hide'));\n\t\tthis.data = new SelectState(data);\n\t\tthis.data.selectedIdx = data.length - 1;\n\t\tthis.data.bind(this);\n\t}\n\n\trender(status: 'idle' | 'submitted' | 'aborted'): string {\n\t\tif (status === 'submitted' || status === 'aborted') {\n\t\t\treturn '\\n';\n\t\t}\n\n\t\tlet text = chalk.bold('Please select migration to drop:\\n');\n\t\tconst selectedPrefix = chalk.yellow('❯ ');\n\n\t\tconst data = trimmedRange(this.data.items, this.data.selectedIdx, 9);\n\t\tconst labelLength: number = data.trimmed\n\t\t\t.map((it) => it.tag.length)\n\t\t\t.reduce((a, b) => {\n\t\t\t\tif (a > b) {\n\t\t\t\t\treturn a;\n\t\t\t\t}\n\t\t\t\treturn b;\n\t\t\t}, 0);\n\n\t\ttext += data.startTrimmed ? '  ...\\n' : '';\n\n\t\tdata.trimmed.forEach((it, idx) => {\n\t\t\tconst isSelected = idx === this.data.selectedIdx - data.offset;\n\t\t\tlet title = it.tag.padEnd(labelLength, ' ');\n\t\t\ttitle = isSelected ? chalk.yellow(title) : title;\n\n\t\t\ttext += isSelected ? `${selectedPrefix}${title}` : `  ${title}`;\n\t\t\ttext += idx !== this.data.items.length - 1 ? '\\n' : '';\n\t\t});\n\n\t\ttext += data.endTrimmed ? '  ...\\n' : '';\n\t\treturn text;\n\t}\n\n\tresult(): T {\n\t\treturn this.data.items[this.data.selectedIdx]!;\n\t}\n}\n\nexport const trimmedRange = <T>(\n\tarr: T[],\n\tindex: number,\n\tlimitLines: number,\n): {\n\ttrimmed: T[];\n\toffset: number;\n\tstartTrimmed: boolean;\n\tendTrimmed: boolean;\n} => {\n\tconst limit = limitLines - 2;\n\tconst sideLimit = Math.round(limit / 2);\n\n\tconst endTrimmed = arr.length - sideLimit > index;\n\tconst startTrimmed = index > sideLimit - 1;\n\n\tconst paddingStart = Math.max(index + sideLimit - arr.length, 0);\n\tconst paddingEnd = Math.min(index - sideLimit + 1, 0);\n\n\tconst d1 = endTrimmed ? 1 : 0;\n\tconst d2 = startTrimmed ? 0 : 1;\n\n\tconst start = Math.max(0, index - sideLimit + d1 - paddingStart);\n\tconst end = Math.min(arr.length, index + sideLimit + d2 - paddingEnd);\n\n\treturn {\n\t\ttrimmed: arr.slice(start, end),\n\t\toffset: start,\n\t\tstartTrimmed,\n\t\tendTrimmed,\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/extensions/getTablesFilterByExtensions.ts",
    "content": "import type { Config } from '../index';\n\nexport const getTablesFilterByExtensions = ({\n\textensionsFilters,\n\tdialect,\n}: Pick<Config, 'extensionsFilters' | 'dialect'>): string[] => {\n\tif (extensionsFilters) {\n\t\tif (\n\t\t\textensionsFilters.includes('postgis')\n\t\t\t&& dialect === 'postgresql'\n\t\t) {\n\t\t\treturn ['!geography_columns', '!geometry_columns', '!spatial_ref_sys'];\n\t\t}\n\t}\n\treturn [];\n};\n"
  },
  {
    "path": "drizzle-kit/src/extensions/vector.ts",
    "content": "export const vectorOps = [\n\t'vector_l2_ops',\n\t'vector_ip_ops',\n\t'vector_cosine_ops',\n\t'vector_l1_ops',\n\t'bit_hamming_ops',\n\t'bit_jaccard_ops',\n\t'halfvec_l2_ops',\n\t'sparsevec_l2_ops',\n];\n"
  },
  {
    "path": "drizzle-kit/src/global.ts",
    "content": "export const originUUID = '00000000-0000-0000-0000-000000000000';\nexport const snapshotVersion = '7';\n\nexport function assertUnreachable(x: never | undefined): never {\n\tthrow new Error(\"Didn't expect to get here\");\n}\n\n// don't fail in runtime, types only\nexport function softAssertUnreachable(x: never) {\n\treturn null as never;\n}\n\nexport const mapValues = <IN, OUT>(\n\tobj: Record<string, IN>,\n\tmap: (input: IN) => OUT,\n): Record<string, OUT> => {\n\tconst result = Object.keys(obj).reduce(function(result, key) {\n\t\tresult[key] = map(obj[key]);\n\t\treturn result;\n\t}, {} as Record<string, OUT>);\n\treturn result;\n};\n\nexport const mapKeys = <T>(\n\tobj: Record<string, T>,\n\tmap: (key: string, value: T) => string,\n): Record<string, T> => {\n\tconst result = Object.fromEntries(\n\t\tObject.entries(obj).map(([key, val]) => {\n\t\t\tconst newKey = map(key, val);\n\t\t\treturn [newKey, val];\n\t\t}),\n\t);\n\treturn result;\n};\n\nexport const mapEntries = <T>(\n\tobj: Record<string, T>,\n\tmap: (key: string, value: T) => [string, T],\n): Record<string, T> => {\n\tconst result = Object.fromEntries(\n\t\tObject.entries(obj).map(([key, val]) => {\n\t\t\tconst [newKey, newVal] = map(key, val);\n\t\t\treturn [newKey, newVal];\n\t\t}),\n\t);\n\treturn result;\n};\n\nexport const customMapEntries = <TReturn, T = any>(\n\tobj: Record<string, T>,\n\tmap: (key: string, value: T) => [string, TReturn],\n): Record<string, TReturn> => {\n\tconst result = Object.fromEntries(\n\t\tObject.entries(obj).map(([key, val]) => {\n\t\t\tconst [newKey, newVal] = map(key, val);\n\t\t\treturn [newKey, newVal];\n\t\t}),\n\t);\n\treturn result;\n};\n"
  },
  {
    "path": "drizzle-kit/src/index.ts",
    "content": "import { ConnectionOptions } from 'tls';\nimport type { Driver, Prefix } from './cli/validations/common';\nimport type { Dialect } from './schemaValidator';\n\n// import {SslOptions} from 'mysql2'\ntype SslOptions = {\n\tpfx?: string;\n\tkey?: string;\n\tpassphrase?: string;\n\tcert?: string;\n\tca?: string | string[];\n\tcrl?: string | string[];\n\tciphers?: string;\n\trejectUnauthorized?: boolean;\n};\n\ntype Verify<T, U extends T> = U;\n\n/**\n * **You are currently using version 0.21.0+ of drizzle-kit. If you have just upgraded to this version, please make sure to read the changelog to understand what changes have been made and what\n * adjustments may be necessary for you. See https://orm.drizzle.team/kit-docs/upgrade-21#how-to-migrate-to-0210**\n *\n * **Config** usage:\n *\n * `dialect` - mandatory and is responsible for explicitly providing a databse dialect you are using for all the commands\n * *Possible values*: `postgresql`, `mysql`, `sqlite`, `singlestore\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#dialect\n *\n * ---\n * `schema` - param lets you define where your schema file/files live.\n * You can have as many separate schema files as you want and define paths to them using glob or array of globs syntax.\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#schema\n *\n * ---\n * `out` - allows you to define the folder for your migrations and a folder, where drizzle will introspect the schema and relations\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#out\n *\n * ---\n * `driver` - optional param that is responsible for explicitly providing a driver to use when accessing a database\n * *Possible values*: `aws-data-api`, `d1-http`, `expo`, `turso`, `pglite`\n * If you don't use AWS Data API, D1, Turso or Expo - ypu don't need this driver. You can check a driver strategy choice here: https://orm.drizzle.team/kit-docs/upgrade-21\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#driver\n *\n * ---\n *\n * `dbCredentials` - an object to define your connection to the database. For more info please check the docs\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#dbcredentials\n *\n * ---\n *\n * `migrations` - param let’s use specify custom table and schema(PostgreSQL only) for migrations.\n * By default, all information about executed migrations will be stored in the database inside\n * the `__drizzle_migrations` table, and for PostgreSQL, inside the drizzle schema.\n * However, you can configure where to store those records.\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#migrations\n *\n * ---\n *\n * `breakpoints` - param lets you enable/disable SQL statement breakpoints in generated migrations.\n * It’s optional and true by default, it’s necessary to properly apply migrations on databases,\n * that do not support multiple DDL alternation statements in one transaction(MySQL, SQLite, SingleStore) and\n * Drizzle ORM has to apply them sequentially one by one.\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#breakpoints\n *\n * ---\n *\n * `tablesFilters` - param lets you filter tables with glob syntax for db push command.\n * It’s useful when you have only one database avaialable for several separate projects with separate sql schemas.\n *\n * How to define multi-project tables with Drizzle ORM — see https://orm.drizzle.team/docs/goodies#multi-project-schema\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#tablesfilters\n *\n * ---\n *\n * `schemaFilter` - parameter allows you to define which schema in PostgreSQL should be used for either introspect or push commands.\n * This parameter accepts a single schema as a string or an array of schemas as strings.\n * No glob pattern is supported here. By default, drizzle will use the public schema for both commands,\n * but you can add any schema you need.\n *\n * For example, having schemaFilter: [\"my_schema\"] will only look for tables in both the database and\n * drizzle schema that are a part of the my_schema schema.\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#schemafilter\n *\n * ---\n *\n * `verbose` - command is used for drizzle-kit push commands and prints all statements that will be executed.\n *\n * > Note: This command will only print the statements that should be executed.\n * To approve them before applying, please refer to the `strict` command.\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#verbose\n *\n * ---\n *\n * `strict` - command is used for drizzle-kit push commands and will always ask for your confirmation,\n * either to execute all statements needed to sync your schema with the database or not.\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#strict\n */\nexport type Config =\n\t& {\n\t\tdialect: Dialect;\n\t\tout?: string;\n\t\tbreakpoints?: boolean;\n\t\ttablesFilter?: string | string[];\n\t\textensionsFilters?: 'postgis'[];\n\t\tschemaFilter?: string | string[];\n\t\tschema?: string | string[];\n\t\tverbose?: boolean;\n\t\tstrict?: boolean;\n\t\tcasing?: 'camelCase' | 'snake_case';\n\t\tmigrations?: {\n\t\t\ttable?: string;\n\t\t\tschema?: string;\n\t\t\tprefix?: Prefix;\n\t\t};\n\t\tintrospect?: {\n\t\t\tcasing: 'camel' | 'preserve';\n\t\t};\n\t\tentities?: {\n\t\t\troles?: boolean | { provider?: 'supabase' | 'neon' | string & {}; exclude?: string[]; include?: string[] };\n\t\t};\n\t}\n\t& (\n\t\t| {\n\t\t\tdialect: Verify<Dialect, 'turso'>;\n\t\t\tdbCredentials: {\n\t\t\t\turl: string;\n\t\t\t\tauthToken?: string;\n\t\t\t};\n\t\t}\n\t\t| {\n\t\t\tdialect: Verify<Dialect, 'sqlite'>;\n\t\t\tdbCredentials: {\n\t\t\t\turl: string;\n\t\t\t};\n\t\t}\n\t\t| {\n\t\t\tdialect: Verify<Dialect, 'postgresql'>;\n\t\t\tdbCredentials:\n\t\t\t\t| ({\n\t\t\t\t\thost: string;\n\t\t\t\t\tport?: number;\n\t\t\t\t\tuser?: string;\n\t\t\t\t\tpassword?: string;\n\t\t\t\t\tdatabase: string;\n\t\t\t\t\tssl?:\n\t\t\t\t\t\t| boolean\n\t\t\t\t\t\t| 'require'\n\t\t\t\t\t\t| 'allow'\n\t\t\t\t\t\t| 'prefer'\n\t\t\t\t\t\t| 'verify-full'\n\t\t\t\t\t\t| ConnectionOptions;\n\t\t\t\t} & {})\n\t\t\t\t| {\n\t\t\t\t\turl: string;\n\t\t\t\t};\n\t\t}\n\t\t| {\n\t\t\tdialect: Verify<Dialect, 'postgresql'>;\n\t\t\tdriver: Verify<Driver, 'aws-data-api'>;\n\t\t\tdbCredentials: {\n\t\t\t\tdatabase: string;\n\t\t\t\tsecretArn: string;\n\t\t\t\tresourceArn: string;\n\t\t\t};\n\t\t}\n\t\t| {\n\t\t\tdialect: Verify<Dialect, 'postgresql'>;\n\t\t\tdriver: Verify<Driver, 'pglite'>;\n\t\t\tdbCredentials: {\n\t\t\t\turl: string;\n\t\t\t};\n\t\t}\n\t\t| {\n\t\t\tdialect: Verify<Dialect, 'mysql'>;\n\t\t\tdbCredentials:\n\t\t\t\t| {\n\t\t\t\t\thost: string;\n\t\t\t\t\tport?: number;\n\t\t\t\t\tuser?: string;\n\t\t\t\t\tpassword?: string;\n\t\t\t\t\tdatabase: string;\n\t\t\t\t\tssl?: string | SslOptions;\n\t\t\t\t}\n\t\t\t\t| {\n\t\t\t\t\turl: string;\n\t\t\t\t};\n\t\t}\n\t\t| {\n\t\t\tdialect: Verify<Dialect, 'sqlite'>;\n\t\t\tdriver: Verify<Driver, 'd1-http'>;\n\t\t\tdbCredentials: {\n\t\t\t\taccountId: string;\n\t\t\t\tdatabaseId: string;\n\t\t\t\ttoken: string;\n\t\t\t};\n\t\t}\n\t\t| {\n\t\t\tdialect: Verify<Dialect, 'sqlite'>;\n\t\t\tdriver: Verify<Driver, 'expo'>;\n\t\t}\n\t\t| {\n\t\t\tdialect: Verify<Dialect, 'sqlite'>;\n\t\t\tdriver: Verify<Driver, 'durable-sqlite'>;\n\t\t}\n\t\t| {}\n\t\t| {\n\t\t\tdialect: Verify<Dialect, 'singlestore'>;\n\t\t\tdbCredentials:\n\t\t\t\t| {\n\t\t\t\t\thost: string;\n\t\t\t\t\tport?: number;\n\t\t\t\t\tuser?: string;\n\t\t\t\t\tpassword?: string;\n\t\t\t\t\tdatabase: string;\n\t\t\t\t\tssl?: string | SslOptions;\n\t\t\t\t}\n\t\t\t\t| {\n\t\t\t\t\turl: string;\n\t\t\t\t};\n\t\t}\n\t\t| {\n\t\t\tdialect: Verify<Dialect, 'gel'>;\n\t\t\tdbCredentials?:\n\t\t\t\t& {\n\t\t\t\t\ttlsSecurity?:\n\t\t\t\t\t\t| 'insecure'\n\t\t\t\t\t\t| 'no_host_verification'\n\t\t\t\t\t\t| 'strict'\n\t\t\t\t\t\t| 'default';\n\t\t\t\t}\n\t\t\t\t& (\n\t\t\t\t\t| {\n\t\t\t\t\t\turl: string;\n\t\t\t\t\t}\n\t\t\t\t\t| ({\n\t\t\t\t\t\thost: string;\n\t\t\t\t\t\tport?: number;\n\t\t\t\t\t\tuser?: string;\n\t\t\t\t\t\tpassword?: string;\n\t\t\t\t\t\tdatabase: string;\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t}\n\t);\n\n/**\n * **You are currently using version 0.21.0+ of drizzle-kit. If you have just upgraded to this version, please make sure to read the changelog to understand what changes have been made and what\n * adjustments may be necessary for you. See https://orm.drizzle.team/kit-docs/upgrade-21#how-to-migrate-to-0210**\n *\n * **Config** usage:\n *\n * `dialect` - mandatory and is responsible for explicitly providing a databse dialect you are using for all the commands\n * *Possible values*: `postgresql`, `mysql`, `sqlite`, `singlestore`, `gel`\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#dialect\n *\n * ---\n * `schema` - param lets you define where your schema file/files live.\n * You can have as many separate schema files as you want and define paths to them using glob or array of globs syntax.\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#schema\n *\n * ---\n * `out` - allows you to define the folder for your migrations and a folder, where drizzle will introspect the schema and relations\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#out\n *\n * ---\n * `driver` - optional param that is responsible for explicitly providing a driver to use when accessing a database\n * *Possible values*: `aws-data-api`, `d1-http`, `expo`, `turso`, `pglite`\n * If you don't use AWS Data API, D1, Turso or Expo - ypu don't need this driver. You can check a driver strategy choice here: https://orm.drizzle.team/kit-docs/upgrade-21\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#driver\n *\n * ---\n *\n * `dbCredentials` - an object to define your connection to the database. For more info please check the docs\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#dbcredentials\n *\n * ---\n *\n * `migrations` - param let’s use specify custom table and schema(PostgreSQL only) for migrations.\n * By default, all information about executed migrations will be stored in the database inside\n * the `__drizzle_migrations` table, and for PostgreSQL, inside the drizzle schema.\n * However, you can configure where to store those records.\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#migrations\n *\n * ---\n *\n * `breakpoints` - param lets you enable/disable SQL statement breakpoints in generated migrations.\n * It’s optional and true by default, it’s necessary to properly apply migrations on databases,\n * that do not support multiple DDL alternation statements in one transaction(MySQL, SQLite, SingleStore) and\n * Drizzle ORM has to apply them sequentially one by one.\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#breakpoints\n *\n * ---\n *\n * `tablesFilters` - param lets you filter tables with glob syntax for db push command.\n * It’s useful when you have only one database avaialable for several separate projects with separate sql schemas.\n *\n * How to define multi-project tables with Drizzle ORM — see https://orm.drizzle.team/docs/goodies#multi-project-schema\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#tablesfilters\n *\n * ---\n *\n * `schemaFilter` - parameter allows you to define which schema in PostgreSQL should be used for either introspect or push commands.\n * This parameter accepts a single schema as a string or an array of schemas as strings.\n * No glob pattern is supported here. By default, drizzle will use the public schema for both commands,\n * but you can add any schema you need.\n *\n * For example, having schemaFilter: [\"my_schema\"] will only look for tables in both the database and\n * drizzle schema that are a part of the my_schema schema.\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#schemafilter\n *\n * ---\n *\n * `verbose` - command is used for drizzle-kit push commands and prints all statements that will be executed.\n *\n * > Note: This command will only print the statements that should be executed.\n * To approve them before applying, please refer to the `strict` command.\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#verbose\n *\n * ---\n *\n * `strict` - command is used for drizzle-kit push commands and will always ask for your confirmation,\n * either to execute all statements needed to sync your schema with the database or not.\n *\n * See https://orm.drizzle.team/kit-docs/config-reference#strict\n */\nexport function defineConfig(config: Config) {\n\treturn config;\n}\n"
  },
  {
    "path": "drizzle-kit/src/introspect-gel.ts",
    "content": "import { getTableName, is } from 'drizzle-orm';\nimport { AnyGelTable } from 'drizzle-orm/gel-core';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\tMany,\n\tOne,\n\tRelation,\n\tRelations,\n} from 'drizzle-orm/relations';\nimport './@types/utils';\nimport { toCamelCase } from 'drizzle-orm/casing';\nimport { Casing } from './cli/validations/common';\nimport { assertUnreachable } from './global';\nimport {\n\tCheckConstraint,\n\tColumn,\n\tForeignKey,\n\tGelKitInternals,\n\tGelSchemaInternal,\n\tIndex,\n\tPolicy,\n\tPrimaryKey,\n\tUniqueConstraint,\n} from './serializer/gelSchema';\nimport { indexName } from './serializer/gelSerializer';\nimport { unescapeSingleQuotes } from './utils';\n\nconst gelImportsList = new Set([\n\t'gelTable',\n\t'smallint',\n\t'integer',\n\t'bigint',\n\t'bigintT',\n\t'boolean',\n\t'bytes',\n\t'dateDuration',\n\t'decimal',\n\t'doublePrecision',\n\t'duration',\n\t'json',\n\t'localDate',\n\t'localTime',\n\t'real',\n\t'relDuration',\n\t'text',\n\t'timestamp',\n\t'timestamptz',\n\t'uuid',\n\t'time',\n]);\n\nconst mapColumnDefault = (defaultValue: any, isExpression?: boolean) => {\n\tif (isExpression) {\n\t\treturn `sql\\`${defaultValue}\\``;\n\t}\n\n\treturn defaultValue;\n};\n\nconst relations = new Set<string>();\n\nconst escapeColumnKey = (value: string) => {\n\tif (/^(?![a-zA-Z_$][a-zA-Z0-9_$]*$).+$/.test(value)) {\n\t\treturn `\"${value}\"`;\n\t}\n\treturn value;\n};\n\nconst withCasing = (value: string, casing: Casing) => {\n\tif (casing === 'preserve') {\n\t\treturn escapeColumnKey(value);\n\t}\n\tif (casing === 'camel') {\n\t\treturn escapeColumnKey(value.camelCase());\n\t}\n\n\tassertUnreachable(casing);\n};\n\nconst dbColumnName = ({ name, casing, withMode = false }: { name: string; casing: Casing; withMode?: boolean }) => {\n\tif (casing === 'preserve') {\n\t\treturn '';\n\t}\n\tif (casing === 'camel') {\n\t\treturn toCamelCase(name) === name ? '' : withMode ? `\"${name}\", ` : `\"${name}\"`;\n\t}\n\n\tassertUnreachable(casing);\n};\n\n// export const relationsToTypeScriptForStudio = (\n// \tschema: Record<string, Record<string, AnyGelTable<{}>>>,\n// \trelations: Record<string, Relations<string, Record<string, Relation<string>>>>,\n// ) => {\n// \tconst relationalSchema: Record<string, unknown> = {\n// \t\t...Object.fromEntries(\n// \t\t\tObject.entries(schema)\n// \t\t\t\t.map(([key, val]) => {\n// \t\t\t\t\t// have unique keys across schemas\n// \t\t\t\t\tconst mappedTableEntries = Object.entries(val).map((tableEntry) => {\n// \t\t\t\t\t\treturn [`__${key}__.${tableEntry[0]}`, tableEntry[1]];\n// \t\t\t\t\t});\n\n// \t\t\t\t\treturn mappedTableEntries;\n// \t\t\t\t})\n// \t\t\t\t.flat(),\n// \t\t),\n// \t\t...relations,\n// \t};\n\n// \tconst relationsConfig = extractTablesRelationalConfig(relationalSchema, createTableRelationsHelpers);\n\n// \tlet result = '';\n\n// \tfunction findColumnKey(table: AnyGelTable, columnName: string) {\n// \t\tfor (const tableEntry of Object.entries(table)) {\n// \t\t\tconst key = tableEntry[0];\n// \t\t\tconst value = tableEntry[1];\n\n// \t\t\tif (value.name === columnName) {\n// \t\t\t\treturn key;\n// \t\t\t}\n// \t\t}\n// \t}\n\n// \tObject.values(relationsConfig.tables).forEach((table) => {\n// \t\tconst tableName = table.tsName.split('.')[1];\n// \t\tconst relations = table.relations;\n// \t\tlet hasRelations = false;\n// \t\tlet relationsObjAsStr = '';\n// \t\tlet hasOne = false;\n// \t\tlet hasMany = false;\n\n// \t\tObject.values(relations).forEach((relation) => {\n// \t\t\thasRelations = true;\n\n// \t\t\tif (is(relation, Many)) {\n// \t\t\t\thasMany = true;\n// \t\t\t\trelationsObjAsStr += `\\t\\t${relation.fieldName}: many(${\n// \t\t\t\t\trelationsConfig.tableNamesMap[relation.referencedTableName].split('.')[1]\n// \t\t\t\t}${typeof relation.relationName !== 'undefined' ? `, { relationName: \"${relation.relationName}\"}` : ''}),`;\n// \t\t\t}\n\n// \t\t\tif (is(relation, One)) {\n// \t\t\t\thasOne = true;\n// \t\t\t\trelationsObjAsStr += `\\t\\t${relation.fieldName}: one(${\n// \t\t\t\t\trelationsConfig.tableNamesMap[relation.referencedTableName].split('.')[1]\n// \t\t\t\t}, { fields: [${\n// \t\t\t\t\trelation.config?.fields.map(\n// \t\t\t\t\t\t(c) =>\n// \t\t\t\t\t\t\t`${relationsConfig.tableNamesMap[getTableName(relation.sourceTable)].split('.')[1]}.${\n// \t\t\t\t\t\t\t\tfindColumnKey(relation.sourceTable, c.name)\n// \t\t\t\t\t\t\t}`,\n// \t\t\t\t\t)\n// \t\t\t\t}], references: [${\n// \t\t\t\t\trelation.config?.references.map(\n// \t\t\t\t\t\t(c) =>\n// \t\t\t\t\t\t\t`${relationsConfig.tableNamesMap[getTableName(relation.referencedTable)].split('.')[1]}.${\n// \t\t\t\t\t\t\t\tfindColumnKey(relation.referencedTable, c.name)\n// \t\t\t\t\t\t\t}`,\n// \t\t\t\t\t)\n// \t\t\t\t}]${typeof relation.relationName !== 'undefined' ? `, relationName: \"${relation.relationName}\"` : ''}}),`;\n// \t\t\t}\n// \t\t});\n\n// \t\tif (hasRelations) {\n// \t\t\tresult += `export const ${tableName}Relation = relations(${tableName}, ({${hasOne ? 'one' : ''}${\n// \t\t\t\thasOne && hasMany ? ', ' : ''\n// \t\t\t}${hasMany ? 'many' : ''}}) => ({\n//         ${relationsObjAsStr}\n//       }));\\n`;\n// \t\t}\n// \t});\n\n// \treturn result;\n// };\n\nfunction generateIdentityParams(identity: Column['identity']) {\n\tlet paramsObj = `{ name: \"${identity!.name}\"`;\n\tif (identity?.startWith) {\n\t\tparamsObj += `, startWith: ${identity.startWith}`;\n\t}\n\tif (identity?.increment) {\n\t\tparamsObj += `, increment: ${identity.increment}`;\n\t}\n\tif (identity?.minValue) {\n\t\tparamsObj += `, minValue: ${identity.minValue}`;\n\t}\n\tif (identity?.maxValue) {\n\t\tparamsObj += `, maxValue: ${identity.maxValue}`;\n\t}\n\tif (identity?.cache) {\n\t\tparamsObj += `, cache: ${identity.cache}`;\n\t}\n\tif (identity?.cycle) {\n\t\tparamsObj += `, cycle: true`;\n\t}\n\tparamsObj += ' }';\n\tif (identity?.type === 'always') {\n\t\treturn `.generatedAlwaysAsIdentity(${paramsObj})`;\n\t}\n\treturn `.generatedByDefaultAsIdentity(${paramsObj})`;\n}\n\nexport const paramNameFor = (name: string, schema?: string) => {\n\tconst schemaSuffix = schema && schema !== 'public' ? `In${schema.capitalise()}` : '';\n\treturn `${name}${schemaSuffix}`;\n};\n\nexport const schemaToTypeScript = (schema: GelSchemaInternal, casing: Casing) => {\n\t// collectFKs\n\tObject.values(schema.tables).forEach((table) => {\n\t\tObject.values(table.foreignKeys).forEach((fk) => {\n\t\t\tconst relation = `${fk.tableFrom}-${fk.tableTo}`;\n\t\t\trelations.add(relation);\n\t\t});\n\t});\n\n\tconst schemas = Object.fromEntries(\n\t\tObject.entries(schema.schemas).map((it) => {\n\t\t\treturn [it[0], withCasing(it[1].replace('::', ''), casing)];\n\t\t}),\n\t);\n\n\t// const enumTypes = Object.values(schema.enums).reduce((acc, cur) => {\n\t// \tacc.add(`${cur.schema}.${cur.name}`);\n\t// \treturn acc;\n\t// }, new Set<string>());\n\n\tconst imports = Object.values(schema.tables).reduce(\n\t\t(res, it) => {\n\t\t\tconst idxImports = Object.values(it.indexes).map((idx) => (idx.isUnique ? 'uniqueIndex' : 'index'));\n\t\t\tconst fkImpots = Object.values(it.foreignKeys).map((it) => 'foreignKey');\n\t\t\tif (Object.values(it.foreignKeys).some((it) => isCyclic(it) && !isSelf(it))) {\n\t\t\t\tres.gel.push('type AnyGelColumn');\n\t\t\t}\n\t\t\tconst pkImports = Object.values(it.compositePrimaryKeys).map((it) => 'primaryKey');\n\t\t\tconst uniqueImports = Object.values(it.uniqueConstraints).map((it) => 'unique');\n\n\t\t\tconst checkImports = Object.values(it.checkConstraints).map(\n\t\t\t\t(it) => 'check',\n\t\t\t);\n\n\t\t\tconst policiesImports = Object.values(it.policies).map(\n\t\t\t\t(it) => 'gelPolicy',\n\t\t\t);\n\n\t\t\tif (it.schema && it.schema !== 'public' && it.schema !== '') {\n\t\t\t\tres.gel.push('gelSchema');\n\t\t\t}\n\n\t\t\tres.gel.push(...idxImports);\n\t\t\tres.gel.push(...fkImpots);\n\t\t\tres.gel.push(...pkImports);\n\t\t\tres.gel.push(...uniqueImports);\n\t\t\tres.gel.push(...policiesImports);\n\t\t\tres.gel.push(...checkImports);\n\n\t\t\tconst columnImports = Object.values(it.columns)\n\t\t\t\t.map((col) => {\n\t\t\t\t\tlet patched: string = col.type?.replace('[]', '') ?? '';\n\t\t\t\t\tpatched = patched.startsWith('time without time zone') ? 'localTime' : patched;\n\n\t\t\t\t\tpatched = patched === 'double precision' ? 'doublePrecision' : patched;\n\t\t\t\t\tpatched = patched.startsWith('edgedbt.bigint_t') ? 'bigintT' : patched;\n\n\t\t\t\t\tpatched = patched.startsWith('jsonb') ? 'json' : patched;\n\t\t\t\t\tpatched = patched.startsWith('edgedbt.timestamptz_t') ? 'timestamptz' : patched;\n\t\t\t\t\tpatched = patched.startsWith('edgedbt.timestamp_t') ? 'timestamp' : patched;\n\n\t\t\t\t\tpatched = patched.startsWith('edgedbt.relative_duration_t') ? 'relDuration' : patched;\n\t\t\t\t\tpatched = patched.startsWith('bytea') ? 'bytes' : patched;\n\n\t\t\t\t\tpatched = patched.startsWith('numeric') ? 'decimal' : patched;\n\n\t\t\t\t\tpatched = patched.startsWith('edgedbt.duration_t') ? 'duration' : patched;\n\t\t\t\t\tpatched = patched.startsWith('edgedbt.date_t') ? 'localDate' : patched;\n\t\t\t\t\tpatched = patched.startsWith('edgedbt.date_duration_t') ? 'dateDuration' : patched;\n\n\t\t\t\t\treturn patched;\n\t\t\t\t})\n\t\t\t\t.filter((type) => {\n\t\t\t\t\treturn gelImportsList.has(type);\n\t\t\t\t});\n\n\t\t\tres.gel.push(...columnImports);\n\t\t\treturn res;\n\t\t},\n\t\t{ gel: [] as string[] },\n\t);\n\n\t// Object.values(schema.sequences).forEach((it) => {\n\t// \tif (it.schema && it.schema !== 'public' && it.schema !== '') {\n\t// \t\timports.gel.push('gelSchema');\n\t// \t} else if (it.schema === 'public') {\n\t// \t\timports.gel.push('gelSequence');\n\t// \t}\n\t// });\n\n\t// Object.values(schema.enums).forEach((it) => {\n\t// \tif (it.schema && it.schema !== 'public' && it.schema !== '') {\n\t// \t\timports.gel.push('gelSchema');\n\t// \t} else if (it.schema === 'public') {\n\t// \t\timports.gel.push('gelEnum');\n\t// \t}\n\t// });\n\n\tif (Object.keys(schema.roles).length > 0) {\n\t\timports.gel.push('gelRole');\n\t}\n\n\t// const enumStatements = Object.values(schema.enums)\n\t// \t.map((it) => {\n\t// \t\tconst enumSchema = schemas[it.schema];\n\t// \t\t// const func = schema || schema === \"public\" ? \"gelTable\" : schema;\n\t// \t\tconst paramName = paramNameFor(it.name, enumSchema);\n\n\t// \t\tconst func = enumSchema ? `${enumSchema}.enum` : 'gelEnum';\n\n\t// \t\tconst values = Object.values(it.values)\n\t// \t\t\t.map((it) => `'${unescapeSingleQuotes(it, false)}'`)\n\t// \t\t\t.join(', ');\n\t// \t\treturn `export const ${withCasing(paramName, casing)} = ${func}(\"${it.name}\", [${values}])\\n`;\n\t// \t})\n\t// \t.join('')\n\t// \t.concat('\\n');\n\n\t// const sequencesStatements = Object.values(schema.sequences)\n\t// \t.map((it) => {\n\t// \t\tconst seqSchema = schemas[it.schema];\n\t// \t\tconst paramName = paramNameFor(it.name, seqSchema);\n\n\t// \t\tconst func = seqSchema ? `${seqSchema}.sequence` : 'gelSequence';\n\n\t// \t\tlet params = '';\n\n\t// \t\tif (it.startWith) {\n\t// \t\t\tparams += `, startWith: \"${it.startWith}\"`;\n\t// \t\t}\n\t// \t\tif (it.increment) {\n\t// \t\t\tparams += `, increment: \"${it.increment}\"`;\n\t// \t\t}\n\t// \t\tif (it.minValue) {\n\t// \t\t\tparams += `, minValue: \"${it.minValue}\"`;\n\t// \t\t}\n\t// \t\tif (it.maxValue) {\n\t// \t\t\tparams += `, maxValue: \"${it.maxValue}\"`;\n\t// \t\t}\n\t// \t\tif (it.cache) {\n\t// \t\t\tparams += `, cache: \"${it.cache}\"`;\n\t// \t\t}\n\t// \t\tif (it.cycle) {\n\t// \t\t\tparams += `, cycle: true`;\n\t// \t\t} else {\n\t// \t\t\tparams += `, cycle: false`;\n\t// \t\t}\n\n\t// \t\treturn `export const ${withCasing(paramName, casing)} = ${func}(\"${it.name}\"${\n\t// \t\t\tparams ? `, { ${params.trimChar(',')} }` : ''\n\t// \t\t})\\n`;\n\t// \t})\n\t// \t.join('')\n\t// \t.concat('');\n\n\tconst schemaStatements = Object.entries(schemas)\n\t\t.filter((it) => it[0] !== 'public')\n\t\t.map((it) => {\n\t\t\treturn `export const ${it[1].replace('::', '').camelCase()} = gelSchema(\"${it[0]}\");\\n`;\n\t\t})\n\t\t.join('');\n\n\tconst rolesNameToTsKey: Record<string, string> = {};\n\n\tconst rolesStatements = Object.entries(schema.roles)\n\t\t.map((it) => {\n\t\t\tconst fields = it[1];\n\t\t\trolesNameToTsKey[fields.name] = it[0];\n\t\t\treturn `export const ${withCasing(it[0], casing)} = gelRole(\"${fields.name}\", ${\n\t\t\t\t!fields.createDb && !fields.createRole && fields.inherit\n\t\t\t\t\t? ''\n\t\t\t\t\t: `${\n\t\t\t\t\t\t`, { ${fields.createDb ? `createDb: true,` : ''}${fields.createRole ? ` createRole: true,` : ''}${\n\t\t\t\t\t\t\t!fields.inherit ? ` inherit: false ` : ''\n\t\t\t\t\t\t}`.trimChar(',')\n\t\t\t\t\t}}`\n\t\t\t} );\\n`;\n\t\t})\n\t\t.join('');\n\n\tconst tableStatements = Object.values(schema.tables).map((table) => {\n\t\tconst tableSchema = schemas[table.schema];\n\t\tconst paramName = paramNameFor(table.name, tableSchema);\n\n\t\tconst func = tableSchema ? `${tableSchema}.table` : 'gelTable';\n\t\tlet statement = `export const ${withCasing(paramName, casing)} = ${func}(\"${table.name}\", {\\n`;\n\t\tstatement += createTableColumns(\n\t\t\ttable.name,\n\t\t\tObject.values(table.columns),\n\t\t\tObject.values(table.foreignKeys),\n\t\t\t// enumTypes,\n\t\t\tnew Set(),\n\t\t\tschemas,\n\t\t\tcasing,\n\t\t\tschema.internal,\n\t\t);\n\t\tstatement += '}';\n\n\t\t// more than 2 fields or self reference or cyclic\n\t\t// Andrii: I switched this one off until we will get custom names in .references()\n\t\t// const filteredFKs = Object.values(table.foreignKeys).filter((it) => {\n\t\t// \treturn it.columnsFrom.length > 1 || isSelf(it);\n\t\t// });\n\n\t\tif (\n\t\t\tObject.keys(table.indexes).length > 0\n\t\t\t|| Object.values(table.foreignKeys).length > 0\n\t\t\t|| Object.values(table.policies).length > 0\n\t\t\t|| Object.keys(table.compositePrimaryKeys).length > 0\n\t\t\t|| Object.keys(table.uniqueConstraints).length > 0\n\t\t\t|| Object.keys(table.checkConstraints).length > 0\n\t\t) {\n\t\t\tstatement += ', ';\n\t\t\tstatement += '(table) => [';\n\t\t\tstatement += createTableIndexes(table.name, Object.values(table.indexes), casing);\n\t\t\tstatement += createTableFKs(Object.values(table.foreignKeys), schemas, casing);\n\t\t\tstatement += createTablePKs(\n\t\t\t\tObject.values(table.compositePrimaryKeys),\n\t\t\t\tcasing,\n\t\t\t);\n\t\t\tstatement += createTableUniques(\n\t\t\t\tObject.values(table.uniqueConstraints),\n\t\t\t\tcasing,\n\t\t\t);\n\t\t\tstatement += createTablePolicies(\n\t\t\t\tObject.values(table.policies),\n\t\t\t\tcasing,\n\t\t\t\trolesNameToTsKey,\n\t\t\t);\n\t\t\tstatement += createTableChecks(\n\t\t\t\tObject.values(table.checkConstraints),\n\t\t\t\tcasing,\n\t\t\t);\n\t\t\tstatement += '\\n]';\n\t\t}\n\n\t\tstatement += ');';\n\t\treturn statement;\n\t});\n\n\t// const viewsStatements = Object.values(schema.views)\n\t// \t.map((it) => {\n\t// \t\tconst viewSchema = schemas[it.schema];\n\n\t// \t\tconst paramName = paramNameFor(it.name, viewSchema);\n\n\t// \t\tconst func = viewSchema\n\t// \t\t\t? (it.materialized ? `${viewSchema}.materializedView` : `${viewSchema}.view`)\n\t// \t\t\t: it.materialized\n\t// \t\t\t? 'gelMaterializedView'\n\t// \t\t\t: 'gelView';\n\n\t// \t\tconst withOption = it.with ?? '';\n\n\t// \t\tconst as = `sql\\`${it.definition}\\``;\n\n\t// \t\tconst tablespace = it.tablespace ?? '';\n\n\t// \t\tconst columns = createTableColumns(\n\t// \t\t\t'',\n\t// \t\t\tObject.values(it.columns),\n\t// \t\t\t[],\n\t// \t\t\tenumTypes,\n\t// \t\t\tschemas,\n\t// \t\t\tcasing,\n\t// \t\t\tschema.internal,\n\t// \t\t);\n\n\t// \t\tlet statement = `export const ${withCasing(paramName, casing)} = ${func}(\"${it.name}\", {${columns}})`;\n\t// \t\tstatement += tablespace ? `.tablespace(\"${tablespace}\")` : '';\n\t// \t\tstatement += withOption ? `.with(${JSON.stringify(withOption)})` : '';\n\t// \t\tstatement += `.as(${as});`;\n\n\t// \t\treturn statement;\n\t// \t})\n\t// \t.join('\\n\\n');\n\n\tconst uniqueGelImports = ['gelTable', ...new Set(imports.gel)];\n\n\tconst importsTs = `import { ${\n\t\tuniqueGelImports.join(\n\t\t\t', ',\n\t\t)\n\t} } from \"drizzle-orm/gel-core\"\nimport { sql } from \"drizzle-orm\"\\n\\n`;\n\n\tlet decalrations = schemaStatements;\n\tdecalrations += rolesStatements;\n\t// decalrations += enumStatements;\n\t// decalrations += sequencesStatements;\n\tdecalrations += '\\n';\n\tdecalrations += tableStatements.join('\\n\\n');\n\tdecalrations += '\\n';\n\t// decalrations += viewsStatements;\n\n\tconst file = importsTs + decalrations;\n\n\t// for drizzle studio query runner\n\tconst schemaEntry = `\n    {\n      ${\n\t\tObject.values(schema.tables)\n\t\t\t.map((it) => withCasing(it.name, casing))\n\t\t\t.join(',\\n')\n\t}\n    }\n  `;\n\n\treturn { file, imports: importsTs, decalrations, schemaEntry };\n};\n\nconst isCyclic = (fk: ForeignKey) => {\n\tconst key = `${fk.tableFrom}-${fk.tableTo}`;\n\tconst reverse = `${fk.tableTo}-${fk.tableFrom}`;\n\treturn relations.has(key) && relations.has(reverse);\n};\n\nconst isSelf = (fk: ForeignKey) => {\n\treturn fk.tableFrom === fk.tableTo;\n};\n\nconst buildArrayDefault = (defaultValue: string, typeName: string): string => {\n\tif (\n\t\ttypeof defaultValue === 'string'\n\t\t&& !(defaultValue.startsWith('_nullif_array_nulls(ARRAY[') || defaultValue.startsWith('ARRAY['))\n\t) {\n\t\treturn `sql\\`${defaultValue}\\``;\n\t}\n\n\tconst regex = /ARRAY\\[(.*)\\]/;\n\tconst match = defaultValue.match(regex);\n\n\tif (!match) {\n\t\treturn `sql\\`${defaultValue}\\``;\n\t}\n\n\tdefaultValue = match[1];\n\treturn `sql\\`[${defaultValue}]\\``;\n};\n\nconst mapDefault = (\n\ttableName: string,\n\ttype: string,\n\tname: string,\n\tenumTypes: Set<string>,\n\ttypeSchema: string,\n\tdefaultValue?: any,\n\tinternals?: GelKitInternals,\n) => {\n\tconst isExpression = internals?.tables[tableName]?.columns[name]?.isDefaultAnExpression ?? false;\n\tconst isArray = internals?.tables[tableName]?.columns[name]?.isArray ?? false;\n\tconst lowered = type.toLowerCase().replace('[]', '');\n\n\tif (name === 'id') {\n\t\treturn `.default(sql\\`uuid_generate_v4()\\`)`;\n\t}\n\n\tif (isArray) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${buildArrayDefault(defaultValue, lowered)})` : '';\n\t}\n\n\tif (enumTypes.has(`${typeSchema}.${type.replace('[]', '')}`)) {\n\t\treturn typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(unescapeSingleQuotes(defaultValue, true), isExpression)})`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('integer')) {\n\t\treturn typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(defaultValue.replaceAll('(', '').replaceAll(')', ''), isExpression)})`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('smallint')) {\n\t\treturn typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(defaultValue.replaceAll('(', '').replaceAll(')', ''), isExpression)})`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('bigint')) {\n\t\treturn typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(defaultValue.replaceAll('(', '').replaceAll(')', ''), isExpression)})`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('edgedbt.bigint_t')) {\n\t\treturn typeof defaultValue !== 'undefined'\n\t\t\t? `.default(BigInt(${mapColumnDefault(defaultValue.replaceAll('(', '').replaceAll(')', ''), isExpression)}))`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('boolean')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('double precision')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('edgedbt.date_duration_t')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, true)})` : '';\n\t}\n\n\tif (lowered.startsWith('real')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('uuid')) {\n\t\tconst res = defaultValue === 'gen_random_uuid()'\n\t\t\t? '.defaultRandom()'\n\t\t\t: defaultValue\n\t\t\t? `.default(sql\\`${defaultValue}\\`)`\n\t\t\t: '';\n\n\t\treturn res;\n\t}\n\n\tif (lowered.startsWith('numeric')) {\n\t\tdefaultValue = defaultValue\n\t\t\t? (defaultValue.startsWith(`'`) && defaultValue.endsWith(`'`)\n\t\t\t\t? defaultValue.substring(1, defaultValue.length - 1)\n\t\t\t\t: defaultValue)\n\t\t\t: undefined;\n\t\treturn defaultValue ? `.default(sql\\`${defaultValue}\\`)` : '';\n\t}\n\n\tif (lowered.startsWith('edgedbt.timestamptz_t')) {\n\t\treturn defaultValue === 'now()'\n\t\t\t? '.defaultNow()'\n\t\t\t: /^'\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}(\\.\\d+)?([+-]\\d{2}(:\\d{2})?)?'$/.test(defaultValue) // Matches 'YYYY-MM-DD HH:MI:SS', 'YYYY-MM-DD HH:MI:SS.FFFFFF', 'YYYY-MM-DD HH:MI:SS+TZ', 'YYYY-MM-DD HH:MI:SS.FFFFFF+TZ' and 'YYYY-MM-DD HH:MI:SS+HH:MI'\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: defaultValue\n\t\t\t? `.default(sql\\`${defaultValue}\\`)`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('time without time zone')) {\n\t\treturn defaultValue === 'now()'\n\t\t\t? '.defaultNow()'\n\t\t\t: /^'\\d{2}:\\d{2}(:\\d{2})?(\\.\\d+)?'$/.test(defaultValue) // Matches 'HH:MI', 'HH:MI:SS' and 'HH:MI:SS.FFFFFF'\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: defaultValue\n\t\t\t? `.default(sql\\`${defaultValue}\\`)`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('edgedbt.duration_t')) {\n\t\treturn defaultValue ? `.default(${mapColumnDefault(defaultValue, true)})` : '';\n\t}\n\n\tif (lowered === 'edgedbt.date_t') {\n\t\treturn defaultValue === 'now()'\n\t\t\t? '.defaultNow()'\n\t\t\t: /^'\\d{4}-\\d{2}-\\d{2}'$/.test(defaultValue) // Matches 'YYYY-MM-DD'\n\t\t\t? `.default(${defaultValue})`\n\t\t\t: defaultValue\n\t\t\t? `.default(sql\\`${defaultValue}\\`)`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('edgedbt.relative_duration_t')) {\n\t\treturn defaultValue ? `.default(${mapColumnDefault(defaultValue, true)})` : '';\n\t}\n\n\tif (lowered.startsWith('text')) {\n\t\treturn typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(unescapeSingleQuotes(defaultValue, true), isExpression)})`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('json')) {\n\t\tconst def = typeof defaultValue !== 'undefined'\n\t\t\t? defaultValue\n\t\t\t: null;\n\n\t\treturn defaultValue ? `.default(sql\\`${def}\\`)` : '';\n\t}\n\n\tif (lowered.startsWith('bytea')) {\n\t\treturn typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(defaultValue, true)})`\n\t\t\t: '';\n\t}\n\n\treturn '';\n};\n\nconst column = (\n\ttableName: string,\n\ttype: string,\n\tname: string,\n\tenumTypes: Set<string>,\n\ttypeSchema: string,\n\tcasing: Casing,\n\tdefaultValue?: any,\n\tinternals?: GelKitInternals,\n) => {\n\tconst isExpression = internals?.tables[tableName]?.columns[name]?.isDefaultAnExpression ?? false;\n\tconst lowered = type.toLowerCase().replace('[]', '');\n\n\tif (enumTypes.has(`${typeSchema}.${type.replace('[]', '')}`)) {\n\t\tlet out = `${withCasing(name, casing)}: ${withCasing(paramNameFor(type.replace('[]', ''), typeSchema), casing)}(${\n\t\t\tdbColumnName({ name, casing })\n\t\t})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('integer')) {\n\t\tlet out = `${withCasing(name, casing)}: integer(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('smallint')) {\n\t\tlet out = `${withCasing(name, casing)}: smallint(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('bigint')) {\n\t\tlet out = `${withCasing(name, casing)}: bigint(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('edgedbt.bigint_t')) {\n\t\tlet out = `${withCasing(name, casing)}: bigintT(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('boolean')) {\n\t\tlet out = `${withCasing(name, casing)}: boolean(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('double precision')) {\n\t\tlet out = `${withCasing(name, casing)}: doublePrecision(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('edgedbt.date_duration_t')) {\n\t\tlet out = `${withCasing(name, casing)}: dateDuration(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('real')) {\n\t\tlet out = `${withCasing(name, casing)}: real(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('uuid')) {\n\t\tlet out = `${withCasing(name, casing)}: uuid(${dbColumnName({ name, casing })})`;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('numeric')) {\n\t\tlet out = `${withCasing(name, casing)}: decimal(${dbColumnName({ name, casing })})`;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('edgedbt.timestamptz_t')) {\n\t\tlet out = `${withCasing(name, casing)}: timestamptz(${dbColumnName({ name, casing })})`;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('edgedbt.timestamp_t')) {\n\t\tlet out = `${withCasing(name, casing)}: timestamp(${dbColumnName({ name, casing })})`;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('edgedbt.date_t')) {\n\t\tlet out = `${withCasing(name, casing)}: localDate(${dbColumnName({ name, casing })})`;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('edgedbt.duration_t')) {\n\t\tlet out = `${withCasing(name, casing)}: duration(${dbColumnName({ name, casing })})`;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('edgedbt.relative_duration_t')) {\n\t\tlet out = `${withCasing(name, casing)}: relDuration(${dbColumnName({ name, casing })})`;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('text')) {\n\t\tlet out = `${withCasing(name, casing)}: text(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('jsonb')) {\n\t\tlet out = `${withCasing(name, casing)}: json(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('time without time zone')) {\n\t\tlet out = `${withCasing(name, casing)}: localTime(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('bytea')) {\n\t\tlet out = `${withCasing(name, casing)}: bytes(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tlet unknown = `// TODO: failed to parse database type '${type}'\\n`;\n\tunknown += `\\t${withCasing(name, casing)}: unknown(\"${name}\")`;\n\treturn unknown;\n};\n\nconst dimensionsInArray = (size?: number): string => {\n\tlet res = '';\n\tif (typeof size === 'undefined') return res;\n\tfor (let i = 0; i < size; i++) {\n\t\tres += '.array()';\n\t}\n\treturn res;\n};\n\nconst createTableColumns = (\n\ttableName: string,\n\tcolumns: Column[],\n\tfks: ForeignKey[],\n\tenumTypes: Set<string>,\n\tschemas: Record<string, string>,\n\tcasing: Casing,\n\tinternals: GelKitInternals,\n): string => {\n\tlet statement = '';\n\n\t// no self refs and no cyclic\n\tconst oneColumnsFKs = Object.values(fks)\n\t\t.filter((it) => {\n\t\t\treturn !isSelf(it);\n\t\t})\n\t\t.filter((it) => it.columnsFrom.length === 1);\n\n\tconst fkByColumnName = oneColumnsFKs.reduce((res, it) => {\n\t\tconst arr = res[it.columnsFrom[0]] || [];\n\t\tarr.push(it);\n\t\tres[it.columnsFrom[0]] = arr;\n\t\treturn res;\n\t}, {} as Record<string, ForeignKey[]>);\n\n\tcolumns.forEach((it) => {\n\t\tconst columnStatement = column(\n\t\t\ttableName,\n\t\t\tit.type,\n\t\t\tit.name,\n\t\t\tenumTypes,\n\t\t\tit.typeSchema ?? 'public',\n\t\t\tcasing,\n\t\t\tit.default,\n\t\t\tinternals,\n\t\t);\n\t\tstatement += '\\t';\n\t\tstatement += columnStatement;\n\t\t// Provide just this in column function\n\t\tif (internals?.tables[tableName]?.columns[it.name]?.isArray) {\n\t\t\tstatement += dimensionsInArray(internals?.tables[tableName]?.columns[it.name]?.dimensions);\n\t\t}\n\t\tstatement += mapDefault(tableName, it.type, it.name, enumTypes, it.typeSchema ?? 'public', it.default, internals);\n\t\tstatement += it.primaryKey ? '.primaryKey()' : '';\n\t\tstatement += it.notNull && !it.identity ? '.notNull()' : '';\n\n\t\tstatement += it.identity ? generateIdentityParams(it.identity) : '';\n\n\t\tstatement += it.generated ? `.generatedAlwaysAs(sql\\`${it.generated.as}\\`)` : '';\n\n\t\t// const fks = fkByColumnName[it.name];\n\t\t// Andrii: I switched it off until we will get a custom naem setting in references\n\t\t// if (fks) {\n\t\t// \tconst fksStatement = fks\n\t\t// \t\t.map((it) => {\n\t\t// \t\t\tconst onDelete = it.onDelete && it.onDelete !== 'no action' ? it.onDelete : null;\n\t\t// \t\t\tconst onUpdate = it.onUpdate && it.onUpdate !== 'no action' ? it.onUpdate : null;\n\t\t// \t\t\tconst params = { onDelete, onUpdate };\n\n\t\t// \t\t\tconst typeSuffix = isCyclic(it) ? ': AnyGelColumn' : '';\n\n\t\t// \t\t\tconst paramsStr = objToStatement2(params);\n\t\t// \t\t\tconst tableSchema = schemas[it.schemaTo || ''];\n\t\t// \t\t\tconst paramName = paramNameFor(it.tableTo, tableSchema);\n\t\t// \t\t\tif (paramsStr) {\n\t\t// \t\t\t\treturn `.references(()${typeSuffix} => ${\n\t\t// \t\t\t\t\twithCasing(\n\t\t// \t\t\t\t\t\tparamName,\n\t\t// \t\t\t\t\t\tcasing,\n\t\t// \t\t\t\t\t)\n\t\t// \t\t\t\t}.${withCasing(it.columnsTo[0], casing)}, ${paramsStr} )`;\n\t\t// \t\t\t}\n\t\t// \t\t\treturn `.references(()${typeSuffix} => ${\n\t\t// \t\t\t\twithCasing(\n\t\t// \t\t\t\t\tparamName,\n\t\t// \t\t\t\t\tcasing,\n\t\t// \t\t\t\t)\n\t\t// \t\t\t}.${withCasing(it.columnsTo[0], casing)})`;\n\t\t// \t\t})\n\t\t// \t\t.join('');\n\t\t// \tstatement += fksStatement;\n\t\t// }\n\n\t\tstatement += ',\\n';\n\t});\n\n\treturn statement;\n};\n\nconst createTableIndexes = (tableName: string, idxs: Index[], casing: Casing): string => {\n\tlet statement = '';\n\n\tidxs.forEach((it) => {\n\t\t// we have issue when index is called as table called\n\t\tlet idxKey = it.name.startsWith(tableName) && it.name !== tableName ? it.name.slice(tableName.length + 1) : it.name;\n\t\tidxKey = idxKey.endsWith('_index') ? idxKey.slice(0, -'_index'.length) + '_idx' : idxKey;\n\n\t\tidxKey = withCasing(idxKey, casing);\n\n\t\tconst indexGeneratedName = indexName(\n\t\t\ttableName,\n\t\t\tit.columns.map((it) => it.expression),\n\t\t);\n\t\tconst escapedIndexName = indexGeneratedName === it.name ? '' : `\"${it.name}\"`;\n\n\t\tstatement += `\\n\\t`;\n\t\tstatement += it.isUnique ? 'uniqueIndex(' : 'index(';\n\t\tstatement += `${escapedIndexName})`;\n\t\tstatement += `${it.concurrently ? `.concurrently()` : ''}`;\n\n\t\tstatement += `.using(\"${it.method}\", ${\n\t\t\tit.columns\n\t\t\t\t.map((it) => {\n\t\t\t\t\tif (it.isExpression) {\n\t\t\t\t\t\treturn `sql\\`${it.expression}\\``;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn `table.${withCasing(it.expression, casing)}${it.asc ? '.asc()' : '.desc()'}${\n\t\t\t\t\t\t\tit.nulls === 'first' ? '.nullsFirst()' : '.nullsLast()'\n\t\t\t\t\t\t}${\n\t\t\t\t\t\t\tit.opclass\n\t\t\t\t\t\t\t\t? `.op(\"${it.opclass}\")`\n\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t}`;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.join(', ')\n\t\t})`;\n\t\tstatement += it.where ? `.where(sql\\`${it.where}\\`)` : '';\n\n\t\tfunction reverseLogic(mappedWith: Record<string, string>): string {\n\t\t\tlet reversedString = '{';\n\t\t\tfor (const key in mappedWith) {\n\t\t\t\tif (mappedWith.hasOwnProperty(key)) {\n\t\t\t\t\treversedString += `${key}: \"${mappedWith[key]}\",`;\n\t\t\t\t}\n\t\t\t}\n\t\t\treversedString = reversedString.length > 1 ? reversedString.slice(0, reversedString.length - 1) : reversedString;\n\t\t\treturn `${reversedString}}`;\n\t\t}\n\n\t\tstatement += it.with && Object.keys(it.with).length > 0 ? `.with(${reverseLogic(it.with)})` : '';\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n\nconst createTablePKs = (pks: PrimaryKey[], casing: Casing): string => {\n\tlet statement = '';\n\n\tpks.forEach((it) => {\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'primaryKey({ columns: [';\n\t\tstatement += `${\n\t\t\tit.columns\n\t\t\t\t.map((c) => {\n\t\t\t\t\treturn `table.${withCasing(c, casing)}`;\n\t\t\t\t})\n\t\t\t\t.join(', ')\n\t\t}]${it.name ? `, name: \"${it.name}\"` : ''}}`;\n\t\tstatement += ')';\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n\n// get a map of db role name to ts key\n// if to by key is in this map - no quotes, otherwise - quotes\n\nconst createTablePolicies = (\n\tpolicies: Policy[],\n\tcasing: Casing,\n\trolesNameToTsKey: Record<string, string> = {},\n): string => {\n\tlet statement = '';\n\n\tpolicies.forEach((it) => {\n\t\tconst idxKey = withCasing(it.name, casing);\n\n\t\tconst mappedItTo = it.to?.map((v) => {\n\t\t\treturn rolesNameToTsKey[v] ? withCasing(rolesNameToTsKey[v], casing) : `\"${v}\"`;\n\t\t});\n\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'gelPolicy(';\n\t\tstatement += `\"${it.name}\", { `;\n\t\tstatement += `as: \"${it.as?.toLowerCase()}\", for: \"${it.for?.toLowerCase()}\", to: [${mappedItTo?.join(', ')}]${\n\t\t\tit.using ? `, using: sql\\`${it.using}\\`` : ''\n\t\t}${it.withCheck ? `, withCheck: sql\\`${it.withCheck}\\` ` : ''}`;\n\t\tstatement += ` }),`;\n\t});\n\n\treturn statement;\n};\n\nconst createTableUniques = (\n\tunqs: UniqueConstraint[],\n\tcasing: Casing,\n): string => {\n\tlet statement = '';\n\n\tunqs.forEach((it) => {\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'unique(';\n\t\tstatement += `\"${it.name}\")`;\n\t\tstatement += `.on(${it.columns.map((it) => `table.${withCasing(it, casing)}`).join(', ')})`;\n\t\tstatement += it.nullsNotDistinct ? `.nullsNotDistinct()` : '';\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n\nconst createTableChecks = (\n\tcheckConstraints: CheckConstraint[],\n\tcasing: Casing,\n) => {\n\tlet statement = '';\n\n\tcheckConstraints.forEach((it) => {\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'check(';\n\t\tstatement += `\"${it.name}\", `;\n\t\tstatement += `sql\\`${it.value}\\`)`;\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n\nconst createTableFKs = (fks: ForeignKey[], schemas: Record<string, string>, casing: Casing): string => {\n\tlet statement = '';\n\n\tfks.forEach((it) => {\n\t\tconst tableSchema = schemas[it.schemaTo || ''];\n\t\tconst paramName = paramNameFor(it.tableTo, tableSchema);\n\n\t\tconst isSelf = it.tableTo === it.tableFrom;\n\t\tconst tableTo = isSelf ? 'table' : `${withCasing(paramName, casing)}`;\n\t\tstatement += `\\n\\t`;\n\t\tstatement += `foreignKey({\\n`;\n\t\tstatement += `\\t\\t\\tcolumns: [${it.columnsFrom.map((i) => `table.${withCasing(i, casing)}`).join(', ')}],\\n`;\n\t\tstatement += `\\t\\t\\tforeignColumns: [${\n\t\t\tit.columnsTo.map((i) => `${tableTo}.${withCasing(i, casing)}`).join(', ')\n\t\t}],\\n`;\n\t\tstatement += `\\t\\t\\tname: \"${it.name}\"\\n`;\n\t\tstatement += `\\t\\t})`;\n\n\t\tstatement += it.onUpdate && it.onUpdate !== 'no action' ? `.onUpdate(\"${it.onUpdate}\")` : '';\n\n\t\tstatement += it.onDelete && it.onDelete !== 'no action' ? `.onDelete(\"${it.onDelete}\")` : '';\n\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n"
  },
  {
    "path": "drizzle-kit/src/introspect-mysql.ts",
    "content": "/* eslint-disable @typescript-eslint/no-unsafe-argument */\nimport { toCamelCase } from 'drizzle-orm/casing';\nimport './@types/utils';\nimport type { Casing } from './cli/validations/common';\nimport { assertUnreachable } from './global';\nimport {\n\tCheckConstraint,\n\tColumn,\n\tForeignKey,\n\tIndex,\n\tMySqlSchema,\n\tMySqlSchemaInternal,\n\tPrimaryKey,\n\tUniqueConstraint,\n} from './serializer/mysqlSchema';\nimport { unescapeSingleQuotes } from './utils';\n\nconst mysqlImportsList = new Set([\n\t'mysqlTable',\n\t'mysqlEnum',\n\t'bigint',\n\t'binary',\n\t'boolean',\n\t'char',\n\t'date',\n\t'datetime',\n\t'decimal',\n\t'double',\n\t'float',\n\t'int',\n\t'json',\n\t'mediumint',\n\t'real',\n\t'serial',\n\t'smallint',\n\t'text',\n\t'tinytext',\n\t'mediumtext',\n\t'longtext',\n\t'time',\n\t'timestamp',\n\t'tinyint',\n\t'varbinary',\n\t'varchar',\n\t'year',\n\t'enum',\n]);\n\nconst objToStatement = (json: any) => {\n\tjson = Object.fromEntries(Object.entries(json).filter((it) => it[1]));\n\n\tconst keys = Object.keys(json);\n\tif (keys.length === 0) return;\n\n\tlet statement = '{ ';\n\tstatement += keys.map((it) => `\"${it}\": \"${json[it]}\"`).join(', ');\n\tstatement += ' }';\n\treturn statement;\n};\n\nconst objToStatement2 = (json: any) => {\n\tjson = Object.fromEntries(Object.entries(json).filter((it) => it[1]));\n\n\tconst keys = Object.keys(json);\n\tif (keys.length === 0) return;\n\n\tlet statement = '{ ';\n\tstatement += keys.map((it) => `${it}: \"${json[it]}\"`).join(', '); // no \"\" for keys\n\tstatement += ' }';\n\treturn statement;\n};\n\nconst timeConfig = (json: any) => {\n\tjson = Object.fromEntries(Object.entries(json).filter((it) => it[1]));\n\n\tconst keys = Object.keys(json);\n\tif (keys.length === 0) return;\n\n\tlet statement = '{ ';\n\tstatement += keys.map((it) => `${it}: ${json[it]}`).join(', ');\n\tstatement += ' }';\n\treturn statement;\n};\n\nconst binaryConfig = (json: any) => {\n\tjson = Object.fromEntries(Object.entries(json).filter((it) => it[1]));\n\n\tconst keys = Object.keys(json);\n\tif (keys.length === 0) return;\n\n\tlet statement = '{ ';\n\tstatement += keys.map((it) => `${it}: ${json[it]}`).join(', ');\n\tstatement += ' }';\n\treturn statement;\n};\n\nconst importsPatch = {\n\t'double precision': 'doublePrecision',\n\t'timestamp without time zone': 'timestamp',\n} as Record<string, string>;\n\nconst relations = new Set<string>();\n\nconst escapeColumnKey = (value: string) => {\n\tif (/^(?![a-zA-Z_$][a-zA-Z0-9_$]*$).+$/.test(value)) {\n\t\treturn `\"${value}\"`;\n\t}\n\treturn value;\n};\n\nconst prepareCasing = (casing?: Casing) => (value: string) => {\n\tif (casing === 'preserve') {\n\t\treturn escapeColumnKey(value);\n\t}\n\tif (casing === 'camel') {\n\t\treturn escapeColumnKey(value.camelCase());\n\t}\n\n\tassertUnreachable(casing);\n};\n\nconst dbColumnName = ({ name, casing, withMode = false }: { name: string; casing: Casing; withMode?: boolean }) => {\n\tif (casing === 'preserve') {\n\t\treturn '';\n\t}\n\tif (casing === 'camel') {\n\t\treturn toCamelCase(name) === name ? '' : withMode ? `\"${name}\", ` : `\"${name}\"`;\n\t}\n\n\tassertUnreachable(casing);\n};\n\nexport const schemaToTypeScript = (\n\tschema: MySqlSchemaInternal,\n\tcasing: Casing,\n) => {\n\tconst withCasing = prepareCasing(casing);\n\t// collectFKs\n\tObject.values(schema.tables).forEach((table) => {\n\t\tObject.values(table.foreignKeys).forEach((fk) => {\n\t\t\tconst relation = `${fk.tableFrom}-${fk.tableTo}`;\n\t\t\trelations.add(relation);\n\t\t});\n\t});\n\n\tconst imports = Object.values(schema.tables).reduce(\n\t\t(res, it) => {\n\t\t\tconst idxImports = Object.values(it.indexes).map((idx) => idx.isUnique ? 'uniqueIndex' : 'index');\n\t\t\tconst fkImpots = Object.values(it.foreignKeys).map((it) => 'foreignKey');\n\t\t\tconst pkImports = Object.values(it.compositePrimaryKeys).map(\n\t\t\t\t(it) => 'primaryKey',\n\t\t\t);\n\t\t\tconst uniqueImports = Object.values(it.uniqueConstraints).map(\n\t\t\t\t(it) => 'unique',\n\t\t\t);\n\t\t\tconst checkImports = Object.values(it.checkConstraint).map(\n\t\t\t\t(it) => 'check',\n\t\t\t);\n\n\t\t\tres.mysql.push(...idxImports);\n\t\t\tres.mysql.push(...fkImpots);\n\t\t\tres.mysql.push(...pkImports);\n\t\t\tres.mysql.push(...uniqueImports);\n\t\t\tres.mysql.push(...checkImports);\n\n\t\t\tconst columnImports = Object.values(it.columns)\n\t\t\t\t.map((col) => {\n\t\t\t\t\tlet patched = importsPatch[col.type] ?? col.type;\n\t\t\t\t\tpatched = patched.startsWith('varchar(') ? 'varchar' : patched;\n\t\t\t\t\tpatched = patched.startsWith('char(') ? 'char' : patched;\n\t\t\t\t\tpatched = patched.startsWith('binary(') ? 'binary' : patched;\n\t\t\t\t\tpatched = patched.startsWith('decimal(') ? 'decimal' : patched;\n\t\t\t\t\tpatched = patched.startsWith('smallint(') ? 'smallint' : patched;\n\t\t\t\t\tpatched = patched.startsWith('enum(') ? 'mysqlEnum' : patched;\n\t\t\t\t\tpatched = patched.startsWith('datetime(') ? 'datetime' : patched;\n\t\t\t\t\tpatched = patched.startsWith('varbinary(') ? 'varbinary' : patched;\n\t\t\t\t\tpatched = patched.startsWith('int(') ? 'int' : patched;\n\t\t\t\t\tpatched = patched.startsWith('double(') ? 'double' : patched;\n\t\t\t\t\tpatched = patched.startsWith('float(') ? 'float' : patched;\n\t\t\t\t\tpatched = patched.startsWith('int unsigned') ? 'int' : patched;\n\t\t\t\t\tpatched = patched.startsWith('tinyint unsigned') ? 'tinyint' : patched;\n\t\t\t\t\tpatched = patched.startsWith('smallint unsigned') ? 'smallint' : patched;\n\t\t\t\t\tpatched = patched.startsWith('mediumint unsigned') ? 'mediumint' : patched;\n\t\t\t\t\tpatched = patched.startsWith('bigint unsigned') ? 'bigint' : patched;\n\t\t\t\t\treturn patched;\n\t\t\t\t})\n\t\t\t\t.filter((type) => {\n\t\t\t\t\treturn mysqlImportsList.has(type);\n\t\t\t\t});\n\n\t\t\tres.mysql.push(...columnImports);\n\t\t\treturn res;\n\t\t},\n\t\t{ mysql: [] as string[] },\n\t);\n\n\tObject.values(schema.views).forEach((it) => {\n\t\timports.mysql.push('mysqlView');\n\n\t\tconst columnImports = Object.values(it.columns)\n\t\t\t.map((col) => {\n\t\t\t\tlet patched = importsPatch[col.type] ?? col.type;\n\t\t\t\tpatched = patched.startsWith('varchar(') ? 'varchar' : patched;\n\t\t\t\tpatched = patched.startsWith('char(') ? 'char' : patched;\n\t\t\t\tpatched = patched.startsWith('binary(') ? 'binary' : patched;\n\t\t\t\tpatched = patched.startsWith('decimal(') ? 'decimal' : patched;\n\t\t\t\tpatched = patched.startsWith('smallint(') ? 'smallint' : patched;\n\t\t\t\tpatched = patched.startsWith('enum(') ? 'mysqlEnum' : patched;\n\t\t\t\tpatched = patched.startsWith('datetime(') ? 'datetime' : patched;\n\t\t\t\tpatched = patched.startsWith('varbinary(') ? 'varbinary' : patched;\n\t\t\t\tpatched = patched.startsWith('int(') ? 'int' : patched;\n\t\t\t\tpatched = patched.startsWith('double(') ? 'double' : patched;\n\t\t\t\tpatched = patched.startsWith('float(') ? 'float' : patched;\n\t\t\t\tpatched = patched.startsWith('int unsigned') ? 'int' : patched;\n\t\t\t\tpatched = patched.startsWith('tinyint unsigned') ? 'tinyint' : patched;\n\t\t\t\tpatched = patched.startsWith('smallint unsigned') ? 'smallint' : patched;\n\t\t\t\tpatched = patched.startsWith('mediumint unsigned') ? 'mediumint' : patched;\n\t\t\t\tpatched = patched.startsWith('bigint unsigned') ? 'bigint' : patched;\n\t\t\t\treturn patched;\n\t\t\t})\n\t\t\t.filter((type) => {\n\t\t\t\treturn mysqlImportsList.has(type);\n\t\t\t});\n\n\t\timports.mysql.push(...columnImports);\n\t});\n\n\tconst tableStatements = Object.values(schema.tables).map((table) => {\n\t\tconst func = 'mysqlTable';\n\t\tlet statement = '';\n\t\tif (imports.mysql.includes(withCasing(table.name))) {\n\t\t\tstatement = `// Table name is in conflict with ${\n\t\t\t\twithCasing(\n\t\t\t\t\ttable.name,\n\t\t\t\t)\n\t\t\t} import.\\n// Please change to any other name, that is not in imports list\\n`;\n\t\t}\n\t\tstatement += `export const ${withCasing(table.name)} = ${func}(\"${table.name}\", {\\n`;\n\t\tstatement += createTableColumns(\n\t\t\tObject.values(table.columns),\n\t\t\tObject.values(table.foreignKeys),\n\t\t\twithCasing,\n\t\t\tcasing,\n\t\t\ttable.name,\n\t\t\tschema,\n\t\t);\n\t\tstatement += '}';\n\n\t\t// more than 2 fields or self reference or cyclic\n\t\tconst filteredFKs = Object.values(table.foreignKeys).filter((it) => {\n\t\t\treturn it.columnsFrom.length > 1 || isSelf(it);\n\t\t});\n\n\t\tif (\n\t\t\tObject.keys(table.indexes).length > 0\n\t\t\t|| filteredFKs.length > 0\n\t\t\t|| Object.keys(table.compositePrimaryKeys).length > 0\n\t\t\t|| Object.keys(table.uniqueConstraints).length > 0\n\t\t\t|| Object.keys(table.checkConstraint).length > 0\n\t\t) {\n\t\t\tstatement += ',\\n';\n\t\t\tstatement += '(table) => [';\n\t\t\tstatement += createTableIndexes(\n\t\t\t\ttable.name,\n\t\t\t\tObject.values(table.indexes),\n\t\t\t\twithCasing,\n\t\t\t);\n\t\t\tstatement += createTableFKs(Object.values(filteredFKs), withCasing);\n\t\t\tstatement += createTablePKs(\n\t\t\t\tObject.values(table.compositePrimaryKeys),\n\t\t\t\twithCasing,\n\t\t\t);\n\t\t\tstatement += createTableUniques(\n\t\t\t\tObject.values(table.uniqueConstraints),\n\t\t\t\twithCasing,\n\t\t\t);\n\t\t\tstatement += createTableChecks(\n\t\t\t\tObject.values(table.checkConstraint),\n\t\t\t\twithCasing,\n\t\t\t);\n\t\t\tstatement += '\\n]';\n\t\t}\n\n\t\tstatement += ');';\n\t\treturn statement;\n\t});\n\n\tconst viewsStatements = Object.values(schema.views).map((view) => {\n\t\tconst { columns, name, algorithm, definition, sqlSecurity, withCheckOption } = view;\n\t\tconst func = 'mysqlView';\n\t\tlet statement = '';\n\n\t\tif (imports.mysql.includes(withCasing(name))) {\n\t\t\tstatement = `// Table name is in conflict with ${\n\t\t\t\twithCasing(\n\t\t\t\t\tview.name,\n\t\t\t\t)\n\t\t\t} import.\\n// Please change to any other name, that is not in imports list\\n`;\n\t\t}\n\t\tstatement += `export const ${withCasing(name)} = ${func}(\"${name}\", {\\n`;\n\t\tstatement += createTableColumns(\n\t\t\tObject.values(columns),\n\t\t\t[],\n\t\t\twithCasing,\n\t\t\tcasing,\n\t\t\tname,\n\t\t\tschema,\n\t\t);\n\t\tstatement += '})';\n\n\t\tstatement += algorithm ? `.algorithm(\"${algorithm}\")` : '';\n\t\tstatement += sqlSecurity ? `.sqlSecurity(\"${sqlSecurity}\")` : '';\n\t\tstatement += withCheckOption ? `.withCheckOption(\"${withCheckOption}\")` : '';\n\t\tstatement += `.as(sql\\`${definition?.replaceAll('`', '\\\\`')}\\`);`;\n\n\t\treturn statement;\n\t});\n\n\tconst uniqueMySqlImports = [\n\t\t'mysqlTable',\n\t\t'mysqlSchema',\n\t\t'AnyMySqlColumn',\n\t\t...new Set(imports.mysql),\n\t];\n\tconst importsTs = `import { ${\n\t\tuniqueMySqlImports.join(\n\t\t\t', ',\n\t\t)\n\t} } from \"drizzle-orm/mysql-core\"\\nimport { sql } from \"drizzle-orm\"\\n\\n`;\n\n\tlet decalrations = '';\n\tdecalrations += tableStatements.join('\\n\\n');\n\tdecalrations += '\\n';\n\tdecalrations += viewsStatements.join('\\n\\n');\n\n\tconst file = importsTs + decalrations;\n\n\tconst schemaEntry = `\n    {\n      ${\n\t\tObject.values(schema.tables)\n\t\t\t.map((it) => withCasing(it.name))\n\t\t\t.join(',')\n\t}\n    }\n  `;\n\n\treturn {\n\t\tfile, // backward compatible, print to file\n\t\timports: importsTs,\n\t\tdecalrations,\n\t\tschemaEntry,\n\t};\n};\n\nconst isCyclic = (fk: ForeignKey) => {\n\tconst key = `${fk.tableFrom}-${fk.tableTo}`;\n\tconst reverse = `${fk.tableTo}-${fk.tableFrom}`;\n\treturn relations.has(key) && relations.has(reverse);\n};\n\nconst isSelf = (fk: ForeignKey) => {\n\treturn fk.tableFrom === fk.tableTo;\n};\n\nconst mapColumnDefault = (defaultValue: any, isExpression?: boolean) => {\n\tif (isExpression) {\n\t\treturn `sql\\`${defaultValue}\\``;\n\t}\n\n\treturn defaultValue;\n};\n\nconst mapColumnDefaultForJson = (defaultValue: any) => {\n\tif (\n\t\ttypeof defaultValue === 'string'\n\t\t&& defaultValue.startsWith(\"('\")\n\t\t&& defaultValue.endsWith(\"')\")\n\t) {\n\t\treturn defaultValue.substring(2, defaultValue.length - 2);\n\t}\n\n\treturn defaultValue;\n};\n\nconst column = (\n\ttype: string,\n\tname: string,\n\tcasing: (value: string) => string,\n\trawCasing: Casing,\n\tdefaultValue?: any,\n\tautoincrement?: boolean,\n\tonUpdate?: boolean,\n\tisExpression?: boolean,\n) => {\n\tlet lowered = type;\n\tif (!type.startsWith('enum(')) {\n\t\tlowered = type.toLowerCase();\n\t}\n\n\tif (lowered === 'serial') {\n\t\treturn `${casing(name)}: serial(${dbColumnName({ name, casing: rawCasing })})`;\n\t}\n\n\tif (lowered.startsWith('int')) {\n\t\tconst isUnsigned = lowered.startsWith('int unsigned');\n\t\tconst columnName = dbColumnName({ name, casing: rawCasing, withMode: isUnsigned });\n\t\tlet out = `${casing(name)}: int(${columnName}${isUnsigned ? '{ unsigned: true }' : ''})`;\n\t\tout += autoincrement ? `.autoincrement()` : '';\n\t\tout += typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('tinyint')) {\n\t\tconst isUnsigned = lowered.startsWith('tinyint unsigned');\n\t\tconst columnName = dbColumnName({ name, casing: rawCasing, withMode: isUnsigned });\n\t\t// let out = `${name.camelCase()}: tinyint(\"${name}\")`;\n\t\tlet out: string = `${casing(name)}: tinyint(${columnName}${isUnsigned ? '{ unsigned: true }' : ''})`;\n\t\tout += autoincrement ? `.autoincrement()` : '';\n\t\tout += typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('smallint')) {\n\t\tconst isUnsigned = lowered.startsWith('smallint unsigned');\n\t\tconst columnName = dbColumnName({ name, casing: rawCasing, withMode: isUnsigned });\n\t\tlet out = `${casing(name)}: smallint(${columnName}${isUnsigned ? '{ unsigned: true }' : ''})`;\n\t\tout += autoincrement ? `.autoincrement()` : '';\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('mediumint')) {\n\t\tconst isUnsigned = lowered.startsWith('mediumint unsigned');\n\t\tconst columnName = dbColumnName({ name, casing: rawCasing, withMode: isUnsigned });\n\t\tlet out = `${casing(name)}: mediumint(${columnName}${isUnsigned ? '{ unsigned: true }' : ''})`;\n\t\tout += autoincrement ? `.autoincrement()` : '';\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('bigint')) {\n\t\tconst isUnsigned = lowered.startsWith('bigint unsigned');\n\t\tlet out = `${casing(name)}: bigint(${dbColumnName({ name, casing: rawCasing, withMode: true })}{ mode: \"number\"${\n\t\t\tisUnsigned ? ', unsigned: true' : ''\n\t\t} })`;\n\t\tout += autoincrement ? `.autoincrement()` : '';\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered === 'boolean') {\n\t\tlet out = `${casing(name)}: boolean(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('double')) {\n\t\tlet params:\n\t\t\t| { precision?: string; scale?: string; unsigned?: boolean }\n\t\t\t| undefined;\n\n\t\tif (lowered.length > (lowered.includes('unsigned') ? 15 : 6)) {\n\t\t\tconst [precision, scale] = lowered\n\t\t\t\t.slice(7, lowered.length - (1 + (lowered.includes('unsigned') ? 9 : 0)))\n\t\t\t\t.split(',');\n\t\t\tparams = { precision, scale };\n\t\t}\n\n\t\tif (lowered.includes('unsigned')) {\n\t\t\tparams = { ...(params ?? {}), unsigned: true };\n\t\t}\n\n\t\tconst timeConfigParams = params ? timeConfig(params) : undefined;\n\n\t\tlet out = params\n\t\t\t? `${casing(name)}: double(${\n\t\t\t\tdbColumnName({ name, casing: rawCasing, withMode: timeConfigParams !== undefined })\n\t\t\t}${timeConfig(params)})`\n\t\t\t: `${casing(name)}: double(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\t// let out = `${name.camelCase()}: double(\"${name}\")`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('float')) {\n\t\tlet params:\n\t\t\t| { precision?: string; scale?: string; unsigned?: boolean }\n\t\t\t| undefined;\n\n\t\tif (lowered.length > (lowered.includes('unsigned') ? 14 : 5)) {\n\t\t\tconst [precision, scale] = lowered\n\t\t\t\t.slice(6, lowered.length - (1 + (lowered.includes('unsigned') ? 9 : 0)))\n\t\t\t\t.split(',');\n\t\t\tparams = { precision, scale };\n\t\t}\n\n\t\tif (lowered.includes('unsigned')) {\n\t\t\tparams = { ...(params ?? {}), unsigned: true };\n\t\t}\n\n\t\tlet out = `${casing(name)}: float(${dbColumnName({ name, casing: rawCasing })}${params ? timeConfig(params) : ''})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered === 'real') {\n\t\tlet out = `${casing(name)}: real(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('timestamp')) {\n\t\tconst keyLength = 'timestamp'.length + 1;\n\t\tlet fsp = lowered.length > keyLength\n\t\t\t? Number(lowered.substring(keyLength, lowered.length - 1))\n\t\t\t: null;\n\t\tfsp = fsp ? fsp : null;\n\n\t\tconst params = timeConfig({ fsp, mode: \"'string'\" });\n\n\t\tlet out = params\n\t\t\t? `${casing(name)}: timestamp(${\n\t\t\t\tdbColumnName({ name, casing: rawCasing, withMode: params !== undefined })\n\t\t\t}${params})`\n\t\t\t: `${casing(name)}: timestamp(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\t// mysql has only CURRENT_TIMESTAMP, as I found from docs. But will leave now() for just a case\n\t\tdefaultValue = defaultValue === 'now()' || defaultValue === '(CURRENT_TIMESTAMP)'\n\t\t\t? '.defaultNow()'\n\t\t\t: defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\n\t\tlet onUpdateNow = onUpdate ? '.onUpdateNow()' : '';\n\t\tout += onUpdateNow;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('time')) {\n\t\tconst keyLength = 'time'.length + 1;\n\t\tlet fsp = lowered.length > keyLength\n\t\t\t? Number(lowered.substring(keyLength, lowered.length - 1))\n\t\t\t: null;\n\t\tfsp = fsp ? fsp : null;\n\n\t\tconst params = timeConfig({ fsp });\n\n\t\tlet out = params\n\t\t\t? `${casing(name)}: time(${dbColumnName({ name, casing: rawCasing, withMode: params !== undefined })}${params})`\n\t\t\t: `${casing(name)}: time(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\tdefaultValue = defaultValue === 'now()'\n\t\t\t? '.defaultNow()'\n\t\t\t: defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\t\treturn out;\n\t}\n\n\tif (lowered === 'date') {\n\t\tlet out = `// you can use { mode: 'date' }, if you want to have Date as type for this column\\n\\t${\n\t\t\tcasing(\n\t\t\t\tname,\n\t\t\t)\n\t\t}: date(${dbColumnName({ name, casing: rawCasing, withMode: true })}{ mode: 'string' })`;\n\n\t\tdefaultValue = defaultValue === 'now()'\n\t\t\t? '.defaultNow()'\n\t\t\t: defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\t\treturn out;\n\t}\n\n\t// in mysql text can't have default value. Will leave it in case smth ;)\n\tif (lowered === 'text') {\n\t\tlet out = `${casing(name)}: text(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\t// in mysql text can't have default value. Will leave it in case smth ;)\n\tif (lowered === 'tinytext') {\n\t\tlet out = `${casing(name)}: tinytext(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\t// in mysql text can't have default value. Will leave it in case smth ;)\n\tif (lowered === 'mediumtext') {\n\t\tlet out = `${casing(name)}: mediumtext(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\t// in mysql text can't have default value. Will leave it in case smth ;)\n\tif (lowered === 'longtext') {\n\t\tlet out = `${casing(name)}: longtext(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered === 'year') {\n\t\tlet out = `${casing(name)}: year(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\t// in mysql json can't have default value. Will leave it in case smth ;)\n\tif (lowered === 'json') {\n\t\tlet out = `${casing(name)}: json(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefaultForJson(defaultValue)})`\n\t\t\t: '';\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('varchar')) {\n\t\tlet out: string = `${\n\t\t\tcasing(\n\t\t\t\tname,\n\t\t\t)\n\t\t}: varchar(${dbColumnName({ name, casing: rawCasing, withMode: true })}{ length: ${\n\t\t\tlowered.substring(\n\t\t\t\t'varchar'.length + 1,\n\t\t\t\tlowered.length - 1,\n\t\t\t)\n\t\t} })`;\n\n\t\tconst mappedDefaultValue = mapColumnDefault(defaultValue, isExpression);\n\t\tout += defaultValue\n\t\t\t? `.default(${isExpression ? mappedDefaultValue : unescapeSingleQuotes(mappedDefaultValue, true)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('char')) {\n\t\tlet out: string = `${\n\t\t\tcasing(\n\t\t\t\tname,\n\t\t\t)\n\t\t}: char(${dbColumnName({ name, casing: rawCasing, withMode: true })}{ length: ${\n\t\t\tlowered.substring(\n\t\t\t\t'char'.length + 1,\n\t\t\t\tlowered.length - 1,\n\t\t\t)\n\t\t} })`;\n\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('datetime')) {\n\t\tlet out = `// you can use { mode: 'date' }, if you want to have Date as type for this column\\n\\t`;\n\n\t\tconst fsp = lowered.startsWith('datetime(')\n\t\t\t? lowered.substring('datetime'.length + 1, lowered.length - 1)\n\t\t\t: undefined;\n\n\t\tout = fsp\n\t\t\t? `${\n\t\t\t\tcasing(\n\t\t\t\t\tname,\n\t\t\t\t)\n\t\t\t}: datetime(${dbColumnName({ name, casing: rawCasing, withMode: true })}{ mode: 'string', fsp: ${\n\t\t\t\tlowered.substring(\n\t\t\t\t\t'datetime'.length + 1,\n\t\t\t\t\tlowered.length - 1,\n\t\t\t\t)\n\t\t\t} })`\n\t\t\t: `${casing(name)}: datetime(${dbColumnName({ name, casing: rawCasing, withMode: true })}{ mode: 'string'})`;\n\n\t\tdefaultValue = defaultValue === 'now()'\n\t\t\t? '.defaultNow()'\n\t\t\t: defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('decimal')) {\n\t\tlet params:\n\t\t\t| { precision?: string; scale?: string; unsigned?: boolean }\n\t\t\t| undefined;\n\n\t\tif (lowered.length > (lowered.includes('unsigned') ? 16 : 7)) {\n\t\t\tconst [precision, scale] = lowered\n\t\t\t\t.slice(8, lowered.length - (1 + (lowered.includes('unsigned') ? 9 : 0)))\n\t\t\t\t.split(',');\n\t\t\tparams = { precision, scale };\n\t\t}\n\n\t\tif (lowered.includes('unsigned')) {\n\t\t\tparams = { ...(params ?? {}), unsigned: true };\n\t\t}\n\n\t\tconst timeConfigParams = params ? timeConfig(params) : undefined;\n\n\t\tlet out = params\n\t\t\t? `${casing(name)}: decimal(${\n\t\t\t\tdbColumnName({ name, casing: rawCasing, withMode: timeConfigParams !== undefined })\n\t\t\t}${timeConfigParams})`\n\t\t\t: `${casing(name)}: decimal(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\tdefaultValue = typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('binary')) {\n\t\tconst keyLength = 'binary'.length + 1;\n\t\tlet length = lowered.length > keyLength\n\t\t\t? Number(lowered.substring(keyLength, lowered.length - 1))\n\t\t\t: null;\n\t\tlength = length ? length : null;\n\n\t\tconst params = binaryConfig({ length });\n\n\t\tlet out = params\n\t\t\t? `${casing(name)}: binary(${dbColumnName({ name, casing: rawCasing, withMode: params !== undefined })}${params})`\n\t\t\t: `${casing(name)}: binary(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\tdefaultValue = defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('enum')) {\n\t\tconst values = lowered\n\t\t\t.substring('enum'.length + 1, lowered.length - 1)\n\t\t\t.split(',')\n\t\t\t.map((v) => unescapeSingleQuotes(v, true))\n\t\t\t.join(',');\n\t\tlet out = `${casing(name)}: mysqlEnum(${dbColumnName({ name, casing: rawCasing, withMode: true })}[${values}])`;\n\t\tconst mappedDefaultValue = mapColumnDefault(defaultValue, isExpression);\n\t\tout += defaultValue\n\t\t\t? `.default(${isExpression ? mappedDefaultValue : unescapeSingleQuotes(mappedDefaultValue, true)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('varbinary')) {\n\t\tconst keyLength = 'varbinary'.length + 1;\n\t\tlet length = lowered.length > keyLength\n\t\t\t? Number(lowered.substring(keyLength, lowered.length - 1))\n\t\t\t: null;\n\t\tlength = length ? length : null;\n\n\t\tconst params = binaryConfig({ length });\n\n\t\tlet out = params\n\t\t\t? `${casing(name)}: varbinary(${\n\t\t\t\tdbColumnName({ name, casing: rawCasing, withMode: params !== undefined })\n\t\t\t}${params})`\n\t\t\t: `${casing(name)}: varbinary(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\tdefaultValue = defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\t\treturn out;\n\t}\n\n\tconsole.log('uknown', type);\n\treturn `// Warning: Can't parse ${type} from database\\n\\t// ${type}Type: ${type}(\"${name}\")`;\n};\n\nconst createTableColumns = (\n\tcolumns: Column[],\n\tfks: ForeignKey[],\n\tcasing: (val: string) => string,\n\trawCasing: Casing,\n\ttableName: string,\n\tschema: MySqlSchemaInternal,\n): string => {\n\tlet statement = '';\n\n\t// no self refs and no cyclic\n\tconst oneColumnsFKs = Object.values(fks)\n\t\t.filter((it) => {\n\t\t\treturn !isSelf(it);\n\t\t})\n\t\t.filter((it) => it.columnsFrom.length === 1);\n\n\tconst fkByColumnName = oneColumnsFKs.reduce((res, it) => {\n\t\tconst arr = res[it.columnsFrom[0]] || [];\n\t\tarr.push(it);\n\t\tres[it.columnsFrom[0]] = arr;\n\t\treturn res;\n\t}, {} as Record<string, ForeignKey[]>);\n\n\tcolumns.forEach((it) => {\n\t\tstatement += '\\t';\n\t\tstatement += column(\n\t\t\tit.type,\n\t\t\tit.name,\n\t\t\tcasing,\n\t\t\trawCasing,\n\t\t\tit.default,\n\t\t\tit.autoincrement,\n\t\t\tit.onUpdate,\n\t\t\tschema.internal?.tables![tableName]?.columns[it.name]\n\t\t\t\t?.isDefaultAnExpression ?? false,\n\t\t);\n\t\tstatement += it.primaryKey ? '.primaryKey()' : '';\n\t\tstatement += it.notNull ? '.notNull()' : '';\n\n\t\tstatement += it.generated\n\t\t\t? `.generatedAlwaysAs(sql\\`${\n\t\t\t\tit.generated.as.replace(\n\t\t\t\t\t/`/g,\n\t\t\t\t\t'\\\\`',\n\t\t\t\t)\n\t\t\t}\\`, { mode: \"${it.generated.type}\" })`\n\t\t\t: '';\n\n\t\tconst fks = fkByColumnName[it.name];\n\t\tif (fks) {\n\t\t\tconst fksStatement = fks\n\t\t\t\t.map((it) => {\n\t\t\t\t\tconst onDelete = it.onDelete && it.onDelete !== 'no action' ? it.onDelete : null;\n\t\t\t\t\tconst onUpdate = it.onUpdate && it.onUpdate !== 'no action' ? it.onUpdate : null;\n\t\t\t\t\tconst params = { onDelete, onUpdate };\n\n\t\t\t\t\tconst typeSuffix = isCyclic(it) ? ': AnyMySqlColumn' : '';\n\n\t\t\t\t\tconst paramsStr = objToStatement2(params);\n\t\t\t\t\tif (paramsStr) {\n\t\t\t\t\t\treturn `.references(()${typeSuffix} => ${\n\t\t\t\t\t\t\tcasing(\n\t\t\t\t\t\t\t\tit.tableTo,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}.${casing(it.columnsTo[0])}, ${paramsStr} )`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `.references(()${typeSuffix} => ${casing(it.tableTo)}.${\n\t\t\t\t\t\tcasing(\n\t\t\t\t\t\t\tit.columnsTo[0],\n\t\t\t\t\t\t)\n\t\t\t\t\t})`;\n\t\t\t\t})\n\t\t\t\t.join('');\n\t\t\tstatement += fksStatement;\n\t\t}\n\n\t\tstatement += ',\\n';\n\t});\n\n\treturn statement;\n};\n\nconst createTableIndexes = (\n\ttableName: string,\n\tidxs: Index[],\n\tcasing: (value: string) => string,\n): string => {\n\tlet statement = '';\n\n\tidxs.forEach((it) => {\n\t\tlet idxKey = it.name.startsWith(tableName) && it.name !== tableName\n\t\t\t? it.name.slice(tableName.length + 1)\n\t\t\t: it.name;\n\t\tidxKey = idxKey.endsWith('_index')\n\t\t\t? idxKey.slice(0, -'_index'.length) + '_idx'\n\t\t\t: idxKey;\n\n\t\tidxKey = casing(idxKey);\n\n\t\tstatement += `\\n\\t`;\n\t\tstatement += it.isUnique ? 'uniqueIndex(' : 'index(';\n\t\tstatement += `\"${it.name}\")`;\n\t\tstatement += `.on(${\n\t\t\tit.columns\n\t\t\t\t.map((it) => `table.${casing(it)}`)\n\t\t\t\t.join(', ')\n\t\t}),`;\n\t});\n\n\treturn statement;\n};\n\nconst createTableUniques = (\n\tunqs: UniqueConstraint[],\n\tcasing: (value: string) => string,\n): string => {\n\tlet statement = '';\n\n\tunqs.forEach((it) => {\n\t\tconst idxKey = casing(it.name);\n\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'unique(';\n\t\tstatement += `\"${it.name}\")`;\n\t\tstatement += `.on(${\n\t\t\tit.columns\n\t\t\t\t.map((it) => `table.${casing(it)}`)\n\t\t\t\t.join(', ')\n\t\t}),`;\n\t});\n\n\treturn statement;\n};\n\nconst createTableChecks = (\n\tchecks: CheckConstraint[],\n\tcasing: (value: string) => string,\n): string => {\n\tlet statement = '';\n\n\tchecks.forEach((it) => {\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'check(';\n\t\tstatement += `\"${it.name}\", `;\n\t\tstatement += `sql\\`${it.value.replace(/`/g, '\\\\`')}\\`)`;\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n\nconst createTablePKs = (\n\tpks: PrimaryKey[],\n\tcasing: (value: string) => string,\n): string => {\n\tlet statement = '';\n\n\tpks.forEach((it) => {\n\t\tlet idxKey = casing(it.name);\n\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'primaryKey({ columns: [';\n\t\tstatement += `${\n\t\t\tit.columns\n\t\t\t\t.map((c) => {\n\t\t\t\t\treturn `table.${casing(c)}`;\n\t\t\t\t})\n\t\t\t\t.join(', ')\n\t\t}]${it.name ? `, name: \"${it.name}\"` : ''}}`;\n\t\tstatement += '),';\n\t});\n\n\treturn statement;\n};\n\nconst createTableFKs = (\n\tfks: ForeignKey[],\n\tcasing: (value: string) => string,\n): string => {\n\tlet statement = '';\n\n\tfks.forEach((it) => {\n\t\tconst isSelf = it.tableTo === it.tableFrom;\n\t\tconst tableTo = isSelf ? 'table' : `${casing(it.tableTo)}`;\n\t\tstatement += `\\n\\t`;\n\t\tstatement += `foreignKey({\\n`;\n\t\tstatement += `\\t\\t\\tcolumns: [${\n\t\t\tit.columnsFrom\n\t\t\t\t.map((i) => `table.${casing(i)}`)\n\t\t\t\t.join(', ')\n\t\t}],\\n`;\n\t\tstatement += `\\t\\t\\tforeignColumns: [${\n\t\t\tit.columnsTo\n\t\t\t\t.map((i) => `${tableTo}.${casing(i)}`)\n\t\t\t\t.join(', ')\n\t\t}],\\n`;\n\t\tstatement += `\\t\\t\\tname: \"${it.name}\"\\n`;\n\t\tstatement += `\\t\\t})`;\n\n\t\tstatement += it.onUpdate && it.onUpdate !== 'no action'\n\t\t\t? `.onUpdate(\"${it.onUpdate}\")`\n\t\t\t: '';\n\n\t\tstatement += it.onDelete && it.onDelete !== 'no action'\n\t\t\t? `.onDelete(\"${it.onDelete}\")`\n\t\t\t: '';\n\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n"
  },
  {
    "path": "drizzle-kit/src/introspect-pg.ts",
    "content": "import { getTableName, is } from 'drizzle-orm';\nimport { AnyPgTable } from 'drizzle-orm/pg-core';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\tMany,\n\tOne,\n\tRelation,\n\tRelations,\n} from 'drizzle-orm/relations';\nimport './@types/utils';\nimport { toCamelCase } from 'drizzle-orm/casing';\nimport { Casing } from './cli/validations/common';\nimport { assertUnreachable } from './global';\nimport {\n\tCheckConstraint,\n\tColumn,\n\tForeignKey,\n\tIndex,\n\tPgKitInternals,\n\tPgSchemaInternal,\n\tPolicy,\n\tPrimaryKey,\n\tUniqueConstraint,\n} from './serializer/pgSchema';\nimport { indexName } from './serializer/pgSerializer';\nimport { unescapeSingleQuotes } from './utils';\n\nconst pgImportsList = new Set([\n\t'pgTable',\n\t'pgEnum',\n\t'smallint',\n\t'integer',\n\t'bigint',\n\t'boolean',\n\t'text',\n\t'varchar',\n\t'char',\n\t'serial',\n\t'smallserial',\n\t'bigserial',\n\t'decimal',\n\t'numeric',\n\t'real',\n\t'json',\n\t'jsonb',\n\t'time',\n\t'timestamp',\n\t'date',\n\t'interval',\n\t'cidr',\n\t'inet',\n\t'macaddr',\n\t'macaddr8',\n\t'bigint',\n\t'doublePrecision',\n\t'uuid',\n\t'vector',\n\t'point',\n\t'line',\n\t'geometry',\n]);\n\nconst objToStatement2 = (json: { [s: string]: unknown }) => {\n\tjson = Object.fromEntries(Object.entries(json).filter((it) => it[1]));\n\n\tconst keys = Object.keys(json);\n\tif (keys.length === 0) return;\n\n\tlet statement = '{ ';\n\tstatement += keys.map((it) => `${it}: \"${json[it]}\"`).join(', '); // no \"\" for keys\n\tstatement += ' }';\n\treturn statement;\n};\n\nconst timeConfig = (json: { [s: string]: unknown }) => {\n\tjson = Object.fromEntries(Object.entries(json).filter((it) => it[1]));\n\n\tconst keys = Object.keys(json);\n\tif (keys.length === 0) return;\n\n\tlet statement = '{ ';\n\tstatement += keys.map((it) => `${it}: ${json[it]}`).join(', ');\n\tstatement += ' }';\n\treturn statement;\n};\n\nconst possibleIntervals = [\n\t'year',\n\t'month',\n\t'day',\n\t'hour',\n\t'minute',\n\t'second',\n\t'year to month',\n\t'day to hour',\n\t'day to minute',\n\t'day to second',\n\t'hour to minute',\n\t'hour to second',\n\t'minute to second',\n];\n\nconst intervalStrToObj = (str: string) => {\n\tif (str.startsWith('interval(')) {\n\t\treturn {\n\t\t\tprecision: Number(str.substring('interval('.length, str.length - 1)),\n\t\t};\n\t}\n\tconst splitted = str.split(' ');\n\tif (splitted.length === 1) {\n\t\treturn {};\n\t}\n\tconst rest = splitted.slice(1, splitted.length).join(' ');\n\tif (possibleIntervals.includes(rest)) {\n\t\treturn { fields: `\"${rest}\"` };\n\t}\n\n\tfor (const s of possibleIntervals) {\n\t\tif (rest.startsWith(`${s}(`)) {\n\t\t\treturn {\n\t\t\t\tfields: `\"${s}\"`,\n\t\t\t\tprecision: Number(rest.substring(s.length + 1, rest.length - 1)),\n\t\t\t};\n\t\t}\n\t}\n\treturn {};\n};\n\nconst intervalConfig = (str: string) => {\n\tconst json = intervalStrToObj(str);\n\t// json = Object.fromEntries(Object.entries(json).filter((it) => it[1]));\n\n\tconst keys = Object.keys(json);\n\tif (keys.length === 0) return;\n\n\tlet statement = '{ ';\n\tstatement += keys.map((it: keyof typeof json) => `${it}: ${json[it]}`).join(', ');\n\tstatement += ' }';\n\treturn statement;\n};\n\nconst mapColumnDefault = (defaultValue: any, isExpression?: boolean) => {\n\tif (isExpression) {\n\t\treturn `sql\\`${defaultValue}\\``;\n\t}\n\n\treturn defaultValue;\n};\n\nconst importsPatch = {\n\t'double precision': 'doublePrecision',\n\t'timestamp without time zone': 'timestamp',\n\t'timestamp with time zone': 'timestamp',\n\t'time without time zone': 'time',\n\t'time with time zone': 'time',\n} as Record<string, string>;\n\nconst relations = new Set<string>();\n\nconst escapeColumnKey = (value: string) => {\n\tif (/^(?![a-zA-Z_$][a-zA-Z0-9_$]*$).+$/.test(value)) {\n\t\treturn `\"${value}\"`;\n\t}\n\treturn value;\n};\n\nconst withCasing = (value: string, casing: Casing) => {\n\tif (casing === 'preserve') {\n\t\treturn escapeColumnKey(value);\n\t}\n\tif (casing === 'camel') {\n\t\treturn escapeColumnKey(value.camelCase());\n\t}\n\n\tassertUnreachable(casing);\n};\n\nconst dbColumnName = ({ name, casing, withMode = false }: { name: string; casing: Casing; withMode?: boolean }) => {\n\tif (casing === 'preserve') {\n\t\treturn '';\n\t}\n\tif (casing === 'camel') {\n\t\treturn toCamelCase(name) === name ? '' : withMode ? `\"${name}\", ` : `\"${name}\"`;\n\t}\n\n\tassertUnreachable(casing);\n};\n\nexport const relationsToTypeScriptForStudio = (\n\tschema: Record<string, Record<string, AnyPgTable<{}>>>,\n\trelations: Record<string, Relations<string, Record<string, Relation<string>>>>,\n) => {\n\tconst relationalSchema: Record<string, unknown> = {\n\t\t...Object.fromEntries(\n\t\t\tObject.entries(schema)\n\t\t\t\t.map(([key, val]) => {\n\t\t\t\t\t// have unique keys across schemas\n\t\t\t\t\tconst mappedTableEntries = Object.entries(val).map((tableEntry) => {\n\t\t\t\t\t\treturn [`__${key}__.${tableEntry[0]}`, tableEntry[1]];\n\t\t\t\t\t});\n\n\t\t\t\t\treturn mappedTableEntries;\n\t\t\t\t})\n\t\t\t\t.flat(),\n\t\t),\n\t\t...relations,\n\t};\n\n\tconst relationsConfig = extractTablesRelationalConfig(relationalSchema, createTableRelationsHelpers);\n\n\tlet result = '';\n\n\tfunction findColumnKey(table: AnyPgTable, columnName: string) {\n\t\tfor (const tableEntry of Object.entries(table)) {\n\t\t\tconst key = tableEntry[0];\n\t\t\tconst value = tableEntry[1];\n\n\t\t\tif (value.name === columnName) {\n\t\t\t\treturn key;\n\t\t\t}\n\t\t}\n\t}\n\n\tObject.values(relationsConfig.tables).forEach((table) => {\n\t\tconst tableName = table.tsName.split('.')[1];\n\t\tconst relations = table.relations;\n\t\tlet hasRelations = false;\n\t\tlet relationsObjAsStr = '';\n\t\tlet hasOne = false;\n\t\tlet hasMany = false;\n\n\t\tObject.values(relations).forEach((relation) => {\n\t\t\thasRelations = true;\n\n\t\t\tif (is(relation, Many)) {\n\t\t\t\thasMany = true;\n\t\t\t\trelationsObjAsStr += `\\t\\t${relation.fieldName}: many(${\n\t\t\t\t\trelationsConfig.tableNamesMap[relation.referencedTableName].split('.')[1]\n\t\t\t\t}${typeof relation.relationName !== 'undefined' ? `, { relationName: \"${relation.relationName}\"}` : ''}),`;\n\t\t\t}\n\n\t\t\tif (is(relation, One)) {\n\t\t\t\thasOne = true;\n\t\t\t\trelationsObjAsStr += `\\t\\t${relation.fieldName}: one(${\n\t\t\t\t\trelationsConfig.tableNamesMap[relation.referencedTableName].split('.')[1]\n\t\t\t\t}, { fields: [${\n\t\t\t\t\trelation.config?.fields.map(\n\t\t\t\t\t\t(c) =>\n\t\t\t\t\t\t\t`${relationsConfig.tableNamesMap[getTableName(relation.sourceTable)].split('.')[1]}.${\n\t\t\t\t\t\t\t\tfindColumnKey(relation.sourceTable, c.name)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t)\n\t\t\t\t}], references: [${\n\t\t\t\t\trelation.config?.references.map(\n\t\t\t\t\t\t(c) =>\n\t\t\t\t\t\t\t`${relationsConfig.tableNamesMap[getTableName(relation.referencedTable)].split('.')[1]}.${\n\t\t\t\t\t\t\t\tfindColumnKey(relation.referencedTable, c.name)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t)\n\t\t\t\t}]${typeof relation.relationName !== 'undefined' ? `, relationName: \"${relation.relationName}\"` : ''}}),`;\n\t\t\t}\n\t\t});\n\n\t\tif (hasRelations) {\n\t\t\tresult += `export const ${tableName}Relation = relations(${tableName}, ({${hasOne ? 'one' : ''}${\n\t\t\t\thasOne && hasMany ? ', ' : ''\n\t\t\t}${hasMany ? 'many' : ''}}) => ({\n        ${relationsObjAsStr}\n      }));\\n`;\n\t\t}\n\t});\n\n\treturn result;\n};\n\nfunction generateIdentityParams(identity: Column['identity']) {\n\tlet paramsObj = `{ name: \"${identity!.name}\"`;\n\tif (identity?.startWith) {\n\t\tparamsObj += `, startWith: ${identity.startWith}`;\n\t}\n\tif (identity?.increment) {\n\t\tparamsObj += `, increment: ${identity.increment}`;\n\t}\n\tif (identity?.minValue) {\n\t\tparamsObj += `, minValue: ${identity.minValue}`;\n\t}\n\tif (identity?.maxValue) {\n\t\tparamsObj += `, maxValue: ${identity.maxValue}`;\n\t}\n\tif (identity?.cache) {\n\t\tparamsObj += `, cache: ${identity.cache}`;\n\t}\n\tif (identity?.cycle) {\n\t\tparamsObj += `, cycle: true`;\n\t}\n\tparamsObj += ' }';\n\tif (identity?.type === 'always') {\n\t\treturn `.generatedAlwaysAsIdentity(${paramsObj})`;\n\t}\n\treturn `.generatedByDefaultAsIdentity(${paramsObj})`;\n}\n\nexport const paramNameFor = (name: string, schema?: string) => {\n\tconst schemaSuffix = schema && schema !== 'public' ? `In${schema.capitalise()}` : '';\n\treturn `${name}${schemaSuffix}`;\n};\n\nexport const schemaToTypeScript = (schema: PgSchemaInternal, casing: Casing) => {\n\t// collectFKs\n\tObject.values(schema.tables).forEach((table) => {\n\t\tObject.values(table.foreignKeys).forEach((fk) => {\n\t\t\tconst relation = `${fk.tableFrom}-${fk.tableTo}`;\n\t\t\trelations.add(relation);\n\t\t});\n\t});\n\n\tconst schemas = Object.fromEntries(\n\t\tObject.entries(schema.schemas).map((it) => {\n\t\t\treturn [it[0], withCasing(it[1], casing)];\n\t\t}),\n\t);\n\n\tconst enumTypes = Object.values(schema.enums).reduce((acc, cur) => {\n\t\tacc.add(`${cur.schema}.${cur.name}`);\n\t\treturn acc;\n\t}, new Set<string>());\n\n\tconst imports = Object.values(schema.tables).reduce(\n\t\t(res, it) => {\n\t\t\tconst idxImports = Object.values(it.indexes).map((idx) => (idx.isUnique ? 'uniqueIndex' : 'index'));\n\t\t\tconst fkImpots = Object.values(it.foreignKeys).map((it) => 'foreignKey');\n\t\t\tif (Object.values(it.foreignKeys).some((it) => isCyclic(it) && !isSelf(it))) {\n\t\t\t\tres.pg.push('type AnyPgColumn');\n\t\t\t}\n\t\t\tconst pkImports = Object.values(it.compositePrimaryKeys).map((it) => 'primaryKey');\n\t\t\tconst uniqueImports = Object.values(it.uniqueConstraints).map((it) => 'unique');\n\n\t\t\tconst checkImports = Object.values(it.checkConstraints).map(\n\t\t\t\t(it) => 'check',\n\t\t\t);\n\n\t\t\tconst policiesImports = Object.values(it.policies).map(\n\t\t\t\t(it) => 'pgPolicy',\n\t\t\t);\n\n\t\t\tif (it.schema && it.schema !== 'public' && it.schema !== '') {\n\t\t\t\tres.pg.push('pgSchema');\n\t\t\t}\n\n\t\t\tres.pg.push(...idxImports);\n\t\t\tres.pg.push(...fkImpots);\n\t\t\tres.pg.push(...pkImports);\n\t\t\tres.pg.push(...uniqueImports);\n\t\t\tres.pg.push(...policiesImports);\n\t\t\tres.pg.push(...checkImports);\n\n\t\t\tconst columnImports = Object.values(it.columns)\n\t\t\t\t.map((col) => {\n\t\t\t\t\tlet patched: string = (importsPatch[col.type] || col.type).replace('[]', '');\n\t\t\t\t\tpatched = patched === 'double precision' ? 'doublePrecision' : patched;\n\t\t\t\t\tpatched = patched.startsWith('varchar(') ? 'varchar' : patched;\n\t\t\t\t\tpatched = patched.startsWith('char(') ? 'char' : patched;\n\t\t\t\t\tpatched = patched.startsWith('numeric(') ? 'numeric' : patched;\n\t\t\t\t\tpatched = patched.startsWith('time(') ? 'time' : patched;\n\t\t\t\t\tpatched = patched.startsWith('timestamp(') ? 'timestamp' : patched;\n\t\t\t\t\tpatched = patched.startsWith('vector(') ? 'vector' : patched;\n\t\t\t\t\tpatched = patched.startsWith('geometry(') ? 'geometry' : patched;\n\t\t\t\t\treturn patched;\n\t\t\t\t})\n\t\t\t\t.filter((type) => {\n\t\t\t\t\treturn pgImportsList.has(type);\n\t\t\t\t});\n\n\t\t\tres.pg.push(...columnImports);\n\t\t\treturn res;\n\t\t},\n\t\t{ pg: [] as string[] },\n\t);\n\n\tObject.values(schema.views).forEach((it) => {\n\t\tif (it.schema && it.schema !== 'public' && it.schema !== '') {\n\t\t\timports.pg.push('pgSchema');\n\t\t} else if (it.schema === 'public') {\n\t\t\tit.materialized ? imports.pg.push('pgMaterializedView') : imports.pg.push('pgView');\n\t\t}\n\n\t\tObject.values(it.columns).forEach(() => {\n\t\t\tconst columnImports = Object.values(it.columns)\n\t\t\t\t.map((col) => {\n\t\t\t\t\tlet patched: string = (importsPatch[col.type] || col.type).replace('[]', '');\n\t\t\t\t\tpatched = patched === 'double precision' ? 'doublePrecision' : patched;\n\t\t\t\t\tpatched = patched.startsWith('varchar(') ? 'varchar' : patched;\n\t\t\t\t\tpatched = patched.startsWith('char(') ? 'char' : patched;\n\t\t\t\t\tpatched = patched.startsWith('numeric(') ? 'numeric' : patched;\n\t\t\t\t\tpatched = patched.startsWith('time(') ? 'time' : patched;\n\t\t\t\t\tpatched = patched.startsWith('timestamp(') ? 'timestamp' : patched;\n\t\t\t\t\tpatched = patched.startsWith('vector(') ? 'vector' : patched;\n\t\t\t\t\tpatched = patched.startsWith('geometry(') ? 'geometry' : patched;\n\t\t\t\t\treturn patched;\n\t\t\t\t})\n\t\t\t\t.filter((type) => {\n\t\t\t\t\treturn pgImportsList.has(type);\n\t\t\t\t});\n\n\t\t\timports.pg.push(...columnImports);\n\t\t});\n\t});\n\n\tObject.values(schema.sequences).forEach((it) => {\n\t\tif (it.schema && it.schema !== 'public' && it.schema !== '') {\n\t\t\timports.pg.push('pgSchema');\n\t\t} else if (it.schema === 'public') {\n\t\t\timports.pg.push('pgSequence');\n\t\t}\n\t});\n\n\tObject.values(schema.enums).forEach((it) => {\n\t\tif (it.schema && it.schema !== 'public' && it.schema !== '') {\n\t\t\timports.pg.push('pgSchema');\n\t\t} else if (it.schema === 'public') {\n\t\t\timports.pg.push('pgEnum');\n\t\t}\n\t});\n\n\tif (Object.keys(schema.roles).length > 0) {\n\t\timports.pg.push('pgRole');\n\t}\n\n\tconst enumStatements = Object.values(schema.enums)\n\t\t.map((it) => {\n\t\t\tconst enumSchema = schemas[it.schema];\n\t\t\t// const func = schema || schema === \"public\" ? \"pgTable\" : schema;\n\t\t\tconst paramName = paramNameFor(it.name, enumSchema);\n\n\t\t\tconst func = enumSchema ? `${enumSchema}.enum` : 'pgEnum';\n\n\t\t\tconst values = Object.values(it.values)\n\t\t\t\t.map((it) => `'${unescapeSingleQuotes(it, false)}'`)\n\t\t\t\t.join(', ');\n\t\t\treturn `export const ${withCasing(paramName, casing)} = ${func}(\"${it.name}\", [${values}])\\n`;\n\t\t})\n\t\t.join('')\n\t\t.concat('\\n');\n\n\tconst sequencesStatements = Object.values(schema.sequences)\n\t\t.map((it) => {\n\t\t\tconst seqSchema = schemas[it.schema];\n\t\t\tconst paramName = paramNameFor(it.name, seqSchema);\n\n\t\t\tconst func = seqSchema ? `${seqSchema}.sequence` : 'pgSequence';\n\n\t\t\tlet params = '';\n\n\t\t\tif (it.startWith) {\n\t\t\t\tparams += `, startWith: \"${it.startWith}\"`;\n\t\t\t}\n\t\t\tif (it.increment) {\n\t\t\t\tparams += `, increment: \"${it.increment}\"`;\n\t\t\t}\n\t\t\tif (it.minValue) {\n\t\t\t\tparams += `, minValue: \"${it.minValue}\"`;\n\t\t\t}\n\t\t\tif (it.maxValue) {\n\t\t\t\tparams += `, maxValue: \"${it.maxValue}\"`;\n\t\t\t}\n\t\t\tif (it.cache) {\n\t\t\t\tparams += `, cache: \"${it.cache}\"`;\n\t\t\t}\n\t\t\tif (it.cycle) {\n\t\t\t\tparams += `, cycle: true`;\n\t\t\t} else {\n\t\t\t\tparams += `, cycle: false`;\n\t\t\t}\n\n\t\t\treturn `export const ${withCasing(paramName, casing)} = ${func}(\"${it.name}\"${\n\t\t\t\tparams ? `, { ${params.trimChar(',')} }` : ''\n\t\t\t})\\n`;\n\t\t})\n\t\t.join('')\n\t\t.concat('');\n\n\tconst schemaStatements = Object.entries(schemas)\n\t\t// .filter((it) => it[0] !== \"public\")\n\t\t.map((it) => {\n\t\t\treturn `export const ${it[1]} = pgSchema(\"${it[0]}\");\\n`;\n\t\t})\n\t\t.join('');\n\n\tconst rolesNameToTsKey: Record<string, string> = {};\n\n\tconst rolesStatements = Object.entries(schema.roles)\n\t\t.map((it) => {\n\t\t\tconst fields = it[1];\n\t\t\trolesNameToTsKey[fields.name] = it[0];\n\t\t\treturn `export const ${withCasing(it[0], casing)} = pgRole(\"${fields.name}\", ${\n\t\t\t\t!fields.createDb && !fields.createRole && fields.inherit\n\t\t\t\t\t? ''\n\t\t\t\t\t: `${\n\t\t\t\t\t\t`, { ${fields.createDb ? `createDb: true,` : ''}${fields.createRole ? ` createRole: true,` : ''}${\n\t\t\t\t\t\t\t!fields.inherit ? ` inherit: false ` : ''\n\t\t\t\t\t\t}`.trimChar(',')\n\t\t\t\t\t}}`\n\t\t\t} );\\n`;\n\t\t})\n\t\t.join('');\n\n\tconst tableStatements = Object.values(schema.tables).map((table) => {\n\t\tconst tableSchema = schemas[table.schema];\n\t\tconst paramName = paramNameFor(table.name, tableSchema);\n\n\t\tconst func = tableSchema ? `${tableSchema}.table` : 'pgTable';\n\t\tlet statement = `export const ${withCasing(paramName, casing)} = ${func}(\"${table.name}\", {\\n`;\n\t\tstatement += createTableColumns(\n\t\t\ttable.name,\n\t\t\tObject.values(table.columns),\n\t\t\tObject.values(table.foreignKeys),\n\t\t\tenumTypes,\n\t\t\tschemas,\n\t\t\tcasing,\n\t\t\tschema.internal,\n\t\t);\n\t\tstatement += '}';\n\n\t\t// more than 2 fields or self reference or cyclic\n\t\t// Andrii: I switched this one off until we will get custom names in .references()\n\t\t// const filteredFKs = Object.values(table.foreignKeys).filter((it) => {\n\t\t// \treturn it.columnsFrom.length > 1 || isSelf(it);\n\t\t// });\n\n\t\tif (\n\t\t\tObject.keys(table.indexes).length > 0\n\t\t\t|| Object.values(table.foreignKeys).length > 0\n\t\t\t|| Object.values(table.policies).length > 0\n\t\t\t|| Object.keys(table.compositePrimaryKeys).length > 0\n\t\t\t|| Object.keys(table.uniqueConstraints).length > 0\n\t\t\t|| Object.keys(table.checkConstraints).length > 0\n\t\t) {\n\t\t\tstatement += ', ';\n\t\t\tstatement += '(table) => [';\n\t\t\tstatement += createTableIndexes(table.name, Object.values(table.indexes), casing);\n\t\t\tstatement += createTableFKs(Object.values(table.foreignKeys), schemas, casing);\n\t\t\tstatement += createTablePKs(\n\t\t\t\tObject.values(table.compositePrimaryKeys),\n\t\t\t\tcasing,\n\t\t\t);\n\t\t\tstatement += createTableUniques(\n\t\t\t\tObject.values(table.uniqueConstraints),\n\t\t\t\tcasing,\n\t\t\t);\n\t\t\tstatement += createTablePolicies(\n\t\t\t\tObject.values(table.policies),\n\t\t\t\tcasing,\n\t\t\t\trolesNameToTsKey,\n\t\t\t);\n\t\t\tstatement += createTableChecks(\n\t\t\t\tObject.values(table.checkConstraints),\n\t\t\t\tcasing,\n\t\t\t);\n\t\t\tstatement += '\\n]';\n\t\t}\n\n\t\tstatement += ');';\n\t\treturn statement;\n\t});\n\n\tconst viewsStatements = Object.values(schema.views)\n\t\t.map((it) => {\n\t\t\tconst viewSchema = schemas[it.schema];\n\n\t\t\tconst paramName = paramNameFor(it.name, viewSchema);\n\n\t\t\tconst func = viewSchema\n\t\t\t\t? (it.materialized ? `${viewSchema}.materializedView` : `${viewSchema}.view`)\n\t\t\t\t: it.materialized\n\t\t\t\t? 'pgMaterializedView'\n\t\t\t\t: 'pgView';\n\n\t\t\tconst withOption = it.with ?? '';\n\n\t\t\tconst as = `sql\\`${it.definition}\\``;\n\n\t\t\tconst tablespace = it.tablespace ?? '';\n\n\t\t\tconst columns = createTableColumns(\n\t\t\t\t'',\n\t\t\t\tObject.values(it.columns),\n\t\t\t\t[],\n\t\t\t\tenumTypes,\n\t\t\t\tschemas,\n\t\t\t\tcasing,\n\t\t\t\tschema.internal,\n\t\t\t);\n\n\t\t\tlet statement = `export const ${withCasing(paramName, casing)} = ${func}(\"${it.name}\", {${columns}})`;\n\t\t\tstatement += tablespace ? `.tablespace(\"${tablespace}\")` : '';\n\t\t\tstatement += withOption ? `.with(${JSON.stringify(withOption)})` : '';\n\t\t\tstatement += `.as(${as});`;\n\n\t\t\treturn statement;\n\t\t})\n\t\t.join('\\n\\n');\n\n\tconst uniquePgImports = ['pgTable', ...new Set(imports.pg)];\n\n\tconst importsTs = `import { ${\n\t\tuniquePgImports.join(\n\t\t\t', ',\n\t\t)\n\t} } from \"drizzle-orm/pg-core\"\nimport { sql } from \"drizzle-orm\"\\n\\n`;\n\n\tlet decalrations = schemaStatements;\n\tdecalrations += rolesStatements;\n\tdecalrations += enumStatements;\n\tdecalrations += sequencesStatements;\n\tdecalrations += '\\n';\n\tdecalrations += tableStatements.join('\\n\\n');\n\tdecalrations += '\\n';\n\tdecalrations += viewsStatements;\n\n\tconst file = importsTs + decalrations;\n\n\t// for drizzle studio query runner\n\tconst schemaEntry = `\n    {\n      ${\n\t\tObject.values(schema.tables)\n\t\t\t.map((it) => withCasing(it.name, casing))\n\t\t\t.join(',\\n')\n\t}\n    }\n  `;\n\n\treturn { file, imports: importsTs, decalrations, schemaEntry };\n};\n\nconst isCyclic = (fk: ForeignKey) => {\n\tconst key = `${fk.tableFrom}-${fk.tableTo}`;\n\tconst reverse = `${fk.tableTo}-${fk.tableFrom}`;\n\treturn relations.has(key) && relations.has(reverse);\n};\n\nconst isSelf = (fk: ForeignKey) => {\n\treturn fk.tableFrom === fk.tableTo;\n};\n\nconst buildArrayDefault = (defaultValue: string, typeName: string): string => {\n\tif (typeof defaultValue === 'string' && !(defaultValue.startsWith('{') || defaultValue.startsWith(\"'{\"))) {\n\t\treturn `sql\\`${defaultValue}\\``;\n\t}\n\tdefaultValue = defaultValue.substring(2, defaultValue.length - 2);\n\treturn `[${\n\t\tdefaultValue\n\t\t\t.split(/\\s*,\\s*/g)\n\t\t\t.map((value) => {\n\t\t\t\t// \tif (['integer', 'smallint', 'bigint', 'double precision', 'real'].includes(typeName)) {\n\t\t\t\t// \t\treturn value;\n\t\t\t\t// \t} else if (typeName === 'interval') {\n\t\t\t\t// \t\treturn value.replaceAll('\"', \"'\");\n\t\t\t\t// \t} else if (typeName === 'boolean') {\n\t\t\t\t// \t\treturn value === 't' ? 'true' : 'false';\n\t\t\t\tif (typeName === 'json' || typeName === 'jsonb') {\n\t\t\t\t\treturn value.substring(1, value.length - 1).replaceAll('\\\\', '');\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t\t// \t}\n\t\t\t})\n\t\t\t.join(', ')\n\t}]`;\n};\n\nconst mapDefault = (\n\ttableName: string,\n\ttype: string,\n\tname: string,\n\tenumTypes: Set<string>,\n\ttypeSchema: string,\n\tdefaultValue?: any,\n\tinternals?: PgKitInternals,\n) => {\n\tconst isExpression = internals?.tables[tableName]?.columns[name]?.isDefaultAnExpression ?? false;\n\tconst isArray = internals?.tables[tableName]?.columns[name]?.isArray ?? false;\n\tconst lowered = type.toLowerCase().replace('[]', '');\n\n\tif (isArray) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${buildArrayDefault(defaultValue, lowered)})` : '';\n\t}\n\n\tif (enumTypes.has(`${typeSchema}.${type.replace('[]', '')}`)) {\n\t\treturn typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(unescapeSingleQuotes(defaultValue, true), isExpression)})`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('integer')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('smallint')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('bigint')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('boolean')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('double precision')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('real')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('uuid')) {\n\t\treturn defaultValue === 'gen_random_uuid()'\n\t\t\t? '.defaultRandom()'\n\t\t\t: defaultValue\n\t\t\t? `.default(sql\\`${defaultValue}\\`)`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('numeric')) {\n\t\tdefaultValue = defaultValue\n\t\t\t? (defaultValue.startsWith(`'`) && defaultValue.endsWith(`'`)\n\t\t\t\t? defaultValue.substring(1, defaultValue.length - 1)\n\t\t\t\t: defaultValue)\n\t\t\t: undefined;\n\t\treturn defaultValue ? `.default('${mapColumnDefault(defaultValue, isExpression)}')` : '';\n\t}\n\n\tif (lowered.startsWith('timestamp')) {\n\t\treturn defaultValue === 'now()'\n\t\t\t? '.defaultNow()'\n\t\t\t: /^'\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}(\\.\\d+)?([+-]\\d{2}(:\\d{2})?)?'$/.test(defaultValue) // Matches 'YYYY-MM-DD HH:MI:SS', 'YYYY-MM-DD HH:MI:SS.FFFFFF', 'YYYY-MM-DD HH:MI:SS+TZ', 'YYYY-MM-DD HH:MI:SS.FFFFFF+TZ' and 'YYYY-MM-DD HH:MI:SS+HH:MI'\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: defaultValue\n\t\t\t? `.default(sql\\`${defaultValue}\\`)`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('time')) {\n\t\treturn defaultValue === 'now()'\n\t\t\t? '.defaultNow()'\n\t\t\t: /^'\\d{2}:\\d{2}(:\\d{2})?(\\.\\d+)?'$/.test(defaultValue) // Matches 'HH:MI', 'HH:MI:SS' and 'HH:MI:SS.FFFFFF'\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: defaultValue\n\t\t\t? `.default(sql\\`${defaultValue}\\`)`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('interval')) {\n\t\treturn defaultValue ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered === 'date') {\n\t\treturn defaultValue === 'now()'\n\t\t\t? '.defaultNow()'\n\t\t\t: /^'\\d{4}-\\d{2}-\\d{2}'$/.test(defaultValue) // Matches 'YYYY-MM-DD'\n\t\t\t? `.default(${defaultValue})`\n\t\t\t: defaultValue\n\t\t\t? `.default(sql\\`${defaultValue}\\`)`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('text')) {\n\t\treturn typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(unescapeSingleQuotes(defaultValue, true), isExpression)})`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('jsonb')) {\n\t\tconst def = typeof defaultValue !== 'undefined'\n\t\t\t? defaultValue.replace(/::(.*?)(?<![^\\w\"])(?=$)/, '').slice(1, -1)\n\t\t\t: null;\n\n\t\treturn defaultValue ? `.default(${def})` : '';\n\t}\n\n\tif (lowered.startsWith('json')) {\n\t\tconst def = defaultValue ? defaultValue.replace(/::(.*?)(?<![^\\w\"])(?=$)/, '').slice(1, -1) : null;\n\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${def})` : '';\n\t}\n\n\tif (lowered.startsWith('inet')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('cidr')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('macaddr8')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('macaddr')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('varchar')) {\n\t\treturn typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(unescapeSingleQuotes(defaultValue, true), isExpression)})`\n\t\t\t: '';\n\t}\n\n\tif (lowered.startsWith('point')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('line')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('geometry')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('vector')) {\n\t\treturn typeof defaultValue !== 'undefined' ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t}\n\n\tif (lowered.startsWith('char')) {\n\t\treturn typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(unescapeSingleQuotes(defaultValue, true), isExpression)})`\n\t\t\t: '';\n\t}\n\n\treturn '';\n};\n\nconst column = (\n\ttableName: string,\n\ttype: string,\n\tname: string,\n\tenumTypes: Set<string>,\n\ttypeSchema: string,\n\tcasing: Casing,\n\tdefaultValue?: any,\n\tinternals?: PgKitInternals,\n) => {\n\tconst isExpression = internals?.tables[tableName]?.columns[name]?.isDefaultAnExpression ?? false;\n\tconst lowered = type.toLowerCase().replace('[]', '');\n\n\tif (enumTypes.has(`${typeSchema}.${type.replace('[]', '')}`)) {\n\t\tlet out = `${withCasing(name, casing)}: ${withCasing(paramNameFor(type.replace('[]', ''), typeSchema), casing)}(${\n\t\t\tdbColumnName({ name, casing })\n\t\t})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('serial')) {\n\t\treturn `${withCasing(name, casing)}: serial(${dbColumnName({ name, casing })})`;\n\t}\n\n\tif (lowered.startsWith('smallserial')) {\n\t\treturn `${withCasing(name, casing)}: smallserial(${dbColumnName({ name, casing })})`;\n\t}\n\n\tif (lowered.startsWith('bigserial')) {\n\t\treturn `${withCasing(name, casing)}: bigserial(${\n\t\t\tdbColumnName({ name, casing, withMode: true })\n\t\t}{ mode: \"bigint\" })`;\n\t}\n\n\tif (lowered.startsWith('integer')) {\n\t\tlet out = `${withCasing(name, casing)}: integer(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('smallint')) {\n\t\tlet out = `${withCasing(name, casing)}: smallint(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('bigint')) {\n\t\tlet out = `// You can use { mode: \"bigint\" } if numbers are exceeding js number limitations\\n\\t`;\n\t\tout += `${withCasing(name, casing)}: bigint(${dbColumnName({ name, casing, withMode: true })}{ mode: \"number\" })`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('boolean')) {\n\t\tlet out = `${withCasing(name, casing)}: boolean(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('double precision')) {\n\t\tlet out = `${withCasing(name, casing)}: doublePrecision(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('real')) {\n\t\tlet out = `${withCasing(name, casing)}: real(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('uuid')) {\n\t\tlet out = `${withCasing(name, casing)}: uuid(${dbColumnName({ name, casing })})`;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('numeric')) {\n\t\tlet params: { precision: string | undefined; scale: string | undefined } | undefined;\n\n\t\tif (lowered.length > 7) {\n\t\t\tconst [precision, scale] = lowered.slice(8, lowered.length - 1).split(',');\n\t\t\tparams = { precision, scale };\n\t\t}\n\n\t\tlet out = params\n\t\t\t? `${withCasing(name, casing)}: numeric(${dbColumnName({ name, casing, withMode: true })}${timeConfig(params)})`\n\t\t\t: `${withCasing(name, casing)}: numeric(${dbColumnName({ name, casing })})`;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('timestamp')) {\n\t\tconst withTimezone = lowered.includes('with time zone');\n\t\t// const split = lowered.split(\" \");\n\t\tlet precision = lowered.startsWith('timestamp(')\n\t\t\t? Number(lowered.split(' ')[0].substring('timestamp('.length, lowered.split(' ')[0].length - 1))\n\t\t\t: null;\n\t\tprecision = precision ? precision : null;\n\n\t\tconst params = timeConfig({\n\t\t\tprecision,\n\t\t\twithTimezone,\n\t\t\tmode: \"'string'\",\n\t\t});\n\n\t\tlet out = params\n\t\t\t? `${withCasing(name, casing)}: timestamp(${dbColumnName({ name, casing, withMode: true })}${params})`\n\t\t\t: `${withCasing(name, casing)}: timestamp(${dbColumnName({ name, casing })})`;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('time')) {\n\t\tconst withTimezone = lowered.includes('with time zone');\n\n\t\tlet precision = lowered.startsWith('time(')\n\t\t\t? Number(lowered.split(' ')[0].substring('time('.length, lowered.split(' ')[0].length - 1))\n\t\t\t: null;\n\t\tprecision = precision ? precision : null;\n\n\t\tconst params = timeConfig({ precision, withTimezone });\n\n\t\tlet out = params\n\t\t\t? `${withCasing(name, casing)}: time(${dbColumnName({ name, casing, withMode: true })}${params})`\n\t\t\t: `${withCasing(name, casing)}: time(${dbColumnName({ name, casing })})`;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('interval')) {\n\t\t// const withTimezone = lowered.includes(\"with time zone\");\n\t\t// const split = lowered.split(\" \");\n\t\t// let precision = split.length >= 2 ? Number(split[1].substring(1, 2)) : null;\n\t\t// precision = precision ? precision : null;\n\n\t\tconst params = intervalConfig(lowered);\n\n\t\tlet out = params\n\t\t\t? `${withCasing(name, casing)}: interval(${dbColumnName({ name, casing, withMode: true })}${params})`\n\t\t\t: `${withCasing(name, casing)}: interval(${dbColumnName({ name, casing })})`;\n\n\t\treturn out;\n\t}\n\n\tif (lowered === 'date') {\n\t\tlet out = `${withCasing(name, casing)}: date(${dbColumnName({ name, casing })})`;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('text')) {\n\t\tlet out = `${withCasing(name, casing)}: text(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('jsonb')) {\n\t\tlet out = `${withCasing(name, casing)}: jsonb(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('json')) {\n\t\tlet out = `${withCasing(name, casing)}: json(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('inet')) {\n\t\tlet out = `${withCasing(name, casing)}: inet(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('cidr')) {\n\t\tlet out = `${withCasing(name, casing)}: cidr(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('macaddr8')) {\n\t\tlet out = `${withCasing(name, casing)}: macaddr8(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('macaddr')) {\n\t\tlet out = `${withCasing(name, casing)}: macaddr(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('varchar')) {\n\t\tlet out: string;\n\t\tif (lowered.length !== 7) {\n\t\t\tout = `${withCasing(name, casing)}: varchar(${dbColumnName({ name, casing, withMode: true })}{ length: ${\n\t\t\t\tlowered.substring(8, lowered.length - 1)\n\t\t\t} })`;\n\t\t} else {\n\t\t\tout = `${withCasing(name, casing)}: varchar(${dbColumnName({ name, casing })})`;\n\t\t}\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('point')) {\n\t\tlet out: string = `${withCasing(name, casing)}: point(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('line')) {\n\t\tlet out: string = `${withCasing(name, casing)}: point(${dbColumnName({ name, casing })})`;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('geometry')) {\n\t\tlet out: string = '';\n\n\t\tlet isGeoUnknown = false;\n\n\t\tif (lowered.length !== 8) {\n\t\t\tconst geometryOptions = lowered.slice(9, -1).split(',');\n\t\t\tif (geometryOptions.length === 1 && geometryOptions[0] !== '') {\n\t\t\t\tout = `${withCasing(name, casing)}: geometry(${dbColumnName({ name, casing, withMode: true })}{ type: \"${\n\t\t\t\t\tgeometryOptions[0]\n\t\t\t\t}\" })`;\n\t\t\t} else if (geometryOptions.length === 2) {\n\t\t\t\tout = `${withCasing(name, casing)}: geometry(${dbColumnName({ name, casing, withMode: true })}{ type: \"${\n\t\t\t\t\tgeometryOptions[0]\n\t\t\t\t}\", srid: ${geometryOptions[1]} })`;\n\t\t\t} else {\n\t\t\t\tisGeoUnknown = true;\n\t\t\t}\n\t\t} else {\n\t\t\tout = `${withCasing(name, casing)}: geometry(${dbColumnName({ name, casing })})`;\n\t\t}\n\n\t\tif (isGeoUnknown) {\n\t\t\tlet unknown =\n\t\t\t\t`// TODO: failed to parse geometry type because found more than 2 options inside geometry function '${type}'\\n// Introspect is currently supporting only type and srid options\\n`;\n\t\t\tunknown += `\\t${withCasing(name, casing)}: unknown(\"${name}\")`;\n\t\t\treturn unknown;\n\t\t}\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('vector')) {\n\t\tlet out: string;\n\t\tif (lowered.length !== 6) {\n\t\t\tout = `${withCasing(name, casing)}: vector(${dbColumnName({ name, casing, withMode: true })}{ dimensions: ${\n\t\t\t\tlowered.substring(7, lowered.length - 1)\n\t\t\t} })`;\n\t\t} else {\n\t\t\tout = `${withCasing(name, casing)}: vector(${dbColumnName({ name, casing })})`;\n\t\t}\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('char')) {\n\t\tlet out: string;\n\t\tif (lowered.length !== 4) {\n\t\t\tout = `${withCasing(name, casing)}: char(${dbColumnName({ name, casing, withMode: true })}{ length: ${\n\t\t\t\tlowered.substring(5, lowered.length - 1)\n\t\t\t} })`;\n\t\t} else {\n\t\t\tout = `${withCasing(name, casing)}: char(${dbColumnName({ name, casing })})`;\n\t\t}\n\n\t\treturn out;\n\t}\n\n\tlet unknown = `// TODO: failed to parse database type '${type}'\\n`;\n\tunknown += `\\t${withCasing(name, casing)}: unknown(\"${name}\")`;\n\treturn unknown;\n};\n\nconst dimensionsInArray = (size?: number): string => {\n\tlet res = '';\n\tif (typeof size === 'undefined') return res;\n\tfor (let i = 0; i < size; i++) {\n\t\tres += '.array()';\n\t}\n\treturn res;\n};\n\nconst createTableColumns = (\n\ttableName: string,\n\tcolumns: Column[],\n\tfks: ForeignKey[],\n\tenumTypes: Set<string>,\n\tschemas: Record<string, string>,\n\tcasing: Casing,\n\tinternals: PgKitInternals,\n): string => {\n\tlet statement = '';\n\n\t// no self refs and no cyclic\n\tconst oneColumnsFKs = Object.values(fks)\n\t\t.filter((it) => {\n\t\t\treturn !isSelf(it);\n\t\t})\n\t\t.filter((it) => it.columnsFrom.length === 1);\n\n\tconst fkByColumnName = oneColumnsFKs.reduce((res, it) => {\n\t\tconst arr = res[it.columnsFrom[0]] || [];\n\t\tarr.push(it);\n\t\tres[it.columnsFrom[0]] = arr;\n\t\treturn res;\n\t}, {} as Record<string, ForeignKey[]>);\n\n\tcolumns.forEach((it) => {\n\t\tconst columnStatement = column(\n\t\t\ttableName,\n\t\t\tit.type,\n\t\t\tit.name,\n\t\t\tenumTypes,\n\t\t\tit.typeSchema ?? 'public',\n\t\t\tcasing,\n\t\t\tit.default,\n\t\t\tinternals,\n\t\t);\n\t\tstatement += '\\t';\n\t\tstatement += columnStatement;\n\t\t// Provide just this in column function\n\t\tif (internals?.tables[tableName]?.columns[it.name]?.isArray) {\n\t\t\tstatement += dimensionsInArray(internals?.tables[tableName]?.columns[it.name]?.dimensions);\n\t\t}\n\t\tstatement += mapDefault(tableName, it.type, it.name, enumTypes, it.typeSchema ?? 'public', it.default, internals);\n\t\tstatement += it.primaryKey ? '.primaryKey()' : '';\n\t\tstatement += it.notNull && !it.identity ? '.notNull()' : '';\n\n\t\tstatement += it.identity ? generateIdentityParams(it.identity) : '';\n\n\t\tstatement += it.generated ? `.generatedAlwaysAs(sql\\`${it.generated.as}\\`)` : '';\n\n\t\t// const fks = fkByColumnName[it.name];\n\t\t// Andrii: I switched it off until we will get a custom naem setting in references\n\t\t// if (fks) {\n\t\t// \tconst fksStatement = fks\n\t\t// \t\t.map((it) => {\n\t\t// \t\t\tconst onDelete = it.onDelete && it.onDelete !== 'no action' ? it.onDelete : null;\n\t\t// \t\t\tconst onUpdate = it.onUpdate && it.onUpdate !== 'no action' ? it.onUpdate : null;\n\t\t// \t\t\tconst params = { onDelete, onUpdate };\n\n\t\t// \t\t\tconst typeSuffix = isCyclic(it) ? ': AnyPgColumn' : '';\n\n\t\t// \t\t\tconst paramsStr = objToStatement2(params);\n\t\t// \t\t\tconst tableSchema = schemas[it.schemaTo || ''];\n\t\t// \t\t\tconst paramName = paramNameFor(it.tableTo, tableSchema);\n\t\t// \t\t\tif (paramsStr) {\n\t\t// \t\t\t\treturn `.references(()${typeSuffix} => ${\n\t\t// \t\t\t\t\twithCasing(\n\t\t// \t\t\t\t\t\tparamName,\n\t\t// \t\t\t\t\t\tcasing,\n\t\t// \t\t\t\t\t)\n\t\t// \t\t\t\t}.${withCasing(it.columnsTo[0], casing)}, ${paramsStr} )`;\n\t\t// \t\t\t}\n\t\t// \t\t\treturn `.references(()${typeSuffix} => ${\n\t\t// \t\t\t\twithCasing(\n\t\t// \t\t\t\t\tparamName,\n\t\t// \t\t\t\t\tcasing,\n\t\t// \t\t\t\t)\n\t\t// \t\t\t}.${withCasing(it.columnsTo[0], casing)})`;\n\t\t// \t\t})\n\t\t// \t\t.join('');\n\t\t// \tstatement += fksStatement;\n\t\t// }\n\n\t\tstatement += ',\\n';\n\t});\n\n\treturn statement;\n};\n\nconst createTableIndexes = (tableName: string, idxs: Index[], casing: Casing): string => {\n\tlet statement = '';\n\n\tidxs.forEach((it) => {\n\t\t// we have issue when index is called as table called\n\t\tlet idxKey = it.name.startsWith(tableName) && it.name !== tableName ? it.name.slice(tableName.length + 1) : it.name;\n\t\tidxKey = idxKey.endsWith('_index') ? idxKey.slice(0, -'_index'.length) + '_idx' : idxKey;\n\n\t\tidxKey = withCasing(idxKey, casing);\n\n\t\tconst indexGeneratedName = indexName(\n\t\t\ttableName,\n\t\t\tit.columns.map((it) => it.expression),\n\t\t);\n\t\tconst escapedIndexName = indexGeneratedName === it.name ? '' : `\"${it.name}\"`;\n\n\t\tstatement += `\\n\\t`;\n\t\tstatement += it.isUnique ? 'uniqueIndex(' : 'index(';\n\t\tstatement += `${escapedIndexName})`;\n\t\tstatement += `${it.concurrently ? `.concurrently()` : ''}`;\n\n\t\tstatement += `.using(\"${it.method}\", ${\n\t\t\tit.columns\n\t\t\t\t.map((it) => {\n\t\t\t\t\tif (it.isExpression) {\n\t\t\t\t\t\treturn `sql\\`${it.expression}\\``;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn `table.${withCasing(it.expression, casing)}${it.asc ? '.asc()' : '.desc()'}${\n\t\t\t\t\t\t\tit.nulls === 'first' ? '.nullsFirst()' : '.nullsLast()'\n\t\t\t\t\t\t}${\n\t\t\t\t\t\t\tit.opclass\n\t\t\t\t\t\t\t\t? `.op(\"${it.opclass}\")`\n\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t}`;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.join(', ')\n\t\t})`;\n\t\tstatement += it.where ? `.where(sql\\`${it.where}\\`)` : '';\n\n\t\tfunction reverseLogic(mappedWith: Record<string, string>): string {\n\t\t\tlet reversedString = '{';\n\t\t\tfor (const key in mappedWith) {\n\t\t\t\tif (mappedWith.hasOwnProperty(key)) {\n\t\t\t\t\treversedString += `${key}: \"${mappedWith[key]}\",`;\n\t\t\t\t}\n\t\t\t}\n\t\t\treversedString = reversedString.length > 1 ? reversedString.slice(0, reversedString.length - 1) : reversedString;\n\t\t\treturn `${reversedString}}`;\n\t\t}\n\n\t\tstatement += it.with && Object.keys(it.with).length > 0 ? `.with(${reverseLogic(it.with)})` : '';\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n\nconst createTablePKs = (pks: PrimaryKey[], casing: Casing): string => {\n\tlet statement = '';\n\n\tpks.forEach((it) => {\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'primaryKey({ columns: [';\n\t\tstatement += `${\n\t\t\tit.columns\n\t\t\t\t.map((c) => {\n\t\t\t\t\treturn `table.${withCasing(c, casing)}`;\n\t\t\t\t})\n\t\t\t\t.join(', ')\n\t\t}]${it.name ? `, name: \"${it.name}\"` : ''}}`;\n\t\tstatement += ')';\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n\n// get a map of db role name to ts key\n// if to by key is in this map - no quotes, otherwise - quotes\n\nconst createTablePolicies = (\n\tpolicies: Policy[],\n\tcasing: Casing,\n\trolesNameToTsKey: Record<string, string> = {},\n): string => {\n\tlet statement = '';\n\n\tpolicies.forEach((it) => {\n\t\tconst idxKey = withCasing(it.name, casing);\n\n\t\tconst mappedItTo = it.to?.map((v) => {\n\t\t\treturn rolesNameToTsKey[v] ? withCasing(rolesNameToTsKey[v], casing) : `\"${v}\"`;\n\t\t});\n\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'pgPolicy(';\n\t\tstatement += `\"${it.name}\", { `;\n\t\tstatement += `as: \"${it.as?.toLowerCase()}\", for: \"${it.for?.toLowerCase()}\", to: [${mappedItTo?.join(', ')}]${\n\t\t\tit.using ? `, using: sql\\`${it.using}\\`` : ''\n\t\t}${it.withCheck ? `, withCheck: sql\\`${it.withCheck}\\` ` : ''}`;\n\t\tstatement += ` }),`;\n\t});\n\n\treturn statement;\n};\n\nconst createTableUniques = (\n\tunqs: UniqueConstraint[],\n\tcasing: Casing,\n): string => {\n\tlet statement = '';\n\n\tunqs.forEach((it) => {\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'unique(';\n\t\tstatement += `\"${it.name}\")`;\n\t\tstatement += `.on(${it.columns.map((it) => `table.${withCasing(it, casing)}`).join(', ')})`;\n\t\tstatement += it.nullsNotDistinct ? `.nullsNotDistinct()` : '';\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n\nconst createTableChecks = (\n\tcheckConstraints: CheckConstraint[],\n\tcasing: Casing,\n) => {\n\tlet statement = '';\n\n\tcheckConstraints.forEach((it) => {\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'check(';\n\t\tstatement += `\"${it.name}\", `;\n\t\tstatement += `sql\\`${it.value}\\`)`;\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n\nconst createTableFKs = (fks: ForeignKey[], schemas: Record<string, string>, casing: Casing): string => {\n\tlet statement = '';\n\n\tfks.forEach((it) => {\n\t\tconst tableSchema = schemas[it.schemaTo || ''];\n\t\tconst paramName = paramNameFor(it.tableTo, tableSchema);\n\n\t\tconst isSelf = it.tableTo === it.tableFrom;\n\t\tconst tableTo = isSelf ? 'table' : `${withCasing(paramName, casing)}`;\n\t\tstatement += `\\n\\t`;\n\t\tstatement += `foreignKey({\\n`;\n\t\tstatement += `\\t\\t\\tcolumns: [${it.columnsFrom.map((i) => `table.${withCasing(i, casing)}`).join(', ')}],\\n`;\n\t\tstatement += `\\t\\t\\tforeignColumns: [${\n\t\t\tit.columnsTo.map((i) => `${tableTo}.${withCasing(i, casing)}`).join(', ')\n\t\t}],\\n`;\n\t\tstatement += `\\t\\t\\tname: \"${it.name}\"\\n`;\n\t\tstatement += `\\t\\t})`;\n\n\t\tstatement += it.onUpdate && it.onUpdate !== 'no action' ? `.onUpdate(\"${it.onUpdate}\")` : '';\n\n\t\tstatement += it.onDelete && it.onDelete !== 'no action' ? `.onDelete(\"${it.onDelete}\")` : '';\n\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n"
  },
  {
    "path": "drizzle-kit/src/introspect-singlestore.ts",
    "content": "/* eslint-disable @typescript-eslint/no-unsafe-argument */\nimport { toCamelCase } from 'drizzle-orm/casing';\nimport './@types/utils';\nimport type { Casing } from './cli/validations/common';\nimport { assertUnreachable } from './global';\nimport {\n\tColumn,\n\tIndex,\n\tPrimaryKey,\n\tSingleStoreSchema,\n\tSingleStoreSchemaInternal,\n\tUniqueConstraint,\n} from './serializer/singlestoreSchema';\nimport { indexName } from './serializer/singlestoreSerializer';\n\n// time precision to fsp\n// {mode: \"string\"} for timestamp by default\n\nconst singlestoreImportsList = new Set([\n\t'singlestoreTable',\n\t'singlestoreEnum',\n\t'bigint',\n\t'binary',\n\t'boolean',\n\t'char',\n\t'date',\n\t'datetime',\n\t'decimal',\n\t'double',\n\t'float',\n\t'int',\n\t'json',\n\t// TODO: add new type BSON\n\t// TODO: add new type Blob\n\t// TODO: add new type UUID\n\t// TODO: add new type GUID\n\t// TODO: add new type Vector\n\t// TODO: add new type GeoPoint\n\t'mediumint',\n\t'real',\n\t'serial',\n\t'smallint',\n\t'text',\n\t'tinytext',\n\t'mediumtext',\n\t'longtext',\n\t'time',\n\t'timestamp',\n\t'tinyint',\n\t'varbinary',\n\t'varchar',\n\t'vector',\n\t'year',\n\t'enum',\n]);\n\nconst objToStatement = (json: any) => {\n\tjson = Object.fromEntries(Object.entries(json).filter((it) => it[1]));\n\n\tconst keys = Object.keys(json);\n\tif (keys.length === 0) return;\n\n\tlet statement = '{ ';\n\tstatement += keys.map((it) => `\"${it}\": \"${json[it]}\"`).join(', ');\n\tstatement += ' }';\n\treturn statement;\n};\n\nconst objToStatement2 = (json: any) => {\n\tjson = Object.fromEntries(Object.entries(json).filter((it) => it[1]));\n\n\tconst keys = Object.keys(json);\n\tif (keys.length === 0) return;\n\n\tlet statement = '{ ';\n\tstatement += keys.map((it) => `${it}: \"${json[it]}\"`).join(', '); // no \"\" for keys\n\tstatement += ' }';\n\treturn statement;\n};\n\nconst timeConfig = (json: any) => {\n\tjson = Object.fromEntries(Object.entries(json).filter((it) => it[1]));\n\n\tconst keys = Object.keys(json);\n\tif (keys.length === 0) return;\n\n\tlet statement = '{ ';\n\tstatement += keys.map((it) => `${it}: ${json[it]}`).join(', ');\n\tstatement += ' }';\n\treturn statement;\n};\n\nconst binaryConfig = (json: any) => {\n\tjson = Object.fromEntries(Object.entries(json).filter((it) => it[1]));\n\n\tconst keys = Object.keys(json);\n\tif (keys.length === 0) return;\n\n\tlet statement = '{ ';\n\tstatement += keys.map((it) => `${it}: ${json[it]}`).join(', ');\n\tstatement += ' }';\n\treturn statement;\n};\n\nconst importsPatch = {\n\t'double precision': 'doublePrecision',\n\t'timestamp without time zone': 'timestamp',\n} as Record<string, string>;\n\nconst escapeColumnKey = (value: string) => {\n\tif (/^(?![a-zA-Z_$][a-zA-Z0-9_$]*$).+$/.test(value)) {\n\t\treturn `\"${value}\"`;\n\t}\n\treturn value;\n};\n\nconst prepareCasing = (casing?: Casing) => (value: string) => {\n\tif (casing === 'preserve') {\n\t\treturn escapeColumnKey(value);\n\t}\n\tif (casing === 'camel') {\n\t\treturn escapeColumnKey(value.camelCase());\n\t}\n\n\tassertUnreachable(casing);\n};\n\nconst dbColumnName = ({ name, casing, withMode = false }: { name: string; casing: Casing; withMode?: boolean }) => {\n\tif (casing === 'preserve') {\n\t\treturn '';\n\t}\n\tif (casing === 'camel') {\n\t\treturn toCamelCase(name) === name ? '' : withMode ? `\"${name}\", ` : `\"${name}\"`;\n\t}\n\n\tassertUnreachable(casing);\n};\n\nexport const schemaToTypeScript = (\n\tschema: SingleStoreSchemaInternal,\n\tcasing: Casing,\n) => {\n\tconst withCasing = prepareCasing(casing);\n\n\tconst imports = Object.values(schema.tables).reduce(\n\t\t(res, it) => {\n\t\t\tconst idxImports = Object.values(it.indexes).map((idx) => idx.isUnique ? 'uniqueIndex' : 'index');\n\t\t\tconst pkImports = Object.values(it.compositePrimaryKeys).map(\n\t\t\t\t(it) => 'primaryKey',\n\t\t\t);\n\t\t\tconst uniqueImports = Object.values(it.uniqueConstraints).map(\n\t\t\t\t(it) => 'unique',\n\t\t\t);\n\n\t\t\tres.singlestore.push(...idxImports);\n\t\t\tres.singlestore.push(...pkImports);\n\t\t\tres.singlestore.push(...uniqueImports);\n\n\t\t\tconst columnImports = Object.values(it.columns)\n\t\t\t\t.map((col) => {\n\t\t\t\t\tlet patched = importsPatch[col.type] ?? col.type;\n\t\t\t\t\tpatched = patched.startsWith('varchar(') ? 'varchar' : patched;\n\t\t\t\t\tpatched = patched.startsWith('char(') ? 'char' : patched;\n\t\t\t\t\tpatched = patched.startsWith('binary(') ? 'binary' : patched;\n\t\t\t\t\tpatched = patched.startsWith('decimal(') ? 'decimal' : patched;\n\t\t\t\t\tpatched = patched.startsWith('smallint(') ? 'smallint' : patched;\n\t\t\t\t\tpatched = patched.startsWith('enum(') ? 'singlestoreEnum' : patched;\n\t\t\t\t\tpatched = patched.startsWith('datetime(') ? 'datetime' : patched;\n\t\t\t\t\tpatched = patched.startsWith('varbinary(') ? 'varbinary' : patched;\n\t\t\t\t\tpatched = patched.startsWith('int(') ? 'int' : patched;\n\t\t\t\t\tpatched = patched.startsWith('double(') ? 'double' : patched;\n\t\t\t\t\tpatched = patched.startsWith('float(') ? 'float' : patched;\n\t\t\t\t\tpatched = patched.startsWith('int unsigned') ? 'int' : patched;\n\t\t\t\t\tpatched = patched.startsWith('tinyint(') ? 'tinyint' : patched;\n\t\t\t\t\tpatched = patched.startsWith('mediumint(') ? 'mediumint' : patched;\n\t\t\t\t\tpatched = patched.startsWith('bigint(') ? 'bigint' : patched;\n\t\t\t\t\tpatched = patched.startsWith('tinyint unsigned') ? 'tinyint' : patched;\n\t\t\t\t\tpatched = patched.startsWith('smallint unsigned') ? 'smallint' : patched;\n\t\t\t\t\tpatched = patched.startsWith('mediumint unsigned') ? 'mediumint' : patched;\n\t\t\t\t\tpatched = patched.startsWith('bigint unsigned') ? 'bigint' : patched;\n\t\t\t\t\treturn patched;\n\t\t\t\t})\n\t\t\t\t.filter((type) => {\n\t\t\t\t\treturn singlestoreImportsList.has(type);\n\t\t\t\t});\n\n\t\t\tres.singlestore.push(...columnImports);\n\t\t\treturn res;\n\t\t},\n\t\t{ singlestore: [] as string[] },\n\t);\n\n\t/* Object.values(schema.views).forEach((it) => {\n\t\timports.singlestore.push('singlestoreView');\n\n\t\tconst columnImports = Object.values(it.columns)\n\t\t\t.map((col) => {\n\t\t\t\tlet patched = importsPatch[col.type] ?? col.type;\n\t\t\t\tpatched = patched.startsWith('varchar(') ? 'varchar' : patched;\n\t\t\t\tpatched = patched.startsWith('char(') ? 'char' : patched;\n\t\t\t\tpatched = patched.startsWith('binary(') ? 'binary' : patched;\n\t\t\t\tpatched = patched.startsWith('decimal(') ? 'decimal' : patched;\n\t\t\t\tpatched = patched.startsWith('smallint(') ? 'smallint' : patched;\n\t\t\t\tpatched = patched.startsWith('enum(') ? 'singlestoreEnum' : patched;\n\t\t\t\tpatched = patched.startsWith('datetime(') ? 'datetime' : patched;\n\t\t\t\tpatched = patched.startsWith('varbinary(') ? 'varbinary' : patched;\n\t\t\t\tpatched = patched.startsWith('int(') ? 'int' : patched;\n\t\t\t\tpatched = patched.startsWith('double(') ? 'double' : patched;\n\t\t\t\tpatched = patched.startsWith('float(') ? 'float' : patched;\n\t\t\t\tpatched = patched.startsWith('int unsigned') ? 'int' : patched;\n\t\t\t\tpatched = patched.startsWith('tinyint(') ? 'tinyint' : patched;\n\t\t\t\tpatched = patched.startsWith('mediumint(') ? 'mediumint' : patched;\n\t\t\t\tpatched = patched.startsWith('bigint(') ? 'bigint' : patched;\n\t\t\t\tpatched = patched.startsWith('tinyint unsigned') ? 'tinyint' : patched;\n\t\t\t\tpatched = patched.startsWith('smallint unsigned') ? 'smallint' : patched;\n\t\t\t\tpatched = patched.startsWith('mediumint unsigned') ? 'mediumint' : patched;\n\t\t\t\tpatched = patched.startsWith('bigint unsigned') ? 'bigint' : patched;\n\t\t\t\treturn patched;\n\t\t\t})\n\t\t\t.filter((type) => {\n\t\t\t\treturn singlestoreImportsList.has(type);\n\t\t\t});\n\n\t\timports.singlestore.push(...columnImports);\n\t}); */\n\n\tconst tableStatements = Object.values(schema.tables).map((table) => {\n\t\tconst func = 'singlestoreTable';\n\t\tlet statement = '';\n\t\tif (imports.singlestore.includes(withCasing(table.name))) {\n\t\t\tstatement = `// Table name is in conflict with ${\n\t\t\t\twithCasing(\n\t\t\t\t\ttable.name,\n\t\t\t\t)\n\t\t\t} import.\\n// Please change to any other name, that is not in imports list\\n`;\n\t\t}\n\t\tstatement += `export const ${withCasing(table.name)} = ${func}(\"${table.name}\", {\\n`;\n\t\tstatement += createTableColumns(\n\t\t\tObject.values(table.columns),\n\t\t\twithCasing,\n\t\t\tcasing,\n\t\t\ttable.name,\n\t\t\tschema,\n\t\t);\n\t\tstatement += '}';\n\n\t\tif (\n\t\t\tObject.keys(table.indexes).length > 0\n\t\t\t|| Object.keys(table.compositePrimaryKeys).length > 0\n\t\t\t|| Object.keys(table.uniqueConstraints).length > 0\n\t\t) {\n\t\t\tstatement += ',\\n';\n\t\t\tstatement += '(table) => [';\n\t\t\tstatement += createTableIndexes(\n\t\t\t\ttable.name,\n\t\t\t\tObject.values(table.indexes),\n\t\t\t\twithCasing,\n\t\t\t);\n\t\t\tstatement += createTablePKs(\n\t\t\t\tObject.values(table.compositePrimaryKeys),\n\t\t\t\twithCasing,\n\t\t\t);\n\t\t\tstatement += createTableUniques(\n\t\t\t\tObject.values(table.uniqueConstraints),\n\t\t\t\twithCasing,\n\t\t\t);\n\t\t\tstatement += '\\n]';\n\t\t}\n\n\t\tstatement += ');';\n\t\treturn statement;\n\t});\n\n\t/* const viewsStatements = Object.values(schema.views).map((view) => {\n\t\tconst { columns, name, algorithm, definition, sqlSecurity, withCheckOption } = view;\n\t\tconst func = 'singlestoreView';\n\t\tlet statement = '';\n\n\t\tif (imports.singlestore.includes(withCasing(name))) {\n\t\t\tstatement = `// Table name is in conflict with ${\n\t\t\t\twithCasing(\n\t\t\t\t\tview.name,\n\t\t\t\t)\n\t\t\t} import.\\n// Please change to any other name, that is not in imports list\\n`;\n\t\t}\n\t\tstatement += `export const ${withCasing(name)} = ${func}(\"${name}\", {\\n`;\n\t\tstatement += createTableColumns(\n\t\t\tObject.values(columns),\n\t\t\twithCasing,\n\t\t\tcasing,\n\t\t\tname,\n\t\t\tschema,\n\t\t);\n\t\tstatement += '})';\n\n\t\tstatement += algorithm ? `.algorithm(\"${algorithm}\")` : '';\n\t\tstatement += sqlSecurity ? `.sqlSecurity(\"${sqlSecurity}\")` : '';\n\t\tstatement += withCheckOption ? `.withCheckOption(\"${withCheckOption}\")` : '';\n\t\tstatement += `.as(sql\\`${definition?.replaceAll('`', '\\\\`')}\\`);`;\n\n\t\treturn statement;\n\t}); */\n\n\tconst uniqueSingleStoreImports = [\n\t\t'singlestoreTable',\n\t\t'singlestoreSchema',\n\t\t'AnySingleStoreColumn',\n\t\t...new Set(imports.singlestore),\n\t];\n\tconst importsTs = `import { ${\n\t\tuniqueSingleStoreImports.join(\n\t\t\t', ',\n\t\t)\n\t} } from \"drizzle-orm/singlestore-core\"\\nimport { sql } from \"drizzle-orm\"\\n\\n`;\n\n\tlet decalrations = '';\n\tdecalrations += tableStatements.join('\\n\\n');\n\tdecalrations += '\\n';\n\t/* decalrations += viewsStatements.join('\\n\\n'); */\n\n\tconst file = importsTs + decalrations;\n\n\tconst schemaEntry = `\n    {\n      ${\n\t\tObject.values(schema.tables)\n\t\t\t.map((it) => withCasing(it.name))\n\t\t\t.join(',')\n\t}\n    }\n  `;\n\n\treturn {\n\t\tfile, // backward compatible, print to file\n\t\timports: importsTs,\n\t\tdecalrations,\n\t\tschemaEntry,\n\t};\n};\n\nconst mapColumnDefault = (defaultValue: any, isExpression?: boolean) => {\n\tif (isExpression) {\n\t\treturn `sql\\`${defaultValue}\\``;\n\t}\n\n\treturn defaultValue;\n};\n\nconst mapColumnDefaultForJson = (defaultValue: any) => {\n\tif (\n\t\ttypeof defaultValue === 'string'\n\t\t&& defaultValue.startsWith(\"('\")\n\t\t&& defaultValue.endsWith(\"')\")\n\t) {\n\t\treturn defaultValue.substring(2, defaultValue.length - 2);\n\t}\n\n\treturn defaultValue;\n};\n\nconst column = (\n\ttype: string,\n\tname: string,\n\tcasing: (value: string) => string,\n\trawCasing: Casing,\n\tdefaultValue?: any,\n\tautoincrement?: boolean,\n\tonUpdate?: boolean,\n\tisExpression?: boolean,\n) => {\n\tlet lowered = type;\n\tif (!type.startsWith('enum(')) {\n\t\tlowered = type.toLowerCase();\n\t}\n\n\tif (lowered === 'serial') {\n\t\treturn `${casing(name)}: serial(${dbColumnName({ name, casing: rawCasing })})`;\n\t}\n\n\tif (lowered.startsWith('int')) {\n\t\tconst isUnsigned = lowered.includes('unsigned');\n\t\tconst columnName = dbColumnName({ name, casing: rawCasing, withMode: isUnsigned });\n\t\tlet out = `${casing(name)}: int(${columnName}${isUnsigned ? '{ unsigned: true }' : ''})`;\n\t\tout += autoincrement ? `.autoincrement()` : '';\n\t\tout += typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('tinyint')) {\n\t\tconst isUnsigned = lowered.includes('unsigned');\n\t\tconst columnName = dbColumnName({ name, casing: rawCasing, withMode: isUnsigned });\n\t\tlet out: string = `${casing(name)}: tinyint(${columnName}${isUnsigned ? '{ unsigned: true }' : ''})`;\n\t\tout += autoincrement ? `.autoincrement()` : '';\n\t\tout += typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('smallint')) {\n\t\tconst isUnsigned = lowered.includes('unsigned');\n\t\tconst columnName = dbColumnName({ name, casing: rawCasing, withMode: isUnsigned });\n\t\tlet out = `${casing(name)}: smallint(${columnName}${isUnsigned ? '{ unsigned: true }' : ''})`;\n\t\tout += autoincrement ? `.autoincrement()` : '';\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('mediumint')) {\n\t\tconst isUnsigned = lowered.includes('unsigned');\n\t\tconst columnName = dbColumnName({ name, casing: rawCasing, withMode: isUnsigned });\n\t\tlet out = `${casing(name)}: mediumint(${columnName}${isUnsigned ? '{ unsigned: true }' : ''})`;\n\t\tout += autoincrement ? `.autoincrement()` : '';\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('bigint')) {\n\t\tconst isUnsigned = lowered.includes('unsigned');\n\t\tlet out = `${casing(name)}: bigint(${dbColumnName({ name, casing: rawCasing, withMode: true })}{ mode: \"number\"${\n\t\t\tisUnsigned ? ', unsigned: true' : ''\n\t\t} })`;\n\t\tout += autoincrement ? `.autoincrement()` : '';\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered === 'boolean') {\n\t\tlet out = `${casing(name)}: boolean(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('double')) {\n\t\tlet params:\n\t\t\t| { precision?: string; scale?: string; unsigned?: boolean }\n\t\t\t| undefined;\n\n\t\tif (lowered.length > (lowered.includes('unsigned') ? 15 : 6)) {\n\t\t\tconst [precision, scale] = lowered\n\t\t\t\t.slice(7, lowered.length - (1 + (lowered.includes('unsigned') ? 9 : 0)))\n\t\t\t\t.split(',');\n\t\t\tparams = { precision, scale };\n\t\t}\n\n\t\tif (lowered.includes('unsigned')) {\n\t\t\tparams = { ...(params ?? {}), unsigned: true };\n\t\t}\n\n\t\tconst timeConfigParams = params ? timeConfig(params) : undefined;\n\n\t\tlet out = params\n\t\t\t? `${casing(name)}: double(${\n\t\t\t\tdbColumnName({ name, casing: rawCasing, withMode: timeConfigParams !== undefined })\n\t\t\t}${timeConfig(params)})`\n\t\t\t: `${casing(name)}: double(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\t// let out = `${name.camelCase()}: double(\"${name}\")`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('float')) {\n\t\tlet params:\n\t\t\t| { precision?: string; scale?: string; unsigned?: boolean }\n\t\t\t| undefined;\n\n\t\tif (lowered.length > (lowered.includes('unsigned') ? 14 : 5)) {\n\t\t\tconst [precision, scale] = lowered\n\t\t\t\t.slice(6, lowered.length - (1 + (lowered.includes('unsigned') ? 9 : 0)))\n\t\t\t\t.split(',');\n\t\t\tparams = { precision, scale };\n\t\t}\n\n\t\tif (lowered.includes('unsigned')) {\n\t\t\tparams = { ...(params ?? {}), unsigned: true };\n\t\t}\n\n\t\tlet out = `${casing(name)}: float(${dbColumnName({ name, casing: rawCasing })}${params ? timeConfig(params) : ''})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered === 'real') {\n\t\tlet out = `${casing(name)}: real(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('timestamp')) {\n\t\tconst keyLength = 'timestamp'.length + 1;\n\t\tlet fsp = lowered.length > keyLength\n\t\t\t? Number(lowered.substring(keyLength, lowered.length - 1))\n\t\t\t: null;\n\t\tfsp = fsp ? fsp : null;\n\n\t\tconst params = timeConfig({ fsp, mode: \"'string'\" });\n\n\t\tlet out = params\n\t\t\t? `${casing(name)}: timestamp(${\n\t\t\t\tdbColumnName({ name, casing: rawCasing, withMode: params !== undefined })\n\t\t\t}${params})`\n\t\t\t: `${casing(name)}: timestamp(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\t// singlestore has only CURRENT_TIMESTAMP, as I found from docs. But will leave now() for just a case\n\t\tdefaultValue = defaultValue === 'now()' || defaultValue === 'CURRENT_TIMESTAMP'\n\t\t\t? '.defaultNow()'\n\t\t\t: defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\n\t\tlet onUpdateNow = onUpdate ? '.onUpdateNow()' : '';\n\t\tout += onUpdateNow;\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('time')) {\n\t\tconst keyLength = 'time'.length + 1;\n\t\tlet fsp = lowered.length > keyLength\n\t\t\t? Number(lowered.substring(keyLength, lowered.length - 1))\n\t\t\t: null;\n\t\tfsp = fsp ? fsp : null;\n\n\t\tconst params = timeConfig({ fsp });\n\n\t\tlet out = params\n\t\t\t? `${casing(name)}: time(${dbColumnName({ name, casing: rawCasing, withMode: params !== undefined })}${params})`\n\t\t\t: `${casing(name)}: time(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\tdefaultValue = defaultValue === 'now()'\n\t\t\t? '.defaultNow()'\n\t\t\t: defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\t\treturn out;\n\t}\n\n\tif (lowered === 'date') {\n\t\tlet out = `// you can use { mode: 'date' }, if you want to have Date as type for this column\\n\\t${\n\t\t\tcasing(\n\t\t\t\tname,\n\t\t\t)\n\t\t}: date(${dbColumnName({ name, casing: rawCasing, withMode: true })}{ mode: 'string' })`;\n\n\t\tdefaultValue = defaultValue === 'now()'\n\t\t\t? '.defaultNow()'\n\t\t\t: defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\t\treturn out;\n\t}\n\n\t// in singlestore text can't have default value. Will leave it in case smth ;)\n\tif (lowered === 'text') {\n\t\tlet out = `${casing(name)}: text(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\t// in singlestore text can't have default value. Will leave it in case smth ;)\n\tif (lowered === 'tinytext') {\n\t\tlet out = `${casing(name)}: tinytext(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\t// in singlestore text can't have default value. Will leave it in case smth ;)\n\tif (lowered === 'mediumtext') {\n\t\tlet out = `${casing(name)}: mediumtext(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\t// in singlestore text can't have default value. Will leave it in case smth ;)\n\tif (lowered === 'longtext') {\n\t\tlet out = `${casing(name)}: longtext(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered === 'year') {\n\t\tlet out = `${casing(name)}: year(${dbColumnName({ name, casing: rawCasing })})`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\t// in singlestore json can't have default value. Will leave it in case smth ;)\n\tif (lowered === 'json') {\n\t\tlet out = `${casing(name)}: json(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefaultForJson(defaultValue)})`\n\t\t\t: '';\n\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('varchar')) {\n\t\tlet out: string = `${\n\t\t\tcasing(\n\t\t\t\tname,\n\t\t\t)\n\t\t}: varchar(${dbColumnName({ name, casing: rawCasing, withMode: true })}{ length: ${\n\t\t\tlowered.substring(\n\t\t\t\t'varchar'.length + 1,\n\t\t\t\tlowered.length - 1,\n\t\t\t)\n\t\t} })`;\n\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('char')) {\n\t\tlet out: string = `${\n\t\t\tcasing(\n\t\t\t\tname,\n\t\t\t)\n\t\t}: char(${dbColumnName({ name, casing: rawCasing, withMode: true })}{ length: ${\n\t\t\tlowered.substring(\n\t\t\t\t'char'.length + 1,\n\t\t\t\tlowered.length - 1,\n\t\t\t)\n\t\t} })`;\n\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('datetime')) {\n\t\tlet out = `// you can use { mode: 'date' }, if you want to have Date as type for this column\\n\\t`;\n\n\t\tconst fsp = lowered.startsWith('datetime(')\n\t\t\t? lowered.substring('datetime'.length + 1, lowered.length - 1)\n\t\t\t: undefined;\n\n\t\tout = fsp\n\t\t\t? `${\n\t\t\t\tcasing(\n\t\t\t\t\tname,\n\t\t\t\t)\n\t\t\t}: datetime(${dbColumnName({ name, casing: rawCasing, withMode: true })}{ mode: 'string', fsp: ${\n\t\t\t\tlowered.substring(\n\t\t\t\t\t'datetime'.length + 1,\n\t\t\t\t\tlowered.length - 1,\n\t\t\t\t)\n\t\t\t} })`\n\t\t\t: `${casing(name)}: datetime(${dbColumnName({ name, casing: rawCasing, withMode: true })}{ mode: 'string'})`;\n\n\t\tdefaultValue = defaultValue === 'now()'\n\t\t\t? '.defaultNow()'\n\t\t\t: defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('decimal')) {\n\t\tlet params:\n\t\t\t| { precision?: string; scale?: string; unsigned?: boolean }\n\t\t\t| undefined;\n\n\t\tif (lowered.length > (lowered.includes('unsigned') ? 16 : 7)) {\n\t\t\tconst [precision, scale] = lowered\n\t\t\t\t.slice(8, lowered.length - (1 + (lowered.includes('unsigned') ? 9 : 0)))\n\t\t\t\t.split(',');\n\t\t\tparams = { precision, scale };\n\t\t}\n\n\t\tif (lowered.includes('unsigned')) {\n\t\t\tparams = { ...(params ?? {}), unsigned: true };\n\t\t}\n\n\t\tconst timeConfigParams = params ? timeConfig(params) : undefined;\n\n\t\tlet out = params\n\t\t\t? `${casing(name)}: decimal(${\n\t\t\t\tdbColumnName({ name, casing: rawCasing, withMode: timeConfigParams !== undefined })\n\t\t\t}${timeConfigParams})`\n\t\t\t: `${casing(name)}: decimal(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\tdefaultValue = typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('binary')) {\n\t\tconst keyLength = 'binary'.length + 1;\n\t\tlet length = lowered.length > keyLength\n\t\t\t? Number(lowered.substring(keyLength, lowered.length - 1))\n\t\t\t: null;\n\t\tlength = length ? length : null;\n\n\t\tconst params = binaryConfig({ length });\n\n\t\tlet out = params\n\t\t\t? `${casing(name)}: binary(${dbColumnName({ name, casing: rawCasing, withMode: params !== undefined })}${params})`\n\t\t\t: `${casing(name)}: binary(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\tdefaultValue = defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('enum')) {\n\t\tconst values = lowered.substring('enum'.length + 1, lowered.length - 1);\n\t\tlet out = `${casing(name)}: singlestoreEnum(${\n\t\t\tdbColumnName({ name, casing: rawCasing, withMode: true })\n\t\t}[${values}])`;\n\t\tout += defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('varbinary')) {\n\t\tconst keyLength = 'varbinary'.length + 1;\n\t\tlet length = lowered.length > keyLength\n\t\t\t? Number(lowered.substring(keyLength, lowered.length - 1))\n\t\t\t: null;\n\t\tlength = length ? length : null;\n\n\t\tconst params = binaryConfig({ length });\n\n\t\tlet out = params\n\t\t\t? `${casing(name)}: varbinary(${\n\t\t\t\tdbColumnName({ name, casing: rawCasing, withMode: params !== undefined })\n\t\t\t}${params})`\n\t\t\t: `${casing(name)}: varbinary(${dbColumnName({ name, casing: rawCasing })})`;\n\n\t\tdefaultValue = defaultValue\n\t\t\t? `.default(${mapColumnDefault(defaultValue, isExpression)})`\n\t\t\t: '';\n\n\t\tout += defaultValue;\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('vector')) {\n\t\tconst [dimensions, elementType] = lowered.substring('vector'.length + 1, lowered.length - 1).split(',');\n\t\tlet out = `${casing(name)}: vector(${\n\t\t\tdbColumnName({ name, casing: rawCasing, withMode: true })\n\t\t}{ dimensions: ${dimensions}, elementType: ${elementType} })`;\n\n\t\tout += defaultValue ? `.default(${mapColumnDefault(defaultValue, isExpression)})` : '';\n\t\treturn out;\n\t}\n\n\tconsole.log('uknown', type);\n\treturn `// Warning: Can't parse ${type} from database\\n\\t// ${type}Type: ${type}(\"${name}\")`;\n};\n\nconst createTableColumns = (\n\tcolumns: Column[],\n\tcasing: (val: string) => string,\n\trawCasing: Casing,\n\ttableName: string,\n\tschema: SingleStoreSchemaInternal,\n): string => {\n\tlet statement = '';\n\n\tcolumns.forEach((it) => {\n\t\tstatement += '\\t';\n\t\tstatement += column(\n\t\t\tit.type,\n\t\t\tit.name,\n\t\t\tcasing,\n\t\t\trawCasing,\n\t\t\tit.default,\n\t\t\tit.autoincrement,\n\t\t\tit.onUpdate,\n\t\t\tschema.internal?.tables![tableName]?.columns[it.name]\n\t\t\t\t?.isDefaultAnExpression ?? false,\n\t\t);\n\t\tstatement += it.primaryKey ? '.primaryKey()' : '';\n\t\tstatement += it.notNull ? '.notNull()' : '';\n\n\t\tstatement += it.generated\n\t\t\t? `.generatedAlwaysAs(sql\\`${\n\t\t\t\tit.generated.as.replace(\n\t\t\t\t\t/`/g,\n\t\t\t\t\t'\\\\`',\n\t\t\t\t)\n\t\t\t}\\`, { mode: \"${it.generated.type}\" })`\n\t\t\t: '';\n\n\t\tstatement += ',\\n';\n\t});\n\n\treturn statement;\n};\n\nconst createTableIndexes = (\n\ttableName: string,\n\tidxs: Index[],\n\tcasing: (value: string) => string,\n): string => {\n\tlet statement = '';\n\n\tidxs.forEach((it) => {\n\t\tlet idxKey = it.name.startsWith(tableName) && it.name !== tableName\n\t\t\t? it.name.slice(tableName.length + 1)\n\t\t\t: it.name;\n\t\tidxKey = idxKey.endsWith('_index')\n\t\t\t? idxKey.slice(0, -'_index'.length) + '_idx'\n\t\t\t: idxKey;\n\n\t\tidxKey = casing(idxKey);\n\n\t\tconst indexGeneratedName = indexName(tableName, it.columns);\n\t\tconst escapedIndexName = indexGeneratedName === it.name ? '' : `\"${it.name}\"`;\n\n\t\tstatement += `\\n\\t`;\n\t\tstatement += it.isUnique ? 'uniqueIndex(' : 'index(';\n\t\tstatement += `${escapedIndexName})`;\n\t\tstatement += `.on(${\n\t\t\tit.columns\n\t\t\t\t.map((it) => `table.${casing(it)}`)\n\t\t\t\t.join(', ')\n\t\t}),`;\n\t});\n\n\treturn statement;\n};\n\nconst createTableUniques = (\n\tunqs: UniqueConstraint[],\n\tcasing: (value: string) => string,\n): string => {\n\tlet statement = '';\n\n\tunqs.forEach((it) => {\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'unique(';\n\t\tstatement += `\"${it.name}\")`;\n\t\tstatement += `.on(${\n\t\t\tit.columns\n\t\t\t\t.map((it) => `table.${casing(it)}`)\n\t\t\t\t.join(', ')\n\t\t}),`;\n\t});\n\n\treturn statement;\n};\n\nconst createTablePKs = (\n\tpks: PrimaryKey[],\n\tcasing: (value: string) => string,\n): string => {\n\tlet statement = '';\n\n\tpks.forEach((it) => {\n\t\tlet idxKey = casing(it.name);\n\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'primaryKey({ columns: [';\n\t\tstatement += `${\n\t\t\tit.columns\n\t\t\t\t.map((c) => {\n\t\t\t\t\treturn `table.${casing(c)}`;\n\t\t\t\t})\n\t\t\t\t.join(', ')\n\t\t}]${it.name ? `, name: \"${it.name}\"` : ''}}`;\n\t\tstatement += '),';\n\t});\n\n\treturn statement;\n};\n"
  },
  {
    "path": "drizzle-kit/src/introspect-sqlite.ts",
    "content": "/* eslint-disable @typescript-eslint/no-unsafe-argument */\nimport { toCamelCase } from 'drizzle-orm/casing';\nimport './@types/utils';\nimport type { Casing } from './cli/validations/common';\nimport { assertUnreachable } from './global';\nimport { CheckConstraint } from './serializer/mysqlSchema';\nimport type {\n\tColumn,\n\tForeignKey,\n\tIndex,\n\tPrimaryKey,\n\tSQLiteSchema,\n\tSQLiteSchemaInternal,\n\tUniqueConstraint,\n} from './serializer/sqliteSchema';\n\nconst sqliteImportsList = new Set([\n\t'sqliteTable',\n\t'integer',\n\t'real',\n\t'text',\n\t'numeric',\n\t'blob',\n]);\n\nexport const indexName = (tableName: string, columns: string[]) => {\n\treturn `${tableName}_${columns.join('_')}_index`;\n};\n\nconst objToStatement2 = (json: any) => {\n\tjson = Object.fromEntries(Object.entries(json).filter((it) => it[1]));\n\n\tconst keys = Object.keys(json);\n\tif (keys.length === 0) return;\n\n\tlet statement = '{ ';\n\tstatement += keys.map((it) => `${it}: \"${json[it]}\"`).join(', '); // no \"\" for keys\n\tstatement += ' }';\n\treturn statement;\n};\n\nconst relations = new Set<string>();\n\nconst escapeColumnKey = (value: string) => {\n\tif (/^(?![a-zA-Z_$][a-zA-Z0-9_$]*$).+$/.test(value)) {\n\t\treturn `\"${value}\"`;\n\t}\n\treturn value;\n};\n\nconst withCasing = (value: string, casing?: Casing) => {\n\tif (casing === 'preserve') {\n\t\treturn escapeColumnKey(value);\n\t}\n\tif (casing === 'camel') {\n\t\treturn escapeColumnKey(value.camelCase());\n\t}\n\n\treturn value;\n};\n\nconst dbColumnName = ({ name, casing, withMode = false }: { name: string; casing: Casing; withMode?: boolean }) => {\n\tif (casing === 'preserve') {\n\t\treturn '';\n\t}\n\tif (casing === 'camel') {\n\t\treturn toCamelCase(name) === name ? '' : withMode ? `\"${name}\", ` : `\"${name}\"`;\n\t}\n\n\tassertUnreachable(casing);\n};\n\nexport const schemaToTypeScript = (\n\tschema: SQLiteSchemaInternal,\n\tcasing: Casing,\n) => {\n\t// collectFKs\n\tObject.values(schema.tables).forEach((table) => {\n\t\tObject.values(table.foreignKeys).forEach((fk) => {\n\t\t\tconst relation = `${fk.tableFrom}-${fk.tableTo}`;\n\t\t\trelations.add(relation);\n\t\t});\n\t});\n\n\tconst imports = Object.values(schema.tables).reduce(\n\t\t(res, it) => {\n\t\t\tconst idxImports = Object.values(it.indexes).map((idx) => idx.isUnique ? 'uniqueIndex' : 'index');\n\t\t\tconst fkImpots = Object.values(it.foreignKeys).map((it) => 'foreignKey');\n\t\t\tconst pkImports = Object.values(it.compositePrimaryKeys).map(\n\t\t\t\t(it) => 'primaryKey',\n\t\t\t);\n\t\t\tconst uniqueImports = Object.values(it.uniqueConstraints).map(\n\t\t\t\t(it) => 'unique',\n\t\t\t);\n\t\t\tconst checkImports = Object.values(it.checkConstraints).map(\n\t\t\t\t(it) => 'check',\n\t\t\t);\n\n\t\t\tres.sqlite.push(...idxImports);\n\t\t\tres.sqlite.push(...fkImpots);\n\t\t\tres.sqlite.push(...pkImports);\n\t\t\tres.sqlite.push(...uniqueImports);\n\t\t\tres.sqlite.push(...checkImports);\n\n\t\t\tconst columnImports = Object.values(it.columns)\n\t\t\t\t.map((col) => {\n\t\t\t\t\treturn col.type;\n\t\t\t\t})\n\t\t\t\t.filter((type) => {\n\t\t\t\t\treturn sqliteImportsList.has(type);\n\t\t\t\t});\n\n\t\t\tres.sqlite.push(...columnImports);\n\t\t\treturn res;\n\t\t},\n\t\t{ sqlite: [] as string[] },\n\t);\n\n\tObject.values(schema.views).forEach((it) => {\n\t\timports.sqlite.push('sqliteView');\n\n\t\tconst columnImports = Object.values(it.columns)\n\t\t\t.map((col) => {\n\t\t\t\treturn col.type;\n\t\t\t})\n\t\t\t.filter((type) => {\n\t\t\t\treturn sqliteImportsList.has(type);\n\t\t\t});\n\n\t\timports.sqlite.push(...columnImports);\n\t});\n\n\tconst tableStatements = Object.values(schema.tables).map((table) => {\n\t\tconst func = 'sqliteTable';\n\t\tlet statement = '';\n\t\tif (imports.sqlite.includes(withCasing(table.name, casing))) {\n\t\t\tstatement = `// Table name is in conflict with ${\n\t\t\t\twithCasing(\n\t\t\t\t\ttable.name,\n\t\t\t\t\tcasing,\n\t\t\t\t)\n\t\t\t} import.\\n// Please change to any other name, that is not in imports list\\n`;\n\t\t}\n\t\tstatement += `export const ${withCasing(table.name, casing)} = ${func}(\"${table.name}\", {\\n`;\n\t\tstatement += createTableColumns(\n\t\t\tObject.values(table.columns),\n\t\t\tObject.values(table.foreignKeys),\n\t\t\tcasing,\n\t\t);\n\t\tstatement += '}';\n\n\t\t// more than 2 fields or self reference or cyclic\n\t\tconst filteredFKs = Object.values(table.foreignKeys).filter((it) => {\n\t\t\treturn it.columnsFrom.length > 1 || isSelf(it);\n\t\t});\n\n\t\tif (\n\t\t\tObject.keys(table.indexes).length > 0\n\t\t\t|| filteredFKs.length > 0\n\t\t\t|| Object.keys(table.compositePrimaryKeys).length > 0\n\t\t\t|| Object.keys(table.uniqueConstraints).length > 0\n\t\t\t|| Object.keys(table.checkConstraints).length > 0\n\t\t) {\n\t\t\tstatement += ',\\n';\n\t\t\tstatement += '(table) => [';\n\t\t\tstatement += createTableIndexes(\n\t\t\t\ttable.name,\n\t\t\t\tObject.values(table.indexes),\n\t\t\t\tcasing,\n\t\t\t);\n\t\t\tstatement += createTableFKs(Object.values(filteredFKs), casing);\n\t\t\tstatement += createTablePKs(\n\t\t\t\tObject.values(table.compositePrimaryKeys),\n\t\t\t\tcasing,\n\t\t\t);\n\t\t\tstatement += createTableUniques(\n\t\t\t\tObject.values(table.uniqueConstraints),\n\t\t\t\tcasing,\n\t\t\t);\n\t\t\tstatement += createTableChecks(\n\t\t\t\tObject.values(table.checkConstraints),\n\t\t\t\tcasing,\n\t\t\t);\n\t\t\tstatement += '\\n]';\n\t\t}\n\n\t\tstatement += ');';\n\t\treturn statement;\n\t});\n\n\tconst viewsStatements = Object.values(schema.views).map((view) => {\n\t\tconst func = 'sqliteView';\n\n\t\tlet statement = '';\n\t\tif (imports.sqlite.includes(withCasing(view.name, casing))) {\n\t\t\tstatement = `// Table name is in conflict with ${\n\t\t\t\twithCasing(\n\t\t\t\t\tview.name,\n\t\t\t\t\tcasing,\n\t\t\t\t)\n\t\t\t} import.\\n// Please change to any other name, that is not in imports list\\n`;\n\t\t}\n\t\tstatement += `export const ${withCasing(view.name, casing)} = ${func}(\"${view.name}\", {\\n`;\n\t\tstatement += createTableColumns(\n\t\t\tObject.values(view.columns),\n\t\t\t[],\n\t\t\tcasing,\n\t\t);\n\t\tstatement += '})';\n\t\tstatement += `.as(sql\\`${view.definition?.replaceAll('`', '\\\\`')}\\`);`;\n\n\t\treturn statement;\n\t});\n\n\tconst uniqueSqliteImports = [\n\t\t'sqliteTable',\n\t\t'AnySQLiteColumn',\n\t\t...new Set(imports.sqlite),\n\t];\n\n\tconst importsTs = `import { ${\n\t\tuniqueSqliteImports.join(\n\t\t\t', ',\n\t\t)\n\t} } from \"drizzle-orm/sqlite-core\"\n  import { sql } from \"drizzle-orm\"\\n\\n`;\n\n\tlet decalrations = tableStatements.join('\\n\\n');\n\tdecalrations += '\\n\\n';\n\tdecalrations += viewsStatements.join('\\n\\n');\n\n\tconst file = importsTs + decalrations;\n\n\t// for drizzle studio query runner\n\tconst schemaEntry = `\n    {\n      ${\n\t\tObject.values(schema.tables)\n\t\t\t.map((it) => withCasing(it.name, casing))\n\t\t\t.join(',')\n\t}\n    }\n  `;\n\n\treturn { file, imports: importsTs, decalrations, schemaEntry };\n};\n\nconst isCyclic = (fk: ForeignKey) => {\n\tconst key = `${fk.tableFrom}-${fk.tableTo}`;\n\tconst reverse = `${fk.tableTo}-${fk.tableFrom}`;\n\treturn relations.has(key) && relations.has(reverse);\n};\n\nconst isSelf = (fk: ForeignKey) => {\n\treturn fk.tableFrom === fk.tableTo;\n};\n\nconst mapColumnDefault = (defaultValue: any) => {\n\tif (\n\t\ttypeof defaultValue === 'string'\n\t\t&& defaultValue.startsWith('(')\n\t\t&& defaultValue.endsWith(')')\n\t) {\n\t\treturn `sql\\`${defaultValue}\\``;\n\t}\n\t// If default value is NULL as string it will come back from db as \"'NULL'\" and not just \"NULL\"\n\tif (defaultValue === 'NULL') {\n\t\treturn `sql\\`NULL\\``;\n\t}\n\n\tif (\n\t\ttypeof defaultValue === 'string'\n\t) {\n\t\treturn defaultValue.substring(1, defaultValue.length - 1).replaceAll('\"', '\\\\\"').replaceAll(\"''\", \"'\");\n\t}\n\n\treturn defaultValue;\n};\n\nconst column = (\n\ttype: string,\n\tname: string,\n\tdefaultValue?: any,\n\tautoincrement?: boolean,\n\tcasing?: Casing,\n) => {\n\tlet lowered = type;\n\tcasing = casing!;\n\n\tif (lowered === 'integer') {\n\t\tlet out = `${withCasing(name, casing)}: integer(${dbColumnName({ name, casing })})`;\n\t\t// out += autoincrement ? `.autoincrement()` : \"\";\n\t\tout += typeof defaultValue !== 'undefined'\n\t\t\t? `.default(${mapColumnDefault(defaultValue)})`\n\t\t\t: '';\n\t\treturn out;\n\t}\n\n\tif (lowered === 'real') {\n\t\tlet out = `${withCasing(name, casing)}: real(${dbColumnName({ name, casing })})`;\n\t\tout += defaultValue ? `.default(${mapColumnDefault(defaultValue)})` : '';\n\t\treturn out;\n\t}\n\n\tif (lowered.startsWith('text')) {\n\t\tconst match = lowered.match(/\\d+/);\n\t\tlet out: string;\n\n\t\tif (match) {\n\t\t\tout = `${withCasing(name, casing)}: text(${dbColumnName({ name, casing, withMode: true })}{ length: ${\n\t\t\t\tmatch[0]\n\t\t\t} })`;\n\t\t} else {\n\t\t\tout = `${withCasing(name, casing)}: text(${dbColumnName({ name, casing })})`;\n\t\t}\n\n\t\tout += defaultValue ? `.default(\"${mapColumnDefault(defaultValue)}\")` : '';\n\t\treturn out;\n\t}\n\n\tif (lowered === 'blob') {\n\t\tlet out = `${withCasing(name, casing)}: blob(${dbColumnName({ name, casing })})`;\n\t\tout += defaultValue ? `.default(${mapColumnDefault(defaultValue)})` : '';\n\t\treturn out;\n\t}\n\n\tif (lowered === 'numeric') {\n\t\tlet out = `${withCasing(name, casing)}: numeric(${dbColumnName({ name, casing })})`;\n\t\tout += defaultValue ? `.default(${mapColumnDefault(defaultValue)})` : '';\n\t\treturn out;\n\t}\n\n\t//   console.log(\"uknown\", type);\n\treturn `// Warning: Can't parse ${type} from database\\n\\t// ${type}Type: ${type}(\"${name}\")`;\n};\n\nconst createTableColumns = (\n\tcolumns: Column[],\n\tfks: ForeignKey[],\n\tcasing: Casing,\n): string => {\n\tlet statement = '';\n\n\t// no self refs and no cyclic\n\tconst oneColumnsFKs = Object.values(fks)\n\t\t.filter((it) => {\n\t\t\treturn !isSelf(it);\n\t\t})\n\t\t.filter((it) => it.columnsFrom.length === 1);\n\n\tconst fkByColumnName = oneColumnsFKs.reduce((res, it) => {\n\t\tconst arr = res[it.columnsFrom[0]] || [];\n\t\tarr.push(it);\n\t\tres[it.columnsFrom[0]] = arr;\n\t\treturn res;\n\t}, {} as Record<string, ForeignKey[]>);\n\n\tcolumns.forEach((it) => {\n\t\tstatement += '\\t';\n\t\tstatement += column(it.type, it.name, it.default, it.autoincrement, casing);\n\t\tstatement += it.primaryKey\n\t\t\t? `.primaryKey(${it.autoincrement ? '{ autoIncrement: true }' : ''})`\n\t\t\t: '';\n\t\tstatement += it.notNull ? '.notNull()' : '';\n\n\t\tstatement += it.generated\n\t\t\t? `.generatedAlwaysAs(sql\\`${\n\t\t\t\tit.generated.as\n\t\t\t\t\t.replace(/`/g, '\\\\`')\n\t\t\t\t\t.slice(1, -1)\n\t\t\t}\\`, { mode: \"${it.generated.type}\" })`\n\t\t\t: '';\n\n\t\tconst fks = fkByColumnName[it.name];\n\t\tif (fks) {\n\t\t\tconst fksStatement = fks\n\t\t\t\t.map((it) => {\n\t\t\t\t\tconst onDelete = it.onDelete && it.onDelete !== 'no action' ? it.onDelete : null;\n\t\t\t\t\tconst onUpdate = it.onUpdate && it.onUpdate !== 'no action' ? it.onUpdate : null;\n\t\t\t\t\tconst params = { onDelete, onUpdate };\n\n\t\t\t\t\tconst typeSuffix = isCyclic(it) ? ': AnySQLiteColumn' : '';\n\n\t\t\t\t\tconst paramsStr = objToStatement2(params);\n\t\t\t\t\tif (paramsStr) {\n\t\t\t\t\t\treturn `.references(()${typeSuffix} => ${\n\t\t\t\t\t\t\twithCasing(\n\t\t\t\t\t\t\t\tit.tableTo,\n\t\t\t\t\t\t\t\tcasing,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}.${withCasing(it.columnsTo[0], casing)}, ${paramsStr} )`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `.references(()${typeSuffix} => ${\n\t\t\t\t\t\twithCasing(\n\t\t\t\t\t\t\tit.tableTo,\n\t\t\t\t\t\t\tcasing,\n\t\t\t\t\t\t)\n\t\t\t\t\t}.${withCasing(it.columnsTo[0], casing)})`;\n\t\t\t\t})\n\t\t\t\t.join('');\n\t\t\tstatement += fksStatement;\n\t\t}\n\n\t\tstatement += ',\\n';\n\t});\n\n\treturn statement;\n};\n\nconst createTableIndexes = (\n\ttableName: string,\n\tidxs: Index[],\n\tcasing: Casing,\n): string => {\n\tlet statement = '';\n\n\tidxs.forEach((it) => {\n\t\tlet idxKey = it.name.startsWith(tableName) && it.name !== tableName\n\t\t\t? it.name.slice(tableName.length + 1)\n\t\t\t: it.name;\n\t\tidxKey = idxKey.endsWith('_index')\n\t\t\t? idxKey.slice(0, -'_index'.length) + '_idx'\n\t\t\t: idxKey;\n\n\t\tidxKey = withCasing(idxKey, casing);\n\n\t\tconst indexGeneratedName = indexName(tableName, it.columns);\n\t\tconst escapedIndexName = indexGeneratedName === it.name ? '' : `\"${it.name}\"`;\n\n\t\tstatement += `\\n\\t`;\n\t\tstatement += it.isUnique ? 'uniqueIndex(' : 'index(';\n\t\tstatement += `${escapedIndexName})`;\n\t\tstatement += `.on(${\n\t\t\tit.columns\n\t\t\t\t.map((it) => `table.${withCasing(it, casing)}`)\n\t\t\t\t.join(', ')\n\t\t}),`;\n\t});\n\n\treturn statement;\n};\n\nconst createTableUniques = (\n\tunqs: UniqueConstraint[],\n\tcasing: Casing,\n): string => {\n\tlet statement = '';\n\n\tunqs.forEach((it) => {\n\t\tconst idxKey = withCasing(it.name, casing);\n\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'unique(';\n\t\tstatement += `\"${it.name}\")`;\n\t\tstatement += `.on(${\n\t\t\tit.columns\n\t\t\t\t.map((it) => `table.${withCasing(it, casing)}`)\n\t\t\t\t.join(', ')\n\t\t}),`;\n\t});\n\n\treturn statement;\n};\nconst createTableChecks = (\n\tchecks: CheckConstraint[],\n\tcasing: Casing,\n): string => {\n\tlet statement = '';\n\n\tchecks.forEach((it) => {\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'check(';\n\t\tstatement += `\"${it.name}\", `;\n\t\tstatement += `sql\\`${it.value}\\`)`;\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n\nconst createTablePKs = (pks: PrimaryKey[], casing: Casing): string => {\n\tlet statement = '';\n\n\tpks.forEach((it, i) => {\n\t\tstatement += `\\n\\t`;\n\t\tstatement += 'primaryKey({ columns: [';\n\t\tstatement += `${\n\t\t\tit.columns\n\t\t\t\t.map((c) => {\n\t\t\t\t\treturn `table.${withCasing(c, casing)}`;\n\t\t\t\t})\n\t\t\t\t.join(', ')\n\t\t}]${it.name ? `, name: \"${it.name}\"` : ''}}`;\n\t\tstatement += ')';\n\t});\n\n\treturn statement;\n};\n\nconst createTableFKs = (fks: ForeignKey[], casing: Casing): string => {\n\tlet statement = '';\n\n\tfks.forEach((it) => {\n\t\tconst isSelf = it.tableTo === it.tableFrom;\n\t\tconst tableTo = isSelf ? 'table' : `${withCasing(it.tableTo, casing)}`;\n\t\tstatement += `\\n\\t`;\n\t\tstatement += `foreignKey(() => ({\\n`;\n\t\tstatement += `\\t\\t\\tcolumns: [${\n\t\t\tit.columnsFrom\n\t\t\t\t.map((i) => `table.${withCasing(i, casing)}`)\n\t\t\t\t.join(', ')\n\t\t}],\\n`;\n\t\tstatement += `\\t\\t\\tforeignColumns: [${\n\t\t\tit.columnsTo\n\t\t\t\t.map((i) => `${tableTo}.${withCasing(i, casing)}`)\n\t\t\t\t.join(', ')\n\t\t}],\\n`;\n\t\tstatement += `\\t\\t\\tname: \"${it.name}\"\\n`;\n\t\tstatement += `\\t\\t}))`;\n\n\t\tstatement += it.onUpdate && it.onUpdate !== 'no action'\n\t\t\t? `.onUpdate(\"${it.onUpdate}\")`\n\t\t\t: '';\n\n\t\tstatement += it.onDelete && it.onDelete !== 'no action'\n\t\t\t? `.onDelete(\"${it.onDelete}\")`\n\t\t\t: '';\n\n\t\tstatement += `,`;\n\t});\n\n\treturn statement;\n};\n"
  },
  {
    "path": "drizzle-kit/src/jsonDiffer.js",
    "content": "'use-strict';\nimport { diff } from 'json-diff';\n\nexport function diffForRenamedTables(pairs) {\n\t// raname table1 to name of table2, so we can apply diffs\n\tconst renamed = pairs.map((it) => {\n\t\tconst from = it.from;\n\t\tconst to = it.to;\n\t\tconst newFrom = { ...from, name: to.name };\n\t\treturn [newFrom, to];\n\t});\n\n\t// find any alternations made to a renamed table\n\tconst altered = renamed.map((pair) => {\n\t\treturn diffForRenamedTable(pair[0], pair[1]);\n\t});\n\n\treturn altered;\n}\n\nfunction diffForRenamedTable(t1, t2) {\n\tt1.name = t2.name;\n\tconst diffed = diff(t1, t2) || {};\n\tdiffed.name = t2.name;\n\n\treturn findAlternationsInTable(diffed, t2.schema);\n}\n\nexport function diffForRenamedColumn(t1, t2) {\n\tconst renamed = { ...t1, name: t2.name };\n\tconst diffed = diff(renamed, t2) || {};\n\tdiffed.name = t2.name;\n\n\treturn alternationsInColumn(diffed);\n}\n\nconst update1to2 = (json) => {\n\tObject.entries(json).forEach(([key, val]) => {\n\t\tif ('object' !== typeof val) return;\n\n\t\tif (val.hasOwnProperty('references')) {\n\t\t\tconst ref = val['references'];\n\t\t\tconst fkName = ref['foreignKeyName'];\n\t\t\tconst table = ref['table'];\n\t\t\tconst column = ref['column'];\n\t\t\tconst onDelete = ref['onDelete'];\n\t\t\tconst onUpdate = ref['onUpdate'];\n\t\t\tconst newRef = `${fkName};${table};${column};${onDelete ?? ''};${onUpdate ?? ''}`;\n\t\t\tval['references'] = newRef;\n\t\t} else {\n\t\t\tupdate1to2(val);\n\t\t}\n\t});\n};\n\nconst mapArraysDiff = (source, diff) => {\n\tconst sequence = [];\n\tlet sourceIndex = 0;\n\tfor (let i = 0; i < diff.length; i++) {\n\t\tconst it = diff[i];\n\t\tif (it.length === 1) {\n\t\t\tsequence.push({ type: 'same', value: source[sourceIndex] });\n\t\t\tsourceIndex += 1;\n\t\t} else {\n\t\t\tif (it[0] === '-') {\n\t\t\t\tsequence.push({ type: 'removed', value: it[1] });\n\t\t\t} else {\n\t\t\t\tsequence.push({ type: 'added', value: it[1], before: '' });\n\t\t\t}\n\t\t}\n\t}\n\tconst result = sequence.reverse().reduce(\n\t\t(acc, it) => {\n\t\t\tif (it.type === 'same') {\n\t\t\t\tacc.prev = it.value;\n\t\t\t}\n\n\t\t\tif (it.type === 'added' && acc.prev) {\n\t\t\t\tit.before = acc.prev;\n\t\t\t}\n\t\t\tacc.result.push(it);\n\t\t\treturn acc;\n\t\t},\n\t\t{ result: [] },\n\t);\n\n\treturn result.result.reverse();\n};\n\nexport function diffSchemasOrTables(left, right) {\n\tleft = JSON.parse(JSON.stringify(left));\n\tright = JSON.parse(JSON.stringify(right));\n\n\tconst result = Object.entries(diff(left, right) ?? {});\n\n\tconst added = result\n\t\t.filter((it) => it[0].endsWith('__added'))\n\t\t.map((it) => it[1]);\n\tconst deleted = result\n\t\t.filter((it) => it[0].endsWith('__deleted'))\n\t\t.map((it) => it[1]);\n\n\treturn { added, deleted };\n}\n\nexport function diffIndPolicies(left, right) {\n\tleft = JSON.parse(JSON.stringify(left));\n\tright = JSON.parse(JSON.stringify(right));\n\n\tconst result = Object.entries(diff(left, right) ?? {});\n\n\tconst added = result\n\t\t.filter((it) => it[0].endsWith('__added'))\n\t\t.map((it) => it[1]);\n\tconst deleted = result\n\t\t.filter((it) => it[0].endsWith('__deleted'))\n\t\t.map((it) => it[1]);\n\n\treturn { added, deleted };\n}\n\nexport function diffColumns(left, right) {\n\tleft = JSON.parse(JSON.stringify(left));\n\tright = JSON.parse(JSON.stringify(right));\n\tconst result = diff(left, right) ?? {};\n\n\tconst alteredTables = Object.fromEntries(\n\t\tObject.entries(result)\n\t\t\t.filter((it) => {\n\t\t\t\treturn !(it[0].includes('__added') || it[0].includes('__deleted'));\n\t\t\t})\n\t\t\t.map((tableEntry) => {\n\t\t\t\t// const entry = { name: it, ...result[it] }\n\t\t\t\tconst deletedColumns = Object.entries(tableEntry[1].columns ?? {})\n\t\t\t\t\t.filter((it) => {\n\t\t\t\t\t\treturn it[0].endsWith('__deleted');\n\t\t\t\t\t})\n\t\t\t\t\t.map((it) => {\n\t\t\t\t\t\treturn it[1];\n\t\t\t\t\t});\n\n\t\t\t\tconst addedColumns = Object.entries(tableEntry[1].columns ?? {})\n\t\t\t\t\t.filter((it) => {\n\t\t\t\t\t\treturn it[0].endsWith('__added');\n\t\t\t\t\t})\n\t\t\t\t\t.map((it) => {\n\t\t\t\t\t\treturn it[1];\n\t\t\t\t\t});\n\n\t\t\t\ttableEntry[1].columns = {\n\t\t\t\t\tadded: addedColumns,\n\t\t\t\t\tdeleted: deletedColumns,\n\t\t\t\t};\n\t\t\t\tconst table = left[tableEntry[0]];\n\t\t\t\treturn [\n\t\t\t\t\ttableEntry[0],\n\t\t\t\t\t{ name: table.name, schema: table.schema, ...tableEntry[1] },\n\t\t\t\t];\n\t\t\t}),\n\t);\n\n\treturn alteredTables;\n}\n\nexport function diffPolicies(left, right) {\n\tleft = JSON.parse(JSON.stringify(left));\n\tright = JSON.parse(JSON.stringify(right));\n\tconst result = diff(left, right) ?? {};\n\n\tconst alteredTables = Object.fromEntries(\n\t\tObject.entries(result)\n\t\t\t.filter((it) => {\n\t\t\t\treturn !(it[0].includes('__added') || it[0].includes('__deleted'));\n\t\t\t})\n\t\t\t.map((tableEntry) => {\n\t\t\t\t// const entry = { name: it, ...result[it] }\n\t\t\t\tconst deletedPolicies = Object.entries(tableEntry[1].policies ?? {})\n\t\t\t\t\t.filter((it) => {\n\t\t\t\t\t\treturn it[0].endsWith('__deleted');\n\t\t\t\t\t})\n\t\t\t\t\t.map((it) => {\n\t\t\t\t\t\treturn it[1];\n\t\t\t\t\t});\n\n\t\t\t\tconst addedPolicies = Object.entries(tableEntry[1].policies ?? {})\n\t\t\t\t\t.filter((it) => {\n\t\t\t\t\t\treturn it[0].endsWith('__added');\n\t\t\t\t\t})\n\t\t\t\t\t.map((it) => {\n\t\t\t\t\t\treturn it[1];\n\t\t\t\t\t});\n\n\t\t\t\ttableEntry[1].policies = {\n\t\t\t\t\tadded: addedPolicies,\n\t\t\t\t\tdeleted: deletedPolicies,\n\t\t\t\t};\n\t\t\t\tconst table = left[tableEntry[0]];\n\t\t\t\treturn [\n\t\t\t\t\ttableEntry[0],\n\t\t\t\t\t{ name: table.name, schema: table.schema, ...tableEntry[1] },\n\t\t\t\t];\n\t\t\t}),\n\t);\n\n\treturn alteredTables;\n}\n\nexport function applyJsonDiff(json1, json2) {\n\tjson1 = JSON.parse(JSON.stringify(json1));\n\tjson2 = JSON.parse(JSON.stringify(json2));\n\n\t// deep copy, needed because of the bug in diff library\n\tconst rawDiff = diff(json1, json2);\n\n\tconst difference = JSON.parse(JSON.stringify(rawDiff || {}));\n\tdifference.schemas = difference.schemas || {};\n\tdifference.tables = difference.tables || {};\n\tdifference.enums = difference.enums || {};\n\tdifference.sequences = difference.sequences || {};\n\tdifference.roles = difference.roles || {};\n\tdifference.policies = difference.policies || {};\n\tdifference.views = difference.views || {};\n\n\t// remove added/deleted schemas\n\tconst schemaKeys = Object.keys(difference.schemas);\n\tfor (let key of schemaKeys) {\n\t\tif (key.endsWith('__added') || key.endsWith('__deleted')) {\n\t\t\tdelete difference.schemas[key];\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\t// remove added/deleted tables\n\tconst tableKeys = Object.keys(difference.tables);\n\tfor (let key of tableKeys) {\n\t\tif (key.endsWith('__added') || key.endsWith('__deleted')) {\n\t\t\tdelete difference.tables[key];\n\t\t\tcontinue;\n\t\t}\n\n\t\t// supply table name and schema for altered tables\n\t\tconst table = json1.tables[key];\n\t\tdifference.tables[key] = {\n\t\t\tname: table.name,\n\t\t\tschema: table.schema,\n\t\t\t...difference.tables[key],\n\t\t};\n\t}\n\n\tfor (let [tableKey, tableValue] of Object.entries(difference.tables)) {\n\t\tconst table = difference.tables[tableKey];\n\t\tconst columns = tableValue.columns || {};\n\t\tconst columnKeys = Object.keys(columns);\n\t\tfor (let key of columnKeys) {\n\t\t\tif (key.endsWith('__added') || key.endsWith('__deleted')) {\n\t\t\t\tdelete table.columns[key];\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(columns).length === 0) {\n\t\t\tdelete table['columns'];\n\t\t}\n\n\t\tif (\n\t\t\t'name' in table\n\t\t\t&& 'schema' in table\n\t\t\t&& Object.keys(table).length === 2\n\t\t) {\n\t\t\tdelete difference.tables[tableKey];\n\t\t}\n\t}\n\n\tconst enumsEntries = Object.entries(difference.enums);\n\tconst alteredEnums = enumsEntries\n\t\t.filter((it) => !(it[0].includes('__added') || it[0].includes('__deleted')))\n\t\t.map((it) => {\n\t\t\tconst enumEntry = json1.enums[it[0]];\n\t\t\tconst { name, schema, values } = enumEntry;\n\n\t\t\tconst sequence = mapArraysDiff(values, it[1].values);\n\t\t\tconst addedValues = sequence\n\t\t\t\t.filter((it) => it.type === 'added')\n\t\t\t\t.map((it) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tbefore: it.before,\n\t\t\t\t\t\tvalue: it.value,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\tconst deletedValues = sequence\n\t\t\t\t.filter((it) => it.type === 'removed')\n\t\t\t\t.map((it) => it.value);\n\n\t\t\treturn { name, schema, addedValues, deletedValues };\n\t\t});\n\n\tconst sequencesEntries = Object.entries(difference.sequences);\n\tconst alteredSequences = sequencesEntries\n\t\t.filter((it) => !(it[0].includes('__added') || it[0].includes('__deleted')) && 'values' in it[1])\n\t\t.map((it) => {\n\t\t\treturn json2.sequences[it[0]];\n\t\t});\n\n\tconst rolesEntries = Object.entries(difference.roles);\n\tconst alteredRoles = rolesEntries\n\t\t.filter((it) => !(it[0].includes('__added') || it[0].includes('__deleted')))\n\t\t.map((it) => {\n\t\t\treturn json2.roles[it[0]];\n\t\t});\n\n\tconst policiesEntries = Object.entries(difference.policies);\n\tconst alteredPolicies = policiesEntries\n\t\t.filter((it) => !(it[0].includes('__added') || it[0].includes('__deleted')))\n\t\t.map((it) => {\n\t\t\treturn json2.policies[it[0]];\n\t\t});\n\n\tconst viewsEntries = Object.entries(difference.views);\n\n\tconst alteredViews = viewsEntries.filter((it) => !(it[0].includes('__added') || it[0].includes('__deleted'))).map(\n\t\t([nameWithSchema, view]) => {\n\t\t\tconst deletedWithOption = view.with__deleted;\n\n\t\t\tconst addedWithOption = view.with__added;\n\n\t\t\tconst deletedWith = Object.fromEntries(\n\t\t\t\tObject.entries(view.with || {}).filter((it) => it[0].endsWith('__deleted')).map(([key, value]) => {\n\t\t\t\t\treturn [key.replace('__deleted', ''), value];\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tconst addedWith = Object.fromEntries(\n\t\t\t\tObject.entries(view.with || {}).filter((it) => it[0].endsWith('__added')).map(([key, value]) => {\n\t\t\t\t\treturn [key.replace('__added', ''), value];\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tconst alterWith = Object.fromEntries(\n\t\t\t\tObject.entries(view.with || {}).filter((it) =>\n\t\t\t\t\ttypeof it[1].__old !== 'undefined' && typeof it[1].__new !== 'undefined'\n\t\t\t\t).map(\n\t\t\t\t\t(it) => {\n\t\t\t\t\t\treturn [it[0], it[1].__new];\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst alteredSchema = view.schema;\n\n\t\t\tconst alteredDefinition = view.definition;\n\n\t\t\tconst alteredExisting = view.isExisting;\n\n\t\t\tconst addedTablespace = view.tablespace__added;\n\t\t\tconst droppedTablespace = view.tablespace__deleted;\n\t\t\tconst alterTablespaceTo = view.tablespace;\n\n\t\t\tlet alteredTablespace;\n\t\t\tif (addedTablespace) alteredTablespace = { __new: addedTablespace, __old: 'pg_default' };\n\t\t\tif (droppedTablespace) alteredTablespace = { __new: 'pg_default', __old: droppedTablespace };\n\t\t\tif (alterTablespaceTo) alteredTablespace = alterTablespaceTo;\n\n\t\t\tconst addedUsing = view.using__added;\n\t\t\tconst droppedUsing = view.using__deleted;\n\t\t\tconst alterUsingTo = view.using;\n\n\t\t\tlet alteredUsing;\n\t\t\tif (addedUsing) alteredUsing = { __new: addedUsing, __old: 'heap' };\n\t\t\tif (droppedUsing) alteredUsing = { __new: 'heap', __old: droppedUsing };\n\t\t\tif (alterUsingTo) alteredUsing = alterUsingTo;\n\n\t\t\tconst alteredMeta = view.meta;\n\n\t\t\treturn Object.fromEntries(\n\t\t\t\tObject.entries({\n\t\t\t\t\tname: json2.views[nameWithSchema].name,\n\t\t\t\t\tschema: json2.views[nameWithSchema].schema,\n\t\t\t\t\t// pg\n\t\t\t\t\tdeletedWithOption: deletedWithOption,\n\t\t\t\t\taddedWithOption: addedWithOption,\n\t\t\t\t\tdeletedWith: Object.keys(deletedWith).length ? deletedWith : undefined,\n\t\t\t\t\taddedWith: Object.keys(addedWith).length ? addedWith : undefined,\n\t\t\t\t\talteredWith: Object.keys(alterWith).length ? alterWith : undefined,\n\t\t\t\t\talteredSchema,\n\t\t\t\t\talteredTablespace,\n\t\t\t\t\talteredUsing,\n\t\t\t\t\t// mysql\n\t\t\t\t\talteredMeta,\n\t\t\t\t\t// common\n\t\t\t\t\talteredDefinition,\n\t\t\t\t\talteredExisting,\n\t\t\t\t}).filter(([_, value]) => value !== undefined),\n\t\t\t);\n\t\t},\n\t);\n\n\tconst alteredTablesWithColumns = Object.values(difference.tables).map(\n\t\t(table) => {\n\t\t\treturn findAlternationsInTable(table);\n\t\t},\n\t);\n\n\treturn {\n\t\talteredTablesWithColumns,\n\t\talteredEnums,\n\t\talteredSequences,\n\t\talteredRoles,\n\t\talteredViews,\n\t\talteredPolicies,\n\t};\n}\n\nconst findAlternationsInTable = (table) => {\n\t// map each table to have altered, deleted or renamed columns\n\n\t// in case no columns were altered, but indexes were\n\tconst columns = table.columns ?? {};\n\n\tconst altered = Object.keys(columns)\n\t\t.filter((it) => !(it.includes('__deleted') || it.includes('__added')))\n\t\t.map((it) => {\n\t\t\treturn { name: it, ...columns[it] };\n\t\t});\n\n\tconst deletedIndexes = Object.fromEntries(\n\t\tObject.entries(table.indexes__deleted || {})\n\t\t\t.concat(\n\t\t\t\tObject.entries(table.indexes || {}).filter((it) => it[0].includes('__deleted')),\n\t\t\t)\n\t\t\t.map((entry) => [entry[0].replace('__deleted', ''), entry[1]]),\n\t);\n\n\tconst addedIndexes = Object.fromEntries(\n\t\tObject.entries(table.indexes__added || {})\n\t\t\t.concat(\n\t\t\t\tObject.entries(table.indexes || {}).filter((it) => it[0].includes('__added')),\n\t\t\t)\n\t\t\t.map((entry) => [entry[0].replace('__added', ''), entry[1]]),\n\t);\n\n\tconst alteredIndexes = Object.fromEntries(\n\t\tObject.entries(table.indexes || {}).filter((it) => {\n\t\t\treturn !it[0].endsWith('__deleted') && !it[0].endsWith('__added');\n\t\t}),\n\t);\n\n\tconst deletedPolicies = Object.fromEntries(\n\t\tObject.entries(table.policies__deleted || {})\n\t\t\t.concat(\n\t\t\t\tObject.entries(table.policies || {}).filter((it) => it[0].includes('__deleted')),\n\t\t\t)\n\t\t\t.map((entry) => [entry[0].replace('__deleted', ''), entry[1]]),\n\t);\n\n\tconst addedPolicies = Object.fromEntries(\n\t\tObject.entries(table.policies__added || {})\n\t\t\t.concat(\n\t\t\t\tObject.entries(table.policies || {}).filter((it) => it[0].includes('__added')),\n\t\t\t)\n\t\t\t.map((entry) => [entry[0].replace('__added', ''), entry[1]]),\n\t);\n\n\tconst alteredPolicies = Object.fromEntries(\n\t\tObject.entries(table.policies || {}).filter((it) => {\n\t\t\treturn !it[0].endsWith('__deleted') && !it[0].endsWith('__added');\n\t\t}),\n\t);\n\n\tconst deletedForeignKeys = Object.fromEntries(\n\t\tObject.entries(table.foreignKeys__deleted || {})\n\t\t\t.concat(\n\t\t\t\tObject.entries(table.foreignKeys || {}).filter((it) => it[0].includes('__deleted')),\n\t\t\t)\n\t\t\t.map((entry) => [entry[0].replace('__deleted', ''), entry[1]]),\n\t);\n\n\tconst addedForeignKeys = Object.fromEntries(\n\t\tObject.entries(table.foreignKeys__added || {})\n\t\t\t.concat(\n\t\t\t\tObject.entries(table.foreignKeys || {}).filter((it) => it[0].includes('__added')),\n\t\t\t)\n\t\t\t.map((entry) => [entry[0].replace('__added', ''), entry[1]]),\n\t);\n\n\tconst alteredForeignKeys = Object.fromEntries(\n\t\tObject.entries(table.foreignKeys || {})\n\t\t\t.filter(\n\t\t\t\t(it) => !it[0].endsWith('__added') && !it[0].endsWith('__deleted'),\n\t\t\t)\n\t\t\t.map((entry) => [entry[0], entry[1]]),\n\t);\n\n\tconst addedCompositePKs = Object.fromEntries(\n\t\tObject.entries(table.compositePrimaryKeys || {}).filter((it) => {\n\t\t\treturn it[0].endsWith('__added');\n\t\t}),\n\t);\n\n\tconst deletedCompositePKs = Object.fromEntries(\n\t\tObject.entries(table.compositePrimaryKeys || {}).filter((it) => {\n\t\t\treturn it[0].endsWith('__deleted');\n\t\t}),\n\t);\n\n\tconst alteredCompositePKs = Object.fromEntries(\n\t\tObject.entries(table.compositePrimaryKeys || {}).filter((it) => {\n\t\t\treturn !it[0].endsWith('__deleted') && !it[0].endsWith('__added');\n\t\t}),\n\t);\n\n\tconst addedUniqueConstraints = Object.fromEntries(\n\t\tObject.entries(table.uniqueConstraints || {}).filter((it) => {\n\t\t\treturn it[0].endsWith('__added');\n\t\t}),\n\t);\n\n\tconst deletedUniqueConstraints = Object.fromEntries(\n\t\tObject.entries(table.uniqueConstraints || {}).filter((it) => {\n\t\t\treturn it[0].endsWith('__deleted');\n\t\t}),\n\t);\n\n\tconst alteredUniqueConstraints = Object.fromEntries(\n\t\tObject.entries(table.uniqueConstraints || {}).filter((it) => {\n\t\t\treturn !it[0].endsWith('__deleted') && !it[0].endsWith('__added');\n\t\t}),\n\t);\n\n\tconst addedCheckConstraints = Object.fromEntries(\n\t\tObject.entries(table.checkConstraints || {}).filter((it) => {\n\t\t\treturn it[0].endsWith('__added');\n\t\t}),\n\t);\n\n\tconst deletedCheckConstraints = Object.fromEntries(\n\t\tObject.entries(table.checkConstraints || {}).filter((it) => {\n\t\t\treturn it[0].endsWith('__deleted');\n\t\t}),\n\t);\n\n\tconst alteredCheckConstraints = Object.fromEntries(\n\t\tObject.entries(table.checkConstraints || {}).filter((it) => {\n\t\t\treturn !it[0].endsWith('__deleted') && !it[0].endsWith('__added');\n\t\t}),\n\t);\n\n\tconst mappedAltered = altered.map((it) => alternationsInColumn(it)).filter(Boolean);\n\n\treturn {\n\t\tname: table.name,\n\t\tschema: table.schema || '',\n\t\taltered: mappedAltered,\n\t\taddedIndexes,\n\t\tdeletedIndexes,\n\t\talteredIndexes,\n\t\taddedForeignKeys,\n\t\tdeletedForeignKeys,\n\t\talteredForeignKeys,\n\t\taddedCompositePKs,\n\t\tdeletedCompositePKs,\n\t\talteredCompositePKs,\n\t\taddedUniqueConstraints,\n\t\tdeletedUniqueConstraints,\n\t\talteredUniqueConstraints,\n\t\tdeletedPolicies,\n\t\taddedPolicies,\n\t\talteredPolicies,\n\t\taddedCheckConstraints,\n\t\tdeletedCheckConstraints,\n\t\talteredCheckConstraints,\n\t};\n};\n\nconst alternationsInColumn = (column) => {\n\tconst altered = [column];\n\n\tconst result = altered\n\t\t.filter((it) => {\n\t\t\tif ('type' in it && it.type.__old.replace(' (', '(') === it.type.__new.replace(' (', '(')) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t})\n\t\t.map((it) => {\n\t\t\tif (typeof it.name !== 'string' && '__old' in it.name) {\n\t\t\t\t// rename\n\t\t\t\treturn {\n\t\t\t\t\t...it,\n\t\t\t\t\tname: { type: 'changed', old: it.name.__old, new: it.name.__new },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn it;\n\t\t})\n\t\t.map((it) => {\n\t\t\tif ('type' in it) {\n\t\t\t\t// type change\n\t\t\t\treturn {\n\t\t\t\t\t...it,\n\t\t\t\t\ttype: { type: 'changed', old: it.type.__old, new: it.type.__new },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn it;\n\t\t})\n\t\t.map((it) => {\n\t\t\tif ('default' in it) {\n\t\t\t\treturn {\n\t\t\t\t\t...it,\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\ttype: 'changed',\n\t\t\t\t\t\told: it.default.__old,\n\t\t\t\t\t\tnew: it.default.__new,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('default__added' in it) {\n\t\t\t\tconst { default__added, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tdefault: { type: 'added', value: it.default__added },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('default__deleted' in it) {\n\t\t\t\tconst { default__deleted, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tdefault: { type: 'deleted', value: it.default__deleted },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn it;\n\t\t})\n\t\t.map((it) => {\n\t\t\tif ('generated' in it) {\n\t\t\t\tif ('as' in it.generated && 'type' in it.generated) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...it,\n\t\t\t\t\t\tgenerated: {\n\t\t\t\t\t\t\ttype: 'changed',\n\t\t\t\t\t\t\told: { as: it.generated.as.__old, type: it.generated.type.__old },\n\t\t\t\t\t\t\tnew: { as: it.generated.as.__new, type: it.generated.type.__new },\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t} else if ('as' in it.generated) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...it,\n\t\t\t\t\t\tgenerated: {\n\t\t\t\t\t\t\ttype: 'changed',\n\t\t\t\t\t\t\told: { as: it.generated.as.__old },\n\t\t\t\t\t\t\tnew: { as: it.generated.as.__new },\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...it,\n\t\t\t\t\t\tgenerated: {\n\t\t\t\t\t\t\ttype: 'changed',\n\t\t\t\t\t\t\told: { as: it.generated.type.__old },\n\t\t\t\t\t\t\tnew: { as: it.generated.type.__new },\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ('generated__added' in it) {\n\t\t\t\tconst { generated__added, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tgenerated: { type: 'added', value: it.generated__added },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('generated__deleted' in it) {\n\t\t\t\tconst { generated__deleted, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tgenerated: { type: 'deleted', value: it.generated__deleted },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn it;\n\t\t})\n\t\t.map((it) => {\n\t\t\tif ('identity' in it) {\n\t\t\t\treturn {\n\t\t\t\t\t...it,\n\t\t\t\t\tidentity: {\n\t\t\t\t\t\ttype: 'changed',\n\t\t\t\t\t\told: it.identity.__old,\n\t\t\t\t\t\tnew: it.identity.__new,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('identity__added' in it) {\n\t\t\t\tconst { identity__added, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tidentity: { type: 'added', value: it.identity__added },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('identity__deleted' in it) {\n\t\t\t\tconst { identity__deleted, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tidentity: { type: 'deleted', value: it.identity__deleted },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn it;\n\t\t})\n\t\t.map((it) => {\n\t\t\tif ('notNull' in it) {\n\t\t\t\treturn {\n\t\t\t\t\t...it,\n\t\t\t\t\tnotNull: {\n\t\t\t\t\t\ttype: 'changed',\n\t\t\t\t\t\told: it.notNull.__old,\n\t\t\t\t\t\tnew: it.notNull.__new,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('notNull__added' in it) {\n\t\t\t\tconst { notNull__added, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tnotNull: { type: 'added', value: it.notNull__added },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('notNull__deleted' in it) {\n\t\t\t\tconst { notNull__deleted, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tnotNull: { type: 'deleted', value: it.notNull__deleted },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn it;\n\t\t})\n\t\t.map((it) => {\n\t\t\tif ('primaryKey' in it) {\n\t\t\t\treturn {\n\t\t\t\t\t...it,\n\t\t\t\t\tprimaryKey: {\n\t\t\t\t\t\ttype: 'changed',\n\t\t\t\t\t\told: it.primaryKey.__old,\n\t\t\t\t\t\tnew: it.primaryKey.__new,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('primaryKey__added' in it) {\n\t\t\t\tconst { notNull__added, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tprimaryKey: { type: 'added', value: it.primaryKey__added },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('primaryKey__deleted' in it) {\n\t\t\t\tconst { notNull__deleted, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tprimaryKey: { type: 'deleted', value: it.primaryKey__deleted },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn it;\n\t\t})\n\t\t.map((it) => {\n\t\t\tif ('typeSchema' in it) {\n\t\t\t\treturn {\n\t\t\t\t\t...it,\n\t\t\t\t\ttypeSchema: {\n\t\t\t\t\t\ttype: 'changed',\n\t\t\t\t\t\told: it.typeSchema.__old,\n\t\t\t\t\t\tnew: it.typeSchema.__new,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('typeSchema__added' in it) {\n\t\t\t\tconst { typeSchema__added, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\ttypeSchema: { type: 'added', value: it.typeSchema__added },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('typeSchema__deleted' in it) {\n\t\t\t\tconst { typeSchema__deleted, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\ttypeSchema: { type: 'deleted', value: it.typeSchema__deleted },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn it;\n\t\t})\n\t\t.map((it) => {\n\t\t\tif ('onUpdate' in it) {\n\t\t\t\treturn {\n\t\t\t\t\t...it,\n\t\t\t\t\tonUpdate: {\n\t\t\t\t\t\ttype: 'changed',\n\t\t\t\t\t\told: it.onUpdate.__old,\n\t\t\t\t\t\tnew: it.onUpdate.__new,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('onUpdate__added' in it) {\n\t\t\t\tconst { onUpdate__added, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tonUpdate: { type: 'added', value: it.onUpdate__added },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('onUpdate__deleted' in it) {\n\t\t\t\tconst { onUpdate__deleted, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tonUpdate: { type: 'deleted', value: it.onUpdate__deleted },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn it;\n\t\t})\n\t\t.map((it) => {\n\t\t\tif ('autoincrement' in it) {\n\t\t\t\treturn {\n\t\t\t\t\t...it,\n\t\t\t\t\tautoincrement: {\n\t\t\t\t\t\ttype: 'changed',\n\t\t\t\t\t\told: it.autoincrement.__old,\n\t\t\t\t\t\tnew: it.autoincrement.__new,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('autoincrement__added' in it) {\n\t\t\t\tconst { autoincrement__added, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tautoincrement: { type: 'added', value: it.autoincrement__added },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('autoincrement__deleted' in it) {\n\t\t\t\tconst { autoincrement__deleted, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tautoincrement: { type: 'deleted', value: it.autoincrement__deleted },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn it;\n\t\t})\n\t\t.map((it) => {\n\t\t\tif ('' in it) {\n\t\t\t\treturn {\n\t\t\t\t\t...it,\n\t\t\t\t\tautoincrement: {\n\t\t\t\t\t\ttype: 'changed',\n\t\t\t\t\t\told: it.autoincrement.__old,\n\t\t\t\t\t\tnew: it.autoincrement.__new,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('autoincrement__added' in it) {\n\t\t\t\tconst { autoincrement__added, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tautoincrement: { type: 'added', value: it.autoincrement__added },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ('autoincrement__deleted' in it) {\n\t\t\t\tconst { autoincrement__deleted, ...others } = it;\n\t\t\t\treturn {\n\t\t\t\t\t...others,\n\t\t\t\t\tautoincrement: { type: 'deleted', value: it.autoincrement__deleted },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn it;\n\t\t})\n\t\t.filter(Boolean);\n\n\treturn result[0];\n};\n"
  },
  {
    "path": "drizzle-kit/src/jsonStatements.ts",
    "content": "import chalk from 'chalk';\nimport { getNewTableName } from './cli/commands/sqlitePushUtils';\nimport { warning } from './cli/views';\nimport { CommonSquashedSchema } from './schemaValidator';\nimport { MySqlKitInternals, MySqlSchema, MySqlSquasher, View as MySqlView } from './serializer/mysqlSchema';\nimport {\n\tIndex,\n\tMatViewWithOption,\n\tPgSchema,\n\tPgSchemaSquashed,\n\tPgSquasher,\n\tPolicy,\n\tRole,\n\tView as PgView,\n\tViewWithOption,\n} from './serializer/pgSchema';\nimport { SingleStoreKitInternals, SingleStoreSchema, SingleStoreSquasher } from './serializer/singlestoreSchema';\nimport {\n\tSQLiteKitInternals,\n\tSQLiteSchemaInternal,\n\tSQLiteSchemaSquashed,\n\tSQLiteSquasher,\n\tView as SqliteView,\n} from './serializer/sqliteSchema';\nimport { AlteredColumn, Column, Sequence, Table } from './snapshotsDiffer';\n\nexport interface JsonSqliteCreateTableStatement {\n\ttype: 'sqlite_create_table';\n\ttableName: string;\n\tcolumns: Column[];\n\treferenceData: {\n\t\tname: string;\n\t\ttableFrom: string;\n\t\tcolumnsFrom: string[];\n\t\ttableTo: string;\n\t\tcolumnsTo: string[];\n\t\tonUpdate?: string | undefined;\n\t\tonDelete?: string | undefined;\n\t}[];\n\tcompositePKs: string[][];\n\tuniqueConstraints?: string[];\n\tcheckConstraints?: string[];\n}\n\nexport interface JsonCreateTableStatement {\n\ttype: 'create_table';\n\ttableName: string;\n\tschema: string;\n\tcolumns: Column[];\n\tcompositePKs: string[];\n\tcompositePkName?: string;\n\tuniqueConstraints?: string[];\n\tpolicies?: string[];\n\tcheckConstraints?: string[];\n\tinternals?: MySqlKitInternals | SingleStoreKitInternals;\n\tisRLSEnabled?: boolean;\n}\n\nexport interface JsonRecreateTableStatement {\n\ttype: 'recreate_table';\n\ttableName: string;\n\tcolumns: Column[];\n\treferenceData: {\n\t\tname: string;\n\t\ttableFrom: string;\n\t\tcolumnsFrom: string[];\n\t\ttableTo: string;\n\t\tcolumnsTo: string[];\n\t\tonUpdate?: string | undefined;\n\t\tonDelete?: string | undefined;\n\t}[];\n\tcompositePKs: string[][];\n\tuniqueConstraints?: string[];\n\tcheckConstraints: string[];\n}\n\nexport interface JsonRecreateSingleStoreTableStatement {\n\ttype: 'singlestore_recreate_table';\n\ttableName: string;\n\tcolumns: Column[];\n\tcompositePKs: string[];\n\tuniqueConstraints?: string[];\n}\n\nexport interface JsonDropTableStatement {\n\ttype: 'drop_table';\n\ttableName: string;\n\tschema: string;\n\tpolicies?: string[];\n}\n\nexport interface JsonRenameTableStatement {\n\ttype: 'rename_table';\n\tfromSchema: string;\n\ttoSchema: string;\n\ttableNameFrom: string;\n\ttableNameTo: string;\n}\n\nexport interface JsonCreateEnumStatement {\n\ttype: 'create_type_enum';\n\tname: string;\n\tschema: string;\n\tvalues: string[];\n}\n\nexport interface JsonDropEnumStatement {\n\ttype: 'drop_type_enum';\n\tname: string;\n\tschema: string;\n}\n\nexport interface JsonMoveEnumStatement {\n\ttype: 'move_type_enum';\n\tname: string;\n\tschemaFrom: string;\n\tschemaTo: string;\n}\n\nexport interface JsonRenameEnumStatement {\n\ttype: 'rename_type_enum';\n\tnameFrom: string;\n\tnameTo: string;\n\tschema: string;\n}\n\nexport interface JsonAddValueToEnumStatement {\n\ttype: 'alter_type_add_value';\n\tname: string;\n\tschema: string;\n\tvalue: string;\n\tbefore: string;\n}\n\n//////\n\nexport interface JsonCreateRoleStatement {\n\ttype: 'create_role';\n\tname: string;\n\tvalues: {\n\t\tinherit?: boolean;\n\t\tcreateDb?: boolean;\n\t\tcreateRole?: boolean;\n\t};\n}\n\nexport interface JsonDropRoleStatement {\n\ttype: 'drop_role';\n\tname: string;\n}\nexport interface JsonRenameRoleStatement {\n\ttype: 'rename_role';\n\tnameFrom: string;\n\tnameTo: string;\n}\n\nexport interface JsonAlterRoleStatement {\n\ttype: 'alter_role';\n\tname: string;\n\tvalues: {\n\t\tinherit?: boolean;\n\t\tcreateDb?: boolean;\n\t\tcreateRole?: boolean;\n\t};\n}\n\n//////\n\nexport interface JsonDropValueFromEnumStatement {\n\ttype: 'alter_type_drop_value';\n\tname: string;\n\tenumSchema: string;\n\tdeletedValues: string[];\n\tnewValues: string[];\n\tcolumnsWithEnum: { tableSchema: string; table: string; column: string; default?: string; columnType: string }[];\n}\n\nexport interface JsonCreateSequenceStatement {\n\ttype: 'create_sequence';\n\tname: string;\n\tschema: string;\n\tvalues: {\n\t\tincrement?: string | undefined;\n\t\tminValue?: string | undefined;\n\t\tmaxValue?: string | undefined;\n\t\tstartWith?: string | undefined;\n\t\tcache?: string | undefined;\n\t\tcycle?: boolean | undefined;\n\t};\n}\n\nexport interface JsonDropSequenceStatement {\n\ttype: 'drop_sequence';\n\tname: string;\n\tschema: string;\n}\n\nexport interface JsonMoveSequenceStatement {\n\ttype: 'move_sequence';\n\tname: string;\n\tschemaFrom: string;\n\tschemaTo: string;\n}\n\nexport interface JsonRenameSequenceStatement {\n\ttype: 'rename_sequence';\n\tnameFrom: string;\n\tnameTo: string;\n\tschema: string;\n}\n\nexport interface JsonAlterSequenceStatement {\n\ttype: 'alter_sequence';\n\tname: string;\n\tschema: string;\n\tvalues: {\n\t\tincrement?: string | undefined;\n\t\tminValue?: string | undefined;\n\t\tmaxValue?: string | undefined;\n\t\tstartWith?: string | undefined;\n\t\tcache?: string | undefined;\n\t\tcycle?: boolean | undefined;\n\t};\n}\n\nexport interface JsonDropColumnStatement {\n\ttype: 'alter_table_drop_column';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n}\n\nexport interface JsonAddColumnStatement {\n\ttype: 'alter_table_add_column';\n\ttableName: string;\n\tcolumn: Column;\n\tschema: string;\n}\n\nexport interface JsonSqliteAddColumnStatement {\n\ttype: 'sqlite_alter_table_add_column';\n\ttableName: string;\n\tcolumn: Column;\n\treferenceData?: string;\n}\n\nexport interface JsonCreatePolicyStatement {\n\ttype: 'create_policy';\n\ttableName: string;\n\tdata: Policy;\n\tschema: string;\n}\n\nexport interface JsonCreateIndPolicyStatement {\n\ttype: 'create_ind_policy';\n\ttableName: string;\n\tdata: Policy;\n}\n\nexport interface JsonDropPolicyStatement {\n\ttype: 'drop_policy';\n\ttableName: string;\n\tdata: Policy;\n\tschema: string;\n}\n\nexport interface JsonDropIndPolicyStatement {\n\ttype: 'drop_ind_policy';\n\ttableName: string;\n\tdata: Policy;\n}\n\nexport interface JsonRenamePolicyStatement {\n\ttype: 'rename_policy';\n\ttableName: string;\n\toldName: string;\n\tnewName: string;\n\tschema: string;\n}\n\nexport interface JsonIndRenamePolicyStatement {\n\ttype: 'rename_ind_policy';\n\ttableKey: string;\n\toldName: string;\n\tnewName: string;\n}\n\nexport interface JsonEnableRLSStatement {\n\ttype: 'enable_rls';\n\ttableName: string;\n\tschema: string;\n}\n\nexport interface JsonDisableRLSStatement {\n\ttype: 'disable_rls';\n\ttableName: string;\n\tschema: string;\n}\n\nexport interface JsonAlterPolicyStatement {\n\ttype: 'alter_policy';\n\ttableName: string;\n\toldData: string;\n\tnewData: string;\n\tschema: string;\n}\n\nexport interface JsonAlterIndPolicyStatement {\n\ttype: 'alter_ind_policy';\n\toldData: Policy;\n\tnewData: Policy;\n}\n\nexport interface JsonCreateIndexStatement {\n\ttype: 'create_index';\n\ttableName: string;\n\tdata: string;\n\tschema: string;\n\tinternal?: MySqlKitInternals | SQLiteKitInternals | SingleStoreKitInternals;\n}\n\nexport interface JsonPgCreateIndexStatement {\n\ttype: 'create_index_pg';\n\ttableName: string;\n\tdata: Index;\n\tschema: string;\n}\n\nexport interface JsonReferenceStatement {\n\ttype: 'create_reference' | 'alter_reference' | 'delete_reference';\n\tdata: string;\n\tschema: string;\n\ttableName: string;\n\tisMulticolumn?: boolean;\n\tcolumnNotNull?: boolean;\n\tcolumnDefault?: string;\n\tcolumnType?: string;\n\t//   fromTable: string;\n\t//   fromColumns: string[];\n\t//   toTable: string;\n\t//   toColumns: string[];\n\t//   foreignKeyName: string;\n\t//   onDelete?: string;\n\t//   onUpdate?: string;\n}\n\nexport interface JsonCreateUniqueConstraint {\n\ttype: 'create_unique_constraint';\n\ttableName: string;\n\tdata: string;\n\tschema?: string;\n\tconstraintName?: string;\n}\n\nexport interface JsonDeleteUniqueConstraint {\n\ttype: 'delete_unique_constraint';\n\ttableName: string;\n\tdata: string;\n\tschema?: string;\n\tconstraintName?: string;\n}\n\nexport interface JsonAlterUniqueConstraint {\n\ttype: 'alter_unique_constraint';\n\ttableName: string;\n\told: string;\n\tnew: string;\n\tschema?: string;\n\toldConstraintName?: string;\n\tnewConstraintName?: string;\n}\n\nexport interface JsonCreateCheckConstraint {\n\ttype: 'create_check_constraint';\n\ttableName: string;\n\tdata: string;\n\tschema?: string;\n}\n\nexport interface JsonDeleteCheckConstraint {\n\ttype: 'delete_check_constraint';\n\ttableName: string;\n\tconstraintName: string;\n\tschema?: string;\n}\n\nexport interface JsonCreateCompositePK {\n\ttype: 'create_composite_pk';\n\ttableName: string;\n\tdata: string;\n\tschema?: string;\n\tconstraintName?: string;\n}\n\nexport interface JsonDeleteCompositePK {\n\ttype: 'delete_composite_pk';\n\ttableName: string;\n\tdata: string;\n\tschema?: string;\n\tconstraintName?: string;\n}\n\nexport interface JsonAlterCompositePK {\n\ttype: 'alter_composite_pk';\n\ttableName: string;\n\told: string;\n\tnew: string;\n\tschema?: string;\n\toldConstraintName?: string;\n\tnewConstraintName?: string;\n}\n\nexport interface JsonAlterTableSetSchema {\n\ttype: 'alter_table_set_schema';\n\ttableName: string;\n\tschemaFrom: string;\n\tschemaTo: string;\n}\n\nexport interface JsonAlterTableRemoveFromSchema {\n\ttype: 'alter_table_remove_from_schema';\n\ttableName: string;\n\tschema: string;\n}\n\nexport interface JsonAlterTableSetNewSchema {\n\ttype: 'alter_table_set_new_schema';\n\ttableName: string;\n\tfrom: string;\n\tto: string;\n}\n\nexport interface JsonCreateReferenceStatement extends JsonReferenceStatement {\n\ttype: 'create_reference';\n}\n\nexport interface JsonAlterReferenceStatement extends JsonReferenceStatement {\n\ttype: 'alter_reference';\n\toldFkey: string;\n}\n\nexport interface JsonDeleteReferenceStatement extends JsonReferenceStatement {\n\ttype: 'delete_reference';\n}\n\nexport interface JsonDropIndexStatement {\n\ttype: 'drop_index';\n\ttableName: string;\n\tdata: string;\n\tschema: string;\n}\n\nexport interface JsonRenameColumnStatement {\n\ttype: 'alter_table_rename_column';\n\ttableName: string;\n\toldColumnName: string;\n\tnewColumnName: string;\n\tschema: string;\n}\n\nexport interface JsonAlterColumnTypeStatement {\n\ttype: 'alter_table_alter_column_set_type';\n\ttableName: string;\n\tcolumnName: string;\n\tnewDataType: string;\n\toldDataType: string;\n\tschema: string;\n\tcolumnDefault: string;\n\tcolumnOnUpdate: boolean;\n\tcolumnNotNull: boolean;\n\tcolumnAutoIncrement: boolean;\n\tcolumnPk: boolean;\n\tcolumnGenerated?: { as: string; type: 'stored' | 'virtual' };\n}\n\nexport interface JsonAlterColumnPgTypeStatement {\n\ttype: 'pg_alter_table_alter_column_set_type';\n\ttableName: string;\n\tcolumnName: string;\n\ttypeSchema: string | undefined;\n\tnewDataType: { name: string; isEnum: boolean };\n\toldDataType: { name: string; isEnum: boolean };\n\tschema: string;\n\tcolumnDefault: string;\n\tcolumnOnUpdate: boolean;\n\tcolumnNotNull: boolean;\n\tcolumnAutoIncrement: boolean;\n\tcolumnPk: boolean;\n\tcolumnGenerated?: { as: string; type: 'stored' | 'virtual' };\n}\n\nexport interface JsonAlterColumnSetPrimaryKeyStatement {\n\ttype: 'alter_table_alter_column_set_pk';\n\ttableName: string;\n\tschema: string;\n\tcolumnName: string;\n}\n\nexport interface JsonAlterColumnDropPrimaryKeyStatement {\n\ttype: 'alter_table_alter_column_drop_pk';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n}\n\nexport interface JsonAlterColumnSetDefaultStatement {\n\ttype: 'alter_table_alter_column_set_default';\n\ttableName: string;\n\tcolumnName: string;\n\tnewDefaultValue: any;\n\toldDefaultValue?: any;\n\tschema: string;\n\tnewDataType: string;\n\tcolumnOnUpdate: boolean;\n\tcolumnNotNull: boolean;\n\tcolumnAutoIncrement: boolean;\n\tcolumnPk: boolean;\n}\n\nexport interface JsonAlterColumnDropDefaultStatement {\n\ttype: 'alter_table_alter_column_drop_default';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n\tnewDataType: string;\n\tcolumnDefault: string;\n\tcolumnOnUpdate: boolean;\n\tcolumnNotNull: boolean;\n\tcolumnAutoIncrement: boolean;\n\tcolumnPk: boolean;\n}\n\nexport interface JsonAlterColumnSetNotNullStatement {\n\ttype: 'alter_table_alter_column_set_notnull';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n\tnewDataType: string;\n\tcolumnDefault: string;\n\tcolumnOnUpdate: boolean;\n\tcolumnNotNull: boolean;\n\tcolumnAutoIncrement: boolean;\n\tcolumnPk: boolean;\n}\n\nexport interface JsonAlterColumnDropNotNullStatement {\n\ttype: 'alter_table_alter_column_drop_notnull';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n\tnewDataType: string;\n\tcolumnDefault: string;\n\tcolumnOnUpdate: boolean;\n\tcolumnNotNull: boolean;\n\tcolumnAutoIncrement: boolean;\n\tcolumnPk: boolean;\n}\n\nexport interface JsonAlterColumnSetGeneratedStatement {\n\ttype: 'alter_table_alter_column_set_generated';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n\tnewDataType: string;\n\tcolumnDefault: string;\n\tcolumnOnUpdate: boolean;\n\tcolumnNotNull: boolean;\n\tcolumnAutoIncrement: boolean;\n\tcolumnPk: boolean;\n\tcolumnGenerated?: { as: string; type: 'stored' | 'virtual' };\n}\nexport interface JsonAlterColumnSetIdentityStatement {\n\ttype: 'alter_table_alter_column_set_identity';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n\tidentity: string;\n}\n\nexport interface JsonAlterColumnDropIdentityStatement {\n\ttype: 'alter_table_alter_column_drop_identity';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n}\n\nexport interface JsonAlterColumnAlterIdentityStatement {\n\ttype: 'alter_table_alter_column_change_identity';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n\tidentity: string;\n\toldIdentity: string;\n}\n\nexport interface JsonAlterColumnDropGeneratedStatement {\n\ttype: 'alter_table_alter_column_drop_generated';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n\tnewDataType: string;\n\tcolumnDefault: string;\n\tcolumnOnUpdate: boolean;\n\tcolumnNotNull: boolean;\n\tcolumnAutoIncrement: boolean;\n\tcolumnPk: boolean;\n\tcolumnGenerated?: { as: string; type: 'stored' | 'virtual' };\n\toldColumn?: Column;\n}\n\nexport interface JsonAlterColumnAlterGeneratedStatement {\n\ttype: 'alter_table_alter_column_alter_generated';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n\tnewDataType: string;\n\tcolumnDefault: string;\n\tcolumnOnUpdate: boolean;\n\tcolumnNotNull: boolean;\n\tcolumnAutoIncrement: boolean;\n\tcolumnPk: boolean;\n\tcolumnGenerated?: { as: string; type: 'stored' | 'virtual' };\n}\n\nexport interface JsonAlterColumnSetOnUpdateStatement {\n\ttype: 'alter_table_alter_column_set_on_update';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n\tnewDataType: string;\n\tcolumnDefault: string;\n\tcolumnOnUpdate: boolean;\n\tcolumnNotNull: boolean;\n\tcolumnAutoIncrement: boolean;\n\tcolumnPk: boolean;\n}\n\nexport interface JsonAlterColumnDropOnUpdateStatement {\n\ttype: 'alter_table_alter_column_drop_on_update';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n\tnewDataType: string;\n\tcolumnDefault: string;\n\tcolumnOnUpdate: boolean;\n\tcolumnNotNull: boolean;\n\tcolumnAutoIncrement: boolean;\n\tcolumnPk: boolean;\n}\n\nexport interface JsonAlterColumnSetAutoincrementStatement {\n\ttype: 'alter_table_alter_column_set_autoincrement';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n\tnewDataType: string;\n\tcolumnDefault: string;\n\tcolumnOnUpdate: boolean;\n\tcolumnNotNull: boolean;\n\tcolumnAutoIncrement: boolean;\n\tcolumnPk: boolean;\n}\n\nexport interface JsonAlterColumnDropAutoincrementStatement {\n\ttype: 'alter_table_alter_column_drop_autoincrement';\n\ttableName: string;\n\tcolumnName: string;\n\tschema: string;\n\tnewDataType: string;\n\tcolumnDefault: string;\n\tcolumnOnUpdate: boolean;\n\tcolumnNotNull: boolean;\n\tcolumnAutoIncrement: boolean;\n\tcolumnPk: boolean;\n}\n\nexport interface JsonCreateSchema {\n\ttype: 'create_schema';\n\tname: string;\n}\n\nexport interface JsonDropSchema {\n\ttype: 'drop_schema';\n\tname: string;\n}\n\nexport interface JsonRenameSchema {\n\ttype: 'rename_schema';\n\tfrom: string;\n\tto: string;\n}\n\nexport type JsonCreatePgViewStatement = {\n\ttype: 'create_view';\n} & Omit<PgView, 'columns' | 'isExisting'>;\n\nexport type JsonCreateMySqlViewStatement = {\n\ttype: 'mysql_create_view';\n\treplace: boolean;\n} & Omit<MySqlView, 'columns' | 'isExisting'>;\n\n/* export type JsonCreateSingleStoreViewStatement = {\n\ttype: 'singlestore_create_view';\n\treplace: boolean;\n} & Omit<SingleStoreView, 'columns' | 'isExisting'>; */\n\nexport type JsonCreateSqliteViewStatement = {\n\ttype: 'sqlite_create_view';\n} & Omit<SqliteView, 'columns' | 'isExisting'>;\n\nexport interface JsonDropViewStatement {\n\ttype: 'drop_view';\n\tname: string;\n\tschema?: string;\n\tmaterialized?: boolean;\n}\n\nexport interface JsonRenameViewStatement {\n\ttype: 'rename_view';\n\tnameTo: string;\n\tnameFrom: string;\n\tschema: string;\n\tmaterialized?: boolean;\n}\n\nexport interface JsonRenameMySqlViewStatement {\n\ttype: 'rename_view';\n\tnameTo: string;\n\tnameFrom: string;\n\tschema: string;\n\tmaterialized?: boolean;\n}\n\nexport interface JsonAlterViewAlterSchemaStatement {\n\ttype: 'alter_view_alter_schema';\n\tfromSchema: string;\n\ttoSchema: string;\n\tname: string;\n\tmaterialized?: boolean;\n}\n\nexport type JsonAlterViewAddWithOptionStatement =\n\t& {\n\t\ttype: 'alter_view_add_with_option';\n\t\tschema: string;\n\t\tname: string;\n\t}\n\t& ({\n\t\tmaterialized: true;\n\t\twith: MatViewWithOption;\n\t} | {\n\t\tmaterialized: false;\n\t\twith: ViewWithOption;\n\t});\n\nexport type JsonAlterViewDropWithOptionStatement =\n\t& {\n\t\ttype: 'alter_view_drop_with_option';\n\t\tschema: string;\n\t\tname: string;\n\t}\n\t& ({\n\t\tmaterialized: true;\n\t\twith: MatViewWithOption;\n\t} | {\n\t\tmaterialized: false;\n\t\twith: ViewWithOption;\n\t});\n\nexport interface JsonAlterViewAlterTablespaceStatement {\n\ttype: 'alter_view_alter_tablespace';\n\ttoTablespace: string;\n\tname: string;\n\tschema: string;\n\tmaterialized: true;\n}\n\nexport interface JsonAlterViewAlterUsingStatement {\n\ttype: 'alter_view_alter_using';\n\ttoUsing: string;\n\tname: string;\n\tschema: string;\n\tmaterialized: true;\n}\n\nexport type JsonAlterMySqlViewStatement = {\n\ttype: 'alter_mysql_view';\n} & Omit<MySqlView, 'isExisting'>;\n\n/* export type JsonAlterSingleStoreViewStatement = {\n\ttype: 'alter_singlestore_view';\n} & Omit<SingleStoreView, 'isExisting'>; */\n\nexport type JsonAlterViewStatement =\n\t| JsonAlterViewAlterSchemaStatement\n\t| JsonAlterViewAddWithOptionStatement\n\t| JsonAlterViewDropWithOptionStatement\n\t| JsonAlterViewAlterTablespaceStatement\n\t| JsonAlterViewAlterUsingStatement;\n\nexport type JsonAlterColumnStatement =\n\t| JsonRenameColumnStatement\n\t| JsonAlterColumnTypeStatement\n\t| JsonAlterColumnPgTypeStatement\n\t| JsonAlterColumnSetDefaultStatement\n\t| JsonAlterColumnDropDefaultStatement\n\t| JsonAlterColumnSetNotNullStatement\n\t| JsonAlterColumnDropNotNullStatement\n\t| JsonAlterColumnDropOnUpdateStatement\n\t| JsonAlterColumnSetOnUpdateStatement\n\t| JsonAlterColumnDropAutoincrementStatement\n\t| JsonAlterColumnSetAutoincrementStatement\n\t| JsonAlterColumnSetPrimaryKeyStatement\n\t| JsonAlterColumnDropPrimaryKeyStatement\n\t| JsonAlterColumnSetGeneratedStatement\n\t| JsonAlterColumnDropGeneratedStatement\n\t| JsonAlterColumnAlterGeneratedStatement\n\t| JsonAlterColumnSetIdentityStatement\n\t| JsonAlterColumnAlterIdentityStatement\n\t| JsonAlterColumnDropIdentityStatement;\n\nexport type JsonStatement =\n\t| JsonRecreateSingleStoreTableStatement\n\t| JsonRecreateTableStatement\n\t| JsonAlterColumnStatement\n\t| JsonCreateTableStatement\n\t| JsonDropTableStatement\n\t| JsonRenameTableStatement\n\t| JsonCreateEnumStatement\n\t| JsonDropEnumStatement\n\t| JsonMoveEnumStatement\n\t| JsonRenameEnumStatement\n\t| JsonAddValueToEnumStatement\n\t| JsonDropColumnStatement\n\t| JsonAddColumnStatement\n\t| JsonCreateIndexStatement\n\t| JsonCreateReferenceStatement\n\t| JsonAlterReferenceStatement\n\t| JsonDeleteReferenceStatement\n\t| JsonDropIndexStatement\n\t| JsonReferenceStatement\n\t| JsonSqliteCreateTableStatement\n\t| JsonSqliteAddColumnStatement\n\t| JsonCreateCompositePK\n\t| JsonDeleteCompositePK\n\t| JsonAlterCompositePK\n\t| JsonCreateUniqueConstraint\n\t| JsonDeleteUniqueConstraint\n\t| JsonAlterUniqueConstraint\n\t| JsonCreateSchema\n\t| JsonDropSchema\n\t| JsonRenameSchema\n\t| JsonAlterTableSetSchema\n\t| JsonAlterTableRemoveFromSchema\n\t| JsonAlterTableSetNewSchema\n\t| JsonPgCreateIndexStatement\n\t| JsonAlterSequenceStatement\n\t| JsonDropSequenceStatement\n\t| JsonCreateSequenceStatement\n\t| JsonMoveSequenceStatement\n\t| JsonRenameSequenceStatement\n\t| JsonDropPolicyStatement\n\t| JsonCreatePolicyStatement\n\t| JsonAlterPolicyStatement\n\t| JsonRenamePolicyStatement\n\t| JsonEnableRLSStatement\n\t| JsonDisableRLSStatement\n\t| JsonRenameRoleStatement\n\t| JsonCreateRoleStatement\n\t| JsonDropRoleStatement\n\t| JsonAlterRoleStatement\n\t| JsonCreatePgViewStatement\n\t| JsonDropViewStatement\n\t| JsonRenameViewStatement\n\t| JsonAlterViewStatement\n\t| JsonCreateMySqlViewStatement\n\t| JsonAlterMySqlViewStatement\n\t/* | JsonCreateSingleStoreViewStatement\n\t| JsonAlterSingleStoreViewStatement */\n\t| JsonCreateSqliteViewStatement\n\t| JsonCreateCheckConstraint\n\t| JsonDeleteCheckConstraint\n\t| JsonDropValueFromEnumStatement\n\t| JsonIndRenamePolicyStatement\n\t| JsonDropIndPolicyStatement\n\t| JsonCreateIndPolicyStatement\n\t| JsonAlterIndPolicyStatement;\n\nexport const preparePgCreateTableJson = (\n\ttable: Table,\n\t// TODO: remove?\n\tjson2: PgSchema,\n): JsonCreateTableStatement => {\n\tconst { name, schema, columns, compositePrimaryKeys, uniqueConstraints, checkConstraints, policies, isRLSEnabled } =\n\t\ttable;\n\tconst tableKey = `${schema || 'public'}.${name}`;\n\n\t// TODO: @AndriiSherman. We need this, will add test cases\n\tconst compositePkName = Object.values(compositePrimaryKeys).length > 0\n\t\t? json2.tables[tableKey].compositePrimaryKeys[\n\t\t\t`${PgSquasher.unsquashPK(Object.values(compositePrimaryKeys)[0]).name}`\n\t\t].name\n\t\t: '';\n\n\treturn {\n\t\ttype: 'create_table',\n\t\ttableName: name,\n\t\tschema,\n\t\tcolumns: Object.values(columns),\n\t\tcompositePKs: Object.values(compositePrimaryKeys),\n\t\tcompositePkName: compositePkName,\n\t\tuniqueConstraints: Object.values(uniqueConstraints),\n\t\tpolicies: Object.values(policies),\n\t\tcheckConstraints: Object.values(checkConstraints),\n\t\tisRLSEnabled: isRLSEnabled ?? false,\n\t};\n};\n\nexport const prepareMySqlCreateTableJson = (\n\ttable: Table,\n\t// TODO: remove?\n\tjson2: MySqlSchema,\n\t// we need it to know if some of the indexes(and in future other parts) are expressions or columns\n\t// didn't change mysqlserialaizer, because it will break snapshots and diffs and it's hard to detect\n\t// if previously it was an expression or column\n\tinternals: MySqlKitInternals,\n): JsonCreateTableStatement => {\n\tconst { name, schema, columns, compositePrimaryKeys, uniqueConstraints, checkConstraints } = table;\n\n\treturn {\n\t\ttype: 'create_table',\n\t\ttableName: name,\n\t\tschema,\n\t\tcolumns: Object.values(columns),\n\t\tcompositePKs: Object.values(compositePrimaryKeys),\n\t\tcompositePkName: Object.values(compositePrimaryKeys).length > 0\n\t\t\t? json2.tables[name].compositePrimaryKeys[\n\t\t\t\tMySqlSquasher.unsquashPK(Object.values(compositePrimaryKeys)[0])\n\t\t\t\t\t.name\n\t\t\t].name\n\t\t\t: '',\n\t\tuniqueConstraints: Object.values(uniqueConstraints),\n\t\tinternals,\n\t\tcheckConstraints: Object.values(checkConstraints),\n\t};\n};\n\nexport const prepareSingleStoreCreateTableJson = (\n\ttable: Table,\n\t// TODO: remove?\n\tjson2: SingleStoreSchema,\n\t// we need it to know if some of the indexes(and in future other parts) are expressions or columns\n\t// didn't change singlestoreserialaizer, because it will break snapshots and diffs and it's hard to detect\n\t// if previously it was an expression or column\n\tinternals: SingleStoreKitInternals,\n): JsonCreateTableStatement => {\n\tconst { name, schema, columns, compositePrimaryKeys, uniqueConstraints } = table;\n\n\treturn {\n\t\ttype: 'create_table',\n\t\ttableName: name,\n\t\tschema,\n\t\tcolumns: Object.values(columns),\n\t\tcompositePKs: Object.values(compositePrimaryKeys),\n\t\tcompositePkName: Object.values(compositePrimaryKeys).length > 0\n\t\t\t? json2.tables[name].compositePrimaryKeys[\n\t\t\t\tSingleStoreSquasher.unsquashPK(Object.values(compositePrimaryKeys)[0])\n\t\t\t\t\t.name\n\t\t\t].name\n\t\t\t: '',\n\t\tuniqueConstraints: Object.values(uniqueConstraints),\n\t\tinternals,\n\t};\n};\n\nexport const prepareSQLiteCreateTable = (\n\ttable: Table,\n\taction?: 'push' | undefined,\n): JsonSqliteCreateTableStatement => {\n\tconst { name, columns, uniqueConstraints, checkConstraints } = table;\n\n\tconst references: string[] = Object.values(table.foreignKeys);\n\n\tconst composites: string[][] = Object.values(table.compositePrimaryKeys).map(\n\t\t(it) => SQLiteSquasher.unsquashPK(it),\n\t);\n\n\tconst fks = references.map((it) =>\n\t\taction === 'push'\n\t\t\t? SQLiteSquasher.unsquashPushFK(it)\n\t\t\t: SQLiteSquasher.unsquashFK(it)\n\t);\n\n\treturn {\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: name,\n\t\tcolumns: Object.values(columns),\n\t\treferenceData: fks,\n\t\tcompositePKs: composites,\n\t\tuniqueConstraints: Object.values(uniqueConstraints),\n\t\tcheckConstraints: Object.values(checkConstraints),\n\t};\n};\n\nexport const prepareDropTableJson = (table: Table): JsonDropTableStatement => {\n\treturn {\n\t\ttype: 'drop_table',\n\t\ttableName: table.name,\n\t\tschema: table.schema,\n\t\tpolicies: table.policies ? Object.values(table.policies) : [],\n\t};\n};\n\nexport const prepareRenameTableJson = (\n\ttableFrom: Table,\n\ttableTo: Table,\n): JsonRenameTableStatement => {\n\treturn {\n\t\ttype: 'rename_table',\n\t\tfromSchema: tableTo.schema,\n\t\ttoSchema: tableTo.schema,\n\t\ttableNameFrom: tableFrom.name,\n\t\ttableNameTo: tableTo.name,\n\t};\n};\n\nexport const prepareCreateEnumJson = (\n\tname: string,\n\tschema: string,\n\tvalues: string[],\n): JsonCreateEnumStatement => {\n\treturn {\n\t\ttype: 'create_type_enum',\n\t\tname: name,\n\t\tschema: schema,\n\t\tvalues,\n\t};\n};\n\n// https://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/\nexport const prepareAddValuesToEnumJson = (\n\tname: string,\n\tschema: string,\n\tvalues: { value: string; before: string }[],\n): JsonAddValueToEnumStatement[] => {\n\treturn values.map((it) => {\n\t\treturn {\n\t\t\ttype: 'alter_type_add_value',\n\t\t\tname: name,\n\t\t\tschema: schema,\n\t\t\tvalue: it.value,\n\t\t\tbefore: it.before,\n\t\t};\n\t});\n};\n\nexport const prepareDropEnumValues = (\n\tname: string,\n\tschema: string,\n\tremovedValues: string[],\n\tjson2: PgSchema,\n): JsonDropValueFromEnumStatement[] => {\n\tif (!removedValues.length) return [];\n\n\tconst affectedColumns: JsonDropValueFromEnumStatement['columnsWithEnum'] = [];\n\n\tfor (const tableKey in json2.tables) {\n\t\tconst table = json2.tables[tableKey];\n\t\tfor (const columnKey in table.columns) {\n\t\t\tconst column = table.columns[columnKey];\n\n\t\t\tconst arrayDefinitionRegex = /\\[\\d*(?:\\[\\d*\\])*\\]/g;\n\t\t\tconst parsedColumnType = column.type.replace(arrayDefinitionRegex, '');\n\n\t\t\tif (parsedColumnType === name && column.typeSchema === schema) {\n\t\t\t\taffectedColumns.push({\n\t\t\t\t\ttableSchema: table.schema,\n\t\t\t\t\ttable: table.name,\n\t\t\t\t\tcolumn: column.name,\n\t\t\t\t\tcolumnType: column.type,\n\t\t\t\t\tdefault: column.default,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [{\n\t\ttype: 'alter_type_drop_value',\n\t\tname: name,\n\t\tenumSchema: schema,\n\t\tdeletedValues: removedValues,\n\t\tnewValues: json2.enums[`${schema}.${name}`].values,\n\t\tcolumnsWithEnum: affectedColumns,\n\t}];\n};\n\nexport const prepareDropEnumJson = (\n\tname: string,\n\tschema: string,\n): JsonDropEnumStatement => {\n\treturn {\n\t\ttype: 'drop_type_enum',\n\t\tname: name,\n\t\tschema: schema,\n\t};\n};\n\nexport const prepareMoveEnumJson = (\n\tname: string,\n\tschemaFrom: string,\n\tschemaTo: string,\n): JsonMoveEnumStatement => {\n\treturn {\n\t\ttype: 'move_type_enum',\n\t\tname: name,\n\t\tschemaFrom,\n\t\tschemaTo,\n\t};\n};\n\nexport const prepareRenameEnumJson = (\n\tnameFrom: string,\n\tnameTo: string,\n\tschema: string,\n): JsonRenameEnumStatement => {\n\treturn {\n\t\ttype: 'rename_type_enum',\n\t\tnameFrom,\n\t\tnameTo,\n\t\tschema,\n\t};\n};\n\n////////////\n\nexport const prepareCreateSequenceJson = (\n\tseq: Sequence,\n): JsonCreateSequenceStatement => {\n\tconst values = PgSquasher.unsquashSequence(seq.values);\n\treturn {\n\t\ttype: 'create_sequence',\n\t\tname: seq.name,\n\t\tschema: seq.schema,\n\t\tvalues,\n\t};\n};\n\nexport const prepareAlterSequenceJson = (\n\tseq: Sequence,\n): JsonAlterSequenceStatement[] => {\n\tconst values = PgSquasher.unsquashSequence(seq.values);\n\treturn [\n\t\t{\n\t\t\ttype: 'alter_sequence',\n\t\t\tschema: seq.schema,\n\t\t\tname: seq.name,\n\t\t\tvalues,\n\t\t},\n\t];\n};\n\nexport const prepareDropSequenceJson = (\n\tname: string,\n\tschema: string,\n): JsonDropSequenceStatement => {\n\treturn {\n\t\ttype: 'drop_sequence',\n\t\tname: name,\n\t\tschema: schema,\n\t};\n};\n\nexport const prepareMoveSequenceJson = (\n\tname: string,\n\tschemaFrom: string,\n\tschemaTo: string,\n): JsonMoveSequenceStatement => {\n\treturn {\n\t\ttype: 'move_sequence',\n\t\tname: name,\n\t\tschemaFrom,\n\t\tschemaTo,\n\t};\n};\n\nexport const prepareRenameSequenceJson = (\n\tnameFrom: string,\n\tnameTo: string,\n\tschema: string,\n): JsonRenameSequenceStatement => {\n\treturn {\n\t\ttype: 'rename_sequence',\n\t\tnameFrom,\n\t\tnameTo,\n\t\tschema,\n\t};\n};\n\n////////////\n\nexport const prepareCreateRoleJson = (\n\trole: Role,\n): JsonCreateRoleStatement => {\n\treturn {\n\t\ttype: 'create_role',\n\t\tname: role.name,\n\t\tvalues: {\n\t\t\tcreateDb: role.createDb,\n\t\t\tcreateRole: role.createRole,\n\t\t\tinherit: role.inherit,\n\t\t},\n\t};\n};\n\nexport const prepareAlterRoleJson = (\n\trole: Role,\n): JsonAlterRoleStatement => {\n\treturn {\n\t\ttype: 'alter_role',\n\t\tname: role.name,\n\t\tvalues: {\n\t\t\tcreateDb: role.createDb,\n\t\t\tcreateRole: role.createRole,\n\t\t\tinherit: role.inherit,\n\t\t},\n\t};\n};\n\nexport const prepareDropRoleJson = (\n\tname: string,\n): JsonDropRoleStatement => {\n\treturn {\n\t\ttype: 'drop_role',\n\t\tname: name,\n\t};\n};\n\nexport const prepareRenameRoleJson = (\n\tnameFrom: string,\n\tnameTo: string,\n): JsonRenameRoleStatement => {\n\treturn {\n\t\ttype: 'rename_role',\n\t\tnameFrom,\n\t\tnameTo,\n\t};\n};\n\n//////////\n\nexport const prepareCreateSchemasJson = (\n\tvalues: string[],\n): JsonCreateSchema[] => {\n\treturn values.map((it) => {\n\t\treturn {\n\t\t\ttype: 'create_schema',\n\t\t\tname: it,\n\t\t} as JsonCreateSchema;\n\t});\n};\n\nexport const prepareRenameSchemasJson = (\n\tvalues: { from: string; to: string }[],\n): JsonRenameSchema[] => {\n\treturn values.map((it) => {\n\t\treturn {\n\t\t\ttype: 'rename_schema',\n\t\t\tfrom: it.from,\n\t\t\tto: it.to,\n\t\t} as JsonRenameSchema;\n\t});\n};\n\nexport const prepareDeleteSchemasJson = (\n\tvalues: string[],\n): JsonDropSchema[] => {\n\treturn values.map((it) => {\n\t\treturn {\n\t\t\ttype: 'drop_schema',\n\t\t\tname: it,\n\t\t} as JsonDropSchema;\n\t});\n};\n\nexport const prepareRenameColumns = (\n\ttableName: string,\n\t// TODO: split for pg and mysql+sqlite and singlestore without schema\n\tschema: string,\n\tpairs: { from: Column; to: Column }[],\n): JsonRenameColumnStatement[] => {\n\treturn pairs.map((it) => {\n\t\treturn {\n\t\t\ttype: 'alter_table_rename_column',\n\t\t\ttableName: tableName,\n\t\t\toldColumnName: it.from.name,\n\t\t\tnewColumnName: it.to.name,\n\t\t\tschema,\n\t\t};\n\t});\n};\n\nexport const _prepareDropColumns = (\n\ttaleName: string,\n\tschema: string,\n\tcolumns: Column[],\n): JsonDropColumnStatement[] => {\n\treturn columns.map((it) => {\n\t\treturn {\n\t\t\ttype: 'alter_table_drop_column',\n\t\t\ttableName: taleName,\n\t\t\tcolumnName: it.name,\n\t\t\tschema,\n\t\t};\n\t});\n};\n\nexport const _prepareAddColumns = (\n\ttableName: string,\n\tschema: string,\n\tcolumns: Column[],\n): JsonAddColumnStatement[] => {\n\treturn columns.map((it) => {\n\t\treturn {\n\t\t\ttype: 'alter_table_add_column',\n\t\t\ttableName: tableName,\n\t\t\tcolumn: it,\n\t\t\tschema,\n\t\t};\n\t});\n};\n\nexport const _prepareSqliteAddColumns = (\n\ttableName: string,\n\tcolumns: Column[],\n\treferenceData: string[],\n): JsonSqliteAddColumnStatement[] => {\n\tconst unsquashed = referenceData.map((addedFkValue) => SQLiteSquasher.unsquashFK(addedFkValue));\n\n\treturn columns\n\t\t.map((it) => {\n\t\t\tconst columnsWithReference = unsquashed.find((t) => t.columnsFrom.includes(it.name));\n\n\t\t\tif (it.generated?.type === 'stored') {\n\t\t\t\twarning(\n\t\t\t\t\t`As SQLite docs mention: \"It is not possible to ALTER TABLE ADD COLUMN a STORED column. One can add a VIRTUAL column, however\", source: \"https://www.sqlite.org/gencol.html\"`,\n\t\t\t\t);\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\t\ttableName: tableName,\n\t\t\t\tcolumn: it,\n\t\t\t\treferenceData: columnsWithReference\n\t\t\t\t\t? SQLiteSquasher.squashFK(columnsWithReference)\n\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t})\n\t\t.filter(Boolean) as JsonSqliteAddColumnStatement[];\n};\n\nexport const prepareAlterColumnsMysql = (\n\ttableName: string,\n\tschema: string,\n\tcolumns: AlteredColumn[],\n\t// TODO: remove?\n\tjson1: CommonSquashedSchema,\n\tjson2: CommonSquashedSchema,\n\taction?: 'push' | undefined,\n): JsonAlterColumnStatement[] => {\n\tlet statements: JsonAlterColumnStatement[] = [];\n\tlet dropPkStatements: JsonAlterColumnDropPrimaryKeyStatement[] = [];\n\tlet setPkStatements: JsonAlterColumnSetPrimaryKeyStatement[] = [];\n\n\tfor (const column of columns) {\n\t\tconst columnName = typeof column.name !== 'string' ? column.name.new : column.name;\n\n\t\tconst table = json2.tables[tableName];\n\t\tconst snapshotColumn = table.columns[columnName];\n\n\t\tconst columnType = snapshotColumn.type;\n\t\tconst columnDefault = snapshotColumn.default;\n\t\tconst columnOnUpdate = 'onUpdate' in snapshotColumn ? snapshotColumn.onUpdate : undefined;\n\t\tconst columnNotNull = table.columns[columnName].notNull;\n\n\t\tconst columnAutoIncrement = 'autoincrement' in snapshotColumn\n\t\t\t? snapshotColumn.autoincrement ?? false\n\t\t\t: false;\n\n\t\tconst columnPk = table.columns[columnName].primaryKey;\n\n\t\tif (column.autoincrement?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_autoincrement',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.autoincrement?.type === 'changed') {\n\t\t\tconst type = column.autoincrement.new\n\t\t\t\t? 'alter_table_alter_column_set_autoincrement'\n\t\t\t\t: 'alter_table_alter_column_drop_autoincrement';\n\n\t\t\tstatements.push({\n\t\t\t\ttype,\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.autoincrement?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_autoincrement',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\t}\n\n\tfor (const column of columns) {\n\t\tconst columnName = typeof column.name !== 'string' ? column.name.new : column.name;\n\n\t\t// I used any, because those fields are available only for mysql dialect\n\t\t// For other dialects it will become undefined, that is fine for json statements\n\t\tconst columnType = json2.tables[tableName].columns[columnName].type;\n\t\tconst columnDefault = json2.tables[tableName].columns[columnName].default;\n\t\tconst columnGenerated = json2.tables[tableName].columns[columnName].generated;\n\t\tconst columnOnUpdate = (json2.tables[tableName].columns[columnName] as any)\n\t\t\t.onUpdate;\n\t\tconst columnNotNull = json2.tables[tableName].columns[columnName].notNull;\n\t\tconst columnAutoIncrement = (\n\t\t\tjson2.tables[tableName].columns[columnName] as any\n\t\t).autoincrement;\n\t\tconst columnPk = (json2.tables[tableName].columns[columnName] as any)\n\t\t\t.primaryKey;\n\n\t\tconst compositePk = json2.tables[tableName].compositePrimaryKeys[\n\t\t\t`${tableName}_${columnName}`\n\t\t];\n\n\t\tif (typeof column.name !== 'string') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_rename_column',\n\t\t\t\ttableName,\n\t\t\t\toldColumnName: column.name.old,\n\t\t\t\tnewColumnName: column.name.new,\n\t\t\t\tschema,\n\t\t\t});\n\t\t}\n\n\t\tif (column.type?.type === 'changed') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_type',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tnewDataType: column.type.new,\n\t\t\t\toldDataType: column.type.old,\n\t\t\t\tschema,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t\tcolumnGenerated,\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tcolumn.primaryKey?.type === 'deleted'\n\t\t\t|| (column.primaryKey?.type === 'changed'\n\t\t\t\t&& !column.primaryKey.new\n\t\t\t\t&& typeof compositePk === 'undefined')\n\t\t) {\n\t\t\tdropPkStatements.push({\n\t\t\t\t////\n\t\t\t\ttype: 'alter_table_alter_column_drop_pk',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t});\n\t\t}\n\n\t\tif (column.default?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_default',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tnewDefaultValue: column.default.value,\n\t\t\t\tschema,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.default?.type === 'changed') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_default',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tnewDefaultValue: column.default.new,\n\t\t\t\toldDefaultValue: column.default.old,\n\t\t\t\tschema,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.default?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_default',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.notNull?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_notnull',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.notNull?.type === 'changed') {\n\t\t\tconst type = column.notNull.new\n\t\t\t\t? 'alter_table_alter_column_set_notnull'\n\t\t\t\t: 'alter_table_alter_column_drop_notnull';\n\t\t\tstatements.push({\n\t\t\t\ttype: type,\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.notNull?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.generated?.type === 'added') {\n\t\t\tif (columnGenerated?.type === 'virtual') {\n\t\t\t\twarning(\n\t\t\t\t\t`You are trying to add virtual generated constraint to ${\n\t\t\t\t\t\tchalk.blue(\n\t\t\t\t\t\t\tcolumnName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} column. As MySQL docs mention: \"Nongenerated columns can be altered to stored but not virtual generated columns\". We will drop an existing column and add it with a virtual generated statement. This means that the data previously stored in this column will be wiped, and new data will be generated on each read for this column\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t\tcolumnGenerated,\n\t\t\t});\n\t\t}\n\n\t\tif (column.generated?.type === 'changed' && action !== 'push') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t\tcolumnGenerated,\n\t\t\t});\n\t\t}\n\n\t\tif (column.generated?.type === 'deleted') {\n\t\t\tif (columnGenerated?.type === 'virtual') {\n\t\t\t\twarning(\n\t\t\t\t\t`You are trying to remove virtual generated constraint from ${\n\t\t\t\t\t\tchalk.blue(\n\t\t\t\t\t\t\tcolumnName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} column. As MySQL docs mention: \"Stored but not virtual generated columns can be altered to nongenerated columns. The stored generated values become the values of the nongenerated column\". We will drop an existing column and add it without a virtual generated statement. This means that this column will have no data after migration\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t\tcolumnGenerated,\n\t\t\t\toldColumn: json1.tables[tableName].columns[columnName],\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tcolumn.primaryKey?.type === 'added'\n\t\t\t|| (column.primaryKey?.type === 'changed' && column.primaryKey.new)\n\t\t) {\n\t\t\tconst wasAutoincrement = statements.filter(\n\t\t\t\t(it) => it.type === 'alter_table_alter_column_set_autoincrement',\n\t\t\t);\n\t\t\tif (wasAutoincrement.length === 0) {\n\t\t\t\tsetPkStatements.push({\n\t\t\t\t\ttype: 'alter_table_alter_column_set_pk',\n\t\t\t\t\ttableName,\n\t\t\t\t\tschema,\n\t\t\t\t\tcolumnName,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (column.onUpdate?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_on_update',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.onUpdate?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_on_update',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn [...dropPkStatements, ...setPkStatements, ...statements];\n};\n\nexport const prepareAlterColumnsSingleStore = (\n\ttableName: string,\n\tschema: string,\n\tcolumns: AlteredColumn[],\n\t// TODO: remove?\n\tjson1: CommonSquashedSchema,\n\tjson2: CommonSquashedSchema,\n\taction?: 'push' | undefined,\n): JsonAlterColumnStatement[] => {\n\tlet statements: JsonAlterColumnStatement[] = [];\n\tlet dropPkStatements: JsonAlterColumnDropPrimaryKeyStatement[] = [];\n\tlet setPkStatements: JsonAlterColumnSetPrimaryKeyStatement[] = [];\n\n\tfor (const column of columns) {\n\t\tconst columnName = typeof column.name !== 'string' ? column.name.new : column.name;\n\n\t\tconst table = json2.tables[tableName];\n\t\tconst snapshotColumn = table.columns[columnName];\n\n\t\tconst columnType = snapshotColumn.type;\n\t\tconst columnDefault = snapshotColumn.default;\n\t\tconst columnOnUpdate = 'onUpdate' in snapshotColumn ? snapshotColumn.onUpdate : undefined;\n\t\tconst columnNotNull = table.columns[columnName].notNull;\n\n\t\tconst columnAutoIncrement = 'autoincrement' in snapshotColumn\n\t\t\t? snapshotColumn.autoincrement ?? false\n\t\t\t: false;\n\n\t\tconst columnPk = table.columns[columnName].primaryKey;\n\n\t\tif (column.autoincrement?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_autoincrement',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.autoincrement?.type === 'changed') {\n\t\t\tconst type = column.autoincrement.new\n\t\t\t\t? 'alter_table_alter_column_set_autoincrement'\n\t\t\t\t: 'alter_table_alter_column_drop_autoincrement';\n\n\t\t\tstatements.push({\n\t\t\t\ttype,\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.autoincrement?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_autoincrement',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\t}\n\n\tfor (const column of columns) {\n\t\tconst columnName = typeof column.name !== 'string' ? column.name.new : column.name;\n\n\t\t// I used any, because those fields are available only for mysql and singlestore dialect\n\t\t// For other dialects it will become undefined, that is fine for json statements\n\t\tconst columnType = json2.tables[tableName].columns[columnName].type;\n\t\tconst columnDefault = json2.tables[tableName].columns[columnName].default;\n\t\tconst columnGenerated = json2.tables[tableName].columns[columnName].generated;\n\t\tconst columnOnUpdate = (json2.tables[tableName].columns[columnName] as any)\n\t\t\t.onUpdate;\n\t\tconst columnNotNull = json2.tables[tableName].columns[columnName].notNull;\n\t\tconst columnAutoIncrement = (\n\t\t\tjson2.tables[tableName].columns[columnName] as any\n\t\t).autoincrement;\n\t\tconst columnPk = (json2.tables[tableName].columns[columnName] as any)\n\t\t\t.primaryKey;\n\n\t\tconst compositePk = json2.tables[tableName].compositePrimaryKeys[\n\t\t\t`${tableName}_${columnName}`\n\t\t];\n\n\t\tif (typeof column.name !== 'string') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_rename_column',\n\t\t\t\ttableName,\n\t\t\t\toldColumnName: column.name.old,\n\t\t\t\tnewColumnName: column.name.new,\n\t\t\t\tschema,\n\t\t\t});\n\t\t}\n\n\t\tif (column.type?.type === 'changed') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_type',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tnewDataType: column.type.new,\n\t\t\t\toldDataType: column.type.old,\n\t\t\t\tschema,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t\tcolumnGenerated,\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tcolumn.primaryKey?.type === 'deleted'\n\t\t\t|| (column.primaryKey?.type === 'changed'\n\t\t\t\t&& !column.primaryKey.new\n\t\t\t\t&& typeof compositePk === 'undefined')\n\t\t) {\n\t\t\tdropPkStatements.push({\n\t\t\t\t////\n\t\t\t\ttype: 'alter_table_alter_column_drop_pk',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t});\n\t\t}\n\n\t\tif (column.default?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_default',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tnewDefaultValue: column.default.value,\n\t\t\t\tschema,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.default?.type === 'changed') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_default',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tnewDefaultValue: column.default.new,\n\t\t\t\toldDefaultValue: column.default.old,\n\t\t\t\tschema,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.default?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_default',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.notNull?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_notnull',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.notNull?.type === 'changed') {\n\t\t\tconst type = column.notNull.new\n\t\t\t\t? 'alter_table_alter_column_set_notnull'\n\t\t\t\t: 'alter_table_alter_column_drop_notnull';\n\t\t\tstatements.push({\n\t\t\t\ttype: type,\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.notNull?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.generated?.type === 'added') {\n\t\t\tif (columnGenerated?.type === 'virtual') {\n\t\t\t\t// TODO: Change warning message according to SingleStore docs\n\t\t\t\twarning(\n\t\t\t\t\t`You are trying to add virtual generated constraint to ${\n\t\t\t\t\t\tchalk.blue(\n\t\t\t\t\t\t\tcolumnName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} column. As MySQL docs mention: \"Nongenerated columns can be altered to stored but not virtual generated columns\". We will drop an existing column and add it with a virtual generated statement. This means that the data previously stored in this column will be wiped, and new data will be generated on each read for this column\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t\tcolumnGenerated,\n\t\t\t});\n\t\t}\n\n\t\tif (column.generated?.type === 'changed' && action !== 'push') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t\tcolumnGenerated,\n\t\t\t});\n\t\t}\n\n\t\tif (column.generated?.type === 'deleted') {\n\t\t\tif (columnGenerated?.type === 'virtual') {\n\t\t\t\t// TODO: Change warning message according to SingleStore docs\n\t\t\t\twarning(\n\t\t\t\t\t`You are trying to remove virtual generated constraint from ${\n\t\t\t\t\t\tchalk.blue(\n\t\t\t\t\t\t\tcolumnName,\n\t\t\t\t\t\t)\n\t\t\t\t\t} column. As MySQL docs mention: \"Stored but not virtual generated columns can be altered to nongenerated columns. The stored generated values become the values of the nongenerated column\". We will drop an existing column and add it without a virtual generated statement. This means that this column will have no data after migration\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t\tcolumnGenerated,\n\t\t\t\toldColumn: json1.tables[tableName].columns[columnName],\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tcolumn.primaryKey?.type === 'added'\n\t\t\t|| (column.primaryKey?.type === 'changed' && column.primaryKey.new)\n\t\t) {\n\t\t\tconst wasAutoincrement = statements.filter(\n\t\t\t\t(it) => it.type === 'alter_table_alter_column_set_autoincrement',\n\t\t\t);\n\t\t\tif (wasAutoincrement.length === 0) {\n\t\t\t\tsetPkStatements.push({\n\t\t\t\t\ttype: 'alter_table_alter_column_set_pk',\n\t\t\t\t\ttableName,\n\t\t\t\t\tschema,\n\t\t\t\t\tcolumnName,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (column.onUpdate?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_on_update',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.onUpdate?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_on_update',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn [...dropPkStatements, ...setPkStatements, ...statements];\n};\n\nexport const preparePgAlterColumns = (\n\t_tableName: string,\n\tschema: string,\n\tcolumns: AlteredColumn[],\n\t// TODO: remove?\n\tjson2: PgSchemaSquashed,\n\tjson1: PgSchemaSquashed,\n\taction?: 'push' | undefined,\n): JsonAlterColumnStatement[] => {\n\tconst tableKey = `${schema || 'public'}.${_tableName}`;\n\tlet statements: JsonAlterColumnStatement[] = [];\n\tlet dropPkStatements: JsonAlterColumnDropPrimaryKeyStatement[] = [];\n\tlet setPkStatements: JsonAlterColumnSetPrimaryKeyStatement[] = [];\n\n\tfor (const column of columns) {\n\t\tconst columnName = typeof column.name !== 'string' ? column.name.new : column.name;\n\n\t\tconst tableName = json2.tables[tableKey].name;\n\n\t\t// I used any, because those fields are available only for mysql dialect\n\t\t// For other dialects it will become undefined, that is fine for json statements\n\t\tconst columnType = json2.tables[tableKey].columns[columnName].type;\n\t\tconst columnDefault = json2.tables[tableKey].columns[columnName].default;\n\t\tconst columnGenerated = json2.tables[tableKey].columns[columnName].generated;\n\t\tconst columnOnUpdate = (json2.tables[tableKey].columns[columnName] as any)\n\t\t\t.onUpdate;\n\t\tconst columnNotNull = json2.tables[tableKey].columns[columnName].notNull;\n\t\tconst columnAutoIncrement = (\n\t\t\tjson2.tables[tableKey].columns[columnName] as any\n\t\t).autoincrement;\n\t\tconst columnPk = (json2.tables[tableKey].columns[columnName] as any)\n\t\t\t.primaryKey;\n\t\tconst typeSchema = json2.tables[tableKey].columns[columnName].typeSchema;\n\t\tconst json1ColumnTypeSchema = json1.tables[tableKey].columns[columnName].typeSchema;\n\n\t\tconst compositePk = json2.tables[tableKey].compositePrimaryKeys[`${tableName}_${columnName}`];\n\n\t\tif (typeof column.name !== 'string') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_rename_column',\n\t\t\t\ttableName,\n\t\t\t\toldColumnName: column.name.old,\n\t\t\t\tnewColumnName: column.name.new,\n\t\t\t\tschema,\n\t\t\t});\n\t\t}\n\n\t\tif (column.type?.type === 'changed') {\n\t\t\tconst arrayDefinitionRegex = /\\[\\d*(?:\\[\\d*\\])*\\]/g;\n\t\t\tconst parsedNewColumnType = column.type.new.replace(arrayDefinitionRegex, '');\n\t\t\tconst parsedOldColumnType = column.type.old.replace(arrayDefinitionRegex, '');\n\n\t\t\tconst isNewTypeIsEnum = json2.enums[`${typeSchema}.${parsedNewColumnType}`];\n\t\t\tconst isOldTypeIsEnum = json1.enums[`${json1ColumnTypeSchema}.${parsedOldColumnType}`];\n\n\t\t\tstatements.push({\n\t\t\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\ttypeSchema: typeSchema,\n\t\t\t\tnewDataType: {\n\t\t\t\t\tname: column.type.new,\n\t\t\t\t\tisEnum: isNewTypeIsEnum ? true : false,\n\t\t\t\t},\n\t\t\t\toldDataType: {\n\t\t\t\t\tname: column.type.old,\n\t\t\t\t\tisEnum: isOldTypeIsEnum ? true : false,\n\t\t\t\t},\n\t\t\t\tschema,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tcolumn.primaryKey?.type === 'deleted'\n\t\t\t|| (column.primaryKey?.type === 'changed'\n\t\t\t\t&& !column.primaryKey.new\n\t\t\t\t&& typeof compositePk === 'undefined')\n\t\t) {\n\t\t\tdropPkStatements.push({\n\t\t\t\t////\n\t\t\t\ttype: 'alter_table_alter_column_drop_pk',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t});\n\t\t}\n\n\t\tif (column.default?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_default',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tnewDefaultValue: column.default.value,\n\t\t\t\tschema,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.default?.type === 'changed') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_default',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tnewDefaultValue: column.default.new,\n\t\t\t\toldDefaultValue: column.default.old,\n\t\t\t\tschema,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.default?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_default',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.notNull?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_notnull',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.notNull?.type === 'changed') {\n\t\t\tconst type = column.notNull.new\n\t\t\t\t? 'alter_table_alter_column_set_notnull'\n\t\t\t\t: 'alter_table_alter_column_drop_notnull';\n\t\t\tstatements.push({\n\t\t\t\ttype: type,\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.notNull?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.identity?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_identity',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tidentity: column.identity.value,\n\t\t\t});\n\t\t}\n\n\t\tif (column.identity?.type === 'changed') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_change_identity',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tidentity: column.identity.new,\n\t\t\t\toldIdentity: column.identity.old,\n\t\t\t});\n\t\t}\n\n\t\tif (column.identity?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_identity',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t});\n\t\t}\n\n\t\tif (column.generated?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t\tcolumnGenerated,\n\t\t\t});\n\t\t}\n\n\t\tif (column.generated?.type === 'changed' && action !== 'push') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t\tcolumnGenerated,\n\t\t\t});\n\t\t}\n\n\t\tif (column.generated?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t\tcolumnGenerated,\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tcolumn.primaryKey?.type === 'added'\n\t\t\t|| (column.primaryKey?.type === 'changed' && column.primaryKey.new)\n\t\t) {\n\t\t\tconst wasAutoincrement = statements.filter(\n\t\t\t\t(it) => it.type === 'alter_table_alter_column_set_autoincrement',\n\t\t\t);\n\t\t\tif (wasAutoincrement.length === 0) {\n\t\t\t\tsetPkStatements.push({\n\t\t\t\t\ttype: 'alter_table_alter_column_set_pk',\n\t\t\t\t\ttableName,\n\t\t\t\t\tschema,\n\t\t\t\t\tcolumnName,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// if (column.primaryKey?.type === \"added\") {\n\t\t//   statements.push({\n\t\t//     type: \"alter_table_alter_column_set_primarykey\",\n\t\t//     tableName,\n\t\t//     columnName,\n\t\t//     schema,\n\t\t//     newDataType: columnType,\n\t\t//     columnDefault,\n\t\t//     columnOnUpdate,\n\t\t//     columnNotNull,\n\t\t//     columnAutoIncrement,\n\t\t//   });\n\t\t// }\n\n\t\t// if (column.primaryKey?.type === \"changed\") {\n\t\t//   const type = column.primaryKey.new\n\t\t//     ? \"alter_table_alter_column_set_primarykey\"\n\t\t//     : \"alter_table_alter_column_drop_primarykey\";\n\n\t\t//   statements.push({\n\t\t//     type,\n\t\t//     tableName,\n\t\t//     columnName,\n\t\t//     schema,\n\t\t//     newDataType: columnType,\n\t\t//     columnDefault,\n\t\t//     columnOnUpdate,\n\t\t//     columnNotNull,\n\t\t//     columnAutoIncrement,\n\t\t//   });\n\t\t// }\n\n\t\t// if (column.primaryKey?.type === \"deleted\") {\n\t\t//   statements.push({\n\t\t//     type: \"alter_table_alter_column_drop_primarykey\",\n\t\t//     tableName,\n\t\t//     columnName,\n\t\t//     schema,\n\t\t//     newDataType: columnType,\n\t\t//     columnDefault,\n\t\t//     columnOnUpdate,\n\t\t//     columnNotNull,\n\t\t//     columnAutoIncrement,\n\t\t//   });\n\t\t// }\n\n\t\tif (column.onUpdate?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_on_update',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.onUpdate?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_on_update',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn [...dropPkStatements, ...setPkStatements, ...statements];\n};\n\nexport const prepareSqliteAlterColumns = (\n\ttableName: string,\n\tschema: string,\n\tcolumns: AlteredColumn[],\n\t// TODO: remove?\n\tjson2: CommonSquashedSchema,\n): JsonAlterColumnStatement[] => {\n\tlet statements: JsonAlterColumnStatement[] = [];\n\tlet dropPkStatements: JsonAlterColumnDropPrimaryKeyStatement[] = [];\n\tlet setPkStatements: JsonAlterColumnSetPrimaryKeyStatement[] = [];\n\n\tfor (const column of columns) {\n\t\tconst columnName = typeof column.name !== 'string' ? column.name.new : column.name;\n\n\t\t// I used any, because those fields are available only for mysql dialect\n\t\t// For other dialects it will become undefined, that is fine for json statements\n\t\tconst columnType = json2.tables[tableName].columns[columnName].type;\n\t\tconst columnDefault = json2.tables[tableName].columns[columnName].default;\n\t\tconst columnOnUpdate = (json2.tables[tableName].columns[columnName] as any)\n\t\t\t.onUpdate;\n\t\tconst columnNotNull = json2.tables[tableName].columns[columnName].notNull;\n\t\tconst columnAutoIncrement = (\n\t\t\tjson2.tables[tableName].columns[columnName] as any\n\t\t).autoincrement;\n\t\tconst columnPk = (json2.tables[tableName].columns[columnName] as any)\n\t\t\t.primaryKey;\n\n\t\tconst columnGenerated = json2.tables[tableName].columns[columnName].generated;\n\n\t\tconst compositePk = json2.tables[tableName].compositePrimaryKeys[\n\t\t\t`${tableName}_${columnName}`\n\t\t];\n\n\t\tif (column.autoincrement?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_autoincrement',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.autoincrement?.type === 'changed') {\n\t\t\tconst type = column.autoincrement.new\n\t\t\t\t? 'alter_table_alter_column_set_autoincrement'\n\t\t\t\t: 'alter_table_alter_column_drop_autoincrement';\n\n\t\t\tstatements.push({\n\t\t\t\ttype,\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.autoincrement?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_autoincrement',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (typeof column.name !== 'string') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_rename_column',\n\t\t\t\ttableName,\n\t\t\t\toldColumnName: column.name.old,\n\t\t\t\tnewColumnName: column.name.new,\n\t\t\t\tschema,\n\t\t\t});\n\t\t}\n\n\t\tif (column.type?.type === 'changed') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_type',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tnewDataType: column.type.new,\n\t\t\t\toldDataType: column.type.old,\n\t\t\t\tschema,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tcolumn.primaryKey?.type === 'deleted'\n\t\t\t|| (column.primaryKey?.type === 'changed'\n\t\t\t\t&& !column.primaryKey.new\n\t\t\t\t&& typeof compositePk === 'undefined')\n\t\t) {\n\t\t\tdropPkStatements.push({\n\t\t\t\t////\n\t\t\t\ttype: 'alter_table_alter_column_drop_pk',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t});\n\t\t}\n\n\t\tif (column.default?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_default',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tnewDefaultValue: column.default.value,\n\t\t\t\tschema,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.default?.type === 'changed') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_default',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tnewDefaultValue: column.default.new,\n\t\t\t\toldDefaultValue: column.default.old,\n\t\t\t\tschema,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.default?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_default',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.notNull?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_notnull',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.notNull?.type === 'changed') {\n\t\t\tconst type = column.notNull.new\n\t\t\t\t? 'alter_table_alter_column_set_notnull'\n\t\t\t\t: 'alter_table_alter_column_drop_notnull';\n\t\t\tstatements.push({\n\t\t\t\ttype: type,\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.notNull?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.generated?.type === 'added') {\n\t\t\tif (columnGenerated?.type === 'virtual') {\n\t\t\t\tstatements.push({\n\t\t\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t\t\t\ttableName,\n\t\t\t\t\tcolumnName,\n\t\t\t\t\tschema,\n\t\t\t\t\tnewDataType: columnType,\n\t\t\t\t\tcolumnDefault,\n\t\t\t\t\tcolumnOnUpdate,\n\t\t\t\t\tcolumnNotNull,\n\t\t\t\t\tcolumnAutoIncrement,\n\t\t\t\t\tcolumnPk,\n\t\t\t\t\tcolumnGenerated,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\twarning(\n\t\t\t\t\t`As SQLite docs mention: \"It is not possible to ALTER TABLE ADD COLUMN a STORED column. One can add a VIRTUAL column, however\", source: \"https://www.sqlite.org/gencol.html\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (column.generated?.type === 'changed') {\n\t\t\tif (columnGenerated?.type === 'virtual') {\n\t\t\t\tstatements.push({\n\t\t\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t\t\t\ttableName,\n\t\t\t\t\tcolumnName,\n\t\t\t\t\tschema,\n\t\t\t\t\tnewDataType: columnType,\n\t\t\t\t\tcolumnDefault,\n\t\t\t\t\tcolumnOnUpdate,\n\t\t\t\t\tcolumnNotNull,\n\t\t\t\t\tcolumnAutoIncrement,\n\t\t\t\t\tcolumnPk,\n\t\t\t\t\tcolumnGenerated,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\twarning(\n\t\t\t\t\t`As SQLite docs mention: \"It is not possible to ALTER TABLE ADD COLUMN a STORED column. One can add a VIRTUAL column, however\", source: \"https://www.sqlite.org/gencol.html\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (column.generated?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t\tcolumnGenerated,\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tcolumn.primaryKey?.type === 'added'\n\t\t\t|| (column.primaryKey?.type === 'changed' && column.primaryKey.new)\n\t\t) {\n\t\t\tconst wasAutoincrement = statements.filter(\n\t\t\t\t(it) => it.type === 'alter_table_alter_column_set_autoincrement',\n\t\t\t);\n\t\t\tif (wasAutoincrement.length === 0) {\n\t\t\t\tsetPkStatements.push({\n\t\t\t\t\ttype: 'alter_table_alter_column_set_pk',\n\t\t\t\t\ttableName,\n\t\t\t\t\tschema,\n\t\t\t\t\tcolumnName,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (column.onUpdate?.type === 'added') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_set_on_update',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\n\t\tif (column.onUpdate?.type === 'deleted') {\n\t\t\tstatements.push({\n\t\t\t\ttype: 'alter_table_alter_column_drop_on_update',\n\t\t\t\ttableName,\n\t\t\t\tcolumnName,\n\t\t\t\tschema,\n\t\t\t\tnewDataType: columnType,\n\t\t\t\tcolumnDefault,\n\t\t\t\tcolumnOnUpdate,\n\t\t\t\tcolumnNotNull,\n\t\t\t\tcolumnAutoIncrement,\n\t\t\t\tcolumnPk,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn [...dropPkStatements, ...setPkStatements, ...statements];\n};\n\nexport const prepareRenamePolicyJsons = (\n\ttableName: string,\n\tschema: string,\n\trenames: {\n\t\tfrom: Policy;\n\t\tto: Policy;\n\t}[],\n): JsonRenamePolicyStatement[] => {\n\treturn renames.map((it) => {\n\t\treturn {\n\t\t\ttype: 'rename_policy',\n\t\t\ttableName: tableName,\n\t\t\toldName: it.from.name,\n\t\t\tnewName: it.to.name,\n\t\t\tschema,\n\t\t};\n\t});\n};\n\nexport const prepareRenameIndPolicyJsons = (\n\trenames: {\n\t\tfrom: Policy;\n\t\tto: Policy;\n\t}[],\n): JsonIndRenamePolicyStatement[] => {\n\treturn renames.map((it) => {\n\t\treturn {\n\t\t\ttype: 'rename_ind_policy',\n\t\t\ttableKey: it.from.on!,\n\t\t\toldName: it.from.name,\n\t\t\tnewName: it.to.name,\n\t\t};\n\t});\n};\n\nexport const prepareCreatePolicyJsons = (\n\ttableName: string,\n\tschema: string,\n\tpolicies: Policy[],\n): JsonCreatePolicyStatement[] => {\n\treturn policies.map((it) => {\n\t\treturn {\n\t\t\ttype: 'create_policy',\n\t\t\ttableName,\n\t\t\tdata: it,\n\t\t\tschema,\n\t\t};\n\t});\n};\n\nexport const prepareCreateIndPolicyJsons = (\n\tpolicies: Policy[],\n): JsonCreateIndPolicyStatement[] => {\n\treturn policies.map((it) => {\n\t\treturn {\n\t\t\ttype: 'create_ind_policy',\n\t\t\ttableName: it.on!,\n\t\t\tdata: it,\n\t\t};\n\t});\n};\n\nexport const prepareDropPolicyJsons = (\n\ttableName: string,\n\tschema: string,\n\tpolicies: Policy[],\n): JsonDropPolicyStatement[] => {\n\treturn policies.map((it) => {\n\t\treturn {\n\t\t\ttype: 'drop_policy',\n\t\t\ttableName,\n\t\t\tdata: it,\n\t\t\tschema,\n\t\t};\n\t});\n};\n\nexport const prepareDropIndPolicyJsons = (\n\tpolicies: Policy[],\n): JsonDropIndPolicyStatement[] => {\n\treturn policies.map((it) => {\n\t\treturn {\n\t\t\ttype: 'drop_ind_policy',\n\t\t\ttableName: it.on!,\n\t\t\tdata: it,\n\t\t};\n\t});\n};\n\nexport const prepareAlterPolicyJson = (\n\ttableName: string,\n\tschema: string,\n\toldPolicy: string,\n\tnewPolicy: string,\n): JsonAlterPolicyStatement => {\n\treturn {\n\t\ttype: 'alter_policy',\n\t\ttableName,\n\t\toldData: oldPolicy,\n\t\tnewData: newPolicy,\n\t\tschema,\n\t};\n};\n\nexport const prepareAlterIndPolicyJson = (\n\toldPolicy: Policy,\n\tnewPolicy: Policy,\n): JsonAlterIndPolicyStatement => {\n\treturn {\n\t\ttype: 'alter_ind_policy',\n\t\toldData: oldPolicy,\n\t\tnewData: newPolicy,\n\t};\n};\n\nexport const preparePgCreateIndexesJson = (\n\ttableName: string,\n\tschema: string,\n\tindexes: Record<string, string>,\n\tfullSchema: PgSchema,\n\taction?: 'push' | undefined,\n): JsonPgCreateIndexStatement[] => {\n\tif (action === 'push') {\n\t\treturn Object.values(indexes).map((indexData) => {\n\t\t\tconst unsquashedIndex = PgSquasher.unsquashIdxPush(indexData);\n\t\t\tconst data = fullSchema.tables[`${schema === '' ? 'public' : schema}.${tableName}`]\n\t\t\t\t.indexes[unsquashedIndex.name];\n\t\t\treturn {\n\t\t\t\ttype: 'create_index_pg',\n\t\t\t\ttableName,\n\t\t\t\tdata,\n\t\t\t\tschema,\n\t\t\t};\n\t\t});\n\t}\n\treturn Object.values(indexes).map((indexData) => {\n\t\treturn {\n\t\t\ttype: 'create_index_pg',\n\t\t\ttableName,\n\t\t\tdata: PgSquasher.unsquashIdx(indexData),\n\t\t\tschema,\n\t\t};\n\t});\n};\n\nexport const prepareCreateIndexesJson = (\n\ttableName: string,\n\tschema: string,\n\tindexes: Record<string, string>,\n\tinternal?: MySqlKitInternals | SQLiteKitInternals,\n): JsonCreateIndexStatement[] => {\n\treturn Object.values(indexes).map((indexData) => {\n\t\treturn {\n\t\t\ttype: 'create_index',\n\t\t\ttableName,\n\t\t\tdata: indexData,\n\t\t\tschema,\n\t\t\tinternal,\n\t\t};\n\t});\n};\n\nexport const prepareCreateReferencesJson = (\n\ttableName: string,\n\tschema: string,\n\tforeignKeys: Record<string, string>,\n): JsonCreateReferenceStatement[] => {\n\treturn Object.values(foreignKeys).map((fkData) => {\n\t\treturn {\n\t\t\ttype: 'create_reference',\n\t\t\ttableName,\n\t\t\tdata: fkData,\n\t\t\tschema,\n\t\t};\n\t});\n};\nexport const prepareLibSQLCreateReferencesJson = (\n\ttableName: string,\n\tschema: string,\n\tforeignKeys: Record<string, string>,\n\tjson2: SQLiteSchemaSquashed,\n\taction?: 'push',\n): JsonCreateReferenceStatement[] => {\n\treturn Object.values(foreignKeys).map((fkData) => {\n\t\tconst { columnsFrom, tableFrom, columnsTo } = action === 'push'\n\t\t\t? SQLiteSquasher.unsquashPushFK(fkData)\n\t\t\t: SQLiteSquasher.unsquashFK(fkData);\n\n\t\t// When trying to alter table in lib sql it is necessary to pass all config for column like \"NOT NULL\", \"DEFAULT\", etc.\n\t\t// If it is multicolumn reference it is not possible to pass this data for all columns\n\t\t// Pass multicolumn flag for sql statements to not generate migration\n\t\tlet isMulticolumn = false;\n\n\t\tif (columnsFrom.length > 1 || columnsTo.length > 1) {\n\t\t\tisMulticolumn = true;\n\n\t\t\treturn {\n\t\t\t\ttype: 'create_reference',\n\t\t\t\ttableName,\n\t\t\t\tdata: fkData,\n\t\t\t\tschema,\n\t\t\t\tisMulticolumn,\n\t\t\t};\n\t\t}\n\n\t\tconst columnFrom = columnsFrom[0];\n\n\t\tconst {\n\t\t\tnotNull: columnNotNull,\n\t\t\tdefault: columnDefault,\n\t\t\ttype: columnType,\n\t\t} = json2.tables[tableFrom].columns[columnFrom];\n\n\t\treturn {\n\t\t\ttype: 'create_reference',\n\t\t\ttableName,\n\t\t\tdata: fkData,\n\t\t\tschema,\n\t\t\tcolumnNotNull,\n\t\t\tcolumnDefault,\n\t\t\tcolumnType,\n\t\t};\n\t});\n};\n\nexport const prepareDropReferencesJson = (\n\ttableName: string,\n\tschema: string,\n\tforeignKeys: Record<string, string>,\n): JsonDeleteReferenceStatement[] => {\n\treturn Object.values(foreignKeys).map((fkData) => {\n\t\treturn {\n\t\t\ttype: 'delete_reference',\n\t\t\ttableName,\n\t\t\tdata: fkData,\n\t\t\tschema,\n\t\t};\n\t});\n};\nexport const prepareLibSQLDropReferencesJson = (\n\ttableName: string,\n\tschema: string,\n\tforeignKeys: Record<string, string>,\n\tjson2: SQLiteSchemaSquashed,\n\tmeta: SQLiteSchemaInternal['_meta'],\n\taction?: 'push',\n): JsonDeleteReferenceStatement[] => {\n\tconst statements = Object.values(foreignKeys).map((fkData) => {\n\t\tconst { columnsFrom, tableFrom, columnsTo, name, tableTo, onDelete, onUpdate } = action === 'push'\n\t\t\t? SQLiteSquasher.unsquashPushFK(fkData)\n\t\t\t: SQLiteSquasher.unsquashFK(fkData);\n\n\t\t// If all columns from where were references were deleted -> skip this logic\n\t\t// Drop columns will cover this scenario\n\t\tconst keys = Object.keys(json2.tables[tableName].columns);\n\t\tconst filtered = columnsFrom.filter((it) => keys.includes(it));\n\t\tconst fullDrop = filtered.length === 0;\n\t\tif (fullDrop) return;\n\n\t\t// When trying to alter table in lib sql it is necessary to pass all config for column like \"NOT NULL\", \"DEFAULT\", etc.\n\t\t// If it is multicolumn reference it is not possible to pass this data for all columns\n\t\t// Pass multicolumn flag for sql statements to not generate migration\n\t\tlet isMulticolumn = false;\n\n\t\tif (columnsFrom.length > 1 || columnsTo.length > 1) {\n\t\t\tisMulticolumn = true;\n\n\t\t\treturn {\n\t\t\t\ttype: 'delete_reference',\n\t\t\t\ttableName,\n\t\t\t\tdata: fkData,\n\t\t\t\tschema,\n\t\t\t\tisMulticolumn,\n\t\t\t};\n\t\t}\n\n\t\tconst columnFrom = columnsFrom[0];\n\t\tconst newTableName = getNewTableName(tableFrom, meta);\n\n\t\tconst {\n\t\t\tnotNull: columnNotNull,\n\t\t\tdefault: columnDefault,\n\t\t\ttype: columnType,\n\t\t} = json2.tables[newTableName].columns[columnFrom];\n\n\t\tconst fkToSquash = {\n\t\t\tcolumnsFrom,\n\t\t\tcolumnsTo,\n\t\t\tname,\n\t\t\ttableFrom: newTableName,\n\t\t\ttableTo,\n\t\t\tonDelete,\n\t\t\tonUpdate,\n\t\t};\n\t\tconst foreignKey = action === 'push'\n\t\t\t? SQLiteSquasher.squashPushFK(fkToSquash)\n\t\t\t: SQLiteSquasher.squashFK(fkToSquash);\n\t\treturn {\n\t\t\ttype: 'delete_reference',\n\t\t\ttableName,\n\t\t\tdata: foreignKey,\n\t\t\tschema,\n\t\t\tcolumnNotNull,\n\t\t\tcolumnDefault,\n\t\t\tcolumnType,\n\t\t};\n\t});\n\n\treturn statements.filter((it) => it) as JsonDeleteReferenceStatement[];\n};\n\n// alter should create 2 statements. It's important to make only 1 sql per statement(for breakpoints)\nexport const prepareAlterReferencesJson = (\n\ttableName: string,\n\tschema: string,\n\tforeignKeys: Record<string, { __old: string; __new: string }>,\n): JsonReferenceStatement[] => {\n\tconst stmts: JsonReferenceStatement[] = [];\n\tObject.values(foreignKeys).map((val) => {\n\t\tstmts.push({\n\t\t\ttype: 'delete_reference',\n\t\t\ttableName,\n\t\t\tschema,\n\t\t\tdata: val.__old,\n\t\t});\n\n\t\tstmts.push({\n\t\t\ttype: 'create_reference',\n\t\t\ttableName,\n\t\t\tschema,\n\t\t\tdata: val.__new,\n\t\t});\n\t});\n\treturn stmts;\n};\n\nexport const prepareDropIndexesJson = (\n\ttableName: string,\n\tschema: string,\n\tindexes: Record<string, string>,\n): JsonDropIndexStatement[] => {\n\treturn Object.values(indexes).map((indexData) => {\n\t\treturn {\n\t\t\ttype: 'drop_index',\n\t\t\ttableName,\n\t\t\tdata: indexData,\n\t\t\tschema,\n\t\t};\n\t});\n};\n\nexport const prepareAddCompositePrimaryKeySqlite = (\n\ttableName: string,\n\tpks: Record<string, string>,\n): JsonCreateCompositePK[] => {\n\treturn Object.values(pks).map((it) => {\n\t\treturn {\n\t\t\ttype: 'create_composite_pk',\n\t\t\ttableName,\n\t\t\tdata: it,\n\t\t} as JsonCreateCompositePK;\n\t});\n};\n\nexport const prepareDeleteCompositePrimaryKeySqlite = (\n\ttableName: string,\n\tpks: Record<string, string>,\n): JsonDeleteCompositePK[] => {\n\treturn Object.values(pks).map((it) => {\n\t\treturn {\n\t\t\ttype: 'delete_composite_pk',\n\t\t\ttableName,\n\t\t\tdata: it,\n\t\t} as JsonDeleteCompositePK;\n\t});\n};\n\nexport const prepareAlterCompositePrimaryKeySqlite = (\n\ttableName: string,\n\tpks: Record<string, { __old: string; __new: string }>,\n): JsonAlterCompositePK[] => {\n\treturn Object.values(pks).map((it) => {\n\t\treturn {\n\t\t\ttype: 'alter_composite_pk',\n\t\t\ttableName,\n\t\t\told: it.__old,\n\t\t\tnew: it.__new,\n\t\t} as JsonAlterCompositePK;\n\t});\n};\n\nexport const prepareAddCompositePrimaryKeyPg = (\n\ttableName: string,\n\tschema: string,\n\tpks: Record<string, string>,\n\t// TODO: remove?\n\tjson2: PgSchema,\n): JsonCreateCompositePK[] => {\n\treturn Object.values(pks).map((it) => {\n\t\tconst unsquashed = PgSquasher.unsquashPK(it);\n\t\treturn {\n\t\t\ttype: 'create_composite_pk',\n\t\t\ttableName,\n\t\t\tdata: it,\n\t\t\tschema,\n\t\t\tconstraintName: PgSquasher.unsquashPK(it).name,\n\t\t} as JsonCreateCompositePK;\n\t});\n};\n\nexport const prepareDeleteCompositePrimaryKeyPg = (\n\ttableName: string,\n\tschema: string,\n\tpks: Record<string, string>,\n\t// TODO: remove?\n\tjson1: PgSchema,\n): JsonDeleteCompositePK[] => {\n\treturn Object.values(pks).map((it) => {\n\t\treturn {\n\t\t\ttype: 'delete_composite_pk',\n\t\t\ttableName,\n\t\t\tdata: it,\n\t\t\tschema,\n\t\t\tconstraintName: PgSquasher.unsquashPK(it).name,\n\t\t} as JsonDeleteCompositePK;\n\t});\n};\n\nexport const prepareAlterCompositePrimaryKeyPg = (\n\ttableName: string,\n\tschema: string,\n\tpks: Record<string, { __old: string; __new: string }>,\n\t// TODO: remove?\n\tjson1: PgSchema,\n\tjson2: PgSchema,\n): JsonAlterCompositePK[] => {\n\treturn Object.values(pks).map((it) => {\n\t\treturn {\n\t\t\ttype: 'alter_composite_pk',\n\t\t\ttableName,\n\t\t\told: it.__old,\n\t\t\tnew: it.__new,\n\t\t\tschema,\n\t\t\toldConstraintName: PgSquasher.unsquashPK(it.__old).name,\n\t\t\tnewConstraintName: PgSquasher.unsquashPK(it.__new).name,\n\t\t} as JsonAlterCompositePK;\n\t});\n};\n\nexport const prepareAddUniqueConstraintPg = (\n\ttableName: string,\n\tschema: string,\n\tunqs: Record<string, string>,\n): JsonCreateUniqueConstraint[] => {\n\treturn Object.values(unqs).map((it) => {\n\t\treturn {\n\t\t\ttype: 'create_unique_constraint',\n\t\t\ttableName,\n\t\t\tdata: it,\n\t\t\tschema,\n\t\t} as JsonCreateUniqueConstraint;\n\t});\n};\n\nexport const prepareDeleteUniqueConstraintPg = (\n\ttableName: string,\n\tschema: string,\n\tunqs: Record<string, string>,\n): JsonDeleteUniqueConstraint[] => {\n\treturn Object.values(unqs).map((it) => {\n\t\treturn {\n\t\t\ttype: 'delete_unique_constraint',\n\t\t\ttableName,\n\t\t\tdata: it,\n\t\t\tschema,\n\t\t} as JsonDeleteUniqueConstraint;\n\t});\n};\n\nexport const prepareAddCheckConstraint = (\n\ttableName: string,\n\tschema: string,\n\tcheck: Record<string, string>,\n): JsonCreateCheckConstraint[] => {\n\treturn Object.values(check).map((it) => {\n\t\treturn {\n\t\t\ttype: 'create_check_constraint',\n\t\t\ttableName,\n\t\t\tdata: it,\n\t\t\tschema,\n\t\t} as JsonCreateCheckConstraint;\n\t});\n};\n\nexport const prepareDeleteCheckConstraint = (\n\ttableName: string,\n\tschema: string,\n\tcheck: Record<string, string>,\n): JsonDeleteCheckConstraint[] => {\n\treturn Object.values(check).map((it) => {\n\t\treturn {\n\t\t\ttype: 'delete_check_constraint',\n\t\t\ttableName,\n\t\t\tconstraintName: PgSquasher.unsquashCheck(it).name,\n\t\t\tschema,\n\t\t} as JsonDeleteCheckConstraint;\n\t});\n};\n\n// add create table changes\n// add handler to make drop and add and not alter(looking at __old and __new)\n// add serializer for mysql and sqlite + types\n// add introspect serializer for pg+sqlite+mysql\n// add introspect actual code\n// add push sqlite handler\n// add push mysql warning if data exists and may have unique conflict\n// add release notes\n// add docs changes\n\nexport const prepareAlterUniqueConstraintPg = (\n\ttableName: string,\n\tschema: string,\n\tunqs: Record<string, { __old: string; __new: string }>,\n): JsonAlterUniqueConstraint[] => {\n\treturn Object.values(unqs).map((it) => {\n\t\treturn {\n\t\t\ttype: 'alter_unique_constraint',\n\t\t\ttableName,\n\t\t\told: it.__old,\n\t\t\tnew: it.__new,\n\t\t\tschema,\n\t\t} as JsonAlterUniqueConstraint;\n\t});\n};\n\nexport const prepareAddCompositePrimaryKeyMySql = (\n\ttableName: string,\n\tpks: Record<string, string>,\n\t// TODO: remove?\n\tjson1: MySqlSchema,\n\tjson2: MySqlSchema,\n): JsonCreateCompositePK[] => {\n\tconst res: JsonCreateCompositePK[] = [];\n\tfor (const it of Object.values(pks)) {\n\t\tconst unsquashed = MySqlSquasher.unsquashPK(it);\n\n\t\tif (\n\t\t\tunsquashed.columns.length === 1\n\t\t\t&& json1.tables[tableName]?.columns[unsquashed.columns[0]]?.primaryKey\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tres.push({\n\t\t\ttype: 'create_composite_pk',\n\t\t\ttableName,\n\t\t\tdata: it,\n\t\t\tconstraintName: unsquashed.name,\n\t\t} as JsonCreateCompositePK);\n\t}\n\treturn res;\n};\n\nexport const prepareDeleteCompositePrimaryKeyMySql = (\n\ttableName: string,\n\tpks: Record<string, string>,\n\t// TODO: remove?\n\tjson1: MySqlSchema,\n): JsonDeleteCompositePK[] => {\n\treturn Object.values(pks).map((it) => {\n\t\tconst unsquashed = MySqlSquasher.unsquashPK(it);\n\t\treturn {\n\t\t\ttype: 'delete_composite_pk',\n\t\t\ttableName,\n\t\t\tdata: it,\n\t\t} as JsonDeleteCompositePK;\n\t});\n};\n\nexport const prepareAlterCompositePrimaryKeyMySql = (\n\ttableName: string,\n\tpks: Record<string, { __old: string; __new: string }>,\n\t// TODO: remove?\n\tjson1: MySqlSchema,\n\tjson2: MySqlSchema,\n): JsonAlterCompositePK[] => {\n\treturn Object.values(pks).map((it) => {\n\t\treturn {\n\t\t\ttype: 'alter_composite_pk',\n\t\t\ttableName,\n\t\t\told: it.__old,\n\t\t\tnew: it.__new,\n\t\t\toldConstraintName: json1.tables[tableName].compositePrimaryKeys[\n\t\t\t\tMySqlSquasher.unsquashPK(it.__old).name\n\t\t\t].name,\n\t\t\tnewConstraintName: json2.tables[tableName].compositePrimaryKeys[\n\t\t\t\tMySqlSquasher.unsquashPK(it.__new).name\n\t\t\t].name,\n\t\t} as JsonAlterCompositePK;\n\t});\n};\n\nexport const preparePgCreateViewJson = (\n\tname: string,\n\tschema: string,\n\tdefinition: string,\n\tmaterialized: boolean,\n\twithNoData: boolean = false,\n\twithOption?: any,\n\tusing?: string,\n\ttablespace?: string,\n): JsonCreatePgViewStatement => {\n\treturn {\n\t\ttype: 'create_view',\n\t\tname: name,\n\t\tschema: schema,\n\t\tdefinition: definition,\n\t\twith: withOption,\n\t\tmaterialized: materialized,\n\t\twithNoData,\n\t\tusing,\n\t\ttablespace,\n\t};\n};\n\nexport const prepareMySqlCreateViewJson = (\n\tname: string,\n\tdefinition: string,\n\tmeta: string,\n\treplace: boolean = false,\n): JsonCreateMySqlViewStatement => {\n\tconst { algorithm, sqlSecurity, withCheckOption } = MySqlSquasher.unsquashView(meta);\n\treturn {\n\t\ttype: 'mysql_create_view',\n\t\tname: name,\n\t\tdefinition: definition,\n\t\talgorithm,\n\t\tsqlSecurity,\n\t\twithCheckOption,\n\t\treplace,\n\t};\n};\n\n/* export const prepareSingleStoreCreateViewJson = (\n\tname: string,\n\tdefinition: string,\n\tmeta: string,\n\treplace: boolean = false,\n): JsonCreateSingleStoreViewStatement => {\n\tconst { algorithm, sqlSecurity, withCheckOption } = SingleStoreSquasher.unsquashView(meta);\n\treturn {\n\t\ttype: 'singlestore_create_view',\n\t\tname: name,\n\t\tdefinition: definition,\n\t\talgorithm,\n\t\tsqlSecurity,\n\t\twithCheckOption,\n\t\treplace,\n\t};\n}; */\n\nexport const prepareSqliteCreateViewJson = (\n\tname: string,\n\tdefinition: string,\n): JsonCreateSqliteViewStatement => {\n\treturn {\n\t\ttype: 'sqlite_create_view',\n\t\tname: name,\n\t\tdefinition: definition,\n\t};\n};\n\nexport const prepareDropViewJson = (\n\tname: string,\n\tschema?: string,\n\tmaterialized?: boolean,\n): JsonDropViewStatement => {\n\tconst resObject: JsonDropViewStatement = <JsonDropViewStatement> { name, type: 'drop_view' };\n\n\tif (schema) resObject['schema'] = schema;\n\n\tif (materialized) resObject['materialized'] = materialized;\n\n\treturn resObject;\n};\n\nexport const prepareRenameViewJson = (\n\tto: string,\n\tfrom: string,\n\tschema?: string,\n\tmaterialized?: boolean,\n): JsonRenameViewStatement => {\n\tconst resObject: JsonRenameViewStatement = <JsonRenameViewStatement> {\n\t\ttype: 'rename_view',\n\t\tnameTo: to,\n\t\tnameFrom: from,\n\t};\n\n\tif (schema) resObject['schema'] = schema;\n\tif (materialized) resObject['materialized'] = materialized;\n\n\treturn resObject;\n};\n\nexport const preparePgAlterViewAlterSchemaJson = (\n\tto: string,\n\tfrom: string,\n\tname: string,\n\tmaterialized?: boolean,\n): JsonAlterViewAlterSchemaStatement => {\n\tconst returnObject: JsonAlterViewAlterSchemaStatement = {\n\t\ttype: 'alter_view_alter_schema',\n\t\tfromSchema: from,\n\t\ttoSchema: to,\n\t\tname,\n\t};\n\n\tif (materialized) returnObject['materialized'] = materialized;\n\treturn returnObject;\n};\n\nexport const preparePgAlterViewAddWithOptionJson = (\n\tname: string,\n\tschema: string,\n\tmaterialized: boolean,\n\twithOption: MatViewWithOption | ViewWithOption,\n): JsonAlterViewAddWithOptionStatement => {\n\treturn {\n\t\ttype: 'alter_view_add_with_option',\n\t\tname,\n\t\tschema,\n\t\tmaterialized: materialized,\n\t\twith: withOption,\n\t} as JsonAlterViewAddWithOptionStatement;\n};\n\nexport const preparePgAlterViewDropWithOptionJson = (\n\tname: string,\n\tschema: string,\n\tmaterialized: boolean,\n\twithOption: MatViewWithOption | ViewWithOption,\n): JsonAlterViewDropWithOptionStatement => {\n\treturn {\n\t\ttype: 'alter_view_drop_with_option',\n\t\tname,\n\t\tschema,\n\t\tmaterialized: materialized,\n\t\twith: withOption,\n\t} as JsonAlterViewDropWithOptionStatement;\n};\n\nexport const preparePgAlterViewAlterTablespaceJson = (\n\tname: string,\n\tschema: string,\n\tmaterialized: boolean,\n\tto: string,\n): JsonAlterViewAlterTablespaceStatement => {\n\treturn {\n\t\ttype: 'alter_view_alter_tablespace',\n\t\tname,\n\t\tschema,\n\t\tmaterialized: materialized,\n\t\ttoTablespace: to,\n\t} as JsonAlterViewAlterTablespaceStatement;\n};\n\nexport const preparePgAlterViewAlterUsingJson = (\n\tname: string,\n\tschema: string,\n\tmaterialized: boolean,\n\tto: string,\n): JsonAlterViewAlterUsingStatement => {\n\treturn {\n\t\ttype: 'alter_view_alter_using',\n\t\tname,\n\t\tschema,\n\t\tmaterialized: materialized,\n\t\ttoUsing: to,\n\t} as JsonAlterViewAlterUsingStatement;\n};\n\nexport const prepareMySqlAlterView = (\n\tview: Omit<MySqlView, 'isExisting'>,\n): JsonAlterMySqlViewStatement => {\n\treturn { type: 'alter_mysql_view', ...view };\n};\n\n/* export const prepareSingleStoreAlterView = (\n\tview: Omit<SingleStoreView, 'isExisting'>,\n): JsonAlterSingleStoreViewStatement => {\n\treturn { type: 'alter_singlestore_view', ...view };\n}; */\n"
  },
  {
    "path": "drizzle-kit/src/loader.mjs",
    "content": "import esbuild from 'esbuild';\nimport { readFileSync } from 'fs';\nimport * as path from 'path';\n\nconst parse = (it) => {\n\tif (!it) return { drizzle: false };\n\n\tif (it.endsWith('__drizzle__')) {\n\t\tconst offset = it.startsWith('file://') ? 'file://'.length : 0;\n\t\tconst clean = it.slice(offset, -'__drizzle__'.length);\n\t\treturn { drizzle: true, clean, original: it };\n\t}\n\treturn { drizzle: false, clean: it };\n};\n\nexport function resolve(specifier, context, nextResolve) {\n\tconst { drizzle, clean } = parse(specifier);\n\tif (drizzle && !clean.endsWith('.ts') && !clean.endsWith('.mts')) {\n\t\treturn nextResolve(clean);\n\t}\n\n\tif (drizzle) {\n\t\treturn {\n\t\t\tshortCircuit: true,\n\t\t\turl: `file://${specifier}`,\n\t\t};\n\t}\n\n\tconst parsedParent = parse(context.parentURL);\n\tconst parentURL = parsedParent.drizzle\n\t\t? new URL(`file://${path.resolve(parsedParent.clean)}`)\n\t\t: context.parentURL;\n\n\t// Let Node.js handle all other specifiers.\n\treturn nextResolve(specifier, { ...context, parentURL });\n}\n\nexport async function load(url, context, defaultLoad) {\n\tconst { drizzle, clean } = parse(url);\n\tif (drizzle) {\n\t\tconst file = readFileSync(clean, 'utf-8');\n\t\tif (clean.endsWith('.ts') || clean.endsWith('.mts')) {\n\t\t\tconst source = esbuild.transformSync(file, {\n\t\t\t\tloader: 'ts',\n\t\t\t\tformat: 'esm',\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tformat: 'module',\n\t\t\t\tshortCircuit: true,\n\t\t\t\tsource: source.code,\n\t\t\t};\n\t\t}\n\t}\n\n\t// let Node.js handle all other URLs\n\treturn defaultLoad(url, context, defaultLoad);\n}\n"
  },
  {
    "path": "drizzle-kit/src/migrationPreparator.ts",
    "content": "import { randomUUID } from 'crypto';\nimport fs from 'fs';\nimport { CasingType } from './cli/validations/common';\nimport { serializeMySql, serializePg, serializeSingleStore, serializeSQLite } from './serializer';\nimport { dryMySql, MySqlSchema, mysqlSchema } from './serializer/mysqlSchema';\nimport { dryPg, PgSchema, pgSchema } from './serializer/pgSchema';\nimport { drySingleStore, SingleStoreSchema, singlestoreSchema } from './serializer/singlestoreSchema';\nimport { drySQLite, SQLiteSchema, sqliteSchema } from './serializer/sqliteSchema';\n\nexport const prepareMySqlDbPushSnapshot = async (\n\tprev: MySqlSchema,\n\tschemaPath: string | string[],\n\tcasing: CasingType | undefined,\n): Promise<{ prev: MySqlSchema; cur: MySqlSchema }> => {\n\tconst serialized = await serializeMySql(schemaPath, casing);\n\n\tconst id = randomUUID();\n\tconst idPrev = prev.id;\n\n\tconst { version, dialect, ...rest } = serialized;\n\tconst result: MySqlSchema = { version, dialect, id, prevId: idPrev, ...rest };\n\n\treturn { prev, cur: result };\n};\n\nexport const prepareSingleStoreDbPushSnapshot = async (\n\tprev: SingleStoreSchema,\n\tschemaPath: string | string[],\n\tcasing: CasingType | undefined,\n): Promise<{ prev: SingleStoreSchema; cur: SingleStoreSchema }> => {\n\tconst serialized = await serializeSingleStore(schemaPath, casing);\n\n\tconst id = randomUUID();\n\tconst idPrev = prev.id;\n\n\tconst { version, dialect, ...rest } = serialized;\n\tconst result: SingleStoreSchema = { version, dialect, id, prevId: idPrev, ...rest };\n\n\treturn { prev, cur: result };\n};\n\nexport const prepareSQLiteDbPushSnapshot = async (\n\tprev: SQLiteSchema,\n\tschemaPath: string | string[],\n\tcasing: CasingType | undefined,\n): Promise<{ prev: SQLiteSchema; cur: SQLiteSchema }> => {\n\tconst serialized = await serializeSQLite(schemaPath, casing);\n\n\tconst id = randomUUID();\n\tconst idPrev = prev.id;\n\n\tconst { version, dialect, ...rest } = serialized;\n\tconst result: SQLiteSchema = {\n\t\tversion,\n\t\tdialect,\n\t\tid,\n\t\tprevId: idPrev,\n\t\t...rest,\n\t};\n\n\treturn { prev, cur: result };\n};\n\nexport const preparePgDbPushSnapshot = async (\n\tprev: PgSchema,\n\tschemaPath: string | string[],\n\tcasing: CasingType | undefined,\n\tschemaFilter: string[] = ['public'],\n): Promise<{ prev: PgSchema; cur: PgSchema }> => {\n\tconst serialized = await serializePg(schemaPath, casing, schemaFilter);\n\n\tconst id = randomUUID();\n\tconst idPrev = prev.id;\n\n\tconst { version, dialect, ...rest } = serialized;\n\tconst result: PgSchema = { version, dialect, id, prevId: idPrev, ...rest };\n\n\treturn { prev, cur: result };\n};\n\nexport const prepareMySqlMigrationSnapshot = async (\n\tmigrationFolders: string[],\n\tschemaPath: string | string[],\n\tcasing: CasingType | undefined,\n): Promise<{ prev: MySqlSchema; cur: MySqlSchema; custom: MySqlSchema }> => {\n\tconst prevSnapshot = mysqlSchema.parse(\n\t\tpreparePrevSnapshot(migrationFolders, dryMySql),\n\t);\n\tconst serialized = await serializeMySql(schemaPath, casing);\n\n\tconst id = randomUUID();\n\tconst idPrev = prevSnapshot.id;\n\n\tconst { version, dialect, ...rest } = serialized;\n\tconst result: MySqlSchema = { version, dialect, id, prevId: idPrev, ...rest };\n\n\tconst { id: _ignoredId, prevId: _ignoredPrevId, ...prevRest } = prevSnapshot;\n\n\t// that's for custom migrations, when we need new IDs, but old snapshot\n\tconst custom: MySqlSchema = {\n\t\tid,\n\t\tprevId: idPrev,\n\t\t...prevRest,\n\t};\n\n\treturn { prev: prevSnapshot, cur: result, custom };\n};\n\nexport const prepareSingleStoreMigrationSnapshot = async (\n\tmigrationFolders: string[],\n\tschemaPath: string | string[],\n\tcasing: CasingType | undefined,\n): Promise<{ prev: SingleStoreSchema; cur: SingleStoreSchema; custom: SingleStoreSchema }> => {\n\tconst prevSnapshot = singlestoreSchema.parse(\n\t\tpreparePrevSnapshot(migrationFolders, drySingleStore),\n\t);\n\tconst serialized = await serializeSingleStore(schemaPath, casing);\n\n\tconst id = randomUUID();\n\tconst idPrev = prevSnapshot.id;\n\n\tconst { version, dialect, ...rest } = serialized;\n\tconst result: SingleStoreSchema = { version, dialect, id, prevId: idPrev, ...rest };\n\n\tconst { id: _ignoredId, prevId: _ignoredPrevId, ...prevRest } = prevSnapshot;\n\n\t// that's for custom migrations, when we need new IDs, but old snapshot\n\tconst custom: SingleStoreSchema = {\n\t\tid,\n\t\tprevId: idPrev,\n\t\t...prevRest,\n\t};\n\n\treturn { prev: prevSnapshot, cur: result, custom };\n};\n\nexport const prepareSqliteMigrationSnapshot = async (\n\tsnapshots: string[],\n\tschemaPath: string | string[],\n\tcasing: CasingType | undefined,\n): Promise<{ prev: SQLiteSchema; cur: SQLiteSchema; custom: SQLiteSchema }> => {\n\tconst prevSnapshot = sqliteSchema.parse(\n\t\tpreparePrevSnapshot(snapshots, drySQLite),\n\t);\n\tconst serialized = await serializeSQLite(schemaPath, casing);\n\n\tconst id = randomUUID();\n\tconst idPrev = prevSnapshot.id;\n\n\tconst { version, dialect, ...rest } = serialized;\n\tconst result: SQLiteSchema = {\n\t\tversion,\n\t\tdialect,\n\t\tid,\n\t\tprevId: idPrev,\n\t\t...rest,\n\t};\n\n\tconst { id: _ignoredId, prevId: _ignoredPrevId, ...prevRest } = prevSnapshot;\n\n\t// that's for custom migrations, when we need new IDs, but old snapshot\n\tconst custom: SQLiteSchema = {\n\t\tid,\n\t\tprevId: idPrev,\n\t\t...prevRest,\n\t};\n\n\treturn { prev: prevSnapshot, cur: result, custom };\n};\n\nexport const preparePgMigrationSnapshot = async (\n\tsnapshots: string[],\n\tschemaPath: string | string[],\n\tcasing: CasingType | undefined,\n): Promise<{ prev: PgSchema; cur: PgSchema; custom: PgSchema }> => {\n\tconst prevSnapshot = pgSchema.parse(preparePrevSnapshot(snapshots, dryPg));\n\tconst serialized = await serializePg(schemaPath, casing);\n\n\tconst id = randomUUID();\n\tconst idPrev = prevSnapshot.id;\n\n\t// const { version, dialect, ...rest } = serialized;\n\n\tconst result: PgSchema = { id, prevId: idPrev, ...serialized };\n\n\tconst { id: _ignoredId, prevId: _ignoredPrevId, ...prevRest } = prevSnapshot;\n\n\t// that's for custom migrations, when we need new IDs, but old snapshot\n\tconst custom: PgSchema = {\n\t\tid,\n\t\tprevId: idPrev,\n\t\t...prevRest,\n\t};\n\n\treturn { prev: prevSnapshot, cur: result, custom };\n};\n\nconst preparePrevSnapshot = (snapshots: string[], defaultPrev: any) => {\n\tlet prevSnapshot: any;\n\n\tif (snapshots.length === 0) {\n\t\tprevSnapshot = defaultPrev;\n\t} else {\n\t\tconst lastSnapshot = snapshots[snapshots.length - 1];\n\t\tprevSnapshot = JSON.parse(fs.readFileSync(lastSnapshot).toString());\n\t}\n\treturn prevSnapshot;\n};\n"
  },
  {
    "path": "drizzle-kit/src/schemaValidator.ts",
    "content": "import { enum as enumType, TypeOf, union } from 'zod';\nimport { mysqlSchema, mysqlSchemaSquashed } from './serializer/mysqlSchema';\nimport { pgSchema, pgSchemaSquashed } from './serializer/pgSchema';\nimport { singlestoreSchema, singlestoreSchemaSquashed } from './serializer/singlestoreSchema';\nimport { sqliteSchema, SQLiteSchemaSquashed } from './serializer/sqliteSchema';\n\nexport const dialects = ['postgresql', 'mysql', 'sqlite', 'turso', 'singlestore', 'gel'] as const;\nexport const dialect = enumType(dialects);\n\nexport type Dialect = (typeof dialects)[number];\nconst _: Dialect = '' as TypeOf<typeof dialect>;\n\nconst commonSquashedSchema = union([\n\tpgSchemaSquashed,\n\tmysqlSchemaSquashed,\n\tSQLiteSchemaSquashed,\n\tsinglestoreSchemaSquashed,\n]);\n\nconst commonSchema = union([pgSchema, mysqlSchema, sqliteSchema, singlestoreSchema]);\n\nexport type CommonSquashedSchema = TypeOf<typeof commonSquashedSchema>;\nexport type CommonSchema = TypeOf<typeof commonSchema>;\n"
  },
  {
    "path": "drizzle-kit/src/serializer/gelSchema.ts",
    "content": "import { mapValues, originUUID, snapshotVersion } from '../global';\n\nimport { any, array, boolean, enum as enumType, literal, number, object, record, string, TypeOf, union } from 'zod';\n\nconst enumSchema = object({\n\tname: string(),\n\tschema: string(),\n\tvalues: string().array(),\n}).strict();\n\nconst enumSchemaV1 = object({\n\tname: string(),\n\tvalues: record(string(), string()),\n}).strict();\n\nconst indexColumn = object({\n\texpression: string(),\n\tisExpression: boolean(),\n\tasc: boolean(),\n\tnulls: string().optional(),\n\topclass: string().optional(),\n});\n\nexport type IndexColumnType = TypeOf<typeof indexColumn>;\n\nconst index = object({\n\tname: string(),\n\tcolumns: indexColumn.array(),\n\tisUnique: boolean(),\n\twith: record(string(), any()).optional(),\n\tmethod: string().default('btree'),\n\twhere: string().optional(),\n\tconcurrently: boolean().default(false),\n}).strict();\n\nconst fk = object({\n\tname: string(),\n\ttableFrom: string(),\n\tcolumnsFrom: string().array(),\n\ttableTo: string(),\n\tschemaTo: string().optional(),\n\tcolumnsTo: string().array(),\n\tonUpdate: string().optional(),\n\tonDelete: string().optional(),\n}).strict();\n\nexport const sequenceSchema = object({\n\tname: string(),\n\tincrement: string().optional(),\n\tminValue: string().optional(),\n\tmaxValue: string().optional(),\n\tstartWith: string().optional(),\n\tcache: string().optional(),\n\tcycle: boolean().optional(),\n\tschema: string(),\n}).strict();\n\nexport const roleSchema = object({\n\tname: string(),\n\tcreateDb: boolean().optional(),\n\tcreateRole: boolean().optional(),\n\tinherit: boolean().optional(),\n}).strict();\n\nexport const sequenceSquashed = object({\n\tname: string(),\n\tschema: string(),\n\tvalues: string(),\n}).strict();\n\nconst column = object({\n\tname: string(),\n\ttype: string(),\n\ttypeSchema: string().optional(),\n\tprimaryKey: boolean(),\n\tnotNull: boolean(),\n\tdefault: any().optional(),\n\tisUnique: any().optional(),\n\tuniqueName: string().optional(),\n\tnullsNotDistinct: boolean().optional(),\n\tgenerated: object({\n\t\ttype: literal('stored'),\n\t\tas: string(),\n\t}).optional(),\n\tidentity: sequenceSchema\n\t\t.merge(object({ type: enumType(['always', 'byDefault']) }))\n\t\t.optional(),\n}).strict();\n\nconst checkConstraint = object({\n\tname: string(),\n\tvalue: string(),\n}).strict();\n\nconst columnSquashed = object({\n\tname: string(),\n\ttype: string(),\n\ttypeSchema: string().optional(),\n\tprimaryKey: boolean(),\n\tnotNull: boolean(),\n\tdefault: any().optional(),\n\tisUnique: any().optional(),\n\tuniqueName: string().optional(),\n\tnullsNotDistinct: boolean().optional(),\n\tgenerated: object({\n\t\ttype: literal('stored'),\n\t\tas: string(),\n\t}).optional(),\n\tidentity: string().optional(),\n}).strict();\n\nconst compositePK = object({\n\tname: string(),\n\tcolumns: string().array(),\n}).strict();\n\nconst uniqueConstraint = object({\n\tname: string(),\n\tcolumns: string().array(),\n\tnullsNotDistinct: boolean(),\n}).strict();\n\nexport const policy = object({\n\tname: string(),\n\tas: enumType(['PERMISSIVE', 'RESTRICTIVE']).optional(),\n\tfor: enumType(['ALL', 'SELECT', 'INSERT', 'UPDATE', 'DELETE']).optional(),\n\tto: string().array().optional(),\n\tusing: string().optional(),\n\twithCheck: string().optional(),\n\ton: string().optional(),\n\tschema: string().optional(),\n}).strict();\n\nexport const policySquashed = object({\n\tname: string(),\n\tvalues: string(),\n}).strict();\n\nconst viewWithOption = object({\n\tcheckOption: enumType(['local', 'cascaded']).optional(),\n\tsecurityBarrier: boolean().optional(),\n\tsecurityInvoker: boolean().optional(),\n}).strict();\n\nconst matViewWithOption = object({\n\tfillfactor: number().optional(),\n\ttoastTupleTarget: number().optional(),\n\tparallelWorkers: number().optional(),\n\tautovacuumEnabled: boolean().optional(),\n\tvacuumIndexCleanup: enumType(['auto', 'off', 'on']).optional(),\n\tvacuumTruncate: boolean().optional(),\n\tautovacuumVacuumThreshold: number().optional(),\n\tautovacuumVacuumScaleFactor: number().optional(),\n\tautovacuumVacuumCostDelay: number().optional(),\n\tautovacuumVacuumCostLimit: number().optional(),\n\tautovacuumFreezeMinAge: number().optional(),\n\tautovacuumFreezeMaxAge: number().optional(),\n\tautovacuumFreezeTableAge: number().optional(),\n\tautovacuumMultixactFreezeMinAge: number().optional(),\n\tautovacuumMultixactFreezeMaxAge: number().optional(),\n\tautovacuumMultixactFreezeTableAge: number().optional(),\n\tlogAutovacuumMinDuration: number().optional(),\n\tuserCatalogTable: boolean().optional(),\n}).strict();\n\nexport const mergedViewWithOption = viewWithOption.merge(matViewWithOption).strict();\n\nexport const view = object({\n\tname: string(),\n\tschema: string(),\n\tcolumns: record(string(), column),\n\tdefinition: string().optional(),\n\tmaterialized: boolean(),\n\twith: mergedViewWithOption.optional(),\n\tisExisting: boolean(),\n\twithNoData: boolean().optional(),\n\tusing: string().optional(),\n\ttablespace: string().optional(),\n}).strict();\n\nconst table = object({\n\tname: string(),\n\tschema: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), index),\n\tforeignKeys: record(string(), fk),\n\tcompositePrimaryKeys: record(string(), compositePK),\n\tuniqueConstraints: record(string(), uniqueConstraint).default({}),\n\tpolicies: record(string(), policy).default({}),\n\tcheckConstraints: record(string(), checkConstraint).default({}),\n\tisRLSEnabled: boolean().default(false),\n}).strict();\n\nconst schemaHash = object({\n\tid: string(),\n\tprevId: string(),\n});\n\nexport const kitInternals = object({\n\ttables: record(\n\t\tstring(),\n\t\tobject({\n\t\t\tcolumns: record(\n\t\t\t\tstring(),\n\t\t\t\tobject({\n\t\t\t\t\tisArray: boolean().optional(),\n\t\t\t\t\tdimensions: number().optional(),\n\t\t\t\t\trawType: string().optional(),\n\t\t\t\t\tisDefaultAnExpression: boolean().optional(),\n\t\t\t\t}).optional(),\n\t\t\t),\n\t\t}).optional(),\n\t),\n}).optional();\n\nexport const gelSchemaExternal = object({\n\tversion: literal('1'),\n\tdialect: literal('gel'),\n\ttables: array(table),\n\tenums: array(enumSchemaV1),\n\tschemas: array(object({ name: string() })),\n\t_meta: object({\n\t\tschemas: record(string(), string()),\n\t\ttables: record(string(), string()),\n\t\tcolumns: record(string(), string()),\n\t}),\n}).strict();\n\nexport const gelSchemaInternal = object({\n\tversion: literal('1'),\n\tdialect: literal('gel'),\n\ttables: record(string(), table),\n\tenums: record(string(), enumSchema),\n\tschemas: record(string(), string()),\n\tviews: record(string(), view).default({}),\n\tsequences: record(string(), sequenceSchema).default({}),\n\troles: record(string(), roleSchema).default({}),\n\tpolicies: record(string(), policy).default({}),\n\t_meta: object({\n\t\tschemas: record(string(), string()),\n\t\ttables: record(string(), string()),\n\t\tcolumns: record(string(), string()),\n\t}),\n\tinternal: kitInternals,\n}).strict();\n\nconst tableSquashed = object({\n\tname: string(),\n\tschema: string(),\n\tcolumns: record(string(), columnSquashed),\n\tindexes: record(string(), string()),\n\tforeignKeys: record(string(), string()),\n\tcompositePrimaryKeys: record(string(), string()),\n\tuniqueConstraints: record(string(), string()),\n\tpolicies: record(string(), string()),\n\tcheckConstraints: record(string(), string()),\n\tisRLSEnabled: boolean().default(false),\n}).strict();\n\nexport const gelSchemaSquashed = object({\n\tversion: literal('1'),\n\tdialect: literal('gel'),\n\ttables: record(string(), tableSquashed),\n\tenums: record(string(), enumSchema),\n\tschemas: record(string(), string()),\n\tviews: record(string(), view),\n\tsequences: record(string(), sequenceSquashed),\n\troles: record(string(), roleSchema).default({}),\n\tpolicies: record(string(), policySquashed).default({}),\n}).strict();\n\nexport const gelSchema = gelSchemaInternal.merge(schemaHash);\n\nexport type Enum = TypeOf<typeof enumSchema>;\nexport type Sequence = TypeOf<typeof sequenceSchema>;\nexport type Role = TypeOf<typeof roleSchema>;\nexport type Column = TypeOf<typeof column>;\nexport type Table = TypeOf<typeof table>;\nexport type GelSchema = TypeOf<typeof gelSchema>;\nexport type GelSchemaInternal = TypeOf<typeof gelSchemaInternal>;\nexport type GelSchemaExternal = TypeOf<typeof gelSchemaExternal>;\nexport type GelSchemaSquashed = TypeOf<typeof gelSchemaSquashed>;\nexport type Index = TypeOf<typeof index>;\nexport type ForeignKey = TypeOf<typeof fk>;\nexport type PrimaryKey = TypeOf<typeof compositePK>;\nexport type UniqueConstraint = TypeOf<typeof uniqueConstraint>;\nexport type Policy = TypeOf<typeof policy>;\nexport type View = TypeOf<typeof view>;\nexport type MatViewWithOption = TypeOf<typeof matViewWithOption>;\nexport type ViewWithOption = TypeOf<typeof viewWithOption>;\n\nexport type GelKitInternals = TypeOf<typeof kitInternals>;\nexport type CheckConstraint = TypeOf<typeof checkConstraint>;\n\n// no prev version\nexport const backwardCompatibleGelSchema = gelSchema;\n\nexport const GelSquasher = {\n\tsquashIdx: (idx: Index) => {\n\t\tindex.parse(idx);\n\t\treturn `${idx.name};${\n\t\t\tidx.columns\n\t\t\t\t.map(\n\t\t\t\t\t(c) => `${c.expression}--${c.isExpression}--${c.asc}--${c.nulls}--${c.opclass ? c.opclass : ''}`,\n\t\t\t\t)\n\t\t\t\t.join(',,')\n\t\t};${idx.isUnique};${idx.concurrently};${idx.method};${idx.where};${JSON.stringify(idx.with)}`;\n\t},\n\tunsquashIdx: (input: string): Index => {\n\t\tconst [\n\t\t\tname,\n\t\t\tcolumnsString,\n\t\t\tisUnique,\n\t\t\tconcurrently,\n\t\t\tmethod,\n\t\t\twhere,\n\t\t\tidxWith,\n\t\t] = input.split(';');\n\n\t\tconst columnString = columnsString.split(',,');\n\t\tconst columns: IndexColumnType[] = [];\n\n\t\tfor (const column of columnString) {\n\t\t\tconst [expression, isExpression, asc, nulls, opclass] = column.split('--');\n\t\t\tcolumns.push({\n\t\t\t\tnulls: nulls as IndexColumnType['nulls'],\n\t\t\t\tisExpression: isExpression === 'true',\n\t\t\t\tasc: asc === 'true',\n\t\t\t\texpression: expression,\n\t\t\t\topclass: opclass === 'undefined' ? undefined : opclass,\n\t\t\t});\n\t\t}\n\n\t\tconst result: Index = index.parse({\n\t\t\tname,\n\t\t\tcolumns: columns,\n\t\t\tisUnique: isUnique === 'true',\n\t\t\tconcurrently: concurrently === 'true',\n\t\t\tmethod,\n\t\t\twhere: where === 'undefined' ? undefined : where,\n\t\t\twith: !idxWith || idxWith === 'undefined' ? undefined : JSON.parse(idxWith),\n\t\t});\n\t\treturn result;\n\t},\n\tsquashIdxPush: (idx: Index) => {\n\t\tindex.parse(idx);\n\t\treturn `${idx.name};${\n\t\t\tidx.columns\n\t\t\t\t.map((c) => `${c.isExpression ? '' : c.expression}--${c.asc}--${c.nulls}`)\n\t\t\t\t.join(',,')\n\t\t};${idx.isUnique};${idx.method};${JSON.stringify(idx.with)}`;\n\t},\n\tunsquashIdxPush: (input: string): Index => {\n\t\tconst [name, columnsString, isUnique, method, idxWith] = input.split(';');\n\n\t\tconst columnString = columnsString.split('--');\n\t\tconst columns: IndexColumnType[] = [];\n\n\t\tfor (const column of columnString) {\n\t\t\tconst [expression, asc, nulls, opclass] = column.split(',');\n\t\t\tcolumns.push({\n\t\t\t\tnulls: nulls as IndexColumnType['nulls'],\n\t\t\t\tisExpression: expression === '',\n\t\t\t\tasc: asc === 'true',\n\t\t\t\texpression: expression,\n\t\t\t});\n\t\t}\n\n\t\tconst result: Index = index.parse({\n\t\t\tname,\n\t\t\tcolumns: columns,\n\t\t\tisUnique: isUnique === 'true',\n\t\t\tconcurrently: false,\n\t\t\tmethod,\n\t\t\twith: idxWith === 'undefined' ? undefined : JSON.parse(idxWith),\n\t\t});\n\t\treturn result;\n\t},\n\tsquashFK: (fk: ForeignKey) => {\n\t\treturn `${fk.name};${fk.tableFrom};${fk.columnsFrom.join(',')};${fk.tableTo};${fk.columnsTo.join(',')};${\n\t\t\tfk.onUpdate ?? ''\n\t\t};${fk.onDelete ?? ''};${fk.schemaTo || 'public'}`;\n\t},\n\tsquashPolicy: (policy: Policy) => {\n\t\treturn `${policy.name}--${policy.as}--${policy.for}--${\n\t\t\tpolicy.to?.join(',')\n\t\t}--${policy.using}--${policy.withCheck}--${policy.on}`;\n\t},\n\tunsquashPolicy: (policy: string): Policy => {\n\t\tconst splitted = policy.split('--');\n\t\treturn {\n\t\t\tname: splitted[0],\n\t\t\tas: splitted[1] as Policy['as'],\n\t\t\tfor: splitted[2] as Policy['for'],\n\t\t\tto: splitted[3].split(','),\n\t\t\tusing: splitted[4] !== 'undefined' ? splitted[4] : undefined,\n\t\t\twithCheck: splitted[5] !== 'undefined' ? splitted[5] : undefined,\n\t\t\ton: splitted[6] !== 'undefined' ? splitted[6] : undefined,\n\t\t};\n\t},\n\tsquashPolicyPush: (policy: Policy) => {\n\t\treturn `${policy.name}--${policy.as}--${policy.for}--${policy.to?.join(',')}--${policy.on}`;\n\t},\n\tunsquashPolicyPush: (policy: string): Policy => {\n\t\tconst splitted = policy.split('--');\n\t\treturn {\n\t\t\tname: splitted[0],\n\t\t\tas: splitted[1] as Policy['as'],\n\t\t\tfor: splitted[2] as Policy['for'],\n\t\t\tto: splitted[3].split(','),\n\t\t\ton: splitted[4] !== 'undefined' ? splitted[4] : undefined,\n\t\t};\n\t},\n\tsquashPK: (pk: PrimaryKey) => {\n\t\treturn `${pk.columns.join(',')};${pk.name}`;\n\t},\n\tunsquashPK: (pk: string): PrimaryKey => {\n\t\tconst splitted = pk.split(';');\n\t\treturn { name: splitted[1], columns: splitted[0].split(',') };\n\t},\n\tsquashUnique: (unq: UniqueConstraint) => {\n\t\treturn `${unq.name};${unq.columns.join(',')};${unq.nullsNotDistinct}`;\n\t},\n\tunsquashUnique: (unq: string): UniqueConstraint => {\n\t\tconst [name, columns, nullsNotDistinct] = unq.split(';');\n\t\treturn {\n\t\t\tname,\n\t\t\tcolumns: columns.split(','),\n\t\t\tnullsNotDistinct: nullsNotDistinct === 'true',\n\t\t};\n\t},\n\tunsquashFK: (input: string): ForeignKey => {\n\t\tconst [\n\t\t\tname,\n\t\t\ttableFrom,\n\t\t\tcolumnsFromStr,\n\t\t\ttableTo,\n\t\t\tcolumnsToStr,\n\t\t\tonUpdate,\n\t\t\tonDelete,\n\t\t\tschemaTo,\n\t\t] = input.split(';');\n\n\t\tconst result: ForeignKey = fk.parse({\n\t\t\tname,\n\t\t\ttableFrom,\n\t\t\tcolumnsFrom: columnsFromStr.split(','),\n\t\t\tschemaTo: schemaTo,\n\t\t\ttableTo,\n\t\t\tcolumnsTo: columnsToStr.split(','),\n\t\t\tonUpdate,\n\t\t\tonDelete,\n\t\t});\n\t\treturn result;\n\t},\n\tsquashSequence: (seq: Omit<Sequence, 'name' | 'schema'>) => {\n\t\treturn `${seq.minValue};${seq.maxValue};${seq.increment};${seq.startWith};${seq.cache};${seq.cycle ?? ''}`;\n\t},\n\tunsquashSequence: (seq: string): Omit<Sequence, 'name' | 'schema'> => {\n\t\tconst splitted = seq.split(';');\n\t\treturn {\n\t\t\tminValue: splitted[0] !== 'undefined' ? splitted[0] : undefined,\n\t\t\tmaxValue: splitted[1] !== 'undefined' ? splitted[1] : undefined,\n\t\t\tincrement: splitted[2] !== 'undefined' ? splitted[2] : undefined,\n\t\t\tstartWith: splitted[3] !== 'undefined' ? splitted[3] : undefined,\n\t\t\tcache: splitted[4] !== 'undefined' ? splitted[4] : undefined,\n\t\t\tcycle: splitted[5] === 'true',\n\t\t};\n\t},\n\tsquashIdentity: (\n\t\tseq: Omit<Sequence, 'schema'> & { type: 'always' | 'byDefault' },\n\t) => {\n\t\treturn `${seq.name};${seq.type};${seq.minValue};${seq.maxValue};${seq.increment};${seq.startWith};${seq.cache};${\n\t\t\tseq.cycle ?? ''\n\t\t}`;\n\t},\n\tunsquashIdentity: (\n\t\tseq: string,\n\t): Omit<Sequence, 'schema'> & { type: 'always' | 'byDefault' } => {\n\t\tconst splitted = seq.split(';');\n\t\treturn {\n\t\t\tname: splitted[0],\n\t\t\ttype: splitted[1] as 'always' | 'byDefault',\n\t\t\tminValue: splitted[2] !== 'undefined' ? splitted[2] : undefined,\n\t\t\tmaxValue: splitted[3] !== 'undefined' ? splitted[3] : undefined,\n\t\t\tincrement: splitted[4] !== 'undefined' ? splitted[4] : undefined,\n\t\t\tstartWith: splitted[5] !== 'undefined' ? splitted[5] : undefined,\n\t\t\tcache: splitted[6] !== 'undefined' ? splitted[6] : undefined,\n\t\t\tcycle: splitted[7] === 'true',\n\t\t};\n\t},\n\tsquashCheck: (check: CheckConstraint) => {\n\t\treturn `${check.name};${check.value}`;\n\t},\n\tunsquashCheck: (input: string): CheckConstraint => {\n\t\tconst [\n\t\t\tname,\n\t\t\tvalue,\n\t\t] = input.split(';');\n\n\t\treturn { name, value };\n\t},\n};\n\nexport const squashGelScheme = (\n\tjson: GelSchema,\n\taction?: 'push' | undefined,\n): GelSchemaSquashed => {\n\tconst mappedTables = Object.fromEntries(\n\t\tObject.entries(json.tables).map((it) => {\n\t\t\tconst squashedIndexes = mapValues(it[1].indexes, (index) => {\n\t\t\t\treturn action === 'push'\n\t\t\t\t\t? GelSquasher.squashIdxPush(index)\n\t\t\t\t\t: GelSquasher.squashIdx(index);\n\t\t\t});\n\n\t\t\tconst squashedFKs = mapValues(it[1].foreignKeys, (fk) => {\n\t\t\t\treturn GelSquasher.squashFK(fk);\n\t\t\t});\n\n\t\t\tconst squashedPKs = mapValues(it[1].compositePrimaryKeys, (pk) => {\n\t\t\t\treturn GelSquasher.squashPK(pk);\n\t\t\t});\n\n\t\t\tconst mappedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(it[1].columns).map((it) => {\n\t\t\t\t\tconst mappedIdentity = it[1].identity\n\t\t\t\t\t\t? GelSquasher.squashIdentity(it[1].identity)\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\treturn [\n\t\t\t\t\t\tit[0],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...it[1],\n\t\t\t\t\t\t\tidentity: mappedIdentity,\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tconst squashedUniqueConstraints = mapValues(\n\t\t\t\tit[1].uniqueConstraints,\n\t\t\t\t(unq) => {\n\t\t\t\t\treturn GelSquasher.squashUnique(unq);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst squashedPolicies = mapValues(it[1].policies, (policy) => {\n\t\t\t\treturn action === 'push'\n\t\t\t\t\t? GelSquasher.squashPolicyPush(policy)\n\t\t\t\t\t: GelSquasher.squashPolicy(policy);\n\t\t\t});\n\t\t\tconst squashedChecksContraints = mapValues(\n\t\t\t\tit[1].checkConstraints,\n\t\t\t\t(check) => {\n\t\t\t\t\treturn GelSquasher.squashCheck(check);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\treturn [\n\t\t\t\tit[0],\n\t\t\t\t{\n\t\t\t\t\tname: it[1].name,\n\t\t\t\t\tschema: it[1].schema,\n\t\t\t\t\tcolumns: mappedColumns,\n\t\t\t\t\tindexes: squashedIndexes,\n\t\t\t\t\tforeignKeys: squashedFKs,\n\t\t\t\t\tcompositePrimaryKeys: squashedPKs,\n\t\t\t\t\tuniqueConstraints: squashedUniqueConstraints,\n\t\t\t\t\tpolicies: squashedPolicies,\n\t\t\t\t\tcheckConstraints: squashedChecksContraints,\n\t\t\t\t\tisRLSEnabled: it[1].isRLSEnabled ?? false,\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t);\n\n\tconst mappedSequences = Object.fromEntries(\n\t\tObject.entries(json.sequences).map((it) => {\n\t\t\treturn [\n\t\t\t\tit[0],\n\t\t\t\t{\n\t\t\t\t\tname: it[1].name,\n\t\t\t\t\tschema: it[1].schema,\n\t\t\t\t\tvalues: GelSquasher.squashSequence(it[1]),\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t);\n\n\tconst mappedPolicies = Object.fromEntries(\n\t\tObject.entries(json.policies).map((it) => {\n\t\t\treturn [\n\t\t\t\tit[0],\n\t\t\t\t{\n\t\t\t\t\tname: it[1].name,\n\t\t\t\t\tvalues: action === 'push'\n\t\t\t\t\t\t? GelSquasher.squashPolicyPush(it[1])\n\t\t\t\t\t\t: GelSquasher.squashPolicy(it[1]),\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t);\n\n\treturn {\n\t\tversion: '1',\n\t\tdialect: json.dialect,\n\t\ttables: mappedTables,\n\t\tenums: json.enums,\n\t\tschemas: json.schemas,\n\t\tviews: json.views,\n\t\tpolicies: mappedPolicies,\n\t\tsequences: mappedSequences,\n\t\troles: json.roles,\n\t};\n};\n\nexport const dryGel = gelSchema.parse({\n\tversion: '1',\n\tdialect: 'gel',\n\tid: originUUID,\n\tprevId: '',\n\ttables: {},\n\tenums: {},\n\tschemas: {},\n\tpolicies: {},\n\troles: {},\n\tsequences: {},\n\t_meta: {\n\t\tschemas: {},\n\t\ttables: {},\n\t\tcolumns: {},\n\t},\n});\n"
  },
  {
    "path": "drizzle-kit/src/serializer/gelSerializer.ts",
    "content": "import chalk from 'chalk';\nimport { getTableName, is, SQL } from 'drizzle-orm';\nimport {\n\tAnyGelTable,\n\tGelColumn,\n\tGelDialect,\n\tGelMaterializedView,\n\tGelPolicy,\n\tGelRole,\n\tGelSchema,\n\tGelSequence,\n\tGelView,\n\tgetMaterializedViewConfig,\n\tgetTableConfig,\n\tgetViewConfig,\n\tIndexedColumn,\n} from 'drizzle-orm/gel-core';\nimport { CasingType } from 'src/cli/validations/common';\nimport { IntrospectStage, IntrospectStatus } from 'src/cli/views';\nimport { vectorOps } from 'src/extensions/vector';\nimport { withStyle } from '../cli/validations/outputs';\nimport { type DB, escapeSingleQuotes } from '../utils';\nimport { GelSchemaInternal } from './gelSchema';\nimport type {\n\tColumn,\n\tForeignKey,\n\tGelKitInternals,\n\tIndex,\n\tIndexColumnType,\n\tPolicy,\n\tPrimaryKey,\n\tRole,\n\tSequence,\n\tTable,\n\tUniqueConstraint,\n\tView,\n} from './gelSchema';\nimport { getColumnCasing, sqlToStr } from './utils';\n\nexport const indexName = (tableName: string, columns: string[]) => {\n\treturn `${tableName}_${columns.join('_')}_index`;\n};\n\nfunction stringFromIdentityProperty(field: string | number | undefined): string | undefined {\n\treturn typeof field === 'string' ? (field as string) : typeof field === 'undefined' ? undefined : String(field);\n}\n\nfunction maxRangeForIdentityBasedOn(columnType: string) {\n\treturn columnType === 'integer' ? '2147483647' : columnType === 'bigint' ? '9223372036854775807' : '32767';\n}\n\nfunction minRangeForIdentityBasedOn(columnType: string) {\n\treturn columnType === 'integer' ? '-2147483648' : columnType === 'bigint' ? '-9223372036854775808' : '-32768';\n}\n\nfunction stringFromDatabaseIdentityProperty(field: any): string | undefined {\n\treturn typeof field === 'string'\n\t\t? (field as string)\n\t\t: typeof field === 'undefined'\n\t\t? undefined\n\t\t: typeof field === 'bigint'\n\t\t? field.toString()\n\t\t: String(field);\n}\n\nexport function buildArrayString(array: any[], sqlType: string): string {\n\tsqlType = sqlType.split('[')[0];\n\tconst values = array\n\t\t.map((value) => {\n\t\t\tif (typeof value === 'number' || typeof value === 'bigint') {\n\t\t\t\treturn value.toString();\n\t\t\t} else if (typeof value === 'boolean') {\n\t\t\t\treturn value ? 'true' : 'false';\n\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\treturn buildArrayString(value, sqlType);\n\t\t\t} else if (value instanceof Date) {\n\t\t\t\tif (sqlType === 'date') {\n\t\t\t\t\treturn `\"${value.toISOString().split('T')[0]}\"`;\n\t\t\t\t} else if (sqlType === 'timestamp') {\n\t\t\t\t\treturn `\"${value.toISOString().replace('T', ' ').slice(0, 23)}\"`;\n\t\t\t\t} else {\n\t\t\t\t\treturn `\"${value.toISOString()}\"`;\n\t\t\t\t}\n\t\t\t} else if (typeof value === 'object') {\n\t\t\t\treturn `\"${JSON.stringify(value).replaceAll('\"', '\\\\\"')}\"`;\n\t\t\t}\n\n\t\t\treturn `\"${value}\"`;\n\t\t})\n\t\t.join(',');\n\n\treturn `{${values}}`;\n}\n\nconst generateGelSnapshot = (\n\ttables: AnyGelTable[],\n\t// enums: GelEnum<any>[],\n\tschemas: GelSchema[],\n\tsequences: GelSequence[],\n\troles: GelRole[],\n\tpolicies: GelPolicy[],\n\tviews: GelView[],\n\tmatViews: GelMaterializedView[],\n\tcasing: CasingType | undefined,\n\tschemaFilter?: string[],\n): GelSchemaInternal => {\n\tconst dialect = new GelDialect({ casing });\n\tconst result: Record<string, Table> = {};\n\tconst resultViews: Record<string, View> = {};\n\tconst sequencesToReturn: Record<string, Sequence> = {};\n\tconst rolesToReturn: Record<string, Role> = {};\n\t// this policies are a separate objects that were linked to a table outside of it\n\tconst policiesToReturn: Record<string, Policy> = {};\n\n\t// This object stores unique names for indexes and will be used to detect if you have the same names for indexes\n\t// within the same PostgreSQL schema\n\n\tconst indexesInSchema: Record<string, string[]> = {};\n\n\tfor (const table of tables) {\n\t\t// This object stores unique names for checks and will be used to detect if you have the same names for checks\n\t\t// within the same PostgreSQL table\n\t\tconst checksInTable: Record<string, string[]> = {};\n\n\t\tconst {\n\t\t\tname: tableName,\n\t\t\tcolumns,\n\t\t\tindexes,\n\t\t\tforeignKeys,\n\t\t\tchecks,\n\t\t\tschema,\n\t\t\tprimaryKeys,\n\t\t\tuniqueConstraints,\n\t\t\tpolicies,\n\t\t\tenableRLS,\n\t\t} = getTableConfig(table);\n\n\t\tif (schemaFilter && !schemaFilter.includes(schema ?? 'public')) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst columnsObject: Record<string, Column> = {};\n\t\tconst indexesObject: Record<string, Index> = {};\n\t\t// const checksObject: Record<string, CheckConstraint> = {};\n\t\tconst foreignKeysObject: Record<string, ForeignKey> = {};\n\t\tconst primaryKeysObject: Record<string, PrimaryKey> = {};\n\t\t// const uniqueConstraintObject: Record<string, UniqueConstraint> = {};\n\t\tconst policiesObject: Record<string, Policy> = {};\n\n\t\tcolumns.forEach((column) => {\n\t\t\tconst name = getColumnCasing(column, casing);\n\t\t\tconst notNull: boolean = column.notNull;\n\t\t\tconst primaryKey: boolean = column.primary;\n\t\t\tconst sqlTypeLowered = column.getSQLType().toLowerCase();\n\n\t\t\t// const typeSchema = is(column, GelEnumColumn) ? column.enum.schema || 'public' : undefined;\n\t\t\tconst generated = column.generated;\n\t\t\tconst identity = column.generatedIdentity;\n\n\t\t\tconst increment = stringFromIdentityProperty(identity?.sequenceOptions?.increment) ?? '1';\n\t\t\tconst minValue = stringFromIdentityProperty(identity?.sequenceOptions?.minValue)\n\t\t\t\t?? (parseFloat(increment) < 0 ? minRangeForIdentityBasedOn(column.columnType) : '1');\n\t\t\tconst maxValue = stringFromIdentityProperty(identity?.sequenceOptions?.maxValue)\n\t\t\t\t?? (parseFloat(increment) < 0 ? '-1' : maxRangeForIdentityBasedOn(column.getSQLType()));\n\t\t\tconst startWith = stringFromIdentityProperty(identity?.sequenceOptions?.startWith)\n\t\t\t\t?? (parseFloat(increment) < 0 ? maxValue : minValue);\n\t\t\tconst cache = stringFromIdentityProperty(identity?.sequenceOptions?.cache) ?? '1';\n\n\t\t\tconst columnToSet: Column = {\n\t\t\t\tname,\n\t\t\t\ttype: column.getSQLType(),\n\t\t\t\ttypeSchema: undefined,\n\t\t\t\tprimaryKey,\n\t\t\t\tnotNull,\n\t\t\t\tgenerated: generated\n\t\t\t\t\t? {\n\t\t\t\t\t\tas: is(generated.as, SQL)\n\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as as SQL).sql\n\t\t\t\t\t\t\t: typeof generated.as === 'function'\n\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as() as SQL).sql\n\t\t\t\t\t\t\t: (generated.as as any),\n\t\t\t\t\t\ttype: 'stored',\n\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t\tidentity: identity\n\t\t\t\t\t? {\n\t\t\t\t\t\ttype: identity.type,\n\t\t\t\t\t\tname: identity.sequenceName ?? `${tableName}_${name}_seq`,\n\t\t\t\t\t\tschema: schema ?? 'public',\n\t\t\t\t\t\tincrement,\n\t\t\t\t\t\tstartWith,\n\t\t\t\t\t\tminValue,\n\t\t\t\t\t\tmaxValue,\n\t\t\t\t\t\tcache,\n\t\t\t\t\t\tcycle: identity?.sequenceOptions?.cycle ?? false,\n\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t};\n\n\t\t\t// \tif (column.isUnique) {\n\t\t\t// \t\tconst existingUnique = uniqueConstraintObject[column.uniqueName!];\n\t\t\t// \t\tif (typeof existingUnique !== 'undefined') {\n\t\t\t// \t\t\tconsole.log(\n\t\t\t// \t\t\t\t`\\n${\n\t\t\t// \t\t\t\t\twithStyle.errorWarning(`We\\'ve found duplicated unique constraint names in ${\n\t\t\t// \t\t\t\t\t\tchalk.underline.blue(\n\t\t\t// \t\t\t\t\t\t\ttableName,\n\t\t\t// \t\t\t\t\t\t)\n\t\t\t// \t\t\t\t\t} table.\n\t\t\t//   The unique constraint ${\n\t\t\t// \t\t\t\t\t\tchalk.underline.blue(\n\t\t\t// \t\t\t\t\t\t\tcolumn.uniqueName,\n\t\t\t// \t\t\t\t\t\t)\n\t\t\t// \t\t\t\t\t} on the ${\n\t\t\t// \t\t\t\t\t\tchalk.underline.blue(\n\t\t\t// \t\t\t\t\t\t\tname,\n\t\t\t// \t\t\t\t\t\t)\n\t\t\t// \t\t\t\t\t} column is conflicting with a unique constraint name already defined for ${\n\t\t\t// \t\t\t\t\t\tchalk.underline.blue(\n\t\t\t// \t\t\t\t\t\t\texistingUnique.columns.join(','),\n\t\t\t// \t\t\t\t\t\t)\n\t\t\t// \t\t\t\t\t} columns\\n`)\n\t\t\t// \t\t\t\t}`,\n\t\t\t// \t\t\t);\n\t\t\t// \t\t\tprocess.exit(1);\n\t\t\t// \t\t}\n\t\t\t// \t\tuniqueConstraintObject[column.uniqueName!] = {\n\t\t\t// \t\t\tname: column.uniqueName!,\n\t\t\t// \t\t\tnullsNotDistinct: column.uniqueType === 'not distinct',\n\t\t\t// \t\t\tcolumns: [columnToSet.name],\n\t\t\t// \t\t};\n\t\t\t// \t}\n\n\t\t\tif (column.default !== undefined) {\n\t\t\t\tif (is(column.default, SQL)) {\n\t\t\t\t\tcolumnToSet.default = sqlToStr(column.default, casing);\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof column.default === 'string') {\n\t\t\t\t\t\tcolumnToSet.default = `'${escapeSingleQuotes(column.default)}'`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (sqlTypeLowered === 'jsonb' || sqlTypeLowered === 'json') {\n\t\t\t\t\t\t\tcolumnToSet.default = `'${JSON.stringify(column.default)}'::${sqlTypeLowered}`;\n\t\t\t\t\t\t} else if (column.default instanceof Date) {\n\t\t\t\t\t\t\tif (sqlTypeLowered === 'date') {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString().split('T')[0]}'`;\n\t\t\t\t\t\t\t} else if (sqlTypeLowered === 'timestamp') {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString().replace('T', ' ').slice(0, 23)}'`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString()}'`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (Array.isArray(column.default)) {\n\t\t\t\t\t\t\tcolumnToSet.default = columnToSet.default;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Should do for all types\n\t\t\t\t\t\t\t// columnToSet.default = `'${column.default}'::${sqlTypeLowered}`;\n\t\t\t\t\t\t\tcolumnToSet.default = column.default;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcolumnsObject[name] = columnToSet;\n\t\t});\n\n\t\tprimaryKeys.map((pk) => {\n\t\t\tconst originalColumnNames = pk.columns.map((c) => c.name);\n\t\t\tconst columnNames = pk.columns.map((c) => getColumnCasing(c, casing));\n\n\t\t\tlet name = pk.getName();\n\t\t\tif (casing !== undefined) {\n\t\t\t\tfor (let i = 0; i < originalColumnNames.length; i++) {\n\t\t\t\t\tname = name.replace(originalColumnNames[i], columnNames[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprimaryKeysObject[name] = {\n\t\t\t\tname,\n\t\t\t\tcolumns: columnNames,\n\t\t\t};\n\t\t});\n\n\t\t// uniqueConstraints?.map((unq) => {\n\t\t// \tconst columnNames = unq.columns.map((c) => getColumnCasing(c, casing));\n\n\t\t// \tconst name = unq.name ?? uniqueKeyName(table, columnNames);\n\n\t\t// \t// const existingUnique = uniqueConstraintObject[name];\n\t\t// // \tif (typeof existingUnique !== 'undefined') {\n\t\t// // \t\tconsole.log(\n\t\t// // \t\t\t`\\n${\n\t\t// // \t\t\t\twithStyle.errorWarning(\n\t\t// // \t\t\t\t\t`We\\'ve found duplicated unique constraint names in ${chalk.underline.blue(tableName)} table.\n\t\t// // The unique constraint ${chalk.underline.blue(name)} on the ${\n\t\t// // \t\t\t\t\t\tchalk.underline.blue(\n\t\t// // \t\t\t\t\t\t\tcolumnNames.join(','),\n\t\t// // \t\t\t\t\t\t)\n\t\t// // \t\t\t\t\t} columns is confilcting with a unique constraint name already defined for ${\n\t\t// // \t\t\t\t\t\tchalk.underline.blue(existingUnique.columns.join(','))\n\t\t// // \t\t\t\t\t} columns\\n`,\n\t\t// // \t\t\t\t)\n\t\t// // \t\t\t}`,\n\t\t// // \t\t);\n\t\t// // \t\tprocess.exit(1);\n\t\t// // \t}\n\n\t\t// \t// uniqueConstraintObject[name] = {\n\t\t// \t// \tname: unq.name!,\n\t\t// \t// \tnullsNotDistinct: unq.nullsNotDistinct,\n\t\t// \t// \tcolumns: columnNames,\n\t\t// \t// };\n\t\t// });\n\n\t\tconst fks: ForeignKey[] = foreignKeys.map((fk) => {\n\t\t\tconst tableFrom = tableName;\n\t\t\tconst onDelete = fk.onDelete;\n\t\t\tconst onUpdate = fk.onUpdate;\n\t\t\tconst reference = fk.reference();\n\n\t\t\tconst tableTo = getTableName(reference.foreignTable);\n\t\t\t// TODO: resolve issue with schema undefined/public for db push(or squasher)\n\t\t\t// getTableConfig(reference.foreignTable).schema || \"public\";\n\t\t\tconst schemaTo = getTableConfig(reference.foreignTable).schema;\n\n\t\t\tconst originalColumnsFrom = reference.columns.map((it) => it.name);\n\t\t\tconst columnsFrom = reference.columns.map((it) => getColumnCasing(it, casing));\n\t\t\tconst originalColumnsTo = reference.foreignColumns.map((it) => it.name);\n\t\t\tconst columnsTo = reference.foreignColumns.map((it) => getColumnCasing(it, casing));\n\n\t\t\tlet name = fk.getName();\n\t\t\tif (casing !== undefined) {\n\t\t\t\tfor (let i = 0; i < originalColumnsFrom.length; i++) {\n\t\t\t\t\tname = name.replace(originalColumnsFrom[i], columnsFrom[i]);\n\t\t\t\t}\n\t\t\t\tfor (let i = 0; i < originalColumnsTo.length; i++) {\n\t\t\t\t\tname = name.replace(originalColumnsTo[i], columnsTo[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\ttableFrom,\n\t\t\t\ttableTo,\n\t\t\t\tschemaTo,\n\t\t\t\tcolumnsFrom,\n\t\t\t\tcolumnsTo,\n\t\t\t\tonDelete,\n\t\t\t\tonUpdate,\n\t\t\t} as ForeignKey;\n\t\t});\n\n\t\tfks.forEach((it) => {\n\t\t\tforeignKeysObject[it.name] = it;\n\t\t});\n\n\t\tindexes.forEach((value) => {\n\t\t\tconst columns = value.config.columns;\n\n\t\t\tlet indexColumnNames: string[] = [];\n\t\t\tcolumns.forEach((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\tif (typeof value.config.name === 'undefined') {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t\t`Please specify an index name in ${getTableName(value.config.table)} table that has \"${\n\t\t\t\t\t\t\t\t\t\tdialect.sqlToQuery(it).sql\n\t\t\t\t\t\t\t\t\t}\" expression. We can generate index names for indexes on columns only; for expressions in indexes, you need to specify the name yourself.`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tit = it as IndexedColumn;\n\t\t\t\tconst name = getColumnCasing(it as IndexedColumn, casing);\n\t\t\t\tif (\n\t\t\t\t\t!is(it, SQL)\n\t\t\t\t\t&& typeof it.indexConfig!.opClass === 'undefined'\n\t\t\t\t) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t`You are specifying an index on the ${\n\t\t\t\t\t\t\t\t\tchalk.blueBright(\n\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} column inside the ${\n\t\t\t\t\t\t\t\t\tchalk.blueBright(\n\t\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} table with the ${\n\t\t\t\t\t\t\t\t\tchalk.blueBright(\n\t\t\t\t\t\t\t\t\t\t'vector',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} type without specifying an operator class. Vector extension doesn't have a default operator class, so you need to specify one of the available options. Here is a list of available op classes for the vector extension: [${\n\t\t\t\t\t\t\t\t\tvectorOps\n\t\t\t\t\t\t\t\t\t\t.map((it) => `${chalk.underline(`${it}`)}`)\n\t\t\t\t\t\t\t\t\t\t.join(', ')\n\t\t\t\t\t\t\t\t}].\\n\\nYou can specify it using current syntax: ${\n\t\t\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\t\t\t`index(\"${value.config.name}\").using(\"${value.config.method}\", table.${name}.op(\"${\n\t\t\t\t\t\t\t\t\t\t\tvectorOps[0]\n\t\t\t\t\t\t\t\t\t\t}\"))`,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\\n\\nYou can check the \"pg_vector\" docs for more info: https://github.com/pgvector/pgvector?tab=readme-ov-file#indexing\\n`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tindexColumnNames.push(name);\n\t\t\t});\n\n\t\t\tconst name = value.config.name ? value.config.name : indexName(tableName, indexColumnNames);\n\n\t\t\tlet indexColumns: IndexColumnType[] = columns.map(\n\t\t\t\t(it): IndexColumnType => {\n\t\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\texpression: dialect.sqlToQuery(it, 'indexes').sql,\n\t\t\t\t\t\t\tasc: true,\n\t\t\t\t\t\t\tisExpression: true,\n\t\t\t\t\t\t\tnulls: 'last',\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tit = it as IndexedColumn;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\texpression: getColumnCasing(it as IndexedColumn, casing),\n\t\t\t\t\t\t\tisExpression: false,\n\t\t\t\t\t\t\tasc: it.indexConfig?.order === 'asc',\n\t\t\t\t\t\t\tnulls: it.indexConfig?.nulls\n\t\t\t\t\t\t\t\t? it.indexConfig?.nulls\n\t\t\t\t\t\t\t\t: it.indexConfig?.order === 'desc'\n\t\t\t\t\t\t\t\t? 'first'\n\t\t\t\t\t\t\t\t: 'last',\n\t\t\t\t\t\t\topclass: it.indexConfig?.opClass,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\n\t\t\t// check for index names duplicates\n\t\t\tif (typeof indexesInSchema[schema ?? 'public'] !== 'undefined') {\n\t\t\t\tif (indexesInSchema[schema ?? 'public'].includes(name)) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t`We\\'ve found duplicated index name across ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(schema ?? 'public')\n\t\t\t\t\t\t\t\t} schema. Please rename your index in either the ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} table or the table with the duplicated index name`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tindexesInSchema[schema ?? 'public'].push(name);\n\t\t\t} else {\n\t\t\t\tindexesInSchema[schema ?? 'public'] = [name];\n\t\t\t}\n\n\t\t\tindexesObject[name] = {\n\t\t\t\tname,\n\t\t\t\tcolumns: indexColumns,\n\t\t\t\tisUnique: value.config.unique ?? false,\n\t\t\t\twhere: value.config.where ? dialect.sqlToQuery(value.config.where).sql : undefined,\n\t\t\t\tconcurrently: value.config.concurrently ?? false,\n\t\t\t\tmethod: value.config.method ?? 'btree',\n\t\t\t\twith: value.config.with ?? {},\n\t\t\t};\n\t\t});\n\n\t\tpolicies.forEach((policy) => {\n\t\t\tconst mappedTo = [];\n\n\t\t\tif (!policy.to) {\n\t\t\t\tmappedTo.push('public');\n\t\t\t} else {\n\t\t\t\tif (policy.to && typeof policy.to === 'string') {\n\t\t\t\t\tmappedTo.push(policy.to);\n\t\t\t\t} else if (policy.to && is(policy.to, GelRole)) {\n\t\t\t\t\tmappedTo.push(policy.to.name);\n\t\t\t\t} else if (policy.to && Array.isArray(policy.to)) {\n\t\t\t\t\tpolicy.to.forEach((it) => {\n\t\t\t\t\t\tif (typeof it === 'string') {\n\t\t\t\t\t\t\tmappedTo.push(it);\n\t\t\t\t\t\t} else if (is(it, GelRole)) {\n\t\t\t\t\t\t\tmappedTo.push(it.name);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (policiesObject[policy.name] !== undefined) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\n${\n\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t`We\\'ve found duplicated policy name across ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(tableKey)\n\t\t\t\t\t\t\t} table. Please rename one of the policies with ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tpolicy.name,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} name`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tpoliciesObject[policy.name] = {\n\t\t\t\tname: policy.name,\n\t\t\t\tas: policy.as?.toUpperCase() as Policy['as'] ?? 'PERMISSIVE',\n\t\t\t\tfor: policy.for?.toUpperCase() as Policy['for'] ?? 'ALL',\n\t\t\t\tto: mappedTo.sort(),\n\t\t\t\tusing: is(policy.using, SQL) ? dialect.sqlToQuery(policy.using).sql : undefined,\n\t\t\t\twithCheck: is(policy.withCheck, SQL) ? dialect.sqlToQuery(policy.withCheck).sql : undefined,\n\t\t\t};\n\t\t});\n\n\t\t// checks.forEach((check) => {\n\t\t// \tconst checkName = check.name;\n\n\t\t// \tif (typeof checksInTable[`\"${schema ?? 'public'}\".\"${tableName}\"`] !== 'undefined') {\n\t\t// \t\tif (checksInTable[`\"${schema ?? 'public'}\".\"${tableName}\"`].includes(check.name)) {\n\t\t// \t\t\tconsole.log(\n\t\t// \t\t\t\t`\\n${\n\t\t// \t\t\t\t\twithStyle.errorWarning(\n\t\t// \t\t\t\t\t\t`We\\'ve found duplicated check constraint name across ${\n\t\t// \t\t\t\t\t\t\tchalk.underline.blue(\n\t\t// \t\t\t\t\t\t\t\tschema ?? 'public',\n\t\t// \t\t\t\t\t\t\t)\n\t\t// \t\t\t\t\t\t} schema in ${\n\t\t// \t\t\t\t\t\t\tchalk.underline.blue(\n\t\t// \t\t\t\t\t\t\t\ttableName,\n\t\t// \t\t\t\t\t\t\t)\n\t\t// \t\t\t\t\t\t}. Please rename your check constraint in either the ${\n\t\t// \t\t\t\t\t\t\tchalk.underline.blue(\n\t\t// \t\t\t\t\t\t\t\ttableName,\n\t\t// \t\t\t\t\t\t\t)\n\t\t// \t\t\t\t\t\t} table or the table with the duplicated check contraint name`,\n\t\t// \t\t\t\t\t)\n\t\t// \t\t\t\t}`,\n\t\t// \t\t\t);\n\t\t// \t\t\tprocess.exit(1);\n\t\t// \t\t}\n\t\t// \t\tchecksInTable[`\"${schema ?? 'public'}\".\"${tableName}\"`].push(checkName);\n\t\t// \t} else {\n\t\t// \t\tchecksInTable[`\"${schema ?? 'public'}\".\"${tableName}\"`] = [check.name];\n\t\t// \t}\n\n\t\t// \tchecksObject[checkName] = {\n\t\t// \t\tname: checkName,\n\t\t// \t\tvalue: dialect.sqlToQuery(check.value).sql,\n\t\t// \t};\n\t\t// });\n\n\t\tconst tableKey = `${schema ?? 'public'}.${tableName}`;\n\n\t\tresult[tableKey] = {\n\t\t\tname: tableName,\n\t\t\tschema: schema ?? '',\n\t\t\tcolumns: columnsObject,\n\t\t\tindexes: indexesObject,\n\t\t\tforeignKeys: foreignKeysObject,\n\t\t\tcompositePrimaryKeys: primaryKeysObject,\n\t\t\tuniqueConstraints: {}, // uniqueConstraintObject,\n\t\t\tpolicies: policiesObject,\n\t\t\tcheckConstraints: {}, // checksObject,\n\t\t\tisRLSEnabled: enableRLS,\n\t\t};\n\t}\n\n\tfor (const policy of policies) {\n\t\t// @ts-ignore\n\t\tif (!policy._linkedTable) {\n\t\t\tconsole.log(\n\t\t\t\t`\\n${\n\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t`\"Policy ${policy.name} was skipped because it was not linked to any table. You should either include the policy in a table or use .link() on the policy to link it to any table you have. For more information, please check:`,\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// @ts-ignore\n\t\tconst tableConfig = getTableConfig(policy._linkedTable);\n\n\t\tconst tableKey = `${tableConfig.schema ?? 'public'}.${tableConfig.name}`;\n\n\t\tconst mappedTo = [];\n\n\t\tif (!policy.to) {\n\t\t\tmappedTo.push('public');\n\t\t} else {\n\t\t\tif (policy.to && typeof policy.to === 'string') {\n\t\t\t\tmappedTo.push(policy.to);\n\t\t\t} else if (policy.to && is(policy.to, GelRole)) {\n\t\t\t\tmappedTo.push(policy.to.name);\n\t\t\t} else if (policy.to && Array.isArray(policy.to)) {\n\t\t\t\tpolicy.to.forEach((it) => {\n\t\t\t\t\tif (typeof it === 'string') {\n\t\t\t\t\t\tmappedTo.push(it);\n\t\t\t\t\t} else if (is(it, GelRole)) {\n\t\t\t\t\t\tmappedTo.push(it.name);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// add separate policies object, that will be only responsible for policy creation\n\t\t// but we would need to track if a policy was enabled for a specific table or not\n\t\t// enable only if jsonStatements for enable rls was not already there + filter it\n\n\t\tif (result[tableKey]?.policies[policy.name] !== undefined || policiesToReturn[policy.name] !== undefined) {\n\t\t\tconsole.log(\n\t\t\t\t`\\n${\n\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t`We\\'ve found duplicated policy name across ${\n\t\t\t\t\t\t\tchalk.underline.blue(tableKey)\n\t\t\t\t\t\t} table. Please rename one of the policies with ${\n\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\tpolicy.name,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} name`,\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst mappedPolicy = {\n\t\t\tname: policy.name,\n\t\t\tas: policy.as?.toUpperCase() as Policy['as'] ?? 'PERMISSIVE',\n\t\t\tfor: policy.for?.toUpperCase() as Policy['for'] ?? 'ALL',\n\t\t\tto: mappedTo.sort(),\n\t\t\tusing: is(policy.using, SQL) ? dialect.sqlToQuery(policy.using).sql : undefined,\n\t\t\twithCheck: is(policy.withCheck, SQL) ? dialect.sqlToQuery(policy.withCheck).sql : undefined,\n\t\t};\n\n\t\tif (result[tableKey]) {\n\t\t\tresult[tableKey].policies[policy.name] = mappedPolicy;\n\t\t} else {\n\t\t\tpoliciesToReturn[policy.name] = {\n\t\t\t\t...mappedPolicy,\n\t\t\t\tschema: tableConfig.schema ?? 'public',\n\t\t\t\ton: `\"${tableConfig.schema ?? 'public'}\".\"${tableConfig.name}\"`,\n\t\t\t};\n\t\t}\n\t}\n\n\tfor (const sequence of sequences) {\n\t\tconst name = sequence.seqName!;\n\t\tif (typeof sequencesToReturn[`${sequence.schema ?? 'public'}.${name}`] === 'undefined') {\n\t\t\tconst increment = stringFromIdentityProperty(sequence?.seqOptions?.increment) ?? '1';\n\t\t\tconst minValue = stringFromIdentityProperty(sequence?.seqOptions?.minValue)\n\t\t\t\t?? (parseFloat(increment) < 0 ? '-9223372036854775808' : '1');\n\t\t\tconst maxValue = stringFromIdentityProperty(sequence?.seqOptions?.maxValue)\n\t\t\t\t?? (parseFloat(increment) < 0 ? '-1' : '9223372036854775807');\n\t\t\tconst startWith = stringFromIdentityProperty(sequence?.seqOptions?.startWith)\n\t\t\t\t?? (parseFloat(increment) < 0 ? maxValue : minValue);\n\t\t\tconst cache = stringFromIdentityProperty(sequence?.seqOptions?.cache) ?? '1';\n\n\t\t\tsequencesToReturn[`${sequence.schema ?? 'public'}.${name}`] = {\n\t\t\t\tname,\n\t\t\t\tschema: sequence.schema ?? 'public',\n\t\t\t\tincrement,\n\t\t\t\tstartWith,\n\t\t\t\tminValue,\n\t\t\t\tmaxValue,\n\t\t\t\tcache,\n\t\t\t\tcycle: sequence.seqOptions?.cycle ?? false,\n\t\t\t};\n\t\t} else {\n\t\t\t// duplicate seq error\n\t\t}\n\t}\n\n\tfor (const role of roles) {\n\t\tif (!(role as any)._existing) {\n\t\t\trolesToReturn[role.name] = {\n\t\t\t\tname: role.name,\n\t\t\t\tcreateDb: (role as any).createDb === undefined ? false : (role as any).createDb,\n\t\t\t\tcreateRole: (role as any).createRole === undefined ? false : (role as any).createRole,\n\t\t\t\tinherit: (role as any).inherit === undefined ? true : (role as any).inherit,\n\t\t\t};\n\t\t}\n\t}\n\tconst combinedViews = [...views, ...matViews];\n\tfor (const view of combinedViews) {\n\t\tlet viewName;\n\t\tlet schema;\n\t\tlet query;\n\t\tlet selectedFields;\n\t\tlet isExisting;\n\t\tlet withOption;\n\t\tlet tablespace;\n\t\tlet using;\n\t\tlet withNoData;\n\t\tlet materialized: boolean = false;\n\n\t\tif (is(view, GelView)) {\n\t\t\t({ name: viewName, schema, query, selectedFields, isExisting, with: withOption } = getViewConfig(view));\n\t\t} else {\n\t\t\t({ name: viewName, schema, query, selectedFields, isExisting, with: withOption, tablespace, using, withNoData } =\n\t\t\t\tgetMaterializedViewConfig(view));\n\n\t\t\tmaterialized = true;\n\t\t}\n\n\t\tconst viewSchema = schema ?? 'public';\n\n\t\tconst viewKey = `${viewSchema}.${viewName}`;\n\n\t\tconst columnsObject: Record<string, Column> = {};\n\t\tconst uniqueConstraintObject: Record<string, UniqueConstraint> = {};\n\n\t\tconst existingView = resultViews[viewKey];\n\t\tif (typeof existingView !== 'undefined') {\n\t\t\tconsole.log(\n\t\t\t\t`\\n${\n\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t`We\\'ve found duplicated view name across ${\n\t\t\t\t\t\t\tchalk.underline.blue(schema ?? 'public')\n\t\t\t\t\t\t} schema. Please rename your view`,\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tfor (const key in selectedFields) {\n\t\t\tif (is(selectedFields[key], GelColumn)) {\n\t\t\t\tconst column = selectedFields[key];\n\n\t\t\t\tconst notNull: boolean = column.notNull;\n\t\t\t\tconst primaryKey: boolean = column.primary;\n\t\t\t\tconst sqlTypeLowered = column.getSQLType().toLowerCase();\n\n\t\t\t\t// const typeSchema = is(column, GelEnumColumn) ? column.enum.schema || 'public' : undefined;\n\t\t\t\tconst generated = column.generated;\n\t\t\t\tconst identity = column.generatedIdentity;\n\n\t\t\t\tconst increment = stringFromIdentityProperty(identity?.sequenceOptions?.increment) ?? '1';\n\t\t\t\tconst minValue = stringFromIdentityProperty(identity?.sequenceOptions?.minValue)\n\t\t\t\t\t?? (parseFloat(increment) < 0 ? minRangeForIdentityBasedOn(column.columnType) : '1');\n\t\t\t\tconst maxValue = stringFromIdentityProperty(identity?.sequenceOptions?.maxValue)\n\t\t\t\t\t?? (parseFloat(increment) < 0 ? '-1' : maxRangeForIdentityBasedOn(column.getSQLType()));\n\t\t\t\tconst startWith = stringFromIdentityProperty(identity?.sequenceOptions?.startWith)\n\t\t\t\t\t?? (parseFloat(increment) < 0 ? maxValue : minValue);\n\t\t\t\tconst cache = stringFromIdentityProperty(identity?.sequenceOptions?.cache) ?? '1';\n\n\t\t\t\tconst columnToSet: Column = {\n\t\t\t\t\tname: column.name,\n\t\t\t\t\ttype: column.getSQLType(),\n\t\t\t\t\ttypeSchema: undefined,\n\t\t\t\t\tprimaryKey,\n\t\t\t\t\tnotNull,\n\t\t\t\t\tgenerated: generated\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\tas: is(generated.as, SQL)\n\t\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as as SQL).sql\n\t\t\t\t\t\t\t\t: typeof generated.as === 'function'\n\t\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as() as SQL).sql\n\t\t\t\t\t\t\t\t: (generated.as as any),\n\t\t\t\t\t\t\ttype: 'stored',\n\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tidentity: identity\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\ttype: identity.type,\n\t\t\t\t\t\t\tname: identity.sequenceName ?? `${viewName}_${column.name}_seq`,\n\t\t\t\t\t\t\tschema: schema ?? 'public',\n\t\t\t\t\t\t\tincrement,\n\t\t\t\t\t\t\tstartWith,\n\t\t\t\t\t\t\tminValue,\n\t\t\t\t\t\t\tmaxValue,\n\t\t\t\t\t\t\tcache,\n\t\t\t\t\t\t\tcycle: identity?.sequenceOptions?.cycle ?? false,\n\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\t};\n\n\t\t\t\tif (column.isUnique) {\n\t\t\t\t\tconst existingUnique = uniqueConstraintObject[column.uniqueName!];\n\t\t\t\t\tif (typeof existingUnique !== 'undefined') {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t\t`We\\'ve found duplicated unique constraint names in ${chalk.underline.blue(viewName)} table. \n          The unique constraint ${chalk.underline.blue(column.uniqueName)} on the ${\n\t\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\t\tcolumn.name,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t} column is confilcting with a unique constraint name already defined for ${\n\t\t\t\t\t\t\t\t\t\tchalk.underline.blue(existingUnique.columns.join(','))\n\t\t\t\t\t\t\t\t\t} columns\\n`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t\tuniqueConstraintObject[column.uniqueName!] = {\n\t\t\t\t\t\tname: column.uniqueName!,\n\t\t\t\t\t\tnullsNotDistinct: column.uniqueType === 'not distinct',\n\t\t\t\t\t\tcolumns: [columnToSet.name],\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (column.default !== undefined) {\n\t\t\t\t\tif (is(column.default, SQL)) {\n\t\t\t\t\t\tcolumnToSet.default = sqlToStr(column.default, casing);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (typeof column.default === 'string') {\n\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default}'`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (sqlTypeLowered === 'jsonb' || sqlTypeLowered === 'json') {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${JSON.stringify(column.default)}'::${sqlTypeLowered}`;\n\t\t\t\t\t\t\t} else if (column.default instanceof Date) {\n\t\t\t\t\t\t\t\tif (sqlTypeLowered === 'date') {\n\t\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString().split('T')[0]}'`;\n\t\t\t\t\t\t\t\t} else if (sqlTypeLowered === 'timestamp') {\n\t\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString().replace('T', ' ').slice(0, 23)}'`;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString()}'`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (Array.isArray(column.default)) {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${buildArrayString(column.default, sqlTypeLowered)}'`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Should do for all types\n\t\t\t\t\t\t\t\t// columnToSet.default = `'${column.default}'::${sqlTypeLowered}`;\n\t\t\t\t\t\t\t\tcolumnToSet.default = column.default;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcolumnsObject[column.name] = columnToSet;\n\t\t\t}\n\t\t}\n\n\t\tresultViews[viewKey] = {\n\t\t\tcolumns: columnsObject,\n\t\t\tdefinition: isExisting ? undefined : dialect.sqlToQuery(query!).sql,\n\t\t\tname: viewName,\n\t\t\tschema: viewSchema,\n\t\t\tisExisting,\n\t\t\twith: withOption,\n\t\t\twithNoData,\n\t\t\tmaterialized,\n\t\t\ttablespace,\n\t\t\tusing,\n\t\t};\n\t}\n\n\t// const enumsToReturn: Record<string, Enum> = enums.reduce<{\n\t// \t[key: string]: Enum;\n\t// }>((map, obj) => {\n\t// \tconst enumSchema = obj.schema || 'public';\n\t// \tconst key = `${enumSchema}.${obj.enumName}`;\n\t// \tmap[key] = {\n\t// \t\tname: obj.enumName,\n\t// \t\tschema: enumSchema,\n\t// \t\tvalues: obj.enumValues,\n\t// \t};\n\t// \treturn map;\n\t// }, {});\n\n\tconst schemasObject = Object.fromEntries(\n\t\tschemas\n\t\t\t.filter((it) => {\n\t\t\t\tif (schemaFilter) {\n\t\t\t\t\treturn schemaFilter.includes(it.schemaName) && it.schemaName !== 'public';\n\t\t\t\t} else {\n\t\t\t\t\treturn it.schemaName !== 'public';\n\t\t\t\t}\n\t\t\t})\n\t\t\t.map((it) => [it.schemaName, it.schemaName]),\n\t);\n\n\treturn {\n\t\tversion: '1',\n\t\tdialect: 'gel',\n\t\ttables: result,\n\t\tenums: {},\n\t\tschemas: schemasObject,\n\t\tsequences: sequencesToReturn,\n\t\troles: rolesToReturn,\n\t\tpolicies: policiesToReturn,\n\t\tviews: resultViews,\n\t\t_meta: {\n\t\t\tschemas: {},\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t};\n};\n\nconst trimChar = (str: string, char: string) => {\n\tlet start = 0;\n\tlet end = str.length;\n\n\twhile (start < end && str[start] === char) ++start;\n\twhile (end > start && str[end - 1] === char) --end;\n\n\t// this.toString() due to ava deep equal issue with String { \"value\" }\n\treturn start > 0 || end < str.length ? str.substring(start, end) : str.toString();\n};\n\nfunction prepareRoles(entities?: {\n\troles: boolean | {\n\t\tprovider?: string | undefined;\n\t\tinclude?: string[] | undefined;\n\t\texclude?: string[] | undefined;\n\t};\n}) {\n\tlet useRoles: boolean = false;\n\tconst includeRoles: string[] = [];\n\tconst excludeRoles: string[] = [];\n\n\tif (entities && entities.roles) {\n\t\tif (typeof entities.roles === 'object') {\n\t\t\tif (entities.roles.provider) {\n\t\t\t\tif (entities.roles.provider === 'supabase') {\n\t\t\t\t\texcludeRoles.push(...[\n\t\t\t\t\t\t'anon',\n\t\t\t\t\t\t'authenticator',\n\t\t\t\t\t\t'authenticated',\n\t\t\t\t\t\t'service_role',\n\t\t\t\t\t\t'supabase_auth_admin',\n\t\t\t\t\t\t'supabase_storage_admin',\n\t\t\t\t\t\t'dashboard_user',\n\t\t\t\t\t\t'supabase_admin',\n\t\t\t\t\t]);\n\t\t\t\t} else if (entities.roles.provider === 'neon') {\n\t\t\t\t\texcludeRoles.push(...['authenticated', 'anonymous']);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entities.roles.include) {\n\t\t\t\tincludeRoles.push(...entities.roles.include);\n\t\t\t}\n\t\t\tif (entities.roles.exclude) {\n\t\t\t\texcludeRoles.push(...entities.roles.exclude);\n\t\t\t}\n\t\t} else {\n\t\t\tuseRoles = entities.roles;\n\t\t}\n\t}\n\treturn { useRoles, includeRoles, excludeRoles };\n}\n\nexport const fromDatabase = async (\n\tdb: DB,\n\ttablesFilter: (table: string) => boolean = () => true,\n\tschemaFilters: string[],\n\tentities?: {\n\t\troles: boolean | {\n\t\t\tprovider?: string | undefined;\n\t\t\tinclude?: string[] | undefined;\n\t\t\texclude?: string[] | undefined;\n\t\t};\n\t},\n\tprogressCallback?: (\n\t\tstage: IntrospectStage,\n\t\tcount: number,\n\t\tstatus: IntrospectStatus,\n\t) => void,\n\ttsSchema?: GelSchemaInternal,\n): Promise<GelSchemaInternal> => {\n\tconst result: Record<string, Table> = {};\n\t// const views: Record<string, View> = {};\n\tconst policies: Record<string, Policy> = {};\n\tconst internals: GelKitInternals = { tables: {} };\n\n\tconst where = schemaFilters.map((t) => `n.nspname = '${t}'`).join(' or ');\n\n\tconst allTables = await db.query<{ table_schema: string; table_name: string; type: string; rls_enabled: boolean }>(\n\t\t`SELECT \n    n.nspname::text AS table_schema, \n    c.relname::text AS table_name, \n    CASE \n        WHEN c.relkind = 'r' THEN 'table'\n        WHEN c.relkind = 'v' THEN 'view'\n        WHEN c.relkind = 'm' THEN 'materialized_view'\n    END AS type,\n\tc.relrowsecurity AS rls_enabled\nFROM \n    pg_catalog.pg_class c\nJOIN \n    pg_catalog.pg_namespace n ON n.oid::text = c.relnamespace::text\nWHERE \n\tc.relkind IN ('r', 'v', 'm') \n    ${where === '' ? '' : ` AND ${where}`};`,\n\t);\n\n\tconst schemas = new Set(allTables.map((it) => it.table_schema));\n\n\tconst allSchemas = await db.query<{\n\t\ttable_schema: string;\n\t}>(`select s.nspname::text as table_schema\n  from pg_catalog.pg_namespace s\n  join pg_catalog.pg_user u on u.usesysid::text = s.nspowner::text\n  where nspname not in ('information_schema', 'pg_catalog', 'public')\n        and nspname::text not like 'pg_toast%'\n        and nspname::text not like 'pg_temp_%'\n  order by 1;`);\n\n\tallSchemas.forEach((item) => {\n\t\tif (schemaFilters.includes(item.table_schema)) {\n\t\t\tschemas.add(item.table_schema);\n\t\t}\n\t});\n\n\tlet columnsCount = 0;\n\tlet indexesCount = 0;\n\tlet foreignKeysCount = 0;\n\tlet tableCount = 0;\n\n\tconst sequencesToReturn: Record<string, Sequence> = {};\n\n\tconst all = allTables\n\t\t.filter((it) => it.type === 'table')\n\t\t.map((row) => {\n\t\t\treturn new Promise(async (res, rej) => {\n\t\t\t\tconst tableName = row.table_name as string;\n\t\t\t\tif (!tablesFilter(tableName)) return res('');\n\t\t\t\ttableCount += 1;\n\t\t\t\tconst tableSchema = row.table_schema;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst columnToReturn: Record<string, Column> = {};\n\t\t\t\t\tconst indexToReturn: Record<string, Index> = {};\n\t\t\t\t\tconst foreignKeysToReturn: Record<string, ForeignKey> = {};\n\t\t\t\t\tconst primaryKeys: Record<string, PrimaryKey> = {};\n\t\t\t\t\t// const uniqueConstrains: Record<string, UniqueConstraint> = {};\n\t\t\t\t\t// const checkConstraints: Record<string, CheckConstraint> = {};\n\n\t\t\t\t\tconst tableResponse = await getColumnsInfoQuery({ schema: tableSchema, table: tableName, db });\n\n\t\t\t\t\t// \t\t\t\tconst tableConstraints = await db.query(\n\t\t\t\t\t// \t\t\t\t\t`SELECT c.column_name::text, c.data_type::text, constraint_type::text, constraint_name::text, constraint_schema::text\n\t\t\t\t\t//   FROM information_schema.table_constraints tc\n\t\t\t\t\t//   JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name)\n\t\t\t\t\t//   JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema\n\t\t\t\t\t//     AND tc.table_name = c.table_name AND ccu.column_name = c.column_name\n\t\t\t\t\t//   WHERE tc.table_name = '${tableName}' and constraint_schema = '${tableSchema}';`,\n\t\t\t\t\t// \t\t\t\t);\n\n\t\t\t\t\t// const tableChecks = await db.query(`SELECT\n\t\t\t\t\t// \ttc.constraint_name::text,\n\t\t\t\t\t// \ttc.constraint_type::text,\n\t\t\t\t\t// \tpg_get_constraintdef(con.oid) AS constraint_definition\n\t\t\t\t\t// FROM\n\t\t\t\t\t// \tinformation_schema.table_constraints AS tc\n\t\t\t\t\t// \tJOIN pg_constraint AS con\n\t\t\t\t\t// \t\tON tc.constraint_name = con.conname\n\t\t\t\t\t// \t\tAND con.conrelid = (\n\t\t\t\t\t// \t\t\tSELECT oid\n\t\t\t\t\t// \t\t\tFROM pg_class\n\t\t\t\t\t// \t\t\tWHERE relname = tc.table_name\n\t\t\t\t\t// \t\t\tAND relnamespace = (\n\t\t\t\t\t// \t\t\t\tSELECT oid\n\t\t\t\t\t// \t\t\t\tFROM pg_namespace\n\t\t\t\t\t// \t\t\t\tWHERE nspname = tc.constraint_schema\n\t\t\t\t\t// \t\t\t)\n\t\t\t\t\t// \t\t)\n\t\t\t\t\t// WHERE\n\t\t\t\t\t// \ttc.table_name = '${tableName}'\n\t\t\t\t\t// \tAND tc.constraint_schema = '${tableSchema}'\n\t\t\t\t\t// \tAND tc.constraint_type = 'CHECK';`);\n\n\t\t\t\t\tcolumnsCount += tableResponse.length;\n\t\t\t\t\tif (progressCallback) {\n\t\t\t\t\t\tprogressCallback('columns', columnsCount, 'fetching');\n\t\t\t\t\t}\n\n\t\t\t\t\tconst tableForeignKeys = await db.query(\n\t\t\t\t\t\t`SELECT\n\t\t\t\t\t    con.contype::text AS constraint_type,\n\t\t\t\t\t    nsp.nspname::text AS constraint_schema,\n\t\t\t\t\t    con.conname::text AS constraint_name,\n\t\t\t\t\t    rel.relname::text AS table_name,\n\t\t\t\t\t    att.attname::text AS column_name,\n\t\t\t\t\t    fnsp.nspname::text AS foreign_table_schema,\n\t\t\t\t\t    frel.relname::text AS foreign_table_name,\n\t\t\t\t\t    fatt.attname::text AS foreign_column_name,\n\t\t\t\t\t    CASE con.confupdtype\n\t\t\t\t\t      WHEN 'a' THEN 'NO ACTION'\n\t\t\t\t\t      WHEN 'r' THEN 'RESTRICT'\n\t\t\t\t\t      WHEN 'n' THEN 'SET NULL'\n\t\t\t\t\t      WHEN 'c' THEN 'CASCADE'\n\t\t\t\t\t      WHEN 'd' THEN 'SET DEFAULT'\n\t\t\t\t\t    END AS update_rule,\n\t\t\t\t\t    CASE con.confdeltype\n\t\t\t\t\t      WHEN 'a' THEN 'NO ACTION'\n\t\t\t\t\t      WHEN 'r' THEN 'RESTRICT'\n\t\t\t\t\t      WHEN 'n' THEN 'SET NULL'\n\t\t\t\t\t      WHEN 'c' THEN 'CASCADE'\n\t\t\t\t\t      WHEN 'd' THEN 'SET DEFAULT'\n\t\t\t\t\t    END AS delete_rule\n\t\t\t\t\t  FROM\n\t\t\t\t\t    pg_catalog.pg_constraint con\n\t\t\t\t\t    JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid\n\t\t\t\t\t    JOIN pg_catalog.pg_namespace nsp ON nsp.oid = con.connamespace\n\t\t\t\t\t    LEFT JOIN pg_catalog.pg_attribute att ON att.attnum = ANY (con.conkey)\n\t\t\t\t\t      AND att.attrelid = con.conrelid\n\t\t\t\t\t    LEFT JOIN pg_catalog.pg_class frel ON frel.oid = con.confrelid\n\t\t\t\t\t    LEFT JOIN pg_catalog.pg_namespace fnsp ON fnsp.oid = frel.relnamespace\n\t\t\t\t\t    LEFT JOIN pg_catalog.pg_attribute fatt ON fatt.attnum = ANY (con.confkey)\n\t\t\t\t\t      AND fatt.attrelid = con.confrelid\n\t\t\t\t\t  WHERE\n\t\t\t\t\t    nsp.nspname = '${tableSchema}'\n\t\t\t\t\t    AND rel.relname = '${tableName}'\n\t\t\t\t\t    AND con.contype IN ('f');`,\n\t\t\t\t\t);\n\n\t\t\t\t\tforeignKeysCount += tableForeignKeys.length;\n\t\t\t\t\tif (progressCallback) {\n\t\t\t\t\t\tprogressCallback('fks', foreignKeysCount, 'fetching');\n\t\t\t\t\t}\n\t\t\t\t\tfor (const fk of tableForeignKeys) {\n\t\t\t\t\t\t// const tableFrom = fk.table_name;\n\t\t\t\t\t\tconst columnFrom: string = fk.column_name;\n\t\t\t\t\t\tconst tableTo = fk.foreign_table_name;\n\t\t\t\t\t\tconst columnTo: string = fk.foreign_column_name;\n\t\t\t\t\t\tconst schemaTo: string = fk.foreign_table_schema;\n\t\t\t\t\t\tconst foreignKeyName = fk.constraint_name;\n\t\t\t\t\t\tconst onUpdate = fk.update_rule?.toLowerCase();\n\t\t\t\t\t\tconst onDelete = fk.delete_rule?.toLowerCase();\n\n\t\t\t\t\t\tif (typeof foreignKeysToReturn[foreignKeyName] !== 'undefined') {\n\t\t\t\t\t\t\tforeignKeysToReturn[foreignKeyName].columnsFrom.push(columnFrom);\n\t\t\t\t\t\t\tforeignKeysToReturn[foreignKeyName].columnsTo.push(columnTo);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tforeignKeysToReturn[foreignKeyName] = {\n\t\t\t\t\t\t\t\tname: foreignKeyName,\n\t\t\t\t\t\t\t\ttableFrom: tableName,\n\t\t\t\t\t\t\t\ttableTo,\n\t\t\t\t\t\t\t\tschemaTo,\n\t\t\t\t\t\t\t\tcolumnsFrom: [columnFrom],\n\t\t\t\t\t\t\t\tcolumnsTo: [columnTo],\n\t\t\t\t\t\t\t\tonDelete,\n\t\t\t\t\t\t\t\tonUpdate,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tforeignKeysToReturn[foreignKeyName].columnsFrom = [\n\t\t\t\t\t\t\t...new Set(foreignKeysToReturn[foreignKeyName].columnsFrom),\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\tforeignKeysToReturn[foreignKeyName].columnsTo = [...new Set(foreignKeysToReturn[foreignKeyName].columnsTo)];\n\t\t\t\t\t}\n\n\t\t\t\t\t// const uniqueConstrainsRows = tableConstraints.filter((mapRow) => mapRow.constraint_type === 'UNIQUE');\n\n\t\t\t\t\t// for (const unqs of uniqueConstrainsRows) {\n\t\t\t\t\t// \t// const tableFrom = fk.table_name;\n\t\t\t\t\t// \tconst columnName: string = unqs.column_name;\n\t\t\t\t\t// \tconst constraintName: string = unqs.constraint_name;\n\n\t\t\t\t\t// \tif (typeof uniqueConstrains[constraintName] !== 'undefined') {\n\t\t\t\t\t// \t\tuniqueConstrains[constraintName].columns.push(columnName);\n\t\t\t\t\t// \t} else {\n\t\t\t\t\t// \t\tuniqueConstrains[constraintName] = {\n\t\t\t\t\t// \t\t\tcolumns: [columnName],\n\t\t\t\t\t// \t\t\tnullsNotDistinct: false,\n\t\t\t\t\t// \t\t\tname: constraintName,\n\t\t\t\t\t// \t\t};\n\t\t\t\t\t// \t}\n\t\t\t\t\t// }\n\n\t\t\t\t\t// checksCount += tableChecks.length;\n\t\t\t\t\t// if (progressCallback) {\n\t\t\t\t\t// \tprogressCallback('checks', checksCount, 'fetching');\n\t\t\t\t\t// }\n\t\t\t\t\t// for (const checks of tableChecks) {\n\t\t\t\t\t// \t// CHECK (((email)::text <> 'test@gmail.com'::text))\n\t\t\t\t\t// \t// Where (email) is column in table\n\t\t\t\t\t// \tlet checkValue: string = checks.constraint_definition;\n\t\t\t\t\t// \tconst constraintName: string = checks.constraint_name;\n\n\t\t\t\t\t// \tcheckValue = checkValue.replace(/^CHECK\\s*\\(\\(/, '').replace(/\\)\\)\\s*$/, '');\n\n\t\t\t\t\t// \tcheckConstraints[constraintName] = {\n\t\t\t\t\t// \t\tname: constraintName,\n\t\t\t\t\t// \t\tvalue: checkValue,\n\t\t\t\t\t// \t};\n\t\t\t\t\t// }\n\n\t\t\t\t\tfor (const columnResponse of tableResponse) {\n\t\t\t\t\t\tconst columnName = columnResponse.column_name;\n\t\t\t\t\t\tif (columnName === '__type__') continue;\n\n\t\t\t\t\t\tconst columnAdditionalDT = columnResponse.additional_dt;\n\t\t\t\t\t\tconst columnDimensions = columnResponse.array_dimensions;\n\t\t\t\t\t\tconst enumType: string = columnResponse.enum_name;\n\t\t\t\t\t\tlet columnType: string = columnResponse.data_type;\n\t\t\t\t\t\t// const typeSchema = columnResponse.type_schema;\n\t\t\t\t\t\tconst defaultValueRes: string = columnResponse.column_default;\n\n\t\t\t\t\t\tconst isGenerated = columnResponse.is_generated === 'ALWAYS';\n\t\t\t\t\t\tconst generationExpression = columnResponse.generation_expression;\n\t\t\t\t\t\tconst isIdentity = columnResponse.is_identity === 'YES';\n\t\t\t\t\t\tconst identityGeneration = columnResponse.identity_generation === 'ALWAYS' ? 'always' : 'byDefault';\n\t\t\t\t\t\tconst identityStart = columnResponse.identity_start;\n\t\t\t\t\t\tconst identityIncrement = columnResponse.identity_increment;\n\t\t\t\t\t\tconst identityMaximum = columnResponse.identity_maximum;\n\t\t\t\t\t\tconst identityMinimum = columnResponse.identity_minimum;\n\t\t\t\t\t\tconst identityCycle = columnResponse.identity_cycle === 'YES';\n\t\t\t\t\t\tconst identityName = columnResponse.seq_name;\n\n\t\t\t\t\t\t// const primaryKey = tableConstraints.filter((mapRow) =>\n\t\t\t\t\t\t// \tcolumnName === mapRow.column_name && mapRow.constraint_type === 'PRIMARY KEY'\n\t\t\t\t\t\t// );\n\n\t\t\t\t\t\t// const cprimaryKey = tableConstraints.filter((mapRow) => mapRow.constraint_type === 'PRIMARY KEY');\n\n\t\t\t\t\t\t// \t\t\tif (cprimaryKey.length > 1) {\n\t\t\t\t\t\t// \t\t\t\tconst tableCompositePkName = await db.query(\n\t\t\t\t\t\t// \t\t\t\t\t`SELECT conname::text AS primary_key\n\t\t\t\t\t\t// FROM   pg_constraint join pg_class on (pg_class.oid = conrelid)\n\t\t\t\t\t\t// WHERE  contype = 'p'\n\t\t\t\t\t\t// AND    connamespace = $1::regnamespace\n\t\t\t\t\t\t// AND    pg_class.relname = $2;`,\n\t\t\t\t\t\t// \t\t\t\t\t[tableSchema, tableName],\n\t\t\t\t\t\t// \t\t\t\t);\n\t\t\t\t\t\t// \t\t\t\tprimaryKeys[tableCompositePkName[0].primary_key] = {\n\t\t\t\t\t\t// \t\t\t\t\tname: tableCompositePkName[0].primary_key,\n\t\t\t\t\t\t// \t\t\t\t\tcolumns: cprimaryKey.map((c: any) => c.column_name),\n\t\t\t\t\t\t// \t\t\t\t};\n\t\t\t\t\t\t// \t\t\t}\n\n\t\t\t\t\t\tlet columnTypeMapped = columnType;\n\n\t\t\t\t\t\t// Set default to internal object\n\t\t\t\t\t\tif (columnAdditionalDT === 'ARRAY') {\n\t\t\t\t\t\t\tif (typeof internals.tables[tableName] === 'undefined') {\n\t\t\t\t\t\t\t\tinternals.tables[tableName] = {\n\t\t\t\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\t\t\t\t[columnName]: {\n\t\t\t\t\t\t\t\t\t\t\tisArray: true,\n\t\t\t\t\t\t\t\t\t\t\tdimensions: columnDimensions,\n\t\t\t\t\t\t\t\t\t\t\trawType: columnTypeMapped.substring(0, columnTypeMapped.length - 2),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (typeof internals.tables[tableName]!.columns[columnName] === 'undefined') {\n\t\t\t\t\t\t\t\t\tinternals.tables[tableName]!.columns[columnName] = {\n\t\t\t\t\t\t\t\t\t\tisArray: true,\n\t\t\t\t\t\t\t\t\t\tdimensions: columnDimensions,\n\t\t\t\t\t\t\t\t\t\trawType: columnTypeMapped.substring(0, columnTypeMapped.length - 2),\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst defaultValue = defaultForColumn(columnResponse, internals, tableName);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdefaultValue === 'NULL'\n\t\t\t\t\t\t\t|| (defaultValueRes && defaultValueRes.startsWith('(') && defaultValueRes.endsWith(')'))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (typeof internals!.tables![tableName] === 'undefined') {\n\t\t\t\t\t\t\t\tinternals!.tables![tableName] = {\n\t\t\t\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\t\t\t\t[columnName]: {\n\t\t\t\t\t\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (typeof internals!.tables![tableName]!.columns[columnName] === 'undefined') {\n\t\t\t\t\t\t\t\t\tinternals!.tables![tableName]!.columns[columnName] = {\n\t\t\t\t\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tinternals!.tables![tableName]!.columns[columnName]!.isDefaultAnExpression = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (columnTypeMapped.startsWith('numeric(')) {\n\t\t\t\t\t\t\tcolumnTypeMapped = columnTypeMapped.replace(',', ', ');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (columnAdditionalDT === 'ARRAY') {\n\t\t\t\t\t\t\tfor (let i = 1; i < Number(columnDimensions); i++) {\n\t\t\t\t\t\t\t\tcolumnTypeMapped += '[]';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// TODO check if correct\n\t\t\t\t\t\t// skip range and tuples\n\t\t\t\t\t\tif (columnTypeMapped.includes('tuple<') || columnTypeMapped.includes('range')) continue;\n\n\t\t\t\t\t\tcolumnTypeMapped = trimChar(columnTypeMapped, '\"');\n\t\t\t\t\t\tcolumnTypeMapped = columnTypeMapped.replace('pg_catalog.', '');\n\n\t\t\t\t\t\t// patching array types\n\t\t\t\t\t\tcolumnTypeMapped = columnTypeMapped.replace('float4[]', 'real[]').replace('float8[]', 'double precision[]')\n\t\t\t\t\t\t\t.replace('\"numeric\"[]', 'numeric[]').replace('\"time\"[]', 'time without time zone[]').replace(\n\t\t\t\t\t\t\t\t'int2[]',\n\t\t\t\t\t\t\t\t'smallint[]',\n\t\t\t\t\t\t\t).replace(\n\t\t\t\t\t\t\t\t'int4[]',\n\t\t\t\t\t\t\t\t'integer[]',\n\t\t\t\t\t\t\t).replace(\n\t\t\t\t\t\t\t\t'int8[]',\n\t\t\t\t\t\t\t\t'bigint[]',\n\t\t\t\t\t\t\t).replace(\n\t\t\t\t\t\t\t\t'bool[]',\n\t\t\t\t\t\t\t\t'boolean[]',\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\tcolumnToReturn[columnName] = {\n\t\t\t\t\t\t\tname: columnName,\n\t\t\t\t\t\t\ttype:\n\t\t\t\t\t\t\t\t// filter vectors, but in future we should filter any extension that was installed by user\n\t\t\t\t\t\t\t\tcolumnAdditionalDT === 'USER-DEFINED'\n\t\t\t\t\t\t\t\t\t&& !['vector', 'geometry'].includes(enumType)\n\t\t\t\t\t\t\t\t\t? enumType\n\t\t\t\t\t\t\t\t\t: columnTypeMapped,\n\t\t\t\t\t\t\ttypeSchema: undefined,\n\t\t\t\t\t\t\t// typeSchema: enumsToReturn[`${typeSchema}.${enumType}`] !== undefined\n\t\t\t\t\t\t\t// \t? enumsToReturn[`${typeSchema}.${enumType}`].schema\n\t\t\t\t\t\t\t// \t: undefined,\n\t\t\t\t\t\t\tprimaryKey: columnName === 'id',\n\t\t\t\t\t\t\tdefault: defaultValue,\n\t\t\t\t\t\t\tnotNull: columnResponse.is_nullable === 'NO',\n\t\t\t\t\t\t\tgenerated: isGenerated\n\t\t\t\t\t\t\t\t? { as: generationExpression, type: 'stored' }\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tidentity: isIdentity\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\ttype: identityGeneration,\n\t\t\t\t\t\t\t\t\tname: identityName,\n\t\t\t\t\t\t\t\t\tincrement: stringFromDatabaseIdentityProperty(identityIncrement),\n\t\t\t\t\t\t\t\t\tminValue: stringFromDatabaseIdentityProperty(identityMinimum),\n\t\t\t\t\t\t\t\t\tmaxValue: stringFromDatabaseIdentityProperty(identityMaximum),\n\t\t\t\t\t\t\t\t\tstartWith: stringFromDatabaseIdentityProperty(identityStart),\n\t\t\t\t\t\t\t\t\tcache: sequencesToReturn[identityName]?.cache\n\t\t\t\t\t\t\t\t\t\t? sequencesToReturn[identityName]?.cache\n\t\t\t\t\t\t\t\t\t\t: sequencesToReturn[`${tableSchema}.${identityName}`]?.cache\n\t\t\t\t\t\t\t\t\t\t? sequencesToReturn[`${tableSchema}.${identityName}`]?.cache\n\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\tcycle: identityCycle,\n\t\t\t\t\t\t\t\t\tschema: tableSchema,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (identityName && typeof identityName === 'string') {\n\t\t\t\t\t\t\t// remove \"\" from sequence name\n\t\t\t\t\t\t\tdelete sequencesToReturn[\n\t\t\t\t\t\t\t\t`${tableSchema}.${\n\t\t\t\t\t\t\t\t\tidentityName.startsWith('\"') && identityName.endsWith('\"') ? identityName.slice(1, -1) : identityName\n\t\t\t\t\t\t\t\t}`\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\tdelete sequencesToReturn[identityName];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst dbIndexes = await db.query(\n\t\t\t\t\t\t`SELECT  DISTINCT ON (t.relname, ic.relname, k.i) t.relname::text as table_name, ic.relname::text AS indexname,\n        k.i AS index_order,\n        i.indisunique as is_unique,\n        am.amname::text as method,\n        ic.reloptions as with,\n        coalesce(a.attname,\n                  (('{' || pg_get_expr(\n                              i.indexprs,\n                              i.indrelid\n                          )\n                        || '}')::text[]\n                  )[k.i]\n                )::text AS column_name,\n          CASE\n        WHEN pg_get_expr(i.indexprs, i.indrelid) IS NOT NULL THEN 1\n        ELSE 0\n    END AS is_expression,\n        i.indoption[k.i-1] & 1 = 1 AS descending,\n        i.indoption[k.i-1] & 2 = 2 AS nulls_first,\n        pg_get_expr(\n                              i.indpred,\n                              i.indrelid\n                          ) as where,\n         opc.opcname::text\n      FROM pg_class t\n          LEFT JOIN pg_index i ON t.oid = i.indrelid\n          LEFT JOIN pg_class ic ON ic.oid = i.indexrelid\n\t\t  CROSS JOIN LATERAL (SELECT unnest(i.indkey), generate_subscripts(i.indkey, 1) + 1) AS k(attnum, i)\n          LEFT JOIN pg_attribute AS a\n            ON i.indrelid = a.attrelid AND k.attnum = a.attnum\n          JOIN pg_namespace c on c.oid = t.relnamespace\n        LEFT JOIN pg_am AS am ON ic.relam = am.oid\n        JOIN pg_opclass opc ON opc.oid = ANY(i.indclass)\n      WHERE\n      c.nspname = '${tableSchema}' AND\n      t.relname = '${tableName}';`,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst dbIndexFromConstraint = await db.query(\n\t\t\t\t\t\t`SELECT\n          idx.indexrelname::text AS index_name,\n          idx.relname::text AS table_name,\n          schemaname::text,\n          CASE WHEN con.conname IS NOT NULL THEN 1 ELSE 0 END AS generated_by_constraint\n        FROM\n          pg_stat_user_indexes idx\n        LEFT JOIN\n          pg_constraint con ON con.conindid = idx.indexrelid\n        WHERE idx.relname = '${tableName}' and schemaname = '${tableSchema}'\n        group by index_name, table_name,schemaname, generated_by_constraint;`,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst idxsInConsteraint = dbIndexFromConstraint.filter((it) => it.generated_by_constraint === 1).map((it) =>\n\t\t\t\t\t\tit.index_name\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const dbIndex of dbIndexes) {\n\t\t\t\t\t\tconst indexName: string = dbIndex.indexname;\n\t\t\t\t\t\tconst indexColumnName: string = dbIndex.column_name;\n\t\t\t\t\t\tconst indexIsUnique = dbIndex.is_unique;\n\t\t\t\t\t\tconst indexMethod = dbIndex.method;\n\t\t\t\t\t\tconst indexWith: string[] = dbIndex.with;\n\t\t\t\t\t\tconst indexWhere: string = dbIndex.where;\n\t\t\t\t\t\tconst opclass: string = dbIndex.opcname;\n\t\t\t\t\t\tconst isExpression = dbIndex.is_expression === 1;\n\n\t\t\t\t\t\tconst desc: boolean = dbIndex.descending;\n\t\t\t\t\t\tconst nullsFirst: boolean = dbIndex.nulls_first;\n\n\t\t\t\t\t\tconst mappedWith: Record<string, string> = {};\n\n\t\t\t\t\t\tif (indexWith !== null) {\n\t\t\t\t\t\t\tindexWith\n\t\t\t\t\t\t\t\t// .slice(1, indexWith.length - 1)\n\t\t\t\t\t\t\t\t// .split(\",\")\n\t\t\t\t\t\t\t\t.forEach((it) => {\n\t\t\t\t\t\t\t\t\tconst splitted = it.split('=');\n\t\t\t\t\t\t\t\t\tmappedWith[splitted[0]] = splitted[1];\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (idxsInConsteraint.includes(indexName)) continue;\n\n\t\t\t\t\t\tif (typeof indexToReturn[indexName] !== 'undefined') {\n\t\t\t\t\t\t\tindexToReturn[indexName].columns.push({\n\t\t\t\t\t\t\t\texpression: indexColumnName,\n\t\t\t\t\t\t\t\tasc: !desc,\n\t\t\t\t\t\t\t\tnulls: nullsFirst ? 'first' : 'last',\n\t\t\t\t\t\t\t\topclass,\n\t\t\t\t\t\t\t\tisExpression,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindexToReturn[indexName] = {\n\t\t\t\t\t\t\t\tname: indexName,\n\t\t\t\t\t\t\t\tcolumns: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\texpression: indexColumnName,\n\t\t\t\t\t\t\t\t\t\tasc: !desc,\n\t\t\t\t\t\t\t\t\t\tnulls: nullsFirst ? 'first' : 'last',\n\t\t\t\t\t\t\t\t\t\topclass,\n\t\t\t\t\t\t\t\t\t\tisExpression,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tisUnique: indexIsUnique,\n\t\t\t\t\t\t\t\t// should not be a part of diff detects\n\t\t\t\t\t\t\t\tconcurrently: false,\n\t\t\t\t\t\t\t\tmethod: indexMethod,\n\t\t\t\t\t\t\t\twhere: indexWhere === null ? undefined : indexWhere,\n\t\t\t\t\t\t\t\twith: mappedWith,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tindexesCount += Object.keys(indexToReturn).length;\n\t\t\t\t\tif (progressCallback) {\n\t\t\t\t\t\tprogressCallback('indexes', indexesCount, 'fetching');\n\t\t\t\t\t}\n\t\t\t\t\tresult[`${tableSchema}.${tableName}`] = {\n\t\t\t\t\t\tname: tableName,\n\t\t\t\t\t\tschema: tableSchema !== 'public' ? tableSchema : '',\n\t\t\t\t\t\tcolumns: columnToReturn,\n\t\t\t\t\t\tindexes: indexToReturn,\n\t\t\t\t\t\tforeignKeys: foreignKeysToReturn,\n\t\t\t\t\t\tcompositePrimaryKeys: primaryKeys,\n\t\t\t\t\t\tuniqueConstraints: {}, // uniqueConstrains,\n\t\t\t\t\t\tcheckConstraints: {}, // checkConstraints,\n\t\t\t\t\t\tpolicies: {}, // policiesByTable[`${tableSchema}.${tableName}`] ?? {},\n\t\t\t\t\t\tisRLSEnabled: row.rls_enabled,\n\t\t\t\t\t};\n\t\t\t\t} catch (e) {\n\t\t\t\t\trej(e);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tres('');\n\t\t\t});\n\t\t});\n\n\tif (progressCallback) {\n\t\tprogressCallback('tables', tableCount, 'done');\n\t}\n\n\tfor await (const _ of all) {\n\t}\n\n\tif (progressCallback) {\n\t\tprogressCallback('columns', columnsCount, 'done');\n\t\tprogressCallback('indexes', indexesCount, 'done');\n\t\tprogressCallback('fks', foreignKeysCount, 'done');\n\t}\n\n\tconst schemasObject = Object.fromEntries([...schemas].map((it) => [it, it]));\n\n\treturn {\n\t\tversion: '1',\n\t\tdialect: 'gel',\n\t\ttables: result,\n\t\tenums: {},\n\t\tschemas: schemasObject,\n\t\tsequences: sequencesToReturn,\n\t\troles: {}, // rolesToReturn,\n\t\tpolicies,\n\t\tviews: {}, // views,\n\t\t_meta: {\n\t\t\tschemas: {},\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t\tinternal: internals,\n\t};\n};\n\nconst defaultForColumn = (column: any, internals: GelKitInternals, tableName: string) => {\n\tconst columnName = column.column_name;\n\tconst isArray = internals?.tables[tableName]?.columns[columnName]?.isArray ?? false;\n\n\tif (column.column_default === null || column.column_default === undefined) return undefined;\n\n\tif (column.column_default.endsWith('[]')) {\n\t\tcolumn.column_default = column.column_default.slice(0, -2);\n\t}\n\n\tcolumn.column_default = column.column_default.replace(/::(.*?)(?<![^\\w\"])(?=$)/, '');\n\n\tconst columnDefaultAsString: string = column.column_default.toString();\n\n\tif (isArray) {\n\t\treturn columnDefaultAsString;\n\t}\n\n\tif (['integer', 'smallint', 'bigint', 'double precision', 'real'].includes(column.data_type)) {\n\t\tif (/^-?[\\d.]+(?:e-?\\d+)?$/.test(columnDefaultAsString)) {\n\t\t\treturn Number(columnDefaultAsString);\n\t\t} else {\n\t\t\tif (typeof internals!.tables![tableName] === 'undefined') {\n\t\t\t\tinternals!.tables![tableName] = {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t[columnName]: {\n\t\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tif (typeof internals!.tables![tableName]!.columns[columnName] === 'undefined') {\n\t\t\t\t\tinternals!.tables![tableName]!.columns[columnName] = {\n\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tinternals!.tables![tableName]!.columns[columnName]!.isDefaultAnExpression = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn columnDefaultAsString;\n\t\t}\n\t} else if (column.data_type.includes('numeric')) {\n\t\t// if numeric(1,1) and used '99' -> psql stores like '99'::numeric\n\t\treturn columnDefaultAsString.includes(\"'\") ? columnDefaultAsString : `'${columnDefaultAsString}'`;\n\t} else if (column.data_type === 'json' || column.data_type === 'jsonb') {\n\t\treturn `'${columnDefaultAsString}'`;\n\t} else if (column.data_type === 'boolean') {\n\t\treturn column.column_default === 'true';\n\t} else if (columnDefaultAsString === 'NULL') {\n\t\treturn `NULL`;\n\t} else if (columnDefaultAsString.startsWith(\"'\") && columnDefaultAsString.endsWith(\"'\")) {\n\t\treturn columnDefaultAsString;\n\t} else {\n\t\treturn `${columnDefaultAsString.replace(/\\\\/g, '`\\\\')}`;\n\t}\n};\n\nconst getColumnsInfoQuery = ({ schema, table, db }: { schema: string; table: string; db: DB }) => {\n\treturn db.query(\n\t\t`SELECT \n    a.attrelid::regclass::text AS table_name,  -- Table, view, or materialized view name\n    a.attname::text AS column_name,   -- Column name\n    CASE \n        WHEN NOT a.attisdropped THEN \n            CASE \n                WHEN a.attnotnull THEN 'NO'\n                ELSE 'YES'\n            END \n        ELSE NULL \n    END AS is_nullable,  -- NULL or NOT NULL constraint\n    a.attndims AS array_dimensions,  -- Array dimensions\n    CASE \n        WHEN a.atttypid = ANY ('{int,int8,int2}'::regtype[]) \n        AND EXISTS (\n            SELECT FROM pg_attrdef ad\n            WHERE ad.adrelid = a.attrelid \n            AND ad.adnum = a.attnum \n            AND pg_get_expr(ad.adbin, ad.adrelid) = 'nextval(''' \n                || pg_get_serial_sequence(a.attrelid::regclass::text, a.attname)::regclass || '''::regclass)'\n        )\n        THEN CASE a.atttypid\n            WHEN 'int'::regtype THEN 'serial'\n            WHEN 'int8'::regtype THEN 'bigserial'\n            WHEN 'int2'::regtype THEN 'smallserial'\n        END\n        ELSE format_type(a.atttypid, a.atttypmod)\n    END AS data_type,  -- Column data type\n--    ns.nspname AS type_schema,  -- Schema name\n    c.column_default::text,  -- Column default value\n    c.data_type::text AS additional_dt,  -- Data type from information_schema\n    c.udt_name::text AS enum_name,  -- Enum type (if applicable)\n    c.is_generated::text,  -- Is it a generated column?\n    c.generation_expression::text,  -- Generation expression (if generated)\n    c.is_identity::text,  -- Is it an identity column?\n    c.identity_generation::text,  -- Identity generation strategy (ALWAYS or BY DEFAULT)\n    c.identity_start::text,  -- Start value of identity column\n    c.identity_increment::text,  -- Increment for identity column\n    c.identity_maximum::text,  -- Maximum value for identity column\n    c.identity_minimum::text,  -- Minimum value for identity column\n    c.identity_cycle::text,  -- Does the identity column cycle?\n    ns.nspname::text AS type_schema  -- Schema of the enum type\nFROM \n    pg_attribute a\nJOIN \n    pg_class cls ON cls.oid = a.attrelid  -- Join pg_class to get table/view/materialized view info\nJOIN \n    pg_namespace ns ON ns.oid = cls.relnamespace  -- Join namespace to get schema info\nLEFT JOIN \n    information_schema.columns c ON c.column_name = a.attname \n        AND c.table_schema = ns.nspname \n        AND c.table_name = cls.relname  -- Match schema and table/view name\nLEFT JOIN \n    pg_type enum_t ON enum_t.oid = a.atttypid  -- Join to get the type info\nLEFT JOIN \n    pg_namespace enum_ns ON enum_ns.oid = enum_t.typnamespace  -- Join to get the enum schema\nWHERE \n    a.attnum > 0  -- Valid column numbers only\n    AND NOT a.attisdropped  -- Skip dropped columns\n    AND cls.relkind IN ('r', 'v', 'm')  -- Include regular tables ('r'), views ('v'), and materialized views ('m')\n    AND ns.nspname::text = '${schema}'  -- Filter by schema\n    AND cls.relname::text = '${table}'  -- Filter by table name\nORDER BY \n    a.attnum;  -- Order by column number`,\n\t);\n};\n"
  },
  {
    "path": "drizzle-kit/src/serializer/index.ts",
    "content": "import chalk from 'chalk';\nimport fs from 'fs';\nimport * as glob from 'glob';\nimport Path from 'path';\nimport { CasingType } from 'src/cli/validations/common';\nimport { error } from '../cli/views';\nimport type { MySqlSchemaInternal } from './mysqlSchema';\nimport type { PgSchemaInternal } from './pgSchema';\nimport { SingleStoreSchemaInternal } from './singlestoreSchema';\nimport type { SQLiteSchemaInternal } from './sqliteSchema';\n\nexport const serializeMySql = async (\n\tpath: string | string[],\n\tcasing: CasingType | undefined,\n): Promise<MySqlSchemaInternal> => {\n\tconst filenames = prepareFilenames(path);\n\n\tconsole.log(chalk.gray(`Reading schema files:\\n${filenames.join('\\n')}\\n`));\n\n\tconst { prepareFromMySqlImports } = await import('./mysqlImports');\n\tconst { generateMySqlSnapshot } = await import('./mysqlSerializer');\n\n\tconst { tables, views } = await prepareFromMySqlImports(filenames);\n\n\treturn generateMySqlSnapshot(tables, views, casing);\n};\n\nexport const serializePg = async (\n\tpath: string | string[],\n\tcasing: CasingType | undefined,\n\tschemaFilter?: string[],\n): Promise<PgSchemaInternal> => {\n\tconst filenames = prepareFilenames(path);\n\n\tconst { prepareFromPgImports } = await import('./pgImports');\n\tconst { generatePgSnapshot } = await import('./pgSerializer');\n\n\tconst { tables, enums, schemas, sequences, views, matViews, roles, policies } = await prepareFromPgImports(\n\t\tfilenames,\n\t);\n\n\treturn generatePgSnapshot(tables, enums, schemas, sequences, roles, policies, views, matViews, casing, schemaFilter);\n};\n\nexport const serializeSQLite = async (\n\tpath: string | string[],\n\tcasing: CasingType | undefined,\n): Promise<SQLiteSchemaInternal> => {\n\tconst filenames = prepareFilenames(path);\n\n\tconst { prepareFromSqliteImports } = await import('./sqliteImports');\n\tconst { generateSqliteSnapshot } = await import('./sqliteSerializer');\n\tconst { tables, views } = await prepareFromSqliteImports(filenames);\n\treturn generateSqliteSnapshot(tables, views, casing);\n};\n\nexport const serializeSingleStore = async (\n\tpath: string | string[],\n\tcasing: CasingType | undefined,\n): Promise<SingleStoreSchemaInternal> => {\n\tconst filenames = prepareFilenames(path);\n\n\tconsole.log(chalk.gray(`Reading schema files:\\n${filenames.join('\\n')}\\n`));\n\n\tconst { prepareFromSingleStoreImports } = await import('./singlestoreImports');\n\tconst { generateSingleStoreSnapshot } = await import('./singlestoreSerializer');\n\n\tconst { tables /* views */ } = await prepareFromSingleStoreImports(filenames);\n\n\treturn generateSingleStoreSnapshot(tables, /* views, */ casing);\n};\n\nexport const prepareFilenames = (path: string | string[]) => {\n\tif (typeof path === 'string') {\n\t\tpath = [path];\n\t}\n\tconst prefix = process.env.TEST_CONFIG_PATH_PREFIX || '';\n\n\tconst result = path.reduce((result, cur) => {\n\t\tconst globbed = glob.sync(`${prefix}${cur}`);\n\n\t\tglobbed.forEach((it) => {\n\t\t\tconst fileName = fs.lstatSync(it).isDirectory() ? null : Path.resolve(it);\n\n\t\t\tconst filenames = fileName\n\t\t\t\t? [fileName!]\n\t\t\t\t: fs.readdirSync(it).map((file) => Path.join(Path.resolve(it), file));\n\n\t\t\tfilenames\n\t\t\t\t.filter((file) => !fs.lstatSync(file).isDirectory())\n\t\t\t\t.forEach((file) => result.add(file));\n\t\t});\n\n\t\treturn result;\n\t}, new Set<string>());\n\tconst res = [...result];\n\n\t// TODO: properly handle and test\n\tconst errors = res.filter((it) => {\n\t\treturn !(\n\t\t\tit.endsWith('.ts')\n\t\t\t|| it.endsWith('.js')\n\t\t\t|| it.endsWith('.cjs')\n\t\t\t|| it.endsWith('.mjs')\n\t\t\t|| it.endsWith('.mts')\n\t\t\t|| it.endsWith('.cts')\n\t\t);\n\t});\n\n\t// when schema: \"./schema\" and not \"./schema.ts\"\n\tif (res.length === 0) {\n\t\tconsole.log(\n\t\t\terror(\n\t\t\t\t`No schema files found for path config [${\n\t\t\t\t\tpath\n\t\t\t\t\t\t.map((it) => `'${it}'`)\n\t\t\t\t\t\t.join(', ')\n\t\t\t\t}]`,\n\t\t\t),\n\t\t);\n\t\tconsole.log(\n\t\t\terror(\n\t\t\t\t`If path represents a file - please make sure to use .ts or other extension in the path`,\n\t\t\t),\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\treturn res;\n};\n"
  },
  {
    "path": "drizzle-kit/src/serializer/mysqlImports.ts",
    "content": "import { is } from 'drizzle-orm';\nimport type { AnyMySqlTable } from 'drizzle-orm/mysql-core';\nimport { MySqlTable, MySqlView } from 'drizzle-orm/mysql-core';\nimport { safeRegister } from '../cli/commands/utils';\n\nexport const prepareFromExports = (exports: Record<string, unknown>) => {\n\tconst tables: AnyMySqlTable[] = [];\n\tconst views: MySqlView[] = [];\n\n\tconst i0values = Object.values(exports);\n\ti0values.forEach((t) => {\n\t\tif (is(t, MySqlTable)) {\n\t\t\ttables.push(t);\n\t\t}\n\n\t\tif (is(t, MySqlView)) {\n\t\t\tviews.push(t);\n\t\t}\n\t});\n\n\treturn { tables, views };\n};\n\nexport const prepareFromMySqlImports = async (imports: string[]) => {\n\tconst tables: AnyMySqlTable[] = [];\n\tconst views: MySqlView[] = [];\n\n\tawait safeRegister(async () => {\n\t\tfor (let i = 0; i < imports.length; i++) {\n\t\t\tconst it = imports[i];\n\t\t\tconst i0: Record<string, unknown> = require(`${it}`);\n\t\t\tconst prepared = prepareFromExports(i0);\n\n\t\t\ttables.push(...prepared.tables);\n\t\t\tviews.push(...prepared.views);\n\t\t}\n\t});\n\n\treturn { tables: Array.from(new Set(tables)), views };\n};\n"
  },
  {
    "path": "drizzle-kit/src/serializer/mysqlSchema.ts",
    "content": "import { any, boolean, enum as enumType, literal, object, record, string, TypeOf, union } from 'zod';\nimport { mapValues, originUUID } from '../global';\n\n// ------- V3 --------\nconst index = object({\n\tname: string(),\n\tcolumns: string().array(),\n\tisUnique: boolean(),\n\tusing: enumType(['btree', 'hash']).optional(),\n\talgorithm: enumType(['default', 'inplace', 'copy']).optional(),\n\tlock: enumType(['default', 'none', 'shared', 'exclusive']).optional(),\n}).strict();\n\nconst fk = object({\n\tname: string(),\n\ttableFrom: string(),\n\tcolumnsFrom: string().array(),\n\ttableTo: string(),\n\tcolumnsTo: string().array(),\n\tonUpdate: string().optional(),\n\tonDelete: string().optional(),\n}).strict();\n\nconst column = object({\n\tname: string(),\n\ttype: string(),\n\tprimaryKey: boolean(),\n\tnotNull: boolean(),\n\tautoincrement: boolean().optional(),\n\tdefault: any().optional(),\n\tonUpdate: any().optional(),\n\tgenerated: object({\n\t\ttype: enumType(['stored', 'virtual']),\n\t\tas: string(),\n\t}).optional(),\n}).strict();\n\nconst tableV3 = object({\n\tname: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), index),\n\tforeignKeys: record(string(), fk),\n}).strict();\n\nconst compositePK = object({\n\tname: string(),\n\tcolumns: string().array(),\n}).strict();\n\nconst uniqueConstraint = object({\n\tname: string(),\n\tcolumns: string().array(),\n}).strict();\n\nconst checkConstraint = object({\n\tname: string(),\n\tvalue: string(),\n}).strict();\n\nconst tableV4 = object({\n\tname: string(),\n\tschema: string().optional(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), index),\n\tforeignKeys: record(string(), fk),\n}).strict();\n\nconst table = object({\n\tname: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), index),\n\tforeignKeys: record(string(), fk),\n\tcompositePrimaryKeys: record(string(), compositePK),\n\tuniqueConstraints: record(string(), uniqueConstraint).default({}),\n\tcheckConstraint: record(string(), checkConstraint).default({}),\n}).strict();\n\nconst viewMeta = object({\n\talgorithm: enumType(['undefined', 'merge', 'temptable']),\n\tsqlSecurity: enumType(['definer', 'invoker']),\n\twithCheckOption: enumType(['local', 'cascaded']).optional(),\n}).strict();\n\nexport const view = object({\n\tname: string(),\n\tcolumns: record(string(), column),\n\tdefinition: string().optional(),\n\tisExisting: boolean(),\n}).strict().merge(viewMeta);\ntype SquasherViewMeta = Omit<TypeOf<typeof viewMeta>, 'definer'>;\n\nexport const kitInternals = object({\n\ttables: record(\n\t\tstring(),\n\t\tobject({\n\t\t\tcolumns: record(\n\t\t\t\tstring(),\n\t\t\t\tobject({ isDefaultAnExpression: boolean().optional() }).optional(),\n\t\t\t),\n\t\t}).optional(),\n\t).optional(),\n\tindexes: record(\n\t\tstring(),\n\t\tobject({\n\t\t\tcolumns: record(\n\t\t\t\tstring(),\n\t\t\t\tobject({ isExpression: boolean().optional() }).optional(),\n\t\t\t),\n\t\t}).optional(),\n\t).optional(),\n}).optional();\n\n// use main dialect\nconst dialect = literal('mysql');\n\nconst schemaHash = object({\n\tid: string(),\n\tprevId: string(),\n});\n\nexport const schemaInternalV3 = object({\n\tversion: literal('3'),\n\tdialect: dialect,\n\ttables: record(string(), tableV3),\n}).strict();\n\nexport const schemaInternalV4 = object({\n\tversion: literal('4'),\n\tdialect: dialect,\n\ttables: record(string(), tableV4),\n\tschemas: record(string(), string()),\n}).strict();\n\nexport const schemaInternalV5 = object({\n\tversion: literal('5'),\n\tdialect: dialect,\n\ttables: record(string(), table),\n\tschemas: record(string(), string()),\n\t_meta: object({\n\t\tschemas: record(string(), string()),\n\t\ttables: record(string(), string()),\n\t\tcolumns: record(string(), string()),\n\t}),\n\tinternal: kitInternals,\n}).strict();\n\nexport const schemaInternal = object({\n\tversion: literal('5'),\n\tdialect: dialect,\n\ttables: record(string(), table),\n\tviews: record(string(), view).default({}),\n\t_meta: object({\n\t\ttables: record(string(), string()),\n\t\tcolumns: record(string(), string()),\n\t}),\n\tinternal: kitInternals,\n}).strict();\n\nexport const schemaV3 = schemaInternalV3.merge(schemaHash);\nexport const schemaV4 = schemaInternalV4.merge(schemaHash);\nexport const schemaV5 = schemaInternalV5.merge(schemaHash);\nexport const schema = schemaInternal.merge(schemaHash);\n\nconst tableSquashedV4 = object({\n\tname: string(),\n\tschema: string().optional(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), string()),\n\tforeignKeys: record(string(), string()),\n}).strict();\n\nconst tableSquashed = object({\n\tname: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), string()),\n\tforeignKeys: record(string(), string()),\n\tcompositePrimaryKeys: record(string(), string()),\n\tuniqueConstraints: record(string(), string()).default({}),\n\tcheckConstraints: record(string(), string()).default({}),\n}).strict();\n\nconst viewSquashed = view.omit({\n\talgorithm: true,\n\tsqlSecurity: true,\n\twithCheckOption: true,\n}).extend({ meta: string() });\n\nexport const schemaSquashed = object({\n\tversion: literal('5'),\n\tdialect: dialect,\n\ttables: record(string(), tableSquashed),\n\tviews: record(string(), viewSquashed),\n}).strict();\n\nexport const schemaSquashedV4 = object({\n\tversion: literal('4'),\n\tdialect: dialect,\n\ttables: record(string(), tableSquashedV4),\n\tschemas: record(string(), string()),\n}).strict();\n\nexport type Dialect = TypeOf<typeof dialect>;\nexport type Column = TypeOf<typeof column>;\nexport type Table = TypeOf<typeof table>;\nexport type TableV4 = TypeOf<typeof tableV4>;\nexport type MySqlSchema = TypeOf<typeof schema>;\nexport type MySqlSchemaV3 = TypeOf<typeof schemaV3>;\nexport type MySqlSchemaV4 = TypeOf<typeof schemaV4>;\nexport type MySqlSchemaV5 = TypeOf<typeof schemaV5>;\nexport type MySqlSchemaInternal = TypeOf<typeof schemaInternal>;\nexport type MySqlKitInternals = TypeOf<typeof kitInternals>;\nexport type MySqlSchemaSquashed = TypeOf<typeof schemaSquashed>;\nexport type MySqlSchemaSquashedV4 = TypeOf<typeof schemaSquashedV4>;\nexport type Index = TypeOf<typeof index>;\nexport type ForeignKey = TypeOf<typeof fk>;\nexport type PrimaryKey = TypeOf<typeof compositePK>;\nexport type UniqueConstraint = TypeOf<typeof uniqueConstraint>;\nexport type CheckConstraint = TypeOf<typeof checkConstraint>;\nexport type View = TypeOf<typeof view>;\nexport type ViewSquashed = TypeOf<typeof viewSquashed>;\n\nexport const MySqlSquasher = {\n\tsquashIdx: (idx: Index) => {\n\t\tindex.parse(idx);\n\t\treturn `${idx.name};${idx.columns.join(',')};${idx.isUnique};${idx.using ?? ''};${idx.algorithm ?? ''};${\n\t\t\tidx.lock ?? ''\n\t\t}`;\n\t},\n\tunsquashIdx: (input: string): Index => {\n\t\tconst [name, columnsString, isUnique, using, algorithm, lock] = input.split(';');\n\t\tconst destructed = {\n\t\t\tname,\n\t\t\tcolumns: columnsString.split(','),\n\t\t\tisUnique: isUnique === 'true',\n\t\t\tusing: using ? using : undefined,\n\t\t\talgorithm: algorithm ? algorithm : undefined,\n\t\t\tlock: lock ? lock : undefined,\n\t\t};\n\t\treturn index.parse(destructed);\n\t},\n\tsquashPK: (pk: PrimaryKey) => {\n\t\treturn `${pk.name};${pk.columns.join(',')}`;\n\t},\n\tunsquashPK: (pk: string): PrimaryKey => {\n\t\tconst splitted = pk.split(';');\n\t\treturn { name: splitted[0], columns: splitted[1].split(',') };\n\t},\n\tsquashUnique: (unq: UniqueConstraint) => {\n\t\treturn `${unq.name};${unq.columns.join(',')}`;\n\t},\n\tunsquashUnique: (unq: string): UniqueConstraint => {\n\t\tconst [name, columns] = unq.split(';');\n\t\treturn { name, columns: columns.split(',') };\n\t},\n\tsquashFK: (fk: ForeignKey) => {\n\t\treturn `${fk.name};${fk.tableFrom};${fk.columnsFrom.join(',')};${fk.tableTo};${fk.columnsTo.join(',')};${\n\t\t\tfk.onUpdate ?? ''\n\t\t};${fk.onDelete ?? ''}`;\n\t},\n\tunsquashFK: (input: string): ForeignKey => {\n\t\tconst [\n\t\t\tname,\n\t\t\ttableFrom,\n\t\t\tcolumnsFromStr,\n\t\t\ttableTo,\n\t\t\tcolumnsToStr,\n\t\t\tonUpdate,\n\t\t\tonDelete,\n\t\t] = input.split(';');\n\n\t\tconst result: ForeignKey = fk.parse({\n\t\t\tname,\n\t\t\ttableFrom,\n\t\t\tcolumnsFrom: columnsFromStr.split(','),\n\t\t\ttableTo,\n\t\t\tcolumnsTo: columnsToStr.split(','),\n\t\t\tonUpdate,\n\t\t\tonDelete,\n\t\t});\n\t\treturn result;\n\t},\n\tsquashCheck: (input: CheckConstraint): string => {\n\t\treturn `${input.name};${input.value}`;\n\t},\n\tunsquashCheck: (input: string): CheckConstraint => {\n\t\tconst [name, value] = input.split(';');\n\n\t\treturn { name, value };\n\t},\n\tsquashView: (view: View): string => {\n\t\treturn `${view.algorithm};${view.sqlSecurity};${view.withCheckOption}`;\n\t},\n\tunsquashView: (meta: string): SquasherViewMeta => {\n\t\tconst [algorithm, sqlSecurity, withCheckOption] = meta.split(';');\n\t\tconst toReturn = {\n\t\t\talgorithm: algorithm,\n\t\t\tsqlSecurity: sqlSecurity,\n\t\t\twithCheckOption: withCheckOption !== 'undefined' ? withCheckOption : undefined,\n\t\t};\n\n\t\treturn viewMeta.parse(toReturn);\n\t},\n};\n\nexport const squashMysqlSchemeV4 = (\n\tjson: MySqlSchemaV4,\n): MySqlSchemaSquashedV4 => {\n\tconst mappedTables = Object.fromEntries(\n\t\tObject.entries(json.tables).map((it) => {\n\t\t\tconst squashedIndexes = mapValues(it[1].indexes, (index) => {\n\t\t\t\treturn MySqlSquasher.squashIdx(index);\n\t\t\t});\n\n\t\t\tconst squashedFKs = mapValues(it[1].foreignKeys, (fk) => {\n\t\t\t\treturn MySqlSquasher.squashFK(fk);\n\t\t\t});\n\n\t\t\treturn [\n\t\t\t\tit[0],\n\t\t\t\t{\n\t\t\t\t\tname: it[1].name,\n\t\t\t\t\tschema: it[1].schema,\n\t\t\t\t\tcolumns: it[1].columns,\n\t\t\t\t\tindexes: squashedIndexes,\n\t\t\t\t\tforeignKeys: squashedFKs,\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t);\n\treturn {\n\t\tversion: '4',\n\t\tdialect: json.dialect,\n\t\ttables: mappedTables,\n\t\tschemas: json.schemas,\n\t};\n};\n\nexport const squashMysqlScheme = (json: MySqlSchema): MySqlSchemaSquashed => {\n\tconst mappedTables = Object.fromEntries(\n\t\tObject.entries(json.tables).map((it) => {\n\t\t\tconst squashedIndexes = mapValues(it[1].indexes, (index) => {\n\t\t\t\treturn MySqlSquasher.squashIdx(index);\n\t\t\t});\n\n\t\t\tconst squashedFKs = mapValues(it[1].foreignKeys, (fk) => {\n\t\t\t\treturn MySqlSquasher.squashFK(fk);\n\t\t\t});\n\n\t\t\tconst squashedPKs = mapValues(it[1].compositePrimaryKeys, (pk) => {\n\t\t\t\treturn MySqlSquasher.squashPK(pk);\n\t\t\t});\n\n\t\t\tconst squashedUniqueConstraints = mapValues(\n\t\t\t\tit[1].uniqueConstraints,\n\t\t\t\t(unq) => {\n\t\t\t\t\treturn MySqlSquasher.squashUnique(unq);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst squashedCheckConstraints = mapValues(it[1].checkConstraint, (check) => {\n\t\t\t\treturn MySqlSquasher.squashCheck(check);\n\t\t\t});\n\n\t\t\treturn [\n\t\t\t\tit[0],\n\t\t\t\t{\n\t\t\t\t\tname: it[1].name,\n\t\t\t\t\tcolumns: it[1].columns,\n\t\t\t\t\tindexes: squashedIndexes,\n\t\t\t\t\tforeignKeys: squashedFKs,\n\t\t\t\t\tcompositePrimaryKeys: squashedPKs,\n\t\t\t\t\tuniqueConstraints: squashedUniqueConstraints,\n\t\t\t\t\tcheckConstraints: squashedCheckConstraints,\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t);\n\n\tconst mappedViews = Object.fromEntries(\n\t\tObject.entries(json.views).map(([key, value]) => {\n\t\t\tconst meta = MySqlSquasher.squashView(value);\n\n\t\t\treturn [key, {\n\t\t\t\tname: value.name,\n\t\t\t\tisExisting: value.isExisting,\n\t\t\t\tcolumns: value.columns,\n\t\t\t\tdefinition: value.definition,\n\t\t\t\tmeta,\n\t\t\t}];\n\t\t}),\n\t);\n\n\treturn {\n\t\tversion: '5',\n\t\tdialect: json.dialect,\n\t\ttables: mappedTables,\n\t\tviews: mappedViews,\n\t};\n};\n\nexport const mysqlSchema = schema;\nexport const mysqlSchemaV3 = schemaV3;\nexport const mysqlSchemaV4 = schemaV4;\nexport const mysqlSchemaV5 = schemaV5;\nexport const mysqlSchemaSquashed = schemaSquashed;\n\n// no prev version\nexport const backwardCompatibleMysqlSchema = union([mysqlSchemaV5, schema]);\n\nexport const dryMySql = mysqlSchema.parse({\n\tversion: '5',\n\tdialect: 'mysql',\n\tid: originUUID,\n\tprevId: '',\n\ttables: {},\n\tschemas: {},\n\tviews: {},\n\t_meta: {\n\t\tschemas: {},\n\t\ttables: {},\n\t\tcolumns: {},\n\t},\n});\n"
  },
  {
    "path": "drizzle-kit/src/serializer/mysqlSerializer.ts",
    "content": "import chalk from 'chalk';\nimport { getTableName, is, SQL } from 'drizzle-orm';\nimport {\n\tAnyMySqlTable,\n\tgetTableConfig,\n\tgetViewConfig,\n\tMySqlColumn,\n\tMySqlDialect,\n\tMySqlView,\n\ttype PrimaryKey as PrimaryKeyORM,\n\tuniqueKeyName,\n} from 'drizzle-orm/mysql-core';\nimport { RowDataPacket } from 'mysql2/promise';\nimport { CasingType } from 'src/cli/validations/common';\nimport { withStyle } from '../cli/validations/outputs';\nimport { IntrospectStage, IntrospectStatus } from '../cli/views';\nimport {\n\tCheckConstraint,\n\tColumn,\n\tForeignKey,\n\tIndex,\n\tMySqlKitInternals,\n\tMySqlSchemaInternal,\n\tPrimaryKey,\n\tTable,\n\tUniqueConstraint,\n\tView,\n} from '../serializer/mysqlSchema';\nimport { type DB, escapeSingleQuotes } from '../utils';\nimport { getColumnCasing, sqlToStr } from './utils';\n\nexport const indexName = (tableName: string, columns: string[]) => {\n\treturn `${tableName}_${columns.join('_')}_index`;\n};\n\nconst handleEnumType = (type: string) => {\n\tlet str = type.split('(')[1];\n\tstr = str.substring(0, str.length - 1);\n\tconst values = str.split(',').map((v) => `'${escapeSingleQuotes(v.substring(1, v.length - 1))}'`);\n\treturn `enum(${values.join(',')})`;\n};\n\nexport const generateMySqlSnapshot = (\n\ttables: AnyMySqlTable[],\n\tviews: MySqlView[],\n\tcasing: CasingType | undefined,\n): MySqlSchemaInternal => {\n\tconst dialect = new MySqlDialect({ casing });\n\tconst result: Record<string, Table> = {};\n\tconst resultViews: Record<string, View> = {};\n\tconst internal: MySqlKitInternals = { tables: {}, indexes: {} };\n\n\tfor (const table of tables) {\n\t\tconst {\n\t\t\tname: tableName,\n\t\t\tcolumns,\n\t\t\tindexes,\n\t\t\tforeignKeys,\n\t\t\tschema,\n\t\t\tchecks,\n\t\t\tprimaryKeys,\n\t\t\tuniqueConstraints,\n\t\t} = getTableConfig(table);\n\n\t\tconst columnsObject: Record<string, Column> = {};\n\t\tconst indexesObject: Record<string, Index> = {};\n\t\tconst foreignKeysObject: Record<string, ForeignKey> = {};\n\t\tconst primaryKeysObject: Record<string, PrimaryKey> = {};\n\t\tconst uniqueConstraintObject: Record<string, UniqueConstraint> = {};\n\t\tconst checkConstraintObject: Record<string, CheckConstraint> = {};\n\n\t\t// this object will help to identify same check names\n\t\tlet checksInTable: Record<string, string[]> = {};\n\n\t\tcolumns.forEach((column) => {\n\t\t\tconst name = getColumnCasing(column, casing);\n\t\t\tconst notNull: boolean = column.notNull;\n\t\t\tconst sqlType = column.getSQLType();\n\t\t\tconst sqlTypeLowered = sqlType.toLowerCase();\n\t\t\tconst autoIncrement = typeof (column as any).autoIncrement === 'undefined'\n\t\t\t\t? false\n\t\t\t\t: (column as any).autoIncrement;\n\n\t\t\tconst generated = column.generated;\n\n\t\t\tconst columnToSet: Column = {\n\t\t\t\tname,\n\t\t\t\ttype: sqlType.startsWith('enum') ? handleEnumType(sqlType) : sqlType,\n\t\t\t\tprimaryKey: false,\n\t\t\t\t// If field is autoincrement it's notNull by default\n\t\t\t\t// notNull: autoIncrement ? true : notNull,\n\t\t\t\tnotNull,\n\t\t\t\tautoincrement: autoIncrement,\n\t\t\t\tonUpdate: (column as any).hasOnUpdateNow,\n\t\t\t\tgenerated: generated\n\t\t\t\t\t? {\n\t\t\t\t\t\tas: is(generated.as, SQL)\n\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as as SQL).sql\n\t\t\t\t\t\t\t: typeof generated.as === 'function'\n\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as() as SQL).sql\n\t\t\t\t\t\t\t: (generated.as as any),\n\t\t\t\t\t\ttype: generated.mode ?? 'stored',\n\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t};\n\n\t\t\tif (column.primary) {\n\t\t\t\tprimaryKeysObject[`${tableName}_${name}`] = {\n\t\t\t\t\tname: `${tableName}_${name}`,\n\t\t\t\t\tcolumns: [name],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (column.isUnique) {\n\t\t\t\tconst existingUnique = uniqueConstraintObject[column.uniqueName!];\n\t\t\t\tif (typeof existingUnique !== 'undefined') {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(`We\\'ve found duplicated unique constraint names in ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} table. \n          The unique constraint ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tcolumn.uniqueName,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} on the ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} column is confilcting with a unique constraint name already defined for ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\texistingUnique.columns.join(','),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} columns\\n`)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tuniqueConstraintObject[column.uniqueName!] = {\n\t\t\t\t\tname: column.uniqueName!,\n\t\t\t\t\tcolumns: [columnToSet.name],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (column.default !== undefined) {\n\t\t\t\tif (is(column.default, SQL)) {\n\t\t\t\t\tcolumnToSet.default = sqlToStr(column.default, casing);\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof column.default === 'string') {\n\t\t\t\t\t\tcolumnToSet.default = `'${escapeSingleQuotes(column.default)}'`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (sqlTypeLowered === 'json') {\n\t\t\t\t\t\t\tcolumnToSet.default = `'${JSON.stringify(column.default)}'`;\n\t\t\t\t\t\t} else if (column.default instanceof Date) {\n\t\t\t\t\t\t\tif (sqlTypeLowered === 'date') {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString().split('T')[0]}'`;\n\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\tsqlTypeLowered.startsWith('datetime')\n\t\t\t\t\t\t\t\t|| sqlTypeLowered.startsWith('timestamp')\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${\n\t\t\t\t\t\t\t\t\tcolumn.default\n\t\t\t\t\t\t\t\t\t\t.toISOString()\n\t\t\t\t\t\t\t\t\t\t.replace('T', ' ')\n\t\t\t\t\t\t\t\t\t\t.slice(0, 23)\n\t\t\t\t\t\t\t\t}'`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcolumnToSet.default = column.default;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (['blob', 'text', 'json'].includes(column.getSQLType())) {\n\t\t\t\t\t\tcolumnToSet.default = `(${columnToSet.default})`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcolumnsObject[name] = columnToSet;\n\t\t});\n\n\t\tprimaryKeys.map((pk: PrimaryKeyORM) => {\n\t\t\tconst originalColumnNames = pk.columns.map((c) => c.name);\n\t\t\tconst columnNames = pk.columns.map((c: any) => getColumnCasing(c, casing));\n\n\t\t\tlet name = pk.getName();\n\t\t\tif (casing !== undefined) {\n\t\t\t\tfor (let i = 0; i < originalColumnNames.length; i++) {\n\t\t\t\t\tname = name.replace(originalColumnNames[i], columnNames[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprimaryKeysObject[name] = {\n\t\t\t\tname,\n\t\t\t\tcolumns: columnNames,\n\t\t\t};\n\n\t\t\t// all composite pk's should be treated as notNull\n\t\t\tfor (const column of pk.columns) {\n\t\t\t\tcolumnsObject[getColumnCasing(column, casing)].notNull = true;\n\t\t\t}\n\t\t});\n\n\t\tuniqueConstraints?.map((unq) => {\n\t\t\tconst columnNames = unq.columns.map((c) => getColumnCasing(c, casing));\n\n\t\t\tconst name = unq.name ?? uniqueKeyName(table, columnNames);\n\n\t\t\tconst existingUnique = uniqueConstraintObject[name];\n\t\t\tif (typeof existingUnique !== 'undefined') {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\n${\n\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t`We\\'ve found duplicated unique constraint names in ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} table. \\nThe unique constraint ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} on the ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tcolumnNames.join(','),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} columns is confilcting with a unique constraint name already defined for ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\texistingUnique.columns.join(','),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} columns\\n`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tuniqueConstraintObject[name] = {\n\t\t\t\tname: unq.name!,\n\t\t\t\tcolumns: columnNames,\n\t\t\t};\n\t\t});\n\n\t\tconst fks: ForeignKey[] = foreignKeys.map((fk) => {\n\t\t\tconst tableFrom = tableName;\n\t\t\tconst onDelete = fk.onDelete ?? 'no action';\n\t\t\tconst onUpdate = fk.onUpdate ?? 'no action';\n\t\t\tconst reference = fk.reference();\n\n\t\t\tconst referenceFT = reference.foreignTable;\n\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\tconst tableTo = getTableName(referenceFT);\n\n\t\t\tconst originalColumnsFrom = reference.columns.map((it) => it.name);\n\t\t\tconst columnsFrom = reference.columns.map((it) => getColumnCasing(it, casing));\n\t\t\tconst originalColumnsTo = reference.foreignColumns.map((it) => it.name);\n\t\t\tconst columnsTo = reference.foreignColumns.map((it) => getColumnCasing(it, casing));\n\n\t\t\tlet name = fk.getName();\n\t\t\tif (casing !== undefined) {\n\t\t\t\tfor (let i = 0; i < originalColumnsFrom.length; i++) {\n\t\t\t\t\tname = name.replace(originalColumnsFrom[i], columnsFrom[i]);\n\t\t\t\t}\n\t\t\t\tfor (let i = 0; i < originalColumnsTo.length; i++) {\n\t\t\t\t\tname = name.replace(originalColumnsTo[i], columnsTo[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\ttableFrom,\n\t\t\t\ttableTo,\n\t\t\t\tcolumnsFrom,\n\t\t\t\tcolumnsTo,\n\t\t\t\tonDelete,\n\t\t\t\tonUpdate,\n\t\t\t} as ForeignKey;\n\t\t});\n\n\t\tfks.forEach((it) => {\n\t\t\tforeignKeysObject[it.name] = it;\n\t\t});\n\n\t\tindexes.forEach((value) => {\n\t\t\tconst columns = value.config.columns;\n\t\t\tconst name = value.config.name;\n\n\t\t\tlet indexColumns = columns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\tconst sql = dialect.sqlToQuery(it, 'indexes').sql;\n\t\t\t\t\tif (typeof internal!.indexes![name] === 'undefined') {\n\t\t\t\t\t\tinternal!.indexes![name] = {\n\t\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\t\t[sql]: {\n\t\t\t\t\t\t\t\t\tisExpression: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (typeof internal!.indexes![name]?.columns[sql] === 'undefined') {\n\t\t\t\t\t\t\tinternal!.indexes![name]!.columns[sql] = {\n\t\t\t\t\t\t\t\tisExpression: true,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinternal!.indexes![name]!.columns[sql]!.isExpression = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn sql;\n\t\t\t\t} else {\n\t\t\t\t\treturn `${getColumnCasing(it, casing)}`;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (value.config.unique) {\n\t\t\t\tif (typeof uniqueConstraintObject[name] !== 'undefined') {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t`We\\'ve found duplicated unique constraint names in ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} table. \\nThe unique index ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} on the ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\tindexColumns.join(','),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} columns is confilcting with a unique constraint name already defined for ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\tuniqueConstraintObject[name].columns.join(','),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} columns\\n`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (typeof foreignKeysObject[name] !== 'undefined') {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t`In MySQL, when creating a foreign key, an index is automatically generated with the same name as the foreign key constraint.\\n\\nWe have encountered a collision between the index name on columns ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\tindexColumns.join(','),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} and the foreign key on columns ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\tforeignKeysObject[name].columnsFrom.join(','),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}. Please change either the index name or the foreign key name. For more information, please refer to https://dev.mysql.com/doc/refman/8.0/en/constraint-foreign-key.html\\n\n            `,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tindexesObject[name] = {\n\t\t\t\tname,\n\t\t\t\tcolumns: indexColumns,\n\t\t\t\tisUnique: value.config.unique ?? false,\n\t\t\t\tusing: value.config.using,\n\t\t\t\talgorithm: value.config.algorithm,\n\t\t\t\tlock: value.config.lock,\n\t\t\t};\n\t\t});\n\n\t\tchecks.forEach((check) => {\n\t\t\tcheck;\n\t\t\tconst checkName = check.name;\n\t\t\tif (typeof checksInTable[tableName] !== 'undefined') {\n\t\t\t\tif (checksInTable[tableName].includes(check.name)) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t`We\\'ve found duplicated check constraint name in ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}. Please rename your check constraint in the ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} table`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tchecksInTable[tableName].push(checkName);\n\t\t\t} else {\n\t\t\t\tchecksInTable[tableName] = [check.name];\n\t\t\t}\n\n\t\t\tcheckConstraintObject[checkName] = {\n\t\t\t\tname: checkName,\n\t\t\t\tvalue: dialect.sqlToQuery(check.value).sql,\n\t\t\t};\n\t\t});\n\n\t\t// only handle tables without schemas\n\t\tif (!schema) {\n\t\t\tresult[tableName] = {\n\t\t\t\tname: tableName,\n\t\t\t\tcolumns: columnsObject,\n\t\t\t\tindexes: indexesObject,\n\t\t\t\tforeignKeys: foreignKeysObject,\n\t\t\t\tcompositePrimaryKeys: primaryKeysObject,\n\t\t\t\tuniqueConstraints: uniqueConstraintObject,\n\t\t\t\tcheckConstraint: checkConstraintObject,\n\t\t\t};\n\t\t}\n\t}\n\n\tfor (const view of views) {\n\t\tconst {\n\t\t\tisExisting,\n\t\t\tname,\n\t\t\tquery,\n\t\t\tschema,\n\t\t\tselectedFields,\n\t\t\talgorithm,\n\t\t\tsqlSecurity,\n\t\t\twithCheckOption,\n\t\t} = getViewConfig(view);\n\n\t\tconst columnsObject: Record<string, Column> = {};\n\n\t\tconst existingView = resultViews[name];\n\t\tif (typeof existingView !== 'undefined') {\n\t\t\tconsole.log(\n\t\t\t\t`\\n${\n\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t`We\\'ve found duplicated view name across ${\n\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\tschema ?? 'public',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} schema. Please rename your view`,\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tfor (const key in selectedFields) {\n\t\t\tif (is(selectedFields[key], MySqlColumn)) {\n\t\t\t\tconst column = selectedFields[key];\n\n\t\t\t\tconst notNull: boolean = column.notNull;\n\t\t\t\tconst sqlTypeLowered = column.getSQLType().toLowerCase();\n\t\t\t\tconst autoIncrement = typeof (column as any).autoIncrement === 'undefined'\n\t\t\t\t\t? false\n\t\t\t\t\t: (column as any).autoIncrement;\n\n\t\t\t\tconst generated = column.generated;\n\n\t\t\t\tconst columnToSet: Column = {\n\t\t\t\t\tname: column.name,\n\t\t\t\t\ttype: column.getSQLType(),\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t// If field is autoincrement it's notNull by default\n\t\t\t\t\t// notNull: autoIncrement ? true : notNull,\n\t\t\t\t\tnotNull,\n\t\t\t\t\tautoincrement: autoIncrement,\n\t\t\t\t\tonUpdate: (column as any).hasOnUpdateNow,\n\t\t\t\t\tgenerated: generated\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\tas: is(generated.as, SQL)\n\t\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as as SQL).sql\n\t\t\t\t\t\t\t\t: typeof generated.as === 'function'\n\t\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as() as SQL).sql\n\t\t\t\t\t\t\t\t: (generated.as as any),\n\t\t\t\t\t\t\ttype: generated.mode ?? 'stored',\n\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\t};\n\n\t\t\t\tif (column.default !== undefined) {\n\t\t\t\t\tif (is(column.default, SQL)) {\n\t\t\t\t\t\tcolumnToSet.default = sqlToStr(column.default, casing);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (typeof column.default === 'string') {\n\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default}'`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (sqlTypeLowered === 'json') {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${JSON.stringify(column.default)}'`;\n\t\t\t\t\t\t\t} else if (column.default instanceof Date) {\n\t\t\t\t\t\t\t\tif (sqlTypeLowered === 'date') {\n\t\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString().split('T')[0]}'`;\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\tsqlTypeLowered.startsWith('datetime')\n\t\t\t\t\t\t\t\t\t|| sqlTypeLowered.startsWith('timestamp')\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tcolumnToSet.default = `'${\n\t\t\t\t\t\t\t\t\t\tcolumn.default\n\t\t\t\t\t\t\t\t\t\t\t.toISOString()\n\t\t\t\t\t\t\t\t\t\t\t.replace('T', ' ')\n\t\t\t\t\t\t\t\t\t\t\t.slice(0, 23)\n\t\t\t\t\t\t\t\t\t}'`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcolumnToSet.default = column.default;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (['blob', 'text', 'json'].includes(column.getSQLType())) {\n\t\t\t\t\t\t\tcolumnToSet.default = `(${columnToSet.default})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcolumnsObject[column.name] = columnToSet;\n\t\t\t}\n\t\t}\n\n\t\tresultViews[name] = {\n\t\t\tcolumns: columnsObject,\n\t\t\tname,\n\t\t\tisExisting,\n\t\t\tdefinition: isExisting ? undefined : dialect.sqlToQuery(query!).sql,\n\t\t\twithCheckOption,\n\t\t\talgorithm: algorithm ?? 'undefined', // set default values\n\t\t\tsqlSecurity: sqlSecurity ?? 'definer', // set default values\n\t\t};\n\t}\n\n\treturn {\n\t\tversion: '5',\n\t\tdialect: 'mysql',\n\t\ttables: result,\n\t\tviews: resultViews,\n\t\t_meta: {\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t\tinternal,\n\t};\n};\n\nfunction clearDefaults(defaultValue: any, collate: string) {\n\tif (typeof collate === 'undefined' || collate === null) {\n\t\tcollate = `utf8mb4`;\n\t}\n\n\tlet resultDefault = defaultValue;\n\tcollate = `_${collate}`;\n\tif (defaultValue.startsWith(collate)) {\n\t\tresultDefault = resultDefault\n\t\t\t.substring(collate.length, defaultValue.length)\n\t\t\t.replace(/\\\\/g, '');\n\t\tif (resultDefault.startsWith(\"'\") && resultDefault.endsWith(\"'\")) {\n\t\t\treturn `('${escapeSingleQuotes(resultDefault.substring(1, resultDefault.length - 1))}')`;\n\t\t} else {\n\t\t\treturn `'${escapeSingleQuotes(resultDefault.substring(1, resultDefault.length - 1))}'`;\n\t\t}\n\t} else {\n\t\treturn `(${resultDefault})`;\n\t}\n}\n\nexport const fromDatabase = async (\n\tdb: DB,\n\tinputSchema: string,\n\ttablesFilter: (table: string) => boolean = (table) => true,\n\tprogressCallback?: (\n\t\tstage: IntrospectStage,\n\t\tcount: number,\n\t\tstatus: IntrospectStatus,\n\t) => void,\n): Promise<MySqlSchemaInternal> => {\n\tconst result: Record<string, Table> = {};\n\tconst internals: MySqlKitInternals = { tables: {}, indexes: {} };\n\n\tconst columns = await db.query(`select * from information_schema.columns\n\twhere table_schema = '${inputSchema}' and table_name != '__drizzle_migrations'\n\torder by table_name, ordinal_position;`);\n\n\tconst response = columns as RowDataPacket[];\n\n\tconst schemas: string[] = [];\n\n\tlet columnsCount = 0;\n\tlet tablesCount = new Set();\n\tlet indexesCount = 0;\n\tlet foreignKeysCount = 0;\n\tlet checksCount = 0;\n\tlet viewsCount = 0;\n\n\tconst idxs = await db.query(\n\t\t`select * from INFORMATION_SCHEMA.STATISTICS\n\tWHERE INFORMATION_SCHEMA.STATISTICS.TABLE_SCHEMA = '${inputSchema}' and INFORMATION_SCHEMA.STATISTICS.INDEX_NAME != 'PRIMARY';`,\n\t);\n\n\tconst idxRows = idxs as RowDataPacket[];\n\n\tfor (const column of response) {\n\t\tif (!tablesFilter(column['TABLE_NAME'] as string)) continue;\n\n\t\tcolumnsCount += 1;\n\t\tif (progressCallback) {\n\t\t\tprogressCallback('columns', columnsCount, 'fetching');\n\t\t}\n\t\tconst schema: string = column['TABLE_SCHEMA'];\n\t\tconst tableName = column['TABLE_NAME'];\n\n\t\ttablesCount.add(`${schema}.${tableName}`);\n\t\tif (progressCallback) {\n\t\t\tprogressCallback('columns', tablesCount.size, 'fetching');\n\t\t}\n\t\tconst columnName: string = column['COLUMN_NAME'];\n\t\tconst isNullable = column['IS_NULLABLE'] === 'YES'; // 'YES', 'NO'\n\t\tconst dataType = column['DATA_TYPE']; // varchar\n\t\tconst columnType = column['COLUMN_TYPE']; // varchar(256)\n\t\tconst isPrimary = column['COLUMN_KEY'] === 'PRI'; // 'PRI', ''\n\t\tconst columnDefault: string = column['COLUMN_DEFAULT'];\n\t\tconst collation: string = column['CHARACTER_SET_NAME'];\n\t\tconst geenratedExpression: string = column['GENERATION_EXPRESSION'];\n\n\t\tlet columnExtra = column['EXTRA'];\n\t\tlet isAutoincrement = false; // 'auto_increment', ''\n\t\tlet isDefaultAnExpression = false; // 'auto_increment', ''\n\n\t\tif (typeof column['EXTRA'] !== 'undefined') {\n\t\t\tcolumnExtra = column['EXTRA'];\n\t\t\tisAutoincrement = column['EXTRA'] === 'auto_increment'; // 'auto_increment', ''\n\t\t\tisDefaultAnExpression = column['EXTRA'].includes('DEFAULT_GENERATED'); // 'auto_increment', ''\n\t\t}\n\n\t\t// if (isPrimary) {\n\t\t//   if (typeof tableToPk[tableName] === \"undefined\") {\n\t\t//     tableToPk[tableName] = [columnName];\n\t\t//   } else {\n\t\t//     tableToPk[tableName].push(columnName);\n\t\t//   }\n\t\t// }\n\n\t\tif (schema !== inputSchema) {\n\t\t\tschemas.push(schema);\n\t\t}\n\n\t\tconst table = result[tableName];\n\n\t\t// let changedType = columnType.replace(\"bigint unsigned\", \"serial\")\n\t\tlet changedType = columnType;\n\n\t\tif (columnType === 'bigint unsigned' && !isNullable && isAutoincrement) {\n\t\t\t// check unique here\n\t\t\tconst uniqueIdx = idxRows.filter(\n\t\t\t\t(it) =>\n\t\t\t\t\tit['COLUMN_NAME'] === columnName\n\t\t\t\t\t&& it['TABLE_NAME'] === tableName\n\t\t\t\t\t&& it['NON_UNIQUE'] === 0,\n\t\t\t);\n\t\t\tif (uniqueIdx && uniqueIdx.length === 1) {\n\t\t\t\tchangedType = columnType.replace('bigint unsigned', 'serial');\n\t\t\t}\n\t\t}\n\n\t\tif (columnType.includes('decimal(10,0)')) {\n\t\t\tchangedType = columnType.replace('decimal(10,0)', 'decimal');\n\t\t}\n\n\t\tlet onUpdate: boolean | undefined = undefined;\n\t\tif (\n\t\t\tcolumnType.startsWith('timestamp')\n\t\t\t&& typeof columnExtra !== 'undefined'\n\t\t\t&& columnExtra.includes('on update CURRENT_TIMESTAMP')\n\t\t) {\n\t\t\tonUpdate = true;\n\t\t}\n\n\t\tconst newColumn: Column = {\n\t\t\tdefault: columnDefault === null || columnDefault === undefined\n\t\t\t\t? undefined\n\t\t\t\t: /^-?[\\d.]+(?:e-?\\d+)?$/.test(columnDefault)\n\t\t\t\t\t\t&& !['decimal', 'char', 'varchar'].some((type) => columnType.startsWith(type))\n\t\t\t\t? Number(columnDefault)\n\t\t\t\t: isDefaultAnExpression\n\t\t\t\t? clearDefaults(columnDefault, collation)\n\t\t\t\t: `'${escapeSingleQuotes(columnDefault)}'`,\n\t\t\tautoincrement: isAutoincrement,\n\t\t\tname: columnName,\n\t\t\ttype: changedType,\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: !isNullable,\n\t\t\tonUpdate,\n\t\t\tgenerated: geenratedExpression\n\t\t\t\t? {\n\t\t\t\t\tas: geenratedExpression,\n\t\t\t\t\ttype: columnExtra === 'VIRTUAL GENERATED' ? 'virtual' : 'stored',\n\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t};\n\n\t\t// Set default to internal object\n\t\tif (isDefaultAnExpression) {\n\t\t\tif (typeof internals!.tables![tableName] === 'undefined') {\n\t\t\t\tinternals!.tables![tableName] = {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t[columnName]: {\n\t\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\ttypeof internals!.tables![tableName]!.columns[columnName]\n\t\t\t\t\t\t=== 'undefined'\n\t\t\t\t) {\n\t\t\t\t\tinternals!.tables![tableName]!.columns[columnName] = {\n\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tinternals!.tables![tableName]!.columns[\n\t\t\t\t\t\tcolumnName\n\t\t\t\t\t]!.isDefaultAnExpression = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!table) {\n\t\t\tresult[tableName] = {\n\t\t\t\tname: tableName,\n\t\t\t\tcolumns: {\n\t\t\t\t\t[columnName]: newColumn,\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraint: {},\n\t\t\t};\n\t\t} else {\n\t\t\tresult[tableName]!.columns[columnName] = newColumn;\n\t\t}\n\t}\n\n\tconst tablePks = await db.query(\n\t\t`SELECT table_name, column_name, ordinal_position\n  FROM information_schema.table_constraints t\n  LEFT JOIN information_schema.key_column_usage k\n  USING(constraint_name,table_schema,table_name)\n  WHERE t.constraint_type='PRIMARY KEY'\n      and table_name != '__drizzle_migrations'\n      AND t.table_schema = '${inputSchema}'\n      ORDER BY ordinal_position`,\n\t);\n\n\tconst tableToPk: { [tname: string]: string[] } = {};\n\n\tconst tableToPkRows = tablePks as RowDataPacket[];\n\tfor (const tableToPkRow of tableToPkRows) {\n\t\tconst tableName: string = tableToPkRow['TABLE_NAME'];\n\t\tconst columnName: string = tableToPkRow['COLUMN_NAME'];\n\t\tconst position: string = tableToPkRow['ordinal_position'];\n\n\t\tif (typeof result[tableName] === 'undefined') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (typeof tableToPk[tableName] === 'undefined') {\n\t\t\ttableToPk[tableName] = [columnName];\n\t\t} else {\n\t\t\ttableToPk[tableName].push(columnName);\n\t\t}\n\t}\n\n\tfor (const [key, value] of Object.entries(tableToPk)) {\n\t\t// if (value.length > 1) {\n\t\tresult[key].compositePrimaryKeys = {\n\t\t\t[`${key}_${value.join('_')}`]: {\n\t\t\t\tname: `${key}_${value.join('_')}`,\n\t\t\t\tcolumns: value,\n\t\t\t},\n\t\t};\n\t\t// } else if (value.length === 1) {\n\t\t// result[key].columns[value[0]].primaryKey = true;\n\t\t// } else {\n\t\t// }\n\t}\n\tif (progressCallback) {\n\t\tprogressCallback('columns', columnsCount, 'done');\n\t\tprogressCallback('tables', tablesCount.size, 'done');\n\t}\n\ttry {\n\t\tconst fks = await db.query(\n\t\t\t`SELECT \n      kcu.TABLE_SCHEMA,\n      kcu.TABLE_NAME,\n      kcu.CONSTRAINT_NAME,\n      kcu.COLUMN_NAME,\n      kcu.REFERENCED_TABLE_SCHEMA,\n      kcu.REFERENCED_TABLE_NAME,\n      kcu.REFERENCED_COLUMN_NAME,\n      rc.UPDATE_RULE,\n      rc.DELETE_RULE\n  FROM \n      INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu\n  LEFT JOIN \n      information_schema.referential_constraints rc \n      ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME\n  WHERE kcu.TABLE_SCHEMA = '${inputSchema}' AND kcu.CONSTRAINT_NAME != 'PRIMARY' \n      AND kcu.REFERENCED_TABLE_NAME IS NOT NULL;`,\n\t\t);\n\n\t\tconst fkRows = fks as RowDataPacket[];\n\n\t\tfor (const fkRow of fkRows) {\n\t\t\tforeignKeysCount += 1;\n\t\t\tif (progressCallback) {\n\t\t\t\tprogressCallback('fks', foreignKeysCount, 'fetching');\n\t\t\t}\n\t\t\tconst tableSchema = fkRow['TABLE_SCHEMA'];\n\t\t\tconst tableName: string = fkRow['TABLE_NAME'];\n\t\t\tconst constraintName = fkRow['CONSTRAINT_NAME'];\n\t\t\tconst columnName: string = fkRow['COLUMN_NAME'];\n\t\t\tconst refTableSchema = fkRow['REFERENCED_TABLE_SCHEMA'];\n\t\t\tconst refTableName = fkRow['REFERENCED_TABLE_NAME'];\n\t\t\tconst refColumnName: string = fkRow['REFERENCED_COLUMN_NAME'];\n\t\t\tconst updateRule: string = fkRow['UPDATE_RULE'];\n\t\t\tconst deleteRule = fkRow['DELETE_RULE'];\n\n\t\t\tconst tableInResult = result[tableName];\n\t\t\tif (typeof tableInResult === 'undefined') continue;\n\n\t\t\tif (typeof tableInResult.foreignKeys[constraintName] !== 'undefined') {\n\t\t\t\ttableInResult.foreignKeys[constraintName]!.columnsFrom.push(columnName);\n\t\t\t\ttableInResult.foreignKeys[constraintName]!.columnsTo.push(\n\t\t\t\t\trefColumnName,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\ttableInResult.foreignKeys[constraintName] = {\n\t\t\t\t\tname: constraintName,\n\t\t\t\t\ttableFrom: tableName,\n\t\t\t\t\ttableTo: refTableName,\n\t\t\t\t\tcolumnsFrom: [columnName],\n\t\t\t\t\tcolumnsTo: [refColumnName],\n\t\t\t\t\tonDelete: deleteRule?.toLowerCase(),\n\t\t\t\t\tonUpdate: updateRule?.toLowerCase(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\ttableInResult.foreignKeys[constraintName]!.columnsFrom = [\n\t\t\t\t...new Set(tableInResult.foreignKeys[constraintName]!.columnsFrom),\n\t\t\t];\n\n\t\t\ttableInResult.foreignKeys[constraintName]!.columnsTo = [\n\t\t\t\t...new Set(tableInResult.foreignKeys[constraintName]!.columnsTo),\n\t\t\t];\n\t\t}\n\t} catch (e) {\n\t\t// console.log(`Can't proccess foreign keys`);\n\t}\n\tif (progressCallback) {\n\t\tprogressCallback('fks', foreignKeysCount, 'done');\n\t}\n\n\tfor (const idxRow of idxRows) {\n\t\tconst tableSchema = idxRow['TABLE_SCHEMA'];\n\t\tconst tableName = idxRow['TABLE_NAME'];\n\t\tconst constraintName = idxRow['INDEX_NAME'];\n\t\tconst columnName: string = idxRow['COLUMN_NAME'];\n\t\tconst isUnique = idxRow['NON_UNIQUE'] === 0;\n\n\t\tconst tableInResult = result[tableName];\n\t\tif (typeof tableInResult === 'undefined') continue;\n\n\t\t// if (tableInResult.columns[columnName].type === \"serial\") continue;\n\n\t\tindexesCount += 1;\n\t\tif (progressCallback) {\n\t\t\tprogressCallback('indexes', indexesCount, 'fetching');\n\t\t}\n\n\t\tif (isUnique) {\n\t\t\tif (\n\t\t\t\ttypeof tableInResult.uniqueConstraints[constraintName] !== 'undefined'\n\t\t\t) {\n\t\t\t\ttableInResult.uniqueConstraints[constraintName]!.columns.push(\n\t\t\t\t\tcolumnName,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\ttableInResult.uniqueConstraints[constraintName] = {\n\t\t\t\t\tname: constraintName,\n\t\t\t\t\tcolumns: [columnName],\n\t\t\t\t};\n\t\t\t}\n\t\t} else {\n\t\t\t// in MySQL FK creates index by default. Name of index is the same as fk constraint name\n\t\t\t// so for introspect we will just skip it\n\t\t\tif (typeof tableInResult.foreignKeys[constraintName] === 'undefined') {\n\t\t\t\tif (typeof tableInResult.indexes[constraintName] !== 'undefined') {\n\t\t\t\t\ttableInResult.indexes[constraintName]!.columns.push(columnName);\n\t\t\t\t} else {\n\t\t\t\t\ttableInResult.indexes[constraintName] = {\n\t\t\t\t\t\tname: constraintName,\n\t\t\t\t\t\tcolumns: [columnName],\n\t\t\t\t\t\tisUnique: isUnique,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst views = await db.query(\n\t\t`select * from INFORMATION_SCHEMA.VIEWS WHERE table_schema = '${inputSchema}';`,\n\t);\n\n\tconst resultViews: Record<string, View> = {};\n\n\tviewsCount = views.length;\n\tif (progressCallback) {\n\t\tprogressCallback('views', viewsCount, 'fetching');\n\t}\n\tfor await (const view of views) {\n\t\tconst viewName = view['TABLE_NAME'];\n\t\tconst definition = view['VIEW_DEFINITION'];\n\n\t\tconst withCheckOption = view['CHECK_OPTION'] === 'NONE' ? undefined : view['CHECK_OPTION'].toLowerCase();\n\t\tconst sqlSecurity = view['SECURITY_TYPE'].toLowerCase();\n\n\t\tconst [createSqlStatement] = await db.query(`SHOW CREATE VIEW \\`${viewName}\\`;`);\n\t\tconst algorithmMatch = createSqlStatement['Create View'].match(/ALGORITHM=([^ ]+)/);\n\t\tconst algorithm = algorithmMatch ? algorithmMatch[1].toLowerCase() : undefined;\n\n\t\tconst columns = result[viewName].columns;\n\t\tdelete result[viewName];\n\n\t\tresultViews[viewName] = {\n\t\t\tcolumns: columns,\n\t\t\tisExisting: false,\n\t\t\tname: viewName,\n\t\t\talgorithm,\n\t\t\tdefinition,\n\t\t\tsqlSecurity,\n\t\t\twithCheckOption,\n\t\t};\n\t}\n\n\tif (progressCallback) {\n\t\tprogressCallback('indexes', indexesCount, 'done');\n\t\t// progressCallback(\"enums\", 0, \"fetching\");\n\t\tprogressCallback('enums', 0, 'done');\n\t\tprogressCallback('views', viewsCount, 'done');\n\t}\n\n\tconst checkConstraints = await db.query(\n\t\t`SELECT \n    tc.table_name, \n    tc.constraint_name, \n    cc.check_clause\nFROM \n    information_schema.table_constraints tc\nJOIN \n    information_schema.check_constraints cc \n    ON tc.constraint_name = cc.constraint_name\nWHERE \n    tc.constraint_schema = '${inputSchema}'\nAND \n    tc.constraint_type = 'CHECK';`,\n\t);\n\n\tchecksCount += checkConstraints.length;\n\tif (progressCallback) {\n\t\tprogressCallback('checks', checksCount, 'fetching');\n\t}\n\tfor (const checkConstraintRow of checkConstraints) {\n\t\tconst constraintName = checkConstraintRow['CONSTRAINT_NAME'];\n\t\tconst constraintValue = checkConstraintRow['CHECK_CLAUSE'];\n\t\tconst tableName = checkConstraintRow['TABLE_NAME'];\n\n\t\tconst tableInResult = result[tableName];\n\t\t// if (typeof tableInResult === 'undefined') continue;\n\n\t\ttableInResult.checkConstraint[constraintName] = {\n\t\t\tname: constraintName,\n\t\t\tvalue: constraintValue,\n\t\t};\n\t}\n\n\tif (progressCallback) {\n\t\tprogressCallback('checks', checksCount, 'done');\n\t}\n\n\treturn {\n\t\tversion: '5',\n\t\tdialect: 'mysql',\n\t\ttables: result,\n\t\tviews: resultViews,\n\t\t_meta: {\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t\tinternal: internals,\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/serializer/pgImports.ts",
    "content": "import { is } from 'drizzle-orm';\nimport type { AnyPgTable, PgEnum, PgMaterializedView, PgSequence, PgView } from 'drizzle-orm/pg-core';\nimport {\n\tisPgEnum,\n\tisPgMaterializedView,\n\tisPgSequence,\n\tisPgView,\n\tPgPolicy,\n\tPgRole,\n\tPgSchema,\n\tPgTable,\n} from 'drizzle-orm/pg-core';\nimport { Relations } from 'drizzle-orm/relations';\nimport { safeRegister } from '../cli/commands/utils';\n\nexport const prepareFromExports = (exports: Record<string, unknown>) => {\n\tconst tables: AnyPgTable[] = [];\n\tconst enums: PgEnum<any>[] = [];\n\tconst schemas: PgSchema[] = [];\n\tconst sequences: PgSequence[] = [];\n\tconst roles: PgRole[] = [];\n\tconst policies: PgPolicy[] = [];\n\tconst views: PgView[] = [];\n\tconst matViews: PgMaterializedView[] = [];\n\tconst relations: Relations[] = [];\n\n\tconst i0values = Object.values(exports);\n\ti0values.forEach((t) => {\n\t\tif (isPgEnum(t)) {\n\t\t\tenums.push(t);\n\t\t\treturn;\n\t\t}\n\t\tif (is(t, PgTable)) {\n\t\t\ttables.push(t);\n\t\t}\n\n\t\tif (is(t, PgSchema)) {\n\t\t\tschemas.push(t);\n\t\t}\n\n\t\tif (isPgView(t)) {\n\t\t\tviews.push(t);\n\t\t}\n\n\t\tif (isPgMaterializedView(t)) {\n\t\t\tmatViews.push(t);\n\t\t}\n\n\t\tif (isPgSequence(t)) {\n\t\t\tsequences.push(t);\n\t\t}\n\n\t\tif (is(t, PgRole)) {\n\t\t\troles.push(t);\n\t\t}\n\n\t\tif (is(t, PgPolicy)) {\n\t\t\tpolicies.push(t);\n\t\t}\n\n\t\tif (is(t, Relations)) {\n\t\t\trelations.push(t);\n\t\t}\n\t});\n\n\treturn { tables, enums, schemas, sequences, views, matViews, roles, policies, relations };\n};\n\nexport const prepareFromPgImports = async (imports: string[]) => {\n\tconst tables: AnyPgTable[] = [];\n\tconst enums: PgEnum<any>[] = [];\n\tconst schemas: PgSchema[] = [];\n\tconst sequences: PgSequence[] = [];\n\tconst views: PgView[] = [];\n\tconst roles: PgRole[] = [];\n\tconst policies: PgPolicy[] = [];\n\tconst matViews: PgMaterializedView[] = [];\n\tconst relations: Relations[] = [];\n\n\tawait safeRegister(async () => {\n\t\tfor (let i = 0; i < imports.length; i++) {\n\t\t\tconst it = imports[i];\n\n\t\t\tconst i0: Record<string, unknown> = require(`${it}`);\n\t\t\tconst prepared = prepareFromExports(i0);\n\n\t\t\ttables.push(...prepared.tables);\n\t\t\tenums.push(...prepared.enums);\n\t\t\tschemas.push(...prepared.schemas);\n\t\t\tsequences.push(...prepared.sequences);\n\t\t\tviews.push(...prepared.views);\n\t\t\tmatViews.push(...prepared.matViews);\n\t\t\troles.push(...prepared.roles);\n\t\t\tpolicies.push(...prepared.policies);\n\t\t\trelations.push(...prepared.relations);\n\t\t}\n\t});\n\n\treturn {\n\t\ttables: Array.from(new Set(tables)),\n\t\tenums,\n\t\tschemas,\n\t\tsequences,\n\t\tviews,\n\t\tmatViews,\n\t\troles,\n\t\tpolicies,\n\t\trelations,\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/serializer/pgSchema.ts",
    "content": "import { mapValues, originUUID, snapshotVersion } from '../global';\n\nimport { any, array, boolean, enum as enumType, literal, number, object, record, string, TypeOf, union } from 'zod';\n\nconst indexV2 = object({\n\tname: string(),\n\tcolumns: record(\n\t\tstring(),\n\t\tobject({\n\t\t\tname: string(),\n\t\t}),\n\t),\n\tisUnique: boolean(),\n}).strict();\n\nconst columnV2 = object({\n\tname: string(),\n\ttype: string(),\n\tprimaryKey: boolean(),\n\tnotNull: boolean(),\n\tdefault: any().optional(),\n\treferences: string().optional(),\n}).strict();\n\nconst tableV2 = object({\n\tname: string(),\n\tcolumns: record(string(), columnV2),\n\tindexes: record(string(), indexV2),\n}).strict();\n\nconst enumSchemaV1 = object({\n\tname: string(),\n\tvalues: record(string(), string()),\n}).strict();\n\nconst enumSchema = object({\n\tname: string(),\n\tschema: string(),\n\tvalues: string().array(),\n}).strict();\n\nexport const pgSchemaV2 = object({\n\tversion: literal('2'),\n\ttables: record(string(), tableV2),\n\tenums: record(string(), enumSchemaV1),\n}).strict();\n\n// ------- V1 --------\nconst references = object({\n\tforeignKeyName: string(),\n\ttable: string(),\n\tcolumn: string(),\n\tonDelete: string().optional(),\n\tonUpdate: string().optional(),\n}).strict();\n\nconst columnV1 = object({\n\tname: string(),\n\ttype: string(),\n\tprimaryKey: boolean(),\n\tnotNull: boolean(),\n\tdefault: any().optional(),\n\treferences: references.optional(),\n}).strict();\n\nconst tableV1 = object({\n\tname: string(),\n\tcolumns: record(string(), columnV1),\n\tindexes: record(string(), indexV2),\n}).strict();\n\nexport const pgSchemaV1 = object({\n\tversion: literal('1'),\n\ttables: record(string(), tableV1),\n\tenums: record(string(), enumSchemaV1),\n}).strict();\n\nconst indexColumn = object({\n\texpression: string(),\n\tisExpression: boolean(),\n\tasc: boolean(),\n\tnulls: string().optional(),\n\topclass: string().optional(),\n});\n\nexport type IndexColumnType = TypeOf<typeof indexColumn>;\n\nconst index = object({\n\tname: string(),\n\tcolumns: indexColumn.array(),\n\tisUnique: boolean(),\n\twith: record(string(), any()).optional(),\n\tmethod: string().default('btree'),\n\twhere: string().optional(),\n\tconcurrently: boolean().default(false),\n}).strict();\n\nconst indexV4 = object({\n\tname: string(),\n\tcolumns: string().array(),\n\tisUnique: boolean(),\n\twith: record(string(), string()).optional(),\n\tmethod: string().default('btree'),\n\twhere: string().optional(),\n\tconcurrently: boolean().default(false),\n}).strict();\n\nconst indexV5 = object({\n\tname: string(),\n\tcolumns: string().array(),\n\tisUnique: boolean(),\n\twith: record(string(), string()).optional(),\n\tmethod: string().default('btree'),\n\twhere: string().optional(),\n\tconcurrently: boolean().default(false),\n}).strict();\n\nconst indexV6 = object({\n\tname: string(),\n\tcolumns: string().array(),\n\tisUnique: boolean(),\n\twith: record(string(), string()).optional(),\n\tmethod: string().default('btree'),\n\twhere: string().optional(),\n\tconcurrently: boolean().default(false),\n}).strict();\n\nconst fk = object({\n\tname: string(),\n\ttableFrom: string(),\n\tcolumnsFrom: string().array(),\n\ttableTo: string(),\n\tschemaTo: string().optional(),\n\tcolumnsTo: string().array(),\n\tonUpdate: string().optional(),\n\tonDelete: string().optional(),\n}).strict();\n\nexport const sequenceSchema = object({\n\tname: string(),\n\tincrement: string().optional(),\n\tminValue: string().optional(),\n\tmaxValue: string().optional(),\n\tstartWith: string().optional(),\n\tcache: string().optional(),\n\tcycle: boolean().optional(),\n\tschema: string(),\n}).strict();\n\nexport const roleSchema = object({\n\tname: string(),\n\tcreateDb: boolean().optional(),\n\tcreateRole: boolean().optional(),\n\tinherit: boolean().optional(),\n}).strict();\n\nexport const sequenceSquashed = object({\n\tname: string(),\n\tschema: string(),\n\tvalues: string(),\n}).strict();\n\nconst columnV7 = object({\n\tname: string(),\n\ttype: string(),\n\ttypeSchema: string().optional(),\n\tprimaryKey: boolean(),\n\tnotNull: boolean(),\n\tdefault: any().optional(),\n\tisUnique: any().optional(),\n\tuniqueName: string().optional(),\n\tnullsNotDistinct: boolean().optional(),\n}).strict();\n\nconst column = object({\n\tname: string(),\n\ttype: string(),\n\ttypeSchema: string().optional(),\n\tprimaryKey: boolean(),\n\tnotNull: boolean(),\n\tdefault: any().optional(),\n\tisUnique: any().optional(),\n\tuniqueName: string().optional(),\n\tnullsNotDistinct: boolean().optional(),\n\tgenerated: object({\n\t\ttype: literal('stored'),\n\t\tas: string(),\n\t}).optional(),\n\tidentity: sequenceSchema\n\t\t.merge(object({ type: enumType(['always', 'byDefault']) }))\n\t\t.optional(),\n}).strict();\n\nconst checkConstraint = object({\n\tname: string(),\n\tvalue: string(),\n}).strict();\n\nconst columnSquashed = object({\n\tname: string(),\n\ttype: string(),\n\ttypeSchema: string().optional(),\n\tprimaryKey: boolean(),\n\tnotNull: boolean(),\n\tdefault: any().optional(),\n\tisUnique: any().optional(),\n\tuniqueName: string().optional(),\n\tnullsNotDistinct: boolean().optional(),\n\tgenerated: object({\n\t\ttype: literal('stored'),\n\t\tas: string(),\n\t}).optional(),\n\tidentity: string().optional(),\n}).strict();\n\nconst tableV3 = object({\n\tname: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), index),\n\tforeignKeys: record(string(), fk),\n}).strict();\n\nconst compositePK = object({\n\tname: string(),\n\tcolumns: string().array(),\n}).strict();\n\nconst uniqueConstraint = object({\n\tname: string(),\n\tcolumns: string().array(),\n\tnullsNotDistinct: boolean(),\n}).strict();\n\nexport const policy = object({\n\tname: string(),\n\tas: enumType(['PERMISSIVE', 'RESTRICTIVE']).optional(),\n\tfor: enumType(['ALL', 'SELECT', 'INSERT', 'UPDATE', 'DELETE']).optional(),\n\tto: string().array().optional(),\n\tusing: string().optional(),\n\twithCheck: string().optional(),\n\ton: string().optional(),\n\tschema: string().optional(),\n}).strict();\n\nexport const policySquashed = object({\n\tname: string(),\n\tvalues: string(),\n}).strict();\n\nconst viewWithOption = object({\n\tcheckOption: enumType(['local', 'cascaded']).optional(),\n\tsecurityBarrier: boolean().optional(),\n\tsecurityInvoker: boolean().optional(),\n}).strict();\n\nconst matViewWithOption = object({\n\tfillfactor: number().optional(),\n\ttoastTupleTarget: number().optional(),\n\tparallelWorkers: number().optional(),\n\tautovacuumEnabled: boolean().optional(),\n\tvacuumIndexCleanup: enumType(['auto', 'off', 'on']).optional(),\n\tvacuumTruncate: boolean().optional(),\n\tautovacuumVacuumThreshold: number().optional(),\n\tautovacuumVacuumScaleFactor: number().optional(),\n\tautovacuumVacuumCostDelay: number().optional(),\n\tautovacuumVacuumCostLimit: number().optional(),\n\tautovacuumFreezeMinAge: number().optional(),\n\tautovacuumFreezeMaxAge: number().optional(),\n\tautovacuumFreezeTableAge: number().optional(),\n\tautovacuumMultixactFreezeMinAge: number().optional(),\n\tautovacuumMultixactFreezeMaxAge: number().optional(),\n\tautovacuumMultixactFreezeTableAge: number().optional(),\n\tlogAutovacuumMinDuration: number().optional(),\n\tuserCatalogTable: boolean().optional(),\n}).strict();\n\nexport const mergedViewWithOption = viewWithOption.merge(matViewWithOption).strict();\n\nexport const view = object({\n\tname: string(),\n\tschema: string(),\n\tcolumns: record(string(), column),\n\tdefinition: string().optional(),\n\tmaterialized: boolean(),\n\twith: mergedViewWithOption.optional(),\n\tisExisting: boolean(),\n\twithNoData: boolean().optional(),\n\tusing: string().optional(),\n\ttablespace: string().optional(),\n}).strict();\n\nconst tableV4 = object({\n\tname: string(),\n\tschema: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), indexV4),\n\tforeignKeys: record(string(), fk),\n}).strict();\n\nconst tableV5 = object({\n\tname: string(),\n\tschema: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), indexV5),\n\tforeignKeys: record(string(), fk),\n\tcompositePrimaryKeys: record(string(), compositePK),\n\tuniqueConstraints: record(string(), uniqueConstraint).default({}),\n}).strict();\n\nconst tableV6 = object({\n\tname: string(),\n\tschema: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), indexV6),\n\tforeignKeys: record(string(), fk),\n\tcompositePrimaryKeys: record(string(), compositePK),\n\tuniqueConstraints: record(string(), uniqueConstraint).default({}),\n}).strict();\n\nconst tableV7 = object({\n\tname: string(),\n\tschema: string(),\n\tcolumns: record(string(), columnV7),\n\tindexes: record(string(), index),\n\tforeignKeys: record(string(), fk),\n\tcompositePrimaryKeys: record(string(), compositePK),\n\tuniqueConstraints: record(string(), uniqueConstraint).default({}),\n}).strict();\n\nconst table = object({\n\tname: string(),\n\tschema: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), index),\n\tforeignKeys: record(string(), fk),\n\tcompositePrimaryKeys: record(string(), compositePK),\n\tuniqueConstraints: record(string(), uniqueConstraint).default({}),\n\tpolicies: record(string(), policy).default({}),\n\tcheckConstraints: record(string(), checkConstraint).default({}),\n\tisRLSEnabled: boolean().default(false),\n}).strict();\n\nconst schemaHash = object({\n\tid: string(),\n\tprevId: string(),\n});\n\nexport const kitInternals = object({\n\ttables: record(\n\t\tstring(),\n\t\tobject({\n\t\t\tcolumns: record(\n\t\t\t\tstring(),\n\t\t\t\tobject({\n\t\t\t\t\tisArray: boolean().optional(),\n\t\t\t\t\tdimensions: number().optional(),\n\t\t\t\t\trawType: string().optional(),\n\t\t\t\t\tisDefaultAnExpression: boolean().optional(),\n\t\t\t\t}).optional(),\n\t\t\t),\n\t\t}).optional(),\n\t),\n}).optional();\n\nexport const pgSchemaInternalV3 = object({\n\tversion: literal('3'),\n\tdialect: literal('pg'),\n\ttables: record(string(), tableV3),\n\tenums: record(string(), enumSchemaV1),\n}).strict();\n\nexport const pgSchemaInternalV4 = object({\n\tversion: literal('4'),\n\tdialect: literal('pg'),\n\ttables: record(string(), tableV4),\n\tenums: record(string(), enumSchemaV1),\n\tschemas: record(string(), string()),\n}).strict();\n\n// \"table\" -> \"schema.table\" for schema proper support\nexport const pgSchemaInternalV5 = object({\n\tversion: literal('5'),\n\tdialect: literal('pg'),\n\ttables: record(string(), tableV5),\n\tenums: record(string(), enumSchemaV1),\n\tschemas: record(string(), string()),\n\t_meta: object({\n\t\tschemas: record(string(), string()),\n\t\ttables: record(string(), string()),\n\t\tcolumns: record(string(), string()),\n\t}),\n\tinternal: kitInternals,\n}).strict();\n\nexport const pgSchemaInternalV6 = object({\n\tversion: literal('6'),\n\tdialect: literal('postgresql'),\n\ttables: record(string(), tableV6),\n\tenums: record(string(), enumSchema),\n\tschemas: record(string(), string()),\n\t_meta: object({\n\t\tschemas: record(string(), string()),\n\t\ttables: record(string(), string()),\n\t\tcolumns: record(string(), string()),\n\t}),\n\tinternal: kitInternals,\n}).strict();\n\nexport const pgSchemaExternal = object({\n\tversion: literal('5'),\n\tdialect: literal('pg'),\n\ttables: array(table),\n\tenums: array(enumSchemaV1),\n\tschemas: array(object({ name: string() })),\n\t_meta: object({\n\t\tschemas: record(string(), string()),\n\t\ttables: record(string(), string()),\n\t\tcolumns: record(string(), string()),\n\t}),\n}).strict();\n\nexport const pgSchemaInternalV7 = object({\n\tversion: literal('7'),\n\tdialect: literal('postgresql'),\n\ttables: record(string(), tableV7),\n\tenums: record(string(), enumSchema),\n\tschemas: record(string(), string()),\n\tsequences: record(string(), sequenceSchema),\n\t_meta: object({\n\t\tschemas: record(string(), string()),\n\t\ttables: record(string(), string()),\n\t\tcolumns: record(string(), string()),\n\t}),\n\tinternal: kitInternals,\n}).strict();\n\nexport const pgSchemaInternal = object({\n\tversion: literal('7'),\n\tdialect: literal('postgresql'),\n\ttables: record(string(), table),\n\tenums: record(string(), enumSchema),\n\tschemas: record(string(), string()),\n\tviews: record(string(), view).default({}),\n\tsequences: record(string(), sequenceSchema).default({}),\n\troles: record(string(), roleSchema).default({}),\n\tpolicies: record(string(), policy).default({}),\n\t_meta: object({\n\t\tschemas: record(string(), string()),\n\t\ttables: record(string(), string()),\n\t\tcolumns: record(string(), string()),\n\t}),\n\tinternal: kitInternals,\n}).strict();\n\nconst tableSquashed = object({\n\tname: string(),\n\tschema: string(),\n\tcolumns: record(string(), columnSquashed),\n\tindexes: record(string(), string()),\n\tforeignKeys: record(string(), string()),\n\tcompositePrimaryKeys: record(string(), string()),\n\tuniqueConstraints: record(string(), string()),\n\tpolicies: record(string(), string()),\n\tcheckConstraints: record(string(), string()),\n\tisRLSEnabled: boolean().default(false),\n}).strict();\n\nconst tableSquashedV4 = object({\n\tname: string(),\n\tschema: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), string()),\n\tforeignKeys: record(string(), string()),\n}).strict();\n\nexport const pgSchemaSquashedV4 = object({\n\tversion: literal('4'),\n\tdialect: literal('pg'),\n\ttables: record(string(), tableSquashedV4),\n\tenums: record(string(), enumSchemaV1),\n\tschemas: record(string(), string()),\n}).strict();\n\nexport const pgSchemaSquashedV6 = object({\n\tversion: literal('6'),\n\tdialect: literal('postgresql'),\n\ttables: record(string(), tableSquashed),\n\tenums: record(string(), enumSchema),\n\tschemas: record(string(), string()),\n}).strict();\n\nexport const pgSchemaSquashed = object({\n\tversion: literal('7'),\n\tdialect: literal('postgresql'),\n\ttables: record(string(), tableSquashed),\n\tenums: record(string(), enumSchema),\n\tschemas: record(string(), string()),\n\tviews: record(string(), view),\n\tsequences: record(string(), sequenceSquashed),\n\troles: record(string(), roleSchema).default({}),\n\tpolicies: record(string(), policySquashed).default({}),\n}).strict();\n\nexport const pgSchemaV3 = pgSchemaInternalV3.merge(schemaHash);\nexport const pgSchemaV4 = pgSchemaInternalV4.merge(schemaHash);\nexport const pgSchemaV5 = pgSchemaInternalV5.merge(schemaHash);\nexport const pgSchemaV6 = pgSchemaInternalV6.merge(schemaHash);\nexport const pgSchemaV7 = pgSchemaInternalV7.merge(schemaHash);\nexport const pgSchema = pgSchemaInternal.merge(schemaHash);\n\nexport type Enum = TypeOf<typeof enumSchema>;\nexport type Sequence = TypeOf<typeof sequenceSchema>;\nexport type Role = TypeOf<typeof roleSchema>;\nexport type Column = TypeOf<typeof column>;\nexport type TableV3 = TypeOf<typeof tableV3>;\nexport type TableV4 = TypeOf<typeof tableV4>;\nexport type TableV5 = TypeOf<typeof tableV5>;\nexport type Table = TypeOf<typeof table>;\nexport type PgSchema = TypeOf<typeof pgSchema>;\nexport type PgSchemaInternal = TypeOf<typeof pgSchemaInternal>;\nexport type PgSchemaV6Internal = TypeOf<typeof pgSchemaInternalV6>;\nexport type PgSchemaExternal = TypeOf<typeof pgSchemaExternal>;\nexport type PgSchemaSquashed = TypeOf<typeof pgSchemaSquashed>;\nexport type PgSchemaSquashedV4 = TypeOf<typeof pgSchemaSquashedV4>;\nexport type PgSchemaSquashedV6 = TypeOf<typeof pgSchemaSquashedV6>;\nexport type Index = TypeOf<typeof index>;\nexport type ForeignKey = TypeOf<typeof fk>;\nexport type PrimaryKey = TypeOf<typeof compositePK>;\nexport type UniqueConstraint = TypeOf<typeof uniqueConstraint>;\nexport type Policy = TypeOf<typeof policy>;\nexport type View = TypeOf<typeof view>;\nexport type MatViewWithOption = TypeOf<typeof matViewWithOption>;\nexport type ViewWithOption = TypeOf<typeof viewWithOption>;\n\nexport type PgKitInternals = TypeOf<typeof kitInternals>;\nexport type CheckConstraint = TypeOf<typeof checkConstraint>;\n\nexport type PgSchemaV1 = TypeOf<typeof pgSchemaV1>;\nexport type PgSchemaV2 = TypeOf<typeof pgSchemaV2>;\nexport type PgSchemaV3 = TypeOf<typeof pgSchemaV3>;\nexport type PgSchemaV4 = TypeOf<typeof pgSchemaV4>;\nexport type PgSchemaV5 = TypeOf<typeof pgSchemaV5>;\nexport type PgSchemaV6 = TypeOf<typeof pgSchemaV6>;\n\nexport const backwardCompatiblePgSchema = union([\n\tpgSchemaV5,\n\tpgSchemaV6,\n\tpgSchema,\n]);\n\nexport const PgSquasher = {\n\tsquashIdx: (idx: Index) => {\n\t\tindex.parse(idx);\n\t\treturn `${idx.name};${\n\t\t\tidx.columns\n\t\t\t\t.map(\n\t\t\t\t\t(c) => `${c.expression}--${c.isExpression}--${c.asc}--${c.nulls}--${c.opclass ? c.opclass : ''}`,\n\t\t\t\t)\n\t\t\t\t.join(',,')\n\t\t};${idx.isUnique};${idx.concurrently};${idx.method};${idx.where};${JSON.stringify(idx.with)}`;\n\t},\n\tunsquashIdx: (input: string): Index => {\n\t\tconst [\n\t\t\tname,\n\t\t\tcolumnsString,\n\t\t\tisUnique,\n\t\t\tconcurrently,\n\t\t\tmethod,\n\t\t\twhere,\n\t\t\tidxWith,\n\t\t] = input.split(';');\n\n\t\tconst columnString = columnsString.split(',,');\n\t\tconst columns: IndexColumnType[] = [];\n\n\t\tfor (const column of columnString) {\n\t\t\tconst [expression, isExpression, asc, nulls, opclass] = column.split('--');\n\t\t\tcolumns.push({\n\t\t\t\tnulls: nulls as IndexColumnType['nulls'],\n\t\t\t\tisExpression: isExpression === 'true',\n\t\t\t\tasc: asc === 'true',\n\t\t\t\texpression: expression,\n\t\t\t\topclass: opclass === 'undefined' ? undefined : opclass,\n\t\t\t});\n\t\t}\n\n\t\tconst result: Index = index.parse({\n\t\t\tname,\n\t\t\tcolumns: columns,\n\t\t\tisUnique: isUnique === 'true',\n\t\t\tconcurrently: concurrently === 'true',\n\t\t\tmethod,\n\t\t\twhere: where === 'undefined' ? undefined : where,\n\t\t\twith: !idxWith || idxWith === 'undefined' ? undefined : JSON.parse(idxWith),\n\t\t});\n\t\treturn result;\n\t},\n\tsquashIdxPush: (idx: Index) => {\n\t\tindex.parse(idx);\n\t\treturn `${idx.name};${\n\t\t\tidx.columns\n\t\t\t\t.map((c) => `${c.isExpression ? '' : c.expression}--${c.asc}--${c.nulls}`)\n\t\t\t\t.join(',,')\n\t\t};${idx.isUnique};${idx.method};${JSON.stringify(idx.with)}`;\n\t},\n\tunsquashIdxPush: (input: string): Index => {\n\t\tconst [name, columnsString, isUnique, method, idxWith] = input.split(';');\n\n\t\tconst columnString = columnsString.split('--');\n\t\tconst columns: IndexColumnType[] = [];\n\n\t\tfor (const column of columnString) {\n\t\t\tconst [expression, asc, nulls, opclass] = column.split(',');\n\t\t\tcolumns.push({\n\t\t\t\tnulls: nulls as IndexColumnType['nulls'],\n\t\t\t\tisExpression: expression === '',\n\t\t\t\tasc: asc === 'true',\n\t\t\t\texpression: expression,\n\t\t\t});\n\t\t}\n\n\t\tconst result: Index = index.parse({\n\t\t\tname,\n\t\t\tcolumns: columns,\n\t\t\tisUnique: isUnique === 'true',\n\t\t\tconcurrently: false,\n\t\t\tmethod,\n\t\t\twith: idxWith === 'undefined' ? undefined : JSON.parse(idxWith),\n\t\t});\n\t\treturn result;\n\t},\n\tsquashFK: (fk: ForeignKey) => {\n\t\treturn `${fk.name};${fk.tableFrom};${fk.columnsFrom.join(',')};${fk.tableTo};${fk.columnsTo.join(',')};${\n\t\t\tfk.onUpdate ?? ''\n\t\t};${fk.onDelete ?? ''};${fk.schemaTo || 'public'}`;\n\t},\n\tsquashPolicy: (policy: Policy) => {\n\t\treturn `${policy.name}--${policy.as}--${policy.for}--${\n\t\t\tpolicy.to?.join(',')\n\t\t}--${policy.using}--${policy.withCheck}--${policy.on}`;\n\t},\n\tunsquashPolicy: (policy: string): Policy => {\n\t\tconst splitted = policy.split('--');\n\t\treturn {\n\t\t\tname: splitted[0],\n\t\t\tas: splitted[1] as Policy['as'],\n\t\t\tfor: splitted[2] as Policy['for'],\n\t\t\tto: splitted[3].split(','),\n\t\t\tusing: splitted[4] !== 'undefined' ? splitted[4] : undefined,\n\t\t\twithCheck: splitted[5] !== 'undefined' ? splitted[5] : undefined,\n\t\t\ton: splitted[6] !== 'undefined' ? splitted[6] : undefined,\n\t\t};\n\t},\n\tsquashPolicyPush: (policy: Policy) => {\n\t\treturn `${policy.name}--${policy.as}--${policy.for}--${policy.to?.join(',')}--${policy.on}`;\n\t},\n\tunsquashPolicyPush: (policy: string): Policy => {\n\t\tconst splitted = policy.split('--');\n\t\treturn {\n\t\t\tname: splitted[0],\n\t\t\tas: splitted[1] as Policy['as'],\n\t\t\tfor: splitted[2] as Policy['for'],\n\t\t\tto: splitted[3].split(','),\n\t\t\ton: splitted[4] !== 'undefined' ? splitted[4] : undefined,\n\t\t};\n\t},\n\tsquashPK: (pk: PrimaryKey) => {\n\t\treturn `${pk.columns.join(',')};${pk.name}`;\n\t},\n\tunsquashPK: (pk: string): PrimaryKey => {\n\t\tconst splitted = pk.split(';');\n\t\treturn { name: splitted[1], columns: splitted[0].split(',') };\n\t},\n\tsquashUnique: (unq: UniqueConstraint) => {\n\t\treturn `${unq.name};${unq.columns.join(',')};${unq.nullsNotDistinct}`;\n\t},\n\tunsquashUnique: (unq: string): UniqueConstraint => {\n\t\tconst [name, columns, nullsNotDistinct] = unq.split(';');\n\t\treturn {\n\t\t\tname,\n\t\t\tcolumns: columns.split(','),\n\t\t\tnullsNotDistinct: nullsNotDistinct === 'true',\n\t\t};\n\t},\n\tunsquashFK: (input: string): ForeignKey => {\n\t\tconst [\n\t\t\tname,\n\t\t\ttableFrom,\n\t\t\tcolumnsFromStr,\n\t\t\ttableTo,\n\t\t\tcolumnsToStr,\n\t\t\tonUpdate,\n\t\t\tonDelete,\n\t\t\tschemaTo,\n\t\t] = input.split(';');\n\n\t\tconst result: ForeignKey = fk.parse({\n\t\t\tname,\n\t\t\ttableFrom,\n\t\t\tcolumnsFrom: columnsFromStr.split(','),\n\t\t\tschemaTo: schemaTo,\n\t\t\ttableTo,\n\t\t\tcolumnsTo: columnsToStr.split(','),\n\t\t\tonUpdate,\n\t\t\tonDelete,\n\t\t});\n\t\treturn result;\n\t},\n\tsquashSequence: (seq: Omit<Sequence, 'name' | 'schema'>) => {\n\t\treturn `${seq.minValue};${seq.maxValue};${seq.increment};${seq.startWith};${seq.cache};${seq.cycle ?? ''}`;\n\t},\n\tunsquashSequence: (seq: string): Omit<Sequence, 'name' | 'schema'> => {\n\t\tconst splitted = seq.split(';');\n\t\treturn {\n\t\t\tminValue: splitted[0] !== 'undefined' ? splitted[0] : undefined,\n\t\t\tmaxValue: splitted[1] !== 'undefined' ? splitted[1] : undefined,\n\t\t\tincrement: splitted[2] !== 'undefined' ? splitted[2] : undefined,\n\t\t\tstartWith: splitted[3] !== 'undefined' ? splitted[3] : undefined,\n\t\t\tcache: splitted[4] !== 'undefined' ? splitted[4] : undefined,\n\t\t\tcycle: splitted[5] === 'true',\n\t\t};\n\t},\n\tsquashIdentity: (\n\t\tseq: Omit<Sequence, 'schema'> & { type: 'always' | 'byDefault' },\n\t) => {\n\t\treturn `${seq.name};${seq.type};${seq.minValue};${seq.maxValue};${seq.increment};${seq.startWith};${seq.cache};${\n\t\t\tseq.cycle ?? ''\n\t\t}`;\n\t},\n\tunsquashIdentity: (\n\t\tseq: string,\n\t): Omit<Sequence, 'schema'> & { type: 'always' | 'byDefault' } => {\n\t\tconst splitted = seq.split(';');\n\t\treturn {\n\t\t\tname: splitted[0],\n\t\t\ttype: splitted[1] as 'always' | 'byDefault',\n\t\t\tminValue: splitted[2] !== 'undefined' ? splitted[2] : undefined,\n\t\t\tmaxValue: splitted[3] !== 'undefined' ? splitted[3] : undefined,\n\t\t\tincrement: splitted[4] !== 'undefined' ? splitted[4] : undefined,\n\t\t\tstartWith: splitted[5] !== 'undefined' ? splitted[5] : undefined,\n\t\t\tcache: splitted[6] !== 'undefined' ? splitted[6] : undefined,\n\t\t\tcycle: splitted[7] === 'true',\n\t\t};\n\t},\n\tsquashCheck: (check: CheckConstraint) => {\n\t\treturn `${check.name};${check.value}`;\n\t},\n\tunsquashCheck: (input: string): CheckConstraint => {\n\t\tconst [\n\t\t\tname,\n\t\t\tvalue,\n\t\t] = input.split(';');\n\n\t\treturn { name, value };\n\t},\n};\n\nexport const squashPgScheme = (\n\tjson: PgSchema,\n\taction?: 'push' | undefined,\n): PgSchemaSquashed => {\n\tconst mappedTables = Object.fromEntries(\n\t\tObject.entries(json.tables).map((it) => {\n\t\t\tconst squashedIndexes = mapValues(it[1].indexes, (index) => {\n\t\t\t\treturn action === 'push'\n\t\t\t\t\t? PgSquasher.squashIdxPush(index)\n\t\t\t\t\t: PgSquasher.squashIdx(index);\n\t\t\t});\n\n\t\t\tconst squashedFKs = mapValues(it[1].foreignKeys, (fk) => {\n\t\t\t\treturn PgSquasher.squashFK(fk);\n\t\t\t});\n\n\t\t\tconst squashedPKs = mapValues(it[1].compositePrimaryKeys, (pk) => {\n\t\t\t\treturn PgSquasher.squashPK(pk);\n\t\t\t});\n\n\t\t\tconst mappedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(it[1].columns).map((it) => {\n\t\t\t\t\tconst mappedIdentity = it[1].identity\n\t\t\t\t\t\t? PgSquasher.squashIdentity(it[1].identity)\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\treturn [\n\t\t\t\t\t\tit[0],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...it[1],\n\t\t\t\t\t\t\tidentity: mappedIdentity,\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tconst squashedUniqueConstraints = mapValues(\n\t\t\t\tit[1].uniqueConstraints,\n\t\t\t\t(unq) => {\n\t\t\t\t\treturn PgSquasher.squashUnique(unq);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst squashedPolicies = mapValues(it[1].policies, (policy) => {\n\t\t\t\treturn action === 'push'\n\t\t\t\t\t? PgSquasher.squashPolicyPush(policy)\n\t\t\t\t\t: PgSquasher.squashPolicy(policy);\n\t\t\t});\n\t\t\tconst squashedChecksContraints = mapValues(\n\t\t\t\tit[1].checkConstraints,\n\t\t\t\t(check) => {\n\t\t\t\t\treturn PgSquasher.squashCheck(check);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\treturn [\n\t\t\t\tit[0],\n\t\t\t\t{\n\t\t\t\t\tname: it[1].name,\n\t\t\t\t\tschema: it[1].schema,\n\t\t\t\t\tcolumns: mappedColumns,\n\t\t\t\t\tindexes: squashedIndexes,\n\t\t\t\t\tforeignKeys: squashedFKs,\n\t\t\t\t\tcompositePrimaryKeys: squashedPKs,\n\t\t\t\t\tuniqueConstraints: squashedUniqueConstraints,\n\t\t\t\t\tpolicies: squashedPolicies,\n\t\t\t\t\tcheckConstraints: squashedChecksContraints,\n\t\t\t\t\tisRLSEnabled: it[1].isRLSEnabled ?? false,\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t);\n\n\tconst mappedSequences = Object.fromEntries(\n\t\tObject.entries(json.sequences).map((it) => {\n\t\t\treturn [\n\t\t\t\tit[0],\n\t\t\t\t{\n\t\t\t\t\tname: it[1].name,\n\t\t\t\t\tschema: it[1].schema,\n\t\t\t\t\tvalues: PgSquasher.squashSequence(it[1]),\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t);\n\n\tconst mappedPolicies = Object.fromEntries(\n\t\tObject.entries(json.policies).map((it) => {\n\t\t\treturn [\n\t\t\t\tit[0],\n\t\t\t\t{\n\t\t\t\t\tname: it[1].name,\n\t\t\t\t\tvalues: action === 'push'\n\t\t\t\t\t\t? PgSquasher.squashPolicyPush(it[1])\n\t\t\t\t\t\t: PgSquasher.squashPolicy(it[1]),\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t);\n\n\treturn {\n\t\tversion: '7',\n\t\tdialect: json.dialect,\n\t\ttables: mappedTables,\n\t\tenums: json.enums,\n\t\tschemas: json.schemas,\n\t\tviews: json.views,\n\t\tpolicies: mappedPolicies,\n\t\tsequences: mappedSequences,\n\t\troles: json.roles,\n\t};\n};\n\nexport const dryPg = pgSchema.parse({\n\tversion: snapshotVersion,\n\tdialect: 'postgresql',\n\tid: originUUID,\n\tprevId: '',\n\ttables: {},\n\tenums: {},\n\tschemas: {},\n\tpolicies: {},\n\troles: {},\n\tsequences: {},\n\t_meta: {\n\t\tschemas: {},\n\t\ttables: {},\n\t\tcolumns: {},\n\t},\n});\n"
  },
  {
    "path": "drizzle-kit/src/serializer/pgSerializer.ts",
    "content": "import chalk from 'chalk';\nimport { getTableName, is, SQL } from 'drizzle-orm';\nimport {\n\tAnyPgTable,\n\tgetMaterializedViewConfig,\n\tgetTableConfig,\n\tgetViewConfig,\n\tIndexedColumn,\n\tPgArray,\n\tPgColumn,\n\tPgDialect,\n\tPgEnum,\n\tPgEnumColumn,\n\tPgMaterializedView,\n\tPgPolicy,\n\tPgRole,\n\tPgSchema,\n\tPgSequence,\n\tPgView,\n\tuniqueKeyName,\n} from 'drizzle-orm/pg-core';\nimport { CasingType } from 'src/cli/validations/common';\nimport { vectorOps } from 'src/extensions/vector';\nimport { withStyle } from '../cli/validations/outputs';\nimport type { IntrospectStage, IntrospectStatus } from '../cli/views';\nimport type {\n\tCheckConstraint,\n\tColumn,\n\tEnum,\n\tForeignKey,\n\tIndex,\n\tIndexColumnType,\n\tPgKitInternals,\n\tPgSchemaInternal,\n\tPolicy,\n\tPrimaryKey,\n\tRole,\n\tSequence,\n\tTable,\n\tUniqueConstraint,\n\tView,\n} from '../serializer/pgSchema';\nimport { type DB, escapeSingleQuotes, isPgArrayType } from '../utils';\nimport { getColumnCasing, sqlToStr } from './utils';\n\nexport const indexName = (tableName: string, columns: string[]) => {\n\treturn `${tableName}_${columns.join('_')}_index`;\n};\n\nfunction stringFromIdentityProperty(field: string | number | undefined): string | undefined {\n\treturn typeof field === 'string' ? (field as string) : typeof field === 'undefined' ? undefined : String(field);\n}\n\nfunction maxRangeForIdentityBasedOn(columnType: string) {\n\treturn columnType === 'integer' ? '2147483647' : columnType === 'bigint' ? '9223372036854775807' : '32767';\n}\n\nfunction minRangeForIdentityBasedOn(columnType: string) {\n\treturn columnType === 'integer' ? '-2147483648' : columnType === 'bigint' ? '-9223372036854775808' : '-32768';\n}\n\nfunction stringFromDatabaseIdentityProperty(field: any): string | undefined {\n\treturn typeof field === 'string'\n\t\t? (field as string)\n\t\t: typeof field === 'undefined'\n\t\t? undefined\n\t\t: typeof field === 'bigint'\n\t\t? field.toString()\n\t\t: String(field);\n}\n\nexport function buildArrayString(array: any[], sqlType: string): string {\n\tsqlType = sqlType.split('[')[0];\n\tconst values = array\n\t\t.map((value) => {\n\t\t\tif (typeof value === 'number' || typeof value === 'bigint') {\n\t\t\t\treturn value.toString();\n\t\t\t} else if (typeof value === 'boolean') {\n\t\t\t\treturn value ? 'true' : 'false';\n\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\treturn buildArrayString(value, sqlType);\n\t\t\t} else if (value instanceof Date) {\n\t\t\t\tif (sqlType === 'date') {\n\t\t\t\t\treturn `\"${value.toISOString().split('T')[0]}\"`;\n\t\t\t\t} else if (sqlType === 'timestamp') {\n\t\t\t\t\treturn `\"${value.toISOString().replace('T', ' ').slice(0, 23)}\"`;\n\t\t\t\t} else {\n\t\t\t\t\treturn `\"${value.toISOString()}\"`;\n\t\t\t\t}\n\t\t\t} else if (typeof value === 'object') {\n\t\t\t\treturn `\"${JSON.stringify(value).replaceAll('\"', '\\\\\"')}\"`;\n\t\t\t}\n\n\t\t\treturn `\"${value}\"`;\n\t\t})\n\t\t.join(',');\n\n\treturn `{${values}}`;\n}\n\nexport const generatePgSnapshot = (\n\ttables: AnyPgTable[],\n\tenums: PgEnum<any>[],\n\tschemas: PgSchema[],\n\tsequences: PgSequence[],\n\troles: PgRole[],\n\tpolicies: PgPolicy[],\n\tviews: PgView[],\n\tmatViews: PgMaterializedView[],\n\tcasing: CasingType | undefined,\n\tschemaFilter?: string[],\n): PgSchemaInternal => {\n\tconst dialect = new PgDialect({ casing });\n\tconst result: Record<string, Table> = {};\n\tconst resultViews: Record<string, View> = {};\n\tconst sequencesToReturn: Record<string, Sequence> = {};\n\tconst rolesToReturn: Record<string, Role> = {};\n\t// this policies are a separate objects that were linked to a table outside of it\n\tconst policiesToReturn: Record<string, Policy> = {};\n\n\t// This object stores unique names for indexes and will be used to detect if you have the same names for indexes\n\t// within the same PostgreSQL schema\n\n\tconst indexesInSchema: Record<string, string[]> = {};\n\n\tfor (const table of tables) {\n\t\t// This object stores unique names for checks and will be used to detect if you have the same names for checks\n\t\t// within the same PostgreSQL table\n\t\tconst checksInTable: Record<string, string[]> = {};\n\n\t\tconst {\n\t\t\tname: tableName,\n\t\t\tcolumns,\n\t\t\tindexes,\n\t\t\tforeignKeys,\n\t\t\tchecks,\n\t\t\tschema,\n\t\t\tprimaryKeys,\n\t\t\tuniqueConstraints,\n\t\t\tpolicies,\n\t\t\tenableRLS,\n\t\t} = getTableConfig(table);\n\n\t\tif (schemaFilter && !schemaFilter.includes(schema ?? 'public')) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst columnsObject: Record<string, Column> = {};\n\t\tconst indexesObject: Record<string, Index> = {};\n\t\tconst checksObject: Record<string, CheckConstraint> = {};\n\t\tconst foreignKeysObject: Record<string, ForeignKey> = {};\n\t\tconst primaryKeysObject: Record<string, PrimaryKey> = {};\n\t\tconst uniqueConstraintObject: Record<string, UniqueConstraint> = {};\n\t\tconst policiesObject: Record<string, Policy> = {};\n\n\t\tcolumns.forEach((column) => {\n\t\t\tconst name = getColumnCasing(column, casing);\n\t\t\tconst notNull: boolean = column.notNull;\n\t\t\tconst primaryKey: boolean = column.primary;\n\t\t\tconst sqlTypeLowered = column.getSQLType().toLowerCase();\n\n\t\t\tconst getEnumSchema = (column: PgColumn) => {\n\t\t\t\twhile (is(column, PgArray)) {\n\t\t\t\t\tcolumn = column.baseColumn;\n\t\t\t\t}\n\t\t\t\treturn is(column, PgEnumColumn) ? column.enum.schema || 'public' : undefined;\n\t\t\t};\n\t\t\tconst typeSchema: string | undefined = getEnumSchema(column);\n\n\t\t\tconst generated = column.generated;\n\t\t\tconst identity = column.generatedIdentity;\n\n\t\t\tconst increment = stringFromIdentityProperty(identity?.sequenceOptions?.increment) ?? '1';\n\t\t\tconst minValue = stringFromIdentityProperty(identity?.sequenceOptions?.minValue)\n\t\t\t\t?? (parseFloat(increment) < 0 ? minRangeForIdentityBasedOn(column.columnType) : '1');\n\t\t\tconst maxValue = stringFromIdentityProperty(identity?.sequenceOptions?.maxValue)\n\t\t\t\t?? (parseFloat(increment) < 0 ? '-1' : maxRangeForIdentityBasedOn(column.getSQLType()));\n\t\t\tconst startWith = stringFromIdentityProperty(identity?.sequenceOptions?.startWith)\n\t\t\t\t?? (parseFloat(increment) < 0 ? maxValue : minValue);\n\t\t\tconst cache = stringFromIdentityProperty(identity?.sequenceOptions?.cache) ?? '1';\n\n\t\t\tconst columnToSet: Column = {\n\t\t\t\tname,\n\t\t\t\ttype: column.getSQLType(),\n\t\t\t\ttypeSchema: typeSchema,\n\t\t\t\tprimaryKey,\n\t\t\t\tnotNull,\n\t\t\t\tgenerated: generated\n\t\t\t\t\t? {\n\t\t\t\t\t\tas: is(generated.as, SQL)\n\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as as SQL).sql\n\t\t\t\t\t\t\t: typeof generated.as === 'function'\n\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as() as SQL).sql\n\t\t\t\t\t\t\t: (generated.as as any),\n\t\t\t\t\t\ttype: 'stored',\n\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t\tidentity: identity\n\t\t\t\t\t? {\n\t\t\t\t\t\ttype: identity.type,\n\t\t\t\t\t\tname: identity.sequenceName ?? `${tableName}_${name}_seq`,\n\t\t\t\t\t\tschema: schema ?? 'public',\n\t\t\t\t\t\tincrement,\n\t\t\t\t\t\tstartWith,\n\t\t\t\t\t\tminValue,\n\t\t\t\t\t\tmaxValue,\n\t\t\t\t\t\tcache,\n\t\t\t\t\t\tcycle: identity?.sequenceOptions?.cycle ?? false,\n\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t};\n\n\t\t\tif (column.isUnique) {\n\t\t\t\tconst existingUnique = uniqueConstraintObject[column.uniqueName!];\n\t\t\t\tif (typeof existingUnique !== 'undefined') {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(`We\\'ve found duplicated unique constraint names in ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} table. \n          The unique constraint ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tcolumn.uniqueName,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} on the ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} column is conflicting with a unique constraint name already defined for ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\texistingUnique.columns.join(','),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} columns\\n`)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tuniqueConstraintObject[column.uniqueName!] = {\n\t\t\t\t\tname: column.uniqueName!,\n\t\t\t\t\tnullsNotDistinct: column.uniqueType === 'not distinct',\n\t\t\t\t\tcolumns: [columnToSet.name],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (column.default !== undefined) {\n\t\t\t\tif (is(column.default, SQL)) {\n\t\t\t\t\tcolumnToSet.default = sqlToStr(column.default, casing);\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof column.default === 'string') {\n\t\t\t\t\t\tcolumnToSet.default = `'${escapeSingleQuotes(column.default)}'`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (sqlTypeLowered === 'jsonb' || sqlTypeLowered === 'json') {\n\t\t\t\t\t\t\tcolumnToSet.default = `'${JSON.stringify(column.default)}'::${sqlTypeLowered}`;\n\t\t\t\t\t\t} else if (column.default instanceof Date) {\n\t\t\t\t\t\t\tif (sqlTypeLowered === 'date') {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString().split('T')[0]}'`;\n\t\t\t\t\t\t\t} else if (sqlTypeLowered === 'timestamp') {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString().replace('T', ' ').slice(0, 23)}'`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString()}'`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (isPgArrayType(sqlTypeLowered) && Array.isArray(column.default)) {\n\t\t\t\t\t\t\tcolumnToSet.default = `'${buildArrayString(column.default, sqlTypeLowered)}'`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Should do for all types\n\t\t\t\t\t\t\t// columnToSet.default = `'${column.default}'::${sqlTypeLowered}`;\n\t\t\t\t\t\t\tcolumnToSet.default = column.default;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcolumnsObject[name] = columnToSet;\n\t\t});\n\n\t\tprimaryKeys.map((pk) => {\n\t\t\tconst originalColumnNames = pk.columns.map((c) => c.name);\n\t\t\tconst columnNames = pk.columns.map((c) => getColumnCasing(c, casing));\n\n\t\t\tlet name = pk.getName();\n\t\t\tif (casing !== undefined) {\n\t\t\t\tfor (let i = 0; i < originalColumnNames.length; i++) {\n\t\t\t\t\tname = name.replace(originalColumnNames[i], columnNames[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprimaryKeysObject[name] = {\n\t\t\t\tname,\n\t\t\t\tcolumns: columnNames,\n\t\t\t};\n\t\t});\n\n\t\tuniqueConstraints?.map((unq) => {\n\t\t\tconst columnNames = unq.columns.map((c) => getColumnCasing(c, casing));\n\n\t\t\tconst name = unq.name ?? uniqueKeyName(table, columnNames);\n\n\t\t\tconst existingUnique = uniqueConstraintObject[name];\n\t\t\tif (typeof existingUnique !== 'undefined') {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\n${\n\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t`We\\'ve found duplicated unique constraint names in ${chalk.underline.blue(tableName)} table. \n        The unique constraint ${chalk.underline.blue(name)} on the ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tcolumnNames.join(','),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} columns is confilcting with a unique constraint name already defined for ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(existingUnique.columns.join(','))\n\t\t\t\t\t\t\t} columns\\n`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tuniqueConstraintObject[name] = {\n\t\t\t\tname: unq.name!,\n\t\t\t\tnullsNotDistinct: unq.nullsNotDistinct,\n\t\t\t\tcolumns: columnNames,\n\t\t\t};\n\t\t});\n\n\t\tconst fks: ForeignKey[] = foreignKeys.map((fk) => {\n\t\t\tconst tableFrom = tableName;\n\t\t\tconst onDelete = fk.onDelete;\n\t\t\tconst onUpdate = fk.onUpdate;\n\t\t\tconst reference = fk.reference();\n\n\t\t\tconst tableTo = getTableName(reference.foreignTable);\n\t\t\t// TODO: resolve issue with schema undefined/public for db push(or squasher)\n\t\t\t// getTableConfig(reference.foreignTable).schema || \"public\";\n\t\t\tconst schemaTo = getTableConfig(reference.foreignTable).schema;\n\n\t\t\tconst originalColumnsFrom = reference.columns.map((it) => it.name);\n\t\t\tconst columnsFrom = reference.columns.map((it) => getColumnCasing(it, casing));\n\t\t\tconst originalColumnsTo = reference.foreignColumns.map((it) => it.name);\n\t\t\tconst columnsTo = reference.foreignColumns.map((it) => getColumnCasing(it, casing));\n\n\t\t\tlet name = fk.getName();\n\t\t\tif (casing !== undefined) {\n\t\t\t\tfor (let i = 0; i < originalColumnsFrom.length; i++) {\n\t\t\t\t\tname = name.replace(originalColumnsFrom[i], columnsFrom[i]);\n\t\t\t\t}\n\t\t\t\tfor (let i = 0; i < originalColumnsTo.length; i++) {\n\t\t\t\t\tname = name.replace(originalColumnsTo[i], columnsTo[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\ttableFrom,\n\t\t\t\ttableTo,\n\t\t\t\tschemaTo,\n\t\t\t\tcolumnsFrom,\n\t\t\t\tcolumnsTo,\n\t\t\t\tonDelete,\n\t\t\t\tonUpdate,\n\t\t\t} as ForeignKey;\n\t\t});\n\n\t\tfks.forEach((it) => {\n\t\t\tforeignKeysObject[it.name] = it;\n\t\t});\n\n\t\tindexes.forEach((value) => {\n\t\t\tconst columns = value.config.columns;\n\n\t\t\tlet indexColumnNames: string[] = [];\n\t\t\tcolumns.forEach((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\tif (typeof value.config.name === 'undefined') {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t\t`Please specify an index name in ${getTableName(value.config.table)} table that has \"${\n\t\t\t\t\t\t\t\t\t\tdialect.sqlToQuery(it).sql\n\t\t\t\t\t\t\t\t\t}\" expression. We can generate index names for indexes on columns only; for expressions in indexes, you need to specify the name yourself.`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tit = it as IndexedColumn;\n\t\t\t\tconst name = getColumnCasing(it as IndexedColumn, casing);\n\t\t\t\tif (\n\t\t\t\t\t!is(it, SQL)\n\t\t\t\t\t&& it.type! === 'PgVector'\n\t\t\t\t\t&& typeof it.indexConfig!.opClass === 'undefined'\n\t\t\t\t) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t`You are specifying an index on the ${\n\t\t\t\t\t\t\t\t\tchalk.blueBright(\n\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} column inside the ${\n\t\t\t\t\t\t\t\t\tchalk.blueBright(\n\t\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} table with the ${\n\t\t\t\t\t\t\t\t\tchalk.blueBright(\n\t\t\t\t\t\t\t\t\t\t'vector',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} type without specifying an operator class. Vector extension doesn't have a default operator class, so you need to specify one of the available options. Here is a list of available op classes for the vector extension: [${\n\t\t\t\t\t\t\t\t\tvectorOps\n\t\t\t\t\t\t\t\t\t\t.map((it) => `${chalk.underline(`${it}`)}`)\n\t\t\t\t\t\t\t\t\t\t.join(', ')\n\t\t\t\t\t\t\t\t}].\\n\\nYou can specify it using current syntax: ${\n\t\t\t\t\t\t\t\t\tchalk.underline(\n\t\t\t\t\t\t\t\t\t\t`index(\"${value.config.name}\").using(\"${value.config.method}\", table.${name}.op(\"${\n\t\t\t\t\t\t\t\t\t\t\tvectorOps[0]\n\t\t\t\t\t\t\t\t\t\t}\"))`,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\\n\\nYou can check the \"pg_vector\" docs for more info: https://github.com/pgvector/pgvector?tab=readme-ov-file#indexing\\n`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tindexColumnNames.push(name);\n\t\t\t});\n\n\t\t\tconst name = value.config.name ? value.config.name : indexName(tableName, indexColumnNames);\n\n\t\t\tlet indexColumns: IndexColumnType[] = columns.map(\n\t\t\t\t(it): IndexColumnType => {\n\t\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\texpression: dialect.sqlToQuery(it, 'indexes').sql,\n\t\t\t\t\t\t\tasc: true,\n\t\t\t\t\t\t\tisExpression: true,\n\t\t\t\t\t\t\tnulls: 'last',\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tit = it as IndexedColumn;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\texpression: getColumnCasing(it as IndexedColumn, casing),\n\t\t\t\t\t\t\tisExpression: false,\n\t\t\t\t\t\t\tasc: it.indexConfig?.order === 'asc',\n\t\t\t\t\t\t\tnulls: it.indexConfig?.nulls\n\t\t\t\t\t\t\t\t? it.indexConfig?.nulls\n\t\t\t\t\t\t\t\t: it.indexConfig?.order === 'desc'\n\t\t\t\t\t\t\t\t? 'first'\n\t\t\t\t\t\t\t\t: 'last',\n\t\t\t\t\t\t\topclass: it.indexConfig?.opClass,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\n\t\t\t// check for index names duplicates\n\t\t\tif (typeof indexesInSchema[schema ?? 'public'] !== 'undefined') {\n\t\t\t\tif (indexesInSchema[schema ?? 'public'].includes(name)) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t`We\\'ve found duplicated index name across ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(schema ?? 'public')\n\t\t\t\t\t\t\t\t} schema. Please rename your index in either the ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} table or the table with the duplicated index name`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tindexesInSchema[schema ?? 'public'].push(name);\n\t\t\t} else {\n\t\t\t\tindexesInSchema[schema ?? 'public'] = [name];\n\t\t\t}\n\n\t\t\tindexesObject[name] = {\n\t\t\t\tname,\n\t\t\t\tcolumns: indexColumns,\n\t\t\t\tisUnique: value.config.unique ?? false,\n\t\t\t\twhere: value.config.where ? dialect.sqlToQuery(value.config.where).sql : undefined,\n\t\t\t\tconcurrently: value.config.concurrently ?? false,\n\t\t\t\tmethod: value.config.method ?? 'btree',\n\t\t\t\twith: value.config.with ?? {},\n\t\t\t};\n\t\t});\n\n\t\tpolicies.forEach((policy) => {\n\t\t\tconst mappedTo = [];\n\n\t\t\tif (!policy.to) {\n\t\t\t\tmappedTo.push('public');\n\t\t\t} else {\n\t\t\t\tif (policy.to && typeof policy.to === 'string') {\n\t\t\t\t\tmappedTo.push(policy.to);\n\t\t\t\t} else if (policy.to && is(policy.to, PgRole)) {\n\t\t\t\t\tmappedTo.push(policy.to.name);\n\t\t\t\t} else if (policy.to && Array.isArray(policy.to)) {\n\t\t\t\t\tpolicy.to.forEach((it) => {\n\t\t\t\t\t\tif (typeof it === 'string') {\n\t\t\t\t\t\t\tmappedTo.push(it);\n\t\t\t\t\t\t} else if (is(it, PgRole)) {\n\t\t\t\t\t\t\tmappedTo.push(it.name);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (policiesObject[policy.name] !== undefined) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\n${\n\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t`We\\'ve found duplicated policy name across ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(tableKey)\n\t\t\t\t\t\t\t} table. Please rename one of the policies with ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tpolicy.name,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} name`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tpoliciesObject[policy.name] = {\n\t\t\t\tname: policy.name,\n\t\t\t\tas: policy.as?.toUpperCase() as Policy['as'] ?? 'PERMISSIVE',\n\t\t\t\tfor: policy.for?.toUpperCase() as Policy['for'] ?? 'ALL',\n\t\t\t\tto: mappedTo.sort(),\n\t\t\t\tusing: is(policy.using, SQL) ? dialect.sqlToQuery(policy.using).sql : undefined,\n\t\t\t\twithCheck: is(policy.withCheck, SQL) ? dialect.sqlToQuery(policy.withCheck).sql : undefined,\n\t\t\t};\n\t\t});\n\n\t\tchecks.forEach((check) => {\n\t\t\tconst checkName = check.name;\n\n\t\t\tif (typeof checksInTable[`\"${schema ?? 'public'}\".\"${tableName}\"`] !== 'undefined') {\n\t\t\t\tif (checksInTable[`\"${schema ?? 'public'}\".\"${tableName}\"`].includes(check.name)) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t`We\\'ve found duplicated check constraint name across ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\tschema ?? 'public',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} schema in ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}. Please rename your check constraint in either the ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} table or the table with the duplicated check contraint name`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tchecksInTable[`\"${schema ?? 'public'}\".\"${tableName}\"`].push(checkName);\n\t\t\t} else {\n\t\t\t\tchecksInTable[`\"${schema ?? 'public'}\".\"${tableName}\"`] = [check.name];\n\t\t\t}\n\n\t\t\tchecksObject[checkName] = {\n\t\t\t\tname: checkName,\n\t\t\t\tvalue: dialect.sqlToQuery(check.value).sql,\n\t\t\t};\n\t\t});\n\n\t\tconst tableKey = `${schema ?? 'public'}.${tableName}`;\n\n\t\tresult[tableKey] = {\n\t\t\tname: tableName,\n\t\t\tschema: schema ?? '',\n\t\t\tcolumns: columnsObject,\n\t\t\tindexes: indexesObject,\n\t\t\tforeignKeys: foreignKeysObject,\n\t\t\tcompositePrimaryKeys: primaryKeysObject,\n\t\t\tuniqueConstraints: uniqueConstraintObject,\n\t\t\tpolicies: policiesObject,\n\t\t\tcheckConstraints: checksObject,\n\t\t\tisRLSEnabled: enableRLS,\n\t\t};\n\t}\n\n\tfor (const policy of policies) {\n\t\t// @ts-ignore\n\t\tif (!policy._linkedTable) {\n\t\t\tconsole.log(\n\t\t\t\t`\\n${\n\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t`\"Policy ${policy.name} was skipped because it was not linked to any table. You should either include the policy in a table or use .link() on the policy to link it to any table you have. For more information, please check:`,\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// @ts-ignore\n\t\tconst tableConfig = getTableConfig(policy._linkedTable);\n\n\t\tconst tableKey = `${tableConfig.schema ?? 'public'}.${tableConfig.name}`;\n\n\t\tconst mappedTo = [];\n\n\t\tif (!policy.to) {\n\t\t\tmappedTo.push('public');\n\t\t} else {\n\t\t\tif (policy.to && typeof policy.to === 'string') {\n\t\t\t\tmappedTo.push(policy.to);\n\t\t\t} else if (policy.to && is(policy.to, PgRole)) {\n\t\t\t\tmappedTo.push(policy.to.name);\n\t\t\t} else if (policy.to && Array.isArray(policy.to)) {\n\t\t\t\tpolicy.to.forEach((it) => {\n\t\t\t\t\tif (typeof it === 'string') {\n\t\t\t\t\t\tmappedTo.push(it);\n\t\t\t\t\t} else if (is(it, PgRole)) {\n\t\t\t\t\t\tmappedTo.push(it.name);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// add separate policies object, that will be only responsible for policy creation\n\t\t// but we would need to track if a policy was enabled for a specific table or not\n\t\t// enable only if jsonStatements for enable rls was not already there + filter it\n\n\t\tif (result[tableKey]?.policies[policy.name] !== undefined || policiesToReturn[policy.name] !== undefined) {\n\t\t\tconsole.log(\n\t\t\t\t`\\n${\n\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t`We\\'ve found duplicated policy name across ${\n\t\t\t\t\t\t\tchalk.underline.blue(tableKey)\n\t\t\t\t\t\t} table. Please rename one of the policies with ${\n\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\tpolicy.name,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} name`,\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst mappedPolicy = {\n\t\t\tname: policy.name,\n\t\t\tas: policy.as?.toUpperCase() as Policy['as'] ?? 'PERMISSIVE',\n\t\t\tfor: policy.for?.toUpperCase() as Policy['for'] ?? 'ALL',\n\t\t\tto: mappedTo.sort(),\n\t\t\tusing: is(policy.using, SQL) ? dialect.sqlToQuery(policy.using).sql : undefined,\n\t\t\twithCheck: is(policy.withCheck, SQL) ? dialect.sqlToQuery(policy.withCheck).sql : undefined,\n\t\t};\n\n\t\tif (result[tableKey]) {\n\t\t\tresult[tableKey].policies[policy.name] = mappedPolicy;\n\t\t} else {\n\t\t\tpoliciesToReturn[policy.name] = {\n\t\t\t\t...mappedPolicy,\n\t\t\t\tschema: tableConfig.schema ?? 'public',\n\t\t\t\ton: `\"${tableConfig.schema ?? 'public'}\".\"${tableConfig.name}\"`,\n\t\t\t};\n\t\t}\n\t}\n\n\tfor (const sequence of sequences) {\n\t\tconst name = sequence.seqName!;\n\t\tif (typeof sequencesToReturn[`${sequence.schema ?? 'public'}.${name}`] === 'undefined') {\n\t\t\tconst increment = stringFromIdentityProperty(sequence?.seqOptions?.increment) ?? '1';\n\t\t\tconst minValue = stringFromIdentityProperty(sequence?.seqOptions?.minValue)\n\t\t\t\t?? (parseFloat(increment) < 0 ? '-9223372036854775808' : '1');\n\t\t\tconst maxValue = stringFromIdentityProperty(sequence?.seqOptions?.maxValue)\n\t\t\t\t?? (parseFloat(increment) < 0 ? '-1' : '9223372036854775807');\n\t\t\tconst startWith = stringFromIdentityProperty(sequence?.seqOptions?.startWith)\n\t\t\t\t?? (parseFloat(increment) < 0 ? maxValue : minValue);\n\t\t\tconst cache = stringFromIdentityProperty(sequence?.seqOptions?.cache) ?? '1';\n\n\t\t\tsequencesToReturn[`${sequence.schema ?? 'public'}.${name}`] = {\n\t\t\t\tname,\n\t\t\t\tschema: sequence.schema ?? 'public',\n\t\t\t\tincrement,\n\t\t\t\tstartWith,\n\t\t\t\tminValue,\n\t\t\t\tmaxValue,\n\t\t\t\tcache,\n\t\t\t\tcycle: sequence.seqOptions?.cycle ?? false,\n\t\t\t};\n\t\t} else {\n\t\t\t// duplicate seq error\n\t\t}\n\t}\n\n\tfor (const role of roles) {\n\t\tif (!(role as any)._existing) {\n\t\t\trolesToReturn[role.name] = {\n\t\t\t\tname: role.name,\n\t\t\t\tcreateDb: (role as any).createDb === undefined ? false : (role as any).createDb,\n\t\t\t\tcreateRole: (role as any).createRole === undefined ? false : (role as any).createRole,\n\t\t\t\tinherit: (role as any).inherit === undefined ? true : (role as any).inherit,\n\t\t\t};\n\t\t}\n\t}\n\tconst combinedViews = [...views, ...matViews];\n\tfor (const view of combinedViews) {\n\t\tlet viewName;\n\t\tlet schema;\n\t\tlet query;\n\t\tlet selectedFields;\n\t\tlet isExisting;\n\t\tlet withOption;\n\t\tlet tablespace;\n\t\tlet using;\n\t\tlet withNoData;\n\t\tlet materialized: boolean = false;\n\n\t\tif (is(view, PgView)) {\n\t\t\t({ name: viewName, schema, query, selectedFields, isExisting, with: withOption } = getViewConfig(view));\n\t\t} else {\n\t\t\t({ name: viewName, schema, query, selectedFields, isExisting, with: withOption, tablespace, using, withNoData } =\n\t\t\t\tgetMaterializedViewConfig(view));\n\n\t\t\tmaterialized = true;\n\t\t}\n\n\t\tconst viewSchema = schema ?? 'public';\n\n\t\tconst viewKey = `${viewSchema}.${viewName}`;\n\n\t\tconst columnsObject: Record<string, Column> = {};\n\t\tconst uniqueConstraintObject: Record<string, UniqueConstraint> = {};\n\n\t\tconst existingView = resultViews[viewKey];\n\t\tif (typeof existingView !== 'undefined') {\n\t\t\tconsole.log(\n\t\t\t\t`\\n${\n\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t`We\\'ve found duplicated view name across ${\n\t\t\t\t\t\t\tchalk.underline.blue(schema ?? 'public')\n\t\t\t\t\t\t} schema. Please rename your view`,\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tfor (const key in selectedFields) {\n\t\t\tif (is(selectedFields[key], PgColumn)) {\n\t\t\t\tconst column = selectedFields[key];\n\n\t\t\t\tconst notNull: boolean = column.notNull;\n\t\t\t\tconst primaryKey: boolean = column.primary;\n\t\t\t\tconst sqlTypeLowered = column.getSQLType().toLowerCase();\n\n\t\t\t\tconst typeSchema = is(column, PgEnumColumn) ? column.enum.schema || 'public' : undefined;\n\t\t\t\tconst generated = column.generated;\n\t\t\t\tconst identity = column.generatedIdentity;\n\n\t\t\t\tconst increment = stringFromIdentityProperty(identity?.sequenceOptions?.increment) ?? '1';\n\t\t\t\tconst minValue = stringFromIdentityProperty(identity?.sequenceOptions?.minValue)\n\t\t\t\t\t?? (parseFloat(increment) < 0 ? minRangeForIdentityBasedOn(column.columnType) : '1');\n\t\t\t\tconst maxValue = stringFromIdentityProperty(identity?.sequenceOptions?.maxValue)\n\t\t\t\t\t?? (parseFloat(increment) < 0 ? '-1' : maxRangeForIdentityBasedOn(column.getSQLType()));\n\t\t\t\tconst startWith = stringFromIdentityProperty(identity?.sequenceOptions?.startWith)\n\t\t\t\t\t?? (parseFloat(increment) < 0 ? maxValue : minValue);\n\t\t\t\tconst cache = stringFromIdentityProperty(identity?.sequenceOptions?.cache) ?? '1';\n\n\t\t\t\tconst columnToSet: Column = {\n\t\t\t\t\tname: column.name,\n\t\t\t\t\ttype: column.getSQLType(),\n\t\t\t\t\ttypeSchema: typeSchema,\n\t\t\t\t\tprimaryKey,\n\t\t\t\t\tnotNull,\n\t\t\t\t\tgenerated: generated\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\tas: is(generated.as, SQL)\n\t\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as as SQL).sql\n\t\t\t\t\t\t\t\t: typeof generated.as === 'function'\n\t\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as() as SQL).sql\n\t\t\t\t\t\t\t\t: (generated.as as any),\n\t\t\t\t\t\t\ttype: 'stored',\n\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tidentity: identity\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\ttype: identity.type,\n\t\t\t\t\t\t\tname: identity.sequenceName ?? `${viewName}_${column.name}_seq`,\n\t\t\t\t\t\t\tschema: schema ?? 'public',\n\t\t\t\t\t\t\tincrement,\n\t\t\t\t\t\t\tstartWith,\n\t\t\t\t\t\t\tminValue,\n\t\t\t\t\t\t\tmaxValue,\n\t\t\t\t\t\t\tcache,\n\t\t\t\t\t\t\tcycle: identity?.sequenceOptions?.cycle ?? false,\n\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\t};\n\n\t\t\t\tif (column.isUnique) {\n\t\t\t\t\tconst existingUnique = uniqueConstraintObject[column.uniqueName!];\n\t\t\t\t\tif (typeof existingUnique !== 'undefined') {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t\t`We\\'ve found duplicated unique constraint names in ${chalk.underline.blue(viewName)} table. \n          The unique constraint ${chalk.underline.blue(column.uniqueName)} on the ${\n\t\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\t\tcolumn.name,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t} column is confilcting with a unique constraint name already defined for ${\n\t\t\t\t\t\t\t\t\t\tchalk.underline.blue(existingUnique.columns.join(','))\n\t\t\t\t\t\t\t\t\t} columns\\n`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t\tuniqueConstraintObject[column.uniqueName!] = {\n\t\t\t\t\t\tname: column.uniqueName!,\n\t\t\t\t\t\tnullsNotDistinct: column.uniqueType === 'not distinct',\n\t\t\t\t\t\tcolumns: [columnToSet.name],\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (column.default !== undefined) {\n\t\t\t\t\tif (is(column.default, SQL)) {\n\t\t\t\t\t\tcolumnToSet.default = sqlToStr(column.default, casing);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (typeof column.default === 'string') {\n\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default}'`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (sqlTypeLowered === 'jsonb' || sqlTypeLowered === 'json') {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${JSON.stringify(column.default)}'::${sqlTypeLowered}`;\n\t\t\t\t\t\t\t} else if (column.default instanceof Date) {\n\t\t\t\t\t\t\t\tif (sqlTypeLowered === 'date') {\n\t\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString().split('T')[0]}'`;\n\t\t\t\t\t\t\t\t} else if (sqlTypeLowered === 'timestamp') {\n\t\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString().replace('T', ' ').slice(0, 23)}'`;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString()}'`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (isPgArrayType(sqlTypeLowered) && Array.isArray(column.default)) {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${buildArrayString(column.default, sqlTypeLowered)}'`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Should do for all types\n\t\t\t\t\t\t\t\t// columnToSet.default = `'${column.default}'::${sqlTypeLowered}`;\n\t\t\t\t\t\t\t\tcolumnToSet.default = column.default;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcolumnsObject[column.name] = columnToSet;\n\t\t\t}\n\t\t}\n\n\t\tresultViews[viewKey] = {\n\t\t\tcolumns: columnsObject,\n\t\t\tdefinition: isExisting ? undefined : dialect.sqlToQuery(query!).sql,\n\t\t\tname: viewName,\n\t\t\tschema: viewSchema,\n\t\t\tisExisting,\n\t\t\twith: withOption,\n\t\t\twithNoData,\n\t\t\tmaterialized,\n\t\t\ttablespace,\n\t\t\tusing,\n\t\t};\n\t}\n\n\tconst enumsToReturn: Record<string, Enum> = enums.reduce<{\n\t\t[key: string]: Enum;\n\t}>((map, obj) => {\n\t\tconst enumSchema = obj.schema || 'public';\n\t\tconst key = `${enumSchema}.${obj.enumName}`;\n\t\tmap[key] = {\n\t\t\tname: obj.enumName,\n\t\t\tschema: enumSchema,\n\t\t\tvalues: obj.enumValues,\n\t\t};\n\t\treturn map;\n\t}, {});\n\n\tconst schemasObject = Object.fromEntries(\n\t\tschemas\n\t\t\t.filter((it) => {\n\t\t\t\tif (schemaFilter) {\n\t\t\t\t\treturn schemaFilter.includes(it.schemaName) && it.schemaName !== 'public';\n\t\t\t\t} else {\n\t\t\t\t\treturn it.schemaName !== 'public';\n\t\t\t\t}\n\t\t\t})\n\t\t\t.map((it) => [it.schemaName, it.schemaName]),\n\t);\n\n\treturn {\n\t\tversion: '7',\n\t\tdialect: 'postgresql',\n\t\ttables: result,\n\t\tenums: enumsToReturn,\n\t\tschemas: schemasObject,\n\t\tsequences: sequencesToReturn,\n\t\troles: rolesToReturn,\n\t\tpolicies: policiesToReturn,\n\t\tviews: resultViews,\n\t\t_meta: {\n\t\t\tschemas: {},\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t};\n};\n\nconst trimChar = (str: string, char: string) => {\n\tlet start = 0;\n\tlet end = str.length;\n\n\twhile (start < end && str[start] === char) ++start;\n\twhile (end > start && str[end - 1] === char) --end;\n\n\t// this.toString() due to ava deep equal issue with String { \"value\" }\n\treturn start > 0 || end < str.length ? str.substring(start, end) : str.toString();\n};\n\nfunction prepareRoles(entities?: {\n\troles: boolean | {\n\t\tprovider?: string | undefined;\n\t\tinclude?: string[] | undefined;\n\t\texclude?: string[] | undefined;\n\t};\n}) {\n\tlet useRoles: boolean = false;\n\tconst includeRoles: string[] = [];\n\tconst excludeRoles: string[] = [];\n\n\tif (entities && entities.roles) {\n\t\tif (typeof entities.roles === 'object') {\n\t\t\tif (entities.roles.provider) {\n\t\t\t\tif (entities.roles.provider === 'supabase') {\n\t\t\t\t\texcludeRoles.push(...[\n\t\t\t\t\t\t'anon',\n\t\t\t\t\t\t'authenticator',\n\t\t\t\t\t\t'authenticated',\n\t\t\t\t\t\t'service_role',\n\t\t\t\t\t\t'supabase_auth_admin',\n\t\t\t\t\t\t'supabase_storage_admin',\n\t\t\t\t\t\t'dashboard_user',\n\t\t\t\t\t\t'supabase_admin',\n\t\t\t\t\t]);\n\t\t\t\t} else if (entities.roles.provider === 'neon') {\n\t\t\t\t\texcludeRoles.push(...['authenticated', 'anonymous']);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entities.roles.include) {\n\t\t\t\tincludeRoles.push(...entities.roles.include);\n\t\t\t}\n\t\t\tif (entities.roles.exclude) {\n\t\t\t\texcludeRoles.push(...entities.roles.exclude);\n\t\t\t}\n\t\t} else {\n\t\t\tuseRoles = entities.roles;\n\t\t}\n\t}\n\treturn { useRoles, includeRoles, excludeRoles };\n}\n\nexport const fromDatabase = async (\n\tdb: DB,\n\ttablesFilter: (table: string) => boolean = () => true,\n\tschemaFilters: string[],\n\tentities?: {\n\t\troles: boolean | {\n\t\t\tprovider?: string | undefined;\n\t\t\tinclude?: string[] | undefined;\n\t\t\texclude?: string[] | undefined;\n\t\t};\n\t},\n\tprogressCallback?: (\n\t\tstage: IntrospectStage,\n\t\tcount: number,\n\t\tstatus: IntrospectStatus,\n\t) => void,\n\ttsSchema?: PgSchemaInternal,\n): Promise<PgSchemaInternal> => {\n\tconst result: Record<string, Table> = {};\n\tconst views: Record<string, View> = {};\n\tconst policies: Record<string, Policy> = {};\n\tconst internals: PgKitInternals = { tables: {} };\n\n\tconst where = schemaFilters.map((t) => `n.nspname = '${t}'`).join(' or ');\n\n\tconst allTables = await db.query<{ table_schema: string; table_name: string; type: string; rls_enabled: boolean }>(\n\t\t`SELECT \n    n.nspname AS table_schema, \n    c.relname AS table_name, \n    CASE \n        WHEN c.relkind = 'r' THEN 'table'\n        WHEN c.relkind = 'v' THEN 'view'\n        WHEN c.relkind = 'm' THEN 'materialized_view'\n    END AS type,\n\tc.relrowsecurity AS rls_enabled\nFROM \n    pg_catalog.pg_class c\nJOIN \n    pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nWHERE \n\tc.relkind IN ('r', 'v', 'm') \n    ${where === '' ? '' : ` AND ${where}`};`,\n\t);\n\n\tconst schemas = new Set(allTables.map((it) => it.table_schema));\n\tschemas.delete('public');\n\n\tconst allSchemas = await db.query<{\n\t\ttable_schema: string;\n\t}>(`select s.nspname as table_schema\n  from pg_catalog.pg_namespace s\n  join pg_catalog.pg_user u on u.usesysid = s.nspowner\n  where nspname not in ('information_schema', 'pg_catalog', 'public')\n        and nspname not like 'pg_toast%'\n        and nspname not like 'pg_temp_%'\n  order by table_schema;`);\n\n\tallSchemas.forEach((item) => {\n\t\tif (schemaFilters.includes(item.table_schema)) {\n\t\t\tschemas.add(item.table_schema);\n\t\t}\n\t});\n\n\tlet columnsCount = 0;\n\tlet indexesCount = 0;\n\tlet foreignKeysCount = 0;\n\tlet tableCount = 0;\n\tlet checksCount = 0;\n\tlet viewsCount = 0;\n\n\tconst sequencesToReturn: Record<string, Sequence> = {};\n\n\tconst seqWhere = schemaFilters.map((t) => `schemaname = '${t}'`).join(' or ');\n\n\tconst allSequences = await db.query(\n\t\t`select schemaname, sequencename, start_value, min_value, max_value, increment_by, cycle, cache_size from pg_sequences as seq${\n\t\t\tseqWhere === '' ? '' : ` WHERE ${seqWhere}`\n\t\t};`,\n\t);\n\n\tfor (const dbSeq of allSequences) {\n\t\tconst schemaName = dbSeq.schemaname;\n\t\tconst sequenceName = dbSeq.sequencename;\n\t\tconst startValue = stringFromDatabaseIdentityProperty(dbSeq.start_value);\n\t\tconst minValue = stringFromDatabaseIdentityProperty(dbSeq.min_value);\n\t\tconst maxValue = stringFromDatabaseIdentityProperty(dbSeq.max_value);\n\t\tconst incrementBy = stringFromDatabaseIdentityProperty(dbSeq.increment_by);\n\t\tconst cycle = dbSeq.cycle;\n\t\tconst cacheSize = stringFromDatabaseIdentityProperty(dbSeq.cache_size);\n\t\tconst key = `${schemaName}.${sequenceName}`;\n\n\t\tsequencesToReturn[key] = {\n\t\t\tname: sequenceName,\n\t\t\tschema: schemaName,\n\t\t\tstartWith: startValue,\n\t\t\tminValue,\n\t\t\tmaxValue,\n\t\t\tincrement: incrementBy,\n\t\t\tcycle,\n\t\t\tcache: cacheSize,\n\t\t};\n\t}\n\n\tconst whereEnums = schemaFilters.map((t) => `n.nspname = '${t}'`).join(' or ');\n\n\tconst allEnums = await db.query(\n\t\t`select n.nspname as enum_schema,\n  t.typname as enum_name,\n  e.enumlabel as enum_value,\n  e.enumsortorder as sort_order\n  from pg_type t\n  join pg_enum e on t.oid = e.enumtypid\n  join pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n  ${whereEnums === '' ? '' : ` WHERE ${whereEnums}`}\n  order by enum_schema, enum_name, sort_order;`,\n\t);\n\n\tconst enumsToReturn: Record<string, Enum> = {};\n\n\tfor (const dbEnum of allEnums) {\n\t\tconst enumName = dbEnum.enum_name;\n\t\tconst enumValue = dbEnum.enum_value as string;\n\t\tconst enumSchema: string = dbEnum.enum_schema || 'public';\n\t\tconst key = `${enumSchema}.${enumName}`;\n\n\t\tif (enumsToReturn[key] !== undefined && enumsToReturn[key] !== null) {\n\t\t\tenumsToReturn[key].values.push(enumValue);\n\t\t} else {\n\t\t\tenumsToReturn[key] = {\n\t\t\t\tname: enumName,\n\t\t\t\tvalues: [enumValue],\n\t\t\t\tschema: enumSchema,\n\t\t\t};\n\t\t}\n\t}\n\tif (progressCallback) {\n\t\tprogressCallback('enums', Object.keys(enumsToReturn).length, 'done');\n\t}\n\n\tconst allRoles = await db.query<\n\t\t{ rolname: string; rolinherit: boolean; rolcreatedb: boolean; rolcreaterole: boolean }\n\t>(\n\t\t`SELECT rolname, rolinherit, rolcreatedb, rolcreaterole FROM pg_roles;`,\n\t);\n\n\tconst rolesToReturn: Record<string, Role> = {};\n\n\tconst preparedRoles = prepareRoles(entities);\n\n\tif (\n\t\tpreparedRoles.useRoles || !(preparedRoles.includeRoles.length === 0 && preparedRoles.excludeRoles.length === 0)\n\t) {\n\t\tfor (const dbRole of allRoles) {\n\t\t\tif (\n\t\t\t\tpreparedRoles.useRoles\n\t\t\t) {\n\t\t\t\trolesToReturn[dbRole.rolname] = {\n\t\t\t\t\tcreateDb: dbRole.rolcreatedb,\n\t\t\t\t\tcreateRole: dbRole.rolcreatedb,\n\t\t\t\t\tinherit: dbRole.rolinherit,\n\t\t\t\t\tname: dbRole.rolname,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tif (preparedRoles.includeRoles.length === 0 && preparedRoles.excludeRoles.length === 0) continue;\n\t\t\t\tif (\n\t\t\t\t\tpreparedRoles.includeRoles.includes(dbRole.rolname) && preparedRoles.excludeRoles.includes(dbRole.rolname)\n\t\t\t\t) continue;\n\t\t\t\tif (preparedRoles.excludeRoles.includes(dbRole.rolname)) continue;\n\t\t\t\tif (!preparedRoles.includeRoles.includes(dbRole.rolname)) continue;\n\n\t\t\t\trolesToReturn[dbRole.rolname] = {\n\t\t\t\t\tcreateDb: dbRole.rolcreatedb,\n\t\t\t\t\tcreateRole: dbRole.rolcreaterole,\n\t\t\t\t\tinherit: dbRole.rolinherit,\n\t\t\t\t\tname: dbRole.rolname,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\tconst schemasForLinkedPoliciesInSchema = Object.values(tsSchema?.policies ?? {}).map((it) => it.schema!);\n\n\tconst wherePolicies = [...schemaFilters, ...schemasForLinkedPoliciesInSchema]\n\t\t.map((t) => `schemaname = '${t}'`)\n\t\t.join(' or ');\n\n\tconst policiesByTable: Record<string, Record<string, Policy>> = {};\n\n\tconst allPolicies = await db.query<\n\t\t{\n\t\t\tschemaname: string;\n\t\t\ttablename: string;\n\t\t\tname: string;\n\t\t\tas: string;\n\t\t\tto: string;\n\t\t\tfor: string;\n\t\t\tusing: string;\n\t\t\twithCheck: string;\n\t\t}\n\t>(`SELECT schemaname, tablename, policyname as name, permissive as \"as\", roles as to, cmd as for, qual as using, with_check as \"withCheck\" FROM pg_policies${\n\t\twherePolicies === '' ? '' : ` WHERE ${wherePolicies}`\n\t};`);\n\n\tfor (const dbPolicy of allPolicies) {\n\t\tconst { tablename, schemaname, to, withCheck, using, ...rest } = dbPolicy;\n\t\tconst tableForPolicy = policiesByTable[`${schemaname}.${tablename}`];\n\n\t\tconst parsedTo = typeof to === 'string' ? to.slice(1, -1).split(',') : to;\n\n\t\tconst parsedWithCheck = withCheck === null ? undefined : withCheck;\n\t\tconst parsedUsing = using === null ? undefined : using;\n\n\t\tif (tableForPolicy) {\n\t\t\ttableForPolicy[dbPolicy.name] = { ...rest, to: parsedTo } as Policy;\n\t\t} else {\n\t\t\tpoliciesByTable[`${schemaname}.${tablename}`] = {\n\t\t\t\t[dbPolicy.name]: { ...rest, to: parsedTo, withCheck: parsedWithCheck, using: parsedUsing } as Policy,\n\t\t\t};\n\t\t}\n\n\t\tif (tsSchema?.policies[dbPolicy.name]) {\n\t\t\tpolicies[dbPolicy.name] = {\n\t\t\t\t...rest,\n\t\t\t\tto: parsedTo,\n\t\t\t\twithCheck: parsedWithCheck,\n\t\t\t\tusing: parsedUsing,\n\t\t\t\ton: tsSchema?.policies[dbPolicy.name].on,\n\t\t\t} as Policy;\n\t\t}\n\t}\n\n\tif (progressCallback) {\n\t\tprogressCallback(\n\t\t\t'policies',\n\t\t\tObject.values(policiesByTable).reduce((total, innerRecord) => {\n\t\t\t\treturn total + Object.keys(innerRecord).length;\n\t\t\t}, 0),\n\t\t\t'done',\n\t\t);\n\t}\n\n\tconst sequencesInColumns: string[] = [];\n\n\tconst all = allTables\n\t\t.filter((it) => it.type === 'table')\n\t\t.map((row) => {\n\t\t\treturn new Promise(async (res, rej) => {\n\t\t\t\tconst tableName = row.table_name as string;\n\t\t\t\tif (!tablesFilter(tableName)) return res('');\n\t\t\t\ttableCount += 1;\n\t\t\t\tconst tableSchema = row.table_schema;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst columnToReturn: Record<string, Column> = {};\n\t\t\t\t\tconst indexToReturn: Record<string, Index> = {};\n\t\t\t\t\tconst foreignKeysToReturn: Record<string, ForeignKey> = {};\n\t\t\t\t\tconst primaryKeys: Record<string, PrimaryKey> = {};\n\t\t\t\t\tconst uniqueConstrains: Record<string, UniqueConstraint> = {};\n\t\t\t\t\tconst checkConstraints: Record<string, CheckConstraint> = {};\n\n\t\t\t\t\tconst tableResponse = await getColumnsInfoQuery({ schema: tableSchema, table: tableName, db });\n\n\t\t\t\t\tconst tableConstraints = await db.query(\n\t\t\t\t\t\t`SELECT c.column_name, c.data_type, constraint_type, constraint_name, constraint_schema\n      FROM information_schema.table_constraints tc\n      JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name)\n      JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema\n        AND tc.table_name = c.table_name AND ccu.column_name = c.column_name\n      WHERE tc.table_name = '${tableName}' and constraint_schema = '${tableSchema}';`,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst tableChecks = await db.query(`SELECT \n\t\t\t\t\t\ttc.constraint_name,\n\t\t\t\t\t\ttc.constraint_type,\n\t\t\t\t\t\tpg_get_constraintdef(con.oid) AS constraint_definition\n\t\t\t\t\tFROM \n\t\t\t\t\t\tinformation_schema.table_constraints AS tc\n\t\t\t\t\t\tJOIN pg_constraint AS con \n\t\t\t\t\t\t\tON tc.constraint_name = con.conname\n\t\t\t\t\t\t\tAND con.conrelid = (\n\t\t\t\t\t\t\t\tSELECT oid \n\t\t\t\t\t\t\t\tFROM pg_class \n\t\t\t\t\t\t\t\tWHERE relname = tc.table_name \n\t\t\t\t\t\t\t\tAND relnamespace = (\n\t\t\t\t\t\t\t\t\tSELECT oid \n\t\t\t\t\t\t\t\t\tFROM pg_namespace \n\t\t\t\t\t\t\t\t\tWHERE nspname = tc.constraint_schema\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\tWHERE \n\t\t\t\t\t\ttc.table_name = '${tableName}'\n\t\t\t\t\t\tAND tc.constraint_schema = '${tableSchema}'\n\t\t\t\t\t\tAND tc.constraint_type = 'CHECK'\n\t\t\t\t\t\tAND con.contype = 'c';`);\n\n\t\t\t\t\tcolumnsCount += tableResponse.length;\n\t\t\t\t\tif (progressCallback) {\n\t\t\t\t\t\tprogressCallback('columns', columnsCount, 'fetching');\n\t\t\t\t\t}\n\n\t\t\t\t\tconst tableForeignKeys = await db.query(\n\t\t\t\t\t\t`SELECT\n            con.contype AS constraint_type,\n            nsp.nspname AS constraint_schema,\n            con.conname AS constraint_name,\n            rel.relname AS table_name,\n            att.attname AS column_name,\n            fnsp.nspname AS foreign_table_schema,\n            frel.relname AS foreign_table_name,\n            fatt.attname AS foreign_column_name,\n            CASE con.confupdtype\n              WHEN 'a' THEN 'NO ACTION'\n              WHEN 'r' THEN 'RESTRICT'\n              WHEN 'n' THEN 'SET NULL'\n              WHEN 'c' THEN 'CASCADE'\n              WHEN 'd' THEN 'SET DEFAULT'\n            END AS update_rule,\n            CASE con.confdeltype\n              WHEN 'a' THEN 'NO ACTION'\n              WHEN 'r' THEN 'RESTRICT'\n              WHEN 'n' THEN 'SET NULL'\n              WHEN 'c' THEN 'CASCADE'\n              WHEN 'd' THEN 'SET DEFAULT'\n            END AS delete_rule\n          FROM\n            pg_catalog.pg_constraint con\n            JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid\n            JOIN pg_catalog.pg_namespace nsp ON nsp.oid = con.connamespace\n            LEFT JOIN pg_catalog.pg_attribute att ON att.attnum = ANY (con.conkey)\n              AND att.attrelid = con.conrelid\n            LEFT JOIN pg_catalog.pg_class frel ON frel.oid = con.confrelid\n            LEFT JOIN pg_catalog.pg_namespace fnsp ON fnsp.oid = frel.relnamespace\n            LEFT JOIN pg_catalog.pg_attribute fatt ON fatt.attnum = ANY (con.confkey)\n              AND fatt.attrelid = con.confrelid\n          WHERE\n            nsp.nspname = '${tableSchema}'\n            AND rel.relname = '${tableName}'\n            AND con.contype IN ('f');`,\n\t\t\t\t\t);\n\n\t\t\t\t\tforeignKeysCount += tableForeignKeys.length;\n\t\t\t\t\tif (progressCallback) {\n\t\t\t\t\t\tprogressCallback('fks', foreignKeysCount, 'fetching');\n\t\t\t\t\t}\n\t\t\t\t\tfor (const fk of tableForeignKeys) {\n\t\t\t\t\t\t// const tableFrom = fk.table_name;\n\t\t\t\t\t\tconst columnFrom: string = fk.column_name;\n\t\t\t\t\t\tconst tableTo = fk.foreign_table_name;\n\t\t\t\t\t\tconst columnTo: string = fk.foreign_column_name;\n\t\t\t\t\t\tconst schemaTo: string = fk.foreign_table_schema;\n\t\t\t\t\t\tconst foreignKeyName = fk.constraint_name;\n\t\t\t\t\t\tconst onUpdate = fk.update_rule?.toLowerCase();\n\t\t\t\t\t\tconst onDelete = fk.delete_rule?.toLowerCase();\n\n\t\t\t\t\t\tif (typeof foreignKeysToReturn[foreignKeyName] !== 'undefined') {\n\t\t\t\t\t\t\tforeignKeysToReturn[foreignKeyName].columnsFrom.push(columnFrom);\n\t\t\t\t\t\t\tforeignKeysToReturn[foreignKeyName].columnsTo.push(columnTo);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tforeignKeysToReturn[foreignKeyName] = {\n\t\t\t\t\t\t\t\tname: foreignKeyName,\n\t\t\t\t\t\t\t\ttableFrom: tableName,\n\t\t\t\t\t\t\t\ttableTo,\n\t\t\t\t\t\t\t\tschemaTo,\n\t\t\t\t\t\t\t\tcolumnsFrom: [columnFrom],\n\t\t\t\t\t\t\t\tcolumnsTo: [columnTo],\n\t\t\t\t\t\t\t\tonDelete,\n\t\t\t\t\t\t\t\tonUpdate,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tforeignKeysToReturn[foreignKeyName].columnsFrom = [\n\t\t\t\t\t\t\t...new Set(foreignKeysToReturn[foreignKeyName].columnsFrom),\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\tforeignKeysToReturn[foreignKeyName].columnsTo = [...new Set(foreignKeysToReturn[foreignKeyName].columnsTo)];\n\t\t\t\t\t}\n\n\t\t\t\t\tconst uniqueConstrainsRows = tableConstraints.filter((mapRow) => mapRow.constraint_type === 'UNIQUE');\n\n\t\t\t\t\tfor (const unqs of uniqueConstrainsRows) {\n\t\t\t\t\t\t// const tableFrom = fk.table_name;\n\t\t\t\t\t\tconst columnName: string = unqs.column_name;\n\t\t\t\t\t\tconst constraintName: string = unqs.constraint_name;\n\n\t\t\t\t\t\tif (typeof uniqueConstrains[constraintName] !== 'undefined') {\n\t\t\t\t\t\t\tuniqueConstrains[constraintName].columns.push(columnName);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tuniqueConstrains[constraintName] = {\n\t\t\t\t\t\t\t\tcolumns: [columnName],\n\t\t\t\t\t\t\t\tnullsNotDistinct: false,\n\t\t\t\t\t\t\t\tname: constraintName,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tchecksCount += tableChecks.length;\n\t\t\t\t\tif (progressCallback) {\n\t\t\t\t\t\tprogressCallback('checks', checksCount, 'fetching');\n\t\t\t\t\t}\n\t\t\t\t\tfor (const checks of tableChecks) {\n\t\t\t\t\t\t// CHECK (((email)::text <> 'test@gmail.com'::text))\n\t\t\t\t\t\t// Where (email) is column in table\n\t\t\t\t\t\tlet checkValue: string = checks.constraint_definition;\n\t\t\t\t\t\tconst constraintName: string = checks.constraint_name;\n\n\t\t\t\t\t\tcheckValue = checkValue.replace(/^CHECK\\s*\\(\\(/, '').replace(/\\)\\)\\s*$/, '');\n\n\t\t\t\t\t\tcheckConstraints[constraintName] = {\n\t\t\t\t\t\t\tname: constraintName,\n\t\t\t\t\t\t\tvalue: checkValue,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const columnResponse of tableResponse) {\n\t\t\t\t\t\tconst columnName = columnResponse.column_name;\n\t\t\t\t\t\tconst columnAdditionalDT = columnResponse.additional_dt;\n\t\t\t\t\t\tconst columnDimensions = columnResponse.array_dimensions;\n\t\t\t\t\t\tconst enumType: string = columnResponse.enum_name;\n\t\t\t\t\t\tlet columnType: string = columnResponse.data_type;\n\t\t\t\t\t\tconst typeSchema = columnResponse.type_schema;\n\t\t\t\t\t\tconst defaultValueRes: string = columnResponse.column_default;\n\n\t\t\t\t\t\tconst isGenerated = columnResponse.is_generated === 'ALWAYS';\n\t\t\t\t\t\tconst generationExpression = columnResponse.generation_expression;\n\t\t\t\t\t\tconst isIdentity = columnResponse.is_identity === 'YES';\n\t\t\t\t\t\tconst identityGeneration = columnResponse.identity_generation === 'ALWAYS' ? 'always' : 'byDefault';\n\t\t\t\t\t\tconst identityStart = columnResponse.identity_start;\n\t\t\t\t\t\tconst identityIncrement = columnResponse.identity_increment;\n\t\t\t\t\t\tconst identityMaximum = columnResponse.identity_maximum;\n\t\t\t\t\t\tconst identityMinimum = columnResponse.identity_minimum;\n\t\t\t\t\t\tconst identityCycle = columnResponse.identity_cycle === 'YES';\n\t\t\t\t\t\tconst identityName = columnResponse.seq_name;\n\n\t\t\t\t\t\tconst primaryKey = tableConstraints.filter((mapRow) =>\n\t\t\t\t\t\t\tcolumnName === mapRow.column_name && mapRow.constraint_type === 'PRIMARY KEY'\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst cprimaryKey = tableConstraints.filter((mapRow) => mapRow.constraint_type === 'PRIMARY KEY');\n\n\t\t\t\t\t\tif (cprimaryKey.length > 1) {\n\t\t\t\t\t\t\tconst tableCompositePkName = await db.query(\n\t\t\t\t\t\t\t\t`SELECT conname AS primary_key\n            FROM   pg_constraint join pg_class on (pg_class.oid = conrelid)\n            WHERE  contype = 'p' \n            AND    connamespace = $1::regnamespace  \n            AND    pg_class.relname = $2;`,\n\t\t\t\t\t\t\t\t[tableSchema, tableName],\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tprimaryKeys[tableCompositePkName[0].primary_key] = {\n\t\t\t\t\t\t\t\tname: tableCompositePkName[0].primary_key,\n\t\t\t\t\t\t\t\tcolumns: cprimaryKey.map((c: any) => c.column_name),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet columnTypeMapped = columnType;\n\n\t\t\t\t\t\t// Set default to internal object\n\t\t\t\t\t\tif (columnAdditionalDT === 'ARRAY') {\n\t\t\t\t\t\t\tif (typeof internals.tables[tableName] === 'undefined') {\n\t\t\t\t\t\t\t\tinternals.tables[tableName] = {\n\t\t\t\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\t\t\t\t[columnName]: {\n\t\t\t\t\t\t\t\t\t\t\tisArray: true,\n\t\t\t\t\t\t\t\t\t\t\tdimensions: columnDimensions,\n\t\t\t\t\t\t\t\t\t\t\trawType: columnTypeMapped.substring(0, columnTypeMapped.length - 2),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (typeof internals.tables[tableName]!.columns[columnName] === 'undefined') {\n\t\t\t\t\t\t\t\t\tinternals.tables[tableName]!.columns[columnName] = {\n\t\t\t\t\t\t\t\t\t\tisArray: true,\n\t\t\t\t\t\t\t\t\t\tdimensions: columnDimensions,\n\t\t\t\t\t\t\t\t\t\trawType: columnTypeMapped.substring(0, columnTypeMapped.length - 2),\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst defaultValue = defaultForColumn(columnResponse, internals, tableName);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdefaultValue === 'NULL'\n\t\t\t\t\t\t\t|| (defaultValueRes && defaultValueRes.startsWith('(') && defaultValueRes.endsWith(')'))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (typeof internals!.tables![tableName] === 'undefined') {\n\t\t\t\t\t\t\t\tinternals!.tables![tableName] = {\n\t\t\t\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\t\t\t\t[columnName]: {\n\t\t\t\t\t\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (typeof internals!.tables![tableName]!.columns[columnName] === 'undefined') {\n\t\t\t\t\t\t\t\t\tinternals!.tables![tableName]!.columns[columnName] = {\n\t\t\t\t\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tinternals!.tables![tableName]!.columns[columnName]!.isDefaultAnExpression = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isSerial = columnType === 'serial';\n\n\t\t\t\t\t\tif (columnTypeMapped.startsWith('numeric(')) {\n\t\t\t\t\t\t\tcolumnTypeMapped = columnTypeMapped.replace(',', ', ');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (columnAdditionalDT === 'ARRAY') {\n\t\t\t\t\t\t\tfor (let i = 1; i < Number(columnDimensions); i++) {\n\t\t\t\t\t\t\t\tcolumnTypeMapped += '[]';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcolumnTypeMapped = columnTypeMapped\n\t\t\t\t\t\t\t.replace('character varying', 'varchar')\n\t\t\t\t\t\t\t.replace(' without time zone', '')\n\t\t\t\t\t\t\t// .replace(\"timestamp without time zone\", \"timestamp\")\n\t\t\t\t\t\t\t.replace('character', 'char');\n\n\t\t\t\t\t\tcolumnTypeMapped = trimChar(columnTypeMapped, '\"');\n\n\t\t\t\t\t\tcolumnToReturn[columnName] = {\n\t\t\t\t\t\t\tname: columnName,\n\t\t\t\t\t\t\ttype:\n\t\t\t\t\t\t\t\t// filter vectors, but in future we should filter any extension that was installed by user\n\t\t\t\t\t\t\t\tcolumnAdditionalDT === 'USER-DEFINED'\n\t\t\t\t\t\t\t\t\t&& !['vector', 'geometry', 'halfvec', 'sparsevec', 'bit'].includes(enumType)\n\t\t\t\t\t\t\t\t\t? enumType\n\t\t\t\t\t\t\t\t\t: columnTypeMapped,\n\t\t\t\t\t\t\ttypeSchema: enumsToReturn[`${typeSchema}.${enumType}`] !== undefined\n\t\t\t\t\t\t\t\t? enumsToReturn[`${typeSchema}.${enumType}`].schema\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tprimaryKey: primaryKey.length === 1 && cprimaryKey.length < 2,\n\t\t\t\t\t\t\t// default: isSerial ? undefined : defaultValue,\n\t\t\t\t\t\t\tnotNull: columnResponse.is_nullable === 'NO',\n\t\t\t\t\t\t\tgenerated: isGenerated\n\t\t\t\t\t\t\t\t? { as: generationExpression, type: 'stored' }\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tidentity: isIdentity\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\ttype: identityGeneration,\n\t\t\t\t\t\t\t\t\tname: identityName,\n\t\t\t\t\t\t\t\t\tincrement: stringFromDatabaseIdentityProperty(identityIncrement),\n\t\t\t\t\t\t\t\t\tminValue: stringFromDatabaseIdentityProperty(identityMinimum),\n\t\t\t\t\t\t\t\t\tmaxValue: stringFromDatabaseIdentityProperty(identityMaximum),\n\t\t\t\t\t\t\t\t\tstartWith: stringFromDatabaseIdentityProperty(identityStart),\n\t\t\t\t\t\t\t\t\tcache: sequencesToReturn[identityName]?.cache\n\t\t\t\t\t\t\t\t\t\t? sequencesToReturn[identityName]?.cache\n\t\t\t\t\t\t\t\t\t\t: sequencesToReturn[`${tableSchema}.${identityName}`]?.cache\n\t\t\t\t\t\t\t\t\t\t? sequencesToReturn[`${tableSchema}.${identityName}`]?.cache\n\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\tcycle: identityCycle,\n\t\t\t\t\t\t\t\t\tschema: tableSchema,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (identityName && typeof identityName === 'string') {\n\t\t\t\t\t\t\t// remove \"\" from sequence name\n\t\t\t\t\t\t\tdelete sequencesToReturn[\n\t\t\t\t\t\t\t\t`${tableSchema}.${\n\t\t\t\t\t\t\t\t\tidentityName.startsWith('\"') && identityName.endsWith('\"') ? identityName.slice(1, -1) : identityName\n\t\t\t\t\t\t\t\t}`\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\tdelete sequencesToReturn[identityName];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!isSerial && typeof defaultValue !== 'undefined') {\n\t\t\t\t\t\t\tcolumnToReturn[columnName].default = defaultValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst dbIndexes = await db.query(\n\t\t\t\t\t\t`SELECT  DISTINCT ON (t.relname, ic.relname, k.i) t.relname as table_name, ic.relname AS indexname,\n        k.i AS index_order,\n        i.indisunique as is_unique,\n        am.amname as method,\n        ic.reloptions as with,\n        coalesce(a.attname, pg_get_indexdef(i.indexrelid, k.i, false)) AS column_name,\n          CASE\n        WHEN pg_get_expr(i.indexprs, i.indrelid) IS NOT NULL THEN 1\n        ELSE 0\n    END AS is_expression,\n        i.indoption[k.i-1] & 1 = 1 AS descending,\n        i.indoption[k.i-1] & 2 = 2 AS nulls_first,\n        pg_get_expr(\n                              i.indpred,\n                              i.indrelid\n                          ) as where,\n         opc.opcname\n      FROM pg_class t\n          LEFT JOIN pg_index i ON t.oid = i.indrelid\n          LEFT JOIN pg_class ic ON ic.oid = i.indexrelid\n\t\t  CROSS JOIN LATERAL (SELECT unnest(i.indkey), generate_subscripts(i.indkey, 1) + 1) AS k(attnum, i)\n          LEFT JOIN pg_attribute AS a\n            ON i.indrelid = a.attrelid AND k.attnum = a.attnum\n          JOIN pg_namespace c on c.oid = t.relnamespace\n        LEFT JOIN pg_am AS am ON ic.relam = am.oid\n        JOIN pg_opclass opc ON opc.oid = ANY(i.indclass)\n      WHERE\n      c.nspname = '${tableSchema}' AND\n      t.relname = '${tableName}';`,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst dbIndexFromConstraint = await db.query(\n\t\t\t\t\t\t`SELECT\n          idx.indexrelname AS index_name,\n          idx.relname AS table_name,\n          schemaname,\n          CASE WHEN con.conname IS NOT NULL THEN 1 ELSE 0 END AS generated_by_constraint\n        FROM\n          pg_stat_user_indexes idx\n        LEFT JOIN\n          pg_constraint con ON con.conindid = idx.indexrelid\n        WHERE idx.relname = '${tableName}' and schemaname = '${tableSchema}'\n        group by index_name, table_name,schemaname, generated_by_constraint;`,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst idxsInConsteraint = dbIndexFromConstraint.filter((it) => it.generated_by_constraint === 1).map((it) =>\n\t\t\t\t\t\tit.index_name\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const dbIndex of dbIndexes) {\n\t\t\t\t\t\tconst indexName: string = dbIndex.indexname;\n\t\t\t\t\t\tconst indexColumnName: string = dbIndex.column_name;\n\t\t\t\t\t\tconst indexIsUnique = dbIndex.is_unique;\n\t\t\t\t\t\tconst indexMethod = dbIndex.method;\n\t\t\t\t\t\tconst indexWith: string[] = dbIndex.with;\n\t\t\t\t\t\tconst indexWhere: string = dbIndex.where;\n\t\t\t\t\t\tconst opclass: string = dbIndex.opcname;\n\t\t\t\t\t\tconst isExpression = dbIndex.is_expression === 1;\n\n\t\t\t\t\t\tconst desc: boolean = dbIndex.descending;\n\t\t\t\t\t\tconst nullsFirst: boolean = dbIndex.nulls_first;\n\n\t\t\t\t\t\tconst mappedWith: Record<string, string> = {};\n\n\t\t\t\t\t\tif (indexWith !== null) {\n\t\t\t\t\t\t\tindexWith\n\t\t\t\t\t\t\t\t// .slice(1, indexWith.length - 1)\n\t\t\t\t\t\t\t\t// .split(\",\")\n\t\t\t\t\t\t\t\t.forEach((it) => {\n\t\t\t\t\t\t\t\t\tconst splitted = it.split('=');\n\t\t\t\t\t\t\t\t\tmappedWith[splitted[0]] = splitted[1];\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (idxsInConsteraint.includes(indexName)) continue;\n\n\t\t\t\t\t\tif (typeof indexToReturn[indexName] !== 'undefined') {\n\t\t\t\t\t\t\tindexToReturn[indexName].columns.push({\n\t\t\t\t\t\t\t\texpression: indexColumnName,\n\t\t\t\t\t\t\t\tasc: !desc,\n\t\t\t\t\t\t\t\tnulls: nullsFirst ? 'first' : 'last',\n\t\t\t\t\t\t\t\topclass,\n\t\t\t\t\t\t\t\tisExpression,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindexToReturn[indexName] = {\n\t\t\t\t\t\t\t\tname: indexName,\n\t\t\t\t\t\t\t\tcolumns: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\texpression: indexColumnName,\n\t\t\t\t\t\t\t\t\t\tasc: !desc,\n\t\t\t\t\t\t\t\t\t\tnulls: nullsFirst ? 'first' : 'last',\n\t\t\t\t\t\t\t\t\t\topclass,\n\t\t\t\t\t\t\t\t\t\tisExpression,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tisUnique: indexIsUnique,\n\t\t\t\t\t\t\t\t// should not be a part of diff detects\n\t\t\t\t\t\t\t\tconcurrently: false,\n\t\t\t\t\t\t\t\tmethod: indexMethod,\n\t\t\t\t\t\t\t\twhere: indexWhere === null ? undefined : indexWhere,\n\t\t\t\t\t\t\t\twith: mappedWith,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tindexesCount += Object.keys(indexToReturn).length;\n\t\t\t\t\tif (progressCallback) {\n\t\t\t\t\t\tprogressCallback('indexes', indexesCount, 'fetching');\n\t\t\t\t\t}\n\t\t\t\t\tresult[`${tableSchema}.${tableName}`] = {\n\t\t\t\t\t\tname: tableName,\n\t\t\t\t\t\tschema: tableSchema !== 'public' ? tableSchema : '',\n\t\t\t\t\t\tcolumns: columnToReturn,\n\t\t\t\t\t\tindexes: indexToReturn,\n\t\t\t\t\t\tforeignKeys: foreignKeysToReturn,\n\t\t\t\t\t\tcompositePrimaryKeys: primaryKeys,\n\t\t\t\t\t\tuniqueConstraints: uniqueConstrains,\n\t\t\t\t\t\tcheckConstraints: checkConstraints,\n\t\t\t\t\t\tpolicies: policiesByTable[`${tableSchema}.${tableName}`] ?? {},\n\t\t\t\t\t\tisRLSEnabled: row.rls_enabled,\n\t\t\t\t\t};\n\t\t\t\t} catch (e) {\n\t\t\t\t\trej(e);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tres('');\n\t\t\t});\n\t\t});\n\n\tif (progressCallback) {\n\t\tprogressCallback('tables', tableCount, 'done');\n\t}\n\n\tfor await (const _ of all) {\n\t}\n\n\tconst allViews = allTables\n\t\t.filter((it) => it.type === 'view' || it.type === 'materialized_view')\n\t\t.map((row) => {\n\t\t\treturn new Promise(async (res, rej) => {\n\t\t\t\tconst viewName = row.table_name as string;\n\t\t\t\tif (!tablesFilter(viewName)) return res('');\n\t\t\t\ttableCount += 1;\n\t\t\t\tconst viewSchema = row.table_schema;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst columnToReturn: Record<string, Column> = {};\n\n\t\t\t\t\tconst viewResponses = await getColumnsInfoQuery({ schema: viewSchema, table: viewName, db });\n\n\t\t\t\t\tfor (const viewResponse of viewResponses) {\n\t\t\t\t\t\tconst columnName = viewResponse.column_name;\n\t\t\t\t\t\tconst columnAdditionalDT = viewResponse.additional_dt;\n\t\t\t\t\t\tconst columnDimensions = viewResponse.array_dimensions;\n\t\t\t\t\t\tconst enumType: string = viewResponse.enum_name;\n\t\t\t\t\t\tlet columnType: string = viewResponse.data_type;\n\t\t\t\t\t\tconst typeSchema = viewResponse.type_schema;\n\t\t\t\t\t\t// const defaultValueRes: string = viewResponse.column_default;\n\n\t\t\t\t\t\tconst isGenerated = viewResponse.is_generated === 'ALWAYS';\n\t\t\t\t\t\tconst generationExpression = viewResponse.generation_expression;\n\t\t\t\t\t\tconst isIdentity = viewResponse.is_identity === 'YES';\n\t\t\t\t\t\tconst identityGeneration = viewResponse.identity_generation === 'ALWAYS' ? 'always' : 'byDefault';\n\t\t\t\t\t\tconst identityStart = viewResponse.identity_start;\n\t\t\t\t\t\tconst identityIncrement = viewResponse.identity_increment;\n\t\t\t\t\t\tconst identityMaximum = viewResponse.identity_maximum;\n\t\t\t\t\t\tconst identityMinimum = viewResponse.identity_minimum;\n\t\t\t\t\t\tconst identityCycle = viewResponse.identity_cycle === 'YES';\n\t\t\t\t\t\tconst identityName = viewResponse.seq_name;\n\t\t\t\t\t\tconst defaultValueRes = viewResponse.column_default;\n\n\t\t\t\t\t\tconst primaryKey = viewResponse.constraint_type === 'PRIMARY KEY';\n\n\t\t\t\t\t\tlet columnTypeMapped = columnType;\n\n\t\t\t\t\t\t// Set default to internal object\n\t\t\t\t\t\tif (columnAdditionalDT === 'ARRAY') {\n\t\t\t\t\t\t\tif (typeof internals.tables[viewName] === 'undefined') {\n\t\t\t\t\t\t\t\tinternals.tables[viewName] = {\n\t\t\t\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\t\t\t\t[columnName]: {\n\t\t\t\t\t\t\t\t\t\t\tisArray: true,\n\t\t\t\t\t\t\t\t\t\t\tdimensions: columnDimensions,\n\t\t\t\t\t\t\t\t\t\t\trawType: columnTypeMapped.substring(0, columnTypeMapped.length - 2),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (typeof internals.tables[viewName]!.columns[columnName] === 'undefined') {\n\t\t\t\t\t\t\t\t\tinternals.tables[viewName]!.columns[columnName] = {\n\t\t\t\t\t\t\t\t\t\tisArray: true,\n\t\t\t\t\t\t\t\t\t\tdimensions: columnDimensions,\n\t\t\t\t\t\t\t\t\t\trawType: columnTypeMapped.substring(0, columnTypeMapped.length - 2),\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst defaultValue = defaultForColumn(viewResponse, internals, viewName);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdefaultValue === 'NULL'\n\t\t\t\t\t\t\t|| (defaultValueRes && defaultValueRes.startsWith('(') && defaultValueRes.endsWith(')'))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (typeof internals!.tables![viewName] === 'undefined') {\n\t\t\t\t\t\t\t\tinternals!.tables![viewName] = {\n\t\t\t\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\t\t\t\t[columnName]: {\n\t\t\t\t\t\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (typeof internals!.tables![viewName]!.columns[columnName] === 'undefined') {\n\t\t\t\t\t\t\t\t\tinternals!.tables![viewName]!.columns[columnName] = {\n\t\t\t\t\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tinternals!.tables![viewName]!.columns[columnName]!.isDefaultAnExpression = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isSerial = columnType === 'serial';\n\n\t\t\t\t\t\tif (columnTypeMapped.startsWith('numeric(')) {\n\t\t\t\t\t\t\tcolumnTypeMapped = columnTypeMapped.replace(',', ', ');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (columnAdditionalDT === 'ARRAY') {\n\t\t\t\t\t\t\tfor (let i = 1; i < Number(columnDimensions); i++) {\n\t\t\t\t\t\t\t\tcolumnTypeMapped += '[]';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcolumnTypeMapped = columnTypeMapped\n\t\t\t\t\t\t\t.replace('character varying', 'varchar')\n\t\t\t\t\t\t\t.replace(' without time zone', '')\n\t\t\t\t\t\t\t// .replace(\"timestamp without time zone\", \"timestamp\")\n\t\t\t\t\t\t\t.replace('character', 'char');\n\n\t\t\t\t\t\tcolumnTypeMapped = trimChar(columnTypeMapped, '\"');\n\n\t\t\t\t\t\tcolumnToReturn[columnName] = {\n\t\t\t\t\t\t\tname: columnName,\n\t\t\t\t\t\t\ttype:\n\t\t\t\t\t\t\t\t// filter vectors, but in future we should filter any extension that was installed by user\n\t\t\t\t\t\t\t\tcolumnAdditionalDT === 'USER-DEFINED'\n\t\t\t\t\t\t\t\t\t&& !['vector', 'geometry', 'halfvec', 'sparsevec', 'bit'].includes(enumType)\n\t\t\t\t\t\t\t\t\t? enumType\n\t\t\t\t\t\t\t\t\t: columnTypeMapped,\n\t\t\t\t\t\t\ttypeSchema: enumsToReturn[`${typeSchema}.${enumType}`] !== undefined\n\t\t\t\t\t\t\t\t? enumsToReturn[`${typeSchema}.${enumType}`].schema\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tprimaryKey: primaryKey,\n\t\t\t\t\t\t\tnotNull: viewResponse.is_nullable === 'NO',\n\t\t\t\t\t\t\tgenerated: isGenerated ? { as: generationExpression, type: 'stored' } : undefined,\n\t\t\t\t\t\t\tidentity: isIdentity\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\ttype: identityGeneration,\n\t\t\t\t\t\t\t\t\tname: identityName,\n\t\t\t\t\t\t\t\t\tincrement: stringFromDatabaseIdentityProperty(identityIncrement),\n\t\t\t\t\t\t\t\t\tminValue: stringFromDatabaseIdentityProperty(identityMinimum),\n\t\t\t\t\t\t\t\t\tmaxValue: stringFromDatabaseIdentityProperty(identityMaximum),\n\t\t\t\t\t\t\t\t\tstartWith: stringFromDatabaseIdentityProperty(identityStart),\n\t\t\t\t\t\t\t\t\tcache: sequencesToReturn[identityName]?.cache\n\t\t\t\t\t\t\t\t\t\t? sequencesToReturn[identityName]?.cache\n\t\t\t\t\t\t\t\t\t\t: sequencesToReturn[`${viewSchema}.${identityName}`]?.cache\n\t\t\t\t\t\t\t\t\t\t? sequencesToReturn[`${viewSchema}.${identityName}`]?.cache\n\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\tcycle: identityCycle,\n\t\t\t\t\t\t\t\t\tschema: viewSchema,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (identityName) {\n\t\t\t\t\t\t\t// remove \"\" from sequence name\n\t\t\t\t\t\t\tdelete sequencesToReturn[\n\t\t\t\t\t\t\t\t`${viewSchema}.${\n\t\t\t\t\t\t\t\t\tidentityName.startsWith('\"') && identityName.endsWith('\"') ? identityName.slice(1, -1) : identityName\n\t\t\t\t\t\t\t\t}`\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\tdelete sequencesToReturn[identityName];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!isSerial && typeof defaultValue !== 'undefined') {\n\t\t\t\t\t\t\tcolumnToReturn[columnName].default = defaultValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst [viewInfo] = await db.query<{\n\t\t\t\t\t\tview_name: string;\n\t\t\t\t\t\tschema_name: string;\n\t\t\t\t\t\tdefinition: string;\n\t\t\t\t\t\ttablespace_name: string | null;\n\t\t\t\t\t\toptions: string[] | null;\n\t\t\t\t\t\tlocation: string | null;\n\t\t\t\t\t}>(`\n\t\t\t\t\tSELECT\n    c.relname AS view_name,\n    n.nspname AS schema_name,\n    pg_get_viewdef(c.oid, true) AS definition,\n    ts.spcname AS tablespace_name,\n    c.reloptions AS options,\n    pg_tablespace_location(ts.oid) AS location\nFROM\n    pg_class c\nJOIN\n    pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN\n    pg_tablespace ts ON c.reltablespace = ts.oid \nWHERE\n    (c.relkind = 'm' OR c.relkind = 'v')\n    AND n.nspname = '${viewSchema}'\n    AND c.relname = '${viewName}';`);\n\n\t\t\t\t\tconst resultWith: { [key: string]: string | boolean | number } = {};\n\t\t\t\t\tif (viewInfo.options) {\n\t\t\t\t\t\tviewInfo.options.forEach((pair) => {\n\t\t\t\t\t\t\tconst splitted = pair.split('=');\n\t\t\t\t\t\t\tconst key = splitted[0];\n\t\t\t\t\t\t\tconst value = splitted[1];\n\n\t\t\t\t\t\t\tif (value === 'true') {\n\t\t\t\t\t\t\t\tresultWith[key] = true;\n\t\t\t\t\t\t\t} else if (value === 'false') {\n\t\t\t\t\t\t\t\tresultWith[key] = false;\n\t\t\t\t\t\t\t} else if (!isNaN(Number(value))) {\n\t\t\t\t\t\t\t\tresultWith[key] = Number(value);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresultWith[key] = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst definition = viewInfo.definition.replace(/\\s+/g, ' ').replace(';', '').trim();\n\t\t\t\t\t// { \"check_option\":\"cascaded\",\"security_barrier\":true} -> // { \"checkOption\":\"cascaded\",\"securityBarrier\":true}\n\t\t\t\t\tconst withOption = Object.values(resultWith).length\n\t\t\t\t\t\t? Object.fromEntries(Object.entries(resultWith).map(([key, value]) => [key.camelCase(), value]))\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\tconst materialized = row.type === 'materialized_view';\n\n\t\t\t\t\tviews[`${viewSchema}.${viewName}`] = {\n\t\t\t\t\t\tname: viewName,\n\t\t\t\t\t\tschema: viewSchema,\n\t\t\t\t\t\tcolumns: columnToReturn,\n\t\t\t\t\t\tisExisting: false,\n\t\t\t\t\t\tdefinition: definition,\n\t\t\t\t\t\tmaterialized: materialized,\n\t\t\t\t\t\twith: withOption,\n\t\t\t\t\t\ttablespace: viewInfo.tablespace_name ?? undefined,\n\t\t\t\t\t};\n\t\t\t\t} catch (e) {\n\t\t\t\t\trej(e);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tres('');\n\t\t\t});\n\t\t});\n\n\tviewsCount = allViews.length;\n\n\tfor await (const _ of allViews) {\n\t}\n\n\tif (progressCallback) {\n\t\tprogressCallback('columns', columnsCount, 'done');\n\t\tprogressCallback('indexes', indexesCount, 'done');\n\t\tprogressCallback('fks', foreignKeysCount, 'done');\n\t\tprogressCallback('checks', checksCount, 'done');\n\t\tprogressCallback('views', viewsCount, 'done');\n\t}\n\n\tconst schemasObject = Object.fromEntries([...schemas].map((it) => [it, it]));\n\n\treturn {\n\t\tversion: '7',\n\t\tdialect: 'postgresql',\n\t\ttables: result,\n\t\tenums: enumsToReturn,\n\t\tschemas: schemasObject,\n\t\tsequences: sequencesToReturn,\n\t\troles: rolesToReturn,\n\t\tpolicies,\n\t\tviews: views,\n\t\t_meta: {\n\t\t\tschemas: {},\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t\tinternal: internals,\n\t};\n};\n\nconst defaultForColumn = (column: any, internals: PgKitInternals, tableName: string) => {\n\tconst columnName = column.column_name;\n\tconst isArray = internals?.tables[tableName]?.columns[columnName]?.isArray ?? false;\n\n\tif (\n\t\tcolumn.column_default === null\n\t\t|| column.column_default === undefined\n\t\t|| column.data_type === 'serial'\n\t\t|| column.data_type === 'smallserial'\n\t\t|| column.data_type === 'bigserial'\n\t) {\n\t\treturn undefined;\n\t}\n\n\tif (column.column_default.endsWith('[]')) {\n\t\tcolumn.column_default = column.column_default.slice(0, -2);\n\t}\n\n\t// if (\n\t// \t!['integer', 'smallint', 'bigint', 'double precision', 'real'].includes(column.data_type)\n\t// ) {\n\tcolumn.column_default = column.column_default.replace(/::(.*?)(?<![^\\w\"])(?=$)/, '');\n\t// }\n\n\tconst columnDefaultAsString: string = column.column_default.toString();\n\n\tif (isArray) {\n\t\treturn `'{${\n\t\t\tcolumnDefaultAsString\n\t\t\t\t.slice(2, -2)\n\t\t\t\t.split(/\\s*,\\s*/g)\n\t\t\t\t.map((value) => {\n\t\t\t\t\tif (['integer', 'smallint', 'bigint', 'double precision', 'real'].includes(column.data_type.slice(0, -2))) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t} else if (column.data_type.startsWith('timestamp')) {\n\t\t\t\t\t\treturn `${value}`;\n\t\t\t\t\t} else if (column.data_type.slice(0, -2) === 'interval') {\n\t\t\t\t\t\treturn value.replaceAll('\"', `\\\"`);\n\t\t\t\t\t} else if (column.data_type.slice(0, -2) === 'boolean') {\n\t\t\t\t\t\treturn value === 't' ? 'true' : 'false';\n\t\t\t\t\t} else if (['json', 'jsonb'].includes(column.data_type.slice(0, -2))) {\n\t\t\t\t\t\treturn JSON.stringify(JSON.stringify(JSON.parse(JSON.parse(value)), null, 0));\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn `\\\"${value}\\\"`;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.join(',')\n\t\t}}'`;\n\t}\n\n\tif (['integer', 'smallint', 'bigint', 'double precision', 'real'].includes(column.data_type)) {\n\t\tif (/^-?[\\d.]+(?:e-?\\d+)?$/.test(columnDefaultAsString)) {\n\t\t\treturn Number(columnDefaultAsString);\n\t\t} else {\n\t\t\tif (typeof internals!.tables![tableName] === 'undefined') {\n\t\t\t\tinternals!.tables![tableName] = {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t[columnName]: {\n\t\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tif (typeof internals!.tables![tableName]!.columns[columnName] === 'undefined') {\n\t\t\t\t\tinternals!.tables![tableName]!.columns[columnName] = {\n\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tinternals!.tables![tableName]!.columns[columnName]!.isDefaultAnExpression = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn columnDefaultAsString;\n\t\t}\n\t} else if (column.data_type.includes('numeric')) {\n\t\t// if numeric(1,1) and used '99' -> psql stores like '99'::numeric\n\t\treturn columnDefaultAsString.includes(\"'\") ? columnDefaultAsString : `'${columnDefaultAsString}'`;\n\t} else if (column.data_type === 'json' || column.data_type === 'jsonb') {\n\t\tconst jsonWithoutSpaces = JSON.stringify(JSON.parse(columnDefaultAsString.slice(1, -1)));\n\t\treturn `'${jsonWithoutSpaces}'::${column.data_type}`;\n\t} else if (column.data_type === 'boolean') {\n\t\treturn column.column_default === 'true';\n\t} else if (columnDefaultAsString === 'NULL') {\n\t\treturn `NULL`;\n\t} else if (columnDefaultAsString.startsWith(\"'\") && columnDefaultAsString.endsWith(\"'\")) {\n\t\treturn columnDefaultAsString;\n\t} else {\n\t\treturn `${columnDefaultAsString.replace(/\\\\/g, '`\\\\')}`;\n\t}\n};\n\nconst getColumnsInfoQuery = ({ schema, table, db }: { schema: string; table: string; db: DB }) => {\n\treturn db.query(\n\t\t`SELECT \n    a.attrelid::regclass::text AS table_name,  -- Table, view, or materialized view name\n    a.attname AS column_name,   -- Column name\n    CASE \n        WHEN NOT a.attisdropped THEN \n            CASE \n                WHEN a.attnotnull THEN 'NO'\n                ELSE 'YES'\n            END \n        ELSE NULL \n    END AS is_nullable,  -- NULL or NOT NULL constraint\n    a.attndims AS array_dimensions,  -- Array dimensions\n    CASE \n        WHEN a.atttypid = ANY ('{int,int8,int2}'::regtype[]) \n        AND EXISTS (\n            SELECT FROM pg_attrdef ad\n            WHERE ad.adrelid = a.attrelid \n            AND ad.adnum = a.attnum \n            AND pg_get_expr(ad.adbin, ad.adrelid) = 'nextval(''' \n                || pg_get_serial_sequence(a.attrelid::regclass::text, a.attname)::regclass || '''::regclass)'\n        )\n        THEN CASE a.atttypid\n            WHEN 'int'::regtype THEN 'serial'\n            WHEN 'int8'::regtype THEN 'bigserial'\n            WHEN 'int2'::regtype THEN 'smallserial'\n        END\n        ELSE format_type(a.atttypid, a.atttypmod)\n    END AS data_type,  -- Column data type\n--    ns.nspname AS type_schema,  -- Schema name\n    pg_get_serial_sequence('\"${schema}\".\"${table}\"', a.attname)::regclass AS seq_name,  -- Serial sequence (if any)\n    c.column_default,  -- Column default value\n    c.data_type AS additional_dt,  -- Data type from information_schema\n    c.udt_name AS enum_name,  -- Enum type (if applicable)\n    c.is_generated,  -- Is it a generated column?\n    c.generation_expression,  -- Generation expression (if generated)\n    c.is_identity,  -- Is it an identity column?\n    c.identity_generation,  -- Identity generation strategy (ALWAYS or BY DEFAULT)\n    c.identity_start,  -- Start value of identity column\n    c.identity_increment,  -- Increment for identity column\n    c.identity_maximum,  -- Maximum value for identity column\n    c.identity_minimum,  -- Minimum value for identity column\n    c.identity_cycle,  -- Does the identity column cycle?\n    enum_ns.nspname AS type_schema  -- Schema of the enum type\nFROM \n    pg_attribute a\nJOIN \n    pg_class cls ON cls.oid = a.attrelid  -- Join pg_class to get table/view/materialized view info\nJOIN \n    pg_namespace ns ON ns.oid = cls.relnamespace  -- Join namespace to get schema info\nLEFT JOIN \n    information_schema.columns c ON c.column_name = a.attname \n        AND c.table_schema = ns.nspname \n        AND c.table_name = cls.relname  -- Match schema and table/view name\nLEFT JOIN \n    pg_type enum_t ON enum_t.oid = a.atttypid  -- Join to get the type info\nLEFT JOIN \n    pg_namespace enum_ns ON enum_ns.oid = enum_t.typnamespace  -- Join to get the enum schema\nWHERE \n    a.attnum > 0  -- Valid column numbers only\n    AND NOT a.attisdropped  -- Skip dropped columns\n    AND cls.relkind IN ('r', 'v', 'm')  -- Include regular tables ('r'), views ('v'), and materialized views ('m')\n    AND ns.nspname = '${schema}'  -- Filter by schema\n    AND cls.relname = '${table}'  -- Filter by table name\nORDER BY \n    a.attnum;  -- Order by column number`,\n\t);\n};\n"
  },
  {
    "path": "drizzle-kit/src/serializer/singlestoreImports.ts",
    "content": "import { is } from 'drizzle-orm';\nimport type { AnySingleStoreTable } from 'drizzle-orm/singlestore-core';\nimport { SingleStoreTable } from 'drizzle-orm/singlestore-core';\nimport { safeRegister } from '../cli/commands/utils';\n\nexport const prepareFromExports = (exports: Record<string, unknown>) => {\n\tconst tables: AnySingleStoreTable[] = [];\n\t/* const views: SingleStoreView[] = []; */\n\n\tconst i0values = Object.values(exports);\n\ti0values.forEach((t) => {\n\t\tif (is(t, SingleStoreTable)) {\n\t\t\ttables.push(t);\n\t\t}\n\n\t\t/* if (is(t, SingleStoreView)) {\n\t\t\tviews.push(t);\n\t\t} */\n\t});\n\n\treturn { tables /* views  */ };\n};\n\nexport const prepareFromSingleStoreImports = async (imports: string[]) => {\n\tconst tables: AnySingleStoreTable[] = [];\n\t/* const views: SingleStoreView[] = []; */\n\n\tawait safeRegister(async () => {\n\t\tfor (let i = 0; i < imports.length; i++) {\n\t\t\tconst it = imports[i];\n\t\t\tconst i0: Record<string, unknown> = require(`${it}`);\n\t\t\tconst prepared = prepareFromExports(i0);\n\n\t\t\ttables.push(...prepared.tables);\n\t\t\t/* views.push(...prepared.views); */\n\t\t}\n\t});\n\n\treturn { tables: Array.from(new Set(tables)) /* , views */ };\n};\n"
  },
  {
    "path": "drizzle-kit/src/serializer/singlestoreSchema.ts",
    "content": "import { any, boolean, enum as enumType, literal, object, record, string, TypeOf, union } from 'zod';\nimport { mapValues, originUUID, snapshotVersion } from '../global';\n\n// ------- V3 --------\nconst index = object({\n\tname: string(),\n\tcolumns: string().array(),\n\tisUnique: boolean(),\n\tusing: enumType(['btree', 'hash']).optional(),\n\talgorithm: enumType(['default', 'inplace', 'copy']).optional(),\n\tlock: enumType(['default', 'none', 'shared', 'exclusive']).optional(),\n}).strict();\n\nconst column = object({\n\tname: string(),\n\ttype: string(),\n\tprimaryKey: boolean(),\n\tnotNull: boolean(),\n\tautoincrement: boolean().optional(),\n\tdefault: any().optional(),\n\tonUpdate: any().optional(),\n\tgenerated: object({\n\t\ttype: enumType(['stored', 'virtual']),\n\t\tas: string(),\n\t}).optional(),\n}).strict();\n\nconst compositePK = object({\n\tname: string(),\n\tcolumns: string().array(),\n}).strict();\n\nconst uniqueConstraint = object({\n\tname: string(),\n\tcolumns: string().array(),\n}).strict();\n\nconst table = object({\n\tname: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), index),\n\tcompositePrimaryKeys: record(string(), compositePK),\n\tuniqueConstraints: record(string(), uniqueConstraint).default({}),\n}).strict();\n\nconst viewMeta = object({\n\talgorithm: enumType(['undefined', 'merge', 'temptable']),\n\tsqlSecurity: enumType(['definer', 'invoker']),\n\twithCheckOption: enumType(['local', 'cascaded']).optional(),\n}).strict();\n\n/* export const view = object({\n\tname: string(),\n\tcolumns: record(string(), column),\n\tdefinition: string().optional(),\n\tisExisting: boolean(),\n}).strict().merge(viewMeta);\ntype SquasherViewMeta = Omit<TypeOf<typeof viewMeta>, 'definer'>; */\n\nexport const kitInternals = object({\n\ttables: record(\n\t\tstring(),\n\t\tobject({\n\t\t\tcolumns: record(\n\t\t\t\tstring(),\n\t\t\t\tobject({ isDefaultAnExpression: boolean().optional() }).optional(),\n\t\t\t),\n\t\t}).optional(),\n\t).optional(),\n\tindexes: record(\n\t\tstring(),\n\t\tobject({\n\t\t\tcolumns: record(\n\t\t\t\tstring(),\n\t\t\t\tobject({ isExpression: boolean().optional() }).optional(),\n\t\t\t),\n\t\t}).optional(),\n\t).optional(),\n}).optional();\n\n// use main dialect\nconst dialect = literal('singlestore');\n\nconst schemaHash = object({\n\tid: string(),\n\tprevId: string(),\n});\n\nexport const schemaInternal = object({\n\tversion: literal('1'),\n\tdialect: dialect,\n\ttables: record(string(), table),\n\t/* views: record(string(), view).default({}), */\n\t_meta: object({\n\t\ttables: record(string(), string()),\n\t\tcolumns: record(string(), string()),\n\t}),\n\tinternal: kitInternals,\n}).strict();\n\nexport const schema = schemaInternal.merge(schemaHash);\n\nconst tableSquashed = object({\n\tname: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), string()),\n\tcompositePrimaryKeys: record(string(), string()),\n\tuniqueConstraints: record(string(), string()).default({}),\n}).strict();\n\n/* const viewSquashed = view.omit({\n\talgorithm: true,\n\tsqlSecurity: true,\n\twithCheckOption: true,\n}).extend({ meta: string() }); */\n\nexport const schemaSquashed = object({\n\tversion: literal('1'),\n\tdialect: dialect,\n\ttables: record(string(), tableSquashed),\n\t/* views: record(string(), viewSquashed), */\n}).strict();\n\nexport type Dialect = TypeOf<typeof dialect>;\nexport type Column = TypeOf<typeof column>;\nexport type Table = TypeOf<typeof table>;\nexport type SingleStoreSchema = TypeOf<typeof schema>;\nexport type SingleStoreSchemaInternal = TypeOf<typeof schemaInternal>;\nexport type SingleStoreKitInternals = TypeOf<typeof kitInternals>;\nexport type SingleStoreSchemaSquashed = TypeOf<typeof schemaSquashed>;\nexport type Index = TypeOf<typeof index>;\nexport type PrimaryKey = TypeOf<typeof compositePK>;\nexport type UniqueConstraint = TypeOf<typeof uniqueConstraint>;\n/* export type View = TypeOf<typeof view>; */\n/* export type ViewSquashed = TypeOf<typeof viewSquashed>; */\n\nexport const SingleStoreSquasher = {\n\tsquashIdx: (idx: Index) => {\n\t\tindex.parse(idx);\n\t\treturn `${idx.name};${idx.columns.join(',')};${idx.isUnique};${idx.using ?? ''};${idx.algorithm ?? ''};${\n\t\t\tidx.lock ?? ''\n\t\t}`;\n\t},\n\tunsquashIdx: (input: string): Index => {\n\t\tconst [name, columnsString, isUnique, using, algorithm, lock] = input.split(';');\n\t\tconst destructed = {\n\t\t\tname,\n\t\t\tcolumns: columnsString.split(','),\n\t\t\tisUnique: isUnique === 'true',\n\t\t\tusing: using ? using : undefined,\n\t\t\talgorithm: algorithm ? algorithm : undefined,\n\t\t\tlock: lock ? lock : undefined,\n\t\t};\n\t\treturn index.parse(destructed);\n\t},\n\tsquashPK: (pk: PrimaryKey) => {\n\t\treturn `${pk.name};${pk.columns.join(',')}`;\n\t},\n\tunsquashPK: (pk: string): PrimaryKey => {\n\t\tconst splitted = pk.split(';');\n\t\treturn { name: splitted[0], columns: splitted[1].split(',') };\n\t},\n\tsquashUnique: (unq: UniqueConstraint) => {\n\t\treturn `${unq.name};${unq.columns.join(',')}`;\n\t},\n\tunsquashUnique: (unq: string): UniqueConstraint => {\n\t\tconst [name, columns] = unq.split(';');\n\t\treturn { name, columns: columns.split(',') };\n\t},\n\t/* squashView: (view: View): string => {\n\t\treturn `${view.algorithm};${view.sqlSecurity};${view.withCheckOption}`;\n\t},\n\tunsquashView: (meta: string): SquasherViewMeta => {\n\t\tconst [algorithm, sqlSecurity, withCheckOption] = meta.split(';');\n\t\tconst toReturn = {\n\t\t\talgorithm: algorithm,\n\t\t\tsqlSecurity: sqlSecurity,\n\t\t\twithCheckOption: withCheckOption !== 'undefined' ? withCheckOption : undefined,\n\t\t};\n\n\t\treturn viewMeta.parse(toReturn);\n\t}, */\n};\n\nexport const squashSingleStoreScheme = (json: SingleStoreSchema): SingleStoreSchemaSquashed => {\n\tconst mappedTables = Object.fromEntries(\n\t\tObject.entries(json.tables).map((it) => {\n\t\t\tconst squashedIndexes = mapValues(it[1].indexes, (index) => {\n\t\t\t\treturn SingleStoreSquasher.squashIdx(index);\n\t\t\t});\n\n\t\t\tconst squashedPKs = mapValues(it[1].compositePrimaryKeys, (pk) => {\n\t\t\t\treturn SingleStoreSquasher.squashPK(pk);\n\t\t\t});\n\n\t\t\tconst squashedUniqueConstraints = mapValues(\n\t\t\t\tit[1].uniqueConstraints,\n\t\t\t\t(unq) => {\n\t\t\t\t\treturn SingleStoreSquasher.squashUnique(unq);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\treturn [\n\t\t\t\tit[0],\n\t\t\t\t{\n\t\t\t\t\tname: it[1].name,\n\t\t\t\t\tcolumns: it[1].columns,\n\t\t\t\t\tindexes: squashedIndexes,\n\t\t\t\t\tcompositePrimaryKeys: squashedPKs,\n\t\t\t\t\tuniqueConstraints: squashedUniqueConstraints,\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t);\n\n\t/* const mappedViews = Object.fromEntries(\n\t\tObject.entries(json.views).map(([key, value]) => {\n\t\t\tconst meta = SingleStoreSquasher.squashView(value);\n\n\t\t\treturn [key, {\n\t\t\t\tname: value.name,\n\t\t\t\tisExisting: value.isExisting,\n\t\t\t\tcolumns: value.columns,\n\t\t\t\tdefinition: value.definition,\n\t\t\t\tmeta,\n\t\t\t}];\n\t\t}),\n\t); */\n\n\treturn {\n\t\tversion: '1',\n\t\tdialect: json.dialect,\n\t\ttables: mappedTables,\n\t\t/* views: mappedViews, */\n\t};\n};\n\nexport const singlestoreSchema = schema;\nexport const singlestoreSchemaSquashed = schemaSquashed;\n\n// no prev version\nexport const backwardCompatibleSingleStoreSchema = union([singlestoreSchema, schema]);\n\nexport const drySingleStore = singlestoreSchema.parse({\n\tversion: '1',\n\tdialect: 'singlestore',\n\tid: originUUID,\n\tprevId: '',\n\ttables: {},\n\tschemas: {},\n\t/* views: {}, */\n\t_meta: {\n\t\tschemas: {},\n\t\ttables: {},\n\t\tcolumns: {},\n\t},\n});\n"
  },
  {
    "path": "drizzle-kit/src/serializer/singlestoreSerializer.ts",
    "content": "import chalk from 'chalk';\nimport { is, SQL } from 'drizzle-orm';\nimport {\n\tAnySingleStoreTable,\n\tgetTableConfig,\n\ttype PrimaryKey as PrimaryKeyORM,\n\tSingleStoreDialect,\n\tuniqueKeyName,\n} from 'drizzle-orm/singlestore-core';\nimport { RowDataPacket } from 'mysql2/promise';\nimport { withStyle } from '../cli/validations/outputs';\nimport { IntrospectStage, IntrospectStatus } from '../cli/views';\n\nimport { CasingType } from 'src/cli/validations/common';\nimport type { DB } from '../utils';\nimport {\n\tColumn,\n\tIndex,\n\tPrimaryKey,\n\tSingleStoreKitInternals,\n\tSingleStoreSchemaInternal,\n\tTable,\n\tUniqueConstraint,\n} from './singlestoreSchema';\nimport { sqlToStr } from './utils';\n\nconst dialect = new SingleStoreDialect();\n\nexport const indexName = (tableName: string, columns: string[]) => {\n\treturn `${tableName}_${columns.join('_')}_index`;\n};\n\nexport const generateSingleStoreSnapshot = (\n\ttables: AnySingleStoreTable[],\n\t/* views: SingleStoreView[], */\n\tcasing: CasingType | undefined,\n): SingleStoreSchemaInternal => {\n\tconst dialect = new SingleStoreDialect({ casing });\n\tconst result: Record<string, Table> = {};\n\t/* const resultViews: Record<string, View> = {}; */\n\tconst internal: SingleStoreKitInternals = { tables: {}, indexes: {} };\n\tfor (const table of tables) {\n\t\tconst {\n\t\t\tname: tableName,\n\t\t\tcolumns,\n\t\t\tindexes,\n\t\t\tschema,\n\t\t\tprimaryKeys,\n\t\t\tuniqueConstraints,\n\t\t} = getTableConfig(table);\n\t\tconst columnsObject: Record<string, Column> = {};\n\t\tconst indexesObject: Record<string, Index> = {};\n\t\tconst primaryKeysObject: Record<string, PrimaryKey> = {};\n\t\tconst uniqueConstraintObject: Record<string, UniqueConstraint> = {};\n\n\t\tcolumns.forEach((column) => {\n\t\t\tconst notNull: boolean = column.notNull;\n\t\t\tconst sqlTypeLowered = column.getSQLType().toLowerCase();\n\t\t\tconst autoIncrement = typeof (column as any).autoIncrement === 'undefined'\n\t\t\t\t? false\n\t\t\t\t: (column as any).autoIncrement;\n\n\t\t\tconst generated = column.generated;\n\n\t\t\tconst columnToSet: Column = {\n\t\t\t\tname: column.name,\n\t\t\t\ttype: column.getSQLType(),\n\t\t\t\tprimaryKey: false,\n\t\t\t\t// If field is autoincrement it's notNull by default\n\t\t\t\t// notNull: autoIncrement ? true : notNull,\n\t\t\t\tnotNull,\n\t\t\t\tautoincrement: autoIncrement,\n\t\t\t\tonUpdate: (column as any).hasOnUpdateNow,\n\t\t\t\tgenerated: generated\n\t\t\t\t\t? {\n\t\t\t\t\t\tas: is(generated.as, SQL)\n\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as as SQL).sql\n\t\t\t\t\t\t\t: typeof generated.as === 'function'\n\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as() as SQL).sql\n\t\t\t\t\t\t\t: (generated.as as any),\n\t\t\t\t\t\ttype: generated.mode ?? 'stored',\n\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t};\n\n\t\t\tif (column.primary) {\n\t\t\t\tprimaryKeysObject[`${tableName}_${column.name}`] = {\n\t\t\t\t\tname: `${tableName}_${column.name}`,\n\t\t\t\t\tcolumns: [column.name],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (column.isUnique) {\n\t\t\t\tconst existingUnique = uniqueConstraintObject[column.uniqueName!];\n\t\t\t\tif (typeof existingUnique !== 'undefined') {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(`We\\'ve found duplicated unique constraint names in ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} table. \n          The unique constraint ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tcolumn.uniqueName,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} on the ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tcolumn.name,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} column is confilcting with a unique constraint name already defined for ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\texistingUnique.columns.join(','),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} columns\\n`)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tuniqueConstraintObject[column.uniqueName!] = {\n\t\t\t\t\tname: column.uniqueName!,\n\t\t\t\t\tcolumns: [columnToSet.name],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (column.default !== undefined) {\n\t\t\t\tif (is(column.default, SQL)) {\n\t\t\t\t\tcolumnToSet.default = sqlToStr(column.default, casing);\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof column.default === 'string') {\n\t\t\t\t\t\tcolumnToSet.default = `'${column.default}'`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (sqlTypeLowered === 'json' || Array.isArray(column.default)) {\n\t\t\t\t\t\t\tcolumnToSet.default = `'${JSON.stringify(column.default)}'`;\n\t\t\t\t\t\t} else if (column.default instanceof Date) {\n\t\t\t\t\t\t\tif (sqlTypeLowered === 'date') {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString().split('T')[0]}'`;\n\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\tsqlTypeLowered.startsWith('datetime')\n\t\t\t\t\t\t\t\t|| sqlTypeLowered.startsWith('timestamp')\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${\n\t\t\t\t\t\t\t\t\tcolumn.default\n\t\t\t\t\t\t\t\t\t\t.toISOString()\n\t\t\t\t\t\t\t\t\t\t.replace('T', ' ')\n\t\t\t\t\t\t\t\t\t\t.slice(0, 23)\n\t\t\t\t\t\t\t\t}'`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcolumnToSet.default = column.default;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// if (['blob', 'text', 'json'].includes(column.getSQLType())) {\n\t\t\t\t\t// \tcolumnToSet.default = `(${columnToSet.default})`;\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t}\n\t\t\tcolumnsObject[column.name] = columnToSet;\n\t\t});\n\n\t\tprimaryKeys.map((pk: PrimaryKeyORM) => {\n\t\t\tconst columnNames = pk.columns.map((c: any) => c.name);\n\t\t\tprimaryKeysObject[pk.getName()] = {\n\t\t\t\tname: pk.getName(),\n\t\t\t\tcolumns: columnNames,\n\t\t\t};\n\n\t\t\t// all composite pk's should be treated as notNull\n\t\t\tfor (const column of pk.columns) {\n\t\t\t\tcolumnsObject[column.name].notNull = true;\n\t\t\t}\n\t\t});\n\n\t\tuniqueConstraints?.map((unq) => {\n\t\t\tconst columnNames = unq.columns.map((c) => c.name);\n\n\t\t\tconst name = unq.name ?? uniqueKeyName(table, columnNames);\n\n\t\t\tconst existingUnique = uniqueConstraintObject[name];\n\t\t\tif (typeof existingUnique !== 'undefined') {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\n${\n\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t`We\\'ve found duplicated unique constraint names in ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} table. \\nThe unique constraint ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} on the ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tcolumnNames.join(','),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} columns is confilcting with a unique constraint name already defined for ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\texistingUnique.columns.join(','),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} columns\\n`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tuniqueConstraintObject[name] = {\n\t\t\t\tname: unq.name!,\n\t\t\t\tcolumns: columnNames,\n\t\t\t};\n\t\t});\n\n\t\tindexes.forEach((value) => {\n\t\t\tconst columns = value.config.columns;\n\t\t\tconst name = value.config.name;\n\n\t\t\tlet indexColumns = columns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\tconst sql = dialect.sqlToQuery(it, 'indexes').sql;\n\t\t\t\t\tif (typeof internal!.indexes![name] === 'undefined') {\n\t\t\t\t\t\tinternal!.indexes![name] = {\n\t\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\t\t[sql]: {\n\t\t\t\t\t\t\t\t\tisExpression: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (typeof internal!.indexes![name]?.columns[sql] === 'undefined') {\n\t\t\t\t\t\t\tinternal!.indexes![name]!.columns[sql] = {\n\t\t\t\t\t\t\t\tisExpression: true,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinternal!.indexes![name]!.columns[sql]!.isExpression = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn sql;\n\t\t\t\t} else {\n\t\t\t\t\treturn `${it.name}`;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (value.config.unique) {\n\t\t\t\tif (typeof uniqueConstraintObject[name] !== 'undefined') {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t`We\\'ve found duplicated unique constraint names in ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} table. \\nThe unique index ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} on the ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\tindexColumns.join(','),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} columns is confilcting with a unique constraint name already defined for ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\tuniqueConstraintObject[name].columns.join(','),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} columns\\n`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tindexesObject[name] = {\n\t\t\t\tname,\n\t\t\t\tcolumns: indexColumns,\n\t\t\t\tisUnique: value.config.unique ?? false,\n\t\t\t\tusing: value.config.using,\n\t\t\t\talgorithm: value.config.algorithm,\n\t\t\t\tlock: value.config.lock,\n\t\t\t};\n\t\t});\n\n\t\t// only handle tables without schemas\n\t\tif (!schema) {\n\t\t\tresult[tableName] = {\n\t\t\t\tname: tableName,\n\t\t\t\tcolumns: columnsObject,\n\t\t\t\tindexes: indexesObject,\n\t\t\t\tcompositePrimaryKeys: primaryKeysObject,\n\t\t\t\tuniqueConstraints: uniqueConstraintObject,\n\t\t\t};\n\t\t}\n\t}\n\n\t/* for (const view of views) {\n\t\tconst {\n\t\t\tisExisting,\n\t\t\tname,\n\t\t\tquery,\n\t\t\tschema,\n\t\t\tselectedFields,\n\t\t\talgorithm,\n\t\t\tsqlSecurity,\n\t\t\twithCheckOption,\n\t\t} = getViewConfig(view);\n\n\t\tconst columnsObject: Record<string, Column> = {};\n\n\t\tconst existingView = resultViews[name];\n\t\tif (typeof existingView !== 'undefined') {\n\t\t\tconsole.log(\n\t\t\t\t`\\n${\n\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t`We\\'ve found duplicated view name across ${\n\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\tschema ?? 'public',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} schema. Please rename your view`,\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tfor (const key in selectedFields) {\n\t\t\tif (is(selectedFields[key], SingleStoreColumn)) {\n\t\t\t\tconst column = selectedFields[key];\n\n\t\t\t\tconst notNull: boolean = column.notNull;\n\t\t\t\tconst sqlTypeLowered = column.getSQLType().toLowerCase();\n\t\t\t\tconst autoIncrement = typeof (column as any).autoIncrement === 'undefined'\n\t\t\t\t\t? false\n\t\t\t\t\t: (column as any).autoIncrement;\n\n\t\t\t\tconst generated = column.generated;\n\n\t\t\t\tconst columnToSet: Column = {\n\t\t\t\t\tname: column.name,\n\t\t\t\t\ttype: column.getSQLType(),\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t// If field is autoincrement it's notNull by default\n\t\t\t\t\t// notNull: autoIncrement ? true : notNull,\n\t\t\t\t\tnotNull,\n\t\t\t\t\tautoincrement: autoIncrement,\n\t\t\t\t\tonUpdate: (column as any).hasOnUpdateNow,\n\t\t\t\t\tgenerated: generated\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\tas: is(generated.as, SQL)\n\t\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as as SQL).sql\n\t\t\t\t\t\t\t\t: typeof generated.as === 'function'\n\t\t\t\t\t\t\t\t? dialect.sqlToQuery(generated.as() as SQL).sql\n\t\t\t\t\t\t\t\t: (generated.as as any),\n\t\t\t\t\t\t\ttype: generated.mode ?? 'stored',\n\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\t};\n\n\t\t\t\tif (column.default !== undefined) {\n\t\t\t\t\tif (is(column.default, SQL)) {\n\t\t\t\t\t\tcolumnToSet.default = sqlToStr(column.default, casing);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (typeof column.default === 'string') {\n\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default}'`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (sqlTypeLowered === 'json') {\n\t\t\t\t\t\t\t\tcolumnToSet.default = `'${JSON.stringify(column.default)}'`;\n\t\t\t\t\t\t\t} else if (column.default instanceof Date) {\n\t\t\t\t\t\t\t\tif (sqlTypeLowered === 'date') {\n\t\t\t\t\t\t\t\t\tcolumnToSet.default = `'${column.default.toISOString().split('T')[0]}'`;\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\tsqlTypeLowered.startsWith('datetime')\n\t\t\t\t\t\t\t\t\t|| sqlTypeLowered.startsWith('timestamp')\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tcolumnToSet.default = `'${\n\t\t\t\t\t\t\t\t\t\tcolumn.default\n\t\t\t\t\t\t\t\t\t\t\t.toISOString()\n\t\t\t\t\t\t\t\t\t\t\t.replace('T', ' ')\n\t\t\t\t\t\t\t\t\t\t\t.slice(0, 23)\n\t\t\t\t\t\t\t\t\t}'`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcolumnToSet.default = column.default;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcolumnsObject[column.name] = columnToSet;\n\t\t\t}\n\t\t}\n\n\t\tresultViews[name] = {\n\t\t\tcolumns: columnsObject,\n\t\t\tname,\n\t\t\tisExisting,\n\t\t\tdefinition: isExisting ? undefined : dialect.sqlToQuery(query!).sql,\n\t\t\twithCheckOption,\n\t\t\talgorithm: algorithm ?? 'undefined', // set default values\n\t\t\tsqlSecurity: sqlSecurity ?? 'definer', // set default values\n\t\t};\n\t} */\n\n\treturn {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: result,\n\t\t/* views: resultViews, */\n\t\t_meta: {\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t\tinternal,\n\t};\n};\n\nfunction clearDefaults(defaultValue: any, collate: string) {\n\tif (typeof collate === 'undefined' || collate === null) {\n\t\tcollate = `utf8mb4`;\n\t}\n\n\tlet resultDefault = defaultValue;\n\tcollate = `_${collate}`;\n\tif (defaultValue.startsWith(collate)) {\n\t\tresultDefault = resultDefault\n\t\t\t.substring(collate.length, defaultValue.length)\n\t\t\t.replace(/\\\\/g, '');\n\t\tif (resultDefault.startsWith(\"'\") && resultDefault.endsWith(\"'\")) {\n\t\t\treturn `('${resultDefault.substring(1, resultDefault.length - 1)}')`;\n\t\t} else {\n\t\t\treturn `'${resultDefault}'`;\n\t\t}\n\t} else {\n\t\treturn `(${resultDefault})`;\n\t}\n}\n\nexport const fromDatabase = async (\n\tdb: DB,\n\tinputSchema: string,\n\ttablesFilter: (table: string) => boolean = (table) => true,\n\tprogressCallback?: (\n\t\tstage: IntrospectStage,\n\t\tcount: number,\n\t\tstatus: IntrospectStatus,\n\t) => void,\n): Promise<SingleStoreSchemaInternal> => {\n\tconst result: Record<string, Table> = {};\n\tconst internals: SingleStoreKitInternals = { tables: {}, indexes: {} };\n\n\tconst columns = await db.query(`select * from information_schema.columns\n\twhere table_schema = '${inputSchema}' and table_name != '__drizzle_migrations'\n\torder by table_name, ordinal_position;`);\n\n\tconst response = columns as RowDataPacket[];\n\n\tconst schemas: string[] = [];\n\n\tlet columnsCount = 0;\n\tlet tablesCount = new Set();\n\tlet indexesCount = 0;\n\t/* let viewsCount = 0; */\n\n\tconst idxs = await db.query(\n\t\t`select * from INFORMATION_SCHEMA.STATISTICS\n\tWHERE INFORMATION_SCHEMA.STATISTICS.TABLE_SCHEMA = '${inputSchema}' and INFORMATION_SCHEMA.STATISTICS.INDEX_NAME != 'PRIMARY';`,\n\t);\n\n\tconst idxRows = idxs as RowDataPacket[];\n\n\tfor (const column of response) {\n\t\tif (!tablesFilter(column['TABLE_NAME'] as string)) continue;\n\n\t\tcolumnsCount += 1;\n\t\tif (progressCallback) {\n\t\t\tprogressCallback('columns', columnsCount, 'fetching');\n\t\t}\n\t\tconst schema: string = column['TABLE_SCHEMA'];\n\t\tconst tableName = column['TABLE_NAME'];\n\n\t\ttablesCount.add(`${schema}.${tableName}`);\n\t\tif (progressCallback) {\n\t\t\tprogressCallback('columns', tablesCount.size, 'fetching');\n\t\t}\n\t\tconst columnName: string = column['COLUMN_NAME'];\n\t\tconst isNullable = column['IS_NULLABLE'] === 'YES'; // 'YES', 'NO'\n\t\tconst dataType = column['DATA_TYPE']; // varchar\n\t\tconst columnType = column['COLUMN_TYPE']; // varchar(256)\n\t\t// const columnType = column[\"DATA_TYPE\"];\n\t\tconst isPrimary = column['COLUMN_KEY'] === 'PRI'; // 'PRI', ''\n\t\tlet columnDefault: string | null = column['COLUMN_DEFAULT'];\n\t\tconst collation: string = column['CHARACTER_SET_NAME'];\n\t\tconst geenratedExpression: string = column['GENERATION_EXPRESSION'];\n\n\t\tlet columnExtra = column['EXTRA'];\n\t\tlet isAutoincrement = false; // 'auto_increment', ''\n\t\tlet isDefaultAnExpression = false; // 'auto_increment', ''\n\n\t\tif (typeof column['EXTRA'] !== 'undefined') {\n\t\t\tcolumnExtra = column['EXTRA'];\n\t\t\tisAutoincrement = column['EXTRA'] === 'auto_increment'; // 'auto_increment', ''\n\t\t\tisDefaultAnExpression = column['EXTRA'].includes('DEFAULT_GENERATED'); // 'auto_increment', ''\n\t\t}\n\n\t\t// if (isPrimary) {\n\t\t//   if (typeof tableToPk[tableName] === \"undefined\") {\n\t\t//     tableToPk[tableName] = [columnName];\n\t\t//   } else {\n\t\t//     tableToPk[tableName].push(columnName);\n\t\t//   }\n\t\t// }\n\n\t\tif (schema !== inputSchema) {\n\t\t\tschemas.push(schema);\n\t\t}\n\n\t\tconst table = result[tableName];\n\n\t\t// let changedType = columnType.replace(\"bigint unsigned\", \"serial\")\n\t\tlet changedType = columnType;\n\n\t\tif (columnType === 'bigint unsigned' && !isNullable && isAutoincrement) {\n\t\t\t// check unique here\n\t\t\tconst uniqueIdx = idxRows.filter(\n\t\t\t\t(it) =>\n\t\t\t\t\tit['COLUMN_NAME'] === columnName\n\t\t\t\t\t&& it['TABLE_NAME'] === tableName\n\t\t\t\t\t&& it['NON_UNIQUE'] === 0,\n\t\t\t);\n\t\t\tif (uniqueIdx && uniqueIdx.length === 1) {\n\t\t\t\tchangedType = columnType.replace('bigint unsigned', 'serial');\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tcolumnType.startsWith('bigint(')\n\t\t\t|| columnType.startsWith('tinyint(')\n\t\t\t|| columnType.startsWith('date(')\n\t\t\t|| columnType.startsWith('int(')\n\t\t\t|| columnType.startsWith('mediumint(')\n\t\t\t|| columnType.startsWith('smallint(')\n\t\t\t|| columnType.startsWith('text(')\n\t\t\t|| columnType.startsWith('time(')\n\t\t\t|| columnType.startsWith('year(')\n\t\t) {\n\t\t\tchangedType = columnType.replace(/\\(\\s*[^)]*\\)$/, '');\n\t\t}\n\n\t\tif (columnType.includes('decimal(10,0)')) {\n\t\t\tchangedType = columnType.replace('decimal(10,0)', 'decimal');\n\t\t}\n\n\t\tif (columnDefault?.endsWith('.')) {\n\t\t\tcolumnDefault = columnDefault.slice(0, -1);\n\t\t}\n\n\t\tlet onUpdate: boolean | undefined = undefined;\n\t\tif (\n\t\t\tcolumnType.startsWith('timestamp')\n\t\t\t&& typeof columnExtra !== 'undefined'\n\t\t\t&& columnExtra.includes('on update CURRENT_TIMESTAMP')\n\t\t) {\n\t\t\tonUpdate = true;\n\t\t}\n\n\t\tconst newColumn: Column = {\n\t\t\tdefault: columnDefault === null\n\t\t\t\t? undefined\n\t\t\t\t: /^-?[\\d.]+(?:e-?\\d+)?$/.test(columnDefault)\n\t\t\t\t\t\t&& !['decimal', 'char', 'varchar'].some((type) => columnType.startsWith(type))\n\t\t\t\t? Number(columnDefault)\n\t\t\t\t: isDefaultAnExpression\n\t\t\t\t? clearDefaults(columnDefault, collation)\n\t\t\t\t: columnDefault.startsWith('CURRENT_TIMESTAMP')\n\t\t\t\t? 'CURRENT_TIMESTAMP'\n\t\t\t\t: `'${columnDefault}'`,\n\t\t\tautoincrement: isAutoincrement,\n\t\t\tname: columnName,\n\t\t\ttype: changedType,\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: !isNullable,\n\t\t\tonUpdate,\n\t\t\tgenerated: geenratedExpression\n\t\t\t\t? {\n\t\t\t\t\tas: geenratedExpression,\n\t\t\t\t\ttype: columnExtra === 'VIRTUAL GENERATED' ? 'virtual' : 'stored',\n\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t};\n\n\t\t// Set default to internal object\n\t\tif (isDefaultAnExpression) {\n\t\t\tif (typeof internals!.tables![tableName] === 'undefined') {\n\t\t\t\tinternals!.tables![tableName] = {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t[columnName]: {\n\t\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\ttypeof internals!.tables![tableName]!.columns[columnName]\n\t\t\t\t\t\t=== 'undefined'\n\t\t\t\t) {\n\t\t\t\t\tinternals!.tables![tableName]!.columns[columnName] = {\n\t\t\t\t\t\tisDefaultAnExpression: true,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tinternals!.tables![tableName]!.columns[\n\t\t\t\t\t\tcolumnName\n\t\t\t\t\t]!.isDefaultAnExpression = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!table) {\n\t\t\tresult[tableName] = {\n\t\t\t\tname: tableName,\n\t\t\t\tcolumns: {\n\t\t\t\t\t[columnName]: newColumn,\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tindexes: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t};\n\t\t} else {\n\t\t\tresult[tableName]!.columns[columnName] = newColumn;\n\t\t}\n\t}\n\n\tconst tablePks = await db.query(\n\t\t`SELECT table_name, column_name, ordinal_position\n  FROM information_schema.table_constraints t\n  LEFT JOIN information_schema.key_column_usage k\n  USING(constraint_name,table_schema,table_name)\n  WHERE t.constraint_type='UNIQUE'\n      and table_name != '__drizzle_migrations'\n      AND t.table_schema = '${inputSchema}'\n      ORDER BY ordinal_position`,\n\t);\n\n\tconst tableToPk: { [tname: string]: string[] } = {};\n\n\tconst tableToPkRows = tablePks as RowDataPacket[];\n\tfor (const tableToPkRow of tableToPkRows) {\n\t\tconst tableName: string = tableToPkRow['table_name'];\n\t\tconst columnName: string = tableToPkRow['column_name'];\n\t\tconst position: string = tableToPkRow['ordinal_position'];\n\n\t\tif (typeof result[tableName] === 'undefined') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (typeof tableToPk[tableName] === 'undefined') {\n\t\t\ttableToPk[tableName] = [columnName];\n\t\t} else {\n\t\t\ttableToPk[tableName].push(columnName);\n\t\t}\n\t}\n\n\tfor (const [key, value] of Object.entries(tableToPk)) {\n\t\t// if (value.length > 1) {\n\t\tresult[key].compositePrimaryKeys = {\n\t\t\t[`${key}_${value.join('_')}`]: {\n\t\t\t\tname: `${key}_${value.join('_')}`,\n\t\t\t\tcolumns: value,\n\t\t\t},\n\t\t};\n\t\t// } else if (value.length === 1) {\n\t\t// result[key].columns[value[0]].primaryKey = true;\n\t\t// } else {\n\t\t// }\n\t}\n\tif (progressCallback) {\n\t\tprogressCallback('columns', columnsCount, 'done');\n\t\tprogressCallback('tables', tablesCount.size, 'done');\n\t}\n\n\tfor (const idxRow of idxRows) {\n\t\tconst tableSchema = idxRow['TABLE_SCHEMA'];\n\t\tconst tableName = idxRow['TABLE_NAME'];\n\t\tconst constraintName = idxRow['INDEX_NAME'];\n\t\tconst columnName: string = idxRow['COLUMN_NAME'];\n\t\tconst isUnique = idxRow['NON_UNIQUE'] === 0;\n\n\t\tconst tableInResult = result[tableName];\n\t\tif (typeof tableInResult === 'undefined') continue;\n\n\t\t// if (tableInResult.columns[columnName].type === \"serial\") continue;\n\n\t\tindexesCount += 1;\n\t\tif (progressCallback) {\n\t\t\tprogressCallback('indexes', indexesCount, 'fetching');\n\t\t}\n\n\t\tif (isUnique) {\n\t\t\tif (\n\t\t\t\ttypeof tableInResult.uniqueConstraints[constraintName] !== 'undefined'\n\t\t\t) {\n\t\t\t\ttableInResult.uniqueConstraints[constraintName]!.columns.push(\n\t\t\t\t\tcolumnName,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\ttableInResult.uniqueConstraints[constraintName] = {\n\t\t\t\t\tname: constraintName,\n\t\t\t\t\tcolumns: [columnName],\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\t/* const views = await db.query(\n\t\t`select * from INFORMATION_SCHEMA.VIEWS WHERE table_schema = '${inputSchema}';`,\n\t); */\n\n\t/* const resultViews: Record<string, View> = {}; */\n\n\t/* viewsCount = views.length;\n\tif (progressCallback) {\n\t\tprogressCallback('views', viewsCount, 'fetching');\n\t}\n\tfor await (const view of views) {\n\t\tconst viewName = view['TABLE_NAME'];\n\t\tconst definition = view['VIEW_DEFINITION'];\n\n\t\tconst withCheckOption = view['CHECK_OPTION'] === 'NONE'\n\t\t\t? undefined\n\t\t\t: view['CHECK_OPTION'].toLowerCase();\n\t\tconst sqlSecurity = view['SECURITY_TYPE'].toLowerCase();\n\n\t\tconst [createSqlStatement] = await db.query(\n\t\t\t`SHOW CREATE VIEW \\`${viewName}\\`;`,\n\t\t);\n\t\tconst algorithmMatch = createSqlStatement['Create View'].match(/ALGORITHM=([^ ]+)/);\n\t\tconst algorithm = algorithmMatch\n\t\t\t? algorithmMatch[1].toLowerCase()\n\t\t\t: undefined;\n\n\t\tconst columns = result[viewName].columns;\n\t\tdelete result[viewName];\n\n\t\tresultViews[viewName] = {\n\t\t\tcolumns: columns,\n\t\t\tisExisting: false,\n\t\t\tname: viewName,\n\t\t\talgorithm,\n\t\t\tdefinition,\n\t\t\tsqlSecurity,\n\t\t\twithCheckOption,\n\t\t};\n\t} */\n\n\tif (progressCallback) {\n\t\tprogressCallback('indexes', indexesCount, 'done');\n\t\t// progressCallback(\"enums\", 0, \"fetching\");\n\t\tprogressCallback('enums', 0, 'done');\n\t}\n\n\treturn {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: result,\n\t\t/* views: resultViews, */\n\t\t_meta: {\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t\tinternal: internals,\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/serializer/sqliteImports.ts",
    "content": "import { is } from 'drizzle-orm';\nimport type { AnySQLiteTable } from 'drizzle-orm/sqlite-core';\nimport { SQLiteTable, SQLiteView } from 'drizzle-orm/sqlite-core';\nimport { safeRegister } from '../cli/commands/utils';\n\nexport const prepareFromExports = (exports: Record<string, unknown>) => {\n\tconst tables: AnySQLiteTable[] = [];\n\tconst views: SQLiteView[] = [];\n\n\tconst i0values = Object.values(exports);\n\ti0values.forEach((t) => {\n\t\tif (is(t, SQLiteTable)) {\n\t\t\ttables.push(t);\n\t\t}\n\n\t\tif (is(t, SQLiteView)) {\n\t\t\tviews.push(t);\n\t\t}\n\t});\n\n\treturn { tables, views };\n};\n\nexport const prepareFromSqliteImports = async (imports: string[]) => {\n\tconst tables: AnySQLiteTable[] = [];\n\tconst views: SQLiteView[] = [];\n\n\tawait safeRegister(async () => {\n\t\tfor (let i = 0; i < imports.length; i++) {\n\t\t\tconst it = imports[i];\n\n\t\t\tconst i0: Record<string, unknown> = require(`${it}`);\n\t\t\tconst prepared = prepareFromExports(i0);\n\n\t\t\ttables.push(...prepared.tables);\n\t\t\tviews.push(...prepared.views);\n\t\t}\n\t});\n\n\treturn { tables: Array.from(new Set(tables)), views };\n};\n"
  },
  {
    "path": "drizzle-kit/src/serializer/sqliteSchema.ts",
    "content": "import { any, boolean, enum as enumType, literal, object, record, string, TypeOf, union } from 'zod';\nimport { customMapEntries, mapValues, originUUID } from '../global';\n\n// ------- V3 --------\nconst index = object({\n\tname: string(),\n\tcolumns: string().array(),\n\twhere: string().optional(),\n\tisUnique: boolean(),\n}).strict();\n\nconst fk = object({\n\tname: string(),\n\ttableFrom: string(),\n\tcolumnsFrom: string().array(),\n\ttableTo: string(),\n\tcolumnsTo: string().array(),\n\tonUpdate: string().optional(),\n\tonDelete: string().optional(),\n}).strict();\n\nconst compositePK = object({\n\tcolumns: string().array(),\n\tname: string().optional(),\n}).strict();\n\nconst column = object({\n\tname: string(),\n\ttype: string(),\n\tprimaryKey: boolean(),\n\tnotNull: boolean(),\n\tautoincrement: boolean().optional(),\n\tdefault: any().optional(),\n\tgenerated: object({\n\t\ttype: enumType(['stored', 'virtual']),\n\t\tas: string(),\n\t}).optional(),\n}).strict();\n\nconst tableV3 = object({\n\tname: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), index),\n\tforeignKeys: record(string(), fk),\n}).strict();\n\nconst uniqueConstraint = object({\n\tname: string(),\n\tcolumns: string().array(),\n}).strict();\n\nconst checkConstraint = object({\n\tname: string(),\n\tvalue: string(),\n}).strict();\n\nconst table = object({\n\tname: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), index),\n\tforeignKeys: record(string(), fk),\n\tcompositePrimaryKeys: record(string(), compositePK),\n\tuniqueConstraints: record(string(), uniqueConstraint).default({}),\n\tcheckConstraints: record(string(), checkConstraint).default({}),\n}).strict();\n\nexport const view = object({\n\tname: string(),\n\tcolumns: record(string(), column),\n\tdefinition: string().optional(),\n\tisExisting: boolean(),\n}).strict();\n\n// use main dialect\nconst dialect = enumType(['sqlite']);\n\nconst schemaHash = object({\n\tid: string(),\n\tprevId: string(),\n}).strict();\n\nexport const schemaInternalV3 = object({\n\tversion: literal('3'),\n\tdialect: dialect,\n\ttables: record(string(), tableV3),\n\tenums: object({}),\n}).strict();\n\nexport const schemaInternalV4 = object({\n\tversion: literal('4'),\n\tdialect: dialect,\n\ttables: record(string(), table),\n\tviews: record(string(), view).default({}),\n\tenums: object({}),\n}).strict();\n\nexport const schemaInternalV5 = object({\n\tversion: literal('5'),\n\tdialect: dialect,\n\ttables: record(string(), table),\n\tenums: object({}),\n\t_meta: object({\n\t\ttables: record(string(), string()),\n\t\tcolumns: record(string(), string()),\n\t}),\n}).strict();\n\nexport const kitInternals = object({\n\tindexes: record(\n\t\tstring(),\n\t\tobject({\n\t\t\tcolumns: record(\n\t\t\t\tstring(),\n\t\t\t\tobject({ isExpression: boolean().optional() }).optional(),\n\t\t\t),\n\t\t}).optional(),\n\t).optional(),\n}).optional();\n\nconst latestVersion = literal('6');\nexport const schemaInternal = object({\n\tversion: latestVersion,\n\tdialect: dialect,\n\ttables: record(string(), table),\n\tviews: record(string(), view).default({}),\n\tenums: object({}),\n\t_meta: object({\n\t\ttables: record(string(), string()),\n\t\tcolumns: record(string(), string()),\n\t}),\n\tinternal: kitInternals,\n}).strict();\n\nexport const schemaV3 = schemaInternalV3.merge(schemaHash).strict();\nexport const schemaV4 = schemaInternalV4.merge(schemaHash).strict();\nexport const schemaV5 = schemaInternalV5.merge(schemaHash).strict();\nexport const schema = schemaInternal.merge(schemaHash).strict();\n\nconst tableSquashed = object({\n\tname: string(),\n\tcolumns: record(string(), column),\n\tindexes: record(string(), string()),\n\tforeignKeys: record(string(), string()),\n\tcompositePrimaryKeys: record(string(), string()),\n\tuniqueConstraints: record(string(), string()).default({}),\n\tcheckConstraints: record(string(), string()).default({}),\n}).strict();\n\nexport const schemaSquashed = object({\n\tversion: latestVersion,\n\tdialect: dialect,\n\ttables: record(string(), tableSquashed),\n\tviews: record(string(), view),\n\tenums: any(),\n}).strict();\n\nexport type Dialect = TypeOf<typeof dialect>;\nexport type Column = TypeOf<typeof column>;\nexport type Table = TypeOf<typeof table>;\nexport type SQLiteSchema = TypeOf<typeof schema>;\nexport type SQLiteSchemaV3 = TypeOf<typeof schemaV3>;\nexport type SQLiteSchemaV4 = TypeOf<typeof schemaV4>;\nexport type SQLiteSchemaInternal = TypeOf<typeof schemaInternal>;\nexport type SQLiteSchemaSquashed = TypeOf<typeof schemaSquashed>;\nexport type SQLiteKitInternals = TypeOf<typeof kitInternals>;\nexport type Index = TypeOf<typeof index>;\nexport type ForeignKey = TypeOf<typeof fk>;\nexport type PrimaryKey = TypeOf<typeof compositePK>;\nexport type UniqueConstraint = TypeOf<typeof uniqueConstraint>;\nexport type CheckConstraint = TypeOf<typeof checkConstraint>;\nexport type View = TypeOf<typeof view>;\n\nexport const SQLiteSquasher = {\n\tsquashIdx: (idx: Index) => {\n\t\tindex.parse(idx);\n\t\treturn `${idx.name};${idx.columns.join(',')};${idx.isUnique};${idx.where ?? ''}`;\n\t},\n\tunsquashIdx: (input: string): Index => {\n\t\tconst [name, columnsString, isUnique, where] = input.split(';');\n\n\t\tconst result: Index = index.parse({\n\t\t\tname,\n\t\t\tcolumns: columnsString.split(','),\n\t\t\tisUnique: isUnique === 'true',\n\t\t\twhere: where ?? undefined,\n\t\t});\n\t\treturn result;\n\t},\n\tsquashUnique: (unq: UniqueConstraint) => {\n\t\treturn `${unq.name};${unq.columns.join(',')}`;\n\t},\n\tunsquashUnique: (unq: string): UniqueConstraint => {\n\t\tconst [name, columns] = unq.split(';');\n\t\treturn { name, columns: columns.split(',') };\n\t},\n\tsquashFK: (fk: ForeignKey) => {\n\t\treturn `${fk.name};${fk.tableFrom};${fk.columnsFrom.join(',')};${fk.tableTo};${fk.columnsTo.join(',')};${\n\t\t\tfk.onUpdate ?? ''\n\t\t};${fk.onDelete ?? ''}`;\n\t},\n\tunsquashFK: (input: string): ForeignKey => {\n\t\tconst [\n\t\t\tname,\n\t\t\ttableFrom,\n\t\t\tcolumnsFromStr,\n\t\t\ttableTo,\n\t\t\tcolumnsToStr,\n\t\t\tonUpdate,\n\t\t\tonDelete,\n\t\t] = input.split(';');\n\n\t\tconst result: ForeignKey = fk.parse({\n\t\t\tname,\n\t\t\ttableFrom,\n\t\t\tcolumnsFrom: columnsFromStr.split(','),\n\t\t\ttableTo,\n\t\t\tcolumnsTo: columnsToStr.split(','),\n\t\t\tonUpdate,\n\t\t\tonDelete,\n\t\t});\n\t\treturn result;\n\t},\n\tsquashPushFK: (fk: ForeignKey) => {\n\t\treturn `${fk.tableFrom};${fk.columnsFrom.join(',')};${fk.tableTo};${fk.columnsTo.join(',')};${fk.onUpdate ?? ''};${\n\t\t\tfk.onDelete ?? ''\n\t\t}`;\n\t},\n\tunsquashPushFK: (input: string): ForeignKey => {\n\t\tconst [\n\t\t\ttableFrom,\n\t\t\tcolumnsFromStr,\n\t\t\ttableTo,\n\t\t\tcolumnsToStr,\n\t\t\tonUpdate,\n\t\t\tonDelete,\n\t\t] = input.split(';');\n\n\t\tconst result: ForeignKey = fk.parse({\n\t\t\tname: '',\n\t\t\ttableFrom,\n\t\t\tcolumnsFrom: columnsFromStr.split(','),\n\t\t\ttableTo,\n\t\t\tcolumnsTo: columnsToStr.split(','),\n\t\t\tonUpdate,\n\t\t\tonDelete,\n\t\t});\n\t\treturn result;\n\t},\n\tsquashPK: (pk: PrimaryKey) => {\n\t\treturn pk.columns.join(',');\n\t},\n\tunsquashPK: (pk: string) => {\n\t\treturn pk.split(',');\n\t},\n\tsquashCheck: (check: CheckConstraint) => {\n\t\treturn `${check.name};${check.value}`;\n\t},\n\tunsquashCheck: (input: string): CheckConstraint => {\n\t\tconst [\n\t\t\tname,\n\t\t\tvalue,\n\t\t] = input.split(';');\n\n\t\treturn { name, value };\n\t},\n};\n\nexport const squashSqliteScheme = (\n\tjson: SQLiteSchema | SQLiteSchemaV4,\n\taction?: 'push' | undefined,\n): SQLiteSchemaSquashed => {\n\tconst mappedTables = Object.fromEntries(\n\t\tObject.entries(json.tables).map((it) => {\n\t\t\tconst squashedIndexes = mapValues(it[1].indexes, (index: Index) => {\n\t\t\t\treturn SQLiteSquasher.squashIdx(index);\n\t\t\t});\n\n\t\t\tconst squashedFKs = customMapEntries<string, ForeignKey>(\n\t\t\t\tit[1].foreignKeys,\n\t\t\t\t(key, value) => {\n\t\t\t\t\treturn action === 'push'\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\tSQLiteSquasher.squashPushFK(value),\n\t\t\t\t\t\t\tSQLiteSquasher.squashPushFK(value),\n\t\t\t\t\t\t]\n\t\t\t\t\t\t: [key, SQLiteSquasher.squashFK(value)];\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst squashedPKs = mapValues(it[1].compositePrimaryKeys, (pk) => {\n\t\t\t\treturn SQLiteSquasher.squashPK(pk);\n\t\t\t});\n\n\t\t\tconst squashedUniqueConstraints = mapValues(\n\t\t\t\tit[1].uniqueConstraints,\n\t\t\t\t(unq) => {\n\t\t\t\t\treturn SQLiteSquasher.squashUnique(unq);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst squashedCheckConstraints = mapValues(\n\t\t\t\tit[1].checkConstraints,\n\t\t\t\t(check) => {\n\t\t\t\t\treturn SQLiteSquasher.squashCheck(check);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\treturn [\n\t\t\t\tit[0],\n\t\t\t\t{\n\t\t\t\t\tname: it[1].name,\n\t\t\t\t\tcolumns: it[1].columns,\n\t\t\t\t\tindexes: squashedIndexes,\n\t\t\t\t\tforeignKeys: squashedFKs,\n\t\t\t\t\tcompositePrimaryKeys: squashedPKs,\n\t\t\t\t\tuniqueConstraints: squashedUniqueConstraints,\n\t\t\t\t\tcheckConstraints: squashedCheckConstraints,\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t);\n\n\treturn {\n\t\tversion: '6',\n\t\tdialect: json.dialect,\n\t\ttables: mappedTables,\n\t\tviews: json.views,\n\t\tenums: json.enums,\n\t};\n};\n\nexport const drySQLite = schema.parse({\n\tversion: '6',\n\tdialect: 'sqlite',\n\tid: originUUID,\n\tprevId: '',\n\ttables: {},\n\tviews: {},\n\tenums: {},\n\t_meta: {\n\t\ttables: {},\n\t\tcolumns: {},\n\t},\n});\n\nexport const sqliteSchemaV3 = schemaV3;\nexport const sqliteSchemaV4 = schemaV4;\nexport const sqliteSchemaV5 = schemaV5;\nexport const sqliteSchema = schema;\nexport const SQLiteSchemaSquashed = schemaSquashed;\n\nexport const backwardCompatibleSqliteSchema = union([sqliteSchemaV5, schema]);\n"
  },
  {
    "path": "drizzle-kit/src/serializer/sqliteSerializer.ts",
    "content": "import chalk from 'chalk';\nimport { getTableName, is, SQL } from 'drizzle-orm';\nimport {\n\tAnySQLiteTable,\n\tgetTableConfig,\n\tgetViewConfig,\n\tSQLiteBaseInteger,\n\tSQLiteColumn,\n\tSQLiteSyncDialect,\n\tSQLiteView,\n\tuniqueKeyName,\n} from 'drizzle-orm/sqlite-core';\nimport { CasingType } from 'src/cli/validations/common';\nimport { withStyle } from '../cli/validations/outputs';\nimport type { IntrospectStage, IntrospectStatus } from '../cli/views';\nimport type {\n\tCheckConstraint,\n\tColumn,\n\tForeignKey,\n\tIndex,\n\tPrimaryKey,\n\tSQLiteKitInternals,\n\tSQLiteSchemaInternal,\n\tTable,\n\tUniqueConstraint,\n\tView,\n} from '../serializer/sqliteSchema';\nimport { escapeSingleQuotes, type SQLiteDB } from '../utils';\nimport { getColumnCasing, sqlToStr } from './utils';\n\nexport const generateSqliteSnapshot = (\n\ttables: AnySQLiteTable[],\n\tviews: SQLiteView[],\n\tcasing: CasingType | undefined,\n): SQLiteSchemaInternal => {\n\tconst dialect = new SQLiteSyncDialect({ casing });\n\tconst result: Record<string, Table> = {};\n\tconst resultViews: Record<string, View> = {};\n\n\tconst internal: SQLiteKitInternals = { indexes: {} };\n\tfor (const table of tables) {\n\t\t// const tableName = getTableName(table);\n\t\tconst columnsObject: Record<string, Column> = {};\n\t\tconst indexesObject: Record<string, Index> = {};\n\t\tconst foreignKeysObject: Record<string, ForeignKey> = {};\n\t\tconst primaryKeysObject: Record<string, PrimaryKey> = {};\n\t\tconst uniqueConstraintObject: Record<string, UniqueConstraint> = {};\n\t\tconst checkConstraintObject: Record<string, CheckConstraint> = {};\n\n\t\tconst checksInTable: Record<string, string[]> = {};\n\n\t\tconst {\n\t\t\tname: tableName,\n\t\t\tcolumns,\n\t\t\tindexes,\n\t\t\tchecks,\n\t\t\tforeignKeys: tableForeignKeys,\n\t\t\tprimaryKeys,\n\t\t\tuniqueConstraints,\n\t\t} = getTableConfig(table);\n\n\t\tcolumns.forEach((column) => {\n\t\t\tconst name = getColumnCasing(column, casing);\n\t\t\tconst notNull: boolean = column.notNull;\n\t\t\tconst primaryKey: boolean = column.primary;\n\t\t\tconst generated = column.generated;\n\n\t\t\tconst columnToSet: Column = {\n\t\t\t\tname,\n\t\t\t\ttype: column.getSQLType(),\n\t\t\t\tprimaryKey,\n\t\t\t\tnotNull,\n\t\t\t\tautoincrement: is(column, SQLiteBaseInteger)\n\t\t\t\t\t? column.autoIncrement\n\t\t\t\t\t: false,\n\t\t\t\tgenerated: generated\n\t\t\t\t\t? {\n\t\t\t\t\t\tas: is(generated.as, SQL)\n\t\t\t\t\t\t\t? `(${dialect.sqlToQuery(generated.as as SQL, 'indexes').sql})`\n\t\t\t\t\t\t\t: typeof generated.as === 'function'\n\t\t\t\t\t\t\t? `(${dialect.sqlToQuery(generated.as() as SQL, 'indexes').sql})`\n\t\t\t\t\t\t\t: `(${generated.as as any})`,\n\t\t\t\t\t\ttype: generated.mode ?? 'virtual',\n\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t};\n\n\t\t\tif (column.default !== undefined) {\n\t\t\t\tif (is(column.default, SQL)) {\n\t\t\t\t\tcolumnToSet.default = sqlToStr(column.default, casing);\n\t\t\t\t} else {\n\t\t\t\t\tcolumnToSet.default = typeof column.default === 'string'\n\t\t\t\t\t\t? `'${escapeSingleQuotes(column.default)}'`\n\t\t\t\t\t\t: typeof column.default === 'object'\n\t\t\t\t\t\t\t\t|| Array.isArray(column.default)\n\t\t\t\t\t\t? `'${JSON.stringify(column.default)}'`\n\t\t\t\t\t\t: column.default;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcolumnsObject[name] = columnToSet;\n\n\t\t\tif (column.isUnique) {\n\t\t\t\tconst existingUnique = indexesObject[column.uniqueName!];\n\t\t\t\tif (typeof existingUnique !== 'undefined') {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(`We\\'ve found duplicated unique constraint names in ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} table. \n          The unique constraint ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tcolumn.uniqueName,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} on the ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} column is confilcting with a unique constraint name already defined for ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\texistingUnique.columns.join(','),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} columns\\n`)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tindexesObject[column.uniqueName!] = {\n\t\t\t\t\tname: column.uniqueName!,\n\t\t\t\t\tcolumns: [columnToSet.name],\n\t\t\t\t\tisUnique: true,\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\n\t\tconst foreignKeys: ForeignKey[] = tableForeignKeys.map((fk) => {\n\t\t\tconst tableFrom = tableName;\n\t\t\tconst onDelete = fk.onDelete ?? 'no action';\n\t\t\tconst onUpdate = fk.onUpdate ?? 'no action';\n\t\t\tconst reference = fk.reference();\n\n\t\t\tconst referenceFT = reference.foreignTable;\n\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\tconst tableTo = getTableName(referenceFT);\n\n\t\t\tconst originalColumnsFrom = reference.columns.map((it) => it.name);\n\t\t\tconst columnsFrom = reference.columns.map((it) => getColumnCasing(it, casing));\n\t\t\tconst originalColumnsTo = reference.foreignColumns.map((it) => it.name);\n\t\t\tconst columnsTo = reference.foreignColumns.map((it) => getColumnCasing(it, casing));\n\n\t\t\tlet name = fk.getName();\n\t\t\tif (casing !== undefined) {\n\t\t\t\tfor (let i = 0; i < originalColumnsFrom.length; i++) {\n\t\t\t\t\tname = name.replace(originalColumnsFrom[i], columnsFrom[i]);\n\t\t\t\t}\n\t\t\t\tfor (let i = 0; i < originalColumnsTo.length; i++) {\n\t\t\t\t\tname = name.replace(originalColumnsTo[i], columnsTo[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\ttableFrom,\n\t\t\t\ttableTo,\n\t\t\t\tcolumnsFrom,\n\t\t\t\tcolumnsTo,\n\t\t\t\tonDelete,\n\t\t\t\tonUpdate,\n\t\t\t} as ForeignKey;\n\t\t});\n\n\t\tforeignKeys.forEach((it) => {\n\t\t\tforeignKeysObject[it.name] = it;\n\t\t});\n\n\t\tindexes.forEach((value) => {\n\t\t\tconst columns = value.config.columns;\n\t\t\tconst name = value.config.name;\n\n\t\t\tlet indexColumns = columns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\tconst sql = dialect.sqlToQuery(it, 'indexes').sql;\n\t\t\t\t\tif (typeof internal!.indexes![name] === 'undefined') {\n\t\t\t\t\t\tinternal!.indexes![name] = {\n\t\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\t\t[sql]: {\n\t\t\t\t\t\t\t\t\tisExpression: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (typeof internal!.indexes![name]?.columns[sql] === 'undefined') {\n\t\t\t\t\t\t\tinternal!.indexes![name]!.columns[sql] = {\n\t\t\t\t\t\t\t\tisExpression: true,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinternal!.indexes![name]!.columns[sql]!.isExpression = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn sql;\n\t\t\t\t} else {\n\t\t\t\t\treturn getColumnCasing(it, casing);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet where: string | undefined = undefined;\n\t\t\tif (value.config.where !== undefined) {\n\t\t\t\tif (is(value.config.where, SQL)) {\n\t\t\t\t\twhere = dialect.sqlToQuery(value.config.where).sql;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tindexesObject[name] = {\n\t\t\t\tname,\n\t\t\t\tcolumns: indexColumns,\n\t\t\t\tisUnique: value.config.unique ?? false,\n\t\t\t\twhere,\n\t\t\t};\n\t\t});\n\n\t\tuniqueConstraints?.map((unq) => {\n\t\t\tconst columnNames = unq.columns.map((c) => getColumnCasing(c, casing));\n\n\t\t\tconst name = unq.name ?? uniqueKeyName(table, columnNames);\n\n\t\t\tconst existingUnique = indexesObject[name];\n\t\t\tif (typeof existingUnique !== 'undefined') {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\n${\n\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t`We\\'ve found duplicated unique constraint names in ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} table. \\nThe unique constraint ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} on the ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\tcolumnNames.join(','),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} columns is confilcting with a unique constraint name already defined for ${\n\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\texistingUnique.columns.join(','),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} columns\\n`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tindexesObject[name] = {\n\t\t\t\tname: unq.name!,\n\t\t\t\tcolumns: columnNames,\n\t\t\t\tisUnique: true,\n\t\t\t};\n\t\t});\n\n\t\tprimaryKeys.forEach((it) => {\n\t\t\tif (it.columns.length > 1) {\n\t\t\t\tconst originalColumnNames = it.columns.map((c) => c.name);\n\t\t\t\tconst columnNames = it.columns.map((c) => getColumnCasing(c, casing));\n\n\t\t\t\tlet name = it.getName();\n\t\t\t\tif (casing !== undefined) {\n\t\t\t\t\tfor (let i = 0; i < originalColumnNames.length; i++) {\n\t\t\t\t\t\tname = name.replace(originalColumnNames[i], columnNames[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprimaryKeysObject[name] = {\n\t\t\t\t\tcolumns: columnNames,\n\t\t\t\t\tname,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tcolumnsObject[getColumnCasing(it.columns[0], casing)].primaryKey = true;\n\t\t\t}\n\t\t});\n\n\t\tchecks.forEach((check) => {\n\t\t\tconst checkName = check.name;\n\t\t\tif (typeof checksInTable[tableName] !== 'undefined') {\n\t\t\t\tif (checksInTable[tableName].includes(check.name)) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\\n${\n\t\t\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t\t\t`We\\'ve found duplicated check constraint name in ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}. Please rename your check constraint in the ${\n\t\t\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} table`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tchecksInTable[tableName].push(checkName);\n\t\t\t} else {\n\t\t\t\tchecksInTable[tableName] = [check.name];\n\t\t\t}\n\n\t\t\tcheckConstraintObject[checkName] = {\n\t\t\t\tname: checkName,\n\t\t\t\tvalue: dialect.sqlToQuery(check.value).sql,\n\t\t\t};\n\t\t});\n\n\t\tresult[tableName] = {\n\t\t\tname: tableName,\n\t\t\tcolumns: columnsObject,\n\t\t\tindexes: indexesObject,\n\t\t\tforeignKeys: foreignKeysObject,\n\t\t\tcompositePrimaryKeys: primaryKeysObject,\n\t\t\tuniqueConstraints: uniqueConstraintObject,\n\t\t\tcheckConstraints: checkConstraintObject,\n\t\t};\n\t}\n\n\tfor (const view of views) {\n\t\tconst { name, isExisting, selectedFields, query, schema } = getViewConfig(view);\n\n\t\tconst columnsObject: Record<string, Column> = {};\n\n\t\tconst existingView = resultViews[name];\n\t\tif (typeof existingView !== 'undefined') {\n\t\t\tconsole.log(\n\t\t\t\t`\\n${\n\t\t\t\t\twithStyle.errorWarning(\n\t\t\t\t\t\t`We\\'ve found duplicated view name across ${\n\t\t\t\t\t\t\tchalk.underline.blue(\n\t\t\t\t\t\t\t\tschema ?? 'public',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} schema. Please rename your view`,\n\t\t\t\t\t)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tfor (const key in selectedFields) {\n\t\t\tif (is(selectedFields[key], SQLiteColumn)) {\n\t\t\t\tconst column = selectedFields[key];\n\t\t\t\tconst notNull: boolean = column.notNull;\n\t\t\t\tconst primaryKey: boolean = column.primary;\n\t\t\t\tconst generated = column.generated;\n\n\t\t\t\tconst columnToSet: Column = {\n\t\t\t\t\tname: column.name,\n\t\t\t\t\ttype: column.getSQLType(),\n\t\t\t\t\tprimaryKey,\n\t\t\t\t\tnotNull,\n\t\t\t\t\tautoincrement: is(column, SQLiteBaseInteger)\n\t\t\t\t\t\t? column.autoIncrement\n\t\t\t\t\t\t: false,\n\t\t\t\t\tgenerated: generated\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\tas: is(generated.as, SQL)\n\t\t\t\t\t\t\t\t? `(${dialect.sqlToQuery(generated.as as SQL, 'indexes').sql})`\n\t\t\t\t\t\t\t\t: typeof generated.as === 'function'\n\t\t\t\t\t\t\t\t? `(${dialect.sqlToQuery(generated.as() as SQL, 'indexes').sql})`\n\t\t\t\t\t\t\t\t: `(${generated.as as any})`,\n\t\t\t\t\t\t\ttype: generated.mode ?? 'virtual',\n\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\t};\n\n\t\t\t\tif (column.default !== undefined) {\n\t\t\t\t\tif (is(column.default, SQL)) {\n\t\t\t\t\t\tcolumnToSet.default = sqlToStr(column.default, casing);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcolumnToSet.default = typeof column.default === 'string'\n\t\t\t\t\t\t\t? `'${column.default}'`\n\t\t\t\t\t\t\t: typeof column.default === 'object'\n\t\t\t\t\t\t\t\t\t|| Array.isArray(column.default)\n\t\t\t\t\t\t\t? `'${JSON.stringify(column.default)}'`\n\t\t\t\t\t\t\t: column.default;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcolumnsObject[column.name] = columnToSet;\n\t\t\t}\n\t\t}\n\n\t\tresultViews[name] = {\n\t\t\tcolumns: columnsObject,\n\t\t\tname,\n\t\t\tisExisting,\n\t\t\tdefinition: isExisting ? undefined : dialect.sqlToQuery(query!).sql,\n\t\t};\n\t}\n\n\treturn {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: result,\n\t\tviews: resultViews,\n\t\tenums: {},\n\t\t_meta: {\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t\tinternal,\n\t};\n};\n\nfunction mapSqlToSqliteType(sqlType: string): string {\n\tconst lowered = sqlType.toLowerCase();\n\tif (\n\t\t[\n\t\t\t'int',\n\t\t\t'integer',\n\t\t\t'integer auto_increment',\n\t\t\t'tinyint',\n\t\t\t'smallint',\n\t\t\t'mediumint',\n\t\t\t'bigint',\n\t\t\t'unsigned big int',\n\t\t\t'int2',\n\t\t\t'int8',\n\t\t].some((it) => lowered.startsWith(it))\n\t) {\n\t\treturn 'integer';\n\t} else if (\n\t\t[\n\t\t\t'character',\n\t\t\t'varchar',\n\t\t\t'varying character',\n\t\t\t'national varying character',\n\t\t\t'nchar',\n\t\t\t'native character',\n\t\t\t'nvarchar',\n\t\t\t'text',\n\t\t\t'clob',\n\t\t].some((it) => lowered.startsWith(it))\n\t) {\n\t\tconst match = lowered.match(/\\d+/);\n\n\t\tif (match) {\n\t\t\treturn `text(${match[0]})`;\n\t\t}\n\n\t\treturn 'text';\n\t} else if (lowered.startsWith('blob')) {\n\t\treturn 'blob';\n\t} else if (\n\t\t['real', 'double', 'double precision', 'float'].some((it) => lowered.startsWith(it))\n\t) {\n\t\treturn 'real';\n\t} else {\n\t\treturn 'numeric';\n\t}\n}\n\ninterface ColumnInfo {\n\tcolumnName: string;\n\texpression: string;\n\ttype: 'stored' | 'virtual';\n}\n\nfunction extractGeneratedColumns(input: string): Record<string, ColumnInfo> {\n\tconst columns: Record<string, ColumnInfo> = {};\n\tconst lines = input.split(/,\\s*(?![^()]*\\))/); // Split by commas outside parentheses\n\n\tfor (const line of lines) {\n\t\tif (line.includes('GENERATED ALWAYS AS')) {\n\t\t\tconst parts = line.trim().split(/\\s+/);\n\t\t\tconst columnName = parts[0].replace(/[`'\"]/g, ''); // Remove quotes around the column name\n\t\t\tconst expression = line\n\t\t\t\t.substring(line.indexOf('('), line.indexOf(')') + 1)\n\t\t\t\t.trim();\n\n\t\t\t// Extract type ensuring to remove any trailing characters like ')'\n\t\t\tconst typeIndex = parts.findIndex((part) => part.match(/(stored|virtual)/i));\n\t\t\tlet type: ColumnInfo['type'] = 'virtual';\n\t\t\tif (typeIndex !== -1) {\n\t\t\t\ttype = parts[typeIndex]\n\t\t\t\t\t.replace(/[^a-z]/gi, '')\n\t\t\t\t\t.toLowerCase() as ColumnInfo['type'];\n\t\t\t}\n\n\t\t\tcolumns[columnName] = {\n\t\t\t\tcolumnName: columnName,\n\t\t\t\texpression: expression,\n\t\t\t\ttype,\n\t\t\t};\n\t\t}\n\t}\n\treturn columns;\n}\n\nfunction filterIgnoredTablesByField(fieldName: string) {\n\t// _cf_ is a prefix for internal Cloudflare D1 tables (e.g. _cf_KV, _cf_METADATA)\n\t// _litestream_ is a prefix for internal Litestream tables (e.g. _litestream_seq, _litestream_lock)\n\t// libsql_ is a prefix for internal libSQL tables (e.g. libsql_wasm_func_table)\n\t// sqlite_ is a prefix for internal SQLite tables (e.g. sqlite_sequence, sqlite_stat1)\n\treturn `${fieldName} != '__drizzle_migrations'\n\t\t\tAND ${fieldName} NOT LIKE '\\\\_cf\\\\_%' ESCAPE '\\\\'\n\t\t\tAND ${fieldName} NOT LIKE '\\\\_litestream\\\\_%' ESCAPE '\\\\'\n\t\t\tAND ${fieldName} NOT LIKE 'libsql\\\\_%' ESCAPE '\\\\'\n\t\t\tAND ${fieldName} NOT LIKE 'sqlite\\\\_%' ESCAPE '\\\\'`;\n}\n\nexport const fromDatabase = async (\n\tdb: SQLiteDB,\n\ttablesFilter: (table: string) => boolean = (table) => true,\n\tprogressCallback?: (\n\t\tstage: IntrospectStage,\n\t\tcount: number,\n\t\tstatus: IntrospectStatus,\n\t) => void,\n): Promise<SQLiteSchemaInternal> => {\n\tconst result: Record<string, Table> = {};\n\tconst resultViews: Record<string, View> = {};\n\n\tconst columns = await db.query<{\n\t\ttableName: string;\n\t\tcolumnName: string;\n\t\tcolumnType: string;\n\t\tnotNull: number;\n\t\tdefaultValue: string;\n\t\tpk: number;\n\t\tseq: number;\n\t\thidden: number;\n\t\tsql: string;\n\t\ttype: 'view' | 'table';\n\t}>(`SELECT \n\t\t  m.name as \"tableName\",\n\t\t  p.name as \"columnName\",\n\t\t  p.type as \"columnType\",\n\t\t  p.\"notnull\" as \"notNull\",\n\t\t  p.dflt_value as \"defaultValue\",\n\t\t  p.pk as pk,\n\t\t  p.hidden as hidden,\n\t\t  m.sql,\n\t\t  m.type as type\n\t\tFROM sqlite_master AS m\n\t\tJOIN pragma_table_xinfo(m.name) AS p\n\t\tWHERE (m.type = 'table' OR m.type = 'view') \n\t\t  AND ${filterIgnoredTablesByField('m.tbl_name')};`);\n\n\tconst tablesWithSeq: string[] = [];\n\n\tconst seq = await db.query<{\n\t\tname: string;\n\t}>(`SELECT\n\t\t  *\n\t\tFROM sqlite_master\n\t\tWHERE sql GLOB '*[ *' || CHAR(9) || CHAR(10) || CHAR(13) || ']AUTOINCREMENT[^'']*'\n    \t  AND ${filterIgnoredTablesByField('tbl_name')};`);\n\n\tfor (const s of seq) {\n\t\ttablesWithSeq.push(s.name);\n\t}\n\n\tlet columnsCount = 0;\n\tlet tablesCount = new Set();\n\tlet indexesCount = 0;\n\tlet foreignKeysCount = 0;\n\tlet checksCount = 0;\n\tlet viewsCount = 0;\n\n\t// append primaryKeys by table\n\tconst tableToPk: { [tname: string]: string[] } = {};\n\n\tlet tableToGeneratedColumnsInfo: Record<\n\t\tstring,\n\t\tRecord<string, ColumnInfo>\n\t> = {};\n\n\tfor (const column of columns) {\n\t\tif (!tablesFilter(column.tableName)) continue;\n\n\t\t// TODO\n\t\tif (column.type !== 'view') {\n\t\t\tcolumnsCount += 1;\n\t\t}\n\t\tif (progressCallback) {\n\t\t\tprogressCallback('columns', columnsCount, 'fetching');\n\t\t}\n\t\tconst tableName = column.tableName;\n\n\t\ttablesCount.add(tableName);\n\t\tif (progressCallback) {\n\t\t\tprogressCallback('tables', tablesCount.size, 'fetching');\n\t\t}\n\t\tconst columnName = column.columnName;\n\t\tconst isNotNull = column.notNull === 1; // 'YES', 'NO'\n\t\tconst columnType = column.columnType; // varchar(256)\n\t\tconst isPrimary = column.pk !== 0; // 'PRI', ''\n\t\tconst columnDefault: string = column.defaultValue;\n\n\t\tconst isAutoincrement = isPrimary && tablesWithSeq.includes(tableName);\n\n\t\tif (isPrimary) {\n\t\t\tif (typeof tableToPk[tableName] === 'undefined') {\n\t\t\t\ttableToPk[tableName] = [columnName];\n\t\t\t} else {\n\t\t\t\ttableToPk[tableName].push(columnName);\n\t\t\t}\n\t\t}\n\n\t\tconst table = result[tableName];\n\n\t\tif (column.hidden === 2 || column.hidden === 3) {\n\t\t\tif (\n\t\t\t\ttypeof tableToGeneratedColumnsInfo[column.tableName] === 'undefined'\n\t\t\t) {\n\t\t\t\ttableToGeneratedColumnsInfo[column.tableName] = extractGeneratedColumns(\n\t\t\t\t\tcolumn.sql,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst newColumn: Column = {\n\t\t\tdefault: columnDefault === null\n\t\t\t\t? undefined\n\t\t\t\t: /^-?[\\d.]+(?:e-?\\d+)?$/.test(columnDefault)\n\t\t\t\t? Number(columnDefault)\n\t\t\t\t: ['CURRENT_TIME', 'CURRENT_DATE', 'CURRENT_TIMESTAMP'].includes(\n\t\t\t\t\t\tcolumnDefault,\n\t\t\t\t\t)\n\t\t\t\t? `(${columnDefault})`\n\t\t\t\t: columnDefault === 'false'\n\t\t\t\t? false\n\t\t\t\t: columnDefault === 'true'\n\t\t\t\t? true\n\t\t\t\t: columnDefault.startsWith(\"'\") && columnDefault.endsWith(\"'\")\n\t\t\t\t? columnDefault\n\t\t\t\t// ? columnDefault.substring(1, columnDefault.length - 1)\n\t\t\t\t: `(${columnDefault})`,\n\t\t\tautoincrement: isAutoincrement,\n\t\t\tname: columnName,\n\t\t\ttype: mapSqlToSqliteType(columnType),\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: isNotNull,\n\t\t\tgenerated: tableToGeneratedColumnsInfo[tableName]\n\t\t\t\t\t&& tableToGeneratedColumnsInfo[tableName][columnName]\n\t\t\t\t? {\n\t\t\t\t\ttype: tableToGeneratedColumnsInfo[tableName][columnName].type,\n\t\t\t\t\tas: tableToGeneratedColumnsInfo[tableName][columnName].expression,\n\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t};\n\n\t\tif (!table) {\n\t\t\tresult[tableName] = {\n\t\t\t\tname: tableName,\n\t\t\t\tcolumns: {\n\t\t\t\t\t[columnName]: newColumn,\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t};\n\t\t} else {\n\t\t\tresult[tableName]!.columns[columnName] = newColumn;\n\t\t}\n\t}\n\n\tfor (const [key, value] of Object.entries(tableToPk)) {\n\t\tif (value.length > 1) {\n\t\t\tresult[key].compositePrimaryKeys = {\n\t\t\t\t[`${key}_${value.join('_')}_pk`]: {\n\t\t\t\t\tcolumns: value,\n\t\t\t\t\tname: `${key}_${value.join('_')}_pk`,\n\t\t\t\t},\n\t\t\t};\n\t\t} else if (value.length === 1) {\n\t\t\tresult[key].columns[value[0]].primaryKey = true;\n\t\t} else {\n\t\t}\n\t}\n\n\tif (progressCallback) {\n\t\tprogressCallback('columns', columnsCount, 'done');\n\t\tprogressCallback('tables', tablesCount.size, 'done');\n\t}\n\ttry {\n\t\tconst fks = await db.query<{\n\t\t\ttableFrom: string;\n\t\t\ttableTo: string;\n\t\t\tfrom: string;\n\t\t\tto: string;\n\t\t\tonUpdate: string;\n\t\t\tonDelete: string;\n\t\t\tseq: number;\n\t\t\tid: number;\n\t\t}>(`SELECT\n\t\t\t  m.name as \"tableFrom\",\n\t\t\t  f.id as \"id\",\n\t\t\t  f.\"table\" as \"tableTo\",\n\t\t\t  f.\"from\",\n\t\t\t  f.\"to\",\n\t\t\t  f.\"on_update\" as \"onUpdate\",\n\t\t\t  f.\"on_delete\" as \"onDelete\",\n\t\t\t  f.seq as \"seq\"\n      \t\tFROM\n\t\t\t  sqlite_master m,\n\t\t\t  pragma_foreign_key_list(m.name) as f\n      \t\tWHERE ${filterIgnoredTablesByField('m.tbl_name')};`);\n\n\t\tconst fkByTableName: Record<string, ForeignKey> = {};\n\n\t\tfor (const fkRow of fks) {\n\t\t\tforeignKeysCount += 1;\n\t\t\tif (progressCallback) {\n\t\t\t\tprogressCallback('fks', foreignKeysCount, 'fetching');\n\t\t\t}\n\t\t\tconst tableName: string = fkRow.tableFrom;\n\t\t\tconst columnName: string = fkRow.from;\n\t\t\tconst refTableName = fkRow.tableTo;\n\t\t\tconst refColumnName: string = fkRow.to;\n\t\t\tconst updateRule: string = fkRow.onUpdate;\n\t\t\tconst deleteRule = fkRow.onDelete;\n\t\t\tconst sequence = fkRow.seq;\n\t\t\tconst id = fkRow.id;\n\n\t\t\tconst tableInResult = result[tableName];\n\t\t\tif (typeof tableInResult === 'undefined') continue;\n\n\t\t\tif (typeof fkByTableName[`${tableName}_${id}`] !== 'undefined') {\n\t\t\t\tfkByTableName[`${tableName}_${id}`]!.columnsFrom.push(columnName);\n\t\t\t\tfkByTableName[`${tableName}_${id}`]!.columnsTo.push(refColumnName);\n\t\t\t} else {\n\t\t\t\tfkByTableName[`${tableName}_${id}`] = {\n\t\t\t\t\tname: '',\n\t\t\t\t\ttableFrom: tableName,\n\t\t\t\t\ttableTo: refTableName,\n\t\t\t\t\tcolumnsFrom: [columnName],\n\t\t\t\t\tcolumnsTo: [refColumnName],\n\t\t\t\t\tonDelete: deleteRule?.toLowerCase(),\n\t\t\t\t\tonUpdate: updateRule?.toLowerCase(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst columnsFrom = fkByTableName[`${tableName}_${id}`].columnsFrom;\n\t\t\tconst columnsTo = fkByTableName[`${tableName}_${id}`].columnsTo;\n\t\t\tfkByTableName[\n\t\t\t\t`${tableName}_${id}`\n\t\t\t].name = `${tableName}_${\n\t\t\t\tcolumnsFrom.join(\n\t\t\t\t\t'_',\n\t\t\t\t)\n\t\t\t}_${refTableName}_${columnsTo.join('_')}_fk`;\n\t\t}\n\n\t\tfor (const idx of Object.keys(fkByTableName)) {\n\t\t\tconst value = fkByTableName[idx];\n\t\t\tresult[value.tableFrom].foreignKeys[value.name] = value;\n\t\t}\n\t} catch (e) {\n\t\t// console.log(`Can't proccess foreign keys`);\n\t}\n\tif (progressCallback) {\n\t\tprogressCallback('fks', foreignKeysCount, 'done');\n\t}\n\tconst idxs = await db.query<{\n\t\ttableName: string;\n\t\tindexName: string;\n\t\tcolumnName: string;\n\t\tisUnique: number;\n\t\tseq: string;\n\t}>(`SELECT \n    \t  m.tbl_name as tableName,\n    \t  il.name as indexName,\n    \t  ii.name as columnName,\n    \t  il.[unique] as isUnique,\n    \t  il.seq as seq\n\t\tFROM \n\t\t  sqlite_master AS m,\n    \t  pragma_index_list(m.name) AS il,\n    \t  pragma_index_info(il.name) AS ii\n\t\tWHERE \n\t\t  m.type = 'table' \n    \t  AND il.name NOT LIKE 'sqlite\\\\_autoindex\\\\_%' ESCAPE '\\\\'\n    \t  AND ${filterIgnoredTablesByField('m.tbl_name')};`);\n\n\tfor (const idxRow of idxs) {\n\t\tconst tableName = idxRow.tableName;\n\t\tconst constraintName = idxRow.indexName;\n\t\tconst columnName: string = idxRow.columnName;\n\t\tconst isUnique = idxRow.isUnique === 1;\n\n\t\tconst tableInResult = result[tableName];\n\t\tif (typeof tableInResult === 'undefined') continue;\n\n\t\tindexesCount += 1;\n\t\tif (progressCallback) {\n\t\t\tprogressCallback('indexes', indexesCount, 'fetching');\n\t\t}\n\n\t\tif (\n\t\t\ttypeof tableInResult.indexes[constraintName] !== 'undefined'\n\t\t\t&& columnName\n\t\t) {\n\t\t\ttableInResult.indexes[constraintName]!.columns.push(columnName);\n\t\t} else {\n\t\t\ttableInResult.indexes[constraintName] = {\n\t\t\t\tname: constraintName,\n\t\t\t\tcolumns: columnName ? [columnName] : [],\n\t\t\t\tisUnique: isUnique,\n\t\t\t};\n\t\t}\n\t\t// if (isUnique) {\n\t\t//   if (typeof tableInResult.uniqueConstraints[constraintName] !== \"undefined\") {\n\t\t//     tableInResult.uniqueConstraints[constraintName]!.columns.push(columnName);\n\t\t//   } else {\n\t\t//     tableInResult.uniqueConstraints[constraintName] = {\n\t\t//       name: constraintName,\n\t\t//       columns: [columnName],\n\t\t//     };\n\t\t//   }\n\t\t// } else {\n\t\t//   if (typeof tableInResult.indexes[constraintName] !== \"undefined\") {\n\t\t//     tableInResult.indexes[constraintName]!.columns.push(columnName);\n\t\t//   } else {\n\t\t//     tableInResult.indexes[constraintName] = {\n\t\t//       name: constraintName,\n\t\t//       columns: [columnName],\n\t\t//       isUnique: isUnique,\n\t\t//     };\n\t\t//   }\n\t\t// }\n\t}\n\tif (progressCallback) {\n\t\tprogressCallback('indexes', indexesCount, 'done');\n\t\t// progressCallback(\"enums\", 0, \"fetching\");\n\t\tprogressCallback('enums', 0, 'done');\n\t}\n\n\tconst views = await db.query(\n\t\t`SELECT name AS view_name, sql AS sql FROM sqlite_master WHERE type = 'view';`,\n\t);\n\n\tviewsCount = views.length;\n\n\tif (progressCallback) {\n\t\tprogressCallback('views', viewsCount, 'fetching');\n\t}\n\tfor (const view of views) {\n\t\tconst viewName = view['view_name'];\n\t\tconst sql = view['sql'];\n\n\t\tconst regex = new RegExp(`\\\\bAS\\\\b\\\\s+(SELECT.+)$`, 'i');\n\t\tconst match = sql.match(regex);\n\n\t\tif (!match) {\n\t\t\tconsole.log('Could not process view');\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst viewDefinition = match[1] as string;\n\n\t\tconst columns = result[viewName].columns;\n\t\tdelete result[viewName];\n\n\t\tresultViews[viewName] = {\n\t\t\tcolumns: columns,\n\t\t\tisExisting: false,\n\t\t\tname: viewName,\n\t\t\tdefinition: viewDefinition,\n\t\t};\n\t}\n\tif (progressCallback) {\n\t\tprogressCallback('views', viewsCount, 'done');\n\t}\n\n\tconst namedCheckPattern = /CONSTRAINT\\s*[\"']?(\\w+)[\"']?\\s*CHECK\\s*\\((.*?)\\)/gi;\n\tconst unnamedCheckPattern = /CHECK\\s*\\((.*?)\\)/gi;\n\tlet checkCounter = 0;\n\tconst checkConstraints: Record<string, CheckConstraint> = {};\n\tconst checks = await db.query<{\n\t\ttableName: string;\n\t\tsql: string;\n\t}>(`SELECT\n\t\t  name as \"tableName\",\n\t\t  sql as \"sql\"\n\t\tFROM sqlite_master \n\t\tWHERE type = 'table'\n\t\t  AND ${filterIgnoredTablesByField('tbl_name')};`);\n\tfor (const check of checks) {\n\t\tif (!tablesFilter(check.tableName)) continue;\n\n\t\tconst { tableName, sql } = check;\n\n\t\t// Find named CHECK constraints\n\t\tlet namedChecks = [...sql.matchAll(namedCheckPattern)];\n\t\tif (namedChecks.length > 0) {\n\t\t\tnamedChecks.forEach(([_, checkName, checkValue]) => {\n\t\t\t\tcheckConstraints[checkName] = {\n\t\t\t\t\tname: checkName,\n\t\t\t\t\tvalue: checkValue.trim(),\n\t\t\t\t};\n\t\t\t});\n\t\t} else {\n\t\t\t// If no named constraints, find unnamed CHECK constraints and assign names\n\t\t\tlet unnamedChecks = [...sql.matchAll(unnamedCheckPattern)];\n\t\t\tunnamedChecks.forEach(([_, checkValue]) => {\n\t\t\t\tlet checkName = `${tableName}_check_${++checkCounter}`;\n\t\t\t\tcheckConstraints[checkName] = {\n\t\t\t\t\tname: checkName,\n\t\t\t\t\tvalue: checkValue.trim(),\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\n\t\tchecksCount += Object.values(checkConstraints).length;\n\t\tif (progressCallback) {\n\t\t\tprogressCallback('checks', checksCount, 'fetching');\n\t\t}\n\n\t\tconst table = result[tableName];\n\n\t\tif (!table) {\n\t\t\tresult[tableName] = {\n\t\t\t\tname: tableName,\n\t\t\t\tcolumns: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: checkConstraints,\n\t\t\t};\n\t\t} else {\n\t\t\tresult[tableName]!.checkConstraints = checkConstraints;\n\t\t}\n\t}\n\n\tif (progressCallback) {\n\t\tprogressCallback('checks', checksCount, 'done');\n\t}\n\n\treturn {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: result,\n\t\tviews: resultViews,\n\t\tenums: {},\n\t\t_meta: {\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/serializer/studio.ts",
    "content": "/// <reference types=\"@cloudflare/workers-types\" />\nimport type { PGlite } from '@electric-sql/pglite';\nimport { serve } from '@hono/node-server';\nimport { zValidator } from '@hono/zod-validator';\nimport { createHash } from 'crypto';\nimport type { AnyColumn, AnyTable } from 'drizzle-orm';\nimport { is } from 'drizzle-orm';\nimport type { AnyMySqlTable } from 'drizzle-orm/mysql-core';\nimport { getTableConfig as mysqlTableConfig, MySqlTable } from 'drizzle-orm/mysql-core';\nimport type { AnyPgTable } from 'drizzle-orm/pg-core';\nimport { getTableConfig as pgTableConfig, PgTable } from 'drizzle-orm/pg-core';\nimport type { TablesRelationalConfig } from 'drizzle-orm/relations';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\tMany,\n\tnormalizeRelation,\n\tOne,\n\tRelations,\n} from 'drizzle-orm/relations';\nimport type { AnySingleStoreTable } from 'drizzle-orm/singlestore-core';\nimport { getTableConfig as singlestoreTableConfig, SingleStoreTable } from 'drizzle-orm/singlestore-core';\nimport type { AnySQLiteTable } from 'drizzle-orm/sqlite-core';\nimport { getTableConfig as sqliteTableConfig, SQLiteTable } from 'drizzle-orm/sqlite-core';\nimport fs from 'fs';\nimport { Hono } from 'hono';\nimport { compress } from 'hono/compress';\nimport { cors } from 'hono/cors';\nimport { createServer } from 'node:https';\nimport type { CasingType } from 'src/cli/validations/common';\nimport type { LibSQLCredentials } from 'src/cli/validations/libsql';\nimport { assertUnreachable } from 'src/global';\nimport { z } from 'zod';\nimport { safeRegister } from '../cli/commands/utils';\nimport type { MysqlCredentials } from '../cli/validations/mysql';\nimport type { PostgresCredentials } from '../cli/validations/postgres';\nimport type { SingleStoreCredentials } from '../cli/validations/singlestore';\nimport type { SqliteCredentials } from '../cli/validations/sqlite';\nimport type { Proxy, TransactionProxy } from '../utils';\nimport { prepareFilenames } from '.';\nimport { getColumnCasing } from './utils';\n\ntype CustomDefault = {\n\tschema: string;\n\ttable: string;\n\tcolumn: string;\n\tfunc: () => unknown;\n};\n\ntype SchemaFile = {\n\tname: string;\n\tcontent: string;\n};\n\nexport type Setup = {\n\tdbHash: string;\n\tdialect: 'postgresql' | 'mysql' | 'sqlite' | 'singlestore';\n\tpackageName:\n\t\t| '@aws-sdk/client-rds-data'\n\t\t| 'pglite'\n\t\t| 'pg'\n\t\t| 'postgres'\n\t\t| '@vercel/postgres'\n\t\t| '@neondatabase/serverless'\n\t\t| 'gel'\n\t\t| 'mysql2'\n\t\t| '@planetscale/database'\n\t\t| 'd1-http'\n\t\t| 'd1'\n\t\t| '@libsql/client'\n\t\t| 'better-sqlite3';\n\tdriver?: 'aws-data-api' | 'd1-http' | 'd1' | 'turso' | 'pglite';\n\tdatabaseName?: string; // for planetscale (driver remove database name from connection string)\n\tproxy: Proxy;\n\ttransactionProxy: TransactionProxy;\n\tcustomDefaults: CustomDefault[];\n\tschema: Record<string, Record<string, AnyTable<any>>>;\n\trelations: Record<string, Relations>;\n\tcasing?: CasingType;\n\tschemaFiles?: SchemaFile[];\n};\n\nexport type ProxyParams = {\n\tsql: string;\n\tparams?: any[];\n\ttypings?: any[];\n\tmode: 'array' | 'object';\n\tmethod: 'values' | 'get' | 'all' | 'run' | 'execute';\n};\n\nexport const preparePgSchema = async (path: string | string[]) => {\n\tconst imports = prepareFilenames(path);\n\tconst pgSchema: Record<string, Record<string, AnyPgTable>> = {};\n\tconst relations: Record<string, Relations> = {};\n\n\t// files content as string\n\tconst files = imports.map((it, index) => ({\n\t\t// get the file name from the path\n\t\tname: it.split('/').pop() || `schema${index}.ts`,\n\t\tcontent: fs.readFileSync(it, 'utf-8'),\n\t}));\n\n\tawait safeRegister(async () => {\n\t\tfor (let i = 0; i < imports.length; i++) {\n\t\t\tconst it = imports[i];\n\n\t\t\tconst i0: Record<string, unknown> = require(`${it}`);\n\t\t\tconst i0values = Object.entries(i0);\n\n\t\t\ti0values.forEach(([k, t]) => {\n\t\t\t\tif (is(t, PgTable)) {\n\t\t\t\t\tconst schema = pgTableConfig(t).schema || 'public';\n\t\t\t\t\tpgSchema[schema] = pgSchema[schema] || {};\n\t\t\t\t\tpgSchema[schema][k] = t;\n\t\t\t\t}\n\n\t\t\t\tif (is(t, Relations)) {\n\t\t\t\t\trelations[k] = t;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\treturn { schema: pgSchema, relations, files };\n};\n\nexport const prepareMySqlSchema = async (path: string | string[]) => {\n\tconst imports = prepareFilenames(path);\n\tconst mysqlSchema: Record<string, Record<string, AnyMySqlTable>> = {\n\t\tpublic: {},\n\t};\n\tconst relations: Record<string, Relations> = {};\n\n\t// files content as string\n\tconst files = imports.map((it, index) => ({\n\t\t// get the file name from the path\n\t\tname: it.split('/').pop() || `schema${index}.ts`,\n\t\tcontent: fs.readFileSync(it, 'utf-8'),\n\t}));\n\n\tawait safeRegister(async () => {\n\t\tfor (let i = 0; i < imports.length; i++) {\n\t\t\tconst it = imports[i];\n\n\t\t\tconst i0: Record<string, unknown> = require(`${it}`);\n\t\t\tconst i0values = Object.entries(i0);\n\n\t\t\ti0values.forEach(([k, t]) => {\n\t\t\t\tif (is(t, MySqlTable)) {\n\t\t\t\t\tconst schema = mysqlTableConfig(t).schema || 'public';\n\t\t\t\t\tmysqlSchema[schema][k] = t;\n\t\t\t\t}\n\n\t\t\t\tif (is(t, Relations)) {\n\t\t\t\t\trelations[k] = t;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\treturn { schema: mysqlSchema, relations, files };\n};\n\nexport const prepareSQLiteSchema = async (path: string | string[]) => {\n\tconst imports = prepareFilenames(path);\n\tconst sqliteSchema: Record<string, Record<string, AnySQLiteTable>> = {\n\t\tpublic: {},\n\t};\n\tconst relations: Record<string, Relations> = {};\n\n\t// files content as string\n\tconst files = imports.map((it, index) => ({\n\t\t// get the file name from the path\n\t\tname: it.split('/').pop() || `schema${index}.ts`,\n\t\tcontent: fs.readFileSync(it, 'utf-8'),\n\t}));\n\n\tawait safeRegister(async () => {\n\t\tfor (let i = 0; i < imports.length; i++) {\n\t\t\tconst it = imports[i];\n\n\t\t\tconst i0: Record<string, unknown> = require(`${it}`);\n\t\t\tconst i0values = Object.entries(i0);\n\n\t\t\ti0values.forEach(([k, t]) => {\n\t\t\t\tif (is(t, SQLiteTable)) {\n\t\t\t\t\tconst schema = 'public'; // sqlite does not have schemas\n\t\t\t\t\tsqliteSchema[schema][k] = t;\n\t\t\t\t}\n\n\t\t\t\tif (is(t, Relations)) {\n\t\t\t\t\trelations[k] = t;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\treturn { schema: sqliteSchema, relations, files };\n};\n\nexport const prepareSingleStoreSchema = async (path: string | string[]) => {\n\tconst imports = prepareFilenames(path);\n\tconst singlestoreSchema: Record<\n\t\tstring,\n\t\tRecord<string, AnySingleStoreTable>\n\t> = {\n\t\tpublic: {},\n\t};\n\tconst relations: Record<string, Relations> = {};\n\n\t// files content as string\n\tconst files = imports.map((it, index) => ({\n\t\t// get the file name from the path\n\t\tname: it.split('/').pop() || `schema${index}.ts`,\n\t\tcontent: fs.readFileSync(it, 'utf-8'),\n\t}));\n\n\tawait safeRegister(async () => {\n\t\tfor (let i = 0; i < imports.length; i++) {\n\t\t\tconst it = imports[i];\n\n\t\t\tconst i0: Record<string, unknown> = require(`${it}`);\n\t\t\tconst i0values = Object.entries(i0);\n\n\t\t\ti0values.forEach(([k, t]) => {\n\t\t\t\tif (is(t, SingleStoreTable)) {\n\t\t\t\t\tconst schema = singlestoreTableConfig(t).schema || 'public';\n\t\t\t\t\tsinglestoreSchema[schema][k] = t;\n\t\t\t\t}\n\n\t\t\t\tif (is(t, Relations)) {\n\t\t\t\t\trelations[k] = t;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\treturn { schema: singlestoreSchema, relations, files };\n};\n\nconst getCustomDefaults = <T extends AnyTable<{}>>(\n\tschema: Record<string, Record<string, T>>,\n\tcasing?: CasingType,\n): CustomDefault[] => {\n\tconst customDefaults: CustomDefault[] = [];\n\n\tObject.entries(schema).map(([schema, tables]) => {\n\t\tObject.entries(tables).map(([, table]) => {\n\t\t\tlet tableConfig: {\n\t\t\t\tname: string;\n\t\t\t\tcolumns: AnyColumn[];\n\t\t\t};\n\t\t\tif (is(table, PgTable)) {\n\t\t\t\ttableConfig = pgTableConfig(table);\n\t\t\t} else if (is(table, MySqlTable)) {\n\t\t\t\ttableConfig = mysqlTableConfig(table);\n\t\t\t} else if (is(table, SQLiteTable)) {\n\t\t\t\ttableConfig = sqliteTableConfig(table);\n\t\t\t} else {\n\t\t\t\ttableConfig = singlestoreTableConfig(table as SingleStoreTable);\n\t\t\t}\n\n\t\t\ttableConfig.columns.map((column) => {\n\t\t\t\tif (column.defaultFn) {\n\t\t\t\t\tcustomDefaults.push({\n\t\t\t\t\t\tschema,\n\t\t\t\t\t\ttable: tableConfig.name,\n\t\t\t\t\t\tcolumn: getColumnCasing(column, casing),\n\t\t\t\t\t\tfunc: column.defaultFn,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n\n\treturn customDefaults;\n};\n\nexport const drizzleForPostgres = async (\n\tcredentials: PostgresCredentials | {\n\t\tdriver: 'pglite';\n\t\tclient: PGlite;\n\t},\n\tpgSchema: Record<string, Record<string, AnyPgTable>>,\n\trelations: Record<string, Relations>,\n\tschemaFiles?: SchemaFile[],\n\tcasing?: CasingType,\n): Promise<Setup> => {\n\tconst { preparePostgresDB } = await import('../cli/connections');\n\tconst db = await preparePostgresDB(credentials);\n\tconst customDefaults = getCustomDefaults(pgSchema, casing);\n\n\tlet dbUrl: string;\n\n\tif ('driver' in credentials) {\n\t\tconst { driver } = credentials;\n\t\tif (driver === 'aws-data-api') {\n\t\t\tdbUrl = `aws-data-api://${credentials.database}/${credentials.secretArn}/${credentials.resourceArn}`;\n\t\t} else if (driver === 'pglite') {\n\t\t\tdbUrl = 'client' in credentials ? credentials.client.dataDir || 'pglite://custom-client' : credentials.url;\n\t\t} else {\n\t\t\tassertUnreachable(driver);\n\t\t}\n\t} else if ('url' in credentials) {\n\t\tdbUrl = credentials.url;\n\t} else {\n\t\tdbUrl =\n\t\t\t`postgresql://${credentials.user}:${credentials.password}@${credentials.host}:${credentials.port}/${credentials.database}`;\n\t}\n\n\tconst dbHash = createHash('sha256').update(dbUrl).digest('hex');\n\n\treturn {\n\t\tdbHash,\n\t\tdialect: 'postgresql',\n\t\tdriver: 'driver' in credentials ? credentials.driver : undefined,\n\t\tpackageName: db.packageName,\n\t\tproxy: db.proxy,\n\t\ttransactionProxy: db.transactionProxy,\n\t\tcustomDefaults,\n\t\tschema: pgSchema,\n\t\trelations,\n\t\tschemaFiles,\n\t\tcasing,\n\t};\n};\n\nexport const drizzleForMySQL = async (\n\tcredentials: MysqlCredentials,\n\tmysqlSchema: Record<string, Record<string, AnyMySqlTable>>,\n\trelations: Record<string, Relations>,\n\tschemaFiles?: SchemaFile[],\n\tcasing?: CasingType,\n): Promise<Setup> => {\n\tconst { connectToMySQL } = await import('../cli/connections');\n\tconst { proxy, transactionProxy, database, packageName } = await connectToMySQL(credentials);\n\n\tconst customDefaults = getCustomDefaults(mysqlSchema, casing);\n\n\tlet dbUrl: string;\n\n\tif ('url' in credentials) {\n\t\tdbUrl = credentials.url;\n\t} else {\n\t\tdbUrl =\n\t\t\t`mysql://${credentials.user}:${credentials.password}@${credentials.host}:${credentials.port}/${credentials.database}`;\n\t}\n\n\tconst dbHash = createHash('sha256').update(dbUrl).digest('hex');\n\n\treturn {\n\t\tdbHash,\n\t\tdialect: 'mysql',\n\t\tpackageName,\n\t\tdatabaseName: database,\n\t\tproxy,\n\t\ttransactionProxy,\n\t\tcustomDefaults,\n\t\tschema: mysqlSchema,\n\t\trelations,\n\t\tschemaFiles,\n\t\tcasing,\n\t};\n};\n\n// D1 binding credentials type (mirrors the one in connections.ts)\ntype D1BindingCredentials = {\n\tdriver: 'd1';\n\tbinding: D1Database;\n};\n\nexport const drizzleForSQLite = async (\n\tcredentials: SqliteCredentials | D1BindingCredentials,\n\tsqliteSchema: Record<string, Record<string, AnySQLiteTable>>,\n\trelations: Record<string, Relations>,\n\tschemaFiles?: SchemaFile[],\n\tcasing?: CasingType,\n): Promise<Setup> => {\n\tconst customDefaults = getCustomDefaults(sqliteSchema, casing);\n\n\tif ('driver' in credentials && credentials.driver === 'd1') {\n\t\tconst { connectToD1 } = await import('../cli/connections');\n\t\tconst sqliteDB = await connectToD1(credentials.binding);\n\n\t\tconst dbUrl = 'd1://binding';\n\t\tconst dbHash = createHash('sha256').update(dbUrl).digest('hex');\n\n\t\treturn {\n\t\t\tdbHash,\n\t\t\tdialect: 'sqlite',\n\t\t\tdriver: 'd1',\n\t\t\tpackageName: 'd1',\n\t\t\tproxy: sqliteDB.proxy,\n\t\t\ttransactionProxy: sqliteDB.transactionProxy,\n\t\t\tcustomDefaults,\n\t\t\tschema: sqliteSchema,\n\t\t\trelations,\n\t\t\tschemaFiles,\n\t\t\tcasing,\n\t\t};\n\t}\n\n\tconst { connectToSQLite } = await import('../cli/connections');\n\tconst sqliteDB = await connectToSQLite(credentials);\n\n\tlet dbUrl: string;\n\n\tif ('driver' in credentials) {\n\t\tconst { driver } = credentials;\n\t\tif (driver === 'd1-http') {\n\t\t\tdbUrl = `d1-http://${credentials.accountId}/${credentials.databaseId}/${credentials.token}`;\n\t\t} else {\n\t\t\tassertUnreachable(driver);\n\t\t}\n\t} else {\n\t\tdbUrl = credentials.url;\n\t}\n\n\tconst dbHash = createHash('sha256').update(dbUrl).digest('hex');\n\n\treturn {\n\t\tdbHash,\n\t\tdialect: 'sqlite',\n\t\tdriver: 'driver' in credentials ? credentials.driver : undefined,\n\t\tpackageName: sqliteDB.packageName,\n\t\tproxy: sqliteDB.proxy,\n\t\ttransactionProxy: sqliteDB.transactionProxy,\n\t\tcustomDefaults,\n\t\tschema: sqliteSchema,\n\t\trelations,\n\t\tschemaFiles,\n\t\tcasing,\n\t};\n};\nexport const drizzleForLibSQL = async (\n\tcredentials: LibSQLCredentials,\n\tsqliteSchema: Record<string, Record<string, AnySQLiteTable>>,\n\trelations: Record<string, Relations>,\n\tschemaFiles?: SchemaFile[],\n\tcasing?: CasingType,\n): Promise<Setup> => {\n\tconst { connectToLibSQL } = await import('../cli/connections');\n\n\tconst sqliteDB = await connectToLibSQL(credentials);\n\tconst customDefaults = getCustomDefaults(sqliteSchema, casing);\n\n\tlet dbUrl: string = `turso://${credentials.url}/${credentials.authToken}`;\n\n\tconst dbHash = createHash('sha256').update(dbUrl).digest('hex');\n\n\treturn {\n\t\tdbHash,\n\t\tdialect: 'sqlite',\n\t\tdriver: undefined,\n\t\tpackageName: sqliteDB.packageName,\n\t\tproxy: sqliteDB.proxy,\n\t\ttransactionProxy: sqliteDB.transactionProxy,\n\t\tcustomDefaults,\n\t\tschema: sqliteSchema,\n\t\trelations,\n\t\tschemaFiles,\n\t\tcasing,\n\t};\n};\n\nexport const drizzleForSingleStore = async (\n\tcredentials: SingleStoreCredentials,\n\tsinglestoreSchema: Record<string, Record<string, AnySingleStoreTable>>,\n\trelations: Record<string, Relations>,\n\tschemaFiles?: SchemaFile[],\n\tcasing?: CasingType,\n): Promise<Setup> => {\n\tconst { connectToSingleStore } = await import('../cli/connections');\n\tconst { proxy, transactionProxy, database, packageName } = await connectToSingleStore(credentials);\n\n\tconst customDefaults = getCustomDefaults(singlestoreSchema, casing);\n\n\tlet dbUrl: string;\n\n\tif ('url' in credentials) {\n\t\tdbUrl = credentials.url;\n\t} else {\n\t\tdbUrl =\n\t\t\t`singlestore://${credentials.user}:${credentials.password}@${credentials.host}:${credentials.port}/${credentials.database}`;\n\t}\n\n\tconst dbHash = createHash('sha256').update(dbUrl).digest('hex');\n\n\treturn {\n\t\tdbHash,\n\t\tdialect: 'singlestore',\n\t\tdatabaseName: database,\n\t\tpackageName,\n\t\tproxy,\n\t\ttransactionProxy,\n\t\tcustomDefaults,\n\t\tschema: singlestoreSchema,\n\t\trelations,\n\t\tschemaFiles,\n\t\tcasing,\n\t};\n};\n\ntype Relation = {\n\tname: string;\n\ttype: 'one' | 'many';\n\ttable: string;\n\tschema: string;\n\tcolumns: string[];\n\trefTable: string;\n\trefSchema: string;\n\trefColumns: string[];\n};\n\nexport const extractRelations = (\n\ttablesConfig: {\n\t\ttables: TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t},\n\tcasing?: CasingType,\n): Relation[] => {\n\tconst relations = Object.values(tablesConfig.tables)\n\t\t.map((it) =>\n\t\t\tObject.entries(it.relations).map(([name, relation]) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst normalized = normalizeRelation(\n\t\t\t\t\t\ttablesConfig.tables,\n\t\t\t\t\t\ttablesConfig.tableNamesMap,\n\t\t\t\t\t\trelation,\n\t\t\t\t\t);\n\t\t\t\t\tconst rel = relation;\n\t\t\t\t\tconst refTableName = rel.referencedTableName;\n\t\t\t\t\tconst refTable = rel.referencedTable;\n\t\t\t\t\tconst fields = normalized.fields\n\t\t\t\t\t\t.map((it) => getColumnCasing(it, casing))\n\t\t\t\t\t\t.flat();\n\t\t\t\t\tconst refColumns = normalized.references\n\t\t\t\t\t\t.map((it) => getColumnCasing(it, casing))\n\t\t\t\t\t\t.flat();\n\n\t\t\t\t\tlet refSchema: string | undefined;\n\t\t\t\t\tif (is(refTable, PgTable)) {\n\t\t\t\t\t\trefSchema = pgTableConfig(refTable).schema;\n\t\t\t\t\t} else if (is(refTable, MySqlTable)) {\n\t\t\t\t\t\trefSchema = mysqlTableConfig(refTable).schema;\n\t\t\t\t\t} else if (is(refTable, SQLiteTable)) {\n\t\t\t\t\t\trefSchema = undefined;\n\t\t\t\t\t} else if (is(refTable, SingleStoreTable)) {\n\t\t\t\t\t\trefSchema = singlestoreTableConfig(refTable).schema;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error('unsupported dialect');\n\t\t\t\t\t}\n\n\t\t\t\t\tlet type: 'one' | 'many';\n\t\t\t\t\tif (is(rel, One)) {\n\t\t\t\t\t\ttype = 'one';\n\t\t\t\t\t} else if (is(rel, Many)) {\n\t\t\t\t\t\ttype = 'many';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error('unsupported relation type');\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\ttable: it.dbName,\n\t\t\t\t\t\tschema: it.schema || 'public',\n\t\t\t\t\t\tcolumns: fields,\n\t\t\t\t\t\trefTable: refTableName,\n\t\t\t\t\t\trefSchema: refSchema || 'public',\n\t\t\t\t\t\trefColumns: refColumns,\n\t\t\t\t\t};\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Invalid relation \"${relation.fieldName}\" for table \"${\n\t\t\t\t\t\t\tit.schema ? `${it.schema}.${it.dbName}` : it.dbName\n\t\t\t\t\t\t}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t})\n\t\t)\n\t\t.flat();\n\treturn relations;\n};\n\nconst init = z.object({\n\ttype: z.literal('init'),\n});\n\nconst proxySchema = z.object({\n\ttype: z.literal('proxy'),\n\tdata: z.object({\n\t\tsql: z.string(),\n\t\tparams: z.array(z.any()).optional(),\n\t\ttypings: z.string().array().optional(),\n\t\tmode: z.enum(['array', 'object']).default('object'),\n\t\tmethod: z.union([\n\t\t\tz.literal('values'),\n\t\t\tz.literal('get'),\n\t\t\tz.literal('all'),\n\t\t\tz.literal('run'),\n\t\t\tz.literal('execute'),\n\t\t]),\n\t}),\n});\n\nconst transactionProxySchema = z.object({\n\ttype: z.literal('tproxy'),\n\tdata: z\n\t\t.object({\n\t\t\tsql: z.string(),\n\t\t\tmethod: z\n\t\t\t\t.union([\n\t\t\t\t\tz.literal('values'),\n\t\t\t\t\tz.literal('get'),\n\t\t\t\t\tz.literal('all'),\n\t\t\t\t\tz.literal('run'),\n\t\t\t\t\tz.literal('execute'),\n\t\t\t\t])\n\t\t\t\t.optional(),\n\t\t})\n\t\t.array(),\n});\n\nconst defaultsSchema = z.object({\n\ttype: z.literal('defaults'),\n\tdata: z\n\t\t.array(\n\t\t\tz.object({\n\t\t\t\tschema: z.string(),\n\t\t\t\ttable: z.string(),\n\t\t\t\tcolumn: z.string(),\n\t\t\t}),\n\t\t)\n\t\t.min(1),\n});\n\nconst schema = z.union([\n\tinit,\n\tproxySchema,\n\ttransactionProxySchema,\n\tdefaultsSchema,\n]);\n\nconst jsonStringify = (data: any) => {\n\treturn JSON.stringify(data, (_key, value) => {\n\t\t// Convert Error to object\n\t\tif (value instanceof Error) {\n\t\t\treturn {\n\t\t\t\terror: value.message,\n\t\t\t};\n\t\t}\n\n\t\t// Convert BigInt to string\n\t\tif (typeof value === 'bigint') {\n\t\t\treturn value.toString();\n\t\t}\n\n\t\t// Convert Buffer and ArrayBuffer to base64\n\t\tif (\n\t\t\t(value\n\t\t\t\t&& typeof value === 'object'\n\t\t\t\t&& 'type' in value\n\t\t\t\t&& 'data' in value\n\t\t\t\t&& value.type === 'Buffer')\n\t\t\t|| value instanceof ArrayBuffer\n\t\t\t|| value instanceof Buffer\n\t\t) {\n\t\t\treturn Buffer.from(value).toString('base64');\n\t\t}\n\n\t\treturn value;\n\t});\n};\n\nexport type Server = {\n\tstart: (params: {\n\t\thost: string;\n\t\tport: number;\n\t\tkey?: string;\n\t\tcert?: string;\n\t\tcb: (err: Error | null, address: string) => void;\n\t}) => void;\n};\n\nexport const prepareServer = async (\n\t{\n\t\tdialect,\n\t\tdriver,\n\t\tpackageName,\n\t\tdatabaseName,\n\t\tproxy,\n\t\ttransactionProxy,\n\t\tcustomDefaults,\n\t\tschema: drizzleSchema,\n\t\trelations,\n\t\tdbHash,\n\t\tcasing,\n\t\tschemaFiles,\n\t}: Setup,\n\tapp?: Hono,\n): Promise<Server> => {\n\tapp = app !== undefined ? app : new Hono();\n\n\tapp.use(compress());\n\tapp.use(async (ctx, next) => {\n\t\tawait next();\n\t\t// * https://wicg.github.io/private-network-access/#headers\n\t\t// * https://github.com/drizzle-team/drizzle-orm/issues/1857#issuecomment-2395724232\n\t\tctx.header('Access-Control-Allow-Private-Network', 'true');\n\t});\n\tapp.use(cors());\n\tapp.onError((err, ctx) => {\n\t\tconsole.error(err);\n\t\treturn ctx.json({\n\t\t\tstatus: 'error',\n\t\t\terror: err.message,\n\t\t});\n\t});\n\n\tconst relationalSchema: Record<string, unknown> = {\n\t\t...Object.fromEntries(\n\t\t\tObject.entries(drizzleSchema)\n\t\t\t\t.map(([schemaName, schema]) => {\n\t\t\t\t\t// have unique keys across schemas\n\t\t\t\t\tconst mappedTableEntries = Object.entries(schema).map(\n\t\t\t\t\t\t([tableName, table]) => {\n\t\t\t\t\t\t\treturn [`__${schemaName}__.${tableName}`, table];\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\treturn mappedTableEntries;\n\t\t\t\t})\n\t\t\t\t.flat(),\n\t\t),\n\t\t...relations,\n\t};\n\n\tconst relationsConfig = extractTablesRelationalConfig(\n\t\trelationalSchema,\n\t\tcreateTableRelationsHelpers,\n\t);\n\n\tapp.post('/', zValidator('json', schema), async (c) => {\n\t\tconst body = c.req.valid('json');\n\t\tconst { type } = body;\n\n\t\tif (type === 'init') {\n\t\t\tconst preparedDefaults = customDefaults.map((d) => ({\n\t\t\t\tschema: d.schema,\n\t\t\t\ttable: d.table,\n\t\t\t\tcolumn: d.column,\n\t\t\t}));\n\n\t\t\tlet relations: Relation[] = [];\n\t\t\t// Attempt to extract relations from the relational config.\n\t\t\t// An error may occur if the relations are ambiguous or misconfigured.\n\t\t\ttry {\n\t\t\t\trelations = extractRelations(relationsConfig, casing);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'Failed to extract relations. This is likely due to ambiguous or misconfigured relations.',\n\t\t\t\t);\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'Please check your schema and ensure that all relations are correctly defined.',\n\t\t\t\t);\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'See: https://orm.drizzle.team/docs/relations#disambiguating-relations',\n\t\t\t\t);\n\t\t\t\tconsole.warn('Error message:', (error as Error).message);\n\t\t\t}\n\n\t\t\treturn c.json({\n\t\t\t\tversion: '6.2',\n\t\t\t\tdialect,\n\t\t\t\tdriver,\n\t\t\t\tpackageName,\n\t\t\t\tschemaFiles,\n\t\t\t\tcustomDefaults: preparedDefaults,\n\t\t\t\trelations,\n\t\t\t\tdbHash,\n\t\t\t\tdatabaseName,\n\t\t\t});\n\t\t}\n\n\t\tif (type === 'proxy') {\n\t\t\tconst result = await proxy({\n\t\t\t\t...body.data,\n\t\t\t\tparams: body.data.params || [],\n\t\t\t});\n\t\t\treturn c.json(JSON.parse(jsonStringify(result)));\n\t\t}\n\n\t\tif (type === 'tproxy') {\n\t\t\tconst result = await transactionProxy(body.data);\n\t\t\treturn c.json(JSON.parse(jsonStringify(result)));\n\t\t}\n\n\t\tif (type === 'defaults') {\n\t\t\tconst columns = body.data;\n\n\t\t\tconst result = columns.map((column) => {\n\t\t\t\tconst found = customDefaults.find((d) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\td.schema === column.schema\n\t\t\t\t\t\t&& d.table === column.table\n\t\t\t\t\t\t&& d.column === column.column\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif (!found) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Custom default not found for ${column.schema}.${column.table}.${column.column}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst value = found.func();\n\n\t\t\t\treturn {\n\t\t\t\t\t...column,\n\t\t\t\t\tvalue,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\treturn c.json(JSON.parse(jsonStringify(result)));\n\t\t}\n\n\t\tthrow new Error(`Unknown type: ${type}`);\n\t});\n\n\treturn {\n\t\tstart: (params: Parameters<Server['start']>[0]) => {\n\t\t\tserve(\n\t\t\t\t{\n\t\t\t\t\tfetch: app!.fetch,\n\t\t\t\t\tcreateServer: params.key ? createServer : undefined,\n\t\t\t\t\thostname: params.host,\n\t\t\t\t\tport: params.port,\n\t\t\t\t\tserverOptions: {\n\t\t\t\t\t\tkey: params.key,\n\t\t\t\t\t\tcert: params.cert,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t() => params.cb(null, `${params.host}:${params.port}`),\n\t\t\t);\n\t\t},\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/src/serializer/utils.ts",
    "content": "import { SQL } from 'drizzle-orm';\nimport { CasingCache, toCamelCase, toSnakeCase } from 'drizzle-orm/casing';\nimport { CasingType } from '../cli/validations/common';\n\nexport function getColumnCasing(\n\tcolumn: { keyAsName: boolean; name: string | undefined },\n\tcasing: CasingType | undefined,\n) {\n\tif (!column.name) return '';\n\treturn !column.keyAsName || casing === undefined\n\t\t? column.name\n\t\t: casing === 'camelCase'\n\t\t? toCamelCase(column.name)\n\t\t: toSnakeCase(column.name);\n}\n\nexport const sqlToStr = (sql: SQL, casing: CasingType | undefined) => {\n\treturn sql.toQuery({\n\t\tescapeName: () => {\n\t\t\tthrow new Error(\"we don't support params for `sql` default values\");\n\t\t},\n\t\tescapeParam: () => {\n\t\t\tthrow new Error(\"we don't support params for `sql` default values\");\n\t\t},\n\t\tescapeString: () => {\n\t\t\tthrow new Error(\"we don't support params for `sql` default values\");\n\t\t},\n\t\tcasing: new CasingCache(casing),\n\t}).sql;\n};\n\nexport const sqlToStrGenerated = (sql: SQL, casing: CasingType | undefined) => {\n\treturn sql.toQuery({\n\t\tescapeName: () => {\n\t\t\tthrow new Error(\"we don't support params for `sql` default values\");\n\t\t},\n\t\tescapeParam: () => {\n\t\t\tthrow new Error(\"we don't support params for `sql` default values\");\n\t\t},\n\t\tescapeString: () => {\n\t\t\tthrow new Error(\"we don't support params for `sql` default values\");\n\t\t},\n\t\tcasing: new CasingCache(casing),\n\t}).sql;\n};\n"
  },
  {
    "path": "drizzle-kit/src/simulator.ts",
    "content": "declare global {\n\tinterface Array<T> {\n\t\texactlyOne(): T;\n\t}\n}\n\nArray.prototype.exactlyOne = function() {\n\tif (this.length !== 1) {\n\t\treturn undefined;\n\t}\n\treturn this[0];\n};\n\ninterface TablesHandler<T extends Named> {\n\tcan(added: T[], removed: T[]): boolean;\n\thandle(added: T[], removed: T[]): { created: T[]; deleted: T[]; renamed: { from: T; to: T }[] };\n}\n\ninterface ColumnsHandler<T extends Named> {\n\tcan(tableName: string, added: T[], removed: T[]): boolean;\n\thandle(\n\t\ttableName: string,\n\t\tadded: T[],\n\t\tremoved: T[],\n\t): { tableName: string; created: T[]; deleted: T[]; renamed: { from: T; to: T }[] };\n}\n\nclass DryRun<T extends Named> implements TablesHandler<T> {\n\tcan(added: T[], removed: T[]): boolean {\n\t\treturn added.length === 0 && removed.length === 0;\n\t}\n\thandle(added: T[], _: T[]): { created: T[]; deleted: T[]; renamed: { from: T; to: T }[] } {\n\t\treturn { created: added, deleted: [], renamed: [] };\n\t}\n}\n\n// class Fallback implements Handler {\n//     can(_: Table[], __: Table[]): boolean {\n//         return true\n//     }\n//     handle(added: Table[], _: Table[]): { created: Table[]; deleted: Table[]; renamed: { from: Table; to: Table; }[]; } {\n//         return { created: added, deleted: , renamed: [] }\n//     }\n// }\n\nclass Case1<T extends Named> implements TablesHandler<T> {\n\tcan(_: T[], removed: T[]): boolean {\n\t\treturn removed.length === 1 && removed[0].name === 'citiess';\n\t}\n\n\thandle(added: T[], removed: T[]): { created: T[]; deleted: T[]; renamed: { from: T; to: T }[] } {\n\t\treturn { created: added, deleted: removed, renamed: [] };\n\t}\n}\nclass Case2<T extends Named> implements TablesHandler<T> {\n\t// authOtp, deleted, users -> authOtp renamed, cities added, deleted deleted\n\tcan(_: T[], removed: T[]): boolean {\n\t\treturn removed.length === 3 && removed[0].name === 'auth_otp';\n\t}\n\n\thandle(added: T[], removed: T[]): { created: T[]; deleted: T[]; renamed: { from: T; to: T }[] } {\n\t\treturn { created: added.slice(1), deleted: removed.slice(1), renamed: [{ from: removed[0], to: added[0] }] };\n\t}\n}\n\ntype Named = { name: string };\n\nconst handlers: TablesHandler<any>[] = [];\nhandlers.push(new Case1());\nhandlers.push(new Case2());\nhandlers.push(new DryRun());\n\nexport const resolveTables = <T extends Named>(added: T[], removed: T[]) => {\n\tconst handler = handlers.filter((it) => {\n\t\treturn it.can(added, removed);\n\t}).exactlyOne();\n\n\tif (!handler) {\n\t\tconsole.log('added', added.map((it) => it.name).join());\n\t\tconsole.log('removed', removed.map((it) => it.name).join());\n\t\tthrow new Error('No handler');\n\t}\n\n\tconsole.log(`Simluated by ${handler.constructor.name}`);\n\treturn handler.handle(added, removed);\n};\nclass LehaColumnsHandler<T extends Named> implements ColumnsHandler<T> {\n\tcan(tableName: string, _: T[], __: T[]): boolean {\n\t\treturn tableName === 'users';\n\t}\n\n\thandle(\n\t\ttableName: string,\n\t\tadded: T[],\n\t\tremoved: T[],\n\t): { tableName: string; created: T[]; deleted: T[]; renamed: { from: T; to: T }[] } {\n\t\treturn { tableName, created: [], deleted: [], renamed: [{ from: removed[0], to: added[0] }] };\n\t}\n}\n\nclass DryRunColumnsHandler<T extends Named> implements ColumnsHandler<T> {\n\tcan(tableName: string, _: T[], __: T[]): boolean {\n\t\treturn true;\n\t}\n\n\thandle(\n\t\ttableName: string,\n\t\tadded: T[],\n\t\tremoved: T[],\n\t): { tableName: string; created: T[]; deleted: T[]; renamed: { from: T; to: T }[] } {\n\t\treturn { tableName, created: added, deleted: removed, renamed: [] };\n\t}\n}\n\nclass V1V2AuthOtpColumnsHandler<T extends Named> implements ColumnsHandler<T> {\n\tcan(tableName: string, _: T[], __: T[]): boolean {\n\t\treturn tableName === 'auth_otp';\n\t}\n\n\thandle(\n\t\ttableName: string,\n\t\tadded: T[],\n\t\tremoved: T[],\n\t): { tableName: string; created: T[]; deleted: T[]; renamed: { from: T; to: T }[] } {\n\t\tconst phonePrev = removed.filter((it) => it.name === 'phone')[0];\n\t\tconst phoneNew = added.filter((it) => it.name === 'phone1')[0];\n\n\t\tconst newAdded = added.filter((it) => it.name !== 'phone1');\n\t\tconst newRemoved = removed.filter((it) => it.name !== 'phone');\n\n\t\treturn { tableName, created: newAdded, deleted: newRemoved, renamed: [{ from: phonePrev, to: phoneNew }] };\n\t}\n\n\t// handle(tableName:string, added: T[], _: T[]): { created: T[]; deleted: T[]; renamed: { from: T; to: T; }[]; } {\n\t//     return { created: added, deleted: [], renamed: [] }\n\t// }\n}\n\nconst columnsHandlers: ColumnsHandler<any>[] = [];\ncolumnsHandlers.push(new V1V2AuthOtpColumnsHandler());\ncolumnsHandlers.push(new LehaColumnsHandler());\ncolumnsHandlers.push(new DryRunColumnsHandler());\n\nexport const resolveColumns = <T extends Named>(tableName: string, added: T[], removed: T[]) => {\n\tconst handler = columnsHandlers.filter((it) => {\n\t\treturn it.can(tableName, added, removed);\n\t})[0];\n\n\tif (!handler) {\n\t\tconsole.log('added', added.map((it) => it.name).join());\n\t\tconsole.log('removed', removed.map((it) => it.name).join());\n\t\tthrow new Error('No columns handler for table: ' + tableName);\n\t}\n\n\tconsole.log(`${tableName} columns simluated by ${handler.constructor.name}`);\n\treturn handler.handle(tableName, added, removed);\n};\n"
  },
  {
    "path": "drizzle-kit/src/snapshotsDiffer.ts",
    "content": "import {\n\tany,\n\tarray,\n\tboolean,\n\tenum as enumType,\n\tliteral,\n\tnever,\n\tobject,\n\trecord,\n\tstring,\n\tTypeOf,\n\tunion,\n\tZodTypeAny,\n} from 'zod';\nimport { applyJsonDiff, diffColumns, diffIndPolicies, diffPolicies, diffSchemasOrTables } from './jsonDiffer';\nimport { fromJson } from './sqlgenerator';\n\nimport {\n\t_prepareAddColumns,\n\t_prepareDropColumns,\n\t_prepareSqliteAddColumns,\n\tJsonAddColumnStatement,\n\tJsonAlterCompositePK,\n\tJsonAlterIndPolicyStatement,\n\tJsonAlterMySqlViewStatement,\n\tJsonAlterPolicyStatement,\n\tJsonAlterTableSetSchema,\n\tJsonAlterUniqueConstraint,\n\tJsonAlterViewStatement,\n\tJsonCreateCheckConstraint,\n\tJsonCreateCompositePK,\n\tJsonCreateIndPolicyStatement,\n\tJsonCreateMySqlViewStatement,\n\tJsonCreatePgViewStatement,\n\tJsonCreatePolicyStatement,\n\tJsonCreateReferenceStatement,\n\tJsonCreateSqliteViewStatement,\n\tJsonCreateUniqueConstraint,\n\tJsonDeleteCheckConstraint,\n\tJsonDeleteCompositePK,\n\tJsonDeleteUniqueConstraint,\n\tJsonDisableRLSStatement,\n\tJsonDropColumnStatement,\n\tJsonDropIndPolicyStatement,\n\tJsonDropPolicyStatement,\n\tJsonDropViewStatement,\n\tJsonEnableRLSStatement,\n\tJsonIndRenamePolicyStatement,\n\tJsonReferenceStatement,\n\tJsonRenameColumnStatement,\n\tJsonRenamePolicyStatement,\n\tJsonRenameRoleStatement,\n\tJsonRenameViewStatement,\n\tJsonSqliteAddColumnStatement,\n\tJsonStatement,\n\tprepareAddCheckConstraint,\n\tprepareAddCompositePrimaryKeyMySql,\n\tprepareAddCompositePrimaryKeyPg,\n\tprepareAddCompositePrimaryKeySqlite,\n\tprepareAddUniqueConstraintPg as prepareAddUniqueConstraint,\n\tprepareAddValuesToEnumJson,\n\tprepareAlterColumnsMysql,\n\tprepareAlterCompositePrimaryKeyMySql,\n\tprepareAlterCompositePrimaryKeyPg,\n\tprepareAlterCompositePrimaryKeySqlite,\n\tprepareAlterIndPolicyJson,\n\tprepareAlterPolicyJson,\n\tprepareAlterReferencesJson,\n\tprepareAlterRoleJson,\n\tprepareAlterSequenceJson,\n\tprepareCreateEnumJson,\n\tprepareCreateIndexesJson,\n\tprepareCreateIndPolicyJsons,\n\tprepareCreatePolicyJsons,\n\tprepareCreateReferencesJson,\n\tprepareCreateRoleJson,\n\tprepareCreateSchemasJson,\n\tprepareCreateSequenceJson,\n\tprepareDeleteCheckConstraint,\n\tprepareDeleteCompositePrimaryKeyMySql,\n\tprepareDeleteCompositePrimaryKeyPg,\n\tprepareDeleteCompositePrimaryKeySqlite,\n\tprepareDeleteSchemasJson as prepareDropSchemasJson,\n\tprepareDeleteUniqueConstraintPg as prepareDeleteUniqueConstraint,\n\tprepareDropEnumJson,\n\tprepareDropEnumValues,\n\tprepareDropIndexesJson,\n\tprepareDropIndPolicyJsons,\n\tprepareDropPolicyJsons,\n\tprepareDropReferencesJson,\n\tprepareDropRoleJson,\n\tprepareDropSequenceJson,\n\tprepareDropTableJson,\n\tprepareDropViewJson,\n\tprepareLibSQLCreateReferencesJson,\n\tprepareLibSQLDropReferencesJson,\n\tprepareMoveEnumJson,\n\tprepareMoveSequenceJson,\n\tprepareMySqlAlterView,\n\tprepareMySqlCreateTableJson,\n\tprepareMySqlCreateViewJson,\n\tpreparePgAlterColumns,\n\tpreparePgAlterViewAddWithOptionJson,\n\tpreparePgAlterViewAlterSchemaJson,\n\tpreparePgAlterViewAlterTablespaceJson,\n\tpreparePgAlterViewAlterUsingJson,\n\tpreparePgAlterViewDropWithOptionJson,\n\tpreparePgCreateIndexesJson,\n\tpreparePgCreateTableJson,\n\tpreparePgCreateViewJson,\n\tprepareRenameColumns,\n\tprepareRenameEnumJson,\n\tprepareRenameIndPolicyJsons,\n\tprepareRenamePolicyJsons,\n\tprepareRenameRoleJson,\n\tprepareRenameSchemasJson,\n\tprepareRenameSequenceJson,\n\tprepareRenameTableJson,\n\tprepareRenameViewJson,\n\tprepareSingleStoreCreateTableJson,\n\tprepareSqliteAlterColumns,\n\tprepareSQLiteCreateTable,\n\tprepareSqliteCreateViewJson,\n} from './jsonStatements';\n\nimport { Named, NamedWithSchema } from './cli/commands/migrate';\nimport { mapEntries, mapKeys, mapValues } from './global';\nimport { MySqlSchema, MySqlSchemaSquashed, MySqlSquasher, ViewSquashed } from './serializer/mysqlSchema';\nimport {\n\tmergedViewWithOption,\n\tPgSchema,\n\tPgSchemaSquashed,\n\tPgSquasher,\n\tPolicy,\n\tpolicy,\n\tpolicySquashed,\n\tRole,\n\troleSchema,\n\tsequenceSquashed,\n\tView,\n} from './serializer/pgSchema';\nimport { SingleStoreSchema, SingleStoreSchemaSquashed, SingleStoreSquasher } from './serializer/singlestoreSchema';\nimport { SQLiteSchema, SQLiteSchemaSquashed, SQLiteSquasher, View as SqliteView } from './serializer/sqliteSchema';\nimport { libSQLCombineStatements, singleStoreCombineStatements, sqliteCombineStatements } from './statementCombiner';\nimport { copy, prepareMigrationMeta } from './utils';\n\nconst makeChanged = <T extends ZodTypeAny>(schema: T) => {\n\treturn object({\n\t\ttype: enumType(['changed']),\n\t\told: schema,\n\t\tnew: schema,\n\t});\n};\n\nconst makeSelfOrChanged = <T extends ZodTypeAny>(schema: T) => {\n\treturn union([\n\t\tschema,\n\t\tobject({\n\t\t\ttype: enumType(['changed']),\n\t\t\told: schema,\n\t\t\tnew: schema,\n\t\t}),\n\t]);\n};\n\nexport const makePatched = <T extends ZodTypeAny>(schema: T) => {\n\treturn union([\n\t\tobject({\n\t\t\ttype: literal('added'),\n\t\t\tvalue: schema,\n\t\t}),\n\t\tobject({\n\t\t\ttype: literal('deleted'),\n\t\t\tvalue: schema,\n\t\t}),\n\t\tobject({\n\t\t\ttype: literal('changed'),\n\t\t\told: schema,\n\t\t\tnew: schema,\n\t\t}),\n\t]);\n};\n\nexport const makeSelfOrPatched = <T extends ZodTypeAny>(schema: T) => {\n\treturn union([\n\t\tobject({\n\t\t\ttype: literal('none'),\n\t\t\tvalue: schema,\n\t\t}),\n\t\tobject({\n\t\t\ttype: literal('added'),\n\t\t\tvalue: schema,\n\t\t}),\n\t\tobject({\n\t\t\ttype: literal('deleted'),\n\t\t\tvalue: schema,\n\t\t}),\n\t\tobject({\n\t\t\ttype: literal('changed'),\n\t\t\told: schema,\n\t\t\tnew: schema,\n\t\t}),\n\t]);\n};\n\nconst columnSchema = object({\n\tname: string(),\n\ttype: string(),\n\ttypeSchema: string().optional(),\n\tprimaryKey: boolean().optional(),\n\tdefault: any().optional(),\n\tnotNull: boolean().optional(),\n\t// should it be optional? should if be here?\n\tautoincrement: boolean().optional(),\n\tonUpdate: boolean().optional(),\n\tisUnique: any().optional(),\n\tuniqueName: string().optional(),\n\tnullsNotDistinct: boolean().optional(),\n\tgenerated: object({\n\t\tas: string(),\n\t\ttype: enumType(['stored', 'virtual']).default('stored'),\n\t}).optional(),\n\tidentity: string().optional(),\n}).strict();\n\nconst alteredColumnSchema = object({\n\tname: makeSelfOrChanged(string()),\n\ttype: makeChanged(string()).optional(),\n\tdefault: makePatched(any()).optional(),\n\tprimaryKey: makePatched(boolean()).optional(),\n\tnotNull: makePatched(boolean()).optional(),\n\ttypeSchema: makePatched(string()).optional(),\n\tonUpdate: makePatched(boolean()).optional(),\n\tautoincrement: makePatched(boolean()).optional(),\n\tgenerated: makePatched(\n\t\tobject({\n\t\t\tas: string(),\n\t\t\ttype: enumType(['stored', 'virtual']).default('stored'),\n\t\t}),\n\t).optional(),\n\n\tidentity: makePatched(string()).optional(),\n}).strict();\n\nconst enumSchema = object({\n\tname: string(),\n\tschema: string(),\n\tvalues: array(string()),\n}).strict();\n\nconst changedEnumSchema = object({\n\tname: string(),\n\tschema: string(),\n\taddedValues: object({\n\t\tbefore: string(),\n\t\tvalue: string(),\n\t}).array(),\n\tdeletedValues: array(string()),\n}).strict();\n\nconst tableScheme = object({\n\tname: string(),\n\tschema: string().default(''),\n\tcolumns: record(string(), columnSchema),\n\tindexes: record(string(), string()),\n\tforeignKeys: record(string(), string()),\n\tcompositePrimaryKeys: record(string(), string()).default({}),\n\tuniqueConstraints: record(string(), string()).default({}),\n\tpolicies: record(string(), string()).default({}),\n\tcheckConstraints: record(string(), string()).default({}),\n\tisRLSEnabled: boolean().default(false),\n}).strict();\n\nexport const alteredTableScheme = object({\n\tname: string(),\n\tschema: string(),\n\taltered: alteredColumnSchema.array(),\n\taddedIndexes: record(string(), string()),\n\tdeletedIndexes: record(string(), string()),\n\talteredIndexes: record(\n\t\tstring(),\n\t\tobject({\n\t\t\t__new: string(),\n\t\t\t__old: string(),\n\t\t}).strict(),\n\t),\n\taddedForeignKeys: record(string(), string()),\n\tdeletedForeignKeys: record(string(), string()),\n\talteredForeignKeys: record(\n\t\tstring(),\n\t\tobject({\n\t\t\t__new: string(),\n\t\t\t__old: string(),\n\t\t}).strict(),\n\t),\n\taddedCompositePKs: record(string(), string()),\n\tdeletedCompositePKs: record(string(), string()),\n\talteredCompositePKs: record(\n\t\tstring(),\n\t\tobject({\n\t\t\t__new: string(),\n\t\t\t__old: string(),\n\t\t}),\n\t),\n\taddedUniqueConstraints: record(string(), string()),\n\tdeletedUniqueConstraints: record(string(), string()),\n\talteredUniqueConstraints: record(\n\t\tstring(),\n\t\tobject({\n\t\t\t__new: string(),\n\t\t\t__old: string(),\n\t\t}),\n\t),\n\taddedPolicies: record(string(), string()),\n\tdeletedPolicies: record(string(), string()),\n\talteredPolicies: record(\n\t\tstring(),\n\t\tobject({\n\t\t\t__new: string(),\n\t\t\t__old: string(),\n\t\t}),\n\t),\n\taddedCheckConstraints: record(\n\t\tstring(),\n\t\tstring(),\n\t),\n\tdeletedCheckConstraints: record(\n\t\tstring(),\n\t\tstring(),\n\t),\n\talteredCheckConstraints: record(\n\t\tstring(),\n\t\tobject({\n\t\t\t__new: string(),\n\t\t\t__old: string(),\n\t\t}),\n\t),\n}).strict();\n\nconst alteredViewCommon = object({\n\tname: string(),\n\talteredDefinition: object({\n\t\t__old: string(),\n\t\t__new: string(),\n\t}).strict().optional(),\n\talteredExisting: object({\n\t\t__old: boolean(),\n\t\t__new: boolean(),\n\t}).strict().optional(),\n});\n\nexport const alteredPgViewSchema = alteredViewCommon.merge(\n\tobject({\n\t\tschema: string(),\n\t\tdeletedWithOption: mergedViewWithOption.optional(),\n\t\taddedWithOption: mergedViewWithOption.optional(),\n\t\taddedWith: mergedViewWithOption.optional(),\n\t\tdeletedWith: mergedViewWithOption.optional(),\n\t\talteredWith: mergedViewWithOption.optional(),\n\t\talteredSchema: object({\n\t\t\t__old: string(),\n\t\t\t__new: string(),\n\t\t}).strict().optional(),\n\t\talteredTablespace: object({\n\t\t\t__old: string(),\n\t\t\t__new: string(),\n\t\t}).strict().optional(),\n\t\talteredUsing: object({\n\t\t\t__old: string(),\n\t\t\t__new: string(),\n\t\t}).strict().optional(),\n\t}).strict(),\n);\n\nconst alteredMySqlViewSchema = alteredViewCommon.merge(\n\tobject({\n\t\talteredMeta: object({\n\t\t\t__old: string(),\n\t\t\t__new: string(),\n\t\t}).strict().optional(),\n\t}).strict(),\n);\n\nexport const diffResultScheme = object({\n\talteredTablesWithColumns: alteredTableScheme.array(),\n\talteredEnums: changedEnumSchema.array(),\n\talteredSequences: sequenceSquashed.array(),\n\talteredRoles: roleSchema.array(),\n\talteredPolicies: policySquashed.array(),\n\talteredViews: alteredPgViewSchema.array(),\n}).strict();\n\nexport const diffResultSchemeMysql = object({\n\talteredTablesWithColumns: alteredTableScheme.array(),\n\talteredEnums: never().array(),\n\talteredViews: alteredMySqlViewSchema.array(),\n});\n\nexport const diffResultSchemeSingleStore = object({\n\talteredTablesWithColumns: alteredTableScheme.array(),\n\talteredEnums: never().array(),\n});\n\nexport const diffResultSchemeSQLite = object({\n\talteredTablesWithColumns: alteredTableScheme.array(),\n\talteredEnums: never().array(),\n\talteredViews: alteredViewCommon.array(),\n});\n\nexport type Column = TypeOf<typeof columnSchema>;\nexport type AlteredColumn = TypeOf<typeof alteredColumnSchema>;\nexport type Enum = TypeOf<typeof enumSchema>;\nexport type Sequence = TypeOf<typeof sequenceSquashed>;\nexport type Table = TypeOf<typeof tableScheme>;\nexport type AlteredTable = TypeOf<typeof alteredTableScheme>;\nexport type DiffResult = TypeOf<typeof diffResultScheme>;\nexport type DiffResultMysql = TypeOf<typeof diffResultSchemeMysql>;\nexport type DiffResultSingleStore = TypeOf<typeof diffResultSchemeSingleStore>;\nexport type DiffResultSQLite = TypeOf<typeof diffResultSchemeSQLite>;\n\nexport interface ResolverInput<T extends { name: string }> {\n\tcreated: T[];\n\tdeleted: T[];\n}\n\nexport interface ResolverOutput<T extends { name: string }> {\n\tcreated: T[];\n\trenamed: { from: T; to: T }[];\n\tdeleted: T[];\n}\n\nexport interface ResolverOutputWithMoved<T extends { name: string }> {\n\tcreated: T[];\n\tmoved: { name: string; schemaFrom: string; schemaTo: string }[];\n\trenamed: { from: T; to: T }[];\n\tdeleted: T[];\n}\n\nexport interface ColumnsResolverInput<T extends { name: string }> {\n\ttableName: string;\n\tschema: string;\n\tcreated: T[];\n\tdeleted: T[];\n}\n\nexport interface TablePolicyResolverInput<T extends { name: string }> {\n\ttableName: string;\n\tschema: string;\n\tcreated: T[];\n\tdeleted: T[];\n}\n\nexport interface TablePolicyResolverOutput<T extends { name: string }> {\n\ttableName: string;\n\tschema: string;\n\tcreated: T[];\n\trenamed: { from: T; to: T }[];\n\tdeleted: T[];\n}\n\nexport interface PolicyResolverInput<T extends { name: string }> {\n\tcreated: T[];\n\tdeleted: T[];\n}\n\nexport interface PolicyResolverOutput<T extends { name: string }> {\n\tcreated: T[];\n\trenamed: { from: T; to: T }[];\n\tdeleted: T[];\n}\n\nexport interface RolesResolverInput<T extends { name: string }> {\n\tcreated: T[];\n\tdeleted: T[];\n}\n\nexport interface RolesResolverOutput<T extends { name: string }> {\n\tcreated: T[];\n\trenamed: { from: T; to: T }[];\n\tdeleted: T[];\n}\n\nexport interface ColumnsResolverOutput<T extends { name: string }> {\n\ttableName: string;\n\tschema: string;\n\tcreated: T[];\n\trenamed: { from: T; to: T }[];\n\tdeleted: T[];\n}\n\nconst schemaChangeFor = (\n\ttable: NamedWithSchema,\n\trenamedSchemas: { from: Named; to: Named }[],\n) => {\n\tfor (let ren of renamedSchemas) {\n\t\tif (table.schema === ren.from.name) {\n\t\t\treturn { key: `${ren.to.name}.${table.name}`, schema: ren.to.name };\n\t\t}\n\t}\n\n\treturn {\n\t\tkey: `${table.schema || 'public'}.${table.name}`,\n\t\tschema: table.schema,\n\t};\n};\n\nconst nameChangeFor = (table: Named, renamed: { from: Named; to: Named }[]) => {\n\tfor (let ren of renamed) {\n\t\tif (table.name === ren.from.name) {\n\t\t\treturn { name: ren.to.name };\n\t\t}\n\t}\n\n\treturn {\n\t\tname: table.name,\n\t};\n};\n\nconst nameSchemaChangeFor = (\n\ttable: NamedWithSchema,\n\trenamedTables: { from: NamedWithSchema; to: NamedWithSchema }[],\n) => {\n\tfor (let ren of renamedTables) {\n\t\tif (table.name === ren.from.name && table.schema === ren.from.schema) {\n\t\t\treturn {\n\t\t\t\tkey: `${ren.to.schema || 'public'}.${ren.to.name}`,\n\t\t\t\tname: ren.to.name,\n\t\t\t\tschema: ren.to.schema,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn {\n\t\tkey: `${table.schema || 'public'}.${table.name}`,\n\t\tname: table.name,\n\t\tschema: table.schema,\n\t};\n};\n\nconst columnChangeFor = (\n\tcolumn: string,\n\trenamedColumns: { from: Named; to: Named }[],\n) => {\n\tfor (let ren of renamedColumns) {\n\t\tif (column === ren.from.name) {\n\t\t\treturn ren.to.name;\n\t\t}\n\t}\n\n\treturn column;\n};\n\n// resolve roles same as enums\n// create new json statements\n// sql generators\n\n// tests everything!\n\nexport const applyPgSnapshotsDiff = async (\n\tjson1: PgSchemaSquashed,\n\tjson2: PgSchemaSquashed,\n\tschemasResolver: (\n\t\tinput: ResolverInput<Named>,\n\t) => Promise<ResolverOutput<Named>>,\n\tenumsResolver: (\n\t\tinput: ResolverInput<Enum>,\n\t) => Promise<ResolverOutputWithMoved<Enum>>,\n\tsequencesResolver: (\n\t\tinput: ResolverInput<Sequence>,\n\t) => Promise<ResolverOutputWithMoved<Sequence>>,\n\tpolicyResolver: (\n\t\tinput: TablePolicyResolverInput<Policy>,\n\t) => Promise<TablePolicyResolverOutput<Policy>>,\n\tindPolicyResolver: (\n\t\tinput: PolicyResolverInput<Policy>,\n\t) => Promise<PolicyResolverOutput<Policy>>,\n\troleResolver: (\n\t\tinput: RolesResolverInput<Role>,\n\t) => Promise<RolesResolverOutput<Role>>,\n\ttablesResolver: (\n\t\tinput: ResolverInput<Table>,\n\t) => Promise<ResolverOutputWithMoved<Table>>,\n\tcolumnsResolver: (\n\t\tinput: ColumnsResolverInput<Column>,\n\t) => Promise<ColumnsResolverOutput<Column>>,\n\tviewsResolver: (\n\t\tinput: ResolverInput<View>,\n\t) => Promise<ResolverOutputWithMoved<View>>,\n\tprevFull: PgSchema,\n\tcurFull: PgSchema,\n\taction?: 'push' | undefined,\n): Promise<{\n\tstatements: JsonStatement[];\n\tsqlStatements: string[];\n\t_meta:\n\t\t| {\n\t\t\tschemas: {};\n\t\t\ttables: {};\n\t\t\tcolumns: {};\n\t\t}\n\t\t| undefined;\n}> => {\n\tconst schemasDiff = diffSchemasOrTables(json1.schemas, json2.schemas);\n\n\tconst {\n\t\tcreated: createdSchemas,\n\t\tdeleted: deletedSchemas,\n\t\trenamed: renamedSchemas,\n\t} = await schemasResolver({\n\t\tcreated: schemasDiff.added.map((it) => ({ name: it })),\n\t\tdeleted: schemasDiff.deleted.map((it) => ({ name: it })),\n\t});\n\n\tconst schemasPatchedSnap1 = copy(json1);\n\tschemasPatchedSnap1.tables = mapEntries(\n\t\tschemasPatchedSnap1.tables,\n\t\t(_, it) => {\n\t\t\tconst { key, schema } = schemaChangeFor(it, renamedSchemas);\n\t\t\tit.schema = schema;\n\t\t\treturn [key, it];\n\t\t},\n\t);\n\n\tschemasPatchedSnap1.enums = mapEntries(schemasPatchedSnap1.enums, (_, it) => {\n\t\tconst { key, schema } = schemaChangeFor(it, renamedSchemas);\n\t\tit.schema = schema;\n\t\treturn [key, it];\n\t});\n\n\tconst enumsDiff = diffSchemasOrTables(schemasPatchedSnap1.enums, json2.enums);\n\n\tconst {\n\t\tcreated: createdEnums,\n\t\tdeleted: deletedEnums,\n\t\trenamed: renamedEnums,\n\t\tmoved: movedEnums,\n\t} = await enumsResolver({\n\t\tcreated: enumsDiff.added,\n\t\tdeleted: enumsDiff.deleted,\n\t});\n\n\tschemasPatchedSnap1.enums = mapEntries(schemasPatchedSnap1.enums, (_, it) => {\n\t\tconst { key, name, schema } = nameSchemaChangeFor(it, renamedEnums);\n\t\tit.name = name;\n\t\tit.schema = schema;\n\t\treturn [key, it];\n\t});\n\n\tconst columnTypesChangeMap = renamedEnums.reduce(\n\t\t(acc, it) => {\n\t\t\tacc[`${it.from.schema}.${it.from.name}`] = {\n\t\t\t\tnameFrom: it.from.name,\n\t\t\t\tnameTo: it.to.name,\n\t\t\t\tschemaFrom: it.from.schema,\n\t\t\t\tschemaTo: it.to.schema,\n\t\t\t};\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tnameFrom: string;\n\t\t\t\tnameTo: string;\n\t\t\t\tschemaFrom: string;\n\t\t\t\tschemaTo: string;\n\t\t\t}\n\t\t>,\n\t);\n\n\tconst columnTypesMovesMap = movedEnums.reduce(\n\t\t(acc, it) => {\n\t\t\tacc[`${it.schemaFrom}.${it.name}`] = {\n\t\t\t\tnameFrom: it.name,\n\t\t\t\tnameTo: it.name,\n\t\t\t\tschemaFrom: it.schemaFrom,\n\t\t\t\tschemaTo: it.schemaTo,\n\t\t\t};\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tnameFrom: string;\n\t\t\t\tnameTo: string;\n\t\t\t\tschemaFrom: string;\n\t\t\t\tschemaTo: string;\n\t\t\t}\n\t\t>,\n\t);\n\n\tschemasPatchedSnap1.tables = mapEntries(\n\t\tschemasPatchedSnap1.tables,\n\t\t(tableKey, tableValue) => {\n\t\t\tconst patchedColumns = mapValues(tableValue.columns, (column) => {\n\t\t\t\tconst key = `${column.typeSchema || 'public'}.${column.type}`;\n\t\t\t\tconst change = columnTypesChangeMap[key] || columnTypesMovesMap[key];\n\n\t\t\t\tif (change) {\n\t\t\t\t\tcolumn.type = change.nameTo;\n\t\t\t\t\tcolumn.typeSchema = change.schemaTo;\n\t\t\t\t}\n\n\t\t\t\treturn column;\n\t\t\t});\n\n\t\t\ttableValue.columns = patchedColumns;\n\t\t\treturn [tableKey, tableValue];\n\t\t},\n\t);\n\n\tschemasPatchedSnap1.sequences = mapEntries(\n\t\tschemasPatchedSnap1.sequences,\n\t\t(_, it) => {\n\t\t\tconst { key, schema } = schemaChangeFor(it, renamedSchemas);\n\t\t\tit.schema = schema;\n\t\t\treturn [key, it];\n\t\t},\n\t);\n\n\tconst sequencesDiff = diffSchemasOrTables(\n\t\tschemasPatchedSnap1.sequences,\n\t\tjson2.sequences,\n\t);\n\n\tconst {\n\t\tcreated: createdSequences,\n\t\tdeleted: deletedSequences,\n\t\trenamed: renamedSequences,\n\t\tmoved: movedSequences,\n\t} = await sequencesResolver({\n\t\tcreated: sequencesDiff.added,\n\t\tdeleted: sequencesDiff.deleted,\n\t});\n\n\tschemasPatchedSnap1.sequences = mapEntries(\n\t\tschemasPatchedSnap1.sequences,\n\t\t(_, it) => {\n\t\t\tconst { key, name, schema } = nameSchemaChangeFor(it, renamedSequences);\n\t\t\tit.name = name;\n\t\t\tit.schema = schema;\n\t\t\treturn [key, it];\n\t\t},\n\t);\n\n\tconst sequencesChangeMap = renamedSequences.reduce(\n\t\t(acc, it) => {\n\t\t\tacc[`${it.from.schema}.${it.from.name}`] = {\n\t\t\t\tnameFrom: it.from.name,\n\t\t\t\tnameTo: it.to.name,\n\t\t\t\tschemaFrom: it.from.schema,\n\t\t\t\tschemaTo: it.to.schema,\n\t\t\t};\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tnameFrom: string;\n\t\t\t\tnameTo: string;\n\t\t\t\tschemaFrom: string;\n\t\t\t\tschemaTo: string;\n\t\t\t}\n\t\t>,\n\t);\n\n\tconst sequencesMovesMap = movedSequences.reduce(\n\t\t(acc, it) => {\n\t\t\tacc[`${it.schemaFrom}.${it.name}`] = {\n\t\t\t\tnameFrom: it.name,\n\t\t\t\tnameTo: it.name,\n\t\t\t\tschemaFrom: it.schemaFrom,\n\t\t\t\tschemaTo: it.schemaTo,\n\t\t\t};\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tnameFrom: string;\n\t\t\t\tnameTo: string;\n\t\t\t\tschemaFrom: string;\n\t\t\t\tschemaTo: string;\n\t\t\t}\n\t\t>,\n\t);\n\n\tschemasPatchedSnap1.tables = mapEntries(\n\t\tschemasPatchedSnap1.tables,\n\t\t(tableKey, tableValue) => {\n\t\t\tconst patchedColumns = mapValues(tableValue.columns, (column) => {\n\t\t\t\tconst key = `${column.typeSchema || 'public'}.${column.type}`;\n\t\t\t\tconst change = sequencesChangeMap[key] || sequencesMovesMap[key];\n\n\t\t\t\tif (change) {\n\t\t\t\t\tcolumn.type = change.nameTo;\n\t\t\t\t\tcolumn.typeSchema = change.schemaTo;\n\t\t\t\t}\n\n\t\t\t\treturn column;\n\t\t\t});\n\n\t\t\ttableValue.columns = patchedColumns;\n\t\t\treturn [tableKey, tableValue];\n\t\t},\n\t);\n\n\tconst rolesDiff = diffSchemasOrTables(\n\t\tschemasPatchedSnap1.roles,\n\t\tjson2.roles,\n\t);\n\n\tconst {\n\t\tcreated: createdRoles,\n\t\tdeleted: deletedRoles,\n\t\trenamed: renamedRoles,\n\t} = await roleResolver({\n\t\tcreated: rolesDiff.added,\n\t\tdeleted: rolesDiff.deleted,\n\t});\n\n\tschemasPatchedSnap1.roles = mapEntries(\n\t\tschemasPatchedSnap1.roles,\n\t\t(_, it) => {\n\t\t\tconst { name } = nameChangeFor(it, renamedRoles);\n\t\t\tit.name = name;\n\t\t\treturn [name, it];\n\t\t},\n\t);\n\n\tconst rolesChangeMap = renamedRoles.reduce(\n\t\t(acc, it) => {\n\t\t\tacc[it.from.name] = {\n\t\t\t\tnameFrom: it.from.name,\n\t\t\t\tnameTo: it.to.name,\n\t\t\t};\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tnameFrom: string;\n\t\t\t\tnameTo: string;\n\t\t\t}\n\t\t>,\n\t);\n\n\tschemasPatchedSnap1.roles = mapEntries(\n\t\tschemasPatchedSnap1.roles,\n\t\t(roleKey, roleValue) => {\n\t\t\tconst key = roleKey;\n\t\t\tconst change = rolesChangeMap[key];\n\n\t\t\tif (change) {\n\t\t\t\troleValue.name = change.nameTo;\n\t\t\t}\n\n\t\t\treturn [roleKey, roleValue];\n\t\t},\n\t);\n\n\tconst tablesDiff = diffSchemasOrTables(\n\t\tschemasPatchedSnap1.tables as Record<string, any>,\n\t\tjson2.tables,\n\t);\n\n\tconst {\n\t\tcreated: createdTables,\n\t\tdeleted: deletedTables,\n\t\tmoved: movedTables,\n\t\trenamed: renamedTables, // renamed or moved\n\t} = await tablesResolver({\n\t\tcreated: tablesDiff.added,\n\t\tdeleted: tablesDiff.deleted,\n\t});\n\n\tconst tablesPatchedSnap1 = copy(schemasPatchedSnap1);\n\ttablesPatchedSnap1.tables = mapEntries(tablesPatchedSnap1.tables, (_, it) => {\n\t\tconst { key, name, schema } = nameSchemaChangeFor(it, renamedTables);\n\t\tit.name = name;\n\t\tit.schema = schema;\n\t\treturn [key, it];\n\t});\n\n\tconst res = diffColumns(tablesPatchedSnap1.tables, json2.tables);\n\n\tconst columnRenames = [] as {\n\t\ttable: string;\n\t\tschema: string;\n\t\trenames: { from: Column; to: Column }[];\n\t}[];\n\n\tconst columnCreates = [] as {\n\t\ttable: string;\n\t\tschema: string;\n\t\tcolumns: Column[];\n\t}[];\n\n\tconst columnDeletes = [] as {\n\t\ttable: string;\n\t\tschema: string;\n\t\tcolumns: Column[];\n\t}[];\n\n\tfor (let entry of Object.values(res)) {\n\t\tconst { renamed, created, deleted } = await columnsResolver({\n\t\t\ttableName: entry.name,\n\t\t\tschema: entry.schema,\n\t\t\tdeleted: entry.columns.deleted,\n\t\t\tcreated: entry.columns.added,\n\t\t});\n\n\t\tif (created.length > 0) {\n\t\t\tcolumnCreates.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tschema: entry.schema,\n\t\t\t\tcolumns: created,\n\t\t\t});\n\t\t}\n\n\t\tif (deleted.length > 0) {\n\t\t\tcolumnDeletes.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tschema: entry.schema,\n\t\t\t\tcolumns: deleted,\n\t\t\t});\n\t\t}\n\n\t\tif (renamed.length > 0) {\n\t\t\tcolumnRenames.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tschema: entry.schema,\n\t\t\t\trenames: renamed,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst columnRenamesDict = columnRenames.reduce(\n\t\t(acc, it) => {\n\t\t\tacc[`${it.schema || 'public'}.${it.table}`] = it.renames;\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tfrom: Named;\n\t\t\t\tto: Named;\n\t\t\t}[]\n\t\t>,\n\t);\n\n\tconst columnsPatchedSnap1 = copy(tablesPatchedSnap1);\n\tcolumnsPatchedSnap1.tables = mapEntries(\n\t\tcolumnsPatchedSnap1.tables,\n\t\t(tableKey, tableValue) => {\n\t\t\tconst patchedColumns = mapKeys(\n\t\t\t\ttableValue.columns,\n\t\t\t\t(columnKey, column) => {\n\t\t\t\t\tconst rens = columnRenamesDict[\n\t\t\t\t\t\t`${tableValue.schema || 'public'}.${tableValue.name}`\n\t\t\t\t\t] || [];\n\n\t\t\t\t\tconst newName = columnChangeFor(columnKey, rens);\n\t\t\t\t\tcolumn.name = newName;\n\t\t\t\t\treturn newName;\n\t\t\t\t},\n\t\t\t);\n\n\t\t\ttableValue.columns = patchedColumns;\n\t\t\treturn [tableKey, tableValue];\n\t\t},\n\t);\n\n\t//// Policies\n\n\tconst policyRes = diffPolicies(tablesPatchedSnap1.tables, json2.tables);\n\n\tconst policyRenames = [] as {\n\t\ttable: string;\n\t\tschema: string;\n\t\trenames: { from: Policy; to: Policy }[];\n\t}[];\n\n\tconst policyCreates = [] as {\n\t\ttable: string;\n\t\tschema: string;\n\t\tcolumns: Policy[];\n\t}[];\n\n\tconst policyDeletes = [] as {\n\t\ttable: string;\n\t\tschema: string;\n\t\tcolumns: Policy[];\n\t}[];\n\n\tfor (let entry of Object.values(policyRes)) {\n\t\tconst { renamed, created, deleted } = await policyResolver({\n\t\t\ttableName: entry.name,\n\t\t\tschema: entry.schema,\n\t\t\tdeleted: entry.policies.deleted.map(\n\t\t\t\taction === 'push' ? PgSquasher.unsquashPolicyPush : PgSquasher.unsquashPolicy,\n\t\t\t),\n\t\t\tcreated: entry.policies.added.map(action === 'push' ? PgSquasher.unsquashPolicyPush : PgSquasher.unsquashPolicy),\n\t\t});\n\n\t\tif (created.length > 0) {\n\t\t\tpolicyCreates.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tschema: entry.schema,\n\t\t\t\tcolumns: created,\n\t\t\t});\n\t\t}\n\n\t\tif (deleted.length > 0) {\n\t\t\tpolicyDeletes.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tschema: entry.schema,\n\t\t\t\tcolumns: deleted,\n\t\t\t});\n\t\t}\n\n\t\tif (renamed.length > 0) {\n\t\t\tpolicyRenames.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tschema: entry.schema,\n\t\t\t\trenames: renamed,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst policyRenamesDict = columnRenames.reduce(\n\t\t(acc, it) => {\n\t\t\tacc[`${it.schema || 'public'}.${it.table}`] = it.renames;\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tfrom: Named;\n\t\t\t\tto: Named;\n\t\t\t}[]\n\t\t>,\n\t);\n\n\tconst policyPatchedSnap1 = copy(tablesPatchedSnap1);\n\tpolicyPatchedSnap1.tables = mapEntries(\n\t\tpolicyPatchedSnap1.tables,\n\t\t(tableKey, tableValue) => {\n\t\t\tconst patchedPolicies = mapKeys(\n\t\t\t\ttableValue.policies,\n\t\t\t\t(policyKey, policy) => {\n\t\t\t\t\tconst rens = policyRenamesDict[\n\t\t\t\t\t\t`${tableValue.schema || 'public'}.${tableValue.name}`\n\t\t\t\t\t] || [];\n\n\t\t\t\t\tconst newName = columnChangeFor(policyKey, rens);\n\t\t\t\t\tconst unsquashedPolicy = action === 'push'\n\t\t\t\t\t\t? PgSquasher.unsquashPolicyPush(policy)\n\t\t\t\t\t\t: PgSquasher.unsquashPolicy(policy);\n\t\t\t\t\tunsquashedPolicy.name = newName;\n\t\t\t\t\tpolicy = PgSquasher.squashPolicy(unsquashedPolicy);\n\t\t\t\t\treturn newName;\n\t\t\t\t},\n\t\t\t);\n\n\t\t\ttableValue.policies = patchedPolicies;\n\t\t\treturn [tableKey, tableValue];\n\t\t},\n\t);\n\n\t//// Individual policies\n\n\tconst indPolicyRes = diffIndPolicies(policyPatchedSnap1.policies, json2.policies);\n\n\tconst indPolicyCreates = [] as {\n\t\tpolicies: Policy[];\n\t}[];\n\n\tconst indPolicyDeletes = [] as {\n\t\tpolicies: Policy[];\n\t}[];\n\n\tconst { renamed: indPolicyRenames, created, deleted } = await indPolicyResolver({\n\t\tdeleted: indPolicyRes.deleted.map((t) =>\n\t\t\taction === 'push' ? PgSquasher.unsquashPolicyPush(t.values) : PgSquasher.unsquashPolicy(t.values)\n\t\t),\n\t\tcreated: indPolicyRes.added.map((t) =>\n\t\t\taction === 'push' ? PgSquasher.unsquashPolicyPush(t.values) : PgSquasher.unsquashPolicy(t.values)\n\t\t),\n\t});\n\n\tif (created.length > 0) {\n\t\tindPolicyCreates.push({\n\t\t\tpolicies: created,\n\t\t});\n\t}\n\n\tif (deleted.length > 0) {\n\t\tindPolicyDeletes.push({\n\t\t\tpolicies: deleted,\n\t\t});\n\t}\n\n\tconst indPolicyRenamesDict = indPolicyRenames.reduce(\n\t\t(acc, it) => {\n\t\t\tacc[it.from.name] = {\n\t\t\t\tnameFrom: it.from.name,\n\t\t\t\tnameTo: it.to.name,\n\t\t\t};\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tnameFrom: string;\n\t\t\t\tnameTo: string;\n\t\t\t}\n\t\t>,\n\t);\n\n\tconst indPolicyPatchedSnap1 = copy(policyPatchedSnap1);\n\tindPolicyPatchedSnap1.policies = mapEntries(\n\t\tindPolicyPatchedSnap1.policies,\n\t\t(policyKey, policyValue) => {\n\t\t\tconst key = policyKey;\n\t\t\tconst change = indPolicyRenamesDict[key];\n\n\t\t\tif (change) {\n\t\t\t\tpolicyValue.name = change.nameTo;\n\t\t\t}\n\n\t\t\treturn [policyKey, policyValue];\n\t\t},\n\t);\n\n\t////\n\tconst viewsDiff = diffSchemasOrTables(indPolicyPatchedSnap1.views, json2.views);\n\n\tconst {\n\t\tcreated: createdViews,\n\t\tdeleted: deletedViews,\n\t\trenamed: renamedViews,\n\t\tmoved: movedViews,\n\t} = await viewsResolver({\n\t\tcreated: viewsDiff.added,\n\t\tdeleted: viewsDiff.deleted,\n\t});\n\n\tconst renamesViewDic: Record<string, { to: string; from: string }> = {};\n\trenamedViews.forEach((it) => {\n\t\trenamesViewDic[`${it.from.schema}.${it.from.name}`] = { to: it.to.name, from: it.from.name };\n\t});\n\n\tconst movedViewDic: Record<string, { to: string; from: string }> = {};\n\tmovedViews.forEach((it) => {\n\t\tmovedViewDic[`${it.schemaFrom}.${it.name}`] = { to: it.schemaTo, from: it.schemaFrom };\n\t});\n\n\tconst viewsPatchedSnap1 = copy(policyPatchedSnap1);\n\tviewsPatchedSnap1.views = mapEntries(\n\t\tviewsPatchedSnap1.views,\n\t\t(viewKey, viewValue) => {\n\t\t\tconst rename = renamesViewDic[`${viewValue.schema}.${viewValue.name}`];\n\t\t\tconst moved = movedViewDic[`${viewValue.schema}.${viewValue.name}`];\n\n\t\t\tif (rename) {\n\t\t\t\tviewValue.name = rename.to;\n\t\t\t\tviewKey = `${viewValue.schema}.${viewValue.name}`;\n\t\t\t}\n\n\t\t\tif (moved) viewKey = `${moved.to}.${viewValue.name}`;\n\n\t\t\treturn [viewKey, viewValue];\n\t\t},\n\t);\n\n\tconst diffResult = applyJsonDiff(viewsPatchedSnap1, json2);\n\n\tconst typedResult: DiffResult = diffResultScheme.parse(diffResult);\n\n\tconst jsonStatements: JsonStatement[] = [];\n\n\tconst jsonCreateIndexesForCreatedTables = createdTables\n\t\t.map((it) => {\n\t\t\treturn preparePgCreateIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.indexes,\n\t\t\t\tcurFull,\n\t\t\t\taction,\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonDropTables = deletedTables.map((it) => {\n\t\treturn prepareDropTableJson(it);\n\t});\n\n\tconst jsonRenameTables = renamedTables.map((it) => {\n\t\treturn prepareRenameTableJson(it.from, it.to);\n\t});\n\n\tconst alteredTables = typedResult.alteredTablesWithColumns;\n\n\tconst jsonRenameColumnsStatements: JsonRenameColumnStatement[] = [];\n\tconst jsonDropColumnsStatemets: JsonDropColumnStatement[] = [];\n\tconst jsonAddColumnsStatemets: JsonAddColumnStatement[] = [];\n\n\tfor (let it of columnRenames) {\n\t\tjsonRenameColumnsStatements.push(\n\t\t\t...prepareRenameColumns(it.table, it.schema, it.renames),\n\t\t);\n\t}\n\n\tfor (let it of columnDeletes) {\n\t\tjsonDropColumnsStatemets.push(\n\t\t\t..._prepareDropColumns(it.table, it.schema, it.columns),\n\t\t);\n\t}\n\n\tfor (let it of columnCreates) {\n\t\tjsonAddColumnsStatemets.push(\n\t\t\t..._prepareAddColumns(it.table, it.schema, it.columns),\n\t\t);\n\t}\n\n\tconst jsonAddedCompositePKs: JsonCreateCompositePK[] = [];\n\tconst jsonDeletedCompositePKs: JsonDeleteCompositePK[] = [];\n\tconst jsonAlteredCompositePKs: JsonAlterCompositePK[] = [];\n\n\tconst jsonAddedUniqueConstraints: JsonCreateUniqueConstraint[] = [];\n\tconst jsonDeletedUniqueConstraints: JsonDeleteUniqueConstraint[] = [];\n\tconst jsonAlteredUniqueConstraints: JsonAlterUniqueConstraint[] = [];\n\n\tconst jsonSetTableSchemas: JsonAlterTableSetSchema[] = [];\n\n\tif (movedTables) {\n\t\tfor (let it of movedTables) {\n\t\t\tjsonSetTableSchemas.push({\n\t\t\t\ttype: 'alter_table_set_schema',\n\t\t\t\ttableName: it.name,\n\t\t\t\tschemaFrom: it.schemaFrom || 'public',\n\t\t\t\tschemaTo: it.schemaTo || 'public',\n\t\t\t});\n\t\t}\n\t}\n\n\tconst jsonDeletedCheckConstraints: JsonDeleteCheckConstraint[] = [];\n\tconst jsonCreatedCheckConstraints: JsonCreateCheckConstraint[] = [];\n\n\tfor (let it of alteredTables) {\n\t\t// This part is needed to make sure that same columns in a table are not triggered for change\n\t\t// there is a case where orm and kit are responsible for pk name generation and one of them is not sorting name\n\t\t// We double-check that pk with same set of columns are both in added and deleted diffs\n\t\tlet addedColumns: { name: string; columns: string[] } | undefined;\n\t\tfor (const addedPkName of Object.keys(it.addedCompositePKs)) {\n\t\t\tconst addedPkColumns = it.addedCompositePKs[addedPkName];\n\t\t\taddedColumns = PgSquasher.unsquashPK(addedPkColumns);\n\t\t}\n\n\t\tlet deletedColumns: { name: string; columns: string[] } | undefined;\n\t\tfor (const deletedPkName of Object.keys(it.deletedCompositePKs)) {\n\t\t\tconst deletedPkColumns = it.deletedCompositePKs[deletedPkName];\n\t\t\tdeletedColumns = PgSquasher.unsquashPK(deletedPkColumns);\n\t\t}\n\n\t\t// Don't need to sort, but need to add tests for it\n\t\t// addedColumns.sort();\n\t\t// deletedColumns.sort();\n\t\tconst doPerformDeleteAndCreate = JSON.stringify(addedColumns ?? {}) !== JSON.stringify(deletedColumns ?? {});\n\n\t\tlet addedCompositePKs: JsonCreateCompositePK[] = [];\n\t\tlet deletedCompositePKs: JsonDeleteCompositePK[] = [];\n\t\tlet alteredCompositePKs: JsonAlterCompositePK[] = [];\n\t\tif (doPerformDeleteAndCreate) {\n\t\t\taddedCompositePKs = prepareAddCompositePrimaryKeyPg(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.addedCompositePKs,\n\t\t\t\tcurFull as PgSchema,\n\t\t\t);\n\t\t\tdeletedCompositePKs = prepareDeleteCompositePrimaryKeyPg(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.deletedCompositePKs,\n\t\t\t\tprevFull as PgSchema,\n\t\t\t);\n\t\t}\n\t\talteredCompositePKs = prepareAlterCompositePrimaryKeyPg(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.alteredCompositePKs,\n\t\t\tprevFull as PgSchema,\n\t\t\tcurFull as PgSchema,\n\t\t);\n\n\t\t// add logic for unique constraints\n\t\tlet addedUniqueConstraints: JsonCreateUniqueConstraint[] = [];\n\t\tlet deletedUniqueConstraints: JsonDeleteUniqueConstraint[] = [];\n\t\tlet alteredUniqueConstraints: JsonAlterUniqueConstraint[] = [];\n\t\tlet createCheckConstraints: JsonCreateCheckConstraint[] = [];\n\t\tlet deleteCheckConstraints: JsonDeleteCheckConstraint[] = [];\n\n\t\taddedUniqueConstraints = prepareAddUniqueConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.addedUniqueConstraints,\n\t\t);\n\t\tdeletedUniqueConstraints = prepareDeleteUniqueConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.deletedUniqueConstraints,\n\t\t);\n\t\tif (it.alteredUniqueConstraints) {\n\t\t\tconst added: Record<string, string> = {};\n\t\t\tconst deleted: Record<string, string> = {};\n\t\t\tfor (const k of Object.keys(it.alteredUniqueConstraints)) {\n\t\t\t\tadded[k] = it.alteredUniqueConstraints[k].__new;\n\t\t\t\tdeleted[k] = it.alteredUniqueConstraints[k].__old;\n\t\t\t}\n\t\t\taddedUniqueConstraints.push(\n\t\t\t\t...prepareAddUniqueConstraint(it.name, it.schema, added),\n\t\t\t);\n\t\t\tdeletedUniqueConstraints.push(\n\t\t\t\t...prepareDeleteUniqueConstraint(it.name, it.schema, deleted),\n\t\t\t);\n\t\t}\n\n\t\tcreateCheckConstraints = prepareAddCheckConstraint(it.name, it.schema, it.addedCheckConstraints);\n\t\tdeleteCheckConstraints = prepareDeleteCheckConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.deletedCheckConstraints,\n\t\t);\n\n\t\tif (it.alteredCheckConstraints && action !== 'push') {\n\t\t\tconst added: Record<string, string> = {};\n\t\t\tconst deleted: Record<string, string> = {};\n\n\t\t\tfor (const k of Object.keys(it.alteredCheckConstraints)) {\n\t\t\t\tadded[k] = it.alteredCheckConstraints[k].__new;\n\t\t\t\tdeleted[k] = it.alteredCheckConstraints[k].__old;\n\t\t\t}\n\t\t\tcreateCheckConstraints.push(...prepareAddCheckConstraint(it.name, it.schema, added));\n\t\t\tdeleteCheckConstraints.push(...prepareDeleteCheckConstraint(it.name, it.schema, deleted));\n\t\t}\n\n\t\tjsonCreatedCheckConstraints.push(...createCheckConstraints);\n\t\tjsonDeletedCheckConstraints.push(...deleteCheckConstraints);\n\n\t\tjsonAddedCompositePKs.push(...addedCompositePKs);\n\t\tjsonDeletedCompositePKs.push(...deletedCompositePKs);\n\t\tjsonAlteredCompositePKs.push(...alteredCompositePKs);\n\n\t\tjsonAddedUniqueConstraints.push(...addedUniqueConstraints);\n\t\tjsonDeletedUniqueConstraints.push(...deletedUniqueConstraints);\n\t\tjsonAlteredUniqueConstraints.push(...alteredUniqueConstraints);\n\t}\n\n\tconst rColumns = jsonRenameColumnsStatements.map((it) => {\n\t\tconst tableName = it.tableName;\n\t\tconst schema = it.schema;\n\t\treturn {\n\t\t\tfrom: { schema, table: tableName, column: it.oldColumnName },\n\t\t\tto: { schema, table: tableName, column: it.newColumnName },\n\t\t};\n\t});\n\n\tconst jsonTableAlternations = alteredTables\n\t\t.map((it) => {\n\t\t\treturn preparePgAlterColumns(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.altered,\n\t\t\t\tjson2,\n\t\t\t\tjson1,\n\t\t\t\taction,\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonCreateIndexesFoAlteredTables = alteredTables\n\t\t.map((it) => {\n\t\t\treturn preparePgCreateIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.addedIndexes || {},\n\t\t\t\tcurFull,\n\t\t\t\taction,\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonDropIndexesForAllAlteredTables = alteredTables\n\t\t.map((it) => {\n\t\t\treturn prepareDropIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.deletedIndexes || {},\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonCreatePoliciesStatements: JsonCreatePolicyStatement[] = [];\n\tconst jsonDropPoliciesStatements: JsonDropPolicyStatement[] = [];\n\tconst jsonAlterPoliciesStatements: JsonAlterPolicyStatement[] = [];\n\tconst jsonRenamePoliciesStatements: JsonRenamePolicyStatement[] = [];\n\n\tconst jsonRenameIndPoliciesStatements: JsonIndRenamePolicyStatement[] = [];\n\tconst jsonCreateIndPoliciesStatements: JsonCreateIndPolicyStatement[] = [];\n\tconst jsonDropIndPoliciesStatements: JsonDropIndPolicyStatement[] = [];\n\tconst jsonAlterIndPoliciesStatements: JsonAlterIndPolicyStatement[] = [];\n\n\tconst jsonEnableRLSStatements: JsonEnableRLSStatement[] = [];\n\tconst jsonDisableRLSStatements: JsonDisableRLSStatement[] = [];\n\n\tfor (let it of indPolicyRenames) {\n\t\tjsonRenameIndPoliciesStatements.push(\n\t\t\t...prepareRenameIndPolicyJsons([it]),\n\t\t);\n\t}\n\n\tfor (const it of indPolicyCreates) {\n\t\tjsonCreateIndPoliciesStatements.push(\n\t\t\t...prepareCreateIndPolicyJsons(\n\t\t\t\tit.policies,\n\t\t\t),\n\t\t);\n\t}\n\n\tfor (const it of indPolicyDeletes) {\n\t\tjsonDropIndPoliciesStatements.push(\n\t\t\t...prepareDropIndPolicyJsons(\n\t\t\t\tit.policies,\n\t\t\t),\n\t\t);\n\t}\n\n\ttypedResult.alteredPolicies.forEach(({ values }) => {\n\t\t// return prepareAlterIndPolicyJson(json1.policies[it.name], json2.policies[it.name]);\n\n\t\tconst policy = action === 'push' ? PgSquasher.unsquashPolicyPush(values) : PgSquasher.unsquashPolicy(values);\n\n\t\tconst newPolicy = action === 'push'\n\t\t\t? PgSquasher.unsquashPolicyPush(json2.policies[policy.name].values)\n\t\t\t: PgSquasher.unsquashPolicy(json2.policies[policy.name].values);\n\t\tconst oldPolicy = action === 'push'\n\t\t\t? PgSquasher.unsquashPolicyPush(json2.policies[policy.name].values)\n\t\t\t: PgSquasher.unsquashPolicy(json1.policies[policy.name].values);\n\n\t\tif (newPolicy.as !== oldPolicy.as) {\n\t\t\tjsonDropIndPoliciesStatements.push(\n\t\t\t\t...prepareDropIndPolicyJsons(\n\t\t\t\t\t[oldPolicy],\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tjsonCreateIndPoliciesStatements.push(\n\t\t\t\t...prepareCreateIndPolicyJsons(\n\t\t\t\t\t[newPolicy],\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (newPolicy.for !== oldPolicy.for) {\n\t\t\tjsonDropIndPoliciesStatements.push(\n\t\t\t\t...prepareDropIndPolicyJsons(\n\t\t\t\t\t[oldPolicy],\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tjsonCreateIndPoliciesStatements.push(\n\t\t\t\t...prepareCreateIndPolicyJsons(\n\t\t\t\t\t[newPolicy],\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// alter\n\t\tjsonAlterIndPoliciesStatements.push(\n\t\t\tprepareAlterIndPolicyJson(\n\t\t\t\toldPolicy,\n\t\t\t\tnewPolicy,\n\t\t\t),\n\t\t);\n\t});\n\n\tfor (let it of policyRenames) {\n\t\tjsonRenamePoliciesStatements.push(\n\t\t\t...prepareRenamePolicyJsons(it.table, it.schema, it.renames),\n\t\t);\n\t}\n\n\tfor (const it of policyCreates) {\n\t\tjsonCreatePoliciesStatements.push(\n\t\t\t...prepareCreatePolicyJsons(\n\t\t\t\tit.table,\n\t\t\t\tit.schema,\n\t\t\t\tit.columns,\n\t\t\t),\n\t\t);\n\t}\n\n\tfor (const it of policyDeletes) {\n\t\tjsonDropPoliciesStatements.push(\n\t\t\t...prepareDropPolicyJsons(\n\t\t\t\tit.table,\n\t\t\t\tit.schema,\n\t\t\t\tit.columns,\n\t\t\t),\n\t\t);\n\t}\n\n\talteredTables.forEach((it) => {\n\t\t// handle policies\n\t\tObject.keys(it.alteredPolicies).forEach((policyName: string) => {\n\t\t\tconst newPolicy = action === 'push'\n\t\t\t\t? PgSquasher.unsquashPolicyPush(it.alteredPolicies[policyName].__new)\n\t\t\t\t: PgSquasher.unsquashPolicy(it.alteredPolicies[policyName].__new);\n\t\t\tconst oldPolicy = action === 'push'\n\t\t\t\t? PgSquasher.unsquashPolicyPush(it.alteredPolicies[policyName].__old)\n\t\t\t\t: PgSquasher.unsquashPolicy(it.alteredPolicies[policyName].__old);\n\n\t\t\tif (newPolicy.as !== oldPolicy.as) {\n\t\t\t\tjsonDropPoliciesStatements.push(\n\t\t\t\t\t...prepareDropPolicyJsons(\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\tit.schema,\n\t\t\t\t\t\t[oldPolicy],\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tjsonCreatePoliciesStatements.push(\n\t\t\t\t\t...prepareCreatePolicyJsons(\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\tit.schema,\n\t\t\t\t\t\t[newPolicy],\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (newPolicy.for !== oldPolicy.for) {\n\t\t\t\tjsonDropPoliciesStatements.push(\n\t\t\t\t\t...prepareDropPolicyJsons(\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\tit.schema,\n\t\t\t\t\t\t[oldPolicy],\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tjsonCreatePoliciesStatements.push(\n\t\t\t\t\t...prepareCreatePolicyJsons(\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\tit.schema,\n\t\t\t\t\t\t[newPolicy],\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// alter\n\t\t\tjsonAlterPoliciesStatements.push(\n\t\t\t\tprepareAlterPolicyJson(\n\t\t\t\t\tit.name,\n\t\t\t\t\tit.schema,\n\t\t\t\t\tit.alteredPolicies[policyName].__old,\n\t\t\t\t\tit.alteredPolicies[policyName].__new,\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\n\t\t// Handle enabling and disabling RLS\n\t\tfor (const table of Object.values(json2.tables)) {\n\t\t\tconst policiesInCurrentState = Object.keys(table.policies);\n\t\t\tconst tableInPreviousState =\n\t\t\t\tcolumnsPatchedSnap1.tables[`${table.schema === '' ? 'public' : table.schema}.${table.name}`];\n\t\t\tconst policiesInPreviousState = tableInPreviousState ? Object.keys(tableInPreviousState.policies) : [];\n\n\t\t\t// const indPoliciesInCurrentState = Object.keys(table.policies);\n\t\t\t// const indPoliciesInPreviousState = Object.keys(columnsPatchedSnap1.policies);\n\n\t\t\tif (\n\t\t\t\t(policiesInPreviousState.length === 0 && policiesInCurrentState.length > 0) && !table.isRLSEnabled\n\t\t\t) {\n\t\t\t\tjsonEnableRLSStatements.push({ type: 'enable_rls', tableName: table.name, schema: table.schema });\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(policiesInPreviousState.length > 0 && policiesInCurrentState.length === 0) && !table.isRLSEnabled\n\t\t\t) {\n\t\t\t\tjsonDisableRLSStatements.push({ type: 'disable_rls', tableName: table.name, schema: table.schema });\n\t\t\t}\n\n\t\t\t// handle table.isRLSEnabled\n\t\t\tconst wasRlsEnabled = tableInPreviousState ? tableInPreviousState.isRLSEnabled : false;\n\t\t\tif (table.isRLSEnabled !== wasRlsEnabled) {\n\t\t\t\tif (table.isRLSEnabled) {\n\t\t\t\t\t// was force enabled\n\t\t\t\t\tjsonEnableRLSStatements.push({ type: 'enable_rls', tableName: table.name, schema: table.schema });\n\t\t\t\t} else if (\n\t\t\t\t\t!table.isRLSEnabled && policiesInCurrentState.length === 0\n\t\t\t\t) {\n\t\t\t\t\t// was force disabled\n\t\t\t\t\tjsonDisableRLSStatements.push({ type: 'disable_rls', tableName: table.name, schema: table.schema });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const table of Object.values(columnsPatchedSnap1.tables)) {\n\t\t\tconst tableInCurrentState = json2.tables[`${table.schema === '' ? 'public' : table.schema}.${table.name}`];\n\n\t\t\tif (tableInCurrentState === undefined && !table.isRLSEnabled) {\n\t\t\t\tjsonDisableRLSStatements.push({ type: 'disable_rls', tableName: table.name, schema: table.schema });\n\t\t\t}\n\t\t}\n\n\t\t// handle indexes\n\t\tconst droppedIndexes = Object.keys(it.alteredIndexes).reduce(\n\t\t\t(current, item: string) => {\n\t\t\t\tcurrent[item] = it.alteredIndexes[item].__old;\n\t\t\t\treturn current;\n\t\t\t},\n\t\t\t{} as Record<string, string>,\n\t\t);\n\t\tconst createdIndexes = Object.keys(it.alteredIndexes).reduce(\n\t\t\t(current, item: string) => {\n\t\t\t\tcurrent[item] = it.alteredIndexes[item].__new;\n\t\t\t\treturn current;\n\t\t\t},\n\t\t\t{} as Record<string, string>,\n\t\t);\n\n\t\tjsonCreateIndexesFoAlteredTables.push(\n\t\t\t...preparePgCreateIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tcreatedIndexes || {},\n\t\t\t\tcurFull,\n\t\t\t\taction,\n\t\t\t),\n\t\t);\n\t\tjsonDropIndexesForAllAlteredTables.push(\n\t\t\t...prepareDropIndexesJson(it.name, it.schema, droppedIndexes || {}),\n\t\t);\n\t});\n\n\tconst jsonCreateReferencesForCreatedTables: JsonCreateReferenceStatement[] = createdTables\n\t\t.map((it) => {\n\t\t\treturn prepareCreateReferencesJson(it.name, it.schema, it.foreignKeys);\n\t\t})\n\t\t.flat();\n\n\tconst jsonReferencesForAlteredTables: JsonReferenceStatement[] = alteredTables\n\t\t.map((it) => {\n\t\t\tconst forAdded = prepareCreateReferencesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.addedForeignKeys,\n\t\t\t);\n\n\t\t\tconst forAltered = prepareDropReferencesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.deletedForeignKeys,\n\t\t\t);\n\n\t\t\tconst alteredFKs = prepareAlterReferencesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.alteredForeignKeys,\n\t\t\t);\n\n\t\t\treturn [...forAdded, ...forAltered, ...alteredFKs];\n\t\t})\n\t\t.flat();\n\n\tconst jsonCreatedReferencesForAlteredTables = jsonReferencesForAlteredTables.filter((t) =>\n\t\tt.type === 'create_reference'\n\t);\n\n\tconst jsonDroppedReferencesForAlteredTables = jsonReferencesForAlteredTables.filter((t) =>\n\t\tt.type === 'delete_reference'\n\t);\n\n\t// Sequences\n\t// - create sequence ✅\n\t// - create sequence inside schema ✅\n\t// - rename sequence ✅\n\t// - change sequence schema ✅\n\t// - change sequence schema + name ✅\n\t// - drop sequence - check if sequence is in use. If yes - ???\n\t// - change sequence values ✅\n\n\t// Generated columns\n\t// - add generated\n\t// - drop generated\n\t// - create table with generated\n\t// - alter - should be not triggered, but should get warning\n\n\tconst createEnums = createdEnums.map((it) => {\n\t\treturn prepareCreateEnumJson(it.name, it.schema, it.values);\n\t}) ?? [];\n\n\tconst dropEnums = deletedEnums.map((it) => {\n\t\treturn prepareDropEnumJson(it.name, it.schema);\n\t});\n\n\tconst moveEnums = movedEnums.map((it) => {\n\t\treturn prepareMoveEnumJson(it.name, it.schemaFrom, it.schemaTo);\n\t});\n\n\tconst renameEnums = renamedEnums.map((it) => {\n\t\treturn prepareRenameEnumJson(it.from.name, it.to.name, it.to.schema);\n\t});\n\n\tconst jsonAlterEnumsWithAddedValues = typedResult.alteredEnums\n\t\t.map((it) => {\n\t\t\treturn prepareAddValuesToEnumJson(it.name, it.schema, it.addedValues);\n\t\t})\n\t\t.flat() ?? [];\n\n\tconst jsonAlterEnumsWithDroppedValues = typedResult.alteredEnums\n\t\t.map((it) => {\n\t\t\treturn prepareDropEnumValues(it.name, it.schema, it.deletedValues, curFull);\n\t\t})\n\t\t.flat() ?? [];\n\n\tconst createSequences = createdSequences.map((it) => {\n\t\treturn prepareCreateSequenceJson(it);\n\t}) ?? [];\n\n\tconst dropSequences = deletedSequences.map((it) => {\n\t\treturn prepareDropSequenceJson(it.name, it.schema);\n\t});\n\n\tconst moveSequences = movedSequences.map((it) => {\n\t\treturn prepareMoveSequenceJson(it.name, it.schemaFrom, it.schemaTo);\n\t});\n\n\tconst renameSequences = renamedSequences.map((it) => {\n\t\treturn prepareRenameSequenceJson(it.from.name, it.to.name, it.to.schema);\n\t});\n\n\tconst jsonAlterSequences = typedResult.alteredSequences\n\t\t.map((it) => {\n\t\t\treturn prepareAlterSequenceJson(it);\n\t\t})\n\t\t.flat() ?? [];\n\n\t////////////\n\n\tconst createRoles = createdRoles.map((it) => {\n\t\treturn prepareCreateRoleJson(it);\n\t}) ?? [];\n\n\tconst dropRoles = deletedRoles.map((it) => {\n\t\treturn prepareDropRoleJson(it.name);\n\t});\n\n\tconst renameRoles = renamedRoles.map((it) => {\n\t\treturn prepareRenameRoleJson(it.from.name, it.to.name);\n\t});\n\n\tconst jsonAlterRoles = typedResult.alteredRoles\n\t\t.map((it) => {\n\t\t\treturn prepareAlterRoleJson(it);\n\t\t})\n\t\t.flat() ?? [];\n\n\t////////////\n\tconst createSchemas = prepareCreateSchemasJson(\n\t\tcreatedSchemas.map((it) => it.name),\n\t);\n\n\tconst renameSchemas = prepareRenameSchemasJson(\n\t\trenamedSchemas.map((it) => ({ from: it.from.name, to: it.to.name })),\n\t);\n\n\tconst dropSchemas = prepareDropSchemasJson(\n\t\tdeletedSchemas.map((it) => it.name),\n\t);\n\n\tconst createTables = createdTables.map((it) => {\n\t\treturn preparePgCreateTableJson(it, curFull);\n\t});\n\n\tjsonCreatePoliciesStatements.push(...([] as JsonCreatePolicyStatement[]).concat(\n\t\t...(createdTables.map((it) =>\n\t\t\tprepareCreatePolicyJsons(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tObject.values(it.policies).map(action === 'push' ? PgSquasher.unsquashPolicyPush : PgSquasher.unsquashPolicy),\n\t\t\t)\n\t\t)),\n\t));\n\tconst createViews: JsonCreatePgViewStatement[] = [];\n\tconst dropViews: JsonDropViewStatement[] = [];\n\tconst renameViews: JsonRenameViewStatement[] = [];\n\tconst alterViews: JsonAlterViewStatement[] = [];\n\n\tcreateViews.push(\n\t\t...createdViews.filter((it) => !it.isExisting).map((it) => {\n\t\t\treturn preparePgCreateViewJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.definition!,\n\t\t\t\tit.materialized,\n\t\t\t\tit.withNoData,\n\t\t\t\tit.with,\n\t\t\t\tit.using,\n\t\t\t\tit.tablespace,\n\t\t\t);\n\t\t}),\n\t);\n\n\tdropViews.push(\n\t\t...deletedViews.filter((it) => !it.isExisting).map((it) => {\n\t\t\treturn prepareDropViewJson(it.name, it.schema, it.materialized);\n\t\t}),\n\t);\n\n\trenameViews.push(\n\t\t...renamedViews.filter((it) => !it.to.isExisting && !json1.views[`${it.from.schema}.${it.from.name}`].isExisting)\n\t\t\t.map((it) => {\n\t\t\t\treturn prepareRenameViewJson(it.to.name, it.from.name, it.to.schema, it.to.materialized);\n\t\t\t}),\n\t);\n\n\talterViews.push(\n\t\t...movedViews.filter((it) =>\n\t\t\t!json2.views[`${it.schemaTo}.${it.name}`].isExisting && !json1.views[`${it.schemaFrom}.${it.name}`].isExisting\n\t\t).map((it) => {\n\t\t\treturn preparePgAlterViewAlterSchemaJson(\n\t\t\t\tit.schemaTo,\n\t\t\t\tit.schemaFrom,\n\t\t\t\tit.name,\n\t\t\t\tjson2.views[`${it.schemaTo}.${it.name}`].materialized,\n\t\t\t);\n\t\t}),\n\t);\n\n\tconst alteredViews = typedResult.alteredViews.filter((it) => !json2.views[`${it.schema}.${it.name}`].isExisting);\n\n\tfor (const alteredView of alteredViews) {\n\t\tconst viewKey = `${alteredView.schema}.${alteredView.name}`;\n\n\t\tconst { materialized, with: withOption, definition, withNoData, using, tablespace } = json2.views[viewKey];\n\n\t\tif (alteredView.alteredExisting || (alteredView.alteredDefinition && action !== 'push')) {\n\t\t\tdropViews.push(prepareDropViewJson(alteredView.name, alteredView.schema, materialized));\n\n\t\t\tcreateViews.push(\n\t\t\t\tpreparePgCreateViewJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\talteredView.schema,\n\t\t\t\t\tdefinition!,\n\t\t\t\t\tmaterialized,\n\t\t\t\t\twithNoData,\n\t\t\t\t\twithOption,\n\t\t\t\t\tusing,\n\t\t\t\t\ttablespace,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (alteredView.addedWithOption) {\n\t\t\talterViews.push(\n\t\t\t\tpreparePgAlterViewAddWithOptionJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\talteredView.schema,\n\t\t\t\t\tmaterialized,\n\t\t\t\t\talteredView.addedWithOption,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (alteredView.deletedWithOption) {\n\t\t\talterViews.push(\n\t\t\t\tpreparePgAlterViewDropWithOptionJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\talteredView.schema,\n\t\t\t\t\tmaterialized,\n\t\t\t\t\talteredView.deletedWithOption,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (alteredView.addedWith) {\n\t\t\talterViews.push(\n\t\t\t\tpreparePgAlterViewAddWithOptionJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\talteredView.schema,\n\t\t\t\t\tmaterialized,\n\t\t\t\t\talteredView.addedWith,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (alteredView.deletedWith) {\n\t\t\talterViews.push(\n\t\t\t\tpreparePgAlterViewDropWithOptionJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\talteredView.schema,\n\t\t\t\t\tmaterialized,\n\t\t\t\t\talteredView.deletedWith,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (alteredView.alteredWith) {\n\t\t\talterViews.push(\n\t\t\t\tpreparePgAlterViewAddWithOptionJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\talteredView.schema,\n\t\t\t\t\tmaterialized,\n\t\t\t\t\talteredView.alteredWith,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (alteredView.alteredTablespace) {\n\t\t\talterViews.push(\n\t\t\t\tpreparePgAlterViewAlterTablespaceJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\talteredView.schema,\n\t\t\t\t\tmaterialized,\n\t\t\t\t\talteredView.alteredTablespace.__new,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (alteredView.alteredUsing) {\n\t\t\talterViews.push(\n\t\t\t\tpreparePgAlterViewAlterUsingJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\talteredView.schema,\n\t\t\t\t\tmaterialized,\n\t\t\t\t\talteredView.alteredUsing.__new,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tjsonStatements.push(...createSchemas);\n\tjsonStatements.push(...renameSchemas);\n\tjsonStatements.push(...createEnums);\n\tjsonStatements.push(...moveEnums);\n\tjsonStatements.push(...renameEnums);\n\tjsonStatements.push(...jsonAlterEnumsWithAddedValues);\n\n\tjsonStatements.push(...createSequences);\n\tjsonStatements.push(...moveSequences);\n\tjsonStatements.push(...renameSequences);\n\tjsonStatements.push(...jsonAlterSequences);\n\n\tjsonStatements.push(...renameRoles);\n\tjsonStatements.push(...dropRoles);\n\tjsonStatements.push(...createRoles);\n\tjsonStatements.push(...jsonAlterRoles);\n\n\tjsonStatements.push(...createTables);\n\n\tjsonStatements.push(...jsonEnableRLSStatements);\n\tjsonStatements.push(...jsonDisableRLSStatements);\n\tjsonStatements.push(...dropViews);\n\tjsonStatements.push(...renameViews);\n\tjsonStatements.push(...alterViews);\n\n\tjsonStatements.push(...jsonDropTables);\n\tjsonStatements.push(...jsonSetTableSchemas);\n\tjsonStatements.push(...jsonRenameTables);\n\tjsonStatements.push(...jsonRenameColumnsStatements);\n\n\tjsonStatements.push(...jsonDeletedUniqueConstraints);\n\tjsonStatements.push(...jsonDeletedCheckConstraints);\n\n\tjsonStatements.push(...jsonDroppedReferencesForAlteredTables);\n\n\tjsonStatements.push(...jsonAlterEnumsWithDroppedValues);\n\n\t// Will need to drop indexes before changing any columns in table\n\t// Then should go column alternations and then index creation\n\tjsonStatements.push(...jsonDropIndexesForAllAlteredTables);\n\n\tjsonStatements.push(...jsonDeletedCompositePKs);\n\tjsonStatements.push(...jsonTableAlternations);\n\tjsonStatements.push(...jsonAddedCompositePKs);\n\tjsonStatements.push(...jsonAddColumnsStatemets);\n\n\tjsonStatements.push(...jsonCreateReferencesForCreatedTables);\n\tjsonStatements.push(...jsonCreateIndexesForCreatedTables);\n\n\tjsonStatements.push(...jsonCreatedReferencesForAlteredTables);\n\tjsonStatements.push(...jsonCreateIndexesFoAlteredTables);\n\n\tjsonStatements.push(...jsonDropColumnsStatemets);\n\tjsonStatements.push(...jsonAlteredCompositePKs);\n\n\tjsonStatements.push(...jsonAddedUniqueConstraints);\n\tjsonStatements.push(...jsonCreatedCheckConstraints);\n\n\tjsonStatements.push(...jsonAlteredUniqueConstraints);\n\n\tjsonStatements.push(...createViews);\n\n\tjsonStatements.push(...jsonRenamePoliciesStatements);\n\tjsonStatements.push(...jsonDropPoliciesStatements);\n\tjsonStatements.push(...jsonCreatePoliciesStatements);\n\tjsonStatements.push(...jsonAlterPoliciesStatements);\n\n\tjsonStatements.push(...jsonRenameIndPoliciesStatements);\n\tjsonStatements.push(...jsonDropIndPoliciesStatements);\n\tjsonStatements.push(...jsonCreateIndPoliciesStatements);\n\tjsonStatements.push(...jsonAlterIndPoliciesStatements);\n\n\tjsonStatements.push(...dropEnums);\n\tjsonStatements.push(...dropSequences);\n\tjsonStatements.push(...dropSchemas);\n\n\t// generate filters\n\tconst filteredJsonStatements = jsonStatements.filter((st) => {\n\t\tif (st.type === 'alter_table_alter_column_drop_notnull') {\n\t\t\tif (\n\t\t\t\tjsonStatements.find(\n\t\t\t\t\t(it) =>\n\t\t\t\t\t\tit.type === 'alter_table_alter_column_drop_identity'\n\t\t\t\t\t\t&& it.tableName === st.tableName\n\t\t\t\t\t\t&& it.schema === st.schema,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif (st.type === 'alter_table_alter_column_set_notnull') {\n\t\t\tif (\n\t\t\t\tjsonStatements.find(\n\t\t\t\t\t(it) =>\n\t\t\t\t\t\tit.type === 'alter_table_alter_column_set_identity'\n\t\t\t\t\t\t&& it.tableName === st.tableName\n\t\t\t\t\t\t&& it.schema === st.schema,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t});\n\n\t// enum filters\n\t// Need to find add and drop enum values in same enum and remove add values\n\tconst filteredEnumsJsonStatements = filteredJsonStatements.filter((st) => {\n\t\tif (st.type === 'alter_type_add_value') {\n\t\t\tif (\n\t\t\t\tfilteredJsonStatements.find(\n\t\t\t\t\t(it) =>\n\t\t\t\t\t\tit.type === 'alter_type_drop_value'\n\t\t\t\t\t\t&& it.name === st.name\n\t\t\t\t\t\t&& it.enumSchema === st.schema,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t});\n\n\t// This is needed because in sql generator on type pg_alter_table_alter_column_set_type and alter_type_drop_value\n\t// drizzle kit checks whether column has defaults to cast them to new types properly\n\tconst filteredEnums2JsonStatements = filteredEnumsJsonStatements.filter((st) => {\n\t\tif (st.type === 'alter_table_alter_column_set_default') {\n\t\t\tif (\n\t\t\t\tfilteredEnumsJsonStatements.find(\n\t\t\t\t\t(it) =>\n\t\t\t\t\t\tit.type === 'pg_alter_table_alter_column_set_type'\n\t\t\t\t\t\t&& it.columnDefault === st.newDefaultValue\n\t\t\t\t\t\t&& it.columnName === st.columnName\n\t\t\t\t\t\t&& it.tableName === st.tableName\n\t\t\t\t\t\t&& it.schema === st.schema,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tfilteredEnumsJsonStatements.find(\n\t\t\t\t\t(it) =>\n\t\t\t\t\t\tit.type === 'alter_type_drop_value'\n\t\t\t\t\t\t&& it.columnsWithEnum.find((column) =>\n\t\t\t\t\t\t\tcolumn.default === st.newDefaultValue\n\t\t\t\t\t\t\t&& column.column === st.columnName\n\t\t\t\t\t\t\t&& column.table === st.tableName\n\t\t\t\t\t\t\t&& column.tableSchema === st.schema\n\t\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t});\n\n\tconst sqlStatements = fromJson(filteredEnums2JsonStatements, 'postgresql', action);\n\n\tconst uniqueSqlStatements: string[] = [];\n\tsqlStatements.forEach((ss) => {\n\t\tif (!uniqueSqlStatements.includes(ss)) {\n\t\t\tuniqueSqlStatements.push(ss);\n\t\t}\n\t});\n\n\tconst rSchemas = renamedSchemas.map((it) => ({\n\t\tfrom: it.from.name,\n\t\tto: it.to.name,\n\t}));\n\n\tconst rTables = renamedTables.map((it) => {\n\t\treturn { from: it.from, to: it.to };\n\t});\n\n\tconst _meta = prepareMigrationMeta(rSchemas, rTables, rColumns);\n\n\treturn {\n\t\tstatements: filteredEnums2JsonStatements,\n\t\tsqlStatements: uniqueSqlStatements,\n\t\t_meta,\n\t};\n};\n\nexport const applyMysqlSnapshotsDiff = async (\n\tjson1: MySqlSchemaSquashed,\n\tjson2: MySqlSchemaSquashed,\n\ttablesResolver: (\n\t\tinput: ResolverInput<Table>,\n\t) => Promise<ResolverOutputWithMoved<Table>>,\n\tcolumnsResolver: (\n\t\tinput: ColumnsResolverInput<Column>,\n\t) => Promise<ColumnsResolverOutput<Column>>,\n\tviewsResolver: (\n\t\tinput: ResolverInput<ViewSquashed & { schema: '' }>,\n\t) => Promise<ResolverOutputWithMoved<ViewSquashed>>,\n\tprevFull: MySqlSchema,\n\tcurFull: MySqlSchema,\n\taction?: 'push' | undefined,\n): Promise<{\n\tstatements: JsonStatement[];\n\tsqlStatements: string[];\n\t_meta:\n\t\t| {\n\t\t\tschemas: {};\n\t\t\ttables: {};\n\t\t\tcolumns: {};\n\t\t}\n\t\t| undefined;\n}> => {\n\t// squash indexes and fks\n\n\t// squash uniqueIndexes and uniqueConstraint into constraints object\n\t// it should be done for mysql only because it has no diffs for it\n\n\t// TODO: @AndriiSherman\n\t// Add an upgrade to v6 and move all snaphosts to this strcutre\n\t// After that we can generate mysql in 1 object directly(same as sqlite)\n\tfor (const tableName in json1.tables) {\n\t\tconst table = json1.tables[tableName];\n\t\tfor (const indexName in table.indexes) {\n\t\t\tconst index = MySqlSquasher.unsquashIdx(table.indexes[indexName]);\n\t\t\tif (index.isUnique) {\n\t\t\t\ttable.uniqueConstraints[indexName] = MySqlSquasher.squashUnique({\n\t\t\t\t\tname: index.name,\n\t\t\t\t\tcolumns: index.columns,\n\t\t\t\t});\n\t\t\t\tdelete json1.tables[tableName].indexes[index.name];\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const tableName in json2.tables) {\n\t\tconst table = json2.tables[tableName];\n\t\tfor (const indexName in table.indexes) {\n\t\t\tconst index = MySqlSquasher.unsquashIdx(table.indexes[indexName]);\n\t\t\tif (index.isUnique) {\n\t\t\t\ttable.uniqueConstraints[indexName] = MySqlSquasher.squashUnique({\n\t\t\t\t\tname: index.name,\n\t\t\t\t\tcolumns: index.columns,\n\t\t\t\t});\n\t\t\t\tdelete json2.tables[tableName].indexes[index.name];\n\t\t\t}\n\t\t}\n\t}\n\n\tconst tablesDiff = diffSchemasOrTables(json1.tables, json2.tables);\n\n\tconst {\n\t\tcreated: createdTables,\n\t\tdeleted: deletedTables,\n\t\trenamed: renamedTables, // renamed or moved\n\t} = await tablesResolver({\n\t\tcreated: tablesDiff.added,\n\t\tdeleted: tablesDiff.deleted,\n\t});\n\n\tconst tablesPatchedSnap1 = copy(json1);\n\ttablesPatchedSnap1.tables = mapEntries(tablesPatchedSnap1.tables, (_, it) => {\n\t\tconst { name } = nameChangeFor(it, renamedTables);\n\t\tit.name = name;\n\t\treturn [name, it];\n\t});\n\n\tconst res = diffColumns(tablesPatchedSnap1.tables, json2.tables);\n\tconst columnRenames = [] as {\n\t\ttable: string;\n\t\trenames: { from: Column; to: Column }[];\n\t}[];\n\n\tconst columnCreates = [] as {\n\t\ttable: string;\n\t\tcolumns: Column[];\n\t}[];\n\n\tconst columnDeletes = [] as {\n\t\ttable: string;\n\t\tcolumns: Column[];\n\t}[];\n\n\tfor (let entry of Object.values(res)) {\n\t\tconst { renamed, created, deleted } = await columnsResolver({\n\t\t\ttableName: entry.name,\n\t\t\tschema: entry.schema,\n\t\t\tdeleted: entry.columns.deleted,\n\t\t\tcreated: entry.columns.added,\n\t\t});\n\n\t\tif (created.length > 0) {\n\t\t\tcolumnCreates.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tcolumns: created,\n\t\t\t});\n\t\t}\n\n\t\tif (deleted.length > 0) {\n\t\t\tcolumnDeletes.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tcolumns: deleted,\n\t\t\t});\n\t\t}\n\n\t\tif (renamed.length > 0) {\n\t\t\tcolumnRenames.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\trenames: renamed,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst columnRenamesDict = columnRenames.reduce(\n\t\t(acc, it) => {\n\t\t\tacc[it.table] = it.renames;\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tfrom: Named;\n\t\t\t\tto: Named;\n\t\t\t}[]\n\t\t>,\n\t);\n\n\tconst columnsPatchedSnap1 = copy(tablesPatchedSnap1);\n\tcolumnsPatchedSnap1.tables = mapEntries(\n\t\tcolumnsPatchedSnap1.tables,\n\t\t(tableKey, tableValue) => {\n\t\t\tconst patchedColumns = mapKeys(\n\t\t\t\ttableValue.columns,\n\t\t\t\t(columnKey, column) => {\n\t\t\t\t\tconst rens = columnRenamesDict[tableValue.name] || [];\n\t\t\t\t\tconst newName = columnChangeFor(columnKey, rens);\n\t\t\t\t\tcolumn.name = newName;\n\t\t\t\t\treturn newName;\n\t\t\t\t},\n\t\t\t);\n\n\t\t\ttableValue.columns = patchedColumns;\n\t\t\treturn [tableKey, tableValue];\n\t\t},\n\t);\n\n\tconst viewsDiff = diffSchemasOrTables(json1.views, json2.views);\n\n\tconst {\n\t\tcreated: createdViews,\n\t\tdeleted: deletedViews,\n\t\trenamed: renamedViews, // renamed or moved\n\t} = await viewsResolver({\n\t\tcreated: viewsDiff.added,\n\t\tdeleted: viewsDiff.deleted,\n\t});\n\n\tconst renamesViewDic: Record<string, { to: string; from: string }> = {};\n\trenamedViews.forEach((it) => {\n\t\trenamesViewDic[it.from.name] = { to: it.to.name, from: it.from.name };\n\t});\n\n\tconst viewsPatchedSnap1 = copy(columnsPatchedSnap1);\n\tviewsPatchedSnap1.views = mapEntries(\n\t\tviewsPatchedSnap1.views,\n\t\t(viewKey, viewValue) => {\n\t\t\tconst rename = renamesViewDic[viewValue.name];\n\n\t\t\tif (rename) {\n\t\t\t\tviewValue.name = rename.to;\n\t\t\t\tviewKey = rename.to;\n\t\t\t}\n\n\t\t\treturn [viewKey, viewValue];\n\t\t},\n\t);\n\n\tconst diffResult = applyJsonDiff(viewsPatchedSnap1, json2);\n\n\tconst typedResult: DiffResultMysql = diffResultSchemeMysql.parse(diffResult);\n\n\tconst jsonStatements: JsonStatement[] = [];\n\n\tconst jsonCreateIndexesForCreatedTables = createdTables\n\t\t.map((it) => {\n\t\t\treturn prepareCreateIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.indexes,\n\t\t\t\tcurFull.internal,\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonDropTables = deletedTables.map((it) => {\n\t\treturn prepareDropTableJson(it);\n\t});\n\n\tconst jsonRenameTables = renamedTables.map((it) => {\n\t\treturn prepareRenameTableJson(it.from, it.to);\n\t});\n\n\tconst alteredTables = typedResult.alteredTablesWithColumns;\n\n\tconst jsonAddedCompositePKs: JsonCreateCompositePK[] = [];\n\tconst jsonDeletedCompositePKs: JsonDeleteCompositePK[] = [];\n\tconst jsonAlteredCompositePKs: JsonAlterCompositePK[] = [];\n\n\tconst jsonAddedUniqueConstraints: JsonCreateUniqueConstraint[] = [];\n\tconst jsonDeletedUniqueConstraints: JsonDeleteUniqueConstraint[] = [];\n\tconst jsonAlteredUniqueConstraints: JsonAlterUniqueConstraint[] = [];\n\n\tconst jsonCreatedCheckConstraints: JsonCreateCheckConstraint[] = [];\n\tconst jsonDeletedCheckConstraints: JsonDeleteCheckConstraint[] = [];\n\n\tconst jsonRenameColumnsStatements: JsonRenameColumnStatement[] = columnRenames\n\t\t.map((it) => prepareRenameColumns(it.table, '', it.renames))\n\t\t.flat();\n\n\tconst jsonAddColumnsStatemets: JsonAddColumnStatement[] = columnCreates\n\t\t.map((it) => _prepareAddColumns(it.table, '', it.columns))\n\t\t.flat();\n\n\tconst jsonDropColumnsStatemets: JsonDropColumnStatement[] = columnDeletes\n\t\t.map((it) => _prepareDropColumns(it.table, '', it.columns))\n\t\t.flat();\n\n\talteredTables.forEach((it) => {\n\t\t// This part is needed to make sure that same columns in a table are not triggered for change\n\t\t// there is a case where orm and kit are responsible for pk name generation and one of them is not sorting name\n\t\t// We double-check that pk with same set of columns are both in added and deleted diffs\n\t\tlet addedColumns: string[] = [];\n\t\tfor (const addedPkName of Object.keys(it.addedCompositePKs)) {\n\t\t\tconst addedPkColumns = it.addedCompositePKs[addedPkName];\n\t\t\taddedColumns = MySqlSquasher.unsquashPK(addedPkColumns).columns;\n\t\t}\n\n\t\tlet deletedColumns: string[] = [];\n\t\tfor (const deletedPkName of Object.keys(it.deletedCompositePKs)) {\n\t\t\tconst deletedPkColumns = it.deletedCompositePKs[deletedPkName];\n\t\t\tdeletedColumns = MySqlSquasher.unsquashPK(deletedPkColumns).columns;\n\t\t}\n\n\t\t// Don't need to sort, but need to add tests for it\n\t\t// addedColumns.sort();\n\t\t// deletedColumns.sort();\n\t\tconst doPerformDeleteAndCreate = JSON.stringify(addedColumns) !== JSON.stringify(deletedColumns);\n\n\t\tlet addedCompositePKs: JsonCreateCompositePK[] = [];\n\t\tlet deletedCompositePKs: JsonDeleteCompositePK[] = [];\n\t\tlet alteredCompositePKs: JsonAlterCompositePK[] = [];\n\n\t\taddedCompositePKs = prepareAddCompositePrimaryKeyMySql(\n\t\t\tit.name,\n\t\t\tit.addedCompositePKs,\n\t\t\tprevFull,\n\t\t\tcurFull,\n\t\t);\n\t\tdeletedCompositePKs = prepareDeleteCompositePrimaryKeyMySql(\n\t\t\tit.name,\n\t\t\tit.deletedCompositePKs,\n\t\t\tprevFull,\n\t\t);\n\t\t// }\n\t\talteredCompositePKs = prepareAlterCompositePrimaryKeyMySql(\n\t\t\tit.name,\n\t\t\tit.alteredCompositePKs,\n\t\t\tprevFull,\n\t\t\tcurFull,\n\t\t);\n\n\t\t// add logic for unique constraints\n\t\tlet addedUniqueConstraints: JsonCreateUniqueConstraint[] = [];\n\t\tlet deletedUniqueConstraints: JsonDeleteUniqueConstraint[] = [];\n\t\tlet alteredUniqueConstraints: JsonAlterUniqueConstraint[] = [];\n\n\t\tlet createdCheckConstraints: JsonCreateCheckConstraint[] = [];\n\t\tlet deletedCheckConstraints: JsonDeleteCheckConstraint[] = [];\n\n\t\taddedUniqueConstraints = prepareAddUniqueConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.addedUniqueConstraints,\n\t\t);\n\t\tdeletedUniqueConstraints = prepareDeleteUniqueConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.deletedUniqueConstraints,\n\t\t);\n\t\tif (it.alteredUniqueConstraints) {\n\t\t\tconst added: Record<string, string> = {};\n\t\t\tconst deleted: Record<string, string> = {};\n\t\t\tfor (const k of Object.keys(it.alteredUniqueConstraints)) {\n\t\t\t\tadded[k] = it.alteredUniqueConstraints[k].__new;\n\t\t\t\tdeleted[k] = it.alteredUniqueConstraints[k].__old;\n\t\t\t}\n\t\t\taddedUniqueConstraints.push(\n\t\t\t\t...prepareAddUniqueConstraint(it.name, it.schema, added),\n\t\t\t);\n\t\t\tdeletedUniqueConstraints.push(\n\t\t\t\t...prepareDeleteUniqueConstraint(it.name, it.schema, deleted),\n\t\t\t);\n\t\t}\n\n\t\tcreatedCheckConstraints = prepareAddCheckConstraint(it.name, it.schema, it.addedCheckConstraints);\n\t\tdeletedCheckConstraints = prepareDeleteCheckConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.deletedCheckConstraints,\n\t\t);\n\n\t\t// skip for push\n\t\tif (it.alteredCheckConstraints && action !== 'push') {\n\t\t\tconst added: Record<string, string> = {};\n\t\t\tconst deleted: Record<string, string> = {};\n\n\t\t\tfor (const k of Object.keys(it.alteredCheckConstraints)) {\n\t\t\t\tadded[k] = it.alteredCheckConstraints[k].__new;\n\t\t\t\tdeleted[k] = it.alteredCheckConstraints[k].__old;\n\t\t\t}\n\t\t\tcreatedCheckConstraints.push(...prepareAddCheckConstraint(it.name, it.schema, added));\n\t\t\tdeletedCheckConstraints.push(...prepareDeleteCheckConstraint(it.name, it.schema, deleted));\n\t\t}\n\n\t\tjsonAddedCompositePKs.push(...addedCompositePKs);\n\t\tjsonDeletedCompositePKs.push(...deletedCompositePKs);\n\t\tjsonAlteredCompositePKs.push(...alteredCompositePKs);\n\n\t\tjsonAddedUniqueConstraints.push(...addedUniqueConstraints);\n\t\tjsonDeletedUniqueConstraints.push(...deletedUniqueConstraints);\n\t\tjsonAlteredUniqueConstraints.push(...alteredUniqueConstraints);\n\n\t\tjsonCreatedCheckConstraints.push(...createdCheckConstraints);\n\t\tjsonDeletedCheckConstraints.push(...deletedCheckConstraints);\n\t});\n\n\tconst rColumns = jsonRenameColumnsStatements.map((it) => {\n\t\tconst tableName = it.tableName;\n\t\tconst schema = it.schema;\n\t\treturn {\n\t\t\tfrom: { schema, table: tableName, column: it.oldColumnName },\n\t\t\tto: { schema, table: tableName, column: it.newColumnName },\n\t\t};\n\t});\n\n\tconst jsonTableAlternations = alteredTables\n\t\t.map((it) => {\n\t\t\treturn prepareAlterColumnsMysql(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.altered,\n\t\t\t\tjson1,\n\t\t\t\tjson2,\n\t\t\t\taction,\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonCreateIndexesForAllAlteredTables = alteredTables\n\t\t.map((it) => {\n\t\t\treturn prepareCreateIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.addedIndexes || {},\n\t\t\t\tcurFull.internal,\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonDropIndexesForAllAlteredTables = alteredTables\n\t\t.map((it) => {\n\t\t\treturn prepareDropIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.deletedIndexes || {},\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\talteredTables.forEach((it) => {\n\t\tconst droppedIndexes = Object.keys(it.alteredIndexes).reduce(\n\t\t\t(current, item: string) => {\n\t\t\t\tcurrent[item] = it.alteredIndexes[item].__old;\n\t\t\t\treturn current;\n\t\t\t},\n\t\t\t{} as Record<string, string>,\n\t\t);\n\t\tconst createdIndexes = Object.keys(it.alteredIndexes).reduce(\n\t\t\t(current, item: string) => {\n\t\t\t\tcurrent[item] = it.alteredIndexes[item].__new;\n\t\t\t\treturn current;\n\t\t\t},\n\t\t\t{} as Record<string, string>,\n\t\t);\n\n\t\tjsonCreateIndexesForAllAlteredTables.push(\n\t\t\t...prepareCreateIndexesJson(it.name, it.schema, createdIndexes || {}),\n\t\t);\n\t\tjsonDropIndexesForAllAlteredTables.push(\n\t\t\t...prepareDropIndexesJson(it.name, it.schema, droppedIndexes || {}),\n\t\t);\n\t});\n\n\tconst jsonCreateReferencesForCreatedTables: JsonCreateReferenceStatement[] = createdTables\n\t\t.map((it) => {\n\t\t\treturn prepareCreateReferencesJson(it.name, it.schema, it.foreignKeys);\n\t\t})\n\t\t.flat();\n\n\tconst jsonReferencesForAllAlteredTables: JsonReferenceStatement[] = alteredTables\n\t\t.map((it) => {\n\t\t\tconst forAdded = prepareCreateReferencesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.addedForeignKeys,\n\t\t\t);\n\n\t\t\tconst forAltered = prepareDropReferencesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.deletedForeignKeys,\n\t\t\t);\n\n\t\t\tconst alteredFKs = prepareAlterReferencesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.alteredForeignKeys,\n\t\t\t);\n\n\t\t\treturn [...forAdded, ...forAltered, ...alteredFKs];\n\t\t})\n\t\t.flat();\n\n\tconst jsonCreatedReferencesForAlteredTables = jsonReferencesForAllAlteredTables.filter(\n\t\t(t) => t.type === 'create_reference',\n\t);\n\tconst jsonDroppedReferencesForAlteredTables = jsonReferencesForAllAlteredTables.filter(\n\t\t(t) => t.type === 'delete_reference',\n\t);\n\n\tconst jsonMySqlCreateTables = createdTables.map((it) => {\n\t\treturn prepareMySqlCreateTableJson(\n\t\t\tit,\n\t\t\tcurFull as MySqlSchema,\n\t\t\tcurFull.internal,\n\t\t);\n\t});\n\n\tconst createViews: JsonCreateMySqlViewStatement[] = [];\n\tconst dropViews: JsonDropViewStatement[] = [];\n\tconst renameViews: JsonRenameViewStatement[] = [];\n\tconst alterViews: JsonAlterMySqlViewStatement[] = [];\n\n\tcreateViews.push(\n\t\t...createdViews.filter((it) => !it.isExisting).map((it) => {\n\t\t\treturn prepareMySqlCreateViewJson(\n\t\t\t\tit.name,\n\t\t\t\tit.definition!,\n\t\t\t\tit.meta,\n\t\t\t);\n\t\t}),\n\t);\n\n\tdropViews.push(\n\t\t...deletedViews.filter((it) => !it.isExisting).map((it) => {\n\t\t\treturn prepareDropViewJson(it.name);\n\t\t}),\n\t);\n\n\trenameViews.push(\n\t\t...renamedViews.filter((it) => !it.to.isExisting && !json1.views[it.from.name].isExisting).map((it) => {\n\t\t\treturn prepareRenameViewJson(it.to.name, it.from.name);\n\t\t}),\n\t);\n\n\tconst alteredViews = typedResult.alteredViews.filter((it) => !json2.views[it.name].isExisting);\n\n\tfor (const alteredView of alteredViews) {\n\t\tconst { definition, meta } = json2.views[alteredView.name];\n\n\t\tif (alteredView.alteredExisting) {\n\t\t\tdropViews.push(prepareDropViewJson(alteredView.name));\n\n\t\t\tcreateViews.push(\n\t\t\t\tprepareMySqlCreateViewJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\tdefinition!,\n\t\t\t\t\tmeta,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (alteredView.alteredDefinition && action !== 'push') {\n\t\t\tcreateViews.push(\n\t\t\t\tprepareMySqlCreateViewJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\tdefinition!,\n\t\t\t\t\tmeta,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (alteredView.alteredMeta) {\n\t\t\tconst view = curFull['views'][alteredView.name];\n\t\t\talterViews.push(\n\t\t\t\tprepareMySqlAlterView(view),\n\t\t\t);\n\t\t}\n\t}\n\n\tjsonStatements.push(...jsonMySqlCreateTables);\n\n\tjsonStatements.push(...jsonDropTables);\n\tjsonStatements.push(...jsonRenameTables);\n\tjsonStatements.push(...jsonRenameColumnsStatements);\n\n\tjsonStatements.push(...dropViews);\n\tjsonStatements.push(...renameViews);\n\tjsonStatements.push(...alterViews);\n\n\tjsonStatements.push(...jsonDeletedUniqueConstraints);\n\tjsonStatements.push(...jsonDeletedCheckConstraints);\n\n\tjsonStatements.push(...jsonDroppedReferencesForAlteredTables);\n\n\t// Will need to drop indexes before changing any columns in table\n\t// Then should go column alternations and then index creation\n\tjsonStatements.push(...jsonDropIndexesForAllAlteredTables);\n\n\tjsonStatements.push(...jsonDeletedCompositePKs);\n\tjsonStatements.push(...jsonTableAlternations);\n\tjsonStatements.push(...jsonAddedCompositePKs);\n\tjsonStatements.push(...jsonAddColumnsStatemets);\n\n\tjsonStatements.push(...jsonAddedUniqueConstraints);\n\tjsonStatements.push(...jsonDeletedUniqueConstraints);\n\n\tjsonStatements.push(...jsonCreateReferencesForCreatedTables);\n\tjsonStatements.push(...jsonCreateIndexesForCreatedTables);\n\tjsonStatements.push(...jsonCreatedCheckConstraints);\n\n\tjsonStatements.push(...jsonCreatedReferencesForAlteredTables);\n\tjsonStatements.push(...jsonCreateIndexesForAllAlteredTables);\n\n\tjsonStatements.push(...jsonDropColumnsStatemets);\n\n\t// jsonStatements.push(...jsonDeletedCompositePKs);\n\t// jsonStatements.push(...jsonAddedCompositePKs);\n\tjsonStatements.push(...jsonAlteredCompositePKs);\n\n\tjsonStatements.push(...createViews);\n\n\tjsonStatements.push(...jsonAlteredUniqueConstraints);\n\n\tconst sqlStatements = fromJson(jsonStatements, 'mysql');\n\n\tconst uniqueSqlStatements: string[] = [];\n\tsqlStatements.forEach((ss) => {\n\t\tif (!uniqueSqlStatements.includes(ss)) {\n\t\t\tuniqueSqlStatements.push(ss);\n\t\t}\n\t});\n\n\tconst rTables = renamedTables.map((it) => {\n\t\treturn { from: it.from, to: it.to };\n\t});\n\n\tconst _meta = prepareMigrationMeta([], rTables, rColumns);\n\n\treturn {\n\t\tstatements: jsonStatements,\n\t\tsqlStatements: uniqueSqlStatements,\n\t\t_meta,\n\t};\n};\n\nexport const applySingleStoreSnapshotsDiff = async (\n\tjson1: SingleStoreSchemaSquashed,\n\tjson2: SingleStoreSchemaSquashed,\n\ttablesResolver: (\n\t\tinput: ResolverInput<Table>,\n\t) => Promise<ResolverOutputWithMoved<Table>>,\n\tcolumnsResolver: (\n\t\tinput: ColumnsResolverInput<Column>,\n\t) => Promise<ColumnsResolverOutput<Column>>,\n\t/* viewsResolver: (\n\t\tinput: ResolverInput<ViewSquashed & { schema: '' }>,\n\t) => Promise<ResolverOutputWithMoved<ViewSquashed>>, */\n\tprevFull: SingleStoreSchema,\n\tcurFull: SingleStoreSchema,\n\taction?: 'push' | undefined,\n): Promise<{\n\tstatements: JsonStatement[];\n\tsqlStatements: string[];\n\t_meta:\n\t\t| {\n\t\t\tschemas: {};\n\t\t\ttables: {};\n\t\t\tcolumns: {};\n\t\t}\n\t\t| undefined;\n}> => {\n\t// squash indexes and fks\n\n\t// squash uniqueIndexes and uniqueConstraint into constraints object\n\t// it should be done for singlestore only because it has no diffs for it\n\n\t// TODO: @AndriiSherman\n\t// Add an upgrade to v6 and move all snaphosts to this strcutre\n\t// After that we can generate singlestore in 1 object directly(same as sqlite)\n\tfor (const tableName in json1.tables) {\n\t\tconst table = json1.tables[tableName];\n\t\tfor (const indexName in table.indexes) {\n\t\t\tconst index = SingleStoreSquasher.unsquashIdx(table.indexes[indexName]);\n\t\t\tif (index.isUnique) {\n\t\t\t\ttable.uniqueConstraints[indexName] = SingleStoreSquasher.squashUnique({\n\t\t\t\t\tname: index.name,\n\t\t\t\t\tcolumns: index.columns,\n\t\t\t\t});\n\t\t\t\tdelete json1.tables[tableName].indexes[index.name];\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const tableName in json2.tables) {\n\t\tconst table = json2.tables[tableName];\n\t\tfor (const indexName in table.indexes) {\n\t\t\tconst index = SingleStoreSquasher.unsquashIdx(table.indexes[indexName]);\n\t\t\tif (index.isUnique) {\n\t\t\t\ttable.uniqueConstraints[indexName] = SingleStoreSquasher.squashUnique({\n\t\t\t\t\tname: index.name,\n\t\t\t\t\tcolumns: index.columns,\n\t\t\t\t});\n\t\t\t\tdelete json2.tables[tableName].indexes[index.name];\n\t\t\t}\n\t\t}\n\t}\n\n\tconst tablesDiff = diffSchemasOrTables(json1.tables, json2.tables);\n\n\tconst {\n\t\tcreated: createdTables,\n\t\tdeleted: deletedTables,\n\t\trenamed: renamedTables, // renamed or moved\n\t} = await tablesResolver({\n\t\tcreated: tablesDiff.added,\n\t\tdeleted: tablesDiff.deleted,\n\t});\n\n\tconst tablesPatchedSnap1 = copy(json1);\n\ttablesPatchedSnap1.tables = mapEntries(tablesPatchedSnap1.tables, (_, it) => {\n\t\tconst { name } = nameChangeFor(it, renamedTables);\n\t\tit.name = name;\n\t\treturn [name, it];\n\t});\n\n\tconst res = diffColumns(tablesPatchedSnap1.tables, json2.tables);\n\tconst columnRenames = [] as {\n\t\ttable: string;\n\t\trenames: { from: Column; to: Column }[];\n\t}[];\n\n\tconst columnCreates = [] as {\n\t\ttable: string;\n\t\tcolumns: Column[];\n\t}[];\n\n\tconst columnDeletes = [] as {\n\t\ttable: string;\n\t\tcolumns: Column[];\n\t}[];\n\n\tfor (let entry of Object.values(res)) {\n\t\tconst { renamed, created, deleted } = await columnsResolver({\n\t\t\ttableName: entry.name,\n\t\t\tschema: entry.schema,\n\t\t\tdeleted: entry.columns.deleted,\n\t\t\tcreated: entry.columns.added,\n\t\t});\n\n\t\tif (created.length > 0) {\n\t\t\tcolumnCreates.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tcolumns: created,\n\t\t\t});\n\t\t}\n\n\t\tif (deleted.length > 0) {\n\t\t\tcolumnDeletes.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tcolumns: deleted,\n\t\t\t});\n\t\t}\n\n\t\tif (renamed.length > 0) {\n\t\t\tcolumnRenames.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\trenames: renamed,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst columnRenamesDict = columnRenames.reduce(\n\t\t(acc, it) => {\n\t\t\tacc[it.table] = it.renames;\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tfrom: Named;\n\t\t\t\tto: Named;\n\t\t\t}[]\n\t\t>,\n\t);\n\n\tconst columnsPatchedSnap1 = copy(tablesPatchedSnap1);\n\tcolumnsPatchedSnap1.tables = mapEntries(\n\t\tcolumnsPatchedSnap1.tables,\n\t\t(tableKey, tableValue) => {\n\t\t\tconst patchedColumns = mapKeys(\n\t\t\t\ttableValue.columns,\n\t\t\t\t(columnKey, column) => {\n\t\t\t\t\tconst rens = columnRenamesDict[tableValue.name] || [];\n\t\t\t\t\tconst newName = columnChangeFor(columnKey, rens);\n\t\t\t\t\tcolumn.name = newName;\n\t\t\t\t\treturn newName;\n\t\t\t\t},\n\t\t\t);\n\n\t\t\ttableValue.columns = patchedColumns;\n\t\t\treturn [tableKey, tableValue];\n\t\t},\n\t);\n\n\t/* const viewsDiff = diffSchemasOrTables(json1.views, json2.views);\n\n\tconst {\n\t\tcreated: createdViews,\n\t\tdeleted: deletedViews,\n\t\trenamed: renamedViews, // renamed or moved\n\t} = await viewsResolver({\n\t\tcreated: viewsDiff.added,\n\t\tdeleted: viewsDiff.deleted,\n\t});\n\n\tconst renamesViewDic: Record<string, { to: string; from: string }> = {};\n\trenamedViews.forEach((it) => {\n\t\trenamesViewDic[it.from.name] = { to: it.to.name, from: it.from.name };\n\t});\n\n\tconst viewsPatchedSnap1 = copy(columnsPatchedSnap1);\n\tviewsPatchedSnap1.views = mapEntries(\n\t\tviewsPatchedSnap1.views,\n\t\t(viewKey, viewValue) => {\n\t\t\tconst rename = renamesViewDic[viewValue.name];\n\n\t\t\tif (rename) {\n\t\t\t\tviewValue.name = rename.to;\n\t\t\t\tviewKey = rename.to;\n\t\t\t}\n\n\t\t\treturn [viewKey, viewValue];\n\t\t},\n\t);\n\t*/\n\tconst diffResult = applyJsonDiff(columnsPatchedSnap1, json2); // replace columnsPatchedSnap1 with viewsPatchedSnap1\n\n\tconst typedResult: DiffResultSingleStore = diffResultSchemeSingleStore.parse(diffResult);\n\n\tconst jsonStatements: JsonStatement[] = [];\n\n\tconst jsonCreateIndexesForCreatedTables = createdTables\n\t\t.map((it) => {\n\t\t\treturn prepareCreateIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.indexes,\n\t\t\t\tcurFull.internal,\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonDropTables = deletedTables.map((it) => {\n\t\treturn prepareDropTableJson(it);\n\t});\n\n\tconst jsonRenameTables = renamedTables.map((it) => {\n\t\treturn prepareRenameTableJson(it.from, it.to);\n\t});\n\n\tconst alteredTables = typedResult.alteredTablesWithColumns;\n\n\tconst jsonAddedCompositePKs: JsonCreateCompositePK[] = [];\n\n\tconst jsonAddedUniqueConstraints: JsonCreateUniqueConstraint[] = [];\n\tconst jsonDeletedUniqueConstraints: JsonDeleteUniqueConstraint[] = [];\n\tconst jsonAlteredUniqueConstraints: JsonAlterUniqueConstraint[] = [];\n\n\tconst jsonRenameColumnsStatements: JsonRenameColumnStatement[] = columnRenames\n\t\t.map((it) => prepareRenameColumns(it.table, '', it.renames))\n\t\t.flat();\n\n\tconst jsonAddColumnsStatemets: JsonAddColumnStatement[] = columnCreates\n\t\t.map((it) => _prepareAddColumns(it.table, '', it.columns))\n\t\t.flat();\n\n\tconst jsonDropColumnsStatemets: JsonDropColumnStatement[] = columnDeletes\n\t\t.map((it) => _prepareDropColumns(it.table, '', it.columns))\n\t\t.flat();\n\n\talteredTables.forEach((it) => {\n\t\t// This part is needed to make sure that same columns in a table are not triggered for change\n\t\t// there is a case where orm and kit are responsible for pk name generation and one of them is not sorting name\n\t\t// We double-check that pk with same set of columns are both in added and deleted diffs\n\t\tlet addedColumns: string[] = [];\n\t\tfor (const addedPkName of Object.keys(it.addedCompositePKs)) {\n\t\t\tconst addedPkColumns = it.addedCompositePKs[addedPkName];\n\t\t\taddedColumns = SingleStoreSquasher.unsquashPK(addedPkColumns).columns;\n\t\t}\n\n\t\tlet deletedColumns: string[] = [];\n\t\tfor (const deletedPkName of Object.keys(it.deletedCompositePKs)) {\n\t\t\tconst deletedPkColumns = it.deletedCompositePKs[deletedPkName];\n\t\t\tdeletedColumns = SingleStoreSquasher.unsquashPK(deletedPkColumns).columns;\n\t\t}\n\n\t\t// Don't need to sort, but need to add tests for it\n\t\t// addedColumns.sort();\n\t\t// deletedColumns.sort();\n\t\tconst doPerformDeleteAndCreate = JSON.stringify(addedColumns) !== JSON.stringify(deletedColumns);\n\n\t\t// add logic for unique constraints\n\t\tlet addedUniqueConstraints: JsonCreateUniqueConstraint[] = [];\n\t\tlet deletedUniqueConstraints: JsonDeleteUniqueConstraint[] = [];\n\t\tlet alteredUniqueConstraints: JsonAlterUniqueConstraint[] = [];\n\n\t\tlet createdCheckConstraints: JsonCreateCheckConstraint[] = [];\n\t\tlet deletedCheckConstraints: JsonDeleteCheckConstraint[] = [];\n\n\t\taddedUniqueConstraints = prepareAddUniqueConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.addedUniqueConstraints,\n\t\t);\n\t\tdeletedUniqueConstraints = prepareDeleteUniqueConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.deletedUniqueConstraints,\n\t\t);\n\t\tif (it.alteredUniqueConstraints) {\n\t\t\tconst added: Record<string, string> = {};\n\t\t\tconst deleted: Record<string, string> = {};\n\t\t\tfor (const k of Object.keys(it.alteredUniqueConstraints)) {\n\t\t\t\tadded[k] = it.alteredUniqueConstraints[k].__new;\n\t\t\t\tdeleted[k] = it.alteredUniqueConstraints[k].__old;\n\t\t\t}\n\t\t\taddedUniqueConstraints.push(\n\t\t\t\t...prepareAddUniqueConstraint(it.name, it.schema, added),\n\t\t\t);\n\t\t\tdeletedUniqueConstraints.push(\n\t\t\t\t...prepareDeleteUniqueConstraint(it.name, it.schema, deleted),\n\t\t\t);\n\t\t}\n\n\t\tcreatedCheckConstraints = prepareAddCheckConstraint(it.name, it.schema, it.addedCheckConstraints);\n\t\tdeletedCheckConstraints = prepareDeleteCheckConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.deletedCheckConstraints,\n\t\t);\n\n\t\t// skip for push\n\t\tif (it.alteredCheckConstraints && action !== 'push') {\n\t\t\tconst added: Record<string, string> = {};\n\t\t\tconst deleted: Record<string, string> = {};\n\n\t\t\tfor (const k of Object.keys(it.alteredCheckConstraints)) {\n\t\t\t\tadded[k] = it.alteredCheckConstraints[k].__new;\n\t\t\t\tdeleted[k] = it.alteredCheckConstraints[k].__old;\n\t\t\t}\n\t\t\tcreatedCheckConstraints.push(...prepareAddCheckConstraint(it.name, it.schema, added));\n\t\t\tdeletedCheckConstraints.push(...prepareDeleteCheckConstraint(it.name, it.schema, deleted));\n\t\t}\n\n\t\tjsonAddedUniqueConstraints.push(...addedUniqueConstraints);\n\t\tjsonDeletedUniqueConstraints.push(...deletedUniqueConstraints);\n\t\tjsonAlteredUniqueConstraints.push(...alteredUniqueConstraints);\n\t});\n\n\tconst rColumns = jsonRenameColumnsStatements.map((it) => {\n\t\tconst tableName = it.tableName;\n\t\tconst schema = it.schema;\n\t\treturn {\n\t\t\tfrom: { schema, table: tableName, column: it.oldColumnName },\n\t\t\tto: { schema, table: tableName, column: it.newColumnName },\n\t\t};\n\t});\n\n\tconst jsonTableAlternations = alteredTables\n\t\t.map((it) => {\n\t\t\treturn prepareAlterColumnsMysql(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.altered,\n\t\t\t\tjson1,\n\t\t\t\tjson2,\n\t\t\t\taction,\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonCreateIndexesForAllAlteredTables = alteredTables\n\t\t.map((it) => {\n\t\t\treturn prepareCreateIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.addedIndexes || {},\n\t\t\t\tcurFull.internal,\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonDropIndexesForAllAlteredTables = alteredTables\n\t\t.map((it) => {\n\t\t\treturn prepareDropIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.deletedIndexes || {},\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\talteredTables.forEach((it) => {\n\t\tconst droppedIndexes = Object.keys(it.alteredIndexes).reduce(\n\t\t\t(current, item: string) => {\n\t\t\t\tcurrent[item] = it.alteredIndexes[item].__old;\n\t\t\t\treturn current;\n\t\t\t},\n\t\t\t{} as Record<string, string>,\n\t\t);\n\t\tconst createdIndexes = Object.keys(it.alteredIndexes).reduce(\n\t\t\t(current, item: string) => {\n\t\t\t\tcurrent[item] = it.alteredIndexes[item].__new;\n\t\t\t\treturn current;\n\t\t\t},\n\t\t\t{} as Record<string, string>,\n\t\t);\n\n\t\tjsonCreateIndexesForAllAlteredTables.push(\n\t\t\t...prepareCreateIndexesJson(it.name, it.schema, createdIndexes || {}),\n\t\t);\n\t\tjsonDropIndexesForAllAlteredTables.push(\n\t\t\t...prepareDropIndexesJson(it.name, it.schema, droppedIndexes || {}),\n\t\t);\n\t});\n\n\tconst jsonSingleStoreCreateTables = createdTables.map((it) => {\n\t\treturn prepareSingleStoreCreateTableJson(\n\t\t\tit,\n\t\t\tcurFull as SingleStoreSchema,\n\t\t\tcurFull.internal,\n\t\t);\n\t});\n\n\t/* const createViews: JsonCreateSingleStoreViewStatement[] = [];\n\tconst dropViews: JsonDropViewStatement[] = [];\n\tconst renameViews: JsonRenameViewStatement[] = [];\n\tconst alterViews: JsonAlterSingleStoreViewStatement[] = [];\n\n\tcreateViews.push(\n\t\t...createdViews.filter((it) => !it.isExisting).map((it) => {\n\t\t\treturn prepareSingleStoreCreateViewJson(\n\t\t\t\tit.name,\n\t\t\t\tit.definition!,\n\t\t\t\tit.meta,\n\t\t\t);\n\t\t}),\n\t);\n\n\tdropViews.push(\n\t\t...deletedViews.filter((it) => !it.isExisting).map((it) => {\n\t\t\treturn prepareDropViewJson(it.name);\n\t\t}),\n\t);\n\n\trenameViews.push(\n\t\t...renamedViews.filter((it) => !it.to.isExisting && !json1.views[it.from.name].isExisting).map((it) => {\n\t\t\treturn prepareRenameViewJson(it.to.name, it.from.name);\n\t\t}),\n\t);\n\n\tconst alteredViews = typedResult.alteredViews.filter((it) => !json2.views[it.name].isExisting);\n\n\tfor (const alteredView of alteredViews) {\n\t\tconst { definition, meta } = json2.views[alteredView.name];\n\n\t\tif (alteredView.alteredExisting) {\n\t\t\tdropViews.push(prepareDropViewJson(alteredView.name));\n\n\t\t\tcreateViews.push(\n\t\t\t\tprepareSingleStoreCreateViewJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\tdefinition!,\n\t\t\t\t\tmeta,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (alteredView.alteredDefinition && action !== 'push') {\n\t\t\tcreateViews.push(\n\t\t\t\tprepareSingleStoreCreateViewJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\tdefinition!,\n\t\t\t\t\tmeta,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (alteredView.alteredMeta) {\n\t\t\tconst view = curFull['views'][alteredView.name];\n\t\t\talterViews.push(\n\t\t\t\tprepareSingleStoreAlterView(view),\n\t\t\t);\n\t\t}\n\t} */\n\n\tjsonStatements.push(...jsonSingleStoreCreateTables);\n\n\tjsonStatements.push(...jsonDropTables);\n\tjsonStatements.push(...jsonRenameTables);\n\tjsonStatements.push(...jsonRenameColumnsStatements);\n\n\t/*jsonStatements.push(...createViews);\n\tjsonStatements.push(...dropViews);\n\tjsonStatements.push(...renameViews);\n\tjsonStatements.push(...alterViews);\n */\n\tjsonStatements.push(...jsonDeletedUniqueConstraints);\n\n\t// Will need to drop indexes before changing any columns in table\n\t// Then should go column alternations and then index creation\n\tjsonStatements.push(...jsonDropIndexesForAllAlteredTables);\n\n\tjsonStatements.push(...jsonTableAlternations);\n\tjsonStatements.push(...jsonAddedCompositePKs);\n\n\tjsonStatements.push(...jsonAddedUniqueConstraints);\n\tjsonStatements.push(...jsonDeletedUniqueConstraints);\n\n\tjsonStatements.push(...jsonAddColumnsStatemets);\n\n\tjsonStatements.push(...jsonCreateIndexesForCreatedTables);\n\n\tjsonStatements.push(...jsonCreateIndexesForAllAlteredTables);\n\n\tjsonStatements.push(...jsonDropColumnsStatemets);\n\n\tjsonStatements.push(...jsonAddedCompositePKs);\n\n\tjsonStatements.push(...jsonAlteredUniqueConstraints);\n\n\tconst combinedJsonStatements = singleStoreCombineStatements(jsonStatements, json2);\n\tconst sqlStatements = fromJson(combinedJsonStatements, 'singlestore');\n\n\tconst uniqueSqlStatements: string[] = [];\n\tsqlStatements.forEach((ss) => {\n\t\tif (!uniqueSqlStatements.includes(ss)) {\n\t\t\tuniqueSqlStatements.push(ss);\n\t\t}\n\t});\n\n\tconst rTables = renamedTables.map((it) => {\n\t\treturn { from: it.from, to: it.to };\n\t});\n\n\tconst _meta = prepareMigrationMeta([], rTables, rColumns);\n\n\treturn {\n\t\tstatements: combinedJsonStatements,\n\t\tsqlStatements: uniqueSqlStatements,\n\t\t_meta,\n\t};\n};\n\nexport const applySqliteSnapshotsDiff = async (\n\tjson1: SQLiteSchemaSquashed,\n\tjson2: SQLiteSchemaSquashed,\n\ttablesResolver: (\n\t\tinput: ResolverInput<Table>,\n\t) => Promise<ResolverOutputWithMoved<Table>>,\n\tcolumnsResolver: (\n\t\tinput: ColumnsResolverInput<Column>,\n\t) => Promise<ColumnsResolverOutput<Column>>,\n\tviewsResolver: (\n\t\tinput: ResolverInput<SqliteView & { schema: '' }>,\n\t) => Promise<ResolverOutputWithMoved<SqliteView>>,\n\tprevFull: SQLiteSchema,\n\tcurFull: SQLiteSchema,\n\taction?: 'push' | undefined,\n): Promise<{\n\tstatements: JsonStatement[];\n\tsqlStatements: string[];\n\t_meta:\n\t\t| {\n\t\t\tschemas: {};\n\t\t\ttables: {};\n\t\t\tcolumns: {};\n\t\t}\n\t\t| undefined;\n}> => {\n\tconst tablesDiff = diffSchemasOrTables(json1.tables, json2.tables);\n\n\tconst {\n\t\tcreated: createdTables,\n\t\tdeleted: deletedTables,\n\t\trenamed: renamedTables,\n\t} = await tablesResolver({\n\t\tcreated: tablesDiff.added,\n\t\tdeleted: tablesDiff.deleted,\n\t});\n\n\tconst tablesPatchedSnap1 = copy(json1);\n\ttablesPatchedSnap1.tables = mapEntries(tablesPatchedSnap1.tables, (_, it) => {\n\t\tconst { name } = nameChangeFor(it, renamedTables);\n\t\tit.name = name;\n\t\treturn [name, it];\n\t});\n\n\tconst res = diffColumns(tablesPatchedSnap1.tables, json2.tables);\n\n\tconst columnRenames = [] as {\n\t\ttable: string;\n\t\trenames: { from: Column; to: Column }[];\n\t}[];\n\n\tconst columnCreates = [] as {\n\t\ttable: string;\n\t\tcolumns: Column[];\n\t}[];\n\n\tconst columnDeletes = [] as {\n\t\ttable: string;\n\t\tcolumns: Column[];\n\t}[];\n\n\tfor (let entry of Object.values(res)) {\n\t\tconst { renamed, created, deleted } = await columnsResolver({\n\t\t\ttableName: entry.name,\n\t\t\tschema: entry.schema,\n\t\t\tdeleted: entry.columns.deleted,\n\t\t\tcreated: entry.columns.added,\n\t\t});\n\n\t\tif (created.length > 0) {\n\t\t\tcolumnCreates.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tcolumns: created,\n\t\t\t});\n\t\t}\n\n\t\tif (deleted.length > 0) {\n\t\t\tcolumnDeletes.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tcolumns: deleted,\n\t\t\t});\n\t\t}\n\n\t\tif (renamed.length > 0) {\n\t\t\tcolumnRenames.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\trenames: renamed,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst columnRenamesDict = columnRenames.reduce(\n\t\t(acc, it) => {\n\t\t\tacc[it.table] = it.renames;\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tfrom: Named;\n\t\t\t\tto: Named;\n\t\t\t}[]\n\t\t>,\n\t);\n\n\tconst columnsPatchedSnap1 = copy(tablesPatchedSnap1);\n\tcolumnsPatchedSnap1.tables = mapEntries(\n\t\tcolumnsPatchedSnap1.tables,\n\t\t(tableKey, tableValue) => {\n\t\t\tconst patchedColumns = mapKeys(\n\t\t\t\ttableValue.columns,\n\t\t\t\t(columnKey, column) => {\n\t\t\t\t\tconst rens = columnRenamesDict[tableValue.name] || [];\n\t\t\t\t\tconst newName = columnChangeFor(columnKey, rens);\n\t\t\t\t\tcolumn.name = newName;\n\t\t\t\t\treturn newName;\n\t\t\t\t},\n\t\t\t);\n\n\t\t\ttableValue.columns = patchedColumns;\n\t\t\treturn [tableKey, tableValue];\n\t\t},\n\t);\n\n\tconst viewsDiff = diffSchemasOrTables(json1.views, json2.views);\n\n\tconst {\n\t\tcreated: createdViews,\n\t\tdeleted: deletedViews,\n\t\trenamed: renamedViews, // renamed or moved\n\t} = await viewsResolver({\n\t\tcreated: viewsDiff.added,\n\t\tdeleted: viewsDiff.deleted,\n\t});\n\n\tconst renamesViewDic: Record<string, { to: string; from: string }> = {};\n\trenamedViews.forEach((it) => {\n\t\trenamesViewDic[it.from.name] = { to: it.to.name, from: it.from.name };\n\t});\n\n\tconst viewsPatchedSnap1 = copy(columnsPatchedSnap1);\n\tviewsPatchedSnap1.views = mapEntries(\n\t\tviewsPatchedSnap1.views,\n\t\t(viewKey, viewValue) => {\n\t\t\tconst rename = renamesViewDic[viewValue.name];\n\n\t\t\tif (rename) {\n\t\t\t\tviewValue.name = rename.to;\n\t\t\t}\n\n\t\t\treturn [viewKey, viewValue];\n\t\t},\n\t);\n\n\tconst diffResult = applyJsonDiff(viewsPatchedSnap1, json2);\n\n\tconst typedResult = diffResultSchemeSQLite.parse(diffResult);\n\n\t// Map array of objects to map\n\tconst tablesMap: {\n\t\t[key: string]: (typeof typedResult.alteredTablesWithColumns)[number];\n\t} = {};\n\n\ttypedResult.alteredTablesWithColumns.forEach((obj) => {\n\t\ttablesMap[obj.name] = obj;\n\t});\n\n\tconst jsonCreateTables = createdTables.map((it) => {\n\t\treturn prepareSQLiteCreateTable(it, action);\n\t});\n\n\tconst jsonCreateIndexesForCreatedTables = createdTables\n\t\t.map((it) => {\n\t\t\treturn prepareCreateIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.indexes,\n\t\t\t\tcurFull.internal,\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonDropTables = deletedTables.map((it) => {\n\t\treturn prepareDropTableJson(it);\n\t});\n\n\tconst jsonRenameTables = renamedTables.map((it) => {\n\t\treturn prepareRenameTableJson(it.from, it.to);\n\t});\n\n\tconst jsonRenameColumnsStatements: JsonRenameColumnStatement[] = columnRenames\n\t\t.map((it) => prepareRenameColumns(it.table, '', it.renames))\n\t\t.flat();\n\n\tconst jsonDropColumnsStatemets: JsonDropColumnStatement[] = columnDeletes\n\t\t.map((it) => _prepareDropColumns(it.table, '', it.columns))\n\t\t.flat();\n\n\tconst jsonAddColumnsStatemets: JsonSqliteAddColumnStatement[] = columnCreates\n\t\t.map((it) => {\n\t\t\treturn _prepareSqliteAddColumns(\n\t\t\t\tit.table,\n\t\t\t\tit.columns,\n\t\t\t\ttablesMap[it.table] && tablesMap[it.table].addedForeignKeys\n\t\t\t\t\t? Object.values(tablesMap[it.table].addedForeignKeys)\n\t\t\t\t\t: [],\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst allAltered = typedResult.alteredTablesWithColumns;\n\n\tconst jsonAddedCompositePKs: JsonCreateCompositePK[] = [];\n\tconst jsonDeletedCompositePKs: JsonDeleteCompositePK[] = [];\n\tconst jsonAlteredCompositePKs: JsonAlterCompositePK[] = [];\n\n\tconst jsonAddedUniqueConstraints: JsonCreateUniqueConstraint[] = [];\n\tconst jsonDeletedUniqueConstraints: JsonDeleteUniqueConstraint[] = [];\n\tconst jsonAlteredUniqueConstraints: JsonAlterUniqueConstraint[] = [];\n\n\tconst jsonDeletedCheckConstraints: JsonDeleteCheckConstraint[] = [];\n\tconst jsonCreatedCheckConstraints: JsonCreateCheckConstraint[] = [];\n\n\tallAltered.forEach((it) => {\n\t\t// This part is needed to make sure that same columns in a table are not triggered for change\n\t\t// there is a case where orm and kit are responsible for pk name generation and one of them is not sorting name\n\t\t// We double-check that pk with same set of columns are both in added and deleted diffs\n\t\tlet addedColumns: string[] = [];\n\t\tfor (const addedPkName of Object.keys(it.addedCompositePKs)) {\n\t\t\tconst addedPkColumns = it.addedCompositePKs[addedPkName];\n\t\t\taddedColumns = SQLiteSquasher.unsquashPK(addedPkColumns);\n\t\t}\n\n\t\tlet deletedColumns: string[] = [];\n\t\tfor (const deletedPkName of Object.keys(it.deletedCompositePKs)) {\n\t\t\tconst deletedPkColumns = it.deletedCompositePKs[deletedPkName];\n\t\t\tdeletedColumns = SQLiteSquasher.unsquashPK(deletedPkColumns);\n\t\t}\n\n\t\t// Don't need to sort, but need to add tests for it\n\t\t// addedColumns.sort();\n\t\t// deletedColumns.sort();\n\n\t\tconst doPerformDeleteAndCreate = JSON.stringify(addedColumns) !== JSON.stringify(deletedColumns);\n\n\t\tlet addedCompositePKs: JsonCreateCompositePK[] = [];\n\t\tlet deletedCompositePKs: JsonDeleteCompositePK[] = [];\n\t\tlet alteredCompositePKs: JsonAlterCompositePK[] = [];\n\t\tif (doPerformDeleteAndCreate) {\n\t\t\taddedCompositePKs = prepareAddCompositePrimaryKeySqlite(\n\t\t\t\tit.name,\n\t\t\t\tit.addedCompositePKs,\n\t\t\t);\n\t\t\tdeletedCompositePKs = prepareDeleteCompositePrimaryKeySqlite(\n\t\t\t\tit.name,\n\t\t\t\tit.deletedCompositePKs,\n\t\t\t);\n\t\t}\n\t\talteredCompositePKs = prepareAlterCompositePrimaryKeySqlite(\n\t\t\tit.name,\n\t\t\tit.alteredCompositePKs,\n\t\t);\n\n\t\t// add logic for unique constraints\n\t\tlet addedUniqueConstraints: JsonCreateUniqueConstraint[] = [];\n\t\tlet deletedUniqueConstraints: JsonDeleteUniqueConstraint[] = [];\n\t\tlet alteredUniqueConstraints: JsonAlterUniqueConstraint[] = [];\n\n\t\taddedUniqueConstraints = prepareAddUniqueConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.addedUniqueConstraints,\n\t\t);\n\t\tdeletedUniqueConstraints = prepareDeleteUniqueConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.deletedUniqueConstraints,\n\t\t);\n\t\tif (it.alteredUniqueConstraints) {\n\t\t\tconst added: Record<string, string> = {};\n\t\t\tconst deleted: Record<string, string> = {};\n\t\t\tfor (const k of Object.keys(it.alteredUniqueConstraints)) {\n\t\t\t\tadded[k] = it.alteredUniqueConstraints[k].__new;\n\t\t\t\tdeleted[k] = it.alteredUniqueConstraints[k].__old;\n\t\t\t}\n\t\t\taddedUniqueConstraints.push(\n\t\t\t\t...prepareAddUniqueConstraint(it.name, it.schema, added),\n\t\t\t);\n\t\t\tdeletedUniqueConstraints.push(\n\t\t\t\t...prepareDeleteUniqueConstraint(it.name, it.schema, deleted),\n\t\t\t);\n\t\t}\n\n\t\tlet createdCheckConstraints: JsonCreateCheckConstraint[] = [];\n\t\tlet deletedCheckConstraints: JsonDeleteCheckConstraint[] = [];\n\n\t\taddedUniqueConstraints = prepareAddUniqueConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.addedUniqueConstraints,\n\t\t);\n\t\tdeletedUniqueConstraints = prepareDeleteUniqueConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.deletedUniqueConstraints,\n\t\t);\n\t\tif (it.alteredUniqueConstraints) {\n\t\t\tconst added: Record<string, string> = {};\n\t\t\tconst deleted: Record<string, string> = {};\n\t\t\tfor (const k of Object.keys(it.alteredUniqueConstraints)) {\n\t\t\t\tadded[k] = it.alteredUniqueConstraints[k].__new;\n\t\t\t\tdeleted[k] = it.alteredUniqueConstraints[k].__old;\n\t\t\t}\n\t\t\taddedUniqueConstraints.push(\n\t\t\t\t...prepareAddUniqueConstraint(it.name, it.schema, added),\n\t\t\t);\n\t\t\tdeletedUniqueConstraints.push(\n\t\t\t\t...prepareDeleteUniqueConstraint(it.name, it.schema, deleted),\n\t\t\t);\n\t\t}\n\n\t\tcreatedCheckConstraints = prepareAddCheckConstraint(it.name, it.schema, it.addedCheckConstraints);\n\t\tdeletedCheckConstraints = prepareDeleteCheckConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.deletedCheckConstraints,\n\t\t);\n\n\t\t// skip for push\n\t\tif (it.alteredCheckConstraints && action !== 'push') {\n\t\t\tconst added: Record<string, string> = {};\n\t\t\tconst deleted: Record<string, string> = {};\n\n\t\t\tfor (const k of Object.keys(it.alteredCheckConstraints)) {\n\t\t\t\tadded[k] = it.alteredCheckConstraints[k].__new;\n\t\t\t\tdeleted[k] = it.alteredCheckConstraints[k].__old;\n\t\t\t}\n\t\t\tcreatedCheckConstraints.push(...prepareAddCheckConstraint(it.name, it.schema, added));\n\t\t\tdeletedCheckConstraints.push(...prepareDeleteCheckConstraint(it.name, it.schema, deleted));\n\t\t}\n\n\t\tjsonAddedCompositePKs.push(...addedCompositePKs);\n\t\tjsonDeletedCompositePKs.push(...deletedCompositePKs);\n\t\tjsonAlteredCompositePKs.push(...alteredCompositePKs);\n\n\t\tjsonAddedUniqueConstraints.push(...addedUniqueConstraints);\n\t\tjsonDeletedUniqueConstraints.push(...deletedUniqueConstraints);\n\t\tjsonAlteredUniqueConstraints.push(...alteredUniqueConstraints);\n\n\t\tjsonCreatedCheckConstraints.push(...createdCheckConstraints);\n\t\tjsonDeletedCheckConstraints.push(...deletedCheckConstraints);\n\t});\n\n\tconst rColumns = jsonRenameColumnsStatements.map((it) => {\n\t\tconst tableName = it.tableName;\n\t\tconst schema = it.schema;\n\t\treturn {\n\t\t\tfrom: { schema, table: tableName, column: it.oldColumnName },\n\t\t\tto: { schema, table: tableName, column: it.newColumnName },\n\t\t};\n\t});\n\n\tconst jsonTableAlternations = allAltered\n\t\t.map((it) => {\n\t\t\treturn prepareSqliteAlterColumns(it.name, it.schema, it.altered, json2);\n\t\t})\n\t\t.flat();\n\n\tconst jsonCreateIndexesForAllAlteredTables = allAltered\n\t\t.map((it) => {\n\t\t\treturn prepareCreateIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.addedIndexes || {},\n\t\t\t\tcurFull.internal,\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonDropIndexesForAllAlteredTables = allAltered\n\t\t.map((it) => {\n\t\t\treturn prepareDropIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.deletedIndexes || {},\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tallAltered.forEach((it) => {\n\t\tconst droppedIndexes = Object.keys(it.alteredIndexes).reduce(\n\t\t\t(current, item: string) => {\n\t\t\t\tcurrent[item] = it.alteredIndexes[item].__old;\n\t\t\t\treturn current;\n\t\t\t},\n\t\t\t{} as Record<string, string>,\n\t\t);\n\t\tconst createdIndexes = Object.keys(it.alteredIndexes).reduce(\n\t\t\t(current, item: string) => {\n\t\t\t\tcurrent[item] = it.alteredIndexes[item].__new;\n\t\t\t\treturn current;\n\t\t\t},\n\t\t\t{} as Record<string, string>,\n\t\t);\n\n\t\tjsonCreateIndexesForAllAlteredTables.push(\n\t\t\t...prepareCreateIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tcreatedIndexes || {},\n\t\t\t\tcurFull.internal,\n\t\t\t),\n\t\t);\n\t\tjsonDropIndexesForAllAlteredTables.push(\n\t\t\t...prepareDropIndexesJson(it.name, it.schema, droppedIndexes || {}),\n\t\t);\n\t});\n\n\tconst jsonReferencesForAllAlteredTables: JsonReferenceStatement[] = allAltered\n\t\t.map((it) => {\n\t\t\tconst forAdded = prepareCreateReferencesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.addedForeignKeys,\n\t\t\t);\n\n\t\t\tconst forAltered = prepareDropReferencesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.deletedForeignKeys,\n\t\t\t);\n\n\t\t\tconst alteredFKs = prepareAlterReferencesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.alteredForeignKeys,\n\t\t\t);\n\n\t\t\treturn [...forAdded, ...forAltered, ...alteredFKs];\n\t\t})\n\t\t.flat();\n\n\tconst jsonCreatedReferencesForAlteredTables = jsonReferencesForAllAlteredTables.filter(\n\t\t(t) => t.type === 'create_reference',\n\t);\n\tconst jsonDroppedReferencesForAlteredTables = jsonReferencesForAllAlteredTables.filter(\n\t\t(t) => t.type === 'delete_reference',\n\t);\n\n\tconst createViews: JsonCreateSqliteViewStatement[] = [];\n\tconst dropViews: JsonDropViewStatement[] = [];\n\n\tcreateViews.push(\n\t\t...createdViews.filter((it) => !it.isExisting).map((it) => {\n\t\t\treturn prepareSqliteCreateViewJson(\n\t\t\t\tit.name,\n\t\t\t\tit.definition!,\n\t\t\t);\n\t\t}),\n\t);\n\n\tdropViews.push(\n\t\t...deletedViews.filter((it) => !it.isExisting).map((it) => {\n\t\t\treturn prepareDropViewJson(it.name);\n\t\t}),\n\t);\n\n\tdropViews.push(\n\t\t...renamedViews.filter((it) => !it.to.isExisting).map((it) => {\n\t\t\treturn prepareDropViewJson(it.from.name);\n\t\t}),\n\t);\n\tcreateViews.push(\n\t\t...renamedViews.filter((it) => !it.to.isExisting).map((it) => {\n\t\t\treturn prepareSqliteCreateViewJson(it.to.name, it.to.definition!);\n\t\t}),\n\t);\n\n\tconst alteredViews = typedResult.alteredViews.filter((it) => !json2.views[it.name].isExisting);\n\n\tfor (const alteredView of alteredViews) {\n\t\tconst { definition } = json2.views[alteredView.name];\n\n\t\tif (alteredView.alteredExisting || (alteredView.alteredDefinition && action !== 'push')) {\n\t\t\tdropViews.push(prepareDropViewJson(alteredView.name));\n\n\t\t\tcreateViews.push(\n\t\t\t\tprepareSqliteCreateViewJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\tdefinition!,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tconst jsonStatements: JsonStatement[] = [];\n\tjsonStatements.push(...jsonCreateTables);\n\n\tjsonStatements.push(...jsonDropTables);\n\tjsonStatements.push(...jsonRenameTables);\n\tjsonStatements.push(...jsonRenameColumnsStatements);\n\n\tjsonStatements.push(...jsonDroppedReferencesForAlteredTables);\n\tjsonStatements.push(...jsonDeletedCheckConstraints);\n\n\t// Will need to drop indexes before changing any columns in table\n\t// Then should go column alternations and then index creation\n\tjsonStatements.push(...jsonDropIndexesForAllAlteredTables);\n\n\tjsonStatements.push(...jsonDeletedCompositePKs);\n\tjsonStatements.push(...jsonTableAlternations);\n\tjsonStatements.push(...jsonAddedCompositePKs);\n\tjsonStatements.push(...jsonAddColumnsStatemets);\n\n\tjsonStatements.push(...jsonCreateIndexesForCreatedTables);\n\tjsonStatements.push(...jsonCreateIndexesForAllAlteredTables);\n\n\tjsonStatements.push(...jsonCreatedCheckConstraints);\n\n\tjsonStatements.push(...jsonCreatedReferencesForAlteredTables);\n\n\tjsonStatements.push(...jsonDropColumnsStatemets);\n\n\t// jsonStatements.push(...jsonDeletedCompositePKs);\n\t// jsonStatements.push(...jsonAddedCompositePKs);\n\tjsonStatements.push(...jsonAlteredCompositePKs);\n\n\tjsonStatements.push(...jsonAlteredUniqueConstraints);\n\n\tjsonStatements.push(...dropViews);\n\tjsonStatements.push(...createViews);\n\n\tconst combinedJsonStatements = sqliteCombineStatements(jsonStatements, json2, action);\n\tconst sqlStatements = fromJson(combinedJsonStatements, 'sqlite');\n\n\tconst uniqueSqlStatements: string[] = [];\n\tsqlStatements.forEach((ss) => {\n\t\tif (!uniqueSqlStatements.includes(ss)) {\n\t\t\tuniqueSqlStatements.push(ss);\n\t\t}\n\t});\n\n\tconst rTables = renamedTables.map((it) => {\n\t\treturn { from: it.from, to: it.to };\n\t});\n\n\tconst _meta = prepareMigrationMeta([], rTables, rColumns);\n\n\treturn {\n\t\tstatements: combinedJsonStatements,\n\t\tsqlStatements: uniqueSqlStatements,\n\t\t_meta,\n\t};\n};\n\nexport const applyLibSQLSnapshotsDiff = async (\n\tjson1: SQLiteSchemaSquashed,\n\tjson2: SQLiteSchemaSquashed,\n\ttablesResolver: (\n\t\tinput: ResolverInput<Table>,\n\t) => Promise<ResolverOutputWithMoved<Table>>,\n\tcolumnsResolver: (\n\t\tinput: ColumnsResolverInput<Column>,\n\t) => Promise<ColumnsResolverOutput<Column>>,\n\tviewsResolver: (\n\t\tinput: ResolverInput<SqliteView & { schema: '' }>,\n\t) => Promise<ResolverOutputWithMoved<SqliteView>>,\n\tprevFull: SQLiteSchema,\n\tcurFull: SQLiteSchema,\n\taction?: 'push',\n): Promise<{\n\tstatements: JsonStatement[];\n\tsqlStatements: string[];\n\t_meta:\n\t\t| {\n\t\t\tschemas: {};\n\t\t\ttables: {};\n\t\t\tcolumns: {};\n\t\t}\n\t\t| undefined;\n}> => {\n\tconst tablesDiff = diffSchemasOrTables(json1.tables, json2.tables);\n\tconst {\n\t\tcreated: createdTables,\n\t\tdeleted: deletedTables,\n\t\trenamed: renamedTables,\n\t} = await tablesResolver({\n\t\tcreated: tablesDiff.added,\n\t\tdeleted: tablesDiff.deleted,\n\t});\n\n\tconst tablesPatchedSnap1 = copy(json1);\n\ttablesPatchedSnap1.tables = mapEntries(tablesPatchedSnap1.tables, (_, it) => {\n\t\tconst { name } = nameChangeFor(it, renamedTables);\n\t\tit.name = name;\n\t\treturn [name, it];\n\t});\n\n\tconst res = diffColumns(tablesPatchedSnap1.tables, json2.tables);\n\n\tconst columnRenames = [] as {\n\t\ttable: string;\n\t\trenames: { from: Column; to: Column }[];\n\t}[];\n\n\tconst columnCreates = [] as {\n\t\ttable: string;\n\t\tcolumns: Column[];\n\t}[];\n\n\tconst columnDeletes = [] as {\n\t\ttable: string;\n\t\tcolumns: Column[];\n\t}[];\n\n\tfor (let entry of Object.values(res)) {\n\t\tconst { renamed, created, deleted } = await columnsResolver({\n\t\t\ttableName: entry.name,\n\t\t\tschema: entry.schema,\n\t\t\tdeleted: entry.columns.deleted,\n\t\t\tcreated: entry.columns.added,\n\t\t});\n\n\t\tif (created.length > 0) {\n\t\t\tcolumnCreates.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tcolumns: created,\n\t\t\t});\n\t\t}\n\n\t\tif (deleted.length > 0) {\n\t\t\tcolumnDeletes.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\tcolumns: deleted,\n\t\t\t});\n\t\t}\n\n\t\tif (renamed.length > 0) {\n\t\t\tcolumnRenames.push({\n\t\t\t\ttable: entry.name,\n\t\t\t\trenames: renamed,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst columnRenamesDict = columnRenames.reduce(\n\t\t(acc, it) => {\n\t\t\tacc[it.table] = it.renames;\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tfrom: Named;\n\t\t\t\tto: Named;\n\t\t\t}[]\n\t\t>,\n\t);\n\n\tconst columnsPatchedSnap1 = copy(tablesPatchedSnap1);\n\tcolumnsPatchedSnap1.tables = mapEntries(\n\t\tcolumnsPatchedSnap1.tables,\n\t\t(tableKey, tableValue) => {\n\t\t\tconst patchedColumns = mapKeys(\n\t\t\t\ttableValue.columns,\n\t\t\t\t(columnKey, column) => {\n\t\t\t\t\tconst rens = columnRenamesDict[tableValue.name] || [];\n\t\t\t\t\tconst newName = columnChangeFor(columnKey, rens);\n\t\t\t\t\tcolumn.name = newName;\n\t\t\t\t\treturn newName;\n\t\t\t\t},\n\t\t\t);\n\n\t\t\ttableValue.columns = patchedColumns;\n\t\t\treturn [tableKey, tableValue];\n\t\t},\n\t);\n\n\tconst viewsDiff = diffSchemasOrTables(json1.views, json2.views);\n\n\tconst {\n\t\tcreated: createdViews,\n\t\tdeleted: deletedViews,\n\t\trenamed: renamedViews, // renamed or moved\n\t} = await viewsResolver({\n\t\tcreated: viewsDiff.added,\n\t\tdeleted: viewsDiff.deleted,\n\t});\n\n\tconst renamesViewDic: Record<string, { to: string; from: string }> = {};\n\trenamedViews.forEach((it) => {\n\t\trenamesViewDic[it.from.name] = { to: it.to.name, from: it.from.name };\n\t});\n\n\tconst viewsPatchedSnap1 = copy(columnsPatchedSnap1);\n\tviewsPatchedSnap1.views = mapEntries(\n\t\tviewsPatchedSnap1.views,\n\t\t(viewKey, viewValue) => {\n\t\t\tconst rename = renamesViewDic[viewValue.name];\n\n\t\t\tif (rename) {\n\t\t\t\tviewValue.name = rename.to;\n\t\t\t}\n\n\t\t\treturn [viewKey, viewValue];\n\t\t},\n\t);\n\n\tconst diffResult = applyJsonDiff(viewsPatchedSnap1, json2);\n\n\tconst typedResult = diffResultSchemeSQLite.parse(diffResult);\n\n\t// Map array of objects to map\n\tconst tablesMap: {\n\t\t[key: string]: (typeof typedResult.alteredTablesWithColumns)[number];\n\t} = {};\n\n\ttypedResult.alteredTablesWithColumns.forEach((obj) => {\n\t\ttablesMap[obj.name] = obj;\n\t});\n\n\tconst jsonCreateTables = createdTables.map((it) => {\n\t\treturn prepareSQLiteCreateTable(it, action);\n\t});\n\n\tconst jsonCreateIndexesForCreatedTables = createdTables\n\t\t.map((it) => {\n\t\t\treturn prepareCreateIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.indexes,\n\t\t\t\tcurFull.internal,\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonDropTables = deletedTables.map((it) => {\n\t\treturn prepareDropTableJson(it);\n\t});\n\n\tconst jsonRenameTables = renamedTables.map((it) => {\n\t\treturn prepareRenameTableJson(it.from, it.to);\n\t});\n\n\tconst jsonRenameColumnsStatements: JsonRenameColumnStatement[] = columnRenames\n\t\t.map((it) => prepareRenameColumns(it.table, '', it.renames))\n\t\t.flat();\n\n\tconst jsonDropColumnsStatemets: JsonDropColumnStatement[] = columnDeletes\n\t\t.map((it) => _prepareDropColumns(it.table, '', it.columns))\n\t\t.flat();\n\n\tconst jsonAddColumnsStatemets: JsonSqliteAddColumnStatement[] = columnCreates\n\t\t.map((it) => {\n\t\t\treturn _prepareSqliteAddColumns(\n\t\t\t\tit.table,\n\t\t\t\tit.columns,\n\t\t\t\ttablesMap[it.table] && tablesMap[it.table].addedForeignKeys\n\t\t\t\t\t? Object.values(tablesMap[it.table].addedForeignKeys)\n\t\t\t\t\t: [],\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst rColumns = jsonRenameColumnsStatements.map((it) => {\n\t\tconst tableName = it.tableName;\n\t\tconst schema = it.schema;\n\t\treturn {\n\t\t\tfrom: { schema, table: tableName, column: it.oldColumnName },\n\t\t\tto: { schema, table: tableName, column: it.newColumnName },\n\t\t};\n\t});\n\n\tconst rTables = renamedTables.map((it) => {\n\t\treturn { from: it.from, to: it.to };\n\t});\n\n\tconst _meta = prepareMigrationMeta([], rTables, rColumns);\n\n\tconst allAltered = typedResult.alteredTablesWithColumns;\n\n\tconst jsonAddedCompositePKs: JsonCreateCompositePK[] = [];\n\tconst jsonDeletedCompositePKs: JsonDeleteCompositePK[] = [];\n\tconst jsonAlteredCompositePKs: JsonAlterCompositePK[] = [];\n\n\tconst jsonAddedUniqueConstraints: JsonCreateUniqueConstraint[] = [];\n\tconst jsonDeletedUniqueConstraints: JsonDeleteUniqueConstraint[] = [];\n\tconst jsonAlteredUniqueConstraints: JsonAlterUniqueConstraint[] = [];\n\n\tconst jsonDeletedCheckConstraints: JsonDeleteCheckConstraint[] = [];\n\tconst jsonCreatedCheckConstraints: JsonCreateCheckConstraint[] = [];\n\n\tallAltered.forEach((it) => {\n\t\t// This part is needed to make sure that same columns in a table are not triggered for change\n\t\t// there is a case where orm and kit are responsible for pk name generation and one of them is not sorting name\n\t\t// We double-check that pk with same set of columns are both in added and deleted diffs\n\t\tlet addedColumns: string[] = [];\n\t\tfor (const addedPkName of Object.keys(it.addedCompositePKs)) {\n\t\t\tconst addedPkColumns = it.addedCompositePKs[addedPkName];\n\t\t\taddedColumns = SQLiteSquasher.unsquashPK(addedPkColumns);\n\t\t}\n\n\t\tlet deletedColumns: string[] = [];\n\t\tfor (const deletedPkName of Object.keys(it.deletedCompositePKs)) {\n\t\t\tconst deletedPkColumns = it.deletedCompositePKs[deletedPkName];\n\t\t\tdeletedColumns = SQLiteSquasher.unsquashPK(deletedPkColumns);\n\t\t}\n\n\t\t// Don't need to sort, but need to add tests for it\n\t\t// addedColumns.sort();\n\t\t// deletedColumns.sort();\n\n\t\tconst doPerformDeleteAndCreate = JSON.stringify(addedColumns) !== JSON.stringify(deletedColumns);\n\n\t\tlet addedCompositePKs: JsonCreateCompositePK[] = [];\n\t\tlet deletedCompositePKs: JsonDeleteCompositePK[] = [];\n\t\tlet alteredCompositePKs: JsonAlterCompositePK[] = [];\n\t\tif (doPerformDeleteAndCreate) {\n\t\t\taddedCompositePKs = prepareAddCompositePrimaryKeySqlite(\n\t\t\t\tit.name,\n\t\t\t\tit.addedCompositePKs,\n\t\t\t);\n\t\t\tdeletedCompositePKs = prepareDeleteCompositePrimaryKeySqlite(\n\t\t\t\tit.name,\n\t\t\t\tit.deletedCompositePKs,\n\t\t\t);\n\t\t}\n\t\talteredCompositePKs = prepareAlterCompositePrimaryKeySqlite(\n\t\t\tit.name,\n\t\t\tit.alteredCompositePKs,\n\t\t);\n\n\t\t// add logic for unique constraints\n\t\tlet addedUniqueConstraints: JsonCreateUniqueConstraint[] = [];\n\t\tlet deletedUniqueConstraints: JsonDeleteUniqueConstraint[] = [];\n\t\tlet alteredUniqueConstraints: JsonAlterUniqueConstraint[] = [];\n\n\t\tlet createdCheckConstraints: JsonCreateCheckConstraint[] = [];\n\t\tlet deletedCheckConstraints: JsonDeleteCheckConstraint[] = [];\n\n\t\taddedUniqueConstraints = prepareAddUniqueConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.addedUniqueConstraints,\n\t\t);\n\n\t\tdeletedUniqueConstraints = prepareDeleteUniqueConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.deletedUniqueConstraints,\n\t\t);\n\t\tif (it.alteredUniqueConstraints) {\n\t\t\tconst added: Record<string, string> = {};\n\t\t\tconst deleted: Record<string, string> = {};\n\t\t\tfor (const k of Object.keys(it.alteredUniqueConstraints)) {\n\t\t\t\tadded[k] = it.alteredUniqueConstraints[k].__new;\n\t\t\t\tdeleted[k] = it.alteredUniqueConstraints[k].__old;\n\t\t\t}\n\t\t\taddedUniqueConstraints.push(\n\t\t\t\t...prepareAddUniqueConstraint(it.name, it.schema, added),\n\t\t\t);\n\t\t\tdeletedUniqueConstraints.push(\n\t\t\t\t...prepareDeleteUniqueConstraint(it.name, it.schema, deleted),\n\t\t\t);\n\t\t}\n\n\t\tcreatedCheckConstraints = prepareAddCheckConstraint(it.name, it.schema, it.addedCheckConstraints);\n\t\tdeletedCheckConstraints = prepareDeleteCheckConstraint(\n\t\t\tit.name,\n\t\t\tit.schema,\n\t\t\tit.deletedCheckConstraints,\n\t\t);\n\n\t\t// skip for push\n\t\tif (it.alteredCheckConstraints && action !== 'push') {\n\t\t\tconst added: Record<string, string> = {};\n\t\t\tconst deleted: Record<string, string> = {};\n\n\t\t\tfor (const k of Object.keys(it.alteredCheckConstraints)) {\n\t\t\t\tadded[k] = it.alteredCheckConstraints[k].__new;\n\t\t\t\tdeleted[k] = it.alteredCheckConstraints[k].__old;\n\t\t\t}\n\t\t\tcreatedCheckConstraints.push(...prepareAddCheckConstraint(it.name, it.schema, added));\n\t\t\tdeletedCheckConstraints.push(...prepareDeleteCheckConstraint(it.name, it.schema, deleted));\n\t\t}\n\n\t\tjsonAddedCompositePKs.push(...addedCompositePKs);\n\t\tjsonDeletedCompositePKs.push(...deletedCompositePKs);\n\t\tjsonAlteredCompositePKs.push(...alteredCompositePKs);\n\n\t\tjsonAddedUniqueConstraints.push(...addedUniqueConstraints);\n\t\tjsonDeletedUniqueConstraints.push(...deletedUniqueConstraints);\n\t\tjsonAlteredUniqueConstraints.push(...alteredUniqueConstraints);\n\n\t\tjsonCreatedCheckConstraints.push(...createdCheckConstraints);\n\t\tjsonDeletedCheckConstraints.push(...deletedCheckConstraints);\n\t});\n\n\tconst jsonTableAlternations = allAltered\n\t\t.map((it) => {\n\t\t\treturn prepareSqliteAlterColumns(it.name, it.schema, it.altered, json2);\n\t\t})\n\t\t.flat();\n\n\tconst jsonCreateIndexesForAllAlteredTables = allAltered\n\t\t.map((it) => {\n\t\t\treturn prepareCreateIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.addedIndexes || {},\n\t\t\t\tcurFull.internal,\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tconst jsonDropIndexesForAllAlteredTables = allAltered\n\t\t.map((it) => {\n\t\t\treturn prepareDropIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.deletedIndexes || {},\n\t\t\t);\n\t\t})\n\t\t.flat();\n\n\tallAltered.forEach((it) => {\n\t\tconst droppedIndexes = Object.keys(it.alteredIndexes).reduce(\n\t\t\t(current, item: string) => {\n\t\t\t\tcurrent[item] = it.alteredIndexes[item].__old;\n\t\t\t\treturn current;\n\t\t\t},\n\t\t\t{} as Record<string, string>,\n\t\t);\n\t\tconst createdIndexes = Object.keys(it.alteredIndexes).reduce(\n\t\t\t(current, item: string) => {\n\t\t\t\tcurrent[item] = it.alteredIndexes[item].__new;\n\t\t\t\treturn current;\n\t\t\t},\n\t\t\t{} as Record<string, string>,\n\t\t);\n\n\t\tjsonCreateIndexesForAllAlteredTables.push(\n\t\t\t...prepareCreateIndexesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tcreatedIndexes || {},\n\t\t\t\tcurFull.internal,\n\t\t\t),\n\t\t);\n\t\tjsonDropIndexesForAllAlteredTables.push(\n\t\t\t...prepareDropIndexesJson(it.name, it.schema, droppedIndexes || {}),\n\t\t);\n\t});\n\n\tconst jsonReferencesForAllAlteredTables: JsonReferenceStatement[] = allAltered\n\t\t.map((it) => {\n\t\t\tconst forAdded = prepareLibSQLCreateReferencesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.addedForeignKeys,\n\t\t\t\tjson2,\n\t\t\t\taction,\n\t\t\t);\n\n\t\t\tconst forAltered = prepareLibSQLDropReferencesJson(\n\t\t\t\tit.name,\n\t\t\t\tit.schema,\n\t\t\t\tit.deletedForeignKeys,\n\t\t\t\tjson2,\n\t\t\t\t_meta,\n\t\t\t\taction,\n\t\t\t);\n\n\t\t\tconst alteredFKs = prepareAlterReferencesJson(it.name, it.schema, it.alteredForeignKeys);\n\n\t\t\treturn [...forAdded, ...forAltered, ...alteredFKs];\n\t\t})\n\t\t.flat();\n\n\tconst jsonCreatedReferencesForAlteredTables = jsonReferencesForAllAlteredTables.filter(\n\t\t(t) => t.type === 'create_reference',\n\t);\n\tconst jsonDroppedReferencesForAlteredTables = jsonReferencesForAllAlteredTables.filter(\n\t\t(t) => t.type === 'delete_reference',\n\t);\n\n\tconst createViews: JsonCreateSqliteViewStatement[] = [];\n\tconst dropViews: JsonDropViewStatement[] = [];\n\n\tcreateViews.push(\n\t\t...createdViews.filter((it) => !it.isExisting).map((it) => {\n\t\t\treturn prepareSqliteCreateViewJson(\n\t\t\t\tit.name,\n\t\t\t\tit.definition!,\n\t\t\t);\n\t\t}),\n\t);\n\n\tdropViews.push(\n\t\t...deletedViews.filter((it) => !it.isExisting).map((it) => {\n\t\t\treturn prepareDropViewJson(it.name);\n\t\t}),\n\t);\n\n\t// renames\n\tdropViews.push(\n\t\t...renamedViews.filter((it) => !it.to.isExisting).map((it) => {\n\t\t\treturn prepareDropViewJson(it.from.name);\n\t\t}),\n\t);\n\tcreateViews.push(\n\t\t...renamedViews.filter((it) => !it.to.isExisting).map((it) => {\n\t\t\treturn prepareSqliteCreateViewJson(it.to.name, it.to.definition!);\n\t\t}),\n\t);\n\n\tconst alteredViews = typedResult.alteredViews.filter((it) => !json2.views[it.name].isExisting);\n\n\tfor (const alteredView of alteredViews) {\n\t\tconst { definition } = json2.views[alteredView.name];\n\n\t\tif (alteredView.alteredExisting || (alteredView.alteredDefinition && action !== 'push')) {\n\t\t\tdropViews.push(prepareDropViewJson(alteredView.name));\n\n\t\t\tcreateViews.push(\n\t\t\t\tprepareSqliteCreateViewJson(\n\t\t\t\t\talteredView.name,\n\t\t\t\t\tdefinition!,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tconst jsonStatements: JsonStatement[] = [];\n\tjsonStatements.push(...jsonCreateTables);\n\n\tjsonStatements.push(...jsonDropTables);\n\tjsonStatements.push(...jsonRenameTables);\n\tjsonStatements.push(...jsonRenameColumnsStatements);\n\n\tjsonStatements.push(...jsonDroppedReferencesForAlteredTables);\n\n\tjsonStatements.push(...jsonDeletedCheckConstraints);\n\n\t// Will need to drop indexes before changing any columns in table\n\t// Then should go column alternations and then index creation\n\tjsonStatements.push(...jsonDropIndexesForAllAlteredTables);\n\n\tjsonStatements.push(...jsonDeletedCompositePKs);\n\tjsonStatements.push(...jsonTableAlternations);\n\tjsonStatements.push(...jsonAddedCompositePKs);\n\tjsonStatements.push(...jsonAddColumnsStatemets);\n\n\tjsonStatements.push(...jsonCreateIndexesForCreatedTables);\n\tjsonStatements.push(...jsonCreateIndexesForAllAlteredTables);\n\tjsonStatements.push(...jsonCreatedCheckConstraints);\n\n\tjsonStatements.push(...dropViews);\n\tjsonStatements.push(...createViews);\n\n\tjsonStatements.push(...jsonCreatedReferencesForAlteredTables);\n\n\tjsonStatements.push(...jsonDropColumnsStatemets);\n\n\tjsonStatements.push(...jsonAlteredCompositePKs);\n\n\tjsonStatements.push(...jsonAlteredUniqueConstraints);\n\n\tconst combinedJsonStatements = libSQLCombineStatements(jsonStatements, json2, action);\n\n\tconst sqlStatements = fromJson(\n\t\tcombinedJsonStatements,\n\t\t'turso',\n\t\taction,\n\t\tjson2,\n\t);\n\n\tconst uniqueSqlStatements: string[] = [];\n\tsqlStatements.forEach((ss) => {\n\t\tif (!uniqueSqlStatements.includes(ss)) {\n\t\t\tuniqueSqlStatements.push(ss);\n\t\t}\n\t});\n\n\treturn {\n\t\tstatements: combinedJsonStatements,\n\t\tsqlStatements: uniqueSqlStatements,\n\t\t_meta,\n\t};\n};\n\n// explicitely ask if tables were renamed, if yes - add those to altered tables, otherwise - deleted\n// double check if user wants to delete particular table and warn him on data loss\n"
  },
  {
    "path": "drizzle-kit/src/sqlgenerator.ts",
    "content": "import { BREAKPOINT } from './cli/commands/migrate';\nimport {\n\tJsonAddColumnStatement,\n\tJsonAddValueToEnumStatement,\n\tJsonAlterColumnAlterGeneratedStatement,\n\tJsonAlterColumnAlterIdentityStatement,\n\tJsonAlterColumnDropAutoincrementStatement,\n\tJsonAlterColumnDropDefaultStatement,\n\tJsonAlterColumnDropGeneratedStatement,\n\tJsonAlterColumnDropIdentityStatement,\n\tJsonAlterColumnDropNotNullStatement,\n\tJsonAlterColumnDropOnUpdateStatement,\n\tJsonAlterColumnDropPrimaryKeyStatement,\n\tJsonAlterColumnPgTypeStatement,\n\tJsonAlterColumnSetAutoincrementStatement,\n\tJsonAlterColumnSetDefaultStatement,\n\tJsonAlterColumnSetGeneratedStatement,\n\tJsonAlterColumnSetIdentityStatement,\n\tJsonAlterColumnSetNotNullStatement,\n\tJsonAlterColumnSetOnUpdateStatement,\n\tJsonAlterColumnSetPrimaryKeyStatement,\n\tJsonAlterColumnTypeStatement,\n\tJsonAlterCompositePK,\n\tJsonAlterIndPolicyStatement,\n\tJsonAlterMySqlViewStatement,\n\tJsonAlterPolicyStatement,\n\tJsonAlterReferenceStatement,\n\tJsonAlterRoleStatement,\n\tJsonAlterSequenceStatement,\n\tJsonAlterTableRemoveFromSchema,\n\tJsonAlterTableSetNewSchema,\n\tJsonAlterTableSetSchema,\n\tJsonAlterViewAddWithOptionStatement,\n\tJsonAlterViewAlterSchemaStatement,\n\tJsonAlterViewAlterTablespaceStatement,\n\tJsonAlterViewAlterUsingStatement,\n\tJsonAlterViewDropWithOptionStatement,\n\tJsonCreateCheckConstraint,\n\tJsonCreateCompositePK,\n\tJsonCreateEnumStatement,\n\tJsonCreateIndexStatement,\n\tJsonCreateIndPolicyStatement,\n\tJsonCreateMySqlViewStatement,\n\tJsonCreatePgViewStatement,\n\tJsonCreatePolicyStatement,\n\tJsonCreateReferenceStatement,\n\tJsonCreateRoleStatement,\n\tJsonCreateSchema,\n\tJsonCreateSequenceStatement,\n\tJsonCreateSqliteViewStatement,\n\tJsonCreateTableStatement,\n\tJsonCreateUniqueConstraint,\n\tJsonDeleteCheckConstraint,\n\tJsonDeleteCompositePK,\n\tJsonDeleteReferenceStatement,\n\tJsonDeleteUniqueConstraint,\n\tJsonDisableRLSStatement,\n\tJsonDropColumnStatement,\n\tJsonDropEnumStatement,\n\tJsonDropIndexStatement,\n\tJsonDropIndPolicyStatement,\n\tJsonDropPolicyStatement,\n\tJsonDropRoleStatement,\n\tJsonDropSequenceStatement,\n\tJsonDropTableStatement,\n\tJsonDropValueFromEnumStatement,\n\tJsonDropViewStatement,\n\tJsonEnableRLSStatement,\n\tJsonIndRenamePolicyStatement,\n\tJsonMoveEnumStatement,\n\tJsonMoveSequenceStatement,\n\tJsonPgCreateIndexStatement,\n\tJsonRecreateSingleStoreTableStatement,\n\tJsonRecreateTableStatement,\n\tJsonRenameColumnStatement,\n\tJsonRenameEnumStatement,\n\tJsonRenamePolicyStatement,\n\tJsonRenameRoleStatement,\n\tJsonRenameSchema,\n\tJsonRenameSequenceStatement,\n\tJsonRenameTableStatement,\n\tJsonRenameViewStatement,\n\tJsonSqliteAddColumnStatement,\n\tJsonSqliteCreateTableStatement,\n\tJsonStatement,\n} from './jsonStatements';\nimport { Dialect } from './schemaValidator';\nimport { MySqlSquasher } from './serializer/mysqlSchema';\nimport { PgSquasher, policy } from './serializer/pgSchema';\nimport { SingleStoreSquasher } from './serializer/singlestoreSchema';\nimport { SQLiteSchemaSquashed, SQLiteSquasher } from './serializer/sqliteSchema';\n\nimport { escapeSingleQuotes } from './utils';\n\nconst parseType = (schemaPrefix: string, type: string) => {\n\tconst pgNativeTypes = [\n\t\t'uuid',\n\t\t'smallint',\n\t\t'integer',\n\t\t'bigint',\n\t\t'boolean',\n\t\t'text',\n\t\t'varchar',\n\t\t'serial',\n\t\t'bigserial',\n\t\t'decimal',\n\t\t'numeric',\n\t\t'real',\n\t\t'json',\n\t\t'jsonb',\n\t\t'time',\n\t\t'time with time zone',\n\t\t'time without time zone',\n\t\t'time',\n\t\t'timestamp',\n\t\t'timestamp with time zone',\n\t\t'timestamp without time zone',\n\t\t'date',\n\t\t'interval',\n\t\t'bigint',\n\t\t'bigserial',\n\t\t'double precision',\n\t\t'interval year',\n\t\t'interval month',\n\t\t'interval day',\n\t\t'interval hour',\n\t\t'interval minute',\n\t\t'interval second',\n\t\t'interval year to month',\n\t\t'interval day to hour',\n\t\t'interval day to minute',\n\t\t'interval day to second',\n\t\t'interval hour to minute',\n\t\t'interval hour to second',\n\t\t'interval minute to second',\n\t\t'char',\n\t\t'vector',\n\t\t'geometry',\n\t\t'halfvec',\n\t\t'sparsevec',\n\t\t'bit',\n\t];\n\tconst arrayDefinitionRegex = /\\[\\d*(?:\\[\\d*\\])*\\]/g;\n\tconst arrayDefinition = (type.match(arrayDefinitionRegex) ?? []).join('');\n\tconst withoutArrayDefinition = type.replace(arrayDefinitionRegex, '');\n\treturn pgNativeTypes.some((it) => type.startsWith(it))\n\t\t? `${withoutArrayDefinition}${arrayDefinition}`\n\t\t: `${schemaPrefix}\"${withoutArrayDefinition}\"${arrayDefinition}`;\n};\n\nabstract class Convertor {\n\tabstract can(\n\t\tstatement: JsonStatement,\n\t\tdialect: Dialect,\n\t): boolean;\n\tabstract convert(\n\t\tstatement: JsonStatement,\n\t\tjson2?: SQLiteSchemaSquashed,\n\t\taction?: 'push',\n\t): string | string[];\n}\n\nclass PgCreateRoleConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_role' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonCreateRoleStatement): string | string[] {\n\t\treturn `CREATE ROLE \"${statement.name}\"${\n\t\t\tstatement.values.createDb || statement.values.createRole || !statement.values.inherit\n\t\t\t\t? ` WITH${statement.values.createDb ? ' CREATEDB' : ''}${statement.values.createRole ? ' CREATEROLE' : ''}${\n\t\t\t\t\tstatement.values.inherit ? '' : ' NOINHERIT'\n\t\t\t\t}`\n\t\t\t\t: ''\n\t\t};`;\n\t}\n}\n\nclass PgDropRoleConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_role' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonDropRoleStatement): string | string[] {\n\t\treturn `DROP ROLE \"${statement.name}\";`;\n\t}\n}\n\nclass PgRenameRoleConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'rename_role' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonRenameRoleStatement): string | string[] {\n\t\treturn `ALTER ROLE \"${statement.nameFrom}\" RENAME TO \"${statement.nameTo}\";`;\n\t}\n}\n\nclass PgAlterRoleConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_role' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonAlterRoleStatement): string | string[] {\n\t\treturn `ALTER ROLE \"${statement.name}\"${` WITH${statement.values.createDb ? ' CREATEDB' : ' NOCREATEDB'}${\n\t\t\tstatement.values.createRole ? ' CREATEROLE' : ' NOCREATEROLE'\n\t\t}${statement.values.inherit ? ' INHERIT' : ' NOINHERIT'}`};`;\n\t}\n}\n\n/////\n\nclass PgCreatePolicyConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_policy' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonCreatePolicyStatement): string | string[] {\n\t\tconst policy = statement.data;\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\tconst usingPart = policy.using ? ` USING (${policy.using})` : '';\n\n\t\tconst withCheckPart = policy.withCheck ? ` WITH CHECK (${policy.withCheck})` : '';\n\n\t\tconst policyToPart = policy.to?.map((v) =>\n\t\t\t['current_user', 'current_role', 'session_user', 'public'].includes(v) ? v : `\"${v}\"`\n\t\t).join(', ');\n\n\t\treturn `CREATE POLICY \"${policy.name}\" ON ${tableNameWithSchema} AS ${policy.as?.toUpperCase()} FOR ${policy.for?.toUpperCase()} TO ${policyToPart}${usingPart}${withCheckPart};`;\n\t}\n}\n\nclass PgDropPolicyConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_policy' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonDropPolicyStatement): string | string[] {\n\t\tconst policy = statement.data;\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `DROP POLICY \"${policy.name}\" ON ${tableNameWithSchema} CASCADE;`;\n\t}\n}\n\nclass PgRenamePolicyConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'rename_policy' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonRenamePolicyStatement): string | string[] {\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `ALTER POLICY \"${statement.oldName}\" ON ${tableNameWithSchema} RENAME TO \"${statement.newName}\";`;\n\t}\n}\n\nclass PgAlterPolicyConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_policy' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonAlterPolicyStatement, _dialect: any, action?: string): string | string[] {\n\t\tconst newPolicy = action === 'push'\n\t\t\t? PgSquasher.unsquashPolicyPush(statement.newData)\n\t\t\t: PgSquasher.unsquashPolicy(statement.newData);\n\t\tconst oldPolicy = action === 'push'\n\t\t\t? PgSquasher.unsquashPolicyPush(statement.oldData)\n\t\t\t: PgSquasher.unsquashPolicy(statement.oldData);\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\tconst usingPart = newPolicy.using\n\t\t\t? ` USING (${newPolicy.using})`\n\t\t\t: oldPolicy.using\n\t\t\t? ` USING (${oldPolicy.using})`\n\t\t\t: '';\n\n\t\tconst withCheckPart = newPolicy.withCheck\n\t\t\t? ` WITH CHECK (${newPolicy.withCheck})`\n\t\t\t: oldPolicy.withCheck\n\t\t\t? ` WITH CHECK  (${oldPolicy.withCheck})`\n\t\t\t: '';\n\n\t\treturn `ALTER POLICY \"${oldPolicy.name}\" ON ${tableNameWithSchema} TO ${newPolicy.to}${usingPart}${withCheckPart};`;\n\t}\n}\n\n////\n\nclass PgCreateIndPolicyConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_ind_policy' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonCreateIndPolicyStatement): string | string[] {\n\t\tconst policy = statement.data;\n\n\t\tconst usingPart = policy.using ? ` USING (${policy.using})` : '';\n\n\t\tconst withCheckPart = policy.withCheck ? ` WITH CHECK (${policy.withCheck})` : '';\n\n\t\tconst policyToPart = policy.to?.map((v) =>\n\t\t\t['current_user', 'current_role', 'session_user', 'public'].includes(v) ? v : `\"${v}\"`\n\t\t).join(', ');\n\n\t\treturn `CREATE POLICY \"${policy.name}\" ON ${policy.on} AS ${policy.as?.toUpperCase()} FOR ${policy.for?.toUpperCase()} TO ${policyToPart}${usingPart}${withCheckPart};`;\n\t}\n}\n\nclass PgDropIndPolicyConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_ind_policy' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonDropIndPolicyStatement): string | string[] {\n\t\tconst policy = statement.data;\n\n\t\treturn `DROP POLICY \"${policy.name}\" ON ${policy.on} CASCADE;`;\n\t}\n}\n\nclass PgRenameIndPolicyConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'rename_ind_policy' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonIndRenamePolicyStatement): string | string[] {\n\t\treturn `ALTER POLICY \"${statement.oldName}\" ON ${statement.tableKey} RENAME TO \"${statement.newName}\";`;\n\t}\n}\n\nclass PgAlterIndPolicyConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_ind_policy' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonAlterIndPolicyStatement): string | string[] {\n\t\tconst newPolicy = statement.newData;\n\t\tconst oldPolicy = statement.oldData;\n\n\t\tconst usingPart = newPolicy.using\n\t\t\t? ` USING (${newPolicy.using})`\n\t\t\t: oldPolicy.using\n\t\t\t? ` USING (${oldPolicy.using})`\n\t\t\t: '';\n\n\t\tconst withCheckPart = newPolicy.withCheck\n\t\t\t? ` WITH CHECK (${newPolicy.withCheck})`\n\t\t\t: oldPolicy.withCheck\n\t\t\t? ` WITH CHECK  (${oldPolicy.withCheck})`\n\t\t\t: '';\n\n\t\treturn `ALTER POLICY \"${oldPolicy.name}\" ON ${oldPolicy.on} TO ${newPolicy.to}${usingPart}${withCheckPart};`;\n\t}\n}\n\n////\n\nclass PgEnableRlsConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'enable_rls' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonEnableRLSStatement): string {\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} ENABLE ROW LEVEL SECURITY;`;\n\t}\n}\n\nclass PgDisableRlsConvertor extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'disable_rls' && dialect === 'postgresql';\n\t}\n\toverride convert(statement: JsonDisableRLSStatement): string {\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} DISABLE ROW LEVEL SECURITY;`;\n\t}\n}\n\nclass PgCreateTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_table' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonCreateTableStatement) {\n\t\tconst { tableName, schema, columns, compositePKs, uniqueConstraints, checkConstraints, policies, isRLSEnabled } =\n\t\t\tst;\n\n\t\tlet statement = '';\n\t\tconst name = schema ? `\"${schema}\".\"${tableName}\"` : `\"${tableName}\"`;\n\n\t\tstatement += `CREATE TABLE ${name} (\\n`;\n\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\tconst column = columns[i];\n\n\t\t\tconst primaryKeyStatement = column.primaryKey ? ' PRIMARY KEY' : '';\n\t\t\tconst notNullStatement = column.notNull && !column.identity ? ' NOT NULL' : '';\n\t\t\tconst defaultStatement = column.default !== undefined ? ` DEFAULT ${column.default}` : '';\n\n\t\t\tconst uniqueConstraint = column.isUnique\n\t\t\t\t? ` CONSTRAINT \"${column.uniqueName}\" UNIQUE${column.nullsNotDistinct ? ' NULLS NOT DISTINCT' : ''}`\n\t\t\t\t: '';\n\n\t\t\tconst schemaPrefix = column.typeSchema && column.typeSchema !== 'public'\n\t\t\t\t? `\"${column.typeSchema}\".`\n\t\t\t\t: '';\n\n\t\t\tconst type = parseType(schemaPrefix, column.type);\n\t\t\tconst generated = column.generated;\n\n\t\t\tconst generatedStatement = generated ? ` GENERATED ALWAYS AS (${generated?.as}) STORED` : '';\n\n\t\t\tconst unsquashedIdentity = column.identity\n\t\t\t\t? PgSquasher.unsquashIdentity(column.identity)\n\t\t\t\t: undefined;\n\n\t\t\tconst identityWithSchema = schema\n\t\t\t\t? `\"${schema}\".\"${unsquashedIdentity?.name}\"`\n\t\t\t\t: `\"${unsquashedIdentity?.name}\"`;\n\n\t\t\tconst identity = unsquashedIdentity\n\t\t\t\t? ` GENERATED ${\n\t\t\t\t\tunsquashedIdentity.type === 'always' ? 'ALWAYS' : 'BY DEFAULT'\n\t\t\t\t} AS IDENTITY (sequence name ${identityWithSchema}${\n\t\t\t\t\tunsquashedIdentity.increment\n\t\t\t\t\t\t? ` INCREMENT BY ${unsquashedIdentity.increment}`\n\t\t\t\t\t\t: ''\n\t\t\t\t}${\n\t\t\t\t\tunsquashedIdentity.minValue\n\t\t\t\t\t\t? ` MINVALUE ${unsquashedIdentity.minValue}`\n\t\t\t\t\t\t: ''\n\t\t\t\t}${\n\t\t\t\t\tunsquashedIdentity.maxValue\n\t\t\t\t\t\t? ` MAXVALUE ${unsquashedIdentity.maxValue}`\n\t\t\t\t\t\t: ''\n\t\t\t\t}${\n\t\t\t\t\tunsquashedIdentity.startWith\n\t\t\t\t\t\t? ` START WITH ${unsquashedIdentity.startWith}`\n\t\t\t\t\t\t: ''\n\t\t\t\t}${unsquashedIdentity.cache ? ` CACHE ${unsquashedIdentity.cache}` : ''}${\n\t\t\t\t\tunsquashedIdentity.cycle ? ` CYCLE` : ''\n\t\t\t\t})`\n\t\t\t\t: '';\n\n\t\t\tstatement += '\\t'\n\t\t\t\t+ `\"${column.name}\" ${type}${primaryKeyStatement}${defaultStatement}${generatedStatement}${notNullStatement}${uniqueConstraint}${identity}`;\n\t\t\tstatement += i === columns.length - 1 ? '' : ',\\n';\n\t\t}\n\n\t\tif (typeof compositePKs !== 'undefined' && compositePKs.length > 0) {\n\t\t\tstatement += ',\\n';\n\t\t\tconst compositePK = PgSquasher.unsquashPK(compositePKs[0]);\n\t\t\tstatement += `\\tCONSTRAINT \"${st.compositePkName}\" PRIMARY KEY(\\\"${compositePK.columns.join(`\",\"`)}\\\")`;\n\t\t\t// statement += `\\n`;\n\t\t}\n\n\t\tif (\n\t\t\ttypeof uniqueConstraints !== 'undefined'\n\t\t\t&& uniqueConstraints.length > 0\n\t\t) {\n\t\t\tfor (const uniqueConstraint of uniqueConstraints) {\n\t\t\t\tstatement += ',\\n';\n\t\t\t\tconst unsquashedUnique = PgSquasher.unsquashUnique(uniqueConstraint);\n\t\t\t\tstatement += `\\tCONSTRAINT \"${unsquashedUnique.name}\" UNIQUE${\n\t\t\t\t\tunsquashedUnique.nullsNotDistinct ? ' NULLS NOT DISTINCT' : ''\n\t\t\t\t}(\\\"${unsquashedUnique.columns.join(`\",\"`)}\\\")`;\n\t\t\t\t// statement += `\\n`;\n\t\t\t}\n\t\t}\n\n\t\tif (typeof checkConstraints !== 'undefined' && checkConstraints.length > 0) {\n\t\t\tfor (const checkConstraint of checkConstraints) {\n\t\t\t\tstatement += ',\\n';\n\t\t\t\tconst unsquashedCheck = PgSquasher.unsquashCheck(checkConstraint);\n\t\t\t\tstatement += `\\tCONSTRAINT \"${unsquashedCheck.name}\" CHECK (${unsquashedCheck.value})`;\n\t\t\t}\n\t\t}\n\n\t\tstatement += `\\n);`;\n\t\tstatement += `\\n`;\n\n\t\tconst enableRls = new PgEnableRlsConvertor().convert({\n\t\t\ttype: 'enable_rls',\n\t\t\ttableName,\n\t\t\tschema,\n\t\t});\n\n\t\treturn [statement, ...(policies && policies.length > 0 || isRLSEnabled ? [enableRls] : [])];\n\t}\n}\n\nclass MySqlCreateTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_table' && dialect === 'mysql';\n\t}\n\n\tconvert(st: JsonCreateTableStatement) {\n\t\tconst {\n\t\t\ttableName,\n\t\t\tcolumns,\n\t\t\tschema,\n\t\t\tcheckConstraints,\n\t\t\tcompositePKs,\n\t\t\tuniqueConstraints,\n\t\t\tinternals,\n\t\t} = st;\n\n\t\tlet statement = '';\n\t\tstatement += `CREATE TABLE \\`${tableName}\\` (\\n`;\n\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\tconst column = columns[i];\n\n\t\t\tconst primaryKeyStatement = column.primaryKey ? ' PRIMARY KEY' : '';\n\t\t\tconst notNullStatement = column.notNull ? ' NOT NULL' : '';\n\t\t\tconst defaultStatement = column.default !== undefined ? ` DEFAULT ${column.default}` : '';\n\n\t\t\tconst onUpdateStatement = column.onUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\n\t\t\tconst autoincrementStatement = column.autoincrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\n\t\t\tconst generatedStatement = column.generated\n\t\t\t\t? ` GENERATED ALWAYS AS (${column.generated?.as}) ${column.generated?.type.toUpperCase()}`\n\t\t\t\t: '';\n\n\t\t\tstatement += '\\t'\n\t\t\t\t+ `\\`${column.name}\\` ${column.type}${autoincrementStatement}${primaryKeyStatement}${generatedStatement}${notNullStatement}${defaultStatement}${onUpdateStatement}`;\n\t\t\tstatement += i === columns.length - 1 ? '' : ',\\n';\n\t\t}\n\n\t\tif (typeof compositePKs !== 'undefined' && compositePKs.length > 0) {\n\t\t\tstatement += ',\\n';\n\t\t\tconst compositePK = MySqlSquasher.unsquashPK(compositePKs[0]);\n\t\t\tstatement += `\\tCONSTRAINT \\`${st.compositePkName}\\` PRIMARY KEY(\\`${compositePK.columns.join(`\\`,\\``)}\\`)`;\n\t\t}\n\n\t\tif (\n\t\t\ttypeof uniqueConstraints !== 'undefined'\n\t\t\t&& uniqueConstraints.length > 0\n\t\t) {\n\t\t\tfor (const uniqueConstraint of uniqueConstraints) {\n\t\t\t\tstatement += ',\\n';\n\t\t\t\tconst unsquashedUnique = MySqlSquasher.unsquashUnique(uniqueConstraint);\n\n\t\t\t\tconst uniqueString = unsquashedUnique.columns\n\t\t\t\t\t.map((it) => {\n\t\t\t\t\t\treturn internals?.indexes\n\t\t\t\t\t\t\t? internals?.indexes[unsquashedUnique.name]?.columns[it]\n\t\t\t\t\t\t\t\t\t?.isExpression\n\t\t\t\t\t\t\t\t? it\n\t\t\t\t\t\t\t\t: `\\`${it}\\``\n\t\t\t\t\t\t\t: `\\`${it}\\``;\n\t\t\t\t\t})\n\t\t\t\t\t.join(',');\n\n\t\t\t\tstatement += `\\tCONSTRAINT \\`${unsquashedUnique.name}\\` UNIQUE(${uniqueString})`;\n\t\t\t}\n\t\t}\n\n\t\tif (typeof checkConstraints !== 'undefined' && checkConstraints.length > 0) {\n\t\t\tfor (const checkConstraint of checkConstraints) {\n\t\t\t\tstatement += ',\\n';\n\t\t\t\tconst unsquashedCheck = MySqlSquasher.unsquashCheck(checkConstraint);\n\n\t\t\t\tstatement += `\\tCONSTRAINT \\`${unsquashedCheck.name}\\` CHECK(${unsquashedCheck.value})`;\n\t\t\t}\n\t\t}\n\n\t\tstatement += `\\n);`;\n\t\tstatement += `\\n`;\n\t\treturn statement;\n\t}\n}\nexport class SingleStoreCreateTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_table' && dialect === 'singlestore';\n\t}\n\n\tconvert(st: JsonCreateTableStatement) {\n\t\tconst {\n\t\t\ttableName,\n\t\t\tcolumns,\n\t\t\tschema,\n\t\t\tcompositePKs,\n\t\t\tuniqueConstraints,\n\t\t\tinternals,\n\t\t} = st;\n\n\t\tlet statement = '';\n\t\tstatement += `CREATE TABLE \\`${tableName}\\` (\\n`;\n\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\tconst column = columns[i];\n\n\t\t\tconst primaryKeyStatement = column.primaryKey ? ' PRIMARY KEY' : '';\n\t\t\tconst notNullStatement = column.notNull ? ' NOT NULL' : '';\n\t\t\tconst defaultStatement = column.default !== undefined ? ` DEFAULT ${column.default}` : '';\n\n\t\t\tconst onUpdateStatement = column.onUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\n\t\t\tconst autoincrementStatement = column.autoincrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\n\t\t\tconst generatedStatement = column.generated\n\t\t\t\t? ` GENERATED ALWAYS AS (${column.generated?.as}) ${column.generated?.type.toUpperCase()}`\n\t\t\t\t: '';\n\n\t\t\tstatement += '\\t'\n\t\t\t\t+ `\\`${column.name}\\` ${column.type}${autoincrementStatement}${primaryKeyStatement}${notNullStatement}${defaultStatement}${onUpdateStatement}${generatedStatement}`;\n\t\t\tstatement += i === columns.length - 1 ? '' : ',\\n';\n\t\t}\n\n\t\tif (typeof compositePKs !== 'undefined' && compositePKs.length > 0) {\n\t\t\tstatement += ',\\n';\n\t\t\tconst compositePK = SingleStoreSquasher.unsquashPK(compositePKs[0]);\n\t\t\tstatement += `\\tCONSTRAINT \\`${compositePK.name}\\` PRIMARY KEY(\\`${compositePK.columns.join(`\\`,\\``)}\\`)`;\n\t\t}\n\n\t\tif (\n\t\t\ttypeof uniqueConstraints !== 'undefined'\n\t\t\t&& uniqueConstraints.length > 0\n\t\t) {\n\t\t\tfor (const uniqueConstraint of uniqueConstraints) {\n\t\t\t\tstatement += ',\\n';\n\t\t\t\tconst unsquashedUnique = SingleStoreSquasher.unsquashUnique(uniqueConstraint);\n\n\t\t\t\tconst uniqueString = unsquashedUnique.columns\n\t\t\t\t\t.map((it) => {\n\t\t\t\t\t\treturn internals?.indexes\n\t\t\t\t\t\t\t? internals?.indexes[unsquashedUnique.name]?.columns[it]\n\t\t\t\t\t\t\t\t\t?.isExpression\n\t\t\t\t\t\t\t\t? it\n\t\t\t\t\t\t\t\t: `\\`${it}\\``\n\t\t\t\t\t\t\t: `\\`${it}\\``;\n\t\t\t\t\t})\n\t\t\t\t\t.join(',');\n\n\t\t\t\tstatement += `\\tCONSTRAINT \\`${unsquashedUnique.name}\\` UNIQUE(${uniqueString})`;\n\t\t\t}\n\t\t}\n\n\t\tstatement += `\\n);`;\n\t\tstatement += `\\n`;\n\t\treturn statement;\n\t}\n}\n\nexport class SQLiteCreateTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'sqlite_create_table' && (dialect === 'sqlite' || dialect === 'turso');\n\t}\n\n\tconvert(st: JsonSqliteCreateTableStatement) {\n\t\tconst {\n\t\t\ttableName,\n\t\t\tcolumns,\n\t\t\treferenceData,\n\t\t\tcompositePKs,\n\t\t\tuniqueConstraints,\n\t\t\tcheckConstraints,\n\t\t} = st;\n\n\t\tlet statement = '';\n\t\tstatement += `CREATE TABLE \\`${tableName}\\` (\\n`;\n\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\tconst column = columns[i];\n\n\t\t\tconst primaryKeyStatement = column.primaryKey ? ' PRIMARY KEY' : '';\n\t\t\tconst notNullStatement = column.notNull ? ' NOT NULL' : '';\n\t\t\tconst defaultStatement = column.default !== undefined ? ` DEFAULT ${column.default}` : '';\n\n\t\t\tconst autoincrementStatement = column.autoincrement\n\t\t\t\t? ' AUTOINCREMENT'\n\t\t\t\t: '';\n\n\t\t\tconst generatedStatement = column.generated\n\t\t\t\t? ` GENERATED ALWAYS AS ${column.generated.as} ${column.generated.type.toUpperCase()}`\n\t\t\t\t: '';\n\n\t\t\tstatement += '\\t';\n\t\t\tstatement +=\n\t\t\t\t`\\`${column.name}\\` ${column.type}${primaryKeyStatement}${autoincrementStatement}${defaultStatement}${generatedStatement}${notNullStatement}`;\n\n\t\t\tstatement += i === columns.length - 1 ? '' : ',\\n';\n\t\t}\n\n\t\tcompositePKs.forEach((it) => {\n\t\t\tstatement += ',\\n\\t';\n\t\t\tstatement += `PRIMARY KEY(${it.map((it) => `\\`${it}\\``).join(', ')})`;\n\t\t});\n\n\t\tfor (let i = 0; i < referenceData.length; i++) {\n\t\t\tconst {\n\t\t\t\tname,\n\t\t\t\ttableFrom,\n\t\t\t\ttableTo,\n\t\t\t\tcolumnsFrom,\n\t\t\t\tcolumnsTo,\n\t\t\t\tonDelete,\n\t\t\t\tonUpdate,\n\t\t\t} = referenceData[i];\n\n\t\t\tconst onDeleteStatement = onDelete ? ` ON DELETE ${onDelete}` : '';\n\t\t\tconst onUpdateStatement = onUpdate ? ` ON UPDATE ${onUpdate}` : '';\n\t\t\tconst fromColumnsString = columnsFrom.map((it) => `\\`${it}\\``).join(',');\n\t\t\tconst toColumnsString = columnsTo.map((it) => `\\`${it}\\``).join(',');\n\n\t\t\tstatement += ',';\n\t\t\tstatement += '\\n\\t';\n\t\t\tstatement +=\n\t\t\t\t`FOREIGN KEY (${fromColumnsString}) REFERENCES \\`${tableTo}\\`(${toColumnsString})${onUpdateStatement}${onDeleteStatement}`;\n\t\t}\n\n\t\tif (\n\t\t\ttypeof uniqueConstraints !== 'undefined'\n\t\t\t&& uniqueConstraints.length > 0\n\t\t) {\n\t\t\tfor (const uniqueConstraint of uniqueConstraints) {\n\t\t\t\tstatement += ',\\n';\n\t\t\t\tconst unsquashedUnique = SQLiteSquasher.unsquashUnique(uniqueConstraint);\n\t\t\t\tstatement += `\\tCONSTRAINT ${unsquashedUnique.name} UNIQUE(\\`${unsquashedUnique.columns.join(`\\`,\\``)}\\`)`;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\ttypeof checkConstraints !== 'undefined'\n\t\t\t&& checkConstraints.length > 0\n\t\t) {\n\t\t\tfor (const check of checkConstraints) {\n\t\t\t\tstatement += ',\\n';\n\t\t\t\tconst { value, name } = SQLiteSquasher.unsquashCheck(check);\n\t\t\t\tstatement += `\\tCONSTRAINT \"${name}\" CHECK(${value})`;\n\t\t\t}\n\t\t}\n\n\t\tstatement += `\\n`;\n\t\tstatement += `);`;\n\t\tstatement += `\\n`;\n\t\treturn statement;\n\t}\n}\n\nclass PgCreateViewConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_view' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonCreatePgViewStatement) {\n\t\tconst { definition, name: viewName, schema, with: withOption, materialized, withNoData, tablespace, using } = st;\n\n\t\tconst name = schema ? `\"${schema}\".\"${viewName}\"` : `\"${viewName}\"`;\n\n\t\tlet statement = materialized ? `CREATE MATERIALIZED VIEW ${name}` : `CREATE VIEW ${name}`;\n\n\t\tif (using) statement += ` USING \"${using}\"`;\n\n\t\tconst options: string[] = [];\n\t\tif (withOption) {\n\t\t\tstatement += ` WITH (`;\n\n\t\t\tObject.entries(withOption).forEach(([key, value]) => {\n\t\t\t\tif (typeof value === 'undefined') return;\n\n\t\t\t\toptions.push(`${key.snake_case()} = ${value}`);\n\t\t\t});\n\n\t\t\tstatement += options.join(', ');\n\n\t\t\tstatement += `)`;\n\t\t}\n\n\t\tif (tablespace) statement += ` TABLESPACE ${tablespace}`;\n\n\t\tstatement += ` AS (${definition})`;\n\n\t\tif (withNoData) statement += ` WITH NO DATA`;\n\n\t\tstatement += `;`;\n\n\t\treturn statement;\n\t}\n}\n\nclass MySqlCreateViewConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'mysql_create_view' && dialect === 'mysql';\n\t}\n\n\tconvert(st: JsonCreateMySqlViewStatement) {\n\t\tconst { definition, name, algorithm, sqlSecurity, withCheckOption, replace } = st;\n\n\t\tlet statement = `CREATE `;\n\t\tstatement += replace ? `OR REPLACE ` : '';\n\t\tstatement += algorithm ? `ALGORITHM = ${algorithm}\\n` : '';\n\t\tstatement += sqlSecurity ? `SQL SECURITY ${sqlSecurity}\\n` : '';\n\t\tstatement += `VIEW \\`${name}\\` AS (${definition})`;\n\t\tstatement += withCheckOption ? `\\nWITH ${withCheckOption} CHECK OPTION` : '';\n\n\t\tstatement += ';';\n\n\t\treturn statement;\n\t}\n}\n\nclass SqliteCreateViewConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'sqlite_create_view' && (dialect === 'sqlite' || dialect === 'turso');\n\t}\n\n\tconvert(st: JsonCreateSqliteViewStatement) {\n\t\tconst { definition, name } = st;\n\n\t\treturn `CREATE VIEW \\`${name}\\` AS ${definition};`;\n\t}\n}\n\nclass PgDropViewConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_view' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonDropViewStatement) {\n\t\tconst { name: viewName, schema, materialized } = st;\n\n\t\tconst name = schema ? `\"${schema}\".\"${viewName}\"` : `\"${viewName}\"`;\n\n\t\treturn `DROP${materialized ? ' MATERIALIZED' : ''} VIEW ${name};`;\n\t}\n}\n\nclass MySqlDropViewConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_view' && dialect === 'mysql';\n\t}\n\n\tconvert(st: JsonDropViewStatement) {\n\t\tconst { name } = st;\n\n\t\treturn `DROP VIEW \\`${name}\\`;`;\n\t}\n}\n\nclass SqliteDropViewConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_view' && (dialect === 'sqlite' || dialect === 'turso');\n\t}\n\n\tconvert(st: JsonDropViewStatement) {\n\t\tconst { name } = st;\n\n\t\treturn `DROP VIEW \\`${name}\\`;`;\n\t}\n}\n\nclass MySqlAlterViewConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_mysql_view' && dialect === 'mysql';\n\t}\n\n\tconvert(st: JsonAlterMySqlViewStatement) {\n\t\tconst { name, algorithm, definition, sqlSecurity, withCheckOption } = st;\n\n\t\tlet statement = `ALTER `;\n\t\tstatement += algorithm ? `ALGORITHM = ${algorithm}\\n` : '';\n\t\tstatement += sqlSecurity ? `SQL SECURITY ${sqlSecurity}\\n` : '';\n\t\tstatement += `VIEW \\`${name}\\` AS ${definition}`;\n\t\tstatement += withCheckOption ? `\\nWITH ${withCheckOption} CHECK OPTION` : '';\n\n\t\tstatement += ';';\n\n\t\treturn statement;\n\t}\n}\n\nclass PgRenameViewConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'rename_view' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonRenameViewStatement) {\n\t\tconst { nameFrom: from, nameTo: to, schema, materialized } = st;\n\n\t\tconst nameFrom = `\"${schema}\".\"${from}\"`;\n\n\t\treturn `ALTER${materialized ? ' MATERIALIZED' : ''} VIEW ${nameFrom} RENAME TO \"${to}\";`;\n\t}\n}\n\nclass MySqlRenameViewConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'rename_view' && dialect === 'mysql';\n\t}\n\n\tconvert(st: JsonRenameViewStatement) {\n\t\tconst { nameFrom: from, nameTo: to } = st;\n\n\t\treturn `RENAME TABLE \\`${from}\\` TO \\`${to}\\`;`;\n\t}\n}\n\nclass PgAlterViewSchemaConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_view_alter_schema' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonAlterViewAlterSchemaStatement) {\n\t\tconst { fromSchema, toSchema, name, materialized } = st;\n\n\t\tconst statement = `ALTER${\n\t\t\tmaterialized ? ' MATERIALIZED' : ''\n\t\t} VIEW \"${fromSchema}\".\"${name}\" SET SCHEMA \"${toSchema}\";`;\n\n\t\treturn statement;\n\t}\n}\n\nclass PgAlterViewAddWithOptionConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_view_add_with_option' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonAlterViewAddWithOptionStatement) {\n\t\tconst { schema, with: withOption, name, materialized } = st;\n\n\t\tlet statement = `ALTER${materialized ? ' MATERIALIZED' : ''} VIEW \"${schema}\".\"${name}\" SET (`;\n\n\t\tconst options: string[] = [];\n\n\t\tObject.entries(withOption).forEach(([key, value]) => {\n\t\t\toptions.push(`${key.snake_case()} = ${value}`);\n\t\t});\n\n\t\tstatement += options.join(', ');\n\n\t\tstatement += `);`;\n\n\t\treturn statement;\n\t}\n}\n\nclass PgAlterViewDropWithOptionConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_view_drop_with_option' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonAlterViewDropWithOptionStatement) {\n\t\tconst { schema, name, materialized, with: withOptions } = st;\n\n\t\tlet statement = `ALTER${materialized ? ' MATERIALIZED' : ''} VIEW \"${schema}\".\"${name}\" RESET (`;\n\n\t\tconst options: string[] = [];\n\n\t\tObject.entries(withOptions).forEach(([key, value]) => {\n\t\t\toptions.push(`${key.snake_case()}`);\n\t\t});\n\n\t\tstatement += options.join(', ');\n\n\t\tstatement += ');';\n\n\t\treturn statement;\n\t}\n}\n\nclass PgAlterViewAlterTablespaceConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_view_alter_tablespace' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonAlterViewAlterTablespaceStatement) {\n\t\tconst { schema, name, toTablespace } = st;\n\n\t\tconst statement = `ALTER MATERIALIZED VIEW \"${schema}\".\"${name}\" SET TABLESPACE ${toTablespace};`;\n\n\t\treturn statement;\n\t}\n}\n\nclass PgAlterViewAlterUsingConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_view_alter_using' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonAlterViewAlterUsingStatement) {\n\t\tconst { schema, name, toUsing } = st;\n\n\t\tconst statement = `ALTER MATERIALIZED VIEW \"${schema}\".\"${name}\" SET ACCESS METHOD \"${toUsing}\";`;\n\n\t\treturn statement;\n\t}\n}\n\nclass PgAlterTableAlterColumnSetGenerated extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_set_identity'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\toverride convert(\n\t\tstatement: JsonAlterColumnSetIdentityStatement,\n\t): string | string[] {\n\t\tconst { identity, tableName, columnName, schema } = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\tconst unsquashedIdentity = PgSquasher.unsquashIdentity(identity);\n\n\t\tconst identityWithSchema = schema\n\t\t\t? `\"${schema}\".\"${unsquashedIdentity?.name}\"`\n\t\t\t: `\"${unsquashedIdentity?.name}\"`;\n\n\t\tconst identityStatement = unsquashedIdentity\n\t\t\t? ` GENERATED ${\n\t\t\t\tunsquashedIdentity.type === 'always' ? 'ALWAYS' : 'BY DEFAULT'\n\t\t\t} AS IDENTITY (sequence name ${identityWithSchema}${\n\t\t\t\tunsquashedIdentity.increment\n\t\t\t\t\t? ` INCREMENT BY ${unsquashedIdentity.increment}`\n\t\t\t\t\t: ''\n\t\t\t}${\n\t\t\t\tunsquashedIdentity.minValue\n\t\t\t\t\t? ` MINVALUE ${unsquashedIdentity.minValue}`\n\t\t\t\t\t: ''\n\t\t\t}${\n\t\t\t\tunsquashedIdentity.maxValue\n\t\t\t\t\t? ` MAXVALUE ${unsquashedIdentity.maxValue}`\n\t\t\t\t\t: ''\n\t\t\t}${\n\t\t\t\tunsquashedIdentity.startWith\n\t\t\t\t\t? ` START WITH ${unsquashedIdentity.startWith}`\n\t\t\t\t\t: ''\n\t\t\t}${unsquashedIdentity.cache ? ` CACHE ${unsquashedIdentity.cache}` : ''}${\n\t\t\t\tunsquashedIdentity.cycle ? ` CYCLE` : ''\n\t\t\t})`\n\t\t\t: '';\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" ADD${identityStatement};`;\n\t}\n}\n\nclass PgAlterTableAlterColumnDropGenerated extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_identity'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\toverride convert(\n\t\tstatement: JsonAlterColumnDropIdentityStatement,\n\t): string | string[] {\n\t\tconst { tableName, columnName, schema } = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" DROP IDENTITY;`;\n\t}\n}\n\nclass PgAlterTableAlterColumnAlterGenerated extends Convertor {\n\toverride can(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_change_identity'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\toverride convert(\n\t\tstatement: JsonAlterColumnAlterIdentityStatement,\n\t): string | string[] {\n\t\tconst { identity, oldIdentity, tableName, columnName, schema } = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\tconst unsquashedIdentity = PgSquasher.unsquashIdentity(identity);\n\t\tconst unsquashedOldIdentity = PgSquasher.unsquashIdentity(oldIdentity);\n\n\t\tconst statementsToReturn: string[] = [];\n\n\t\tif (unsquashedOldIdentity.type !== unsquashedIdentity.type) {\n\t\t\tstatementsToReturn.push(\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET GENERATED ${\n\t\t\t\t\tunsquashedIdentity.type === 'always' ? 'ALWAYS' : 'BY DEFAULT'\n\t\t\t\t};`,\n\t\t\t);\n\t\t}\n\n\t\tif (unsquashedOldIdentity.minValue !== unsquashedIdentity.minValue) {\n\t\t\tstatementsToReturn.push(\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET MINVALUE ${unsquashedIdentity.minValue};`,\n\t\t\t);\n\t\t}\n\n\t\tif (unsquashedOldIdentity.maxValue !== unsquashedIdentity.maxValue) {\n\t\t\tstatementsToReturn.push(\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET MAXVALUE ${unsquashedIdentity.maxValue};`,\n\t\t\t);\n\t\t}\n\n\t\tif (unsquashedOldIdentity.increment !== unsquashedIdentity.increment) {\n\t\t\tstatementsToReturn.push(\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET INCREMENT BY ${unsquashedIdentity.increment};`,\n\t\t\t);\n\t\t}\n\n\t\tif (unsquashedOldIdentity.startWith !== unsquashedIdentity.startWith) {\n\t\t\tstatementsToReturn.push(\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET START WITH ${unsquashedIdentity.startWith};`,\n\t\t\t);\n\t\t}\n\n\t\tif (unsquashedOldIdentity.cache !== unsquashedIdentity.cache) {\n\t\t\tstatementsToReturn.push(\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET CACHE ${unsquashedIdentity.cache};`,\n\t\t\t);\n\t\t}\n\n\t\tif (unsquashedOldIdentity.cycle !== unsquashedIdentity.cycle) {\n\t\t\tstatementsToReturn.push(\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET ${\n\t\t\t\t\tunsquashedIdentity.cycle ? `CYCLE` : 'NO CYCLE'\n\t\t\t\t};`,\n\t\t\t);\n\t\t}\n\n\t\treturn statementsToReturn;\n\t}\n}\n\nclass PgAlterTableAddUniqueConstraintConvertor extends Convertor {\n\tcan(statement: JsonCreateUniqueConstraint, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'create_unique_constraint' && dialect === 'postgresql'\n\t\t);\n\t}\n\tconvert(statement: JsonCreateUniqueConstraint): string {\n\t\tconst unsquashed = PgSquasher.unsquashUnique(statement.data);\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT \"${unsquashed.name}\" UNIQUE${\n\t\t\tunsquashed.nullsNotDistinct ? ' NULLS NOT DISTINCT' : ''\n\t\t}(\"${unsquashed.columns.join('\",\"')}\");`;\n\t}\n}\n\nclass PgAlterTableDropUniqueConstraintConvertor extends Convertor {\n\tcan(statement: JsonDeleteUniqueConstraint, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'delete_unique_constraint' && dialect === 'postgresql'\n\t\t);\n\t}\n\tconvert(statement: JsonDeleteUniqueConstraint): string {\n\t\tconst unsquashed = PgSquasher.unsquashUnique(statement.data);\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} DROP CONSTRAINT \"${unsquashed.name}\";`;\n\t}\n}\n\nclass PgAlterTableAddCheckConstraintConvertor extends Convertor {\n\tcan(statement: JsonCreateCheckConstraint, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'create_check_constraint' && dialect === 'postgresql'\n\t\t);\n\t}\n\tconvert(statement: JsonCreateCheckConstraint): string {\n\t\tconst unsquashed = PgSquasher.unsquashCheck(statement.data);\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT \"${unsquashed.name}\" CHECK (${unsquashed.value});`;\n\t}\n}\n\nclass PgAlterTableDeleteCheckConstraintConvertor extends Convertor {\n\tcan(statement: JsonDeleteCheckConstraint, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'delete_check_constraint' && dialect === 'postgresql'\n\t\t);\n\t}\n\tconvert(statement: JsonDeleteCheckConstraint): string {\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} DROP CONSTRAINT \"${statement.constraintName}\";`;\n\t}\n}\n\nclass MySQLAlterTableAddUniqueConstraintConvertor extends Convertor {\n\tcan(statement: JsonCreateUniqueConstraint, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_unique_constraint' && dialect === 'mysql';\n\t}\n\tconvert(statement: JsonCreateUniqueConstraint): string {\n\t\tconst unsquashed = MySqlSquasher.unsquashUnique(statement.data);\n\n\t\treturn `ALTER TABLE \\`${statement.tableName}\\` ADD CONSTRAINT \\`${unsquashed.name}\\` UNIQUE(\\`${\n\t\t\tunsquashed.columns.join('`,`')\n\t\t}\\`);`;\n\t}\n}\n\nclass MySQLAlterTableDropUniqueConstraintConvertor extends Convertor {\n\tcan(statement: JsonDeleteUniqueConstraint, dialect: Dialect): boolean {\n\t\treturn statement.type === 'delete_unique_constraint' && dialect === 'mysql';\n\t}\n\tconvert(statement: JsonDeleteUniqueConstraint): string {\n\t\tconst unsquashed = MySqlSquasher.unsquashUnique(statement.data);\n\n\t\treturn `ALTER TABLE \\`${statement.tableName}\\` DROP INDEX \\`${unsquashed.name}\\`;`;\n\t}\n}\n\nclass MySqlAlterTableAddCheckConstraintConvertor extends Convertor {\n\tcan(statement: JsonCreateCheckConstraint, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'create_check_constraint' && dialect === 'mysql'\n\t\t);\n\t}\n\tconvert(statement: JsonCreateCheckConstraint): string {\n\t\tconst unsquashed = MySqlSquasher.unsquashCheck(statement.data);\n\t\tconst { tableName } = statement;\n\n\t\treturn `ALTER TABLE \\`${tableName}\\` ADD CONSTRAINT \\`${unsquashed.name}\\` CHECK (${unsquashed.value});`;\n\t}\n}\n\nclass SingleStoreAlterTableAddUniqueConstraintConvertor extends Convertor {\n\tcan(statement: JsonCreateUniqueConstraint, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_unique_constraint' && dialect === 'singlestore';\n\t}\n\tconvert(statement: JsonCreateUniqueConstraint): string {\n\t\tconst unsquashed = SingleStoreSquasher.unsquashUnique(statement.data);\n\n\t\treturn `ALTER TABLE \\`${statement.tableName}\\` ADD CONSTRAINT \\`${unsquashed.name}\\` UNIQUE(\\`${\n\t\t\tunsquashed.columns.join('`,`')\n\t\t}\\`);`;\n\t}\n}\nclass SingleStoreAlterTableDropUniqueConstraintConvertor extends Convertor {\n\tcan(statement: JsonDeleteUniqueConstraint, dialect: Dialect): boolean {\n\t\treturn statement.type === 'delete_unique_constraint' && dialect === 'singlestore';\n\t}\n\tconvert(statement: JsonDeleteUniqueConstraint): string {\n\t\tconst unsquashed = SingleStoreSquasher.unsquashUnique(statement.data);\n\n\t\treturn `ALTER TABLE \\`${statement.tableName}\\` DROP INDEX \\`${unsquashed.name}\\`;`;\n\t}\n}\n\nclass MySqlAlterTableDeleteCheckConstraintConvertor extends Convertor {\n\tcan(statement: JsonDeleteCheckConstraint, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'delete_check_constraint' && dialect === 'mysql'\n\t\t);\n\t}\n\tconvert(statement: JsonDeleteCheckConstraint): string {\n\t\tconst { tableName } = statement;\n\n\t\treturn `ALTER TABLE \\`${tableName}\\` DROP CONSTRAINT \\`${statement.constraintName}\\`;`;\n\t}\n}\n\nclass CreatePgSequenceConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_sequence' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonCreateSequenceStatement) {\n\t\tconst { name, values, schema } = st;\n\n\t\tconst sequenceWithSchema = schema ? `\"${schema}\".\"${name}\"` : `\"${name}\"`;\n\n\t\treturn `CREATE SEQUENCE ${sequenceWithSchema}${values.increment ? ` INCREMENT BY ${values.increment}` : ''}${\n\t\t\tvalues.minValue ? ` MINVALUE ${values.minValue}` : ''\n\t\t}${values.maxValue ? ` MAXVALUE ${values.maxValue}` : ''}${\n\t\t\tvalues.startWith ? ` START WITH ${values.startWith}` : ''\n\t\t}${values.cache ? ` CACHE ${values.cache}` : ''}${values.cycle ? ` CYCLE` : ''};`;\n\t}\n}\n\nclass DropPgSequenceConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_sequence' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonDropSequenceStatement) {\n\t\tconst { name, schema } = st;\n\n\t\tconst sequenceWithSchema = schema ? `\"${schema}\".\"${name}\"` : `\"${name}\"`;\n\n\t\treturn `DROP SEQUENCE ${sequenceWithSchema};`;\n\t}\n}\n\nclass RenamePgSequenceConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'rename_sequence' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonRenameSequenceStatement) {\n\t\tconst { nameFrom, nameTo, schema } = st;\n\n\t\tconst sequenceWithSchemaFrom = schema\n\t\t\t? `\"${schema}\".\"${nameFrom}\"`\n\t\t\t: `\"${nameFrom}\"`;\n\t\tconst sequenceWithSchemaTo = schema\n\t\t\t? `\"${schema}\".\"${nameTo}\"`\n\t\t\t: `\"${nameTo}\"`;\n\n\t\treturn `ALTER SEQUENCE ${sequenceWithSchemaFrom} RENAME TO \"${nameTo}\";`;\n\t}\n}\n\nclass MovePgSequenceConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'move_sequence' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonMoveSequenceStatement) {\n\t\tconst { schemaFrom, schemaTo, name } = st;\n\n\t\tconst sequenceWithSchema = schemaFrom\n\t\t\t? `\"${schemaFrom}\".\"${name}\"`\n\t\t\t: `\"${name}\"`;\n\n\t\tconst seqSchemaTo = schemaTo ? `\"${schemaTo}\"` : `public`;\n\n\t\treturn `ALTER SEQUENCE ${sequenceWithSchema} SET SCHEMA ${seqSchemaTo};`;\n\t}\n}\n\nclass AlterPgSequenceConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_sequence' && dialect === 'postgresql';\n\t}\n\n\tconvert(st: JsonAlterSequenceStatement) {\n\t\tconst { name, schema, values } = st;\n\n\t\tconst { increment, minValue, maxValue, startWith, cache, cycle } = values;\n\n\t\tconst sequenceWithSchema = schema ? `\"${schema}\".\"${name}\"` : `\"${name}\"`;\n\n\t\treturn `ALTER SEQUENCE ${sequenceWithSchema}${increment ? ` INCREMENT BY ${increment}` : ''}${\n\t\t\tminValue ? ` MINVALUE ${minValue}` : ''\n\t\t}${maxValue ? ` MAXVALUE ${maxValue}` : ''}${startWith ? ` START WITH ${startWith}` : ''}${\n\t\t\tcache ? ` CACHE ${cache}` : ''\n\t\t}${cycle ? ` CYCLE` : ''};`;\n\t}\n}\n\nclass CreateTypeEnumConvertor extends Convertor {\n\tcan(statement: JsonStatement): boolean {\n\t\treturn statement.type === 'create_type_enum';\n\t}\n\n\tconvert(st: JsonCreateEnumStatement) {\n\t\tconst { name, values, schema } = st;\n\n\t\tconst enumNameWithSchema = schema ? `\"${schema}\".\"${name}\"` : `\"${name}\"`;\n\n\t\tlet valuesStatement = '(';\n\t\tvaluesStatement += values.map((it) => `'${escapeSingleQuotes(it)}'`).join(', ');\n\t\tvaluesStatement += ')';\n\n\t\t// TODO do we need this?\n\t\t// let statement = 'DO $$ BEGIN';\n\t\t// statement += '\\n';\n\t\tlet statement = `CREATE TYPE ${enumNameWithSchema} AS ENUM${valuesStatement};`;\n\t\t// statement += '\\n';\n\t\t// statement += 'EXCEPTION';\n\t\t// statement += '\\n';\n\t\t// statement += ' WHEN duplicate_object THEN null;';\n\t\t// statement += '\\n';\n\t\t// statement += 'END $$;';\n\t\t// statement += '\\n';\n\t\treturn statement;\n\t}\n}\n\nclass DropTypeEnumConvertor extends Convertor {\n\tcan(statement: JsonStatement): boolean {\n\t\treturn statement.type === 'drop_type_enum';\n\t}\n\n\tconvert(st: JsonDropEnumStatement) {\n\t\tconst { name, schema } = st;\n\n\t\tconst enumNameWithSchema = schema ? `\"${schema}\".\"${name}\"` : `\"${name}\"`;\n\n\t\tlet statement = `DROP TYPE ${enumNameWithSchema};`;\n\n\t\treturn statement;\n\t}\n}\n\nclass AlterTypeAddValueConvertor extends Convertor {\n\tcan(statement: JsonStatement): boolean {\n\t\treturn statement.type === 'alter_type_add_value';\n\t}\n\n\tconvert(st: JsonAddValueToEnumStatement) {\n\t\tconst { name, schema, value, before } = st;\n\n\t\tconst enumNameWithSchema = schema ? `\"${schema}\".\"${name}\"` : `\"${name}\"`;\n\n\t\treturn `ALTER TYPE ${enumNameWithSchema} ADD VALUE '${value}'${before.length ? ` BEFORE '${before}'` : ''};`;\n\t}\n}\n\nclass AlterTypeSetSchemaConvertor extends Convertor {\n\tcan(statement: JsonStatement): boolean {\n\t\treturn statement.type === 'move_type_enum';\n\t}\n\n\tconvert(st: JsonMoveEnumStatement) {\n\t\tconst { name, schemaFrom, schemaTo } = st;\n\n\t\tconst enumNameWithSchema = schemaFrom ? `\"${schemaFrom}\".\"${name}\"` : `\"${name}\"`;\n\n\t\treturn `ALTER TYPE ${enumNameWithSchema} SET SCHEMA \"${schemaTo}\";`;\n\t}\n}\n\nclass AlterRenameTypeConvertor extends Convertor {\n\tcan(statement: JsonStatement): boolean {\n\t\treturn statement.type === 'rename_type_enum';\n\t}\n\n\tconvert(st: JsonRenameEnumStatement) {\n\t\tconst { nameTo, nameFrom, schema } = st;\n\n\t\tconst enumNameWithSchema = schema ? `\"${schema}\".\"${nameFrom}\"` : `\"${nameFrom}\"`;\n\n\t\treturn `ALTER TYPE ${enumNameWithSchema} RENAME TO \"${nameTo}\";`;\n\t}\n}\n\nclass AlterTypeDropValueConvertor extends Convertor {\n\tcan(statement: JsonDropValueFromEnumStatement): boolean {\n\t\treturn statement.type === 'alter_type_drop_value';\n\t}\n\n\tconvert(st: JsonDropValueFromEnumStatement) {\n\t\tconst { columnsWithEnum, name, newValues, enumSchema } = st;\n\n\t\tconst statements: string[] = [];\n\n\t\tfor (const withEnum of columnsWithEnum) {\n\t\t\tconst tableNameWithSchema = withEnum.tableSchema\n\t\t\t\t? `\"${withEnum.tableSchema}\".\"${withEnum.table}\"`\n\t\t\t\t: `\"${withEnum.table}\"`;\n\n\t\t\tstatements.push(\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${withEnum.column}\" SET DATA TYPE text;`,\n\t\t\t);\n\t\t\tif (withEnum.default) {\n\t\t\t\tstatements.push(\n\t\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${withEnum.column}\" SET DEFAULT ${withEnum.default}::text;`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tstatements.push(new DropTypeEnumConvertor().convert({ name: name, schema: enumSchema, type: 'drop_type_enum' }));\n\n\t\tstatements.push(new CreateTypeEnumConvertor().convert({\n\t\t\tname: name,\n\t\t\tschema: enumSchema,\n\t\t\tvalues: newValues,\n\t\t\ttype: 'create_type_enum',\n\t\t}));\n\n\t\tfor (const withEnum of columnsWithEnum) {\n\t\t\tconst tableNameWithSchema = withEnum.tableSchema\n\t\t\t\t? `\"${withEnum.tableSchema}\".\"${withEnum.table}\"`\n\t\t\t\t: `\"${withEnum.table}\"`;\n\n\t\t\tconst parsedType = parseType(`\"${enumSchema}\".`, withEnum.columnType);\n\t\t\tif (withEnum.default) {\n\t\t\t\tstatements.push(\n\t\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${withEnum.column}\" SET DEFAULT ${withEnum.default}::${parsedType};`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tstatements.push(\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${withEnum.column}\" SET DATA TYPE ${parsedType} USING \"${withEnum.column}\"::${parsedType};`,\n\t\t\t);\n\t\t}\n\n\t\treturn statements;\n\t}\n}\n\nclass PgDropTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_table' && dialect === 'postgresql';\n\t}\n\n\tconvert(statement: JsonDropTableStatement, _d: any, action?: string) {\n\t\tconst { tableName, schema, policies } = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\tconst dropPolicyConvertor = new PgDropPolicyConvertor();\n\t\tconst droppedPolicies = policies?.map((p) => {\n\t\t\treturn dropPolicyConvertor.convert({\n\t\t\t\ttype: 'drop_policy',\n\t\t\t\ttableName,\n\t\t\t\tdata: action === 'push'\n\t\t\t\t\t? PgSquasher.unsquashPolicyPush(p)\n\t\t\t\t\t: PgSquasher.unsquashPolicy(p),\n\t\t\t\tschema,\n\t\t\t}) as string;\n\t\t}) ?? [];\n\n\t\treturn [\n\t\t\t...droppedPolicies,\n\t\t\t`DROP TABLE ${tableNameWithSchema} CASCADE;`,\n\t\t];\n\t}\n}\n\nclass MySQLDropTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_table' && dialect === 'mysql';\n\t}\n\n\tconvert(statement: JsonDropTableStatement) {\n\t\tconst { tableName } = statement;\n\t\treturn `DROP TABLE \\`${tableName}\\`;`;\n\t}\n}\n\nexport class SingleStoreDropTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_table' && dialect === 'singlestore';\n\t}\n\n\tconvert(statement: JsonDropTableStatement) {\n\t\tconst { tableName } = statement;\n\t\treturn `DROP TABLE \\`${tableName}\\`;`;\n\t}\n}\n\nexport class SQLiteDropTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_table' && (dialect === 'sqlite' || dialect === 'turso');\n\t}\n\n\tconvert(statement: JsonDropTableStatement) {\n\t\tconst { tableName } = statement;\n\t\treturn `DROP TABLE \\`${tableName}\\`;`;\n\t}\n}\n\nclass PgRenameTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'rename_table' && dialect === 'postgresql';\n\t}\n\n\tconvert(statement: JsonRenameTableStatement) {\n\t\tconst { tableNameFrom, tableNameTo, toSchema, fromSchema } = statement;\n\t\tconst from = fromSchema\n\t\t\t? `\"${fromSchema}\".\"${tableNameFrom}\"`\n\t\t\t: `\"${tableNameFrom}\"`;\n\t\tconst to = `\"${tableNameTo}\"`;\n\t\treturn `ALTER TABLE ${from} RENAME TO ${to};`;\n\t}\n}\n\nexport class SqliteRenameTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'rename_table' && (dialect === 'sqlite' || dialect === 'turso');\n\t}\n\n\tconvert(statement: JsonRenameTableStatement) {\n\t\tconst { tableNameFrom, tableNameTo } = statement;\n\t\treturn `ALTER TABLE \\`${tableNameFrom}\\` RENAME TO \\`${tableNameTo}\\`;`;\n\t}\n}\n\nclass MySqlRenameTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'rename_table' && dialect === 'mysql';\n\t}\n\n\tconvert(statement: JsonRenameTableStatement) {\n\t\tconst { tableNameFrom, tableNameTo } = statement;\n\t\treturn `RENAME TABLE \\`${tableNameFrom}\\` TO \\`${tableNameTo}\\`;`;\n\t}\n}\n\nexport class SingleStoreRenameTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'rename_table' && dialect === 'singlestore';\n\t}\n\n\tconvert(statement: JsonRenameTableStatement) {\n\t\tconst { tableNameFrom, tableNameTo } = statement;\n\t\treturn `ALTER TABLE \\`${tableNameFrom}\\` RENAME TO \\`${tableNameTo}\\`;`;\n\t}\n}\n\nclass PgAlterTableRenameColumnConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_rename_column' && dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonRenameColumnStatement) {\n\t\tconst { tableName, oldColumnName, newColumnName, schema } = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} RENAME COLUMN \"${oldColumnName}\" TO \"${newColumnName}\";`;\n\t}\n}\n\nclass MySqlAlterTableRenameColumnConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_rename_column' && dialect === 'mysql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonRenameColumnStatement) {\n\t\tconst { tableName, oldColumnName, newColumnName } = statement;\n\t\treturn `ALTER TABLE \\`${tableName}\\` RENAME COLUMN \\`${oldColumnName}\\` TO \\`${newColumnName}\\`;`;\n\t}\n}\n\nclass SingleStoreAlterTableRenameColumnConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_rename_column' && dialect === 'singlestore'\n\t\t);\n\t}\n\n\tconvert(statement: JsonRenameColumnStatement) {\n\t\tconst { tableName, oldColumnName, newColumnName } = statement;\n\t\treturn `ALTER TABLE \\`${tableName}\\` CHANGE \\`${oldColumnName}\\` \\`${newColumnName}\\`;`;\n\t}\n}\n\nclass SQLiteAlterTableRenameColumnConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_rename_column' && (dialect === 'sqlite' || dialect === 'turso')\n\t\t);\n\t}\n\n\tconvert(statement: JsonRenameColumnStatement) {\n\t\tconst { tableName, oldColumnName, newColumnName } = statement;\n\t\treturn `ALTER TABLE \\`${tableName}\\` RENAME COLUMN \"${oldColumnName}\" TO \"${newColumnName}\";`;\n\t}\n}\n\nclass PgAlterTableDropColumnConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_drop_column' && dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonDropColumnStatement) {\n\t\tconst { tableName, columnName, schema } = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} DROP COLUMN \"${columnName}\";`;\n\t}\n}\n\nclass MySqlAlterTableDropColumnConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_table_drop_column' && dialect === 'mysql';\n\t}\n\n\tconvert(statement: JsonDropColumnStatement) {\n\t\tconst { tableName, columnName } = statement;\n\t\treturn `ALTER TABLE \\`${tableName}\\` DROP COLUMN \\`${columnName}\\`;`;\n\t}\n}\n\nclass SingleStoreAlterTableDropColumnConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_table_drop_column' && dialect === 'singlestore';\n\t}\n\n\tconvert(statement: JsonDropColumnStatement) {\n\t\tconst { tableName, columnName } = statement;\n\t\treturn `ALTER TABLE \\`${tableName}\\` DROP COLUMN \\`${columnName}\\`;`;\n\t}\n}\n\nclass SQLiteAlterTableDropColumnConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_table_drop_column' && (dialect === 'sqlite' || dialect === 'turso');\n\t}\n\n\tconvert(statement: JsonDropColumnStatement) {\n\t\tconst { tableName, columnName } = statement;\n\t\treturn `ALTER TABLE \\`${tableName}\\` DROP COLUMN \\`${columnName}\\`;`;\n\t}\n}\n\nclass PgAlterTableAddColumnConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_add_column' && dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAddColumnStatement) {\n\t\tconst { tableName, column, schema } = statement;\n\t\tconst { name, type, notNull, generated, primaryKey, identity } = column;\n\n\t\tconst primaryKeyStatement = primaryKey ? ' PRIMARY KEY' : '';\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\tconst defaultStatement = `${column.default !== undefined ? ` DEFAULT ${column.default}` : ''}`;\n\n\t\tconst schemaPrefix = column.typeSchema && column.typeSchema !== 'public'\n\t\t\t? `\"${column.typeSchema}\".`\n\t\t\t: '';\n\n\t\tconst fixedType = parseType(schemaPrefix, column.type);\n\n\t\tconst notNullStatement = `${notNull ? ' NOT NULL' : ''}`;\n\n\t\tconst unsquashedIdentity = identity\n\t\t\t? PgSquasher.unsquashIdentity(identity)\n\t\t\t: undefined;\n\n\t\tconst identityWithSchema = schema\n\t\t\t? `\"${schema}\".\"${unsquashedIdentity?.name}\"`\n\t\t\t: `\"${unsquashedIdentity?.name}\"`;\n\n\t\tconst identityStatement = unsquashedIdentity\n\t\t\t? ` GENERATED ${\n\t\t\t\tunsquashedIdentity.type === 'always' ? 'ALWAYS' : 'BY DEFAULT'\n\t\t\t} AS IDENTITY (sequence name ${identityWithSchema}${\n\t\t\t\tunsquashedIdentity.increment\n\t\t\t\t\t? ` INCREMENT BY ${unsquashedIdentity.increment}`\n\t\t\t\t\t: ''\n\t\t\t}${\n\t\t\t\tunsquashedIdentity.minValue\n\t\t\t\t\t? ` MINVALUE ${unsquashedIdentity.minValue}`\n\t\t\t\t\t: ''\n\t\t\t}${\n\t\t\t\tunsquashedIdentity.maxValue\n\t\t\t\t\t? ` MAXVALUE ${unsquashedIdentity.maxValue}`\n\t\t\t\t\t: ''\n\t\t\t}${\n\t\t\t\tunsquashedIdentity.startWith\n\t\t\t\t\t? ` START WITH ${unsquashedIdentity.startWith}`\n\t\t\t\t\t: ''\n\t\t\t}${unsquashedIdentity.cache ? ` CACHE ${unsquashedIdentity.cache}` : ''}${\n\t\t\t\tunsquashedIdentity.cycle ? ` CYCLE` : ''\n\t\t\t})`\n\t\t\t: '';\n\n\t\tconst generatedStatement = generated ? ` GENERATED ALWAYS AS (${generated?.as}) STORED` : '';\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} ADD COLUMN \"${name}\" ${fixedType}${primaryKeyStatement}${defaultStatement}${generatedStatement}${notNullStatement}${identityStatement};`;\n\t}\n}\n\nclass MySqlAlterTableAddColumnConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_table_add_column' && dialect === 'mysql';\n\t}\n\n\tconvert(statement: JsonAddColumnStatement) {\n\t\tconst { tableName, column } = statement;\n\t\tconst {\n\t\t\tname,\n\t\t\ttype,\n\t\t\tnotNull,\n\t\t\tprimaryKey,\n\t\t\tautoincrement,\n\t\t\tonUpdate,\n\t\t\tgenerated,\n\t\t} = column;\n\n\t\tconst defaultStatement = `${column.default !== undefined ? ` DEFAULT ${column.default}` : ''}`;\n\t\tconst notNullStatement = `${notNull ? ' NOT NULL' : ''}`;\n\t\tconst primaryKeyStatement = `${primaryKey ? ' PRIMARY KEY' : ''}`;\n\t\tconst autoincrementStatement = `${autoincrement ? ' AUTO_INCREMENT' : ''}`;\n\t\tconst onUpdateStatement = `${onUpdate ? ' ON UPDATE CURRENT_TIMESTAMP' : ''}`;\n\n\t\tconst generatedStatement = generated\n\t\t\t? ` GENERATED ALWAYS AS (${generated?.as}) ${generated?.type.toUpperCase()}`\n\t\t\t: '';\n\n\t\treturn `ALTER TABLE \\`${tableName}\\` ADD \\`${name}\\` ${type}${primaryKeyStatement}${autoincrementStatement}${defaultStatement}${generatedStatement}${notNullStatement}${onUpdateStatement};`;\n\t}\n}\n\nclass SingleStoreAlterTableAddColumnConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_table_add_column' && dialect === 'singlestore';\n\t}\n\n\tconvert(statement: JsonAddColumnStatement) {\n\t\tconst { tableName, column } = statement;\n\t\tconst {\n\t\t\tname,\n\t\t\ttype,\n\t\t\tnotNull,\n\t\t\tprimaryKey,\n\t\t\tautoincrement,\n\t\t\tonUpdate,\n\t\t\tgenerated,\n\t\t} = column;\n\n\t\tconst defaultStatement = `${column.default !== undefined ? ` DEFAULT ${column.default}` : ''}`;\n\t\tconst notNullStatement = `${notNull ? ' NOT NULL' : ''}`;\n\t\tconst primaryKeyStatement = `${primaryKey ? ' PRIMARY KEY' : ''}`;\n\t\tconst autoincrementStatement = `${autoincrement ? ' AUTO_INCREMENT' : ''}`;\n\t\tconst onUpdateStatement = `${onUpdate ? ' ON UPDATE CURRENT_TIMESTAMP' : ''}`;\n\n\t\tconst generatedStatement = generated\n\t\t\t? ` GENERATED ALWAYS AS (${generated?.as}) ${generated?.type.toUpperCase()}`\n\t\t\t: '';\n\n\t\treturn `ALTER TABLE \\`${tableName}\\` ADD \\`${name}\\` ${type}${primaryKeyStatement}${autoincrementStatement}${defaultStatement}${notNullStatement}${onUpdateStatement}${generatedStatement};`;\n\t}\n}\n\nexport class SQLiteAlterTableAddColumnConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'sqlite_alter_table_add_column' && (dialect === 'sqlite' || dialect === 'turso')\n\t\t);\n\t}\n\n\tconvert(statement: JsonSqliteAddColumnStatement) {\n\t\tconst { tableName, column, referenceData } = statement;\n\t\tconst { name, type, notNull, primaryKey, generated } = column;\n\n\t\tconst defaultStatement = `${column.default !== undefined ? ` DEFAULT ${column.default}` : ''}`;\n\t\tconst notNullStatement = `${notNull ? ' NOT NULL' : ''}`;\n\t\tconst primaryKeyStatement = `${primaryKey ? ' PRIMARY KEY' : ''}`;\n\t\tconst referenceAsObject = referenceData\n\t\t\t? SQLiteSquasher.unsquashFK(referenceData)\n\t\t\t: undefined;\n\t\tconst referenceStatement = `${\n\t\t\treferenceAsObject\n\t\t\t\t? ` REFERENCES ${referenceAsObject.tableTo}(${referenceAsObject.columnsTo})`\n\t\t\t\t: ''\n\t\t}`;\n\t\t// const autoincrementStatement = `${autoincrement ? 'AUTO_INCREMENT' : ''}`\n\t\tconst generatedStatement = generated\n\t\t\t? ` GENERATED ALWAYS AS ${generated.as} ${generated.type.toUpperCase()}`\n\t\t\t: '';\n\n\t\treturn `ALTER TABLE \\`${tableName}\\` ADD \\`${name}\\` ${type}${primaryKeyStatement}${defaultStatement}${generatedStatement}${notNullStatement}${referenceStatement};`;\n\t}\n}\n\nclass PgAlterTableAlterColumnSetTypeConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'pg_alter_table_alter_column_set_type'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnPgTypeStatement) {\n\t\tconst { tableName, columnName, newDataType, schema, oldDataType, columnDefault, typeSchema } = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\tconst statements: string[] = [];\n\n\t\tconst type = parseType(`\"${typeSchema}\".`, newDataType.name);\n\n\t\tif (!oldDataType.isEnum && !newDataType.isEnum) {\n\t\t\tstatements.push(\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET DATA TYPE ${type};`,\n\t\t\t);\n\t\t\tif (columnDefault) {\n\t\t\t\tstatements.push(\n\t\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET DEFAULT ${columnDefault};`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (oldDataType.isEnum && !newDataType.isEnum) {\n\t\t\tstatements.push(\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET DATA TYPE ${type};`,\n\t\t\t);\n\t\t\tif (columnDefault) {\n\t\t\t\tstatements.push(\n\t\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET DEFAULT ${columnDefault};`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (!oldDataType.isEnum && newDataType.isEnum) {\n\t\t\tif (columnDefault) {\n\t\t\t\tstatements.push(\n\t\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET DEFAULT ${columnDefault}::${type};`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tstatements.push(\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET DATA TYPE ${type} USING \"${columnName}\"::${type};`,\n\t\t\t);\n\t\t}\n\n\t\tif (oldDataType.isEnum && newDataType.isEnum) {\n\t\t\tconst alterType =\n\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET DATA TYPE ${type} USING \"${columnName}\"::text::${type};`;\n\n\t\t\tif (newDataType.name !== oldDataType.name && columnDefault) {\n\t\t\t\tstatements.push(\n\t\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" DROP DEFAULT;`,\n\t\t\t\t\talterType,\n\t\t\t\t\t`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET DEFAULT ${columnDefault};`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tstatements.push(alterType);\n\t\t\t}\n\t\t}\n\n\t\treturn statements;\n\t}\n}\n\nclass PgAlterTableAlterColumnSetDefaultConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_set_default'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnSetDefaultStatement) {\n\t\tconst { tableName, columnName, schema } = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET DEFAULT ${statement.newDefaultValue};`;\n\t}\n}\n\nclass PgAlterTableAlterColumnDropDefaultConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_default'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnDropDefaultStatement) {\n\t\tconst { tableName, columnName, schema } = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" DROP DEFAULT;`;\n\t}\n}\n\nclass PgAlterTableAlterColumnDropGeneratedConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_generated'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnDropGeneratedStatement) {\n\t\tconst { tableName, columnName, schema } = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" DROP EXPRESSION;`;\n\t}\n}\n\nclass PgAlterTableAlterColumnSetExpressionConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_set_generated'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnSetGeneratedStatement) {\n\t\tconst {\n\t\t\ttableName,\n\t\t\tcolumnName,\n\t\t\tschema,\n\t\t\tcolumnNotNull: notNull,\n\t\t\tcolumnDefault,\n\t\t\tcolumnOnUpdate,\n\t\t\tcolumnAutoIncrement,\n\t\t\tcolumnPk,\n\t\t\tcolumnGenerated,\n\t\t} = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\tconst addColumnStatement = new PgAlterTableAddColumnConvertor().convert({\n\t\t\tschema,\n\t\t\ttableName,\n\t\t\tcolumn: {\n\t\t\t\tname: columnName,\n\t\t\t\ttype: statement.newDataType,\n\t\t\t\tnotNull,\n\t\t\t\tdefault: columnDefault,\n\t\t\t\tonUpdate: columnOnUpdate,\n\t\t\t\tautoincrement: columnAutoIncrement,\n\t\t\t\tprimaryKey: columnPk,\n\t\t\t\tgenerated: columnGenerated,\n\t\t\t},\n\t\t\ttype: 'alter_table_add_column',\n\t\t});\n\n\t\treturn [\n\t\t\t`ALTER TABLE ${tableNameWithSchema} drop column \"${columnName}\";`,\n\t\t\taddColumnStatement,\n\t\t];\n\t}\n}\n\nclass PgAlterTableAlterColumnAlterrGeneratedConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_alter_generated'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnAlterGeneratedStatement) {\n\t\tconst {\n\t\t\ttableName,\n\t\t\tcolumnName,\n\t\t\tschema,\n\t\t\tcolumnNotNull: notNull,\n\t\t\tcolumnDefault,\n\t\t\tcolumnOnUpdate,\n\t\t\tcolumnAutoIncrement,\n\t\t\tcolumnPk,\n\t\t\tcolumnGenerated,\n\t\t} = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\tconst addColumnStatement = new PgAlterTableAddColumnConvertor().convert({\n\t\t\tschema,\n\t\t\ttableName,\n\t\t\tcolumn: {\n\t\t\t\tname: columnName,\n\t\t\t\ttype: statement.newDataType,\n\t\t\t\tnotNull,\n\t\t\t\tdefault: columnDefault,\n\t\t\t\tonUpdate: columnOnUpdate,\n\t\t\t\tautoincrement: columnAutoIncrement,\n\t\t\t\tprimaryKey: columnPk,\n\t\t\t\tgenerated: columnGenerated,\n\t\t\t},\n\t\t\ttype: 'alter_table_add_column',\n\t\t});\n\n\t\treturn [\n\t\t\t`ALTER TABLE ${tableNameWithSchema} drop column \"${columnName}\";`,\n\t\t\taddColumnStatement,\n\t\t];\n\t}\n}\n\n////\nclass SqliteAlterTableAlterColumnDropGeneratedConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_generated'\n\t\t\t&& (dialect === 'sqlite' || dialect === 'turso')\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnDropGeneratedStatement) {\n\t\tconst {\n\t\t\ttableName,\n\t\t\tcolumnName,\n\t\t\tschema,\n\t\t\tcolumnDefault,\n\t\t\tcolumnOnUpdate,\n\t\t\tcolumnAutoIncrement,\n\t\t\tcolumnPk,\n\t\t\tcolumnGenerated,\n\t\t\tcolumnNotNull,\n\t\t} = statement;\n\n\t\tconst addColumnStatement = new SQLiteAlterTableAddColumnConvertor().convert(\n\t\t\t{\n\t\t\t\ttableName,\n\t\t\t\tcolumn: {\n\t\t\t\t\tname: columnName,\n\t\t\t\t\ttype: statement.newDataType,\n\t\t\t\t\tnotNull: columnNotNull,\n\t\t\t\t\tdefault: columnDefault,\n\t\t\t\t\tonUpdate: columnOnUpdate,\n\t\t\t\t\tautoincrement: columnAutoIncrement,\n\t\t\t\t\tprimaryKey: columnPk,\n\t\t\t\t\tgenerated: columnGenerated,\n\t\t\t\t},\n\t\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\t},\n\t\t);\n\n\t\tconst dropColumnStatement = new SQLiteAlterTableDropColumnConvertor().convert({\n\t\t\ttableName,\n\t\t\tcolumnName,\n\t\t\tschema,\n\t\t\ttype: 'alter_table_drop_column',\n\t\t});\n\n\t\treturn [dropColumnStatement, addColumnStatement];\n\t}\n}\n\nclass SqliteAlterTableAlterColumnSetExpressionConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_set_generated'\n\t\t\t&& (dialect === 'sqlite' || dialect === 'turso')\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnSetGeneratedStatement) {\n\t\tconst {\n\t\t\ttableName,\n\t\t\tcolumnName,\n\t\t\tschema,\n\t\t\tcolumnNotNull: notNull,\n\t\t\tcolumnDefault,\n\t\t\tcolumnOnUpdate,\n\t\t\tcolumnAutoIncrement,\n\t\t\tcolumnPk,\n\t\t\tcolumnGenerated,\n\t\t} = statement;\n\n\t\tconst addColumnStatement = new SQLiteAlterTableAddColumnConvertor().convert(\n\t\t\t{\n\t\t\t\ttableName,\n\t\t\t\tcolumn: {\n\t\t\t\t\tname: columnName,\n\t\t\t\t\ttype: statement.newDataType,\n\t\t\t\t\tnotNull,\n\t\t\t\t\tdefault: columnDefault,\n\t\t\t\t\tonUpdate: columnOnUpdate,\n\t\t\t\t\tautoincrement: columnAutoIncrement,\n\t\t\t\t\tprimaryKey: columnPk,\n\t\t\t\t\tgenerated: columnGenerated,\n\t\t\t\t},\n\t\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\t},\n\t\t);\n\n\t\tconst dropColumnStatement = new SQLiteAlterTableDropColumnConvertor().convert({\n\t\t\ttableName,\n\t\t\tcolumnName,\n\t\t\tschema,\n\t\t\ttype: 'alter_table_drop_column',\n\t\t});\n\n\t\treturn [dropColumnStatement, addColumnStatement];\n\t}\n}\n\nclass SqliteAlterTableAlterColumnAlterGeneratedConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_alter_generated'\n\t\t\t&& (dialect === 'sqlite' || dialect === 'turso')\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnAlterGeneratedStatement) {\n\t\tconst {\n\t\t\ttableName,\n\t\t\tcolumnName,\n\t\t\tschema,\n\t\t\tcolumnNotNull,\n\t\t\tcolumnDefault,\n\t\t\tcolumnOnUpdate,\n\t\t\tcolumnAutoIncrement,\n\t\t\tcolumnPk,\n\t\t\tcolumnGenerated,\n\t\t} = statement;\n\n\t\tconst addColumnStatement = new SQLiteAlterTableAddColumnConvertor().convert(\n\t\t\t{\n\t\t\t\ttableName,\n\t\t\t\tcolumn: {\n\t\t\t\t\tname: columnName,\n\t\t\t\t\ttype: statement.newDataType,\n\t\t\t\t\tnotNull: columnNotNull,\n\t\t\t\t\tdefault: columnDefault,\n\t\t\t\t\tonUpdate: columnOnUpdate,\n\t\t\t\t\tautoincrement: columnAutoIncrement,\n\t\t\t\t\tprimaryKey: columnPk,\n\t\t\t\t\tgenerated: columnGenerated,\n\t\t\t\t},\n\t\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\t},\n\t\t);\n\n\t\tconst dropColumnStatement = new SQLiteAlterTableDropColumnConvertor().convert({\n\t\t\ttableName,\n\t\t\tcolumnName,\n\t\t\tschema,\n\t\t\ttype: 'alter_table_drop_column',\n\t\t});\n\n\t\treturn [dropColumnStatement, addColumnStatement];\n\t}\n}\n\n////\n\nclass MySqlAlterTableAlterColumnAlterrGeneratedConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_alter_generated'\n\t\t\t&& dialect === 'mysql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnAlterGeneratedStatement) {\n\t\tconst {\n\t\t\ttableName,\n\t\t\tcolumnName,\n\t\t\tschema,\n\t\t\tcolumnNotNull: notNull,\n\t\t\tcolumnDefault,\n\t\t\tcolumnOnUpdate,\n\t\t\tcolumnAutoIncrement,\n\t\t\tcolumnPk,\n\t\t\tcolumnGenerated,\n\t\t} = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\\`${schema}\\`.\\`${tableName}\\``\n\t\t\t: `\\`${tableName}\\``;\n\n\t\tconst addColumnStatement = new MySqlAlterTableAddColumnConvertor().convert({\n\t\t\tschema,\n\t\t\ttableName,\n\t\t\tcolumn: {\n\t\t\t\tname: columnName,\n\t\t\t\ttype: statement.newDataType,\n\t\t\t\tnotNull,\n\t\t\t\tdefault: columnDefault,\n\t\t\t\tonUpdate: columnOnUpdate,\n\t\t\t\tautoincrement: columnAutoIncrement,\n\t\t\t\tprimaryKey: columnPk,\n\t\t\t\tgenerated: columnGenerated,\n\t\t\t},\n\t\t\ttype: 'alter_table_add_column',\n\t\t});\n\n\t\treturn [\n\t\t\t`ALTER TABLE ${tableNameWithSchema} drop column \\`${columnName}\\`;`,\n\t\t\taddColumnStatement,\n\t\t];\n\t}\n}\n\nclass MySqlAlterTableAlterColumnSetDefaultConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_set_default'\n\t\t\t&& dialect === 'mysql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnSetDefaultStatement) {\n\t\tconst { tableName, columnName } = statement;\n\t\treturn `ALTER TABLE \\`${tableName}\\` ALTER COLUMN \\`${columnName}\\` SET DEFAULT ${statement.newDefaultValue};`;\n\t}\n}\n\nclass MySqlAlterTableAlterColumnDropDefaultConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_default'\n\t\t\t&& dialect === 'mysql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnDropDefaultStatement) {\n\t\tconst { tableName, columnName } = statement;\n\t\treturn `ALTER TABLE \\`${tableName}\\` ALTER COLUMN \\`${columnName}\\` DROP DEFAULT;`;\n\t}\n}\n\nclass MySqlAlterTableAddPk extends Convertor {\n\tcan(statement: JsonStatement, dialect: string): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_set_pk'\n\t\t\t&& dialect === 'mysql'\n\t\t);\n\t}\n\tconvert(statement: JsonAlterColumnSetPrimaryKeyStatement): string {\n\t\treturn `ALTER TABLE \\`${statement.tableName}\\` ADD PRIMARY KEY (\\`${statement.columnName}\\`);`;\n\t}\n}\n\nclass MySqlAlterTableDropPk extends Convertor {\n\tcan(statement: JsonStatement, dialect: string): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_pk'\n\t\t\t&& dialect === 'mysql'\n\t\t);\n\t}\n\tconvert(statement: JsonAlterColumnDropPrimaryKeyStatement): string {\n\t\treturn `ALTER TABLE \\`${statement.tableName}\\` DROP PRIMARY KEY`;\n\t}\n}\n\ntype LibSQLModifyColumnStatement =\n\t| JsonAlterColumnTypeStatement\n\t| JsonAlterColumnDropNotNullStatement\n\t| JsonAlterColumnSetNotNullStatement\n\t| JsonAlterColumnSetDefaultStatement\n\t| JsonAlterColumnDropDefaultStatement;\n\nexport class LibSQLModifyColumn extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\t(statement.type === 'alter_table_alter_column_set_type'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_drop_notnull'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_set_notnull'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_set_default'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_drop_default'\n\t\t\t\t|| statement.type === 'create_check_constraint'\n\t\t\t\t|| statement.type === 'delete_check_constraint')\n\t\t\t&& dialect === 'turso'\n\t\t);\n\t}\n\n\tconvert(statement: LibSQLModifyColumnStatement, json2: SQLiteSchemaSquashed) {\n\t\tconst { tableName, columnName } = statement;\n\n\t\tlet columnType = ``;\n\t\tlet columnDefault: any = '';\n\t\tlet columnNotNull = '';\n\n\t\tconst sqlStatements: string[] = [];\n\n\t\t// collect index info\n\t\tconst indexes: {\n\t\t\tname: string;\n\t\t\ttableName: string;\n\t\t\tcolumns: string[];\n\t\t\tisUnique: boolean;\n\t\t\twhere?: string | undefined;\n\t\t}[] = [];\n\t\tfor (const table of Object.values(json2.tables)) {\n\t\t\tfor (const index of Object.values(table.indexes)) {\n\t\t\t\tconst unsquashed = SQLiteSquasher.unsquashIdx(index);\n\t\t\t\tsqlStatements.push(`DROP INDEX \"${unsquashed.name}\";`);\n\t\t\t\tindexes.push({ ...unsquashed, tableName: table.name });\n\t\t\t}\n\t\t}\n\n\t\tswitch (statement.type) {\n\t\t\tcase 'alter_table_alter_column_set_type':\n\t\t\t\tcolumnType = ` ${statement.newDataType}`;\n\n\t\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t\t: '';\n\n\t\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\n\t\t\t\tbreak;\n\t\t\tcase 'alter_table_alter_column_drop_notnull':\n\t\t\t\tcolumnType = ` ${statement.newDataType}`;\n\n\t\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t\t: '';\n\n\t\t\t\tcolumnNotNull = '';\n\t\t\t\tbreak;\n\t\t\tcase 'alter_table_alter_column_set_notnull':\n\t\t\t\tcolumnType = ` ${statement.newDataType}`;\n\n\t\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t\t: '';\n\n\t\t\t\tcolumnNotNull = ` NOT NULL`;\n\t\t\t\tbreak;\n\t\t\tcase 'alter_table_alter_column_set_default':\n\t\t\t\tcolumnType = ` ${statement.newDataType}`;\n\n\t\t\t\tcolumnDefault = ` DEFAULT ${statement.newDefaultValue}`;\n\n\t\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\t\tbreak;\n\t\t\tcase 'alter_table_alter_column_drop_default':\n\t\t\t\tcolumnType = ` ${statement.newDataType}`;\n\n\t\t\t\tcolumnDefault = '';\n\n\t\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Seems like getting value from simple json2 shanpshot makes dates be dates\n\t\tcolumnDefault = columnDefault instanceof Date\n\t\t\t? columnDefault.toISOString()\n\t\t\t: columnDefault;\n\n\t\tsqlStatements.push(\n\t\t\t`ALTER TABLE \\`${tableName}\\` ALTER COLUMN \"${columnName}\" TO \"${columnName}\"${columnType}${columnNotNull}${columnDefault};`,\n\t\t);\n\n\t\tfor (const index of indexes) {\n\t\t\tconst indexPart = index.isUnique ? 'UNIQUE INDEX' : 'INDEX';\n\t\t\tconst whereStatement = index.where ? ` WHERE ${index.where}` : '';\n\t\t\tconst uniqueString = index.columns.map((it) => `\\`${it}\\``).join(',');\n\t\t\tconst tableName = index.tableName;\n\n\t\t\tsqlStatements.push(\n\t\t\t\t`CREATE ${indexPart} \\`${index.name}\\` ON \\`${tableName}\\` (${uniqueString})${whereStatement};`,\n\t\t\t);\n\t\t}\n\n\t\treturn sqlStatements;\n\t}\n}\n\ntype MySqlModifyColumnStatement =\n\t| JsonAlterColumnDropNotNullStatement\n\t| JsonAlterColumnSetNotNullStatement\n\t| JsonAlterColumnTypeStatement\n\t| JsonAlterColumnDropOnUpdateStatement\n\t| JsonAlterColumnSetOnUpdateStatement\n\t| JsonAlterColumnDropAutoincrementStatement\n\t| JsonAlterColumnSetAutoincrementStatement\n\t| JsonAlterColumnSetDefaultStatement\n\t| JsonAlterColumnDropDefaultStatement\n\t| JsonAlterColumnSetGeneratedStatement\n\t| JsonAlterColumnDropGeneratedStatement;\n\nclass MySqlModifyColumn extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\t(statement.type === 'alter_table_alter_column_set_type'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_set_notnull'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_drop_notnull'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_drop_on_update'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_set_on_update'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_set_autoincrement'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_drop_autoincrement'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_set_default'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_drop_default'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_set_generated'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_drop_generated')\n\t\t\t&& dialect === 'mysql'\n\t\t);\n\t}\n\n\tconvert(statement: MySqlModifyColumnStatement) {\n\t\tconst { tableName, columnName } = statement;\n\t\tlet columnType = ``;\n\t\tlet columnDefault: any = '';\n\t\tlet columnNotNull = '';\n\t\tlet columnOnUpdate = '';\n\t\tlet columnAutoincrement = '';\n\t\tlet primaryKey = statement.columnPk ? ' PRIMARY KEY' : '';\n\t\tlet columnGenerated = '';\n\n\t\tif (statement.type === 'alter_table_alter_column_drop_notnull') {\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t} else if (statement.type === 'alter_table_alter_column_set_notnull') {\n\t\t\tcolumnNotNull = ` NOT NULL`;\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t} else if (statement.type === 'alter_table_alter_column_drop_on_update') {\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnOnUpdate = '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t} else if (statement.type === 'alter_table_alter_column_set_on_update') {\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = ` ON UPDATE CURRENT_TIMESTAMP`;\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t} else if (\n\t\t\tstatement.type === 'alter_table_alter_column_set_autoincrement'\n\t\t) {\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = ' AUTO_INCREMENT';\n\t\t} else if (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_autoincrement'\n\t\t) {\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = '';\n\t\t} else if (statement.type === 'alter_table_alter_column_set_default') {\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = ` DEFAULT ${statement.newDefaultValue}`;\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t} else if (statement.type === 'alter_table_alter_column_drop_default') {\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t} else if (statement.type === 'alter_table_alter_column_set_generated') {\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\n\t\t\tif (statement.columnGenerated?.type === 'virtual') {\n\t\t\t\treturn [\n\t\t\t\t\tnew MySqlAlterTableDropColumnConvertor().convert({\n\t\t\t\t\t\ttype: 'alter_table_drop_column',\n\t\t\t\t\t\ttableName: statement.tableName,\n\t\t\t\t\t\tcolumnName: statement.columnName,\n\t\t\t\t\t\tschema: statement.schema,\n\t\t\t\t\t}),\n\t\t\t\t\tnew MySqlAlterTableAddColumnConvertor().convert({\n\t\t\t\t\t\ttableName,\n\t\t\t\t\t\tcolumn: {\n\t\t\t\t\t\t\tname: columnName,\n\t\t\t\t\t\t\ttype: statement.newDataType,\n\t\t\t\t\t\t\tnotNull: statement.columnNotNull,\n\t\t\t\t\t\t\tdefault: statement.columnDefault,\n\t\t\t\t\t\t\tonUpdate: statement.columnOnUpdate,\n\t\t\t\t\t\t\tautoincrement: statement.columnAutoIncrement,\n\t\t\t\t\t\t\tprimaryKey: statement.columnPk,\n\t\t\t\t\t\t\tgenerated: statement.columnGenerated,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tschema: statement.schema,\n\t\t\t\t\t\ttype: 'alter_table_add_column',\n\t\t\t\t\t}),\n\t\t\t\t];\n\t\t\t} else {\n\t\t\t\tcolumnGenerated = statement.columnGenerated\n\t\t\t\t\t? ` GENERATED ALWAYS AS (${statement.columnGenerated?.as}) ${statement.columnGenerated?.type.toUpperCase()}`\n\t\t\t\t\t: '';\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_drop_generated') {\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\n\t\t\tif (statement.oldColumn?.generated?.type === 'virtual') {\n\t\t\t\treturn [\n\t\t\t\t\tnew MySqlAlterTableDropColumnConvertor().convert({\n\t\t\t\t\t\ttype: 'alter_table_drop_column',\n\t\t\t\t\t\ttableName: statement.tableName,\n\t\t\t\t\t\tcolumnName: statement.columnName,\n\t\t\t\t\t\tschema: statement.schema,\n\t\t\t\t\t}),\n\t\t\t\t\tnew MySqlAlterTableAddColumnConvertor().convert({\n\t\t\t\t\t\ttableName,\n\t\t\t\t\t\tcolumn: {\n\t\t\t\t\t\t\tname: columnName,\n\t\t\t\t\t\t\ttype: statement.newDataType,\n\t\t\t\t\t\t\tnotNull: statement.columnNotNull,\n\t\t\t\t\t\t\tdefault: statement.columnDefault,\n\t\t\t\t\t\t\tonUpdate: statement.columnOnUpdate,\n\t\t\t\t\t\t\tautoincrement: statement.columnAutoIncrement,\n\t\t\t\t\t\t\tprimaryKey: statement.columnPk,\n\t\t\t\t\t\t\tgenerated: statement.columnGenerated,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tschema: statement.schema,\n\t\t\t\t\t\ttype: 'alter_table_add_column',\n\t\t\t\t\t}),\n\t\t\t\t];\n\t\t\t}\n\t\t} else {\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t\tcolumnGenerated = statement.columnGenerated\n\t\t\t\t? ` GENERATED ALWAYS AS (${statement.columnGenerated?.as}) ${statement.columnGenerated?.type.toUpperCase()}`\n\t\t\t\t: '';\n\t\t}\n\n\t\t// Seems like getting value from simple json2 shanpshot makes dates be dates\n\t\tcolumnDefault = columnDefault instanceof Date\n\t\t\t? columnDefault.toISOString()\n\t\t\t: columnDefault;\n\n\t\treturn `ALTER TABLE \\`${tableName}\\` MODIFY COLUMN \\`${columnName}\\`${columnType}${columnAutoincrement}${columnGenerated}${columnNotNull}${columnDefault}${columnOnUpdate};`;\n\t}\n}\n\nclass SingleStoreAlterTableAlterColumnAlterrGeneratedConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_alter_generated'\n\t\t\t&& dialect === 'singlestore'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnAlterGeneratedStatement) {\n\t\tconst {\n\t\t\ttableName,\n\t\t\tcolumnName,\n\t\t\tschema,\n\t\t\tcolumnNotNull: notNull,\n\t\t\tcolumnDefault,\n\t\t\tcolumnOnUpdate,\n\t\t\tcolumnAutoIncrement,\n\t\t\tcolumnPk,\n\t\t\tcolumnGenerated,\n\t\t} = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\\`${schema}\\`.\\`${tableName}\\``\n\t\t\t: `\\`${tableName}\\``;\n\n\t\tconst addColumnStatement = new SingleStoreAlterTableAddColumnConvertor().convert({\n\t\t\tschema,\n\t\t\ttableName,\n\t\t\tcolumn: {\n\t\t\t\tname: columnName,\n\t\t\t\ttype: statement.newDataType,\n\t\t\t\tnotNull,\n\t\t\t\tdefault: columnDefault,\n\t\t\t\tonUpdate: columnOnUpdate,\n\t\t\t\tautoincrement: columnAutoIncrement,\n\t\t\t\tprimaryKey: columnPk,\n\t\t\t\tgenerated: columnGenerated,\n\t\t\t},\n\t\t\ttype: 'alter_table_add_column',\n\t\t});\n\n\t\treturn [\n\t\t\t`ALTER TABLE ${tableNameWithSchema} drop column \\`${columnName}\\`;`,\n\t\t\taddColumnStatement,\n\t\t];\n\t}\n}\n\nclass SingleStoreAlterTableAlterColumnSetDefaultConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_set_default'\n\t\t\t&& dialect === 'singlestore'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnSetDefaultStatement) {\n\t\tconst { tableName, columnName } = statement;\n\t\treturn `ALTER TABLE \\`${tableName}\\` ALTER COLUMN \\`${columnName}\\` SET DEFAULT ${statement.newDefaultValue};`;\n\t}\n}\n\nclass SingleStoreAlterTableAlterColumnDropDefaultConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_default'\n\t\t\t&& dialect === 'singlestore'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnDropDefaultStatement) {\n\t\tconst { tableName, columnName } = statement;\n\t\treturn `ALTER TABLE \\`${tableName}\\` ALTER COLUMN \\`${columnName}\\` DROP DEFAULT;`;\n\t}\n}\n\nclass SingleStoreAlterTableAddPk extends Convertor {\n\tcan(statement: JsonStatement, dialect: string): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_set_pk'\n\t\t\t&& dialect === 'singlestore'\n\t\t);\n\t}\n\tconvert(statement: JsonAlterColumnSetPrimaryKeyStatement): string {\n\t\treturn `ALTER TABLE \\`${statement.tableName}\\` ADD PRIMARY KEY (\\`${statement.columnName}\\`);`;\n\t}\n}\n\nclass SingleStoreAlterTableDropPk extends Convertor {\n\tcan(statement: JsonStatement, dialect: string): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_pk'\n\t\t\t&& dialect === 'singlestore'\n\t\t);\n\t}\n\tconvert(statement: JsonAlterColumnDropPrimaryKeyStatement): string {\n\t\treturn `ALTER TABLE \\`${statement.tableName}\\` DROP PRIMARY KEY`;\n\t}\n}\n\ntype SingleStoreModifyColumnStatement =\n\t| JsonAlterColumnDropNotNullStatement\n\t| JsonAlterColumnSetNotNullStatement\n\t| JsonAlterColumnTypeStatement\n\t| JsonAlterColumnDropOnUpdateStatement\n\t| JsonAlterColumnSetOnUpdateStatement\n\t| JsonAlterColumnDropAutoincrementStatement\n\t| JsonAlterColumnSetAutoincrementStatement\n\t| JsonAlterColumnSetDefaultStatement\n\t| JsonAlterColumnDropDefaultStatement\n\t| JsonAlterColumnSetGeneratedStatement\n\t| JsonAlterColumnDropGeneratedStatement;\n\nclass SingleStoreModifyColumn extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\t(statement.type === 'alter_table_alter_column_set_type'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_set_notnull'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_drop_notnull'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_drop_on_update'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_set_on_update'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_set_autoincrement'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_drop_autoincrement'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_set_default'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_drop_default'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_set_generated'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_drop_generated')\n\t\t\t&& dialect === 'singlestore'\n\t\t);\n\t}\n\n\tconvert(statement: SingleStoreModifyColumnStatement) {\n\t\tconst { tableName, columnName } = statement;\n\t\tlet columnType = ``;\n\t\tlet columnDefault: any = '';\n\t\tlet columnNotNull = '';\n\t\tlet columnOnUpdate = '';\n\t\tlet columnAutoincrement = '';\n\t\tlet primaryKey = statement.columnPk ? ' PRIMARY KEY' : '';\n\t\tlet columnGenerated = '';\n\n\t\tif (statement.type === 'alter_table_alter_column_drop_notnull') {\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t} else if (statement.type === 'alter_table_alter_column_set_notnull') {\n\t\t\tcolumnNotNull = ` NOT NULL`;\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t} else if (statement.type === 'alter_table_alter_column_drop_on_update') {\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnOnUpdate = '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t} else if (statement.type === 'alter_table_alter_column_set_on_update') {\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = ` ON UPDATE CURRENT_TIMESTAMP`;\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t} else if (\n\t\t\tstatement.type === 'alter_table_alter_column_set_autoincrement'\n\t\t) {\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = ' AUTO_INCREMENT';\n\t\t} else if (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_autoincrement'\n\t\t) {\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = '';\n\t\t} else if (statement.type === 'alter_table_alter_column_set_default') {\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = ` DEFAULT ${statement.newDefaultValue}`;\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t} else if (statement.type === 'alter_table_alter_column_drop_default') {\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnDefault = '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t} else if (statement.type === 'alter_table_alter_column_set_generated') {\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\n\t\t\tif (statement.columnGenerated?.type === 'virtual') {\n\t\t\t\treturn [\n\t\t\t\t\tnew SingleStoreAlterTableDropColumnConvertor().convert({\n\t\t\t\t\t\ttype: 'alter_table_drop_column',\n\t\t\t\t\t\ttableName: statement.tableName,\n\t\t\t\t\t\tcolumnName: statement.columnName,\n\t\t\t\t\t\tschema: statement.schema,\n\t\t\t\t\t}),\n\t\t\t\t\tnew SingleStoreAlterTableAddColumnConvertor().convert({\n\t\t\t\t\t\ttableName,\n\t\t\t\t\t\tcolumn: {\n\t\t\t\t\t\t\tname: columnName,\n\t\t\t\t\t\t\ttype: statement.newDataType,\n\t\t\t\t\t\t\tnotNull: statement.columnNotNull,\n\t\t\t\t\t\t\tdefault: statement.columnDefault,\n\t\t\t\t\t\t\tonUpdate: statement.columnOnUpdate,\n\t\t\t\t\t\t\tautoincrement: statement.columnAutoIncrement,\n\t\t\t\t\t\t\tprimaryKey: statement.columnPk,\n\t\t\t\t\t\t\tgenerated: statement.columnGenerated,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tschema: statement.schema,\n\t\t\t\t\t\ttype: 'alter_table_add_column',\n\t\t\t\t\t}),\n\t\t\t\t];\n\t\t\t} else {\n\t\t\t\tcolumnGenerated = statement.columnGenerated\n\t\t\t\t\t? ` GENERATED ALWAYS AS (${statement.columnGenerated?.as}) ${statement.columnGenerated?.type.toUpperCase()}`\n\t\t\t\t\t: '';\n\t\t\t}\n\t\t} else if (statement.type === 'alter_table_alter_column_drop_generated') {\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\n\t\t\tif (statement.oldColumn?.generated?.type === 'virtual') {\n\t\t\t\treturn [\n\t\t\t\t\tnew SingleStoreAlterTableDropColumnConvertor().convert({\n\t\t\t\t\t\ttype: 'alter_table_drop_column',\n\t\t\t\t\t\ttableName: statement.tableName,\n\t\t\t\t\t\tcolumnName: statement.columnName,\n\t\t\t\t\t\tschema: statement.schema,\n\t\t\t\t\t}),\n\t\t\t\t\tnew SingleStoreAlterTableAddColumnConvertor().convert({\n\t\t\t\t\t\ttableName,\n\t\t\t\t\t\tcolumn: {\n\t\t\t\t\t\t\tname: columnName,\n\t\t\t\t\t\t\ttype: statement.newDataType,\n\t\t\t\t\t\t\tnotNull: statement.columnNotNull,\n\t\t\t\t\t\t\tdefault: statement.columnDefault,\n\t\t\t\t\t\t\tonUpdate: statement.columnOnUpdate,\n\t\t\t\t\t\t\tautoincrement: statement.columnAutoIncrement,\n\t\t\t\t\t\t\tprimaryKey: statement.columnPk,\n\t\t\t\t\t\t\tgenerated: statement.columnGenerated,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tschema: statement.schema,\n\t\t\t\t\t\ttype: 'alter_table_add_column',\n\t\t\t\t\t}),\n\t\t\t\t];\n\t\t\t}\n\t\t} else {\n\t\t\tcolumnType = ` ${statement.newDataType}`;\n\t\t\tcolumnNotNull = statement.columnNotNull ? ` NOT NULL` : '';\n\t\t\tcolumnOnUpdate = columnOnUpdate = statement.columnOnUpdate\n\t\t\t\t? ` ON UPDATE CURRENT_TIMESTAMP`\n\t\t\t\t: '';\n\t\t\tcolumnDefault = statement.columnDefault\n\t\t\t\t? ` DEFAULT ${statement.columnDefault}`\n\t\t\t\t: '';\n\t\t\tcolumnAutoincrement = statement.columnAutoIncrement\n\t\t\t\t? ' AUTO_INCREMENT'\n\t\t\t\t: '';\n\t\t\tcolumnGenerated = statement.columnGenerated\n\t\t\t\t? ` GENERATED ALWAYS AS (${statement.columnGenerated?.as}) ${statement.columnGenerated?.type.toUpperCase()}`\n\t\t\t\t: '';\n\t\t}\n\n\t\t// Seems like getting value from simple json2 shanpshot makes dates be dates\n\t\tcolumnDefault = columnDefault instanceof Date\n\t\t\t? columnDefault.toISOString()\n\t\t\t: columnDefault;\n\n\t\treturn `ALTER TABLE \\`${tableName}\\` MODIFY COLUMN \\`${columnName}\\`${columnType}${columnAutoincrement}${columnNotNull}${columnDefault}${columnOnUpdate}${columnGenerated};`;\n\t}\n}\nclass SqliteAlterTableAlterColumnDropDefaultConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_default'\n\t\t\t&& dialect === 'sqlite'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnDropDefaultStatement) {\n\t\treturn (\n\t\t\t'/*\\n SQLite does not support \"Drop default from column\" out of the box, we do not generate automatic migration for that, so it has to be done manually'\n\t\t\t+ '\\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php'\n\t\t\t+ '\\n                  https://www.sqlite.org/lang_altertable.html'\n\t\t\t+ '\\n                  https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3'\n\t\t\t+ \"\\n\\n Due to that we don't generate migration automatically and it has to be done manually\"\n\t\t\t+ '\\n*/'\n\t\t);\n\t}\n}\n\nclass PgAlterTableCreateCompositePrimaryKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_composite_pk' && dialect === 'postgresql';\n\t}\n\n\tconvert(statement: JsonCreateCompositePK) {\n\t\tconst { name, columns } = PgSquasher.unsquashPK(statement.data);\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT \"${statement.constraintName}\" PRIMARY KEY(\"${\n\t\t\tcolumns.join('\",\"')\n\t\t}\");`;\n\t}\n}\nclass PgAlterTableDeleteCompositePrimaryKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'delete_composite_pk' && dialect === 'postgresql';\n\t}\n\n\tconvert(statement: JsonDeleteCompositePK) {\n\t\tconst { name, columns } = PgSquasher.unsquashPK(statement.data);\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} DROP CONSTRAINT \"${statement.constraintName}\";`;\n\t}\n}\n\nclass PgAlterTableAlterCompositePrimaryKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_composite_pk' && dialect === 'postgresql';\n\t}\n\n\tconvert(statement: JsonAlterCompositePK) {\n\t\tconst { name, columns } = PgSquasher.unsquashPK(statement.old);\n\t\tconst { name: newName, columns: newColumns } = PgSquasher.unsquashPK(\n\t\t\tstatement.new,\n\t\t);\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} DROP CONSTRAINT \"${statement.oldConstraintName}\";\\n${BREAKPOINT}ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT \"${statement.newConstraintName}\" PRIMARY KEY(\"${\n\t\t\tnewColumns.join('\",\"')\n\t\t}\");`;\n\t}\n}\n\nclass MySqlAlterTableCreateCompositePrimaryKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_composite_pk' && dialect === 'mysql';\n\t}\n\n\tconvert(statement: JsonCreateCompositePK) {\n\t\tconst { name, columns } = MySqlSquasher.unsquashPK(statement.data);\n\t\treturn `ALTER TABLE \\`${statement.tableName}\\` ADD PRIMARY KEY(\\`${columns.join('`,`')}\\`);`;\n\t}\n}\n\nclass MySqlAlterTableDeleteCompositePrimaryKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'delete_composite_pk' && dialect === 'mysql';\n\t}\n\n\tconvert(statement: JsonDeleteCompositePK) {\n\t\tconst { name, columns } = MySqlSquasher.unsquashPK(statement.data);\n\t\treturn `ALTER TABLE \\`${statement.tableName}\\` DROP PRIMARY KEY;`;\n\t}\n}\n\nclass MySqlAlterTableAlterCompositePrimaryKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_composite_pk' && dialect === 'mysql';\n\t}\n\n\tconvert(statement: JsonAlterCompositePK) {\n\t\tconst { name, columns } = MySqlSquasher.unsquashPK(statement.old);\n\t\tconst { name: newName, columns: newColumns } = MySqlSquasher.unsquashPK(\n\t\t\tstatement.new,\n\t\t);\n\t\treturn `ALTER TABLE \\`${statement.tableName}\\` DROP PRIMARY KEY, ADD PRIMARY KEY(\\`${newColumns.join('`,`')}\\`);`;\n\t}\n}\n\nclass SqliteAlterTableCreateCompositePrimaryKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_composite_pk' && dialect === 'sqlite';\n\t}\n\n\tconvert(statement: JsonCreateCompositePK) {\n\t\tlet msg = '/*\\n';\n\t\tmsg += `You're trying to add PRIMARY KEY(${statement.data}) to '${statement.tableName}' table\\n`;\n\t\tmsg += 'SQLite does not support adding primary key to an already created table\\n';\n\t\tmsg += 'You can do it in 3 steps with drizzle orm:\\n';\n\t\tmsg += ' - create new mirror table with needed pk, rename current table to old_table, generate SQL\\n';\n\t\tmsg += ' - migrate old data from one table to another\\n';\n\t\tmsg += ' - delete old_table in schema, generate sql\\n\\n';\n\t\tmsg += 'or create manual migration like below:\\n\\n';\n\t\tmsg += 'ALTER TABLE table_name RENAME TO old_table;\\n';\n\t\tmsg += 'CREATE TABLE table_name (\\n';\n\t\tmsg += '\\tcolumn1 datatype [ NULL | NOT NULL ],\\n';\n\t\tmsg += '\\tcolumn2 datatype [ NULL | NOT NULL ],\\n';\n\t\tmsg += '\\t...\\n';\n\t\tmsg += '\\tPRIMARY KEY (pk_col1, pk_col2, ... pk_col_n)\\n';\n\t\tmsg += ' );\\n';\n\t\tmsg += 'INSERT INTO table_name SELECT * FROM old_table;\\n\\n';\n\t\tmsg += \"Due to that we don't generate migration automatically and it has to be done manually\\n\";\n\t\tmsg += '*/\\n';\n\t\treturn msg;\n\t}\n}\nclass SqliteAlterTableDeleteCompositePrimaryKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'delete_composite_pk' && dialect === 'sqlite';\n\t}\n\n\tconvert(statement: JsonDeleteCompositePK) {\n\t\tlet msg = '/*\\n';\n\t\tmsg += `You're trying to delete PRIMARY KEY(${statement.data}) from '${statement.tableName}' table\\n`;\n\t\tmsg += 'SQLite does not supportprimary key deletion from existing table\\n';\n\t\tmsg += 'You can do it in 3 steps with drizzle orm:\\n';\n\t\tmsg += ' - create new mirror table table without pk, rename current table to old_table, generate SQL\\n';\n\t\tmsg += ' - migrate old data from one table to another\\n';\n\t\tmsg += ' - delete old_table in schema, generate sql\\n\\n';\n\t\tmsg += 'or create manual migration like below:\\n\\n';\n\t\tmsg += 'ALTER TABLE table_name RENAME TO old_table;\\n';\n\t\tmsg += 'CREATE TABLE table_name (\\n';\n\t\tmsg += '\\tcolumn1 datatype [ NULL | NOT NULL ],\\n';\n\t\tmsg += '\\tcolumn2 datatype [ NULL | NOT NULL ],\\n';\n\t\tmsg += '\\t...\\n';\n\t\tmsg += '\\tPRIMARY KEY (pk_col1, pk_col2, ... pk_col_n)\\n';\n\t\tmsg += ' );\\n';\n\t\tmsg += 'INSERT INTO table_name SELECT * FROM old_table;\\n\\n';\n\t\tmsg += \"Due to that we don't generate migration automatically and it has to be done manually\\n\";\n\t\tmsg += '*/\\n';\n\t\treturn msg;\n\t}\n}\n\nclass SqliteAlterTableAlterCompositePrimaryKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_composite_pk' && dialect === 'sqlite';\n\t}\n\n\tconvert(statement: JsonAlterCompositePK) {\n\t\tlet msg = '/*\\n';\n\t\tmsg += 'SQLite does not support altering primary key\\n';\n\t\tmsg += 'You can do it in 3 steps with drizzle orm:\\n';\n\t\tmsg += ' - create new mirror table with needed pk, rename current table to old_table, generate SQL\\n';\n\t\tmsg += ' - migrate old data from one table to another\\n';\n\t\tmsg += ' - delete old_table in schema, generate sql\\n\\n';\n\t\tmsg += 'or create manual migration like below:\\n\\n';\n\t\tmsg += 'ALTER TABLE table_name RENAME TO old_table;\\n';\n\t\tmsg += 'CREATE TABLE table_name (\\n';\n\t\tmsg += '\\tcolumn1 datatype [ NULL | NOT NULL ],\\n';\n\t\tmsg += '\\tcolumn2 datatype [ NULL | NOT NULL ],\\n';\n\t\tmsg += '\\t...\\n';\n\t\tmsg += '\\tPRIMARY KEY (pk_col1, pk_col2, ... pk_col_n)\\n';\n\t\tmsg += ' );\\n';\n\t\tmsg += 'INSERT INTO table_name SELECT * FROM old_table;\\n\\n';\n\t\tmsg += \"Due to that we don't generate migration automatically and it has to be done manually\\n\";\n\t\tmsg += '*/\\n';\n\n\t\treturn msg;\n\t}\n}\n\nclass PgAlterTableAlterColumnSetPrimaryKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_set_pk'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnSetPrimaryKeyStatement) {\n\t\tconst { tableName, columnName } = statement;\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} ADD PRIMARY KEY (\"${columnName}\");`;\n\t}\n}\n\nclass PgAlterTableAlterColumnDropPrimaryKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_pk'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnDropPrimaryKeyStatement) {\n\t\tconst { tableName, columnName, schema } = statement;\n\t\treturn `/* \n    Unfortunately in current drizzle-kit version we can't automatically get name for primary key.\n    We are working on making it available!\n\n    Meanwhile you can:\n        1. Check pk name in your database, by running\n            SELECT constraint_name FROM information_schema.table_constraints\n            WHERE table_schema = '${typeof schema === 'undefined' || schema === '' ? 'public' : schema}'\n                AND table_name = '${tableName}'\n                AND constraint_type = 'PRIMARY KEY';\n        2. Uncomment code below and paste pk name manually\n        \n    Hope to release this update as soon as possible\n*/\n\n-- ALTER TABLE \"${tableName}\" DROP CONSTRAINT \"<constraint_name>\";`;\n\t}\n}\n\nclass PgAlterTableAlterColumnSetNotNullConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_set_notnull'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnSetNotNullStatement) {\n\t\tconst { tableName, columnName } = statement;\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" SET NOT NULL;`;\n\t}\n}\n\nclass PgAlterTableAlterColumnDropNotNullConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_notnull'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterColumnDropNotNullStatement) {\n\t\tconst { tableName, columnName } = statement;\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${columnName}\" DROP NOT NULL;`;\n\t}\n}\n\n// FK\nclass PgCreateForeignKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_reference' && dialect === 'postgresql';\n\t}\n\n\tconvert(statement: JsonCreateReferenceStatement): string {\n\t\tconst {\n\t\t\tname,\n\t\t\ttableFrom,\n\t\t\ttableTo,\n\t\t\tcolumnsFrom,\n\t\t\tcolumnsTo,\n\t\t\tonDelete,\n\t\t\tonUpdate,\n\t\t\tschemaTo,\n\t\t} = PgSquasher.unsquashFK(statement.data);\n\t\tconst onDeleteStatement = onDelete ? ` ON DELETE ${onDelete}` : '';\n\t\tconst onUpdateStatement = onUpdate ? ` ON UPDATE ${onUpdate}` : '';\n\t\tconst fromColumnsString = columnsFrom.map((it) => `\"${it}\"`).join(',');\n\t\tconst toColumnsString = columnsTo.map((it) => `\"${it}\"`).join(',');\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${tableFrom}\"`\n\t\t\t: `\"${tableFrom}\"`;\n\n\t\tconst tableToNameWithSchema = schemaTo\n\t\t\t? `\"${schemaTo}\".\"${tableTo}\"`\n\t\t\t: `\"${tableTo}\"`;\n\n\t\tconst alterStatement =\n\t\t\t`ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT \"${name}\" FOREIGN KEY (${fromColumnsString}) REFERENCES ${tableToNameWithSchema}(${toColumnsString})${onDeleteStatement}${onUpdateStatement};`;\n\n\t\treturn alterStatement;\n\t}\n}\n\nclass LibSQLCreateForeignKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'create_reference'\n\t\t\t&& dialect === 'turso'\n\t\t);\n\t}\n\n\tconvert(\n\t\tstatement: JsonCreateReferenceStatement,\n\t\tjson2?: SQLiteSchemaSquashed,\n\t\taction?: 'push',\n\t): string {\n\t\tconst { columnsFrom, columnsTo, tableFrom, onDelete, onUpdate, tableTo } = action === 'push'\n\t\t\t? SQLiteSquasher.unsquashPushFK(statement.data)\n\t\t\t: SQLiteSquasher.unsquashFK(statement.data);\n\t\tconst { columnDefault, columnNotNull, columnType } = statement;\n\n\t\tconst onDeleteStatement = onDelete ? ` ON DELETE ${onDelete}` : '';\n\t\tconst onUpdateStatement = onUpdate ? ` ON UPDATE ${onUpdate}` : '';\n\t\tconst columnsDefaultValue = columnDefault\n\t\t\t? ` DEFAULT ${columnDefault}`\n\t\t\t: '';\n\t\tconst columnNotNullValue = columnNotNull ? ` NOT NULL` : '';\n\t\tconst columnTypeValue = columnType ? ` ${columnType}` : '';\n\n\t\tconst columnFrom = columnsFrom[0];\n\t\tconst columnTo = columnsTo[0];\n\n\t\treturn `ALTER TABLE \\`${tableFrom}\\` ALTER COLUMN \"${columnFrom}\" TO \"${columnFrom}\"${columnTypeValue}${columnNotNullValue}${columnsDefaultValue} REFERENCES ${tableTo}(${columnTo})${onDeleteStatement}${onUpdateStatement};`;\n\t}\n}\n\nclass MySqlCreateForeignKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_reference' && dialect === 'mysql';\n\t}\n\n\tconvert(statement: JsonCreateReferenceStatement): string {\n\t\tconst {\n\t\t\tname,\n\t\t\ttableFrom,\n\t\t\ttableTo,\n\t\t\tcolumnsFrom,\n\t\t\tcolumnsTo,\n\t\t\tonDelete,\n\t\t\tonUpdate,\n\t\t} = MySqlSquasher.unsquashFK(statement.data);\n\t\tconst onDeleteStatement = onDelete ? ` ON DELETE ${onDelete}` : '';\n\t\tconst onUpdateStatement = onUpdate ? ` ON UPDATE ${onUpdate}` : '';\n\t\tconst fromColumnsString = columnsFrom.map((it) => `\\`${it}\\``).join(',');\n\t\tconst toColumnsString = columnsTo.map((it) => `\\`${it}\\``).join(',');\n\n\t\treturn `ALTER TABLE \\`${tableFrom}\\` ADD CONSTRAINT \\`${name}\\` FOREIGN KEY (${fromColumnsString}) REFERENCES \\`${tableTo}\\`(${toColumnsString})${onDeleteStatement}${onUpdateStatement};`;\n\t}\n}\n\nclass PgAlterForeignKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'alter_reference' && dialect === 'postgresql';\n\t}\n\n\tconvert(statement: JsonAlterReferenceStatement): string {\n\t\tconst newFk = PgSquasher.unsquashFK(statement.data);\n\t\tconst oldFk = PgSquasher.unsquashFK(statement.oldFkey);\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${oldFk.tableFrom}\"`\n\t\t\t: `\"${oldFk.tableFrom}\"`;\n\n\t\tlet sql = `ALTER TABLE ${tableNameWithSchema} DROP CONSTRAINT \"${oldFk.name}\";\\n`;\n\n\t\tconst onDeleteStatement = newFk.onDelete\n\t\t\t? ` ON DELETE ${newFk.onDelete}`\n\t\t\t: '';\n\t\tconst onUpdateStatement = newFk.onUpdate\n\t\t\t? ` ON UPDATE ${newFk.onUpdate}`\n\t\t\t: '';\n\n\t\tconst fromColumnsString = newFk.columnsFrom\n\t\t\t.map((it) => `\"${it}\"`)\n\t\t\t.join(',');\n\t\tconst toColumnsString = newFk.columnsTo.map((it) => `\"${it}\"`).join(',');\n\n\t\tconst tableFromNameWithSchema = oldFk.schemaTo\n\t\t\t? `\"${oldFk.schemaTo}\".\"${oldFk.tableFrom}\"`\n\t\t\t: `\"${oldFk.tableFrom}\"`;\n\n\t\tconst tableToNameWithSchema = newFk.schemaTo\n\t\t\t? `\"${newFk.schemaTo}\".\"${newFk.tableFrom}\"`\n\t\t\t: `\"${newFk.tableFrom}\"`;\n\n\t\tconst alterStatement =\n\t\t\t`ALTER TABLE ${tableFromNameWithSchema} ADD CONSTRAINT \"${newFk.name}\" FOREIGN KEY (${fromColumnsString}) REFERENCES ${tableToNameWithSchema}(${toColumnsString})${onDeleteStatement}${onUpdateStatement};`;\n\n\t\tsql += alterStatement;\n\t\treturn sql;\n\t}\n}\n\nclass PgDeleteForeignKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'delete_reference' && dialect === 'postgresql';\n\t}\n\n\tconvert(statement: JsonDeleteReferenceStatement): string {\n\t\tconst tableFrom = statement.tableName; // delete fk from renamed table case\n\t\tconst { name } = PgSquasher.unsquashFK(statement.data);\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${tableFrom}\"`\n\t\t\t: `\"${tableFrom}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} DROP CONSTRAINT \"${name}\";\\n`;\n\t}\n}\n\nclass MySqlDeleteForeignKeyConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'delete_reference' && dialect === 'mysql';\n\t}\n\n\tconvert(statement: JsonDeleteReferenceStatement): string {\n\t\tconst tableFrom = statement.tableName; // delete fk from renamed table case\n\t\tconst { name } = MySqlSquasher.unsquashFK(statement.data);\n\t\treturn `ALTER TABLE \\`${tableFrom}\\` DROP FOREIGN KEY \\`${name}\\`;\\n`;\n\t}\n}\n\nclass CreatePgIndexConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_index_pg' && dialect === 'postgresql';\n\t}\n\n\tconvert(statement: JsonPgCreateIndexStatement): string {\n\t\tconst {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tisUnique,\n\t\t\tconcurrently,\n\t\t\twith: withMap,\n\t\t\tmethod,\n\t\t\twhere,\n\t\t} = statement.data;\n\t\t// // since postgresql 9.5\n\t\tconst indexPart = isUnique ? 'UNIQUE INDEX' : 'INDEX';\n\t\tconst value = columns\n\t\t\t.map(\n\t\t\t\t(it) =>\n\t\t\t\t\t`${it.isExpression ? it.expression : `\"${it.expression}\"`}${\n\t\t\t\t\t\tit.opclass ? ` ${it.opclass}` : it.asc ? '' : ' DESC'\n\t\t\t\t\t}${\n\t\t\t\t\t\t(it.asc && it.nulls && it.nulls === 'last') || it.opclass\n\t\t\t\t\t\t\t? ''\n\t\t\t\t\t\t\t: ` NULLS ${it.nulls!.toUpperCase()}`\n\t\t\t\t\t}`,\n\t\t\t)\n\t\t\t.join(',');\n\n\t\tconst tableNameWithSchema = statement.schema\n\t\t\t? `\"${statement.schema}\".\"${statement.tableName}\"`\n\t\t\t: `\"${statement.tableName}\"`;\n\n\t\tfunction reverseLogic(mappedWith: Record<string, string>): string {\n\t\t\tlet reversedString = '';\n\t\t\tfor (const key in mappedWith) {\n\t\t\t\tif (mappedWith.hasOwnProperty(key)) {\n\t\t\t\t\treversedString += `${key}=${mappedWith[key]},`;\n\t\t\t\t}\n\t\t\t}\n\t\t\treversedString = reversedString.slice(0, -1);\n\t\t\treturn reversedString;\n\t\t}\n\n\t\treturn `CREATE ${indexPart}${\n\t\t\tconcurrently ? ' CONCURRENTLY' : ''\n\t\t} \"${name}\" ON ${tableNameWithSchema} USING ${method} (${value})${\n\t\t\tObject.keys(withMap!).length !== 0\n\t\t\t\t? ` WITH (${reverseLogic(withMap!)})`\n\t\t\t\t: ''\n\t\t}${where ? ` WHERE ${where}` : ''};`;\n\t}\n}\n\nclass CreateMySqlIndexConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_index' && dialect === 'mysql';\n\t}\n\n\tconvert(statement: JsonCreateIndexStatement): string {\n\t\t// should be changed\n\t\tconst { name, columns, isUnique } = MySqlSquasher.unsquashIdx(\n\t\t\tstatement.data,\n\t\t);\n\t\tconst indexPart = isUnique ? 'UNIQUE INDEX' : 'INDEX';\n\n\t\tconst uniqueString = columns\n\t\t\t.map((it) => {\n\t\t\t\treturn statement.internal?.indexes\n\t\t\t\t\t? statement.internal?.indexes[name]?.columns[it]?.isExpression\n\t\t\t\t\t\t? it\n\t\t\t\t\t\t: `\\`${it}\\``\n\t\t\t\t\t: `\\`${it}\\``;\n\t\t\t})\n\t\t\t.join(',');\n\n\t\treturn `CREATE ${indexPart} \\`${name}\\` ON \\`${statement.tableName}\\` (${uniqueString});`;\n\t}\n}\n\nexport class CreateSingleStoreIndexConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_index' && dialect === 'singlestore';\n\t}\n\n\tconvert(statement: JsonCreateIndexStatement): string {\n\t\t// should be changed\n\t\tconst { name, columns, isUnique } = SingleStoreSquasher.unsquashIdx(\n\t\t\tstatement.data,\n\t\t);\n\t\tconst indexPart = isUnique ? 'UNIQUE INDEX' : 'INDEX';\n\n\t\tconst uniqueString = columns\n\t\t\t.map((it) => {\n\t\t\t\treturn statement.internal?.indexes\n\t\t\t\t\t? statement.internal?.indexes[name]?.columns[it]?.isExpression\n\t\t\t\t\t\t? it\n\t\t\t\t\t\t: `\\`${it}\\``\n\t\t\t\t\t: `\\`${it}\\``;\n\t\t\t})\n\t\t\t.join(',');\n\n\t\treturn `CREATE ${indexPart} \\`${name}\\` ON \\`${statement.tableName}\\` (${uniqueString});`;\n\t}\n}\n\nexport class CreateSqliteIndexConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_index' && (dialect === 'sqlite' || dialect === 'turso');\n\t}\n\n\tconvert(statement: JsonCreateIndexStatement): string {\n\t\t// should be changed\n\t\tconst { name, columns, isUnique, where } = SQLiteSquasher.unsquashIdx(\n\t\t\tstatement.data,\n\t\t);\n\t\t// // since postgresql 9.5\n\t\tconst indexPart = isUnique ? 'UNIQUE INDEX' : 'INDEX';\n\t\tconst whereStatement = where ? ` WHERE ${where}` : '';\n\t\tconst uniqueString = columns\n\t\t\t.map((it) => {\n\t\t\t\treturn statement.internal?.indexes\n\t\t\t\t\t? statement.internal?.indexes[name]?.columns[it]?.isExpression\n\t\t\t\t\t\t? it\n\t\t\t\t\t\t: `\\`${it}\\``\n\t\t\t\t\t: `\\`${it}\\``;\n\t\t\t})\n\t\t\t.join(',');\n\t\treturn `CREATE ${indexPart} \\`${name}\\` ON \\`${statement.tableName}\\` (${uniqueString})${whereStatement};`;\n\t}\n}\n\nclass PgDropIndexConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_index' && dialect === 'postgresql';\n\t}\n\n\tconvert(statement: JsonDropIndexStatement): string {\n\t\tconst { schema } = statement;\n\t\tconst { name } = PgSquasher.unsquashIdx(statement.data);\n\n\t\tconst indexNameWithSchema = schema ? `\"${schema}\".\"${name}\"` : `\"${name}\"`;\n\n\t\treturn `DROP INDEX ${indexNameWithSchema};`;\n\t}\n}\n\nclass PgCreateSchemaConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'create_schema' && dialect === 'postgresql';\n\t}\n\n\tconvert(statement: JsonCreateSchema) {\n\t\tconst { name } = statement;\n\t\treturn `CREATE SCHEMA \"${name}\";\\n`;\n\t}\n}\n\nclass PgRenameSchemaConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'rename_schema' && dialect === 'postgresql';\n\t}\n\n\tconvert(statement: JsonRenameSchema) {\n\t\tconst { from, to } = statement;\n\t\treturn `ALTER SCHEMA \"${from}\" RENAME TO \"${to}\";\\n`;\n\t}\n}\n\nclass PgDropSchemaConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_schema' && dialect === 'postgresql';\n\t}\n\n\tconvert(statement: JsonCreateSchema) {\n\t\tconst { name } = statement;\n\t\treturn `DROP SCHEMA \"${name}\";\\n`;\n\t}\n}\n\nclass PgAlterTableSetSchemaConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_set_schema' && dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterTableSetSchema) {\n\t\tconst { tableName, schemaFrom, schemaTo } = statement;\n\n\t\treturn `ALTER TABLE \"${schemaFrom}\".\"${tableName}\" SET SCHEMA \"${schemaTo}\";\\n`;\n\t}\n}\n\nclass PgAlterTableSetNewSchemaConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_set_new_schema'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterTableSetNewSchema) {\n\t\tconst { tableName, to, from } = statement;\n\n\t\tconst tableNameWithSchema = from\n\t\t\t? `\"${from}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} SET SCHEMA \"${to}\";\\n`;\n\t}\n}\n\nclass PgAlterTableRemoveFromSchemaConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'alter_table_remove_from_schema'\n\t\t\t&& dialect === 'postgresql'\n\t\t);\n\t}\n\n\tconvert(statement: JsonAlterTableRemoveFromSchema) {\n\t\tconst { tableName, schema } = statement;\n\n\t\tconst tableNameWithSchema = schema\n\t\t\t? `\"${schema}\".\"${tableName}\"`\n\t\t\t: `\"${tableName}\"`;\n\n\t\treturn `ALTER TABLE ${tableNameWithSchema} SET SCHEMA public;\\n`;\n\t}\n}\n\nexport class SqliteDropIndexConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_index' && (dialect === 'sqlite' || dialect === 'turso');\n\t}\n\n\tconvert(statement: JsonDropIndexStatement): string {\n\t\tconst { name } = PgSquasher.unsquashIdx(statement.data);\n\t\treturn `DROP INDEX \\`${name}\\`;`;\n\t}\n}\n\nclass MySqlDropIndexConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_index' && dialect === 'mysql';\n\t}\n\n\tconvert(statement: JsonDropIndexStatement): string {\n\t\tconst { name } = MySqlSquasher.unsquashIdx(statement.data);\n\t\treturn `DROP INDEX \\`${name}\\` ON \\`${statement.tableName}\\`;`;\n\t}\n}\n\nclass SingleStoreDropIndexConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn statement.type === 'drop_index' && dialect === 'singlestore';\n\t}\n\n\tconvert(statement: JsonDropIndexStatement): string {\n\t\tconst { name } = SingleStoreSquasher.unsquashIdx(statement.data);\n\t\treturn `DROP INDEX \\`${name}\\` ON \\`${statement.tableName}\\`;`;\n\t}\n}\n\nclass SQLiteRecreateTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'recreate_table' && dialect === 'sqlite'\n\t\t);\n\t}\n\n\tconvert(statement: JsonRecreateTableStatement): string | string[] {\n\t\tconst { tableName, columns, compositePKs, referenceData, checkConstraints } = statement;\n\n\t\tconst columnNames = columns.map((it) => `\"${it.name}\"`).join(', ');\n\t\tconst newTableName = `__new_${tableName}`;\n\n\t\tconst sqlStatements: string[] = [];\n\n\t\tsqlStatements.push(`PRAGMA foreign_keys=OFF;`);\n\n\t\t// map all possible variants\n\t\tconst mappedCheckConstraints: string[] = checkConstraints.map((it) =>\n\t\t\tit.replaceAll(`\"${tableName}\".`, `\"${newTableName}\".`).replaceAll(`\\`${tableName}\\`.`, `\\`${newTableName}\\`.`)\n\t\t\t\t.replaceAll(`${tableName}.`, `${newTableName}.`).replaceAll(`'${tableName}'.`, `'${newTableName}'.`)\n\t\t);\n\n\t\t// create new table\n\t\tsqlStatements.push(\n\t\t\tnew SQLiteCreateTableConvertor().convert({\n\t\t\t\ttype: 'sqlite_create_table',\n\t\t\t\ttableName: newTableName,\n\t\t\t\tcolumns,\n\t\t\t\treferenceData,\n\t\t\t\tcompositePKs,\n\t\t\t\tcheckConstraints: mappedCheckConstraints,\n\t\t\t}),\n\t\t);\n\n\t\t// migrate data\n\t\tsqlStatements.push(\n\t\t\t`INSERT INTO \\`${newTableName}\\`(${columnNames}) SELECT ${columnNames} FROM \\`${tableName}\\`;`,\n\t\t);\n\n\t\t// drop table\n\t\tsqlStatements.push(\n\t\t\tnew SQLiteDropTableConvertor().convert({\n\t\t\t\ttype: 'drop_table',\n\t\t\t\ttableName: tableName,\n\t\t\t\tschema: '',\n\t\t\t}),\n\t\t);\n\n\t\t// rename table\n\t\tsqlStatements.push(\n\t\t\tnew SqliteRenameTableConvertor().convert({\n\t\t\t\tfromSchema: '',\n\t\t\t\ttableNameFrom: newTableName,\n\t\t\t\ttableNameTo: tableName,\n\t\t\t\ttoSchema: '',\n\t\t\t\ttype: 'rename_table',\n\t\t\t}),\n\t\t);\n\n\t\tsqlStatements.push(`PRAGMA foreign_keys=ON;`);\n\n\t\treturn sqlStatements;\n\t}\n}\n\nclass LibSQLRecreateTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'recreate_table'\n\t\t\t&& dialect === 'turso'\n\t\t);\n\t}\n\n\tconvert(statement: JsonRecreateTableStatement): string[] {\n\t\tconst { tableName, columns, compositePKs, referenceData, checkConstraints } = statement;\n\n\t\tconst columnNames = columns.map((it) => `\"${it.name}\"`).join(', ');\n\t\tconst newTableName = `__new_${tableName}`;\n\n\t\tconst sqlStatements: string[] = [];\n\n\t\tconst mappedCheckConstraints: string[] = checkConstraints.map((it) =>\n\t\t\tit.replaceAll(`\"${tableName}\".`, `\"${newTableName}\".`).replaceAll(`\\`${tableName}\\`.`, `\\`${newTableName}\\`.`)\n\t\t\t\t.replaceAll(`${tableName}.`, `${newTableName}.`).replaceAll(`'${tableName}'.`, `\\`${newTableName}\\`.`)\n\t\t);\n\n\t\tsqlStatements.push(`PRAGMA foreign_keys=OFF;`);\n\n\t\t// create new table\n\t\tsqlStatements.push(\n\t\t\tnew SQLiteCreateTableConvertor().convert({\n\t\t\t\ttype: 'sqlite_create_table',\n\t\t\t\ttableName: newTableName,\n\t\t\t\tcolumns,\n\t\t\t\treferenceData,\n\t\t\t\tcompositePKs,\n\t\t\t\tcheckConstraints: mappedCheckConstraints,\n\t\t\t}),\n\t\t);\n\n\t\t// migrate data\n\t\tsqlStatements.push(\n\t\t\t`INSERT INTO \\`${newTableName}\\`(${columnNames}) SELECT ${columnNames} FROM \\`${tableName}\\`;`,\n\t\t);\n\n\t\t// drop table\n\t\tsqlStatements.push(\n\t\t\tnew SQLiteDropTableConvertor().convert({\n\t\t\t\ttype: 'drop_table',\n\t\t\t\ttableName: tableName,\n\t\t\t\tschema: '',\n\t\t\t}),\n\t\t);\n\n\t\t// rename table\n\t\tsqlStatements.push(\n\t\t\tnew SqliteRenameTableConvertor().convert({\n\t\t\t\tfromSchema: '',\n\t\t\t\ttableNameFrom: newTableName,\n\t\t\t\ttableNameTo: tableName,\n\t\t\t\ttoSchema: '',\n\t\t\t\ttype: 'rename_table',\n\t\t\t}),\n\t\t);\n\n\t\tsqlStatements.push(`PRAGMA foreign_keys=ON;`);\n\n\t\treturn sqlStatements;\n\t}\n}\n\nclass SingleStoreRecreateTableConvertor extends Convertor {\n\tcan(statement: JsonStatement, dialect: Dialect): boolean {\n\t\treturn (\n\t\t\tstatement.type === 'singlestore_recreate_table'\n\t\t\t&& dialect === 'singlestore'\n\t\t);\n\t}\n\n\tconvert(statement: JsonRecreateSingleStoreTableStatement): string[] {\n\t\tconst { tableName, columns, compositePKs, uniqueConstraints } = statement;\n\n\t\tconst columnNames = columns.map((it) => `\\`${it.name}\\``).join(', ');\n\t\tconst newTableName = `__new_${tableName}`;\n\n\t\tconst sqlStatements: string[] = [];\n\n\t\t// create new table\n\t\tsqlStatements.push(\n\t\t\tnew SingleStoreCreateTableConvertor().convert({\n\t\t\t\ttype: 'create_table',\n\t\t\t\ttableName: newTableName,\n\t\t\t\tcolumns,\n\t\t\t\tcompositePKs,\n\t\t\t\tuniqueConstraints,\n\t\t\t\tschema: '',\n\t\t\t}),\n\t\t);\n\n\t\t// migrate data\n\t\tsqlStatements.push(\n\t\t\t`INSERT INTO \\`${newTableName}\\`(${columnNames}) SELECT ${columnNames} FROM \\`${tableName}\\`;`,\n\t\t);\n\n\t\t// drop table\n\t\tsqlStatements.push(\n\t\t\tnew SingleStoreDropTableConvertor().convert({\n\t\t\t\ttype: 'drop_table',\n\t\t\t\ttableName: tableName,\n\t\t\t\tschema: '',\n\t\t\t}),\n\t\t);\n\n\t\t// rename table\n\t\tsqlStatements.push(\n\t\t\tnew SingleStoreRenameTableConvertor().convert({\n\t\t\t\tfromSchema: '',\n\t\t\t\ttableNameFrom: newTableName,\n\t\t\t\ttableNameTo: tableName,\n\t\t\t\ttoSchema: '',\n\t\t\t\ttype: 'rename_table',\n\t\t\t}),\n\t\t);\n\n\t\treturn sqlStatements;\n\t}\n}\n\nconst convertors: Convertor[] = [];\nconvertors.push(new PgCreateTableConvertor());\nconvertors.push(new MySqlCreateTableConvertor());\nconvertors.push(new SingleStoreCreateTableConvertor());\nconvertors.push(new SingleStoreRecreateTableConvertor());\nconvertors.push(new SQLiteCreateTableConvertor());\nconvertors.push(new SQLiteRecreateTableConvertor());\nconvertors.push(new LibSQLRecreateTableConvertor());\n\nconvertors.push(new PgCreateViewConvertor());\nconvertors.push(new PgDropViewConvertor());\nconvertors.push(new PgRenameViewConvertor());\nconvertors.push(new PgAlterViewSchemaConvertor());\nconvertors.push(new PgAlterViewAddWithOptionConvertor());\nconvertors.push(new PgAlterViewDropWithOptionConvertor());\nconvertors.push(new PgAlterViewAlterTablespaceConvertor());\nconvertors.push(new PgAlterViewAlterUsingConvertor());\n\nconvertors.push(new MySqlCreateViewConvertor());\nconvertors.push(new MySqlDropViewConvertor());\nconvertors.push(new MySqlRenameViewConvertor());\nconvertors.push(new MySqlAlterViewConvertor());\n\nconvertors.push(new SqliteCreateViewConvertor());\nconvertors.push(new SqliteDropViewConvertor());\n\nconvertors.push(new CreateTypeEnumConvertor());\nconvertors.push(new DropTypeEnumConvertor());\nconvertors.push(new AlterTypeAddValueConvertor());\nconvertors.push(new AlterTypeSetSchemaConvertor());\nconvertors.push(new AlterRenameTypeConvertor());\nconvertors.push(new AlterTypeDropValueConvertor());\n\nconvertors.push(new CreatePgSequenceConvertor());\nconvertors.push(new DropPgSequenceConvertor());\nconvertors.push(new RenamePgSequenceConvertor());\nconvertors.push(new MovePgSequenceConvertor());\nconvertors.push(new AlterPgSequenceConvertor());\n\nconvertors.push(new PgDropTableConvertor());\nconvertors.push(new MySQLDropTableConvertor());\nconvertors.push(new SingleStoreDropTableConvertor());\nconvertors.push(new SQLiteDropTableConvertor());\n\nconvertors.push(new PgRenameTableConvertor());\nconvertors.push(new MySqlRenameTableConvertor());\nconvertors.push(new SingleStoreRenameTableConvertor());\nconvertors.push(new SqliteRenameTableConvertor());\n\nconvertors.push(new PgAlterTableRenameColumnConvertor());\nconvertors.push(new MySqlAlterTableRenameColumnConvertor());\nconvertors.push(new SingleStoreAlterTableRenameColumnConvertor());\nconvertors.push(new SQLiteAlterTableRenameColumnConvertor());\n\nconvertors.push(new PgAlterTableDropColumnConvertor());\nconvertors.push(new MySqlAlterTableDropColumnConvertor());\nconvertors.push(new SingleStoreAlterTableDropColumnConvertor());\nconvertors.push(new SQLiteAlterTableDropColumnConvertor());\n\nconvertors.push(new PgAlterTableAddColumnConvertor());\nconvertors.push(new MySqlAlterTableAddColumnConvertor());\nconvertors.push(new SingleStoreAlterTableAddColumnConvertor());\nconvertors.push(new SQLiteAlterTableAddColumnConvertor());\n\nconvertors.push(new PgAlterTableAlterColumnSetTypeConvertor());\n\nconvertors.push(new PgAlterTableAddUniqueConstraintConvertor());\nconvertors.push(new PgAlterTableDropUniqueConstraintConvertor());\n\nconvertors.push(new PgAlterTableAddCheckConstraintConvertor());\nconvertors.push(new PgAlterTableDeleteCheckConstraintConvertor());\nconvertors.push(new MySqlAlterTableAddCheckConstraintConvertor());\nconvertors.push(new MySqlAlterTableDeleteCheckConstraintConvertor());\n\nconvertors.push(new MySQLAlterTableAddUniqueConstraintConvertor());\nconvertors.push(new MySQLAlterTableDropUniqueConstraintConvertor());\n\nconvertors.push(new SingleStoreAlterTableAddUniqueConstraintConvertor());\nconvertors.push(new SingleStoreAlterTableDropUniqueConstraintConvertor());\n\nconvertors.push(new CreatePgIndexConvertor());\nconvertors.push(new CreateMySqlIndexConvertor());\nconvertors.push(new CreateSingleStoreIndexConvertor());\nconvertors.push(new CreateSqliteIndexConvertor());\n\nconvertors.push(new PgDropIndexConvertor());\nconvertors.push(new SqliteDropIndexConvertor());\nconvertors.push(new MySqlDropIndexConvertor());\nconvertors.push(new SingleStoreDropIndexConvertor());\n\nconvertors.push(new PgAlterTableAlterColumnSetPrimaryKeyConvertor());\nconvertors.push(new PgAlterTableAlterColumnDropPrimaryKeyConvertor());\nconvertors.push(new PgAlterTableAlterColumnSetNotNullConvertor());\nconvertors.push(new PgAlterTableAlterColumnDropNotNullConvertor());\nconvertors.push(new PgAlterTableAlterColumnSetDefaultConvertor());\nconvertors.push(new PgAlterTableAlterColumnDropDefaultConvertor());\n\nconvertors.push(new PgAlterPolicyConvertor());\nconvertors.push(new PgCreatePolicyConvertor());\nconvertors.push(new PgDropPolicyConvertor());\nconvertors.push(new PgRenamePolicyConvertor());\n\nconvertors.push(new PgAlterIndPolicyConvertor());\nconvertors.push(new PgCreateIndPolicyConvertor());\nconvertors.push(new PgDropIndPolicyConvertor());\nconvertors.push(new PgRenameIndPolicyConvertor());\n\nconvertors.push(new PgEnableRlsConvertor());\nconvertors.push(new PgDisableRlsConvertor());\n\nconvertors.push(new PgDropRoleConvertor());\nconvertors.push(new PgAlterRoleConvertor());\nconvertors.push(new PgCreateRoleConvertor());\nconvertors.push(new PgRenameRoleConvertor());\n\n/// generated\nconvertors.push(new PgAlterTableAlterColumnSetExpressionConvertor());\nconvertors.push(new PgAlterTableAlterColumnDropGeneratedConvertor());\nconvertors.push(new PgAlterTableAlterColumnAlterrGeneratedConvertor());\n\nconvertors.push(new MySqlAlterTableAlterColumnAlterrGeneratedConvertor());\n\nconvertors.push(new SingleStoreAlterTableAlterColumnAlterrGeneratedConvertor());\n\nconvertors.push(new SqliteAlterTableAlterColumnDropGeneratedConvertor());\nconvertors.push(new SqliteAlterTableAlterColumnAlterGeneratedConvertor());\nconvertors.push(new SqliteAlterTableAlterColumnSetExpressionConvertor());\n\nconvertors.push(new MySqlModifyColumn());\nconvertors.push(new LibSQLModifyColumn());\n// convertors.push(new MySqlAlterTableAlterColumnSetDefaultConvertor());\n// convertors.push(new MySqlAlterTableAlterColumnDropDefaultConvertor());\n\nconvertors.push(new SingleStoreModifyColumn());\n\nconvertors.push(new PgCreateForeignKeyConvertor());\nconvertors.push(new MySqlCreateForeignKeyConvertor());\n\nconvertors.push(new PgAlterForeignKeyConvertor());\n\nconvertors.push(new PgDeleteForeignKeyConvertor());\nconvertors.push(new MySqlDeleteForeignKeyConvertor());\n\nconvertors.push(new PgCreateSchemaConvertor());\nconvertors.push(new PgRenameSchemaConvertor());\nconvertors.push(new PgDropSchemaConvertor());\nconvertors.push(new PgAlterTableSetSchemaConvertor());\nconvertors.push(new PgAlterTableSetNewSchemaConvertor());\nconvertors.push(new PgAlterTableRemoveFromSchemaConvertor());\n\nconvertors.push(new LibSQLCreateForeignKeyConvertor());\n\nconvertors.push(new PgAlterTableAlterColumnDropGenerated());\nconvertors.push(new PgAlterTableAlterColumnSetGenerated());\nconvertors.push(new PgAlterTableAlterColumnAlterGenerated());\n\nconvertors.push(new PgAlterTableCreateCompositePrimaryKeyConvertor());\nconvertors.push(new PgAlterTableDeleteCompositePrimaryKeyConvertor());\nconvertors.push(new PgAlterTableAlterCompositePrimaryKeyConvertor());\n\nconvertors.push(new MySqlAlterTableDeleteCompositePrimaryKeyConvertor());\nconvertors.push(new MySqlAlterTableDropPk());\nconvertors.push(new MySqlAlterTableCreateCompositePrimaryKeyConvertor());\nconvertors.push(new MySqlAlterTableAddPk());\nconvertors.push(new MySqlAlterTableAlterCompositePrimaryKeyConvertor());\n\nconvertors.push(new SingleStoreAlterTableDropPk());\nconvertors.push(new SingleStoreAlterTableAddPk());\n\nexport function fromJson(\n\tstatements: JsonStatement[],\n\tdialect: Dialect,\n\taction?: 'push',\n\tjson2?: SQLiteSchemaSquashed,\n) {\n\tconst result = statements\n\t\t.flatMap((statement) => {\n\t\t\tconst filtered = convertors.filter((it) => {\n\t\t\t\treturn it.can(statement, dialect);\n\t\t\t});\n\n\t\t\tconst convertor = filtered.length === 1 ? filtered[0] : undefined;\n\n\t\t\tif (!convertor) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\treturn convertor.convert(statement, json2, action);\n\t\t})\n\t\t.filter((it) => it !== '');\n\treturn result;\n}\n\n// blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/\n// test case for enum altering\nhttps: `\ncreate table users (\n\tid int,\n    name character varying(128)\n);\n\ncreate type venum as enum('one', 'two', 'three');\nalter table users add column typed venum;\n\ninsert into users(id, name, typed) values (1, 'name1', 'one');\ninsert into users(id, name, typed) values (2, 'name2', 'two');\ninsert into users(id, name, typed) values (3, 'name3', 'three');\n\nalter type venum rename to __venum;\ncreate type venum as enum ('one', 'two', 'three', 'four', 'five');\n\nALTER TABLE users ALTER COLUMN typed TYPE venum USING typed::text::venum;\n\ninsert into users(id, name, typed) values (4, 'name4', 'four');\ninsert into users(id, name, typed) values (5, 'name5', 'five');\n\ndrop type __venum;\n`;\n"
  },
  {
    "path": "drizzle-kit/src/statementCombiner.ts",
    "content": "import {\n\tJsonCreateIndexStatement,\n\tJsonRecreateTableStatement,\n\tJsonStatement,\n\tprepareCreateIndexesJson,\n} from './jsonStatements';\nimport { SingleStoreSchemaSquashed } from './serializer/singlestoreSchema';\nimport { SQLiteSchemaSquashed, SQLiteSquasher } from './serializer/sqliteSchema';\n\nexport const prepareLibSQLRecreateTable = (\n\ttable: SQLiteSchemaSquashed['tables'][keyof SQLiteSchemaSquashed['tables']],\n\taction?: 'push',\n): (JsonRecreateTableStatement | JsonCreateIndexStatement)[] => {\n\tconst { name, columns, uniqueConstraints, indexes, checkConstraints } = table;\n\n\tconst composites: string[][] = Object.values(table.compositePrimaryKeys).map(\n\t\t(it) => SQLiteSquasher.unsquashPK(it),\n\t);\n\n\tconst references: string[] = Object.values(table.foreignKeys);\n\tconst fks = references.map((it) =>\n\t\taction === 'push' ? SQLiteSquasher.unsquashPushFK(it) : SQLiteSquasher.unsquashFK(it)\n\t);\n\n\tconst statements: (JsonRecreateTableStatement | JsonCreateIndexStatement)[] = [\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\ttableName: name,\n\t\t\tcolumns: Object.values(columns),\n\t\t\tcompositePKs: composites,\n\t\t\treferenceData: fks,\n\t\t\tuniqueConstraints: Object.values(uniqueConstraints),\n\t\t\tcheckConstraints: Object.values(checkConstraints),\n\t\t},\n\t];\n\n\tif (Object.keys(indexes).length) {\n\t\tstatements.push(...prepareCreateIndexesJson(name, '', indexes));\n\t}\n\treturn statements;\n};\n\nexport const prepareSQLiteRecreateTable = (\n\ttable: SQLiteSchemaSquashed['tables'][keyof SQLiteSchemaSquashed['tables']],\n\taction?: 'push',\n): JsonStatement[] => {\n\tconst { name, columns, uniqueConstraints, indexes, checkConstraints } = table;\n\n\tconst composites: string[][] = Object.values(table.compositePrimaryKeys).map(\n\t\t(it) => SQLiteSquasher.unsquashPK(it),\n\t);\n\n\tconst references: string[] = Object.values(table.foreignKeys);\n\tconst fks = references.map((it) =>\n\t\taction === 'push' ? SQLiteSquasher.unsquashPushFK(it) : SQLiteSquasher.unsquashFK(it)\n\t);\n\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\ttableName: name,\n\t\t\tcolumns: Object.values(columns),\n\t\t\tcompositePKs: composites,\n\t\t\treferenceData: fks,\n\t\t\tuniqueConstraints: Object.values(uniqueConstraints),\n\t\t\tcheckConstraints: Object.values(checkConstraints),\n\t\t},\n\t];\n\n\tif (Object.keys(indexes).length) {\n\t\tstatements.push(...prepareCreateIndexesJson(name, '', indexes));\n\t}\n\treturn statements;\n};\n\nexport const libSQLCombineStatements = (\n\tstatements: JsonStatement[],\n\tjson2: SQLiteSchemaSquashed,\n\taction?: 'push',\n) => {\n\t// const tablesContext: Record<string, string[]> = {};\n\tconst newStatements: Record<string, JsonStatement[]> = {};\n\tfor (const statement of statements) {\n\t\tif (\n\t\t\tstatement.type === 'alter_table_alter_column_drop_autoincrement'\n\t\t\t|| statement.type === 'alter_table_alter_column_set_autoincrement'\n\t\t\t|| statement.type === 'alter_table_alter_column_drop_pk'\n\t\t\t|| statement.type === 'alter_table_alter_column_set_pk'\n\t\t\t|| statement.type === 'create_composite_pk'\n\t\t\t|| statement.type === 'alter_composite_pk'\n\t\t\t|| statement.type === 'delete_composite_pk'\n\t\t\t|| statement.type === 'create_check_constraint'\n\t\t\t|| statement.type === 'delete_check_constraint'\n\t\t) {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tconst statementsForTable = newStatements[tableName];\n\n\t\t\tif (!statementsForTable) {\n\t\t\t\tnewStatements[tableName] = prepareLibSQLRecreateTable(json2.tables[tableName], action);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\t\tconst wasRename = statementsForTable.some(({ type }) => type === 'rename_table');\n\t\t\t\tconst preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName], action);\n\n\t\t\t\tif (wasRename) {\n\t\t\t\t\tnewStatements[tableName].push(...preparedStatements);\n\t\t\t\t} else {\n\t\t\t\t\tnewStatements[tableName] = preparedStatements;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (\n\t\t\tstatement.type === 'alter_table_alter_column_set_type'\n\t\t\t|| statement.type === 'alter_table_alter_column_drop_notnull'\n\t\t\t|| statement.type === 'alter_table_alter_column_set_notnull'\n\t\t\t|| statement.type === 'alter_table_alter_column_set_default'\n\t\t\t|| statement.type === 'alter_table_alter_column_drop_default'\n\t\t) {\n\t\t\tconst { tableName, columnName, columnPk } = statement;\n\n\t\t\tconst columnIsPartOfForeignKey = Object.values(\n\t\t\t\tjson2.tables[tableName].foreignKeys,\n\t\t\t).some((it) => {\n\t\t\t\tconst unsquashFk = action === 'push' ? SQLiteSquasher.unsquashPushFK(it) : SQLiteSquasher.unsquashFK(it);\n\n\t\t\t\treturn (\n\t\t\t\t\tunsquashFk.columnsFrom.includes(columnName)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tconst statementsForTable = newStatements[tableName];\n\n\t\t\tif (\n\t\t\t\t!statementsForTable && (columnIsPartOfForeignKey || columnPk)\n\t\t\t) {\n\t\t\t\tnewStatements[tableName] = prepareLibSQLRecreateTable(json2.tables[tableName], action);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tstatementsForTable && (columnIsPartOfForeignKey || columnPk)\n\t\t\t) {\n\t\t\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\t\t\tconst wasRename = statementsForTable.some(({ type }) => type === 'rename_table');\n\t\t\t\t\tconst preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName], action);\n\n\t\t\t\t\tif (wasRename) {\n\t\t\t\t\t\tnewStatements[tableName].push(...preparedStatements);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewStatements[tableName] = preparedStatements;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tstatementsForTable && !(columnIsPartOfForeignKey || columnPk)\n\t\t\t) {\n\t\t\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\t\t\tnewStatements[tableName].push(statement);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnewStatements[tableName] = [statement];\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (statement.type === 'create_reference') {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tconst data = action === 'push'\n\t\t\t\t? SQLiteSquasher.unsquashPushFK(statement.data)\n\t\t\t\t: SQLiteSquasher.unsquashFK(statement.data);\n\n\t\t\tconst statementsForTable = newStatements[tableName];\n\n\t\t\tif (!statementsForTable) {\n\t\t\t\tnewStatements[tableName] = statement.isMulticolumn\n\t\t\t\t\t? prepareLibSQLRecreateTable(json2.tables[tableName], action)\n\t\t\t\t\t: [statement];\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// if add column with reference -> skip create_reference statement\n\t\t\tif (\n\t\t\t\t!statement.isMulticolumn\n\t\t\t\t&& statementsForTable.some((st) =>\n\t\t\t\t\tst.type === 'sqlite_alter_table_add_column' && st.column.name === data.columnsFrom[0]\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (statement.isMulticolumn) {\n\t\t\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\t\t\tconst wasRename = statementsForTable.some(({ type }) => type === 'rename_table');\n\t\t\t\t\tconst preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName], action);\n\n\t\t\t\t\tif (wasRename) {\n\t\t\t\t\t\tnewStatements[tableName].push(...preparedStatements);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewStatements[tableName] = preparedStatements;\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\t\tnewStatements[tableName].push(statement);\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (statement.type === 'delete_reference') {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tconst statementsForTable = newStatements[tableName];\n\n\t\t\tif (!statementsForTable) {\n\t\t\t\tnewStatements[tableName] = prepareLibSQLRecreateTable(json2.tables[tableName], action);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\t\tconst wasRename = statementsForTable.some(({ type }) => type === 'rename_table');\n\t\t\t\tconst preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName], action);\n\n\t\t\t\tif (wasRename) {\n\t\t\t\t\tnewStatements[tableName].push(...preparedStatements);\n\t\t\t\t} else {\n\t\t\t\t\tnewStatements[tableName] = preparedStatements;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (statement.type === 'sqlite_alter_table_add_column' && statement.column.primaryKey) {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tconst statementsForTable = newStatements[tableName];\n\n\t\t\tif (!statementsForTable) {\n\t\t\t\tnewStatements[tableName] = prepareLibSQLRecreateTable(json2.tables[tableName], action);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\t\tconst wasRename = statementsForTable.some(({ type }) => type === 'rename_table');\n\t\t\t\tconst preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName], action);\n\n\t\t\t\tif (wasRename) {\n\t\t\t\t\tnewStatements[tableName].push(...preparedStatements);\n\t\t\t\t} else {\n\t\t\t\t\tnewStatements[tableName] = preparedStatements;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst tableName = statement.type === 'rename_table'\n\t\t\t? statement.tableNameTo\n\t\t\t: (statement as { tableName: string }).tableName;\n\t\tconst statementsForTable = newStatements[tableName];\n\n\t\tif (!statementsForTable) {\n\t\t\tnewStatements[tableName] = [statement];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\tnewStatements[tableName].push(statement);\n\t\t}\n\t}\n\n\tconst combinedStatements = Object.values(newStatements).flat();\n\tconst renamedTables = combinedStatements.filter((it) => it.type === 'rename_table');\n\tconst renamedColumns = combinedStatements.filter((it) => it.type === 'alter_table_rename_column');\n\n\tconst rest = combinedStatements.filter((it) => it.type !== 'rename_table' && it.type !== 'alter_table_rename_column');\n\n\treturn [...renamedTables, ...renamedColumns, ...rest];\n};\n\nexport const sqliteCombineStatements = (\n\tstatements: JsonStatement[],\n\tjson2: SQLiteSchemaSquashed,\n\taction?: 'push',\n) => {\n\t// const tablesContext: Record<string, string[]> = {};\n\tconst newStatements: Record<string, JsonStatement[]> = {};\n\tfor (const statement of statements) {\n\t\tif (\n\t\t\tstatement.type === 'alter_table_alter_column_set_type'\n\t\t\t|| statement.type === 'alter_table_alter_column_set_default'\n\t\t\t|| statement.type === 'alter_table_alter_column_drop_default'\n\t\t\t|| statement.type === 'alter_table_alter_column_set_notnull'\n\t\t\t|| statement.type === 'alter_table_alter_column_drop_notnull'\n\t\t\t|| statement.type === 'alter_table_alter_column_drop_autoincrement'\n\t\t\t|| statement.type === 'alter_table_alter_column_set_autoincrement'\n\t\t\t|| statement.type === 'alter_table_alter_column_drop_pk'\n\t\t\t|| statement.type === 'alter_table_alter_column_set_pk'\n\t\t\t|| statement.type === 'delete_reference'\n\t\t\t|| statement.type === 'alter_reference'\n\t\t\t|| statement.type === 'create_composite_pk'\n\t\t\t|| statement.type === 'alter_composite_pk'\n\t\t\t|| statement.type === 'delete_composite_pk'\n\t\t\t|| statement.type === 'create_unique_constraint'\n\t\t\t|| statement.type === 'delete_unique_constraint'\n\t\t\t|| statement.type === 'create_check_constraint'\n\t\t\t|| statement.type === 'delete_check_constraint'\n\t\t) {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tconst statementsForTable = newStatements[tableName];\n\n\t\t\tif (!statementsForTable) {\n\t\t\t\tnewStatements[tableName] = prepareSQLiteRecreateTable(json2.tables[tableName], action);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\t\tconst wasRename = statementsForTable.some(({ type }) => type === 'rename_table');\n\t\t\t\tconst preparedStatements = prepareSQLiteRecreateTable(json2.tables[tableName], action);\n\n\t\t\t\tif (wasRename) {\n\t\t\t\t\tnewStatements[tableName].push(...preparedStatements);\n\t\t\t\t} else {\n\t\t\t\t\tnewStatements[tableName] = preparedStatements;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (statement.type === 'sqlite_alter_table_add_column' && statement.column.primaryKey) {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tconst statementsForTable = newStatements[tableName];\n\n\t\t\tif (!statementsForTable) {\n\t\t\t\tnewStatements[tableName] = prepareSQLiteRecreateTable(json2.tables[tableName], action);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\t\tconst wasRename = statementsForTable.some(({ type }) => type === 'rename_table');\n\t\t\t\tconst preparedStatements = prepareSQLiteRecreateTable(json2.tables[tableName], action);\n\n\t\t\t\tif (wasRename) {\n\t\t\t\t\tnewStatements[tableName].push(...preparedStatements);\n\t\t\t\t} else {\n\t\t\t\t\tnewStatements[tableName] = preparedStatements;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (statement.type === 'create_reference') {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tconst data = action === 'push'\n\t\t\t\t? SQLiteSquasher.unsquashPushFK(statement.data)\n\t\t\t\t: SQLiteSquasher.unsquashFK(statement.data);\n\t\t\tconst statementsForTable = newStatements[tableName];\n\n\t\t\tif (!statementsForTable) {\n\t\t\t\tnewStatements[tableName] = prepareSQLiteRecreateTable(json2.tables[tableName], action);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// if add column with reference -> skip create_reference statement\n\t\t\tif (\n\t\t\t\tdata.columnsFrom.length === 1\n\t\t\t\t&& statementsForTable.some((st) =>\n\t\t\t\t\tst.type === 'sqlite_alter_table_add_column' && st.column.name === data.columnsFrom[0]\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\t\tconst wasRename = statementsForTable.some(({ type }) => type === 'rename_table');\n\t\t\t\tconst preparedStatements = prepareSQLiteRecreateTable(json2.tables[tableName], action);\n\n\t\t\t\tif (wasRename) {\n\t\t\t\t\tnewStatements[tableName].push(...preparedStatements);\n\t\t\t\t} else {\n\t\t\t\t\tnewStatements[tableName] = preparedStatements;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst tableName = statement.type === 'rename_table'\n\t\t\t? statement.tableNameTo\n\t\t\t: (statement as { tableName: string }).tableName;\n\n\t\tconst statementsForTable = newStatements[tableName];\n\n\t\tif (!statementsForTable) {\n\t\t\tnewStatements[tableName] = [statement];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\tnewStatements[tableName].push(statement);\n\t\t}\n\t}\n\n\tconst combinedStatements = Object.values(newStatements).flat();\n\n\tconst renamedTables = combinedStatements.filter((it) => it.type === 'rename_table');\n\tconst renamedColumns = combinedStatements.filter((it) => it.type === 'alter_table_rename_column');\n\n\tconst rest = combinedStatements.filter((it) => it.type !== 'rename_table' && it.type !== 'alter_table_rename_column');\n\n\treturn [...renamedTables, ...renamedColumns, ...rest];\n};\n\nexport const prepareSingleStoreRecreateTable = (\n\ttable: SingleStoreSchemaSquashed['tables'][keyof SingleStoreSchemaSquashed['tables']],\n): JsonStatement[] => {\n\tconst { name, columns, uniqueConstraints, indexes, compositePrimaryKeys } = table;\n\n\tconst composites: string[] = Object.values(compositePrimaryKeys);\n\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'singlestore_recreate_table',\n\t\t\ttableName: name,\n\t\t\tcolumns: Object.values(columns),\n\t\t\tcompositePKs: composites,\n\t\t\tuniqueConstraints: Object.values(uniqueConstraints),\n\t\t},\n\t];\n\n\tif (Object.keys(indexes).length) {\n\t\tstatements.push(...prepareCreateIndexesJson(name, '', indexes));\n\t}\n\treturn statements;\n};\n\nexport const singleStoreCombineStatements = (\n\tstatements: JsonStatement[],\n\tjson2: SingleStoreSchemaSquashed,\n) => {\n\tconst newStatements: Record<string, JsonStatement[]> = {};\n\n\tfor (const statement of statements) {\n\t\tif (\n\t\t\tstatement.type === 'alter_table_alter_column_set_type'\n\t\t\t|| statement.type === 'alter_table_alter_column_set_notnull'\n\t\t\t|| statement.type === 'alter_table_alter_column_drop_notnull'\n\t\t\t|| statement.type === 'alter_table_alter_column_drop_autoincrement'\n\t\t\t|| statement.type === 'alter_table_alter_column_set_autoincrement'\n\t\t\t|| statement.type === 'alter_table_alter_column_drop_pk'\n\t\t\t|| statement.type === 'alter_table_alter_column_set_pk'\n\t\t\t|| statement.type === 'create_composite_pk'\n\t\t\t|| statement.type === 'alter_composite_pk'\n\t\t\t|| statement.type === 'delete_composite_pk'\n\t\t) {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tconst statementsForTable = newStatements[tableName];\n\n\t\t\tif (!statementsForTable) {\n\t\t\t\tnewStatements[tableName] = prepareSingleStoreRecreateTable(json2.tables[tableName]);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\t\tconst wasRename = statementsForTable.some(({ type }) =>\n\t\t\t\t\ttype === 'rename_table' || type === 'alter_table_rename_column'\n\t\t\t\t);\n\t\t\t\tconst preparedStatements = prepareSingleStoreRecreateTable(json2.tables[tableName]);\n\n\t\t\t\tif (wasRename) {\n\t\t\t\t\tnewStatements[tableName].push(...preparedStatements);\n\t\t\t\t} else {\n\t\t\t\t\tnewStatements[tableName] = preparedStatements;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (\n\t\t\t(statement.type === 'alter_table_alter_column_drop_default'\n\t\t\t\t|| statement.type === 'alter_table_alter_column_set_default') && statement.columnNotNull\n\t\t) {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tconst statementsForTable = newStatements[tableName];\n\n\t\t\tif (!statementsForTable) {\n\t\t\t\tnewStatements[tableName] = prepareSingleStoreRecreateTable(json2.tables[tableName]);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\t\tconst wasRename = statementsForTable.some(({ type }) => type === 'rename_table');\n\t\t\t\tconst preparedStatements = prepareSingleStoreRecreateTable(json2.tables[tableName]);\n\n\t\t\t\tif (wasRename) {\n\t\t\t\t\tnewStatements[tableName].push(...preparedStatements);\n\t\t\t\t} else {\n\t\t\t\t\tnewStatements[tableName] = preparedStatements;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (statement.type === 'alter_table_add_column' && statement.column.primaryKey) {\n\t\t\tconst tableName = statement.tableName;\n\n\t\t\tconst statementsForTable = newStatements[tableName];\n\n\t\t\tif (!statementsForTable) {\n\t\t\t\tnewStatements[tableName] = prepareSingleStoreRecreateTable(json2.tables[tableName]);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!statementsForTable.some(({ type }) => type === 'recreate_table')) {\n\t\t\t\tconst wasRename = statementsForTable.some(({ type }) => type === 'rename_table');\n\t\t\t\tconst preparedStatements = prepareSingleStoreRecreateTable(json2.tables[tableName]);\n\n\t\t\t\tif (wasRename) {\n\t\t\t\t\tnewStatements[tableName].push(...preparedStatements);\n\t\t\t\t} else {\n\t\t\t\t\tnewStatements[tableName] = preparedStatements;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst tableName = statement.type === 'rename_table'\n\t\t\t? statement.tableNameTo\n\t\t\t: (statement as { tableName: string }).tableName;\n\n\t\tconst statementsForTable = newStatements[tableName];\n\n\t\tif (!statementsForTable) {\n\t\t\tnewStatements[tableName] = [statement];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!statementsForTable.some(({ type }) => type === 'singlestore_recreate_table')) {\n\t\t\tnewStatements[tableName].push(statement);\n\t\t}\n\t}\n\n\tconst combinedStatements = Object.values(newStatements).flat();\n\n\tconst renamedTables = combinedStatements.filter((it) => it.type === 'rename_table');\n\tconst renamedColumns = combinedStatements.filter((it) => it.type === 'alter_table_rename_column');\n\n\tconst rest = combinedStatements.filter((it) => it.type !== 'rename_table' && it.type !== 'alter_table_rename_column');\n\n\treturn [...renamedTables, ...renamedColumns, ...rest];\n};\n"
  },
  {
    "path": "drizzle-kit/src/utils/certs.ts",
    "content": "import envPaths from 'env-paths';\nimport { mkdirSync } from 'fs';\nimport { access, readFile } from 'fs/promises';\nimport { exec, ExecOptions } from 'node:child_process';\nimport { join } from 'path';\n\nexport function runCommand(command: string, options: ExecOptions = {}) {\n\treturn new Promise<{ exitCode: number }>((resolve) => {\n\t\texec(command, options, (error) => {\n\t\t\treturn resolve({ exitCode: error?.code ?? 0 });\n\t\t});\n\t});\n}\n\nexport const certs = async () => {\n\tconst res = await runCommand('mkcert --help');\n\n\tif (res.exitCode === 0) {\n\t\tconst p = envPaths('drizzle-studio', {\n\t\t\tsuffix: '',\n\t\t});\n\n\t\t// create ~/.local/share/drizzle-studio\n\t\tmkdirSync(p.data, { recursive: true });\n\n\t\t// ~/.local/share/drizzle-studio\n\t\tconst keyPath = join(p.data, 'localhost-key.pem');\n\t\tconst certPath = join(p.data, 'localhost.pem');\n\n\t\ttry {\n\t\t\t// check if the files exist\n\t\t\tawait Promise.all([access(keyPath), access(certPath)]);\n\t\t} catch (e) {\n\t\t\t// if not create them\n\t\t\tawait runCommand(`mkcert localhost`, { cwd: p.data });\n\t\t}\n\t\tconst [key, cert] = await Promise.all([\n\t\t\treadFile(keyPath, { encoding: 'utf-8' }),\n\t\t\treadFile(certPath, { encoding: 'utf-8' }),\n\t\t]);\n\t\treturn key && cert ? { key, cert } : null;\n\t}\n\treturn null;\n};\n"
  },
  {
    "path": "drizzle-kit/src/utils/words.ts",
    "content": "import type { Prefix } from '../cli/validations/common';\n\nexport const prepareMigrationMetadata = (\n\tidx: number,\n\tprefixMode: Prefix,\n\tname?: string,\n) => {\n\tconst prefix = prefixMode === 'index'\n\t\t? idx.toFixed(0).padStart(4, '0')\n\t\t: prefixMode === 'timestamp' || prefixMode === 'supabase'\n\t\t? new Date()\n\t\t\t.toISOString()\n\t\t\t.replace('T', '')\n\t\t\t.replaceAll('-', '')\n\t\t\t.replaceAll(':', '')\n\t\t\t.slice(0, 14)\n\t\t: prefixMode === 'unix'\n\t\t? Math.floor(Date.now() / 1000)\n\t\t: '';\n\n\tconst suffix = name || `${adjectives.random()}_${heroes.random()}`;\n\tconst tag = `${prefix}_${suffix}`;\n\treturn { prefix, suffix, tag };\n};\n\nexport const adjectives = [\n\t'abandoned',\n\t'aberrant',\n\t'abnormal',\n\t'absent',\n\t'absurd',\n\t'acoustic',\n\t'adorable',\n\t'amazing',\n\t'ambiguous',\n\t'ambitious',\n\t'amused',\n\t'amusing',\n\t'ancient',\n\t'aromatic',\n\t'aspiring',\n\t'awesome',\n\t'bent',\n\t'big',\n\t'bitter',\n\t'bizarre',\n\t'black',\n\t'blue',\n\t'blushing',\n\t'bored',\n\t'boring',\n\t'bouncy',\n\t'brainy',\n\t'brave',\n\t'breezy',\n\t'brief',\n\t'bright',\n\t'broad',\n\t'broken',\n\t'brown',\n\t'bumpy',\n\t'burly',\n\t'busy',\n\t'calm',\n\t'careful',\n\t'careless',\n\t'certain',\n\t'charming',\n\t'cheerful',\n\t'chemical',\n\t'chief',\n\t'chilly',\n\t'chubby',\n\t'chunky',\n\t'clammy',\n\t'classy',\n\t'clean',\n\t'clear',\n\t'clever',\n\t'cloudy',\n\t'closed',\n\t'clumsy',\n\t'cold',\n\t'colorful',\n\t'colossal',\n\t'common',\n\t'complete',\n\t'complex',\n\t'concerned',\n\t'condemned',\n\t'confused',\n\t'conscious',\n\t'cooing',\n\t'cool',\n\t'crazy',\n\t'cuddly',\n\t'cultured',\n\t'curious',\n\t'curly',\n\t'curved',\n\t'curvy',\n\t'cute',\n\t'cynical',\n\t'daffy',\n\t'daily',\n\t'damp',\n\t'dapper',\n\t'dark',\n\t'dashing',\n\t'dazzling',\n\t'dear',\n\t'deep',\n\t'demonic',\n\t'dizzy',\n\t'dry',\n\t'dusty',\n\t'eager',\n\t'early',\n\t'easy',\n\t'elite',\n\t'eminent',\n\t'empty',\n\t'equal',\n\t'even',\n\t'exotic',\n\t'fair',\n\t'faithful',\n\t'familiar',\n\t'famous',\n\t'fancy',\n\t'fantastic',\n\t'far',\n\t'fast',\n\t'fat',\n\t'faulty',\n\t'fearless',\n\t'fine',\n\t'first',\n\t'fixed',\n\t'flaky',\n\t'flashy',\n\t'flat',\n\t'flawless',\n\t'flimsy',\n\t'flippant',\n\t'flowery',\n\t'fluffy',\n\t'foamy',\n\t'free',\n\t'freezing',\n\t'fresh',\n\t'friendly',\n\t'funny',\n\t'furry',\n\t'futuristic',\n\t'fuzzy',\n\t'giant',\n\t'gifted',\n\t'gigantic',\n\t'glamorous',\n\t'glorious',\n\t'glossy',\n\t'good',\n\t'goofy',\n\t'gorgeous',\n\t'graceful',\n\t'gray',\n\t'great',\n\t'greedy',\n\t'green',\n\t'grey',\n\t'groovy',\n\t'handy',\n\t'happy',\n\t'hard',\n\t'harsh',\n\t'heavy',\n\t'hesitant',\n\t'high',\n\t'hot',\n\t'huge',\n\t'icy',\n\t'illegal',\n\t'jazzy',\n\t'jittery',\n\t'keen',\n\t'kind',\n\t'known',\n\t'lame',\n\t'large',\n\t'last',\n\t'late',\n\t'lazy',\n\t'lean',\n\t'left',\n\t'legal',\n\t'lethal',\n\t'light',\n\t'little',\n\t'lively',\n\t'living',\n\t'lonely',\n\t'long',\n\t'loose',\n\t'loud',\n\t'lovely',\n\t'loving',\n\t'low',\n\t'lowly',\n\t'lucky',\n\t'lumpy',\n\t'lush',\n\t'luxuriant',\n\t'lying',\n\t'lyrical',\n\t'magenta',\n\t'magical',\n\t'majestic',\n\t'many',\n\t'massive',\n\t'married',\n\t'marvelous',\n\t'material',\n\t'mature',\n\t'mean',\n\t'medical',\n\t'melodic',\n\t'melted',\n\t'messy',\n\t'mighty',\n\t'military',\n\t'milky',\n\t'minor',\n\t'misty',\n\t'mixed',\n\t'moaning',\n\t'modern',\n\t'motionless',\n\t'mushy',\n\t'mute',\n\t'mysterious',\n\t'naive',\n\t'nappy',\n\t'narrow',\n\t'nasty',\n\t'natural',\n\t'neat',\n\t'nebulous',\n\t'needy',\n\t'nervous',\n\t'new',\n\t'next',\n\t'nice',\n\t'nifty',\n\t'noisy',\n\t'normal',\n\t'nostalgic',\n\t'nosy',\n\t'numerous',\n\t'odd',\n\t'old',\n\t'omniscient',\n\t'open',\n\t'opposite',\n\t'optimal',\n\t'orange',\n\t'ordinary',\n\t'organic',\n\t'outgoing',\n\t'outstanding',\n\t'oval',\n\t'overconfident',\n\t'overjoyed',\n\t'overrated',\n\t'pale',\n\t'panoramic',\n\t'parallel',\n\t'parched',\n\t'past',\n\t'peaceful',\n\t'perfect',\n\t'perpetual',\n\t'petite',\n\t'pink',\n\t'plain',\n\t'polite',\n\t'powerful',\n\t'premium',\n\t'pretty',\n\t'previous',\n\t'productive',\n\t'public',\n\t'purple',\n\t'puzzling',\n\t'quick',\n\t'quiet',\n\t'rainy',\n\t'rapid',\n\t'rare',\n\t'real',\n\t'red',\n\t'redundant',\n\t'reflective',\n\t'regular',\n\t'remarkable',\n\t'rich',\n\t'right',\n\t'robust',\n\t'romantic',\n\t'round',\n\t'sad',\n\t'safe',\n\t'salty',\n\t'same',\n\t'secret',\n\t'serious',\n\t'shallow',\n\t'sharp',\n\t'shiny',\n\t'shocking',\n\t'short',\n\t'silent',\n\t'silky',\n\t'silly',\n\t'simple',\n\t'skinny',\n\t'sleepy',\n\t'slim',\n\t'slimy',\n\t'slippery',\n\t'sloppy',\n\t'slow',\n\t'small',\n\t'smart',\n\t'smiling',\n\t'smooth',\n\t'soft',\n\t'solid',\n\t'sour',\n\t'sparkling',\n\t'special',\n\t'spicy',\n\t'spooky',\n\t'spotty',\n\t'square',\n\t'stale',\n\t'steady',\n\t'steep',\n\t'sticky',\n\t'stiff',\n\t'stormy',\n\t'strange',\n\t'striped',\n\t'strong',\n\t'sturdy',\n\t'sudden',\n\t'superb',\n\t'supreme',\n\t'sweet',\n\t'swift',\n\t'talented',\n\t'tan',\n\t'tearful',\n\t'tense',\n\t'thankful',\n\t'thick',\n\t'thin',\n\t'third',\n\t'tidy',\n\t'tiny',\n\t'tired',\n\t'tiresome',\n\t'tough',\n\t'tranquil',\n\t'tricky',\n\t'true',\n\t'typical',\n\t'uneven',\n\t'unique',\n\t'unknown',\n\t'unusual',\n\t'useful',\n\t'vengeful',\n\t'violet',\n\t'volatile',\n\t'wakeful',\n\t'wandering',\n\t'warm',\n\t'watery',\n\t'wealthy',\n\t'wet',\n\t'white',\n\t'whole',\n\t'wide',\n\t'wild',\n\t'windy',\n\t'wise',\n\t'wonderful',\n\t'wooden',\n\t'woozy',\n\t'workable',\n\t'worried',\n\t'worthless',\n\t'yellow',\n\t'yielding',\n\t'young',\n\t'youthful',\n\t'yummy',\n\t'zippy',\n];\n\nexport const heroes = [\n\t'aaron_stack',\n\t'abomination',\n\t'absorbing_man',\n\t'adam_destine',\n\t'adam_warlock',\n\t'agent_brand',\n\t'agent_zero',\n\t'albert_cleary',\n\t'alex_power',\n\t'alex_wilder',\n\t'alice',\n\t'amazoness',\n\t'amphibian',\n\t'angel',\n\t'anita_blake',\n\t'annihilus',\n\t'anthem',\n\t'apocalypse',\n\t'aqueduct',\n\t'arachne',\n\t'archangel',\n\t'arclight',\n\t'ares',\n\t'argent',\n\t'avengers',\n\t'azazel',\n\t'banshee',\n\t'baron_strucker',\n\t'baron_zemo',\n\t'barracuda',\n\t'bastion',\n\t'beast',\n\t'bedlam',\n\t'ben_grimm',\n\t'ben_parker',\n\t'ben_urich',\n\t'betty_brant',\n\t'betty_ross',\n\t'beyonder',\n\t'big_bertha',\n\t'bill_hollister',\n\t'bishop',\n\t'black_bird',\n\t'black_bolt',\n\t'black_cat',\n\t'black_crow',\n\t'black_knight',\n\t'black_panther',\n\t'black_queen',\n\t'black_tarantula',\n\t'black_tom',\n\t'black_widow',\n\t'blackheart',\n\t'blacklash',\n\t'blade',\n\t'blazing_skull',\n\t'blindfold',\n\t'blink',\n\t'blizzard',\n\t'blob',\n\t'blockbuster',\n\t'blonde_phantom',\n\t'bloodaxe',\n\t'bloodscream',\n\t'bloodstorm',\n\t'bloodstrike',\n\t'blue_blade',\n\t'blue_marvel',\n\t'blue_shield',\n\t'blur',\n\t'boom_boom',\n\t'boomer',\n\t'boomerang',\n\t'bromley',\n\t'brood',\n\t'brother_voodoo',\n\t'bruce_banner',\n\t'bucky',\n\t'bug',\n\t'bulldozer',\n\t'bullseye',\n\t'bushwacker',\n\t'butterfly',\n\t'cable',\n\t'callisto',\n\t'calypso',\n\t'cammi',\n\t'cannonball',\n\t'captain_america',\n\t'captain_britain',\n\t'captain_cross',\n\t'captain_flint',\n\t'captain_marvel',\n\t'captain_midlands',\n\t'captain_stacy',\n\t'captain_universe',\n\t'cardiac',\n\t'caretaker',\n\t'cargill',\n\t'carlie_cooper',\n\t'carmella_unuscione',\n\t'carnage',\n\t'cassandra_nova',\n\t'catseye',\n\t'celestials',\n\t'centennial',\n\t'cerebro',\n\t'cerise',\n\t'chamber',\n\t'chameleon',\n\t'champions',\n\t'changeling',\n\t'charles_xavier',\n\t'chat',\n\t'chimera',\n\t'christian_walker',\n\t'chronomancer',\n\t'clea',\n\t'clint_barton',\n\t'cloak',\n\t'cobalt_man',\n\t'colleen_wing',\n\t'colonel_america',\n\t'colossus',\n\t'corsair',\n\t'crusher_hogan',\n\t'crystal',\n\t'cyclops',\n\t'dagger',\n\t'daimon_hellstrom',\n\t'dakota_north',\n\t'daredevil',\n\t'dark_beast',\n\t'dark_phoenix',\n\t'darkhawk',\n\t'darkstar',\n\t'darwin',\n\t'dazzler',\n\t'deadpool',\n\t'deathbird',\n\t'deathstrike',\n\t'demogoblin',\n\t'devos',\n\t'dexter_bennett',\n\t'diamondback',\n\t'doctor_doom',\n\t'doctor_faustus',\n\t'doctor_octopus',\n\t'doctor_spectrum',\n\t'doctor_strange',\n\t'domino',\n\t'donald_blake',\n\t'doomsday',\n\t'doorman',\n\t'dorian_gray',\n\t'dormammu',\n\t'dracula',\n\t'dragon_lord',\n\t'dragon_man',\n\t'drax',\n\t'dreadnoughts',\n\t'dreaming_celestial',\n\t'dust',\n\t'earthquake',\n\t'echo',\n\t'eddie_brock',\n\t'edwin_jarvis',\n\t'ego',\n\t'electro',\n\t'elektra',\n\t'emma_frost',\n\t'enchantress',\n\t'ender_wiggin',\n\t'energizer',\n\t'epoch',\n\t'eternals',\n\t'eternity',\n\t'excalibur',\n\t'exiles',\n\t'exodus',\n\t'expediter',\n\t'ezekiel',\n\t'ezekiel_stane',\n\t'fabian_cortez',\n\t'falcon',\n\t'fallen_one',\n\t'famine',\n\t'fantastic_four',\n\t'fat_cobra',\n\t'felicia_hardy',\n\t'fenris',\n\t'firebird',\n\t'firebrand',\n\t'firedrake',\n\t'firelord',\n\t'firestar',\n\t'fixer',\n\t'flatman',\n\t'forge',\n\t'forgotten_one',\n\t'frank_castle',\n\t'franklin_richards',\n\t'franklin_storm',\n\t'freak',\n\t'frightful_four',\n\t'frog_thor',\n\t'gabe_jones',\n\t'galactus',\n\t'gambit',\n\t'gamma_corps',\n\t'gamora',\n\t'gargoyle',\n\t'garia',\n\t'gateway',\n\t'gauntlet',\n\t'genesis',\n\t'george_stacy',\n\t'gertrude_yorkes',\n\t'ghost_rider',\n\t'giant_girl',\n\t'giant_man',\n\t'gideon',\n\t'gladiator',\n\t'glorian',\n\t'goblin_queen',\n\t'golden_guardian',\n\t'goliath',\n\t'gorgon',\n\t'gorilla_man',\n\t'grandmaster',\n\t'gravity',\n\t'green_goblin',\n\t'gressill',\n\t'grey_gargoyle',\n\t'greymalkin',\n\t'grim_reaper',\n\t'groot',\n\t'guardian',\n\t'guardsmen',\n\t'gunslinger',\n\t'gwen_stacy',\n\t'hairball',\n\t'hammerhead',\n\t'hannibal_king',\n\t'hardball',\n\t'harpoon',\n\t'harrier',\n\t'harry_osborn',\n\t'havok',\n\t'hawkeye',\n\t'hedge_knight',\n\t'hellcat',\n\t'hellfire_club',\n\t'hellion',\n\t'hemingway',\n\t'hercules',\n\t'hex',\n\t'hiroim',\n\t'hitman',\n\t'hobgoblin',\n\t'hulk',\n\t'human_cannonball',\n\t'human_fly',\n\t'human_robot',\n\t'human_torch',\n\t'husk',\n\t'hydra',\n\t'iceman',\n\t'ikaris',\n\t'imperial_guard',\n\t'impossible_man',\n\t'inertia',\n\t'infant_terrible',\n\t'inhumans',\n\t'ink',\n\t'invaders',\n\t'invisible_woman',\n\t'iron_fist',\n\t'iron_lad',\n\t'iron_man',\n\t'iron_monger',\n\t'iron_patriot',\n\t'ironclad',\n\t'jack_flag',\n\t'jack_murdock',\n\t'jack_power',\n\t'jackal',\n\t'jackpot',\n\t'james_howlett',\n\t'jamie_braddock',\n\t'jane_foster',\n\t'jasper_sitwell',\n\t'jazinda',\n\t'jean_grey',\n\t'jetstream',\n\t'jigsaw',\n\t'jimmy_woo',\n\t'jocasta',\n\t'johnny_blaze',\n\t'johnny_storm',\n\t'joseph',\n\t'joshua_kane',\n\t'joystick',\n\t'jubilee',\n\t'juggernaut',\n\t'junta',\n\t'justice',\n\t'justin_hammer',\n\t'kabuki',\n\t'kang',\n\t'karen_page',\n\t'karma',\n\t'karnak',\n\t'kat_farrell',\n\t'kate_bishop',\n\t'katie_power',\n\t'ken_ellis',\n\t'khan',\n\t'kid_colt',\n\t'killer_shrike',\n\t'killmonger',\n\t'killraven',\n\t'king_bedlam',\n\t'king_cobra',\n\t'kingpin',\n\t'kinsey_walden',\n\t'kitty_pryde',\n\t'klaw',\n\t'komodo',\n\t'korath',\n\t'korg',\n\t'korvac',\n\t'kree',\n\t'krista_starr',\n\t'kronos',\n\t'kulan_gath',\n\t'kylun',\n\t'la_nuit',\n\t'lady_bullseye',\n\t'lady_deathstrike',\n\t'lady_mastermind',\n\t'lady_ursula',\n\t'lady_vermin',\n\t'lake',\n\t'landau',\n\t'layla_miller',\n\t'leader',\n\t'leech',\n\t'legion',\n\t'lenny_balinger',\n\t'leo',\n\t'leopardon',\n\t'leper_queen',\n\t'lester',\n\t'lethal_legion',\n\t'lifeguard',\n\t'lightspeed',\n\t'lila_cheney',\n\t'lilandra',\n\t'lilith',\n\t'lily_hollister',\n\t'lionheart',\n\t'living_lightning',\n\t'living_mummy',\n\t'living_tribunal',\n\t'liz_osborn',\n\t'lizard',\n\t'loa',\n\t'lockheed',\n\t'lockjaw',\n\t'logan',\n\t'loki',\n\t'loners',\n\t'longshot',\n\t'lord_hawal',\n\t'lord_tyger',\n\t'lorna_dane',\n\t'luckman',\n\t'lucky_pierre',\n\t'luke_cage',\n\t'luminals',\n\t'lyja',\n\t'ma_gnuci',\n\t'mac_gargan',\n\t'mach_iv',\n\t'machine_man',\n\t'mad_thinker',\n\t'madame_hydra',\n\t'madame_masque',\n\t'madame_web',\n\t'maddog',\n\t'madelyne_pryor',\n\t'madripoor',\n\t'madrox',\n\t'maelstrom',\n\t'maestro',\n\t'magdalene',\n\t'maggott',\n\t'magik',\n\t'maginty',\n\t'magma',\n\t'magneto',\n\t'magus',\n\t'major_mapleleaf',\n\t'makkari',\n\t'malcolm_colcord',\n\t'malice',\n\t'mandarin',\n\t'mandrill',\n\t'mandroid',\n\t'manta',\n\t'mantis',\n\t'marauders',\n\t'maria_hill',\n\t'mariko_yashida',\n\t'marrow',\n\t'marten_broadcloak',\n\t'martin_li',\n\t'marvel_apes',\n\t'marvel_boy',\n\t'marvel_zombies',\n\t'marvex',\n\t'masked_marvel',\n\t'masque',\n\t'master_chief',\n\t'master_mold',\n\t'mastermind',\n\t'mathemanic',\n\t'matthew_murdock',\n\t'mattie_franklin',\n\t'mauler',\n\t'maverick',\n\t'maximus',\n\t'may_parker',\n\t'medusa',\n\t'meggan',\n\t'meltdown',\n\t'menace',\n\t'mentallo',\n\t'mentor',\n\t'mephisto',\n\t'mephistopheles',\n\t'mercury',\n\t'mesmero',\n\t'metal_master',\n\t'meteorite',\n\t'micromacro',\n\t'microbe',\n\t'microchip',\n\t'micromax',\n\t'midnight',\n\t'miek',\n\t'mikhail_rasputin',\n\t'millenium_guard',\n\t'mimic',\n\t'mindworm',\n\t'miracleman',\n\t'miss_america',\n\t'mister_fear',\n\t'mister_sinister',\n\t'misty_knight',\n\t'mockingbird',\n\t'moira_mactaggert',\n\t'mojo',\n\t'mole_man',\n\t'molecule_man',\n\t'molly_hayes',\n\t'molten_man',\n\t'mongoose',\n\t'mongu',\n\t'monster_badoon',\n\t'moon_knight',\n\t'moondragon',\n\t'moonstone',\n\t'morbius',\n\t'mordo',\n\t'morg',\n\t'morgan_stark',\n\t'morlocks',\n\t'morlun',\n\t'morph',\n\t'mother_askani',\n\t'mulholland_black',\n\t'multiple_man',\n\t'mysterio',\n\t'mystique',\n\t'namor',\n\t'namora',\n\t'namorita',\n\t'naoko',\n\t'natasha_romanoff',\n\t'nebula',\n\t'nehzno',\n\t'nekra',\n\t'nemesis',\n\t'network',\n\t'newton_destine',\n\t'next_avengers',\n\t'nextwave',\n\t'nick_fury',\n\t'nico_minoru',\n\t'nicolaos',\n\t'night_nurse',\n\t'night_thrasher',\n\t'nightcrawler',\n\t'nighthawk',\n\t'nightmare',\n\t'nightshade',\n\t'nitro',\n\t'nocturne',\n\t'nomad',\n\t'norman_osborn',\n\t'norrin_radd',\n\t'northstar',\n\t'nova',\n\t'nuke',\n\t'obadiah_stane',\n\t'odin',\n\t'ogun',\n\t'old_lace',\n\t'omega_flight',\n\t'omega_red',\n\t'omega_sentinel',\n\t'onslaught',\n\t'oracle',\n\t'orphan',\n\t'otto_octavius',\n\t'outlaw_kid',\n\t'overlord',\n\t'owl',\n\t'ozymandias',\n\t'paibok',\n\t'paladin',\n\t'pandemic',\n\t'paper_doll',\n\t'patch',\n\t'patriot',\n\t'payback',\n\t'penance',\n\t'pepper_potts',\n\t'pestilence',\n\t'pet_avengers',\n\t'pete_wisdom',\n\t'peter_parker',\n\t'peter_quill',\n\t'phalanx',\n\t'phantom_reporter',\n\t'phil_sheldon',\n\t'photon',\n\t'piledriver',\n\t'pixie',\n\t'plazm',\n\t'polaris',\n\t'post',\n\t'power_man',\n\t'power_pack',\n\t'praxagora',\n\t'preak',\n\t'pretty_boy',\n\t'pride',\n\t'prima',\n\t'princess_powerful',\n\t'prism',\n\t'prodigy',\n\t'proemial_gods',\n\t'professor_monster',\n\t'proteus',\n\t'proudstar',\n\t'prowler',\n\t'psylocke',\n\t'psynapse',\n\t'puck',\n\t'puff_adder',\n\t'puma',\n\t'punisher',\n\t'puppet_master',\n\t'purifiers',\n\t'purple_man',\n\t'pyro',\n\t'quasar',\n\t'quasimodo',\n\t'queen_noir',\n\t'quentin_quire',\n\t'quicksilver',\n\t'rachel_grey',\n\t'radioactive_man',\n\t'rafael_vega',\n\t'rage',\n\t'raider',\n\t'randall',\n\t'randall_flagg',\n\t'random',\n\t'rattler',\n\t'ravenous',\n\t'rawhide_kid',\n\t'raza',\n\t'reaper',\n\t'reavers',\n\t'red_ghost',\n\t'red_hulk',\n\t'red_shift',\n\t'red_skull',\n\t'red_wolf',\n\t'redwing',\n\t'reptil',\n\t'retro_girl',\n\t'revanche',\n\t'rhino',\n\t'rhodey',\n\t'richard_fisk',\n\t'rick_jones',\n\t'ricochet',\n\t'rictor',\n\t'riptide',\n\t'risque',\n\t'robbie_robertson',\n\t'robin_chapel',\n\t'rocket_raccoon',\n\t'rocket_racer',\n\t'rockslide',\n\t'rogue',\n\t'roland_deschain',\n\t'romulus',\n\t'ronan',\n\t'roughhouse',\n\t'roulette',\n\t'roxanne_simpson',\n\t'rumiko_fujikawa',\n\t'runaways',\n\t'sabra',\n\t'sabretooth',\n\t'sage',\n\t'sally_floyd',\n\t'salo',\n\t'sandman',\n\t'santa_claus',\n\t'saracen',\n\t'sasquatch',\n\t'satana',\n\t'sauron',\n\t'scalphunter',\n\t'scarecrow',\n\t'scarlet_spider',\n\t'scarlet_witch',\n\t'scorpion',\n\t'scourge',\n\t'scrambler',\n\t'scream',\n\t'screwball',\n\t'sebastian_shaw',\n\t'secret_warriors',\n\t'selene',\n\t'senator_kelly',\n\t'sentinel',\n\t'sentinels',\n\t'sentry',\n\t'ser_duncan',\n\t'serpent_society',\n\t'sersi',\n\t'shadow_king',\n\t'shadowcat',\n\t'shaman',\n\t'shape',\n\t'shard',\n\t'sharon_carter',\n\t'sharon_ventura',\n\t'shatterstar',\n\t'shen',\n\t'sheva_callister',\n\t'shinko_yamashiro',\n\t'shinobi_shaw',\n\t'shiva',\n\t'shiver_man',\n\t'shocker',\n\t'shockwave',\n\t'shooting_star',\n\t'shotgun',\n\t'shriek',\n\t'silhouette',\n\t'silk_fever',\n\t'silver_centurion',\n\t'silver_fox',\n\t'silver_sable',\n\t'silver_samurai',\n\t'silver_surfer',\n\t'silverclaw',\n\t'silvermane',\n\t'sinister_six',\n\t'sir_ram',\n\t'siren',\n\t'sister_grimm',\n\t'skaar',\n\t'skin',\n\t'skreet',\n\t'skrulls',\n\t'skullbuster',\n\t'slapstick',\n\t'slayback',\n\t'sleeper',\n\t'sleepwalker',\n\t'slipstream',\n\t'slyde',\n\t'smasher',\n\t'smiling_tiger',\n\t'snowbird',\n\t'solo',\n\t'songbird',\n\t'spacker_dave',\n\t'spectrum',\n\t'speed',\n\t'speed_demon',\n\t'speedball',\n\t'spencer_smythe',\n\t'sphinx',\n\t'spiral',\n\t'spirit',\n\t'spitfire',\n\t'spot',\n\t'sprite',\n\t'spyke',\n\t'squadron_sinister',\n\t'squadron_supreme',\n\t'squirrel_girl',\n\t'star_brand',\n\t'starbolt',\n\t'stardust',\n\t'starfox',\n\t'starhawk',\n\t'starjammers',\n\t'stark_industries',\n\t'stature',\n\t'steel_serpent',\n\t'stellaris',\n\t'stepford_cuckoos',\n\t'stephen_strange',\n\t'steve_rogers',\n\t'stick',\n\t'stingray',\n\t'stone_men',\n\t'storm',\n\t'stranger',\n\t'strong_guy',\n\t'stryfe',\n\t'sue_storm',\n\t'sugar_man',\n\t'sumo',\n\t'sunfire',\n\t'sunset_bain',\n\t'sunspot',\n\t'supernaut',\n\t'supreme_intelligence',\n\t'surge',\n\t'susan_delgado',\n\t'swarm',\n\t'sway',\n\t'switch',\n\t'swordsman',\n\t'synch',\n\t'tag',\n\t'talisman',\n\t'talkback',\n\t'talon',\n\t'talos',\n\t'tana_nile',\n\t'tarantula',\n\t'tarot',\n\t'taskmaster',\n\t'tattoo',\n\t'ted_forrester',\n\t'tempest',\n\t'tenebrous',\n\t'terrax',\n\t'terror',\n\t'texas_twister',\n\t'thaddeus_ross',\n\t'thanos',\n\t'the_anarchist',\n\t'the_call',\n\t'the_captain',\n\t'the_enforcers',\n\t'the_executioner',\n\t'the_fallen',\n\t'the_fury',\n\t'the_hand',\n\t'the_hood',\n\t'the_hunter',\n\t'the_initiative',\n\t'the_leader',\n\t'the_liberteens',\n\t'the_order',\n\t'the_phantom',\n\t'the_professor',\n\t'the_renegades',\n\t'the_santerians',\n\t'the_spike',\n\t'the_stranger',\n\t'the_twelve',\n\t'the_watchers',\n\t'thena',\n\t'thing',\n\t'thor',\n\t'thor_girl',\n\t'thunderball',\n\t'thunderbird',\n\t'thunderbolt',\n\t'thunderbolt_ross',\n\t'thunderbolts',\n\t'thundra',\n\t'tiger_shark',\n\t'tigra',\n\t'timeslip',\n\t'tinkerer',\n\t'titania',\n\t'titanium_man',\n\t'toad',\n\t'toad_men',\n\t'tomas',\n\t'tombstone',\n\t'tomorrow_man',\n\t'tony_stark',\n\t'toro',\n\t'toxin',\n\t'trauma',\n\t'triathlon',\n\t'trish_tilby',\n\t'triton',\n\t'true_believers',\n\t'turbo',\n\t'tusk',\n\t'tyger_tiger',\n\t'typhoid_mary',\n\t'tyrannus',\n\t'ulik',\n\t'ultimates',\n\t'ultimatum',\n\t'ultimo',\n\t'ultragirl',\n\t'ultron',\n\t'umar',\n\t'unicorn',\n\t'union_jack',\n\t'unus',\n\t'valeria_richards',\n\t'valkyrie',\n\t'vampiro',\n\t'vance_astro',\n\t'vanisher',\n\t'vapor',\n\t'vargas',\n\t'vector',\n\t'veda',\n\t'vengeance',\n\t'venom',\n\t'venus',\n\t'vermin',\n\t'vertigo',\n\t'victor_mancha',\n\t'vin_gonzales',\n\t'vindicator',\n\t'violations',\n\t'viper',\n\t'virginia_dare',\n\t'vision',\n\t'vivisector',\n\t'vulcan',\n\t'vulture',\n\t'wallflower',\n\t'wallop',\n\t'wallow',\n\t'war_machine',\n\t'warbird',\n\t'warbound',\n\t'warhawk',\n\t'warlock',\n\t'warpath',\n\t'warstar',\n\t'wasp',\n\t'weapon_omega',\n\t'wendell_rand',\n\t'wendell_vaughn',\n\t'wendigo',\n\t'whiplash',\n\t'whirlwind',\n\t'whistler',\n\t'white_queen',\n\t'white_tiger',\n\t'whizzer',\n\t'wiccan',\n\t'wild_child',\n\t'wild_pack',\n\t'wildside',\n\t'william_stryker',\n\t'wilson_fisk',\n\t'wind_dancer',\n\t'winter_soldier',\n\t'wither',\n\t'wolf_cub',\n\t'wolfpack',\n\t'wolfsbane',\n\t'wolverine',\n\t'wonder_man',\n\t'wong',\n\t'wraith',\n\t'wrecker',\n\t'wrecking_crew',\n\t'xavin',\n\t'xorn',\n\t'yellow_claw',\n\t'yellowjacket',\n\t'young_avengers',\n\t'zaladane',\n\t'zaran',\n\t'zarda',\n\t'zarek',\n\t'zeigeist',\n\t'zemo',\n\t'zodiak',\n\t'zombie',\n\t'zuras',\n\t'zzzax',\n];\n"
  },
  {
    "path": "drizzle-kit/src/utils.ts",
    "content": "import type { RunResult } from 'better-sqlite3';\nimport chalk from 'chalk';\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { parse } from 'url';\nimport type { NamedWithSchema } from './cli/commands/migrate';\nimport { info } from './cli/views';\nimport { assertUnreachable, snapshotVersion } from './global';\nimport type { Dialect } from './schemaValidator';\nimport { backwardCompatibleGelSchema } from './serializer/gelSchema';\nimport { backwardCompatibleMysqlSchema } from './serializer/mysqlSchema';\nimport { backwardCompatiblePgSchema } from './serializer/pgSchema';\nimport { backwardCompatibleSingleStoreSchema } from './serializer/singlestoreSchema';\nimport { backwardCompatibleSqliteSchema } from './serializer/sqliteSchema';\nimport type { ProxyParams } from './serializer/studio';\n\nexport type Proxy = (params: ProxyParams) => Promise<any[]>;\n\nexport type TransactionProxy = (queries: { sql: string; method?: ProxyParams['method'] }[]) => Promise<any[]>;\n\nexport type DB = {\n\tquery: <T extends any = any>(sql: string, params?: any[]) => Promise<T[]>;\n};\n\nexport type SQLiteDB = {\n\tquery: <T extends any = any>(sql: string, params?: any[]) => Promise<T[]>;\n\trun(query: string): Promise<void>;\n};\n\nexport type LibSQLDB = {\n\tquery: <T extends any = any>(sql: string, params?: any[]) => Promise<T[]>;\n\trun(query: string): Promise<void>;\n\tbatchWithPragma?(queries: string[]): Promise<void>;\n};\n\nexport const copy = <T>(it: T): T => {\n\treturn JSON.parse(JSON.stringify(it));\n};\n\nexport const objectValues = <T extends object>(obj: T): Array<T[keyof T]> => {\n\treturn Object.values(obj);\n};\n\nexport const assertV1OutFolder = (out: string) => {\n\tif (!existsSync(out)) return;\n\n\tconst oldMigrationFolders = readdirSync(out).filter(\n\t\t(it) => it.length === 14 && /^\\d+$/.test(it),\n\t);\n\n\tif (oldMigrationFolders.length > 0) {\n\t\tconsole.log(\n\t\t\t`Your migrations folder format is outdated, please run ${\n\t\t\t\tchalk.green.bold(\n\t\t\t\t\t`drizzle-kit up`,\n\t\t\t\t)\n\t\t\t}`,\n\t\t);\n\t\tprocess.exit(1);\n\t}\n};\n\nexport type Journal = {\n\tversion: string;\n\tdialect: Dialect;\n\tentries: {\n\t\tidx: number;\n\t\tversion: string;\n\t\twhen: number;\n\t\ttag: string;\n\t\tbreakpoints: boolean;\n\t}[];\n};\n\nexport const dryJournal = (dialect: Dialect): Journal => {\n\treturn {\n\t\tversion: snapshotVersion,\n\t\tdialect,\n\t\tentries: [],\n\t};\n};\n\n// export const preparePushFolder = (dialect: Dialect) => {\n//   const out = \".drizzle\";\n//   let snapshot: string = \"\";\n//   if (!existsSync(join(out))) {\n//     mkdirSync(out);\n//     snapshot = JSON.stringify(dryJournal(dialect));\n//   } else {\n//     snapshot = readdirSync(out)[0];\n//   }\n\n//   return { snapshot };\n// };\n\nexport const prepareOutFolder = (out: string, dialect: Dialect) => {\n\tconst meta = join(out, 'meta');\n\tconst journalPath = join(meta, '_journal.json');\n\n\tif (!existsSync(join(out, 'meta'))) {\n\t\tmkdirSync(meta, { recursive: true });\n\t\twriteFileSync(journalPath, JSON.stringify(dryJournal(dialect)));\n\t}\n\n\tconst journal = JSON.parse(readFileSync(journalPath).toString());\n\n\tconst snapshots = readdirSync(meta)\n\t\t.filter((it) => !it.startsWith('_'))\n\t\t.map((it) => join(meta, it));\n\n\tsnapshots.sort();\n\treturn { meta, snapshots, journal };\n};\n\nconst validatorForDialect = (dialect: Dialect) => {\n\tswitch (dialect) {\n\t\tcase 'postgresql':\n\t\t\treturn { validator: backwardCompatiblePgSchema, version: 7 };\n\t\tcase 'sqlite':\n\t\t\treturn { validator: backwardCompatibleSqliteSchema, version: 6 };\n\t\tcase 'turso':\n\t\t\treturn { validator: backwardCompatibleSqliteSchema, version: 6 };\n\t\tcase 'mysql':\n\t\t\treturn { validator: backwardCompatibleMysqlSchema, version: 5 };\n\t\tcase 'singlestore':\n\t\t\treturn { validator: backwardCompatibleSingleStoreSchema, version: 1 };\n\t\tcase 'gel':\n\t\t\treturn { validator: backwardCompatibleGelSchema, version: 1 };\n\t}\n};\n\nexport const validateWithReport = (snapshots: string[], dialect: Dialect) => {\n\t// ✅ check if drizzle-kit can handle snapshot version\n\t// ✅ check if snapshot is of the last version\n\t// ✅ check if id of the snapshot is valid\n\t// ✅ collect {} of prev id -> snapshotName[], if there's more than one - tell about collision\n\tconst { validator, version } = validatorForDialect(dialect);\n\n\tconst result = snapshots.reduce(\n\t\t(accum, it) => {\n\t\t\tconst raw = JSON.parse(readFileSync(`./${it}`).toString());\n\n\t\t\taccum.rawMap[it] = raw;\n\n\t\t\tif (raw['version'] && Number(raw['version']) > version) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tinfo(\n\t\t\t\t\t\t`${it} snapshot is of unsupported version, please update drizzle-kit`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\n\t\t\tconst result = validator.safeParse(raw);\n\t\t\tif (!result.success) {\n\t\t\t\taccum.malformed.push(it);\n\t\t\t\treturn accum;\n\t\t\t}\n\n\t\t\tconst snapshot = result.data;\n\t\t\tif (snapshot.version !== String(version)) {\n\t\t\t\taccum.nonLatest.push(it);\n\t\t\t\treturn accum;\n\t\t\t}\n\n\t\t\t// only if latest version here\n\t\t\tconst idEntry = accum.idsMap[snapshot['prevId']] ?? {\n\t\t\t\tparent: it,\n\t\t\t\tsnapshots: [],\n\t\t\t};\n\t\t\tidEntry.snapshots.push(it);\n\t\t\taccum.idsMap[snapshot['prevId']] = idEntry;\n\n\t\t\treturn accum;\n\t\t},\n\t\t{\n\t\t\tmalformed: [],\n\t\t\tnonLatest: [],\n\t\t\tidToNameMap: {},\n\t\t\tidsMap: {},\n\t\t\trawMap: {},\n\t\t} as {\n\t\t\tmalformed: string[];\n\t\t\tnonLatest: string[];\n\t\t\tidsMap: Record<string, { parent: string; snapshots: string[] }>;\n\t\t\trawMap: Record<string, any>;\n\t\t},\n\t);\n\n\treturn result;\n};\n\nexport const prepareMigrationFolder = (\n\toutFolder: string = 'drizzle',\n\tdialect: Dialect,\n) => {\n\tconst { snapshots, journal } = prepareOutFolder(outFolder, dialect);\n\tconst report = validateWithReport(snapshots, dialect);\n\tif (report.nonLatest.length > 0) {\n\t\tconsole.log(\n\t\t\treport.nonLatest\n\t\t\t\t.map((it) => {\n\t\t\t\t\treturn `${it}/snapshot.json is not of the latest version`;\n\t\t\t\t})\n\t\t\t\t.concat(`Run ${chalk.green.bold(`drizzle-kit up`)}`)\n\t\t\t\t.join('\\n'),\n\t\t);\n\t\tprocess.exit(0);\n\t}\n\n\tif (report.malformed.length) {\n\t\tconst message = report.malformed\n\t\t\t.map((it) => {\n\t\t\t\treturn `${it} data is malformed`;\n\t\t\t})\n\t\t\t.join('\\n');\n\t\tconsole.log(message);\n\t}\n\n\tconst collisionEntries = Object.entries(report.idsMap).filter(\n\t\t(it) => it[1].snapshots.length > 1,\n\t);\n\n\tconst message = collisionEntries\n\t\t.map((it) => {\n\t\t\tconst data = it[1];\n\t\t\treturn `[${\n\t\t\t\tdata.snapshots.join(\n\t\t\t\t\t', ',\n\t\t\t\t)\n\t\t\t}] are pointing to a parent snapshot: ${data.parent}/snapshot.json which is a collision.`;\n\t\t})\n\t\t.join('\\n')\n\t\t.trim();\n\tif (message) {\n\t\tconsole.log(chalk.red.bold('Error:'), message);\n\t}\n\n\tconst abort = report.malformed.length!! || collisionEntries.length > 0;\n\n\tif (abort) {\n\t\tprocess.exit(0);\n\t}\n\n\treturn { snapshots, journal };\n};\n\nexport const prepareMigrationMeta = (\n\tschemas: { from: string; to: string }[],\n\ttables: { from: NamedWithSchema; to: NamedWithSchema }[],\n\tcolumns: {\n\t\tfrom: { table: string; schema: string; column: string };\n\t\tto: { table: string; schema: string; column: string };\n\t}[],\n) => {\n\tconst _meta = {\n\t\tschemas: {} as Record<string, string>,\n\t\ttables: {} as Record<string, string>,\n\t\tcolumns: {} as Record<string, string>,\n\t};\n\n\tschemas.forEach((it) => {\n\t\tconst from = schemaRenameKey(it.from);\n\t\tconst to = schemaRenameKey(it.to);\n\t\t_meta.schemas[from] = to;\n\t});\n\ttables.forEach((it) => {\n\t\tconst from = tableRenameKey(it.from);\n\t\tconst to = tableRenameKey(it.to);\n\t\t_meta.tables[from] = to;\n\t});\n\n\tcolumns.forEach((it) => {\n\t\tconst from = columnRenameKey(it.from.table, it.from.schema, it.from.column);\n\t\tconst to = columnRenameKey(it.to.table, it.to.schema, it.to.column);\n\t\t_meta.columns[from] = to;\n\t});\n\n\treturn _meta;\n};\n\nexport const schemaRenameKey = (it: string) => {\n\treturn it;\n};\n\nexport const tableRenameKey = (it: NamedWithSchema) => {\n\tconst out = it.schema ? `\"${it.schema}\".\"${it.name}\"` : `\"${it.name}\"`;\n\treturn out;\n};\n\nexport const columnRenameKey = (\n\ttable: string,\n\tschema: string,\n\tcolumn: string,\n) => {\n\tconst out = schema\n\t\t? `\"${schema}\".\"${table}\".\"${column}\"`\n\t\t: `\"${table}\".\"${column}\"`;\n\treturn out;\n};\n\nexport const kloudMeta = () => {\n\treturn {\n\t\tpg: [5],\n\t\tmysql: [] as number[],\n\t\tsqlite: [] as number[],\n\t};\n};\n\nexport const normaliseSQLiteUrl = (\n\tit: string,\n\ttype: 'libsql' | 'better-sqlite',\n) => {\n\tif (type === 'libsql') {\n\t\tif (it.startsWith('file:')) {\n\t\t\treturn it;\n\t\t}\n\t\ttry {\n\t\t\tconst url = parse(it);\n\t\t\tif (url.protocol === null) {\n\t\t\t\treturn `file:${it}`;\n\t\t\t}\n\t\t\treturn it;\n\t\t} catch (e) {\n\t\t\treturn `file:${it}`;\n\t\t}\n\t}\n\n\tif (type === 'better-sqlite') {\n\t\tif (it.startsWith('file:')) {\n\t\t\treturn it.substring(5);\n\t\t}\n\n\t\treturn it;\n\t}\n\n\tassertUnreachable(type);\n};\n\nexport const normalisePGliteUrl = (\n\tit: string,\n) => {\n\tif (it.startsWith('file:')) {\n\t\treturn it.substring(5);\n\t}\n\n\treturn it;\n};\n\nexport function isPgArrayType(sqlType: string) {\n\treturn sqlType.match(/.*\\[\\d*\\].*|.*\\[\\].*/g) !== null;\n}\n\nexport function findAddedAndRemoved(columnNames1: string[], columnNames2: string[]) {\n\tconst set1 = new Set(columnNames1);\n\tconst set2 = new Set(columnNames2);\n\n\tconst addedColumns = columnNames2.filter((it) => !set1.has(it));\n\tconst removedColumns = columnNames1.filter((it) => !set2.has(it));\n\n\treturn { addedColumns, removedColumns };\n}\n\nexport function escapeSingleQuotes(str: string) {\n\treturn str.replace(/'/g, \"''\");\n}\n\nexport function unescapeSingleQuotes(str: string, ignoreFirstAndLastChar: boolean) {\n\tconst regex = ignoreFirstAndLastChar ? /(?<!^)'(?!$)/g : /'/g;\n\treturn str.replace(/''/g, \"'\").replace(regex, \"\\\\'\");\n}\n"
  },
  {
    "path": "drizzle-kit/tests/bin.test.ts",
    "content": "import chalk from 'chalk';\nimport { assert, test } from 'vitest';\nimport { analyzeImports, ChainLink } from '../imports-checker/checker';\n\ntest('imports-issues', () => {\n\tconst issues = analyzeImports({\n\t\tbasePath: '.',\n\t\tlocalPaths: ['src'],\n\t\twhiteList: [\n\t\t\t'@drizzle-team/brocli',\n\t\t\t'json-diff',\n\t\t\t'path',\n\t\t\t'fs',\n\t\t\t'fs/*',\n\t\t\t'url',\n\t\t\t'zod',\n\t\t\t'node:*',\n\t\t\t'hono',\n\t\t\t'glob',\n\t\t\t'hono/*',\n\t\t\t'hono/**/*',\n\t\t\t'@hono/*',\n\t\t\t'crypto',\n\t\t\t'hanji',\n\t\t\t'chalk',\n\t\t\t'dotenv/config',\n\t\t\t'camelcase',\n\t\t\t'semver',\n\t\t\t'env-paths',\n\t\t],\n\t\tentry: 'src/cli/index.ts',\n\t\tlogger: true,\n\t\tignoreTypes: true,\n\t}).issues;\n\n\tconst chainToString = (chains: ChainLink[]) => {\n\t\tif (chains.length === 0) throw new Error();\n\n\t\tlet out = chains[0]!.file + '\\n';\n\t\tlet indentation = 0;\n\t\tfor (let chain of chains) {\n\t\t\tout += ' '.repeat(indentation)\n\t\t\t\t+ '└'\n\t\t\t\t+ chain.import\n\t\t\t\t+ ` ${chalk.gray(chain.file)}\\n`;\n\t\t\tindentation += 1;\n\t\t}\n\t\treturn out;\n\t};\n\n\tconsole.log();\n\tfor (const issue of issues) {\n\t\tconsole.log(chalk.red(issue.imports.map((it) => it.name).join('\\n')));\n\t\tconsole.log(issue.accessChains.map((it) => chainToString(it)).join('\\n'));\n\t}\n\n\tassert.equal(issues.length, 0);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/cli/d1http.config.ts",
    "content": "import { defineConfig } from '../../src';\n\nexport default defineConfig({\n\tschema: './schema.ts',\n\tdialect: 'sqlite',\n\tdriver: 'd1-http',\n\tdbCredentials: {\n\t\taccountId: 'accid',\n\t\tdatabaseId: 'dbid',\n\t\ttoken: 'token',\n\t},\n});\n"
  },
  {
    "path": "drizzle-kit/tests/cli/drizzle.config.ts",
    "content": "import { defineConfig } from '../../src';\n\nexport default defineConfig({\n\tschema: './schema.ts',\n\tdialect: 'postgresql',\n\tdbCredentials: {\n\t\turl: 'postgresql://postgres:postgres@127.0.0.1:5432/db',\n\t},\n});\n"
  },
  {
    "path": "drizzle-kit/tests/cli/durable-sqlite.config.ts",
    "content": "import { defineConfig } from '../../src';\n\nexport default defineConfig({\n\tschema: './schema.ts',\n\tdialect: 'sqlite',\n\tdriver: 'durable-sqlite',\n});\n"
  },
  {
    "path": "drizzle-kit/tests/cli/expo.config.ts",
    "content": "import { defineConfig } from '../../src';\n\nexport default defineConfig({\n\tschema: './schema.ts',\n\tdialect: 'sqlite',\n\tdriver: 'expo',\n});\n"
  },
  {
    "path": "drizzle-kit/tests/cli/postgres.config.ts",
    "content": "import { defineConfig } from '../../src';\n\nexport default defineConfig({\n\tschema: './schema.ts',\n\tdialect: 'postgresql',\n\tdbCredentials: {\n\t\thost: '127.0.0.1',\n\t\tport: 5432,\n\t\tuser: 'postgresql',\n\t\tpassword: 'postgres',\n\t\tdatabase: 'db',\n\t},\n});\n"
  },
  {
    "path": "drizzle-kit/tests/cli/postgres2.config.ts",
    "content": "import { defineConfig } from '../../src';\n\nexport default defineConfig({\n\tschema: './schema.ts',\n\tdialect: 'postgresql',\n\tdbCredentials: {\n\t\thost: '127.0.0.1',\n\t\tport: 5432,\n\t\tuser: 'postgresql',\n\t\tpassword: 'postgres',\n\t\tdatabase: 'db',\n\t},\n\tmigrations: {\n\t\tschema: 'custom',\n\t\ttable: 'custom',\n\t},\n});\n"
  },
  {
    "path": "drizzle-kit/tests/cli/schema.ts",
    "content": "// mock\n"
  },
  {
    "path": "drizzle-kit/tests/cli/turso.config.ts",
    "content": "import { defineConfig } from '../../src';\n\nexport default defineConfig({\n\tschema: './schema.ts',\n\tdialect: 'turso',\n\tdbCredentials: {\n\t\turl: 'turso.dev',\n\t\tauthToken: 'token',\n\t},\n});\n"
  },
  {
    "path": "drizzle-kit/tests/cli-export.test.ts",
    "content": "import { test as brotest } from '@drizzle-team/brocli';\nimport { assert, expect, test } from 'vitest';\nimport { exportRaw } from '../src/cli/schema';\n\n// good:\n// #1 drizzle-kit export --dialect=postgresql --schema=schema.ts\n// #3 drizzle-kit export\n// #3 drizzle-kit export --config=drizzle1.config.ts\n\n// errors:\n// #1 drizzle-kit export --schema=src/schema.ts\n// #2 drizzle-kit export --dialect=postgresql\n// #3 drizzle-kit export --dialect=postgresql2\n// #4 drizzle-kit export --config=drizzle.config.ts --schema=schema.ts\n// #5 drizzle-kit export --config=drizzle.config.ts --dialect=postgresql\n\ntest('export #1', async (t) => {\n\tconst res = await brotest(\n\t\texportRaw,\n\t\t'--dialect=postgresql --schema=schema.ts',\n\t);\n\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tschema: 'schema.ts',\n\t\tsql: true,\n\t});\n});\n\ntest('export #2', async (t) => {\n\tconst res = await brotest(exportRaw, '');\n\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tschema: './schema.ts',\n\t\tsql: true,\n\t});\n});\n\n// custom config path\ntest('export #3', async (t) => {\n\tconst res = await brotest(exportRaw, '--config=expo.config.ts');\n\tassert.equal(res.type, 'handler');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'sqlite',\n\t\tschema: './schema.ts',\n\t\tsql: true,\n\t});\n});\n\n// --- errors ---\ntest('err #1', async (t) => {\n\tconst res = await brotest(exportRaw, '--schema=src/schema.ts');\n\tassert.equal(res.type, 'error');\n});\n\ntest('err #2', async (t) => {\n\tconst res = await brotest(exportRaw, '--dialect=postgresql');\n\tassert.equal(res.type, 'error');\n});\n\ntest('err #3', async (t) => {\n\tconst res = await brotest(exportRaw, '--dialect=postgresql2');\n\tassert.equal(res.type, 'error');\n});\n\ntest('err #4', async (t) => {\n\tconst res = await brotest(exportRaw, '--config=drizzle.config.ts --schema=schema.ts');\n\tassert.equal(res.type, 'error');\n});\n\ntest('err #5', async (t) => {\n\tconst res = await brotest(exportRaw, '--config=drizzle.config.ts --dialect=postgresql');\n\tassert.equal(res.type, 'error');\n});\n"
  },
  {
    "path": "drizzle-kit/tests/cli-generate.test.ts",
    "content": "import { test as brotest } from '@drizzle-team/brocli';\nimport { assert, expect, test } from 'vitest';\nimport { generate } from '../src/cli/schema';\n\n// good:\n// #1 drizzle-kit generate --dialect=postgresql --schema=schema.ts\n// #2 drizzle-kit generate --dialect=postgresql --schema=schema.ts --out=out\n// #3 drizzle-kit generate\n// #4 drizzle-kit generate --custom\n// #5 drizzle-kit generate --name=custom\n// #6 drizzle-kit generate --prefix=timestamp\n// #7 drizzle-kit generate --prefix=timestamp --name=custom --custom\n// #8 drizzle-kit generate --config=drizzle1.config.ts\n// #9 drizzle-kit generate --dialect=postgresql --schema=schema.ts --out=out --prefix=timestamp --name=custom --custom\n\n// errors:\n// #1 drizzle-kit generate --schema=src/schema.ts\n// #2 drizzle-kit generate --dialect=postgresql\n// #3 drizzle-kit generate --dialect=postgresql2\n// #4 drizzle-kit generate --driver=expo\n// #5 drizzle-kit generate --dialect=postgresql --out=out\n// #6 drizzle-kit generate --config=drizzle.config.ts --out=out\n// #7 drizzle-kit generate --config=drizzle.config.ts --schema=schema.ts\n// #8 drizzle-kit generate --config=drizzle.config.ts --dialect=postgresql\n\ntest('generate #1', async (t) => {\n\tconst res = await brotest(\n\t\tgenerate,\n\t\t'--dialect=postgresql --schema=schema.ts',\n\t);\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tname: undefined,\n\t\tcustom: false,\n\t\tprefix: 'index',\n\t\tbreakpoints: true,\n\t\tschema: 'schema.ts',\n\t\tout: 'drizzle',\n\t\tbundle: false,\n\t\tcasing: undefined,\n\t\tdriver: undefined,\n\t});\n});\n\ntest('generate #2', async (t) => {\n\tconst res = await brotest(\n\t\tgenerate,\n\t\t'--dialect=postgresql --schema=schema.ts --out=out',\n\t);\n\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tname: undefined,\n\t\tcustom: false,\n\t\tprefix: 'index',\n\t\tbreakpoints: true,\n\t\tschema: 'schema.ts',\n\t\tout: 'out',\n\t\tbundle: false,\n\t\tcasing: undefined,\n\t\tdriver: undefined,\n\t});\n});\n\ntest('generate #3', async (t) => {\n\tconst res = await brotest(generate, '');\n\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tname: undefined,\n\t\tcustom: false,\n\t\tprefix: 'index',\n\t\tbreakpoints: true,\n\t\tschema: './schema.ts',\n\t\tout: 'drizzle',\n\t\tbundle: false,\n\t\tcasing: undefined,\n\t\tdriver: undefined,\n\t});\n});\n\n// config | pass through custom\ntest('generate #4', async (t) => {\n\tconst res = await brotest(generate, '--custom');\n\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tname: undefined,\n\t\tcustom: true,\n\t\tprefix: 'index',\n\t\tbreakpoints: true,\n\t\tschema: './schema.ts',\n\t\tout: 'drizzle',\n\t\tbundle: false,\n\t\tcasing: undefined,\n\t\tdriver: undefined,\n\t});\n});\n\n// config | pass through name\ntest('generate #5', async (t) => {\n\tconst res = await brotest(generate, '--name=custom');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tname: 'custom',\n\t\tcustom: false,\n\t\tprefix: 'index',\n\t\tbreakpoints: true,\n\t\tschema: './schema.ts',\n\t\tout: 'drizzle',\n\t\tbundle: false,\n\t\tcasing: undefined,\n\t\tdriver: undefined,\n\t});\n});\n\n// config | pass through prefix\ntest('generate #6', async (t) => {\n\tconst res = await brotest(generate, '--prefix=timestamp');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tname: undefined,\n\t\tcustom: false,\n\t\tprefix: 'timestamp',\n\t\tbreakpoints: true,\n\t\tschema: './schema.ts',\n\t\tout: 'drizzle',\n\t\tbundle: false,\n\t\tcasing: undefined,\n\t\tdriver: undefined,\n\t});\n});\n\n// config | pass through name, prefix and custom\ntest('generate #7', async (t) => {\n\tconst res = await brotest(\n\t\tgenerate,\n\t\t'--prefix=timestamp --name=custom --custom',\n\t);\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tname: 'custom',\n\t\tcustom: true,\n\t\tprefix: 'timestamp',\n\t\tbreakpoints: true,\n\t\tschema: './schema.ts',\n\t\tout: 'drizzle',\n\t\tbundle: false,\n\t\tcasing: undefined,\n\t\tdriver: undefined,\n\t});\n});\n\n// custom config path\ntest('generate #8', async (t) => {\n\tconst res = await brotest(generate, '--config=expo.config.ts');\n\tassert.equal(res.type, 'handler');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'sqlite',\n\t\tname: undefined,\n\t\tcustom: false,\n\t\tprefix: 'index',\n\t\tbreakpoints: true,\n\t\tschema: './schema.ts',\n\t\tout: 'drizzle',\n\t\tbundle: true, // expo driver\n\t\tcasing: undefined,\n\t\tdriver: 'expo',\n\t});\n});\n\ntest('generate #9', async (t) => {\n\tconst res = await brotest(generate, '--config=durable-sqlite.config.ts');\n\tassert.equal(res.type, 'handler');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'sqlite',\n\t\tname: undefined,\n\t\tcustom: false,\n\t\tprefix: 'index',\n\t\tbreakpoints: true,\n\t\tschema: './schema.ts',\n\t\tout: 'drizzle',\n\t\tbundle: true, // expo driver\n\t\tcasing: undefined,\n\t\tdriver: 'durable-sqlite',\n\t});\n});\n\n// cli | pass through name, prefix and custom\ntest('generate #9', async (t) => {\n\tconst res = await brotest(\n\t\tgenerate,\n\t\t'--dialect=postgresql --schema=schema.ts --out=out --prefix=timestamp --name=custom --custom',\n\t);\n\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tname: 'custom',\n\t\tcustom: true,\n\t\tprefix: 'timestamp',\n\t\tbreakpoints: true,\n\t\tschema: 'schema.ts',\n\t\tout: 'out',\n\t\tbundle: false,\n\t\tcasing: undefined,\n\t\tdriver: undefined,\n\t});\n});\n\n// --- errors ---\ntest('err #1', async (t) => {\n\tconst res = await brotest(generate, '--schema=src/schema.ts');\n\tassert.equal(res.type, 'error');\n});\n\ntest('err #2', async (t) => {\n\tconst res = await brotest(generate, '--dialect=postgresql');\n\tassert.equal(res.type, 'error');\n});\n\ntest('err #3', async (t) => {\n\tconst res = await brotest(generate, '--dialect=postgresql2');\n\tassert.equal(res.type, 'error');\n});\n\ntest('err #4', async (t) => {\n\tconst res = await brotest(generate, '--driver=expo');\n\tassert.equal(res.type, 'error');\n});\n\ntest('err #5', async (t) => {\n\tconst res = await brotest(generate, '--dialect=postgresql --out=out');\n\tassert.equal(res.type, 'error');\n});\n\ntest('err #6', async (t) => {\n\tconst res = await brotest(generate, '--config=drizzle.config.ts --out=out');\n\tassert.equal(res.type, 'error');\n});\n\ntest('err #7', async (t) => {\n\tconst res = await brotest(generate, '--config=drizzle.config.ts --schema=schema.ts');\n\tassert.equal(res.type, 'error');\n});\n\ntest('err #8', async (t) => {\n\tconst res = await brotest(generate, '--config=drizzle.config.ts --dialect=postgresql');\n\tassert.equal(res.type, 'error');\n});\n"
  },
  {
    "path": "drizzle-kit/tests/cli-migrate.test.ts",
    "content": "import { test as brotest } from '@drizzle-team/brocli';\nimport { assert, expect, test } from 'vitest';\nimport { migrate } from '../src/cli/schema';\n\n// good:\n// #1 drizzle-kit generate\n// #2 drizzle-kit generate --config=turso.config.ts\n// #3 drizzle-kit generate --config=d1http.config.ts\n// #4 drizzle-kit generate --config=postgres.config.ts ## spread connection params\n// #5 drizzle-kit generate --config=drizzle2.config.ts ## custom schema and table for migrations journal\n\n// errors:\n// #1 drizzle-kit generate --config=expo.config.ts\n// TODO: missing required params in config?\n\ntest('migrate #1', async (t) => {\n\tconst res = await brotest(migrate, '');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tout: 'drizzle',\n\t\tcredentials: {\n\t\t\turl: 'postgresql://postgres:postgres@127.0.0.1:5432/db',\n\t\t},\n\t\tschema: undefined, // drizzle migrations table schema\n\t\ttable: undefined, // drizzle migrations table name\n\t});\n});\n\ntest('migrate #2', async (t) => {\n\tconst res = await brotest(migrate, '--config=turso.config.ts');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'turso',\n\t\tout: 'drizzle',\n\t\tcredentials: {\n\t\t\tauthToken: 'token',\n\t\t\turl: 'turso.dev',\n\t\t},\n\t\tschema: undefined, // drizzle migrations table schema\n\t\ttable: undefined, // drizzle migrations table name\n\t});\n});\n\ntest('migrate #3', async (t) => {\n\tconst res = await brotest(migrate, '--config=d1http.config.ts');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'sqlite',\n\t\tout: 'drizzle',\n\t\tcredentials: {\n\t\t\tdriver: 'd1-http',\n\t\t\taccountId: 'accid',\n\t\t\tdatabaseId: 'dbid',\n\t\t\ttoken: 'token',\n\t\t},\n\t\tschema: undefined, // drizzle migrations table schema\n\t\ttable: undefined, // drizzle migrations table name\n\t});\n});\n\ntest('migrate #4', async (t) => {\n\tconst res = await brotest(migrate, '--config=postgres.config.ts');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tout: 'drizzle',\n\t\tcredentials: {\n\t\t\tdatabase: 'db',\n\t\t\thost: '127.0.0.1',\n\t\t\tpassword: 'postgres',\n\t\t\tport: 5432,\n\t\t\tuser: 'postgresql',\n\t\t},\n\t\tschema: undefined, // drizzle migrations table schema\n\t\ttable: undefined, // drizzle migrations table name\n\t});\n});\n\n// catched a bug\ntest('migrate #5', async (t) => {\n\tconst res = await brotest(migrate, '--config=postgres2.config.ts');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tout: 'drizzle',\n\t\tcredentials: {\n\t\t\tdatabase: 'db',\n\t\t\thost: '127.0.0.1',\n\t\t\tpassword: 'postgres',\n\t\t\tport: 5432,\n\t\t\tuser: 'postgresql',\n\t\t},\n\t\tschema: 'custom', // drizzle migrations table schema\n\t\ttable: 'custom', // drizzle migrations table name\n\t});\n});\n\n// --- errors ---\ntest('err #1', async (t) => {\n\tconst res = await brotest(migrate, '--config=expo.config.ts');\n\tassert.equal(res.type, 'error');\n});\n"
  },
  {
    "path": "drizzle-kit/tests/cli-push.test.ts",
    "content": "import { test as brotest } from '@drizzle-team/brocli';\nimport { assert, expect, test } from 'vitest';\nimport { push } from '../src/cli/schema';\n\n// good:\n// #1 drizzle-kit push\n// #2 drizzle-kit push --config=turso.config.ts\n// #3 drizzle-kit push --config=d1http.config.ts\n// #4 drizzle-kit push --config=postgres.config.ts ## spread connection params\n// #5 drizzle-kit push --config=drizzle2.config.ts ## custom schema and table for migrations journal\n\n// errors:\n// #1 drizzle-kit push --config=expo.config.ts\n// TODO: missing required params in config?\n\ntest('push #1', async (t) => {\n\tconst res = await brotest(push, '');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tcredentials: {\n\t\t\turl: 'postgresql://postgres:postgres@127.0.0.1:5432/db',\n\t\t},\n\t\tforce: false,\n\t\tschemaPath: './schema.ts',\n\t\tschemasFilter: ['public'],\n\t\ttablesFilter: [],\n\t\tentities: undefined,\n\t\tstrict: false,\n\t\tverbose: false,\n\t\tcasing: undefined,\n\t});\n});\n\ntest('push #2', async (t) => {\n\tconst res = await brotest(push, '--config=turso.config.ts');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'turso',\n\t\tcredentials: {\n\t\t\tauthToken: 'token',\n\t\t\turl: 'turso.dev',\n\t\t},\n\t\tforce: false,\n\t\tschemaPath: './schema.ts',\n\t\tschemasFilter: ['public'],\n\t\ttablesFilter: [],\n\t\tstrict: false,\n\t\tverbose: false,\n\t\tcasing: undefined,\n\t});\n});\n\ntest('push #3', async (t) => {\n\tconst res = await brotest(push, '--config=d1http.config.ts');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'sqlite',\n\t\tcredentials: {\n\t\t\tdriver: 'd1-http',\n\t\t\taccountId: 'accid',\n\t\t\tdatabaseId: 'dbid',\n\t\t\ttoken: 'token',\n\t\t},\n\t\tforce: false,\n\t\tschemaPath: './schema.ts',\n\t\tschemasFilter: ['public'],\n\t\ttablesFilter: [],\n\t\tstrict: false,\n\t\tverbose: false,\n\t\tcasing: undefined,\n\t});\n});\n\ntest('push #4', async (t) => {\n\tconst res = await brotest(push, '--config=postgres.config.ts');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tcredentials: {\n\t\t\tdatabase: 'db',\n\t\t\thost: '127.0.0.1',\n\t\t\tpassword: 'postgres',\n\t\t\tport: 5432,\n\t\t\tuser: 'postgresql',\n\t\t},\n\t\tforce: false,\n\t\tschemaPath: './schema.ts',\n\t\tschemasFilter: ['public'],\n\t\ttablesFilter: [],\n\t\tentities: undefined,\n\t\tstrict: false,\n\t\tverbose: false,\n\t\tcasing: undefined,\n\t});\n});\n\n// catched a bug\ntest('push #5', async (t) => {\n\tconst res = await brotest(push, '--config=postgres2.config.ts');\n\tif (res.type !== 'handler') assert.fail(res.type, 'handler');\n\texpect(res.options).toStrictEqual({\n\t\tdialect: 'postgresql',\n\t\tcredentials: {\n\t\t\tdatabase: 'db',\n\t\t\thost: '127.0.0.1',\n\t\t\tpassword: 'postgres',\n\t\t\tport: 5432,\n\t\t\tuser: 'postgresql',\n\t\t},\n\t\tschemaPath: './schema.ts',\n\t\tschemasFilter: ['public'],\n\t\ttablesFilter: [],\n\t\tstrict: false,\n\t\tentities: undefined,\n\t\tforce: false,\n\t\tverbose: false,\n\t\tcasing: undefined,\n\t});\n});\n\n// --- errors ---\ntest('err #1', async (t) => {\n\tconst res = await brotest(push, '--config=expo.config.ts');\n\tassert.equal(res.type, 'error');\n});\n"
  },
  {
    "path": "drizzle-kit/tests/common.ts",
    "content": "import { test } from 'vitest';\n\nexport interface DialectSuite {\n\t/**\n\t * 1 statement | create column:\n\t *\n\t * id int primary key autoincrement\n\t */\n\tcolumns1(): Promise<void>;\n}\n\nexport const run = (suite: DialectSuite) => {\n\ttest('add columns #1', suite.columns1);\n};\n// test(\"add columns #1\", suite.columns1)\n"
  },
  {
    "path": "drizzle-kit/tests/indexes/common.ts",
    "content": "import { afterAll, beforeAll, test } from 'vitest';\n\nexport interface DialectSuite {\n\tsimpleIndex(context?: any): Promise<void>;\n\tvectorIndex(context?: any): Promise<void>;\n\tindexesToBeTriggered(context?: any): Promise<void>;\n}\n\nexport const run = (\n\tsuite: DialectSuite,\n\tbeforeAllFn?: (context: any) => Promise<void>,\n\tafterAllFn?: (context: any) => Promise<void>,\n) => {\n\tlet context: any = {};\n\tbeforeAll(beforeAllFn ? () => beforeAllFn(context) : () => {});\n\ttest('index #1: simple index', () => suite.simpleIndex(context));\n\ttest('index #2: vector index', () => suite.vectorIndex(context));\n\ttest('index #3: fields that should be triggered on generate and not triggered on push', () =>\n\t\tsuite.indexesToBeTriggered(context));\n\tafterAll(afterAllFn ? () => afterAllFn(context) : () => {});\n};\n"
  },
  {
    "path": "drizzle-kit/tests/indexes/pg.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { index, pgTable, serial, text, vector } from 'drizzle-orm/pg-core';\nimport { JsonCreateIndexStatement } from 'src/jsonStatements';\nimport { PgSquasher } from 'src/serializer/pgSchema';\nimport { diffTestSchemas } from 'tests/schemaDiffer';\nimport { expect } from 'vitest';\nimport { DialectSuite, run } from './common';\n\nconst pgSuite: DialectSuite = {\n\tasync vectorIndex() {\n\t\tconst schema1 = {\n\t\t\tusers: pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: vector('name', { dimensions: 3 }),\n\t\t\t}),\n\t\t};\n\n\t\tconst schema2 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'users',\n\t\t\t\t{\n\t\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\t\tembedding: vector('name', { dimensions: 3 }),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tindx2: index('vector_embedding_idx')\n\t\t\t\t\t\t.using('hnsw', t.embedding.op('vector_ip_ops'))\n\t\t\t\t\t\t.with({ m: 16, ef_construction: 64 }),\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemas(\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t[],\n\t\t);\n\n\t\texpect(statements.length).toBe(1);\n\t\texpect(statements[0]).toStrictEqual({\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_index_pg',\n\t\t\tdata: {\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tasc: true,\n\t\t\t\t\t\texpression: 'name',\n\t\t\t\t\t\tisExpression: false,\n\t\t\t\t\t\tnulls: 'last',\n\t\t\t\t\t\topclass: 'vector_ip_ops',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tconcurrently: false,\n\t\t\t\tisUnique: false,\n\t\t\t\tmethod: 'hnsw',\n\t\t\t\tname: 'vector_embedding_idx',\n\t\t\t\twhere: undefined,\n\t\t\t\twith: {\n\t\t\t\t\tef_construction: 64,\n\t\t\t\t\tm: 16,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t\texpect(sqlStatements.length).toBe(1);\n\t\texpect(sqlStatements[0]).toBe(\n\t\t\t`CREATE INDEX \"vector_embedding_idx\" ON \"users\" USING hnsw (\"name\" vector_ip_ops) WITH (m=16,ef_construction=64);`,\n\t\t);\n\t},\n\n\tasync indexesToBeTriggered() {\n\t\tconst schema1 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'users',\n\t\t\t\t{\n\t\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\t\tname: text('name'),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tindx: index('indx').on(t.name.desc()).concurrently(),\n\t\t\t\t\tindx1: index('indx1')\n\t\t\t\t\t\t.on(t.name.desc())\n\t\t\t\t\t\t.where(sql`true`),\n\t\t\t\t\tindx2: index('indx2')\n\t\t\t\t\t\t.on(t.name.op('text_ops'))\n\t\t\t\t\t\t.where(sql`true`),\n\t\t\t\t\tindx3: index('indx3')\n\t\t\t\t\t\t.on(sql`lower(name)`)\n\t\t\t\t\t\t.where(sql`true`),\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\n\t\tconst schema2 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'users',\n\t\t\t\t{\n\t\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\t\tname: text('name'),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tindx: index('indx').on(t.name.desc()),\n\t\t\t\t\tindx1: index('indx1')\n\t\t\t\t\t\t.on(t.name.desc())\n\t\t\t\t\t\t.where(sql`false`),\n\t\t\t\t\tindx2: index('indx2')\n\t\t\t\t\t\t.on(t.name.op('test'))\n\t\t\t\t\t\t.where(sql`true`),\n\t\t\t\t\tindx3: index('indx3')\n\t\t\t\t\t\t.on(sql`lower(${t.id})`)\n\t\t\t\t\t\t.where(sql`true`),\n\t\t\t\t\tindx4: index('indx4')\n\t\t\t\t\t\t.on(sql`lower(id)`)\n\t\t\t\t\t\t.where(sql`true`),\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemas(\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t[],\n\t\t);\n\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t'DROP INDEX \"indx\";',\n\t\t\t'DROP INDEX \"indx1\";',\n\t\t\t'DROP INDEX \"indx2\";',\n\t\t\t'DROP INDEX \"indx3\";',\n\t\t\t'CREATE INDEX \"indx4\" ON \"users\" USING btree (lower(id)) WHERE true;',\n\t\t\t'CREATE INDEX \"indx\" ON \"users\" USING btree (\"name\" DESC NULLS LAST);',\n\t\t\t'CREATE INDEX \"indx1\" ON \"users\" USING btree (\"name\" DESC NULLS LAST) WHERE false;',\n\t\t\t'CREATE INDEX \"indx2\" ON \"users\" USING btree (\"name\" test) WHERE true;',\n\t\t\t'CREATE INDEX \"indx3\" ON \"users\" USING btree (lower(\"id\")) WHERE true;',\n\t\t]);\n\t},\n\n\tasync simpleIndex() {\n\t\tconst schema1 = {\n\t\t\tusers: pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t}),\n\t\t};\n\n\t\tconst schema2 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'users',\n\t\t\t\t{\n\t\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\t\tname: text('name'),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tindx: index()\n\t\t\t\t\t\t.on(t.name.desc(), t.id.asc().nullsLast())\n\t\t\t\t\t\t.with({ fillfactor: 70 })\n\t\t\t\t\t\t.where(sql`select 1`),\n\t\t\t\t\tindx1: index('indx1')\n\t\t\t\t\t\t.using('hash', t.name.desc(), sql`${t.name}`)\n\t\t\t\t\t\t.with({ fillfactor: 70 }),\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemas(\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t[],\n\t\t);\n\n\t\texpect(statements.length).toBe(2);\n\t\texpect(statements[0]).toStrictEqual({\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_index_pg',\n\t\t\tdata: {\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tasc: false,\n\t\t\t\t\t\texpression: 'name',\n\t\t\t\t\t\tisExpression: false,\n\t\t\t\t\t\tnulls: 'last',\n\t\t\t\t\t\topclass: '',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tasc: true,\n\t\t\t\t\t\texpression: 'id',\n\t\t\t\t\t\tisExpression: false,\n\t\t\t\t\t\tnulls: 'last',\n\t\t\t\t\t\topclass: '',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tconcurrently: false,\n\t\t\t\tisUnique: false,\n\t\t\t\tmethod: 'btree',\n\t\t\t\tname: 'users_name_id_index',\n\t\t\t\twhere: 'select 1',\n\t\t\t\twith: {\n\t\t\t\t\tfillfactor: 70,\n\t\t\t\t},\n\t\t\t},\n\t\t\t// data: 'users_name_id_index;name,false,last,undefined,,id,true,last,undefined;false;false;btree;select 1;{\"fillfactor\":70}',\n\t\t});\n\t\texpect(statements[1]).toStrictEqual({\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_index_pg',\n\t\t\tdata: {\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tasc: false,\n\t\t\t\t\t\texpression: 'name',\n\t\t\t\t\t\tisExpression: false,\n\t\t\t\t\t\tnulls: 'last',\n\t\t\t\t\t\topclass: '',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tasc: true,\n\t\t\t\t\t\texpression: '\"name\"',\n\t\t\t\t\t\tisExpression: true,\n\t\t\t\t\t\tnulls: 'last',\n\t\t\t\t\t\topclass: '',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tconcurrently: false,\n\t\t\t\tisUnique: false,\n\t\t\t\tmethod: 'hash',\n\t\t\t\tname: 'indx1',\n\t\t\t\twhere: undefined,\n\t\t\t\twith: {\n\t\t\t\t\tfillfactor: 70,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t\texpect(sqlStatements.length).toBe(2);\n\t\texpect(sqlStatements[0]).toBe(\n\t\t\t`CREATE INDEX \"users_name_id_index\" ON \"users\" USING btree (\"name\" DESC NULLS LAST,\"id\") WITH (fillfactor=70) WHERE select 1;`,\n\t\t);\n\t\texpect(sqlStatements[1]).toBe(\n\t\t\t`CREATE INDEX \"indx1\" ON \"users\" USING hash (\"name\" DESC NULLS LAST,\"name\") WITH (fillfactor=70);`,\n\t\t);\n\t},\n};\n\nrun(pgSuite);\n"
  },
  {
    "path": "drizzle-kit/tests/introspect/gel.ext.test.ts",
    "content": "import Docker from 'dockerode';\nimport { drizzle, GelJsDatabase } from 'drizzle-orm/gel';\nimport fs from 'fs';\nimport createClient, { type Client } from 'gel';\nimport getPort from 'get-port';\nimport { introspectGelToFile } from 'tests/schemaDiffer';\nimport { v4 as uuidV4 } from 'uuid';\nimport { afterAll, beforeAll, expect, test } from 'vitest';\nimport 'zx/globals';\n\nif (!fs.existsSync('tests/introspect/gel')) {\n\tfs.mkdirSync('tests/introspect/gel');\n}\n\n$.quiet = true;\n\nconst ENABLE_LOGGING = false;\n\nlet client: Client;\nlet db: GelJsDatabase;\nconst tlsSecurity: string = 'insecure';\nlet dsn: string;\nlet container: Docker.Container | undefined;\n\nasync function createDockerDB(): Promise<{ connectionString: string; container: Docker.Container }> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 5656 });\n\tconst image = 'geldata/gel:6';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tconst gelContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: [\n\t\t\t'GEL_CLIENT_SECURITY=insecure_dev_mode',\n\t\t\t'GEL_SERVER_SECURITY=insecure_dev_mode',\n\t\t\t'GEL_CLIENT_TLS_SECURITY=no_host_verification',\n\t\t\t'GEL_SERVER_PASSWORD=password',\n\t\t],\n\t\tname: `drizzle-integration-tests-${uuidV4()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5656/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait gelContainer.start();\n\n\treturn { connectionString: `gel://admin:password@localhost:${port}/main`, container: gelContainer };\n}\n\nfunction sleep(ms: number) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['GEL_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['GEL_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr, container: contrainerObj } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t\tcontainer = contrainerObj;\n\t}\n\n\tawait sleep(15 * 1000);\n\tclient = createClient({ dsn: connectionString, tlsSecurity: 'insecure' });\n\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\n\tdsn = connectionString;\n});\n\nafterAll(async () => {\n\tawait client?.close().catch(console.error);\n\tawait container?.stop().catch(console.error);\n});\n\ntest('basic introspect test', async () => {\n\tawait $`pnpm gel query 'CREATE EXTENSION pgcrypto VERSION \"1.3\";\n  CREATE EXTENSION auth VERSION \"1.0\";\n  CREATE TYPE default::User {\n      CREATE REQUIRED LINK identity: ext::auth::Identity;\n      CREATE REQUIRED PROPERTY email: std::str;\n      CREATE REQUIRED PROPERTY username: std::str;\n  };\n  CREATE GLOBAL default::current_user := (std::assert_single((SELECT\n      default::User {\n          id,\n          username,\n          email\n      }\n  FILTER\n      (.identity = GLOBAL ext::auth::ClientTokenIdentity)\n  )));' --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\tconst path = await introspectGelToFile(\n\t\tclient,\n\t\t'basic-ext-introspect',\n\t\t['ext::auth', 'public'],\n\t);\n\n\tconst result = await $`pnpm exec tsc --noEmit --skipLibCheck ${path}`.nothrow(true);\n\texpect(result.exitCode).toBe(0);\n\tfs.rmSync(path);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/introspect/gel.test.ts",
    "content": "import Docker from 'dockerode';\nimport { drizzle, GelJsDatabase } from 'drizzle-orm/gel';\nimport fs from 'fs';\nimport createClient, { type Client } from 'gel';\nimport getPort from 'get-port';\nimport { introspectGelToFile } from 'tests/schemaDiffer';\nimport { v4 as uuidV4 } from 'uuid';\nimport { afterAll, beforeAll, expect, test } from 'vitest';\nimport 'zx/globals';\n\nif (!fs.existsSync('tests/introspect/gel')) {\n\tfs.mkdirSync('tests/introspect/gel');\n}\n\n$.quiet = true;\n\nconst ENABLE_LOGGING = false;\n\nlet client: Client;\nlet db: GelJsDatabase;\nconst tlsSecurity: string = 'insecure';\nlet dsn: string;\nlet container: Docker.Container | undefined;\n\nasync function createDockerDB(): Promise<{ connectionString: string; container: Docker.Container }> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 5656 });\n\tconst image = 'geldata/gel:6.0';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tconst gelContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: [\n\t\t\t'GEL_CLIENT_SECURITY=insecure_dev_mode',\n\t\t\t'GEL_SERVER_SECURITY=insecure_dev_mode',\n\t\t\t'GEL_CLIENT_TLS_SECURITY=no_host_verification',\n\t\t\t'GEL_SERVER_PASSWORD=password',\n\t\t],\n\t\tname: `drizzle-integration-tests-${uuidV4()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5656/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait gelContainer.start();\n\n\treturn { connectionString: `gel://admin:password@localhost:${port}/main`, container: gelContainer };\n}\n\nfunction sleep(ms: number) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['GEL_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['GEL_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr, container: contrainerObj } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t\tcontainer = contrainerObj;\n\t}\n\n\tawait sleep(15 * 1000);\n\tclient = createClient({ dsn: connectionString, tlsSecurity: 'insecure' });\n\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\n\tdsn = connectionString;\n});\n\nafterAll(async () => {\n\tawait client?.close().catch(console.error);\n\tawait container?.stop().catch(console.error);\n});\n\ntest('basic introspect test', async () => {\n\tawait $`pnpm gel query 'CREATE TYPE default::all_columns {\n\n\t\tcreate property stringColumn: str;\n\t\tcreate required property requiredStringColumn: str;\n\t\tcreate required property arrayRequiredStringColumn: array<str>;\n\t\tcreate property defaultStringColumn: str {\n\t\t\tSET DEFAULT := \"name\";\n\t\t};\n\n\t\tcreate property boolColumn:bool;\n\t\tcreate required property requiredBoolColumn: bool;\n\t\tcreate required property arrayRequiredBoolColumn: array<bool>;\n\t\tcreate property defaultBoolColumn: bool {\n\t\t\tSET DEFAULT := true;\n\t\t};\n\n\t\tcreate property int16Column:int16;\n\t\tcreate required property requiredint16Column: int16;\n\t\tcreate required property arrayRequiredint16Column: array<int16>;\n\t\tcreate property defaultint16Column: int16 {\n\t\t\tSET DEFAULT := 123;\n\t\t};\n\n\t\tcreate property int32Column:int32;\n\t\tcreate required property requiredint32Column: int32;\n\t\tcreate required property arrayRequiredint32Column: array<int32>;\n\t\tcreate property defaultint32Column: int32 {\n\t\t\tSET DEFAULT := 123;\n\t\t};\n\n\t\tcreate property int64Column:int64;\n\t\tcreate required property requiredint64Column: int64;\n\t\tcreate required property arrayRequiredint64Column: array<int64>;\n\t\tcreate property defaultint64Column: int64 {\n\t\t\tSET DEFAULT := 123;\n\t\t};\n\n\t\tcreate property float32Column:float32;\n\t\tcreate required property requiredfloat32Column: float32;\n\t\tcreate required property arrayRequiredfloat32Column: array<float32>;\n\t\tcreate property defaultfloat32Column: float32 {\n\t\t\tSET DEFAULT := 123.123;\n\t\t};\n\n\t\tcreate property float64Column:float64;\n\t\tcreate required property requiredfloat64Column: float64;\n\t\tcreate required property arrayRequiredfloat64Column: array<float64>;\n\t\tcreate property defaultfloat64Column: float64 {\n\t\t\tSET DEFAULT := 123.123;\n\t\t};\n\n\t\tcreate property bigintColumn:bigint;\n\t\tcreate required property requiredbigintColumn: bigint;\n\t\tcreate required property arrayRequiredbigintColumn: array<bigint>;\n\t\tcreate property defaultbigintColumn: bigint {\n\t\t\tSET DEFAULT := 123n;\n\t\t};\n\n\t\tcreate property decimalColumn:decimal;\n\t\tcreate required property requireddecimalColumn: decimal;\n\t\tcreate required property arrayRequireddecimalColumn: array<decimal>;\n\t\tcreate property defaultdecimalColumn: decimal {\n\t\t\tSET DEFAULT := 1.23n;\n\t\t};\n\n\t\tcreate property uuidColumn:uuid;\n\t\tcreate required property requireduuidColumn: uuid;\n\t\tcreate required property arrayRequireduuidColumn: array<uuid>;\n\t\tcreate property defaultuuidColumn: uuid {\n\t\t\tSET DEFAULT := uuid_generate_v4();\n\t\t};\n\n\t\tcreate property jsonColumn:json;\n\t\tcreate required property requiredjsonColumn: json;\n\t\tcreate required property arrayRequiredjsonColumn: array<json>;\n\t\tcreate property defaultjsonColumn: json {\n\t\t\tSET DEFAULT := <json>[1, 2];\n\t\t};\n\n\t\tcreate property datetimeColumn:datetime;\n\t\tcreate required property requireddatetimeColumn: datetime;\n\t\tcreate required property arrayRequireddatetimeColumn: array<datetime>;\n\t\tcreate property defaultdatetimeColumn: datetime {\n\t\t\tSET DEFAULT := <std::datetime>\"2018-05-07T15:01:22.306916+00\";\n\t\t};\n\n\t\tcreate property local_datetimeColumn:cal::local_datetime;\n\t\tcreate required property requiredlocal_datetimeColumn: cal::local_datetime;\n\t\tcreate required property arrayRequiredlocal_datetimeColumn: array<cal::local_datetime>;\n\t\tcreate property defaultlocal_datetimeColumn: cal::local_datetime {\n\t\t\tSET DEFAULT := <cal::local_datetime>\"2018-05-07T15:01:22.306916\";\n\t\t};\n\n\t\tcreate property local_dateColumn:cal::local_date;\n\t\tcreate required property requiredlocal_dateColumn: cal::local_date;\n\t\tcreate required property arrayRequiredlocal_dateColumn: array<cal::local_date>;\n\t\tcreate property defaultlocal_dateColumn: cal::local_date {\n\t\t\tSET DEFAULT := <cal::local_date>\"2018-05-07\";\n\t\t};\n\n\t\tcreate property local_timeColumn:cal::local_time;\n\t\tcreate required property requiredlocal_timeColumn: cal::local_time;\n\t\tcreate required property arrayRequiredlocal_timeColumn: array<cal::local_time>;\n\t\tcreate property defaultlocal_timeColumn: cal::local_time {\n\t\t\tSET DEFAULT := <cal::local_time>\"15:01:22.306916\";\n\t\t};\n\n\t\tcreate property durationColumn:duration;\n\t\tcreate required property requireddurationColumn: duration;\n\t\tcreate required property arrayRequireddurationColumn: array<duration>;\n\t\tcreate property defaultdurationColumn: duration {\n\t\t\tSET DEFAULT := <duration>\"45.6 seconds\";\n\t\t};\n\n\t\tcreate property relative_durationColumn:cal::relative_duration;\n\t\tcreate required property requiredrelative_durationColumn: cal::relative_duration;\n\t\tcreate required property arrayRequiredrelative_durationColumn: array<cal::relative_duration>;\n\t\tcreate property defaultrelative_durationColumn: cal::relative_duration {\n\t\t\tSET DEFAULT := <cal::relative_duration>\"1 year\";\n\t\t};\n\n\t\tcreate property dateDurationColumn:cal::date_duration;\n\t\tcreate required property requireddate_durationColumn: cal::date_duration;\n\t\tcreate required property arrayRequireddate_durationColumn: array<cal::date_duration>;\n\t\tcreate property defaultdate_durationColumn: cal::date_duration {\n\t\t\tSET DEFAULT := <cal::date_duration>\"5 days\";\n\t\t};\n\n\t\tcreate property bytesColumn:bytes;\n\t\tcreate required property requiredbytesColumn:bytes;\n\t\tcreate required property arrayRequiredbytesColumn: array<bytes>;\n\t\tcreate property defaultbytesColumn: bytes {\n\t\t\tSET DEFAULT := b\"Hello, world\";\n\t\t};\n\t}' --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\tconst path = await introspectGelToFile(\n\t\tclient,\n\t\t'basic-introspect',\n\t);\n\n\tconst result = await $`pnpm exec tsc --noEmit --skipLibCheck ${path}`.nothrow(true);\n\texpect(result.exitCode).toBe(0);\n\tfs.rmSync(path);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/introspect/libsql.test.ts",
    "content": "import { createClient } from '@libsql/client';\nimport { sql } from 'drizzle-orm';\nimport { int, sqliteTable, sqliteView } from 'drizzle-orm/sqlite-core';\nimport fs from 'fs';\nimport { introspectLibSQLToFile, introspectMySQLToFile, introspectSQLiteToFile } from 'tests/schemaDiffer';\nimport { expect, test } from 'vitest';\n\nif (!fs.existsSync('tests/introspect/libsql')) {\n\tfs.mkdirSync('tests/introspect/libsql');\n}\n\ntest('view #1', async () => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst users = sqliteTable('users', { id: int('id') });\n\tconst testView = sqliteView('some_view', { id: int('id') }).as(\n\t\tsql`SELECT * FROM ${users}`,\n\t);\n\n\tconst schema = {\n\t\tusers: users,\n\t\ttestView,\n\t};\n\n\tconst { statements, sqlStatements } = await introspectLibSQLToFile(\n\t\tturso,\n\t\tschema,\n\t\t'view-1',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/introspect/mysql.test.ts",
    "content": "import 'dotenv/config';\nimport Docker from 'dockerode';\nimport { SQL, sql } from 'drizzle-orm';\nimport {\n\tbigint,\n\tchar,\n\tcheck,\n\tdecimal,\n\tdouble,\n\tfloat,\n\tint,\n\tmediumint,\n\tmysqlEnum,\n\tmysqlTable,\n\tmysqlView,\n\tserial,\n\tsmallint,\n\ttext,\n\ttinyint,\n\tvarchar,\n} from 'drizzle-orm/mysql-core';\nimport * as fs from 'fs';\nimport getPort from 'get-port';\nimport { Connection, createConnection } from 'mysql2/promise';\nimport { introspectMySQLToFile } from 'tests/schemaDiffer';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\n\nlet client: Connection;\nlet mysqlContainer: Docker.Container;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'mysql:8';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tmysqlContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait mysqlContainer.start();\n\n\treturn `mysql://root:mysql@127.0.0.1:${port}/drizzle`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env.MYSQL_CONNECTION_STRING ?? await createDockerDB();\n\n\tconst sleep = 1000;\n\tlet timeLeft = 20000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = await createConnection(connectionString);\n\t\t\tawait client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to MySQL');\n\t\tawait client?.end().catch(console.error);\n\t\tawait mysqlContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait mysqlContainer?.stop().catch(console.error);\n});\n\nbeforeEach(async () => {\n\tawait client.query(`drop database if exists \\`drizzle\\`;`);\n\tawait client.query(`create database \\`drizzle\\`;`);\n\tawait client.query(`use \\`drizzle\\`;`);\n});\n\nif (!fs.existsSync('tests/introspect/mysql')) {\n\tfs.mkdirSync('tests/introspect/mysql');\n}\n\ntest('generated always column: link to another column', async () => {\n\tconst schema = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\temail: text('email'),\n\t\t\tgeneratedEmail: text('generatedEmail').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`\\`email\\``,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectMySQLToFile(\n\t\tclient,\n\t\tschema,\n\t\t'generated-link-column',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('generated always column virtual: link to another column', async () => {\n\tconst schema = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\temail: text('email'),\n\t\t\tgeneratedEmail: text('generatedEmail').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`\\`email\\``,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectMySQLToFile(\n\t\tclient,\n\t\tschema,\n\t\t'generated-link-column-virtual',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('Default value of character type column: char', async () => {\n\tconst schema = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tsortKey: char('sortKey', { length: 255 }).default('0'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectMySQLToFile(\n\t\tclient,\n\t\tschema,\n\t\t'default-value-char-column',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('Default value of character type column: varchar', async () => {\n\tconst schema = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tsortKey: varchar('sortKey', { length: 255 }).default('0'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectMySQLToFile(\n\t\tclient,\n\t\tschema,\n\t\t'default-value-varchar-column',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect checks', async () => {\n\tconst schema = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id'),\n\t\t\tname: varchar('name', { length: 255 }),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tsomeCheck: check('some_check', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectMySQLToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-checks',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('view #1', async () => {\n\tconst users = mysqlTable('users', { id: int('id') });\n\tconst testView = mysqlView('some_view', { id: int('id') }).as(\n\t\tsql`select \\`drizzle\\`.\\`users\\`.\\`id\\` AS \\`id\\` from \\`drizzle\\`.\\`users\\``,\n\t);\n\n\tconst schema = {\n\t\tusers: users,\n\t\ttestView,\n\t};\n\n\tconst { statements, sqlStatements } = await introspectMySQLToFile(\n\t\tclient,\n\t\tschema,\n\t\t'view-1',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('view #2', async () => {\n\tconst users = mysqlTable('some_users', { id: int('id') });\n\tconst testView = mysqlView('some_view', { id: int('id') }).algorithm('temptable').sqlSecurity('definer').as(\n\t\tsql`SELECT * FROM ${users}`,\n\t);\n\n\tconst schema = {\n\t\tusers: users,\n\t\ttestView,\n\t};\n\n\tconst { statements, sqlStatements } = await introspectMySQLToFile(\n\t\tclient,\n\t\tschema,\n\t\t'view-2',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('handle float type', async () => {\n\tconst schema = {\n\t\ttable: mysqlTable('table', {\n\t\t\tcol1: float(),\n\t\t\tcol2: float({ precision: 2 }),\n\t\t\tcol3: float({ precision: 2, scale: 1 }),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectMySQLToFile(\n\t\tclient,\n\t\tschema,\n\t\t'handle-float-type',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('handle unsigned numerical types', async () => {\n\tconst schema = {\n\t\ttable: mysqlTable('table', {\n\t\t\tcol1: int({ unsigned: true }),\n\t\t\tcol2: tinyint({ unsigned: true }),\n\t\t\tcol3: smallint({ unsigned: true }),\n\t\t\tcol4: mediumint({ unsigned: true }),\n\t\t\tcol5: bigint({ mode: 'number', unsigned: true }),\n\t\t\tcol6: float({ unsigned: true }),\n\t\t\tcol7: float({ precision: 2, scale: 1, unsigned: true }),\n\t\t\tcol8: double({ unsigned: true }),\n\t\t\tcol9: double({ precision: 2, scale: 1, unsigned: true }),\n\t\t\tcol10: decimal({ unsigned: true }),\n\t\t\tcol11: decimal({ precision: 2, scale: 1, unsigned: true }),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectMySQLToFile(\n\t\tclient,\n\t\tschema,\n\t\t'handle-unsigned-numerical-types',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('instrospect strings with single quotes', async () => {\n\tconst schema = {\n\t\tcolumns: mysqlTable('columns', {\n\t\t\tenum: mysqlEnum('my_enum', ['escape\\'s quotes \"', 'escape\\'s quotes 2 \"']).default('escape\\'s quotes \"'),\n\t\t\ttext: text('text').default('escape\\'s quotes \" '),\n\t\t\tvarchar: varchar('varchar', { length: 255 }).default('escape\\'s quotes \" '),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectMySQLToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-strings-with-single-quotes',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n\n\tawait client.query(`drop table columns;`);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/introspect/pg.test.ts",
    "content": "import { PGlite } from '@electric-sql/pglite';\nimport { SQL, sql } from 'drizzle-orm';\nimport {\n\tbigint,\n\tbigserial,\n\tboolean,\n\tchar,\n\tcheck,\n\tcidr,\n\tdate,\n\tdoublePrecision,\n\tindex,\n\tinet,\n\tinteger,\n\tinterval,\n\tjson,\n\tjsonb,\n\tmacaddr,\n\tmacaddr8,\n\tnumeric,\n\tpgEnum,\n\tpgMaterializedView,\n\tpgPolicy,\n\tpgRole,\n\tpgSchema,\n\tpgTable,\n\tpgView,\n\treal,\n\tserial,\n\tsmallint,\n\tsmallserial,\n\ttext,\n\ttime,\n\ttimestamp,\n\tuuid,\n\tvarchar,\n} from 'drizzle-orm/pg-core';\nimport fs from 'fs';\nimport { introspectPgToFile } from 'tests/schemaDiffer';\nimport { expect, test } from 'vitest';\n\nif (!fs.existsSync('tests/introspect/postgres')) {\n\tfs.mkdirSync('tests/introspect/postgres');\n}\n\ntest('basic introspect test', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').notNull(),\n\t\t\temail: text('email'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'basic-introspect',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('basic identity always test', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedAlwaysAsIdentity(),\n\t\t\temail: text('email'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'basic-identity-always-introspect',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('basic identity by default test', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\t\temail: text('email'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'basic-identity-default-introspect',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('basic index test', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tfirstName: text('first_name'),\n\t\t\tlastName: text('last_name'),\n\t\t\tdata: jsonb('data'),\n\t\t}, (table) => ({\n\t\t\tsingleColumn: index('single_column').on(table.firstName),\n\t\t\tmultiColumn: index('multi_column').on(table.firstName, table.lastName),\n\t\t\tsingleExpression: index('single_expression').on(sql`lower(${table.firstName})`),\n\t\t\tmultiExpression: index('multi_expression').on(sql`lower(${table.firstName})`, sql`lower(${table.lastName})`),\n\t\t\texpressionWithComma: index('expression_with_comma').on(\n\t\t\t\tsql`(lower(${table.firstName}) || ', '::text || lower(${table.lastName}))`,\n\t\t\t),\n\t\t\texpressionWithDoubleQuote: index('expression_with_double_quote').on(sql`('\"'::text || ${table.firstName})`),\n\t\t\texpressionWithJsonbOperator: index('expression_with_jsonb_operator').on(\n\t\t\t\tsql`(${table.data} #>> '{a,b,1}'::text[])`,\n\t\t\t),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'basic-index-introspect',\n\t);\n\n\texpect(statements.length).toBe(10);\n\texpect(sqlStatements.length).toBe(10);\n});\n\ntest('identity always test: few params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedAlwaysAsIdentity({\n\t\t\t\tstartWith: 100,\n\t\t\t\tname: 'custom_name',\n\t\t\t}),\n\t\t\temail: text('email'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'identity-always-few-params-introspect',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('identity by default test: few params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tmaxValue: 10000,\n\t\t\t\tname: 'custom_name',\n\t\t\t}),\n\t\t\temail: text('email'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'identity-default-few-params-introspect',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('identity always test: all params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedAlwaysAsIdentity({\n\t\t\t\tstartWith: 10,\n\t\t\t\tincrement: 4,\n\t\t\t\tminValue: 10,\n\t\t\t\tmaxValue: 10000,\n\t\t\t\tcache: 100,\n\t\t\t\tcycle: true,\n\t\t\t}),\n\t\t\temail: text('email'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'identity-always-all-params-introspect',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('identity by default test: all params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tstartWith: 10,\n\t\t\t\tincrement: 4,\n\t\t\t\tminValue: 10,\n\t\t\t\tmaxValue: 10000,\n\t\t\t\tcache: 100,\n\t\t\t\tcycle: true,\n\t\t\t}),\n\t\t\temail: text('email'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'identity-default-all-params-introspect',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('generated column: link to another column', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedAlwaysAsIdentity(),\n\t\t\temail: text('email'),\n\t\t\tgeneratedEmail: text('generatedEmail').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`email`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'generated-link-column',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('instrospect all column types', async () => {\n\tconst client = new PGlite();\n\n\tconst myEnum = pgEnum('my_enum', ['a', 'b', 'c']);\n\tconst schema = {\n\t\tenum_: myEnum,\n\t\t// NOTE: Types from extensions aren't tested due to PGlite not supporting at the moment\n\t\tcolumns: pgTable('columns', {\n\t\t\tenum: myEnum('my_enum').default('a'),\n\t\t\tsmallint: smallint('smallint').default(10),\n\t\t\tinteger: integer('integer').default(10),\n\t\t\tnumeric: numeric('numeric', { precision: 3, scale: 1 }).default('99.9'),\n\t\t\tnumeric2: numeric('numeric2', { precision: 1, scale: 1 }).default('99.9'),\n\t\t\tnumeric3: numeric('numeric3').default('99.9'),\n\t\t\tbigint: bigint('bigint', { mode: 'number' }).default(100),\n\t\t\tboolean: boolean('boolean').default(true),\n\t\t\ttext: text('test').default('abc'),\n\t\t\tvarchar: varchar('varchar', { length: 25 }).default('abc'),\n\t\t\tchar: char('char', { length: 3 }).default('abc'),\n\t\t\tserial: serial('serial'),\n\t\t\tbigserial: bigserial('bigserial', { mode: 'number' }),\n\t\t\tsmallserial: smallserial('smallserial'),\n\t\t\tdoublePrecision: doublePrecision('doublePrecision').default(100),\n\t\t\treal: real('real').default(100),\n\t\t\tjson: json('json').$type<{ attr: string }>().default({ attr: 'value' }),\n\t\t\tjsonb: jsonb('jsonb').$type<{ attr: string }>().default({ attr: 'value' }),\n\t\t\ttime1: time('time1').default('00:00:00'),\n\t\t\ttime2: time('time2').defaultNow(),\n\t\t\ttimestamp1: timestamp('timestamp1', { withTimezone: true, precision: 6 }).default(new Date()),\n\t\t\ttimestamp2: timestamp('timestamp2', { withTimezone: true, precision: 6 }).defaultNow(),\n\t\t\ttimestamp3: timestamp('timestamp3', { withTimezone: true, precision: 6 }).default(\n\t\t\t\tsql`timezone('utc'::text, now())`,\n\t\t\t),\n\t\t\tdate1: date('date1').default('2024-01-01'),\n\t\t\tdate2: date('date2').defaultNow(),\n\t\t\tdate3: date('date3').default(sql`CURRENT_TIMESTAMP`),\n\t\t\tuuid1: uuid('uuid1').default('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'),\n\t\t\tuuid2: uuid('uuid2').defaultRandom(),\n\t\t\tinet: inet('inet').default('127.0.0.1'),\n\t\t\tcidr: cidr('cidr').default('127.0.0.1/32'),\n\t\t\tmacaddr: macaddr('macaddr').default('00:00:00:00:00:00'),\n\t\t\tmacaddr8: macaddr8('macaddr8').default('00:00:00:ff:fe:00:00:00'),\n\t\t\tinterval: interval('interval').default('1 day 01:00:00'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-all-columns-types',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('instrospect all column array types', async () => {\n\tconst client = new PGlite();\n\n\tconst myEnum = pgEnum('my_enum', ['a', 'b', 'c']);\n\tconst schema = {\n\t\tenum_: myEnum,\n\t\t// NOTE: Types from extensions aren't tested due to PGlite not supporting at the moment\n\t\tcolumns: pgTable('columns', {\n\t\t\tenum: myEnum('my_enum').array().default(['a', 'b']),\n\t\t\tsmallint: smallint('smallint').array().default([10, 20]),\n\t\t\tinteger: integer('integer').array().default([10, 20]),\n\t\t\tnumeric: numeric('numeric', { precision: 3, scale: 1 }).array().default(['99.9', '88.8']),\n\t\t\tbigint: bigint('bigint', { mode: 'number' }).array().default([100, 200]),\n\t\t\tboolean: boolean('boolean').array().default([true, false]),\n\t\t\ttext: text('test').array().default(['abc', 'def']),\n\t\t\tvarchar: varchar('varchar', { length: 25 }).array().default(['abc', 'def']),\n\t\t\tchar: char('char', { length: 3 }).array().default(['abc', 'def']),\n\t\t\tdoublePrecision: doublePrecision('doublePrecision').array().default([100, 200]),\n\t\t\treal: real('real').array().default([100, 200]),\n\t\t\tjson: json('json').$type<{ attr: string }>().array().default([{ attr: 'value1' }, { attr: 'value2' }]),\n\t\t\tjsonb: jsonb('jsonb').$type<{ attr: string }>().array().default([{ attr: 'value1' }, { attr: 'value2' }]),\n\t\t\ttime: time('time').array().default(['00:00:00', '01:00:00']),\n\t\t\ttimestamp: timestamp('timestamp', { withTimezone: true, precision: 6 })\n\t\t\t\t.array()\n\t\t\t\t.default([new Date(), new Date()]),\n\t\t\tdate: date('date').array().default(['2024-01-01', '2024-01-02']),\n\t\t\tuuid: uuid('uuid').array().default([\n\t\t\t\t'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',\n\t\t\t\t'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12',\n\t\t\t]),\n\t\t\tinet: inet('inet').array().default(['127.0.0.1', '127.0.0.2']),\n\t\t\tcidr: cidr('cidr').array().default(['127.0.0.1/32', '127.0.0.2/32']),\n\t\t\tmacaddr: macaddr('macaddr').array().default(['00:00:00:00:00:00', '00:00:00:00:00:01']),\n\t\t\tmacaddr8: macaddr8('macaddr8').array().default(['00:00:00:ff:fe:00:00:00', '00:00:00:ff:fe:00:00:01']),\n\t\t\tinterval: interval('interval').array().default(['1 day 01:00:00', '1 day 02:00:00']),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-all-columns-array-types',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect columns with name with non-alphanumeric characters', async () => {\n\tconst client = new PGlite();\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\t'not:allowed': integer('not:allowed'),\n\t\t\t'nuh--uh': integer('nuh-uh'),\n\t\t\t'1_nope': integer('1_nope'),\n\t\t\tvalid: integer('valid'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-column-with-name-with-non-alphanumeric-characters',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect enum from different schema', async () => {\n\tconst client = new PGlite();\n\n\tconst schema2 = pgSchema('schema2');\n\tconst myEnumInSchema2 = schema2.enum('my_enum', ['a', 'b', 'c']);\n\tconst schema = {\n\t\tschema2,\n\t\tmyEnumInSchema2,\n\t\tusers: pgTable('users', {\n\t\t\tcol: myEnumInSchema2('col'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-enum-from-different-schema',\n\t\t['public', 'schema2'],\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect enum with same names across different schema', async () => {\n\tconst client = new PGlite();\n\n\tconst schema2 = pgSchema('schema2');\n\tconst myEnumInSchema2 = schema2.enum('my_enum', ['a', 'b', 'c']);\n\tconst myEnum = pgEnum('my_enum', ['a', 'b', 'c']);\n\tconst schema = {\n\t\tschema2,\n\t\tmyEnumInSchema2,\n\t\tmyEnum,\n\t\tusers: pgTable('users', {\n\t\t\tcol1: myEnumInSchema2('col1'),\n\t\t\tcol2: myEnum('col2'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-enum-with-same-names-across-different-schema',\n\t\t['public', 'schema2'],\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect enum with similar name to native type', async () => {\n\tconst client = new PGlite();\n\n\tconst timeLeft = pgEnum('time_left', ['short', 'medium', 'long']);\n\tconst schema = {\n\t\ttimeLeft,\n\t\tauction: pgTable('auction', {\n\t\t\tcol: timeLeft('col1'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-enum-with-similar-name-to-native-type',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('instrospect strings with single quotes', async () => {\n\tconst client = new PGlite();\n\n\tconst myEnum = pgEnum('my_enum', ['escape\\'s quotes \" ']);\n\tconst schema = {\n\t\tenum_: myEnum,\n\t\tcolumns: pgTable('columns', {\n\t\t\tenum: myEnum('my_enum').default('escape\\'s quotes \" '),\n\t\t\ttext: text('text').default('escape\\'s quotes \" '),\n\t\t\tvarchar: varchar('varchar').default('escape\\'s quotes \" '),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-strings-with-single-quotes',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect checks', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id'),\n\t\t\tname: varchar('name'),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tsomeCheck: check('some_check', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-checks',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect checks from different schemas with same names', async () => {\n\tconst client = new PGlite();\n\n\tconst mySchema = pgSchema('schema2');\n\tconst schema = {\n\t\tmySchema,\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id'),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tsomeCheck: check('some_check', sql`${table.age} > 21`),\n\t\t})),\n\t\tusersInMySchema: mySchema.table('users', {\n\t\t\tid: serial('id'),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tsomeCheck: check('some_check', sql`${table.age} < 1`),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-checks-diff-schema-same-names',\n\t\t['public', 'schema2'],\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect view #1', async () => {\n\tconst client = new PGlite();\n\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey().notNull(),\n\t\tname: varchar('users'),\n\t});\n\n\tconst view = pgView('some_view').as((qb) => qb.select().from(users));\n\tconst schema = {\n\t\tview,\n\t\tusers,\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-view',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect view #2', async () => {\n\tconst client = new PGlite();\n\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey().notNull(),\n\t\tname: varchar('users'),\n\t});\n\n\tconst view = pgView('some_view', { id: integer('asd') }).with({ checkOption: 'cascaded' }).as(\n\t\tsql`SELECT * FROM ${users}`,\n\t);\n\tconst schema = {\n\t\tview,\n\t\tusers,\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-view-2',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect view in other schema', async () => {\n\tconst client = new PGlite();\n\n\tconst newSchema = pgSchema('new_schema');\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey().notNull(),\n\t\tname: varchar('users'),\n\t});\n\n\tconst view = newSchema.view('some_view', { id: integer('asd') }).with({ checkOption: 'cascaded' }).as(\n\t\tsql`SELECT * FROM ${users}`,\n\t);\n\tconst schema = {\n\t\tview,\n\t\tusers,\n\t\tnewSchema,\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-view-in-other-schema',\n\t\t['new_schema'],\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect materialized view in other schema', async () => {\n\tconst client = new PGlite();\n\n\tconst newSchema = pgSchema('new_schema');\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey().notNull(),\n\t\tname: varchar('users'),\n\t});\n\n\tconst view = newSchema.materializedView('some_view', { id: integer('asd') }).with({ autovacuumEnabled: true }).as(\n\t\tsql`SELECT * FROM ${users}`,\n\t);\n\tconst schema = {\n\t\tview,\n\t\tusers,\n\t\tnewSchema,\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-mat-view-in-other-schema',\n\t\t['new_schema'],\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect materialized view #1', async () => {\n\tconst client = new PGlite();\n\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey().notNull(),\n\t\tname: varchar('users'),\n\t});\n\n\tconst view = pgMaterializedView('some_view').using('heap').withNoData().as((qb) => qb.select().from(users));\n\tconst schema = {\n\t\tview,\n\t\tusers,\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-materialized-view',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect materialized view #2', async () => {\n\tconst client = new PGlite();\n\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey().notNull(),\n\t\tname: varchar('users'),\n\t});\n\n\tconst view = pgMaterializedView('some_view', { id: integer('asd') }).with({ autovacuumFreezeMinAge: 1 }).as(\n\t\tsql`SELECT * FROM ${users}`,\n\t);\n\tconst schema = {\n\t\tview,\n\t\tusers,\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'introspect-materialized-view-2',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('basic policy', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test'),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'basic-policy',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('basic policy with \"as\"', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'basic-policy-as',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest.todo('basic policy with CURRENT_USER role', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { to: 'current_user' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'basic-policy',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('basic policy with all fields except \"using\" and \"with\"', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive', for: 'all', to: ['postgres'] }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'basic-policy-all-fields',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('basic policy with \"using\" and \"with\"', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { using: sql`true`, withCheck: sql`true` }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'basic-policy-using-withcheck',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('multiple policies', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { using: sql`true`, withCheck: sql`true` }),\n\t\t\trlsPolicy: pgPolicy('newRls'),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'multiple-policies',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('multiple policies with roles', async () => {\n\tconst client = new PGlite();\n\n\tclient.query(`CREATE ROLE manager;`);\n\n\tconst schema = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { using: sql`true`, withCheck: sql`true` }),\n\t\t\trlsPolicy: pgPolicy('newRls', { to: ['postgres', 'manager'] }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'multiple-policies-with-roles',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('basic roles', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusersRole: pgRole('user'),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'basic-roles',\n\t\t['public'],\n\t\t{ roles: { include: ['user'] } },\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('role with properties', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusersRole: pgRole('user', { inherit: false, createDb: true, createRole: true }),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'roles-with-properties',\n\t\t['public'],\n\t\t{ roles: { include: ['user'] } },\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('role with a few properties', async () => {\n\tconst client = new PGlite();\n\n\tconst schema = {\n\t\tusersRole: pgRole('user', { inherit: false, createRole: true }),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'roles-with-few-properties',\n\t\t['public'],\n\t\t{ roles: { include: ['user'] } },\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('multiple policies with roles from schema', async () => {\n\tconst client = new PGlite();\n\n\tconst usersRole = pgRole('user_role', { inherit: false, createRole: true });\n\n\tconst schema = {\n\t\tusersRole,\n\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { using: sql`true`, withCheck: sql`true` }),\n\t\t\trlsPolicy: pgPolicy('newRls', { to: ['postgres', usersRole] }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectPgToFile(\n\t\tclient,\n\t\tschema,\n\t\t'multiple-policies-with-roles-from-schema',\n\t\t['public'],\n\t\t{ roles: { include: ['user_role'] } },\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/introspect/singlestore.test.ts",
    "content": "import Docker from 'dockerode';\nimport 'dotenv/config';\nimport { SQL, sql } from 'drizzle-orm';\nimport {\n\tbigint,\n\tchar,\n\tdecimal,\n\tdouble,\n\tfloat,\n\tint,\n\tmediumint,\n\tsinglestoreTable,\n\tsmallint,\n\ttext,\n\ttinyint,\n\tvarchar,\n} from 'drizzle-orm/singlestore-core';\nimport * as fs from 'fs';\nimport getPort from 'get-port';\nimport { Connection, createConnection } from 'mysql2/promise';\nimport { introspectSingleStoreToFile } from 'tests/schemaDiffer';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\n\nlet client: Connection;\nlet singlestoreContainer: Docker.Container;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'ghcr.io/singlestore-labs/singlestoredb-dev:latest';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tsinglestoreContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['ROOT_PASSWORD=singlestore'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait singlestoreContainer.start();\n\tawait new Promise((resolve) => setTimeout(resolve, 4000));\n\n\treturn `singlestore://root:singlestore@localhost:${port}/`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env.SINGLESTORE_CONNECTION_STRING ?? await createDockerDB();\n\n\tconst sleep = 1000;\n\tlet timeLeft = 20000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = await createConnection(connectionString);\n\t\t\tawait client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to SingleStore');\n\t\tawait client?.end().catch(console.error);\n\t\tawait singlestoreContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait singlestoreContainer?.stop().catch(console.error);\n});\n\nbeforeEach(async () => {\n\tawait client.query(`drop database if exists \\`drizzle\\`;`);\n\tawait client.query(`create database \\`drizzle\\`;`);\n\tawait client.query(`use \\`drizzle\\`;`);\n});\n\nif (!fs.existsSync('tests/introspect/singlestore')) {\n\tfs.mkdirSync('tests/introspect/singlestore');\n}\n\n// TODO: Unskip this test when generated column is implemented\n/* test.skip('generated always column: link to another column', async () => {\n\tconst schema = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\temail: text('email'),\n\t\t\tgeneratedEmail: text('generatedEmail').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`\\`email\\``,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectSingleStoreToFile(\n\t\tclient,\n\t\tschema,\n\t\t'generated-link-column',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n}); */\n\n// TODO: Unskip this test when generated column is implemented\n/* test.skip('generated always column virtual: link to another column', async () => {\n\tconst schema = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\temail: text('email'),\n\t\t\tgeneratedEmail: text('generatedEmail').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`\\`email\\``,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectSingleStoreToFile(\n\t\tclient,\n\t\tschema,\n\t\t'generated-link-column-virtual',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n}); */\n\ntest('Default value of character type column: char', async () => {\n\tconst schema = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tsortKey: char('sortKey', { length: 255 }).default('0'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectSingleStoreToFile(\n\t\tclient,\n\t\tschema,\n\t\t'default-value-char-column',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('Default value of character type column: varchar', async () => {\n\tconst schema = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tsortKey: varchar('sortKey', { length: 255 }).default('0'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectSingleStoreToFile(\n\t\tclient,\n\t\tschema,\n\t\t'default-value-varchar-column',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\n// TODO: Unskip this test when views are implemented\n/* test('view #1', async () => {\n\tconst users = singlestoreTable('users', { id: int('id') });\n\tconst testView = singlestoreView('some_view', { id: int('id') }).as(\n\t\tsql`select \\`drizzle\\`.\\`users\\`.\\`id\\` AS \\`id\\` from \\`drizzle\\`.\\`users\\``,\n\t);\n\n\tconst schema = {\n\t\tusers: users,\n\t\ttestView,\n\t};\n\n\tconst { statements, sqlStatements } = await introspectSingleStoreToFile(\n\t\tclient,\n\t\tschema,\n\t\t'view-1',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n}); */\n\n// TODO: Unskip this test when views are implemented\n/* test('view #2', async () => {\n\tconst users = singlestoreTable('some_users', { id: int('id') });\n\tconst testView = singlestoreView('some_view', { id: int('id') }).algorithm('temptable').sqlSecurity('definer').as(\n\t\tsql`SELECT * FROM ${users}`,\n\t);\n\n\tconst schema = {\n\t\tusers: users,\n\t\ttestView,\n\t};\n\n\tconst { statements, sqlStatements } = await introspectSingleStoreToFile(\n\t\tclient,\n\t\tschema,\n\t\t'view-2',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n}); */\n\ntest('handle float type', async () => {\n\tconst schema = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tcol1: float(),\n\t\t\tcol2: float({ precision: 2 }),\n\t\t\tcol3: float({ precision: 2, scale: 1 }),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectSingleStoreToFile(\n\t\tclient,\n\t\tschema,\n\t\t'handle-float-type',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('handle unsigned numerical types', async () => {\n\tconst schema = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tcol1: int({ unsigned: true }),\n\t\t\tcol2: tinyint({ unsigned: true }),\n\t\t\tcol3: smallint({ unsigned: true }),\n\t\t\tcol4: mediumint({ unsigned: true }),\n\t\t\tcol5: bigint({ mode: 'number', unsigned: true }),\n\t\t\tcol6: float({ unsigned: true }),\n\t\t\tcol7: float({ precision: 2, scale: 1, unsigned: true }),\n\t\t\tcol8: double({ unsigned: true }),\n\t\t\tcol9: double({ precision: 2, scale: 1, unsigned: true }),\n\t\t\tcol10: decimal({ unsigned: true }),\n\t\t\tcol11: decimal({ precision: 2, scale: 1, unsigned: true }),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectSingleStoreToFile(\n\t\tclient,\n\t\tschema,\n\t\t'handle-unsigned-numerical-types',\n\t\t'drizzle',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/introspect/sqlite.test.ts",
    "content": "import Database from 'better-sqlite3';\nimport { SQL, sql } from 'drizzle-orm';\nimport { check, int, sqliteTable, sqliteView, text } from 'drizzle-orm/sqlite-core';\nimport * as fs from 'fs';\nimport { introspectSQLiteToFile } from 'tests/schemaDiffer';\nimport { expect, test } from 'vitest';\n\nif (!fs.existsSync('tests/introspect/sqlite')) {\n\tfs.mkdirSync('tests/introspect/sqlite');\n}\n\ntest('generated always column: link to another column', async () => {\n\tconst sqlite = new Database(':memory:');\n\n\tconst schema = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\temail: text('email'),\n\t\t\tgeneratedEmail: text('generatedEmail').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`\\`email\\``,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectSQLiteToFile(\n\t\tsqlite,\n\t\tschema,\n\t\t'generated-link-column',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('generated always column virtual: link to another column', async () => {\n\tconst sqlite = new Database(':memory:');\n\n\tconst schema = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\temail: text('email'),\n\t\t\tgeneratedEmail: text('generatedEmail').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`\\`email\\``,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectSQLiteToFile(\n\t\tsqlite,\n\t\tschema,\n\t\t'generated-link-column-virtual',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('instrospect strings with single quotes', async () => {\n\tconst sqlite = new Database(':memory:');\n\n\tconst schema = {\n\t\tcolumns: sqliteTable('columns', {\n\t\t\ttext: text('text').default('escape\\'s quotes \" '),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectSQLiteToFile(\n\t\tsqlite,\n\t\tschema,\n\t\t'introspect-strings-with-single-quotes',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('introspect checks', async () => {\n\tconst sqlite = new Database(':memory:');\n\n\tconst schema = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tname: text('name'),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tsomeCheck: check('some_check', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await introspectSQLiteToFile(\n\t\tsqlite,\n\t\tschema,\n\t\t'introspect-checks',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('view #1', async () => {\n\tconst sqlite = new Database(':memory:');\n\n\tconst users = sqliteTable('users', { id: int('id') });\n\tconst testView = sqliteView('some_view', { id: int('id') }).as(\n\t\tsql`SELECT * FROM ${users}`,\n\t);\n\n\tconst schema = {\n\t\tusers: users,\n\t\ttestView,\n\t};\n\n\tconst { statements, sqlStatements } = await introspectSQLiteToFile(\n\t\tsqlite,\n\t\tschema,\n\t\t'view-1',\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/libsql-checks.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { check, int, sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasLibSQL } from './schemaDiffer';\n\ntest('create table with check', async (t) => {\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasLibSQL({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'users',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\ttype: 'integer',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'age',\n\t\t\t\ttype: 'integer',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\tcheckConstraints: ['some_check_name;\"users\".\"age\" > 21'],\n\t\treferenceData: [],\n\t\tuniqueConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \\`users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`age\\` integer,\n\\tCONSTRAINT \"some_check_name\" CHECK(\"users\".\"age\" > 21)\n);\\n`);\n});\n\ntest('add check contraint to existing table', async (t) => {\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasLibSQL(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: ['some_check_name;\"users\".\"age\" > 21'],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;');\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`age\\` integer,\n\\tCONSTRAINT \"some_check_name\" CHECK(\"__new_users\".\"age\" > 21)\n);\\n`);\n\texpect(sqlStatements[2]).toBe(`INSERT INTO \\`__new_users\\`(\"id\", \"age\") SELECT \"id\", \"age\" FROM \\`users\\`;`);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[4]).toBe(`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('drop check contraint to existing table', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasLibSQL(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;');\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`age\\` integer\n);\\n`);\n\texpect(sqlStatements[2]).toBe(`INSERT INTO \\`__new_users\\`(\"id\", \"age\") SELECT \"id\", \"age\" FROM \\`users\\`;`);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[4]).toBe(`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('rename check constraint', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('new_some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasLibSQL(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [`new_some_check_name;\"users\".\"age\" > 21`],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;');\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`age\\` integer,\n\\tCONSTRAINT \"new_some_check_name\" CHECK(\"__new_users\".\"age\" > 21)\n);\\n`);\n\texpect(sqlStatements[2]).toBe(`INSERT INTO \\`__new_users\\`(\"id\", \"age\") SELECT \"id\", \"age\" FROM \\`users\\`;`);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[4]).toBe(`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('rename check constraint', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 10`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasLibSQL(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [`some_check_name;\"users\".\"age\" > 10`],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;');\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`age\\` integer,\n\\tCONSTRAINT \"some_check_name\" CHECK(\"__new_users\".\"age\" > 10)\n);\\n`);\n\texpect(sqlStatements[2]).toBe(`INSERT INTO \\`__new_users\\`(\"id\", \"age\") SELECT \"id\", \"age\" FROM \\`users\\`;`);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[4]).toBe(`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('create checks with same names', async (t) => {\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t\tname: text('name'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint1: check('some_check_name', sql`${table.age} > 21`),\n\t\t\tcheckConstraint2: check('some_check_name', sql`${table.name} != 'Alex'`),\n\t\t})),\n\t};\n\n\tawait expect(diffTestSchemasLibSQL({}, to, [])).rejects.toThrowError();\n});\n"
  },
  {
    "path": "drizzle-kit/tests/libsql-statements.test.ts",
    "content": "import { foreignKey, index, int, integer, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core';\nimport { JsonRecreateTableStatement } from 'src/jsonStatements';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasLibSQL } from './schemaDiffer';\n\ntest('drop autoincrement', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasLibSQL(schema1, schema2, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [{\n\t\t\tautoincrement: false,\n\t\t\tgenerated: undefined,\n\t\t\tname: 'id',\n\t\t\tnotNull: true,\n\t\t\tprimaryKey: true,\n\t\t\ttype: 'integer',\n\t\t}],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('set autoincrement', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasLibSQL(schema1, schema2, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [{\n\t\t\tautoincrement: true,\n\t\t\tgenerated: undefined,\n\t\t\tname: 'id',\n\t\t\tnotNull: true,\n\t\t\tprimaryKey: true,\n\t\t\ttype: 'integer',\n\t\t}],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('set not null', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_alter_column_set_notnull',\n\t\ttableName: 'users',\n\t\tcolumnName: 'name',\n\t\tschema: '',\n\t\tnewDataType: 'text',\n\t\tcolumnDefault: undefined,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnNotNull: true,\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnPk: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`users\\` ALTER COLUMN \"name\" TO \"name\" text NOT NULL;`,\n\t);\n});\n\ntest('drop not null', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t\ttableName: 'users',\n\t\tcolumnName: 'name',\n\t\tschema: '',\n\t\tnewDataType: 'text',\n\t\tcolumnDefault: undefined,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnNotNull: false,\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnPk: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`users\\` ALTER COLUMN \"name\" TO \"name\" text;`,\n\t);\n});\n\ntest('set default. set not null. add column', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull().default('name'),\n\t\t\tage: int('age').notNull(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(3);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_alter_column_set_default',\n\t\ttableName: 'users',\n\t\tcolumnName: 'name',\n\t\tnewDefaultValue: \"'name'\",\n\t\tschema: '',\n\t\tnewDataType: 'text',\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnNotNull: true,\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnPk: false,\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'alter_table_alter_column_set_notnull',\n\t\ttableName: 'users',\n\t\tcolumnName: 'name',\n\t\tschema: '',\n\t\tnewDataType: 'text',\n\t\tcolumnDefault: \"'name'\",\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnNotNull: true,\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnPk: false,\n\t});\n\texpect(statements[2]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'users',\n\t\treferenceData: undefined,\n\t\tcolumn: {\n\t\t\tname: 'age',\n\t\t\ttype: 'integer',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: true,\n\t\t\tautoincrement: false,\n\t\t},\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`users\\` ALTER COLUMN \"name\" TO \"name\" text NOT NULL DEFAULT 'name';`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \\`users\\` ADD \\`age\\` integer NOT NULL;`,\n\t);\n});\n\ntest('drop default. drop not null', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull().default('name'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_alter_column_drop_default',\n\t\ttableName: 'users',\n\t\tcolumnName: 'name',\n\t\tschema: '',\n\t\tnewDataType: 'text',\n\t\tcolumnDefault: undefined,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnNotNull: false,\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnPk: false,\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t\ttableName: 'users',\n\t\tcolumnName: 'name',\n\t\tschema: '',\n\t\tnewDataType: 'text',\n\t\tcolumnDefault: undefined,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnNotNull: false,\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnPk: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`users\\` ALTER COLUMN \"name\" TO \"name\" text;`,\n\t);\n});\n\ntest('set data type. set default', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: int('name').default(123),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_alter_column_set_type',\n\t\ttableName: 'users',\n\t\tcolumnName: 'name',\n\t\tnewDataType: 'integer',\n\t\toldDataType: 'text',\n\t\tschema: '',\n\t\tcolumnDefault: 123,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnNotNull: false,\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnPk: false,\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'alter_table_alter_column_set_default',\n\t\ttableName: 'users',\n\t\tcolumnName: 'name',\n\t\tschema: '',\n\t\tnewDataType: 'integer',\n\t\tnewDefaultValue: 123,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnNotNull: false,\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnPk: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`users\\` ALTER COLUMN \"name\" TO \"name\" integer DEFAULT 123;`,\n\t);\n});\n\ntest('add foriegn key', async (t) => {\n\tconst schema = {\n\t\ttable: sqliteTable('table', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\ttableId: int('table_id'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\ttableId: int('table_id').references(() => schema.table.id),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_reference',\n\t\ttableName: 'users',\n\t\tdata: 'users_table_id_table_id_fk;users;table_id;table;id;no action;no action',\n\t\tschema: '',\n\t\tcolumnNotNull: false,\n\t\tcolumnDefault: undefined,\n\t\tcolumnType: 'integer',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`users\\` ALTER COLUMN \"table_id\" TO \"table_id\" integer REFERENCES table(id) ON DELETE no action ON UPDATE no action;`,\n\t);\n});\n\ntest('drop foriegn key', async (t) => {\n\tconst schema = {\n\t\ttable: sqliteTable('table', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\ttableId: int('table_id').references(() => schema.table.id, {\n\t\t\t\tonDelete: 'cascade',\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\ttableId: int('table_id'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'table_id',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\\t\\`table_id\\` integer\n);\\n`);\n\texpect(sqlStatements[2]).toBe(\n\t\t`INSERT INTO \\`__new_users\\`(\"id\", \"table_id\") SELECT \"id\", \"table_id\" FROM \\`users\\`;`,\n\t);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('alter foriegn key', async (t) => {\n\tconst tableRef = sqliteTable('table', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\tname: text('name'),\n\t});\n\tconst tableRef2 = sqliteTable('table2', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\tname: text('name'),\n\t});\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\ttableId: int('table_id').references(() => tableRef.id, {\n\t\t\t\tonDelete: 'cascade',\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\ttableId: int('table_id').references(() => tableRef2.id),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'table_id',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [\n\t\t\t{\n\t\t\t\tcolumnsFrom: ['table_id'],\n\t\t\t\tcolumnsTo: ['id'],\n\t\t\t\tname: 'users_table_id_table2_id_fk',\n\t\t\t\tonDelete: 'no action',\n\t\t\t\tonUpdate: 'no action',\n\t\t\t\ttableFrom: 'users',\n\t\t\t\ttableTo: 'table2',\n\t\t\t},\n\t\t],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\\t\\`table_id\\` integer,\n\\tFOREIGN KEY (\\`table_id\\`) REFERENCES \\`table2\\`(\\`id\\`) ON UPDATE no action ON DELETE no action\n);\\n`);\n\texpect(sqlStatements[2]).toBe(\n\t\t`INSERT INTO \\`__new_users\\`(\"id\", \"table_id\") SELECT \"id\", \"table_id\" FROM \\`users\\`;`,\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t'DROP TABLE `users`;',\n\t);\n\texpect(sqlStatements[4]).toBe(\n\t\t'ALTER TABLE `__new_users` RENAME TO `users`;',\n\t);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('add foriegn key for multiple columns', async (t) => {\n\tconst tableRef = sqliteTable('table', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\tage: int('age'),\n\t\tage1: int('age_1'),\n\t});\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tcolumn: int('column'),\n\t\t\tcolumn1: int('column_1'),\n\t\t}),\n\t\ttableRef,\n\t};\n\n\tconst schema2 = {\n\t\ttableRef,\n\t\tusers: sqliteTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\t\tcolumn: int('column'),\n\t\t\t\tcolumn1: int('column_1'),\n\t\t\t},\n\t\t\t(table) => ({\n\t\t\t\tforeignKey: foreignKey({\n\t\t\t\t\tcolumns: [table.column, table.column1],\n\t\t\t\t\tforeignColumns: [tableRef.age, tableRef.age1],\n\t\t\t\t}),\n\t\t\t}),\n\t\t),\n\t};\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'column',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'column_1',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [\n\t\t\t{\n\t\t\t\tcolumnsFrom: ['column', 'column_1'],\n\t\t\t\tcolumnsTo: ['age', 'age_1'],\n\t\t\t\tname: 'users_column_column_1_table_age_age_1_fk',\n\t\t\t\tonDelete: 'no action',\n\t\t\t\tonUpdate: 'no action',\n\t\t\t\ttableFrom: 'users',\n\t\t\t\ttableTo: 'table',\n\t\t\t},\n\t\t],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t} as JsonRecreateTableStatement);\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\\t\\`column\\` integer,\n\\t\\`column_1\\` integer,\n\\tFOREIGN KEY (\\`column\\`,\\`column_1\\`) REFERENCES \\`table\\`(\\`age\\`,\\`age_1\\`) ON UPDATE no action ON DELETE no action\n);\\n`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`INSERT INTO \\`__new_users\\`(\"id\", \"column\", \"column_1\") SELECT \"id\", \"column\", \"column_1\" FROM \\`users\\`;`,\n\t);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('drop foriegn key for multiple columns', async (t) => {\n\tconst tableRef = sqliteTable('table', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\tage: int('age'),\n\t\tage1: int('age_1'),\n\t});\n\n\tconst schema1 = {\n\t\tusers: sqliteTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\t\tcolumn: int('column'),\n\t\t\t\tcolumn1: int('column_1'),\n\t\t\t},\n\t\t\t(table) => ({\n\t\t\t\tforeignKey: foreignKey({\n\t\t\t\t\tcolumns: [table.column, table.column1],\n\t\t\t\t\tforeignColumns: [tableRef.age, tableRef.age1],\n\t\t\t\t}),\n\t\t\t}),\n\t\t),\n\t\ttableRef,\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tcolumn: int('column'),\n\t\t\tcolumn1: int('column_1'),\n\t\t}),\n\t\ttableRef,\n\t};\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'column',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'column_1',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\\t\\`column\\` integer,\n\\t\\`column_1\\` integer\n);\\n`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`INSERT INTO \\`__new_users\\`(\"id\", \"column\", \"column_1\") SELECT \"id\", \"column\", \"column_1\" FROM \\`users\\`;`,\n\t);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('alter column drop generated', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('table', {\n\t\t\tid: int('id').primaryKey().notNull(),\n\t\t\tname: text('name').generatedAlwaysAs('drizzle is the best').notNull(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tid: int('id').primaryKey().notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnDefault: undefined,\n\t\tcolumnGenerated: undefined,\n\t\tcolumnName: 'name',\n\t\tcolumnNotNull: true,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: 'text',\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'alter_table_alter_column_drop_generated',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \\`table\\` DROP COLUMN \\`name\\`;`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \\`table\\` ADD \\`name\\` text NOT NULL;`,\n\t);\n});\n\ntest('recreate table with nested references', async (t) => {\n\tlet users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\tname: text('name'),\n\t\tage: integer('age'),\n\t});\n\tlet subscriptions = sqliteTable('subscriptions', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\tuserId: integer('user_id').references(() => users.id),\n\t\tcustomerId: text('customer_id'),\n\t});\n\tconst schema1 = {\n\t\tusers: users,\n\t\tsubscriptions: subscriptions,\n\t\tsubscriptionMetadata: sqliteTable('subscriptions_metadata', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tsubscriptionId: text('subscription_id').references(\n\t\t\t\t() => subscriptions.id,\n\t\t\t),\n\t\t}),\n\t};\n\n\tusers = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\tname: text('name'),\n\t\tage: integer('age'),\n\t});\n\tconst schema2 = {\n\t\tusers: users,\n\t\tsubscriptions: subscriptions,\n\t\tsubscriptionMetadata: sqliteTable('subscriptions_metadata', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tsubscriptionId: text('subscription_id').references(\n\t\t\t\t() => subscriptions.id,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`name\\` text,\n\\t\\`age\\` integer\n);\\n`);\n\texpect(sqlStatements[2]).toBe(\n\t\t`INSERT INTO \\`__new_users\\`(\"id\", \"name\", \"age\") SELECT \"id\", \"name\", \"age\" FROM \\`users\\`;`,\n\t);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('set not null with index', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}, (table) => ({\n\t\t\tsomeIndex: index('users_name_index').on(table.name),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t}, (table) => ({\n\t\t\tsomeIndex: index('users_name_index').on(table.name),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_alter_column_set_notnull',\n\t\ttableName: 'users',\n\t\tcolumnName: 'name',\n\t\tschema: '',\n\t\tnewDataType: 'text',\n\t\tcolumnDefault: undefined,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnNotNull: true,\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnPk: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(3);\n\texpect(sqlStatements[0]).toBe(\n\t\t`DROP INDEX \"users_name_index\";`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \\`users\\` ALTER COLUMN \"name\" TO \"name\" text NOT NULL;`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`CREATE INDEX \\`users_name_index\\` ON \\`users\\` (\\`name\\`);`,\n\t);\n});\n\ntest('drop not null with two indexes', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t\tage: int('age').notNull(),\n\t\t}, (table) => ({\n\t\t\tsomeUniqeIndex: uniqueIndex('users_name_unique').on(table.name),\n\t\t\tsomeIndex: index('users_age_index').on(table.age),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t\tage: int('age').notNull(),\n\t\t}, (table) => ({\n\t\t\tsomeUniqeIndex: uniqueIndex('users_name_unique').on(table.name),\n\t\t\tsomeIndex: index('users_age_index').on(table.age),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t\ttableName: 'users',\n\t\tcolumnName: 'name',\n\t\tschema: '',\n\t\tnewDataType: 'text',\n\t\tcolumnDefault: undefined,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnNotNull: false,\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnPk: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(5);\n\texpect(sqlStatements[0]).toBe(\n\t\t`DROP INDEX \"users_name_unique\";`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`DROP INDEX \"users_age_index\";`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`ALTER TABLE \\`users\\` ALTER COLUMN \"name\" TO \"name\" text;`,\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t`CREATE UNIQUE INDEX \\`users_name_unique\\` ON \\`users\\` (\\`name\\`);`,\n\t);\n\texpect(sqlStatements[4]).toBe(\n\t\t`CREATE INDEX \\`users_age_index\\` ON \\`users\\` (\\`age\\`);`,\n\t);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/libsql-views.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { int, sqliteTable, sqliteView } from 'drizzle-orm/sqlite-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasLibSQL } from './schemaDiffer';\n\ntest('create view', async () => {\n\tconst users = sqliteTable('users', { id: int('id').default(1) });\n\tconst view = sqliteView('view').as((qb) => qb.select().from(users));\n\tconst to = {\n\t\tusers: users,\n\t\ttestView: view,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'users',\n\t\tcolumns: [{\n\t\t\tautoincrement: false,\n\t\t\tdefault: 1,\n\t\t\tname: 'id',\n\t\t\ttype: 'integer',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t}],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\treferenceData: [],\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'sqlite_create_view',\n\t\tname: 'view',\n\t\tdefinition: 'select \"id\" from \"users\"',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \\`users\\` (\n\\t\\`id\\` integer DEFAULT 1\n);\\n`);\n\texpect(sqlStatements[1]).toBe(`CREATE VIEW \\`view\\` AS select \"id\" from \"users\";`);\n});\n\ntest('drop view', async () => {\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\ttestView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users`),\n\t};\n\tconst to = {\n\t\tusers,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'view',\n\t\ttype: 'drop_view',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`DROP VIEW \\`view\\`;`,\n\t);\n});\n\ntest('alter view', async () => {\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\ttestView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users`),\n\t};\n\tconst to = {\n\t\tusers,\n\t\ttestView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users WHERE users.id = 1`),\n\t};\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'view',\n\t\ttype: 'drop_view',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tname: 'view',\n\t\ttype: 'sqlite_create_view',\n\t\tdefinition: 'SELECT * FROM users WHERE users.id = 1',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`DROP VIEW \\`view\\`;`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE VIEW \\`view\\` AS SELECT * FROM users WHERE users.id = 1;`,\n\t);\n});\n\ntest('create view with existing flag', async () => {\n\tconst view = sqliteView('view', {}).existing();\n\tconst to = {\n\t\ttestView: view,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL({}, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('drop view with existing flag', async () => {\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\ttestView: sqliteView('view', { id: int('id') }).existing(),\n\t};\n\tconst to = {\n\t\tusers,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('rename view with existing flag', async () => {\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\ttestView: sqliteView('view', { id: int('id') }).existing(),\n\t};\n\tconst to = {\n\t\tusers,\n\t\ttestView: sqliteView('new_view', { id: int('id') }).existing(),\n\t};\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, ['view->new_view']);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('rename view and drop existing flag', async () => {\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\ttestView: sqliteView('view', { id: int('id') }).existing(),\n\t};\n\tconst to = {\n\t\tusers,\n\t\ttestView: sqliteView('new_view', { id: int('id') }).as(sql`SELECT * FROM users`),\n\t};\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, ['view->new_view']);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'view',\n\t\ttype: 'drop_view',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'sqlite_create_view',\n\t\tname: 'new_view',\n\t\tdefinition: 'SELECT * FROM users',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe('DROP VIEW `view`;');\n\texpect(sqlStatements[1]).toBe(`CREATE VIEW \\`new_view\\` AS SELECT * FROM users;`);\n});\n\ntest('rename view and alter \".as\"', async () => {\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\ttestView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users`),\n\t};\n\tconst to = {\n\t\tusers,\n\t\ttestView: sqliteView('new_view', { id: int('id') }).as(sql`SELECT * FROM users WHERE 1=1`),\n\t};\n\tconst { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, ['view->new_view']);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'view',\n\t\ttype: 'drop_view',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'sqlite_create_view',\n\t\tname: 'new_view',\n\t\tdefinition: 'SELECT * FROM users WHERE 1=1',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe('DROP VIEW `view`;');\n\texpect(sqlStatements[1]).toBe(`CREATE VIEW \\`new_view\\` AS SELECT * FROM users WHERE 1=1;`);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/migrate/libsq-schema.ts",
    "content": "import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const users = sqliteTable('users', {\n\tid: integer('id').primaryKey().notNull(),\n\tname: text('name').notNull(),\n});\n"
  },
  {
    "path": "drizzle-kit/tests/migrate/libsql-migrate.test.ts",
    "content": "import { createClient } from '@libsql/client';\nimport { connectToLibSQL } from 'src/cli/connections';\nimport { expect, test } from 'vitest';\n\ntest('validate migrate function', async () => {\n\tconst credentials = {\n\t\turl: ':memory:',\n\t};\n\tconst { migrate, query } = await connectToLibSQL(credentials);\n\n\tawait migrate({ migrationsFolder: 'tests/migrate/migrations' });\n\n\tconst res = await query(`PRAGMA table_info(\"users\");`);\n\n\texpect(res).toStrictEqual([{\n\t\tcid: 0,\n\t\tname: 'id',\n\t\ttype: 'INTEGER',\n\t\tnotnull: 0,\n\t\tdflt_value: null,\n\t\tpk: 0,\n\t}, {\n\t\tcid: 1,\n\t\tname: 'name',\n\t\ttype: 'INTEGER',\n\t\tnotnull: 1,\n\t\tdflt_value: null,\n\t\tpk: 0,\n\t}]);\n});\n\n// test('validate migrate function', async () => {\n// \tconst credentials = {\n// \t\turl: '',\n// \t\tauthToken: '',\n// \t};\n// \tconst { migrate, query } = await connectToLibSQL(credentials);\n\n// \tawait migrate({ migrationsFolder: 'tests/migrate/migrations' });\n\n// \tconst res = await query(`PRAGMA table_info(\"users\");`);\n\n// \texpect(res).toStrictEqual([{\n// \t\tcid: 0,\n// \t\tname: 'id',\n// \t\ttype: 'INTEGER',\n// \t\tnotnull: 0,\n// \t\tdflt_value: null,\n// \t\tpk: 0,\n// \t}, {\n// \t\tcid: 1,\n// \t\tname: 'name',\n// \t\ttype: 'INTEGER',\n// \t\tnotnull: 1,\n// \t\tdflt_value: null,\n// \t\tpk: 0,\n// \t}]);\n// });\n"
  },
  {
    "path": "drizzle-kit/tests/migrate/migrations/0000_little_blizzard.sql",
    "content": "CREATE TABLE `users` (\n\t`id` integer PRIMARY KEY NOT NULL,\n\t`name` text NOT NULL\n);\n"
  },
  {
    "path": "drizzle-kit/tests/migrate/migrations/0001_nebulous_storm.sql",
    "content": "PRAGMA foreign_keys=OFF;--> statement-breakpoint\nCREATE TABLE `__new_users` (\n\t`id` integer,\n\t`name` integer NOT NULL\n);\n--> statement-breakpoint\nINSERT INTO `__new_users`(\"id\", \"name\") SELECT \"id\", \"name\" FROM `users`;--> statement-breakpoint\nDROP TABLE `users`;--> statement-breakpoint\nALTER TABLE `__new_users` RENAME TO `users`;--> statement-breakpoint\nPRAGMA foreign_keys=ON;"
  },
  {
    "path": "drizzle-kit/tests/migrate/migrations/meta/0000_snapshot.json",
    "content": "{\n  \"version\": \"6\",\n  \"dialect\": \"sqlite\",\n  \"id\": \"2bd46776-9e41-4a6c-b617-5c600bb176f2\",\n  \"prevId\": \"00000000-0000-0000-0000-000000000000\",\n  \"tables\": {\n    \"users\": {\n      \"name\": \"users\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"integer\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    }\n  },\n  \"enums\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  },\n  \"internal\": {\n    \"indexes\": {}\n  }\n}"
  },
  {
    "path": "drizzle-kit/tests/migrate/migrations/meta/0001_snapshot.json",
    "content": "{\n  \"version\": \"6\",\n  \"dialect\": \"sqlite\",\n  \"id\": \"6c0ec455-42fd-47fd-a22c-4bb4551e1358\",\n  \"prevId\": \"2bd46776-9e41-4a6c-b617-5c600bb176f2\",\n  \"tables\": {\n    \"users\": {\n      \"name\": \"users\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    }\n  },\n  \"enums\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  },\n  \"internal\": {\n    \"indexes\": {}\n  }\n}"
  },
  {
    "path": "drizzle-kit/tests/migrate/migrations/meta/_journal.json",
    "content": "{\n  \"version\": \"7\",\n  \"dialect\": \"sqlite\",\n  \"entries\": [\n    {\n      \"idx\": 0,\n      \"version\": \"6\",\n      \"when\": 1725358702427,\n      \"tag\": \"0000_little_blizzard\",\n      \"breakpoints\": true\n    },\n    {\n      \"idx\": 1,\n      \"version\": \"6\",\n      \"when\": 1725358713033,\n      \"tag\": \"0001_nebulous_storm\",\n      \"breakpoints\": true\n    }\n  ]\n}"
  },
  {
    "path": "drizzle-kit/tests/mysql-checks.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { check, int, mysqlTable, serial, varchar } from 'drizzle-orm/mysql-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasMysql } from './schemaDiffer';\n\ntest('create table with check', async (t) => {\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasMysql({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\ttype: 'serial',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: false,\n\t\t\t\tautoincrement: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'age',\n\t\t\t\ttype: 'int',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [\n\t\t\t'users_id;id',\n\t\t],\n\t\tcheckConstraints: ['some_check_name;\\`users\\`.\\`age\\` > 21'],\n\t\tcompositePkName: 'users_id',\n\t\tuniqueConstraints: [],\n\t\tschema: undefined,\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \\`users\\` (\n\\t\\`id\\` serial AUTO_INCREMENT NOT NULL,\n\\t\\`age\\` int,\n\\tCONSTRAINT \\`users_id\\` PRIMARY KEY(\\`id\\`),\n\\tCONSTRAINT \\`some_check_name\\` CHECK(\\`users\\`.\\`age\\` > 21)\n);\\n`);\n});\n\ntest('add check contraint to existing table', async (t) => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_check_constraint',\n\t\ttableName: 'users',\n\t\tdata: 'some_check_name;\\`users\\`.\\`age\\` > 21',\n\t\tschema: '',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`users\\` ADD CONSTRAINT \\`some_check_name\\` CHECK (\\`users\\`.\\`age\\` > 21);`,\n\t);\n});\n\ntest('drop check contraint in existing table', async (t) => {\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}),\n\t};\n\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'delete_check_constraint',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tconstraintName: 'some_check_name',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`users\\` DROP CONSTRAINT \\`some_check_name\\`;`,\n\t);\n});\n\ntest('rename check constraint', async (t) => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('new_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tconstraintName: 'some_check_name',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'delete_check_constraint',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tdata: 'new_check_name;\\`users\\`.\\`age\\` > 21',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'create_check_constraint',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`users\\` DROP CONSTRAINT \\`some_check_name\\`;`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \\`users\\` ADD CONSTRAINT \\`new_check_name\\` CHECK (\\`users\\`.\\`age\\` > 21);`,\n\t);\n});\n\ntest('alter check constraint', async (t) => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('new_check_name', sql`${table.age} > 10`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasMysql(from, to, []);\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tconstraintName: 'some_check_name',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'delete_check_constraint',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tdata: 'new_check_name;\\`users\\`.\\`age\\` > 10',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'create_check_constraint',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`users\\` DROP CONSTRAINT \\`some_check_name\\`;`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \\`users\\` ADD CONSTRAINT \\`new_check_name\\` CHECK (\\`users\\`.\\`age\\` > 10);`,\n\t);\n});\n\ntest('alter multiple check constraints', async (t) => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t\tname: varchar('name', { length: 255 }),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint1: check('some_check_name_1', sql`${table.age} > 21`),\n\t\t\tcheckConstraint2: check('some_check_name_2', sql`${table.name} != 'Alex'`),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t\tname: varchar('name', { length: 255 }),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint1: check('some_check_name_3', sql`${table.age} > 21`),\n\t\t\tcheckConstraint2: check('some_check_name_4', sql`${table.name} != 'Alex'`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasMysql(from, to, []);\n\texpect(statements.length).toBe(4);\n\texpect(statements[0]).toStrictEqual({\n\t\tconstraintName: 'some_check_name_1',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'delete_check_constraint',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tconstraintName: 'some_check_name_2',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'delete_check_constraint',\n\t});\n\texpect(statements[2]).toStrictEqual({\n\t\tdata: 'some_check_name_3;\\`users\\`.\\`age\\` > 21',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'create_check_constraint',\n\t});\n\texpect(statements[3]).toStrictEqual({\n\t\tdata: \"some_check_name_4;\\`users\\`.\\`name\\` != 'Alex'\",\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'create_check_constraint',\n\t});\n\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`users\\` DROP CONSTRAINT \\`some_check_name_1\\`;`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \\`users\\` DROP CONSTRAINT \\`some_check_name_2\\`;`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`ALTER TABLE \\`users\\` ADD CONSTRAINT \\`some_check_name_3\\` CHECK (\\`users\\`.\\`age\\` > 21);`,\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t`ALTER TABLE \\`users\\` ADD CONSTRAINT \\`some_check_name_4\\` CHECK (\\`users\\`.\\`name\\` != \\'Alex\\');`,\n\t);\n});\n\ntest('create checks with same names', async (t) => {\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t\tname: varchar('name', { length: 255 }),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint1: check('some_check_name', sql`${table.age} > 21`),\n\t\t\tcheckConstraint2: check('some_check_name', sql`${table.name} != 'Alex'`),\n\t\t})),\n\t};\n\n\tawait expect(diffTestSchemasMysql({}, to, [])).rejects.toThrowError();\n});\n"
  },
  {
    "path": "drizzle-kit/tests/mysql-generated.test.ts",
    "content": "import { SQL, sql } from 'drizzle-orm';\nimport { int, mysqlTable, text } from 'drizzle-orm/mysql-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasMysql } from './schemaDiffer';\n\ntest('generated as callback: add column with generated constraint', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_add_column',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t]);\n});\n\ntest('generated as callback: add generated constraint to an exisiting column as stored', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`, {\n\t\t\t\t\tmode: 'stored',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'to add'\",\n\t\t\t\ttype: 'stored',\n\t\t\t},\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t\"ALTER TABLE `users` MODIFY COLUMN `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'to add') STORED NOT NULL;\",\n\t]);\n});\n\ntest('generated as callback: add generated constraint to an exisiting column as virtual', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`, {\n\t\t\t\t\tmode: 'virtual',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'to add'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'to add') VIRTUAL NOT NULL;\",\n\t]);\n});\n\ntest('generated as callback: drop generated constraint as stored', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name} || 'to delete'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\toldColumn: {\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'to delete'\",\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` MODIFY COLUMN `gen_name` text;',\n\t]);\n});\n\ntest('generated as callback: drop generated constraint as virtual', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name} || 'to delete'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\toldColumn: {\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'to delete'\",\n\t\t\t\t\ttype: 'virtual',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text;',\n\t]);\n});\n\ntest('generated as callback: change generated constraint type from virtual to stored', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name}`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'stored',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t]);\n});\n\ntest('generated as callback: change generated constraint type from stored to virtual', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name}`,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t]);\n});\n\ntest('generated as callback: change generated constraint', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name}`,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t]);\n});\n\n// ---\n\ntest('generated as sql: add column with generated constraint', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_add_column',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t]);\n});\n\ntest('generated as sql: add generated constraint to an exisiting column as stored', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(sql`\\`users\\`.\\`name\\` || 'to add'`, {\n\t\t\t\t\tmode: 'stored',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'to add'\",\n\t\t\t\ttype: 'stored',\n\t\t\t},\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t\"ALTER TABLE `users` MODIFY COLUMN `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'to add') STORED NOT NULL;\",\n\t]);\n});\n\ntest('generated as sql: add generated constraint to an exisiting column as virtual', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(sql`\\`users\\`.\\`name\\` || 'to add'`, {\n\t\t\t\t\tmode: 'virtual',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'to add'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'to add') VIRTUAL NOT NULL;\",\n\t]);\n});\n\ntest('generated as sql: drop generated constraint as stored', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\` || 'to delete'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\toldColumn: {\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'to delete'\",\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` MODIFY COLUMN `gen_name` text;',\n\t]);\n});\n\ntest('generated as sql: drop generated constraint as virtual', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\` || 'to delete'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\toldColumn: {\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'to delete'\",\n\t\t\t\t\ttype: 'virtual',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text;',\n\t]);\n});\n\ntest('generated as sql: change generated constraint type from virtual to stored', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\``,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'stored',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t]);\n});\n\ntest('generated as sql: change generated constraint type from stored to virtual', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\``,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t]);\n});\n\ntest('generated as sql: change generated constraint', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\``,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t]);\n});\n\n// ---\n\ntest('generated as string: add column with generated constraint', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_add_column',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t]);\n});\n\ntest('generated as string: add generated constraint to an exisiting column as stored', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(`\\`users\\`.\\`name\\` || 'to add'`, {\n\t\t\t\t\tmode: 'stored',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'to add'\",\n\t\t\t\ttype: 'stored',\n\t\t\t},\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t\"ALTER TABLE `users` MODIFY COLUMN `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'to add') STORED NOT NULL;\",\n\t]);\n});\n\ntest('generated as string: add generated constraint to an exisiting column as virtual', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(`\\`users\\`.\\`name\\` || 'to add'`, {\n\t\t\t\t\tmode: 'virtual',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'to add'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'to add') VIRTUAL NOT NULL;\",\n\t]);\n});\n\ntest('generated as string: drop generated constraint as stored', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\`users\\`.\\`name\\` || 'to delete'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\toldColumn: {\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'to delete'\",\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` MODIFY COLUMN `gen_name` text;',\n\t]);\n});\n\ntest('generated as string: drop generated constraint as virtual', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\`users\\`.\\`name\\` || 'to delete'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\toldColumn: {\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'to delete'\",\n\t\t\t\t\ttype: 'virtual',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text;',\n\t]);\n});\n\ntest('generated as string: change generated constraint type from virtual to stored', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(`\\`users\\`.\\`name\\``, {\n\t\t\t\tmode: 'virtual',\n\t\t\t}),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'stored',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t]);\n});\n\ntest('generated as string: change generated constraint type from stored to virtual', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(`\\`users\\`.\\`name\\``),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t]);\n});\n\ntest('generated as string: change generated constraint', async () => {\n\tconst from = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(`\\`users\\`.\\`name\\``),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t]);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/mysql-schemas.test.ts",
    "content": "import { mysqlSchema, mysqlTable } from 'drizzle-orm/mysql-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasMysql } from './schemaDiffer';\n\n// We don't manage databases(schemas) in MySQL with Drizzle Kit\ntest('add schema #1', async () => {\n\tconst to = {\n\t\tdevSchema: mysqlSchema('dev'),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql({}, to, []);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('add schema #2', async () => {\n\tconst from = {\n\t\tdevSchema: mysqlSchema('dev'),\n\t};\n\tconst to = {\n\t\tdevSchema: mysqlSchema('dev'),\n\t\tdevSchema2: mysqlSchema('dev2'),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('delete schema #1', async () => {\n\tconst from = {\n\t\tdevSchema: mysqlSchema('dev'),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, {}, []);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('delete schema #2', async () => {\n\tconst from = {\n\t\tdevSchema: mysqlSchema('dev'),\n\t\tdevSchema2: mysqlSchema('dev2'),\n\t};\n\tconst to = {\n\t\tdevSchema: mysqlSchema('dev'),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('rename schema #1', async () => {\n\tconst from = {\n\t\tdevSchema: mysqlSchema('dev'),\n\t};\n\tconst to = {\n\t\tdevSchema2: mysqlSchema('dev2'),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, ['dev->dev2']);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('rename schema #2', async () => {\n\tconst from = {\n\t\tdevSchema: mysqlSchema('dev'),\n\t\tdevSchema1: mysqlSchema('dev1'),\n\t};\n\tconst to = {\n\t\tdevSchema: mysqlSchema('dev'),\n\t\tdevSchema2: mysqlSchema('dev2'),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, ['dev1->dev2']);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('add table to schema #1', async () => {\n\tconst dev = mysqlSchema('dev');\n\tconst from = {};\n\tconst to = {\n\t\tdev,\n\t\tusers: dev.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, ['dev1->dev2']);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('add table to schema #2', async () => {\n\tconst dev = mysqlSchema('dev');\n\tconst from = { dev };\n\tconst to = {\n\t\tdev,\n\t\tusers: dev.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, ['dev1->dev2']);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('add table to schema #3', async () => {\n\tconst dev = mysqlSchema('dev');\n\tconst from = { dev };\n\tconst to = {\n\t\tdev,\n\t\tusersInDev: dev.table('users', {}),\n\t\tusers: mysqlTable('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, ['dev1->dev2']);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tuniqueConstraints: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t\tcompositePkName: '',\n\t\tcompositePKs: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('remove table from schema #1', async () => {\n\tconst dev = mysqlSchema('dev');\n\tconst from = { dev, users: dev.table('users', {}) };\n\tconst to = {\n\t\tdev,\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, ['dev1->dev2']);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('remove table from schema #2', async () => {\n\tconst dev = mysqlSchema('dev');\n\tconst from = { dev, users: dev.table('users', {}) };\n\tconst to = {};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, ['dev1->dev2']);\n\n\texpect(statements.length).toBe(0);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/mysql-views.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { int, mysqlTable, mysqlView } from 'drizzle-orm/mysql-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasMysql } from './schemaDiffer';\n\ntest('create view #1', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view').as((qb) => qb.select().from(users)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'mysql_create_view',\n\t\tname: 'some_view',\n\t\talgorithm: 'undefined',\n\t\treplace: false,\n\t\tdefinition: 'select `id` from `users`',\n\t\twithCheckOption: undefined,\n\t\tsqlSecurity: 'definer',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`CREATE ALGORITHM = undefined\nSQL SECURITY definer\nVIEW \\`some_view\\` AS (select \\`id\\` from \\`users\\`);`);\n});\n\ntest('create view #2', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users}`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'mysql_create_view',\n\t\tname: 'some_view',\n\t\talgorithm: 'merge',\n\t\treplace: false,\n\t\tdefinition: 'SELECT * FROM \\`users\\`',\n\t\twithCheckOption: 'cascaded',\n\t\tsqlSecurity: 'definer',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`CREATE ALGORITHM = merge\nSQL SECURITY definer\nVIEW \\`some_view\\` AS (SELECT * FROM \\`users\\`)\nWITH cascaded CHECK OPTION;`);\n});\n\ntest('create view with existing flag', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('drop view', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users}`),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'drop_view',\n\t\tname: 'some_view',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`DROP VIEW \\`some_view\\`;`);\n});\n\ntest('drop view with existing flag', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').existing(),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('rename view', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users}`),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('new_some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users}`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, [\n\t\t'public.some_view->public.new_some_view',\n\t]);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_view',\n\t\tnameFrom: 'some_view',\n\t\tnameTo: 'new_some_view',\n\t});\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`RENAME TABLE \\`some_view\\` TO \\`new_some_view\\`;`);\n});\n\ntest('rename view and alter meta options', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users}`),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('new_some_view', {}).sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users}`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, [\n\t\t'public.some_view->public.new_some_view',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_view',\n\t\tnameFrom: 'some_view',\n\t\tnameTo: 'new_some_view',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\talgorithm: 'undefined',\n\t\tcolumns: {},\n\t\tdefinition: 'SELECT * FROM `users`',\n\t\tisExisting: false,\n\t\tname: 'new_some_view',\n\t\tsqlSecurity: 'definer',\n\t\ttype: 'alter_mysql_view',\n\t\twithCheckOption: 'cascaded',\n\t});\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`RENAME TABLE \\`some_view\\` TO \\`new_some_view\\`;`);\n\texpect(sqlStatements[1]).toBe(`ALTER ALGORITHM = undefined\nSQL SECURITY definer\nVIEW \\`new_some_view\\` AS SELECT * FROM \\`users\\`\nWITH cascaded CHECK OPTION;`);\n});\n\ntest('rename view with existing flag', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').existing(),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('new_some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, [\n\t\t'public.some_view->public.new_some_view',\n\t]);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('add meta to view', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).as(sql`SELECT * FROM ${users}`),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users}`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\talgorithm: 'merge',\n\t\tcolumns: {},\n\t\tdefinition: 'SELECT * FROM `users`',\n\t\tisExisting: false,\n\t\tname: 'some_view',\n\t\tsqlSecurity: 'definer',\n\t\ttype: 'alter_mysql_view',\n\t\twithCheckOption: 'cascaded',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER ALGORITHM = merge\nSQL SECURITY definer\nVIEW \\`some_view\\` AS SELECT * FROM \\`users\\`\nWITH cascaded CHECK OPTION;`);\n});\n\ntest('add meta to view with existing flag', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).existing(),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('alter meta to view', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('temptable').sqlSecurity('invoker')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users}`),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users}`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\talgorithm: 'merge',\n\t\tcolumns: {},\n\t\tdefinition: 'SELECT * FROM `users`',\n\t\tisExisting: false,\n\t\tname: 'some_view',\n\t\tsqlSecurity: 'definer',\n\t\ttype: 'alter_mysql_view',\n\t\twithCheckOption: 'cascaded',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER ALGORITHM = merge\nSQL SECURITY definer\nVIEW \\`some_view\\` AS SELECT * FROM \\`users\\`\nWITH cascaded CHECK OPTION;`);\n});\n\ntest('alter meta to view with existing flag', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('temptable').sqlSecurity('invoker')\n\t\t\t.withCheckOption('cascaded').existing(),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('drop meta from view', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users}`),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).as(sql`SELECT * FROM ${users}`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\talgorithm: 'undefined',\n\t\tcolumns: {},\n\t\tdefinition: 'SELECT * FROM `users`',\n\t\tisExisting: false,\n\t\tname: 'some_view',\n\t\tsqlSecurity: 'definer',\n\t\ttype: 'alter_mysql_view',\n\t\twithCheckOption: undefined,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER ALGORITHM = undefined\nSQL SECURITY definer\nVIEW \\`some_view\\` AS SELECT * FROM \\`users\\`;`);\n});\n\ntest('drop meta from view existing flag', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\n\t\tview: mysqlView('some_view', {}).algorithm('merge').sqlSecurity('definer')\n\t\t\t.withCheckOption('cascaded').existing(),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('alter view \".as\" value', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('temptable').sqlSecurity('invoker')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users}`),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('temptable').sqlSecurity('invoker')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users} WHERE ${users.id} = 1`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\talgorithm: 'temptable',\n\t\tdefinition: 'SELECT * FROM `users` WHERE `users`.`id` = 1',\n\t\tname: 'some_view',\n\t\tsqlSecurity: 'invoker',\n\t\ttype: 'mysql_create_view',\n\t\twithCheckOption: 'cascaded',\n\t\treplace: true,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`CREATE OR REPLACE ALGORITHM = temptable\nSQL SECURITY invoker\nVIEW \\`some_view\\` AS (SELECT * FROM \\`users\\` WHERE \\`users\\`.\\`id\\` = 1)\nWITH cascaded CHECK OPTION;`);\n});\n\ntest('rename and alter view \".as\" value', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('temptable').sqlSecurity('invoker')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users}`),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('new_some_view', {}).algorithm('temptable').sqlSecurity('invoker')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users} WHERE ${users.id} = 1`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, [\n\t\t'public.some_view->public.new_some_view',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tnameFrom: 'some_view',\n\t\tnameTo: 'new_some_view',\n\t\ttype: 'rename_view',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\talgorithm: 'temptable',\n\t\tdefinition: 'SELECT * FROM `users` WHERE `users`.`id` = 1',\n\t\tname: 'new_some_view',\n\t\tsqlSecurity: 'invoker',\n\t\ttype: 'mysql_create_view',\n\t\twithCheckOption: 'cascaded',\n\t\treplace: true,\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`RENAME TABLE \\`some_view\\` TO \\`new_some_view\\`;`);\n\texpect(sqlStatements[1]).toBe(`CREATE OR REPLACE ALGORITHM = temptable\nSQL SECURITY invoker\nVIEW \\`new_some_view\\` AS (SELECT * FROM \\`users\\` WHERE \\`users\\`.\\`id\\` = 1)\nWITH cascaded CHECK OPTION;`);\n});\n\ntest('set existing', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('temptable').sqlSecurity('invoker')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users}`),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('new_some_view', {}).algorithm('temptable').sqlSecurity('invoker')\n\t\t\t.withCheckOption('cascaded').existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, [\n\t\t'public.some_view->public.new_some_view',\n\t]);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('drop existing', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\tview: mysqlView('some_view', {}).algorithm('temptable').sqlSecurity('invoker')\n\t\t\t.withCheckOption('cascaded').existing(),\n\t};\n\tconst to = {\n\t\tusers: users,\n\t\tview: mysqlView('new_some_view', {}).algorithm('temptable').sqlSecurity('invoker')\n\t\t\t.withCheckOption('cascaded').as(sql`SELECT * FROM ${users} WHERE ${users.id} = 1`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasMysql(from, to, [\n\t\t'public.some_view->public.new_some_view',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'new_some_view',\n\t\ttype: 'drop_view',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\talgorithm: 'temptable',\n\t\tdefinition: 'SELECT * FROM `users` WHERE `users`.`id` = 1',\n\t\tname: 'new_some_view',\n\t\tsqlSecurity: 'invoker',\n\t\ttype: 'mysql_create_view',\n\t\twithCheckOption: 'cascaded',\n\t\treplace: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`DROP VIEW \\`new_some_view\\`;`);\n\texpect(sqlStatements[1]).toBe(`CREATE ALGORITHM = temptable\nSQL SECURITY invoker\nVIEW \\`new_some_view\\` AS (SELECT * FROM \\`users\\` WHERE \\`users\\`.\\`id\\` = 1)\nWITH cascaded CHECK OPTION;`);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/mysql.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport {\n\tforeignKey,\n\tindex,\n\tint,\n\tjson,\n\tmysqlEnum,\n\tmysqlSchema,\n\tmysqlTable,\n\tprimaryKey,\n\tserial,\n\ttext,\n\tunique,\n\tuniqueIndex,\n\tvarchar,\n} from 'drizzle-orm/mysql-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasMysql } from './schemaDiffer';\n\ntest('add table #1', async () => {\n\tconst to = {\n\t\tusers: mysqlTable('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('add table #2', async () => {\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'serial',\n\t\t\t\tautoincrement: true,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: ['users_id;id'],\n\t\tcompositePkName: 'users_id',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t});\n});\n\ntest('add table #3', async () => {\n\tconst to = {\n\t\tusers: mysqlTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid: serial('id'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tpk: primaryKey({\n\t\t\t\t\t\tname: 'users_pk',\n\t\t\t\t\t\tcolumns: [t.id],\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'serial',\n\t\t\t\tautoincrement: true,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: ['users_pk;id'],\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: 'users_pk',\n\t\tcheckConstraints: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t});\n});\n\ntest('add table #4', async () => {\n\tconst to = {\n\t\tusers: mysqlTable('users', {}),\n\t\tposts: mysqlTable('posts', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'posts',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('add table #5', async () => {\n\tconst schema = mysqlSchema('folder');\n\tconst from = {\n\t\tschema,\n\t};\n\n\tconst to = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('add table #6', async () => {\n\tconst from = {\n\t\tusers1: mysqlTable('users1', {}),\n\t};\n\n\tconst to = {\n\t\tusers2: mysqlTable('users2', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users2',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'drop_table',\n\t\tpolicies: [],\n\t\ttableName: 'users1',\n\t\tschema: undefined,\n\t});\n});\n\ntest('add table #7', async () => {\n\tconst from = {\n\t\tusers1: mysqlTable('users1', {}),\n\t};\n\n\tconst to = {\n\t\tusers: mysqlTable('users', {}),\n\t\tusers2: mysqlTable('users2', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, [\n\t\t'public.users1->public.users2',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t\tcompositePkName: '',\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'rename_table',\n\t\ttableNameFrom: 'users1',\n\t\ttableNameTo: 'users2',\n\t\tfromSchema: undefined,\n\t\ttoSchema: undefined,\n\t});\n});\n\ntest('add schema + table #1', async () => {\n\tconst schema = mysqlSchema('folder');\n\n\tconst to = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql({}, to, []);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('change schema with tables #1', async () => {\n\tconst schema = mysqlSchema('folder');\n\tconst schema2 = mysqlSchema('folder2');\n\tconst from = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema2,\n\t\tusers: schema2.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, [\n\t\t'folder->folder2',\n\t]);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('change table schema #1', async () => {\n\tconst schema = mysqlSchema('folder');\n\tconst from = {\n\t\tschema,\n\t\tusers: mysqlTable('users', {}),\n\t};\n\tconst to = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, [\n\t\t'public.users->folder.users',\n\t]);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'drop_table',\n\t\tpolicies: [],\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t});\n});\n\ntest('change table schema #2', async () => {\n\tconst schema = mysqlSchema('folder');\n\tconst from = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema,\n\t\tusers: mysqlTable('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, [\n\t\t'folder.users->public.users',\n\t]);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t\tcompositePKs: [],\n\t\tcheckConstraints: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t});\n});\n\ntest('change table schema #3', async () => {\n\tconst schema1 = mysqlSchema('folder1');\n\tconst schema2 = mysqlSchema('folder2');\n\tconst from = {\n\t\tschema1,\n\t\tschema2,\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema1,\n\t\tschema2,\n\t\tusers: schema2.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, [\n\t\t'folder1.users->folder2.users',\n\t]);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('change table schema #4', async () => {\n\tconst schema1 = mysqlSchema('folder1');\n\tconst schema2 = mysqlSchema('folder2');\n\tconst from = {\n\t\tschema1,\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema1,\n\t\tschema2, // add schema\n\t\tusers: schema2.table('users', {}), // move table\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, [\n\t\t'folder1.users->folder2.users',\n\t]);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('change table schema #5', async () => {\n\tconst schema1 = mysqlSchema('folder1');\n\tconst schema2 = mysqlSchema('folder2');\n\tconst from = {\n\t\tschema1, // remove schema\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema2, // add schema\n\t\tusers: schema2.table('users', {}), // move table\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, [\n\t\t'folder1.users->folder2.users',\n\t]);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('change table schema #5', async () => {\n\tconst schema1 = mysqlSchema('folder1');\n\tconst schema2 = mysqlSchema('folder2');\n\tconst from = {\n\t\tschema1,\n\t\tschema2,\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema1,\n\t\tschema2,\n\t\tusers: schema2.table('users2', {}), // rename and move table\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, [\n\t\t'folder1.users->folder2.users2',\n\t]);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('change table schema #6', async () => {\n\tconst schema1 = mysqlSchema('folder1');\n\tconst schema2 = mysqlSchema('folder2');\n\tconst from = {\n\t\tschema1,\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema2, // rename schema\n\t\tusers: schema2.table('users2', {}), // rename table\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql(from, to, [\n\t\t'folder1->folder2',\n\t\t'folder2.users->folder2.users2',\n\t]);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('add table #10', async () => {\n\tconst to = {\n\t\tusers: mysqlTable('table', {\n\t\t\tjson: json('json').default({}),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasMysql({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t\"CREATE TABLE `table` (\\n\\t`json` json DEFAULT ('{}')\\n);\\n\",\n\t);\n});\n\ntest('add table #11', async () => {\n\tconst to = {\n\t\tusers: mysqlTable('table', {\n\t\t\tjson: json('json').default([]),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasMysql({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t\"CREATE TABLE `table` (\\n\\t`json` json DEFAULT ('[]')\\n);\\n\",\n\t);\n});\n\ntest('add table #12', async () => {\n\tconst to = {\n\t\tusers: mysqlTable('table', {\n\t\t\tjson: json('json').default([1, 2, 3]),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasMysql({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t\"CREATE TABLE `table` (\\n\\t`json` json DEFAULT ('[1,2,3]')\\n);\\n\",\n\t);\n});\n\ntest('add table #13', async () => {\n\tconst to = {\n\t\tusers: mysqlTable('table', {\n\t\t\tjson: json('json').default({ key: 'value' }),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasMysql({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t'CREATE TABLE `table` (\\n\\t`json` json DEFAULT (\\'{\"key\":\"value\"}\\')\\n);\\n',\n\t);\n});\n\ntest('add table #14', async () => {\n\tconst to = {\n\t\tusers: mysqlTable('table', {\n\t\t\tjson: json('json').default({\n\t\t\t\tkey: 'value',\n\t\t\t\tarr: [1, 2, 3],\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasMysql({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t'CREATE TABLE `table` (\\n\\t`json` json DEFAULT (\\'{\"key\":\"value\",\"arr\":[1,2,3]}\\')\\n);\\n',\n\t);\n});\n\ntest('drop index', async () => {\n\tconst from = {\n\t\tusers: mysqlTable(\n\t\t\t'table',\n\t\t\t{\n\t\t\t\tname: text('name'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tidx: index('name_idx').on(t.name),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst to = {\n\t\tusers: mysqlTable('table', {\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe('DROP INDEX `name_idx` ON `table`;');\n});\n\ntest('drop unique constraint', async () => {\n\tconst from = {\n\t\tusers: mysqlTable(\n\t\t\t'table',\n\t\t\t{\n\t\t\t\tname: text('name'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tuq: unique('name_uq').on(t.name),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst to = {\n\t\tusers: mysqlTable('table', {\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe('ALTER TABLE `table` DROP INDEX `name_uq`;');\n});\n\ntest('add table with indexes', async () => {\n\tconst from = {};\n\n\tconst to = {\n\t\tusers: mysqlTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t\temail: text('email'),\n\t\t\t},\n\t\t\t(t) => ({\n\t\t\t\tuniqueExpr: uniqueIndex('uniqueExpr').on(sql`(lower(${t.email}))`),\n\t\t\t\tindexExpr: index('indexExpr').on(sql`(lower(${t.email}))`),\n\t\t\t\tindexExprMultiple: index('indexExprMultiple').on(\n\t\t\t\t\tsql`(lower(${t.email}))`,\n\t\t\t\t\tsql`(lower(${t.email}))`,\n\t\t\t\t),\n\n\t\t\t\tuniqueCol: uniqueIndex('uniqueCol').on(t.email),\n\t\t\t\tindexCol: index('indexCol').on(t.email),\n\t\t\t\tindexColMultiple: index('indexColMultiple').on(t.email, t.email),\n\n\t\t\t\tindexColExpr: index('indexColExpr').on(\n\t\t\t\t\tsql`(lower(${t.email}))`,\n\t\t\t\t\tt.email,\n\t\t\t\t),\n\t\t\t}),\n\t\t),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`CREATE TABLE \\`users\\` (\\n\\t\\`id\\` serial AUTO_INCREMENT NOT NULL,\\n\\t\\`name\\` text,\\n\\t\\`email\\` text,\\n\\tCONSTRAINT \\`users_id\\` PRIMARY KEY(\\`id\\`),\\n\\tCONSTRAINT \\`uniqueExpr\\` UNIQUE((lower(\\`email\\`))),\\n\\tCONSTRAINT \\`uniqueCol\\` UNIQUE(\\`email\\`)\n);\n`,\n\t\t'CREATE INDEX `indexExpr` ON `users` ((lower(`email`)));',\n\t\t'CREATE INDEX `indexExprMultiple` ON `users` ((lower(`email`)),(lower(`email`)));',\n\t\t'CREATE INDEX `indexCol` ON `users` (`email`);',\n\t\t'CREATE INDEX `indexColMultiple` ON `users` (`email`,`email`);',\n\t\t'CREATE INDEX `indexColExpr` ON `users` ((lower(`email`)),`email`);',\n\t]);\n});\n\ntest('varchar and text default values escape single quotes', async (t) => {\n\tconst schema1 = {\n\t\ttable: mysqlTable('table', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst schem2 = {\n\t\ttable: mysqlTable('table', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tenum: mysqlEnum('enum', [\"escape's quotes\", \"escape's quotes 2\"]).default(\"escape's quotes\"),\n\t\t\ttext: text('text').default(\"escape's quotes\"),\n\t\t\tvarchar: varchar('varchar', { length: 255 }).default(\"escape's quotes\"),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasMysql(schema1, schem2, []);\n\n\texpect(sqlStatements.length).toBe(3);\n\texpect(sqlStatements[0]).toStrictEqual(\n\t\t\"ALTER TABLE `table` ADD `enum` enum('escape''s quotes','escape''s quotes 2') DEFAULT 'escape''s quotes';\",\n\t);\n\texpect(sqlStatements[1]).toStrictEqual(\n\t\t\"ALTER TABLE `table` ADD `text` text DEFAULT ('escape''s quotes');\",\n\t);\n\texpect(sqlStatements[2]).toStrictEqual(\n\t\t\"ALTER TABLE `table` ADD `varchar` varchar(255) DEFAULT 'escape''s quotes';\",\n\t);\n});\n\ntest('composite primary key', async () => {\n\tconst from = {};\n\tconst to = {\n\t\ttable: mysqlTable('works_to_creators', {\n\t\t\tworkId: int('work_id').notNull(),\n\t\t\tcreatorId: int('creator_id').notNull(),\n\t\t\tclassification: text('classification').notNull(),\n\t\t}, (t) => ({\n\t\t\tpk: primaryKey({\n\t\t\t\tcolumns: [t.workId, t.creatorId, t.classification],\n\t\t\t}),\n\t\t})),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE `works_to_creators` (\\n\\t`work_id` int NOT NULL,\\n\\t`creator_id` int NOT NULL,\\n\\t`classification` text NOT NULL,\\n\\tCONSTRAINT `works_to_creators_work_id_creator_id_classification_pk` PRIMARY KEY(`work_id`,`creator_id`,`classification`)\\n);\\n',\n\t]);\n});\n\ntest('add column before creating unique constraint', async () => {\n\tconst from = {\n\t\ttable: mysqlTable('table', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\ttable: mysqlTable('table', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}, (t) => ({\n\t\t\tuq: unique('uq').on(t.name),\n\t\t})),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasMysql(from, to, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `table` ADD `name` text NOT NULL;',\n\t\t'ALTER TABLE `table` ADD CONSTRAINT `uq` UNIQUE(`name`);',\n\t]);\n});\n\ntest('optional db aliases (snake case)', async () => {\n\tconst from = {};\n\n\tconst t1 = mysqlTable(\n\t\t't1',\n\t\t{\n\t\t\tt1Id1: int().notNull().primaryKey(),\n\t\t\tt1Col2: int().notNull(),\n\t\t\tt1Col3: int().notNull(),\n\t\t\tt2Ref: int().notNull().references(() => t2.t2Id),\n\t\t\tt1Uni: int().notNull(),\n\t\t\tt1UniIdx: int().notNull(),\n\t\t\tt1Idx: int().notNull(),\n\t\t},\n\t\t(table) => ({\n\t\t\tuni: unique('t1_uni').on(table.t1Uni),\n\t\t\tuniIdx: uniqueIndex('t1_uni_idx').on(table.t1UniIdx),\n\t\t\tidx: index('t1_idx').on(table.t1Idx),\n\t\t\tfk: foreignKey({\n\t\t\t\tcolumns: [table.t1Col2, table.t1Col3],\n\t\t\t\tforeignColumns: [t3.t3Id1, t3.t3Id2],\n\t\t\t}),\n\t\t}),\n\t);\n\n\tconst t2 = mysqlTable(\n\t\t't2',\n\t\t{\n\t\t\tt2Id: serial().primaryKey(),\n\t\t},\n\t);\n\n\tconst t3 = mysqlTable(\n\t\t't3',\n\t\t{\n\t\t\tt3Id1: int(),\n\t\t\tt3Id2: int(),\n\t\t},\n\t\t(table) => ({\n\t\t\tpk: primaryKey({\n\t\t\t\tcolumns: [table.t3Id1, table.t3Id2],\n\t\t\t}),\n\t\t}),\n\t);\n\n\tconst to = {\n\t\tt1,\n\t\tt2,\n\t\tt3,\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasMysql(from, to, [], false, 'snake_case');\n\n\tconst st1 = `CREATE TABLE \\`t1\\` (\n\t\\`t1_id1\\` int NOT NULL,\n\t\\`t1_col2\\` int NOT NULL,\n\t\\`t1_col3\\` int NOT NULL,\n\t\\`t2_ref\\` int NOT NULL,\n\t\\`t1_uni\\` int NOT NULL,\n\t\\`t1_uni_idx\\` int NOT NULL,\n\t\\`t1_idx\\` int NOT NULL,\n\tCONSTRAINT \\`t1_t1_id1\\` PRIMARY KEY(\\`t1_id1\\`),\n\tCONSTRAINT \\`t1_uni\\` UNIQUE(\\`t1_uni\\`),\n\tCONSTRAINT \\`t1_uni_idx\\` UNIQUE(\\`t1_uni_idx\\`)\n);\n`;\n\n\tconst st2 = `CREATE TABLE \\`t2\\` (\n\t\\`t2_id\\` serial AUTO_INCREMENT NOT NULL,\n\tCONSTRAINT \\`t2_t2_id\\` PRIMARY KEY(\\`t2_id\\`)\n);\n`;\n\n\tconst st3 = `CREATE TABLE \\`t3\\` (\n\t\\`t3_id1\\` int NOT NULL,\n\t\\`t3_id2\\` int NOT NULL,\n\tCONSTRAINT \\`t3_t3_id1_t3_id2_pk\\` PRIMARY KEY(\\`t3_id1\\`,\\`t3_id2\\`)\n);\n`;\n\n\tconst st4 =\n\t\t`ALTER TABLE \\`t1\\` ADD CONSTRAINT \\`t1_t2_ref_t2_t2_id_fk\\` FOREIGN KEY (\\`t2_ref\\`) REFERENCES \\`t2\\`(\\`t2_id\\`) ON DELETE no action ON UPDATE no action;`;\n\n\tconst st5 =\n\t\t`ALTER TABLE \\`t1\\` ADD CONSTRAINT \\`t1_t1_col2_t1_col3_t3_t3_id1_t3_id2_fk\\` FOREIGN KEY (\\`t1_col2\\`,\\`t1_col3\\`) REFERENCES \\`t3\\`(\\`t3_id1\\`,\\`t3_id2\\`) ON DELETE no action ON UPDATE no action;`;\n\n\tconst st6 = `CREATE INDEX \\`t1_idx\\` ON \\`t1\\` (\\`t1_idx\\`);`;\n\n\texpect(sqlStatements).toStrictEqual([st1, st2, st3, st4, st5, st6]);\n});\n\ntest('optional db aliases (camel case)', async () => {\n\tconst from = {};\n\n\tconst t1 = mysqlTable(\n\t\t't1',\n\t\t{\n\t\t\tt1_id1: int().notNull().primaryKey(),\n\t\t\tt1_col2: int().notNull(),\n\t\t\tt1_col3: int().notNull(),\n\t\t\tt2_ref: int().notNull().references(() => t2.t2_id),\n\t\t\tt1_uni: int().notNull(),\n\t\t\tt1_uni_idx: int().notNull(),\n\t\t\tt1_idx: int().notNull(),\n\t\t},\n\t\t(table) => ({\n\t\t\tuni: unique('t1Uni').on(table.t1_uni),\n\t\t\tuni_idx: uniqueIndex('t1UniIdx').on(table.t1_uni_idx),\n\t\t\tidx: index('t1Idx').on(table.t1_idx),\n\t\t\tfk: foreignKey({\n\t\t\t\tcolumns: [table.t1_col2, table.t1_col3],\n\t\t\t\tforeignColumns: [t3.t3_id1, t3.t3_id2],\n\t\t\t}),\n\t\t}),\n\t);\n\n\tconst t2 = mysqlTable(\n\t\t't2',\n\t\t{\n\t\t\tt2_id: serial().primaryKey(),\n\t\t},\n\t);\n\n\tconst t3 = mysqlTable(\n\t\t't3',\n\t\t{\n\t\t\tt3_id1: int(),\n\t\t\tt3_id2: int(),\n\t\t},\n\t\t(table) => ({\n\t\t\tpk: primaryKey({\n\t\t\t\tcolumns: [table.t3_id1, table.t3_id2],\n\t\t\t}),\n\t\t}),\n\t);\n\n\tconst to = {\n\t\tt1,\n\t\tt2,\n\t\tt3,\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasMysql(from, to, [], false, 'camelCase');\n\n\tconst st1 = `CREATE TABLE \\`t1\\` (\n\t\\`t1Id1\\` int NOT NULL,\n\t\\`t1Col2\\` int NOT NULL,\n\t\\`t1Col3\\` int NOT NULL,\n\t\\`t2Ref\\` int NOT NULL,\n\t\\`t1Uni\\` int NOT NULL,\n\t\\`t1UniIdx\\` int NOT NULL,\n\t\\`t1Idx\\` int NOT NULL,\n\tCONSTRAINT \\`t1_t1Id1\\` PRIMARY KEY(\\`t1Id1\\`),\n\tCONSTRAINT \\`t1Uni\\` UNIQUE(\\`t1Uni\\`),\n\tCONSTRAINT \\`t1UniIdx\\` UNIQUE(\\`t1UniIdx\\`)\n);\n`;\n\n\tconst st2 = `CREATE TABLE \\`t2\\` (\n\t\\`t2Id\\` serial AUTO_INCREMENT NOT NULL,\n\tCONSTRAINT \\`t2_t2Id\\` PRIMARY KEY(\\`t2Id\\`)\n);\n`;\n\n\tconst st3 = `CREATE TABLE \\`t3\\` (\n\t\\`t3Id1\\` int NOT NULL,\n\t\\`t3Id2\\` int NOT NULL,\n\tCONSTRAINT \\`t3_t3Id1_t3Id2_pk\\` PRIMARY KEY(\\`t3Id1\\`,\\`t3Id2\\`)\n);\n`;\n\n\tconst st4 =\n\t\t`ALTER TABLE \\`t1\\` ADD CONSTRAINT \\`t1_t2Ref_t2_t2Id_fk\\` FOREIGN KEY (\\`t2Ref\\`) REFERENCES \\`t2\\`(\\`t2Id\\`) ON DELETE no action ON UPDATE no action;`;\n\n\tconst st5 =\n\t\t`ALTER TABLE \\`t1\\` ADD CONSTRAINT \\`t1_t1Col2_t1Col3_t3_t3Id1_t3Id2_fk\\` FOREIGN KEY (\\`t1Col2\\`,\\`t1Col3\\`) REFERENCES \\`t3\\`(\\`t3Id1\\`,\\`t3Id2\\`) ON DELETE no action ON UPDATE no action;`;\n\n\tconst st6 = `CREATE INDEX \\`t1Idx\\` ON \\`t1\\` (\\`t1Idx\\`);`;\n\n\texpect(sqlStatements).toStrictEqual([st1, st2, st3, st4, st5, st6]);\n});\n\ntest('add table with ts enum', async () => {\n\tenum Test {\n\t\tvalue = 'value',\n\t}\n\tconst to = {\n\t\tusers: mysqlTable('users', {\n\t\t\tenum: mysqlEnum(Test),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasMysql({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [{\n\t\t\tautoincrement: false,\n\t\t\tname: 'enum',\n\t\t\tnotNull: false,\n\t\t\tprimaryKey: false,\n\t\t\ttype: \"enum('value')\",\n\t\t}],\n\t\tcompositePKs: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t\tcheckConstraints: [],\n\t});\n});\n"
  },
  {
    "path": "drizzle-kit/tests/pg-array.test.ts",
    "content": "import {\n\tbigint,\n\tboolean,\n\tdate,\n\tinteger,\n\tjson,\n\tpgEnum,\n\tpgTable,\n\tserial,\n\ttext,\n\ttimestamp,\n\tuuid,\n} from 'drizzle-orm/pg-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemas } from './schemaDiffer';\n\ntest('array #1: empty array default', async (t) => {\n\tconst from = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: integer('values').array().default([]),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'test',\n\t\tschema: '',\n\t\tcolumn: { name: 'values', type: 'integer[]', primaryKey: false, notNull: false, default: \"'{}'\" },\n\t});\n});\n\ntest('array #2: integer array default', async (t) => {\n\tconst from = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: integer('values').array().default([1, 2, 3]),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'test',\n\t\tschema: '',\n\t\tcolumn: { name: 'values', type: 'integer[]', primaryKey: false, notNull: false, default: \"'{1,2,3}'\" },\n\t});\n});\n\ntest('array #3: bigint array default', async (t) => {\n\tconst from = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: bigint('values', { mode: 'bigint' }).array().default([BigInt(1), BigInt(2), BigInt(3)]),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'test',\n\t\tschema: '',\n\t\tcolumn: { name: 'values', type: 'bigint[]', primaryKey: false, notNull: false, default: \"'{1,2,3}'\" },\n\t});\n});\n\ntest('array #4: boolean array default', async (t) => {\n\tconst from = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: boolean('values').array().default([true, false, true]),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'test',\n\t\tschema: '',\n\t\tcolumn: {\n\t\t\tname: 'values',\n\t\t\ttype: 'boolean[]',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tdefault: \"'{true,false,true}'\",\n\t\t},\n\t});\n});\n\ntest('array #5: multi-dimensional array default', async (t) => {\n\tconst from = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: integer('values').array().array().default([[1, 2], [3, 4]]),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'test',\n\t\tschema: '',\n\t\tcolumn: {\n\t\t\tname: 'values',\n\t\t\ttype: 'integer[][]',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tdefault: \"'{{1,2},{3,4}}'\",\n\t\t},\n\t});\n});\n\ntest('array #6: date array default', async (t) => {\n\tconst from = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: date('values').array().default(['2024-08-06', '2024-08-07']),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'test',\n\t\tschema: '',\n\t\tcolumn: {\n\t\t\tname: 'values',\n\t\t\ttype: 'date[]',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tdefault: '\\'{\"2024-08-06\",\"2024-08-07\"}\\'',\n\t\t},\n\t});\n});\n\ntest('array #7: timestamp array default', async (t) => {\n\tconst from = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: timestamp('values').array().default([new Date('2024-08-06'), new Date('2024-08-07')]),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'test',\n\t\tschema: '',\n\t\tcolumn: {\n\t\t\tname: 'values',\n\t\t\ttype: 'timestamp[]',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tdefault: '\\'{\"2024-08-06 00:00:00.000\",\"2024-08-07 00:00:00.000\"}\\'',\n\t\t},\n\t});\n});\n\ntest('array #8: json array default', async (t) => {\n\tconst from = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: json('values').array().default([{ a: 1 }, { b: 2 }]),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'test',\n\t\tschema: '',\n\t\tcolumn: {\n\t\t\tname: 'values',\n\t\t\ttype: 'json[]',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tdefault: '\\'{\"{\\\\\"a\\\\\":1}\",\"{\\\\\"b\\\\\":2}\"}\\'',\n\t\t},\n\t});\n});\n\ntest('array #9: text array default', async (t) => {\n\tconst from = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: text('values').array().default(['abc', 'def']),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'test',\n\t\tschema: '',\n\t\tcolumn: {\n\t\t\tname: 'values',\n\t\t\ttype: 'text[]',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tdefault: '\\'{\"abc\",\"def\"}\\'',\n\t\t},\n\t});\n});\n\ntest('array #10: uuid array default', async (t) => {\n\tconst from = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: uuid('values').array().default([\n\t\t\t\t'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',\n\t\t\t\t'b0eebc99-9c0b-4ef8-bb6d-cbb9bd380a11',\n\t\t\t]),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'test',\n\t\tschema: '',\n\t\tcolumn: {\n\t\t\tname: 'values',\n\t\t\ttype: 'uuid[]',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tdefault: '\\'{\"a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11\",\"b0eebc99-9c0b-4ef8-bb6d-cbb9bd380a11\"}\\'',\n\t\t},\n\t});\n});\n\ntest('array #11: enum array default', async (t) => {\n\tconst testEnum = pgEnum('test_enum', ['a', 'b', 'c']);\n\n\tconst from = {\n\t\tenum: testEnum,\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tenum: testEnum,\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: testEnum('values').array().default(['a', 'b', 'c']),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'test',\n\t\tschema: '',\n\t\tcolumn: {\n\t\t\tname: 'values',\n\t\t\ttype: 'test_enum[]',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tdefault: '\\'{\"a\",\"b\",\"c\"}\\'',\n\t\t\ttypeSchema: 'public',\n\t\t},\n\t});\n});\n\ntest('array #12: enum empty array default', async (t) => {\n\tconst testEnum = pgEnum('test_enum', ['a', 'b', 'c']);\n\n\tconst from = {\n\t\tenum: testEnum,\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tenum: testEnum,\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: testEnum('values').array().default([]),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'test',\n\t\tschema: '',\n\t\tcolumn: {\n\t\t\tname: 'values',\n\t\t\ttype: 'test_enum[]',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tdefault: \"'{}'\",\n\t\t\ttypeSchema: 'public',\n\t\t},\n\t});\n});\n"
  },
  {
    "path": "drizzle-kit/tests/pg-checks.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { check, integer, pgTable, serial, varchar } from 'drizzle-orm/pg-core';\nimport { JsonCreateTableStatement } from 'src/jsonStatements';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemas } from './schemaDiffer';\n\ntest('create table with check', async (t) => {\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\ttype: 'serial',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'age',\n\t\t\t\ttype: 'integer',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\tcheckConstraints: ['some_check_name;\"users\".\"age\" > 21'],\n\t\tcompositePkName: '',\n\t\tuniqueConstraints: [],\n\t\tisRLSEnabled: false,\n\t\tpolicies: [],\n\t} as JsonCreateTableStatement);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \"users\" (\n\\t\"id\" serial PRIMARY KEY NOT NULL,\n\\t\"age\" integer,\n\\tCONSTRAINT \"some_check_name\" CHECK (\"users\".\"age\" > 21)\n);\\n`);\n});\n\ntest('add check contraint to existing table', async (t) => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: integer('age'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemas(from, to, []);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_check_constraint',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tdata: 'some_check_name;\"users\".\"age\" > 21',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"users\" ADD CONSTRAINT \"some_check_name\" CHECK (\"users\".\"age\" > 21);`,\n\t);\n});\n\ntest('drop check contraint in existing table', async (t) => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: integer('age'),\n\t\t}),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemas(from, to, []);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'delete_check_constraint',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tconstraintName: 'some_check_name',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"users\" DROP CONSTRAINT \"some_check_name\";`,\n\t);\n});\n\ntest('rename check constraint', async (t) => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('new_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemas(from, to, []);\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tconstraintName: 'some_check_name',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'delete_check_constraint',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tdata: 'new_check_name;\"users\".\"age\" > 21',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'create_check_constraint',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"users\" DROP CONSTRAINT \"some_check_name\";`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"users\" ADD CONSTRAINT \"new_check_name\" CHECK (\"users\".\"age\" > 21);`,\n\t);\n});\n\ntest('alter check constraint', async (t) => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('new_check_name', sql`${table.age} > 10`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemas(from, to, []);\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tconstraintName: 'some_check_name',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'delete_check_constraint',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tdata: 'new_check_name;\"users\".\"age\" > 10',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'create_check_constraint',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"users\" DROP CONSTRAINT \"some_check_name\";`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"users\" ADD CONSTRAINT \"new_check_name\" CHECK (\"users\".\"age\" > 10);`,\n\t);\n});\n\ntest('alter multiple check constraints', async (t) => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: integer('age'),\n\t\t\tname: varchar('name'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint1: check('some_check_name_1', sql`${table.age} > 21`),\n\t\t\tcheckConstraint2: check('some_check_name_2', sql`${table.name} != 'Alex'`),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: integer('age'),\n\t\t\tname: varchar('name'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint1: check('some_check_name_3', sql`${table.age} > 21`),\n\t\t\tcheckConstraint2: check('some_check_name_4', sql`${table.name} != 'Alex'`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemas(from, to, []);\n\texpect(statements.length).toBe(4);\n\texpect(statements[0]).toStrictEqual({\n\t\tconstraintName: 'some_check_name_1',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'delete_check_constraint',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tconstraintName: 'some_check_name_2',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'delete_check_constraint',\n\t});\n\texpect(statements[2]).toStrictEqual({\n\t\tdata: 'some_check_name_3;\"users\".\"age\" > 21',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'create_check_constraint',\n\t});\n\texpect(statements[3]).toStrictEqual({\n\t\tdata: 'some_check_name_4;\"users\".\"name\" != \\'Alex\\'',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'create_check_constraint',\n\t});\n\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"users\" DROP CONSTRAINT \"some_check_name_1\";`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"users\" DROP CONSTRAINT \"some_check_name_2\";`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`ALTER TABLE \"users\" ADD CONSTRAINT \"some_check_name_3\" CHECK (\"users\".\"age\" > 21);`,\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t`ALTER TABLE \"users\" ADD CONSTRAINT \"some_check_name_4\" CHECK (\"users\".\"name\" != \\'Alex\\');`,\n\t);\n});\n\ntest('create checks with same names', async (t) => {\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tage: integer('age'),\n\t\t\tname: varchar('name'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint1: check('some_check_name', sql`${table.age} > 21`),\n\t\t\tcheckConstraint2: check('some_check_name', sql`${table.name} != 'Alex'`),\n\t\t})),\n\t};\n\n\tawait expect(diffTestSchemas({}, to, [])).rejects.toThrowError();\n});\n"
  },
  {
    "path": "drizzle-kit/tests/pg-columns.test.ts",
    "content": "import { integer, pgTable, primaryKey, serial, text, uuid, varchar } from 'drizzle-orm/pg-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemas } from './schemaDiffer';\n\ntest('add columns #1', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumn: { name: 'name', type: 'text', primaryKey: false, notNull: false },\n\t});\n});\n\ntest('add columns #2', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name'),\n\t\t\temail: text('email'),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumn: { name: 'name', type: 'text', primaryKey: false, notNull: false },\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumn: { name: 'email', type: 'text', primaryKey: false, notNull: false },\n\t});\n});\n\ntest('alter column change name #1', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name1'),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(schema1, schema2, [\n\t\t'public.users.name->public.users.name1',\n\t]);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_rename_column',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\toldColumnName: 'name',\n\t\tnewColumnName: 'name1',\n\t});\n});\n\ntest('alter column change name #2', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name1'),\n\t\t\temail: text('email'),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(schema1, schema2, [\n\t\t'public.users.name->public.users.name1',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_rename_column',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\toldColumnName: 'name',\n\t\tnewColumnName: 'name1',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumn: {\n\t\t\tname: 'email',\n\t\t\tnotNull: false,\n\t\t\tprimaryKey: false,\n\t\t\ttype: 'text',\n\t\t},\n\t});\n});\n\ntest('alter table add composite pk', async (t) => {\n\tconst schema1 = {\n\t\ttable: pgTable('table', {\n\t\t\tid1: integer('id1'),\n\t\t\tid2: integer('id2'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\ttable: pgTable(\n\t\t\t'table',\n\t\t\t{\n\t\t\t\tid1: integer('id1'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tpk: primaryKey({ columns: [t.id1, t.id2] }),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_composite_pk',\n\t\ttableName: 'table',\n\t\tdata: 'id1,id2;table_id1_id2_pk',\n\t\tschema: '',\n\t\tconstraintName: 'table_id1_id2_pk',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t'ALTER TABLE \"table\" ADD CONSTRAINT \"table_id1_id2_pk\" PRIMARY KEY(\"id1\",\"id2\");',\n\t);\n});\n\ntest('rename table rename column #1', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users1', {\n\t\t\tid: integer('id1'),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(schema1, schema2, [\n\t\t'public.users->public.users1',\n\t\t'public.users1.id->public.users1.id1',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_table',\n\t\ttableNameFrom: 'users',\n\t\ttableNameTo: 'users1',\n\t\tfromSchema: '',\n\t\ttoSchema: '',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'alter_table_rename_column',\n\t\toldColumnName: 'id',\n\t\tnewColumnName: 'id1',\n\t\tschema: '',\n\t\ttableName: 'users1',\n\t});\n});\n\ntest('with composite pks #1', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid1: integer('id1'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tpk: primaryKey({ columns: [t.id1, t.id2], name: 'compositePK' }),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid1: integer('id1'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t\ttext: text('text'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tpk: primaryKey({ columns: [t.id1, t.id2], name: 'compositePK' }),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst { statements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumn: {\n\t\t\tname: 'text',\n\t\t\tnotNull: false,\n\t\t\tprimaryKey: false,\n\t\t\ttype: 'text',\n\t\t},\n\t});\n});\n\ntest('with composite pks #2', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid1: integer('id1'),\n\t\t\tid2: integer('id2'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid1: integer('id1'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tpk: primaryKey({ columns: [t.id1, t.id2], name: 'compositePK' }),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst { statements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_composite_pk',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tconstraintName: 'compositePK',\n\t\tdata: 'id1,id2;compositePK',\n\t});\n});\n\ntest('with composite pks #3', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid1: integer('id1'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tpk: primaryKey({ columns: [t.id1, t.id2], name: 'compositePK' }),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid1: integer('id1'),\n\t\t\t\tid3: integer('id3'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tpk: primaryKey({ columns: [t.id1, t.id3], name: 'compositePK' }),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\t// TODO: remove redundand drop/create create constraint\n\tconst { statements } = await diffTestSchemas(schema1, schema2, [\n\t\t'public.users.id2->public.users.id3',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_rename_column',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tnewColumnName: 'id3',\n\t\toldColumnName: 'id2',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'alter_composite_pk',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tnew: 'id1,id3;compositePK',\n\t\told: 'id1,id2;compositePK',\n\t\tnewConstraintName: 'compositePK',\n\t\toldConstraintName: 'compositePK',\n\t});\n});\n\ntest('add multiple constraints #1', async (t) => {\n\tconst t1 = pgTable('t1', {\n\t\tid: uuid('id').primaryKey().defaultRandom(),\n\t});\n\n\tconst t2 = pgTable('t2', {\n\t\tid: uuid('id').primaryKey().defaultRandom(),\n\t});\n\n\tconst t3 = pgTable('t3', {\n\t\tid: uuid('id').primaryKey().defaultRandom(),\n\t});\n\n\tconst schema1 = {\n\t\tt1,\n\t\tt2,\n\t\tt3,\n\t\tref1: pgTable('ref1', {\n\t\t\tid1: uuid('id1').references(() => t1.id),\n\t\t\tid2: uuid('id2').references(() => t2.id),\n\t\t\tid3: uuid('id3').references(() => t3.id),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tt1,\n\t\tt2,\n\t\tt3,\n\t\tref1: pgTable('ref1', {\n\t\t\tid1: uuid('id1').references(() => t1.id, { onDelete: 'cascade' }),\n\t\t\tid2: uuid('id2').references(() => t2.id, { onDelete: 'set null' }),\n\t\t\tid3: uuid('id3').references(() => t3.id, { onDelete: 'cascade' }),\n\t\t}),\n\t};\n\n\t// TODO: remove redundand drop/create create constraint\n\tconst { statements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(statements.length).toBe(6);\n});\n\ntest('add multiple constraints #2', async (t) => {\n\tconst t1 = pgTable('t1', {\n\t\tid1: uuid('id1').primaryKey().defaultRandom(),\n\t\tid2: uuid('id2').primaryKey().defaultRandom(),\n\t\tid3: uuid('id3').primaryKey().defaultRandom(),\n\t});\n\n\tconst schema1 = {\n\t\tt1,\n\t\tref1: pgTable('ref1', {\n\t\t\tid1: uuid('id1').references(() => t1.id1),\n\t\t\tid2: uuid('id2').references(() => t1.id2),\n\t\t\tid3: uuid('id3').references(() => t1.id3),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tt1,\n\t\tref1: pgTable('ref1', {\n\t\t\tid1: uuid('id1').references(() => t1.id1, { onDelete: 'cascade' }),\n\t\t\tid2: uuid('id2').references(() => t1.id2, { onDelete: 'set null' }),\n\t\t\tid3: uuid('id3').references(() => t1.id3, { onDelete: 'cascade' }),\n\t\t}),\n\t};\n\n\t// TODO: remove redundand drop/create create constraint\n\tconst { statements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(statements.length).toBe(6);\n});\n\ntest('add multiple constraints #3', async (t) => {\n\tconst t1 = pgTable('t1', {\n\t\tid1: uuid('id1').primaryKey().defaultRandom(),\n\t\tid2: uuid('id2').primaryKey().defaultRandom(),\n\t\tid3: uuid('id3').primaryKey().defaultRandom(),\n\t});\n\n\tconst schema1 = {\n\t\tt1,\n\t\tref1: pgTable('ref1', {\n\t\t\tid: uuid('id').references(() => t1.id1),\n\t\t}),\n\t\tref2: pgTable('ref2', {\n\t\t\tid: uuid('id').references(() => t1.id2),\n\t\t}),\n\t\tref3: pgTable('ref3', {\n\t\t\tid: uuid('id').references(() => t1.id3),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tt1,\n\t\tref1: pgTable('ref1', {\n\t\t\tid: uuid('id').references(() => t1.id1, { onDelete: 'cascade' }),\n\t\t}),\n\t\tref2: pgTable('ref2', {\n\t\t\tid: uuid('id').references(() => t1.id2, { onDelete: 'set null' }),\n\t\t}),\n\t\tref3: pgTable('ref3', {\n\t\t\tid: uuid('id').references(() => t1.id3, { onDelete: 'cascade' }),\n\t\t}),\n\t};\n\n\t// TODO: remove redundand drop/create create constraint\n\tconst { statements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(statements.length).toBe(6);\n});\n\ntest('varchar and text default values escape single quotes', async (t) => {\n\tconst schema1 = {\n\t\ttable: pgTable('table', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst schem2 = {\n\t\ttable: pgTable('table', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\ttext: text('text').default(\"escape's quotes\"),\n\t\t\tvarchar: varchar('varchar').default(\"escape's quotes\"),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemas(schema1, schem2, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toStrictEqual(\n\t\t'ALTER TABLE \"table\" ADD COLUMN \"text\" text DEFAULT \\'escape\\'\\'s quotes\\';',\n\t);\n\texpect(sqlStatements[1]).toStrictEqual(\n\t\t'ALTER TABLE \"table\" ADD COLUMN \"varchar\" varchar DEFAULT \\'escape\\'\\'s quotes\\';',\n\t);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/pg-enums.test.ts",
    "content": "import { integer, pgEnum, pgSchema, pgTable, serial, text, varchar } from 'drizzle-orm/pg-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemas } from './schemaDiffer';\n\ntest('enums #1', async () => {\n\tconst to = {\n\t\tenum: pgEnum('enum', ['value']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas({}, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`CREATE TYPE \"public\".\"enum\" AS ENUM('value');`);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'enum',\n\t\tschema: 'public',\n\t\ttype: 'create_type_enum',\n\t\tvalues: ['value'],\n\t});\n});\n\ntest('enums #2', async () => {\n\tconst folder = pgSchema('folder');\n\tconst to = {\n\t\tenum: folder.enum('enum', ['value']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas({}, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`CREATE TYPE \"folder\".\"enum\" AS ENUM('value');`);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'enum',\n\t\tschema: 'folder',\n\t\ttype: 'create_type_enum',\n\t\tvalues: ['value'],\n\t});\n});\n\ntest('enums #3', async () => {\n\tconst from = {\n\t\tenum: pgEnum('enum', ['value']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, {}, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`DROP TYPE \"public\".\"enum\";`);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'drop_type_enum',\n\t\tname: 'enum',\n\t\tschema: 'public',\n\t});\n});\n\ntest('enums #4', async () => {\n\tconst folder = pgSchema('folder');\n\n\tconst from = {\n\t\tenum: folder.enum('enum', ['value']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, {}, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`DROP TYPE \"folder\".\"enum\";`);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'drop_type_enum',\n\t\tname: 'enum',\n\t\tschema: 'folder',\n\t});\n});\n\ntest('enums #5', async () => {\n\tconst folder1 = pgSchema('folder1');\n\tconst folder2 = pgSchema('folder2');\n\n\tconst from = {\n\t\tfolder1,\n\t\tenum: folder1.enum('enum', ['value']),\n\t};\n\n\tconst to = {\n\t\tfolder2,\n\t\tenum: folder2.enum('enum', ['value']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, ['folder1->folder2']);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER SCHEMA \"folder1\" RENAME TO \"folder2\";\\n`);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_schema',\n\t\tfrom: 'folder1',\n\t\tto: 'folder2',\n\t});\n});\n\ntest('enums #6', async () => {\n\tconst folder1 = pgSchema('folder1');\n\tconst folder2 = pgSchema('folder2');\n\n\tconst from = {\n\t\tfolder1,\n\t\tfolder2,\n\t\tenum: folder1.enum('enum', ['value']),\n\t};\n\n\tconst to = {\n\t\tfolder1,\n\t\tfolder2,\n\t\tenum: folder2.enum('enum', ['value']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, [\n\t\t'folder1.enum->folder2.enum',\n\t]);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER TYPE \"folder1\".\"enum\" SET SCHEMA \"folder2\";`);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'move_type_enum',\n\t\tname: 'enum',\n\t\tschemaFrom: 'folder1',\n\t\tschemaTo: 'folder2',\n\t});\n});\n\ntest('enums #7', async () => {\n\tconst from = {\n\t\tenum: pgEnum('enum', ['value1']),\n\t};\n\n\tconst to = {\n\t\tenum: pgEnum('enum', ['value1', 'value2']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER TYPE \"public\".\"enum\" ADD VALUE 'value2';`);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_type_add_value',\n\t\tname: 'enum',\n\t\tschema: 'public',\n\t\tvalue: 'value2',\n\t\tbefore: '',\n\t});\n});\n\ntest('enums #8', async () => {\n\tconst from = {\n\t\tenum: pgEnum('enum', ['value1']),\n\t};\n\n\tconst to = {\n\t\tenum: pgEnum('enum', ['value1', 'value2', 'value3']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`ALTER TYPE \"public\".\"enum\" ADD VALUE 'value2';`);\n\texpect(sqlStatements[1]).toBe(`ALTER TYPE \"public\".\"enum\" ADD VALUE 'value3';`);\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_type_add_value',\n\t\tname: 'enum',\n\t\tschema: 'public',\n\t\tvalue: 'value2',\n\t\tbefore: '',\n\t});\n\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'alter_type_add_value',\n\t\tname: 'enum',\n\t\tschema: 'public',\n\t\tvalue: 'value3',\n\t\tbefore: '',\n\t});\n});\n\ntest('enums #9', async () => {\n\tconst from = {\n\t\tenum: pgEnum('enum', ['value1', 'value3']),\n\t};\n\n\tconst to = {\n\t\tenum: pgEnum('enum', ['value1', 'value2', 'value3']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER TYPE \"public\".\"enum\" ADD VALUE 'value2' BEFORE 'value3';`);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_type_add_value',\n\t\tname: 'enum',\n\t\tschema: 'public',\n\t\tvalue: 'value2',\n\t\tbefore: 'value3',\n\t});\n});\n\ntest('enums #10', async () => {\n\tconst schema = pgSchema('folder');\n\tconst from = {\n\t\tenum: schema.enum('enum', ['value1']),\n\t};\n\n\tconst to = {\n\t\tenum: schema.enum('enum', ['value1', 'value2']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER TYPE \"folder\".\"enum\" ADD VALUE 'value2';`);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_type_add_value',\n\t\tname: 'enum',\n\t\tschema: 'folder',\n\t\tvalue: 'value2',\n\t\tbefore: '',\n\t});\n});\n\ntest('enums #11', async () => {\n\tconst schema1 = pgSchema('folder1');\n\tconst from = {\n\t\tenum: schema1.enum('enum', ['value1']),\n\t};\n\n\tconst to = {\n\t\tenum: pgEnum('enum', ['value1']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, [\n\t\t'folder1.enum->public.enum',\n\t]);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER TYPE \"folder1\".\"enum\" SET SCHEMA \"public\";`);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'move_type_enum',\n\t\tname: 'enum',\n\t\tschemaFrom: 'folder1',\n\t\tschemaTo: 'public',\n\t});\n});\n\ntest('enums #12', async () => {\n\tconst schema1 = pgSchema('folder1');\n\tconst from = {\n\t\tenum: pgEnum('enum', ['value1']),\n\t};\n\n\tconst to = {\n\t\tenum: schema1.enum('enum', ['value1']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, [\n\t\t'public.enum->folder1.enum',\n\t]);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER TYPE \"public\".\"enum\" SET SCHEMA \"folder1\";`);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'move_type_enum',\n\t\tname: 'enum',\n\t\tschemaFrom: 'public',\n\t\tschemaTo: 'folder1',\n\t});\n});\n\ntest('enums #13', async () => {\n\tconst from = {\n\t\tenum: pgEnum('enum1', ['value1']),\n\t};\n\n\tconst to = {\n\t\tenum: pgEnum('enum2', ['value1']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, [\n\t\t'public.enum1->public.enum2',\n\t]);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER TYPE \"public\".\"enum1\" RENAME TO \"enum2\";`);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_type_enum',\n\t\tnameFrom: 'enum1',\n\t\tnameTo: 'enum2',\n\t\tschema: 'public',\n\t});\n});\n\ntest('enums #14', async () => {\n\tconst folder1 = pgSchema('folder1');\n\tconst folder2 = pgSchema('folder2');\n\tconst from = {\n\t\tenum: folder1.enum('enum1', ['value1']),\n\t};\n\n\tconst to = {\n\t\tenum: folder2.enum('enum2', ['value1']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, [\n\t\t'folder1.enum1->folder2.enum2',\n\t]);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`ALTER TYPE \"folder1\".\"enum1\" SET SCHEMA \"folder2\";`);\n\texpect(sqlStatements[1]).toBe(`ALTER TYPE \"folder2\".\"enum1\" RENAME TO \"enum2\";`);\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'move_type_enum',\n\t\tname: 'enum1',\n\t\tschemaFrom: 'folder1',\n\t\tschemaTo: 'folder2',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'rename_type_enum',\n\t\tnameFrom: 'enum1',\n\t\tnameTo: 'enum2',\n\t\tschema: 'folder2',\n\t});\n});\n\ntest('enums #15', async () => {\n\tconst folder1 = pgSchema('folder1');\n\tconst folder2 = pgSchema('folder2');\n\tconst from = {\n\t\tenum: folder1.enum('enum1', ['value1', 'value4']),\n\t};\n\n\tconst to = {\n\t\tenum: folder2.enum('enum2', ['value1', 'value2', 'value3', 'value4']),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, [\n\t\t'folder1.enum1->folder2.enum2',\n\t]);\n\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(`ALTER TYPE \"folder1\".\"enum1\" SET SCHEMA \"folder2\";`);\n\texpect(sqlStatements[1]).toBe(`ALTER TYPE \"folder2\".\"enum1\" RENAME TO \"enum2\";`);\n\texpect(sqlStatements[2]).toBe(`ALTER TYPE \"folder2\".\"enum2\" ADD VALUE 'value2' BEFORE 'value4';`);\n\texpect(sqlStatements[3]).toBe(`ALTER TYPE \"folder2\".\"enum2\" ADD VALUE 'value3' BEFORE 'value4';`);\n\n\texpect(statements.length).toBe(4);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'move_type_enum',\n\t\tname: 'enum1',\n\t\tschemaFrom: 'folder1',\n\t\tschemaTo: 'folder2',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'rename_type_enum',\n\t\tnameFrom: 'enum1',\n\t\tnameTo: 'enum2',\n\t\tschema: 'folder2',\n\t});\n\texpect(statements[2]).toStrictEqual({\n\t\ttype: 'alter_type_add_value',\n\t\tname: 'enum2',\n\t\tschema: 'folder2',\n\t\tvalue: 'value2',\n\t\tbefore: 'value4',\n\t});\n\texpect(statements[3]).toStrictEqual({\n\t\ttype: 'alter_type_add_value',\n\t\tname: 'enum2',\n\t\tschema: 'folder2',\n\t\tvalue: 'value3',\n\t\tbefore: 'value4',\n\t});\n});\n\ntest('enums #16', async () => {\n\tconst enum1 = pgEnum('enum1', ['value1']);\n\tconst enum2 = pgEnum('enum2', ['value1']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, [\n\t\t'public.enum1->public.enum2',\n\t]);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER TYPE \"public\".\"enum1\" RENAME TO \"enum2\";`);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_type_enum',\n\t\tnameFrom: 'enum1',\n\t\tnameTo: 'enum2',\n\t\tschema: 'public',\n\t});\n});\n\ntest('enums #17', async () => {\n\tconst schema = pgSchema('schema');\n\tconst enum1 = pgEnum('enum1', ['value1']);\n\tconst enum2 = schema.enum('enum1', ['value1']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, [\n\t\t'public.enum1->schema.enum1',\n\t]);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER TYPE \"public\".\"enum1\" SET SCHEMA \"schema\";`);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'move_type_enum',\n\t\tname: 'enum1',\n\t\tschemaFrom: 'public',\n\t\tschemaTo: 'schema',\n\t});\n});\n\ntest('enums #18', async () => {\n\tconst schema1 = pgSchema('schema1');\n\tconst schema2 = pgSchema('schema2');\n\n\tconst enum1 = schema1.enum('enum1', ['value1']);\n\tconst enum2 = schema2.enum('enum2', ['value1']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column'),\n\t\t}),\n\t};\n\n\t// change name and schema of the enum, no table changes\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, [\n\t\t'schema1.enum1->schema2.enum2',\n\t]);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`ALTER TYPE \"schema1\".\"enum1\" SET SCHEMA \"schema2\";`);\n\texpect(sqlStatements[1]).toBe(`ALTER TYPE \"schema2\".\"enum1\" RENAME TO \"enum2\";`);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'move_type_enum',\n\t\tname: 'enum1',\n\t\tschemaFrom: 'schema1',\n\t\tschemaTo: 'schema2',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'rename_type_enum',\n\t\tnameFrom: 'enum1',\n\t\tnameTo: 'enum2',\n\t\tschema: 'schema2',\n\t});\n});\n\ntest('enums #19', async () => {\n\tconst myEnum = pgEnum('my_enum', [\"escape's quotes\"]);\n\n\tconst from = {};\n\n\tconst to = { myEnum };\n\n\tconst { sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toStrictEqual(\n\t\t'CREATE TYPE \"public\".\"my_enum\" AS ENUM(\\'escape\\'\\'s quotes\\');',\n\t);\n});\n\ntest('enums #20', async () => {\n\tconst myEnum = pgEnum('my_enum', ['one', 'two', 'three']);\n\n\tconst from = {\n\t\tmyEnum,\n\t\ttable: pgTable('table', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tmyEnum,\n\t\ttable: pgTable('table', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tcol1: myEnum('col1'),\n\t\t\tcol2: integer('col2'),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"table\" ADD COLUMN \"col1\" \"my_enum\";',\n\t\t'ALTER TABLE \"table\" ADD COLUMN \"col2\" integer;',\n\t]);\n});\n\ntest('enums #21', async () => {\n\tconst myEnum = pgEnum('my_enum', ['one', 'two', 'three']);\n\n\tconst from = {\n\t\tmyEnum,\n\t\ttable: pgTable('table', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tmyEnum,\n\t\ttable: pgTable('table', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tcol1: myEnum('col1').array(),\n\t\t\tcol2: integer('col2').array(),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"table\" ADD COLUMN \"col1\" \"my_enum\"[];',\n\t\t'ALTER TABLE \"table\" ADD COLUMN \"col2\" integer[];',\n\t]);\n});\n\ntest('drop enum value', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value2', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t};\n\n\tconst enum2 = pgEnum('enum', ['value1', 'value3']);\n\tconst to = {\n\t\tenum2,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`DROP TYPE \"public\".\"enum\";`);\n\texpect(sqlStatements[1]).toBe(`CREATE TYPE \"public\".\"enum\" AS ENUM('value1', 'value3');`);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [],\n\t\tdeletedValues: [\n\t\t\t'value2',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t],\n\t\tenumSchema: 'public',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\ntest('drop enum value. enum is columns data type', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value2', 'value3']);\n\n\tconst schema = pgSchema('new_schema');\n\n\tconst from = {\n\t\tschema,\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column'),\n\t\t}),\n\t\ttable2: schema.table('table', {\n\t\t\tcolumn: enum1('column'),\n\t\t}),\n\t};\n\n\tconst enum2 = pgEnum('enum', ['value1', 'value3']);\n\tconst to = {\n\t\tschema,\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column'),\n\t\t}),\n\t\ttable2: schema.table('table', {\n\t\t\tcolumn: enum1('column'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[2]).toBe(`DROP TYPE \"public\".\"enum\";`);\n\texpect(sqlStatements[3]).toBe(`CREATE TYPE \"public\".\"enum\" AS ENUM('value1', 'value3');`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\" USING \"column\"::\"public\".\"enum\";`,\n\t);\n\texpect(sqlStatements[5]).toBe(\n\t\t`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\" USING \"column\"::\"public\".\"enum\";`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: '',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: undefined,\n\t\t\t\tcolumnType: 'enum',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: 'new_schema',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: undefined,\n\t\t\t\tcolumnType: 'enum',\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value2',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t],\n\t\tenumSchema: 'public',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\ntest('shuffle enum values', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value2', 'value3']);\n\n\tconst schema = pgSchema('new_schema');\n\n\tconst from = {\n\t\tschema,\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column'),\n\t\t}),\n\t\ttable2: schema.table('table', {\n\t\t\tcolumn: enum1('column'),\n\t\t}),\n\t};\n\n\tconst enum2 = pgEnum('enum', ['value1', 'value3', 'value2']);\n\tconst to = {\n\t\tschema,\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column'),\n\t\t}),\n\t\ttable2: schema.table('table', {\n\t\t\tcolumn: enum2('column'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[2]).toBe(`DROP TYPE \"public\".\"enum\";`);\n\texpect(sqlStatements[3]).toBe(`CREATE TYPE \"public\".\"enum\" AS ENUM('value1', 'value3', 'value2');`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\" USING \"column\"::\"public\".\"enum\";`,\n\t);\n\texpect(sqlStatements[5]).toBe(\n\t\t`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\" USING \"column\"::\"public\".\"enum\";`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: '',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: undefined,\n\t\t\t\tcolumnType: 'enum',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: 'new_schema',\n\t\t\t\ttable: 'table',\n\t\t\t\tcolumnType: 'enum',\n\t\t\t\tdefault: undefined,\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value3',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t\t'value2',\n\t\t],\n\t\tenumSchema: 'public',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\ntest('enums as ts enum', async () => {\n\tenum Test {\n\t\tvalue = 'value',\n\t}\n\n\tconst to = {\n\t\tenum: pgEnum('enum', Test),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas({}, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`CREATE TYPE \"public\".\"enum\" AS ENUM('value');`);\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'enum',\n\t\tschema: 'public',\n\t\ttype: 'create_type_enum',\n\t\tvalues: ['value'],\n\t});\n});\n\n// +\ntest('column is enum type with default value. shuffle enum', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value2', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').default('value2'),\n\t\t}),\n\t};\n\n\tconst enum2 = pgEnum('enum', ['value1', 'value3', 'value2']);\n\tconst to = {\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column').default('value2'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value2'::text;`);\n\texpect(sqlStatements[2]).toBe(`DROP TYPE \"public\".\"enum\";`);\n\texpect(sqlStatements[3]).toBe(`CREATE TYPE \"public\".\"enum\" AS ENUM('value1', 'value3', 'value2');`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value2'::\"public\".\"enum\";`,\n\t);\n\texpect(sqlStatements[5]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\" USING \"column\"::\"public\".\"enum\";`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: '',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: \"'value2'\",\n\t\t\t\tcolumnType: 'enum',\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value3',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t\t'value2',\n\t\t],\n\t\tenumSchema: 'public',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\n// +\ntest('column is array enum type with default value. shuffle enum', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value2', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').array().default(['value2']),\n\t\t}),\n\t};\n\n\tconst enum2 = pgEnum('enum', ['value1', 'value3', 'value2']);\n\tconst to = {\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column').array().default(['value3']),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"value3\"}'::text;`);\n\texpect(sqlStatements[2]).toBe(`DROP TYPE \"public\".\"enum\";`);\n\texpect(sqlStatements[3]).toBe(`CREATE TYPE \"public\".\"enum\" AS ENUM('value1', 'value3', 'value2');`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"value3\"}'::\"public\".\"enum\"[];`,\n\t);\n\texpect(sqlStatements[5]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\"[] USING \"column\"::\"public\".\"enum\"[];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: '',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: `'{\"value3\"}'`,\n\t\t\t\tcolumnType: 'enum[]',\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value3',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t\t'value2',\n\t\t],\n\t\tenumSchema: 'public',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\n// +\ntest('column is array enum with custom size type with default value. shuffle enum', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value2', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').array(3).default(['value2']),\n\t\t}),\n\t};\n\n\tconst enum2 = pgEnum('enum', ['value1', 'value3', 'value2']);\n\tconst to = {\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column').array(3).default(['value2']),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"value2\"}'::text;`);\n\texpect(sqlStatements[2]).toBe(`DROP TYPE \"public\".\"enum\";`);\n\texpect(sqlStatements[3]).toBe(`CREATE TYPE \"public\".\"enum\" AS ENUM('value1', 'value3', 'value2');`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"value2\"}'::\"public\".\"enum\"[3];`,\n\t);\n\texpect(sqlStatements[5]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\"[3] USING \"column\"::\"public\".\"enum\"[3];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: '',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: `'{\"value2\"}'`,\n\t\t\t\tcolumnType: 'enum[3]',\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value3',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t\t'value2',\n\t\t],\n\t\tenumSchema: 'public',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\n// +\ntest('column is array enum with custom size type. shuffle enum', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value2', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').array(3),\n\t\t}),\n\t};\n\n\tconst enum2 = pgEnum('enum', ['value1', 'value3', 'value2']);\n\tconst to = {\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column').array(3),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(`DROP TYPE \"public\".\"enum\";`);\n\texpect(sqlStatements[2]).toBe(`CREATE TYPE \"public\".\"enum\" AS ENUM('value1', 'value3', 'value2');`);\n\texpect(sqlStatements[3]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\"[3] USING \"column\"::\"public\".\"enum\"[3];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: '',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: undefined,\n\t\t\t\tcolumnType: 'enum[3]',\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value3',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t\t'value2',\n\t\t],\n\t\tenumSchema: 'public',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\n// +\ntest('column is array of enum with multiple dimenions with custom sizes type. shuffle enum', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value2', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').array(3).array(2),\n\t\t}),\n\t};\n\n\tconst enum2 = pgEnum('enum', ['value1', 'value3', 'value2']);\n\tconst to = {\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column').array(3).array(2),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(`DROP TYPE \"public\".\"enum\";`);\n\texpect(sqlStatements[2]).toBe(`CREATE TYPE \"public\".\"enum\" AS ENUM('value1', 'value3', 'value2');`);\n\texpect(sqlStatements[3]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\"[3][2] USING \"column\"::\"public\".\"enum\"[3][2];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: '',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: undefined,\n\t\t\t\tcolumnType: 'enum[3][2]',\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value3',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t\t'value2',\n\t\t],\n\t\tenumSchema: 'public',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\n// +\ntest('column is array of enum with multiple dimenions type with custom size with default value. shuffle enum', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value2', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').array(3).array(2).default([['value2']]),\n\t\t}),\n\t};\n\n\tconst enum2 = pgEnum('enum', ['value1', 'value3', 'value2']);\n\tconst to = {\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column').array(3).array(2).default([['value2']]),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT '{{\"value2\"}}'::text;`);\n\texpect(sqlStatements[2]).toBe(`DROP TYPE \"public\".\"enum\";`);\n\texpect(sqlStatements[3]).toBe(`CREATE TYPE \"public\".\"enum\" AS ENUM('value1', 'value3', 'value2');`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT '{{\"value2\"}}'::\"public\".\"enum\"[3][2];`,\n\t);\n\texpect(sqlStatements[5]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\"[3][2] USING \"column\"::\"public\".\"enum\"[3][2];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: '',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: `'{{\\\"value2\\\"}}'`,\n\t\t\t\tcolumnType: 'enum[3][2]',\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value3',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t\t'value2',\n\t\t],\n\t\tenumSchema: 'public',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\n// +\ntest('column is enum type with default value. custom schema. shuffle enum', async () => {\n\tconst schema = pgSchema('new_schema');\n\n\tconst enum1 = schema.enum('enum', ['value1', 'value2', 'value3']);\n\tconst from = {\n\t\tschema,\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').default('value2'),\n\t\t}),\n\t};\n\n\tconst enum2 = schema.enum('enum', ['value1', 'value3', 'value2']);\n\tconst to = {\n\t\tschema,\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column').default('value2'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value2'::text;`);\n\texpect(sqlStatements[2]).toBe(`DROP TYPE \"new_schema\".\"enum\";`);\n\texpect(sqlStatements[3]).toBe(`CREATE TYPE \"new_schema\".\"enum\" AS ENUM('value1', 'value3', 'value2');`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value2'::\"new_schema\".\"enum\";`,\n\t);\n\texpect(sqlStatements[5]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"new_schema\".\"enum\" USING \"column\"::\"new_schema\".\"enum\";`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: '',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: \"'value2'\",\n\t\t\t\tcolumnType: 'enum',\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value3',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t\t'value2',\n\t\t],\n\t\tenumSchema: 'new_schema',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\n// +\ntest('column is array enum type with default value. custom schema. shuffle enum', async () => {\n\tconst schema = pgSchema('new_schema');\n\n\tconst enum1 = schema.enum('enum', ['value1', 'value2', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: schema.table('table', {\n\t\t\tcolumn: enum1('column').array().default(['value2']),\n\t\t}),\n\t};\n\n\tconst enum2 = schema.enum('enum', ['value1', 'value3', 'value2']);\n\tconst to = {\n\t\tenum2,\n\t\ttable: schema.table('table', {\n\t\t\tcolumn: enum2('column').array().default(['value2']),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"value2\"}'::text;`,\n\t);\n\texpect(sqlStatements[2]).toBe(`DROP TYPE \"new_schema\".\"enum\";`);\n\texpect(sqlStatements[3]).toBe(`CREATE TYPE \"new_schema\".\"enum\" AS ENUM('value1', 'value3', 'value2');`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"value2\"}'::\"new_schema\".\"enum\"[];`,\n\t);\n\texpect(sqlStatements[5]).toBe(\n\t\t`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DATA TYPE \"new_schema\".\"enum\"[] USING \"column\"::\"new_schema\".\"enum\"[];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: 'new_schema',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: `'{\"value2\"}'`,\n\t\t\t\tcolumnType: 'enum[]',\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value3',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t\t'value2',\n\t\t],\n\t\tenumSchema: 'new_schema',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\n// +\ntest('column is array enum type with custom size with default value. custom schema. shuffle enum', async () => {\n\tconst schema = pgSchema('new_schema');\n\n\tconst enum1 = schema.enum('enum', ['value1', 'value2', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: schema.table('table', {\n\t\t\tcolumn: enum1('column').array(3).default(['value2']),\n\t\t}),\n\t};\n\n\tconst enum2 = schema.enum('enum', ['value1', 'value3', 'value2']);\n\tconst to = {\n\t\tenum2,\n\t\ttable: schema.table('table', {\n\t\t\tcolumn: enum2('column').array(3).default(['value2']),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"value2\"}'::text;`,\n\t);\n\texpect(sqlStatements[2]).toBe(`DROP TYPE \"new_schema\".\"enum\";`);\n\texpect(sqlStatements[3]).toBe(`CREATE TYPE \"new_schema\".\"enum\" AS ENUM('value1', 'value3', 'value2');`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"value2\"}'::\"new_schema\".\"enum\"[3];`,\n\t);\n\texpect(sqlStatements[5]).toBe(\n\t\t`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DATA TYPE \"new_schema\".\"enum\"[3] USING \"column\"::\"new_schema\".\"enum\"[3];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: 'new_schema',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: `'{\"value2\"}'`,\n\t\t\t\tcolumnType: 'enum[3]',\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value3',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t\t'value2',\n\t\t],\n\t\tenumSchema: 'new_schema',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\n// +\ntest('column is array enum type with custom size. custom schema. shuffle enum', async () => {\n\tconst schema = pgSchema('new_schema');\n\n\tconst enum1 = schema.enum('enum', ['value1', 'value2', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: schema.table('table', {\n\t\t\tcolumn: enum1('column').array(3),\n\t\t}),\n\t};\n\n\tconst enum2 = schema.enum('enum', ['value1', 'value3', 'value2']);\n\tconst to = {\n\t\tenum2,\n\t\ttable: schema.table('table', {\n\t\t\tcolumn: enum2('column').array(3),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(`DROP TYPE \"new_schema\".\"enum\";`);\n\texpect(sqlStatements[2]).toBe(`CREATE TYPE \"new_schema\".\"enum\" AS ENUM('value1', 'value3', 'value2');`);\n\texpect(sqlStatements[3]).toBe(\n\t\t`ALTER TABLE \"new_schema\".\"table\" ALTER COLUMN \"column\" SET DATA TYPE \"new_schema\".\"enum\"[3] USING \"column\"::\"new_schema\".\"enum\"[3];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: 'new_schema',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: undefined,\n\t\t\t\tcolumnType: 'enum[3]',\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value3',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t\t'value2',\n\t\t],\n\t\tenumSchema: 'new_schema',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\n// +\ntest('column is enum type without default value. add default to column', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column'),\n\t\t}),\n\t};\n\n\tconst enum2 = pgEnum('enum', ['value1', 'value3']);\n\tconst to = {\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column').default('value3'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value3';`);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: 'enum',\n\t\tnewDefaultValue: \"'value3'\",\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'alter_table_alter_column_set_default',\n\t});\n});\n\n// +\ntest('change data type from standart type to enum', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\" USING \"column\"::\"public\".\"enum\";`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: undefined,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: 'public',\n\t});\n});\n\n// +\ntest('change data type from standart type to enum. column has default', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').default('value2'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').default('value3'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value3'::\"public\".\"enum\";`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\" USING \"column\"::\"public\".\"enum\";`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: \"'value3'\",\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: 'public',\n\t});\n});\n\n// +\ntest('change data type from array standart type to array enum. column has default', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').array().default(['value2']),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').array().default(['value3']),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"value3\"}'::\"public\".\"enum\"[];`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\"[] USING \"column\"::\"public\".\"enum\"[];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: `'{\"value3\"}'`,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum[]',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar[]',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: 'public',\n\t});\n});\n\n// +\ntest('change data type from array standart type to array enum. column without default', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').array(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').array(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\"[] USING \"column\"::\"public\".\"enum\"[];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: undefined,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum[]',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar[]',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: 'public',\n\t});\n});\n\n// +\ntest('change data type from array standart type with custom size to array enum with custom size. column has default', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').array(3).default(['value2']),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').array(3).default(['value3']),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"value3\"}'::\"public\".\"enum\"[3];`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\"[3] USING \"column\"::\"public\".\"enum\"[3];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: `'{\"value3\"}'`,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum[3]',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar[3]',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: 'public',\n\t});\n});\n\n// +\ntest('change data type from array standart type with custom size to array enum with custom size. column without default', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').array(2),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').array(2),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\"[2] USING \"column\"::\"public\".\"enum\"[2];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: undefined,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum[2]',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar[2]',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: 'public',\n\t});\n});\n\n// +\ntest('change data type from enum type to standart type', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE varchar;`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: undefined,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: undefined,\n\t});\n});\n\n// +\ntest('change data type from enum type to standart type. column has default', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').default('value3'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').default('value2'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE varchar;`,\n\t);\n\texpect(sqlStatements[1]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value2';`);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: \"'value2'\",\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: undefined,\n\t});\n});\n\n// +\ntest('change data type from array enum type to array standart type', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').array(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').array(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE varchar[];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: undefined,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar[]',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum[]',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: undefined,\n\t});\n});\n\n// +\ntest('change data type from array enum with custom size type to array standart type with custom size', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').array(2),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').array(2),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE varchar[2];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: undefined,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar[2]',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum[2]',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: undefined,\n\t});\n});\n\n//\ntest('change data type from array enum type to array standart type. column has default', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value2']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').array().default(['value2']),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').array().default(['value2']),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE varchar[];`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"value2\"}';`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: `'{\"value2\"}'`,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar[]',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum[]',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: undefined,\n\t});\n});\n\n// +\ntest('change data type from array enum type with custom size to array standart type with custom size. column has default', async () => {\n\tconst enum1 = pgEnum('enum', ['value1', 'value2']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').array(3).default(['value2']),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').array(3).default(['value2']),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE varchar[3];`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"value2\"}';`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: `'{\"value2\"}'`,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar[3]',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum[3]',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: undefined,\n\t});\n});\n\n// +\ntest('change data type from standart type to standart type', async () => {\n\tconst from = {\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: text('column'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: undefined,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'text',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: undefined,\n\t});\n});\n\n// +\ntest('change data type from standart type to standart type. column has default', async () => {\n\tconst from = {\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').default('value3'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: text('column').default('value2'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value2';`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: \"'value2'\",\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'text',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: undefined,\n\t});\n});\n\n// +\ntest('change data type from standart type to standart type. columns are arrays', async () => {\n\tconst from = {\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').array(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: text('column').array(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text[];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: undefined,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'text[]',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar[]',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: undefined,\n\t});\n});\n\n// +\ntest('change data type from standart type to standart type. columns are arrays with custom sizes', async () => {\n\tconst from = {\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').array(2),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: text('column').array(2),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text[2];`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: undefined,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'text[2]',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar[2]',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: undefined,\n\t});\n});\n\n// +\ntest('change data type from standart type to standart type. columns are arrays. column has default', async () => {\n\tconst from = {\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').array().default(['hello']),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: text('column').array().default(['hello']),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text[];`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"hello\"}';`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: `'{\"hello\"}'`,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'text[]',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar[]',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: undefined,\n\t});\n});\n\n// +\ntest('change data type from standart type to standart type. columns are arrays with custom sizes.column has default', async () => {\n\tconst from = {\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').array(2).default(['hello']),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: text('column').array(2).default(['hello']),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text[2];`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT '{\"hello\"}';`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: `'{\"hello\"}'`,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'text[2]',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar[2]',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: undefined,\n\t});\n});\n\n// +\ntest('change data type from one enum to other', async () => {\n\tconst enum1 = pgEnum('enum1', ['value1', 'value3']);\n\tconst enum2 = pgEnum('enum2', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum2\" USING \"column\"::text::\"public\".\"enum2\";`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: undefined,\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum2',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum1',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: 'public',\n\t});\n});\n\n// +\ntest('change data type from one enum to other. column has default', async () => {\n\tconst enum1 = pgEnum('enum1', ['value1', 'value3']);\n\tconst enum2 = pgEnum('enum2', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').default('value3'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column').default('value3'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(3);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" DROP DEFAULT;`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum2\" USING \"column\"::text::\"public\".\"enum2\";`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value3';`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: \"'value3'\",\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum2',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum1',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: 'public',\n\t});\n});\n\n// +\ntest('change data type from one enum to other. changed defaults', async () => {\n\tconst enum1 = pgEnum('enum1', ['value1', 'value3']);\n\tconst enum2 = pgEnum('enum2', ['value1', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').default('value3'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tenum1,\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column').default('value1'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(3);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" DROP DEFAULT;`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum2\" USING \"column\"::text::\"public\".\"enum2\";`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value1';`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: \"'value1'\",\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum2',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum1',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: 'public',\n\t});\n});\n\ntest('check filtering json statements. here we have recreate enum + set new type + alter default', async () => {\n\tconst enum1 = pgEnum('enum1', ['value1', 'value3']);\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: varchar('column').default('value3'),\n\t\t}),\n\t};\n\n\tconst enum2 = pgEnum('enum1', ['value3', 'value1', 'value2']);\n\tconst to = {\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column').default('value2'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value2'::text;`);\n\texpect(sqlStatements[2]).toBe(`DROP TYPE \"public\".\"enum1\";`);\n\texpect(sqlStatements[3]).toBe(`CREATE TYPE \"public\".\"enum1\" AS ENUM('value3', 'value1', 'value2');`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value2'::\"public\".\"enum1\";`,\n\t);\n\texpect(sqlStatements[5]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum1\" USING \"column\"::\"public\".\"enum1\";`,\n\t);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\tcolumnType: 'enum1',\n\t\t\t\tdefault: \"'value2'\",\n\t\t\t\ttable: 'table',\n\t\t\t\ttableSchema: '',\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value3',\n\t\t],\n\t\tenumSchema: 'public',\n\t\tname: 'enum1',\n\t\tnewValues: [\n\t\t\t'value3',\n\t\t\t'value1',\n\t\t\t'value2',\n\t\t],\n\t\ttype: 'alter_type_drop_value',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tcolumnAutoIncrement: undefined,\n\t\tcolumnDefault: \"'value2'\",\n\t\tcolumnName: 'column',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: {\n\t\t\tisEnum: true,\n\t\t\tname: 'enum1',\n\t\t},\n\t\toldDataType: {\n\t\t\tisEnum: false,\n\t\t\tname: 'varchar',\n\t\t},\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'pg_alter_table_alter_column_set_type',\n\t\ttypeSchema: 'public',\n\t});\n});\n"
  },
  {
    "path": "drizzle-kit/tests/pg-generated.test.ts",
    "content": "// test cases\n\nimport { SQL, sql } from 'drizzle-orm';\nimport { integer, pgTable, text } from 'drizzle-orm/pg-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemas } from './schemaDiffer';\n\ntest('generated as callback: add column with generated constraint', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: '\"users\".\"name\" || \\'hello\\'',\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_add_column',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`ALTER TABLE \"users\" ADD COLUMN \"gen_name\" text GENERATED ALWAYS AS (\\\"users\\\".\\\"name\\\" || 'hello') STORED;`,\n\t]);\n});\n\ntest('generated as callback: add generated constraint to an exisiting column', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: undefined,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: { as: '\"users\".\"name\" || \\'to add\\'', type: 'stored' },\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" drop column \"gen_name\";',\n\t\t'ALTER TABLE \"users\" ADD COLUMN \"gen_name\" text GENERATED ALWAYS AS (\"users\".\"name\" || \\'to add\\') STORED NOT NULL;',\n\t]);\n});\n\ntest('generated as callback: drop generated constraint', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name} || 'to delete'`,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: undefined,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`ALTER TABLE \\\"users\\\" ALTER COLUMN \\\"gen_name\\\" DROP EXPRESSION;`,\n\t]);\n});\n\ntest('generated as callback: change generated constraint', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name}`,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: undefined,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: { as: '\"users\".\"name\" || \\'hello\\'', type: 'stored' },\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" drop column \"gen_name\";',\n\t\t'ALTER TABLE \"users\" ADD COLUMN \"gen_name\" text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') STORED;',\n\t]);\n});\n\n// ---\n\ntest('generated as sql: add column with generated constraint', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\\"users\\\".\\\"name\\\" || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: '\"users\".\"name\" || \\'hello\\'',\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_add_column',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`ALTER TABLE \"users\" ADD COLUMN \"gen_name\" text GENERATED ALWAYS AS (\\\"users\\\".\\\"name\\\" || 'hello') STORED;`,\n\t]);\n});\n\ntest('generated as sql: add generated constraint to an exisiting column', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(sql`\\\"users\\\".\\\"name\\\" || 'to add'`),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: undefined,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: { as: '\"users\".\"name\" || \\'to add\\'', type: 'stored' },\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" drop column \"gen_name\";',\n\t\t'ALTER TABLE \"users\" ADD COLUMN \"gen_name\" text GENERATED ALWAYS AS (\"users\".\"name\" || \\'to add\\') STORED NOT NULL;',\n\t]);\n});\n\ntest('generated as sql: drop generated constraint', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\\"users\\\".\\\"name\\\" || 'to delete'`,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: undefined,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`ALTER TABLE \\\"users\\\" ALTER COLUMN \\\"gen_name\\\" DROP EXPRESSION;`,\n\t]);\n});\n\ntest('generated as sql: change generated constraint', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\\"users\\\".\\\"name\\\"`,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\\"users\\\".\\\"name\\\" || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: undefined,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: { as: '\"users\".\"name\" || \\'hello\\'', type: 'stored' },\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" drop column \"gen_name\";',\n\t\t'ALTER TABLE \"users\" ADD COLUMN \"gen_name\" text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') STORED;',\n\t]);\n});\n\n// ---\n\ntest('generated as string: add column with generated constraint', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\\"users\\\".\\\"name\\\" || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: '\"users\".\"name\" || \\'hello\\'',\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_add_column',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`ALTER TABLE \"users\" ADD COLUMN \"gen_name\" text GENERATED ALWAYS AS (\\\"users\\\".\\\"name\\\" || 'hello') STORED;`,\n\t]);\n});\n\ntest('generated as string: add generated constraint to an exisiting column', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(`\\\"users\\\".\\\"name\\\" || 'to add'`),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: undefined,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: { as: '\"users\".\"name\" || \\'to add\\'', type: 'stored' },\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" drop column \"gen_name\";',\n\t\t'ALTER TABLE \"users\" ADD COLUMN \"gen_name\" text GENERATED ALWAYS AS (\"users\".\"name\" || \\'to add\\') STORED NOT NULL;',\n\t]);\n});\n\ntest('generated as string: drop generated constraint', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\\"users\\\".\\\"name\\\" || 'to delete'`,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: undefined,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`ALTER TABLE \\\"users\\\" ALTER COLUMN \\\"gen_name\\\" DROP EXPRESSION;`,\n\t]);\n});\n\ntest('generated as string: change generated constraint', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name}`,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid2: integer('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\\"users\\\".\\\"name\\\" || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: undefined,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: { as: '\"users\".\"name\" || \\'hello\\'', type: 'stored' },\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" drop column \"gen_name\";',\n\t\t'ALTER TABLE \"users\" ADD COLUMN \"gen_name\" text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') STORED;',\n\t]);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/pg-identity.test.ts",
    "content": "import { integer, pgSequence, pgTable } from 'drizzle-orm/pg-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemas } from './schemaDiffer';\n\n// same table - no diff\n// 2. identity always/by default - no params +\n// 3. identity always/by default - with a few params +\n// 4. identity always/by default - with all params +\n\n// diff table with create statement\n// 2. identity always/by default - no params +\n// 3. identity always/by default - with a few params +\n// 4. identity always/by default - with all params +\n\n// diff for drop statement\n// 2. identity always/by default - no params, with params +\n\n// diff for alters\n// 2. identity always/by default - no params -> add param +\n// 3. identity always/by default - with a few params - remove/add/change params +\n// 4. identity always/by default - with all params - remove/add/change params +\n\ntest('create table: identity always/by default - no params', async () => {\n\tconst from = {};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tidentity: 'users_id_seq;byDefault;1;2147483647;1;1;1;false',\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tcompositePkName: '',\n\t\t\tschema: '',\n\t\t\tpolicies: [],\n\t\t\tisRLSEnabled: false,\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_table',\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE \"users\" (\\n\\t\"id\" integer GENERATED BY DEFAULT AS IDENTITY (sequence name \"users_id_seq\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1)\\n);\\n',\n\t]);\n});\n\ntest('create table: identity always/by default - few params', async () => {\n\tconst from = {};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tname: 'custom_seq',\n\t\t\t\tincrement: 4,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tidentity: 'custom_seq;byDefault;1;2147483647;4;1;1;false',\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tcompositePkName: '',\n\t\t\tpolicies: [],\n\t\t\tschema: '',\n\t\t\tisRLSEnabled: false,\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_table',\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE \"users\" (\\n\\t\"id\" integer GENERATED BY DEFAULT AS IDENTITY (sequence name \"custom_seq\" INCREMENT BY 4 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1)\\n);\\n',\n\t]);\n});\n\ntest('create table: identity always/by default - all params', async () => {\n\tconst from = {};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tname: 'custom_seq',\n\t\t\t\tincrement: 4,\n\t\t\t\tminValue: 3,\n\t\t\t\tmaxValue: 1000,\n\t\t\t\tcache: 200,\n\t\t\t\tcycle: false,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tidentity: 'custom_seq;byDefault;3;1000;4;3;200;false',\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tcompositePkName: '',\n\t\t\tpolicies: [],\n\t\t\tisRLSEnabled: false,\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_table',\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE \"users\" (\\n\\t\"id\" integer GENERATED BY DEFAULT AS IDENTITY (sequence name \"custom_seq\" INCREMENT BY 4 MINVALUE 3 MAXVALUE 1000 START WITH 3 CACHE 200)\\n);\\n',\n\t]);\n});\n\ntest('no diff: identity always/by default - no params', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('no diff: identity always/by default - few params', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tname: 'custom_seq',\n\t\t\t\tincrement: 4,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tname: 'custom_seq',\n\t\t\t\tincrement: 4,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('no diff: identity always/by default - all params', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tname: 'custom_seq',\n\t\t\t\tincrement: 4,\n\t\t\t\tminValue: 3,\n\t\t\t\tmaxValue: 1000,\n\t\t\t\tcache: 200,\n\t\t\t\tcycle: false,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tname: 'custom_seq',\n\t\t\t\tincrement: 4,\n\t\t\t\tminValue: 3,\n\t\t\t\tmaxValue: 1000,\n\t\t\t\tcache: 200,\n\t\t\t\tcycle: false,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('drop identity from a column - no params', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`ALTER TABLE \\\"users\\\" ALTER COLUMN \\\"id\\\" DROP IDENTITY;`,\n\t]);\n});\n\ntest('drop identity from a column - few params', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tstartWith: 100,\n\t\t\t\tincrement: 3,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`ALTER TABLE \\\"users\\\" ALTER COLUMN \\\"id\\\" DROP IDENTITY;`,\n\t]);\n});\n\ntest('drop identity from a column - all params', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tstartWith: 100,\n\t\t\t\tincrement: 3,\n\t\t\t\tcache: 100,\n\t\t\t\tcycle: true,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`ALTER TABLE \\\"users\\\" ALTER COLUMN \\\"id\\\" DROP IDENTITY;`,\n\t]);\n});\n\ntest('alter identity from a column - no params', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({ startWith: 100 }),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tidentity: 'users_id_seq;byDefault;1;2147483647;1;100;1;false',\n\t\t\toldIdentity: 'users_id_seq;byDefault;1;2147483647;1;1;1;false',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_change_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET START WITH 100;',\n\t]);\n});\n\ntest('alter identity from a column - few params', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({ startWith: 100 }),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tstartWith: 100,\n\t\t\t\tcache: 10,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tidentity: 'users_id_seq;byDefault;1;2147483647;1;100;10;false',\n\t\t\toldIdentity: 'users_id_seq;byDefault;1;2147483647;1;100;1;false',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_change_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET CACHE 10;',\n\t]);\n});\n\ntest('alter identity from a column - by default to always', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedAlwaysAsIdentity({\n\t\t\t\tstartWith: 100,\n\t\t\t\tcache: 10,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tidentity: 'users_id_seq;always;1;2147483647;1;100;10;false',\n\t\t\toldIdentity: 'users_id_seq;byDefault;1;2147483647;1;1;1;false',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_change_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET GENERATED ALWAYS;',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET START WITH 100;',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET CACHE 10;',\n\t]);\n});\n\ntest('alter identity from a column - always to by default', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedAlwaysAsIdentity(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tstartWith: 100,\n\t\t\t\tcache: 10,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tidentity: 'users_id_seq;byDefault;1;2147483647;1;100;10;false',\n\t\t\toldIdentity: 'users_id_seq;always;1;2147483647;1;1;1;false',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_change_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET GENERATED BY DEFAULT;',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET START WITH 100;',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET CACHE 10;',\n\t]);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/pg-schemas.test.ts",
    "content": "import { pgSchema } from 'drizzle-orm/pg-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemas } from './schemaDiffer';\n\ntest('add schema #1', async () => {\n\tconst to = {\n\t\tdevSchema: pgSchema('dev'),\n\t};\n\n\tconst { statements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_schema',\n\t\tname: 'dev',\n\t});\n});\n\ntest('add schema #2', async () => {\n\tconst from = {\n\t\tdevSchema: pgSchema('dev'),\n\t};\n\tconst to = {\n\t\tdevSchema: pgSchema('dev'),\n\t\tdevSchema2: pgSchema('dev2'),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_schema',\n\t\tname: 'dev2',\n\t});\n});\n\ntest('delete schema #1', async () => {\n\tconst from = {\n\t\tdevSchema: pgSchema('dev'),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, {}, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'drop_schema',\n\t\tname: 'dev',\n\t});\n});\n\ntest('delete schema #2', async () => {\n\tconst from = {\n\t\tdevSchema: pgSchema('dev'),\n\t\tdevSchema2: pgSchema('dev2'),\n\t};\n\tconst to = {\n\t\tdevSchema: pgSchema('dev'),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'drop_schema',\n\t\tname: 'dev2',\n\t});\n});\n\ntest('rename schema #1', async () => {\n\tconst from = {\n\t\tdevSchema: pgSchema('dev'),\n\t};\n\tconst to = {\n\t\tdevSchema2: pgSchema('dev2'),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, ['dev->dev2']);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_schema',\n\t\tfrom: 'dev',\n\t\tto: 'dev2',\n\t});\n});\n\ntest('rename schema #2', async () => {\n\tconst from = {\n\t\tdevSchema: pgSchema('dev'),\n\t\tdevSchema1: pgSchema('dev1'),\n\t};\n\tconst to = {\n\t\tdevSchema: pgSchema('dev'),\n\t\tdevSchema2: pgSchema('dev2'),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, ['dev1->dev2']);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_schema',\n\t\tfrom: 'dev1',\n\t\tto: 'dev2',\n\t});\n});\n"
  },
  {
    "path": "drizzle-kit/tests/pg-sequences.test.ts",
    "content": "import { pgSchema, pgSequence } from 'drizzle-orm/pg-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemas } from './schemaDiffer';\n\ntest('create sequence', async () => {\n\tconst from = {};\n\tconst to = {\n\t\tseq: pgSequence('name', { startWith: 100 }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'name',\n\t\t\tschema: 'public',\n\t\t\ttype: 'create_sequence',\n\t\t\tvalues: {\n\t\t\t\tcache: '1',\n\t\t\t\tcycle: false,\n\t\t\t\tincrement: '1',\n\t\t\t\tmaxValue: '9223372036854775807',\n\t\t\t\tminValue: '1',\n\t\t\t\tstartWith: '100',\n\t\t\t},\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE SEQUENCE \"public\".\"name\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 100 CACHE 1;',\n\t]);\n});\n\ntest('create sequence: all fields', async () => {\n\tconst from = {};\n\tconst to = {\n\t\tseq: pgSequence('name', {\n\t\t\tstartWith: 100,\n\t\t\tmaxValue: 10000,\n\t\t\tminValue: 100,\n\t\t\tcycle: true,\n\t\t\tcache: 10,\n\t\t\tincrement: 2,\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'create_sequence',\n\t\t\tname: 'name',\n\t\t\tschema: 'public',\n\t\t\tvalues: {\n\t\t\t\tstartWith: '100',\n\t\t\t\tmaxValue: '10000',\n\t\t\t\tminValue: '100',\n\t\t\t\tcycle: true,\n\t\t\t\tcache: '10',\n\t\t\t\tincrement: '2',\n\t\t\t},\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE SEQUENCE \"public\".\"name\" INCREMENT BY 2 MINVALUE 100 MAXVALUE 10000 START WITH 100 CACHE 10 CYCLE;',\n\t]);\n});\n\ntest('create sequence: custom schema', async () => {\n\tconst customSchema = pgSchema('custom');\n\tconst from = {};\n\tconst to = {\n\t\tseq: customSchema.sequence('name', { startWith: 100 }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'name',\n\t\t\tschema: 'custom',\n\t\t\ttype: 'create_sequence',\n\t\t\tvalues: {\n\t\t\t\tcache: '1',\n\t\t\t\tcycle: false,\n\t\t\t\tincrement: '1',\n\t\t\t\tmaxValue: '9223372036854775807',\n\t\t\t\tminValue: '1',\n\t\t\t\tstartWith: '100',\n\t\t\t},\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE SEQUENCE \"custom\".\"name\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 100 CACHE 1;',\n\t]);\n});\n\ntest('create sequence: custom schema + all fields', async () => {\n\tconst customSchema = pgSchema('custom');\n\tconst from = {};\n\tconst to = {\n\t\tseq: customSchema.sequence('name', {\n\t\t\tstartWith: 100,\n\t\t\tmaxValue: 10000,\n\t\t\tminValue: 100,\n\t\t\tcycle: true,\n\t\t\tcache: 10,\n\t\t\tincrement: 2,\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'create_sequence',\n\t\t\tname: 'name',\n\t\t\tschema: 'custom',\n\t\t\tvalues: {\n\t\t\t\tstartWith: '100',\n\t\t\t\tmaxValue: '10000',\n\t\t\t\tminValue: '100',\n\t\t\t\tcycle: true,\n\t\t\t\tcache: '10',\n\t\t\t\tincrement: '2',\n\t\t\t},\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE SEQUENCE \"custom\".\"name\" INCREMENT BY 2 MINVALUE 100 MAXVALUE 10000 START WITH 100 CACHE 10 CYCLE;',\n\t]);\n});\n\ntest('drop sequence', async () => {\n\tconst from = { seq: pgSequence('name', { startWith: 100 }) };\n\tconst to = {};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'drop_sequence',\n\t\t\tname: 'name',\n\t\t\tschema: 'public',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual(['DROP SEQUENCE \"public\".\"name\";']);\n});\n\ntest('drop sequence: custom schema', async () => {\n\tconst customSchema = pgSchema('custom');\n\tconst from = { seq: customSchema.sequence('name', { startWith: 100 }) };\n\tconst to = {};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'drop_sequence',\n\t\t\tname: 'name',\n\t\t\tschema: 'custom',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual(['DROP SEQUENCE \"custom\".\"name\";']);\n});\n\n// rename sequence\n\ntest('rename sequence', async () => {\n\tconst from = { seq: pgSequence('name', { startWith: 100 }) };\n\tconst to = { seq: pgSequence('name_new', { startWith: 100 }) };\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, [\n\t\t'public.name->public.name_new',\n\t]);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'rename_sequence',\n\t\t\tnameFrom: 'name',\n\t\t\tnameTo: 'name_new',\n\t\t\tschema: 'public',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER SEQUENCE \"public\".\"name\" RENAME TO \"name_new\";',\n\t]);\n});\n\ntest('rename sequence in custom schema', async () => {\n\tconst customSchema = pgSchema('custom');\n\n\tconst from = { seq: customSchema.sequence('name', { startWith: 100 }) };\n\tconst to = { seq: customSchema.sequence('name_new', { startWith: 100 }) };\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, [\n\t\t'custom.name->custom.name_new',\n\t]);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'rename_sequence',\n\t\t\tnameFrom: 'name',\n\t\t\tnameTo: 'name_new',\n\t\t\tschema: 'custom',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER SEQUENCE \"custom\".\"name\" RENAME TO \"name_new\";',\n\t]);\n});\n\ntest('move sequence between schemas #1', async () => {\n\tconst customSchema = pgSchema('custom');\n\tconst from = { seq: pgSequence('name', { startWith: 100 }) };\n\tconst to = { seq: customSchema.sequence('name', { startWith: 100 }) };\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, [\n\t\t'public.name->custom.name',\n\t]);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'move_sequence',\n\t\t\tname: 'name',\n\t\t\tschemaFrom: 'public',\n\t\t\tschemaTo: 'custom',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER SEQUENCE \"public\".\"name\" SET SCHEMA \"custom\";',\n\t]);\n});\n\ntest('move sequence between schemas #2', async () => {\n\tconst customSchema = pgSchema('custom');\n\tconst from = { seq: customSchema.sequence('name', { startWith: 100 }) };\n\tconst to = { seq: pgSequence('name', { startWith: 100 }) };\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, [\n\t\t'custom.name->public.name',\n\t]);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'move_sequence',\n\t\t\tname: 'name',\n\t\t\tschemaFrom: 'custom',\n\t\t\tschemaTo: 'public',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER SEQUENCE \"custom\".\"name\" SET SCHEMA \"public\";',\n\t]);\n});\n\n// Add squasher for sequences to make alters work +\n// Run all tests +\n// Finish introspect for sequences +\n// Check push for sequences +\n\n// add tests for generated to postgresql +\n// add tests for generated to mysql +\n// add tests for generated to sqlite +\n\n// add tests for identity to postgresql\n\n// check introspect generated(all dialects) +\n// check push generated(all dialect) +\n\n// add introspect ts file logic for all the features\n// manually test everything\n// beta release\n\ntest('alter sequence', async () => {\n\tconst from = { seq: pgSequence('name', { startWith: 100 }) };\n\tconst to = { seq: pgSequence('name', { startWith: 105 }) };\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'name',\n\t\t\tschema: 'public',\n\t\t\ttype: 'alter_sequence',\n\t\t\tvalues: {\n\t\t\t\tcache: '1',\n\t\t\t\tcycle: false,\n\t\t\t\tincrement: '1',\n\t\t\t\tmaxValue: '9223372036854775807',\n\t\t\t\tminValue: '1',\n\t\t\t\tstartWith: '105',\n\t\t\t},\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER SEQUENCE \"public\".\"name\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 105 CACHE 1;',\n\t]);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/pg-tables.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport {\n\tAnyPgColumn,\n\tforeignKey,\n\tgeometry,\n\tindex,\n\tinteger,\n\tpgEnum,\n\tpgSchema,\n\tpgSequence,\n\tpgTable,\n\tpgTableCreator,\n\tprimaryKey,\n\tserial,\n\ttext,\n\tunique,\n\tuniqueIndex,\n\tvector,\n} from 'drizzle-orm/pg-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemas } from './schemaDiffer';\n\ntest('add table #1', async () => {\n\tconst to = {\n\t\tusers: pgTable('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tpolicies: [],\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t\tisRLSEnabled: false,\n\t\tcompositePkName: '',\n\t});\n});\n\ntest('add table #2', async () => {\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'serial',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\tisRLSEnabled: false,\n\t\tpolicies: [],\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t\tcompositePkName: '',\n\t});\n});\n\ntest('add table #3', async () => {\n\tconst to = {\n\t\tusers: pgTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid: serial('id'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tpk: primaryKey({\n\t\t\t\t\t\tname: 'users_pk',\n\t\t\t\t\t\tcolumns: [t.id],\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst { statements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'serial',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: ['id;users_pk'],\n\t\tpolicies: [],\n\t\tuniqueConstraints: [],\n\t\tisRLSEnabled: false,\n\t\tcheckConstraints: [],\n\t\tcompositePkName: 'users_pk',\n\t});\n});\n\ntest('add table #4', async () => {\n\tconst to = {\n\t\tusers: pgTable('users', {}),\n\t\tposts: pgTable('posts', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tpolicies: [],\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t\tisRLSEnabled: false,\n\t\tcompositePkName: '',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'posts',\n\t\tpolicies: [],\n\t\tschema: '',\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tisRLSEnabled: false,\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t\tcompositePkName: '',\n\t});\n});\n\ntest('add table #5', async () => {\n\tconst schema = pgSchema('folder');\n\tconst from = {\n\t\tschema,\n\t};\n\n\tconst to = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: 'folder',\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tpolicies: [],\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t\tcheckConstraints: [],\n\t\tisRLSEnabled: false,\n\t});\n});\n\ntest('add table #6', async () => {\n\tconst from = {\n\t\tusers1: pgTable('users1', {}),\n\t};\n\n\tconst to = {\n\t\tusers2: pgTable('users2', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users2',\n\t\tschema: '',\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tpolicies: [],\n\t\tcompositePkName: '',\n\t\tcheckConstraints: [],\n\t\tisRLSEnabled: false,\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'drop_table',\n\t\tpolicies: [],\n\t\ttableName: 'users1',\n\t\tschema: '',\n\t});\n});\n\ntest('add table #7', async () => {\n\tconst from = {\n\t\tusers1: pgTable('users1', {}),\n\t};\n\n\tconst to = {\n\t\tusers: pgTable('users', {}),\n\t\tusers2: pgTable('users2', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, [\n\t\t'public.users1->public.users2',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tpolicies: [],\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t\tisRLSEnabled: false,\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'rename_table',\n\t\ttableNameFrom: 'users1',\n\t\ttableNameTo: 'users2',\n\t\tfromSchema: '',\n\t\ttoSchema: '',\n\t});\n});\n\ntest('add table #8: geometry types', async () => {\n\tconst from = {};\n\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tgeom: geometry('geom', { type: 'point' }).notNull(),\n\t\t\tgeom1: geometry('geom1').notNull(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t`CREATE TABLE \"users\" (\\n\\t\"geom\" geometry(point) NOT NULL,\\n\\t\"geom1\" geometry(point) NOT NULL\\n);\\n`,\n\t]);\n});\n\ntest('multiproject schema add table #1', async () => {\n\tconst table = pgTableCreator((name) => `prefix_${name}`);\n\n\tconst to = {\n\t\tusers: table('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'prefix_users',\n\t\tschema: '',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'serial',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\tpolicies: [],\n\t\tcompositePkName: '',\n\t\tisRLSEnabled: false,\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('multiproject schema drop table #1', async () => {\n\tconst table = pgTableCreator((name) => `prefix_${name}`);\n\n\tconst from = {\n\t\tusers: table('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {};\n\n\tconst { statements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tschema: '',\n\t\ttableName: 'prefix_users',\n\t\ttype: 'drop_table',\n\t\tpolicies: [],\n\t});\n});\n\ntest('multiproject schema alter table name #1', async () => {\n\tconst table = pgTableCreator((name) => `prefix_${name}`);\n\n\tconst from = {\n\t\tusers: table('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers1: table('users1', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, [\n\t\t'public.prefix_users->public.prefix_users1',\n\t]);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_table',\n\t\tfromSchema: '',\n\t\ttoSchema: '',\n\t\ttableNameFrom: 'prefix_users',\n\t\ttableNameTo: 'prefix_users1',\n\t});\n});\n\ntest('add table #8: column with pgvector', async () => {\n\tconst from = {};\n\n\tconst to = {\n\t\tusers2: pgTable('users2', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: vector('name', { dimensions: 3 }),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements[0]).toBe(\n\t\t`CREATE TABLE \"users2\" (\\n\\t\"id\" serial PRIMARY KEY NOT NULL,\\n\\t\"name\" vector(3)\\n);\n`,\n\t);\n});\n\ntest('add schema + table #1', async () => {\n\tconst schema = pgSchema('folder');\n\n\tconst to = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_schema',\n\t\tname: 'folder',\n\t});\n\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: 'folder',\n\t\tpolicies: [],\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tisRLSEnabled: false,\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('change schema with tables #1', async () => {\n\tconst schema = pgSchema('folder');\n\tconst schema2 = pgSchema('folder2');\n\tconst from = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema2,\n\t\tusers: schema2.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, ['folder->folder2']);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_schema',\n\t\tfrom: 'folder',\n\t\tto: 'folder2',\n\t});\n});\n\ntest('change table schema #1', async () => {\n\tconst schema = pgSchema('folder');\n\tconst from = {\n\t\tschema,\n\t\tusers: pgTable('users', {}),\n\t};\n\tconst to = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, [\n\t\t'public.users->folder.users',\n\t]);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_set_schema',\n\t\ttableName: 'users',\n\t\tschemaFrom: 'public',\n\t\tschemaTo: 'folder',\n\t});\n});\n\ntest('change table schema #2', async () => {\n\tconst schema = pgSchema('folder');\n\tconst from = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema,\n\t\tusers: pgTable('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, [\n\t\t'folder.users->public.users',\n\t]);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_set_schema',\n\t\ttableName: 'users',\n\t\tschemaFrom: 'folder',\n\t\tschemaTo: 'public',\n\t});\n});\n\ntest('change table schema #3', async () => {\n\tconst schema1 = pgSchema('folder1');\n\tconst schema2 = pgSchema('folder2');\n\tconst from = {\n\t\tschema1,\n\t\tschema2,\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema1,\n\t\tschema2,\n\t\tusers: schema2.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, [\n\t\t'folder1.users->folder2.users',\n\t]);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_set_schema',\n\t\ttableName: 'users',\n\t\tschemaFrom: 'folder1',\n\t\tschemaTo: 'folder2',\n\t});\n});\n\ntest('change table schema #4', async () => {\n\tconst schema1 = pgSchema('folder1');\n\tconst schema2 = pgSchema('folder2');\n\tconst from = {\n\t\tschema1,\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema1,\n\t\tschema2, // add schema\n\t\tusers: schema2.table('users', {}), // move table\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, [\n\t\t'folder1.users->folder2.users',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_schema',\n\t\tname: 'folder2',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'alter_table_set_schema',\n\t\ttableName: 'users',\n\t\tschemaFrom: 'folder1',\n\t\tschemaTo: 'folder2',\n\t});\n});\n\ntest('change table schema #5', async () => {\n\tconst schema1 = pgSchema('folder1');\n\tconst schema2 = pgSchema('folder2');\n\tconst from = {\n\t\tschema1, // remove schema\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema2, // add schema\n\t\tusers: schema2.table('users', {}), // move table\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, [\n\t\t'folder1.users->folder2.users',\n\t]);\n\n\texpect(statements.length).toBe(3);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_schema',\n\t\tname: 'folder2',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'alter_table_set_schema',\n\t\ttableName: 'users',\n\t\tschemaFrom: 'folder1',\n\t\tschemaTo: 'folder2',\n\t});\n\texpect(statements[2]).toStrictEqual({\n\t\ttype: 'drop_schema',\n\t\tname: 'folder1',\n\t});\n});\n\ntest('change table schema #5', async () => {\n\tconst schema1 = pgSchema('folder1');\n\tconst schema2 = pgSchema('folder2');\n\tconst from = {\n\t\tschema1,\n\t\tschema2,\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema1,\n\t\tschema2,\n\t\tusers: schema2.table('users2', {}), // rename and move table\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, [\n\t\t'folder1.users->folder2.users2',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_set_schema',\n\t\ttableName: 'users',\n\t\tschemaFrom: 'folder1',\n\t\tschemaTo: 'folder2',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'rename_table',\n\t\ttableNameFrom: 'users',\n\t\ttableNameTo: 'users2',\n\t\tfromSchema: 'folder2',\n\t\ttoSchema: 'folder2',\n\t});\n});\n\ntest('change table schema #6', async () => {\n\tconst schema1 = pgSchema('folder1');\n\tconst schema2 = pgSchema('folder2');\n\tconst from = {\n\t\tschema1,\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema2, // rename schema\n\t\tusers: schema2.table('users2', {}), // rename table\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, [\n\t\t'folder1->folder2',\n\t\t'folder2.users->folder2.users2',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_schema',\n\t\tfrom: 'folder1',\n\t\tto: 'folder2',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'rename_table',\n\t\ttableNameFrom: 'users',\n\t\ttableNameTo: 'users2',\n\t\tfromSchema: 'folder2',\n\t\ttoSchema: 'folder2',\n\t});\n});\n\ntest('drop table + rename schema #1', async () => {\n\tconst schema1 = pgSchema('folder1');\n\tconst schema2 = pgSchema('folder2');\n\tconst from = {\n\t\tschema1,\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema2, // rename schema\n\t\t// drop table\n\t};\n\n\tconst { statements } = await diffTestSchemas(from, to, ['folder1->folder2']);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_schema',\n\t\tfrom: 'folder1',\n\t\tto: 'folder2',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'drop_table',\n\t\ttableName: 'users',\n\t\tschema: 'folder2',\n\t\tpolicies: [],\n\t});\n});\n\ntest('create table with tsvector', async () => {\n\tconst from = {};\n\tconst to = {\n\t\tusers: pgTable(\n\t\t\t'posts',\n\t\t\t{\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\ttitle: text('title').notNull(),\n\t\t\t\tdescription: text('description').notNull(),\n\t\t\t},\n\t\t\t(table) => ({\n\t\t\t\ttitleSearchIndex: index('title_search_index').using(\n\t\t\t\t\t'gin',\n\t\t\t\t\tsql`to_tsvector('english', ${table.title})`,\n\t\t\t\t),\n\t\t\t}),\n\t\t),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE \"posts\" (\\n\\t\"id\" serial PRIMARY KEY NOT NULL,\\n\\t\"title\" text NOT NULL,\\n\\t\"description\" text NOT NULL\\n);\\n',\n\t\t`CREATE INDEX \"title_search_index\" ON \"posts\" USING gin (to_tsvector('english', \"title\"));`,\n\t]);\n});\n\ntest('composite primary key', async () => {\n\tconst from = {};\n\tconst to = {\n\t\ttable: pgTable('works_to_creators', {\n\t\t\tworkId: integer('work_id').notNull(),\n\t\t\tcreatorId: integer('creator_id').notNull(),\n\t\t\tclassification: text('classification').notNull(),\n\t\t}, (t) => ({\n\t\t\tpk: primaryKey({\n\t\t\t\tcolumns: [t.workId, t.creatorId, t.classification],\n\t\t\t}),\n\t\t})),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE \"works_to_creators\" (\\n\\t\"work_id\" integer NOT NULL,\\n\\t\"creator_id\" integer NOT NULL,\\n\\t\"classification\" text NOT NULL,\\n\\tCONSTRAINT \"works_to_creators_work_id_creator_id_classification_pk\" PRIMARY KEY(\"work_id\",\"creator_id\",\"classification\")\\n);\\n',\n\t]);\n});\n\ntest('add column before creating unique constraint', async () => {\n\tconst from = {\n\t\ttable: pgTable('table', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\ttable: pgTable('table', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}, (t) => ({\n\t\t\tuq: unique('uq').on(t.name),\n\t\t})),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"table\" ADD COLUMN \"name\" text NOT NULL;',\n\t\t'ALTER TABLE \"table\" ADD CONSTRAINT \"uq\" UNIQUE(\"name\");',\n\t]);\n});\n\ntest('alter composite primary key', async () => {\n\tconst from = {\n\t\ttable: pgTable('table', {\n\t\t\tcol1: integer('col1').notNull(),\n\t\t\tcol2: integer('col2').notNull(),\n\t\t\tcol3: text('col3').notNull(),\n\t\t}, (t) => ({\n\t\t\tpk: primaryKey({\n\t\t\t\tname: 'table_pk',\n\t\t\t\tcolumns: [t.col1, t.col2],\n\t\t\t}),\n\t\t})),\n\t};\n\tconst to = {\n\t\ttable: pgTable('table', {\n\t\t\tcol1: integer('col1').notNull(),\n\t\t\tcol2: integer('col2').notNull(),\n\t\t\tcol3: text('col3').notNull(),\n\t\t}, (t) => ({\n\t\t\tpk: primaryKey({\n\t\t\t\tname: 'table_pk',\n\t\t\t\tcolumns: [t.col2, t.col3],\n\t\t\t}),\n\t\t})),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"table\" DROP CONSTRAINT \"table_pk\";\\n--> statement-breakpoint\\nALTER TABLE \"table\" ADD CONSTRAINT \"table_pk\" PRIMARY KEY(\"col2\",\"col3\");',\n\t]);\n});\n\ntest('add index with op', async () => {\n\tconst from = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: pgTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}, (t) => ({\n\t\t\tnameIdx: index().using('gin', t.name.op('gin_trgm_ops')),\n\t\t})),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE INDEX \"users_name_index\" ON \"users\" USING gin (\"name\" gin_trgm_ops);',\n\t]);\n});\n\ntest('optional db aliases (snake case)', async () => {\n\tconst from = {};\n\n\tconst t1 = pgTable(\n\t\t't1',\n\t\t{\n\t\t\tt1Id1: integer().notNull().primaryKey(),\n\t\t\tt1Col2: integer().notNull(),\n\t\t\tt1Col3: integer().notNull(),\n\t\t\tt2Ref: integer().notNull().references(() => t2.t2Id),\n\t\t\tt1Uni: integer().notNull(),\n\t\t\tt1UniIdx: integer().notNull(),\n\t\t\tt1Idx: integer().notNull(),\n\t\t},\n\t\t(table) => ({\n\t\t\tuni: unique('t1_uni').on(table.t1Uni),\n\t\t\tuniIdx: uniqueIndex('t1_uni_idx').on(table.t1UniIdx),\n\t\t\tidx: index('t1_idx').on(table.t1Idx).where(sql`${table.t1Idx} > 0`),\n\t\t\tfk: foreignKey({\n\t\t\t\tcolumns: [table.t1Col2, table.t1Col3],\n\t\t\t\tforeignColumns: [t3.t3Id1, t3.t3Id2],\n\t\t\t}),\n\t\t}),\n\t);\n\n\tconst t2 = pgTable(\n\t\t't2',\n\t\t{\n\t\t\tt2Id: serial().primaryKey(),\n\t\t},\n\t);\n\n\tconst t3 = pgTable(\n\t\t't3',\n\t\t{\n\t\t\tt3Id1: integer(),\n\t\t\tt3Id2: integer(),\n\t\t},\n\t\t(table) => ({\n\t\t\tpk: primaryKey({\n\t\t\t\tcolumns: [table.t3Id1, table.t3Id2],\n\t\t\t}),\n\t\t}),\n\t);\n\n\tconst to = {\n\t\tt1,\n\t\tt2,\n\t\tt3,\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemas(from, to, [], false, 'snake_case');\n\n\tconst st1 = `CREATE TABLE \"t1\" (\n\t\"t1_id1\" integer PRIMARY KEY NOT NULL,\n\t\"t1_col2\" integer NOT NULL,\n\t\"t1_col3\" integer NOT NULL,\n\t\"t2_ref\" integer NOT NULL,\n\t\"t1_uni\" integer NOT NULL,\n\t\"t1_uni_idx\" integer NOT NULL,\n\t\"t1_idx\" integer NOT NULL,\n\tCONSTRAINT \"t1_uni\" UNIQUE(\"t1_uni\")\n);\n`;\n\n\tconst st2 = `CREATE TABLE \"t2\" (\n\t\"t2_id\" serial PRIMARY KEY NOT NULL\n);\n`;\n\n\tconst st3 = `CREATE TABLE \"t3\" (\n\t\"t3_id1\" integer,\n\t\"t3_id2\" integer,\n\tCONSTRAINT \"t3_t3_id1_t3_id2_pk\" PRIMARY KEY(\"t3_id1\",\"t3_id2\")\n);\n`;\n\n\tconst st4 =\n\t\t`ALTER TABLE \"t1\" ADD CONSTRAINT \"t1_t2_ref_t2_t2_id_fk\" FOREIGN KEY (\"t2_ref\") REFERENCES \"public\".\"t2\"(\"t2_id\") ON DELETE no action ON UPDATE no action;`;\n\n\tconst st5 =\n\t\t`ALTER TABLE \"t1\" ADD CONSTRAINT \"t1_t1_col2_t1_col3_t3_t3_id1_t3_id2_fk\" FOREIGN KEY (\"t1_col2\",\"t1_col3\") REFERENCES \"public\".\"t3\"(\"t3_id1\",\"t3_id2\") ON DELETE no action ON UPDATE no action;`;\n\n\tconst st6 = `CREATE UNIQUE INDEX \"t1_uni_idx\" ON \"t1\" USING btree (\"t1_uni_idx\");`;\n\n\tconst st7 = `CREATE INDEX \"t1_idx\" ON \"t1\" USING btree (\"t1_idx\") WHERE \"t1\".\"t1_idx\" > 0;`;\n\n\texpect(sqlStatements).toStrictEqual([st1, st2, st3, st4, st5, st6, st7]);\n});\n\ntest('optional db aliases (camel case)', async () => {\n\tconst from = {};\n\n\tconst t1 = pgTable(\n\t\t't1',\n\t\t{\n\t\t\tt1_id1: integer().notNull().primaryKey(),\n\t\t\tt1_col2: integer().notNull(),\n\t\t\tt1_col3: integer().notNull(),\n\t\t\tt2_ref: integer().notNull().references(() => t2.t2_id),\n\t\t\tt1_uni: integer().notNull(),\n\t\t\tt1_uni_idx: integer().notNull(),\n\t\t\tt1_idx: integer().notNull(),\n\t\t},\n\t\t(table) => ({\n\t\t\tuni: unique('t1Uni').on(table.t1_uni),\n\t\t\tuni_idx: uniqueIndex('t1UniIdx').on(table.t1_uni_idx),\n\t\t\tidx: index('t1Idx').on(table.t1_idx).where(sql`${table.t1_idx} > 0`),\n\t\t\tfk: foreignKey({\n\t\t\t\tcolumns: [table.t1_col2, table.t1_col3],\n\t\t\t\tforeignColumns: [t3.t3_id1, t3.t3_id2],\n\t\t\t}),\n\t\t}),\n\t);\n\n\tconst t2 = pgTable(\n\t\t't2',\n\t\t{\n\t\t\tt2_id: serial().primaryKey(),\n\t\t},\n\t);\n\n\tconst t3 = pgTable(\n\t\t't3',\n\t\t{\n\t\t\tt3_id1: integer(),\n\t\t\tt3_id2: integer(),\n\t\t},\n\t\t(table) => ({\n\t\t\tpk: primaryKey({\n\t\t\t\tcolumns: [table.t3_id1, table.t3_id2],\n\t\t\t}),\n\t\t}),\n\t);\n\n\tconst to = {\n\t\tt1,\n\t\tt2,\n\t\tt3,\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemas(from, to, [], false, 'camelCase');\n\n\tconst st1 = `CREATE TABLE \"t1\" (\n\t\"t1Id1\" integer PRIMARY KEY NOT NULL,\n\t\"t1Col2\" integer NOT NULL,\n\t\"t1Col3\" integer NOT NULL,\n\t\"t2Ref\" integer NOT NULL,\n\t\"t1Uni\" integer NOT NULL,\n\t\"t1UniIdx\" integer NOT NULL,\n\t\"t1Idx\" integer NOT NULL,\n\tCONSTRAINT \"t1Uni\" UNIQUE(\"t1Uni\")\n);\n`;\n\n\tconst st2 = `CREATE TABLE \"t2\" (\n\t\"t2Id\" serial PRIMARY KEY NOT NULL\n);\n`;\n\n\tconst st3 = `CREATE TABLE \"t3\" (\n\t\"t3Id1\" integer,\n\t\"t3Id2\" integer,\n\tCONSTRAINT \"t3_t3Id1_t3Id2_pk\" PRIMARY KEY(\"t3Id1\",\"t3Id2\")\n);\n`;\n\n\tconst st4 =\n\t\t`ALTER TABLE \"t1\" ADD CONSTRAINT \"t1_t2Ref_t2_t2Id_fk\" FOREIGN KEY (\"t2Ref\") REFERENCES \"public\".\"t2\"(\"t2Id\") ON DELETE no action ON UPDATE no action;`;\n\n\tconst st5 =\n\t\t`ALTER TABLE \"t1\" ADD CONSTRAINT \"t1_t1Col2_t1Col3_t3_t3Id1_t3Id2_fk\" FOREIGN KEY (\"t1Col2\",\"t1Col3\") REFERENCES \"public\".\"t3\"(\"t3Id1\",\"t3Id2\") ON DELETE no action ON UPDATE no action;`;\n\n\tconst st6 = `CREATE UNIQUE INDEX \"t1UniIdx\" ON \"t1\" USING btree (\"t1UniIdx\");`;\n\n\tconst st7 = `CREATE INDEX \"t1Idx\" ON \"t1\" USING btree (\"t1Idx\") WHERE \"t1\".\"t1Idx\" > 0;`;\n\n\texpect(sqlStatements).toStrictEqual([st1, st2, st3, st4, st5, st6, st7]);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/pg-views.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { integer, pgMaterializedView, pgSchema, pgTable, pgView } from 'drizzle-orm/pg-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemas } from './schemaDiffer';\n\ntest('create table and view #1', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\tconst to = {\n\t\tusers: users,\n\t\tview: pgView('some_view').as((qb) => qb.select().from(users)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumns: [{\n\t\t\tname: 'id',\n\t\t\tnotNull: true,\n\t\t\tprimaryKey: true,\n\t\t\ttype: 'integer',\n\t\t}],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tisRLSEnabled: false,\n\t\tcompositePkName: '',\n\t\tcheckConstraints: [],\n\t\tpolicies: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_view',\n\t\tname: 'some_view',\n\t\tdefinition: `select \"id\" from \"users\"`,\n\t\tschema: 'public',\n\t\twith: undefined,\n\t\tmaterialized: false,\n\t\ttablespace: undefined,\n\t\tusing: undefined,\n\t\twithNoData: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \"users\" (\n\\t\"id\" integer PRIMARY KEY NOT NULL\n);\\n`);\n\texpect(sqlStatements[1]).toBe(`CREATE VIEW \"public\".\"some_view\" AS (select \"id\" from \"users\");`);\n});\n\ntest('create table and view #2', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\tconst to = {\n\t\tusers: users,\n\t\tview: pgView('some_view', { id: integer('id') }).as(sql`SELECT * FROM ${users}`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumns: [{\n\t\t\tname: 'id',\n\t\t\tnotNull: true,\n\t\t\tprimaryKey: true,\n\t\t\ttype: 'integer',\n\t\t}],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tisRLSEnabled: false,\n\t\tcompositePkName: '',\n\t\tpolicies: [],\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_view',\n\t\tname: 'some_view',\n\t\tdefinition: `SELECT * FROM \"users\"`,\n\t\tschema: 'public',\n\t\twith: undefined,\n\t\tmaterialized: false,\n\t\ttablespace: undefined,\n\t\tusing: undefined,\n\t\twithNoData: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \"users\" (\n\\t\"id\" integer PRIMARY KEY NOT NULL\n);\\n`);\n\texpect(sqlStatements[1]).toBe(`CREATE VIEW \"public\".\"some_view\" AS (SELECT * FROM \"users\");`);\n});\n\ntest('create table and view #3', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\tconst to = {\n\t\tusers: users,\n\t\tview1: pgView('some_view1', { id: integer('id') }).with({\n\t\t\tcheckOption: 'local',\n\t\t\tsecurityBarrier: false,\n\t\t\tsecurityInvoker: true,\n\t\t}).as(sql`SELECT * FROM ${users}`),\n\t\tview2: pgView('some_view2').with({\n\t\t\tcheckOption: 'cascaded',\n\t\t\tsecurityBarrier: true,\n\t\t\tsecurityInvoker: false,\n\t\t}).as((qb) => qb.select().from(users)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(3);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumns: [{\n\t\t\tname: 'id',\n\t\t\tnotNull: true,\n\t\t\tprimaryKey: true,\n\t\t\ttype: 'integer',\n\t\t}],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t\tcheckConstraints: [],\n\t\tisRLSEnabled: false,\n\t\tpolicies: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_view',\n\t\tname: 'some_view1',\n\t\tdefinition: `SELECT * FROM \"users\"`,\n\t\tschema: 'public',\n\t\twith: {\n\t\t\tcheckOption: 'local',\n\t\t\tsecurityBarrier: false,\n\t\t\tsecurityInvoker: true,\n\t\t},\n\t\tmaterialized: false,\n\t\ttablespace: undefined,\n\t\tusing: undefined,\n\t\twithNoData: false,\n\t});\n\texpect(statements[2]).toStrictEqual({\n\t\ttype: 'create_view',\n\t\tname: 'some_view2',\n\t\tdefinition: `select \"id\" from \"users\"`,\n\t\tschema: 'public',\n\t\twith: {\n\t\t\tcheckOption: 'cascaded',\n\t\t\tsecurityBarrier: true,\n\t\t\tsecurityInvoker: false,\n\t\t},\n\t\tmaterialized: false,\n\t\ttablespace: undefined,\n\t\tusing: undefined,\n\t\twithNoData: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(3);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \"users\" (\n\\t\"id\" integer PRIMARY KEY NOT NULL\n);\\n`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE VIEW \"public\".\"some_view1\" WITH (check_option = local, security_barrier = false, security_invoker = true) AS (SELECT * FROM \"users\");`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`CREATE VIEW \"public\".\"some_view2\" WITH (check_option = cascaded, security_barrier = true, security_invoker = false) AS (select \"id\" from \"users\");`,\n\t);\n});\n\ntest('create table and view #4', async () => {\n\tconst schema = pgSchema('new_schema');\n\n\tconst users = schema.table('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\tconst to = {\n\t\tschema,\n\t\tusers: users,\n\t\tview1: schema.view('some_view1', { id: integer('id') }).with({\n\t\t\tcheckOption: 'local',\n\t\t\tsecurityBarrier: false,\n\t\t\tsecurityInvoker: true,\n\t\t}).as(sql`SELECT * FROM ${users}`),\n\t\tview2: schema.view('some_view2').with({\n\t\t\tcheckOption: 'cascaded',\n\t\t\tsecurityBarrier: true,\n\t\t\tsecurityInvoker: false,\n\t\t}).as((qb) => qb.select().from(users)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(4);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_schema',\n\t\tname: 'new_schema',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: 'new_schema',\n\t\tcolumns: [{\n\t\t\tname: 'id',\n\t\t\tnotNull: true,\n\t\t\tprimaryKey: true,\n\t\t\ttype: 'integer',\n\t\t}],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t\tisRLSEnabled: false,\n\t\tpolicies: [],\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[2]).toStrictEqual({\n\t\ttype: 'create_view',\n\t\tname: 'some_view1',\n\t\tdefinition: `SELECT * FROM \"new_schema\".\"users\"`,\n\t\tschema: 'new_schema',\n\t\twith: {\n\t\t\tcheckOption: 'local',\n\t\t\tsecurityBarrier: false,\n\t\t\tsecurityInvoker: true,\n\t\t},\n\t\tmaterialized: false,\n\t\ttablespace: undefined,\n\t\tusing: undefined,\n\t\twithNoData: false,\n\t});\n\texpect(statements[3]).toStrictEqual({\n\t\ttype: 'create_view',\n\t\tname: 'some_view2',\n\t\tdefinition: `select \"id\" from \"new_schema\".\"users\"`,\n\t\tschema: 'new_schema',\n\t\twith: {\n\t\t\tcheckOption: 'cascaded',\n\t\t\tsecurityBarrier: true,\n\t\t\tsecurityInvoker: false,\n\t\t},\n\t\tmaterialized: false,\n\t\ttablespace: undefined,\n\t\tusing: undefined,\n\t\twithNoData: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(`CREATE SCHEMA \"new_schema\";\\n`);\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \"new_schema\".\"users\" (\n\\t\"id\" integer PRIMARY KEY NOT NULL\n);\\n`);\n\texpect(sqlStatements[2]).toBe(\n\t\t`CREATE VIEW \"new_schema\".\"some_view1\" WITH (check_option = local, security_barrier = false, security_invoker = true) AS (SELECT * FROM \"new_schema\".\"users\");`,\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t`CREATE VIEW \"new_schema\".\"some_view2\" WITH (check_option = cascaded, security_barrier = true, security_invoker = false) AS (select \"id\" from \"new_schema\".\"users\");`,\n\t);\n});\n\ntest('create table and view #5', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\tconst to = {\n\t\tusers: users,\n\t\tview1: pgView('some_view', { id: integer('id') }).as(sql`SELECT * FROM ${users}`),\n\t\tview2: pgView('some_view', { id: integer('id') }).as(sql`SELECT * FROM ${users}`),\n\t};\n\n\tawait expect(diffTestSchemas({}, to, [])).rejects.toThrowError();\n});\n\ntest('create table and view #6', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\tconst to = {\n\t\tusers: users,\n\t\tview1: pgView('some_view', { id: integer('id') }).with({ checkOption: 'cascaded' }).as(sql`SELECT * FROM ${users}`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\tcompositePkName: '',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'create_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t\tisRLSEnabled: false,\n\t\tpolicies: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tdefinition: 'SELECT * FROM \"users\"',\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\ttype: 'create_view',\n\t\twith: {\n\t\t\tcheckOption: 'cascaded',\n\t\t},\n\t\tmaterialized: false,\n\t\ttablespace: undefined,\n\t\tusing: undefined,\n\t\twithNoData: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \"users\" (\n\\t\"id\" integer PRIMARY KEY NOT NULL\n);\\n`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE VIEW \"public\".\"some_view\" WITH (check_option = cascaded) AS (SELECT * FROM \"users\");`,\n\t);\n});\n\ntest('create view with existing flag', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t};\n\n\tconst to = {\n\t\tusers: users,\n\t\tview1: pgView('some_view', { id: integer('id') }).with({ checkOption: 'cascaded' }).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('create table and materialized view #1', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\tconst to = {\n\t\tusers: users,\n\t\tview: pgMaterializedView('some_view').as((qb) => qb.select().from(users)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumns: [{\n\t\t\tname: 'id',\n\t\t\tnotNull: true,\n\t\t\tprimaryKey: true,\n\t\t\ttype: 'integer',\n\t\t}],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tisRLSEnabled: false,\n\t\tpolicies: [],\n\t\tcompositePkName: '',\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_view',\n\t\tname: 'some_view',\n\t\tdefinition: `select \"id\" from \"users\"`,\n\t\tschema: 'public',\n\t\twith: undefined,\n\t\tmaterialized: true,\n\t\ttablespace: undefined,\n\t\tusing: undefined,\n\t\twithNoData: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \"users\" (\n\\t\"id\" integer PRIMARY KEY NOT NULL\n);\\n`);\n\texpect(sqlStatements[1]).toBe(`CREATE MATERIALIZED VIEW \"public\".\"some_view\" AS (select \"id\" from \"users\");`);\n});\n\ntest('create table and materialized view #2', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\tconst to = {\n\t\tusers: users,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).as(sql`SELECT * FROM ${users}`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumns: [{\n\t\t\tname: 'id',\n\t\t\tnotNull: true,\n\t\t\tprimaryKey: true,\n\t\t\ttype: 'integer',\n\t\t}],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t\tisRLSEnabled: false,\n\t\tpolicies: [],\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_view',\n\t\tname: 'some_view',\n\t\tdefinition: `SELECT * FROM \"users\"`,\n\t\tschema: 'public',\n\t\twith: undefined,\n\t\tmaterialized: true,\n\t\ttablespace: undefined,\n\t\tusing: undefined,\n\t\twithNoData: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \"users\" (\n\\t\"id\" integer PRIMARY KEY NOT NULL\n);\\n`);\n\texpect(sqlStatements[1]).toBe(`CREATE MATERIALIZED VIEW \"public\".\"some_view\" AS (SELECT * FROM \"users\");`);\n});\n\ntest('create table and materialized view #3', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\tconst to = {\n\t\tusers: users,\n\t\tview1: pgMaterializedView('some_view1', { id: integer('id') }).as(sql`SELECT * FROM ${users}`),\n\t\tview2: pgMaterializedView('some_view2').tablespace('some_tablespace').using('heap').withNoData().with({\n\t\t\tautovacuumEnabled: true,\n\t\t\tautovacuumFreezeMaxAge: 1,\n\t\t\tautovacuumFreezeMinAge: 1,\n\t\t\tautovacuumFreezeTableAge: 1,\n\t\t\tautovacuumMultixactFreezeMaxAge: 1,\n\t\t\tautovacuumMultixactFreezeMinAge: 1,\n\t\t\tautovacuumMultixactFreezeTableAge: 1,\n\t\t\tautovacuumVacuumCostDelay: 1,\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t\tautovacuumVacuumScaleFactor: 1,\n\t\t\tautovacuumVacuumThreshold: 1,\n\t\t\tfillfactor: 1,\n\t\t\tlogAutovacuumMinDuration: 1,\n\t\t\tparallelWorkers: 1,\n\t\t\ttoastTupleTarget: 1,\n\t\t\tuserCatalogTable: true,\n\t\t\tvacuumIndexCleanup: 'off',\n\t\t\tvacuumTruncate: false,\n\t\t}).as((qb) => qb.select().from(users)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(3);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumns: [{\n\t\t\tname: 'id',\n\t\t\tnotNull: true,\n\t\t\tprimaryKey: true,\n\t\t\ttype: 'integer',\n\t\t}],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tisRLSEnabled: false,\n\t\tcompositePkName: '',\n\t\tpolicies: [],\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_view',\n\t\tname: 'some_view1',\n\t\tdefinition: `SELECT * FROM \"users\"`,\n\t\tschema: 'public',\n\t\twith: undefined,\n\t\tmaterialized: true,\n\t\twithNoData: false,\n\t\tusing: undefined,\n\t\ttablespace: undefined,\n\t});\n\texpect(statements[2]).toStrictEqual({\n\t\ttype: 'create_view',\n\t\tname: 'some_view2',\n\t\tdefinition: `select \"id\" from \"users\"`,\n\t\tschema: 'public',\n\t\twith: {\n\t\t\tautovacuumEnabled: true,\n\t\t\tautovacuumFreezeMaxAge: 1,\n\t\t\tautovacuumFreezeMinAge: 1,\n\t\t\tautovacuumFreezeTableAge: 1,\n\t\t\tautovacuumMultixactFreezeMaxAge: 1,\n\t\t\tautovacuumMultixactFreezeMinAge: 1,\n\t\t\tautovacuumMultixactFreezeTableAge: 1,\n\t\t\tautovacuumVacuumCostDelay: 1,\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t\tautovacuumVacuumScaleFactor: 1,\n\t\t\tautovacuumVacuumThreshold: 1,\n\t\t\tfillfactor: 1,\n\t\t\tlogAutovacuumMinDuration: 1,\n\t\t\tparallelWorkers: 1,\n\t\t\ttoastTupleTarget: 1,\n\t\t\tuserCatalogTable: true,\n\t\t\tvacuumIndexCleanup: 'off',\n\t\t\tvacuumTruncate: false,\n\t\t},\n\t\tmaterialized: true,\n\t\ttablespace: 'some_tablespace',\n\t\tusing: 'heap',\n\t\twithNoData: true,\n\t});\n\n\texpect(sqlStatements.length).toBe(3);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \"users\" (\n\\t\"id\" integer PRIMARY KEY NOT NULL\n);\\n`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE MATERIALIZED VIEW \"public\".\"some_view1\" AS (SELECT * FROM \"users\");`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`CREATE MATERIALIZED VIEW \"public\".\"some_view2\" USING \"heap\" WITH (autovacuum_enabled = true, autovacuum_freeze_max_age = 1, autovacuum_freeze_min_age = 1, autovacuum_freeze_table_age = 1, autovacuum_multixact_freeze_max_age = 1, autovacuum_multixact_freeze_min_age = 1, autovacuum_multixact_freeze_table_age = 1, autovacuum_vacuum_cost_delay = 1, autovacuum_vacuum_cost_limit = 1, autovacuum_vacuum_scale_factor = 1, autovacuum_vacuum_threshold = 1, fillfactor = 1, log_autovacuum_min_duration = 1, parallel_workers = 1, toast_tuple_target = 1, user_catalog_table = true, vacuum_index_cleanup = off, vacuum_truncate = false) TABLESPACE some_tablespace AS (select \"id\" from \"users\") WITH NO DATA;`,\n\t);\n});\n\ntest('create table and materialized view #4', async () => {\n\t// same names\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\tconst to = {\n\t\tusers: users,\n\t\tview1: pgMaterializedView('some_view', { id: integer('id') }).as(sql`SELECT * FROM ${users}`),\n\t\tview2: pgMaterializedView('some_view', { id: integer('id') }).as(sql`SELECT * FROM ${users}`),\n\t};\n\n\tawait expect(diffTestSchemas({}, to, [])).rejects.toThrowError();\n});\n\ntest('create table and materialized view #5', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\tconst to = {\n\t\tusers: users,\n\t\tview1: pgMaterializedView('some_view', { id: integer('id') }).with({ autovacuumFreezeMinAge: 14 }).as(\n\t\t\tsql`SELECT * FROM ${users}`,\n\t\t),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\tcompositePkName: '',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'create_table',\n\t\tuniqueConstraints: [],\n\t\tisRLSEnabled: false,\n\t\tpolicies: [],\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toEqual({\n\t\tdefinition: 'SELECT * FROM \"users\"',\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\ttype: 'create_view',\n\t\twith: {\n\t\t\tautovacuumFreezeMinAge: 14,\n\t\t},\n\t\tmaterialized: true,\n\t\ttablespace: undefined,\n\t\tusing: undefined,\n\t\twithNoData: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \"users\" (\n\\t\"id\" integer PRIMARY KEY NOT NULL\n);\\n`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE MATERIALIZED VIEW \"public\".\"some_view\" WITH (autovacuum_freeze_min_age = 14) AS (SELECT * FROM \"users\");`,\n\t);\n});\n\ntest('create materialized view with existing flag', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t};\n\n\tconst to = {\n\t\tusers: users,\n\t\tview1: pgMaterializedView('some_view', { id: integer('id') }).with({ autovacuumEnabled: true }).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('drop view #1', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgView('some_view', { id: integer('id') }).as(sql`SELECT * FROM ${users}`),\n\t};\n\n\tconst to = {\n\t\tusers: users,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'drop_view',\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`DROP VIEW \"public\".\"some_view\";`);\n});\n\ntest('drop view with existing flag', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgView('some_view', { id: integer('id') }).existing(),\n\t};\n\n\tconst to = {\n\t\tusers: users,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('drop materialized view #1', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).as(sql`SELECT * FROM ${users}`),\n\t};\n\n\tconst to = {\n\t\tusers: users,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'drop_view',\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\tmaterialized: true,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`DROP MATERIALIZED VIEW \"public\".\"some_view\";`);\n});\n\ntest('drop materialized view with existing flag', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).existing(),\n\t};\n\n\tconst to = {\n\t\tusers: users,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('rename view #1', async () => {\n\tconst from = {\n\t\tview: pgView('some_view', { id: integer('id') }).as(sql`SELECT * FROM \"users\"`),\n\t};\n\n\tconst to = {\n\t\tview: pgView('new_some_view', { id: integer('id') }).as(sql`SELECT * FROM \"users\"`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, ['public.some_view->public.new_some_view']);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_view',\n\t\tnameFrom: 'some_view',\n\t\tnameTo: 'new_some_view',\n\t\tschema: 'public',\n\t});\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER VIEW \"public\".\"some_view\" RENAME TO \"new_some_view\";`);\n});\n\ntest('rename view with existing flag', async () => {\n\tconst from = {\n\t\tview: pgView('some_view', { id: integer('id') }).existing(),\n\t};\n\n\tconst to = {\n\t\tview: pgView('new_some_view', { id: integer('id') }).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, ['public.some_view->public.new_some_view']);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('rename materialized view #1', async () => {\n\tconst from = {\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).as(sql`SELECT * FROM \"users\"`),\n\t};\n\n\tconst to = {\n\t\tview: pgMaterializedView('new_some_view', { id: integer('id') }).as(sql`SELECT * FROM \"users\"`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, ['public.some_view->public.new_some_view']);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_view',\n\t\tnameFrom: 'some_view',\n\t\tnameTo: 'new_some_view',\n\t\tschema: 'public',\n\t\tmaterialized: true,\n\t});\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`ALTER MATERIALIZED VIEW \"public\".\"some_view\" RENAME TO \"new_some_view\";`);\n});\n\ntest('rename materialized view with existing flag', async () => {\n\tconst from = {\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).existing(),\n\t};\n\n\tconst to = {\n\t\tview: pgMaterializedView('new_some_view', { id: integer('id') }).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, ['public.some_view->public.new_some_view']);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('view alter schema', async () => {\n\tconst schema = pgSchema('new_schema');\n\n\tconst from = {\n\t\tview: pgView('some_view', { id: integer('id') }).as(sql`SELECT * FROM \"users\"`),\n\t};\n\n\tconst to = {\n\t\tschema,\n\t\tview: schema.view('some_view', { id: integer('id') }).as(sql`SELECT * FROM \"users\"`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, ['public.some_view->new_schema.some_view']);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_schema',\n\t\tname: 'new_schema',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'alter_view_alter_schema',\n\t\ttoSchema: 'new_schema',\n\t\tfromSchema: 'public',\n\t\tname: 'some_view',\n\t});\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`CREATE SCHEMA \"new_schema\";\\n`);\n\texpect(sqlStatements[1]).toBe(`ALTER VIEW \"public\".\"some_view\" SET SCHEMA \"new_schema\";`);\n});\n\ntest('view alter schema with existing flag', async () => {\n\tconst schema = pgSchema('new_schema');\n\n\tconst from = {\n\t\tview: pgView('some_view', { id: integer('id') }).existing(),\n\t};\n\n\tconst to = {\n\t\tschema,\n\t\tview: schema.view('some_view', { id: integer('id') }).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, ['public.some_view->new_schema.some_view']);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_schema',\n\t\tname: 'new_schema',\n\t});\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`CREATE SCHEMA \"new_schema\";\\n`);\n});\n\ntest('view alter schema for materialized', async () => {\n\tconst schema = pgSchema('new_schema');\n\n\tconst from = {\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).as(sql`SELECT * FROM \"users\"`),\n\t};\n\n\tconst to = {\n\t\tschema,\n\t\tview: schema.materializedView('some_view', { id: integer('id') }).as(sql`SELECT * FROM \"users\"`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, ['public.some_view->new_schema.some_view']);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_schema',\n\t\tname: 'new_schema',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'alter_view_alter_schema',\n\t\ttoSchema: 'new_schema',\n\t\tfromSchema: 'public',\n\t\tname: 'some_view',\n\t\tmaterialized: true,\n\t});\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`CREATE SCHEMA \"new_schema\";\\n`);\n\texpect(sqlStatements[1]).toBe(`ALTER MATERIALIZED VIEW \"public\".\"some_view\" SET SCHEMA \"new_schema\";`);\n});\n\ntest('view alter schema for materialized with existing flag', async () => {\n\tconst schema = pgSchema('new_schema');\n\n\tconst from = {\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).existing(),\n\t};\n\n\tconst to = {\n\t\tschema,\n\t\tview: schema.materializedView('some_view', { id: integer('id') }).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, ['public.some_view->new_schema.some_view']);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_schema',\n\t\tname: 'new_schema',\n\t});\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`CREATE SCHEMA \"new_schema\";\\n`);\n});\n\ntest('add with option to view #1', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgView('some_view').as((qb) => qb.select().from(users)),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgView('some_view').with({ checkOption: 'cascaded', securityBarrier: true }).as((qb) =>\n\t\t\tqb.select().from(users)\n\t\t),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\ttype: 'alter_view_add_with_option',\n\t\twith: {\n\t\t\tcheckOption: 'cascaded',\n\t\t\tsecurityBarrier: true,\n\t\t},\n\t\tmaterialized: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER VIEW \"public\".\"some_view\" SET (check_option = cascaded, security_barrier = true);`,\n\t);\n});\n\ntest('add with option to view with existing flag', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgView('some_view', {}).existing(),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgView('some_view', {}).with({ checkOption: 'cascaded', securityBarrier: true }).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('add with option to materialized view #1', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view').as((qb) => qb.select().from(users)),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view').with({ autovacuumMultixactFreezeMaxAge: 3 }).as((qb) =>\n\t\t\tqb.select().from(users)\n\t\t),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\ttype: 'alter_view_add_with_option',\n\t\twith: {\n\t\t\tautovacuumMultixactFreezeMaxAge: 3,\n\t\t},\n\t\tmaterialized: true,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER MATERIALIZED VIEW \"public\".\"some_view\" SET (autovacuum_multixact_freeze_max_age = 3);`,\n\t);\n});\n\ntest('add with option to materialized view with existing flag', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', {}).existing(),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', {}).with({ autovacuumMultixactFreezeMaxAge: 3 }).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('drop with option from view #1', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgView('some_view').with({ checkOption: 'cascaded', securityBarrier: true, securityInvoker: true }).as((qb) =>\n\t\t\tqb.select().from(users)\n\t\t),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgView('some_view').as((qb) => qb.select().from(users)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\ttype: 'alter_view_drop_with_option',\n\t\tmaterialized: false,\n\t\twith: {\n\t\t\tcheckOption: 'cascaded',\n\t\t\tsecurityBarrier: true,\n\t\t\tsecurityInvoker: true,\n\t\t},\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER VIEW \"public\".\"some_view\" RESET (check_option, security_barrier, security_invoker);`,\n\t);\n});\n\ntest('drop with option from view with existing flag', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgView('some_view', {}).with({ checkOption: 'cascaded', securityBarrier: true, securityInvoker: true })\n\t\t\t.existing(),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgView('some_view', {}).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('drop with option from materialized view #1', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view').with({ autovacuumEnabled: true, autovacuumFreezeMaxAge: 10 }).as((qb) =>\n\t\t\tqb.select().from(users)\n\t\t),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view').as((qb) => qb.select().from(users)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\ttype: 'alter_view_drop_with_option',\n\t\tmaterialized: true,\n\t\twith: {\n\t\t\tautovacuumEnabled: true,\n\t\t\tautovacuumFreezeMaxAge: 10,\n\t\t},\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER MATERIALIZED VIEW \"public\".\"some_view\" RESET (autovacuum_enabled, autovacuum_freeze_max_age);`,\n\t);\n});\n\ntest('drop with option from materialized view with existing flag', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', {}).with({ autovacuumEnabled: true, autovacuumFreezeMaxAge: 10 }).existing(),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', {}).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('alter with option in view #1', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgView('some_view').with({ securityBarrier: true, securityInvoker: true }).as((qb) =>\n\t\t\tqb.select().from(users)\n\t\t),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgView('some_view').with({ securityBarrier: true }).as((qb) => qb.select().from(users)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\ttype: 'alter_view_drop_with_option',\n\t\twith: {\n\t\t\tsecurityInvoker: true,\n\t\t},\n\t\tmaterialized: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER VIEW \"public\".\"some_view\" RESET (security_invoker);`,\n\t);\n});\n\ntest('alter with option in view with existing flag', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgView('some_view', {}).with({ securityBarrier: true, securityInvoker: true }).existing(),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgView('some_view', {}).with({ securityBarrier: true }).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('alter with option in materialized view #1', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view').with({ autovacuumEnabled: true, autovacuumVacuumScaleFactor: 1 }).as((qb) =>\n\t\t\tqb.select().from(users)\n\t\t),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view').with({ autovacuumEnabled: true }).as((qb) => qb.select().from(users)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\ttype: 'alter_view_drop_with_option',\n\t\twith: {\n\t\t\tautovacuumVacuumScaleFactor: 1,\n\t\t},\n\t\tmaterialized: true,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER MATERIALIZED VIEW \"public\".\"some_view\" RESET (autovacuum_vacuum_scale_factor);`,\n\t);\n});\n\ntest('alter with option in materialized view with existing flag', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', {}).with({ autovacuumEnabled: true, autovacuumVacuumScaleFactor: 1 })\n\t\t\t.existing(),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', {}).with({ autovacuumEnabled: true }).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('alter with option in view #2', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgView('some_view').with({ checkOption: 'local', securityBarrier: true, securityInvoker: true }).as((qb) =>\n\t\t\tqb.selectDistinct().from(users)\n\t\t),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgView('some_view').with({ checkOption: 'cascaded', securityBarrier: true, securityInvoker: true }).as((qb) =>\n\t\t\tqb.selectDistinct().from(users)\n\t\t),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_view_add_with_option',\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\twith: {\n\t\t\tcheckOption: 'cascaded',\n\t\t},\n\t\tmaterialized: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER VIEW \"public\".\"some_view\" SET (check_option = cascaded);`,\n\t);\n});\n\ntest('alter with option in materialized view #2', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view').with({ autovacuumEnabled: true, fillfactor: 1 }).as((qb) =>\n\t\t\tqb.select().from(users)\n\t\t),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view').with({ autovacuumEnabled: false, fillfactor: 1 }).as((qb) =>\n\t\t\tqb.select().from(users)\n\t\t),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_view_add_with_option',\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\twith: {\n\t\t\tautovacuumEnabled: false,\n\t\t},\n\t\tmaterialized: true,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER MATERIALIZED VIEW \"public\".\"some_view\" SET (autovacuum_enabled = false);`,\n\t);\n});\n\ntest('alter view \".as\" value', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgView('some_view', { id: integer('id') }).with({\n\t\t\tcheckOption: 'local',\n\t\t\tsecurityBarrier: true,\n\t\t\tsecurityInvoker: true,\n\t\t}).as(sql`SELECT '123'`),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgView('some_view', { id: integer('id') }).with({\n\t\t\tcheckOption: 'local',\n\t\t\tsecurityBarrier: true,\n\t\t\tsecurityInvoker: true,\n\t\t}).as(sql`SELECT '1234'`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual(\n\t\t{\n\t\t\tname: 'some_view',\n\t\t\tschema: 'public',\n\t\t\ttype: 'drop_view',\n\t\t},\n\t);\n\texpect(statements[1]).toStrictEqual(\n\t\t{\n\t\t\tdefinition: \"SELECT '1234'\",\n\t\t\tname: 'some_view',\n\t\t\tschema: 'public',\n\t\t\ttype: 'create_view',\n\t\t\tmaterialized: false,\n\t\t\twith: {\n\t\t\t\tcheckOption: 'local',\n\t\t\t\tsecurityBarrier: true,\n\t\t\t\tsecurityInvoker: true,\n\t\t\t},\n\t\t\twithNoData: false,\n\t\t\ttablespace: undefined,\n\t\t\tusing: undefined,\n\t\t},\n\t);\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe('DROP VIEW \"public\".\"some_view\";');\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE VIEW \"public\".\"some_view\" WITH (check_option = local, security_barrier = true, security_invoker = true) AS (SELECT '1234');`,\n\t);\n});\n\ntest('alter view \".as\" value with existing flag', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgView('some_view', { id: integer('id') }).with({\n\t\t\tcheckOption: 'local',\n\t\t\tsecurityBarrier: true,\n\t\t\tsecurityInvoker: true,\n\t\t}).existing(),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgView('some_view', { id: integer('id') }).with({\n\t\t\tcheckOption: 'local',\n\t\t\tsecurityBarrier: true,\n\t\t\tsecurityInvoker: true,\n\t\t}).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('alter materialized view \".as\" value', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT '123'`),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT '1234'`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual(\n\t\t{\n\t\t\tname: 'some_view',\n\t\t\tschema: 'public',\n\t\t\ttype: 'drop_view',\n\t\t\tmaterialized: true,\n\t\t},\n\t);\n\texpect(statements[1]).toStrictEqual(\n\t\t{\n\t\t\tdefinition: \"SELECT '1234'\",\n\t\t\tname: 'some_view',\n\t\t\tschema: 'public',\n\t\t\ttype: 'create_view',\n\t\t\twith: {\n\t\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t\t},\n\t\t\tmaterialized: true,\n\t\t\twithNoData: false,\n\t\t\ttablespace: undefined,\n\t\t\tusing: undefined,\n\t\t},\n\t);\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe('DROP MATERIALIZED VIEW \"public\".\"some_view\";');\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE MATERIALIZED VIEW \"public\".\"some_view\" WITH (autovacuum_vacuum_cost_limit = 1) AS (SELECT '1234');`,\n\t);\n});\n\ntest('alter materialized view \".as\" value with existing flag', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).existing(),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('drop existing flag', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).existing(),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toEqual({\n\t\ttype: 'drop_view',\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\tmaterialized: true,\n\t});\n\texpect(statements[1]).toEqual({\n\t\tdefinition: \"SELECT 'asd'\",\n\t\tmaterialized: true,\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\ttablespace: undefined,\n\t\ttype: 'create_view',\n\t\tusing: undefined,\n\t\twith: {\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t},\n\t\twithNoData: false,\n\t});\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`DROP MATERIALIZED VIEW \"public\".\"some_view\";`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE MATERIALIZED VIEW \"public\".\"some_view\" WITH (autovacuum_vacuum_cost_limit = 1) AS (SELECT 'asd');`,\n\t);\n});\n\ntest('alter tablespace - materialize', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).tablespace('some_tablespace').with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).tablespace('new_tablespace').with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toEqual({\n\t\ttype: 'alter_view_alter_tablespace',\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\tmaterialized: true,\n\t\ttoTablespace: 'new_tablespace',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER MATERIALIZED VIEW \"public\".\"some_view\" SET TABLESPACE new_tablespace;`,\n\t);\n});\n\ntest('set tablespace - materialize', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).tablespace('new_tablespace').with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toEqual({\n\t\ttype: 'alter_view_alter_tablespace',\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\tmaterialized: true,\n\t\ttoTablespace: 'new_tablespace',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER MATERIALIZED VIEW \"public\".\"some_view\" SET TABLESPACE new_tablespace;`,\n\t);\n});\n\ntest('drop tablespace - materialize', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).tablespace('new_tablespace').with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toEqual({\n\t\ttype: 'alter_view_alter_tablespace',\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\tmaterialized: true,\n\t\ttoTablespace: 'pg_default',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER MATERIALIZED VIEW \"public\".\"some_view\" SET TABLESPACE pg_default;`,\n\t);\n});\n\ntest('set existing - materialized', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).tablespace('new_tablespace').with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('new_some_view', { id: integer('id') }).with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t\tautovacuumFreezeMinAge: 1,\n\t\t}).withNoData().existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, ['public.some_view->public.new_some_view']);\n\n\texpect(statements.length).toBe(0);\n\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('drop existing - materialized', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).tablespace('new_tablespace').with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).existing(),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t\tautovacuumFreezeMinAge: 1,\n\t\t}).withNoData().as(sql`SELECT 'asd'`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(2);\n\n\texpect(sqlStatements.length).toBe(2);\n});\n\ntest('set existing', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgView('some_view', { id: integer('id') }).with({\n\t\t\tcheckOption: 'cascaded',\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgView('new_some_view', { id: integer('id') }).with({\n\t\t\tcheckOption: 'cascaded',\n\t\t\tsecurityBarrier: true,\n\t\t}).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, ['public.some_view->public.new_some_view']);\n\n\texpect(statements.length).toBe(0);\n\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('alter using - materialize', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).tablespace('some_tablespace').using('some_using').with(\n\t\t\t{\n\t\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t\t},\n\t\t).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).tablespace('some_tablespace').using('new_using').with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toEqual({\n\t\ttype: 'alter_view_alter_using',\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\tmaterialized: true,\n\t\ttoUsing: 'new_using',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER MATERIALIZED VIEW \"public\".\"some_view\" SET ACCESS METHOD \"new_using\";`,\n\t);\n});\n\ntest('set using - materialize', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).using('new_using').with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toEqual({\n\t\ttype: 'alter_view_alter_using',\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\tmaterialized: true,\n\t\ttoUsing: 'new_using',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER MATERIALIZED VIEW \"public\".\"some_view\" SET ACCESS METHOD \"new_using\";`,\n\t);\n});\n\ntest('drop using - materialize', async () => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t});\n\n\tconst from = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).using('new_using').with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst to = {\n\t\tusers,\n\t\tview: pgMaterializedView('some_view', { id: integer('id') }).with({\n\t\t\tautovacuumVacuumCostLimit: 1,\n\t\t}).as(sql`SELECT 'asd'`),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toEqual({\n\t\ttype: 'alter_view_alter_using',\n\t\tname: 'some_view',\n\t\tschema: 'public',\n\t\tmaterialized: true,\n\t\ttoUsing: 'heap',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER MATERIALIZED VIEW \"public\".\"some_view\" SET ACCESS METHOD \"heap\";`,\n\t);\n});\n\ntest('rename view and alter view', async () => {\n\tconst from = {\n\t\tview: pgView('some_view', { id: integer('id') }).as(sql`SELECT * FROM \"users\"`),\n\t};\n\n\tconst to = {\n\t\tview: pgView('new_some_view', { id: integer('id') }).with({ checkOption: 'cascaded' }).as(\n\t\t\tsql`SELECT * FROM \"users\"`,\n\t\t),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, ['public.some_view->public.new_some_view']);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_view',\n\t\tnameFrom: 'some_view',\n\t\tnameTo: 'new_some_view',\n\t\tschema: 'public',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tmaterialized: false,\n\t\tname: 'new_some_view',\n\t\tschema: 'public',\n\t\ttype: 'alter_view_add_with_option',\n\t\twith: {\n\t\t\tcheckOption: 'cascaded',\n\t\t},\n\t});\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`ALTER VIEW \"public\".\"some_view\" RENAME TO \"new_some_view\";`);\n\texpect(sqlStatements[1]).toBe(`ALTER VIEW \"public\".\"new_some_view\" SET (check_option = cascaded);`);\n});\n\ntest('moved schema and alter view', async () => {\n\tconst schema = pgSchema('my_schema');\n\tconst from = {\n\t\tschema,\n\t\tview: pgView('some_view', { id: integer('id') }).as(sql`SELECT * FROM \"users\"`),\n\t};\n\n\tconst to = {\n\t\tschema,\n\t\tview: schema.view('some_view', { id: integer('id') }).with({ checkOption: 'cascaded' }).as(\n\t\t\tsql`SELECT * FROM \"users\"`,\n\t\t),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(from, to, ['public.some_view->my_schema.some_view']);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tfromSchema: 'public',\n\t\tname: 'some_view',\n\t\ttoSchema: 'my_schema',\n\t\ttype: 'alter_view_alter_schema',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tname: 'some_view',\n\t\tschema: 'my_schema',\n\t\ttype: 'alter_view_add_with_option',\n\t\tmaterialized: false,\n\t\twith: {\n\t\t\tcheckOption: 'cascaded',\n\t\t},\n\t});\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`ALTER VIEW \"public\".\"some_view\" SET SCHEMA \"my_schema\";`);\n\texpect(sqlStatements[1]).toBe(`ALTER VIEW \"my_schema\".\"some_view\" SET (check_option = cascaded);`);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/push/common.ts",
    "content": "import { afterAll, beforeAll, beforeEach, test } from 'vitest';\n\nexport interface DialectSuite {\n\tallTypes(context?: any): Promise<void>;\n\taddBasicIndexes(context?: any): Promise<void>;\n\tchangeIndexFields(context?: any): Promise<void>;\n\tdropIndex(context?: any): Promise<void>;\n\tindexesToBeNotTriggered(context?: any): Promise<void>;\n\tindexesTestCase1(context?: any): Promise<void>;\n\taddNotNull(context?: any): Promise<void>;\n\taddNotNullWithDataNoRollback(context?: any): Promise<void>;\n\taddBasicSequences(context?: any): Promise<void>;\n\taddGeneratedColumn(context?: any): Promise<void>;\n\taddGeneratedToColumn(context?: any): Promise<void>;\n\tdropGeneratedConstraint(context?: any): Promise<void>;\n\talterGeneratedConstraint(context?: any): Promise<void>;\n\tcreateTableWithGeneratedConstraint(context?: any): Promise<void>;\n\tcreateCompositePrimaryKey(context?: any): Promise<void>;\n\trenameTableWithCompositePrimaryKey(context?: any): Promise<void>;\n\tcase1(): Promise<void>;\n}\n\nexport const run = (\n\tsuite: DialectSuite,\n\tbeforeAllFn?: (context: any) => Promise<void>,\n\tafterAllFn?: (context: any) => Promise<void>,\n\tbeforeEachFn?: (context: any) => Promise<void>,\n) => {\n\tlet context: any = {};\n\tbeforeAll(beforeAllFn ? () => beforeAllFn(context) : () => {});\n\n\tbeforeEach(beforeEachFn ? () => beforeEachFn(context) : () => {});\n\n\ttest('No diffs for all database types', () => suite.allTypes(context));\n\ttest('Adding basic indexes', () => suite.addBasicIndexes(context));\n\ttest('Dropping basic index', () => suite.dropIndex(context));\n\ttest('Altering indexes', () => suite.changeIndexFields(context));\n\ttest('Indexes properties that should not trigger push changes', () => suite.indexesToBeNotTriggered(context));\n\ttest('Indexes test case #1', () => suite.indexesTestCase1(context));\n\ttest('Drop column', () => suite.case1());\n\n\ttest('Add not null to a column', () => suite.addNotNull());\n\ttest('Add not null to a column with null data. Should rollback', () => suite.addNotNullWithDataNoRollback());\n\n\ttest('Add basic sequences', () => suite.addBasicSequences());\n\n\ttest('Add generated column', () => suite.addGeneratedColumn(context));\n\ttest('Add generated constraint to an existing column', () => suite.addGeneratedToColumn(context));\n\ttest('Drop generated constraint from a column', () => suite.dropGeneratedConstraint(context));\n\t// should ignore on push\n\ttest('Alter generated constraint', () => suite.alterGeneratedConstraint(context));\n\ttest('Create table with generated column', () => suite.createTableWithGeneratedConstraint(context));\n\ttest('Rename table with composite primary key', () => suite.renameTableWithCompositePrimaryKey(context));\n\n\ttest('Create composite primary key', () => suite.createCompositePrimaryKey(context));\n\n\tafterAll(afterAllFn ? () => afterAllFn(context) : () => {});\n};\n"
  },
  {
    "path": "drizzle-kit/tests/push/libsql.test.ts",
    "content": "import { createClient } from '@libsql/client';\nimport chalk from 'chalk';\nimport { sql } from 'drizzle-orm';\nimport {\n\tblob,\n\tcheck,\n\tforeignKey,\n\tgetTableConfig,\n\tindex,\n\tint,\n\tinteger,\n\tnumeric,\n\treal,\n\tsqliteTable,\n\tsqliteView,\n\ttext,\n\tuniqueIndex,\n} from 'drizzle-orm/sqlite-core';\nimport { diffTestSchemasPushLibSQL } from 'tests/schemaDiffer';\nimport { expect, test } from 'vitest';\n\ntest('nothing changed in schema', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst users = sqliteTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t\tname: text('name').notNull(),\n\t\temail: text('email'),\n\t\ttextJson: text('text_json', { mode: 'json' }),\n\t\tblobJon: blob('blob_json', { mode: 'json' }),\n\t\tblobBigInt: blob('blob_bigint', { mode: 'bigint' }),\n\t\tnumeric: numeric('numeric'),\n\t\tcreatedAt: integer('created_at', { mode: 'timestamp' }),\n\t\tcreatedAtMs: integer('created_at_ms', { mode: 'timestamp_ms' }),\n\t\treal: real('real'),\n\t\ttext: text('text', { length: 255 }),\n\t\trole: text('role', { enum: ['admin', 'user'] }).default('user'),\n\t\tisConfirmed: integer('is_confirmed', {\n\t\t\tmode: 'boolean',\n\t\t}),\n\t});\n\n\tconst schema1 = {\n\t\tusers,\n\n\t\tcustomers: sqliteTable('customers', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\taddress: text('address').notNull(),\n\t\t\tisConfirmed: integer('is_confirmed', { mode: 'boolean' }),\n\t\t\tregistrationDate: integer('registration_date', { mode: 'timestamp_ms' })\n\t\t\t\t.notNull()\n\t\t\t\t.$defaultFn(() => new Date()),\n\t\t\tuserId: integer('user_id')\n\t\t\t\t.references(() => users.id)\n\t\t\t\t.notNull(),\n\t\t}),\n\n\t\tposts: sqliteTable('posts', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tcontent: text('content'),\n\t\t\tauthorId: integer('author_id'),\n\t\t}),\n\t};\n\n\tconst {\n\t\tsqlStatements,\n\t\tstatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(turso, schema1, schema1, [], false);\n\texpect(sqlStatements.length).toBe(0);\n\texpect(statements.length).toBe(0);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n});\n\ntest('added, dropped index', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst users = sqliteTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t\tname: text('name').notNull(),\n\t\temail: text('email'),\n\t\ttextJson: text('text_json', { mode: 'json' }),\n\t\tblobJon: blob('blob_json', { mode: 'json' }),\n\t\tblobBigInt: blob('blob_bigint', { mode: 'bigint' }),\n\t\tnumeric: numeric('numeric'),\n\t\tcreatedAt: integer('created_at', { mode: 'timestamp' }),\n\t\tcreatedAtMs: integer('created_at_ms', { mode: 'timestamp_ms' }),\n\t\treal: real('real'),\n\t\ttext: text('text', { length: 255 }),\n\t\trole: text('role', { enum: ['admin', 'user'] }).default('user'),\n\t\tisConfirmed: integer('is_confirmed', {\n\t\t\tmode: 'boolean',\n\t\t}),\n\t});\n\n\tconst schema1 = {\n\t\tusers,\n\t\tcustomers: sqliteTable(\n\t\t\t'customers',\n\t\t\t{\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\taddress: text('address').notNull(),\n\t\t\t\tisConfirmed: integer('is_confirmed', { mode: 'boolean' }),\n\t\t\t\tregistrationDate: integer('registration_date', { mode: 'timestamp_ms' })\n\t\t\t\t\t.notNull()\n\t\t\t\t\t.$defaultFn(() => new Date()),\n\t\t\t\tuserId: integer('user_id').notNull(),\n\t\t\t},\n\t\t\t(table) => ({\n\t\t\t\tuniqueIndex: uniqueIndex('customers_address_unique').on(table.address),\n\t\t\t}),\n\t\t),\n\n\t\tposts: sqliteTable('posts', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tcontent: text('content'),\n\t\t\tauthorId: integer('author_id'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers,\n\t\tcustomers: sqliteTable(\n\t\t\t'customers',\n\t\t\t{\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\taddress: text('address').notNull(),\n\t\t\t\tisConfirmed: integer('is_confirmed', { mode: 'boolean' }),\n\t\t\t\tregistrationDate: integer('registration_date', { mode: 'timestamp_ms' })\n\t\t\t\t\t.notNull()\n\t\t\t\t\t.$defaultFn(() => new Date()),\n\t\t\t\tuserId: integer('user_id').notNull(),\n\t\t\t},\n\t\t\t(table) => ({\n\t\t\t\tuniqueIndex: uniqueIndex('customers_is_confirmed_unique').on(\n\t\t\t\t\ttable.isConfirmed,\n\t\t\t\t),\n\t\t\t}),\n\t\t),\n\n\t\tposts: sqliteTable('posts', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tcontent: text('content'),\n\t\t\tauthorId: integer('author_id'),\n\t\t}),\n\t};\n\n\tconst {\n\t\tsqlStatements,\n\t\tstatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(turso, schema1, schema2, [], false);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'drop_index',\n\t\ttableName: 'customers',\n\t\tdata: 'customers_address_unique;address;true;',\n\t\tschema: '',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_index',\n\t\ttableName: 'customers',\n\t\tdata: 'customers_is_confirmed_unique;is_confirmed;true;',\n\t\tschema: '',\n\t\tinternal: { indexes: {} },\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`DROP INDEX \\`customers_address_unique\\`;`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE UNIQUE INDEX \\`customers_is_confirmed_unique\\` ON \\`customers\\` (\\`is_confirmed\\`);`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('added column not null and without default to table with data', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst schema1 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t\tage: integer('age').notNull(),\n\t\t}),\n\t};\n\n\tconst table = getTableConfig(schema1.companies);\n\n\tconst seedStatements = [\n\t\t`INSERT INTO \\`${table.name}\\` (\"${schema1.companies.name.name}\") VALUES ('drizzle');`,\n\t\t`INSERT INTO \\`${table.name}\\` (\"${schema1.companies.name.name}\") VALUES ('turso');`,\n\t];\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\tseedStatements,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'companies',\n\t\tcolumn: {\n\t\t\tname: 'age',\n\t\t\ttype: 'integer',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: true,\n\t\t\tautoincrement: false,\n\t\t},\n\t\treferenceData: undefined,\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`delete from companies;`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \\`companies\\` ADD \\`age\\` integer NOT NULL;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(1);\n\texpect(infoToPrint![0]).toBe(\n\t\t`· You're about to add not-null ${\n\t\t\tchalk.underline(\n\t\t\t\t'age',\n\t\t\t)\n\t\t} column without default value, which contains 2 items`,\n\t);\n\texpect(shouldAskForApprove).toBe(true);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(1);\n\texpect(tablesToTruncate![0]).toBe('companies');\n});\n\ntest('added column not null and without default to table without data', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst schema1 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t\tage: integer('age').notNull(),\n\t\t}),\n\t};\n\n\tconst {\n\t\tsqlStatements,\n\t\tstatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(turso, schema1, schema2, [], false);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'companies',\n\t\tcolumn: {\n\t\t\tname: 'age',\n\t\t\ttype: 'integer',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: true,\n\t\t\tautoincrement: false,\n\t\t},\n\t\treferenceData: undefined,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`companies\\` ADD \\`age\\` integer NOT NULL;`,\n\t);\n\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('drop autoincrement. drop column with data', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst schema1 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: false }),\n\t\t}),\n\t};\n\n\tconst table = getTableConfig(schema1.companies);\n\tconst seedStatements = [\n\t\t`INSERT INTO \\`${table.name}\\` (\"${schema1.companies.id.name}\", \"${schema1.companies.name.name}\") VALUES (1, 'drizzle');`,\n\t\t`INSERT INTO \\`${table.name}\\` (\"${schema1.companies.id.name}\", \"${schema1.companies.name.name}\") VALUES (2, 'turso');`,\n\t];\n\n\tconst {\n\t\tsqlStatements,\n\t\tstatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\tseedStatements,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\ttableName: 'companies',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\ttype: 'integer',\n\t\t\t\tautoincrement: false,\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(\n\t\t`CREATE TABLE \\`__new_companies\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL\n);\\n`,\n\t);\n\texpect(sqlStatements[1]).toBe(`INSERT INTO \\`__new_companies\\`(\"id\") SELECT \"id\" FROM \\`companies\\`;`);\n\texpect(sqlStatements[2]).toBe(`DROP TABLE \\`companies\\`;`);\n\texpect(sqlStatements[3]).toBe(\n\t\t`ALTER TABLE \\`__new_companies\\` RENAME TO \\`companies\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(1);\n\texpect(infoToPrint!.length).toBe(1);\n\texpect(infoToPrint![0]).toBe(\n\t\t`· You're about to delete ${\n\t\t\tchalk.underline(\n\t\t\t\t'name',\n\t\t\t)\n\t\t} column in companies table with 2 items`,\n\t);\n\texpect(shouldAskForApprove).toBe(true);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('change autoincrement. table is part of foreign key', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst companies1 = sqliteTable('companies', {\n\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t});\n\tconst users1 = sqliteTable('users', {\n\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\tname: text('name').unique(),\n\t\tcompanyId: integer('company_id').references(() => companies1.id),\n\t});\n\tconst schema1 = {\n\t\tcompanies: companies1,\n\t\tusers: users1,\n\t};\n\n\tconst companies2 = sqliteTable('companies', {\n\t\tid: integer('id').primaryKey({ autoIncrement: false }),\n\t});\n\tconst users2 = sqliteTable('users', {\n\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\tname: text('name').unique(),\n\t\tcompanyId: integer('company_id').references(() => companies2.id),\n\t});\n\tconst schema2 = {\n\t\tcompanies: companies2,\n\t\tusers: users2,\n\t};\n\n\tconst { name: usersTableName } = getTableConfig(users1);\n\tconst { name: companiesTableName } = getTableConfig(companies1);\n\tconst seedStatements = [\n\t\t`INSERT INTO \\`${usersTableName}\\` (\"${schema1.users.name.name}\") VALUES ('drizzle');`,\n\t\t`INSERT INTO \\`${usersTableName}\\` (\"${schema1.users.name.name}\") VALUES ('turso');`,\n\t\t`INSERT INTO \\`${companiesTableName}\\` (\"${schema1.companies.id.name}\") VALUES (1);`,\n\t\t`INSERT INTO \\`${companiesTableName}\\` (\"${schema1.companies.id.name}\") VALUES (2);`,\n\t];\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\tseedStatements,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\ttableName: 'companies',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\ttype: 'integer',\n\t\t\t\tautoincrement: false,\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(\n\t\t`CREATE TABLE \\`__new_companies\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL\n);\\n`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`INSERT INTO \\`__new_companies\\`(\"id\") SELECT \"id\" FROM \\`companies\\`;`,\n\t);\n\texpect(sqlStatements[2]).toBe(`DROP TABLE \\`companies\\`;`);\n\texpect(sqlStatements[3]).toBe(\n\t\t`ALTER TABLE \\`__new_companies\\` RENAME TO \\`companies\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('drop not null, add not null', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t\tposts: sqliteTable(\n\t\t\t'posts',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\t\tname: text('name'),\n\t\t\t\tuserId: int('user_id'),\n\t\t\t},\n\t\t),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t\tposts: sqliteTable(\n\t\t\t'posts',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tuserId: int('user_id'),\n\t\t\t},\n\t\t),\n\t};\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements!.length).toBe(2);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnDefault: undefined,\n\t\tcolumnName: 'name',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: 'text',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t});\n\texpect(statements![1]).toStrictEqual({\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnDefault: undefined,\n\t\tcolumnName: 'name',\n\t\tcolumnNotNull: true,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: 'text',\n\t\tschema: '',\n\t\ttableName: 'posts',\n\t\ttype: 'alter_table_alter_column_set_notnull',\n\t});\n\texpect(sqlStatements!.length).toBe(2);\n\texpect(sqlStatements![0]).toBe(`ALTER TABLE \\`users\\` ALTER COLUMN \"name\" TO \"name\" text;`);\n\texpect(sqlStatements![1]).toBe(`ALTER TABLE \\`posts\\` ALTER COLUMN \"name\" TO \"name\" text NOT NULL;`);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('drop table with data', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t\tposts: sqliteTable(\n\t\t\t'posts',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\t\tname: text('name'),\n\t\t\t\tuserId: int('user_id'),\n\t\t\t},\n\t\t),\n\t};\n\n\tconst schema2 = {\n\t\tposts: sqliteTable(\n\t\t\t'posts',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\t\tname: text('name'),\n\t\t\t\tuserId: int('user_id'),\n\t\t\t},\n\t\t),\n\t};\n\n\tconst seedStatements = [\n\t\t`INSERT INTO \\`users\\` (\"name\") VALUES ('drizzle')`,\n\t];\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\tseedStatements,\n\t);\n\n\texpect(statements!.length).toBe(1);\n\texpect(statements![0]).toStrictEqual({\n\t\tpolicies: [],\n\t\tschema: undefined,\n\t\ttableName: 'users',\n\t\ttype: 'drop_table',\n\t});\n\n\texpect(sqlStatements!.length).toBe(1);\n\texpect(sqlStatements![0]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(1);\n\texpect(infoToPrint![0]).toBe(`· You're about to delete ${chalk.underline('users')} table with 1 items`);\n\texpect(shouldAskForApprove).toBe(true);\n\texpect(tablesToRemove!.length).toBe(1);\n\texpect(tablesToRemove![0]).toBe('users');\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('recreate table with nested references', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tlet users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\tname: text('name'),\n\t\tage: integer('age'),\n\t});\n\tlet subscriptions = sqliteTable('subscriptions', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\tuserId: integer('user_id').references(() => users.id),\n\t\tcustomerId: text('customer_id'),\n\t});\n\tconst schema1 = {\n\t\tusers: users,\n\t\tsubscriptions: subscriptions,\n\t\tsubscriptionMetadata: sqliteTable('subscriptions_metadata', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tsubscriptionId: text('subscription_id').references(\n\t\t\t\t() => subscriptions.id,\n\t\t\t),\n\t\t}),\n\t};\n\n\tusers = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\tname: text('name'),\n\t\tage: integer('age'),\n\t});\n\tconst schema2 = {\n\t\tusers: users,\n\t\tsubscriptions: subscriptions,\n\t\tsubscriptionMetadata: sqliteTable('subscriptions_metadata', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tsubscriptionId: text('subscription_id').references(\n\t\t\t\t() => subscriptions.id,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(turso, schema1, schema2, []);\n\n\texpect(statements!.length).toBe(1);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements!.length).toBe(4);\n\texpect(sqlStatements![0]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`name\\` text,\n\\t\\`age\\` integer\n);\\n`);\n\texpect(sqlStatements![1]).toBe(\n\t\t`INSERT INTO \\`__new_users\\`(\"id\", \"name\", \"age\") SELECT \"id\", \"name\", \"age\" FROM \\`users\\`;`,\n\t);\n\texpect(sqlStatements![2]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements![3]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('recreate table with added column not null and without default', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t\tnewColumn: text('new_column').notNull(),\n\t\t}),\n\t};\n\n\tconst seedStatements = [\n\t\t`INSERT INTO \\`users\\` (\"name\", \"age\") VALUES ('drizzle', 12)`,\n\t\t`INSERT INTO \\`users\\` (\"name\", \"age\") VALUES ('turso', 12)`,\n\t];\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\tseedStatements,\n\t);\n\n\texpect(statements!.length).toBe(1);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'new_column',\n\t\t\t\tnotNull: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements!.length).toBe(4);\n\texpect(sqlStatements[0]).toBe('DELETE FROM \\`users\\`;');\n\texpect(sqlStatements![1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`name\\` text,\n\\t\\`age\\` integer,\n\\t\\`new_column\\` text NOT NULL\n);\\n`);\n\texpect(sqlStatements![2]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements![3]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(1);\n\texpect(infoToPrint![0]).toBe(\n\t\t`· You're about to add not-null ${\n\t\t\tchalk.underline('new_column')\n\t\t} column without default value to table, which contains 2 items`,\n\t);\n\texpect(shouldAskForApprove).toBe(true);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(1);\n\texpect(tablesToTruncate![0]).toBe('users');\n});\n\ntest('set not null with index', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}, (table) => ({\n\t\t\tsomeIndex: index('users_name_index').on(table.name),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t}, (table) => ({\n\t\t\tsomeIndex: index('users_name_index').on(table.name),\n\t\t})),\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements!.length).toBe(1);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnDefault: undefined,\n\t\tcolumnName: 'name',\n\t\tcolumnNotNull: true,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: 'text',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'alter_table_alter_column_set_notnull',\n\t});\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_alter_column_set_notnull',\n\t\ttableName: 'users',\n\t\tcolumnName: 'name',\n\t\tschema: '',\n\t\tnewDataType: 'text',\n\t\tcolumnDefault: undefined,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnNotNull: true,\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnPk: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(3);\n\texpect(sqlStatements[0]).toBe(\n\t\t`DROP INDEX \"users_name_index\";`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \\`users\\` ALTER COLUMN \"name\" TO \"name\" text NOT NULL;`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`CREATE INDEX \\`users_name_index\\` ON \\`users\\` (\\`name\\`);`,\n\t);\n\texpect(columnsToRemove!.length).toBe(0), expect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('drop not null with two indexes', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t\tage: int('age').notNull(),\n\t\t}, (table) => ({\n\t\t\tsomeUniqeIndex: uniqueIndex('users_name_unique').on(table.name),\n\t\t\tsomeIndex: index('users_age_index').on(table.age),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t\tage: int('age').notNull(),\n\t\t}, (table) => ({\n\t\t\tsomeUniqeIndex: uniqueIndex('users_name_unique').on(table.name),\n\t\t\tsomeIndex: index('users_age_index').on(table.age),\n\t\t})),\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t\ttableName: 'users',\n\t\tcolumnName: 'name',\n\t\tschema: '',\n\t\tnewDataType: 'text',\n\t\tcolumnDefault: undefined,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnNotNull: false,\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnPk: false,\n\t});\n\n\texpect(sqlStatements.length).toBe(5);\n\texpect(sqlStatements[0]).toBe(\n\t\t`DROP INDEX \"users_name_unique\";`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`DROP INDEX \"users_age_index\";`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`ALTER TABLE \\`users\\` ALTER COLUMN \"name\" TO \"name\" text;`,\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t`CREATE UNIQUE INDEX \\`users_name_unique\\` ON \\`users\\` (\\`name\\`);`,\n\t);\n\texpect(sqlStatements[4]).toBe(\n\t\t`CREATE INDEX \\`users_age_index\\` ON \\`users\\` (\\`age\\`);`,\n\t);\n\texpect(columnsToRemove!.length).toBe(0), expect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('add check constraint to table', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tsomeCheck: check('some_check', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements!.length).toBe(1);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: ['some_check;\"users\".\"age\" > 21'],\n\t});\n\n\texpect(sqlStatements!.length).toBe(4);\n\texpect(sqlStatements![0]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`name\\` text,\n\\t\\`age\\` integer,\n\\tCONSTRAINT \"some_check\" CHECK(\"__new_users\".\"age\" > 21)\n);\\n`);\n\texpect(sqlStatements[1]).toBe(\n\t\t'INSERT INTO `__new_users`(\"id\", \"name\", \"age\") SELECT \"id\", \"name\", \"age\" FROM `users`;',\n\t);\n\texpect(sqlStatements![2]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements![3]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('drop check constraint', async (t) => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tsomeCheck: check('some_check', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}),\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements!.length).toBe(1);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements!.length).toBe(4);\n\texpect(sqlStatements![0]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`name\\` text,\n\\t\\`age\\` integer\n);\\n`);\n\texpect(sqlStatements[1]).toBe(\n\t\t'INSERT INTO `__new_users`(\"id\", \"name\", \"age\") SELECT \"id\", \"name\", \"age\" FROM `users`;',\n\t);\n\texpect(sqlStatements![2]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements![3]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('db has checks. Push with same names', async () => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tsomeCheck: check('some_check', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tsomeCheck: check('some_check', sql`some new value`),\n\t\t})),\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t[],\n\t);\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('create view', async () => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst table = sqliteTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: sqliteView('view').as((qb) => qb.select().from(table)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdefinition: 'select \"id\" from \"test\"',\n\t\t\tname: 'view',\n\t\t\ttype: 'sqlite_create_view',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`CREATE VIEW \\`view\\` AS select \"id\" from \"test\";`,\n\t]);\n});\n\ntest('drop view', async () => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst table = sqliteTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: sqliteView('view').as((qb) => qb.select().from(table)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'view',\n\t\t\ttype: 'drop_view',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP VIEW \\`view\\`;',\n\t]);\n});\n\ntest('alter view \".as\"', async () => {\n\tconst turso = createClient({\n\t\turl: ':memory:',\n\t});\n\n\tconst table = sqliteTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: sqliteView('view').as((qb) => qb.select().from(table).where(sql`${table.id} = 1`)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: sqliteView('view').as((qb) => qb.select().from(table)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushLibSQL(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/push/mysql-push.test.ts",
    "content": "import Docker from 'dockerode';\nimport { sql } from 'drizzle-orm';\nimport { check, int, mysqlTable, mysqlView } from 'drizzle-orm/mysql-core';\nimport fs from 'fs';\nimport getPort from 'get-port';\nimport { Connection, createConnection } from 'mysql2/promise';\nimport { diffTestSchemasPushMysql } from 'tests/schemaDiffer';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, expect, test } from 'vitest';\n\nlet client: Connection;\nlet mysqlContainer: Docker.Container;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'mysql:8';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tmysqlContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait mysqlContainer.start();\n\n\treturn `mysql://root:mysql@127.0.0.1:${port}/drizzle`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env.MYSQL_CONNECTION_STRING ?? await createDockerDB();\n\n\tconst sleep = 1000;\n\tlet timeLeft = 20000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = await createConnection(connectionString);\n\t\t\tawait client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to MySQL');\n\t\tawait client?.end().catch(console.error);\n\t\tawait mysqlContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait mysqlContainer?.stop().catch(console.error);\n});\n\nif (!fs.existsSync('tests/push/mysql')) {\n\tfs.mkdirSync('tests/push/mysql');\n}\n\ntest('add check constraint to table', async () => {\n\tconst schema1 = {\n\t\ttest: mysqlTable('test', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tvalues: int('values'),\n\t\t}),\n\t};\n\tconst schema2 = {\n\t\ttest: mysqlTable('test', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tvalues: int('values'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint1: check('some_check1', sql`${table.values} < 100`),\n\t\t\tcheckConstraint2: check('some_check2', sql`'test' < 100`),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushMysql(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'create_check_constraint',\n\t\t\ttableName: 'test',\n\t\t\tschema: '',\n\t\t\tdata: 'some_check1;\\`test\\`.\\`values\\` < 100',\n\t\t},\n\t\t{\n\t\t\tdata: \"some_check2;'test' < 100\",\n\t\t\tschema: '',\n\t\t\ttableName: 'test',\n\t\t\ttype: 'create_check_constraint',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \\`test\\` ADD CONSTRAINT \\`some_check1\\` CHECK (\\`test\\`.\\`values\\` < 100);',\n\t\t`ALTER TABLE \\`test\\` ADD CONSTRAINT \\`some_check2\\` CHECK ('test' < 100);`,\n\t]);\n\n\tawait client.query(`DROP TABLE \\`test\\`;`);\n});\n\ntest('drop check constraint to table', async () => {\n\tconst schema1 = {\n\t\ttest: mysqlTable('test', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tvalues: int('values'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint1: check('some_check1', sql`${table.values} < 100`),\n\t\t\tcheckConstraint2: check('some_check2', sql`'test' < 100`),\n\t\t})),\n\t};\n\tconst schema2 = {\n\t\ttest: mysqlTable('test', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tvalues: int('values'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushMysql(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'delete_check_constraint',\n\t\t\ttableName: 'test',\n\t\t\tschema: '',\n\t\t\tconstraintName: 'some_check1',\n\t\t},\n\t\t{\n\t\t\tconstraintName: 'some_check2',\n\t\t\tschema: '',\n\t\t\ttableName: 'test',\n\t\t\ttype: 'delete_check_constraint',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \\`test\\` DROP CONSTRAINT \\`some_check1\\`;',\n\t\t`ALTER TABLE \\`test\\` DROP CONSTRAINT \\`some_check2\\`;`,\n\t]);\n\n\tawait client.query(`DROP TABLE \\`test\\`;`);\n});\n\ntest('db has checks. Push with same names', async () => {\n\tconst schema1 = {\n\t\ttest: mysqlTable('test', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tvalues: int('values').default(1),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check', sql`${table.values} < 100`),\n\t\t})),\n\t};\n\tconst schema2 = {\n\t\ttest: mysqlTable('test', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tvalues: int('values').default(1),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check', sql`some new value`),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushMysql(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n\n\tawait client.query(`DROP TABLE \\`test\\`;`);\n});\n\ntest('create view', async () => {\n\tconst table = mysqlTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: mysqlView('view').as((qb) => qb.select().from(table)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushMysql(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdefinition: 'select \\`id\\` from \\`test\\`',\n\t\t\tname: 'view',\n\t\t\ttype: 'mysql_create_view',\n\t\t\treplace: false,\n\t\t\tsqlSecurity: 'definer',\n\t\t\twithCheckOption: undefined,\n\t\t\talgorithm: 'undefined',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`CREATE ALGORITHM = undefined\nSQL SECURITY definer\nVIEW \\`view\\` AS (select \\`id\\` from \\`test\\`);`,\n\t]);\n\n\tawait client.query(`DROP TABLE \\`test\\`;`);\n});\n\ntest('drop view', async () => {\n\tconst table = mysqlTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: mysqlView('view').as((qb) => qb.select().from(table)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushMysql(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'view',\n\t\t\ttype: 'drop_view',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP VIEW \\`view\\`;',\n\t]);\n\tawait client.query(`DROP TABLE \\`test\\`;`);\n\tawait client.query(`DROP VIEW \\`view\\`;`);\n});\n\ntest('alter view \".as\"', async () => {\n\tconst table = mysqlTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: mysqlView('view').as((qb) => qb.select().from(table).where(sql`${table.id} = 1`)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: mysqlView('view').as((qb) => qb.select().from(table)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushMysql(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n\n\tawait client.query(`DROP TABLE \\`test\\`;`);\n\tawait client.query(`DROP VIEW \\`view\\`;`);\n});\n\ntest('alter meta options with distinct in definition', async () => {\n\tconst table = mysqlTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: mysqlView('view').withCheckOption('cascaded').sqlSecurity('definer').algorithm('merge').as((\n\t\t\tqb,\n\t\t) => qb.selectDistinct().from(table).where(sql`${table.id} = 1`)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: mysqlView('view').withCheckOption('cascaded').sqlSecurity('definer').algorithm('undefined').as((qb) =>\n\t\t\tqb.selectDistinct().from(table)\n\t\t),\n\t};\n\n\tawait expect(diffTestSchemasPushMysql(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t)).rejects.toThrowError();\n\n\tawait client.query(`DROP TABLE \\`test\\`;`);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/push/mysql.test.ts",
    "content": "import 'dotenv/config';\nimport Docker from 'dockerode';\nimport { SQL, sql } from 'drizzle-orm';\nimport {\n\tbigint,\n\tbinary,\n\tchar,\n\tdate,\n\tdatetime,\n\tdecimal,\n\tdouble,\n\tfloat,\n\tint,\n\tjson,\n\tmediumint,\n\tmysqlEnum,\n\tmysqlTable,\n\tprimaryKey,\n\tserial,\n\tsmallint,\n\ttext,\n\ttime,\n\ttimestamp,\n\ttinyint,\n\tvarbinary,\n\tvarchar,\n\tyear,\n} from 'drizzle-orm/mysql-core';\nimport getPort from 'get-port';\nimport { Connection, createConnection } from 'mysql2/promise';\nimport { diffTestSchemasMysql, diffTestSchemasPushMysql } from 'tests/schemaDiffer';\nimport { v4 as uuid } from 'uuid';\nimport { expect, test } from 'vitest';\nimport { DialectSuite, run } from './common';\n\nasync function createDockerDB(context: any): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'mysql:8';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tcontext.mysqlContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait context.mysqlContainer.start();\n\n\treturn `mysql://root:mysql@127.0.0.1:${port}/drizzle`;\n}\n\nconst mysqlSuite: DialectSuite = {\n\tallTypes: async function(context: any): Promise<void> {\n\t\tconst schema1 = {\n\t\t\tallBigInts: mysqlTable('all_big_ints', {\n\t\t\t\tsimple: bigint('simple', { mode: 'number' }),\n\t\t\t\tcolumnNotNull: bigint('column_not_null', { mode: 'number' }).notNull(),\n\t\t\t\tcolumnDefault: bigint('column_default', { mode: 'number' }).default(12),\n\t\t\t\tcolumnDefaultSql: bigint('column_default_sql', {\n\t\t\t\t\tmode: 'number',\n\t\t\t\t}).default(12),\n\t\t\t}),\n\t\t\tallBools: mysqlTable('all_bools', {\n\t\t\t\tsimple: tinyint('simple'),\n\t\t\t\tcolumnNotNull: tinyint('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: tinyint('column_default').default(1),\n\t\t\t}),\n\t\t\tallChars: mysqlTable('all_chars', {\n\t\t\t\tsimple: char('simple', { length: 1 }),\n\t\t\t\tcolumnNotNull: char('column_not_null', { length: 45 }).notNull(),\n\t\t\t\t// columnDefault: char(\"column_default\", { length: 1 }).default(\"h\"),\n\t\t\t\tcolumnDefaultSql: char('column_default_sql', { length: 1 }).default(\n\t\t\t\t\t'h',\n\t\t\t\t),\n\t\t\t}),\n\t\t\tallDateTimes: mysqlTable('all_date_times', {\n\t\t\t\tsimple: datetime('simple', { mode: 'string', fsp: 1 }),\n\t\t\t\tcolumnNotNull: datetime('column_not_null', {\n\t\t\t\t\tmode: 'string',\n\t\t\t\t}).notNull(),\n\t\t\t\tcolumnDefault: datetime('column_default', { mode: 'string' }).default(\n\t\t\t\t\t'2023-03-01 14:05:29',\n\t\t\t\t),\n\t\t\t}),\n\t\t\tallDates: mysqlTable('all_dates', {\n\t\t\t\tsimple: date('simple', { mode: 'string' }),\n\t\t\t\tcolumn_not_null: date('column_not_null', { mode: 'string' }).notNull(),\n\t\t\t\tcolumn_default: date('column_default', { mode: 'string' }).default(\n\t\t\t\t\t'2023-03-01',\n\t\t\t\t),\n\t\t\t}),\n\t\t\tallDecimals: mysqlTable('all_decimals', {\n\t\t\t\tsimple: decimal('simple', { precision: 1, scale: 0 }),\n\t\t\t\tcolumnNotNull: decimal('column_not_null', {\n\t\t\t\t\tprecision: 45,\n\t\t\t\t\tscale: 3,\n\t\t\t\t}).notNull(),\n\t\t\t\tcolumnDefault: decimal('column_default', {\n\t\t\t\t\tprecision: 10,\n\t\t\t\t\tscale: 0,\n\t\t\t\t}).default('100'),\n\t\t\t\tcolumnDefaultSql: decimal('column_default_sql', {\n\t\t\t\t\tprecision: 10,\n\t\t\t\t\tscale: 0,\n\t\t\t\t}).default('101'),\n\t\t\t}),\n\n\t\t\tallDoubles: mysqlTable('all_doubles', {\n\t\t\t\tsimple: double('simple'),\n\t\t\t\tcolumnNotNull: double('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: double('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: double('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\tallEnums: mysqlTable('all_enums', {\n\t\t\t\tsimple: mysqlEnum('simple', ['hi', 'hello']),\n\t\t\t}),\n\n\t\t\tallEnums1: mysqlTable('all_enums1', {\n\t\t\t\tsimple: mysqlEnum('simple', ['hi', 'hello']).default('hi'),\n\t\t\t}),\n\n\t\t\tallFloats: mysqlTable('all_floats', {\n\t\t\t\tcolumnNotNull: float('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: float('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: float('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\tallInts: mysqlTable('all_ints', {\n\t\t\t\tsimple: int('simple'),\n\t\t\t\tcolumnNotNull: int('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: int('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: int('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\tallIntsRef: mysqlTable('all_ints_ref', {\n\t\t\t\tsimple: int('simple'),\n\t\t\t\tcolumnNotNull: int('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: int('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: int('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\tallJsons: mysqlTable('all_jsons', {\n\t\t\t\tcolumnDefaultObject: json('column_default_object')\n\t\t\t\t\t.default({ hello: 'world world' })\n\t\t\t\t\t.notNull(),\n\t\t\t\tcolumnDefaultArray: json('column_default_array').default({\n\t\t\t\t\thello: { 'world world': ['foo', 'bar'] },\n\t\t\t\t\tfoo: 'bar',\n\t\t\t\t\tfe: 23,\n\t\t\t\t}),\n\t\t\t\tcolumn: json('column'),\n\t\t\t}),\n\n\t\t\tallMInts: mysqlTable('all_m_ints', {\n\t\t\t\tsimple: mediumint('simple'),\n\t\t\t\tcolumnNotNull: mediumint('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: mediumint('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: mediumint('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\tallReals: mysqlTable('all_reals', {\n\t\t\t\tsimple: double('simple', { precision: 5, scale: 2 }),\n\t\t\t\tcolumnNotNull: double('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: double('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: double('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\tallSInts: mysqlTable('all_s_ints', {\n\t\t\t\tsimple: smallint('simple'),\n\t\t\t\tcolumnNotNull: smallint('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: smallint('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: smallint('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\tallSmallSerials: mysqlTable('all_small_serials', {\n\t\t\t\tcolumnAll: serial('column_all').primaryKey().notNull(),\n\t\t\t}),\n\n\t\t\tallTInts: mysqlTable('all_t_ints', {\n\t\t\t\tsimple: tinyint('simple'),\n\t\t\t\tcolumnNotNull: tinyint('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: tinyint('column_default').default(10),\n\t\t\t\tcolumnDefaultSql: tinyint('column_default_sql').default(11),\n\t\t\t}),\n\n\t\t\tallTexts: mysqlTable('all_texts', {\n\t\t\t\tsimple: text('simple'),\n\t\t\t\tcolumnNotNull: text('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: text('column_default').default('hello'),\n\t\t\t\tcolumnDefaultSql: text('column_default_sql').default('hello'),\n\t\t\t}),\n\n\t\t\tallTimes: mysqlTable('all_times', {\n\t\t\t\tsimple: time('simple', { fsp: 1 }),\n\t\t\t\tcolumnNotNull: time('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: time('column_default').default('22:12:12'),\n\t\t\t}),\n\n\t\t\tallTimestamps: mysqlTable('all_timestamps', {\n\t\t\t\tcolumnDateNow: timestamp('column_date_now', {\n\t\t\t\t\tfsp: 1,\n\t\t\t\t\tmode: 'string',\n\t\t\t\t}).default(sql`(now())`),\n\t\t\t\tcolumnAll: timestamp('column_all', { mode: 'string' })\n\t\t\t\t\t.default('2023-03-01 14:05:29')\n\t\t\t\t\t.notNull(),\n\t\t\t\tcolumn: timestamp('column', { mode: 'string' }).default(\n\t\t\t\t\t'2023-02-28 16:18:31',\n\t\t\t\t),\n\t\t\t}),\n\n\t\t\tallVarChars: mysqlTable('all_var_chars', {\n\t\t\t\tsimple: varchar('simple', { length: 100 }),\n\t\t\t\tcolumnNotNull: varchar('column_not_null', { length: 45 }).notNull(),\n\t\t\t\tcolumnDefault: varchar('column_default', { length: 100 }).default(\n\t\t\t\t\t'hello',\n\t\t\t\t),\n\t\t\t\tcolumnDefaultSql: varchar('column_default_sql', {\n\t\t\t\t\tlength: 100,\n\t\t\t\t}).default('hello'),\n\t\t\t}),\n\n\t\t\tallVarbinaries: mysqlTable('all_varbinaries', {\n\t\t\t\tsimple: varbinary('simple', { length: 100 }),\n\t\t\t\tcolumnNotNull: varbinary('column_not_null', { length: 100 }).notNull(),\n\t\t\t\tcolumnDefault: varbinary('column_default', { length: 12 }).default(\n\t\t\t\t\tsql`(uuid_to_bin(uuid()))`,\n\t\t\t\t),\n\t\t\t}),\n\n\t\t\tallYears: mysqlTable('all_years', {\n\t\t\t\tsimple: year('simple'),\n\t\t\t\tcolumnNotNull: year('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: year('column_default').default(2022),\n\t\t\t}),\n\n\t\t\tbinafry: mysqlTable('binary', {\n\t\t\t\tsimple: binary('simple', { length: 1 }),\n\t\t\t\tcolumnNotNull: binary('column_not_null', { length: 1 }).notNull(),\n\t\t\t\tcolumnDefault: binary('column_default', { length: 12 }).default(\n\t\t\t\t\tsql`(uuid_to_bin(uuid()))`,\n\t\t\t\t),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements } = await diffTestSchemasPushMysql(\n\t\t\tcontext.client as Connection,\n\t\t\tschema1,\n\t\t\tschema1,\n\t\t\t[],\n\t\t\t'drizzle',\n\t\t\tfalse,\n\t\t);\n\t\texpect(statements.length).toBe(2);\n\t\texpect(statements).toEqual([\n\t\t\t{\n\t\t\t\ttype: 'delete_unique_constraint',\n\t\t\t\ttableName: 'all_small_serials',\n\t\t\t\tdata: 'column_all;column_all',\n\t\t\t\tschema: '',\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'delete_unique_constraint',\n\t\t\t\ttableName: 'all_small_serials',\n\t\t\t\tdata: 'column_all;column_all',\n\t\t\t\tschema: '',\n\t\t\t},\n\t\t]);\n\n\t\tconst { sqlStatements: dropStatements } = await diffTestSchemasMysql(\n\t\t\tschema1,\n\t\t\t{},\n\t\t\t[],\n\t\t\tfalse,\n\t\t);\n\n\t\tfor (const st of dropStatements) {\n\t\t\tawait context.client.query(st);\n\t\t}\n\t},\n\taddBasicIndexes: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tchangeIndexFields: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tdropIndex: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tindexesToBeNotTriggered: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tindexesTestCase1: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tasync case1() {\n\t\t// TODO: implement if needed\n\t\texpect(true).toBe(true);\n\t},\n\taddNotNull: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\taddNotNullWithDataNoRollback: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\taddBasicSequences: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\taddGeneratedColumn: async function(context: any): Promise<void> {\n\t\tconst schema1 = {\n\t\t\tusers: mysqlTable('users', {\n\t\t\t\tid: int('id'),\n\t\t\t\tid2: int('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t}),\n\t\t};\n\t\tconst schema2 = {\n\t\t\tusers: mysqlTable('users', {\n\t\t\t\tid: int('id'),\n\t\t\t\tid2: int('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t\t(): SQL => sql`${schema2.users.name} || 'hello'`,\n\t\t\t\t\t{ mode: 'stored' },\n\t\t\t\t),\n\t\t\t\tgeneratedName1: text('gen_name1').generatedAlwaysAs(\n\t\t\t\t\t(): SQL => sql`${schema2.users.name} || 'hello'`,\n\t\t\t\t\t{ mode: 'virtual' },\n\t\t\t\t),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPushMysql(\n\t\t\tcontext.client as Connection,\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t[],\n\t\t\t'drizzle',\n\t\t\tfalse,\n\t\t);\n\n\t\texpect(statements).toStrictEqual([\n\t\t\t{\n\t\t\t\tcolumn: {\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tgenerated: {\n\t\t\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\t\t\ttype: 'stored',\n\t\t\t\t\t},\n\t\t\t\t\tname: 'gen_name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t\tschema: '',\n\t\t\t\ttableName: 'users',\n\t\t\t\ttype: 'alter_table_add_column',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcolumn: {\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tgenerated: {\n\t\t\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\t\t\ttype: 'virtual',\n\t\t\t\t\t},\n\t\t\t\t\tname: 'gen_name1',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t\tschema: '',\n\t\t\t\ttableName: 'users',\n\t\t\t\ttype: 'alter_table_add_column',\n\t\t\t},\n\t\t]);\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t\t\t\"ALTER TABLE `users` ADD `gen_name1` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t\t]);\n\n\t\tfor (const st of sqlStatements) {\n\t\t\tawait context.client.query(st);\n\t\t}\n\n\t\tconst { sqlStatements: dropStatements } = await diffTestSchemasMysql(\n\t\t\tschema2,\n\t\t\t{},\n\t\t\t[],\n\t\t\tfalse,\n\t\t);\n\n\t\tfor (const st of dropStatements) {\n\t\t\tawait context.client.query(st);\n\t\t}\n\t},\n\taddGeneratedToColumn: async function(context: any): Promise<void> {\n\t\tconst schema1 = {\n\t\t\tusers: mysqlTable('users', {\n\t\t\t\tid: int('id'),\n\t\t\t\tid2: int('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name'),\n\t\t\t\tgeneratedName1: text('gen_name1'),\n\t\t\t}),\n\t\t};\n\t\tconst schema2 = {\n\t\t\tusers: mysqlTable('users', {\n\t\t\t\tid: int('id'),\n\t\t\t\tid2: int('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t\t(): SQL => sql`${schema2.users.name} || 'hello'`,\n\t\t\t\t\t{ mode: 'stored' },\n\t\t\t\t),\n\t\t\t\tgeneratedName1: text('gen_name1').generatedAlwaysAs(\n\t\t\t\t\t(): SQL => sql`${schema2.users.name} || 'hello'`,\n\t\t\t\t\t{ mode: 'virtual' },\n\t\t\t\t),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPushMysql(\n\t\t\tcontext.client as Connection,\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t[],\n\t\t\t'drizzle',\n\t\t\tfalse,\n\t\t);\n\n\t\texpect(statements).toStrictEqual([\n\t\t\t{\n\t\t\t\tcolumnAutoIncrement: false,\n\t\t\t\tcolumnDefault: undefined,\n\t\t\t\tcolumnGenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tcolumnName: 'gen_name',\n\t\t\t\tcolumnNotNull: false,\n\t\t\t\tcolumnOnUpdate: undefined,\n\t\t\t\tcolumnPk: false,\n\t\t\t\tnewDataType: 'text',\n\t\t\t\tschema: '',\n\t\t\t\ttableName: 'users',\n\t\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcolumnAutoIncrement: false,\n\t\t\t\tcolumnDefault: undefined,\n\t\t\t\tcolumnGenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\t\ttype: 'virtual',\n\t\t\t\t},\n\t\t\t\tcolumnName: 'gen_name1',\n\t\t\t\tcolumnNotNull: false,\n\t\t\t\tcolumnOnUpdate: undefined,\n\t\t\t\tcolumnPk: false,\n\t\t\t\tnewDataType: 'text',\n\t\t\t\tschema: '',\n\t\t\t\ttableName: 'users',\n\t\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t\t},\n\t\t]);\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t\"ALTER TABLE `users` MODIFY COLUMN `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t\t\t'ALTER TABLE `users` DROP COLUMN `gen_name1`;',\n\t\t\t\"ALTER TABLE `users` ADD `gen_name1` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t\t]);\n\n\t\tfor (const st of sqlStatements) {\n\t\t\tawait context.client.query(st);\n\t\t}\n\n\t\tconst { sqlStatements: dropStatements } = await diffTestSchemasMysql(\n\t\t\tschema2,\n\t\t\t{},\n\t\t\t[],\n\t\t\tfalse,\n\t\t);\n\n\t\tfor (const st of dropStatements) {\n\t\t\tawait context.client.query(st);\n\t\t}\n\t},\n\tdropGeneratedConstraint: async function(context: any): Promise<void> {\n\t\tconst schema1 = {\n\t\t\tusers: mysqlTable('users', {\n\t\t\t\tid: int('id'),\n\t\t\t\tid2: int('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t\t(): SQL => sql`${schema2.users.name}`,\n\t\t\t\t\t{ mode: 'stored' },\n\t\t\t\t),\n\t\t\t\tgeneratedName1: text('gen_name1').generatedAlwaysAs(\n\t\t\t\t\t(): SQL => sql`${schema2.users.name}`,\n\t\t\t\t\t{ mode: 'virtual' },\n\t\t\t\t),\n\t\t\t}),\n\t\t};\n\t\tconst schema2 = {\n\t\t\tusers: mysqlTable('users', {\n\t\t\t\tid: int('id'),\n\t\t\t\tid2: int('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name'),\n\t\t\t\tgeneratedName1: text('gen_name1'),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPushMysql(\n\t\t\tcontext.client as Connection,\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t[],\n\t\t\t'drizzle',\n\t\t\tfalse,\n\t\t);\n\n\t\texpect(statements).toStrictEqual([\n\t\t\t{\n\t\t\t\tcolumnAutoIncrement: false,\n\t\t\t\tcolumnDefault: undefined,\n\t\t\t\tcolumnGenerated: undefined,\n\t\t\t\tcolumnName: 'gen_name',\n\t\t\t\tcolumnNotNull: false,\n\t\t\t\tcolumnOnUpdate: undefined,\n\t\t\t\tcolumnPk: false,\n\t\t\t\tnewDataType: 'text',\n\t\t\t\toldColumn: {\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tdefault: undefined,\n\t\t\t\t\tgenerated: {\n\t\t\t\t\t\tas: '`name`',\n\t\t\t\t\t\ttype: 'stored',\n\t\t\t\t\t},\n\t\t\t\t\tname: 'gen_name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tonUpdate: undefined,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t\tschema: '',\n\t\t\t\ttableName: 'users',\n\t\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcolumnAutoIncrement: false,\n\t\t\t\tcolumnDefault: undefined,\n\t\t\t\tcolumnGenerated: undefined,\n\t\t\t\tcolumnName: 'gen_name1',\n\t\t\t\tcolumnNotNull: false,\n\t\t\t\tcolumnOnUpdate: undefined,\n\t\t\t\tcolumnPk: false,\n\t\t\t\tnewDataType: 'text',\n\t\t\t\toldColumn: {\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tdefault: undefined,\n\t\t\t\t\tgenerated: {\n\t\t\t\t\t\tas: '`name`',\n\t\t\t\t\t\ttype: 'virtual',\n\t\t\t\t\t},\n\t\t\t\t\tname: 'gen_name1',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tonUpdate: undefined,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t\tschema: '',\n\t\t\t\ttableName: 'users',\n\t\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t\t},\n\t\t]);\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t'ALTER TABLE `users` MODIFY COLUMN `gen_name` text;',\n\t\t\t'ALTER TABLE `users` DROP COLUMN `gen_name1`;',\n\t\t\t'ALTER TABLE `users` ADD `gen_name1` text;',\n\t\t]);\n\n\t\tfor (const st of sqlStatements) {\n\t\t\tawait context.client.query(st);\n\t\t}\n\n\t\tconst { sqlStatements: dropStatements } = await diffTestSchemasMysql(\n\t\t\tschema2,\n\t\t\t{},\n\t\t\t[],\n\t\t\tfalse,\n\t\t);\n\n\t\tfor (const st of dropStatements) {\n\t\t\tawait context.client.query(st);\n\t\t}\n\t},\n\talterGeneratedConstraint: async function(context: any): Promise<void> {\n\t\tconst schema1 = {\n\t\t\tusers: mysqlTable('users', {\n\t\t\t\tid: int('id'),\n\t\t\t\tid2: int('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t\t(): SQL => sql`${schema2.users.name}`,\n\t\t\t\t\t{ mode: 'stored' },\n\t\t\t\t),\n\t\t\t\tgeneratedName1: text('gen_name1').generatedAlwaysAs(\n\t\t\t\t\t(): SQL => sql`${schema2.users.name}`,\n\t\t\t\t\t{ mode: 'virtual' },\n\t\t\t\t),\n\t\t\t}),\n\t\t};\n\t\tconst schema2 = {\n\t\t\tusers: mysqlTable('users', {\n\t\t\t\tid: int('id'),\n\t\t\t\tid2: int('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t\t(): SQL => sql`${schema2.users.name} || 'hello'`,\n\t\t\t\t\t{ mode: 'stored' },\n\t\t\t\t),\n\t\t\t\tgeneratedName1: text('gen_name1').generatedAlwaysAs(\n\t\t\t\t\t(): SQL => sql`${schema2.users.name} || 'hello'`,\n\t\t\t\t\t{ mode: 'virtual' },\n\t\t\t\t),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPushMysql(\n\t\t\tcontext.client as Connection,\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t[],\n\t\t\t'drizzle',\n\t\t\tfalse,\n\t\t);\n\n\t\texpect(statements).toStrictEqual([]);\n\t\texpect(sqlStatements).toStrictEqual([]);\n\n\t\tconst { sqlStatements: dropStatements } = await diffTestSchemasMysql(\n\t\t\tschema2,\n\t\t\t{},\n\t\t\t[],\n\t\t\tfalse,\n\t\t);\n\n\t\tfor (const st of dropStatements) {\n\t\t\tawait context.client.query(st);\n\t\t}\n\t},\n\tcreateTableWithGeneratedConstraint: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tcreateCompositePrimaryKey: async function(context: any): Promise<void> {\n\t\tconst schema1 = {};\n\n\t\tconst schema2 = {\n\t\t\ttable: mysqlTable('table', {\n\t\t\t\tcol1: int('col1').notNull(),\n\t\t\t\tcol2: int('col2').notNull(),\n\t\t\t}, (t) => ({\n\t\t\t\tpk: primaryKey({\n\t\t\t\t\tcolumns: [t.col1, t.col2],\n\t\t\t\t}),\n\t\t\t})),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPushMysql(\n\t\t\tcontext.client as Connection,\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t[],\n\t\t\t'drizzle',\n\t\t\tfalse,\n\t\t);\n\n\t\texpect(statements).toStrictEqual([\n\t\t\t{\n\t\t\t\ttype: 'create_table',\n\t\t\t\ttableName: 'table',\n\t\t\t\tschema: undefined,\n\t\t\t\tinternals: {\n\t\t\t\t\tindexes: {},\n\t\t\t\t\ttables: {},\n\t\t\t\t},\n\t\t\t\tcompositePKs: ['table_col1_col2_pk;col1,col2'],\n\t\t\t\tcompositePkName: 'table_col1_col2_pk',\n\t\t\t\tuniqueConstraints: [],\n\t\t\t\tcheckConstraints: [],\n\t\t\t\tcolumns: [\n\t\t\t\t\t{ name: 'col1', type: 'int', primaryKey: false, notNull: true, autoincrement: false },\n\t\t\t\t\t{ name: 'col2', type: 'int', primaryKey: false, notNull: true, autoincrement: false },\n\t\t\t\t],\n\t\t\t},\n\t\t]);\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t'CREATE TABLE `table` (\\n\\t`col1` int NOT NULL,\\n\\t`col2` int NOT NULL,\\n\\tCONSTRAINT `table_col1_col2_pk` PRIMARY KEY(`col1`,`col2`)\\n);\\n',\n\t\t]);\n\t},\n\trenameTableWithCompositePrimaryKey: async function(context?: any): Promise<void> {\n\t\tconst productsCategoriesTable = (tableName: string) => {\n\t\t\treturn mysqlTable(tableName, {\n\t\t\t\tproductId: varchar('product_id', { length: 10 }).notNull(),\n\t\t\t\tcategoryId: varchar('category_id', { length: 10 }).notNull(),\n\t\t\t}, (t) => ({\n\t\t\t\tpk: primaryKey({\n\t\t\t\t\tcolumns: [t.productId, t.categoryId],\n\t\t\t\t}),\n\t\t\t}));\n\t\t};\n\n\t\tconst schema1 = {\n\t\t\ttable: productsCategoriesTable('products_categories'),\n\t\t};\n\t\tconst schema2 = {\n\t\t\ttest: productsCategoriesTable('products_to_categories'),\n\t\t};\n\n\t\tconst { sqlStatements } = await diffTestSchemasPushMysql(\n\t\t\tcontext.client as Connection,\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t['public.products_categories->public.products_to_categories'],\n\t\t\t'drizzle',\n\t\t\tfalse,\n\t\t);\n\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t'RENAME TABLE `products_categories` TO `products_to_categories`;',\n\t\t\t'ALTER TABLE `products_to_categories` DROP PRIMARY KEY;',\n\t\t\t'ALTER TABLE `products_to_categories` ADD PRIMARY KEY(`product_id`,`category_id`);',\n\t\t]);\n\n\t\tawait context.client.query(`DROP TABLE \\`products_categories\\``);\n\t},\n};\n\nrun(\n\tmysqlSuite,\n\tasync (context: any) => {\n\t\tconst connectionString = process.env.MYSQL_CONNECTION_STRING ?? await createDockerDB(context);\n\n\t\tconst sleep = 1000;\n\t\tlet timeLeft = 20000;\n\t\tlet connected = false;\n\t\tlet lastError: unknown | undefined;\n\t\tdo {\n\t\t\ttry {\n\t\t\t\tcontext.client = await createConnection(connectionString);\n\t\t\t\tawait context.client.connect();\n\t\t\t\tconnected = true;\n\t\t\t\tbreak;\n\t\t\t} catch (e) {\n\t\t\t\tlastError = e;\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\t\ttimeLeft -= sleep;\n\t\t\t}\n\t\t} while (timeLeft > 0);\n\t\tif (!connected) {\n\t\t\tconsole.error('Cannot connect to MySQL');\n\t\t\tawait context.client?.end().catch(console.error);\n\t\t\tawait context.mysqlContainer?.stop().catch(console.error);\n\t\t\tthrow lastError;\n\t\t}\n\t},\n\tasync (context: any) => {\n\t\tawait context.client?.end().catch(console.error);\n\t\tawait context.mysqlContainer?.stop().catch(console.error);\n\t},\n\tasync (context: any) => {\n\t\tawait context.client?.query(`drop database if exists \\`drizzle\\`;`);\n\t\tawait context.client?.query(`create database \\`drizzle\\`;`);\n\t\tawait context.client?.query(`use \\`drizzle\\`;`);\n\t},\n);\n"
  },
  {
    "path": "drizzle-kit/tests/push/pg.test.ts",
    "content": "import { PGlite } from '@electric-sql/pglite';\nimport chalk from 'chalk';\nimport {\n\tbigint,\n\tbigserial,\n\tboolean,\n\tchar,\n\tcheck,\n\tdate,\n\tdoublePrecision,\n\tindex,\n\tinteger,\n\tinterval,\n\tjson,\n\tjsonb,\n\tnumeric,\n\tpgEnum,\n\tpgMaterializedView,\n\tpgPolicy,\n\tpgRole,\n\tpgSchema,\n\tpgSequence,\n\tpgTable,\n\tpgView,\n\tprimaryKey,\n\treal,\n\tserial,\n\tsmallint,\n\ttext,\n\ttime,\n\ttimestamp,\n\tuniqueIndex,\n\tuuid,\n\tvarchar,\n} from 'drizzle-orm/pg-core';\nimport { drizzle } from 'drizzle-orm/pglite';\nimport { eq, SQL, sql } from 'drizzle-orm/sql';\nimport { pgSuggestions } from 'src/cli/commands/pgPushUtils';\nimport { diffTestSchemas, diffTestSchemasPush } from 'tests/schemaDiffer';\nimport { expect, test } from 'vitest';\nimport { DialectSuite, run } from './common';\n\nconst pgSuite: DialectSuite = {\n\tasync allTypes() {\n\t\tconst client = new PGlite();\n\n\t\tconst customSchema = pgSchema('schemass');\n\n\t\tconst transactionStatusEnum = customSchema.enum('TransactionStatusEnum', ['PENDING', 'FAILED', 'SUCCESS']);\n\n\t\tconst enumname = pgEnum('enumname', ['three', 'two', 'one']);\n\n\t\tconst schema1 = {\n\t\t\ttest: pgEnum('test', ['ds']),\n\t\t\ttestHello: pgEnum('test_hello', ['ds']),\n\t\t\tenumname: pgEnum('enumname', ['three', 'two', 'one']),\n\n\t\t\tcustomSchema: customSchema,\n\t\t\ttransactionStatusEnum: customSchema.enum('TransactionStatusEnum', ['PENDING', 'FAILED', 'SUCCESS']),\n\n\t\t\tallSmallSerials: pgTable('schema_test', {\n\t\t\t\tcolumnAll: uuid('column_all').defaultRandom(),\n\t\t\t\tcolumn: transactionStatusEnum('column').notNull(),\n\t\t\t}),\n\n\t\t\tallSmallInts: customSchema.table(\n\t\t\t\t'schema_test2',\n\t\t\t\t{\n\t\t\t\t\tcolumnAll: smallint('column_all').default(124).notNull(),\n\t\t\t\t\tcolumn: smallint('columns').array(),\n\t\t\t\t\tcolumn1: smallint('column1').array().array(),\n\t\t\t\t\tcolumn2: smallint('column2').array().array(),\n\t\t\t\t\tcolumn3: smallint('column3').array(),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tcd: uniqueIndex('testdfds').on(t.column),\n\t\t\t\t}),\n\t\t\t),\n\n\t\t\tallEnums: customSchema.table(\n\t\t\t\t'all_enums',\n\t\t\t\t{\n\t\t\t\t\tcolumnAll: enumname('column_all').default('three').notNull(),\n\t\t\t\t\tcolumn: enumname('columns'),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\td: index('ds').on(t.column),\n\t\t\t\t}),\n\t\t\t),\n\n\t\t\tallTimestamps: customSchema.table('all_timestamps', {\n\t\t\t\tcolumnDateNow: timestamp('column_date_now', {\n\t\t\t\t\tprecision: 1,\n\t\t\t\t\twithTimezone: true,\n\t\t\t\t\tmode: 'string',\n\t\t\t\t}).defaultNow(),\n\t\t\t\tcolumnAll: timestamp('column_all', { mode: 'string' }).default('2023-03-01 12:47:29.792'),\n\t\t\t\tcolumn: timestamp('column', { mode: 'string' }).default(sql`'2023-02-28 16:18:31.18'`),\n\t\t\t\tcolumn2: timestamp('column2', { mode: 'string', precision: 3 }).default(sql`'2023-02-28 16:18:31.18'`),\n\t\t\t}),\n\n\t\t\tallUuids: customSchema.table('all_uuids', {\n\t\t\t\tcolumnAll: uuid('column_all').defaultRandom().notNull(),\n\t\t\t\tcolumn: uuid('column'),\n\t\t\t}),\n\n\t\t\tallDates: customSchema.table('all_dates', {\n\t\t\t\tcolumn_date_now: date('column_date_now').defaultNow(),\n\t\t\t\tcolumn_all: date('column_all', { mode: 'date' }).default(new Date()).notNull(),\n\t\t\t\tcolumn: date('column'),\n\t\t\t}),\n\n\t\t\tallReals: customSchema.table('all_reals', {\n\t\t\t\tcolumnAll: real('column_all').default(32).notNull(),\n\t\t\t\tcolumn: real('column'),\n\t\t\t\tcolumnPrimary: real('column_primary').primaryKey().notNull(),\n\t\t\t}),\n\n\t\t\tallBigints: pgTable('all_bigints', {\n\t\t\t\tcolumnAll: bigint('column_all', { mode: 'number' }).default(124).notNull(),\n\t\t\t\tcolumn: bigint('column', { mode: 'number' }),\n\t\t\t}),\n\n\t\t\tallBigserials: customSchema.table('all_bigserials', {\n\t\t\t\tcolumnAll: bigserial('column_all', { mode: 'bigint' }).notNull(),\n\t\t\t\tcolumn: bigserial('column', { mode: 'bigint' }).notNull(),\n\t\t\t}),\n\n\t\t\tallIntervals: customSchema.table('all_intervals', {\n\t\t\t\tcolumnAllConstrains: interval('column_all_constrains', {\n\t\t\t\t\tfields: 'month',\n\t\t\t\t})\n\t\t\t\t\t.default('1 mon')\n\t\t\t\t\t.notNull(),\n\t\t\t\tcolumnMinToSec: interval('column_min_to_sec', {\n\t\t\t\t\tfields: 'minute to second',\n\t\t\t\t}),\n\t\t\t\tcolumnWithoutFields: interval('column_without_fields').default('00:00:01').notNull(),\n\t\t\t\tcolumn: interval('column'),\n\t\t\t\tcolumn5: interval('column5', {\n\t\t\t\t\tfields: 'minute to second',\n\t\t\t\t\tprecision: 3,\n\t\t\t\t}),\n\t\t\t\tcolumn6: interval('column6'),\n\t\t\t}),\n\n\t\t\tallSerials: customSchema.table('all_serials', {\n\t\t\t\tcolumnAll: serial('column_all').notNull(),\n\t\t\t\tcolumn: serial('column').notNull(),\n\t\t\t}),\n\n\t\t\tallTexts: customSchema.table(\n\t\t\t\t'all_texts',\n\t\t\t\t{\n\t\t\t\t\tcolumnAll: text('column_all').default('text').notNull(),\n\t\t\t\t\tcolumn: text('columns').primaryKey(),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tcd: index('test').on(t.column),\n\t\t\t\t}),\n\t\t\t),\n\n\t\t\tallBools: customSchema.table('all_bools', {\n\t\t\t\tcolumnAll: boolean('column_all').default(true).notNull(),\n\t\t\t\tcolumn: boolean('column'),\n\t\t\t}),\n\n\t\t\tallVarchars: customSchema.table('all_varchars', {\n\t\t\t\tcolumnAll: varchar('column_all').default('text').notNull(),\n\t\t\t\tcolumn: varchar('column', { length: 200 }),\n\t\t\t}),\n\n\t\t\tallTimes: customSchema.table('all_times', {\n\t\t\t\tcolumnDateNow: time('column_date_now').defaultNow(),\n\t\t\t\tcolumnAll: time('column_all').default('22:12:12').notNull(),\n\t\t\t\tcolumn: time('column'),\n\t\t\t}),\n\n\t\t\tallChars: customSchema.table('all_chars', {\n\t\t\t\tcolumnAll: char('column_all', { length: 1 }).default('text').notNull(),\n\t\t\t\tcolumn: char('column', { length: 1 }),\n\t\t\t}),\n\n\t\t\tallDoublePrecision: customSchema.table('all_double_precision', {\n\t\t\t\tcolumnAll: doublePrecision('column_all').default(33.2).notNull(),\n\t\t\t\tcolumn: doublePrecision('column'),\n\t\t\t}),\n\n\t\t\tallJsonb: customSchema.table('all_jsonb', {\n\t\t\t\tcolumnDefaultObject: jsonb('column_default_object').default({ hello: 'world world' }).notNull(),\n\t\t\t\tcolumnDefaultArray: jsonb('column_default_array').default({\n\t\t\t\t\thello: { 'world world': ['foo', 'bar'] },\n\t\t\t\t}),\n\t\t\t\tcolumn: jsonb('column'),\n\t\t\t}),\n\n\t\t\tallJson: customSchema.table('all_json', {\n\t\t\t\tcolumnDefaultObject: json('column_default_object').default({ hello: 'world world' }).notNull(),\n\t\t\t\tcolumnDefaultArray: json('column_default_array').default({\n\t\t\t\t\thello: { 'world world': ['foo', 'bar'] },\n\t\t\t\t\tfoo: 'bar',\n\t\t\t\t\tfe: 23,\n\t\t\t\t}),\n\t\t\t\tcolumn: json('column'),\n\t\t\t}),\n\n\t\t\tallIntegers: customSchema.table('all_integers', {\n\t\t\t\tcolumnAll: integer('column_all').primaryKey(),\n\t\t\t\tcolumn: integer('column'),\n\t\t\t\tcolumnPrimary: integer('column_primary'),\n\t\t\t}),\n\n\t\t\tallNumerics: customSchema.table('all_numerics', {\n\t\t\t\tcolumnAll: numeric('column_all', { precision: 1, scale: 1 }).default('32').notNull(),\n\t\t\t\tcolumn: numeric('column'),\n\t\t\t\tcolumnPrimary: numeric('column_primary').primaryKey().notNull(),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema1, [], false, [\n\t\t\t'public',\n\t\t\t'schemass',\n\t\t]);\n\t\texpect(statements.length).toBe(0);\n\t},\n\n\tasync addBasicIndexes() {\n\t\tconst client = new PGlite();\n\n\t\tconst schema1 = {\n\t\t\tusers: pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t}),\n\t\t};\n\n\t\tconst schema2 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'users',\n\t\t\t\t{\n\t\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\t\tname: text('name'),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tindx: index()\n\t\t\t\t\t\t.on(t.name.desc(), t.id.asc().nullsLast())\n\t\t\t\t\t\t.with({ fillfactor: 70 })\n\t\t\t\t\t\t.where(sql`select 1`),\n\t\t\t\t\tindx1: index('indx1')\n\t\t\t\t\t\t.using('hash', t.name.desc(), sql`${t.name}`)\n\t\t\t\t\t\t.with({ fillfactor: 70 }),\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\t\texpect(statements.length).toBe(2);\n\t\texpect(statements[0]).toStrictEqual({\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_index_pg',\n\t\t\tdata: {\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tasc: false,\n\t\t\t\t\t\texpression: 'name',\n\t\t\t\t\t\tisExpression: false,\n\t\t\t\t\t\tnulls: 'last',\n\t\t\t\t\t\topclass: undefined,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tasc: true,\n\t\t\t\t\t\texpression: 'id',\n\t\t\t\t\t\tisExpression: false,\n\t\t\t\t\t\tnulls: 'last',\n\t\t\t\t\t\topclass: undefined,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tconcurrently: false,\n\t\t\t\tisUnique: false,\n\t\t\t\tmethod: 'btree',\n\t\t\t\tname: 'users_name_id_index',\n\t\t\t\twhere: 'select 1',\n\t\t\t\twith: {\n\t\t\t\t\tfillfactor: 70,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t\texpect(statements[1]).toStrictEqual({\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_index_pg',\n\t\t\tdata: {\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tasc: false,\n\t\t\t\t\t\texpression: 'name',\n\t\t\t\t\t\tisExpression: false,\n\t\t\t\t\t\tnulls: 'last',\n\t\t\t\t\t\topclass: undefined,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tasc: true,\n\t\t\t\t\t\texpression: '\"name\"',\n\t\t\t\t\t\tisExpression: true,\n\t\t\t\t\t\tnulls: 'last',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tconcurrently: false,\n\t\t\t\tisUnique: false,\n\t\t\t\tmethod: 'hash',\n\t\t\t\tname: 'indx1',\n\t\t\t\twhere: undefined,\n\t\t\t\twith: {\n\t\t\t\t\tfillfactor: 70,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t\texpect(sqlStatements.length).toBe(2);\n\t\texpect(sqlStatements[0]).toBe(\n\t\t\t`CREATE INDEX \"users_name_id_index\" ON \"users\" USING btree (\"name\" DESC NULLS LAST,\"id\") WITH (fillfactor=70) WHERE select 1;`,\n\t\t);\n\t\texpect(sqlStatements[1]).toBe(\n\t\t\t`CREATE INDEX \"indx1\" ON \"users\" USING hash (\"name\" DESC NULLS LAST,\"name\") WITH (fillfactor=70);`,\n\t\t);\n\t},\n\n\tasync addGeneratedColumn() {\n\t\tconst client = new PGlite();\n\n\t\tconst schema1 = {\n\t\t\tusers: pgTable('users', {\n\t\t\t\tid: integer('id'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t}),\n\t\t};\n\t\tconst schema2 = {\n\t\t\tusers: pgTable('users', {\n\t\t\t\tid: integer('id'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs((): SQL => sql`${schema2.users.name}`),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\t\texpect(statements).toStrictEqual([\n\t\t\t{\n\t\t\t\tcolumn: {\n\t\t\t\t\tgenerated: {\n\t\t\t\t\t\tas: '\"users\".\"name\"',\n\t\t\t\t\t\ttype: 'stored',\n\t\t\t\t\t},\n\t\t\t\t\tname: 'gen_name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t\tschema: '',\n\t\t\t\ttableName: 'users',\n\t\t\t\ttype: 'alter_table_add_column',\n\t\t\t},\n\t\t]);\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t'ALTER TABLE \"users\" ADD COLUMN \"gen_name\" text GENERATED ALWAYS AS (\"users\".\"name\") STORED;',\n\t\t]);\n\n\t\t// for (const st of sqlStatements) {\n\t\t//   await client.query(st);\n\t\t// }\n\t},\n\n\tasync addGeneratedToColumn() {\n\t\tconst client = new PGlite();\n\n\t\tconst schema1 = {\n\t\t\tusers: pgTable('users', {\n\t\t\t\tid: integer('id'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name'),\n\t\t\t}),\n\t\t};\n\t\tconst schema2 = {\n\t\t\tusers: pgTable('users', {\n\t\t\t\tid: integer('id'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs((): SQL => sql`${schema2.users.name}`),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\t\texpect(statements).toStrictEqual([\n\t\t\t{\n\t\t\t\tcolumnAutoIncrement: undefined,\n\t\t\t\tcolumnDefault: undefined,\n\t\t\t\tcolumnGenerated: {\n\t\t\t\t\tas: '\"users\".\"name\"',\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tcolumnName: 'gen_name',\n\t\t\t\tcolumnNotNull: false,\n\t\t\t\tcolumnOnUpdate: undefined,\n\t\t\t\tcolumnPk: false,\n\t\t\t\tnewDataType: 'text',\n\t\t\t\tschema: '',\n\t\t\t\ttableName: 'users',\n\t\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t\t},\n\t\t]);\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t'ALTER TABLE \"users\" drop column \"gen_name\";',\n\t\t\t'ALTER TABLE \"users\" ADD COLUMN \"gen_name\" text GENERATED ALWAYS AS (\"users\".\"name\") STORED;',\n\t\t]);\n\n\t\t// for (const st of sqlStatements) {\n\t\t//   await client.query(st);\n\t\t// }\n\t},\n\n\tasync dropGeneratedConstraint() {\n\t\tconst client = new PGlite();\n\n\t\tconst schema1 = {\n\t\t\tusers: pgTable('users', {\n\t\t\t\tid: integer('id'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs((): SQL => sql`${schema1.users.name}`),\n\t\t\t}),\n\t\t};\n\t\tconst schema2 = {\n\t\t\tusers: pgTable('users', {\n\t\t\t\tid: integer('id'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name'),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\t\texpect(statements).toStrictEqual([\n\t\t\t{\n\t\t\t\tcolumnAutoIncrement: undefined,\n\t\t\t\tcolumnDefault: undefined,\n\t\t\t\tcolumnGenerated: undefined,\n\t\t\t\tcolumnName: 'gen_name',\n\t\t\t\tcolumnNotNull: false,\n\t\t\t\tcolumnOnUpdate: undefined,\n\t\t\t\tcolumnPk: false,\n\t\t\t\tnewDataType: 'text',\n\t\t\t\tschema: '',\n\t\t\t\ttableName: 'users',\n\t\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t\t},\n\t\t]);\n\t\texpect(sqlStatements).toStrictEqual(['ALTER TABLE \"users\" ALTER COLUMN \"gen_name\" DROP EXPRESSION;']);\n\t},\n\n\tasync alterGeneratedConstraint() {\n\t\tconst client = new PGlite();\n\n\t\tconst schema1 = {\n\t\t\tusers: pgTable('users', {\n\t\t\t\tid: integer('id'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs((): SQL => sql`${schema1.users.name}`),\n\t\t\t}),\n\t\t};\n\t\tconst schema2 = {\n\t\t\tusers: pgTable('users', {\n\t\t\t\tid: integer('id'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs((): SQL => sql`${schema2.users.name} || 'hello'`),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\t\texpect(statements).toStrictEqual([]);\n\t\texpect(sqlStatements).toStrictEqual([]);\n\t},\n\n\tasync createTableWithGeneratedConstraint() {\n\t\tconst client = new PGlite();\n\n\t\tconst schema1 = {};\n\t\tconst schema2 = {\n\t\t\tusers: pgTable('users', {\n\t\t\t\tid: integer('id'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t\tname: text('name'),\n\t\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs((): SQL => sql`${schema2.users.name} || 'hello'`),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\t\texpect(statements).toStrictEqual([\n\t\t\t{\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'id2',\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'name',\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tgenerated: {\n\t\t\t\t\t\t\tas: '\"users\".\"name\" || \\'hello\\'',\n\t\t\t\t\t\t\ttype: 'stored',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tname: 'gen_name',\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcompositePKs: [],\n\t\t\t\tcompositePkName: '',\n\t\t\t\tisRLSEnabled: false,\n\t\t\t\tschema: '',\n\t\t\t\ttableName: 'users',\n\t\t\t\tpolicies: [],\n\t\t\t\ttype: 'create_table',\n\t\t\t\tuniqueConstraints: [],\n\t\t\t\tcheckConstraints: [],\n\t\t\t},\n\t\t]);\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t'CREATE TABLE \"users\" (\\n\\t\"id\" integer,\\n\\t\"id2\" integer,\\n\\t\"name\" text,\\n\\t\"gen_name\" text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') STORED\\n);\\n',\n\t\t]);\n\t},\n\n\tasync addBasicSequences() {\n\t\tconst client = new PGlite();\n\n\t\tconst schema1 = {\n\t\t\tseq: pgSequence('my_seq', { startWith: 100 }),\n\t\t};\n\n\t\tconst schema2 = {\n\t\t\tseq: pgSequence('my_seq', { startWith: 100 }),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\t\texpect(statements.length).toBe(0);\n\t},\n\n\tasync changeIndexFields() {\n\t\tconst client = new PGlite();\n\n\t\tconst schema1 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'users',\n\t\t\t\t{\n\t\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\t\tname: text('name'),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tremoveColumn: index('removeColumn').on(t.name, t.id),\n\t\t\t\t\taddColumn: index('addColumn').on(t.name.desc()).with({ fillfactor: 70 }),\n\t\t\t\t\tremoveExpression: index('removeExpression')\n\t\t\t\t\t\t.on(t.name.desc(), sql`name`)\n\t\t\t\t\t\t.concurrently(),\n\t\t\t\t\taddExpression: index('addExpression').on(t.id.desc()),\n\t\t\t\t\tchangeExpression: index('changeExpression').on(t.id.desc(), sql`name`),\n\t\t\t\t\tchangeName: index('changeName').on(t.name.desc(), t.id.asc().nullsLast()).with({ fillfactor: 70 }),\n\t\t\t\t\tchangeWith: index('changeWith').on(t.name).with({ fillfactor: 70 }),\n\t\t\t\t\tchangeUsing: index('changeUsing').on(t.name),\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\n\t\tconst schema2 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'users',\n\t\t\t\t{\n\t\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\t\tname: text('name'),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tremoveColumn: index('removeColumn').on(t.name),\n\t\t\t\t\taddColumn: index('addColumn').on(t.name.desc(), t.id.nullsLast()).with({ fillfactor: 70 }),\n\t\t\t\t\tremoveExpression: index('removeExpression').on(t.name.desc()).concurrently(),\n\t\t\t\t\taddExpression: index('addExpression').on(t.id.desc()),\n\t\t\t\t\tchangeExpression: index('changeExpression').on(t.id.desc(), sql`name desc`),\n\t\t\t\t\tchangeName: index('newName')\n\t\t\t\t\t\t.on(t.name.desc(), sql`name`)\n\t\t\t\t\t\t.with({ fillfactor: 70 }),\n\t\t\t\t\tchangeWith: index('changeWith').on(t.name).with({ fillfactor: 90 }),\n\t\t\t\t\tchangeUsing: index('changeUsing').using('hash', t.name),\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t'DROP INDEX \"changeName\";',\n\t\t\t'DROP INDEX \"addColumn\";',\n\t\t\t'DROP INDEX \"changeExpression\";',\n\t\t\t'DROP INDEX \"changeUsing\";',\n\t\t\t'DROP INDEX \"changeWith\";',\n\t\t\t'DROP INDEX \"removeColumn\";',\n\t\t\t'DROP INDEX \"removeExpression\";',\n\t\t\t'CREATE INDEX \"newName\" ON \"users\" USING btree (\"name\" DESC NULLS LAST,name) WITH (fillfactor=70);',\n\t\t\t'CREATE INDEX \"addColumn\" ON \"users\" USING btree (\"name\" DESC NULLS LAST,\"id\") WITH (fillfactor=70);',\n\t\t\t'CREATE INDEX \"changeExpression\" ON \"users\" USING btree (\"id\" DESC NULLS LAST,name desc);',\n\t\t\t'CREATE INDEX \"changeUsing\" ON \"users\" USING hash (\"name\");',\n\t\t\t'CREATE INDEX \"changeWith\" ON \"users\" USING btree (\"name\") WITH (fillfactor=90);',\n\t\t\t'CREATE INDEX \"removeColumn\" ON \"users\" USING btree (\"name\");',\n\t\t\t'CREATE INDEX CONCURRENTLY \"removeExpression\" ON \"users\" USING btree (\"name\" DESC NULLS LAST);',\n\t\t]);\n\t},\n\n\tasync dropIndex() {\n\t\tconst client = new PGlite();\n\n\t\tconst schema1 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'users',\n\t\t\t\t{\n\t\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\t\tname: text('name'),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tindx: index().on(t.name.desc(), t.id.asc().nullsLast()).with({ fillfactor: 70 }),\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\n\t\tconst schema2 = {\n\t\t\tusers: pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\t\texpect(statements.length).toBe(1);\n\t\texpect(statements[0]).toStrictEqual({\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_index',\n\t\t\tdata: 'users_name_id_index;name--false--last,,id--true--last;false;btree;{\"fillfactor\":\"70\"}',\n\t\t});\n\n\t\texpect(sqlStatements.length).toBe(1);\n\t\texpect(sqlStatements[0]).toBe(`DROP INDEX \"users_name_id_index\";`);\n\t},\n\n\tasync indexesToBeNotTriggered() {\n\t\tconst client = new PGlite();\n\n\t\tconst schema1 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'users',\n\t\t\t\t{\n\t\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\t\tname: text('name'),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tindx: index('indx').on(t.name.desc()).concurrently(),\n\t\t\t\t\tindx1: index('indx1')\n\t\t\t\t\t\t.on(t.name.desc())\n\t\t\t\t\t\t.where(sql`true`),\n\t\t\t\t\tindx2: index('indx2')\n\t\t\t\t\t\t.on(t.name.op('text_ops'))\n\t\t\t\t\t\t.where(sql`true`),\n\t\t\t\t\tindx3: index('indx3')\n\t\t\t\t\t\t.on(sql`lower(name)`)\n\t\t\t\t\t\t.where(sql`true`),\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\n\t\tconst schema2 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'users',\n\t\t\t\t{\n\t\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\t\tname: text('name'),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tindx: index('indx').on(t.name.desc()),\n\t\t\t\t\tindx1: index('indx1')\n\t\t\t\t\t\t.on(t.name.desc())\n\t\t\t\t\t\t.where(sql`false`),\n\t\t\t\t\tindx2: index('indx2')\n\t\t\t\t\t\t.on(t.name.op('test'))\n\t\t\t\t\t\t.where(sql`true`),\n\t\t\t\t\tindx3: index('indx3')\n\t\t\t\t\t\t.on(sql`lower(id)`)\n\t\t\t\t\t\t.where(sql`true`),\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\t\texpect(statements.length).toBe(0);\n\t},\n\n\tasync indexesTestCase1() {\n\t\tconst client = new PGlite();\n\n\t\tconst schema1 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'users',\n\t\t\t\t{\n\t\t\t\t\tid: uuid('id').defaultRandom().primaryKey(),\n\t\t\t\t\tname: text('name').notNull(),\n\t\t\t\t\tdescription: text('description'),\n\t\t\t\t\timageUrl: text('image_url'),\n\t\t\t\t\tinStock: boolean('in_stock').default(true),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tindx: index().on(t.id.desc().nullsFirst()),\n\t\t\t\t\tindx1: index('indx1').on(t.id, t.imageUrl),\n\t\t\t\t\tindx2: index('indx4').on(t.id),\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\n\t\tconst schema2 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'users',\n\t\t\t\t{\n\t\t\t\t\tid: uuid('id').defaultRandom().primaryKey(),\n\t\t\t\t\tname: text('name').notNull(),\n\t\t\t\t\tdescription: text('description'),\n\t\t\t\t\timageUrl: text('image_url'),\n\t\t\t\t\tinStock: boolean('in_stock').default(true),\n\t\t\t\t},\n\t\t\t\t(t) => ({\n\t\t\t\t\tindx: index().on(t.id.desc().nullsFirst()),\n\t\t\t\t\tindx1: index('indx1').on(t.id, t.imageUrl),\n\t\t\t\t\tindx2: index('indx4').on(t.id),\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\t\texpect(statements.length).toBe(0);\n\t},\n\n\tasync addNotNull() {\n\t\tconst client = new PGlite();\n\n\t\tconst schema1 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'User',\n\t\t\t\t{\n\t\t\t\t\tid: text('id').primaryKey().notNull(),\n\t\t\t\t\tname: text('name'),\n\t\t\t\t\tusername: text('username'),\n\t\t\t\t\tgh_username: text('gh_username'),\n\t\t\t\t\temail: text('email'),\n\t\t\t\t\temailVerified: timestamp('emailVerified', {\n\t\t\t\t\t\tprecision: 3,\n\t\t\t\t\t\tmode: 'date',\n\t\t\t\t\t}),\n\t\t\t\t\timage: text('image'),\n\t\t\t\t\tcreatedAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n\t\t\t\t\t\t.default(sql`CURRENT_TIMESTAMP`)\n\t\t\t\t\t\t.notNull(),\n\t\t\t\t\tupdatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n\t\t\t\t\t\t.notNull()\n\t\t\t\t\t\t.$onUpdate(() => new Date()),\n\t\t\t\t},\n\t\t\t\t(table) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\temailKey: uniqueIndex('User_email_key').on(table.email),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t),\n\t\t};\n\n\t\tconst schema2 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'User',\n\t\t\t\t{\n\t\t\t\t\tid: text('id').primaryKey().notNull(),\n\t\t\t\t\tname: text('name'),\n\t\t\t\t\tusername: text('username'),\n\t\t\t\t\tgh_username: text('gh_username'),\n\t\t\t\t\temail: text('email').notNull(),\n\t\t\t\t\temailVerified: timestamp('emailVerified', {\n\t\t\t\t\t\tprecision: 3,\n\t\t\t\t\t\tmode: 'date',\n\t\t\t\t\t}),\n\t\t\t\t\timage: text('image'),\n\t\t\t\t\tcreatedAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n\t\t\t\t\t\t.default(sql`CURRENT_TIMESTAMP`)\n\t\t\t\t\t\t.notNull(),\n\t\t\t\t\tupdatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n\t\t\t\t\t\t.notNull()\n\t\t\t\t\t\t.$onUpdate(() => new Date()),\n\t\t\t\t},\n\t\t\t\t(table) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\temailKey: uniqueIndex('User_email_key').on(table.email),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\t\tconst query = async (sql: string, params?: any[]) => {\n\t\t\tconst result = await client.query(sql, params ?? []);\n\t\t\treturn result.rows as any[];\n\t\t};\n\n\t\tconst { statementsToExecute } = await pgSuggestions({ query }, statements);\n\n\t\texpect(statementsToExecute).toStrictEqual(['ALTER TABLE \"User\" ALTER COLUMN \"email\" SET NOT NULL;']);\n\t},\n\n\tasync addNotNullWithDataNoRollback() {\n\t\tconst client = new PGlite();\n\t\tconst db = drizzle(client);\n\n\t\tconst schema1 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'User',\n\t\t\t\t{\n\t\t\t\t\tid: text('id').primaryKey().notNull(),\n\t\t\t\t\tname: text('name'),\n\t\t\t\t\tusername: text('username'),\n\t\t\t\t\tgh_username: text('gh_username'),\n\t\t\t\t\temail: text('email'),\n\t\t\t\t\temailVerified: timestamp('emailVerified', {\n\t\t\t\t\t\tprecision: 3,\n\t\t\t\t\t\tmode: 'date',\n\t\t\t\t\t}),\n\t\t\t\t\timage: text('image'),\n\t\t\t\t\tcreatedAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n\t\t\t\t\t\t.default(sql`CURRENT_TIMESTAMP`)\n\t\t\t\t\t\t.notNull(),\n\t\t\t\t\tupdatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n\t\t\t\t\t\t.notNull()\n\t\t\t\t\t\t.$onUpdate(() => new Date()),\n\t\t\t\t},\n\t\t\t\t(table) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\temailKey: uniqueIndex('User_email_key').on(table.email),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t),\n\t\t};\n\n\t\tconst schema2 = {\n\t\t\tusers: pgTable(\n\t\t\t\t'User',\n\t\t\t\t{\n\t\t\t\t\tid: text('id').primaryKey().notNull(),\n\t\t\t\t\tname: text('name'),\n\t\t\t\t\tusername: text('username'),\n\t\t\t\t\tgh_username: text('gh_username'),\n\t\t\t\t\temail: text('email').notNull(),\n\t\t\t\t\temailVerified: timestamp('emailVerified', {\n\t\t\t\t\t\tprecision: 3,\n\t\t\t\t\t\tmode: 'date',\n\t\t\t\t\t}),\n\t\t\t\t\timage: text('image'),\n\t\t\t\t\tcreatedAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n\t\t\t\t\t\t.default(sql`CURRENT_TIMESTAMP`)\n\t\t\t\t\t\t.notNull(),\n\t\t\t\t\tupdatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n\t\t\t\t\t\t.notNull()\n\t\t\t\t\t\t.$onUpdate(() => new Date()),\n\t\t\t\t},\n\t\t\t\t(table) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\temailKey: uniqueIndex('User_email_key').on(table.email),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\t\tconst query = async (sql: string, params?: any[]) => {\n\t\t\tconst result = await client.query(sql, params ?? []);\n\t\t\treturn result.rows as any[];\n\t\t};\n\n\t\tawait db.insert(schema1.users).values({ id: 'str', email: 'email@gmail' });\n\n\t\tconst { statementsToExecute, shouldAskForApprove } = await pgSuggestions({ query }, statements);\n\n\t\texpect(statementsToExecute).toStrictEqual(['ALTER TABLE \"User\" ALTER COLUMN \"email\" SET NOT NULL;']);\n\n\t\texpect(shouldAskForApprove).toBeFalsy();\n\t},\n\n\tasync createCompositePrimaryKey() {\n\t\tconst client = new PGlite();\n\n\t\tconst schema1 = {};\n\n\t\tconst schema2 = {\n\t\t\ttable: pgTable('table', {\n\t\t\t\tcol1: integer('col1').notNull(),\n\t\t\t\tcol2: integer('col2').notNull(),\n\t\t\t}, (t) => ({\n\t\t\t\tpk: primaryKey({\n\t\t\t\t\tcolumns: [t.col1, t.col2],\n\t\t\t\t}),\n\t\t\t})),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\t\tclient,\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t[],\n\t\t\tfalse,\n\t\t\t['public'],\n\t\t);\n\n\t\texpect(statements).toStrictEqual([\n\t\t\t{\n\t\t\t\ttype: 'create_table',\n\t\t\t\ttableName: 'table',\n\t\t\t\tschema: '',\n\t\t\t\tcompositePKs: ['col1,col2;table_col1_col2_pk'],\n\t\t\t\tcompositePkName: 'table_col1_col2_pk',\n\t\t\t\tisRLSEnabled: false,\n\t\t\t\tpolicies: [],\n\t\t\t\tuniqueConstraints: [],\n\t\t\t\tcheckConstraints: [],\n\t\t\t\tcolumns: [\n\t\t\t\t\t{ name: 'col1', type: 'integer', primaryKey: false, notNull: true },\n\t\t\t\t\t{ name: 'col2', type: 'integer', primaryKey: false, notNull: true },\n\t\t\t\t],\n\t\t\t},\n\t\t]);\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t'CREATE TABLE \"table\" (\\n\\t\"col1\" integer NOT NULL,\\n\\t\"col2\" integer NOT NULL,\\n\\tCONSTRAINT \"table_col1_col2_pk\" PRIMARY KEY(\"col1\",\"col2\")\\n);\\n',\n\t\t]);\n\t},\n\n\tasync renameTableWithCompositePrimaryKey() {\n\t\tconst client = new PGlite();\n\n\t\tconst productsCategoriesTable = (tableName: string) => {\n\t\t\treturn pgTable(tableName, {\n\t\t\t\tproductId: text('product_id').notNull(),\n\t\t\t\tcategoryId: text('category_id').notNull(),\n\t\t\t}, (t) => ({\n\t\t\t\tpk: primaryKey({\n\t\t\t\t\tcolumns: [t.productId, t.categoryId],\n\t\t\t\t}),\n\t\t\t}));\n\t\t};\n\n\t\tconst schema1 = {\n\t\t\ttable: productsCategoriesTable('products_categories'),\n\t\t};\n\t\tconst schema2 = {\n\t\t\ttest: productsCategoriesTable('products_to_categories'),\n\t\t};\n\n\t\tconst { sqlStatements } = await diffTestSchemasPush(\n\t\t\tclient,\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t['public.products_categories->public.products_to_categories'],\n\t\t\tfalse,\n\t\t\t['public'],\n\t\t);\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t'ALTER TABLE \"products_categories\" RENAME TO \"products_to_categories\";',\n\t\t\t'ALTER TABLE \"products_to_categories\" DROP CONSTRAINT \"products_categories_product_id_category_id_pk\";',\n\t\t\t'ALTER TABLE \"products_to_categories\" ADD CONSTRAINT \"products_to_categories_product_id_category_id_pk\" PRIMARY KEY(\"product_id\",\"category_id\");',\n\t\t]);\n\t},\n\n\t// async addVectorIndexes() {\n\t//   const client = new PGlite();\n\n\t//   const schema1 = {\n\t//     users: pgTable(\"users\", {\n\t//       id: serial(\"id\").primaryKey(),\n\t//       name: vector(\"name\", { dimensions: 3 }),\n\t//     }),\n\t//   };\n\n\t//   const schema2 = {\n\t//     users: pgTable(\n\t//       \"users\",\n\t//       {\n\t//         id: serial(\"id\").primaryKey(),\n\t//         embedding: vector(\"name\", { dimensions: 3 }),\n\t//       },\n\t//       (t) => ({\n\t//         indx2: index(\"vector_embedding_idx\")\n\t//           .using(\"hnsw\", t.embedding.op(\"vector_ip_ops\"))\n\t//           .with({ m: 16, ef_construction: 64 }),\n\t//       })\n\t//     ),\n\t//   };\n\n\t//   const { statements, sqlStatements } = await diffTestSchemasPush(\n\t//     client,\n\t//     schema1,\n\t//     schema2,\n\t//     [],\n\t//     false,\n\t//     [\"public\"]\n\t//   );\n\t//   expect(statements.length).toBe(1);\n\t//   expect(statements[0]).toStrictEqual({\n\t//     schema: \"\",\n\t//     tableName: \"users\",\n\t//     type: \"create_index\",\n\t//     data: 'vector_embedding_idx;name,true,last,vector_ip_ops;false;false;hnsw;undefined;{\"m\":16,\"ef_construction\":64}',\n\t//   });\n\t//   expect(sqlStatements.length).toBe(1);\n\t//   expect(sqlStatements[0]).toBe(\n\t//     `CREATE INDEX IF NOT EXISTS \"vector_embedding_idx\" ON \"users\" USING hnsw (name vector_ip_ops) WITH (m=16,ef_construction=64);`\n\t//   );\n\t// },\n\tasync case1() {\n\t\t// TODO: implement if needed\n\t\texpect(true).toBe(true);\n\t},\n};\n\nrun(pgSuite);\n\ntest('full sequence: no changes', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tseq: pgSequence('my_seq', {\n\t\t\tstartWith: 100,\n\t\t\tmaxValue: 10000,\n\t\t\tminValue: 100,\n\t\t\tcycle: true,\n\t\t\tcache: 10,\n\t\t\tincrement: 2,\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tseq: pgSequence('my_seq', {\n\t\t\tstartWith: 100,\n\t\t\tmaxValue: 10000,\n\t\t\tminValue: 100,\n\t\t\tcycle: true,\n\t\t\tcache: 10,\n\t\t\tincrement: 2,\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('basic sequence: change fields', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tseq: pgSequence('my_seq', {\n\t\t\tstartWith: 100,\n\t\t\tmaxValue: 10000,\n\t\t\tminValue: 100,\n\t\t\tcycle: true,\n\t\t\tcache: 10,\n\t\t\tincrement: 2,\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tseq: pgSequence('my_seq', {\n\t\t\tstartWith: 100,\n\t\t\tmaxValue: 100000,\n\t\t\tminValue: 100,\n\t\t\tcycle: true,\n\t\t\tcache: 10,\n\t\t\tincrement: 4,\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'alter_sequence',\n\t\t\tschema: 'public',\n\t\t\tname: 'my_seq',\n\t\t\tvalues: {\n\t\t\t\tminValue: '100',\n\t\t\t\tmaxValue: '100000',\n\t\t\t\tincrement: '4',\n\t\t\t\tstartWith: '100',\n\t\t\t\tcache: '10',\n\t\t\t\tcycle: true,\n\t\t\t},\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER SEQUENCE \"public\".\"my_seq\" INCREMENT BY 4 MINVALUE 100 MAXVALUE 100000 START WITH 100 CACHE 10 CYCLE;',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('basic sequence: change name', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tseq: pgSequence('my_seq', {\n\t\t\tstartWith: 100,\n\t\t\tmaxValue: 10000,\n\t\t\tminValue: 100,\n\t\t\tcycle: true,\n\t\t\tcache: 10,\n\t\t\tincrement: 2,\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tseq: pgSequence('my_seq2', {\n\t\t\tstartWith: 100,\n\t\t\tmaxValue: 10000,\n\t\t\tminValue: 100,\n\t\t\tcycle: true,\n\t\t\tcache: 10,\n\t\t\tincrement: 2,\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t['public.my_seq->public.my_seq2'],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnameFrom: 'my_seq',\n\t\t\tnameTo: 'my_seq2',\n\t\t\tschema: 'public',\n\t\t\ttype: 'rename_sequence',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual(['ALTER SEQUENCE \"public\".\"my_seq\" RENAME TO \"my_seq2\";']);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('basic sequence: change name and fields', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tseq: pgSequence('my_seq', {\n\t\t\tstartWith: 100,\n\t\t\tmaxValue: 10000,\n\t\t\tminValue: 100,\n\t\t\tcycle: true,\n\t\t\tcache: 10,\n\t\t\tincrement: 2,\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tseq: pgSequence('my_seq2', {\n\t\t\tstartWith: 100,\n\t\t\tmaxValue: 10000,\n\t\t\tminValue: 100,\n\t\t\tcycle: true,\n\t\t\tcache: 10,\n\t\t\tincrement: 4,\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t['public.my_seq->public.my_seq2'],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnameFrom: 'my_seq',\n\t\t\tnameTo: 'my_seq2',\n\t\t\tschema: 'public',\n\t\t\ttype: 'rename_sequence',\n\t\t},\n\t\t{\n\t\t\tname: 'my_seq2',\n\t\t\tschema: 'public',\n\t\t\ttype: 'alter_sequence',\n\t\t\tvalues: {\n\t\t\t\tcache: '10',\n\t\t\t\tcycle: true,\n\t\t\t\tincrement: '4',\n\t\t\t\tmaxValue: '10000',\n\t\t\t\tminValue: '100',\n\t\t\t\tstartWith: '100',\n\t\t\t},\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER SEQUENCE \"public\".\"my_seq\" RENAME TO \"my_seq2\";',\n\t\t'ALTER SEQUENCE \"public\".\"my_seq2\" INCREMENT BY 4 MINVALUE 100 MAXVALUE 10000 START WITH 100 CACHE 10 CYCLE;',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\n// identity push tests\ntest('create table: identity always/by default - no params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\t\tid1: bigint('id1', { mode: 'number' }).generatedByDefaultAsIdentity(),\n\t\t\tid2: smallint('id2').generatedByDefaultAsIdentity(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tidentity: 'users_id_seq;byDefault;1;2147483647;1;1;1;false',\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tidentity: 'users_id1_seq;byDefault;1;9223372036854775807;1;1;1;false',\n\t\t\t\t\tname: 'id1',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'bigint',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tidentity: 'users_id2_seq;byDefault;1;32767;1;1;1;false',\n\t\t\t\t\tname: 'id2',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'smallint',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tcompositePkName: '',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\tpolicies: [],\n\t\t\ttype: 'create_table',\n\t\t\tuniqueConstraints: [],\n\t\t\tisRLSEnabled: false,\n\t\t\tcheckConstraints: [],\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE \"users\" (\\n\\t\"id\" integer GENERATED BY DEFAULT AS IDENTITY (sequence name \"users_id_seq\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),\\n\\t\"id1\" bigint GENERATED BY DEFAULT AS IDENTITY (sequence name \"users_id1_seq\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 1 CACHE 1),\\n\\t\"id2\" smallint GENERATED BY DEFAULT AS IDENTITY (sequence name \"users_id2_seq\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 32767 START WITH 1 CACHE 1)\\n);\\n',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('create table: identity always/by default - few params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({ increment: 4 }),\n\t\t\tid1: bigint('id1', { mode: 'number' }).generatedByDefaultAsIdentity({\n\t\t\t\tstartWith: 120,\n\t\t\t\tmaxValue: 17000,\n\t\t\t}),\n\t\t\tid2: smallint('id2').generatedByDefaultAsIdentity({ cycle: true }),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tidentity: 'users_id_seq;byDefault;1;2147483647;4;1;1;false',\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tidentity: 'users_id1_seq;byDefault;1;17000;1;120;1;false',\n\t\t\t\t\tname: 'id1',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'bigint',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tidentity: 'users_id2_seq;byDefault;1;32767;1;1;1;true',\n\t\t\t\t\tname: 'id2',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'smallint',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tcompositePkName: '',\n\t\t\tpolicies: [],\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_table',\n\t\t\tisRLSEnabled: false,\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE \"users\" (\\n\\t\"id\" integer GENERATED BY DEFAULT AS IDENTITY (sequence name \"users_id_seq\" INCREMENT BY 4 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),\\n\\t\"id1\" bigint GENERATED BY DEFAULT AS IDENTITY (sequence name \"users_id1_seq\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 17000 START WITH 120 CACHE 1),\\n\\t\"id2\" smallint GENERATED BY DEFAULT AS IDENTITY (sequence name \"users_id2_seq\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 32767 START WITH 1 CACHE 1 CYCLE)\\n);\\n',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('create table: identity always/by default - all params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tincrement: 4,\n\t\t\t\tminValue: 100,\n\t\t\t}),\n\t\t\tid1: bigint('id1', { mode: 'number' }).generatedByDefaultAsIdentity({\n\t\t\t\tstartWith: 120,\n\t\t\t\tmaxValue: 17000,\n\t\t\t\tincrement: 3,\n\t\t\t\tcycle: true,\n\t\t\t\tcache: 100,\n\t\t\t}),\n\t\t\tid2: smallint('id2').generatedByDefaultAsIdentity({ cycle: true }),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tidentity: 'users_id_seq;byDefault;100;2147483647;4;100;1;false',\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tidentity: 'users_id1_seq;byDefault;1;17000;3;120;100;true',\n\t\t\t\t\tname: 'id1',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'bigint',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tidentity: 'users_id2_seq;byDefault;1;32767;1;1;1;true',\n\t\t\t\t\tname: 'id2',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'smallint',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tcompositePkName: '',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_table',\n\t\t\tpolicies: [],\n\t\t\tisRLSEnabled: false,\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE \"users\" (\\n\\t\"id\" integer GENERATED BY DEFAULT AS IDENTITY (sequence name \"users_id_seq\" INCREMENT BY 4 MINVALUE 100 MAXVALUE 2147483647 START WITH 100 CACHE 1),\\n\\t\"id1\" bigint GENERATED BY DEFAULT AS IDENTITY (sequence name \"users_id1_seq\" INCREMENT BY 3 MINVALUE 1 MAXVALUE 17000 START WITH 120 CACHE 100 CYCLE),\\n\\t\"id2\" smallint GENERATED BY DEFAULT AS IDENTITY (sequence name \"users_id2_seq\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 32767 START WITH 1 CACHE 1 CYCLE)\\n);\\n',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('no diff: identity always/by default - no params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\t\tid2: integer('id2').generatedAlwaysAsIdentity(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\t\tid2: integer('id2').generatedAlwaysAsIdentity(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('no diff: identity always/by default - few params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tname: 'custom_name',\n\t\t\t}),\n\t\t\tid2: integer('id2').generatedAlwaysAsIdentity({\n\t\t\t\tincrement: 1,\n\t\t\t\tstartWith: 3,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tname: 'custom_name',\n\t\t\t}),\n\t\t\tid2: integer('id2').generatedAlwaysAsIdentity({\n\t\t\t\tincrement: 1,\n\t\t\t\tstartWith: 3,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('no diff: identity always/by default - all params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tname: 'custom_name',\n\t\t\t\tstartWith: 10,\n\t\t\t\tminValue: 10,\n\t\t\t\tmaxValue: 1000,\n\t\t\t\tcycle: true,\n\t\t\t\tcache: 10,\n\t\t\t\tincrement: 2,\n\t\t\t}),\n\t\t\tid2: integer('id2').generatedAlwaysAsIdentity({\n\t\t\t\tstartWith: 10,\n\t\t\t\tminValue: 10,\n\t\t\t\tmaxValue: 1000,\n\t\t\t\tcycle: true,\n\t\t\t\tcache: 10,\n\t\t\t\tincrement: 2,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tname: 'custom_name',\n\t\t\t\tstartWith: 10,\n\t\t\t\tminValue: 10,\n\t\t\t\tmaxValue: 1000,\n\t\t\t\tcycle: true,\n\t\t\t\tcache: 10,\n\t\t\t\tincrement: 2,\n\t\t\t}),\n\t\t\tid2: integer('id2').generatedAlwaysAsIdentity({\n\t\t\t\tstartWith: 10,\n\t\t\t\tminValue: 10,\n\t\t\t\tmaxValue: 1000,\n\t\t\t\tcycle: true,\n\t\t\t\tcache: 10,\n\t\t\t\tincrement: 2,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('drop identity from a column - no params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([`ALTER TABLE \\\"users\\\" ALTER COLUMN \\\"id\\\" DROP IDENTITY;`]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('drop identity from a column - few params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({ name: 'custom_name' }),\n\t\t\tid1: integer('id1').generatedByDefaultAsIdentity({\n\t\t\t\tname: 'custom_name1',\n\t\t\t\tincrement: 4,\n\t\t\t}),\n\t\t\tid2: integer('id2').generatedAlwaysAsIdentity({\n\t\t\t\tname: 'custom_name2',\n\t\t\t\tincrement: 4,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid1: integer('id1'),\n\t\t\tid2: integer('id2'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_identity',\n\t\t},\n\t\t{\n\t\t\tcolumnName: 'id1',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_identity',\n\t\t},\n\t\t{\n\t\t\tcolumnName: 'id2',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`ALTER TABLE \\\"users\\\" ALTER COLUMN \\\"id\\\" DROP IDENTITY;`,\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id1\" DROP IDENTITY;',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id2\" DROP IDENTITY;',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('drop identity from a column - all params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\t\tid1: integer('id1').generatedByDefaultAsIdentity({\n\t\t\t\tname: 'custom_name1',\n\t\t\t\tstartWith: 10,\n\t\t\t\tminValue: 10,\n\t\t\t\tmaxValue: 1000,\n\t\t\t\tcycle: true,\n\t\t\t\tcache: 10,\n\t\t\t\tincrement: 2,\n\t\t\t}),\n\t\t\tid2: integer('id2').generatedAlwaysAsIdentity({\n\t\t\t\tname: 'custom_name2',\n\t\t\t\tstartWith: 10,\n\t\t\t\tminValue: 10,\n\t\t\t\tmaxValue: 1000,\n\t\t\t\tcycle: true,\n\t\t\t\tcache: 10,\n\t\t\t\tincrement: 2,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid1: integer('id1'),\n\t\t\tid2: integer('id2'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_identity',\n\t\t},\n\t\t{\n\t\t\tcolumnName: 'id1',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_identity',\n\t\t},\n\t\t{\n\t\t\tcolumnName: 'id2',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`ALTER TABLE \\\"users\\\" ALTER COLUMN \\\"id\\\" DROP IDENTITY;`,\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id1\" DROP IDENTITY;',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id2\" DROP IDENTITY;',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter identity from a column - no params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({ startWith: 100 }),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tidentity: 'users_id_seq;byDefault;1;2147483647;1;100;1;false',\n\t\t\toldIdentity: 'users_id_seq;byDefault;1;2147483647;1;1;1;false',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_change_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual(['ALTER TABLE \"users\" ALTER COLUMN \"id\" SET START WITH 100;']);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter identity from a column - few params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({ startWith: 100 }),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tstartWith: 100,\n\t\t\t\tincrement: 4,\n\t\t\t\tmaxValue: 10000,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tidentity: 'users_id_seq;byDefault;1;10000;4;100;1;false',\n\t\t\toldIdentity: 'users_id_seq;byDefault;1;2147483647;1;100;1;false',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_change_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET MAXVALUE 10000;',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET INCREMENT BY 4;',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter identity from a column - by default to always', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({ startWith: 100 }),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedAlwaysAsIdentity({\n\t\t\t\tstartWith: 100,\n\t\t\t\tincrement: 4,\n\t\t\t\tmaxValue: 10000,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tidentity: 'users_id_seq;always;1;10000;4;100;1;false',\n\t\t\toldIdentity: 'users_id_seq;byDefault;1;2147483647;1;100;1;false',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_change_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET GENERATED ALWAYS;',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET MAXVALUE 10000;',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET INCREMENT BY 4;',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter identity from a column - always to by default', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedAlwaysAsIdentity({ startWith: 100 }),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({\n\t\t\t\tstartWith: 100,\n\t\t\t\tincrement: 4,\n\t\t\t\tmaxValue: 10000,\n\t\t\t\tcycle: true,\n\t\t\t\tcache: 100,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tidentity: 'users_id_seq;byDefault;1;10000;4;100;100;true',\n\t\t\toldIdentity: 'users_id_seq;always;1;2147483647;1;100;1;false',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_change_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET GENERATED BY DEFAULT;',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET MAXVALUE 10000;',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET INCREMENT BY 4;',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET CACHE 100;',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" SET CYCLE;',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('add column with identity - few params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\temail: text('email'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\temail: text('email'),\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({ name: 'custom_name' }),\n\t\t\tid1: integer('id1').generatedAlwaysAsIdentity({\n\t\t\t\tname: 'custom_name1',\n\t\t\t\tincrement: 4,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tidentity: 'custom_name;byDefault;1;2147483647;1;1;1;false',\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_add_column',\n\t\t},\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tidentity: 'custom_name1;always;1;2147483647;4;1;1;false',\n\t\t\t\tname: 'id1',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_add_column',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ADD COLUMN \"id\" integer NOT NULL GENERATED BY DEFAULT AS IDENTITY (sequence name \"custom_name\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1);',\n\t\t'ALTER TABLE \"users\" ADD COLUMN \"id1\" integer NOT NULL GENERATED ALWAYS AS IDENTITY (sequence name \"custom_name1\" INCREMENT BY 4 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1);',\n\t]);\n\n\t// for (const st of sqlStatements) {\n\t//   await client.query(st);\n\t// }\n});\n\ntest('add identity to column - few params', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tid1: integer('id1'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').generatedByDefaultAsIdentity({ name: 'custom_name' }),\n\t\t\tid1: integer('id1').generatedAlwaysAsIdentity({\n\t\t\t\tname: 'custom_name1',\n\t\t\t\tincrement: 4,\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnName: 'id',\n\t\t\tidentity: 'custom_name;byDefault;1;2147483647;1;1;1;false',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_identity',\n\t\t},\n\t\t{\n\t\t\tcolumnName: 'id1',\n\t\t\tidentity: 'custom_name1;always;1;2147483647;4;1;1;false',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_identity',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id\" ADD GENERATED BY DEFAULT AS IDENTITY (sequence name \"custom_name\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1);',\n\t\t'ALTER TABLE \"users\" ALTER COLUMN \"id1\" ADD GENERATED ALWAYS AS IDENTITY (sequence name \"custom_name1\" INCREMENT BY 4 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1);',\n\t]);\n\n\t// for (const st of sqlStatements) {\n\t//   await client.query(st);\n\t// }\n});\n\ntest('add array column - empty array default', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst schema2 = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: integer('values').array().default([]),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'alter_table_add_column',\n\t\t\ttableName: 'test',\n\t\t\tschema: '',\n\t\t\tcolumn: { name: 'values', type: 'integer[]', primaryKey: false, notNull: false, default: \"'{}'\" },\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual(['ALTER TABLE \"test\" ADD COLUMN \"values\" integer[] DEFAULT \\'{}\\';']);\n});\n\ntest('add array column - default', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\tconst schema2 = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: integer('values').array().default([1, 2, 3]),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'alter_table_add_column',\n\t\t\ttableName: 'test',\n\t\t\tschema: '',\n\t\t\tcolumn: { name: 'values', type: 'integer[]', primaryKey: false, notNull: false, default: \"'{1,2,3}'\" },\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual(['ALTER TABLE \"test\" ADD COLUMN \"values\" integer[] DEFAULT \\'{1,2,3}\\';']);\n});\n\ntest('create view', async () => {\n\tconst client = new PGlite();\n\n\tconst table = pgTable('test', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\tconst schema1 = {\n\t\ttest: table,\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: pgView('view').as((qb) => qb.selectDistinct().from(table)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdefinition: 'select distinct \"id\" from \"test\"',\n\t\t\tname: 'view',\n\t\t\tschema: 'public',\n\t\t\ttype: 'create_view',\n\t\t\twith: undefined,\n\t\t\tmaterialized: false,\n\t\t\ttablespace: undefined,\n\t\t\tusing: undefined,\n\t\t\twithNoData: false,\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual(['CREATE VIEW \"public\".\"view\" AS (select distinct \"id\" from \"test\");']);\n});\n\ntest('add check constraint to table', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: integer('values').array().default([1, 2, 3]),\n\t\t}),\n\t};\n\tconst schema2 = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: integer('values').array().default([1, 2, 3]),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint1: check('some_check1', sql`${table.values} < 100`),\n\t\t\tcheckConstraint2: check('some_check2', sql`'test' < 100`),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'create_check_constraint',\n\t\t\ttableName: 'test',\n\t\t\tschema: '',\n\t\t\tdata: 'some_check1;\"test\".\"values\" < 100',\n\t\t},\n\t\t{\n\t\t\tdata: \"some_check2;'test' < 100\",\n\t\t\tschema: '',\n\t\t\ttableName: 'test',\n\t\t\ttype: 'create_check_constraint',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"test\" ADD CONSTRAINT \"some_check1\" CHECK (\"test\".\"values\" < 100);',\n\t\t`ALTER TABLE \"test\" ADD CONSTRAINT \"some_check2\" CHECK ('test' < 100);`,\n\t]);\n});\n\ntest('create materialized view', async () => {\n\tconst client = new PGlite();\n\n\tconst table = pgTable('test', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\tconst schema1 = {\n\t\ttest: table,\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: pgMaterializedView('view')\n\t\t\t.withNoData()\n\t\t\t.using('heap')\n\t\t\t.as((qb) => qb.selectDistinct().from(table)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdefinition: 'select distinct \"id\" from \"test\"',\n\t\t\tname: 'view',\n\t\t\tschema: 'public',\n\t\t\ttype: 'create_view',\n\t\t\twith: undefined,\n\t\t\tmaterialized: true,\n\t\t\ttablespace: undefined,\n\t\t\tusing: 'heap',\n\t\t\twithNoData: true,\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE MATERIALIZED VIEW \"public\".\"view\" USING \"heap\" AS (select distinct \"id\" from \"test\") WITH NO DATA;',\n\t]);\n});\n\ntest('drop check constraint', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: integer('values').default(1),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check', sql`${table.values} < 100`),\n\t\t})),\n\t};\n\tconst schema2 = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: integer('values').default(1),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'delete_check_constraint',\n\t\t\ttableName: 'test',\n\t\t\tschema: '',\n\t\t\tconstraintName: 'some_check',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"test\" DROP CONSTRAINT \"some_check\";',\n\t]);\n});\n\ntest('Column with same name as enum', async () => {\n\tconst client = new PGlite();\n\tconst statusEnum = pgEnum('status', ['inactive', 'active', 'banned']);\n\n\tconst schema1 = {\n\t\tstatusEnum,\n\t\ttable1: pgTable('table1', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tstatusEnum,\n\t\ttable1: pgTable('table1', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tstatus: statusEnum('status').default('inactive'),\n\t\t}),\n\t\ttable2: pgTable('table2', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tstatus: statusEnum('status').default('inactive'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'create_table',\n\t\t\ttableName: 'table2',\n\t\t\tschema: '',\n\t\t\tcompositePKs: [],\n\t\t\tcompositePkName: '',\n\t\t\tisRLSEnabled: false,\n\t\t\tpolicies: [],\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t\tcolumns: [\n\t\t\t\t{ name: 'id', type: 'serial', primaryKey: true, notNull: true },\n\t\t\t\t{\n\t\t\t\t\tname: 'status',\n\t\t\t\t\ttype: 'status',\n\t\t\t\t\ttypeSchema: 'public',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tdefault: \"'inactive'\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_add_column',\n\t\t\ttableName: 'table1',\n\t\t\tschema: '',\n\t\t\tcolumn: {\n\t\t\t\tname: 'status',\n\t\t\t\ttype: 'status',\n\t\t\t\ttypeSchema: 'public',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tdefault: \"'inactive'\",\n\t\t\t},\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE \"table2\" (\\n\\t\"id\" serial PRIMARY KEY NOT NULL,\\n\\t\"status\" \"status\" DEFAULT \\'inactive\\'\\n);\\n',\n\t\t'ALTER TABLE \"table1\" ADD COLUMN \"status\" \"status\" DEFAULT \\'inactive\\';',\n\t]);\n});\n\ntest('db has checks. Push with same names', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: integer('values').default(1),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check', sql`${table.values} < 100`),\n\t\t})),\n\t};\n\tconst schema2 = {\n\t\ttest: pgTable('test', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tvalues: integer('values').default(1),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check', sql`some new value`),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('drop view', async () => {\n\tconst client = new PGlite();\n\n\tconst table = pgTable('test', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: pgView('view').as((qb) => qb.selectDistinct().from(table)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'view',\n\t\t\tschema: 'public',\n\t\t\ttype: 'drop_view',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual(['DROP VIEW \"public\".\"view\";']);\n});\n\ntest('drop materialized view', async () => {\n\tconst client = new PGlite();\n\n\tconst table = pgTable('test', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: pgMaterializedView('view').as((qb) => qb.selectDistinct().from(table)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'view',\n\t\t\tschema: 'public',\n\t\t\ttype: 'drop_view',\n\t\t\tmaterialized: true,\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual(['DROP MATERIALIZED VIEW \"public\".\"view\";']);\n});\n\ntest('push view with same name', async () => {\n\tconst client = new PGlite();\n\n\tconst table = pgTable('test', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: pgView('view').as((qb) => qb.selectDistinct().from(table)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: pgView('view').as((qb) => qb.selectDistinct().from(table).where(eq(table.id, 1))),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('push materialized view with same name', async () => {\n\tconst client = new PGlite();\n\n\tconst table = pgTable('test', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: pgMaterializedView('view').as((qb) => qb.selectDistinct().from(table)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: pgMaterializedView('view').as((qb) => qb.selectDistinct().from(table).where(eq(table.id, 1))),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('add with options for materialized view', async () => {\n\tconst client = new PGlite();\n\n\tconst table = pgTable('test', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: pgMaterializedView('view').as((qb) => qb.selectDistinct().from(table)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: pgMaterializedView('view')\n\t\t\t.with({ autovacuumFreezeTableAge: 1, autovacuumEnabled: false })\n\t\t\t.as((qb) => qb.selectDistinct().from(table)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'view',\n\t\tschema: 'public',\n\t\ttype: 'alter_view_add_with_option',\n\t\twith: {\n\t\t\tautovacuumFreezeTableAge: 1,\n\t\t\tautovacuumEnabled: false,\n\t\t},\n\t\tmaterialized: true,\n\t});\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER MATERIALIZED VIEW \"public\".\"view\" SET (autovacuum_enabled = false, autovacuum_freeze_table_age = 1);`,\n\t);\n});\n\ntest('add with options to materialized', async () => {\n\tconst client = new PGlite();\n\n\tconst table = pgTable('test', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: pgMaterializedView('view').as((qb) => qb.selectDistinct().from(table)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: pgMaterializedView('view')\n\t\t\t.with({ autovacuumVacuumCostDelay: 100, vacuumTruncate: false })\n\t\t\t.as((qb) => qb.selectDistinct().from(table)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'view',\n\t\tschema: 'public',\n\t\ttype: 'alter_view_add_with_option',\n\t\twith: {\n\t\t\tautovacuumVacuumCostDelay: 100,\n\t\t\tvacuumTruncate: false,\n\t\t},\n\t\tmaterialized: true,\n\t});\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER MATERIALIZED VIEW \"public\".\"view\" SET (vacuum_truncate = false, autovacuum_vacuum_cost_delay = 100);`,\n\t);\n});\n\ntest('add with options to materialized with existing flag', async () => {\n\tconst client = new PGlite();\n\n\tconst table = pgTable('test', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: pgMaterializedView('view', {}).as(sql`SELECT id FROM \"test\"`),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: pgMaterializedView('view', {}).with({ autovacuumVacuumCostDelay: 100, vacuumTruncate: false }).existing(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(client, schema1, schema2, [], false, ['public']);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('drop mat view with data', async () => {\n\tconst client = new PGlite();\n\n\tconst table = pgTable('table', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: pgMaterializedView('view', {}).as(sql`SELECT * FROM ${table}`),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t};\n\n\tconst seedStatements = [`INSERT INTO \"public\".\"table\" (\"id\") VALUES (1), (2), (3)`];\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tschemasToRemove,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t\tmatViewsToRemove,\n\t} = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\tundefined,\n\t\t{ after: seedStatements },\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tmaterialized: true,\n\t\tname: 'view',\n\t\tschema: 'public',\n\t\ttype: 'drop_view',\n\t});\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`DROP MATERIALIZED VIEW \"public\".\"view\";`);\n\texpect(infoToPrint!.length).toBe(1);\n\texpect(infoToPrint![0]).toBe(`· You're about to delete \"${chalk.underline('view')}\" materialized view with 3 items`);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(schemasToRemove!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(true);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(matViewsToRemove!.length).toBe(1);\n});\n\ntest('drop mat view without data', async () => {\n\tconst client = new PGlite();\n\n\tconst table = pgTable('table', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: pgMaterializedView('view', {}).as(sql`SELECT * FROM ${table}`),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tschemasToRemove,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t\tmatViewsToRemove,\n\t} = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tmaterialized: true,\n\t\tname: 'view',\n\t\tschema: 'public',\n\t\ttype: 'drop_view',\n\t});\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`DROP MATERIALIZED VIEW \"public\".\"view\";`);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(schemasToRemove!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(matViewsToRemove!.length).toBe(0);\n});\n\ntest('drop view with data', async () => {\n\tconst client = new PGlite();\n\n\tconst table = pgTable('table', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: pgView('view', {}).as(sql`SELECT * FROM ${table}`),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t};\n\n\tconst seedStatements = [`INSERT INTO \"public\".\"table\" (\"id\") VALUES (1), (2), (3)`];\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tschemasToRemove,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t\tmatViewsToRemove,\n\t} = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\tundefined,\n\t\t{ after: seedStatements },\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'view',\n\t\tschema: 'public',\n\t\ttype: 'drop_view',\n\t});\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`DROP VIEW \"public\".\"view\";`);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(schemasToRemove!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(matViewsToRemove!.length).toBe(0);\n});\n\ntest('enums ordering', async () => {\n\tconst enum1 = pgEnum('enum_users_customer_and_ship_to_settings_roles', [\n\t\t'custAll',\n\t\t'custAdmin',\n\t\t'custClerk',\n\t\t'custInvoiceManager',\n\t\t'custMgf',\n\t\t'custApprover',\n\t\t'custOrderWriter',\n\t\t'custBuyer',\n\t]);\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\tenum1,\n\t};\n\n\tconst { sqlStatements: createEnum } = await diffTestSchemas(schema1, schema2, []);\n\n\tconst enum2 = pgEnum('enum_users_customer_and_ship_to_settings_roles', [\n\t\t'addedToTop',\n\t\t'custAll',\n\t\t'custAdmin',\n\t\t'custClerk',\n\t\t'custInvoiceManager',\n\t\t'custMgf',\n\t\t'custApprover',\n\t\t'custOrderWriter',\n\t\t'custBuyer',\n\t]);\n\tconst schema3 = {\n\t\tenum2,\n\t};\n\n\tconst { sqlStatements: addedValueSql } = await diffTestSchemas(schema2, schema3, []);\n\n\tconst enum3 = pgEnum('enum_users_customer_and_ship_to_settings_roles', [\n\t\t'addedToTop',\n\t\t'custAll',\n\t\t'custAdmin',\n\t\t'custClerk',\n\t\t'custInvoiceManager',\n\t\t'addedToMiddle',\n\t\t'custMgf',\n\t\t'custApprover',\n\t\t'custOrderWriter',\n\t\t'custBuyer',\n\t]);\n\tconst schema4 = {\n\t\tenum3,\n\t};\n\n\tconst client = new PGlite();\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema3,\n\t\tschema4,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\tundefined,\n\t\t{ before: [...createEnum, ...addedValueSql], runApply: false },\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tbefore: 'custMgf',\n\t\tname: 'enum_users_customer_and_ship_to_settings_roles',\n\t\tschema: 'public',\n\t\ttype: 'alter_type_add_value',\n\t\tvalue: 'addedToMiddle',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TYPE \"public\".\"enum_users_customer_and_ship_to_settings_roles\" ADD VALUE 'addedToMiddle' BEFORE 'custMgf';`,\n\t);\n});\n\ntest('drop enum values', async () => {\n\tconst newSchema = pgSchema('mySchema');\n\tconst enum3 = pgEnum('enum_users_customer_and_ship_to_settings_roles', [\n\t\t'addedToTop',\n\t\t'custAll',\n\t\t'custAdmin',\n\t\t'custClerk',\n\t\t'custInvoiceManager',\n\t\t'addedToMiddle',\n\t\t'custMgf',\n\t\t'custApprover',\n\t\t'custOrderWriter',\n\t\t'custBuyer',\n\t]);\n\tconst schema1 = {\n\t\tenum3,\n\t\ttable: pgTable('enum_table', {\n\t\t\tid: enum3(),\n\t\t}),\n\t\tnewSchema,\n\t\ttable1: newSchema.table('enum_table', {\n\t\t\tid: enum3(),\n\t\t}),\n\t};\n\n\tconst enum4 = pgEnum('enum_users_customer_and_ship_to_settings_roles', [\n\t\t'addedToTop',\n\t\t'custAll',\n\t\t'custAdmin',\n\t\t'custClerk',\n\t\t'custInvoiceManager',\n\t\t'custApprover',\n\t\t'custOrderWriter',\n\t\t'custBuyer',\n\t]);\n\tconst schema2 = {\n\t\tenum4,\n\t\ttable: pgTable('enum_table', {\n\t\t\tid: enum4(),\n\t\t}),\n\t\tnewSchema,\n\t\ttable1: newSchema.table('enum_table', {\n\t\t\tid: enum4(),\n\t\t}),\n\t};\n\n\tconst client = new PGlite();\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public', 'mySchema'],\n\t\tundefined,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'enum_users_customer_and_ship_to_settings_roles',\n\t\tenumSchema: 'public',\n\t\ttype: 'alter_type_drop_value',\n\t\tnewValues: [\n\t\t\t'addedToTop',\n\t\t\t'custAll',\n\t\t\t'custAdmin',\n\t\t\t'custClerk',\n\t\t\t'custInvoiceManager',\n\t\t\t'custApprover',\n\t\t\t'custOrderWriter',\n\t\t\t'custBuyer',\n\t\t],\n\t\tdeletedValues: ['addedToMiddle', 'custMgf'],\n\t\tcolumnsWithEnum: [{\n\t\t\tcolumn: 'id',\n\t\t\ttableSchema: '',\n\t\t\ttable: 'enum_table',\n\t\t\tcolumnType: 'enum_users_customer_and_ship_to_settings_roles',\n\t\t\tdefault: undefined,\n\t\t}, {\n\t\t\tcolumn: 'id',\n\t\t\ttableSchema: 'mySchema',\n\t\t\ttable: 'enum_table',\n\t\t\tcolumnType: 'enum_users_customer_and_ship_to_settings_roles',\n\t\t\tdefault: undefined,\n\t\t}],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \"enum_table\" ALTER COLUMN \"id\" SET DATA TYPE text;`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \"mySchema\".\"enum_table\" ALTER COLUMN \"id\" SET DATA TYPE text;`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`DROP TYPE \"public\".\"enum_users_customer_and_ship_to_settings_roles\";`,\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t`CREATE TYPE \"public\".\"enum_users_customer_and_ship_to_settings_roles\" AS ENUM('addedToTop', 'custAll', 'custAdmin', 'custClerk', 'custInvoiceManager', 'custApprover', 'custOrderWriter', 'custBuyer');`,\n\t);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \"enum_table\" ALTER COLUMN \"id\" SET DATA TYPE \"public\".\"enum_users_customer_and_ship_to_settings_roles\" USING \"id\"::\"public\".\"enum_users_customer_and_ship_to_settings_roles\";`,\n\t);\n\texpect(sqlStatements[5]).toBe(\n\t\t`ALTER TABLE \"mySchema\".\"enum_table\" ALTER COLUMN \"id\" SET DATA TYPE \"public\".\"enum_users_customer_and_ship_to_settings_roles\" USING \"id\"::\"public\".\"enum_users_customer_and_ship_to_settings_roles\";`,\n\t);\n});\n\ntest('column is enum type with default value. shuffle enum', async () => {\n\tconst client = new PGlite();\n\n\tconst enum1 = pgEnum('enum', ['value1', 'value2', 'value3']);\n\n\tconst from = {\n\t\tenum1,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum1('column').default('value2'),\n\t\t}),\n\t};\n\n\tconst enum2 = pgEnum('enum', ['value1', 'value3', 'value2']);\n\tconst to = {\n\t\tenum2,\n\t\ttable: pgTable('table', {\n\t\t\tcolumn: enum2('column').default('value2'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t);\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE text;`);\n\texpect(sqlStatements[1]).toBe(`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value2'::text;`);\n\texpect(sqlStatements[2]).toBe(`DROP TYPE \"public\".\"enum\";`);\n\texpect(sqlStatements[3]).toBe(`CREATE TYPE \"public\".\"enum\" AS ENUM('value1', 'value3', 'value2');`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value2'::\"public\".\"enum\";`,\n\t);\n\texpect(sqlStatements[5]).toBe(\n\t\t`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DATA TYPE \"public\".\"enum\" USING \"column\"::\"public\".\"enum\";`,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnsWithEnum: [\n\t\t\t{\n\t\t\t\tcolumn: 'column',\n\t\t\t\ttableSchema: '',\n\t\t\t\ttable: 'table',\n\t\t\t\tdefault: \"'value2'\",\n\t\t\t\tcolumnType: 'enum',\n\t\t\t},\n\t\t],\n\t\tdeletedValues: [\n\t\t\t'value3',\n\t\t],\n\t\tname: 'enum',\n\t\tnewValues: [\n\t\t\t'value1',\n\t\t\t'value3',\n\t\t\t'value2',\n\t\t],\n\t\tenumSchema: 'public',\n\t\ttype: 'alter_type_drop_value',\n\t});\n});\n\n// Policies and Roles push test\ntest('full policy: no changes', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('add policy', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{ type: 'enable_rls', tableName: 'users', schema: '' },\n\t\t{\n\t\t\ttype: 'create_policy',\n\t\t\ttableName: 'users',\n\t\t\tdata: {\n\t\t\t\tname: 'test',\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ENABLE ROW LEVEL SECURITY;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS PERMISSIVE FOR ALL TO public;',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('drop policy', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{ type: 'disable_rls', tableName: 'users', schema: '' },\n\t\t{\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'disable_rls',\n\t\t},\n\t\t{\n\t\t\ttype: 'drop_policy',\n\t\t\ttableName: 'users',\n\t\t\tdata: {\n\t\t\t\tname: 'test',\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" DISABLE ROW LEVEL SECURITY;',\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('add policy without enable rls', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t\tnewrls: pgPolicy('newRls'),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'create_policy',\n\t\t\ttableName: 'users',\n\t\t\tdata: {\n\t\t\t\tname: 'newRls',\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE POLICY \"newRls\" ON \"users\" AS PERMISSIVE FOR ALL TO public;',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('drop policy without disable rls', async () => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t\toldRls: pgPolicy('oldRls'),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\ttype: 'drop_policy',\n\t\t\ttableName: 'users',\n\t\t\tdata: {\n\t\t\t\tname: 'oldRls',\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"oldRls\" ON \"users\" CASCADE;',\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\n////\n\ntest('alter policy without recreation: changing roles', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive', to: 'current_role' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"users\" TO current_role;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewData: 'test--PERMISSIVE--ALL--current_role--undefined',\n\t\t\toldData: 'test--PERMISSIVE--ALL--public--undefined',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_policy',\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter policy without recreation: changing using', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive', using: sql`true` }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(sqlStatements).toStrictEqual([]);\n\texpect(statements).toStrictEqual([]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter policy without recreation: changing with check', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive', withCheck: sql`true` }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(sqlStatements).toStrictEqual([]);\n\texpect(statements).toStrictEqual([]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter policy with recreation: changing as', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'restrictive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS RESTRICTIVE FOR ALL TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'RESTRICTIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter policy with recreation: changing for', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive', for: 'delete' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS PERMISSIVE FOR DELETE TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'DELETE',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter policy with recreation: changing both \"as\" and \"for\"', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'restrictive', for: 'insert' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS RESTRICTIVE FOR INSERT TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'RESTRICTIVE',\n\t\t\t\tfor: 'INSERT',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter policy with recreation: changing all fields', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive', for: 'select', using: sql`true` }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'restrictive', to: 'current_role', withCheck: sql`true` }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS RESTRICTIVE FOR ALL TO current_role;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'SELECT',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'RESTRICTIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['current_role'],\n\t\t\t\ton: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('rename policy', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('newName', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t['public.users.test->public.users.newName'],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"users\" RENAME TO \"newName\";',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewName: 'newName',\n\t\t\toldName: 'test',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'rename_policy',\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('rename policy in renamed table', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users2', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('newName', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[\n\t\t\t'public.users->public.users2',\n\t\t\t'public.users2.test->public.users2.newName',\n\t\t],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" RENAME TO \"users2\";',\n\t\t'ALTER POLICY \"test\" ON \"users2\" RENAME TO \"newName\";',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tfromSchema: '',\n\t\t\ttableNameFrom: 'users',\n\t\t\ttableNameTo: 'users2',\n\t\t\ttoSchema: '',\n\t\t\ttype: 'rename_table',\n\t\t},\n\t\t{\n\t\t\tnewName: 'newName',\n\t\t\toldName: 'test',\n\t\t\tschema: '',\n\t\t\ttableName: 'users2',\n\t\t\ttype: 'rename_policy',\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('create table with a policy', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users2', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE \"users2\" (\\n\\t\"id\" integer PRIMARY KEY NOT NULL\\n);\\n',\n\t\t'ALTER TABLE \"users2\" ENABLE ROW LEVEL SECURITY;',\n\t\t'CREATE POLICY \"test\" ON \"users2\" AS PERMISSIVE FOR ALL TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcheckConstraints: [],\n\t\t\tcompositePKs: [],\n\t\t\tisRLSEnabled: false,\n\t\t\tcompositePkName: '',\n\t\t\tpolicies: [\n\t\t\t\t'test--PERMISSIVE--ALL--public--undefined',\n\t\t\t],\n\t\t\tschema: '',\n\t\t\ttableName: 'users2',\n\t\t\ttype: 'create_table',\n\t\t\tuniqueConstraints: [],\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\ton: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users2',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('drop table with a policy', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tusers: pgTable('users2', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"users2\" CASCADE;',\n\t\t'DROP TABLE \"users2\" CASCADE;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tpolicies: [\n\t\t\t\t'test--PERMISSIVE--ALL--public--undefined',\n\t\t\t],\n\t\t\tschema: '',\n\t\t\ttableName: 'users2',\n\t\t\ttype: 'drop_table',\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('add policy with multiple \"to\" roles', async (t) => {\n\tconst client = new PGlite();\n\n\tclient.query(`CREATE ROLE manager;`);\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst role = pgRole('manager').existing();\n\n\tconst schema2 = {\n\t\trole,\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { to: ['current_role', role] }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ENABLE ROW LEVEL SECURITY;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS PERMISSIVE FOR ALL TO current_role, \"manager\";',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'enable_rls',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\ton: undefined,\n\t\t\t\tto: ['current_role', 'manager'],\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('rename policy that is linked', async (t) => {\n\tconst client = new PGlite();\n\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst { sqlStatements: createUsers } = await diffTestSchemas({}, { users }, []);\n\n\tconst schema1 = {\n\t\trls: pgPolicy('test', { as: 'permissive' }).link(users),\n\t};\n\n\tconst schema2 = {\n\t\tusers,\n\t\trls: pgPolicy('newName', { as: 'permissive' }).link(users),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t['public.users.test->public.users.newName'],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\tundefined,\n\t\t{ before: createUsers },\n\t);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"users\" RENAME TO \"newName\";',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewName: 'newName',\n\t\t\toldName: 'test',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'rename_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy that is linked', async (t) => {\n\tconst client = new PGlite();\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst { sqlStatements: createUsers } = await diffTestSchemas({}, { users }, []);\n\n\tconst schema1 = {\n\t\trls: pgPolicy('test', { as: 'permissive' }).link(users),\n\t};\n\n\tconst schema2 = {\n\t\tusers,\n\t\trls: pgPolicy('test', { as: 'permissive', to: 'current_role' }).link(users),\n\t};\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\tundefined,\n\t\t{ before: createUsers },\n\t);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"users\" TO current_role;',\n\t]);\n\texpect(statements).toStrictEqual([{\n\t\tnewData: 'test--PERMISSIVE--ALL--current_role--undefined',\n\t\toldData: 'test--PERMISSIVE--ALL--public--undefined',\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'alter_policy',\n\t}]);\n});\n\ntest('alter policy that is linked: withCheck', async (t) => {\n\tconst client = new PGlite();\n\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst { sqlStatements: createUsers } = await diffTestSchemas({}, { users }, []);\n\n\tconst schema1 = {\n\t\trls: pgPolicy('test', { as: 'permissive', withCheck: sql`true` }).link(users),\n\t};\n\n\tconst schema2 = {\n\t\tusers,\n\t\trls: pgPolicy('test', { as: 'permissive', withCheck: sql`false` }).link(users),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\tundefined,\n\t\t{ before: createUsers },\n\t);\n\n\texpect(sqlStatements).toStrictEqual([]);\n\texpect(statements).toStrictEqual([]);\n});\n\ntest('alter policy that is linked: using', async (t) => {\n\tconst client = new PGlite();\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst { sqlStatements: createUsers } = await diffTestSchemas({}, { users }, []);\n\n\tconst schema1 = {\n\t\trls: pgPolicy('test', { as: 'permissive', using: sql`true` }).link(users),\n\t};\n\n\tconst schema2 = {\n\t\tusers,\n\t\trls: pgPolicy('test', { as: 'permissive', using: sql`false` }).link(users),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\tundefined,\n\t\t{ before: createUsers },\n\t);\n\n\texpect(sqlStatements).toStrictEqual([]);\n\texpect(statements).toStrictEqual([]);\n});\n\ntest('alter policy that is linked: using', async (t) => {\n\tconst client = new PGlite();\n\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst { sqlStatements: createUsers } = await diffTestSchemas({}, { users }, []);\n\n\tconst schema1 = {\n\t\trls: pgPolicy('test', { for: 'insert' }).link(users),\n\t};\n\n\tconst schema2 = {\n\t\tusers,\n\t\trls: pgPolicy('test', { for: 'delete' }).link(users),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\tundefined,\n\t\t{ before: createUsers },\n\t);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS PERMISSIVE FOR DELETE TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'INSERT',\n\t\t\t\tname: 'test',\n\t\t\t\ton: undefined,\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'DELETE',\n\t\t\t\tname: 'test',\n\t\t\t\ton: undefined,\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n});\n\n////\n\ntest('create role', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\t{ roles: { include: ['manager'] } },\n\t);\n\n\texpect(sqlStatements).toStrictEqual(['CREATE ROLE \"manager\";']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'create_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: false,\n\t\t\t\tcreateRole: false,\n\t\t\t\tinherit: true,\n\t\t\t},\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('create role with properties', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager', { createDb: true, inherit: false, createRole: true }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\t{ roles: { include: ['manager'] } },\n\t);\n\n\texpect(sqlStatements).toStrictEqual(['CREATE ROLE \"manager\" WITH CREATEDB CREATEROLE NOINHERIT;']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'create_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: true,\n\t\t\t\tcreateRole: true,\n\t\t\t\tinherit: false,\n\t\t\t},\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('create role with some properties', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager', { createDb: true, inherit: false }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\t{ roles: { include: ['manager'] } },\n\t);\n\n\texpect(sqlStatements).toStrictEqual(['CREATE ROLE \"manager\" WITH CREATEDB NOINHERIT;']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'create_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: true,\n\t\t\t\tcreateRole: false,\n\t\t\t\tinherit: false,\n\t\t\t},\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('drop role', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = { manager: pgRole('manager') };\n\n\tconst schema2 = {};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\t{ roles: { include: ['manager'] } },\n\t);\n\n\texpect(sqlStatements).toStrictEqual(['DROP ROLE \"manager\";']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'drop_role',\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('create and drop role', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst schema2 = {\n\t\tadmin: pgRole('admin'),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\t{ roles: { include: ['manager', 'admin'] } },\n\t);\n\n\texpect(sqlStatements).toStrictEqual(['DROP ROLE \"manager\";', 'CREATE ROLE \"admin\";']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'drop_role',\n\t\t},\n\t\t{\n\t\t\tname: 'admin',\n\t\t\ttype: 'create_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: false,\n\t\t\t\tcreateRole: false,\n\t\t\t\tinherit: true,\n\t\t\t},\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('rename role', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst schema2 = {\n\t\tadmin: pgRole('admin'),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t['manager->admin'],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\t{ roles: { include: ['manager', 'admin'] } },\n\t);\n\n\texpect(sqlStatements).toStrictEqual(['ALTER ROLE \"manager\" RENAME TO \"admin\";']);\n\texpect(statements).toStrictEqual([\n\t\t{ nameFrom: 'manager', nameTo: 'admin', type: 'rename_role' },\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter all role field', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager', { createDb: true, createRole: true, inherit: false }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\t{ roles: { include: ['manager'] } },\n\t);\n\n\texpect(sqlStatements).toStrictEqual(['ALTER ROLE \"manager\" WITH CREATEDB CREATEROLE NOINHERIT;']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'alter_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: true,\n\t\t\t\tcreateRole: true,\n\t\t\t\tinherit: false,\n\t\t\t},\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter createdb in role', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager', { createDb: true }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\t{ roles: { include: ['manager'] } },\n\t);\n\n\texpect(sqlStatements).toStrictEqual(['ALTER ROLE \"manager\" WITH CREATEDB NOCREATEROLE INHERIT;']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'alter_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: true,\n\t\t\t\tcreateRole: false,\n\t\t\t\tinherit: true,\n\t\t\t},\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter createrole in role', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager', { createRole: true }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\t{ roles: { include: ['manager'] } },\n\t);\n\n\texpect(sqlStatements).toStrictEqual(['ALTER ROLE \"manager\" WITH NOCREATEDB CREATEROLE INHERIT;']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'alter_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: false,\n\t\t\t\tcreateRole: true,\n\t\t\t\tinherit: true,\n\t\t\t},\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n\ntest('alter inherit in role', async (t) => {\n\tconst client = new PGlite();\n\n\tconst schema1 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager', { inherit: false }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPush(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t['public'],\n\t\tundefined,\n\t\t{ roles: { include: ['manager'] } },\n\t);\n\n\texpect(sqlStatements).toStrictEqual(['ALTER ROLE \"manager\" WITH NOCREATEDB NOCREATEROLE NOINHERIT;']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'alter_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: false,\n\t\t\t\tcreateRole: false,\n\t\t\t\tinherit: false,\n\t\t\t},\n\t\t},\n\t]);\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n});\n"
  },
  {
    "path": "drizzle-kit/tests/push/singlestore-push.test.ts",
    "content": "import chalk from 'chalk';\nimport Docker from 'dockerode';\nimport { getTableConfig, index, int, singlestoreTable, text } from 'drizzle-orm/singlestore-core';\nimport fs from 'fs';\nimport getPort from 'get-port';\nimport { Connection, createConnection } from 'mysql2/promise';\nimport { diffTestSchemasPushSingleStore } from 'tests/schemaDiffer';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, expect, test } from 'vitest';\n\nlet client: Connection;\nlet singlestoreContainer: Docker.Container;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'ghcr.io/singlestore-labs/singlestoredb-dev:latest';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tsinglestoreContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['ROOT_PASSWORD=singlestore'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait singlestoreContainer.start();\n\tawait new Promise((resolve) => setTimeout(resolve, 4000));\n\n\treturn `singlestore://root:singlestore@localhost:${port}/`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env.MYSQL_CONNECTION_STRING ?? (await createDockerDB());\n\n\tconst sleep = 1000;\n\tlet timeLeft = 20000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = await createConnection(connectionString);\n\t\t\tawait client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to MySQL');\n\t\tawait client?.end().catch(console.error);\n\t\tawait singlestoreContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\n\tawait client.query('DROP DATABASE IF EXISTS drizzle;');\n\tawait client.query('CREATE DATABASE drizzle;');\n\tawait client.query('USE drizzle;');\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait singlestoreContainer?.stop().catch(console.error);\n});\n\nif (!fs.existsSync('tests/push/singlestore')) {\n\tfs.mkdirSync('tests/push/singlestore');\n}\n\ntest('db has checks. Push with same names', async () => {\n\tconst schema1 = {\n\t\ttest: singlestoreTable('test', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tvalues: int('values').default(1),\n\t\t}),\n\t};\n\tconst schema2 = {\n\t\ttest: singlestoreTable('test', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tvalues: int('values').default(1),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushSingleStore(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n\n\tawait client.query(`DROP TABLE \\`test\\`;`);\n});\n\n// TODO: Unskip this test when views are implemented\n/* test.skip.skip('create view', async () => {\n\tconst table = singlestoreTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: singlestoreView('view').as((qb) => qb.select().from(table)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushSingleStore(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdefinition: 'select `id` from `test`',\n\t\t\tname: 'view',\n\t\t\ttype: 'singlestore_create_view',\n\t\t\treplace: false,\n\t\t\tsqlSecurity: 'definer',\n\t\t\twithCheckOption: undefined,\n\t\t\talgorithm: 'undefined',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`CREATE ALGORITHM = undefined\nSQL SECURITY definer\nVIEW \\`view\\` AS (select \\`id\\` from \\`test\\`);`,\n\t]);\n\n\tawait client.query(`DROP TABLE \\`test\\`;`);\n}); */\n\n// TODO: Unskip this test when views are implemented\n/* test.skip('drop view', async () => {\n\tconst table = singlestoreTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: singlestoreView('view').as((qb) => qb.select().from(table)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushSingleStore(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'view',\n\t\t\ttype: 'drop_view',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual(['DROP VIEW `view`;']);\n\tawait client.query(`DROP TABLE \\`test\\`;`);\n\tawait client.query(`DROP VIEW \\`view\\`;`);\n}); */\n\n// TODO: Unskip this test when views are implemented\n/* test.skip('alter view \".as\"', async () => {\n\tconst table = singlestoreTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: singlestoreView('view').as((qb) =>\n\t\t\tqb\n\t\t\t\t.select()\n\t\t\t\t.from(table)\n\t\t\t\t.where(sql`${table.id} = 1`)\n\t\t),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: singlestoreView('view').as((qb) => qb.select().from(table)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushSingleStore(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n\n\tawait client.query(`DROP TABLE \\`test\\`;`);\n\tawait client.query(`DROP VIEW \\`view\\`;`);\n}); */\n\n// TODO: Unskip this test when views are implemented\n/* test.skip('alter meta options with distinct in definition', async () => {\n\tconst table = singlestoreTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: singlestoreView('view')\n\t\t\t.withCheckOption('cascaded')\n\t\t\t.sqlSecurity('definer')\n\t\t\t.algorithm('merge')\n\t\t\t.as((qb) =>\n\t\t\t\tqb\n\t\t\t\t\t.selectDistinct()\n\t\t\t\t\t.from(table)\n\t\t\t\t\t.where(sql`${table.id} = 1`)\n\t\t\t),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: singlestoreView('view')\n\t\t\t.withCheckOption('cascaded')\n\t\t\t.sqlSecurity('definer')\n\t\t\t.algorithm('undefined')\n\t\t\t.as((qb) => qb.selectDistinct().from(table)),\n\t};\n\n\tawait expect(\n\t\tdiffTestSchemasPushSingleStore(\n\t\t\tclient,\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t[],\n\t\t\t'drizzle',\n\t\t\tfalse,\n\t\t),\n\t).rejects.toThrowError();\n\n\tawait client.query(`DROP TABLE \\`test\\`;`);\n}); */\n\ntest('added column not null and without default to table with data', async (t) => {\n\tconst schema1 = {\n\t\tcompanies: singlestoreTable('companies', {\n\t\t\tid: int('id'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tcompanies: singlestoreTable('companies', {\n\t\t\tid: int('id'),\n\t\t\tname: text('name'),\n\t\t\tage: int('age').notNull(),\n\t\t}),\n\t};\n\n\tconst table = getTableConfig(schema1.companies);\n\n\tconst seedStatements = [\n\t\t`INSERT INTO \\`${table.name}\\` (\\`${schema1.companies.name.name}\\`) VALUES ('drizzle');`,\n\t\t`INSERT INTO \\`${table.name}\\` (\\`${schema1.companies.name.name}\\`) VALUES ('turso');`,\n\t];\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSingleStore(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t\tundefined,\n\t\t{\n\t\t\tafter: seedStatements,\n\t\t},\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'companies',\n\t\tcolumn: {\n\t\t\tname: 'age',\n\t\t\ttype: 'int',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: true,\n\t\t\tautoincrement: false,\n\t\t},\n\t\tschema: '',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`truncate table companies;`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \\`companies\\` ADD \\`age\\` int NOT NULL;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(1);\n\texpect(infoToPrint![0]).toBe(\n\t\t`· You're about to add not-null ${\n\t\t\tchalk.underline(\n\t\t\t\t'age',\n\t\t\t)\n\t\t} column without default value, which contains 2 items`,\n\t);\n\texpect(shouldAskForApprove).toBe(true);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(1);\n\texpect(tablesToTruncate![0]).toBe('companies');\n\n\tawait client.query(`DROP TABLE \\`companies\\`;`);\n});\n\ntest('added column not null and without default to table without data', async (t) => {\n\tconst schema1 = {\n\t\tcompanies: singlestoreTable('companies', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tcompanies: singlestoreTable('companies', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t\tage: int('age').notNull(),\n\t\t}),\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSingleStore(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t\tundefined,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'companies',\n\t\tcolumn: {\n\t\t\tname: 'age',\n\t\t\ttype: 'int',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: true,\n\t\t\tautoincrement: false,\n\t\t},\n\t\tschema: '',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`companies\\` ADD \\`age\\` int NOT NULL;`,\n\t);\n\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n\n\tawait client.query(`DROP TABLE \\`companies\\`;`);\n});\n\ntest('drop not null, add not null', async (t) => {\n\tconst schema1 = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t\tposts: singlestoreTable(\n\t\t\t'posts',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t\tuserId: int('user_id'),\n\t\t\t},\n\t\t),\n\t};\n\n\tconst schema2 = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name'),\n\t\t}),\n\t\tposts: singlestoreTable(\n\t\t\t'posts',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tuserId: int('user_id'),\n\t\t\t},\n\t\t),\n\t};\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSingleStore(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t\tundefined,\n\t);\n\n\texpect(statements!.length).toBe(2);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'int',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: true,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'user_id',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'int',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [\n\t\t\t'posts_id;id',\n\t\t],\n\t\ttableName: 'posts',\n\t\ttype: 'singlestore_recreate_table',\n\t\tuniqueConstraints: [],\n\t});\n\texpect(statements![1]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'int',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [\n\t\t\t'users_id;id',\n\t\t],\n\t\ttableName: 'users',\n\t\ttype: 'singlestore_recreate_table',\n\t\tuniqueConstraints: [],\n\t});\n\texpect(sqlStatements!.length).toBe(8);\n\texpect(sqlStatements![0]).toBe(`CREATE TABLE \\`__new_posts\\` (\n\\t\\`id\\` int NOT NULL,\n\\t\\`name\\` text NOT NULL,\n\\t\\`user_id\\` int,\n\\tCONSTRAINT \\`posts_id\\` PRIMARY KEY(\\`id\\`)\n);\\n`);\n\texpect(sqlStatements![1]).toBe(\n\t\t`INSERT INTO \\`__new_posts\\`(\\`id\\`, \\`name\\`, \\`user_id\\`) SELECT \\`id\\`, \\`name\\`, \\`user_id\\` FROM \\`posts\\`;`,\n\t);\n\texpect(sqlStatements![2]).toBe(`DROP TABLE \\`posts\\`;`);\n\texpect(sqlStatements![3]).toBe(`ALTER TABLE \\`__new_posts\\` RENAME TO \\`posts\\`;`);\n\texpect(sqlStatements![4]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` int NOT NULL,\n\\t\\`name\\` text,\n\\tCONSTRAINT \\`users_id\\` PRIMARY KEY(\\`id\\`)\n);\\n`);\n\texpect(sqlStatements![5]).toBe(\n\t\t`INSERT INTO \\`__new_users\\`(\\`id\\`, \\`name\\`) SELECT \\`id\\`, \\`name\\` FROM \\`users\\`;`,\n\t);\n\texpect(sqlStatements![6]).toBe(\n\t\t`DROP TABLE \\`users\\`;`,\n\t);\n\texpect(sqlStatements![7]).toBe(`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n\n\tawait client.query(`DROP TABLE \\`users\\`;`);\n\tawait client.query(`DROP TABLE \\`posts\\`;`);\n});\n\ntest('drop table with data', async (t) => {\n\tconst schema1 = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t\tposts: singlestoreTable(\n\t\t\t'posts',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t\tuserId: int('user_id'),\n\t\t\t},\n\t\t),\n\t};\n\n\tconst schema2 = {\n\t\tposts: singlestoreTable(\n\t\t\t'posts',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t\tuserId: int('user_id'),\n\t\t\t},\n\t\t),\n\t};\n\n\tconst seedStatements = [\n\t\t`INSERT INTO \\`users\\` (\\`id\\`, \\`name\\`) VALUES (1, 'drizzle')`,\n\t];\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSingleStore(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t\tundefined,\n\t\t{ after: seedStatements },\n\t);\n\n\texpect(statements!.length).toBe(1);\n\texpect(statements![0]).toStrictEqual({\n\t\tpolicies: [],\n\t\tschema: undefined,\n\t\ttableName: 'users',\n\t\ttype: 'drop_table',\n\t});\n\n\texpect(sqlStatements!.length).toBe(1);\n\texpect(sqlStatements![0]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(1);\n\texpect(infoToPrint![0]).toBe(`· You're about to delete ${chalk.underline('users')} table with 1 items`);\n\texpect(shouldAskForApprove).toBe(true);\n\texpect(tablesToRemove!.length).toBe(1);\n\texpect(tablesToRemove![0]).toBe('users');\n\texpect(tablesToTruncate!.length).toBe(0);\n\n\tawait client.query(`DROP TABLE \\`users\\`;`);\n\tawait client.query(`DROP TABLE \\`posts\\`;`);\n});\n\ntest('change data type. db has indexes. table does not have values', async (t) => {\n\tconst schema1 = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: int('name').notNull(),\n\t\t}, (table) => [index('index').on(table.name)]),\n\t};\n\n\tconst schema2 = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}, (table) => [index('index').on(table.name)]),\n\t};\n\n\tconst seedStatements = [`INSERT INTO users VALUES (1, 12)`];\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSingleStore(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t\tundefined,\n\t);\n\n\texpect(statements!.length).toBe(2);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'int',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: true,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [\n\t\t\t'users_id;id',\n\t\t],\n\t\ttableName: 'users',\n\t\ttype: 'singlestore_recreate_table',\n\t\tuniqueConstraints: [],\n\t});\n\texpect(statements![1]).toStrictEqual({\n\t\tdata: 'index;name;false;;;',\n\t\tinternal: undefined,\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'create_index',\n\t});\n\n\texpect(sqlStatements!.length).toBe(5);\n\texpect(sqlStatements![0]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` int NOT NULL,\n\\t\\`name\\` text NOT NULL,\n\\tCONSTRAINT \\`users_id\\` PRIMARY KEY(\\`id\\`)\n);\\n`);\n\texpect(sqlStatements![1]).toBe(\n\t\t`INSERT INTO \\`__new_users\\`(\\`id\\`, \\`name\\`) SELECT \\`id\\`, \\`name\\` FROM \\`users\\`;`,\n\t);\n\texpect(sqlStatements![2]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements![3]).toBe(`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`);\n\texpect(sqlStatements![4]).toBe(`CREATE INDEX \\`index\\` ON \\`users\\` (\\`name\\`);`);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n\n\tawait client.query(`DROP TABLE \\`users\\`;`);\n});\n\ntest('change data type. db has indexes. table has values', async (t) => {\n\tconst schema1 = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: int('name'),\n\t\t}, (table) => [index('index').on(table.name)]),\n\t};\n\n\tconst schema2 = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name'),\n\t\t}, (table) => [index('index').on(table.name)]),\n\t};\n\n\tconst seedStatements = [`INSERT INTO users VALUES (1, 12);`, `INSERT INTO users (id) VALUES (2);`];\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSingleStore(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t\tundefined,\n\t\t{ after: seedStatements },\n\t);\n\n\texpect(statements!.length).toBe(2);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'int',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [\n\t\t\t'users_id;id',\n\t\t],\n\t\ttableName: 'users',\n\t\ttype: 'singlestore_recreate_table',\n\t\tuniqueConstraints: [],\n\t});\n\texpect(statements![1]).toStrictEqual({\n\t\tdata: 'index;name;false;;;',\n\t\tinternal: undefined,\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'create_index',\n\t});\n\n\texpect(sqlStatements!.length).toBe(6);\n\texpect(sqlStatements![0]).toBe(`TRUNCATE TABLE \\`users\\`;`);\n\texpect(sqlStatements![1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` int NOT NULL,\n\\t\\`name\\` text,\n\\tCONSTRAINT \\`users_id\\` PRIMARY KEY(\\`id\\`)\n);\\n`);\n\texpect(sqlStatements![2]).toBe(\n\t\t`INSERT INTO \\`__new_users\\`(\\`id\\`, \\`name\\`) SELECT \\`id\\`, \\`name\\` FROM \\`users\\`;`,\n\t);\n\texpect(sqlStatements![3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements![4]).toBe(`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`);\n\texpect(sqlStatements![5]).toBe(`CREATE INDEX \\`index\\` ON \\`users\\` (\\`name\\`);`);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(1);\n\texpect(infoToPrint![0]).toBe(\n\t\t`· You're about recreate ${chalk.underline('users')} table with data type changing for ${\n\t\t\tchalk.underline('name')\n\t\t} column, which contains 1 items`,\n\t);\n\texpect(shouldAskForApprove).toBe(true);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(1);\n\texpect(tablesToTruncate![0]).toBe(`users`);\n\n\tawait client.query(`DROP TABLE \\`users\\`;`);\n});\n\ntest('add column. add default to column without not null', async (t) => {\n\tconst schema1 = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name').default('drizzle'),\n\t\t\tage: int('age'),\n\t\t}),\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSingleStore(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\t'drizzle',\n\t\tfalse,\n\t\tundefined,\n\t);\n\n\texpect(statements!.length).toBe(2);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnName: 'name',\n\t\tcolumnNotNull: false,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: 'text',\n\t\tnewDefaultValue: \"'drizzle'\",\n\t\tschema: '',\n\t\ttableName: 'users',\n\t\ttype: 'alter_table_alter_column_set_default',\n\t});\n\texpect(statements![1]).toStrictEqual({\n\t\ttype: 'alter_table_add_column',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumn: {\n\t\t\tnotNull: false,\n\t\t\tprimaryKey: false,\n\t\t\tautoincrement: false,\n\t\t\tname: 'age',\n\t\t\ttype: 'int',\n\t\t},\n\t});\n\texpect(sqlStatements!.length).toBe(2);\n\texpect(sqlStatements![0]).toBe(`ALTER TABLE \\`users\\` MODIFY COLUMN \\`name\\` text DEFAULT 'drizzle';`);\n\texpect(sqlStatements![1]).toBe(`ALTER TABLE \\`users\\` ADD \\`age\\` int;`);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n\n\tawait client.query(`DROP TABLE \\`users\\`;`);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/push/singlestore.test.ts",
    "content": "import Docker from 'dockerode';\nimport { SQL, sql } from 'drizzle-orm';\nimport {\n\tbigint,\n\tbinary,\n\tchar,\n\tdate,\n\tdecimal,\n\tdouble,\n\tfloat,\n\tint,\n\tmediumint,\n\tprimaryKey,\n\tsinglestoreEnum,\n\tsinglestoreTable,\n\tsmallint,\n\ttext,\n\ttime,\n\ttimestamp,\n\ttinyint,\n\tvarbinary,\n\tvarchar,\n\tvector,\n\tyear,\n} from 'drizzle-orm/singlestore-core';\nimport getPort from 'get-port';\nimport { Connection, createConnection } from 'mysql2/promise';\nimport { diffTestSchemasPushSingleStore, diffTestSchemasSingleStore } from 'tests/schemaDiffer';\nimport { v4 as uuid } from 'uuid';\nimport { expect } from 'vitest';\nimport { DialectSuite, run } from './common';\n\nasync function createDockerDB(context: any): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'ghcr.io/singlestore-labs/singlestoredb-dev:latest';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tcontext.singlestoreContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['ROOT_PASSWORD=singlestore'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait context.singlestoreContainer.start();\n\tawait new Promise((resolve) => setTimeout(resolve, 4000));\n\n\treturn `singlestore://root:singlestore@localhost:${port}/`;\n}\n\nconst singlestoreSuite: DialectSuite = {\n\tallTypes: async function(context: any): Promise<void> {\n\t\tconst schema1 = {\n\t\t\tallBigInts: singlestoreTable('all_big_ints', {\n\t\t\t\tsimple: bigint('simple', { mode: 'number' }),\n\t\t\t\tcolumnNotNull: bigint('column_not_null', { mode: 'number' }).notNull(),\n\t\t\t\tcolumnDefault: bigint('column_default', { mode: 'number' }).default(12),\n\t\t\t\tcolumnDefaultSql: bigint('column_default_sql', {\n\t\t\t\t\tmode: 'number',\n\t\t\t\t}).default(12),\n\t\t\t}),\n\t\t\tallBools: singlestoreTable('all_bools', {\n\t\t\t\tsimple: tinyint('simple'),\n\t\t\t\tcolumnNotNull: tinyint('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: tinyint('column_default').default(1),\n\t\t\t}),\n\t\t\tallChars: singlestoreTable('all_chars', {\n\t\t\t\tsimple: char('simple', { length: 1 }),\n\t\t\t\tcolumnNotNull: char('column_not_null', { length: 45 }).notNull(),\n\t\t\t\t// columnDefault: char(\"column_default\", { length: 1 }).default(\"h\"),\n\t\t\t\tcolumnDefaultSql: char('column_default_sql', { length: 1 }).default(\n\t\t\t\t\t'h',\n\t\t\t\t),\n\t\t\t}),\n\t\t\t//   allDateTimes: singlestoreTable(\"all_date_times\", {\n\t\t\t//     simple: datetime(\"simple\", { mode: \"string\", fsp: 1 }),\n\t\t\t//     columnNotNull: datetime(\"column_not_null\", {\n\t\t\t//       mode: \"string\",\n\t\t\t//     }).notNull(),\n\t\t\t//     columnDefault: datetime(\"column_default\", { mode: \"string\" }).default(\n\t\t\t//       \"2023-03-01 14:05:29\"\n\t\t\t//     ),\n\t\t\t//   }),\n\t\t\tallDates: singlestoreTable('all_dates', {\n\t\t\t\tsimple: date('simple', { mode: 'string' }),\n\t\t\t\tcolumn_not_null: date('column_not_null', { mode: 'string' }).notNull(),\n\t\t\t\tcolumn_default: date('column_default', { mode: 'string' }).default(\n\t\t\t\t\t'2023-03-01',\n\t\t\t\t),\n\t\t\t}),\n\t\t\tallDecimals: singlestoreTable('all_decimals', {\n\t\t\t\tsimple: decimal('simple', { precision: 1, scale: 0 }),\n\t\t\t\tcolumnNotNull: decimal('column_not_null', {\n\t\t\t\t\tprecision: 45,\n\t\t\t\t\tscale: 3,\n\t\t\t\t}).notNull(),\n\t\t\t\tcolumnDefault: decimal('column_default', {\n\t\t\t\t\tprecision: 10,\n\t\t\t\t\tscale: 0,\n\t\t\t\t}).default('100'),\n\t\t\t\tcolumnDefaultSql: decimal('column_default_sql', {\n\t\t\t\t\tprecision: 10,\n\t\t\t\t\tscale: 0,\n\t\t\t\t}).default('101'),\n\t\t\t}),\n\n\t\t\tallDoubles: singlestoreTable('all_doubles', {\n\t\t\t\tsimple: double('simple'),\n\t\t\t\tcolumnNotNull: double('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: double('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: double('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\tallEnums: singlestoreTable('all_enums', {\n\t\t\t\tsimple: singlestoreEnum('simple', ['hi', 'hello']),\n\t\t\t}),\n\n\t\t\tallEnums1: singlestoreTable('all_enums1', {\n\t\t\t\tsimple: singlestoreEnum('simple', ['hi', 'hello']).default('hi'),\n\t\t\t}),\n\n\t\t\tallFloats: singlestoreTable('all_floats', {\n\t\t\t\tcolumnNotNull: float('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: float('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: float('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\tallInts: singlestoreTable('all_ints', {\n\t\t\t\tsimple: int('simple'),\n\t\t\t\tcolumnNotNull: int('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: int('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: int('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\tallIntsRef: singlestoreTable('all_ints_ref', {\n\t\t\t\tsimple: int('simple'),\n\t\t\t\tcolumnNotNull: int('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: int('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: int('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\t//   allJsons: singlestoreTable(\"all_jsons\", {\n\t\t\t//     columnDefaultObject: json(\"column_default_object\")\n\t\t\t//       .default({ hello: \"world world\" })\n\t\t\t//       .notNull(),\n\t\t\t//     columnDefaultArray: json(\"column_default_array\").default({\n\t\t\t//       hello: { \"world world\": [\"foo\", \"bar\"] },\n\t\t\t//       foo: \"bar\",\n\t\t\t//       fe: 23,\n\t\t\t//     }),\n\t\t\t//     column: json(\"column\"),\n\t\t\t//   }),\n\n\t\t\tallMInts: singlestoreTable('all_m_ints', {\n\t\t\t\tsimple: mediumint('simple'),\n\t\t\t\tcolumnNotNull: mediumint('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: mediumint('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: mediumint('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\tallReals: singlestoreTable('all_reals', {\n\t\t\t\tsimple: double('simple', { precision: 5, scale: 2 }),\n\t\t\t\tcolumnNotNull: double('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: double('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: double('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\tallSInts: singlestoreTable('all_s_ints', {\n\t\t\t\tsimple: smallint('simple'),\n\t\t\t\tcolumnNotNull: smallint('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: smallint('column_default').default(100),\n\t\t\t\tcolumnDefaultSql: smallint('column_default_sql').default(101),\n\t\t\t}),\n\n\t\t\t//   allSmallSerials: singlestoreTable(\"all_small_serials\", {\n\t\t\t//     columnAll: serial(\"column_all\").notNull(),\n\t\t\t//   }),\n\n\t\t\tallTInts: singlestoreTable('all_t_ints', {\n\t\t\t\tsimple: tinyint('simple'),\n\t\t\t\tcolumnNotNull: tinyint('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: tinyint('column_default').default(10),\n\t\t\t\tcolumnDefaultSql: tinyint('column_default_sql').default(11),\n\t\t\t}),\n\n\t\t\tallTexts: singlestoreTable('all_texts', {\n\t\t\t\tsimple: text('simple'),\n\t\t\t\tcolumnNotNull: text('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: text('column_default').default('hello'),\n\t\t\t\tcolumnDefaultSql: text('column_default_sql').default('hello'),\n\t\t\t}),\n\n\t\t\tallTimes: singlestoreTable('all_times', {\n\t\t\t\t// simple: time(\"simple\", { fsp: 1 }),\n\t\t\t\tcolumnNotNull: time('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: time('column_default').default('22:12:12'),\n\t\t\t}),\n\n\t\t\tallTimestamps: singlestoreTable('all_timestamps', {\n\t\t\t\t// columnDateNow: timestamp(\"column_date_now\", {\n\t\t\t\t//   fsp: 1,\n\t\t\t\t//   mode: \"string\",\n\t\t\t\t// }).default(sql`(now())`),\n\t\t\t\tcolumnAll: timestamp('column_all', { mode: 'string' })\n\t\t\t\t\t.default('2023-03-01 14:05:29')\n\t\t\t\t\t.notNull(),\n\t\t\t\tcolumn: timestamp('column', { mode: 'string' }).default(\n\t\t\t\t\t'2023-02-28 16:18:31',\n\t\t\t\t),\n\t\t\t}),\n\n\t\t\tallVarChars: singlestoreTable('all_var_chars', {\n\t\t\t\tsimple: varchar('simple', { length: 100 }),\n\t\t\t\tcolumnNotNull: varchar('column_not_null', { length: 45 }).notNull(),\n\t\t\t\tcolumnDefault: varchar('column_default', { length: 100 }).default(\n\t\t\t\t\t'hello',\n\t\t\t\t),\n\t\t\t\tcolumnDefaultSql: varchar('column_default_sql', {\n\t\t\t\t\tlength: 100,\n\t\t\t\t}).default('hello'),\n\t\t\t}),\n\n\t\t\tallVarbinaries: singlestoreTable('all_varbinaries', {\n\t\t\t\tsimple: varbinary('simple', { length: 100 }),\n\t\t\t\tcolumnNotNull: varbinary('column_not_null', { length: 100 }).notNull(),\n\t\t\t\tcolumnDefault: varbinary('column_default', { length: 12 }),\n\t\t\t}),\n\n\t\t\tallYears: singlestoreTable('all_years', {\n\t\t\t\tsimple: year('simple'),\n\t\t\t\tcolumnNotNull: year('column_not_null').notNull(),\n\t\t\t\tcolumnDefault: year('column_default').default(2022),\n\t\t\t}),\n\n\t\t\tbinafry: singlestoreTable('binary', {\n\t\t\t\tsimple: binary('simple', { length: 1 }),\n\t\t\t\tcolumnNotNull: binary('column_not_null', { length: 1 }).notNull(),\n\t\t\t\tcolumnDefault: binary('column_default', { length: 12 }),\n\t\t\t}),\n\n\t\t\tallVectors: singlestoreTable('all_vectors', {\n\t\t\t\tvectorSimple: vector('vector_simple', { dimensions: 1 }),\n\t\t\t\tvectorElementType: vector('vector_element_type', { dimensions: 1, elementType: 'I8' }),\n\t\t\t\tvectorNotNull: vector('vector_not_null', { dimensions: 1 }).notNull(),\n\t\t\t\tvectorDefault: vector('vector_default', { dimensions: 1 }).default([1]),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements } = await diffTestSchemasPushSingleStore(\n\t\t\tcontext.client as Connection,\n\t\t\tschema1,\n\t\t\tschema1,\n\t\t\t[],\n\t\t\t'drizzle',\n\t\t\tfalse,\n\t\t);\n\t\tconsole.log(statements);\n\t\texpect(statements.length).toBe(0);\n\t\texpect(statements).toEqual([]);\n\n\t\tconst { sqlStatements: dropStatements } = await diffTestSchemasSingleStore(\n\t\t\tschema1,\n\t\t\t{},\n\t\t\t[],\n\t\t\tfalse,\n\t\t);\n\n\t\tfor (const st of dropStatements) {\n\t\t\tawait context.client.query(st);\n\t\t}\n\t},\n\taddBasicIndexes: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tchangeIndexFields: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tdropIndex: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tindexesToBeNotTriggered: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tindexesTestCase1: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tasync case1() {\n\t\t// TODO: implement if needed\n\t\texpect(true).toBe(true);\n\t},\n\taddNotNull: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\taddNotNullWithDataNoRollback: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\taddBasicSequences: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\taddGeneratedColumn: async function(context: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\taddGeneratedToColumn: async function(context: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tdropGeneratedConstraint: async function(context: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\talterGeneratedConstraint: async function(context: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tcreateTableWithGeneratedConstraint: function(context?: any): Promise<void> {\n\t\treturn {} as any;\n\t},\n\tcreateCompositePrimaryKey: async function(context: any): Promise<void> {\n\t\tconst schema1 = {};\n\n\t\tconst schema2 = {\n\t\t\ttable: singlestoreTable('table', {\n\t\t\t\tcol1: int('col1').notNull(),\n\t\t\t\tcol2: int('col2').notNull(),\n\t\t\t}, (t) => ({\n\t\t\t\tpk: primaryKey({\n\t\t\t\t\tcolumns: [t.col1, t.col2],\n\t\t\t\t}),\n\t\t\t})),\n\t\t};\n\n\t\tconst { statements, sqlStatements } = await diffTestSchemasPushSingleStore(\n\t\t\tcontext.client as Connection,\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t[],\n\t\t\t'drizzle',\n\t\t\tfalse,\n\t\t);\n\n\t\texpect(statements).toStrictEqual([\n\t\t\t{\n\t\t\t\ttype: 'create_table',\n\t\t\t\ttableName: 'table',\n\t\t\t\tschema: undefined,\n\t\t\t\tinternals: {\n\t\t\t\t\tindexes: {},\n\t\t\t\t\ttables: {},\n\t\t\t\t},\n\t\t\t\tcompositePKs: ['table_col1_col2_pk;col1,col2'],\n\t\t\t\tcompositePkName: 'table_col1_col2_pk',\n\t\t\t\tuniqueConstraints: [],\n\t\t\t\tcolumns: [\n\t\t\t\t\t{ name: 'col1', type: 'int', primaryKey: false, notNull: true, autoincrement: false },\n\t\t\t\t\t{ name: 'col2', type: 'int', primaryKey: false, notNull: true, autoincrement: false },\n\t\t\t\t],\n\t\t\t},\n\t\t]);\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t'CREATE TABLE `table` (\\n\\t`col1` int NOT NULL,\\n\\t`col2` int NOT NULL,\\n\\tCONSTRAINT `table_col1_col2_pk` PRIMARY KEY(`col1`,`col2`)\\n);\\n',\n\t\t]);\n\t},\n\trenameTableWithCompositePrimaryKey: async function(context?: any): Promise<void> {\n\t\tconst productsCategoriesTable = (tableName: string) => {\n\t\t\treturn singlestoreTable(tableName, {\n\t\t\t\tproductId: varchar('product_id', { length: 10 }).notNull(),\n\t\t\t\tcategoryId: varchar('category_id', { length: 10 }).notNull(),\n\t\t\t}, (t) => ({\n\t\t\t\tpk: primaryKey({\n\t\t\t\t\tcolumns: [t.productId, t.categoryId],\n\t\t\t\t}),\n\t\t\t}));\n\t\t};\n\n\t\tconst schema1 = {\n\t\t\ttable: productsCategoriesTable('products_categories'),\n\t\t};\n\t\tconst schema2 = {\n\t\t\ttest: productsCategoriesTable('products_to_categories'),\n\t\t};\n\n\t\tconst { sqlStatements } = await diffTestSchemasPushSingleStore(\n\t\t\tcontext.client as Connection,\n\t\t\tschema1,\n\t\t\tschema2,\n\t\t\t['public.products_categories->public.products_to_categories'],\n\t\t\t'drizzle',\n\t\t\tfalse,\n\t\t);\n\n\t\t// It's not possible to create/alter/drop primary keys in SingleStore\n\t\texpect(sqlStatements).toStrictEqual([\n\t\t\t'ALTER TABLE `products_categories` RENAME TO `products_to_categories`;',\n\t\t]);\n\n\t\tawait context.client.query(`DROP TABLE \\`products_categories\\``);\n\t},\n};\n\nrun(\n\tsinglestoreSuite,\n\tasync (context: any) => {\n\t\tconst connectionString = process.env.SINGLESTORE_CONNECTION_STRING\n\t\t\t?? (await createDockerDB(context));\n\n\t\tconst sleep = 1000;\n\t\tlet timeLeft = 20000;\n\t\tlet connected = false;\n\t\tlet lastError: unknown | undefined;\n\t\tdo {\n\t\t\ttry {\n\t\t\t\tcontext.client = await createConnection(connectionString);\n\t\t\t\tawait context.client.connect();\n\t\t\t\tconnected = true;\n\t\t\t\tbreak;\n\t\t\t} catch (e) {\n\t\t\t\tlastError = e;\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\t\ttimeLeft -= sleep;\n\t\t\t}\n\t\t} while (timeLeft > 0);\n\t\tif (!connected) {\n\t\t\tconsole.error('Cannot connect to SingleStore');\n\t\t\tawait context.client?.end().catch(console.error);\n\t\t\tawait context.singlestoreContainer?.stop().catch(console.error);\n\t\t\tthrow lastError;\n\t\t}\n\n\t\tawait context.client.query(`DROP DATABASE IF EXISTS \\`drizzle\\`;`);\n\t\tawait context.client.query('CREATE DATABASE drizzle;');\n\t\tawait context.client.query('USE drizzle;');\n\t},\n\tasync (context: any) => {\n\t\tawait context.client?.end().catch(console.error);\n\t\tawait context.singlestoreContainer?.stop().catch(console.error);\n\t},\n);\n"
  },
  {
    "path": "drizzle-kit/tests/push/sqlite.test.ts",
    "content": "import Database from 'better-sqlite3';\nimport chalk from 'chalk';\nimport { sql } from 'drizzle-orm';\nimport {\n\tblob,\n\tcheck,\n\tforeignKey,\n\tgetTableConfig,\n\tint,\n\tinteger,\n\tnumeric,\n\tprimaryKey,\n\treal,\n\tsqliteTable,\n\tsqliteView,\n\ttext,\n\tuniqueIndex,\n} from 'drizzle-orm/sqlite-core';\nimport { diffTestSchemasPushSqlite, introspectSQLiteToFile } from 'tests/schemaDiffer';\nimport { expect, test } from 'vitest';\n\ntest('nothing changed in schema', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tconst users = sqliteTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t\tname: text('name').notNull(),\n\t\temail: text('email'),\n\t\ttextJson: text('text_json', { mode: 'json' }),\n\t\tblobJon: blob('blob_json', { mode: 'json' }),\n\t\tblobBigInt: blob('blob_bigint', { mode: 'bigint' }),\n\t\tnumeric: numeric('numeric'),\n\t\tcreatedAt: integer('created_at', { mode: 'timestamp' }),\n\t\tcreatedAtMs: integer('created_at_ms', { mode: 'timestamp_ms' }),\n\t\treal: real('real'),\n\t\ttext: text('text', { length: 255 }),\n\t\trole: text('role', { enum: ['admin', 'user'] }).default('user'),\n\t\tisConfirmed: integer('is_confirmed', {\n\t\t\tmode: 'boolean',\n\t\t}),\n\t});\n\n\tconst schema1 = {\n\t\tusers,\n\n\t\tcustomers: sqliteTable('customers', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\taddress: text('address').notNull(),\n\t\t\tisConfirmed: integer('is_confirmed', { mode: 'boolean' }),\n\t\t\tregistrationDate: integer('registration_date', { mode: 'timestamp_ms' })\n\t\t\t\t.notNull()\n\t\t\t\t.$defaultFn(() => new Date()),\n\t\t\tuserId: integer('user_id')\n\t\t\t\t.references(() => users.id)\n\t\t\t\t.notNull(),\n\t\t}),\n\n\t\tposts: sqliteTable('posts', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tcontent: text('content'),\n\t\t\tauthorId: integer('author_id'),\n\t\t}),\n\t};\n\n\tconst {\n\t\tsqlStatements,\n\t\tstatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(client, schema1, schema1, [], false);\n\n\texpect(sqlStatements.length).toBe(0);\n\texpect(statements.length).toBe(0);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n});\n\ntest('dropped, added unique index', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tconst users = sqliteTable('users', {\n\t\tid: integer('id').primaryKey().notNull(),\n\t\tname: text('name').notNull(),\n\t\temail: text('email'),\n\t\ttextJson: text('text_json', { mode: 'json' }),\n\t\tblobJon: blob('blob_json', { mode: 'json' }),\n\t\tblobBigInt: blob('blob_bigint', { mode: 'bigint' }),\n\t\tnumeric: numeric('numeric'),\n\t\tcreatedAt: integer('created_at', { mode: 'timestamp' }),\n\t\tcreatedAtMs: integer('created_at_ms', { mode: 'timestamp_ms' }),\n\t\treal: real('real'),\n\t\ttext: text('text', { length: 255 }),\n\t\trole: text('role', { enum: ['admin', 'user'] }).default('user'),\n\t\tisConfirmed: integer('is_confirmed', {\n\t\t\tmode: 'boolean',\n\t\t}),\n\t});\n\n\tconst schema1 = {\n\t\tusers,\n\n\t\tcustomers: sqliteTable(\n\t\t\t'customers',\n\t\t\t{\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\taddress: text('address').notNull().unique(),\n\t\t\t\tisConfirmed: integer('is_confirmed', { mode: 'boolean' }),\n\t\t\t\tregistrationDate: integer('registration_date', { mode: 'timestamp_ms' })\n\t\t\t\t\t.notNull()\n\t\t\t\t\t.$defaultFn(() => new Date()),\n\t\t\t\tuserId: integer('user_id').notNull(),\n\t\t\t},\n\t\t\t(table) => ({\n\t\t\t\tuniqueIndex: uniqueIndex('customers_address_unique').on(table.address),\n\t\t\t}),\n\t\t),\n\n\t\tposts: sqliteTable('posts', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tcontent: text('content'),\n\t\t\tauthorId: integer('author_id'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers,\n\n\t\tcustomers: sqliteTable(\n\t\t\t'customers',\n\t\t\t{\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\taddress: text('address').notNull(),\n\t\t\t\tisConfirmed: integer('is_confirmed', { mode: 'boolean' }),\n\t\t\t\tregistrationDate: integer('registration_date', { mode: 'timestamp_ms' })\n\t\t\t\t\t.notNull()\n\t\t\t\t\t.$defaultFn(() => new Date()),\n\t\t\t\tuserId: integer('user_id').notNull(),\n\t\t\t},\n\t\t\t(table) => ({\n\t\t\t\tuniqueIndex: uniqueIndex('customers_is_confirmed_unique').on(\n\t\t\t\t\ttable.isConfirmed,\n\t\t\t\t),\n\t\t\t}),\n\t\t),\n\n\t\tposts: sqliteTable('posts', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tcontent: text('content'),\n\t\t\tauthorId: integer('author_id'),\n\t\t}),\n\t};\n\n\tconst {\n\t\tsqlStatements,\n\t\tstatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(client, schema1, schema2, [], false);\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'drop_index',\n\t\ttableName: 'customers',\n\t\tdata: 'customers_address_unique;address;true;',\n\t\tschema: '',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_index',\n\t\ttableName: 'customers',\n\t\tdata: 'customers_is_confirmed_unique;is_confirmed;true;',\n\t\tschema: '',\n\t\tinternal: {\n\t\t\tindexes: {},\n\t\t},\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`DROP INDEX \\`customers_address_unique\\`;`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE UNIQUE INDEX \\`customers_is_confirmed_unique\\` ON \\`customers\\` (\\`is_confirmed\\`);`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('added column not null and without default to table with data', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tconst schema1 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t\tage: integer('age').notNull(),\n\t\t}),\n\t};\n\n\tconst table = getTableConfig(schema1.companies);\n\tconst seedStatements = [\n\t\t`INSERT INTO \\`${table.name}\\` (\"${schema1.companies.name.name}\") VALUES ('drizzle');`,\n\t\t`INSERT INTO \\`${table.name}\\` (\"${schema1.companies.name.name}\") VALUES ('turso');`,\n\t];\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\tseedStatements,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'companies',\n\t\tcolumn: {\n\t\t\tname: 'age',\n\t\t\ttype: 'integer',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: true,\n\t\t\tautoincrement: false,\n\t\t},\n\t\treferenceData: undefined,\n\t});\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`delete from companies;`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`ALTER TABLE \\`companies\\` ADD \\`age\\` integer NOT NULL;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(1);\n\texpect(infoToPrint![0]).toBe(\n\t\t`· You're about to add not-null ${\n\t\t\tchalk.underline(\n\t\t\t\t'age',\n\t\t\t)\n\t\t} column without default value, which contains 2 items`,\n\t);\n\texpect(shouldAskForApprove).toBe(true);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(1);\n\texpect(tablesToTruncate![0]).toBe('companies');\n});\n\ntest('added column not null and without default to table without data', async (t) => {\n\tconst turso = new Database(':memory:');\n\n\tconst schema1 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t\tage: integer('age').notNull(),\n\t\t}),\n\t};\n\n\tconst {\n\t\tsqlStatements,\n\t\tstatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(turso, schema1, schema2, [], false);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'companies',\n\t\tcolumn: {\n\t\t\tname: 'age',\n\t\t\ttype: 'integer',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: true,\n\t\t\tautoincrement: false,\n\t\t},\n\t\treferenceData: undefined,\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`ALTER TABLE \\`companies\\` ADD \\`age\\` integer NOT NULL;`,\n\t);\n\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('drop autoincrement. drop column with data', async (t) => {\n\tconst turso = new Database(':memory:');\n\n\tconst schema1 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: false }),\n\t\t}),\n\t};\n\n\tconst table = getTableConfig(schema1.companies);\n\tconst seedStatements = [\n\t\t`INSERT INTO \\`${table.name}\\` (\"${schema1.companies.id.name}\", \"${schema1.companies.name.name}\") VALUES (1, 'drizzle');`,\n\t\t`INSERT INTO \\`${table.name}\\` (\"${schema1.companies.id.name}\", \"${schema1.companies.name.name}\") VALUES (2, 'turso');`,\n\t];\n\n\tconst {\n\t\tsqlStatements,\n\t\tstatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(\n\t\tturso,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\tseedStatements,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\ttableName: 'companies',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\ttype: 'integer',\n\t\t\t\tautoincrement: false,\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(\n\t\t`CREATE TABLE \\`__new_companies\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL\n);\\n`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`INSERT INTO \\`__new_companies\\`(\"id\") SELECT \"id\" FROM \\`companies\\`;`,\n\t);\n\texpect(sqlStatements[2]).toBe(`DROP TABLE \\`companies\\`;`);\n\texpect(sqlStatements[3]).toBe(\n\t\t`ALTER TABLE \\`__new_companies\\` RENAME TO \\`companies\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(1);\n\texpect(columnsToRemove![0]).toBe('name');\n\texpect(infoToPrint!.length).toBe(1);\n\texpect(infoToPrint![0]).toBe(\n\t\t`· You're about to delete ${\n\t\t\tchalk.underline(\n\t\t\t\t'name',\n\t\t\t)\n\t\t} column in companies table with 2 items`,\n\t);\n\texpect(shouldAskForApprove).toBe(true);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('drop autoincrement. drop column with data with pragma off', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tclient.exec('PRAGMA foreign_keys=OFF;');\n\n\tconst users = sqliteTable('users', {\n\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t});\n\tconst schema1 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t\tuser_id: integer('user_id').references(() => users.id),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tcompanies: sqliteTable('companies', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: false }),\n\t\t\tuser_id: integer('user_id').references(() => users.id),\n\t\t}),\n\t};\n\n\tconst table = getTableConfig(schema1.companies);\n\tconst seedStatements = [\n\t\t`INSERT INTO \\`${table.name}\\` (\"${schema1.companies.id.name}\", \"${schema1.companies.name.name}\") VALUES (1, 'drizzle');`,\n\t\t`INSERT INTO \\`${table.name}\\` (\"${schema1.companies.id.name}\", \"${schema1.companies.name.name}\") VALUES (2, 'turso');`,\n\t];\n\n\tconst {\n\t\tsqlStatements,\n\t\tstatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\tseedStatements,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\ttableName: 'companies',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\ttype: 'integer',\n\t\t\t\tautoincrement: false,\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'user_id',\n\t\t\t\ttype: 'integer',\n\t\t\t\tautoincrement: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [\n\t\t\t{\n\t\t\t\tcolumnsFrom: [\n\t\t\t\t\t'user_id',\n\t\t\t\t],\n\t\t\t\tcolumnsTo: [\n\t\t\t\t\t'id',\n\t\t\t\t],\n\t\t\t\tname: '',\n\t\t\t\tonDelete: 'no action',\n\t\t\t\tonUpdate: 'no action',\n\t\t\t\ttableFrom: 'companies',\n\t\t\t\ttableTo: 'users',\n\t\t\t},\n\t\t],\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(\n\t\t`CREATE TABLE \\`__new_companies\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`user_id\\` integer,\n\\tFOREIGN KEY (\\`user_id\\`) REFERENCES \\`users\\`(\\`id\\`) ON UPDATE no action ON DELETE no action\n);\\n`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`INSERT INTO \\`__new_companies\\`(\"id\", \"user_id\") SELECT \"id\", \"user_id\" FROM \\`companies\\`;`,\n\t);\n\texpect(sqlStatements[2]).toBe(`DROP TABLE \\`companies\\`;`);\n\texpect(sqlStatements[3]).toBe(\n\t\t`ALTER TABLE \\`__new_companies\\` RENAME TO \\`companies\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(1);\n\texpect(infoToPrint!.length).toBe(1);\n\texpect(infoToPrint![0]).toBe(\n\t\t`· You're about to delete ${\n\t\t\tchalk.underline(\n\t\t\t\t'name',\n\t\t\t)\n\t\t} column in companies table with 2 items`,\n\t);\n\texpect(shouldAskForApprove).toBe(true);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('change autoincrement. other table references current', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tconst companies1 = sqliteTable('companies', {\n\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t});\n\tconst users1 = sqliteTable('users', {\n\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\tname: text('name').unique(),\n\t\tcompanyId: text('company_id').references(() => companies1.id),\n\t});\n\tconst schema1 = {\n\t\tcompanies: companies1,\n\t\tusers: users1,\n\t};\n\n\tconst companies2 = sqliteTable('companies', {\n\t\tid: integer('id').primaryKey({ autoIncrement: false }),\n\t});\n\tconst users2 = sqliteTable('users', {\n\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\tname: text('name').unique(),\n\t\tcompanyId: text('company_id').references(() => companies1.id),\n\t});\n\tconst schema2 = {\n\t\tcompanies: companies2,\n\t\tusers: users2,\n\t};\n\n\tconst { name: usersTableName } = getTableConfig(users1);\n\tconst { name: companiesTableName } = getTableConfig(companies1);\n\tconst seedStatements = [\n\t\t`INSERT INTO \\`${usersTableName}\\` (\"${schema1.users.name.name}\") VALUES ('drizzle');`,\n\t\t`INSERT INTO \\`${usersTableName}\\` (\"${schema1.users.name.name}\") VALUES ('turso');`,\n\t\t`INSERT INTO \\`${companiesTableName}\\` (\"${schema1.companies.id.name}\") VALUES ('1');`,\n\t\t`INSERT INTO \\`${companiesTableName}\\` (\"${schema1.companies.id.name}\") VALUES ('2');`,\n\t];\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\tseedStatements,\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\ttableName: 'companies',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\ttype: 'integer',\n\t\t\t\tautoincrement: false,\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE TABLE \\`__new_companies\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL\n);\\n`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t`INSERT INTO \\`__new_companies\\`(\"id\") SELECT \"id\" FROM \\`companies\\`;`,\n\t);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`companies\\`;`);\n\texpect(sqlStatements[4]).toBe(\n\t\t`ALTER TABLE \\`__new_companies\\` RENAME TO \\`companies\\`;`,\n\t);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('create table with custom name references', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\tname: text('name').notNull(),\n\t});\n\n\tconst schema1 = {\n\t\tusers,\n\t\tposts: sqliteTable(\n\t\t\t'posts',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\t\tname: text('name'),\n\t\t\t\tuserId: int('user_id'),\n\t\t\t},\n\t\t\t(t) => ({\n\t\t\t\tfk: foreignKey({\n\t\t\t\t\tcolumns: [t.id],\n\t\t\t\t\tforeignColumns: [users.id],\n\t\t\t\t\tname: 'custom_name_fk',\n\t\t\t\t}),\n\t\t\t}),\n\t\t),\n\t};\n\n\tconst schema2 = {\n\t\tusers,\n\t\tposts: sqliteTable(\n\t\t\t'posts',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\t\tname: text('name'),\n\t\t\t\tuserId: int('user_id'),\n\t\t\t},\n\t\t\t(t) => ({\n\t\t\t\tfk: foreignKey({\n\t\t\t\t\tcolumns: [t.id],\n\t\t\t\t\tforeignColumns: [users.id],\n\t\t\t\t\tname: 'custom_name_fk',\n\t\t\t\t}),\n\t\t\t}),\n\t\t),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasPushSqlite(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(sqlStatements!.length).toBe(0);\n});\n\ntest('drop not null, add not null', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t\tposts: sqliteTable('posts', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t\tuserId: int('user_id'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t\tposts: sqliteTable('posts', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t\tuserId: int('user_id'),\n\t\t}),\n\t};\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(client, schema1, schema2, []);\n\n\texpect(statements!.length).toBe(2);\n\texpect(statements![0]).toStrictEqual({\n\t\tcheckConstraints: [],\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t});\n\texpect(statements![1]).toStrictEqual({\n\t\tcheckConstraints: [],\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'user_id',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'posts',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(8);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\\t\\`name\\` text\n);\\n`);\n\texpect(sqlStatements[1]).toBe(\n\t\t`INSERT INTO \\`__new_users\\`(\"id\", \"name\") SELECT \"id\", \"name\" FROM \\`users\\`;`,\n\t);\n\texpect(sqlStatements[2]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[3]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\n\texpect(sqlStatements![4]).toBe(`CREATE TABLE \\`__new_posts\\` (\n\\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\\t\\`name\\` text NOT NULL,\n\\t\\`user_id\\` integer\n);\\n`);\n\texpect(sqlStatements![5]).toBe(\n\t\t`INSERT INTO \\`__new_posts\\`(\"id\", \"name\", \"user_id\") SELECT \"id\", \"name\", \"user_id\" FROM \\`posts\\`;`,\n\t);\n\texpect(sqlStatements![6]).toBe(`DROP TABLE \\`posts\\`;`);\n\texpect(sqlStatements![7]).toBe(\n\t\t`ALTER TABLE \\`__new_posts\\` RENAME TO \\`posts\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('rename table and change data type', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('old_users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tage: text('age'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('new_users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tage: integer('age'),\n\t\t}),\n\t};\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(client, schema1, schema2, [\n\t\t'public.old_users->public.new_users',\n\t]);\n\n\texpect(statements!.length).toBe(2);\n\texpect(statements![0]).toStrictEqual({\n\t\tfromSchema: undefined,\n\t\ttableNameFrom: 'old_users',\n\t\ttableNameTo: 'new_users',\n\t\ttoSchema: undefined,\n\t\ttype: 'rename_table',\n\t});\n\texpect(statements![1]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: true,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'new_users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements!.length).toBe(5);\n\texpect(sqlStatements![0]).toBe(\n\t\t`ALTER TABLE \\`old_users\\` RENAME TO \\`new_users\\`;`,\n\t);\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\\t\\`age\\` integer\n);\\n`);\n\texpect(sqlStatements![2]).toBe(\n\t\t`INSERT INTO \\`__new_new_users\\`(\"id\", \"age\") SELECT \"id\", \"age\" FROM \\`new_users\\`;`,\n\t);\n\texpect(sqlStatements![3]).toBe(`DROP TABLE \\`new_users\\`;`);\n\texpect(sqlStatements![4]).toBe(\n\t\t`ALTER TABLE \\`__new_new_users\\` RENAME TO \\`new_users\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('rename column and change data type', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tage: integer('age'),\n\t\t}),\n\t};\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(client, schema1, schema2, [\n\t\t'public.users.name->public.users.age',\n\t]);\n\n\texpect(statements!.length).toBe(1);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: true,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements!.length).toBe(4);\n\texpect(sqlStatements![0]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\\t\\`age\\` integer\n);\\n`);\n\texpect(sqlStatements![1]).toBe(\n\t\t`INSERT INTO \\`__new_users\\`(\"id\", \"age\") SELECT \"id\", \"age\" FROM \\`users\\`;`,\n\t);\n\texpect(sqlStatements![2]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements![3]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('recreate table with nested references', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tlet users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\tname: text('name'),\n\t\tage: integer('age'),\n\t});\n\tlet subscriptions = sqliteTable('subscriptions', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\tuserId: integer('user_id').references(() => users.id),\n\t\tcustomerId: text('customer_id'),\n\t});\n\tconst schema1 = {\n\t\tusers: users,\n\t\tsubscriptions: subscriptions,\n\t\tsubscriptionMetadata: sqliteTable('subscriptions_metadata', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tsubscriptionId: text('subscription_id').references(\n\t\t\t\t() => subscriptions.id,\n\t\t\t),\n\t\t}),\n\t};\n\n\tusers = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\tname: text('name'),\n\t\tage: integer('age'),\n\t});\n\tconst schema2 = {\n\t\tusers: users,\n\t\tsubscriptions: subscriptions,\n\t\tsubscriptionMetadata: sqliteTable('subscriptions_metadata', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tsubscriptionId: text('subscription_id').references(\n\t\t\t\t() => subscriptions.id,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(client, schema1, schema2, [\n\t\t'public.users.name->public.users.age',\n\t]);\n\n\texpect(statements!.length).toBe(1);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements!.length).toBe(6);\n\texpect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;');\n\texpect(sqlStatements![1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`name\\` text,\n\\t\\`age\\` integer\n);\\n`);\n\texpect(sqlStatements![2]).toBe(\n\t\t`INSERT INTO \\`__new_users\\`(\"id\", \"name\", \"age\") SELECT \"id\", \"name\", \"age\" FROM \\`users\\`;`,\n\t);\n\texpect(sqlStatements![3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements![4]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\texpect(sqlStatements[5]).toBe('PRAGMA foreign_keys=ON;');\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('recreate table with added column not null and without default with data', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t\tnewColumn: text('new_column').notNull(),\n\t\t}),\n\t};\n\n\tconst seedStatements = [\n\t\t`INSERT INTO \\`users\\` (\"name\", \"age\") VALUES ('drizzle', 12)`,\n\t\t`INSERT INTO \\`users\\` (\"name\", \"age\") VALUES ('turso', 12)`,\n\t];\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\tseedStatements,\n\t);\n\n\texpect(statements!.length).toBe(1);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'new_column',\n\t\t\t\tnotNull: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements!.length).toBe(4);\n\texpect(sqlStatements[0]).toBe('DELETE FROM \\`users\\`;');\n\texpect(sqlStatements![1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`name\\` text,\n\\t\\`age\\` integer,\n\\t\\`new_column\\` text NOT NULL\n);\\n`);\n\texpect(sqlStatements![2]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements![3]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(1);\n\texpect(infoToPrint![0]).toBe(\n\t\t`· You're about to add not-null ${\n\t\t\tchalk.underline('new_column')\n\t\t} column without default value to table, which contains 2 items`,\n\t);\n\texpect(shouldAskForApprove).toBe(true);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(1);\n\texpect(tablesToTruncate![0]).toBe('users');\n});\n\ntest('add check constraint to table', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tsomeCheck: check('some_check', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements!.length).toBe(1);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: ['some_check;\"users\".\"age\" > 21'],\n\t});\n\n\texpect(sqlStatements!.length).toBe(4);\n\texpect(sqlStatements![0]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`name\\` text,\n\\t\\`age\\` integer,\n\\tCONSTRAINT \"some_check\" CHECK(\"__new_users\".\"age\" > 21)\n);\\n`);\n\texpect(sqlStatements[1]).toBe(\n\t\t'INSERT INTO `__new_users`(\"id\", \"name\", \"age\") SELECT \"id\", \"name\", \"age\" FROM `users`;',\n\t);\n\texpect(sqlStatements![2]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements![3]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('drop check constraint', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tsomeCheck: check('some_check', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}),\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements!.length).toBe(1);\n\texpect(statements![0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements!.length).toBe(4);\n\texpect(sqlStatements![0]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`name\\` text,\n\\t\\`age\\` integer\n);\\n`);\n\texpect(sqlStatements[1]).toBe(\n\t\t'INSERT INTO `__new_users`(\"id\", \"name\", \"age\") SELECT \"id\", \"name\", \"age\" FROM `users`;',\n\t);\n\texpect(sqlStatements![2]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements![3]).toBe(\n\t\t`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`,\n\t);\n\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('db has checks. Push with same names', async () => {\n\tconst client = new Database(':memory:');\n\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tsomeCheck: check('some_check', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\t\tname: text('name'),\n\t\t\tage: integer('age'),\n\t\t}, (table) => ({\n\t\t\tsomeCheck: check('some_check', sql`some new value`),\n\t\t})),\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t\tcolumnsToRemove,\n\t\tinfoToPrint,\n\t\tschemasToRemove,\n\t\tshouldAskForApprove,\n\t\ttablesToRemove,\n\t\ttablesToTruncate,\n\t} = await diffTestSchemasPushSqlite(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t\tfalse,\n\t\t[],\n\t);\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n\texpect(columnsToRemove!.length).toBe(0);\n\texpect(infoToPrint!.length).toBe(0);\n\texpect(shouldAskForApprove).toBe(false);\n\texpect(tablesToRemove!.length).toBe(0);\n\texpect(tablesToTruncate!.length).toBe(0);\n});\n\ntest('create view', async () => {\n\tconst client = new Database(':memory:');\n\n\tconst table = sqliteTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: sqliteView('view').as((qb) => qb.select().from(table)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushSqlite(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdefinition: 'select \"id\" from \"test\"',\n\t\t\tname: 'view',\n\t\t\ttype: 'sqlite_create_view',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`CREATE VIEW \\`view\\` AS select \"id\" from \"test\";`,\n\t]);\n});\n\ntest('drop view', async () => {\n\tconst client = new Database(':memory:');\n\n\tconst table = sqliteTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: sqliteView('view').as((qb) => qb.select().from(table)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushSqlite(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'view',\n\t\t\ttype: 'drop_view',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP VIEW \\`view\\`;',\n\t]);\n});\n\ntest('alter view \".as\"', async () => {\n\tconst client = new Database(':memory:');\n\n\tconst table = sqliteTable('test', {\n\t\tid: int('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\ttest: table,\n\t\tview: sqliteView('view').as((qb) => qb.select().from(table).where(sql`${table.id} = 1`)),\n\t};\n\n\tconst schema2 = {\n\t\ttest: table,\n\t\tview: sqliteView('view').as((qb) => qb.select().from(table)),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasPushSqlite(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('create composite primary key', async (t) => {\n\tconst client = new Database(':memory:');\n\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\ttable: sqliteTable('table', {\n\t\t\tcol1: integer('col1').notNull(),\n\t\t\tcol2: integer('col2').notNull(),\n\t\t}, (t) => ({\n\t\t\tpk: primaryKey({\n\t\t\t\tcolumns: [t.col1, t.col2],\n\t\t\t}),\n\t\t})),\n\t};\n\n\tconst {\n\t\tstatements,\n\t\tsqlStatements,\n\t} = await diffTestSchemasPushSqlite(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([{\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'table',\n\t\tcompositePKs: [['col1', 'col2']],\n\t\tuniqueConstraints: [],\n\t\treferenceData: [],\n\t\tcheckConstraints: [],\n\t\tcolumns: [\n\t\t\t{ name: 'col1', type: 'integer', primaryKey: false, notNull: true, autoincrement: false },\n\t\t\t{ name: 'col2', type: 'integer', primaryKey: false, notNull: true, autoincrement: false },\n\t\t],\n\t}]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE `table` (\\n\\t`col1` integer NOT NULL,\\n\\t`col2` integer NOT NULL,\\n\\tPRIMARY KEY(`col1`, `col2`)\\n);\\n',\n\t]);\n});\n\ntest('rename table with composite primary key', async () => {\n\tconst client = new Database(':memory:');\n\n\tconst productsCategoriesTable = (tableName: string) => {\n\t\treturn sqliteTable(tableName, {\n\t\t\tproductId: text('product_id').notNull(),\n\t\t\tcategoryId: text('category_id').notNull(),\n\t\t}, (t) => ({\n\t\t\tpk: primaryKey({\n\t\t\t\tcolumns: [t.productId, t.categoryId],\n\t\t\t}),\n\t\t}));\n\t};\n\n\tconst schema1 = {\n\t\ttable: productsCategoriesTable('products_categories'),\n\t};\n\tconst schema2 = {\n\t\ttest: productsCategoriesTable('products_to_categories'),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasPushSqlite(\n\t\tclient,\n\t\tschema1,\n\t\tschema2,\n\t\t['public.products_categories->public.products_to_categories'],\n\t\tfalse,\n\t);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `products_categories` RENAME TO `products_to_categories`;',\n\t]);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/rls/pg-policy.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { integer, pgPolicy, pgRole, pgSchema, pgTable } from 'drizzle-orm/pg-core';\nimport { diffTestSchemas } from 'tests/schemaDiffer';\nimport { expect, test } from 'vitest';\n\ntest('add policy + enable rls', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ENABLE ROW LEVEL SECURITY;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS PERMISSIVE FOR ALL TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'enable_rls',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n});\n\ntest('drop policy + disable rls', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" DISABLE ROW LEVEL SECURITY;',\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'disable_rls',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t]);\n});\n\ntest('add policy without enable rls', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t\tnewrls: pgPolicy('newRls'),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE POLICY \"newRls\" ON \"users\" AS PERMISSIVE FOR ALL TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'newRls',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n});\n\ntest('drop policy without disable rls', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t\toldRls: pgPolicy('oldRls'),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"oldRls\" ON \"users\" CASCADE;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'oldRls',\n\t\t\t\tto: ['public'],\n\t\t\t\tusing: undefined,\n\t\t\t\ton: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy without recreation: changing roles', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive', to: 'current_role' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"users\" TO current_role;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewData: 'test--PERMISSIVE--ALL--current_role--undefined--undefined--undefined',\n\t\t\toldData: 'test--PERMISSIVE--ALL--public--undefined--undefined--undefined',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy without recreation: changing using', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive', using: sql`true` }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"users\" TO public USING (true);',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewData: 'test--PERMISSIVE--ALL--public--true--undefined--undefined',\n\t\t\toldData: 'test--PERMISSIVE--ALL--public--undefined--undefined--undefined',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy without recreation: changing with check', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive', withCheck: sql`true` }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"users\" TO public WITH CHECK (true);',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewData: 'test--PERMISSIVE--ALL--public--undefined--true--undefined',\n\t\t\toldData: 'test--PERMISSIVE--ALL--public--undefined--undefined--undefined',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_policy',\n\t\t},\n\t]);\n});\n\n///\n\ntest('alter policy with recreation: changing as', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'restrictive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS RESTRICTIVE FOR ALL TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\tusing: undefined,\n\t\t\t\ton: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'RESTRICTIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy with recreation: changing for', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive', for: 'delete' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS PERMISSIVE FOR DELETE TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'DELETE',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy with recreation: changing both \"as\" and \"for\"', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'restrictive', for: 'insert' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS RESTRICTIVE FOR INSERT TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\tusing: undefined,\n\t\t\t\ton: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'RESTRICTIVE',\n\t\t\t\tfor: 'INSERT',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\tusing: undefined,\n\t\t\t\ton: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy with recreation: changing all fields', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive', for: 'select', using: sql`true` }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'restrictive', to: 'current_role', withCheck: sql`true` }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS RESTRICTIVE FOR ALL TO current_role WITH CHECK (true);',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'SELECT',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\tusing: 'true',\n\t\t\t\ton: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'RESTRICTIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\ton: undefined,\n\t\t\t\tto: ['current_role'],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: 'true',\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n});\n\ntest('rename policy', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('newName', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, [\n\t\t'public.users.test->public.users.newName',\n\t]);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"users\" RENAME TO \"newName\";',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewName: 'newName',\n\t\t\toldName: 'test',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'rename_policy',\n\t\t},\n\t]);\n});\n\ntest('rename policy in renamed table', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users2', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('newName', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, [\n\t\t'public.users->public.users2',\n\t\t'public.users2.test->public.users2.newName',\n\t]);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" RENAME TO \"users2\";',\n\t\t'ALTER POLICY \"test\" ON \"users2\" RENAME TO \"newName\";',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tfromSchema: '',\n\t\t\ttableNameFrom: 'users',\n\t\t\ttableNameTo: 'users2',\n\t\t\ttoSchema: '',\n\t\t\ttype: 'rename_table',\n\t\t},\n\t\t{\n\t\t\tnewName: 'newName',\n\t\t\toldName: 'test',\n\t\t\tschema: '',\n\t\t\ttableName: 'users2',\n\t\t\ttype: 'rename_policy',\n\t\t},\n\t]);\n});\n\ntest('create table with a policy', async (t) => {\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users2', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE \"users2\" (\\n\\t\"id\" integer PRIMARY KEY NOT NULL\\n);\\n',\n\t\t'ALTER TABLE \"users2\" ENABLE ROW LEVEL SECURITY;',\n\t\t'CREATE POLICY \"test\" ON \"users2\" AS PERMISSIVE FOR ALL TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tcheckConstraints: [],\n\t\t\tcompositePkName: '',\n\t\t\tpolicies: [\n\t\t\t\t'test--PERMISSIVE--ALL--public--undefined--undefined--undefined',\n\t\t\t],\n\t\t\tschema: '',\n\t\t\ttableName: 'users2',\n\t\t\tisRLSEnabled: false,\n\t\t\ttype: 'create_table',\n\t\t\tuniqueConstraints: [],\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\ton: undefined,\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users2',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n});\n\ntest('drop table with a policy', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users2', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t\t})),\n\t};\n\n\tconst schema2 = {};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"users2\" CASCADE;',\n\t\t'DROP TABLE \"users2\" CASCADE;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tpolicies: [\n\t\t\t\t'test--PERMISSIVE--ALL--public--undefined--undefined--undefined',\n\t\t\t],\n\t\t\tschema: '',\n\t\t\ttableName: 'users2',\n\t\t\ttype: 'drop_table',\n\t\t},\n\t]);\n});\n\ntest('add policy with multiple \"to\" roles', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst role = pgRole('manager').existing();\n\n\tconst schema2 = {\n\t\trole,\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { to: ['current_role', role] }),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ENABLE ROW LEVEL SECURITY;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS PERMISSIVE FOR ALL TO current_role, \"manager\";',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'enable_rls',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\ton: undefined,\n\t\t\t\tto: ['current_role', 'manager'],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n});\n\ntest('create table with rls enabled', async (t) => {\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}).enableRLS(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t`CREATE TABLE \"users\" (\\n\\t\"id\" integer PRIMARY KEY NOT NULL\\n);\n`,\n\t\t'ALTER TABLE \"users\" ENABLE ROW LEVEL SECURITY;',\n\t]);\n});\n\ntest('enable rls force', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}).enableRLS(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual(['ALTER TABLE \"users\" ENABLE ROW LEVEL SECURITY;']);\n});\n\ntest('disable rls force', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}).enableRLS(),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual(['ALTER TABLE \"users\" DISABLE ROW LEVEL SECURITY;']);\n});\n\ntest('drop policy with enabled rls', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { to: ['current_role', role] }),\n\t\t})).enableRLS(),\n\t};\n\n\tconst role = pgRole('manager').existing();\n\n\tconst schema2 = {\n\t\trole,\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}).enableRLS(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t]);\n});\n\ntest('add policy with enabled rls', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}).enableRLS(),\n\t};\n\n\tconst role = pgRole('manager').existing();\n\n\tconst schema2 = {\n\t\trole,\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, () => ({\n\t\t\trls: pgPolicy('test', { to: ['current_role', role] }),\n\t\t})).enableRLS(),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE POLICY \"test\" ON \"users\" AS PERMISSIVE FOR ALL TO current_role, \"manager\";',\n\t]);\n});\n\ntest('add policy + link table', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema2 = {\n\t\tusers,\n\t\trls: pgPolicy('test', { as: 'permissive' }).link(users),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ENABLE ROW LEVEL SECURITY;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS PERMISSIVE FOR ALL TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'enable_rls',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n});\n\ntest('link table', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t};\n\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema2 = {\n\t\tusers,\n\t\trls: pgPolicy('test', { as: 'permissive' }).link(users),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ENABLE ROW LEVEL SECURITY;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS PERMISSIVE FOR ALL TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'enable_rls',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n});\n\ntest('unlink table', async (t) => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\tusers,\n\t\trls: pgPolicy('test', { as: 'permissive' }).link(users),\n\t};\n\n\tconst schema2 = {\n\t\tusers,\n\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" DISABLE ROW LEVEL SECURITY;',\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'disable_rls',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t]);\n});\n\ntest('drop policy with link', async (t) => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\tusers,\n\t\trls: pgPolicy('test', { as: 'permissive' }).link(users),\n\t};\n\n\tconst schema2 = {\n\t\tusers,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" DISABLE ROW LEVEL SECURITY;',\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'disable_rls',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\ton: undefined,\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t]);\n});\n\ntest('add policy in table and with link table', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t};\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t}, () => [\n\t\tpgPolicy('test1', { to: 'current_user' }),\n\t]);\n\n\tconst schema2 = {\n\t\tusers,\n\t\trls: pgPolicy('test', { as: 'permissive' }).link(users),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ENABLE ROW LEVEL SECURITY;',\n\t\t'CREATE POLICY \"test1\" ON \"users\" AS PERMISSIVE FOR ALL TO current_user;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS PERMISSIVE FOR ALL TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'enable_rls',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test1',\n\t\t\t\tto: ['current_user'],\n\t\t\t\ton: undefined,\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\tto: ['public'],\n\t\t\t\tusing: undefined,\n\t\t\t\ton: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n});\n\ntest('link non-schema table', async (t) => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\trls: pgPolicy('test', { as: 'permissive' }).link(users),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE POLICY \"test\" ON \"public\".\"users\" AS PERMISSIVE FOR ALL TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\ton: '\"public\".\"users\"',\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\ttableName: '\"public\".\"users\"',\n\t\t\ttype: 'create_ind_policy',\n\t\t},\n\t]);\n});\n\ntest('unlink non-schema table', async (t) => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\trls: pgPolicy('test', { as: 'permissive' }).link(users),\n\t};\n\n\tconst schema2 = {\n\t\trls: pgPolicy('test', { as: 'permissive' }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"public\".\"users\" CASCADE;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\ton: '\"public\".\"users\"',\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\ttableName: '\"public\".\"users\"',\n\t\t\ttype: 'drop_ind_policy',\n\t\t},\n\t]);\n});\n\ntest('add policy + link non-schema table', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst cities = pgTable('cities', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, (t) => [\n\t\t\tpgPolicy('test2'),\n\t\t]),\n\t\trls: pgPolicy('test', { as: 'permissive' }).link(cities),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ENABLE ROW LEVEL SECURITY;',\n\t\t'CREATE POLICY \"test2\" ON \"users\" AS PERMISSIVE FOR ALL TO public;',\n\t\t'CREATE POLICY \"test\" ON \"public\".\"cities\" AS PERMISSIVE FOR ALL TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'enable_rls',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test2',\n\t\t\t\ton: undefined,\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\ton: '\"public\".\"cities\"',\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\ttableName: '\"public\".\"cities\"',\n\t\t\ttype: 'create_ind_policy',\n\t\t},\n\t]);\n});\n\ntest('add policy + link non-schema table from auth schema', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst authSchema = pgSchema('auth');\n\n\tconst cities = authSchema.table('cities', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, (t) => [\n\t\t\tpgPolicy('test2'),\n\t\t]),\n\t\trls: pgPolicy('test', { as: 'permissive' }).link(cities),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE \"users\" ENABLE ROW LEVEL SECURITY;',\n\t\t'CREATE POLICY \"test2\" ON \"users\" AS PERMISSIVE FOR ALL TO public;',\n\t\t'CREATE POLICY \"test\" ON \"auth\".\"cities\" AS PERMISSIVE FOR ALL TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'enable_rls',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test2',\n\t\t\t\ton: undefined,\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\ton: '\"auth\".\"cities\"',\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\ttableName: '\"auth\".\"cities\"',\n\t\t\ttype: 'create_ind_policy',\n\t\t},\n\t]);\n});\n\ntest('rename policy that is linked', async (t) => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\trls: pgPolicy('test', { as: 'permissive' }).link(users),\n\t};\n\n\tconst schema2 = {\n\t\trls: pgPolicy('newName', { as: 'permissive' }).link(users),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, [\n\t\t'\"public\".\"users\".test->\"public\".\"users\".newName',\n\t]);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"public\".\"users\" RENAME TO \"newName\";',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewName: 'newName',\n\t\t\toldName: 'test',\n\t\t\ttableKey: '\"public\".\"users\"',\n\t\t\ttype: 'rename_ind_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy that is linked', async (t) => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\trls: pgPolicy('test', { as: 'permissive' }).link(users),\n\t};\n\n\tconst schema2 = {\n\t\trls: pgPolicy('test', { as: 'permissive', to: 'current_role' }).link(users),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"public\".\"users\" TO current_role;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewData: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\ton: '\"public\".\"users\"',\n\t\t\t\tto: [\n\t\t\t\t\t'current_role',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\toldData: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\ton: '\"public\".\"users\"',\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\ttype: 'alter_ind_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy that is linked: withCheck', async (t) => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\trls: pgPolicy('test', { as: 'permissive', withCheck: sql`true` }).link(users),\n\t};\n\n\tconst schema2 = {\n\t\trls: pgPolicy('test', { as: 'permissive', withCheck: sql`false` }).link(users),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"public\".\"users\" TO public WITH CHECK (false);',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewData: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\ton: '\"public\".\"users\"',\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: 'false',\n\t\t\t},\n\t\t\toldData: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\ton: '\"public\".\"users\"',\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: 'true',\n\t\t\t},\n\t\t\ttype: 'alter_ind_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy that is linked: using', async (t) => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\trls: pgPolicy('test', { as: 'permissive', using: sql`true` }).link(users),\n\t};\n\n\tconst schema2 = {\n\t\trls: pgPolicy('test', { as: 'permissive', using: sql`false` }).link(users),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"public\".\"users\" TO public USING (false);',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewData: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\ton: '\"public\".\"users\"',\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: 'false',\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\toldData: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'ALL',\n\t\t\t\tname: 'test',\n\t\t\t\ton: '\"public\".\"users\"',\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: 'true',\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\ttype: 'alter_ind_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy that is linked: using', async (t) => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\trls: pgPolicy('test', { for: 'insert' }).link(users),\n\t};\n\n\tconst schema2 = {\n\t\trls: pgPolicy('test', { for: 'delete' }).link(users),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"public\".\"users\" CASCADE;',\n\t\t'CREATE POLICY \"test\" ON \"public\".\"users\" AS PERMISSIVE FOR DELETE TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'INSERT',\n\t\t\t\tname: 'test',\n\t\t\t\ton: '\"public\".\"users\"',\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\ttableName: '\"public\".\"users\"',\n\t\t\ttype: 'drop_ind_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'DELETE',\n\t\t\t\tname: 'test',\n\t\t\t\ton: '\"public\".\"users\"',\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\ttableName: '\"public\".\"users\"',\n\t\t\ttype: 'create_ind_policy',\n\t\t},\n\t]);\n});\n\n////\n\ntest('alter policy in the table', async (t) => {\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, (t) => [\n\t\t\tpgPolicy('test', { as: 'permissive' }),\n\t\t]),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, (t) => [\n\t\t\tpgPolicy('test', { as: 'permissive', to: 'current_role' }),\n\t\t]),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"users\" TO current_role;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewData: 'test--PERMISSIVE--ALL--current_role--undefined--undefined--undefined',\n\t\t\toldData: 'test--PERMISSIVE--ALL--public--undefined--undefined--undefined',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy in the table: withCheck', async (t) => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, (t) => [\n\t\t\tpgPolicy('test', { as: 'permissive', withCheck: sql`true` }),\n\t\t]),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, (t) => [\n\t\t\tpgPolicy('test', { as: 'permissive', withCheck: sql`false` }),\n\t\t]),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"users\" TO public WITH CHECK (false);',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewData: 'test--PERMISSIVE--ALL--public--undefined--false--undefined',\n\t\t\toldData: 'test--PERMISSIVE--ALL--public--undefined--true--undefined',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy in the table: using', async (t) => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, (t) => [\n\t\t\tpgPolicy('test', { as: 'permissive', using: sql`true` }),\n\t\t]),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, (t) => [\n\t\t\tpgPolicy('test', { as: 'permissive', using: sql`false` }),\n\t\t]),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER POLICY \"test\" ON \"users\" TO public USING (false);',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tnewData: 'test--PERMISSIVE--ALL--public--false--undefined--undefined',\n\t\t\toldData: 'test--PERMISSIVE--ALL--public--true--undefined--undefined',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_policy',\n\t\t},\n\t]);\n});\n\ntest('alter policy in the table: using', async (t) => {\n\tconst users = pgTable('users', {\n\t\tid: integer('id').primaryKey(),\n\t});\n\n\tconst schema1 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, (t) => [\n\t\t\tpgPolicy('test', { for: 'insert' }),\n\t\t]),\n\t};\n\n\tconst schema2 = {\n\t\tusers: pgTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}, (t) => [\n\t\t\tpgPolicy('test', { for: 'delete' }),\n\t\t]),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'DROP POLICY \"test\" ON \"users\" CASCADE;',\n\t\t'CREATE POLICY \"test\" ON \"users\" AS PERMISSIVE FOR DELETE TO public;',\n\t]);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'INSERT',\n\t\t\t\tname: 'test',\n\t\t\t\ton: undefined,\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'drop_policy',\n\t\t},\n\t\t{\n\t\t\tdata: {\n\t\t\t\tas: 'PERMISSIVE',\n\t\t\t\tfor: 'DELETE',\n\t\t\t\tname: 'test',\n\t\t\t\ton: undefined,\n\t\t\t\tto: [\n\t\t\t\t\t'public',\n\t\t\t\t],\n\t\t\t\tusing: undefined,\n\t\t\t\twithCheck: undefined,\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'create_policy',\n\t\t},\n\t]);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/rls/pg-role.test.ts",
    "content": "import { pgRole } from 'drizzle-orm/pg-core';\nimport { diffTestSchemas } from 'tests/schemaDiffer';\nimport { expect, test } from 'vitest';\n\ntest('create role', async (t) => {\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual(['CREATE ROLE \"manager\";']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'create_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: false,\n\t\t\t\tcreateRole: false,\n\t\t\t\tinherit: true,\n\t\t\t},\n\t\t},\n\t]);\n});\n\ntest('create role with properties', async (t) => {\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager', { createDb: true, inherit: false, createRole: true }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual(['CREATE ROLE \"manager\" WITH CREATEDB CREATEROLE NOINHERIT;']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'create_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: true,\n\t\t\t\tcreateRole: true,\n\t\t\t\tinherit: false,\n\t\t\t},\n\t\t},\n\t]);\n});\n\ntest('create role with some properties', async (t) => {\n\tconst schema1 = {};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager', { createDb: true, inherit: false }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual(['CREATE ROLE \"manager\" WITH CREATEDB NOINHERIT;']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'create_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: true,\n\t\t\t\tcreateRole: false,\n\t\t\t\tinherit: false,\n\t\t\t},\n\t\t},\n\t]);\n});\n\ntest('drop role', async (t) => {\n\tconst schema1 = { manager: pgRole('manager') };\n\n\tconst schema2 = {};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual(['DROP ROLE \"manager\";']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'drop_role',\n\t\t},\n\t]);\n});\n\ntest('create and drop role', async (t) => {\n\tconst schema1 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst schema2 = {\n\t\tadmin: pgRole('admin'),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual(['DROP ROLE \"manager\";', 'CREATE ROLE \"admin\";']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'drop_role',\n\t\t},\n\t\t{\n\t\t\tname: 'admin',\n\t\t\ttype: 'create_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: false,\n\t\t\t\tcreateRole: false,\n\t\t\t\tinherit: true,\n\t\t\t},\n\t\t},\n\t]);\n});\n\ntest('rename role', async (t) => {\n\tconst schema1 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst schema2 = {\n\t\tadmin: pgRole('admin'),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, ['manager->admin']);\n\n\texpect(sqlStatements).toStrictEqual(['ALTER ROLE \"manager\" RENAME TO \"admin\";']);\n\texpect(statements).toStrictEqual([\n\t\t{ nameFrom: 'manager', nameTo: 'admin', type: 'rename_role' },\n\t]);\n});\n\ntest('alter all role field', async (t) => {\n\tconst schema1 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager', { createDb: true, createRole: true, inherit: false }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual(['ALTER ROLE \"manager\" WITH CREATEDB CREATEROLE NOINHERIT;']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'alter_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: true,\n\t\t\t\tcreateRole: true,\n\t\t\t\tinherit: false,\n\t\t\t},\n\t\t},\n\t]);\n});\n\ntest('alter createdb in role', async (t) => {\n\tconst schema1 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager', { createDb: true }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual(['ALTER ROLE \"manager\" WITH CREATEDB NOCREATEROLE INHERIT;']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'alter_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: true,\n\t\t\t\tcreateRole: false,\n\t\t\t\tinherit: true,\n\t\t\t},\n\t\t},\n\t]);\n});\n\ntest('alter createrole in role', async (t) => {\n\tconst schema1 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager', { createRole: true }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual(['ALTER ROLE \"manager\" WITH NOCREATEDB CREATEROLE INHERIT;']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'alter_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: false,\n\t\t\t\tcreateRole: true,\n\t\t\t\tinherit: true,\n\t\t\t},\n\t\t},\n\t]);\n});\n\ntest('alter inherit in role', async (t) => {\n\tconst schema1 = {\n\t\tmanager: pgRole('manager'),\n\t};\n\n\tconst schema2 = {\n\t\tmanager: pgRole('manager', { inherit: false }),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemas(schema1, schema2, []);\n\n\texpect(sqlStatements).toStrictEqual(['ALTER ROLE \"manager\" WITH NOCREATEDB NOCREATEROLE NOINHERIT;']);\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tname: 'manager',\n\t\t\ttype: 'alter_role',\n\t\t\tvalues: {\n\t\t\t\tcreateDb: false,\n\t\t\t\tcreateRole: false,\n\t\t\t\tinherit: false,\n\t\t\t},\n\t\t},\n\t]);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/schemaDiffer.ts",
    "content": "import { PGlite } from '@electric-sql/pglite';\nimport { Client } from '@libsql/client/.';\nimport { Database } from 'better-sqlite3';\nimport { is } from 'drizzle-orm';\nimport { MySqlSchema, MySqlTable, MySqlView } from 'drizzle-orm/mysql-core';\nimport {\n\tgetMaterializedViewConfig,\n\tisPgEnum,\n\tisPgMaterializedView,\n\tisPgSequence,\n\tisPgView,\n\tPgEnum,\n\tPgEnumObject,\n\tPgMaterializedView,\n\tPgPolicy,\n\tPgRole,\n\tPgSchema,\n\tPgSequence,\n\tPgTable,\n\tPgView,\n} from 'drizzle-orm/pg-core';\nimport { SingleStoreSchema, SingleStoreTable } from 'drizzle-orm/singlestore-core';\nimport { SQLiteTable, SQLiteView } from 'drizzle-orm/sqlite-core';\nimport * as fs from 'fs';\nimport { type Client as GelClient } from 'gel';\nimport { Connection } from 'mysql2/promise';\nimport { libSqlLogSuggestionsAndReturn } from 'src/cli/commands/libSqlPushUtils';\nimport {\n\tcolumnsResolver,\n\tenumsResolver,\n\tindPolicyResolver,\n\tmySqlViewsResolver,\n\tNamed,\n\tpolicyResolver,\n\troleResolver,\n\tschemasResolver,\n\tsequencesResolver,\n\tsqliteViewsResolver,\n\ttablesResolver,\n\tviewsResolver,\n} from 'src/cli/commands/migrate';\nimport { pgSuggestions } from 'src/cli/commands/pgPushUtils';\nimport { logSuggestionsAndReturn as singleStoreLogSuggestionsAndReturn } from 'src/cli/commands/singlestorePushUtils';\nimport { logSuggestionsAndReturn } from 'src/cli/commands/sqlitePushUtils';\nimport { Entities } from 'src/cli/validations/cli';\nimport { CasingType } from 'src/cli/validations/common';\nimport { schemaToTypeScript as schemaToTypeScriptGel } from 'src/introspect-gel';\nimport { schemaToTypeScript as schemaToTypeScriptMySQL } from 'src/introspect-mysql';\nimport { schemaToTypeScript } from 'src/introspect-pg';\nimport { schemaToTypeScript as schemaToTypeScriptSingleStore } from 'src/introspect-singlestore';\nimport { schemaToTypeScript as schemaToTypeScriptSQLite } from 'src/introspect-sqlite';\nimport { fromDatabase as fromGelDatabase } from 'src/serializer/gelSerializer';\nimport { prepareFromMySqlImports } from 'src/serializer/mysqlImports';\nimport { mysqlSchema, squashMysqlScheme, ViewSquashed } from 'src/serializer/mysqlSchema';\nimport { fromDatabase as fromMySqlDatabase, generateMySqlSnapshot } from 'src/serializer/mysqlSerializer';\nimport { prepareFromPgImports } from 'src/serializer/pgImports';\nimport { pgSchema, Policy, Role, squashPgScheme, View } from 'src/serializer/pgSchema';\nimport { fromDatabase, generatePgSnapshot } from 'src/serializer/pgSerializer';\nimport { prepareFromSingleStoreImports } from 'src/serializer/singlestoreImports';\nimport { singlestoreSchema, squashSingleStoreScheme } from 'src/serializer/singlestoreSchema';\nimport {\n\tfromDatabase as fromSingleStoreDatabase,\n\tgenerateSingleStoreSnapshot,\n} from 'src/serializer/singlestoreSerializer';\nimport { prepareFromSqliteImports } from 'src/serializer/sqliteImports';\nimport { sqliteSchema, squashSqliteScheme, View as SqliteView } from 'src/serializer/sqliteSchema';\nimport { fromDatabase as fromSqliteDatabase, generateSqliteSnapshot } from 'src/serializer/sqliteSerializer';\nimport {\n\tapplyLibSQLSnapshotsDiff,\n\tapplyMysqlSnapshotsDiff,\n\tapplyPgSnapshotsDiff,\n\tapplySingleStoreSnapshotsDiff,\n\tapplySqliteSnapshotsDiff,\n\tColumn,\n\tColumnsResolverInput,\n\tColumnsResolverOutput,\n\tEnum,\n\tPolicyResolverInput,\n\tPolicyResolverOutput,\n\tResolverInput,\n\tResolverOutput,\n\tResolverOutputWithMoved,\n\tRolesResolverInput,\n\tRolesResolverOutput,\n\tSequence,\n\tTable,\n\tTablePolicyResolverInput,\n\tTablePolicyResolverOutput,\n} from 'src/snapshotsDiffer';\n\nexport type PostgresSchema = Record<\n\tstring,\n\t| PgTable<any>\n\t| PgEnum<any>\n\t| PgEnumObject<any>\n\t| PgSchema\n\t| PgSequence\n\t| PgView\n\t| PgMaterializedView\n\t| PgRole\n\t| PgPolicy\n>;\nexport type MysqlSchema = Record<\n\tstring,\n\tMySqlTable<any> | MySqlSchema | MySqlView\n>;\nexport type SqliteSchema = Record<string, SQLiteTable<any> | SQLiteView>;\nexport type SinglestoreSchema = Record<\n\tstring,\n\tSingleStoreTable<any> | SingleStoreSchema /* | SingleStoreView */\n>;\n\nexport const testSchemasResolver =\n\t(renames: Set<string>) => async (input: ResolverInput<Named>): Promise<ResolverOutput<Named>> => {\n\t\ttry {\n\t\t\tif (\n\t\t\t\tinput.created.length === 0\n\t\t\t\t|| input.deleted.length === 0\n\t\t\t\t|| renames.size === 0\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tcreated: input.created,\n\t\t\t\t\trenamed: [],\n\t\t\t\t\tdeleted: input.deleted,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tlet createdSchemas = [...input.created];\n\t\t\tlet deletedSchemas = [...input.deleted];\n\n\t\t\tconst result: {\n\t\t\t\tcreated: Named[];\n\t\t\t\trenamed: { from: Named; to: Named }[];\n\t\t\t\tdeleted: Named[];\n\t\t\t} = { created: [], renamed: [], deleted: [] };\n\n\t\t\tfor (let rename of renames) {\n\t\t\t\tconst [from, to] = rename.split('->');\n\n\t\t\t\tconst idxFrom = deletedSchemas.findIndex((it) => {\n\t\t\t\t\treturn it.name === from;\n\t\t\t\t});\n\n\t\t\t\tif (idxFrom >= 0) {\n\t\t\t\t\tconst idxTo = createdSchemas.findIndex((it) => {\n\t\t\t\t\t\treturn it.name === to;\n\t\t\t\t\t});\n\n\t\t\t\t\tresult.renamed.push({\n\t\t\t\t\t\tfrom: deletedSchemas[idxFrom],\n\t\t\t\t\t\tto: createdSchemas[idxTo],\n\t\t\t\t\t});\n\n\t\t\t\t\tdelete createdSchemas[idxTo];\n\t\t\t\t\tdelete deletedSchemas[idxFrom];\n\n\t\t\t\t\tcreatedSchemas = createdSchemas.filter(Boolean);\n\t\t\t\t\tdeletedSchemas = deletedSchemas.filter(Boolean);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult.created = createdSchemas;\n\t\t\tresult.deleted = deletedSchemas;\n\n\t\t\treturn result;\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t\tthrow e;\n\t\t}\n\t};\n\nexport const testSequencesResolver = (renames: Set<string>) =>\nasync (\n\tinput: ResolverInput<Sequence>,\n): Promise<ResolverOutputWithMoved<Sequence>> => {\n\ttry {\n\t\tif (\n\t\t\tinput.created.length === 0\n\t\t\t|| input.deleted.length === 0\n\t\t\t|| renames.size === 0\n\t\t) {\n\t\t\treturn {\n\t\t\t\tcreated: input.created,\n\t\t\t\tmoved: [],\n\t\t\t\trenamed: [],\n\t\t\t\tdeleted: input.deleted,\n\t\t\t};\n\t\t}\n\n\t\tlet createdSequences = [...input.created];\n\t\tlet deletedSequences = [...input.deleted];\n\n\t\tconst result: {\n\t\t\tcreated: Sequence[];\n\t\t\tmoved: { name: string; schemaFrom: string; schemaTo: string }[];\n\t\t\trenamed: { from: Sequence; to: Sequence }[];\n\t\t\tdeleted: Sequence[];\n\t\t} = { created: [], renamed: [], deleted: [], moved: [] };\n\n\t\tfor (let rename of renames) {\n\t\t\tconst [from, to] = rename.split('->');\n\n\t\t\tconst idxFrom = deletedSequences.findIndex((it) => {\n\t\t\t\treturn `${it.schema || 'public'}.${it.name}` === from;\n\t\t\t});\n\n\t\t\tif (idxFrom >= 0) {\n\t\t\t\tconst idxTo = createdSequences.findIndex((it) => {\n\t\t\t\t\treturn `${it.schema || 'public'}.${it.name}` === to;\n\t\t\t\t});\n\n\t\t\t\tconst tableFrom = deletedSequences[idxFrom];\n\t\t\t\tconst tableTo = createdSequences[idxFrom];\n\n\t\t\t\tif (tableFrom.schema !== tableTo.schema) {\n\t\t\t\t\tresult.moved.push({\n\t\t\t\t\t\tname: tableFrom.name,\n\t\t\t\t\t\tschemaFrom: tableFrom.schema,\n\t\t\t\t\t\tschemaTo: tableTo.schema,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (tableFrom.name !== tableTo.name) {\n\t\t\t\t\tresult.renamed.push({\n\t\t\t\t\t\tfrom: deletedSequences[idxFrom],\n\t\t\t\t\t\tto: createdSequences[idxTo],\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdelete createdSequences[idxTo];\n\t\t\t\tdelete deletedSequences[idxFrom];\n\n\t\t\t\tcreatedSequences = createdSequences.filter(Boolean);\n\t\t\t\tdeletedSequences = deletedSequences.filter(Boolean);\n\t\t\t}\n\t\t}\n\n\t\tresult.created = createdSequences;\n\t\tresult.deleted = deletedSequences;\n\n\t\treturn result;\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const testEnumsResolver = (renames: Set<string>) =>\nasync (\n\tinput: ResolverInput<Enum>,\n): Promise<ResolverOutputWithMoved<Enum>> => {\n\ttry {\n\t\tif (\n\t\t\tinput.created.length === 0\n\t\t\t|| input.deleted.length === 0\n\t\t\t|| renames.size === 0\n\t\t) {\n\t\t\treturn {\n\t\t\t\tcreated: input.created,\n\t\t\t\tmoved: [],\n\t\t\t\trenamed: [],\n\t\t\t\tdeleted: input.deleted,\n\t\t\t};\n\t\t}\n\n\t\tlet createdEnums = [...input.created];\n\t\tlet deletedEnums = [...input.deleted];\n\n\t\tconst result: {\n\t\t\tcreated: Enum[];\n\t\t\tmoved: { name: string; schemaFrom: string; schemaTo: string }[];\n\t\t\trenamed: { from: Enum; to: Enum }[];\n\t\t\tdeleted: Enum[];\n\t\t} = { created: [], renamed: [], deleted: [], moved: [] };\n\n\t\tfor (let rename of renames) {\n\t\t\tconst [from, to] = rename.split('->');\n\n\t\t\tconst idxFrom = deletedEnums.findIndex((it) => {\n\t\t\t\treturn `${it.schema || 'public'}.${it.name}` === from;\n\t\t\t});\n\n\t\t\tif (idxFrom >= 0) {\n\t\t\t\tconst idxTo = createdEnums.findIndex((it) => {\n\t\t\t\t\treturn `${it.schema || 'public'}.${it.name}` === to;\n\t\t\t\t});\n\n\t\t\t\tconst tableFrom = deletedEnums[idxFrom];\n\t\t\t\tconst tableTo = createdEnums[idxFrom];\n\n\t\t\t\tif (tableFrom.schema !== tableTo.schema) {\n\t\t\t\t\tresult.moved.push({\n\t\t\t\t\t\tname: tableFrom.name,\n\t\t\t\t\t\tschemaFrom: tableFrom.schema,\n\t\t\t\t\t\tschemaTo: tableTo.schema,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (tableFrom.name !== tableTo.name) {\n\t\t\t\t\tresult.renamed.push({\n\t\t\t\t\t\tfrom: deletedEnums[idxFrom],\n\t\t\t\t\t\tto: createdEnums[idxTo],\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdelete createdEnums[idxTo];\n\t\t\t\tdelete deletedEnums[idxFrom];\n\n\t\t\t\tcreatedEnums = createdEnums.filter(Boolean);\n\t\t\t\tdeletedEnums = deletedEnums.filter(Boolean);\n\t\t\t}\n\t\t}\n\n\t\tresult.created = createdEnums;\n\t\tresult.deleted = deletedEnums;\n\n\t\treturn result;\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const testTablesResolver = (renames: Set<string>) =>\nasync (\n\tinput: ResolverInput<Table>,\n): Promise<ResolverOutputWithMoved<Table>> => {\n\ttry {\n\t\tif (\n\t\t\tinput.created.length === 0\n\t\t\t|| input.deleted.length === 0\n\t\t\t|| renames.size === 0\n\t\t) {\n\t\t\treturn {\n\t\t\t\tcreated: input.created,\n\t\t\t\tmoved: [],\n\t\t\t\trenamed: [],\n\t\t\t\tdeleted: input.deleted,\n\t\t\t};\n\t\t}\n\n\t\tlet createdTables = [...input.created];\n\t\tlet deletedTables = [...input.deleted];\n\n\t\tconst result: {\n\t\t\tcreated: Table[];\n\t\t\tmoved: { name: string; schemaFrom: string; schemaTo: string }[];\n\t\t\trenamed: { from: Table; to: Table }[];\n\t\t\tdeleted: Table[];\n\t\t} = { created: [], renamed: [], deleted: [], moved: [] };\n\n\t\tfor (let rename of renames) {\n\t\t\tconst [from, to] = rename.split('->');\n\n\t\t\tconst idxFrom = deletedTables.findIndex((it) => {\n\t\t\t\treturn `${it.schema || 'public'}.${it.name}` === from;\n\t\t\t});\n\n\t\t\tif (idxFrom >= 0) {\n\t\t\t\tconst idxTo = createdTables.findIndex((it) => {\n\t\t\t\t\treturn `${it.schema || 'public'}.${it.name}` === to;\n\t\t\t\t});\n\n\t\t\t\tconst tableFrom = deletedTables[idxFrom];\n\t\t\t\tconst tableTo = createdTables[idxFrom];\n\n\t\t\t\tif (tableFrom.schema !== tableTo.schema) {\n\t\t\t\t\tresult.moved.push({\n\t\t\t\t\t\tname: tableFrom.name,\n\t\t\t\t\t\tschemaFrom: tableFrom.schema,\n\t\t\t\t\t\tschemaTo: tableTo.schema,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (tableFrom.name !== tableTo.name) {\n\t\t\t\t\tresult.renamed.push({\n\t\t\t\t\t\tfrom: deletedTables[idxFrom],\n\t\t\t\t\t\tto: createdTables[idxTo],\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdelete createdTables[idxTo];\n\t\t\t\tdelete deletedTables[idxFrom];\n\n\t\t\t\tcreatedTables = createdTables.filter(Boolean);\n\t\t\t\tdeletedTables = deletedTables.filter(Boolean);\n\t\t\t}\n\t\t}\n\n\t\tresult.created = createdTables;\n\t\tresult.deleted = deletedTables;\n\n\t\treturn result;\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const testColumnsResolver = (renames: Set<string>) =>\nasync (\n\tinput: ColumnsResolverInput<Column>,\n): Promise<ColumnsResolverOutput<Column>> => {\n\ttry {\n\t\tif (\n\t\t\tinput.created.length === 0\n\t\t\t|| input.deleted.length === 0\n\t\t\t|| renames.size === 0\n\t\t) {\n\t\t\treturn {\n\t\t\t\ttableName: input.tableName,\n\t\t\t\tschema: input.schema,\n\t\t\t\tcreated: input.created,\n\t\t\t\trenamed: [],\n\t\t\t\tdeleted: input.deleted,\n\t\t\t};\n\t\t}\n\n\t\tlet createdColumns = [...input.created];\n\t\tlet deletedColumns = [...input.deleted];\n\n\t\tconst renamed: { from: Column; to: Column }[] = [];\n\n\t\tconst schema = input.schema || 'public';\n\n\t\tfor (let rename of renames) {\n\t\t\tconst [from, to] = rename.split('->');\n\n\t\t\tconst idxFrom = deletedColumns.findIndex((it) => {\n\t\t\t\treturn `${schema}.${input.tableName}.${it.name}` === from;\n\t\t\t});\n\n\t\t\tif (idxFrom >= 0) {\n\t\t\t\tconst idxTo = createdColumns.findIndex((it) => {\n\t\t\t\t\treturn `${schema}.${input.tableName}.${it.name}` === to;\n\t\t\t\t});\n\n\t\t\t\trenamed.push({\n\t\t\t\t\tfrom: deletedColumns[idxFrom],\n\t\t\t\t\tto: createdColumns[idxTo],\n\t\t\t\t});\n\n\t\t\t\tdelete createdColumns[idxTo];\n\t\t\t\tdelete deletedColumns[idxFrom];\n\n\t\t\t\tcreatedColumns = createdColumns.filter(Boolean);\n\t\t\t\tdeletedColumns = deletedColumns.filter(Boolean);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\ttableName: input.tableName,\n\t\t\tschema: input.schema,\n\t\t\tcreated: createdColumns,\n\t\t\tdeleted: deletedColumns,\n\t\t\trenamed,\n\t\t};\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const testPolicyResolver = (renames: Set<string>) =>\nasync (\n\tinput: TablePolicyResolverInput<Policy>,\n): Promise<TablePolicyResolverOutput<Policy>> => {\n\ttry {\n\t\tif (\n\t\t\tinput.created.length === 0\n\t\t\t|| input.deleted.length === 0\n\t\t\t|| renames.size === 0\n\t\t) {\n\t\t\treturn {\n\t\t\t\ttableName: input.tableName,\n\t\t\t\tschema: input.schema,\n\t\t\t\tcreated: input.created,\n\t\t\t\trenamed: [],\n\t\t\t\tdeleted: input.deleted,\n\t\t\t};\n\t\t}\n\n\t\tlet createdPolicies = [...input.created];\n\t\tlet deletedPolicies = [...input.deleted];\n\n\t\tconst renamed: { from: Policy; to: Policy }[] = [];\n\n\t\tconst schema = input.schema || 'public';\n\n\t\tfor (let rename of renames) {\n\t\t\tconst [from, to] = rename.split('->');\n\n\t\t\tconst idxFrom = deletedPolicies.findIndex((it) => {\n\t\t\t\treturn `${schema}.${input.tableName}.${it.name}` === from;\n\t\t\t});\n\n\t\t\tif (idxFrom >= 0) {\n\t\t\t\tconst idxTo = createdPolicies.findIndex((it) => {\n\t\t\t\t\treturn `${schema}.${input.tableName}.${it.name}` === to;\n\t\t\t\t});\n\n\t\t\t\trenamed.push({\n\t\t\t\t\tfrom: deletedPolicies[idxFrom],\n\t\t\t\t\tto: createdPolicies[idxTo],\n\t\t\t\t});\n\n\t\t\t\tdelete createdPolicies[idxTo];\n\t\t\t\tdelete deletedPolicies[idxFrom];\n\n\t\t\t\tcreatedPolicies = createdPolicies.filter(Boolean);\n\t\t\t\tdeletedPolicies = deletedPolicies.filter(Boolean);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\ttableName: input.tableName,\n\t\t\tschema: input.schema,\n\t\t\tcreated: createdPolicies,\n\t\t\tdeleted: deletedPolicies,\n\t\t\trenamed,\n\t\t};\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const testIndPolicyResolver = (renames: Set<string>) =>\nasync (\n\tinput: PolicyResolverInput<Policy>,\n): Promise<PolicyResolverOutput<Policy>> => {\n\ttry {\n\t\tif (\n\t\t\tinput.created.length === 0\n\t\t\t|| input.deleted.length === 0\n\t\t\t|| renames.size === 0\n\t\t) {\n\t\t\treturn {\n\t\t\t\tcreated: input.created,\n\t\t\t\trenamed: [],\n\t\t\t\tdeleted: input.deleted,\n\t\t\t};\n\t\t}\n\n\t\tlet createdPolicies = [...input.created];\n\t\tlet deletedPolicies = [...input.deleted];\n\n\t\tconst renamed: { from: Policy; to: Policy }[] = [];\n\n\t\tfor (let rename of renames) {\n\t\t\tconst [from, to] = rename.split('->');\n\n\t\t\tconst idxFrom = deletedPolicies.findIndex((it) => {\n\t\t\t\treturn `${it.on}.${it.name}` === from;\n\t\t\t});\n\n\t\t\tif (idxFrom >= 0) {\n\t\t\t\tconst idxTo = createdPolicies.findIndex((it) => {\n\t\t\t\t\treturn `${it.on}.${it.name}` === to;\n\t\t\t\t});\n\n\t\t\t\trenamed.push({\n\t\t\t\t\tfrom: deletedPolicies[idxFrom],\n\t\t\t\t\tto: createdPolicies[idxTo],\n\t\t\t\t});\n\n\t\t\t\tdelete createdPolicies[idxTo];\n\t\t\t\tdelete deletedPolicies[idxFrom];\n\n\t\t\t\tcreatedPolicies = createdPolicies.filter(Boolean);\n\t\t\t\tdeletedPolicies = deletedPolicies.filter(Boolean);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tcreated: createdPolicies,\n\t\t\tdeleted: deletedPolicies,\n\t\t\trenamed,\n\t\t};\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const testRolesResolver = (renames: Set<string>) =>\nasync (\n\tinput: RolesResolverInput<Role>,\n): Promise<RolesResolverOutput<Role>> => {\n\ttry {\n\t\tif (\n\t\t\tinput.created.length === 0\n\t\t\t|| input.deleted.length === 0\n\t\t\t|| renames.size === 0\n\t\t) {\n\t\t\treturn {\n\t\t\t\tcreated: input.created,\n\t\t\t\trenamed: [],\n\t\t\t\tdeleted: input.deleted,\n\t\t\t};\n\t\t}\n\n\t\tlet createdPolicies = [...input.created];\n\t\tlet deletedPolicies = [...input.deleted];\n\n\t\tconst renamed: { from: Policy; to: Policy }[] = [];\n\n\t\tfor (let rename of renames) {\n\t\t\tconst [from, to] = rename.split('->');\n\n\t\t\tconst idxFrom = deletedPolicies.findIndex((it) => {\n\t\t\t\treturn `${it.name}` === from;\n\t\t\t});\n\n\t\t\tif (idxFrom >= 0) {\n\t\t\t\tconst idxTo = createdPolicies.findIndex((it) => {\n\t\t\t\t\treturn `${it.name}` === to;\n\t\t\t\t});\n\n\t\t\t\trenamed.push({\n\t\t\t\t\tfrom: deletedPolicies[idxFrom],\n\t\t\t\t\tto: createdPolicies[idxTo],\n\t\t\t\t});\n\n\t\t\t\tdelete createdPolicies[idxTo];\n\t\t\t\tdelete deletedPolicies[idxFrom];\n\n\t\t\t\tcreatedPolicies = createdPolicies.filter(Boolean);\n\t\t\t\tdeletedPolicies = deletedPolicies.filter(Boolean);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tcreated: createdPolicies,\n\t\t\tdeleted: deletedPolicies,\n\t\t\trenamed,\n\t\t};\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const testViewsResolver = (renames: Set<string>) =>\nasync (\n\tinput: ResolverInput<View>,\n): Promise<ResolverOutputWithMoved<View>> => {\n\ttry {\n\t\tif (\n\t\t\tinput.created.length === 0\n\t\t\t|| input.deleted.length === 0\n\t\t\t|| renames.size === 0\n\t\t) {\n\t\t\treturn {\n\t\t\t\tcreated: input.created,\n\t\t\t\tmoved: [],\n\t\t\t\trenamed: [],\n\t\t\t\tdeleted: input.deleted,\n\t\t\t};\n\t\t}\n\n\t\tlet createdViews = [...input.created];\n\t\tlet deletedViews = [...input.deleted];\n\n\t\tconst result: {\n\t\t\tcreated: View[];\n\t\t\tmoved: { name: string; schemaFrom: string; schemaTo: string }[];\n\t\t\trenamed: { from: View; to: View }[];\n\t\t\tdeleted: View[];\n\t\t} = { created: [], renamed: [], deleted: [], moved: [] };\n\n\t\tfor (let rename of renames) {\n\t\t\tconst [from, to] = rename.split('->');\n\n\t\t\tconst idxFrom = deletedViews.findIndex((it) => {\n\t\t\t\treturn `${it.schema || 'public'}.${it.name}` === from;\n\t\t\t});\n\n\t\t\tif (idxFrom >= 0) {\n\t\t\t\tconst idxTo = createdViews.findIndex((it) => {\n\t\t\t\t\treturn `${it.schema || 'public'}.${it.name}` === to;\n\t\t\t\t});\n\n\t\t\t\tconst viewFrom = deletedViews[idxFrom];\n\t\t\t\tconst viewTo = createdViews[idxFrom];\n\n\t\t\t\tif (viewFrom.schema !== viewTo.schema) {\n\t\t\t\t\tresult.moved.push({\n\t\t\t\t\t\tname: viewFrom.name,\n\t\t\t\t\t\tschemaFrom: viewFrom.schema,\n\t\t\t\t\t\tschemaTo: viewTo.schema,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (viewFrom.name !== viewTo.name) {\n\t\t\t\t\tresult.renamed.push({\n\t\t\t\t\t\tfrom: deletedViews[idxFrom],\n\t\t\t\t\t\tto: createdViews[idxTo],\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdelete createdViews[idxTo];\n\t\t\t\tdelete deletedViews[idxFrom];\n\n\t\t\t\tcreatedViews = createdViews.filter(Boolean);\n\t\t\t\tdeletedViews = deletedViews.filter(Boolean);\n\t\t\t}\n\t\t}\n\n\t\tresult.created = createdViews;\n\t\tresult.deleted = deletedViews;\n\n\t\treturn result;\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const testViewsResolverMySql = (renames: Set<string>) =>\nasync (\n\tinput: ResolverInput<ViewSquashed & { schema: '' }>,\n): Promise<ResolverOutputWithMoved<ViewSquashed>> => {\n\ttry {\n\t\tif (\n\t\t\tinput.created.length === 0\n\t\t\t|| input.deleted.length === 0\n\t\t\t|| renames.size === 0\n\t\t) {\n\t\t\treturn {\n\t\t\t\tcreated: input.created,\n\t\t\t\tmoved: [],\n\t\t\t\trenamed: [],\n\t\t\t\tdeleted: input.deleted,\n\t\t\t};\n\t\t}\n\n\t\tlet createdViews = [...input.created];\n\t\tlet deletedViews = [...input.deleted];\n\n\t\tconst result: {\n\t\t\tcreated: ViewSquashed[];\n\t\t\tmoved: { name: string; schemaFrom: string; schemaTo: string }[];\n\t\t\trenamed: { from: ViewSquashed; to: ViewSquashed }[];\n\t\t\tdeleted: ViewSquashed[];\n\t\t} = { created: [], renamed: [], deleted: [], moved: [] };\n\n\t\tfor (let rename of renames) {\n\t\t\tconst [from, to] = rename.split('->');\n\n\t\t\tconst idxFrom = deletedViews.findIndex((it) => {\n\t\t\t\treturn `${it.schema || 'public'}.${it.name}` === from;\n\t\t\t});\n\n\t\t\tif (idxFrom >= 0) {\n\t\t\t\tconst idxTo = createdViews.findIndex((it) => {\n\t\t\t\t\treturn `${it.schema || 'public'}.${it.name}` === to;\n\t\t\t\t});\n\n\t\t\t\tconst viewFrom = deletedViews[idxFrom];\n\t\t\t\tconst viewTo = createdViews[idxFrom];\n\n\t\t\t\tif (viewFrom.schema !== viewTo.schema) {\n\t\t\t\t\tresult.moved.push({\n\t\t\t\t\t\tname: viewFrom.name,\n\t\t\t\t\t\tschemaFrom: viewFrom.schema,\n\t\t\t\t\t\tschemaTo: viewTo.schema,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (viewFrom.name !== viewTo.name) {\n\t\t\t\t\tresult.renamed.push({\n\t\t\t\t\t\tfrom: deletedViews[idxFrom],\n\t\t\t\t\t\tto: createdViews[idxTo],\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdelete createdViews[idxTo];\n\t\t\t\tdelete deletedViews[idxFrom];\n\n\t\t\t\tcreatedViews = createdViews.filter(Boolean);\n\t\t\t\tdeletedViews = deletedViews.filter(Boolean);\n\t\t\t}\n\t\t}\n\n\t\tresult.created = createdViews;\n\t\tresult.deleted = deletedViews;\n\n\t\treturn result;\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const testViewsResolverSingleStore = (renames: Set<string>) =>\nasync (\n\tinput: ResolverInput<ViewSquashed & { schema: '' }>,\n): Promise<ResolverOutputWithMoved<ViewSquashed>> => {\n\ttry {\n\t\tif (\n\t\t\tinput.created.length === 0\n\t\t\t|| input.deleted.length === 0\n\t\t\t|| renames.size === 0\n\t\t) {\n\t\t\treturn {\n\t\t\t\tcreated: input.created,\n\t\t\t\tmoved: [],\n\t\t\t\trenamed: [],\n\t\t\t\tdeleted: input.deleted,\n\t\t\t};\n\t\t}\n\n\t\tlet createdViews = [...input.created];\n\t\tlet deletedViews = [...input.deleted];\n\n\t\tconst result: {\n\t\t\tcreated: ViewSquashed[];\n\t\t\tmoved: { name: string; schemaFrom: string; schemaTo: string }[];\n\t\t\trenamed: { from: ViewSquashed; to: ViewSquashed }[];\n\t\t\tdeleted: ViewSquashed[];\n\t\t} = { created: [], renamed: [], deleted: [], moved: [] };\n\n\t\tfor (let rename of renames) {\n\t\t\tconst [from, to] = rename.split('->');\n\n\t\t\tconst idxFrom = deletedViews.findIndex((it) => {\n\t\t\t\treturn `${it.schema || 'public'}.${it.name}` === from;\n\t\t\t});\n\n\t\t\tif (idxFrom >= 0) {\n\t\t\t\tconst idxTo = createdViews.findIndex((it) => {\n\t\t\t\t\treturn `${it.schema || 'public'}.${it.name}` === to;\n\t\t\t\t});\n\n\t\t\t\tconst viewFrom = deletedViews[idxFrom];\n\t\t\t\tconst viewTo = createdViews[idxFrom];\n\n\t\t\t\tif (viewFrom.schema !== viewTo.schema) {\n\t\t\t\t\tresult.moved.push({\n\t\t\t\t\t\tname: viewFrom.name,\n\t\t\t\t\t\tschemaFrom: viewFrom.schema,\n\t\t\t\t\t\tschemaTo: viewTo.schema,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (viewFrom.name !== viewTo.name) {\n\t\t\t\t\tresult.renamed.push({\n\t\t\t\t\t\tfrom: deletedViews[idxFrom],\n\t\t\t\t\t\tto: createdViews[idxTo],\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdelete createdViews[idxTo];\n\t\t\t\tdelete deletedViews[idxFrom];\n\n\t\t\t\tcreatedViews = createdViews.filter(Boolean);\n\t\t\t\tdeletedViews = deletedViews.filter(Boolean);\n\t\t\t}\n\t\t}\n\n\t\tresult.created = createdViews;\n\t\tresult.deleted = deletedViews;\n\n\t\treturn result;\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const testViewsResolverSqlite = (renames: Set<string>) =>\nasync (\n\tinput: ResolverInput<SqliteView>,\n): Promise<ResolverOutputWithMoved<SqliteView>> => {\n\ttry {\n\t\tif (\n\t\t\tinput.created.length === 0\n\t\t\t|| input.deleted.length === 0\n\t\t\t|| renames.size === 0\n\t\t) {\n\t\t\treturn {\n\t\t\t\tcreated: input.created,\n\t\t\t\tmoved: [],\n\t\t\t\trenamed: [],\n\t\t\t\tdeleted: input.deleted,\n\t\t\t};\n\t\t}\n\n\t\tlet createdViews = [...input.created];\n\t\tlet deletedViews = [...input.deleted];\n\n\t\tconst result: {\n\t\t\tcreated: SqliteView[];\n\t\t\tmoved: { name: string; schemaFrom: string; schemaTo: string }[];\n\t\t\trenamed: { from: SqliteView; to: SqliteView }[];\n\t\t\tdeleted: SqliteView[];\n\t\t} = { created: [], renamed: [], deleted: [], moved: [] };\n\n\t\tfor (let rename of renames) {\n\t\t\tconst [from, to] = rename.split('->');\n\n\t\t\tconst idxFrom = deletedViews.findIndex((it) => {\n\t\t\t\treturn it.name === from;\n\t\t\t});\n\n\t\t\tif (idxFrom >= 0) {\n\t\t\t\tconst idxTo = createdViews.findIndex((it) => {\n\t\t\t\t\treturn it.name === to;\n\t\t\t\t});\n\n\t\t\t\tconst viewFrom = deletedViews[idxFrom];\n\t\t\t\tconst viewTo = createdViews[idxFrom];\n\n\t\t\t\tif (viewFrom.name !== viewTo.name) {\n\t\t\t\t\tresult.renamed.push({\n\t\t\t\t\t\tfrom: deletedViews[idxFrom],\n\t\t\t\t\t\tto: createdViews[idxTo],\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdelete createdViews[idxTo];\n\t\t\t\tdelete deletedViews[idxFrom];\n\n\t\t\t\tcreatedViews = createdViews.filter(Boolean);\n\t\t\t\tdeletedViews = deletedViews.filter(Boolean);\n\t\t\t}\n\t\t}\n\n\t\tresult.created = createdViews;\n\t\tresult.deleted = deletedViews;\n\n\t\treturn result;\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tthrow e;\n\t}\n};\n\nexport const diffTestSchemasPush = async (\n\tclient: PGlite,\n\tleft: PostgresSchema,\n\tright: PostgresSchema,\n\trenamesArr: string[],\n\tcli: boolean = false,\n\tschemas: string[] = ['public'],\n\tcasing?: CasingType | undefined,\n\tentities?: Entities,\n\tsqlStatementsToRun: {\n\t\tbefore?: string[];\n\t\tafter?: string[];\n\t\trunApply?: boolean;\n\t} = {\n\t\tbefore: [],\n\t\tafter: [],\n\t\trunApply: true,\n\t},\n) => {\n\tconst shouldRunApply = sqlStatementsToRun.runApply === undefined\n\t\t? true\n\t\t: sqlStatementsToRun.runApply;\n\n\tfor (const st of sqlStatementsToRun.before ?? []) {\n\t\tawait client.query(st);\n\t}\n\n\tif (shouldRunApply) {\n\t\tconst res = await applyPgDiffs(left, casing);\n\t\tfor (const st of res.sqlStatements) {\n\t\t\tawait client.query(st);\n\t\t}\n\t}\n\n\tfor (const st of sqlStatementsToRun.after ?? []) {\n\t\tawait client.query(st);\n\t}\n\n\tconst materializedViewsForRefresh = Object.values(left).filter((it) =>\n\t\tisPgMaterializedView(it)\n\t) as PgMaterializedView[];\n\n\t// refresh all mat views\n\tfor (const view of materializedViewsForRefresh) {\n\t\tconst viewConf = getMaterializedViewConfig(view);\n\t\tif (viewConf.isExisting) continue;\n\n\t\tawait client.exec(\n\t\t\t`REFRESH MATERIALIZED VIEW \"${viewConf.schema ?? 'public'}\".\"${viewConf.name}\"${\n\t\t\t\tviewConf.withNoData ? ' WITH NO DATA;' : ';'\n\t\t\t}`,\n\t\t);\n\t}\n\n\t// do introspect into PgSchemaInternal\n\tconst introspectedSchema = await fromDatabase(\n\t\t{\n\t\t\tquery: async (query: string, values?: any[] | undefined) => {\n\t\t\t\tconst res = await client.query(query, values);\n\t\t\t\treturn res.rows as any[];\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tschemas,\n\t\tentities,\n\t);\n\n\tconst leftTables = Object.values(right).filter((it) => is(it, PgTable)) as PgTable[];\n\n\tconst leftSchemas = Object.values(right).filter((it) => is(it, PgSchema)) as PgSchema[];\n\n\tconst leftEnums = Object.values(right).filter((it) => isPgEnum(it)) as PgEnum<any>[];\n\n\tconst leftSequences = Object.values(right).filter((it) => isPgSequence(it)) as PgSequence[];\n\n\tconst leftRoles = Object.values(right).filter((it) => is(it, PgRole)) as PgRole[];\n\n\tconst leftPolicies = Object.values(right).filter((it) => is(it, PgPolicy)) as PgPolicy[];\n\n\tconst leftViews = Object.values(right).filter((it) => isPgView(it)) as PgView[];\n\n\tconst leftMaterializedViews = Object.values(right).filter((it) => isPgMaterializedView(it)) as PgMaterializedView[];\n\n\tconst serialized2 = generatePgSnapshot(\n\t\tleftTables,\n\t\tleftEnums,\n\t\tleftSchemas,\n\t\tleftSequences,\n\t\tleftRoles,\n\t\tleftPolicies,\n\t\tleftViews,\n\t\tleftMaterializedViews,\n\t\tcasing,\n\t);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = introspectedSchema;\n\tconst { version: v2, dialect: d2, ...rest2 } = serialized2;\n\n\tconst sch1 = {\n\t\tversion: '7',\n\t\tdialect: 'postgresql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sch2 = {\n\t\tversion: '7',\n\t\tdialect: 'postgresql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn1 = squashPgScheme(sch1, 'push');\n\tconst sn2 = squashPgScheme(sch2, 'push');\n\n\tconst validatedPrev = pgSchema.parse(sch1);\n\tconst validatedCur = pgSchema.parse(sch2);\n\n\tconst renames = new Set(renamesArr);\n\n\tif (!cli) {\n\t\tconst { sqlStatements, statements } = await applyPgSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttestSchemasResolver(renames),\n\t\t\ttestEnumsResolver(renames),\n\t\t\ttestSequencesResolver(renames),\n\t\t\ttestPolicyResolver(renames),\n\t\t\ttestIndPolicyResolver(renames),\n\t\t\ttestRolesResolver(renames),\n\t\t\ttestTablesResolver(renames),\n\t\t\ttestColumnsResolver(renames),\n\t\t\ttestViewsResolver(renames),\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t\t'push',\n\t\t);\n\n\t\tconst {\n\t\t\tshouldAskForApprove,\n\t\t\tstatementsToExecute,\n\t\t\tcolumnsToRemove,\n\t\t\ttablesToRemove,\n\t\t\ttablesToTruncate,\n\t\t\tinfoToPrint,\n\t\t\tschemasToRemove,\n\t\t\tmatViewsToRemove,\n\t\t} = await pgSuggestions(\n\t\t\t{\n\t\t\t\tquery: async <T>(sql: string, params: any[] = []) => {\n\t\t\t\t\treturn (await client.query(sql, params)).rows as T[];\n\t\t\t\t},\n\t\t\t},\n\t\t\tstatements,\n\t\t);\n\n\t\treturn {\n\t\t\tsqlStatements: statementsToExecute,\n\t\t\tstatements,\n\t\t\tshouldAskForApprove,\n\t\t\tcolumnsToRemove,\n\t\t\ttablesToRemove,\n\t\t\ttablesToTruncate,\n\t\t\tinfoToPrint,\n\t\t\tschemasToRemove,\n\t\t\tmatViewsToRemove,\n\t\t};\n\t} else {\n\t\tconst { sqlStatements, statements } = await applyPgSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\tschemasResolver,\n\t\t\tenumsResolver,\n\t\t\tsequencesResolver,\n\t\t\tpolicyResolver,\n\t\t\tindPolicyResolver,\n\t\t\troleResolver,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tviewsResolver,\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t\t'push',\n\t\t);\n\t\treturn { sqlStatements, statements };\n\t}\n};\n\nexport const applyPgDiffs = async (\n\tsn: PostgresSchema,\n\tcasing: CasingType | undefined,\n) => {\n\tconst dryRun = {\n\t\tversion: '7',\n\t\tdialect: 'postgresql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\ttables: {},\n\t\tenums: {},\n\t\tviews: {},\n\t\tschemas: {},\n\t\tsequences: {},\n\t\tpolicies: {},\n\t\troles: {},\n\t\t_meta: {\n\t\t\tschemas: {},\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t} as const;\n\n\tconst tables = Object.values(sn).filter((it) => is(it, PgTable)) as PgTable[];\n\n\tconst schemas = Object.values(sn).filter((it) => is(it, PgSchema)) as PgSchema[];\n\n\tconst enums = Object.values(sn).filter((it) => isPgEnum(it)) as PgEnum<any>[];\n\n\tconst sequences = Object.values(sn).filter((it) => isPgSequence(it)) as PgSequence[];\n\n\tconst roles = Object.values(sn).filter((it) => is(it, PgRole)) as PgRole[];\n\n\tconst views = Object.values(sn).filter((it) => isPgView(it)) as PgView[];\n\n\tconst policies = Object.values(sn).filter((it) => is(it, PgPolicy)) as PgPolicy[];\n\n\tconst materializedViews = Object.values(sn).filter((it) => isPgMaterializedView(it)) as PgMaterializedView[];\n\n\tconst serialized1 = generatePgSnapshot(\n\t\ttables,\n\t\tenums,\n\t\tschemas,\n\t\tsequences,\n\t\troles,\n\t\tpolicies,\n\t\tviews,\n\t\tmaterializedViews,\n\t\tcasing,\n\t);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = serialized1;\n\n\tconst sch1 = {\n\t\tversion: '7',\n\t\tdialect: 'postgresql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sn1 = squashPgScheme(sch1);\n\n\tconst validatedPrev = pgSchema.parse(dryRun);\n\tconst validatedCur = pgSchema.parse(sch1);\n\n\tconst { sqlStatements, statements } = await applyPgSnapshotsDiff(\n\t\tdryRun,\n\t\tsn1,\n\t\ttestSchemasResolver(new Set()),\n\t\ttestEnumsResolver(new Set()),\n\t\ttestSequencesResolver(new Set()),\n\t\ttestPolicyResolver(new Set()),\n\t\ttestIndPolicyResolver(new Set()),\n\t\ttestRolesResolver(new Set()),\n\t\ttestTablesResolver(new Set()),\n\t\ttestColumnsResolver(new Set()),\n\t\ttestViewsResolver(new Set()),\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t);\n\treturn { sqlStatements, statements };\n};\n\nexport const diffTestSchemas = async (\n\tleft: PostgresSchema,\n\tright: PostgresSchema,\n\trenamesArr: string[],\n\tcli: boolean = false,\n\tcasing?: CasingType | undefined,\n) => {\n\tconst leftTables = Object.values(left).filter((it) => is(it, PgTable)) as PgTable[];\n\n\tconst rightTables = Object.values(right).filter((it) => is(it, PgTable)) as PgTable[];\n\n\tconst leftSchemas = Object.values(left).filter((it) => is(it, PgSchema)) as PgSchema[];\n\n\tconst rightSchemas = Object.values(right).filter((it) => is(it, PgSchema)) as PgSchema[];\n\n\tconst leftEnums = Object.values(left).filter((it) => isPgEnum(it)) as PgEnum<any>[];\n\n\tconst rightEnums = Object.values(right).filter((it) => isPgEnum(it)) as PgEnum<any>[];\n\n\tconst leftSequences = Object.values(left).filter((it) => isPgSequence(it)) as PgSequence[];\n\n\tconst rightSequences = Object.values(right).filter((it) => isPgSequence(it)) as PgSequence[];\n\n\tconst leftRoles = Object.values(left).filter((it) => is(it, PgRole)) as PgRole[];\n\n\tconst rightRoles = Object.values(right).filter((it) => is(it, PgRole)) as PgRole[];\n\n\tconst leftPolicies = Object.values(left).filter((it) => is(it, PgPolicy)) as PgPolicy[];\n\n\tconst rightPolicies = Object.values(right).filter((it) => is(it, PgPolicy)) as PgPolicy[];\n\n\tconst leftViews = Object.values(left).filter((it) => isPgView(it)) as PgView[];\n\n\tconst rightViews = Object.values(right).filter((it) => isPgView(it)) as PgView[];\n\n\tconst leftMaterializedViews = Object.values(left).filter((it) => isPgMaterializedView(it)) as PgMaterializedView[];\n\n\tconst rightMaterializedViews = Object.values(right).filter((it) => isPgMaterializedView(it)) as PgMaterializedView[];\n\n\tconst serialized1 = generatePgSnapshot(\n\t\tleftTables,\n\t\tleftEnums,\n\t\tleftSchemas,\n\t\tleftSequences,\n\t\tleftRoles,\n\t\tleftPolicies,\n\t\tleftViews,\n\t\tleftMaterializedViews,\n\t\tcasing,\n\t);\n\tconst serialized2 = generatePgSnapshot(\n\t\trightTables,\n\t\trightEnums,\n\t\trightSchemas,\n\t\trightSequences,\n\t\trightRoles,\n\t\trightPolicies,\n\t\trightViews,\n\t\trightMaterializedViews,\n\t\tcasing,\n\t);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = serialized1;\n\tconst { version: v2, dialect: d2, ...rest2 } = serialized2;\n\n\tconst sch1 = {\n\t\tversion: '7',\n\t\tdialect: 'postgresql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sch2 = {\n\t\tversion: '7',\n\t\tdialect: 'postgresql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn1 = squashPgScheme(sch1);\n\tconst sn2 = squashPgScheme(sch2);\n\n\tconst validatedPrev = pgSchema.parse(sch1);\n\tconst validatedCur = pgSchema.parse(sch2);\n\n\tconst renames = new Set(renamesArr);\n\n\tif (!cli) {\n\t\tconst { sqlStatements, statements } = await applyPgSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttestSchemasResolver(renames),\n\t\t\ttestEnumsResolver(renames),\n\t\t\ttestSequencesResolver(renames),\n\t\t\ttestPolicyResolver(renames),\n\t\t\ttestIndPolicyResolver(renames),\n\t\t\ttestRolesResolver(renames),\n\t\t\ttestTablesResolver(renames),\n\t\t\ttestColumnsResolver(renames),\n\t\t\ttestViewsResolver(renames),\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\t\treturn { sqlStatements, statements };\n\t} else {\n\t\tconst { sqlStatements, statements } = await applyPgSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\tschemasResolver,\n\t\t\tenumsResolver,\n\t\t\tsequencesResolver,\n\t\t\tpolicyResolver,\n\t\t\tindPolicyResolver,\n\t\t\troleResolver,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tviewsResolver,\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\t\treturn { sqlStatements, statements };\n\t}\n};\n\nexport const diffTestSchemasPushMysql = async (\n\tclient: Connection,\n\tleft: MysqlSchema,\n\tright: MysqlSchema,\n\trenamesArr: string[],\n\tschema: string,\n\tcli: boolean = false,\n\tcasing?: CasingType | undefined,\n) => {\n\tconst { sqlStatements } = await applyMySqlDiffs(left, casing);\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n\t// do introspect into PgSchemaInternal\n\tconst introspectedSchema = await fromMySqlDatabase(\n\t\t{\n\t\t\tquery: async (sql: string, params?: any[]) => {\n\t\t\t\tconst res = await client.execute(sql, params);\n\t\t\t\treturn res[0] as any;\n\t\t\t},\n\t\t},\n\t\tschema,\n\t);\n\n\tconst leftTables = Object.values(right).filter((it) => is(it, MySqlTable)) as MySqlTable[];\n\n\tconst leftViews = Object.values(right).filter((it) => is(it, MySqlView)) as MySqlView[];\n\n\tconst serialized2 = generateMySqlSnapshot(leftTables, leftViews, casing);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = introspectedSchema;\n\tconst { version: v2, dialect: d2, ...rest2 } = serialized2;\n\n\tconst sch1 = {\n\t\tversion: '5',\n\t\tdialect: 'mysql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sch2 = {\n\t\tversion: '5',\n\t\tdialect: 'mysql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn1 = squashMysqlScheme(sch1);\n\tconst sn2 = squashMysqlScheme(sch2);\n\n\tconst validatedPrev = mysqlSchema.parse(sch1);\n\tconst validatedCur = mysqlSchema.parse(sch2);\n\n\tconst renames = new Set(renamesArr);\n\n\tif (!cli) {\n\t\tconst { sqlStatements, statements } = await applyMysqlSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttestTablesResolver(renames),\n\t\t\ttestColumnsResolver(renames),\n\t\t\ttestViewsResolverMySql(renames),\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t\t'push',\n\t\t);\n\t\treturn { sqlStatements, statements };\n\t} else {\n\t\tconst { sqlStatements, statements } = await applyMysqlSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tmySqlViewsResolver,\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t\t'push',\n\t\t);\n\t\treturn { sqlStatements, statements };\n\t}\n};\n\nexport const applyMySqlDiffs = async (\n\tsn: MysqlSchema,\n\tcasing: CasingType | undefined,\n) => {\n\tconst dryRun = {\n\t\tversion: '5',\n\t\tdialect: 'mysql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\tviews: {},\n\t\ttables: {},\n\t\tenums: {},\n\t\tschemas: {},\n\t\t_meta: {\n\t\t\tschemas: {},\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t} as const;\n\n\tconst tables = Object.values(sn).filter((it) => is(it, MySqlTable)) as MySqlTable[];\n\n\tconst views = Object.values(sn).filter((it) => is(it, MySqlView)) as MySqlView[];\n\n\tconst serialized1 = generateMySqlSnapshot(tables, views, casing);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = serialized1;\n\n\tconst sch1 = {\n\t\tversion: '5',\n\t\tdialect: 'mysql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sn1 = squashMysqlScheme(sch1);\n\n\tconst validatedPrev = mysqlSchema.parse(dryRun);\n\tconst validatedCur = mysqlSchema.parse(sch1);\n\n\tconst { sqlStatements, statements } = await applyMysqlSnapshotsDiff(\n\t\tdryRun,\n\t\tsn1,\n\t\ttestTablesResolver(new Set()),\n\t\ttestColumnsResolver(new Set()),\n\t\ttestViewsResolverMySql(new Set()),\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t);\n\treturn { sqlStatements, statements };\n};\n\nexport const diffTestSchemasMysql = async (\n\tleft: MysqlSchema,\n\tright: MysqlSchema,\n\trenamesArr: string[],\n\tcli: boolean = false,\n\tcasing?: CasingType | undefined,\n) => {\n\tconst leftTables = Object.values(left).filter((it) => is(it, MySqlTable)) as MySqlTable[];\n\n\tconst leftViews = Object.values(left).filter((it) => is(it, MySqlView)) as MySqlView[];\n\n\tconst rightTables = Object.values(right).filter((it) => is(it, MySqlTable)) as MySqlTable[];\n\n\tconst rightViews = Object.values(right).filter((it) => is(it, MySqlView)) as MySqlView[];\n\n\tconst serialized1 = generateMySqlSnapshot(leftTables, leftViews, casing);\n\tconst serialized2 = generateMySqlSnapshot(rightTables, rightViews, casing);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = serialized1;\n\tconst { version: v2, dialect: d2, ...rest2 } = serialized2;\n\n\tconst sch1 = {\n\t\tversion: '5',\n\t\tdialect: 'mysql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sch2 = {\n\t\tversion: '5',\n\t\tdialect: 'mysql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn1 = squashMysqlScheme(sch1);\n\tconst sn2 = squashMysqlScheme(sch2);\n\n\tconst validatedPrev = mysqlSchema.parse(sch1);\n\tconst validatedCur = mysqlSchema.parse(sch2);\n\n\tconst renames = new Set(renamesArr);\n\n\tif (!cli) {\n\t\tconst { sqlStatements, statements } = await applyMysqlSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttestTablesResolver(renames),\n\t\t\ttestColumnsResolver(renames),\n\t\t\ttestViewsResolverMySql(renames),\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\t\treturn { sqlStatements, statements };\n\t}\n\n\tconst { sqlStatements, statements } = await applyMysqlSnapshotsDiff(\n\t\tsn1,\n\t\tsn2,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\tmySqlViewsResolver,\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t);\n\treturn { sqlStatements, statements };\n};\n\nexport const diffTestSchemasSingleStore = async (\n\tleft: SinglestoreSchema,\n\tright: SinglestoreSchema,\n\trenamesArr: string[],\n\tcli: boolean = false,\n\tcasing?: CasingType | undefined,\n) => {\n\tconst leftTables = Object.values(left).filter((it) => is(it, SingleStoreTable)) as SingleStoreTable[];\n\n\t/* const leftViews = Object.values(left).filter((it) => is(it, SingleStoreView)) as SingleStoreView[]; */\n\n\tconst rightTables = Object.values(right).filter((it) => is(it, SingleStoreTable)) as SingleStoreTable[];\n\n\t/* const rightViews = Object.values(right).filter((it) => is(it, SingleStoreView)) as SingleStoreView[]; */\n\n\tconst serialized1 = generateSingleStoreSnapshot(\n\t\tleftTables,\n\t\t/* leftViews, */\n\t\tcasing,\n\t);\n\tconst serialized2 = generateSingleStoreSnapshot(\n\t\trightTables,\n\t\t/* rightViews, */\n\t\tcasing,\n\t);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = serialized1;\n\tconst { version: v2, dialect: d2, ...rest2 } = serialized2;\n\n\tconst sch1 = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sch2 = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn1 = squashSingleStoreScheme(sch1);\n\tconst sn2 = squashSingleStoreScheme(sch2);\n\n\tconst validatedPrev = singlestoreSchema.parse(sch1);\n\tconst validatedCur = singlestoreSchema.parse(sch2);\n\n\tconst renames = new Set(renamesArr);\n\n\tif (!cli) {\n\t\tconst { sqlStatements, statements } = await applySingleStoreSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttestTablesResolver(renames),\n\t\t\ttestColumnsResolver(renames),\n\t\t\t/* testViewsResolverSingleStore(renames), */\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t);\n\t\treturn { sqlStatements, statements };\n\t}\n\n\tconst { sqlStatements, statements } = await applySingleStoreSnapshotsDiff(\n\t\tsn1,\n\t\tsn2,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\t/* singleStoreViewsResolver, */\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t);\n\treturn { sqlStatements, statements };\n};\n\nexport const diffTestSchemasPushSingleStore = async (\n\tclient: Connection,\n\tleft: SinglestoreSchema,\n\tright: SinglestoreSchema,\n\trenamesArr: string[],\n\tschema: string,\n\tcli: boolean = false,\n\tcasing?: CasingType | undefined,\n\tsqlStatementsToRun: {\n\t\tbefore?: string[];\n\t\tafter?: string[];\n\t\trunApply?: boolean;\n\t} = {\n\t\tbefore: [],\n\t\tafter: [],\n\t\trunApply: true,\n\t},\n) => {\n\tconst shouldRunApply = sqlStatementsToRun.runApply === undefined\n\t\t? true\n\t\t: sqlStatementsToRun.runApply;\n\n\tfor (const st of sqlStatementsToRun.before ?? []) {\n\t\tawait client.query(st);\n\t}\n\n\tif (shouldRunApply) {\n\t\tconst res = await applySingleStoreDiffs(left, casing);\n\t\tfor (const st of res.sqlStatements) {\n\t\t\tawait client.query(st);\n\t\t}\n\t}\n\n\tfor (const st of sqlStatementsToRun.after ?? []) {\n\t\tawait client.query(st);\n\t}\n\n\t// do introspect into PgSchemaInternal\n\tconst introspectedSchema = await fromSingleStoreDatabase(\n\t\t{\n\t\t\tquery: async (sql: string, params?: any[]) => {\n\t\t\t\tconst res = await client.execute(sql, params);\n\t\t\t\treturn res[0] as any;\n\t\t\t},\n\t\t},\n\t\tschema,\n\t);\n\n\tconst leftTables = Object.values(right).filter((it) => is(it, SingleStoreTable)) as SingleStoreTable[];\n\n\t/* const leftViews = Object.values(right).filter((it) => is(it, SingleStoreView)) as SingleStoreView[]; */\n\n\tconst serialized2 = generateSingleStoreSnapshot(\n\t\tleftTables,\n\t\t/* leftViews, */\n\t\tcasing,\n\t);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = introspectedSchema;\n\tconst { version: v2, dialect: d2, ...rest2 } = serialized2;\n\n\tconst sch1 = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sch2 = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn1 = squashSingleStoreScheme(sch1);\n\tconst sn2 = squashSingleStoreScheme(sch2);\n\n\tconst validatedPrev = singlestoreSchema.parse(sch1);\n\tconst validatedCur = singlestoreSchema.parse(sch2);\n\n\tconst renames = new Set(renamesArr);\n\n\tif (!cli) {\n\t\tconst { sqlStatements, statements } = await applySingleStoreSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttestTablesResolver(renames),\n\t\t\ttestColumnsResolver(renames),\n\t\t\t/* testViewsResolverSingleStore(renames), */\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t\t'push',\n\t\t);\n\n\t\tconst {\n\t\t\tstatementsToExecute,\n\t\t\tcolumnsToRemove,\n\t\t\tinfoToPrint,\n\t\t\tshouldAskForApprove,\n\t\t\ttablesToRemove,\n\t\t\ttablesToTruncate,\n\t\t} = await singleStoreLogSuggestionsAndReturn(\n\t\t\t{\n\t\t\t\tquery: async <T>(sql: string, params?: any[]) => {\n\t\t\t\t\tconst res = await client.execute(sql, params);\n\t\t\t\t\treturn res[0] as T[];\n\t\t\t\t},\n\t\t\t},\n\t\t\tstatements,\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t);\n\n\t\treturn {\n\t\t\tsqlStatements: statementsToExecute,\n\t\t\tstatements,\n\t\t\tcolumnsToRemove,\n\t\t\tinfoToPrint,\n\t\t\tshouldAskForApprove,\n\t\t\ttablesToRemove,\n\t\t\ttablesToTruncate,\n\t\t};\n\t} else {\n\t\tconst { sqlStatements, statements } = await applySingleStoreSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\t/* singleStoreViewsResolver, */\n\t\t\tvalidatedPrev,\n\t\t\tvalidatedCur,\n\t\t\t'push',\n\t\t);\n\t\treturn { sqlStatements, statements };\n\t}\n};\n\nexport const applySingleStoreDiffs = async (\n\tsn: SinglestoreSchema,\n\tcasing: CasingType | undefined,\n) => {\n\tconst dryRun = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\ttables: {},\n\t\tviews: {},\n\t\tenums: {},\n\t\tschemas: {},\n\t\t_meta: {\n\t\t\tschemas: {},\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t} as const;\n\n\tconst tables = Object.values(sn).filter((it) => is(it, SingleStoreTable)) as SingleStoreTable[];\n\n\t/* const views = Object.values(sn).filter((it) => is(it, SingleStoreView)) as SingleStoreView[]; */\n\n\tconst serialized1 = generateSingleStoreSnapshot(tables, /* views, */ casing);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = serialized1;\n\n\tconst sch1 = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sn1 = squashSingleStoreScheme(sch1);\n\n\tconst validatedPrev = singlestoreSchema.parse(dryRun);\n\tconst validatedCur = singlestoreSchema.parse(sch1);\n\n\tconst { sqlStatements, statements } = await applySingleStoreSnapshotsDiff(\n\t\tdryRun,\n\t\tsn1,\n\t\ttestTablesResolver(new Set()),\n\t\ttestColumnsResolver(new Set()),\n\t\t/* testViewsResolverSingleStore(new Set()), */\n\t\tvalidatedPrev,\n\t\tvalidatedCur,\n\t);\n\treturn { sqlStatements, statements };\n};\n\nexport const diffTestSchemasPushSqlite = async (\n\tclient: Database,\n\tleft: SqliteSchema,\n\tright: SqliteSchema,\n\trenamesArr: string[],\n\tcli: boolean = false,\n\tseedStatements: string[] = [],\n\tcasing?: CasingType | undefined,\n) => {\n\tconst { sqlStatements } = await applySqliteDiffs(left, 'push');\n\n\tfor (const st of sqlStatements) {\n\t\tclient.exec(st);\n\t}\n\n\tfor (const st of seedStatements) {\n\t\tclient.exec(st);\n\t}\n\n\t// do introspect into PgSchemaInternal\n\tconst introspectedSchema = await fromSqliteDatabase(\n\t\t{\n\t\t\tquery: async <T>(sql: string, params: any[] = []) => {\n\t\t\t\treturn client.prepare(sql).bind(params).all() as T[];\n\t\t\t},\n\t\t\trun: async (query: string) => {\n\t\t\t\tclient.prepare(query).run();\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t);\n\n\tconst rightTables = Object.values(right).filter((it) => is(it, SQLiteTable)) as SQLiteTable[];\n\n\tconst rightViews = Object.values(right).filter((it) => is(it, SQLiteView)) as SQLiteView[];\n\n\tconst serialized2 = generateSqliteSnapshot(rightTables, rightViews, casing);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = introspectedSchema;\n\tconst { version: v2, dialect: d2, ...rest2 } = serialized2;\n\n\tconst sch1 = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sch2 = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn1 = squashSqliteScheme(sch1, 'push');\n\tconst sn2 = squashSqliteScheme(sch2, 'push');\n\n\tconst renames = new Set(renamesArr);\n\n\tif (!cli) {\n\t\tconst { sqlStatements, statements, _meta } = await applySqliteSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttestTablesResolver(renames),\n\t\t\ttestColumnsResolver(renames),\n\t\t\ttestViewsResolverSqlite(renames),\n\t\t\tsch1,\n\t\t\tsch2,\n\t\t\t'push',\n\t\t);\n\n\t\tconst {\n\t\t\tstatementsToExecute,\n\t\t\tcolumnsToRemove,\n\t\t\tinfoToPrint,\n\t\t\tschemasToRemove,\n\t\t\tshouldAskForApprove,\n\t\t\ttablesToRemove,\n\t\t\ttablesToTruncate,\n\t\t} = await logSuggestionsAndReturn(\n\t\t\t{\n\t\t\t\tquery: async <T>(sql: string, params: any[] = []) => {\n\t\t\t\t\treturn client.prepare(sql).bind(params).all() as T[];\n\t\t\t\t},\n\t\t\t\trun: async (query: string) => {\n\t\t\t\t\tclient.prepare(query).run();\n\t\t\t\t},\n\t\t\t},\n\t\t\tstatements,\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\t_meta!,\n\t\t);\n\n\t\treturn {\n\t\t\tsqlStatements: statementsToExecute,\n\t\t\tstatements,\n\t\t\tcolumnsToRemove,\n\t\t\tinfoToPrint,\n\t\t\tschemasToRemove,\n\t\t\tshouldAskForApprove,\n\t\t\ttablesToRemove,\n\t\t\ttablesToTruncate,\n\t\t};\n\t} else {\n\t\tconst { sqlStatements, statements } = await applySqliteSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tsqliteViewsResolver,\n\t\t\tsch1,\n\t\t\tsch2,\n\t\t\t'push',\n\t\t);\n\t\treturn { sqlStatements, statements };\n\t}\n};\n\nexport async function diffTestSchemasPushLibSQL(\n\tclient: Client,\n\tleft: SqliteSchema,\n\tright: SqliteSchema,\n\trenamesArr: string[],\n\tcli: boolean = false,\n\tseedStatements: string[] = [],\n\tcasing?: CasingType | undefined,\n) {\n\tconst { sqlStatements } = await applyLibSQLDiffs(left, 'push');\n\n\tfor (const st of sqlStatements) {\n\t\tawait client.execute(st);\n\t}\n\n\tfor (const st of seedStatements) {\n\t\tawait client.execute(st);\n\t}\n\n\tconst introspectedSchema = await fromSqliteDatabase(\n\t\t{\n\t\t\tquery: async <T>(sql: string, params?: any[]) => {\n\t\t\t\tconst res = await client.execute({ sql, args: params || [] });\n\t\t\t\treturn res.rows as T[];\n\t\t\t},\n\t\t\trun: async (query: string) => {\n\t\t\t\tawait client.execute(query);\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t);\n\n\tconst leftTables = Object.values(right).filter((it) => is(it, SQLiteTable)) as SQLiteTable[];\n\n\tconst leftViews = Object.values(right).filter((it) => is(it, SQLiteView)) as SQLiteView[];\n\n\tconst serialized2 = generateSqliteSnapshot(leftTables, leftViews, casing);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = introspectedSchema;\n\tconst { version: v2, dialect: d2, ...rest2 } = serialized2;\n\n\tconst sch1 = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sch2 = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn1 = squashSqliteScheme(sch1, 'push');\n\tconst sn2 = squashSqliteScheme(sch2, 'push');\n\n\tconst renames = new Set(renamesArr);\n\n\tif (!cli) {\n\t\tconst { sqlStatements, statements, _meta } = await applyLibSQLSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttestTablesResolver(renames),\n\t\t\ttestColumnsResolver(renames),\n\t\t\ttestViewsResolverSqlite(renames),\n\t\t\tsch1,\n\t\t\tsch2,\n\t\t\t'push',\n\t\t);\n\n\t\tconst {\n\t\t\tstatementsToExecute,\n\t\t\tcolumnsToRemove,\n\t\t\tinfoToPrint,\n\t\t\tshouldAskForApprove,\n\t\t\ttablesToRemove,\n\t\t\ttablesToTruncate,\n\t\t} = await libSqlLogSuggestionsAndReturn(\n\t\t\t{\n\t\t\t\tquery: async <T>(sql: string, params?: any[]) => {\n\t\t\t\t\tconst res = await client.execute({ sql, args: params || [] });\n\t\t\t\t\treturn res.rows as T[];\n\t\t\t\t},\n\t\t\t\trun: async (query: string) => {\n\t\t\t\t\tawait client.execute(query);\n\t\t\t\t},\n\t\t\t},\n\t\t\tstatements,\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\t_meta!,\n\t\t);\n\n\t\treturn {\n\t\t\tsqlStatements: statementsToExecute,\n\t\t\tstatements,\n\t\t\tcolumnsToRemove,\n\t\t\tinfoToPrint,\n\t\t\tshouldAskForApprove,\n\t\t\ttablesToRemove,\n\t\t\ttablesToTruncate,\n\t\t};\n\t} else {\n\t\tconst { sqlStatements, statements } = await applyLibSQLSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttablesResolver,\n\t\t\tcolumnsResolver,\n\t\t\tsqliteViewsResolver,\n\t\t\tsch1,\n\t\t\tsch2,\n\t\t\t'push',\n\t\t);\n\t\treturn { sqlStatements, statements };\n\t}\n}\n\nexport const applySqliteDiffs = async (\n\tsn: SqliteSchema,\n\taction?: 'push' | undefined,\n\tcasing?: CasingType | undefined,\n) => {\n\tconst dryRun = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\ttables: {},\n\t\tenums: {},\n\t\tviews: {},\n\t\tschemas: {},\n\t\t_meta: {\n\t\t\tschemas: {},\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t} as const;\n\n\tconst tables = Object.values(sn).filter((it) => is(it, SQLiteTable)) as SQLiteTable[];\n\n\tconst views = Object.values(sn).filter((it) => is(it, SQLiteView)) as SQLiteView[];\n\n\tconst serialized1 = generateSqliteSnapshot(tables, views, casing);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = serialized1;\n\n\tconst sch1 = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sn1 = squashSqliteScheme(sch1, action);\n\n\tconst { sqlStatements, statements } = await applySqliteSnapshotsDiff(\n\t\tdryRun,\n\t\tsn1,\n\t\ttestTablesResolver(new Set()),\n\t\ttestColumnsResolver(new Set()),\n\t\ttestViewsResolverSqlite(new Set()),\n\t\tdryRun,\n\t\tsch1,\n\t\taction,\n\t);\n\n\treturn { sqlStatements, statements };\n};\n\nexport const applyLibSQLDiffs = async (\n\tsn: SqliteSchema,\n\taction?: 'push' | undefined,\n\tcasing?: CasingType | undefined,\n) => {\n\tconst dryRun = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\ttables: {},\n\t\tviews: {},\n\t\tenums: {},\n\t\tschemas: {},\n\t\t_meta: {\n\t\t\tschemas: {},\n\t\t\ttables: {},\n\t\t\tcolumns: {},\n\t\t},\n\t} as const;\n\n\tconst tables = Object.values(sn).filter((it) => is(it, SQLiteTable)) as SQLiteTable[];\n\n\tconst views = Object.values(sn).filter((it) => is(it, SQLiteView)) as SQLiteView[];\n\n\tconst serialized1 = generateSqliteSnapshot(tables, views, casing);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = serialized1;\n\n\tconst sch1 = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sn1 = squashSqliteScheme(sch1, action);\n\n\tconst { sqlStatements, statements } = await applyLibSQLSnapshotsDiff(\n\t\tdryRun,\n\t\tsn1,\n\t\ttestTablesResolver(new Set()),\n\t\ttestColumnsResolver(new Set()),\n\t\ttestViewsResolverSqlite(new Set()),\n\t\tdryRun,\n\t\tsch1,\n\t\taction,\n\t);\n\n\treturn { sqlStatements, statements };\n};\n\nexport const diffTestSchemasSqlite = async (\n\tleft: SqliteSchema,\n\tright: SqliteSchema,\n\trenamesArr: string[],\n\tcli: boolean = false,\n\tcasing?: CasingType | undefined,\n) => {\n\tconst leftTables = Object.values(left).filter((it) => is(it, SQLiteTable)) as SQLiteTable[];\n\n\tconst leftViews = Object.values(left).filter((it) => is(it, SQLiteView)) as SQLiteView[];\n\n\tconst rightTables = Object.values(right).filter((it) => is(it, SQLiteTable)) as SQLiteTable[];\n\n\tconst rightViews = Object.values(right).filter((it) => is(it, SQLiteView)) as SQLiteView[];\n\n\tconst serialized1 = generateSqliteSnapshot(leftTables, leftViews, casing);\n\tconst serialized2 = generateSqliteSnapshot(rightTables, rightViews, casing);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = serialized1;\n\tconst { version: v2, dialect: d2, ...rest2 } = serialized2;\n\n\tconst sch1 = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sch2 = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn1 = squashSqliteScheme(sch1);\n\tconst sn2 = squashSqliteScheme(sch2);\n\n\tconst renames = new Set(renamesArr);\n\n\tif (!cli) {\n\t\tconst { sqlStatements, statements } = await applySqliteSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttestTablesResolver(renames),\n\t\t\ttestColumnsResolver(renames),\n\t\t\ttestViewsResolverSqlite(renames),\n\t\t\tsch1,\n\t\t\tsch2,\n\t\t);\n\t\treturn { sqlStatements, statements };\n\t}\n\n\tconst { sqlStatements, statements } = await applySqliteSnapshotsDiff(\n\t\tsn1,\n\t\tsn2,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\tsqliteViewsResolver,\n\t\tsch1,\n\t\tsch2,\n\t);\n\treturn { sqlStatements, statements };\n};\n\nexport const diffTestSchemasLibSQL = async (\n\tleft: SqliteSchema,\n\tright: SqliteSchema,\n\trenamesArr: string[],\n\tcli: boolean = false,\n\tcasing?: CasingType | undefined,\n) => {\n\tconst leftTables = Object.values(left).filter((it) => is(it, SQLiteTable)) as SQLiteTable[];\n\n\tconst leftViews = Object.values(left).filter((it) => is(it, SQLiteView)) as SQLiteView[];\n\n\tconst rightTables = Object.values(right).filter((it) => is(it, SQLiteTable)) as SQLiteTable[];\n\n\tconst rightViews = Object.values(right).filter((it) => is(it, SQLiteView)) as SQLiteView[];\n\n\tconst serialized1 = generateSqliteSnapshot(leftTables, leftViews, casing);\n\tconst serialized2 = generateSqliteSnapshot(rightTables, rightViews, casing);\n\n\tconst { version: v1, dialect: d1, ...rest1 } = serialized1;\n\tconst { version: v2, dialect: d2, ...rest2 } = serialized2;\n\n\tconst sch1 = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest1,\n\t} as const;\n\n\tconst sch2 = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn1 = squashSqliteScheme(sch1);\n\tconst sn2 = squashSqliteScheme(sch2);\n\n\tconst renames = new Set(renamesArr);\n\n\tif (!cli) {\n\t\tconst { sqlStatements, statements } = await applyLibSQLSnapshotsDiff(\n\t\t\tsn1,\n\t\t\tsn2,\n\t\t\ttestTablesResolver(renames),\n\t\t\ttestColumnsResolver(renames),\n\t\t\ttestViewsResolverSqlite(renames),\n\t\t\tsch1,\n\t\t\tsch2,\n\t\t);\n\t\treturn { sqlStatements, statements };\n\t}\n\n\tconst { sqlStatements, statements } = await applyLibSQLSnapshotsDiff(\n\t\tsn1,\n\t\tsn2,\n\t\ttablesResolver,\n\t\tcolumnsResolver,\n\t\tsqliteViewsResolver,\n\t\tsch1,\n\t\tsch2,\n\t);\n\treturn { sqlStatements, statements };\n};\n\n// --- Introspect to file helpers ---\n\nexport const introspectPgToFile = async (\n\tclient: PGlite,\n\tinitSchema: PostgresSchema,\n\ttestName: string,\n\tschemas: string[] = ['public'],\n\tentities?: Entities,\n\tcasing?: CasingType | undefined,\n) => {\n\t// put in db\n\tconst { sqlStatements } = await applyPgDiffs(initSchema, casing);\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n\n\t// introspect to schema\n\tconst introspectedSchema = await fromDatabase(\n\t\t{\n\t\t\tquery: async (query: string, values?: any[] | undefined) => {\n\t\t\t\tconst res = await client.query(query, values);\n\t\t\t\treturn res.rows as any[];\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tschemas,\n\t\tentities,\n\t);\n\n\tconst { version: initV, dialect: initD, ...initRest } = introspectedSchema;\n\n\tconst initSch = {\n\t\tversion: '7',\n\t\tdialect: 'postgresql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...initRest,\n\t} as const;\n\n\tconst initSn = squashPgScheme(initSch);\n\tconst validatedCur = pgSchema.parse(initSch);\n\n\t// write to ts file\n\tconst file = schemaToTypeScript(introspectedSchema, 'camel');\n\n\tfs.writeFileSync(`tests/introspect/postgres/${testName}.ts`, file.file);\n\n\t// generate snapshot from ts file\n\tconst response = await prepareFromPgImports([\n\t\t`tests/introspect/postgres/${testName}.ts`,\n\t]);\n\n\tconst afterFileImports = generatePgSnapshot(\n\t\tresponse.tables,\n\t\tresponse.enums,\n\t\tresponse.schemas,\n\t\tresponse.sequences,\n\t\tresponse.roles,\n\t\tresponse.policies,\n\t\tresponse.views,\n\t\tresponse.matViews,\n\t\tcasing,\n\t);\n\n\tconst { version: v2, dialect: d2, ...rest2 } = afterFileImports;\n\n\tconst sch2 = {\n\t\tversion: '7',\n\t\tdialect: 'postgresql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn2AfterIm = squashPgScheme(sch2);\n\tconst validatedCurAfterImport = pgSchema.parse(sch2);\n\n\tconst {\n\t\tsqlStatements: afterFileSqlStatements,\n\t\tstatements: afterFileStatements,\n\t} = await applyPgSnapshotsDiff(\n\t\tinitSn,\n\t\tsn2AfterIm,\n\t\ttestSchemasResolver(new Set()),\n\t\ttestEnumsResolver(new Set()),\n\t\ttestSequencesResolver(new Set()),\n\t\ttestPolicyResolver(new Set()),\n\t\ttestIndPolicyResolver(new Set()),\n\t\ttestRolesResolver(new Set()),\n\t\ttestTablesResolver(new Set()),\n\t\ttestColumnsResolver(new Set()),\n\t\ttestViewsResolver(new Set()),\n\t\tvalidatedCur,\n\t\tvalidatedCurAfterImport,\n\t);\n\n\tfs.rmSync(`tests/introspect/postgres/${testName}.ts`);\n\n\treturn {\n\t\tsqlStatements: afterFileSqlStatements,\n\t\tstatements: afterFileStatements,\n\t};\n};\n\nexport const introspectGelToFile = async (\n\tclient: GelClient,\n\ttestName: string,\n\tschemas: string[] = ['public'],\n\tentities?: Entities,\n\tcasing?: CasingType | undefined,\n) => {\n\t// introspect to schema\n\tconst introspectedSchema = await fromGelDatabase(\n\t\t{\n\t\t\tquery: async (query: string, values?: any[] | undefined) => {\n\t\t\t\tconst res = await client.querySQL(query, values);\n\t\t\t\treturn res as any[];\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tschemas,\n\t\tentities,\n\t);\n\n\t// write to ts file\n\tconst file = schemaToTypeScriptGel(introspectedSchema, 'camel');\n\n\tconst path = `tests/introspect/gel/${testName}.ts`;\n\tfs.writeFileSync(path, file.file);\n\n\treturn path;\n};\n\nexport const introspectMySQLToFile = async (\n\tclient: Connection,\n\tinitSchema: MysqlSchema,\n\ttestName: string,\n\tschema: string,\n\tcasing?: CasingType | undefined,\n) => {\n\t// put in db\n\tconst { sqlStatements } = await applyMySqlDiffs(initSchema, casing);\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n\n\t// introspect to schema\n\tconst introspectedSchema = await fromMySqlDatabase(\n\t\t{\n\t\t\tquery: async (sql: string, params?: any[] | undefined) => {\n\t\t\t\tconst res = await client.execute(sql, params);\n\t\t\t\treturn res[0] as any;\n\t\t\t},\n\t\t},\n\t\tschema,\n\t);\n\n\tconst { version: initV, dialect: initD, ...initRest } = introspectedSchema;\n\n\tconst initSch = {\n\t\tversion: '5',\n\t\tdialect: 'mysql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...initRest,\n\t} as const;\n\n\tconst initSn = squashMysqlScheme(initSch);\n\tconst validatedCur = mysqlSchema.parse(initSch);\n\n\tconst file = schemaToTypeScriptMySQL(introspectedSchema, 'camel');\n\n\tfs.writeFileSync(`tests/introspect/mysql/${testName}.ts`, file.file);\n\n\tconst response = await prepareFromMySqlImports([\n\t\t`tests/introspect/mysql/${testName}.ts`,\n\t]);\n\n\tconst afterFileImports = generateMySqlSnapshot(\n\t\tresponse.tables,\n\t\tresponse.views,\n\t\tcasing,\n\t);\n\n\tconst { version: v2, dialect: d2, ...rest2 } = afterFileImports;\n\n\tconst sch2 = {\n\t\tversion: '5',\n\t\tdialect: 'mysql',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn2AfterIm = squashMysqlScheme(sch2);\n\tconst validatedCurAfterImport = mysqlSchema.parse(sch2);\n\n\tconst {\n\t\tsqlStatements: afterFileSqlStatements,\n\t\tstatements: afterFileStatements,\n\t} = await applyMysqlSnapshotsDiff(\n\t\tsn2AfterIm,\n\t\tinitSn,\n\t\ttestTablesResolver(new Set()),\n\t\ttestColumnsResolver(new Set()),\n\t\ttestViewsResolverMySql(new Set()),\n\t\tvalidatedCurAfterImport,\n\t\tvalidatedCur,\n\t);\n\n\tfs.rmSync(`tests/introspect/mysql/${testName}.ts`);\n\n\treturn {\n\t\tsqlStatements: afterFileSqlStatements,\n\t\tstatements: afterFileStatements,\n\t};\n};\n\nexport const introspectSingleStoreToFile = async (\n\tclient: Connection,\n\tinitSchema: SinglestoreSchema,\n\ttestName: string,\n\tschema: string,\n\tcasing?: CasingType | undefined,\n) => {\n\t// put in db\n\tconst { sqlStatements } = await applySingleStoreDiffs(initSchema, casing);\n\tfor (const st of sqlStatements) {\n\t\tawait client.query(st);\n\t}\n\n\t// introspect to schema\n\tconst introspectedSchema = await fromSingleStoreDatabase(\n\t\t{\n\t\t\tquery: async (sql: string, params?: any[] | undefined) => {\n\t\t\t\tconst res = await client.execute(sql, params);\n\t\t\t\treturn res[0] as any;\n\t\t\t},\n\t\t},\n\t\tschema,\n\t);\n\n\tconst file = schemaToTypeScriptSingleStore(introspectedSchema, 'camel');\n\n\tfs.writeFileSync(`tests/introspect/singlestore/${testName}.ts`, file.file);\n\n\tconst response = await prepareFromSingleStoreImports([\n\t\t`tests/introspect/singlestore/${testName}.ts`,\n\t]);\n\n\tconst afterFileImports = generateSingleStoreSnapshot(\n\t\tresponse.tables,\n\t\t/* response.views, */\n\t\tcasing,\n\t);\n\n\tconst { version: v2, dialect: d2, ...rest2 } = afterFileImports;\n\n\tconst sch2 = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn2AfterIm = squashSingleStoreScheme(sch2);\n\tconst validatedCurAfterImport = singlestoreSchema.parse(sch2);\n\n\tconst leftTables = Object.values(initSchema).filter((it) => is(it, SingleStoreTable)) as SingleStoreTable[];\n\n\tconst initSnapshot = generateSingleStoreSnapshot(\n\t\tleftTables,\n\t\t/* response.views, */\n\t\tcasing,\n\t);\n\n\tconst { version: initV, dialect: initD, ...initRest } = initSnapshot;\n\n\tconst initSch = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...initRest,\n\t} as const;\n\n\tconst initSn = squashSingleStoreScheme(initSch);\n\tconst validatedCur = singlestoreSchema.parse(initSch);\n\n\tconst {\n\t\tsqlStatements: afterFileSqlStatements,\n\t\tstatements: afterFileStatements,\n\t} = await applySingleStoreSnapshotsDiff(\n\t\tsn2AfterIm,\n\t\tinitSn,\n\t\ttestTablesResolver(new Set()),\n\t\ttestColumnsResolver(new Set()),\n\t\t/* testViewsResolverSingleStore(new Set()), */\n\t\tvalidatedCurAfterImport,\n\t\tvalidatedCur,\n\t);\n\n\tfs.rmSync(`tests/introspect/singlestore/${testName}.ts`);\n\n\treturn {\n\t\tsqlStatements: afterFileSqlStatements,\n\t\tstatements: afterFileStatements,\n\t};\n};\n\nexport const introspectSQLiteToFile = async (\n\tclient: Database,\n\tinitSchema: SqliteSchema,\n\ttestName: string,\n\tcasing?: CasingType | undefined,\n) => {\n\t// put in db\n\tconst { sqlStatements } = await applySqliteDiffs(initSchema);\n\tfor (const st of sqlStatements) {\n\t\tclient.exec(st);\n\t}\n\n\t// introspect to schema\n\tconst introspectedSchema = await fromSqliteDatabase(\n\t\t{\n\t\t\tquery: async <T>(sql: string, params: any[] = []) => {\n\t\t\t\treturn client.prepare(sql).bind(params).all() as T[];\n\t\t\t},\n\t\t\trun: async (query: string) => {\n\t\t\t\tclient.prepare(query).run();\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t);\n\n\tconst { version: initV, dialect: initD, ...initRest } = introspectedSchema;\n\n\tconst initSch = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...initRest,\n\t} as const;\n\n\tconst initSn = squashSqliteScheme(initSch);\n\n\tconst validatedCur = sqliteSchema.parse(initSch);\n\n\tconst file = schemaToTypeScriptSQLite(introspectedSchema, 'camel');\n\n\tfs.writeFileSync(`tests/introspect/sqlite/${testName}.ts`, file.file);\n\n\tconst response = await prepareFromSqliteImports([\n\t\t`tests/introspect/sqlite/${testName}.ts`,\n\t]);\n\n\tconst afterFileImports = generateSqliteSnapshot(\n\t\tresponse.tables,\n\t\tresponse.views,\n\t\tcasing,\n\t);\n\n\tconst { version: v2, dialect: d2, ...rest2 } = afterFileImports;\n\n\tconst sch2 = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn2AfterIm = squashSqliteScheme(sch2);\n\tconst validatedCurAfterImport = sqliteSchema.parse(sch2);\n\n\tconst {\n\t\tsqlStatements: afterFileSqlStatements,\n\t\tstatements: afterFileStatements,\n\t} = await applySqliteSnapshotsDiff(\n\t\tsn2AfterIm,\n\t\tinitSn,\n\t\ttestTablesResolver(new Set()),\n\t\ttestColumnsResolver(new Set()),\n\t\ttestViewsResolverSqlite(new Set()),\n\t\tvalidatedCurAfterImport,\n\t\tvalidatedCur,\n\t);\n\n\tfs.rmSync(`tests/introspect/sqlite/${testName}.ts`);\n\n\treturn {\n\t\tsqlStatements: afterFileSqlStatements,\n\t\tstatements: afterFileStatements,\n\t};\n};\n\nexport const introspectLibSQLToFile = async (\n\tclient: Client,\n\tinitSchema: SqliteSchema,\n\ttestName: string,\n\tcasing?: CasingType | undefined,\n) => {\n\t// put in db\n\tconst { sqlStatements } = await applyLibSQLDiffs(initSchema);\n\tfor (const st of sqlStatements) {\n\t\tclient.execute(st);\n\t}\n\n\t// introspect to schema\n\tconst introspectedSchema = await fromSqliteDatabase(\n\t\t{\n\t\t\tquery: async <T>(sql: string, params: any[] = []) => {\n\t\t\t\treturn (await client.execute({ sql, args: params })).rows as T[];\n\t\t\t},\n\t\t\trun: async (query: string) => {\n\t\t\t\tclient.execute(query);\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t);\n\n\tconst { version: initV, dialect: initD, ...initRest } = introspectedSchema;\n\n\tconst initSch = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...initRest,\n\t} as const;\n\n\tconst initSn = squashSqliteScheme(initSch);\n\n\tconst validatedCur = sqliteSchema.parse(initSch);\n\n\tconst file = schemaToTypeScriptSQLite(introspectedSchema, 'camel');\n\n\tfs.writeFileSync(`tests/introspect/libsql/${testName}.ts`, file.file);\n\n\tconst response = await prepareFromSqliteImports([\n\t\t`tests/introspect/libsql/${testName}.ts`,\n\t]);\n\n\tconst afterFileImports = generateSqliteSnapshot(\n\t\tresponse.tables,\n\t\tresponse.views,\n\t\tcasing,\n\t);\n\n\tconst { version: v2, dialect: d2, ...rest2 } = afterFileImports;\n\n\tconst sch2 = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\tid: '0',\n\t\tprevId: '0',\n\t\t...rest2,\n\t} as const;\n\n\tconst sn2AfterIm = squashSqliteScheme(sch2);\n\tconst validatedCurAfterImport = sqliteSchema.parse(sch2);\n\n\tconst {\n\t\tsqlStatements: afterFileSqlStatements,\n\t\tstatements: afterFileStatements,\n\t} = await applyLibSQLSnapshotsDiff(\n\t\tsn2AfterIm,\n\t\tinitSn,\n\t\ttestTablesResolver(new Set()),\n\t\ttestColumnsResolver(new Set()),\n\t\ttestViewsResolverSqlite(new Set()),\n\t\tvalidatedCurAfterImport,\n\t\tvalidatedCur,\n\t);\n\n\tfs.rmSync(`tests/introspect/libsql/${testName}.ts`);\n\n\treturn {\n\t\tsqlStatements: afterFileSqlStatements,\n\t\tstatements: afterFileStatements,\n\t};\n};\n"
  },
  {
    "path": "drizzle-kit/tests/singlestore-generated.test.ts",
    "content": "import { SQL, sql } from 'drizzle-orm';\nimport { int, singlestoreTable, text } from 'drizzle-orm/singlestore-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasSingleStore } from './schemaDiffer';\n\ntest('generated as callback: add column with generated constraint', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_add_column',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t]);\n});\n\ntest('generated as callback: add generated constraint to an exisiting column as stored', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`, {\n\t\t\t\t\tmode: 'stored',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'to add'\",\n\t\t\t\ttype: 'stored',\n\t\t\t},\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t\"ALTER TABLE `users` MODIFY COLUMN `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') STORED;\",\n\t]);\n});\n\ntest('generated as callback: add generated constraint to an exisiting column as virtual', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`, {\n\t\t\t\t\tmode: 'virtual',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'to add'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') VIRTUAL;\",\n\t]);\n});\n\ntest('generated as callback: drop generated constraint as stored', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name} || 'to delete'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\toldColumn: {\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'to delete'\",\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` MODIFY COLUMN `gen_name` text;',\n\t]);\n});\n\ntest('generated as callback: drop generated constraint as virtual', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name} || 'to delete'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\toldColumn: {\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'to delete'\",\n\t\t\t\t\ttype: 'virtual',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text;',\n\t]);\n});\n\ntest('generated as callback: change generated constraint type from virtual to stored', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name}`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'stored',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t]);\n});\n\ntest('generated as callback: change generated constraint type from stored to virtual', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name}`,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t]);\n});\n\ntest('generated as callback: change generated constraint', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name}`,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t]);\n});\n\n// ---\n\ntest('generated as sql: add column with generated constraint', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_add_column',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t]);\n});\n\ntest('generated as sql: add generated constraint to an exisiting column as stored', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(sql`\\`users\\`.\\`name\\` || 'to add'`, {\n\t\t\t\t\tmode: 'stored',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'to add'\",\n\t\t\t\ttype: 'stored',\n\t\t\t},\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t\"ALTER TABLE `users` MODIFY COLUMN `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') STORED;\",\n\t]);\n});\n\ntest('generated as sql: add generated constraint to an exisiting column as virtual', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(sql`\\`users\\`.\\`name\\` || 'to add'`, {\n\t\t\t\t\tmode: 'virtual',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'to add'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') VIRTUAL;\",\n\t]);\n});\n\ntest('generated as sql: drop generated constraint as stored', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\` || 'to delete'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\toldColumn: {\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'to delete'\",\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` MODIFY COLUMN `gen_name` text;',\n\t]);\n});\n\ntest('generated as sql: drop generated constraint as virtual', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\` || 'to delete'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\toldColumn: {\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'to delete'\",\n\t\t\t\t\ttype: 'virtual',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text;',\n\t]);\n});\n\ntest('generated as sql: change generated constraint type from virtual to stored', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\``,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'stored',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t]);\n});\n\ntest('generated as sql: change generated constraint type from stored to virtual', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\``,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t]);\n});\n\ntest('generated as sql: change generated constraint', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\``,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t]);\n});\n\n// ---\n\ntest('generated as string: add column with generated constraint', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_add_column',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t]);\n});\n\ntest('generated as string: add generated constraint to an exisiting column as stored', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(`\\`users\\`.\\`name\\` || 'to add'`, {\n\t\t\t\t\tmode: 'stored',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'to add'\",\n\t\t\t\ttype: 'stored',\n\t\t\t},\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t\"ALTER TABLE `users` MODIFY COLUMN `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') STORED;\",\n\t]);\n});\n\ntest('generated as string: add generated constraint to an exisiting column as virtual', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(`\\`users\\`.\\`name\\` || 'to add'`, {\n\t\t\t\t\tmode: 'virtual',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'to add'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') VIRTUAL;\",\n\t]);\n});\n\ntest('generated as string: drop generated constraint as stored', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\`users\\`.\\`name\\` || 'to delete'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\toldColumn: {\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'to delete'\",\n\t\t\t\t\ttype: 'stored',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` MODIFY COLUMN `gen_name` text;',\n\t]);\n});\n\ntest('generated as string: drop generated constraint as virtual', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\`users\\`.\\`name\\` || 'to delete'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\toldColumn: {\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: \"`users`.`name` || 'to delete'\",\n\t\t\t\t\ttype: 'virtual',\n\t\t\t\t},\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tonUpdate: undefined,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text;',\n\t]);\n});\n\ntest('generated as string: change generated constraint type from virtual to stored', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(`\\`users\\`.\\`name\\``, {\n\t\t\t\tmode: 'virtual',\n\t\t\t}),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'stored',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;\",\n\t]);\n});\n\ntest('generated as string: change generated constraint type from stored to virtual', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(`\\`users\\`.\\`name\\``),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t]);\n});\n\ntest('generated as string: change generated constraint', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(`\\`users\\`.\\`name\\``),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\\`users\\`.\\`name\\` || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSingleStore(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: \"`users`.`name` || 'hello'\",\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` drop column `gen_name`;',\n\t\t\"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;\",\n\t]);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/singlestore-schemas.test.ts",
    "content": "import { singlestoreSchema, singlestoreTable } from 'drizzle-orm/singlestore-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasSingleStore } from './schemaDiffer';\n\n// We don't manage databases(schemas) in MySQL with Drizzle Kit\ntest('add schema #1', async () => {\n\tconst to = {\n\t\tdevSchema: singlestoreSchema('dev'),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore({}, to, []);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('add schema #2', async () => {\n\tconst from = {\n\t\tdevSchema: singlestoreSchema('dev'),\n\t};\n\tconst to = {\n\t\tdevSchema: singlestoreSchema('dev'),\n\t\tdevSchema2: singlestoreSchema('dev2'),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, []);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('delete schema #1', async () => {\n\tconst from = {\n\t\tdevSchema: singlestoreSchema('dev'),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, {}, []);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('delete schema #2', async () => {\n\tconst from = {\n\t\tdevSchema: singlestoreSchema('dev'),\n\t\tdevSchema2: singlestoreSchema('dev2'),\n\t};\n\tconst to = {\n\t\tdevSchema: singlestoreSchema('dev'),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, []);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('rename schema #1', async () => {\n\tconst from = {\n\t\tdevSchema: singlestoreSchema('dev'),\n\t};\n\tconst to = {\n\t\tdevSchema2: singlestoreSchema('dev2'),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, ['dev->dev2']);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('rename schema #2', async () => {\n\tconst from = {\n\t\tdevSchema: singlestoreSchema('dev'),\n\t\tdevSchema1: singlestoreSchema('dev1'),\n\t};\n\tconst to = {\n\t\tdevSchema: singlestoreSchema('dev'),\n\t\tdevSchema2: singlestoreSchema('dev2'),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, ['dev1->dev2']);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('add table to schema #1', async () => {\n\tconst dev = singlestoreSchema('dev');\n\tconst from = {};\n\tconst to = {\n\t\tdev,\n\t\tusers: dev.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, ['dev1->dev2']);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('add table to schema #2', async () => {\n\tconst dev = singlestoreSchema('dev');\n\tconst from = { dev };\n\tconst to = {\n\t\tdev,\n\t\tusers: dev.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, ['dev1->dev2']);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('add table to schema #3', async () => {\n\tconst dev = singlestoreSchema('dev');\n\tconst from = { dev };\n\tconst to = {\n\t\tdev,\n\t\tusersInDev: dev.table('users', {}),\n\t\tusers: singlestoreTable('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, ['dev1->dev2']);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tuniqueConstraints: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t\tcompositePkName: '',\n\t\tcompositePKs: [],\n\t});\n});\n\ntest('remove table from schema #1', async () => {\n\tconst dev = singlestoreSchema('dev');\n\tconst from = { dev, users: dev.table('users', {}) };\n\tconst to = {\n\t\tdev,\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, ['dev1->dev2']);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('remove table from schema #2', async () => {\n\tconst dev = singlestoreSchema('dev');\n\tconst from = { dev, users: dev.table('users', {}) };\n\tconst to = {};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, ['dev1->dev2']);\n\n\texpect(statements.length).toBe(0);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/singlestore.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport {\n\tindex,\n\tint,\n\tjson,\n\tprimaryKey,\n\tserial,\n\tsinglestoreSchema,\n\tsinglestoreTable,\n\ttext,\n\tuniqueIndex,\n} from 'drizzle-orm/singlestore-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasSingleStore } from './schemaDiffer';\n\ntest('add table #1', async () => {\n\tconst to = {\n\t\tusers: singlestoreTable('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t});\n});\n\ntest('add table #2', async () => {\n\tconst to = {\n\t\tusers: singlestoreTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'serial',\n\t\t\t\tautoincrement: true,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: ['users_id;id'],\n\t\tcompositePkName: 'users_id',\n\t\tuniqueConstraints: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t});\n});\n\ntest('add table #3', async () => {\n\tconst to = {\n\t\tusers: singlestoreTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid: serial('id'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tpk: primaryKey({\n\t\t\t\t\t\tname: 'users_pk',\n\t\t\t\t\t\tcolumns: [t.id],\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'serial',\n\t\t\t\tautoincrement: true,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: ['users_pk;id'],\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: 'users_pk',\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t});\n});\n\ntest('add table #4', async () => {\n\tconst to = {\n\t\tusers: singlestoreTable('users', {}),\n\t\tposts: singlestoreTable('posts', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'posts',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t});\n});\n\ntest('add table #5', async () => {\n\tconst schema = singlestoreSchema('folder');\n\tconst from = {\n\t\tschema,\n\t};\n\n\tconst to = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, []);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('add table #6', async () => {\n\tconst from = {\n\t\tusers1: singlestoreTable('users1', {}),\n\t};\n\n\tconst to = {\n\t\tusers2: singlestoreTable('users2', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users2',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tpolicies: [],\n\t\ttype: 'drop_table',\n\t\ttableName: 'users1',\n\t\tschema: undefined,\n\t});\n});\n\ntest('add table #7', async () => {\n\tconst from = {\n\t\tusers1: singlestoreTable('users1', {}),\n\t};\n\n\tconst to = {\n\t\tusers: singlestoreTable('users', {}),\n\t\tusers2: singlestoreTable('users2', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, [\n\t\t'public.users1->public.users2',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_table',\n\t\ttableNameFrom: 'users1',\n\t\ttableNameTo: 'users2',\n\t\tfromSchema: undefined,\n\t\ttoSchema: undefined,\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t\tcompositePkName: '',\n\t});\n});\n\ntest('add schema + table #1', async () => {\n\tconst schema = singlestoreSchema('folder');\n\n\tconst to = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore({}, to, []);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('change schema with tables #1', async () => {\n\tconst schema = singlestoreSchema('folder');\n\tconst schema2 = singlestoreSchema('folder2');\n\tconst from = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema2,\n\t\tusers: schema2.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, [\n\t\t'folder->folder2',\n\t]);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('change table schema #1', async () => {\n\tconst schema = singlestoreSchema('folder');\n\tconst from = {\n\t\tschema,\n\t\tusers: singlestoreTable('users', {}),\n\t};\n\tconst to = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, [\n\t\t'public.users->folder.users',\n\t]);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tpolicies: [],\n\t\ttype: 'drop_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t});\n});\n\ntest('change table schema #2', async () => {\n\tconst schema = singlestoreSchema('folder');\n\tconst from = {\n\t\tschema,\n\t\tusers: schema.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema,\n\t\tusers: singlestoreTable('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, [\n\t\t'folder.users->public.users',\n\t]);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_table',\n\t\ttableName: 'users',\n\t\tschema: undefined,\n\t\tcolumns: [],\n\t\tuniqueConstraints: [],\n\t\tcompositePkName: '',\n\t\tcompositePKs: [],\n\t\tinternals: {\n\t\t\ttables: {},\n\t\t\tindexes: {},\n\t\t},\n\t});\n});\n\ntest('change table schema #3', async () => {\n\tconst schema1 = singlestoreSchema('folder1');\n\tconst schema2 = singlestoreSchema('folder2');\n\tconst from = {\n\t\tschema1,\n\t\tschema2,\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema1,\n\t\tschema2,\n\t\tusers: schema2.table('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, [\n\t\t'folder1.users->folder2.users',\n\t]);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('change table schema #4', async () => {\n\tconst schema1 = singlestoreSchema('folder1');\n\tconst schema2 = singlestoreSchema('folder2');\n\tconst from = {\n\t\tschema1,\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema1,\n\t\tschema2, // add schema\n\t\tusers: schema2.table('users', {}), // move table\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, [\n\t\t'folder1.users->folder2.users',\n\t]);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('change table schema #5', async () => {\n\tconst schema1 = singlestoreSchema('folder1');\n\tconst schema2 = singlestoreSchema('folder2');\n\tconst from = {\n\t\tschema1, // remove schema\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema2, // add schema\n\t\tusers: schema2.table('users', {}), // move table\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, [\n\t\t'folder1.users->folder2.users',\n\t]);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('change table schema #5', async () => {\n\tconst schema1 = singlestoreSchema('folder1');\n\tconst schema2 = singlestoreSchema('folder2');\n\tconst from = {\n\t\tschema1,\n\t\tschema2,\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema1,\n\t\tschema2,\n\t\tusers: schema2.table('users2', {}), // rename and move table\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, [\n\t\t'folder1.users->folder2.users2',\n\t]);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('change table schema #6', async () => {\n\tconst schema1 = singlestoreSchema('folder1');\n\tconst schema2 = singlestoreSchema('folder2');\n\tconst from = {\n\t\tschema1,\n\t\tusers: schema1.table('users', {}),\n\t};\n\tconst to = {\n\t\tschema2, // rename schema\n\t\tusers: schema2.table('users2', {}), // rename table\n\t};\n\n\tconst { statements } = await diffTestSchemasSingleStore(from, to, [\n\t\t'folder1->folder2',\n\t\t'folder2.users->folder2.users2',\n\t]);\n\n\texpect(statements.length).toBe(0);\n});\n\ntest('add table #10', async () => {\n\tconst to = {\n\t\tusers: singlestoreTable('table', {\n\t\t\tjson: json('json').default({}),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t\"CREATE TABLE `table` (\\n\\t`json` json DEFAULT '{}'\\n);\\n\",\n\t);\n});\n\ntest('add table #11', async () => {\n\tconst to = {\n\t\tusers: singlestoreTable('table', {\n\t\t\tjson: json('json').default([]),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t\"CREATE TABLE `table` (\\n\\t`json` json DEFAULT '[]'\\n);\\n\",\n\t);\n});\n\ntest('add table #12', async () => {\n\tconst to = {\n\t\tusers: singlestoreTable('table', {\n\t\t\tjson: json('json').default([1, 2, 3]),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t\"CREATE TABLE `table` (\\n\\t`json` json DEFAULT '[1,2,3]'\\n);\\n\",\n\t);\n});\n\ntest('add table #13', async () => {\n\tconst to = {\n\t\tusers: singlestoreTable('table', {\n\t\t\tjson: json('json').default({ key: 'value' }),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t'CREATE TABLE `table` (\\n\\t`json` json DEFAULT \\'{\"key\":\"value\"}\\'\\n);\\n',\n\t);\n});\n\ntest('add table #14', async () => {\n\tconst to = {\n\t\tusers: singlestoreTable('table', {\n\t\t\tjson: json('json').default({\n\t\t\t\tkey: 'value',\n\t\t\t\tarr: [1, 2, 3],\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t'CREATE TABLE `table` (\\n\\t`json` json DEFAULT \\'{\"key\":\"value\",\"arr\":[1,2,3]}\\'\\n);\\n',\n\t);\n});\n\n// TODO: add bson type tests\n\n// TODO: add blob type tests\n\n// TODO: add uuid type tests\n\n// TODO: add guid type tests\n\n// TODO: add vector type tests\n\n// TODO: add geopoint type tests\n\ntest('drop index', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable(\n\t\t\t'table',\n\t\t\t{\n\t\t\t\tname: text('name'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tidx: index('name_idx').on(t.name),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst to = {\n\t\tusers: singlestoreTable('table', {\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe('DROP INDEX `name_idx` ON `table`;');\n});\n\ntest('add table with indexes', async () => {\n\tconst from = {};\n\n\tconst to = {\n\t\tusers: singlestoreTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t\temail: text('email'),\n\t\t\t},\n\t\t\t(t) => ({\n\t\t\t\tuniqueExpr: uniqueIndex('uniqueExpr').on(sql`(lower(${t.email}))`),\n\t\t\t\tindexExpr: index('indexExpr').on(sql`(lower(${t.email}))`),\n\t\t\t\tindexExprMultiple: index('indexExprMultiple').on(\n\t\t\t\t\tsql`(lower(${t.email}))`,\n\t\t\t\t\tsql`(lower(${t.email}))`,\n\t\t\t\t),\n\n\t\t\t\tuniqueCol: uniqueIndex('uniqueCol').on(t.email),\n\t\t\t\tindexCol: index('indexCol').on(t.email),\n\t\t\t\tindexColMultiple: index('indexColMultiple').on(t.email, t.email),\n\n\t\t\t\tindexColExpr: index('indexColExpr').on(\n\t\t\t\t\tsql`(lower(${t.email}))`,\n\t\t\t\t\tt.email,\n\t\t\t\t),\n\t\t\t}),\n\t\t),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, []);\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements).toStrictEqual([\n\t\t`CREATE TABLE \\`users\\` (\\n\\t\\`id\\` serial AUTO_INCREMENT NOT NULL,\\n\\t\\`name\\` text,\\n\\t\\`email\\` text,\\n\\tCONSTRAINT \\`users_id\\` PRIMARY KEY(\\`id\\`),\\n\\tCONSTRAINT \\`uniqueExpr\\` UNIQUE((lower(\\`email\\`))),\\n\\tCONSTRAINT \\`uniqueCol\\` UNIQUE(\\`email\\`)\n);\n`,\n\t\t'CREATE INDEX `indexExpr` ON `users` ((lower(`email`)));',\n\t\t'CREATE INDEX `indexExprMultiple` ON `users` ((lower(`email`)),(lower(`email`)));',\n\t\t'CREATE INDEX `indexCol` ON `users` (`email`);',\n\t\t'CREATE INDEX `indexColMultiple` ON `users` (`email`,`email`);',\n\t\t'CREATE INDEX `indexColExpr` ON `users` ((lower(`email`)),`email`);',\n\t]);\n});\n\ntest('rename table', async () => {\n\tconst from = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tjson: json('json').default([]),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable1: singlestoreTable('table1', {\n\t\t\tjson1: json('json').default([]),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, [`public.table->public.table1`]);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t'ALTER TABLE `table` RENAME TO `table1`;',\n\t);\n});\n\ntest('rename column', async () => {\n\tconst from = {\n\t\tusers: singlestoreTable('table', {\n\t\t\tjson: json('json').default([]),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: singlestoreTable('table', {\n\t\t\tjson1: json('json1').default([]),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, [`public.table.json->public.table.json1`]);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t'ALTER TABLE `table` CHANGE `json` `json1`;',\n\t);\n});\n\ntest('change data type', async () => {\n\tconst from = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int(),\n\t\t\tage: text(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int(),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, []);\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(\n\t\t`CREATE TABLE \\`__new_table\\` (\n\\t\\`id\\` int,\n\\t\\`age\\` int\n);\\n`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t'INSERT INTO `__new_table`(`id`, `age`) SELECT `id`, `age` FROM `table`;',\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t'DROP TABLE `table`;',\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t'ALTER TABLE `__new_table` RENAME TO `table`;',\n\t);\n});\n\ntest('drop not null', async () => {\n\tconst from = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int().notNull(),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int(),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, []);\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(\n\t\t`CREATE TABLE \\`__new_table\\` (\n\\t\\`id\\` int,\n\\t\\`age\\` int\n);\\n`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t'INSERT INTO `__new_table`(`id`, `age`) SELECT `id`, `age` FROM `table`;',\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t'DROP TABLE `table`;',\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t'ALTER TABLE `__new_table` RENAME TO `table`;',\n\t);\n});\n\ntest('set not null', async () => {\n\tconst from = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int(),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int().notNull(),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, []);\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(\n\t\t`CREATE TABLE \\`__new_table\\` (\n\\t\\`id\\` int NOT NULL,\n\\t\\`age\\` int\n);\\n`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t'INSERT INTO `__new_table`(`id`, `age`) SELECT `id`, `age` FROM `table`;',\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t'DROP TABLE `table`;',\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t'ALTER TABLE `__new_table` RENAME TO `table`;',\n\t);\n});\n\ntest('set default with not null column', async () => {\n\tconst from = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int().notNull(),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int().notNull().default(1),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, []);\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(\n\t\t`CREATE TABLE \\`__new_table\\` (\n\\t\\`id\\` int NOT NULL DEFAULT 1,\n\\t\\`age\\` int\n);\\n`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t'INSERT INTO `__new_table`(`id`, `age`) SELECT `id`, `age` FROM `table`;',\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t'DROP TABLE `table`;',\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t'ALTER TABLE `__new_table` RENAME TO `table`;',\n\t);\n});\n\ntest('drop default with not null column', async () => {\n\tconst from = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int().notNull().default(1),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int().notNull(),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, []);\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(\n\t\t`CREATE TABLE \\`__new_table\\` (\n\\t\\`id\\` int NOT NULL,\n\\t\\`age\\` int\n);\\n`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t'INSERT INTO `__new_table`(`id`, `age`) SELECT `id`, `age` FROM `table`;',\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t'DROP TABLE `table`;',\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t'ALTER TABLE `__new_table` RENAME TO `table`;',\n\t);\n});\n\ntest('set default', async () => {\n\tconst from = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int(),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int().default(1),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t'ALTER TABLE `table` MODIFY COLUMN `id` int DEFAULT 1;',\n\t);\n});\n\ntest('drop default', async () => {\n\tconst from = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int().default(1),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int(),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t'ALTER TABLE `table` MODIFY COLUMN `id` int;',\n\t);\n});\n\ntest('set pk', async () => {\n\tconst from = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int(),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int().primaryKey(),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, []);\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(\n\t\t`CREATE TABLE \\`__new_table\\` (\n\\t\\`id\\` int NOT NULL,\n\\t\\`age\\` int,\n\\tCONSTRAINT \\`table_id\\` PRIMARY KEY(\\`id\\`)\n);\\n`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t'INSERT INTO `__new_table`(`id`, `age`) SELECT `id`, `age` FROM `table`;',\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t'DROP TABLE `table`;',\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t'ALTER TABLE `__new_table` RENAME TO `table`;',\n\t);\n});\n\ntest('drop pk', async () => {\n\tconst from = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int().primaryKey(),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int(),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, []);\n\texpect(sqlStatements.length).toBe(4);\n\texpect(sqlStatements[0]).toBe(\n\t\t`CREATE TABLE \\`__new_table\\` (\n\\t\\`id\\` int,\n\\t\\`age\\` int\n);\\n`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t'INSERT INTO `__new_table`(`id`, `age`) SELECT `id`, `age` FROM `table`;',\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t'DROP TABLE `table`;',\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t'ALTER TABLE `__new_table` RENAME TO `table`;',\n\t);\n});\n\ntest('set not null + rename column on table with indexes', async () => {\n\tconst from = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int('id').default(1),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid3: int('id3').notNull().default(1),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, [`public.table.id->public.table.id3`]);\n\texpect(sqlStatements.length).toBe(5);\n\texpect(sqlStatements[0]).toBe(\n\t\t'ALTER TABLE \\`table\\` CHANGE `id` `id3`;',\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE TABLE \\`__new_table\\` (\n\\t\\`id3\\` int NOT NULL DEFAULT 1,\n\\t\\`age\\` int\n);\\n`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t'INSERT INTO `__new_table`(`id3`, `age`) SELECT `id3`, `age` FROM `table`;',\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t'DROP TABLE `table`;',\n\t);\n\texpect(sqlStatements[4]).toBe(\n\t\t'ALTER TABLE `__new_table` RENAME TO `table`;',\n\t);\n});\n\ntest('set not null + rename table on table with indexes', async () => {\n\tconst from = {\n\t\ttable: singlestoreTable('table', {\n\t\t\tid: int('id').default(1),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\ttable1: singlestoreTable('table1', {\n\t\t\tid: int('id').notNull().default(1),\n\t\t\tage: int(),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSingleStore(from, to, [`public.table->public.table1`]);\n\texpect(sqlStatements.length).toBe(5);\n\texpect(sqlStatements[0]).toBe(\n\t\t'ALTER TABLE `table` RENAME TO `table1`;',\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE TABLE \\`__new_table1\\` (\n\\t\\`id\\` int NOT NULL DEFAULT 1,\n\\t\\`age\\` int\n);\\n`,\n\t);\n\texpect(sqlStatements[2]).toBe(\n\t\t'INSERT INTO `__new_table1`(\\`id\\`, \\`age\\`) SELECT \\`id\\`, \\`age\\` FROM `table1`;',\n\t);\n\texpect(sqlStatements[3]).toBe(\n\t\t'DROP TABLE `table1`;',\n\t);\n\texpect(sqlStatements[4]).toBe(\n\t\t'ALTER TABLE `__new_table1` RENAME TO `table1`;',\n\t);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/sqlite-checks.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { check, int, sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasSqlite } from './schemaDiffer';\n\ntest('create table with check', async (t) => {\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasSqlite({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'users',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\ttype: 'integer',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'age',\n\t\t\t\ttype: 'integer',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\tcheckConstraints: ['some_check_name;\"users\".\"age\" > 21'],\n\t\treferenceData: [],\n\t\tuniqueConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \\`users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`age\\` integer,\n\\tCONSTRAINT \"some_check_name\" CHECK(\"users\".\"age\" > 21)\n);\\n`);\n});\n\ntest('add check contraint to existing table', async (t) => {\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasSqlite(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: ['some_check_name;\"users\".\"age\" > 21'],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;');\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`age\\` integer,\n\\tCONSTRAINT \"some_check_name\" CHECK(\"__new_users\".\"age\" > 21)\n);\\n`);\n\texpect(sqlStatements[2]).toBe(`INSERT INTO \\`__new_users\\`(\"id\", \"age\") SELECT \"id\", \"age\" FROM \\`users\\`;`);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[4]).toBe(`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('drop check contraint to existing table', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasSqlite(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;');\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`age\\` integer\n);\\n`);\n\texpect(sqlStatements[2]).toBe(`INSERT INTO \\`__new_users\\`(\"id\", \"age\") SELECT \"id\", \"age\" FROM \\`users\\`;`);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[4]).toBe(`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('rename check constraint', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('new_some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasSqlite(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [`new_some_check_name;\"users\".\"age\" > 21`],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;');\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`age\\` integer,\n\\tCONSTRAINT \"new_some_check_name\" CHECK(\"__new_users\".\"age\" > 21)\n);\\n`);\n\texpect(sqlStatements[2]).toBe(`INSERT INTO \\`__new_users\\`(\"id\", \"age\") SELECT \"id\", \"age\" FROM \\`users\\`;`);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[4]).toBe(`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('rename check constraint', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 21`),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint: check('some_check_name', sql`${table.age} > 10`),\n\t\t})),\n\t};\n\n\tconst { sqlStatements, statements } = await diffTestSchemasSqlite(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [`some_check_name;\"users\".\"age\" > 10`],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;');\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`age\\` integer,\n\\tCONSTRAINT \"some_check_name\" CHECK(\"__new_users\".\"age\" > 10)\n);\\n`);\n\texpect(sqlStatements[2]).toBe(`INSERT INTO \\`__new_users\\`(\"id\", \"age\") SELECT \"id\", \"age\" FROM \\`users\\`;`);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[4]).toBe(`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('create checks with same names', async (t) => {\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tage: int('age'),\n\t\t\tname: text('name'),\n\t\t}, (table) => ({\n\t\t\tcheckConstraint1: check('some_check_name', sql`${table.age} > 21`),\n\t\t\tcheckConstraint2: check('some_check_name', sql`${table.name} != 'Alex'`),\n\t\t})),\n\t};\n\n\tawait expect(diffTestSchemasSqlite({}, to, [])).rejects.toThrowError();\n});\n"
  },
  {
    "path": "drizzle-kit/tests/sqlite-columns.test.ts",
    "content": "import {\n\tAnySQLiteColumn,\n\tforeignKey,\n\tindex,\n\tint,\n\tinteger,\n\tprimaryKey,\n\tsqliteTable,\n\ttext,\n} from 'drizzle-orm/sqlite-core';\nimport { JsonCreateIndexStatement, JsonRecreateTableStatement } from 'src/jsonStatements';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasSqlite } from './schemaDiffer';\n\ntest('create table with id', async (t) => {\n\tconst schema = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite({}, schema, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'users',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: true,\n\t\t\t\tnotNull: true,\n\t\t\t\tautoincrement: true,\n\t\t\t},\n\t\t],\n\t\tuniqueConstraints: [],\n\t\treferenceData: [],\n\t\tcompositePKs: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('add columns #1', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'users',\n\t\treferenceData: undefined,\n\t\tcolumn: {\n\t\t\tname: 'name',\n\t\t\ttype: 'text',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: true,\n\t\t\tautoincrement: false,\n\t\t},\n\t});\n});\n\ntest('add columns #2', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t\temail: text('email'),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'users',\n\t\treferenceData: undefined,\n\t\tcolumn: {\n\t\t\tname: 'name',\n\t\t\ttype: 'text',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tautoincrement: false, // TODO: add column has autoincrement???\n\t\t},\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'users',\n\t\treferenceData: undefined,\n\t\tcolumn: {\n\t\t\tname: 'email',\n\t\t\ttype: 'text',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tautoincrement: false,\n\t\t},\n\t});\n});\n\ntest('add columns #3', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname1: text('name1').default('name'),\n\t\t\tname2: text('name2').notNull(),\n\t\t\tname3: text('name3').default('name').notNull(),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, []);\n\n\texpect(statements.length).toBe(3);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'users',\n\t\treferenceData: undefined,\n\t\tcolumn: {\n\t\t\tname: 'name1',\n\t\t\ttype: 'text',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tautoincrement: false, // TODO: add column has autoincrement???\n\t\t\tdefault: \"'name'\",\n\t\t},\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'users',\n\t\treferenceData: undefined,\n\t\tcolumn: {\n\t\t\tname: 'name2',\n\t\t\ttype: 'text',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: true,\n\t\t\tautoincrement: false, // TODO: add column has autoincrement???\n\t\t},\n\t});\n\texpect(statements[2]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'users',\n\t\treferenceData: undefined,\n\t\tcolumn: {\n\t\t\tname: 'name3',\n\t\t\ttype: 'text',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: true,\n\t\t\tautoincrement: false, // TODO: add column has autoincrement???\n\t\t\tdefault: \"'name'\",\n\t\t},\n\t});\n});\n\ntest('add columns #4', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name', { enum: ['one', 'two'] }),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'users',\n\t\treferenceData: undefined,\n\t\tcolumn: {\n\t\t\tname: 'name',\n\t\t\ttype: 'text',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tautoincrement: false,\n\t\t},\n\t});\n});\n\ntest('add columns #5', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t}),\n\t};\n\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\treporteeId: int('report_to').references((): AnySQLiteColumn => users.id),\n\t});\n\n\tconst schema2 = {\n\t\tusers,\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, []);\n\n\t// TODO: Fix here\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'users',\n\t\treferenceData: 'users_report_to_users_id_fk;users;report_to;users;id;no action;no action',\n\t\tcolumn: {\n\t\t\tname: 'report_to',\n\t\t\ttype: 'integer',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t\tautoincrement: false,\n\t\t},\n\t});\n});\n\ntest('add columns #6', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t\temail: text('email').unique().notNull(),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t\temail: text('email').unique().notNull(),\n\t\t\tpassword: text('password').notNull(),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'users',\n\t\treferenceData: undefined,\n\t\tcolumn: {\n\t\t\tname: 'password',\n\t\t\ttype: 'text',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: true,\n\t\t\tautoincrement: false,\n\t\t},\n\t});\n});\n\ntest('add index #1', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\treporteeId: int('report_to').references((): AnySQLiteColumn => users.id),\n\t\t}),\n\t};\n\n\tconst users = sqliteTable(\n\t\t'users',\n\t\t{\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\treporteeId: int('report_to').references((): AnySQLiteColumn => users.id),\n\t\t},\n\t\t(t) => {\n\t\t\treturn {\n\t\t\t\treporteeIdx: index('reportee_idx').on(t.reporteeId),\n\t\t\t};\n\t\t},\n\t);\n\n\tconst schema2 = {\n\t\tusers,\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'create_index',\n\t\ttableName: 'users',\n\t\tinternal: {\n\t\t\tindexes: {},\n\t\t},\n\t\tschema: '',\n\t\tdata: 'reportee_idx;report_to;false;',\n\t});\n});\n\ntest('add foreign key #1', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\treporteeId: int('report_to'),\n\t\t}),\n\t};\n\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\treporteeId: int('report_to').references((): AnySQLiteColumn => users.id),\n\t});\n\n\tconst schema2 = {\n\t\tusers,\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual(\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\tcolumns: [{\n\t\t\t\tautoincrement: true,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t}, {\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'report_to',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t}],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [{\n\t\t\t\tcolumnsFrom: ['report_to'],\n\t\t\t\tcolumnsTo: ['id'],\n\t\t\t\tname: 'users_report_to_users_id_fk',\n\t\t\t\ttableFrom: 'users',\n\t\t\t\ttableTo: 'users',\n\t\t\t\tonDelete: 'no action',\n\t\t\t\tonUpdate: 'no action',\n\t\t\t}],\n\t\t\ttableName: 'users',\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t} as JsonRecreateTableStatement,\n\t);\n});\n\ntest('add foreign key #2', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\treporteeId: int('report_to'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\t\treporteeId: int('report_to'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\treporteeFk: foreignKey({\n\t\t\t\t\t\tcolumns: [t.reporteeId],\n\t\t\t\t\t\tforeignColumns: [t.id],\n\t\t\t\t\t\tname: 'reportee_fk',\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\tcolumns: [{\n\t\t\tautoincrement: true,\n\t\t\tgenerated: undefined,\n\t\t\tname: 'id',\n\t\t\tnotNull: true,\n\t\t\tprimaryKey: true,\n\t\t\ttype: 'integer',\n\t\t}, {\n\t\t\tautoincrement: false,\n\t\t\tgenerated: undefined,\n\t\t\tname: 'report_to',\n\t\t\tnotNull: false,\n\t\t\tprimaryKey: false,\n\t\t\ttype: 'integer',\n\t\t}],\n\t\tcompositePKs: [],\n\t\treferenceData: [{\n\t\t\tcolumnsFrom: ['report_to'],\n\t\t\tcolumnsTo: ['id'],\n\t\t\tname: 'reportee_fk',\n\t\t\ttableFrom: 'users',\n\t\t\ttableTo: 'users',\n\t\t\tonDelete: 'no action',\n\t\t\tonUpdate: 'no action',\n\t\t}],\n\t\ttableName: 'users',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t} as JsonRecreateTableStatement);\n});\n\ntest('alter column change name #1', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name1'),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, [\n\t\t'public.users.name->public.users.name1',\n\t]);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_rename_column',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\toldColumnName: 'name',\n\t\tnewColumnName: 'name1',\n\t});\n});\n\ntest('alter column change name #2', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name1'),\n\t\t\temail: text('email'),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, [\n\t\t'public.users.name->public.users.name1',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_rename_column',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\toldColumnName: 'name',\n\t\tnewColumnName: 'name1',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'sqlite_alter_table_add_column',\n\t\ttableName: 'users',\n\t\treferenceData: undefined,\n\t\tcolumn: {\n\t\t\tname: 'email',\n\t\t\tnotNull: false,\n\t\t\tprimaryKey: false,\n\t\t\ttype: 'text',\n\t\t\tautoincrement: false,\n\t\t},\n\t});\n});\n\ntest('alter column change name #3', async (t) => {\n\tconst schema1 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name'),\n\t\t\temail: text('email'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name1'),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, [\n\t\t'public.users.name->public.users.name1',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'alter_table_rename_column',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\toldColumnName: 'name',\n\t\tnewColumnName: 'name1',\n\t});\n\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'alter_table_drop_column',\n\t\ttableName: 'users',\n\t\tschema: '',\n\t\tcolumnName: 'email',\n\t});\n});\n\ntest('alter table add composite pk', async (t) => {\n\tconst schema1 = {\n\t\ttable: sqliteTable('table', {\n\t\t\tid1: integer('id1'),\n\t\t\tid2: integer('id2'),\n\t\t}),\n\t};\n\n\tconst schema2 = {\n\t\ttable: sqliteTable(\n\t\t\t'table',\n\t\t\t{\n\t\t\t\tid1: integer('id1'),\n\t\t\t\tid2: integer('id2'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tpk: primaryKey({ columns: [t.id1, t.id2] }),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\tcolumns: [{\n\t\t\tautoincrement: false,\n\t\t\tgenerated: undefined,\n\t\t\tname: 'id1',\n\t\t\tnotNull: false,\n\t\t\tprimaryKey: false,\n\t\t\ttype: 'integer',\n\t\t}, {\n\t\t\tautoincrement: false,\n\t\t\tgenerated: undefined,\n\t\t\tname: 'id2',\n\t\t\tnotNull: false,\n\t\t\tprimaryKey: false,\n\t\t\ttype: 'integer',\n\t\t}],\n\t\tcompositePKs: [['id1', 'id2']],\n\t\treferenceData: [],\n\t\ttableName: 'table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('alter column drop not null', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\tcolumns: [{\n\t\t\tautoincrement: false,\n\t\t\tgenerated: undefined,\n\t\t\tname: 'name',\n\t\t\tnotNull: false,\n\t\t\tprimaryKey: false,\n\t\t\ttype: 'text',\n\t\t}],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('alter column add not null', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\tcolumns: [{\n\t\t\tautoincrement: false,\n\t\t\tgenerated: undefined,\n\t\t\tname: 'name',\n\t\t\tnotNull: true,\n\t\t\tprimaryKey: false,\n\t\t\ttype: 'text',\n\t\t}],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('alter column add default', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name').default('dan'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\tcolumns: [{\n\t\t\tautoincrement: false,\n\t\t\tgenerated: undefined,\n\t\t\tname: 'name',\n\t\t\tnotNull: false,\n\t\t\tprimaryKey: false,\n\t\t\ttype: 'text',\n\t\t\tdefault: \"'dan'\",\n\t\t}],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('alter column drop default', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name').default('dan'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\tcolumns: [{\n\t\t\tautoincrement: false,\n\t\t\tgenerated: undefined,\n\t\t\tname: 'name',\n\t\t\tnotNull: false,\n\t\t\tprimaryKey: false,\n\t\t\ttype: 'text',\n\t\t}],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('alter column add default not null', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name').notNull().default('dan'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\tcolumns: [{\n\t\t\tautoincrement: false,\n\t\t\tgenerated: undefined,\n\t\t\tname: 'name',\n\t\t\tnotNull: true,\n\t\t\tprimaryKey: false,\n\t\t\ttype: 'text',\n\t\t\tdefault: \"'dan'\",\n\t\t}],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('alter column add default not null with indexes', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name'),\n\t\t}, (table) => ({\n\t\t\tsomeIndex: index('index_name').on(table.name),\n\t\t})),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name').notNull().default('dan'),\n\t\t}, (table) => ({\n\t\t\tsomeIndex: index('index_name').on(table.name),\n\t\t})),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\tcolumns: [{\n\t\t\tautoincrement: false,\n\t\t\tgenerated: undefined,\n\t\t\tname: 'name',\n\t\t\tnotNull: true,\n\t\t\tprimaryKey: false,\n\t\t\ttype: 'text',\n\t\t\tdefault: \"'dan'\",\n\t\t}],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tdata: 'index_name;name;false;',\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'create_index',\n\t\tinternal: undefined,\n\t});\n\texpect(sqlStatements.length).toBe(7);\n\texpect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_table\\` (\n\\t\\`name\\` text DEFAULT 'dan' NOT NULL\n);\\n`);\n\texpect(sqlStatements[2]).toBe(\n\t\t`INSERT INTO \\`__new_table\\`(\"name\") SELECT \"name\" FROM \\`table\\`;`,\n\t);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`table\\`;`);\n\texpect(sqlStatements[4]).toBe(`ALTER TABLE \\`__new_table\\` RENAME TO \\`table\\`;`);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n\texpect(sqlStatements[6]).toBe(`CREATE INDEX \\`index_name\\` ON \\`table\\` (\\`name\\`);`);\n});\n\ntest('alter column drop default not null', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name').notNull().default('dan'),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'recreate_table',\n\t\tcolumns: [{\n\t\t\tautoincrement: false,\n\t\t\tgenerated: undefined,\n\t\t\tname: 'name',\n\t\t\tnotNull: false,\n\t\t\tprimaryKey: false,\n\t\t\ttype: 'text',\n\t\t}],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_table\\` (\n\\t\\`name\\` text\n);\\n`);\n\texpect(sqlStatements[2]).toBe(\n\t\t`INSERT INTO \\`__new_table\\`(\"name\") SELECT \"name\" FROM \\`table\\`;`,\n\t);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`table\\`;`);\n\texpect(sqlStatements[4]).toBe(`ALTER TABLE \\`__new_table\\` RENAME TO \\`table\\`;`);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('alter column drop generated', async (t) => {\n\tconst from = {\n\t\tusers: sqliteTable('table', {\n\t\t\tid: int('id').primaryKey().notNull(),\n\t\t\tname: text('name').generatedAlwaysAs('drizzle is the best').notNull(),\n\t\t}),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tid: int('id').primaryKey().notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumnAutoIncrement: false,\n\t\tcolumnDefault: undefined,\n\t\tcolumnGenerated: undefined,\n\t\tcolumnName: 'name',\n\t\tcolumnNotNull: true,\n\t\tcolumnOnUpdate: undefined,\n\t\tcolumnPk: false,\n\t\tnewDataType: 'text',\n\t\tschema: '',\n\t\ttableName: 'table',\n\t\ttype: 'alter_table_alter_column_drop_generated',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`ALTER TABLE \\`table\\` DROP COLUMN \\`name\\`;`);\n\texpect(sqlStatements[1]).toBe(`ALTER TABLE \\`table\\` ADD \\`name\\` text NOT NULL;`);\n});\n\ntest('recreate table with nested references', async (t) => {\n\tlet users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\tname: text('name'),\n\t\tage: integer('age'),\n\t});\n\tlet subscriptions = sqliteTable('subscriptions', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\tuserId: integer('user_id').references(() => users.id),\n\t\tcustomerId: text('customer_id'),\n\t});\n\tconst schema1 = {\n\t\tusers: users,\n\t\tsubscriptions: subscriptions,\n\t\tsubscriptionMetadata: sqliteTable('subscriptions_metadata', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tsubscriptionId: text('subscription_id').references(() => subscriptions.id),\n\t\t}),\n\t};\n\n\tusers = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: false }),\n\t\tname: text('name'),\n\t\tage: integer('age'),\n\t});\n\tconst schema2 = {\n\t\tusers: users,\n\t\tsubscriptions: subscriptions,\n\t\tsubscriptionMetadata: sqliteTable('subscriptions_metadata', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\tsubscriptionId: text('subscription_id').references(() => subscriptions.id),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tschema1,\n\t\tschema2,\n\t\t[],\n\t);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tgenerated: undefined,\n\t\t\t\tname: 'age',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\ttableName: 'users',\n\t\ttype: 'recreate_table',\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(sqlStatements.length).toBe(6);\n\texpect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);\n\texpect(sqlStatements[1]).toBe(`CREATE TABLE \\`__new_users\\` (\n\\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\\t\\`name\\` text,\n\\t\\`age\\` integer\n);\\n`);\n\texpect(sqlStatements[2]).toBe(\n\t\t`INSERT INTO \\`__new_users\\`(\"id\", \"name\", \"age\") SELECT \"id\", \"name\", \"age\" FROM \\`users\\`;`,\n\t);\n\texpect(sqlStatements[3]).toBe(`DROP TABLE \\`users\\`;`);\n\texpect(sqlStatements[4]).toBe(`ALTER TABLE \\`__new_users\\` RENAME TO \\`users\\`;`);\n\texpect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);\n});\n\ntest('text default values escape single quotes', async (t) => {\n\tconst schema1 = {\n\t\ttable: sqliteTable('table', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t}),\n\t};\n\n\tconst schem2 = {\n\t\ttable: sqliteTable('table', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\ttext: text('text').default(\"escape's quotes\"),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSqlite(schema1, schem2, []);\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toStrictEqual(\n\t\t\"ALTER TABLE `table` ADD `text` text DEFAULT 'escape''s quotes';\",\n\t);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/sqlite-generated.test.ts",
    "content": "// 1. add stored column to existing table - not supported +\n// 2. add virtual column to existing table - supported +\n// 3. create table with stored/virtual columns(pg, mysql, sqlite)\n// 4. add stored generated to column -> not supported +\n// 5. add virtual generated to column -> supported with drop+add column +\n// 6. drop stored/virtual expression -> supported with drop+add column\n// 7. alter generated expession -> stored not supported, virtual supported\n\nimport { SQL, sql } from 'drizzle-orm';\nimport { int, sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasSqlite } from './schemaDiffer';\n\n// should generate 0 statements + warning/error in console\ntest('generated as callback: add column with stored generated constraint', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('generated as callback: add column with virtual generated constraint', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: '(\"name\" || \\'hello\\')',\n\t\t\t\t\ttype: 'virtual',\n\t\t\t\t},\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\treferenceData: undefined,\n\t\t\ttableName: 'users',\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (\"name\" || \\'hello\\') VIRTUAL;',\n\t]);\n});\n\ntest('generated as callback: add generated constraint to an exisiting column as stored', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`, {\n\t\t\t\t\tmode: 'stored',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('generated as callback: add generated constraint to an exisiting column as virtual', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`, {\n\t\t\t\t\tmode: 'virtual',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: '(\"name\" || \\'to add\\')',\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (\"name\" || \\'to add\\') VIRTUAL NOT NULL;',\n\t]);\n});\n\ntest('generated as callback: drop generated constraint as stored', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name} || 'to delete'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text;',\n\t]);\n});\n\ntest('generated as callback: drop generated constraint as virtual', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name} || 'to delete'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text;',\n\t]);\n});\n\n// no way to do it\ntest('generated as callback: change generated constraint type from virtual to stored', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name}`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('generated as callback: change generated constraint type from stored to virtual', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name}`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: '(\"name\" || \\'hello\\')',\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (\"name\" || \\'hello\\') VIRTUAL;',\n\t]);\n});\n\n// not supported\ntest('generated as callback: change stored generated constraint', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name}`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('generated as callback: change virtual generated constraint', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${from.users.name}`,\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: '(\"name\" || \\'hello\\')',\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (\"name\" || \\'hello\\') VIRTUAL;',\n\t]);\n});\n\ntest('generated as callback: add table with column with stored generated constraint', async () => {\n\tconst from = {};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'id2',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tgenerated: {\n\t\t\t\t\t\tas: '(\"name\" || \\'hello\\')',\n\t\t\t\t\t\ttype: 'stored',\n\t\t\t\t\t},\n\t\t\t\t\tname: 'gen_name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\ttableName: 'users',\n\t\t\ttype: 'sqlite_create_table',\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE `users` (\\n\\t`id` integer,\\n\\t`id2` integer,\\n\\t`name` text,\\n\\t`gen_name` text GENERATED ALWAYS AS (\"name\" || \\'hello\\') STORED\\n);\\n',\n\t]);\n});\n\ntest('generated as callback: add table with column with virtual generated constraint', async () => {\n\tconst from = {};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t(): SQL => sql`${to.users.name} || 'hello'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'id2',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tgenerated: {\n\t\t\t\t\t\tas: '(\"name\" || \\'hello\\')',\n\t\t\t\t\t\ttype: 'virtual',\n\t\t\t\t\t},\n\t\t\t\t\tname: 'gen_name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\ttableName: 'users',\n\t\t\ttype: 'sqlite_create_table',\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE `users` (\\n\\t`id` integer,\\n\\t`id2` integer,\\n\\t`name` text,\\n\\t`gen_name` text GENERATED ALWAYS AS (\"name\" || \\'hello\\') VIRTUAL\\n);\\n',\n\t]);\n});\n\n// ---\n\ntest('generated as sql: add column with stored generated constraint', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\"users\".\"name\" || \\'hello\\' || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('generated as sql: add column with virtual generated constraint', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\"users\".\"name\" || \\'hello\\'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: '(\"users\".\"name\" || \\'hello\\')',\n\t\t\t\t\ttype: 'virtual',\n\t\t\t\t},\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\treferenceData: undefined,\n\t\t\ttableName: 'users',\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') VIRTUAL;',\n\t]);\n});\n\ntest('generated as sql: add generated constraint to an exisiting column as stored', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(sql`\"users\".\"name\" || 'to add'`, {\n\t\t\t\t\tmode: 'stored',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('generated as sql: add generated constraint to an exisiting column as virtual', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(sql`\"users\".\"name\" || 'to add'`, {\n\t\t\t\t\tmode: 'virtual',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: '(\"users\".\"name\" || \\'to add\\')',\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (\"users\".\"name\" || \\'to add\\') VIRTUAL NOT NULL;',\n\t]);\n});\n\ntest('generated as sql: drop generated constraint as stored', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\"users\".\"name\" || 'to delete'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text;',\n\t]);\n});\n\ntest('generated as sql: drop generated constraint as virtual', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\"users\".\"name\" || 'to delete'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text;',\n\t]);\n});\n\n// no way to do it\ntest('generated as sql: change generated constraint type from virtual to stored', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(sql`\"users\".\"name\"`, {\n\t\t\t\tmode: 'virtual',\n\t\t\t}),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\"users\".\"name\" || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('generated as sql: change generated constraint type from stored to virtual', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(sql`\"users\".\"name\"`, {\n\t\t\t\tmode: 'stored',\n\t\t\t}),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\"users\".\"name\" || 'hello'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: '(\"users\".\"name\" || \\'hello\\')',\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') VIRTUAL;',\n\t]);\n});\n\n// not supported\ntest('generated as sql: change stored generated constraint', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(sql`\"users\".\"name\"`, {\n\t\t\t\tmode: 'stored',\n\t\t\t}),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\"users\".\"name\" || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('generated as sql: change virtual generated constraint', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(sql`\"users\".\"name\"`),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\"users\".\"name\" || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: '(\"users\".\"name\" || \\'hello\\')',\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') VIRTUAL;',\n\t]);\n});\n\ntest('generated as sql: add table with column with stored generated constraint', async () => {\n\tconst from = {};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\"users\".\"name\" || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'id2',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tgenerated: {\n\t\t\t\t\t\tas: '(\"users\".\"name\" || \\'hello\\')',\n\t\t\t\t\t\ttype: 'stored',\n\t\t\t\t\t},\n\t\t\t\t\tname: 'gen_name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\ttableName: 'users',\n\t\t\ttype: 'sqlite_create_table',\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE `users` (\\n\\t`id` integer,\\n\\t`id2` integer,\\n\\t`name` text,\\n\\t`gen_name` text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') STORED\\n);\\n',\n\t]);\n});\n\ntest('generated as sql: add table with column with virtual generated constraint', async () => {\n\tconst from = {};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\tsql`\"users\".\"name\" || 'hello'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'id2',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tgenerated: {\n\t\t\t\t\t\tas: '(\"users\".\"name\" || \\'hello\\')',\n\t\t\t\t\t\ttype: 'virtual',\n\t\t\t\t\t},\n\t\t\t\t\tname: 'gen_name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\ttableName: 'users',\n\t\t\ttype: 'sqlite_create_table',\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE `users` (\\n\\t`id` integer,\\n\\t`id2` integer,\\n\\t`name` text,\\n\\t`gen_name` text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') VIRTUAL\\n);\\n',\n\t]);\n});\n\n// ---\n\ntest('generated as string: add column with stored generated constraint', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\"users\".\"name\" || \\'hello\\'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('generated as string: add column with virtual generated constraint', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\"users\".\"name\" || \\'hello\\'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumn: {\n\t\t\t\tgenerated: {\n\t\t\t\t\tas: '(\"users\".\"name\" || \\'hello\\')',\n\t\t\t\t\ttype: 'virtual',\n\t\t\t\t},\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'gen_name',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'text',\n\t\t\t},\n\t\t\treferenceData: undefined,\n\t\t\ttableName: 'users',\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') VIRTUAL;',\n\t]);\n});\n\ntest('generated as string: add generated constraint to an exisiting column as stored', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(`\"users\".\"name\" || 'to add'`, {\n\t\t\t\t\tmode: 'stored',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('generated as string: add generated constraint to an exisiting column as virtual', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').notNull(),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name')\n\t\t\t\t.notNull()\n\t\t\t\t.generatedAlwaysAs(`\"users\".\"name\" || 'to add'`, {\n\t\t\t\t\tmode: 'virtual',\n\t\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: '(\"users\".\"name\" || \\'to add\\')',\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_set_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (\"users\".\"name\" || \\'to add\\') VIRTUAL NOT NULL;',\n\t]);\n});\n\ntest('generated as string: drop generated constraint as stored', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\"users\".\"name\" || 'to delete'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text;',\n\t]);\n});\n\ntest('generated as string: drop generated constraint as virtual', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\"users\".\"name\" || 'to delete'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName1: text('gen_name'),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: undefined,\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_drop_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text;',\n\t]);\n});\n\n// no way to do it\ntest('generated as string: change generated constraint type from virtual to stored', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(`\"users\".\"name\"`, {\n\t\t\t\tmode: 'virtual',\n\t\t\t}),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\"users\".\"name\" || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('generated as string: change generated constraint type from stored to virtual', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(`\"users\".\"name\"`, {\n\t\t\t\tmode: 'stored',\n\t\t\t}),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\"users\".\"name\" || 'hello'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: '(\"users\".\"name\" || \\'hello\\')',\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') VIRTUAL;',\n\t]);\n});\n\n// not supported\ntest('generated as string: change stored generated constraint', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(`\"users\".\"name\"`, {\n\t\t\t\tmode: 'stored',\n\t\t\t}),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\"users\".\"name\" || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([]);\n\texpect(sqlStatements).toStrictEqual([]);\n});\n\ntest('generated as string: change virtual generated constraint', async () => {\n\tconst from = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(`\"users\".\"name\"`),\n\t\t}),\n\t};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\"users\".\"name\" || 'hello'`,\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnGenerated: {\n\t\t\t\tas: '(\"users\".\"name\" || \\'hello\\')',\n\t\t\t\ttype: 'virtual',\n\t\t\t},\n\t\t\tcolumnName: 'gen_name',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnPk: false,\n\t\t\tnewDataType: 'text',\n\t\t\tschema: '',\n\t\t\ttableName: 'users',\n\t\t\ttype: 'alter_table_alter_column_alter_generated',\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `users` DROP COLUMN `gen_name`;',\n\t\t'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') VIRTUAL;',\n\t]);\n});\n\ntest('generated as string: add table with column with stored generated constraint', async () => {\n\tconst from = {};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\"users\".\"name\" || 'hello'`,\n\t\t\t\t{ mode: 'stored' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'id2',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tgenerated: {\n\t\t\t\t\t\tas: '(\"users\".\"name\" || \\'hello\\')',\n\t\t\t\t\t\ttype: 'stored',\n\t\t\t\t\t},\n\t\t\t\t\tname: 'gen_name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\ttableName: 'users',\n\t\t\ttype: 'sqlite_create_table',\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE `users` (\\n\\t`id` integer,\\n\\t`id2` integer,\\n\\t`name` text,\\n\\t`gen_name` text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') STORED\\n);\\n',\n\t]);\n});\n\ntest('generated as string: add table with column with virtual generated constraint', async () => {\n\tconst from = {};\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id'),\n\t\t\tid2: int('id2'),\n\t\t\tname: text('name'),\n\t\t\tgeneratedName: text('gen_name').generatedAlwaysAs(\n\t\t\t\t`\"users\".\"name\" || 'hello'`,\n\t\t\t\t{ mode: 'virtual' },\n\t\t\t),\n\t\t}),\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(\n\t\tfrom,\n\t\tto,\n\t\t[],\n\t);\n\n\texpect(statements).toStrictEqual([\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'id',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'id2',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tgenerated: {\n\t\t\t\t\t\tas: '(\"users\".\"name\" || \\'hello\\')',\n\t\t\t\t\t\ttype: 'virtual',\n\t\t\t\t\t},\n\t\t\t\t\tname: 'gen_name',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\ttableName: 'users',\n\t\t\ttype: 'sqlite_create_table',\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t]);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE `users` (\\n\\t`id` integer,\\n\\t`id2` integer,\\n\\t`name` text,\\n\\t`gen_name` text GENERATED ALWAYS AS (\"users\".\"name\" || \\'hello\\') VIRTUAL\\n);\\n',\n\t]);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/sqlite-tables.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport {\n\tAnySQLiteColumn,\n\tforeignKey,\n\tindex,\n\tint,\n\tprimaryKey,\n\tsqliteTable,\n\ttext,\n\tunique,\n\tuniqueIndex,\n} from 'drizzle-orm/sqlite-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasSqlite } from './schemaDiffer';\n\ntest('add table #1', async () => {\n\tconst to = {\n\t\tusers: sqliteTable('users', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'users',\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\treferenceData: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('add table #2', async () => {\n\tconst to = {\n\t\tusers: sqliteTable('users', {\n\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'users',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t\tautoincrement: true,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\treferenceData: [],\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('add table #3', async () => {\n\tconst to = {\n\t\tusers: sqliteTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid: int('id'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\tpk: primaryKey({\n\t\t\t\t\t\tname: 'users_pk',\n\t\t\t\t\t\tcolumns: [t.id],\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'users',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\treferenceData: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('add table #4', async () => {\n\tconst to = {\n\t\tusers: sqliteTable('users', {}),\n\t\tposts: sqliteTable('posts', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'users',\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\treferenceData: [],\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'posts',\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\treferenceData: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('add table #5', async () => {\n\t// no schemas in sqlite\n});\n\ntest('add table #6', async () => {\n\tconst from = {\n\t\tusers1: sqliteTable('users1', {}),\n\t};\n\n\tconst to = {\n\t\tusers2: sqliteTable('users2', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(from, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'users2',\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\treferenceData: [],\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'drop_table',\n\t\ttableName: 'users1',\n\t\tschema: undefined,\n\t\tpolicies: [],\n\t});\n});\n\ntest('add table #7', async () => {\n\tconst from = {\n\t\tusers1: sqliteTable('users1', {}),\n\t};\n\n\tconst to = {\n\t\tusers: sqliteTable('users', {}),\n\t\tusers2: sqliteTable('users2', {}),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite(from, to, [\n\t\t'public.users1->public.users2',\n\t]);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'rename_table',\n\t\ttableNameFrom: 'users1',\n\t\ttableNameTo: 'users2',\n\t\tfromSchema: undefined,\n\t\ttoSchema: undefined,\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'users',\n\t\tcolumns: [],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\treferenceData: [],\n\t\tcheckConstraints: [],\n\t});\n});\n\ntest('add table #8', async () => {\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\treporteeId: int('reportee_id').references((): AnySQLiteColumn => users.id),\n\t});\n\n\tconst to = {\n\t\tusers,\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite({}, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'users',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: true,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'reportee_id',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\tcheckConstraints: [],\n\t\treferenceData: [\n\t\t\t{\n\t\t\t\tcolumnsFrom: ['reportee_id'],\n\t\t\t\tcolumnsTo: ['id'],\n\t\t\t\tname: 'users_reportee_id_users_id_fk',\n\t\t\t\tonDelete: 'no action',\n\t\t\t\tonUpdate: 'no action',\n\t\t\t\ttableFrom: 'users',\n\t\t\t\ttableTo: 'users',\n\t\t\t},\n\t\t],\n\t});\n});\n\ntest('add table #9', async () => {\n\tconst to = {\n\t\tusers: sqliteTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\t\treporteeId: int('reportee_id'),\n\t\t\t},\n\t\t\t(t) => {\n\t\t\t\treturn {\n\t\t\t\t\treporteeIdx: index('reportee_idx').on(t.reporteeId),\n\t\t\t\t};\n\t\t\t},\n\t\t),\n\t};\n\n\tconst { statements } = await diffTestSchemasSqlite({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'users',\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tautoincrement: true,\n\t\t\t\tname: 'id',\n\t\t\t\tnotNull: true,\n\t\t\t\tprimaryKey: true,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\t{\n\t\t\t\tautoincrement: false,\n\t\t\t\tname: 'reportee_id',\n\t\t\t\tnotNull: false,\n\t\t\t\tprimaryKey: false,\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\treferenceData: [],\n\t\tcheckConstraints: [],\n\t});\n\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'create_index',\n\t\ttableName: 'users',\n\t\tinternal: {\n\t\t\tindexes: {},\n\t\t},\n\t\tschema: undefined,\n\t\tdata: 'reportee_idx;reportee_id;false;',\n\t});\n});\n\ntest('add table #10', async () => {\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tjson: text('json', { mode: 'json' }).default({}),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSqlite({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t\"CREATE TABLE `table` (\\n\\t`json` text DEFAULT '{}'\\n);\\n\",\n\t);\n});\n\ntest('add table #11', async () => {\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tjson: text('json', { mode: 'json' }).default([]),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSqlite({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t\"CREATE TABLE `table` (\\n\\t`json` text DEFAULT '[]'\\n);\\n\",\n\t);\n});\n\ntest('add table #12', async () => {\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tjson: text('json', { mode: 'json' }).default([1, 2, 3]),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSqlite({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t\"CREATE TABLE `table` (\\n\\t`json` text DEFAULT '[1,2,3]'\\n);\\n\",\n\t);\n});\n\ntest('add table #13', async () => {\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tjson: text('json', { mode: 'json' }).default({ key: 'value' }),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSqlite({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t'CREATE TABLE `table` (\\n\\t`json` text DEFAULT \\'{\"key\":\"value\"}\\'\\n);\\n',\n\t);\n});\n\ntest('add table #14', async () => {\n\tconst to = {\n\t\tusers: sqliteTable('table', {\n\t\t\tjson: text('json', { mode: 'json' }).default({\n\t\t\t\tkey: 'value',\n\t\t\t\tarr: [1, 2, 3],\n\t\t\t}),\n\t\t}),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSqlite({}, to, []);\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t'CREATE TABLE `table` (\\n\\t`json` text DEFAULT \\'{\"key\":\"value\",\"arr\":[1,2,3]}\\'\\n);\\n',\n\t);\n});\n\ntest('add table with indexes', async () => {\n\tconst from = {};\n\n\tconst to = {\n\t\tusers: sqliteTable(\n\t\t\t'users',\n\t\t\t{\n\t\t\t\tid: int('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t\temail: text('email'),\n\t\t\t},\n\t\t\t(t) => ({\n\t\t\t\tuniqueExpr: uniqueIndex('uniqueExpr').on(sql`(lower(${t.email}))`),\n\t\t\t\tindexExpr: index('indexExpr').on(sql`(lower(${t.email}))`),\n\t\t\t\tindexExprMultiple: index('indexExprMultiple').on(\n\t\t\t\t\tsql`(lower(${t.email}))`,\n\t\t\t\t\tsql`(lower(${t.email}))`,\n\t\t\t\t),\n\n\t\t\t\tuniqueCol: uniqueIndex('uniqueCol').on(t.email),\n\t\t\t\tindexCol: index('indexCol').on(t.email),\n\t\t\t\tindexColMultiple: index('indexColMultiple').on(t.email, t.email),\n\n\t\t\t\tindexColExpr: index('indexColExpr').on(\n\t\t\t\t\tsql`(lower(${t.email}))`,\n\t\t\t\t\tt.email,\n\t\t\t\t),\n\t\t\t}),\n\t\t),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSqlite(from, to, []);\n\texpect(sqlStatements.length).toBe(8);\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE `users` (\\n\\t`id` integer PRIMARY KEY NOT NULL,\\n\\t`name` text,\\n\\t`email` text\\n);\\n',\n\t\t'CREATE UNIQUE INDEX `uniqueExpr` ON `users` ((lower(\"email\")));',\n\t\t'CREATE INDEX `indexExpr` ON `users` ((lower(\"email\")));',\n\t\t'CREATE INDEX `indexExprMultiple` ON `users` ((lower(\"email\")),(lower(\"email\")));',\n\t\t'CREATE UNIQUE INDEX `uniqueCol` ON `users` (`email`);',\n\t\t'CREATE INDEX `indexCol` ON `users` (`email`);',\n\t\t'CREATE INDEX `indexColMultiple` ON `users` (`email`,`email`);',\n\t\t'CREATE INDEX `indexColExpr` ON `users` ((lower(\"email\")),`email`);',\n\t]);\n});\n\ntest('composite primary key', async () => {\n\tconst from = {};\n\tconst to = {\n\t\ttable: sqliteTable('works_to_creators', {\n\t\t\tworkId: int('work_id').notNull(),\n\t\t\tcreatorId: int('creator_id').notNull(),\n\t\t\tclassification: text('classification').notNull(),\n\t\t}, (t) => ({\n\t\t\tpk: primaryKey({\n\t\t\t\tcolumns: [t.workId, t.creatorId, t.classification],\n\t\t\t}),\n\t\t})),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSqlite(from, to, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'CREATE TABLE `works_to_creators` (\\n\\t`work_id` integer NOT NULL,\\n\\t`creator_id` integer NOT NULL,\\n\\t`classification` text NOT NULL,\\n\\tPRIMARY KEY(`work_id`, `creator_id`, `classification`)\\n);\\n',\n\t]);\n});\n\ntest('add column before creating unique constraint', async () => {\n\tconst from = {\n\t\ttable: sqliteTable('table', {\n\t\t\tid: int('id').primaryKey(),\n\t\t}),\n\t};\n\tconst to = {\n\t\ttable: sqliteTable('table', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}, (t) => ({\n\t\t\tuq: unique('uq').on(t.name),\n\t\t})),\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSqlite(from, to, []);\n\n\texpect(sqlStatements).toStrictEqual([\n\t\t'ALTER TABLE `table` ADD `name` text NOT NULL;',\n\t\t'CREATE UNIQUE INDEX `uq` ON `table` (`name`);',\n\t]);\n});\n\ntest('optional db aliases (snake case)', async () => {\n\tconst from = {};\n\n\tconst t1 = sqliteTable(\n\t\t't1',\n\t\t{\n\t\t\tt1Id1: int().notNull().primaryKey(),\n\t\t\tt1Col2: int().notNull(),\n\t\t\tt1Col3: int().notNull(),\n\t\t\tt2Ref: int().notNull().references(() => t2.t2Id),\n\t\t\tt1Uni: int().notNull(),\n\t\t\tt1UniIdx: int().notNull(),\n\t\t\tt1Idx: int().notNull(),\n\t\t},\n\t\t(table) => ({\n\t\t\tuni: unique('t1_uni').on(table.t1Uni),\n\t\t\tuniIdx: uniqueIndex('t1_uni_idx').on(table.t1UniIdx),\n\t\t\tidx: index('t1_idx').on(table.t1Idx),\n\t\t\tfk: foreignKey({\n\t\t\t\tcolumns: [table.t1Col2, table.t1Col3],\n\t\t\t\tforeignColumns: [t3.t3Id1, t3.t3Id2],\n\t\t\t}),\n\t\t}),\n\t);\n\n\tconst t2 = sqliteTable(\n\t\t't2',\n\t\t{\n\t\t\tt2Id: int().primaryKey({ autoIncrement: true }),\n\t\t},\n\t);\n\n\tconst t3 = sqliteTable(\n\t\t't3',\n\t\t{\n\t\t\tt3Id1: int(),\n\t\t\tt3Id2: int(),\n\t\t},\n\t\t(table) => ({\n\t\t\tpk: primaryKey({\n\t\t\t\tcolumns: [table.t3Id1, table.t3Id2],\n\t\t\t}),\n\t\t}),\n\t);\n\n\tconst to = {\n\t\tt1,\n\t\tt2,\n\t\tt3,\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSqlite(from, to, [], false, 'snake_case');\n\n\tconst st1 = `CREATE TABLE \\`t1\\` (\n\t\\`t1_id1\\` integer PRIMARY KEY NOT NULL,\n\t\\`t1_col2\\` integer NOT NULL,\n\t\\`t1_col3\\` integer NOT NULL,\n\t\\`t2_ref\\` integer NOT NULL,\n\t\\`t1_uni\\` integer NOT NULL,\n\t\\`t1_uni_idx\\` integer NOT NULL,\n\t\\`t1_idx\\` integer NOT NULL,\n\tFOREIGN KEY (\\`t2_ref\\`) REFERENCES \\`t2\\`(\\`t2_id\\`) ON UPDATE no action ON DELETE no action,\n\tFOREIGN KEY (\\`t1_col2\\`,\\`t1_col3\\`) REFERENCES \\`t3\\`(\\`t3_id1\\`,\\`t3_id2\\`) ON UPDATE no action ON DELETE no action\n);\n`;\n\n\tconst st2 = `CREATE UNIQUE INDEX \\`t1_uni_idx\\` ON \\`t1\\` (\\`t1_uni_idx\\`);`;\n\n\tconst st3 = `CREATE INDEX \\`t1_idx\\` ON \\`t1\\` (\\`t1_idx\\`);`;\n\n\tconst st4 = `CREATE UNIQUE INDEX \\`t1_uni\\` ON \\`t1\\` (\\`t1_uni\\`);`;\n\n\tconst st5 = `CREATE TABLE \\`t2\\` (\n\t\\`t2_id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL\n);\n`;\n\n\tconst st6 = `CREATE TABLE \\`t3\\` (\n\t\\`t3_id1\\` integer,\n\t\\`t3_id2\\` integer,\n\tPRIMARY KEY(\\`t3_id1\\`, \\`t3_id2\\`)\n);\n`;\n\n\texpect(sqlStatements).toStrictEqual([st1, st2, st3, st4, st5, st6]);\n});\n\ntest('optional db aliases (camel case)', async () => {\n\tconst from = {};\n\n\tconst t1 = sqliteTable(\n\t\t't1',\n\t\t{\n\t\t\tt1_id1: int().notNull().primaryKey(),\n\t\t\tt1_col2: int().notNull(),\n\t\t\tt1_col3: int().notNull(),\n\t\t\tt2_ref: int().notNull().references(() => t2.t2_id),\n\t\t\tt1_uni: int().notNull(),\n\t\t\tt1_uni_idx: int().notNull(),\n\t\t\tt1_idx: int().notNull(),\n\t\t},\n\t\t(table) => ({\n\t\t\tuni: unique('t1Uni').on(table.t1_uni),\n\t\t\tuni_idx: uniqueIndex('t1UniIdx').on(table.t1_uni_idx),\n\t\t\tidx: index('t1Idx').on(table.t1_idx),\n\t\t\tfk: foreignKey({\n\t\t\t\tcolumns: [table.t1_col2, table.t1_col3],\n\t\t\t\tforeignColumns: [t3.t3_id1, t3.t3_id2],\n\t\t\t}),\n\t\t}),\n\t);\n\n\tconst t2 = sqliteTable(\n\t\t't2',\n\t\t{\n\t\t\tt2_id: int().primaryKey({ autoIncrement: true }),\n\t\t},\n\t);\n\n\tconst t3 = sqliteTable(\n\t\t't3',\n\t\t{\n\t\t\tt3_id1: int(),\n\t\t\tt3_id2: int(),\n\t\t},\n\t\t(table) => ({\n\t\t\tpk: primaryKey({\n\t\t\t\tcolumns: [table.t3_id1, table.t3_id2],\n\t\t\t}),\n\t\t}),\n\t);\n\n\tconst to = {\n\t\tt1,\n\t\tt2,\n\t\tt3,\n\t};\n\n\tconst { sqlStatements } = await diffTestSchemasSqlite(from, to, [], false, 'camelCase');\n\n\tconst st1 = `CREATE TABLE \\`t1\\` (\n\t\\`t1Id1\\` integer PRIMARY KEY NOT NULL,\n\t\\`t1Col2\\` integer NOT NULL,\n\t\\`t1Col3\\` integer NOT NULL,\n\t\\`t2Ref\\` integer NOT NULL,\n\t\\`t1Uni\\` integer NOT NULL,\n\t\\`t1UniIdx\\` integer NOT NULL,\n\t\\`t1Idx\\` integer NOT NULL,\n\tFOREIGN KEY (\\`t2Ref\\`) REFERENCES \\`t2\\`(\\`t2Id\\`) ON UPDATE no action ON DELETE no action,\n\tFOREIGN KEY (\\`t1Col2\\`,\\`t1Col3\\`) REFERENCES \\`t3\\`(\\`t3Id1\\`,\\`t3Id2\\`) ON UPDATE no action ON DELETE no action\n);\n`;\n\n\tconst st2 = `CREATE UNIQUE INDEX \\`t1UniIdx\\` ON \\`t1\\` (\\`t1UniIdx\\`);`;\n\n\tconst st3 = `CREATE INDEX \\`t1Idx\\` ON \\`t1\\` (\\`t1Idx\\`);`;\n\n\tconst st4 = `CREATE UNIQUE INDEX \\`t1Uni\\` ON \\`t1\\` (\\`t1Uni\\`);`;\n\n\tconst st5 = `CREATE TABLE \\`t2\\` (\n\t\\`t2Id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL\n);\n`;\n\n\tconst st6 = `CREATE TABLE \\`t3\\` (\n\t\\`t3Id1\\` integer,\n\t\\`t3Id2\\` integer,\n\tPRIMARY KEY(\\`t3Id1\\`, \\`t3Id2\\`)\n);\n`;\n\n\texpect(sqlStatements).toStrictEqual([st1, st2, st3, st4, st5, st6]);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/sqlite-views.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { int, sqliteTable, sqliteView } from 'drizzle-orm/sqlite-core';\nimport { expect, test } from 'vitest';\nimport { diffTestSchemasSqlite } from './schemaDiffer';\n\ntest('create view', async () => {\n\tconst users = sqliteTable('users', { id: int('id').default(1) });\n\tconst view = sqliteView('view').as((qb) => qb.select().from(users));\n\tconst to = {\n\t\tusers: users,\n\t\ttestView: view,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite({}, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\ttype: 'sqlite_create_table',\n\t\ttableName: 'users',\n\t\tcolumns: [{\n\t\t\tautoincrement: false,\n\t\t\tdefault: 1,\n\t\t\tname: 'id',\n\t\t\ttype: 'integer',\n\t\t\tprimaryKey: false,\n\t\t\tnotNull: false,\n\t\t}],\n\t\tcompositePKs: [],\n\t\tuniqueConstraints: [],\n\t\treferenceData: [],\n\t\tcheckConstraints: [],\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'sqlite_create_view',\n\t\tname: 'view',\n\t\tdefinition: 'select \"id\" from \"users\"',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`CREATE TABLE \\`users\\` (\n\\t\\`id\\` integer DEFAULT 1\n);\\n`);\n\texpect(sqlStatements[1]).toBe(`CREATE VIEW \\`view\\` AS select \"id\" from \"users\";`);\n});\n\ntest('drop view', async () => {\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\ttestView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users`),\n\t};\n\tconst to = {\n\t\tusers,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(from, to, []);\n\n\texpect(statements.length).toBe(1);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'view',\n\t\ttype: 'drop_view',\n\t});\n\n\texpect(sqlStatements.length).toBe(1);\n\texpect(sqlStatements[0]).toBe(\n\t\t`DROP VIEW \\`view\\`;`,\n\t);\n});\n\ntest('alter view', async () => {\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\ttestView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users`),\n\t};\n\tconst to = {\n\t\tusers,\n\t\ttestView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users WHERE users.id = 1`),\n\t};\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(from, to, []);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'view',\n\t\ttype: 'drop_view',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\tname: 'view',\n\t\ttype: 'sqlite_create_view',\n\t\tdefinition: 'SELECT * FROM users WHERE users.id = 1',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(\n\t\t`DROP VIEW \\`view\\`;`,\n\t);\n\texpect(sqlStatements[1]).toBe(\n\t\t`CREATE VIEW \\`view\\` AS SELECT * FROM users WHERE users.id = 1;`,\n\t);\n});\n\ntest('create view with existing flag', async () => {\n\tconst view = sqliteView('view', {}).existing();\n\tconst to = {\n\t\ttestView: view,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite({}, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('drop view with existing flag', async () => {\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\ttestView: sqliteView('view', { id: int('id') }).existing(),\n\t};\n\tconst to = {\n\t\tusers,\n\t};\n\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(from, to, []);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('rename view with existing flag', async () => {\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\ttestView: sqliteView('view', { id: int('id') }).existing(),\n\t};\n\tconst to = {\n\t\tusers,\n\t\ttestView: sqliteView('new_view', { id: int('id') }).existing(),\n\t};\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(from, to, ['view->new_view']);\n\n\texpect(statements.length).toBe(0);\n\texpect(sqlStatements.length).toBe(0);\n});\n\ntest('rename view and drop existing flag', async () => {\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\ttestView: sqliteView('view', { id: int('id') }).existing(),\n\t};\n\tconst to = {\n\t\tusers,\n\t\ttestView: sqliteView('new_view', { id: int('id') }).as(sql`SELECT * FROM users`),\n\t};\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(from, to, ['view->new_view']);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'view',\n\t\ttype: 'drop_view',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'sqlite_create_view',\n\t\tname: 'new_view',\n\t\tdefinition: 'SELECT * FROM users',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe(`DROP VIEW \\`view\\`;`);\n\texpect(sqlStatements[1]).toBe(`CREATE VIEW \\`new_view\\` AS SELECT * FROM users;`);\n});\n\ntest('rename view and alter \".as\"', async () => {\n\tconst users = sqliteTable('users', {\n\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t});\n\n\tconst from = {\n\t\tusers: users,\n\t\ttestView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users`),\n\t};\n\tconst to = {\n\t\tusers,\n\t\ttestView: sqliteView('new_view', { id: int('id') }).as(sql`SELECT * FROM users WHERE 1=1`),\n\t};\n\tconst { statements, sqlStatements } = await diffTestSchemasSqlite(from, to, ['view->new_view']);\n\n\texpect(statements.length).toBe(2);\n\texpect(statements[0]).toStrictEqual({\n\t\tname: 'view',\n\t\ttype: 'drop_view',\n\t});\n\texpect(statements[1]).toStrictEqual({\n\t\ttype: 'sqlite_create_view',\n\t\tname: 'new_view',\n\t\tdefinition: 'SELECT * FROM users WHERE 1=1',\n\t});\n\n\texpect(sqlStatements.length).toBe(2);\n\texpect(sqlStatements[0]).toBe('DROP VIEW `view`;');\n\texpect(sqlStatements[1]).toBe(`CREATE VIEW \\`new_view\\` AS SELECT * FROM users WHERE 1=1;`);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/statements-combiner/libsql-statements-combiner.test.ts",
    "content": "import { JsonAddColumnStatement, JsonSqliteAddColumnStatement, JsonStatement } from 'src/jsonStatements';\nimport { SQLiteSchemaSquashed } from 'src/serializer/sqliteSchema';\nimport { SQLiteAlterTableAddColumnConvertor } from 'src/sqlgenerator';\nimport { libSQLCombineStatements } from 'src/statementCombiner';\nimport { expect, test } from 'vitest';\n\n/**\n * ! before:\n *\n * user: {\n *    id INT;\n *    first_name INT;\n *    iq INT;\n *    PRIMARY KEY (id, iq)\n *    INDEXES: {\n *      UNIQUE id;\n *    }\n * }\n *\n * ! after:\n *\n *  new_user: {\n *    id INT;\n *    first_name INT;\n *    iq INT;\n *    PRIMARY KEY (id, iq)\n *    INDEXES: {}\n * }\n *\n * rename table and drop unique index\n * expect to get \"rename_table\" statement and then \"recreate_table\"\n */\ntest(`rename table and drop index`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'rename_table',\n\t\t\tfromSchema: '',\n\t\t\ttoSchema: '',\n\t\t\ttableNameFrom: 'user',\n\t\t\ttableNameTo: 'new_user',\n\t\t},\n\t\t{\n\t\t\ttype: 'drop_index',\n\t\t\ttableName: 'new_user',\n\t\t\tdata: 'user_first_name_unique;first_name;true;',\n\t\t\tschema: '',\n\t\t},\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tfirst_name: {\n\t\t\t\t\t\tname: 'first_name',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tiq: {\n\t\t\t\t\t\tname: 'iq',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {\n\t\t\t\t\tuser_first_name_unique: 'user_first_name_unique;first_name;true;',\n\t\t\t\t},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {\n\t\t\t\t\tuser_id_iq_pk: 'id,iq',\n\t\t\t\t},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tnew_user: {\n\t\t\t\tname: 'new_user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tfirst_name: {\n\t\t\t\t\t\tname: 'first_name',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tiq: {\n\t\t\t\t\t\tname: 'iq',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {\n\t\t\t\t\tnew_user_id_iq_pk: 'id,iq',\n\t\t\t\t},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'rename_table',\n\t\t\tfromSchema: '',\n\t\t\ttoSchema: '',\n\t\t\ttableNameFrom: 'user',\n\t\t\ttableNameTo: 'new_user',\n\t\t},\n\t\t{\n\t\t\ttype: 'drop_index',\n\t\t\ttableName: 'new_user',\n\t\t\tdata: 'user_first_name_unique;first_name;true;',\n\t\t\tschema: '',\n\t\t},\n\t];\n\texpect(libSQLCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\n/**\n * ! before:\n *\n * autoincrement1: {\n *    id INT PRIMARY KEY;\n * }\n *\n * autoincrement2: {\n *    id INT PRIMARY KEY AUTOINCREMENT;\n * }\n *\n * dropNotNull: {\n *    id INT NOT NULL;\n * }\n *\n * ! after:\n *\n * autoincrement1: {\n *    id INT PRIMARY KEY AUTOINCREMENT;\n * }\n *\n * autoincrement2: {\n *    id INT PRI<ARY KEY;\n * }\n *\n * dropNotNull: {\n *    id INT;\n * }\n *\n * drop autoincrement for autoincrement1\n * set autoincrement for autoincrement2\n *\n * expect to:\n * - get \"recreate_table\" for autoincrement1\n * - get \"recreate_table\" for autoincrement2\n * - get \"drop_notnull\" for dropNotNull\n */\ntest(`drop, set autoincrement. drop not null`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_autoincrement',\n\t\t\ttableName: 'autoincrement1',\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'int',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnAutoIncrement: true,\n\t\t\tcolumnPk: true,\n\t\t} as unknown as JsonStatement,\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_drop_autoincrement',\n\t\t\ttableName: 'autoincrement2',\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'int',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: true,\n\t\t} as unknown as JsonStatement,\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t\t\ttableName: 'dropNotNull',\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'int',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t} as unknown as JsonStatement,\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tautoincrement1: {\n\t\t\t\tname: 'autoincrement1',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tautoincrement2: {\n\t\t\t\tname: 'autoincrement2',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tdropNotNull: {\n\t\t\t\tname: 'dropNotNull',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tautoincrement1: {\n\t\t\t\tname: 'autoincrement1',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tautoincrement2: {\n\t\t\t\tname: 'autoincrement2',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tdropNotNull: {\n\t\t\t\tname: 'dropNotNull',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\ttableName: 'autoincrement1',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\ttableName: 'autoincrement2',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t\t\ttableName: 'dropNotNull',\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'int',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t},\n\t];\n\texpect(libSQLCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\n/**\n * ! before:\n *\n * pk1: {\n *    id INT;\n * }\n *\n * pk2: {\n *    id INT PRIMARY KEY;\n * }\n *\n * ref_table: {\n *    id INT;\n * }\n *\n * create_reference: {\n *    id INT;\n * }\n *\n * ! after:\n *\n * pk1: {\n *    id INT PRIMARY KEY;\n * }\n *\n * pk2: {\n *    id INT;\n * }\n *\n * ref_table: {\n *    id INT;\n * }\n *\n * create_reference: {\n *    id INT -> ref_table INT;\n * }\n *\n * drop primary key for pk2\n * set primary key for pk1\n * \"create_reference\" reference on \"ref_table\"\n *\n * expect to:\n * - \"recreate_table\" statement for pk1\n * - \"recreate_table\" statement for pk2\n * - \"create_reference\" statement for create_reference\n */\ntest(`drop and set primary key. create reference`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_pk',\n\t\t\ttableName: 'pk1',\n\t\t\tschema: '',\n\t\t\tcolumnName: 'id',\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_notnull',\n\t\t\ttableName: 'pk1',\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'int',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: true,\n\t\t} as unknown as JsonStatement,\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_drop_pk',\n\t\t\ttableName: 'pk2',\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t\t\ttableName: 'pk2',\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'int',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t} as unknown as JsonStatement,\n\t\t{\n\t\t\ttype: 'create_reference',\n\t\t\ttableName: 'create_reference',\n\t\t\tdata: 'create_reference_id_ref_table_id_fk;create_reference;id;ref_table;id;no action;no action',\n\t\t\tschema: '',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnType: 'int',\n\t\t},\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tcreate_reference: {\n\t\t\t\tname: 'create_reference',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tpk1: {\n\t\t\t\tname: 'pk1',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tpk2: {\n\t\t\t\tname: 'pk2',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tref_table: {\n\t\t\t\tname: 'ref_table',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tcreate_reference: {\n\t\t\t\tname: 'create_reference',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tcreate_reference_id_ref_table_id_fk:\n\t\t\t\t\t\t'create_reference_id_ref_table_id_fk;create_reference;id;ref_table;id;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tpk1: {\n\t\t\t\tname: 'pk1',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tpk2: {\n\t\t\t\tname: 'pk2',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tref_table: {\n\t\t\t\tname: 'ref_table',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\ttableName: 'pk1',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\ttableName: 'pk2',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t\t{\n\t\t\ttype: 'create_reference',\n\t\t\ttableName: 'create_reference',\n\t\t\tdata: 'create_reference_id_ref_table_id_fk;create_reference;id;ref_table;id;no action;no action',\n\t\t\tschema: '',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnType: 'int',\n\t\t},\n\t];\n\texpect(libSQLCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\n/**\n * ! before:\n *\n * fk1: {\n *  fk_id INT;\n *  fk_id1 INT;\n * }\n *\n * fk2: {\n *  fk2_id INT;  -> composite reference on ref_table id INT\n *  fk2_id1 INT; -> composite reference on ref_table id1 INT\n * }\n *\n * ref_table: {\n *  id INT;\n *  id1 INT;\n * }\n *\n * ! after:\n *\n * fk1: {\n *  fk_id INT;  -> composite reference on ref_table id INT\n *  fk_id1 INT; -> composite reference on ref_table id1 INT\n * }\n *\n * fk2: {\n *  fk2_id INT;\n *  fk2_id1 INT;\n * }\n *\n * ref_table: {\n *  id INT;\n *  id1 INT;\n * }\n *\n * set multi column reference for fk1\n * drop multi column reference for fk2\n *\n * expect to:\n * - \"recreate_table\" statement for fk1\n * - \"recreate_table\" statement for fk2\n */\ntest(`set and drop multiple columns reference`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'delete_reference',\n\t\t\ttableName: 'fk1',\n\t\t\tdata: 'fk1_fk_id_fk_id1_ref_table_id_id1_fk;fk1;fk_id,fk_id1;ref_table;id,id1;no action;no action',\n\t\t\tschema: '',\n\t\t\tisMulticolumn: true,\n\t\t},\n\t\t{\n\t\t\ttype: 'create_reference',\n\t\t\ttableName: 'fk2',\n\t\t\tdata: 'fk2_fk2_id_fk2_id1_ref_table_id_id1_fk;fk2;fk2_id,fk2_id1;ref_table;id,id1;no action;no action',\n\t\t\tschema: '',\n\t\t\tisMulticolumn: true,\n\t\t},\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tfk1: {\n\t\t\t\tname: 'fk1',\n\t\t\t\tcolumns: {\n\t\t\t\t\tfk_id: {\n\t\t\t\t\t\tname: 'fk_id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tfk_id1: {\n\t\t\t\t\t\tname: 'fk_id1',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tfk1_fk_id_fk_id1_ref_table_id_id1_fk:\n\t\t\t\t\t\t'fk1_fk_id_fk_id1_ref_table_id_id1_fk;fk1;fk_id,fk_id1;ref_table;id,id1;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tfk2: {\n\t\t\t\tname: 'fk2',\n\t\t\t\tcolumns: {\n\t\t\t\t\tfk2_id: {\n\t\t\t\t\t\tname: 'fk2_id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tfk2_id1: {\n\t\t\t\t\t\tname: 'fk2_id1',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tref_table: {\n\t\t\t\tname: 'ref_table',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tfk1: {\n\t\t\t\tname: 'fk1',\n\t\t\t\tcolumns: {\n\t\t\t\t\tfk_id: {\n\t\t\t\t\t\tname: 'fk_id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tfk_id1: {\n\t\t\t\t\t\tname: 'fk_id1',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tfk2: {\n\t\t\t\tname: 'fk2',\n\t\t\t\tcolumns: {\n\t\t\t\t\tfk2_id: {\n\t\t\t\t\t\tname: 'fk2_id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tfk2_id1: {\n\t\t\t\t\t\tname: 'fk2_id1',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tfk2_fk2_id_fk2_id1_ref_table_id_id1_fk:\n\t\t\t\t\t\t'fk2_fk2_id_fk2_id1_ref_table_id_id1_fk;fk2;fk2_id,fk2_id1;ref_table;id,id1;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tref_table: {\n\t\t\t\tname: 'ref_table',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\ttableName: 'fk1',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'fk_id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'fk_id1',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\ttableName: 'fk2',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'fk2_id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'fk2_id1',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [\n\t\t\t\t{\n\t\t\t\t\tname: 'fk2_fk2_id_fk2_id1_ref_table_id_id1_fk',\n\t\t\t\t\ttableFrom: 'fk2',\n\t\t\t\t\ttableTo: 'ref_table',\n\t\t\t\t\tcolumnsFrom: ['fk2_id', 'fk2_id1'],\n\t\t\t\t\tcolumnsTo: ['id', 'id1'],\n\t\t\t\t\tonDelete: 'no action',\n\t\t\t\t\tonUpdate: 'no action',\n\t\t\t\t},\n\t\t\t],\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t];\n\texpect(libSQLCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\n/**\n * ! before:\n *\n * pk: {\n *  pk TEXT PRIMARY KEY;\n * }\n *\n * simple: {\n *  simple TEXT;\n * }\n *\n * unique: {\n *  unique INT UNIQUE;\n * }\n *\n * ! after:\n *\n * pk: {\n *  pk INT PRIMARY KEY;\n * }\n *\n * simple: {\n *  simple INT;\n * }\n *\n * unique: {\n *  unique TEXT UNIQUE;\n * }\n *\n * set new type for primary key column\n * set new type for unique column\n * set new type for column without pk or unique\n *\n * expect to:\n * - \"recreate_table\" statement for pk\n * - \"recreate_table\" statement for unique\n * - \"alter_table_alter_column_set_type\" statement for simple\n * - \"create_index\" statement for unique\n */\ntest(`set new type for primary key, unique and normal column`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_type',\n\t\t\ttableName: 'pk',\n\t\t\tcolumnName: 'pk',\n\t\t\tnewDataType: 'int',\n\t\t\toldDataType: 'text',\n\t\t\tschema: '',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: true,\n\t\t} as unknown as JsonStatement,\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_type',\n\t\t\ttableName: 'simple',\n\t\t\tcolumnName: 'simple',\n\t\t\tnewDataType: 'int',\n\t\t\toldDataType: 'text',\n\t\t\tschema: '',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t} as unknown as JsonStatement,\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_type',\n\t\t\ttableName: 'unique',\n\t\t\tcolumnName: 'unique',\n\t\t\tnewDataType: 'text',\n\t\t\toldDataType: 'int',\n\t\t\tschema: '',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t} as unknown as JsonStatement,\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tpk: {\n\t\t\t\tname: 'pk',\n\t\t\t\tcolumns: {\n\t\t\t\t\tpk: {\n\t\t\t\t\t\tname: 'pk',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tsimple: {\n\t\t\t\tname: 'simple',\n\t\t\t\tcolumns: {\n\t\t\t\t\tsimple: {\n\t\t\t\t\t\tname: 'simple',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tunique: {\n\t\t\t\tname: 'unique',\n\t\t\t\tcolumns: {\n\t\t\t\t\tunique: {\n\t\t\t\t\t\tname: 'unique',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {\n\t\t\t\t\tunique_unique_unique: 'unique_unique_unique;unique;true;',\n\t\t\t\t},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tpk: {\n\t\t\t\tname: 'pk',\n\t\t\t\tcolumns: {\n\t\t\t\t\tpk: {\n\t\t\t\t\t\tname: 'pk',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tsimple: {\n\t\t\t\tname: 'simple',\n\t\t\t\tcolumns: {\n\t\t\t\t\tsimple: {\n\t\t\t\t\t\tname: 'simple',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tunique: {\n\t\t\t\tname: 'unique',\n\t\t\t\tcolumns: {\n\t\t\t\t\tunique: {\n\t\t\t\t\t\tname: 'unique',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {\n\t\t\t\t\tunique_unique_unique: 'unique_unique_unique;unique;true;',\n\t\t\t\t},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\ttableName: 'pk',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'pk',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_type',\n\t\t\ttableName: 'simple',\n\t\t\tcolumnName: 'simple',\n\t\t\tnewDataType: 'int',\n\t\t\toldDataType: 'text',\n\t\t\tschema: '',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_type',\n\t\t\ttableName: 'unique',\n\t\t\tcolumnName: 'unique',\n\t\t\tnewDataType: 'text',\n\t\t\toldDataType: 'int',\n\t\t\tschema: '',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t},\n\t];\n\texpect(libSQLCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`add columns. set fk`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumn: {\n\t\t\t\tname: 'test',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\treferenceData: undefined,\n\t\t},\n\t\t{\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumn: {\n\t\t\t\tname: 'test1',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\treferenceData: undefined,\n\t\t},\n\t\t{\n\t\t\ttype: 'create_reference',\n\t\t\ttableName: 'ref',\n\t\t\tdata: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',\n\t\t\tschema: '',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnType: 'integer',\n\t\t},\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tref: {\n\t\t\t\tname: 'ref',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tref: {\n\t\t\t\tname: 'ref',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest1: {\n\t\t\t\t\t\tname: 'test1',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumn: {\n\t\t\t\tname: 'test',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\treferenceData: undefined,\n\t\t},\n\t\t{\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumn: {\n\t\t\t\tname: 'test1',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\treferenceData: undefined,\n\t\t},\n\t\t{\n\t\t\ttype: 'create_reference',\n\t\t\ttableName: 'ref',\n\t\t\tdata: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',\n\t\t\tschema: '',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnType: 'integer',\n\t\t},\n\t];\n\texpect(libSQLCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`add column and fk`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumn: {\n\t\t\t\tname: 'test1',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\treferenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',\n\t\t},\n\t\t{\n\t\t\ttype: 'create_reference',\n\t\t\ttableName: 'ref',\n\t\t\tdata: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',\n\t\t\tschema: '',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnType: 'integer',\n\t\t},\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tref: {\n\t\t\t\tname: 'ref',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest1: {\n\t\t\t\t\t\tname: 'test1',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tref_test1_user_new_age_fk: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tref: {\n\t\t\t\tname: 'ref',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest1: {\n\t\t\t\t\t\tname: 'test1',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumn: {\n\t\t\t\tname: 'test1',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\treferenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',\n\t\t},\n\t];\n\texpect(libSQLCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`add column and fk`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumn: {\n\t\t\t\tname: 'test1',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\treferenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',\n\t\t},\n\t\t{\n\t\t\ttype: 'create_reference',\n\t\t\ttableName: 'ref',\n\t\t\tdata: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',\n\t\t\tschema: '',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnType: 'integer',\n\t\t},\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tref: {\n\t\t\t\tname: 'ref',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest1: {\n\t\t\t\t\t\tname: 'test1',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tref_test1_user_new_age_fk: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tref: {\n\t\t\t\tname: 'ref',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest1: {\n\t\t\t\t\t\tname: 'test1',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumn: {\n\t\t\t\tname: 'test1',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\treferenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',\n\t\t},\n\t];\n\texpect(libSQLCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/statements-combiner/singlestore-statements-combiner.test.ts",
    "content": "import { JsonStatement } from 'src/jsonStatements';\nimport { SingleStoreSchemaSquashed } from 'src/serializer/singlestoreSchema';\nimport { singleStoreCombineStatements } from 'src/statementCombiner';\nimport { expect, test } from 'vitest';\n\ntest(`change column data type`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_rename_column',\n\t\t\ttableName: 'user',\n\t\t\toldColumnName: 'lastName',\n\t\t\tnewColumnName: 'lastName123',\n\t\t\tschema: '',\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_type',\n\t\t\ttableName: 'user',\n\t\t\tcolumnName: 'lastName123',\n\t\t\tnewDataType: 'int',\n\t\t\toldDataType: 'text',\n\t\t\tschema: '',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t\tcolumnIsUnique: false,\n\t\t} as unknown as JsonStatement,\n\t];\n\tconst json1: SingleStoreSchemaSquashed = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: {\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tfirstName: {\n\t\t\t\t\t\tname: 'firstName',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tlastName: {\n\t\t\t\t\t\tname: 'lastName',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t},\n\t\t},\n\t};\n\tconst json2: SingleStoreSchemaSquashed = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: {\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tfirstName: {\n\t\t\t\t\t\tname: 'firstName',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tlastName: {\n\t\t\t\t\t\tname: 'lastName123',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t},\n\t\t},\n\t};\n\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'alter_table_rename_column',\n\t\t\ttableName: 'user',\n\t\t\toldColumnName: 'lastName',\n\t\t\tnewColumnName: 'lastName123',\n\t\t\tschema: '',\n\t\t},\n\t\t{\n\t\t\ttype: 'singlestore_recreate_table',\n\t\t\ttableName: 'user',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'firstName',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'lastName123',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'test',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tuniqueConstraints: [],\n\t\t},\n\t];\n\texpect(singleStoreCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`set autoincrement`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_autoincrement',\n\t\t\ttableName: 'users',\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'int',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnAutoIncrement: true,\n\t\t\tcolumnPk: false,\n\t\t} as unknown as JsonStatement,\n\t];\n\n\tconst json2: SingleStoreSchemaSquashed = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: {\n\t\t\tusers: {\n\t\t\t\tname: 'users',\n\t\t\t\tcolumns: {\n\t\t\t\t\tnew_id: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: true,\n\t\t\t\t\t},\n\t\t\t\t\tname: {\n\t\t\t\t\t\tname: 'name',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\temail: {\n\t\t\t\t\t\tname: 'email',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t},\n\t\t},\n\t};\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'singlestore_recreate_table',\n\t\t\ttableName: 'users',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'name',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'email',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tuniqueConstraints: [],\n\t\t},\n\t];\n\texpect(singleStoreCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`drop autoincrement`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_drop_autoincrement',\n\t\t\ttableName: 'users',\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'int',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnAutoIncrement: true,\n\t\t\tcolumnPk: false,\n\t\t} as unknown as JsonStatement,\n\t];\n\n\tconst json2: SingleStoreSchemaSquashed = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: {\n\t\t\tusers: {\n\t\t\t\tname: 'users',\n\t\t\t\tcolumns: {\n\t\t\t\t\tnew_id: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tname: {\n\t\t\t\t\t\tname: 'name',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\temail: {\n\t\t\t\t\t\tname: 'email',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t},\n\t\t},\n\t};\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'singlestore_recreate_table',\n\t\t\ttableName: 'users',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'name',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'email',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tuniqueConstraints: [],\n\t\t},\n\t];\n\texpect(singleStoreCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`drop autoincrement`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_drop_autoincrement',\n\t\t\ttableName: 'users',\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'int',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnAutoIncrement: true,\n\t\t\tcolumnPk: false,\n\t\t} as unknown as JsonStatement,\n\t];\n\n\tconst json2: SingleStoreSchemaSquashed = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: {\n\t\t\tusers: {\n\t\t\t\tname: 'users',\n\t\t\t\tcolumns: {\n\t\t\t\t\tnew_id: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tname: {\n\t\t\t\t\t\tname: 'name',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\temail: {\n\t\t\t\t\t\tname: 'email',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t},\n\t\t},\n\t};\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'singlestore_recreate_table',\n\t\t\ttableName: 'users',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'name',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'email',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tuniqueConstraints: [],\n\t\t},\n\t];\n\texpect(singleStoreCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`set not null`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_notnull',\n\t\t\ttableName: 'users',\n\t\t\tcolumnName: 'name',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'text',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t} as unknown as JsonStatement,\n\t];\n\n\tconst json2: SingleStoreSchemaSquashed = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: {\n\t\t\tusers: {\n\t\t\t\tname: 'users',\n\t\t\t\tcolumns: {\n\t\t\t\t\tnew_id: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tname: {\n\t\t\t\t\t\tname: 'name',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\temail: {\n\t\t\t\t\t\tname: 'email',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t},\n\t\t},\n\t};\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'singlestore_recreate_table',\n\t\t\ttableName: 'users',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'name',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'email',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tuniqueConstraints: [],\n\t\t},\n\t];\n\texpect(singleStoreCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`drop not null`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t\t\ttableName: 'users',\n\t\t\tcolumnName: 'name',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'text',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t} as unknown as JsonStatement,\n\t];\n\n\tconst json2: SingleStoreSchemaSquashed = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: {\n\t\t\tusers: {\n\t\t\t\tname: 'users',\n\t\t\t\tcolumns: {\n\t\t\t\t\tnew_id: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tname: {\n\t\t\t\t\t\tname: 'name',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\temail: {\n\t\t\t\t\t\tname: 'email',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t},\n\t\t},\n\t};\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'singlestore_recreate_table',\n\t\t\ttableName: 'users',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'name',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'email',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tuniqueConstraints: [],\n\t\t},\n\t];\n\texpect(singleStoreCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`renamed column and droped column \"test\"`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_rename_column',\n\t\t\ttableName: 'user',\n\t\t\toldColumnName: 'lastName',\n\t\t\tnewColumnName: 'lastName123',\n\t\t\tschema: '',\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_drop_column',\n\t\t\ttableName: 'user',\n\t\t\tcolumnName: 'test',\n\t\t\tschema: '',\n\t\t},\n\t];\n\tconst json1: SingleStoreSchemaSquashed = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: {\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tfirstName: {\n\t\t\t\t\t\tname: 'firstName',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tlastName: {\n\t\t\t\t\t\tname: 'lastName',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t},\n\t\t},\n\t};\n\tconst json2: SingleStoreSchemaSquashed = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: {\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tfirstName: {\n\t\t\t\t\t\tname: 'firstName',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tlastName: {\n\t\t\t\t\t\tname: 'lastName123',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t},\n\t\t},\n\t};\n\n\tconst newJsonStatements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_rename_column',\n\t\t\ttableName: 'user',\n\t\t\toldColumnName: 'lastName',\n\t\t\tnewColumnName: 'lastName123',\n\t\t\tschema: '',\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_drop_column',\n\t\t\ttableName: 'user',\n\t\t\tcolumnName: 'test',\n\t\t\tschema: '',\n\t\t},\n\t];\n\texpect(singleStoreCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`droped column that is part of composite pk`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{ type: 'delete_composite_pk', tableName: 'user', data: 'id,iq' },\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_pk',\n\t\t\ttableName: 'user',\n\t\t\tschema: '',\n\t\t\tcolumnName: 'id',\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_drop_column',\n\t\t\ttableName: 'user',\n\t\t\tcolumnName: 'iq',\n\t\t\tschema: '',\n\t\t},\n\t];\n\tconst json1: SingleStoreSchemaSquashed = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: {\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tfirst_nam: {\n\t\t\t\t\t\tname: 'first_nam',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tiq: {\n\t\t\t\t\t\tname: 'iq',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tcompositePrimaryKeys: {\n\t\t\t\t\tuser_id_iq_pk: 'id,iq',\n\t\t\t\t},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t},\n\t\t},\n\t};\n\tconst json2: SingleStoreSchemaSquashed = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: {\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tfirst_nam: {\n\t\t\t\t\t\tname: 'first_name',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t},\n\t\t},\n\t};\n\n\tconst newJsonStatements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'singlestore_recreate_table',\n\t\t\ttableName: 'user',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'first_name',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\tuniqueConstraints: [],\n\t\t},\n\t];\n\texpect(singleStoreCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`add column with pk`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_add_column',\n\t\t\ttableName: 'table',\n\t\t\tcolumn: {\n\t\t\t\tname: 'test',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: true,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\tschema: '',\n\t\t},\n\t];\n\tconst json2: SingleStoreSchemaSquashed = {\n\t\tversion: '1',\n\t\tdialect: 'singlestore',\n\t\ttables: {\n\t\t\ttable: {\n\t\t\t\tname: 'table',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t},\n\t\t},\n\t};\n\n\tconst newJsonStatements = [\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id1',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'new_age',\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'test',\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\ttableName: 'table',\n\t\t\ttype: 'singlestore_recreate_table',\n\t\t\tuniqueConstraints: [],\n\t\t},\n\t];\n\texpect(singleStoreCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/statements-combiner/sqlite-statements-combiner.test.ts",
    "content": "import { JsonStatement } from 'src/jsonStatements';\nimport { SQLiteSchemaSquashed } from 'src/serializer/sqliteSchema';\nimport { sqliteCombineStatements } from 'src/statementCombiner';\nimport { expect, test } from 'vitest';\n\ntest(`renamed column and altered this column type`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_rename_column',\n\t\t\ttableName: 'user',\n\t\t\toldColumnName: 'lastName',\n\t\t\tnewColumnName: 'lastName123',\n\t\t\tschema: '',\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_type',\n\t\t\ttableName: 'user',\n\t\t\tcolumnName: 'lastName123',\n\t\t\tnewDataType: 'int',\n\t\t\toldDataType: 'text',\n\t\t\tschema: '',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t\tcolumnIsUnique: false,\n\t\t} as unknown as JsonStatement,\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tfirstName: {\n\t\t\t\t\t\tname: 'firstName',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tlastName: {\n\t\t\t\t\t\tname: 'lastName',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tfirstName: {\n\t\t\t\t\t\tname: 'firstName',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tlastName: {\n\t\t\t\t\t\tname: 'lastName123',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\ttableName: 'user',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'firstName',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'lastName123',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'test',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t];\n\texpect(sqliteCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`renamed column and droped column \"test\"`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_rename_column',\n\t\t\ttableName: 'user',\n\t\t\toldColumnName: 'lastName',\n\t\t\tnewColumnName: 'lastName123',\n\t\t\tschema: '',\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_drop_column',\n\t\t\ttableName: 'user',\n\t\t\tcolumnName: 'test',\n\t\t\tschema: '',\n\t\t},\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tfirstName: {\n\t\t\t\t\t\tname: 'firstName',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tlastName: {\n\t\t\t\t\t\tname: 'lastName',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tfirstName: {\n\t\t\t\t\t\tname: 'firstName',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tlastName: {\n\t\t\t\t\t\tname: 'lastName123',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_rename_column',\n\t\t\ttableName: 'user',\n\t\t\toldColumnName: 'lastName',\n\t\t\tnewColumnName: 'lastName123',\n\t\t\tschema: '',\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_drop_column',\n\t\t\ttableName: 'user',\n\t\t\tcolumnName: 'test',\n\t\t\tschema: '',\n\t\t},\n\t];\n\texpect(sqliteCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`droped column that is part of composite pk`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{ type: 'delete_composite_pk', tableName: 'user', data: 'id,iq' },\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_pk',\n\t\t\ttableName: 'user',\n\t\t\tschema: '',\n\t\t\tcolumnName: 'id',\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_drop_column',\n\t\t\ttableName: 'user',\n\t\t\tcolumnName: 'iq',\n\t\t\tschema: '',\n\t\t},\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tfirst_nam: {\n\t\t\t\t\t\tname: 'first_nam',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tiq: {\n\t\t\t\t\t\tname: 'iq',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {\n\t\t\t\t\tuser_id_iq_pk: 'id,iq',\n\t\t\t\t},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tfirst_nam: {\n\t\t\t\t\t\tname: 'first_nam',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\ttableName: 'user',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'first_nam',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t];\n\texpect(sqliteCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`drop column \"ref\".\"name\", rename column \"ref\".\"age\". dropped primary key \"user\".\"id\". Set not null to \"user\".\"iq\"`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_rename_column',\n\t\t\ttableName: 'ref',\n\t\t\toldColumnName: 'age',\n\t\t\tnewColumnName: 'age1',\n\t\t\tschema: '',\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_drop_pk',\n\t\t\ttableName: 'user',\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_drop_autoincrement',\n\t\t\ttableName: 'user',\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'int',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t} as unknown as JsonStatement,\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_drop_notnull',\n\t\t\ttableName: 'user',\n\t\t\tcolumnName: 'id',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'int',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t} as unknown as JsonStatement,\n\t\t{\n\t\t\ttype: 'alter_table_alter_column_set_notnull',\n\t\t\ttableName: 'user',\n\t\t\tcolumnName: 'iq',\n\t\t\tschema: '',\n\t\t\tnewDataType: 'int',\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnOnUpdate: undefined,\n\t\t\tcolumnNotNull: true,\n\t\t\tcolumnAutoIncrement: false,\n\t\t\tcolumnPk: false,\n\t\t} as unknown as JsonStatement,\n\t\t{\n\t\t\ttype: 'alter_table_drop_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumnName: 'text',\n\t\t\tschema: '',\n\t\t},\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tref: {\n\t\t\t\tname: 'ref',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: true,\n\t\t\t\t\t},\n\t\t\t\t\tuser_iq: {\n\t\t\t\t\t\tname: 'user_iq',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tname: {\n\t\t\t\t\t\tname: 'name',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tage: {\n\t\t\t\t\t\tname: 'age',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tref_user_iq_user_iq_fk: 'ref_user_iq_user_iq_fk;ref;user_iq;user;iq;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: true,\n\t\t\t\t\t},\n\t\t\t\t\tfirst_name: {\n\t\t\t\t\t\tname: 'first_name',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tiq: {\n\t\t\t\t\t\tname: 'iq',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tref: {\n\t\t\t\tname: 'ref',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tuser_iq: {\n\t\t\t\t\t\tname: 'user_iq',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tage1: {\n\t\t\t\t\t\tname: 'age1',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tref_user_iq_user_iq_fk: 'ref_user_iq_user_iq_fk;ref;user_iq;user;iq;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: {\n\t\t\t\t\t\tname: 'id',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tfirst_name: {\n\t\t\t\t\t\tname: 'first_name',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tiq: {\n\t\t\t\t\t\tname: 'iq',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'alter_table_rename_column',\n\t\t\ttableName: 'ref',\n\t\t\toldColumnName: 'age',\n\t\t\tnewColumnName: 'age1',\n\t\t\tschema: '',\n\t\t},\n\t\t{\n\t\t\ttype: 'alter_table_drop_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumnName: 'text',\n\t\t\tschema: '',\n\t\t},\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\ttableName: 'user',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'id',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'first_name',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'iq',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [],\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t];\n\n\texpect(sqliteCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`create reference on exising column (table includes unique index). expect to recreate column and recreate index`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'create_reference',\n\t\t\ttableName: 'unique',\n\t\t\tdata: 'unique_ref_pk_pk_pk_fk;unique;ref_pk;pk;pk;no action;no action',\n\t\t\tschema: '',\n\t\t},\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tpk: {\n\t\t\t\tname: 'pk',\n\t\t\t\tcolumns: {\n\t\t\t\t\tpk: {\n\t\t\t\t\t\tname: 'pk',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tunique: {\n\t\t\t\tname: 'unique',\n\t\t\t\tcolumns: {\n\t\t\t\t\tunique: {\n\t\t\t\t\t\tname: 'unique',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tref_pk: {\n\t\t\t\t\t\tname: 'ref_pk',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {\n\t\t\t\t\tunique_unique_unique: 'unique_unique_unique;unique;true;',\n\t\t\t\t},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tpk: {\n\t\t\t\tname: 'pk',\n\t\t\t\tcolumns: {\n\t\t\t\t\tpk: {\n\t\t\t\t\t\tname: 'pk',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: true,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tunique: {\n\t\t\t\tname: 'unique',\n\t\t\t\tcolumns: {\n\t\t\t\t\tunique: {\n\t\t\t\t\t\tname: 'unique',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tref_pk: {\n\t\t\t\t\t\tname: 'ref_pk',\n\t\t\t\t\t\ttype: 'int',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {\n\t\t\t\t\tunique_unique_unique: 'unique_unique_unique;unique;true;',\n\t\t\t\t},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tunique_ref_pk_pk_pk_fk: 'unique_ref_pk_pk_pk_fk;unique;ref_pk;pk;pk;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'recreate_table',\n\t\t\ttableName: 'unique',\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tname: 'unique',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'ref_pk',\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [\n\t\t\t\t{\n\t\t\t\t\tname: 'unique_ref_pk_pk_pk_fk',\n\t\t\t\t\ttableFrom: 'unique',\n\t\t\t\t\ttableTo: 'pk',\n\t\t\t\t\tcolumnsFrom: ['ref_pk'],\n\t\t\t\t\tcolumnsTo: ['pk'],\n\t\t\t\t\tonDelete: 'no action',\n\t\t\t\t\tonUpdate: 'no action',\n\t\t\t\t},\n\t\t\t],\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t\t{\n\t\t\tdata: 'unique_unique_unique;unique;true;',\n\t\t\tinternal: undefined,\n\t\t\tschema: '',\n\t\t\ttableName: 'unique',\n\t\t\ttype: 'create_index',\n\t\t},\n\t];\n\n\texpect(sqliteCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`add columns. set fk`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumn: {\n\t\t\t\tname: 'test',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\treferenceData: undefined,\n\t\t},\n\t\t{\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumn: {\n\t\t\t\tname: 'test1',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\treferenceData: undefined,\n\t\t},\n\t\t{\n\t\t\ttype: 'create_reference',\n\t\t\ttableName: 'ref',\n\t\t\tdata: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',\n\t\t\tschema: '',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnType: 'integer',\n\t\t},\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tref: {\n\t\t\t\tname: 'ref',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tref: {\n\t\t\t\tname: 'ref',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest1: {\n\t\t\t\t\t\tname: 'test1',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements = [\n\t\t{\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'id1',\n\t\t\t\t\tnotNull: true,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'new_age',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'test',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoincrement: false,\n\t\t\t\t\tname: 'test1',\n\t\t\t\t\tnotNull: false,\n\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t],\n\t\t\tcompositePKs: [],\n\t\t\treferenceData: [\n\t\t\t\t{\n\t\t\t\t\tcolumnsFrom: [\n\t\t\t\t\t\t'new_age',\n\t\t\t\t\t],\n\t\t\t\t\tcolumnsTo: [\n\t\t\t\t\t\t'new_age',\n\t\t\t\t\t],\n\t\t\t\t\tname: 'ref_new_age_user_new_age_fk',\n\t\t\t\t\tonDelete: 'no action',\n\t\t\t\t\tonUpdate: 'no action',\n\t\t\t\t\ttableFrom: 'ref',\n\t\t\t\t\ttableTo: 'user',\n\t\t\t\t},\n\t\t\t],\n\t\t\ttableName: 'ref',\n\t\t\ttype: 'recreate_table',\n\t\t\tuniqueConstraints: [],\n\t\t\tcheckConstraints: [],\n\t\t},\n\t];\n\texpect(sqliteCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n\ntest(`add column and fk`, async (t) => {\n\tconst statements: JsonStatement[] = [\n\t\t{\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumn: {\n\t\t\t\tname: 'test1',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\treferenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',\n\t\t},\n\t\t{\n\t\t\ttype: 'create_reference',\n\t\t\ttableName: 'ref',\n\t\t\tdata: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',\n\t\t\tschema: '',\n\t\t\tcolumnNotNull: false,\n\t\t\tcolumnDefault: undefined,\n\t\t\tcolumnType: 'integer',\n\t\t},\n\t];\n\tconst json1: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tref: {\n\t\t\t\tname: 'ref',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest1: {\n\t\t\t\t\t\tname: 'test1',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tref_test1_user_new_age_fk: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\tconst json2: SQLiteSchemaSquashed = {\n\t\tversion: '6',\n\t\tdialect: 'sqlite',\n\t\ttables: {\n\t\t\tref: {\n\t\t\t\tname: 'ref',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tname: 'test',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\ttest1: {\n\t\t\t\t\t\tname: 'test1',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {\n\t\t\t\t\tref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',\n\t\t\t\t},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t\tuser: {\n\t\t\t\tname: 'user',\n\t\t\t\tcolumns: {\n\t\t\t\t\tid1: {\n\t\t\t\t\t\tname: 'id1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: true,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t\tnew_age: {\n\t\t\t\t\t\tname: 'new_age',\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t\tprimaryKey: false,\n\t\t\t\t\t\tnotNull: false,\n\t\t\t\t\t\tautoincrement: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tindexes: {},\n\t\t\t\tforeignKeys: {},\n\t\t\t\tcompositePrimaryKeys: {},\n\t\t\t\tuniqueConstraints: {},\n\t\t\t\tcheckConstraints: {},\n\t\t\t},\n\t\t},\n\t\tenums: {},\n\t\tviews: {},\n\t};\n\n\tconst newJsonStatements = [\n\t\t{\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\ttableName: 'ref',\n\t\t\tcolumn: {\n\t\t\t\tname: 'test1',\n\t\t\t\ttype: 'integer',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t\treferenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',\n\t\t},\n\t];\n\texpect(sqliteCombineStatements(statements, json2)).toStrictEqual(\n\t\tnewJsonStatements,\n\t);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/test/sqlite.test.ts",
    "content": "import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport { diffTestSchemasSqlite } from 'tests/schemaDiffer';\nimport { expect } from 'vitest';\nimport { DialectSuite, run } from '../common';\n\nconst sqliteSuite: DialectSuite = {\n\tasync columns1() {\n\t\tconst schema1 = {\n\t\t\tusers: sqliteTable('users', {\n\t\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\t}),\n\t\t};\n\n\t\tconst schema2 = {\n\t\t\tusers: sqliteTable('users', {\n\t\t\t\tid: int('id').primaryKey({ autoIncrement: true }),\n\t\t\t\tname: text('name'),\n\t\t\t}),\n\t\t};\n\n\t\tconst { statements } = await diffTestSchemasSqlite(schema1, schema2, []);\n\n\t\texpect(statements.length).toBe(1);\n\t\texpect(statements[0]).toStrictEqual({\n\t\t\ttype: 'sqlite_alter_table_add_column',\n\t\t\ttableName: 'users',\n\t\t\treferenceData: undefined,\n\t\t\tcolumn: {\n\t\t\t\tname: 'name',\n\t\t\t\ttype: 'text',\n\t\t\t\tprimaryKey: false,\n\t\t\t\tnotNull: false,\n\t\t\t\tautoincrement: false,\n\t\t\t},\n\t\t});\n\t},\n};\n\nrun(sqliteSuite);\n"
  },
  {
    "path": "drizzle-kit/tests/testsinglestore.ts",
    "content": "import { index, singlestoreTable, text } from 'drizzle-orm/singlestore-core';\nimport { diffTestSchemasSingleStore } from './schemaDiffer';\n\nconst from = {\n\tusers: singlestoreTable(\n\t\t'table',\n\t\t{\n\t\t\tname: text('name'),\n\t\t},\n\t\t(t) => {\n\t\t\treturn {\n\t\t\t\tidx: index('name_idx').on(t.name),\n\t\t\t};\n\t\t},\n\t),\n};\n\nconst to = {\n\tusers: singlestoreTable('table', {\n\t\tname: text('name'),\n\t}),\n};\n\ndiffTestSchemasSingleStore(from, to, []).then((res) => {\n\tconst { statements, sqlStatements } = res;\n\n\tconsole.log(statements);\n\tconsole.log(sqlStatements);\n});\n"
  },
  {
    "path": "drizzle-kit/tests/validations.test.ts",
    "content": "import { mysqlCredentials } from 'src/cli/validations/mysql';\nimport { postgresCredentials } from 'src/cli/validations/postgres';\nimport { singlestoreCredentials } from 'src/cli/validations/singlestore';\nimport { sqliteCredentials } from 'src/cli/validations/sqlite';\nimport { expect, test } from 'vitest';\n\ntest('turso #1', () => {\n\tsqliteCredentials.parse({\n\t\tdialect: 'sqlite',\n\t\tdriver: 'turso',\n\t\turl: 'https://turso.tech',\n\t});\n});\n\ntest('turso #2', () => {\n\tsqliteCredentials.parse({\n\t\tdialect: 'sqlite',\n\t\tdriver: 'turso',\n\t\turl: 'https://turso.tech',\n\t\tauthToken: 'token',\n\t});\n});\n\ntest('turso #3', () => {\n\texpect(() =>\n\t\tsqliteCredentials.parse({\n\t\t\tdialect: 'sqlite',\n\t\t\tdriver: 'turso',\n\t\t\turl: 'https://turso.tech',\n\t\t\tauthToken: '',\n\t\t})\n\t).toThrowError();\n});\n\ntest('turso #4', () => {\n\texpect(() => {\n\t\tsqliteCredentials.parse({\n\t\t\tdialect: 'sqlite',\n\t\t\tdriver: 'turso',\n\t\t\turl: '',\n\t\t\tauthToken: 'token',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('turso #5', () => {\n\texpect(() => {\n\t\tsqliteCredentials.parse({\n\t\t\tdialect: 'sqlite',\n\t\t\tdriver: 'turso',\n\t\t\turl: '',\n\t\t\tauthToken: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('d1-http #1', () => {\n\tsqliteCredentials.parse({\n\t\tdialect: 'sqlite',\n\t\tdriver: 'd1-http',\n\t\taccountId: 'accountId',\n\t\tdatabaseId: 'databaseId',\n\t\ttoken: 'token',\n\t});\n});\n\ntest('d1-http #2', () => {\n\texpect(() =>\n\t\tsqliteCredentials.parse({\n\t\t\tdialect: 'sqlite',\n\t\t\tdriver: 'd1-http',\n\t\t\taccountId: 'accountId',\n\t\t\tdatabaseId: 'databaseId',\n\t\t\t// token: \"token\",\n\t\t})\n\t).toThrowError();\n});\n\ntest('d1-http #3', () => {\n\texpect(() =>\n\t\tsqliteCredentials.parse({\n\t\t\tdialect: 'sqlite',\n\t\t\tdriver: 'd1-http',\n\t\t\taccountId: 'accountId',\n\t\t\tdatabaseId: 'databaseId',\n\t\t\ttoken: '',\n\t\t})\n\t).toThrowError();\n});\n\ntest('d1-http #4', () => {\n\texpect(() =>\n\t\tsqliteCredentials.parse({\n\t\t\tdialect: 'sqlite',\n\t\t\tdriver: 'd1-http',\n\t\t\taccountId: 'accountId',\n\t\t\t// databaseId: \"databaseId\",\n\t\t\ttoken: 'token',\n\t\t})\n\t).toThrowError();\n});\n\ntest('d1-http #5', () => {\n\texpect(() =>\n\t\tsqliteCredentials.parse({\n\t\t\tdialect: 'sqlite',\n\t\t\tdriver: 'd1-http',\n\t\t\taccountId: 'accountId',\n\t\t\tdatabaseId: '',\n\t\t\ttoken: 'token',\n\t\t})\n\t).toThrowError();\n});\n\ntest('d1-http #6', () => {\n\texpect(() =>\n\t\tsqliteCredentials.parse({\n\t\t\tdialect: 'sqlite',\n\t\t\tdriver: 'd1-http',\n\t\t\t// accountId: \"accountId\",\n\t\t\tdatabaseId: 'databaseId',\n\t\t\ttoken: 'token',\n\t\t})\n\t).toThrowError();\n});\n\ntest('d1-http #7', () => {\n\texpect(() =>\n\t\tsqliteCredentials.parse({\n\t\t\tdialect: 'sqlite',\n\t\t\tdriver: 'd1-http',\n\t\t\taccountId: '',\n\t\t\tdatabaseId: 'databaseId',\n\t\t\ttoken: 'token',\n\t\t})\n\t).toThrowError();\n});\n\n// omit undefined driver\ntest('sqlite #1', () => {\n\texpect(\n\t\tsqliteCredentials.parse({\n\t\t\tdialect: 'sqlite',\n\t\t\tdriver: undefined,\n\t\t\turl: 'https://turso.tech',\n\t\t}),\n\t).toStrictEqual({\n\t\turl: 'https://turso.tech',\n\t});\n});\n\ntest('sqlite #2', () => {\n\texpect(\n\t\tsqliteCredentials.parse({\n\t\t\tdialect: 'sqlite',\n\t\t\turl: 'https://turso.tech',\n\t\t}),\n\t).toStrictEqual({\n\t\turl: 'https://turso.tech',\n\t});\n});\n\ntest('sqlite #3', () => {\n\texpect(() =>\n\t\tsqliteCredentials.parse({\n\t\t\tdialect: 'sqlite',\n\t\t\turl: '',\n\t\t})\n\t).toThrowError();\n});\n\ntest('AWS Data API #1', () => {\n\texpect(\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\turl: 'https://turso.tech',\n\t\t}),\n\t).toStrictEqual({\n\t\turl: 'https://turso.tech',\n\t});\n});\n\ntest('AWS Data API #1', () => {\n\texpect(\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdriver: 'aws-data-api',\n\t\t\tdatabase: 'database',\n\t\t\tsecretArn: 'secretArn',\n\t\t\tresourceArn: 'resourceArn',\n\t\t}),\n\t).toStrictEqual({\n\t\tdriver: 'aws-data-api',\n\t\tdatabase: 'database',\n\t\tsecretArn: 'secretArn',\n\t\tresourceArn: 'resourceArn',\n\t});\n});\n\ntest('AWS Data API #2', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdriver: 'aws-data-api',\n\t\t\tdatabase: 'database',\n\t\t\tsecretArn: '',\n\t\t\tresourceArn: 'resourceArn',\n\t\t});\n\t}).toThrowError();\n});\ntest('AWS Data API #3', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdriver: 'aws-data-api',\n\t\t\tdatabase: 'database',\n\t\t\tsecretArn: 'secretArn',\n\t\t\tresourceArn: '',\n\t\t});\n\t}).toThrowError();\n});\ntest('AWS Data API #4', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdriver: 'aws-data-api',\n\t\t\tdatabase: '',\n\t\t\tsecretArn: 'secretArn',\n\t\t\tresourceArn: 'resourceArn',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('AWS Data API #5', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdriver: 'aws-data-api',\n\t\t\tdatabase: 'database',\n\t\t\tresourceArn: 'resourceArn',\n\t\t});\n\t}).toThrowError();\n});\ntest('AWS Data API #6', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdriver: 'aws-data-api',\n\t\t\tsecretArn: 'secretArn',\n\t\t\tresourceArn: 'resourceArn',\n\t\t});\n\t}).toThrowError();\n});\ntest('AWS Data API #7', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdriver: 'aws-data-api',\n\t\t\tdatabase: 'database',\n\t\t\tsecretArn: 'secretArn',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('AWS Data API #8', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdriver: 'aws-data-api',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('PGlite #1', () => {\n\texpect(\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdriver: 'pglite',\n\t\t\turl: './my.db',\n\t\t}),\n\t).toStrictEqual({\n\t\tdriver: 'pglite',\n\t\turl: './my.db',\n\t});\n});\n\ntest('PGlite #2', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdriver: 'pglite',\n\t\t\turl: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('PGlite #3', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdriver: 'pglite',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('postgres #1', () => {\n\texpect(\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\turl: 'https://turso.tech',\n\t\t}),\n\t).toStrictEqual({\n\t\turl: 'https://turso.tech',\n\t});\n});\n\ntest('postgres #2', () => {\n\texpect(\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdriver: undefined,\n\t\t\turl: 'https://turso.tech',\n\t\t}),\n\t).toStrictEqual({\n\t\turl: 'https://turso.tech',\n\t});\n});\n\ntest('postgres #3', () => {\n\texpect(\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdatabase: 'database',\n\t\t\thost: 'host',\n\t\t}),\n\t).toStrictEqual({\n\t\tdatabase: 'database',\n\t\thost: 'host',\n\t});\n});\n\ntest('postgres #4', () => {\n\texpect(\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdatabase: 'database',\n\t\t\thost: 'host',\n\t\t}),\n\t).toStrictEqual({\n\t\tdatabase: 'database',\n\t\thost: 'host',\n\t});\n});\n\ntest('postgres #5', () => {\n\texpect(\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\thost: 'host',\n\t\t\tport: 1234,\n\t\t\tuser: 'user',\n\t\t\tpassword: 'password',\n\t\t\tdatabase: 'database',\n\t\t\tssl: 'require',\n\t\t}),\n\t).toStrictEqual({\n\t\thost: 'host',\n\t\tport: 1234,\n\t\tuser: 'user',\n\t\tpassword: 'password',\n\t\tdatabase: 'database',\n\t\tssl: 'require',\n\t});\n});\n\ntest('postgres #6', () => {\n\texpect(\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\thost: 'host',\n\t\t\tdatabase: 'database',\n\t\t\tssl: true,\n\t\t}),\n\t).toStrictEqual({\n\t\thost: 'host',\n\t\tdatabase: 'database',\n\t\tssl: true,\n\t});\n});\n\ntest('postgres #7', () => {\n\texpect(\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\thost: 'host',\n\t\t\tdatabase: 'database',\n\t\t\tssl: 'allow',\n\t\t}),\n\t).toStrictEqual({\n\t\thost: 'host',\n\t\tdatabase: 'database',\n\t\tssl: 'allow',\n\t});\n});\n\ntest('postgres #8', () => {\n\texpect(\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\thost: 'host',\n\t\t\tdatabase: 'database',\n\t\t\tssl: {\n\t\t\t\tca: 'ca',\n\t\t\t\tcert: 'cert',\n\t\t\t},\n\t\t}),\n\t).toStrictEqual({\n\t\thost: 'host',\n\t\tdatabase: 'database',\n\t\tssl: {\n\t\t\tca: 'ca',\n\t\t\tcert: 'cert',\n\t\t},\n\t});\n});\n\ntest('postgres #9', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('postgres #10', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\turl: undefined,\n\t\t});\n\t}).toThrowError();\n});\n\ntest('postgres #11', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\turl: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('postgres #12', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\thost: '',\n\t\t\tdatabase: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('postgres #13', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdatabase: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('postgres #14', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\thost: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('postgres #15', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdatabase: ' ',\n\t\t\thost: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('postgres #16', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdatabase: '',\n\t\t\thost: ' ',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('postgres #17', () => {\n\texpect(() => {\n\t\tpostgresCredentials.parse({\n\t\t\tdialect: 'postgres',\n\t\t\tdatabase: ' ',\n\t\t\thost: ' ',\n\t\t\tport: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('mysql #1', () => {\n\texpect(\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\turl: 'https://turso.tech',\n\t\t}),\n\t).toStrictEqual({\n\t\turl: 'https://turso.tech',\n\t});\n});\n\ntest('mysql #2', () => {\n\texpect(\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\tdriver: undefined,\n\t\t\turl: 'https://turso.tech',\n\t\t}),\n\t).toStrictEqual({\n\t\turl: 'https://turso.tech',\n\t});\n});\n\ntest('mysql #3', () => {\n\texpect(\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\tdatabase: 'database',\n\t\t\thost: 'host',\n\t\t}),\n\t).toStrictEqual({\n\t\tdatabase: 'database',\n\t\thost: 'host',\n\t});\n});\n\ntest('mysql #4', () => {\n\texpect(\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\tdatabase: 'database',\n\t\t\thost: 'host',\n\t\t}),\n\t).toStrictEqual({\n\t\tdatabase: 'database',\n\t\thost: 'host',\n\t});\n});\n\ntest('mysql #5', () => {\n\texpect(\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\thost: 'host',\n\t\t\tport: 1234,\n\t\t\tuser: 'user',\n\t\t\tpassword: 'password',\n\t\t\tdatabase: 'database',\n\t\t\tssl: 'require',\n\t\t}),\n\t).toStrictEqual({\n\t\thost: 'host',\n\t\tport: 1234,\n\t\tuser: 'user',\n\t\tpassword: 'password',\n\t\tdatabase: 'database',\n\t\tssl: 'require',\n\t});\n});\n\ntest('mysql #7', () => {\n\texpect(\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\thost: 'host',\n\t\t\tdatabase: 'database',\n\t\t\tssl: 'allow',\n\t\t}),\n\t).toStrictEqual({\n\t\thost: 'host',\n\t\tdatabase: 'database',\n\t\tssl: 'allow',\n\t});\n});\n\ntest('mysql #8', () => {\n\texpect(\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\thost: 'host',\n\t\t\tdatabase: 'database',\n\t\t\tssl: {\n\t\t\t\tca: 'ca',\n\t\t\t\tcert: 'cert',\n\t\t\t},\n\t\t}),\n\t).toStrictEqual({\n\t\thost: 'host',\n\t\tdatabase: 'database',\n\t\tssl: {\n\t\t\tca: 'ca',\n\t\t\tcert: 'cert',\n\t\t},\n\t});\n});\n\ntest('mysql #9', () => {\n\texpect(() => {\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('mysql #10', () => {\n\texpect(() => {\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\turl: undefined,\n\t\t});\n\t}).toThrowError();\n});\n\ntest('mysql #11', () => {\n\texpect(() => {\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\turl: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('mysql #12', () => {\n\texpect(() => {\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\thost: '',\n\t\t\tdatabase: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('mysql #13', () => {\n\texpect(() => {\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\tdatabase: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('mysql #14', () => {\n\texpect(() => {\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\thost: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('mysql #15', () => {\n\texpect(() => {\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\tdatabase: ' ',\n\t\t\thost: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('mysql #16', () => {\n\texpect(() => {\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\tdatabase: '',\n\t\t\thost: ' ',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('mysql #17', () => {\n\texpect(() => {\n\t\tmysqlCredentials.parse({\n\t\t\tdialect: 'mysql',\n\t\t\tdatabase: ' ',\n\t\t\thost: ' ',\n\t\t\tport: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('singlestore #1', () => {\n\texpect(\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t\tdatabase: 'database',\n\t\t\thost: 'host',\n\t\t}),\n\t).toStrictEqual({\n\t\tdatabase: 'database',\n\t\thost: 'host',\n\t});\n});\n\ntest('singlestore #2', () => {\n\texpect(\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t\tdatabase: 'database',\n\t\t\thost: 'host',\n\t\t}),\n\t).toStrictEqual({\n\t\tdatabase: 'database',\n\t\thost: 'host',\n\t});\n});\n\ntest('singlestore #3', () => {\n\texpect(\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t\thost: 'host',\n\t\t\tport: 1234,\n\t\t\tuser: 'user',\n\t\t\tpassword: 'password',\n\t\t\tdatabase: 'database',\n\t\t\tssl: 'require',\n\t\t}),\n\t).toStrictEqual({\n\t\thost: 'host',\n\t\tport: 1234,\n\t\tuser: 'user',\n\t\tpassword: 'password',\n\t\tdatabase: 'database',\n\t\tssl: 'require',\n\t});\n});\n\ntest('singlestore #4', () => {\n\texpect(\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t\thost: 'host',\n\t\t\tdatabase: 'database',\n\t\t\tssl: 'allow',\n\t\t}),\n\t).toStrictEqual({\n\t\thost: 'host',\n\t\tdatabase: 'database',\n\t\tssl: 'allow',\n\t});\n});\n\ntest('singlestore #5', () => {\n\texpect(\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t\thost: 'host',\n\t\t\tdatabase: 'database',\n\t\t\tssl: {\n\t\t\t\tca: 'ca',\n\t\t\t\tcert: 'cert',\n\t\t\t},\n\t\t}),\n\t).toStrictEqual({\n\t\thost: 'host',\n\t\tdatabase: 'database',\n\t\tssl: {\n\t\t\tca: 'ca',\n\t\t\tcert: 'cert',\n\t\t},\n\t});\n});\n\ntest('singlestore #6', () => {\n\texpect(() => {\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('singlestore #7', () => {\n\texpect(() => {\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t\turl: undefined,\n\t\t});\n\t}).toThrowError();\n});\n\ntest('singlestore #8', () => {\n\texpect(() => {\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t\turl: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('singlestore #9', () => {\n\texpect(() => {\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t\thost: '',\n\t\t\tdatabase: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('singlestore #10', () => {\n\texpect(() => {\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t\tdatabase: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('singlestore #11', () => {\n\texpect(() => {\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t\thost: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('singlestore #12', () => {\n\texpect(() => {\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t\tdatabase: ' ',\n\t\t\thost: '',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('singlestore #13', () => {\n\texpect(() => {\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t\tdatabase: '',\n\t\t\thost: ' ',\n\t\t});\n\t}).toThrowError();\n});\n\ntest('singlestore #14', () => {\n\texpect(() => {\n\t\tsinglestoreCredentials.parse({\n\t\t\tdialect: 'singlestore',\n\t\t\tdatabase: ' ',\n\t\t\thost: ' ',\n\t\t\tport: '',\n\t\t});\n\t}).toThrowError();\n});\n"
  },
  {
    "path": "drizzle-kit/tests/wrap-param.test.ts",
    "content": "import chalk from 'chalk';\nimport { assert, expect, test } from 'vitest';\nimport { wrapParam } from '../src/cli/validations/common';\n\ntest('wrapParam', () => {\n\texpect(wrapParam('password', 'password123', false, 'secret')).toBe(`    [${chalk.green('✓')}] password: '*****'`);\n\texpect(wrapParam('url', 'mysql://user:password@localhost:3306/database', false, 'url')).toBe(\n\t\t`    [${chalk.green('✓')}] url: 'mysql://user:****@localhost:3306/database'`,\n\t);\n\texpect(wrapParam('url', 'singlestore://user:password@localhost:3306/database', false, 'url')).toBe(\n\t\t`    [${chalk.green('✓')}] url: 'singlestore://user:****@localhost:3306/database'`,\n\t);\n\texpect(wrapParam('url', 'postgresql://user:password@localhost:5432/database', false, 'url')).toBe(\n\t\t`    [${chalk.green('✓')}] url: 'postgresql://user:****@localhost:5432/database'`,\n\t);\n});\n"
  },
  {
    "path": "drizzle-kit/tsconfig.build.json",
    "content": "{\n\t\"extends\": \"./tsconfig.json\",\n\t\"include\": [\"src\"]\n}\n"
  },
  {
    "path": "drizzle-kit/tsconfig.cli-types.json",
    "content": "{\n\t\"extends\": \"./tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"declaration\": true,\n\t\t\"emitDeclarationOnly\": true,\n\t\t\"noEmit\": false\n\t},\n\t\"include\": [\"src/index.ts\", \"src/utils.ts\", \"src/utils-studio.ts\", \"src/api.ts\"]\n}\n"
  },
  {
    "path": "drizzle-kit/tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t\"target\": \"es2021\",\n\t\t\"lib\": [\"es2021\"],\n\t\t\"types\": [\"node\"],\n\t\t\"strictNullChecks\": true,\n\t\t\"strictFunctionTypes\": false,\n\t\t\"allowJs\": true,\n\t\t\"skipLibCheck\": true,\n\t\t\"esModuleInterop\": true,\n\t\t\"allowSyntheticDefaultImports\": true,\n\t\t\"strict\": true,\n\t\t\"noImplicitOverride\": true,\n\t\t\"forceConsistentCasingInFileNames\": true,\n\t\t\"module\": \"CommonJS\",\n\t\t\"moduleResolution\": \"node\",\n\t\t\"resolveJsonModule\": true,\n\t\t\"noErrorTruncation\": true,\n\t\t\"isolatedModules\": true,\n\t\t\"sourceMap\": true,\n\t\t\"baseUrl\": \".\",\n\t\t\"outDir\": \"dist\",\n\t\t\"noEmit\": true,\n\t\t\"typeRoots\": [\"node_modules/@types\", \"src/@types\"]\n\t},\n\t\"include\": [\"src\", \"dev\", \"tests\", \"drizzle.config.ts\", \"test.ts\"],\n\t\"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "drizzle-kit/vitest.config.ts",
    "content": "import tsconfigPaths from 'vite-tsconfig-paths';\nimport { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n\ttest: {\n\t\tinclude: [\n\t\t\t'tests/**/*.test.ts',\n\t\t\t// Need to test it first before pushing changes\n\t\t\t// 'tests/singlestore-schemas.test.ts',\n\t\t\t// 'tests/singlestore-views.test.ts',\n\t\t\t// 'tests/push/singlestore-push.test.ts',\n\t\t\t// 'tests/push/singlestore.test.ts',\n\t\t],\n\n\t\t// This one was excluded because we need to modify an API for SingleStore-generated columns.\n\t\t// It’s in the backlog.\n\t\texclude: ['tests/**/singlestore-generated.test.ts'],\n\n\t\ttypecheck: {\n\t\t\ttsconfig: 'tsconfig.json',\n\t\t},\n\t\ttestTimeout: 100000,\n\t\thookTimeout: 100000,\n\t\tisolate: true,\n\t\tpoolOptions: {\n\t\t\tthreads: {\n\t\t\t\tsingleThread: true,\n\t\t\t},\n\t\t},\n\t\tmaxWorkers: 1,\n\t\tfileParallelism: false,\n\t},\n\tplugins: [tsconfigPaths()],\n});\n"
  },
  {
    "path": "drizzle-orm/.madgerc",
    "content": "{\n\t\"detectiveOptions\": {\n\t\t\"ts\": {\n\t\t\t\"skipTypeImports\": true\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/package.json",
    "content": "{\n\t\"name\": \"drizzle-orm\",\n\t\"version\": \"0.45.1\",\n\t\"description\": \"Drizzle ORM package for SQL databases\",\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"p\": \"prisma generate --schema src/prisma/schema.prisma\",\n\t\t\"build\": \"pnpm p && scripts/build.ts\",\n\t\t\"b\": \"pnpm build\",\n\t\t\"test:types\": \"cd type-tests && tsc\",\n\t\t\"test\": \"vitest run\",\n\t\t\"pack\": \"(cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz\",\n\t\t\"publish\": \"npm publish package.tgz\"\n\t},\n\t\"main\": \"./index.cjs\",\n\t\"module\": \"./index.js\",\n\t\"types\": \"./index.d.ts\",\n\t\"sideEffects\": false,\n\t\"publishConfig\": {\n\t\t\"provenance\": true\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git+https://github.com/drizzle-team/drizzle-orm.git\"\n\t},\n\t\"homepage\": \"https://orm.drizzle.team\",\n\t\"keywords\": [\n\t\t\"drizzle\",\n\t\t\"orm\",\n\t\t\"pg\",\n\t\t\"mysql\",\n\t\t\"singlestore\",\n\t\t\"postgresql\",\n\t\t\"postgres\",\n\t\t\"sqlite\",\n\t\t\"database\",\n\t\t\"sql\",\n\t\t\"typescript\",\n\t\t\"ts\",\n\t\t\"drizzle-orm\"\n\t],\n\t\"author\": \"Drizzle Team\",\n\t\"license\": \"Apache-2.0\",\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/drizzle-team/drizzle-orm/issues\"\n\t},\n\t\"peerDependencies\": {\n\t\t\"@aws-sdk/client-rds-data\": \">=3\",\n\t\t\"@cloudflare/workers-types\": \">=4\",\n\t\t\"@electric-sql/pglite\": \">=0.2.0\",\n\t\t\"@libsql/client\": \">=0.10.0\",\n\t\t\"@libsql/client-wasm\": \">=0.10.0\",\n\t\t\"@neondatabase/serverless\": \">=0.10.0\",\n\t\t\"@op-engineering/op-sqlite\": \">=2\",\n\t\t\"@opentelemetry/api\": \"^1.4.1\",\n\t\t\"@planetscale/database\": \">=1.13\",\n\t\t\"@prisma/client\": \"*\",\n\t\t\"@tidbcloud/serverless\": \"*\",\n\t\t\"@types/better-sqlite3\": \"*\",\n\t\t\"@types/pg\": \"*\",\n\t\t\"@types/sql.js\": \"*\",\n\t\t\"@vercel/postgres\": \">=0.8.0\",\n\t\t\"@xata.io/client\": \"*\",\n\t\t\"better-sqlite3\": \">=7\",\n\t\t\"bun-types\": \"*\",\n\t\t\"expo-sqlite\": \">=14.0.0\",\n\t\t\"knex\": \"*\",\n\t\t\"kysely\": \"*\",\n\t\t\"mysql2\": \">=2\",\n\t\t\"pg\": \">=8\",\n\t\t\"postgres\": \">=3\",\n\t\t\"sql.js\": \">=1\",\n\t\t\"sqlite3\": \">=5\",\n\t\t\"gel\": \">=2\",\n\t\t\"@upstash/redis\": \">=1.34.7\"\n\t},\n\t\"peerDependenciesMeta\": {\n\t\t\"mysql2\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@vercel/postgres\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@xata.io/client\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"better-sqlite3\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@types/better-sqlite3\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"sqlite3\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"sql.js\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@types/sql.js\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@cloudflare/workers-types\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"pg\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@types/pg\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"postgres\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@neondatabase/serverless\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"bun-types\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@aws-sdk/client-rds-data\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@planetscale/database\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"knex\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"kysely\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@libsql/client\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@libsql/client-wasm\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@opentelemetry/api\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"expo-sqlite\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"gel\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@op-engineering/op-sqlite\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@electric-sql/pglite\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@tidbcloud/serverless\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"prisma\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@prisma/client\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@upstash/redis\": {\n\t\t\t\"optional\": true\n\t\t}\n\t},\n\t\"devDependencies\": {\n\t\t\"@aws-sdk/client-rds-data\": \"^3.549.0\",\n\t\t\"@cloudflare/workers-types\": \"^4.20241112.0\",\n\t\t\"@electric-sql/pglite\": \"^0.2.12\",\n\t\t\"@libsql/client\": \"^0.10.0\",\n\t\t\"@libsql/client-wasm\": \"^0.10.0\",\n\t\t\"@miniflare/d1\": \"^2.14.4\",\n\t\t\"@neondatabase/serverless\": \"^0.10.0\",\n\t\t\"@op-engineering/op-sqlite\": \"^2.0.16\",\n\t\t\"@opentelemetry/api\": \"^1.4.1\",\n\t\t\"@originjs/vite-plugin-commonjs\": \"^1.0.3\",\n\t\t\"@planetscale/database\": \"^1.16.0\",\n\t\t\"@prisma/client\": \"5.14.0\",\n\t\t\"@tidbcloud/serverless\": \"^0.1.1\",\n\t\t\"@types/better-sqlite3\": \"^7.6.12\",\n\t\t\"@types/node\": \"^20.2.5\",\n\t\t\"@types/pg\": \"^8.10.1\",\n\t\t\"@types/react\": \"^18.2.45\",\n\t\t\"@types/sql.js\": \"^1.4.4\",\n\t\t\"@upstash/redis\": \"^1.34.3\",\n\t\t\"@vercel/postgres\": \"^0.8.0\",\n\t\t\"@xata.io/client\": \"^0.29.3\",\n\t\t\"better-sqlite3\": \"^11.9.1\",\n\t\t\"bun-types\": \"^1.2.0\",\n\t\t\"cpy\": \"^10.1.0\",\n\t\t\"expo-sqlite\": \"^14.0.0\",\n\t\t\"gel\": \"^2.0.0\",\n\t\t\"glob\": \"^11.0.1\",\n\t\t\"knex\": \"^2.4.2\",\n\t\t\"kysely\": \"^0.25.0\",\n\t\t\"mysql2\": \"^3.14.1\",\n\t\t\"pg\": \"^8.11.0\",\n\t\t\"postgres\": \"^3.3.5\",\n\t\t\"prisma\": \"5.14.0\",\n\t\t\"react\": \"^18.2.0\",\n\t\t\"sql.js\": \"^1.8.0\",\n\t\t\"sqlite3\": \"^5.1.2\",\n\t\t\"ts-morph\": \"^25.0.1\",\n\t\t\"tslib\": \"^2.5.2\",\n\t\t\"tsx\": \"^3.12.7\",\n\t\t\"vite-tsconfig-paths\": \"^4.3.2\",\n\t\t\"vitest\": \"^3.1.3\",\n\t\t\"zod\": \"^3.20.2\",\n\t\t\"zx\": \"^7.2.2\"\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/scripts/build.ts",
    "content": "#!/usr/bin/env -S pnpm tsx\nimport 'zx/globals';\nimport cpy from 'cpy';\n\nasync function updateAndCopyPackageJson() {\n\tconst pkg = await fs.readJSON('package.json');\n\n\tconst entries = await glob('src/**/*.ts');\n\n\tpkg.exports = entries.reduce<\n\t\tRecord<string, {\n\t\t\timport: {\n\t\t\t\ttypes?: string;\n\t\t\t\tdefault: string;\n\t\t\t};\n\t\t\trequire: {\n\t\t\t\ttypes: string;\n\t\t\t\tdefault: string;\n\t\t\t};\n\t\t\tdefault: string;\n\t\t\ttypes: string;\n\t\t}>\n\t>(\n\t\t(acc, rawEntry) => {\n\t\t\tconst entry = rawEntry.match(/src\\/(.*)\\.ts/)![1]!;\n\t\t\tconst exportsEntry = entry === 'index' ? '.' : './' + entry.replace(/\\/index$/, '');\n\t\t\tconst importEntry = `./${entry}.js`;\n\t\t\tconst requireEntry = `./${entry}.cjs`;\n\t\t\tacc[exportsEntry] = {\n\t\t\t\timport: {\n\t\t\t\t\ttypes: `./${entry}.d.ts`,\n\t\t\t\t\tdefault: importEntry,\n\t\t\t\t},\n\t\t\t\trequire: {\n\t\t\t\t\ttypes: `./${entry}.d.cts`,\n\t\t\t\t\tdefault: requireEntry,\n\t\t\t\t},\n\t\t\t\ttypes: `./${entry}.d.ts`,\n\t\t\t\tdefault: importEntry,\n\t\t\t};\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n\n\tawait fs.writeJSON('dist.new/package.json', pkg, { spaces: 2 });\n}\n\nawait fs.remove('dist.new');\n\nawait Promise.all([\n\t(async () => {\n\t\tawait $`tsup`.stdio('pipe', 'pipe', 'pipe');\n\t})(),\n\t(async () => {\n\t\tawait $`tsc -p tsconfig.dts.json`.stdio('pipe', 'pipe', 'pipe');\n\t\tawait cpy('dist-dts/**/*.d.ts', 'dist.new', {\n\t\t\trename: (basename) => basename.replace(/\\.d\\.ts$/, '.d.cts'),\n\t\t});\n\t\tawait cpy('dist-dts/**/*.d.ts', 'dist.new', {\n\t\t\trename: (basename) => basename.replace(/\\.d\\.ts$/, '.d.ts'),\n\t\t});\n\t})(),\n]);\n\nawait Promise.all([\n\t$`tsup src/version.ts --no-config --dts --format esm --outDir dist.new`.stdio('pipe', 'pipe', 'pipe'),\n\t$`tsup src/version.ts --no-config --dts --format cjs --outDir dist.new`.stdio('pipe', 'pipe', 'pipe'),\n]);\n\nawait $`scripts/fix-imports.ts`;\n\nawait fs.copy('../README.md', 'dist.new/README.md');\nawait updateAndCopyPackageJson();\nawait fs.remove('dist');\nawait fs.rename('dist.new', 'dist');\n"
  },
  {
    "path": "drizzle-orm/scripts/fix-imports.ts",
    "content": "#!/usr/bin/env -S pnpm tsx\nimport 'zx/globals';\n\nimport path from 'node:path';\nimport { parse, print, visit } from 'recast';\nimport parser from 'recast/parsers/typescript';\n\nfunction resolvePathAlias(importPath: string, file: string) {\n\tif (importPath.startsWith('~/')) {\n\t\tconst relativePath = path.relative(path.dirname(file), path.resolve('dist.new', importPath.slice(2)));\n\t\timportPath = relativePath.startsWith('.') ? relativePath : './' + relativePath;\n\t}\n\n\treturn importPath;\n}\n\nfunction fixImportPath(importPath: string, file: string, ext: string) {\n\timportPath = resolvePathAlias(importPath, file);\n\n\tif (!/\\..*\\.(js|ts)$/.test(importPath)) {\n\t\treturn importPath;\n\t}\n\n\treturn importPath.replace(/\\.(js|ts)$/, ext);\n}\n\nconst cjsFiles = await glob('dist.new/**/*.{cjs,d.cts}');\n\nawait Promise.all(cjsFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitCallExpression(path) {\n\t\t\tif (path.value.callee.type === 'Identifier' && path.value.callee.name === 'require') {\n\t\t\t\tpath.value.arguments[0].value = fixImportPath(path.value.arguments[0].value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = resolvePathAlias(path.value.argument.value, file);\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n\nconst esmFiles = await glob('dist.new/**/*.{js,d.ts}');\n\nawait Promise.all(esmFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = fixImportPath(path.value.argument.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.js');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n"
  },
  {
    "path": "drizzle-orm/src/alias.ts",
    "content": "import type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport type { Relation } from './relations.ts';\nimport type { View } from './sql/sql.ts';\nimport { SQL, sql } from './sql/sql.ts';\nimport { Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\nexport class ColumnAliasProxyHandler<TColumn extends Column> implements ProxyHandler<TColumn> {\n\tstatic readonly [entityKind]: string = 'ColumnAliasProxyHandler';\n\n\tconstructor(private table: Table | View) {}\n\n\tget(columnObj: TColumn, prop: string | symbol): any {\n\t\tif (prop === 'table') {\n\t\t\treturn this.table;\n\t\t}\n\n\t\treturn columnObj[prop as keyof TColumn];\n\t}\n}\n\nexport class TableAliasProxyHandler<T extends Table | View> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'TableAliasProxyHandler';\n\n\tconstructor(private alias: string, private replaceOriginalName: boolean) {}\n\n\tget(target: T, prop: string | symbol): any {\n\t\tif (prop === Table.Symbol.IsAlias) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (prop === Table.Symbol.Name) {\n\t\t\treturn this.alias;\n\t\t}\n\n\t\tif (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {\n\t\t\treturn this.alias;\n\t\t}\n\n\t\tif (prop === ViewBaseConfig) {\n\t\t\treturn {\n\t\t\t\t...target[ViewBaseConfig as keyof typeof target],\n\t\t\t\tname: this.alias,\n\t\t\t\tisAlias: true,\n\t\t\t};\n\t\t}\n\n\t\tif (prop === Table.Symbol.Columns) {\n\t\t\tconst columns = (target as Table)[Table.Symbol.Columns];\n\t\t\tif (!columns) {\n\t\t\t\treturn columns;\n\t\t\t}\n\n\t\t\tconst proxiedColumns: { [key: string]: any } = {};\n\n\t\t\tObject.keys(columns).map((key) => {\n\t\t\t\tproxiedColumns[key] = new Proxy(\n\t\t\t\t\tcolumns[key]!,\n\t\t\t\t\tnew ColumnAliasProxyHandler(new Proxy(target, this)),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn proxiedColumns;\n\t\t}\n\n\t\tconst value = target[prop as keyof typeof target];\n\t\tif (is(value, Column)) {\n\t\t\treturn new Proxy(value as AnyColumn, new ColumnAliasProxyHandler(new Proxy(target, this)));\n\t\t}\n\n\t\treturn value;\n\t}\n}\n\nexport class RelationTableAliasProxyHandler<T extends Relation> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'RelationTableAliasProxyHandler';\n\n\tconstructor(private alias: string) {}\n\n\tget(target: T, prop: string | symbol): any {\n\t\tif (prop === 'sourceTable') {\n\t\t\treturn aliasedTable(target.sourceTable, this.alias);\n\t\t}\n\n\t\treturn target[prop as keyof typeof target];\n\t}\n}\n\nexport function aliasedTable<T extends Table | View>(\n\ttable: T,\n\ttableAlias: string,\n): T {\n\treturn new Proxy(table, new TableAliasProxyHandler(tableAlias, false)) as any;\n}\n\nexport function aliasedRelation<T extends Relation>(relation: T, tableAlias: string): T {\n\treturn new Proxy(relation, new RelationTableAliasProxyHandler(tableAlias));\n}\n\nexport function aliasedTableColumn<T extends AnyColumn>(column: T, tableAlias: string): T {\n\treturn new Proxy(\n\t\tcolumn,\n\t\tnew ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false))),\n\t);\n}\n\nexport function mapColumnsInAliasedSQLToAlias(query: SQL.Aliased, alias: string): SQL.Aliased {\n\treturn new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);\n}\n\nexport function mapColumnsInSQLToAlias(query: SQL, alias: string): SQL {\n\treturn sql.join(query.queryChunks.map((c) => {\n\t\tif (is(c, Column)) {\n\t\t\treturn aliasedTableColumn(c, alias);\n\t\t}\n\t\tif (is(c, SQL)) {\n\t\t\treturn mapColumnsInSQLToAlias(c, alias);\n\t\t}\n\t\tif (is(c, SQL.Aliased)) {\n\t\t\treturn mapColumnsInAliasedSQLToAlias(c, alias);\n\t\t}\n\t\treturn c;\n\t}));\n}\n"
  },
  {
    "path": "drizzle-orm/src/aws-data-api/common/index.ts",
    "content": "import type { Field } from '@aws-sdk/client-rds-data';\nimport { TypeHint } from '@aws-sdk/client-rds-data';\nimport type { QueryTypingsValue } from '~/sql/sql.ts';\n\nexport function getValueFromDataApi(field: Field) {\n\tif (field.stringValue !== undefined) {\n\t\treturn field.stringValue;\n\t} else if (field.booleanValue !== undefined) {\n\t\treturn field.booleanValue;\n\t} else if (field.doubleValue !== undefined) {\n\t\treturn field.doubleValue;\n\t} else if (field.isNull !== undefined) {\n\t\treturn null;\n\t} else if (field.longValue !== undefined) {\n\t\treturn field.longValue;\n\t} else if (field.blobValue !== undefined) {\n\t\treturn field.blobValue;\n\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t} else if (field.arrayValue !== undefined) {\n\t\tif (field.arrayValue.stringValues !== undefined) {\n\t\t\treturn field.arrayValue.stringValues;\n\t\t}\n\t\tif (field.arrayValue.longValues !== undefined) {\n\t\t\treturn field.arrayValue.longValues;\n\t\t}\n\t\tif (field.arrayValue.doubleValues !== undefined) {\n\t\t\treturn field.arrayValue.doubleValues;\n\t\t}\n\t\tif (field.arrayValue.booleanValues !== undefined) {\n\t\t\treturn field.arrayValue.booleanValues;\n\t\t}\n\t\tif (field.arrayValue.arrayValues !== undefined) {\n\t\t\treturn field.arrayValue.arrayValues;\n\t\t}\n\n\t\tthrow new Error('Unknown array type');\n\t} else {\n\t\tthrow new Error('Unknown type');\n\t}\n}\n\nexport function typingsToAwsTypeHint(typings?: QueryTypingsValue): TypeHint | undefined {\n\tif (typings === 'date') {\n\t\treturn TypeHint.DATE;\n\t} else if (typings === 'decimal') {\n\t\treturn TypeHint.DECIMAL;\n\t} else if (typings === 'json') {\n\t\treturn TypeHint.JSON;\n\t} else if (typings === 'time') {\n\t\treturn TypeHint.TIME;\n\t} else if (typings === 'timestamp') {\n\t\treturn TypeHint.TIMESTAMP;\n\t} else if (typings === 'uuid') {\n\t\treturn TypeHint.UUID;\n\t} else {\n\t\treturn undefined;\n\t}\n}\n\nexport function toValueParam(value: any, typings?: QueryTypingsValue): { value: Field; typeHint?: TypeHint } {\n\tconst response: { value: Field; typeHint?: TypeHint } = {\n\t\tvalue: {} as any,\n\t\ttypeHint: typingsToAwsTypeHint(typings),\n\t};\n\n\tif (value === null) {\n\t\tresponse.value = { isNull: true };\n\t} else if (typeof value === 'string') {\n\t\tswitch (response.typeHint) {\n\t\t\tcase TypeHint.DATE: {\n\t\t\t\tresponse.value = { stringValue: value.split('T')[0]! };\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TypeHint.TIMESTAMP: {\n\t\t\t\tresponse.value = { stringValue: value.replace('T', ' ').replace('Z', '') };\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tresponse.value = { stringValue: value };\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else if (typeof value === 'number' && Number.isInteger(value)) {\n\t\tresponse.value = { longValue: value };\n\t} else if (typeof value === 'number' && !Number.isInteger(value)) {\n\t\tresponse.value = { doubleValue: value };\n\t} else if (typeof value === 'boolean') {\n\t\tresponse.value = { booleanValue: value };\n\t} else if (value instanceof Date) { // eslint-disable-line no-instanceof/no-instanceof\n\t\t// TODO: check if this clause is needed? Seems like date value always comes as string\n\t\tresponse.value = { stringValue: value.toISOString().replace('T', ' ').replace('Z', '') };\n\t} else {\n\t\tthrow new Error(`Unknown type for ${value}`);\n\t}\n\n\treturn response;\n}\n"
  },
  {
    "path": "drizzle-orm/src/aws-data-api/pg/driver.ts",
    "content": "import { RDSDataClient, type RDSDataClientConfig } from '@aws-sdk/client-rds-data';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport type { PgColumn, PgInsertConfig, PgTable, TableConfig } from '~/pg-core/index.ts';\nimport { PgArray } from '~/pg-core/index.ts';\nimport type { PgRaw } from '~/pg-core/query-builders/raw.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { Param, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport { Table } from '~/table.ts';\nimport type { DrizzleConfig, UpdateSet } from '~/utils.ts';\nimport type { AwsDataApiClient, AwsDataApiPgQueryResult, AwsDataApiPgQueryResultHKT } from './session.ts';\nimport { AwsDataApiSession } from './session.ts';\n\nexport interface PgDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n\tdatabase: string;\n\tresourceArn: string;\n\tsecretArn: string;\n}\n\nexport interface DrizzleAwsDataApiPgConfig<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends DrizzleConfig<TSchema> {\n\tdatabase: string;\n\tresourceArn: string;\n\tsecretArn: string;\n}\n\nexport class AwsDataApiPgDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<AwsDataApiPgQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'AwsDataApiPgDatabase';\n\n\toverride execute<\n\t\tTRow extends Record<string, unknown> = Record<string, unknown>,\n\t>(query: SQLWrapper | string): PgRaw<AwsDataApiPgQueryResult<TRow>> {\n\t\treturn super.execute(query);\n\t}\n}\n\nexport class AwsPgDialect extends PgDialect {\n\tstatic override readonly [entityKind]: string = 'AwsPgDialect';\n\n\toverride escapeParam(num: number): string {\n\t\treturn `:${num + 1}`;\n\t}\n\n\toverride buildInsertQuery(\n\t\t{ table, values, onConflict, returning, select, withList }: PgInsertConfig<PgTable<TableConfig>>,\n\t): SQL<unknown> {\n\t\tconst columns: Record<string, PgColumn> = table[Table.Symbol.Columns];\n\n\t\tif (!select) {\n\t\t\tfor (const value of (values as Record<string, Param | SQL>[])) {\n\t\t\t\tfor (const fieldName of Object.keys(columns)) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (\n\t\t\t\t\t\tis(colValue, Param) && colValue.value !== undefined && is(colValue.encoder, PgArray)\n\t\t\t\t\t\t&& Array.isArray(colValue.value)\n\t\t\t\t\t) {\n\t\t\t\t\t\tvalue[fieldName] = sql`cast(${colValue} as ${sql.raw(colValue.encoder.getSQLType())})`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn super.buildInsertQuery({ table, values, onConflict, returning, withList });\n\t}\n\n\toverride buildUpdateSet(table: PgTable<TableConfig>, set: UpdateSet): SQL<unknown> {\n\t\tconst columns: Record<string, PgColumn> = table[Table.Symbol.Columns];\n\n\t\tfor (const [colName, colValue] of Object.entries(set)) {\n\t\t\tconst currentColumn = columns[colName];\n\t\t\tif (\n\t\t\t\tcurrentColumn && is(colValue, Param) && colValue.value !== undefined && is(colValue.encoder, PgArray)\n\t\t\t\t&& Array.isArray(colValue.value)\n\t\t\t) {\n\t\t\t\tset[colName] = sql`cast(${colValue} as ${sql.raw(colValue.encoder.getSQLType())})`;\n\t\t\t}\n\t\t}\n\t\treturn super.buildUpdateSet(table, set);\n\t}\n}\n\nfunction construct<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: AwsDataApiClient,\n\tconfig: DrizzleAwsDataApiPgConfig<TSchema>,\n): AwsDataApiPgDatabase<TSchema> & {\n\t$client: AwsDataApiClient;\n} {\n\tconst dialect = new AwsPgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new AwsDataApiSession(client, dialect, schema, { ...config, logger, cache: config.cache }, undefined);\n\tconst db = new AwsDataApiPgDatabase(dialect, session, schema as any);\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends AwsDataApiClient = RDSDataClient,\n>(\n\t...params: [\n\t\tTClient,\n\t\tDrizzleAwsDataApiPgConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t| (\n\t\t\t\t& DrizzleConfig<TSchema>\n\t\t\t\t& {\n\t\t\t\t\tconnection: RDSDataClientConfig & Omit<DrizzleAwsDataApiPgConfig, keyof DrizzleConfig>;\n\t\t\t\t}\n\t\t\t)\n\t\t\t| (\n\t\t\t\t& DrizzleAwsDataApiPgConfig<TSchema>\n\t\t\t\t& {\n\t\t\t\t\tclient: TClient;\n\t\t\t\t}\n\t\t\t)\n\t\t),\n\t]\n): AwsDataApiPgDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\t// eslint-disable-next-line no-instanceof/no-instanceof\n\tif (params[0] instanceof RDSDataClient || params[0].constructor.name !== 'Object') {\n\t\treturn construct(params[0] as TClient, params[1] as DrizzleAwsDataApiPgConfig<TSchema>) as any;\n\t}\n\n\tif ((params[0] as { client?: TClient }).client) {\n\t\tconst { client, ...drizzleConfig } = params[0] as {\n\t\t\tclient: TClient;\n\t\t} & DrizzleAwsDataApiPgConfig<TSchema>;\n\n\t\treturn construct(client, drizzleConfig) as any;\n\t}\n\n\tconst { connection, ...drizzleConfig } = params[0] as {\n\t\tconnection: RDSDataClientConfig & Omit<DrizzleAwsDataApiPgConfig, keyof DrizzleConfig>;\n\t} & DrizzleConfig<TSchema>;\n\tconst { resourceArn, database, secretArn, ...rdsConfig } = connection;\n\n\tconst instance = new RDSDataClient(rdsConfig);\n\treturn construct(instance, { resourceArn, database, secretArn, ...drizzleConfig }) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig: DrizzleAwsDataApiPgConfig<TSchema>,\n\t): AwsDataApiPgDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/aws-data-api/pg/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/aws-data-api/pg/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { AwsDataApiPgDatabase } from './driver.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: AwsDataApiPgDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tawait db.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/aws-data-api/pg/session.ts",
    "content": "import type { ColumnMetadata, ExecuteStatementCommandOutput, Field, RDSDataClient } from '@aws-sdk/client-rds-data';\nimport {\n\tBeginTransactionCommand,\n\tCommitTransactionCommand,\n\tExecuteStatementCommand,\n\tRollbackTransactionCommand,\n} from '@aws-sdk/client-rds-data';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { NoopCache } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport {\n\ttype PgDialect,\n\tPgPreparedQuery,\n\ttype PgQueryResultHKT,\n\tPgSession,\n\tPgTransaction,\n\ttype PgTransactionConfig,\n\ttype PreparedQueryConfig,\n} from '~/pg-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type QueryTypingsValue, type QueryWithTypings, type SQL, sql } from '~/sql/sql.ts';\nimport { mapResultRow } from '~/utils.ts';\nimport { getValueFromDataApi, toValueParam } from '../common/index.ts';\n\nexport type AwsDataApiClient = RDSDataClient;\n\nexport class AwsDataApiPreparedQuery<\n\tT extends PreparedQueryConfig & { values: AwsDataApiPgQueryResult<unknown[]> },\n> extends PgPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'AwsDataApiPreparedQuery';\n\n\tprivate rawQuery: ExecuteStatementCommand;\n\n\tconstructor(\n\t\tprivate client: AwsDataApiClient,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate typings: QueryTypingsValue[],\n\t\tprivate options: AwsDataApiSessionOptions,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\t/** @internal */\n\t\treadonly transactionId: string | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t\tthis.rawQuery = new ExecuteStatementCommand({\n\t\t\tsql: queryString,\n\t\t\tparameters: [],\n\t\t\tsecretArn: options.secretArn,\n\t\t\tresourceArn: options.resourceArn,\n\t\t\tdatabase: options.database,\n\t\t\ttransactionId,\n\t\t\tincludeResultMetadata: !fields && !customResultMapper,\n\t\t});\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\tconst { fields, joinsNotNullableMap, customResultMapper } = this;\n\n\t\tconst result = await this.values(placeholderValues);\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst { columnMetadata, rows } = result;\n\t\t\tif (!columnMetadata) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tconst mappedRows = rows.map((sourceRow) => {\n\t\t\t\tconst row: Record<string, unknown> = {};\n\t\t\t\tfor (const [index, value] of sourceRow.entries()) {\n\t\t\t\t\tconst metadata = columnMetadata[index];\n\t\t\t\t\tif (!metadata) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Unexpected state: no column metadata found for index ${index}. Please report this issue on GitHub: https://github.com/drizzle-team/drizzle-orm/issues/new/choose`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (!metadata.name) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Unexpected state: no column name for index ${index} found in the column metadata. Please report this issue on GitHub: https://github.com/drizzle-team/drizzle-orm/issues/new/choose`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\trow[metadata.name] = value;\n\t\t\t\t}\n\t\t\t\treturn row;\n\t\t\t});\n\t\t\treturn Object.assign(result, { rows: mappedRows });\n\t\t}\n\n\t\treturn customResultMapper\n\t\t\t? customResultMapper(result.rows!)\n\t\t\t: result.rows!.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));\n\t}\n\n\tasync all(placeholderValues?: Record<string, unknown> | undefined): Promise<T['all']> {\n\t\tconst result = await this.execute(placeholderValues);\n\t\tif (!this.fields && !this.customResultMapper) {\n\t\t\treturn (result as AwsDataApiPgQueryResult<unknown>).rows;\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync values(placeholderValues: Record<string, unknown> = {}): Promise<T['values']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues ?? {});\n\n\t\tthis.rawQuery.input.parameters = params.map((param, index) => ({\n\t\t\tname: `${index + 1}`,\n\t\t\t...toValueParam(param, this.typings[index]),\n\t\t}));\n\n\t\tthis.options.logger?.logQuery(this.rawQuery.input.sql!, this.rawQuery.input.parameters);\n\n\t\tconst result = await this.queryWithCache(this.queryString, params, async () => {\n\t\t\treturn await this.client.send(this.rawQuery);\n\t\t});\n\t\tconst rows = result.records?.map((row) => {\n\t\t\treturn row.map((field) => getValueFromDataApi(field));\n\t\t}) ?? [];\n\n\t\treturn {\n\t\t\t...result,\n\t\t\trows,\n\t\t};\n\t}\n\n\t/** @internal */\n\tmapResultRows(records: Field[][], columnMetadata: ColumnMetadata[]) {\n\t\treturn records.map((record) => {\n\t\t\tconst row: Record<string, unknown> = {};\n\t\t\tfor (const [index, field] of record.entries()) {\n\t\t\t\tconst { name } = columnMetadata[index]!;\n\t\t\t\trow[name ?? index] = getValueFromDataApi(field); // not what to default if name is undefined\n\t\t\t}\n\t\t\treturn row;\n\t\t});\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport interface AwsDataApiSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n\tdatabase: string;\n\tresourceArn: string;\n\tsecretArn: string;\n}\n\ninterface AwsDataApiQueryBase {\n\tresourceArn: string;\n\tsecretArn: string;\n\tdatabase: string;\n}\n\nexport class AwsDataApiSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgSession<AwsDataApiPgQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'AwsDataApiSession';\n\n\t/** @internal */\n\treadonly rawQuery: AwsDataApiQueryBase;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\t/** @internal */\n\t\treadonly client: AwsDataApiClient,\n\t\tdialect: PgDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: AwsDataApiSessionOptions,\n\t\t/** @internal */\n\t\treadonly transactionId: string | undefined,\n\t) {\n\t\tsuper(dialect);\n\t\tthis.rawQuery = {\n\t\t\tsecretArn: options.secretArn,\n\t\t\tresourceArn: options.resourceArn,\n\t\t\tdatabase: options.database,\n\t\t};\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<\n\t\tT extends PreparedQueryConfig & {\n\t\t\tvalues: AwsDataApiPgQueryResult<unknown[]>;\n\t\t} = PreparedQueryConfig & {\n\t\t\tvalues: AwsDataApiPgQueryResult<unknown[]>;\n\t\t},\n\t>(\n\t\tquery: QueryWithTypings,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: { type: 'select' | 'update' | 'delete' | 'insert'; tables: string[] },\n\t\tcacheConfig?: WithCacheConfig,\n\t\ttransactionId?: string,\n\t): AwsDataApiPreparedQuery<T> {\n\t\treturn new AwsDataApiPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tquery.typings ?? [],\n\t\t\tthis.options,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\ttransactionId ?? this.transactionId,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride execute<T>(query: SQL): Promise<T> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T; values: AwsDataApiPgQueryResult<unknown[]> }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tthis.transactionId,\n\t\t).execute();\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: AwsDataApiTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig | undefined,\n\t): Promise<T> {\n\t\tconst { transactionId } = await this.client.send(new BeginTransactionCommand(this.rawQuery));\n\t\tconst session = new AwsDataApiSession(this.client, this.dialect, this.schema, this.options, transactionId);\n\t\tconst tx = new AwsDataApiTransaction<TFullSchema, TSchema>(this.dialect, session, this.schema);\n\t\tif (config) {\n\t\t\tawait tx.setTransaction(config);\n\t\t}\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait this.client.send(new CommitTransactionCommand({ ...this.rawQuery, transactionId }));\n\t\t\treturn result;\n\t\t} catch (e) {\n\t\t\tawait this.client.send(new RollbackTransactionCommand({ ...this.rawQuery, transactionId }));\n\t\t\tthrow e;\n\t\t}\n\t}\n}\n\nexport class AwsDataApiTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgTransaction<AwsDataApiPgQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'AwsDataApiTransaction';\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: AwsDataApiTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new AwsDataApiTransaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\t\tawait this.session.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait this.session.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (e) {\n\t\t\tawait this.session.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow e;\n\t\t}\n\t}\n}\n\nexport type AwsDataApiPgQueryResult<T> = ExecuteStatementCommandOutput & { rows: T[] };\n\nexport interface AwsDataApiPgQueryResultHKT extends PgQueryResultHKT {\n\ttype: AwsDataApiPgQueryResult<any>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/batch.ts",
    "content": "import type { Dialect } from './column-builder.ts';\nimport type { RunnableQuery } from './runnable-query.ts';\n\nexport type BatchItem<TDialect extends Dialect = Dialect> = RunnableQuery<any, TDialect>;\n\nexport type BatchResponse<T extends BatchItem[] | readonly BatchItem[]> = {\n\t[K in keyof T]: T[K]['_']['result'];\n};\n"
  },
  {
    "path": "drizzle-orm/src/better-sqlite3/driver.ts",
    "content": "import Client, { type Database, type Options, type RunResult } from 'better-sqlite3';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { BaseSQLiteDatabase } from '~/sqlite-core/db.ts';\nimport { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { BetterSQLiteSession } from './session.ts';\n\nexport type DrizzleBetterSQLite3DatabaseConfig =\n\t| ({\n\t\tsource?:\n\t\t\t| string\n\t\t\t| Buffer;\n\t} & Options)\n\t| string\n\t| undefined;\n\nexport class BetterSQLite3Database<TSchema extends Record<string, unknown> = Record<string, never>>\n\textends BaseSQLiteDatabase<'sync', RunResult, TSchema>\n{\n\tstatic override readonly [entityKind]: string = 'BetterSQLite3Database';\n}\n\nfunction construct<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: Database,\n\tconfig: Omit<DrizzleConfig<TSchema>, 'cache'> = {},\n): BetterSQLite3Database<TSchema> & {\n\t$client: Database;\n} {\n\tconst dialect = new SQLiteSyncDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new BetterSQLiteSession(client, dialect, schema, { logger });\n\tconst db = new BetterSQLite3Database('sync', dialect, session, schema);\n\t(<any> db).$client = client;\n\t// (<any> db).$cache = config.cache;\n\t// if ((<any> db).$cache) {\n\t// \t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t// }\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n>(\n\t...params:\n\t\t| []\n\t\t| [\n\t\t\tDatabase | string,\n\t\t]\n\t\t| [\n\t\t\tDatabase | string,\n\t\t\tDrizzleConfig<TSchema>,\n\t\t]\n\t\t| [\n\t\t\t(\n\t\t\t\t& DrizzleConfig<TSchema>\n\t\t\t\t& ({\n\t\t\t\t\tconnection?: DrizzleBetterSQLite3DatabaseConfig;\n\t\t\t\t} | {\n\t\t\t\t\tclient: Database;\n\t\t\t\t})\n\t\t\t),\n\t\t]\n): BetterSQLite3Database<TSchema> & {\n\t$client: Database;\n} {\n\tif (params[0] === undefined || typeof params[0] === 'string') {\n\t\tconst instance = params[0] === undefined ? new Client() : new Client(params[0]);\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& {\n\t\t\t\tconnection?: DrizzleBetterSQLite3DatabaseConfig;\n\t\t\t\tclient?: Database;\n\t\t\t}\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tif (typeof connection === 'object') {\n\t\t\tconst { source, ...options } = connection;\n\n\t\t\tconst instance = new Client(source, options);\n\n\t\t\treturn construct(instance, drizzleConfig) as any;\n\t\t}\n\n\t\tconst instance = new Client(connection);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as Database, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): BetterSQLite3Database<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/better-sqlite3/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/better-sqlite3/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { BetterSQLite3Database } from './driver.ts';\n\nexport function migrate<TSchema extends Record<string, unknown>>(\n\tdb: BetterSQLite3Database<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tdb.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/better-sqlite3/session.ts",
    "content": "import type { Database, RunResult, Statement } from 'better-sqlite3';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, sql } from '~/sql/sql.ts';\nimport type { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport { SQLiteTransaction } from '~/sqlite-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts';\nimport {\n\ttype PreparedQueryConfig as PreparedQueryConfigBase,\n\ttype SQLiteExecuteMethod,\n\tSQLitePreparedQuery as PreparedQueryBase,\n\tSQLiteSession,\n\ttype SQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport interface BetterSQLiteSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\ntype PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\n\nexport class BetterSQLiteSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteSession<'sync', RunResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'BetterSQLiteSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: Database,\n\t\tdialect: SQLiteSyncDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: BetterSQLiteSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => unknown,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PreparedQuery<T> {\n\t\tconst stmt = this.client.prepare(query.sql);\n\t\treturn new PreparedQuery(\n\t\t\tstmt,\n\t\t\tquery,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\texecuteMethod,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: BetterSQLiteTransaction<TFullSchema, TSchema>) => T,\n\t\tconfig: SQLiteTransactionConfig = {},\n\t): T {\n\t\tconst tx = new BetterSQLiteTransaction('sync', this.dialect, this, this.schema);\n\t\tconst nativeTx = this.client.transaction(transaction);\n\t\treturn nativeTx[config.behavior ?? 'deferred'](tx);\n\t}\n}\n\nexport class BetterSQLiteTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteTransaction<'sync', RunResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'BetterSQLiteTransaction';\n\n\toverride transaction<T>(transaction: (tx: BetterSQLiteTransaction<TFullSchema, TSchema>) => T): T {\n\t\tconst savepointName = `sp${this.nestedIndex}`;\n\t\tconst tx = new BetterSQLiteTransaction('sync', this.dialect, this.session, this.schema, this.nestedIndex + 1);\n\t\tthis.session.run(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = transaction(tx);\n\t\t\tthis.session.run(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tthis.session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends PreparedQueryBase<\n\t{ type: 'sync'; run: RunResult; all: T['all']; get: T['get']; values: T['values']; execute: T['execute'] }\n> {\n\tstatic override readonly [entityKind]: string = 'BetterSQLitePreparedQuery';\n\n\tconstructor(\n\t\tprivate stmt: Statement,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => unknown,\n\t) {\n\t\tsuper('sync', executeMethod, query, cache, queryMetadata, cacheConfig);\n\t}\n\n\trun(placeholderValues?: Record<string, unknown>): RunResult {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.stmt.run(...params);\n\t}\n\n\tall(placeholderValues?: Record<string, unknown>): T['all'] {\n\t\tconst { fields, joinsNotNullableMap, query, logger, stmt, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\t\tlogger.logQuery(query.sql, params);\n\t\t\treturn stmt.all(...params);\n\t\t}\n\n\t\tconst rows = this.values(placeholderValues) as unknown[][];\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows) as T['all'];\n\t\t}\n\t\treturn rows.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));\n\t}\n\n\tget(placeholderValues?: Record<string, unknown>): T['get'] {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\n\t\tconst { fields, stmt, joinsNotNullableMap, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn stmt.get(...params);\n\t\t}\n\n\t\tconst row = stmt.raw().get(...params) as unknown[];\n\n\t\tif (!row) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper([row]) as T['get'];\n\t\t}\n\n\t\treturn mapResultRow(fields!, row, joinsNotNullableMap);\n\t}\n\n\tvalues(placeholderValues?: Record<string, unknown>): T['values'] {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.stmt.raw().all(...params) as T['values'];\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/bun-sql/driver.ts",
    "content": "/// <reference types=\"bun-types\" />\n\nimport type { SQLOptions } from 'bun';\nimport { SQL } from 'bun';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport type { BunSQLQueryResultHKT } from './session.ts';\nimport { BunSQLSession } from './session.ts';\n\nexport class BunSQLDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<BunSQLQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'BunSQLDatabase';\n}\n\nfunction construct<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: SQL,\n\tconfig: DrizzleConfig<TSchema> = {},\n): BunSQLDatabase<TSchema> & {\n\t$client: SQL;\n} {\n\tconst dialect = new PgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new BunSQLSession(client, dialect, schema, { logger, cache: config.cache });\n\tconst db = new BunSQLDatabase(dialect, session, schema as any) as BunSQLDatabase<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends SQL = SQL,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | ({ url?: string } & SQLOptions);\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): BunSQLDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = new SQL(params[0]);\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as {\n\t\t\tconnection?: { url?: string } & SQLOptions;\n\t\t\tclient?: TClient;\n\t\t} & DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tif (typeof connection === 'object' && connection.url !== undefined) {\n\t\t\tconst { url, ...config } = connection;\n\n\t\t\tconst instance = new SQL({ url, ...config });\n\t\t\treturn construct(instance, drizzleConfig) as any;\n\t\t}\n\n\t\tconst instance = new SQL(connection);\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): BunSQLDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({\n\t\t\toptions: {\n\t\t\t\tparsers: {},\n\t\t\t\tserializers: {},\n\t\t\t},\n\t\t} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/bun-sql/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/bun-sql/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { BunSQLDatabase } from './driver.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: BunSQLDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tawait db.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/bun-sql/session.ts",
    "content": "/// <reference types=\"bun-types\" />\n\nimport type { SavepointSQL, SQL, TransactionSQL } from 'bun';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgTransaction } from '~/pg-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport { PgPreparedQuery, PgSession } from '~/pg-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nexport class BunSQLPreparedQuery<T extends PreparedQueryConfig> extends PgPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'BunSQLPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: SQL,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\treturn tracer.startActiveSpan('drizzle.execute', async (span) => {\n\t\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': this.queryString,\n\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t});\n\n\t\t\tthis.logger.logQuery(this.queryString, params);\n\n\t\t\tconst { fields, queryString: query, client, joinsNotNullableMap, customResultMapper } = this;\n\t\t\tif (!fields && !customResultMapper) {\n\t\t\t\treturn tracer.startActiveSpan('drizzle.driver.execute', async () => {\n\t\t\t\t\treturn await this.queryWithCache(query, params, async () => {\n\t\t\t\t\t\treturn await client.unsafe(query, params as any[]);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst rows: any[] = await tracer.startActiveSpan('drizzle.driver.execute', async () => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': query,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\n\t\t\t\treturn await this.queryWithCache(query, params, async () => {\n\t\t\t\t\treturn client.unsafe(query, params as any[]).values();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn tracer.startActiveSpan('drizzle.mapResponse', () => {\n\t\t\t\treturn customResultMapper\n\t\t\t\t\t? customResultMapper(rows)\n\t\t\t\t\t: rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t\t\t});\n\t\t});\n\t}\n\n\tall(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['all']> {\n\t\treturn tracer.startActiveSpan('drizzle.execute', async (span) => {\n\t\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': this.queryString,\n\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t});\n\t\t\tthis.logger.logQuery(this.queryString, params);\n\t\t\treturn tracer.startActiveSpan('drizzle.driver.execute', async () => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': this.queryString,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\t\t\t\treturn await this.queryWithCache(this.queryString, params, async () => {\n\t\t\t\t\treturn await this.client.unsafe(this.queryString, params as any[]);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport interface BunSQLSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class BunSQLSession<\n\tTSQL extends SQL,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgSession<BunSQLQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'BunSQLSession';\n\n\tlogger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tpublic client: TSQL,\n\t\tdialect: PgDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\t/** @internal */\n\t\treadonly options: BunSQLSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgPreparedQuery<T> {\n\t\treturn new BunSQLPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\tquery(query: string, params: unknown[]): Promise<any> {\n\t\tthis.logger.logQuery(query, params);\n\t\treturn this.client.unsafe(query, params as any[]).values();\n\t}\n\n\tqueryObjects(\n\t\tquery: string,\n\t\tparams: unknown[],\n\t): Promise<any> {\n\t\treturn this.client.unsafe(query, params as any[]);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: BunSQLTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T> {\n\t\treturn this.client.begin(async (client) => {\n\t\t\tconst session = new BunSQLSession<TransactionSQL, TFullSchema, TSchema>(\n\t\t\t\tclient,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.options,\n\t\t\t);\n\t\t\tconst tx = new BunSQLTransaction(this.dialect, session, this.schema);\n\t\t\tif (config) {\n\t\t\t\tawait tx.setTransaction(config);\n\t\t\t}\n\t\t\treturn transaction(tx);\n\t\t}) as Promise<T>;\n\t}\n}\n\nexport class BunSQLTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgTransaction<BunSQLQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'BunSQLTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\t/** @internal */\n\t\toverride readonly session: BunSQLSession<TransactionSQL | SavepointSQL, TFullSchema, TSchema>,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tnestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, schema, nestedIndex);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: BunSQLTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\treturn (this.session.client as TransactionSQL).savepoint((client: SQL) => {\n\t\t\tconst session = new BunSQLSession<SavepointSQL, TFullSchema, TSchema>(\n\t\t\t\tclient,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.session.options,\n\t\t\t);\n\t\t\tconst tx = new BunSQLTransaction<TFullSchema, TSchema>(this.dialect, session, this.schema);\n\t\t\treturn transaction(tx);\n\t\t}) as Promise<T>;\n\t}\n}\n\nexport interface BunSQLQueryResultHKT extends PgQueryResultHKT {\n\ttype: Assume<this['row'], Record<string, any>[]>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/bun-sqlite/driver.ts",
    "content": "/// <reference types=\"bun-types\" />\n\nimport { Database } from 'bun:sqlite';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { BaseSQLiteDatabase } from '~/sqlite-core/db.ts';\nimport { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { SQLiteBunSession } from './session.ts';\n\nexport class BunSQLiteDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends BaseSQLiteDatabase<'sync', void, TSchema> {\n\tstatic override readonly [entityKind]: string = 'BunSQLiteDatabase';\n}\n\ntype DrizzleBunSqliteDatabaseOptions = {\n\t/**\n\t * Open the database as read-only (no write operations, no create).\n\t *\n\t * Equivalent to {@link constants.SQLITE_OPEN_READONLY}\n\t */\n\treadonly?: boolean;\n\t/**\n\t * Allow creating a new database\n\t *\n\t * Equivalent to {@link constants.SQLITE_OPEN_CREATE}\n\t */\n\tcreate?: boolean;\n\t/**\n\t * Open the database as read-write\n\t *\n\t * Equivalent to {@link constants.SQLITE_OPEN_READWRITE}\n\t */\n\treadwrite?: boolean;\n};\n\nexport type DrizzleBunSqliteDatabaseConfig =\n\t| ({\n\t\tsource?: string;\n\t} & DrizzleBunSqliteDatabaseOptions)\n\t| string\n\t| undefined;\n\nfunction construct<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: Database,\n\tconfig: DrizzleConfig<TSchema> = {},\n): BunSQLiteDatabase<TSchema> & {\n\t$client: Database;\n} {\n\tconst dialect = new SQLiteSyncDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new SQLiteBunSession(client, dialect, schema, { logger });\n\tconst db = new BunSQLiteDatabase('sync', dialect, session, schema) as BunSQLiteDatabase<TSchema>;\n\t(<any> db).$client = client;\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Database = Database,\n>(\n\t...params:\n\t\t| []\n\t\t| [\n\t\t\tTClient | string,\n\t\t]\n\t\t| [\n\t\t\tTClient | string,\n\t\t\tDrizzleConfig<TSchema>,\n\t\t]\n\t\t| [\n\t\t\t(\n\t\t\t\t& DrizzleConfig<TSchema>\n\t\t\t\t& ({\n\t\t\t\t\tconnection?: DrizzleBunSqliteDatabaseConfig;\n\t\t\t\t} | {\n\t\t\t\t\tclient: TClient;\n\t\t\t\t})\n\t\t\t),\n\t\t]\n): BunSQLiteDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (params[0] === undefined || typeof params[0] === 'string') {\n\t\tconst instance = params[0] === undefined ? new Database() : new Database(params[0]);\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& ({\n\t\t\t\tconnection?: DrizzleBunSqliteDatabaseConfig | string;\n\t\t\t\tclient?: TClient;\n\t\t\t})\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tif (typeof connection === 'object') {\n\t\t\tconst { source, ...opts } = connection;\n\n\t\t\tconst options = Object.values(opts).filter((v) => v !== undefined).length ? opts : undefined;\n\n\t\t\tconst instance = new Database(source, options);\n\n\t\t\treturn construct(instance, drizzleConfig) as any;\n\t\t}\n\n\t\tconst instance = new Database(connection);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as Database, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): BunSQLiteDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/bun-sqlite/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/bun-sqlite/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { BunSQLiteDatabase } from './driver.ts';\n\nexport function migrate<TSchema extends Record<string, unknown>>(\n\tdb: BunSQLiteDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tdb.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/bun-sqlite/session.ts",
    "content": "/// <reference types=\"bun-types\" />\n\nimport type { Database, Statement as BunStatement } from 'bun:sqlite';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, sql } from '~/sql/sql.ts';\nimport type { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport { SQLiteTransaction } from '~/sqlite-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts';\nimport type {\n\tPreparedQueryConfig as PreparedQueryConfigBase,\n\tSQLiteExecuteMethod,\n\tSQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { SQLitePreparedQuery as PreparedQueryBase, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport interface SQLiteBunSessionOptions {\n\tlogger?: Logger;\n}\n\ntype PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\ntype Statement = BunStatement<any>;\n\nexport class SQLiteBunSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteSession<'sync', void, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBunSession';\n\n\tprivate logger: Logger;\n\n\tconstructor(\n\t\tprivate client: Database,\n\t\tdialect: SQLiteSyncDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: SQLiteBunSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\texec(query: string): void {\n\t\tthis.client.exec(query);\n\t}\n\n\tprepareQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => unknown,\n\t): PreparedQuery<T> {\n\t\tconst stmt = this.client.prepare(query.sql);\n\t\treturn new PreparedQuery(\n\t\t\tstmt,\n\t\t\tquery,\n\t\t\tthis.logger,\n\t\t\tfields,\n\t\t\texecuteMethod,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: SQLiteBunTransaction<TFullSchema, TSchema>) => T,\n\t\tconfig: SQLiteTransactionConfig = {},\n\t): T {\n\t\tconst tx = new SQLiteBunTransaction('sync', this.dialect, this, this.schema);\n\t\tlet result: T | undefined;\n\t\tconst nativeTx = this.client.transaction(() => {\n\t\t\tresult = transaction(tx);\n\t\t});\n\t\tnativeTx[config.behavior ?? 'deferred']();\n\t\treturn result!;\n\t}\n}\n\nexport class SQLiteBunTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteTransaction<'sync', void, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBunTransaction';\n\n\toverride transaction<T>(transaction: (tx: SQLiteBunTransaction<TFullSchema, TSchema>) => T): T {\n\t\tconst savepointName = `sp${this.nestedIndex}`;\n\t\tconst tx = new SQLiteBunTransaction('sync', this.dialect, this.session, this.schema, this.nestedIndex + 1);\n\t\tthis.session.run(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = transaction(tx);\n\t\t\tthis.session.run(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tthis.session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends PreparedQueryBase<\n\t{ type: 'sync'; run: void; all: T['all']; get: T['get']; values: T['values']; execute: T['execute'] }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBunPreparedQuery';\n\n\tconstructor(\n\t\tprivate stmt: Statement,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => unknown,\n\t) {\n\t\tsuper('sync', executeMethod, query);\n\t}\n\n\trun(placeholderValues?: Record<string, unknown>) {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.stmt.run(...params);\n\t}\n\n\tall(placeholderValues?: Record<string, unknown>): T['all'] {\n\t\tconst { fields, query, logger, joinsNotNullableMap, stmt, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\t\tlogger.logQuery(query.sql, params);\n\t\t\treturn stmt.all(...params);\n\t\t}\n\n\t\tconst rows = this.values(placeholderValues) as unknown[][];\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows) as T['all'];\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));\n\t}\n\n\tget(placeholderValues?: Record<string, unknown>): T['get'] {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\tconst row = this.stmt.values(...params)[0];\n\n\t\tif (!row) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst { fields, joinsNotNullableMap, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn row;\n\t\t}\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper([row]) as T['get'];\n\t\t}\n\n\t\treturn mapResultRow(fields!, row, joinsNotNullableMap);\n\t}\n\n\tvalues(placeholderValues?: Record<string, unknown>): T['values'] {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.stmt.values(...params);\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/cache/core/cache.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { Table } from '~/index.ts';\nimport type { CacheConfig } from './types.ts';\n\nexport abstract class Cache {\n\tstatic readonly [entityKind]: string = 'Cache';\n\n\tabstract strategy(): 'explicit' | 'all';\n\n\t/**\n\t * Invoked if we should check cache for cached response\n\t * @param sql\n\t * @param tables\n\t */\n\tabstract get(\n\t\tkey: string,\n\t\ttables: string[],\n\t\tisTag: boolean,\n\t\tisAutoInvalidate?: boolean,\n\t): Promise<any[] | undefined>;\n\n\t/**\n\t * Invoked if new query should be inserted to cache\n\t * @param sql\n\t * @param tables\n\t */\n\tabstract put(\n\t\thashedQuery: string,\n\t\tresponse: any,\n\t\ttables: string[],\n\t\tisTag: boolean,\n\t\tconfig?: CacheConfig,\n\t): Promise<void>;\n\n\t/**\n\t * Invoked if insert, update, delete was invoked\n\t * @param tables\n\t */\n\tabstract onMutate(\n\t\tparams: MutationOption,\n\t): Promise<void>;\n}\n\nexport class NoopCache extends Cache {\n\toverride strategy() {\n\t\treturn 'all' as const;\n\t}\n\n\tstatic override readonly [entityKind]: string = 'NoopCache';\n\n\toverride async get(_key: string): Promise<any[] | undefined> {\n\t\treturn undefined;\n\t}\n\toverride async put(\n\t\t_hashedQuery: string,\n\t\t_response: any,\n\t\t_tables: string[],\n\t\t_config?: any,\n\t): Promise<void> {\n\t\t// noop\n\t}\n\toverride async onMutate(_params: MutationOption): Promise<void> {\n\t\t// noop\n\t}\n}\n\nexport type MutationOption = { tags?: string | string[]; tables?: Table<any> | Table<any>[] | string | string[] };\n\nexport async function hashQuery(sql: string, params?: any[]) {\n\tconst dataToHash = `${sql}-${JSON.stringify(params)}`;\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(dataToHash);\n\tconst hashBuffer = await crypto.subtle.digest('SHA-256', data);\n\tconst hashArray = [...new Uint8Array(hashBuffer)];\n\tconst hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n\n\treturn hashHex;\n}\n"
  },
  {
    "path": "drizzle-orm/src/cache/core/index.ts",
    "content": "export * from './cache.ts';\n"
  },
  {
    "path": "drizzle-orm/src/cache/core/types.ts",
    "content": "export type CacheConfig = {\n\t/**\n\t * expire time, in seconds (a positive integer)\n\t */\n\tex?: number;\n\t/**\n\t * expire time, in milliseconds (a positive integer).\n\t */\n\tpx?: number;\n\t/**\n\t * Unix time at which the key will expire, in seconds (a positive integer).\n\t */\n\texat?: number;\n\t/**\n\t * Unix time at which the key will expire, in milliseconds (a positive integer)\n\t */\n\tpxat?: number;\n\t/**\n\t * Retain the time to live associated with the key.\n\t */\n\tkeepTtl?: boolean;\n\t/**\n\t * Set an expiration (TTL or time to live) on one or more fields of a given hash key.\n\t * Used for HEXPIRE command\n\t */\n\thexOptions?: 'NX' | 'nx' | 'XX' | 'xx' | 'GT' | 'gt' | 'LT' | 'lt';\n};\n\nexport type WithCacheConfig = { enable: boolean; config?: CacheConfig; tag?: string; autoInvalidate?: boolean };\n"
  },
  {
    "path": "drizzle-orm/src/cache/readme.md",
    "content": "## Caching with Drizzle\n\nBy default, Drizzle does not perform any implicit actions with your queries and mapping. There is no cache under the hood—each query is sent directly to your database, and you can actually see it.\n\nHowever, there are cases when you might want to implement a simple caching logic for specific queries or even for all queries. With Drizzle's cache option, you can define how and when the cache is used, how you store and retrieve data, and what actions to take when write statements are executed on the database. It's basically similar to `beforeQuery` hooks, that will be invoked before actual query will be executed. Additionally, Drizzle provides predefined logic for caching. Let's take a look at it.\n\nTo make cache work you would need to define cache callbacks in drizzle instance or use a predefined ones we have in Drizzle, like a `upstashCache()` that was built together with Upstash team\n\n### Cache overview\n\n**Using upstash cache with drizzle**\n\n```ts\nconst db = drizzle(process.env.DB_URL!, { cache: upstashCache() })\n```\n\nYou can also define custom logic for your cache behavior. This is an example of our NodeKV implementation for the Drizzle cache test suites\n\n```ts\nconst db = drizzle(process.env.DB_URL!, { cache: new TestGlobalCache() })\n```\n\n```ts\nimport Keyv from 'keyv';\n\nexport class TestGlobalCache extends Cache {\n  private globalTtl: number = 1000;\n  // This object will be used to store which query keys were used\n  // for a specific table, so we can later use it for invalidation.\n  private usedTablesPerKey: Record<string, string[]> = {};\n\n  constructor(private kv: Keyv = new Keyv()) {\n    super();\n  }\n\n  // For the strategy, we have two options:\n  // - 'explicit': The cache is used only when .$withCache() is added to a query.\n  // - 'all': All queries are cached globally.\n  // The default behavior is 'explicit'.\n  override strategy(): 'explicit' | 'all' {\n    return 'all';\n  }\n\n  // This function accepts query and parameters that cached into key param,\n  // allowing you to retrieve response values for this query from the cache.\n  override async get(key: string): Promise<any[] | undefined> {\n    const res = await this.kv.get(key) ?? undefined;\n    return res;\n  }\n\n  // This function accepts several options to define how cached data will be stored:\n  // - 'key': A hashed query and parameters.\n  // - 'response': An array of values returned by Drizzle from the database.\n  // - 'tables': An array of tables involved in the select queries. This information is needed for cache invalidation.\n  //\n  // For example, if a query uses the \"users\" and \"posts\" tables, you can store this information. Later, when the app executes\n  // any mutation statements on these tables, you can remove the corresponding key from the cache. \n  // If you're okay with eventual consistency for your queries, you can skip this option.\n  override async put(key: string, response: any, tables: string[], config?: CacheConfig): Promise<void> {\n    await this.kv.set(key, response, config ? config.ex : this.globalTtl);\n    for (const table of tables) {\n      const keys = this.usedTablesPerKey[table];\n      if (keys === undefined) {\n        this.usedTablesPerKey[table] = [key];\n      } else {\n        keys.push(key);\n      }\n    }\n  }\n\n  // This function is called when insert, update, or delete statements are executed. \n  // You can either skip this step or invalidate queries that used the affected tables.\n  //\n  // The function receives an object with two keys:\n  // - 'tags': Used for queries labeled with a specific tag, allowing you to invalidate by that tag.\n  // - 'tables': The actual tables affected by the insert, update, or delete statements, \n  //   helping you track which tables have changed since the last cache update.\n  override async onMutate(params: { tags: string | string[], tables: string | string[] | Table<any> | Table<any>[]}): Promise<void> {\n    const tagsArray = params.tags ? Array.isArray(params.tags) ? params.tags : [params.tags] : [];\n    const tablesArray = params.tables ? Array.isArray(params.tables) ? params.tables : [params.tables] : [];\n\n    const keysToDelete = new Set<string>();\n\n    for (const table of tablesArray) {\n      const tableName = is(table, Table) ? getTableName(table) : table as string;\n      const keys = this.usedTablesPerKey[tableName] ?? [];\n      for (const key of keys) keysToDelete.add(key);\n    }\n\n    if (keysToDelete.size > 0 || tagsArray.length > 0) {\n      for (const tag of tagsArray) {\n        await this.kv.delete(tag);\n      }\n\n      for (const key of keysToDelete) {\n        await this.kv.delete(key);\n        for (const table of tablesArray) {\n          const tableName = is(table, Table) ? getTableName(table) : table as string;\n          this.usedTablesPerKey[tableName] = [];\n        }\n      }\n    }\n  }\n}\n```\n\n### Cache definition\n\n**Define cache credentials, but no cache will be used globally for all queries**\n\n```ts\nconst db = drizzle(process.env.DB_URL!, { cache: upstashCache({ url: '', token: '' }) })\n```\n\n**Define cache credentials, and the cache will be used globally for all queries**\n\n```ts\nconst db = drizzle(process.env.DB_URL!, { cache: upstashCache({ url: '', token: '', global: true }) })\n```\n\n**Define cache credentials with custom config values to be used for all queries, unless overridden**\n\n```ts\nconst db = drizzle(process.env.DB_URL!, { cache: upstashCache({ url: '', token: '', global: true, config: {} }) })\n```\n\nThese are all the possible config values that Drizzle supports with the cache layer\n\n```ts\nexport type CacheConfig = {\n  /**\n   * expire time, in seconds (a positive integer)\n   */\n  ex?: number;\n  /**\n   * expire time, in milliseconds (a positive integer).\n   */\n  px?: number;\n  /**\n   * Unix time at which the key will expire, in seconds (a positive integer).\n   */\n  exat?: number;\n  /**\n   * Unix time at which the key will expire, in milliseconds (a positive integer)\n   */\n  pxat?: number;\n  /**\n   * Retain the time to live associated with the key.\n   */\n  keepTtl?: boolean;\n};\n\n```\n\n### Cache usage\n\nOnce you've provided all the necessary instructions to the Drizzle database instance, you can now use the cache with Drizzle\n\n**Case 1: Drizzle with global: false option**\n\n```ts\nconst db = drizzle(process.env.DB_URL!, { cache: upstashCache({ url: '', token: '' }) })\n```\n\nIn this case, the current query won't use the cache\n\n```ts\nconst res = await db.select().from(users)\n\n// However, any mutate operation will trigger the onMutate function in the cache\n// and attempt to invalidate queries that used the tables involved in this mutation query.\nawait db.insert(users).value({ email: 'cacheman@upstash.com' })\n```\n\nIf you want the query to actually use the cache, you need to call `.$withCache()`\n\n```ts\nconst res = await db.select().from(users).$withCache()\n```\n\n`.$withCache` has a set of options you can use to manage and config this specific query strategy\n\n```ts\n// rewrite the global config options for this specific query\n.$withCache({ config: {} })\n\n// give a query custom cache key instead of hashing query+params under the hood\n.$withCache({ tag: 'custom_key' })\n\n// disable autoinvalidation for this query, if you are fine with eventual consstnecy for this specific query\n.$withCache({ autoInvalidate: false })\n```\n\n**Case 2: Drizzle with global: true option**\n\n```ts\nconst db = drizzle(process.env.DB_URL!, { cache: upstashCache({ url: '', token: '', global: true }) })\n```\n\nIn this case, the current query will use the cache\n\n```ts\nconst res = await db.select().from(users)\n```\n\nIf you want the query to disable cache for some specific query, you need to call `.$withCache(false)`\n\n```ts\n// cache is disabled for this query\nconst res = await db.select().from(users).$withCache(false)\n```\n\nYou can also use cache instance from a `db` to force invalidate specific tables or tags you've defined previously\n\n```ts\n// Invalidate all queries that use the `users` table. You can do this with the Drizzle instance.\nawait db.$cache?.invalidate({ tables: users });\n// or\nawait db.$cache?.invalidate({ tables: [users, posts] });\n\n// Invalidate all queries that use the `usersTable`. You can do this by using just the table name.\nawait db.$cache?.invalidate({ tables: 'usersTable' });\n// or\nawait db.$cache?.invalidate({ tables: ['usersTable' , 'postsTable' ] });\n\n// You can also invalidate custom tags defined in any previously executed select queries.\nawait db.$cache?.invalidate({ tags: 'custom_key' });\n// or\nawait db.$cache?.invalidate({ tags: ['custom_key', 'custom_key1'] });\n```\n"
  },
  {
    "path": "drizzle-orm/src/cache/upstash/cache.ts",
    "content": "import { Redis } from '@upstash/redis';\nimport type { MutationOption } from '~/cache/core/index.ts';\nimport { Cache } from '~/cache/core/index.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { OriginalName, Table } from '~/index.ts';\nimport type { CacheConfig } from '../core/types.ts';\n\nconst getByTagScript = `\nlocal tagsMapKey = KEYS[1] -- tags map key\nlocal tag        = ARGV[1] -- tag\n\nlocal compositeTableName = redis.call('HGET', tagsMapKey, tag)\nif not compositeTableName then\n  return nil\nend\n\nlocal value = redis.call('HGET', compositeTableName, tag)\nreturn value\n`;\n\nconst onMutateScript = `\nlocal tagsMapKey = KEYS[1] -- tags map key\nlocal tables     = {}      -- initialize tables array\nlocal tags       = ARGV    -- tags array\n\nfor i = 2, #KEYS do\n  tables[#tables + 1] = KEYS[i] -- add all keys except the first one to tables\nend\n\nif #tags > 0 then\n  for _, tag in ipairs(tags) do\n    if tag ~= nil and tag ~= '' then\n      local compositeTableName = redis.call('HGET', tagsMapKey, tag)\n      if compositeTableName then\n        redis.call('HDEL', compositeTableName, tag)\n      end\n    end\n  end\n  redis.call('HDEL', tagsMapKey, unpack(tags))\nend\n\nlocal keysToDelete = {}\n\nif #tables > 0 then\n  local compositeTableNames = redis.call('SUNION', unpack(tables))\n  for _, compositeTableName in ipairs(compositeTableNames) do\n    keysToDelete[#keysToDelete + 1] = compositeTableName\n  end\n  for _, table in ipairs(tables) do\n    keysToDelete[#keysToDelete + 1] = table\n  end\n  redis.call('DEL', unpack(keysToDelete))\nend\n`;\n\ntype Script = ReturnType<Redis['createScript']>;\n\ntype ExpireOptions = 'NX' | 'nx' | 'XX' | 'xx' | 'GT' | 'gt' | 'LT' | 'lt';\n\nexport class UpstashCache extends Cache {\n\tstatic override readonly [entityKind]: string = 'UpstashCache';\n\t/**\n\t * Prefix for sets which denote the composite table names for each unique table\n\t *\n\t * Example: In the composite table set of \"table1\", you may find\n\t * `${compositeTablePrefix}table1,table2` and `${compositeTablePrefix}table1,table3`\n\t */\n\tprivate static compositeTableSetPrefix = '__CTS__';\n\t/**\n\t * Prefix for hashes which map hash or tags to cache values\n\t */\n\tprivate static compositeTablePrefix = '__CT__';\n\t/**\n\t * Key which holds the mapping of tags to composite table names\n\t *\n\t * Using this tagsMapKey, you can find the composite table name for a given tag\n\t * and get the cache value for that tag:\n\t *\n\t * ```ts\n\t * const compositeTable = redis.hget(tagsMapKey, 'tag1')\n\t * console.log(compositeTable) // `${compositeTablePrefix}table1,table2`\n\t *\n\t * const cachevalue = redis.hget(compositeTable, 'tag1')\n\t */\n\tprivate static tagsMapKey = '__tagsMap__';\n\t/**\n\t * Queries whose auto invalidation is false aren't stored in their respective\n\t * composite table hashes because those hashes are deleted when a mutation\n\t * occurs on related tables.\n\t *\n\t * Instead, they are stored in a separate hash with the prefix\n\t * `__nonAutoInvalidate__` to prevent them from being deleted when a mutation\n\t */\n\tprivate static nonAutoInvalidateTablePrefix = '__nonAutoInvalidate__';\n\n\tprivate luaScripts: {\n\t\tgetByTagScript: Script;\n\t\tonMutateScript: Script;\n\t};\n\n\tprivate internalConfig: { seconds: number; hexOptions?: ExpireOptions };\n\n\tconstructor(public redis: Redis, config?: CacheConfig, protected useGlobally?: boolean) {\n\t\tsuper();\n\t\tthis.internalConfig = this.toInternalConfig(config);\n\t\tthis.luaScripts = {\n\t\t\tgetByTagScript: this.redis.createScript(getByTagScript, { readonly: true }),\n\t\t\tonMutateScript: this.redis.createScript(onMutateScript),\n\t\t};\n\t}\n\n\tpublic strategy() {\n\t\treturn this.useGlobally ? 'all' : 'explicit';\n\t}\n\n\tprivate toInternalConfig(config?: CacheConfig): { seconds: number; hexOptions?: ExpireOptions } {\n\t\treturn config\n\t\t\t? {\n\t\t\t\tseconds: config.ex!,\n\t\t\t\thexOptions: config.hexOptions,\n\t\t\t}\n\t\t\t: {\n\t\t\t\tseconds: 1,\n\t\t\t};\n\t}\n\n\toverride async get(\n\t\tkey: string,\n\t\ttables: string[],\n\t\tisTag: boolean = false,\n\t\tisAutoInvalidate?: boolean,\n\t): Promise<any[] | undefined> {\n\t\tif (!isAutoInvalidate) {\n\t\t\tconst result = await this.redis.hget(UpstashCache.nonAutoInvalidateTablePrefix, key);\n\t\t\treturn result === null ? undefined : result as any[];\n\t\t}\n\n\t\tif (isTag) {\n\t\t\tconst result = await this.luaScripts.getByTagScript.exec([UpstashCache.tagsMapKey], [key]);\n\t\t\treturn result === null ? undefined : result as any[];\n\t\t}\n\n\t\t// Normal cache lookup for the composite key\n\t\tconst compositeKey = this.getCompositeKey(tables);\n\t\tconst result = await this.redis.hget(compositeKey, key) ?? undefined; // Retrieve result for normal query\n\t\treturn result === null ? undefined : result as any[];\n\t}\n\n\toverride async put(\n\t\tkey: string,\n\t\tresponse: any,\n\t\ttables: string[],\n\t\tisTag: boolean = false,\n\t\tconfig?: CacheConfig,\n\t): Promise<void> {\n\t\tconst isAutoInvalidate = tables.length !== 0;\n\n\t\tconst pipeline = this.redis.pipeline();\n\t\tconst ttlSeconds = config && config.ex ? config.ex : this.internalConfig.seconds;\n\t\tconst hexOptions = config && config.hexOptions ? config.hexOptions : this.internalConfig?.hexOptions;\n\n\t\tif (!isAutoInvalidate) {\n\t\t\tif (isTag) {\n\t\t\t\tpipeline.hset(UpstashCache.tagsMapKey, { [key]: UpstashCache.nonAutoInvalidateTablePrefix });\n\t\t\t\tpipeline.hexpire(UpstashCache.tagsMapKey, key, ttlSeconds, hexOptions);\n\t\t\t}\n\n\t\t\tpipeline.hset(UpstashCache.nonAutoInvalidateTablePrefix, { [key]: response });\n\t\t\tpipeline.hexpire(UpstashCache.nonAutoInvalidateTablePrefix, key, ttlSeconds, hexOptions);\n\t\t\tawait pipeline.exec();\n\t\t\treturn;\n\t\t}\n\n\t\tconst compositeKey = this.getCompositeKey(tables);\n\n\t\tpipeline.hset(compositeKey, { [key]: response }); // Store the result with the tag under the composite key\n\t\tpipeline.hexpire(compositeKey, key, ttlSeconds, hexOptions); // Set expiration for the composite key\n\n\t\tif (isTag) {\n\t\t\tpipeline.hset(UpstashCache.tagsMapKey, { [key]: compositeKey }); // Store the tag and its composite key in the map\n\t\t\tpipeline.hexpire(UpstashCache.tagsMapKey, key, ttlSeconds, hexOptions); // Set expiration for the tag\n\t\t}\n\n\t\tfor (const table of tables) {\n\t\t\tpipeline.sadd(this.addTablePrefix(table), compositeKey);\n\t\t}\n\n\t\tawait pipeline.exec();\n\t}\n\n\toverride async onMutate(params: MutationOption) {\n\t\tconst tags = Array.isArray(params.tags) ? params.tags : params.tags ? [params.tags] : [];\n\t\tconst tables = Array.isArray(params.tables) ? params.tables : params.tables ? [params.tables] : [];\n\t\tconst tableNames: string[] = tables.map((table) => is(table, Table) ? table[OriginalName] : table as string);\n\n\t\tconst compositeTableSets = tableNames.map((table) => this.addTablePrefix(table));\n\t\tawait this.luaScripts.onMutateScript.exec([UpstashCache.tagsMapKey, ...compositeTableSets], tags);\n\t}\n\n\tprivate addTablePrefix = (table: string) => `${UpstashCache.compositeTableSetPrefix}${table}`;\n\tprivate getCompositeKey = (tables: string[]) => `${UpstashCache.compositeTablePrefix}${tables.sort().join(',')}`;\n}\n\nexport function upstashCache(\n\t{ url, token, config, global = false }: { url: string; token: string; config?: CacheConfig; global?: boolean },\n): UpstashCache {\n\tconst redis = new Redis({\n\t\turl,\n\t\ttoken,\n\t});\n\n\treturn new UpstashCache(redis, config, global);\n}\n"
  },
  {
    "path": "drizzle-orm/src/cache/upstash/index.ts",
    "content": "export * from './cache.ts';\n"
  },
  {
    "path": "drizzle-orm/src/casing.ts",
    "content": "import type { Column } from '~/column.ts';\nimport { entityKind } from './entity.ts';\nimport { Table } from './table.ts';\nimport type { Casing } from './utils.ts';\n\nexport function toSnakeCase(input: string) {\n\tconst words = input\n\t\t.replace(/['\\u2019]/g, '')\n\t\t.match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n\n\treturn words.map((word) => word.toLowerCase()).join('_');\n}\n\nexport function toCamelCase(input: string) {\n\tconst words = input\n\t\t.replace(/['\\u2019]/g, '')\n\t\t.match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n\n\treturn words.reduce((acc, word, i) => {\n\t\tconst formattedWord = i === 0 ? word.toLowerCase() : `${word[0]!.toUpperCase()}${word.slice(1)}`;\n\t\treturn acc + formattedWord;\n\t}, '');\n}\n\nfunction noopCase(input: string) {\n\treturn input;\n}\n\nexport class CasingCache {\n\tstatic readonly [entityKind]: string = 'CasingCache';\n\n\t/** @internal */\n\tcache: Record<string, string> = {};\n\tprivate cachedTables: Record<string, true> = {};\n\tprivate convert: (input: string) => string;\n\n\tconstructor(casing?: Casing) {\n\t\tthis.convert = casing === 'snake_case'\n\t\t\t? toSnakeCase\n\t\t\t: casing === 'camelCase'\n\t\t\t? toCamelCase\n\t\t\t: noopCase;\n\t}\n\n\tgetColumnCasing(column: Column): string {\n\t\tif (!column.keyAsName) return column.name;\n\n\t\tconst schema = column.table[Table.Symbol.Schema] ?? 'public';\n\t\tconst tableName = column.table[Table.Symbol.OriginalName];\n\t\tconst key = `${schema}.${tableName}.${column.name}`;\n\n\t\tif (!this.cache[key]) {\n\t\t\tthis.cacheTable(column.table);\n\t\t}\n\t\treturn this.cache[key]!;\n\t}\n\n\tprivate cacheTable(table: Table) {\n\t\tconst schema = table[Table.Symbol.Schema] ?? 'public';\n\t\tconst tableName = table[Table.Symbol.OriginalName];\n\t\tconst tableKey = `${schema}.${tableName}`;\n\n\t\tif (!this.cachedTables[tableKey]) {\n\t\t\tfor (const column of Object.values(table[Table.Symbol.Columns])) {\n\t\t\t\tconst columnKey = `${tableKey}.${column.name}`;\n\t\t\t\tthis.cache[columnKey] = this.convert(column.name);\n\t\t\t}\n\t\t\tthis.cachedTables[tableKey] = true;\n\t\t}\n\t}\n\n\tclearCache() {\n\t\tthis.cache = {};\n\t\tthis.cachedTables = {};\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/column-builder.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { Column } from './column.ts';\nimport type { GelColumn, GelExtraConfigColumn } from './gel-core/index.ts';\nimport type { MySqlColumn } from './mysql-core/index.ts';\nimport type { ExtraConfigColumn, PgColumn, PgSequenceOptions } from './pg-core/index.ts';\nimport type { SingleStoreColumn } from './singlestore-core/index.ts';\nimport type { SQL } from './sql/sql.ts';\nimport type { SQLiteColumn } from './sqlite-core/index.ts';\nimport type { Assume, Simplify } from './utils.ts';\n\nexport type ColumnDataType =\n\t| 'string'\n\t| 'number'\n\t| 'boolean'\n\t| 'array'\n\t| 'json'\n\t| 'date'\n\t| 'bigint'\n\t| 'custom'\n\t| 'buffer'\n\t| 'dateDuration'\n\t| 'duration'\n\t| 'relDuration'\n\t| 'localTime'\n\t| 'localDate'\n\t| 'localDateTime';\n\nexport type Dialect = 'pg' | 'mysql' | 'sqlite' | 'singlestore' | 'common' | 'gel';\n\nexport type GeneratedStorageMode = 'virtual' | 'stored';\n\nexport type GeneratedType = 'always' | 'byDefault';\n\nexport type GeneratedColumnConfig<TDataType> = {\n\tas: TDataType | SQL | (() => SQL);\n\ttype?: GeneratedType;\n\tmode?: GeneratedStorageMode;\n};\n\nexport type GeneratedIdentityConfig = {\n\tsequenceName?: string;\n\tsequenceOptions?: PgSequenceOptions;\n\ttype: 'always' | 'byDefault';\n};\n\nexport interface ColumnBuilderBaseConfig<TDataType extends ColumnDataType, TColumnType extends string> {\n\tname: string;\n\tdataType: TDataType;\n\tcolumnType: TColumnType;\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: string[] | undefined;\n}\n\nexport type MakeColumnConfig<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTableName extends string,\n\tTData = T extends { $type: infer U } ? U : T['data'],\n> = {\n\tname: T['name'];\n\ttableName: TTableName;\n\tdataType: T['dataType'];\n\tcolumnType: T['columnType'];\n\tdata: TData;\n\tdriverParam: T['driverParam'];\n\tnotNull: T extends { notNull: true } ? true : false;\n\thasDefault: T extends { hasDefault: true } ? true : false;\n\tisPrimaryKey: T extends { isPrimaryKey: true } ? true : false;\n\tisAutoincrement: T extends { isAutoincrement: true } ? true : false;\n\thasRuntimeDefault: T extends { hasRuntimeDefault: true } ? true : false;\n\tenumValues: T['enumValues'];\n\tbaseColumn: T extends { baseBuilder: infer U extends ColumnBuilderBase } ? BuildColumn<TTableName, U, 'common'>\n\t\t: never;\n\tidentity: T extends { identity: 'always' } ? 'always' : T extends { identity: 'byDefault' } ? 'byDefault' : undefined;\n\tgenerated: T extends { generated: infer G } ? unknown extends G ? undefined\n\t\t: G extends undefined ? undefined\n\t\t: G\n\t\t: undefined;\n} & {};\n\nexport type ColumnBuilderTypeConfig<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> = Simplify<\n\t& {\n\t\tbrand: 'ColumnBuilder';\n\t\tname: T['name'];\n\t\tdataType: T['dataType'];\n\t\tcolumnType: T['columnType'];\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverParam'];\n\t\tnotNull: T extends { notNull: infer U } ? U : boolean;\n\t\thasDefault: T extends { hasDefault: infer U } ? U : boolean;\n\t\tenumValues: T['enumValues'];\n\t\tidentity: T extends { identity: infer U } ? U : unknown;\n\t\tgenerated: T extends { generated: infer G } ? G extends undefined ? unknown : G : unknown;\n\t}\n\t& TTypeConfig\n>;\n\nexport type ColumnBuilderRuntimeConfig<TData, TRuntimeConfig extends object = object> = {\n\tname: string;\n\tkeyAsName: boolean;\n\tnotNull: boolean;\n\tdefault: TData | SQL | undefined;\n\tdefaultFn: (() => TData | SQL) | undefined;\n\tonUpdateFn: (() => TData | SQL) | undefined;\n\thasDefault: boolean;\n\tprimaryKey: boolean;\n\tisUnique: boolean;\n\tuniqueName: string | undefined;\n\tuniqueType: string | undefined;\n\tdataType: string;\n\tcolumnType: string;\n\tgenerated: GeneratedColumnConfig<TData> | undefined;\n\tgeneratedIdentity: GeneratedIdentityConfig | undefined;\n} & TRuntimeConfig;\n\nexport interface ColumnBuilderExtraConfig {\n\tprimaryKeyHasDefault?: boolean;\n}\n\nexport type NotNull<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tnotNull: true;\n\t};\n};\n\nexport type HasDefault<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\thasDefault: true;\n\t};\n};\n\nexport type IsPrimaryKey<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tisPrimaryKey: true;\n\t};\n};\n\nexport type IsAutoincrement<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tisAutoincrement: true;\n\t};\n};\n\nexport type HasRuntimeDefault<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\thasRuntimeDefault: true;\n\t};\n};\n\nexport type $Type<T extends ColumnBuilderBase, TType> = T & {\n\t_: {\n\t\t$type: TType;\n\t};\n};\n\nexport type HasGenerated<T extends ColumnBuilderBase, TGenerated extends {} = {}> = T & {\n\t_: {\n\t\thasDefault: true;\n\t\tgenerated: TGenerated;\n\t};\n};\n\nexport type IsIdentity<\n\tT extends ColumnBuilderBase,\n\tTType extends 'always' | 'byDefault',\n> = T & {\n\t_: {\n\t\tnotNull: true;\n\t\thasDefault: true;\n\t\tidentity: TType;\n\t};\n};\nexport interface ColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> {\n\t_: ColumnBuilderTypeConfig<T, TTypeConfig>;\n}\n\n// To understand how to use `ColumnBuilder` and `AnyColumnBuilder`, see `Column` and `AnyColumn` documentation.\nexport abstract class ColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> implements ColumnBuilderBase<T, TTypeConfig> {\n\tstatic readonly [entityKind]: string = 'ColumnBuilder';\n\n\tdeclare _: ColumnBuilderTypeConfig<T, TTypeConfig>;\n\n\tprotected config: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;\n\n\tconstructor(name: T['name'], dataType: T['dataType'], columnType: T['columnType']) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tkeyAsName: name === '',\n\t\t\tnotNull: false,\n\t\t\tdefault: undefined,\n\t\t\thasDefault: false,\n\t\t\tprimaryKey: false,\n\t\t\tisUnique: false,\n\t\t\tuniqueName: undefined,\n\t\t\tuniqueType: undefined,\n\t\t\tdataType,\n\t\t\tcolumnType,\n\t\t\tgenerated: undefined,\n\t\t} as ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;\n\t}\n\n\t/**\n\t * Changes the data type of the column. Commonly used with `json` columns. Also, useful for branded types.\n\t *\n\t * @example\n\t * ```ts\n\t * const users = pgTable('users', {\n\t * \tid: integer('id').$type<UserId>().primaryKey(),\n\t * \tdetails: json('details').$type<UserDetails>().notNull(),\n\t * });\n\t * ```\n\t */\n\t$type<TType>(): $Type<this, TType> {\n\t\treturn this as $Type<this, TType>;\n\t}\n\n\t/**\n\t * Adds a `not null` clause to the column definition.\n\t *\n\t * Affects the `select` model of the table - columns *without* `not null` will be nullable on select.\n\t */\n\tnotNull(): NotNull<this> {\n\t\tthis.config.notNull = true;\n\t\treturn this as NotNull<this>;\n\t}\n\n\t/**\n\t * Adds a `default <value>` clause to the column definition.\n\t *\n\t * Affects the `insert` model of the table - columns *with* `default` are optional on insert.\n\t *\n\t * If you need to set a dynamic default value, use {@link $defaultFn} instead.\n\t */\n\tdefault(value: (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL): HasDefault<this> {\n\t\tthis.config.default = value;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Adds a dynamic default value to the column.\n\t * The function will be called when the row is inserted, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$defaultFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasRuntimeDefault<HasDefault<this>> {\n\t\tthis.config.defaultFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasRuntimeDefault<HasDefault<this>>;\n\t}\n\n\t/**\n\t * Alias for {@link $defaultFn}.\n\t */\n\t$default = this.$defaultFn;\n\n\t/**\n\t * Adds a dynamic update value to the column.\n\t * The function will be called when the row is updated, and the returned value will be used as the column value if none is provided.\n\t * If no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$onUpdateFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasDefault<this> {\n\t\tthis.config.onUpdateFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Alias for {@link $onUpdateFn}.\n\t */\n\t$onUpdate = this.$onUpdateFn;\n\n\t/**\n\t * Adds a `primary key` clause to the column definition. This implicitly makes the column `not null`.\n\t *\n\t * In SQLite, `integer primary key` implicitly makes the column auto-incrementing.\n\t */\n\tprimaryKey(): TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>\n\t\t: IsPrimaryKey<NotNull<this>>\n\t{\n\t\tthis.config.primaryKey = true;\n\t\tthis.config.notNull = true;\n\t\treturn this as TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>\n\t\t\t: IsPrimaryKey<NotNull<this>>;\n\t}\n\n\tabstract generatedAlwaysAs(\n\t\tas: SQL | T['data'] | (() => SQL),\n\t\tconfig?: Partial<GeneratedColumnConfig<unknown>>,\n\t): HasGenerated<this, {\n\t\ttype: 'always';\n\t}>;\n\n\t/** @internal Sets the name of the column to the key within the table definition if a name was not given. */\n\tsetName(name: string) {\n\t\tif (this.config.name !== '') return;\n\t\tthis.config.name = name;\n\t}\n}\n\nexport type BuildColumn<\n\tTTableName extends string,\n\tTBuilder extends ColumnBuilderBase,\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? PgColumn<\n\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t{},\n\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t>\n\t: TDialect extends 'mysql' ? MySqlColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<\n\t\t\t\tOmit<\n\t\t\t\t\tTBuilder['_'],\n\t\t\t\t\t| keyof MakeColumnConfig<TBuilder['_'], TTableName>\n\t\t\t\t\t| 'brand'\n\t\t\t\t\t| 'dialect'\n\t\t\t\t\t| 'primaryKeyHasDefault'\n\t\t\t\t\t| 'mysqlColumnBuilderBrand'\n\t\t\t\t>\n\t\t\t>\n\t\t>\n\t: TDialect extends 'sqlite' ? SQLiteColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t\t>\n\t: TDialect extends 'common' ? Column<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t\t>\n\t: TDialect extends 'singlestore' ? SingleStoreColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<\n\t\t\t\tOmit<\n\t\t\t\t\tTBuilder['_'],\n\t\t\t\t\t| keyof MakeColumnConfig<TBuilder['_'], TTableName>\n\t\t\t\t\t| 'brand'\n\t\t\t\t\t| 'dialect'\n\t\t\t\t\t| 'primaryKeyHasDefault'\n\t\t\t\t\t| 'singlestoreColumnBuilderBrand'\n\t\t\t\t>\n\t\t\t>\n\t\t>\n\t: TDialect extends 'gel' ? GelColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t\t>\n\t: never;\n\nexport type BuildIndexColumn<\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? ExtraConfigColumn\n\t: TDialect extends 'gel' ? GelExtraConfigColumn\n\t: never;\n\n// TODO\n// try to make sql as well + indexRaw\n\n// optional after everything will be working as expected\n// also try to leave only needed methods for extraConfig\n// make an error if I pass .asc() to fk and so on\n\nexport type BuildColumns<\n\tTTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildColumn<TTableName, {\n\t\t\t_:\n\t\t\t\t& Omit<TConfigMap[Key]['_'], 'name'>\n\t\t\t\t& { name: TConfigMap[Key]['_']['name'] extends '' ? Assume<Key, string> : TConfigMap[Key]['_']['name'] };\n\t\t}, TDialect>;\n\t}\n\t& {};\n\nexport type BuildExtraConfigColumns<\n\t_TTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildIndexColumn<TDialect>;\n\t}\n\t& {};\n\nexport type ChangeColumnTableName<TColumn extends Column, TAlias extends string, TDialect extends Dialect> =\n\tTDialect extends 'pg' ? PgColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'mysql' ? MySqlColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'singlestore' ? SingleStoreColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'sqlite' ? SQLiteColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'gel' ? GelColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: never;\n"
  },
  {
    "path": "drizzle-orm/src/column.ts",
    "content": "import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tGeneratedColumnConfig,\n\tGeneratedIdentityConfig,\n} from './column-builder.ts';\nimport { entityKind } from './entity.ts';\nimport type { DriverValueMapper, SQL, SQLWrapper } from './sql/sql.ts';\nimport type { Table } from './table.ts';\nimport type { Update } from './utils.ts';\n\nexport interface ColumnBaseConfig<\n\tTDataType extends ColumnDataType,\n\tTColumnType extends string,\n> extends ColumnBuilderBaseConfig<TDataType, TColumnType> {\n\ttableName: string;\n\tnotNull: boolean;\n\thasDefault: boolean;\n\tisPrimaryKey: boolean;\n\tisAutoincrement: boolean;\n\thasRuntimeDefault: boolean;\n}\n\nexport type ColumnTypeConfig<T extends ColumnBaseConfig<ColumnDataType, string>, TTypeConfig extends object> = T & {\n\tbrand: 'Column';\n\ttableName: T['tableName'];\n\tname: T['name'];\n\tdataType: T['dataType'];\n\tcolumnType: T['columnType'];\n\tdata: T['data'];\n\tdriverParam: T['driverParam'];\n\tnotNull: T['notNull'];\n\thasDefault: T['hasDefault'];\n\tisPrimaryKey: T['isPrimaryKey'];\n\tisAutoincrement: T['isAutoincrement'];\n\thasRuntimeDefault: T['hasRuntimeDefault'];\n\tenumValues: T['enumValues'];\n\tbaseColumn: T extends { baseColumn: infer U } ? U : unknown;\n\tgenerated: GeneratedColumnConfig<T['data']> | undefined;\n\tidentity: undefined | 'always' | 'byDefault';\n} & TTypeConfig;\n\nexport type ColumnRuntimeConfig<TData, TRuntimeConfig extends object> = ColumnBuilderRuntimeConfig<\n\tTData,\n\tTRuntimeConfig\n>;\n\nexport interface Column<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTRuntimeConfig extends object = object,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTTypeConfig extends object = object,\n> extends DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n/*\n\t`Column` only accepts a full `ColumnConfig` as its generic.\n\tTo infer parts of the config, use `AnyColumn` that accepts a partial config.\n\tSee `GetColumnData` for example usage of inferring.\n*/\nexport abstract class Column<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n> implements DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Column';\n\n\tdeclare readonly _: ColumnTypeConfig<T, TTypeConfig>;\n\n\treadonly name: string;\n\treadonly keyAsName: boolean;\n\treadonly primary: boolean;\n\treadonly notNull: boolean;\n\treadonly default: T['data'] | SQL | undefined;\n\treadonly defaultFn: (() => T['data'] | SQL) | undefined;\n\treadonly onUpdateFn: (() => T['data'] | SQL) | undefined;\n\treadonly hasDefault: boolean;\n\treadonly isUnique: boolean;\n\treadonly uniqueName: string | undefined;\n\treadonly uniqueType: string | undefined;\n\treadonly dataType: T['dataType'];\n\treadonly columnType: T['columnType'];\n\treadonly enumValues: T['enumValues'] = undefined;\n\treadonly generated: GeneratedColumnConfig<T['data']> | undefined = undefined;\n\treadonly generatedIdentity: GeneratedIdentityConfig | undefined = undefined;\n\n\tprotected config: ColumnRuntimeConfig<T['data'], TRuntimeConfig>;\n\n\tconstructor(\n\t\treadonly table: Table,\n\t\tconfig: ColumnRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tthis.config = config;\n\t\tthis.name = config.name;\n\t\tthis.keyAsName = config.keyAsName;\n\t\tthis.notNull = config.notNull;\n\t\tthis.default = config.default;\n\t\tthis.defaultFn = config.defaultFn;\n\t\tthis.onUpdateFn = config.onUpdateFn;\n\t\tthis.hasDefault = config.hasDefault;\n\t\tthis.primary = config.primaryKey;\n\t\tthis.isUnique = config.isUnique;\n\t\tthis.uniqueName = config.uniqueName;\n\t\tthis.uniqueType = config.uniqueType;\n\t\tthis.dataType = config.dataType as T['dataType'];\n\t\tthis.columnType = config.columnType;\n\t\tthis.generated = config.generated;\n\t\tthis.generatedIdentity = config.generatedIdentity;\n\t}\n\n\tabstract getSQLType(): string;\n\n\tmapFromDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\tmapToDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\t// ** @internal */\n\tshouldDisableInsert(): boolean {\n\t\treturn this.config.generated !== undefined && this.config.generated.type !== 'byDefault';\n\t}\n}\n\nexport type UpdateColConfig<\n\tT extends ColumnBaseConfig<ColumnDataType, string>,\n\tTUpdate extends Partial<ColumnBaseConfig<ColumnDataType, string>>,\n> = Update<T, TUpdate>;\n\nexport type AnyColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = Column<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport type GetColumnData<TColumn extends Column, TInferMode extends 'query' | 'raw' = 'query'> =\n\t// dprint-ignore\n\tTInferMode extends 'raw' // Raw mode\n\t\t? TColumn['_']['data'] // Just return the underlying type\n\t\t: TColumn['_']['notNull'] extends true // Query mode\n\t\t? TColumn['_']['data'] // Query mode, not null\n\t\t: TColumn['_']['data'] | null; // Query mode, nullable\n\nexport type InferColumnsDataTypes<TColumns extends Record<string, Column>> = {\n\t[Key in keyof TColumns]: GetColumnData<TColumns[Key], 'query'>;\n};\n"
  },
  {
    "path": "drizzle-orm/src/d1/driver.ts",
    "content": "/// <reference types=\"@cloudflare/workers-types\" />\nimport type { D1Database as MiniflareD1Database } from '@miniflare/d1';\nimport type { BatchItem, BatchResponse } from '~/batch.ts';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype ExtractTablesWithRelations,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { BaseSQLiteDatabase } from '~/sqlite-core/db.ts';\nimport { SQLiteAsyncDialect } from '~/sqlite-core/dialect.ts';\nimport type { DrizzleConfig, IfNotImported } from '~/utils.ts';\nimport { SQLiteD1Session } from './session.ts';\n\nexport type AnyD1Database = IfNotImported<\n\tD1Database,\n\tMiniflareD1Database,\n\tD1Database | IfNotImported<MiniflareD1Database, never, MiniflareD1Database>\n>;\n\nexport class DrizzleD1Database<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends BaseSQLiteDatabase<'async', D1Result, TSchema> {\n\tstatic override readonly [entityKind]: string = 'D1Database';\n\n\t/** @internal */\n\tdeclare readonly session: SQLiteD1Session<TSchema, ExtractTablesWithRelations<TSchema>>;\n\n\tasync batch<U extends BatchItem<'sqlite'>, T extends Readonly<[U, ...U[]]>>(\n\t\tbatch: T,\n\t): Promise<BatchResponse<T>> {\n\t\treturn this.session.batch(batch) as Promise<BatchResponse<T>>;\n\t}\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends AnyD1Database = AnyD1Database,\n>(\n\tclient: TClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): DrizzleD1Database<TSchema> & {\n\t$client: TClient;\n} {\n\tconst dialect = new SQLiteAsyncDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new SQLiteD1Session(client as D1Database, dialect, schema, { logger, cache: config.cache });\n\tconst db = new DrizzleD1Database('async', dialect, session, schema) as DrizzleD1Database<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n"
  },
  {
    "path": "drizzle-orm/src/d1/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/d1/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { DrizzleD1Database } from './driver.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: DrizzleD1Database<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tconst migrationsTable = config.migrationsTable ?? '__drizzle_migrations';\n\n\tconst migrationTableCreate = sql`\n\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\tid SERIAL PRIMARY KEY,\n\t\t\thash text NOT NULL,\n\t\t\tcreated_at numeric\n\t\t)\n\t`;\n\tawait db.session.run(migrationTableCreate);\n\n\tconst dbMigrations = await db.values<[number, string, string]>(\n\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t);\n\n\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\n\tconst statementToBatch = [];\n\n\tfor (const migration of migrations) {\n\t\tif (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {\n\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\tstatementToBatch.push(db.run(sql.raw(stmt)));\n\t\t\t}\n\n\t\t\tstatementToBatch.push(\n\t\t\t\tdb.run(\n\t\t\t\t\tsql`INSERT INTO ${sql.identifier(migrationsTable)} (\"hash\", \"created_at\") VALUES(${\n\t\t\t\t\t\tsql.raw(`'${migration.hash}'`)\n\t\t\t\t\t}, ${sql.raw(`${migration.folderMillis}`)})`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tif (statementToBatch.length > 0) {\n\t\tawait db.session.batch(statementToBatch);\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/d1/session.ts",
    "content": "/// <reference types=\"@cloudflare/workers-types\" />\n\nimport type { BatchItem } from '~/batch.ts';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport { fillPlaceholders, type Query, sql } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect } from '~/sqlite-core/dialect.ts';\nimport { SQLiteTransaction } from '~/sqlite-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts';\nimport type {\n\tPreparedQueryConfig as PreparedQueryConfigBase,\n\tSQLiteExecuteMethod,\n\tSQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport interface SQLiteD1SessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\ntype PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\n\nexport class SQLiteD1Session<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteSession<'async', D1Result, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLiteD1Session';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: D1Database,\n\t\tdialect: SQLiteAsyncDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: SQLiteD1SessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => unknown,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): D1PreparedQuery {\n\t\tconst stmt = this.client.prepare(query.sql);\n\t\treturn new D1PreparedQuery(\n\t\t\tstmt,\n\t\t\tquery,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\texecuteMethod,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\tasync batch<T extends BatchItem<'sqlite'>[] | readonly BatchItem<'sqlite'>[]>(queries: T) {\n\t\tconst preparedQueries: PreparedQuery[] = [];\n\t\tconst builtQueries: D1PreparedStatement[] = [];\n\n\t\tfor (const query of queries) {\n\t\t\tconst preparedQuery = query._prepare();\n\t\t\tconst builtQuery = preparedQuery.getQuery();\n\t\t\tpreparedQueries.push(preparedQuery);\n\t\t\tif (builtQuery.params.length > 0) {\n\t\t\t\tbuiltQueries.push((preparedQuery as D1PreparedQuery).stmt.bind(...builtQuery.params));\n\t\t\t} else {\n\t\t\t\tconst builtQuery = preparedQuery.getQuery();\n\t\t\t\tbuiltQueries.push(\n\t\t\t\t\tthis.client.prepare(builtQuery.sql).bind(...builtQuery.params),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst batchResults = await this.client.batch<any>(builtQueries);\n\t\treturn batchResults.map((result, i) => preparedQueries[i]!.mapResult(result, true));\n\t}\n\n\toverride extractRawAllValueFromBatchResult(result: unknown): unknown {\n\t\treturn (result as D1Result).results;\n\t}\n\n\toverride extractRawGetValueFromBatchResult(result: unknown): unknown {\n\t\treturn (result as D1Result).results[0];\n\t}\n\n\toverride extractRawValuesValueFromBatchResult(result: unknown): unknown {\n\t\treturn d1ToRawMapping((result as D1Result).results);\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: D1Transaction<TFullSchema, TSchema>) => T | Promise<T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Promise<T> {\n\t\tconst tx = new D1Transaction('async', this.dialect, this, this.schema);\n\t\tawait this.run(sql.raw(`begin${config?.behavior ? ' ' + config.behavior : ''}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait this.run(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait this.run(sql`rollback`);\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class D1Transaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteTransaction<'async', D1Result, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'D1Transaction';\n\n\toverride async transaction<T>(transaction: (tx: D1Transaction<TFullSchema, TSchema>) => Promise<T>): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex}`;\n\t\tconst tx = new D1Transaction('async', this.dialect, this.session, this.schema, this.nestedIndex + 1);\n\t\tawait this.session.run(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait this.session.run(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait this.session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\n/**\n * This function was taken from the D1 implementation: https://github.com/cloudflare/workerd/blob/4aae9f4c7ae30a59a88ca868c4aff88bda85c956/src/cloudflare/internal/d1-api.ts#L287\n * It may cause issues with duplicated column names in join queries, which should be fixed on the D1 side.\n * @param results\n * @returns\n */\nfunction d1ToRawMapping(results: any) {\n\tconst rows: unknown[][] = [];\n\tfor (const row of results) {\n\t\tconst entry = Object.keys(row).map((k) => row[k]);\n\t\trows.push(entry);\n\t}\n\treturn rows;\n}\n\nexport class D1PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends SQLitePreparedQuery<\n\t{ type: 'async'; run: D1Response; all: T['all']; get: T['get']; values: T['values']; execute: T['execute'] }\n> {\n\tstatic override readonly [entityKind]: string = 'D1PreparedQuery';\n\n\t/** @internal */\n\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => unknown;\n\n\t/** @internal */\n\tfields?: SelectedFieldsOrdered;\n\n\t/** @internal */\n\tstmt: D1PreparedStatement;\n\n\tconstructor(\n\t\tstmt: D1PreparedStatement,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => unknown,\n\t) {\n\t\tsuper('async', executeMethod, query, cache, queryMetadata, cacheConfig);\n\t\tthis.customResultMapper = customResultMapper;\n\t\tthis.fields = fields;\n\t\tthis.stmt = stmt;\n\t}\n\n\tasync run(placeholderValues?: Record<string, unknown>): Promise<D1Response> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn await this.queryWithCache(this.query.sql, params, async () => {\n\t\t\treturn this.stmt.bind(...params).run();\n\t\t});\n\t}\n\n\tasync all(placeholderValues?: Record<string, unknown>): Promise<T['all']> {\n\t\tconst { fields, query, logger, stmt, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\t\tlogger.logQuery(query.sql, params);\n\t\t\treturn await this.queryWithCache(query.sql, params, async () => {\n\t\t\t\treturn stmt.bind(...params).all().then(({ results }) => this.mapAllResult(results!));\n\t\t\t});\n\t\t}\n\n\t\tconst rows = await this.values(placeholderValues);\n\n\t\treturn this.mapAllResult(rows);\n\t}\n\n\toverride mapAllResult(rows: unknown, isFromBatch?: boolean): unknown {\n\t\tif (isFromBatch) {\n\t\t\trows = d1ToRawMapping((rows as D1Result).results);\n\t\t}\n\n\t\tif (!this.fields && !this.customResultMapper) {\n\t\t\treturn rows;\n\t\t}\n\n\t\tif (this.customResultMapper) {\n\t\t\treturn this.customResultMapper(rows as unknown[][]);\n\t\t}\n\n\t\treturn (rows as unknown[][]).map((row) => mapResultRow(this.fields!, row, this.joinsNotNullableMap));\n\t}\n\n\tasync get(placeholderValues?: Record<string, unknown>): Promise<T['get']> {\n\t\tconst { fields, joinsNotNullableMap, query, logger, stmt, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\t\tlogger.logQuery(query.sql, params);\n\t\t\treturn await this.queryWithCache(query.sql, params, async () => {\n\t\t\t\treturn stmt.bind(...params).all().then(({ results }) => results![0]);\n\t\t\t});\n\t\t}\n\n\t\tconst rows = await this.values(placeholderValues);\n\n\t\tif (!rows[0]) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows) as T['all'];\n\t\t}\n\n\t\treturn mapResultRow(fields!, rows[0], joinsNotNullableMap);\n\t}\n\n\toverride mapGetResult(result: unknown, isFromBatch?: boolean): unknown {\n\t\tif (isFromBatch) {\n\t\t\tresult = d1ToRawMapping((result as D1Result).results)[0];\n\t\t}\n\n\t\tif (!this.fields && !this.customResultMapper) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this.customResultMapper) {\n\t\t\treturn this.customResultMapper([result as unknown[]]) as T['all'];\n\t\t}\n\n\t\treturn mapResultRow(this.fields!, result as unknown[], this.joinsNotNullableMap);\n\t}\n\n\tasync values<T extends any[] = unknown[]>(placeholderValues?: Record<string, unknown>): Promise<T[]> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn await this.queryWithCache(this.query.sql, params, async () => {\n\t\t\treturn this.stmt.bind(...params).raw();\n\t\t});\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/durable-sqlite/driver.ts",
    "content": "/// <reference types=\"@cloudflare/workers-types\" />\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype ExtractTablesWithRelations,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { BaseSQLiteDatabase } from '~/sqlite-core/db.ts';\nimport { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport { SQLiteDOSession } from './session.ts';\n\nexport class DrizzleSqliteDODatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends BaseSQLiteDatabase<'sync', SqlStorageCursor<Record<string, SqlStorageValue>>, TSchema> {\n\tstatic override readonly [entityKind]: string = 'DrizzleSqliteDODatabase';\n\n\t/** @internal */\n\tdeclare readonly session: SQLiteDOSession<TSchema, ExtractTablesWithRelations<TSchema>>;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends DurableObjectStorage = DurableObjectStorage,\n>(\n\tclient: TClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): DrizzleSqliteDODatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tconst dialect = new SQLiteSyncDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new SQLiteDOSession(client as DurableObjectStorage, dialect, schema, { logger });\n\tconst db = new DrizzleSqliteDODatabase('sync', dialect, session, schema) as DrizzleSqliteDODatabase<TSchema>;\n\t(<any> db).$client = client;\n\n\treturn db as any;\n}\n"
  },
  {
    "path": "drizzle-orm/src/durable-sqlite/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/durable-sqlite/migrator.ts",
    "content": "import type { MigrationMeta } from '~/migrator.ts';\nimport { sql } from '~/sql/index.ts';\nimport type { DrizzleSqliteDODatabase } from './driver.ts';\n\ninterface MigrationConfig {\n\tjournal: {\n\t\tentries: { idx: number; when: number; tag: string; breakpoints: boolean }[];\n\t};\n\tmigrations: Record<string, string>;\n}\n\nfunction readMigrationFiles({ journal, migrations }: MigrationConfig): MigrationMeta[] {\n\tconst migrationQueries: MigrationMeta[] = [];\n\n\tfor (const journalEntry of journal.entries) {\n\t\tconst query = migrations[`m${journalEntry.idx.toString().padStart(4, '0')}`];\n\n\t\tif (!query) {\n\t\t\tthrow new Error(`Missing migration: ${journalEntry.tag}`);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = query.split('--> statement-breakpoint').map((it) => {\n\t\t\t\treturn it;\n\t\t\t});\n\n\t\t\tmigrationQueries.push({\n\t\t\t\tsql: result,\n\t\t\t\tbps: journalEntry.breakpoints,\n\t\t\t\tfolderMillis: journalEntry.when,\n\t\t\t\thash: '',\n\t\t\t});\n\t\t} catch {\n\t\t\tthrow new Error(`Failed to parse migration: ${journalEntry.tag}`);\n\t\t}\n\t}\n\n\treturn migrationQueries;\n}\n\nexport async function migrate<\n\tTSchema extends Record<string, unknown>,\n>(\n\tdb: DrizzleSqliteDODatabase<TSchema>,\n\tconfig: MigrationConfig,\n): Promise<void> {\n\tconst migrations = readMigrationFiles(config);\n\n\tdb.transaction((tx) => {\n\t\ttry {\n\t\t\tconst migrationsTable = '__drizzle_migrations';\n\n\t\t\tconst migrationTableCreate = sql`\n\t\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\t\thash text NOT NULL,\n\t\t\t\t\tcreated_at numeric\n\t\t\t\t)\n\t\t\t`;\n\t\t\tdb.run(migrationTableCreate);\n\n\t\t\tconst dbMigrations = db.values<[number, string, string]>(\n\t\t\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t\t\t);\n\n\t\t\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tdb.run(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tdb.run(\n\t\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\ttx.rollback();\n\t\t\tthrow error;\n\t\t}\n\t});\n}\n"
  },
  {
    "path": "drizzle-orm/src/durable-sqlite/session.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query } from '~/sql/sql.ts';\nimport { type SQLiteSyncDialect, SQLiteTransaction } from '~/sqlite-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts';\nimport {\n\ttype PreparedQueryConfig as PreparedQueryConfigBase,\n\ttype SQLiteExecuteMethod,\n\tSQLiteSession,\n\ttype SQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { SQLitePreparedQuery as PreparedQueryBase } from '~/sqlite-core/session.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport interface SQLiteDOSessionOptions {\n\tlogger?: Logger;\n}\n\ntype PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\n\nexport class SQLiteDOSession<TFullSchema extends Record<string, unknown>, TSchema extends TablesRelationalConfig>\n\textends SQLiteSession<\n\t\t'sync',\n\t\tSqlStorageCursor<Record<string, SqlStorageValue>>,\n\t\tTFullSchema,\n\t\tTSchema\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteDOSession';\n\n\tprivate logger: Logger;\n\n\tconstructor(\n\t\tprivate client: DurableObjectStorage,\n\t\tdialect: SQLiteSyncDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: SQLiteDOSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\tprepareQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => unknown,\n\t): SQLiteDOPreparedQuery<T> {\n\t\treturn new SQLiteDOPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery,\n\t\t\tthis.logger,\n\t\t\tfields,\n\t\t\texecuteMethod,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (\n\t\t\ttx: SQLiteTransaction<'sync', SqlStorageCursor<Record<string, SqlStorageValue>>, TFullSchema, TSchema>,\n\t\t) => T,\n\t\t_config?: SQLiteTransactionConfig,\n\t): T {\n\t\tconst tx = new SQLiteDOTransaction('sync', this.dialect, this, this.schema);\n\t\treturn this.client.transactionSync(() => transaction(tx));\n\t}\n}\n\nexport class SQLiteDOTransaction<TFullSchema extends Record<string, unknown>, TSchema extends TablesRelationalConfig>\n\textends SQLiteTransaction<\n\t\t'sync',\n\t\tSqlStorageCursor<Record<string, SqlStorageValue>>,\n\t\tTFullSchema,\n\t\tTSchema\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteDOTransaction';\n\n\toverride transaction<T>(transaction: (tx: SQLiteDOTransaction<TFullSchema, TSchema>) => T): T {\n\t\tconst tx = new SQLiteDOTransaction('sync', this.dialect, this.session, this.schema, this.nestedIndex + 1);\n\t\treturn this.session.transaction(() => transaction(tx));\n\t}\n}\n\nexport class SQLiteDOPreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends PreparedQueryBase<{\n\ttype: 'sync';\n\trun: void;\n\tall: T['all'];\n\tget: T['get'];\n\tvalues: T['values'];\n\texecute: T['execute'];\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteDOPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: DurableObjectStorage,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => unknown,\n\t) {\n\t\t// 3-6 params are for cache. As long as we don't support sync cache - it will be skipped here\n\t\tsuper('sync', executeMethod, query, undefined, undefined, undefined);\n\t}\n\n\trun(placeholderValues?: Record<string, unknown>): void {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\n\t\tparams.length > 0 ? this.client.sql.exec(this.query.sql, ...params) : this.client.sql.exec(this.query.sql);\n\t}\n\n\tall(placeholderValues?: Record<string, unknown>): T['all'] {\n\t\tconst { fields, joinsNotNullableMap, query, logger, client, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\t\tlogger.logQuery(query.sql, params);\n\n\t\t\treturn params.length > 0 ? client.sql.exec(query.sql, ...params).toArray() : client.sql.exec(query.sql).toArray();\n\t\t}\n\n\t\tconst rows = this.values(placeholderValues) as unknown[][];\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows) as T['all'];\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));\n\t}\n\n\tget(placeholderValues?: Record<string, unknown>): T['get'] {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\n\t\tconst { fields, client, joinsNotNullableMap, customResultMapper, query } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn (params.length > 0 ? client.sql.exec(query.sql, ...params) : client.sql.exec(query.sql)).next().value;\n\t\t}\n\n\t\tconst rows = this.values(placeholderValues) as unknown[][];\n\t\tconst row = rows[0];\n\n\t\tif (!row) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows) as T['get'];\n\t\t}\n\n\t\treturn mapResultRow(fields!, row, joinsNotNullableMap);\n\t}\n\n\tvalues(placeholderValues?: Record<string, unknown>): T['values'] {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\n\t\tconst res = params.length > 0\n\t\t\t? this.client.sql.exec(this.query.sql, ...params)\n\t\t\t: this.client.sql.exec(this.query.sql);\n\n\t\t// @ts-ignore .raw().toArray() exists\n\t\treturn res.raw().toArray();\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/entity.ts",
    "content": "export const entityKind = Symbol.for('drizzle:entityKind');\nexport const hasOwnEntityKind = Symbol.for('drizzle:hasOwnEntityKind');\n\nexport interface DrizzleEntity {\n\t[entityKind]: string;\n}\n\nexport type DrizzleEntityClass<T> =\n\t& ((abstract new(...args: any[]) => T) | (new(...args: any[]) => T))\n\t& DrizzleEntity;\n\nexport function is<T extends DrizzleEntityClass<any>>(value: any, type: T): value is InstanceType<T> {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (value instanceof type) { // eslint-disable-line no-instanceof/no-instanceof\n\t\treturn true;\n\t}\n\n\tif (!Object.prototype.hasOwnProperty.call(type, entityKind)) {\n\t\tthrow new Error(\n\t\t\t`Class \"${\n\t\t\t\ttype.name ?? '<unknown>'\n\t\t\t}\" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`,\n\t\t);\n\t}\n\n\tlet cls = Object.getPrototypeOf(value).constructor;\n\tif (cls) {\n\t\t// Traverse the prototype chain to find the entityKind\n\t\twhile (cls) {\n\t\t\tif (entityKind in cls && cls[entityKind] === type[entityKind]) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tcls = Object.getPrototypeOf(cls);\n\t\t}\n\t}\n\n\treturn false;\n}\n"
  },
  {
    "path": "drizzle-orm/src/errors.ts",
    "content": "import { entityKind } from '~/entity.ts';\n\nexport class DrizzleError extends Error {\n\tstatic readonly [entityKind]: string = 'DrizzleError';\n\n\tconstructor({ message, cause }: { message?: string; cause?: unknown }) {\n\t\tsuper(message);\n\t\tthis.name = 'DrizzleError';\n\t\tthis.cause = cause;\n\t}\n}\n\nexport class DrizzleQueryError extends Error {\n\tconstructor(\n\t\tpublic query: string,\n\t\tpublic params: any[],\n\t\tpublic override cause?: Error,\n\t) {\n\t\tsuper(`Failed query: ${query}\\nparams: ${params}`);\n\t\tError.captureStackTrace(this, DrizzleQueryError);\n\n\t\t// ES2022+: preserves original error on `.cause`\n\t\tif (cause) (this as any).cause = cause;\n\t}\n}\n\nexport class TransactionRollbackError extends DrizzleError {\n\tstatic override readonly [entityKind]: string = 'TransactionRollbackError';\n\n\tconstructor() {\n\t\tsuper({ message: 'Rollback' });\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/expo-sqlite/driver.ts",
    "content": "import type { SQLiteDatabase, SQLiteRunResult } from 'expo-sqlite';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { BaseSQLiteDatabase } from '~/sqlite-core/db.ts';\nimport { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport { ExpoSQLiteSession } from './session.ts';\n\nexport class ExpoSQLiteDatabase<TSchema extends Record<string, unknown> = Record<string, never>>\n\textends BaseSQLiteDatabase<'sync', SQLiteRunResult, TSchema>\n{\n\tstatic override readonly [entityKind]: string = 'ExpoSQLiteDatabase';\n}\n\nexport function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: SQLiteDatabase,\n\tconfig: DrizzleConfig<TSchema> = {},\n): ExpoSQLiteDatabase<TSchema> & {\n\t$client: SQLiteDatabase;\n} {\n\tconst dialect = new SQLiteSyncDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new ExpoSQLiteSession(client, dialect, schema, { logger });\n\tconst db = new ExpoSQLiteDatabase('sync', dialect, session, schema) as ExpoSQLiteDatabase<TSchema>;\n\t(<any> db).$client = client;\n\n\treturn db as any;\n}\n"
  },
  {
    "path": "drizzle-orm/src/expo-sqlite/index.ts",
    "content": "export * from './driver.ts';\nexport * from './query.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/expo-sqlite/migrator.ts",
    "content": "import { useEffect, useReducer } from 'react';\nimport type { MigrationMeta } from '~/migrator.ts';\nimport type { ExpoSQLiteDatabase } from './driver.ts';\n\ninterface MigrationConfig {\n\tjournal: {\n\t\tentries: { idx: number; when: number; tag: string; breakpoints: boolean }[];\n\t};\n\tmigrations: Record<string, string>;\n}\n\nasync function readMigrationFiles({ journal, migrations }: MigrationConfig): Promise<MigrationMeta[]> {\n\tconst migrationQueries: MigrationMeta[] = [];\n\n\tfor await (const journalEntry of journal.entries) {\n\t\tconst query = migrations[`m${journalEntry.idx.toString().padStart(4, '0')}`];\n\n\t\tif (!query) {\n\t\t\tthrow new Error(`Missing migration: ${journalEntry.tag}`);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = query.split('--> statement-breakpoint').map((it) => {\n\t\t\t\treturn it;\n\t\t\t});\n\n\t\t\tmigrationQueries.push({\n\t\t\t\tsql: result,\n\t\t\t\tbps: journalEntry.breakpoints,\n\t\t\t\tfolderMillis: journalEntry.when,\n\t\t\t\thash: '',\n\t\t\t});\n\t\t} catch {\n\t\t\tthrow new Error(`Failed to parse migration: ${journalEntry.tag}`);\n\t\t}\n\t}\n\n\treturn migrationQueries;\n}\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: ExpoSQLiteDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = await readMigrationFiles(config);\n\treturn db.dialect.migrate(migrations, db.session);\n}\n\ninterface State {\n\tsuccess: boolean;\n\terror?: Error;\n}\n\ntype Action =\n\t| { type: 'migrating' }\n\t| { type: 'migrated'; payload: true }\n\t| { type: 'error'; payload: Error };\n\nexport const useMigrations = (db: ExpoSQLiteDatabase<any>, migrations: {\n\tjournal: {\n\t\tentries: { idx: number; when: number; tag: string; breakpoints: boolean }[];\n\t};\n\tmigrations: Record<string, string>;\n}): State => {\n\tconst initialState: State = {\n\t\tsuccess: false,\n\t\terror: undefined,\n\t};\n\n\tconst fetchReducer = (state: State, action: Action): State => {\n\t\tswitch (action.type) {\n\t\t\tcase 'migrating': {\n\t\t\t\treturn { ...initialState };\n\t\t\t}\n\t\t\tcase 'migrated': {\n\t\t\t\treturn { ...initialState, success: action.payload };\n\t\t\t}\n\t\t\tcase 'error': {\n\t\t\t\treturn { ...initialState, error: action.payload };\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t}\n\t};\n\n\tconst [state, dispatch] = useReducer(fetchReducer, initialState);\n\n\tuseEffect(() => {\n\t\tdispatch({ type: 'migrating' });\n\t\tmigrate(db, migrations as any).then(() => {\n\t\t\tdispatch({ type: 'migrated', payload: true });\n\t\t}).catch((error) => {\n\t\t\tdispatch({ type: 'error', payload: error as Error });\n\t\t});\n\t}, []);\n\n\treturn state;\n};\n"
  },
  {
    "path": "drizzle-orm/src/expo-sqlite/query.ts",
    "content": "import { addDatabaseChangeListener } from 'expo-sqlite';\nimport { useEffect, useState } from 'react';\nimport { is } from '~/entity.ts';\nimport { SQL } from '~/sql/sql.ts';\nimport type { AnySQLiteSelect } from '~/sqlite-core/index.ts';\nimport { getTableConfig, getViewConfig, SQLiteTable, SQLiteView } from '~/sqlite-core/index.ts';\nimport { SQLiteRelationalQuery } from '~/sqlite-core/query-builders/query.ts';\nimport { Subquery } from '~/subquery.ts';\n\nexport const useLiveQuery = <T extends Pick<AnySQLiteSelect, '_' | 'then'> | SQLiteRelationalQuery<'sync', unknown>>(\n\tquery: T,\n\tdeps: unknown[] = [],\n) => {\n\tconst [data, setData] = useState<Awaited<T>>(\n\t\t(is(query, SQLiteRelationalQuery) && query.mode === 'first' ? undefined : []) as Awaited<T>,\n\t);\n\tconst [error, setError] = useState<Error>();\n\tconst [updatedAt, setUpdatedAt] = useState<Date>();\n\n\tuseEffect(() => {\n\t\tconst entity = is(query, SQLiteRelationalQuery) ? query.table : (query as AnySQLiteSelect).config.table;\n\n\t\tif (is(entity, Subquery) || is(entity, SQL)) {\n\t\t\tsetError(new Error('Selecting from subqueries and SQL are not supported in useLiveQuery'));\n\t\t\treturn;\n\t\t}\n\n\t\tlet listener: ReturnType<typeof addDatabaseChangeListener> | undefined;\n\n\t\tconst handleData = (data: any) => {\n\t\t\tsetData(data);\n\t\t\tsetUpdatedAt(new Date());\n\t\t};\n\n\t\tquery.then(handleData).catch(setError);\n\n\t\tif (is(entity, SQLiteTable) || is(entity, SQLiteView)) {\n\t\t\tconst config = is(entity, SQLiteTable) ? getTableConfig(entity) : getViewConfig(entity);\n\t\t\tlistener = addDatabaseChangeListener(({ tableName }) => {\n\t\t\t\tif (config.name === tableName) {\n\t\t\t\t\tquery.then(handleData).catch(setError);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn () => {\n\t\t\tlistener?.remove();\n\t\t};\n\t}, deps);\n\n\treturn {\n\t\tdata,\n\t\terror,\n\t\tupdatedAt,\n\t} as const;\n};\n"
  },
  {
    "path": "drizzle-orm/src/expo-sqlite/session.ts",
    "content": "import type { SQLiteDatabase, SQLiteRunResult, SQLiteStatement } from 'expo-sqlite';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, sql } from '~/sql/sql.ts';\nimport type { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport { SQLiteTransaction } from '~/sqlite-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts';\nimport {\n\ttype PreparedQueryConfig as PreparedQueryConfigBase,\n\ttype SQLiteExecuteMethod,\n\tSQLitePreparedQuery,\n\tSQLiteSession,\n\ttype SQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport interface ExpoSQLiteSessionOptions {\n\tlogger?: Logger;\n}\n\ntype PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\n\nexport class ExpoSQLiteSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteSession<'sync', SQLiteRunResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'ExpoSQLiteSession';\n\n\tprivate logger: Logger;\n\n\tconstructor(\n\t\tprivate client: SQLiteDatabase,\n\t\tdialect: SQLiteSyncDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: ExpoSQLiteSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\tprepareQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => unknown,\n\t): ExpoSQLitePreparedQuery<T> {\n\t\tconst stmt = this.client.prepareSync(query.sql);\n\t\treturn new ExpoSQLitePreparedQuery(\n\t\t\tstmt,\n\t\t\tquery,\n\t\t\tthis.logger,\n\t\t\tfields,\n\t\t\texecuteMethod,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: ExpoSQLiteTransaction<TFullSchema, TSchema>) => T,\n\t\tconfig: SQLiteTransactionConfig = {},\n\t): T {\n\t\tconst tx = new ExpoSQLiteTransaction('sync', this.dialect, this, this.schema);\n\t\tthis.run(sql.raw(`begin${config?.behavior ? ' ' + config.behavior : ''}`));\n\t\ttry {\n\t\t\tconst result = transaction(tx);\n\t\t\tthis.run(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tthis.run(sql`rollback`);\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class ExpoSQLiteTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteTransaction<'sync', SQLiteRunResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'ExpoSQLiteTransaction';\n\n\toverride transaction<T>(transaction: (tx: ExpoSQLiteTransaction<TFullSchema, TSchema>) => T): T {\n\t\tconst savepointName = `sp${this.nestedIndex}`;\n\t\tconst tx = new ExpoSQLiteTransaction('sync', this.dialect, this.session, this.schema, this.nestedIndex + 1);\n\t\tthis.session.run(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = transaction(tx);\n\t\t\tthis.session.run(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tthis.session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class ExpoSQLitePreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends SQLitePreparedQuery<\n\t{ type: 'sync'; run: SQLiteRunResult; all: T['all']; get: T['get']; values: T['values']; execute: T['execute'] }\n> {\n\tstatic override readonly [entityKind]: string = 'ExpoSQLitePreparedQuery';\n\n\tconstructor(\n\t\tprivate stmt: SQLiteStatement,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => unknown,\n\t) {\n\t\tsuper('sync', executeMethod, query);\n\t}\n\n\trun(placeholderValues?: Record<string, unknown>): SQLiteRunResult {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\tconst { changes, lastInsertRowId } = this.stmt.executeSync(params as any[]);\n\t\treturn {\n\t\t\tchanges,\n\t\t\tlastInsertRowId,\n\t\t};\n\t}\n\n\tall(placeholderValues?: Record<string, unknown>): T['all'] {\n\t\tconst { fields, joinsNotNullableMap, query, logger, stmt, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\t\tlogger.logQuery(query.sql, params);\n\t\t\treturn stmt.executeSync(params as any[]).getAllSync();\n\t\t}\n\n\t\tconst rows = this.values(placeholderValues) as unknown[][];\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows) as T['all'];\n\t\t}\n\t\treturn rows.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));\n\t}\n\n\tget(placeholderValues?: Record<string, unknown>): T['get'] {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\n\t\tconst { fields, stmt, joinsNotNullableMap, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn stmt.executeSync(params as any[]).getFirstSync();\n\t\t}\n\n\t\tconst rows = this.values(placeholderValues) as unknown[][];\n\t\tconst row = rows[0];\n\n\t\tif (!row) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows) as T['get'];\n\t\t}\n\n\t\treturn mapResultRow(fields!, row, joinsNotNullableMap);\n\t}\n\n\tvalues(placeholderValues?: Record<string, unknown>): T['values'] {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.stmt.executeForRawResultSync(params as any[]).getAllSync();\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel/driver.ts",
    "content": "import { type Client, type ConnectOptions, createClient } from 'gel';\nimport type { Cache } from '~/cache/core/index.ts';\nimport { entityKind } from '~/entity.ts';\nimport { GelDatabase } from '~/gel-core/db.ts';\nimport { GelDialect } from '~/gel-core/dialect.ts';\nimport type { GelQueryResultHKT } from '~/gel-core/session.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport type { GelClient } from './session.ts';\nimport { GelDbSession } from './session.ts';\n\nexport interface GelDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class GelDriver {\n\tstatic readonly [entityKind]: string = 'GelDriver';\n\n\tconstructor(\n\t\tprivate client: GelClient,\n\t\tprivate dialect: GelDialect,\n\t\tprivate options: GelDriverOptions = {},\n\t) {}\n\n\tcreateSession(\n\t\tschema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,\n\t): GelDbSession<Record<string, unknown>, TablesRelationalConfig> {\n\t\treturn new GelDbSession(this.client, this.dialect, schema, {\n\t\t\tlogger: this.options.logger,\n\t\t\tcache: this.options.cache,\n\t\t});\n\t}\n}\n\nexport class GelJsDatabase<TSchema extends Record<string, unknown> = Record<string, never>>\n\textends GelDatabase<GelQueryResultHKT, TSchema>\n{\n\tstatic override readonly [entityKind]: string = 'GelJsDatabase';\n}\n\nfunction construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends GelClient = GelClient,\n>(\n\tclient: TClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): GelJsDatabase<TSchema> & {\n\t$client: GelClient extends TClient ? Client : TClient;\n} {\n\tconst dialect = new GelDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst driver = new GelDriver(client, dialect, { logger, cache: config.cache });\n\tconst session = driver.createSession(schema);\n\tconst db = new GelJsDatabase(dialect, session, schema as any) as GelJsDatabase<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends GelClient = Client,\n>(\n\t...params:\n\t\t| [TClient | string]\n\t\t| [TClient | string, DrizzleConfig<TSchema>]\n\t\t| [\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& (\n\t\t\t\t| {\n\t\t\t\t\tconnection: string | ConnectOptions;\n\t\t\t\t}\n\t\t\t\t| {\n\t\t\t\t\tclient: TClient;\n\t\t\t\t}\n\t\t\t),\n\t\t]\n): GelJsDatabase<TSchema> & {\n\t$client: GelClient extends TClient ? Client : TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = createClient({ dsn: params[0] });\n\n\t\treturn construct(instance, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as (\n\t\t\t& ({ connection?: ConnectOptions | string; client?: TClient })\n\t\t\t& DrizzleConfig<TSchema>\n\t\t);\n\n\t\tif (client) return construct(client, drizzleConfig);\n\n\t\tconst instance = createClient(connection);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): GelJsDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/gel/migrator.ts",
    "content": "// import type { MigrationConfig } from '~/migrator.ts';\n// import { readMigrationFiles } from '~/migrator.ts';\n// import type { GelJsDatabase } from './driver.ts';\n\n// not supported\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nasync function migrate<TSchema extends Record<string, unknown>>(\n\t// db: GelJsDatabase<TSchema>,\n\t// config: MigrationConfig,\n) {\n\treturn {};\n\t// const migrations = readMigrationFiles(config);\n\t// await db.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel/session.ts",
    "content": "import type { Client } from 'gel';\nimport type { Transaction } from 'gel/dist/transaction';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { GelDialect } from '~/gel-core/dialect.ts';\nimport type { SelectedFieldsOrdered } from '~/gel-core/query-builders/select.types.ts';\nimport { GelPreparedQuery, GelSession, GelTransaction, type PreparedQueryConfig } from '~/gel-core/session.ts';\nimport { type Logger, NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport type GelClient = Client | Transaction;\n\nexport class GelDbPreparedQuery<T extends PreparedQueryConfig> extends GelPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'GelPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: GelClient,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tprivate transaction: boolean = false,\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\treturn tracer.startActiveSpan('drizzle.execute', async () => {\n\t\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\t\tthis.logger.logQuery(this.queryString, params);\n\t\t\tconst { fields, queryString: query, client, joinsNotNullableMap, customResultMapper } = this;\n\t\t\tif (!fields && !customResultMapper) {\n\t\t\t\treturn tracer.startActiveSpan('drizzle.driver.execute', async (span) => {\n\t\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t\t'drizzle.query.text': query,\n\t\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t\t});\n\n\t\t\t\t\treturn await this.queryWithCache(query, params, async () => {\n\t\t\t\t\t\treturn await client.querySQL(query, params.length ? params : undefined);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result = (await tracer.startActiveSpan('drizzle.driver.execute', async (span) => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': query,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\n\t\t\t\treturn await this.queryWithCache(query, params, async () => {\n\t\t\t\t\treturn await client.withSQLRowMode('array').querySQL(query, params.length ? params : undefined);\n\t\t\t\t});\n\t\t\t})) as unknown[][];\n\n\t\t\treturn tracer.startActiveSpan('drizzle.mapResponse', () => {\n\t\t\t\treturn customResultMapper\n\t\t\t\t\t? customResultMapper(result)\n\t\t\t\t\t: result.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t\t\t});\n\t\t});\n\t}\n\n\tasync all(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['all']> {\n\t\treturn await tracer.startActiveSpan('drizzle.execute', async () => {\n\t\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\t\t\tthis.logger.logQuery(this.queryString, params);\n\t\t\treturn await tracer.startActiveSpan('drizzle.driver.execute', async (span) => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': this.queryString,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\t\t\t\treturn await this.queryWithCache(this.queryString, params, async () => {\n\t\t\t\t\treturn await this.client.withSQLRowMode('array').querySQL(\n\t\t\t\t\t\tthis.queryString,\n\t\t\t\t\t\tparams.length ? params : undefined,\n\t\t\t\t\t).then((\n\t\t\t\t\t\tresult,\n\t\t\t\t\t) => result);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport interface GelSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class GelDbSession<TFullSchema extends Record<string, unknown>, TSchema extends TablesRelationalConfig>\n\textends GelSession<GelQueryResultHKT, TFullSchema, TSchema>\n{\n\tstatic override readonly [entityKind]: string = 'GelDbSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: GelClient,\n\t\tdialect: GelDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: GelSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): GelDbPreparedQuery<T> {\n\t\treturn new GelDbPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: GelTransaction<GelQueryResultHKT, TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\treturn await (this.client as Client).transaction(async (clientTx) => {\n\t\t\tconst session = new GelDbSession(clientTx, this.dialect, this.schema, this.options);\n\t\t\tconst tx = new GelDbTransaction<TFullSchema, TSchema>(this.dialect, session, this.schema);\n\t\t\treturn await transaction(tx);\n\t\t});\n\t}\n\n\toverride async count(sql: SQL): Promise<number> {\n\t\tconst res = await this.execute<[{ count: string }]>(sql);\n\t\treturn Number(res[0]['count']);\n\t}\n}\n\nexport class GelDbTransaction<TFullSchema extends Record<string, unknown>, TSchema extends TablesRelationalConfig>\n\textends GelTransaction<GelQueryResultHKT, TFullSchema, TSchema>\n{\n\tstatic override readonly [entityKind]: string = 'GelDbTransaction';\n\n\toverride async transaction<T>(transaction: (tx: GelDbTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T> {\n\t\tconst tx = new GelDbTransaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t);\n\t\treturn await transaction(tx);\n\t}\n}\n\n// TODO fix this\nexport interface GelQueryResultHKT {\n\treadonly $brand: 'GelQueryResultHKT';\n\treadonly row: unknown;\n\treadonly type: unknown;\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/alias.ts",
    "content": "import { TableAliasProxyHandler } from '~/alias.ts';\nimport type { BuildAliasTable } from './query-builders/select.types.ts';\n\nimport type { GelTable } from './table.ts';\nimport type { GelViewBase } from './view-base.ts';\n\nexport function alias<TTable extends GelTable | GelViewBase, TAlias extends string>(\n\ttable: TTable,\n\talias: TAlias,\n): BuildAliasTable<TTable, TAlias> {\n\treturn new Proxy(table, new TableAliasProxyHandler(alias, false)) as any;\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/checks.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/index.ts';\nimport type { GelTable } from './table.ts';\n\nexport class CheckBuilder {\n\tstatic readonly [entityKind]: string = 'GelCheckBuilder';\n\n\tprotected brand!: 'GelConstraintBuilder';\n\n\tconstructor(public name: string, public value: SQL) {}\n\n\t/** @internal */\n\tbuild(table: GelTable): Check {\n\t\treturn new Check(table, this);\n\t}\n}\n\nexport class Check {\n\tstatic readonly [entityKind]: string = 'GelCheck';\n\n\treadonly name: string;\n\treadonly value: SQL;\n\n\tconstructor(public table: GelTable, builder: CheckBuilder) {\n\t\tthis.name = builder.name;\n\t\tthis.value = builder.value;\n\t}\n}\n\nexport function check(name: string, value: SQL): CheckBuilder {\n\treturn new CheckBuilder(name, value);\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/all.ts",
    "content": "import { bigint } from './bigint.ts';\nimport { bigintT } from './bigintT.ts';\nimport { boolean } from './boolean.ts';\nimport { bytes } from './bytes.ts';\nimport { customType } from './custom.ts';\nimport { dateDuration } from './date-duration.ts';\nimport { decimal } from './decimal.ts';\nimport { doublePrecision } from './double-precision.ts';\nimport { duration } from './duration.ts';\nimport { integer } from './integer.ts';\nimport { json } from './json.ts';\nimport { localDate } from './localdate.ts';\nimport { localTime } from './localtime.ts';\nimport { real } from './real.ts';\nimport { relDuration } from './relative-duration.ts';\nimport { smallint } from './smallint.ts';\nimport { text } from './text.ts';\nimport { timestamp } from './timestamp.ts';\nimport { timestamptz } from './timestamptz.ts';\nimport { uuid } from './uuid.ts';\n\n// TODO add\nexport function getGelColumnBuilders() {\n\treturn {\n\t\tlocalDate,\n\t\tlocalTime,\n\t\tdecimal,\n\t\tdateDuration,\n\t\tbigintT,\n\t\tduration,\n\t\trelDuration,\n\t\tbytes,\n\t\tcustomType,\n\t\tbigint,\n\t\tboolean,\n\t\tdoublePrecision,\n\t\tinteger,\n\t\tjson,\n\t\treal,\n\t\tsmallint,\n\t\ttext,\n\t\ttimestamptz,\n\t\tuuid,\n\t\ttimestamp,\n\t};\n}\n\nexport type GelColumnsBuilders = ReturnType<typeof getGelColumnBuilders>;\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/bigint.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn } from './common.ts';\nimport { GelIntColumnBaseBuilder } from './int.common.ts';\n\nexport type GelInt53BuilderInitial<TName extends string> = GelInt53Builder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'GelInt53';\n\tdata: number;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class GelInt53Builder<T extends ColumnBuilderBaseConfig<'number', 'GelInt53'>>\n\textends GelIntColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'GelInt53Builder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'GelInt53');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelInt53<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelInt53<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class GelInt53<T extends ColumnBaseConfig<'number', 'GelInt53'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelInt53';\n\n\tgetSQLType(): string {\n\t\treturn 'bigint';\n\t}\n}\n\nexport function bigint(): GelInt53BuilderInitial<''>;\nexport function bigint<TName extends string>(name: TName): GelInt53BuilderInitial<TName>;\nexport function bigint(name?: string) {\n\treturn new GelInt53Builder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/bigintT.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn } from './common.ts';\nimport { GelIntColumnBaseBuilder } from './int.common.ts';\n\nexport type GelBigInt64BuilderInitial<TName extends string> = GelBigInt64Builder<{\n\tname: TName;\n\tdataType: 'bigint';\n\tcolumnType: 'GelBigInt64';\n\tdata: bigint;\n\tdriverParam: bigint;\n\tenumValues: undefined;\n}>;\n\nexport class GelBigInt64Builder<T extends ColumnBuilderBaseConfig<'bigint', 'GelBigInt64'>>\n\textends GelIntColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'GelBigInt64Builder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'bigint', 'GelBigInt64');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelBigInt64<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelBigInt64<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class GelBigInt64<T extends ColumnBaseConfig<'bigint', 'GelBigInt64'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelBigInt64';\n\n\tgetSQLType(): string {\n\t\treturn 'edgedbt.bigint_t';\n\t}\n\n\toverride mapFromDriverValue(value: string): bigint {\n\t\treturn BigInt(value as string); // TODO ts error if remove 'as string'\n\t}\n}\n\nexport function bigintT(): GelBigInt64BuilderInitial<''>;\nexport function bigintT<TName extends string>(name: TName): GelBigInt64BuilderInitial<TName>;\nexport function bigintT(name?: string) {\n\treturn new GelBigInt64Builder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/boolean.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn, GelColumnBuilder } from './common.ts';\n\nexport type GelBooleanBuilderInitial<TName extends string> = GelBooleanBuilder<{\n\tname: TName;\n\tdataType: 'boolean';\n\tcolumnType: 'GelBoolean';\n\tdata: boolean;\n\tdriverParam: boolean;\n\tenumValues: undefined;\n}>;\n\nexport class GelBooleanBuilder<T extends ColumnBuilderBaseConfig<'boolean', 'GelBoolean'>> extends GelColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'GelBooleanBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'boolean', 'GelBoolean');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelBoolean<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelBoolean<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class GelBoolean<T extends ColumnBaseConfig<'boolean', 'GelBoolean'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelBoolean';\n\n\tgetSQLType(): string {\n\t\treturn 'boolean';\n\t}\n}\n\nexport function boolean(): GelBooleanBuilderInitial<''>;\nexport function boolean<TName extends string>(name: TName): GelBooleanBuilderInitial<TName>;\nexport function boolean(name?: string) {\n\treturn new GelBooleanBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/bytes.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn, GelColumnBuilder } from './common.ts';\n\nexport type GelBytesBuilderInitial<TName extends string> = GelBytesBuilder<{\n\tname: TName;\n\tdataType: 'buffer';\n\tcolumnType: 'GelBytes';\n\tdata: Uint8Array;\n\tdriverParam: Uint8Array | Buffer;\n\tenumValues: undefined;\n}>;\n\nexport class GelBytesBuilder<T extends ColumnBuilderBaseConfig<'buffer', 'GelBytes'>> extends GelColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'GelBytesBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'buffer', 'GelBytes');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelBytes<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelBytes<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class GelBytes<T extends ColumnBaseConfig<'buffer', 'GelBytes'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelBytes';\n\n\tgetSQLType(): string {\n\t\treturn 'bytea';\n\t}\n}\n\nexport function bytes(): GelBytesBuilderInitial<''>;\nexport function bytes<TName extends string>(name: TName): GelBytesBuilderInitial<TName>;\nexport function bytes(name?: string) {\n\treturn new GelBytesBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/common.ts",
    "content": "import type {\n\tColumnBuilderBase,\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tHasGenerated,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport { ColumnBuilder } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Simplify, Update } from '~/utils.ts';\n\nimport type { ForeignKey, UpdateDeleteAction } from '~/gel-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/gel-core/foreign-keys.ts';\nimport type { AnyGelTable, GelTable } from '~/gel-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport { iife } from '~/tracing-utils.ts';\nimport type { GelIndexOpClass } from '../indexes.ts';\nimport { uniqueKeyName } from '../unique-constraint.ts';\n\nexport interface ReferenceConfig {\n\tref: () => GelColumn;\n\tactions: {\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport interface GelColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> extends ColumnBuilderBase<T, TTypeConfig & { dialect: 'gel' }> {}\n\nexport abstract class GelColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> extends ColumnBuilder<T, TRuntimeConfig, TTypeConfig & { dialect: 'gel' }, TExtraConfig>\n\timplements GelColumnBuilderBase<T, TTypeConfig>\n{\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\tstatic override readonly [entityKind]: string = 'GelColumnBuilder';\n\n\tarray<TSize extends number | undefined = undefined>(size?: TSize): GelArrayBuilder<\n\t\t& {\n\t\t\tname: T['name'];\n\t\t\tdataType: 'array';\n\t\t\tcolumnType: 'GelArray';\n\t\t\tdata: T['data'][];\n\t\t\tdriverParam: T['driverParam'][] | string;\n\t\t\tenumValues: T['enumValues'];\n\t\t\tsize: TSize;\n\t\t\tbaseBuilder: T;\n\t\t}\n\t\t& (T extends { notNull: true } ? { notNull: true } : {})\n\t\t& (T extends { hasDefault: true } ? { hasDefault: true } : {}),\n\t\tT\n\t> {\n\t\treturn new GelArrayBuilder(this.config.name, this as GelColumnBuilder<any, any>, size as any);\n\t}\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tactions: ReferenceConfig['actions'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, actions });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t\tconfig?: { nulls: 'distinct' | 'not distinct' },\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\tthis.config.uniqueType = config?.nulls;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(as: SQL | T['data'] | (() => SQL)): HasGenerated<this, {\n\t\ttype: 'always';\n\t}> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: 'stored',\n\t\t};\n\t\treturn this as HasGenerated<this, {\n\t\t\ttype: 'always';\n\t\t}>;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: GelColumn, table: GelTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, actions }) => {\n\t\t\treturn iife(\n\t\t\t\t(ref, actions) => {\n\t\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\t\treturn { columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t\t});\n\t\t\t\t\tif (actions.onUpdate) {\n\t\t\t\t\t\tbuilder.onUpdate(actions.onUpdate);\n\t\t\t\t\t}\n\t\t\t\t\tif (actions.onDelete) {\n\t\t\t\t\t\tbuilder.onDelete(actions.onDelete);\n\t\t\t\t\t}\n\t\t\t\t\treturn builder.build(table);\n\t\t\t\t},\n\t\t\t\tref,\n\t\t\t\tactions,\n\t\t\t);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelColumn<MakeColumnConfig<T, TTableName>>;\n\n\t/** @internal */\n\tbuildExtraConfigColumn<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelExtraConfigColumn {\n\t\treturn new GelExtraConfigColumn(table, this.config);\n\t}\n}\n\n// To understand how to use `GelColumn` and `GelColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class GelColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = {},\n\tTTypeConfig extends object = {},\n> extends Column<T, TRuntimeConfig, TTypeConfig & { dialect: 'gel' }> {\n\tstatic override readonly [entityKind]: string = 'GelColumn';\n\n\tconstructor(\n\t\toverride readonly table: GelTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tif (!config.uniqueName) {\n\t\t\tconfig.uniqueName = uniqueKeyName(table, [config.name]);\n\t\t}\n\t\tsuper(table, config);\n\t}\n}\n\nexport type IndexedExtraConfigType = { order?: 'asc' | 'desc'; nulls?: 'first' | 'last'; opClass?: string };\n\nexport class GelExtraConfigColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n> extends GelColumn<T, IndexedExtraConfigType> {\n\tstatic override readonly [entityKind]: string = 'GelExtraConfigColumn';\n\n\toverride getSQLType(): string {\n\t\treturn this.getSQLType();\n\t}\n\n\tindexConfig: IndexedExtraConfigType = {\n\t\torder: this.config.order ?? 'asc',\n\t\tnulls: this.config.nulls ?? 'last',\n\t\topClass: this.config.opClass,\n\t};\n\tdefaultConfig: IndexedExtraConfigType = {\n\t\torder: 'asc',\n\t\tnulls: 'last',\n\t\topClass: undefined,\n\t};\n\n\tasc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'asc';\n\t\treturn this;\n\t}\n\n\tdesc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'desc';\n\t\treturn this;\n\t}\n\n\tnullsFirst(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'first';\n\t\treturn this;\n\t}\n\n\tnullsLast(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'last';\n\t\treturn this;\n\t}\n\n\t/**\n\t * ### PostgreSQL documentation quote\n\t *\n\t * > An operator class with optional parameters can be specified for each column of an index.\n\t * The operator class identifies the operators to be used by the index for that column.\n\t * For example, a B-tree index on four-byte integers would use the int4_ops class;\n\t * this operator class includes comparison functions for four-byte integers.\n\t * In practice the default operator class for the column's data type is usually sufficient.\n\t * The main point of having operator classes is that for some data types, there could be more than one meaningful ordering.\n\t * For example, we might want to sort a complex-number data type either by absolute value or by real part.\n\t * We could do this by defining two operator classes for the data type and then selecting the proper class when creating an index.\n\t * More information about operator classes check:\n\t *\n\t * ### Useful links\n\t * https://www.postgresql.org/docs/current/sql-createindex.html\n\t *\n\t * https://www.postgresql.org/docs/current/indexes-opclass.html\n\t *\n\t * https://www.postgresql.org/docs/current/xindex.html\n\t *\n\t * ### Additional types\n\t * If you have the `Gel_vector` extension installed in your database, you can use the\n\t * `vector_l2_ops`, `vector_ip_ops`, `vector_cosine_ops`, `vector_l1_ops`, `bit_hamming_ops`, `bit_jaccard_ops`, `halfvec_l2_ops`, `sparsevec_l2_ops` options, which are predefined types.\n\t *\n\t * **You can always specify any string you want in the operator class, in case Drizzle doesn't have it natively in its types**\n\t *\n\t * @param opClass\n\t * @returns\n\t */\n\top(opClass: GelIndexOpClass): Omit<this, 'op'> {\n\t\tthis.indexConfig.opClass = opClass;\n\t\treturn this;\n\t}\n}\n\nexport class IndexedColumn {\n\tstatic readonly [entityKind]: string = 'IndexedColumn';\n\tconstructor(\n\t\tname: string | undefined,\n\t\tkeyAsName: boolean,\n\t\ttype: string,\n\t\tindexConfig: IndexedExtraConfigType,\n\t) {\n\t\tthis.name = name;\n\t\tthis.keyAsName = keyAsName;\n\t\tthis.type = type;\n\t\tthis.indexConfig = indexConfig;\n\t}\n\n\tname: string | undefined;\n\tkeyAsName: boolean;\n\ttype: string;\n\tindexConfig: IndexedExtraConfigType;\n}\n\nexport type AnyGelColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = GelColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport type GelArrayColumnBuilderBaseConfig = ColumnBuilderBaseConfig<'array', 'GelArray'> & {\n\tsize: number | undefined;\n\tbaseBuilder: ColumnBuilderBaseConfig<ColumnDataType, string>;\n};\n\nexport class GelArrayBuilder<\n\tT extends GelArrayColumnBuilderBaseConfig,\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string> | GelArrayColumnBuilderBaseConfig,\n> extends GelColumnBuilder<\n\tT,\n\t{\n\t\tbaseBuilder: TBase extends GelArrayColumnBuilderBaseConfig ? GelArrayBuilder<\n\t\t\t\tTBase,\n\t\t\t\tTBase extends { baseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any, any> } ? TBaseBuilder\n\t\t\t\t\t: never\n\t\t\t>\n\t\t\t: GelColumnBuilder<TBase, {}, Simplify<Omit<TBase, keyof ColumnBuilderBaseConfig<any, any>>>>;\n\t\tsize: T['size'];\n\t},\n\t{\n\t\tbaseBuilder: TBase extends GelArrayColumnBuilderBaseConfig ? GelArrayBuilder<\n\t\t\t\tTBase,\n\t\t\t\tTBase extends { baseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any, any> } ? TBaseBuilder\n\t\t\t\t\t: never\n\t\t\t>\n\t\t\t: GelColumnBuilder<TBase, {}, Simplify<Omit<TBase, keyof ColumnBuilderBaseConfig<any, any>>>>;\n\t\tsize: T['size'];\n\t}\n> {\n\tstatic override readonly [entityKind] = 'GelArrayBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tbaseBuilder: GelArrayBuilder<T, TBase>['config']['baseBuilder'],\n\t\tsize: T['size'],\n\t) {\n\t\tsuper(name, 'array', 'GelArray');\n\t\tthis.config.baseBuilder = baseBuilder;\n\t\tthis.config.size = size;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelArray<MakeColumnConfig<T, TTableName> & { size: T['size']; baseBuilder: T['baseBuilder'] }, TBase> {\n\t\tconst baseColumn = this.config.baseBuilder.build(table);\n\t\treturn new GelArray<MakeColumnConfig<T, TTableName> & { size: T['size']; baseBuilder: T['baseBuilder'] }, TBase>(\n\t\t\ttable as AnyGelTable<{ name: MakeColumnConfig<T, TTableName>['tableName'] }>,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t\tbaseColumn,\n\t\t);\n\t}\n}\n\nexport class GelArray<\n\tT extends ColumnBaseConfig<'array', 'GelArray'> & {\n\t\tsize: number | undefined;\n\t\tbaseBuilder: ColumnBuilderBaseConfig<ColumnDataType, string>;\n\t},\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n> extends GelColumn<T, {}, { size: T['size']; baseBuilder: T['baseBuilder'] }> {\n\treadonly size: T['size'];\n\n\tstatic override readonly [entityKind]: string = 'GelArray';\n\n\tconstructor(\n\t\ttable: AnyGelTable<{ name: T['tableName'] }>,\n\t\tconfig: GelArrayBuilder<T, TBase>['config'],\n\t\treadonly baseColumn: GelColumn,\n\t\treadonly range?: [number | undefined, number | undefined],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.size = config.size;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `${this.baseColumn.getSQLType()}[${typeof this.size === 'number' ? this.size : ''}]`;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/custom.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { GelColumn, GelColumnBuilder } from './common.ts';\n\nexport type ConvertCustomConfig<TName extends string, T extends Partial<CustomTypeValues>> =\n\t& {\n\t\tname: TName;\n\t\tdataType: 'custom';\n\t\tcolumnType: 'GelCustomColumn';\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverData'];\n\t\tenumValues: undefined;\n\t}\n\t& (T['notNull'] extends true ? { notNull: true } : {})\n\t& (T['default'] extends true ? { hasDefault: true } : {});\n\nexport interface GelCustomColumnInnerConfig {\n\tcustomTypeValues: CustomTypeValues;\n}\n\nexport class GelCustomColumnBuilder<T extends ColumnBuilderBaseConfig<'custom', 'GelCustomColumn'>>\n\textends GelColumnBuilder<\n\t\tT,\n\t\t{\n\t\t\tfieldConfig: CustomTypeValues['config'];\n\t\t\tcustomTypeParams: CustomTypeParams<any>;\n\t\t},\n\t\t{\n\t\t\tgelColumnBuilderBrand: 'GelCustomColumnBuilderBrand';\n\t\t}\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'GelCustomColumnBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\tfieldConfig: CustomTypeValues['config'],\n\t\tcustomTypeParams: CustomTypeParams<any>,\n\t) {\n\t\tsuper(name, 'custom', 'GelCustomColumn');\n\t\tthis.config.fieldConfig = fieldConfig;\n\t\tthis.config.customTypeParams = customTypeParams;\n\t}\n\n\t/** @internal */\n\tbuild<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelCustomColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelCustomColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class GelCustomColumn<T extends ColumnBaseConfig<'custom', 'GelCustomColumn'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelCustomColumn';\n\n\tprivate sqlName: string;\n\tprivate mapTo?: (value: T['data']) => T['driverParam'];\n\tprivate mapFrom?: (value: T['driverParam']) => T['data'];\n\n\tconstructor(\n\t\ttable: AnyGelTable<{ name: T['tableName'] }>,\n\t\tconfig: GelCustomColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.sqlName = config.customTypeParams.dataType(config.fieldConfig);\n\t\tthis.mapTo = config.customTypeParams.toDriver;\n\t\tthis.mapFrom = config.customTypeParams.fromDriver;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.sqlName;\n\t}\n\n\toverride mapFromDriverValue(value: T['driverParam']): T['data'] {\n\t\treturn typeof this.mapFrom === 'function' ? this.mapFrom(value) : value as T['data'];\n\t}\n\n\toverride mapToDriverValue(value: T['data']): T['driverParam'] {\n\t\treturn typeof this.mapTo === 'function' ? this.mapTo(value) : value as T['data'];\n\t}\n}\n\nexport type CustomTypeValues = {\n\t/**\n\t * Required type for custom column, that will infer proper type model\n\t *\n\t * Examples:\n\t *\n\t * If you want your column to be `string` type after selecting/or on inserting - use `data: string`. Like `text`, `varchar`\n\t *\n\t * If you want your column to be `number` type after selecting/or on inserting - use `data: number`. Like `integer`\n\t */\n\tdata: unknown;\n\n\t/**\n\t * Type helper, that represents what type database driver is accepting for specific database data type\n\t */\n\tdriverData?: unknown;\n\n\t/**\n\t * What config type should be used for {@link CustomTypeParams} `dataType` generation\n\t */\n\tconfig?: Record<string, any>;\n\n\t/**\n\t * Whether the config argument should be required or not\n\t * @default false\n\t */\n\tconfigRequired?: boolean;\n\n\t/**\n\t * If your custom data type should be notNull by default you can use `notNull: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t  dataType() {\n\t * \t    return 'serial';\n\t *    },\n\t * });\n\t */\n\tnotNull?: boolean;\n\n\t/**\n\t * If your custom data type has default you can use `default: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t  dataType() {\n\t * \t    return 'serial';\n\t *    },\n\t * });\n\t */\n\tdefault?: boolean;\n};\n\nexport interface CustomTypeParams<T extends CustomTypeValues> {\n\t/**\n\t * Database data type string representation, that is used for migrations\n\t * @example\n\t * ```\n\t * `jsonb`, `text`\n\t * ```\n\t *\n\t * If database data type needs additional params you can use them from `config` param\n\t * @example\n\t * ```\n\t * `varchar(256)`, `numeric(2,3)`\n\t * ```\n\t *\n\t * To make `config` be of specific type please use config generic in {@link CustomTypeValues}\n\t *\n\t * @example\n\t * Usage example\n\t * ```\n\t *   dataType() {\n\t *     return 'boolean';\n\t *   },\n\t * ```\n\t * Or\n\t * ```\n\t *   dataType(config) {\n\t * \t   return typeof config.length !== 'undefined' ? `varchar(${config.length})` : `varchar`;\n\t * \t }\n\t * ```\n\t */\n\tdataType: (config: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined)) => string;\n\n\t/**\n\t * Optional mapping function, between user input and driver\n\t * @example\n\t * For example, when using jsonb we need to map JS/TS object to string before writing to database\n\t * ```\n\t * toDriver(value: TData): string {\n\t * \t return JSON.stringify(value);\n\t * }\n\t * ```\n\t */\n\ttoDriver?: (value: T['data']) => T['driverData'] | SQL;\n\n\t/**\n\t * Optional mapping function, that is responsible for data mapping from database to JS/TS code\n\t * @example\n\t * For example, when using timestamp we need to map string Date representation to JS Date\n\t * ```\n\t * fromDriver(value: string): Date {\n\t * \treturn new Date(value);\n\t * },\n\t * ```\n\t */\n\tfromDriver?: (value: T['driverData']) => T['data'];\n}\n\n/**\n * Custom gel database data type generator\n */\nexport function customType<T extends CustomTypeValues = CustomTypeValues>(\n\tcustomTypeParams: CustomTypeParams<T>,\n): Equal<T['configRequired'], true> extends true ? {\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig: TConfig,\n\t\t): GelCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig: T['config'],\n\t\t): GelCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n\t: {\n\t\t(): GelCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig?: TConfig,\n\t\t): GelCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig?: T['config'],\n\t\t): GelCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n{\n\treturn <TName extends string>(\n\t\ta?: TName | T['config'],\n\t\tb?: T['config'],\n\t): GelCustomColumnBuilder<ConvertCustomConfig<TName, T>> => {\n\t\tconst { name, config } = getColumnNameAndConfig<T['config']>(a, b);\n\t\treturn new GelCustomColumnBuilder(name as ConvertCustomConfig<TName, T>['name'], config, customTypeParams);\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/date-duration.ts",
    "content": "import type { DateDuration } from 'gel';\nimport type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn, GelColumnBuilder } from './common.ts';\n\nexport type GelDateDurationBuilderInitial<TName extends string> = GelDateDurationBuilder<{\n\tname: TName;\n\tdataType: 'dateDuration';\n\tcolumnType: 'GelDateDuration';\n\tdata: DateDuration;\n\tdriverParam: DateDuration;\n\tenumValues: undefined;\n}>;\n\nexport class GelDateDurationBuilder<T extends ColumnBuilderBaseConfig<'dateDuration', 'GelDateDuration'>>\n\textends GelColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'GelDateDurationBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t) {\n\t\tsuper(name, 'dateDuration', 'GelDateDuration');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelDateDuration<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelDateDuration<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class GelDateDuration<T extends ColumnBaseConfig<'dateDuration', 'GelDateDuration'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelDateDuration';\n\n\tgetSQLType(): string {\n\t\treturn `dateDuration`;\n\t}\n}\n\nexport function dateDuration(): GelDateDurationBuilderInitial<''>;\nexport function dateDuration<TName extends string>(name: TName): GelDateDurationBuilderInitial<TName>;\nexport function dateDuration(name?: string) {\n\treturn new GelDateDurationBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/date.common.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnDataType } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { GelColumnBuilder } from './common.ts';\n\nexport abstract class GelLocalDateColumnBaseBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n> extends GelColumnBuilder<T, TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'GelLocalDateColumnBaseBuilder';\n\n\tdefaultNow() {\n\t\treturn this.default(sql`now()`);\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/decimal.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn, GelColumnBuilder } from './common.ts';\n\nexport type GelDecimalBuilderInitial<TName extends string> = GelDecimalBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'GelDecimal';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class GelDecimalBuilder<T extends ColumnBuilderBaseConfig<'string', 'GelDecimal'>> extends GelColumnBuilder<\n\tT\n> {\n\tstatic override readonly [entityKind]: string = 'GelDecimalBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'GelDecimal');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelDecimal<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelDecimal<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class GelDecimal<T extends ColumnBaseConfig<'string', 'GelDecimal'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelDecimal';\n\n\tconstructor(table: AnyGelTable<{ name: T['tableName'] }>, config: GelDecimalBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'numeric';\n\t}\n}\n\nexport function decimal(): GelDecimalBuilderInitial<''>;\nexport function decimal<TName extends string>(name: TName): GelDecimalBuilderInitial<TName>;\nexport function decimal(name?: string) {\n\treturn new GelDecimalBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/double-precision.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn, GelColumnBuilder } from './common.ts';\n\nexport type GelDoublePrecisionBuilderInitial<TName extends string> = GelDoublePrecisionBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'GelDoublePrecision';\n\tdata: number;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class GelDoublePrecisionBuilder<T extends ColumnBuilderBaseConfig<'number', 'GelDoublePrecision'>>\n\textends GelColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'GelDoublePrecisionBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'GelDoublePrecision');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelDoublePrecision<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelDoublePrecision<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class GelDoublePrecision<T extends ColumnBaseConfig<'number', 'GelDoublePrecision'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelDoublePrecision';\n\n\tgetSQLType(): string {\n\t\treturn 'double precision';\n\t}\n\n\toverride mapFromDriverValue(value: string | number): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number.parseFloat(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function doublePrecision(): GelDoublePrecisionBuilderInitial<''>;\nexport function doublePrecision<TName extends string>(name: TName): GelDoublePrecisionBuilderInitial<TName>;\nexport function doublePrecision(name?: string) {\n\treturn new GelDoublePrecisionBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/duration.ts",
    "content": "import type { Duration } from 'gel';\nimport type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn, GelColumnBuilder } from './common.ts';\n\nexport type GelDurationBuilderInitial<TName extends string> = GelDurationBuilder<{\n\tname: TName;\n\tdataType: 'duration';\n\tcolumnType: 'GelDuration';\n\tdata: Duration;\n\tdriverParam: Duration;\n\tenumValues: undefined;\n}>;\n\nexport class GelDurationBuilder<T extends ColumnBuilderBaseConfig<'duration', 'GelDuration'>>\n\textends GelColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'GelDurationBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t) {\n\t\tsuper(name, 'duration', 'GelDuration');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelDuration<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelDuration<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class GelDuration<T extends ColumnBaseConfig<'duration', 'GelDuration'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelDuration';\n\n\tgetSQLType(): string {\n\t\treturn `duration`;\n\t}\n}\n\nexport function duration(): GelDurationBuilderInitial<''>;\nexport function duration<TName extends string>(name: TName): GelDurationBuilderInitial<TName>;\nexport function duration(name?: string) {\n\treturn new GelDurationBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/index.ts",
    "content": "export * from './bigint.ts';\nexport * from './bigintT.ts';\nexport * from './boolean.ts';\nexport * from './bytes.ts';\nexport * from './common.ts';\nexport * from './custom.ts';\nexport * from './date-duration.ts';\nexport * from './decimal.ts';\nexport * from './double-precision.ts';\nexport * from './duration.ts';\nexport * from './int.common.ts';\nexport * from './integer.ts';\nexport * from './json.ts';\nexport * from './localdate.ts';\nexport * from './localtime.ts';\nexport * from './real.ts';\nexport * from './relative-duration.ts';\nexport * from './smallint.ts';\nexport * from './text.ts';\nexport * from './timestamp.ts';\nexport * from './timestamptz.ts';\nexport * from './uuid.ts';\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/int.common.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnDataType, GeneratedIdentityConfig, IsIdentity } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { GelSequenceOptions } from '../sequence.ts';\nimport { GelColumnBuilder } from './common.ts';\n\nexport abstract class GelIntColumnBaseBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n> extends GelColumnBuilder<\n\tT,\n\t{ generatedIdentity: GeneratedIdentityConfig }\n> {\n\tstatic override readonly [entityKind]: string = 'GelIntColumnBaseBuilder';\n\n\tgeneratedAlwaysAsIdentity(\n\t\tsequence?: GelSequenceOptions & { name?: string },\n\t): IsIdentity<this, 'always'> {\n\t\tif (sequence) {\n\t\t\tconst { name, ...options } = sequence;\n\t\t\tthis.config.generatedIdentity = {\n\t\t\t\ttype: 'always',\n\t\t\t\tsequenceName: name,\n\t\t\t\tsequenceOptions: options,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.config.generatedIdentity = {\n\t\t\t\ttype: 'always',\n\t\t\t};\n\t\t}\n\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\n\t\treturn this as IsIdentity<this, 'always'>;\n\t}\n\n\tgeneratedByDefaultAsIdentity(\n\t\tsequence?: GelSequenceOptions & { name?: string },\n\t): IsIdentity<this, 'byDefault'> {\n\t\tif (sequence) {\n\t\t\tconst { name, ...options } = sequence;\n\t\t\tthis.config.generatedIdentity = {\n\t\t\t\ttype: 'byDefault',\n\t\t\t\tsequenceName: name,\n\t\t\t\tsequenceOptions: options,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.config.generatedIdentity = {\n\t\t\t\ttype: 'byDefault',\n\t\t\t};\n\t\t}\n\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\n\t\treturn this as IsIdentity<this, 'byDefault'>;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/integer.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '../table.ts';\nimport { GelColumn } from './common.ts';\nimport { GelIntColumnBaseBuilder } from './int.common.ts';\n\nexport type GelIntegerBuilderInitial<TName extends string> = GelIntegerBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'GelInteger';\n\tdata: number;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class GelIntegerBuilder<T extends ColumnBuilderBaseConfig<'number', 'GelInteger'>>\n\textends GelIntColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'GelIntegerBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'GelInteger');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelInteger<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelInteger<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class GelInteger<T extends ColumnBaseConfig<'number', 'GelInteger'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelInteger';\n\n\tgetSQLType(): string {\n\t\treturn 'integer';\n\t}\n}\n\nexport function integer(): GelIntegerBuilderInitial<''>;\nexport function integer<TName extends string>(name: TName): GelIntegerBuilderInitial<TName>;\nexport function integer(name?: string) {\n\treturn new GelIntegerBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/json.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn, GelColumnBuilder } from './common.ts';\n\nexport type GelJsonBuilderInitial<TName extends string> = GelJsonBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'GelJson';\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: undefined;\n}>;\n\nexport class GelJsonBuilder<T extends ColumnBuilderBaseConfig<'json', 'GelJson'>> extends GelColumnBuilder<\n\tT\n> {\n\tstatic override readonly [entityKind]: string = 'GelJsonBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'GelJson');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelJson<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelJson<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class GelJson<T extends ColumnBaseConfig<'json', 'GelJson'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelJson';\n\n\tconstructor(table: AnyGelTable<{ name: T['tableName'] }>, config: GelJsonBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'json';\n\t}\n}\n\nexport function json(): GelJsonBuilderInitial<''>;\nexport function json<TName extends string>(name: TName): GelJsonBuilderInitial<TName>;\nexport function json(name?: string) {\n\treturn new GelJsonBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/localdate.ts",
    "content": "import type { LocalDate } from 'gel';\nimport type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn } from './common.ts';\nimport { GelLocalDateColumnBaseBuilder } from './date.common.ts';\n\nexport type GelLocalDateStringBuilderInitial<TName extends string> = GelLocalDateStringBuilder<{\n\tname: TName;\n\tdataType: 'localDate';\n\tcolumnType: 'GelLocalDateString';\n\tdata: LocalDate;\n\tdriverParam: LocalDate;\n\tenumValues: undefined;\n}>;\n\nexport class GelLocalDateStringBuilder<T extends ColumnBuilderBaseConfig<'localDate', 'GelLocalDateString'>>\n\textends GelLocalDateColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'GelLocalDateStringBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'localDate', 'GelLocalDateString');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelLocalDateString<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelLocalDateString<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class GelLocalDateString<T extends ColumnBaseConfig<'localDate', 'GelLocalDateString'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelLocalDateString';\n\n\tgetSQLType(): string {\n\t\treturn 'cal::local_date';\n\t}\n}\n\nexport function localDate(): GelLocalDateStringBuilderInitial<''>;\nexport function localDate<TName extends string>(name: TName): GelLocalDateStringBuilderInitial<TName>;\nexport function localDate(name?: string) {\n\treturn new GelLocalDateStringBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/localtime.ts",
    "content": "import type { LocalTime } from 'gel';\nimport type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn } from './common.ts';\nimport { GelLocalDateColumnBaseBuilder } from './date.common.ts';\n\nexport type GelLocalTimeBuilderInitial<TName extends string> = GelLocalTimeBuilder<{\n\tname: TName;\n\tdataType: 'localTime';\n\tcolumnType: 'GelLocalTime';\n\tdata: LocalTime;\n\tdriverParam: LocalTime;\n\tenumValues: undefined;\n}>;\n\nexport class GelLocalTimeBuilder<T extends ColumnBuilderBaseConfig<'localTime', 'GelLocalTime'>>\n\textends GelLocalDateColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'GelLocalTimeBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'localTime', 'GelLocalTime');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelLocalTime<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelLocalTime<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class GelLocalTime<T extends ColumnBaseConfig<'localTime', 'GelLocalTime'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelLocalTime';\n\n\tgetSQLType(): string {\n\t\treturn 'cal::local_time';\n\t}\n}\n\nexport function localTime(): GelLocalTimeBuilderInitial<''>;\nexport function localTime<TName extends string>(name: TName): GelLocalTimeBuilderInitial<TName>;\nexport function localTime(name?: string) {\n\treturn new GelLocalTimeBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/real.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn, GelColumnBuilder } from './common.ts';\n\nexport type GelRealBuilderInitial<TName extends string> = GelRealBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'GelReal';\n\tdata: number;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class GelRealBuilder<T extends ColumnBuilderBaseConfig<'number', 'GelReal'>> extends GelColumnBuilder<\n\tT,\n\t{ length: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'GelRealBuilder';\n\n\tconstructor(name: T['name'], length?: number) {\n\t\tsuper(name, 'number', 'GelReal');\n\t\tthis.config.length = length;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelReal<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelReal<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class GelReal<T extends ColumnBaseConfig<'number', 'GelReal'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelReal';\n\n\tconstructor(table: AnyGelTable<{ name: T['tableName'] }>, config: GelRealBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'real';\n\t}\n}\n\nexport function real(): GelRealBuilderInitial<''>;\nexport function real<TName extends string>(name: TName): GelRealBuilderInitial<TName>;\nexport function real(name?: string) {\n\treturn new GelRealBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/relative-duration.ts",
    "content": "import type { RelativeDuration } from 'gel';\nimport type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn, GelColumnBuilder } from './common.ts';\n\nexport type GelRelDurationBuilderInitial<TName extends string> = GelRelDurationBuilder<{\n\tname: TName;\n\tdataType: 'relDuration';\n\tcolumnType: 'GelRelDuration';\n\tdata: RelativeDuration;\n\tdriverParam: RelativeDuration;\n\tenumValues: undefined;\n}>;\n\nexport class GelRelDurationBuilder<T extends ColumnBuilderBaseConfig<'relDuration', 'GelRelDuration'>>\n\textends GelColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'GelRelDurationBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t) {\n\t\tsuper(name, 'relDuration', 'GelRelDuration');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelRelDuration<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelRelDuration<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class GelRelDuration<T extends ColumnBaseConfig<'relDuration', 'GelRelDuration'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelRelDuration';\n\n\tgetSQLType(): string {\n\t\treturn `edgedbt.relative_duration_t`;\n\t}\n}\n\nexport function relDuration(): GelRelDurationBuilderInitial<''>;\nexport function relDuration<TName extends string>(name: TName): GelRelDurationBuilderInitial<TName>;\nexport function relDuration(name?: string) {\n\treturn new GelRelDurationBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/smallint.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn } from './common.ts';\nimport { GelIntColumnBaseBuilder } from './int.common.ts';\n\nexport type GelSmallIntBuilderInitial<TName extends string> = GelSmallIntBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'GelSmallInt';\n\tdata: number;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class GelSmallIntBuilder<T extends ColumnBuilderBaseConfig<'number', 'GelSmallInt'>>\n\textends GelIntColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'GelSmallIntBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'GelSmallInt');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelSmallInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelSmallInt<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class GelSmallInt<T extends ColumnBaseConfig<'number', 'GelSmallInt'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelSmallInt';\n\n\tgetSQLType(): string {\n\t\treturn 'smallint';\n\t}\n}\n\nexport function smallint(): GelSmallIntBuilderInitial<''>;\nexport function smallint<TName extends string>(name: TName): GelSmallIntBuilderInitial<TName>;\nexport function smallint(name?: string) {\n\treturn new GelSmallIntBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/text.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn, GelColumnBuilder } from './common.ts';\n\ntype GelTextBuilderInitial<TName extends string> = GelTextBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'GelText';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class GelTextBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'GelText'>,\n> extends GelColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'GelTextBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t) {\n\t\tsuper(name, 'string', 'GelText');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelText<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelText<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class GelText<T extends ColumnBaseConfig<'string', 'GelText'>>\n\textends GelColumn<T, { enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'GelText';\n\n\toverride readonly enumValues = this.config.enumValues;\n\n\tgetSQLType(): string {\n\t\treturn 'text';\n\t}\n}\n\nexport function text(): GelTextBuilderInitial<''>;\nexport function text<TName extends string>(name: TName): GelTextBuilderInitial<TName>;\nexport function text(name?: string): any {\n\treturn new GelTextBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/timestamp.ts",
    "content": "import type { LocalDateTime } from 'gel';\nimport type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn } from './common.ts';\nimport { GelLocalDateColumnBaseBuilder } from './date.common.ts';\n\nexport type GelTimestampBuilderInitial<TName extends string> = GelTimestampBuilder<{\n\tname: TName;\n\tdataType: 'localDateTime';\n\tcolumnType: 'GelTimestamp';\n\tdata: LocalDateTime;\n\tdriverParam: LocalDateTime;\n\tenumValues: undefined;\n}>;\n\nexport class GelTimestampBuilder<T extends ColumnBuilderBaseConfig<'localDateTime', 'GelTimestamp'>>\n\textends GelLocalDateColumnBaseBuilder<\n\t\tT\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'GelTimestampBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t) {\n\t\tsuper(name, 'localDateTime', 'GelTimestamp');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelTimestamp<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelTimestamp<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class GelTimestamp<T extends ColumnBaseConfig<'localDateTime', 'GelTimestamp'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelTimestamp';\n\n\tconstructor(table: AnyGelTable<{ name: T['tableName'] }>, config: GelTimestampBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'cal::local_datetime';\n\t}\n}\n\nexport function timestamp(): GelTimestampBuilderInitial<''>;\nexport function timestamp<TName extends string>(\n\tname: TName,\n): GelTimestampBuilderInitial<TName>;\nexport function timestamp(name?: string) {\n\treturn new GelTimestampBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/timestamptz.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn } from './common.ts';\nimport { GelLocalDateColumnBaseBuilder } from './date.common.ts';\n\nexport type GelTimestampTzBuilderInitial<TName extends string> = GelTimestampTzBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'GelTimestampTz';\n\tdata: Date;\n\tdriverParam: Date;\n\tenumValues: undefined;\n}>;\n\nexport class GelTimestampTzBuilder<T extends ColumnBuilderBaseConfig<'date', 'GelTimestampTz'>>\n\textends GelLocalDateColumnBaseBuilder<\n\t\tT\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'GelTimestampTzBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t) {\n\t\tsuper(name, 'date', 'GelTimestampTz');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelTimestampTz<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelTimestampTz<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class GelTimestampTz<T extends ColumnBaseConfig<'date', 'GelTimestampTz'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelTimestampTz';\n\n\tconstructor(table: AnyGelTable<{ name: T['tableName'] }>, config: GelTimestampTzBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'datetime';\n\t}\n}\n\nexport function timestamptz(): GelTimestampTzBuilderInitial<''>;\nexport function timestamptz<TName extends string>(\n\tname: TName,\n): GelTimestampTzBuilderInitial<TName>;\nexport function timestamptz(name?: string) {\n\treturn new GelTimestampTzBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/columns/uuid.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyGelTable } from '~/gel-core/table.ts';\nimport { GelColumn, GelColumnBuilder } from './common.ts';\n\nexport type GelUUIDBuilderInitial<TName extends string> = GelUUIDBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'GelUUID';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class GelUUIDBuilder<T extends ColumnBuilderBaseConfig<'string', 'GelUUID'>> extends GelColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'GelUUIDBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'GelUUID');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyGelTable<{ name: TTableName }>,\n\t): GelUUID<MakeColumnConfig<T, TTableName>> {\n\t\treturn new GelUUID<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class GelUUID<T extends ColumnBaseConfig<'string', 'GelUUID'>> extends GelColumn<T> {\n\tstatic override readonly [entityKind]: string = 'GelUUID';\n\n\tgetSQLType(): string {\n\t\treturn 'uuid';\n\t}\n}\n\nexport function uuid(): GelUUIDBuilderInitial<''>;\nexport function uuid<TName extends string>(name: TName): GelUUIDBuilderInitial<TName>;\nexport function uuid(name?: string) {\n\treturn new GelUUIDBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/db.ts",
    "content": "import type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { GelDialect } from '~/gel-core/dialect.ts';\nimport {\n\tGelDeleteBase,\n\tGelInsertBuilder,\n\tGelSelectBuilder,\n\tGelUpdateBuilder,\n\tQueryBuilder,\n} from '~/gel-core/query-builders/index.ts';\nimport type { GelQueryResultHKT, GelSession, GelTransaction, PreparedQueryConfig } from '~/gel-core/session.ts';\nimport type { GelTable } from '~/gel-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { type ColumnsSelection, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { DrizzleTypeError } from '~/utils.ts';\nimport type { GelColumn } from './columns/index.ts';\nimport { GelCountBuilder } from './query-builders/count.ts';\nimport { RelationalQueryBuilder } from './query-builders/query.ts';\nimport { GelRaw } from './query-builders/raw.ts';\nimport type { SelectedFields } from './query-builders/select.types.ts';\nimport type { WithSubqueryWithSelection } from './subquery.ts';\nimport type { GelViewBase } from './view-base.ts';\n\nexport class GelDatabase<\n\tTQueryResult extends GelQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = ExtractTablesWithRelations<TFullSchema>,\n> {\n\tstatic readonly [entityKind]: string = 'GelDatabase';\n\n\tdeclare readonly _: {\n\t\treadonly schema: TSchema | undefined;\n\t\treadonly fullSchema: TFullSchema;\n\t\treadonly tableNamesMap: Record<string, string>;\n\t\treadonly session: GelSession<TQueryResult, TFullSchema, TSchema>;\n\t};\n\n\tquery: TFullSchema extends Record<string, never>\n\t\t? DrizzleTypeError<'Seems like the schema generic is missing - did you forget to add it to your DB type?'>\n\t\t: {\n\t\t\t[K in keyof TSchema]: RelationalQueryBuilder<TSchema, TSchema[K]>;\n\t\t};\n\n\tconstructor(\n\t\t/** @internal */\n\t\treadonly dialect: GelDialect,\n\t\t/** @internal */\n\t\treadonly session: GelSession<any, any, any>,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t) {\n\t\tthis._ = schema\n\t\t\t? {\n\t\t\t\tschema: schema.schema,\n\t\t\t\tfullSchema: schema.fullSchema as TFullSchema,\n\t\t\t\ttableNamesMap: schema.tableNamesMap,\n\t\t\t\tsession,\n\t\t\t}\n\t\t\t: {\n\t\t\t\tschema: undefined,\n\t\t\t\tfullSchema: {} as TFullSchema,\n\t\t\t\ttableNamesMap: {},\n\t\t\t\tsession,\n\t\t\t};\n\t\tthis.query = {} as typeof this['query'];\n\t\tif (this._.schema) {\n\t\t\tfor (const [tableName, columns] of Object.entries(this._.schema)) {\n\t\t\t\t(this.query as GelDatabase<TQueryResult, Record<string, any>>['query'])[tableName] = new RelationalQueryBuilder(\n\t\t\t\t\tschema!.fullSchema,\n\t\t\t\t\tthis._.schema,\n\t\t\t\t\tthis._.tableNamesMap,\n\t\t\t\t\tschema!.fullSchema[tableName] as GelTable,\n\t\t\t\t\tcolumns,\n\t\t\t\t\tdialect,\n\t\t\t\t\tsession,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.$cache = { invalidate: async (_params: any) => {} };\n\t}\n\n\t/**\n\t * Creates a subquery that defines a temporary named result set as a CTE.\n\t *\n\t * It is useful for breaking down complex queries into simpler parts and for reusing the result set in subsequent parts of the query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param alias The alias for the subquery.\n\t *\n\t * Failure to provide an alias will result in a DrizzleTypeError, preventing the subquery from being referenced in other queries.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Create a subquery with alias 'sq' and use it in the select query\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t *\n\t * To select arbitrary SQL values as fields in a CTE and reference them in other CTEs or in the main query, you need to add aliases to them:\n\t *\n\t * ```ts\n\t * // Select an arbitrary SQL value as a field in a CTE and reference it in the main query\n\t * const sq = db.$with('sq').as(db.select({\n\t *   name: sql<string>`upper(${users.name})`.as('name'),\n\t * })\n\t * .from(users));\n\t *\n\t * const result = await db.with(sq).select({ name: sq.name }).from(sq);\n\t * ```\n\t */\n\t$with<TAlias extends string>(alias: TAlias) {\n\t\tconst self = this;\n\t\treturn {\n\t\t\tas<TSelection extends ColumnsSelection>(\n\t\t\t\tqb: TypedQueryBuilder<TSelection> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelection>),\n\t\t\t): WithSubqueryWithSelection<TSelection, TAlias> {\n\t\t\t\tif (typeof qb === 'function') {\n\t\t\t\t\tqb = qb(new QueryBuilder(self.dialect));\n\t\t\t\t}\n\n\t\t\t\treturn new Proxy(\n\t\t\t\t\tnew WithSubquery(qb.getSQL(), qb.getSelectedFields() as SelectedFields, alias, true),\n\t\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t\t) as WithSubqueryWithSelection<TSelection, TAlias>;\n\t\t\t},\n\t\t};\n\t}\n\n\t$count(\n\t\tsource: GelTable | GelViewBase | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t) {\n\t\treturn new GelCountBuilder({ source, filters, session: this.session });\n\t}\n\n\t/**\n\t * Incorporates a previously defined CTE (using `$with`) into the main query.\n\t *\n\t * This method allows the main query to reference a temporary named result set.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param queries The CTEs to incorporate into the main query.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Define a subquery 'sq' as a CTE using $with\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * // Incorporate the CTE 'sq' into the main query and select from it\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t */\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\t/**\n\t\t * Creates a select query.\n\t\t *\n\t\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all columns and all rows from the 'cars' table\n\t\t * const allCars: Car[] = await db.select().from(cars);\n\t\t *\n\t\t * // Select specific columns and all rows from the 'cars' table\n\t\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t\t *   id: cars.id,\n\t\t *   brand: cars.brand\n\t\t * })\n\t\t *   .from(cars);\n\t\t * ```\n\t\t *\n\t\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t\t *\n\t\t * ```ts\n\t\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t\t *   id: cars.id,\n\t\t *   lowerBrand: sql<string>`lower(${cars.brand})`,\n\t\t * })\n\t\t *   .from(cars);\n\t\t * ```\n\t\t */\n\t\tfunction select(): GelSelectBuilder<undefined>;\n\t\tfunction select<TSelection extends SelectedFields>(fields: TSelection): GelSelectBuilder<TSelection>;\n\t\tfunction select(fields?: SelectedFields): GelSelectBuilder<SelectedFields | undefined> {\n\t\t\treturn new GelSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct` expression to the select query.\n\t\t *\n\t\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * // Select all unique rows from the 'cars' table\n\t\t * await db.selectDistinct()\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.id, cars.brand, cars.color);\n\t\t *\n\t\t * // Select all unique brands from the 'cars' table\n\t\t * await db.selectDistinct({ brand: cars.brand })\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.brand);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinct(): GelSelectBuilder<undefined>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(fields: TSelection): GelSelectBuilder<TSelection>;\n\t\tfunction selectDistinct(fields?: SelectedFields): GelSelectBuilder<SelectedFields | undefined> {\n\t\t\treturn new GelSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct on` expression to the select query.\n\t\t *\n\t\t * Calling this method will specify how the unique rows are determined.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param on The expression defining uniqueness.\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * // Select the first row for each unique brand from the 'cars' table\n\t\t * await db.selectDistinctOn([cars.brand])\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.brand);\n\t\t *\n\t\t * // Selects the first occurrence of each unique car brand along with its color from the 'cars' table\n\t\t * await db.selectDistinctOn([cars.brand], { brand: cars.brand, color: cars.color })\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.brand, cars.color);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinctOn(on: (GelColumn | SQLWrapper)[]): GelSelectBuilder<undefined>;\n\t\tfunction selectDistinctOn<TSelection extends SelectedFields>(\n\t\t\ton: (GelColumn | SQLWrapper)[],\n\t\t\tfields: TSelection,\n\t\t): GelSelectBuilder<TSelection>;\n\t\tfunction selectDistinctOn(\n\t\t\ton: (GelColumn | SQLWrapper)[],\n\t\t\tfields?: SelectedFields,\n\t\t): GelSelectBuilder<SelectedFields | undefined> {\n\t\t\treturn new GelSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: { on },\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Creates an update query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t\t *\n\t\t * Use `.set()` method to specify which values to update.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t\t *\n\t\t * @param table The table to update.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Update all rows in the 'cars' table\n\t\t * await db.update(cars).set({ color: 'red' });\n\t\t *\n\t\t * // Update rows with filters and conditions\n\t\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t\t *\n\t\t * // Update with returning clause\n\t\t * const updatedCar: Car[] = await db.update(cars)\n\t\t *   .set({ color: 'red' })\n\t\t *   .where(eq(cars.id, 1))\n\t\t *   .returning();\n\t\t * ```\n\t\t */\n\t\tfunction update<TTable extends GelTable>(table: TTable): GelUpdateBuilder<TTable, TQueryResult> {\n\t\t\treturn new GelUpdateBuilder(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates an insert query.\n\t\t *\n\t\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t\t *\n\t\t * @param table The table to insert into.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Insert one row\n\t\t * await db.insert(cars).values({ brand: 'BMW' });\n\t\t *\n\t\t * // Insert multiple rows\n\t\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t\t *\n\t\t * // Insert with returning clause\n\t\t * const insertedCar: Car[] = await db.insert(cars)\n\t\t *   .values({ brand: 'BMW' })\n\t\t *   .returning();\n\t\t * ```\n\t\t */\n\t\tfunction insert<TTable extends GelTable>(table: TTable): GelInsertBuilder<TTable, TQueryResult> {\n\t\t\treturn new GelInsertBuilder(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates a delete query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t\t *\n\t\t * @param table The table to delete from.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Delete all rows in the 'cars' table\n\t\t * await db.delete(cars);\n\t\t *\n\t\t * // Delete rows with filters and conditions\n\t\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t\t *\n\t\t * // Delete with returning clause\n\t\t * const deletedCar: Car[] = await db.delete(cars)\n\t\t *   .where(eq(cars.id, 1))\n\t\t *   .returning();\n\t\t * ```\n\t\t */\n\t\tfunction delete_<TTable extends GelTable>(table: TTable): GelDeleteBase<TTable, TQueryResult> {\n\t\t\treturn new GelDeleteBase(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\treturn { select, selectDistinct, selectDistinctOn, update, insert, delete: delete_ };\n\t}\n\n\t/**\n\t * Creates a select query.\n\t *\n\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all columns and all rows from the 'cars' table\n\t * const allCars: Car[] = await db.select().from(cars);\n\t *\n\t * // Select specific columns and all rows from the 'cars' table\n\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t *   id: cars.id,\n\t *   brand: cars.brand\n\t * })\n\t *   .from(cars);\n\t * ```\n\t *\n\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t *\n\t * ```ts\n\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t *   id: cars.id,\n\t *   lowerBrand: sql<string>`lower(${cars.brand})`,\n\t * })\n\t *   .from(cars);\n\t * ```\n\t */\n\tselect(): GelSelectBuilder<undefined>;\n\tselect<TSelection extends SelectedFields>(fields: TSelection): GelSelectBuilder<TSelection>;\n\tselect(fields?: SelectedFields): GelSelectBuilder<SelectedFields | undefined> {\n\t\treturn new GelSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t});\n\t}\n\n\t/**\n\t * Adds `distinct` expression to the select query.\n\t *\n\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t * ```ts\n\t * // Select all unique rows from the 'cars' table\n\t * await db.selectDistinct()\n\t *   .from(cars)\n\t *   .orderBy(cars.id, cars.brand, cars.color);\n\t *\n\t * // Select all unique brands from the 'cars' table\n\t * await db.selectDistinct({ brand: cars.brand })\n\t *   .from(cars)\n\t *   .orderBy(cars.brand);\n\t * ```\n\t */\n\tselectDistinct(): GelSelectBuilder<undefined>;\n\tselectDistinct<TSelection extends SelectedFields>(fields: TSelection): GelSelectBuilder<TSelection>;\n\tselectDistinct(fields?: SelectedFields): GelSelectBuilder<SelectedFields | undefined> {\n\t\treturn new GelSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t/**\n\t * Adds `distinct on` expression to the select query.\n\t *\n\t * Calling this method will specify how the unique rows are determined.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param on The expression defining uniqueness.\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t * ```ts\n\t * // Select the first row for each unique brand from the 'cars' table\n\t * await db.selectDistinctOn([cars.brand])\n\t *   .from(cars)\n\t *   .orderBy(cars.brand);\n\t *\n\t * // Selects the first occurrence of each unique car brand along with its color from the 'cars' table\n\t * await db.selectDistinctOn([cars.brand], { brand: cars.brand, color: cars.color })\n\t *   .from(cars)\n\t *   .orderBy(cars.brand, cars.color);\n\t * ```\n\t */\n\tselectDistinctOn(on: (GelColumn | SQLWrapper)[]): GelSelectBuilder<undefined>;\n\tselectDistinctOn<TSelection extends SelectedFields>(\n\t\ton: (GelColumn | SQLWrapper)[],\n\t\tfields: TSelection,\n\t): GelSelectBuilder<TSelection>;\n\tselectDistinctOn(\n\t\ton: (GelColumn | SQLWrapper)[],\n\t\tfields?: SelectedFields,\n\t): GelSelectBuilder<SelectedFields | undefined> {\n\t\treturn new GelSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: { on },\n\t\t});\n\t}\n\n\t$cache: { invalidate: Cache['onMutate'] };\n\n\t/**\n\t * Creates an update query.\n\t *\n\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t *\n\t * Use `.set()` method to specify which values to update.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param table The table to update.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Update all rows in the 'cars' table\n\t * await db.update(cars).set({ color: 'red' });\n\t *\n\t * // Update rows with filters and conditions\n\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t *\n\t * // Update with returning clause\n\t * const updatedCar: Car[] = await db.update(cars)\n\t *   .set({ color: 'red' })\n\t *   .where(eq(cars.id, 1))\n\t *   .returning();\n\t * ```\n\t */\n\tupdate<TTable extends GelTable>(table: TTable): GelUpdateBuilder<TTable, TQueryResult> {\n\t\treturn new GelUpdateBuilder(table, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates an insert query.\n\t *\n\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t *\n\t * @param table The table to insert into.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Insert one row\n\t * await db.insert(cars).values({ brand: 'BMW' });\n\t *\n\t * // Insert multiple rows\n\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t *\n\t * // Insert with returning clause\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t *   .values({ brand: 'BMW' })\n\t *   .returning();\n\t * ```\n\t */\n\tinsert<TTable extends GelTable>(table: TTable): GelInsertBuilder<TTable, TQueryResult> {\n\t\treturn new GelInsertBuilder(table, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates a delete query.\n\t *\n\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param table The table to delete from.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Delete all rows in the 'cars' table\n\t * await db.delete(cars);\n\t *\n\t * // Delete rows with filters and conditions\n\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t *\n\t * // Delete with returning clause\n\t * const deletedCar: Car[] = await db.delete(cars)\n\t *   .where(eq(cars.id, 1))\n\t *   .returning();\n\t * ```\n\t */\n\tdelete<TTable extends GelTable>(table: TTable): GelDeleteBase<TTable, TQueryResult> {\n\t\treturn new GelDeleteBase(table, this.session, this.dialect);\n\t}\n\n\t// TODO views are not implemented\n\t// refreshMaterializedView<TView extends GelMaterializedView>(view: TView): GelRefreshMaterializedView<TQueryResult> {\n\t// \treturn new GelRefreshMaterializedView(view, this.session, this.dialect);\n\t// }\n\n\texecute<TRow extends Record<string, unknown> = Record<string, unknown>>(\n\t\tquery: SQLWrapper | string,\n\t): GelRaw<TRow[]> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tconst builtQuery = this.dialect.sqlToQuery(sequel);\n\t\tconst prepared = this.session.prepareQuery<\n\t\t\tPreparedQueryConfig & { execute: TRow[] }\n\t\t>(\n\t\t\tbuiltQuery,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t);\n\t\treturn new GelRaw(\n\t\t\t() => prepared.execute(undefined),\n\t\t\tsequel,\n\t\t\tbuiltQuery,\n\t\t\t(result) => prepared.mapResult(result, true),\n\t\t);\n\t}\n\n\ttransaction<T>(\n\t\ttransaction: (tx: GelTransaction<TQueryResult, TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\treturn this.session.transaction(transaction);\n\t}\n}\n\nexport type GelWithReplicas<Q> = Q & { $primary: Q; $replicas: Q[] };\n\nexport const withReplicas = <\n\tHKT extends GelQueryResultHKT,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n\tQ extends GelDatabase<\n\t\tHKT,\n\t\tTFullSchema,\n\t\tTSchema extends Record<string, unknown> ? ExtractTablesWithRelations<TFullSchema> : TSchema\n\t>,\n>(\n\tprimary: Q,\n\treplicas: [Q, ...Q[]],\n\tgetReplica: (replicas: Q[]) => Q = () => replicas[Math.floor(Math.random() * replicas.length)]!,\n): GelWithReplicas<Q> => {\n\tconst select: Q['select'] = (...args: []) => getReplica(replicas).select(...args);\n\tconst selectDistinct: Q['selectDistinct'] = (...args: []) => getReplica(replicas).selectDistinct(...args);\n\tconst selectDistinctOn: Q['selectDistinctOn'] = (...args: [any]) => getReplica(replicas).selectDistinctOn(...args);\n\tconst _with: Q['with'] = (...args: any) => getReplica(replicas).with(...args);\n\tconst $with: Q['$with'] = (arg: any) => getReplica(replicas).$with(arg);\n\n\tconst update: Q['update'] = (...args: [any]) => primary.update(...args);\n\tconst insert: Q['insert'] = (...args: [any]) => primary.insert(...args);\n\tconst $delete: Q['delete'] = (...args: [any]) => primary.delete(...args);\n\tconst execute: Q['execute'] = (...args: [any]) => primary.execute(...args);\n\tconst transaction: Q['transaction'] = (...args: [any]) => primary.transaction(...args);\n\t// const refreshMaterializedView: Q['refreshMaterializedView'] = (...args: [any]) =>\n\t// \tprimary.refreshMaterializedView(...args);\n\n\treturn {\n\t\t...primary,\n\t\tupdate,\n\t\tinsert,\n\t\tdelete: $delete,\n\t\texecute,\n\t\ttransaction,\n\t\t// refreshMaterializedView,\n\t\t$primary: primary,\n\t\t$replicas: replicas,\n\t\tselect,\n\t\tselectDistinct,\n\t\tselectDistinctOn,\n\t\t$with,\n\t\twith: _with,\n\t\tget query() {\n\t\t\treturn getReplica(replicas).query;\n\t\t},\n\t};\n};\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/dialect.ts",
    "content": "import { aliasedTable, aliasedTableColumn, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport { GelColumn, GelDecimal, GelJson, GelUUID } from '~/gel-core/columns/index.ts';\nimport type {\n\tAnyGelSelectQueryBuilder,\n\tGelDeleteConfig,\n\tGelInsertConfig,\n\tGelSelectJoinConfig,\n\tGelUpdateConfig,\n} from '~/gel-core/query-builders/index.ts';\nimport type { GelSelectConfig, SelectedFieldsOrdered } from '~/gel-core/query-builders/select.types.ts';\nimport { GelTable } from '~/gel-core/table.ts';\nimport {\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tgetOperators,\n\tgetOrderByOperators,\n\tMany,\n\tnormalizeRelation,\n\tOne,\n\ttype Relation,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { and, eq, View } from '~/sql/index.ts';\nimport {\n\ttype DriverValueEncoder,\n\ttype Name,\n\tParam,\n\ttype QueryTypingsValue,\n\ttype QueryWithTypings,\n\tSQL,\n\tsql,\n\ttype SQLChunk,\n} from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table } from '~/table.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { GelTimestamp } from './columns/timestamp.ts';\nimport { GelViewBase } from './view-base.ts';\nimport type { GelMaterializedView } from './view.ts';\n\nexport interface GelDialectConfig {\n\tcasing?: Casing;\n}\n\nexport class GelDialect {\n\tstatic readonly [entityKind]: string = 'GelDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: GelDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\t}\n\n\t// TODO can not migrate gel with drizzle\n\t// async migrate(migrations: MigrationMeta[], session: GelSession, config: string | MigrationConfig): Promise<void> {\n\t// \tconst migrationsTable = typeof config === 'string'\n\t// \t\t? '__drizzle_migrations'\n\t// \t\t: config.migrationsTable ?? '__drizzle_migrations';\n\t// \tconst migrationsSchema = typeof config === 'string' ? 'drizzle' : config.migrationsSchema ?? 'drizzle';\n\t// \tconst migrationTableCreate = sql`\n\t// \t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} (\n\t// \t\t\tid SERIAL PRIMARY KEY,\n\t// \t\t\thash text NOT NULL,\n\t// \t\t\tcreated_at bigint\n\t// \t\t)\n\t// \t`;\n\t// \tawait session.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);\n\t// \tawait session.execute(migrationTableCreate);\n\n\t// \tconst dbMigrations = await session.all<{ id: number; hash: string; created_at: string }>(\n\t// \t\tsql`select id, hash, created_at from ${sql.identifier(migrationsSchema)}.${\n\t// \t\t\tsql.identifier(migrationsTable)\n\t// \t\t} order by created_at desc limit 1`,\n\t// \t);\n\n\t// \tconst lastDbMigration = dbMigrations[0];\n\t// \tawait session.transaction(async (tx) => {\n\t// \t\tfor await (const migration of migrations) {\n\t// \t\t\tif (\n\t// \t\t\t\t!lastDbMigration\n\t// \t\t\t\t|| Number(lastDbMigration.created_at) < migration.folderMillis\n\t// \t\t\t) {\n\t// \t\t\t\tfor (const stmt of migration.sql) {\n\t// \t\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t// \t\t\t\t}\n\t// \t\t\t\tawait tx.execute(\n\t// \t\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t// \t\t\t\t\t\tsql.identifier(migrationsTable)\n\t// \t\t\t\t\t} (\"hash\", \"created_at\") values(${migration.hash}, ${migration.folderMillis})`,\n\t// \t\t\t\t);\n\t// \t\t\t}\n\t// \t\t}\n\t// \t});\n\t// }\n\n\tescapeName(name: string): string {\n\t\treturn `\"${name}\"`;\n\t}\n\n\tescapeParam(num: number): string {\n\t\treturn `$${num + 1}`;\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({ table, where, returning, withList }: GelDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${returningSql}`;\n\t}\n\n\tbuildUpdateSet(table: GelTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter((colName) =>\n\t\t\tset[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined\n\t\t);\n\n\t\tconst setSize = columnNames.length;\n\t\treturn sql.join(columnNames.flatMap((colName, i) => {\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tconst onUpdateFnResult = col.onUpdateFn?.();\n\t\t\tconst value = set[colName] ?? (is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col));\n\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\tif (i < setSize - 1) {\n\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t}\n\t\t\treturn [res];\n\t\t}));\n\t}\n\n\tbuildUpdateQuery({ table, set, where, returning, withList, from, joins }: GelUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst tableName = table[GelTable.Symbol.Name];\n\t\tconst tableSchema = table[GelTable.Symbol.Schema];\n\t\tconst origTableName = table[GelTable.Symbol.OriginalName];\n\t\tconst alias = tableName === origTableName ? undefined : tableName;\n\t\tconst tableSql = sql`${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${\n\t\t\tsql.identifier(origTableName)\n\t\t}${alias && sql` ${sql.identifier(alias)}`}`;\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst fromSql = from && sql.join([sql.raw(' from '), this.buildFromTable(from)]);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: !from })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\treturn sql`${withSql}update ${tableSql} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t * ^ Temporarily disabled behaviour, see comments within method for a reasoning\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields\n\t\t\t.flatMap(({ field }, i) => {\n\t\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\t\t// Gel throws an error when more than one similarly named columns exist within context instead of preferring the closest one\n\t\t\t\t\t// thus forcing us to be explicit about column's source\n\t\t\t\t\t// if (isSingleTable) {\n\t\t\t\t\t// \tchunk.push(\n\t\t\t\t\t// \t\tnew SQL(\n\t\t\t\t\t// \t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t// \t\t\t\tif (is(c, GelColumn)) {\n\t\t\t\t\t// \t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t// \t\t\t\t}\n\t\t\t\t\t// \t\t\t\treturn c;\n\t\t\t\t\t// \t\t\t}),\n\t\t\t\t\t// \t\t),\n\t\t\t\t\t// \t);\n\t\t\t\t\t// } else {\n\t\t\t\t\tchunk.push(query);\n\t\t\t\t\t// }\n\n\t\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Column)) {\n\t\t\t\t\t// Gel throws an error when more than one similarly named columns exist within context instead of preferring the closest one\n\t\t\t\t\t// thus forcing us to be explicit about column's source\n\t\t\t\t\t// if (isSingleTable) {\n\t\t\t\t\t// \tchunk.push(sql.identifier(this.casing.getColumnCasing(field)));\n\t\t\t\t\t// } else {\n\t\t\t\t\tchunk.push(field);\n\t\t\t\t\t// }\n\t\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\t\tconst entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];\n\n\t\t\t\t\tif (entries.length === 1) {\n\t\t\t\t\t\tconst entry = entries[0]![1];\n\n\t\t\t\t\t\tconst fieldDecoder = is(entry, SQL)\n\t\t\t\t\t\t\t? entry.decoder\n\t\t\t\t\t\t\t: is(entry, Column)\n\t\t\t\t\t\t\t? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }\n\t\t\t\t\t\t\t: entry.sql.decoder;\n\n\t\t\t\t\t\tif (fieldDecoder) {\n\t\t\t\t\t\t\tfield._.sql.decoder = fieldDecoder;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tchunk.push(field);\n\t\t\t\t}\n\n\t\t\t\tif (i < columnsLen - 1) {\n\t\t\t\t\tchunk.push(sql`, `);\n\t\t\t\t}\n\n\t\t\t\treturn chunk;\n\t\t\t});\n\n\t\treturn sql.join(chunks);\n\t}\n\n\tprivate buildJoins(joins: GelSelectJoinConfig[] | undefined): SQL | undefined {\n\t\tif (!joins || joins.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst joinsArray: SQL[] = [];\n\n\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\tif (index === 0) {\n\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t}\n\t\t\tconst table = joinMeta.table;\n\t\t\tconst lateralSql = joinMeta.lateral ? sql` lateral` : undefined;\n\t\t\tconst onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;\n\n\t\t\tif (is(table, GelTable)) {\n\t\t\t\tconst tableName = table[GelTable.Symbol.Name];\n\t\t\t\tconst tableSchema = table[GelTable.Symbol.Schema];\n\t\t\t\tconst origTableName = table[GelTable.Symbol.OriginalName];\n\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\tjoinsArray.push(\n\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\ttableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined\n\t\t\t\t\t}${sql.identifier(origTableName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t);\n\t\t\t} else if (is(table, View)) {\n\t\t\t\tconst viewName = table[ViewBaseConfig].name;\n\t\t\t\tconst viewSchema = table[ViewBaseConfig].schema;\n\t\t\t\tconst origViewName = table[ViewBaseConfig].originalName;\n\t\t\t\tconst alias = viewName === origViewName ? undefined : joinMeta.alias;\n\t\t\t\tjoinsArray.push(\n\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\tviewSchema ? sql`${sql.identifier(viewSchema)}.` : undefined\n\t\t\t\t\t}${sql.identifier(origViewName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tjoinsArray.push(\n\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${table}${onSql}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (index < joins.length - 1) {\n\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t}\n\t\t}\n\n\t\treturn sql.join(joinsArray);\n\t}\n\n\tprivate buildFromTable(\n\t\ttable: SQL | Subquery | GelViewBase | GelTable | undefined,\n\t): SQL | Subquery | GelViewBase | GelTable | undefined {\n\t\tif (is(table, Table) && table[Table.Symbol.OriginalName] !== table[Table.Symbol.Name]) {\n\t\t\tlet fullName = sql`${sql.identifier(table[Table.Symbol.OriginalName])}`;\n\t\t\tif (table[Table.Symbol.Schema]) {\n\t\t\t\tfullName = sql`${sql.identifier(table[Table.Symbol.Schema]!)}.${fullName}`;\n\t\t\t}\n\t\t\treturn sql`${fullName} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t}\n\n\t\treturn table;\n\t}\n\n\tbuildSelectQuery(\n\t\t{\n\t\t\twithList,\n\t\t\tfields,\n\t\t\tfieldsFlat,\n\t\t\twhere,\n\t\t\thaving,\n\t\t\ttable,\n\t\t\tjoins,\n\t\t\torderBy,\n\t\t\tgroupBy,\n\t\t\tlimit,\n\t\t\toffset,\n\t\t\tlockingClause,\n\t\t\tdistinct,\n\t\t\tsetOperators,\n\t\t}: GelSelectConfig,\n\t): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<GelColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, GelViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(({ alias }) =>\n\t\t\t\t\t\talias === (table[Table.Symbol.IsAlias] ? getTableName(table) : table[Table.Symbol.BaseName])\n\t\t\t\t\t))(f.field.table)\n\t\t\t) {\n\t\t\t\tconst tableName = getTableName(f.field.table);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Your \"${\n\t\t\t\t\t\tf.path.join('->')\n\t\t\t\t\t}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst isSingleTable = !joins || joins.length === 0;\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tlet distinctSql: SQL | undefined;\n\t\tif (distinct) {\n\t\t\tdistinctSql = distinct === true ? sql` distinct` : sql` distinct on (${sql.join(distinct.on, sql`, `)})`;\n\t\t}\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable });\n\n\t\tconst tableSql = this.buildFromTable(table);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\torderBySql = sql` order by ${sql.join(orderBy, sql`, `)}`;\n\t\t}\n\n\t\tlet groupBySql;\n\t\tif (groupBy && groupBy.length > 0) {\n\t\t\tgroupBySql = sql` group by ${sql.join(groupBy, sql`, `)}`;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tconst lockingClauseSql = sql.empty();\n\t\tif (lockingClause) {\n\t\t\tconst clauseSql = sql` for ${sql.raw(lockingClause.strength)}`;\n\t\t\tif (lockingClause.config.of) {\n\t\t\t\tclauseSql.append(\n\t\t\t\t\tsql` of ${\n\t\t\t\t\t\tsql.join(\n\t\t\t\t\t\t\tArray.isArray(lockingClause.config.of) ? lockingClause.config.of : [lockingClause.config.of],\n\t\t\t\t\t\t\tsql`, `,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (lockingClause.config.noWait) {\n\t\t\t\tclauseSql.append(sql` nowait`);\n\t\t\t} else if (lockingClause.config.skipLocked) {\n\t\t\t\tclauseSql.append(sql` skip locked`);\n\t\t\t}\n\t\t\tlockingClauseSql.append(clauseSql);\n\t\t}\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}${lockingClauseSql}`;\n\n\t\tif (setOperators.length > 0) {\n\t\t\treturn this.buildSetOperations(finalQuery, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(leftSelect: SQL, setOperators: GelSelectConfig['setOperators']): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: { leftSelect: SQL; setOperator: GelSelectConfig['setOperators'][number] }): SQL {\n\t\tconst leftChunk = sql`(${leftSelect.getSQL()}) `;\n\t\tconst rightChunk = sql`(${rightSelect.getSQL()})`;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\tconst orderByValues: (SQL<unknown> | Name)[] = [];\n\n\t\t\t// The next bit is necessary because the sql operator replaces ${table.column} with `table`.`column`\n\t\t\t// which is invalid Sql syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const singleOrderBy of orderBy) {\n\t\t\t\tif (is(singleOrderBy, GelColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(singleOrderBy.name));\n\t\t\t\t} else if (is(singleOrderBy, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < singleOrderBy.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = singleOrderBy.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, GelColumn)) {\n\t\t\t\t\t\t\tsingleOrderBy.queryChunks[i] = sql.identifier(chunk.name);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)} `;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery(\n\t\t{ table, values: valuesOrSelect, onConflict, returning, withList, select, overridingSystemValue_ }: GelInsertConfig,\n\t): SQL {\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, GelColumn> = table[Table.Symbol.Columns];\n\n\t\tconst colEntries: [string, GelColumn][] = Object.entries(columns).filter(([_, col]) => !col.shouldDisableInsert());\n\n\t\tconst insertOrder = colEntries.map(\n\t\t\t([, column]) => sql.identifier(this.casing.getColumnCasing(column)),\n\t\t);\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnyGelSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (colValue === undefined || (is(colValue, Param) && colValue.value === undefined)) {\n\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\tif (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tconst defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tconst newValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t\tvalueList.push(newValue);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalueList.push(sql`default`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst onConflictSql = onConflict ? sql` on conflict ${onConflict}` : undefined;\n\n\t\tconst overridingSql = overridingSystemValue_ === true ? sql`overriding system value ` : undefined;\n\n\t\treturn sql`${withSql}insert into ${table} ${insertOrder} ${overridingSql}${valuesSql}${onConflictSql}${returningSql}`;\n\t}\n\n\tbuildRefreshMaterializedViewQuery(\n\t\t{ view, concurrently, withNoData }: { view: GelMaterializedView; concurrently?: boolean; withNoData?: boolean },\n\t): SQL {\n\t\tconst concurrentlySql = concurrently ? sql` concurrently` : undefined;\n\t\tconst withNoDataSql = withNoData ? sql` with no data` : undefined;\n\n\t\treturn sql`refresh materialized view${concurrentlySql} ${view}${withNoDataSql}`;\n\t}\n\n\tprepareTyping(encoder: DriverValueEncoder<unknown, unknown>): QueryTypingsValue {\n\t\tif (is(encoder, GelJson)) {\n\t\t\treturn 'json';\n\t\t} else if (is(encoder, GelDecimal)) {\n\t\t\treturn 'decimal';\n\t\t} else if (is(encoder, GelTimestamp)) {\n\t\t\treturn 'timestamp';\n\t\t} else if (is(encoder, GelUUID)) {\n\t\t\treturn 'uuid';\n\t\t} else {\n\t\t\treturn 'none';\n\t\t}\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tprepareTyping: this.prepareTyping,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\t// buildRelationalQueryWithPK({\n\t// \tfullSchema,\n\t// \tschema,\n\t// \ttableNamesMap,\n\t// \ttable,\n\t// \ttableConfig,\n\t// \tqueryConfig: config,\n\t// \ttableAlias,\n\t// \tisRoot = false,\n\t// \tjoinOn,\n\t// }: {\n\t// \tfullSchema: Record<string, unknown>;\n\t// \tschema: TablesRelationalConfig;\n\t// \ttableNamesMap: Record<string, string>;\n\t// \ttable: GelTable;\n\t// \ttableConfig: TableRelationalConfig;\n\t// \tqueryConfig: true | DBQueryConfig<'many', true>;\n\t// \ttableAlias: string;\n\t// \tisRoot?: boolean;\n\t// \tjoinOn?: SQL;\n\t// }): BuildRelationalQueryResult<GelTable, GelColumn> {\n\t// \t// For { \"<relation>\": true }, return a table with selection of all columns\n\t// \tif (config === true) {\n\t// \t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t// \t\tconst selection: BuildRelationalQueryResult<GelTable, GelColumn>['selection'] = selectionEntries.map((\n\t// \t\t\t[key, value],\n\t// \t\t) => ({\n\t// \t\t\tdbKey: value.name,\n\t// \t\t\ttsKey: key,\n\t// \t\t\tfield: value as GelColumn,\n\t// \t\t\trelationTableTsKey: undefined,\n\t// \t\t\tisJson: false,\n\t// \t\t\tselection: [],\n\t// \t\t}));\n\n\t// \t\treturn {\n\t// \t\t\ttableTsKey: tableConfig.tsName,\n\t// \t\t\tsql: table,\n\t// \t\t\tselection,\n\t// \t\t};\n\t// \t}\n\n\t// \t// let selection: BuildRelationalQueryResult<GelTable, GelColumn>['selection'] = [];\n\t// \t// let selectionForBuild = selection;\n\n\t// \tconst aliasedColumns = Object.fromEntries(\n\t// \t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t// \t);\n\n\t// \tconst aliasedRelations = Object.fromEntries(\n\t// \t\tObject.entries(tableConfig.relations).map(([key, value]) => [key, aliasedRelation(value, tableAlias)]),\n\t// \t);\n\n\t// \tconst aliasedFields = Object.assign({}, aliasedColumns, aliasedRelations);\n\n\t// \tlet where, hasUserDefinedWhere;\n\t// \tif (config.where) {\n\t// \t\tconst whereSql = typeof config.where === 'function' ? config.where(aliasedFields, operators) : config.where;\n\t// \t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t// \t\thasUserDefinedWhere = !!where;\n\t// \t}\n\t// \twhere = and(joinOn, where);\n\n\t// \t// const fieldsSelection: { tsKey: string; value: GelColumn | SQL.Aliased; isExtra?: boolean }[] = [];\n\t// \tlet joins: Join[] = [];\n\t// \tlet selectedColumns: string[] = [];\n\n\t// \t// Figure out which columns to select\n\t// \tif (config.columns) {\n\t// \t\tlet isIncludeMode = false;\n\n\t// \t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t// \t\t\tif (value === undefined) {\n\t// \t\t\t\tcontinue;\n\t// \t\t\t}\n\n\t// \t\t\tif (field in tableConfig.columns) {\n\t// \t\t\t\tif (!isIncludeMode && value === true) {\n\t// \t\t\t\t\tisIncludeMode = true;\n\t// \t\t\t\t}\n\t// \t\t\t\tselectedColumns.push(field);\n\t// \t\t\t}\n\t// \t\t}\n\n\t// \t\tif (selectedColumns.length > 0) {\n\t// \t\t\tselectedColumns = isIncludeMode\n\t// \t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t// \t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t// \t\t}\n\t// \t} else {\n\t// \t\t// Select all columns if selection is not specified\n\t// \t\tselectedColumns = Object.keys(tableConfig.columns);\n\t// \t}\n\n\t// \t// for (const field of selectedColumns) {\n\t// \t// \tconst column = tableConfig.columns[field]! as GelColumn;\n\t// \t// \tfieldsSelection.push({ tsKey: field, value: column });\n\t// \t// }\n\n\t// \tlet initiallySelectedRelations: {\n\t// \t\ttsKey: string;\n\t// \t\tqueryConfig: true | DBQueryConfig<'many', false>;\n\t// \t\trelation: Relation;\n\t// \t}[] = [];\n\n\t// \t// let selectedRelations: BuildRelationalQueryResult<GelTable, GelColumn>['selection'] = [];\n\n\t// \t// Figure out which relations to select\n\t// \tif (config.with) {\n\t// \t\tinitiallySelectedRelations = Object.entries(config.with)\n\t// \t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t// \t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t// \t}\n\n\t// \tconst manyRelations = initiallySelectedRelations.filter((r) =>\n\t// \t\tis(r.relation, Many)\n\t// \t\t&& (schema[tableNamesMap[r.relation.referencedTable[Table.Symbol.Name]]!]?.primaryKey.length ?? 0) > 0\n\t// \t);\n\t// \t// If this is the last Many relation (or there are no Many relations), we are on the innermost subquery level\n\t// \tconst isInnermostQuery = manyRelations.length < 2;\n\n\t// \tconst selectedExtras: {\n\t// \t\ttsKey: string;\n\t// \t\tvalue: SQL.Aliased;\n\t// \t}[] = [];\n\n\t// \t// Figure out which extras to select\n\t// \tif (isInnermostQuery && config.extras) {\n\t// \t\tconst extras = typeof config.extras === 'function'\n\t// \t\t\t? config.extras(aliasedFields, { sql })\n\t// \t\t\t: config.extras;\n\t// \t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t// \t\t\tselectedExtras.push({\n\t// \t\t\t\ttsKey,\n\t// \t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t// \t\t\t});\n\t// \t\t}\n\t// \t}\n\n\t// \t// Transform `fieldsSelection` into `selection`\n\t// \t// `fieldsSelection` shouldn't be used after this point\n\t// \t// for (const { tsKey, value, isExtra } of fieldsSelection) {\n\t// \t// \tselection.push({\n\t// \t// \t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t// \t// \t\ttsKey,\n\t// \t// \t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t// \t// \t\trelationTableTsKey: undefined,\n\t// \t// \t\tisJson: false,\n\t// \t// \t\tisExtra,\n\t// \t// \t\tselection: [],\n\t// \t// \t});\n\t// \t// }\n\n\t// \tlet orderByOrig = typeof config.orderBy === 'function'\n\t// \t\t? config.orderBy(aliasedFields, orderByOperators)\n\t// \t\t: config.orderBy ?? [];\n\t// \tif (!Array.isArray(orderByOrig)) {\n\t// \t\torderByOrig = [orderByOrig];\n\t// \t}\n\t// \tconst orderBy = orderByOrig.map((orderByValue) => {\n\t// \t\tif (is(orderByValue, Column)) {\n\t// \t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as GelColumn;\n\t// \t\t}\n\t// \t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t// \t});\n\n\t// \tconst limit = isInnermostQuery ? config.limit : undefined;\n\t// \tconst offset = isInnermostQuery ? config.offset : undefined;\n\n\t// \t// For non-root queries without additional config except columns, return a table with selection\n\t// \tif (\n\t// \t\t!isRoot\n\t// \t\t&& initiallySelectedRelations.length === 0\n\t// \t\t&& selectedExtras.length === 0\n\t// \t\t&& !where\n\t// \t\t&& orderBy.length === 0\n\t// \t\t&& limit === undefined\n\t// \t\t&& offset === undefined\n\t// \t) {\n\t// \t\treturn {\n\t// \t\t\ttableTsKey: tableConfig.tsName,\n\t// \t\t\tsql: table,\n\t// \t\t\tselection: selectedColumns.map((key) => ({\n\t// \t\t\t\tdbKey: tableConfig.columns[key]!.name,\n\t// \t\t\t\ttsKey: key,\n\t// \t\t\t\tfield: tableConfig.columns[key] as GelColumn,\n\t// \t\t\t\trelationTableTsKey: undefined,\n\t// \t\t\t\tisJson: false,\n\t// \t\t\t\tselection: [],\n\t// \t\t\t})),\n\t// \t\t};\n\t// \t}\n\n\t// \tconst selectedRelationsWithoutPK:\n\n\t// \t// Process all relations without primary keys, because they need to be joined differently and will all be on the same query level\n\t// \tfor (\n\t// \t\tconst {\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\trelation,\n\t// \t\t} of initiallySelectedRelations\n\t// \t) {\n\t// \t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t// \t\tconst relationTableName = relation.referencedTable[Table.Symbol.Name];\n\t// \t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t// \t\tconst relationTable = schema[relationTableTsName]!;\n\n\t// \t\tif (relationTable.primaryKey.length > 0) {\n\t// \t\t\tcontinue;\n\t// \t\t}\n\n\t// \t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t// \t\tconst joinOn = and(\n\t// \t\t\t...normalizedRelation.fields.map((field, i) =>\n\t// \t\t\t\teq(\n\t// \t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t// \t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t// \t\t\t\t)\n\t// \t\t\t),\n\t// \t\t);\n\t// \t\tconst builtRelation = this.buildRelationalQueryWithoutPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable: fullSchema[relationTableTsName] as GelTable,\n\t// \t\t\ttableConfig: schema[relationTableTsName]!,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\ttableAlias: relationTableAlias,\n\t// \t\t\tjoinOn,\n\t// \t\t\tnestedQueryRelation: relation,\n\t// \t\t});\n\t// \t\tconst field = sql`${sql.identifier(relationTableAlias)}.${sql.identifier('data')}`.as(selectedRelationTsKey);\n\t// \t\tjoins.push({\n\t// \t\t\ton: sql`true`,\n\t// \t\t\ttable: new Subquery(builtRelation.sql as SQL, {}, relationTableAlias),\n\t// \t\t\talias: relationTableAlias,\n\t// \t\t\tjoinType: 'left',\n\t// \t\t\tlateral: true,\n\t// \t\t});\n\t// \t\tselectedRelations.push({\n\t// \t\t\tdbKey: selectedRelationTsKey,\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tfield,\n\t// \t\t\trelationTableTsKey: relationTableTsName,\n\t// \t\t\tisJson: true,\n\t// \t\t\tselection: builtRelation.selection,\n\t// \t\t});\n\t// \t}\n\n\t// \tconst oneRelations = initiallySelectedRelations.filter((r): r is typeof r & { relation: One } =>\n\t// \t\tis(r.relation, One)\n\t// \t);\n\n\t// \t// Process all One relations with PKs, because they can all be joined on the same level\n\t// \tfor (\n\t// \t\tconst {\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\trelation,\n\t// \t\t} of oneRelations\n\t// \t) {\n\t// \t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t// \t\tconst relationTableName = relation.referencedTable[Table.Symbol.Name];\n\t// \t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t// \t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t// \t\tconst relationTable = schema[relationTableTsName]!;\n\n\t// \t\tif (relationTable.primaryKey.length === 0) {\n\t// \t\t\tcontinue;\n\t// \t\t}\n\n\t// \t\tconst joinOn = and(\n\t// \t\t\t...normalizedRelation.fields.map((field, i) =>\n\t// \t\t\t\teq(\n\t// \t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t// \t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t// \t\t\t\t)\n\t// \t\t\t),\n\t// \t\t);\n\t// \t\tconst builtRelation = this.buildRelationalQueryWithPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable: fullSchema[relationTableTsName] as GelTable,\n\t// \t\t\ttableConfig: schema[relationTableTsName]!,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\ttableAlias: relationTableAlias,\n\t// \t\t\tjoinOn,\n\t// \t\t});\n\t// \t\tconst field = sql`case when ${sql.identifier(relationTableAlias)} is null then null else json_build_array(${\n\t// \t\t\tsql.join(\n\t// \t\t\t\tbuiltRelation.selection.map(({ field }) =>\n\t// \t\t\t\t\tis(field, SQL.Aliased)\n\t// \t\t\t\t\t\t? sql`${sql.identifier(relationTableAlias)}.${sql.identifier(field.fieldAlias)}`\n\t// \t\t\t\t\t\t: is(field, Column)\n\t// \t\t\t\t\t\t? aliasedTableColumn(field, relationTableAlias)\n\t// \t\t\t\t\t\t: field\n\t// \t\t\t\t),\n\t// \t\t\t\tsql`, `,\n\t// \t\t\t)\n\t// \t\t}) end`.as(selectedRelationTsKey);\n\t// \t\tconst isLateralJoin = is(builtRelation.sql, SQL);\n\t// \t\tjoins.push({\n\t// \t\t\ton: isLateralJoin ? sql`true` : joinOn,\n\t// \t\t\ttable: is(builtRelation.sql, SQL)\n\t// \t\t\t\t? new Subquery(builtRelation.sql, {}, relationTableAlias)\n\t// \t\t\t\t: aliasedTable(builtRelation.sql, relationTableAlias),\n\t// \t\t\talias: relationTableAlias,\n\t// \t\t\tjoinType: 'left',\n\t// \t\t\tlateral: is(builtRelation.sql, SQL),\n\t// \t\t});\n\t// \t\tselectedRelations.push({\n\t// \t\t\tdbKey: selectedRelationTsKey,\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tfield,\n\t// \t\t\trelationTableTsKey: relationTableTsName,\n\t// \t\t\tisJson: true,\n\t// \t\t\tselection: builtRelation.selection,\n\t// \t\t});\n\t// \t}\n\n\t// \tlet distinct: GelSelectConfig['distinct'];\n\t// \tlet tableFrom: GelTable | Subquery = table;\n\n\t// \t// Process first Many relation - each one requires a nested subquery\n\t// \tconst manyRelation = manyRelations[0];\n\t// \tif (manyRelation) {\n\t// \t\tconst {\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tqueryConfig: selectedRelationQueryConfig,\n\t// \t\t\trelation,\n\t// \t\t} = manyRelation;\n\n\t// \t\tdistinct = {\n\t// \t\t\ton: tableConfig.primaryKey.map((c) => aliasedTableColumn(c as GelColumn, tableAlias)),\n\t// \t\t};\n\n\t// \t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t// \t\tconst relationTableName = relation.referencedTable[Table.Symbol.Name];\n\t// \t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t// \t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t// \t\tconst joinOn = and(\n\t// \t\t\t...normalizedRelation.fields.map((field, i) =>\n\t// \t\t\t\teq(\n\t// \t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t// \t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t// \t\t\t\t)\n\t// \t\t\t),\n\t// \t\t);\n\n\t// \t\tconst builtRelationJoin = this.buildRelationalQueryWithPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable: fullSchema[relationTableTsName] as GelTable,\n\t// \t\t\ttableConfig: schema[relationTableTsName]!,\n\t// \t\t\tqueryConfig: selectedRelationQueryConfig,\n\t// \t\t\ttableAlias: relationTableAlias,\n\t// \t\t\tjoinOn,\n\t// \t\t});\n\n\t// \t\tconst builtRelationSelectionField = sql`case when ${\n\t// \t\t\tsql.identifier(relationTableAlias)\n\t// \t\t} is null then '[]' else json_agg(json_build_array(${\n\t// \t\t\tsql.join(\n\t// \t\t\t\tbuiltRelationJoin.selection.map(({ field }) =>\n\t// \t\t\t\t\tis(field, SQL.Aliased)\n\t// \t\t\t\t\t\t? sql`${sql.identifier(relationTableAlias)}.${sql.identifier(field.fieldAlias)}`\n\t// \t\t\t\t\t\t: is(field, Column)\n\t// \t\t\t\t\t\t? aliasedTableColumn(field, relationTableAlias)\n\t// \t\t\t\t\t\t: field\n\t// \t\t\t\t),\n\t// \t\t\t\tsql`, `,\n\t// \t\t\t)\n\t// \t\t})) over (partition by ${sql.join(distinct.on, sql`, `)}) end`.as(selectedRelationTsKey);\n\t// \t\tconst isLateralJoin = is(builtRelationJoin.sql, SQL);\n\t// \t\tjoins.push({\n\t// \t\t\ton: isLateralJoin ? sql`true` : joinOn,\n\t// \t\t\ttable: isLateralJoin\n\t// \t\t\t\t? new Subquery(builtRelationJoin.sql as SQL, {}, relationTableAlias)\n\t// \t\t\t\t: aliasedTable(builtRelationJoin.sql as GelTable, relationTableAlias),\n\t// \t\t\talias: relationTableAlias,\n\t// \t\t\tjoinType: 'left',\n\t// \t\t\tlateral: isLateralJoin,\n\t// \t\t});\n\n\t// \t\t// Build the \"from\" subquery with the remaining Many relations\n\t// \t\tconst builtTableFrom = this.buildRelationalQueryWithPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable,\n\t// \t\t\ttableConfig,\n\t// \t\t\tqueryConfig: {\n\t// \t\t\t\t...config,\n\t// \t\t\t\twhere: undefined,\n\t// \t\t\t\torderBy: undefined,\n\t// \t\t\t\tlimit: undefined,\n\t// \t\t\t\toffset: undefined,\n\t// \t\t\t\twith: manyRelations.slice(1).reduce<NonNullable<typeof config['with']>>(\n\t// \t\t\t\t\t(result, { tsKey, queryConfig: configValue }) => {\n\t// \t\t\t\t\t\tresult[tsKey] = configValue;\n\t// \t\t\t\t\t\treturn result;\n\t// \t\t\t\t\t},\n\t// \t\t\t\t\t{},\n\t// \t\t\t\t),\n\t// \t\t\t},\n\t// \t\t\ttableAlias,\n\t// \t\t});\n\n\t// \t\tselectedRelations.push({\n\t// \t\t\tdbKey: selectedRelationTsKey,\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tfield: builtRelationSelectionField,\n\t// \t\t\trelationTableTsKey: relationTableTsName,\n\t// \t\t\tisJson: true,\n\t// \t\t\tselection: builtRelationJoin.selection,\n\t// \t\t});\n\n\t// \t\t// selection = builtTableFrom.selection.map((item) =>\n\t// \t\t// \tis(item.field, SQL.Aliased)\n\t// \t\t// \t\t? { ...item, field: sql`${sql.identifier(tableAlias)}.${sql.identifier(item.field.fieldAlias)}` }\n\t// \t\t// \t\t: item\n\t// \t\t// );\n\t// \t\t// selectionForBuild = [{\n\t// \t\t// \tdbKey: '*',\n\t// \t\t// \ttsKey: '*',\n\t// \t\t// \tfield: sql`${sql.identifier(tableAlias)}.*`,\n\t// \t\t// \tselection: [],\n\t// \t\t// \tisJson: false,\n\t// \t\t// \trelationTableTsKey: undefined,\n\t// \t\t// }];\n\t// \t\t// const newSelectionItem: (typeof selection)[number] = {\n\t// \t\t// \tdbKey: selectedRelationTsKey,\n\t// \t\t// \ttsKey: selectedRelationTsKey,\n\t// \t\t// \tfield,\n\t// \t\t// \trelationTableTsKey: relationTableTsName,\n\t// \t\t// \tisJson: true,\n\t// \t\t// \tselection: builtRelationJoin.selection,\n\t// \t\t// };\n\t// \t\t// selection.push(newSelectionItem);\n\t// \t\t// selectionForBuild.push(newSelectionItem);\n\n\t// \t\ttableFrom = is(builtTableFrom.sql, GelTable)\n\t// \t\t\t? builtTableFrom.sql\n\t// \t\t\t: new Subquery(builtTableFrom.sql, {}, tableAlias);\n\t// \t}\n\n\t// \tif (selectedColumns.length === 0 && selectedRelations.length === 0 && selectedExtras.length === 0) {\n\t// \t\tthrow new DrizzleError(`No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\")`);\n\t// \t}\n\n\t// \tlet selection: BuildRelationalQueryResult<GelTable, GelColumn>['selection'];\n\n\t// \tfunction prepareSelectedColumns() {\n\t// \t\treturn selectedColumns.map((key) => ({\n\t// \t\t\tdbKey: tableConfig.columns[key]!.name,\n\t// \t\t\ttsKey: key,\n\t// \t\t\tfield: tableConfig.columns[key] as GelColumn,\n\t// \t\t\trelationTableTsKey: undefined,\n\t// \t\t\tisJson: false,\n\t// \t\t\tselection: [],\n\t// \t\t}));\n\t// \t}\n\n\t// \tfunction prepareSelectedExtras() {\n\t// \t\treturn selectedExtras.map((item) => ({\n\t// \t\t\tdbKey: item.value.fieldAlias,\n\t// \t\t\ttsKey: item.tsKey,\n\t// \t\t\tfield: item.value,\n\t// \t\t\trelationTableTsKey: undefined,\n\t// \t\t\tisJson: false,\n\t// \t\t\tselection: [],\n\t// \t\t}));\n\t// \t}\n\n\t// \tif (isRoot) {\n\t// \t\tselection = [\n\t// \t\t\t...prepareSelectedColumns(),\n\t// \t\t\t...prepareSelectedExtras(),\n\t// \t\t];\n\t// \t}\n\n\t// \tif (hasUserDefinedWhere || orderBy.length > 0) {\n\t// \t\ttableFrom = new Subquery(\n\t// \t\t\tthis.buildSelectQuery({\n\t// \t\t\t\ttable: is(tableFrom, GelTable) ? aliasedTable(tableFrom, tableAlias) : tableFrom,\n\t// \t\t\t\tfields: {},\n\t// \t\t\t\tfieldsFlat: selectionForBuild.map(({ field }) => ({\n\t// \t\t\t\t\tpath: [],\n\t// \t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t// \t\t\t\t})),\n\t// \t\t\t\tjoins,\n\t// \t\t\t\tdistinct,\n\t// \t\t\t}),\n\t// \t\t\t{},\n\t// \t\t\ttableAlias,\n\t// \t\t);\n\t// \t\tselectionForBuild = selection.map((item) =>\n\t// \t\t\tis(item.field, SQL.Aliased)\n\t// \t\t\t\t? { ...item, field: sql`${sql.identifier(tableAlias)}.${sql.identifier(item.field.fieldAlias)}` }\n\t// \t\t\t\t: item\n\t// \t\t);\n\t// \t\tjoins = [];\n\t// \t\tdistinct = undefined;\n\t// \t}\n\n\t// \tconst result = this.buildSelectQuery({\n\t// \t\ttable: is(tableFrom, GelTable) ? aliasedTable(tableFrom, tableAlias) : tableFrom,\n\t// \t\tfields: {},\n\t// \t\tfieldsFlat: selectionForBuild.map(({ field }) => ({\n\t// \t\t\tpath: [],\n\t// \t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t// \t\t})),\n\t// \t\twhere,\n\t// \t\tlimit,\n\t// \t\toffset,\n\t// \t\tjoins,\n\t// \t\torderBy,\n\t// \t\tdistinct,\n\t// \t});\n\n\t// \treturn {\n\t// \t\ttableTsKey: tableConfig.tsName,\n\t// \t\tsql: result,\n\t// \t\tselection,\n\t// \t};\n\t// }\n\n\tbuildRelationalQueryWithoutPK({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: GelTable;\n\t\ttableConfig: TableRelationalConfig;\n\t\tqueryConfig: true | DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: Relation;\n\t\tjoinOn?: SQL;\n\t}): BuildRelationalQueryResult<GelTable, GelColumn> {\n\t\tlet selection: BuildRelationalQueryResult<GelTable, GelColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: NonNullable<GelSelectConfig['orderBy']> = [], where;\n\t\tconst joins: GelSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as GelColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map((\n\t\t\t\t\t[key, value],\n\t\t\t\t) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: GelColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as GelColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | DBQueryConfig<'many', false>;\n\t\t\t\trelation: Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as GelColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this.buildRelationalQueryWithoutPK({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as GelTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = sql`${sql.identifier(relationTableAlias)}.${sql.identifier('data')}`.as(selectedRelationTsKey);\n\t\t\t\tjoins.push({\n\t\t\t\t\ton: sql`true`,\n\t\t\t\t\ttable: new Subquery(builtRelation.sql as SQL, {}, relationTableAlias),\n\t\t\t\t\talias: relationTableAlias,\n\t\t\t\t\tjoinType: 'left',\n\t\t\t\t\tlateral: true,\n\t\t\t\t});\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({ message: `No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\")` });\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_build_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field, tsKey, isJson }) =>\n\t\t\t\t\t\tisJson\n\t\t\t\t\t\t\t? sql`${sql.identifier(`${tableAlias}_${tsKey}`)}.${sql.identifier('data')}`\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, Many)) {\n\t\t\t\tfield = sql`coalesce(json_agg(${field}${\n\t\t\t\t\torderBy.length > 0 ? sql` order by ${sql.join(orderBy, sql`, `)}` : undefined\n\t\t\t\t}), '[]'::json)`;\n\t\t\t\t// orderBy = [];\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield: field.as('data'),\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [{\n\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t}],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\torderBy,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = [];\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, GelTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/expressions.ts",
    "content": "import type { GelColumn } from '~/gel-core/columns/index.ts';\nimport { bindIfParam } from '~/sql/expressions/index.ts';\nimport type { Placeholder, SQL, SQLChunk, SQLWrapper } from '~/sql/sql.ts';\nimport { sql } from '~/sql/sql.ts';\n\nexport * from '~/sql/expressions/index.ts';\n\nexport function concat(column: GelColumn | SQL.Aliased, value: string | Placeholder | SQLWrapper): SQL {\n\treturn sql`${column} || ${bindIfParam(value, column)}`;\n}\n\nexport function substring(\n\tcolumn: GelColumn | SQL.Aliased,\n\t{ from, for: _for }: { from?: number | Placeholder | SQLWrapper; for?: number | Placeholder | SQLWrapper },\n): SQL {\n\tconst chunks: SQLChunk[] = [sql`substring(`, column];\n\tif (from !== undefined) {\n\t\tchunks.push(sql` from `, bindIfParam(from, column));\n\t}\n\tif (_for !== undefined) {\n\t\tchunks.push(sql` for `, bindIfParam(_for, column));\n\t}\n\tchunks.push(sql`)`);\n\treturn sql.join(chunks);\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/foreign-keys.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { AnyGelColumn, GelColumn } from './columns/index.ts';\nimport type { GelTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: GelColumn[];\n\treadonly foreignTable: GelTable;\n\treadonly foreignColumns: GelColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'GelForeignKeyBuilder';\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined = 'no action';\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined = 'no action';\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: GelColumn[];\n\t\t\tforeignColumns: GelColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as GelTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: GelTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport type AnyForeignKeyBuilder = ForeignKeyBuilder;\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'GelForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(readonly table: GelTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[TableName],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[TableName],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends GelColumn[],\n> = { [Key in keyof TColumns]: AnyGelColumn<{ tableName: TTableName }> };\n\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnyGelColumn<{ tableName: TTableName }>, ...AnyGelColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tconst { name, columns, foreignColumns } = config;\n\t\treturn {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tforeignColumns,\n\t\t};\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/index.ts",
    "content": "export * from './alias.ts';\nexport * from './checks.ts';\nexport * from './columns/index.ts';\nexport * from './db.ts';\nexport * from './dialect.ts';\nexport * from './foreign-keys.ts';\nexport * from './indexes.ts';\nexport * from './policies.ts';\nexport * from './primary-keys.ts';\nexport * from './query-builders/index.ts';\nexport * from './roles.ts';\nexport * from './schema.ts';\nexport * from './sequence.ts';\nexport * from './session.ts';\nexport * from './subquery.ts';\nexport * from './table.ts';\nexport * from './unique-constraint.ts';\nexport * from './utils.ts';\nexport * from './view-common.ts';\nexport * from './view.ts';\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/indexes.ts",
    "content": "import { SQL } from '~/sql/sql.ts';\n\nimport { entityKind, is } from '~/entity.ts';\nimport type { GelColumn, GelExtraConfigColumn } from './columns/index.ts';\nimport { IndexedColumn } from './columns/index.ts';\nimport type { GelTable } from './table.ts';\n\ninterface IndexConfig {\n\tname?: string;\n\n\tcolumns: Partial<IndexedColumn | SQL>[];\n\n\t/**\n\t * If true, the index will be created as `create unique index` instead of `create index`.\n\t */\n\tunique: boolean;\n\n\t/**\n\t * If true, the index will be created as `create index concurrently` instead of `create index`.\n\t */\n\tconcurrently?: boolean;\n\n\t/**\n\t * If true, the index will be created as `create index ... on only <table>` instead of `create index ... on <table>`.\n\t */\n\tonly: boolean;\n\n\t/**\n\t * Condition for partial index.\n\t */\n\twhere?: SQL;\n\n\t/**\n\t * The optional WITH clause specifies storage parameters for the index\n\t */\n\twith?: Record<string, any>;\n\n\t/**\n\t * The optional WITH clause method for the index\n\t */\n\tmethod?: 'btree' | string;\n}\n\nexport type IndexColumn = GelColumn;\n\nexport type GelIndexMethod =\n\t| 'btree'\n\t| 'hash'\n\t| 'gist'\n\t| 'sGelist'\n\t| 'gin'\n\t| 'brin'\n\t| 'hnsw'\n\t| 'ivfflat'\n\t| (string & {});\n\nexport type GelIndexOpClass =\n\t| 'abstime_ops'\n\t| 'access_method'\n\t| 'anyarray_eq'\n\t| 'anyarray_ge'\n\t| 'anyarray_gt'\n\t| 'anyarray_le'\n\t| 'anyarray_lt'\n\t| 'anyarray_ne'\n\t| 'bigint_ops'\n\t| 'bit_ops'\n\t| 'bool_ops'\n\t| 'box_ops'\n\t| 'bpchar_ops'\n\t| 'char_ops'\n\t| 'cidr_ops'\n\t| 'cstring_ops'\n\t| 'date_ops'\n\t| 'float_ops'\n\t| 'int2_ops'\n\t| 'int4_ops'\n\t| 'int8_ops'\n\t| 'interval_ops'\n\t| 'jsonb_ops'\n\t| 'macaddr_ops'\n\t| 'name_ops'\n\t| 'numeric_ops'\n\t| 'oid_ops'\n\t| 'oidint4_ops'\n\t| 'oidint8_ops'\n\t| 'oidname_ops'\n\t| 'oidvector_ops'\n\t| 'point_ops'\n\t| 'polygon_ops'\n\t| 'range_ops'\n\t| 'record_eq'\n\t| 'record_ge'\n\t| 'record_gt'\n\t| 'record_le'\n\t| 'record_lt'\n\t| 'record_ne'\n\t| 'text_ops'\n\t| 'time_ops'\n\t| 'timestamp_ops'\n\t| 'timestamptz_ops'\n\t| 'timetz_ops'\n\t| 'uuid_ops'\n\t| 'varbit_ops'\n\t| 'varchar_ops'\n\t| 'xml_ops'\n\t| 'vector_l2_ops'\n\t| 'vector_ip_ops'\n\t| 'vector_cosine_ops'\n\t| 'vector_l1_ops'\n\t| 'bit_hamming_ops'\n\t| 'bit_jaccard_ops'\n\t| 'halfvec_l2_ops'\n\t| 'sparsevec_l2_op'\n\t| (string & {});\n\nexport class IndexBuilderOn {\n\tstatic readonly [entityKind]: string = 'GelIndexBuilderOn';\n\n\tconstructor(private unique: boolean, private name?: string) {}\n\n\ton(...columns: [Partial<GelExtraConfigColumn> | SQL, ...Partial<GelExtraConfigColumn | SQL>[]]): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\t\t\t\tit = it as GelExtraConfigColumn;\n\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(it.name, !!it.keyAsName, it.columnType!, it.indexConfig!);\n\t\t\t\tit.indexConfig = JSON.parse(JSON.stringify(it.defaultConfig));\n\t\t\t\treturn clonedIndexedColumn;\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\tfalse,\n\t\t\tthis.name,\n\t\t);\n\t}\n\n\tonOnly(...columns: [Partial<GelExtraConfigColumn | SQL>, ...Partial<GelExtraConfigColumn | SQL>[]]): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\t\t\t\tit = it as GelExtraConfigColumn;\n\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(it.name, !!it.keyAsName, it.columnType!, it.indexConfig!);\n\t\t\t\tit.indexConfig = it.defaultConfig;\n\t\t\t\treturn clonedIndexedColumn;\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\ttrue,\n\t\t\tthis.name,\n\t\t);\n\t}\n\n\t/**\n\t * Specify what index method to use. Choices are `btree`, `hash`, `gist`, `sGelist`, `gin`, `brin`, or user-installed access methods like `bloom`. The default method is `btree.\n\t *\n\t * If you have the `Gel_vector` extension installed in your database, you can use the `hnsw` and `ivfflat` options, which are predefined types.\n\t *\n\t * **You can always specify any string you want in the method, in case Drizzle doesn't have it natively in its types**\n\t *\n\t * @param method The name of the index method to be used\n\t * @param columns\n\t * @returns\n\t */\n\tusing(\n\t\tmethod: GelIndexMethod,\n\t\t...columns: [Partial<GelExtraConfigColumn | SQL>, ...Partial<GelExtraConfigColumn | SQL>[]]\n\t): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\t\t\t\tit = it as GelExtraConfigColumn;\n\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(it.name, !!it.keyAsName, it.columnType!, it.indexConfig!);\n\t\t\t\tit.indexConfig = JSON.parse(JSON.stringify(it.defaultConfig));\n\t\t\t\treturn clonedIndexedColumn;\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\ttrue,\n\t\t\tthis.name,\n\t\t\tmethod,\n\t\t);\n\t}\n}\n\nexport interface AnyIndexBuilder {\n\tbuild(table: GelTable): Index;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface IndexBuilder extends AnyIndexBuilder {}\n\nexport class IndexBuilder implements AnyIndexBuilder {\n\tstatic readonly [entityKind]: string = 'GelIndexBuilder';\n\n\t/** @internal */\n\tconfig: IndexConfig;\n\n\tconstructor(\n\t\tcolumns: Partial<IndexedColumn | SQL>[],\n\t\tunique: boolean,\n\t\tonly: boolean,\n\t\tname?: string,\n\t\tmethod: string = 'btree',\n\t) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tunique,\n\t\t\tonly,\n\t\t\tmethod,\n\t\t};\n\t}\n\n\tconcurrently(): this {\n\t\tthis.config.concurrently = true;\n\t\treturn this;\n\t}\n\n\twith(obj: Record<string, any>): this {\n\t\tthis.config.with = obj;\n\t\treturn this;\n\t}\n\n\twhere(condition: SQL): this {\n\t\tthis.config.where = condition;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: GelTable): Index {\n\t\treturn new Index(this.config, table);\n\t}\n}\n\nexport class Index {\n\tstatic readonly [entityKind]: string = 'GelIndex';\n\n\treadonly config: IndexConfig & { table: GelTable };\n\n\tconstructor(config: IndexConfig, table: GelTable) {\n\t\tthis.config = { ...config, table };\n\t}\n}\n\nexport type GetColumnsTableName<TColumns> = TColumns extends GelColumn ? TColumns['_']['name']\n\t: TColumns extends GelColumn[] ? TColumns[number]['_']['name']\n\t: never;\n\nexport function index(name?: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(false, name);\n}\n\nexport function uniqueIndex(name?: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(true, name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/policies.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { GelRole } from './roles.ts';\nimport type { GelTable } from './table.ts';\n\nexport type GelPolicyToOption =\n\t| 'public'\n\t| 'current_role'\n\t| 'current_user'\n\t| 'session_user'\n\t| (string & {})\n\t| GelPolicyToOption[]\n\t| GelRole;\n\nexport interface GelPolicyConfig {\n\tas?: 'permissive' | 'restrictive';\n\tfor?: 'all' | 'select' | 'insert' | 'update' | 'delete';\n\tto?: GelPolicyToOption;\n\tusing?: SQL;\n\twithCheck?: SQL;\n}\n\nexport class GelPolicy implements GelPolicyConfig {\n\tstatic readonly [entityKind]: string = 'GelPolicy';\n\n\treadonly as: GelPolicyConfig['as'];\n\treadonly for: GelPolicyConfig['for'];\n\treadonly to: GelPolicyConfig['to'];\n\treadonly using: GelPolicyConfig['using'];\n\treadonly withCheck: GelPolicyConfig['withCheck'];\n\n\t/** @internal */\n\t_linkedTable?: GelTable;\n\n\tconstructor(\n\t\treadonly name: string,\n\t\tconfig?: GelPolicyConfig,\n\t) {\n\t\tif (config) {\n\t\t\tthis.as = config.as;\n\t\t\tthis.for = config.for;\n\t\t\tthis.to = config.to;\n\t\t\tthis.using = config.using;\n\t\t\tthis.withCheck = config.withCheck;\n\t\t}\n\t}\n\n\tlink(table: GelTable): this {\n\t\tthis._linkedTable = table;\n\t\treturn this;\n\t}\n}\n\nexport function gelPolicy(name: string, config?: GelPolicyConfig) {\n\treturn new GelPolicy(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/primary-keys.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { AnyGelColumn, GelColumn } from './columns/index.ts';\nimport { GelTable } from './table.ts';\n\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumn extends AnyGelColumn<{ tableName: TTableName }>,\n\tTColumns extends AnyGelColumn<{ tableName: TTableName }>[],\n>(config: { name?: string; columns: [TColumn, ...TColumns] }): PrimaryKeyBuilder;\n/**\n * @deprecated: Please use primaryKey({ columns: [] }) instead of this function\n * @param columns\n */\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumns extends AnyGelColumn<{ tableName: TTableName }>[],\n>(...columns: TColumns): PrimaryKeyBuilder;\nexport function primaryKey(...config: any) {\n\tif (config[0].columns) {\n\t\treturn new PrimaryKeyBuilder(config[0].columns, config[0].name);\n\t}\n\treturn new PrimaryKeyBuilder(config);\n}\n\nexport class PrimaryKeyBuilder {\n\tstatic readonly [entityKind]: string = 'GelPrimaryKeyBuilder';\n\n\t/** @internal */\n\tcolumns: GelColumn[];\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tcolumns: GelColumn[],\n\t\tname?: string,\n\t) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\t/** @internal */\n\tbuild(table: GelTable): PrimaryKey {\n\t\treturn new PrimaryKey(table, this.columns, this.name);\n\t}\n}\n\nexport class PrimaryKey {\n\tstatic readonly [entityKind]: string = 'GelPrimaryKey';\n\n\treadonly columns: AnyGelColumn<{}>[];\n\treadonly name?: string;\n\n\tconstructor(readonly table: GelTable, columns: AnyGelColumn<{}>[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\tgetName(): string {\n\t\treturn this.name ?? `${this.table[GelTable.Symbol.Name]}_${this.columns.map((column) => column.name).join('_')}_pk`;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/query-builders/count.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { GelSession } from '../session.ts';\nimport type { GelTable } from '../table.ts';\n\nexport class GelCountBuilder<\n\tTSession extends GelSession<any, any, any>,\n> extends SQL<number> implements Promise<number>, SQLWrapper {\n\tprivate sql: SQL<number>;\n\n\tstatic override readonly [entityKind] = 'GelCountBuilder';\n\t[Symbol.toStringTag] = 'GelCountBuilder';\n\n\tprivate session: TSession;\n\n\tprivate static buildEmbeddedCount(\n\t\tsource: GelTable | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`(select count(*) from ${source}${sql.raw(' where ').if(filters)}${filters})`;\n\t}\n\n\tprivate static buildCount(\n\t\tsource: GelTable | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`select count(*) as count from ${source}${sql.raw(' where ').if(filters)}${filters};`;\n\t}\n\n\tconstructor(\n\t\treadonly params: {\n\t\t\tsource: GelTable | SQL | SQLWrapper;\n\t\t\tfilters?: SQL<unknown>;\n\t\t\tsession: TSession;\n\t\t},\n\t) {\n\t\tsuper(GelCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);\n\n\t\tthis.mapWith(Number);\n\n\t\tthis.session = params.session;\n\n\t\tthis.sql = GelCountBuilder.buildCount(\n\t\t\tparams.source,\n\t\t\tparams.filters,\n\t\t);\n\t}\n\n\tthen<TResult1 = number, TResult2 = never>(\n\t\tonfulfilled?: ((value: number) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n\t\tonrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn Promise.resolve(this.session.count(this.sql))\n\t\t\t.then(\n\t\t\t\tonfulfilled,\n\t\t\t\tonrejected,\n\t\t\t);\n\t}\n\n\tcatch(\n\t\tonRejected?: ((reason: any) => any) | null | undefined,\n\t): Promise<number> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<number> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/query-builders/delete.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { GelDialect } from '~/gel-core/dialect.ts';\nimport type {\n\tGelPreparedQuery,\n\tGelQueryResultHKT,\n\tGelQueryResultKind,\n\tGelSession,\n\tPreparedQueryConfig,\n} from '~/gel-core/session.ts';\nimport type { GelTable } from '~/gel-core/table.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { tracer } from '~/tracing.ts';\nimport { orderSelectedFields } from '~/utils.ts';\nimport type { GelColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\n\nexport type GelDeleteWithout<\n\tT extends AnyGelDeleteBase,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T\n\t: Omit<\n\t\tGelDeleteBase<\n\t\t\tT['_']['table'],\n\t\t\tT['_']['queryResult'],\n\t\t\tT['_']['returning'],\n\t\t\tTDynamic,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>,\n\t\tT['_']['excludedMethods'] | K\n\t>;\n\nexport type GelDelete<\n\tTTable extends GelTable = GelTable,\n\tTQueryResult extends GelQueryResultHKT = GelQueryResultHKT,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = GelDeleteBase<TTable, TQueryResult, TReturning, true, never>;\n\nexport interface GelDeleteConfig {\n\twhere?: SQL | undefined;\n\ttable: GelTable;\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type GelDeleteReturningAll<\n\tT extends AnyGelDeleteBase,\n\tTDynamic extends boolean,\n> = GelDeleteWithout<\n\tGelDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type GelDeleteReturning<\n\tT extends AnyGelDeleteBase,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = GelDeleteWithout<\n\tGelDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type GelDeletePrepare<T extends AnyGelDeleteBase> = GelPreparedQuery<\n\tPreparedQueryConfig & {\n\t\texecute: T['_']['returning'] extends undefined ? GelQueryResultKind<T['_']['queryResult'], never>\n\t\t\t: T['_']['returning'][];\n\t}\n>;\n\nexport type GelDeleteDynamic<T extends AnyGelDeleteBase> = GelDelete<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['returning']\n>;\n\nexport type AnyGelDeleteBase = GelDeleteBase<any, any, any, any, any>;\n\nexport interface GelDeleteBase<\n\tTTable extends GelTable,\n\tTQueryResult extends GelQueryResultHKT,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tQueryPromise<TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[], 'gel'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\tdialect: 'gel';\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[];\n\t};\n}\n\nexport class GelDeleteBase<\n\tTTable extends GelTable,\n\tTQueryResult extends GelQueryResultHKT,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[]>\n\timplements\n\t\tRunnableQuery<TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[], 'gel'>,\n\t\tSQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'GelDelete';\n\n\tprivate config: GelDeleteConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tprivate session: GelSession,\n\t\tprivate dialect: GelDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, withList };\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will delete only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be deleted.\n\t *\n\t * ```ts\n\t * // Delete all cars with green color\n\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.delete(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Delete all BMW cars with a green color\n\t * await db.delete(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Delete all cars with the green or blue color\n\t * await db.delete(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): GelDeleteWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the deleted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete#delete-with-return}\n\t *\n\t * @example\n\t * ```ts\n\t * // Delete all cars with the green color and return all fields\n\t * const deletedCars: Car[] = await db.delete(cars)\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning();\n\t *\n\t * // Delete all cars with the green color and return only their id and brand fields\n\t * const deletedCarsIdsAndBrands: { id: number, brand: string }[] = await db.delete(cars)\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): GelDeleteReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): GelDeleteReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.config.table[Table.Symbol.Columns],\n\t): GelDeleteReturning<this, TDynamic, any> {\n\t\tthis.config.returning = orderSelectedFields<GelColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildDeleteQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): GelDeletePrepare<this> {\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\treturn this.session.prepareQuery<\n\t\t\t\tPreparedQueryConfig & {\n\t\t\t\t\texecute: TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[];\n\t\t\t\t}\n\t\t\t>(this.dialect.sqlToQuery(this.getSQL()), this.config.returning, name, true, undefined, {\n\t\t\t\ttype: 'delete',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t});\n\t\t});\n\t}\n\n\tprepare(name: string): GelDeletePrepare<this> {\n\t\treturn this._prepare(name);\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(placeholderValues);\n\t\t});\n\t};\n\n\t$dynamic(): GelDeleteDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/query-builders/index.ts",
    "content": "export * from './delete.ts';\nexport * from './insert.ts';\nexport * from './query-builder.ts';\nexport * from './refresh-materialized-view.ts';\nexport * from './select.ts';\nexport * from './select.types.ts';\nexport * from './update.ts';\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/query-builders/insert.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\nimport type { GelDialect } from '~/gel-core/dialect.ts';\nimport type { IndexColumn } from '~/gel-core/indexes.ts';\nimport type {\n\tGelPreparedQuery,\n\tGelQueryResultHKT,\n\tGelQueryResultKind,\n\tGelSession,\n\tPreparedQueryConfig,\n} from '~/gel-core/session.ts';\nimport type { GelTable, TableConfig } from '~/gel-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { Param, SQL } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport type { InferInsertModel } from '~/table.ts';\nimport { Columns, Table } from '~/table.ts';\nimport { tracer } from '~/tracing.ts';\nimport { haveSameKeys, type NeonAuthToken, orderSelectedFields } from '~/utils.ts';\nimport type { AnyGelColumn, GelColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport { QueryBuilder } from './query-builder.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\nimport type { GelUpdateSetSource } from './update.ts';\n\nexport interface GelInsertConfig<TTable extends GelTable = GelTable> {\n\ttable: TTable;\n\tvalues: Record<string, Param | SQL>[] | GelInsertSelectQueryBuilder<TTable> | SQL;\n\twithList?: Subquery[];\n\tonConflict?: SQL;\n\treturning?: SelectedFieldsOrdered;\n\tselect?: boolean;\n\toverridingSystemValue_?: boolean;\n}\n\nexport type GelInsertValue<TTable extends GelTable<TableConfig>, OverrideT extends boolean = false> =\n\t& {\n\t\t[Key in keyof InferInsertModel<TTable, { dbColumnNames: false; override: OverrideT }>]:\n\t\t\t| InferInsertModel<TTable, { dbColumnNames: false; override: OverrideT }>[Key]\n\t\t\t| SQL\n\t\t\t| Placeholder;\n\t}\n\t& {};\n\nexport type GelInsertSelectQueryBuilder<TTable extends GelTable> = TypedQueryBuilder<\n\t{ [K in keyof TTable['$inferInsert']]: AnyGelColumn | SQL | SQL.Aliased | TTable['$inferInsert'][K] }\n>;\n\nexport class GelInsertBuilder<\n\tTTable extends GelTable,\n\tTQueryResult extends GelQueryResultHKT,\n\tOverrideT extends boolean = false,\n> {\n\tstatic readonly [entityKind]: string = 'GelInsertBuilder';\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: GelSession,\n\t\tprivate dialect: GelDialect,\n\t\tprivate withList?: Subquery[],\n\t\tprivate overridingSystemValue_?: boolean,\n\t) {}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\toverridingSystemValue(): Omit<GelInsertBuilder<TTable, TQueryResult, true>, 'overridingSystemValue'> {\n\t\tthis.overridingSystemValue_ = true;\n\t\treturn this as any;\n\t}\n\n\tvalues(value: GelInsertValue<TTable, OverrideT>): GelInsertBase<TTable, TQueryResult>;\n\tvalues(values: GelInsertValue<TTable, OverrideT>[]): GelInsertBase<TTable, TQueryResult>;\n\tvalues(\n\t\tvalues: GelInsertValue<TTable, OverrideT> | GelInsertValue<TTable, OverrideT>[],\n\t): GelInsertBase<TTable, TQueryResult> {\n\t\tvalues = Array.isArray(values) ? values : [values];\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('values() must be called with at least one value');\n\t\t}\n\t\tconst mappedValues = values.map((entry) => {\n\t\t\tconst result: Record<string, Param | SQL> = {};\n\t\t\tconst cols = this.table[Table.Symbol.Columns];\n\t\t\tfor (const colKey of Object.keys(entry)) {\n\t\t\t\tconst colValue = entry[colKey as keyof typeof entry];\n\t\t\t\tresult[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);\n\t\t\t}\n\t\t\treturn result;\n\t\t});\n\n\t\treturn new GelInsertBase(\n\t\t\tthis.table,\n\t\t\tmappedValues,\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t\tfalse,\n\t\t\tthis.overridingSystemValue_,\n\t\t);\n\t}\n\n\tselect(selectQuery: (qb: QueryBuilder) => GelInsertSelectQueryBuilder<TTable>): GelInsertBase<TTable, TQueryResult>;\n\tselect(selectQuery: (qb: QueryBuilder) => SQL): GelInsertBase<TTable, TQueryResult>;\n\tselect(selectQuery: SQL): GelInsertBase<TTable, TQueryResult>;\n\tselect(selectQuery: GelInsertSelectQueryBuilder<TTable>): GelInsertBase<TTable, TQueryResult>;\n\tselect(\n\t\tselectQuery:\n\t\t\t| SQL\n\t\t\t| GelInsertSelectQueryBuilder<TTable>\n\t\t\t| ((qb: QueryBuilder) => GelInsertSelectQueryBuilder<TTable> | SQL),\n\t): GelInsertBase<TTable, TQueryResult> {\n\t\tconst select = typeof selectQuery === 'function' ? selectQuery(new QueryBuilder()) : selectQuery;\n\n\t\tif (\n\t\t\t!is(select, SQL)\n\t\t\t&& !haveSameKeys(this.table[Columns], select._.selectedFields)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t'Insert select error: selected fields are not the same or are in a different order compared to the table definition',\n\t\t\t);\n\t\t}\n\n\t\treturn new GelInsertBase(this.table, select, this.session, this.dialect, this.withList, true);\n\t}\n}\n\nexport type GelInsertWithout<T extends AnyGelInsert, TDynamic extends boolean, K extends keyof T & string> =\n\tTDynamic extends true ? T\n\t\t: Omit<\n\t\t\tGelInsertBase<\n\t\t\t\tT['_']['table'],\n\t\t\t\tT['_']['queryResult'],\n\t\t\t\tT['_']['returning'],\n\t\t\t\tTDynamic,\n\t\t\t\tT['_']['excludedMethods'] | K\n\t\t\t>,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>;\n\nexport type GelInsertReturning<\n\tT extends AnyGelInsert,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = GelInsertBase<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tSelectResultFields<TSelectedFields>,\n\tTDynamic,\n\tT['_']['excludedMethods']\n>;\n\nexport type GelInsertReturningAll<T extends AnyGelInsert, TDynamic extends boolean> = GelInsertBase<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['table']['$inferSelect'],\n\tTDynamic,\n\tT['_']['excludedMethods']\n>;\n\nexport interface GelInsertOnConflictDoUpdateConfig<T extends AnyGelInsert> {\n\ttarget: IndexColumn | IndexColumn[];\n\t/** @deprecated use either `targetWhere` or `setWhere` */\n\twhere?: SQL;\n\t// TODO: add tests for targetWhere and setWhere\n\ttargetWhere?: SQL;\n\tsetWhere?: SQL;\n\tset: GelUpdateSetSource<T['_']['table']>;\n}\n\nexport type GelInsertPrepare<T extends AnyGelInsert> = GelPreparedQuery<\n\tPreparedQueryConfig & {\n\t\texecute: T['_']['returning'] extends undefined ? GelQueryResultKind<T['_']['queryResult'], never>\n\t\t\t: T['_']['returning'][];\n\t}\n>;\n\nexport type GelInsertDynamic<T extends AnyGelInsert> = GelInsert<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['returning']\n>;\n\nexport type AnyGelInsert = GelInsertBase<any, any, any, any, any>;\n\nexport type GelInsert<\n\tTTable extends GelTable = GelTable,\n\tTQueryResult extends GelQueryResultHKT = GelQueryResultHKT,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = GelInsertBase<TTable, TQueryResult, TReturning, true, never>;\n\nexport interface GelInsertBase<\n\tTTable extends GelTable,\n\tTQueryResult extends GelQueryResultHKT,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tQueryPromise<TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[], 'gel'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\treadonly dialect: 'gel';\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[];\n\t};\n}\n\nexport class GelInsertBase<\n\tTTable extends GelTable,\n\tTQueryResult extends GelQueryResultHKT,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[]>\n\timplements\n\t\tRunnableQuery<TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[], 'gel'>,\n\t\tSQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'GelInsert';\n\n\tprivate config: GelInsertConfig<TTable>;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tvalues: GelInsertConfig['values'],\n\t\tprivate session: GelSession,\n\t\tprivate dialect: GelDialect,\n\t\twithList?: Subquery[],\n\t\tselect?: boolean,\n\t\toverridingSystemValue_?: boolean,\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, values: values as any, withList, select, overridingSystemValue_ };\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the inserted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#insert-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and return all fields\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t *   .values({ brand: 'BMW' })\n\t *   .returning();\n\t *\n\t * // Insert one row and return only the id\n\t * const insertedCarId: { id: number }[] = await db.insert(cars)\n\t *   .values({ brand: 'BMW' })\n\t *   .returning({ id: cars.id });\n\t * ```\n\t */\n\treturning(): GelInsertWithout<GelInsertReturningAll<this, TDynamic>, TDynamic, 'returning'>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): GelInsertWithout<GelInsertReturning<this, TDynamic, TSelectedFields>, TDynamic, 'returning'>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.config.table[Table.Symbol.Columns],\n\t): GelInsertWithout<AnyGelInsert, TDynamic, 'returning'> {\n\t\tthis.config.returning = orderSelectedFields<GelColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `on conflict do nothing` clause to the query.\n\t *\n\t * Calling this method simply avoids inserting a row as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#on-conflict-do-nothing}\n\t *\n\t * @param config The `target` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and cancel the insert if there's a conflict\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onConflictDoNothing();\n\t *\n\t * // Explicitly specify conflict target\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onConflictDoNothing({ target: cars.id });\n\t * ```\n\t */\n\t// TODO not supported\n\t// onConflictDoNothing(\n\t// \tconfig: { target?: IndexColumn | IndexColumn[]; where?: SQL } = {},\n\t// ): GelInsertWithout<this, TDynamic, 'onConflictDoNothing' | 'onConflictDoUpdate'> {\n\t// \tif (config.target === undefined) {\n\t// \t\tthis.config.onConflict = sql`do nothing`;\n\t// \t} else {\n\t// \t\tlet targetColumn = '';\n\t// \t\ttargetColumn = Array.isArray(config.target)\n\t// \t\t\t? config.target.map((it) => this.dialect.escapeName(this.dialect.casing.getColumnCasing(it))).join(',')\n\t// \t\t\t: this.dialect.escapeName(this.dialect.casing.getColumnCasing(config.target));\n\n\t// \t\tconst whereSql = config.where ? sql` where ${config.where}` : undefined;\n\t// \t\tthis.config.onConflict = sql`(${sql.raw(targetColumn)})${whereSql} do nothing`;\n\t// \t}\n\t// \treturn this as any;\n\t// }\n\n\t/**\n\t * Adds an `on conflict do update` clause to the query.\n\t *\n\t * Calling this method will update the existing row that conflicts with the row proposed for insertion as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#upserts-and-conflicts}\n\t *\n\t * @param config The `target`, `set` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Update the row if there's a conflict\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onConflictDoUpdate({\n\t *     target: cars.id,\n\t *     set: { brand: 'Porsche' }\n\t *   });\n\t *\n\t * // Upsert with 'where' clause\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onConflictDoUpdate({\n\t *     target: cars.id,\n\t *     set: { brand: 'newBMW' },\n\t *     targetWhere: sql`${cars.createdAt} > '2023-01-01'::date`,\n\t *   });\n\t * ```\n\t */\n\t// TODO not supported\n\t// onConflictDoUpdate(\n\t// \tconfig: GelInsertOnConflictDoUpdateConfig<this>,\n\t// ): GelInsertWithout<this, TDynamic, 'onConflictDoNothing' | 'onConflictDoUpdate'> {\n\t// \tif (config.where && (config.targetWhere || config.setWhere)) {\n\t// \t\tthrow new Error(\n\t// \t\t\t'You cannot use both \"where\" and \"targetWhere\"/\"setWhere\" at the same time - \"where\" is deprecated, use \"targetWhere\" or \"setWhere\" instead.',\n\t// \t\t);\n\t// \t}\n\t// \tconst whereSql = config.where ? sql` where ${config.where}` : undefined;\n\t// \tconst targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;\n\t// \tconst setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;\n\t// \tconst setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));\n\t// \tlet targetColumn = '';\n\t// \ttargetColumn = Array.isArray(config.target)\n\t// \t\t? config.target.map((it) => this.dialect.escapeName(this.dialect.casing.getColumnCasing(it))).join(',')\n\t// \t\t: this.dialect.escapeName(this.dialect.casing.getColumnCasing(config.target));\n\t// \tthis.config.onConflict = sql`(${\n\t// \t\tsql.raw(targetColumn)\n\t// \t})${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`;\n\t// \treturn this as any;\n\t// }\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildInsertQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): GelInsertPrepare<this> {\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\treturn this.session.prepareQuery<\n\t\t\t\tPreparedQueryConfig & {\n\t\t\t\t\texecute: TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[];\n\t\t\t\t}\n\t\t\t>(this.dialect.sqlToQuery(this.getSQL()), this.config.returning, name, true, undefined, {\n\t\t\t\ttype: 'insert',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t});\n\t\t});\n\t}\n\n\tprepare(name: string): GelInsertPrepare<this> {\n\t\treturn this._prepare(name);\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(placeholderValues);\n\t\t});\n\t};\n\n\t$dynamic(): GelInsertDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/query-builders/query-builder.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\nimport type { GelDialectConfig } from '~/gel-core/dialect.ts';\nimport { GelDialect } from '~/gel-core/dialect.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQLWrapper } from '~/sql/sql.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { GelColumn } from '../columns/index.ts';\nimport type { WithSubqueryWithSelection } from '../subquery.ts';\nimport { GelSelectBuilder } from './select.ts';\nimport type { SelectedFields } from './select.types.ts';\n\nexport class QueryBuilder {\n\tstatic readonly [entityKind]: string = 'GelQueryBuilder';\n\n\tprivate dialect: GelDialect | undefined;\n\tprivate dialectConfig: GelDialectConfig | undefined;\n\n\tconstructor(dialect?: GelDialect | GelDialectConfig) {\n\t\tthis.dialect = is(dialect, GelDialect) ? dialect : undefined;\n\t\tthis.dialectConfig = is(dialect, GelDialect) ? undefined : dialect;\n\t}\n\n\t$with<TAlias extends string>(alias: TAlias) {\n\t\tconst queryBuilder = this;\n\n\t\treturn {\n\t\t\tas<TSelection extends ColumnsSelection>(\n\t\t\t\tqb: TypedQueryBuilder<TSelection> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelection>),\n\t\t\t): WithSubqueryWithSelection<TSelection, TAlias> {\n\t\t\t\tif (typeof qb === 'function') {\n\t\t\t\t\tqb = qb(queryBuilder);\n\t\t\t\t}\n\n\t\t\t\treturn new Proxy(\n\t\t\t\t\tnew WithSubquery(qb.getSQL(), qb.getSelectedFields() as SelectedFields, alias, true),\n\t\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t\t) as WithSubqueryWithSelection<TSelection, TAlias>;\n\t\t\t},\n\t\t};\n\t}\n\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\tfunction select(): GelSelectBuilder<undefined, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(fields: TSelection): GelSelectBuilder<TSelection, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): GelSelectBuilder<TSelection | undefined, 'qb'> {\n\t\t\treturn new GelSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\tfunction selectDistinct(): GelSelectBuilder<undefined, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(fields: TSelection): GelSelectBuilder<TSelection, 'qb'>;\n\t\tfunction selectDistinct(fields?: SelectedFields): GelSelectBuilder<SelectedFields | undefined, 'qb'> {\n\t\t\treturn new GelSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\tfunction selectDistinctOn(on: (GelColumn | SQLWrapper)[]): GelSelectBuilder<undefined, 'qb'>;\n\t\tfunction selectDistinctOn<TSelection extends SelectedFields>(\n\t\t\ton: (GelColumn | SQLWrapper)[],\n\t\t\tfields: TSelection,\n\t\t): GelSelectBuilder<TSelection, 'qb'>;\n\t\tfunction selectDistinctOn(\n\t\t\ton: (GelColumn | SQLWrapper)[],\n\t\t\tfields?: SelectedFields,\n\t\t): GelSelectBuilder<SelectedFields | undefined, 'qb'> {\n\t\t\treturn new GelSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\tdistinct: { on },\n\t\t\t});\n\t\t}\n\n\t\treturn { select, selectDistinct, selectDistinctOn };\n\t}\n\n\tselect(): GelSelectBuilder<undefined, 'qb'>;\n\tselect<TSelection extends SelectedFields>(fields: TSelection): GelSelectBuilder<TSelection, 'qb'>;\n\tselect<TSelection extends SelectedFields>(fields?: TSelection): GelSelectBuilder<TSelection | undefined, 'qb'> {\n\t\treturn new GelSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t});\n\t}\n\n\tselectDistinct(): GelSelectBuilder<undefined>;\n\tselectDistinct<TSelection extends SelectedFields>(fields: TSelection): GelSelectBuilder<TSelection>;\n\tselectDistinct(fields?: SelectedFields): GelSelectBuilder<SelectedFields | undefined> {\n\t\treturn new GelSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\tselectDistinctOn(on: (GelColumn | SQLWrapper)[]): GelSelectBuilder<undefined>;\n\tselectDistinctOn<TSelection extends SelectedFields>(\n\t\ton: (GelColumn | SQLWrapper)[],\n\t\tfields: TSelection,\n\t): GelSelectBuilder<TSelection>;\n\tselectDistinctOn(\n\t\ton: (GelColumn | SQLWrapper)[],\n\t\tfields?: SelectedFields,\n\t): GelSelectBuilder<SelectedFields | undefined> {\n\t\treturn new GelSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t\tdistinct: { on },\n\t\t});\n\t}\n\n\t// Lazy load dialect to avoid circular dependency\n\tprivate getDialect() {\n\t\tif (!this.dialect) {\n\t\t\tthis.dialect = new GelDialect(this.dialectConfig);\n\t\t}\n\n\t\treturn this.dialect;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/query-builders/query.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport {\n\ttype BuildQueryResult,\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tmapRelationalRow,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Query, QueryWithTypings, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { KnownKeysOnly } from '~/utils.ts';\nimport type { GelDialect } from '../dialect.ts';\nimport type { GelPreparedQuery, GelSession, PreparedQueryConfig } from '../session.ts';\nimport type { GelTable } from '../table.ts';\n\nexport class RelationalQueryBuilder<TSchema extends TablesRelationalConfig, TFields extends TableRelationalConfig> {\n\tstatic readonly [entityKind]: string = 'GelRelationalQueryBuilder';\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: TSchema,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\tprivate table: GelTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: GelDialect,\n\t\tprivate session: GelSession,\n\t) {}\n\n\tfindMany<TConfig extends DBQueryConfig<'many', true, TSchema, TFields>>(\n\t\tconfig?: KnownKeysOnly<TConfig, DBQueryConfig<'many', true, TSchema, TFields>>,\n\t): GelRelationalQuery<BuildQueryResult<TSchema, TFields, TConfig>[]> {\n\t\treturn new GelRelationalQuery(\n\t\t\tthis.fullSchema,\n\t\t\tthis.schema,\n\t\t\tthis.tableNamesMap,\n\t\t\tthis.table,\n\t\t\tthis.tableConfig,\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tconfig ? (config as DBQueryConfig<'many', true>) : {},\n\t\t\t'many',\n\t\t);\n\t}\n\n\tfindFirst<TSelection extends Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>(\n\t\tconfig?: KnownKeysOnly<TSelection, Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>,\n\t): GelRelationalQuery<BuildQueryResult<TSchema, TFields, TSelection> | undefined> {\n\t\treturn new GelRelationalQuery(\n\t\t\tthis.fullSchema,\n\t\t\tthis.schema,\n\t\t\tthis.tableNamesMap,\n\t\t\tthis.table,\n\t\t\tthis.tableConfig,\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tconfig ? { ...(config as DBQueryConfig<'many', true> | undefined), limit: 1 } : { limit: 1 },\n\t\t\t'first',\n\t\t);\n\t}\n}\n\nexport class GelRelationalQuery<TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'gel'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'GelRelationalQuery';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'gel';\n\t\treadonly result: TResult;\n\t};\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: TablesRelationalConfig,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\tprivate table: GelTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: GelDialect,\n\t\tprivate session: GelSession,\n\t\tprivate config: DBQueryConfig<'many', true> | true,\n\t\tprivate mode: 'many' | 'first',\n\t) {\n\t\tsuper();\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): GelPreparedQuery<PreparedQueryConfig & { execute: TResult }> {\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\tconst { query, builtQuery } = this._toSQL();\n\n\t\t\treturn this.session.prepareQuery<PreparedQueryConfig & { execute: TResult }>(\n\t\t\t\tbuiltQuery,\n\t\t\t\tundefined,\n\t\t\t\tname,\n\t\t\t\ttrue,\n\t\t\t\t(rawRows, mapColumnValue) => {\n\t\t\t\t\tconst rows = rawRows.map((row) =>\n\t\t\t\t\t\tmapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue)\n\t\t\t\t\t);\n\t\t\t\t\tif (this.mode === 'first') {\n\t\t\t\t\t\treturn rows[0] as TResult;\n\t\t\t\t\t}\n\t\t\t\t\treturn rows as TResult;\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n\n\tprepare(name: string): GelPreparedQuery<PreparedQueryConfig & { execute: TResult }> {\n\t\treturn this._prepare(name);\n\t}\n\n\tprivate _getQuery() {\n\t\treturn this.dialect.buildRelationalQueryWithoutPK({\n\t\t\tfullSchema: this.fullSchema,\n\t\t\tschema: this.schema,\n\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t});\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this._getQuery().sql as SQL;\n\t}\n\n\tprivate _toSQL(): { query: BuildRelationalQueryResult; builtQuery: QueryWithTypings } {\n\t\tconst query = this._getQuery();\n\n\t\tconst builtQuery = this.dialect.sqlToQuery(query.sql as SQL);\n\n\t\treturn { query, builtQuery };\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this._toSQL().builtQuery;\n\t}\n\n\toverride execute(): Promise<TResult> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(undefined);\n\t\t});\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/query-builders/raw.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { Query, SQL, SQLWrapper } from '~/sql/sql.ts';\n\nexport interface GelRaw<TResult> extends QueryPromise<TResult>, RunnableQuery<TResult, 'gel'>, SQLWrapper {}\n\nexport class GelRaw<TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'gel'>, SQLWrapper, PreparedQuery\n{\n\tstatic override readonly [entityKind]: string = 'GelRaw';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'gel';\n\t\treadonly result: TResult;\n\t};\n\n\tconstructor(\n\t\tpublic execute: () => Promise<TResult>,\n\t\tprivate sql: SQL,\n\t\tprivate query: Query,\n\t\tprivate mapBatchResult: (result: unknown) => unknown,\n\t) {\n\t\tsuper();\n\t}\n\n\t/** @internal */\n\tgetSQL() {\n\t\treturn this.sql;\n\t}\n\n\tgetQuery() {\n\t\treturn this.query;\n\t}\n\n\tmapResult(result: unknown, isFromBatch?: boolean) {\n\t\treturn isFromBatch ? this.mapBatchResult(result) : result;\n\t}\n\n\t_prepare(): PreparedQuery {\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode() {\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/query-builders/refresh-materialized-view.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { GelDialect } from '~/gel-core/dialect.ts';\nimport type {\n\tGelPreparedQuery,\n\tGelQueryResultHKT,\n\tGelQueryResultKind,\n\tGelSession,\n\tPreparedQueryConfig,\n} from '~/gel-core/session.ts';\nimport type { GelMaterializedView } from '~/gel-core/view.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface GelRefreshMaterializedView<TQueryResult extends GelQueryResultHKT>\n\textends\n\t\tQueryPromise<GelQueryResultKind<TQueryResult, never>>,\n\t\tRunnableQuery<GelQueryResultKind<TQueryResult, never>, 'gel'>,\n\t\tSQLWrapper\n{\n\treadonly _: {\n\t\treadonly dialect: 'gel';\n\t\treadonly result: GelQueryResultKind<TQueryResult, never>;\n\t};\n}\n\nexport class GelRefreshMaterializedView<TQueryResult extends GelQueryResultHKT>\n\textends QueryPromise<GelQueryResultKind<TQueryResult, never>>\n\timplements RunnableQuery<GelQueryResultKind<TQueryResult, never>, 'gel'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'GelRefreshMaterializedView';\n\n\tprivate config: {\n\t\tview: GelMaterializedView;\n\t\tconcurrently?: boolean;\n\t\twithNoData?: boolean;\n\t};\n\n\tconstructor(\n\t\tview: GelMaterializedView,\n\t\tprivate session: GelSession,\n\t\tprivate dialect: GelDialect,\n\t) {\n\t\tsuper();\n\t\tthis.config = { view };\n\t}\n\n\tconcurrently(): this {\n\t\tif (this.config.withNoData !== undefined) {\n\t\t\tthrow new Error('Cannot use concurrently and withNoData together');\n\t\t}\n\t\tthis.config.concurrently = true;\n\t\treturn this;\n\t}\n\n\twithNoData(): this {\n\t\tif (this.config.concurrently !== undefined) {\n\t\t\tthrow new Error('Cannot use concurrently and withNoData together');\n\t\t}\n\t\tthis.config.withNoData = true;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildRefreshMaterializedViewQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): GelPreparedQuery<\n\t\tPreparedQueryConfig & {\n\t\t\texecute: GelQueryResultKind<TQueryResult, never>;\n\t\t}\n\t> {\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\treturn this.session.prepareQuery(this.dialect.sqlToQuery(this.getSQL()), undefined, name, true);\n\t\t});\n\t}\n\n\tprepare(name: string): GelPreparedQuery<\n\t\tPreparedQueryConfig & {\n\t\t\texecute: GelQueryResultKind<TQueryResult, never>;\n\t\t}\n\t> {\n\t\treturn this._prepare(name);\n\t}\n\n\texecute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(placeholderValues);\n\t\t});\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/query-builders/select.ts",
    "content": "import type { CacheConfig, WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { GelColumn } from '~/gel-core/columns/index.ts';\nimport type { GelDialect } from '~/gel-core/dialect.ts';\nimport type { GelSession, PreparedQueryConfig } from '~/gel-core/session.ts';\nimport type { SubqueryWithSelection } from '~/gel-core/subquery.ts';\nimport type { GelTable } from '~/gel-core/table.ts';\nimport { GelViewBase } from '~/gel-core/view-base.ts';\nimport { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tGetSelectTableSelection,\n\tJoinNullability,\n\tJoinType,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { SQL, View } from '~/sql/sql.ts';\nimport type { ColumnsSelection, Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { tracer } from '~/tracing.ts';\nimport {\n\tapplyMixins,\n\tgetTableColumns,\n\tgetTableLikeName,\n\thaveSameKeys,\n\ttype NeonAuthToken,\n\ttype ValueOrArray,\n} from '~/utils.ts';\nimport { orderSelectedFields } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type {\n\tAnyGelSelect,\n\tCreateGelSelectFromBuilderMode,\n\tGelCreateSetOperatorFn,\n\tGelSelectConfig,\n\tGelSelectCrossJoinFn,\n\tGelSelectDynamic,\n\tGelSelectHKT,\n\tGelSelectHKTBase,\n\tGelSelectJoinFn,\n\tGelSelectPrepare,\n\tGelSelectWithout,\n\tGelSetOperatorExcludedMethods,\n\tGelSetOperatorWithResult,\n\tGetGelSetOperators,\n\tLockConfig,\n\tLockStrength,\n\tSelectedFields,\n\tSetOperatorRightSelect,\n} from './select.types.ts';\n\nexport class GelSelectBuilder<\n\tTSelection extends SelectedFields | undefined,\n\tTBuilderMode extends 'db' | 'qb' = 'db',\n> {\n\tstatic readonly [entityKind]: string = 'GelSelectBuilder';\n\n\tprivate fields: TSelection;\n\tprivate session: GelSession | undefined;\n\tprivate dialect: GelDialect;\n\tprivate withList: Subquery[] = [];\n\tprivate distinct: boolean | {\n\t\ton: (GelColumn | SQLWrapper)[];\n\t} | undefined;\n\n\tconstructor(\n\t\tconfig: {\n\t\t\tfields: TSelection;\n\t\t\tsession: GelSession | undefined;\n\t\t\tdialect: GelDialect;\n\t\t\twithList?: Subquery[];\n\t\t\tdistinct?: boolean | {\n\t\t\t\ton: (GelColumn | SQLWrapper)[];\n\t\t\t};\n\t\t},\n\t) {\n\t\tthis.fields = config.fields;\n\t\tthis.session = config.session;\n\t\tthis.dialect = config.dialect;\n\t\tif (config.withList) {\n\t\t\tthis.withList = config.withList;\n\t\t}\n\t\tthis.distinct = config.distinct;\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Specify the table, subquery, or other target that you're\n\t * building a select query against.\n\t *\n\t * {@link https://www.postgresql.org/docs/current/sql-select.html#SQL-FROM | Postgres from documentation}\n\t */\n\tfrom<TFrom extends GelTable | Subquery | GelViewBase | SQL>(\n\t\tsource: TFrom,\n\t): CreateGelSelectFromBuilderMode<\n\t\tTBuilderMode,\n\t\tGetSelectTableName<TFrom>,\n\t\tTSelection extends undefined ? GetSelectTableSelection<TFrom> : TSelection,\n\t\tTSelection extends undefined ? 'single' : 'partial'\n\t> {\n\t\tconst isPartialSelect = !!this.fields;\n\n\t\tlet fields: SelectedFields;\n\t\tif (this.fields) {\n\t\t\tfields = this.fields;\n\t\t} else if (is(source, Subquery)) {\n\t\t\t// This is required to use the proxy handler to get the correct field values from the subquery\n\t\t\tfields = Object.fromEntries(\n\t\t\t\tObject.keys(source._.selectedFields).map((\n\t\t\t\t\tkey,\n\t\t\t\t) => [key, source[key as unknown as keyof typeof source] as unknown as SelectedFields[string]]),\n\t\t\t);\n\t\t} else if (is(source, GelViewBase)) {\n\t\t\tfields = source[ViewBaseConfig].selectedFields as SelectedFields;\n\t\t} else if (is(source, SQL)) {\n\t\t\tfields = {};\n\t\t} else {\n\t\t\tfields = getTableColumns<GelTable>(source);\n\t\t}\n\n\t\treturn new GelSelectBase({\n\t\t\ttable: source,\n\t\t\tfields,\n\t\t\tisPartialSelect,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\twithList: this.withList,\n\t\t\tdistinct: this.distinct,\n\t\t}) as any;\n\t}\n}\n\nexport abstract class GelSelectQueryBuilderBase<\n\tTHKT extends GelSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends TypedQueryBuilder<TSelectedFields, TResult> {\n\tstatic override readonly [entityKind]: string = 'GelSelectQueryBuilder';\n\n\toverride readonly _: {\n\t\treadonly dialect: 'gel';\n\t\treadonly hkt: THKT;\n\t\treadonly tableName: TTableName;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t\treadonly config: GelSelectConfig;\n\t};\n\n\tprotected config: GelSelectConfig;\n\tprotected joinsNotNullableMap: Record<string, boolean>;\n\tprivate tableName: string | undefined;\n\tprivate isPartialSelect: boolean;\n\tprotected session: GelSession | undefined;\n\tprotected dialect: GelDialect;\n\tprotected cacheConfig?: WithCacheConfig = undefined;\n\tprotected usedTables: Set<string> = new Set();\n\n\tconstructor(\n\t\t{ table, fields, isPartialSelect, session, dialect, withList, distinct }: {\n\t\t\ttable: GelSelectConfig['table'];\n\t\t\tfields: GelSelectConfig['fields'];\n\t\t\tisPartialSelect: boolean;\n\t\t\tsession: GelSession | undefined;\n\t\t\tdialect: GelDialect;\n\t\t\twithList: Subquery[];\n\t\t\tdistinct: boolean | {\n\t\t\t\ton: (GelColumn | SQLWrapper)[];\n\t\t\t} | undefined;\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis.config = {\n\t\t\twithList,\n\t\t\ttable,\n\t\t\tfields: { ...fields },\n\t\t\tdistinct,\n\t\t\tsetOperators: [],\n\t\t};\n\t\tthis.isPartialSelect = isPartialSelect;\n\t\tthis.session = session;\n\t\tthis.dialect = dialect;\n\t\tthis._ = {\n\t\t\tselectedFields: fields as TSelectedFields,\n\t\t\tconfig: this.config,\n\t\t} as this['_'];\n\t\tthis.tableName = getTableLikeName(table);\n\t\tthis.joinsNotNullableMap = typeof this.tableName === 'string' ? { [this.tableName]: true } : {};\n\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\t}\n\n\t/** @internal */\n\tgetUsedTables() {\n\t\treturn [...this.usedTables];\n\t}\n\n\tprivate createJoin<\n\t\tTJoinType extends JoinType,\n\t\tTIsLateral extends (TJoinType extends 'full' | 'right' ? false : boolean),\n\t>(\n\t\tjoinType: TJoinType,\n\t\tlateral: TIsLateral,\n\t): 'cross' extends TJoinType ? GelSelectCrossJoinFn<this, TDynamic, TIsLateral>\n\t\t: GelSelectJoinFn<this, TDynamic, TJoinType, TIsLateral>\n\t{\n\t\treturn ((\n\t\t\ttable: GelTable | Subquery | GelViewBase | SQL,\n\t\t\ton?: ((aliases: TSelection) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst baseTableName = this.tableName;\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins?.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\t// store all tables used in a query\n\t\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\n\t\t\tif (!this.isPartialSelect) {\n\t\t\t\t// If this is the first join and this is not a partial select and we're not selecting from raw SQL, \"move\" the fields from the main table to the nested object\n\t\t\t\tif (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === 'string') {\n\t\t\t\t\tthis.config.fields = {\n\t\t\t\t\t\t[baseTableName]: this.config.fields,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (typeof tableName === 'string' && !is(table, SQL)) {\n\t\t\t\t\tconst selection = is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t: is(table, View)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields\n\t\t\t\t\t\t: table[Table.Symbol.Columns];\n\t\t\t\t\tthis.config.fields[tableName] = selection;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.fields,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as TSelection,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (!this.config.joins) {\n\t\t\t\tthis.config.joins = [];\n\t\t\t}\n\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName, lateral });\n\n\t\t\tif (typeof tableName === 'string') {\n\t\t\t\tswitch (joinType) {\n\t\t\t\t\tcase 'left': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'right': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'cross':\n\t\t\t\t\tcase 'inner': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'full': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this as any;\n\t\t}) as any;\n\t}\n\n\t/**\n\t * Executes a `left join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet | null; }[] = await db.select()\n\t *   .from(users)\n\t *   .leftJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number | null; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .leftJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tleftJoin = this.createJoin('left', false);\n\n\t/**\n\t * Executes a `left join lateral` operation by adding subquery to the current query.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join-lateral}\n\t *\n\t * @param table the subquery to join.\n\t * @param on the `on` clause.\n\t */\n\tleftJoinLateral = this.createJoin('left', true);\n\n\t/**\n\t * Executes a `right join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the joined table with the corresponding row from the main table, if a match is found. If no matching row exists, it sets all columns of the main table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#right-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .rightJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .rightJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\trightJoin = this.createJoin('right', false);\n\n\t/**\n\t * Executes an `inner join` operation, creating a new table by combining rows from two tables that have matching values.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .innerJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .innerJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tinnerJoin = this.createJoin('inner', false);\n\n\t/**\n\t * Executes an `inner join lateral` operation, creating a new table by combining rows from two queries that have matching values.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join-lateral}\n\t *\n\t * @param table the subquery to join.\n\t * @param on the `on` clause.\n\t */\n\tinnerJoinLateral = this.createJoin('inner', true);\n\n\t/**\n\t * Executes a `full join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging rows with matching values and filling in `null` for non-matching columns.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#full-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet | null; }[] = await db.select()\n\t *   .from(users)\n\t *   .fullJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number | null; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .fullJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tfullJoin = this.createJoin('full', false);\n\n\t/**\n\t * Executes a `cross join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging all rows from each table.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join}\n\t *\n\t * @param table the table to join.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users, each user with every pet\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .crossJoin(pets)\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .crossJoin(pets)\n\t * ```\n\t */\n\tcrossJoin = this.createJoin('cross', false);\n\n\t/**\n\t * Executes a `cross join lateral` operation by combining rows from two queries into a new table.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method retrieves all rows from both main and joined queries, merging all rows from each query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join-lateral}\n\t *\n\t * @param table the query to join.\n\t */\n\tcrossJoinLateral = this.createJoin('cross', true);\n\n\tprivate createSetOperator(\n\t\ttype: SetOperator,\n\t\tisAll: boolean,\n\t): <TValue extends GelSetOperatorWithResult<TResult>>(\n\t\trightSelection:\n\t\t\t| ((setOperators: GetGelSetOperators) => SetOperatorRightSelect<TValue, TResult>)\n\t\t\t| SetOperatorRightSelect<TValue, TResult>,\n\t) => GelSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tGelSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\treturn (rightSelection) => {\n\t\t\tconst rightSelect = (typeof rightSelection === 'function'\n\t\t\t\t? rightSelection(getGelSetOperators())\n\t\t\t\t: rightSelection) as TypedQueryBuilder<\n\t\t\t\t\tany,\n\t\t\t\t\tTResult\n\t\t\t\t>;\n\n\t\t\tif (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.setOperators.push({ type, isAll, rightSelect });\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Adds `union` set operator to the query.\n\t *\n\t * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all unique names from customers and users tables\n\t * await db.select({ name: users.name })\n\t *   .from(users)\n\t *   .union(\n\t *     db.select({ name: customers.name }).from(customers)\n\t *   );\n\t * // or\n\t * import { union } from 'drizzle-orm/gel-core'\n\t *\n\t * await union(\n\t *   db.select({ name: users.name }).from(users),\n\t *   db.select({ name: customers.name }).from(customers)\n\t * );\n\t * ```\n\t */\n\tunion = this.createSetOperator('union', false);\n\n\t/**\n\t * Adds `union all` set operator to the query.\n\t *\n\t * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all transaction ids from both online and in-store sales\n\t * await db.select({ transaction: onlineSales.transactionId })\n\t *   .from(onlineSales)\n\t *   .unionAll(\n\t *     db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t *   );\n\t * // or\n\t * import { unionAll } from 'drizzle-orm/gel-core'\n\t *\n\t * await unionAll(\n\t *   db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n\t *   db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t * );\n\t * ```\n\t */\n\tunionAll = this.createSetOperator('union', true);\n\n\t/**\n\t * Adds `intersect` set operator to the query.\n\t *\n\t * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select course names that are offered in both departments A and B\n\t * await db.select({ courseName: depA.courseName })\n\t *   .from(depA)\n\t *   .intersect(\n\t *     db.select({ courseName: depB.courseName }).from(depB)\n\t *   );\n\t * // or\n\t * import { intersect } from 'drizzle-orm/gel-core'\n\t *\n\t * await intersect(\n\t *   db.select({ courseName: depA.courseName }).from(depA),\n\t *   db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\tintersect = this.createSetOperator('intersect', false);\n\n\t/**\n\t * Adds `intersect all` set operator to the query.\n\t *\n\t * Calling this method will retain only the rows that are present in both result sets including all duplicates.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all products and quantities that are ordered by both regular and VIP customers\n\t * await db.select({\n\t *   productId: regularCustomerOrders.productId,\n\t *   quantityOrdered: regularCustomerOrders.quantityOrdered\n\t * })\n\t * .from(regularCustomerOrders)\n\t * .intersectAll(\n\t *   db.select({\n\t *     productId: vipCustomerOrders.productId,\n\t *     quantityOrdered: vipCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(vipCustomerOrders)\n\t * );\n\t * // or\n\t * import { intersectAll } from 'drizzle-orm/gel-core'\n\t *\n\t * await intersectAll(\n\t *   db.select({\n\t *     productId: regularCustomerOrders.productId,\n\t *     quantityOrdered: regularCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(regularCustomerOrders),\n\t *   db.select({\n\t *     productId: vipCustomerOrders.productId,\n\t *     quantityOrdered: vipCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(vipCustomerOrders)\n\t * );\n\t * ```\n\t */\n\tintersectAll = this.createSetOperator('intersect', true);\n\n\t/**\n\t * Adds `except` set operator to the query.\n\t *\n\t * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all courses offered in department A but not in department B\n\t * await db.select({ courseName: depA.courseName })\n\t *   .from(depA)\n\t *   .except(\n\t *     db.select({ courseName: depB.courseName }).from(depB)\n\t *   );\n\t * // or\n\t * import { except } from 'drizzle-orm/gel-core'\n\t *\n\t * await except(\n\t *   db.select({ courseName: depA.courseName }).from(depA),\n\t *   db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\texcept = this.createSetOperator('except', false);\n\n\t/**\n\t * Adds `except all` set operator to the query.\n\t *\n\t * Calling this method will retrieve all rows from the left query, except for the rows that are present in the result set of the right query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#except-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all products that are ordered by regular customers but not by VIP customers\n\t * await db.select({\n\t *   productId: regularCustomerOrders.productId,\n\t *   quantityOrdered: regularCustomerOrders.quantityOrdered,\n\t * })\n\t * .from(regularCustomerOrders)\n\t * .exceptAll(\n\t *   db.select({\n\t *     productId: vipCustomerOrders.productId,\n\t *     quantityOrdered: vipCustomerOrders.quantityOrdered,\n\t *   })\n\t *   .from(vipCustomerOrders)\n\t * );\n\t * // or\n\t * import { exceptAll } from 'drizzle-orm/gel-core'\n\t *\n\t * await exceptAll(\n\t *   db.select({\n\t *     productId: regularCustomerOrders.productId,\n\t *     quantityOrdered: regularCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(regularCustomerOrders),\n\t *   db.select({\n\t *     productId: vipCustomerOrders.productId,\n\t *     quantityOrdered: vipCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(vipCustomerOrders)\n\t * );\n\t * ```\n\t */\n\texceptAll = this.createSetOperator('except', true);\n\n\t/** @internal */\n\taddSetOperators(setOperators: GelSelectConfig['setOperators']): GelSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tGelSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\tthis.config.setOperators.push(...setOperators);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#filtering}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be selected.\n\t *\n\t * ```ts\n\t * // Select all cars with green color\n\t * await db.select().from(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.select().from(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Select all BMW cars with a green color\n\t * await db.select().from(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Select all cars with the green or blue color\n\t * await db.select().from(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(\n\t\twhere: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): GelSelectWithout<this, TDynamic, 'where'> {\n\t\tif (typeof where === 'function') {\n\t\t\twhere = where(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `having` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition. It is typically used with aggregate functions to filter the aggregated data based on a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @param having the `having` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all brands with more than one car\n\t * await db.select({\n\t * \tbrand: cars.brand,\n\t * \tcount: sql<number>`cast(count(${cars.id}) as int)`,\n\t * })\n\t *   .from(cars)\n\t *   .groupBy(cars.brand)\n\t *   .having(({ count }) => gt(count, 1));\n\t * ```\n\t */\n\thaving(\n\t\thaving: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): GelSelectWithout<this, TDynamic, 'having'> {\n\t\tif (typeof having === 'function') {\n\t\t\thaving = having(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.having = having;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `group by` clause to the query.\n\t *\n\t * Calling this method will group rows that have the same values into summary rows, often used for aggregation purposes.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Group and count people by their last names\n\t * await db.select({\n\t *    lastName: people.lastName,\n\t *    count: sql<number>`cast(count(*) as int)`\n\t * })\n\t *   .from(people)\n\t *   .groupBy(people.lastName);\n\t * ```\n\t */\n\tgroupBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<GelColumn | SQL | SQL.Aliased>,\n\t): GelSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(...columns: (GelColumn | SQL | SQL.Aliased)[]): GelSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<GelColumn | SQL | SQL.Aliased>]\n\t\t\t| (GelColumn | SQL | SQL.Aliased)[]\n\t): GelSelectWithout<this, TDynamic, 'groupBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst groupBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t\tthis.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];\n\t\t} else {\n\t\t\tthis.config.groupBy = columns as (GelColumn | SQL | SQL.Aliased)[];\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `order by` clause to the query.\n\t *\n\t * Calling this method will sort the result-set in ascending or descending order. By default, the sort order is ascending.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#order-by}\n\t *\n\t * @example\n\t *\n\t * ```\n\t * // Select cars ordered by year\n\t * await db.select().from(cars).orderBy(cars.year);\n\t * ```\n\t *\n\t * You can specify whether results are in ascending or descending order with the `asc()` and `desc()` operators.\n\t *\n\t * ```ts\n\t * // Select cars ordered by year in descending order\n\t * await db.select().from(cars).orderBy(desc(cars.year));\n\t *\n\t * // Select cars ordered by year and price\n\t * await db.select().from(cars).orderBy(asc(cars.year), desc(cars.price));\n\t * ```\n\t */\n\torderBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<GelColumn | SQL | SQL.Aliased>,\n\t): GelSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (GelColumn | SQL | SQL.Aliased)[]): GelSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<GelColumn | SQL | SQL.Aliased>]\n\t\t\t| (GelColumn | SQL | SQL.Aliased)[]\n\t): GelSelectWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t} else {\n\t\t\tconst orderByArray = columns as (GelColumn | SQL | SQL.Aliased)[];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `limit` clause to the query.\n\t *\n\t * Calling this method will set the maximum number of rows that will be returned by this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param limit the `limit` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the first 10 people from this query.\n\t * await db.select().from(people).limit(10);\n\t * ```\n\t */\n\tlimit(limit: number | Placeholder): GelSelectWithout<this, TDynamic, 'limit'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.limit = limit;\n\t\t} else {\n\t\t\tthis.config.limit = limit;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `offset` clause to the query.\n\t *\n\t * Calling this method will skip a number of rows when returning results from this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param offset the `offset` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the 10th-20th people from this query.\n\t * await db.select().from(people).offset(10).limit(10);\n\t * ```\n\t */\n\toffset(offset: number | Placeholder): GelSelectWithout<this, TDynamic, 'offset'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.offset = offset;\n\t\t} else {\n\t\t\tthis.config.offset = offset;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `for` clause to the query.\n\t *\n\t * Calling this method will specify a lock strength for this query that controls how strictly it acquires exclusive access to the rows being queried.\n\t *\n\t * See docs: {@link https://www.postgresql.org/docs/current/sql-select.html#SQL-FOR-UPDATE-SHARE}\n\t *\n\t * @param strength the lock strength.\n\t * @param config the lock configuration.\n\t */\n\tfor(strength: LockStrength, config: LockConfig = {}): GelSelectWithout<this, TDynamic, 'for'> {\n\t\tthis.config.lockingClause = { strength, config };\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildSelectQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\tas<TAlias extends string>(\n\t\talias: TAlias,\n\t): SubqueryWithSelection<this['_']['selectedFields'], TAlias> {\n\t\tconst usedTables: string[] = [];\n\t\tusedTables.push(...extractUsedTable(this.config.table));\n\t\tif (this.config.joins) { for (const it of this.config.joins) usedTables.push(...extractUsedTable(it.table)); }\n\n\t\treturn new Proxy(\n\t\t\tnew Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]),\n\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as SubqueryWithSelection<this['_']['selectedFields'], TAlias>;\n\t}\n\n\t/** @internal */\n\toverride getSelectedFields(): this['_']['selectedFields'] {\n\t\treturn new Proxy(\n\t\t\tthis.config.fields,\n\t\t\tnew SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): GelSelectDynamic<this> {\n\t\treturn this;\n\t}\n}\n\nexport interface GelSelectBase<\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends\n\tGelSelectQueryBuilderBase<\n\t\tGelSelectHKT,\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tQueryPromise<TResult>,\n\tSQLWrapper\n{}\n\nexport class GelSelectBase<\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends GelSelectQueryBuilderBase<\n\tGelSelectHKT,\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTNullabilityMap,\n\tTDynamic,\n\tTExcludedMethods,\n\tTResult,\n\tTSelectedFields\n> implements RunnableQuery<TResult, 'gel'>, SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'GelSelect';\n\n\t/** @internal */\n\t_prepare(name?: string): GelSelectPrepare<this> {\n\t\tconst { session, config, dialect, joinsNotNullableMap, cacheConfig, usedTables } = this;\n\t\tif (!session) {\n\t\t\tthrow new Error('Cannot execute a query on a query builder. Please use a database instance instead.');\n\t\t}\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\tconst fieldsList = orderSelectedFields<GelColumn>(config.fields);\n\t\t\tconst query = session.prepareQuery<\n\t\t\t\tPreparedQueryConfig & { execute: TResult }\n\t\t\t>(dialect.sqlToQuery(this.getSQL()), fieldsList, name, true, undefined, {\n\t\t\t\ttype: 'select',\n\t\t\t\ttables: [...usedTables],\n\t\t\t}, cacheConfig);\n\t\t\tquery.joinsNotNullableMap = joinsNotNullableMap;\n\n\t\t\treturn query;\n\t\t});\n\t}\n\n\t$withCache(config?: { config?: CacheConfig; tag?: string; autoInvalidate?: boolean } | false) {\n\t\tthis.cacheConfig = config === undefined\n\t\t\t? { config: {}, enable: true, autoInvalidate: true }\n\t\t\t: config === false\n\t\t\t? { enable: false }\n\t\t\t: { enable: true, autoInvalidate: true, ...config };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Create a prepared statement for this query. This allows\n\t * the database to remember this query for the given session\n\t * and call it by name, rather than specifying the full query.\n\t *\n\t * {@link https://www.postgresql.org/docs/current/sql-prepare.html | Postgres prepare documentation}\n\t */\n\tprepare(name: string): GelSelectPrepare<this> {\n\t\treturn this._prepare(name);\n\t}\n\n\texecute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(placeholderValues);\n\t\t});\n\t};\n}\n\napplyMixins(GelSelectBase, [QueryPromise]);\n\nfunction createSetOperator(type: SetOperator, isAll: boolean): GelCreateSetOperatorFn {\n\treturn (leftSelect, rightSelect, ...restSelects) => {\n\t\tconst setOperators = [rightSelect, ...restSelects].map((select) => ({\n\t\t\ttype,\n\t\t\tisAll,\n\t\t\trightSelect: select as AnyGelSelect,\n\t\t}));\n\n\t\tfor (const setOperator of setOperators) {\n\t\t\tif (!haveSameKeys((leftSelect as any).getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn (leftSelect as AnyGelSelect).addSetOperators(setOperators) as any;\n\t};\n}\n\nconst getGelSetOperators = () => ({\n\tunion,\n\tunionAll,\n\tintersect,\n\tintersectAll,\n\texcept,\n\texceptAll,\n});\n\n/**\n * Adds `union` set operator to the query.\n *\n * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n *\n * @example\n *\n * ```ts\n * // Select all unique names from customers and users tables\n * import { union } from 'drizzle-orm/Gel-core'\n *\n * await union(\n *   db.select({ name: users.name }).from(users),\n *   db.select({ name: customers.name }).from(customers)\n * );\n * // or\n * await db.select({ name: users.name })\n *   .from(users)\n *   .union(\n *     db.select({ name: customers.name }).from(customers)\n *   );\n * ```\n */\nexport const union = createSetOperator('union', false);\n\n/**\n * Adds `union all` set operator to the query.\n *\n * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n *\n * @example\n *\n * ```ts\n * // Select all transaction ids from both online and in-store sales\n * import { unionAll } from 'drizzle-orm/Gel-core'\n *\n * await unionAll(\n *   db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n *   db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * // or\n * await db.select({ transaction: onlineSales.transactionId })\n *   .from(onlineSales)\n *   .unionAll(\n *     db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n *   );\n * ```\n */\nexport const unionAll = createSetOperator('union', true);\n\n/**\n * Adds `intersect` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n *\n * @example\n *\n * ```ts\n * // Select course names that are offered in both departments A and B\n * import { intersect } from 'drizzle-orm/Gel-core'\n *\n * await intersect(\n *   db.select({ courseName: depA.courseName }).from(depA),\n *   db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n *   .from(depA)\n *   .intersect(\n *     db.select({ courseName: depB.courseName }).from(depB)\n *   );\n * ```\n */\nexport const intersect = createSetOperator('intersect', false);\n\n/**\n * Adds `intersect all` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets including all duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect-all}\n *\n * @example\n *\n * ```ts\n * // Select all products and quantities that are ordered by both regular and VIP customers\n * import { intersectAll } from 'drizzle-orm/Gel-core'\n *\n * await intersectAll(\n *   db.select({\n *     productId: regularCustomerOrders.productId,\n *     quantityOrdered: regularCustomerOrders.quantityOrdered\n *   })\n *   .from(regularCustomerOrders),\n *   db.select({\n *     productId: vipCustomerOrders.productId,\n *     quantityOrdered: vipCustomerOrders.quantityOrdered\n *   })\n *   .from(vipCustomerOrders)\n * );\n * // or\n * await db.select({\n *   productId: regularCustomerOrders.productId,\n *   quantityOrdered: regularCustomerOrders.quantityOrdered\n * })\n * .from(regularCustomerOrders)\n * .intersectAll(\n *   db.select({\n *     productId: vipCustomerOrders.productId,\n *     quantityOrdered: vipCustomerOrders.quantityOrdered\n *   })\n *   .from(vipCustomerOrders)\n * );\n * ```\n */\nexport const intersectAll = createSetOperator('intersect', true);\n\n/**\n * Adds `except` set operator to the query.\n *\n * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n *\n * @example\n *\n * ```ts\n * // Select all courses offered in department A but not in department B\n * import { except } from 'drizzle-orm/Gel-core'\n *\n * await except(\n *   db.select({ courseName: depA.courseName }).from(depA),\n *   db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n *   .from(depA)\n *   .except(\n *     db.select({ courseName: depB.courseName }).from(depB)\n *   );\n * ```\n */\nexport const except = createSetOperator('except', false);\n\n/**\n * Adds `except all` set operator to the query.\n *\n * Calling this method will retrieve all rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except-all}\n *\n * @example\n *\n * ```ts\n * // Select all products that are ordered by regular customers but not by VIP customers\n * import { exceptAll } from 'drizzle-orm/Gel-core'\n *\n * await exceptAll(\n *   db.select({\n *     productId: regularCustomerOrders.productId,\n *     quantityOrdered: regularCustomerOrders.quantityOrdered\n *   })\n *   .from(regularCustomerOrders),\n *   db.select({\n *     productId: vipCustomerOrders.productId,\n *     quantityOrdered: vipCustomerOrders.quantityOrdered\n *   })\n *   .from(vipCustomerOrders)\n * );\n * // or\n * await db.select({\n *   productId: regularCustomerOrders.productId,\n *   quantityOrdered: regularCustomerOrders.quantityOrdered,\n * })\n * .from(regularCustomerOrders)\n * .exceptAll(\n *   db.select({\n *     productId: vipCustomerOrders.productId,\n *     quantityOrdered: vipCustomerOrders.quantityOrdered,\n *   })\n *   .from(vipCustomerOrders)\n * );\n * ```\n */\nexport const exceptAll = createSetOperator('except', true);\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/query-builders/select.types.ts",
    "content": "import type { GelColumn } from '~/gel-core/columns/index.ts';\nimport type { GelTable, GelTableWithColumns } from '~/gel-core/table.ts';\nimport type { GelViewBase } from '~/gel-core/view-base.ts';\nimport type { GelViewWithSelection } from '~/gel-core/view.ts';\nimport type {\n\tSelectedFields as SelectedFieldsBase,\n\tSelectedFieldsFlat as SelectedFieldsFlatBase,\n\tSelectedFieldsOrdered as SelectedFieldsOrderedBase,\n} from '~/operations.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tAppendToNullabilityMap,\n\tAppendToResult,\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tJoinNullability,\n\tJoinType,\n\tMapColumnsToTableAlias,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport type { ColumnsSelection, Placeholder, SQL, SQLWrapper, View } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport type { Table, UpdateTableConfig } from '~/table.ts';\nimport type { Assume, ValidateShape, ValueOrArray } from '~/utils.ts';\nimport type { GelPreparedQuery, PreparedQueryConfig } from '../session.ts';\nimport type { GelSelectBase, GelSelectQueryBuilderBase } from './select.ts';\n\nexport interface GelSelectJoinConfig {\n\ton: SQL | undefined;\n\ttable: GelTable | Subquery | GelViewBase | SQL;\n\talias: string | undefined;\n\tjoinType: JoinType;\n\tlateral?: boolean;\n}\n\nexport type BuildAliasTable<TTable extends GelTable | View, TAlias extends string> = TTable extends Table\n\t? GelTableWithColumns<\n\t\tUpdateTableConfig<TTable['_']['config'], {\n\t\t\tname: TAlias;\n\t\t\tcolumns: MapColumnsToTableAlias<TTable['_']['columns'], TAlias, 'gel'>;\n\t\t}>\n\t>\n\t: TTable extends View ? GelViewWithSelection<\n\t\t\tTAlias,\n\t\t\tTTable['_']['existing'],\n\t\t\tMapColumnsToTableAlias<TTable['_']['selectedFields'], TAlias, 'gel'>\n\t\t>\n\t: never;\n\nexport interface GelSelectConfig {\n\twithList?: Subquery[];\n\t// Either fields or fieldsFlat must be defined\n\tfields: Record<string, unknown>;\n\tfieldsFlat?: SelectedFieldsOrdered;\n\twhere?: SQL;\n\thaving?: SQL;\n\ttable: GelTable | Subquery | GelViewBase | SQL;\n\tlimit?: number | Placeholder;\n\toffset?: number | Placeholder;\n\tjoins?: GelSelectJoinConfig[];\n\torderBy?: (GelColumn | SQL | SQL.Aliased)[];\n\tgroupBy?: (GelColumn | SQL | SQL.Aliased)[];\n\tlockingClause?: {\n\t\tstrength: LockStrength;\n\t\tconfig: LockConfig;\n\t};\n\tdistinct?: boolean | {\n\t\ton: (GelColumn | SQLWrapper)[];\n\t};\n\tsetOperators: {\n\t\trightSelect: TypedQueryBuilder<any, any>;\n\t\ttype: SetOperator;\n\t\tisAll: boolean;\n\t\torderBy?: (GelColumn | SQL | SQL.Aliased)[];\n\t\tlimit?: number | Placeholder;\n\t\toffset?: number | Placeholder;\n\t}[];\n}\n\nexport type GelSelectJoin<\n\tT extends AnyGelSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n\tTJoinedTable extends GelTable | Subquery | GelViewBase | SQL,\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n> = T extends any ? GelSelectWithout<\n\t\tGelSelectKind<\n\t\t\tT['_']['hkt'],\n\t\t\tT['_']['tableName'],\n\t\t\tAppendToResult<\n\t\t\t\tT['_']['tableName'],\n\t\t\t\tT['_']['selection'],\n\t\t\t\tTJoinedName,\n\t\t\t\tTJoinedTable extends Table ? TJoinedTable['_']['columns']\n\t\t\t\t\t: TJoinedTable extends Subquery ? Assume<TJoinedTable['_']['selectedFields'], SelectedFields>\n\t\t\t\t\t: never,\n\t\t\t\tT['_']['selectMode']\n\t\t\t>,\n\t\t\tT['_']['selectMode'] extends 'partial' ? T['_']['selectMode'] : 'multiple',\n\t\t\tAppendToNullabilityMap<T['_']['nullabilityMap'], TJoinedName, TJoinType>,\n\t\t\tT['_']['dynamic'],\n\t\t\tT['_']['excludedMethods']\n\t\t>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>\n\t: never;\n\nexport type GelSelectJoinFn<\n\tT extends AnyGelSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n\tTIsLateral extends boolean,\n> = <\n\tTJoinedTable extends (TIsLateral extends true ? Subquery | SQL : GelTable | Subquery | GelViewBase | SQL),\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n>(\n\ttable: TJoinedTable,\n\ton: ((aliases: T['_']['selection']) => SQL | undefined) | SQL | undefined,\n) => GelSelectJoin<T, TDynamic, TJoinType, TJoinedTable, TJoinedName>;\n\nexport type GelSelectCrossJoinFn<\n\tT extends AnyGelSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTIsLateral extends boolean,\n> = <\n\tTJoinedTable extends (TIsLateral extends true ? Subquery | SQL : GelTable | Subquery | GelViewBase | SQL),\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n>(table: TJoinedTable) => GelSelectJoin<T, TDynamic, 'cross', TJoinedTable, TJoinedName>;\n\nexport type SelectedFieldsFlat = SelectedFieldsFlatBase<GelColumn>;\n\nexport type SelectedFields = SelectedFieldsBase<GelColumn, GelTable>;\n\nexport type SelectedFieldsOrdered = SelectedFieldsOrderedBase<GelColumn>;\n\nexport type LockStrength = 'update' | 'no key update' | 'share' | 'key share';\n\nexport type LockConfig =\n\t& {\n\t\tof?: ValueOrArray<GelTable>;\n\t}\n\t& ({\n\t\tnoWait: true;\n\t\tskipLocked?: undefined;\n\t} | {\n\t\tnoWait?: undefined;\n\t\tskipLocked: true;\n\t} | {\n\t\tnoWait?: undefined;\n\t\tskipLocked?: undefined;\n\t});\n\nexport interface GelSelectHKTBase {\n\ttableName: string | undefined;\n\tselection: unknown;\n\tselectMode: SelectMode;\n\tnullabilityMap: unknown;\n\tdynamic: boolean;\n\texcludedMethods: string;\n\tresult: unknown;\n\tselectedFields: unknown;\n\t_type: unknown;\n}\n\nexport type GelSelectKind<\n\tT extends GelSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability>,\n\tTDynamic extends boolean,\n\tTExcludedMethods extends string,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> = (T & {\n\ttableName: TTableName;\n\tselection: TSelection;\n\tselectMode: TSelectMode;\n\tnullabilityMap: TNullabilityMap;\n\tdynamic: TDynamic;\n\texcludedMethods: TExcludedMethods;\n\tresult: TResult;\n\tselectedFields: TSelectedFields;\n})['_type'];\n\nexport interface GelSelectQueryBuilderHKT extends GelSelectHKTBase {\n\t_type: GelSelectQueryBuilderBase<\n\t\tGelSelectQueryBuilderHKT,\n\t\tthis['tableName'],\n\t\tAssume<this['selection'], ColumnsSelection>,\n\t\tthis['selectMode'],\n\t\tAssume<this['nullabilityMap'], Record<string, JoinNullability>>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods'],\n\t\tAssume<this['result'], any[]>,\n\t\tAssume<this['selectedFields'], ColumnsSelection>\n\t>;\n}\n\nexport interface GelSelectHKT extends GelSelectHKTBase {\n\t_type: GelSelectBase<\n\t\tthis['tableName'],\n\t\tAssume<this['selection'], ColumnsSelection>,\n\t\tthis['selectMode'],\n\t\tAssume<this['nullabilityMap'], Record<string, JoinNullability>>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods'],\n\t\tAssume<this['result'], any[]>,\n\t\tAssume<this['selectedFields'], ColumnsSelection>\n\t>;\n}\n\nexport type CreateGelSelectFromBuilderMode<\n\tTBuilderMode extends 'db' | 'qb',\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n> = TBuilderMode extends 'db' ? GelSelectBase<TTableName, TSelection, TSelectMode>\n\t: GelSelectQueryBuilderBase<GelSelectQueryBuilderHKT, TTableName, TSelection, TSelectMode>;\n\nexport type GelSetOperatorExcludedMethods =\n\t| 'leftJoin'\n\t| 'rightJoin'\n\t| 'innerJoin'\n\t| 'fullJoin'\n\t| 'where'\n\t| 'having'\n\t| 'groupBy'\n\t| 'for';\n\nexport type GelSelectWithout<\n\tT extends AnyGelSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n\tTResetExcluded extends boolean = false,\n> = TDynamic extends true ? T : Omit<\n\tGelSelectKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['tableName'],\n\t\tT['_']['selection'],\n\t\tT['_']['selectMode'],\n\t\tT['_']['nullabilityMap'],\n\t\tTDynamic,\n\t\tTResetExcluded extends true ? K : T['_']['excludedMethods'] | K,\n\t\tT['_']['result'],\n\t\tT['_']['selectedFields']\n\t>,\n\tTResetExcluded extends true ? K : T['_']['excludedMethods'] | K\n>;\n\nexport type GelSelectPrepare<T extends AnyGelSelect> = GelPreparedQuery<\n\tPreparedQueryConfig & {\n\t\texecute: T['_']['result'];\n\t}\n>;\n\nexport type GelSelectDynamic<T extends AnyGelSelectQueryBuilder> = GelSelectKind<\n\tT['_']['hkt'],\n\tT['_']['tableName'],\n\tT['_']['selection'],\n\tT['_']['selectMode'],\n\tT['_']['nullabilityMap'],\n\ttrue,\n\tnever,\n\tT['_']['result'],\n\tT['_']['selectedFields']\n>;\n\nexport type GelSelectQueryBuilder<\n\tTHKT extends GelSelectHKTBase = GelSelectQueryBuilderHKT,\n\tTTableName extends string | undefined = string | undefined,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n\tTResult extends any[] = unknown[],\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> = GelSelectQueryBuilderBase<\n\tTHKT,\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTNullabilityMap,\n\ttrue,\n\tnever,\n\tTResult,\n\tTSelectedFields\n>;\n\nexport type AnyGelSelectQueryBuilder = GelSelectQueryBuilderBase<any, any, any, any, any, any, any, any, any>;\n\nexport type AnyGelSetOperatorInterface = GelSetOperatorInterface<any, any, any, any, any, any, any, any>;\n\nexport interface GelSetOperatorInterface<\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> {\n\t_: {\n\t\treadonly hkt: GelSelectHKT;\n\t\treadonly tableName: TTableName;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t};\n}\n\nexport type GelSetOperatorWithResult<TResult extends any[]> = GelSetOperatorInterface<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tTResult,\n\tany\n>;\n\nexport type GelSelect<\n\tTTableName extends string | undefined = string | undefined,\n\tTSelection extends ColumnsSelection = Record<string, any>,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n> = GelSelectBase<TTableName, TSelection, TSelectMode, TNullabilityMap, true, never>;\n\nexport type AnyGelSelect = GelSelectBase<any, any, any, any, any, any, any, any>;\n\nexport type GelSetOperator<\n\tTTableName extends string | undefined = string | undefined,\n\tTSelection extends ColumnsSelection = Record<string, any>,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n> = GelSelectBase<\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTNullabilityMap,\n\ttrue,\n\tGelSetOperatorExcludedMethods\n>;\n\nexport type SetOperatorRightSelect<\n\tTValue extends GelSetOperatorWithResult<TResult>,\n\tTResult extends any[],\n> = TValue extends GelSetOperatorInterface<any, any, any, any, any, any, infer TValueResult, any> ? ValidateShape<\n\t\tTValueResult[number],\n\t\tTResult[number],\n\t\tTypedQueryBuilder<any, TValueResult>\n\t>\n\t: TValue;\n\nexport type SetOperatorRestSelect<\n\tTValue extends readonly GelSetOperatorWithResult<TResult>[],\n\tTResult extends any[],\n> = TValue extends [infer First, ...infer Rest]\n\t? First extends GelSetOperatorInterface<any, any, any, any, any, any, infer TValueResult, any>\n\t\t? Rest extends AnyGelSetOperatorInterface[] ? [\n\t\t\t\tValidateShape<TValueResult[number], TResult[number], TypedQueryBuilder<any, TValueResult>>,\n\t\t\t\t...SetOperatorRestSelect<Rest, TResult>,\n\t\t\t]\n\t\t: ValidateShape<TValueResult[number], TResult[number], TypedQueryBuilder<any, TValueResult>[]>\n\t: never\n\t: TValue;\n\nexport type GelCreateSetOperatorFn = <\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTValue extends GelSetOperatorWithResult<TResult>,\n\tTRest extends GelSetOperatorWithResult<TResult>[],\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n>(\n\tleftSelect: GelSetOperatorInterface<\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\trightSelect: SetOperatorRightSelect<TValue, TResult>,\n\t...restSelects: SetOperatorRestSelect<TRest, TResult>\n) => GelSelectWithout<\n\tGelSelectBase<\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tfalse,\n\tGelSetOperatorExcludedMethods,\n\ttrue\n>;\n\nexport type GetGelSetOperators = {\n\tunion: GelCreateSetOperatorFn;\n\tintersect: GelCreateSetOperatorFn;\n\texcept: GelCreateSetOperatorFn;\n\tunionAll: GelCreateSetOperatorFn;\n\tintersectAll: GelCreateSetOperatorFn;\n\texceptAll: GelCreateSetOperatorFn;\n};\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/query-builders/update.ts",
    "content": "import type { GetColumnData } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { GelDialect } from '~/gel-core/dialect.ts';\nimport type {\n\tGelPreparedQuery,\n\tGelQueryResultHKT,\n\tGelQueryResultKind,\n\tGelSession,\n\tPreparedQueryConfig,\n} from '~/gel-core/session.ts';\nimport { GelTable } from '~/gel-core/table.ts';\nimport type {\n\tAppendToNullabilityMap,\n\tAppendToResult,\n\tGetSelectTableName,\n\tGetSelectTableSelection,\n\tJoinNullability,\n\tJoinType,\n\tSelectMode,\n\tSelectResult,\n} from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { type ColumnsSelection, type Query, SQL, type SQLWrapper } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport {\n\ttype Assume,\n\tgetTableLikeName,\n\tmapUpdateSet,\n\ttype NeonAuthToken,\n\torderSelectedFields,\n\ttype UpdateSet,\n} from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { GelColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type { GelViewBase } from '../view-base.ts';\nimport type { GelSelectJoinConfig, SelectedFields, SelectedFieldsOrdered } from './select.types.ts';\n\nexport interface GelUpdateConfig {\n\twhere?: SQL | undefined;\n\tset: UpdateSet;\n\ttable: GelTable;\n\tfrom?: GelTable | Subquery | GelViewBase | SQL;\n\tjoins: GelSelectJoinConfig[];\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type GelUpdateSetSource<TTable extends GelTable> =\n\t& {\n\t\t[Key in keyof TTable['$inferInsert']]?:\n\t\t\t| GetColumnData<TTable['_']['columns'][Key]>\n\t\t\t| SQL\n\t\t\t| GelColumn;\n\t}\n\t& {};\n\nexport class GelUpdateBuilder<TTable extends GelTable, TQueryResult extends GelQueryResultHKT> {\n\tstatic readonly [entityKind]: string = 'GelUpdateBuilder';\n\n\tdeclare readonly _: {\n\t\treadonly table: TTable;\n\t};\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: GelSession,\n\t\tprivate dialect: GelDialect,\n\t\tprivate withList?: Subquery[],\n\t) {}\n\n\tprivate authToken?: NeonAuthToken;\n\tsetToken(token: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\tset(\n\t\tvalues: GelUpdateSetSource<TTable>,\n\t): GelUpdateWithout<GelUpdateBase<TTable, TQueryResult>, false, 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'> {\n\t\treturn new GelUpdateBase<TTable, TQueryResult>(\n\t\t\tthis.table,\n\t\t\tmapUpdateSet(this.table, values),\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t);\n\t}\n}\n\nexport type GelUpdateWithout<\n\tT extends AnyGelUpdate,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T : Omit<\n\tGelUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['from'],\n\t\tT['_']['returning'],\n\t\tT['_']['nullabilityMap'],\n\t\tT['_']['joins'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods'] | K\n\t>,\n\tT['_']['excludedMethods'] | K\n>;\n\nexport type GelUpdateWithJoins<\n\tT extends AnyGelUpdate,\n\tTDynamic extends boolean,\n\tTFrom extends GelTable | Subquery | GelViewBase | SQL,\n> = TDynamic extends true ? T : Omit<\n\tGelUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tTFrom,\n\t\tT['_']['returning'],\n\t\tAppendToNullabilityMap<T['_']['nullabilityMap'], GetSelectTableName<TFrom>, 'inner'>,\n\t\t[...T['_']['joins'], {\n\t\t\tname: GetSelectTableName<TFrom>;\n\t\t\tjoinType: 'inner';\n\t\t\ttable: TFrom;\n\t\t}],\n\t\tTDynamic,\n\t\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n\t>,\n\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n>;\n\nexport type GelUpdateJoinFn<\n\tT extends AnyGelUpdate,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n> = <\n\tTJoinedTable extends GelTable | Subquery | GelViewBase | SQL,\n>(\n\ttable: TJoinedTable,\n\ton:\n\t\t| (\n\t\t\t(\n\t\t\t\tupdateTable: T['_']['table']['_']['columns'],\n\t\t\t\tfrom: T['_']['from'] extends GelTable ? T['_']['from']['_']['columns']\n\t\t\t\t\t: T['_']['from'] extends Subquery | GelViewBase ? T['_']['from']['_']['selectedFields']\n\t\t\t\t\t: never,\n\t\t\t) => SQL | undefined\n\t\t)\n\t\t| SQL\n\t\t| undefined,\n) => GelUpdateJoin<T, TDynamic, TJoinType, TJoinedTable>;\n\nexport type GelUpdateJoin<\n\tT extends AnyGelUpdate,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n\tTJoinedTable extends GelTable | Subquery | GelViewBase | SQL,\n> = TDynamic extends true ? T : GelUpdateBase<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['from'],\n\tT['_']['returning'],\n\tAppendToNullabilityMap<T['_']['nullabilityMap'], GetSelectTableName<TJoinedTable>, TJoinType>,\n\t[...T['_']['joins'], {\n\t\tname: GetSelectTableName<TJoinedTable>;\n\t\tjoinType: TJoinType;\n\t\ttable: TJoinedTable;\n\t}],\n\tTDynamic,\n\tT['_']['excludedMethods']\n>;\n\ntype Join = {\n\tname: string | undefined;\n\tjoinType: JoinType;\n\ttable: GelTable | Subquery | GelViewBase | SQL;\n};\n\ntype AccumulateToResult<\n\tT extends AnyGelUpdate,\n\tTSelectMode extends SelectMode,\n\tTJoins extends Join[],\n\tTSelectedFields extends ColumnsSelection,\n> = TJoins extends [infer TJoin extends Join, ...infer TRest extends Join[]] ? AccumulateToResult<\n\t\tT,\n\t\tTSelectMode extends 'partial' ? TSelectMode : 'multiple',\n\t\tTRest,\n\t\tAppendToResult<\n\t\t\tT['_']['table']['_']['name'],\n\t\t\tTSelectedFields,\n\t\t\tTJoin['name'],\n\t\t\tTJoin['table'] extends Table ? TJoin['table']['_']['columns']\n\t\t\t\t: TJoin['table'] extends Subquery ? Assume<TJoin['table']['_']['selectedFields'], SelectedFields>\n\t\t\t\t: never,\n\t\t\tTSelectMode extends 'partial' ? TSelectMode : 'multiple'\n\t\t>\n\t>\n\t: TSelectedFields;\n\nexport type GelUpdateReturningAll<T extends AnyGelUpdate, TDynamic extends boolean> = GelUpdateWithout<\n\tGelUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['from'],\n\t\tSelectResult<\n\t\t\tAccumulateToResult<\n\t\t\t\tT,\n\t\t\t\t'single',\n\t\t\t\tT['_']['joins'],\n\t\t\t\tGetSelectTableSelection<T['_']['table']>\n\t\t\t>,\n\t\t\t'partial',\n\t\t\tT['_']['nullabilityMap']\n\t\t>,\n\t\tT['_']['nullabilityMap'],\n\t\tT['_']['joins'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type GelUpdateReturning<\n\tT extends AnyGelUpdate,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFields,\n> = GelUpdateWithout<\n\tGelUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['from'],\n\t\tSelectResult<\n\t\t\tAccumulateToResult<\n\t\t\t\tT,\n\t\t\t\t'partial',\n\t\t\t\tT['_']['joins'],\n\t\t\t\tTSelectedFields\n\t\t\t>,\n\t\t\t'partial',\n\t\t\tT['_']['nullabilityMap']\n\t\t>,\n\t\tT['_']['nullabilityMap'],\n\t\tT['_']['joins'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type GelUpdatePrepare<T extends AnyGelUpdate> = GelPreparedQuery<\n\tPreparedQueryConfig & {\n\t\texecute: T['_']['returning'] extends undefined ? GelQueryResultKind<T['_']['queryResult'], never>\n\t\t\t: T['_']['returning'][];\n\t}\n>;\n\nexport type GelUpdateDynamic<T extends AnyGelUpdate> = GelUpdate<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['from'],\n\tT['_']['returning'],\n\tT['_']['nullabilityMap']\n>;\n\nexport type GelUpdate<\n\tTTable extends GelTable = GelTable,\n\tTQueryResult extends GelQueryResultHKT = GelQueryResultHKT,\n\tTFrom extends GelTable | Subquery | GelViewBase | SQL | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<TTable['_']['name'], 'not-null'>,\n\tTJoins extends Join[] = [],\n> = GelUpdateBase<TTable, TQueryResult, TFrom, TReturning, TNullabilityMap, TJoins, true, never>;\n\nexport type AnyGelUpdate = GelUpdateBase<any, any, any, any, any, any, any, any>;\n\nexport interface GelUpdateBase<\n\tTTable extends GelTable,\n\tTQueryResult extends GelQueryResultHKT,\n\tTFrom extends GelTable | Subquery | GelViewBase | SQL | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<TTable['_']['name'], 'not-null'>,\n\tTJoins extends Join[] = [],\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tQueryPromise<TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[], 'gel'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\treadonly dialect: 'gel';\n\t\treadonly table: TTable;\n\t\treadonly joins: TJoins;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly from: TFrom;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[];\n\t};\n}\n\nexport class GelUpdateBase<\n\tTTable extends GelTable,\n\tTQueryResult extends GelQueryResultHKT,\n\tTFrom extends GelTable | Subquery | GelViewBase | SQL | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<TTable['_']['name'], 'not-null'>,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTJoins extends Join[] = [],\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[]>\n\timplements\n\t\tRunnableQuery<TReturning extends undefined ? GelQueryResultKind<TQueryResult, never> : TReturning[], 'gel'>,\n\t\tSQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'GelUpdate';\n\n\tprivate config: GelUpdateConfig;\n\tprivate tableName: string | undefined;\n\tprivate joinsNotNullableMap: Record<string, boolean>;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tset: UpdateSet,\n\t\tprivate session: GelSession,\n\t\tprivate dialect: GelDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { set, table, withList, joins: [] };\n\t\tthis.tableName = getTableLikeName(table);\n\t\tthis.joinsNotNullableMap = typeof this.tableName === 'string' ? { [this.tableName]: true } : {};\n\t}\n\n\tfrom<TFrom extends GelTable | Subquery | GelViewBase | SQL>(\n\t\tsource: TFrom,\n\t): GelUpdateWithJoins<this, TDynamic, TFrom> {\n\t\tconst tableName = getTableLikeName(source);\n\t\tif (typeof tableName === 'string') {\n\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t}\n\t\tthis.config.from = source;\n\t\treturn this as any;\n\t}\n\n\tprivate getTableLikeFields(table: GelTable | Subquery | GelViewBase): Record<string, unknown> {\n\t\tif (is(table, GelTable)) {\n\t\t\treturn table[Table.Symbol.Columns];\n\t\t} else if (is(table, Subquery)) {\n\t\t\treturn table._.selectedFields;\n\t\t}\n\t\treturn table[ViewBaseConfig].selectedFields;\n\t}\n\n\tprivate createJoin<TJoinType extends JoinType>(\n\t\tjoinType: TJoinType,\n\t): GelUpdateJoinFn<this, TDynamic, TJoinType> {\n\t\treturn ((\n\t\t\ttable: GelTable | Subquery | GelViewBase | SQL,\n\t\t\ton: ((updateTable: TTable, from: TFrom) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\tconst from = this.config.from && !is(this.config.from, SQL)\n\t\t\t\t\t? this.getTableLikeFields(this.config.from)\n\t\t\t\t\t: undefined;\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t\tfrom && new Proxy(\n\t\t\t\t\t\tfrom,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName });\n\n\t\t\tif (typeof tableName === 'string') {\n\t\t\t\tswitch (joinType) {\n\t\t\t\t\tcase 'left': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'right': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'inner': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'full': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this as any;\n\t\t}) as any;\n\t}\n\n\tleftJoin = this.createJoin('left');\n\n\trightJoin = this.createJoin('right');\n\n\tinnerJoin = this.createJoin('inner');\n\n\tfullJoin = this.createJoin('full');\n\n\t/**\n\t * Adds a 'where' clause to the query.\n\t *\n\t * Calling this method will update only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param where the 'where' clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be updated.\n\t *\n\t * ```ts\n\t * // Update all cars with green color\n\t * await db.update(cars).set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.update(cars).set({ color: 'red' })\n\t *   .where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Update all BMW cars with a green color\n\t * await db.update(cars).set({ color: 'red' })\n\t *   .where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Update all cars with the green or blue color\n\t * await db.update(cars).set({ color: 'red' })\n\t *   .where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): GelUpdateWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the updated rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update#update-with-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Update all cars with the green color and return all fields\n\t * const updatedCars: Car[] = await db.update(cars)\n\t *   .set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning();\n\t *\n\t * // Update all cars with the green color and return only their id and brand fields\n\t * const updatedCarsIdsAndBrands: { id: number, brand: string }[] = await db.update(cars)\n\t *   .set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): GelUpdateReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFields>(\n\t\tfields: TSelectedFields,\n\t): GelUpdateReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields?: SelectedFields,\n\t): GelUpdateWithout<AnyGelUpdate, TDynamic, 'returning'> {\n\t\tif (!fields) {\n\t\t\tfields = Object.assign({}, this.config.table[Table.Symbol.Columns]);\n\n\t\t\tif (this.config.from) {\n\t\t\t\tconst tableName = getTableLikeName(this.config.from);\n\n\t\t\t\tif (typeof tableName === 'string' && this.config.from && !is(this.config.from, SQL)) {\n\t\t\t\t\tconst fromFields = this.getTableLikeFields(this.config.from);\n\t\t\t\t\tfields[tableName] = fromFields as any;\n\t\t\t\t}\n\n\t\t\t\tfor (const join of this.config.joins) {\n\t\t\t\t\tconst tableName = getTableLikeName(join.table);\n\n\t\t\t\t\tif (typeof tableName === 'string' && !is(join.table, SQL)) {\n\t\t\t\t\t\tconst fromFields = this.getTableLikeFields(join.table);\n\t\t\t\t\t\tfields[tableName] = fromFields as any;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.config.returning = orderSelectedFields<GelColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildUpdateQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): GelUpdatePrepare<this> {\n\t\tconst query = this.session.prepareQuery<\n\t\t\tPreparedQueryConfig & { execute: TReturning[] }\n\t\t>(this.dialect.sqlToQuery(this.getSQL()), this.config.returning, name, true, undefined, {\n\t\t\ttype: 'update',\n\t\t\ttables: extractUsedTable(this.config.table),\n\t\t});\n\t\tquery.joinsNotNullableMap = this.joinsNotNullableMap;\n\t\treturn query;\n\t}\n\n\tprepare(name: string): GelUpdatePrepare<this> {\n\t\treturn this._prepare(name);\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn this._prepare().execute(placeholderValues);\n\t};\n\n\t$dynamic(): GelUpdateDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/roles.ts",
    "content": "import { entityKind } from '~/entity.ts';\n\nexport interface GelRoleConfig {\n\tcreateDb?: boolean;\n\tcreateRole?: boolean;\n\tinherit?: boolean;\n}\n\nexport class GelRole implements GelRoleConfig {\n\tstatic readonly [entityKind]: string = 'GelRole';\n\n\t/** @internal */\n\t_existing?: boolean;\n\n\t/** @internal */\n\treadonly createDb: GelRoleConfig['createDb'];\n\t/** @internal */\n\treadonly createRole: GelRoleConfig['createRole'];\n\t/** @internal */\n\treadonly inherit: GelRoleConfig['inherit'];\n\n\tconstructor(\n\t\treadonly name: string,\n\t\tconfig?: GelRoleConfig,\n\t) {\n\t\tif (config) {\n\t\t\tthis.createDb = config.createDb;\n\t\t\tthis.createRole = config.createRole;\n\t\t\tthis.inherit = config.inherit;\n\t\t}\n\t}\n\n\texisting(): this {\n\t\tthis._existing = true;\n\t\treturn this;\n\t}\n}\n\nexport function gelRole(name: string, config?: GelRoleConfig) {\n\treturn new GelRole(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/schema.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\nimport { SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { gelSequence } from './sequence.ts';\nimport { gelSequenceWithSchema } from './sequence.ts';\nimport { type GelTableFn, gelTableWithSchema } from './table.ts';\n// import type { gelMaterializedView, gelView } from './view.ts';\n// import { gelMaterializedViewWithSchema, gelViewWithSchema } from './view.ts';\n\nexport class GelSchema<TName extends string = string> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'GelSchema';\n\tconstructor(\n\t\tpublic readonly schemaName: TName,\n\t) {}\n\n\ttable: GelTableFn<TName> = ((name, columns, extraConfig) => {\n\t\treturn gelTableWithSchema(name, columns, extraConfig, this.schemaName);\n\t});\n\n\t// view = ((name, columns) => {\n\t// \treturn gelViewWithSchema(name, columns, this.schemaName);\n\t// }) as typeof gelView;\n\n\t// materializedView = ((name, columns) => {\n\t// \treturn gelMaterializedViewWithSchema(name, columns, this.schemaName);\n\t// }) as typeof gelMaterializedView;\n\n\t// enum: typeof gelEnum = ((name, values) => {\n\t// \treturn gelEnumWithSchema(name, values, this.schemaName);\n\t// });\n\n\tsequence: typeof gelSequence = ((name, options) => {\n\t\treturn gelSequenceWithSchema(name, options, this.schemaName);\n\t});\n\n\tgetSQL(): SQL {\n\t\treturn new SQL([sql.identifier(this.schemaName)]);\n\t}\n\n\tshouldOmitSQLParens(): boolean {\n\t\treturn true;\n\t}\n}\n\nexport function isGelSchema(obj: unknown): obj is GelSchema {\n\treturn is(obj, GelSchema);\n}\n\nexport function gelSchema<T extends string>(name: T) {\n\tif (name === 'public') {\n\t\tthrow new Error(\n\t\t\t`You can't specify 'public' as schema name. Postgres is using public schema by default. If you want to use 'public' schema, just use GelTable() instead of creating a schema`,\n\t\t);\n\t}\n\n\treturn new GelSchema(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/sequence.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\n\nexport type GelSequenceOptions = {\n\tincrement?: number | string;\n\tminValue?: number | string;\n\tmaxValue?: number | string;\n\tstartWith?: number | string;\n\tcache?: number | string;\n\tcycle?: boolean;\n};\n\nexport class GelSequence {\n\tstatic readonly [entityKind]: string = 'GelSequence';\n\n\tconstructor(\n\t\tpublic readonly seqName: string | undefined,\n\t\tpublic readonly seqOptions: GelSequenceOptions | undefined,\n\t\tpublic readonly schema: string | undefined,\n\t) {\n\t}\n}\n\nexport function gelSequence(\n\tname: string,\n\toptions?: GelSequenceOptions,\n): GelSequence {\n\treturn gelSequenceWithSchema(name, options, undefined);\n}\n\n/** @internal */\nexport function gelSequenceWithSchema(\n\tname: string,\n\toptions?: GelSequenceOptions,\n\tschema?: string,\n): GelSequence {\n\treturn new GelSequence(name, options, schema);\n}\n\nexport function isGelSequence(obj: unknown): obj is GelSequence {\n\treturn is(obj, GelSequence);\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/session.ts",
    "content": "import { type Cache, hashQuery, NoopCache } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleQueryError, TransactionRollbackError } from '~/errors.ts';\nimport type { TablesRelationalConfig } from '~/relations.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { Query, SQL } from '~/sql/index.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { NeonAuthToken } from '~/utils.ts';\nimport { GelDatabase } from './db.ts';\nimport type { GelDialect } from './dialect.ts';\nimport type { SelectedFieldsOrdered } from './query-builders/select.types.ts';\n\nexport interface PreparedQueryConfig {\n\texecute: unknown;\n\tall: unknown;\n\tvalues: unknown;\n}\n\nexport abstract class GelPreparedQuery<T extends PreparedQueryConfig> implements PreparedQuery {\n\tconstructor(\n\t\tprotected query: Query,\n\t\tprivate cache?: Cache,\n\t\t// per query related metadata\n\t\tprivate queryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\t// config that was passed through $withCache\n\t\tprivate cacheConfig?: WithCacheConfig,\n\t) {\n\t\t// it means that no $withCache options were passed and it should be just enabled\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enable: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enable) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\t}\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tif (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any mutations, if globally is false\n\t\tif (this.cacheConfig && !this.cacheConfig.enable) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// For mutate queries, we should query the database, wait for a response, and then perform invalidation\n\t\tif (\n\t\t\t(\n\t\t\t\tthis.queryMetadata.type === 'insert' || this.queryMetadata.type === 'update'\n\t\t\t\t|| this.queryMetadata.type === 'delete'\n\t\t\t) && this.queryMetadata.tables.length > 0\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst [res] = await Promise.all([\n\t\t\t\t\tquery(),\n\t\t\t\t\tthis.cache.onMutate({ tables: this.queryMetadata.tables }),\n\t\t\t\t]);\n\t\t\t\treturn res;\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any reads if globally disabled\n\t\tif (!this.cacheConfig) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.queryMetadata.type === 'select') {\n\t\t\tconst fromCache = await this.cache.get(\n\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\tthis.queryMetadata.tables,\n\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\tthis.cacheConfig.autoInvalidate,\n\t\t\t);\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tlet result;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await query();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t\t}\n\n\t\t\t\t// put actual key\n\t\t\t\tawait this.cache.put(\n\t\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tthis.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [],\n\t\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\t\tthis.cacheConfig.config,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\t\ttry {\n\t\t\treturn await query();\n\t\t} catch (e) {\n\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t}\n\t}\n\n\tprotected authToken?: NeonAuthToken;\n\n\tgetQuery(): Query {\n\t\treturn this.query;\n\t}\n\n\tmapResult(response: unknown, _isFromBatch?: boolean): unknown {\n\t\treturn response;\n\t}\n\n\tstatic readonly [entityKind]: string = 'GelPreparedQuery';\n\n\t/** @internal */\n\tjoinsNotNullableMap?: Record<string, boolean>;\n\n\tabstract execute(placeholderValues?: Record<string, unknown>): Promise<T['execute']>;\n\n\t/** @internal */\n\tabstract all(placeholderValues?: Record<string, unknown>): Promise<T['all']>;\n\n\t/** @internal */\n\tabstract isResponseInArrayMode(): boolean;\n}\n\nexport abstract class GelSession<\n\tTQueryResult extends GelQueryResultHKT = any, // TO\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = Record<string, never>,\n> {\n\tstatic readonly [entityKind]: string = 'GelSession';\n\n\tconstructor(protected dialect: GelDialect) {}\n\n\tabstract prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): GelPreparedQuery<T>;\n\n\texecute<T>(query: SQL): Promise<T> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\tconst prepared = tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }>(\n\t\t\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute(undefined);\n\t\t});\n\t}\n\n\tall<T = unknown>(query: SQL): Promise<T[]> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { all: T[] }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).all();\n\t}\n\n\tasync count(sql: SQL): Promise<number> {\n\t\tconst res = await this.execute<[{ count: string }]>(sql);\n\n\t\treturn Number(\n\t\t\tres[0]['count'],\n\t\t);\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: GelTransaction<TQueryResult, TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport abstract class GelTransaction<\n\tTQueryResult extends GelQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = Record<string, never>,\n> extends GelDatabase<TQueryResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'GelTransaction';\n\n\tconstructor(\n\t\tdialect: GelDialect,\n\t\tsession: GelSession<any, any, any>,\n\t\tprotected schema: {\n\t\t\tfullSchema: Record<string, unknown>;\n\t\t\tschema: TSchema;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t} | undefined,\n\t) {\n\t\tsuper(dialect, session, schema);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n\n\tabstract override transaction<T>(\n\t\ttransaction: (tx: GelTransaction<TQueryResult, TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport interface GelQueryResultHKT {\n\treadonly $brand: 'GelQueryResultHKT';\n\treadonly row: unknown;\n\treadonly type: unknown;\n}\n\nexport type GelQueryResultKind<TKind extends GelQueryResultHKT, TRow> = (TKind & {\n\treadonly row: TRow;\n})['type'];\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/subquery.ts",
    "content": "import type { AddAliasToSelection } from '~/query-builders/select.types.ts';\nimport type { ColumnsSelection } from '~/sql/sql.ts';\nimport type { Subquery, WithSubquery } from '~/subquery.ts';\n\nexport type SubqueryWithSelection<TSelection extends ColumnsSelection, TAlias extends string> =\n\t& Subquery<TAlias, AddAliasToSelection<TSelection, TAlias, 'gel'>>\n\t& AddAliasToSelection<TSelection, TAlias, 'gel'>;\n\nexport type WithSubqueryWithSelection<TSelection extends ColumnsSelection, TAlias extends string> =\n\t& WithSubquery<TAlias, AddAliasToSelection<TSelection, TAlias, 'gel'>>\n\t& AddAliasToSelection<TSelection, TAlias, 'gel'>;\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/table.ts",
    "content": "import type { BuildColumns, BuildExtraConfigColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport { type GelColumnsBuilders, getGelColumnBuilders } from './columns/all.ts';\nimport type { GelColumn, GelColumnBuilder, GelColumnBuilderBase, GelExtraConfigColumn } from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { AnyIndexBuilder } from './indexes.ts';\nimport type { GelPolicy } from './policies.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type GelTableExtraConfigValue =\n\t| AnyIndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder\n\t| GelPolicy;\n\nexport type GelTableExtraConfig = Record<\n\tstring,\n\tGelTableExtraConfigValue\n>;\n\nexport type TableConfig = TableConfigBase<GelColumn>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:GelInlineForeignKeys');\n/** @internal */\nexport const EnableRLS = Symbol.for('drizzle:EnableRLS');\n\nexport class GelTable<T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic override readonly [entityKind]: string = 'GelTable';\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t\tEnableRLS: EnableRLS as typeof EnableRLS,\n\t});\n\n\t/**@internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\t[EnableRLS]: boolean = false;\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]: ((self: Record<string, GelColumn>) => GelTableExtraConfig) | undefined =\n\t\tundefined;\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigColumns]: Record<string, GelExtraConfigColumn> = {};\n}\n\nexport type AnyGelTable<TPartial extends Partial<TableConfig> = {}> = GelTable<\n\tUpdateTableConfig<TableConfig, TPartial>\n>;\n\nexport type GelTableWithColumns<T extends TableConfig> =\n\t& GelTable<T>\n\t& {\n\t\t[Key in keyof T['columns']]: T['columns'][Key];\n\t}\n\t& {\n\t\tenableRLS: () => Omit<\n\t\t\tGelTableWithColumns<T>,\n\t\t\t'enableRLS'\n\t\t>;\n\t};\n\n/** @internal */\nexport function gelTableWithSchema<\n\tTTableName extends string,\n\tTSchemaName extends string | undefined,\n\tTColumnsMap extends Record<string, GelColumnBuilderBase>,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap | ((columnTypes: GelColumnsBuilders) => TColumnsMap),\n\textraConfig:\n\t\t| ((\n\t\t\tself: BuildExtraConfigColumns<TTableName, TColumnsMap, 'gel'>,\n\t\t) => GelTableExtraConfig | GelTableExtraConfigValue[])\n\t\t| undefined,\n\tschema: TSchemaName,\n\tbaseName = name,\n): GelTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchemaName;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'gel'>;\n\tdialect: 'gel';\n}> {\n\tconst rawTable = new GelTable<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'gel'>;\n\t\tdialect: 'gel';\n\t}>(name, schema, baseName);\n\n\tconst parsedColumns: TColumnsMap = typeof columns === 'function' ? columns(getGelColumnBuilders()) : columns;\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as GelColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildColumns<TTableName, TColumnsMap, 'gel'>;\n\n\tconst builtColumnsForExtraConfig = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as GelColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.buildExtraConfigColumn(rawTable);\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildExtraConfigColumns<TTableName, TColumnsMap, 'gel'>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumnsForExtraConfig;\n\n\tif (extraConfig) {\n\t\ttable[GelTable.Symbol.ExtraConfigBuilder] = extraConfig as any;\n\t}\n\n\treturn Object.assign(table, {\n\t\tenableRLS: () => {\n\t\t\ttable[GelTable.Symbol.EnableRLS] = true;\n\t\t\treturn table as GelTableWithColumns<{\n\t\t\t\tname: TTableName;\n\t\t\t\tschema: TSchemaName;\n\t\t\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'gel'>;\n\t\t\t\tdialect: 'gel';\n\t\t\t}>;\n\t\t},\n\t});\n}\n\nexport interface GelTableFn<TSchema extends string | undefined = undefined> {\n\t/**\n\t * @deprecated The third parameter of GelTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = gelTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = gelTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, GelColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig: (\n\t\t\tself: BuildExtraConfigColumns<TTableName, TColumnsMap, 'gel'>,\n\t\t) => GelTableExtraConfig,\n\t): GelTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'gel'>;\n\t\tdialect: 'gel';\n\t}>;\n\n\t/**\n\t * @deprecated The third parameter of gelTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = gelTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = gelTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, GelColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: GelColumnsBuilders) => TColumnsMap,\n\t\textraConfig: (self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'gel'>) => GelTableExtraConfig,\n\t): GelTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'gel'>;\n\t\tdialect: 'gel';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, GelColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: BuildExtraConfigColumns<TTableName, TColumnsMap, 'gel'>,\n\t\t) => GelTableExtraConfigValue[],\n\t): GelTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'gel'>;\n\t\tdialect: 'gel';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, GelColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: GelColumnsBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'gel'>) => GelTableExtraConfigValue[],\n\t): GelTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'gel'>;\n\t\tdialect: 'gel';\n\t}>;\n}\n\nexport const gelTable: GelTableFn = (name, columns, extraConfig) => {\n\treturn gelTableWithSchema(name, columns, extraConfig, undefined);\n};\n\nexport function gelTableCreator(customizeTableName: (name: string) => string): GelTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn gelTableWithSchema(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/unique-constraint.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { GelColumn } from './columns/index.ts';\nimport type { GelTable } from './table.ts';\n\nexport function unique(name?: string): UniqueOnConstraintBuilder {\n\treturn new UniqueOnConstraintBuilder(name);\n}\n\nexport function uniqueKeyName(table: GelTable, columns: string[]) {\n\treturn `${table[TableName]}_${columns.join('_')}_unique`;\n}\n\nexport class UniqueConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'GelUniqueConstraintBuilder';\n\n\t/** @internal */\n\tcolumns: GelColumn[];\n\t/** @internal */\n\tnullsNotDistinctConfig = false;\n\n\tconstructor(\n\t\tcolumns: GelColumn[],\n\t\tprivate name?: string,\n\t) {\n\t\tthis.columns = columns;\n\t}\n\n\tnullsNotDistinct() {\n\t\tthis.nullsNotDistinctConfig = true;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: GelTable): UniqueConstraint {\n\t\treturn new UniqueConstraint(table, this.columns, this.nullsNotDistinctConfig, this.name);\n\t}\n}\n\nexport class UniqueOnConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'GelUniqueOnConstraintBuilder';\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tname?: string,\n\t) {\n\t\tthis.name = name;\n\t}\n\n\ton(...columns: [GelColumn, ...GelColumn[]]) {\n\t\treturn new UniqueConstraintBuilder(columns, this.name);\n\t}\n}\n\nexport class UniqueConstraint {\n\tstatic readonly [entityKind]: string = 'GelUniqueConstraint';\n\n\treadonly columns: GelColumn[];\n\treadonly name?: string;\n\treadonly nullsNotDistinct: boolean = false;\n\n\tconstructor(readonly table: GelTable, columns: GelColumn[], nullsNotDistinct: boolean, name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n\t\tthis.nullsNotDistinct = nullsNotDistinct;\n\t}\n\n\tgetName() {\n\t\treturn this.name;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/utils.ts",
    "content": "import { is } from '~/entity.ts';\nimport { SQL } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { type Check, CheckBuilder } from './checks.ts';\nimport type { AnyGelColumn } from './columns/index.ts';\nimport { type ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { Index } from './indexes.ts';\nimport { IndexBuilder } from './indexes.ts';\nimport { GelPolicy } from './policies.ts';\nimport { type PrimaryKey, PrimaryKeyBuilder } from './primary-keys.ts';\nimport { GelTable } from './table.ts';\nimport { type UniqueConstraint, UniqueConstraintBuilder } from './unique-constraint.ts';\nimport type { GelViewBase } from './view-base.ts';\nimport { GelViewConfig } from './view-common.ts';\nimport { type GelMaterializedView, GelMaterializedViewConfig, type GelView } from './view.ts';\n\nexport function getTableConfig<TTable extends GelTable>(table: TTable) {\n\tconst columns = Object.values(table[Table.Symbol.Columns]);\n\tconst indexes: Index[] = [];\n\tconst checks: Check[] = [];\n\tconst primaryKeys: PrimaryKey[] = [];\n\tconst foreignKeys: ForeignKey[] = Object.values(table[GelTable.Symbol.InlineForeignKeys]);\n\tconst uniqueConstraints: UniqueConstraint[] = [];\n\tconst name = table[Table.Symbol.Name];\n\tconst schema = table[Table.Symbol.Schema];\n\tconst policies: GelPolicy[] = [];\n\tconst enableRLS: boolean = table[GelTable.Symbol.EnableRLS];\n\n\tconst extraConfigBuilder = table[GelTable.Symbol.ExtraConfigBuilder];\n\n\tif (extraConfigBuilder !== undefined) {\n\t\tconst extraConfig = extraConfigBuilder(table[Table.Symbol.ExtraConfigColumns]);\n\t\tconst extraValues = Array.isArray(extraConfig) ? extraConfig.flat(1) as any[] : Object.values(extraConfig);\n\t\tfor (const builder of extraValues) {\n\t\t\tif (is(builder, IndexBuilder)) {\n\t\t\t\tindexes.push(builder.build(table));\n\t\t\t} else if (is(builder, CheckBuilder)) {\n\t\t\t\tchecks.push(builder.build(table));\n\t\t\t} else if (is(builder, UniqueConstraintBuilder)) {\n\t\t\t\tuniqueConstraints.push(builder.build(table));\n\t\t\t} else if (is(builder, PrimaryKeyBuilder)) {\n\t\t\t\tprimaryKeys.push(builder.build(table));\n\t\t\t} else if (is(builder, ForeignKeyBuilder)) {\n\t\t\t\tforeignKeys.push(builder.build(table));\n\t\t\t} else if (is(builder, GelPolicy)) {\n\t\t\t\tpolicies.push(builder);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tcolumns,\n\t\tindexes,\n\t\tforeignKeys,\n\t\tchecks,\n\t\tprimaryKeys,\n\t\tuniqueConstraints,\n\t\tname,\n\t\tschema,\n\t\tpolicies,\n\t\tenableRLS,\n\t};\n}\n\nexport function extractUsedTable(table: GelTable | Subquery | GelViewBase | SQL): string[] {\n\tif (is(table, GelTable)) {\n\t\treturn [`${table[Table.Symbol.BaseName]}`];\n\t}\n\tif (is(table, Subquery)) {\n\t\treturn table._.usedTables ?? [];\n\t}\n\tif (is(table, SQL)) {\n\t\treturn table.usedTables ?? [];\n\t}\n\treturn [];\n}\n\nexport function getViewConfig<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n>(view: GelView<TName, TExisting>) {\n\treturn {\n\t\t...view[ViewBaseConfig],\n\t\t...view[GelViewConfig],\n\t};\n}\n\nexport function getMaterializedViewConfig<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n>(view: GelMaterializedView<TName, TExisting>) {\n\treturn {\n\t\t...view[ViewBaseConfig],\n\t\t...view[GelMaterializedViewConfig],\n\t};\n}\n\nexport type ColumnsWithTable<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyGelColumn<{ tableName: TTableName }>[],\n> = { [Key in keyof TColumns]: AnyGelColumn<{ tableName: TForeignTableName }> };\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/view-base.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { type ColumnsSelection, View } from '~/sql/sql.ts';\n\nexport abstract class GelViewBase<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> extends View<TName, TExisting, TSelectedFields> {\n\tstatic override readonly [entityKind]: string = 'GelViewBase';\n\n\tdeclare readonly _: View<TName, TExisting, TSelectedFields>['_'] & {\n\t\treadonly viewBrand: 'GelViewBase';\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/view-common.ts",
    "content": "export const GelViewConfig = Symbol.for('drizzle:GelViewConfig');\n"
  },
  {
    "path": "drizzle-orm/src/gel-core/view.ts",
    "content": "import type { BuildColumns } from '~/column-builder.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { AddAliasToSelection } from '~/query-builders/select.types.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport { getTableColumns } from '~/utils.ts';\nimport type { RequireAtLeastOne } from '~/utils.ts';\nimport type { GelColumn, GelColumnBuilderBase } from './columns/common.ts';\nimport { QueryBuilder } from './query-builders/query-builder.ts';\nimport { gelTable } from './table.ts';\nimport { GelViewBase } from './view-base.ts';\nimport { GelViewConfig } from './view-common.ts';\n\nexport type ViewWithConfig = RequireAtLeastOne<{\n\tcheckOption: 'local' | 'cascaded';\n\tsecurityBarrier: boolean;\n\tsecurityInvoker: boolean;\n}>;\n\nexport class DefaultViewBuilderCore<TConfig extends { name: string; columns?: unknown }> {\n\tstatic readonly [entityKind]: string = 'GelDefaultViewBuilderCore';\n\n\tdeclare readonly _: {\n\t\treadonly name: TConfig['name'];\n\t\treadonly columns: TConfig['columns'];\n\t};\n\n\tconstructor(\n\t\tprotected name: TConfig['name'],\n\t\tprotected schema: string | undefined,\n\t) {}\n\n\tprotected config: {\n\t\twith?: ViewWithConfig;\n\t} = {};\n\n\twith(config: ViewWithConfig): this {\n\t\tthis.config.with = config;\n\t\treturn this;\n\t}\n}\n\nexport class ViewBuilder<TName extends string = string> extends DefaultViewBuilderCore<{ name: TName }> {\n\tstatic override readonly [entityKind]: string = 'GelViewBuilder';\n\n\tas<TSelectedFields extends ColumnsSelection>(\n\t\tqb: TypedQueryBuilder<TSelectedFields> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelectedFields>),\n\t): GelViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'gel'>> {\n\t\tif (typeof qb === 'function') {\n\t\t\tqb = qb(new QueryBuilder());\n\t\t}\n\t\tconst selectionProxy = new SelectionProxyHandler<TSelectedFields>({\n\t\t\talias: this.name,\n\t\t\tsqlBehavior: 'error',\n\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\treplaceOriginalName: true,\n\t\t});\n\t\tconst aliasedSelection = new Proxy(qb.getSelectedFields(), selectionProxy);\n\t\treturn new Proxy(\n\t\t\tnew GelView({\n\t\t\t\tGelConfig: this.config,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: aliasedSelection,\n\t\t\t\t\tquery: qb.getSQL().inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tselectionProxy as any,\n\t\t) as GelViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'gel'>>;\n\t}\n}\n\nexport class ManualViewBuilder<\n\tTName extends string = string,\n\tTColumns extends Record<string, GelColumnBuilderBase> = Record<string, GelColumnBuilderBase>,\n> extends DefaultViewBuilderCore<{ name: TName; columns: TColumns }> {\n\tstatic override readonly [entityKind]: string = 'GelManualViewBuilder';\n\n\tprivate columns: Record<string, GelColumn>;\n\n\tconstructor(\n\t\tname: TName,\n\t\tcolumns: TColumns,\n\t\tschema: string | undefined,\n\t) {\n\t\tsuper(name, schema);\n\t\tthis.columns = getTableColumns(gelTable(name, columns));\n\t}\n\n\texisting(): GelViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'gel'>> {\n\t\treturn new Proxy(\n\t\t\tnew GelView({\n\t\t\t\tGelConfig: undefined,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: undefined,\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as GelViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'gel'>>;\n\t}\n\n\tas(query: SQL): GelViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'gel'>> {\n\t\treturn new Proxy(\n\t\t\tnew GelView({\n\t\t\t\tGelConfig: this.config,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: query.inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as GelViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'gel'>>;\n\t}\n}\n\nexport type GelMaterializedViewWithConfig = RequireAtLeastOne<{\n\tfillfactor: number;\n\ttoastTupleTarget: number;\n\tparallelWorkers: number;\n\tautovacuumEnabled: boolean;\n\tvacuumIndexCleanup: 'auto' | 'off' | 'on';\n\tvacuumTruncate: boolean;\n\tautovacuumVacuumThreshold: number;\n\tautovacuumVacuumScaleFactor: number;\n\tautovacuumVacuumCostDelay: number;\n\tautovacuumVacuumCostLimit: number;\n\tautovacuumFreezeMinAge: number;\n\tautovacuumFreezeMaxAge: number;\n\tautovacuumFreezeTableAge: number;\n\tautovacuumMultixactFreezeMinAge: number;\n\tautovacuumMultixactFreezeMaxAge: number;\n\tautovacuumMultixactFreezeTableAge: number;\n\tlogAutovacuumMinDuration: number;\n\tuserCatalogTable: boolean;\n}>;\n\nexport class MaterializedViewBuilderCore<TConfig extends { name: string; columns?: unknown }> {\n\tstatic readonly [entityKind]: string = 'GelMaterializedViewBuilderCore';\n\n\tdeclare _: {\n\t\treadonly name: TConfig['name'];\n\t\treadonly columns: TConfig['columns'];\n\t};\n\n\tconstructor(\n\t\tprotected name: TConfig['name'],\n\t\tprotected schema: string | undefined,\n\t) {}\n\n\tprotected config: {\n\t\twith?: GelMaterializedViewWithConfig;\n\t\tusing?: string;\n\t\ttablespace?: string;\n\t\twithNoData?: boolean;\n\t} = {};\n\n\tusing(using: string): this {\n\t\tthis.config.using = using;\n\t\treturn this;\n\t}\n\n\twith(config: GelMaterializedViewWithConfig): this {\n\t\tthis.config.with = config;\n\t\treturn this;\n\t}\n\n\ttablespace(tablespace: string): this {\n\t\tthis.config.tablespace = tablespace;\n\t\treturn this;\n\t}\n\n\twithNoData(): this {\n\t\tthis.config.withNoData = true;\n\t\treturn this;\n\t}\n}\n\nexport class MaterializedViewBuilder<TName extends string = string>\n\textends MaterializedViewBuilderCore<{ name: TName }>\n{\n\tstatic override readonly [entityKind]: string = 'GelMaterializedViewBuilder';\n\n\tas<TSelectedFields extends ColumnsSelection>(\n\t\tqb: TypedQueryBuilder<TSelectedFields> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelectedFields>),\n\t): GelMaterializedViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'gel'>> {\n\t\tif (typeof qb === 'function') {\n\t\t\tqb = qb(new QueryBuilder());\n\t\t}\n\t\tconst selectionProxy = new SelectionProxyHandler<TSelectedFields>({\n\t\t\talias: this.name,\n\t\t\tsqlBehavior: 'error',\n\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\treplaceOriginalName: true,\n\t\t});\n\t\tconst aliasedSelection = new Proxy(qb.getSelectedFields(), selectionProxy);\n\t\treturn new Proxy(\n\t\t\tnew GelMaterializedView({\n\t\t\t\tGelConfig: {\n\t\t\t\t\twith: this.config.with,\n\t\t\t\t\tusing: this.config.using,\n\t\t\t\t\ttablespace: this.config.tablespace,\n\t\t\t\t\twithNoData: this.config.withNoData,\n\t\t\t\t},\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: aliasedSelection,\n\t\t\t\t\tquery: qb.getSQL().inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tselectionProxy as any,\n\t\t) as GelMaterializedViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'gel'>>;\n\t}\n}\n\nexport class ManualMaterializedViewBuilder<\n\tTName extends string = string,\n\tTColumns extends Record<string, GelColumnBuilderBase> = Record<string, GelColumnBuilderBase>,\n> extends MaterializedViewBuilderCore<{ name: TName; columns: TColumns }> {\n\tstatic override readonly [entityKind]: string = 'GelManualMaterializedViewBuilder';\n\n\tprivate columns: Record<string, GelColumn>;\n\n\tconstructor(\n\t\tname: TName,\n\t\tcolumns: TColumns,\n\t\tschema: string | undefined,\n\t) {\n\t\tsuper(name, schema);\n\t\tthis.columns = getTableColumns(gelTable(name, columns));\n\t}\n\n\texisting(): GelMaterializedViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'gel'>> {\n\t\treturn new Proxy(\n\t\t\tnew GelMaterializedView({\n\t\t\t\tGelConfig: {\n\t\t\t\t\ttablespace: this.config.tablespace,\n\t\t\t\t\tusing: this.config.using,\n\t\t\t\t\twith: this.config.with,\n\t\t\t\t\twithNoData: this.config.withNoData,\n\t\t\t\t},\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: undefined,\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as GelMaterializedViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'gel'>>;\n\t}\n\n\tas(query: SQL): GelMaterializedViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'gel'>> {\n\t\treturn new Proxy(\n\t\t\tnew GelMaterializedView({\n\t\t\t\tGelConfig: {\n\t\t\t\t\ttablespace: this.config.tablespace,\n\t\t\t\t\tusing: this.config.using,\n\t\t\t\t\twith: this.config.with,\n\t\t\t\t\twithNoData: this.config.withNoData,\n\t\t\t\t},\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: query.inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as GelMaterializedViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'gel'>>;\n\t}\n}\n\nexport class GelView<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> extends GelViewBase<TName, TExisting, TSelectedFields> {\n\tstatic override readonly [entityKind]: string = 'GelView';\n\n\t[GelViewConfig]: {\n\t\twith?: ViewWithConfig;\n\t} | undefined;\n\n\tconstructor({ GelConfig, config }: {\n\t\tGelConfig: {\n\t\t\twith?: ViewWithConfig;\n\t\t} | undefined;\n\t\tconfig: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t};\n\t}) {\n\t\tsuper(config);\n\t\tif (GelConfig) {\n\t\t\tthis[GelViewConfig] = {\n\t\t\t\twith: GelConfig.with,\n\t\t\t};\n\t\t}\n\t}\n}\n\nexport type GelViewWithSelection<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> = GelView<TName, TExisting, TSelectedFields> & TSelectedFields;\n\nexport const GelMaterializedViewConfig = Symbol.for('drizzle:GelMaterializedViewConfig');\n\nexport class GelMaterializedView<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> extends GelViewBase<TName, TExisting, TSelectedFields> {\n\tstatic override readonly [entityKind]: string = 'GelMaterializedView';\n\n\treadonly [GelMaterializedViewConfig]: {\n\t\treadonly with?: GelMaterializedViewWithConfig;\n\t\treadonly using?: string;\n\t\treadonly tablespace?: string;\n\t\treadonly withNoData?: boolean;\n\t} | undefined;\n\n\tconstructor({ GelConfig, config }: {\n\t\tGelConfig: {\n\t\t\twith: GelMaterializedViewWithConfig | undefined;\n\t\t\tusing: string | undefined;\n\t\t\ttablespace: string | undefined;\n\t\t\twithNoData: boolean | undefined;\n\t\t} | undefined;\n\t\tconfig: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t};\n\t}) {\n\t\tsuper(config);\n\t\tthis[GelMaterializedViewConfig] = {\n\t\t\twith: GelConfig?.with,\n\t\t\tusing: GelConfig?.using,\n\t\t\ttablespace: GelConfig?.tablespace,\n\t\t\twithNoData: GelConfig?.withNoData,\n\t\t};\n\t}\n}\n\nexport type GelMaterializedViewWithSelection<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> = GelMaterializedView<TName, TExisting, TSelectedFields> & TSelectedFields;\n\n/** @internal */\nexport function gelViewWithSchema(\n\tname: string,\n\tselection: Record<string, GelColumnBuilderBase> | undefined,\n\tschema: string | undefined,\n): ViewBuilder | ManualViewBuilder {\n\tif (selection) {\n\t\treturn new ManualViewBuilder(name, selection, schema);\n\t}\n\treturn new ViewBuilder(name, schema);\n}\n\n/** @internal */\nexport function gelMaterializedViewWithSchema(\n\tname: string,\n\tselection: Record<string, GelColumnBuilderBase> | undefined,\n\tschema: string | undefined,\n): MaterializedViewBuilder | ManualMaterializedViewBuilder {\n\tif (selection) {\n\t\treturn new ManualMaterializedViewBuilder(name, selection, schema);\n\t}\n\treturn new MaterializedViewBuilder(name, schema);\n}\n\n// TODO not implemented\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction gelView<TName extends string>(name: TName): ViewBuilder<TName>;\nfunction gelView<TName extends string, TColumns extends Record<string, GelColumnBuilderBase>>(\n\tname: TName,\n\tcolumns: TColumns,\n): ManualViewBuilder<TName, TColumns>;\nfunction gelView(name: string, columns?: Record<string, GelColumnBuilderBase>): ViewBuilder | ManualViewBuilder {\n\treturn gelViewWithSchema(name, columns, undefined);\n}\n\n// TODO not implemented\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction gelMaterializedView<TName extends string>(name: TName): MaterializedViewBuilder<TName>;\nfunction gelMaterializedView<TName extends string, TColumns extends Record<string, GelColumnBuilderBase>>(\n\tname: TName,\n\tcolumns: TColumns,\n): ManualMaterializedViewBuilder<TName, TColumns>;\nfunction gelMaterializedView(\n\tname: string,\n\tcolumns?: Record<string, GelColumnBuilderBase>,\n): MaterializedViewBuilder | ManualMaterializedViewBuilder {\n\treturn gelMaterializedViewWithSchema(name, columns, undefined);\n}\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction isGelView(obj: unknown): obj is GelView {\n\treturn is(obj, GelView);\n}\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction isGelMaterializedView(obj: unknown): obj is GelMaterializedView {\n\treturn is(obj, GelMaterializedView);\n}\n"
  },
  {
    "path": "drizzle-orm/src/index.ts",
    "content": "export * from './alias.ts';\nexport * from './column-builder.ts';\nexport * from './column.ts';\nexport * from './entity.ts';\nexport * from './errors.ts';\nexport * from './logger.ts';\nexport * from './operations.ts';\nexport * from './query-promise.ts';\nexport * from './relations.ts';\nexport * from './sql/index.ts';\nexport * from './subquery.ts';\nexport * from './table.ts';\nexport * from './utils.ts';\nexport * from './view-common.ts';\n"
  },
  {
    "path": "drizzle-orm/src/knex/README.md",
    "content": "# Drizzle ORM + Knex.js\n\nThis is a toolchain for integrating Drizzle with [Knex.js](https://knexjs.org/).\n\n## Using Knex as a query builder\n\nYou can define you DB schema using Drizzle and use Knex as the query builder. With this approach you benefit from schema definition and automated migrations provided by Drizzle, and you can use Knex to build your queries. This might be helpful if you have an existing Knex.js project and you want to add Drizzle features to it.\n\nThis integration is based on [official Knex TypeScript guide](https://knexjs.org/guide/#typescript).\n\n```ts\nimport Knex from 'knex';\nimport { pgTable, serial, text } from 'drizzle-orm/pg-core';\n// This line is important - it allows you to use the Knexify type\nimport 'drizzle-orm/knex';\n\nconst test = pgTable('test', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull(),\n});\n\ndeclare module 'knex/types/tables' {\n  interface Tables {\n    test: Knexify<typeof test>;\n  }\n}\n\nconst db = Knex({});\n\nconst result/*: { id: number, name: string }[] */ = db('test').select();\n```\n\n## Wrapping Knex connection with Drizzle\n\nComing soon!\n"
  },
  {
    "path": "drizzle-orm/src/knex/index.ts",
    "content": "import type { Knex as KnexType } from 'knex';\nimport type { InferInsertModel, InferSelectModel, Table } from '~/table.ts';\n\ndeclare module 'knex/types/tables.ts' {\n\texport type Knexify<T extends Table> =\n\t\t& KnexType.CompositeTableType<\n\t\t\tInferSelectModel<T, { dbColumnNames: true }>,\n\t\t\tInferInsertModel<T, { dbColumnNames: true }>\n\t\t>\n\t\t& {};\n}\n"
  },
  {
    "path": "drizzle-orm/src/kysely/README.md",
    "content": "# Drizzle ORM + Kysely\n\nThis is a toolchain for integrating Drizzle with [Kysely](https://kysely-org.github.io/kysely/).\n\n## Using Kysely as a query builder\n\nYou can define you DB schema using Drizzle and use Kysely as the query builder. With this approach you benefit from schema definition and automated migrations provided by Drizzle, and you can use Kysely to build your queries. This might be helpful if you have an existing Kysely project and you want to add Drizzle features to it.\n\n```ts\nimport { Kysely, PostgresDialect } from 'kysely';\nimport { Pool } from 'pg';\nimport { Kyselify } from 'drizzle-orm/kysely';\nimport { pgTable, serial, text } from 'drizzle-orm/pg-core';\n\nconst test = pgTable('test', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull(),\n});\n\ninterface Database {\n  test: Kyselify<typeof test>;\n}\n\nconst db = new Kysely<Database>({\n  dialect: new PostgresDialect({\n    pool: new Pool(),\n  }),\n});\n\nconst result/*: { id: number, name: string }[] */ = db.selectFrom('test').selectAll().execute();\n```\n"
  },
  {
    "path": "drizzle-orm/src/kysely/index.ts",
    "content": "import type { ColumnType } from 'kysely';\nimport type { InferInsertModel, InferSelectModel, MapColumnName, Table } from '~/table.ts';\nimport type { Simplify } from '~/utils.ts';\n\nexport type Kyselify<T extends Table> = Simplify<\n\t{\n\t\t[Key in keyof T['_']['columns'] & string as MapColumnName<Key, T['_']['columns'][Key], true>]: ColumnType<\n\t\t\t// select\n\t\t\tInferSelectModel<T, { dbColumnNames: true }>[MapColumnName<Key, T['_']['columns'][Key], true>],\n\t\t\t// insert\n\t\t\tMapColumnName<Key, T['_']['columns'][Key], true> extends keyof InferInsertModel<\n\t\t\t\tT,\n\t\t\t\t{ dbColumnNames: true }\n\t\t\t> ? InferInsertModel<T, { dbColumnNames: true }>[MapColumnName<Key, T['_']['columns'][Key], true>]\n\t\t\t\t: never,\n\t\t\t// update\n\t\t\tMapColumnName<Key, T['_']['columns'][Key], true> extends keyof InferInsertModel<\n\t\t\t\tT,\n\t\t\t\t{ dbColumnNames: true }\n\t\t\t> ? InferInsertModel<T, { dbColumnNames: true }>[MapColumnName<Key, T['_']['columns'][Key], true>]\n\t\t\t\t: never\n\t\t>;\n\t}\n>;\n"
  },
  {
    "path": "drizzle-orm/src/libsql/driver-core.ts",
    "content": "import type { Client, ResultSet } from '@libsql/client';\nimport type { BatchItem, BatchResponse } from '~/batch.ts';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype ExtractTablesWithRelations,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { BaseSQLiteDatabase } from '~/sqlite-core/db.ts';\nimport { SQLiteAsyncDialect } from '~/sqlite-core/dialect.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport { LibSQLSession } from './session.ts';\n\nexport class LibSQLDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends BaseSQLiteDatabase<'async', ResultSet, TSchema> {\n\tstatic override readonly [entityKind]: string = 'LibSQLDatabase';\n\n\t/** @internal */\n\tdeclare readonly session: LibSQLSession<TSchema, ExtractTablesWithRelations<TSchema>>;\n\n\tasync batch<U extends BatchItem<'sqlite'>, T extends Readonly<[U, ...U[]]>>(\n\t\tbatch: T,\n\t): Promise<BatchResponse<T>> {\n\t\treturn this.session.batch(batch) as Promise<BatchResponse<T>>;\n\t}\n}\n\n/** @internal */\nexport function construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n>(client: Client, config: DrizzleConfig<TSchema> = {}): LibSQLDatabase<TSchema> & {\n\t$client: Client;\n} {\n\tconst dialect = new SQLiteAsyncDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new LibSQLSession(client, dialect, schema, { logger, cache: config.cache }, undefined);\n\tconst db = new LibSQLDatabase('async', dialect, session, schema) as LibSQLDatabase<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\treturn db as any;\n}\n"
  },
  {
    "path": "drizzle-orm/src/libsql/driver.ts",
    "content": "import { type Client, type Config, createClient } from '@libsql/client';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { construct as construct, type LibSQLDatabase } from './driver-core.ts';\n\nexport { LibSQLDatabase } from './driver-core.ts';\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Client = Client,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | Config;\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): LibSQLDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = createClient({\n\t\t\turl: params[0],\n\t\t});\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& { connection?: Config; client?: TClient }\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tconst instance = typeof connection === 'string' ? createClient({ url: connection }) : createClient(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): LibSQLDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/libsql/http/index.ts",
    "content": "import { type Client, type Config, createClient } from '@libsql/client/http';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { construct, type LibSQLDatabase } from '../driver-core.ts';\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Client = Client,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | Config;\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): LibSQLDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = createClient({\n\t\t\turl: params[0],\n\t\t});\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& { connection?: Config; client?: TClient }\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tconst instance = typeof connection === 'string' ? createClient({ url: connection }) : createClient(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): LibSQLDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/libsql/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/libsql/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { LibSQLDatabase } from './driver.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: LibSQLDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tconst migrationsTable = config.migrationsTable ?? '__drizzle_migrations';\n\n\tconst migrationTableCreate = sql`\n\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\tid SERIAL PRIMARY KEY,\n\t\t\thash text NOT NULL,\n\t\t\tcreated_at numeric\n\t\t)\n\t`;\n\tawait db.session.run(migrationTableCreate);\n\n\tconst dbMigrations = await db.values<[number, string, string]>(\n\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t);\n\n\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\n\tconst statementToBatch = [];\n\n\tfor (const migration of migrations) {\n\t\tif (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {\n\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\tstatementToBatch.push(db.run(sql.raw(stmt)));\n\t\t\t}\n\n\t\t\tstatementToBatch.push(\n\t\t\t\tdb.run(\n\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tawait db.session.migrate(statementToBatch);\n}\n"
  },
  {
    "path": "drizzle-orm/src/libsql/node/index.ts",
    "content": "import { type Client, type Config, createClient } from '@libsql/client/node';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { construct, type LibSQLDatabase } from '../driver-core.ts';\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Client = Client,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | Config;\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): LibSQLDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = createClient({\n\t\t\turl: params[0],\n\t\t});\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& { connection?: Config; client?: TClient }\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tconst instance = typeof connection === 'string' ? createClient({ url: connection }) : createClient(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): LibSQLDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/libsql/session.ts",
    "content": "import type { Client, InArgs, InStatement, ResultSet, Transaction } from '@libsql/client';\nimport type { BatchItem as BatchItem } from '~/batch.ts';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport { fillPlaceholders, type Query, sql } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect } from '~/sqlite-core/dialect.ts';\nimport { SQLiteTransaction } from '~/sqlite-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts';\nimport type {\n\tPreparedQueryConfig as PreparedQueryConfigBase,\n\tSQLiteExecuteMethod,\n\tSQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport interface LibSQLSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\ntype PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\n\nexport class LibSQLSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteSession<'async', ResultSet, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'LibSQLSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: Client,\n\t\tdialect: SQLiteAsyncDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: LibSQLSessionOptions,\n\t\tprivate tx: Transaction | undefined,\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => unknown,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): LibSQLPreparedQuery<T> {\n\t\treturn new LibSQLPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tthis.tx,\n\t\t\texecuteMethod,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\tasync batch<T extends BatchItem<'sqlite'>[] | readonly BatchItem<'sqlite'>[]>(queries: T) {\n\t\tconst preparedQueries: PreparedQuery[] = [];\n\t\tconst builtQueries: InStatement[] = [];\n\n\t\tfor (const query of queries) {\n\t\t\tconst preparedQuery = query._prepare();\n\t\t\tconst builtQuery = preparedQuery.getQuery();\n\t\t\tpreparedQueries.push(preparedQuery);\n\t\t\tbuiltQueries.push({ sql: builtQuery.sql, args: builtQuery.params as InArgs });\n\t\t}\n\n\t\tconst batchResults = await this.client.batch(builtQueries);\n\t\treturn batchResults.map((result, i) => preparedQueries[i]!.mapResult(result, true));\n\t}\n\n\tasync migrate<T extends BatchItem<'sqlite'>[] | readonly BatchItem<'sqlite'>[]>(queries: T) {\n\t\tconst preparedQueries: PreparedQuery[] = [];\n\t\tconst builtQueries: InStatement[] = [];\n\n\t\tfor (const query of queries) {\n\t\t\tconst preparedQuery = query._prepare();\n\t\t\tconst builtQuery = preparedQuery.getQuery();\n\t\t\tpreparedQueries.push(preparedQuery);\n\t\t\tbuiltQueries.push({ sql: builtQuery.sql, args: builtQuery.params as InArgs });\n\t\t}\n\n\t\tconst batchResults = await this.client.migrate(builtQueries);\n\t\treturn batchResults.map((result, i) => preparedQueries[i]!.mapResult(result, true));\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (db: LibSQLTransaction<TFullSchema, TSchema>) => T | Promise<T>,\n\t\t_config?: SQLiteTransactionConfig,\n\t): Promise<T> {\n\t\t// TODO: support transaction behavior\n\t\tconst libsqlTx = await this.client.transaction();\n\t\tconst session = new LibSQLSession<TFullSchema, TSchema>(\n\t\t\tthis.client,\n\t\t\tthis.dialect,\n\t\t\tthis.schema,\n\t\t\tthis.options,\n\t\t\tlibsqlTx,\n\t\t);\n\t\tconst tx = new LibSQLTransaction<TFullSchema, TSchema>('async', this.dialect, session, this.schema);\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait libsqlTx.commit();\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait libsqlTx.rollback();\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\toverride extractRawAllValueFromBatchResult(result: unknown): unknown {\n\t\treturn (result as ResultSet).rows;\n\t}\n\n\toverride extractRawGetValueFromBatchResult(result: unknown): unknown {\n\t\treturn (result as ResultSet).rows[0];\n\t}\n\n\toverride extractRawValuesValueFromBatchResult(result: unknown): unknown {\n\t\treturn (result as ResultSet).rows;\n\t}\n}\n\nexport class LibSQLTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteTransaction<'async', ResultSet, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'LibSQLTransaction';\n\n\toverride async transaction<T>(transaction: (tx: LibSQLTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex}`;\n\t\tconst tx = new LibSQLTransaction('async', this.dialect, this.session, this.schema, this.nestedIndex + 1);\n\t\tawait this.session.run(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait this.session.run(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait this.session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class LibSQLPreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends SQLitePreparedQuery<\n\t{ type: 'async'; run: ResultSet; all: T['all']; get: T['get']; values: T['values']; execute: T['execute'] }\n> {\n\tstatic override readonly [entityKind]: string = 'LibSQLPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: Client,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\t/** @internal */ public fields: SelectedFieldsOrdered | undefined,\n\t\tprivate tx: Transaction | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\t/** @internal */ public customResultMapper?: (\n\t\t\trows: unknown[][],\n\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t) => unknown,\n\t) {\n\t\tsuper('async', executeMethod, query, cache, queryMetadata, cacheConfig);\n\t\tthis.customResultMapper = customResultMapper;\n\t\tthis.fields = fields;\n\t}\n\n\tasync run(placeholderValues?: Record<string, unknown>): Promise<ResultSet> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn await this.queryWithCache(this.query.sql, params, async () => {\n\t\t\tconst stmt: InStatement = { sql: this.query.sql, args: params as InArgs };\n\t\t\treturn this.tx ? this.tx.execute(stmt) : this.client.execute(stmt);\n\t\t});\n\t}\n\n\tasync all(placeholderValues?: Record<string, unknown>): Promise<T['all']> {\n\t\tconst { fields, logger, query, tx, client, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\t\tlogger.logQuery(query.sql, params);\n\t\t\treturn await this.queryWithCache(query.sql, params, async () => {\n\t\t\t\tconst stmt: InStatement = { sql: query.sql, args: params as InArgs };\n\t\t\t\treturn (tx ? tx.execute(stmt) : client.execute(stmt)).then(({ rows }) => this.mapAllResult(rows));\n\t\t\t});\n\t\t}\n\n\t\tconst rows = await this.values(placeholderValues) as unknown[][];\n\n\t\treturn this.mapAllResult(rows);\n\t}\n\n\toverride mapAllResult(rows: unknown, isFromBatch?: boolean): unknown {\n\t\tif (isFromBatch) {\n\t\t\trows = (rows as ResultSet).rows;\n\t\t}\n\n\t\tif (!this.fields && !this.customResultMapper) {\n\t\t\treturn (rows as unknown[]).map((row) => normalizeRow(row));\n\t\t}\n\n\t\tif (this.customResultMapper) {\n\t\t\treturn this.customResultMapper(rows as unknown[][], normalizeFieldValue) as T['all'];\n\t\t}\n\n\t\treturn (rows as unknown[]).map((row) => {\n\t\t\treturn mapResultRow(\n\t\t\t\tthis.fields!,\n\t\t\t\tArray.prototype.slice.call(row).map((v) => normalizeFieldValue(v)),\n\t\t\t\tthis.joinsNotNullableMap,\n\t\t\t);\n\t\t});\n\t}\n\n\tasync get(placeholderValues?: Record<string, unknown>): Promise<T['get']> {\n\t\tconst { fields, logger, query, tx, client, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\t\tlogger.logQuery(query.sql, params);\n\t\t\treturn await this.queryWithCache(query.sql, params, async () => {\n\t\t\t\tconst stmt: InStatement = { sql: query.sql, args: params as InArgs };\n\t\t\t\treturn (tx ? tx.execute(stmt) : client.execute(stmt)).then(({ rows }) => this.mapGetResult(rows));\n\t\t\t});\n\t\t}\n\n\t\tconst rows = await this.values(placeholderValues) as unknown[][];\n\n\t\treturn this.mapGetResult(rows);\n\t}\n\n\toverride mapGetResult(rows: unknown, isFromBatch?: boolean): unknown {\n\t\tif (isFromBatch) {\n\t\t\trows = (rows as ResultSet).rows;\n\t\t}\n\n\t\tconst row = (rows as unknown[])[0];\n\n\t\tif (!this.fields && !this.customResultMapper) {\n\t\t\treturn normalizeRow(row);\n\t\t}\n\n\t\tif (!row) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (this.customResultMapper) {\n\t\t\treturn this.customResultMapper(rows as unknown[][], normalizeFieldValue) as T['get'];\n\t\t}\n\n\t\treturn mapResultRow(\n\t\t\tthis.fields!,\n\t\t\tArray.prototype.slice.call(row).map((v) => normalizeFieldValue(v)),\n\t\t\tthis.joinsNotNullableMap,\n\t\t);\n\t}\n\n\tasync values(placeholderValues?: Record<string, unknown>): Promise<T['values']> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn await this.queryWithCache(this.query.sql, params, async () => {\n\t\t\tconst stmt: InStatement = { sql: this.query.sql, args: params as InArgs };\n\t\t\treturn (this.tx ? this.tx.execute(stmt) : this.client.execute(stmt)).then(({ rows }) => rows) as Promise<\n\t\t\t\tT['values']\n\t\t\t>;\n\t\t});\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nfunction normalizeRow(obj: any) {\n\t// The libSQL node-sqlite3 compatibility wrapper returns rows\n\t// that can be accessed both as objects and arrays. Let's\n\t// turn them into objects what's what other SQLite drivers\n\t// do.\n\treturn Object.keys(obj).reduce((acc: Record<string, any>, key) => {\n\t\tif (Object.prototype.propertyIsEnumerable.call(obj, key)) {\n\t\t\tacc[key] = obj[key];\n\t\t}\n\t\treturn acc;\n\t}, {});\n}\n\nfunction normalizeFieldValue(value: unknown) {\n\tif (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { // eslint-disable-line no-instanceof/no-instanceof\n\t\tif (typeof Buffer !== 'undefined') {\n\t\t\tif (!(value instanceof Buffer)) { // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t\treturn Buffer.from(value);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tif (typeof TextDecoder !== 'undefined') {\n\t\t\treturn new TextDecoder().decode(value);\n\t\t}\n\t\tthrow new Error('TextDecoder is not available. Please provide either Buffer or TextDecoder polyfill.');\n\t}\n\treturn value;\n}\n"
  },
  {
    "path": "drizzle-orm/src/libsql/sqlite3/index.ts",
    "content": "import { type Client, type Config, createClient } from '@libsql/client/sqlite3';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { construct, type LibSQLDatabase } from '../driver-core.ts';\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Client = Client,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | Config;\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): LibSQLDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = createClient({\n\t\t\turl: params[0],\n\t\t});\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& { connection?: Config; client?: TClient }\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tconst instance = typeof connection === 'string' ? createClient({ url: connection }) : createClient(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): LibSQLDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/libsql/wasm/index.ts",
    "content": "import { type Client, type Config, createClient } from '@libsql/client-wasm';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { construct, type LibSQLDatabase } from '../driver-core.ts';\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Client = Client,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | Config;\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): LibSQLDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = createClient({\n\t\t\turl: params[0],\n\t\t});\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& { connection?: Config; client?: TClient }\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tconst instance = typeof connection === 'string' ? createClient({ url: connection }) : createClient(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): LibSQLDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/libsql/web/index.ts",
    "content": "import { type Client, type Config, createClient } from '@libsql/client/web';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { construct, type LibSQLDatabase } from '../driver-core.ts';\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Client = Client,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | Config;\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): LibSQLDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = createClient({\n\t\t\turl: params[0],\n\t\t});\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& { connection?: Config; client?: TClient }\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tconst instance = typeof connection === 'string' ? createClient({ url: connection }) : createClient(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): LibSQLDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/libsql/ws/index.ts",
    "content": "import { type Client, type Config, createClient } from '@libsql/client/ws';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { construct, type LibSQLDatabase } from '../driver-core.ts';\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Client = Client,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | Config;\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): LibSQLDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = createClient({\n\t\t\turl: params[0],\n\t\t});\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& { connection?: Config; client?: TClient }\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tconst instance = typeof connection === 'string' ? createClient({ url: connection }) : createClient(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): LibSQLDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/logger.ts",
    "content": "import { entityKind } from '~/entity.ts';\n\nexport interface Logger {\n\tlogQuery(query: string, params: unknown[]): void;\n}\n\nexport interface LogWriter {\n\twrite(message: string): void;\n}\n\nexport class ConsoleLogWriter implements LogWriter {\n\tstatic readonly [entityKind]: string = 'ConsoleLogWriter';\n\n\twrite(message: string) {\n\t\tconsole.log(message);\n\t}\n}\n\nexport class DefaultLogger implements Logger {\n\tstatic readonly [entityKind]: string = 'DefaultLogger';\n\n\treadonly writer: LogWriter;\n\n\tconstructor(config?: { writer: LogWriter }) {\n\t\tthis.writer = config?.writer ?? new ConsoleLogWriter();\n\t}\n\n\tlogQuery(query: string, params: unknown[]): void {\n\t\tconst stringifiedParams = params.map((p) => {\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(p);\n\t\t\t} catch {\n\t\t\t\treturn String(p);\n\t\t\t}\n\t\t});\n\t\tconst paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(', ')}]` : '';\n\t\tthis.writer.write(`Query: ${query}${paramsStr}`);\n\t}\n}\n\nexport class NoopLogger implements Logger {\n\tstatic readonly [entityKind]: string = 'NoopLogger';\n\n\tlogQuery(): void {\n\t\t// noop\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/migrator.ts",
    "content": "import crypto from 'node:crypto';\nimport fs from 'node:fs';\n\nexport interface KitConfig {\n\tout: string;\n\tschema: string;\n}\n\nexport interface MigrationConfig {\n\tmigrationsFolder: string;\n\tmigrationsTable?: string;\n\tmigrationsSchema?: string;\n}\n\nexport interface MigrationMeta {\n\tsql: string[];\n\tfolderMillis: number;\n\thash: string;\n\tbps: boolean;\n}\n\nexport function readMigrationFiles(config: MigrationConfig): MigrationMeta[] {\n\tconst migrationFolderTo = config.migrationsFolder;\n\n\tconst migrationQueries: MigrationMeta[] = [];\n\n\tconst journalPath = `${migrationFolderTo}/meta/_journal.json`;\n\tif (!fs.existsSync(journalPath)) {\n\t\tthrow new Error(`Can't find meta/_journal.json file`);\n\t}\n\n\tconst journalAsString = fs.readFileSync(`${migrationFolderTo}/meta/_journal.json`).toString();\n\n\tconst journal = JSON.parse(journalAsString) as {\n\t\tentries: { idx: number; when: number; tag: string; breakpoints: boolean }[];\n\t};\n\n\tfor (const journalEntry of journal.entries) {\n\t\tconst migrationPath = `${migrationFolderTo}/${journalEntry.tag}.sql`;\n\n\t\ttry {\n\t\t\tconst query = fs.readFileSync(`${migrationFolderTo}/${journalEntry.tag}.sql`).toString();\n\n\t\t\tconst result = query.split('--> statement-breakpoint').map((it) => {\n\t\t\t\treturn it;\n\t\t\t});\n\n\t\t\tmigrationQueries.push({\n\t\t\t\tsql: result,\n\t\t\t\tbps: journalEntry.breakpoints,\n\t\t\t\tfolderMillis: journalEntry.when,\n\t\t\t\thash: crypto.createHash('sha256').update(query).digest('hex'),\n\t\t\t});\n\t\t} catch {\n\t\t\tthrow new Error(`No file ${migrationPath} found in ${migrationFolderTo} folder`);\n\t\t}\n\t}\n\n\treturn migrationQueries;\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/alias.ts",
    "content": "import { TableAliasProxyHandler } from '~/alias.ts';\nimport type { BuildAliasTable } from './query-builders/select.types.ts';\nimport type { MySqlTable } from './table.ts';\nimport type { MySqlViewBase } from './view-base.ts';\n\nexport function alias<TTable extends MySqlTable | MySqlViewBase, TAlias extends string>(\n\ttable: TTable,\n\talias: TAlias,\n): BuildAliasTable<TTable, TAlias> {\n\treturn new Proxy(table, new TableAliasProxyHandler(alias, false)) as any;\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/checks.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { MySqlTable } from './table.ts';\n\nexport class CheckBuilder {\n\tstatic readonly [entityKind]: string = 'MySqlCheckBuilder';\n\n\tprotected brand!: 'MySqlConstraintBuilder';\n\n\tconstructor(public name: string, public value: SQL) {}\n\n\t/** @internal */\n\tbuild(table: MySqlTable): Check {\n\t\treturn new Check(table, this);\n\t}\n}\n\nexport class Check {\n\tstatic readonly [entityKind]: string = 'MySqlCheck';\n\n\treadonly name: string;\n\treadonly value: SQL;\n\n\tconstructor(public table: MySqlTable, builder: CheckBuilder) {\n\t\tthis.name = builder.name;\n\t\tthis.value = builder.value;\n\t}\n}\n\nexport function check(name: string, value: SQL): CheckBuilder {\n\treturn new CheckBuilder(name, value);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/all.ts",
    "content": "import { bigint } from './bigint.ts';\nimport { binary } from './binary.ts';\nimport { boolean } from './boolean.ts';\nimport { char } from './char.ts';\nimport { customType } from './custom.ts';\nimport { date } from './date.ts';\nimport { datetime } from './datetime.ts';\nimport { decimal } from './decimal.ts';\nimport { double } from './double.ts';\nimport { mysqlEnum } from './enum.ts';\nimport { float } from './float.ts';\nimport { int } from './int.ts';\nimport { json } from './json.ts';\nimport { mediumint } from './mediumint.ts';\nimport { real } from './real.ts';\nimport { serial } from './serial.ts';\nimport { smallint } from './smallint.ts';\nimport { longtext, mediumtext, text, tinytext } from './text.ts';\nimport { time } from './time.ts';\nimport { timestamp } from './timestamp.ts';\nimport { tinyint } from './tinyint.ts';\nimport { varbinary } from './varbinary.ts';\nimport { varchar } from './varchar.ts';\nimport { year } from './year.ts';\n\nexport function getMySqlColumnBuilders() {\n\treturn {\n\t\tbigint,\n\t\tbinary,\n\t\tboolean,\n\t\tchar,\n\t\tcustomType,\n\t\tdate,\n\t\tdatetime,\n\t\tdecimal,\n\t\tdouble,\n\t\tmysqlEnum,\n\t\tfloat,\n\t\tint,\n\t\tjson,\n\t\tmediumint,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\ttext,\n\t\ttime,\n\t\ttimestamp,\n\t\ttinyint,\n\t\tvarbinary,\n\t\tvarchar,\n\t\tyear,\n\t\tlongtext,\n\t\tmediumtext,\n\t\ttinytext,\n\t};\n}\n\nexport type MySqlColumnBuilders = ReturnType<typeof getMySqlColumnBuilders>;\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/bigint.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumnBuilderWithAutoIncrement, MySqlColumnWithAutoIncrement } from './common.ts';\n\nexport type MySqlBigInt53BuilderInitial<TName extends string> = MySqlBigInt53Builder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'MySqlBigInt53';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlBigInt53Builder<T extends ColumnBuilderBaseConfig<'number', 'MySqlBigInt53'>>\n\textends MySqlColumnBuilderWithAutoIncrement<T, { unsigned: boolean }>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlBigInt53Builder';\n\n\tconstructor(name: T['name'], unsigned: boolean = false) {\n\t\tsuper(name, 'number', 'MySqlBigInt53');\n\t\tthis.config.unsigned = unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlBigInt53<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlBigInt53<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlBigInt53<T extends ColumnBaseConfig<'number', 'MySqlBigInt53'>>\n\textends MySqlColumnWithAutoIncrement<T, { unsigned: boolean }>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlBigInt53';\n\n\tgetSQLType(): string {\n\t\treturn `bigint${this.config.unsigned ? ' unsigned' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'number') {\n\t\t\treturn value;\n\t\t}\n\t\treturn Number(value);\n\t}\n}\n\nexport type MySqlBigInt64BuilderInitial<TName extends string> = MySqlBigInt64Builder<{\n\tname: TName;\n\tdataType: 'bigint';\n\tcolumnType: 'MySqlBigInt64';\n\tdata: bigint;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlBigInt64Builder<T extends ColumnBuilderBaseConfig<'bigint', 'MySqlBigInt64'>>\n\textends MySqlColumnBuilderWithAutoIncrement<T, { unsigned: boolean }>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlBigInt64Builder';\n\n\tconstructor(name: T['name'], unsigned: boolean = false) {\n\t\tsuper(name, 'bigint', 'MySqlBigInt64');\n\t\tthis.config.unsigned = unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlBigInt64<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlBigInt64<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlBigInt64<T extends ColumnBaseConfig<'bigint', 'MySqlBigInt64'>>\n\textends MySqlColumnWithAutoIncrement<T, { unsigned: boolean }>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlBigInt64';\n\n\tgetSQLType(): string {\n\t\treturn `bigint${this.config.unsigned ? ' unsigned' : ''}`;\n\t}\n\n\t// eslint-disable-next-line unicorn/prefer-native-coercion-functions\n\toverride mapFromDriverValue(value: string): bigint {\n\t\treturn BigInt(value);\n\t}\n}\n\nexport interface MySqlBigIntConfig<T extends 'number' | 'bigint' = 'number' | 'bigint'> {\n\tmode: T;\n\tunsigned?: boolean;\n}\n\nexport function bigint<TMode extends MySqlBigIntConfig['mode']>(\n\tconfig: MySqlBigIntConfig<TMode>,\n): TMode extends 'number' ? MySqlBigInt53BuilderInitial<''> : MySqlBigInt64BuilderInitial<''>;\nexport function bigint<TName extends string, TMode extends MySqlBigIntConfig['mode']>(\n\tname: TName,\n\tconfig: MySqlBigIntConfig<TMode>,\n): TMode extends 'number' ? MySqlBigInt53BuilderInitial<TName> : MySqlBigInt64BuilderInitial<TName>;\nexport function bigint(a?: string | MySqlBigIntConfig, b?: MySqlBigIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlBigIntConfig>(a, b);\n\tif (config.mode === 'number') {\n\t\treturn new MySqlBigInt53Builder(name, config.unsigned);\n\t}\n\treturn new MySqlBigInt64Builder(name, config.unsigned);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/binary.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\nexport type MySqlBinaryBuilderInitial<TName extends string> = MySqlBinaryBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'MySqlBinary';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlBinaryBuilder<T extends ColumnBuilderBaseConfig<'string', 'MySqlBinary'>> extends MySqlColumnBuilder<\n\tT,\n\tMySqlBinaryConfig\n> {\n\tstatic override readonly [entityKind]: string = 'MySqlBinaryBuilder';\n\n\tconstructor(name: T['name'], length: number | undefined) {\n\t\tsuper(name, 'string', 'MySqlBinary');\n\t\tthis.config.length = length;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlBinary<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlBinary<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class MySqlBinary<T extends ColumnBaseConfig<'string', 'MySqlBinary'>> extends MySqlColumn<\n\tT,\n\tMySqlBinaryConfig\n> {\n\tstatic override readonly [entityKind]: string = 'MySqlBinary';\n\n\tlength: number | undefined = this.config.length;\n\n\toverride mapFromDriverValue(value: string | Buffer | Uint8Array): string {\n\t\tif (typeof value === 'string') return value;\n\t\tif (Buffer.isBuffer(value)) return value.toString();\n\n\t\tconst str: string[] = [];\n\t\tfor (const v of value) {\n\t\t\tstr.push(v === 49 ? '1' : '0');\n\t\t}\n\n\t\treturn str.join('');\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `binary` : `binary(${this.length})`;\n\t}\n}\n\nexport interface MySqlBinaryConfig {\n\tlength?: number;\n}\n\nexport function binary(): MySqlBinaryBuilderInitial<''>;\nexport function binary(\n\tconfig?: MySqlBinaryConfig,\n): MySqlBinaryBuilderInitial<''>;\nexport function binary<TName extends string>(\n\tname: TName,\n\tconfig?: MySqlBinaryConfig,\n): MySqlBinaryBuilderInitial<TName>;\nexport function binary(a?: string | MySqlBinaryConfig, b: MySqlBinaryConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlBinaryConfig>(a, b);\n\treturn new MySqlBinaryBuilder(name, config.length);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/boolean.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\nexport type MySqlBooleanBuilderInitial<TName extends string> = MySqlBooleanBuilder<{\n\tname: TName;\n\tdataType: 'boolean';\n\tcolumnType: 'MySqlBoolean';\n\tdata: boolean;\n\tdriverParam: number | boolean;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlBooleanBuilder<T extends ColumnBuilderBaseConfig<'boolean', 'MySqlBoolean'>>\n\textends MySqlColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlBooleanBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'boolean', 'MySqlBoolean');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlBoolean<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlBoolean<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlBoolean<T extends ColumnBaseConfig<'boolean', 'MySqlBoolean'>> extends MySqlColumn<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlBoolean';\n\n\tgetSQLType(): string {\n\t\treturn 'boolean';\n\t}\n\n\toverride mapFromDriverValue(value: number | boolean): boolean {\n\t\tif (typeof value === 'boolean') {\n\t\t\treturn value;\n\t\t}\n\t\treturn value === 1;\n\t}\n}\n\nexport function boolean(): MySqlBooleanBuilderInitial<''>;\nexport function boolean<TName extends string>(name: TName): MySqlBooleanBuilderInitial<TName>;\nexport function boolean(name?: string) {\n\treturn new MySqlBooleanBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/char.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\nexport type MySqlCharBuilderInitial<\n\tTName extends string,\n\tTEnum extends [string, ...string[]],\n\tTLength extends number | undefined,\n> = MySqlCharBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'MySqlChar';\n\tdata: TEnum[number];\n\tdriverParam: number | string;\n\tenumValues: TEnum;\n\tlength: TLength;\n}>;\n\nexport class MySqlCharBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'MySqlChar'> & { length?: number | undefined },\n> extends MySqlColumnBuilder<\n\tT,\n\tMySqlCharConfig<T['enumValues'], T['length']>,\n\t{ length: T['length'] }\n> {\n\tstatic override readonly [entityKind]: string = 'MySqlCharBuilder';\n\n\tconstructor(name: T['name'], config: MySqlCharConfig<T['enumValues'], T['length']>) {\n\t\tsuper(name, 'string', 'MySqlChar');\n\t\tthis.config.length = config.length;\n\t\tthis.config.enum = config.enum;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlChar<MakeColumnConfig<T, TTableName> & { length: T['length']; enumValues: T['enumValues'] }> {\n\t\treturn new MySqlChar<MakeColumnConfig<T, TTableName> & { length: T['length']; enumValues: T['enumValues'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlChar<T extends ColumnBaseConfig<'string', 'MySqlChar'> & { length?: number | undefined }>\n\textends MySqlColumn<T, MySqlCharConfig<T['enumValues'], T['length']>, { length: T['length'] }>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlChar';\n\n\treadonly length: T['length'] = this.config.length;\n\toverride readonly enumValues = this.config.enum;\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `char` : `char(${this.length})`;\n\t}\n}\n\nexport interface MySqlCharConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n\tTLength extends number | undefined = number | undefined,\n> {\n\tenum?: TEnum;\n\tlength?: TLength;\n}\n\nexport function char(): MySqlCharBuilderInitial<'', [string, ...string[]], undefined>;\nexport function char<U extends string, T extends Readonly<[U, ...U[]]>, L extends number | undefined>(\n\tconfig?: MySqlCharConfig<T | Writable<T>, L>,\n): MySqlCharBuilderInitial<'', Writable<T>, L>;\nexport function char<\n\tTName extends string,\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n>(\n\tname: TName,\n\tconfig?: MySqlCharConfig<T | Writable<T>, L>,\n): MySqlCharBuilderInitial<TName, Writable<T>, L>;\nexport function char(a?: string | MySqlCharConfig, b: MySqlCharConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<MySqlCharConfig>(a, b);\n\treturn new MySqlCharBuilder(name, config as any);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/common.ts",
    "content": "import { ColumnBuilder } from '~/column-builder.ts';\nimport type {\n\tColumnBuilderBase,\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tHasDefault,\n\tHasGenerated,\n\tIsAutoincrement,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { ForeignKey, UpdateDeleteAction } from '~/mysql-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/mysql-core/foreign-keys.ts';\nimport type { AnyMySqlTable, MySqlTable } from '~/mysql-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { Update } from '~/utils.ts';\nimport { uniqueKeyName } from '../unique-constraint.ts';\n\nexport interface ReferenceConfig {\n\tref: () => MySqlColumn;\n\tactions: {\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport interface MySqlColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> extends ColumnBuilderBase<T, TTypeConfig & { dialect: 'mysql' }> {}\n\nexport interface MySqlGeneratedColumnConfig {\n\tmode?: 'virtual' | 'stored';\n}\n\nexport abstract class MySqlColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string> & {\n\t\tdata: any;\n\t},\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> extends ColumnBuilder<T, TRuntimeConfig, TTypeConfig & { dialect: 'mysql' }, TExtraConfig>\n\timplements MySqlColumnBuilderBase<T, TTypeConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlColumnBuilder';\n\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\treferences(ref: ReferenceConfig['ref'], actions: ReferenceConfig['actions'] = {}): this {\n\t\tthis.foreignKeyConfigs.push({ ref, actions });\n\t\treturn this;\n\t}\n\n\tunique(name?: string): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(as: SQL | T['data'] | (() => SQL), config?: MySqlGeneratedColumnConfig): HasGenerated<this, {\n\t\ttype: 'always';\n\t}> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: config?.mode ?? 'virtual',\n\t\t};\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: MySqlColumn, table: MySqlTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, actions }) => {\n\t\t\treturn ((ref, actions) => {\n\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\treturn { columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t});\n\t\t\t\tif (actions.onUpdate) {\n\t\t\t\t\tbuilder.onUpdate(actions.onUpdate);\n\t\t\t\t}\n\t\t\t\tif (actions.onDelete) {\n\t\t\t\t\tbuilder.onDelete(actions.onDelete);\n\t\t\t\t}\n\t\t\t\treturn builder.build(table);\n\t\t\t})(ref, actions);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlColumn<MakeColumnConfig<T, TTableName>>;\n}\n\n// To understand how to use `MySqlColumn` and `AnyMySqlColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class MySqlColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = {},\n\tTTypeConfig extends object = {},\n> extends Column<T, TRuntimeConfig, TTypeConfig & { dialect: 'mysql' }> {\n\tstatic override readonly [entityKind]: string = 'MySqlColumn';\n\n\tconstructor(\n\t\toverride readonly table: MySqlTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tif (!config.uniqueName) {\n\t\t\tconfig.uniqueName = uniqueKeyName(table, [config.name]);\n\t\t}\n\t\tsuper(table, config);\n\t}\n}\n\nexport type AnyMySqlColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = MySqlColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport interface MySqlColumnWithAutoIncrementConfig {\n\tautoIncrement: boolean;\n}\n\nexport abstract class MySqlColumnBuilderWithAutoIncrement<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> extends MySqlColumnBuilder<T, TRuntimeConfig & MySqlColumnWithAutoIncrementConfig, TExtraConfig> {\n\tstatic override readonly [entityKind]: string = 'MySqlColumnBuilderWithAutoIncrement';\n\n\tconstructor(name: NonNullable<T['name']>, dataType: T['dataType'], columnType: T['columnType']) {\n\t\tsuper(name, dataType, columnType);\n\t\tthis.config.autoIncrement = false;\n\t}\n\n\tautoincrement(): IsAutoincrement<HasDefault<this>> {\n\t\tthis.config.autoIncrement = true;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as IsAutoincrement<HasDefault<this>>;\n\t}\n}\n\nexport abstract class MySqlColumnWithAutoIncrement<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n> extends MySqlColumn<T, MySqlColumnWithAutoIncrementConfig & TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'MySqlColumnWithAutoIncrement';\n\n\treadonly autoIncrement: boolean = this.config.autoIncrement;\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/custom.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\nexport type ConvertCustomConfig<TName extends string, T extends Partial<CustomTypeValues>> =\n\t& {\n\t\tname: TName;\n\t\tdataType: 'custom';\n\t\tcolumnType: 'MySqlCustomColumn';\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverData'];\n\t\tenumValues: undefined;\n\t}\n\t& (T['notNull'] extends true ? { notNull: true } : {})\n\t& (T['default'] extends true ? { hasDefault: true } : {});\n\nexport interface MySqlCustomColumnInnerConfig {\n\tcustomTypeValues: CustomTypeValues;\n}\n\nexport class MySqlCustomColumnBuilder<T extends ColumnBuilderBaseConfig<'custom', 'MySqlCustomColumn'>>\n\textends MySqlColumnBuilder<\n\t\tT,\n\t\t{\n\t\t\tfieldConfig: CustomTypeValues['config'];\n\t\t\tcustomTypeParams: CustomTypeParams<any>;\n\t\t},\n\t\t{\n\t\t\tmysqlColumnBuilderBrand: 'MySqlCustomColumnBuilderBrand';\n\t\t}\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlCustomColumnBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\tfieldConfig: CustomTypeValues['config'],\n\t\tcustomTypeParams: CustomTypeParams<any>,\n\t) {\n\t\tsuper(name, 'custom', 'MySqlCustomColumn');\n\t\tthis.config.fieldConfig = fieldConfig;\n\t\tthis.config.customTypeParams = customTypeParams;\n\t}\n\n\t/** @internal */\n\tbuild<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlCustomColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlCustomColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlCustomColumn<T extends ColumnBaseConfig<'custom', 'MySqlCustomColumn'>> extends MySqlColumn<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlCustomColumn';\n\n\tprivate sqlName: string;\n\tprivate mapTo?: (value: T['data']) => T['driverParam'];\n\tprivate mapFrom?: (value: T['driverParam']) => T['data'];\n\n\tconstructor(\n\t\ttable: AnyMySqlTable<{ name: T['tableName'] }>,\n\t\tconfig: MySqlCustomColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.sqlName = config.customTypeParams.dataType(config.fieldConfig);\n\t\tthis.mapTo = config.customTypeParams.toDriver;\n\t\tthis.mapFrom = config.customTypeParams.fromDriver;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.sqlName;\n\t}\n\n\toverride mapFromDriverValue(value: T['driverParam']): T['data'] {\n\t\treturn typeof this.mapFrom === 'function' ? this.mapFrom(value) : value as T['data'];\n\t}\n\n\toverride mapToDriverValue(value: T['data']): T['driverParam'] {\n\t\treturn typeof this.mapTo === 'function' ? this.mapTo(value) : value as T['data'];\n\t}\n}\n\nexport type CustomTypeValues = {\n\t/**\n\t * Required type for custom column, that will infer proper type model\n\t *\n\t * Examples:\n\t *\n\t * If you want your column to be `string` type after selecting/or on inserting - use `data: string`. Like `text`, `varchar`\n\t *\n\t * If you want your column to be `number` type after selecting/or on inserting - use `data: number`. Like `integer`\n\t */\n\tdata: unknown;\n\n\t/**\n\t * Type helper, that represents what type database driver is accepting for specific database data type\n\t */\n\tdriverData?: unknown;\n\n\t/**\n\t * What config type should be used for {@link CustomTypeParams} `dataType` generation\n\t */\n\tconfig?: Record<string, any>;\n\n\t/**\n\t * Whether the config argument should be required or not\n\t * @default false\n\t */\n\tconfigRequired?: boolean;\n\n\t/**\n\t * If your custom data type should be notNull by default you can use `notNull: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t  dataType() {\n\t * \t    return 'serial';\n\t *    },\n\t * });\n\t */\n\tnotNull?: boolean;\n\n\t/**\n\t * If your custom data type has default you can use `default: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t  dataType() {\n\t * \t    return 'serial';\n\t *    },\n\t * });\n\t */\n\tdefault?: boolean;\n};\n\nexport interface CustomTypeParams<T extends CustomTypeValues> {\n\t/**\n\t * Database data type string representation, that is used for migrations\n\t * @example\n\t * ```\n\t * `jsonb`, `text`\n\t * ```\n\t *\n\t * If database data type needs additional params you can use them from `config` param\n\t * @example\n\t * ```\n\t * `varchar(256)`, `numeric(2,3)`\n\t * ```\n\t *\n\t * To make `config` be of specific type please use config generic in {@link CustomTypeValues}\n\t *\n\t * @example\n\t * Usage example\n\t * ```\n\t *   dataType() {\n\t *     return 'boolean';\n\t *   },\n\t * ```\n\t * Or\n\t * ```\n\t *   dataType(config) {\n\t * \t   return typeof config.length !== 'undefined' ? `varchar(${config.length})` : `varchar`;\n\t * \t }\n\t * ```\n\t */\n\tdataType: (config: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined)) => string;\n\n\t/**\n\t * Optional mapping function, between user input and driver\n\t * @example\n\t * For example, when using jsonb we need to map JS/TS object to string before writing to database\n\t * ```\n\t * toDriver(value: TData): string {\n\t * \t return JSON.stringify(value);\n\t * }\n\t * ```\n\t */\n\ttoDriver?: (value: T['data']) => T['driverData'] | SQL;\n\n\t/**\n\t * Optional mapping function, that is responsible for data mapping from database to JS/TS code\n\t * @example\n\t * For example, when using timestamp we need to map string Date representation to JS Date\n\t * ```\n\t * fromDriver(value: string): Date {\n\t * \treturn new Date(value);\n\t * },\n\t * ```\n\t */\n\tfromDriver?: (value: T['driverData']) => T['data'];\n}\n\n/**\n * Custom mysql database data type generator\n */\nexport function customType<T extends CustomTypeValues = CustomTypeValues>(\n\tcustomTypeParams: CustomTypeParams<T>,\n): Equal<T['configRequired'], true> extends true ? {\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig: TConfig,\n\t\t): MySqlCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig: T['config'],\n\t\t): MySqlCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n\t: {\n\t\t(): MySqlCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig?: TConfig,\n\t\t): MySqlCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig?: T['config'],\n\t\t): MySqlCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n{\n\treturn <TName extends string>(\n\t\ta?: TName | T['config'],\n\t\tb?: T['config'],\n\t): MySqlCustomColumnBuilder<ConvertCustomConfig<TName, T>> => {\n\t\tconst { name, config } = getColumnNameAndConfig<T['config']>(a, b);\n\t\treturn new MySqlCustomColumnBuilder(name as ConvertCustomConfig<TName, T>['name'], config, customTypeParams);\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/date.common.ts",
    "content": "import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnDataType,\n\tHasDefault,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\nexport interface MySqlDateColumnBaseConfig {\n\thasOnUpdateNow: boolean;\n}\n\nexport abstract class MySqlDateColumnBaseBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> extends MySqlColumnBuilder<T, TRuntimeConfig & MySqlDateColumnBaseConfig, TExtraConfig> {\n\tstatic override readonly [entityKind]: string = 'MySqlDateColumnBuilder';\n\n\tdefaultNow() {\n\t\treturn this.default(sql`(now())`);\n\t}\n\n\t// \"on update now\" also adds an implicit default value to the column - https://dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html\n\tonUpdateNow(): HasDefault<this> {\n\t\tthis.config.hasOnUpdateNow = true;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n}\n\nexport abstract class MySqlDateBaseColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n> extends MySqlColumn<T, MySqlDateColumnBaseConfig & TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'MySqlDateColumn';\n\n\treadonly hasOnUpdateNow: boolean = this.config.hasOnUpdateNow;\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/date.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\nexport type MySqlDateBuilderInitial<TName extends string> = MySqlDateBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'MySqlDate';\n\tdata: Date;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlDateBuilder<T extends ColumnBuilderBaseConfig<'date', 'MySqlDate'>> extends MySqlColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlDateBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'date', 'MySqlDate');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlDate<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlDate<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class MySqlDate<T extends ColumnBaseConfig<'date', 'MySqlDate'>> extends MySqlColumn<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlDate';\n\n\tconstructor(\n\t\ttable: AnyMySqlTable<{ name: T['tableName'] }>,\n\t\tconfig: MySqlDateBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `date`;\n\t}\n\n\toverride mapFromDriverValue(value: string): Date {\n\t\treturn new Date(value);\n\t}\n}\n\nexport type MySqlDateStringBuilderInitial<TName extends string> = MySqlDateStringBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'MySqlDateString';\n\tdata: string;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlDateStringBuilder<T extends ColumnBuilderBaseConfig<'string', 'MySqlDateString'>>\n\textends MySqlColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlDateStringBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'MySqlDateString');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlDateString<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlDateString<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlDateString<T extends ColumnBaseConfig<'string', 'MySqlDateString'>> extends MySqlColumn<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlDateString';\n\n\tconstructor(\n\t\ttable: AnyMySqlTable<{ name: T['tableName'] }>,\n\t\tconfig: MySqlDateStringBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `date`;\n\t}\n}\n\nexport interface MySqlDateConfig<TMode extends 'date' | 'string' = 'date' | 'string'> {\n\tmode?: TMode;\n}\n\nexport function date(): MySqlDateBuilderInitial<''>;\nexport function date<TMode extends MySqlDateConfig['mode'] & {}>(\n\tconfig?: MySqlDateConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? MySqlDateStringBuilderInitial<''> : MySqlDateBuilderInitial<''>;\nexport function date<TName extends string, TMode extends MySqlDateConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: MySqlDateConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? MySqlDateStringBuilderInitial<TName> : MySqlDateBuilderInitial<TName>;\nexport function date(a?: string | MySqlDateConfig, b?: MySqlDateConfig) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlDateConfig | undefined>(a, b);\n\tif (config?.mode === 'string') {\n\t\treturn new MySqlDateStringBuilder(name);\n\t}\n\treturn new MySqlDateBuilder(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/datetime.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\nexport type MySqlDateTimeBuilderInitial<TName extends string> = MySqlDateTimeBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'MySqlDateTime';\n\tdata: Date;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlDateTimeBuilder<T extends ColumnBuilderBaseConfig<'date', 'MySqlDateTime'>>\n\textends MySqlColumnBuilder<T, MySqlDatetimeConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlDateTimeBuilder';\n\n\tconstructor(name: T['name'], config: MySqlDatetimeConfig | undefined) {\n\t\tsuper(name, 'date', 'MySqlDateTime');\n\t\tthis.config.fsp = config?.fsp;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlDateTime<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlDateTime<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlDateTime<T extends ColumnBaseConfig<'date', 'MySqlDateTime'>> extends MySqlColumn<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlDateTime';\n\n\treadonly fsp: number | undefined;\n\n\tconstructor(\n\t\ttable: AnyMySqlTable<{ name: T['tableName'] }>,\n\t\tconfig: MySqlDateTimeBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.fsp = config.fsp;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.fsp === undefined ? '' : `(${this.fsp})`;\n\t\treturn `datetime${precision}`;\n\t}\n\n\toverride mapToDriverValue(value: Date): unknown {\n\t\treturn value.toISOString().replace('T', ' ').replace('Z', '');\n\t}\n\n\toverride mapFromDriverValue(value: string): Date {\n\t\treturn new Date(value.replace(' ', 'T') + 'Z');\n\t}\n}\n\nexport type MySqlDateTimeStringBuilderInitial<TName extends string> = MySqlDateTimeStringBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'MySqlDateTimeString';\n\tdata: string;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlDateTimeStringBuilder<T extends ColumnBuilderBaseConfig<'string', 'MySqlDateTimeString'>>\n\textends MySqlColumnBuilder<T, MySqlDatetimeConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlDateTimeStringBuilder';\n\n\tconstructor(name: T['name'], config: MySqlDatetimeConfig | undefined) {\n\t\tsuper(name, 'string', 'MySqlDateTimeString');\n\t\tthis.config.fsp = config?.fsp;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlDateTimeString<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlDateTimeString<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlDateTimeString<T extends ColumnBaseConfig<'string', 'MySqlDateTimeString'>> extends MySqlColumn<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlDateTimeString';\n\n\treadonly fsp: number | undefined;\n\n\tconstructor(\n\t\ttable: AnyMySqlTable<{ name: T['tableName'] }>,\n\t\tconfig: MySqlDateTimeStringBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.fsp = config.fsp;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.fsp === undefined ? '' : `(${this.fsp})`;\n\t\treturn `datetime${precision}`;\n\t}\n}\n\nexport type DatetimeFsp = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface MySqlDatetimeConfig<TMode extends 'date' | 'string' = 'date' | 'string'> {\n\tmode?: TMode;\n\tfsp?: DatetimeFsp;\n}\n\nexport function datetime(): MySqlDateTimeBuilderInitial<''>;\nexport function datetime<TMode extends MySqlDatetimeConfig['mode'] & {}>(\n\tconfig?: MySqlDatetimeConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? MySqlDateTimeStringBuilderInitial<''> : MySqlDateTimeBuilderInitial<''>;\nexport function datetime<TName extends string, TMode extends MySqlDatetimeConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: MySqlDatetimeConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? MySqlDateTimeStringBuilderInitial<TName> : MySqlDateTimeBuilderInitial<TName>;\nexport function datetime(a?: string | MySqlDatetimeConfig, b?: MySqlDatetimeConfig) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlDatetimeConfig | undefined>(a, b);\n\tif (config?.mode === 'string') {\n\t\treturn new MySqlDateTimeStringBuilder(name, config);\n\t}\n\treturn new MySqlDateTimeBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/decimal.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumnBuilderWithAutoIncrement, MySqlColumnWithAutoIncrement } from './common.ts';\n\nexport type MySqlDecimalBuilderInitial<TName extends string> = MySqlDecimalBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'MySqlDecimal';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlDecimalBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'MySqlDecimal'>,\n> extends MySqlColumnBuilderWithAutoIncrement<T, MySqlDecimalConfig> {\n\tstatic override readonly [entityKind]: string = 'MySqlDecimalBuilder';\n\n\tconstructor(name: T['name'], config: MySqlDecimalConfig | undefined) {\n\t\tsuper(name, 'string', 'MySqlDecimal');\n\t\tthis.config.precision = config?.precision;\n\t\tthis.config.scale = config?.scale;\n\t\tthis.config.unsigned = config?.unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlDecimal<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlDecimal<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlDecimal<T extends ColumnBaseConfig<'string', 'MySqlDecimal'>>\n\textends MySqlColumnWithAutoIncrement<T, MySqlDecimalConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlDecimal';\n\n\treadonly precision: number | undefined = this.config.precision;\n\treadonly scale: number | undefined = this.config.scale;\n\treadonly unsigned: boolean | undefined = this.config.unsigned;\n\n\toverride mapFromDriverValue(value: unknown): string {\n\t\tif (typeof value === 'string') return value;\n\n\t\treturn String(value);\n\t}\n\n\tgetSQLType(): string {\n\t\tlet type = '';\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\ttype += `decimal(${this.precision},${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\ttype += 'decimal';\n\t\t} else {\n\t\t\ttype += `decimal(${this.precision})`;\n\t\t}\n\t\ttype = type === 'decimal(10,0)' || type === 'decimal(10)' ? 'decimal' : type;\n\t\treturn this.unsigned ? `${type} unsigned` : type;\n\t}\n}\n\nexport type MySqlDecimalNumberBuilderInitial<TName extends string> = MySqlDecimalNumberBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'MySqlDecimalNumber';\n\tdata: number;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlDecimalNumberBuilder<\n\tT extends ColumnBuilderBaseConfig<'number', 'MySqlDecimalNumber'>,\n> extends MySqlColumnBuilderWithAutoIncrement<T, MySqlDecimalConfig> {\n\tstatic override readonly [entityKind]: string = 'MySqlDecimalNumberBuilder';\n\n\tconstructor(name: T['name'], config: MySqlDecimalConfig | undefined) {\n\t\tsuper(name, 'number', 'MySqlDecimalNumber');\n\t\tthis.config.precision = config?.precision;\n\t\tthis.config.scale = config?.scale;\n\t\tthis.config.unsigned = config?.unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlDecimalNumber<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlDecimalNumber<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlDecimalNumber<T extends ColumnBaseConfig<'number', 'MySqlDecimalNumber'>>\n\textends MySqlColumnWithAutoIncrement<T, MySqlDecimalConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlDecimalNumber';\n\n\treadonly precision: number | undefined = this.config.precision;\n\treadonly scale: number | undefined = this.config.scale;\n\treadonly unsigned: boolean | undefined = this.config.unsigned;\n\n\toverride mapFromDriverValue(value: unknown): number {\n\t\tif (typeof value === 'number') return value;\n\n\t\treturn Number(value);\n\t}\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\tlet type = '';\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\ttype += `decimal(${this.precision},${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\ttype += 'decimal';\n\t\t} else {\n\t\t\ttype += `decimal(${this.precision})`;\n\t\t}\n\t\ttype = type === 'decimal(10,0)' || type === 'decimal(10)' ? 'decimal' : type;\n\t\treturn this.unsigned ? `${type} unsigned` : type;\n\t}\n}\n\nexport type MySqlDecimalBigIntBuilderInitial<TName extends string> = MySqlDecimalBigIntBuilder<{\n\tname: TName;\n\tdataType: 'bigint';\n\tcolumnType: 'MySqlDecimalBigInt';\n\tdata: bigint;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlDecimalBigIntBuilder<\n\tT extends ColumnBuilderBaseConfig<'bigint', 'MySqlDecimalBigInt'>,\n> extends MySqlColumnBuilderWithAutoIncrement<T, MySqlDecimalConfig> {\n\tstatic override readonly [entityKind]: string = 'MySqlDecimalBigIntBuilder';\n\n\tconstructor(name: T['name'], config: MySqlDecimalConfig | undefined) {\n\t\tsuper(name, 'bigint', 'MySqlDecimalBigInt');\n\t\tthis.config.precision = config?.precision;\n\t\tthis.config.scale = config?.scale;\n\t\tthis.config.unsigned = config?.unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlDecimalBigInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlDecimalBigInt<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlDecimalBigInt<T extends ColumnBaseConfig<'bigint', 'MySqlDecimalBigInt'>>\n\textends MySqlColumnWithAutoIncrement<T, MySqlDecimalConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlDecimalBigInt';\n\n\treadonly precision: number | undefined = this.config.precision;\n\treadonly scale: number | undefined = this.config.scale;\n\treadonly unsigned: boolean | undefined = this.config.unsigned;\n\n\toverride mapFromDriverValue = BigInt;\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\tlet type = '';\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\ttype += `decimal(${this.precision},${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\ttype += 'decimal';\n\t\t} else {\n\t\t\ttype += `decimal(${this.precision})`;\n\t\t}\n\t\ttype = type === 'decimal(10,0)' || type === 'decimal(10)' ? 'decimal' : type;\n\t\treturn this.unsigned ? `${type} unsigned` : type;\n\t}\n}\n\nexport interface MySqlDecimalConfig<T extends 'string' | 'number' | 'bigint' = 'string' | 'number' | 'bigint'> {\n\tprecision?: number;\n\tscale?: number;\n\tunsigned?: boolean;\n\tmode?: T;\n}\n\nexport function decimal(): MySqlDecimalBuilderInitial<''>;\nexport function decimal<TMode extends 'string' | 'number' | 'bigint'>(\n\tconfig: MySqlDecimalConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? MySqlDecimalNumberBuilderInitial<''>\n\t: Equal<TMode, 'bigint'> extends true ? MySqlDecimalBigIntBuilderInitial<''>\n\t: MySqlDecimalBuilderInitial<''>;\nexport function decimal<TName extends string, TMode extends 'string' | 'number' | 'bigint'>(\n\tname: TName,\n\tconfig?: MySqlDecimalConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? MySqlDecimalNumberBuilderInitial<TName>\n\t: Equal<TMode, 'bigint'> extends true ? MySqlDecimalBigIntBuilderInitial<TName>\n\t: MySqlDecimalBuilderInitial<TName>;\nexport function decimal(a?: string | MySqlDecimalConfig, b: MySqlDecimalConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlDecimalConfig>(a, b);\n\tconst mode = config?.mode;\n\treturn mode === 'number'\n\t\t? new MySqlDecimalNumberBuilder(name, config)\n\t\t: mode === 'bigint'\n\t\t? new MySqlDecimalBigIntBuilder(name, config)\n\t\t: new MySqlDecimalBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/double.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumnBuilderWithAutoIncrement, MySqlColumnWithAutoIncrement } from './common.ts';\n\nexport type MySqlDoubleBuilderInitial<TName extends string> = MySqlDoubleBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'MySqlDouble';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlDoubleBuilder<T extends ColumnBuilderBaseConfig<'number', 'MySqlDouble'>>\n\textends MySqlColumnBuilderWithAutoIncrement<T, MySqlDoubleConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlDoubleBuilder';\n\n\tconstructor(name: T['name'], config: MySqlDoubleConfig | undefined) {\n\t\tsuper(name, 'number', 'MySqlDouble');\n\t\tthis.config.precision = config?.precision;\n\t\tthis.config.scale = config?.scale;\n\t\tthis.config.unsigned = config?.unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlDouble<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlDouble<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class MySqlDouble<T extends ColumnBaseConfig<'number', 'MySqlDouble'>>\n\textends MySqlColumnWithAutoIncrement<T, MySqlDoubleConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlDouble';\n\n\treadonly precision: number | undefined = this.config.precision;\n\treadonly scale: number | undefined = this.config.scale;\n\treadonly unsigned: boolean | undefined = this.config.unsigned;\n\n\tgetSQLType(): string {\n\t\tlet type = '';\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\ttype += `double(${this.precision},${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\ttype += 'double';\n\t\t} else {\n\t\t\ttype += `double(${this.precision})`;\n\t\t}\n\t\treturn this.unsigned ? `${type} unsigned` : type;\n\t}\n}\n\nexport interface MySqlDoubleConfig {\n\tprecision?: number;\n\tscale?: number;\n\tunsigned?: boolean;\n}\n\nexport function double(): MySqlDoubleBuilderInitial<''>;\nexport function double(\n\tconfig?: MySqlDoubleConfig,\n): MySqlDoubleBuilderInitial<''>;\nexport function double<TName extends string>(\n\tname: TName,\n\tconfig?: MySqlDoubleConfig,\n): MySqlDoubleBuilderInitial<TName>;\nexport function double(a?: string | MySqlDoubleConfig, b?: MySqlDoubleConfig) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlDoubleConfig>(a, b);\n\treturn new MySqlDoubleBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/enum.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport type { NonArray, Writable } from '~/utils.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\n// enum as string union\nexport type MySqlEnumColumnBuilderInitial<TName extends string, TEnum extends string[]> = MySqlEnumColumnBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'MySqlEnumColumn';\n\tdata: TEnum[number];\n\tdriverParam: string;\n\tenumValues: TEnum;\n}>;\n\nexport class MySqlEnumColumnBuilder<T extends ColumnBuilderBaseConfig<'string', 'MySqlEnumColumn'>>\n\textends MySqlColumnBuilder<T, { enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlEnumColumnBuilder';\n\n\tconstructor(name: T['name'], values: T['enumValues']) {\n\t\tsuper(name, 'string', 'MySqlEnumColumn');\n\t\tthis.config.enumValues = values;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlEnumColumn<MakeColumnConfig<T, TTableName> & { enumValues: T['enumValues'] }> {\n\t\treturn new MySqlEnumColumn<MakeColumnConfig<T, TTableName> & { enumValues: T['enumValues'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlEnumColumn<T extends ColumnBaseConfig<'string', 'MySqlEnumColumn'>>\n\textends MySqlColumn<T, { enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlEnumColumn';\n\n\toverride readonly enumValues = this.config.enumValues;\n\n\tgetSQLType(): string {\n\t\treturn `enum(${this.enumValues!.map((value) => `'${value}'`).join(',')})`;\n\t}\n}\n\n// enum as ts enum\n\nexport type MySqlEnumObjectColumnBuilderInitial<TName extends string, TEnum extends object> =\n\tMySqlEnumObjectColumnBuilder<{\n\t\tname: TName;\n\t\tdataType: 'string';\n\t\tcolumnType: 'MySqlEnumObjectColumn';\n\t\tdata: TEnum[keyof TEnum];\n\t\tdriverParam: string;\n\t\tenumValues: string[];\n\t}>;\n\nexport class MySqlEnumObjectColumnBuilder<T extends ColumnBuilderBaseConfig<'string', 'MySqlEnumObjectColumn'>>\n\textends MySqlColumnBuilder<T, { enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlEnumObjectColumnBuilder';\n\n\tconstructor(name: T['name'], values: T['enumValues']) {\n\t\tsuper(name, 'string', 'MySqlEnumObjectColumn');\n\t\tthis.config.enumValues = values;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlEnumObjectColumn<MakeColumnConfig<T, TTableName> & { enumValues: T['enumValues'] }> {\n\t\treturn new MySqlEnumObjectColumn<MakeColumnConfig<T, TTableName> & { enumValues: T['enumValues'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlEnumObjectColumn<T extends ColumnBaseConfig<'string', 'MySqlEnumObjectColumn'>>\n\textends MySqlColumn<T, { enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlEnumObjectColumn';\n\n\toverride readonly enumValues = this.config.enumValues;\n\n\tgetSQLType(): string {\n\t\treturn `enum(${this.enumValues!.map((value) => `'${value}'`).join(',')})`;\n\t}\n}\n\nexport function mysqlEnum<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tvalues: T | Writable<T>,\n): MySqlEnumColumnBuilderInitial<'', Writable<T>>;\nexport function mysqlEnum<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: TName,\n\tvalues: T | Writable<T>,\n): MySqlEnumColumnBuilderInitial<TName, Writable<T>>;\nexport function mysqlEnum<E extends Record<string, string>>(\n\tenumObj: NonArray<E>,\n): MySqlEnumObjectColumnBuilderInitial<'', E>;\nexport function mysqlEnum<TName extends string, E extends Record<string, string>>(\n\tname: TName,\n\tvalues: NonArray<E>,\n): MySqlEnumObjectColumnBuilderInitial<TName, E>;\nexport function mysqlEnum(\n\ta?: string | readonly [string, ...string[]] | [string, ...string[]] | Record<string, string>,\n\tb?: readonly [string, ...string[]] | [string, ...string[]] | Record<string, string>,\n): any {\n\t// if name + array or just array - it means we have string union passed\n\tif (typeof a === 'string' && Array.isArray(b) || Array.isArray(a)) {\n\t\tconst name = typeof a === 'string' && a.length > 0 ? a : '';\n\t\tconst values = (typeof a === 'string' ? b : a) ?? [];\n\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error(`You have an empty array for \"${name}\" enum values`);\n\t\t}\n\n\t\treturn new MySqlEnumColumnBuilder(name, values as any);\n\t}\n\n\tif (typeof a === 'string' && typeof b === 'object' || typeof a === 'object') {\n\t\tconst name = typeof a === 'object' ? '' : a;\n\t\tconst values = typeof a === 'object' ? Object.values(a) : typeof b === 'object' ? Object.values(b) : [];\n\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error(`You have an empty array for \"${name}\" enum values`);\n\t\t}\n\n\t\treturn new MySqlEnumObjectColumnBuilder(name, values as any);\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/float.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumnBuilderWithAutoIncrement, MySqlColumnWithAutoIncrement } from './common.ts';\n\nexport type MySqlFloatBuilderInitial<TName extends string> = MySqlFloatBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'MySqlFloat';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlFloatBuilder<T extends ColumnBuilderBaseConfig<'number', 'MySqlFloat'>>\n\textends MySqlColumnBuilderWithAutoIncrement<T, MySqlFloatConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlFloatBuilder';\n\n\tconstructor(name: T['name'], config: MySqlFloatConfig | undefined) {\n\t\tsuper(name, 'number', 'MySqlFloat');\n\t\tthis.config.precision = config?.precision;\n\t\tthis.config.scale = config?.scale;\n\t\tthis.config.unsigned = config?.unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlFloat<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlFloat<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class MySqlFloat<T extends ColumnBaseConfig<'number', 'MySqlFloat'>>\n\textends MySqlColumnWithAutoIncrement<T, MySqlFloatConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlFloat';\n\n\treadonly precision: number | undefined = this.config.precision;\n\treadonly scale: number | undefined = this.config.scale;\n\treadonly unsigned: boolean | undefined = this.config.unsigned;\n\n\tgetSQLType(): string {\n\t\tlet type = '';\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\ttype += `float(${this.precision},${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\ttype += 'float';\n\t\t} else {\n\t\t\ttype += `float(${this.precision})`;\n\t\t}\n\t\treturn this.unsigned ? `${type} unsigned` : type;\n\t}\n}\n\nexport interface MySqlFloatConfig {\n\tprecision?: number;\n\tscale?: number;\n\tunsigned?: boolean;\n}\n\nexport function float(): MySqlFloatBuilderInitial<''>;\nexport function float(\n\tconfig?: MySqlFloatConfig,\n): MySqlFloatBuilderInitial<''>;\nexport function float<TName extends string>(\n\tname: TName,\n\tconfig?: MySqlFloatConfig,\n): MySqlFloatBuilderInitial<TName>;\nexport function float(a?: string | MySqlFloatConfig, b?: MySqlFloatConfig) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlFloatConfig>(a, b);\n\treturn new MySqlFloatBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/index.ts",
    "content": "export * from './bigint.ts';\nexport * from './binary.ts';\nexport * from './boolean.ts';\nexport * from './char.ts';\nexport * from './common.ts';\nexport * from './custom.ts';\nexport * from './date.ts';\nexport * from './datetime.ts';\nexport * from './decimal.ts';\nexport * from './double.ts';\nexport * from './enum.ts';\nexport * from './float.ts';\nexport * from './int.ts';\nexport * from './json.ts';\nexport * from './mediumint.ts';\nexport * from './real.ts';\nexport * from './serial.ts';\nexport * from './smallint.ts';\nexport * from './text.ts';\nexport * from './time.ts';\nexport * from './timestamp.ts';\nexport * from './tinyint.ts';\nexport * from './varbinary.ts';\nexport * from './varchar.ts';\nexport * from './year.ts';\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/int.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumnBuilderWithAutoIncrement, MySqlColumnWithAutoIncrement } from './common.ts';\n\nexport type MySqlIntBuilderInitial<TName extends string> = MySqlIntBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'MySqlInt';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlIntBuilder<T extends ColumnBuilderBaseConfig<'number', 'MySqlInt'>>\n\textends MySqlColumnBuilderWithAutoIncrement<T, MySqlIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlIntBuilder';\n\n\tconstructor(name: T['name'], config?: MySqlIntConfig) {\n\t\tsuper(name, 'number', 'MySqlInt');\n\t\tthis.config.unsigned = config ? config.unsigned : false;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlInt<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class MySqlInt<T extends ColumnBaseConfig<'number', 'MySqlInt'>>\n\textends MySqlColumnWithAutoIncrement<T, MySqlIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlInt';\n\n\tgetSQLType(): string {\n\t\treturn `int${this.config.unsigned ? ' unsigned' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport interface MySqlIntConfig {\n\tunsigned?: boolean;\n}\n\nexport function int(): MySqlIntBuilderInitial<''>;\nexport function int(\n\tconfig?: MySqlIntConfig,\n): MySqlIntBuilderInitial<''>;\nexport function int<TName extends string>(\n\tname: TName,\n\tconfig?: MySqlIntConfig,\n): MySqlIntBuilderInitial<TName>;\nexport function int(a?: string | MySqlIntConfig, b?: MySqlIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlIntConfig>(a, b);\n\treturn new MySqlIntBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/json.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\nexport type MySqlJsonBuilderInitial<TName extends string> = MySqlJsonBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'MySqlJson';\n\tdata: unknown;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlJsonBuilder<T extends ColumnBuilderBaseConfig<'json', 'MySqlJson'>> extends MySqlColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlJsonBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'MySqlJson');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlJson<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlJson<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class MySqlJson<T extends ColumnBaseConfig<'json', 'MySqlJson'>> extends MySqlColumn<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlJson';\n\n\tgetSQLType(): string {\n\t\treturn 'json';\n\t}\n\n\toverride mapToDriverValue(value: T['data']): string {\n\t\treturn JSON.stringify(value);\n\t}\n}\n\nexport function json(): MySqlJsonBuilderInitial<''>;\nexport function json<TName extends string>(name: TName): MySqlJsonBuilderInitial<TName>;\nexport function json(name?: string) {\n\treturn new MySqlJsonBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/mediumint.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumnBuilderWithAutoIncrement, MySqlColumnWithAutoIncrement } from './common.ts';\nimport type { MySqlIntConfig } from './int.ts';\n\nexport type MySqlMediumIntBuilderInitial<TName extends string> = MySqlMediumIntBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'MySqlMediumInt';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlMediumIntBuilder<T extends ColumnBuilderBaseConfig<'number', 'MySqlMediumInt'>>\n\textends MySqlColumnBuilderWithAutoIncrement<T, MySqlIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlMediumIntBuilder';\n\n\tconstructor(name: T['name'], config?: MySqlIntConfig) {\n\t\tsuper(name, 'number', 'MySqlMediumInt');\n\t\tthis.config.unsigned = config ? config.unsigned : false;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlMediumInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlMediumInt<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlMediumInt<T extends ColumnBaseConfig<'number', 'MySqlMediumInt'>>\n\textends MySqlColumnWithAutoIncrement<T, MySqlIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlMediumInt';\n\n\tgetSQLType(): string {\n\t\treturn `mediumint${this.config.unsigned ? ' unsigned' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function mediumint(): MySqlMediumIntBuilderInitial<''>;\nexport function mediumint(\n\tconfig?: MySqlIntConfig,\n): MySqlMediumIntBuilderInitial<''>;\nexport function mediumint<TName extends string>(\n\tname: TName,\n\tconfig?: MySqlIntConfig,\n): MySqlMediumIntBuilderInitial<TName>;\nexport function mediumint(a?: string | MySqlIntConfig, b?: MySqlIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlIntConfig>(a, b);\n\treturn new MySqlMediumIntBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/real.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumnBuilderWithAutoIncrement, MySqlColumnWithAutoIncrement } from './common.ts';\n\nexport type MySqlRealBuilderInitial<TName extends string> = MySqlRealBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'MySqlReal';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlRealBuilder<T extends ColumnBuilderBaseConfig<'number', 'MySqlReal'>>\n\textends MySqlColumnBuilderWithAutoIncrement<\n\t\tT,\n\t\tMySqlRealConfig\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlRealBuilder';\n\n\tconstructor(name: T['name'], config: MySqlRealConfig | undefined) {\n\t\tsuper(name, 'number', 'MySqlReal');\n\t\tthis.config.precision = config?.precision;\n\t\tthis.config.scale = config?.scale;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlReal<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlReal<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class MySqlReal<T extends ColumnBaseConfig<'number', 'MySqlReal'>> extends MySqlColumnWithAutoIncrement<\n\tT,\n\tMySqlRealConfig\n> {\n\tstatic override readonly [entityKind]: string = 'MySqlReal';\n\n\tprecision: number | undefined = this.config.precision;\n\tscale: number | undefined = this.config.scale;\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `real(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'real';\n\t\t} else {\n\t\t\treturn `real(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport interface MySqlRealConfig {\n\tprecision?: number;\n\tscale?: number;\n}\n\nexport function real(): MySqlRealBuilderInitial<''>;\nexport function real(\n\tconfig?: MySqlRealConfig,\n): MySqlRealBuilderInitial<''>;\nexport function real<TName extends string>(\n\tname: TName,\n\tconfig?: MySqlRealConfig,\n): MySqlRealBuilderInitial<TName>;\nexport function real(a?: string | MySqlRealConfig, b: MySqlRealConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlRealConfig>(a, b);\n\treturn new MySqlRealBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/serial.ts",
    "content": "import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tHasDefault,\n\tIsAutoincrement,\n\tIsPrimaryKey,\n\tMakeColumnConfig,\n\tNotNull,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { MySqlColumnBuilderWithAutoIncrement, MySqlColumnWithAutoIncrement } from './common.ts';\n\nexport type MySqlSerialBuilderInitial<TName extends string> = IsAutoincrement<\n\tIsPrimaryKey<\n\t\tNotNull<\n\t\t\tHasDefault<\n\t\t\t\tMySqlSerialBuilder<{\n\t\t\t\t\tname: TName;\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'MySqlSerial';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t}>\n\t\t\t>\n\t\t>\n\t>\n>;\n\nexport class MySqlSerialBuilder<T extends ColumnBuilderBaseConfig<'number', 'MySqlSerial'>>\n\textends MySqlColumnBuilderWithAutoIncrement<T>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlSerialBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'MySqlSerial');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.autoIncrement = true;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlSerial<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlSerial<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class MySqlSerial<\n\tT extends ColumnBaseConfig<'number', 'MySqlSerial'>,\n> extends MySqlColumnWithAutoIncrement<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlSerial';\n\n\tgetSQLType(): string {\n\t\treturn 'serial';\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function serial(): MySqlSerialBuilderInitial<''>;\nexport function serial<TName extends string>(name: TName): MySqlSerialBuilderInitial<TName>;\nexport function serial(name?: string) {\n\treturn new MySqlSerialBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/smallint.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumnBuilderWithAutoIncrement, MySqlColumnWithAutoIncrement } from './common.ts';\nimport type { MySqlIntConfig } from './int.ts';\n\nexport type MySqlSmallIntBuilderInitial<TName extends string> = MySqlSmallIntBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'MySqlSmallInt';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlSmallIntBuilder<T extends ColumnBuilderBaseConfig<'number', 'MySqlSmallInt'>>\n\textends MySqlColumnBuilderWithAutoIncrement<T, MySqlIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlSmallIntBuilder';\n\n\tconstructor(name: T['name'], config?: MySqlIntConfig) {\n\t\tsuper(name, 'number', 'MySqlSmallInt');\n\t\tthis.config.unsigned = config ? config.unsigned : false;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlSmallInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlSmallInt<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlSmallInt<T extends ColumnBaseConfig<'number', 'MySqlSmallInt'>>\n\textends MySqlColumnWithAutoIncrement<T, MySqlIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlSmallInt';\n\n\tgetSQLType(): string {\n\t\treturn `smallint${this.config.unsigned ? ' unsigned' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function smallint(): MySqlSmallIntBuilderInitial<''>;\nexport function smallint(\n\tconfig?: MySqlIntConfig,\n): MySqlSmallIntBuilderInitial<''>;\nexport function smallint<TName extends string>(\n\tname: TName,\n\tconfig?: MySqlIntConfig,\n): MySqlSmallIntBuilderInitial<TName>;\nexport function smallint(a?: string | MySqlIntConfig, b?: MySqlIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlIntConfig>(a, b);\n\treturn new MySqlSmallIntBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/text.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\nexport type MySqlTextColumnType = 'tinytext' | 'text' | 'mediumtext' | 'longtext';\n\nexport type MySqlTextBuilderInitial<TName extends string, TEnum extends [string, ...string[]]> = MySqlTextBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'MySqlText';\n\tdata: TEnum[number];\n\tdriverParam: string;\n\tenumValues: TEnum;\n}>;\n\nexport class MySqlTextBuilder<T extends ColumnBuilderBaseConfig<'string', 'MySqlText'>> extends MySqlColumnBuilder<\n\tT,\n\t{ textType: MySqlTextColumnType; enumValues: T['enumValues'] }\n> {\n\tstatic override readonly [entityKind]: string = 'MySqlTextBuilder';\n\n\tconstructor(name: T['name'], textType: MySqlTextColumnType, config: MySqlTextConfig<T['enumValues']>) {\n\t\tsuper(name, 'string', 'MySqlText');\n\t\tthis.config.textType = textType;\n\t\tthis.config.enumValues = config.enum;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlText<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlText<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class MySqlText<T extends ColumnBaseConfig<'string', 'MySqlText'>>\n\textends MySqlColumn<T, { textType: MySqlTextColumnType; enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlText';\n\n\treadonly textType: MySqlTextColumnType = this.config.textType;\n\n\toverride readonly enumValues = this.config.enumValues;\n\n\tgetSQLType(): string {\n\t\treturn this.textType;\n\t}\n}\n\nexport interface MySqlTextConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n> {\n\tenum?: TEnum;\n}\n\nexport function text(): MySqlTextBuilderInitial<'', [string, ...string[]]>;\nexport function text<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig?: MySqlTextConfig<T | Writable<T>>,\n): MySqlTextBuilderInitial<'', Writable<T>>;\nexport function text<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: TName,\n\tconfig?: MySqlTextConfig<T | Writable<T>>,\n): MySqlTextBuilderInitial<TName, Writable<T>>;\nexport function text(a?: string | MySqlTextConfig, b: MySqlTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<MySqlTextConfig>(a, b);\n\treturn new MySqlTextBuilder(name, 'text', config as any);\n}\n\nexport function tinytext(): MySqlTextBuilderInitial<'', [string, ...string[]]>;\nexport function tinytext<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig?: MySqlTextConfig<T | Writable<T>>,\n): MySqlTextBuilderInitial<'', Writable<T>>;\nexport function tinytext<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: TName,\n\tconfig?: MySqlTextConfig<T | Writable<T>>,\n): MySqlTextBuilderInitial<TName, Writable<T>>;\nexport function tinytext(a?: string | MySqlTextConfig, b: MySqlTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<MySqlTextConfig>(a, b);\n\treturn new MySqlTextBuilder(name, 'tinytext', config as any);\n}\n\nexport function mediumtext(): MySqlTextBuilderInitial<'', [string, ...string[]]>;\nexport function mediumtext<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig?: MySqlTextConfig<T | Writable<T>>,\n): MySqlTextBuilderInitial<'', Writable<T>>;\nexport function mediumtext<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: TName,\n\tconfig?: MySqlTextConfig<T | Writable<T>>,\n): MySqlTextBuilderInitial<TName, Writable<T>>;\nexport function mediumtext(a?: string | MySqlTextConfig, b: MySqlTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<MySqlTextConfig>(a, b);\n\treturn new MySqlTextBuilder(name, 'mediumtext', config as any);\n}\n\nexport function longtext(): MySqlTextBuilderInitial<'', [string, ...string[]]>;\nexport function longtext<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig?: MySqlTextConfig<T | Writable<T>>,\n): MySqlTextBuilderInitial<'', Writable<T>>;\nexport function longtext<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: TName,\n\tconfig?: MySqlTextConfig<T | Writable<T>>,\n): MySqlTextBuilderInitial<TName, Writable<T>>;\nexport function longtext(a?: string | MySqlTextConfig, b: MySqlTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<MySqlTextConfig>(a, b);\n\treturn new MySqlTextBuilder(name, 'longtext', config as any);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/time.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\nexport type MySqlTimeBuilderInitial<TName extends string> = MySqlTimeBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'MySqlTime';\n\tdata: string;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlTimeBuilder<T extends ColumnBuilderBaseConfig<'string', 'MySqlTime'>> extends MySqlColumnBuilder<\n\tT,\n\tTimeConfig\n> {\n\tstatic override readonly [entityKind]: string = 'MySqlTimeBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\tconfig: TimeConfig | undefined,\n\t) {\n\t\tsuper(name, 'string', 'MySqlTime');\n\t\tthis.config.fsp = config?.fsp;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlTime<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlTime<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class MySqlTime<\n\tT extends ColumnBaseConfig<'string', 'MySqlTime'>,\n> extends MySqlColumn<T, TimeConfig> {\n\tstatic override readonly [entityKind]: string = 'MySqlTime';\n\n\treadonly fsp: number | undefined = this.config.fsp;\n\n\tgetSQLType(): string {\n\t\tconst precision = this.fsp === undefined ? '' : `(${this.fsp})`;\n\t\treturn `time${precision}`;\n\t}\n}\n\nexport type TimeConfig = {\n\tfsp?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n};\n\nexport function time(): MySqlTimeBuilderInitial<''>;\nexport function time(\n\tconfig?: TimeConfig,\n): MySqlTimeBuilderInitial<''>;\nexport function time<TName extends string>(\n\tname: TName,\n\tconfig?: TimeConfig,\n): MySqlTimeBuilderInitial<TName>;\nexport function time(a?: string | TimeConfig, b?: TimeConfig) {\n\tconst { name, config } = getColumnNameAndConfig<TimeConfig>(a, b);\n\treturn new MySqlTimeBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/timestamp.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlDateBaseColumn, MySqlDateColumnBaseBuilder } from './date.common.ts';\n\nexport type MySqlTimestampBuilderInitial<TName extends string> = MySqlTimestampBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'MySqlTimestamp';\n\tdata: Date;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlTimestampBuilder<T extends ColumnBuilderBaseConfig<'date', 'MySqlTimestamp'>>\n\textends MySqlDateColumnBaseBuilder<T, MySqlTimestampConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlTimestampBuilder';\n\n\tconstructor(name: T['name'], config: MySqlTimestampConfig | undefined) {\n\t\tsuper(name, 'date', 'MySqlTimestamp');\n\t\tthis.config.fsp = config?.fsp;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlTimestamp<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlTimestamp<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlTimestamp<T extends ColumnBaseConfig<'date', 'MySqlTimestamp'>>\n\textends MySqlDateBaseColumn<T, MySqlTimestampConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlTimestamp';\n\n\treadonly fsp: number | undefined = this.config.fsp;\n\n\tgetSQLType(): string {\n\t\tconst precision = this.fsp === undefined ? '' : `(${this.fsp})`;\n\t\treturn `timestamp${precision}`;\n\t}\n\n\toverride mapFromDriverValue(value: string): Date {\n\t\treturn new Date(value + '+0000');\n\t}\n\n\toverride mapToDriverValue(value: Date): string {\n\t\treturn value.toISOString().slice(0, -1).replace('T', ' ');\n\t}\n}\n\nexport type MySqlTimestampStringBuilderInitial<TName extends string> = MySqlTimestampStringBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'MySqlTimestampString';\n\tdata: string;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlTimestampStringBuilder<T extends ColumnBuilderBaseConfig<'string', 'MySqlTimestampString'>>\n\textends MySqlDateColumnBaseBuilder<T, MySqlTimestampConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlTimestampStringBuilder';\n\n\tconstructor(name: T['name'], config: MySqlTimestampConfig | undefined) {\n\t\tsuper(name, 'string', 'MySqlTimestampString');\n\t\tthis.config.fsp = config?.fsp;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlTimestampString<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlTimestampString<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlTimestampString<T extends ColumnBaseConfig<'string', 'MySqlTimestampString'>>\n\textends MySqlDateBaseColumn<T, MySqlTimestampConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlTimestampString';\n\n\treadonly fsp: number | undefined = this.config.fsp;\n\n\tgetSQLType(): string {\n\t\tconst precision = this.fsp === undefined ? '' : `(${this.fsp})`;\n\t\treturn `timestamp${precision}`;\n\t}\n}\n\nexport type TimestampFsp = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface MySqlTimestampConfig<TMode extends 'string' | 'date' = 'string' | 'date'> {\n\tmode?: TMode;\n\tfsp?: TimestampFsp;\n}\n\nexport function timestamp(): MySqlTimestampBuilderInitial<''>;\nexport function timestamp<TMode extends MySqlTimestampConfig['mode'] & {}>(\n\tconfig?: MySqlTimestampConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? MySqlTimestampStringBuilderInitial<''>\n\t: MySqlTimestampBuilderInitial<''>;\nexport function timestamp<TName extends string, TMode extends MySqlTimestampConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: MySqlTimestampConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? MySqlTimestampStringBuilderInitial<TName>\n\t: MySqlTimestampBuilderInitial<TName>;\nexport function timestamp(a?: string | MySqlTimestampConfig, b: MySqlTimestampConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlTimestampConfig | undefined>(a, b);\n\tif (config?.mode === 'string') {\n\t\treturn new MySqlTimestampStringBuilder(name, config);\n\t}\n\treturn new MySqlTimestampBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/tinyint.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumnBuilderWithAutoIncrement, MySqlColumnWithAutoIncrement } from './common.ts';\nimport type { MySqlIntConfig } from './int.ts';\n\nexport type MySqlTinyIntBuilderInitial<TName extends string> = MySqlTinyIntBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'MySqlTinyInt';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlTinyIntBuilder<T extends ColumnBuilderBaseConfig<'number', 'MySqlTinyInt'>>\n\textends MySqlColumnBuilderWithAutoIncrement<T, MySqlIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlTinyIntBuilder';\n\n\tconstructor(name: T['name'], config?: MySqlIntConfig) {\n\t\tsuper(name, 'number', 'MySqlTinyInt');\n\t\tthis.config.unsigned = config ? config.unsigned : false;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlTinyInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlTinyInt<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlTinyInt<T extends ColumnBaseConfig<'number', 'MySqlTinyInt'>>\n\textends MySqlColumnWithAutoIncrement<T, MySqlIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlTinyInt';\n\n\tgetSQLType(): string {\n\t\treturn `tinyint${this.config.unsigned ? ' unsigned' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function tinyint(): MySqlTinyIntBuilderInitial<''>;\nexport function tinyint(\n\tconfig?: MySqlIntConfig,\n): MySqlTinyIntBuilderInitial<''>;\nexport function tinyint<TName extends string>(\n\tname: TName,\n\tconfig?: MySqlIntConfig,\n): MySqlTinyIntBuilderInitial<TName>;\nexport function tinyint(a?: string | MySqlIntConfig, b?: MySqlIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlIntConfig>(a, b);\n\treturn new MySqlTinyIntBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/varbinary.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\nexport type MySqlVarBinaryBuilderInitial<TName extends string> = MySqlVarBinaryBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'MySqlVarBinary';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlVarBinaryBuilder<T extends ColumnBuilderBaseConfig<'string', 'MySqlVarBinary'>>\n\textends MySqlColumnBuilder<T, MySqlVarbinaryOptions>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlVarBinaryBuilder';\n\n\t/** @internal */\n\tconstructor(name: T['name'], config: MySqlVarbinaryOptions) {\n\t\tsuper(name, 'string', 'MySqlVarBinary');\n\t\tthis.config.length = config?.length;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlVarBinary<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlVarBinary<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlVarBinary<\n\tT extends ColumnBaseConfig<'string', 'MySqlVarBinary'>,\n> extends MySqlColumn<T, MySqlVarbinaryOptions> {\n\tstatic override readonly [entityKind]: string = 'MySqlVarBinary';\n\n\tlength: number | undefined = this.config.length;\n\n\toverride mapFromDriverValue(value: string | Buffer | Uint8Array): string {\n\t\tif (typeof value === 'string') return value;\n\t\tif (Buffer.isBuffer(value)) return value.toString();\n\n\t\tconst str: string[] = [];\n\t\tfor (const v of value) {\n\t\t\tstr.push(v === 49 ? '1' : '0');\n\t\t}\n\n\t\treturn str.join('');\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `varbinary` : `varbinary(${this.length})`;\n\t}\n}\n\nexport interface MySqlVarbinaryOptions {\n\tlength: number;\n}\n\nexport function varbinary(\n\tconfig: MySqlVarbinaryOptions,\n): MySqlVarBinaryBuilderInitial<''>;\nexport function varbinary<TName extends string>(\n\tname: TName,\n\tconfig: MySqlVarbinaryOptions,\n): MySqlVarBinaryBuilderInitial<TName>;\nexport function varbinary(a?: string | MySqlVarbinaryOptions, b?: MySqlVarbinaryOptions) {\n\tconst { name, config } = getColumnNameAndConfig<MySqlVarbinaryOptions>(a, b);\n\treturn new MySqlVarBinaryBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/varchar.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\nexport type MySqlVarCharBuilderInitial<\n\tTName extends string,\n\tTEnum extends [string, ...string[]],\n\tTLength extends number | undefined,\n> = MySqlVarCharBuilder<\n\t{\n\t\tname: TName;\n\t\tdataType: 'string';\n\t\tcolumnType: 'MySqlVarChar';\n\t\tdata: TEnum[number];\n\t\tdriverParam: number | string;\n\t\tenumValues: TEnum;\n\t\tlength: TLength;\n\t}\n>;\n\nexport class MySqlVarCharBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'MySqlVarChar'> & { length?: number | undefined },\n> extends MySqlColumnBuilder<T, MySqlVarCharConfig<T['enumValues'], T['length']>> {\n\tstatic override readonly [entityKind]: string = 'MySqlVarCharBuilder';\n\n\t/** @internal */\n\tconstructor(name: T['name'], config: MySqlVarCharConfig<T['enumValues'], T['length']>) {\n\t\tsuper(name, 'string', 'MySqlVarChar');\n\t\tthis.config.length = config.length;\n\t\tthis.config.enum = config.enum;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlVarChar<MakeColumnConfig<T, TTableName> & { length: T['length']; enumValues: T['enumValues'] }> {\n\t\treturn new MySqlVarChar<MakeColumnConfig<T, TTableName> & { length: T['length']; enumValues: T['enumValues'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class MySqlVarChar<T extends ColumnBaseConfig<'string', 'MySqlVarChar'> & { length?: number | undefined }>\n\textends MySqlColumn<T, MySqlVarCharConfig<T['enumValues'], T['length']>, { length: T['length'] }>\n{\n\tstatic override readonly [entityKind]: string = 'MySqlVarChar';\n\n\treadonly length: number | undefined = this.config.length;\n\n\toverride readonly enumValues = this.config.enum;\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `varchar` : `varchar(${this.length})`;\n\t}\n}\n\nexport interface MySqlVarCharConfig<\n\tTEnum extends string[] | readonly string[] | undefined = string[] | readonly string[] | undefined,\n\tTLength extends number | undefined = number | undefined,\n> {\n\tenum?: TEnum;\n\tlength: TLength;\n}\n\nexport function varchar<U extends string, T extends Readonly<[U, ...U[]]>, L extends number | undefined>(\n\tconfig: MySqlVarCharConfig<T | Writable<T>, L>,\n): MySqlVarCharBuilderInitial<'', Writable<T>, L>;\nexport function varchar<\n\tTName extends string,\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n>(\n\tname: TName,\n\tconfig: MySqlVarCharConfig<T | Writable<T>, L>,\n): MySqlVarCharBuilderInitial<TName, Writable<T>, L>;\nexport function varchar(a?: string | MySqlVarCharConfig, b?: MySqlVarCharConfig): any {\n\tconst { name, config } = getColumnNameAndConfig<MySqlVarCharConfig>(a, b);\n\treturn new MySqlVarCharBuilder(name, config as any);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/columns/year.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyMySqlTable } from '~/mysql-core/table.ts';\nimport { MySqlColumn, MySqlColumnBuilder } from './common.ts';\n\nexport type MySqlYearBuilderInitial<TName extends string> = MySqlYearBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'MySqlYear';\n\tdata: number;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class MySqlYearBuilder<T extends ColumnBuilderBaseConfig<'number', 'MySqlYear'>> extends MySqlColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlYearBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'MySqlYear');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyMySqlTable<{ name: TTableName }>,\n\t): MySqlYear<MakeColumnConfig<T, TTableName>> {\n\t\treturn new MySqlYear<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class MySqlYear<\n\tT extends ColumnBaseConfig<'number', 'MySqlYear'>,\n> extends MySqlColumn<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlYear';\n\n\tgetSQLType(): string {\n\t\treturn `year`;\n\t}\n}\n\nexport function year(): MySqlYearBuilderInitial<''>;\nexport function year<TName extends string>(name: TName): MySqlYearBuilderInitial<TName>;\nexport function year(name?: string) {\n\treturn new MySqlYearBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/db.ts",
    "content": "import type { ResultSetHeader } from 'mysql2/promise';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { type ColumnsSelection, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { DrizzleTypeError } from '~/utils.ts';\nimport type { MySqlDialect } from './dialect.ts';\nimport { MySqlCountBuilder } from './query-builders/count.ts';\nimport {\n\tMySqlDeleteBase,\n\tMySqlInsertBuilder,\n\tMySqlSelectBuilder,\n\tMySqlUpdateBuilder,\n\tQueryBuilder,\n} from './query-builders/index.ts';\nimport { RelationalQueryBuilder } from './query-builders/query.ts';\nimport type { SelectedFields } from './query-builders/select.types.ts';\nimport type {\n\tMode,\n\tMySqlQueryResultHKT,\n\tMySqlQueryResultKind,\n\tMySqlSession,\n\tMySqlTransaction,\n\tMySqlTransactionConfig,\n\tPreparedQueryHKTBase,\n} from './session.ts';\nimport type { WithBuilder } from './subquery.ts';\nimport type { MySqlTable } from './table.ts';\nimport type { MySqlViewBase } from './view-base.ts';\n\nexport class MySqlDatabase<\n\tTQueryResult extends MySqlQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTFullSchema extends Record<string, unknown> = {},\n\tTSchema extends TablesRelationalConfig = ExtractTablesWithRelations<TFullSchema>,\n> {\n\tstatic readonly [entityKind]: string = 'MySqlDatabase';\n\n\tdeclare readonly _: {\n\t\treadonly schema: TSchema | undefined;\n\t\treadonly fullSchema: TFullSchema;\n\t\treadonly tableNamesMap: Record<string, string>;\n\t};\n\n\tquery: TFullSchema extends Record<string, never>\n\t\t? DrizzleTypeError<'Seems like the schema generic is missing - did you forget to add it to your DB type?'>\n\t\t: {\n\t\t\t[K in keyof TSchema]: RelationalQueryBuilder<TPreparedQueryHKT, TSchema, TSchema[K]>;\n\t\t};\n\n\tconstructor(\n\t\t/** @internal */\n\t\treadonly dialect: MySqlDialect,\n\t\t/** @internal */\n\t\treadonly session: MySqlSession<any, any, any, any>,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprotected readonly mode: Mode,\n\t) {\n\t\tthis._ = schema\n\t\t\t? {\n\t\t\t\tschema: schema.schema,\n\t\t\t\tfullSchema: schema.fullSchema as TFullSchema,\n\t\t\t\ttableNamesMap: schema.tableNamesMap,\n\t\t\t}\n\t\t\t: {\n\t\t\t\tschema: undefined,\n\t\t\t\tfullSchema: {} as TFullSchema,\n\t\t\t\ttableNamesMap: {},\n\t\t\t};\n\t\tthis.query = {} as typeof this['query'];\n\t\tif (this._.schema) {\n\t\t\tfor (const [tableName, columns] of Object.entries(this._.schema)) {\n\t\t\t\t(this.query as MySqlDatabase<TQueryResult, TPreparedQueryHKT, Record<string, any>>['query'])[tableName] =\n\t\t\t\t\tnew RelationalQueryBuilder(\n\t\t\t\t\t\tschema!.fullSchema,\n\t\t\t\t\t\tthis._.schema,\n\t\t\t\t\t\tthis._.tableNamesMap,\n\t\t\t\t\t\tschema!.fullSchema[tableName] as MySqlTable,\n\t\t\t\t\t\tcolumns,\n\t\t\t\t\t\tdialect,\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\tthis.mode,\n\t\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tthis.$cache = { invalidate: async (_params: any) => {} };\n\t}\n\n\t/**\n\t * Creates a subquery that defines a temporary named result set as a CTE.\n\t *\n\t * It is useful for breaking down complex queries into simpler parts and for reusing the result set in subsequent parts of the query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param alias The alias for the subquery.\n\t *\n\t * Failure to provide an alias will result in a DrizzleTypeError, preventing the subquery from being referenced in other queries.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Create a subquery with alias 'sq' and use it in the select query\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t *\n\t * To select arbitrary SQL values as fields in a CTE and reference them in other CTEs or in the main query, you need to add aliases to them:\n\t *\n\t * ```ts\n\t * // Select an arbitrary SQL value as a field in a CTE and reference it in the main query\n\t * const sq = db.$with('sq').as(db.select({\n\t *   name: sql<string>`upper(${users.name})`.as('name'),\n\t * })\n\t * .from(users));\n\t *\n\t * const result = await db.with(sq).select({ name: sq.name }).from(sq);\n\t * ```\n\t */\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst self = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(new QueryBuilder(self.dialect));\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t);\n\t\t};\n\t\treturn { as };\n\t};\n\n\t$count(\n\t\tsource: MySqlTable | MySqlViewBase | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t) {\n\t\treturn new MySqlCountBuilder({ source, filters, session: this.session });\n\t}\n\n\t$cache: { invalidate: Cache['onMutate'] };\n\n\t/**\n\t * Incorporates a previously defined CTE (using `$with`) into the main query.\n\t *\n\t * This method allows the main query to reference a temporary named result set.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param queries The CTEs to incorporate into the main query.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Define a subquery 'sq' as a CTE using $with\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * // Incorporate the CTE 'sq' into the main query and select from it\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t */\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\t/**\n\t\t * Creates a select query.\n\t\t *\n\t\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all columns and all rows from the 'cars' table\n\t\t * const allCars: Car[] = await db.select().from(cars);\n\t\t *\n\t\t * // Select specific columns and all rows from the 'cars' table\n\t\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t\t *   id: cars.id,\n\t\t *   brand: cars.brand\n\t\t * })\n\t\t *   .from(cars);\n\t\t * ```\n\t\t *\n\t\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t\t *\n\t\t * ```ts\n\t\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t\t *   id: cars.id,\n\t\t *   lowerBrand: sql<string>`lower(${cars.brand})`,\n\t\t * })\n\t\t *   .from(cars);\n\t\t * ```\n\t\t */\n\t\tfunction select(): MySqlSelectBuilder<undefined, TPreparedQueryHKT>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): MySqlSelectBuilder<TSelection, TPreparedQueryHKT>;\n\t\tfunction select(fields?: SelectedFields): MySqlSelectBuilder<SelectedFields | undefined, TPreparedQueryHKT> {\n\t\t\treturn new MySqlSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct` expression to the select query.\n\t\t *\n\t\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * // Select all unique rows from the 'cars' table\n\t\t * await db.selectDistinct()\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.id, cars.brand, cars.color);\n\t\t *\n\t\t * // Select all unique brands from the 'cars' table\n\t\t * await db.selectDistinct({ brand: cars.brand })\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.brand);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinct(): MySqlSelectBuilder<undefined, TPreparedQueryHKT>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): MySqlSelectBuilder<TSelection, TPreparedQueryHKT>;\n\t\tfunction selectDistinct(\n\t\t\tfields?: SelectedFields,\n\t\t): MySqlSelectBuilder<SelectedFields | undefined, TPreparedQueryHKT> {\n\t\t\treturn new MySqlSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Creates an update query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t\t *\n\t\t * Use `.set()` method to specify which values to update.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t\t *\n\t\t * @param table The table to update.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Update all rows in the 'cars' table\n\t\t * await db.update(cars).set({ color: 'red' });\n\t\t *\n\t\t * // Update rows with filters and conditions\n\t\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t\t * ```\n\t\t */\n\t\tfunction update<TTable extends MySqlTable>(\n\t\t\ttable: TTable,\n\t\t): MySqlUpdateBuilder<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\t\treturn new MySqlUpdateBuilder(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates a delete query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t\t *\n\t\t * @param table The table to delete from.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Delete all rows in the 'cars' table\n\t\t * await db.delete(cars);\n\t\t *\n\t\t * // Delete rows with filters and conditions\n\t\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t\t * ```\n\t\t */\n\t\tfunction delete_<TTable extends MySqlTable>(\n\t\t\ttable: TTable,\n\t\t): MySqlDeleteBase<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\t\treturn new MySqlDeleteBase(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\treturn { select, selectDistinct, update, delete: delete_ };\n\t}\n\n\t/**\n\t * Creates a select query.\n\t *\n\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all columns and all rows from the 'cars' table\n\t * const allCars: Car[] = await db.select().from(cars);\n\t *\n\t * // Select specific columns and all rows from the 'cars' table\n\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t *   id: cars.id,\n\t *   brand: cars.brand\n\t * })\n\t *   .from(cars);\n\t * ```\n\t *\n\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t *\n\t * ```ts\n\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t *   id: cars.id,\n\t *   lowerBrand: sql<string>`lower(${cars.brand})`,\n\t * })\n\t *   .from(cars);\n\t * ```\n\t */\n\tselect(): MySqlSelectBuilder<undefined, TPreparedQueryHKT>;\n\tselect<TSelection extends SelectedFields>(fields: TSelection): MySqlSelectBuilder<TSelection, TPreparedQueryHKT>;\n\tselect(fields?: SelectedFields): MySqlSelectBuilder<SelectedFields | undefined, TPreparedQueryHKT> {\n\t\treturn new MySqlSelectBuilder({ fields: fields ?? undefined, session: this.session, dialect: this.dialect });\n\t}\n\n\t/**\n\t * Adds `distinct` expression to the select query.\n\t *\n\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t * ```ts\n\t * // Select all unique rows from the 'cars' table\n\t * await db.selectDistinct()\n\t *   .from(cars)\n\t *   .orderBy(cars.id, cars.brand, cars.color);\n\t *\n\t * // Select all unique brands from the 'cars' table\n\t * await db.selectDistinct({ brand: cars.brand })\n\t *   .from(cars)\n\t *   .orderBy(cars.brand);\n\t * ```\n\t */\n\tselectDistinct(): MySqlSelectBuilder<undefined, TPreparedQueryHKT>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): MySqlSelectBuilder<TSelection, TPreparedQueryHKT>;\n\tselectDistinct(fields?: SelectedFields): MySqlSelectBuilder<SelectedFields | undefined, TPreparedQueryHKT> {\n\t\treturn new MySqlSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t/**\n\t * Creates an update query.\n\t *\n\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t *\n\t * Use `.set()` method to specify which values to update.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param table The table to update.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Update all rows in the 'cars' table\n\t * await db.update(cars).set({ color: 'red' });\n\t *\n\t * // Update rows with filters and conditions\n\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t * ```\n\t */\n\tupdate<TTable extends MySqlTable>(table: TTable): MySqlUpdateBuilder<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\treturn new MySqlUpdateBuilder(table, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates an insert query.\n\t *\n\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t *\n\t * @param table The table to insert into.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Insert one row\n\t * await db.insert(cars).values({ brand: 'BMW' });\n\t *\n\t * // Insert multiple rows\n\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t * ```\n\t */\n\tinsert<TTable extends MySqlTable>(table: TTable): MySqlInsertBuilder<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\treturn new MySqlInsertBuilder(table, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates a delete query.\n\t *\n\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param table The table to delete from.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Delete all rows in the 'cars' table\n\t * await db.delete(cars);\n\t *\n\t * // Delete rows with filters and conditions\n\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t * ```\n\t */\n\tdelete<TTable extends MySqlTable>(table: TTable): MySqlDeleteBase<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\treturn new MySqlDeleteBase(table, this.session, this.dialect);\n\t}\n\n\texecute<T extends { [column: string]: any } = ResultSetHeader>(\n\t\tquery: SQLWrapper | string,\n\t): Promise<MySqlQueryResultKind<TQueryResult, T>> {\n\t\treturn this.session.execute(typeof query === 'string' ? sql.raw(query) : query.getSQL());\n\t}\n\n\ttransaction<T>(\n\t\ttransaction: (\n\t\t\ttx: MySqlTransaction<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema>,\n\t\t\tconfig?: MySqlTransactionConfig,\n\t\t) => Promise<T>,\n\t\tconfig?: MySqlTransactionConfig,\n\t): Promise<T> {\n\t\treturn this.session.transaction(transaction, config);\n\t}\n}\n\nexport type MySQLWithReplicas<Q> = Q & { $primary: Q; $replicas: Q[] };\n\nexport const withReplicas = <\n\tHKT extends MySqlQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n\tQ extends MySqlDatabase<\n\t\tHKT,\n\t\tTPreparedQueryHKT,\n\t\tTFullSchema,\n\t\tTSchema extends Record<string, unknown> ? ExtractTablesWithRelations<TFullSchema> : TSchema\n\t>,\n>(\n\tprimary: Q,\n\treplicas: [Q, ...Q[]],\n\tgetReplica: (replicas: Q[]) => Q = () => replicas[Math.floor(Math.random() * replicas.length)]!,\n): MySQLWithReplicas<Q> => {\n\tconst select: Q['select'] = (...args: []) => getReplica(replicas).select(...args);\n\tconst selectDistinct: Q['selectDistinct'] = (...args: []) => getReplica(replicas).selectDistinct(...args);\n\tconst $count: Q['$count'] = (...args: [any]) => getReplica(replicas).$count(...args);\n\tconst $with: Q['with'] = (...args: []) => getReplica(replicas).with(...args);\n\n\tconst update: Q['update'] = (...args: [any]) => primary.update(...args);\n\tconst insert: Q['insert'] = (...args: [any]) => primary.insert(...args);\n\tconst $delete: Q['delete'] = (...args: [any]) => primary.delete(...args);\n\tconst execute: Q['execute'] = (...args: [any]) => primary.execute(...args);\n\tconst transaction: Q['transaction'] = (...args: [any, any]) => primary.transaction(...args);\n\n\treturn {\n\t\t...primary,\n\t\tupdate,\n\t\tinsert,\n\t\tdelete: $delete,\n\t\texecute,\n\t\ttransaction,\n\t\t$primary: primary,\n\t\t$replicas: replicas,\n\t\tselect,\n\t\tselectDistinct,\n\t\t$count,\n\t\twith: $with,\n\t\tget query() {\n\t\t\treturn getReplica(replicas).query;\n\t\t},\n\t};\n};\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/dialect.ts",
    "content": "import { aliasedTable, aliasedTableColumn, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta } from '~/migrator.ts';\nimport {\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tgetOperators,\n\tgetOrderByOperators,\n\tMany,\n\tnormalizeRelation,\n\tOne,\n\ttype Relation,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { and, eq } from '~/sql/expressions/index.ts';\nimport { Param, SQL, sql, View } from '~/sql/sql.ts';\nimport type { Name, Placeholder, QueryWithTypings, SQLChunk } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table } from '~/table.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { MySqlColumn } from './columns/common.ts';\nimport type { MySqlDeleteConfig } from './query-builders/delete.ts';\nimport type { MySqlInsertConfig } from './query-builders/insert.ts';\nimport type {\n\tAnyMySqlSelectQueryBuilder,\n\tMySqlSelectConfig,\n\tMySqlSelectJoinConfig,\n\tSelectedFieldsOrdered,\n} from './query-builders/select.types.ts';\nimport type { MySqlUpdateConfig } from './query-builders/update.ts';\nimport type { MySqlSession } from './session.ts';\nimport { MySqlTable } from './table.ts';\nimport { MySqlViewBase } from './view-base.ts';\n\nexport interface MySqlDialectConfig {\n\tcasing?: Casing;\n}\n\nexport class MySqlDialect {\n\tstatic readonly [entityKind]: string = 'MySqlDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: MySqlDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\t}\n\n\tasync migrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: MySqlSession,\n\t\tconfig: Omit<MigrationConfig, 'migrationsSchema'>,\n\t): Promise<void> {\n\t\tconst migrationsTable = config.migrationsTable ?? '__drizzle_migrations';\n\t\tconst migrationTableCreate = sql`\n\t\t\tcreate table if not exists ${sql.identifier(migrationsTable)} (\n\t\t\t\tid serial primary key,\n\t\t\t\thash text not null,\n\t\t\t\tcreated_at bigint\n\t\t\t)\n\t\t`;\n\t\tawait session.execute(migrationTableCreate);\n\n\t\tconst dbMigrations = await session.all<{ id: number; hash: string; created_at: string }>(\n\t\t\tsql`select id, hash, created_at from ${sql.identifier(migrationsTable)} order by created_at desc limit 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0];\n\n\t\tawait session.transaction(async (tx) => {\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (\n\t\t\t\t\t!lastDbMigration\n\t\t\t\t\t|| Number(lastDbMigration.created_at) < migration.folderMillis\n\t\t\t\t) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tawait tx.execute(\n\t\t\t\t\t\tsql`insert into ${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\\`hash\\`, \\`created_at\\`) values(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\\`${name}\\``;\n\t}\n\n\tescapeParam(_num: number): string {\n\t\treturn `?`;\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({ table, where, returning, withList, limit, orderBy }: MySqlDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${orderBySql}${limitSql}${returningSql}`;\n\t}\n\n\tbuildUpdateSet(table: MySqlTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter((colName) =>\n\t\t\tset[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined\n\t\t);\n\n\t\tconst setSize = columnNames.length;\n\t\treturn sql.join(columnNames.flatMap((colName, i) => {\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tconst onUpdateFnResult = col.onUpdateFn?.();\n\t\t\tconst value = set[colName] ?? (is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col));\n\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\tif (i < setSize - 1) {\n\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t}\n\t\t\treturn [res];\n\t\t}));\n\t}\n\n\tbuildUpdateQuery({ table, set, where, returning, withList, limit, orderBy }: MySqlUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}update ${table} set ${setSql}${whereSql}${orderBySql}${limitSql}${returningSql}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields\n\t\t\t.flatMap(({ field }, i) => {\n\t\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tnew SQL(\n\t\t\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\t\t\tif (is(c, MySqlColumn)) {\n\t\t\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn c;\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(query);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Column)) {\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(sql.identifier(this.casing.getColumnCasing(field)));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(field);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\t\tconst entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];\n\n\t\t\t\t\tif (entries.length === 1) {\n\t\t\t\t\t\tconst entry = entries[0]![1];\n\n\t\t\t\t\t\tconst fieldDecoder = is(entry, SQL)\n\t\t\t\t\t\t\t? entry.decoder\n\t\t\t\t\t\t\t: is(entry, Column)\n\t\t\t\t\t\t\t? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }\n\t\t\t\t\t\t\t: entry.sql.decoder;\n\n\t\t\t\t\t\tif (fieldDecoder) {\n\t\t\t\t\t\t\tfield._.sql.decoder = fieldDecoder;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tchunk.push(field);\n\t\t\t\t}\n\n\t\t\t\tif (i < columnsLen - 1) {\n\t\t\t\t\tchunk.push(sql`, `);\n\t\t\t\t}\n\n\t\t\t\treturn chunk;\n\t\t\t});\n\n\t\treturn sql.join(chunks);\n\t}\n\n\tprivate buildLimit(limit: number | Placeholder | undefined): SQL | undefined {\n\t\treturn typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\t}\n\n\tprivate buildOrderBy(orderBy: (MySqlColumn | SQL | SQL.Aliased)[] | undefined): SQL | undefined {\n\t\treturn orderBy && orderBy.length > 0 ? sql` order by ${sql.join(orderBy, sql`, `)}` : undefined;\n\t}\n\n\tprivate buildIndex({\n\t\tindexes,\n\t\tindexFor,\n\t}: {\n\t\tindexes: string[] | undefined;\n\t\tindexFor: 'USE' | 'FORCE' | 'IGNORE';\n\t}): SQL | undefined {\n\t\treturn indexes && indexes.length > 0\n\t\t\t? sql` ${sql.raw(indexFor)} INDEX (${sql.raw(indexes.join(`, `))})`\n\t\t\t: undefined;\n\t}\n\n\tbuildSelectQuery(\n\t\t{\n\t\t\twithList,\n\t\t\tfields,\n\t\t\tfieldsFlat,\n\t\t\twhere,\n\t\t\thaving,\n\t\t\ttable,\n\t\t\tjoins,\n\t\t\torderBy,\n\t\t\tgroupBy,\n\t\t\tlimit,\n\t\t\toffset,\n\t\t\tlockingClause,\n\t\t\tdistinct,\n\t\t\tsetOperators,\n\t\t\tuseIndex,\n\t\t\tforceIndex,\n\t\t\tignoreIndex,\n\t\t}: MySqlSelectConfig,\n\t): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<MySqlColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, MySqlViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(({ alias }) =>\n\t\t\t\t\t\talias === (table[Table.Symbol.IsAlias] ? getTableName(table) : table[Table.Symbol.BaseName])\n\t\t\t\t\t))(f.field.table)\n\t\t\t) {\n\t\t\t\tconst tableName = getTableName(f.field.table);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Your \"${\n\t\t\t\t\t\tf.path.join('->')\n\t\t\t\t\t}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst isSingleTable = !joins || joins.length === 0;\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst distinctSql = distinct ? sql` distinct` : undefined;\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable });\n\n\t\tconst tableSql = (() => {\n\t\t\tif (is(table, Table) && table[Table.Symbol.IsAlias]) {\n\t\t\t\treturn sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? '')}.`.if(table[Table.Symbol.Schema])}${\n\t\t\t\t\tsql.identifier(table[Table.Symbol.OriginalName])\n\t\t\t\t} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t\t}\n\n\t\t\treturn table;\n\t\t})();\n\n\t\tconst joinsArray: SQL[] = [];\n\n\t\tif (joins) {\n\t\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t\tconst table = joinMeta.table;\n\t\t\t\tconst lateralSql = joinMeta.lateral ? sql` lateral` : undefined;\n\t\t\t\tconst onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;\n\n\t\t\t\tif (is(table, MySqlTable)) {\n\t\t\t\t\tconst tableName = table[MySqlTable.Symbol.Name];\n\t\t\t\t\tconst tableSchema = table[MySqlTable.Symbol.Schema];\n\t\t\t\t\tconst origTableName = table[MySqlTable.Symbol.OriginalName];\n\t\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\t\tconst useIndexSql = this.buildIndex({ indexes: joinMeta.useIndex, indexFor: 'USE' });\n\t\t\t\t\tconst forceIndexSql = this.buildIndex({ indexes: joinMeta.forceIndex, indexFor: 'FORCE' });\n\t\t\t\t\tconst ignoreIndexSql = this.buildIndex({ indexes: joinMeta.ignoreIndex, indexFor: 'IGNORE' });\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\t\ttableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined\n\t\t\t\t\t\t}${sql.identifier(origTableName)}${useIndexSql}${forceIndexSql}${ignoreIndexSql}${\n\t\t\t\t\t\t\talias && sql` ${sql.identifier(alias)}`\n\t\t\t\t\t\t}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t} else if (is(table, View)) {\n\t\t\t\t\tconst viewName = table[ViewBaseConfig].name;\n\t\t\t\t\tconst viewSchema = table[ViewBaseConfig].schema;\n\t\t\t\t\tconst origViewName = table[ViewBaseConfig].originalName;\n\t\t\t\t\tconst alias = viewName === origViewName ? undefined : joinMeta.alias;\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\t\tviewSchema ? sql`${sql.identifier(viewSchema)}.` : undefined\n\t\t\t\t\t\t}${sql.identifier(origViewName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${table}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (index < joins.length - 1) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst joinsSql = sql.join(joinsArray);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst groupBySql = groupBy && groupBy.length > 0 ? sql` group by ${sql.join(groupBy, sql`, `)}` : undefined;\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tconst useIndexSql = this.buildIndex({ indexes: useIndex, indexFor: 'USE' });\n\n\t\tconst forceIndexSql = this.buildIndex({ indexes: forceIndex, indexFor: 'FORCE' });\n\n\t\tconst ignoreIndexSql = this.buildIndex({ indexes: ignoreIndex, indexFor: 'IGNORE' });\n\n\t\tlet lockingClausesSql;\n\t\tif (lockingClause) {\n\t\t\tconst { config, strength } = lockingClause;\n\t\t\tlockingClausesSql = sql` for ${sql.raw(strength)}`;\n\t\t\tif (config.noWait) {\n\t\t\t\tlockingClausesSql.append(sql` nowait`);\n\t\t\t} else if (config.skipLocked) {\n\t\t\t\tlockingClausesSql.append(sql` skip locked`);\n\t\t\t}\n\t\t}\n\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${useIndexSql}${forceIndexSql}${ignoreIndexSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}${lockingClausesSql}`;\n\n\t\tif (setOperators.length > 0) {\n\t\t\treturn this.buildSetOperations(finalQuery, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(leftSelect: SQL, setOperators: MySqlSelectConfig['setOperators']): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: { leftSelect: SQL; setOperator: MySqlSelectConfig['setOperators'][number] }): SQL {\n\t\tconst leftChunk = sql`(${leftSelect.getSQL()}) `;\n\t\tconst rightChunk = sql`(${rightSelect.getSQL()})`;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\tconst orderByValues: (SQL<unknown> | Name)[] = [];\n\n\t\t\t// The next bit is necessary because the sql operator replaces ${table.column} with `table`.`column`\n\t\t\t// which is invalid MySql syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const orderByUnit of orderBy) {\n\t\t\t\tif (is(orderByUnit, MySqlColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(this.casing.getColumnCasing(orderByUnit)));\n\t\t\t\t} else if (is(orderByUnit, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < orderByUnit.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = orderByUnit.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, MySqlColumn)) {\n\t\t\t\t\t\t\torderByUnit.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${orderByUnit}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${orderByUnit}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)} `;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery(\n\t\t{ table, values: valuesOrSelect, ignore, onConflict, select }: MySqlInsertConfig,\n\t): { sql: SQL; generatedIds: Record<string, unknown>[] } {\n\t\t// const isSingleValue = values.length === 1;\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, MySqlColumn> = table[Table.Symbol.Columns];\n\t\tconst colEntries: [string, MySqlColumn][] = Object.entries(columns).filter(([_, col]) =>\n\t\t\t!col.shouldDisableInsert()\n\t\t);\n\n\t\tconst insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));\n\t\tconst generatedIdsResponse: Record<string, unknown>[] = [];\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnyMySqlSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst generatedIds: Record<string, unknown> = {};\n\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (colValue === undefined || (is(colValue, Param) && colValue.value === undefined)) {\n\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\tif (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tgeneratedIds[fieldName] = defaultFnResult;\n\t\t\t\t\t\t\tconst defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tconst newValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t\tvalueList.push(newValue);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalueList.push(sql`default`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (col.defaultFn && is(colValue, Param)) {\n\t\t\t\t\t\t\tgeneratedIds[fieldName] = colValue.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tgeneratedIdsResponse.push(generatedIds);\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst ignoreSql = ignore ? sql` ignore` : undefined;\n\n\t\tconst onConflictSql = onConflict ? sql` on duplicate key ${onConflict}` : undefined;\n\n\t\treturn {\n\t\t\tsql: sql`insert${ignoreSql} into ${table} ${insertOrder} ${valuesSql}${onConflictSql}`,\n\t\t\tgeneratedIds: generatedIdsResponse,\n\t\t};\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\tbuildRelationalQuery({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: MySqlTable;\n\t\ttableConfig: TableRelationalConfig;\n\t\tqueryConfig: true | DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: Relation;\n\t\tjoinOn?: SQL;\n\t}): BuildRelationalQueryResult<MySqlTable, MySqlColumn> {\n\t\tlet selection: BuildRelationalQueryResult<MySqlTable, MySqlColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: MySqlSelectConfig['orderBy'], where;\n\t\tconst joins: MySqlSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as MySqlColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: MySqlColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as MySqlColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | DBQueryConfig<'many', false>;\n\t\t\t\trelation: Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as MySqlColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this.buildRelationalQuery({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as MySqlTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = sql`${sql.identifier(relationTableAlias)}.${sql.identifier('data')}`.as(selectedRelationTsKey);\n\t\t\t\tjoins.push({\n\t\t\t\t\ton: sql`true`,\n\t\t\t\t\ttable: new Subquery(builtRelation.sql as SQL, {}, relationTableAlias),\n\t\t\t\t\talias: relationTableAlias,\n\t\t\t\t\tjoinType: 'left',\n\t\t\t\t\tlateral: true,\n\t\t\t\t});\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({ message: `No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\")` });\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field, tsKey, isJson }) =>\n\t\t\t\t\t\tisJson\n\t\t\t\t\t\t\t? sql`${sql.identifier(`${tableAlias}_${tsKey}`)}.${sql.identifier('data')}`\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, Many)) {\n\t\t\t\tfield = sql`coalesce(json_arrayagg(${field}), json_array())`;\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield: field.as('data'),\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || (orderBy?.length ?? 0) > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(((orderBy?.length ?? 0) > 0)\n\t\t\t\t\t\t\t? [{\n\t\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\t\tfield: sql`row_number() over (order by ${sql.join(orderBy!, sql`, `)})`,\n\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, MySqlTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n\n\tbuildRelationalQueryWithoutLateralSubqueries({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: MySqlTable;\n\t\ttableConfig: TableRelationalConfig;\n\t\tqueryConfig: true | DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: Relation;\n\t\tjoinOn?: SQL;\n\t}): BuildRelationalQueryResult<MySqlTable, MySqlColumn> {\n\t\tlet selection: BuildRelationalQueryResult<MySqlTable, MySqlColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: MySqlSelectConfig['orderBy'] = [], where;\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as MySqlColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: MySqlColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as MySqlColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | DBQueryConfig<'many', false>;\n\t\t\t\trelation: Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as MySqlColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this.buildRelationalQueryWithoutLateralSubqueries({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as MySqlTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tlet fieldSql = sql`(${builtRelation.sql})`;\n\t\t\t\tif (is(relation, Many)) {\n\t\t\t\t\tfieldSql = sql`coalesce(${fieldSql}, json_array())`;\n\t\t\t\t}\n\t\t\t\tconst field = fieldSql.as(selectedRelationTsKey);\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage:\n\t\t\t\t\t`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.`,\n\t\t\t});\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field }) =>\n\t\t\t\t\t\tis(field, MySqlColumn)\n\t\t\t\t\t\t\t? sql.identifier(this.casing.getColumnCasing(field))\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, Many)) {\n\t\t\t\tfield = sql`json_arrayagg(${field})`;\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield,\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(orderBy.length > 0)\n\t\t\t\t\t\t\t? [{\n\t\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\t\tfield: sql`row_number() over (order by ${sql.join(orderBy, sql`, `)})`,\n\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t: [],\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, MySqlTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/expressions.ts",
    "content": "import { bindIfParam } from '~/sql/expressions/index.ts';\nimport type { Placeholder, SQL, SQLChunk, SQLWrapper } from '~/sql/sql.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { MySqlColumn } from './columns/index.ts';\n\nexport * from '~/sql/expressions/index.ts';\n\nexport function concat(column: MySqlColumn | SQL.Aliased, value: string | Placeholder | SQLWrapper): SQL {\n\treturn sql`${column} || ${bindIfParam(value, column)}`;\n}\n\nexport function substring(\n\tcolumn: MySqlColumn | SQL.Aliased,\n\t{ from, for: _for }: { from?: number | Placeholder | SQLWrapper; for?: number | Placeholder | SQLWrapper },\n): SQL {\n\tconst chunks: SQLChunk[] = [sql`substring(`, column];\n\tif (from !== undefined) {\n\t\tchunks.push(sql` from `, bindIfParam(from, column));\n\t}\n\tif (_for !== undefined) {\n\t\tchunks.push(sql` for `, bindIfParam(_for, column));\n\t}\n\tchunks.push(sql`)`);\n\treturn sql.join(chunks);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/foreign-keys.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { AnyMySqlColumn, MySqlColumn } from './columns/index.ts';\nimport type { MySqlTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: MySqlColumn[];\n\treadonly foreignTable: MySqlTable;\n\treadonly foreignColumns: MySqlColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'MySqlForeignKeyBuilder';\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined;\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: MySqlColumn[];\n\t\t\tforeignColumns: MySqlColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as MySqlTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: MySqlTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport type AnyForeignKeyBuilder = ForeignKeyBuilder;\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'MySqlForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(readonly table: MySqlTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[TableName],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[TableName],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends MySqlColumn[],\n> = { [Key in keyof TColumns]: AnyMySqlColumn<{ tableName: TTableName }> };\n\nexport type GetColumnsTable<TColumns extends MySqlColumn | MySqlColumn[]> = (\n\tTColumns extends MySqlColumn ? TColumns\n\t\t: TColumns extends MySqlColumn[] ? TColumns[number]\n\t\t: never\n) extends AnyMySqlColumn<{ tableName: infer TTableName extends string }> ? TTableName\n\t: never;\n\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnyMySqlColumn<{ tableName: TTableName }>, ...AnyMySqlColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tconst { name, columns, foreignColumns } = config;\n\t\treturn {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tforeignColumns,\n\t\t};\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/index.ts",
    "content": "export * from './alias.ts';\nexport * from './checks.ts';\nexport * from './columns/index.ts';\nexport * from './db.ts';\nexport * from './dialect.ts';\nexport * from './foreign-keys.ts';\nexport * from './indexes.ts';\nexport * from './primary-keys.ts';\nexport * from './query-builders/index.ts';\nexport * from './schema.ts';\nexport * from './session.ts';\nexport * from './subquery.ts';\nexport * from './table.ts';\nexport * from './unique-constraint.ts';\nexport * from './utils.ts';\nexport * from './view-common.ts';\nexport * from './view.ts';\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/indexes.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { AnyMySqlColumn, MySqlColumn } from './columns/index.ts';\nimport type { MySqlTable } from './table.ts';\n\ninterface IndexConfig {\n\tname: string;\n\n\tcolumns: IndexColumn[];\n\n\t/**\n\t * If true, the index will be created as `create unique index` instead of `create index`.\n\t */\n\tunique?: boolean;\n\n\t/**\n\t * If set, the index will be created as `create index ... using { 'btree' | 'hash' }`.\n\t */\n\tusing?: 'btree' | 'hash';\n\n\t/**\n\t * If set, the index will be created as `create index ... algorithm { 'default' | 'inplace' | 'copy' }`.\n\t */\n\talgorithm?: 'default' | 'inplace' | 'copy';\n\n\t/**\n\t * If set, adds locks to the index creation.\n\t */\n\tlock?: 'default' | 'none' | 'shared' | 'exclusive';\n}\n\nexport type IndexColumn = MySqlColumn | SQL;\n\nexport class IndexBuilderOn {\n\tstatic readonly [entityKind]: string = 'MySqlIndexBuilderOn';\n\n\tconstructor(private name: string, private unique: boolean) {}\n\n\ton(...columns: [IndexColumn, ...IndexColumn[]]): IndexBuilder {\n\t\treturn new IndexBuilder(this.name, columns, this.unique);\n\t}\n}\n\nexport interface AnyIndexBuilder {\n\tbuild(table: MySqlTable): Index;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface IndexBuilder extends AnyIndexBuilder {}\n\nexport class IndexBuilder implements AnyIndexBuilder {\n\tstatic readonly [entityKind]: string = 'MySqlIndexBuilder';\n\n\t/** @internal */\n\tconfig: IndexConfig;\n\n\tconstructor(name: string, columns: IndexColumn[], unique: boolean) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tunique,\n\t\t};\n\t}\n\n\tusing(using: IndexConfig['using']): this {\n\t\tthis.config.using = using;\n\t\treturn this;\n\t}\n\n\talgorithm(algorithm: IndexConfig['algorithm']): this {\n\t\tthis.config.algorithm = algorithm;\n\t\treturn this;\n\t}\n\n\tlock(lock: IndexConfig['lock']): this {\n\t\tthis.config.lock = lock;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: MySqlTable): Index {\n\t\treturn new Index(this.config, table);\n\t}\n}\n\nexport class Index {\n\tstatic readonly [entityKind]: string = 'MySqlIndex';\n\n\treadonly config: IndexConfig & { table: MySqlTable };\n\n\tconstructor(config: IndexConfig, table: MySqlTable) {\n\t\tthis.config = { ...config, table };\n\t}\n}\n\nexport type GetColumnsTableName<TColumns> = TColumns extends\n\tAnyMySqlColumn<{ tableName: infer TTableName extends string }> | AnyMySqlColumn<\n\t\t{ tableName: infer TTableName extends string }\n\t>[] ? TTableName\n\t: never;\n\nexport function index(name: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(name, false);\n}\n\nexport function uniqueIndex(name: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(name, true);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/primary-keys.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { AnyMySqlColumn, MySqlColumn } from './columns/index.ts';\nimport { MySqlTable } from './table.ts';\n\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumn extends AnyMySqlColumn<{ tableName: TTableName }>,\n\tTColumns extends AnyMySqlColumn<{ tableName: TTableName }>[],\n>(config: { name?: string; columns: [TColumn, ...TColumns] }): PrimaryKeyBuilder;\n/**\n * @deprecated: Please use primaryKey({ columns: [] }) instead of this function\n * @param columns\n */\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumns extends AnyMySqlColumn<{ tableName: TTableName }>[],\n>(...columns: TColumns): PrimaryKeyBuilder;\nexport function primaryKey(...config: any) {\n\tif (config[0].columns) {\n\t\treturn new PrimaryKeyBuilder(config[0].columns, config[0].name);\n\t}\n\treturn new PrimaryKeyBuilder(config);\n}\n\nexport class PrimaryKeyBuilder {\n\tstatic readonly [entityKind]: string = 'MySqlPrimaryKeyBuilder';\n\n\t/** @internal */\n\tcolumns: MySqlColumn[];\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tcolumns: MySqlColumn[],\n\t\tname?: string,\n\t) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\t/** @internal */\n\tbuild(table: MySqlTable): PrimaryKey {\n\t\treturn new PrimaryKey(table, this.columns, this.name);\n\t}\n}\n\nexport class PrimaryKey {\n\tstatic readonly [entityKind]: string = 'MySqlPrimaryKey';\n\n\treadonly columns: MySqlColumn[];\n\treadonly name?: string;\n\n\tconstructor(readonly table: MySqlTable, columns: MySqlColumn[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\tgetName(): string {\n\t\treturn this.name\n\t\t\t?? `${this.table[MySqlTable.Symbol.Name]}_${this.columns.map((column) => column.name).join('_')}_pk`;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/query-builders/count.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { MySqlSession } from '../session.ts';\nimport type { MySqlTable } from '../table.ts';\nimport type { MySqlViewBase } from '../view-base.ts';\n\nexport class MySqlCountBuilder<\n\tTSession extends MySqlSession<any, any, any>,\n> extends SQL<number> implements Promise<number>, SQLWrapper {\n\tprivate sql: SQL<number>;\n\n\tstatic override readonly [entityKind] = 'MySqlCountBuilder';\n\t[Symbol.toStringTag] = 'MySqlCountBuilder';\n\n\tprivate session: TSession;\n\n\tprivate static buildEmbeddedCount(\n\t\tsource: MySqlTable | MySqlViewBase | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`(select count(*) from ${source}${sql.raw(' where ').if(filters)}${filters})`;\n\t}\n\n\tprivate static buildCount(\n\t\tsource: MySqlTable | MySqlViewBase | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`select count(*) as count from ${source}${sql.raw(' where ').if(filters)}${filters}`;\n\t}\n\n\tconstructor(\n\t\treadonly params: {\n\t\t\tsource: MySqlTable | MySqlViewBase | SQL | SQLWrapper;\n\t\t\tfilters?: SQL<unknown>;\n\t\t\tsession: TSession;\n\t\t},\n\t) {\n\t\tsuper(MySqlCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);\n\n\t\tthis.mapWith(Number);\n\n\t\tthis.session = params.session;\n\n\t\tthis.sql = MySqlCountBuilder.buildCount(\n\t\t\tparams.source,\n\t\t\tparams.filters,\n\t\t);\n\t}\n\n\tthen<TResult1 = number, TResult2 = never>(\n\t\tonfulfilled?: ((value: number) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n\t\tonrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn Promise.resolve(this.session.count(this.sql))\n\t\t\t.then(\n\t\t\t\tonfulfilled,\n\t\t\t\tonrejected,\n\t\t\t);\n\t}\n\n\tcatch(\n\t\tonRejected?: ((reason: any) => never | PromiseLike<never>) | null | undefined,\n\t): Promise<number> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<number> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/query-builders/delete.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type {\n\tAnyMySqlQueryResultHKT,\n\tMySqlPreparedQueryConfig,\n\tMySqlQueryResultHKT,\n\tMySqlQueryResultKind,\n\tMySqlSession,\n\tPreparedQueryHKTBase,\n\tPreparedQueryKind,\n} from '~/mysql-core/session.ts';\nimport type { MySqlTable } from '~/mysql-core/table.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { Placeholder, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport type { ValueOrArray } from '~/utils.ts';\nimport type { MySqlColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type { SelectedFieldsOrdered } from './select.types.ts';\n\nexport type MySqlDeleteWithout<\n\tT extends AnyMySqlDeleteBase,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T\n\t: Omit<\n\t\tMySqlDeleteBase<\n\t\t\tT['_']['table'],\n\t\t\tT['_']['queryResult'],\n\t\t\tT['_']['preparedQueryHKT'],\n\t\t\tTDynamic,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>,\n\t\tT['_']['excludedMethods'] | K\n\t>;\n\nexport type MySqlDelete<\n\tTTable extends MySqlTable = MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT = AnyMySqlQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n> = MySqlDeleteBase<TTable, TQueryResult, TPreparedQueryHKT, true, never>;\n\nexport interface MySqlDeleteConfig {\n\twhere?: SQL | undefined;\n\tlimit?: number | Placeholder;\n\torderBy?: (MySqlColumn | SQL | SQL.Aliased)[];\n\ttable: MySqlTable;\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type MySqlDeletePrepare<T extends AnyMySqlDeleteBase> = PreparedQueryKind<\n\tT['_']['preparedQueryHKT'],\n\tMySqlPreparedQueryConfig & {\n\t\texecute: MySqlQueryResultKind<T['_']['queryResult'], never>;\n\t\titerator: never;\n\t},\n\ttrue\n>;\n\ntype MySqlDeleteDynamic<T extends AnyMySqlDeleteBase> = MySqlDelete<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['preparedQueryHKT']\n>;\n\ntype AnyMySqlDeleteBase = MySqlDeleteBase<any, any, any, any, any>;\n\nexport interface MySqlDeleteBase<\n\tTTable extends MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<MySqlQueryResultKind<TQueryResult, never>> {\n\treadonly _: {\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly preparedQueryHKT: TPreparedQueryHKT;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t};\n}\n\nexport class MySqlDeleteBase<\n\tTTable extends MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<MySqlQueryResultKind<TQueryResult, never>> implements SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'MySqlDelete';\n\n\tprivate config: MySqlDeleteConfig;\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: MySqlSession,\n\t\tprivate dialect: MySqlDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, withList };\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will delete only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be deleted.\n\t *\n\t * ```ts\n\t * // Delete all cars with green color\n\t * db.delete(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * db.delete(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Delete all BMW cars with a green color\n\t * db.delete(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Delete all cars with the green or blue color\n\t * db.delete(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): MySqlDeleteWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\torderBy(\n\t\tbuilder: (deleteTable: TTable) => ValueOrArray<MySqlColumn | SQL | SQL.Aliased>,\n\t): MySqlDeleteWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (MySqlColumn | SQL | SQL.Aliased)[]): MySqlDeleteWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(deleteTable: TTable) => ValueOrArray<MySqlColumn | SQL | SQL.Aliased>]\n\t\t\t| (MySqlColumn | SQL | SQL.Aliased)[]\n\t): MySqlDeleteWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as any,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t} else {\n\t\t\tconst orderByArray = columns as (MySqlColumn | SQL | SQL.Aliased)[];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\tlimit(limit: number | Placeholder): MySqlDeleteWithout<this, TDynamic, 'limit'> {\n\t\tthis.config.limit = limit;\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildDeleteQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\tprepare(): MySqlDeletePrepare<this> {\n\t\treturn this.session.prepareQuery(\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\ttype: 'delete',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t},\n\t\t) as MySqlDeletePrepare<this>;\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn this.prepare().execute(placeholderValues);\n\t};\n\n\tprivate createIterator = (): ReturnType<this['prepare']>['iterator'] => {\n\t\tconst self = this;\n\t\treturn async function*(placeholderValues) {\n\t\t\tyield* self.prepare().iterator(placeholderValues);\n\t\t};\n\t};\n\n\titerator = this.createIterator();\n\n\t$dynamic(): MySqlDeleteDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/query-builders/index.ts",
    "content": "export * from './delete.ts';\nexport * from './insert.ts';\nexport * from './query-builder.ts';\nexport * from './select.ts';\nexport * from './select.types.ts';\nexport * from './update.ts';\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/query-builders/insert.ts",
    "content": "import type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type {\n\tAnyMySqlQueryResultHKT,\n\tMySqlPreparedQueryConfig,\n\tMySqlQueryResultHKT,\n\tMySqlQueryResultKind,\n\tMySqlSession,\n\tPreparedQueryHKTBase,\n\tPreparedQueryKind,\n} from '~/mysql-core/session.ts';\nimport type { MySqlTable } from '~/mysql-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { Param, SQL, sql } from '~/sql/sql.ts';\nimport type { InferModelFromColumns } from '~/table.ts';\nimport { Columns, Table } from '~/table.ts';\nimport { haveSameKeys, mapUpdateSet } from '~/utils.ts';\nimport type { AnyMySqlColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport { QueryBuilder } from './query-builder.ts';\nimport type { SelectedFieldsOrdered } from './select.types.ts';\nimport type { MySqlUpdateSetSource } from './update.ts';\n\nexport interface MySqlInsertConfig<TTable extends MySqlTable = MySqlTable> {\n\ttable: TTable;\n\tvalues: Record<string, Param | SQL>[] | MySqlInsertSelectQueryBuilder<TTable> | SQL;\n\tignore: boolean;\n\tonConflict?: SQL;\n\treturning?: SelectedFieldsOrdered;\n\tselect?: boolean;\n}\n\nexport type AnyMySqlInsertConfig = MySqlInsertConfig<MySqlTable>;\n\nexport type MySqlInsertValue<TTable extends MySqlTable> =\n\t& {\n\t\t[Key in keyof TTable['$inferInsert']]: TTable['$inferInsert'][Key] | SQL | Placeholder;\n\t}\n\t& {};\n\nexport type MySqlInsertSelectQueryBuilder<TTable extends MySqlTable> = TypedQueryBuilder<\n\t{ [K in keyof TTable['$inferInsert']]: AnyMySqlColumn | SQL | SQL.Aliased | TTable['$inferInsert'][K] }\n>;\n\nexport class MySqlInsertBuilder<\n\tTTable extends MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n> {\n\tstatic readonly [entityKind]: string = 'MySqlInsertBuilder';\n\n\tprivate shouldIgnore = false;\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: MySqlSession,\n\t\tprivate dialect: MySqlDialect,\n\t) {}\n\n\tignore(): this {\n\t\tthis.shouldIgnore = true;\n\t\treturn this;\n\t}\n\n\tvalues(value: MySqlInsertValue<TTable>): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;\n\tvalues(values: MySqlInsertValue<TTable>[]): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;\n\tvalues(\n\t\tvalues: MySqlInsertValue<TTable> | MySqlInsertValue<TTable>[],\n\t): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\tvalues = Array.isArray(values) ? values : [values];\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('values() must be called with at least one value');\n\t\t}\n\t\tconst mappedValues = values.map((entry) => {\n\t\t\tconst result: Record<string, Param | SQL> = {};\n\t\t\tconst cols = this.table[Table.Symbol.Columns];\n\t\t\tfor (const colKey of Object.keys(entry)) {\n\t\t\t\tconst colValue = entry[colKey as keyof typeof entry];\n\t\t\t\tresult[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);\n\t\t\t}\n\t\t\treturn result;\n\t\t});\n\n\t\treturn new MySqlInsertBase(this.table, mappedValues, this.shouldIgnore, this.session, this.dialect);\n\t}\n\n\tselect(\n\t\tselectQuery: (qb: QueryBuilder) => MySqlInsertSelectQueryBuilder<TTable>,\n\t): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;\n\tselect(selectQuery: (qb: QueryBuilder) => SQL): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;\n\tselect(selectQuery: SQL): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;\n\tselect(selectQuery: MySqlInsertSelectQueryBuilder<TTable>): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;\n\tselect(\n\t\tselectQuery:\n\t\t\t| SQL\n\t\t\t| MySqlInsertSelectQueryBuilder<TTable>\n\t\t\t| ((qb: QueryBuilder) => MySqlInsertSelectQueryBuilder<TTable> | SQL),\n\t): MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\tconst select = typeof selectQuery === 'function' ? selectQuery(new QueryBuilder()) : selectQuery;\n\n\t\tif (\n\t\t\t!is(select, SQL)\n\t\t\t&& !haveSameKeys(this.table[Columns], select._.selectedFields)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t'Insert select error: selected fields are not the same or are in a different order compared to the table definition',\n\t\t\t);\n\t\t}\n\n\t\treturn new MySqlInsertBase(this.table, select, this.shouldIgnore, this.session, this.dialect, true);\n\t}\n}\n\nexport type MySqlInsertWithout<T extends AnyMySqlInsert, TDynamic extends boolean, K extends keyof T & string> =\n\tTDynamic extends true ? T\n\t\t: Omit<\n\t\t\tMySqlInsertBase<\n\t\t\t\tT['_']['table'],\n\t\t\t\tT['_']['queryResult'],\n\t\t\t\tT['_']['preparedQueryHKT'],\n\t\t\t\tT['_']['returning'],\n\t\t\t\tTDynamic,\n\t\t\t\tT['_']['excludedMethods'] | '$returning'\n\t\t\t>,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>;\n\nexport type MySqlInsertDynamic<T extends AnyMySqlInsert> = MySqlInsert<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['preparedQueryHKT'],\n\tT['_']['returning']\n>;\n\nexport type MySqlInsertPrepare<\n\tT extends AnyMySqlInsert,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n> = PreparedQueryKind<\n\tT['_']['preparedQueryHKT'],\n\tMySqlPreparedQueryConfig & {\n\t\texecute: TReturning extends undefined ? MySqlQueryResultKind<T['_']['queryResult'], never> : TReturning[];\n\t\titerator: never;\n\t},\n\ttrue\n>;\n\nexport type MySqlInsertOnDuplicateKeyUpdateConfig<T extends AnyMySqlInsert> = {\n\tset: MySqlUpdateSetSource<T['_']['table']>;\n};\n\nexport type MySqlInsert<\n\tTTable extends MySqlTable = MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT = AnyMySqlQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = MySqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT, TReturning, true, never>;\n\nexport type MySqlInsertReturning<\n\tT extends AnyMySqlInsert,\n\tTDynamic extends boolean,\n> = MySqlInsertBase<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['preparedQueryHKT'],\n\tInferModelFromColumns<GetPrimarySerialOrDefaultKeys<T['_']['table']['_']['columns']>>,\n\tTDynamic,\n\tT['_']['excludedMethods'] | '$returning'\n>;\n\nexport type AnyMySqlInsert = MySqlInsertBase<any, any, any, any, any, any>;\n\nexport interface MySqlInsertBase<\n\tTTable extends MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tQueryPromise<TReturning extends undefined ? MySqlQueryResultKind<TQueryResult, never> : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? MySqlQueryResultKind<TQueryResult, never> : TReturning[], 'mysql'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\treadonly dialect: 'mysql';\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly preparedQueryHKT: TPreparedQueryHKT;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly returning: TReturning;\n\t\treadonly result: TReturning extends undefined ? MySqlQueryResultKind<TQueryResult, never> : TReturning[];\n\t};\n}\n\nexport type PrimaryKeyKeys<T extends Record<string, AnyMySqlColumn>> = {\n\t[K in keyof T]: T[K]['_']['isPrimaryKey'] extends true ? T[K]['_']['isAutoincrement'] extends true ? K\n\t\t: T[K]['_']['hasRuntimeDefault'] extends true ? T[K]['_']['isPrimaryKey'] extends true ? K : never\n\t\t: never\n\t\t: T[K]['_']['hasRuntimeDefault'] extends true ? T[K]['_']['isPrimaryKey'] extends true ? K : never\n\t\t: never;\n}[keyof T];\n\nexport type GetPrimarySerialOrDefaultKeys<T extends Record<string, AnyMySqlColumn>> = {\n\t[K in PrimaryKeyKeys<T>]: T[K];\n};\n\nexport class MySqlInsertBase<\n\tTTable extends MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? MySqlQueryResultKind<TQueryResult, never> : TReturning[]>\n\timplements\n\t\tRunnableQuery<TReturning extends undefined ? MySqlQueryResultKind<TQueryResult, never> : TReturning[], 'mysql'>,\n\t\tSQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'MySqlInsert';\n\n\tdeclare protected $table: TTable;\n\n\tprivate config: MySqlInsertConfig<TTable>;\n\tprotected cacheConfig?: WithCacheConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tvalues: MySqlInsertConfig['values'],\n\t\tignore: boolean,\n\t\tprivate session: MySqlSession,\n\t\tprivate dialect: MySqlDialect,\n\t\tselect?: boolean,\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, values: values as any, select, ignore };\n\t}\n\n\t/**\n\t * Adds an `on duplicate key update` clause to the query.\n\t *\n\t * Calling this method will update the row if any unique index conflicts. MySQL will automatically determine the conflict target based on the primary key and unique indexes.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#on-duplicate-key-update}\n\t *\n\t * @param config The `set` clause\n\t *\n\t * @example\n\t * ```ts\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW'})\n\t *   .onDuplicateKeyUpdate({ set: { brand: 'Porsche' }});\n\t * ```\n\t *\n\t * While MySQL does not directly support doing nothing on conflict, you can perform a no-op by setting any column's value to itself and achieve the same effect:\n\t *\n\t * ```ts\n\t * import { sql } from 'drizzle-orm';\n\t *\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onDuplicateKeyUpdate({ set: { id: sql`id` } });\n\t * ```\n\t */\n\tonDuplicateKeyUpdate(\n\t\tconfig: MySqlInsertOnDuplicateKeyUpdateConfig<this>,\n\t): MySqlInsertWithout<this, TDynamic, 'onDuplicateKeyUpdate'> {\n\t\tconst setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));\n\t\tthis.config.onConflict = sql`update ${setSql}`;\n\t\treturn this as any;\n\t}\n\n\t$returningId(): MySqlInsertWithout<\n\t\tMySqlInsertReturning<this, TDynamic>,\n\t\tTDynamic,\n\t\t'$returningId'\n\t> {\n\t\tconst returning: SelectedFieldsOrdered = [];\n\t\tfor (const [key, value] of Object.entries(this.config.table[Table.Symbol.Columns])) {\n\t\t\tif (value.primary) {\n\t\t\t\treturning.push({ field: value, path: [key] });\n\t\t\t}\n\t\t}\n\t\tthis.config.returning = returning;\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildInsertQuery(this.config).sql;\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\tprepare(): MySqlInsertPrepare<this, TReturning> {\n\t\tconst { sql, generatedIds } = this.dialect.buildInsertQuery(this.config);\n\t\treturn this.session.prepareQuery(\n\t\t\tthis.dialect.sqlToQuery(sql),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tgeneratedIds,\n\t\t\tthis.config.returning,\n\t\t\t{\n\t\t\t\ttype: 'insert',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t},\n\t\t\tthis.cacheConfig,\n\t\t) as MySqlInsertPrepare<this, TReturning>;\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn this.prepare().execute(placeholderValues);\n\t};\n\n\tprivate createIterator = (): ReturnType<this['prepare']>['iterator'] => {\n\t\tconst self = this;\n\t\treturn async function*(placeholderValues) {\n\t\t\tyield* self.prepare().iterator(placeholderValues);\n\t\t};\n\t};\n\n\titerator = this.createIterator();\n\n\t$dynamic(): MySqlInsertDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/query-builders/query-builder.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\nimport type { MySqlDialectConfig } from '~/mysql-core/dialect.ts';\nimport { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { WithBuilder } from '~/mysql-core/subquery.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport { MySqlSelectBuilder } from './select.ts';\nimport type { SelectedFields } from './select.types.ts';\n\nexport class QueryBuilder {\n\tstatic readonly [entityKind]: string = 'MySqlQueryBuilder';\n\n\tprivate dialect: MySqlDialect | undefined;\n\tprivate dialectConfig: MySqlDialectConfig | undefined;\n\n\tconstructor(dialect?: MySqlDialect | MySqlDialectConfig) {\n\t\tthis.dialect = is(dialect, MySqlDialect) ? dialect : undefined;\n\t\tthis.dialectConfig = is(dialect, MySqlDialect) ? undefined : dialect;\n\t}\n\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst queryBuilder = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(queryBuilder);\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t) as any;\n\t\t};\n\t\treturn { as };\n\t};\n\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\tfunction select(): MySqlSelectBuilder<undefined, never, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): MySqlSelectBuilder<TSelection, never, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): MySqlSelectBuilder<TSelection | undefined, never, 'qb'> {\n\t\t\treturn new MySqlSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\tfunction selectDistinct(): MySqlSelectBuilder<undefined, never, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): MySqlSelectBuilder<TSelection, never, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): MySqlSelectBuilder<TSelection | undefined, never, 'qb'> {\n\t\t\treturn new MySqlSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\treturn { select, selectDistinct };\n\t}\n\n\tselect(): MySqlSelectBuilder<undefined, never, 'qb'>;\n\tselect<TSelection extends SelectedFields>(fields: TSelection): MySqlSelectBuilder<TSelection, never, 'qb'>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): MySqlSelectBuilder<TSelection | undefined, never, 'qb'> {\n\t\treturn new MySqlSelectBuilder({ fields: fields ?? undefined, session: undefined, dialect: this.getDialect() });\n\t}\n\n\tselectDistinct(): MySqlSelectBuilder<undefined, never, 'qb'>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): MySqlSelectBuilder<TSelection, never, 'qb'>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): MySqlSelectBuilder<TSelection | undefined, never, 'qb'> {\n\t\treturn new MySqlSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t// Lazy load dialect to avoid circular dependency\n\tprivate getDialect() {\n\t\tif (!this.dialect) {\n\t\t\tthis.dialect = new MySqlDialect(this.dialectConfig);\n\t\t}\n\n\t\treturn this.dialect;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/query-builders/query.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport {\n\ttype BuildQueryResult,\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tmapRelationalRow,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { Query, QueryWithTypings, SQL } from '~/sql/sql.ts';\nimport type { KnownKeysOnly } from '~/utils.ts';\nimport type { MySqlDialect } from '../dialect.ts';\nimport type {\n\tMode,\n\tMySqlPreparedQueryConfig,\n\tMySqlSession,\n\tPreparedQueryHKTBase,\n\tPreparedQueryKind,\n} from '../session.ts';\nimport type { MySqlTable } from '../table.ts';\n\nexport class RelationalQueryBuilder<\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTSchema extends TablesRelationalConfig,\n\tTFields extends TableRelationalConfig,\n> {\n\tstatic readonly [entityKind]: string = 'MySqlRelationalQueryBuilder';\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: TSchema,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\tprivate table: MySqlTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: MySqlDialect,\n\t\tprivate session: MySqlSession,\n\t\tprivate mode: Mode,\n\t) {}\n\n\tfindMany<TConfig extends DBQueryConfig<'many', true, TSchema, TFields>>(\n\t\tconfig?: KnownKeysOnly<TConfig, DBQueryConfig<'many', true, TSchema, TFields>>,\n\t): MySqlRelationalQuery<TPreparedQueryHKT, BuildQueryResult<TSchema, TFields, TConfig>[]> {\n\t\treturn new MySqlRelationalQuery(\n\t\t\tthis.fullSchema,\n\t\t\tthis.schema,\n\t\t\tthis.tableNamesMap,\n\t\t\tthis.table,\n\t\t\tthis.tableConfig,\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tconfig ? (config as DBQueryConfig<'many', true>) : {},\n\t\t\t'many',\n\t\t\tthis.mode,\n\t\t);\n\t}\n\n\tfindFirst<TSelection extends Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>(\n\t\tconfig?: KnownKeysOnly<TSelection, Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>,\n\t): MySqlRelationalQuery<TPreparedQueryHKT, BuildQueryResult<TSchema, TFields, TSelection> | undefined> {\n\t\treturn new MySqlRelationalQuery(\n\t\t\tthis.fullSchema,\n\t\t\tthis.schema,\n\t\t\tthis.tableNamesMap,\n\t\t\tthis.table,\n\t\t\tthis.tableConfig,\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tconfig ? { ...(config as DBQueryConfig<'many', true> | undefined), limit: 1 } : { limit: 1 },\n\t\t\t'first',\n\t\t\tthis.mode,\n\t\t);\n\t}\n}\n\nexport class MySqlRelationalQuery<\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTResult,\n> extends QueryPromise<TResult> {\n\tstatic override readonly [entityKind]: string = 'MySqlRelationalQuery';\n\n\tdeclare protected $brand: 'MySqlRelationalQuery';\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: TablesRelationalConfig,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\tprivate table: MySqlTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: MySqlDialect,\n\t\tprivate session: MySqlSession,\n\t\tprivate config: DBQueryConfig<'many', true> | true,\n\t\tprivate queryMode: 'many' | 'first',\n\t\tprivate mode?: Mode,\n\t) {\n\t\tsuper();\n\t}\n\n\tprepare() {\n\t\tconst { query, builtQuery } = this._toSQL();\n\t\treturn this.session.prepareQuery(\n\t\t\tbuiltQuery,\n\t\t\tundefined,\n\t\t\t(rawRows) => {\n\t\t\t\tconst rows = rawRows.map((row) => mapRelationalRow(this.schema, this.tableConfig, row, query.selection));\n\t\t\t\tif (this.queryMode === 'first') {\n\t\t\t\t\treturn rows[0] as TResult;\n\t\t\t\t}\n\t\t\t\treturn rows as TResult;\n\t\t\t},\n\t\t) as PreparedQueryKind<TPreparedQueryHKT, MySqlPreparedQueryConfig & { execute: TResult }, true>;\n\t}\n\n\tprivate _getQuery() {\n\t\tconst query = this.mode === 'planetscale'\n\t\t\t? this.dialect.buildRelationalQueryWithoutLateralSubqueries({\n\t\t\t\tfullSchema: this.fullSchema,\n\t\t\t\tschema: this.schema,\n\t\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\t\ttable: this.table,\n\t\t\t\ttableConfig: this.tableConfig,\n\t\t\t\tqueryConfig: this.config,\n\t\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t\t})\n\t\t\t: this.dialect.buildRelationalQuery({\n\t\t\t\tfullSchema: this.fullSchema,\n\t\t\t\tschema: this.schema,\n\t\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\t\ttable: this.table,\n\t\t\t\ttableConfig: this.tableConfig,\n\t\t\t\tqueryConfig: this.config,\n\t\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t\t});\n\t\treturn query;\n\t}\n\n\tprivate _toSQL(): { query: BuildRelationalQueryResult; builtQuery: QueryWithTypings } {\n\t\tconst query = this._getQuery();\n\n\t\tconst builtQuery = this.dialect.sqlToQuery(query.sql as SQL);\n\n\t\treturn { builtQuery, query };\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this._getQuery().sql as SQL;\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this._toSQL().builtQuery;\n\t}\n\n\toverride execute(): Promise<TResult> {\n\t\treturn this.prepare().execute();\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/query-builders/select.ts",
    "content": "import type { CacheConfig, WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { MySqlColumn } from '~/mysql-core/columns/index.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { MySqlPreparedQueryConfig, MySqlSession, PreparedQueryHKTBase } from '~/mysql-core/session.ts';\nimport type { SubqueryWithSelection } from '~/mysql-core/subquery.ts';\nimport { MySqlTable } from '~/mysql-core/table.ts';\nimport { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tGetSelectTableSelection,\n\tJoinNullability,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, Placeholder, Query } from '~/sql/sql.ts';\nimport { SQL, View } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport type { ValueOrArray } from '~/utils.ts';\nimport { applyMixins, getTableColumns, getTableLikeName, haveSameKeys, orderSelectedFields } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { IndexBuilder } from '../indexes.ts';\nimport { convertIndexToString, extractUsedTable, toArray } from '../utils.ts';\nimport { MySqlViewBase } from '../view-base.ts';\nimport type {\n\tAnyMySqlSelect,\n\tCreateMySqlSelectFromBuilderMode,\n\tGetMySqlSetOperators,\n\tLockConfig,\n\tLockStrength,\n\tMySqlCreateSetOperatorFn,\n\tMySqlCrossJoinFn,\n\tMySqlJoinFn,\n\tMySqlJoinType,\n\tMySqlSelectConfig,\n\tMySqlSelectDynamic,\n\tMySqlSelectHKT,\n\tMySqlSelectHKTBase,\n\tMySqlSelectPrepare,\n\tMySqlSelectWithout,\n\tMySqlSetOperatorExcludedMethods,\n\tMySqlSetOperatorWithResult,\n\tSelectedFields,\n\tSetOperatorRightSelect,\n} from './select.types.ts';\n\nexport type IndexForHint = IndexBuilder | string;\n\nexport type IndexConfig = {\n\tuseIndex?: IndexForHint | IndexForHint[];\n\tforceIndex?: IndexForHint | IndexForHint[];\n\tignoreIndex?: IndexForHint | IndexForHint[];\n};\n\nexport class MySqlSelectBuilder<\n\tTSelection extends SelectedFields | undefined,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTBuilderMode extends 'db' | 'qb' = 'db',\n> {\n\tstatic readonly [entityKind]: string = 'MySqlSelectBuilder';\n\n\tprivate fields: TSelection;\n\tprivate session: MySqlSession | undefined;\n\tprivate dialect: MySqlDialect;\n\tprivate withList: Subquery[] = [];\n\tprivate distinct: boolean | undefined;\n\n\tconstructor(\n\t\tconfig: {\n\t\t\tfields: TSelection;\n\t\t\tsession: MySqlSession | undefined;\n\t\t\tdialect: MySqlDialect;\n\t\t\twithList?: Subquery[];\n\t\t\tdistinct?: boolean;\n\t\t},\n\t) {\n\t\tthis.fields = config.fields;\n\t\tthis.session = config.session;\n\t\tthis.dialect = config.dialect;\n\t\tif (config.withList) {\n\t\t\tthis.withList = config.withList;\n\t\t}\n\t\tthis.distinct = config.distinct;\n\t}\n\n\tfrom<TFrom extends MySqlTable | Subquery | MySqlViewBase | SQL>(\n\t\tsource: TFrom,\n\t\tonIndex?: TFrom extends MySqlTable ? IndexConfig\n\t\t\t: 'Index hint configuration is allowed only for MySqlTable and not for subqueries or views',\n\t): CreateMySqlSelectFromBuilderMode<\n\t\tTBuilderMode,\n\t\tGetSelectTableName<TFrom>,\n\t\tTSelection extends undefined ? GetSelectTableSelection<TFrom> : TSelection,\n\t\tTSelection extends undefined ? 'single' : 'partial',\n\t\tTPreparedQueryHKT\n\t> {\n\t\tconst isPartialSelect = !!this.fields;\n\n\t\tlet fields: SelectedFields;\n\t\tif (this.fields) {\n\t\t\tfields = this.fields;\n\t\t} else if (is(source, Subquery)) {\n\t\t\t// This is required to use the proxy handler to get the correct field values from the subquery\n\t\t\tfields = Object.fromEntries(\n\t\t\t\tObject.keys(source._.selectedFields).map((\n\t\t\t\t\tkey,\n\t\t\t\t) => [key, source[key as unknown as keyof typeof source] as unknown as SelectedFields[string]]),\n\t\t\t);\n\t\t} else if (is(source, MySqlViewBase)) {\n\t\t\tfields = source[ViewBaseConfig].selectedFields as SelectedFields;\n\t\t} else if (is(source, SQL)) {\n\t\t\tfields = {};\n\t\t} else {\n\t\t\tfields = getTableColumns<MySqlTable>(source);\n\t\t}\n\n\t\tlet useIndex: string[] = [];\n\t\tlet forceIndex: string[] = [];\n\t\tlet ignoreIndex: string[] = [];\n\t\tif (is(source, MySqlTable) && onIndex && typeof onIndex !== 'string') {\n\t\t\tif (onIndex.useIndex) {\n\t\t\t\tuseIndex = convertIndexToString(toArray(onIndex.useIndex));\n\t\t\t}\n\t\t\tif (onIndex.forceIndex) {\n\t\t\t\tforceIndex = convertIndexToString(toArray(onIndex.forceIndex));\n\t\t\t}\n\t\t\tif (onIndex.ignoreIndex) {\n\t\t\t\tignoreIndex = convertIndexToString(toArray(onIndex.ignoreIndex));\n\t\t\t}\n\t\t}\n\n\t\treturn new MySqlSelectBase(\n\t\t\t{\n\t\t\t\ttable: source,\n\t\t\t\tfields,\n\t\t\t\tisPartialSelect,\n\t\t\t\tsession: this.session,\n\t\t\t\tdialect: this.dialect,\n\t\t\t\twithList: this.withList,\n\t\t\t\tdistinct: this.distinct,\n\t\t\t\tuseIndex,\n\t\t\t\tforceIndex,\n\t\t\t\tignoreIndex,\n\t\t\t},\n\t\t) as any;\n\t}\n}\n\nexport abstract class MySqlSelectQueryBuilderBase<\n\tTHKT extends MySqlSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends TypedQueryBuilder<TSelectedFields, TResult> {\n\tstatic override readonly [entityKind]: string = 'MySqlSelectQueryBuilder';\n\n\toverride readonly _: {\n\t\treadonly hkt: THKT;\n\t\treadonly tableName: TTableName;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly preparedQueryHKT: TPreparedQueryHKT;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t\treadonly config: MySqlSelectConfig;\n\t};\n\n\tprotected config: MySqlSelectConfig;\n\tprotected joinsNotNullableMap: Record<string, boolean>;\n\tprivate tableName: string | undefined;\n\tprivate isPartialSelect: boolean;\n\t/** @internal */\n\treadonly session: MySqlSession | undefined;\n\tprotected dialect: MySqlDialect;\n\tprotected cacheConfig?: WithCacheConfig = undefined;\n\tprotected usedTables: Set<string> = new Set();\n\n\tconstructor(\n\t\t{ table, fields, isPartialSelect, session, dialect, withList, distinct, useIndex, forceIndex, ignoreIndex }: {\n\t\t\ttable: MySqlSelectConfig['table'];\n\t\t\tfields: MySqlSelectConfig['fields'];\n\t\t\tisPartialSelect: boolean;\n\t\t\tsession: MySqlSession | undefined;\n\t\t\tdialect: MySqlDialect;\n\t\t\twithList: Subquery[];\n\t\t\tdistinct: boolean | undefined;\n\t\t\tuseIndex?: string[];\n\t\t\tforceIndex?: string[];\n\t\t\tignoreIndex?: string[];\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis.config = {\n\t\t\twithList,\n\t\t\ttable,\n\t\t\tfields: { ...fields },\n\t\t\tdistinct,\n\t\t\tsetOperators: [],\n\t\t\tuseIndex,\n\t\t\tforceIndex,\n\t\t\tignoreIndex,\n\t\t};\n\t\tthis.isPartialSelect = isPartialSelect;\n\t\tthis.session = session;\n\t\tthis.dialect = dialect;\n\t\tthis._ = {\n\t\t\tselectedFields: fields as TSelectedFields,\n\t\t\tconfig: this.config,\n\t\t} as this['_'];\n\t\tthis.tableName = getTableLikeName(table);\n\t\tthis.joinsNotNullableMap = typeof this.tableName === 'string' ? { [this.tableName]: true } : {};\n\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\t}\n\n\t/** @internal */\n\tgetUsedTables() {\n\t\treturn [...this.usedTables];\n\t}\n\n\tprivate createJoin<\n\t\tTJoinType extends MySqlJoinType,\n\t\tTIsLateral extends (TJoinType extends 'full' | 'right' ? false : boolean),\n\t>(\n\t\tjoinType: TJoinType,\n\t\tlateral: TIsLateral,\n\t): 'cross' extends TJoinType ? MySqlCrossJoinFn<this, TDynamic, TIsLateral>\n\t\t: MySqlJoinFn<this, TDynamic, TJoinType, TIsLateral>\n\t{\n\t\treturn <\n\t\t\tTJoinedTable extends MySqlTable | Subquery | MySqlViewBase | SQL,\n\t\t>(\n\t\t\ttable: MySqlTable | Subquery | MySqlViewBase | SQL,\n\t\t\ta?:\n\t\t\t\t| ((aliases: TSelection) => SQL | undefined)\n\t\t\t\t| SQL\n\t\t\t\t| undefined\n\t\t\t\t| (TJoinedTable extends MySqlTable ? IndexConfig\n\t\t\t\t\t: 'Index hint configuration is allowed only for MySqlTable and not for subqueries or views'),\n\t\t\tb?: TJoinedTable extends MySqlTable ? IndexConfig\n\t\t\t\t: 'Index hint configuration is allowed only for MySqlTable and not for subqueries or views',\n\t\t) => {\n\t\t\tconst isCrossJoin = joinType === 'cross';\n\t\t\tlet on = (isCrossJoin ? undefined : a) as (\n\t\t\t\t| ((aliases: TSelection) => SQL | undefined)\n\t\t\t\t| SQL\n\t\t\t\t| undefined\n\t\t\t);\n\t\t\tconst onIndex = (isCrossJoin ? a : b) as TJoinedTable extends MySqlTable ? IndexConfig\n\t\t\t\t: 'Index hint configuration is allowed only for MySqlTable and not for subqueries or views';\n\n\t\t\tconst baseTableName = this.tableName;\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\t// store all tables used in a query\n\t\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins?.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (!this.isPartialSelect) {\n\t\t\t\t// If this is the first join and this is not a partial select and we're not selecting from raw SQL, \"move\" the fields from the main table to the nested object\n\t\t\t\tif (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === 'string') {\n\t\t\t\t\tthis.config.fields = {\n\t\t\t\t\t\t[baseTableName]: this.config.fields,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (typeof tableName === 'string' && !is(table, SQL)) {\n\t\t\t\t\tconst selection = is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t: is(table, View)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields\n\t\t\t\t\t\t: table[Table.Symbol.Columns];\n\t\t\t\t\tthis.config.fields[tableName] = selection;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.fields,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as TSelection,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (!this.config.joins) {\n\t\t\t\tthis.config.joins = [];\n\t\t\t}\n\n\t\t\tlet useIndex: string[] = [];\n\t\t\tlet forceIndex: string[] = [];\n\t\t\tlet ignoreIndex: string[] = [];\n\t\t\tif (is(table, MySqlTable) && onIndex && typeof onIndex !== 'string') {\n\t\t\t\tif (onIndex.useIndex) {\n\t\t\t\t\tuseIndex = convertIndexToString(toArray(onIndex.useIndex));\n\t\t\t\t}\n\t\t\t\tif (onIndex.forceIndex) {\n\t\t\t\t\tforceIndex = convertIndexToString(toArray(onIndex.forceIndex));\n\t\t\t\t}\n\t\t\t\tif (onIndex.ignoreIndex) {\n\t\t\t\t\tignoreIndex = convertIndexToString(toArray(onIndex.ignoreIndex));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName, useIndex, forceIndex, ignoreIndex, lateral });\n\n\t\t\tif (typeof tableName === 'string') {\n\t\t\t\tswitch (joinType) {\n\t\t\t\t\tcase 'left': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'right': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'cross':\n\t\t\t\t\tcase 'inner': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Executes a `left join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t * @param onIndex index hint.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet | null; }[] = await db.select()\n\t *   .from(users)\n\t *   .leftJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number | null; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .leftJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId with use index hint\n\t * const usersIdsAndPetIds: { userId: number; petId: number | null; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .leftJoin(pets, eq(users.id, pets.ownerId), {\n\t *     useIndex: ['pets_owner_id_index']\n\t * })\n\t * ```\n\t */\n\tleftJoin = this.createJoin('left', false);\n\n\t/**\n\t * Executes a `left join lateral` operation by adding subquery to the current query.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join-lateral}\n\t *\n\t * @param table the subquery to join.\n\t * @param on the `on` clause.\n\t */\n\tleftJoinLateral = this.createJoin('left', true);\n\n\t/**\n\t * Executes a `right join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the joined table with the corresponding row from the main table, if a match is found. If no matching row exists, it sets all columns of the main table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#right-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t * @param onIndex index hint.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .rightJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .rightJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId with use index hint\n\t * const usersIdsAndPetIds: { userId: number; petId: number | null; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .leftJoin(pets, eq(users.id, pets.ownerId), {\n\t *     useIndex: ['pets_owner_id_index']\n\t * })\n\t * ```\n\t */\n\trightJoin = this.createJoin('right', false);\n\n\t/**\n\t * Executes an `inner join` operation, creating a new table by combining rows from two tables that have matching values.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t * @param onIndex index hint.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .innerJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .innerJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId with use index hint\n\t * const usersIdsAndPetIds: { userId: number; petId: number | null; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .leftJoin(pets, eq(users.id, pets.ownerId), {\n\t *     useIndex: ['pets_owner_id_index']\n\t * })\n\t * ```\n\t */\n\tinnerJoin = this.createJoin('inner', false);\n\n\t/**\n\t * Executes an `inner join lateral` operation, creating a new table by combining rows from two queries that have matching values.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join-lateral}\n\t *\n\t * @param table the subquery to join.\n\t * @param on the `on` clause.\n\t */\n\tinnerJoinLateral = this.createJoin('inner', true);\n\n\t/**\n\t * Executes a `cross join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging all rows from each table.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join}\n\t *\n\t * @param table the table to join.\n\t * @param onIndex index hint.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users, each user with every pet\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .crossJoin(pets)\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .crossJoin(pets)\n\t *\n\t * // Select userId and petId with use index hint\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .crossJoin(pets, {\n\t *     useIndex: ['pets_owner_id_index']\n\t * })\n\t * ```\n\t */\n\tcrossJoin = this.createJoin('cross', false);\n\n\t/**\n\t * Executes a `cross join lateral` operation by combining rows from two queries into a new table.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method retrieves all rows from both main and joined queries, merging all rows from each query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join-lateral}\n\t *\n\t * @param table the query to join.\n\t */\n\tcrossJoinLateral = this.createJoin('cross', true);\n\n\tprivate createSetOperator(\n\t\ttype: SetOperator,\n\t\tisAll: boolean,\n\t): <TValue extends MySqlSetOperatorWithResult<TResult>>(\n\t\trightSelection:\n\t\t\t| ((setOperators: GetMySqlSetOperators) => SetOperatorRightSelect<TValue, TResult>)\n\t\t\t| SetOperatorRightSelect<TValue, TResult>,\n\t) => MySqlSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tMySqlSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\treturn (rightSelection) => {\n\t\t\tconst rightSelect = (typeof rightSelection === 'function'\n\t\t\t\t? rightSelection(getMySqlSetOperators())\n\t\t\t\t: rightSelection) as TypedQueryBuilder<\n\t\t\t\t\tany,\n\t\t\t\t\tTResult\n\t\t\t\t>;\n\n\t\t\tif (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.setOperators.push({ type, isAll, rightSelect });\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Adds `union` set operator to the query.\n\t *\n\t * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all unique names from customers and users tables\n\t * await db.select({ name: users.name })\n\t *   .from(users)\n\t *   .union(\n\t *     db.select({ name: customers.name }).from(customers)\n\t *   );\n\t * // or\n\t * import { union } from 'drizzle-orm/mysql-core'\n\t *\n\t * await union(\n\t *   db.select({ name: users.name }).from(users),\n\t *   db.select({ name: customers.name }).from(customers)\n\t * );\n\t * ```\n\t */\n\tunion = this.createSetOperator('union', false);\n\n\t/**\n\t * Adds `union all` set operator to the query.\n\t *\n\t * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all transaction ids from both online and in-store sales\n\t * await db.select({ transaction: onlineSales.transactionId })\n\t *   .from(onlineSales)\n\t *   .unionAll(\n\t *     db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t *   );\n\t * // or\n\t * import { unionAll } from 'drizzle-orm/mysql-core'\n\t *\n\t * await unionAll(\n\t *   db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n\t *   db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t * );\n\t * ```\n\t */\n\tunionAll = this.createSetOperator('union', true);\n\n\t/**\n\t * Adds `intersect` set operator to the query.\n\t *\n\t * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select course names that are offered in both departments A and B\n\t * await db.select({ courseName: depA.courseName })\n\t *   .from(depA)\n\t *   .intersect(\n\t *     db.select({ courseName: depB.courseName }).from(depB)\n\t *   );\n\t * // or\n\t * import { intersect } from 'drizzle-orm/mysql-core'\n\t *\n\t * await intersect(\n\t *   db.select({ courseName: depA.courseName }).from(depA),\n\t *   db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\tintersect = this.createSetOperator('intersect', false);\n\n\t/**\n\t * Adds `intersect all` set operator to the query.\n\t *\n\t * Calling this method will retain only the rows that are present in both result sets including all duplicates.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all products and quantities that are ordered by both regular and VIP customers\n\t * await db.select({\n\t *   productId: regularCustomerOrders.productId,\n\t *   quantityOrdered: regularCustomerOrders.quantityOrdered\n\t * })\n\t * .from(regularCustomerOrders)\n\t * .intersectAll(\n\t *   db.select({\n\t *     productId: vipCustomerOrders.productId,\n\t *     quantityOrdered: vipCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(vipCustomerOrders)\n\t * );\n\t * // or\n\t * import { intersectAll } from 'drizzle-orm/mysql-core'\n\t *\n\t * await intersectAll(\n\t *   db.select({\n\t *     productId: regularCustomerOrders.productId,\n\t *     quantityOrdered: regularCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(regularCustomerOrders),\n\t *   db.select({\n\t *     productId: vipCustomerOrders.productId,\n\t *     quantityOrdered: vipCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(vipCustomerOrders)\n\t * );\n\t * ```\n\t */\n\tintersectAll = this.createSetOperator('intersect', true);\n\n\t/**\n\t * Adds `except` set operator to the query.\n\t *\n\t * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all courses offered in department A but not in department B\n\t * await db.select({ courseName: depA.courseName })\n\t *   .from(depA)\n\t *   .except(\n\t *     db.select({ courseName: depB.courseName }).from(depB)\n\t *   );\n\t * // or\n\t * import { except } from 'drizzle-orm/mysql-core'\n\t *\n\t * await except(\n\t *   db.select({ courseName: depA.courseName }).from(depA),\n\t *   db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\texcept = this.createSetOperator('except', false);\n\n\t/**\n\t * Adds `except all` set operator to the query.\n\t *\n\t * Calling this method will retrieve all rows from the left query, except for the rows that are present in the result set of the right query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#except-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all products that are ordered by regular customers but not by VIP customers\n\t * await db.select({\n\t *   productId: regularCustomerOrders.productId,\n\t *   quantityOrdered: regularCustomerOrders.quantityOrdered,\n\t * })\n\t * .from(regularCustomerOrders)\n\t * .exceptAll(\n\t *   db.select({\n\t *     productId: vipCustomerOrders.productId,\n\t *     quantityOrdered: vipCustomerOrders.quantityOrdered,\n\t *   })\n\t *   .from(vipCustomerOrders)\n\t * );\n\t * // or\n\t * import { exceptAll } from 'drizzle-orm/mysql-core'\n\t *\n\t * await exceptAll(\n\t *   db.select({\n\t *     productId: regularCustomerOrders.productId,\n\t *     quantityOrdered: regularCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(regularCustomerOrders),\n\t *   db.select({\n\t *     productId: vipCustomerOrders.productId,\n\t *     quantityOrdered: vipCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(vipCustomerOrders)\n\t * );\n\t * ```\n\t */\n\texceptAll = this.createSetOperator('except', true);\n\n\t/** @internal */\n\taddSetOperators(setOperators: MySqlSelectConfig['setOperators']): MySqlSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tMySqlSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\tthis.config.setOperators.push(...setOperators);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#filtering}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be selected.\n\t *\n\t * ```ts\n\t * // Select all cars with green color\n\t * await db.select().from(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.select().from(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Select all BMW cars with a green color\n\t * await db.select().from(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Select all cars with the green or blue color\n\t * await db.select().from(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(\n\t\twhere: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): MySqlSelectWithout<this, TDynamic, 'where'> {\n\t\tif (typeof where === 'function') {\n\t\t\twhere = where(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `having` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition. It is typically used with aggregate functions to filter the aggregated data based on a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @param having the `having` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all brands with more than one car\n\t * await db.select({\n\t * \tbrand: cars.brand,\n\t * \tcount: sql<number>`cast(count(${cars.id}) as int)`,\n\t * })\n\t *   .from(cars)\n\t *   .groupBy(cars.brand)\n\t *   .having(({ count }) => gt(count, 1));\n\t * ```\n\t */\n\thaving(\n\t\thaving: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): MySqlSelectWithout<this, TDynamic, 'having'> {\n\t\tif (typeof having === 'function') {\n\t\t\thaving = having(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.having = having;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `group by` clause to the query.\n\t *\n\t * Calling this method will group rows that have the same values into summary rows, often used for aggregation purposes.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Group and count people by their last names\n\t * await db.select({\n\t *    lastName: people.lastName,\n\t *    count: sql<number>`cast(count(*) as int)`\n\t * })\n\t *   .from(people)\n\t *   .groupBy(people.lastName);\n\t * ```\n\t */\n\tgroupBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<MySqlColumn | SQL | SQL.Aliased>,\n\t): MySqlSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(...columns: (MySqlColumn | SQL | SQL.Aliased)[]): MySqlSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<MySqlColumn | SQL | SQL.Aliased>]\n\t\t\t| (MySqlColumn | SQL | SQL.Aliased)[]\n\t): MySqlSelectWithout<this, TDynamic, 'groupBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst groupBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t\tthis.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];\n\t\t} else {\n\t\t\tthis.config.groupBy = columns as (MySqlColumn | SQL | SQL.Aliased)[];\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `order by` clause to the query.\n\t *\n\t * Calling this method will sort the result-set in ascending or descending order. By default, the sort order is ascending.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#order-by}\n\t *\n\t * @example\n\t *\n\t * ```\n\t * // Select cars ordered by year\n\t * await db.select().from(cars).orderBy(cars.year);\n\t * ```\n\t *\n\t * You can specify whether results are in ascending or descending order with the `asc()` and `desc()` operators.\n\t *\n\t * ```ts\n\t * // Select cars ordered by year in descending order\n\t * await db.select().from(cars).orderBy(desc(cars.year));\n\t *\n\t * // Select cars ordered by year and price\n\t * await db.select().from(cars).orderBy(asc(cars.year), desc(cars.price));\n\t * ```\n\t */\n\torderBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<MySqlColumn | SQL | SQL.Aliased>,\n\t): MySqlSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (MySqlColumn | SQL | SQL.Aliased)[]): MySqlSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<MySqlColumn | SQL | SQL.Aliased>]\n\t\t\t| (MySqlColumn | SQL | SQL.Aliased)[]\n\t): MySqlSelectWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t} else {\n\t\t\tconst orderByArray = columns as (MySqlColumn | SQL | SQL.Aliased)[];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `limit` clause to the query.\n\t *\n\t * Calling this method will set the maximum number of rows that will be returned by this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param limit the `limit` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the first 10 people from this query.\n\t * await db.select().from(people).limit(10);\n\t * ```\n\t */\n\tlimit(limit: number | Placeholder): MySqlSelectWithout<this, TDynamic, 'limit'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.limit = limit;\n\t\t} else {\n\t\t\tthis.config.limit = limit;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `offset` clause to the query.\n\t *\n\t * Calling this method will skip a number of rows when returning results from this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param offset the `offset` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the 10th-20th people from this query.\n\t * await db.select().from(people).offset(10).limit(10);\n\t * ```\n\t */\n\toffset(offset: number | Placeholder): MySqlSelectWithout<this, TDynamic, 'offset'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.offset = offset;\n\t\t} else {\n\t\t\tthis.config.offset = offset;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `for` clause to the query.\n\t *\n\t * Calling this method will specify a lock strength for this query that controls how strictly it acquires exclusive access to the rows being queried.\n\t *\n\t * See docs: {@link https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html}\n\t *\n\t * @param strength the lock strength.\n\t * @param config the lock configuration.\n\t */\n\tfor(strength: LockStrength, config: LockConfig = {}): MySqlSelectWithout<this, TDynamic, 'for'> {\n\t\tthis.config.lockingClause = { strength, config };\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildSelectQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\tas<TAlias extends string>(\n\t\talias: TAlias,\n\t): SubqueryWithSelection<this['_']['selectedFields'], TAlias> {\n\t\tconst usedTables: string[] = [];\n\t\tusedTables.push(...extractUsedTable(this.config.table));\n\t\tif (this.config.joins) { for (const it of this.config.joins) usedTables.push(...extractUsedTable(it.table)); }\n\n\t\treturn new Proxy(\n\t\t\tnew Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]),\n\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as SubqueryWithSelection<this['_']['selectedFields'], TAlias>;\n\t}\n\n\t/** @internal */\n\toverride getSelectedFields(): this['_']['selectedFields'] {\n\t\treturn new Proxy(\n\t\t\tthis.config.fields,\n\t\t\tnew SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): MySqlSelectDynamic<this> {\n\t\treturn this as any;\n\t}\n\n\t$withCache(config?: { config?: CacheConfig; tag?: string; autoInvalidate?: boolean } | false) {\n\t\tthis.cacheConfig = config === undefined\n\t\t\t? { config: {}, enable: true, autoInvalidate: true }\n\t\t\t: config === false\n\t\t\t? { enable: false }\n\t\t\t: { enable: true, autoInvalidate: true, ...config };\n\t\treturn this;\n\t}\n}\n\nexport interface MySqlSelectBase<\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends\n\tMySqlSelectQueryBuilderBase<\n\t\tMySqlSelectHKT,\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTPreparedQueryHKT,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tQueryPromise<TResult>\n{}\n\nexport class MySqlSelectBase<\n\tTTableName extends string | undefined,\n\tTSelection,\n\tTSelectMode extends SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends MySqlSelectQueryBuilderBase<\n\tMySqlSelectHKT,\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTPreparedQueryHKT,\n\tTNullabilityMap,\n\tTDynamic,\n\tTExcludedMethods,\n\tTResult,\n\tTSelectedFields\n> {\n\tstatic override readonly [entityKind]: string = 'MySqlSelect';\n\n\tprepare(): MySqlSelectPrepare<this> {\n\t\tif (!this.session) {\n\t\t\tthrow new Error('Cannot execute a query on a query builder. Please use a database instance instead.');\n\t\t}\n\t\tconst fieldsList = orderSelectedFields<MySqlColumn>(this.config.fields);\n\t\tconst query = this.session.prepareQuery<\n\t\t\tMySqlPreparedQueryConfig & { execute: SelectResult<TSelection, TSelectMode, TNullabilityMap>[] },\n\t\t\tTPreparedQueryHKT\n\t\t>(this.dialect.sqlToQuery(this.getSQL()), fieldsList, undefined, undefined, undefined, {\n\t\t\ttype: 'select',\n\t\t\ttables: [...this.usedTables],\n\t\t}, this.cacheConfig);\n\t\tquery.joinsNotNullableMap = this.joinsNotNullableMap;\n\t\treturn query as MySqlSelectPrepare<this>;\n\t}\n\n\texecute = ((placeholderValues) => {\n\t\treturn this.prepare().execute(placeholderValues);\n\t}) as ReturnType<this['prepare']>['execute'];\n\n\tprivate createIterator = (): ReturnType<this['prepare']>['iterator'] => {\n\t\tconst self = this;\n\t\treturn async function*(placeholderValues) {\n\t\t\tyield* self.prepare().iterator(placeholderValues);\n\t\t};\n\t};\n\n\titerator = this.createIterator();\n}\n\napplyMixins(MySqlSelectBase, [QueryPromise]);\n\nfunction createSetOperator(type: SetOperator, isAll: boolean): MySqlCreateSetOperatorFn {\n\treturn (leftSelect, rightSelect, ...restSelects) => {\n\t\tconst setOperators = [rightSelect, ...restSelects].map((select) => ({\n\t\t\ttype,\n\t\t\tisAll,\n\t\t\trightSelect: select as AnyMySqlSelect,\n\t\t}));\n\n\t\tfor (const setOperator of setOperators) {\n\t\t\tif (!haveSameKeys((leftSelect as any).getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn (leftSelect as AnyMySqlSelect).addSetOperators(setOperators) as any;\n\t};\n}\n\nconst getMySqlSetOperators = () => ({\n\tunion,\n\tunionAll,\n\tintersect,\n\tintersectAll,\n\texcept,\n\texceptAll,\n});\n\n/**\n * Adds `union` set operator to the query.\n *\n * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n *\n * @example\n *\n * ```ts\n * // Select all unique names from customers and users tables\n * import { union } from 'drizzle-orm/mysql-core'\n *\n * await union(\n *   db.select({ name: users.name }).from(users),\n *   db.select({ name: customers.name }).from(customers)\n * );\n * // or\n * await db.select({ name: users.name })\n *   .from(users)\n *   .union(\n *     db.select({ name: customers.name }).from(customers)\n *   );\n * ```\n */\nexport const union = createSetOperator('union', false);\n\n/**\n * Adds `union all` set operator to the query.\n *\n * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n *\n * @example\n *\n * ```ts\n * // Select all transaction ids from both online and in-store sales\n * import { unionAll } from 'drizzle-orm/mysql-core'\n *\n * await unionAll(\n *   db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n *   db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * // or\n * await db.select({ transaction: onlineSales.transactionId })\n *   .from(onlineSales)\n *   .unionAll(\n *     db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n *   );\n * ```\n */\nexport const unionAll = createSetOperator('union', true);\n\n/**\n * Adds `intersect` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n *\n * @example\n *\n * ```ts\n * // Select course names that are offered in both departments A and B\n * import { intersect } from 'drizzle-orm/mysql-core'\n *\n * await intersect(\n *   db.select({ courseName: depA.courseName }).from(depA),\n *   db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n *   .from(depA)\n *   .intersect(\n *     db.select({ courseName: depB.courseName }).from(depB)\n *   );\n * ```\n */\nexport const intersect = createSetOperator('intersect', false);\n\n/**\n * Adds `intersect all` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets including all duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect-all}\n *\n * @example\n *\n * ```ts\n * // Select all products and quantities that are ordered by both regular and VIP customers\n * import { intersectAll } from 'drizzle-orm/mysql-core'\n *\n * await intersectAll(\n *   db.select({\n *     productId: regularCustomerOrders.productId,\n *     quantityOrdered: regularCustomerOrders.quantityOrdered\n *   })\n *   .from(regularCustomerOrders),\n *   db.select({\n *     productId: vipCustomerOrders.productId,\n *     quantityOrdered: vipCustomerOrders.quantityOrdered\n *   })\n *   .from(vipCustomerOrders)\n * );\n * // or\n * await db.select({\n *   productId: regularCustomerOrders.productId,\n *   quantityOrdered: regularCustomerOrders.quantityOrdered\n * })\n * .from(regularCustomerOrders)\n * .intersectAll(\n *   db.select({\n *     productId: vipCustomerOrders.productId,\n *     quantityOrdered: vipCustomerOrders.quantityOrdered\n *   })\n *   .from(vipCustomerOrders)\n * );\n * ```\n */\nexport const intersectAll = createSetOperator('intersect', true);\n\n/**\n * Adds `except` set operator to the query.\n *\n * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n *\n * @example\n *\n * ```ts\n * // Select all courses offered in department A but not in department B\n * import { except } from 'drizzle-orm/mysql-core'\n *\n * await except(\n *   db.select({ courseName: depA.courseName }).from(depA),\n *   db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n *   .from(depA)\n *   .except(\n *     db.select({ courseName: depB.courseName }).from(depB)\n *   );\n * ```\n */\nexport const except = createSetOperator('except', false);\n\n/**\n * Adds `except all` set operator to the query.\n *\n * Calling this method will retrieve all rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except-all}\n *\n * @example\n *\n * ```ts\n * // Select all products that are ordered by regular customers but not by VIP customers\n * import { exceptAll } from 'drizzle-orm/mysql-core'\n *\n * await exceptAll(\n *   db.select({\n *     productId: regularCustomerOrders.productId,\n *     quantityOrdered: regularCustomerOrders.quantityOrdered\n *   })\n *   .from(regularCustomerOrders),\n *   db.select({\n *     productId: vipCustomerOrders.productId,\n *     quantityOrdered: vipCustomerOrders.quantityOrdered\n *   })\n *   .from(vipCustomerOrders)\n * );\n * // or\n * await db.select({\n *   productId: regularCustomerOrders.productId,\n *   quantityOrdered: regularCustomerOrders.quantityOrdered,\n * })\n * .from(regularCustomerOrders)\n * .exceptAll(\n *   db.select({\n *     productId: vipCustomerOrders.productId,\n *     quantityOrdered: vipCustomerOrders.quantityOrdered,\n *   })\n *   .from(vipCustomerOrders)\n * );\n * ```\n */\nexport const exceptAll = createSetOperator('except', true);\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/query-builders/select.types.ts",
    "content": "import type { MySqlColumn } from '~/mysql-core/columns/index.ts';\nimport type { MySqlTable, MySqlTableWithColumns } from '~/mysql-core/table.ts';\nimport type {\n\tSelectedFields as SelectedFieldsBase,\n\tSelectedFieldsFlat as SelectedFieldsFlatBase,\n\tSelectedFieldsOrdered as SelectedFieldsOrderedBase,\n} from '~/operations.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tAppendToNullabilityMap,\n\tAppendToResult,\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tJoinNullability,\n\tJoinType,\n\tMapColumnsToTableAlias,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport type { ColumnsSelection, Placeholder, SQL, View } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport type { Table, UpdateTableConfig } from '~/table.ts';\nimport type { Assume, ValidateShape } from '~/utils.ts';\nimport type { MySqlPreparedQueryConfig, PreparedQueryHKTBase, PreparedQueryKind } from '../session.ts';\nimport type { MySqlViewBase } from '../view-base.ts';\nimport type { MySqlViewWithSelection } from '../view.ts';\nimport type { IndexConfig, MySqlSelectBase, MySqlSelectQueryBuilderBase } from './select.ts';\n\nexport type MySqlJoinType = Exclude<JoinType, 'full'>;\n\nexport interface MySqlSelectJoinConfig {\n\ton: SQL | undefined;\n\ttable: MySqlTable | Subquery | MySqlViewBase | SQL;\n\talias: string | undefined;\n\tjoinType: MySqlJoinType;\n\tlateral?: boolean;\n\tuseIndex?: string[];\n\tforceIndex?: string[];\n\tignoreIndex?: string[];\n}\n\nexport type BuildAliasTable<TTable extends MySqlTable | View, TAlias extends string> = TTable extends Table\n\t? MySqlTableWithColumns<\n\t\tUpdateTableConfig<TTable['_']['config'], {\n\t\t\tname: TAlias;\n\t\t\tcolumns: MapColumnsToTableAlias<TTable['_']['columns'], TAlias, 'mysql'>;\n\t\t}>\n\t>\n\t: TTable extends View ? MySqlViewWithSelection<\n\t\t\tTAlias,\n\t\t\tTTable['_']['existing'],\n\t\t\tMapColumnsToTableAlias<TTable['_']['selectedFields'], TAlias, 'mysql'>\n\t\t>\n\t: never;\n\nexport interface MySqlSelectConfig {\n\twithList?: Subquery[];\n\tfields: Record<string, unknown>;\n\tfieldsFlat?: SelectedFieldsOrdered;\n\twhere?: SQL;\n\thaving?: SQL;\n\ttable: MySqlTable | Subquery | MySqlViewBase | SQL;\n\tlimit?: number | Placeholder;\n\toffset?: number | Placeholder;\n\tjoins?: MySqlSelectJoinConfig[];\n\torderBy?: (MySqlColumn | SQL | SQL.Aliased)[];\n\tgroupBy?: (MySqlColumn | SQL | SQL.Aliased)[];\n\tlockingClause?: {\n\t\tstrength: LockStrength;\n\t\tconfig: LockConfig;\n\t};\n\tdistinct?: boolean;\n\tsetOperators: {\n\t\trightSelect: TypedQueryBuilder<any, any>;\n\t\ttype: SetOperator;\n\t\tisAll: boolean;\n\t\torderBy?: (MySqlColumn | SQL | SQL.Aliased)[];\n\t\tlimit?: number | Placeholder;\n\t\toffset?: number | Placeholder;\n\t}[];\n\tuseIndex?: string[];\n\tforceIndex?: string[];\n\tignoreIndex?: string[];\n}\n\nexport type MySqlJoin<\n\tT extends AnyMySqlSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTJoinType extends MySqlJoinType,\n\tTJoinedTable extends MySqlTable | Subquery | MySqlViewBase | SQL,\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n> = T extends any ? MySqlSelectWithout<\n\t\tMySqlSelectKind<\n\t\t\tT['_']['hkt'],\n\t\t\tT['_']['tableName'],\n\t\t\tAppendToResult<\n\t\t\t\tT['_']['tableName'],\n\t\t\t\tT['_']['selection'],\n\t\t\t\tTJoinedName,\n\t\t\t\tTJoinedTable extends MySqlTable ? TJoinedTable['_']['columns']\n\t\t\t\t\t: TJoinedTable extends Subquery | View ? Assume<TJoinedTable['_']['selectedFields'], SelectedFields>\n\t\t\t\t\t: never,\n\t\t\t\tT['_']['selectMode']\n\t\t\t>,\n\t\t\tT['_']['selectMode'] extends 'partial' ? T['_']['selectMode'] : 'multiple',\n\t\t\tT['_']['preparedQueryHKT'],\n\t\t\tAppendToNullabilityMap<T['_']['nullabilityMap'], TJoinedName, TJoinType>,\n\t\t\tTDynamic,\n\t\t\tT['_']['excludedMethods']\n\t\t>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>\n\t: never;\n\nexport type MySqlJoinFn<\n\tT extends AnyMySqlSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTJoinType extends MySqlJoinType,\n\tTIsLateral extends boolean,\n> = <\n\tTJoinedTable extends (TIsLateral extends true ? Subquery | SQL : MySqlTable | Subquery | MySqlViewBase | SQL),\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n>(\n\ttable: TJoinedTable,\n\ton: ((aliases: T['_']['selection']) => SQL | undefined) | SQL | undefined,\n\tonIndex?:\n\t\t| (TJoinedTable extends MySqlTable ? IndexConfig\n\t\t\t: 'Index hint configuration is allowed only for MySqlTable and not for subqueries or views')\n\t\t| undefined,\n) => MySqlJoin<T, TDynamic, TJoinType, TJoinedTable, TJoinedName>;\n\nexport type MySqlCrossJoinFn<\n\tT extends AnyMySqlSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTIsLateral extends boolean,\n> = <\n\tTJoinedTable extends (TIsLateral extends true ? Subquery | SQL : MySqlTable | Subquery | MySqlViewBase | SQL),\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n>(\n\ttable: TJoinedTable,\n\tonIndex?:\n\t\t| (TJoinedTable extends MySqlTable ? IndexConfig\n\t\t\t: 'Index hint configuration is allowed only for MySqlTable and not for subqueries or views')\n\t\t| undefined,\n) => MySqlJoin<T, TDynamic, 'cross', TJoinedTable, TJoinedName>;\n\nexport type SelectedFieldsFlat = SelectedFieldsFlatBase<MySqlColumn>;\n\nexport type SelectedFields = SelectedFieldsBase<MySqlColumn, MySqlTable>;\n\nexport type SelectedFieldsOrdered = SelectedFieldsOrderedBase<MySqlColumn>;\n\nexport type LockStrength = 'update' | 'share';\n\nexport type LockConfig = {\n\tnoWait: true;\n\tskipLocked?: undefined;\n} | {\n\tnoWait?: undefined;\n\tskipLocked: true;\n} | {\n\tnoWait?: undefined;\n\tskipLocked?: undefined;\n};\n\nexport interface MySqlSelectHKTBase {\n\ttableName: string | undefined;\n\tselection: unknown;\n\tselectMode: SelectMode;\n\tpreparedQueryHKT: unknown;\n\tnullabilityMap: unknown;\n\tdynamic: boolean;\n\texcludedMethods: string;\n\tresult: unknown;\n\tselectedFields: unknown;\n\t_type: unknown;\n}\n\nexport type MySqlSelectKind<\n\tT extends MySqlSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability>,\n\tTDynamic extends boolean,\n\tTExcludedMethods extends string,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> = (T & {\n\ttableName: TTableName;\n\tselection: TSelection;\n\tselectMode: TSelectMode;\n\tpreparedQueryHKT: TPreparedQueryHKT;\n\tnullabilityMap: TNullabilityMap;\n\tdynamic: TDynamic;\n\texcludedMethods: TExcludedMethods;\n\tresult: TResult;\n\tselectedFields: TSelectedFields;\n})['_type'];\n\nexport interface MySqlSelectQueryBuilderHKT extends MySqlSelectHKTBase {\n\t_type: MySqlSelectQueryBuilderBase<\n\t\tMySqlSelectQueryBuilderHKT,\n\t\tthis['tableName'],\n\t\tAssume<this['selection'], ColumnsSelection>,\n\t\tthis['selectMode'],\n\t\tAssume<this['preparedQueryHKT'], PreparedQueryHKTBase>,\n\t\tAssume<this['nullabilityMap'], Record<string, JoinNullability>>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods'],\n\t\tAssume<this['result'], any[]>,\n\t\tAssume<this['selectedFields'], ColumnsSelection>\n\t>;\n}\n\nexport interface MySqlSelectHKT extends MySqlSelectHKTBase {\n\t_type: MySqlSelectBase<\n\t\tthis['tableName'],\n\t\tAssume<this['selection'], ColumnsSelection>,\n\t\tthis['selectMode'],\n\t\tAssume<this['preparedQueryHKT'], PreparedQueryHKTBase>,\n\t\tAssume<this['nullabilityMap'], Record<string, JoinNullability>>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods'],\n\t\tAssume<this['result'], any[]>,\n\t\tAssume<this['selectedFields'], ColumnsSelection>\n\t>;\n}\n\nexport type MySqlSetOperatorExcludedMethods =\n\t| 'where'\n\t| 'having'\n\t| 'groupBy'\n\t| 'session'\n\t| 'leftJoin'\n\t| 'rightJoin'\n\t| 'innerJoin'\n\t| 'for';\n\nexport type MySqlSelectWithout<\n\tT extends AnyMySqlSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n\tTResetExcluded extends boolean = false,\n> = TDynamic extends true ? T : Omit<\n\tMySqlSelectKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['tableName'],\n\t\tT['_']['selection'],\n\t\tT['_']['selectMode'],\n\t\tT['_']['preparedQueryHKT'],\n\t\tT['_']['nullabilityMap'],\n\t\tTDynamic,\n\t\tTResetExcluded extends true ? K : T['_']['excludedMethods'] | K,\n\t\tT['_']['result'],\n\t\tT['_']['selectedFields']\n\t>,\n\tTResetExcluded extends true ? K : T['_']['excludedMethods'] | K\n>;\n\nexport type MySqlSelectPrepare<T extends AnyMySqlSelect> = PreparedQueryKind<\n\tT['_']['preparedQueryHKT'],\n\tMySqlPreparedQueryConfig & {\n\t\texecute: T['_']['result'];\n\t\titerator: T['_']['result'][number];\n\t},\n\ttrue\n>;\n\nexport type MySqlSelectDynamic<T extends AnyMySqlSelectQueryBuilder> = MySqlSelectKind<\n\tT['_']['hkt'],\n\tT['_']['tableName'],\n\tT['_']['selection'],\n\tT['_']['selectMode'],\n\tT['_']['preparedQueryHKT'],\n\tT['_']['nullabilityMap'],\n\ttrue,\n\tnever,\n\tT['_']['result'],\n\tT['_']['selectedFields']\n>;\n\nexport type CreateMySqlSelectFromBuilderMode<\n\tTBuilderMode extends 'db' | 'qb',\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n> = TBuilderMode extends 'db' ? MySqlSelectBase<TTableName, TSelection, TSelectMode, TPreparedQueryHKT>\n\t: MySqlSelectQueryBuilderBase<MySqlSelectQueryBuilderHKT, TTableName, TSelection, TSelectMode, TPreparedQueryHKT>;\n\nexport type MySqlSelectQueryBuilder<\n\tTHKT extends MySqlSelectHKTBase = MySqlSelectQueryBuilderHKT,\n\tTTableName extends string | undefined = string | undefined,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n\tTResult extends any[] = unknown[],\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> = MySqlSelectQueryBuilderBase<\n\tTHKT,\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTPreparedQueryHKT,\n\tTNullabilityMap,\n\ttrue,\n\tnever,\n\tTResult,\n\tTSelectedFields\n>;\n\nexport type AnyMySqlSelectQueryBuilder = MySqlSelectQueryBuilderBase<any, any, any, any, any, any, any, any, any>;\n\nexport type AnyMySqlSetOperatorInterface = MySqlSetOperatorInterface<any, any, any, any, any, any, any, any, any>;\n\nexport interface MySqlSetOperatorInterface<\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> {\n\t_: {\n\t\treadonly hkt: MySqlSelectHKT;\n\t\treadonly tableName: TTableName;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly preparedQueryHKT: TPreparedQueryHKT;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t};\n}\n\nexport type MySqlSetOperatorWithResult<TResult extends any[]> = MySqlSetOperatorInterface<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tTResult,\n\tany\n>;\n\nexport type MySqlSelect<\n\tTTableName extends string | undefined = string | undefined,\n\tTSelection extends ColumnsSelection = Record<string, any>,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n> = MySqlSelectBase<TTableName, TSelection, TSelectMode, PreparedQueryHKTBase, TNullabilityMap, true, never>;\n\nexport type AnyMySqlSelect = MySqlSelectBase<any, any, any, any, any, any, any, any>;\n\nexport type MySqlSetOperator<\n\tTTableName extends string | undefined = string | undefined,\n\tTSelection extends ColumnsSelection = Record<string, any>,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n> = MySqlSelectBase<\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTPreparedQueryHKT,\n\tTNullabilityMap,\n\ttrue,\n\tMySqlSetOperatorExcludedMethods\n>;\n\nexport type SetOperatorRightSelect<\n\tTValue extends MySqlSetOperatorWithResult<TResult>,\n\tTResult extends any[],\n> = TValue extends MySqlSetOperatorInterface<any, any, any, any, any, any, any, infer TValueResult, any>\n\t? ValidateShape<\n\t\tTValueResult[number],\n\t\tTResult[number],\n\t\tTypedQueryBuilder<any, TValueResult>\n\t>\n\t: TValue;\n\nexport type SetOperatorRestSelect<\n\tTValue extends readonly MySqlSetOperatorWithResult<TResult>[],\n\tTResult extends any[],\n> = TValue extends [infer First, ...infer Rest]\n\t? First extends MySqlSetOperatorInterface<any, any, any, any, any, any, any, infer TValueResult, any>\n\t\t? Rest extends AnyMySqlSetOperatorInterface[] ? [\n\t\t\t\tValidateShape<TValueResult[number], TResult[number], TypedQueryBuilder<any, TValueResult>>,\n\t\t\t\t...SetOperatorRestSelect<Rest, TResult>,\n\t\t\t]\n\t\t: ValidateShape<TValueResult[number], TResult[number], TypedQueryBuilder<any, TValueResult>[]>\n\t: never\n\t: TValue;\n\nexport type MySqlCreateSetOperatorFn = <\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTValue extends MySqlSetOperatorWithResult<TResult>,\n\tTRest extends MySqlSetOperatorWithResult<TResult>[],\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n>(\n\tleftSelect: MySqlSetOperatorInterface<\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTPreparedQueryHKT,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\trightSelect: SetOperatorRightSelect<TValue, TResult>,\n\t...restSelects: SetOperatorRestSelect<TRest, TResult>\n) => MySqlSelectWithout<\n\tMySqlSelectBase<\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTPreparedQueryHKT,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tfalse,\n\tMySqlSetOperatorExcludedMethods,\n\ttrue\n>;\n\nexport type GetMySqlSetOperators = {\n\tunion: MySqlCreateSetOperatorFn;\n\tintersect: MySqlCreateSetOperatorFn;\n\texcept: MySqlCreateSetOperatorFn;\n\tunionAll: MySqlCreateSetOperatorFn;\n\tintersectAll: MySqlCreateSetOperatorFn;\n\texceptAll: MySqlCreateSetOperatorFn;\n};\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/query-builders/update.ts",
    "content": "import type { WithCacheConfig } from '~/cache/core/types.ts';\nimport type { GetColumnData } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type {\n\tAnyMySqlQueryResultHKT,\n\tMySqlPreparedQueryConfig,\n\tMySqlQueryResultHKT,\n\tMySqlQueryResultKind,\n\tMySqlSession,\n\tPreparedQueryHKTBase,\n\tPreparedQueryKind,\n} from '~/mysql-core/session.ts';\nimport type { MySqlTable } from '~/mysql-core/table.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { Placeholder, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { mapUpdateSet, type UpdateSet, type ValueOrArray } from '~/utils.ts';\nimport type { MySqlColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type { SelectedFieldsOrdered } from './select.types.ts';\n\nexport interface MySqlUpdateConfig {\n\twhere?: SQL | undefined;\n\tlimit?: number | Placeholder;\n\torderBy?: (MySqlColumn | SQL | SQL.Aliased)[];\n\tset: UpdateSet;\n\ttable: MySqlTable;\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type MySqlUpdateSetSource<TTable extends MySqlTable> =\n\t& {\n\t\t[Key in keyof TTable['$inferInsert']]?:\n\t\t\t| GetColumnData<TTable['_']['columns'][Key], 'query'>\n\t\t\t| SQL\n\t\t\t| undefined;\n\t}\n\t& {};\n\nexport class MySqlUpdateBuilder<\n\tTTable extends MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n> {\n\tstatic readonly [entityKind]: string = 'MySqlUpdateBuilder';\n\n\tdeclare readonly _: {\n\t\treadonly table: TTable;\n\t};\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: MySqlSession,\n\t\tprivate dialect: MySqlDialect,\n\t\tprivate withList?: Subquery[],\n\t) {}\n\n\tset(values: MySqlUpdateSetSource<TTable>): MySqlUpdateBase<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\treturn new MySqlUpdateBase(this.table, mapUpdateSet(this.table, values), this.session, this.dialect, this.withList);\n\t}\n}\n\nexport type MySqlUpdateWithout<\n\tT extends AnyMySqlUpdateBase,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T : Omit<\n\tMySqlUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['preparedQueryHKT'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods'] | K\n\t>,\n\tT['_']['excludedMethods'] | K\n>;\n\nexport type MySqlUpdatePrepare<T extends AnyMySqlUpdateBase> = PreparedQueryKind<\n\tT['_']['preparedQueryHKT'],\n\tMySqlPreparedQueryConfig & {\n\t\texecute: MySqlQueryResultKind<T['_']['queryResult'], never>;\n\t\titerator: never;\n\t},\n\ttrue\n>;\n\nexport type MySqlUpdateDynamic<T extends AnyMySqlUpdateBase> = MySqlUpdate<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['preparedQueryHKT']\n>;\n\nexport type MySqlUpdate<\n\tTTable extends MySqlTable = MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT = AnyMySqlQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n> = MySqlUpdateBase<TTable, TQueryResult, TPreparedQueryHKT, true, never>;\n\nexport type AnyMySqlUpdateBase = MySqlUpdateBase<any, any, any, any, any>;\n\nexport interface MySqlUpdateBase<\n\tTTable extends MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<MySqlQueryResultKind<TQueryResult, never>>, SQLWrapper {\n\treadonly _: {\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly preparedQueryHKT: TPreparedQueryHKT;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t};\n}\n\nexport class MySqlUpdateBase<\n\tTTable extends MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<MySqlQueryResultKind<TQueryResult, never>> implements SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'MySqlUpdate';\n\n\tprivate config: MySqlUpdateConfig;\n\tprotected cacheConfig?: WithCacheConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tset: UpdateSet,\n\t\tprivate session: MySqlSession,\n\t\tprivate dialect: MySqlDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { set, table, withList };\n\t}\n\n\t/**\n\t * Adds a 'where' clause to the query.\n\t *\n\t * Calling this method will update only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param where the 'where' clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be updated.\n\t *\n\t * ```ts\n\t * // Update all cars with green color\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'));\n\t * // or\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Update all BMW cars with a green color\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Update all cars with the green or blue color\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): MySqlUpdateWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\torderBy(\n\t\tbuilder: (updateTable: TTable) => ValueOrArray<MySqlColumn | SQL | SQL.Aliased>,\n\t): MySqlUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (MySqlColumn | SQL | SQL.Aliased)[]): MySqlUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(updateTable: TTable) => ValueOrArray<MySqlColumn | SQL | SQL.Aliased>]\n\t\t\t| (MySqlColumn | SQL | SQL.Aliased)[]\n\t): MySqlUpdateWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as any,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t} else {\n\t\t\tconst orderByArray = columns as (MySqlColumn | SQL | SQL.Aliased)[];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\tlimit(limit: number | Placeholder): MySqlUpdateWithout<this, TDynamic, 'limit'> {\n\t\tthis.config.limit = limit;\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildUpdateQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\tprepare(): MySqlUpdatePrepare<this> {\n\t\treturn this.session.prepareQuery(\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tthis.config.returning,\n\t\t\t{\n\t\t\t\ttype: 'insert',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t},\n\t\t\tthis.cacheConfig,\n\t\t) as MySqlUpdatePrepare<this>;\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn this.prepare().execute(placeholderValues);\n\t};\n\n\tprivate createIterator = (): ReturnType<this['prepare']>['iterator'] => {\n\t\tconst self = this;\n\t\treturn async function*(placeholderValues) {\n\t\t\tyield* self.prepare().iterator(placeholderValues);\n\t\t};\n\t};\n\n\titerator = this.createIterator();\n\n\t$dynamic(): MySqlUpdateDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/schema.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\nimport { type MySqlTableFn, mysqlTableWithSchema } from './table.ts';\nimport { type mysqlView, mysqlViewWithSchema } from './view.ts';\n\nexport class MySqlSchema<TName extends string = string> {\n\tstatic readonly [entityKind]: string = 'MySqlSchema';\n\n\tconstructor(\n\t\tpublic readonly schemaName: TName,\n\t) {}\n\n\ttable: MySqlTableFn<TName> = (name, columns, extraConfig) => {\n\t\treturn mysqlTableWithSchema(name, columns, extraConfig, this.schemaName);\n\t};\n\n\tview = ((name, columns) => {\n\t\treturn mysqlViewWithSchema(name, columns, this.schemaName);\n\t}) as typeof mysqlView;\n}\n\n/** @deprecated - use `instanceof MySqlSchema` */\nexport function isMySqlSchema(obj: unknown): obj is MySqlSchema {\n\treturn is(obj, MySqlSchema);\n}\n\n/**\n * Create a MySQL schema.\n * https://dev.mysql.com/doc/refman/8.0/en/create-database.html\n *\n * @param name mysql use schema name\n * @returns MySQL schema\n */\nexport function mysqlDatabase<TName extends string>(name: TName) {\n\treturn new MySqlSchema(name);\n}\n\n/**\n * @see mysqlDatabase\n */\nexport const mysqlSchema = mysqlDatabase;\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/session.ts",
    "content": "import { type Cache, hashQuery, NoopCache } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleQueryError, TransactionRollbackError } from '~/errors.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { type Query, type SQL, sql } from '~/sql/sql.ts';\nimport type { Assume, Equal } from '~/utils.ts';\nimport { MySqlDatabase } from './db.ts';\nimport type { MySqlDialect } from './dialect.ts';\nimport type { SelectedFieldsOrdered } from './query-builders/select.types.ts';\n\nexport type Mode = 'default' | 'planetscale';\n\nexport interface MySqlQueryResultHKT {\n\treadonly $brand: 'MySqlQueryResultHKT';\n\treadonly row: unknown;\n\treadonly type: unknown;\n}\n\nexport interface AnyMySqlQueryResultHKT extends MySqlQueryResultHKT {\n\treadonly type: any;\n}\n\nexport type MySqlQueryResultKind<TKind extends MySqlQueryResultHKT, TRow> = (TKind & {\n\treadonly row: TRow;\n})['type'];\n\nexport interface MySqlPreparedQueryConfig {\n\texecute: unknown;\n\titerator: unknown;\n}\n\nexport interface MySqlPreparedQueryHKT {\n\treadonly $brand: 'MySqlPreparedQueryHKT';\n\treadonly config: unknown;\n\treadonly type: unknown;\n}\n\nexport type PreparedQueryKind<\n\tTKind extends MySqlPreparedQueryHKT,\n\tTConfig extends MySqlPreparedQueryConfig,\n\tTAssume extends boolean = false,\n> = Equal<TAssume, true> extends true\n\t? Assume<(TKind & { readonly config: TConfig })['type'], MySqlPreparedQuery<TConfig>>\n\t: (TKind & { readonly config: TConfig })['type'];\n\nexport abstract class MySqlPreparedQuery<T extends MySqlPreparedQueryConfig> {\n\tstatic readonly [entityKind]: string = 'MySqlPreparedQuery';\n\n\tconstructor( // cache instance\n\t\tprivate cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprivate queryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\t// config that was passed through $withCache\n\t\tprivate cacheConfig?: WithCacheConfig,\n\t) {\n\t\t// it means that no $withCache options were passed and it should be just enabled\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enable: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enable) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\t}\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tif (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any mutations, if globally is false\n\t\tif (this.cacheConfig && !this.cacheConfig.enable) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// For mutate queries, we should query the database, wait for a response, and then perform invalidation\n\t\tif (\n\t\t\t(\n\t\t\t\tthis.queryMetadata.type === 'insert' || this.queryMetadata.type === 'update'\n\t\t\t\t|| this.queryMetadata.type === 'delete'\n\t\t\t) && this.queryMetadata.tables.length > 0\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst [res] = await Promise.all([\n\t\t\t\t\tquery(),\n\t\t\t\t\tthis.cache.onMutate({ tables: this.queryMetadata.tables }),\n\t\t\t\t]);\n\t\t\t\treturn res;\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any reads if globally disabled\n\t\tif (!this.cacheConfig) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.queryMetadata.type === 'select') {\n\t\t\tconst fromCache = await this.cache.get(\n\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\tthis.queryMetadata.tables,\n\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\tthis.cacheConfig.autoInvalidate,\n\t\t\t);\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tlet result;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await query();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t\t}\n\n\t\t\t\t// put actual key\n\t\t\t\tawait this.cache.put(\n\t\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tthis.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [],\n\t\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\t\tthis.cacheConfig.config,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\t\ttry {\n\t\t\treturn await query();\n\t\t} catch (e) {\n\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t}\n\t}\n\n\t/** @internal */\n\tjoinsNotNullableMap?: Record<string, boolean>;\n\n\tabstract execute(placeholderValues?: Record<string, unknown>): Promise<T['execute']>;\n\n\tabstract iterator(placeholderValues?: Record<string, unknown>): AsyncGenerator<T['iterator']>;\n}\n\nexport interface MySqlTransactionConfig {\n\twithConsistentSnapshot?: boolean;\n\taccessMode?: 'read only' | 'read write';\n\tisolationLevel: 'read uncommitted' | 'read committed' | 'repeatable read' | 'serializable';\n}\n\nexport abstract class MySqlSession<\n\tTQueryResult extends MySqlQueryResultHKT = MySqlQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = Record<string, never>,\n> {\n\tstatic readonly [entityKind]: string = 'MySqlSession';\n\n\tconstructor(protected dialect: MySqlDialect) {}\n\n\tabstract prepareQuery<T extends MySqlPreparedQueryConfig, TPreparedQueryHKT extends MySqlPreparedQueryHKT>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tgeneratedIds?: Record<string, unknown>[],\n\t\treturningIds?: SelectedFieldsOrdered,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PreparedQueryKind<TPreparedQueryHKT, T>;\n\n\texecute<T>(query: SQL): Promise<T> {\n\t\treturn this.prepareQuery<MySqlPreparedQueryConfig & { execute: T }, PreparedQueryHKTBase>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t).execute();\n\t}\n\n\tabstract all<T = unknown>(query: SQL): Promise<T[]>;\n\n\tasync count(sql: SQL): Promise<number> {\n\t\tconst res = await this.execute<[[{ count: string }]]>(sql);\n\n\t\treturn Number(\n\t\t\tres[0][0]['count'],\n\t\t);\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: MySqlTransaction<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: MySqlTransactionConfig,\n\t): Promise<T>;\n\n\tprotected getSetTransactionSQL(config: MySqlTransactionConfig): SQL | undefined {\n\t\tconst parts: string[] = [];\n\n\t\tif (config.isolationLevel) {\n\t\t\tparts.push(`isolation level ${config.isolationLevel}`);\n\t\t}\n\n\t\treturn parts.length ? sql`set transaction ${sql.raw(parts.join(' '))}` : undefined;\n\t}\n\n\tprotected getStartTransactionSQL(config: MySqlTransactionConfig): SQL | undefined {\n\t\tconst parts: string[] = [];\n\n\t\tif (config.withConsistentSnapshot) {\n\t\t\tparts.push('with consistent snapshot');\n\t\t}\n\n\t\tif (config.accessMode) {\n\t\t\tparts.push(config.accessMode);\n\t\t}\n\n\t\treturn parts.length ? sql`start transaction ${sql.raw(parts.join(' '))}` : undefined;\n\t}\n}\n\nexport abstract class MySqlTransaction<\n\tTQueryResult extends MySqlQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = Record<string, never>,\n> extends MySqlDatabase<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'MySqlTransaction';\n\n\tconstructor(\n\t\tdialect: MySqlDialect,\n\t\tsession: MySqlSession,\n\t\tprotected schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprotected readonly nestedIndex: number,\n\t\tmode: Mode,\n\t) {\n\t\tsuper(dialect, session, schema, mode);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n\n\t/** Nested transactions (aka savepoints) only work with InnoDB engine. */\n\tabstract override transaction<T>(\n\t\ttransaction: (tx: MySqlTransaction<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport interface PreparedQueryHKTBase extends MySqlPreparedQueryHKT {\n\ttype: MySqlPreparedQuery<Assume<this['config'], MySqlPreparedQueryConfig>>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/subquery.ts",
    "content": "import type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { AddAliasToSelection } from '~/query-builders/select.types.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport type { Subquery, WithSubquery, WithSubqueryWithoutSelection } from '~/subquery.ts';\nimport type { QueryBuilder } from './query-builders/query-builder.ts';\n\nexport type SubqueryWithSelection<\n\tTSelection extends ColumnsSelection,\n\tTAlias extends string,\n> =\n\t& Subquery<TAlias, AddAliasToSelection<TSelection, TAlias, 'mysql'>>\n\t& AddAliasToSelection<TSelection, TAlias, 'mysql'>;\n\nexport type WithSubqueryWithSelection<\n\tTSelection extends ColumnsSelection,\n\tTAlias extends string,\n> =\n\t& WithSubquery<TAlias, AddAliasToSelection<TSelection, TAlias, 'mysql'>>\n\t& AddAliasToSelection<TSelection, TAlias, 'mysql'>;\n\nexport interface WithBuilder {\n\t<TAlias extends string>(alias: TAlias): {\n\t\tas: {\n\t\t\t<TSelection extends ColumnsSelection>(\n\t\t\t\tqb: TypedQueryBuilder<TSelection> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelection>),\n\t\t\t): WithSubqueryWithSelection<TSelection, TAlias>;\n\t\t\t(\n\t\t\t\tqb: TypedQueryBuilder<undefined> | ((qb: QueryBuilder) => TypedQueryBuilder<undefined>),\n\t\t\t): WithSubqueryWithoutSelection<TAlias>;\n\t\t};\n\t};\n\t<TAlias extends string, TSelection extends ColumnsSelection>(alias: TAlias, selection: TSelection): {\n\t\tas: (qb: SQL | ((qb: QueryBuilder) => SQL)) => WithSubqueryWithSelection<TSelection, TAlias>;\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/table.ts",
    "content": "import type { BuildColumns, BuildExtraConfigColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport { getMySqlColumnBuilders, type MySqlColumnBuilders } from './columns/all.ts';\nimport type { MySqlColumn, MySqlColumnBuilder, MySqlColumnBuilderBase } from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { AnyIndexBuilder } from './indexes.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type MySqlTableExtraConfigValue =\n\t| AnyIndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder;\n\nexport type MySqlTableExtraConfig = Record<\n\tstring,\n\tMySqlTableExtraConfigValue\n>;\n\nexport type TableConfig = TableConfigBase<MySqlColumn>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:MySqlInlineForeignKeys');\n\nexport class MySqlTable<T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlTable';\n\n\tdeclare protected $columns: T['columns'];\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t});\n\n\t/** @internal */\n\toverride [Table.Symbol.Columns]!: NonNullable<T['columns']>;\n\n\t/** @internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]:\n\t\t| ((self: Record<string, MySqlColumn>) => MySqlTableExtraConfig)\n\t\t| undefined = undefined;\n}\n\nexport type AnyMySqlTable<TPartial extends Partial<TableConfig> = {}> = MySqlTable<\n\tUpdateTableConfig<TableConfig, TPartial>\n>;\n\nexport type MySqlTableWithColumns<T extends TableConfig> =\n\t& MySqlTable<T>\n\t& {\n\t\t[Key in keyof T['columns']]: T['columns'][Key];\n\t};\n\nexport function mysqlTableWithSchema<\n\tTTableName extends string,\n\tTSchemaName extends string | undefined,\n\tTColumnsMap extends Record<string, MySqlColumnBuilderBase>,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap | ((columnTypes: MySqlColumnBuilders) => TColumnsMap),\n\textraConfig:\n\t\t| ((\n\t\t\tself: BuildColumns<TTableName, TColumnsMap, 'mysql'>,\n\t\t) => MySqlTableExtraConfig | MySqlTableExtraConfigValue[])\n\t\t| undefined,\n\tschema: TSchemaName,\n\tbaseName = name,\n): MySqlTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchemaName;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'mysql'>;\n\tdialect: 'mysql';\n}> {\n\tconst rawTable = new MySqlTable<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'mysql'>;\n\t\tdialect: 'mysql';\n\t}>(name, schema, baseName);\n\n\tconst parsedColumns: TColumnsMap = typeof columns === 'function' ? columns(getMySqlColumnBuilders()) : columns;\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as MySqlColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildColumns<TTableName, TColumnsMap, 'mysql'>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumns as unknown as BuildExtraConfigColumns<\n\t\tTTableName,\n\t\tTColumnsMap,\n\t\t'mysql'\n\t>;\n\n\tif (extraConfig) {\n\t\ttable[MySqlTable.Symbol.ExtraConfigBuilder] = extraConfig as unknown as (\n\t\t\tself: Record<string, MySqlColumn>,\n\t\t) => MySqlTableExtraConfig;\n\t}\n\n\treturn table;\n}\n\nexport interface MySqlTableFn<TSchemaName extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, MySqlColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: BuildColumns<TTableName, TColumnsMap, 'mysql'>,\n\t\t) => MySqlTableExtraConfigValue[],\n\t): MySqlTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'mysql'>;\n\t\tdialect: 'mysql';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, MySqlColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: MySqlColumnBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'mysql'>) => MySqlTableExtraConfigValue[],\n\t): MySqlTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'mysql'>;\n\t\tdialect: 'mysql';\n\t}>;\n\t/**\n\t * @deprecated The third parameter of mysqlTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = mysqlTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = mysqlTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, MySqlColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig: (self: BuildColumns<TTableName, TColumnsMap, 'mysql'>) => MySqlTableExtraConfig,\n\t): MySqlTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'mysql'>;\n\t\tdialect: 'mysql';\n\t}>;\n\n\t/**\n\t * @deprecated The third parameter of mysqlTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = mysqlTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = mysqlTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, MySqlColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: MySqlColumnBuilders) => TColumnsMap,\n\t\textraConfig: (self: BuildColumns<TTableName, TColumnsMap, 'mysql'>) => MySqlTableExtraConfig,\n\t): MySqlTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'mysql'>;\n\t\tdialect: 'mysql';\n\t}>;\n}\n\nexport const mysqlTable: MySqlTableFn = (name, columns, extraConfig) => {\n\treturn mysqlTableWithSchema(name, columns, extraConfig, undefined, name);\n};\n\nexport function mysqlTableCreator(customizeTableName: (name: string) => string): MySqlTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn mysqlTableWithSchema(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/unique-constraint.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { MySqlColumn } from './columns/index.ts';\nimport type { MySqlTable } from './table.ts';\n\nexport function unique(name?: string): UniqueOnConstraintBuilder {\n\treturn new UniqueOnConstraintBuilder(name);\n}\n\nexport function uniqueKeyName(table: MySqlTable, columns: string[]) {\n\treturn `${table[TableName]}_${columns.join('_')}_unique`;\n}\n\nexport class UniqueConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'MySqlUniqueConstraintBuilder';\n\n\t/** @internal */\n\tcolumns: MySqlColumn[];\n\n\tconstructor(\n\t\tcolumns: MySqlColumn[],\n\t\tprivate name?: string,\n\t) {\n\t\tthis.columns = columns;\n\t}\n\n\t/** @internal */\n\tbuild(table: MySqlTable): UniqueConstraint {\n\t\treturn new UniqueConstraint(table, this.columns, this.name);\n\t}\n}\n\nexport class UniqueOnConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'MySqlUniqueOnConstraintBuilder';\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tname?: string,\n\t) {\n\t\tthis.name = name;\n\t}\n\n\ton(...columns: [MySqlColumn, ...MySqlColumn[]]) {\n\t\treturn new UniqueConstraintBuilder(columns, this.name);\n\t}\n}\n\nexport class UniqueConstraint {\n\tstatic readonly [entityKind]: string = 'MySqlUniqueConstraint';\n\n\treadonly columns: MySqlColumn[];\n\treadonly name?: string;\n\treadonly nullsNotDistinct: boolean = false;\n\n\tconstructor(readonly table: MySqlTable, columns: MySqlColumn[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n\t}\n\n\tgetName() {\n\t\treturn this.name;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/utils.ts",
    "content": "import { is } from '~/entity.ts';\nimport { SQL } from '~/index.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { Check } from './checks.ts';\nimport { CheckBuilder } from './checks.ts';\nimport type { ForeignKey } from './foreign-keys.ts';\nimport { ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { Index } from './indexes.ts';\nimport { IndexBuilder } from './indexes.ts';\nimport type { PrimaryKey } from './primary-keys.ts';\nimport { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { IndexForHint } from './query-builders/select.ts';\nimport { MySqlTable } from './table.ts';\nimport { type UniqueConstraint, UniqueConstraintBuilder } from './unique-constraint.ts';\nimport type { MySqlViewBase } from './view-base.ts';\nimport { MySqlViewConfig } from './view-common.ts';\nimport type { MySqlView } from './view.ts';\n\nexport function extractUsedTable(table: MySqlTable | Subquery | MySqlViewBase | SQL): string[] {\n\tif (is(table, MySqlTable)) {\n\t\treturn [`${table[Table.Symbol.BaseName]}`];\n\t}\n\tif (is(table, Subquery)) {\n\t\treturn table._.usedTables ?? [];\n\t}\n\tif (is(table, SQL)) {\n\t\treturn table.usedTables ?? [];\n\t}\n\treturn [];\n}\n\nexport function getTableConfig(table: MySqlTable) {\n\tconst columns = Object.values(table[MySqlTable.Symbol.Columns]);\n\tconst indexes: Index[] = [];\n\tconst checks: Check[] = [];\n\tconst primaryKeys: PrimaryKey[] = [];\n\tconst uniqueConstraints: UniqueConstraint[] = [];\n\tconst foreignKeys: ForeignKey[] = Object.values(table[MySqlTable.Symbol.InlineForeignKeys]);\n\tconst name = table[Table.Symbol.Name];\n\tconst schema = table[Table.Symbol.Schema];\n\tconst baseName = table[Table.Symbol.BaseName];\n\n\tconst extraConfigBuilder = table[MySqlTable.Symbol.ExtraConfigBuilder];\n\n\tif (extraConfigBuilder !== undefined) {\n\t\tconst extraConfig = extraConfigBuilder(table[MySqlTable.Symbol.Columns]);\n\t\tconst extraValues = Array.isArray(extraConfig) ? extraConfig.flat(1) as any[] : Object.values(extraConfig);\n\t\tfor (const builder of Object.values(extraValues)) {\n\t\t\tif (is(builder, IndexBuilder)) {\n\t\t\t\tindexes.push(builder.build(table));\n\t\t\t} else if (is(builder, CheckBuilder)) {\n\t\t\t\tchecks.push(builder.build(table));\n\t\t\t} else if (is(builder, UniqueConstraintBuilder)) {\n\t\t\t\tuniqueConstraints.push(builder.build(table));\n\t\t\t} else if (is(builder, PrimaryKeyBuilder)) {\n\t\t\t\tprimaryKeys.push(builder.build(table));\n\t\t\t} else if (is(builder, ForeignKeyBuilder)) {\n\t\t\t\tforeignKeys.push(builder.build(table));\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tcolumns,\n\t\tindexes,\n\t\tforeignKeys,\n\t\tchecks,\n\t\tprimaryKeys,\n\t\tuniqueConstraints,\n\t\tname,\n\t\tschema,\n\t\tbaseName,\n\t};\n}\n\nexport function getViewConfig<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n>(view: MySqlView<TName, TExisting>) {\n\treturn {\n\t\t...view[ViewBaseConfig],\n\t\t...view[MySqlViewConfig],\n\t};\n}\n\nexport function convertIndexToString(indexes: IndexForHint[]) {\n\treturn indexes.map((idx) => {\n\t\treturn typeof idx === 'object' ? idx.config.name : idx;\n\t});\n}\n\nexport function toArray<T>(value: T | T[]): T[] {\n\treturn Array.isArray(value) ? value : [value];\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/view-base.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { ColumnsSelection } from '~/sql/sql.ts';\nimport { View } from '~/sql/sql.ts';\n\nexport abstract class MySqlViewBase<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> extends View<TName, TExisting, TSelectedFields> {\n\tstatic override readonly [entityKind]: string = 'MySqlViewBase';\n\n\tdeclare readonly _: View<TName, TExisting, TSelectedFields>['_'] & {\n\t\treadonly viewBrand: 'MySqlViewBase';\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/view-common.ts",
    "content": "export const MySqlViewConfig = Symbol.for('drizzle:MySqlViewConfig');\n"
  },
  {
    "path": "drizzle-orm/src/mysql-core/view.ts",
    "content": "import type { BuildColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { AddAliasToSelection } from '~/query-builders/select.types.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport { getTableColumns } from '~/utils.ts';\nimport type { MySqlColumn, MySqlColumnBuilderBase } from './columns/index.ts';\nimport { QueryBuilder } from './query-builders/query-builder.ts';\nimport { mysqlTable } from './table.ts';\nimport { MySqlViewBase } from './view-base.ts';\nimport { MySqlViewConfig } from './view-common.ts';\n\nexport interface ViewBuilderConfig {\n\talgorithm?: 'undefined' | 'merge' | 'temptable';\n\tsqlSecurity?: 'definer' | 'invoker';\n\twithCheckOption?: 'cascaded' | 'local';\n}\n\nexport class ViewBuilderCore<TConfig extends { name: string; columns?: unknown }> {\n\tstatic readonly [entityKind]: string = 'MySqlViewBuilder';\n\n\tdeclare readonly _: {\n\t\treadonly name: TConfig['name'];\n\t\treadonly columns: TConfig['columns'];\n\t};\n\n\tconstructor(\n\t\tprotected name: TConfig['name'],\n\t\tprotected schema: string | undefined,\n\t) {}\n\n\tprotected config: ViewBuilderConfig = {};\n\n\talgorithm(\n\t\talgorithm: Exclude<ViewBuilderConfig['algorithm'], undefined>,\n\t): this {\n\t\tthis.config.algorithm = algorithm;\n\t\treturn this;\n\t}\n\n\tsqlSecurity(\n\t\tsqlSecurity: Exclude<ViewBuilderConfig['sqlSecurity'], undefined>,\n\t): this {\n\t\tthis.config.sqlSecurity = sqlSecurity;\n\t\treturn this;\n\t}\n\n\twithCheckOption(\n\t\twithCheckOption?: Exclude<ViewBuilderConfig['withCheckOption'], undefined>,\n\t): this {\n\t\tthis.config.withCheckOption = withCheckOption ?? 'cascaded';\n\t\treturn this;\n\t}\n}\n\nexport class ViewBuilder<TName extends string = string> extends ViewBuilderCore<{ name: TName }> {\n\tstatic override readonly [entityKind]: string = 'MySqlViewBuilder';\n\n\tas<TSelectedFields extends ColumnsSelection>(\n\t\tqb: TypedQueryBuilder<TSelectedFields> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelectedFields>),\n\t): MySqlViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'mysql'>> {\n\t\tif (typeof qb === 'function') {\n\t\t\tqb = qb(new QueryBuilder());\n\t\t}\n\t\tconst selectionProxy = new SelectionProxyHandler<TSelectedFields>({\n\t\t\talias: this.name,\n\t\t\tsqlBehavior: 'error',\n\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\treplaceOriginalName: true,\n\t\t});\n\t\tconst aliasedSelection = new Proxy(qb.getSelectedFields(), selectionProxy);\n\t\treturn new Proxy(\n\t\t\tnew MySqlView({\n\t\t\t\tmysqlConfig: this.config,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: aliasedSelection,\n\t\t\t\t\tquery: qb.getSQL().inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tselectionProxy as any,\n\t\t) as MySqlViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'mysql'>>;\n\t}\n}\n\nexport class ManualViewBuilder<\n\tTName extends string = string,\n\tTColumns extends Record<string, MySqlColumnBuilderBase> = Record<string, MySqlColumnBuilderBase>,\n> extends ViewBuilderCore<{ name: TName; columns: TColumns }> {\n\tstatic override readonly [entityKind]: string = 'MySqlManualViewBuilder';\n\n\tprivate columns: Record<string, MySqlColumn>;\n\n\tconstructor(\n\t\tname: TName,\n\t\tcolumns: TColumns,\n\t\tschema: string | undefined,\n\t) {\n\t\tsuper(name, schema);\n\t\tthis.columns = getTableColumns(mysqlTable(name, columns)) as BuildColumns<TName, TColumns, 'mysql'>;\n\t}\n\n\texisting(): MySqlViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'mysql'>> {\n\t\treturn new Proxy(\n\t\t\tnew MySqlView({\n\t\t\t\tmysqlConfig: undefined,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: undefined,\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as MySqlViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'mysql'>>;\n\t}\n\n\tas(query: SQL): MySqlViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'mysql'>> {\n\t\treturn new Proxy(\n\t\t\tnew MySqlView({\n\t\t\t\tmysqlConfig: this.config,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: query.inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as MySqlViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'mysql'>>;\n\t}\n}\n\nexport class MySqlView<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> extends MySqlViewBase<TName, TExisting, TSelectedFields> {\n\tstatic override readonly [entityKind]: string = 'MySqlView';\n\n\tdeclare protected $MySqlViewBrand: 'MySqlView';\n\n\t[MySqlViewConfig]: ViewBuilderConfig | undefined;\n\n\tconstructor({ mysqlConfig, config }: {\n\t\tmysqlConfig: ViewBuilderConfig | undefined;\n\t\tconfig: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t};\n\t}) {\n\t\tsuper(config);\n\t\tthis[MySqlViewConfig] = mysqlConfig;\n\t}\n}\n\nexport type MySqlViewWithSelection<\n\tTName extends string,\n\tTExisting extends boolean,\n\tTSelectedFields extends ColumnsSelection,\n> = MySqlView<TName, TExisting, TSelectedFields> & TSelectedFields;\n\n/** @internal */\nexport function mysqlViewWithSchema(\n\tname: string,\n\tselection: Record<string, MySqlColumnBuilderBase> | undefined,\n\tschema: string | undefined,\n): ViewBuilder | ManualViewBuilder {\n\tif (selection) {\n\t\treturn new ManualViewBuilder(name, selection, schema);\n\t}\n\treturn new ViewBuilder(name, schema);\n}\n\nexport function mysqlView<TName extends string>(name: TName): ViewBuilder<TName>;\nexport function mysqlView<TName extends string, TColumns extends Record<string, MySqlColumnBuilderBase>>(\n\tname: TName,\n\tcolumns: TColumns,\n): ManualViewBuilder<TName, TColumns>;\nexport function mysqlView(\n\tname: string,\n\tselection?: Record<string, MySqlColumnBuilderBase>,\n): ViewBuilder | ManualViewBuilder {\n\treturn mysqlViewWithSchema(name, selection, undefined);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-proxy/driver.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { MySqlDatabase } from '~/mysql-core/db.ts';\nimport { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport { type MySqlRemotePreparedQueryHKT, type MySqlRemoteQueryResultHKT, MySqlRemoteSession } from './session.ts';\n\nexport class MySqlRemoteDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends MySqlDatabase<MySqlRemoteQueryResultHKT, MySqlRemotePreparedQueryHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'MySqlRemoteDatabase';\n}\n\nexport type RemoteCallback = (\n\tsql: string,\n\tparams: any[],\n\tmethod: 'all' | 'execute',\n) => Promise<{ rows: any[]; insertId?: number; affectedRows?: number }>;\n\nexport function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tcallback: RemoteCallback,\n\tconfig: DrizzleConfig<TSchema> = {},\n): MySqlRemoteDatabase<TSchema> {\n\tconst dialect = new MySqlDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new MySqlRemoteSession(callback, dialect, schema, { logger });\n\treturn new MySqlRemoteDatabase(dialect, session, schema as any, 'default') as MySqlRemoteDatabase<TSchema>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-proxy/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/mysql-proxy/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { MySqlRemoteDatabase } from './driver.ts';\n\nexport type ProxyMigrator = (migrationQueries: string[]) => Promise<void>;\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: MySqlRemoteDatabase<TSchema>,\n\tcallback: ProxyMigrator,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\n\tconst migrationsTable = config.migrationsTable ?? '__drizzle_migrations';\n\tconst migrationTableCreate = sql`\n\t\tcreate table if not exists ${sql.identifier(migrationsTable)} (\n\t\t\tid serial primary key,\n\t\t\thash text not null,\n\t\t\tcreated_at bigint\n\t\t)\n\t`;\n\tawait db.execute(migrationTableCreate);\n\n\tconst dbMigrations = await db.select({\n\t\tid: sql.raw('id'),\n\t\thash: sql.raw('hash'),\n\t\tcreated_at: sql.raw('created_at'),\n\t}).from(sql.identifier(migrationsTable).getSQL()).orderBy(\n\t\tsql.raw('created_at desc'),\n\t).limit(1);\n\n\tconst lastDbMigration = dbMigrations[0];\n\n\tconst queriesToRun: string[] = [];\n\n\tfor (const migration of migrations) {\n\t\tif (\n\t\t\t!lastDbMigration\n\t\t\t|| Number(lastDbMigration.created_at) < migration.folderMillis\n\t\t) {\n\t\t\tqueriesToRun.push(\n\t\t\t\t...migration.sql,\n\t\t\t\t`insert into ${\n\t\t\t\t\tsql.identifier(migrationsTable).value\n\t\t\t\t} (\\`hash\\`, \\`created_at\\`) values('${migration.hash}', '${migration.folderMillis}')`,\n\t\t\t);\n\t\t}\n\t}\n\n\tawait callback(queriesToRun);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql-proxy/session.ts",
    "content": "import type { FieldPacket, ResultSetHeader } from 'mysql2/promise';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport { MySqlTransaction } from '~/mysql-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/mysql-core/query-builders/select.types.ts';\nimport type {\n\tMySqlPreparedQueryConfig,\n\tMySqlPreparedQueryHKT,\n\tMySqlQueryResultHKT,\n\tMySqlTransactionConfig,\n\tPreparedQueryKind,\n} from '~/mysql-core/session.ts';\nimport { MySqlPreparedQuery as PreparedQueryBase, MySqlSession } from '~/mysql-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders } from '~/sql/sql.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\nimport type { RemoteCallback } from './driver.ts';\n\nexport type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n\nexport interface MySqlRemoteSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class MySqlRemoteSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlSession<MySqlRemoteQueryResultHKT, MySqlRemotePreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'MySqlRemoteSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: RemoteCallback,\n\t\tdialect: MySqlDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: MySqlRemoteSessionOptions,\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends MySqlPreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tgeneratedIds?: Record<string, unknown>[],\n\t\treturningIds?: SelectedFieldsOrdered,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PreparedQueryKind<MySqlRemotePreparedQueryHKT, T> {\n\t\treturn new PreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tcustomResultMapper,\n\t\t\tgeneratedIds,\n\t\t\treturningIds,\n\t\t) as PreparedQueryKind<MySqlRemotePreparedQueryHKT, T>;\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\tconst querySql = this.dialect.sqlToQuery(query);\n\t\tthis.logger.logQuery(querySql.sql, querySql.params);\n\t\treturn this.client(querySql.sql, querySql.params, 'all').then(({ rows }) => rows) as Promise<T[]>;\n\t}\n\n\toverride async transaction<T>(\n\t\t_transaction: (tx: MySqlProxyTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\t_config?: MySqlTransactionConfig,\n\t): Promise<T> {\n\t\tthrow new Error('Transactions are not supported by the MySql Proxy driver');\n\t}\n}\n\nexport class MySqlProxyTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlTransaction<MySqlRemoteQueryResultHKT, MySqlRemotePreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'MySqlProxyTransaction';\n\n\toverride async transaction<T>(\n\t\t_transaction: (tx: MySqlProxyTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tthrow new Error('Transactions are not supported by the MySql Proxy driver');\n\t}\n}\n\nexport class PreparedQuery<T extends MySqlPreparedQueryConfig> extends PreparedQueryBase<T> {\n\tstatic override readonly [entityKind]: string = 'MySqlProxyPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: RemoteCallback,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\t// Keys that were used in $default and the value that was generated for them\n\t\tprivate generatedIds?: Record<string, unknown>[],\n\t\t// Keys that should be returned, it has the column with all properries + key from object\n\t\tprivate returningIds?: SelectedFieldsOrdered,\n\t) {\n\t\tsuper(cache, queryMetadata, cacheConfig);\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\tconst { fields, client, queryString, logger, joinsNotNullableMap, customResultMapper, returningIds, generatedIds } =\n\t\t\tthis;\n\n\t\tlogger.logQuery(queryString, params);\n\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst { rows: data } = await this.queryWithCache(queryString, params, async () => {\n\t\t\t\treturn await client(queryString, params, 'execute');\n\t\t\t});\n\n\t\t\tconst insertId = data[0].insertId as number;\n\t\t\tconst affectedRows = data[0].affectedRows;\n\n\t\t\tif (returningIds) {\n\t\t\t\tconst returningResponse = [];\n\t\t\t\tlet j = 0;\n\t\t\t\tfor (let i = insertId; i < insertId + affectedRows; i++) {\n\t\t\t\t\tfor (const column of returningIds) {\n\t\t\t\t\t\tconst key = returningIds[0]!.path[0]!;\n\t\t\t\t\t\tif (is(column.field, Column)) {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tif (column.field.primary && column.field.autoIncrement) {\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: i });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (column.field.defaultFn && generatedIds) {\n\t\t\t\t\t\t\t\t// generatedIds[rowIdx][key]\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: generatedIds[j]![key] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tj++;\n\t\t\t\t}\n\n\t\t\t\treturn returningResponse;\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\tconst { rows } = await this.queryWithCache(queryString, params, async () => {\n\t\t\treturn await client(queryString, params, 'all');\n\t\t});\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows);\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t}\n\n\toverride iterator(\n\t\t_placeholderValues: Record<string, unknown> = {},\n\t): AsyncGenerator<T['iterator']> {\n\t\tthrow new Error('Streaming is not supported by the MySql Proxy driver');\n\t}\n}\n\nexport interface MySqlRemoteQueryResultHKT extends MySqlQueryResultHKT {\n\ttype: MySqlRawQueryResult;\n}\n\nexport interface MySqlRemotePreparedQueryHKT extends MySqlPreparedQueryHKT {\n\ttype: PreparedQuery<Assume<this['config'], MySqlPreparedQueryConfig>>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql2/driver.ts",
    "content": "import { type Connection as CallbackConnection, createPool, type Pool as CallbackPool, type PoolOptions } from 'mysql2';\nimport type { Connection, Pool } from 'mysql2/promise';\nimport type { Cache } from '~/cache/core/index.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { MySqlDatabase } from '~/mysql-core/db.ts';\nimport { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { Mode } from '~/mysql-core/session.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { DrizzleError } from '../errors.ts';\nimport type { MySql2Client, MySql2PreparedQueryHKT, MySql2QueryResultHKT } from './session.ts';\nimport { MySql2Session } from './session.ts';\n\nexport interface MySqlDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class MySql2Driver {\n\tstatic readonly [entityKind]: string = 'MySql2Driver';\n\n\tconstructor(\n\t\tprivate client: MySql2Client,\n\t\tprivate dialect: MySqlDialect,\n\t\tprivate options: MySqlDriverOptions = {},\n\t) {\n\t}\n\n\tcreateSession(\n\t\tschema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,\n\t\tmode: Mode,\n\t): MySql2Session<Record<string, unknown>, TablesRelationalConfig> {\n\t\treturn new MySql2Session(this.client, this.dialect, schema, {\n\t\t\tlogger: this.options.logger,\n\t\t\tmode,\n\t\t\tcache: this.options.cache,\n\t\t});\n\t}\n}\n\nexport { MySqlDatabase } from '~/mysql-core/db.ts';\n\nexport class MySql2Database<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends MySqlDatabase<MySql2QueryResultHKT, MySql2PreparedQueryHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'MySql2Database';\n}\n\nexport type MySql2DrizzleConfig<TSchema extends Record<string, unknown> = Record<string, never>> =\n\t& Omit<DrizzleConfig<TSchema>, 'schema'>\n\t& ({ schema: TSchema; mode: Mode } | { schema?: undefined; mode?: Mode });\n\nfunction construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Pool | Connection | CallbackPool | CallbackConnection = CallbackPool,\n>(\n\tclient: TClient,\n\tconfig: MySql2DrizzleConfig<TSchema> = {},\n): MySql2Database<TSchema> & {\n\t$client: AnyMySql2Connection extends TClient ? CallbackPool : TClient;\n} {\n\tconst dialect = new MySqlDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tconst clientForInstance = isCallbackClient(client) ? client.promise() : client;\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tif (config.mode === undefined) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage:\n\t\t\t\t\t'You need to specify \"mode\": \"planetscale\" or \"default\" when providing a schema. Read more: https://orm.drizzle.team/docs/rqb#modes',\n\t\t\t});\n\t\t}\n\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst mode = config.mode ?? 'default';\n\n\tconst driver = new MySql2Driver(clientForInstance as MySql2Client, dialect, { logger, cache: config.cache });\n\tconst session = driver.createSession(schema, mode);\n\tconst db = new MySql2Database(dialect, session, schema as any, mode) as MySql2Database<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\ninterface CallbackClient {\n\tpromise(): MySql2Client;\n}\n\nfunction isCallbackClient(client: any): client is CallbackClient {\n\treturn typeof client.promise === 'function';\n}\n\nexport type AnyMySql2Connection = Pool | Connection | CallbackPool | CallbackConnection;\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends AnyMySql2Connection = CallbackPool,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tMySql2DrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& MySql2DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | PoolOptions;\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): MySql2Database<TSchema> & {\n\t$client: AnyMySql2Connection extends TClient ? CallbackPool : TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst connectionString = params[0]!;\n\t\tconst instance = createPool({\n\t\t\turi: connectionString,\n\t\t});\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& { connection?: PoolOptions | string; client?: TClient }\n\t\t\t& MySql2DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tconst instance = typeof connection === 'string'\n\t\t\t? createPool({\n\t\t\t\turi: connection,\n\t\t\t\tsupportBigNumbers: true,\n\t\t\t})\n\t\t\t: createPool(connection!);\n\t\tconst db = construct(instance, drizzleConfig);\n\n\t\treturn db as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as MySql2DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: MySql2DrizzleConfig<TSchema>,\n\t): MySql2Database<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql2/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/mysql2/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { MySql2Database } from './driver.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: MySql2Database<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tawait db.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/mysql2/session.ts",
    "content": "import type { Connection as CallbackConnection } from 'mysql2';\nimport type {\n\tConnection,\n\tFieldPacket,\n\tOkPacket,\n\tPool,\n\tPoolConnection,\n\tQueryOptions,\n\tResultSetHeader,\n\tRowDataPacket,\n} from 'mysql2/promise';\nimport { once } from 'node:events';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { SelectedFieldsOrdered } from '~/mysql-core/query-builders/select.types.ts';\nimport {\n\ttype Mode,\n\tMySqlPreparedQuery,\n\ttype MySqlPreparedQueryConfig,\n\ttype MySqlPreparedQueryHKT,\n\ttype MySqlQueryResultHKT,\n\tMySqlSession,\n\tMySqlTransaction,\n\ttype MySqlTransactionConfig,\n\ttype PreparedQueryKind,\n} from '~/mysql-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, sql } from '~/sql/sql.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nexport type MySql2Client = Pool | Connection;\n\nexport type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\nexport type MySqlQueryResultType = RowDataPacket[][] | RowDataPacket[] | OkPacket | OkPacket[] | ResultSetHeader;\nexport type MySqlQueryResult<\n\tT = any,\n> = [T extends ResultSetHeader ? T : T[], FieldPacket[]];\n\nexport class MySql2PreparedQuery<T extends MySqlPreparedQueryConfig> extends MySqlPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'MySql2PreparedQuery';\n\n\tprivate rawQuery: QueryOptions;\n\tprivate query: QueryOptions;\n\n\tconstructor(\n\t\tprivate client: MySql2Client,\n\t\tqueryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\t// Keys that were used in $default and the value that was generated for them\n\t\tprivate generatedIds?: Record<string, unknown>[],\n\t\t// Keys that should be returned, it has the column with all properries + key from object\n\t\tprivate returningIds?: SelectedFieldsOrdered,\n\t) {\n\t\tsuper(cache, queryMetadata, cacheConfig);\n\t\tthis.rawQuery = {\n\t\t\tsql: queryString,\n\t\t\t// rowsAsArray: true,\n\t\t\ttypeCast: function(field: any, next: any) {\n\t\t\t\tif (field.type === 'TIMESTAMP' || field.type === 'DATETIME' || field.type === 'DATE') {\n\t\t\t\t\treturn field.string();\n\t\t\t\t}\n\t\t\t\treturn next();\n\t\t\t},\n\t\t};\n\t\tthis.query = {\n\t\t\tsql: queryString,\n\t\t\trowsAsArray: true,\n\t\t\ttypeCast: function(field: any, next: any) {\n\t\t\t\tif (field.type === 'TIMESTAMP' || field.type === 'DATETIME' || field.type === 'DATE') {\n\t\t\t\t\treturn field.string();\n\t\t\t\t}\n\t\t\t\treturn next();\n\t\t\t},\n\t\t};\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\tthis.logger.logQuery(this.rawQuery.sql, params);\n\n\t\tconst { fields, client, rawQuery, query, joinsNotNullableMap, customResultMapper, returningIds, generatedIds } =\n\t\t\tthis;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst res = await this.queryWithCache(rawQuery.sql, params, async () => {\n\t\t\t\treturn await client.query<any>(rawQuery, params);\n\t\t\t});\n\n\t\t\tconst insertId = res[0].insertId;\n\t\t\tconst affectedRows = res[0].affectedRows;\n\t\t\t// for each row, I need to check keys from\n\t\t\tif (returningIds) {\n\t\t\t\tconst returningResponse = [];\n\t\t\t\tlet j = 0;\n\t\t\t\tfor (let i = insertId; i < insertId + affectedRows; i++) {\n\t\t\t\t\tfor (const column of returningIds) {\n\t\t\t\t\t\tconst key = returningIds[0]!.path[0]!;\n\t\t\t\t\t\tif (is(column.field, Column)) {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tif (column.field.primary && column.field.autoIncrement) {\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: i });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (column.field.defaultFn && generatedIds) {\n\t\t\t\t\t\t\t\t// generatedIds[rowIdx][key]\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: generatedIds[j]![key] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tj++;\n\t\t\t\t}\n\n\t\t\t\treturn returningResponse;\n\t\t\t}\n\t\t\treturn res;\n\t\t}\n\n\t\tconst result = await this.queryWithCache(query.sql, params, async () => {\n\t\t\treturn await client.query<any[]>(query, params);\n\t\t});\n\n\t\tconst rows = result[0];\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows);\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t}\n\n\tasync *iterator(\n\t\tplaceholderValues: Record<string, unknown> = {},\n\t): AsyncGenerator<T['execute'] extends any[] ? T['execute'][number] : T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\t\tconst conn = ((isPool(this.client) ? await this.client.getConnection() : this.client) as {} as {\n\t\t\tconnection: CallbackConnection;\n\t\t}).connection;\n\n\t\tconst { fields, query, rawQuery, joinsNotNullableMap, client, customResultMapper } = this;\n\t\tconst hasRowsMapper = Boolean(fields || customResultMapper);\n\t\tconst driverQuery = hasRowsMapper ? conn.query(query, params) : conn.query(rawQuery, params);\n\n\t\tconst stream = driverQuery.stream();\n\n\t\tfunction dataListener() {\n\t\t\tstream.pause();\n\t\t}\n\n\t\tstream.on('data', dataListener);\n\n\t\ttry {\n\t\t\tconst onEnd = once(stream, 'end');\n\t\t\tconst onError = once(stream, 'error');\n\n\t\t\twhile (true) {\n\t\t\t\tstream.resume();\n\t\t\t\tconst row = await Promise.race([onEnd, onError, new Promise((resolve) => stream.once('data', resolve))]);\n\t\t\t\tif (row === undefined || (Array.isArray(row) && row.length === 0)) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (row instanceof Error) { // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t\t\tthrow row;\n\t\t\t\t} else {\n\t\t\t\t\tif (hasRowsMapper) {\n\t\t\t\t\t\tif (customResultMapper) {\n\t\t\t\t\t\t\tconst mappedRow = customResultMapper([row as unknown[]]);\n\t\t\t\t\t\t\tyield (Array.isArray(mappedRow) ? mappedRow[0] : mappedRow);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tyield mapResultRow(fields!, row as unknown[], joinsNotNullableMap);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tyield row as T['execute'];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tstream.off('data', dataListener);\n\t\t\tif (isPool(client)) {\n\t\t\t\tconn.end();\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport interface MySql2SessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n\tmode: Mode;\n}\n\nexport class MySql2Session<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlSession<MySqlQueryResultHKT, MySql2PreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'MySql2Session';\n\n\tprivate logger: Logger;\n\tprivate mode: Mode;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: MySql2Client,\n\t\tdialect: MySqlDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: MySql2SessionOptions,\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t\tthis.mode = options.mode;\n\t}\n\n\tprepareQuery<T extends MySqlPreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tgeneratedIds?: Record<string, unknown>[],\n\t\treturningIds?: SelectedFieldsOrdered,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PreparedQueryKind<MySql2PreparedQueryHKT, T> {\n\t\t// Add returningId fields\n\t\t// Each driver gets them from response from database\n\t\treturn new MySql2PreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tcustomResultMapper,\n\t\t\tgeneratedIds,\n\t\t\treturningIds,\n\t\t) as PreparedQueryKind<MySql2PreparedQueryHKT, T>;\n\t}\n\n\t/**\n\t * @internal\n\t * What is its purpose?\n\t */\n\tasync query(query: string, params: unknown[]): Promise<MySqlQueryResult> {\n\t\tthis.logger.logQuery(query, params);\n\t\tconst result = await this.client.query({\n\t\t\tsql: query,\n\t\t\tvalues: params,\n\t\t\trowsAsArray: true,\n\t\t\ttypeCast: function(field: any, next: any) {\n\t\t\t\tif (field.type === 'TIMESTAMP' || field.type === 'DATETIME' || field.type === 'DATE') {\n\t\t\t\t\treturn field.string();\n\t\t\t\t}\n\t\t\t\treturn next();\n\t\t\t},\n\t\t});\n\t\treturn result;\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\tconst querySql = this.dialect.sqlToQuery(query);\n\t\tthis.logger.logQuery(querySql.sql, querySql.params);\n\t\treturn this.client.execute(querySql.sql, querySql.params).then((result) => result[0]) as Promise<T[]>;\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: MySql2Transaction<TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: MySqlTransactionConfig,\n\t): Promise<T> {\n\t\tconst session = isPool(this.client)\n\t\t\t? new MySql2Session(\n\t\t\t\tawait this.client.getConnection(),\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.options,\n\t\t\t)\n\t\t\t: this;\n\t\tconst tx = new MySql2Transaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tsession as MySqlSession<any, any, any, any>,\n\t\t\tthis.schema,\n\t\t\t0,\n\t\t\tthis.mode,\n\t\t);\n\t\tif (config) {\n\t\t\tconst setTransactionConfigSql = this.getSetTransactionSQL(config);\n\t\t\tif (setTransactionConfigSql) {\n\t\t\t\tawait tx.execute(setTransactionConfigSql);\n\t\t\t}\n\t\t\tconst startTransactionSql = this.getStartTransactionSQL(config);\n\t\t\tawait (startTransactionSql ? tx.execute(startTransactionSql) : tx.execute(sql`begin`));\n\t\t} else {\n\t\t\tawait tx.execute(sql`begin`);\n\t\t}\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql`rollback`);\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tif (isPool(this.client)) {\n\t\t\t\t(session.client as PoolConnection).release();\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport class MySql2Transaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlTransaction<MySql2QueryResultHKT, MySql2PreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'MySql2Transaction';\n\n\toverride async transaction<T>(transaction: (tx: MySql2Transaction<TFullSchema, TSchema>) => Promise<T>): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new MySql2Transaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t\tthis.mode,\n\t\t);\n\t\tawait tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nfunction isPool(client: MySql2Client): client is Pool {\n\treturn 'getConnection' in client;\n}\n\nexport interface MySql2QueryResultHKT extends MySqlQueryResultHKT {\n\ttype: MySqlRawQueryResult;\n}\n\nexport interface MySql2PreparedQueryHKT extends MySqlPreparedQueryHKT {\n\ttype: MySql2PreparedQuery<Assume<this['config'], MySqlPreparedQueryConfig>>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/neon/index.ts",
    "content": "export * from './neon-auth.ts';\nexport * from './rls.ts';\n"
  },
  {
    "path": "drizzle-orm/src/neon/neon-auth.ts",
    "content": "import { jsonb, pgSchema, text, timestamp } from '~/pg-core/index.ts';\n\nconst neonAuthSchema = pgSchema('neon_auth');\n\n/**\n * Table schema of the `users_sync` table used by Neon Auth.\n * This table automatically synchronizes and stores user data from external authentication providers.\n *\n * @schema neon_auth\n * @table users_sync\n */\nexport const usersSync = neonAuthSchema.table('users_sync', {\n\trawJson: jsonb('raw_json').notNull(),\n\tid: text().primaryKey().notNull(),\n\tname: text(),\n\temail: text(),\n\tcreatedAt: timestamp('created_at', { withTimezone: true, mode: 'string' }),\n\tdeletedAt: timestamp('deleted_at', { withTimezone: true, mode: 'string' }),\n\tupdatedAt: timestamp('updated_at', { withTimezone: true, mode: 'string' }),\n});\n"
  },
  {
    "path": "drizzle-orm/src/neon/rls.ts",
    "content": "import { is } from '~/entity.ts';\nimport { type AnyPgColumn, pgPolicy, type PgPolicyToOption } from '~/pg-core/index.ts';\nimport { PgRole, pgRole } from '~/pg-core/roles.ts';\nimport { type SQL, sql } from '~/sql/sql.ts';\n\n/**\n * Generates a set of PostgreSQL row-level security (RLS) policies for CRUD operations based on the provided options.\n *\n * @param options - An object containing the policy configuration.\n * @param options.role - The PostgreSQL role(s) to apply the policy to. Can be a single `PgRole` instance or an array of `PgRole` instances or role names.\n * @param options.read - The SQL expression or boolean value that defines the read policy. Set to `true` to allow all reads, `false` to deny all reads, or provide a custom SQL expression. Set to `null` to prevent the policy from being generated.\n * @param options.modify - The SQL expression or boolean value that defines the modify (insert, update, delete) policies. Set to `true` to allow all modifications, `false` to deny all modifications, or provide a custom SQL expression. Set to `null` to prevent policies from being generated.\n * @returns An array of PostgreSQL policy definitions, one for each CRUD operation.\n */\nexport const crudPolicy = (options: {\n\trole: PgPolicyToOption;\n\tread: SQL | boolean | null;\n\tmodify: SQL | boolean | null;\n}) => {\n\tif (options.read === undefined) {\n\t\tthrow new Error('crudPolicy requires a read policy');\n\t}\n\n\tif (options.modify === undefined) {\n\t\tthrow new Error('crudPolicy requires a modify policy');\n\t}\n\n\tlet read: SQL | undefined;\n\tif (options.read === true) {\n\t\tread = sql`true`;\n\t} else if (options.read === false) {\n\t\tread = sql`false`;\n\t} else if (options.read !== null) {\n\t\tread = options.read;\n\t}\n\n\tlet modify: SQL | undefined;\n\tif (options.modify === true) {\n\t\tmodify = sql`true`;\n\t} else if (options.modify === false) {\n\t\tmodify = sql`false`;\n\t} else if (options.modify !== null) {\n\t\tmodify = options.modify;\n\t}\n\n\tlet rolesName = '';\n\tif (Array.isArray(options.role)) {\n\t\trolesName = options.role\n\t\t\t.map((it) => {\n\t\t\t\treturn is(it, PgRole) ? it.name : (it as string);\n\t\t\t})\n\t\t\t.join('-');\n\t} else {\n\t\trolesName = is(options.role, PgRole)\n\t\t\t? options.role.name\n\t\t\t: (options.role as string);\n\t}\n\n\treturn [\n\t\tread\n\t\t&& pgPolicy(`crud-${rolesName}-policy-select`, {\n\t\t\tfor: 'select',\n\t\t\tto: options.role,\n\t\t\tusing: read,\n\t\t}),\n\n\t\tmodify\n\t\t&& pgPolicy(`crud-${rolesName}-policy-insert`, {\n\t\t\tfor: 'insert',\n\t\t\tto: options.role,\n\t\t\twithCheck: modify,\n\t\t}),\n\t\tmodify\n\t\t&& pgPolicy(`crud-${rolesName}-policy-update`, {\n\t\t\tfor: 'update',\n\t\t\tto: options.role,\n\t\t\tusing: modify,\n\t\t\twithCheck: modify,\n\t\t}),\n\t\tmodify\n\t\t&& pgPolicy(`crud-${rolesName}-policy-delete`, {\n\t\t\tfor: 'delete',\n\t\t\tto: options.role,\n\t\t\tusing: modify,\n\t\t}),\n\t].filter(Boolean);\n};\n\n// These are default roles that Neon will set up.\nexport const authenticatedRole = pgRole('authenticated').existing();\nexport const anonymousRole = pgRole('anonymous').existing();\n\nexport const authUid = (userIdColumn: AnyPgColumn) => sql`(select auth.user_id() = ${userIdColumn})`;\n"
  },
  {
    "path": "drizzle-orm/src/neon-http/driver.ts",
    "content": "import type { HTTPQueryOptions, HTTPTransactionOptions, NeonQueryFunction } from '@neondatabase/serverless';\nimport { neon, types } from '@neondatabase/serverless';\nimport type { BatchItem, BatchResponse } from '~/batch.ts';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport { createTableRelationsHelpers, extractTablesRelationalConfig } from '~/relations.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { type NeonHttpClient, type NeonHttpQueryResultHKT, NeonHttpSession } from './session.ts';\n\nexport interface NeonDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class NeonHttpDriver {\n\tstatic readonly [entityKind]: string = 'NeonHttpDriver';\n\n\tconstructor(\n\t\tprivate client: NeonHttpClient,\n\t\tprivate dialect: PgDialect,\n\t\tprivate options: NeonDriverOptions = {},\n\t) {\n\t\tthis.initMappers();\n\t}\n\n\tcreateSession(\n\t\tschema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,\n\t): NeonHttpSession<Record<string, unknown>, TablesRelationalConfig> {\n\t\treturn new NeonHttpSession(this.client, this.dialect, schema, {\n\t\t\tlogger: this.options.logger,\n\t\t\tcache: this.options.cache,\n\t\t});\n\t}\n\n\tinitMappers() {\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMPTZ, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMP, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.DATE, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.INTERVAL, (val) => val);\n\t\ttypes.setTypeParser(1231, (val) => val);\n\t\ttypes.setTypeParser(1115, (val) => val);\n\t\ttypes.setTypeParser(1185, (val) => val);\n\t\ttypes.setTypeParser(1187, (val) => val);\n\t\ttypes.setTypeParser(1182, (val) => val);\n\t}\n}\n\nfunction wrap<T extends object>(\n\ttarget: T,\n\ttoken: Exclude<HTTPQueryOptions<true, true>['authToken'], undefined>,\n\tcb: (target: any, p: string | symbol, res: any) => any,\n\tdeep?: boolean,\n) {\n\treturn new Proxy(target, {\n\t\tget(target, p) {\n\t\t\tconst element = target[p as keyof typeof p];\n\t\t\tif (typeof element !== 'function' && (typeof element !== 'object' || element === null)) return element;\n\n\t\t\tif (deep) return wrap(element, token, cb);\n\t\t\tif (p === 'query') return wrap(element, token, cb, true);\n\n\t\t\treturn new Proxy(element as any, {\n\t\t\t\tapply(target, thisArg, argArray) {\n\t\t\t\t\tconst res = target.call(thisArg, ...argArray);\n\t\t\t\t\tif (typeof res === 'object' && res !== null && 'setToken' in res && typeof res.setToken === 'function') {\n\t\t\t\t\t\tres.setToken(token);\n\t\t\t\t\t}\n\t\t\t\t\treturn cb(target, p, res);\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t});\n}\n\nexport class NeonHttpDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<NeonHttpQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NeonHttpDatabase';\n\n\t$withAuth(\n\t\ttoken: Exclude<HTTPQueryOptions<true, true>['authToken'], undefined>,\n\t): Omit<\n\t\tthis,\n\t\tExclude<\n\t\t\tkeyof this,\n\t\t\t| '$count'\n\t\t\t| 'delete'\n\t\t\t| 'select'\n\t\t\t| 'selectDistinct'\n\t\t\t| 'selectDistinctOn'\n\t\t\t| 'update'\n\t\t\t| 'insert'\n\t\t\t| 'with'\n\t\t\t| 'query'\n\t\t\t| 'execute'\n\t\t\t| 'refreshMaterializedView'\n\t\t>\n\t> {\n\t\tthis.authToken = token;\n\n\t\treturn wrap(this, token, (target, p, res) => {\n\t\t\tif (p === 'with') {\n\t\t\t\treturn wrap(res, token, (_, __, res) => res);\n\t\t\t}\n\t\t\treturn res;\n\t\t});\n\t}\n\n\t/** @internal */\n\tdeclare readonly session: NeonHttpSession<TSchema, ExtractTablesWithRelations<TSchema>>;\n\n\tasync batch<U extends BatchItem<'pg'>, T extends Readonly<[U, ...U[]]>>(\n\t\tbatch: T,\n\t): Promise<BatchResponse<T>> {\n\t\treturn this.session.batch(batch) as Promise<BatchResponse<T>>;\n\t}\n}\n\nfunction construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NeonQueryFunction<any, any> = NeonQueryFunction<any, any>,\n>(\n\tclient: TClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): NeonHttpDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tconst dialect = new PgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst driver = new NeonHttpDriver(client, dialect, { logger, cache: config.cache });\n\tconst session = driver.createSession(schema);\n\n\tconst db = new NeonHttpDatabase(\n\t\tdialect,\n\t\tsession,\n\t\tschema as RelationalSchemaConfig<ExtractTablesWithRelations<TSchema>> | undefined,\n\t);\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NeonQueryFunction<any, any> = NeonQueryFunction<false, false>,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | ({ connectionString: string } & HTTPTransactionOptions<boolean, boolean>);\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): NeonHttpDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = neon(params[0] as string);\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& {\n\t\t\t\tconnection?:\n\t\t\t\t\t| ({\n\t\t\t\t\t\tconnectionString: string;\n\t\t\t\t\t} & HTTPTransactionOptions<boolean, boolean>)\n\t\t\t\t\t| string;\n\t\t\t\tclient?: TClient;\n\t\t\t}\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig);\n\n\t\tif (typeof connection === 'object') {\n\t\t\tconst { connectionString, ...options } = connection;\n\n\t\t\tconst instance = neon(connectionString, options);\n\n\t\t\treturn construct(instance, drizzleConfig) as any;\n\t\t}\n\n\t\tconst instance = neon(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): NeonHttpDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/neon-http/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/neon-http/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport { type SQL, sql } from '~/sql/sql.ts';\nimport type { NeonHttpDatabase } from './driver.ts';\n\n/**\n * This function reads migrationFolder and execute each unapplied migration and mark it as executed in database\n *\n * NOTE: The Neon HTTP driver does not support transactions. This means that if any part of a migration fails,\n * no rollback will be executed. Currently, you will need to handle unsuccessful migration yourself.\n * @param db - drizzle db instance\n * @param config - path to migration folder generated by drizzle-kit\n */\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: NeonHttpDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tconst migrationsTable = config.migrationsTable ?? '__drizzle_migrations';\n\tconst migrationsSchema = config.migrationsSchema ?? 'drizzle';\n\tconst migrationTableCreate = sql`\n\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} (\n\t\t\tid SERIAL PRIMARY KEY,\n\t\t\thash text NOT NULL,\n\t\t\tcreated_at bigint\n\t\t)\n\t`;\n\tawait db.session.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);\n\tawait db.session.execute(migrationTableCreate);\n\n\tconst dbMigrations = await db.session.all<{ id: number; hash: string; created_at: string }>(\n\t\tsql`select id, hash, created_at from ${sql.identifier(migrationsSchema)}.${\n\t\t\tsql.identifier(migrationsTable)\n\t\t} order by created_at desc limit 1`,\n\t);\n\n\tconst lastDbMigration = dbMigrations[0];\n\tconst rowsToInsert: SQL[] = [];\n\tfor await (const migration of migrations) {\n\t\tif (\n\t\t\t!lastDbMigration\n\t\t\t|| Number(lastDbMigration.created_at) < migration.folderMillis\n\t\t) {\n\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\tawait db.session.execute(sql.raw(stmt));\n\t\t\t}\n\n\t\t\trowsToInsert.push(\n\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t} (\"hash\", \"created_at\") values(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t);\n\t\t}\n\t}\n\n\tfor await (const rowToInsert of rowsToInsert) {\n\t\tawait db.session.execute(rowToInsert);\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/neon-http/session.ts",
    "content": "import type { FullQueryResults, NeonQueryFunction, NeonQueryPromise } from '@neondatabase/serverless';\nimport type { BatchItem } from '~/batch.ts';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgTransaction } from '~/pg-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport { PgPreparedQuery as PgPreparedQuery, PgSession } from '~/pg-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport { fillPlaceholders, type Query, type SQL } from '~/sql/sql.ts';\nimport { mapResultRow, type NeonAuthToken } from '~/utils.ts';\n\nexport type NeonHttpClient = NeonQueryFunction<any, any>;\n\nconst rawQueryConfig = {\n\tarrayMode: false,\n\tfullResults: true,\n} as const;\nconst queryConfig = {\n\tarrayMode: true,\n\tfullResults: true,\n} as const;\n\nexport class NeonHttpPreparedQuery<T extends PreparedQueryConfig> extends PgPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'NeonHttpPreparedQuery';\n\tprivate clientQuery: (sql: string, params: any[], opts: Record<string, any>) => NeonQueryPromise<any, any>;\n\n\tconstructor(\n\t\tprivate client: NeonHttpClient,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t) {\n\t\tsuper(query, cache, queryMetadata, cacheConfig);\n\t\t// `client.query` is for @neondatabase/serverless v1.0.0 and up, where the\n\t\t// root query function `client` is only usable as a template function;\n\t\t// `client` is a fallback for earlier versions\n\t\tthis.clientQuery = (client as any).query ?? client as any;\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined): Promise<T['execute']>;\n\t/** @internal */\n\tasync execute(placeholderValues: Record<string, unknown> | undefined, token?: NeonAuthToken): Promise<T['execute']>;\n\t/** @internal */\n\tasync execute(\n\t\tplaceholderValues: Record<string, unknown> | undefined = {},\n\t\ttoken: NeonAuthToken | undefined = this.authToken,\n\t): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\n\t\tthis.logger.logQuery(this.query.sql, params);\n\n\t\tconst { fields, clientQuery, query, customResultMapper } = this;\n\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn this.queryWithCache(query.sql, params, async () => {\n\t\t\t\treturn clientQuery(\n\t\t\t\t\tquery.sql,\n\t\t\t\t\tparams,\n\t\t\t\t\ttoken === undefined\n\t\t\t\t\t\t? rawQueryConfig\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t...rawQueryConfig,\n\t\t\t\t\t\t\tauthToken: token,\n\t\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\tconst result = await this.queryWithCache(query.sql, params, async () => {\n\t\t\treturn await clientQuery(\n\t\t\t\tquery.sql,\n\t\t\t\tparams,\n\t\t\t\ttoken === undefined\n\t\t\t\t\t? queryConfig\n\t\t\t\t\t: {\n\t\t\t\t\t\t...queryConfig,\n\t\t\t\t\t\tauthToken: token,\n\t\t\t\t\t},\n\t\t\t);\n\t\t});\n\n\t\treturn this.mapResult(result);\n\t}\n\n\toverride mapResult(result: unknown): unknown {\n\t\tif (!this.fields && !this.customResultMapper) {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst rows = (result as FullQueryResults<true>).rows;\n\n\t\tif (this.customResultMapper) {\n\t\t\treturn this.customResultMapper(rows);\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow(this.fields!, row, this.joinsNotNullableMap));\n\t}\n\n\tall(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['all']> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.clientQuery(\n\t\t\tthis.query.sql,\n\t\t\tparams,\n\t\t\tthis.authToken === undefined ? rawQueryConfig : {\n\t\t\t\t...rawQueryConfig,\n\t\t\t\tauthToken: this.authToken,\n\t\t\t},\n\t\t).then((result) => result.rows);\n\t}\n\n\tvalues(placeholderValues: Record<string, unknown> | undefined): Promise<T['values']>;\n\t/** @internal */\n\tvalues(placeholderValues: Record<string, unknown> | undefined, token?: NeonAuthToken): Promise<T['values']>;\n\t/** @internal */\n\tvalues(placeholderValues: Record<string, unknown> | undefined = {}, token?: NeonAuthToken): Promise<T['values']> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.clientQuery(this.query.sql, params, { arrayMode: true, fullResults: true, authToken: token }).then((\n\t\t\tresult,\n\t\t) => result.rows);\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode() {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport interface NeonHttpSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class NeonHttpSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgSession<NeonHttpQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NeonHttpSession';\n\n\tprivate clientQuery: (sql: string, params: any[], opts: Record<string, any>) => NeonQueryPromise<any, any>;\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: NeonHttpClient,\n\t\tdialect: PgDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: NeonHttpSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\t// `client.query` is for @neondatabase/serverless v1.0.0 and up, where the\n\t\t// root query function `client` is only usable as a template function;\n\t\t// `client` is a fallback for earlier versions\n\t\tthis.clientQuery = (client as any).query ?? client as any;\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgPreparedQuery<T> {\n\t\treturn new NeonHttpPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\tasync batch<U extends BatchItem<'pg'>, T extends Readonly<[U, ...U[]]>>(\n\t\tqueries: T,\n\t) {\n\t\tconst preparedQueries: PreparedQuery[] = [];\n\t\tconst builtQueries: NeonQueryPromise<any, true>[] = [];\n\t\tfor (const query of queries) {\n\t\t\tconst preparedQuery = query._prepare();\n\t\t\tconst builtQuery = preparedQuery.getQuery();\n\t\t\tpreparedQueries.push(preparedQuery);\n\t\t\tbuiltQueries.push(\n\t\t\t\tthis.clientQuery(builtQuery.sql, builtQuery.params, {\n\t\t\t\t\tfullResults: true,\n\t\t\t\t\tarrayMode: preparedQuery.isResponseInArrayMode(),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst batchResults = await this.client.transaction(builtQueries, queryConfig);\n\n\t\treturn batchResults.map((result, i) => preparedQueries[i]!.mapResult(result, true)) as any;\n\t}\n\n\t// change return type to QueryRows<true>\n\tasync query(query: string, params: unknown[]): Promise<FullQueryResults<true>> {\n\t\tthis.logger.logQuery(query, params);\n\t\tconst result = await this.clientQuery(query, params, { arrayMode: true, fullResults: true });\n\t\treturn result;\n\t}\n\n\t// change return type to QueryRows<false>\n\tasync queryObjects(\n\t\tquery: string,\n\t\tparams: unknown[],\n\t): Promise<FullQueryResults<false>> {\n\t\treturn this.clientQuery(query, params, { arrayMode: false, fullResults: true });\n\t}\n\n\toverride async count(sql: SQL): Promise<number>;\n\t/** @internal */\n\toverride async count(sql: SQL, token?: NeonAuthToken): Promise<number>;\n\t/** @internal */\n\toverride async count(sql: SQL, token?: NeonAuthToken): Promise<number> {\n\t\tconst res = await this.execute<{ rows: [{ count: string }] }>(sql, token);\n\n\t\treturn Number(\n\t\t\tres['rows'][0]['count'],\n\t\t);\n\t}\n\n\toverride async transaction<T>(\n\t\t_transaction: (tx: NeonTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t_config: PgTransactionConfig = {},\n\t): Promise<T> {\n\t\tthrow new Error('No transactions support in neon-http driver');\n\t}\n}\n\nexport class NeonTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgTransaction<NeonHttpQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NeonHttpTransaction';\n\n\toverride async transaction<T>(_transaction: (tx: NeonTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T> {\n\t\tthrow new Error('No transactions support in neon-http driver');\n\t\t// const savepointName = `sp${this.nestedIndex + 1}`;\n\t\t// const tx = new NeonTransaction(this.dialect, this.session, this.schema, this.nestedIndex + 1);\n\t\t// await tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\t// try {\n\t\t// \tconst result = await transaction(tx);\n\t\t// \tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t// \treturn result;\n\t\t// } catch (e) {\n\t\t// \tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t// \tthrow e;\n\t\t// }\n\t}\n}\n\nexport type NeonHttpQueryResult<T> = Omit<FullQueryResults<false>, 'rows'> & { rows: T[] };\n\nexport interface NeonHttpQueryResultHKT extends PgQueryResultHKT {\n\ttype: NeonHttpQueryResult<this['row']>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/neon-serverless/driver.ts",
    "content": "import { neonConfig, Pool, type PoolConfig } from '@neondatabase/serverless';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport type { NeonClient, NeonQueryResultHKT } from './session.ts';\nimport { NeonSession } from './session.ts';\n\nexport interface NeonDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class NeonDriver {\n\tstatic readonly [entityKind]: string = 'NeonDriver';\n\n\tconstructor(\n\t\tprivate client: NeonClient,\n\t\tprivate dialect: PgDialect,\n\t\tprivate options: NeonDriverOptions = {},\n\t) {\n\t}\n\n\tcreateSession(\n\t\tschema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,\n\t): NeonSession<Record<string, unknown>, TablesRelationalConfig> {\n\t\treturn new NeonSession(this.client, this.dialect, schema, {\n\t\t\tlogger: this.options.logger,\n\t\t\tcache: this.options.cache,\n\t\t});\n\t}\n}\n\nexport class NeonDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<NeonQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NeonServerlessDatabase';\n}\n\nfunction construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NeonClient = NeonClient,\n>(\n\tclient: TClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): NeonDatabase<TSchema> & {\n\t$client: NeonClient extends TClient ? Pool : TClient;\n} {\n\tconst dialect = new PgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst driver = new NeonDriver(client, dialect, { logger, cache: config.cache });\n\tconst session = driver.createSession(schema);\n\tconst db = new NeonDatabase(dialect, session, schema as any) as NeonDatabase<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NeonClient = Pool,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | PoolConfig;\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t\t& {\n\t\t\t\tws?: any;\n\t\t\t}\n\t\t),\n\t]\n): NeonDatabase<TSchema> & {\n\t$client: NeonClient extends TClient ? Pool : TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = new Pool({\n\t\t\tconnectionString: params[0],\n\t\t});\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ws, ...drizzleConfig } = params[0] as {\n\t\t\tconnection?: PoolConfig | string;\n\t\t\tws?: any;\n\t\t\tclient?: TClient;\n\t\t} & DrizzleConfig<TSchema>;\n\n\t\tif (ws) {\n\t\t\tneonConfig.webSocketConstructor = ws;\n\t\t}\n\n\t\tif (client) return construct(client, drizzleConfig);\n\n\t\tconst instance = typeof connection === 'string'\n\t\t\t? new Pool({\n\t\t\t\tconnectionString: connection,\n\t\t\t})\n\t\t\t: new Pool(connection);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): NeonDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/neon-serverless/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/neon-serverless/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { NeonDatabase } from './driver.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: NeonDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tawait db.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/neon-serverless/session.ts",
    "content": "import {\n\ttype Client,\n\tPool,\n\ttype PoolClient,\n\ttype QueryArrayConfig,\n\ttype QueryConfig,\n\ttype QueryResult,\n\ttype QueryResultRow,\n\ttypes,\n} from '@neondatabase/serverless';\nimport { type Cache, NoopCache } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgTransaction } from '~/pg-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport { PgPreparedQuery, PgSession } from '~/pg-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nexport type NeonClient = Pool | PoolClient | Client;\n\nexport class NeonPreparedQuery<T extends PreparedQueryConfig> extends PgPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'NeonPreparedQuery';\n\n\tprivate rawQueryConfig: QueryConfig;\n\tprivate queryConfig: QueryArrayConfig;\n\n\tconstructor(\n\t\tprivate client: NeonClient,\n\t\tqueryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t\tthis.rawQueryConfig = {\n\t\t\tname,\n\t\t\ttext: queryString,\n\t\t\ttypes: {\n\t\t\t\t// @ts-ignore\n\t\t\t\tgetTypeParser: (typeId, format) => {\n\t\t\t\t\tif (typeId === types.builtins.TIMESTAMPTZ) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.TIMESTAMP) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.DATE) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.INTERVAL) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// numeric[]\n\t\t\t\t\tif (typeId === 1231) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// timestamp[]\n\t\t\t\t\tif (typeId === 1115) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// timestamp with timezone[]\n\t\t\t\t\tif (typeId === 1185) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// interval[]\n\t\t\t\t\tif (typeId === 1187) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// date[]\n\t\t\t\t\tif (typeId === 1182) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\treturn types.getTypeParser(typeId, format);\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\tthis.queryConfig = {\n\t\t\tname,\n\t\t\ttext: queryString,\n\t\t\trowMode: 'array',\n\t\t\ttypes: {\n\t\t\t\t// @ts-ignore\n\t\t\t\tgetTypeParser: (typeId, format) => {\n\t\t\t\t\tif (typeId === types.builtins.TIMESTAMPTZ) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.TIMESTAMP) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.DATE) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.INTERVAL) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// numeric[]\n\t\t\t\t\tif (typeId === 1231) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// timestamp[]\n\t\t\t\t\tif (typeId === 1115) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// timestamp with timezone[]\n\t\t\t\t\tif (typeId === 1185) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// interval[]\n\t\t\t\t\tif (typeId === 1187) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// date[]\n\t\t\t\t\tif (typeId === 1182) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\treturn types.getTypeParser(typeId, format);\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\tthis.logger.logQuery(this.rawQueryConfig.text, params);\n\n\t\tconst { fields, client, rawQueryConfig: rawQuery, queryConfig: query, joinsNotNullableMap, customResultMapper } =\n\t\t\tthis;\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn await this.queryWithCache(rawQuery.text, params, async () => {\n\t\t\t\treturn await client.query(rawQuery, params);\n\t\t\t});\n\t\t}\n\n\t\tconst result = await this.queryWithCache(query.text, params, async () => {\n\t\t\treturn await client.query(query, params);\n\t\t});\n\n\t\treturn customResultMapper\n\t\t\t? customResultMapper(result.rows)\n\t\t\t: result.rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t}\n\n\tall(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['all']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\t\tthis.logger.logQuery(this.rawQueryConfig.text, params);\n\t\treturn this.queryWithCache(this.rawQueryConfig.text, params, async () => {\n\t\t\treturn await this.client.query(this.rawQueryConfig, params);\n\t\t}).then((result) => result.rows);\n\t}\n\n\tvalues(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['values']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\t\tthis.logger.logQuery(this.rawQueryConfig.text, params);\n\t\treturn this.queryWithCache(this.queryConfig.text, params, async () => {\n\t\t\treturn await this.client.query(this.queryConfig, params);\n\t\t}).then((result) => result.rows);\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport interface NeonSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class NeonSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgSession<NeonQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NeonSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: NeonClient,\n\t\tdialect: PgDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: NeonSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgPreparedQuery<T> {\n\t\treturn new NeonPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tname,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\tasync query(query: string, params: unknown[]): Promise<QueryResult> {\n\t\tthis.logger.logQuery(query, params);\n\t\tconst result = await this.client.query({\n\t\t\trowMode: 'array',\n\t\t\ttext: query,\n\t\t\tvalues: params,\n\t\t});\n\t\treturn result;\n\t}\n\n\tasync queryObjects<T extends QueryResultRow>(\n\t\tquery: string,\n\t\tparams: unknown[],\n\t): Promise<QueryResult<T>> {\n\t\treturn this.client.query<T>(query, params);\n\t}\n\n\toverride async count(sql: SQL): Promise<number> {\n\t\tconst res = await this.execute<{ rows: [{ count: string }] }>(sql);\n\n\t\treturn Number(\n\t\t\tres['rows'][0]['count'],\n\t\t);\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: NeonTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig: PgTransactionConfig = {},\n\t): Promise<T> {\n\t\tconst session = this.client instanceof Pool // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t? new NeonSession(await this.client.connect(), this.dialect, this.schema, this.options)\n\t\t\t: this;\n\t\tconst tx = new NeonTransaction<TFullSchema, TSchema>(this.dialect, session, this.schema);\n\t\tawait tx.execute(sql`begin ${tx.getTransactionConfigSQL(config)}`);\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tawait tx.execute(sql`rollback`);\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tif (this.client instanceof Pool) { // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t\t(session.client as PoolClient).release();\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport class NeonTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgTransaction<NeonQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NeonTransaction';\n\n\toverride async transaction<T>(transaction: (tx: NeonTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new NeonTransaction<TFullSchema, TSchema>(this.dialect, this.session, this.schema, this.nestedIndex + 1);\n\t\tawait tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (e) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow e;\n\t\t}\n\t}\n}\n\nexport interface NeonQueryResultHKT extends PgQueryResultHKT {\n\ttype: QueryResult<Assume<this['row'], QueryResultRow>>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/node-postgres/driver.ts",
    "content": "import pg, { type Pool, type PoolConfig } from 'pg';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport type { NodePgClient, NodePgQueryResultHKT } from './session.ts';\nimport { NodePgSession } from './session.ts';\n\nexport interface PgDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class NodePgDriver {\n\tstatic readonly [entityKind]: string = 'NodePgDriver';\n\n\tconstructor(\n\t\tprivate client: NodePgClient,\n\t\tprivate dialect: PgDialect,\n\t\tprivate options: PgDriverOptions = {},\n\t) {\n\t}\n\n\tcreateSession(\n\t\tschema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,\n\t): NodePgSession<Record<string, unknown>, TablesRelationalConfig> {\n\t\treturn new NodePgSession(this.client, this.dialect, schema, {\n\t\t\tlogger: this.options.logger,\n\t\t\tcache: this.options.cache,\n\t\t});\n\t}\n}\n\nexport class NodePgDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<NodePgQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NodePgDatabase';\n}\n\nfunction construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NodePgClient = NodePgClient,\n>(\n\tclient: TClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): NodePgDatabase<TSchema> & {\n\t$client: NodePgClient extends TClient ? Pool : TClient;\n} {\n\tconst dialect = new PgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst driver = new NodePgDriver(client, dialect, { logger, cache: config.cache });\n\tconst session = driver.createSession(schema);\n\tconst db = new NodePgDatabase(dialect, session, schema as any) as NodePgDatabase<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NodePgClient = Pool,\n>(\n\t...params:\n\t\t| [\n\t\t\tTClient | string,\n\t\t]\n\t\t| [\n\t\t\tTClient | string,\n\t\t\tDrizzleConfig<TSchema>,\n\t\t]\n\t\t| [\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tclient: TClient;\n\t\t\t} | {\n\t\t\t\tconnection: string | PoolConfig;\n\t\t\t}),\n\t\t]\n): NodePgDatabase<TSchema> & {\n\t$client: NodePgClient extends TClient ? Pool : TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = new pg.Pool({\n\t\t\tconnectionString: params[0],\n\t\t});\n\n\t\treturn construct(instance, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as (\n\t\t\t& ({ connection?: PoolConfig | string; client?: TClient })\n\t\t\t& DrizzleConfig<TSchema>\n\t\t);\n\n\t\tif (client) return construct(client, drizzleConfig);\n\n\t\tconst instance = typeof connection === 'string'\n\t\t\t? new pg.Pool({\n\t\t\t\tconnectionString: connection,\n\t\t\t})\n\t\t\t: new pg.Pool(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): NodePgDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/node-postgres/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/node-postgres/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { NodePgDatabase } from './driver.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: NodePgDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tawait db.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/node-postgres/session.ts",
    "content": "import type { Client, PoolClient, QueryArrayConfig, QueryConfig, QueryResult, QueryResultRow } from 'pg';\nimport pg from 'pg';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport { type Logger, NoopLogger } from '~/logger.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgTransaction } from '~/pg-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport { PgPreparedQuery, PgSession } from '~/pg-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nconst { Pool, types } = pg;\n\nexport type NodePgClient = pg.Pool | PoolClient | Client;\n\nexport class NodePgPreparedQuery<T extends PreparedQueryConfig> extends PgPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'NodePgPreparedQuery';\n\n\tprivate rawQueryConfig: QueryConfig;\n\tprivate queryConfig: QueryArrayConfig;\n\n\tconstructor(\n\t\tprivate client: NodePgClient,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t\tthis.rawQueryConfig = {\n\t\t\tname,\n\t\t\ttext: queryString,\n\t\t\ttypes: {\n\t\t\t\t// @ts-ignore\n\t\t\t\tgetTypeParser: (typeId, format) => {\n\t\t\t\t\tif (typeId === types.builtins.TIMESTAMPTZ) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.TIMESTAMP) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.DATE) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.INTERVAL) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// numeric[]\n\t\t\t\t\tif (typeId === 1231) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// timestamp[]\n\t\t\t\t\tif (typeId === 1115) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// timestamp with timezone[]\n\t\t\t\t\tif (typeId === 1185) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// interval[]\n\t\t\t\t\tif (typeId === 1187) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// date[]\n\t\t\t\t\tif (typeId === 1182) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\treturn types.getTypeParser(typeId, format);\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\tthis.queryConfig = {\n\t\t\tname,\n\t\t\ttext: queryString,\n\t\t\trowMode: 'array',\n\t\t\ttypes: {\n\t\t\t\t// @ts-ignore\n\t\t\t\tgetTypeParser: (typeId, format) => {\n\t\t\t\t\tif (typeId === types.builtins.TIMESTAMPTZ) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.TIMESTAMP) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.DATE) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.INTERVAL) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// numeric[]\n\t\t\t\t\tif (typeId === 1231) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// timestamp[]\n\t\t\t\t\tif (typeId === 1115) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// timestamp with timezone[]\n\t\t\t\t\tif (typeId === 1185) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// interval[]\n\t\t\t\t\tif (typeId === 1187) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// date[]\n\t\t\t\t\tif (typeId === 1182) {\n\t\t\t\t\t\treturn (val) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\treturn types.getTypeParser(typeId, format);\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\treturn tracer.startActiveSpan('drizzle.execute', async () => {\n\t\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\t\tthis.logger.logQuery(this.rawQueryConfig.text, params);\n\n\t\t\tconst { fields, rawQueryConfig: rawQuery, client, queryConfig: query, joinsNotNullableMap, customResultMapper } =\n\t\t\t\tthis;\n\t\t\tif (!fields && !customResultMapper) {\n\t\t\t\treturn tracer.startActiveSpan('drizzle.driver.execute', async (span) => {\n\t\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t\t'drizzle.query.name': rawQuery.name,\n\t\t\t\t\t\t'drizzle.query.text': rawQuery.text,\n\t\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t\t});\n\t\t\t\t\treturn this.queryWithCache(rawQuery.text, params, async () => {\n\t\t\t\t\t\treturn await client.query(rawQuery, params);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result = await tracer.startActiveSpan('drizzle.driver.execute', (span) => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.name': query.name,\n\t\t\t\t\t'drizzle.query.text': query.text,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\t\t\t\treturn this.queryWithCache(query.text, params, async () => {\n\t\t\t\t\treturn await client.query(query, params);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn tracer.startActiveSpan('drizzle.mapResponse', () => {\n\t\t\t\treturn customResultMapper\n\t\t\t\t\t? customResultMapper(result.rows)\n\t\t\t\t\t: result.rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t\t\t});\n\t\t});\n\t}\n\n\tall(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['all']> {\n\t\treturn tracer.startActiveSpan('drizzle.execute', () => {\n\t\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\t\t\tthis.logger.logQuery(this.rawQueryConfig.text, params);\n\t\t\treturn tracer.startActiveSpan('drizzle.driver.execute', (span) => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.name': this.rawQueryConfig.name,\n\t\t\t\t\t'drizzle.query.text': this.rawQueryConfig.text,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\t\t\t\treturn this.queryWithCache(this.rawQueryConfig.text, params, async () => {\n\t\t\t\t\treturn this.client.query(this.rawQueryConfig, params);\n\t\t\t\t}).then((result) => result.rows);\n\t\t\t});\n\t\t});\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport interface NodePgSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class NodePgSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgSession<NodePgQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NodePgSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: NodePgClient,\n\t\tdialect: PgDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: NodePgSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgPreparedQuery<T> {\n\t\treturn new NodePgPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tname,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: NodePgTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig | undefined,\n\t): Promise<T> {\n\t\tconst isPool = this.client instanceof Pool || Object.getPrototypeOf(this.client).constructor.name.includes('Pool'); // eslint-disable-line no-instanceof/no-instanceof\n\t\tconst session = isPool\n\t\t\t? new NodePgSession(await (<pg.Pool> this.client).connect(), this.dialect, this.schema, this.options)\n\t\t\t: this;\n\t\tconst tx = new NodePgTransaction<TFullSchema, TSchema>(this.dialect, session, this.schema);\n\t\tawait tx.execute(sql`begin${config ? sql` ${tx.getTransactionConfigSQL(config)}` : undefined}`);\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tawait tx.execute(sql`rollback`);\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tif (isPool) (session.client as PoolClient).release();\n\t\t}\n\t}\n\n\toverride async count(sql: SQL): Promise<number> {\n\t\tconst res = await this.execute<{ rows: [{ count: string }] }>(sql);\n\t\treturn Number(\n\t\t\tres['rows'][0]['count'],\n\t\t);\n\t}\n}\n\nexport class NodePgTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgTransaction<NodePgQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NodePgTransaction';\n\n\toverride async transaction<T>(transaction: (tx: NodePgTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new NodePgTransaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\t\tawait tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport interface NodePgQueryResultHKT extends PgQueryResultHKT {\n\ttype: QueryResult<Assume<this['row'], QueryResultRow>>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/op-sqlite/driver.ts",
    "content": "import type { OPSQLiteConnection, QueryResult } from '@op-engineering/op-sqlite';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { BaseSQLiteDatabase } from '~/sqlite-core/db.ts';\nimport { SQLiteAsyncDialect } from '~/sqlite-core/dialect.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport { OPSQLiteSession } from './session.ts';\n\nexport class OPSQLiteDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends BaseSQLiteDatabase<'async', QueryResult, TSchema> {\n\tstatic override readonly [entityKind]: string = 'OPSQLiteDatabase';\n}\n\nexport function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: OPSQLiteConnection,\n\tconfig: DrizzleConfig<TSchema> = {},\n): OPSQLiteDatabase<TSchema> & {\n\t$client: OPSQLiteConnection;\n} {\n\tconst dialect = new SQLiteAsyncDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new OPSQLiteSession(client, dialect, schema, { logger, cache: config.cache });\n\tconst db = new OPSQLiteDatabase('async', dialect, session, schema) as OPSQLiteDatabase<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n"
  },
  {
    "path": "drizzle-orm/src/op-sqlite/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/op-sqlite/migrator.ts",
    "content": "import { useEffect, useReducer } from 'react';\nimport type { MigrationMeta } from '~/migrator.ts';\nimport type { OPSQLiteDatabase } from './driver.ts';\n\ninterface MigrationConfig {\n\tjournal: {\n\t\tentries: { idx: number; when: number; tag: string; breakpoints: boolean }[];\n\t};\n\tmigrations: Record<string, string>;\n}\n\nasync function readMigrationFiles({ journal, migrations }: MigrationConfig): Promise<MigrationMeta[]> {\n\tconst migrationQueries: MigrationMeta[] = [];\n\n\tfor await (const journalEntry of journal.entries) {\n\t\tconst query = migrations[`m${journalEntry.idx.toString().padStart(4, '0')}`];\n\n\t\tif (!query) {\n\t\t\tthrow new Error(`Missing migration: ${journalEntry.tag}`);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = query.split('--> statement-breakpoint').map((it) => {\n\t\t\t\treturn it;\n\t\t\t});\n\n\t\t\tmigrationQueries.push({\n\t\t\t\tsql: result,\n\t\t\t\tbps: journalEntry.breakpoints,\n\t\t\t\tfolderMillis: journalEntry.when,\n\t\t\t\thash: '',\n\t\t\t});\n\t\t} catch {\n\t\t\tthrow new Error(`Failed to parse migration: ${journalEntry.tag}`);\n\t\t}\n\t}\n\n\treturn migrationQueries;\n}\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: OPSQLiteDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = await readMigrationFiles(config);\n\treturn db.dialect.migrate(migrations, db.session);\n}\n\ninterface State {\n\tsuccess: boolean;\n\terror?: Error;\n}\n\ntype Action =\n\t| { type: 'migrating' }\n\t| { type: 'migrated'; payload: true }\n\t| { type: 'error'; payload: Error };\n\nexport const useMigrations = (db: OPSQLiteDatabase<any>, migrations: {\n\tjournal: {\n\t\tentries: { idx: number; when: number; tag: string; breakpoints: boolean }[];\n\t};\n\tmigrations: Record<string, string>;\n}): State => {\n\tconst initialState: State = {\n\t\tsuccess: false,\n\t\terror: undefined,\n\t};\n\n\tconst fetchReducer = (state: State, action: Action): State => {\n\t\tswitch (action.type) {\n\t\t\tcase 'migrating': {\n\t\t\t\treturn { ...initialState };\n\t\t\t}\n\t\t\tcase 'migrated': {\n\t\t\t\treturn { ...initialState, success: action.payload };\n\t\t\t}\n\t\t\tcase 'error': {\n\t\t\t\treturn { ...initialState, error: action.payload };\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t}\n\t};\n\n\tconst [state, dispatch] = useReducer(fetchReducer, initialState);\n\n\tuseEffect(() => {\n\t\tdispatch({ type: 'migrating' });\n\t\tmigrate(db, migrations).then(() => {\n\t\t\tdispatch({ type: 'migrated', payload: true });\n\t\t}).catch((error) => {\n\t\t\tdispatch({ type: 'error', payload: error as Error });\n\t\t});\n\t}, []);\n\n\treturn state;\n};\n"
  },
  {
    "path": "drizzle-orm/src/op-sqlite/session.ts",
    "content": "import type { OPSQLiteConnection, QueryResult } from '@op-engineering/op-sqlite';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, sql } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect } from '~/sqlite-core/dialect.ts';\nimport { SQLiteTransaction } from '~/sqlite-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts';\nimport {\n\ttype PreparedQueryConfig as PreparedQueryConfigBase,\n\ttype SQLiteExecuteMethod,\n\tSQLitePreparedQuery,\n\tSQLiteSession,\n\ttype SQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport interface OPSQLiteSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\ntype PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\n\nexport class OPSQLiteSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteSession<'async', QueryResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'OPSQLiteSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: OPSQLiteConnection,\n\t\tdialect: SQLiteAsyncDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: OPSQLiteSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => unknown,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): OPSQLitePreparedQuery<T> {\n\t\treturn new OPSQLitePreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\texecuteMethod,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: OPSQLiteTransaction<TFullSchema, TSchema>) => T,\n\t\tconfig: SQLiteTransactionConfig = {},\n\t): T {\n\t\tconst tx = new OPSQLiteTransaction('async', this.dialect, this, this.schema);\n\t\tthis.run(sql.raw(`begin${config?.behavior ? ' ' + config.behavior : ''}`));\n\t\ttry {\n\t\t\tconst result = transaction(tx);\n\t\t\tthis.run(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tthis.run(sql`rollback`);\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class OPSQLiteTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteTransaction<'async', QueryResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'OPSQLiteTransaction';\n\n\toverride transaction<T>(transaction: (tx: OPSQLiteTransaction<TFullSchema, TSchema>) => T): T {\n\t\tconst savepointName = `sp${this.nestedIndex}`;\n\t\tconst tx = new OPSQLiteTransaction('async', this.dialect, this.session, this.schema, this.nestedIndex + 1);\n\t\tthis.session.run(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = transaction(tx);\n\t\t\tthis.session.run(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tthis.session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class OPSQLitePreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends SQLitePreparedQuery<\n\t{ type: 'async'; run: QueryResult; all: T['all']; get: T['get']; values: T['values']; execute: T['execute'] }\n> {\n\tstatic override readonly [entityKind]: string = 'OPSQLitePreparedQuery';\n\n\tconstructor(\n\t\tprivate client: OPSQLiteConnection,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => unknown,\n\t) {\n\t\tsuper('sync', executeMethod, query, cache, queryMetadata, cacheConfig);\n\t}\n\n\tasync run(placeholderValues?: Record<string, unknown>): Promise<QueryResult> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\n\t\treturn await this.queryWithCache(this.query.sql, params, async () => {\n\t\t\treturn this.client.executeAsync(this.query.sql, params);\n\t\t});\n\t}\n\n\tasync all(placeholderValues?: Record<string, unknown>): Promise<T['all']> {\n\t\tconst { fields, joinsNotNullableMap, query, logger, customResultMapper, client } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\t\tlogger.logQuery(query.sql, params);\n\n\t\t\treturn await this.queryWithCache(query.sql, params, async () => {\n\t\t\t\treturn client.execute(query.sql, params).rows?._array || [];\n\t\t\t});\n\t\t}\n\n\t\tconst rows = await this.values(placeholderValues) as unknown[][];\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows) as T['all'];\n\t\t}\n\t\treturn rows.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));\n\t}\n\n\tasync get(placeholderValues?: Record<string, unknown>): Promise<T['get']> {\n\t\tconst { fields, joinsNotNullableMap, customResultMapper, query, logger, client } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\tlogger.logQuery(query.sql, params);\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst rows = await this.queryWithCache(query.sql, params, async () => {\n\t\t\t\treturn client.execute(query.sql, params).rows?._array || [];\n\t\t\t});\n\t\t\treturn rows[0];\n\t\t}\n\n\t\tconst rows = await this.values(placeholderValues) as unknown[][];\n\t\tconst row = rows[0];\n\n\t\tif (!row) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows) as T['get'];\n\t\t}\n\n\t\treturn mapResultRow(fields!, row, joinsNotNullableMap);\n\t}\n\n\tasync values(placeholderValues?: Record<string, unknown>): Promise<T['values']> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn await this.queryWithCache(this.query.sql, params, async () => {\n\t\t\treturn await this.client.executeRawAsync(this.query.sql, params);\n\t\t});\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/operations.ts",
    "content": "import type { AnyColumn, Column } from './column.ts';\nimport type { SQL } from './sql/sql.ts';\nimport type { Subquery } from './subquery.ts';\nimport type { Table } from './table.ts';\n\nexport type RequiredKeyOnly<TKey extends string, T extends Column> = T extends AnyColumn<{\n\tnotNull: true;\n\thasDefault: false;\n}> ? TKey\n\t: never;\n\nexport type OptionalKeyOnly<TKey extends string, T extends Column, OverrideT extends boolean | undefined = false> =\n\tTKey extends RequiredKeyOnly<TKey, T> ? never : T extends {\n\t\t_: {\n\t\t\tgenerated: undefined;\n\t\t};\n\t} ? (T extends {\n\t\t\t_: {\n\t\t\t\tidentity: undefined;\n\t\t\t};\n\t\t} ? TKey\n\t\t\t: T['_']['identity'] extends 'always' ? OverrideT extends true ? TKey : never\n\t\t\t: TKey)\n\t: never;\n\n// TODO: SQL -> SQLWrapper\nexport type SelectedFieldsFlat<TColumn extends Column> = Record<\n\tstring,\n\tTColumn | SQL | SQL.Aliased | Subquery\n>;\n\nexport type SelectedFieldsFlatFull<TColumn extends Column> = Record<\n\tstring,\n\tTColumn | SQL | SQL.Aliased\n>;\n\nexport type SelectedFields<TColumn extends Column, TTable extends Table> = Record<\n\tstring,\n\tSelectedFieldsFlat<TColumn>[string] | TTable | SelectedFieldsFlat<TColumn>\n>;\n\nexport type SelectedFieldsOrdered<TColumn extends Column> = {\n\tpath: string[];\n\tfield: TColumn | SQL | SQL.Aliased | Subquery;\n}[];\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/alias.ts",
    "content": "import { TableAliasProxyHandler } from '~/alias.ts';\nimport type { BuildAliasTable } from './query-builders/select.types.ts';\n\nimport type { PgTable } from './table.ts';\nimport type { PgViewBase } from './view-base.ts';\n\nexport function alias<TTable extends PgTable | PgViewBase, TAlias extends string>(\n\ttable: TTable,\n\talias: TAlias,\n): BuildAliasTable<TTable, TAlias> {\n\treturn new Proxy(table, new TableAliasProxyHandler(alias, false)) as any;\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/checks.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/index.ts';\nimport type { PgTable } from './table.ts';\n\nexport class CheckBuilder {\n\tstatic readonly [entityKind]: string = 'PgCheckBuilder';\n\n\tprotected brand!: 'PgConstraintBuilder';\n\n\tconstructor(public name: string, public value: SQL) {}\n\n\t/** @internal */\n\tbuild(table: PgTable): Check {\n\t\treturn new Check(table, this);\n\t}\n}\n\nexport class Check {\n\tstatic readonly [entityKind]: string = 'PgCheck';\n\n\treadonly name: string;\n\treadonly value: SQL;\n\n\tconstructor(public table: PgTable, builder: CheckBuilder) {\n\t\tthis.name = builder.name;\n\t\tthis.value = builder.value;\n\t}\n}\n\nexport function check(name: string, value: SQL): CheckBuilder {\n\treturn new CheckBuilder(name, value);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/all.ts",
    "content": "import { bigint } from './bigint.ts';\nimport { bigserial } from './bigserial.ts';\nimport { boolean } from './boolean.ts';\nimport { char } from './char.ts';\nimport { cidr } from './cidr.ts';\nimport { customType } from './custom.ts';\nimport { date } from './date.ts';\nimport { doublePrecision } from './double-precision.ts';\nimport { inet } from './inet.ts';\nimport { integer } from './integer.ts';\nimport { interval } from './interval.ts';\nimport { json } from './json.ts';\nimport { jsonb } from './jsonb.ts';\nimport { line } from './line.ts';\nimport { macaddr } from './macaddr.ts';\nimport { macaddr8 } from './macaddr8.ts';\nimport { numeric } from './numeric.ts';\nimport { point } from './point.ts';\nimport { geometry } from './postgis_extension/geometry.ts';\nimport { real } from './real.ts';\nimport { serial } from './serial.ts';\nimport { smallint } from './smallint.ts';\nimport { smallserial } from './smallserial.ts';\nimport { text } from './text.ts';\nimport { time } from './time.ts';\nimport { timestamp } from './timestamp.ts';\nimport { uuid } from './uuid.ts';\nimport { varchar } from './varchar.ts';\nimport { bit } from './vector_extension/bit.ts';\nimport { halfvec } from './vector_extension/halfvec.ts';\nimport { sparsevec } from './vector_extension/sparsevec.ts';\nimport { vector } from './vector_extension/vector.ts';\n\nexport function getPgColumnBuilders() {\n\treturn {\n\t\tbigint,\n\t\tbigserial,\n\t\tboolean,\n\t\tchar,\n\t\tcidr,\n\t\tcustomType,\n\t\tdate,\n\t\tdoublePrecision,\n\t\tinet,\n\t\tinteger,\n\t\tinterval,\n\t\tjson,\n\t\tjsonb,\n\t\tline,\n\t\tmacaddr,\n\t\tmacaddr8,\n\t\tnumeric,\n\t\tpoint,\n\t\tgeometry,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\tsmallserial,\n\t\ttext,\n\t\ttime,\n\t\ttimestamp,\n\t\tuuid,\n\t\tvarchar,\n\t\tbit,\n\t\thalfvec,\n\t\tsparsevec,\n\t\tvector,\n\t};\n}\n\nexport type PgColumnsBuilders = ReturnType<typeof getPgColumnBuilders>;\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/bigint.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\n\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgIntColumnBaseBuilder } from './int.common.ts';\n\nexport type PgBigInt53BuilderInitial<TName extends string> = PgBigInt53Builder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'PgBigInt53';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class PgBigInt53Builder<T extends ColumnBuilderBaseConfig<'number', 'PgBigInt53'>>\n\textends PgIntColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgBigInt53Builder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'PgBigInt53');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgBigInt53<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgBigInt53<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgBigInt53<T extends ColumnBaseConfig<'number', 'PgBigInt53'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgBigInt53';\n\n\tgetSQLType(): string {\n\t\treturn 'bigint';\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'number') {\n\t\t\treturn value;\n\t\t}\n\t\treturn Number(value);\n\t}\n}\n\nexport type PgBigInt64BuilderInitial<TName extends string> = PgBigInt64Builder<{\n\tname: TName;\n\tdataType: 'bigint';\n\tcolumnType: 'PgBigInt64';\n\tdata: bigint;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgBigInt64Builder<T extends ColumnBuilderBaseConfig<'bigint', 'PgBigInt64'>>\n\textends PgIntColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgBigInt64Builder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'bigint', 'PgBigInt64');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgBigInt64<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgBigInt64<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgBigInt64<T extends ColumnBaseConfig<'bigint', 'PgBigInt64'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgBigInt64';\n\n\tgetSQLType(): string {\n\t\treturn 'bigint';\n\t}\n\n\t// eslint-disable-next-line unicorn/prefer-native-coercion-functions\n\toverride mapFromDriverValue(value: string): bigint {\n\t\treturn BigInt(value);\n\t}\n}\n\nexport interface PgBigIntConfig<T extends 'number' | 'bigint' = 'number' | 'bigint'> {\n\tmode: T;\n}\n\nexport function bigint<TMode extends PgBigIntConfig['mode']>(\n\tconfig: PgBigIntConfig<TMode>,\n): TMode extends 'number' ? PgBigInt53BuilderInitial<''> : PgBigInt64BuilderInitial<''>;\nexport function bigint<TName extends string, TMode extends PgBigIntConfig['mode']>(\n\tname: TName,\n\tconfig: PgBigIntConfig<TMode>,\n): TMode extends 'number' ? PgBigInt53BuilderInitial<TName> : PgBigInt64BuilderInitial<TName>;\nexport function bigint(a: string | PgBigIntConfig, b?: PgBigIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgBigIntConfig>(a, b);\n\tif (config.mode === 'number') {\n\t\treturn new PgBigInt53Builder(name);\n\t}\n\treturn new PgBigInt64Builder(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/bigserial.ts",
    "content": "import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tHasDefault,\n\tMakeColumnConfig,\n\tNotNull,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport type { AnyPgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgBigSerial53BuilderInitial<TName extends string> = NotNull<\n\tHasDefault<\n\t\tPgBigSerial53Builder<{\n\t\t\tname: TName;\n\t\t\tdataType: 'number';\n\t\t\tcolumnType: 'PgBigSerial53';\n\t\t\tdata: number;\n\t\t\tdriverParam: number;\n\t\t\tenumValues: undefined;\n\t\t}>\n\t>\n>;\n\nexport class PgBigSerial53Builder<T extends ColumnBuilderBaseConfig<'number', 'PgBigSerial53'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgBigSerial53Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number', 'PgBigSerial53');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgBigSerial53<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgBigSerial53<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgBigSerial53<T extends ColumnBaseConfig<'number', 'PgBigSerial53'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgBigSerial53';\n\n\tgetSQLType(): string {\n\t\treturn 'bigserial';\n\t}\n\n\toverride mapFromDriverValue(value: number): number {\n\t\tif (typeof value === 'number') {\n\t\t\treturn value;\n\t\t}\n\t\treturn Number(value);\n\t}\n}\n\nexport type PgBigSerial64BuilderInitial<TName extends string> = NotNull<\n\tHasDefault<\n\t\tPgBigSerial64Builder<{\n\t\t\tname: TName;\n\t\t\tdataType: 'bigint';\n\t\t\tcolumnType: 'PgBigSerial64';\n\t\t\tdata: bigint;\n\t\t\tdriverParam: string;\n\t\t\tenumValues: undefined;\n\t\t}>\n\t>\n>;\n\nexport class PgBigSerial64Builder<T extends ColumnBuilderBaseConfig<'bigint', 'PgBigSerial64'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgBigSerial64Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'bigint', 'PgBigSerial64');\n\t\tthis.config.hasDefault = true;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgBigSerial64<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgBigSerial64<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgBigSerial64<T extends ColumnBaseConfig<'bigint', 'PgBigSerial64'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgBigSerial64';\n\n\tgetSQLType(): string {\n\t\treturn 'bigserial';\n\t}\n\n\t// eslint-disable-next-line unicorn/prefer-native-coercion-functions\n\toverride mapFromDriverValue(value: string): bigint {\n\t\treturn BigInt(value);\n\t}\n}\n\nexport interface PgBigSerialConfig<T extends 'number' | 'bigint' = 'number' | 'bigint'> {\n\tmode: T;\n}\n\nexport function bigserial<TMode extends PgBigSerialConfig['mode']>(\n\tconfig: PgBigSerialConfig<TMode>,\n): TMode extends 'number' ? PgBigSerial53BuilderInitial<''> : PgBigSerial64BuilderInitial<''>;\nexport function bigserial<TName extends string, TMode extends PgBigSerialConfig['mode']>(\n\tname: TName,\n\tconfig: PgBigSerialConfig<TMode>,\n): TMode extends 'number' ? PgBigSerial53BuilderInitial<TName> : PgBigSerial64BuilderInitial<TName>;\nexport function bigserial(a: string | PgBigSerialConfig, b?: PgBigSerialConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgBigSerialConfig>(a, b);\n\tif (config.mode === 'number') {\n\t\treturn new PgBigSerial53Builder(name);\n\t}\n\treturn new PgBigSerial64Builder(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/boolean.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgBooleanBuilderInitial<TName extends string> = PgBooleanBuilder<{\n\tname: TName;\n\tdataType: 'boolean';\n\tcolumnType: 'PgBoolean';\n\tdata: boolean;\n\tdriverParam: boolean;\n\tenumValues: undefined;\n}>;\n\nexport class PgBooleanBuilder<T extends ColumnBuilderBaseConfig<'boolean', 'PgBoolean'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgBooleanBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'boolean', 'PgBoolean');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgBoolean<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgBoolean<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgBoolean<T extends ColumnBaseConfig<'boolean', 'PgBoolean'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgBoolean';\n\n\tgetSQLType(): string {\n\t\treturn 'boolean';\n\t}\n}\n\nexport function boolean(): PgBooleanBuilderInitial<''>;\nexport function boolean<TName extends string>(name: TName): PgBooleanBuilderInitial<TName>;\nexport function boolean(name?: string) {\n\treturn new PgBooleanBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/char.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgCharBuilderInitial<\n\tTName extends string,\n\tTEnum extends [string, ...string[]],\n\tTLength extends number | undefined,\n> = PgCharBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgChar';\n\tdata: TEnum[number];\n\tenumValues: TEnum;\n\tdriverParam: string;\n\tlength: TLength;\n}>;\n\nexport class PgCharBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgChar'> & { length?: number | undefined }>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{ length: T['length']; enumValues: T['enumValues'] },\n\t\t{ length: T['length'] }\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgCharBuilder';\n\n\tconstructor(name: T['name'], config: PgCharConfig<T['enumValues'], T['length']>) {\n\t\tsuper(name, 'string', 'PgChar');\n\t\tthis.config.length = config.length;\n\t\tthis.config.enumValues = config.enum;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgChar<MakeColumnConfig<T, TTableName> & { length: T['length'] }> {\n\t\treturn new PgChar<MakeColumnConfig<T, TTableName> & { length: T['length'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgChar<T extends ColumnBaseConfig<'string', 'PgChar'> & { length?: number | undefined }>\n\textends PgColumn<T, { length: T['length']; enumValues: T['enumValues'] }, { length: T['length'] }>\n{\n\tstatic override readonly [entityKind]: string = 'PgChar';\n\n\treadonly length = this.config.length;\n\toverride readonly enumValues = this.config.enumValues;\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `char` : `char(${this.length})`;\n\t}\n}\n\nexport interface PgCharConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n\tTLength extends number | undefined = number | undefined,\n> {\n\tenum?: TEnum;\n\tlength?: TLength;\n}\n\nexport function char(): PgCharBuilderInitial<'', [string, ...string[]], undefined>;\nexport function char<U extends string, T extends Readonly<[U, ...U[]]>, L extends number | undefined>(\n\tconfig?: PgCharConfig<T | Writable<T>, L>,\n): PgCharBuilderInitial<'', Writable<T>, L>;\nexport function char<\n\tTName extends string,\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n>(\n\tname: TName,\n\tconfig?: PgCharConfig<T | Writable<T>, L>,\n): PgCharBuilderInitial<TName, Writable<T>, L>;\nexport function char(a?: string | PgCharConfig, b: PgCharConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<PgCharConfig>(a, b);\n\treturn new PgCharBuilder(name, config as any);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/cidr.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgCidrBuilderInitial<TName extends string> = PgCidrBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgCidr';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgCidrBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgCidr'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgCidrBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'PgCidr');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgCidr<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgCidr<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgCidr<T extends ColumnBaseConfig<'string', 'PgCidr'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgCidr';\n\n\tgetSQLType(): string {\n\t\treturn 'cidr';\n\t}\n}\n\nexport function cidr(): PgCidrBuilderInitial<''>;\nexport function cidr<TName extends string>(name: TName): PgCidrBuilderInitial<TName>;\nexport function cidr(name?: string) {\n\treturn new PgCidrBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/common.ts",
    "content": "import type {\n\tColumnBuilderBase,\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tHasGenerated,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport { ColumnBuilder } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Simplify, Update } from '~/utils.ts';\n\nimport type { ForeignKey, UpdateDeleteAction } from '~/pg-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/pg-core/foreign-keys.ts';\nimport type { AnyPgTable, PgTable } from '~/pg-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport { iife } from '~/tracing-utils.ts';\nimport type { PgIndexOpClass } from '../indexes.ts';\nimport { uniqueKeyName } from '../unique-constraint.ts';\nimport { makePgArray, parsePgArray } from '../utils/array.ts';\n\nexport interface ReferenceConfig {\n\tref: () => PgColumn;\n\tactions: {\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport interface PgColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> extends ColumnBuilderBase<T, TTypeConfig & { dialect: 'pg' }> {}\n\nexport abstract class PgColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> extends ColumnBuilder<T, TRuntimeConfig, TTypeConfig & { dialect: 'pg' }, TExtraConfig>\n\timplements PgColumnBuilderBase<T, TTypeConfig>\n{\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\tstatic override readonly [entityKind]: string = 'PgColumnBuilder';\n\n\tarray<TSize extends number | undefined = undefined>(size?: TSize): PgArrayBuilder<\n\t\t& {\n\t\t\tname: T['name'];\n\t\t\tdataType: 'array';\n\t\t\tcolumnType: 'PgArray';\n\t\t\tdata: T['data'][];\n\t\t\tdriverParam: T['driverParam'][] | string;\n\t\t\tenumValues: T['enumValues'];\n\t\t\tsize: TSize;\n\t\t\tbaseBuilder: T;\n\t\t}\n\t\t& (T extends { notNull: true } ? { notNull: true } : {})\n\t\t& (T extends { hasDefault: true } ? { hasDefault: true } : {}),\n\t\tT\n\t> {\n\t\treturn new PgArrayBuilder(this.config.name, this as PgColumnBuilder<any, any>, size as any);\n\t}\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tactions: ReferenceConfig['actions'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, actions });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t\tconfig?: { nulls: 'distinct' | 'not distinct' },\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\tthis.config.uniqueType = config?.nulls;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(as: SQL | T['data'] | (() => SQL)): HasGenerated<this, {\n\t\ttype: 'always';\n\t}> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: 'stored',\n\t\t};\n\t\treturn this as HasGenerated<this, {\n\t\t\ttype: 'always';\n\t\t}>;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: PgColumn, table: PgTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, actions }) => {\n\t\t\treturn iife(\n\t\t\t\t(ref, actions) => {\n\t\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\t\treturn { columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t\t});\n\t\t\t\t\tif (actions.onUpdate) {\n\t\t\t\t\t\tbuilder.onUpdate(actions.onUpdate);\n\t\t\t\t\t}\n\t\t\t\t\tif (actions.onDelete) {\n\t\t\t\t\t\tbuilder.onDelete(actions.onDelete);\n\t\t\t\t\t}\n\t\t\t\t\treturn builder.build(table);\n\t\t\t\t},\n\t\t\t\tref,\n\t\t\t\tactions,\n\t\t\t);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgColumn<MakeColumnConfig<T, TTableName>>;\n\n\t/** @internal */\n\tbuildExtraConfigColumn<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): ExtraConfigColumn {\n\t\treturn new ExtraConfigColumn(table, this.config);\n\t}\n}\n\n// To understand how to use `PgColumn` and `PgColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class PgColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = {},\n\tTTypeConfig extends object = {},\n> extends Column<T, TRuntimeConfig, TTypeConfig & { dialect: 'pg' }> {\n\tstatic override readonly [entityKind]: string = 'PgColumn';\n\n\tconstructor(\n\t\toverride readonly table: PgTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tif (!config.uniqueName) {\n\t\t\tconfig.uniqueName = uniqueKeyName(table, [config.name]);\n\t\t}\n\t\tsuper(table, config);\n\t}\n}\n\nexport type IndexedExtraConfigType = { order?: 'asc' | 'desc'; nulls?: 'first' | 'last'; opClass?: string };\n\nexport class ExtraConfigColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n> extends PgColumn<T, IndexedExtraConfigType> {\n\tstatic override readonly [entityKind]: string = 'ExtraConfigColumn';\n\n\toverride getSQLType(): string {\n\t\treturn this.getSQLType();\n\t}\n\n\tindexConfig: IndexedExtraConfigType = {\n\t\torder: this.config.order ?? 'asc',\n\t\tnulls: this.config.nulls ?? 'last',\n\t\topClass: this.config.opClass,\n\t};\n\tdefaultConfig: IndexedExtraConfigType = {\n\t\torder: 'asc',\n\t\tnulls: 'last',\n\t\topClass: undefined,\n\t};\n\n\tasc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'asc';\n\t\treturn this;\n\t}\n\n\tdesc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'desc';\n\t\treturn this;\n\t}\n\n\tnullsFirst(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'first';\n\t\treturn this;\n\t}\n\n\tnullsLast(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'last';\n\t\treturn this;\n\t}\n\n\t/**\n\t * ### PostgreSQL documentation quote\n\t *\n\t * > An operator class with optional parameters can be specified for each column of an index.\n\t * The operator class identifies the operators to be used by the index for that column.\n\t * For example, a B-tree index on four-byte integers would use the int4_ops class;\n\t * this operator class includes comparison functions for four-byte integers.\n\t * In practice the default operator class for the column's data type is usually sufficient.\n\t * The main point of having operator classes is that for some data types, there could be more than one meaningful ordering.\n\t * For example, we might want to sort a complex-number data type either by absolute value or by real part.\n\t * We could do this by defining two operator classes for the data type and then selecting the proper class when creating an index.\n\t * More information about operator classes check:\n\t *\n\t * ### Useful links\n\t * https://www.postgresql.org/docs/current/sql-createindex.html\n\t *\n\t * https://www.postgresql.org/docs/current/indexes-opclass.html\n\t *\n\t * https://www.postgresql.org/docs/current/xindex.html\n\t *\n\t * ### Additional types\n\t * If you have the `pg_vector` extension installed in your database, you can use the\n\t * `vector_l2_ops`, `vector_ip_ops`, `vector_cosine_ops`, `vector_l1_ops`, `bit_hamming_ops`, `bit_jaccard_ops`, `halfvec_l2_ops`, `sparsevec_l2_ops` options, which are predefined types.\n\t *\n\t * **You can always specify any string you want in the operator class, in case Drizzle doesn't have it natively in its types**\n\t *\n\t * @param opClass\n\t * @returns\n\t */\n\top(opClass: PgIndexOpClass): Omit<this, 'op'> {\n\t\tthis.indexConfig.opClass = opClass;\n\t\treturn this;\n\t}\n}\n\nexport class IndexedColumn {\n\tstatic readonly [entityKind]: string = 'IndexedColumn';\n\tconstructor(\n\t\tname: string | undefined,\n\t\tkeyAsName: boolean,\n\t\ttype: string,\n\t\tindexConfig: IndexedExtraConfigType,\n\t) {\n\t\tthis.name = name;\n\t\tthis.keyAsName = keyAsName;\n\t\tthis.type = type;\n\t\tthis.indexConfig = indexConfig;\n\t}\n\n\tname: string | undefined;\n\tkeyAsName: boolean;\n\ttype: string;\n\tindexConfig: IndexedExtraConfigType;\n}\n\nexport type AnyPgColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = PgColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport type PgArrayColumnBuilderBaseConfig = ColumnBuilderBaseConfig<'array', 'PgArray'> & {\n\tsize: number | undefined;\n\tbaseBuilder: ColumnBuilderBaseConfig<ColumnDataType, string>;\n};\n\nexport class PgArrayBuilder<\n\tT extends PgArrayColumnBuilderBaseConfig,\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string> | PgArrayColumnBuilderBaseConfig,\n> extends PgColumnBuilder<\n\tT,\n\t{\n\t\tbaseBuilder: TBase extends PgArrayColumnBuilderBaseConfig ? PgArrayBuilder<\n\t\t\t\tTBase,\n\t\t\t\tTBase extends { baseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any, any> } ? TBaseBuilder\n\t\t\t\t\t: never\n\t\t\t>\n\t\t\t: PgColumnBuilder<TBase, {}, Simplify<Omit<TBase, keyof ColumnBuilderBaseConfig<any, any>>>>;\n\t\tsize: T['size'];\n\t},\n\t{\n\t\tbaseBuilder: TBase extends PgArrayColumnBuilderBaseConfig ? PgArrayBuilder<\n\t\t\t\tTBase,\n\t\t\t\tTBase extends { baseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any, any> } ? TBaseBuilder\n\t\t\t\t\t: never\n\t\t\t>\n\t\t\t: PgColumnBuilder<TBase, {}, Simplify<Omit<TBase, keyof ColumnBuilderBaseConfig<any, any>>>>;\n\t\tsize: T['size'];\n\t}\n> {\n\tstatic override readonly [entityKind] = 'PgArrayBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tbaseBuilder: PgArrayBuilder<T, TBase>['config']['baseBuilder'],\n\t\tsize: T['size'],\n\t) {\n\t\tsuper(name, 'array', 'PgArray');\n\t\tthis.config.baseBuilder = baseBuilder;\n\t\tthis.config.size = size;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgArray<MakeColumnConfig<T, TTableName> & { size: T['size']; baseBuilder: T['baseBuilder'] }, TBase> {\n\t\tconst baseColumn = this.config.baseBuilder.build(table);\n\t\treturn new PgArray<MakeColumnConfig<T, TTableName> & { size: T['size']; baseBuilder: T['baseBuilder'] }, TBase>(\n\t\t\ttable as AnyPgTable<{ name: MakeColumnConfig<T, TTableName>['tableName'] }>,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t\tbaseColumn,\n\t\t);\n\t}\n}\n\nexport class PgArray<\n\tT extends ColumnBaseConfig<'array', 'PgArray'> & {\n\t\tsize: number | undefined;\n\t\tbaseBuilder: ColumnBuilderBaseConfig<ColumnDataType, string>;\n\t},\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n> extends PgColumn<T, {}, { size: T['size']; baseBuilder: T['baseBuilder'] }> {\n\treadonly size: T['size'];\n\n\tstatic override readonly [entityKind]: string = 'PgArray';\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgArrayBuilder<T, TBase>['config'],\n\t\treadonly baseColumn: PgColumn,\n\t\treadonly range?: [number | undefined, number | undefined],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.size = config.size;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `${this.baseColumn.getSQLType()}[${typeof this.size === 'number' ? this.size : ''}]`;\n\t}\n\n\toverride mapFromDriverValue(value: unknown[] | string): T['data'] {\n\t\tif (typeof value === 'string') {\n\t\t\t// Thank you node-postgres for not parsing enum arrays\n\t\t\tvalue = parsePgArray(value);\n\t\t}\n\t\treturn value.map((v) => this.baseColumn.mapFromDriverValue(v));\n\t}\n\n\toverride mapToDriverValue(value: unknown[], isNestedArray = false): unknown[] | string {\n\t\tconst a = value.map((v) =>\n\t\t\tv === null\n\t\t\t\t? null\n\t\t\t\t: is(this.baseColumn, PgArray)\n\t\t\t\t? this.baseColumn.mapToDriverValue(v as unknown[], true)\n\t\t\t\t: this.baseColumn.mapToDriverValue(v)\n\t\t);\n\t\tif (isNestedArray) return a;\n\t\treturn makePgArray(a);\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/custom.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type ConvertCustomConfig<TName extends string, T extends Partial<CustomTypeValues>> =\n\t& {\n\t\tname: TName;\n\t\tdataType: 'custom';\n\t\tcolumnType: 'PgCustomColumn';\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverData'];\n\t\tenumValues: undefined;\n\t}\n\t& (T['notNull'] extends true ? { notNull: true } : {})\n\t& (T['default'] extends true ? { hasDefault: true } : {});\n\nexport interface PgCustomColumnInnerConfig {\n\tcustomTypeValues: CustomTypeValues;\n}\n\nexport class PgCustomColumnBuilder<T extends ColumnBuilderBaseConfig<'custom', 'PgCustomColumn'>>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{\n\t\t\tfieldConfig: CustomTypeValues['config'];\n\t\t\tcustomTypeParams: CustomTypeParams<any>;\n\t\t},\n\t\t{\n\t\t\tpgColumnBuilderBrand: 'PgCustomColumnBuilderBrand';\n\t\t}\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgCustomColumnBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\tfieldConfig: CustomTypeValues['config'],\n\t\tcustomTypeParams: CustomTypeParams<any>,\n\t) {\n\t\tsuper(name, 'custom', 'PgCustomColumn');\n\t\tthis.config.fieldConfig = fieldConfig;\n\t\tthis.config.customTypeParams = customTypeParams;\n\t}\n\n\t/** @internal */\n\tbuild<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgCustomColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgCustomColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgCustomColumn<T extends ColumnBaseConfig<'custom', 'PgCustomColumn'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgCustomColumn';\n\n\tprivate sqlName: string;\n\tprivate mapTo?: (value: T['data']) => T['driverParam'];\n\tprivate mapFrom?: (value: T['driverParam']) => T['data'];\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgCustomColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.sqlName = config.customTypeParams.dataType(config.fieldConfig);\n\t\tthis.mapTo = config.customTypeParams.toDriver;\n\t\tthis.mapFrom = config.customTypeParams.fromDriver;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.sqlName;\n\t}\n\n\toverride mapFromDriverValue(value: T['driverParam']): T['data'] {\n\t\treturn typeof this.mapFrom === 'function' ? this.mapFrom(value) : value as T['data'];\n\t}\n\n\toverride mapToDriverValue(value: T['data']): T['driverParam'] {\n\t\treturn typeof this.mapTo === 'function' ? this.mapTo(value) : value as T['data'];\n\t}\n}\n\nexport type CustomTypeValues = {\n\t/**\n\t * Required type for custom column, that will infer proper type model\n\t *\n\t * Examples:\n\t *\n\t * If you want your column to be `string` type after selecting/or on inserting - use `data: string`. Like `text`, `varchar`\n\t *\n\t * If you want your column to be `number` type after selecting/or on inserting - use `data: number`. Like `integer`\n\t */\n\tdata: unknown;\n\n\t/**\n\t * Type helper, that represents what type database driver is accepting for specific database data type\n\t */\n\tdriverData?: unknown;\n\n\t/**\n\t * What config type should be used for {@link CustomTypeParams} `dataType` generation\n\t */\n\tconfig?: Record<string, any>;\n\n\t/**\n\t * Whether the config argument should be required or not\n\t * @default false\n\t */\n\tconfigRequired?: boolean;\n\n\t/**\n\t * If your custom data type should be notNull by default you can use `notNull: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t  dataType() {\n\t * \t    return 'serial';\n\t *    },\n\t * });\n\t */\n\tnotNull?: boolean;\n\n\t/**\n\t * If your custom data type has default you can use `default: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t  dataType() {\n\t * \t    return 'serial';\n\t *    },\n\t * });\n\t */\n\tdefault?: boolean;\n};\n\nexport interface CustomTypeParams<T extends CustomTypeValues> {\n\t/**\n\t * Database data type string representation, that is used for migrations\n\t * @example\n\t * ```\n\t * `jsonb`, `text`\n\t * ```\n\t *\n\t * If database data type needs additional params you can use them from `config` param\n\t * @example\n\t * ```\n\t * `varchar(256)`, `numeric(2,3)`\n\t * ```\n\t *\n\t * To make `config` be of specific type please use config generic in {@link CustomTypeValues}\n\t *\n\t * @example\n\t * Usage example\n\t * ```\n\t *   dataType() {\n\t *     return 'boolean';\n\t *   },\n\t * ```\n\t * Or\n\t * ```\n\t *   dataType(config) {\n\t * \t   return typeof config.length !== 'undefined' ? `varchar(${config.length})` : `varchar`;\n\t * \t }\n\t * ```\n\t */\n\tdataType: (config: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined)) => string;\n\n\t/**\n\t * Optional mapping function, between user input and driver\n\t * @example\n\t * For example, when using jsonb we need to map JS/TS object to string before writing to database\n\t * ```\n\t * toDriver(value: TData): string {\n\t * \t return JSON.stringify(value);\n\t * }\n\t * ```\n\t */\n\ttoDriver?: (value: T['data']) => T['driverData'] | SQL;\n\n\t/**\n\t * Optional mapping function, that is responsible for data mapping from database to JS/TS code\n\t * @example\n\t * For example, when using timestamp we need to map string Date representation to JS Date\n\t * ```\n\t * fromDriver(value: string): Date {\n\t * \treturn new Date(value);\n\t * },\n\t * ```\n\t */\n\tfromDriver?: (value: T['driverData']) => T['data'];\n}\n\n/**\n * Custom pg database data type generator\n */\nexport function customType<T extends CustomTypeValues = CustomTypeValues>(\n\tcustomTypeParams: CustomTypeParams<T>,\n): Equal<T['configRequired'], true> extends true ? {\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig: TConfig,\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig: T['config'],\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n\t: {\n\t\t(): PgCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig?: TConfig,\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig?: T['config'],\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n{\n\treturn <TName extends string>(\n\t\ta?: TName | T['config'],\n\t\tb?: T['config'],\n\t): PgCustomColumnBuilder<ConvertCustomConfig<TName, T>> => {\n\t\tconst { name, config } = getColumnNameAndConfig<T['config']>(a, b);\n\t\treturn new PgCustomColumnBuilder(name as ConvertCustomConfig<TName, T>['name'], config, customTypeParams);\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/date.common.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnDataType } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { PgColumnBuilder } from './common.ts';\n\nexport abstract class PgDateColumnBaseBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n> extends PgColumnBuilder<T, TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'PgDateColumnBaseBuilder';\n\n\tdefaultNow() {\n\t\treturn this.default(sql`now()`);\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/date.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgDateColumnBaseBuilder } from './date.common.ts';\n\nexport type PgDateBuilderInitial<TName extends string> = PgDateBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'PgDate';\n\tdata: Date;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgDateBuilder<T extends ColumnBuilderBaseConfig<'date', 'PgDate'>> extends PgDateColumnBaseBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgDateBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'date', 'PgDate');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgDate<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgDate<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgDate<T extends ColumnBaseConfig<'date', 'PgDate'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgDate';\n\n\tgetSQLType(): string {\n\t\treturn 'date';\n\t}\n\n\toverride mapFromDriverValue(value: string | Date): Date {\n\t\tif (typeof value === 'string') return new Date(value);\n\n\t\treturn value;\n\t}\n\n\toverride mapToDriverValue(value: Date): string {\n\t\treturn value.toISOString();\n\t}\n}\n\nexport type PgDateStringBuilderInitial<TName extends string> = PgDateStringBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgDateString';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgDateStringBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgDateString'>>\n\textends PgDateColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgDateStringBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'PgDateString');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgDateString<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgDateString<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgDateString<T extends ColumnBaseConfig<'string', 'PgDateString'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgDateString';\n\n\tgetSQLType(): string {\n\t\treturn 'date';\n\t}\n\n\toverride mapFromDriverValue(value: Date | string): string {\n\t\tif (typeof value === 'string') return value;\n\n\t\treturn value.toISOString().slice(0, -14);\n\t}\n}\n\nexport interface PgDateConfig<T extends 'date' | 'string' = 'date' | 'string'> {\n\tmode: T;\n}\n\nexport function date(): PgDateStringBuilderInitial<''>;\nexport function date<TMode extends PgDateConfig['mode'] & {}>(\n\tconfig?: PgDateConfig<TMode>,\n): Equal<TMode, 'date'> extends true ? PgDateBuilderInitial<''> : PgDateStringBuilderInitial<''>;\nexport function date<TName extends string, TMode extends PgDateConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: PgDateConfig<TMode>,\n): Equal<TMode, 'date'> extends true ? PgDateBuilderInitial<TName> : PgDateStringBuilderInitial<TName>;\nexport function date(a?: string | PgDateConfig, b?: PgDateConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgDateConfig>(a, b);\n\tif (config?.mode === 'date') {\n\t\treturn new PgDateBuilder(name);\n\t}\n\treturn new PgDateStringBuilder(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/double-precision.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgDoublePrecisionBuilderInitial<TName extends string> = PgDoublePrecisionBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'PgDoublePrecision';\n\tdata: number;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n}>;\n\nexport class PgDoublePrecisionBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgDoublePrecision'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgDoublePrecisionBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'PgDoublePrecision');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgDoublePrecision<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgDoublePrecision<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgDoublePrecision<T extends ColumnBaseConfig<'number', 'PgDoublePrecision'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgDoublePrecision';\n\n\tgetSQLType(): string {\n\t\treturn 'double precision';\n\t}\n\n\toverride mapFromDriverValue(value: string | number): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number.parseFloat(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function doublePrecision(): PgDoublePrecisionBuilderInitial<''>;\nexport function doublePrecision<TName extends string>(name: TName): PgDoublePrecisionBuilderInitial<TName>;\nexport function doublePrecision(name?: string) {\n\treturn new PgDoublePrecisionBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/enum.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport type { NonArray, Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\n// Enum as ts enum\n\nexport type PgEnumObjectColumnBuilderInitial<TName extends string, TValues extends object> = PgEnumObjectColumnBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgEnumObjectColumn';\n\tdata: TValues[keyof TValues];\n\tenumValues: string[];\n\tdriverParam: string;\n}>;\n\nexport interface PgEnumObject<TValues extends object> {\n\t(): PgEnumObjectColumnBuilderInitial<'', TValues>;\n\t<TName extends string>(name: TName): PgEnumObjectColumnBuilderInitial<TName, TValues>;\n\t<TName extends string>(name?: TName): PgEnumObjectColumnBuilderInitial<TName, TValues>;\n\n\treadonly enumName: string;\n\treadonly enumValues: string[];\n\treadonly schema: string | undefined;\n\t/** @internal */\n\t[isPgEnumSym]: true;\n}\n\nexport class PgEnumObjectColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgEnumObjectColumn'> & { enumValues: string[] },\n> extends PgColumnBuilder<T, { enum: PgEnumObject<any> }> {\n\tstatic override readonly [entityKind]: string = 'PgEnumObjectColumnBuilder';\n\n\tconstructor(name: T['name'], enumInstance: PgEnumObject<any>) {\n\t\tsuper(name, 'string', 'PgEnumObjectColumn');\n\t\tthis.config.enum = enumInstance;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgEnumObjectColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgEnumObjectColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgEnumObjectColumn<T extends ColumnBaseConfig<'string', 'PgEnumObjectColumn'> & { enumValues: object }>\n\textends PgColumn<T, { enum: PgEnumObject<object> }>\n{\n\tstatic override readonly [entityKind]: string = 'PgEnumObjectColumn';\n\n\treadonly enum;\n\toverride readonly enumValues = this.config.enum.enumValues;\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgEnumObjectColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.enum = config.enum;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.enum.enumName;\n\t}\n}\n\n// Enum as string union\n\nexport type PgEnumColumnBuilderInitial<TName extends string, TValues extends [string, ...string[]]> =\n\tPgEnumColumnBuilder<{\n\t\tname: TName;\n\t\tdataType: 'string';\n\t\tcolumnType: 'PgEnumColumn';\n\t\tdata: TValues[number];\n\t\tenumValues: TValues;\n\t\tdriverParam: string;\n\t}>;\n\nconst isPgEnumSym = Symbol.for('drizzle:isPgEnum');\nexport interface PgEnum<TValues extends [string, ...string[]]> {\n\t(): PgEnumColumnBuilderInitial<'', TValues>;\n\t<TName extends string>(name: TName): PgEnumColumnBuilderInitial<TName, TValues>;\n\t<TName extends string>(name?: TName): PgEnumColumnBuilderInitial<TName, TValues>;\n\n\treadonly enumName: string;\n\treadonly enumValues: TValues;\n\treadonly schema: string | undefined;\n\t/** @internal */\n\t[isPgEnumSym]: true;\n}\n\nexport function isPgEnum(obj: unknown): obj is PgEnum<[string, ...string[]]> {\n\treturn !!obj && typeof obj === 'function' && isPgEnumSym in obj && obj[isPgEnumSym] === true;\n}\n\nexport class PgEnumColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgEnumColumn'> & { enumValues: [string, ...string[]] },\n> extends PgColumnBuilder<T, { enum: PgEnum<T['enumValues']> }> {\n\tstatic override readonly [entityKind]: string = 'PgEnumColumnBuilder';\n\n\tconstructor(name: T['name'], enumInstance: PgEnum<T['enumValues']>) {\n\t\tsuper(name, 'string', 'PgEnumColumn');\n\t\tthis.config.enum = enumInstance;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgEnumColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgEnumColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgEnumColumn<T extends ColumnBaseConfig<'string', 'PgEnumColumn'> & { enumValues: [string, ...string[]] }>\n\textends PgColumn<T, { enum: PgEnum<T['enumValues']> }>\n{\n\tstatic override readonly [entityKind]: string = 'PgEnumColumn';\n\n\treadonly enum = this.config.enum;\n\toverride readonly enumValues = this.config.enum.enumValues;\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgEnumColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.enum = config.enum;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.enum.enumName;\n\t}\n}\n\nexport function pgEnum<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tenumName: string,\n\tvalues: T | Writable<T>,\n): PgEnum<Writable<T>>;\n\nexport function pgEnum<E extends Record<string, string>>(\n\tenumName: string,\n\tenumObj: NonArray<E>,\n): PgEnumObject<E>;\n\nexport function pgEnum(\n\tenumName: any,\n\tinput: any,\n): any {\n\treturn Array.isArray(input)\n\t\t? pgEnumWithSchema(enumName, [...input] as [string, ...string[]], undefined)\n\t\t: pgEnumObjectWithSchema(enumName, input, undefined);\n}\n\n/** @internal */\nexport function pgEnumWithSchema<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tenumName: string,\n\tvalues: T | Writable<T>,\n\tschema?: string,\n): PgEnum<Writable<T>> {\n\tconst enumInstance: PgEnum<Writable<T>> = Object.assign(\n\t\t<TName extends string>(name?: TName): PgEnumColumnBuilderInitial<TName, Writable<T>> =>\n\t\t\tnew PgEnumColumnBuilder(name ?? '' as TName, enumInstance),\n\t\t{\n\t\t\tenumName,\n\t\t\tenumValues: values,\n\t\t\tschema,\n\t\t\t[isPgEnumSym]: true,\n\t\t} as const,\n\t);\n\n\treturn enumInstance;\n}\n\n/** @internal */\nexport function pgEnumObjectWithSchema<T extends object>(\n\tenumName: string,\n\tvalues: T,\n\tschema?: string,\n): PgEnumObject<T> {\n\tconst enumInstance: PgEnumObject<T> = Object.assign(\n\t\t<TName extends string>(name?: TName): PgEnumObjectColumnBuilderInitial<TName, T> =>\n\t\t\tnew PgEnumObjectColumnBuilder(name ?? '' as TName, enumInstance),\n\t\t{\n\t\t\tenumName,\n\t\t\tenumValues: Object.values(values),\n\t\t\tschema,\n\t\t\t[isPgEnumSym]: true,\n\t\t} as const,\n\t);\n\n\treturn enumInstance;\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/index.ts",
    "content": "export * from './bigint.ts';\nexport * from './bigserial.ts';\nexport * from './boolean.ts';\nexport * from './char.ts';\nexport * from './cidr.ts';\nexport * from './common.ts';\nexport * from './custom.ts';\nexport * from './date.ts';\nexport * from './double-precision.ts';\nexport * from './enum.ts';\nexport * from './inet.ts';\nexport * from './int.common.ts';\nexport * from './integer.ts';\nexport * from './interval.ts';\nexport * from './json.ts';\nexport * from './jsonb.ts';\nexport * from './line.ts';\nexport * from './macaddr.ts';\nexport * from './macaddr8.ts';\nexport * from './numeric.ts';\nexport * from './point.ts';\nexport * from './postgis_extension/geometry.ts';\nexport * from './real.ts';\nexport * from './serial.ts';\nexport * from './smallint.ts';\nexport * from './smallserial.ts';\nexport * from './text.ts';\nexport * from './time.ts';\nexport * from './timestamp.ts';\nexport * from './uuid.ts';\nexport * from './varchar.ts';\nexport * from './vector_extension/bit.ts';\nexport * from './vector_extension/halfvec.ts';\nexport * from './vector_extension/sparsevec.ts';\nexport * from './vector_extension/vector.ts';\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/inet.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgInetBuilderInitial<TName extends string> = PgInetBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgInet';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgInetBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgInet'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgInetBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'PgInet');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgInet<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgInet<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgInet<T extends ColumnBaseConfig<'string', 'PgInet'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgInet';\n\n\tgetSQLType(): string {\n\t\treturn 'inet';\n\t}\n}\n\nexport function inet(): PgInetBuilderInitial<''>;\nexport function inet<TName extends string>(name: TName): PgInetBuilderInitial<TName>;\nexport function inet(name?: string) {\n\treturn new PgInetBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/int.common.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnDataType, GeneratedIdentityConfig, IsIdentity } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { PgSequenceOptions } from '../sequence.ts';\nimport { PgColumnBuilder } from './common.ts';\n\nexport abstract class PgIntColumnBaseBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n> extends PgColumnBuilder<\n\tT,\n\t{ generatedIdentity: GeneratedIdentityConfig }\n> {\n\tstatic override readonly [entityKind]: string = 'PgIntColumnBaseBuilder';\n\n\tgeneratedAlwaysAsIdentity(\n\t\tsequence?: PgSequenceOptions & { name?: string },\n\t): IsIdentity<this, 'always'> {\n\t\tif (sequence) {\n\t\t\tconst { name, ...options } = sequence;\n\t\t\tthis.config.generatedIdentity = {\n\t\t\t\ttype: 'always',\n\t\t\t\tsequenceName: name,\n\t\t\t\tsequenceOptions: options,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.config.generatedIdentity = {\n\t\t\t\ttype: 'always',\n\t\t\t};\n\t\t}\n\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\n\t\treturn this as IsIdentity<this, 'always'>;\n\t}\n\n\tgeneratedByDefaultAsIdentity(\n\t\tsequence?: PgSequenceOptions & { name?: string },\n\t): IsIdentity<this, 'byDefault'> {\n\t\tif (sequence) {\n\t\t\tconst { name, ...options } = sequence;\n\t\t\tthis.config.generatedIdentity = {\n\t\t\t\ttype: 'byDefault',\n\t\t\t\tsequenceName: name,\n\t\t\t\tsequenceOptions: options,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.config.generatedIdentity = {\n\t\t\t\ttype: 'byDefault',\n\t\t\t};\n\t\t}\n\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\n\t\treturn this as IsIdentity<this, 'byDefault'>;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/integer.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '../table.ts';\nimport { PgColumn } from './common.ts';\nimport { PgIntColumnBaseBuilder } from './int.common.ts';\n\nexport type PgIntegerBuilderInitial<TName extends string> = PgIntegerBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'PgInteger';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class PgIntegerBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgInteger'>>\n\textends PgIntColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgIntegerBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'PgInteger');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgInteger<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgInteger<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgInteger<T extends ColumnBaseConfig<'number', 'PgInteger'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgInteger';\n\n\tgetSQLType(): string {\n\t\treturn 'integer';\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number.parseInt(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function integer(): PgIntegerBuilderInitial<''>;\nexport function integer<TName extends string>(name: TName): PgIntegerBuilderInitial<TName>;\nexport function integer(name?: string) {\n\treturn new PgIntegerBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/interval.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\nimport type { Precision } from './timestamp.ts';\n\nexport type PgIntervalBuilderInitial<TName extends string> = PgIntervalBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgInterval';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgIntervalBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgInterval'>>\n\textends PgColumnBuilder<T, { intervalConfig: IntervalConfig }>\n{\n\tstatic override readonly [entityKind]: string = 'PgIntervalBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\tintervalConfig: IntervalConfig,\n\t) {\n\t\tsuper(name, 'string', 'PgInterval');\n\t\tthis.config.intervalConfig = intervalConfig;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgInterval<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgInterval<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgInterval<T extends ColumnBaseConfig<'string', 'PgInterval'>>\n\textends PgColumn<T, { intervalConfig: IntervalConfig }>\n{\n\tstatic override readonly [entityKind]: string = 'PgInterval';\n\n\treadonly fields: IntervalConfig['fields'] = this.config.intervalConfig.fields;\n\treadonly precision: IntervalConfig['precision'] = this.config.intervalConfig.precision;\n\n\tgetSQLType(): string {\n\t\tconst fields = this.fields ? ` ${this.fields}` : '';\n\t\tconst precision = this.precision ? `(${this.precision})` : '';\n\t\treturn `interval${fields}${precision}`;\n\t}\n}\n\nexport interface IntervalConfig {\n\tfields?:\n\t\t| 'year'\n\t\t| 'month'\n\t\t| 'day'\n\t\t| 'hour'\n\t\t| 'minute'\n\t\t| 'second'\n\t\t| 'year to month'\n\t\t| 'day to hour'\n\t\t| 'day to minute'\n\t\t| 'day to second'\n\t\t| 'hour to minute'\n\t\t| 'hour to second'\n\t\t| 'minute to second';\n\tprecision?: Precision;\n}\n\nexport function interval(): PgIntervalBuilderInitial<''>;\nexport function interval(\n\tconfig?: IntervalConfig,\n): PgIntervalBuilderInitial<''>;\nexport function interval<TName extends string>(\n\tname: TName,\n\tconfig?: IntervalConfig,\n): PgIntervalBuilderInitial<TName>;\nexport function interval(a?: string | IntervalConfig, b: IntervalConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<IntervalConfig>(a, b);\n\treturn new PgIntervalBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/json.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgJsonBuilderInitial<TName extends string> = PgJsonBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'PgJson';\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: undefined;\n}>;\n\nexport class PgJsonBuilder<T extends ColumnBuilderBaseConfig<'json', 'PgJson'>> extends PgColumnBuilder<\n\tT\n> {\n\tstatic override readonly [entityKind]: string = 'PgJsonBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'PgJson');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgJson<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgJson<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgJson<T extends ColumnBaseConfig<'json', 'PgJson'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgJson';\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgJsonBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'json';\n\t}\n\n\toverride mapToDriverValue(value: T['data']): string {\n\t\treturn JSON.stringify(value);\n\t}\n\n\toverride mapFromDriverValue(value: T['data'] | string): T['data'] {\n\t\tif (typeof value === 'string') {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(value);\n\t\t\t} catch {\n\t\t\t\treturn value as T['data'];\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function json(): PgJsonBuilderInitial<''>;\nexport function json<TName extends string>(name: TName): PgJsonBuilderInitial<TName>;\nexport function json(name?: string) {\n\treturn new PgJsonBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/jsonb.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgJsonbBuilderInitial<TName extends string> = PgJsonbBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'PgJsonb';\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: undefined;\n}>;\n\nexport class PgJsonbBuilder<T extends ColumnBuilderBaseConfig<'json', 'PgJsonb'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgJsonbBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'PgJsonb');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgJsonb<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgJsonb<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgJsonb<T extends ColumnBaseConfig<'json', 'PgJsonb'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgJsonb';\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgJsonbBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'jsonb';\n\t}\n\n\toverride mapToDriverValue(value: T['data']): string {\n\t\treturn JSON.stringify(value);\n\t}\n\n\toverride mapFromDriverValue(value: T['data'] | string): T['data'] {\n\t\tif (typeof value === 'string') {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(value);\n\t\t\t} catch {\n\t\t\t\treturn value as T['data'];\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function jsonb(): PgJsonbBuilderInitial<''>;\nexport function jsonb<TName extends string>(name: TName): PgJsonbBuilderInitial<TName>;\nexport function jsonb(name?: string) {\n\treturn new PgJsonbBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/line.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\n\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgLineBuilderInitial<TName extends string> = PgLineBuilder<{\n\tname: TName;\n\tdataType: 'array';\n\tcolumnType: 'PgLine';\n\tdata: [number, number, number];\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class PgLineBuilder<T extends ColumnBuilderBaseConfig<'array', 'PgLine'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgLineBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'array', 'PgLine');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgLineTuple<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgLineTuple<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgLineTuple<T extends ColumnBaseConfig<'array', 'PgLine'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgLine';\n\n\tgetSQLType(): string {\n\t\treturn 'line';\n\t}\n\n\toverride mapFromDriverValue(value: string): [number, number, number] {\n\t\tconst [a, b, c] = value.slice(1, -1).split(',');\n\t\treturn [Number.parseFloat(a!), Number.parseFloat(b!), Number.parseFloat(c!)];\n\t}\n\n\toverride mapToDriverValue(value: [number, number, number]): string {\n\t\treturn `{${value[0]},${value[1]},${value[2]}}`;\n\t}\n}\n\nexport type PgLineABCBuilderInitial<TName extends string> = PgLineABCBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'PgLineABC';\n\tdata: { a: number; b: number; c: number };\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgLineABCBuilder<T extends ColumnBuilderBaseConfig<'json', 'PgLineABC'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgLineABCBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'PgLineABC');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgLineABC<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgLineABC<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgLineABC<T extends ColumnBaseConfig<'json', 'PgLineABC'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgLineABC';\n\n\tgetSQLType(): string {\n\t\treturn 'line';\n\t}\n\n\toverride mapFromDriverValue(value: string): { a: number; b: number; c: number } {\n\t\tconst [a, b, c] = value.slice(1, -1).split(',');\n\t\treturn { a: Number.parseFloat(a!), b: Number.parseFloat(b!), c: Number.parseFloat(c!) };\n\t}\n\n\toverride mapToDriverValue(value: { a: number; b: number; c: number }): string {\n\t\treturn `{${value.a},${value.b},${value.c}}`;\n\t}\n}\n\nexport interface PgLineTypeConfig<T extends 'tuple' | 'abc' = 'tuple' | 'abc'> {\n\tmode?: T;\n}\n\nexport function line(): PgLineBuilderInitial<''>;\nexport function line<TMode extends PgLineTypeConfig['mode'] & {}>(\n\tconfig?: PgLineTypeConfig<TMode>,\n): Equal<TMode, 'abc'> extends true ? PgLineABCBuilderInitial<''>\n\t: PgLineBuilderInitial<''>;\nexport function line<TName extends string, TMode extends PgLineTypeConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: PgLineTypeConfig<TMode>,\n): Equal<TMode, 'abc'> extends true ? PgLineABCBuilderInitial<TName>\n\t: PgLineBuilderInitial<TName>;\nexport function line(a?: string | PgLineTypeConfig, b?: PgLineTypeConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgLineTypeConfig>(a, b);\n\tif (!config?.mode || config.mode === 'tuple') {\n\t\treturn new PgLineBuilder(name);\n\t}\n\treturn new PgLineABCBuilder(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/macaddr.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgMacaddrBuilderInitial<TName extends string> = PgMacaddrBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgMacaddr';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgMacaddrBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgMacaddr'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddrBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'PgMacaddr');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgMacaddr<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgMacaddr<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgMacaddr<T extends ColumnBaseConfig<'string', 'PgMacaddr'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddr';\n\n\tgetSQLType(): string {\n\t\treturn 'macaddr';\n\t}\n}\n\nexport function macaddr(): PgMacaddrBuilderInitial<''>;\nexport function macaddr<TName extends string>(name: TName): PgMacaddrBuilderInitial<TName>;\nexport function macaddr(name?: string) {\n\treturn new PgMacaddrBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/macaddr8.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgMacaddr8BuilderInitial<TName extends string> = PgMacaddr8Builder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgMacaddr8';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgMacaddr8Builder<T extends ColumnBuilderBaseConfig<'string', 'PgMacaddr8'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddr8Builder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'PgMacaddr8');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgMacaddr8<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgMacaddr8<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgMacaddr8<T extends ColumnBaseConfig<'string', 'PgMacaddr8'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddr8';\n\n\tgetSQLType(): string {\n\t\treturn 'macaddr8';\n\t}\n}\n\nexport function macaddr8(): PgMacaddr8BuilderInitial<''>;\nexport function macaddr8<TName extends string>(name: TName): PgMacaddr8BuilderInitial<TName>;\nexport function macaddr8(name?: string) {\n\treturn new PgMacaddr8Builder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/numeric.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgNumericBuilderInitial<TName extends string> = PgNumericBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgNumeric';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgNumericBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgNumeric'>> extends PgColumnBuilder<\n\tT,\n\t{\n\t\tprecision: number | undefined;\n\t\tscale: number | undefined;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'PgNumericBuilder';\n\n\tconstructor(name: T['name'], precision?: number, scale?: number) {\n\t\tsuper(name, 'string', 'PgNumeric');\n\t\tthis.config.precision = precision;\n\t\tthis.config.scale = scale;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgNumeric<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgNumeric<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgNumeric<T extends ColumnBaseConfig<'string', 'PgNumeric'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgNumeric';\n\n\treadonly precision: number | undefined;\n\treadonly scale: number | undefined;\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgNumericBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t\tthis.precision = config.precision;\n\t\tthis.scale = config.scale;\n\t}\n\n\toverride mapFromDriverValue(value: unknown): string {\n\t\tif (typeof value === 'string') return value;\n\n\t\treturn String(value);\n\t}\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `numeric(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'numeric';\n\t\t} else {\n\t\t\treturn `numeric(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport type PgNumericNumberBuilderInitial<TName extends string> = PgNumericNumberBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'PgNumericNumber';\n\tdata: number;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgNumericNumberBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgNumericNumber'>>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{\n\t\t\tprecision: number | undefined;\n\t\t\tscale: number | undefined;\n\t\t}\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgNumericNumberBuilder';\n\n\tconstructor(name: T['name'], precision?: number, scale?: number) {\n\t\tsuper(name, 'number', 'PgNumericNumber');\n\t\tthis.config.precision = precision;\n\t\tthis.config.scale = scale;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgNumericNumber<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgNumericNumber<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgNumericNumber<T extends ColumnBaseConfig<'number', 'PgNumericNumber'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgNumericNumber';\n\n\treadonly precision: number | undefined;\n\treadonly scale: number | undefined;\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgNumericNumberBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t\tthis.precision = config.precision;\n\t\tthis.scale = config.scale;\n\t}\n\n\toverride mapFromDriverValue(value: unknown): number {\n\t\tif (typeof value === 'number') return value;\n\n\t\treturn Number(value);\n\t}\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `numeric(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'numeric';\n\t\t} else {\n\t\t\treturn `numeric(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport type PgNumericBigIntBuilderInitial<TName extends string> = PgNumericBigIntBuilder<{\n\tname: TName;\n\tdataType: 'bigint';\n\tcolumnType: 'PgNumericBigInt';\n\tdata: bigint;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgNumericBigIntBuilder<T extends ColumnBuilderBaseConfig<'bigint', 'PgNumericBigInt'>>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{\n\t\t\tprecision: number | undefined;\n\t\t\tscale: number | undefined;\n\t\t}\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgNumericBigIntBuilder';\n\n\tconstructor(name: T['name'], precision?: number, scale?: number) {\n\t\tsuper(name, 'bigint', 'PgNumericBigInt');\n\t\tthis.config.precision = precision;\n\t\tthis.config.scale = scale;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgNumericBigInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgNumericBigInt<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgNumericBigInt<T extends ColumnBaseConfig<'bigint', 'PgNumericBigInt'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgNumericBigInt';\n\n\treadonly precision: number | undefined;\n\treadonly scale: number | undefined;\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgNumericBigIntBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t\tthis.precision = config.precision;\n\t\tthis.scale = config.scale;\n\t}\n\n\toverride mapFromDriverValue = BigInt;\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `numeric(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'numeric';\n\t\t} else {\n\t\t\treturn `numeric(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport type PgNumericConfig<T extends 'string' | 'number' | 'bigint' = 'string' | 'number' | 'bigint'> =\n\t| { precision: number; scale?: number; mode?: T }\n\t| { precision?: number; scale: number; mode?: T }\n\t| { precision?: number; scale?: number; mode: T };\n\nexport function numeric<TMode extends 'string' | 'number' | 'bigint'>(\n\tconfig?: PgNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? PgNumericNumberBuilderInitial<''>\n\t: Equal<TMode, 'bigint'> extends true ? PgNumericBigIntBuilderInitial<''>\n\t: PgNumericBuilderInitial<''>;\nexport function numeric<TName extends string, TMode extends 'string' | 'number' | 'bigint'>(\n\tname: TName,\n\tconfig?: PgNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? PgNumericNumberBuilderInitial<TName>\n\t: Equal<TMode, 'bigint'> extends true ? PgNumericBigIntBuilderInitial<TName>\n\t: PgNumericBuilderInitial<TName>;\nexport function numeric(a?: string | PgNumericConfig, b?: PgNumericConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgNumericConfig>(a, b);\n\tconst mode = config?.mode;\n\treturn mode === 'number'\n\t\t? new PgNumericNumberBuilder(name, config?.precision, config?.scale)\n\t\t: mode === 'bigint'\n\t\t? new PgNumericBigIntBuilder(name, config?.precision, config?.scale)\n\t\t: new PgNumericBuilder(name, config?.precision, config?.scale);\n}\n\nexport const decimal = numeric;\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/point.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\n\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgPointTupleBuilderInitial<TName extends string> = PgPointTupleBuilder<{\n\tname: TName;\n\tdataType: 'array';\n\tcolumnType: 'PgPointTuple';\n\tdata: [number, number];\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class PgPointTupleBuilder<T extends ColumnBuilderBaseConfig<'array', 'PgPointTuple'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgPointTupleBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'array', 'PgPointTuple');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgPointTuple<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgPointTuple<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgPointTuple<T extends ColumnBaseConfig<'array', 'PgPointTuple'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgPointTuple';\n\n\tgetSQLType(): string {\n\t\treturn 'point';\n\t}\n\n\toverride mapFromDriverValue(value: string | { x: number; y: number }): [number, number] {\n\t\tif (typeof value === 'string') {\n\t\t\tconst [x, y] = value.slice(1, -1).split(',');\n\t\t\treturn [Number.parseFloat(x!), Number.parseFloat(y!)];\n\t\t}\n\t\treturn [value.x, value.y];\n\t}\n\n\toverride mapToDriverValue(value: [number, number]): string {\n\t\treturn `(${value[0]},${value[1]})`;\n\t}\n}\n\nexport type PgPointObjectBuilderInitial<TName extends string> = PgPointObjectBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'PgPointObject';\n\tdata: { x: number; y: number };\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgPointObjectBuilder<T extends ColumnBuilderBaseConfig<'json', 'PgPointObject'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgPointObjectBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'json', 'PgPointObject');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgPointObject<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgPointObject<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgPointObject<T extends ColumnBaseConfig<'json', 'PgPointObject'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgPointObject';\n\n\tgetSQLType(): string {\n\t\treturn 'point';\n\t}\n\n\toverride mapFromDriverValue(value: string | { x: number; y: number }): { x: number; y: number } {\n\t\tif (typeof value === 'string') {\n\t\t\tconst [x, y] = value.slice(1, -1).split(',');\n\t\t\treturn { x: Number.parseFloat(x!), y: Number.parseFloat(y!) };\n\t\t}\n\t\treturn value;\n\t}\n\n\toverride mapToDriverValue(value: { x: number; y: number }): string {\n\t\treturn `(${value.x},${value.y})`;\n\t}\n}\n\nexport interface PgPointConfig<T extends 'tuple' | 'xy' = 'tuple' | 'xy'> {\n\tmode?: T;\n}\n\nexport function point(): PgPointTupleBuilderInitial<''>;\nexport function point<TMode extends PgPointConfig['mode'] & {}>(\n\tconfig?: PgPointConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgPointObjectBuilderInitial<''>\n\t: PgPointTupleBuilderInitial<''>;\nexport function point<TName extends string, TMode extends PgPointConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: PgPointConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgPointObjectBuilderInitial<TName>\n\t: PgPointTupleBuilderInitial<TName>;\nexport function point(a?: string | PgPointConfig, b?: PgPointConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgPointConfig>(a, b);\n\tif (!config?.mode || config.mode === 'tuple') {\n\t\treturn new PgPointTupleBuilder(name);\n\t}\n\treturn new PgPointObjectBuilder(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/postgis_extension/geometry.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\n\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\nimport { parseEWKB } from './utils.ts';\n\nexport type PgGeometryBuilderInitial<TName extends string> = PgGeometryBuilder<{\n\tname: TName;\n\tdataType: 'array';\n\tcolumnType: 'PgGeometry';\n\tdata: [number, number];\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgGeometryBuilder<T extends ColumnBuilderBaseConfig<'array', 'PgGeometry'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgGeometryBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'array', 'PgGeometry');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgGeometry<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgGeometry<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgGeometry<T extends ColumnBaseConfig<'array', 'PgGeometry'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgGeometry';\n\n\tgetSQLType(): string {\n\t\treturn 'geometry(point)';\n\t}\n\n\toverride mapFromDriverValue(value: string): [number, number] {\n\t\treturn parseEWKB(value);\n\t}\n\n\toverride mapToDriverValue(value: [number, number]): string {\n\t\treturn `point(${value[0]} ${value[1]})`;\n\t}\n}\n\nexport type PgGeometryObjectBuilderInitial<TName extends string> = PgGeometryObjectBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'PgGeometryObject';\n\tdata: { x: number; y: number };\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgGeometryObjectBuilder<T extends ColumnBuilderBaseConfig<'json', 'PgGeometryObject'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgGeometryObjectBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'PgGeometryObject');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgGeometryObject<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgGeometryObject<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgGeometryObject<T extends ColumnBaseConfig<'json', 'PgGeometryObject'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgGeometryObject';\n\n\tgetSQLType(): string {\n\t\treturn 'geometry(point)';\n\t}\n\n\toverride mapFromDriverValue(value: string): { x: number; y: number } {\n\t\tconst parsed = parseEWKB(value);\n\t\treturn { x: parsed[0], y: parsed[1] };\n\t}\n\n\toverride mapToDriverValue(value: { x: number; y: number }): string {\n\t\treturn `point(${value.x} ${value.y})`;\n\t}\n}\n\nexport interface PgGeometryConfig<T extends 'tuple' | 'xy' = 'tuple' | 'xy'> {\n\tmode?: T;\n\ttype?: 'point' | (string & {});\n\tsrid?: number;\n}\n\nexport function geometry(): PgGeometryBuilderInitial<''>;\nexport function geometry<TMode extends PgGeometryConfig['mode'] & {}>(\n\tconfig?: PgGeometryConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgGeometryObjectBuilderInitial<''> : PgGeometryBuilderInitial<''>;\nexport function geometry<TName extends string, TMode extends PgGeometryConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: PgGeometryConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgGeometryObjectBuilderInitial<TName> : PgGeometryBuilderInitial<TName>;\nexport function geometry(a?: string | PgGeometryConfig, b?: PgGeometryConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgGeometryConfig>(a, b);\n\tif (!config?.mode || config.mode === 'tuple') {\n\t\treturn new PgGeometryBuilder(name);\n\t}\n\treturn new PgGeometryObjectBuilder(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/postgis_extension/utils.ts",
    "content": "function hexToBytes(hex: string): Uint8Array {\n\tconst bytes: number[] = [];\n\tfor (let c = 0; c < hex.length; c += 2) {\n\t\tbytes.push(Number.parseInt(hex.slice(c, c + 2), 16));\n\t}\n\treturn new Uint8Array(bytes);\n}\n\nfunction bytesToFloat64(bytes: Uint8Array, offset: number): number {\n\tconst buffer = new ArrayBuffer(8);\n\tconst view = new DataView(buffer);\n\tfor (let i = 0; i < 8; i++) {\n\t\tview.setUint8(i, bytes[offset + i]!);\n\t}\n\treturn view.getFloat64(0, true);\n}\n\nexport function parseEWKB(hex: string): [number, number] {\n\tconst bytes = hexToBytes(hex);\n\n\tlet offset = 0;\n\n\t// Byte order: 1 is little-endian, 0 is big-endian\n\tconst byteOrder = bytes[offset];\n\toffset += 1;\n\n\tconst view = new DataView(bytes.buffer);\n\tconst geomType = view.getUint32(offset, byteOrder === 1);\n\toffset += 4;\n\n\tlet _srid: number | undefined;\n\tif (geomType & 0x20000000) { // SRID flag\n\t\t_srid = view.getUint32(offset, byteOrder === 1);\n\t\toffset += 4;\n\t}\n\n\tif ((geomType & 0xFFFF) === 1) {\n\t\tconst x = bytesToFloat64(bytes, offset);\n\t\toffset += 8;\n\t\tconst y = bytesToFloat64(bytes, offset);\n\t\toffset += 8;\n\n\t\treturn [x, y];\n\t}\n\n\tthrow new Error('Unsupported geometry type');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/real.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgRealBuilderInitial<TName extends string> = PgRealBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'PgReal';\n\tdata: number;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n}>;\n\nexport class PgRealBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgReal'>> extends PgColumnBuilder<\n\tT,\n\t{ length: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgRealBuilder';\n\n\tconstructor(name: T['name'], length?: number) {\n\t\tsuper(name, 'number', 'PgReal');\n\t\tthis.config.length = length;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgReal<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgReal<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgReal<T extends ColumnBaseConfig<'number', 'PgReal'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgReal';\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgRealBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'real';\n\t}\n\n\toverride mapFromDriverValue = (value: string | number): number => {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number.parseFloat(value);\n\t\t}\n\t\treturn value;\n\t};\n}\n\nexport function real(): PgRealBuilderInitial<''>;\nexport function real<TName extends string>(name: TName): PgRealBuilderInitial<TName>;\nexport function real(name?: string) {\n\treturn new PgRealBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/serial.ts",
    "content": "import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tHasDefault,\n\tMakeColumnConfig,\n\tNotNull,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgSerialBuilderInitial<TName extends string> = NotNull<\n\tHasDefault<\n\t\tPgSerialBuilder<{\n\t\t\tname: TName;\n\t\t\tdataType: 'number';\n\t\t\tcolumnType: 'PgSerial';\n\t\t\tdata: number;\n\t\t\tdriverParam: number;\n\t\t\tenumValues: undefined;\n\t\t}>\n\t>\n>;\n\nexport class PgSerialBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgSerial'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgSerialBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'PgSerial');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgSerial<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgSerial<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgSerial<T extends ColumnBaseConfig<'number', 'PgSerial'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgSerial';\n\n\tgetSQLType(): string {\n\t\treturn 'serial';\n\t}\n}\n\nexport function serial(): PgSerialBuilderInitial<''>;\nexport function serial<TName extends string>(name: TName): PgSerialBuilderInitial<TName>;\nexport function serial(name?: string) {\n\treturn new PgSerialBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/smallint.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn } from './common.ts';\nimport { PgIntColumnBaseBuilder } from './int.common.ts';\n\nexport type PgSmallIntBuilderInitial<TName extends string> = PgSmallIntBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'PgSmallInt';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class PgSmallIntBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgSmallInt'>>\n\textends PgIntColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgSmallIntBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'PgSmallInt');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgSmallInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgSmallInt<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgSmallInt<T extends ColumnBaseConfig<'number', 'PgSmallInt'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgSmallInt';\n\n\tgetSQLType(): string {\n\t\treturn 'smallint';\n\t}\n\n\toverride mapFromDriverValue = (value: number | string): number => {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn value;\n\t};\n}\n\nexport function smallint(): PgSmallIntBuilderInitial<''>;\nexport function smallint<TName extends string>(name: TName): PgSmallIntBuilderInitial<TName>;\nexport function smallint(name?: string) {\n\treturn new PgSmallIntBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/smallserial.ts",
    "content": "import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tHasDefault,\n\tMakeColumnConfig,\n\tNotNull,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgSmallSerialBuilderInitial<TName extends string> = NotNull<\n\tHasDefault<\n\t\tPgSmallSerialBuilder<{\n\t\t\tname: TName;\n\t\t\tdataType: 'number';\n\t\t\tcolumnType: 'PgSmallSerial';\n\t\t\tdata: number;\n\t\t\tdriverParam: number;\n\t\t\tenumValues: undefined;\n\t\t}>\n\t>\n>;\n\nexport class PgSmallSerialBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgSmallSerial'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgSmallSerialBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'PgSmallSerial');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgSmallSerial<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgSmallSerial<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgSmallSerial<T extends ColumnBaseConfig<'number', 'PgSmallSerial'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgSmallSerial';\n\n\tgetSQLType(): string {\n\t\treturn 'smallserial';\n\t}\n}\n\nexport function smallserial(): PgSmallSerialBuilderInitial<''>;\nexport function smallserial<TName extends string>(name: TName): PgSmallSerialBuilderInitial<TName>;\nexport function smallserial(name?: string) {\n\treturn new PgSmallSerialBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/text.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgTextBuilderInitial<TName extends string, TEnum extends [string, ...string[]]> = PgTextBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgText';\n\tdata: TEnum[number];\n\tenumValues: TEnum;\n\tdriverParam: string;\n}>;\n\nexport class PgTextBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgText'>,\n> extends PgColumnBuilder<T, { enumValues: T['enumValues'] }> {\n\tstatic override readonly [entityKind]: string = 'PgTextBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\tconfig: PgTextConfig<T['enumValues']>,\n\t) {\n\t\tsuper(name, 'string', 'PgText');\n\t\tthis.config.enumValues = config.enum;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgText<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgText<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgText<T extends ColumnBaseConfig<'string', 'PgText'>>\n\textends PgColumn<T, { enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'PgText';\n\n\toverride readonly enumValues = this.config.enumValues;\n\n\tgetSQLType(): string {\n\t\treturn 'text';\n\t}\n}\n\nexport interface PgTextConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n> {\n\tenum?: TEnum;\n}\n\nexport function text(): PgTextBuilderInitial<'', [string, ...string[]]>;\nexport function text<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig?: PgTextConfig<T | Writable<T>>,\n): PgTextBuilderInitial<'', Writable<T>>;\nexport function text<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: TName,\n\tconfig?: PgTextConfig<T | Writable<T>>,\n): PgTextBuilderInitial<TName, Writable<T>>;\nexport function text(a?: string | PgTextConfig, b: PgTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<PgTextConfig>(a, b);\n\treturn new PgTextBuilder(name, config as any);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/time.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgDateColumnBaseBuilder } from './date.common.ts';\nimport type { Precision } from './timestamp.ts';\n\nexport type PgTimeBuilderInitial<TName extends string> = PgTimeBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgTime';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgTimeBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgTime'>> extends PgDateColumnBaseBuilder<\n\tT,\n\t{ withTimezone: boolean; precision: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgTimeBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\treadonly withTimezone: boolean,\n\t\treadonly precision: number | undefined,\n\t) {\n\t\tsuper(name, 'string', 'PgTime');\n\t\tthis.config.withTimezone = withTimezone;\n\t\tthis.config.precision = precision;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgTime<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgTime<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgTime<T extends ColumnBaseConfig<'string', 'PgTime'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgTime';\n\n\treadonly withTimezone: boolean;\n\treadonly precision: number | undefined;\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgTimeBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t\tthis.withTimezone = config.withTimezone;\n\t\tthis.precision = config.precision;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.precision === undefined ? '' : `(${this.precision})`;\n\t\treturn `time${precision}${this.withTimezone ? ' with time zone' : ''}`;\n\t}\n}\n\nexport interface TimeConfig {\n\tprecision?: Precision;\n\twithTimezone?: boolean;\n}\n\nexport function time(): PgTimeBuilderInitial<''>;\nexport function time(config?: TimeConfig): PgTimeBuilderInitial<''>;\nexport function time<TName extends string>(name: TName, config?: TimeConfig): PgTimeBuilderInitial<TName>;\nexport function time(a?: string | TimeConfig, b: TimeConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<TimeConfig>(a, b);\n\treturn new PgTimeBuilder(name, config.withTimezone ?? false, config.precision);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/timestamp.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgDateColumnBaseBuilder } from './date.common.ts';\n\nexport type PgTimestampBuilderInitial<TName extends string> = PgTimestampBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'PgTimestamp';\n\tdata: Date;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgTimestampBuilder<T extends ColumnBuilderBaseConfig<'date', 'PgTimestamp'>>\n\textends PgDateColumnBaseBuilder<\n\t\tT,\n\t\t{ withTimezone: boolean; precision: number | undefined }\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgTimestampBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\twithTimezone: boolean,\n\t\tprecision: number | undefined,\n\t) {\n\t\tsuper(name, 'date', 'PgTimestamp');\n\t\tthis.config.withTimezone = withTimezone;\n\t\tthis.config.precision = precision;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgTimestamp<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgTimestamp<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgTimestamp<T extends ColumnBaseConfig<'date', 'PgTimestamp'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgTimestamp';\n\n\treadonly withTimezone: boolean;\n\treadonly precision: number | undefined;\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgTimestampBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t\tthis.withTimezone = config.withTimezone;\n\t\tthis.precision = config.precision;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.precision === undefined ? '' : ` (${this.precision})`;\n\t\treturn `timestamp${precision}${this.withTimezone ? ' with time zone' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: Date | string): Date {\n\t\tif (typeof value === 'string') return new Date(this.withTimezone ? value : value + '+0000');\n\n\t\treturn value;\n\t}\n\n\toverride mapToDriverValue = (value: Date): string => {\n\t\treturn value.toISOString();\n\t};\n}\n\nexport type PgTimestampStringBuilderInitial<TName extends string> = PgTimestampStringBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgTimestampString';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgTimestampStringBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgTimestampString'>>\n\textends PgDateColumnBaseBuilder<\n\t\tT,\n\t\t{ withTimezone: boolean; precision: number | undefined }\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgTimestampStringBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\twithTimezone: boolean,\n\t\tprecision: number | undefined,\n\t) {\n\t\tsuper(name, 'string', 'PgTimestampString');\n\t\tthis.config.withTimezone = withTimezone;\n\t\tthis.config.precision = precision;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgTimestampString<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgTimestampString<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgTimestampString<T extends ColumnBaseConfig<'string', 'PgTimestampString'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgTimestampString';\n\n\treadonly withTimezone: boolean;\n\treadonly precision: number | undefined;\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgTimestampStringBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t\tthis.withTimezone = config.withTimezone;\n\t\tthis.precision = config.precision;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.precision === undefined ? '' : `(${this.precision})`;\n\t\treturn `timestamp${precision}${this.withTimezone ? ' with time zone' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: Date | string): string {\n\t\tif (typeof value === 'string') return value;\n\n\t\tconst shortened = value.toISOString().slice(0, -1).replace('T', ' ');\n\t\tif (this.withTimezone) {\n\t\t\tconst offset = value.getTimezoneOffset();\n\t\t\tconst sign = offset <= 0 ? '+' : '-';\n\t\t\treturn `${shortened}${sign}${Math.floor(Math.abs(offset) / 60).toString().padStart(2, '0')}`;\n\t\t}\n\n\t\treturn shortened;\n\t}\n}\n\nexport type Precision = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface PgTimestampConfig<TMode extends 'date' | 'string' = 'date' | 'string'> {\n\tmode?: TMode;\n\tprecision?: Precision;\n\twithTimezone?: boolean;\n}\n\nexport function timestamp(): PgTimestampBuilderInitial<''>;\nexport function timestamp<TMode extends PgTimestampConfig['mode'] & {}>(\n\tconfig?: PgTimestampConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? PgTimestampStringBuilderInitial<''> : PgTimestampBuilderInitial<''>;\nexport function timestamp<TName extends string, TMode extends PgTimestampConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: PgTimestampConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? PgTimestampStringBuilderInitial<TName> : PgTimestampBuilderInitial<TName>;\nexport function timestamp(a?: string | PgTimestampConfig, b: PgTimestampConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<PgTimestampConfig | undefined>(a, b);\n\tif (config?.mode === 'string') {\n\t\treturn new PgTimestampStringBuilder(name, config.withTimezone ?? false, config.precision);\n\t}\n\treturn new PgTimestampBuilder(name, config?.withTimezone ?? false, config?.precision);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/uuid.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgUUIDBuilderInitial<TName extends string> = PgUUIDBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgUUID';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgUUIDBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgUUID'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgUUIDBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'PgUUID');\n\t}\n\n\t/**\n\t * Adds `default gen_random_uuid()` to the column definition.\n\t */\n\tdefaultRandom(): ReturnType<this['default']> {\n\t\treturn this.default(sql`gen_random_uuid()`) as ReturnType<this['default']>;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgUUID<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgUUID<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgUUID<T extends ColumnBaseConfig<'string', 'PgUUID'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgUUID';\n\n\tgetSQLType(): string {\n\t\treturn 'uuid';\n\t}\n}\n\nexport function uuid(): PgUUIDBuilderInitial<''>;\nexport function uuid<TName extends string>(name: TName): PgUUIDBuilderInitial<TName>;\nexport function uuid(name?: string) {\n\treturn new PgUUIDBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/varchar.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgVarcharBuilderInitial<\n\tTName extends string,\n\tTEnum extends [string, ...string[]],\n\tTLength extends number | undefined,\n> = PgVarcharBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgVarchar';\n\tdata: TEnum[number];\n\tdriverParam: string;\n\tenumValues: TEnum;\n\tlength: TLength;\n}>;\n\nexport class PgVarcharBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgVarchar'> & { length?: number | undefined },\n> extends PgColumnBuilder<\n\tT,\n\t{ length: T['length']; enumValues: T['enumValues'] },\n\t{ length: T['length'] }\n> {\n\tstatic override readonly [entityKind]: string = 'PgVarcharBuilder';\n\n\tconstructor(name: T['name'], config: PgVarcharConfig<T['enumValues'], T['length']>) {\n\t\tsuper(name, 'string', 'PgVarchar');\n\t\tthis.config.length = config.length;\n\t\tthis.config.enumValues = config.enum;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgVarchar<MakeColumnConfig<T, TTableName> & { length: T['length'] }> {\n\t\treturn new PgVarchar<MakeColumnConfig<T, TTableName> & { length: T['length'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgVarchar<T extends ColumnBaseConfig<'string', 'PgVarchar'> & { length?: number | undefined }>\n\textends PgColumn<T, { length: T['length']; enumValues: T['enumValues'] }, { length: T['length'] }>\n{\n\tstatic override readonly [entityKind]: string = 'PgVarchar';\n\n\treadonly length = this.config.length;\n\toverride readonly enumValues = this.config.enumValues;\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `varchar` : `varchar(${this.length})`;\n\t}\n}\n\nexport interface PgVarcharConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n\tTLength extends number | undefined = number | undefined,\n> {\n\tenum?: TEnum;\n\tlength?: TLength;\n}\n\nexport function varchar(): PgVarcharBuilderInitial<'', [string, ...string[]], undefined>;\nexport function varchar<\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n>(\n\tconfig?: PgVarcharConfig<T | Writable<T>, L>,\n): PgVarcharBuilderInitial<'', Writable<T>, L>;\nexport function varchar<\n\tTName extends string,\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n>(\n\tname: TName,\n\tconfig?: PgVarcharConfig<T | Writable<T>, L>,\n): PgVarcharBuilderInitial<TName, Writable<T>, L>;\nexport function varchar(a?: string | PgVarcharConfig, b: PgVarcharConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<PgVarcharConfig>(a, b);\n\treturn new PgVarcharBuilder(name, config as any);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/vector_extension/bit.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport type PgBinaryVectorBuilderInitial<TName extends string, TDimensions extends number> = PgBinaryVectorBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgBinaryVector';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n\tdimensions: TDimensions;\n}>;\n\nexport class PgBinaryVectorBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgBinaryVector'> & { dimensions: number },\n> extends PgColumnBuilder<\n\tT,\n\t{ dimensions: T['dimensions'] }\n> {\n\tstatic override readonly [entityKind]: string = 'PgBinaryVectorBuilder';\n\n\tconstructor(name: string, config: PgBinaryVectorConfig<T['dimensions']>) {\n\t\tsuper(name, 'string', 'PgBinaryVector');\n\t\tthis.config.dimensions = config.dimensions;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgBinaryVector<MakeColumnConfig<T, TTableName> & { dimensions: T['dimensions'] }> {\n\t\treturn new PgBinaryVector<MakeColumnConfig<T, TTableName> & { dimensions: T['dimensions'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgBinaryVector<T extends ColumnBaseConfig<'string', 'PgBinaryVector'> & { dimensions: number }>\n\textends PgColumn<T, { dimensions: T['dimensions'] }, { dimensions: T['dimensions'] }>\n{\n\tstatic override readonly [entityKind]: string = 'PgBinaryVector';\n\n\treadonly dimensions = this.config.dimensions;\n\n\tgetSQLType(): string {\n\t\treturn `bit(${this.dimensions})`;\n\t}\n}\n\nexport interface PgBinaryVectorConfig<TDimensions extends number = number> {\n\tdimensions: TDimensions;\n}\n\nexport function bit<D extends number>(\n\tconfig: PgBinaryVectorConfig<D>,\n): PgBinaryVectorBuilderInitial<'', D>;\nexport function bit<TName extends string, D extends number>(\n\tname: TName,\n\tconfig: PgBinaryVectorConfig<D>,\n): PgBinaryVectorBuilderInitial<TName, D>;\nexport function bit(a: string | PgBinaryVectorConfig, b?: PgBinaryVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgBinaryVectorConfig>(a, b);\n\treturn new PgBinaryVectorBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/vector_extension/halfvec.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport type PgHalfVectorBuilderInitial<TName extends string, TDimensions extends number> = PgHalfVectorBuilder<{\n\tname: TName;\n\tdataType: 'array';\n\tcolumnType: 'PgHalfVector';\n\tdata: number[];\n\tdriverParam: string;\n\tenumValues: undefined;\n\tdimensions: TDimensions;\n}>;\n\nexport class PgHalfVectorBuilder<T extends ColumnBuilderBaseConfig<'array', 'PgHalfVector'> & { dimensions: number }>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{ dimensions: T['dimensions'] },\n\t\t{ dimensions: T['dimensions'] }\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgHalfVectorBuilder';\n\n\tconstructor(name: string, config: PgHalfVectorConfig<T['dimensions']>) {\n\t\tsuper(name, 'array', 'PgHalfVector');\n\t\tthis.config.dimensions = config.dimensions;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgHalfVector<MakeColumnConfig<T, TTableName> & { dimensions: T['dimensions'] }> {\n\t\treturn new PgHalfVector<MakeColumnConfig<T, TTableName> & { dimensions: T['dimensions'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgHalfVector<T extends ColumnBaseConfig<'array', 'PgHalfVector'> & { dimensions: number }>\n\textends PgColumn<T, { dimensions: T['dimensions'] }, { dimensions: T['dimensions'] }>\n{\n\tstatic override readonly [entityKind]: string = 'PgHalfVector';\n\n\treadonly dimensions: T['dimensions'] = this.config.dimensions;\n\n\tgetSQLType(): string {\n\t\treturn `halfvec(${this.dimensions})`;\n\t}\n\n\toverride mapToDriverValue(value: unknown): unknown {\n\t\treturn JSON.stringify(value);\n\t}\n\n\toverride mapFromDriverValue(value: string): unknown {\n\t\treturn value\n\t\t\t.slice(1, -1)\n\t\t\t.split(',')\n\t\t\t.map((v) => Number.parseFloat(v));\n\t}\n}\n\nexport interface PgHalfVectorConfig<TDimensions extends number = number> {\n\tdimensions: TDimensions;\n}\n\nexport function halfvec<D extends number>(\n\tconfig: PgHalfVectorConfig<D>,\n): PgHalfVectorBuilderInitial<'', D>;\nexport function halfvec<TName extends string, D extends number>(\n\tname: TName,\n\tconfig: PgHalfVectorConfig,\n): PgHalfVectorBuilderInitial<TName, D>;\nexport function halfvec(a: string | PgHalfVectorConfig, b?: PgHalfVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgHalfVectorConfig>(a, b);\n\treturn new PgHalfVectorBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/vector_extension/sparsevec.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport type PgSparseVectorBuilderInitial<TName extends string> = PgSparseVectorBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgSparseVector';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgSparseVectorBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgSparseVector'>>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{ dimensions: number | undefined }\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgSparseVectorBuilder';\n\n\tconstructor(name: string, config: PgSparseVectorConfig) {\n\t\tsuper(name, 'string', 'PgSparseVector');\n\t\tthis.config.dimensions = config.dimensions;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgSparseVector<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgSparseVector<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgSparseVector<T extends ColumnBaseConfig<'string', 'PgSparseVector'>>\n\textends PgColumn<T, { dimensions: number | undefined }>\n{\n\tstatic override readonly [entityKind]: string = 'PgSparseVector';\n\n\treadonly dimensions = this.config.dimensions;\n\n\tgetSQLType(): string {\n\t\treturn `sparsevec(${this.dimensions})`;\n\t}\n}\n\nexport interface PgSparseVectorConfig {\n\tdimensions: number;\n}\n\nexport function sparsevec(\n\tconfig: PgSparseVectorConfig,\n): PgSparseVectorBuilderInitial<''>;\nexport function sparsevec<TName extends string>(\n\tname: TName,\n\tconfig: PgSparseVectorConfig,\n): PgSparseVectorBuilderInitial<TName>;\nexport function sparsevec(a: string | PgSparseVectorConfig, b?: PgSparseVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgSparseVectorConfig>(a, b);\n\treturn new PgSparseVectorBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/columns/vector_extension/vector.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport type PgVectorBuilderInitial<TName extends string, TDimensions extends number> = PgVectorBuilder<{\n\tname: TName;\n\tdataType: 'array';\n\tcolumnType: 'PgVector';\n\tdata: number[];\n\tdriverParam: string;\n\tenumValues: undefined;\n\tdimensions: TDimensions;\n}>;\n\nexport class PgVectorBuilder<T extends ColumnBuilderBaseConfig<'array', 'PgVector'> & { dimensions: number }>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{ dimensions: T['dimensions'] },\n\t\t{ dimensions: T['dimensions'] }\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgVectorBuilder';\n\n\tconstructor(name: string, config: PgVectorConfig<T['dimensions']>) {\n\t\tsuper(name, 'array', 'PgVector');\n\t\tthis.config.dimensions = config.dimensions;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgVector<MakeColumnConfig<T, TTableName> & { dimensions: T['dimensions'] }> {\n\t\treturn new PgVector<MakeColumnConfig<T, TTableName> & { dimensions: T['dimensions'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgVector<T extends ColumnBaseConfig<'array', 'PgVector'> & { dimensions: number | undefined }>\n\textends PgColumn<T, { dimensions: T['dimensions'] }, { dimensions: T['dimensions'] }>\n{\n\tstatic override readonly [entityKind]: string = 'PgVector';\n\n\treadonly dimensions: T['dimensions'] = this.config.dimensions;\n\n\tgetSQLType(): string {\n\t\treturn `vector(${this.dimensions})`;\n\t}\n\n\toverride mapToDriverValue(value: unknown): unknown {\n\t\treturn JSON.stringify(value);\n\t}\n\n\toverride mapFromDriverValue(value: string): unknown {\n\t\treturn value\n\t\t\t.slice(1, -1)\n\t\t\t.split(',')\n\t\t\t.map((v) => Number.parseFloat(v));\n\t}\n}\n\nexport interface PgVectorConfig<TDimensions extends number = number> {\n\tdimensions: TDimensions;\n}\n\nexport function vector<D extends number>(\n\tconfig: PgVectorConfig<D>,\n): PgVectorBuilderInitial<'', D>;\nexport function vector<TName extends string, D extends number>(\n\tname: TName,\n\tconfig: PgVectorConfig<D>,\n): PgVectorBuilderInitial<TName, D>;\nexport function vector(a: string | PgVectorConfig, b?: PgVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgVectorConfig>(a, b);\n\treturn new PgVectorBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/db.ts",
    "content": "import type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport {\n\tPgDeleteBase,\n\tPgInsertBuilder,\n\tPgSelectBuilder,\n\tPgUpdateBuilder,\n\tQueryBuilder,\n} from '~/pg-core/query-builders/index.ts';\nimport type {\n\tPgQueryResultHKT,\n\tPgQueryResultKind,\n\tPgSession,\n\tPgTransaction,\n\tPgTransactionConfig,\n\tPreparedQueryConfig,\n} from '~/pg-core/session.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { type ColumnsSelection, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { DrizzleTypeError, NeonAuthToken } from '~/utils.ts';\nimport type { PgColumn } from './columns/index.ts';\nimport { PgCountBuilder } from './query-builders/count.ts';\nimport { RelationalQueryBuilder } from './query-builders/query.ts';\nimport { PgRaw } from './query-builders/raw.ts';\nimport { PgRefreshMaterializedView } from './query-builders/refresh-materialized-view.ts';\nimport type { SelectedFields } from './query-builders/select.types.ts';\nimport type { WithBuilder } from './subquery.ts';\nimport type { PgViewBase } from './view-base.ts';\nimport type { PgMaterializedView } from './view.ts';\n\nexport class PgDatabase<\n\tTQueryResult extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = ExtractTablesWithRelations<TFullSchema>,\n> {\n\tstatic readonly [entityKind]: string = 'PgDatabase';\n\n\tdeclare readonly _: {\n\t\treadonly schema: TSchema | undefined;\n\t\treadonly fullSchema: TFullSchema;\n\t\treadonly tableNamesMap: Record<string, string>;\n\t\treadonly session: PgSession<TQueryResult, TFullSchema, TSchema>;\n\t};\n\n\tquery: TFullSchema extends Record<string, never>\n\t\t? DrizzleTypeError<'Seems like the schema generic is missing - did you forget to add it to your DB type?'>\n\t\t: {\n\t\t\t[K in keyof TSchema]: RelationalQueryBuilder<TSchema, TSchema[K]>;\n\t\t};\n\n\tconstructor(\n\t\t/** @internal */\n\t\treadonly dialect: PgDialect,\n\t\t/** @internal */\n\t\treadonly session: PgSession<any, any, any>,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t) {\n\t\tthis._ = schema\n\t\t\t? {\n\t\t\t\tschema: schema.schema,\n\t\t\t\tfullSchema: schema.fullSchema as TFullSchema,\n\t\t\t\ttableNamesMap: schema.tableNamesMap,\n\t\t\t\tsession,\n\t\t\t}\n\t\t\t: {\n\t\t\t\tschema: undefined,\n\t\t\t\tfullSchema: {} as TFullSchema,\n\t\t\t\ttableNamesMap: {},\n\t\t\t\tsession,\n\t\t\t};\n\t\tthis.query = {} as typeof this['query'];\n\t\tif (this._.schema) {\n\t\t\tfor (const [tableName, columns] of Object.entries(this._.schema)) {\n\t\t\t\t(this.query as PgDatabase<TQueryResult, Record<string, any>>['query'])[tableName] = new RelationalQueryBuilder(\n\t\t\t\t\tschema!.fullSchema,\n\t\t\t\t\tthis._.schema,\n\t\t\t\t\tthis._.tableNamesMap,\n\t\t\t\t\tschema!.fullSchema[tableName] as PgTable,\n\t\t\t\t\tcolumns,\n\t\t\t\t\tdialect,\n\t\t\t\t\tsession,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tthis.$cache = { invalidate: async (_params: any) => {} };\n\t}\n\n\t/**\n\t * Creates a subquery that defines a temporary named result set as a CTE.\n\t *\n\t * It is useful for breaking down complex queries into simpler parts and for reusing the result set in subsequent parts of the query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param alias The alias for the subquery.\n\t *\n\t * Failure to provide an alias will result in a DrizzleTypeError, preventing the subquery from being referenced in other queries.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Create a subquery with alias 'sq' and use it in the select query\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t *\n\t * To select arbitrary SQL values as fields in a CTE and reference them in other CTEs or in the main query, you need to add aliases to them:\n\t *\n\t * ```ts\n\t * // Select an arbitrary SQL value as a field in a CTE and reference it in the main query\n\t * const sq = db.$with('sq').as(db.select({\n\t *   name: sql<string>`upper(${users.name})`.as('name'),\n\t * })\n\t * .from(users));\n\t *\n\t * const result = await db.with(sq).select({ name: sq.name }).from(sq);\n\t * ```\n\t */\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst self = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(new QueryBuilder(self.dialect));\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t);\n\t\t};\n\t\treturn { as };\n\t};\n\n\t$count(\n\t\tsource: PgTable | PgViewBase | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t) {\n\t\treturn new PgCountBuilder({ source, filters, session: this.session });\n\t}\n\n\t$cache: { invalidate: Cache['onMutate'] };\n\n\t/**\n\t * Incorporates a previously defined CTE (using `$with`) into the main query.\n\t *\n\t * This method allows the main query to reference a temporary named result set.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param queries The CTEs to incorporate into the main query.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Define a subquery 'sq' as a CTE using $with\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * // Incorporate the CTE 'sq' into the main query and select from it\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t */\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\t/**\n\t\t * Creates a select query.\n\t\t *\n\t\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all columns and all rows from the 'cars' table\n\t\t * const allCars: Car[] = await db.select().from(cars);\n\t\t *\n\t\t * // Select specific columns and all rows from the 'cars' table\n\t\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t\t *   id: cars.id,\n\t\t *   brand: cars.brand\n\t\t * })\n\t\t *   .from(cars);\n\t\t * ```\n\t\t *\n\t\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t\t *\n\t\t * ```ts\n\t\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t\t *   id: cars.id,\n\t\t *   lowerBrand: sql<string>`lower(${cars.brand})`,\n\t\t * })\n\t\t *   .from(cars);\n\t\t * ```\n\t\t */\n\t\tfunction select(): PgSelectBuilder<undefined>;\n\t\tfunction select<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection>;\n\t\tfunction select<TSelection extends SelectedFields>(fields?: TSelection): PgSelectBuilder<TSelection | undefined> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct` expression to the select query.\n\t\t *\n\t\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * // Select all unique rows from the 'cars' table\n\t\t * await db.selectDistinct()\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.id, cars.brand, cars.color);\n\t\t *\n\t\t * // Select all unique brands from the 'cars' table\n\t\t * await db.selectDistinct({ brand: cars.brand })\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.brand);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinct(): PgSelectBuilder<undefined>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): PgSelectBuilder<TSelection | undefined> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct on` expression to the select query.\n\t\t *\n\t\t * Calling this method will specify how the unique rows are determined.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param on The expression defining uniqueness.\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * // Select the first row for each unique brand from the 'cars' table\n\t\t * await db.selectDistinctOn([cars.brand])\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.brand);\n\t\t *\n\t\t * // Selects the first occurrence of each unique car brand along with its color from the 'cars' table\n\t\t * await db.selectDistinctOn([cars.brand], { brand: cars.brand, color: cars.color })\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.brand, cars.color);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinctOn(on: (PgColumn | SQLWrapper)[]): PgSelectBuilder<undefined>;\n\t\tfunction selectDistinctOn<TSelection extends SelectedFields>(\n\t\t\ton: (PgColumn | SQLWrapper)[],\n\t\t\tfields: TSelection,\n\t\t): PgSelectBuilder<TSelection>;\n\t\tfunction selectDistinctOn<TSelection extends SelectedFields>(\n\t\t\ton: (PgColumn | SQLWrapper)[],\n\t\t\tfields?: TSelection,\n\t\t): PgSelectBuilder<TSelection | undefined> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: { on },\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Creates an update query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t\t *\n\t\t * Use `.set()` method to specify which values to update.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t\t *\n\t\t * @param table The table to update.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Update all rows in the 'cars' table\n\t\t * await db.update(cars).set({ color: 'red' });\n\t\t *\n\t\t * // Update rows with filters and conditions\n\t\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t\t *\n\t\t * // Update with returning clause\n\t\t * const updatedCar: Car[] = await db.update(cars)\n\t\t *   .set({ color: 'red' })\n\t\t *   .where(eq(cars.id, 1))\n\t\t *   .returning();\n\t\t * ```\n\t\t */\n\t\tfunction update<TTable extends PgTable>(table: TTable): PgUpdateBuilder<TTable, TQueryResult> {\n\t\t\treturn new PgUpdateBuilder(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates an insert query.\n\t\t *\n\t\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t\t *\n\t\t * @param table The table to insert into.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Insert one row\n\t\t * await db.insert(cars).values({ brand: 'BMW' });\n\t\t *\n\t\t * // Insert multiple rows\n\t\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t\t *\n\t\t * // Insert with returning clause\n\t\t * const insertedCar: Car[] = await db.insert(cars)\n\t\t *   .values({ brand: 'BMW' })\n\t\t *   .returning();\n\t\t * ```\n\t\t */\n\t\tfunction insert<TTable extends PgTable>(table: TTable): PgInsertBuilder<TTable, TQueryResult> {\n\t\t\treturn new PgInsertBuilder(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates a delete query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t\t *\n\t\t * @param table The table to delete from.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Delete all rows in the 'cars' table\n\t\t * await db.delete(cars);\n\t\t *\n\t\t * // Delete rows with filters and conditions\n\t\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t\t *\n\t\t * // Delete with returning clause\n\t\t * const deletedCar: Car[] = await db.delete(cars)\n\t\t *   .where(eq(cars.id, 1))\n\t\t *   .returning();\n\t\t * ```\n\t\t */\n\t\tfunction delete_<TTable extends PgTable>(table: TTable): PgDeleteBase<TTable, TQueryResult> {\n\t\t\treturn new PgDeleteBase(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\treturn { select, selectDistinct, selectDistinctOn, update, insert, delete: delete_ };\n\t}\n\n\t/**\n\t * Creates a select query.\n\t *\n\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all columns and all rows from the 'cars' table\n\t * const allCars: Car[] = await db.select().from(cars);\n\t *\n\t * // Select specific columns and all rows from the 'cars' table\n\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t *   id: cars.id,\n\t *   brand: cars.brand\n\t * })\n\t *   .from(cars);\n\t * ```\n\t *\n\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t *\n\t * ```ts\n\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t *   id: cars.id,\n\t *   lowerBrand: sql<string>`lower(${cars.brand})`,\n\t * })\n\t *   .from(cars);\n\t * ```\n\t */\n\tselect(): PgSelectBuilder<undefined>;\n\tselect<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection>;\n\tselect<TSelection extends SelectedFields>(fields?: TSelection): PgSelectBuilder<TSelection | undefined> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t});\n\t}\n\n\t/**\n\t * Adds `distinct` expression to the select query.\n\t *\n\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t * ```ts\n\t * // Select all unique rows from the 'cars' table\n\t * await db.selectDistinct()\n\t *   .from(cars)\n\t *   .orderBy(cars.id, cars.brand, cars.color);\n\t *\n\t * // Select all unique brands from the 'cars' table\n\t * await db.selectDistinct({ brand: cars.brand })\n\t *   .from(cars)\n\t *   .orderBy(cars.brand);\n\t * ```\n\t */\n\tselectDistinct(): PgSelectBuilder<undefined>;\n\tselectDistinct<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection>;\n\tselectDistinct<TSelection extends SelectedFields>(fields?: TSelection): PgSelectBuilder<TSelection | undefined> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t/**\n\t * Adds `distinct on` expression to the select query.\n\t *\n\t * Calling this method will specify how the unique rows are determined.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param on The expression defining uniqueness.\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t * ```ts\n\t * // Select the first row for each unique brand from the 'cars' table\n\t * await db.selectDistinctOn([cars.brand])\n\t *   .from(cars)\n\t *   .orderBy(cars.brand);\n\t *\n\t * // Selects the first occurrence of each unique car brand along with its color from the 'cars' table\n\t * await db.selectDistinctOn([cars.brand], { brand: cars.brand, color: cars.color })\n\t *   .from(cars)\n\t *   .orderBy(cars.brand, cars.color);\n\t * ```\n\t */\n\tselectDistinctOn(on: (PgColumn | SQLWrapper)[]): PgSelectBuilder<undefined>;\n\tselectDistinctOn<TSelection extends SelectedFields>(\n\t\ton: (PgColumn | SQLWrapper)[],\n\t\tfields: TSelection,\n\t): PgSelectBuilder<TSelection>;\n\tselectDistinctOn<TSelection extends SelectedFields>(\n\t\ton: (PgColumn | SQLWrapper)[],\n\t\tfields?: TSelection,\n\t): PgSelectBuilder<TSelection | undefined> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: { on },\n\t\t});\n\t}\n\n\t/**\n\t * Creates an update query.\n\t *\n\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t *\n\t * Use `.set()` method to specify which values to update.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param table The table to update.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Update all rows in the 'cars' table\n\t * await db.update(cars).set({ color: 'red' });\n\t *\n\t * // Update rows with filters and conditions\n\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t *\n\t * // Update with returning clause\n\t * const updatedCar: Car[] = await db.update(cars)\n\t *   .set({ color: 'red' })\n\t *   .where(eq(cars.id, 1))\n\t *   .returning();\n\t * ```\n\t */\n\tupdate<TTable extends PgTable>(table: TTable): PgUpdateBuilder<TTable, TQueryResult> {\n\t\treturn new PgUpdateBuilder(table, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates an insert query.\n\t *\n\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t *\n\t * @param table The table to insert into.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Insert one row\n\t * await db.insert(cars).values({ brand: 'BMW' });\n\t *\n\t * // Insert multiple rows\n\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t *\n\t * // Insert with returning clause\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t *   .values({ brand: 'BMW' })\n\t *   .returning();\n\t * ```\n\t */\n\tinsert<TTable extends PgTable>(table: TTable): PgInsertBuilder<TTable, TQueryResult> {\n\t\treturn new PgInsertBuilder(table, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates a delete query.\n\t *\n\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param table The table to delete from.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Delete all rows in the 'cars' table\n\t * await db.delete(cars);\n\t *\n\t * // Delete rows with filters and conditions\n\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t *\n\t * // Delete with returning clause\n\t * const deletedCar: Car[] = await db.delete(cars)\n\t *   .where(eq(cars.id, 1))\n\t *   .returning();\n\t * ```\n\t */\n\tdelete<TTable extends PgTable>(table: TTable): PgDeleteBase<TTable, TQueryResult> {\n\t\treturn new PgDeleteBase(table, this.session, this.dialect);\n\t}\n\n\trefreshMaterializedView<TView extends PgMaterializedView>(view: TView): PgRefreshMaterializedView<TQueryResult> {\n\t\treturn new PgRefreshMaterializedView(view, this.session, this.dialect);\n\t}\n\n\tprotected authToken?: NeonAuthToken;\n\n\texecute<TRow extends Record<string, unknown> = Record<string, unknown>>(\n\t\tquery: SQLWrapper | string,\n\t): PgRaw<PgQueryResultKind<TQueryResult, TRow>> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tconst builtQuery = this.dialect.sqlToQuery(sequel);\n\t\tconst prepared = this.session.prepareQuery<\n\t\t\tPreparedQueryConfig & { execute: PgQueryResultKind<TQueryResult, TRow> }\n\t\t>(\n\t\t\tbuiltQuery,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t);\n\t\treturn new PgRaw(\n\t\t\t() => prepared.execute(undefined, this.authToken),\n\t\t\tsequel,\n\t\t\tbuiltQuery,\n\t\t\t(result) => prepared.mapResult(result, true),\n\t\t);\n\t}\n\n\ttransaction<T>(\n\t\ttransaction: (tx: PgTransaction<TQueryResult, TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T> {\n\t\treturn this.session.transaction(transaction, config);\n\t}\n}\n\nexport type PgWithReplicas<Q> = Q & { $primary: Q; $replicas: Q[] };\n\nexport const withReplicas = <\n\tHKT extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n\tQ extends PgDatabase<\n\t\tHKT,\n\t\tTFullSchema,\n\t\tTSchema extends Record<string, unknown> ? ExtractTablesWithRelations<TFullSchema> : TSchema\n\t>,\n>(\n\tprimary: Q,\n\treplicas: [Q, ...Q[]],\n\tgetReplica: (replicas: Q[]) => Q = () => replicas[Math.floor(Math.random() * replicas.length)]!,\n): PgWithReplicas<Q> => {\n\tconst select: Q['select'] = (...args: []) => getReplica(replicas).select(...args);\n\tconst selectDistinct: Q['selectDistinct'] = (...args: []) => getReplica(replicas).selectDistinct(...args);\n\tconst selectDistinctOn: Q['selectDistinctOn'] = (...args: [any]) => getReplica(replicas).selectDistinctOn(...args);\n\tconst $count: Q['$count'] = (...args: [any]) => getReplica(replicas).$count(...args);\n\tconst _with: Q['with'] = (...args: any) => getReplica(replicas).with(...args);\n\tconst $with: Q['$with'] = (arg: any) => getReplica(replicas).$with(arg) as any;\n\n\tconst update: Q['update'] = (...args: [any]) => primary.update(...args);\n\tconst insert: Q['insert'] = (...args: [any]) => primary.insert(...args);\n\tconst $delete: Q['delete'] = (...args: [any]) => primary.delete(...args);\n\tconst execute: Q['execute'] = (...args: [any]) => primary.execute(...args);\n\tconst transaction: Q['transaction'] = (...args: [any]) => primary.transaction(...args);\n\tconst refreshMaterializedView: Q['refreshMaterializedView'] = (...args: [any]) =>\n\t\tprimary.refreshMaterializedView(...args);\n\n\treturn {\n\t\t...primary,\n\t\tupdate,\n\t\tinsert,\n\t\tdelete: $delete,\n\t\texecute,\n\t\ttransaction,\n\t\trefreshMaterializedView,\n\t\t$primary: primary,\n\t\t$replicas: replicas,\n\t\tselect,\n\t\tselectDistinct,\n\t\tselectDistinctOn,\n\t\t$count,\n\t\t$with,\n\t\twith: _with,\n\t\tget query() {\n\t\t\treturn getReplica(replicas).query;\n\t\t},\n\t};\n};\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/dialect.ts",
    "content": "import { aliasedTable, aliasedTableColumn, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta } from '~/migrator.ts';\nimport {\n\tPgColumn,\n\tPgDate,\n\tPgDateString,\n\tPgJson,\n\tPgJsonb,\n\tPgNumeric,\n\tPgTime,\n\tPgTimestamp,\n\tPgTimestampString,\n\tPgUUID,\n} from '~/pg-core/columns/index.ts';\nimport type {\n\tAnyPgSelectQueryBuilder,\n\tPgDeleteConfig,\n\tPgInsertConfig,\n\tPgSelectJoinConfig,\n\tPgUpdateConfig,\n} from '~/pg-core/query-builders/index.ts';\nimport type { PgSelectConfig, SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport { PgTable } from '~/pg-core/table.ts';\nimport {\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tgetOperators,\n\tgetOrderByOperators,\n\tMany,\n\tnormalizeRelation,\n\tOne,\n\ttype Relation,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { and, eq, View } from '~/sql/index.ts';\nimport {\n\ttype DriverValueEncoder,\n\ttype Name,\n\tParam,\n\ttype QueryTypingsValue,\n\ttype QueryWithTypings,\n\tSQL,\n\tsql,\n\ttype SQLChunk,\n} from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table } from '~/table.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { PgSession } from './session.ts';\nimport { PgViewBase } from './view-base.ts';\nimport type { PgMaterializedView } from './view.ts';\n\nexport interface PgDialectConfig {\n\tcasing?: Casing;\n}\n\nexport class PgDialect {\n\tstatic readonly [entityKind]: string = 'PgDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: PgDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\t}\n\n\tasync migrate(migrations: MigrationMeta[], session: PgSession, config: string | MigrationConfig): Promise<void> {\n\t\tconst migrationsTable = typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\t\tconst migrationsSchema = typeof config === 'string' ? 'drizzle' : config.migrationsSchema ?? 'drizzle';\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at bigint\n\t\t\t)\n\t\t`;\n\t\tawait session.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);\n\t\tawait session.execute(migrationTableCreate);\n\n\t\tconst dbMigrations = await session.all<{ id: number; hash: string; created_at: string }>(\n\t\t\tsql`select id, hash, created_at from ${sql.identifier(migrationsSchema)}.${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} order by created_at desc limit 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0];\n\t\tawait session.transaction(async (tx) => {\n\t\t\tfor await (const migration of migrations) {\n\t\t\t\tif (\n\t\t\t\t\t!lastDbMigration\n\t\t\t\t\t|| Number(lastDbMigration.created_at) < migration.folderMillis\n\t\t\t\t) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tawait tx.execute(\n\t\t\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\"hash\", \"created_at\") values(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\"${name}\"`;\n\t}\n\n\tescapeParam(num: number): string {\n\t\treturn `$${num + 1}`;\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({ table, where, returning, withList }: PgDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${returningSql}`;\n\t}\n\n\tbuildUpdateSet(table: PgTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter((colName) =>\n\t\t\tset[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined\n\t\t);\n\n\t\tconst setSize = columnNames.length;\n\t\treturn sql.join(columnNames.flatMap((colName, i) => {\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tconst onUpdateFnResult = col.onUpdateFn?.();\n\t\t\tconst value = set[colName] ?? (is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col));\n\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\tif (i < setSize - 1) {\n\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t}\n\t\t\treturn [res];\n\t\t}));\n\t}\n\n\tbuildUpdateQuery({ table, set, where, returning, withList, from, joins }: PgUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst tableName = table[PgTable.Symbol.Name];\n\t\tconst tableSchema = table[PgTable.Symbol.Schema];\n\t\tconst origTableName = table[PgTable.Symbol.OriginalName];\n\t\tconst alias = tableName === origTableName ? undefined : tableName;\n\t\tconst tableSql = sql`${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${\n\t\t\tsql.identifier(origTableName)\n\t\t}${alias && sql` ${sql.identifier(alias)}`}`;\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst fromSql = from && sql.join([sql.raw(' from '), this.buildFromTable(from)]);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: !from })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\treturn sql`${withSql}update ${tableSql} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields\n\t\t\t.flatMap(({ field }, i) => {\n\t\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tnew SQL(\n\t\t\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\t\t\tif (is(c, PgColumn)) {\n\t\t\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn c;\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(query);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Column)) {\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(sql.identifier(this.casing.getColumnCasing(field)));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(field);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\t\tconst entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];\n\n\t\t\t\t\tif (entries.length === 1) {\n\t\t\t\t\t\tconst entry = entries[0]![1];\n\n\t\t\t\t\t\tconst fieldDecoder = is(entry, SQL)\n\t\t\t\t\t\t\t? entry.decoder\n\t\t\t\t\t\t\t: is(entry, Column)\n\t\t\t\t\t\t\t? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }\n\t\t\t\t\t\t\t: entry.sql.decoder;\n\n\t\t\t\t\t\tif (fieldDecoder) {\n\t\t\t\t\t\t\tfield._.sql.decoder = fieldDecoder;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tchunk.push(field);\n\t\t\t\t}\n\n\t\t\t\tif (i < columnsLen - 1) {\n\t\t\t\t\tchunk.push(sql`, `);\n\t\t\t\t}\n\n\t\t\t\treturn chunk;\n\t\t\t});\n\n\t\treturn sql.join(chunks);\n\t}\n\n\tprivate buildJoins(joins: PgSelectJoinConfig[] | undefined): SQL | undefined {\n\t\tif (!joins || joins.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst joinsArray: SQL[] = [];\n\n\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\tif (index === 0) {\n\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t}\n\t\t\tconst table = joinMeta.table;\n\t\t\tconst lateralSql = joinMeta.lateral ? sql` lateral` : undefined;\n\t\t\tconst onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;\n\n\t\t\tif (is(table, PgTable)) {\n\t\t\t\tconst tableName = table[PgTable.Symbol.Name];\n\t\t\t\tconst tableSchema = table[PgTable.Symbol.Schema];\n\t\t\t\tconst origTableName = table[PgTable.Symbol.OriginalName];\n\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\tjoinsArray.push(\n\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\ttableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined\n\t\t\t\t\t}${sql.identifier(origTableName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t);\n\t\t\t} else if (is(table, View)) {\n\t\t\t\tconst viewName = table[ViewBaseConfig].name;\n\t\t\t\tconst viewSchema = table[ViewBaseConfig].schema;\n\t\t\t\tconst origViewName = table[ViewBaseConfig].originalName;\n\t\t\t\tconst alias = viewName === origViewName ? undefined : joinMeta.alias;\n\t\t\t\tjoinsArray.push(\n\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\tviewSchema ? sql`${sql.identifier(viewSchema)}.` : undefined\n\t\t\t\t\t}${sql.identifier(origViewName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tjoinsArray.push(\n\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${table}${onSql}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (index < joins.length - 1) {\n\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t}\n\t\t}\n\n\t\treturn sql.join(joinsArray);\n\t}\n\n\tprivate buildFromTable(\n\t\ttable: SQL | Subquery | PgViewBase | PgTable | undefined,\n\t): SQL | Subquery | PgViewBase | PgTable | undefined {\n\t\tif (is(table, Table) && table[Table.Symbol.IsAlias]) {\n\t\t\tlet fullName = sql`${sql.identifier(table[Table.Symbol.OriginalName])}`;\n\t\t\tif (table[Table.Symbol.Schema]) {\n\t\t\t\tfullName = sql`${sql.identifier(table[Table.Symbol.Schema]!)}.${fullName}`;\n\t\t\t}\n\t\t\treturn sql`${fullName} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t}\n\n\t\treturn table;\n\t}\n\n\tbuildSelectQuery(\n\t\t{\n\t\t\twithList,\n\t\t\tfields,\n\t\t\tfieldsFlat,\n\t\t\twhere,\n\t\t\thaving,\n\t\t\ttable,\n\t\t\tjoins,\n\t\t\torderBy,\n\t\t\tgroupBy,\n\t\t\tlimit,\n\t\t\toffset,\n\t\t\tlockingClause,\n\t\t\tdistinct,\n\t\t\tsetOperators,\n\t\t}: PgSelectConfig,\n\t): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<PgColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, PgViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(({ alias }) =>\n\t\t\t\t\t\talias === (table[Table.Symbol.IsAlias] ? getTableName(table) : table[Table.Symbol.BaseName])\n\t\t\t\t\t))(f.field.table)\n\t\t\t) {\n\t\t\t\tconst tableName = getTableName(f.field.table);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Your \"${\n\t\t\t\t\t\tf.path.join('->')\n\t\t\t\t\t}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst isSingleTable = !joins || joins.length === 0;\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tlet distinctSql: SQL | undefined;\n\t\tif (distinct) {\n\t\t\tdistinctSql = distinct === true ? sql` distinct` : sql` distinct on (${sql.join(distinct.on, sql`, `)})`;\n\t\t}\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable });\n\n\t\tconst tableSql = this.buildFromTable(table);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\torderBySql = sql` order by ${sql.join(orderBy, sql`, `)}`;\n\t\t}\n\n\t\tlet groupBySql;\n\t\tif (groupBy && groupBy.length > 0) {\n\t\t\tgroupBySql = sql` group by ${sql.join(groupBy, sql`, `)}`;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tconst lockingClauseSql = sql.empty();\n\t\tif (lockingClause) {\n\t\t\tconst clauseSql = sql` for ${sql.raw(lockingClause.strength)}`;\n\t\t\tif (lockingClause.config.of) {\n\t\t\t\tclauseSql.append(\n\t\t\t\t\tsql` of ${\n\t\t\t\t\t\tsql.join(\n\t\t\t\t\t\t\tArray.isArray(lockingClause.config.of) ? lockingClause.config.of : [lockingClause.config.of],\n\t\t\t\t\t\t\tsql`, `,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (lockingClause.config.noWait) {\n\t\t\t\tclauseSql.append(sql` nowait`);\n\t\t\t} else if (lockingClause.config.skipLocked) {\n\t\t\t\tclauseSql.append(sql` skip locked`);\n\t\t\t}\n\t\t\tlockingClauseSql.append(clauseSql);\n\t\t}\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}${lockingClauseSql}`;\n\n\t\tif (setOperators.length > 0) {\n\t\t\treturn this.buildSetOperations(finalQuery, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(leftSelect: SQL, setOperators: PgSelectConfig['setOperators']): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: { leftSelect: SQL; setOperator: PgSelectConfig['setOperators'][number] }): SQL {\n\t\tconst leftChunk = sql`(${leftSelect.getSQL()}) `;\n\t\tconst rightChunk = sql`(${rightSelect.getSQL()})`;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\tconst orderByValues: (SQL<unknown> | Name)[] = [];\n\n\t\t\t// The next bit is necessary because the sql operator replaces ${table.column} with `table`.`column`\n\t\t\t// which is invalid Sql syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const singleOrderBy of orderBy) {\n\t\t\t\tif (is(singleOrderBy, PgColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(singleOrderBy.name));\n\t\t\t\t} else if (is(singleOrderBy, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < singleOrderBy.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = singleOrderBy.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, PgColumn)) {\n\t\t\t\t\t\t\tsingleOrderBy.queryChunks[i] = sql.identifier(chunk.name);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)} `;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery(\n\t\t{ table, values: valuesOrSelect, onConflict, returning, withList, select, overridingSystemValue_ }: PgInsertConfig,\n\t): SQL {\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, PgColumn> = table[Table.Symbol.Columns];\n\n\t\tconst colEntries: [string, PgColumn][] = Object.entries(columns).filter(([_, col]) => !col.shouldDisableInsert());\n\n\t\tconst insertOrder = colEntries.map(\n\t\t\t([, column]) => sql.identifier(this.casing.getColumnCasing(column)),\n\t\t);\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnyPgSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (colValue === undefined || (is(colValue, Param) && colValue.value === undefined)) {\n\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\tif (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tconst defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tconst newValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t\tvalueList.push(newValue);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalueList.push(sql`default`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst onConflictSql = onConflict ? sql` on conflict ${onConflict}` : undefined;\n\n\t\tconst overridingSql = overridingSystemValue_ === true ? sql`overriding system value ` : undefined;\n\n\t\treturn sql`${withSql}insert into ${table} ${insertOrder} ${overridingSql}${valuesSql}${onConflictSql}${returningSql}`;\n\t}\n\n\tbuildRefreshMaterializedViewQuery(\n\t\t{ view, concurrently, withNoData }: { view: PgMaterializedView; concurrently?: boolean; withNoData?: boolean },\n\t): SQL {\n\t\tconst concurrentlySql = concurrently ? sql` concurrently` : undefined;\n\t\tconst withNoDataSql = withNoData ? sql` with no data` : undefined;\n\n\t\treturn sql`refresh materialized view${concurrentlySql} ${view}${withNoDataSql}`;\n\t}\n\n\tprepareTyping(encoder: DriverValueEncoder<unknown, unknown>): QueryTypingsValue {\n\t\tif (is(encoder, PgJsonb) || is(encoder, PgJson)) {\n\t\t\treturn 'json';\n\t\t} else if (is(encoder, PgNumeric)) {\n\t\t\treturn 'decimal';\n\t\t} else if (is(encoder, PgTime)) {\n\t\t\treturn 'time';\n\t\t} else if (is(encoder, PgTimestamp) || is(encoder, PgTimestampString)) {\n\t\t\treturn 'timestamp';\n\t\t} else if (is(encoder, PgDate) || is(encoder, PgDateString)) {\n\t\t\treturn 'date';\n\t\t} else if (is(encoder, PgUUID)) {\n\t\t\treturn 'uuid';\n\t\t} else {\n\t\t\treturn 'none';\n\t\t}\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tprepareTyping: this.prepareTyping,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\t// buildRelationalQueryWithPK({\n\t// \tfullSchema,\n\t// \tschema,\n\t// \ttableNamesMap,\n\t// \ttable,\n\t// \ttableConfig,\n\t// \tqueryConfig: config,\n\t// \ttableAlias,\n\t// \tisRoot = false,\n\t// \tjoinOn,\n\t// }: {\n\t// \tfullSchema: Record<string, unknown>;\n\t// \tschema: TablesRelationalConfig;\n\t// \ttableNamesMap: Record<string, string>;\n\t// \ttable: PgTable;\n\t// \ttableConfig: TableRelationalConfig;\n\t// \tqueryConfig: true | DBQueryConfig<'many', true>;\n\t// \ttableAlias: string;\n\t// \tisRoot?: boolean;\n\t// \tjoinOn?: SQL;\n\t// }): BuildRelationalQueryResult<PgTable, PgColumn> {\n\t// \t// For { \"<relation>\": true }, return a table with selection of all columns\n\t// \tif (config === true) {\n\t// \t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t// \t\tconst selection: BuildRelationalQueryResult<PgTable, PgColumn>['selection'] = selectionEntries.map((\n\t// \t\t\t[key, value],\n\t// \t\t) => ({\n\t// \t\t\tdbKey: value.name,\n\t// \t\t\ttsKey: key,\n\t// \t\t\tfield: value as PgColumn,\n\t// \t\t\trelationTableTsKey: undefined,\n\t// \t\t\tisJson: false,\n\t// \t\t\tselection: [],\n\t// \t\t}));\n\n\t// \t\treturn {\n\t// \t\t\ttableTsKey: tableConfig.tsName,\n\t// \t\t\tsql: table,\n\t// \t\t\tselection,\n\t// \t\t};\n\t// \t}\n\n\t// \t// let selection: BuildRelationalQueryResult<PgTable, PgColumn>['selection'] = [];\n\t// \t// let selectionForBuild = selection;\n\n\t// \tconst aliasedColumns = Object.fromEntries(\n\t// \t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t// \t);\n\n\t// \tconst aliasedRelations = Object.fromEntries(\n\t// \t\tObject.entries(tableConfig.relations).map(([key, value]) => [key, aliasedRelation(value, tableAlias)]),\n\t// \t);\n\n\t// \tconst aliasedFields = Object.assign({}, aliasedColumns, aliasedRelations);\n\n\t// \tlet where, hasUserDefinedWhere;\n\t// \tif (config.where) {\n\t// \t\tconst whereSql = typeof config.where === 'function' ? config.where(aliasedFields, operators) : config.where;\n\t// \t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t// \t\thasUserDefinedWhere = !!where;\n\t// \t}\n\t// \twhere = and(joinOn, where);\n\n\t// \t// const fieldsSelection: { tsKey: string; value: PgColumn | SQL.Aliased; isExtra?: boolean }[] = [];\n\t// \tlet joins: Join[] = [];\n\t// \tlet selectedColumns: string[] = [];\n\n\t// \t// Figure out which columns to select\n\t// \tif (config.columns) {\n\t// \t\tlet isIncludeMode = false;\n\n\t// \t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t// \t\t\tif (value === undefined) {\n\t// \t\t\t\tcontinue;\n\t// \t\t\t}\n\n\t// \t\t\tif (field in tableConfig.columns) {\n\t// \t\t\t\tif (!isIncludeMode && value === true) {\n\t// \t\t\t\t\tisIncludeMode = true;\n\t// \t\t\t\t}\n\t// \t\t\t\tselectedColumns.push(field);\n\t// \t\t\t}\n\t// \t\t}\n\n\t// \t\tif (selectedColumns.length > 0) {\n\t// \t\t\tselectedColumns = isIncludeMode\n\t// \t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t// \t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t// \t\t}\n\t// \t} else {\n\t// \t\t// Select all columns if selection is not specified\n\t// \t\tselectedColumns = Object.keys(tableConfig.columns);\n\t// \t}\n\n\t// \t// for (const field of selectedColumns) {\n\t// \t// \tconst column = tableConfig.columns[field]! as PgColumn;\n\t// \t// \tfieldsSelection.push({ tsKey: field, value: column });\n\t// \t// }\n\n\t// \tlet initiallySelectedRelations: {\n\t// \t\ttsKey: string;\n\t// \t\tqueryConfig: true | DBQueryConfig<'many', false>;\n\t// \t\trelation: Relation;\n\t// \t}[] = [];\n\n\t// \t// let selectedRelations: BuildRelationalQueryResult<PgTable, PgColumn>['selection'] = [];\n\n\t// \t// Figure out which relations to select\n\t// \tif (config.with) {\n\t// \t\tinitiallySelectedRelations = Object.entries(config.with)\n\t// \t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t// \t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t// \t}\n\n\t// \tconst manyRelations = initiallySelectedRelations.filter((r) =>\n\t// \t\tis(r.relation, Many)\n\t// \t\t&& (schema[tableNamesMap[r.relation.referencedTable[Table.Symbol.Name]]!]?.primaryKey.length ?? 0) > 0\n\t// \t);\n\t// \t// If this is the last Many relation (or there are no Many relations), we are on the innermost subquery level\n\t// \tconst isInnermostQuery = manyRelations.length < 2;\n\n\t// \tconst selectedExtras: {\n\t// \t\ttsKey: string;\n\t// \t\tvalue: SQL.Aliased;\n\t// \t}[] = [];\n\n\t// \t// Figure out which extras to select\n\t// \tif (isInnermostQuery && config.extras) {\n\t// \t\tconst extras = typeof config.extras === 'function'\n\t// \t\t\t? config.extras(aliasedFields, { sql })\n\t// \t\t\t: config.extras;\n\t// \t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t// \t\t\tselectedExtras.push({\n\t// \t\t\t\ttsKey,\n\t// \t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t// \t\t\t});\n\t// \t\t}\n\t// \t}\n\n\t// \t// Transform `fieldsSelection` into `selection`\n\t// \t// `fieldsSelection` shouldn't be used after this point\n\t// \t// for (const { tsKey, value, isExtra } of fieldsSelection) {\n\t// \t// \tselection.push({\n\t// \t// \t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t// \t// \t\ttsKey,\n\t// \t// \t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t// \t// \t\trelationTableTsKey: undefined,\n\t// \t// \t\tisJson: false,\n\t// \t// \t\tisExtra,\n\t// \t// \t\tselection: [],\n\t// \t// \t});\n\t// \t// }\n\n\t// \tlet orderByOrig = typeof config.orderBy === 'function'\n\t// \t\t? config.orderBy(aliasedFields, orderByOperators)\n\t// \t\t: config.orderBy ?? [];\n\t// \tif (!Array.isArray(orderByOrig)) {\n\t// \t\torderByOrig = [orderByOrig];\n\t// \t}\n\t// \tconst orderBy = orderByOrig.map((orderByValue) => {\n\t// \t\tif (is(orderByValue, Column)) {\n\t// \t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as PgColumn;\n\t// \t\t}\n\t// \t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t// \t});\n\n\t// \tconst limit = isInnermostQuery ? config.limit : undefined;\n\t// \tconst offset = isInnermostQuery ? config.offset : undefined;\n\n\t// \t// For non-root queries without additional config except columns, return a table with selection\n\t// \tif (\n\t// \t\t!isRoot\n\t// \t\t&& initiallySelectedRelations.length === 0\n\t// \t\t&& selectedExtras.length === 0\n\t// \t\t&& !where\n\t// \t\t&& orderBy.length === 0\n\t// \t\t&& limit === undefined\n\t// \t\t&& offset === undefined\n\t// \t) {\n\t// \t\treturn {\n\t// \t\t\ttableTsKey: tableConfig.tsName,\n\t// \t\t\tsql: table,\n\t// \t\t\tselection: selectedColumns.map((key) => ({\n\t// \t\t\t\tdbKey: tableConfig.columns[key]!.name,\n\t// \t\t\t\ttsKey: key,\n\t// \t\t\t\tfield: tableConfig.columns[key] as PgColumn,\n\t// \t\t\t\trelationTableTsKey: undefined,\n\t// \t\t\t\tisJson: false,\n\t// \t\t\t\tselection: [],\n\t// \t\t\t})),\n\t// \t\t};\n\t// \t}\n\n\t// \tconst selectedRelationsWithoutPK:\n\n\t// \t// Process all relations without primary keys, because they need to be joined differently and will all be on the same query level\n\t// \tfor (\n\t// \t\tconst {\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\trelation,\n\t// \t\t} of initiallySelectedRelations\n\t// \t) {\n\t// \t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t// \t\tconst relationTableName = relation.referencedTable[Table.Symbol.Name];\n\t// \t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t// \t\tconst relationTable = schema[relationTableTsName]!;\n\n\t// \t\tif (relationTable.primaryKey.length > 0) {\n\t// \t\t\tcontinue;\n\t// \t\t}\n\n\t// \t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t// \t\tconst joinOn = and(\n\t// \t\t\t...normalizedRelation.fields.map((field, i) =>\n\t// \t\t\t\teq(\n\t// \t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t// \t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t// \t\t\t\t)\n\t// \t\t\t),\n\t// \t\t);\n\t// \t\tconst builtRelation = this.buildRelationalQueryWithoutPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable: fullSchema[relationTableTsName] as PgTable,\n\t// \t\t\ttableConfig: schema[relationTableTsName]!,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\ttableAlias: relationTableAlias,\n\t// \t\t\tjoinOn,\n\t// \t\t\tnestedQueryRelation: relation,\n\t// \t\t});\n\t// \t\tconst field = sql`${sql.identifier(relationTableAlias)}.${sql.identifier('data')}`.as(selectedRelationTsKey);\n\t// \t\tjoins.push({\n\t// \t\t\ton: sql`true`,\n\t// \t\t\ttable: new Subquery(builtRelation.sql as SQL, {}, relationTableAlias),\n\t// \t\t\talias: relationTableAlias,\n\t// \t\t\tjoinType: 'left',\n\t// \t\t\tlateral: true,\n\t// \t\t});\n\t// \t\tselectedRelations.push({\n\t// \t\t\tdbKey: selectedRelationTsKey,\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tfield,\n\t// \t\t\trelationTableTsKey: relationTableTsName,\n\t// \t\t\tisJson: true,\n\t// \t\t\tselection: builtRelation.selection,\n\t// \t\t});\n\t// \t}\n\n\t// \tconst oneRelations = initiallySelectedRelations.filter((r): r is typeof r & { relation: One } =>\n\t// \t\tis(r.relation, One)\n\t// \t);\n\n\t// \t// Process all One relations with PKs, because they can all be joined on the same level\n\t// \tfor (\n\t// \t\tconst {\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\trelation,\n\t// \t\t} of oneRelations\n\t// \t) {\n\t// \t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t// \t\tconst relationTableName = relation.referencedTable[Table.Symbol.Name];\n\t// \t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t// \t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t// \t\tconst relationTable = schema[relationTableTsName]!;\n\n\t// \t\tif (relationTable.primaryKey.length === 0) {\n\t// \t\t\tcontinue;\n\t// \t\t}\n\n\t// \t\tconst joinOn = and(\n\t// \t\t\t...normalizedRelation.fields.map((field, i) =>\n\t// \t\t\t\teq(\n\t// \t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t// \t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t// \t\t\t\t)\n\t// \t\t\t),\n\t// \t\t);\n\t// \t\tconst builtRelation = this.buildRelationalQueryWithPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable: fullSchema[relationTableTsName] as PgTable,\n\t// \t\t\ttableConfig: schema[relationTableTsName]!,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\ttableAlias: relationTableAlias,\n\t// \t\t\tjoinOn,\n\t// \t\t});\n\t// \t\tconst field = sql`case when ${sql.identifier(relationTableAlias)} is null then null else json_build_array(${\n\t// \t\t\tsql.join(\n\t// \t\t\t\tbuiltRelation.selection.map(({ field }) =>\n\t// \t\t\t\t\tis(field, SQL.Aliased)\n\t// \t\t\t\t\t\t? sql`${sql.identifier(relationTableAlias)}.${sql.identifier(field.fieldAlias)}`\n\t// \t\t\t\t\t\t: is(field, Column)\n\t// \t\t\t\t\t\t? aliasedTableColumn(field, relationTableAlias)\n\t// \t\t\t\t\t\t: field\n\t// \t\t\t\t),\n\t// \t\t\t\tsql`, `,\n\t// \t\t\t)\n\t// \t\t}) end`.as(selectedRelationTsKey);\n\t// \t\tconst isLateralJoin = is(builtRelation.sql, SQL);\n\t// \t\tjoins.push({\n\t// \t\t\ton: isLateralJoin ? sql`true` : joinOn,\n\t// \t\t\ttable: is(builtRelation.sql, SQL)\n\t// \t\t\t\t? new Subquery(builtRelation.sql, {}, relationTableAlias)\n\t// \t\t\t\t: aliasedTable(builtRelation.sql, relationTableAlias),\n\t// \t\t\talias: relationTableAlias,\n\t// \t\t\tjoinType: 'left',\n\t// \t\t\tlateral: is(builtRelation.sql, SQL),\n\t// \t\t});\n\t// \t\tselectedRelations.push({\n\t// \t\t\tdbKey: selectedRelationTsKey,\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tfield,\n\t// \t\t\trelationTableTsKey: relationTableTsName,\n\t// \t\t\tisJson: true,\n\t// \t\t\tselection: builtRelation.selection,\n\t// \t\t});\n\t// \t}\n\n\t// \tlet distinct: PgSelectConfig['distinct'];\n\t// \tlet tableFrom: PgTable | Subquery = table;\n\n\t// \t// Process first Many relation - each one requires a nested subquery\n\t// \tconst manyRelation = manyRelations[0];\n\t// \tif (manyRelation) {\n\t// \t\tconst {\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tqueryConfig: selectedRelationQueryConfig,\n\t// \t\t\trelation,\n\t// \t\t} = manyRelation;\n\n\t// \t\tdistinct = {\n\t// \t\t\ton: tableConfig.primaryKey.map((c) => aliasedTableColumn(c as PgColumn, tableAlias)),\n\t// \t\t};\n\n\t// \t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t// \t\tconst relationTableName = relation.referencedTable[Table.Symbol.Name];\n\t// \t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t// \t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t// \t\tconst joinOn = and(\n\t// \t\t\t...normalizedRelation.fields.map((field, i) =>\n\t// \t\t\t\teq(\n\t// \t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t// \t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t// \t\t\t\t)\n\t// \t\t\t),\n\t// \t\t);\n\n\t// \t\tconst builtRelationJoin = this.buildRelationalQueryWithPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable: fullSchema[relationTableTsName] as PgTable,\n\t// \t\t\ttableConfig: schema[relationTableTsName]!,\n\t// \t\t\tqueryConfig: selectedRelationQueryConfig,\n\t// \t\t\ttableAlias: relationTableAlias,\n\t// \t\t\tjoinOn,\n\t// \t\t});\n\n\t// \t\tconst builtRelationSelectionField = sql`case when ${\n\t// \t\t\tsql.identifier(relationTableAlias)\n\t// \t\t} is null then '[]' else json_agg(json_build_array(${\n\t// \t\t\tsql.join(\n\t// \t\t\t\tbuiltRelationJoin.selection.map(({ field }) =>\n\t// \t\t\t\t\tis(field, SQL.Aliased)\n\t// \t\t\t\t\t\t? sql`${sql.identifier(relationTableAlias)}.${sql.identifier(field.fieldAlias)}`\n\t// \t\t\t\t\t\t: is(field, Column)\n\t// \t\t\t\t\t\t? aliasedTableColumn(field, relationTableAlias)\n\t// \t\t\t\t\t\t: field\n\t// \t\t\t\t),\n\t// \t\t\t\tsql`, `,\n\t// \t\t\t)\n\t// \t\t})) over (partition by ${sql.join(distinct.on, sql`, `)}) end`.as(selectedRelationTsKey);\n\t// \t\tconst isLateralJoin = is(builtRelationJoin.sql, SQL);\n\t// \t\tjoins.push({\n\t// \t\t\ton: isLateralJoin ? sql`true` : joinOn,\n\t// \t\t\ttable: isLateralJoin\n\t// \t\t\t\t? new Subquery(builtRelationJoin.sql as SQL, {}, relationTableAlias)\n\t// \t\t\t\t: aliasedTable(builtRelationJoin.sql as PgTable, relationTableAlias),\n\t// \t\t\talias: relationTableAlias,\n\t// \t\t\tjoinType: 'left',\n\t// \t\t\tlateral: isLateralJoin,\n\t// \t\t});\n\n\t// \t\t// Build the \"from\" subquery with the remaining Many relations\n\t// \t\tconst builtTableFrom = this.buildRelationalQueryWithPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable,\n\t// \t\t\ttableConfig,\n\t// \t\t\tqueryConfig: {\n\t// \t\t\t\t...config,\n\t// \t\t\t\twhere: undefined,\n\t// \t\t\t\torderBy: undefined,\n\t// \t\t\t\tlimit: undefined,\n\t// \t\t\t\toffset: undefined,\n\t// \t\t\t\twith: manyRelations.slice(1).reduce<NonNullable<typeof config['with']>>(\n\t// \t\t\t\t\t(result, { tsKey, queryConfig: configValue }) => {\n\t// \t\t\t\t\t\tresult[tsKey] = configValue;\n\t// \t\t\t\t\t\treturn result;\n\t// \t\t\t\t\t},\n\t// \t\t\t\t\t{},\n\t// \t\t\t\t),\n\t// \t\t\t},\n\t// \t\t\ttableAlias,\n\t// \t\t});\n\n\t// \t\tselectedRelations.push({\n\t// \t\t\tdbKey: selectedRelationTsKey,\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tfield: builtRelationSelectionField,\n\t// \t\t\trelationTableTsKey: relationTableTsName,\n\t// \t\t\tisJson: true,\n\t// \t\t\tselection: builtRelationJoin.selection,\n\t// \t\t});\n\n\t// \t\t// selection = builtTableFrom.selection.map((item) =>\n\t// \t\t// \tis(item.field, SQL.Aliased)\n\t// \t\t// \t\t? { ...item, field: sql`${sql.identifier(tableAlias)}.${sql.identifier(item.field.fieldAlias)}` }\n\t// \t\t// \t\t: item\n\t// \t\t// );\n\t// \t\t// selectionForBuild = [{\n\t// \t\t// \tdbKey: '*',\n\t// \t\t// \ttsKey: '*',\n\t// \t\t// \tfield: sql`${sql.identifier(tableAlias)}.*`,\n\t// \t\t// \tselection: [],\n\t// \t\t// \tisJson: false,\n\t// \t\t// \trelationTableTsKey: undefined,\n\t// \t\t// }];\n\t// \t\t// const newSelectionItem: (typeof selection)[number] = {\n\t// \t\t// \tdbKey: selectedRelationTsKey,\n\t// \t\t// \ttsKey: selectedRelationTsKey,\n\t// \t\t// \tfield,\n\t// \t\t// \trelationTableTsKey: relationTableTsName,\n\t// \t\t// \tisJson: true,\n\t// \t\t// \tselection: builtRelationJoin.selection,\n\t// \t\t// };\n\t// \t\t// selection.push(newSelectionItem);\n\t// \t\t// selectionForBuild.push(newSelectionItem);\n\n\t// \t\ttableFrom = is(builtTableFrom.sql, PgTable)\n\t// \t\t\t? builtTableFrom.sql\n\t// \t\t\t: new Subquery(builtTableFrom.sql, {}, tableAlias);\n\t// \t}\n\n\t// \tif (selectedColumns.length === 0 && selectedRelations.length === 0 && selectedExtras.length === 0) {\n\t// \t\tthrow new DrizzleError(`No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\")`);\n\t// \t}\n\n\t// \tlet selection: BuildRelationalQueryResult<PgTable, PgColumn>['selection'];\n\n\t// \tfunction prepareSelectedColumns() {\n\t// \t\treturn selectedColumns.map((key) => ({\n\t// \t\t\tdbKey: tableConfig.columns[key]!.name,\n\t// \t\t\ttsKey: key,\n\t// \t\t\tfield: tableConfig.columns[key] as PgColumn,\n\t// \t\t\trelationTableTsKey: undefined,\n\t// \t\t\tisJson: false,\n\t// \t\t\tselection: [],\n\t// \t\t}));\n\t// \t}\n\n\t// \tfunction prepareSelectedExtras() {\n\t// \t\treturn selectedExtras.map((item) => ({\n\t// \t\t\tdbKey: item.value.fieldAlias,\n\t// \t\t\ttsKey: item.tsKey,\n\t// \t\t\tfield: item.value,\n\t// \t\t\trelationTableTsKey: undefined,\n\t// \t\t\tisJson: false,\n\t// \t\t\tselection: [],\n\t// \t\t}));\n\t// \t}\n\n\t// \tif (isRoot) {\n\t// \t\tselection = [\n\t// \t\t\t...prepareSelectedColumns(),\n\t// \t\t\t...prepareSelectedExtras(),\n\t// \t\t];\n\t// \t}\n\n\t// \tif (hasUserDefinedWhere || orderBy.length > 0) {\n\t// \t\ttableFrom = new Subquery(\n\t// \t\t\tthis.buildSelectQuery({\n\t// \t\t\t\ttable: is(tableFrom, PgTable) ? aliasedTable(tableFrom, tableAlias) : tableFrom,\n\t// \t\t\t\tfields: {},\n\t// \t\t\t\tfieldsFlat: selectionForBuild.map(({ field }) => ({\n\t// \t\t\t\t\tpath: [],\n\t// \t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t// \t\t\t\t})),\n\t// \t\t\t\tjoins,\n\t// \t\t\t\tdistinct,\n\t// \t\t\t}),\n\t// \t\t\t{},\n\t// \t\t\ttableAlias,\n\t// \t\t);\n\t// \t\tselectionForBuild = selection.map((item) =>\n\t// \t\t\tis(item.field, SQL.Aliased)\n\t// \t\t\t\t? { ...item, field: sql`${sql.identifier(tableAlias)}.${sql.identifier(item.field.fieldAlias)}` }\n\t// \t\t\t\t: item\n\t// \t\t);\n\t// \t\tjoins = [];\n\t// \t\tdistinct = undefined;\n\t// \t}\n\n\t// \tconst result = this.buildSelectQuery({\n\t// \t\ttable: is(tableFrom, PgTable) ? aliasedTable(tableFrom, tableAlias) : tableFrom,\n\t// \t\tfields: {},\n\t// \t\tfieldsFlat: selectionForBuild.map(({ field }) => ({\n\t// \t\t\tpath: [],\n\t// \t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t// \t\t})),\n\t// \t\twhere,\n\t// \t\tlimit,\n\t// \t\toffset,\n\t// \t\tjoins,\n\t// \t\torderBy,\n\t// \t\tdistinct,\n\t// \t});\n\n\t// \treturn {\n\t// \t\ttableTsKey: tableConfig.tsName,\n\t// \t\tsql: result,\n\t// \t\tselection,\n\t// \t};\n\t// }\n\n\tbuildRelationalQueryWithoutPK({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: PgTable;\n\t\ttableConfig: TableRelationalConfig;\n\t\tqueryConfig: true | DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: Relation;\n\t\tjoinOn?: SQL;\n\t}): BuildRelationalQueryResult<PgTable, PgColumn> {\n\t\tlet selection: BuildRelationalQueryResult<PgTable, PgColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: NonNullable<PgSelectConfig['orderBy']> = [], where;\n\t\tconst joins: PgSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as PgColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map((\n\t\t\t\t\t[key, value],\n\t\t\t\t) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: PgColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as PgColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | DBQueryConfig<'many', false>;\n\t\t\t\trelation: Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as PgColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this.buildRelationalQueryWithoutPK({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as PgTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = sql`${sql.identifier(relationTableAlias)}.${sql.identifier('data')}`.as(selectedRelationTsKey);\n\t\t\t\tjoins.push({\n\t\t\t\t\ton: sql`true`,\n\t\t\t\t\ttable: new Subquery(builtRelation.sql as SQL, {}, relationTableAlias),\n\t\t\t\t\talias: relationTableAlias,\n\t\t\t\t\tjoinType: 'left',\n\t\t\t\t\tlateral: true,\n\t\t\t\t});\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({ message: `No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\")` });\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_build_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field, tsKey, isJson }) =>\n\t\t\t\t\t\tisJson\n\t\t\t\t\t\t\t? sql`${sql.identifier(`${tableAlias}_${tsKey}`)}.${sql.identifier('data')}`\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, Many)) {\n\t\t\t\tfield = sql`coalesce(json_agg(${field}${\n\t\t\t\t\torderBy.length > 0 ? sql` order by ${sql.join(orderBy, sql`, `)}` : undefined\n\t\t\t\t}), '[]'::json)`;\n\t\t\t\t// orderBy = [];\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield: field.as('data'),\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [{\n\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t}],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\torderBy,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = [];\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, PgTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/expressions.ts",
    "content": "import type { PgColumn } from '~/pg-core/columns/index.ts';\nimport { bindIfParam } from '~/sql/expressions/index.ts';\nimport type { Placeholder, SQL, SQLChunk, SQLWrapper } from '~/sql/sql.ts';\nimport { sql } from '~/sql/sql.ts';\n\nexport * from '~/sql/expressions/index.ts';\n\nexport function concat(column: PgColumn | SQL.Aliased, value: string | Placeholder | SQLWrapper): SQL {\n\treturn sql`${column} || ${bindIfParam(value, column)}`;\n}\n\nexport function substring(\n\tcolumn: PgColumn | SQL.Aliased,\n\t{ from, for: _for }: { from?: number | Placeholder | SQLWrapper; for?: number | Placeholder | SQLWrapper },\n): SQL {\n\tconst chunks: SQLChunk[] = [sql`substring(`, column];\n\tif (from !== undefined) {\n\t\tchunks.push(sql` from `, bindIfParam(from, column));\n\t}\n\tif (_for !== undefined) {\n\t\tchunks.push(sql` for `, bindIfParam(_for, column));\n\t}\n\tchunks.push(sql`)`);\n\treturn sql.join(chunks);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/foreign-keys.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport type { PgTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: PgColumn[];\n\treadonly foreignTable: PgTable;\n\treadonly foreignColumns: PgColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgForeignKeyBuilder';\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined = 'no action';\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined = 'no action';\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: PgColumn[];\n\t\t\tforeignColumns: PgColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as PgTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport type AnyForeignKeyBuilder = ForeignKeyBuilder;\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'PgForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(readonly table: PgTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[TableName],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[TableName],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends PgColumn[],\n> = { [Key in keyof TColumns]: AnyPgColumn<{ tableName: TTableName }> };\n\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnyPgColumn<{ tableName: TTableName }>, ...AnyPgColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tconst { name, columns, foreignColumns } = config;\n\t\treturn {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tforeignColumns,\n\t\t};\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/index.ts",
    "content": "export * from './alias.ts';\nexport * from './checks.ts';\nexport * from './columns/index.ts';\nexport * from './db.ts';\nexport * from './dialect.ts';\nexport * from './foreign-keys.ts';\nexport * from './indexes.ts';\nexport * from './policies.ts';\nexport * from './primary-keys.ts';\nexport * from './query-builders/index.ts';\nexport * from './roles.ts';\nexport * from './schema.ts';\nexport * from './sequence.ts';\nexport * from './session.ts';\nexport * from './subquery.ts';\nexport * from './table.ts';\nexport * from './unique-constraint.ts';\nexport * from './utils.ts';\nexport * from './utils/index.ts';\nexport * from './view-common.ts';\nexport * from './view.ts';\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/indexes.ts",
    "content": "import { SQL } from '~/sql/sql.ts';\n\nimport { entityKind, is } from '~/entity.ts';\nimport type { ExtraConfigColumn, PgColumn } from './columns/index.ts';\nimport { IndexedColumn } from './columns/index.ts';\nimport type { PgTable } from './table.ts';\n\ninterface IndexConfig {\n\tname?: string;\n\n\tcolumns: Partial<IndexedColumn | SQL>[];\n\n\t/**\n\t * If true, the index will be created as `create unique index` instead of `create index`.\n\t */\n\tunique: boolean;\n\n\t/**\n\t * If true, the index will be created as `create index concurrently` instead of `create index`.\n\t */\n\tconcurrently?: boolean;\n\n\t/**\n\t * If true, the index will be created as `create index ... on only <table>` instead of `create index ... on <table>`.\n\t */\n\tonly: boolean;\n\n\t/**\n\t * Condition for partial index.\n\t */\n\twhere?: SQL;\n\n\t/**\n\t * The optional WITH clause specifies storage parameters for the index\n\t */\n\twith?: Record<string, any>;\n\n\t/**\n\t * The optional WITH clause method for the index\n\t */\n\tmethod?: 'btree' | string;\n}\n\nexport type IndexColumn = PgColumn;\n\nexport type PgIndexMethod = 'btree' | 'hash' | 'gist' | 'spgist' | 'gin' | 'brin' | 'hnsw' | 'ivfflat' | (string & {});\n\nexport type PgIndexOpClass =\n\t| 'abstime_ops'\n\t| 'access_method'\n\t| 'anyarray_eq'\n\t| 'anyarray_ge'\n\t| 'anyarray_gt'\n\t| 'anyarray_le'\n\t| 'anyarray_lt'\n\t| 'anyarray_ne'\n\t| 'bigint_ops'\n\t| 'bit_ops'\n\t| 'bool_ops'\n\t| 'box_ops'\n\t| 'bpchar_ops'\n\t| 'char_ops'\n\t| 'cidr_ops'\n\t| 'cstring_ops'\n\t| 'date_ops'\n\t| 'float_ops'\n\t| 'int2_ops'\n\t| 'int4_ops'\n\t| 'int8_ops'\n\t| 'interval_ops'\n\t| 'jsonb_ops'\n\t| 'macaddr_ops'\n\t| 'name_ops'\n\t| 'numeric_ops'\n\t| 'oid_ops'\n\t| 'oidint4_ops'\n\t| 'oidint8_ops'\n\t| 'oidname_ops'\n\t| 'oidvector_ops'\n\t| 'point_ops'\n\t| 'polygon_ops'\n\t| 'range_ops'\n\t| 'record_eq'\n\t| 'record_ge'\n\t| 'record_gt'\n\t| 'record_le'\n\t| 'record_lt'\n\t| 'record_ne'\n\t| 'text_ops'\n\t| 'time_ops'\n\t| 'timestamp_ops'\n\t| 'timestamptz_ops'\n\t| 'timetz_ops'\n\t| 'uuid_ops'\n\t| 'varbit_ops'\n\t| 'varchar_ops'\n\t// pg_vector types\n\t| 'xml_ops'\n\t| 'vector_l2_ops'\n\t| 'vector_ip_ops'\n\t| 'vector_cosine_ops'\n\t| 'vector_l1_ops'\n\t| 'bit_hamming_ops'\n\t| 'bit_jaccard_ops'\n\t| 'halfvec_l2_ops'\n\t| 'sparsevec_l2_op'\n\t| (string & {});\n\nexport class IndexBuilderOn {\n\tstatic readonly [entityKind]: string = 'PgIndexBuilderOn';\n\n\tconstructor(private unique: boolean, private name?: string) {}\n\n\ton(...columns: [Partial<ExtraConfigColumn> | SQL, ...Partial<ExtraConfigColumn | SQL>[]]): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\t\t\t\tit = it as ExtraConfigColumn;\n\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(it.name, !!it.keyAsName, it.columnType!, it.indexConfig!);\n\t\t\t\tit.indexConfig = JSON.parse(JSON.stringify(it.defaultConfig));\n\t\t\t\treturn clonedIndexedColumn;\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\tfalse,\n\t\t\tthis.name,\n\t\t);\n\t}\n\n\tonOnly(...columns: [Partial<ExtraConfigColumn | SQL>, ...Partial<ExtraConfigColumn | SQL>[]]): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\t\t\t\tit = it as ExtraConfigColumn;\n\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(it.name, !!it.keyAsName, it.columnType!, it.indexConfig!);\n\t\t\t\tit.indexConfig = it.defaultConfig;\n\t\t\t\treturn clonedIndexedColumn;\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\ttrue,\n\t\t\tthis.name,\n\t\t);\n\t}\n\n\t/**\n\t * Specify what index method to use. Choices are `btree`, `hash`, `gist`, `spgist`, `gin`, `brin`, or user-installed access methods like `bloom`. The default method is `btree.\n\t *\n\t * If you have the `pg_vector` extension installed in your database, you can use the `hnsw` and `ivfflat` options, which are predefined types.\n\t *\n\t * **You can always specify any string you want in the method, in case Drizzle doesn't have it natively in its types**\n\t *\n\t * @param method The name of the index method to be used\n\t * @param columns\n\t * @returns\n\t */\n\tusing(\n\t\tmethod: PgIndexMethod,\n\t\t...columns: [Partial<ExtraConfigColumn | SQL>, ...Partial<ExtraConfigColumn | SQL>[]]\n\t): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\t\t\t\tit = it as ExtraConfigColumn;\n\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(it.name, !!it.keyAsName, it.columnType!, it.indexConfig!);\n\t\t\t\tit.indexConfig = JSON.parse(JSON.stringify(it.defaultConfig));\n\t\t\t\treturn clonedIndexedColumn;\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\ttrue,\n\t\t\tthis.name,\n\t\t\tmethod,\n\t\t);\n\t}\n}\n\nexport interface AnyIndexBuilder {\n\tbuild(table: PgTable): Index;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface IndexBuilder extends AnyIndexBuilder {}\n\nexport class IndexBuilder implements AnyIndexBuilder {\n\tstatic readonly [entityKind]: string = 'PgIndexBuilder';\n\n\t/** @internal */\n\tconfig: IndexConfig;\n\n\tconstructor(\n\t\tcolumns: Partial<IndexedColumn | SQL>[],\n\t\tunique: boolean,\n\t\tonly: boolean,\n\t\tname?: string,\n\t\tmethod: string = 'btree',\n\t) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tunique,\n\t\t\tonly,\n\t\t\tmethod,\n\t\t};\n\t}\n\n\tconcurrently(): this {\n\t\tthis.config.concurrently = true;\n\t\treturn this;\n\t}\n\n\twith(obj: Record<string, any>): this {\n\t\tthis.config.with = obj;\n\t\treturn this;\n\t}\n\n\twhere(condition: SQL): this {\n\t\tthis.config.where = condition;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): Index {\n\t\treturn new Index(this.config, table);\n\t}\n}\n\nexport class Index {\n\tstatic readonly [entityKind]: string = 'PgIndex';\n\n\treadonly config: IndexConfig & { table: PgTable };\n\n\tconstructor(config: IndexConfig, table: PgTable) {\n\t\tthis.config = { ...config, table };\n\t}\n}\n\nexport type GetColumnsTableName<TColumns> = TColumns extends PgColumn ? TColumns['_']['name']\n\t: TColumns extends PgColumn[] ? TColumns[number]['_']['name']\n\t: never;\n\nexport function index(name?: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(false, name);\n}\n\nexport function uniqueIndex(name?: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(true, name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/policies.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { PgRole } from './roles.ts';\nimport type { PgTable } from './table.ts';\n\nexport type PgPolicyToOption =\n\t| 'public'\n\t| 'current_role'\n\t| 'current_user'\n\t| 'session_user'\n\t| (string & {})\n\t| PgPolicyToOption[]\n\t| PgRole;\n\nexport interface PgPolicyConfig {\n\tas?: 'permissive' | 'restrictive';\n\tfor?: 'all' | 'select' | 'insert' | 'update' | 'delete';\n\tto?: PgPolicyToOption;\n\tusing?: SQL;\n\twithCheck?: SQL;\n}\n\nexport class PgPolicy implements PgPolicyConfig {\n\tstatic readonly [entityKind]: string = 'PgPolicy';\n\n\treadonly as: PgPolicyConfig['as'];\n\treadonly for: PgPolicyConfig['for'];\n\treadonly to: PgPolicyConfig['to'];\n\treadonly using: PgPolicyConfig['using'];\n\treadonly withCheck: PgPolicyConfig['withCheck'];\n\n\t/** @internal */\n\t_linkedTable?: PgTable;\n\n\tconstructor(\n\t\treadonly name: string,\n\t\tconfig?: PgPolicyConfig,\n\t) {\n\t\tif (config) {\n\t\t\tthis.as = config.as;\n\t\t\tthis.for = config.for;\n\t\t\tthis.to = config.to;\n\t\t\tthis.using = config.using;\n\t\t\tthis.withCheck = config.withCheck;\n\t\t}\n\t}\n\n\tlink(table: PgTable): this {\n\t\tthis._linkedTable = table;\n\t\treturn this;\n\t}\n}\n\nexport function pgPolicy(name: string, config?: PgPolicyConfig) {\n\treturn new PgPolicy(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/primary-keys.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport { PgTable } from './table.ts';\n\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumn extends AnyPgColumn<{ tableName: TTableName }>,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n>(config: { name?: string; columns: [TColumn, ...TColumns] }): PrimaryKeyBuilder;\n/**\n * @deprecated: Please use primaryKey({ columns: [] }) instead of this function\n * @param columns\n */\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n>(...columns: TColumns): PrimaryKeyBuilder;\nexport function primaryKey(...config: any) {\n\tif (config[0].columns) {\n\t\treturn new PrimaryKeyBuilder(config[0].columns, config[0].name);\n\t}\n\treturn new PrimaryKeyBuilder(config);\n}\n\nexport class PrimaryKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgPrimaryKeyBuilder';\n\n\t/** @internal */\n\tcolumns: PgColumn[];\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tcolumns: PgColumn[],\n\t\tname?: string,\n\t) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): PrimaryKey {\n\t\treturn new PrimaryKey(table, this.columns, this.name);\n\t}\n}\n\nexport class PrimaryKey {\n\tstatic readonly [entityKind]: string = 'PgPrimaryKey';\n\n\treadonly columns: AnyPgColumn<{}>[];\n\treadonly name?: string;\n\n\tconstructor(readonly table: PgTable, columns: AnyPgColumn<{}>[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\tgetName(): string {\n\t\treturn this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join('_')}_pk`;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/query-builders/count.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { NeonAuthToken } from '~/utils.ts';\nimport type { PgSession } from '../session.ts';\nimport type { PgTable } from '../table.ts';\n\nexport class PgCountBuilder<\n\tTSession extends PgSession<any, any, any>,\n> extends SQL<number> implements Promise<number>, SQLWrapper {\n\tprivate sql: SQL<number>;\n\tprivate token?: NeonAuthToken;\n\n\tstatic override readonly [entityKind] = 'PgCountBuilder';\n\t[Symbol.toStringTag] = 'PgCountBuilder';\n\n\tprivate session: TSession;\n\n\tprivate static buildEmbeddedCount(\n\t\tsource: PgTable | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`(select count(*) from ${source}${sql.raw(' where ').if(filters)}${filters})`;\n\t}\n\n\tprivate static buildCount(\n\t\tsource: PgTable | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`select count(*) as count from ${source}${sql.raw(' where ').if(filters)}${filters};`;\n\t}\n\n\tconstructor(\n\t\treadonly params: {\n\t\t\tsource: PgTable | SQL | SQLWrapper;\n\t\t\tfilters?: SQL<unknown>;\n\t\t\tsession: TSession;\n\t\t},\n\t) {\n\t\tsuper(PgCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);\n\n\t\tthis.mapWith(Number);\n\n\t\tthis.session = params.session;\n\n\t\tthis.sql = PgCountBuilder.buildCount(\n\t\t\tparams.source,\n\t\t\tparams.filters,\n\t\t);\n\t}\n\n\t/** @intrnal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.token = token;\n\t\treturn this;\n\t}\n\n\tthen<TResult1 = number, TResult2 = never>(\n\t\tonfulfilled?: ((value: number) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n\t\tonrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn Promise.resolve(this.session.count(this.sql, this.token))\n\t\t\t.then(\n\t\t\t\tonfulfilled,\n\t\t\t\tonrejected,\n\t\t\t);\n\t}\n\n\tcatch(\n\t\tonRejected?: ((reason: any) => any) | null | undefined,\n\t): Promise<number> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<number> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/query-builders/delete.ts",
    "content": "import type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport type {\n\tPgPreparedQuery,\n\tPgQueryResultHKT,\n\tPgQueryResultKind,\n\tPgSession,\n\tPreparedQueryConfig,\n} from '~/pg-core/session.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { getTableName, Table } from '~/table.ts';\nimport { tracer } from '~/tracing.ts';\nimport { type NeonAuthToken, orderSelectedFields } from '~/utils.ts';\nimport type { PgColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\n\nexport type PgDeleteWithout<\n\tT extends AnyPgDeleteBase,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T\n\t: Omit<\n\t\tPgDeleteBase<\n\t\t\tT['_']['table'],\n\t\t\tT['_']['queryResult'],\n\t\t\tT['_']['selectedFields'],\n\t\t\tT['_']['returning'],\n\t\t\tTDynamic,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>,\n\t\tT['_']['excludedMethods'] | K\n\t>;\n\nexport type PgDelete<\n\tTTable extends PgTable = PgTable,\n\tTQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = PgDeleteBase<TTable, TQueryResult, TSelectedFields, TReturning, true, never>;\n\nexport interface PgDeleteConfig {\n\twhere?: SQL | undefined;\n\ttable: PgTable;\n\treturningFields?: SelectedFieldsFlat;\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type PgDeleteReturningAll<\n\tT extends AnyPgDeleteBase,\n\tTDynamic extends boolean,\n> = PgDeleteWithout<\n\tPgDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['table']['_']['columns'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type PgDeleteReturning<\n\tT extends AnyPgDeleteBase,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = PgDeleteWithout<\n\tPgDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tTSelectedFields,\n\t\tSelectResultFields<TSelectedFields>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type PgDeletePrepare<T extends AnyPgDeleteBase> = PgPreparedQuery<\n\tPreparedQueryConfig & {\n\t\texecute: T['_']['returning'] extends undefined ? PgQueryResultKind<T['_']['queryResult'], never>\n\t\t\t: T['_']['returning'][];\n\t}\n>;\n\nexport type PgDeleteDynamic<T extends AnyPgDeleteBase> = PgDelete<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['selectedFields'],\n\tT['_']['returning']\n>;\n\nexport type AnyPgDeleteBase = PgDeleteBase<any, any, any, any, any, any>;\n\nexport interface PgDeleteBase<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tTypedQueryBuilder<\n\t\tTSelectedFields,\n\t\tTReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]\n\t>,\n\tQueryPromise<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[], 'pg'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[];\n\t};\n}\n\nexport class PgDeleteBase<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]>\n\timplements\n\t\tTypedQueryBuilder<\n\t\t\tTSelectedFields,\n\t\t\tTReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]\n\t\t>,\n\t\tRunnableQuery<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[], 'pg'>,\n\t\tSQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'PgDelete';\n\n\tprivate config: PgDeleteConfig;\n\tprotected cacheConfig?: WithCacheConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tprivate session: PgSession,\n\t\tprivate dialect: PgDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, withList };\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will delete only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be deleted.\n\t *\n\t * ```ts\n\t * // Delete all cars with green color\n\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.delete(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Delete all BMW cars with a green color\n\t * await db.delete(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Delete all cars with the green or blue color\n\t * await db.delete(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): PgDeleteWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the deleted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete#delete-with-return}\n\t *\n\t * @example\n\t * ```ts\n\t * // Delete all cars with the green color and return all fields\n\t * const deletedCars: Car[] = await db.delete(cars)\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning();\n\t *\n\t * // Delete all cars with the green color and return only their id and brand fields\n\t * const deletedCarsIdsAndBrands: { id: number, brand: string }[] = await db.delete(cars)\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): PgDeleteReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): PgDeleteReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.config.table[Table.Symbol.Columns],\n\t): PgDeleteReturning<this, TDynamic, any> {\n\t\tthis.config.returningFields = fields;\n\t\tthis.config.returning = orderSelectedFields<PgColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildDeleteQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): PgDeletePrepare<this> {\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\treturn this.session.prepareQuery<\n\t\t\t\tPreparedQueryConfig & {\n\t\t\t\t\texecute: TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[];\n\t\t\t\t}\n\t\t\t>(this.dialect.sqlToQuery(this.getSQL()), this.config.returning, name, true, undefined, {\n\t\t\t\ttype: 'delete',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t}, this.cacheConfig);\n\t\t});\n\t}\n\n\tprepare(name: string): PgDeletePrepare<this> {\n\t\treturn this._prepare(name);\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(placeholderValues, this.authToken);\n\t\t});\n\t};\n\n\t/** @internal */\n\tgetSelectedFields(): this['_']['selectedFields'] {\n\t\treturn (\n\t\t\tthis.config.returningFields\n\t\t\t\t? new Proxy(\n\t\t\t\t\tthis.config.returningFields,\n\t\t\t\t\tnew SelectionProxyHandler({\n\t\t\t\t\t\talias: getTableName(this.config.table),\n\t\t\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\t\t\tsqlBehavior: 'error',\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t: undefined\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): PgDeleteDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/query-builders/index.ts",
    "content": "export * from './delete.ts';\nexport * from './insert.ts';\nexport * from './query-builder.ts';\nexport * from './refresh-materialized-view.ts';\nexport * from './select.ts';\nexport * from './select.types.ts';\nexport * from './update.ts';\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/query-builders/insert.ts",
    "content": "import type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport type { IndexColumn } from '~/pg-core/indexes.ts';\nimport type {\n\tPgPreparedQuery,\n\tPgQueryResultHKT,\n\tPgQueryResultKind,\n\tPgSession,\n\tPreparedQueryConfig,\n} from '~/pg-core/session.ts';\nimport type { PgTable, TableConfig } from '~/pg-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { Param, SQL, sql } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport type { InferInsertModel } from '~/table.ts';\nimport { Columns, getTableName, Table } from '~/table.ts';\nimport { tracer } from '~/tracing.ts';\nimport { haveSameKeys, mapUpdateSet, type NeonAuthToken, orderSelectedFields } from '~/utils.ts';\nimport type { AnyPgColumn, PgColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport { QueryBuilder } from './query-builder.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\nimport type { PgUpdateSetSource } from './update.ts';\n\nexport interface PgInsertConfig<TTable extends PgTable = PgTable> {\n\ttable: TTable;\n\tvalues: Record<string, Param | SQL>[] | PgInsertSelectQueryBuilder<TTable> | SQL;\n\twithList?: Subquery[];\n\tonConflict?: SQL;\n\treturningFields?: SelectedFieldsFlat;\n\treturning?: SelectedFieldsOrdered;\n\tselect?: boolean;\n\toverridingSystemValue_?: boolean;\n}\n\nexport type PgInsertValue<TTable extends PgTable<TableConfig>, OverrideT extends boolean = false> =\n\t& {\n\t\t[Key in keyof InferInsertModel<TTable, { dbColumnNames: false; override: OverrideT }>]:\n\t\t\t| InferInsertModel<TTable, { dbColumnNames: false; override: OverrideT }>[Key]\n\t\t\t| SQL\n\t\t\t| Placeholder;\n\t}\n\t& {};\n\nexport type PgInsertSelectQueryBuilder<TTable extends PgTable> = TypedQueryBuilder<\n\t{ [K in keyof TTable['$inferInsert']]: AnyPgColumn | SQL | SQL.Aliased | TTable['$inferInsert'][K] }\n>;\n\nexport class PgInsertBuilder<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tOverrideT extends boolean = false,\n> {\n\tstatic readonly [entityKind]: string = 'PgInsertBuilder';\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: PgSession,\n\t\tprivate dialect: PgDialect,\n\t\tprivate withList?: Subquery[],\n\t\tprivate overridingSystemValue_?: boolean,\n\t) {}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\toverridingSystemValue(): Omit<PgInsertBuilder<TTable, TQueryResult, true>, 'overridingSystemValue'> {\n\t\tthis.overridingSystemValue_ = true;\n\t\treturn this as any;\n\t}\n\n\tvalues(value: PgInsertValue<TTable, OverrideT>): PgInsertBase<TTable, TQueryResult>;\n\tvalues(values: PgInsertValue<TTable, OverrideT>[]): PgInsertBase<TTable, TQueryResult>;\n\tvalues(\n\t\tvalues: PgInsertValue<TTable, OverrideT> | PgInsertValue<TTable, OverrideT>[],\n\t): PgInsertBase<TTable, TQueryResult> {\n\t\tvalues = Array.isArray(values) ? values : [values];\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('values() must be called with at least one value');\n\t\t}\n\t\tconst mappedValues = values.map((entry) => {\n\t\t\tconst result: Record<string, Param | SQL> = {};\n\t\t\tconst cols = this.table[Table.Symbol.Columns];\n\t\t\tfor (const colKey of Object.keys(entry)) {\n\t\t\t\tconst colValue = entry[colKey as keyof typeof entry];\n\t\t\t\tresult[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);\n\t\t\t}\n\t\t\treturn result;\n\t\t});\n\n\t\treturn new PgInsertBase(\n\t\t\tthis.table,\n\t\t\tmappedValues,\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t\tfalse,\n\t\t\tthis.overridingSystemValue_,\n\t\t).setToken(this.authToken) as any;\n\t}\n\n\tselect(selectQuery: (qb: QueryBuilder) => PgInsertSelectQueryBuilder<TTable>): PgInsertBase<TTable, TQueryResult>;\n\tselect(selectQuery: (qb: QueryBuilder) => SQL): PgInsertBase<TTable, TQueryResult>;\n\tselect(selectQuery: SQL): PgInsertBase<TTable, TQueryResult>;\n\tselect(selectQuery: PgInsertSelectQueryBuilder<TTable>): PgInsertBase<TTable, TQueryResult>;\n\tselect(\n\t\tselectQuery:\n\t\t\t| SQL\n\t\t\t| PgInsertSelectQueryBuilder<TTable>\n\t\t\t| ((qb: QueryBuilder) => PgInsertSelectQueryBuilder<TTable> | SQL),\n\t): PgInsertBase<TTable, TQueryResult> {\n\t\tconst select = typeof selectQuery === 'function' ? selectQuery(new QueryBuilder()) : selectQuery;\n\n\t\tif (\n\t\t\t!is(select, SQL)\n\t\t\t&& !haveSameKeys(this.table[Columns], select._.selectedFields)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t'Insert select error: selected fields are not the same or are in a different order compared to the table definition',\n\t\t\t);\n\t\t}\n\n\t\treturn new PgInsertBase(this.table, select, this.session, this.dialect, this.withList, true);\n\t}\n}\n\nexport type PgInsertWithout<T extends AnyPgInsert, TDynamic extends boolean, K extends keyof T & string> =\n\tTDynamic extends true ? T\n\t\t: Omit<\n\t\t\tPgInsertBase<\n\t\t\t\tT['_']['table'],\n\t\t\t\tT['_']['queryResult'],\n\t\t\t\tT['_']['selectedFields'],\n\t\t\t\tT['_']['returning'],\n\t\t\t\tTDynamic,\n\t\t\t\tT['_']['excludedMethods'] | K\n\t\t\t>,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>;\n\nexport type PgInsertReturning<\n\tT extends AnyPgInsert,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = PgInsertBase<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tTSelectedFields,\n\tSelectResultFields<TSelectedFields>,\n\tTDynamic,\n\tT['_']['excludedMethods']\n>;\n\nexport type PgInsertReturningAll<T extends AnyPgInsert, TDynamic extends boolean> = PgInsertBase<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['table']['_']['columns'],\n\tT['_']['table']['$inferSelect'],\n\tTDynamic,\n\tT['_']['excludedMethods']\n>;\n\nexport interface PgInsertOnConflictDoUpdateConfig<T extends AnyPgInsert> {\n\ttarget: IndexColumn | IndexColumn[];\n\t/** @deprecated use either `targetWhere` or `setWhere` */\n\twhere?: SQL;\n\t// TODO: add tests for targetWhere and setWhere\n\ttargetWhere?: SQL;\n\tsetWhere?: SQL;\n\tset: PgUpdateSetSource<T['_']['table']>;\n}\n\nexport type PgInsertPrepare<T extends AnyPgInsert> = PgPreparedQuery<\n\tPreparedQueryConfig & {\n\t\texecute: T['_']['returning'] extends undefined ? PgQueryResultKind<T['_']['queryResult'], never>\n\t\t\t: T['_']['returning'][];\n\t}\n>;\n\nexport type PgInsertDynamic<T extends AnyPgInsert> = PgInsert<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['returning']\n>;\n\nexport type AnyPgInsert = PgInsertBase<any, any, any, any, any, any>;\n\nexport type PgInsert<\n\tTTable extends PgTable = PgTable,\n\tTQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n\tTSelectedFields extends ColumnsSelection | undefined = ColumnsSelection | undefined,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = PgInsertBase<TTable, TQueryResult, TSelectedFields, TReturning, true, never>;\n\nexport interface PgInsertBase<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tTypedQueryBuilder<\n\t\tTSelectedFields,\n\t\tTReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]\n\t>,\n\tQueryPromise<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[], 'pg'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[];\n\t};\n}\n\nexport class PgInsertBase<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]>\n\timplements\n\t\tTypedQueryBuilder<\n\t\t\tTSelectedFields,\n\t\t\tTReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]\n\t\t>,\n\t\tRunnableQuery<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[], 'pg'>,\n\t\tSQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'PgInsert';\n\n\tprivate config: PgInsertConfig<TTable>;\n\tprotected cacheConfig?: WithCacheConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tvalues: PgInsertConfig['values'],\n\t\tprivate session: PgSession,\n\t\tprivate dialect: PgDialect,\n\t\twithList?: Subquery[],\n\t\tselect?: boolean,\n\t\toverridingSystemValue_?: boolean,\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, values: values as any, withList, select, overridingSystemValue_ };\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the inserted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#insert-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and return all fields\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t *   .values({ brand: 'BMW' })\n\t *   .returning();\n\t *\n\t * // Insert one row and return only the id\n\t * const insertedCarId: { id: number }[] = await db.insert(cars)\n\t *   .values({ brand: 'BMW' })\n\t *   .returning({ id: cars.id });\n\t * ```\n\t */\n\treturning(): PgInsertWithout<PgInsertReturningAll<this, TDynamic>, TDynamic, 'returning'>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): PgInsertWithout<PgInsertReturning<this, TDynamic, TSelectedFields>, TDynamic, 'returning'>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.config.table[Table.Symbol.Columns],\n\t): PgInsertWithout<AnyPgInsert, TDynamic, 'returning'> {\n\t\tthis.config.returningFields = fields;\n\t\tthis.config.returning = orderSelectedFields<PgColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `on conflict do nothing` clause to the query.\n\t *\n\t * Calling this method simply avoids inserting a row as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#on-conflict-do-nothing}\n\t *\n\t * @param config The `target` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and cancel the insert if there's a conflict\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onConflictDoNothing();\n\t *\n\t * // Explicitly specify conflict target\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onConflictDoNothing({ target: cars.id });\n\t * ```\n\t */\n\tonConflictDoNothing(\n\t\tconfig: { target?: IndexColumn | IndexColumn[]; where?: SQL } = {},\n\t): PgInsertWithout<this, TDynamic, 'onConflictDoNothing' | 'onConflictDoUpdate'> {\n\t\tif (config.target === undefined) {\n\t\t\tthis.config.onConflict = sql`do nothing`;\n\t\t} else {\n\t\t\tlet targetColumn = '';\n\t\t\ttargetColumn = Array.isArray(config.target)\n\t\t\t\t? config.target.map((it) => this.dialect.escapeName(this.dialect.casing.getColumnCasing(it))).join(',')\n\t\t\t\t: this.dialect.escapeName(this.dialect.casing.getColumnCasing(config.target));\n\n\t\t\tconst whereSql = config.where ? sql` where ${config.where}` : undefined;\n\t\t\tthis.config.onConflict = sql`(${sql.raw(targetColumn)})${whereSql} do nothing`;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `on conflict do update` clause to the query.\n\t *\n\t * Calling this method will update the existing row that conflicts with the row proposed for insertion as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#upserts-and-conflicts}\n\t *\n\t * @param config The `target`, `set` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Update the row if there's a conflict\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onConflictDoUpdate({\n\t *     target: cars.id,\n\t *     set: { brand: 'Porsche' }\n\t *   });\n\t *\n\t * // Upsert with 'where' clause\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onConflictDoUpdate({\n\t *     target: cars.id,\n\t *     set: { brand: 'newBMW' },\n\t *     targetWhere: sql`${cars.createdAt} > '2023-01-01'::date`,\n\t *   });\n\t * ```\n\t */\n\tonConflictDoUpdate(\n\t\tconfig: PgInsertOnConflictDoUpdateConfig<this>,\n\t): PgInsertWithout<this, TDynamic, 'onConflictDoNothing' | 'onConflictDoUpdate'> {\n\t\tif (config.where && (config.targetWhere || config.setWhere)) {\n\t\t\tthrow new Error(\n\t\t\t\t'You cannot use both \"where\" and \"targetWhere\"/\"setWhere\" at the same time - \"where\" is deprecated, use \"targetWhere\" or \"setWhere\" instead.',\n\t\t\t);\n\t\t}\n\t\tconst whereSql = config.where ? sql` where ${config.where}` : undefined;\n\t\tconst targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;\n\t\tconst setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;\n\t\tconst setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));\n\t\tlet targetColumn = '';\n\t\ttargetColumn = Array.isArray(config.target)\n\t\t\t? config.target.map((it) => this.dialect.escapeName(this.dialect.casing.getColumnCasing(it))).join(',')\n\t\t\t: this.dialect.escapeName(this.dialect.casing.getColumnCasing(config.target));\n\t\tthis.config.onConflict = sql`(${\n\t\t\tsql.raw(targetColumn)\n\t\t})${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`;\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildInsertQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): PgInsertPrepare<this> {\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\treturn this.session.prepareQuery<\n\t\t\t\tPreparedQueryConfig & {\n\t\t\t\t\texecute: TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[];\n\t\t\t\t}\n\t\t\t>(this.dialect.sqlToQuery(this.getSQL()), this.config.returning, name, true, undefined, {\n\t\t\t\ttype: 'insert',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t}, this.cacheConfig);\n\t\t});\n\t}\n\n\tprepare(name: string): PgInsertPrepare<this> {\n\t\treturn this._prepare(name);\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(placeholderValues, this.authToken);\n\t\t});\n\t};\n\n\t/** @internal */\n\tgetSelectedFields(): this['_']['selectedFields'] {\n\t\treturn (\n\t\t\tthis.config.returningFields\n\t\t\t\t? new Proxy(\n\t\t\t\t\tthis.config.returningFields,\n\t\t\t\t\tnew SelectionProxyHandler({\n\t\t\t\t\t\talias: getTableName(this.config.table),\n\t\t\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\t\t\tsqlBehavior: 'error',\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t: undefined\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): PgInsertDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/query-builders/query-builder.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\nimport type { PgDialectConfig } from '~/pg-core/dialect.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { PgColumn } from '../columns/index.ts';\nimport type { WithBuilder } from '../subquery.ts';\nimport { PgSelectBuilder } from './select.ts';\nimport type { SelectedFields } from './select.types.ts';\n\nexport class QueryBuilder {\n\tstatic readonly [entityKind]: string = 'PgQueryBuilder';\n\n\tprivate dialect: PgDialect | undefined;\n\tprivate dialectConfig: PgDialectConfig | undefined;\n\n\tconstructor(dialect?: PgDialect | PgDialectConfig) {\n\t\tthis.dialect = is(dialect, PgDialect) ? dialect : undefined;\n\t\tthis.dialectConfig = is(dialect, PgDialect) ? undefined : dialect;\n\t}\n\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst queryBuilder = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(queryBuilder);\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t) as any;\n\t\t};\n\t\treturn { as };\n\t};\n\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\tfunction select(): PgSelectBuilder<undefined, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): PgSelectBuilder<TSelection | undefined, 'qb'> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\tfunction selectDistinct(): PgSelectBuilder<undefined, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): PgSelectBuilder<TSelection | undefined, 'qb'> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\tfunction selectDistinctOn(on: (PgColumn | SQLWrapper)[]): PgSelectBuilder<undefined, 'qb'>;\n\t\tfunction selectDistinctOn<TSelection extends SelectedFields>(\n\t\t\ton: (PgColumn | SQLWrapper)[],\n\t\t\tfields: TSelection,\n\t\t): PgSelectBuilder<TSelection, 'qb'>;\n\t\tfunction selectDistinctOn<TSelection extends SelectedFields>(\n\t\t\ton: (PgColumn | SQLWrapper)[],\n\t\t\tfields?: TSelection,\n\t\t): PgSelectBuilder<TSelection | undefined, 'qb'> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\tdistinct: { on },\n\t\t\t});\n\t\t}\n\n\t\treturn { select, selectDistinct, selectDistinctOn };\n\t}\n\n\tselect(): PgSelectBuilder<undefined, 'qb'>;\n\tselect<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection, 'qb'>;\n\tselect<TSelection extends SelectedFields>(fields?: TSelection): PgSelectBuilder<TSelection | undefined, 'qb'> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t});\n\t}\n\n\tselectDistinct(): PgSelectBuilder<undefined>;\n\tselectDistinct<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection>;\n\tselectDistinct<TSelection extends SelectedFields>(fields?: TSelection): PgSelectBuilder<TSelection | undefined> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\tselectDistinctOn(on: (PgColumn | SQLWrapper)[]): PgSelectBuilder<undefined>;\n\tselectDistinctOn<TSelection extends SelectedFields>(\n\t\ton: (PgColumn | SQLWrapper)[],\n\t\tfields: TSelection,\n\t): PgSelectBuilder<TSelection>;\n\tselectDistinctOn<TSelection extends SelectedFields>(\n\t\ton: (PgColumn | SQLWrapper)[],\n\t\tfields?: TSelection,\n\t): PgSelectBuilder<TSelection | undefined> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t\tdistinct: { on },\n\t\t});\n\t}\n\n\t// Lazy load dialect to avoid circular dependency\n\tprivate getDialect() {\n\t\tif (!this.dialect) {\n\t\t\tthis.dialect = new PgDialect(this.dialectConfig);\n\t\t}\n\n\t\treturn this.dialect;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/query-builders/query.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport {\n\ttype BuildQueryResult,\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tmapRelationalRow,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Query, QueryWithTypings, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { KnownKeysOnly, NeonAuthToken } from '~/utils.ts';\nimport type { PgDialect } from '../dialect.ts';\nimport type { PgPreparedQuery, PgSession, PreparedQueryConfig } from '../session.ts';\nimport type { PgTable } from '../table.ts';\n\nexport class RelationalQueryBuilder<TSchema extends TablesRelationalConfig, TFields extends TableRelationalConfig> {\n\tstatic readonly [entityKind]: string = 'PgRelationalQueryBuilder';\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: TSchema,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\tprivate table: PgTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: PgDialect,\n\t\tprivate session: PgSession,\n\t) {}\n\n\tfindMany<TConfig extends DBQueryConfig<'many', true, TSchema, TFields>>(\n\t\tconfig?: KnownKeysOnly<TConfig, DBQueryConfig<'many', true, TSchema, TFields>>,\n\t): PgRelationalQuery<BuildQueryResult<TSchema, TFields, TConfig>[]> {\n\t\treturn new PgRelationalQuery(\n\t\t\tthis.fullSchema,\n\t\t\tthis.schema,\n\t\t\tthis.tableNamesMap,\n\t\t\tthis.table,\n\t\t\tthis.tableConfig,\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tconfig ? (config as DBQueryConfig<'many', true>) : {},\n\t\t\t'many',\n\t\t);\n\t}\n\n\tfindFirst<TSelection extends Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>(\n\t\tconfig?: KnownKeysOnly<TSelection, Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>,\n\t): PgRelationalQuery<BuildQueryResult<TSchema, TFields, TSelection> | undefined> {\n\t\treturn new PgRelationalQuery(\n\t\t\tthis.fullSchema,\n\t\t\tthis.schema,\n\t\t\tthis.tableNamesMap,\n\t\t\tthis.table,\n\t\t\tthis.tableConfig,\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tconfig ? { ...(config as DBQueryConfig<'many', true> | undefined), limit: 1 } : { limit: 1 },\n\t\t\t'first',\n\t\t);\n\t}\n}\n\nexport class PgRelationalQuery<TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'pg'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'PgRelationalQuery';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly result: TResult;\n\t};\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: TablesRelationalConfig,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\tprivate table: PgTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: PgDialect,\n\t\tprivate session: PgSession,\n\t\tprivate config: DBQueryConfig<'many', true> | true,\n\t\tprivate mode: 'many' | 'first',\n\t) {\n\t\tsuper();\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): PgPreparedQuery<PreparedQueryConfig & { execute: TResult }> {\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\tconst { query, builtQuery } = this._toSQL();\n\n\t\t\treturn this.session.prepareQuery<PreparedQueryConfig & { execute: TResult }>(\n\t\t\t\tbuiltQuery,\n\t\t\t\tundefined,\n\t\t\t\tname,\n\t\t\t\ttrue,\n\t\t\t\t(rawRows, mapColumnValue) => {\n\t\t\t\t\tconst rows = rawRows.map((row) =>\n\t\t\t\t\t\tmapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue)\n\t\t\t\t\t);\n\t\t\t\t\tif (this.mode === 'first') {\n\t\t\t\t\t\treturn rows[0] as TResult;\n\t\t\t\t\t}\n\t\t\t\t\treturn rows as TResult;\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n\n\tprepare(name: string): PgPreparedQuery<PreparedQueryConfig & { execute: TResult }> {\n\t\treturn this._prepare(name);\n\t}\n\n\tprivate _getQuery() {\n\t\treturn this.dialect.buildRelationalQueryWithoutPK({\n\t\t\tfullSchema: this.fullSchema,\n\t\t\tschema: this.schema,\n\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t});\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this._getQuery().sql as SQL;\n\t}\n\n\tprivate _toSQL(): { query: BuildRelationalQueryResult; builtQuery: QueryWithTypings } {\n\t\tconst query = this._getQuery();\n\n\t\tconst builtQuery = this.dialect.sqlToQuery(query.sql as SQL);\n\n\t\treturn { query, builtQuery };\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this._toSQL().builtQuery;\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\toverride execute(): Promise<TResult> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(undefined, this.authToken);\n\t\t});\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/query-builders/raw.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { Query, SQL, SQLWrapper } from '~/sql/sql.ts';\n\nexport interface PgRaw<TResult> extends QueryPromise<TResult>, RunnableQuery<TResult, 'pg'>, SQLWrapper {}\n\nexport class PgRaw<TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'pg'>, SQLWrapper, PreparedQuery\n{\n\tstatic override readonly [entityKind]: string = 'PgRaw';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly result: TResult;\n\t};\n\n\tconstructor(\n\t\tpublic execute: () => Promise<TResult>,\n\t\tprivate sql: SQL,\n\t\tprivate query: Query,\n\t\tprivate mapBatchResult: (result: unknown) => unknown,\n\t) {\n\t\tsuper();\n\t}\n\n\t/** @internal */\n\tgetSQL() {\n\t\treturn this.sql;\n\t}\n\n\tgetQuery() {\n\t\treturn this.query;\n\t}\n\n\tmapResult(result: unknown, isFromBatch?: boolean) {\n\t\treturn isFromBatch ? this.mapBatchResult(result) : result;\n\t}\n\n\t_prepare(): PreparedQuery {\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode() {\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/query-builders/refresh-materialized-view.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport type {\n\tPgPreparedQuery,\n\tPgQueryResultHKT,\n\tPgQueryResultKind,\n\tPgSession,\n\tPreparedQueryConfig,\n} from '~/pg-core/session.ts';\nimport type { PgMaterializedView } from '~/pg-core/view.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { NeonAuthToken } from '~/utils';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface PgRefreshMaterializedView<TQueryResult extends PgQueryResultHKT>\n\textends\n\t\tQueryPromise<PgQueryResultKind<TQueryResult, never>>,\n\t\tRunnableQuery<PgQueryResultKind<TQueryResult, never>, 'pg'>,\n\t\tSQLWrapper\n{\n\treadonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly result: PgQueryResultKind<TQueryResult, never>;\n\t};\n}\n\nexport class PgRefreshMaterializedView<TQueryResult extends PgQueryResultHKT>\n\textends QueryPromise<PgQueryResultKind<TQueryResult, never>>\n\timplements RunnableQuery<PgQueryResultKind<TQueryResult, never>, 'pg'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'PgRefreshMaterializedView';\n\n\tprivate config: {\n\t\tview: PgMaterializedView;\n\t\tconcurrently?: boolean;\n\t\twithNoData?: boolean;\n\t};\n\n\tconstructor(\n\t\tview: PgMaterializedView,\n\t\tprivate session: PgSession,\n\t\tprivate dialect: PgDialect,\n\t) {\n\t\tsuper();\n\t\tthis.config = { view };\n\t}\n\n\tconcurrently(): this {\n\t\tif (this.config.withNoData !== undefined) {\n\t\t\tthrow new Error('Cannot use concurrently and withNoData together');\n\t\t}\n\t\tthis.config.concurrently = true;\n\t\treturn this;\n\t}\n\n\twithNoData(): this {\n\t\tif (this.config.concurrently !== undefined) {\n\t\t\tthrow new Error('Cannot use concurrently and withNoData together');\n\t\t}\n\t\tthis.config.withNoData = true;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildRefreshMaterializedViewQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): PgPreparedQuery<\n\t\tPreparedQueryConfig & {\n\t\t\texecute: PgQueryResultKind<TQueryResult, never>;\n\t\t}\n\t> {\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\treturn this.session.prepareQuery(this.dialect.sqlToQuery(this.getSQL()), undefined, name, true);\n\t\t});\n\t}\n\n\tprepare(name: string): PgPreparedQuery<\n\t\tPreparedQueryConfig & {\n\t\t\texecute: PgQueryResultKind<TQueryResult, never>;\n\t\t}\n\t> {\n\t\treturn this._prepare(name);\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\texecute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(placeholderValues, this.authToken);\n\t\t});\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/query-builders/select.ts",
    "content": "import type { CacheConfig, WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { PgColumn } from '~/pg-core/columns/index.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport type { PgSession, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport type { SubqueryWithSelection } from '~/pg-core/subquery.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgViewBase } from '~/pg-core/view-base.ts';\nimport { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tGetSelectTableSelection,\n\tJoinNullability,\n\tJoinType,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { SQL, View } from '~/sql/sql.ts';\nimport type { ColumnsSelection, Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { tracer } from '~/tracing.ts';\nimport {\n\tapplyMixins,\n\ttype DrizzleTypeError,\n\tgetTableColumns,\n\tgetTableLikeName,\n\thaveSameKeys,\n\ttype NeonAuthToken,\n\ttype ValueOrArray,\n} from '~/utils.ts';\nimport { orderSelectedFields } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type {\n\tAnyPgSelect,\n\tCreatePgSelectFromBuilderMode,\n\tGetPgSetOperators,\n\tLockConfig,\n\tLockStrength,\n\tPgCreateSetOperatorFn,\n\tPgSelectConfig,\n\tPgSelectCrossJoinFn,\n\tPgSelectDynamic,\n\tPgSelectHKT,\n\tPgSelectHKTBase,\n\tPgSelectJoinFn,\n\tPgSelectPrepare,\n\tPgSelectWithout,\n\tPgSetOperatorExcludedMethods,\n\tPgSetOperatorWithResult,\n\tSelectedFields,\n\tSetOperatorRightSelect,\n\tTableLikeHasEmptySelection,\n} from './select.types.ts';\n\nexport class PgSelectBuilder<\n\tTSelection extends SelectedFields | undefined,\n\tTBuilderMode extends 'db' | 'qb' = 'db',\n> {\n\tstatic readonly [entityKind]: string = 'PgSelectBuilder';\n\n\tprivate fields: TSelection;\n\tprivate session: PgSession | undefined;\n\tprivate dialect: PgDialect;\n\tprivate withList: Subquery[] = [];\n\tprivate distinct: boolean | {\n\t\ton: (PgColumn | SQLWrapper)[];\n\t} | undefined;\n\n\tconstructor(\n\t\tconfig: {\n\t\t\tfields: TSelection;\n\t\t\tsession: PgSession | undefined;\n\t\t\tdialect: PgDialect;\n\t\t\twithList?: Subquery[];\n\t\t\tdistinct?: boolean | {\n\t\t\t\ton: (PgColumn | SQLWrapper)[];\n\t\t\t};\n\t\t},\n\t) {\n\t\tthis.fields = config.fields;\n\t\tthis.session = config.session;\n\t\tthis.dialect = config.dialect;\n\t\tif (config.withList) {\n\t\t\tthis.withList = config.withList;\n\t\t}\n\t\tthis.distinct = config.distinct;\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Specify the table, subquery, or other target that you're\n\t * building a select query against.\n\t *\n\t * {@link https://www.postgresql.org/docs/current/sql-select.html#SQL-FROM | Postgres from documentation}\n\t */\n\tfrom<TFrom extends PgTable | Subquery | PgViewBase | SQL>(\n\t\tsource: TableLikeHasEmptySelection<TFrom> extends true ? DrizzleTypeError<\n\t\t\t\t\"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause\"\n\t\t\t>\n\t\t\t: TFrom,\n\t): CreatePgSelectFromBuilderMode<\n\t\tTBuilderMode,\n\t\tGetSelectTableName<TFrom>,\n\t\tTSelection extends undefined ? GetSelectTableSelection<TFrom> : TSelection,\n\t\tTSelection extends undefined ? 'single' : 'partial'\n\t> {\n\t\tconst isPartialSelect = !!this.fields;\n\t\tconst src = source as TFrom;\n\n\t\tlet fields: SelectedFields;\n\t\tif (this.fields) {\n\t\t\tfields = this.fields;\n\t\t} else if (is(src, Subquery)) {\n\t\t\t// This is required to use the proxy handler to get the correct field values from the subquery\n\t\t\tfields = Object.fromEntries(\n\t\t\t\tObject.keys(src._.selectedFields).map((\n\t\t\t\t\tkey,\n\t\t\t\t) => [key, src[key as unknown as keyof typeof src] as unknown as SelectedFields[string]]),\n\t\t\t);\n\t\t} else if (is(src, PgViewBase)) {\n\t\t\tfields = src[ViewBaseConfig].selectedFields as SelectedFields;\n\t\t} else if (is(src, SQL)) {\n\t\t\tfields = {};\n\t\t} else {\n\t\t\tfields = getTableColumns<PgTable>(src);\n\t\t}\n\n\t\treturn (new PgSelectBase({\n\t\t\ttable: src,\n\t\t\tfields,\n\t\t\tisPartialSelect,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\twithList: this.withList,\n\t\t\tdistinct: this.distinct,\n\t\t}).setToken(this.authToken)) as any;\n\t}\n}\n\nexport abstract class PgSelectQueryBuilderBase<\n\tTHKT extends PgSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends TypedQueryBuilder<TSelectedFields, TResult> {\n\tstatic override readonly [entityKind]: string = 'PgSelectQueryBuilder';\n\n\toverride readonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly hkt: THKT;\n\t\treadonly tableName: TTableName;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t\treadonly config: PgSelectConfig;\n\t};\n\n\tprotected config: PgSelectConfig;\n\tprotected joinsNotNullableMap: Record<string, boolean>;\n\tprotected tableName: string | undefined;\n\tprivate isPartialSelect: boolean;\n\tprotected session: PgSession | undefined;\n\tprotected dialect: PgDialect;\n\tprotected cacheConfig?: WithCacheConfig = undefined;\n\tprotected usedTables: Set<string> = new Set();\n\n\tconstructor(\n\t\t{ table, fields, isPartialSelect, session, dialect, withList, distinct }: {\n\t\t\ttable: PgSelectConfig['table'];\n\t\t\tfields: PgSelectConfig['fields'];\n\t\t\tisPartialSelect: boolean;\n\t\t\tsession: PgSession | undefined;\n\t\t\tdialect: PgDialect;\n\t\t\twithList: Subquery[];\n\t\t\tdistinct: boolean | {\n\t\t\t\ton: (PgColumn | SQLWrapper)[];\n\t\t\t} | undefined;\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis.config = {\n\t\t\twithList,\n\t\t\ttable,\n\t\t\tfields: { ...fields },\n\t\t\tdistinct,\n\t\t\tsetOperators: [],\n\t\t};\n\t\tthis.isPartialSelect = isPartialSelect;\n\t\tthis.session = session;\n\t\tthis.dialect = dialect;\n\t\tthis._ = {\n\t\t\tselectedFields: fields as TSelectedFields,\n\t\t\tconfig: this.config,\n\t\t} as this['_'];\n\t\tthis.tableName = getTableLikeName(table);\n\t\tthis.joinsNotNullableMap = typeof this.tableName === 'string' ? { [this.tableName]: true } : {};\n\n\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\t}\n\n\t/** @internal */\n\tgetUsedTables() {\n\t\treturn [...this.usedTables];\n\t}\n\n\tprivate createJoin<\n\t\tTJoinType extends JoinType,\n\t\tTIsLateral extends (TJoinType extends 'full' | 'right' ? false : boolean),\n\t>(\n\t\tjoinType: TJoinType,\n\t\tlateral: TIsLateral,\n\t): 'cross' extends TJoinType ? PgSelectCrossJoinFn<this, TDynamic, TIsLateral>\n\t\t: PgSelectJoinFn<this, TDynamic, TJoinType, TIsLateral>\n\t{\n\t\treturn ((\n\t\t\ttable: TIsLateral extends true ? Subquery | SQL : PgTable | Subquery | PgViewBase | SQL,\n\t\t\ton?: ((aliases: TSelection) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst baseTableName = this.tableName;\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\t// store all tables used in a query\n\t\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins?.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (!this.isPartialSelect) {\n\t\t\t\t// If this is the first join and this is not a partial select and we're not selecting from raw SQL, \"move\" the fields from the main table to the nested object\n\t\t\t\tif (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === 'string') {\n\t\t\t\t\tthis.config.fields = {\n\t\t\t\t\t\t[baseTableName]: this.config.fields,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (typeof tableName === 'string' && !is(table, SQL)) {\n\t\t\t\t\tconst selection = is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t: is(table, View)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields\n\t\t\t\t\t\t: table[Table.Symbol.Columns];\n\t\t\t\t\tthis.config.fields[tableName] = selection;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.fields,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as TSelection,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (!this.config.joins) {\n\t\t\t\tthis.config.joins = [];\n\t\t\t}\n\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName, lateral });\n\n\t\t\tif (typeof tableName === 'string') {\n\t\t\t\tswitch (joinType) {\n\t\t\t\t\tcase 'left': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'right': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'cross':\n\t\t\t\t\tcase 'inner': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'full': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this as any;\n\t\t}) as any;\n\t}\n\n\t/**\n\t * Executes a `left join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet | null; }[] = await db.select()\n\t *   .from(users)\n\t *   .leftJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number | null; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .leftJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tleftJoin = this.createJoin('left', false);\n\n\t/**\n\t * Executes a `left join lateral` operation by adding subquery to the current query.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join-lateral}\n\t *\n\t * @param table the subquery to join.\n\t * @param on the `on` clause.\n\t */\n\tleftJoinLateral = this.createJoin('left', true);\n\n\t/**\n\t * Executes a `right join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the joined table with the corresponding row from the main table, if a match is found. If no matching row exists, it sets all columns of the main table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#right-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .rightJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .rightJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\trightJoin = this.createJoin('right', false);\n\n\t/**\n\t * Executes an `inner join` operation, creating a new table by combining rows from two tables that have matching values.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .innerJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .innerJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tinnerJoin = this.createJoin('inner', false);\n\n\t/**\n\t * Executes an `inner join lateral` operation, creating a new table by combining rows from two queries that have matching values.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join-lateral}\n\t *\n\t * @param table the subquery to join.\n\t * @param on the `on` clause.\n\t */\n\tinnerJoinLateral = this.createJoin('inner', true);\n\n\t/**\n\t * Executes a `full join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging rows with matching values and filling in `null` for non-matching columns.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#full-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet | null; }[] = await db.select()\n\t *   .from(users)\n\t *   .fullJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number | null; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .fullJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tfullJoin = this.createJoin('full', false);\n\n\t/**\n\t * Executes a `cross join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging all rows from each table.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join}\n\t *\n\t * @param table the table to join.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users, each user with every pet\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .crossJoin(pets)\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .crossJoin(pets)\n\t * ```\n\t */\n\tcrossJoin = this.createJoin('cross', false);\n\n\t/**\n\t * Executes a `cross join lateral` operation by combining rows from two queries into a new table.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method retrieves all rows from both main and joined queries, merging all rows from each query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join-lateral}\n\t *\n\t * @param table the query to join.\n\t */\n\tcrossJoinLateral = this.createJoin('cross', true);\n\n\tprivate createSetOperator(\n\t\ttype: SetOperator,\n\t\tisAll: boolean,\n\t): <TValue extends PgSetOperatorWithResult<TResult>>(\n\t\trightSelection:\n\t\t\t| ((setOperators: GetPgSetOperators) => SetOperatorRightSelect<TValue, TResult>)\n\t\t\t| SetOperatorRightSelect<TValue, TResult>,\n\t) => PgSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tPgSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\treturn (rightSelection) => {\n\t\t\tconst rightSelect = (typeof rightSelection === 'function'\n\t\t\t\t? rightSelection(getPgSetOperators())\n\t\t\t\t: rightSelection) as TypedQueryBuilder<\n\t\t\t\t\tany,\n\t\t\t\t\tTResult\n\t\t\t\t>;\n\n\t\t\tif (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.setOperators.push({ type, isAll, rightSelect });\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Adds `union` set operator to the query.\n\t *\n\t * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all unique names from customers and users tables\n\t * await db.select({ name: users.name })\n\t *   .from(users)\n\t *   .union(\n\t *     db.select({ name: customers.name }).from(customers)\n\t *   );\n\t * // or\n\t * import { union } from 'drizzle-orm/pg-core'\n\t *\n\t * await union(\n\t *   db.select({ name: users.name }).from(users),\n\t *   db.select({ name: customers.name }).from(customers)\n\t * );\n\t * ```\n\t */\n\tunion = this.createSetOperator('union', false);\n\n\t/**\n\t * Adds `union all` set operator to the query.\n\t *\n\t * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all transaction ids from both online and in-store sales\n\t * await db.select({ transaction: onlineSales.transactionId })\n\t *   .from(onlineSales)\n\t *   .unionAll(\n\t *     db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t *   );\n\t * // or\n\t * import { unionAll } from 'drizzle-orm/pg-core'\n\t *\n\t * await unionAll(\n\t *   db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n\t *   db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t * );\n\t * ```\n\t */\n\tunionAll = this.createSetOperator('union', true);\n\n\t/**\n\t * Adds `intersect` set operator to the query.\n\t *\n\t * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select course names that are offered in both departments A and B\n\t * await db.select({ courseName: depA.courseName })\n\t *   .from(depA)\n\t *   .intersect(\n\t *     db.select({ courseName: depB.courseName }).from(depB)\n\t *   );\n\t * // or\n\t * import { intersect } from 'drizzle-orm/pg-core'\n\t *\n\t * await intersect(\n\t *   db.select({ courseName: depA.courseName }).from(depA),\n\t *   db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\tintersect = this.createSetOperator('intersect', false);\n\n\t/**\n\t * Adds `intersect all` set operator to the query.\n\t *\n\t * Calling this method will retain only the rows that are present in both result sets including all duplicates.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all products and quantities that are ordered by both regular and VIP customers\n\t * await db.select({\n\t *   productId: regularCustomerOrders.productId,\n\t *   quantityOrdered: regularCustomerOrders.quantityOrdered\n\t * })\n\t * .from(regularCustomerOrders)\n\t * .intersectAll(\n\t *   db.select({\n\t *     productId: vipCustomerOrders.productId,\n\t *     quantityOrdered: vipCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(vipCustomerOrders)\n\t * );\n\t * // or\n\t * import { intersectAll } from 'drizzle-orm/pg-core'\n\t *\n\t * await intersectAll(\n\t *   db.select({\n\t *     productId: regularCustomerOrders.productId,\n\t *     quantityOrdered: regularCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(regularCustomerOrders),\n\t *   db.select({\n\t *     productId: vipCustomerOrders.productId,\n\t *     quantityOrdered: vipCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(vipCustomerOrders)\n\t * );\n\t * ```\n\t */\n\tintersectAll = this.createSetOperator('intersect', true);\n\n\t/**\n\t * Adds `except` set operator to the query.\n\t *\n\t * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all courses offered in department A but not in department B\n\t * await db.select({ courseName: depA.courseName })\n\t *   .from(depA)\n\t *   .except(\n\t *     db.select({ courseName: depB.courseName }).from(depB)\n\t *   );\n\t * // or\n\t * import { except } from 'drizzle-orm/pg-core'\n\t *\n\t * await except(\n\t *   db.select({ courseName: depA.courseName }).from(depA),\n\t *   db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\texcept = this.createSetOperator('except', false);\n\n\t/**\n\t * Adds `except all` set operator to the query.\n\t *\n\t * Calling this method will retrieve all rows from the left query, except for the rows that are present in the result set of the right query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#except-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all products that are ordered by regular customers but not by VIP customers\n\t * await db.select({\n\t *   productId: regularCustomerOrders.productId,\n\t *   quantityOrdered: regularCustomerOrders.quantityOrdered,\n\t * })\n\t * .from(regularCustomerOrders)\n\t * .exceptAll(\n\t *   db.select({\n\t *     productId: vipCustomerOrders.productId,\n\t *     quantityOrdered: vipCustomerOrders.quantityOrdered,\n\t *   })\n\t *   .from(vipCustomerOrders)\n\t * );\n\t * // or\n\t * import { exceptAll } from 'drizzle-orm/pg-core'\n\t *\n\t * await exceptAll(\n\t *   db.select({\n\t *     productId: regularCustomerOrders.productId,\n\t *     quantityOrdered: regularCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(regularCustomerOrders),\n\t *   db.select({\n\t *     productId: vipCustomerOrders.productId,\n\t *     quantityOrdered: vipCustomerOrders.quantityOrdered\n\t *   })\n\t *   .from(vipCustomerOrders)\n\t * );\n\t * ```\n\t */\n\texceptAll = this.createSetOperator('except', true);\n\n\t/** @internal */\n\taddSetOperators(setOperators: PgSelectConfig['setOperators']): PgSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tPgSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\tthis.config.setOperators.push(...setOperators);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#filtering}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be selected.\n\t *\n\t * ```ts\n\t * // Select all cars with green color\n\t * await db.select().from(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.select().from(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Select all BMW cars with a green color\n\t * await db.select().from(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Select all cars with the green or blue color\n\t * await db.select().from(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(\n\t\twhere: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): PgSelectWithout<this, TDynamic, 'where'> {\n\t\tif (typeof where === 'function') {\n\t\t\twhere = where(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `having` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition. It is typically used with aggregate functions to filter the aggregated data based on a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @param having the `having` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all brands with more than one car\n\t * await db.select({\n\t * \tbrand: cars.brand,\n\t * \tcount: sql<number>`cast(count(${cars.id}) as int)`,\n\t * })\n\t *   .from(cars)\n\t *   .groupBy(cars.brand)\n\t *   .having(({ count }) => gt(count, 1));\n\t * ```\n\t */\n\thaving(\n\t\thaving: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): PgSelectWithout<this, TDynamic, 'having'> {\n\t\tif (typeof having === 'function') {\n\t\t\thaving = having(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.having = having;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `group by` clause to the query.\n\t *\n\t * Calling this method will group rows that have the same values into summary rows, often used for aggregation purposes.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Group and count people by their last names\n\t * await db.select({\n\t *    lastName: people.lastName,\n\t *    count: sql<number>`cast(count(*) as int)`\n\t * })\n\t *   .from(people)\n\t *   .groupBy(people.lastName);\n\t * ```\n\t */\n\tgroupBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<PgColumn | SQL | SQL.Aliased>,\n\t): PgSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(...columns: (PgColumn | SQL | SQL.Aliased)[]): PgSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<PgColumn | SQL | SQL.Aliased>]\n\t\t\t| (PgColumn | SQL | SQL.Aliased)[]\n\t): PgSelectWithout<this, TDynamic, 'groupBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst groupBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t\tthis.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];\n\t\t} else {\n\t\t\tthis.config.groupBy = columns as (PgColumn | SQL | SQL.Aliased)[];\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `order by` clause to the query.\n\t *\n\t * Calling this method will sort the result-set in ascending or descending order. By default, the sort order is ascending.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#order-by}\n\t *\n\t * @example\n\t *\n\t * ```\n\t * // Select cars ordered by year\n\t * await db.select().from(cars).orderBy(cars.year);\n\t * ```\n\t *\n\t * You can specify whether results are in ascending or descending order with the `asc()` and `desc()` operators.\n\t *\n\t * ```ts\n\t * // Select cars ordered by year in descending order\n\t * await db.select().from(cars).orderBy(desc(cars.year));\n\t *\n\t * // Select cars ordered by year and price\n\t * await db.select().from(cars).orderBy(asc(cars.year), desc(cars.price));\n\t * ```\n\t */\n\torderBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<PgColumn | SQL | SQL.Aliased>,\n\t): PgSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (PgColumn | SQL | SQL.Aliased)[]): PgSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<PgColumn | SQL | SQL.Aliased>]\n\t\t\t| (PgColumn | SQL | SQL.Aliased)[]\n\t): PgSelectWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t} else {\n\t\t\tconst orderByArray = columns as (PgColumn | SQL | SQL.Aliased)[];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `limit` clause to the query.\n\t *\n\t * Calling this method will set the maximum number of rows that will be returned by this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param limit the `limit` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the first 10 people from this query.\n\t * await db.select().from(people).limit(10);\n\t * ```\n\t */\n\tlimit(limit: number | Placeholder): PgSelectWithout<this, TDynamic, 'limit'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.limit = limit;\n\t\t} else {\n\t\t\tthis.config.limit = limit;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `offset` clause to the query.\n\t *\n\t * Calling this method will skip a number of rows when returning results from this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param offset the `offset` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the 10th-20th people from this query.\n\t * await db.select().from(people).offset(10).limit(10);\n\t * ```\n\t */\n\toffset(offset: number | Placeholder): PgSelectWithout<this, TDynamic, 'offset'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.offset = offset;\n\t\t} else {\n\t\t\tthis.config.offset = offset;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `for` clause to the query.\n\t *\n\t * Calling this method will specify a lock strength for this query that controls how strictly it acquires exclusive access to the rows being queried.\n\t *\n\t * See docs: {@link https://www.postgresql.org/docs/current/sql-select.html#SQL-FOR-UPDATE-SHARE}\n\t *\n\t * @param strength the lock strength.\n\t * @param config the lock configuration.\n\t */\n\tfor(strength: LockStrength, config: LockConfig = {}): PgSelectWithout<this, TDynamic, 'for'> {\n\t\tthis.config.lockingClause = { strength, config };\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildSelectQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\tas<TAlias extends string>(\n\t\talias: TAlias,\n\t): SubqueryWithSelection<this['_']['selectedFields'], TAlias> {\n\t\tconst usedTables: string[] = [];\n\t\tusedTables.push(...extractUsedTable(this.config.table));\n\t\tif (this.config.joins) { for (const it of this.config.joins) usedTables.push(...extractUsedTable(it.table)); }\n\n\t\treturn new Proxy(\n\t\t\tnew Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]),\n\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as SubqueryWithSelection<this['_']['selectedFields'], TAlias>;\n\t}\n\n\t/** @internal */\n\toverride getSelectedFields(): this['_']['selectedFields'] {\n\t\treturn new Proxy(\n\t\t\tthis.config.fields,\n\t\t\tnew SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): PgSelectDynamic<this> {\n\t\treturn this;\n\t}\n\n\t$withCache(config?: { config?: CacheConfig; tag?: string; autoInvalidate?: boolean } | false) {\n\t\tthis.cacheConfig = config === undefined\n\t\t\t? { config: {}, enable: true, autoInvalidate: true }\n\t\t\t: config === false\n\t\t\t? { enable: false }\n\t\t\t: { enable: true, autoInvalidate: true, ...config };\n\t\treturn this;\n\t}\n}\n\nexport interface PgSelectBase<\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends\n\tPgSelectQueryBuilderBase<\n\t\tPgSelectHKT,\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tQueryPromise<TResult>,\n\tSQLWrapper\n{}\n\nexport class PgSelectBase<\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends PgSelectQueryBuilderBase<\n\tPgSelectHKT,\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTNullabilityMap,\n\tTDynamic,\n\tTExcludedMethods,\n\tTResult,\n\tTSelectedFields\n> implements RunnableQuery<TResult, 'pg'>, SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'PgSelect';\n\n\t/** @internal */\n\t_prepare(name?: string): PgSelectPrepare<this> {\n\t\tconst { session, config, dialect, joinsNotNullableMap, authToken, cacheConfig, usedTables } = this;\n\t\tif (!session) {\n\t\t\tthrow new Error('Cannot execute a query on a query builder. Please use a database instance instead.');\n\t\t}\n\n\t\tconst { fields } = config;\n\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\tconst fieldsList = orderSelectedFields<PgColumn>(fields);\n\t\t\tconst query = session.prepareQuery<\n\t\t\t\tPreparedQueryConfig & { execute: TResult }\n\t\t\t>(dialect.sqlToQuery(this.getSQL()), fieldsList, name, true, undefined, {\n\t\t\t\ttype: 'select',\n\t\t\t\ttables: [...usedTables],\n\t\t\t}, cacheConfig);\n\t\t\tquery.joinsNotNullableMap = joinsNotNullableMap;\n\n\t\t\treturn query.setToken(authToken);\n\t\t});\n\t}\n\n\t/**\n\t * Create a prepared statement for this query. This allows\n\t * the database to remember this query for the given session\n\t * and call it by name, rather than specifying the full query.\n\t *\n\t * {@link https://www.postgresql.org/docs/current/sql-prepare.html | Postgres prepare documentation}\n\t */\n\tprepare(name: string): PgSelectPrepare<this> {\n\t\treturn this._prepare(name);\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\texecute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(placeholderValues, this.authToken);\n\t\t});\n\t};\n}\n\napplyMixins(PgSelectBase, [QueryPromise]);\n\nfunction createSetOperator(type: SetOperator, isAll: boolean): PgCreateSetOperatorFn {\n\treturn (leftSelect, rightSelect, ...restSelects) => {\n\t\tconst setOperators = [rightSelect, ...restSelects].map((select) => ({\n\t\t\ttype,\n\t\t\tisAll,\n\t\t\trightSelect: select as AnyPgSelect,\n\t\t}));\n\n\t\tfor (const setOperator of setOperators) {\n\t\t\tif (!haveSameKeys((leftSelect as any).getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn (leftSelect as AnyPgSelect).addSetOperators(setOperators) as any;\n\t};\n}\n\nconst getPgSetOperators = () => ({\n\tunion,\n\tunionAll,\n\tintersect,\n\tintersectAll,\n\texcept,\n\texceptAll,\n});\n\n/**\n * Adds `union` set operator to the query.\n *\n * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n *\n * @example\n *\n * ```ts\n * // Select all unique names from customers and users tables\n * import { union } from 'drizzle-orm/pg-core'\n *\n * await union(\n *   db.select({ name: users.name }).from(users),\n *   db.select({ name: customers.name }).from(customers)\n * );\n * // or\n * await db.select({ name: users.name })\n *   .from(users)\n *   .union(\n *     db.select({ name: customers.name }).from(customers)\n *   );\n * ```\n */\nexport const union = createSetOperator('union', false);\n\n/**\n * Adds `union all` set operator to the query.\n *\n * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n *\n * @example\n *\n * ```ts\n * // Select all transaction ids from both online and in-store sales\n * import { unionAll } from 'drizzle-orm/pg-core'\n *\n * await unionAll(\n *   db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n *   db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * // or\n * await db.select({ transaction: onlineSales.transactionId })\n *   .from(onlineSales)\n *   .unionAll(\n *     db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n *   );\n * ```\n */\nexport const unionAll = createSetOperator('union', true);\n\n/**\n * Adds `intersect` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n *\n * @example\n *\n * ```ts\n * // Select course names that are offered in both departments A and B\n * import { intersect } from 'drizzle-orm/pg-core'\n *\n * await intersect(\n *   db.select({ courseName: depA.courseName }).from(depA),\n *   db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n *   .from(depA)\n *   .intersect(\n *     db.select({ courseName: depB.courseName }).from(depB)\n *   );\n * ```\n */\nexport const intersect = createSetOperator('intersect', false);\n\n/**\n * Adds `intersect all` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets including all duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect-all}\n *\n * @example\n *\n * ```ts\n * // Select all products and quantities that are ordered by both regular and VIP customers\n * import { intersectAll } from 'drizzle-orm/pg-core'\n *\n * await intersectAll(\n *   db.select({\n *     productId: regularCustomerOrders.productId,\n *     quantityOrdered: regularCustomerOrders.quantityOrdered\n *   })\n *   .from(regularCustomerOrders),\n *   db.select({\n *     productId: vipCustomerOrders.productId,\n *     quantityOrdered: vipCustomerOrders.quantityOrdered\n *   })\n *   .from(vipCustomerOrders)\n * );\n * // or\n * await db.select({\n *   productId: regularCustomerOrders.productId,\n *   quantityOrdered: regularCustomerOrders.quantityOrdered\n * })\n * .from(regularCustomerOrders)\n * .intersectAll(\n *   db.select({\n *     productId: vipCustomerOrders.productId,\n *     quantityOrdered: vipCustomerOrders.quantityOrdered\n *   })\n *   .from(vipCustomerOrders)\n * );\n * ```\n */\nexport const intersectAll = createSetOperator('intersect', true);\n\n/**\n * Adds `except` set operator to the query.\n *\n * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n *\n * @example\n *\n * ```ts\n * // Select all courses offered in department A but not in department B\n * import { except } from 'drizzle-orm/pg-core'\n *\n * await except(\n *   db.select({ courseName: depA.courseName }).from(depA),\n *   db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n *   .from(depA)\n *   .except(\n *     db.select({ courseName: depB.courseName }).from(depB)\n *   );\n * ```\n */\nexport const except = createSetOperator('except', false);\n\n/**\n * Adds `except all` set operator to the query.\n *\n * Calling this method will retrieve all rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except-all}\n *\n * @example\n *\n * ```ts\n * // Select all products that are ordered by regular customers but not by VIP customers\n * import { exceptAll } from 'drizzle-orm/pg-core'\n *\n * await exceptAll(\n *   db.select({\n *     productId: regularCustomerOrders.productId,\n *     quantityOrdered: regularCustomerOrders.quantityOrdered\n *   })\n *   .from(regularCustomerOrders),\n *   db.select({\n *     productId: vipCustomerOrders.productId,\n *     quantityOrdered: vipCustomerOrders.quantityOrdered\n *   })\n *   .from(vipCustomerOrders)\n * );\n * // or\n * await db.select({\n *   productId: regularCustomerOrders.productId,\n *   quantityOrdered: regularCustomerOrders.quantityOrdered,\n * })\n * .from(regularCustomerOrders)\n * .exceptAll(\n *   db.select({\n *     productId: vipCustomerOrders.productId,\n *     quantityOrdered: vipCustomerOrders.quantityOrdered,\n *   })\n *   .from(vipCustomerOrders)\n * );\n * ```\n */\nexport const exceptAll = createSetOperator('except', true);\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/query-builders/select.types.ts",
    "content": "import type {\n\tSelectedFields as SelectedFieldsBase,\n\tSelectedFieldsFlat as SelectedFieldsFlatBase,\n\tSelectedFieldsOrdered as SelectedFieldsOrderedBase,\n} from '~/operations.ts';\nimport type { PgColumn } from '~/pg-core/columns/index.ts';\nimport type { PgTable, PgTableWithColumns } from '~/pg-core/table.ts';\nimport type { PgViewBase } from '~/pg-core/view-base.ts';\nimport type { PgViewWithSelection } from '~/pg-core/view.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tAppendToNullabilityMap,\n\tAppendToResult,\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tJoinNullability,\n\tJoinType,\n\tMapColumnsToTableAlias,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport type { ColumnsSelection, Placeholder, SQL, SQLWrapper, View } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport type { Table, UpdateTableConfig } from '~/table.ts';\nimport type { Assume, DrizzleTypeError, Equal, ValidateShape, ValueOrArray } from '~/utils.ts';\nimport type { PgPreparedQuery, PreparedQueryConfig } from '../session.ts';\nimport type { PgSelectBase, PgSelectQueryBuilderBase } from './select.ts';\n\nexport interface PgSelectJoinConfig {\n\ton: SQL | undefined;\n\ttable: PgTable | Subquery | PgViewBase | SQL;\n\talias: string | undefined;\n\tjoinType: JoinType;\n\tlateral?: boolean;\n}\n\nexport type BuildAliasTable<TTable extends PgTable | View, TAlias extends string> = TTable extends Table\n\t? PgTableWithColumns<\n\t\tUpdateTableConfig<TTable['_']['config'], {\n\t\t\tname: TAlias;\n\t\t\tcolumns: MapColumnsToTableAlias<TTable['_']['columns'], TAlias, 'pg'>;\n\t\t}>\n\t>\n\t: TTable extends View ? PgViewWithSelection<\n\t\t\tTAlias,\n\t\t\tTTable['_']['existing'],\n\t\t\tMapColumnsToTableAlias<TTable['_']['selectedFields'], TAlias, 'pg'>\n\t\t>\n\t: never;\n\nexport interface PgSelectConfig {\n\twithList?: Subquery[];\n\t// Either fields or fieldsFlat must be defined\n\tfields: Record<string, unknown>;\n\tfieldsFlat?: SelectedFieldsOrdered;\n\twhere?: SQL;\n\thaving?: SQL;\n\ttable: PgTable | Subquery | PgViewBase | SQL;\n\tlimit?: number | Placeholder;\n\toffset?: number | Placeholder;\n\tjoins?: PgSelectJoinConfig[];\n\torderBy?: (PgColumn | SQL | SQL.Aliased)[];\n\tgroupBy?: (PgColumn | SQL | SQL.Aliased)[];\n\tlockingClause?: {\n\t\tstrength: LockStrength;\n\t\tconfig: LockConfig;\n\t};\n\tdistinct?: boolean | {\n\t\ton: (PgColumn | SQLWrapper)[];\n\t};\n\tsetOperators: {\n\t\trightSelect: TypedQueryBuilder<any, any>;\n\t\ttype: SetOperator;\n\t\tisAll: boolean;\n\t\torderBy?: (PgColumn | SQL | SQL.Aliased)[];\n\t\tlimit?: number | Placeholder;\n\t\toffset?: number | Placeholder;\n\t}[];\n}\n\nexport type TableLikeHasEmptySelection<T extends PgTable | Subquery | PgViewBase | SQL> = T extends Subquery\n\t? Equal<T['_']['selectedFields'], {}> extends true ? true : false\n\t: false;\n\nexport type PgSelectJoin<\n\tT extends AnyPgSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n\tTJoinedTable extends PgTable | Subquery | PgViewBase | SQL,\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n> = T extends any ? PgSelectWithout<\n\t\tPgSelectKind<\n\t\t\tT['_']['hkt'],\n\t\t\tT['_']['tableName'],\n\t\t\tAppendToResult<\n\t\t\t\tT['_']['tableName'],\n\t\t\t\tT['_']['selection'],\n\t\t\t\tTJoinedName,\n\t\t\t\tTJoinedTable extends Table ? TJoinedTable['_']['columns']\n\t\t\t\t\t: TJoinedTable extends Subquery | View ? Assume<TJoinedTable['_']['selectedFields'], SelectedFields>\n\t\t\t\t\t: never,\n\t\t\t\tT['_']['selectMode']\n\t\t\t>,\n\t\t\tT['_']['selectMode'] extends 'partial' ? T['_']['selectMode'] : 'multiple',\n\t\t\tAppendToNullabilityMap<T['_']['nullabilityMap'], TJoinedName, TJoinType>,\n\t\t\tT['_']['dynamic'],\n\t\t\tT['_']['excludedMethods']\n\t\t>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>\n\t: never;\n\nexport type PgSelectJoinFn<\n\tT extends AnyPgSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n\tTIsLateral extends boolean,\n> = <\n\tTJoinedTable extends (TIsLateral extends true ? Subquery | SQL : PgTable | Subquery | PgViewBase | SQL),\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n>(\n\ttable: TableLikeHasEmptySelection<TJoinedTable> extends true ? DrizzleTypeError<\n\t\t\t\"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause\"\n\t\t>\n\t\t: TJoinedTable,\n\ton: ((aliases: T['_']['selection']) => SQL | undefined) | SQL | undefined,\n) => PgSelectJoin<T, TDynamic, TJoinType, TJoinedTable, TJoinedName>;\n\nexport type PgSelectCrossJoinFn<\n\tT extends AnyPgSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTIsLateral extends boolean,\n> = <\n\tTJoinedTable extends (TIsLateral extends true ? Subquery | SQL : PgTable | Subquery | PgViewBase | SQL),\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n>(\n\ttable: TableLikeHasEmptySelection<TJoinedTable> extends true ? DrizzleTypeError<\n\t\t\t\"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause\"\n\t\t>\n\t\t: TJoinedTable,\n) => PgSelectJoin<T, TDynamic, 'cross', TJoinedTable, TJoinedName>;\n\nexport type SelectedFieldsFlat = SelectedFieldsFlatBase<PgColumn>;\n\nexport type SelectedFields = SelectedFieldsBase<PgColumn, PgTable>;\n\nexport type SelectedFieldsOrdered = SelectedFieldsOrderedBase<PgColumn>;\n\nexport type LockStrength = 'update' | 'no key update' | 'share' | 'key share';\n\nexport type LockConfig =\n\t& {\n\t\tof?: ValueOrArray<PgTable>;\n\t}\n\t& ({\n\t\tnoWait: true;\n\t\tskipLocked?: undefined;\n\t} | {\n\t\tnoWait?: undefined;\n\t\tskipLocked: true;\n\t} | {\n\t\tnoWait?: undefined;\n\t\tskipLocked?: undefined;\n\t});\n\nexport interface PgSelectHKTBase {\n\ttableName: string | undefined;\n\tselection: unknown;\n\tselectMode: SelectMode;\n\tnullabilityMap: unknown;\n\tdynamic: boolean;\n\texcludedMethods: string;\n\tresult: unknown;\n\tselectedFields: unknown;\n\t_type: unknown;\n}\n\nexport type PgSelectKind<\n\tT extends PgSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability>,\n\tTDynamic extends boolean,\n\tTExcludedMethods extends string,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> = (T & {\n\ttableName: TTableName;\n\tselection: TSelection;\n\tselectMode: TSelectMode;\n\tnullabilityMap: TNullabilityMap;\n\tdynamic: TDynamic;\n\texcludedMethods: TExcludedMethods;\n\tresult: TResult;\n\tselectedFields: TSelectedFields;\n})['_type'];\n\nexport interface PgSelectQueryBuilderHKT extends PgSelectHKTBase {\n\t_type: PgSelectQueryBuilderBase<\n\t\tPgSelectQueryBuilderHKT,\n\t\tthis['tableName'],\n\t\tAssume<this['selection'], ColumnsSelection>,\n\t\tthis['selectMode'],\n\t\tAssume<this['nullabilityMap'], Record<string, JoinNullability>>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods'],\n\t\tAssume<this['result'], any[]>,\n\t\tAssume<this['selectedFields'], ColumnsSelection>\n\t>;\n}\n\nexport interface PgSelectHKT extends PgSelectHKTBase {\n\t_type: PgSelectBase<\n\t\tthis['tableName'],\n\t\tAssume<this['selection'], ColumnsSelection>,\n\t\tthis['selectMode'],\n\t\tAssume<this['nullabilityMap'], Record<string, JoinNullability>>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods'],\n\t\tAssume<this['result'], any[]>,\n\t\tAssume<this['selectedFields'], ColumnsSelection>\n\t>;\n}\n\nexport type CreatePgSelectFromBuilderMode<\n\tTBuilderMode extends 'db' | 'qb',\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n> = TBuilderMode extends 'db' ? PgSelectBase<TTableName, TSelection, TSelectMode>\n\t: PgSelectQueryBuilderBase<PgSelectQueryBuilderHKT, TTableName, TSelection, TSelectMode>;\n\nexport type PgSetOperatorExcludedMethods =\n\t| 'leftJoin'\n\t| 'rightJoin'\n\t| 'innerJoin'\n\t| 'fullJoin'\n\t| 'where'\n\t| 'having'\n\t| 'groupBy'\n\t| 'for';\n\nexport type PgSelectWithout<\n\tT extends AnyPgSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n\tTResetExcluded extends boolean = false,\n> = TDynamic extends true ? T : Omit<\n\tPgSelectKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['tableName'],\n\t\tT['_']['selection'],\n\t\tT['_']['selectMode'],\n\t\tT['_']['nullabilityMap'],\n\t\tTDynamic,\n\t\tTResetExcluded extends true ? K : T['_']['excludedMethods'] | K,\n\t\tT['_']['result'],\n\t\tT['_']['selectedFields']\n\t>,\n\tTResetExcluded extends true ? K : T['_']['excludedMethods'] | K\n>;\n\nexport type PgSelectPrepare<T extends AnyPgSelect> = PgPreparedQuery<\n\tPreparedQueryConfig & {\n\t\texecute: T['_']['result'];\n\t}\n>;\n\nexport type PgSelectDynamic<T extends AnyPgSelectQueryBuilder> = PgSelectKind<\n\tT['_']['hkt'],\n\tT['_']['tableName'],\n\tT['_']['selection'],\n\tT['_']['selectMode'],\n\tT['_']['nullabilityMap'],\n\ttrue,\n\tnever,\n\tT['_']['result'],\n\tT['_']['selectedFields']\n>;\n\nexport type PgSelectQueryBuilder<\n\tTHKT extends PgSelectHKTBase = PgSelectQueryBuilderHKT,\n\tTTableName extends string | undefined = string | undefined,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n\tTResult extends any[] = unknown[],\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> = PgSelectQueryBuilderBase<\n\tTHKT,\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTNullabilityMap,\n\ttrue,\n\tnever,\n\tTResult,\n\tTSelectedFields\n>;\n\nexport type AnyPgSelectQueryBuilder = PgSelectQueryBuilderBase<any, any, any, any, any, any, any, any, any>;\n\nexport type AnyPgSetOperatorInterface = PgSetOperatorInterface<any, any, any, any, any, any, any, any>;\n\nexport interface PgSetOperatorInterface<\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> {\n\t_: {\n\t\treadonly hkt: PgSelectHKT;\n\t\treadonly tableName: TTableName;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t};\n}\n\nexport type PgSetOperatorWithResult<TResult extends any[]> = PgSetOperatorInterface<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tTResult,\n\tany\n>;\n\nexport type PgSelect<\n\tTTableName extends string | undefined = string | undefined,\n\tTSelection extends ColumnsSelection = Record<string, any>,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n> = PgSelectBase<TTableName, TSelection, TSelectMode, TNullabilityMap, true, never>;\n\nexport type AnyPgSelect = PgSelectBase<any, any, any, any, any, any, any, any>;\n\nexport type PgSetOperator<\n\tTTableName extends string | undefined = string | undefined,\n\tTSelection extends ColumnsSelection = Record<string, any>,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n> = PgSelectBase<\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTNullabilityMap,\n\ttrue,\n\tPgSetOperatorExcludedMethods\n>;\n\nexport type SetOperatorRightSelect<\n\tTValue extends PgSetOperatorWithResult<TResult>,\n\tTResult extends any[],\n> = TValue extends PgSetOperatorInterface<any, any, any, any, any, any, infer TValueResult, any> ? ValidateShape<\n\t\tTValueResult[number],\n\t\tTResult[number],\n\t\tTypedQueryBuilder<any, TValueResult>\n\t>\n\t: TValue;\n\nexport type SetOperatorRestSelect<\n\tTValue extends readonly PgSetOperatorWithResult<TResult>[],\n\tTResult extends any[],\n> = TValue extends [infer First, ...infer Rest]\n\t? First extends PgSetOperatorInterface<any, any, any, any, any, any, infer TValueResult, any>\n\t\t? Rest extends AnyPgSetOperatorInterface[] ? [\n\t\t\t\tValidateShape<TValueResult[number], TResult[number], TypedQueryBuilder<any, TValueResult>>,\n\t\t\t\t...SetOperatorRestSelect<Rest, TResult>,\n\t\t\t]\n\t\t: ValidateShape<TValueResult[number], TResult[number], TypedQueryBuilder<any, TValueResult>[]>\n\t: never\n\t: TValue;\n\nexport type PgCreateSetOperatorFn = <\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTValue extends PgSetOperatorWithResult<TResult>,\n\tTRest extends PgSetOperatorWithResult<TResult>[],\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n>(\n\tleftSelect: PgSetOperatorInterface<\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\trightSelect: SetOperatorRightSelect<TValue, TResult>,\n\t...restSelects: SetOperatorRestSelect<TRest, TResult>\n) => PgSelectWithout<\n\tPgSelectBase<\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tfalse,\n\tPgSetOperatorExcludedMethods,\n\ttrue\n>;\n\nexport type GetPgSetOperators = {\n\tunion: PgCreateSetOperatorFn;\n\tintersect: PgCreateSetOperatorFn;\n\texcept: PgCreateSetOperatorFn;\n\tunionAll: PgCreateSetOperatorFn;\n\tintersectAll: PgCreateSetOperatorFn;\n\texceptAll: PgCreateSetOperatorFn;\n};\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/query-builders/update.ts",
    "content": "import type { WithCacheConfig } from '~/cache/core/types.ts';\nimport type { GetColumnData } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport type {\n\tPgPreparedQuery,\n\tPgQueryResultHKT,\n\tPgQueryResultKind,\n\tPgSession,\n\tPreparedQueryConfig,\n} from '~/pg-core/session.ts';\nimport { PgTable } from '~/pg-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tAppendToNullabilityMap,\n\tAppendToResult,\n\tGetSelectTableName,\n\tGetSelectTableSelection,\n\tJoinNullability,\n\tJoinType,\n\tSelectMode,\n\tSelectResult,\n} from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { type ColumnsSelection, type Query, SQL, type SQLWrapper } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, Table } from '~/table.ts';\nimport {\n\ttype Assume,\n\ttype DrizzleTypeError,\n\ttype Equal,\n\tgetTableLikeName,\n\tmapUpdateSet,\n\ttype NeonAuthToken,\n\torderSelectedFields,\n\ttype Simplify,\n\ttype UpdateSet,\n} from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { PgColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type { PgViewBase } from '../view-base.ts';\nimport type {\n\tPgSelectJoinConfig,\n\tSelectedFields,\n\tSelectedFieldsOrdered,\n\tTableLikeHasEmptySelection,\n} from './select.types.ts';\n\nexport interface PgUpdateConfig {\n\twhere?: SQL | undefined;\n\tset: UpdateSet;\n\ttable: PgTable;\n\tfrom?: PgTable | Subquery | PgViewBase | SQL;\n\tjoins: PgSelectJoinConfig[];\n\treturningFields?: SelectedFields;\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type PgUpdateSetSource<TTable extends PgTable> =\n\t& {\n\t\t[Key in keyof TTable['$inferInsert']]?:\n\t\t\t| GetColumnData<TTable['_']['columns'][Key]>\n\t\t\t| SQL\n\t\t\t| PgColumn\n\t\t\t| undefined;\n\t}\n\t& {};\n\nexport class PgUpdateBuilder<TTable extends PgTable, TQueryResult extends PgQueryResultHKT> {\n\tstatic readonly [entityKind]: string = 'PgUpdateBuilder';\n\n\tdeclare readonly _: {\n\t\treadonly table: TTable;\n\t};\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: PgSession,\n\t\tprivate dialect: PgDialect,\n\t\tprivate withList?: Subquery[],\n\t) {}\n\n\tprivate authToken?: NeonAuthToken;\n\tsetToken(token: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\tset(\n\t\tvalues: PgUpdateSetSource<TTable>,\n\t): PgUpdateWithout<PgUpdateBase<TTable, TQueryResult>, false, 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'> {\n\t\treturn new PgUpdateBase<TTable, TQueryResult>(\n\t\t\tthis.table,\n\t\t\tmapUpdateSet(this.table, values),\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t).setToken(this.authToken);\n\t}\n}\n\nexport type PgUpdateWithout<\n\tT extends AnyPgUpdate,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T : Omit<\n\tPgUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['from'],\n\t\tT['_']['selectedFields'],\n\t\tT['_']['returning'],\n\t\tT['_']['nullabilityMap'],\n\t\tT['_']['joins'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods'] | K\n\t>,\n\tT['_']['excludedMethods'] | K\n>;\n\nexport type PgUpdateWithJoins<\n\tT extends AnyPgUpdate,\n\tTDynamic extends boolean,\n\tTFrom extends PgTable | Subquery | PgViewBase | SQL,\n> = TDynamic extends true ? T : Omit<\n\tPgUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tTFrom,\n\t\tT['_']['selectedFields'],\n\t\tT['_']['returning'],\n\t\tAppendToNullabilityMap<T['_']['nullabilityMap'], GetSelectTableName<TFrom>, 'inner'>,\n\t\t[...T['_']['joins'], {\n\t\t\tname: GetSelectTableName<TFrom>;\n\t\t\tjoinType: 'inner';\n\t\t\ttable: TFrom;\n\t\t}],\n\t\tTDynamic,\n\t\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n\t>,\n\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n>;\n\nexport type PgUpdateJoinFn<\n\tT extends AnyPgUpdate,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n> = <\n\tTJoinedTable extends PgTable | Subquery | PgViewBase | SQL,\n>(\n\ttable: TableLikeHasEmptySelection<TJoinedTable> extends true ? DrizzleTypeError<\n\t\t\t\"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause\"\n\t\t>\n\t\t: TJoinedTable,\n\ton:\n\t\t| (\n\t\t\t(\n\t\t\t\tupdateTable: T['_']['table']['_']['columns'],\n\t\t\t\tfrom: T['_']['from'] extends PgTable ? T['_']['from']['_']['columns']\n\t\t\t\t\t: T['_']['from'] extends Subquery | PgViewBase ? T['_']['from']['_']['selectedFields']\n\t\t\t\t\t: never,\n\t\t\t) => SQL | undefined\n\t\t)\n\t\t| SQL\n\t\t| undefined,\n) => PgUpdateJoin<T, TDynamic, TJoinType, TJoinedTable>;\n\nexport type PgUpdateJoin<\n\tT extends AnyPgUpdate,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n\tTJoinedTable extends PgTable | Subquery | PgViewBase | SQL,\n> = TDynamic extends true ? T : PgUpdateBase<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['from'],\n\tT['_']['selectedFields'],\n\tT['_']['returning'],\n\tAppendToNullabilityMap<T['_']['nullabilityMap'], GetSelectTableName<TJoinedTable>, TJoinType>,\n\t[...T['_']['joins'], {\n\t\tname: GetSelectTableName<TJoinedTable>;\n\t\tjoinType: TJoinType;\n\t\ttable: TJoinedTable;\n\t}],\n\tTDynamic,\n\tT['_']['excludedMethods']\n>;\n\ntype Join = {\n\tname: string | undefined;\n\tjoinType: JoinType;\n\ttable: PgTable | Subquery | PgViewBase | SQL;\n};\n\ntype AccumulateToResult<\n\tT extends AnyPgUpdate,\n\tTSelectMode extends SelectMode,\n\tTJoins extends Join[],\n\tTSelectedFields extends ColumnsSelection,\n> = TJoins extends [infer TJoin extends Join, ...infer TRest extends Join[]] ? AccumulateToResult<\n\t\tT,\n\t\tTSelectMode extends 'partial' ? TSelectMode : 'multiple',\n\t\tTRest,\n\t\tAppendToResult<\n\t\t\tT['_']['table']['_']['name'],\n\t\t\tTSelectedFields,\n\t\t\tTJoin['name'],\n\t\t\tTJoin['table'] extends Table ? TJoin['table']['_']['columns']\n\t\t\t\t: TJoin['table'] extends Subquery ? Assume<TJoin['table']['_']['selectedFields'], SelectedFields>\n\t\t\t\t: never,\n\t\t\tTSelectMode extends 'partial' ? TSelectMode : 'multiple'\n\t\t>\n\t>\n\t: TSelectedFields;\n\nexport type PgUpdateReturningAll<T extends AnyPgUpdate, TDynamic extends boolean> = PgUpdateWithout<\n\tPgUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['from'],\n\t\tEqual<T['_']['joins'], []> extends true ? T['_']['table']['_']['columns'] : Simplify<\n\t\t\t& Record<T['_']['table']['_']['name'], T['_']['table']['_']['columns']>\n\t\t\t& {\n\t\t\t\t[K in keyof T['_']['joins'] as T['_']['joins'][K]['table']['_']['name']]:\n\t\t\t\t\tT['_']['joins'][K]['table']['_']['columns'];\n\t\t\t}\n\t\t>,\n\t\tSelectResult<\n\t\t\tAccumulateToResult<\n\t\t\t\tT,\n\t\t\t\t'single',\n\t\t\t\tT['_']['joins'],\n\t\t\t\tGetSelectTableSelection<T['_']['table']>\n\t\t\t>,\n\t\t\t'partial',\n\t\t\tT['_']['nullabilityMap']\n\t\t>,\n\t\tT['_']['nullabilityMap'],\n\t\tT['_']['joins'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type PgUpdateReturning<\n\tT extends AnyPgUpdate,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFields,\n> = PgUpdateWithout<\n\tPgUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['from'],\n\t\tTSelectedFields,\n\t\tSelectResult<\n\t\t\tAccumulateToResult<\n\t\t\t\tT,\n\t\t\t\t'partial',\n\t\t\t\tT['_']['joins'],\n\t\t\t\tTSelectedFields\n\t\t\t>,\n\t\t\t'partial',\n\t\t\tT['_']['nullabilityMap']\n\t\t>,\n\t\tT['_']['nullabilityMap'],\n\t\tT['_']['joins'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type PgUpdatePrepare<T extends AnyPgUpdate> = PgPreparedQuery<\n\tPreparedQueryConfig & {\n\t\texecute: T['_']['returning'] extends undefined ? PgQueryResultKind<T['_']['queryResult'], never>\n\t\t\t: T['_']['returning'][];\n\t}\n>;\n\nexport type PgUpdateDynamic<T extends AnyPgUpdate> = PgUpdate<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['from'],\n\tT['_']['returning'],\n\tT['_']['nullabilityMap']\n>;\n\nexport type PgUpdate<\n\tTTable extends PgTable = PgTable,\n\tTQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n\tTFrom extends PgTable | Subquery | PgViewBase | SQL | undefined = undefined,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<TTable['_']['name'], 'not-null'>,\n\tTJoins extends Join[] = [],\n> = PgUpdateBase<TTable, TQueryResult, TFrom, TSelectedFields, TReturning, TNullabilityMap, TJoins, true, never>;\n\nexport type AnyPgUpdate = PgUpdateBase<any, any, any, any, any, any, any, any, any>;\n\nexport interface PgUpdateBase<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tTFrom extends PgTable | Subquery | PgViewBase | SQL | undefined = undefined,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<TTable['_']['name'], 'not-null'>,\n\tTJoins extends Join[] = [],\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tTypedQueryBuilder<\n\t\tTSelectedFields,\n\t\tTReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]\n\t>,\n\tQueryPromise<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[], 'pg'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly table: TTable;\n\t\treadonly joins: TJoins;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly from: TFrom;\n\t\treadonly selectedFields: TSelectedFields;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[];\n\t};\n}\n\nexport class PgUpdateBase<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tTFrom extends PgTable | Subquery | PgViewBase | SQL | undefined = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<TTable['_']['name'], 'not-null'>,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTJoins extends Join[] = [],\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]>\n\timplements\n\t\tRunnableQuery<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[], 'pg'>,\n\t\tSQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'PgUpdate';\n\n\tprivate config: PgUpdateConfig;\n\tprivate tableName: string | undefined;\n\tprivate joinsNotNullableMap: Record<string, boolean>;\n\tprotected cacheConfig?: WithCacheConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tset: UpdateSet,\n\t\tprivate session: PgSession,\n\t\tprivate dialect: PgDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { set, table, withList, joins: [] };\n\t\tthis.tableName = getTableLikeName(table);\n\t\tthis.joinsNotNullableMap = typeof this.tableName === 'string' ? { [this.tableName]: true } : {};\n\t}\n\n\tfrom<TFrom extends PgTable | Subquery | PgViewBase | SQL>(\n\t\tsource: TableLikeHasEmptySelection<TFrom> extends true ? DrizzleTypeError<\n\t\t\t\t\"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause\"\n\t\t\t>\n\t\t\t: TFrom,\n\t): PgUpdateWithJoins<this, TDynamic, TFrom> {\n\t\tconst src = source as TFrom;\n\t\tconst tableName = getTableLikeName(src);\n\t\tif (typeof tableName === 'string') {\n\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t}\n\t\tthis.config.from = src;\n\t\treturn this as any;\n\t}\n\n\tprivate getTableLikeFields(table: PgTable | Subquery | PgViewBase): Record<string, unknown> {\n\t\tif (is(table, PgTable)) {\n\t\t\treturn table[Table.Symbol.Columns];\n\t\t} else if (is(table, Subquery)) {\n\t\t\treturn table._.selectedFields;\n\t\t}\n\t\treturn table[ViewBaseConfig].selectedFields;\n\t}\n\n\tprivate createJoin<TJoinType extends JoinType>(\n\t\tjoinType: TJoinType,\n\t): PgUpdateJoinFn<this, TDynamic, TJoinType> {\n\t\treturn ((\n\t\t\ttable: PgTable | Subquery | PgViewBase | SQL,\n\t\t\ton: ((updateTable: TTable, from: TFrom) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\tconst from = this.config.from && !is(this.config.from, SQL)\n\t\t\t\t\t? this.getTableLikeFields(this.config.from)\n\t\t\t\t\t: undefined;\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t\tfrom && new Proxy(\n\t\t\t\t\t\tfrom,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName });\n\n\t\t\tif (typeof tableName === 'string') {\n\t\t\t\tswitch (joinType) {\n\t\t\t\t\tcase 'left': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'right': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'inner': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'full': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this as any;\n\t\t}) as any;\n\t}\n\n\tleftJoin = this.createJoin('left');\n\n\trightJoin = this.createJoin('right');\n\n\tinnerJoin = this.createJoin('inner');\n\n\tfullJoin = this.createJoin('full');\n\n\t/**\n\t * Adds a 'where' clause to the query.\n\t *\n\t * Calling this method will update only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param where the 'where' clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be updated.\n\t *\n\t * ```ts\n\t * // Update all cars with green color\n\t * await db.update(cars).set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.update(cars).set({ color: 'red' })\n\t *   .where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Update all BMW cars with a green color\n\t * await db.update(cars).set({ color: 'red' })\n\t *   .where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Update all cars with the green or blue color\n\t * await db.update(cars).set({ color: 'red' })\n\t *   .where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): PgUpdateWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the updated rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update#update-with-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Update all cars with the green color and return all fields\n\t * const updatedCars: Car[] = await db.update(cars)\n\t *   .set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning();\n\t *\n\t * // Update all cars with the green color and return only their id and brand fields\n\t * const updatedCarsIdsAndBrands: { id: number, brand: string }[] = await db.update(cars)\n\t *   .set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): PgUpdateReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFields>(\n\t\tfields: TSelectedFields,\n\t): PgUpdateReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields?: SelectedFields,\n\t): PgUpdateWithout<AnyPgUpdate, TDynamic, 'returning'> {\n\t\tif (!fields) {\n\t\t\tfields = Object.assign({}, this.config.table[Table.Symbol.Columns]);\n\n\t\t\tif (this.config.from) {\n\t\t\t\tconst tableName = getTableLikeName(this.config.from);\n\n\t\t\t\tif (typeof tableName === 'string' && this.config.from && !is(this.config.from, SQL)) {\n\t\t\t\t\tconst fromFields = this.getTableLikeFields(this.config.from);\n\t\t\t\t\tfields[tableName] = fromFields as any;\n\t\t\t\t}\n\n\t\t\t\tfor (const join of this.config.joins) {\n\t\t\t\t\tconst tableName = getTableLikeName(join.table);\n\n\t\t\t\t\tif (typeof tableName === 'string' && !is(join.table, SQL)) {\n\t\t\t\t\t\tconst fromFields = this.getTableLikeFields(join.table);\n\t\t\t\t\t\tfields[tableName] = fromFields as any;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.config.returningFields = fields;\n\t\tthis.config.returning = orderSelectedFields<PgColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildUpdateQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): PgUpdatePrepare<this> {\n\t\tconst query = this.session.prepareQuery<\n\t\t\tPreparedQueryConfig & { execute: TReturning[] }\n\t\t>(this.dialect.sqlToQuery(this.getSQL()), this.config.returning, name, true, undefined, {\n\t\t\ttype: 'insert',\n\t\t\ttables: extractUsedTable(this.config.table),\n\t\t}, this.cacheConfig);\n\t\tquery.joinsNotNullableMap = this.joinsNotNullableMap;\n\t\treturn query;\n\t}\n\n\tprepare(name: string): PgUpdatePrepare<this> {\n\t\treturn this._prepare(name);\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn this._prepare().execute(placeholderValues, this.authToken);\n\t};\n\n\t/** @internal */\n\tgetSelectedFields(): this['_']['selectedFields'] {\n\t\treturn (\n\t\t\tthis.config.returningFields\n\t\t\t\t? new Proxy(\n\t\t\t\t\tthis.config.returningFields,\n\t\t\t\t\tnew SelectionProxyHandler({\n\t\t\t\t\t\talias: getTableName(this.config.table),\n\t\t\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\t\t\tsqlBehavior: 'error',\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t: undefined\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): PgUpdateDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/roles.ts",
    "content": "import { entityKind } from '~/entity.ts';\n\nexport interface PgRoleConfig {\n\tcreateDb?: boolean;\n\tcreateRole?: boolean;\n\tinherit?: boolean;\n}\n\nexport class PgRole implements PgRoleConfig {\n\tstatic readonly [entityKind]: string = 'PgRole';\n\n\t/** @internal */\n\t_existing?: boolean;\n\n\t/** @internal */\n\treadonly createDb: PgRoleConfig['createDb'];\n\t/** @internal */\n\treadonly createRole: PgRoleConfig['createRole'];\n\t/** @internal */\n\treadonly inherit: PgRoleConfig['inherit'];\n\n\tconstructor(\n\t\treadonly name: string,\n\t\tconfig?: PgRoleConfig,\n\t) {\n\t\tif (config) {\n\t\t\tthis.createDb = config.createDb;\n\t\t\tthis.createRole = config.createRole;\n\t\t\tthis.inherit = config.inherit;\n\t\t}\n\t}\n\n\texisting(): this {\n\t\tthis._existing = true;\n\t\treturn this;\n\t}\n}\n\nexport function pgRole(name: string, config?: PgRoleConfig) {\n\treturn new PgRole(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/schema.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\nimport { SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { NonArray, Writable } from '~/utils.ts';\nimport { type PgEnum, type PgEnumObject, pgEnumObjectWithSchema, pgEnumWithSchema } from './columns/enum.ts';\nimport { type pgSequence, pgSequenceWithSchema } from './sequence.ts';\nimport { type PgTableFn, pgTableWithSchema } from './table.ts';\nimport { type pgMaterializedView, pgMaterializedViewWithSchema, type pgView, pgViewWithSchema } from './view.ts';\n\nexport class PgSchema<TName extends string = string> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'PgSchema';\n\tconstructor(\n\t\tpublic readonly schemaName: TName,\n\t) {}\n\n\ttable: PgTableFn<TName> = ((name, columns, extraConfig) => {\n\t\treturn pgTableWithSchema(name, columns, extraConfig, this.schemaName);\n\t});\n\n\tview = ((name, columns) => {\n\t\treturn pgViewWithSchema(name, columns, this.schemaName);\n\t}) as typeof pgView;\n\n\tmaterializedView = ((name, columns) => {\n\t\treturn pgMaterializedViewWithSchema(name, columns, this.schemaName);\n\t}) as typeof pgMaterializedView;\n\n\tpublic enum<U extends string, T extends Readonly<[U, ...U[]]>>(\n\t\tenumName: string,\n\t\tvalues: T | Writable<T>,\n\t): PgEnum<Writable<T>>;\n\n\tpublic enum<E extends Record<string, string>>(\n\t\tenumName: string,\n\t\tenumObj: NonArray<E>,\n\t): PgEnumObject<E>;\n\n\tpublic enum(enumName: any, input: any): any {\n\t\treturn Array.isArray(input)\n\t\t\t? pgEnumWithSchema(\n\t\t\t\tenumName,\n\t\t\t\t[...input] as [string, ...string[]],\n\t\t\t\tthis.schemaName,\n\t\t\t)\n\t\t\t: pgEnumObjectWithSchema(enumName, input, this.schemaName);\n\t}\n\n\tsequence: typeof pgSequence = ((name, options) => {\n\t\treturn pgSequenceWithSchema(name, options, this.schemaName);\n\t});\n\n\tgetSQL(): SQL {\n\t\treturn new SQL([sql.identifier(this.schemaName)]);\n\t}\n\n\tshouldOmitSQLParens(): boolean {\n\t\treturn true;\n\t}\n}\n\nexport function isPgSchema(obj: unknown): obj is PgSchema {\n\treturn is(obj, PgSchema);\n}\n\nexport function pgSchema<T extends string>(name: T) {\n\tif (name === 'public') {\n\t\tthrow new Error(\n\t\t\t`You can't specify 'public' as schema name. Postgres is using public schema by default. If you want to use 'public' schema, just use pgTable() instead of creating a schema`,\n\t\t);\n\t}\n\n\treturn new PgSchema(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/sequence.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\n\nexport type PgSequenceOptions = {\n\tincrement?: number | string;\n\tminValue?: number | string;\n\tmaxValue?: number | string;\n\tstartWith?: number | string;\n\tcache?: number | string;\n\tcycle?: boolean;\n};\n\nexport class PgSequence {\n\tstatic readonly [entityKind]: string = 'PgSequence';\n\n\tconstructor(\n\t\tpublic readonly seqName: string | undefined,\n\t\tpublic readonly seqOptions: PgSequenceOptions | undefined,\n\t\tpublic readonly schema: string | undefined,\n\t) {\n\t}\n}\n\nexport function pgSequence(\n\tname: string,\n\toptions?: PgSequenceOptions,\n): PgSequence {\n\treturn pgSequenceWithSchema(name, options, undefined);\n}\n\n/** @internal */\nexport function pgSequenceWithSchema(\n\tname: string,\n\toptions?: PgSequenceOptions,\n\tschema?: string,\n): PgSequence {\n\treturn new PgSequence(name, options, schema);\n}\n\nexport function isPgSequence(obj: unknown): obj is PgSequence {\n\treturn is(obj, PgSequence);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/session.ts",
    "content": "import { type Cache, hashQuery, NoopCache } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleQueryError, TransactionRollbackError } from '~/errors.ts';\nimport type { TablesRelationalConfig } from '~/relations.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport { type Query, type SQL, sql } from '~/sql/index.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { NeonAuthToken } from '~/utils.ts';\nimport { PgDatabase } from './db.ts';\nimport type { PgDialect } from './dialect.ts';\nimport type { SelectedFieldsOrdered } from './query-builders/select.types.ts';\n\nexport interface PreparedQueryConfig {\n\texecute: unknown;\n\tall: unknown;\n\tvalues: unknown;\n}\n\nexport abstract class PgPreparedQuery<T extends PreparedQueryConfig> implements PreparedQuery {\n\tconstructor(\n\t\tprotected query: Query,\n\t\t// cache instance\n\t\tprivate cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprivate queryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\t// config that was passed through $withCache\n\t\tprivate cacheConfig?: WithCacheConfig,\n\t) {\n\t\t// it means that no $withCache options were passed and it should be just enabled\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enable: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enable) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\t}\n\n\tprotected authToken?: NeonAuthToken;\n\n\tgetQuery(): Query {\n\t\treturn this.query;\n\t}\n\n\tmapResult(response: unknown, _isFromBatch?: boolean): unknown {\n\t\treturn response;\n\t}\n\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\tstatic readonly [entityKind]: string = 'PgPreparedQuery';\n\n\t/** @internal */\n\tjoinsNotNullableMap?: Record<string, boolean>;\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tif (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any mutations, if globally is false\n\t\tif (this.cacheConfig && !this.cacheConfig.enable) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// For mutate queries, we should query the database, wait for a response, and then perform invalidation\n\t\tif (\n\t\t\t(\n\t\t\t\tthis.queryMetadata.type === 'insert' || this.queryMetadata.type === 'update'\n\t\t\t\t|| this.queryMetadata.type === 'delete'\n\t\t\t) && this.queryMetadata.tables.length > 0\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst [res] = await Promise.all([\n\t\t\t\t\tquery(),\n\t\t\t\t\tthis.cache.onMutate({ tables: this.queryMetadata.tables }),\n\t\t\t\t]);\n\t\t\t\treturn res;\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any reads if globally disabled\n\t\tif (!this.cacheConfig) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.queryMetadata.type === 'select') {\n\t\t\tconst fromCache = await this.cache.get(\n\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\tthis.queryMetadata.tables,\n\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\tthis.cacheConfig.autoInvalidate,\n\t\t\t);\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tlet result;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await query();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t\t}\n\t\t\t\t// put actual key\n\t\t\t\tawait this.cache.put(\n\t\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tthis.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [],\n\t\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\t\tthis.cacheConfig.config,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\t\ttry {\n\t\t\treturn await query();\n\t\t} catch (e) {\n\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t}\n\t}\n\n\tabstract execute(placeholderValues?: Record<string, unknown>): Promise<T['execute']>;\n\t/** @internal */\n\tabstract execute(placeholderValues?: Record<string, unknown>, token?: NeonAuthToken): Promise<T['execute']>;\n\t/** @internal */\n\tabstract execute(placeholderValues?: Record<string, unknown>, token?: NeonAuthToken): Promise<T['execute']>;\n\n\t/** @internal */\n\tabstract all(placeholderValues?: Record<string, unknown>): Promise<T['all']>;\n\n\t/** @internal */\n\tabstract isResponseInArrayMode(): boolean;\n}\n\nexport interface PgTransactionConfig {\n\tisolationLevel?: 'read uncommitted' | 'read committed' | 'repeatable read' | 'serializable';\n\taccessMode?: 'read only' | 'read write';\n\tdeferrable?: boolean;\n}\n\nexport abstract class PgSession<\n\tTQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = Record<string, never>,\n> {\n\tstatic readonly [entityKind]: string = 'PgSession';\n\n\tconstructor(protected dialect: PgDialect) {}\n\n\tabstract prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgPreparedQuery<T>;\n\n\texecute<T>(query: SQL): Promise<T>;\n\t/** @internal */\n\texecute<T>(query: SQL, token?: NeonAuthToken): Promise<T>;\n\t/** @internal */\n\texecute<T>(query: SQL, token?: NeonAuthToken): Promise<T> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\tconst prepared = tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }>(\n\t\t\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.setToken(token).execute(undefined, token);\n\t\t});\n\t}\n\n\tall<T = unknown>(query: SQL): Promise<T[]> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { all: T[] }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).all();\n\t}\n\n\tasync count(sql: SQL): Promise<number>;\n\t/** @internal */\n\tasync count(sql: SQL, token?: NeonAuthToken): Promise<number>;\n\t/** @internal */\n\tasync count(sql: SQL, token?: NeonAuthToken): Promise<number> {\n\t\tconst res = await this.execute<[{ count: string }]>(sql, token);\n\n\t\treturn Number(\n\t\t\tres[0]['count'],\n\t\t);\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: PgTransaction<TQueryResult, TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T>;\n}\n\nexport abstract class PgTransaction<\n\tTQueryResult extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = Record<string, never>,\n> extends PgDatabase<TQueryResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PgTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\tsession: PgSession<any, any, any>,\n\t\tprotected schema: {\n\t\t\tfullSchema: Record<string, unknown>;\n\t\t\tschema: TSchema;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t} | undefined,\n\t\tprotected readonly nestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, schema);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n\n\t/** @internal */\n\tgetTransactionConfigSQL(config: PgTransactionConfig): SQL {\n\t\tconst chunks: string[] = [];\n\t\tif (config.isolationLevel) {\n\t\t\tchunks.push(`isolation level ${config.isolationLevel}`);\n\t\t}\n\t\tif (config.accessMode) {\n\t\t\tchunks.push(config.accessMode);\n\t\t}\n\t\tif (typeof config.deferrable === 'boolean') {\n\t\t\tchunks.push(config.deferrable ? 'deferrable' : 'not deferrable');\n\t\t}\n\t\treturn sql.raw(chunks.join(' '));\n\t}\n\n\tsetTransaction(config: PgTransactionConfig): Promise<void> {\n\t\treturn this.session.execute(sql`set transaction ${this.getTransactionConfigSQL(config)}`);\n\t}\n\n\tabstract override transaction<T>(\n\t\ttransaction: (tx: PgTransaction<TQueryResult, TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport interface PgQueryResultHKT {\n\treadonly $brand: 'PgQueryResultHKT';\n\treadonly row: unknown;\n\treadonly type: unknown;\n}\n\nexport type PgQueryResultKind<TKind extends PgQueryResultHKT, TRow> = (TKind & {\n\treadonly row: TRow;\n})['type'];\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/subquery.ts",
    "content": "import type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { AddAliasToSelection } from '~/query-builders/select.types.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport type { Subquery, WithSubquery, WithSubqueryWithoutSelection } from '~/subquery.ts';\nimport type { QueryBuilder } from './query-builders/query-builder.ts';\n\nexport type SubqueryWithSelection<TSelection extends ColumnsSelection, TAlias extends string> =\n\t& Subquery<TAlias, AddAliasToSelection<TSelection, TAlias, 'pg'>>\n\t& AddAliasToSelection<TSelection, TAlias, 'pg'>;\n\nexport type WithSubqueryWithSelection<TSelection extends ColumnsSelection, TAlias extends string> =\n\t& WithSubquery<TAlias, AddAliasToSelection<TSelection, TAlias, 'pg'>>\n\t& AddAliasToSelection<TSelection, TAlias, 'pg'>;\n\nexport interface WithBuilder {\n\t<TAlias extends string>(alias: TAlias): {\n\t\tas: {\n\t\t\t<TSelection extends ColumnsSelection>(\n\t\t\t\tqb: TypedQueryBuilder<TSelection> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelection>),\n\t\t\t): WithSubqueryWithSelection<TSelection, TAlias>;\n\t\t\t(\n\t\t\t\tqb: TypedQueryBuilder<undefined> | ((qb: QueryBuilder) => TypedQueryBuilder<undefined>),\n\t\t\t): WithSubqueryWithoutSelection<TAlias>;\n\t\t};\n\t};\n\t<TAlias extends string, TSelection extends ColumnsSelection>(alias: TAlias, selection: TSelection): {\n\t\tas: (qb: SQL | ((qb: QueryBuilder) => SQL)) => WithSubqueryWithSelection<TSelection, TAlias>;\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/table.ts",
    "content": "import type { BuildColumns, BuildExtraConfigColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport { getPgColumnBuilders, type PgColumnsBuilders } from './columns/all.ts';\nimport type { ExtraConfigColumn, PgColumn, PgColumnBuilder, PgColumnBuilderBase } from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { AnyIndexBuilder } from './indexes.ts';\nimport type { PgPolicy } from './policies.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type PgTableExtraConfigValue =\n\t| AnyIndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder\n\t| PgPolicy;\n\nexport type PgTableExtraConfig = Record<\n\tstring,\n\tPgTableExtraConfigValue\n>;\n\nexport type TableConfig = TableConfigBase<PgColumn>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:PgInlineForeignKeys');\n/** @internal */\nexport const EnableRLS = Symbol.for('drizzle:EnableRLS');\n\nexport class PgTable<T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic override readonly [entityKind]: string = 'PgTable';\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t\tEnableRLS: EnableRLS as typeof EnableRLS,\n\t});\n\n\t/**@internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\t[EnableRLS]: boolean = false;\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]: ((self: Record<string, PgColumn>) => PgTableExtraConfig) | undefined =\n\t\tundefined;\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigColumns]: Record<string, ExtraConfigColumn> = {};\n}\n\nexport type AnyPgTable<TPartial extends Partial<TableConfig> = {}> = PgTable<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport type PgTableWithColumns<T extends TableConfig> =\n\t& PgTable<T>\n\t& {\n\t\t[Key in keyof T['columns']]: T['columns'][Key];\n\t}\n\t& {\n\t\tenableRLS: () => Omit<\n\t\t\tPgTableWithColumns<T>,\n\t\t\t'enableRLS'\n\t\t>;\n\t};\n\n/** @internal */\nexport function pgTableWithSchema<\n\tTTableName extends string,\n\tTSchemaName extends string | undefined,\n\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap | ((columnTypes: PgColumnsBuilders) => TColumnsMap),\n\textraConfig:\n\t\t| ((self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfig | PgTableExtraConfigValue[])\n\t\t| undefined,\n\tschema: TSchemaName,\n\tbaseName = name,\n): PgTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchemaName;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\tdialect: 'pg';\n}> {\n\tconst rawTable = new PgTable<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>(name, schema, baseName);\n\n\tconst parsedColumns: TColumnsMap = typeof columns === 'function' ? columns(getPgColumnBuilders()) : columns;\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\n\tconst builtColumnsForExtraConfig = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.buildExtraConfigColumn(rawTable);\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumnsForExtraConfig;\n\n\tif (extraConfig) {\n\t\ttable[PgTable.Symbol.ExtraConfigBuilder] = extraConfig as any;\n\t}\n\n\treturn Object.assign(table, {\n\t\tenableRLS: () => {\n\t\t\ttable[PgTable.Symbol.EnableRLS] = true;\n\t\t\treturn table as PgTableWithColumns<{\n\t\t\t\tname: TTableName;\n\t\t\t\tschema: TSchemaName;\n\t\t\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\t\t\tdialect: 'pg';\n\t\t\t}>;\n\t\t},\n\t});\n}\n\nexport interface PgTableFn<TSchema extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>,\n\t\t) => PgTableExtraConfigValue[],\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: PgColumnsBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfigValue[],\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n\t/**\n\t * @deprecated The third parameter of pgTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig: (\n\t\t\tself: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>,\n\t\t) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n\n\t/**\n\t * @deprecated The third parameter of pgTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: PgColumnsBuilders) => TColumnsMap,\n\t\textraConfig: (self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n}\n\nexport const pgTable: PgTableFn = (name, columns, extraConfig) => {\n\treturn pgTableWithSchema(name, columns, extraConfig, undefined);\n};\n\nexport function pgTableCreator(customizeTableName: (name: string) => string): PgTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn pgTableWithSchema(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/unique-constraint.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { PgColumn } from './columns/index.ts';\nimport type { PgTable } from './table.ts';\n\nexport function unique(name?: string): UniqueOnConstraintBuilder {\n\treturn new UniqueOnConstraintBuilder(name);\n}\n\nexport function uniqueKeyName(table: PgTable, columns: string[]) {\n\treturn `${table[TableName]}_${columns.join('_')}_unique`;\n}\n\nexport class UniqueConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'PgUniqueConstraintBuilder';\n\n\t/** @internal */\n\tcolumns: PgColumn[];\n\t/** @internal */\n\tnullsNotDistinctConfig = false;\n\n\tconstructor(\n\t\tcolumns: PgColumn[],\n\t\tprivate name?: string,\n\t) {\n\t\tthis.columns = columns;\n\t}\n\n\tnullsNotDistinct() {\n\t\tthis.nullsNotDistinctConfig = true;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): UniqueConstraint {\n\t\treturn new UniqueConstraint(table, this.columns, this.nullsNotDistinctConfig, this.name);\n\t}\n}\n\nexport class UniqueOnConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'PgUniqueOnConstraintBuilder';\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tname?: string,\n\t) {\n\t\tthis.name = name;\n\t}\n\n\ton(...columns: [PgColumn, ...PgColumn[]]) {\n\t\treturn new UniqueConstraintBuilder(columns, this.name);\n\t}\n}\n\nexport class UniqueConstraint {\n\tstatic readonly [entityKind]: string = 'PgUniqueConstraint';\n\n\treadonly columns: PgColumn[];\n\treadonly name?: string;\n\treadonly nullsNotDistinct: boolean = false;\n\n\tconstructor(readonly table: PgTable, columns: PgColumn[], nullsNotDistinct: boolean, name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n\t\tthis.nullsNotDistinct = nullsNotDistinct;\n\t}\n\n\tgetName() {\n\t\treturn this.name;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/utils/array.ts",
    "content": "function parsePgArrayValue(arrayString: string, startFrom: number, inQuotes: boolean): [string, number] {\n\tfor (let i = startFrom; i < arrayString.length; i++) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === '\\\\') {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i + 1];\n\t\t}\n\n\t\tif (inQuotes) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === ',' || char === '}') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i];\n\t\t}\n\t}\n\n\treturn [arrayString.slice(startFrom).replace(/\\\\/g, ''), arrayString.length];\n}\n\nexport function parsePgNestedArray(arrayString: string, startFrom = 0): [any[], number] {\n\tconst result: any[] = [];\n\tlet i = startFrom;\n\tlet lastCharIsComma = false;\n\n\twhile (i < arrayString.length) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === ',') {\n\t\t\tif (lastCharIsComma || i === startFrom) {\n\t\t\t\tresult.push('');\n\t\t\t}\n\t\t\tlastCharIsComma = true;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlastCharIsComma = false;\n\n\t\tif (char === '\\\\') {\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\tconst [value, startFrom] = parsePgArrayValue(arrayString, i + 1, true);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '}') {\n\t\t\treturn [result, i + 1];\n\t\t}\n\n\t\tif (char === '{') {\n\t\t\tconst [value, startFrom] = parsePgNestedArray(arrayString, i + 1);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [value, newStartFrom] = parsePgArrayValue(arrayString, i, false);\n\t\tresult.push(value);\n\t\ti = newStartFrom;\n\t}\n\n\treturn [result, i];\n}\n\nexport function parsePgArray(arrayString: string): any[] {\n\tconst [result] = parsePgNestedArray(arrayString, 1);\n\treturn result;\n}\n\nexport function makePgArray(array: any[]): string {\n\treturn `{${\n\t\tarray.map((item) => {\n\t\t\tif (Array.isArray(item)) {\n\t\t\t\treturn makePgArray(item);\n\t\t\t}\n\n\t\t\tif (typeof item === 'string') {\n\t\t\t\treturn `\"${item.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n\t\t\t}\n\n\t\t\treturn `${item}`;\n\t\t}).join(',')\n\t}}`;\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/utils/index.ts",
    "content": "export * from './array.ts';\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/utils.ts",
    "content": "import { is } from '~/entity.ts';\nimport { PgTable } from '~/pg-core/table.ts';\nimport { SQL } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Schema, Table } from '~/table.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { type Check, CheckBuilder } from './checks.ts';\nimport type { AnyPgColumn } from './columns/index.ts';\nimport { type ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { Index } from './indexes.ts';\nimport { IndexBuilder } from './indexes.ts';\nimport { PgPolicy } from './policies.ts';\nimport { type PrimaryKey, PrimaryKeyBuilder } from './primary-keys.ts';\nimport { type UniqueConstraint, UniqueConstraintBuilder } from './unique-constraint.ts';\nimport type { PgViewBase } from './view-base.ts';\nimport { PgViewConfig } from './view-common.ts';\nimport { type PgMaterializedView, PgMaterializedViewConfig, type PgView } from './view.ts';\n\nexport function getTableConfig<TTable extends PgTable>(table: TTable) {\n\tconst columns = Object.values(table[Table.Symbol.Columns]);\n\tconst indexes: Index[] = [];\n\tconst checks: Check[] = [];\n\tconst primaryKeys: PrimaryKey[] = [];\n\tconst foreignKeys: ForeignKey[] = Object.values(table[PgTable.Symbol.InlineForeignKeys]);\n\tconst uniqueConstraints: UniqueConstraint[] = [];\n\tconst name = table[Table.Symbol.Name];\n\tconst schema = table[Table.Symbol.Schema];\n\tconst policies: PgPolicy[] = [];\n\tconst enableRLS: boolean = table[PgTable.Symbol.EnableRLS];\n\n\tconst extraConfigBuilder = table[PgTable.Symbol.ExtraConfigBuilder];\n\n\tif (extraConfigBuilder !== undefined) {\n\t\tconst extraConfig = extraConfigBuilder(table[Table.Symbol.ExtraConfigColumns]);\n\t\tconst extraValues = Array.isArray(extraConfig) ? extraConfig.flat(1) as any[] : Object.values(extraConfig);\n\t\tfor (const builder of extraValues) {\n\t\t\tif (is(builder, IndexBuilder)) {\n\t\t\t\tindexes.push(builder.build(table));\n\t\t\t} else if (is(builder, CheckBuilder)) {\n\t\t\t\tchecks.push(builder.build(table));\n\t\t\t} else if (is(builder, UniqueConstraintBuilder)) {\n\t\t\t\tuniqueConstraints.push(builder.build(table));\n\t\t\t} else if (is(builder, PrimaryKeyBuilder)) {\n\t\t\t\tprimaryKeys.push(builder.build(table));\n\t\t\t} else if (is(builder, ForeignKeyBuilder)) {\n\t\t\t\tforeignKeys.push(builder.build(table));\n\t\t\t} else if (is(builder, PgPolicy)) {\n\t\t\t\tpolicies.push(builder);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tcolumns,\n\t\tindexes,\n\t\tforeignKeys,\n\t\tchecks,\n\t\tprimaryKeys,\n\t\tuniqueConstraints,\n\t\tname,\n\t\tschema,\n\t\tpolicies,\n\t\tenableRLS,\n\t};\n}\n\nexport function extractUsedTable(table: PgTable | Subquery | PgViewBase | SQL): string[] {\n\tif (is(table, PgTable)) {\n\t\treturn [table[Schema] ? `${table[Schema]}.${table[Table.Symbol.BaseName]}` : table[Table.Symbol.BaseName]];\n\t}\n\tif (is(table, Subquery)) {\n\t\treturn table._.usedTables ?? [];\n\t}\n\tif (is(table, SQL)) {\n\t\treturn table.usedTables ?? [];\n\t}\n\treturn [];\n}\n\nexport function getViewConfig<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n>(view: PgView<TName, TExisting>) {\n\treturn {\n\t\t...view[ViewBaseConfig],\n\t\t...view[PgViewConfig],\n\t};\n}\n\nexport function getMaterializedViewConfig<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n>(view: PgMaterializedView<TName, TExisting>) {\n\treturn {\n\t\t...view[ViewBaseConfig],\n\t\t...view[PgMaterializedViewConfig],\n\t};\n}\n\nexport type ColumnsWithTable<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n> = { [Key in keyof TColumns]: AnyPgColumn<{ tableName: TForeignTableName }> };\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/view-base.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { type ColumnsSelection, View } from '~/sql/sql.ts';\n\nexport abstract class PgViewBase<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> extends View<TName, TExisting, TSelectedFields> {\n\tstatic override readonly [entityKind]: string = 'PgViewBase';\n\n\tdeclare readonly _: View<TName, TExisting, TSelectedFields>['_'] & {\n\t\treadonly viewBrand: 'PgViewBase';\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/view-common.ts",
    "content": "export const PgViewConfig = Symbol.for('drizzle:PgViewConfig');\n"
  },
  {
    "path": "drizzle-orm/src/pg-core/view.ts",
    "content": "import type { BuildColumns } from '~/column-builder.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { AddAliasToSelection } from '~/query-builders/select.types.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport { getTableColumns } from '~/utils.ts';\nimport type { RequireAtLeastOne } from '~/utils.ts';\nimport type { PgColumn, PgColumnBuilderBase } from './columns/common.ts';\nimport { QueryBuilder } from './query-builders/query-builder.ts';\nimport { pgTable } from './table.ts';\nimport { PgViewBase } from './view-base.ts';\nimport { PgViewConfig } from './view-common.ts';\n\nexport type ViewWithConfig = RequireAtLeastOne<{\n\tcheckOption: 'local' | 'cascaded';\n\tsecurityBarrier: boolean;\n\tsecurityInvoker: boolean;\n}>;\n\nexport class DefaultViewBuilderCore<TConfig extends { name: string; columns?: unknown }> {\n\tstatic readonly [entityKind]: string = 'PgDefaultViewBuilderCore';\n\n\tdeclare readonly _: {\n\t\treadonly name: TConfig['name'];\n\t\treadonly columns: TConfig['columns'];\n\t};\n\n\tconstructor(\n\t\tprotected name: TConfig['name'],\n\t\tprotected schema: string | undefined,\n\t) {}\n\n\tprotected config: {\n\t\twith?: ViewWithConfig;\n\t} = {};\n\n\twith(config: ViewWithConfig): this {\n\t\tthis.config.with = config;\n\t\treturn this;\n\t}\n}\n\nexport class ViewBuilder<TName extends string = string> extends DefaultViewBuilderCore<{ name: TName }> {\n\tstatic override readonly [entityKind]: string = 'PgViewBuilder';\n\n\tas<TSelectedFields extends ColumnsSelection>(\n\t\tqb: TypedQueryBuilder<TSelectedFields> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelectedFields>),\n\t): PgViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'pg'>> {\n\t\tif (typeof qb === 'function') {\n\t\t\tqb = qb(new QueryBuilder());\n\t\t}\n\t\tconst selectionProxy = new SelectionProxyHandler<TSelectedFields>({\n\t\t\talias: this.name,\n\t\t\tsqlBehavior: 'error',\n\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\treplaceOriginalName: true,\n\t\t});\n\t\tconst aliasedSelection = new Proxy(qb.getSelectedFields(), selectionProxy);\n\t\treturn new Proxy(\n\t\t\tnew PgView({\n\t\t\t\tpgConfig: this.config,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: aliasedSelection,\n\t\t\t\t\tquery: qb.getSQL().inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tselectionProxy as any,\n\t\t) as PgViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'pg'>>;\n\t}\n}\n\nexport class ManualViewBuilder<\n\tTName extends string = string,\n\tTColumns extends Record<string, PgColumnBuilderBase> = Record<string, PgColumnBuilderBase>,\n> extends DefaultViewBuilderCore<{ name: TName; columns: TColumns }> {\n\tstatic override readonly [entityKind]: string = 'PgManualViewBuilder';\n\n\tprivate columns: Record<string, PgColumn>;\n\n\tconstructor(\n\t\tname: TName,\n\t\tcolumns: TColumns,\n\t\tschema: string | undefined,\n\t) {\n\t\tsuper(name, schema);\n\t\tthis.columns = getTableColumns(pgTable(name, columns));\n\t}\n\n\texisting(): PgViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'pg'>> {\n\t\treturn new Proxy(\n\t\t\tnew PgView({\n\t\t\t\tpgConfig: undefined,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: undefined,\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as PgViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'pg'>>;\n\t}\n\n\tas(query: SQL): PgViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'pg'>> {\n\t\treturn new Proxy(\n\t\t\tnew PgView({\n\t\t\t\tpgConfig: this.config,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: query.inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as PgViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'pg'>>;\n\t}\n}\n\nexport type PgMaterializedViewWithConfig = RequireAtLeastOne<{\n\tfillfactor: number;\n\ttoastTupleTarget: number;\n\tparallelWorkers: number;\n\tautovacuumEnabled: boolean;\n\tvacuumIndexCleanup: 'auto' | 'off' | 'on';\n\tvacuumTruncate: boolean;\n\tautovacuumVacuumThreshold: number;\n\tautovacuumVacuumScaleFactor: number;\n\tautovacuumVacuumCostDelay: number;\n\tautovacuumVacuumCostLimit: number;\n\tautovacuumFreezeMinAge: number;\n\tautovacuumFreezeMaxAge: number;\n\tautovacuumFreezeTableAge: number;\n\tautovacuumMultixactFreezeMinAge: number;\n\tautovacuumMultixactFreezeMaxAge: number;\n\tautovacuumMultixactFreezeTableAge: number;\n\tlogAutovacuumMinDuration: number;\n\tuserCatalogTable: boolean;\n}>;\n\nexport class MaterializedViewBuilderCore<TConfig extends { name: string; columns?: unknown }> {\n\tstatic readonly [entityKind]: string = 'PgMaterializedViewBuilderCore';\n\n\tdeclare _: {\n\t\treadonly name: TConfig['name'];\n\t\treadonly columns: TConfig['columns'];\n\t};\n\n\tconstructor(\n\t\tprotected name: TConfig['name'],\n\t\tprotected schema: string | undefined,\n\t) {}\n\n\tprotected config: {\n\t\twith?: PgMaterializedViewWithConfig;\n\t\tusing?: string;\n\t\ttablespace?: string;\n\t\twithNoData?: boolean;\n\t} = {};\n\n\tusing(using: string): this {\n\t\tthis.config.using = using;\n\t\treturn this;\n\t}\n\n\twith(config: PgMaterializedViewWithConfig): this {\n\t\tthis.config.with = config;\n\t\treturn this;\n\t}\n\n\ttablespace(tablespace: string): this {\n\t\tthis.config.tablespace = tablespace;\n\t\treturn this;\n\t}\n\n\twithNoData(): this {\n\t\tthis.config.withNoData = true;\n\t\treturn this;\n\t}\n}\n\nexport class MaterializedViewBuilder<TName extends string = string>\n\textends MaterializedViewBuilderCore<{ name: TName }>\n{\n\tstatic override readonly [entityKind]: string = 'PgMaterializedViewBuilder';\n\n\tas<TSelectedFields extends ColumnsSelection>(\n\t\tqb: TypedQueryBuilder<TSelectedFields> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelectedFields>),\n\t): PgMaterializedViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'pg'>> {\n\t\tif (typeof qb === 'function') {\n\t\t\tqb = qb(new QueryBuilder());\n\t\t}\n\t\tconst selectionProxy = new SelectionProxyHandler<TSelectedFields>({\n\t\t\talias: this.name,\n\t\t\tsqlBehavior: 'error',\n\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\treplaceOriginalName: true,\n\t\t});\n\t\tconst aliasedSelection = new Proxy(qb.getSelectedFields(), selectionProxy);\n\t\treturn new Proxy(\n\t\t\tnew PgMaterializedView({\n\t\t\t\tpgConfig: {\n\t\t\t\t\twith: this.config.with,\n\t\t\t\t\tusing: this.config.using,\n\t\t\t\t\ttablespace: this.config.tablespace,\n\t\t\t\t\twithNoData: this.config.withNoData,\n\t\t\t\t},\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: aliasedSelection,\n\t\t\t\t\tquery: qb.getSQL().inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tselectionProxy as any,\n\t\t) as PgMaterializedViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'pg'>>;\n\t}\n}\n\nexport class ManualMaterializedViewBuilder<\n\tTName extends string = string,\n\tTColumns extends Record<string, PgColumnBuilderBase> = Record<string, PgColumnBuilderBase>,\n> extends MaterializedViewBuilderCore<{ name: TName; columns: TColumns }> {\n\tstatic override readonly [entityKind]: string = 'PgManualMaterializedViewBuilder';\n\n\tprivate columns: Record<string, PgColumn>;\n\n\tconstructor(\n\t\tname: TName,\n\t\tcolumns: TColumns,\n\t\tschema: string | undefined,\n\t) {\n\t\tsuper(name, schema);\n\t\tthis.columns = getTableColumns(pgTable(name, columns));\n\t}\n\n\texisting(): PgMaterializedViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'pg'>> {\n\t\treturn new Proxy(\n\t\t\tnew PgMaterializedView({\n\t\t\t\tpgConfig: {\n\t\t\t\t\ttablespace: this.config.tablespace,\n\t\t\t\t\tusing: this.config.using,\n\t\t\t\t\twith: this.config.with,\n\t\t\t\t\twithNoData: this.config.withNoData,\n\t\t\t\t},\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: undefined,\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as PgMaterializedViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'pg'>>;\n\t}\n\n\tas(query: SQL): PgMaterializedViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'pg'>> {\n\t\treturn new Proxy(\n\t\t\tnew PgMaterializedView({\n\t\t\t\tpgConfig: {\n\t\t\t\t\ttablespace: this.config.tablespace,\n\t\t\t\t\tusing: this.config.using,\n\t\t\t\t\twith: this.config.with,\n\t\t\t\t\twithNoData: this.config.withNoData,\n\t\t\t\t},\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: query.inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as PgMaterializedViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'pg'>>;\n\t}\n}\n\nexport class PgView<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> extends PgViewBase<TName, TExisting, TSelectedFields> {\n\tstatic override readonly [entityKind]: string = 'PgView';\n\n\t[PgViewConfig]: {\n\t\twith?: ViewWithConfig;\n\t} | undefined;\n\n\tconstructor({ pgConfig, config }: {\n\t\tpgConfig: {\n\t\t\twith?: ViewWithConfig;\n\t\t} | undefined;\n\t\tconfig: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t};\n\t}) {\n\t\tsuper(config);\n\t\tif (pgConfig) {\n\t\t\tthis[PgViewConfig] = {\n\t\t\t\twith: pgConfig.with,\n\t\t\t};\n\t\t}\n\t}\n}\n\nexport type PgViewWithSelection<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> = PgView<TName, TExisting, TSelectedFields> & TSelectedFields;\n\nexport const PgMaterializedViewConfig = Symbol.for('drizzle:PgMaterializedViewConfig');\n\nexport class PgMaterializedView<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> extends PgViewBase<TName, TExisting, TSelectedFields> {\n\tstatic override readonly [entityKind]: string = 'PgMaterializedView';\n\n\treadonly [PgMaterializedViewConfig]: {\n\t\treadonly with?: PgMaterializedViewWithConfig;\n\t\treadonly using?: string;\n\t\treadonly tablespace?: string;\n\t\treadonly withNoData?: boolean;\n\t} | undefined;\n\n\tconstructor({ pgConfig, config }: {\n\t\tpgConfig: {\n\t\t\twith: PgMaterializedViewWithConfig | undefined;\n\t\t\tusing: string | undefined;\n\t\t\ttablespace: string | undefined;\n\t\t\twithNoData: boolean | undefined;\n\t\t} | undefined;\n\t\tconfig: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t};\n\t}) {\n\t\tsuper(config);\n\t\tthis[PgMaterializedViewConfig] = {\n\t\t\twith: pgConfig?.with,\n\t\t\tusing: pgConfig?.using,\n\t\t\ttablespace: pgConfig?.tablespace,\n\t\t\twithNoData: pgConfig?.withNoData,\n\t\t};\n\t}\n}\n\nexport type PgMaterializedViewWithSelection<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> = PgMaterializedView<TName, TExisting, TSelectedFields> & TSelectedFields;\n\n/** @internal */\nexport function pgViewWithSchema(\n\tname: string,\n\tselection: Record<string, PgColumnBuilderBase> | undefined,\n\tschema: string | undefined,\n): ViewBuilder | ManualViewBuilder {\n\tif (selection) {\n\t\treturn new ManualViewBuilder(name, selection, schema);\n\t}\n\treturn new ViewBuilder(name, schema);\n}\n\n/** @internal */\nexport function pgMaterializedViewWithSchema(\n\tname: string,\n\tselection: Record<string, PgColumnBuilderBase> | undefined,\n\tschema: string | undefined,\n): MaterializedViewBuilder | ManualMaterializedViewBuilder {\n\tif (selection) {\n\t\treturn new ManualMaterializedViewBuilder(name, selection, schema);\n\t}\n\treturn new MaterializedViewBuilder(name, schema);\n}\n\nexport function pgView<TName extends string>(name: TName): ViewBuilder<TName>;\nexport function pgView<TName extends string, TColumns extends Record<string, PgColumnBuilderBase>>(\n\tname: TName,\n\tcolumns: TColumns,\n): ManualViewBuilder<TName, TColumns>;\nexport function pgView(name: string, columns?: Record<string, PgColumnBuilderBase>): ViewBuilder | ManualViewBuilder {\n\treturn pgViewWithSchema(name, columns, undefined);\n}\n\nexport function pgMaterializedView<TName extends string>(name: TName): MaterializedViewBuilder<TName>;\nexport function pgMaterializedView<TName extends string, TColumns extends Record<string, PgColumnBuilderBase>>(\n\tname: TName,\n\tcolumns: TColumns,\n): ManualMaterializedViewBuilder<TName, TColumns>;\nexport function pgMaterializedView(\n\tname: string,\n\tcolumns?: Record<string, PgColumnBuilderBase>,\n): MaterializedViewBuilder | ManualMaterializedViewBuilder {\n\treturn pgMaterializedViewWithSchema(name, columns, undefined);\n}\n\nexport function isPgView(obj: unknown): obj is PgView {\n\treturn is(obj, PgView);\n}\n\nexport function isPgMaterializedView(obj: unknown): obj is PgMaterializedView {\n\treturn is(obj, PgMaterializedView);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-proxy/driver.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport { type PgRemoteQueryResultHKT, PgRemoteSession } from './session.ts';\n\nexport class PgRemoteDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<PgRemoteQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PgRemoteDatabase';\n}\n\nexport type RemoteCallback = (\n\tsql: string,\n\tparams: any[],\n\tmethod: 'all' | 'execute',\n\ttypings?: any[],\n) => Promise<{ rows: any[] }>;\n\nexport function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tcallback: RemoteCallback,\n\tconfig: DrizzleConfig<TSchema> = {},\n\t_dialect: () => PgDialect = () => new PgDialect({ casing: config.casing }),\n): PgRemoteDatabase<TSchema> {\n\tconst dialect = _dialect();\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new PgRemoteSession(callback, dialect, schema, { logger, cache: config.cache });\n\tconst db = new PgRemoteDatabase(dialect, session, schema as any) as PgRemoteDatabase<TSchema>;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db;\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-proxy/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/pg-proxy/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { PgRemoteDatabase } from './driver.ts';\n\nexport type ProxyMigrator = (migrationQueries: string[]) => Promise<void>;\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: PgRemoteDatabase<TSchema>,\n\tcallback: ProxyMigrator,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\n\tconst migrationTableCreate = sql`\n\t\tCREATE TABLE IF NOT EXISTS \"drizzle\".\"__drizzle_migrations\" (\n\t\t\tid SERIAL PRIMARY KEY,\n\t\t\thash text NOT NULL,\n\t\t\tcreated_at numeric\n\t\t)\n\t`;\n\n\tawait db.execute(sql`CREATE SCHEMA IF NOT EXISTS \"drizzle\"`);\n\tawait db.execute(migrationTableCreate);\n\n\tconst dbMigrations = await db.execute<{\n\t\tid: number;\n\t\thash: string;\n\t\tcreated_at: string;\n\t}>(\n\t\tsql`SELECT id, hash, created_at FROM \"drizzle\".\"__drizzle_migrations\" ORDER BY created_at DESC LIMIT 1`,\n\t);\n\n\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\n\tconst queriesToRun: string[] = [];\n\n\tfor (const migration of migrations) {\n\t\tif (\n\t\t\t!lastDbMigration\n\t\t\t|| Number(lastDbMigration.created_at)! < migration.folderMillis\n\t\t) {\n\t\t\tqueriesToRun.push(\n\t\t\t\t...migration.sql,\n\t\t\t\t`INSERT INTO \"drizzle\".\"__drizzle_migrations\" (\"hash\", \"created_at\") VALUES('${migration.hash}', '${migration.folderMillis}')`,\n\t\t\t);\n\t\t}\n\t}\n\n\tawait callback(queriesToRun);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pg-proxy/session.ts",
    "content": "import { type Cache, NoopCache } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgTransaction } from '~/pg-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport { PgPreparedQuery as PreparedQueryBase, PgSession } from '~/pg-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport type { QueryWithTypings } from '~/sql/sql.ts';\nimport { fillPlaceholders } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\nimport type { RemoteCallback } from './driver.ts';\n\nexport interface PgRemoteSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class PgRemoteSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgSession<PgRemoteQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PgRemoteSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: RemoteCallback,\n\t\tdialect: PgDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: PgRemoteSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig>(\n\t\tquery: QueryWithTypings,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PreparedQuery<T> {\n\t\treturn new PreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tquery.typings,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride async transaction<T>(\n\t\t_transaction: (tx: PgProxyTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\t_config?: PgTransactionConfig,\n\t): Promise<T> {\n\t\tthrow new Error('Transactions are not supported by the Postgres Proxy driver');\n\t}\n}\n\nexport class PgProxyTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgTransaction<PgRemoteQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PgProxyTransaction';\n\n\toverride async transaction<T>(\n\t\t_transaction: (tx: PgProxyTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tthrow new Error('Transactions are not supported by the Postgres Proxy driver');\n\t}\n}\n\nexport class PreparedQuery<T extends PreparedQueryConfig> extends PreparedQueryBase<T> {\n\tstatic override readonly [entityKind]: string = 'PgProxyPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: RemoteCallback,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate typings: any[] | undefined,\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\treturn tracer.startActiveSpan('drizzle.execute', async (span) => {\n\t\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\t\t\tconst { fields, client, queryString, joinsNotNullableMap, customResultMapper, logger, typings } = this;\n\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': queryString,\n\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t});\n\n\t\t\tlogger.logQuery(queryString, params);\n\n\t\t\tif (!fields && !customResultMapper) {\n\t\t\t\treturn tracer.startActiveSpan('drizzle.driver.execute', async () => {\n\t\t\t\t\tconst { rows } = await this.queryWithCache(queryString, params, async () => {\n\t\t\t\t\t\treturn await client(queryString, params as any[], 'execute', typings);\n\t\t\t\t\t});\n\n\t\t\t\t\treturn rows;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst rows = await tracer.startActiveSpan('drizzle.driver.execute', async () => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': queryString,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\n\t\t\t\tconst { rows } = await this.queryWithCache(queryString, params, async () => {\n\t\t\t\t\treturn await client(queryString, params as any[], 'all', typings);\n\t\t\t\t});\n\n\t\t\t\treturn rows;\n\t\t\t});\n\n\t\t\treturn tracer.startActiveSpan('drizzle.mapResponse', () => {\n\t\t\t\treturn customResultMapper\n\t\t\t\t\t? customResultMapper(rows)\n\t\t\t\t\t: rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t\t\t});\n\t\t});\n\t}\n\n\tasync all() {\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport interface PgRemoteQueryResultHKT extends PgQueryResultHKT {\n\ttype: Assume<this['row'], {\n\t\t[column: string]: any;\n\t}>[];\n}\n"
  },
  {
    "path": "drizzle-orm/src/pglite/driver.ts",
    "content": "import { PGlite, type PGliteOptions } from '@electric-sql/pglite';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport type { PgliteClient, PgliteQueryResultHKT } from './session.ts';\nimport { PgliteSession } from './session.ts';\n\nexport interface PgDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class PgliteDriver {\n\tstatic readonly [entityKind]: string = 'PgliteDriver';\n\n\tconstructor(\n\t\tprivate client: PgliteClient,\n\t\tprivate dialect: PgDialect,\n\t\tprivate options: PgDriverOptions = {},\n\t) {\n\t}\n\n\tcreateSession(\n\t\tschema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,\n\t): PgliteSession<Record<string, unknown>, TablesRelationalConfig> {\n\t\treturn new PgliteSession(this.client, this.dialect, schema, {\n\t\t\tlogger: this.options.logger,\n\t\t\tcache: this.options.cache,\n\t\t});\n\t}\n}\n\nexport class PgliteDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<PgliteQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PgliteDatabase';\n}\n\nfunction construct<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: PgliteClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): PgliteDatabase<TSchema> & {\n\t$client: PgliteClient;\n} {\n\tconst dialect = new PgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst driver = new PgliteDriver(client, dialect, { logger, cache: config.cache });\n\tconst session = driver.createSession(schema);\n\tconst db = new PgliteDatabase(dialect, session, schema as any) as PgliteDatabase<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\t// (<any> db).$cache = { invalidate: (<any> config).cache?.onMutate };\n\t// if (config.cache) {\n\t// \tfor (\n\t// \t\tconst key of Object.getOwnPropertyNames(Object.getPrototypeOf(config.cache)).filter((key) =>\n\t// \t\t\tkey !== 'constructor'\n\t// \t\t)\n\t// \t) {\n\t// \t\t(<any> db).$cache[key as keyof typeof config.cache] = (<any> config).cache[key];\n\t// \t}\n\t// }\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends PGlite = PGlite,\n>(\n\t...params:\n\t\t| []\n\t\t| [\n\t\t\tTClient | string,\n\t\t]\n\t\t| [\n\t\t\tTClient | string,\n\t\t\tDrizzleConfig<TSchema>,\n\t\t]\n\t\t| [\n\t\t\t(\n\t\t\t\t& DrizzleConfig<TSchema>\n\t\t\t\t& ({\n\t\t\t\t\tconnection?: (PGliteOptions & { dataDir?: string }) | string;\n\t\t\t\t} | {\n\t\t\t\t\tclient: TClient;\n\t\t\t\t})\n\t\t\t),\n\t\t]\n): PgliteDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (params[0] === undefined || typeof params[0] === 'string') {\n\t\tconst instance = new PGlite(params[0]);\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as {\n\t\t\tconnection?: PGliteOptions & { dataDir: string };\n\t\t\tclient?: TClient;\n\t\t} & DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tif (typeof connection === 'object') {\n\t\t\tconst { dataDir, ...options } = connection;\n\n\t\t\tconst instance = new PGlite(dataDir, options);\n\n\t\t\treturn construct(instance, drizzleConfig) as any;\n\t\t}\n\n\t\tconst instance = new PGlite(connection);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): PgliteDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/pglite/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/pglite/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { PgliteDatabase } from './driver.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: PgliteDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tawait db.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/pglite/session.ts",
    "content": "import type { PGlite, QueryOptions, Results, Row, Transaction } from '@electric-sql/pglite';\nimport { entityKind } from '~/entity.ts';\nimport { type Logger, NoopLogger } from '~/logger.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgTransaction } from '~/pg-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport { PgPreparedQuery, PgSession } from '~/pg-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nimport { types } from '@electric-sql/pglite';\nimport { type Cache, NoopCache } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\n\nexport type PgliteClient = PGlite;\n\nexport class PglitePreparedQuery<T extends PreparedQueryConfig> extends PgPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'PglitePreparedQuery';\n\n\tprivate rawQueryConfig: QueryOptions;\n\tprivate queryConfig: QueryOptions;\n\n\tconstructor(\n\t\tprivate client: PgliteClient | Transaction,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t\tthis.rawQueryConfig = {\n\t\t\trowMode: 'object',\n\t\t\tparsers: {\n\t\t\t\t[types.TIMESTAMP]: (value) => value,\n\t\t\t\t[types.TIMESTAMPTZ]: (value) => value,\n\t\t\t\t[types.INTERVAL]: (value) => value,\n\t\t\t\t[types.DATE]: (value) => value,\n\t\t\t\t// numeric[]\n\t\t\t\t[1231]: (value) => value,\n\t\t\t\t// timestamp[]\n\t\t\t\t[1115]: (value) => value,\n\t\t\t\t// timestamp with timezone[]\n\t\t\t\t[1185]: (value) => value,\n\t\t\t\t// interval[]\n\t\t\t\t[1187]: (value) => value,\n\t\t\t\t// date[]\n\t\t\t\t[1182]: (value) => value,\n\t\t\t},\n\t\t};\n\t\tthis.queryConfig = {\n\t\t\trowMode: 'array',\n\t\t\tparsers: {\n\t\t\t\t[types.TIMESTAMP]: (value) => value,\n\t\t\t\t[types.TIMESTAMPTZ]: (value) => value,\n\t\t\t\t[types.INTERVAL]: (value) => value,\n\t\t\t\t[types.DATE]: (value) => value,\n\t\t\t\t// numeric[]\n\t\t\t\t[1231]: (value) => value,\n\t\t\t\t// timestamp[]\n\t\t\t\t[1115]: (value) => value,\n\t\t\t\t// timestamp with timezone[]\n\t\t\t\t[1185]: (value) => value,\n\t\t\t\t// interval[]\n\t\t\t\t[1187]: (value) => value,\n\t\t\t\t// date[]\n\t\t\t\t[1182]: (value) => value,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\tthis.logger.logQuery(this.queryString, params);\n\n\t\tconst { fields, client, queryConfig, joinsNotNullableMap, customResultMapper, queryString, rawQueryConfig } = this;\n\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn this.queryWithCache(queryString, params, async () => {\n\t\t\t\treturn await client.query<any[]>(queryString, params, rawQueryConfig);\n\t\t\t});\n\t\t}\n\n\t\tconst result = await this.queryWithCache(queryString, params, async () => {\n\t\t\treturn await client.query<any[]>(queryString, params, queryConfig);\n\t\t});\n\n\t\treturn customResultMapper\n\t\t\t? customResultMapper(result.rows)\n\t\t\t: result.rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t}\n\n\tall(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['all']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\t\tthis.logger.logQuery(this.queryString, params);\n\t\treturn this.queryWithCache(this.queryString, params, async () => {\n\t\t\treturn await this.client.query<any[]>(this.queryString, params, this.rawQueryConfig);\n\t\t}).then((result) => result.rows);\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport interface PgliteSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class PgliteSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgSession<PgliteQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PgliteSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: PgliteClient | Transaction,\n\t\tdialect: PgDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: PgliteSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgPreparedQuery<T> {\n\t\treturn new PglitePreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tname,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: PgliteTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig | undefined,\n\t): Promise<T> {\n\t\treturn (this.client as PgliteClient).transaction(async (client) => {\n\t\t\tconst session = new PgliteSession<TFullSchema, TSchema>(\n\t\t\t\tclient,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.options,\n\t\t\t);\n\t\t\tconst tx = new PgliteTransaction<TFullSchema, TSchema>(this.dialect, session, this.schema);\n\t\t\tif (config) {\n\t\t\t\tawait tx.setTransaction(config);\n\t\t\t}\n\t\t\treturn transaction(tx);\n\t\t}) as Promise<T>;\n\t}\n\n\toverride async count(sql: SQL): Promise<number> {\n\t\tconst res = await this.execute<{ rows: [{ count: string }] }>(sql);\n\t\treturn Number(\n\t\t\tres['rows'][0]['count'],\n\t\t);\n\t}\n}\n\nexport class PgliteTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgTransaction<PgliteQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PgliteTransaction';\n\n\toverride async transaction<T>(transaction: (tx: PgliteTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new PgliteTransaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\t\tawait tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport interface PgliteQueryResultHKT extends PgQueryResultHKT {\n\ttype: Results<Assume<this['row'], Row>>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/planetscale-serverless/driver.ts",
    "content": "import type { Config } from '@planetscale/database';\nimport { Client } from '@planetscale/database';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { MySqlDatabase } from '~/mysql-core/db.ts';\nimport { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport type { PlanetScalePreparedQueryHKT, PlanetscaleQueryResultHKT } from './session.ts';\nimport { PlanetscaleSession } from './session.ts';\n\nexport interface PlanetscaleSDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class PlanetScaleDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends MySqlDatabase<PlanetscaleQueryResultHKT, PlanetScalePreparedQueryHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PlanetScaleDatabase';\n}\n\nfunction construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Client = Client,\n>(\n\tclient: TClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): PlanetScaleDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\t// Client is not Drizzle Object, so we can ignore this rule here\n\t// eslint-disable-next-line no-instanceof/no-instanceof\n\tif (!(client instanceof Client)) {\n\t\tthrow new Error(`Warning: You need to pass an instance of Client:\n\nimport { Client } from \"@planetscale/database\";\n\nconst client = new Client({\n  host: process.env[\"DATABASE_HOST\"],\n  username: process.env[\"DATABASE_USERNAME\"],\n  password: process.env[\"DATABASE_PASSWORD\"],\n});\n\nconst db = drizzle(client);\n\t\t`);\n\t}\n\n\tconst dialect = new MySqlDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new PlanetscaleSession(client, dialect, undefined, schema, { logger, cache: config.cache });\n\tconst db = new PlanetScaleDatabase(dialect, session, schema as any, 'planetscale') as PlanetScaleDatabase<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Client = Client,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | Config;\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): PlanetScaleDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = new Client({\n\t\t\turl: params[0],\n\t\t});\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& { connection?: Config | string; client?: TClient }\n\t\t\t& DrizzleConfig;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tconst instance = typeof connection === 'string'\n\t\t\t? new Client({\n\t\t\t\turl: connection,\n\t\t\t})\n\t\t\t: new Client(\n\t\t\t\tconnection!,\n\t\t\t);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): PlanetScaleDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/planetscale-serverless/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/planetscale-serverless/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { PlanetScaleDatabase } from './driver.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: PlanetScaleDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\n\tawait db.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/planetscale-serverless/session.ts",
    "content": "import type { Client, Connection, ExecutedQuery, Transaction } from '@planetscale/database';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { SelectedFieldsOrdered } from '~/mysql-core/query-builders/select.types.ts';\nimport {\n\tMySqlPreparedQuery,\n\ttype MySqlPreparedQueryConfig,\n\ttype MySqlPreparedQueryHKT,\n\ttype MySqlQueryResultHKT,\n\tMySqlSession,\n\tMySqlTransaction,\n} from '~/mysql-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nexport class PlanetScalePreparedQuery<T extends MySqlPreparedQueryConfig> extends MySqlPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'PlanetScalePreparedQuery';\n\n\tprivate rawQuery = { as: 'object' } as const;\n\tprivate query = { as: 'array' } as const;\n\n\tconstructor(\n\t\tprivate client: Client | Transaction | Connection,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\t// Keys that were used in $default and the value that was generated for them\n\t\tprivate generatedIds?: Record<string, unknown>[],\n\t\t// Keys that should be returned, it has the column with all properries + key from object\n\t\tprivate returningIds?: SelectedFieldsOrdered,\n\t) {\n\t\tsuper(cache, queryMetadata, cacheConfig);\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\tthis.logger.logQuery(this.queryString, params);\n\n\t\tconst {\n\t\t\tfields,\n\t\t\tclient,\n\t\t\tqueryString,\n\t\t\trawQuery,\n\t\t\tquery,\n\t\t\tjoinsNotNullableMap,\n\t\t\tcustomResultMapper,\n\t\t\treturningIds,\n\t\t\tgeneratedIds,\n\t\t} = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst res = await this.queryWithCache(queryString, params, async () => {\n\t\t\t\treturn await client.execute(queryString, params, rawQuery);\n\t\t\t});\n\n\t\t\tconst insertId = Number.parseFloat(res.insertId);\n\t\t\tconst affectedRows = res.rowsAffected;\n\n\t\t\t// for each row, I need to check keys from\n\t\t\tif (returningIds) {\n\t\t\t\tconst returningResponse = [];\n\t\t\t\tlet j = 0;\n\t\t\t\tfor (let i = insertId; i < insertId + affectedRows; i++) {\n\t\t\t\t\tfor (const column of returningIds) {\n\t\t\t\t\t\tconst key = returningIds[0]!.path[0]!;\n\t\t\t\t\t\tif (is(column.field, Column)) {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tif (column.field.primary && column.field.autoIncrement) {\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: i });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (column.field.defaultFn && generatedIds) {\n\t\t\t\t\t\t\t\t// generatedIds[rowIdx][key]\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: generatedIds[j]![key] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t\treturn returningResponse;\n\t\t\t}\n\t\t\treturn res;\n\t\t}\n\t\tconst { rows } = await this.queryWithCache(queryString, params, async () => {\n\t\t\treturn await client.execute(queryString, params, query);\n\t\t});\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows as unknown[][]);\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow<T['execute']>(fields!, row as unknown[], joinsNotNullableMap));\n\t}\n\n\toverride iterator(_placeholderValues?: Record<string, unknown>): AsyncGenerator<T['iterator']> {\n\t\tthrow new Error('Streaming is not supported by the PlanetScale Serverless driver');\n\t}\n}\n\nexport interface PlanetscaleSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class PlanetscaleSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlSession<MySqlQueryResultHKT, PlanetScalePreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PlanetscaleSession';\n\n\tprivate logger: Logger;\n\tprivate client: Client | Transaction | Connection;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate baseClient: Client | Connection,\n\t\tdialect: MySqlDialect,\n\t\ttx: Transaction | undefined,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: PlanetscaleSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.client = tx ?? baseClient;\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends MySqlPreparedQueryConfig = MySqlPreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tgeneratedIds?: Record<string, unknown>[],\n\t\treturningIds?: SelectedFieldsOrdered,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): MySqlPreparedQuery<T> {\n\t\treturn new PlanetScalePreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tcustomResultMapper,\n\t\t\tgeneratedIds,\n\t\t\treturningIds,\n\t\t);\n\t}\n\n\tasync query(query: string, params: unknown[]): Promise<ExecutedQuery> {\n\t\tthis.logger.logQuery(query, params);\n\n\t\treturn await this.client.execute(query, params, { as: 'array' });\n\t}\n\n\tasync queryObjects(\n\t\tquery: string,\n\t\tparams: unknown[],\n\t): Promise<ExecutedQuery> {\n\t\treturn this.client.execute(query, params, { as: 'object' });\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\tconst querySql = this.dialect.sqlToQuery(query);\n\t\tthis.logger.logQuery(querySql.sql, querySql.params);\n\n\t\treturn this.client.execute<T>(querySql.sql, querySql.params, { as: 'object' }).then((\n\t\t\teQuery,\n\t\t) => eQuery.rows);\n\t}\n\n\toverride async count(sql: SQL): Promise<number> {\n\t\tconst res = await this.execute<{ rows: [{ count: string }] }>(sql);\n\n\t\treturn Number(\n\t\t\tres['rows'][0]['count'],\n\t\t);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: PlanetScaleTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\treturn this.baseClient.transaction((pstx) => {\n\t\t\tconst session = new PlanetscaleSession(this.baseClient, this.dialect, pstx, this.schema, this.options);\n\t\t\tconst tx = new PlanetScaleTransaction<TFullSchema, TSchema>(\n\t\t\t\tthis.dialect,\n\t\t\t\tsession as MySqlSession<any, any, any, any>,\n\t\t\t\tthis.schema,\n\t\t\t);\n\t\t\treturn transaction(tx);\n\t\t});\n\t}\n}\n\nexport class PlanetScaleTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlTransaction<PlanetscaleQueryResultHKT, PlanetScalePreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PlanetScaleTransaction';\n\n\tconstructor(\n\t\tdialect: MySqlDialect,\n\t\tsession: MySqlSession,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tnestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, schema, nestedIndex, 'planetscale');\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: PlanetScaleTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new PlanetScaleTransaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\t\tawait tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport interface PlanetscaleQueryResultHKT extends MySqlQueryResultHKT {\n\ttype: ExecutedQuery;\n}\n\nexport interface PlanetScalePreparedQueryHKT extends MySqlPreparedQueryHKT {\n\ttype: PlanetScalePreparedQuery<Assume<this['config'], MySqlPreparedQueryConfig>>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/postgres-js/README.md",
    "content": "# Drizzle ORM | [Postgres.js](https://github.com/porsager/postgres) driver\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm postgres\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm postgres\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm postgres\npnpm add -D drizzle-kit\n```\n\n## Connection\n\n```typescript\nimport { drizzle } from 'drizzle-orm/postgres-js';\nimport postgres from 'postgres';\n\nconst client = postgres(connectionString);\nconst db = drizzle(client);\n```\n\nSee [main docs](/drizzle-orm/src/pg-core/README.md#sql-schema-declaration) for further usage.\n\n## Running migrations\n\nIn order to run the migrations, [you need to use `max: 1` in the postgres.js connection options](https://github.com/porsager/postgres#unsafe_transaction). You can create a separate connection instance for migrations with that setting.\n\n```typescript\nimport postgres from 'postgres';\nimport { migrate } from 'drizzle-orm/postgres-js/migrator';\n\nconst migrationsClient = postgres(connectionString, {\n  max: 1,\n});\nconst db = drizzle(migrationsClient);\nawait migrate(db, { migrationsFolder: '...' });\n```\n\nSee [main migrations docs](/drizzle-orm/src/pg-core/README.md#migrations) for further info.\n"
  },
  {
    "path": "drizzle-orm/src/postgres-js/driver.ts",
    "content": "import pgClient, { type Options, type PostgresType, type Sql } from 'postgres';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport type { PostgresJsQueryResultHKT } from './session.ts';\nimport { PostgresJsSession } from './session.ts';\n\nexport class PostgresJsDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<PostgresJsQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PostgresJsDatabase';\n}\n\nfunction construct<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: Sql,\n\tconfig: DrizzleConfig<TSchema> = {},\n): PostgresJsDatabase<TSchema> & {\n\t$client: Sql;\n} {\n\tconst transparentParser = (val: any) => val;\n\n\t// Override postgres.js default date parsers: https://github.com/porsager/postgres/discussions/761\n\tfor (const type of ['1184', '1082', '1083', '1114', '1182', '1185', '1115', '1231']) {\n\t\tclient.options.parsers[type as any] = transparentParser;\n\t\tclient.options.serializers[type as any] = transparentParser;\n\t}\n\tclient.options.serializers['114'] = transparentParser;\n\tclient.options.serializers['3802'] = transparentParser;\n\n\tconst dialect = new PgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new PostgresJsSession(client, dialect, schema, { logger, cache: config.cache });\n\tconst db = new PostgresJsDatabase(dialect, session, schema as any) as PostgresJsDatabase<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Sql = Sql,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | ({ url?: string } & Options<Record<string, PostgresType>>);\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): PostgresJsDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = pgClient(params[0] as string);\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as {\n\t\t\tconnection?: { url?: string } & Options<Record<string, PostgresType>>;\n\t\t\tclient?: TClient;\n\t\t} & DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tif (typeof connection === 'object' && connection.url !== undefined) {\n\t\t\tconst { url, ...config } = connection;\n\n\t\t\tconst instance = pgClient(url, config);\n\t\t\treturn construct(instance, drizzleConfig) as any;\n\t\t}\n\n\t\tconst instance = pgClient(connection);\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): PostgresJsDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({\n\t\t\toptions: {\n\t\t\t\tparsers: {},\n\t\t\t\tserializers: {},\n\t\t\t},\n\t\t} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/postgres-js/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/postgres-js/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { PostgresJsDatabase } from './driver.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: PostgresJsDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tawait db.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/postgres-js/session.ts",
    "content": "import type { Row, RowList, Sql, TransactionSql } from 'postgres';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgTransaction } from '~/pg-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport { PgPreparedQuery, PgSession } from '~/pg-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nexport class PostgresJsPreparedQuery<T extends PreparedQueryConfig> extends PgPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'PostgresJsPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: Sql,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\treturn tracer.startActiveSpan('drizzle.execute', async (span) => {\n\t\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': this.queryString,\n\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t});\n\n\t\t\tthis.logger.logQuery(this.queryString, params);\n\n\t\t\tconst { fields, queryString: query, client, joinsNotNullableMap, customResultMapper } = this;\n\t\t\tif (!fields && !customResultMapper) {\n\t\t\t\treturn tracer.startActiveSpan('drizzle.driver.execute', () => {\n\t\t\t\t\treturn this.queryWithCache(query, params, async () => {\n\t\t\t\t\t\treturn await client.unsafe(query, params as any[]);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst rows = await tracer.startActiveSpan('drizzle.driver.execute', () => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': query,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\t\t\t\treturn this.queryWithCache(query, params, async () => {\n\t\t\t\t\treturn await client.unsafe(query, params as any[]).values();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn tracer.startActiveSpan('drizzle.mapResponse', () => {\n\t\t\t\treturn customResultMapper\n\t\t\t\t\t? customResultMapper(rows)\n\t\t\t\t\t: rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t\t\t});\n\t\t});\n\t}\n\n\tall(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['all']> {\n\t\treturn tracer.startActiveSpan('drizzle.execute', async (span) => {\n\t\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': this.queryString,\n\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t});\n\t\t\tthis.logger.logQuery(this.queryString, params);\n\t\t\treturn tracer.startActiveSpan('drizzle.driver.execute', () => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': this.queryString,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\t\t\t\treturn this.queryWithCache(this.queryString, params, async () => {\n\t\t\t\t\treturn this.client.unsafe(this.queryString, params as any[]);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport interface PostgresJsSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class PostgresJsSession<\n\tTSQL extends Sql,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgSession<PostgresJsQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PostgresJsSession';\n\n\tlogger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tpublic client: TSQL,\n\t\tdialect: PgDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\t/** @internal */\n\t\treadonly options: PostgresJsSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgPreparedQuery<T> {\n\t\treturn new PostgresJsPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\tquery(query: string, params: unknown[]): Promise<RowList<Row[]>> {\n\t\tthis.logger.logQuery(query, params);\n\t\treturn this.client.unsafe(query, params as any[]).values();\n\t}\n\n\tqueryObjects<T extends Row>(\n\t\tquery: string,\n\t\tparams: unknown[],\n\t): Promise<RowList<T[]>> {\n\t\treturn this.client.unsafe(query, params as any[]);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: PostgresJsTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T> {\n\t\treturn this.client.begin(async (client) => {\n\t\t\tconst session = new PostgresJsSession<TransactionSql, TFullSchema, TSchema>(\n\t\t\t\tclient,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.options,\n\t\t\t);\n\t\t\tconst tx = new PostgresJsTransaction(this.dialect, session, this.schema);\n\t\t\tif (config) {\n\t\t\t\tawait tx.setTransaction(config);\n\t\t\t}\n\t\t\treturn transaction(tx);\n\t\t}) as Promise<T>;\n\t}\n}\n\nexport class PostgresJsTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgTransaction<PostgresJsQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PostgresJsTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\t/** @internal */\n\t\toverride readonly session: PostgresJsSession<TransactionSql, TFullSchema, TSchema>,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tnestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, schema, nestedIndex);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: PostgresJsTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\treturn this.session.client.savepoint((client) => {\n\t\t\tconst session = new PostgresJsSession<TransactionSql, TFullSchema, TSchema>(\n\t\t\t\tclient,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.session.options,\n\t\t\t);\n\t\t\tconst tx = new PostgresJsTransaction<TFullSchema, TSchema>(this.dialect, session, this.schema);\n\t\t\treturn transaction(tx);\n\t\t}) as Promise<T>;\n\t}\n}\n\nexport interface PostgresJsQueryResultHKT extends PgQueryResultHKT {\n\ttype: RowList<Assume<this['row'], Row>[]>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/primary-key.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { AnyColumn } from './column.ts';\nimport type { Table } from './table.ts';\n\nexport abstract class PrimaryKey {\n\tstatic readonly [entityKind]: string = 'PrimaryKey';\n\n\tdeclare protected $brand: 'PrimaryKey';\n\n\tconstructor(readonly table: Table, readonly columns: AnyColumn[]) {}\n}\n"
  },
  {
    "path": "drizzle-orm/src/prisma/mysql/driver.ts",
    "content": "import type { PrismaClient } from '@prisma/client/extension';\n\nimport { Prisma } from '@prisma/client';\n\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { MySqlDatabase, MySqlDialect } from '~/mysql-core/index.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport type { PrismaMySqlPreparedQueryHKT, PrismaMySqlQueryResultHKT } from './session.ts';\nimport { PrismaMySqlSession } from './session.ts';\n\nexport class PrismaMySqlDatabase\n\textends MySqlDatabase<PrismaMySqlQueryResultHKT, PrismaMySqlPreparedQueryHKT, Record<string, never>>\n{\n\tstatic override readonly [entityKind]: string = 'PrismaMySqlDatabase';\n\n\tconstructor(client: PrismaClient, logger: Logger | undefined) {\n\t\tconst dialect = new MySqlDialect();\n\t\tsuper(dialect, new PrismaMySqlSession(dialect, client, { logger }), undefined, 'default');\n\t}\n}\n\nexport type PrismaMySqlConfig = Omit<DrizzleConfig, 'schema'>;\n\nexport function drizzle(config: PrismaMySqlConfig = {}) {\n\tlet logger: Logger | undefined;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\treturn Prisma.defineExtension((client) => {\n\t\treturn client.$extends({\n\t\t\tname: 'drizzle',\n\t\t\tclient: {\n\t\t\t\t$drizzle: new PrismaMySqlDatabase(client, logger),\n\t\t\t},\n\t\t});\n\t});\n}\n"
  },
  {
    "path": "drizzle-orm/src/prisma/mysql/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/prisma/mysql/session.ts",
    "content": "import type { PrismaClient } from '@prisma/client/extension';\n\nimport { entityKind } from '~/entity.ts';\nimport { type Logger, NoopLogger } from '~/logger.ts';\nimport type {\n\tMySqlDialect,\n\tMySqlPreparedQueryConfig,\n\tMySqlPreparedQueryHKT,\n\tMySqlQueryResultHKT,\n\tMySqlTransaction,\n\tMySqlTransactionConfig,\n} from '~/mysql-core/index.ts';\nimport { MySqlPreparedQuery, MySqlSession } from '~/mysql-core/index.ts';\nimport { fillPlaceholders } from '~/sql/sql.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport type { Assume } from '~/utils.ts';\n\nexport class PrismaMySqlPreparedQuery<T> extends MySqlPreparedQuery<MySqlPreparedQueryConfig & { execute: T }> {\n\toverride iterator(_placeholderValues?: Record<string, unknown> | undefined): AsyncGenerator<unknown, any, unknown> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\tstatic override readonly [entityKind]: string = 'PrismaMySqlPreparedQuery';\n\n\tconstructor(\n\t\tprivate readonly prisma: PrismaClient,\n\t\tprivate readonly query: Query,\n\t\tprivate readonly logger: Logger,\n\t) {\n\t\tsuper(undefined, undefined, undefined);\n\t}\n\n\toverride execute(placeholderValues?: Record<string, unknown>): Promise<T> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.prisma.$queryRawUnsafe(this.query.sql, ...params);\n\t}\n}\n\nexport interface PrismaMySqlSessionOptions {\n\tlogger?: Logger;\n}\n\nexport class PrismaMySqlSession extends MySqlSession {\n\tstatic override readonly [entityKind]: string = 'PrismaMySqlSession';\n\n\tprivate readonly logger: Logger;\n\n\tconstructor(\n\t\tdialect: MySqlDialect,\n\t\tprivate readonly prisma: PrismaClient,\n\t\tprivate readonly options: PrismaMySqlSessionOptions,\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\toverride execute<T>(query: SQL): Promise<T> {\n\t\treturn this.prepareQuery<MySqlPreparedQueryConfig & { execute: T }>(this.dialect.sqlToQuery(query)).execute();\n\t}\n\n\toverride all<T = unknown>(_query: SQL): Promise<T[]> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\toverride prepareQuery<T extends MySqlPreparedQueryConfig = MySqlPreparedQueryConfig>(\n\t\tquery: Query,\n\t): MySqlPreparedQuery<T> {\n\t\treturn new PrismaMySqlPreparedQuery(this.prisma, query, this.logger);\n\t}\n\n\toverride transaction<T>(\n\t\t_transaction: (\n\t\t\ttx: MySqlTransaction<\n\t\t\t\tPrismaMySqlQueryResultHKT,\n\t\t\t\tPrismaMySqlPreparedQueryHKT,\n\t\t\t\tRecord<string, never>,\n\t\t\t\tRecord<string, never>\n\t\t\t>,\n\t\t) => Promise<T>,\n\t\t_config?: MySqlTransactionConfig,\n\t): Promise<T> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n}\n\nexport interface PrismaMySqlQueryResultHKT extends MySqlQueryResultHKT {\n\ttype: [];\n}\n\nexport interface PrismaMySqlPreparedQueryHKT extends MySqlPreparedQueryHKT {\n\ttype: PrismaMySqlPreparedQuery<Assume<this['config'], MySqlPreparedQueryConfig>>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/prisma/pg/driver.ts",
    "content": "import type { PrismaClient } from '@prisma/client/extension';\n\nimport { Prisma } from '@prisma/client';\n\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase, PgDialect } from '~/pg-core/index.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport type { PrismaPgQueryResultHKT } from './session.ts';\nimport { PrismaPgSession } from './session.ts';\n\nexport class PrismaPgDatabase extends PgDatabase<PrismaPgQueryResultHKT, Record<string, never>> {\n\tstatic override readonly [entityKind]: string = 'PrismaPgDatabase';\n\n\tconstructor(client: PrismaClient, logger: Logger | undefined) {\n\t\tconst dialect = new PgDialect();\n\t\tsuper(dialect, new PrismaPgSession(dialect, client, { logger }), undefined);\n\t}\n}\n\nexport type PrismaPgConfig = Omit<DrizzleConfig, 'schema'>;\n\nexport function drizzle(config: PrismaPgConfig = {}) {\n\tlet logger: Logger | undefined;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\treturn Prisma.defineExtension((client) => {\n\t\treturn client.$extends({\n\t\t\tname: 'drizzle',\n\t\t\tclient: {\n\t\t\t\t$drizzle: new PrismaPgDatabase(client, logger),\n\t\t\t},\n\t\t});\n\t});\n}\n"
  },
  {
    "path": "drizzle-orm/src/prisma/pg/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/prisma/pg/session.ts",
    "content": "import type { PrismaClient } from '@prisma/client/extension';\n\nimport { entityKind } from '~/entity.ts';\nimport { type Logger, NoopLogger } from '~/logger.ts';\nimport type {\n\tPgDialect,\n\tPgQueryResultHKT,\n\tPgTransaction,\n\tPgTransactionConfig,\n\tPreparedQueryConfig,\n} from '~/pg-core/index.ts';\nimport { PgPreparedQuery, PgSession } from '~/pg-core/index.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport { fillPlaceholders } from '~/sql/sql.ts';\n\nexport class PrismaPgPreparedQuery<T> extends PgPreparedQuery<PreparedQueryConfig & { execute: T }> {\n\tstatic override readonly [entityKind]: string = 'PrismaPgPreparedQuery';\n\n\tconstructor(\n\t\tprivate readonly prisma: PrismaClient,\n\t\tquery: Query,\n\t\tprivate readonly logger: Logger,\n\t) {\n\t\tsuper(query, undefined, undefined, undefined);\n\t}\n\n\toverride execute(placeholderValues?: Record<string, unknown>): Promise<T> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.prisma.$queryRawUnsafe(this.query.sql, ...params);\n\t}\n\n\toverride all(): Promise<unknown> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\toverride isResponseInArrayMode(): boolean {\n\t\treturn false;\n\t}\n}\n\nexport interface PrismaPgSessionOptions {\n\tlogger?: Logger;\n}\n\nexport class PrismaPgSession extends PgSession {\n\tstatic override readonly [entityKind]: string = 'PrismaPgSession';\n\n\tprivate readonly logger: Logger;\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\tprivate readonly prisma: PrismaClient,\n\t\tprivate readonly options: PrismaPgSessionOptions,\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\toverride execute<T>(query: SQL): Promise<T> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }>(this.dialect.sqlToQuery(query)).execute();\n\t}\n\n\toverride prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(query: Query): PgPreparedQuery<T> {\n\t\treturn new PrismaPgPreparedQuery(this.prisma, query, this.logger);\n\t}\n\n\toverride transaction<T>(\n\t\t_transaction: (tx: PgTransaction<PgQueryResultHKT, Record<string, never>, Record<string, never>>) => Promise<T>,\n\t\t_config?: PgTransactionConfig,\n\t): Promise<T> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n}\n\nexport interface PrismaPgQueryResultHKT extends PgQueryResultHKT {\n\ttype: [];\n}\n"
  },
  {
    "path": "drizzle-orm/src/prisma/schema.prisma",
    "content": "generator client {\n  provider = \"prisma-client-js\"\n}\n\ndatasource db {\n  provider = \"postgresql\"\n  url      = env(\"DB_URL\")\n}\n\nmodel User {\n  id    Int     @id @default(autoincrement())\n  email String  @unique\n  name  String?\n}\n"
  },
  {
    "path": "drizzle-orm/src/prisma/sqlite/driver.ts",
    "content": "import { Prisma } from '@prisma/client';\n\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { BaseSQLiteDatabase, SQLiteAsyncDialect } from '~/sqlite-core/index.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport { PrismaSQLiteSession } from './session.ts';\n\nexport type PrismaSQLiteDatabase = BaseSQLiteDatabase<'async', []>;\n\nexport type PrismaSQLiteConfig = Omit<DrizzleConfig, 'schema'>;\n\nexport function drizzle(config: PrismaSQLiteConfig = {}) {\n\tconst dialect = new SQLiteAsyncDialect();\n\tlet logger: Logger | undefined;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\treturn Prisma.defineExtension((client) => {\n\t\tconst session = new PrismaSQLiteSession(client, dialect, { logger });\n\n\t\treturn client.$extends({\n\t\t\tname: 'drizzle',\n\t\t\tclient: {\n\t\t\t\t$drizzle: new BaseSQLiteDatabase('async', dialect, session, undefined) as PrismaSQLiteDatabase,\n\t\t\t},\n\t\t});\n\t});\n}\n"
  },
  {
    "path": "drizzle-orm/src/prisma/sqlite/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/prisma/sqlite/session.ts",
    "content": "import type { PrismaClient } from '@prisma/client/extension';\n\nimport { entityKind } from '~/entity.ts';\nimport { type Logger, NoopLogger } from '~/logger.ts';\nimport type { Query } from '~/sql/sql.ts';\nimport { fillPlaceholders } from '~/sql/sql.ts';\nimport type {\n\tPreparedQueryConfig as PreparedQueryConfigBase,\n\tSelectedFieldsOrdered,\n\tSQLiteAsyncDialect,\n\tSQLiteExecuteMethod,\n\tSQLiteTransaction,\n\tSQLiteTransactionConfig,\n} from '~/sqlite-core/index.ts';\nimport { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/index.ts';\n\ntype PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\n\nexport class PrismaSQLitePreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends SQLitePreparedQuery<\n\t{ type: 'async'; run: []; all: T['all']; get: T['get']; values: never; execute: T['execute'] }\n> {\n\tstatic override readonly [entityKind]: string = 'PrismaSQLitePreparedQuery';\n\n\tconstructor(\n\t\tprivate readonly prisma: PrismaClient,\n\t\tquery: Query,\n\t\tprivate readonly logger: Logger,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t) {\n\t\tsuper('async', executeMethod, query);\n\t}\n\n\toverride all(placeholderValues?: Record<string, unknown>): Promise<T['all']> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.prisma.$queryRawUnsafe(this.query.sql, ...params);\n\t}\n\n\toverride async run(placeholderValues?: Record<string, unknown> | undefined): Promise<[]> {\n\t\tawait this.all(placeholderValues);\n\t\treturn [];\n\t}\n\n\toverride async get(placeholderValues?: Record<string, unknown> | undefined): Promise<T['get']> {\n\t\tconst all = await this.all(placeholderValues) as unknown[];\n\t\treturn all[0];\n\t}\n\n\toverride values(_placeholderValues?: Record<string, unknown> | undefined): Promise<never> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\toverride isResponseInArrayMode(): boolean {\n\t\treturn false;\n\t}\n}\n\nexport interface PrismaSQLiteSessionOptions {\n\tlogger?: Logger;\n}\n\nexport class PrismaSQLiteSession extends SQLiteSession<'async', unknown, Record<string, never>, Record<string, never>> {\n\tstatic override readonly [entityKind]: string = 'PrismaSQLiteSession';\n\n\tprivate readonly logger: Logger;\n\n\tconstructor(\n\t\tprivate readonly prisma: PrismaClient,\n\t\tdialect: SQLiteAsyncDialect,\n\t\toptions: PrismaSQLiteSessionOptions,\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\toverride prepareQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t): PrismaSQLitePreparedQuery<T> {\n\t\treturn new PrismaSQLitePreparedQuery(this.prisma, query, this.logger, executeMethod);\n\t}\n\n\toverride transaction<T>(\n\t\t_transaction: (tx: SQLiteTransaction<'async', unknown, Record<string, never>, Record<string, never>>) => Promise<T>,\n\t\t_config?: SQLiteTransactionConfig,\n\t): Promise<T> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/query-builders/query-builder.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { SQL, SQLWrapper } from '~/sql/index.ts';\n\nexport abstract class TypedQueryBuilder<TSelection, TResult = unknown, TConfig = unknown> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'TypedQueryBuilder';\n\n\tdeclare _: {\n\t\tselectedFields: TSelection;\n\t\tresult: TResult;\n\t\tconfig?: TConfig;\n\t};\n\n\t/** @internal */\n\tgetSelectedFields(): TSelection {\n\t\treturn this._.selectedFields;\n\t}\n\n\tabstract getSQL(): SQL;\n}\n"
  },
  {
    "path": "drizzle-orm/src/query-builders/select.types.ts",
    "content": "import type { ChangeColumnTableName, ColumnDataType, Dialect } from '~/column-builder.ts';\nimport type { AnyColumn, Column, ColumnBaseConfig, GetColumnData, UpdateColConfig } from '~/column.ts';\nimport type { SelectedFields } from '~/operations.ts';\nimport type { ColumnsSelection, SQL, View } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport type { Table } from '~/table.ts';\nimport type { Assume, DrizzleTypeError, Equal, FromSingleKeyObject, IsAny, IsUnion, Not, Simplify } from '~/utils.ts';\n\nexport type JoinType = 'inner' | 'left' | 'right' | 'full' | 'cross';\n\nexport type JoinNullability = 'nullable' | 'not-null';\n\nexport type ApplyNullability<T, TNullability extends JoinNullability> = TNullability extends 'nullable' ? T | null\n\t: TNullability extends 'null' ? null\n\t: T;\n\nexport type ApplyNullabilityToColumn<TColumn extends Column, TNullability extends JoinNullability> =\n\tTNullability extends 'not-null' ? TColumn\n\t\t: Column<\n\t\t\tAssume<\n\t\t\t\tUpdateColConfig<TColumn['_'], {\n\t\t\t\t\tnotNull: TNullability extends 'nullable' ? false : TColumn['_']['notNull'];\n\t\t\t\t}>,\n\t\t\t\tColumnBaseConfig<ColumnDataType, string>\n\t\t\t>\n\t\t>;\n\nexport type ApplyNotNullMapToJoins<TResult, TNullabilityMap extends Record<string, JoinNullability>> =\n\t& {\n\t\t[TTableName in keyof TResult & keyof TNullabilityMap & string]: ApplyNullability<\n\t\t\tTResult[TTableName],\n\t\t\tTNullabilityMap[TTableName]\n\t\t>;\n\t}\n\t& {};\n\nexport type SelectMode = 'partial' | 'single' | 'multiple';\n\nexport type SelectResult<\n\tTResult,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability>,\n> = TSelectMode extends 'partial' ? SelectPartialResult<TResult, TNullabilityMap>\n\t: TSelectMode extends 'single' ? SelectResultFields<TResult>\n\t: ApplyNotNullMapToJoins<SelectResultFields<TResult>, TNullabilityMap>;\n\ntype SelectPartialResult<TFields, TNullability extends Record<string, JoinNullability>> = TNullability extends\n\tTNullability ? {\n\t\t[Key in keyof TFields]: TFields[Key] extends infer TField\n\t\t\t? TField extends Table ? TField['_']['name'] extends keyof TNullability ? ApplyNullability<\n\t\t\t\t\t\tSelectResultFields<TField['_']['columns']>,\n\t\t\t\t\t\tTNullability[TField['_']['name']]\n\t\t\t\t\t>\n\t\t\t\t: never\n\t\t\t: TField extends Column\n\t\t\t\t? TField['_']['tableName'] extends keyof TNullability\n\t\t\t\t\t? ApplyNullability<SelectResultField<TField>, TNullability[TField['_']['tableName']]>\n\t\t\t\t: never\n\t\t\t: TField extends SQL | SQL.Aliased ? SelectResultField<TField>\n\t\t\t: TField extends Subquery ? FromSingleKeyObject<\n\t\t\t\t\tTField['_']['selectedFields'],\n\t\t\t\t\tTField['_']['selectedFields'] extends { [key: string]: infer TValue } ? SelectResultField<TValue> : never,\n\t\t\t\t\t'You can only select one column in the subquery'\n\t\t\t\t>\n\t\t\t: TField extends Record<string, any>\n\t\t\t\t? TField[keyof TField] extends AnyColumn<{ tableName: infer TTableName extends string }> | SQL | SQL.Aliased\n\t\t\t\t\t? Not<IsUnion<TTableName>> extends true\n\t\t\t\t\t\t? ApplyNullability<SelectResultFields<TField>, TNullability[TTableName]>\n\t\t\t\t\t: SelectPartialResult<TField, TNullability>\n\t\t\t\t: never\n\t\t\t: never\n\t\t\t: never;\n\t}\n\t: never;\n\nexport type MapColumnsToTableAlias<\n\tTColumns extends ColumnsSelection,\n\tTAlias extends string,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TColumns]: TColumns[Key] extends Column\n\t\t\t? ChangeColumnTableName<Assume<TColumns[Key], Column>, TAlias, TDialect>\n\t\t\t: TColumns[Key];\n\t}\n\t& {};\n\nexport type AddAliasToSelection<\n\tTSelection extends ColumnsSelection,\n\tTAlias extends string,\n\tTDialect extends Dialect,\n> = Simplify<\n\tIsAny<TSelection> extends true ? any\n\t\t: {\n\t\t\t[Key in keyof TSelection]: TSelection[Key] extends Column\n\t\t\t\t? ChangeColumnTableName<TSelection[Key], TAlias, TDialect>\n\t\t\t\t: TSelection[Key] extends Table ? AddAliasToSelection<TSelection[Key]['_']['columns'], TAlias, TDialect>\n\t\t\t\t: TSelection[Key] extends SQL | SQL.Aliased ? TSelection[Key]\n\t\t\t\t: TSelection[Key] extends ColumnsSelection ? MapColumnsToTableAlias<TSelection[Key], TAlias, TDialect>\n\t\t\t\t: never;\n\t\t}\n>;\n\nexport type AppendToResult<\n\tTTableName extends string | undefined,\n\tTResult,\n\tTJoinedName extends string | undefined,\n\tTSelectedFields extends SelectedFields<Column, Table>,\n\tTOldSelectMode extends SelectMode,\n> = TOldSelectMode extends 'partial' ? TResult\n\t: TOldSelectMode extends 'single' ?\n\t\t\t& (TTableName extends string ? Record<TTableName, TResult> : TResult)\n\t\t\t& (TJoinedName extends string ? Record<TJoinedName, TSelectedFields> : TSelectedFields)\n\t: TResult & (TJoinedName extends string ? Record<TJoinedName, TSelectedFields> : TSelectedFields);\n\nexport type BuildSubquerySelection<\n\tTSelection extends ColumnsSelection,\n\tTNullability extends Record<string, JoinNullability>,\n> = TSelection extends never ? any\n\t:\n\t\t& {\n\t\t\t[Key in keyof TSelection]: TSelection[Key] extends SQL\n\t\t\t\t? DrizzleTypeError<'You cannot reference this field without assigning it an alias first - use `.as(<alias>)`'>\n\t\t\t\t: TSelection[Key] extends SQL.Aliased ? TSelection[Key]\n\t\t\t\t: TSelection[Key] extends Table ? BuildSubquerySelection<TSelection[Key]['_']['columns'], TNullability>\n\t\t\t\t: TSelection[Key] extends Column\n\t\t\t\t\t? ApplyNullabilityToColumn<TSelection[Key], TNullability[TSelection[Key]['_']['tableName']]>\n\t\t\t\t: TSelection[Key] extends ColumnsSelection ? BuildSubquerySelection<TSelection[Key], TNullability>\n\t\t\t\t: never;\n\t\t}\n\t\t& {};\n\ntype SetJoinsNullability<TNullabilityMap extends Record<string, JoinNullability>, TValue extends JoinNullability> = {\n\t[Key in keyof TNullabilityMap]: TValue;\n};\n\nexport type AppendToNullabilityMap<\n\tTJoinsNotNull extends Record<string, JoinNullability>,\n\tTJoinedName extends string | undefined,\n\tTJoinType extends JoinType,\n> = TJoinedName extends string ? 'left' extends TJoinType ? TJoinsNotNull & { [name in TJoinedName]: 'nullable' }\n\t: 'right' extends TJoinType ? SetJoinsNullability<TJoinsNotNull, 'nullable'> & { [name in TJoinedName]: 'not-null' }\n\t: 'inner' extends TJoinType ? TJoinsNotNull & { [name in TJoinedName]: 'not-null' }\n\t: 'cross' extends TJoinType ? TJoinsNotNull & { [name in TJoinedName]: 'not-null' }\n\t: 'full' extends TJoinType ? SetJoinsNullability<TJoinsNotNull, 'nullable'> & { [name in TJoinedName]: 'nullable' }\n\t: never\n\t: TJoinsNotNull;\n\nexport type TableLike = Table | Subquery | View | SQL;\n\nexport type GetSelectTableName<TTable extends TableLike> = TTable extends Table ? TTable['_']['name']\n\t: TTable extends Subquery ? TTable['_']['alias']\n\t: TTable extends View ? TTable['_']['name']\n\t: TTable extends SQL ? undefined\n\t: never;\n\nexport type GetSelectTableSelection<TTable extends TableLike> = TTable extends Table ? TTable['_']['columns']\n\t: TTable extends Subquery | View ? Assume<TTable['_']['selectedFields'], ColumnsSelection>\n\t: TTable extends SQL ? {}\n\t: never;\n\nexport type SelectResultField<T, TDeep extends boolean = true> = T extends DrizzleTypeError<any> ? T\n\t: T extends Table ? Equal<TDeep, true> extends true ? SelectResultField<T['_']['columns'], false> : never\n\t: T extends Column<any> ? GetColumnData<T>\n\t: T extends SQL | SQL.Aliased ? T['_']['type']\n\t: T extends Record<string, any> ? SelectResultFields<T, true>\n\t: never;\n\nexport type SelectResultFields<TSelectedFields, TDeep extends boolean = true> = Simplify<\n\t{\n\t\t[Key in keyof TSelectedFields]: SelectResultField<TSelectedFields[Key], TDeep>;\n\t}\n>;\n\nexport type SetOperator = 'union' | 'intersect' | 'except';\n"
  },
  {
    "path": "drizzle-orm/src/query-promise.ts",
    "content": "import { entityKind } from '~/entity.ts';\n\nexport abstract class QueryPromise<T> implements Promise<T> {\n\tstatic readonly [entityKind]: string = 'QueryPromise';\n\n\t[Symbol.toStringTag] = 'QueryPromise';\n\n\tcatch<TResult = never>(\n\t\tonRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined,\n\t): Promise<T | TResult> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<T> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n\n\tthen<TResult1 = T, TResult2 = never>(\n\t\tonFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n\t\tonRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn this.execute().then(onFulfilled, onRejected);\n\t}\n\n\tabstract execute(): Promise<T>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/relations.ts",
    "content": "import { type AnyTable, getTableUniqueName, type InferModelFromColumns, Table } from '~/table.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { PrimaryKeyBuilder } from './pg-core/primary-keys.ts';\nimport {\n\tand,\n\tasc,\n\tbetween,\n\tdesc,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from './sql/expressions/index.ts';\nimport { type Placeholder, SQL, sql } from './sql/sql.ts';\nimport type { Assume, ColumnsWithTable, Equal, Simplify, ValueOrArray } from './utils.ts';\n\nexport abstract class Relation<TTableName extends string = string> {\n\tstatic readonly [entityKind]: string = 'Relation';\n\n\tdeclare readonly $brand: 'Relation';\n\treadonly referencedTableName: TTableName;\n\tfieldName!: string;\n\n\tconstructor(\n\t\treadonly sourceTable: Table,\n\t\treadonly referencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly relationName: string | undefined,\n\t) {\n\t\tthis.referencedTableName = referencedTable[Table.Symbol.Name] as TTableName;\n\t}\n\n\tabstract withFieldName(fieldName: string): Relation<TTableName>;\n}\n\nexport class Relations<\n\tTTableName extends string = string,\n\tTConfig extends Record<string, Relation> = Record<string, Relation>,\n> {\n\tstatic readonly [entityKind]: string = 'Relations';\n\n\tdeclare readonly $brand: 'Relations';\n\n\tconstructor(\n\t\treadonly table: AnyTable<{ name: TTableName }>,\n\t\treadonly config: (helpers: TableRelationsHelpers<TTableName>) => TConfig,\n\t) {}\n}\n\nexport class One<\n\tTTableName extends string = string,\n\tTIsNullable extends boolean = boolean,\n> extends Relation<TTableName> {\n\tstatic override readonly [entityKind]: string = 'One';\n\n\tdeclare protected $relationBrand: 'One';\n\n\tconstructor(\n\t\tsourceTable: Table,\n\t\treferencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly config:\n\t\t\t| RelationConfig<\n\t\t\t\tTTableName,\n\t\t\t\tstring,\n\t\t\t\tAnyColumn<{ tableName: TTableName }>[]\n\t\t\t>\n\t\t\t| undefined,\n\t\treadonly isNullable: TIsNullable,\n\t) {\n\t\tsuper(sourceTable, referencedTable, config?.relationName);\n\t}\n\n\twithFieldName(fieldName: string): One<TTableName> {\n\t\tconst relation = new One(\n\t\t\tthis.sourceTable,\n\t\t\tthis.referencedTable,\n\t\t\tthis.config,\n\t\t\tthis.isNullable,\n\t\t);\n\t\trelation.fieldName = fieldName;\n\t\treturn relation;\n\t}\n}\n\nexport class Many<TTableName extends string> extends Relation<TTableName> {\n\tstatic override readonly [entityKind]: string = 'Many';\n\n\tdeclare protected $relationBrand: 'Many';\n\n\tconstructor(\n\t\tsourceTable: Table,\n\t\treferencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly config: { relationName: string } | undefined,\n\t) {\n\t\tsuper(sourceTable, referencedTable, config?.relationName);\n\t}\n\n\twithFieldName(fieldName: string): Many<TTableName> {\n\t\tconst relation = new Many(\n\t\t\tthis.sourceTable,\n\t\t\tthis.referencedTable,\n\t\t\tthis.config,\n\t\t);\n\t\trelation.fieldName = fieldName;\n\t\treturn relation;\n\t}\n}\n\nexport type TableRelationsKeysOnly<\n\tTSchema extends Record<string, unknown>,\n\tTTableName extends string,\n\tK extends keyof TSchema,\n> = TSchema[K] extends Relations<TTableName> ? K : never;\n\nexport type ExtractTableRelationsFromSchema<\n\tTSchema extends Record<string, unknown>,\n\tTTableName extends string,\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TableRelationsKeysOnly<\n\t\t\t\tTSchema,\n\t\t\t\tTTableName,\n\t\t\t\tK\n\t\t\t>\n\t\t]: TSchema[K] extends Relations<TTableName, infer TConfig> ? TConfig : never;\n\t}\n>;\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport type ExtractRelationsFromTableExtraConfigSchema<\n\tTConfig extends unknown[],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TConfig as TConfig[K] extends Relations<any> ? K\n\t\t\t\t: never\n\t\t]: TConfig[K] extends Relations<infer TRelationConfig> ? TRelationConfig\n\t\t\t: never;\n\t}\n>;\n\nexport function getOperators() {\n\treturn {\n\t\tand,\n\t\tbetween,\n\t\teq,\n\t\texists,\n\t\tgt,\n\t\tgte,\n\t\tilike,\n\t\tinArray,\n\t\tisNull,\n\t\tisNotNull,\n\t\tlike,\n\t\tlt,\n\t\tlte,\n\t\tne,\n\t\tnot,\n\t\tnotBetween,\n\t\tnotExists,\n\t\tnotLike,\n\t\tnotIlike,\n\t\tnotInArray,\n\t\tor,\n\t\tsql,\n\t};\n}\n\nexport type Operators = ReturnType<typeof getOperators>;\n\nexport function getOrderByOperators() {\n\treturn {\n\t\tsql,\n\t\tasc,\n\t\tdesc,\n\t};\n}\n\nexport type OrderByOperators = ReturnType<typeof getOrderByOperators>;\n\nexport type FindTableByDBName<\n\tTSchema extends TablesRelationalConfig,\n\tTTableName extends string,\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['dbName'] extends TTableName ? K\n\t\t\t\t: never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTIsRoot extends boolean = boolean,\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& {\n\t\tcolumns?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: boolean;\n\t\t\t}\n\t\t\t| undefined;\n\t\twith?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['relations']]?:\n\t\t\t\t\t| true\n\t\t\t\t\t| DBQueryConfig<\n\t\t\t\t\t\tTTableConfig['relations'][K] extends One ? 'one' : 'many',\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\tFindTableByDBName<\n\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\tTTableConfig['relations'][K]['referencedTableName']\n\t\t\t\t\t\t>\n\t\t\t\t\t>\n\t\t\t\t\t| undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\textras?:\n\t\t\t| Record<string, SQL.Aliased>\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: { sql: Operators['sql'] },\n\t\t\t) => Record<string, SQL.Aliased>)\n\t\t\t| undefined;\n\t}\n\t& (TRelationType extends 'many' ?\n\t\t\t& {\n\t\t\t\twhere?:\n\t\t\t\t\t| SQL\n\t\t\t\t\t| undefined\n\t\t\t\t\t| ((\n\t\t\t\t\t\tfields: Simplify<\n\t\t\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t\t\t>,\n\t\t\t\t\t\toperators: Operators,\n\t\t\t\t\t) => SQL | undefined);\n\t\t\t\torderBy?:\n\t\t\t\t\t| ValueOrArray<AnyColumn | SQL>\n\t\t\t\t\t| ((\n\t\t\t\t\t\tfields: Simplify<\n\t\t\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t\t\t>,\n\t\t\t\t\t\toperators: OrderByOperators,\n\t\t\t\t\t) => ValueOrArray<AnyColumn | SQL>)\n\t\t\t\t\t| undefined;\n\t\t\t\tlimit?: number | Placeholder | undefined;\n\t\t\t}\n\t\t\t& (TIsRoot extends true ? {\n\t\t\t\t\toffset?: number | Placeholder | undefined;\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t: {});\n\nexport interface TableRelationalConfig {\n\ttsName: string;\n\tdbName: string;\n\tcolumns: Record<string, Column>;\n\trelations: Record<string, Relation>;\n\tprimaryKey: AnyColumn[];\n\tschema?: string;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport interface RelationalSchemaConfig<\n\tTSchema extends TablesRelationalConfig,\n> {\n\tfullSchema: Record<string, unknown>;\n\tschema: TSchema;\n\ttableNamesMap: Record<string, string>;\n}\n\nexport type ExtractTablesWithRelations<\n\tTSchema extends Record<string, unknown>,\n> = {\n\t[\n\t\tK in keyof TSchema as TSchema[K] extends Table ? K\n\t\t\t: never\n\t]: TSchema[K] extends Table ? {\n\t\t\ttsName: K & string;\n\t\t\tdbName: TSchema[K]['_']['name'];\n\t\t\tcolumns: TSchema[K]['_']['columns'];\n\t\t\trelations: ExtractTableRelationsFromSchema<\n\t\t\t\tTSchema,\n\t\t\t\tTSchema[K]['_']['name']\n\t\t\t>;\n\t\t\tprimaryKey: AnyColumn[];\n\t\t}\n\t\t: never;\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type BuildRelationResult<\n\tTSchema extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends Record<string, Relation>,\n> = {\n\t[\n\t\tK in\n\t\t\t& NonUndefinedKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<\n\t\t\tTSchema,\n\t\t\tFindTableByDBName<TSchema, TRel['referencedTableName']>,\n\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t> extends infer TResult ? TRel extends One ?\n\t\t\t\t\t| TResult\n\t\t\t\t\t| (Equal<TRel['isNullable'], false> extends true ? null : never)\n\t\t\t: TResult[]\n\t\t: never\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> =\n\t& ExtractObjectValues<\n\t\t{\n\t\t\t[K in keyof T as T[K] extends undefined ? never : K]: K;\n\t\t}\n\t>\n\t& keyof T;\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n> = Equal<TFullSelection, true> extends true ? InferModelFromColumns<TTableConfig['columns']>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (TFullSelection['columns'] extends Record<string, unknown> ? InferModelFromColumns<\n\t\t\t\t\t{\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tK in Equal<\n\t\t\t\t\t\t\t\tExclude<\n\t\t\t\t\t\t\t\t\tTFullSelection['columns'][\n\t\t\t\t\t\t\t\t\t\t& keyof TFullSelection['columns']\n\t\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t\t> extends true ? Exclude<\n\t\t\t\t\t\t\t\t\tkeyof TTableConfig['columns'],\n\t\t\t\t\t\t\t\t\tNonUndefinedKeysOnly<TFullSelection['columns']>\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t& {\n\t\t\t\t\t\t\t\t\t\t[K in keyof TFullSelection['columns']]: Equal<\n\t\t\t\t\t\t\t\t\t\t\tTFullSelection['columns'][K],\n\t\t\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t\t\t\t\t: never;\n\t\t\t\t\t\t\t\t\t}[keyof TFullSelection['columns']]\n\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t]: TTableConfig['columns'][K];\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t: InferModelFromColumns<TTableConfig['columns']>)\n\t\t\t& (TFullSelection['extras'] extends\n\t\t\t\t| Record<string, unknown>\n\t\t\t\t| ((...args: any[]) => Record<string, unknown>) ? {\n\t\t\t\t\t[\n\t\t\t\t\t\tK in NonUndefinedKeysOnly<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>\n\t\t\t\t\t\t>\n\t\t\t\t\t]: Assume<\n\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>[K],\n\t\t\t\t\t\tSQL.Aliased\n\t\t\t\t\t>['_']['type'];\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t\t& (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<\n\t\t\t\t\tTSchema,\n\t\t\t\t\tTFullSelection['with'],\n\t\t\t\t\tTTableConfig['relations']\n\t\t\t\t>\n\t\t\t\t: {})\n\t\t>\n\t: never;\n\nexport interface RelationConfig<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyColumn<{ tableName: TTableName }>[],\n> {\n\trelationName?: string;\n\tfields: TColumns;\n\treferences: ColumnsWithTable<TTableName, TForeignTableName, TColumns>;\n}\n\nexport function extractTablesRelationalConfig<\n\tTTables extends TablesRelationalConfig,\n>(\n\tschema: Record<string, unknown>,\n\tconfigHelpers: (table: Table) => any,\n): { tables: TTables; tableNamesMap: Record<string, string> } {\n\tif (\n\t\tObject.keys(schema).length === 1\n\t\t&& 'default' in schema\n\t\t&& !is(schema['default'], Table)\n\t) {\n\t\tschema = schema['default'] as Record<string, unknown>;\n\t}\n\n\t// table DB name -> schema table key\n\tconst tableNamesMap: Record<string, string> = {};\n\t// Table relations found before their tables - need to buffer them until we know the schema table key\n\tconst relationsBuffer: Record<\n\t\tstring,\n\t\t{ relations: Record<string, Relation>; primaryKey?: AnyColumn[] }\n\t> = {};\n\tconst tablesConfig: TablesRelationalConfig = {};\n\tfor (const [key, value] of Object.entries(schema)) {\n\t\tif (is(value, Table)) {\n\t\t\tconst dbName = getTableUniqueName(value);\n\t\t\tconst bufferedRelations = relationsBuffer[dbName];\n\t\t\ttableNamesMap[dbName] = key;\n\t\t\ttablesConfig[key] = {\n\t\t\t\ttsName: key,\n\t\t\t\tdbName: value[Table.Symbol.Name],\n\t\t\t\tschema: value[Table.Symbol.Schema],\n\t\t\t\tcolumns: value[Table.Symbol.Columns],\n\t\t\t\trelations: bufferedRelations?.relations ?? {},\n\t\t\t\tprimaryKey: bufferedRelations?.primaryKey ?? [],\n\t\t\t};\n\n\t\t\t// Fill in primary keys\n\t\t\tfor (\n\t\t\t\tconst column of Object.values(\n\t\t\t\t\t(value as Table)[Table.Symbol.Columns],\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tif (column.primary) {\n\t\t\t\t\ttablesConfig[key]!.primaryKey.push(column);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.((value as Table)[Table.Symbol.ExtraConfigColumns]);\n\t\t\tif (extraConfig) {\n\t\t\t\tfor (const configEntry of Object.values(extraConfig)) {\n\t\t\t\t\tif (is(configEntry, PrimaryKeyBuilder)) {\n\t\t\t\t\t\ttablesConfig[key]!.primaryKey.push(...configEntry.columns);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (is(value, Relations)) {\n\t\t\tconst dbName = getTableUniqueName(value.table);\n\t\t\tconst tableName = tableNamesMap[dbName];\n\t\t\tconst relations: Record<string, Relation> = value.config(\n\t\t\t\tconfigHelpers(value.table),\n\t\t\t);\n\t\t\tlet primaryKey: AnyColumn[] | undefined;\n\n\t\t\tfor (const [relationName, relation] of Object.entries(relations)) {\n\t\t\t\tif (tableName) {\n\t\t\t\t\tconst tableConfig = tablesConfig[tableName]!;\n\t\t\t\t\ttableConfig.relations[relationName] = relation;\n\t\t\t\t\tif (primaryKey) {\n\t\t\t\t\t\ttableConfig.primaryKey.push(...primaryKey);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!(dbName in relationsBuffer)) {\n\t\t\t\t\t\trelationsBuffer[dbName] = {\n\t\t\t\t\t\t\trelations: {},\n\t\t\t\t\t\t\tprimaryKey,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\trelationsBuffer[dbName]!.relations[relationName] = relation;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { tables: tablesConfig as TTables, tableNamesMap };\n}\n\nexport function relations<\n\tTTableName extends string,\n\tTRelations extends Record<string, Relation<any>>,\n>(\n\ttable: AnyTable<{ name: TTableName }>,\n\trelations: (helpers: TableRelationsHelpers<TTableName>) => TRelations,\n): Relations<TTableName, TRelations> {\n\treturn new Relations<TTableName, TRelations>(\n\t\ttable,\n\t\t(helpers: TableRelationsHelpers<TTableName>) =>\n\t\t\tObject.fromEntries(\n\t\t\t\tObject.entries(relations(helpers)).map(([key, value]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue.withFieldName(key),\n\t\t\t\t]),\n\t\t\t) as TRelations,\n\t);\n}\n\nexport function createOne<TTableName extends string>(sourceTable: Table) {\n\treturn function one<\n\t\tTForeignTable extends Table,\n\t\tTColumns extends [\n\t\t\tAnyColumn<{ tableName: TTableName }>,\n\t\t\t...AnyColumn<{ tableName: TTableName }>[],\n\t\t],\n\t>(\n\t\ttable: TForeignTable,\n\t\tconfig?: RelationConfig<TTableName, TForeignTable['_']['name'], TColumns>,\n\t): One<\n\t\tTForeignTable['_']['name'],\n\t\tEqual<TColumns[number]['_']['notNull'], true>\n\t> {\n\t\treturn new One(\n\t\t\tsourceTable,\n\t\t\ttable,\n\t\t\tconfig,\n\t\t\t(config?.fields.reduce<boolean>((res, f) => res && f.notNull, true)\n\t\t\t\t?? false) as Equal<TColumns[number]['_']['notNull'], true>,\n\t\t);\n\t};\n}\n\nexport function createMany(sourceTable: Table) {\n\treturn function many<TForeignTable extends Table>(\n\t\treferencedTable: TForeignTable,\n\t\tconfig?: { relationName: string },\n\t): Many<TForeignTable['_']['name']> {\n\t\treturn new Many(sourceTable, referencedTable, config);\n\t};\n}\n\nexport interface NormalizedRelation {\n\tfields: AnyColumn[];\n\treferences: AnyColumn[];\n}\n\nexport function normalizeRelation(\n\tschema: TablesRelationalConfig,\n\ttableNamesMap: Record<string, string>,\n\trelation: Relation,\n): NormalizedRelation {\n\tif (is(relation, One) && relation.config) {\n\t\treturn {\n\t\t\tfields: relation.config.fields,\n\t\t\treferences: relation.config.references,\n\t\t};\n\t}\n\n\tconst referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];\n\tif (!referencedTableTsName) {\n\t\tthrow new Error(\n\t\t\t`Table \"${relation.referencedTable[Table.Symbol.Name]}\" not found in schema`,\n\t\t);\n\t}\n\n\tconst referencedTableConfig = schema[referencedTableTsName];\n\tif (!referencedTableConfig) {\n\t\tthrow new Error(`Table \"${referencedTableTsName}\" not found in schema`);\n\t}\n\n\tconst sourceTable = relation.sourceTable;\n\tconst sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];\n\tif (!sourceTableTsName) {\n\t\tthrow new Error(\n\t\t\t`Table \"${sourceTable[Table.Symbol.Name]}\" not found in schema`,\n\t\t);\n\t}\n\n\tconst reverseRelations: Relation[] = [];\n\tfor (\n\t\tconst referencedTableRelation of Object.values(\n\t\t\treferencedTableConfig.relations,\n\t\t)\n\t) {\n\t\tif (\n\t\t\t(relation.relationName\n\t\t\t\t&& relation !== referencedTableRelation\n\t\t\t\t&& referencedTableRelation.relationName === relation.relationName)\n\t\t\t|| (!relation.relationName\n\t\t\t\t&& referencedTableRelation.referencedTable === relation.sourceTable)\n\t\t) {\n\t\t\treverseRelations.push(referencedTableRelation);\n\t\t}\n\t}\n\n\tif (reverseRelations.length > 1) {\n\t\tthrow relation.relationName\n\t\t\t? new Error(\n\t\t\t\t`There are multiple relations with name \"${relation.relationName}\" in table \"${referencedTableTsName}\"`,\n\t\t\t)\n\t\t\t: new Error(\n\t\t\t\t`There are multiple relations between \"${referencedTableTsName}\" and \"${\n\t\t\t\t\trelation.sourceTable[Table.Symbol.Name]\n\t\t\t\t}\". Please specify relation name`,\n\t\t\t);\n\t}\n\n\tif (\n\t\treverseRelations[0]\n\t\t&& is(reverseRelations[0], One)\n\t\t&& reverseRelations[0].config\n\t) {\n\t\treturn {\n\t\t\tfields: reverseRelations[0].config.references,\n\t\t\treferences: reverseRelations[0].config.fields,\n\t\t};\n\t}\n\n\tthrow new Error(\n\t\t`There is not enough information to infer relation \"${sourceTableTsName}.${relation.fieldName}\"`,\n\t);\n}\n\nexport function createTableRelationsHelpers<TTableName extends string>(\n\tsourceTable: AnyTable<{ name: TTableName }>,\n) {\n\treturn {\n\t\tone: createOne<TTableName>(sourceTable),\n\t\tmany: createMany(sourceTable),\n\t};\n}\n\nexport type TableRelationsHelpers<TTableName extends string> = ReturnType<\n\ttypeof createTableRelationsHelpers<TTableName>\n>;\n\nexport interface BuildRelationalQueryResult<\n\tTTable extends Table = Table,\n\tTColumn extends Column = Column,\n> {\n\ttableTsKey: string;\n\tselection: {\n\t\tdbKey: string;\n\t\ttsKey: string;\n\t\tfield: TColumn | SQL | SQL.Aliased;\n\t\trelationTableTsKey: string | undefined;\n\t\tisJson: boolean;\n\t\tisExtra?: boolean;\n\t\tselection: BuildRelationalQueryResult<TTable>['selection'];\n\t}[];\n\tsql: TTable | SQL;\n}\n\nexport function mapRelationalRow(\n\ttablesConfig: TablesRelationalConfig,\n\ttableConfig: TableRelationalConfig,\n\trow: unknown[],\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n): Record<string, unknown> {\n\tconst result: Record<string, unknown> = {};\n\n\tfor (\n\t\tconst [\n\t\t\tselectionItemIndex,\n\t\t\tselectionItem,\n\t\t] of buildQueryResultSelection.entries()\n\t) {\n\t\tif (selectionItem.isJson) {\n\t\t\tconst relation = tableConfig.relations[selectionItem.tsKey]!;\n\t\t\tconst rawSubRows = row[selectionItemIndex] as\n\t\t\t\t| unknown[]\n\t\t\t\t| null\n\t\t\t\t| [null]\n\t\t\t\t| string;\n\t\t\tconst subRows = typeof rawSubRows === 'string'\n\t\t\t\t? (JSON.parse(rawSubRows) as unknown[])\n\t\t\t\t: rawSubRows;\n\t\t\tresult[selectionItem.tsKey] = is(relation, One)\n\t\t\t\t? subRows\n\t\t\t\t\t&& mapRelationalRow(\n\t\t\t\t\t\ttablesConfig,\n\t\t\t\t\t\ttablesConfig[selectionItem.relationTableTsKey!]!,\n\t\t\t\t\t\tsubRows,\n\t\t\t\t\t\tselectionItem.selection,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t)\n\t\t\t\t: (subRows as unknown[][]).map((subRow) =>\n\t\t\t\t\tmapRelationalRow(\n\t\t\t\t\t\ttablesConfig,\n\t\t\t\t\t\ttablesConfig[selectionItem.relationTableTsKey!]!,\n\t\t\t\t\t\tsubRow,\n\t\t\t\t\t\tselectionItem.selection,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t} else {\n\t\t\tconst value = mapColumnValue(row[selectionItemIndex]);\n\t\t\tconst field = selectionItem.field!;\n\t\t\tlet decoder;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tresult[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);\n\t\t}\n\t}\n\n\treturn result;\n}\n"
  },
  {
    "path": "drizzle-orm/src/runnable-query.ts",
    "content": "import type { Dialect } from './column-builder.ts';\nimport type { PreparedQuery } from './session.ts';\n\nexport interface RunnableQuery<T, TDialect extends Dialect> {\n\treadonly _: {\n\t\treadonly dialect: TDialect;\n\t\treadonly result: T;\n\t};\n\n\t/** @internal */\n\t_prepare(): PreparedQuery;\n}\n"
  },
  {
    "path": "drizzle-orm/src/selection-proxy.ts",
    "content": "import { ColumnAliasProxyHandler, TableAliasProxyHandler } from './alias.ts';\nimport { Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { SQL, View } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\nexport class SelectionProxyHandler<T extends Subquery | Record<string, unknown> | View>\n\timplements ProxyHandler<Subquery | Record<string, unknown> | View>\n{\n\tstatic readonly [entityKind]: string = 'SelectionProxyHandler';\n\n\tprivate config: {\n\t\t/**\n\t\t * Table alias for the columns\n\t\t */\n\t\talias?: string;\n\t\t/**\n\t\t * What to do when a field is an instance of `SQL.Aliased` and it's not a selection field (from a subquery)\n\t\t *\n\t\t * `sql` - return the underlying SQL expression\n\t\t *\n\t\t * `alias` - return the field alias\n\t\t */\n\t\tsqlAliasedBehavior: 'sql' | 'alias';\n\t\t/**\n\t\t * What to do when a field is an instance of `SQL` and it doesn't have an alias declared\n\t\t *\n\t\t * `sql` - return the underlying SQL expression\n\t\t *\n\t\t * `error` - return a DrizzleTypeError on type level and throw an error on runtime\n\t\t */\n\t\tsqlBehavior: 'sql' | 'error';\n\n\t\t/**\n\t\t * Whether to replace the original name of the column with the alias\n\t\t * Should be set to `true` for views creation\n\t\t * @default false\n\t\t */\n\t\treplaceOriginalName?: boolean;\n\t};\n\n\tconstructor(config: SelectionProxyHandler<T>['config']) {\n\t\tthis.config = { ...config };\n\t}\n\n\tget(subquery: T, prop: string | symbol): any {\n\t\tif (prop === '_') {\n\t\t\treturn {\n\t\t\t\t...subquery['_' as keyof typeof subquery],\n\t\t\t\tselectedFields: new Proxy(\n\t\t\t\t\t(subquery as Subquery)._.selectedFields,\n\t\t\t\t\tthis as ProxyHandler<Record<string, unknown>>,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tif (prop === ViewBaseConfig) {\n\t\t\treturn {\n\t\t\t\t...subquery[ViewBaseConfig as keyof typeof subquery],\n\t\t\t\tselectedFields: new Proxy(\n\t\t\t\t\t(subquery as View)[ViewBaseConfig].selectedFields,\n\t\t\t\t\tthis as ProxyHandler<Record<string, unknown>>,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tif (typeof prop === 'symbol') {\n\t\t\treturn subquery[prop as keyof typeof subquery];\n\t\t}\n\n\t\tconst columns = is(subquery, Subquery)\n\t\t\t? subquery._.selectedFields\n\t\t\t: is(subquery, View)\n\t\t\t? subquery[ViewBaseConfig].selectedFields\n\t\t\t: subquery;\n\t\tconst value: unknown = columns[prop as keyof typeof columns];\n\n\t\tif (is(value, SQL.Aliased)) {\n\t\t\t// Never return the underlying SQL expression for a field previously selected in a subquery\n\t\t\tif (this.config.sqlAliasedBehavior === 'sql' && !value.isSelectionField) {\n\t\t\t\treturn value.sql;\n\t\t\t}\n\n\t\t\tconst newValue = value.clone();\n\t\t\tnewValue.isSelectionField = true;\n\t\t\treturn newValue;\n\t\t}\n\n\t\tif (is(value, SQL)) {\n\t\t\tif (this.config.sqlBehavior === 'sql') {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tthrow new Error(\n\t\t\t\t`You tried to reference \"${prop}\" field from a subquery, which is a raw SQL field, but it doesn't have an alias declared. Please add an alias to the field using \".as('alias')\" method.`,\n\t\t\t);\n\t\t}\n\n\t\tif (is(value, Column)) {\n\t\t\tif (this.config.alias) {\n\t\t\t\treturn new Proxy(\n\t\t\t\t\tvalue,\n\t\t\t\t\tnew ColumnAliasProxyHandler(\n\t\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\t\tvalue.table,\n\t\t\t\t\t\t\tnew TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\n\t\tif (typeof value !== 'object' || value === null) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn new Proxy(value, new SelectionProxyHandler(this.config));\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/session.ts",
    "content": "import type { Query } from './index.ts';\n\nexport interface PreparedQuery {\n\tgetQuery(): Query;\n\tmapResult(response: unknown, isFromBatch?: boolean): unknown;\n\t/** @internal */\n\tisResponseInArrayMode(): boolean;\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore/driver.ts",
    "content": "import { type Connection as CallbackConnection, createPool, type Pool as CallbackPool, type PoolOptions } from 'mysql2';\nimport type { Connection, Pool } from 'mysql2/promise';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { SingleStoreDatabase } from '~/singlestore-core/db.ts';\nimport { SingleStoreDialect } from '~/singlestore-core/dialect.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { npmVersion } from '~/version.ts';\nimport type {\n\tSingleStoreDriverClient,\n\tSingleStoreDriverPreparedQueryHKT,\n\tSingleStoreDriverQueryResultHKT,\n} from './session.ts';\nimport { SingleStoreDriverSession } from './session.ts';\n\nexport interface SingleStoreDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class SingleStoreDriverDriver {\n\tstatic readonly [entityKind]: string = 'SingleStoreDriverDriver';\n\n\tconstructor(\n\t\tprivate client: SingleStoreDriverClient,\n\t\tprivate dialect: SingleStoreDialect,\n\t\tprivate options: SingleStoreDriverOptions = {},\n\t) {\n\t}\n\n\tcreateSession(\n\t\tschema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,\n\t): SingleStoreDriverSession<Record<string, unknown>, TablesRelationalConfig> {\n\t\treturn new SingleStoreDriverSession(this.client, this.dialect, schema, {\n\t\t\tlogger: this.options.logger,\n\t\t\tcache: this.options.cache,\n\t\t});\n\t}\n}\n\nexport { SingleStoreDatabase } from '~/singlestore-core/db.ts';\n\nexport class SingleStoreDriverDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends SingleStoreDatabase<SingleStoreDriverQueryResultHKT, SingleStoreDriverPreparedQueryHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreDriverDatabase';\n}\n\nexport type SingleStoreDriverDrizzleConfig<TSchema extends Record<string, unknown> = Record<string, never>> =\n\t& Omit<DrizzleConfig<TSchema>, 'schema'>\n\t& ({ schema: TSchema } | { schema?: undefined });\n\nfunction construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Pool | Connection | CallbackPool | CallbackConnection = CallbackPool,\n>(\n\tclient: TClient,\n\tconfig: SingleStoreDriverDrizzleConfig<TSchema> = {},\n): SingleStoreDriverDatabase<TSchema> & {\n\t$client: AnySingleStoreDriverConnection extends TClient ? CallbackPool : TClient;\n} {\n\tconst dialect = new SingleStoreDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tconst clientForInstance = isCallbackClient(client) ? client.promise() : client;\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst driver = new SingleStoreDriverDriver(clientForInstance as SingleStoreDriverClient, dialect, {\n\t\tlogger,\n\t\tcache: config.cache,\n\t});\n\tconst session = driver.createSession(schema);\n\tconst db = new SingleStoreDriverDatabase(dialect, session, schema as any) as SingleStoreDriverDatabase<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\ninterface CallbackClient {\n\tpromise(): SingleStoreDriverClient;\n}\n\nfunction isCallbackClient(client: any): client is CallbackClient {\n\treturn typeof client.promise === 'function';\n}\n\nexport type AnySingleStoreDriverConnection = Pool | Connection | CallbackPool | CallbackConnection;\n\nconst CONNECTION_ATTRS: PoolOptions['connectAttributes'] = {\n\t_connector_name: 'SingleStore Drizzle ORM Driver',\n\t_connector_version: npmVersion,\n};\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends AnySingleStoreDriverConnection = CallbackPool,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tSingleStoreDriverDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& SingleStoreDriverDrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | PoolOptions;\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): SingleStoreDriverDatabase<TSchema> & {\n\t$client: AnySingleStoreDriverConnection extends TClient ? CallbackPool : TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst connectionString = params[0]!;\n\t\tconst instance = createPool({\n\t\t\turi: connectionString,\n\t\t\tconnectAttributes: CONNECTION_ATTRS,\n\t\t});\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& { connection?: PoolOptions | string; client?: TClient }\n\t\t\t& SingleStoreDriverDrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tlet opts: PoolOptions = {};\n\t\topts = typeof connection === 'string'\n\t\t\t? {\n\t\t\t\turi: connection,\n\t\t\t\tsupportBigNumbers: true,\n\t\t\t\tconnectAttributes: CONNECTION_ATTRS,\n\t\t\t}\n\t\t\t: {\n\t\t\t\t...connection,\n\t\t\t\tconnectAttributes: {\n\t\t\t\t\t...connection!.connectAttributes,\n\t\t\t\t\t...CONNECTION_ATTRS,\n\t\t\t\t},\n\t\t\t};\n\n\t\tconst instance = createPool(opts);\n\t\tconst db = construct(instance, drizzleConfig);\n\n\t\treturn db as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as SingleStoreDriverDrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: SingleStoreDriverDrizzleConfig<TSchema>,\n\t): SingleStoreDriverDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/singlestore/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { SingleStoreDriverDatabase } from './driver.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: SingleStoreDriverDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tawait db.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore/session.ts",
    "content": "import type { Connection as CallbackConnection } from 'mysql2';\nimport type {\n\tConnection,\n\tFieldPacket,\n\tOkPacket,\n\tPool,\n\tPoolConnection,\n\tQueryOptions,\n\tResultSetHeader,\n\tRowDataPacket,\n} from 'mysql2/promise';\nimport { once } from 'node:events';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport type { SingleStoreDialect } from '~/singlestore-core/dialect.ts';\nimport type { SelectedFieldsOrdered } from '~/singlestore-core/query-builders/select.types.ts';\nimport {\n\ttype PreparedQueryKind,\n\tSingleStorePreparedQuery,\n\ttype SingleStorePreparedQueryConfig,\n\ttype SingleStorePreparedQueryHKT,\n\ttype SingleStoreQueryResultHKT,\n\tSingleStoreSession,\n\tSingleStoreTransaction,\n\ttype SingleStoreTransactionConfig,\n} from '~/singlestore-core/session.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport { fillPlaceholders, sql } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nexport type SingleStoreDriverClient = Pool | Connection;\n\nexport type SingleStoreRawQueryResult = [ResultSetHeader, FieldPacket[]];\nexport type SingleStoreQueryResultType = RowDataPacket[][] | RowDataPacket[] | OkPacket | OkPacket[] | ResultSetHeader;\nexport type SingleStoreQueryResult<\n\tT = any,\n> = [T extends ResultSetHeader ? T : T[], FieldPacket[]];\n\nexport class SingleStoreDriverPreparedQuery<T extends SingleStorePreparedQueryConfig>\n\textends SingleStorePreparedQuery<T>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreDriverPreparedQuery';\n\n\tprivate rawQuery: QueryOptions;\n\tprivate query: QueryOptions;\n\n\tconstructor(\n\t\tprivate client: SingleStoreDriverClient,\n\t\tqueryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\t// Keys that were used in $default and the value that was generated for them\n\t\tprivate generatedIds?: Record<string, unknown>[],\n\t\t// Keys that should be returned, it has the column with all properties + key from object\n\t\tprivate returningIds?: SelectedFieldsOrdered,\n\t) {\n\t\tsuper(cache, queryMetadata, cacheConfig);\n\t\tthis.rawQuery = {\n\t\t\tsql: queryString,\n\t\t\t// rowsAsArray: true,\n\t\t\ttypeCast: function(field: any, next: any) {\n\t\t\t\tif (field.type === 'TIMESTAMP' || field.type === 'DATETIME' || field.type === 'DATE') {\n\t\t\t\t\treturn field.string();\n\t\t\t\t}\n\t\t\t\treturn next();\n\t\t\t},\n\t\t};\n\t\tthis.query = {\n\t\t\tsql: queryString,\n\t\t\trowsAsArray: true,\n\t\t\ttypeCast: function(field: any, next: any) {\n\t\t\t\tif (field.type === 'TIMESTAMP' || field.type === 'DATETIME' || field.type === 'DATE') {\n\t\t\t\t\treturn field.string();\n\t\t\t\t}\n\t\t\t\treturn next();\n\t\t\t},\n\t\t};\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\tthis.logger.logQuery(this.rawQuery.sql, params);\n\n\t\tconst { fields, client, rawQuery, query, joinsNotNullableMap, customResultMapper, returningIds, generatedIds } =\n\t\t\tthis;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst res = await this.queryWithCache(rawQuery.sql, params, async () => {\n\t\t\t\treturn await client.query<any>(rawQuery, params);\n\t\t\t});\n\t\t\tconst insertId = res[0].insertId;\n\t\t\tconst affectedRows = res[0].affectedRows;\n\t\t\t// for each row, I need to check keys from\n\t\t\tif (returningIds) {\n\t\t\t\tconst returningResponse = [];\n\t\t\t\tlet j = 0;\n\t\t\t\tfor (let i = insertId; i < insertId + affectedRows; i++) {\n\t\t\t\t\tfor (const column of returningIds) {\n\t\t\t\t\t\tconst key = returningIds[0]!.path[0]!;\n\t\t\t\t\t\tif (is(column.field, Column)) {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tif (column.field.primary && column.field.autoIncrement) {\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: i });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (column.field.defaultFn && generatedIds) {\n\t\t\t\t\t\t\t\t// generatedIds[rowIdx][key]\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: generatedIds[j]![key] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tj++;\n\t\t\t\t}\n\n\t\t\t\treturn returningResponse;\n\t\t\t}\n\t\t\treturn res;\n\t\t}\n\n\t\tconst result = await this.queryWithCache(query.sql, params, async () => {\n\t\t\treturn await client.query<any[]>(query, params);\n\t\t});\n\t\tconst rows = result[0];\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows);\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t}\n\n\tasync *iterator(\n\t\tplaceholderValues: Record<string, unknown> = {},\n\t): AsyncGenerator<T['execute'] extends any[] ? T['execute'][number] : T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\t\tconst conn = ((isPool(this.client) ? await this.client.getConnection() : this.client) as {} as {\n\t\t\tconnection: CallbackConnection;\n\t\t}).connection;\n\n\t\tconst { fields, query, rawQuery, joinsNotNullableMap, client, customResultMapper } = this;\n\t\tconst hasRowsMapper = Boolean(fields || customResultMapper);\n\t\tconst driverQuery = hasRowsMapper ? conn.query(query, params) : conn.query(rawQuery, params);\n\n\t\tconst stream = driverQuery.stream();\n\n\t\tfunction dataListener() {\n\t\t\tstream.pause();\n\t\t}\n\n\t\tstream.on('data', dataListener);\n\n\t\ttry {\n\t\t\tconst onEnd = once(stream, 'end');\n\t\t\tconst onError = once(stream, 'error');\n\n\t\t\twhile (true) {\n\t\t\t\tstream.resume();\n\t\t\t\tconst row = await Promise.race([onEnd, onError, new Promise((resolve) => stream.once('data', resolve))]);\n\t\t\t\tif (row === undefined || (Array.isArray(row) && row.length === 0)) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (row instanceof Error) { // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t\t\tthrow row;\n\t\t\t\t} else {\n\t\t\t\t\tif (hasRowsMapper) {\n\t\t\t\t\t\tif (customResultMapper) {\n\t\t\t\t\t\t\tconst mappedRow = customResultMapper([row as unknown[]]);\n\t\t\t\t\t\t\tyield (Array.isArray(mappedRow) ? mappedRow[0] : mappedRow);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tyield mapResultRow(fields!, row as unknown[], joinsNotNullableMap);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tyield row as T['execute'];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tstream.off('data', dataListener);\n\t\t\tif (isPool(client)) {\n\t\t\t\tconn.end();\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport interface SingleStoreDriverSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class SingleStoreDriverSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SingleStoreSession<SingleStoreQueryResultHKT, SingleStoreDriverPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreDriverSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: SingleStoreDriverClient,\n\t\tdialect: SingleStoreDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: SingleStoreDriverSessionOptions,\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends SingleStorePreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tgeneratedIds?: Record<string, unknown>[],\n\t\treturningIds?: SelectedFieldsOrdered,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PreparedQueryKind<SingleStoreDriverPreparedQueryHKT, T> {\n\t\t// Add returningId fields\n\t\t// Each driver gets them from response from database\n\t\treturn new SingleStoreDriverPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tcustomResultMapper,\n\t\t\tgeneratedIds,\n\t\t\treturningIds,\n\t\t) as PreparedQueryKind<SingleStoreDriverPreparedQueryHKT, T>;\n\t}\n\n\t/**\n\t * @internal\n\t * What is its purpose?\n\t */\n\tasync query(query: string, params: unknown[]): Promise<SingleStoreQueryResult> {\n\t\tthis.logger.logQuery(query, params);\n\t\tconst result = await this.client.query({\n\t\t\tsql: query,\n\t\t\tvalues: params,\n\t\t\trowsAsArray: true,\n\t\t\ttypeCast: function(field: any, next: any) {\n\t\t\t\tif (field.type === 'TIMESTAMP' || field.type === 'DATETIME' || field.type === 'DATE') {\n\t\t\t\t\treturn field.string();\n\t\t\t\t}\n\t\t\t\treturn next();\n\t\t\t},\n\t\t});\n\t\treturn result;\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\tconst querySql = this.dialect.sqlToQuery(query);\n\t\tthis.logger.logQuery(querySql.sql, querySql.params);\n\t\treturn this.client.execute(querySql.sql, querySql.params).then((result) => result[0]) as Promise<T[]>;\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: SingleStoreDriverTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: SingleStoreTransactionConfig,\n\t): Promise<T> {\n\t\tconst session = isPool(this.client)\n\t\t\t? new SingleStoreDriverSession(\n\t\t\t\tawait this.client.getConnection(),\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.options,\n\t\t\t)\n\t\t\t: this;\n\t\tconst tx = new SingleStoreDriverTransaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tsession as SingleStoreSession<any, any, any, any>,\n\t\t\tthis.schema,\n\t\t\t0,\n\t\t);\n\t\tif (config) {\n\t\t\tconst setTransactionConfigSql = this.getSetTransactionSQL(config);\n\t\t\tif (setTransactionConfigSql) {\n\t\t\t\tawait tx.execute(setTransactionConfigSql);\n\t\t\t}\n\t\t\tconst startTransactionSql = this.getStartTransactionSQL(config);\n\t\t\tawait (startTransactionSql ? tx.execute(startTransactionSql) : tx.execute(sql`begin`));\n\t\t} else {\n\t\t\tawait tx.execute(sql`begin`);\n\t\t}\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql`rollback`);\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tif (isPool(this.client)) {\n\t\t\t\t(session.client as PoolConnection).release();\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport class SingleStoreDriverTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SingleStoreTransaction<\n\tSingleStoreDriverQueryResultHKT,\n\tSingleStoreDriverPreparedQueryHKT,\n\tTFullSchema,\n\tTSchema\n> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreDriverTransaction';\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: SingleStoreDriverTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new SingleStoreDriverTransaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\t\tawait tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nfunction isPool(client: SingleStoreDriverClient): client is Pool {\n\treturn 'getConnection' in client;\n}\n\nexport interface SingleStoreDriverQueryResultHKT extends SingleStoreQueryResultHKT {\n\ttype: SingleStoreRawQueryResult;\n}\n\nexport interface SingleStoreDriverPreparedQueryHKT extends SingleStorePreparedQueryHKT {\n\ttype: SingleStoreDriverPreparedQuery<Assume<this['config'], SingleStorePreparedQueryConfig>>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/alias.ts",
    "content": "import { TableAliasProxyHandler } from '~/alias.ts';\nimport type { BuildAliasTable } from './query-builders/select.types.ts';\nimport type { SingleStoreTable } from './table.ts';\n\nexport function alias<TTable extends SingleStoreTable, TAlias extends string>( // | SingleStoreViewBase\n\ttable: TTable,\n\talias: TAlias,\n): BuildAliasTable<TTable, TAlias> {\n\treturn new Proxy(table, new TableAliasProxyHandler(alias, false)) as any;\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/all.ts",
    "content": "import { bigint } from './bigint.ts';\nimport { binary } from './binary.ts';\nimport { boolean } from './boolean.ts';\nimport { char } from './char.ts';\nimport { customType } from './custom.ts';\nimport { date } from './date.ts';\nimport { datetime } from './datetime.ts';\nimport { decimal } from './decimal.ts';\nimport { double } from './double.ts';\nimport { singlestoreEnum } from './enum.ts';\nimport { float } from './float.ts';\nimport { int } from './int.ts';\nimport { json } from './json.ts';\nimport { mediumint } from './mediumint.ts';\nimport { real } from './real.ts';\nimport { serial } from './serial.ts';\nimport { smallint } from './smallint.ts';\nimport { longtext, mediumtext, text, tinytext } from './text.ts';\nimport { time } from './time.ts';\nimport { timestamp } from './timestamp.ts';\nimport { tinyint } from './tinyint.ts';\nimport { varbinary } from './varbinary.ts';\nimport { varchar } from './varchar.ts';\nimport { vector } from './vector.ts';\nimport { year } from './year.ts';\n\nexport function getSingleStoreColumnBuilders() {\n\treturn {\n\t\tbigint,\n\t\tbinary,\n\t\tboolean,\n\t\tchar,\n\t\tcustomType,\n\t\tdate,\n\t\tdatetime,\n\t\tdecimal,\n\t\tdouble,\n\t\tsinglestoreEnum,\n\t\tfloat,\n\t\tint,\n\t\tjson,\n\t\tmediumint,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\tlongtext,\n\t\tmediumtext,\n\t\ttext,\n\t\ttinytext,\n\t\ttime,\n\t\ttimestamp,\n\t\ttinyint,\n\t\tvarbinary,\n\t\tvarchar,\n\t\tvector,\n\t\tyear,\n\t};\n}\n\nexport type SingleStoreColumnBuilders = ReturnType<typeof getSingleStoreColumnBuilders>;\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/bigint.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumnBuilderWithAutoIncrement, SingleStoreColumnWithAutoIncrement } from './common.ts';\n\nexport type SingleStoreBigInt53BuilderInitial<TName extends string> = SingleStoreBigInt53Builder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SingleStoreBigInt53';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class SingleStoreBigInt53Builder<T extends ColumnBuilderBaseConfig<'number', 'SingleStoreBigInt53'>>\n\textends SingleStoreColumnBuilderWithAutoIncrement<T, { unsigned: boolean }>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreBigInt53Builder';\n\n\tconstructor(name: T['name'], unsigned: boolean = false) {\n\t\tsuper(name, 'number', 'SingleStoreBigInt53');\n\t\tthis.config.unsigned = unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreBigInt53<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreBigInt53<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreBigInt53<T extends ColumnBaseConfig<'number', 'SingleStoreBigInt53'>>\n\textends SingleStoreColumnWithAutoIncrement<T, { unsigned: boolean }>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreBigInt53';\n\n\tgetSQLType(): string {\n\t\treturn `bigint${this.config.unsigned ? ' unsigned' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'number') {\n\t\t\treturn value;\n\t\t}\n\t\treturn Number(value);\n\t}\n}\n\nexport type SingleStoreBigInt64BuilderInitial<TName extends string> = SingleStoreBigInt64Builder<{\n\tname: TName;\n\tdataType: 'bigint';\n\tcolumnType: 'SingleStoreBigInt64';\n\tdata: bigint;\n\tdriverParam: string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreBigInt64Builder<T extends ColumnBuilderBaseConfig<'bigint', 'SingleStoreBigInt64'>>\n\textends SingleStoreColumnBuilderWithAutoIncrement<T, { unsigned: boolean }>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreBigInt64Builder';\n\n\tconstructor(name: T['name'], unsigned: boolean = false) {\n\t\tsuper(name, 'bigint', 'SingleStoreBigInt64');\n\t\tthis.config.unsigned = unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreBigInt64<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreBigInt64<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreBigInt64<T extends ColumnBaseConfig<'bigint', 'SingleStoreBigInt64'>>\n\textends SingleStoreColumnWithAutoIncrement<T, { unsigned: boolean }>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreBigInt64';\n\n\tgetSQLType(): string {\n\t\treturn `bigint${this.config.unsigned ? ' unsigned' : ''}`;\n\t}\n\n\t// eslint-disable-next-line unicorn/prefer-native-coercion-functions\n\toverride mapFromDriverValue(value: string): bigint {\n\t\treturn BigInt(value);\n\t}\n}\n\nexport interface SingleStoreBigIntConfig<T extends 'number' | 'bigint' = 'number' | 'bigint'> {\n\tmode: T;\n\tunsigned?: boolean;\n}\n\nexport function bigint<TMode extends SingleStoreBigIntConfig['mode']>(\n\tconfig: SingleStoreBigIntConfig<TMode>,\n): TMode extends 'number' ? SingleStoreBigInt53BuilderInitial<''> : SingleStoreBigInt64BuilderInitial<''>;\nexport function bigint<TName extends string, TMode extends SingleStoreBigIntConfig['mode']>(\n\tname: TName,\n\tconfig: SingleStoreBigIntConfig<TMode>,\n): TMode extends 'number' ? SingleStoreBigInt53BuilderInitial<TName> : SingleStoreBigInt64BuilderInitial<TName>;\nexport function bigint(a?: string | SingleStoreBigIntConfig, b?: SingleStoreBigIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreBigIntConfig>(a, b);\n\tif (config.mode === 'number') {\n\t\treturn new SingleStoreBigInt53Builder(name, config.unsigned);\n\t}\n\treturn new SingleStoreBigInt64Builder(name, config.unsigned);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/binary.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport type SingleStoreBinaryBuilderInitial<TName extends string> = SingleStoreBinaryBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SingleStoreBinary';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreBinaryBuilder<T extends ColumnBuilderBaseConfig<'string', 'SingleStoreBinary'>>\n\textends SingleStoreColumnBuilder<\n\t\tT,\n\t\tSingleStoreBinaryConfig\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreBinaryBuilder';\n\n\tconstructor(name: T['name'], length: number | undefined) {\n\t\tsuper(name, 'string', 'SingleStoreBinary');\n\t\tthis.config.length = length;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreBinary<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreBinary<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreBinary<T extends ColumnBaseConfig<'string', 'SingleStoreBinary'>> extends SingleStoreColumn<\n\tT,\n\tSingleStoreBinaryConfig\n> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreBinary';\n\n\tlength: number | undefined = this.config.length;\n\n\toverride mapFromDriverValue(value: string | Buffer | Uint8Array): string {\n\t\tif (typeof value === 'string') return value;\n\t\tif (Buffer.isBuffer(value)) return value.toString();\n\n\t\tconst str: string[] = [];\n\t\tfor (const v of value) {\n\t\t\tstr.push(v === 49 ? '1' : '0');\n\t\t}\n\n\t\treturn str.join('');\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `binary` : `binary(${this.length})`;\n\t}\n}\n\nexport interface SingleStoreBinaryConfig {\n\tlength?: number;\n}\n\nexport function binary(): SingleStoreBinaryBuilderInitial<''>;\nexport function binary(\n\tconfig?: SingleStoreBinaryConfig,\n): SingleStoreBinaryBuilderInitial<''>;\nexport function binary<TName extends string>(\n\tname: TName,\n\tconfig?: SingleStoreBinaryConfig,\n): SingleStoreBinaryBuilderInitial<TName>;\nexport function binary(a?: string | SingleStoreBinaryConfig, b: SingleStoreBinaryConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreBinaryConfig>(a, b);\n\treturn new SingleStoreBinaryBuilder(name, config.length);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/boolean.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport type SingleStoreBooleanBuilderInitial<TName extends string> = SingleStoreBooleanBuilder<{\n\tname: TName;\n\tdataType: 'boolean';\n\tcolumnType: 'SingleStoreBoolean';\n\tdata: boolean;\n\tdriverParam: number | boolean;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreBooleanBuilder<T extends ColumnBuilderBaseConfig<'boolean', 'SingleStoreBoolean'>>\n\textends SingleStoreColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreBooleanBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'boolean', 'SingleStoreBoolean');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreBoolean<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreBoolean<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreBoolean<T extends ColumnBaseConfig<'boolean', 'SingleStoreBoolean'>>\n\textends SingleStoreColumn<T>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreBoolean';\n\n\tgetSQLType(): string {\n\t\treturn 'boolean';\n\t}\n\n\toverride mapFromDriverValue(value: number | boolean): boolean {\n\t\tif (typeof value === 'boolean') {\n\t\t\treturn value;\n\t\t}\n\t\treturn value === 1;\n\t}\n}\n\nexport function boolean(): SingleStoreBooleanBuilderInitial<''>;\nexport function boolean<TName extends string>(name: TName): SingleStoreBooleanBuilderInitial<TName>;\nexport function boolean(name?: string) {\n\treturn new SingleStoreBooleanBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/char.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport type SingleStoreCharBuilderInitial<\n\tTName extends string,\n\tTEnum extends [string, ...string[]],\n\tTLength extends number | undefined,\n> = SingleStoreCharBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SingleStoreChar';\n\tdata: TEnum[number];\n\tdriverParam: number | string;\n\tenumValues: TEnum;\n\tgenerated: undefined;\n\tlength: TLength;\n}>;\n\nexport class SingleStoreCharBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'SingleStoreChar'> & { length?: number | undefined },\n> extends SingleStoreColumnBuilder<\n\tT,\n\tSingleStoreCharConfig<T['enumValues'], T['length']>,\n\t{ length: T['length'] }\n> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreCharBuilder';\n\n\tconstructor(name: T['name'], config: SingleStoreCharConfig<T['enumValues'], T['length']>) {\n\t\tsuper(name, 'string', 'SingleStoreChar');\n\t\tthis.config.length = config.length;\n\t\tthis.config.enum = config.enum;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreChar<MakeColumnConfig<T, TTableName> & { length: T['length']; enumValues: T['enumValues'] }> {\n\t\treturn new SingleStoreChar<MakeColumnConfig<T, TTableName> & { length: T['length']; enumValues: T['enumValues'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreChar<T extends ColumnBaseConfig<'string', 'SingleStoreChar'> & { length?: number | undefined }>\n\textends SingleStoreColumn<T, SingleStoreCharConfig<T['enumValues'], T['length']>, { length: T['length'] }>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreChar';\n\n\treadonly length: T['length'] = this.config.length;\n\toverride readonly enumValues = this.config.enum;\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `char` : `char(${this.length})`;\n\t}\n}\n\nexport interface SingleStoreCharConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n\tTLength extends number | undefined = number | undefined,\n> {\n\tenum?: TEnum;\n\tlength?: TLength;\n}\n\nexport function char(): SingleStoreCharBuilderInitial<'', [string, ...string[]], undefined>;\nexport function char<U extends string, T extends Readonly<[U, ...U[]]>, L extends number | undefined>(\n\tconfig?: SingleStoreCharConfig<T | Writable<T>, L>,\n): SingleStoreCharBuilderInitial<'', Writable<T>, L>;\nexport function char<\n\tTName extends string,\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n>(\n\tname: TName,\n\tconfig?: SingleStoreCharConfig<T | Writable<T>, L>,\n): SingleStoreCharBuilderInitial<TName, Writable<T>, L>;\nexport function char(a?: string | SingleStoreCharConfig, b: SingleStoreCharConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreCharConfig>(a, b);\n\treturn new SingleStoreCharBuilder(name, config as any);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/common.ts",
    "content": "import type {\n\tColumnBuilderBase,\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tHasDefault,\n\tIsAutoincrement,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport { ColumnBuilder } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable, SingleStoreTable } from '~/singlestore-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { Update } from '~/utils.ts';\nimport { uniqueKeyName } from '../unique-constraint.ts';\n\nexport interface SingleStoreColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> extends ColumnBuilderBase<T, TTypeConfig & { dialect: 'singlestore' }> {}\n\nexport interface SingleStoreGeneratedColumnConfig {\n\tmode?: 'virtual' | 'stored';\n}\n\nexport abstract class SingleStoreColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string> & {\n\t\tdata: any;\n\t},\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> extends ColumnBuilder<T, TRuntimeConfig, TTypeConfig & { dialect: 'singlestore' }, TExtraConfig>\n\timplements SingleStoreColumnBuilderBase<T, TTypeConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreColumnBuilder';\n\n\tunique(name?: string): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\treturn this;\n\t}\n\n\t// TODO: Implement generated columns for SingleStore (https://docs.singlestore.com/cloud/create-a-database/using-persistent-computed-columns/)\n\t/** @internal */\n\tgeneratedAlwaysAs(as: SQL | T['data'] | (() => SQL), config?: SingleStoreGeneratedColumnConfig) {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: config?.mode ?? 'virtual',\n\t\t};\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tabstract build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreColumn<MakeColumnConfig<T, TTableName>>;\n}\n\n// To understand how to use `SingleStoreColumn` and `AnySingleStoreColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class SingleStoreColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = {},\n\tTTypeConfig extends object = {},\n> extends Column<T, TRuntimeConfig, TTypeConfig & { dialect: 'singlestore' }> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreColumn';\n\n\tconstructor(\n\t\toverride readonly table: SingleStoreTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tif (!config.uniqueName) {\n\t\t\tconfig.uniqueName = uniqueKeyName(table, [config.name]);\n\t\t}\n\t\tsuper(table, config);\n\t}\n}\n\nexport type AnySingleStoreColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> =\n\tSingleStoreColumn<\n\t\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n\t>;\n\nexport interface SingleStoreColumnWithAutoIncrementConfig {\n\tautoIncrement: boolean;\n}\n\nexport abstract class SingleStoreColumnBuilderWithAutoIncrement<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> extends SingleStoreColumnBuilder<T, TRuntimeConfig & SingleStoreColumnWithAutoIncrementConfig, TExtraConfig> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreColumnBuilderWithAutoIncrement';\n\n\tconstructor(name: NonNullable<T['name']>, dataType: T['dataType'], columnType: T['columnType']) {\n\t\tsuper(name, dataType, columnType);\n\t\tthis.config.autoIncrement = false;\n\t}\n\n\tautoincrement(): IsAutoincrement<HasDefault<this>> {\n\t\tthis.config.autoIncrement = true;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as IsAutoincrement<HasDefault<this>>;\n\t}\n}\n\nexport abstract class SingleStoreColumnWithAutoIncrement<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n> extends SingleStoreColumn<T, SingleStoreColumnWithAutoIncrementConfig & TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreColumnWithAutoIncrement';\n\n\treadonly autoIncrement: boolean = this.config.autoIncrement;\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/custom.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport type ConvertCustomConfig<TName extends string, T extends Partial<CustomTypeValues>> =\n\t& {\n\t\tname: TName;\n\t\tdataType: 'custom';\n\t\tcolumnType: 'SingleStoreCustomColumn';\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverData'];\n\t\tenumValues: undefined;\n\t\tgenerated: undefined;\n\t}\n\t& (T['notNull'] extends true ? { notNull: true } : {})\n\t& (T['default'] extends true ? { hasDefault: true } : {});\n\nexport interface SingleStoreCustomColumnInnerConfig {\n\tcustomTypeValues: CustomTypeValues;\n}\n\nexport class SingleStoreCustomColumnBuilder<T extends ColumnBuilderBaseConfig<'custom', 'SingleStoreCustomColumn'>>\n\textends SingleStoreColumnBuilder<\n\t\tT,\n\t\t{\n\t\t\tfieldConfig: CustomTypeValues['config'];\n\t\t\tcustomTypeParams: CustomTypeParams<any>;\n\t\t},\n\t\t{\n\t\t\tsinglestoreColumnBuilderBrand: 'SingleStoreCustomColumnBuilderBrand';\n\t\t}\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreCustomColumnBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\tfieldConfig: CustomTypeValues['config'],\n\t\tcustomTypeParams: CustomTypeParams<any>,\n\t) {\n\t\tsuper(name, 'custom', 'SingleStoreCustomColumn');\n\t\tthis.config.fieldConfig = fieldConfig;\n\t\tthis.config.customTypeParams = customTypeParams;\n\t}\n\n\t/** @internal */\n\tbuild<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreCustomColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreCustomColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreCustomColumn<T extends ColumnBaseConfig<'custom', 'SingleStoreCustomColumn'>>\n\textends SingleStoreColumn<T>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreCustomColumn';\n\n\tprivate sqlName: string;\n\tprivate mapTo?: (value: T['data']) => T['driverParam'];\n\tprivate mapFrom?: (value: T['driverParam']) => T['data'];\n\n\tconstructor(\n\t\ttable: AnySingleStoreTable<{ name: T['tableName'] }>,\n\t\tconfig: SingleStoreCustomColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.sqlName = config.customTypeParams.dataType(config.fieldConfig);\n\t\tthis.mapTo = config.customTypeParams.toDriver;\n\t\tthis.mapFrom = config.customTypeParams.fromDriver;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.sqlName;\n\t}\n\n\toverride mapFromDriverValue(value: T['driverParam']): T['data'] {\n\t\treturn typeof this.mapFrom === 'function' ? this.mapFrom(value) : value as T['data'];\n\t}\n\n\toverride mapToDriverValue(value: T['data']): T['driverParam'] {\n\t\treturn typeof this.mapTo === 'function' ? this.mapTo(value) : value as T['data'];\n\t}\n}\n\nexport type CustomTypeValues = {\n\t/**\n\t * Required type for custom column, that will infer proper type model\n\t *\n\t * Examples:\n\t *\n\t * If you want your column to be `string` type after selecting/or on inserting - use `data: string`. Like `text`, `varchar`\n\t *\n\t * If you want your column to be `number` type after selecting/or on inserting - use `data: number`. Like `integer`\n\t */\n\tdata: unknown;\n\n\t/**\n\t * Type helper, that represents what type database driver is accepting for specific database data type\n\t */\n\tdriverData?: unknown;\n\n\t/**\n\t * What config type should be used for {@link CustomTypeParams} `dataType` generation\n\t */\n\tconfig?: Record<string, any>;\n\n\t/**\n\t * Whether the config argument should be required or not\n\t * @default false\n\t */\n\tconfigRequired?: boolean;\n\n\t/**\n\t * If your custom data type should be notNull by default you can use `notNull: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t  dataType() {\n\t * \t    return 'serial';\n\t *    },\n\t * });\n\t */\n\tnotNull?: boolean;\n\n\t/**\n\t * If your custom data type has default you can use `default: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t  dataType() {\n\t * \t    return 'serial';\n\t *    },\n\t * });\n\t */\n\tdefault?: boolean;\n};\n\nexport interface CustomTypeParams<T extends CustomTypeValues> {\n\t/**\n\t * Database data type string representation, that is used for migrations\n\t * @example\n\t * ```\n\t * `jsonb`, `text`\n\t * ```\n\t *\n\t * If database data type needs additional params you can use them from `config` param\n\t * @example\n\t * ```\n\t * `varchar(256)`, `numeric(2,3)`\n\t * ```\n\t *\n\t * To make `config` be of specific type please use config generic in {@link CustomTypeValues}\n\t *\n\t * @example\n\t * Usage example\n\t * ```\n\t *   dataType() {\n\t *     return 'boolean';\n\t *   },\n\t * ```\n\t * Or\n\t * ```\n\t *   dataType(config) {\n\t * \t   return typeof config.length !== 'undefined' ? `varchar(${config.length})` : `varchar`;\n\t * \t }\n\t * ```\n\t */\n\tdataType: (config: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined)) => string;\n\n\t/**\n\t * Optional mapping function, between user input and driver\n\t * @example\n\t * For example, when using jsonb we need to map JS/TS object to string before writing to database\n\t * ```\n\t * toDriver(value: TData): string {\n\t * \t return JSON.stringify(value);\n\t * }\n\t * ```\n\t */\n\ttoDriver?: (value: T['data']) => T['driverData'] | SQL;\n\n\t/**\n\t * Optional mapping function, that is responsible for data mapping from database to JS/TS code\n\t * @example\n\t * For example, when using timestamp we need to map string Date representation to JS Date\n\t * ```\n\t * fromDriver(value: string): Date {\n\t * \treturn new Date(value);\n\t * },\n\t * ```\n\t */\n\tfromDriver?: (value: T['driverData']) => T['data'];\n}\n\n/**\n * Custom singlestore database data type generator\n */\nexport function customType<T extends CustomTypeValues = CustomTypeValues>(\n\tcustomTypeParams: CustomTypeParams<T>,\n): Equal<T['configRequired'], true> extends true ? {\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig: TConfig,\n\t\t): SingleStoreCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig: T['config'],\n\t\t): SingleStoreCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n\t: {\n\t\t(): SingleStoreCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig?: TConfig,\n\t\t): SingleStoreCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig?: T['config'],\n\t\t): SingleStoreCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n{\n\treturn <TName extends string>(\n\t\ta?: TName | T['config'],\n\t\tb?: T['config'],\n\t): SingleStoreCustomColumnBuilder<ConvertCustomConfig<TName, T>> => {\n\t\tconst { name, config } = getColumnNameAndConfig<T['config']>(a, b);\n\t\treturn new SingleStoreCustomColumnBuilder(name as ConvertCustomConfig<TName, T>['name'], config, customTypeParams);\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/date.common.ts",
    "content": "import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnDataType,\n\tHasDefault,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport interface SingleStoreDateColumnBaseConfig {\n\thasOnUpdateNow: boolean;\n}\n\nexport abstract class SingleStoreDateColumnBaseBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> extends SingleStoreColumnBuilder<T, TRuntimeConfig & SingleStoreDateColumnBaseConfig, TExtraConfig> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreDateColumnBuilder';\n\n\tdefaultNow() {\n\t\treturn this.default(sql`now()`);\n\t}\n\n\tonUpdateNow(): HasDefault<this> {\n\t\tthis.config.hasOnUpdateNow = true;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n}\n\nexport abstract class SingleStoreDateBaseColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n> extends SingleStoreColumn<T, SingleStoreDateColumnBaseConfig & TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreDateColumn';\n\n\treadonly hasOnUpdateNow: boolean = this.config.hasOnUpdateNow;\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/date.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport type SingleStoreDateBuilderInitial<TName extends string> = SingleStoreDateBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'SingleStoreDate';\n\tdata: Date;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreDateBuilder<T extends ColumnBuilderBaseConfig<'date', 'SingleStoreDate'>>\n\textends SingleStoreColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreDateBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'date', 'SingleStoreDate');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreDate<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreDate<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreDate<T extends ColumnBaseConfig<'date', 'SingleStoreDate'>> extends SingleStoreColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreDate';\n\n\tconstructor(\n\t\ttable: AnySingleStoreTable<{ name: T['tableName'] }>,\n\t\tconfig: SingleStoreDateBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `date`;\n\t}\n\n\toverride mapFromDriverValue(value: string): Date {\n\t\treturn new Date(value);\n\t}\n}\n\nexport type SingleStoreDateStringBuilderInitial<TName extends string> = SingleStoreDateStringBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SingleStoreDateString';\n\tdata: string;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreDateStringBuilder<T extends ColumnBuilderBaseConfig<'string', 'SingleStoreDateString'>>\n\textends SingleStoreColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreDateStringBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'SingleStoreDateString');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreDateString<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreDateString<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreDateString<T extends ColumnBaseConfig<'string', 'SingleStoreDateString'>>\n\textends SingleStoreColumn<T>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreDateString';\n\n\tconstructor(\n\t\ttable: AnySingleStoreTable<{ name: T['tableName'] }>,\n\t\tconfig: SingleStoreDateStringBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `date`;\n\t}\n}\n\nexport interface SingleStoreDateConfig<TMode extends 'date' | 'string' = 'date' | 'string'> {\n\tmode?: TMode;\n}\n\nexport function date(): SingleStoreDateBuilderInitial<''>;\nexport function date<TMode extends SingleStoreDateConfig['mode'] & {}>(\n\tconfig?: SingleStoreDateConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? SingleStoreDateStringBuilderInitial<''> : SingleStoreDateBuilderInitial<''>;\nexport function date<TName extends string, TMode extends SingleStoreDateConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: SingleStoreDateConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? SingleStoreDateStringBuilderInitial<TName>\n\t: SingleStoreDateBuilderInitial<TName>;\nexport function date(a?: string | SingleStoreDateConfig, b?: SingleStoreDateConfig) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreDateConfig | undefined>(a, b);\n\tif (config?.mode === 'string') {\n\t\treturn new SingleStoreDateStringBuilder(name);\n\t}\n\treturn new SingleStoreDateBuilder(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/datetime.ts",
    "content": "import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tGeneratedColumnConfig,\n\tHasGenerated,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport type { SQL } from '~/sql/index.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport type SingleStoreDateTimeBuilderInitial<TName extends string> = SingleStoreDateTimeBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'SingleStoreDateTime';\n\tdata: Date;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreDateTimeBuilder<T extends ColumnBuilderBaseConfig<'date', 'SingleStoreDateTime'>>\n\textends SingleStoreColumnBuilder<T, SingleStoreDatetimeConfig>\n{\n\t/** @internal */\n\t// TODO: we need to add a proper support for SingleStore\n\toverride generatedAlwaysAs(\n\t\t_as: SQL<unknown> | (() => SQL) | T['data'],\n\t\t_config?: Partial<GeneratedColumnConfig<unknown>>,\n\t): HasGenerated<this, {}> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\tstatic override readonly [entityKind]: string = 'SingleStoreDateTimeBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'date', 'SingleStoreDateTime');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreDateTime<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreDateTime<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreDateTime<T extends ColumnBaseConfig<'date', 'SingleStoreDateTime'>>\n\textends SingleStoreColumn<T>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreDateTime';\n\n\tconstructor(\n\t\ttable: AnySingleStoreTable<{ name: T['tableName'] }>,\n\t\tconfig: SingleStoreDateTimeBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `datetime`;\n\t}\n\n\toverride mapToDriverValue(value: Date): unknown {\n\t\treturn value.toISOString().replace('T', ' ').replace('Z', '');\n\t}\n\n\toverride mapFromDriverValue(value: string): Date {\n\t\treturn new Date(value.replace(' ', 'T') + 'Z');\n\t}\n}\n\nexport type SingleStoreDateTimeStringBuilderInitial<TName extends string> = SingleStoreDateTimeStringBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SingleStoreDateTimeString';\n\tdata: string;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreDateTimeStringBuilder<T extends ColumnBuilderBaseConfig<'string', 'SingleStoreDateTimeString'>>\n\textends SingleStoreColumnBuilder<T, SingleStoreDatetimeConfig>\n{\n\t/** @internal */\n\t// TODO: we need to add a proper support for SingleStore\n\toverride generatedAlwaysAs(\n\t\t_as: SQL<unknown> | (() => SQL) | T['data'],\n\t\t_config?: Partial<GeneratedColumnConfig<unknown>>,\n\t): HasGenerated<this, {}> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\tstatic override readonly [entityKind]: string = 'SingleStoreDateTimeStringBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'SingleStoreDateTimeString');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreDateTimeString<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreDateTimeString<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreDateTimeString<T extends ColumnBaseConfig<'string', 'SingleStoreDateTimeString'>>\n\textends SingleStoreColumn<T>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreDateTimeString';\n\n\tconstructor(\n\t\ttable: AnySingleStoreTable<{ name: T['tableName'] }>,\n\t\tconfig: SingleStoreDateTimeStringBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `datetime`;\n\t}\n}\n\nexport interface SingleStoreDatetimeConfig<TMode extends 'date' | 'string' = 'date' | 'string'> {\n\tmode?: TMode;\n}\n\nexport function datetime(): SingleStoreDateTimeBuilderInitial<''>;\nexport function datetime<TMode extends SingleStoreDatetimeConfig['mode'] & {}>(\n\tconfig?: SingleStoreDatetimeConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? SingleStoreDateTimeStringBuilderInitial<''>\n\t: SingleStoreDateTimeBuilderInitial<''>;\nexport function datetime<TName extends string, TMode extends SingleStoreDatetimeConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: SingleStoreDatetimeConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? SingleStoreDateTimeStringBuilderInitial<TName>\n\t: SingleStoreDateTimeBuilderInitial<TName>;\nexport function datetime(a?: string | SingleStoreDatetimeConfig, b?: SingleStoreDatetimeConfig) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreDatetimeConfig | undefined>(a, b);\n\tif (config?.mode === 'string') {\n\t\treturn new SingleStoreDateTimeStringBuilder(name);\n\t}\n\treturn new SingleStoreDateTimeBuilder(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/decimal.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumnBuilderWithAutoIncrement, SingleStoreColumnWithAutoIncrement } from './common.ts';\n\nexport type SingleStoreDecimalBuilderInitial<TName extends string> = SingleStoreDecimalBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SingleStoreDecimal';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreDecimalBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'SingleStoreDecimal'>,\n> extends SingleStoreColumnBuilderWithAutoIncrement<T, SingleStoreDecimalConfig> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreDecimalBuilder';\n\n\tconstructor(name: T['name'], config: SingleStoreDecimalConfig | undefined) {\n\t\tsuper(name, 'string', 'SingleStoreDecimal');\n\t\tthis.config.precision = config?.precision;\n\t\tthis.config.scale = config?.scale;\n\t\tthis.config.unsigned = config?.unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreDecimal<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreDecimal<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreDecimal<T extends ColumnBaseConfig<'string', 'SingleStoreDecimal'>>\n\textends SingleStoreColumnWithAutoIncrement<T, SingleStoreDecimalConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreDecimal';\n\n\treadonly precision: number | undefined = this.config.precision;\n\treadonly scale: number | undefined = this.config.scale;\n\treadonly unsigned: boolean | undefined = this.config.unsigned;\n\n\toverride mapFromDriverValue(value: unknown): string {\n\t\t// For RQBv2\n\t\tif (typeof value === 'string') return value;\n\n\t\treturn String(value);\n\t}\n\n\tgetSQLType(): string {\n\t\tlet type = '';\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\ttype += `decimal(${this.precision},${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\ttype += 'decimal';\n\t\t} else {\n\t\t\ttype += `decimal(${this.precision})`;\n\t\t}\n\t\ttype = type === 'decimal(10,0)' || type === 'decimal(10)' ? 'decimal' : type;\n\t\treturn this.unsigned ? `${type} unsigned` : type;\n\t}\n}\n\nexport type SingleStoreDecimalNumberBuilderInitial<TName extends string> = SingleStoreDecimalNumberBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SingleStoreDecimalNumber';\n\tdata: number;\n\tdriverParam: string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreDecimalNumberBuilder<\n\tT extends ColumnBuilderBaseConfig<'number', 'SingleStoreDecimalNumber'>,\n> extends SingleStoreColumnBuilderWithAutoIncrement<T, SingleStoreDecimalConfig> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreDecimalNumberBuilder';\n\n\tconstructor(name: T['name'], config: SingleStoreDecimalConfig | undefined) {\n\t\tsuper(name, 'number', 'SingleStoreDecimalNumber');\n\t\tthis.config.precision = config?.precision;\n\t\tthis.config.scale = config?.scale;\n\t\tthis.config.unsigned = config?.unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreDecimalNumber<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreDecimalNumber<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreDecimalNumber<T extends ColumnBaseConfig<'number', 'SingleStoreDecimalNumber'>>\n\textends SingleStoreColumnWithAutoIncrement<T, SingleStoreDecimalConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreDecimalNumber';\n\n\treadonly precision: number | undefined = this.config.precision;\n\treadonly scale: number | undefined = this.config.scale;\n\treadonly unsigned: boolean | undefined = this.config.unsigned;\n\n\toverride mapFromDriverValue(value: unknown): number {\n\t\tif (typeof value === 'number') return value;\n\n\t\treturn Number(value);\n\t}\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\tlet type = '';\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\ttype += `decimal(${this.precision},${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\ttype += 'decimal';\n\t\t} else {\n\t\t\ttype += `decimal(${this.precision})`;\n\t\t}\n\t\ttype = type === 'decimal(10,0)' || type === 'decimal(10)' ? 'decimal' : type;\n\t\treturn this.unsigned ? `${type} unsigned` : type;\n\t}\n}\n\nexport type SingleStoreDecimalBigIntBuilderInitial<TName extends string> = SingleStoreDecimalBigIntBuilder<{\n\tname: TName;\n\tdataType: 'bigint';\n\tcolumnType: 'SingleStoreDecimalBigInt';\n\tdata: bigint;\n\tdriverParam: string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreDecimalBigIntBuilder<\n\tT extends ColumnBuilderBaseConfig<'bigint', 'SingleStoreDecimalBigInt'>,\n> extends SingleStoreColumnBuilderWithAutoIncrement<T, SingleStoreDecimalConfig> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreDecimalBigIntBuilder';\n\n\tconstructor(name: T['name'], config: SingleStoreDecimalConfig | undefined) {\n\t\tsuper(name, 'bigint', 'SingleStoreDecimalBigInt');\n\t\tthis.config.precision = config?.precision;\n\t\tthis.config.scale = config?.scale;\n\t\tthis.config.unsigned = config?.unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreDecimalBigInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreDecimalBigInt<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreDecimalBigInt<T extends ColumnBaseConfig<'bigint', 'SingleStoreDecimalBigInt'>>\n\textends SingleStoreColumnWithAutoIncrement<T, SingleStoreDecimalConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreDecimalBigInt';\n\n\treadonly precision: number | undefined = this.config.precision;\n\treadonly scale: number | undefined = this.config.scale;\n\treadonly unsigned: boolean | undefined = this.config.unsigned;\n\n\toverride mapFromDriverValue = BigInt;\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\tlet type = '';\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\ttype += `decimal(${this.precision},${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\ttype += 'decimal';\n\t\t} else {\n\t\t\ttype += `decimal(${this.precision})`;\n\t\t}\n\t\ttype = type === 'decimal(10,0)' || type === 'decimal(10)' ? 'decimal' : type;\n\t\treturn this.unsigned ? `${type} unsigned` : type;\n\t}\n}\n\nexport interface SingleStoreDecimalConfig<T extends 'string' | 'number' | 'bigint' = 'string' | 'number' | 'bigint'> {\n\tprecision?: number;\n\tscale?: number;\n\tunsigned?: boolean;\n\tmode?: T;\n}\n\nexport function decimal(): SingleStoreDecimalBuilderInitial<''>;\nexport function decimal<TMode extends 'string' | 'number' | 'bigint'>(\n\tconfig: SingleStoreDecimalConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? SingleStoreDecimalNumberBuilderInitial<''>\n\t: Equal<TMode, 'bigint'> extends true ? SingleStoreDecimalBigIntBuilderInitial<''>\n\t: SingleStoreDecimalBuilderInitial<''>;\nexport function decimal<TName extends string, TMode extends 'string' | 'number' | 'bigint'>(\n\tname: TName,\n\tconfig?: SingleStoreDecimalConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? SingleStoreDecimalNumberBuilderInitial<TName>\n\t: Equal<TMode, 'bigint'> extends true ? SingleStoreDecimalBigIntBuilderInitial<TName>\n\t: SingleStoreDecimalBuilderInitial<TName>;\nexport function decimal(a?: string | SingleStoreDecimalConfig, b: SingleStoreDecimalConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreDecimalConfig>(a, b);\n\tconst mode = config?.mode;\n\treturn mode === 'number'\n\t\t? new SingleStoreDecimalNumberBuilder(name, config)\n\t\t: mode === 'bigint'\n\t\t? new SingleStoreDecimalBigIntBuilder(name, config)\n\t\t: new SingleStoreDecimalBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/double.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumnBuilderWithAutoIncrement, SingleStoreColumnWithAutoIncrement } from './common.ts';\n\nexport type SingleStoreDoubleBuilderInitial<TName extends string> = SingleStoreDoubleBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SingleStoreDouble';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreDoubleBuilder<T extends ColumnBuilderBaseConfig<'number', 'SingleStoreDouble'>>\n\textends SingleStoreColumnBuilderWithAutoIncrement<T, SingleStoreDoubleConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreDoubleBuilder';\n\n\tconstructor(name: T['name'], config: SingleStoreDoubleConfig | undefined) {\n\t\tsuper(name, 'number', 'SingleStoreDouble');\n\t\tthis.config.precision = config?.precision;\n\t\tthis.config.scale = config?.scale;\n\t\tthis.config.unsigned = config?.unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreDouble<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreDouble<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreDouble<T extends ColumnBaseConfig<'number', 'SingleStoreDouble'>>\n\textends SingleStoreColumnWithAutoIncrement<T, SingleStoreDoubleConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreDouble';\n\n\treadonly precision: number | undefined = this.config.precision;\n\treadonly scale: number | undefined = this.config.scale;\n\treadonly unsigned: boolean | undefined = this.config.unsigned;\n\n\tgetSQLType(): string {\n\t\tlet type = '';\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\ttype += `double(${this.precision},${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\ttype += 'double';\n\t\t} else {\n\t\t\ttype += `double(${this.precision})`;\n\t\t}\n\t\treturn this.unsigned ? `${type} unsigned` : type;\n\t}\n}\n\nexport interface SingleStoreDoubleConfig {\n\tprecision?: number;\n\tscale?: number;\n\tunsigned?: boolean;\n}\n\nexport function double(): SingleStoreDoubleBuilderInitial<''>;\nexport function double(\n\tconfig?: SingleStoreDoubleConfig,\n): SingleStoreDoubleBuilderInitial<''>;\nexport function double<TName extends string>(\n\tname: TName,\n\tconfig?: SingleStoreDoubleConfig,\n): SingleStoreDoubleBuilderInitial<TName>;\nexport function double(a?: string | SingleStoreDoubleConfig, b?: SingleStoreDoubleConfig) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreDoubleConfig>(a, b);\n\treturn new SingleStoreDoubleBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/enum.ts",
    "content": "import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tGeneratedColumnConfig,\n\tHasGenerated,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport type { SQL } from '~/sql/index.ts';\nimport { getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport type SingleStoreEnumColumnBuilderInitial<TName extends string, TEnum extends [string, ...string[]]> =\n\tSingleStoreEnumColumnBuilder<{\n\t\tname: TName;\n\t\tdataType: 'string';\n\t\tcolumnType: 'SingleStoreEnumColumn';\n\t\tdata: TEnum[number];\n\t\tdriverParam: string;\n\t\tenumValues: TEnum;\n\t\tgenerated: undefined;\n\t}>;\n\nexport class SingleStoreEnumColumnBuilder<T extends ColumnBuilderBaseConfig<'string', 'SingleStoreEnumColumn'>>\n\textends SingleStoreColumnBuilder<T, { enumValues: T['enumValues'] }>\n{\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\toverride generatedAlwaysAs(\n\t\tas: SQL<unknown> | (() => SQL) | T['data'],\n\t\tconfig?: Partial<GeneratedColumnConfig<unknown>>,\n\t): HasGenerated<this, {}> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\tstatic override readonly [entityKind]: string = 'SingleStoreEnumColumnBuilder';\n\n\tconstructor(name: T['name'], values: T['enumValues']) {\n\t\tsuper(name, 'string', 'SingleStoreEnumColumn');\n\t\tthis.config.enumValues = values;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreEnumColumn<MakeColumnConfig<T, TTableName> & { enumValues: T['enumValues'] }> {\n\t\treturn new SingleStoreEnumColumn<MakeColumnConfig<T, TTableName> & { enumValues: T['enumValues'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreEnumColumn<T extends ColumnBaseConfig<'string', 'SingleStoreEnumColumn'>>\n\textends SingleStoreColumn<T, { enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreEnumColumn';\n\n\toverride readonly enumValues = this.config.enumValues;\n\n\tgetSQLType(): string {\n\t\treturn `enum(${this.enumValues!.map((value) => `'${value}'`).join(',')})`;\n\t}\n}\n\nexport function singlestoreEnum<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tvalues: T | Writable<T>,\n): SingleStoreEnumColumnBuilderInitial<'', Writable<T>>;\nexport function singlestoreEnum<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: TName,\n\tvalues: T | Writable<T>,\n): SingleStoreEnumColumnBuilderInitial<TName, Writable<T>>;\nexport function singlestoreEnum(\n\ta?: string | readonly [string, ...string[]] | [string, ...string[]],\n\tb?: readonly [string, ...string[]] | [string, ...string[]],\n): any {\n\tconst { name, config: values } = getColumnNameAndConfig<readonly [string, ...string[]] | [string, ...string[]]>(a, b);\n\n\tif (values.length === 0) {\n\t\tthrow new Error(`You have an empty array for \"${name}\" enum values`);\n\t}\n\n\treturn new SingleStoreEnumColumnBuilder(name, values as any);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/float.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumnBuilderWithAutoIncrement, SingleStoreColumnWithAutoIncrement } from './common.ts';\n\nexport type SingleStoreFloatBuilderInitial<TName extends string> = SingleStoreFloatBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SingleStoreFloat';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreFloatBuilder<T extends ColumnBuilderBaseConfig<'number', 'SingleStoreFloat'>>\n\textends SingleStoreColumnBuilderWithAutoIncrement<T, SingleStoreFloatConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreFloatBuilder';\n\n\tconstructor(name: T['name'], config: SingleStoreFloatConfig | undefined) {\n\t\tsuper(name, 'number', 'SingleStoreFloat');\n\t\tthis.config.precision = config?.precision;\n\t\tthis.config.scale = config?.scale;\n\t\tthis.config.unsigned = config?.unsigned;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreFloat<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreFloat<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreFloat<T extends ColumnBaseConfig<'number', 'SingleStoreFloat'>>\n\textends SingleStoreColumnWithAutoIncrement<T, SingleStoreFloatConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreFloat';\n\n\treadonly precision: number | undefined = this.config.precision;\n\treadonly scale: number | undefined = this.config.scale;\n\treadonly unsigned: boolean | undefined = this.config.unsigned;\n\n\tgetSQLType(): string {\n\t\tlet type = '';\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\ttype += `float(${this.precision},${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\ttype += 'float';\n\t\t} else {\n\t\t\ttype += `float(${this.precision},0)`;\n\t\t}\n\t\treturn this.unsigned ? `${type} unsigned` : type;\n\t}\n}\n\nexport interface SingleStoreFloatConfig {\n\tprecision?: number;\n\tscale?: number;\n\tunsigned?: boolean;\n}\n\nexport function float(): SingleStoreFloatBuilderInitial<''>;\nexport function float(\n\tconfig?: SingleStoreFloatConfig,\n): SingleStoreFloatBuilderInitial<''>;\nexport function float<TName extends string>(\n\tname: TName,\n\tconfig?: SingleStoreFloatConfig,\n): SingleStoreFloatBuilderInitial<TName>;\nexport function float(a?: string | SingleStoreFloatConfig, b?: SingleStoreFloatConfig) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreFloatConfig>(a, b);\n\treturn new SingleStoreFloatBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/index.ts",
    "content": "export * from './bigint.ts';\nexport * from './binary.ts';\nexport * from './boolean.ts';\nexport * from './char.ts';\nexport * from './common.ts';\nexport * from './custom.ts';\nexport * from './date.ts';\nexport * from './datetime.ts';\nexport * from './decimal.ts';\nexport * from './double.ts';\nexport * from './enum.ts';\nexport * from './float.ts';\nexport * from './int.ts';\nexport * from './json.ts';\nexport * from './mediumint.ts';\nexport * from './real.ts';\nexport * from './serial.ts';\nexport * from './smallint.ts';\nexport * from './text.ts';\nexport * from './time.ts';\nexport * from './timestamp.ts';\nexport * from './tinyint.ts';\nexport * from './varbinary.ts';\nexport * from './varchar.ts';\nexport * from './vector.ts';\nexport * from './year.ts';\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/int.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumnBuilderWithAutoIncrement, SingleStoreColumnWithAutoIncrement } from './common.ts';\n\nexport type SingleStoreIntBuilderInitial<TName extends string> = SingleStoreIntBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SingleStoreInt';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreIntBuilder<T extends ColumnBuilderBaseConfig<'number', 'SingleStoreInt'>>\n\textends SingleStoreColumnBuilderWithAutoIncrement<T, SingleStoreIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreIntBuilder';\n\n\tconstructor(name: T['name'], config?: SingleStoreIntConfig) {\n\t\tsuper(name, 'number', 'SingleStoreInt');\n\t\tthis.config.unsigned = config ? config.unsigned : false;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreInt<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreInt<T extends ColumnBaseConfig<'number', 'SingleStoreInt'>>\n\textends SingleStoreColumnWithAutoIncrement<T, SingleStoreIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreInt';\n\n\tgetSQLType(): string {\n\t\treturn `int${this.config.unsigned ? ' unsigned' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport interface SingleStoreIntConfig {\n\tunsigned?: boolean;\n}\n\nexport function int(): SingleStoreIntBuilderInitial<''>;\nexport function int(\n\tconfig?: SingleStoreIntConfig,\n): SingleStoreIntBuilderInitial<''>;\nexport function int<TName extends string>(\n\tname: TName,\n\tconfig?: SingleStoreIntConfig,\n): SingleStoreIntBuilderInitial<TName>;\nexport function int(a?: string | SingleStoreIntConfig, b?: SingleStoreIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreIntConfig>(a, b);\n\treturn new SingleStoreIntBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/json.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport type SingleStoreJsonBuilderInitial<TName extends string> = SingleStoreJsonBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'SingleStoreJson';\n\tdata: unknown;\n\tdriverParam: string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreJsonBuilder<T extends ColumnBuilderBaseConfig<'json', 'SingleStoreJson'>>\n\textends SingleStoreColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreJsonBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'SingleStoreJson');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreJson<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreJson<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreJson<T extends ColumnBaseConfig<'json', 'SingleStoreJson'>> extends SingleStoreColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreJson';\n\n\tgetSQLType(): string {\n\t\treturn 'json';\n\t}\n\n\toverride mapToDriverValue(value: T['data']): string {\n\t\treturn JSON.stringify(value);\n\t}\n}\n\nexport function json(): SingleStoreJsonBuilderInitial<''>;\nexport function json<TName extends string>(name: TName): SingleStoreJsonBuilderInitial<TName>;\nexport function json(name?: string) {\n\treturn new SingleStoreJsonBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/mediumint.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumnBuilderWithAutoIncrement, SingleStoreColumnWithAutoIncrement } from './common.ts';\nimport type { SingleStoreIntConfig } from './int.ts';\n\nexport type SingleStoreMediumIntBuilderInitial<TName extends string> = SingleStoreMediumIntBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SingleStoreMediumInt';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreMediumIntBuilder<T extends ColumnBuilderBaseConfig<'number', 'SingleStoreMediumInt'>>\n\textends SingleStoreColumnBuilderWithAutoIncrement<T, SingleStoreIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreMediumIntBuilder';\n\n\tconstructor(name: T['name'], config?: SingleStoreIntConfig) {\n\t\tsuper(name, 'number', 'SingleStoreMediumInt');\n\t\tthis.config.unsigned = config ? config.unsigned : false;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreMediumInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreMediumInt<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreMediumInt<T extends ColumnBaseConfig<'number', 'SingleStoreMediumInt'>>\n\textends SingleStoreColumnWithAutoIncrement<T, SingleStoreIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreMediumInt';\n\n\tgetSQLType(): string {\n\t\treturn `mediumint${this.config.unsigned ? ' unsigned' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function mediumint(): SingleStoreMediumIntBuilderInitial<''>;\nexport function mediumint(\n\tconfig?: SingleStoreIntConfig,\n): SingleStoreMediumIntBuilderInitial<''>;\nexport function mediumint<TName extends string>(\n\tname: TName,\n\tconfig?: SingleStoreIntConfig,\n): SingleStoreMediumIntBuilderInitial<TName>;\nexport function mediumint(a?: string | SingleStoreIntConfig, b?: SingleStoreIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreIntConfig>(a, b);\n\treturn new SingleStoreMediumIntBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/real.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumnBuilderWithAutoIncrement, SingleStoreColumnWithAutoIncrement } from './common.ts';\n\nexport type SingleStoreRealBuilderInitial<TName extends string> = SingleStoreRealBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SingleStoreReal';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreRealBuilder<T extends ColumnBuilderBaseConfig<'number', 'SingleStoreReal'>>\n\textends SingleStoreColumnBuilderWithAutoIncrement<\n\t\tT,\n\t\tSingleStoreRealConfig\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreRealBuilder';\n\n\tconstructor(name: T['name'], config: SingleStoreRealConfig | undefined) {\n\t\tsuper(name, 'number', 'SingleStoreReal');\n\t\tthis.config.precision = config?.precision;\n\t\tthis.config.scale = config?.scale;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreReal<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreReal<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreReal<T extends ColumnBaseConfig<'number', 'SingleStoreReal'>>\n\textends SingleStoreColumnWithAutoIncrement<\n\t\tT,\n\t\tSingleStoreRealConfig\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreReal';\n\n\tprecision: number | undefined = this.config.precision;\n\tscale: number | undefined = this.config.scale;\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `real(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'real';\n\t\t} else {\n\t\t\treturn `real(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport interface SingleStoreRealConfig {\n\tprecision?: number;\n\tscale?: number;\n}\n\nexport function real(): SingleStoreRealBuilderInitial<''>;\nexport function real(\n\tconfig?: SingleStoreRealConfig,\n): SingleStoreRealBuilderInitial<''>;\nexport function real<TName extends string>(\n\tname: TName,\n\tconfig?: SingleStoreRealConfig,\n): SingleStoreRealBuilderInitial<TName>;\nexport function real(a?: string | SingleStoreRealConfig, b: SingleStoreRealConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreRealConfig>(a, b);\n\treturn new SingleStoreRealBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/serial.ts",
    "content": "import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tHasDefault,\n\tIsAutoincrement,\n\tIsPrimaryKey,\n\tMakeColumnConfig,\n\tNotNull,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { SingleStoreColumnBuilderWithAutoIncrement, SingleStoreColumnWithAutoIncrement } from './common.ts';\n\nexport type SingleStoreSerialBuilderInitial<TName extends string> = IsAutoincrement<\n\tIsPrimaryKey<\n\t\tNotNull<\n\t\t\tHasDefault<\n\t\t\t\tSingleStoreSerialBuilder<{\n\t\t\t\t\tname: TName;\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SingleStoreSerial';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t}>\n\t\t\t>\n\t\t>\n\t>\n>;\n\nexport class SingleStoreSerialBuilder<T extends ColumnBuilderBaseConfig<'number', 'SingleStoreSerial'>>\n\textends SingleStoreColumnBuilderWithAutoIncrement<T>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreSerialBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'SingleStoreSerial');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.autoIncrement = true;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreSerial<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreSerial<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreSerial<\n\tT extends ColumnBaseConfig<'number', 'SingleStoreSerial'>,\n> extends SingleStoreColumnWithAutoIncrement<T> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreSerial';\n\n\tgetSQLType(): string {\n\t\treturn 'serial';\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function serial(): SingleStoreSerialBuilderInitial<''>;\nexport function serial<TName extends string>(name: TName): SingleStoreSerialBuilderInitial<TName>;\nexport function serial(name?: string) {\n\treturn new SingleStoreSerialBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/smallint.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumnBuilderWithAutoIncrement, SingleStoreColumnWithAutoIncrement } from './common.ts';\nimport type { SingleStoreIntConfig } from './int.ts';\n\nexport type SingleStoreSmallIntBuilderInitial<TName extends string> = SingleStoreSmallIntBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SingleStoreSmallInt';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreSmallIntBuilder<T extends ColumnBuilderBaseConfig<'number', 'SingleStoreSmallInt'>>\n\textends SingleStoreColumnBuilderWithAutoIncrement<T, SingleStoreIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreSmallIntBuilder';\n\n\tconstructor(name: T['name'], config?: SingleStoreIntConfig) {\n\t\tsuper(name, 'number', 'SingleStoreSmallInt');\n\t\tthis.config.unsigned = config ? config.unsigned : false;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreSmallInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreSmallInt<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreSmallInt<T extends ColumnBaseConfig<'number', 'SingleStoreSmallInt'>>\n\textends SingleStoreColumnWithAutoIncrement<T, SingleStoreIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreSmallInt';\n\n\tgetSQLType(): string {\n\t\treturn `smallint${this.config.unsigned ? ' unsigned' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function smallint(): SingleStoreSmallIntBuilderInitial<''>;\nexport function smallint(\n\tconfig?: SingleStoreIntConfig,\n): SingleStoreSmallIntBuilderInitial<''>;\nexport function smallint<TName extends string>(\n\tname: TName,\n\tconfig?: SingleStoreIntConfig,\n): SingleStoreSmallIntBuilderInitial<TName>;\nexport function smallint(a?: string | SingleStoreIntConfig, b?: SingleStoreIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreIntConfig>(a, b);\n\treturn new SingleStoreSmallIntBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/text.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport type SingleStoreTextColumnType = 'tinytext' | 'text' | 'mediumtext' | 'longtext';\n\nexport type SingleStoreTextBuilderInitial<TName extends string, TEnum extends [string, ...string[]]> =\n\tSingleStoreTextBuilder<{\n\t\tname: TName;\n\t\tdataType: 'string';\n\t\tcolumnType: 'SingleStoreText';\n\t\tdata: TEnum[number];\n\t\tdriverParam: string;\n\t\tenumValues: TEnum;\n\t\tgenerated: undefined;\n\t}>;\n\nexport class SingleStoreTextBuilder<T extends ColumnBuilderBaseConfig<'string', 'SingleStoreText'>>\n\textends SingleStoreColumnBuilder<\n\t\tT,\n\t\t{ textType: SingleStoreTextColumnType; enumValues: T['enumValues'] }\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreTextBuilder';\n\n\tconstructor(name: T['name'], textType: SingleStoreTextColumnType, config: SingleStoreTextConfig<T['enumValues']>) {\n\t\tsuper(name, 'string', 'SingleStoreText');\n\t\tthis.config.textType = textType;\n\t\tthis.config.enumValues = config.enum;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreText<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreText<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreText<T extends ColumnBaseConfig<'string', 'SingleStoreText'>>\n\textends SingleStoreColumn<T, { textType: SingleStoreTextColumnType; enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreText';\n\n\treadonly textType: SingleStoreTextColumnType = this.config.textType;\n\n\toverride readonly enumValues = this.config.enumValues;\n\n\tgetSQLType(): string {\n\t\treturn this.textType;\n\t}\n}\n\nexport interface SingleStoreTextConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n> {\n\tenum?: TEnum;\n}\n\nexport function text(): SingleStoreTextBuilderInitial<'', [string, ...string[]]>;\nexport function text<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig?: SingleStoreTextConfig<T | Writable<T>>,\n): SingleStoreTextBuilderInitial<'', Writable<T>>;\nexport function text<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: TName,\n\tconfig?: SingleStoreTextConfig<T | Writable<T>>,\n): SingleStoreTextBuilderInitial<TName, Writable<T>>;\nexport function text(a?: string | SingleStoreTextConfig, b: SingleStoreTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreTextConfig>(a, b);\n\treturn new SingleStoreTextBuilder(name, 'text', config as any);\n}\n\nexport function tinytext(): SingleStoreTextBuilderInitial<'', [string, ...string[]]>;\nexport function tinytext<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig?: SingleStoreTextConfig<T | Writable<T>>,\n): SingleStoreTextBuilderInitial<'', Writable<T>>;\nexport function tinytext<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: TName,\n\tconfig?: SingleStoreTextConfig<T | Writable<T>>,\n): SingleStoreTextBuilderInitial<TName, Writable<T>>;\nexport function tinytext(a?: string | SingleStoreTextConfig, b: SingleStoreTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreTextConfig>(a, b);\n\treturn new SingleStoreTextBuilder(name, 'tinytext', config as any);\n}\n\nexport function mediumtext(): SingleStoreTextBuilderInitial<'', [string, ...string[]]>;\nexport function mediumtext<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig?: SingleStoreTextConfig<T | Writable<T>>,\n): SingleStoreTextBuilderInitial<'', Writable<T>>;\nexport function mediumtext<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: TName,\n\tconfig?: SingleStoreTextConfig<T | Writable<T>>,\n): SingleStoreTextBuilderInitial<TName, Writable<T>>;\nexport function mediumtext(a?: string | SingleStoreTextConfig, b: SingleStoreTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreTextConfig>(a, b);\n\treturn new SingleStoreTextBuilder(name, 'mediumtext', config as any);\n}\n\nexport function longtext(): SingleStoreTextBuilderInitial<'', [string, ...string[]]>;\nexport function longtext<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig?: SingleStoreTextConfig<T | Writable<T>>,\n): SingleStoreTextBuilderInitial<'', Writable<T>>;\nexport function longtext<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: TName,\n\tconfig?: SingleStoreTextConfig<T | Writable<T>>,\n): SingleStoreTextBuilderInitial<TName, Writable<T>>;\nexport function longtext(a?: string | SingleStoreTextConfig, b: SingleStoreTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreTextConfig>(a, b);\n\treturn new SingleStoreTextBuilder(name, 'longtext', config as any);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/time.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport type SingleStoreTimeBuilderInitial<TName extends string> = SingleStoreTimeBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SingleStoreTime';\n\tdata: string;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreTimeBuilder<T extends ColumnBuilderBaseConfig<'string', 'SingleStoreTime'>>\n\textends SingleStoreColumnBuilder<\n\t\tT\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreTimeBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t) {\n\t\tsuper(name, 'string', 'SingleStoreTime');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreTime<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreTime<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreTime<\n\tT extends ColumnBaseConfig<'string', 'SingleStoreTime'>,\n> extends SingleStoreColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreTime';\n\n\tgetSQLType(): string {\n\t\treturn `time`;\n\t}\n}\n\nexport function time(): SingleStoreTimeBuilderInitial<''>;\nexport function time<TName extends string>(name: TName): SingleStoreTimeBuilderInitial<TName>;\nexport function time(name?: string) {\n\treturn new SingleStoreTimeBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/timestamp.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreDateBaseColumn, SingleStoreDateColumnBaseBuilder } from './date.common.ts';\n\nexport type SingleStoreTimestampBuilderInitial<TName extends string> = SingleStoreTimestampBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'SingleStoreTimestamp';\n\tdata: Date;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreTimestampBuilder<T extends ColumnBuilderBaseConfig<'date', 'SingleStoreTimestamp'>>\n\textends SingleStoreDateColumnBaseBuilder<T, SingleStoreTimestampConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreTimestampBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'date', 'SingleStoreTimestamp');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreTimestamp<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreTimestamp<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n\n\toverride defaultNow() {\n\t\treturn this.default(sql`CURRENT_TIMESTAMP`);\n\t}\n}\n\nexport class SingleStoreTimestamp<T extends ColumnBaseConfig<'date', 'SingleStoreTimestamp'>>\n\textends SingleStoreDateBaseColumn<T, SingleStoreTimestampConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreTimestamp';\n\n\tgetSQLType(): string {\n\t\treturn `timestamp`;\n\t}\n\n\toverride mapFromDriverValue(value: string): Date {\n\t\treturn new Date(value + '+0000');\n\t}\n\n\toverride mapToDriverValue(value: Date): string {\n\t\treturn value.toISOString().slice(0, -1).replace('T', ' ');\n\t}\n}\n\nexport type SingleStoreTimestampStringBuilderInitial<TName extends string> = SingleStoreTimestampStringBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SingleStoreTimestampString';\n\tdata: string;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreTimestampStringBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'SingleStoreTimestampString'>,\n> extends SingleStoreDateColumnBaseBuilder<T, SingleStoreTimestampConfig> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreTimestampStringBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'SingleStoreTimestampString');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreTimestampString<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreTimestampString<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n\n\toverride defaultNow() {\n\t\treturn this.default(sql`CURRENT_TIMESTAMP`);\n\t}\n}\n\nexport class SingleStoreTimestampString<T extends ColumnBaseConfig<'string', 'SingleStoreTimestampString'>>\n\textends SingleStoreDateBaseColumn<T, SingleStoreTimestampConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreTimestampString';\n\n\tgetSQLType(): string {\n\t\treturn `timestamp`;\n\t}\n}\n\nexport interface SingleStoreTimestampConfig<TMode extends 'string' | 'date' = 'string' | 'date'> {\n\tmode?: TMode;\n}\n\nexport function timestamp(): SingleStoreTimestampBuilderInitial<''>;\nexport function timestamp<TMode extends SingleStoreTimestampConfig['mode'] & {}>(\n\tconfig?: SingleStoreTimestampConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? SingleStoreTimestampStringBuilderInitial<''>\n\t: SingleStoreTimestampBuilderInitial<''>;\nexport function timestamp<TName extends string, TMode extends SingleStoreTimestampConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: SingleStoreTimestampConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? SingleStoreTimestampStringBuilderInitial<TName>\n\t: SingleStoreTimestampBuilderInitial<TName>;\nexport function timestamp(a?: string | SingleStoreTimestampConfig, b: SingleStoreTimestampConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreTimestampConfig | undefined>(a, b);\n\tif (config?.mode === 'string') {\n\t\treturn new SingleStoreTimestampStringBuilder(name);\n\t}\n\treturn new SingleStoreTimestampBuilder(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/tinyint.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumnBuilderWithAutoIncrement, SingleStoreColumnWithAutoIncrement } from './common.ts';\nimport type { SingleStoreIntConfig } from './int.ts';\n\nexport type SingleStoreTinyIntBuilderInitial<TName extends string> = SingleStoreTinyIntBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SingleStoreTinyInt';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreTinyIntBuilder<T extends ColumnBuilderBaseConfig<'number', 'SingleStoreTinyInt'>>\n\textends SingleStoreColumnBuilderWithAutoIncrement<T, SingleStoreIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreTinyIntBuilder';\n\n\tconstructor(name: T['name'], config?: SingleStoreIntConfig) {\n\t\tsuper(name, 'number', 'SingleStoreTinyInt');\n\t\tthis.config.unsigned = config ? config.unsigned : false;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreTinyInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreTinyInt<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreTinyInt<T extends ColumnBaseConfig<'number', 'SingleStoreTinyInt'>>\n\textends SingleStoreColumnWithAutoIncrement<T, SingleStoreIntConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreTinyInt';\n\n\tgetSQLType(): string {\n\t\treturn `tinyint${this.config.unsigned ? ' unsigned' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function tinyint(): SingleStoreTinyIntBuilderInitial<''>;\nexport function tinyint(\n\tconfig?: SingleStoreIntConfig,\n): SingleStoreTinyIntBuilderInitial<''>;\nexport function tinyint<TName extends string>(\n\tname: TName,\n\tconfig?: SingleStoreIntConfig,\n): SingleStoreTinyIntBuilderInitial<TName>;\nexport function tinyint(a?: string | SingleStoreIntConfig, b?: SingleStoreIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreIntConfig>(a, b);\n\treturn new SingleStoreTinyIntBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/varbinary.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport type SingleStoreVarBinaryBuilderInitial<TName extends string> = SingleStoreVarBinaryBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SingleStoreVarBinary';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreVarBinaryBuilder<T extends ColumnBuilderBaseConfig<'string', 'SingleStoreVarBinary'>>\n\textends SingleStoreColumnBuilder<T, SingleStoreVarbinaryOptions>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreVarBinaryBuilder';\n\n\t/** @internal */\n\tconstructor(name: T['name'], config: SingleStoreVarbinaryOptions) {\n\t\tsuper(name, 'string', 'SingleStoreVarBinary');\n\t\tthis.config.length = config?.length;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreVarBinary<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreVarBinary<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreVarBinary<\n\tT extends ColumnBaseConfig<'string', 'SingleStoreVarBinary'>,\n> extends SingleStoreColumn<T, SingleStoreVarbinaryOptions> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreVarBinary';\n\n\tlength: number | undefined = this.config.length;\n\n\toverride mapFromDriverValue(value: string | Buffer | Uint8Array): string {\n\t\tif (typeof value === 'string') return value;\n\t\tif (Buffer.isBuffer(value)) return value.toString();\n\n\t\tconst str: string[] = [];\n\t\tfor (const v of value) {\n\t\t\tstr.push(v === 49 ? '1' : '0');\n\t\t}\n\n\t\treturn str.join('');\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `varbinary` : `varbinary(${this.length})`;\n\t}\n}\n\nexport interface SingleStoreVarbinaryOptions {\n\tlength: number;\n}\n\nexport function varbinary(\n\tconfig: SingleStoreVarbinaryOptions,\n): SingleStoreVarBinaryBuilderInitial<''>;\nexport function varbinary<TName extends string>(\n\tname: TName,\n\tconfig: SingleStoreVarbinaryOptions,\n): SingleStoreVarBinaryBuilderInitial<TName>;\nexport function varbinary(a?: string | SingleStoreVarbinaryOptions, b?: SingleStoreVarbinaryOptions) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreVarbinaryOptions>(a, b);\n\treturn new SingleStoreVarBinaryBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/varchar.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport type SingleStoreVarCharBuilderInitial<\n\tTName extends string,\n\tTEnum extends [string, ...string[]],\n\tTLength extends number | undefined,\n> = SingleStoreVarCharBuilder<\n\t{\n\t\tname: TName;\n\t\tdataType: 'string';\n\t\tcolumnType: 'SingleStoreVarChar';\n\t\tdata: TEnum[number];\n\t\tdriverParam: number | string;\n\t\tenumValues: TEnum;\n\t\tgenerated: undefined;\n\t\tlength: TLength;\n\t}\n>;\n\nexport class SingleStoreVarCharBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'SingleStoreVarChar'> & { length?: number | undefined },\n> extends SingleStoreColumnBuilder<T, SingleStoreVarCharConfig<T['enumValues'], T['length']>, { length: T['length'] }> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreVarCharBuilder';\n\n\t/** @internal */\n\tconstructor(name: T['name'], config: SingleStoreVarCharConfig<T['enumValues'], T['length']>) {\n\t\tsuper(name, 'string', 'SingleStoreVarChar');\n\t\tthis.config.length = config.length;\n\t\tthis.config.enum = config.enum;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreVarChar<MakeColumnConfig<T, TTableName> & { length: T['length']; enumValues: T['enumValues'] }> {\n\t\treturn new SingleStoreVarChar<\n\t\t\tMakeColumnConfig<T, TTableName> & { length: T['length']; enumValues: T['enumValues'] }\n\t\t>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreVarChar<\n\tT extends ColumnBaseConfig<'string', 'SingleStoreVarChar'> & { length?: number | undefined },\n> extends SingleStoreColumn<T, SingleStoreVarCharConfig<T['enumValues'], T['length']>, { length: T['length'] }> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreVarChar';\n\n\treadonly length: T['length'] = this.config.length;\n\toverride readonly enumValues = this.config.enum;\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `varchar` : `varchar(${this.length})`;\n\t}\n}\n\nexport interface SingleStoreVarCharConfig<\n\tTEnum extends string[] | readonly string[] | undefined = string[] | readonly string[] | undefined,\n\tTLength extends number | undefined = number | undefined,\n> {\n\tenum?: TEnum;\n\tlength: TLength;\n}\n\nexport function varchar<U extends string, T extends Readonly<[U, ...U[]]>, L extends number | undefined>(\n\tconfig: SingleStoreVarCharConfig<T | Writable<T>, L>,\n): SingleStoreVarCharBuilderInitial<'', Writable<T>, L>;\nexport function varchar<\n\tTName extends string,\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n>(\n\tname: TName,\n\tconfig: SingleStoreVarCharConfig<T | Writable<T>, L>,\n): SingleStoreVarCharBuilderInitial<TName, Writable<T>, L>;\nexport function varchar(a?: string | SingleStoreVarCharConfig, b?: SingleStoreVarCharConfig): any {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreVarCharConfig>(a, b);\n\treturn new SingleStoreVarCharBuilder(name, config as any);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/vector.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { SQL } from '~/sql/index.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder, SingleStoreGeneratedColumnConfig } from './common.ts';\n\nexport type SingleStoreVectorBuilderInitial<TName extends string> = SingleStoreVectorBuilder<{\n\tname: TName;\n\tdataType: 'array';\n\tcolumnType: 'SingleStoreVector';\n\tdata: Array<number>;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class SingleStoreVectorBuilder<T extends ColumnBuilderBaseConfig<'array', 'SingleStoreVector'>>\n\textends SingleStoreColumnBuilder<T, SingleStoreVectorConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreVectorBuilder';\n\n\tconstructor(name: T['name'], config: SingleStoreVectorConfig) {\n\t\tsuper(name, 'array', 'SingleStoreVector');\n\t\tthis.config.dimensions = config.dimensions;\n\t\tthis.config.elementType = config.elementType;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreVector<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreVector<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n\n\t/** @internal */\n\toverride generatedAlwaysAs(as: SQL<unknown> | (() => SQL) | T['data'], config?: SingleStoreGeneratedColumnConfig) {\n\t\tthrow new Error('not implemented');\n\t}\n}\n\nexport class SingleStoreVector<T extends ColumnBaseConfig<'array', 'SingleStoreVector'>>\n\textends SingleStoreColumn<T, SingleStoreVectorConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreVector';\n\n\tdimensions: number = this.config.dimensions;\n\telementType: ElementType | undefined = this.config.elementType;\n\n\tgetSQLType(): string {\n\t\treturn `vector(${this.dimensions}, ${this.elementType || 'F32'})`;\n\t}\n\n\toverride mapToDriverValue(value: Array<number>) {\n\t\treturn JSON.stringify(value);\n\t}\n\n\toverride mapFromDriverValue(value: string): Array<number> {\n\t\treturn JSON.parse(value);\n\t}\n}\n\ntype ElementType = 'I8' | 'I16' | 'I32' | 'I64' | 'F32' | 'F64';\n\nexport interface SingleStoreVectorConfig {\n\tdimensions: number;\n\telementType?: ElementType;\n}\n\nexport function vector(\n\tconfig: SingleStoreVectorConfig,\n): SingleStoreVectorBuilderInitial<''>;\nexport function vector<TName extends string>(\n\tname: TName,\n\tconfig: SingleStoreVectorConfig,\n): SingleStoreVectorBuilderInitial<TName>;\nexport function vector(a: string | SingleStoreVectorConfig, b?: SingleStoreVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<SingleStoreVectorConfig>(a, b);\n\treturn new SingleStoreVectorBuilder(name, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/columns/year.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreTable } from '~/singlestore-core/table.ts';\nimport { SingleStoreColumn, SingleStoreColumnBuilder } from './common.ts';\n\nexport type SingleStoreYearBuilderInitial<TName extends string> = SingleStoreYearBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SingleStoreYear';\n\tdata: number;\n\tdriverParam: number;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SingleStoreYearBuilder<T extends ColumnBuilderBaseConfig<'number', 'SingleStoreYear'>>\n\textends SingleStoreColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreYearBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'SingleStoreYear');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySingleStoreTable<{ name: TTableName }>,\n\t): SingleStoreYear<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SingleStoreYear<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SingleStoreYear<\n\tT extends ColumnBaseConfig<'number', 'SingleStoreYear'>,\n> extends SingleStoreColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreYear';\n\n\tgetSQLType(): string {\n\t\treturn `year`;\n\t}\n}\n\nexport function year(): SingleStoreYearBuilderInitial<''>;\nexport function year<TName extends string>(name: TName): SingleStoreYearBuilderInitial<TName>;\nexport function year(name?: string) {\n\treturn new SingleStoreYearBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/db.ts",
    "content": "import type { ResultSetHeader } from 'mysql2/promise';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { SingleStoreDriverDatabase } from '~/singlestore/driver.ts';\nimport { type ColumnsSelection, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { SingleStoreDialect } from './dialect.ts';\nimport { SingleStoreCountBuilder } from './query-builders/count.ts';\nimport {\n\tQueryBuilder,\n\tSingleStoreDeleteBase,\n\tSingleStoreInsertBuilder,\n\tSingleStoreSelectBuilder,\n\tSingleStoreUpdateBuilder,\n} from './query-builders/index.ts';\nimport type { SelectedFields } from './query-builders/select.types.ts';\nimport type {\n\tPreparedQueryHKTBase,\n\tSingleStoreQueryResultHKT,\n\tSingleStoreQueryResultKind,\n\tSingleStoreSession,\n\tSingleStoreTransaction,\n\tSingleStoreTransactionConfig,\n} from './session.ts';\nimport type { WithBuilder } from './subquery.ts';\nimport type { SingleStoreTable } from './table.ts';\n\nexport class SingleStoreDatabase<\n\tTQueryResult extends SingleStoreQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTFullSchema extends Record<string, unknown> = {},\n\tTSchema extends TablesRelationalConfig = ExtractTablesWithRelations<TFullSchema>,\n> {\n\tstatic readonly [entityKind]: string = 'SingleStoreDatabase';\n\n\tdeclare readonly _: {\n\t\treadonly schema: TSchema | undefined;\n\t\treadonly fullSchema: TFullSchema;\n\t\treadonly tableNamesMap: Record<string, string>;\n\t};\n\n\t// We are waiting for SingleStore support for `json_array` function\n\t/**@inrernal */\n\tquery: unknown;\n\n\tconstructor(\n\t\t/** @internal */\n\t\treadonly dialect: SingleStoreDialect,\n\t\t/** @internal */\n\t\treadonly session: SingleStoreSession<any, any, any, any>,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t) {\n\t\tthis._ = schema\n\t\t\t? {\n\t\t\t\tschema: schema.schema,\n\t\t\t\tfullSchema: schema.fullSchema as TFullSchema,\n\t\t\t\ttableNamesMap: schema.tableNamesMap,\n\t\t\t}\n\t\t\t: {\n\t\t\t\tschema: undefined,\n\t\t\t\tfullSchema: {} as TFullSchema,\n\t\t\t\ttableNamesMap: {},\n\t\t\t};\n\t\tthis.query = {} as typeof this['query'];\n\t\t// this.queryNotSupported = true;\n\t\t// if (this._.schema) {\n\t\t// \tfor (const [tableName, columns] of Object.entries(this._.schema)) {\n\t\t// \t\t(this.query as SingleStoreDatabase<TQueryResult, TPreparedQueryHKT, Record<string, any>>['query'])[tableName] =\n\t\t// \t\t\tnew RelationalQueryBuilder(\n\t\t// \t\t\t\tschema!.fullSchema,\n\t\t// \t\t\t\tthis._.schema,\n\t\t// \t\t\t\tthis._.tableNamesMap,\n\t\t// \t\t\t\tschema!.fullSchema[tableName] as SingleStoreTable,\n\t\t// \t\t\t\tcolumns,\n\t\t// \t\t\t\tdialect,\n\t\t// \t\t\t\tsession,\n\t\t// \t\t\t);\n\t\t// \t}\n\t\t// }\n\t\tthis.$cache = { invalidate: async (_params: any) => {} };\n\t}\n\n\t/**\n\t * Creates a subquery that defines a temporary named result set as a CTE.\n\t *\n\t * It is useful for breaking down complex queries into simpler parts and for reusing the result set in subsequent parts of the query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param alias The alias for the subquery.\n\t *\n\t * Failure to provide an alias will result in a DrizzleTypeError, preventing the subquery from being referenced in other queries.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Create a subquery with alias 'sq' and use it in the select query\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t *\n\t * To select arbitrary SQL values as fields in a CTE and reference them in other CTEs or in the main query, you need to add aliases to them:\n\t *\n\t * ```ts\n\t * // Select an arbitrary SQL value as a field in a CTE and reference it in the main query\n\t * const sq = db.$with('sq').as(db.select({\n\t *   name: sql<string>`upper(${users.name})`.as('name'),\n\t * })\n\t * .from(users));\n\t *\n\t * const result = await db.with(sq).select({ name: sq.name }).from(sq);\n\t * ```\n\t */\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst self = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(new QueryBuilder(self.dialect));\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t);\n\t\t};\n\t\treturn { as };\n\t};\n\n\t$count(\n\t\tsource: SingleStoreTable | SQL | SQLWrapper, // SingleStoreViewBase |\n\t\tfilters?: SQL<unknown>,\n\t) {\n\t\treturn new SingleStoreCountBuilder({ source, filters, session: this.session });\n\t}\n\n\t/**\n\t * Incorporates a previously defined CTE (using `$with`) into the main query.\n\t *\n\t * This method allows the main query to reference a temporary named result set.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param queries The CTEs to incorporate into the main query.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Define a subquery 'sq' as a CTE using $with\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * // Incorporate the CTE 'sq' into the main query and select from it\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t */\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\t/**\n\t\t * Creates a select query.\n\t\t *\n\t\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all columns and all rows from the 'cars' table\n\t\t * const allCars: Car[] = await db.select().from(cars);\n\t\t *\n\t\t * // Select specific columns and all rows from the 'cars' table\n\t\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t\t *   id: cars.id,\n\t\t *   brand: cars.brand\n\t\t * })\n\t\t *   .from(cars);\n\t\t * ```\n\t\t *\n\t\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t\t *\n\t\t * ```ts\n\t\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t\t *   id: cars.id,\n\t\t *   lowerBrand: sql<string>`lower(${cars.brand})`,\n\t\t * })\n\t\t *   .from(cars);\n\t\t * ```\n\t\t */\n\t\tfunction select(): SingleStoreSelectBuilder<undefined, TPreparedQueryHKT>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SingleStoreSelectBuilder<TSelection, TPreparedQueryHKT>;\n\t\tfunction select(fields?: SelectedFields): SingleStoreSelectBuilder<SelectedFields | undefined, TPreparedQueryHKT> {\n\t\t\treturn new SingleStoreSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct` expression to the select query.\n\t\t *\n\t\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * // Select all unique rows from the 'cars' table\n\t\t * await db.selectDistinct()\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.id, cars.brand, cars.color);\n\t\t *\n\t\t * // Select all unique brands from the 'cars' table\n\t\t * await db.selectDistinct({ brand: cars.brand })\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.brand);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinct(): SingleStoreSelectBuilder<undefined, TPreparedQueryHKT>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SingleStoreSelectBuilder<TSelection, TPreparedQueryHKT>;\n\t\tfunction selectDistinct(\n\t\t\tfields?: SelectedFields,\n\t\t): SingleStoreSelectBuilder<SelectedFields | undefined, TPreparedQueryHKT> {\n\t\t\treturn new SingleStoreSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Creates an update query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t\t *\n\t\t * Use `.set()` method to specify which values to update.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t\t *\n\t\t * @param table The table to update.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Update all rows in the 'cars' table\n\t\t * await db.update(cars).set({ color: 'red' });\n\t\t *\n\t\t * // Update rows with filters and conditions\n\t\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t\t * ```\n\t\t */\n\t\tfunction update<TTable extends SingleStoreTable>(\n\t\t\ttable: TTable,\n\t\t): SingleStoreUpdateBuilder<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\t\treturn new SingleStoreUpdateBuilder(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates a delete query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t\t *\n\t\t * @param table The table to delete from.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Delete all rows in the 'cars' table\n\t\t * await db.delete(cars);\n\t\t *\n\t\t * // Delete rows with filters and conditions\n\t\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t\t * ```\n\t\t */\n\t\tfunction delete_<TTable extends SingleStoreTable>(\n\t\t\ttable: TTable,\n\t\t): SingleStoreDeleteBase<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\t\treturn new SingleStoreDeleteBase(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\treturn { select, selectDistinct, update, delete: delete_ };\n\t}\n\n\t/**\n\t * Creates a select query.\n\t *\n\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all columns and all rows from the 'cars' table\n\t * const allCars: Car[] = await db.select().from(cars);\n\t *\n\t * // Select specific columns and all rows from the 'cars' table\n\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t *   id: cars.id,\n\t *   brand: cars.brand\n\t * })\n\t *   .from(cars);\n\t * ```\n\t *\n\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t *\n\t * ```ts\n\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t *   id: cars.id,\n\t *   lowerBrand: sql<string>`lower(${cars.brand})`,\n\t * })\n\t *   .from(cars);\n\t * ```\n\t */\n\tselect(): SingleStoreSelectBuilder<undefined, TPreparedQueryHKT>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SingleStoreSelectBuilder<TSelection, TPreparedQueryHKT>;\n\tselect(fields?: SelectedFields): SingleStoreSelectBuilder<SelectedFields | undefined, TPreparedQueryHKT> {\n\t\treturn new SingleStoreSelectBuilder({ fields: fields ?? undefined, session: this.session, dialect: this.dialect });\n\t}\n\n\t/**\n\t * Adds `distinct` expression to the select query.\n\t *\n\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t * ```ts\n\t * // Select all unique rows from the 'cars' table\n\t * await db.selectDistinct()\n\t *   .from(cars)\n\t *   .orderBy(cars.id, cars.brand, cars.color);\n\t *\n\t * // Select all unique brands from the 'cars' table\n\t * await db.selectDistinct({ brand: cars.brand })\n\t *   .from(cars)\n\t *   .orderBy(cars.brand);\n\t * ```\n\t */\n\tselectDistinct(): SingleStoreSelectBuilder<undefined, TPreparedQueryHKT>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SingleStoreSelectBuilder<TSelection, TPreparedQueryHKT>;\n\tselectDistinct(fields?: SelectedFields): SingleStoreSelectBuilder<SelectedFields | undefined, TPreparedQueryHKT> {\n\t\treturn new SingleStoreSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t/**\n\t * Creates an update query.\n\t *\n\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t *\n\t * Use `.set()` method to specify which values to update.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param table The table to update.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Update all rows in the 'cars' table\n\t * await db.update(cars).set({ color: 'red' });\n\t *\n\t * // Update rows with filters and conditions\n\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t * ```\n\t */\n\tupdate<TTable extends SingleStoreTable>(\n\t\ttable: TTable,\n\t): SingleStoreUpdateBuilder<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\treturn new SingleStoreUpdateBuilder(table, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates an insert query.\n\t *\n\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t *\n\t * @param table The table to insert into.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Insert one row\n\t * await db.insert(cars).values({ brand: 'BMW' });\n\t *\n\t * // Insert multiple rows\n\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t * ```\n\t */\n\tinsert<TTable extends SingleStoreTable>(\n\t\ttable: TTable,\n\t): SingleStoreInsertBuilder<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\treturn new SingleStoreInsertBuilder(table, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates a delete query.\n\t *\n\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param table The table to delete from.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Delete all rows in the 'cars' table\n\t * await db.delete(cars);\n\t *\n\t * // Delete rows with filters and conditions\n\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t * ```\n\t */\n\tdelete<TTable extends SingleStoreTable>(\n\t\ttable: TTable,\n\t): SingleStoreDeleteBase<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\treturn new SingleStoreDeleteBase(table, this.session, this.dialect);\n\t}\n\n\texecute<T extends { [column: string]: any } = ResultSetHeader>(\n\t\tquery: SQLWrapper | string,\n\t): Promise<SingleStoreQueryResultKind<TQueryResult, T>> {\n\t\treturn this.session.execute(typeof query === 'string' ? sql.raw(query) : query.getSQL());\n\t}\n\n\t$cache: { invalidate: Cache['onMutate'] };\n\n\ttransaction<T>(\n\t\ttransaction: (\n\t\t\ttx: SingleStoreTransaction<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema>,\n\t\t\tconfig?: SingleStoreTransactionConfig,\n\t\t) => Promise<T>,\n\t\tconfig?: SingleStoreTransactionConfig,\n\t): Promise<T> {\n\t\treturn this.session.transaction(transaction, config);\n\t}\n}\n\nexport type SingleStoreWithReplicas<Q> = Q & { $primary: Q; $replicas: Q[] };\n\nexport const withReplicas = <\n\tQ extends SingleStoreDriverDatabase,\n>(\n\tprimary: Q,\n\treplicas: [Q, ...Q[]],\n\tgetReplica: (replicas: Q[]) => Q = () => replicas[Math.floor(Math.random() * replicas.length)]!,\n): SingleStoreWithReplicas<Q> => {\n\tconst select: Q['select'] = (...args: []) => getReplica(replicas).select(...args);\n\tconst selectDistinct: Q['selectDistinct'] = (...args: []) => getReplica(replicas).selectDistinct(...args);\n\tconst $count: Q['$count'] = (...args: [any]) => getReplica(replicas).$count(...args);\n\tconst $with: Q['with'] = (...args: []) => getReplica(replicas).with(...args);\n\n\tconst update: Q['update'] = (...args: [any]) => primary.update(...args);\n\tconst insert: Q['insert'] = (...args: [any]) => primary.insert(...args);\n\tconst $delete: Q['delete'] = (...args: [any]) => primary.delete(...args);\n\tconst execute: Q['execute'] = (...args: [any]) => primary.execute(...args);\n\tconst transaction: Q['transaction'] = (...args: [any, any]) => primary.transaction(...args);\n\n\treturn {\n\t\t...primary,\n\t\tupdate,\n\t\tinsert,\n\t\tdelete: $delete,\n\t\texecute,\n\t\ttransaction,\n\t\t$primary: primary,\n\t\t$replicas: replicas,\n\t\tselect,\n\t\tselectDistinct,\n\t\t$count,\n\t\twith: $with,\n\t\tget query() {\n\t\t\treturn getReplica(replicas).query;\n\t\t},\n\t};\n};\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/dialect.ts",
    "content": "import { aliasedTable, aliasedTableColumn, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta } from '~/migrator.ts';\nimport {\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tgetOperators,\n\tgetOrderByOperators,\n\tMany,\n\tnormalizeRelation,\n\tOne,\n\ttype Relation,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { and, eq } from '~/sql/expressions/index.ts';\nimport type { Name, Placeholder, QueryWithTypings, SQLChunk } from '~/sql/sql.ts';\nimport { Param, SQL, sql, View } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table } from '~/table.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { SingleStoreColumn } from './columns/common.ts';\nimport type { SingleStoreDeleteConfig } from './query-builders/delete.ts';\nimport type { SingleStoreInsertConfig } from './query-builders/insert.ts';\nimport type {\n\tSelectedFieldsOrdered,\n\tSingleStoreSelectConfig,\n\tSingleStoreSelectJoinConfig,\n} from './query-builders/select.types.ts';\nimport type { SingleStoreUpdateConfig } from './query-builders/update.ts';\nimport type { SingleStoreSession } from './session.ts';\nimport { SingleStoreTable } from './table.ts';\n/* import { SingleStoreViewBase } from './view-base.ts'; */\n\nexport interface SingleStoreDialectConfig {\n\tcasing?: Casing;\n}\n\nexport class SingleStoreDialect {\n\tstatic readonly [entityKind]: string = 'SingleStoreDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: SingleStoreDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\t}\n\n\tasync migrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SingleStoreSession,\n\t\tconfig: Omit<MigrationConfig, 'migrationsSchema'>,\n\t): Promise<void> {\n\t\tconst migrationsTable = config.migrationsTable ?? '__drizzle_migrations';\n\t\tconst migrationTableCreate = sql`\n\t\t\tcreate table if not exists ${sql.identifier(migrationsTable)} (\n\t\t\t\tid serial primary key,\n\t\t\t\thash text not null,\n\t\t\t\tcreated_at bigint\n\t\t\t)\n\t\t`;\n\t\tawait session.execute(migrationTableCreate);\n\n\t\tconst dbMigrations = await session.all<{ id: number; hash: string; created_at: string }>(\n\t\t\tsql`select id, hash, created_at from ${sql.identifier(migrationsTable)} order by created_at desc limit 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0];\n\n\t\tawait session.transaction(async (tx) => {\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (\n\t\t\t\t\t!lastDbMigration\n\t\t\t\t\t|| Number(lastDbMigration.created_at) < migration.folderMillis\n\t\t\t\t) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tawait tx.execute(\n\t\t\t\t\t\tsql`insert into ${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\\`hash\\`, \\`created_at\\`) values(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\\`${name}\\``;\n\t}\n\n\tescapeParam(_num: number): string {\n\t\treturn `?`;\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({ table, where, returning, withList, limit, orderBy }: SingleStoreDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${orderBySql}${limitSql}${returningSql}`;\n\t}\n\n\tbuildUpdateSet(table: SingleStoreTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter((colName) =>\n\t\t\tset[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined\n\t\t);\n\n\t\tconst setSize = columnNames.length;\n\t\treturn sql.join(columnNames.flatMap((colName, i) => {\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tconst onUpdateFnResult = col.onUpdateFn?.();\n\t\t\tconst value = set[colName] ?? (is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col));\n\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\tif (i < setSize - 1) {\n\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t}\n\t\t\treturn [res];\n\t\t}));\n\t}\n\n\tbuildUpdateQuery({ table, set, where, returning, withList, limit, orderBy }: SingleStoreUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}update ${table} set ${setSql}${whereSql}${orderBySql}${limitSql}${returningSql}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields\n\t\t\t.flatMap(({ field }, i) => {\n\t\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tnew SQL(\n\t\t\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\t\t\tif (is(c, SingleStoreColumn)) {\n\t\t\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn c;\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(query);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Column)) {\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(sql.identifier(this.casing.getColumnCasing(field)));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(field);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\t\tconst entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];\n\n\t\t\t\t\tif (entries.length === 1) {\n\t\t\t\t\t\tconst entry = entries[0]![1];\n\n\t\t\t\t\t\tconst fieldDecoder = is(entry, SQL)\n\t\t\t\t\t\t\t? entry.decoder\n\t\t\t\t\t\t\t: is(entry, Column)\n\t\t\t\t\t\t\t? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }\n\t\t\t\t\t\t\t: entry.sql.decoder;\n\n\t\t\t\t\t\tif (fieldDecoder) {\n\t\t\t\t\t\t\tfield._.sql.decoder = fieldDecoder;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tchunk.push(field);\n\t\t\t\t}\n\n\t\t\t\tif (i < columnsLen - 1) {\n\t\t\t\t\tchunk.push(sql`, `);\n\t\t\t\t}\n\n\t\t\t\treturn chunk;\n\t\t\t});\n\n\t\treturn sql.join(chunks);\n\t}\n\n\tprivate buildLimit(limit: number | Placeholder | undefined): SQL | undefined {\n\t\treturn typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\t}\n\n\tprivate buildOrderBy(orderBy: (SingleStoreColumn | SQL | SQL.Aliased)[] | undefined): SQL | undefined {\n\t\treturn orderBy && orderBy.length > 0 ? sql` order by ${sql.join(orderBy, sql`, `)}` : undefined;\n\t}\n\n\tbuildSelectQuery(\n\t\t{\n\t\t\twithList,\n\t\t\tfields,\n\t\t\tfieldsFlat,\n\t\t\twhere,\n\t\t\thaving,\n\t\t\ttable,\n\t\t\tjoins,\n\t\t\torderBy,\n\t\t\tgroupBy,\n\t\t\tlimit,\n\t\t\toffset,\n\t\t\tlockingClause,\n\t\t\tdistinct,\n\t\t\tsetOperators,\n\t\t}: SingleStoreSelectConfig,\n\t): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<SingleStoreColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t/* : is(table, SingleStoreViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name */\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(({ alias }) =>\n\t\t\t\t\t\talias === (table[Table.Symbol.IsAlias] ? getTableName(table) : table[Table.Symbol.BaseName])\n\t\t\t\t\t))(f.field.table)\n\t\t\t) {\n\t\t\t\tconst tableName = getTableName(f.field.table);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Your \"${\n\t\t\t\t\t\tf.path.join('->')\n\t\t\t\t\t}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst isSingleTable = !joins || joins.length === 0;\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst distinctSql = distinct ? sql` distinct` : undefined;\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable });\n\n\t\tconst tableSql = (() => {\n\t\t\tif (is(table, Table) && table[Table.Symbol.IsAlias]) {\n\t\t\t\treturn sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? '')}.`.if(table[Table.Symbol.Schema])}${\n\t\t\t\t\tsql.identifier(table[Table.Symbol.OriginalName])\n\t\t\t\t} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t\t}\n\n\t\t\treturn table;\n\t\t})();\n\n\t\tconst joinsArray: SQL[] = [];\n\n\t\tif (joins) {\n\t\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t\tconst table = joinMeta.table;\n\t\t\t\tconst lateralSql = joinMeta.lateral ? sql` lateral` : undefined;\n\t\t\t\tconst onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;\n\n\t\t\t\tif (is(table, SingleStoreTable)) {\n\t\t\t\t\tconst tableName = table[SingleStoreTable.Symbol.Name];\n\t\t\t\t\tconst tableSchema = table[SingleStoreTable.Symbol.Schema];\n\t\t\t\t\tconst origTableName = table[SingleStoreTable.Symbol.OriginalName];\n\t\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\t\ttableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined\n\t\t\t\t\t\t}${sql.identifier(origTableName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t} else if (is(table, View)) {\n\t\t\t\t\tconst viewName = table[ViewBaseConfig].name;\n\t\t\t\t\tconst viewSchema = table[ViewBaseConfig].schema;\n\t\t\t\t\tconst origViewName = table[ViewBaseConfig].originalName;\n\t\t\t\t\tconst alias = viewName === origViewName ? undefined : joinMeta.alias;\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\t\tviewSchema ? sql`${sql.identifier(viewSchema)}.` : undefined\n\t\t\t\t\t\t}${sql.identifier(origViewName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${table}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (index < joins.length - 1) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst joinsSql = sql.join(joinsArray);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst groupBySql = groupBy && groupBy.length > 0 ? sql` group by ${sql.join(groupBy, sql`, `)}` : undefined;\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tlet lockingClausesSql;\n\t\tif (lockingClause) {\n\t\t\tconst { config, strength } = lockingClause;\n\t\t\tlockingClausesSql = sql` for ${sql.raw(strength)}`;\n\t\t\tif (config.noWait) {\n\t\t\t\tlockingClausesSql.append(sql` nowait`);\n\t\t\t} else if (config.skipLocked) {\n\t\t\t\tlockingClausesSql.append(sql` skip locked`);\n\t\t\t}\n\t\t}\n\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}${lockingClausesSql}`;\n\n\t\tif (setOperators.length > 0) {\n\t\t\treturn this.buildSetOperations(finalQuery, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(leftSelect: SQL, setOperators: SingleStoreSelectConfig['setOperators']): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: { leftSelect: SQL; setOperator: SingleStoreSelectConfig['setOperators'][number] }): SQL {\n\t\tconst leftChunk = sql`(${leftSelect.getSQL()}) `;\n\t\tconst rightChunk = sql`(${rightSelect.getSQL()})`;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\tconst orderByValues: (SQL<unknown> | Name)[] = [];\n\n\t\t\t// The next bit is necessary because the sql operator replaces ${table.column} with `table`.`column`\n\t\t\t// which is invalid SingleStore syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const orderByUnit of orderBy) {\n\t\t\t\tif (is(orderByUnit, SingleStoreColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(this.casing.getColumnCasing(orderByUnit)));\n\t\t\t\t} else if (is(orderByUnit, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < orderByUnit.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = orderByUnit.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, SingleStoreColumn)) {\n\t\t\t\t\t\t\torderByUnit.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${orderByUnit}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${orderByUnit}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)} `;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery(\n\t\t{ table, values, ignore, onConflict }: SingleStoreInsertConfig,\n\t): { sql: SQL; generatedIds: Record<string, unknown>[] } {\n\t\t// const isSingleValue = values.length === 1;\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, SingleStoreColumn> = table[Table.Symbol.Columns];\n\t\tconst colEntries: [string, SingleStoreColumn][] = Object.entries(columns).filter(([_, col]) =>\n\t\t\t!col.shouldDisableInsert()\n\t\t);\n\n\t\tconst insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));\n\t\tconst generatedIdsResponse: Record<string, unknown>[] = [];\n\n\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\tconst generatedIds: Record<string, unknown> = {};\n\n\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\tif (colValue === undefined || (is(colValue, Param) && colValue.value === undefined)) {\n\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\tif (col.defaultFn !== undefined) {\n\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\tgeneratedIds[fieldName] = defaultFnResult;\n\t\t\t\t\t\tconst defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);\n\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\tconst newValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\tvalueList.push(newValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueList.push(sql`default`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (col.defaultFn && is(colValue, Param)) {\n\t\t\t\t\t\tgeneratedIds[fieldName] = colValue.value;\n\t\t\t\t\t}\n\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgeneratedIdsResponse.push(generatedIds);\n\t\t\tvaluesSqlList.push(valueList);\n\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t}\n\t\t}\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst ignoreSql = ignore ? sql` ignore` : undefined;\n\n\t\tconst onConflictSql = onConflict ? sql` on duplicate key ${onConflict}` : undefined;\n\n\t\treturn {\n\t\t\tsql: sql`insert${ignoreSql} into ${table} ${insertOrder} values ${valuesSql}${onConflictSql}`,\n\t\t\tgeneratedIds: generatedIdsResponse,\n\t\t};\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\tbuildRelationalQuery({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: SingleStoreTable;\n\t\ttableConfig: TableRelationalConfig;\n\t\tqueryConfig: true | DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: Relation;\n\t\tjoinOn?: SQL;\n\t}): BuildRelationalQueryResult<SingleStoreTable, SingleStoreColumn> {\n\t\tlet selection: BuildRelationalQueryResult<SingleStoreTable, SingleStoreColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: SingleStoreSelectConfig['orderBy'], where;\n\t\tconst joins: SingleStoreSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as SingleStoreColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: SingleStoreColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as SingleStoreColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | DBQueryConfig<'many', false>;\n\t\t\t\trelation: Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as SingleStoreColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this.buildRelationalQuery({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as SingleStoreTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = sql`${sql.identifier(relationTableAlias)}.${sql.identifier('data')}`.as(selectedRelationTsKey);\n\t\t\t\tjoins.push({\n\t\t\t\t\ton: sql`true`,\n\t\t\t\t\ttable: new Subquery(builtRelation.sql as SQL, {}, relationTableAlias),\n\t\t\t\t\talias: relationTableAlias,\n\t\t\t\t\tjoinType: 'left',\n\t\t\t\t\tlateral: true,\n\t\t\t\t});\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({ message: `No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\")` });\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`JSON_TO_ARRAY(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field, tsKey, isJson }) =>\n\t\t\t\t\t\tisJson\n\t\t\t\t\t\t\t? sql`${sql.identifier(`${tableAlias}_${tsKey}`)}.${sql.identifier('data')}`\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, Many)) {\n\t\t\t\tfield = sql`json_agg(${field})`;\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield: field.as('data'),\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || (orderBy?.length ?? 0) > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(((orderBy?.length ?? 0) > 0)\n\t\t\t\t\t\t\t? [{\n\t\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\t\tfield: sql`row_number() over (order by ${sql.join(orderBy!, sql`, `)})`,\n\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, SingleStoreTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/expressions.ts",
    "content": "import { bindIfParam } from '~/sql/expressions/index.ts';\nimport type { Placeholder, SQL, SQLChunk, SQLWrapper } from '~/sql/sql.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { SingleStoreColumn } from './columns/index.ts';\n\nexport * from '~/sql/expressions/index.ts';\n\nexport function concat(column: SingleStoreColumn | SQL.Aliased, value: string | Placeholder | SQLWrapper): SQL {\n\treturn sql`${column} || ${bindIfParam(value, column)}`;\n}\n\nexport function substring(\n\tcolumn: SingleStoreColumn | SQL.Aliased,\n\t{ from, for: _for }: { from?: number | Placeholder | SQLWrapper; for?: number | Placeholder | SQLWrapper },\n): SQL {\n\tconst chunks: SQLChunk[] = [sql`substring(`, column];\n\tif (from !== undefined) {\n\t\tchunks.push(sql` from `, bindIfParam(from, column));\n\t}\n\tif (_for !== undefined) {\n\t\tchunks.push(sql` for `, bindIfParam(_for, column));\n\t}\n\tchunks.push(sql`)`);\n\treturn sql.join(chunks);\n}\n\n// Vectors\nexport function dotProduct(column: SingleStoreColumn | SQL.Aliased, value: Array<number>): SQL {\n\treturn sql`${column} <*> ${JSON.stringify(value)}`;\n}\n\nexport function euclideanDistance(column: SingleStoreColumn | SQL.Aliased, value: Array<number>): SQL {\n\treturn sql`${column} <-> ${JSON.stringify(value)}`;\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/index.ts",
    "content": "export * from './alias.ts';\nexport * from './columns/index.ts';\nexport * from './db.ts';\nexport * from './dialect.ts';\nexport * from './indexes.ts';\nexport * from './primary-keys.ts';\nexport * from './query-builders/index.ts';\nexport * from './schema.ts';\nexport * from './session.ts';\nexport * from './subquery.ts';\nexport * from './table.ts';\nexport * from './unique-constraint.ts';\nexport * from './utils.ts';\n/* export * from './view-common.ts';\nexport * from './view.ts'; */\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/indexes.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { AnySingleStoreColumn, SingleStoreColumn } from './columns/index.ts';\nimport type { SingleStoreTable } from './table.ts';\n\ninterface IndexConfig {\n\tname: string;\n\n\tcolumns: IndexColumn[];\n\n\t/**\n\t * If true, the index will be created as `create unique index` instead of `create index`.\n\t */\n\tunique?: boolean;\n\n\t/**\n\t * If set, the index will be created as `create index ... using { 'btree' | 'hash' }`.\n\t */\n\tusing?: 'btree' | 'hash';\n\n\t/**\n\t * If set, the index will be created as `create index ... algorithm { 'default' | 'inplace' | 'copy' }`.\n\t */\n\talgorithm?: 'default' | 'inplace' | 'copy';\n\n\t/**\n\t * If set, adds locks to the index creation.\n\t */\n\tlock?: 'default' | 'none' | 'shared' | 'exclusive';\n}\n\nexport type IndexColumn = SingleStoreColumn | SQL;\n\nexport class IndexBuilderOn {\n\tstatic readonly [entityKind]: string = 'SingleStoreIndexBuilderOn';\n\n\tconstructor(private name: string, private unique: boolean) {}\n\n\ton(...columns: [IndexColumn, ...IndexColumn[]]): IndexBuilder {\n\t\treturn new IndexBuilder(this.name, columns, this.unique);\n\t}\n}\n\nexport interface AnyIndexBuilder {\n\tbuild(table: SingleStoreTable): Index;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface IndexBuilder extends AnyIndexBuilder {}\n\nexport class IndexBuilder implements AnyIndexBuilder {\n\tstatic readonly [entityKind]: string = 'SingleStoreIndexBuilder';\n\n\t/** @internal */\n\tconfig: IndexConfig;\n\n\tconstructor(name: string, columns: IndexColumn[], unique: boolean) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tunique,\n\t\t};\n\t}\n\n\tusing(using: IndexConfig['using']): this {\n\t\tthis.config.using = using;\n\t\treturn this;\n\t}\n\n\talgorithm(algorithm: IndexConfig['algorithm']): this {\n\t\tthis.config.algorithm = algorithm;\n\t\treturn this;\n\t}\n\n\tlock(lock: IndexConfig['lock']): this {\n\t\tthis.config.lock = lock;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: SingleStoreTable): Index {\n\t\treturn new Index(this.config, table);\n\t}\n}\n\nexport class Index {\n\tstatic readonly [entityKind]: string = 'SingleStoreIndex';\n\n\treadonly config: IndexConfig & { table: SingleStoreTable };\n\n\tconstructor(config: IndexConfig, table: SingleStoreTable) {\n\t\tthis.config = { ...config, table };\n\t}\n}\n\nexport type GetColumnsTableName<TColumns> = TColumns extends\n\tAnySingleStoreColumn<{ tableName: infer TTableName extends string }> | AnySingleStoreColumn<\n\t\t{ tableName: infer TTableName extends string }\n\t>[] ? TTableName\n\t: never;\n\nexport function index(name: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(name, false);\n}\n\nexport function uniqueIndex(name: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(name, true);\n}\n\n/* export interface AnyFullTextIndexBuilder {\n\tbuild(table: SingleStoreTable): FullTextIndex;\n} */\n/*\ninterface FullTextIndexConfig {\n\tversion?: number;\n}\n\ninterface FullTextIndexFullConfig extends FullTextIndexConfig {\n\tcolumns: IndexColumn[];\n\n\tname: string;\n}\n\nexport class FullTextIndexBuilderOn {\n\tstatic readonly [entityKind]: string = 'SingleStoreFullTextIndexBuilderOn';\n\n\tconstructor(private name: string, private config: FullTextIndexConfig) {}\n\n\ton(...columns: [IndexColumn, ...IndexColumn[]]): FullTextIndexBuilder {\n\t\treturn new FullTextIndexBuilder({\n\t\t\tname: this.name,\n\t\t\tcolumns: columns,\n\t\t\t...this.config,\n\t\t});\n\t}\n} */\n\n/*\nexport interface FullTextIndexBuilder extends AnyFullTextIndexBuilder {}\n\nexport class FullTextIndexBuilder implements AnyFullTextIndexBuilder {\n\tstatic readonly [entityKind]: string = 'SingleStoreFullTextIndexBuilder'; */\n\n/** @internal */\n/* config: FullTextIndexFullConfig;\n\n\tconstructor(config: FullTextIndexFullConfig) {\n\t\tthis.config = config;\n\t} */\n\n/** @internal */\n/* build(table: SingleStoreTable): FullTextIndex {\n\t\treturn new FullTextIndex(this.config, table);\n\t}\n}\n\nexport class FullTextIndex {\n\tstatic readonly [entityKind]: string = 'SingleStoreFullTextIndex';\n\n\treadonly config: FullTextIndexConfig & { table: SingleStoreTable };\n\n\tconstructor(config: FullTextIndexConfig, table: SingleStoreTable) {\n\t\tthis.config = { ...config, table };\n\t}\n}\n\nexport function fulltext(name: string, config: FullTextIndexConfig): FullTextIndexBuilderOn {\n\treturn new FullTextIndexBuilderOn(name, config);\n}\n\nexport type SortKeyColumn = SingleStoreColumn | SQL;\n\nexport class SortKeyBuilder {\n\tstatic readonly [entityKind]: string = 'SingleStoreSortKeyBuilder';\n\n\tconstructor(private columns: SortKeyColumn[]) {} */\n\n/** @internal */\n/* build(table: SingleStoreTable): SortKey {\n\t\treturn new SortKey(this.columns, table);\n\t}\n}\n\nexport class SortKey {\n\tstatic readonly [entityKind]: string = 'SingleStoreSortKey';\n\n\tconstructor(public columns: SortKeyColumn[], public table: SingleStoreTable) {}\n}\n\nexport function sortKey(...columns: SortKeyColumn[]): SortKeyBuilder {\n\treturn new SortKeyBuilder(columns);\n}\n */\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/primary-keys.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { AnySingleStoreColumn, SingleStoreColumn } from './columns/index.ts';\nimport { SingleStoreTable } from './table.ts';\n\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumn extends AnySingleStoreColumn<{ tableName: TTableName }>,\n\tTColumns extends AnySingleStoreColumn<{ tableName: TTableName }>[],\n>(config: { name?: string; columns: [TColumn, ...TColumns] }): PrimaryKeyBuilder;\n/**\n * @deprecated: Please use primaryKey({ columns: [] }) instead of this function\n * @param columns\n */\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumns extends AnySingleStoreColumn<{ tableName: TTableName }>[],\n>(...columns: TColumns): PrimaryKeyBuilder;\nexport function primaryKey(...config: any) {\n\tif (config[0].columns) {\n\t\treturn new PrimaryKeyBuilder(config[0].columns, config[0].name);\n\t}\n\treturn new PrimaryKeyBuilder(config);\n}\n\nexport class PrimaryKeyBuilder {\n\tstatic readonly [entityKind]: string = 'SingleStorePrimaryKeyBuilder';\n\n\t/** @internal */\n\tcolumns: SingleStoreColumn[];\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tcolumns: SingleStoreColumn[],\n\t\tname?: string,\n\t) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\t/** @internal */\n\tbuild(table: SingleStoreTable): PrimaryKey {\n\t\treturn new PrimaryKey(table, this.columns, this.name);\n\t}\n}\n\nexport class PrimaryKey {\n\tstatic readonly [entityKind]: string = 'SingleStorePrimaryKey';\n\n\treadonly columns: SingleStoreColumn[];\n\treadonly name?: string;\n\n\tconstructor(readonly table: SingleStoreTable, columns: SingleStoreColumn[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\tgetName(): string {\n\t\treturn this.name\n\t\t\t?? `${this.table[SingleStoreTable.Symbol.Name]}_${this.columns.map((column) => column.name).join('_')}_pk`;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/query-builders/count.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { SingleStoreSession } from '../session.ts';\nimport type { SingleStoreTable } from '../table.ts';\n/* import type { SingleStoreViewBase } from '../view-base.ts'; */\n\nexport class SingleStoreCountBuilder<\n\tTSession extends SingleStoreSession<any, any, any>,\n> extends SQL<number> implements Promise<number>, SQLWrapper {\n\tprivate sql: SQL<number>;\n\n\tstatic override readonly [entityKind] = 'SingleStoreCountBuilder';\n\t[Symbol.toStringTag] = 'SingleStoreCountBuilder';\n\n\tprivate session: TSession;\n\n\tprivate static buildEmbeddedCount(\n\t\tsource: SingleStoreTable | /* SingleStoreViewBase | */ SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`(select count(*) from ${source}${sql.raw(' where ').if(filters)}${filters})`;\n\t}\n\n\tprivate static buildCount(\n\t\tsource: SingleStoreTable | /* SingleStoreViewBase | */ SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`select count(*) as count from ${source}${sql.raw(' where ').if(filters)}${filters}`;\n\t}\n\n\tconstructor(\n\t\treadonly params: {\n\t\t\tsource: SingleStoreTable | /* SingleStoreViewBase | */ SQL | SQLWrapper;\n\t\t\tfilters?: SQL<unknown>;\n\t\t\tsession: TSession;\n\t\t},\n\t) {\n\t\tsuper(SingleStoreCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);\n\n\t\tthis.mapWith(Number);\n\n\t\tthis.session = params.session;\n\n\t\tthis.sql = SingleStoreCountBuilder.buildCount(\n\t\t\tparams.source,\n\t\t\tparams.filters,\n\t\t);\n\t}\n\n\tthen<TResult1 = number, TResult2 = never>(\n\t\tonfulfilled?: ((value: number) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n\t\tonrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn Promise.resolve(this.session.count(this.sql))\n\t\t\t.then(\n\t\t\t\tonfulfilled,\n\t\t\t\tonrejected,\n\t\t\t);\n\t}\n\n\tcatch(\n\t\tonRejected?: ((reason: any) => never | PromiseLike<never>) | null | undefined,\n\t): Promise<number> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<number> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/query-builders/delete.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { SingleStoreDialect } from '~/singlestore-core/dialect.ts';\nimport type {\n\tAnySingleStoreQueryResultHKT,\n\tPreparedQueryHKTBase,\n\tPreparedQueryKind,\n\tSingleStorePreparedQueryConfig,\n\tSingleStoreQueryResultHKT,\n\tSingleStoreQueryResultKind,\n\tSingleStoreSession,\n} from '~/singlestore-core/session.ts';\nimport type { SingleStoreTable } from '~/singlestore-core/table.ts';\nimport type { Placeholder, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport type { ValueOrArray } from '~/utils.ts';\nimport type { SingleStoreColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type { SelectedFieldsOrdered } from './select.types.ts';\n\nexport type SingleStoreDeleteWithout<\n\tT extends AnySingleStoreDeleteBase,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T\n\t: Omit<\n\t\tSingleStoreDeleteBase<\n\t\t\tT['_']['table'],\n\t\t\tT['_']['queryResult'],\n\t\t\tT['_']['preparedQueryHKT'],\n\t\t\tTDynamic,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>,\n\t\tT['_']['excludedMethods'] | K\n\t>;\n\nexport type SingleStoreDelete<\n\tTTable extends SingleStoreTable = SingleStoreTable,\n\tTQueryResult extends SingleStoreQueryResultHKT = AnySingleStoreQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n> = SingleStoreDeleteBase<TTable, TQueryResult, TPreparedQueryHKT, true, never>;\n\nexport interface SingleStoreDeleteConfig {\n\twhere?: SQL | undefined;\n\tlimit?: number | Placeholder;\n\torderBy?: (SingleStoreColumn | SQL | SQL.Aliased)[];\n\ttable: SingleStoreTable;\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type SingleStoreDeletePrepare<T extends AnySingleStoreDeleteBase> = PreparedQueryKind<\n\tT['_']['preparedQueryHKT'],\n\tSingleStorePreparedQueryConfig & {\n\t\texecute: SingleStoreQueryResultKind<T['_']['queryResult'], never>;\n\t\titerator: never;\n\t},\n\ttrue\n>;\n\ntype SingleStoreDeleteDynamic<T extends AnySingleStoreDeleteBase> = SingleStoreDelete<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['preparedQueryHKT']\n>;\n\ntype AnySingleStoreDeleteBase = SingleStoreDeleteBase<any, any, any, any, any>;\n\nexport interface SingleStoreDeleteBase<\n\tTTable extends SingleStoreTable,\n\tTQueryResult extends SingleStoreQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<SingleStoreQueryResultKind<TQueryResult, never>> {\n\treadonly _: {\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly preparedQueryHKT: TPreparedQueryHKT;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t};\n}\n\nexport class SingleStoreDeleteBase<\n\tTTable extends SingleStoreTable,\n\tTQueryResult extends SingleStoreQueryResultHKT,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<SingleStoreQueryResultKind<TQueryResult, never>> implements SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'SingleStoreDelete';\n\n\tprivate config: SingleStoreDeleteConfig;\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: SingleStoreSession,\n\t\tprivate dialect: SingleStoreDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, withList };\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will delete only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be deleted.\n\t *\n\t * ```ts\n\t * // Delete all cars with green color\n\t * db.delete(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * db.delete(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Delete all BMW cars with a green color\n\t * db.delete(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Delete all cars with the green or blue color\n\t * db.delete(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): SingleStoreDeleteWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\torderBy(\n\t\tbuilder: (deleteTable: TTable) => ValueOrArray<SingleStoreColumn | SQL | SQL.Aliased>,\n\t): SingleStoreDeleteWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SingleStoreColumn | SQL | SQL.Aliased)[]): SingleStoreDeleteWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(deleteTable: TTable) => ValueOrArray<SingleStoreColumn | SQL | SQL.Aliased>]\n\t\t\t| (SingleStoreColumn | SQL | SQL.Aliased)[]\n\t): SingleStoreDeleteWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as any,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SingleStoreColumn | SQL | SQL.Aliased)[];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\tlimit(limit: number | Placeholder): SingleStoreDeleteWithout<this, TDynamic, 'limit'> {\n\t\tthis.config.limit = limit;\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildDeleteQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\tprepare(): SingleStoreDeletePrepare<this> {\n\t\treturn this.session.prepareQuery(\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\ttype: 'delete',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t},\n\t\t) as SingleStoreDeletePrepare<this>;\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn this.prepare().execute(placeholderValues);\n\t};\n\n\tprivate createIterator = (): ReturnType<this['prepare']>['iterator'] => {\n\t\tconst self = this;\n\t\treturn async function*(placeholderValues) {\n\t\t\tyield* self.prepare().iterator(placeholderValues);\n\t\t};\n\t};\n\n\titerator = this.createIterator();\n\n\t$dynamic(): SingleStoreDeleteDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/query-builders/index.ts",
    "content": "/* export * from './attach.ts';\nexport * from './branch.ts';\nexport * from './createMilestone.ts'; */\nexport * from './delete.ts';\n/* export * from './detach.ts'; */\nexport * from './insert.ts';\n/* export * from './optimizeTable.ts'; */\nexport * from './query-builder.ts';\nexport * from './select.ts';\nexport * from './select.types.ts';\nexport * from './update.ts';\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/query-builders/insert.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { SingleStoreDialect } from '~/singlestore-core/dialect.ts';\nimport type {\n\tAnySingleStoreQueryResultHKT,\n\tPreparedQueryHKTBase,\n\tPreparedQueryKind,\n\tSingleStorePreparedQueryConfig,\n\tSingleStoreQueryResultHKT,\n\tSingleStoreQueryResultKind,\n\tSingleStoreSession,\n} from '~/singlestore-core/session.ts';\nimport type { SingleStoreTable } from '~/singlestore-core/table.ts';\nimport type { Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { Param, SQL, sql } from '~/sql/sql.ts';\nimport type { InferModelFromColumns } from '~/table.ts';\nimport { Table } from '~/table.ts';\nimport { mapUpdateSet, orderSelectedFields } from '~/utils.ts';\nimport type { AnySingleStoreColumn, SingleStoreColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type { SelectedFieldsOrdered } from './select.types.ts';\nimport type { SingleStoreUpdateSetSource } from './update.ts';\n\nexport interface SingleStoreInsertConfig<TTable extends SingleStoreTable = SingleStoreTable> {\n\ttable: TTable;\n\tvalues: Record<string, Param | SQL>[];\n\tignore: boolean;\n\tonConflict?: SQL;\n\treturning?: SelectedFieldsOrdered;\n}\n\nexport type AnySingleStoreInsertConfig = SingleStoreInsertConfig<SingleStoreTable>;\n\nexport type SingleStoreInsertValue<TTable extends SingleStoreTable> =\n\t& {\n\t\t[Key in keyof TTable['$inferInsert']]: TTable['$inferInsert'][Key] | SQL | Placeholder;\n\t}\n\t& {};\n\nexport class SingleStoreInsertBuilder<\n\tTTable extends SingleStoreTable,\n\tTQueryResult extends SingleStoreQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n> {\n\tstatic readonly [entityKind]: string = 'SingleStoreInsertBuilder';\n\n\tprivate shouldIgnore = false;\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: SingleStoreSession,\n\t\tprivate dialect: SingleStoreDialect,\n\t) {}\n\n\tignore(): this {\n\t\tthis.shouldIgnore = true;\n\t\treturn this;\n\t}\n\n\tvalues(value: SingleStoreInsertValue<TTable>): SingleStoreInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;\n\tvalues(values: SingleStoreInsertValue<TTable>[]): SingleStoreInsertBase<TTable, TQueryResult, TPreparedQueryHKT>;\n\tvalues(\n\t\tvalues: SingleStoreInsertValue<TTable> | SingleStoreInsertValue<TTable>[],\n\t): SingleStoreInsertBase<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\tvalues = Array.isArray(values) ? values : [values];\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('values() must be called with at least one value');\n\t\t}\n\t\tconst mappedValues = values.map((entry) => {\n\t\t\tconst result: Record<string, Param | SQL> = {};\n\t\t\tconst cols = this.table[Table.Symbol.Columns];\n\t\t\tfor (const colKey of Object.keys(entry)) {\n\t\t\t\tconst colValue = entry[colKey as keyof typeof entry];\n\t\t\t\tresult[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);\n\t\t\t}\n\t\t\treturn result;\n\t\t});\n\n\t\treturn new SingleStoreInsertBase(this.table, mappedValues, this.shouldIgnore, this.session, this.dialect);\n\t}\n}\n\nexport type SingleStoreInsertWithout<\n\tT extends AnySingleStoreInsert,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T\n\t: Omit<\n\t\tSingleStoreInsertBase<\n\t\t\tT['_']['table'],\n\t\t\tT['_']['queryResult'],\n\t\t\tT['_']['preparedQueryHKT'],\n\t\t\tT['_']['returning'],\n\t\t\tTDynamic,\n\t\t\tT['_']['excludedMethods'] | '$returning'\n\t\t>,\n\t\tT['_']['excludedMethods'] | K\n\t>;\n\nexport type SingleStoreInsertDynamic<T extends AnySingleStoreInsert> = SingleStoreInsert<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['preparedQueryHKT'],\n\tT['_']['returning']\n>;\n\nexport type SingleStoreInsertPrepare<\n\tT extends AnySingleStoreInsert,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n> = PreparedQueryKind<\n\tT['_']['preparedQueryHKT'],\n\tSingleStorePreparedQueryConfig & {\n\t\texecute: TReturning extends undefined ? SingleStoreQueryResultKind<T['_']['queryResult'], never> : TReturning[];\n\t\titerator: never;\n\t},\n\ttrue\n>;\n\nexport type SingleStoreInsertOnDuplicateKeyUpdateConfig<T extends AnySingleStoreInsert> = {\n\tset: SingleStoreUpdateSetSource<T['_']['table']>;\n};\n\nexport type SingleStoreInsert<\n\tTTable extends SingleStoreTable = SingleStoreTable,\n\tTQueryResult extends SingleStoreQueryResultHKT = AnySingleStoreQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = SingleStoreInsertBase<TTable, TQueryResult, TPreparedQueryHKT, TReturning, true, never>;\n\nexport type SingleStoreInsertReturning<\n\tT extends AnySingleStoreInsert,\n\tTDynamic extends boolean,\n> = SingleStoreInsertBase<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['preparedQueryHKT'],\n\tInferModelFromColumns<GetPrimarySerialOrDefaultKeys<T['_']['table']['_']['columns']>>,\n\tTDynamic,\n\tT['_']['excludedMethods'] | '$returning'\n>;\n\nexport type AnySingleStoreInsert = SingleStoreInsertBase<any, any, any, any, any, any>;\n\nexport interface SingleStoreInsertBase<\n\tTTable extends SingleStoreTable,\n\tTQueryResult extends SingleStoreQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tQueryPromise<TReturning extends undefined ? SingleStoreQueryResultKind<TQueryResult, never> : TReturning[]>,\n\tRunnableQuery<\n\t\tTReturning extends undefined ? SingleStoreQueryResultKind<TQueryResult, never> : TReturning[],\n\t\t'singlestore'\n\t>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\treadonly dialect: 'singlestore';\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly preparedQueryHKT: TPreparedQueryHKT;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly returning: TReturning;\n\t\treadonly result: TReturning extends undefined ? SingleStoreQueryResultKind<TQueryResult, never> : TReturning[];\n\t};\n}\n\nexport type PrimaryKeyKeys<T extends Record<string, AnySingleStoreColumn>> = {\n\t[K in keyof T]: T[K]['_']['isPrimaryKey'] extends true ? T[K]['_']['isAutoincrement'] extends true ? K\n\t\t: T[K]['_']['hasRuntimeDefault'] extends true ? T[K]['_']['isPrimaryKey'] extends true ? K : never\n\t\t: never\n\t\t: T[K]['_']['hasRuntimeDefault'] extends true ? T[K]['_']['isPrimaryKey'] extends true ? K : never\n\t\t: never;\n}[keyof T];\n\nexport type GetPrimarySerialOrDefaultKeys<T extends Record<string, AnySingleStoreColumn>> = {\n\t[K in PrimaryKeyKeys<T>]: T[K];\n};\n\nexport class SingleStoreInsertBase<\n\tTTable extends SingleStoreTable,\n\tTQueryResult extends SingleStoreQueryResultHKT,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? SingleStoreQueryResultKind<TQueryResult, never> : TReturning[]>\n\timplements\n\t\tRunnableQuery<\n\t\t\tTReturning extends undefined ? SingleStoreQueryResultKind<TQueryResult, never> : TReturning[],\n\t\t\t'singlestore'\n\t\t>,\n\t\tSQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SingleStoreInsert';\n\n\tdeclare protected $table: TTable;\n\n\tprivate config: SingleStoreInsertConfig<TTable>;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tvalues: SingleStoreInsertConfig['values'],\n\t\tignore: boolean,\n\t\tprivate session: SingleStoreSession,\n\t\tprivate dialect: SingleStoreDialect,\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, values, ignore };\n\t}\n\n\t/**\n\t * Adds an `on duplicate key update` clause to the query.\n\t *\n\t * Calling this method will update update the row if any unique index conflicts. MySQL will automatically determine the conflict target based on the primary key and unique indexes.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#on-duplicate-key-update}\n\t *\n\t * @param config The `set` clause\n\t *\n\t * @example\n\t * ```ts\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW'})\n\t *   .onDuplicateKeyUpdate({ set: { brand: 'Porsche' }});\n\t * ```\n\t *\n\t * While MySQL does not directly support doing nothing on conflict, you can perform a no-op by setting any column's value to itself and achieve the same effect:\n\t *\n\t * ```ts\n\t * import { sql } from 'drizzle-orm';\n\t *\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onDuplicateKeyUpdate({ set: { id: sql`id` } });\n\t * ```\n\t */\n\tonDuplicateKeyUpdate(\n\t\tconfig: SingleStoreInsertOnDuplicateKeyUpdateConfig<this>,\n\t): SingleStoreInsertWithout<this, TDynamic, 'onDuplicateKeyUpdate'> {\n\t\tconst setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));\n\t\tthis.config.onConflict = sql`update ${setSql}`;\n\t\treturn this as any;\n\t}\n\n\t$returningId(): SingleStoreInsertWithout<\n\t\tSingleStoreInsertReturning<this, TDynamic>,\n\t\tTDynamic,\n\t\t'$returningId'\n\t> {\n\t\tconst returning: SelectedFieldsOrdered = [];\n\t\tfor (const [key, value] of Object.entries(this.config.table[Table.Symbol.Columns])) {\n\t\t\tif (value.primary) {\n\t\t\t\treturning.push({ field: value, path: [key] });\n\t\t\t}\n\t\t}\n\t\tthis.config.returning = orderSelectedFields<SingleStoreColumn>(this.config.table[Table.Symbol.Columns]);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildInsertQuery(this.config).sql;\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\tprepare(): SingleStoreInsertPrepare<this, TReturning> {\n\t\tconst { sql, generatedIds } = this.dialect.buildInsertQuery(this.config);\n\t\treturn this.session.prepareQuery(\n\t\t\tthis.dialect.sqlToQuery(sql),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tgeneratedIds,\n\t\t\tthis.config.returning,\n\t\t\t{\n\t\t\t\ttype: 'delete',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t},\n\t\t) as SingleStoreInsertPrepare<this, TReturning>;\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn this.prepare().execute(placeholderValues);\n\t};\n\n\tprivate createIterator = (): ReturnType<this['prepare']>['iterator'] => {\n\t\tconst self = this;\n\t\treturn async function*(placeholderValues) {\n\t\t\tyield* self.prepare().iterator(placeholderValues);\n\t\t};\n\t};\n\n\titerator = this.createIterator();\n\n\t$dynamic(): SingleStoreInsertDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/query-builders/query-builder.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { SingleStoreDialectConfig } from '~/singlestore-core/dialect.ts';\nimport { SingleStoreDialect } from '~/singlestore-core/dialect.ts';\nimport type { WithBuilder } from '~/singlestore-core/subquery.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport { SingleStoreSelectBuilder } from './select.ts';\nimport type { SelectedFields } from './select.types.ts';\n\nexport class QueryBuilder {\n\tstatic readonly [entityKind]: string = 'SingleStoreQueryBuilder';\n\n\tprivate dialect: SingleStoreDialect | undefined;\n\tprivate dialectConfig: SingleStoreDialectConfig | undefined;\n\n\tconstructor(dialect?: SingleStoreDialect | SingleStoreDialectConfig) {\n\t\tthis.dialect = is(dialect, SingleStoreDialect) ? dialect : undefined;\n\t\tthis.dialectConfig = is(dialect, SingleStoreDialect) ? undefined : dialect;\n\t}\n\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst queryBuilder = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(queryBuilder);\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t) as any;\n\t\t};\n\t\treturn { as };\n\t};\n\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\tfunction select(): SingleStoreSelectBuilder<undefined, never, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SingleStoreSelectBuilder<TSelection, never, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): SingleStoreSelectBuilder<TSelection | undefined, never, 'qb'> {\n\t\t\treturn new SingleStoreSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\tfunction selectDistinct(): SingleStoreSelectBuilder<undefined, never, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SingleStoreSelectBuilder<TSelection, never, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): SingleStoreSelectBuilder<TSelection | undefined, never, 'qb'> {\n\t\t\treturn new SingleStoreSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\treturn { select, selectDistinct };\n\t}\n\n\tselect(): SingleStoreSelectBuilder<undefined, never, 'qb'>;\n\tselect<TSelection extends SelectedFields>(fields: TSelection): SingleStoreSelectBuilder<TSelection, never, 'qb'>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): SingleStoreSelectBuilder<TSelection | undefined, never, 'qb'> {\n\t\treturn new SingleStoreSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t});\n\t}\n\n\tselectDistinct(): SingleStoreSelectBuilder<undefined, never, 'qb'>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SingleStoreSelectBuilder<TSelection, never, 'qb'>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): SingleStoreSelectBuilder<TSelection | undefined, never, 'qb'> {\n\t\treturn new SingleStoreSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t// Lazy load dialect to avoid circular dependency\n\tprivate getDialect() {\n\t\tif (!this.dialect) {\n\t\t\tthis.dialect = new SingleStoreDialect(this.dialectConfig);\n\t\t}\n\n\t\treturn this.dialect;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/query-builders/query.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport {\n\ttype BuildQueryResult,\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tmapRelationalRow,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { Query, QueryWithTypings, SQL } from '~/sql/sql.ts';\nimport type { KnownKeysOnly } from '~/utils.ts';\nimport type { SingleStoreDialect } from '../dialect.ts';\nimport type {\n\tPreparedQueryHKTBase,\n\tPreparedQueryKind,\n\tSingleStorePreparedQueryConfig,\n\tSingleStoreSession,\n} from '../session.ts';\nimport type { SingleStoreTable } from '../table.ts';\n\nexport class RelationalQueryBuilder<\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTSchema extends TablesRelationalConfig,\n\tTFields extends TableRelationalConfig,\n> {\n\tstatic readonly [entityKind]: string = 'SingleStoreRelationalQueryBuilder';\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: TSchema,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\tprivate table: SingleStoreTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: SingleStoreDialect,\n\t\tprivate session: SingleStoreSession,\n\t) {}\n\n\tfindMany<TConfig extends DBQueryConfig<'many', true, TSchema, TFields>>(\n\t\tconfig?: KnownKeysOnly<TConfig, DBQueryConfig<'many', true, TSchema, TFields>>,\n\t): SingleStoreRelationalQuery<TPreparedQueryHKT, BuildQueryResult<TSchema, TFields, TConfig>[]> {\n\t\treturn new SingleStoreRelationalQuery(\n\t\t\tthis.fullSchema,\n\t\t\tthis.schema,\n\t\t\tthis.tableNamesMap,\n\t\t\tthis.table,\n\t\t\tthis.tableConfig,\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tconfig ? (config as DBQueryConfig<'many', true>) : {},\n\t\t\t'many',\n\t\t);\n\t}\n\n\tfindFirst<TSelection extends Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>(\n\t\tconfig?: KnownKeysOnly<TSelection, Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>,\n\t): SingleStoreRelationalQuery<TPreparedQueryHKT, BuildQueryResult<TSchema, TFields, TSelection> | undefined> {\n\t\treturn new SingleStoreRelationalQuery(\n\t\t\tthis.fullSchema,\n\t\t\tthis.schema,\n\t\t\tthis.tableNamesMap,\n\t\t\tthis.table,\n\t\t\tthis.tableConfig,\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tconfig ? { ...(config as DBQueryConfig<'many', true> | undefined), limit: 1 } : { limit: 1 },\n\t\t\t'first',\n\t\t);\n\t}\n}\n\nexport class SingleStoreRelationalQuery<\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTResult,\n> extends QueryPromise<TResult> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreRelationalQuery';\n\n\tdeclare protected $brand: 'SingleStoreRelationalQuery';\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: TablesRelationalConfig,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\tprivate table: SingleStoreTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: SingleStoreDialect,\n\t\tprivate session: SingleStoreSession,\n\t\tprivate config: DBQueryConfig<'many', true> | true,\n\t\tprivate queryMode: 'many' | 'first',\n\t) {\n\t\tsuper();\n\t}\n\n\tprepare() {\n\t\tconst { query, builtQuery } = this._toSQL();\n\t\treturn this.session.prepareQuery(\n\t\t\tbuiltQuery,\n\t\t\tundefined,\n\t\t\t(rawRows) => {\n\t\t\t\tconst rows = rawRows.map((row) => mapRelationalRow(this.schema, this.tableConfig, row, query.selection));\n\t\t\t\tif (this.queryMode === 'first') {\n\t\t\t\t\treturn rows[0] as TResult;\n\t\t\t\t}\n\t\t\t\treturn rows as TResult;\n\t\t\t},\n\t\t) as PreparedQueryKind<TPreparedQueryHKT, SingleStorePreparedQueryConfig & { execute: TResult }, true>;\n\t}\n\n\tprivate _getQuery() {\n\t\treturn this.dialect.buildRelationalQuery({\n\t\t\tfullSchema: this.fullSchema,\n\t\t\tschema: this.schema,\n\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t});\n\t}\n\n\tprivate _toSQL(): { query: BuildRelationalQueryResult; builtQuery: QueryWithTypings } {\n\t\tconst query = this._getQuery();\n\n\t\tconst builtQuery = this.dialect.sqlToQuery(query.sql as SQL);\n\n\t\treturn { builtQuery, query };\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this._getQuery().sql as SQL;\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this._toSQL().builtQuery;\n\t}\n\n\toverride execute(): Promise<TResult> {\n\t\treturn this.prepare().execute();\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/query-builders/select.ts",
    "content": "import type { CacheConfig, WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tGetSelectTableSelection,\n\tJoinNullability,\n\tJoinType,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { SingleStoreColumn } from '~/singlestore-core/columns/index.ts';\nimport type { SingleStoreDialect } from '~/singlestore-core/dialect.ts';\nimport type {\n\tPreparedQueryHKTBase,\n\tSingleStorePreparedQueryConfig,\n\tSingleStoreSession,\n} from '~/singlestore-core/session.ts';\nimport type { SubqueryWithSelection } from '~/singlestore-core/subquery.ts';\nimport type { SingleStoreTable } from '~/singlestore-core/table.ts';\nimport type { ColumnsSelection, Query } from '~/sql/sql.ts';\nimport { SQL } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport {\n\tapplyMixins,\n\tgetTableColumns,\n\tgetTableLikeName,\n\thaveSameKeys,\n\torderSelectedFields,\n\ttype ValueOrArray,\n} from '~/utils.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type {\n\tAnySingleStoreSelect,\n\tCreateSingleStoreSelectFromBuilderMode,\n\tGetSingleStoreSetOperators,\n\tLockConfig,\n\tLockStrength,\n\tSelectedFields,\n\tSetOperatorRightSelect,\n\tSingleStoreCreateSetOperatorFn,\n\tSingleStoreCrossJoinFn,\n\tSingleStoreJoinFn,\n\tSingleStoreSelectConfig,\n\tSingleStoreSelectDynamic,\n\tSingleStoreSelectHKT,\n\tSingleStoreSelectHKTBase,\n\tSingleStoreSelectPrepare,\n\tSingleStoreSelectWithout,\n\tSingleStoreSetOperatorExcludedMethods,\n\tSingleStoreSetOperatorWithResult,\n} from './select.types.ts';\n\nexport class SingleStoreSelectBuilder<\n\tTSelection extends SelectedFields | undefined,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTBuilderMode extends 'db' | 'qb' = 'db',\n> {\n\tstatic readonly [entityKind]: string = 'SingleStoreSelectBuilder';\n\n\tprivate fields: TSelection;\n\tprivate session: SingleStoreSession | undefined;\n\tprivate dialect: SingleStoreDialect;\n\tprivate withList: Subquery[] = [];\n\tprivate distinct: boolean | undefined;\n\n\tconstructor(\n\t\tconfig: {\n\t\t\tfields: TSelection;\n\t\t\tsession: SingleStoreSession | undefined;\n\t\t\tdialect: SingleStoreDialect;\n\t\t\twithList?: Subquery[];\n\t\t\tdistinct?: boolean;\n\t\t},\n\t) {\n\t\tthis.fields = config.fields;\n\t\tthis.session = config.session;\n\t\tthis.dialect = config.dialect;\n\t\tif (config.withList) {\n\t\t\tthis.withList = config.withList;\n\t\t}\n\t\tthis.distinct = config.distinct;\n\t}\n\n\tfrom<TFrom extends SingleStoreTable | Subquery | SQL>( // | SingleStoreViewBase\n\t\tsource: TFrom,\n\t): CreateSingleStoreSelectFromBuilderMode<\n\t\tTBuilderMode,\n\t\tGetSelectTableName<TFrom>,\n\t\tTSelection extends undefined ? GetSelectTableSelection<TFrom> : TSelection,\n\t\tTSelection extends undefined ? 'single' : 'partial',\n\t\tTPreparedQueryHKT\n\t> {\n\t\tconst isPartialSelect = !!this.fields;\n\n\t\tlet fields: SelectedFields;\n\t\tif (this.fields) {\n\t\t\tfields = this.fields;\n\t\t} else if (is(source, Subquery)) {\n\t\t\t// This is required to use the proxy handler to get the correct field values from the subquery\n\t\t\tfields = Object.fromEntries(\n\t\t\t\tObject.keys(source._.selectedFields).map((\n\t\t\t\t\tkey,\n\t\t\t\t) => [key, source[key as unknown as keyof typeof source] as unknown as SelectedFields[string]]),\n\t\t\t);\n\t\t\t/* } else if (is(source, SingleStoreViewBase)) {\n\t\t\tfields = source[ViewBaseConfig].selectedFields as SelectedFields; */\n\t\t} else if (is(source, SQL)) {\n\t\t\tfields = {};\n\t\t} else {\n\t\t\tfields = getTableColumns<SingleStoreTable>(source);\n\t\t}\n\n\t\treturn new SingleStoreSelectBase(\n\t\t\t{\n\t\t\t\ttable: source,\n\t\t\t\tfields,\n\t\t\t\tisPartialSelect,\n\t\t\t\tsession: this.session,\n\t\t\t\tdialect: this.dialect,\n\t\t\t\twithList: this.withList,\n\t\t\t\tdistinct: this.distinct,\n\t\t\t},\n\t\t) as any;\n\t}\n}\n\nexport abstract class SingleStoreSelectQueryBuilderBase<\n\tTHKT extends SingleStoreSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends TypedQueryBuilder<TSelectedFields, TResult> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreSelectQueryBuilder';\n\n\toverride readonly _: {\n\t\treadonly hkt: THKT;\n\t\treadonly tableName: TTableName;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly preparedQueryHKT: TPreparedQueryHKT;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t\treadonly config: SingleStoreSelectConfig;\n\t};\n\n\tprotected config: SingleStoreSelectConfig;\n\tprotected joinsNotNullableMap: Record<string, boolean>;\n\tprivate tableName: string | undefined;\n\tprivate isPartialSelect: boolean;\n\t/** @internal */\n\treadonly session: SingleStoreSession | undefined;\n\tprotected dialect: SingleStoreDialect;\n\tprotected cacheConfig?: WithCacheConfig = undefined;\n\tprotected usedTables: Set<string> = new Set();\n\n\tconstructor(\n\t\t{ table, fields, isPartialSelect, session, dialect, withList, distinct }: {\n\t\t\ttable: SingleStoreSelectConfig['table'];\n\t\t\tfields: SingleStoreSelectConfig['fields'];\n\t\t\tisPartialSelect: boolean;\n\t\t\tsession: SingleStoreSession | undefined;\n\t\t\tdialect: SingleStoreDialect;\n\t\t\twithList: Subquery[];\n\t\t\tdistinct: boolean | undefined;\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis.config = {\n\t\t\twithList,\n\t\t\ttable,\n\t\t\tfields: { ...fields },\n\t\t\tdistinct,\n\t\t\tsetOperators: [],\n\t\t};\n\t\tthis.isPartialSelect = isPartialSelect;\n\t\tthis.session = session;\n\t\tthis.dialect = dialect;\n\t\tthis._ = {\n\t\t\tselectedFields: fields as TSelectedFields,\n\t\t\tconfig: this.config,\n\t\t} as this['_'];\n\t\tthis.tableName = getTableLikeName(table);\n\t\tthis.joinsNotNullableMap = typeof this.tableName === 'string' ? { [this.tableName]: true } : {};\n\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\t}\n\n\t/** @internal */\n\tgetUsedTables() {\n\t\treturn [...this.usedTables];\n\t}\n\n\tprivate createJoin<\n\t\tTJoinType extends JoinType,\n\t\tTIsLateral extends (TJoinType extends 'full' | 'right' ? false : boolean),\n\t>(\n\t\tjoinType: TJoinType,\n\t\tlateral: TIsLateral,\n\t): 'cross' extends TJoinType ? SingleStoreCrossJoinFn<this, TDynamic, TIsLateral>\n\t\t: SingleStoreJoinFn<this, TDynamic, TJoinType, TIsLateral>\n\t{\n\t\treturn (\n\t\t\ttable: SingleStoreTable | Subquery | SQL, // | SingleStoreViewBase\n\t\t\ton?: ((aliases: TSelection) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst baseTableName = this.tableName;\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\t// store all tables used in a query\n\t\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins?.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (!this.isPartialSelect) {\n\t\t\t\t// If this is the first join and this is not a partial select and we're not selecting from raw SQL, \"move\" the fields from the main table to the nested object\n\t\t\t\tif (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === 'string') {\n\t\t\t\t\tthis.config.fields = {\n\t\t\t\t\t\t[baseTableName]: this.config.fields,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (typeof tableName === 'string' && !is(table, SQL)) {\n\t\t\t\t\tconst selection = is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t/* : is(table, View)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields */\n\t\t\t\t\t\t: table[Table.Symbol.Columns];\n\t\t\t\t\tthis.config.fields[tableName] = selection;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.fields,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as TSelection,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (!this.config.joins) {\n\t\t\t\tthis.config.joins = [];\n\t\t\t}\n\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName, lateral });\n\n\t\t\tif (typeof tableName === 'string') {\n\t\t\t\tswitch (joinType) {\n\t\t\t\t\tcase 'left': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'right': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'cross':\n\t\t\t\t\tcase 'inner': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'full': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Executes a `left join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet | null; }[] = await db.select()\n\t *   .from(users)\n\t *   .leftJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number | null; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .leftJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tleftJoin = this.createJoin('left', false);\n\n\t/**\n\t * Executes a `left join lateral` operation by adding subquery to the current query.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join-lateral}\n\t *\n\t * @param table the subquery to join.\n\t * @param on the `on` clause.\n\t */\n\tleftJoinLateral = this.createJoin('left', true);\n\n\t/**\n\t * Executes a `right join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the joined table with the corresponding row from the main table, if a match is found. If no matching row exists, it sets all columns of the main table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#right-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .rightJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .rightJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\trightJoin = this.createJoin('right', false);\n\n\t/**\n\t * Executes an `inner join` operation, creating a new table by combining rows from two tables that have matching values.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .innerJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .innerJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tinnerJoin = this.createJoin('inner', false);\n\n\t/**\n\t * Executes an `inner join lateral` operation, creating a new table by combining rows from two queries that have matching values.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join-lateral}\n\t *\n\t * @param table the subquery to join.\n\t * @param on the `on` clause.\n\t */\n\tinnerJoinLateral = this.createJoin('inner', true);\n\n\t/**\n\t * Executes a `full join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging rows with matching values and filling in `null` for non-matching columns.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#full-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet | null; }[] = await db.select()\n\t *   .from(users)\n\t *   .fullJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number | null; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .fullJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tfullJoin = this.createJoin('full', false);\n\n\t/**\n\t * Executes a `cross join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging all rows from each table.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join}\n\t *\n\t * @param table the table to join.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users, each user with every pet\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .crossJoin(pets)\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .crossJoin(pets)\n\t * ```\n\t */\n\tcrossJoin = this.createJoin('cross', false);\n\n\t/**\n\t * Executes a `cross join lateral` operation by combining rows from two queries into a new table.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method retrieves all rows from both main and joined queries, merging all rows from each query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join-lateral}\n\t *\n\t * @param table the query to join.\n\t */\n\tcrossJoinLateral = this.createJoin('cross', true);\n\n\tprivate createSetOperator(\n\t\ttype: SetOperator,\n\t\tisAll: boolean,\n\t): <TValue extends SingleStoreSetOperatorWithResult<TResult>>(\n\t\trightSelection:\n\t\t\t| ((setOperators: GetSingleStoreSetOperators) => SetOperatorRightSelect<TValue, TResult>)\n\t\t\t| SetOperatorRightSelect<TValue, TResult>,\n\t) => SingleStoreSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tSingleStoreSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\treturn (rightSelection) => {\n\t\t\tconst rightSelect = (typeof rightSelection === 'function'\n\t\t\t\t? rightSelection(getSingleStoreSetOperators())\n\t\t\t\t: rightSelection) as TypedQueryBuilder<\n\t\t\t\t\tany,\n\t\t\t\t\tTResult\n\t\t\t\t>;\n\n\t\t\tif (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.setOperators.push({ type, isAll, rightSelect });\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Adds `union` set operator to the query.\n\t *\n\t * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all unique names from customers and users tables\n\t * await db.select({ name: users.name })\n\t *   .from(users)\n\t *   .union(\n\t *     db.select({ name: customers.name }).from(customers)\n\t *   );\n\t * // or\n\t * import { union } from 'drizzle-orm/singlestore-core'\n\t *\n\t * await union(\n\t *   db.select({ name: users.name }).from(users),\n\t *   db.select({ name: customers.name }).from(customers)\n\t * );\n\t * ```\n\t */\n\tunion = this.createSetOperator('union', false);\n\n\t/**\n\t * Adds `union all` set operator to the query.\n\t *\n\t * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all transaction ids from both online and in-store sales\n\t * await db.select({ transaction: onlineSales.transactionId })\n\t *   .from(onlineSales)\n\t *   .unionAll(\n\t *     db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t *   );\n\t * // or\n\t * import { unionAll } from 'drizzle-orm/singlestore-core'\n\t *\n\t * await unionAll(\n\t *   db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n\t *   db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t * );\n\t * ```\n\t */\n\tunionAll = this.createSetOperator('union', true);\n\n\t/**\n\t * Adds `intersect` set operator to the query.\n\t *\n\t * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select course names that are offered in both departments A and B\n\t * await db.select({ courseName: depA.courseName })\n\t *   .from(depA)\n\t *   .intersect(\n\t *     db.select({ courseName: depB.courseName }).from(depB)\n\t *   );\n\t * // or\n\t * import { intersect } from 'drizzle-orm/singlestore-core'\n\t *\n\t * await intersect(\n\t *   db.select({ courseName: depA.courseName }).from(depA),\n\t *   db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\tintersect = this.createSetOperator('intersect', false);\n\n\t/**\n\t * Adds `except` set operator to the query.\n\t *\n\t * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all courses offered in department A but not in department B\n\t * await db.select({ courseName: depA.courseName })\n\t *   .from(depA)\n\t *   .except(\n\t *     db.select({ courseName: depB.courseName }).from(depB)\n\t *   );\n\t * // or\n\t * import { except } from 'drizzle-orm/singlestore-core'\n\t *\n\t * await except(\n\t *   db.select({ courseName: depA.courseName }).from(depA),\n\t *   db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\texcept = this.createSetOperator('except', false);\n\n\t/**\n\t * Adds `minus` set operator to the query.\n\t *\n\t * This is an alias of `except` supported by SingleStore.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all courses offered in department A but not in department B\n\t * await db.select({ courseName: depA.courseName })\n\t *   .from(depA)\n\t *   .minus(\n\t *     db.select({ courseName: depB.courseName }).from(depB)\n\t *   );\n\t * // or\n\t * import { minus } from 'drizzle-orm/singlestore-core'\n\t *\n\t * await minus(\n\t *   db.select({ courseName: depA.courseName }).from(depA),\n\t *   db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\tminus = this.createSetOperator('except', false);\n\n\t/** @internal */\n\taddSetOperators(setOperators: SingleStoreSelectConfig['setOperators']): SingleStoreSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tSingleStoreSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\tthis.config.setOperators.push(...setOperators);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#filtering}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be selected.\n\t *\n\t * ```ts\n\t * // Select all cars with green color\n\t * await db.select().from(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.select().from(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Select all BMW cars with a green color\n\t * await db.select().from(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Select all cars with the green or blue color\n\t * await db.select().from(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(\n\t\twhere: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): SingleStoreSelectWithout<this, TDynamic, 'where'> {\n\t\tif (typeof where === 'function') {\n\t\t\twhere = where(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `having` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition. It is typically used with aggregate functions to filter the aggregated data based on a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @param having the `having` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all brands with more than one car\n\t * await db.select({\n\t * \tbrand: cars.brand,\n\t * \tcount: sql<number>`cast(count(${cars.id}) as int)`,\n\t * })\n\t *   .from(cars)\n\t *   .groupBy(cars.brand)\n\t *   .having(({ count }) => gt(count, 1));\n\t * ```\n\t */\n\thaving(\n\t\thaving: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): SingleStoreSelectWithout<this, TDynamic, 'having'> {\n\t\tif (typeof having === 'function') {\n\t\t\thaving = having(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.having = having;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `group by` clause to the query.\n\t *\n\t * Calling this method will group rows that have the same values into summary rows, often used for aggregation purposes.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Group and count people by their last names\n\t * await db.select({\n\t *    lastName: people.lastName,\n\t *    count: sql<number>`cast(count(*) as int)`\n\t * })\n\t *   .from(people)\n\t *   .groupBy(people.lastName);\n\t * ```\n\t */\n\tgroupBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<SingleStoreColumn | SQL | SQL.Aliased>,\n\t): SingleStoreSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(...columns: (SingleStoreColumn | SQL | SQL.Aliased)[]): SingleStoreSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<SingleStoreColumn | SQL | SQL.Aliased>]\n\t\t\t| (SingleStoreColumn | SQL | SQL.Aliased)[]\n\t): SingleStoreSelectWithout<this, TDynamic, 'groupBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst groupBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t\tthis.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];\n\t\t} else {\n\t\t\tthis.config.groupBy = columns as (SingleStoreColumn | SQL | SQL.Aliased)[];\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `order by` clause to the query.\n\t *\n\t * Calling this method will sort the result-set in ascending or descending order. By default, the sort order is ascending.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#order-by}\n\t *\n\t * @example\n\t *\n\t * ```\n\t * // Select cars ordered by year\n\t * await db.select().from(cars).orderBy(cars.year);\n\t * ```\n\t *\n\t * You can specify whether results are in ascending or descending order with the `asc()` and `desc()` operators.\n\t *\n\t * ```ts\n\t * // Select cars ordered by year in descending order\n\t * await db.select().from(cars).orderBy(desc(cars.year));\n\t *\n\t * // Select cars ordered by year and price\n\t * await db.select().from(cars).orderBy(asc(cars.year), desc(cars.price));\n\t * ```\n\t */\n\torderBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<SingleStoreColumn | SQL | SQL.Aliased>,\n\t): SingleStoreSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SingleStoreColumn | SQL | SQL.Aliased)[]): SingleStoreSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<SingleStoreColumn | SQL | SQL.Aliased>]\n\t\t\t| (SingleStoreColumn | SQL | SQL.Aliased)[]\n\t): SingleStoreSelectWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SingleStoreColumn | SQL | SQL.Aliased)[];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `limit` clause to the query.\n\t *\n\t * Calling this method will set the maximum number of rows that will be returned by this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param limit the `limit` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the first 10 people from this query.\n\t * await db.select().from(people).limit(10);\n\t * ```\n\t */\n\tlimit(limit: number): SingleStoreSelectWithout<this, TDynamic, 'limit'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.limit = limit;\n\t\t} else {\n\t\t\tthis.config.limit = limit;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `offset` clause to the query.\n\t *\n\t * Calling this method will skip a number of rows when returning results from this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param offset the `offset` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the 10th-20th people from this query.\n\t * await db.select().from(people).offset(10).limit(10);\n\t * ```\n\t */\n\toffset(offset: number): SingleStoreSelectWithout<this, TDynamic, 'offset'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.offset = offset;\n\t\t} else {\n\t\t\tthis.config.offset = offset;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `for` clause to the query.\n\t *\n\t * Calling this method will specify a lock strength for this query that controls how strictly it acquires exclusive access to the rows being queried.\n\t *\n\t * @param strength the lock strength.\n\t * @param config the lock configuration.\n\t */\n\tfor(strength: LockStrength, config: LockConfig = {}): SingleStoreSelectWithout<this, TDynamic, 'for'> {\n\t\tthis.config.lockingClause = { strength, config };\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildSelectQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\tas<TAlias extends string>(\n\t\talias: TAlias,\n\t): SubqueryWithSelection<this['_']['selectedFields'], TAlias> {\n\t\tconst usedTables: string[] = [];\n\t\tusedTables.push(...extractUsedTable(this.config.table));\n\t\tif (this.config.joins) { for (const it of this.config.joins) usedTables.push(...extractUsedTable(it.table)); }\n\n\t\treturn new Proxy(\n\t\t\tnew Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]),\n\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as SubqueryWithSelection<this['_']['selectedFields'], TAlias>;\n\t}\n\n\t/** @internal */\n\toverride getSelectedFields(): this['_']['selectedFields'] {\n\t\treturn new Proxy(\n\t\t\tthis.config.fields,\n\t\t\tnew SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): SingleStoreSelectDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n\nexport interface SingleStoreSelectBase<\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends\n\tSingleStoreSelectQueryBuilderBase<\n\t\tSingleStoreSelectHKT,\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTPreparedQueryHKT,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tQueryPromise<TResult>\n{}\n\nexport class SingleStoreSelectBase<\n\tTTableName extends string | undefined,\n\tTSelection,\n\tTSelectMode extends SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends SingleStoreSelectQueryBuilderBase<\n\tSingleStoreSelectHKT,\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTPreparedQueryHKT,\n\tTNullabilityMap,\n\tTDynamic,\n\tTExcludedMethods,\n\tTResult,\n\tTSelectedFields\n> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreSelect';\n\n\tprepare(): SingleStoreSelectPrepare<this> {\n\t\tif (!this.session) {\n\t\t\tthrow new Error('Cannot execute a query on a query builder. Please use a database instance instead.');\n\t\t}\n\t\tconst fieldsList = orderSelectedFields<SingleStoreColumn>(this.config.fields);\n\t\tconst query = this.session.prepareQuery<\n\t\t\tSingleStorePreparedQueryConfig & { execute: SelectResult<TSelection, TSelectMode, TNullabilityMap>[] },\n\t\t\tTPreparedQueryHKT\n\t\t>(this.dialect.sqlToQuery(this.getSQL()), fieldsList, undefined, undefined, undefined, {\n\t\t\ttype: 'select',\n\t\t\ttables: [...this.usedTables],\n\t\t}, this.cacheConfig);\n\t\tquery.joinsNotNullableMap = this.joinsNotNullableMap;\n\t\treturn query as SingleStoreSelectPrepare<this>;\n\t}\n\n\t$withCache(config?: { config?: CacheConfig; tag?: string; autoInvalidate?: boolean } | false) {\n\t\tthis.cacheConfig = config === undefined\n\t\t\t? { config: {}, enable: true, autoInvalidate: true }\n\t\t\t: config === false\n\t\t\t? { enable: false }\n\t\t\t: { enable: true, autoInvalidate: true, ...config };\n\t\treturn this;\n\t}\n\n\texecute = ((placeholderValues) => {\n\t\treturn this.prepare().execute(placeholderValues);\n\t}) as ReturnType<this['prepare']>['execute'];\n\n\tprivate createIterator = (): ReturnType<this['prepare']>['iterator'] => {\n\t\tconst self = this;\n\t\treturn async function*(placeholderValues) {\n\t\t\tyield* self.prepare().iterator(placeholderValues);\n\t\t};\n\t};\n\n\titerator = this.createIterator();\n}\n\napplyMixins(SingleStoreSelectBase, [QueryPromise]);\n\nfunction createSetOperator(type: SetOperator, isAll: boolean): SingleStoreCreateSetOperatorFn {\n\treturn (leftSelect, rightSelect, ...restSelects) => {\n\t\tconst setOperators = [rightSelect, ...restSelects].map((select) => ({\n\t\t\ttype,\n\t\t\tisAll,\n\t\t\trightSelect: select as AnySingleStoreSelect,\n\t\t}));\n\n\t\tfor (const setOperator of setOperators) {\n\t\t\tif (!haveSameKeys((leftSelect as any).getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn (leftSelect as AnySingleStoreSelect).addSetOperators(setOperators) as any;\n\t};\n}\n\nconst getSingleStoreSetOperators = () => ({\n\tunion,\n\tunionAll,\n\tintersect,\n\texcept,\n\tminus,\n});\n\n/**\n * Adds `union` set operator to the query.\n *\n * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n *\n * @example\n *\n * ```ts\n * // Select all unique names from customers and users tables\n * import { union } from 'drizzle-orm/singlestore-core'\n *\n * await union(\n *   db.select({ name: users.name }).from(users),\n *   db.select({ name: customers.name }).from(customers)\n * );\n * // or\n * await db.select({ name: users.name })\n *   .from(users)\n *   .union(\n *     db.select({ name: customers.name }).from(customers)\n *   );\n * ```\n */\nexport const union = createSetOperator('union', false);\n\n/**\n * Adds `union all` set operator to the query.\n *\n * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n *\n * @example\n *\n * ```ts\n * // Select all transaction ids from both online and in-store sales\n * import { unionAll } from 'drizzle-orm/singlestore-core'\n *\n * await unionAll(\n *   db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n *   db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * // or\n * await db.select({ transaction: onlineSales.transactionId })\n *   .from(onlineSales)\n *   .unionAll(\n *     db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n *   );\n * ```\n */\nexport const unionAll = createSetOperator('union', true);\n\n/**\n * Adds `intersect` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n *\n * @example\n *\n * ```ts\n * // Select course names that are offered in both departments A and B\n * import { intersect } from 'drizzle-orm/singlestore-core'\n *\n * await intersect(\n *   db.select({ courseName: depA.courseName }).from(depA),\n *   db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n *   .from(depA)\n *   .intersect(\n *     db.select({ courseName: depB.courseName }).from(depB)\n *   );\n * ```\n */\nexport const intersect = createSetOperator('intersect', false);\n\n/**\n * Adds `except` set operator to the query.\n *\n * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n *\n * @example\n *\n * ```ts\n * // Select all courses offered in department A but not in department B\n * import { except } from 'drizzle-orm/singlestore-core'\n *\n * await except(\n *   db.select({ courseName: depA.courseName }).from(depA),\n *   db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n *   .from(depA)\n *   .except(\n *     db.select({ courseName: depB.courseName }).from(depB)\n *   );\n * ```\n */\nexport const except = createSetOperator('except', false);\n\n/**\n * Adds `minus` set operator to the query.\n *\n * This is an alias of `except` supported by SingleStore.\n *\n * @example\n *\n * ```ts\n * // Select all courses offered in department A but not in department B\n * import { minus } from 'drizzle-orm/singlestore-core'\n *\n * await minus(\n *   db.select({ courseName: depA.courseName }).from(depA),\n *   db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n *   .from(depA)\n *   .minus(\n *     db.select({ courseName: depB.courseName }).from(depB)\n *   );\n * ```\n */\nexport const minus = createSetOperator('except', true);\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/query-builders/select.types.ts",
    "content": "import type {\n\tSelectedFields as SelectedFieldsBase,\n\tSelectedFieldsFlat as SelectedFieldsFlatBase,\n\tSelectedFieldsOrdered as SelectedFieldsOrderedBase,\n} from '~/operations.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tAppendToNullabilityMap,\n\tAppendToResult,\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tJoinNullability,\n\tJoinType,\n\tMapColumnsToTableAlias,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport type { SingleStoreColumn } from '~/singlestore-core/columns/index.ts';\nimport type { SingleStoreTable, SingleStoreTableWithColumns } from '~/singlestore-core/table.ts';\nimport type { ColumnsSelection, Placeholder, SQL, View } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport type { Table, UpdateTableConfig } from '~/table.ts';\nimport type { Assume, ValidateShape } from '~/utils.ts';\nimport type { PreparedQueryHKTBase, PreparedQueryKind, SingleStorePreparedQueryConfig } from '../session.ts';\n/* import type { SingleStoreViewBase } from '../view-base.ts'; */\n/* import type { SingleStoreViewWithSelection } from '../view.ts'; */\nimport type { SingleStoreSelectBase, SingleStoreSelectQueryBuilderBase } from './select.ts';\n\nexport interface SingleStoreSelectJoinConfig {\n\ton: SQL | undefined;\n\ttable: SingleStoreTable | Subquery | SQL; // SingleStoreViewBase |\n\talias: string | undefined;\n\tjoinType: JoinType;\n\tlateral?: boolean;\n}\n\nexport type BuildAliasTable<TTable extends SingleStoreTable | View, TAlias extends string> = TTable extends Table\n\t? SingleStoreTableWithColumns<\n\t\tUpdateTableConfig<TTable['_']['config'], {\n\t\t\tname: TAlias;\n\t\t\tcolumns: MapColumnsToTableAlias<TTable['_']['columns'], TAlias, 'singlestore'>;\n\t\t}>\n\t>\n\t/* : TTable extends View ? SingleStoreViewWithSelection<\n\t\t\tTAlias,\n\t\t\tTTable['_']['existing'],\n\t\t\tMapColumnsToTableAlias<TTable['_']['selectedFields'], TAlias, 'singlestore'>\n\t\t> */\n\t: never;\n\nexport interface SingleStoreSelectConfig {\n\twithList?: Subquery[];\n\tfields: Record<string, unknown>;\n\tfieldsFlat?: SelectedFieldsOrdered;\n\twhere?: SQL;\n\thaving?: SQL;\n\ttable: SingleStoreTable | Subquery | SQL; // | SingleStoreViewBase\n\tlimit?: number | Placeholder;\n\toffset?: number | Placeholder;\n\tjoins?: SingleStoreSelectJoinConfig[];\n\torderBy?: (SingleStoreColumn | SQL | SQL.Aliased)[];\n\tgroupBy?: (SingleStoreColumn | SQL | SQL.Aliased)[];\n\tlockingClause?: {\n\t\tstrength: LockStrength;\n\t\tconfig: LockConfig;\n\t};\n\tdistinct?: boolean;\n\tsetOperators: {\n\t\trightSelect: TypedQueryBuilder<any, any>;\n\t\ttype: SetOperator;\n\t\tisAll: boolean;\n\t\torderBy?: (SingleStoreColumn | SQL | SQL.Aliased)[];\n\t\tlimit?: number | Placeholder;\n\t\toffset?: number | Placeholder;\n\t}[];\n}\n\nexport type SingleStoreJoin<\n\tT extends AnySingleStoreSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n\tTJoinedTable extends SingleStoreTable | Subquery | SQL, // | SingleStoreViewBase\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n> = T extends any ? SingleStoreSelectWithout<\n\t\tSingleStoreSelectKind<\n\t\t\tT['_']['hkt'],\n\t\t\tT['_']['tableName'],\n\t\t\tAppendToResult<\n\t\t\t\tT['_']['tableName'],\n\t\t\t\tT['_']['selection'],\n\t\t\t\tTJoinedName,\n\t\t\t\tTJoinedTable extends SingleStoreTable ? TJoinedTable['_']['columns']\n\t\t\t\t\t: TJoinedTable extends Subquery ? Assume<TJoinedTable['_']['selectedFields'], SelectedFields>\n\t\t\t\t\t: never,\n\t\t\t\tT['_']['selectMode']\n\t\t\t>,\n\t\t\tT['_']['selectMode'] extends 'partial' ? T['_']['selectMode'] : 'multiple',\n\t\t\tT['_']['preparedQueryHKT'],\n\t\t\tAppendToNullabilityMap<T['_']['nullabilityMap'], TJoinedName, TJoinType>,\n\t\t\tTDynamic,\n\t\t\tT['_']['excludedMethods']\n\t\t>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>\n\t: never;\n\nexport type SingleStoreJoinFn<\n\tT extends AnySingleStoreSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n\tTIsLateral extends boolean,\n> = <\n\tTJoinedTable extends (TIsLateral extends true ? Subquery | SQL\n\t\t: SingleStoreTable | Subquery | SQL /* | SingleStoreViewBase */),\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n>(\n\ttable: TJoinedTable,\n\ton: ((aliases: T['_']['selection']) => SQL | undefined) | SQL | undefined,\n) => SingleStoreJoin<T, TDynamic, TJoinType, TJoinedTable, TJoinedName>;\n\nexport type SingleStoreCrossJoinFn<\n\tT extends AnySingleStoreSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTIsLateral extends boolean,\n> = <\n\tTJoinedTable extends (TIsLateral extends true ? Subquery | SQL\n\t\t: SingleStoreTable | Subquery | SQL /* | SingleStoreViewBase */),\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n>(table: TJoinedTable) => SingleStoreJoin<T, TDynamic, 'cross', TJoinedTable, TJoinedName>;\n\nexport type SelectedFieldsFlat = SelectedFieldsFlatBase<SingleStoreColumn>;\n\nexport type SelectedFields = SelectedFieldsBase<SingleStoreColumn, SingleStoreTable>;\n\nexport type SelectedFieldsOrdered = SelectedFieldsOrderedBase<SingleStoreColumn>;\n\nexport type LockStrength = 'update' | 'share';\n\nexport type LockConfig = {\n\tnoWait: true;\n\tskipLocked?: undefined;\n} | {\n\tnoWait?: undefined;\n\tskipLocked: true;\n} | {\n\tnoWait?: undefined;\n\tskipLocked?: undefined;\n};\n\nexport interface SingleStoreSelectHKTBase {\n\ttableName: string | undefined;\n\tselection: unknown;\n\tselectMode: SelectMode;\n\tpreparedQueryHKT: unknown;\n\tnullabilityMap: unknown;\n\tdynamic: boolean;\n\texcludedMethods: string;\n\tresult: unknown;\n\tselectedFields: unknown;\n\t_type: unknown;\n}\n\nexport type SingleStoreSelectKind<\n\tT extends SingleStoreSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability>,\n\tTDynamic extends boolean,\n\tTExcludedMethods extends string,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> = (T & {\n\ttableName: TTableName;\n\tselection: TSelection;\n\tselectMode: TSelectMode;\n\tpreparedQueryHKT: TPreparedQueryHKT;\n\tnullabilityMap: TNullabilityMap;\n\tdynamic: TDynamic;\n\texcludedMethods: TExcludedMethods;\n\tresult: TResult;\n\tselectedFields: TSelectedFields;\n})['_type'];\n\nexport interface SingleStoreSelectQueryBuilderHKT extends SingleStoreSelectHKTBase {\n\t_type: SingleStoreSelectQueryBuilderBase<\n\t\tSingleStoreSelectQueryBuilderHKT,\n\t\tthis['tableName'],\n\t\tAssume<this['selection'], ColumnsSelection>,\n\t\tthis['selectMode'],\n\t\tAssume<this['preparedQueryHKT'], PreparedQueryHKTBase>,\n\t\tAssume<this['nullabilityMap'], Record<string, JoinNullability>>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods'],\n\t\tAssume<this['result'], any[]>,\n\t\tAssume<this['selectedFields'], ColumnsSelection>\n\t>;\n}\n\nexport interface SingleStoreSelectHKT extends SingleStoreSelectHKTBase {\n\t_type: SingleStoreSelectBase<\n\t\tthis['tableName'],\n\t\tAssume<this['selection'], ColumnsSelection>,\n\t\tthis['selectMode'],\n\t\tAssume<this['preparedQueryHKT'], PreparedQueryHKTBase>,\n\t\tAssume<this['nullabilityMap'], Record<string, JoinNullability>>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods'],\n\t\tAssume<this['result'], any[]>,\n\t\tAssume<this['selectedFields'], ColumnsSelection>\n\t>;\n}\n\nexport type SingleStoreSetOperatorExcludedMethods =\n\t| 'where'\n\t| 'having'\n\t| 'groupBy'\n\t| 'session'\n\t| 'leftJoin'\n\t| 'rightJoin'\n\t| 'innerJoin'\n\t| 'fullJoin'\n\t| 'for';\n\nexport type SingleStoreSelectWithout<\n\tT extends AnySingleStoreSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n\tTResetExcluded extends boolean = false,\n> = TDynamic extends true ? T : Omit<\n\tSingleStoreSelectKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['tableName'],\n\t\tT['_']['selection'],\n\t\tT['_']['selectMode'],\n\t\tT['_']['preparedQueryHKT'],\n\t\tT['_']['nullabilityMap'],\n\t\tTDynamic,\n\t\tTResetExcluded extends true ? K : T['_']['excludedMethods'] | K,\n\t\tT['_']['result'],\n\t\tT['_']['selectedFields']\n\t>,\n\tTResetExcluded extends true ? K : T['_']['excludedMethods'] | K\n>;\n\nexport type SingleStoreSelectPrepare<T extends AnySingleStoreSelect> = PreparedQueryKind<\n\tT['_']['preparedQueryHKT'],\n\tSingleStorePreparedQueryConfig & {\n\t\texecute: T['_']['result'];\n\t\titerator: T['_']['result'][number];\n\t},\n\ttrue\n>;\n\nexport type SingleStoreSelectDynamic<T extends AnySingleStoreSelectQueryBuilder> = SingleStoreSelectKind<\n\tT['_']['hkt'],\n\tT['_']['tableName'],\n\tT['_']['selection'],\n\tT['_']['selectMode'],\n\tT['_']['preparedQueryHKT'],\n\tT['_']['nullabilityMap'],\n\ttrue,\n\tnever,\n\tT['_']['result'],\n\tT['_']['selectedFields']\n>;\n\nexport type CreateSingleStoreSelectFromBuilderMode<\n\tTBuilderMode extends 'db' | 'qb',\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n> = TBuilderMode extends 'db' ? SingleStoreSelectBase<TTableName, TSelection, TSelectMode, TPreparedQueryHKT>\n\t: SingleStoreSelectQueryBuilderBase<\n\t\tSingleStoreSelectQueryBuilderHKT,\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTPreparedQueryHKT\n\t>;\n\nexport type SingleStoreSelectQueryBuilder<\n\tTHKT extends SingleStoreSelectHKTBase = SingleStoreSelectQueryBuilderHKT,\n\tTTableName extends string | undefined = string | undefined,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n\tTResult extends any[] = unknown[],\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> = SingleStoreSelectQueryBuilderBase<\n\tTHKT,\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTPreparedQueryHKT,\n\tTNullabilityMap,\n\ttrue,\n\tnever,\n\tTResult,\n\tTSelectedFields\n>;\n\nexport type AnySingleStoreSelectQueryBuilder = SingleStoreSelectQueryBuilderBase<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany\n>;\n\nexport type AnySingleStoreSetOperatorInterface = SingleStoreSetOperatorInterface<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany\n>;\n\nexport interface SingleStoreSetOperatorInterface<\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> {\n\t_: {\n\t\treadonly hkt: SingleStoreSelectHKT;\n\t\treadonly tableName: TTableName;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly preparedQueryHKT: TPreparedQueryHKT;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t};\n}\n\nexport type SingleStoreSetOperatorWithResult<TResult extends any[]> = SingleStoreSetOperatorInterface<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tTResult,\n\tany\n>;\n\nexport type SingleStoreSelect<\n\tTTableName extends string | undefined = string | undefined,\n\tTSelection extends ColumnsSelection = Record<string, any>,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n> = SingleStoreSelectBase<TTableName, TSelection, TSelectMode, PreparedQueryHKTBase, TNullabilityMap, true, never>;\n\nexport type AnySingleStoreSelect = SingleStoreSelectBase<any, any, any, any, any, any, any, any>;\n\nexport type SingleStoreSetOperator<\n\tTTableName extends string | undefined = string | undefined,\n\tTSelection extends ColumnsSelection = Record<string, any>,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n> = SingleStoreSelectBase<\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTPreparedQueryHKT,\n\tTNullabilityMap,\n\ttrue,\n\tSingleStoreSetOperatorExcludedMethods\n>;\n\nexport type SetOperatorRightSelect<\n\tTValue extends SingleStoreSetOperatorWithResult<TResult>,\n\tTResult extends any[],\n> = TValue extends SingleStoreSetOperatorInterface<any, any, any, any, any, any, any, infer TValueResult, any>\n\t? ValidateShape<\n\t\tTValueResult[number],\n\t\tTResult[number],\n\t\tTypedQueryBuilder<any, TValueResult>\n\t>\n\t: TValue;\n\nexport type SetOperatorRestSelect<\n\tTValue extends readonly SingleStoreSetOperatorWithResult<TResult>[],\n\tTResult extends any[],\n> = TValue extends [infer First, ...infer Rest]\n\t? First extends SingleStoreSetOperatorInterface<any, any, any, any, any, any, any, infer TValueResult, any>\n\t\t? Rest extends AnySingleStoreSetOperatorInterface[] ? [\n\t\t\t\tValidateShape<TValueResult[number], TResult[number], TypedQueryBuilder<any, TValueResult>>,\n\t\t\t\t...SetOperatorRestSelect<Rest, TResult>,\n\t\t\t]\n\t\t: ValidateShape<TValueResult[number], TResult[number], TypedQueryBuilder<any, TValueResult>[]>\n\t: never\n\t: TValue;\n\nexport type SingleStoreCreateSetOperatorFn = <\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTValue extends SingleStoreSetOperatorWithResult<TResult>,\n\tTRest extends SingleStoreSetOperatorWithResult<TResult>[],\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n>(\n\tleftSelect: SingleStoreSetOperatorInterface<\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTPreparedQueryHKT,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\trightSelect: SetOperatorRightSelect<TValue, TResult>,\n\t...restSelects: SetOperatorRestSelect<TRest, TResult>\n) => SingleStoreSelectWithout<\n\tSingleStoreSelectBase<\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTPreparedQueryHKT,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tfalse,\n\tSingleStoreSetOperatorExcludedMethods,\n\ttrue\n>;\n\nexport type GetSingleStoreSetOperators = {\n\tunion: SingleStoreCreateSetOperatorFn;\n\tintersect: SingleStoreCreateSetOperatorFn;\n\texcept: SingleStoreCreateSetOperatorFn;\n\tunionAll: SingleStoreCreateSetOperatorFn;\n\tminus: SingleStoreCreateSetOperatorFn;\n};\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/query-builders/update.ts",
    "content": "import type { GetColumnData } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { SingleStoreDialect } from '~/singlestore-core/dialect.ts';\nimport type {\n\tAnySingleStoreQueryResultHKT,\n\tPreparedQueryHKTBase,\n\tPreparedQueryKind,\n\tSingleStorePreparedQueryConfig,\n\tSingleStoreQueryResultHKT,\n\tSingleStoreQueryResultKind,\n\tSingleStoreSession,\n} from '~/singlestore-core/session.ts';\nimport type { SingleStoreTable } from '~/singlestore-core/table.ts';\nimport type { Placeholder, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { mapUpdateSet, type UpdateSet, type ValueOrArray } from '~/utils.ts';\nimport type { SingleStoreColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type { SelectedFieldsOrdered } from './select.types.ts';\n\nexport interface SingleStoreUpdateConfig {\n\twhere?: SQL | undefined;\n\tlimit?: number | Placeholder;\n\torderBy?: (SingleStoreColumn | SQL | SQL.Aliased)[];\n\tset: UpdateSet;\n\ttable: SingleStoreTable;\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type SingleStoreUpdateSetSource<TTable extends SingleStoreTable> =\n\t& {\n\t\t[Key in keyof TTable['$inferInsert']]?:\n\t\t\t| GetColumnData<TTable['_']['columns'][Key], 'query'>\n\t\t\t| SQL\n\t\t\t| undefined;\n\t}\n\t& {};\n\nexport class SingleStoreUpdateBuilder<\n\tTTable extends SingleStoreTable,\n\tTQueryResult extends SingleStoreQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n> {\n\tstatic readonly [entityKind]: string = 'SingleStoreUpdateBuilder';\n\n\tdeclare readonly _: {\n\t\treadonly table: TTable;\n\t};\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: SingleStoreSession,\n\t\tprivate dialect: SingleStoreDialect,\n\t\tprivate withList?: Subquery[],\n\t) {}\n\n\tset(values: SingleStoreUpdateSetSource<TTable>): SingleStoreUpdateBase<TTable, TQueryResult, TPreparedQueryHKT> {\n\t\treturn new SingleStoreUpdateBase(\n\t\t\tthis.table,\n\t\t\tmapUpdateSet(this.table, values),\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t);\n\t}\n}\n\nexport type SingleStoreUpdateWithout<\n\tT extends AnySingleStoreUpdateBase,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T : Omit<\n\tSingleStoreUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['preparedQueryHKT'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods'] | K\n\t>,\n\tT['_']['excludedMethods'] | K\n>;\n\nexport type SingleStoreUpdatePrepare<T extends AnySingleStoreUpdateBase> = PreparedQueryKind<\n\tT['_']['preparedQueryHKT'],\n\tSingleStorePreparedQueryConfig & {\n\t\texecute: SingleStoreQueryResultKind<T['_']['queryResult'], never>;\n\t\titerator: never;\n\t},\n\ttrue\n>;\n\nexport type SingleStoreUpdateDynamic<T extends AnySingleStoreUpdateBase> = SingleStoreUpdate<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['preparedQueryHKT']\n>;\n\nexport type SingleStoreUpdate<\n\tTTable extends SingleStoreTable = SingleStoreTable,\n\tTQueryResult extends SingleStoreQueryResultHKT = AnySingleStoreQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n> = SingleStoreUpdateBase<TTable, TQueryResult, TPreparedQueryHKT, true, never>;\n\nexport type AnySingleStoreUpdateBase = SingleStoreUpdateBase<any, any, any, any, any>;\n\nexport interface SingleStoreUpdateBase<\n\tTTable extends SingleStoreTable,\n\tTQueryResult extends SingleStoreQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<SingleStoreQueryResultKind<TQueryResult, never>>, SQLWrapper {\n\treadonly _: {\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly preparedQueryHKT: TPreparedQueryHKT;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t};\n}\n\nexport class SingleStoreUpdateBase<\n\tTTable extends SingleStoreTable,\n\tTQueryResult extends SingleStoreQueryResultHKT,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<SingleStoreQueryResultKind<TQueryResult, never>> implements SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'SingleStoreUpdate';\n\n\tprivate config: SingleStoreUpdateConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tset: UpdateSet,\n\t\tprivate session: SingleStoreSession,\n\t\tprivate dialect: SingleStoreDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { set, table, withList };\n\t}\n\n\t/**\n\t * Adds a 'where' clause to the query.\n\t *\n\t * Calling this method will update only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param where the 'where' clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be updated.\n\t *\n\t * ```ts\n\t * // Update all cars with green color\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'));\n\t * // or\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Update all BMW cars with a green color\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Update all cars with the green or blue color\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): SingleStoreUpdateWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\torderBy(\n\t\tbuilder: (updateTable: TTable) => ValueOrArray<SingleStoreColumn | SQL | SQL.Aliased>,\n\t): SingleStoreUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SingleStoreColumn | SQL | SQL.Aliased)[]): SingleStoreUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(updateTable: TTable) => ValueOrArray<SingleStoreColumn | SQL | SQL.Aliased>]\n\t\t\t| (SingleStoreColumn | SQL | SQL.Aliased)[]\n\t): SingleStoreUpdateWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as any,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SingleStoreColumn | SQL | SQL.Aliased)[];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\tlimit(limit: number | Placeholder): SingleStoreUpdateWithout<this, TDynamic, 'limit'> {\n\t\tthis.config.limit = limit;\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildUpdateQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\tprepare(): SingleStoreUpdatePrepare<this> {\n\t\treturn this.session.prepareQuery(\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\ttype: 'delete',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t},\n\t\t) as SingleStoreUpdatePrepare<this>;\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn this.prepare().execute(placeholderValues);\n\t};\n\n\tprivate createIterator = (): ReturnType<this['prepare']>['iterator'] => {\n\t\tconst self = this;\n\t\treturn async function*(placeholderValues) {\n\t\t\tyield* self.prepare().iterator(placeholderValues);\n\t\t};\n\t};\n\n\titerator = this.createIterator();\n\n\t$dynamic(): SingleStoreUpdateDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/schema.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\nimport { type SingleStoreTableFn, singlestoreTableWithSchema } from './table.ts';\n/* import { type singlestoreView, singlestoreViewWithSchema } from './view.ts'; */\n\nexport class SingleStoreSchema<TName extends string = string> {\n\tstatic readonly [entityKind]: string = 'SingleStoreSchema';\n\n\tconstructor(\n\t\tpublic readonly schemaName: TName,\n\t) {}\n\n\ttable: SingleStoreTableFn<TName> = (name, columns, extraConfig) => {\n\t\treturn singlestoreTableWithSchema(name, columns, extraConfig, this.schemaName);\n\t};\n\t/*\n\tview = ((name, columns) => {\n\t\treturn singlestoreViewWithSchema(name, columns, this.schemaName);\n\t}) as typeof singlestoreView; */\n}\n\n/** @deprecated - use `instanceof SingleStoreSchema` */\nexport function isSingleStoreSchema(obj: unknown): obj is SingleStoreSchema {\n\treturn is(obj, SingleStoreSchema);\n}\n\n/**\n * Create a SingleStore schema.\n * https://docs.singlestore.com/cloud/create-a-database/\n *\n * @param name singlestore use schema name\n * @returns SingleStore schema\n */\nexport function singlestoreDatabase<TName extends string>(name: TName) {\n\treturn new SingleStoreSchema(name);\n}\n\n/**\n * @see singlestoreDatabase\n */\nexport const singlestoreSchema = singlestoreDatabase;\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/session.ts",
    "content": "import { type Cache, hashQuery, NoopCache } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleQueryError, TransactionRollbackError } from '~/errors.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { type Query, type SQL, sql } from '~/sql/sql.ts';\nimport type { Assume, Equal } from '~/utils.ts';\nimport { SingleStoreDatabase } from './db.ts';\nimport type { SingleStoreDialect } from './dialect.ts';\nimport type { SelectedFieldsOrdered } from './query-builders/select.types.ts';\n\nexport interface SingleStoreQueryResultHKT {\n\treadonly $brand: 'SingleStoreQueryResultHKT';\n\treadonly row: unknown;\n\treadonly type: unknown;\n}\n\nexport interface AnySingleStoreQueryResultHKT extends SingleStoreQueryResultHKT {\n\treadonly type: any;\n}\n\nexport type SingleStoreQueryResultKind<TKind extends SingleStoreQueryResultHKT, TRow> = (TKind & {\n\treadonly row: TRow;\n})['type'];\n\nexport interface SingleStorePreparedQueryConfig {\n\texecute: unknown;\n\titerator: unknown;\n}\n\nexport interface SingleStorePreparedQueryHKT {\n\treadonly $brand: 'SingleStorePreparedQueryHKT';\n\treadonly config: unknown;\n\treadonly type: unknown;\n}\n\nexport type PreparedQueryKind<\n\tTKind extends SingleStorePreparedQueryHKT,\n\tTConfig extends SingleStorePreparedQueryConfig,\n\tTAssume extends boolean = false,\n> = Equal<TAssume, true> extends true\n\t? Assume<(TKind & { readonly config: TConfig })['type'], SingleStorePreparedQuery<TConfig>>\n\t: (TKind & { readonly config: TConfig })['type'];\n\nexport abstract class SingleStorePreparedQuery<T extends SingleStorePreparedQueryConfig> {\n\tstatic readonly [entityKind]: string = 'SingleStorePreparedQuery';\n\n\tconstructor(\n\t\tprivate cache?: Cache,\n\t\t// per query related metadata\n\t\tprivate queryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\t// config that was passed through $withCache\n\t\tprivate cacheConfig?: WithCacheConfig,\n\t) {\n\t\t// it means that no $withCache options were passed and it should be just enabled\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enable: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enable) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\t}\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tif (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any mutations, if globally is false\n\t\tif (this.cacheConfig && !this.cacheConfig.enable) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// For mutate queries, we should query the database, wait for a response, and then perform invalidation\n\t\tif (\n\t\t\t(\n\t\t\t\tthis.queryMetadata.type === 'insert' || this.queryMetadata.type === 'update'\n\t\t\t\t|| this.queryMetadata.type === 'delete'\n\t\t\t) && this.queryMetadata.tables.length > 0\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst [res] = await Promise.all([\n\t\t\t\t\tquery(),\n\t\t\t\t\tthis.cache.onMutate({ tables: this.queryMetadata.tables }),\n\t\t\t\t]);\n\t\t\t\treturn res;\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any reads if globally disabled\n\t\tif (!this.cacheConfig) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.queryMetadata.type === 'select') {\n\t\t\tconst fromCache = await this.cache.get(\n\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\tthis.queryMetadata.tables,\n\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\tthis.cacheConfig.autoInvalidate,\n\t\t\t);\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tlet result;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await query();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t\t}\n\n\t\t\t\t// put actual key\n\t\t\t\tawait this.cache.put(\n\t\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tthis.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [],\n\t\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\t\tthis.cacheConfig.config,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\t\ttry {\n\t\t\treturn await query();\n\t\t} catch (e) {\n\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t}\n\t}\n\n\t/** @internal */\n\tjoinsNotNullableMap?: Record<string, boolean>;\n\n\tabstract execute(placeholderValues?: Record<string, unknown>): Promise<T['execute']>;\n\n\tabstract iterator(placeholderValues?: Record<string, unknown>): AsyncGenerator<T['iterator']>;\n}\n\nexport interface SingleStoreTransactionConfig {\n\twithConsistentSnapshot?: boolean;\n\taccessMode?: 'read only' | 'read write';\n\tisolationLevel: 'read committed'; // SingleStore only supports read committed isolation level (https://docs.singlestore.com/db/v8.7/introduction/faqs/durability/)\n}\n\nexport abstract class SingleStoreSession<\n\tTQueryResult extends SingleStoreQueryResultHKT = SingleStoreQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = Record<string, never>,\n> {\n\tstatic readonly [entityKind]: string = 'SingleStoreSession';\n\n\tconstructor(protected dialect: SingleStoreDialect) {}\n\n\tabstract prepareQuery<\n\t\tT extends SingleStorePreparedQueryConfig,\n\t\tTPreparedQueryHKT extends SingleStorePreparedQueryHKT,\n\t>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tgeneratedIds?: Record<string, unknown>[],\n\t\treturningIds?: SelectedFieldsOrdered,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PreparedQueryKind<TPreparedQueryHKT, T>;\n\n\texecute<T>(query: SQL): Promise<T> {\n\t\treturn this.prepareQuery<SingleStorePreparedQueryConfig & { execute: T }, PreparedQueryHKTBase>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t).execute();\n\t}\n\n\tabstract all<T = unknown>(query: SQL): Promise<T[]>;\n\n\tasync count(sql: SQL): Promise<number> {\n\t\tconst res = await this.execute<[[{ count: string }]]>(sql);\n\n\t\treturn Number(\n\t\t\tres[0][0]['count'],\n\t\t);\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: SingleStoreTransaction<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: SingleStoreTransactionConfig,\n\t): Promise<T>;\n\n\tprotected getSetTransactionSQL(config: SingleStoreTransactionConfig): SQL | undefined {\n\t\tconst parts: string[] = [];\n\n\t\tif (config.isolationLevel) {\n\t\t\tparts.push(`isolation level ${config.isolationLevel}`);\n\t\t}\n\n\t\treturn parts.length ? sql`set transaction ${sql.raw(parts.join(' '))}` : undefined;\n\t}\n\n\tprotected getStartTransactionSQL(config: SingleStoreTransactionConfig): SQL | undefined {\n\t\tconst parts: string[] = [];\n\n\t\tif (config.withConsistentSnapshot) {\n\t\t\tparts.push('with consistent snapshot');\n\t\t}\n\n\t\tif (config.accessMode) {\n\t\t\tparts.push(config.accessMode);\n\t\t}\n\n\t\treturn parts.length ? sql`start transaction ${sql.raw(parts.join(' '))}` : undefined;\n\t}\n}\n\nexport abstract class SingleStoreTransaction<\n\tTQueryResult extends SingleStoreQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = Record<string, never>,\n> extends SingleStoreDatabase<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreTransaction';\n\n\tconstructor(\n\t\tdialect: SingleStoreDialect,\n\t\tsession: SingleStoreSession,\n\t\tprotected schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprotected readonly nestedIndex: number,\n\t) {\n\t\tsuper(dialect, session, schema);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n\n\t/** Nested transactions (aka savepoints) only work with InnoDB engine. */\n\tabstract override transaction<T>(\n\t\ttransaction: (tx: SingleStoreTransaction<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport interface PreparedQueryHKTBase extends SingleStorePreparedQueryHKT {\n\ttype: SingleStorePreparedQuery<Assume<this['config'], SingleStorePreparedQueryConfig>>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/subquery.ts",
    "content": "import type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { AddAliasToSelection } from '~/query-builders/select.types.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport type { Subquery, WithSubquery, WithSubqueryWithoutSelection } from '~/subquery.ts';\nimport type { QueryBuilder } from './query-builders/query-builder.ts';\n\nexport type SubqueryWithSelection<\n\tTSelection extends ColumnsSelection,\n\tTAlias extends string,\n> =\n\t& Subquery<TAlias, AddAliasToSelection<TSelection, TAlias, 'singlestore'>>\n\t& AddAliasToSelection<TSelection, TAlias, 'singlestore'>;\n\nexport type WithSubqueryWithSelection<\n\tTSelection extends ColumnsSelection,\n\tTAlias extends string,\n> =\n\t& WithSubquery<TAlias, AddAliasToSelection<TSelection, TAlias, 'singlestore'>>\n\t& AddAliasToSelection<TSelection, TAlias, 'singlestore'>;\n\nexport interface WithBuilder {\n\t<TAlias extends string>(alias: TAlias): {\n\t\tas: {\n\t\t\t<TSelection extends ColumnsSelection>(\n\t\t\t\tqb: TypedQueryBuilder<TSelection> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelection>),\n\t\t\t): WithSubqueryWithSelection<TSelection, TAlias>;\n\t\t\t(\n\t\t\t\tqb: TypedQueryBuilder<undefined> | ((qb: QueryBuilder) => TypedQueryBuilder<undefined>),\n\t\t\t): WithSubqueryWithoutSelection<TAlias>;\n\t\t};\n\t};\n\t<TAlias extends string, TSelection extends ColumnsSelection>(alias: TAlias, selection: TSelection): {\n\t\tas: (qb: SQL | ((qb: QueryBuilder) => SQL)) => WithSubqueryWithSelection<TSelection, TAlias>;\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/table.ts",
    "content": "import type { BuildColumns, BuildExtraConfigColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport { getSingleStoreColumnBuilders, type SingleStoreColumnBuilders } from './columns/all.ts';\nimport type { SingleStoreColumn, SingleStoreColumnBuilder, SingleStoreColumnBuilderBase } from './columns/common.ts';\nimport type { AnyIndexBuilder } from './indexes.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type SingleStoreTableExtraConfigValue =\n\t| AnyIndexBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder;\n\nexport type SingleStoreTableExtraConfig = Record<\n\tstring,\n\tSingleStoreTableExtraConfigValue\n>;\n\nexport type TableConfig = TableConfigBase<SingleStoreColumn>;\n\nexport class SingleStoreTable<T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreTable';\n\n\tdeclare protected $columns: T['columns'];\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {});\n\n\t/** @internal */\n\toverride [Table.Symbol.Columns]!: NonNullable<T['columns']>;\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]:\n\t\t| ((self: Record<string, SingleStoreColumn>) => SingleStoreTableExtraConfig)\n\t\t| undefined = undefined;\n}\n\nexport type AnySingleStoreTable<TPartial extends Partial<TableConfig> = {}> = SingleStoreTable<\n\tUpdateTableConfig<TableConfig, TPartial>\n>;\n\nexport type SingleStoreTableWithColumns<T extends TableConfig> =\n\t& SingleStoreTable<T>\n\t& {\n\t\t[Key in keyof T['columns']]: T['columns'][Key];\n\t};\n\nexport function singlestoreTableWithSchema<\n\tTTableName extends string,\n\tTSchemaName extends string | undefined,\n\tTColumnsMap extends Record<string, SingleStoreColumnBuilderBase>,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap | ((columnTypes: SingleStoreColumnBuilders) => TColumnsMap),\n\textraConfig:\n\t\t| ((\n\t\t\tself: BuildColumns<TTableName, TColumnsMap, 'singlestore'>,\n\t\t) => SingleStoreTableExtraConfig | SingleStoreTableExtraConfigValue[])\n\t\t| undefined,\n\tschema: TSchemaName,\n\tbaseName = name,\n): SingleStoreTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchemaName;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'singlestore'>;\n\tdialect: 'singlestore';\n}> {\n\tconst rawTable = new SingleStoreTable<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'singlestore'>;\n\t\tdialect: 'singlestore';\n\t}>(name, schema, baseName);\n\n\tconst parsedColumns: TColumnsMap = typeof columns === 'function' ? columns(getSingleStoreColumnBuilders()) : columns;\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as SingleStoreColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildColumns<TTableName, TColumnsMap, 'singlestore'>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumns as unknown as BuildExtraConfigColumns<\n\t\tTTableName,\n\t\tTColumnsMap,\n\t\t'singlestore'\n\t>;\n\n\tif (extraConfig) {\n\t\ttable[SingleStoreTable.Symbol.ExtraConfigBuilder] = extraConfig as unknown as (\n\t\t\tself: Record<string, SingleStoreColumn>,\n\t\t) => SingleStoreTableExtraConfig;\n\t}\n\n\treturn table;\n}\n\nexport interface SingleStoreTableFn<TSchemaName extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SingleStoreColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: BuildColumns<TTableName, TColumnsMap, 'singlestore'>,\n\t\t) => SingleStoreTableExtraConfigValue[],\n\t): SingleStoreTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'singlestore'>;\n\t\tdialect: 'singlestore';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SingleStoreColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: SingleStoreColumnBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'singlestore'>) => SingleStoreTableExtraConfigValue[],\n\t): SingleStoreTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'singlestore'>;\n\t\tdialect: 'singlestore';\n\t}>;\n\t/**\n\t * @deprecated The third parameter of singlestoreTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = singlestoreTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = singlestoreTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SingleStoreColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'singlestore'>) => SingleStoreTableExtraConfig,\n\t): SingleStoreTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'singlestore'>;\n\t\tdialect: 'singlestore';\n\t}>;\n\n\t/**\n\t * @deprecated The third parameter of singlestoreTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = singlestoreTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = singlestoreTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SingleStoreColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: SingleStoreColumnBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'singlestore'>) => SingleStoreTableExtraConfig,\n\t): SingleStoreTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'singlestore'>;\n\t\tdialect: 'singlestore';\n\t}>;\n}\n\nexport const singlestoreTable: SingleStoreTableFn = (name, columns, extraConfig) => {\n\treturn singlestoreTableWithSchema(name, columns, extraConfig, undefined, name);\n};\n\nexport function singlestoreTableCreator(customizeTableName: (name: string) => string): SingleStoreTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn singlestoreTableWithSchema(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/unique-constraint.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { SingleStoreColumn } from './columns/index.ts';\nimport type { SingleStoreTable } from './table.ts';\n\nexport function unique(name?: string): UniqueOnConstraintBuilder {\n\treturn new UniqueOnConstraintBuilder(name);\n}\n\nexport function uniqueKeyName(table: SingleStoreTable, columns: string[]) {\n\treturn `${table[TableName]}_${columns.join('_')}_unique`;\n}\n\nexport class UniqueConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'SingleStoreUniqueConstraintBuilder';\n\n\t/** @internal */\n\tcolumns: SingleStoreColumn[];\n\n\tconstructor(\n\t\tcolumns: SingleStoreColumn[],\n\t\tprivate name?: string,\n\t) {\n\t\tthis.columns = columns;\n\t}\n\n\t/** @internal */\n\tbuild(table: SingleStoreTable): UniqueConstraint {\n\t\treturn new UniqueConstraint(table, this.columns, this.name);\n\t}\n}\n\nexport class UniqueOnConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'SingleStoreUniqueOnConstraintBuilder';\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tname?: string,\n\t) {\n\t\tthis.name = name;\n\t}\n\n\ton(...columns: [SingleStoreColumn, ...SingleStoreColumn[]]) {\n\t\treturn new UniqueConstraintBuilder(columns, this.name);\n\t}\n}\n\nexport class UniqueConstraint {\n\tstatic readonly [entityKind]: string = 'SingleStoreUniqueConstraint';\n\n\treadonly columns: SingleStoreColumn[];\n\treadonly name?: string;\n\treadonly nullsNotDistinct: boolean = false;\n\n\tconstructor(readonly table: SingleStoreTable, columns: SingleStoreColumn[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n\t}\n\n\tgetName() {\n\t\treturn this.name;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/utils.ts",
    "content": "import { is } from '~/entity.ts';\nimport { SQL } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport type { Index } from './indexes.ts';\nimport { IndexBuilder } from './indexes.ts';\nimport type { PrimaryKey } from './primary-keys.ts';\nimport { PrimaryKeyBuilder } from './primary-keys.ts';\nimport { SingleStoreTable } from './table.ts';\nimport { type UniqueConstraint, UniqueConstraintBuilder } from './unique-constraint.ts';\n/* import { SingleStoreViewConfig } from './view-common.ts';\nimport type { SingleStoreView } from './view.ts'; */\n\nexport function extractUsedTable(table: SingleStoreTable | Subquery | SQL): string[] {\n\tif (is(table, SingleStoreTable)) {\n\t\treturn [`${table[Table.Symbol.BaseName]}`];\n\t}\n\tif (is(table, Subquery)) {\n\t\treturn table._.usedTables ?? [];\n\t}\n\tif (is(table, SQL)) {\n\t\treturn table.usedTables ?? [];\n\t}\n\treturn [];\n}\n\nexport function getTableConfig(table: SingleStoreTable) {\n\tconst columns = Object.values(table[SingleStoreTable.Symbol.Columns]);\n\tconst indexes: Index[] = [];\n\tconst primaryKeys: PrimaryKey[] = [];\n\tconst uniqueConstraints: UniqueConstraint[] = [];\n\tconst name = table[Table.Symbol.Name];\n\tconst schema = table[Table.Symbol.Schema];\n\tconst baseName = table[Table.Symbol.BaseName];\n\n\tconst extraConfigBuilder = table[SingleStoreTable.Symbol.ExtraConfigBuilder];\n\n\tif (extraConfigBuilder !== undefined) {\n\t\tconst extraConfig = extraConfigBuilder(table[SingleStoreTable.Symbol.Columns]);\n\t\tconst extraValues = Array.isArray(extraConfig) ? extraConfig.flat(1) as any[] : Object.values(extraConfig);\n\t\tfor (const builder of Object.values(extraValues)) {\n\t\t\tif (is(builder, IndexBuilder)) {\n\t\t\t\tindexes.push(builder.build(table));\n\t\t\t} else if (is(builder, UniqueConstraintBuilder)) {\n\t\t\t\tuniqueConstraints.push(builder.build(table));\n\t\t\t} else if (is(builder, PrimaryKeyBuilder)) {\n\t\t\t\tprimaryKeys.push(builder.build(table));\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tcolumns,\n\t\tindexes,\n\t\tprimaryKeys,\n\t\tuniqueConstraints,\n\t\tname,\n\t\tschema,\n\t\tbaseName,\n\t};\n}\n\n/* export function getViewConfig<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n>(view: SingleStoreView<TName, TExisting>) {\n\treturn {\n\t\t...view[ViewBaseConfig],\n\t\t...view[SingleStoreViewConfig],\n\t};\n} */\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/view-base.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { ColumnsSelection } from '~/sql/sql.ts';\nimport { View } from '~/sql/sql.ts';\n\nexport abstract class SingleStoreViewBase<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> extends View<TName, TExisting, TSelectedFields> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreViewBase';\n\n\tdeclare readonly _: View<TName, TExisting, TSelectedFields>['_'] & {\n\t\treadonly viewBrand: 'SingleStoreViewBase';\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/view-common.ts",
    "content": "export const SingleStoreViewConfig = Symbol.for('drizzle:SingleStoreViewConfig');\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-core/view.ts",
    "content": "import type { BuildColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { AddAliasToSelection } from '~/query-builders/select.types.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport { getTableColumns } from '~/utils.ts';\nimport type { SingleStoreColumn, SingleStoreColumnBuilderBase } from './columns/index.ts';\nimport { QueryBuilder } from './query-builders/query-builder.ts';\nimport type { SelectedFields } from './query-builders/select.types.ts';\nimport { singlestoreTable } from './table.ts';\nimport { SingleStoreViewBase } from './view-base.ts';\nimport { SingleStoreViewConfig } from './view-common.ts';\n\nexport interface ViewBuilderConfig {\n\talgorithm?: 'undefined' | 'merge' | 'temptable';\n\tdefiner?: string;\n\tsqlSecurity?: 'definer' | 'invoker';\n\twithCheckOption?: 'cascaded' | 'local';\n}\n\nexport class ViewBuilderCore<TConfig extends { name: string; columns?: unknown }> {\n\tstatic readonly [entityKind]: string = 'SingleStoreViewBuilder';\n\n\tdeclare readonly _: {\n\t\treadonly name: TConfig['name'];\n\t\treadonly columns: TConfig['columns'];\n\t};\n\n\tconstructor(\n\t\tprotected name: TConfig['name'],\n\t\tprotected schema: string | undefined,\n\t) {}\n\n\tprotected config: ViewBuilderConfig = {};\n\n\talgorithm(\n\t\talgorithm: Exclude<ViewBuilderConfig['algorithm'], undefined>,\n\t): this {\n\t\tthis.config.algorithm = algorithm;\n\t\treturn this;\n\t}\n\n\tdefiner(\n\t\tdefiner: Exclude<ViewBuilderConfig['definer'], undefined>,\n\t): this {\n\t\tthis.config.definer = definer;\n\t\treturn this;\n\t}\n\n\tsqlSecurity(\n\t\tsqlSecurity: Exclude<ViewBuilderConfig['sqlSecurity'], undefined>,\n\t): this {\n\t\tthis.config.sqlSecurity = sqlSecurity;\n\t\treturn this;\n\t}\n\n\twithCheckOption(\n\t\twithCheckOption?: Exclude<ViewBuilderConfig['withCheckOption'], undefined>,\n\t): this {\n\t\tthis.config.withCheckOption = withCheckOption ?? 'cascaded';\n\t\treturn this;\n\t}\n}\n\nexport class ViewBuilder<TName extends string = string> extends ViewBuilderCore<{ name: TName }> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreViewBuilder';\n\n\tas<TSelectedFields extends SelectedFields>(\n\t\tqb: TypedQueryBuilder<TSelectedFields> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelectedFields>),\n\t): SingleStoreViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'singlestore'>> {\n\t\tif (typeof qb === 'function') {\n\t\t\tqb = qb(new QueryBuilder());\n\t\t}\n\t\tconst selectionProxy = new SelectionProxyHandler<TSelectedFields>({\n\t\t\talias: this.name,\n\t\t\tsqlBehavior: 'error',\n\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\treplaceOriginalName: true,\n\t\t});\n\t\tconst aliasedSelection = new Proxy(qb.getSelectedFields(), selectionProxy);\n\t\treturn new Proxy(\n\t\t\tnew SingleStoreView({\n\t\t\t\tsinglestoreConfig: this.config,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: aliasedSelection,\n\t\t\t\t\tquery: qb.getSQL().inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tselectionProxy as any,\n\t\t) as SingleStoreViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'singlestore'>>;\n\t}\n}\n\nexport class ManualViewBuilder<\n\tTName extends string = string,\n\tTColumns extends Record<string, SingleStoreColumnBuilderBase> = Record<string, SingleStoreColumnBuilderBase>,\n> extends ViewBuilderCore<{ name: TName; columns: TColumns }> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreManualViewBuilder';\n\n\tprivate columns: Record<string, SingleStoreColumn>;\n\n\tconstructor(\n\t\tname: TName,\n\t\tcolumns: TColumns,\n\t\tschema: string | undefined,\n\t) {\n\t\tsuper(name, schema);\n\t\tthis.columns = getTableColumns(singlestoreTable(name, columns)) as BuildColumns<TName, TColumns, 'singlestore'>;\n\t}\n\n\texisting(): SingleStoreViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'singlestore'>> {\n\t\treturn new Proxy(\n\t\t\tnew SingleStoreView({\n\t\t\t\tsinglestoreConfig: undefined,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: undefined,\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as SingleStoreViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'singlestore'>>;\n\t}\n\n\tas(query: SQL): SingleStoreViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'singlestore'>> {\n\t\treturn new Proxy(\n\t\t\tnew SingleStoreView({\n\t\t\t\tsinglestoreConfig: this.config,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: query.inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as SingleStoreViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'singlestore'>>;\n\t}\n}\n\nexport class SingleStoreView<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> extends SingleStoreViewBase<TName, TExisting, TSelectedFields> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreView';\n\n\tdeclare protected $SingleStoreViewBrand: 'SingleStoreView';\n\n\t[SingleStoreViewConfig]: ViewBuilderConfig | undefined;\n\n\tconstructor({ singlestoreConfig, config }: {\n\t\tsinglestoreConfig: ViewBuilderConfig | undefined;\n\t\tconfig: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: SelectedFields;\n\t\t\tquery: SQL | undefined;\n\t\t};\n\t}) {\n\t\tsuper(config);\n\t\tthis[SingleStoreViewConfig] = singlestoreConfig;\n\t}\n}\n\nexport type SingleStoreViewWithSelection<\n\tTName extends string,\n\tTExisting extends boolean,\n\tTSelectedFields extends ColumnsSelection,\n> = SingleStoreView<TName, TExisting, TSelectedFields> & TSelectedFields;\n\n// TODO: needs to be implemented differently compared to MySQL.\n// /** @internal */\n// export function singlestoreViewWithSchema(\n// \tname: string,\n// \tselection: Record<string, SingleStoreColumnBuilderBase> | undefined,\n// \tschema: string | undefined,\n// ): ViewBuilder | ManualViewBuilder {\n// \tif (selection) {\n// \t\treturn new ManualViewBuilder(name, selection, schema);\n// \t}\n// \treturn new ViewBuilder(name, schema);\n// }\n\n// export function singlestoreView<TName extends string>(name: TName): ViewBuilder<TName>;\n// export function singlestoreView<TName extends string, TColumns extends Record<string, SingleStoreColumnBuilderBase>>(\n// \tname: TName,\n// \tcolumns: TColumns,\n// ): ManualViewBuilder<TName, TColumns>;\n// export function singlestoreView(\n// \tname: string,\n// \tselection?: Record<string, SingleStoreColumnBuilderBase>,\n// ): ViewBuilder | ManualViewBuilder {\n// \treturn singlestoreViewWithSchema(name, selection, undefined);\n// }\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-proxy/driver.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { SingleStoreDatabase } from '~/singlestore-core/db.ts';\nimport { SingleStoreDialect } from '~/singlestore-core/dialect.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport {\n\ttype SingleStoreRemotePreparedQueryHKT,\n\ttype SingleStoreRemoteQueryResultHKT,\n\tSingleStoreRemoteSession,\n} from './session.ts';\n\nexport class SingleStoreRemoteDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends SingleStoreDatabase<SingleStoreRemoteQueryResultHKT, SingleStoreRemotePreparedQueryHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreRemoteDatabase';\n}\n\nexport type RemoteCallback = (\n\tsql: string,\n\tparams: any[],\n\tmethod: 'all' | 'execute',\n) => Promise<{ rows: any[]; insertId?: number; affectedRows?: number }>;\n\nexport function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tcallback: RemoteCallback,\n\tconfig: DrizzleConfig<TSchema> = {},\n): SingleStoreRemoteDatabase<TSchema> {\n\tconst dialect = new SingleStoreDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new SingleStoreRemoteSession(callback, dialect, schema, { logger });\n\treturn new SingleStoreRemoteDatabase(dialect, session, schema as any) as SingleStoreRemoteDatabase<\n\t\tTSchema\n\t>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-proxy/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-proxy/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { SingleStoreRemoteDatabase } from './driver.ts';\n\nexport type ProxyMigrator = (migrationQueries: string[]) => Promise<void>;\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: SingleStoreRemoteDatabase<TSchema>,\n\tcallback: ProxyMigrator,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\n\tconst migrationsTable = config.migrationsTable ?? '__drizzle_migrations';\n\tconst migrationTableCreate = sql`\n\t\tcreate table if not exists ${sql.identifier(migrationsTable)} (\n\t\t\tid serial primary key,\n\t\t\thash text not null,\n\t\t\tcreated_at bigint\n\t\t)\n\t`;\n\tawait db.execute(migrationTableCreate);\n\n\tconst dbMigrations = await db.select({\n\t\tid: sql.raw('id'),\n\t\thash: sql.raw('hash'),\n\t\tcreated_at: sql.raw('created_at'),\n\t}).from(sql.identifier(migrationsTable).getSQL()).orderBy(\n\t\tsql.raw('created_at desc'),\n\t).limit(1);\n\n\tconst lastDbMigration = dbMigrations[0];\n\n\tconst queriesToRun: string[] = [];\n\n\tfor (const migration of migrations) {\n\t\tif (\n\t\t\t!lastDbMigration\n\t\t\t|| Number(lastDbMigration.created_at) < migration.folderMillis\n\t\t) {\n\t\t\tqueriesToRun.push(\n\t\t\t\t...migration.sql,\n\t\t\t\t`insert into ${\n\t\t\t\t\tsql.identifier(migrationsTable).value\n\t\t\t\t} (\\`hash\\`, \\`created_at\\`) values('${migration.hash}', '${migration.folderMillis}')`,\n\t\t\t);\n\t\t}\n\t}\n\n\tawait callback(queriesToRun);\n}\n"
  },
  {
    "path": "drizzle-orm/src/singlestore-proxy/session.ts",
    "content": "import type { FieldPacket, ResultSetHeader } from 'mysql2/promise';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport type { SingleStoreDialect } from '~/singlestore-core/dialect.ts';\nimport { SingleStoreTransaction } from '~/singlestore-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/singlestore-core/query-builders/select.types.ts';\nimport type {\n\tPreparedQueryKind,\n\tSingleStorePreparedQueryConfig,\n\tSingleStorePreparedQueryHKT,\n\tSingleStoreQueryResultHKT,\n\tSingleStoreTransactionConfig,\n} from '~/singlestore-core/session.ts';\nimport { SingleStorePreparedQuery as PreparedQueryBase, SingleStoreSession } from '~/singlestore-core/session.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport { fillPlaceholders } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\nimport type { RemoteCallback } from './driver.ts';\n\nexport type SingleStoreRawQueryResult = [ResultSetHeader, FieldPacket[]];\n\nexport interface SingleStoreRemoteSessionOptions {\n\tlogger?: Logger;\n}\n\nexport class SingleStoreRemoteSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SingleStoreSession<SingleStoreRemoteQueryResultHKT, SingleStoreRemotePreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreRemoteSession';\n\n\tprivate logger: Logger;\n\n\tconstructor(\n\t\tprivate client: RemoteCallback,\n\t\tdialect: SingleStoreDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: SingleStoreRemoteSessionOptions,\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\tprepareQuery<T extends SingleStorePreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tgeneratedIds?: Record<string, unknown>[],\n\t\treturningIds?: SelectedFieldsOrdered,\n\t): PreparedQueryKind<SingleStoreRemotePreparedQueryHKT, T> {\n\t\treturn new PreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tfields,\n\t\t\tcustomResultMapper,\n\t\t\tgeneratedIds,\n\t\t\treturningIds,\n\t\t) as PreparedQueryKind<SingleStoreRemotePreparedQueryHKT, T>;\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\tconst querySql = this.dialect.sqlToQuery(query);\n\t\tthis.logger.logQuery(querySql.sql, querySql.params);\n\t\treturn this.client(querySql.sql, querySql.params, 'all').then(({ rows }) => rows) as Promise<T[]>;\n\t}\n\n\toverride async transaction<T>(\n\t\t_transaction: (tx: SingleStoreProxyTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\t_config?: SingleStoreTransactionConfig,\n\t): Promise<T> {\n\t\tthrow new Error('Transactions are not supported by the SingleStore Proxy driver');\n\t}\n}\n\nexport class SingleStoreProxyTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SingleStoreTransaction<\n\tSingleStoreRemoteQueryResultHKT,\n\tSingleStoreRemotePreparedQueryHKT,\n\tTFullSchema,\n\tTSchema\n> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreProxyTransaction';\n\n\toverride async transaction<T>(\n\t\t_transaction: (tx: SingleStoreProxyTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tthrow new Error('Transactions are not supported by the SingleStore Proxy driver');\n\t}\n}\n\nexport class PreparedQuery<T extends SingleStorePreparedQueryConfig> extends PreparedQueryBase<T> {\n\tstatic override readonly [entityKind]: string = 'SingleStoreProxyPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: RemoteCallback,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\t// Keys that were used in $default and the value that was generated for them\n\t\tprivate generatedIds?: Record<string, unknown>[],\n\t\t// Keys that should be returned, it has the column with all properries + key from object\n\t\tprivate returningIds?: SelectedFieldsOrdered,\n\t) {\n\t\tsuper();\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\tconst { fields, client, queryString, logger, joinsNotNullableMap, customResultMapper, returningIds, generatedIds } =\n\t\t\tthis;\n\n\t\tlogger.logQuery(queryString, params);\n\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst { rows: data } = await client(queryString, params, 'execute');\n\n\t\t\tconst insertId = data[0].insertId as number;\n\t\t\tconst affectedRows = data[0].affectedRows;\n\n\t\t\tif (returningIds) {\n\t\t\t\tconst returningResponse = [];\n\t\t\t\tlet j = 0;\n\t\t\t\tfor (let i = insertId; i < insertId + affectedRows; i++) {\n\t\t\t\t\tfor (const column of returningIds) {\n\t\t\t\t\t\tconst key = returningIds[0]!.path[0]!;\n\t\t\t\t\t\tif (is(column.field, Column)) {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tif (column.field.primary && column.field.autoIncrement) {\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: i });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (column.field.defaultFn && generatedIds) {\n\t\t\t\t\t\t\t\t// generatedIds[rowIdx][key]\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: generatedIds[j]![key] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tj++;\n\t\t\t\t}\n\n\t\t\t\treturn returningResponse;\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\tconst { rows } = await client(queryString, params, 'all');\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows);\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t}\n\n\toverride iterator(\n\t\t_placeholderValues: Record<string, unknown> = {},\n\t): AsyncGenerator<T['iterator']> {\n\t\tthrow new Error('Streaming is not supported by the SingleStore Proxy driver');\n\t}\n}\n\nexport interface SingleStoreRemoteQueryResultHKT extends SingleStoreQueryResultHKT {\n\ttype: SingleStoreRawQueryResult;\n}\n\nexport interface SingleStoreRemotePreparedQueryHKT extends SingleStorePreparedQueryHKT {\n\ttype: PreparedQuery<Assume<this['config'], SingleStorePreparedQueryConfig>>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/sql/expressions/conditions.ts",
    "content": "import { type AnyColumn, Column, type GetColumnData } from '~/column.ts';\nimport { is } from '~/entity.ts';\nimport { Table } from '~/table.ts';\nimport {\n\tisDriverValueEncoder,\n\tisSQLWrapper,\n\tParam,\n\tPlaceholder,\n\tSQL,\n\tsql,\n\ttype SQLChunk,\n\ttype SQLWrapper,\n\tStringChunk,\n\tView,\n} from '../sql.ts';\n\nexport function bindIfParam(value: unknown, column: SQLWrapper): SQLChunk {\n\tif (\n\t\tisDriverValueEncoder(column)\n\t\t&& !isSQLWrapper(value)\n\t\t&& !is(value, Param)\n\t\t&& !is(value, Placeholder)\n\t\t&& !is(value, Column)\n\t\t&& !is(value, Table)\n\t\t&& !is(value, View)\n\t) {\n\t\treturn new Param(value, column);\n\t}\n\treturn value as SQLChunk;\n}\n\nexport interface BinaryOperator {\n\t<TColumn extends Column>(\n\t\tleft: TColumn,\n\t\tright: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\t): SQL;\n\t<T>(left: SQL.Aliased<T>, right: T | SQLWrapper): SQL;\n\t<T extends SQLWrapper>(\n\t\tleft: Exclude<T, SQL.Aliased | Column>,\n\t\tright: unknown,\n\t): SQL;\n}\n\n/**\n * Test that two values are equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is null, you may want to use\n * `isNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford\n * db.select().from(cars)\n *   .where(eq(cars.make, 'Ford'))\n * ```\n *\n * @see isNull for a way to test equality to NULL.\n */\nexport const eq: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} = ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that two values are not equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is not null, you may want to use\n * `isNotNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars not made by Ford\n * db.select().from(cars)\n *   .where(ne(cars.make, 'Ford'))\n * ```\n *\n * @see isNotNull for a way to test whether a value is not null.\n */\nexport const ne: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <> ${bindIfParam(right, left)}`;\n};\n\n/**\n * Combine a list of conditions with the `and` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n *   .where(\n *     and(\n *       eq(cars.make, 'Volvo'),\n *       eq(cars.year, 1950),\n *     )\n *   )\n * ```\n */\nexport function and(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function and(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions, new StringChunk(' and ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Combine a list of conditions with the `or` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n *   .where(\n *     or(\n *       eq(cars.make, 'GM'),\n *       eq(cars.make, 'Ford'),\n *     )\n *   )\n * ```\n */\nexport function or(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function or(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions, new StringChunk(' or ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Negate the meaning of an expression using the `not` keyword.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars _not_ made by GM or Ford.\n * db.select().from(cars)\n *   .where(not(inArray(cars.make, ['GM', 'Ford'])))\n * ```\n */\nexport function not(condition: SQLWrapper): SQL {\n\treturn sql`not ${condition}`;\n}\n\n/**\n * Test that the first expression passed is greater than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made after 2000.\n * db.select().from(cars)\n *   .where(gt(cars.year, 2000))\n * ```\n *\n * @see gte for greater-than-or-equal\n */\nexport const gt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} > ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is greater than\n * or equal to the second expression. Use `gt` to\n * test whether an expression is strictly greater\n * than another.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made on or after 2000.\n * db.select().from(cars)\n *   .where(gte(cars.year, 2000))\n * ```\n *\n * @see gt for a strictly greater-than condition\n */\nexport const gte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} >= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n *   .where(lt(cars.year, 2000))\n * ```\n *\n * @see lte for less-than-or-equal\n */\nexport const lt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} < ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * or equal to the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n *   .where(lte(cars.year, 2000))\n * ```\n *\n * @see lt for a strictly less-than condition\n */\nexport const lte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value from a list passed as the second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford or GM.\n * db.select().from(cars)\n *   .where(inArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see notInArray for the inverse of this test\n */\nexport function inArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: ReadonlyArray<GetColumnData<TColumn, 'raw'> | Placeholder> | SQLWrapper,\n): SQL;\nexport function inArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: ReadonlyArray<unknown | Placeholder> | SQLWrapper,\n): SQL;\nexport function inArray(\n\tcolumn: SQLWrapper,\n\tvalues: ReadonlyArray<unknown | Placeholder> | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`false`;\n\t\t}\n\t\treturn sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value that is not present in a list passed as the\n * second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by any company except Ford or GM.\n * db.select().from(cars)\n *   .where(notInArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see inArray for the inverse of this test\n */\nexport function notInArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`true`;\n\t\t}\n\t\treturn sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} not in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether an expression is NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have no discontinuedAt date.\n * db.select().from(cars)\n *   .where(isNull(cars.discontinuedAt))\n * ```\n *\n * @see isNotNull for the inverse of this test\n */\nexport function isNull(value: SQLWrapper): SQL {\n\treturn sql`${value} is null`;\n}\n\n/**\n * Test whether an expression is not NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have been discontinued.\n * db.select().from(cars)\n *   .where(isNotNull(cars.discontinuedAt))\n * ```\n *\n * @see isNull for the inverse of this test\n */\nexport function isNotNull(value: SQLWrapper): SQL {\n\treturn sql`${value} is not null`;\n}\n\n/**\n * Test whether a subquery evaluates to have any rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column has a match in a cities\n * // table.\n * db\n *   .select()\n *   .from(users)\n *   .where(\n *     exists(db.select()\n *       .from(cities)\n *       .where(eq(users.homeCity, cities.id))),\n *   );\n * ```\n *\n * @see notExists for the inverse of this test\n */\nexport function exists(subquery: SQLWrapper): SQL {\n\treturn sql`exists ${subquery}`;\n}\n\n/**\n * Test whether a subquery doesn't include any result\n * rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column doesn't match\n * // a row in the cities table.\n * db\n *   .select()\n *   .from(users)\n *   .where(\n *     notExists(db.select()\n *       .from(cities)\n *       .where(eq(users.homeCity, cities.id))),\n *   );\n * ```\n *\n * @see exists for the inverse of this test\n */\nexport function notExists(subquery: SQLWrapper): SQL {\n\treturn sql`not exists ${subquery}`;\n}\n\n/**\n * Test whether an expression is between two values. This\n * is an easier way to express range tests, which would be\n * expressed mathematically as `x <= a <= y` but in SQL\n * would have to be like `a >= x AND a <= y`.\n *\n * Between is inclusive of the endpoints: if `column`\n * is equal to `min` or `max`, it will be TRUE.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made between 1990 and 2000\n * db.select().from(cars)\n *   .where(between(cars.year, 1990, 2000))\n * ```\n *\n * @see notBetween for the inverse of this test\n */\nexport function between<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function between<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function between<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function between(column: SQLWrapper, min: unknown, max: unknown): SQL {\n\treturn sql`${column} between ${bindIfParam(min, column)} and ${\n\t\tbindIfParam(\n\t\t\tmax,\n\t\t\tcolumn,\n\t\t)\n\t}`;\n}\n\n/**\n * Test whether an expression is not between two values.\n *\n * This, like `between`, includes its endpoints, so if\n * the `column` is equal to `min` or `max`, in this case\n * it will evaluate to FALSE.\n *\n * ## Examples\n *\n * ```ts\n * // Exclude cars made in the 1970s\n * db.select().from(cars)\n *   .where(notBetween(cars.year, 1970, 1979))\n * ```\n *\n * @see between for the inverse of this test\n */\nexport function notBetween<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function notBetween<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function notBetween<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function notBetween(\n\tcolumn: SQLWrapper,\n\tmin: unknown,\n\tmax: unknown,\n): SQL {\n\treturn sql`${column} not between ${\n\t\tbindIfParam(\n\t\t\tmin,\n\t\t\tcolumn,\n\t\t)\n\t} and ${bindIfParam(max, column)}`;\n}\n\n/**\n * Compare a column to a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n *   .where(like(cars.name, '%Turbo%'))\n * ```\n *\n * @see ilike for a case-insensitive version of this condition\n */\nexport function like(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} like ${value}`;\n}\n\n/**\n * The inverse of like - this tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"ROver\" in their name.\n * db.select().from(cars)\n *   .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see like for the inverse condition\n * @see notIlike for a case-insensitive version of this condition\n */\nexport function notLike(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not like ${value}`;\n}\n\n/**\n * Case-insensitively compare a column to a pattern,\n * which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * Unlike like, this performs a case-insensitive comparison.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n *   .where(ilike(cars.name, '%Turbo%'))\n * ```\n *\n * @see like for a case-sensitive version of this condition\n */\nexport function ilike(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} ilike ${value}`;\n}\n\n/**\n * The inverse of ilike - this case-insensitively tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"Rover\" in their name.\n * db.select().from(cars)\n *   .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see ilike for the inverse condition\n * @see notLike for a case-sensitive version of this condition\n */\nexport function notIlike(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not ilike ${value}`;\n}\n\n/**\n * Test that a column or expression contains all elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\" and \"ORM\".\n * db.select().from(posts)\n *   .where(arrayContains(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContained to find if an array contains all elements of a column or expression\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContains<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContains(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContains requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} @> ${array}`;\n\t}\n\n\treturn sql`${column} @> ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that the list passed as the second argument contains\n * all elements of a column or expression.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both,\n * // but filtering posts that have additional tags.\n * db.select().from(posts)\n *   .where(arrayContained(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContained<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContained(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContained requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} <@ ${array}`;\n\t}\n\n\treturn sql`${column} <@ ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that a column or expression contains any elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both.\n * db.select().from(posts)\n *   .where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayContained to find if an array contains all elements of a column or expression\n */\nexport function arrayOverlaps<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayOverlaps(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayOverlaps requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} && ${array}`;\n\t}\n\n\treturn sql`${column} && ${bindIfParam(values, column)}`;\n}\n"
  },
  {
    "path": "drizzle-orm/src/sql/expressions/index.ts",
    "content": "export * from './conditions.ts';\nexport * from './select.ts';\n"
  },
  {
    "path": "drizzle-orm/src/sql/expressions/select.ts",
    "content": "import type { AnyColumn } from '../../column.ts';\nimport type { SQL, SQLWrapper } from '../sql.ts';\nimport { sql } from '../sql.ts';\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in ascending\n * order. By the SQL standard, ascending order is the\n * default, so it is not usually necessary to specify\n * ascending sort order.\n *\n * ## Examples\n *\n * ```ts\n * // Return cars, starting with the oldest models\n * // and going in ascending order to the newest.\n * db.select().from(cars)\n *   .orderBy(asc(cars.year));\n * ```\n *\n * @see desc to sort in descending order\n */\nexport function asc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} asc`;\n}\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in descending\n * order.\n *\n * ## Examples\n *\n * ```ts\n * // Select users, with the most recently created\n * // records coming first.\n * db.select().from(users)\n *   .orderBy(desc(users.createdAt));\n * ```\n *\n * @see asc to sort in ascending order\n */\nexport function desc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} desc`;\n}\n"
  },
  {
    "path": "drizzle-orm/src/sql/functions/aggregate.ts",
    "content": "import { type AnyColumn, Column } from '~/column.ts';\nimport { is } from '~/entity.ts';\nimport { type SQL, sql, type SQLWrapper } from '../sql.ts';\n\n/**\n * Returns the number of values in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // Number employees with null values\n * db.select({ value: count() }).from(employees)\n * // Number of employees where `name` is not null\n * db.select({ value: count(employees.name) }).from(employees)\n * ```\n *\n * @see countDistinct to get the number of non-duplicate values in `expression`\n */\nexport function count(expression?: SQLWrapper): SQL<number> {\n\treturn sql`count(${expression || sql.raw('*')})`.mapWith(Number);\n}\n\n/**\n * Returns the number of non-duplicate values in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // Number of employees where `name` is distinct\n * db.select({ value: countDistinct(employees.name) }).from(employees)\n * ```\n *\n * @see count to get the number of values in `expression`, including duplicates\n */\nexport function countDistinct(expression: SQLWrapper): SQL<number> {\n\treturn sql`count(distinct ${expression})`.mapWith(Number);\n}\n\n/**\n * Returns the average (arithmetic mean) of all non-null values in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // Average salary of an employee\n * db.select({ value: avg(employees.salary) }).from(employees)\n * ```\n *\n * @see avgDistinct to get the average of all non-null and non-duplicate values in `expression`\n */\nexport function avg(expression: SQLWrapper): SQL<string | null> {\n\treturn sql`avg(${expression})`.mapWith(String);\n}\n\n/**\n * Returns the average (arithmetic mean) of all non-null and non-duplicate values in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // Average salary of an employee where `salary` is distinct\n * db.select({ value: avgDistinct(employees.salary) }).from(employees)\n * ```\n *\n * @see avg to get the average of all non-null values in `expression`, including duplicates\n */\nexport function avgDistinct(expression: SQLWrapper): SQL<string | null> {\n\treturn sql`avg(distinct ${expression})`.mapWith(String);\n}\n\n/**\n * Returns the sum of all non-null values in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // Sum of every employee's salary\n * db.select({ value: sum(employees.salary) }).from(employees)\n * ```\n *\n * @see sumDistinct to get the sum of all non-null and non-duplicate values in `expression`\n */\nexport function sum(expression: SQLWrapper): SQL<string | null> {\n\treturn sql`sum(${expression})`.mapWith(String);\n}\n\n/**\n * Returns the sum of all non-null and non-duplicate values in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // Sum of every employee's salary where `salary` is distinct (no duplicates)\n * db.select({ value: sumDistinct(employees.salary) }).from(employees)\n * ```\n *\n * @see sum to get the sum of all non-null values in `expression`, including duplicates\n */\nexport function sumDistinct(expression: SQLWrapper): SQL<string | null> {\n\treturn sql`sum(distinct ${expression})`.mapWith(String);\n}\n\n/**\n * Returns the maximum value in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // The employee with the highest salary\n * db.select({ value: max(employees.salary) }).from(employees)\n * ```\n */\nexport function max<T extends SQLWrapper>(expression: T): SQL<(T extends AnyColumn ? T['_']['data'] : string) | null> {\n\treturn sql`max(${expression})`.mapWith(is(expression, Column) ? expression : String) as any;\n}\n\n/**\n * Returns the minimum value in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // The employee with the lowest salary\n * db.select({ value: min(employees.salary) }).from(employees)\n * ```\n */\nexport function min<T extends SQLWrapper>(expression: T): SQL<(T extends AnyColumn ? T['_']['data'] : string) | null> {\n\treturn sql`min(${expression})`.mapWith(is(expression, Column) ? expression : String) as any;\n}\n"
  },
  {
    "path": "drizzle-orm/src/sql/functions/index.ts",
    "content": "export * from './aggregate.ts';\nexport * from './vector.ts';\n"
  },
  {
    "path": "drizzle-orm/src/sql/functions/vector.ts",
    "content": "import type { AnyColumn } from '~/column.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport { type SQL, sql, type SQLWrapper } from '../sql.ts';\n\nfunction toSql(value: number[] | string[]): string {\n\treturn JSON.stringify(value);\n}\n\n/**\n * Used in sorting and in querying, if used in sorting,\n * this specifies that the given column or expression should be sorted in an order\n * that minimizes the L2 distance to the given value.\n * If used in querying, this specifies that it should return the L2 distance\n * between the given column or expression and the given value.\n *\n * ## Examples\n *\n * ```ts\n * // Sort cars by embedding similarity\n * // to the given embedding\n * db.select().from(cars)\n *   .orderBy(l2Distance(cars.embedding, embedding));\n * ```\n *\n * ```ts\n * // Select distance of cars and embedding\n * // to the given embedding\n * db.select({distance: l2Distance(cars.embedding, embedding)}).from(cars)\n * ```\n */\nexport function l2Distance(\n\tcolumn: SQLWrapper | AnyColumn,\n\tvalue: number[] | string[] | TypedQueryBuilder<any> | string,\n): SQL {\n\tif (Array.isArray(value)) {\n\t\treturn sql`${column} <-> ${toSql(value)}`;\n\t}\n\treturn sql`${column} <-> ${value}`;\n}\n\n/**\n * L1 distance is one of the possible distance measures between two probability distribution vectors and it is\n * calculated as the sum of the absolute differences.\n * The smaller the distance between the observed probability vectors, the higher the accuracy of the synthetic data\n *\n * ## Examples\n *\n * ```ts\n * // Sort cars by embedding similarity\n * // to the given embedding\n * db.select().from(cars)\n *   .orderBy(l1Distance(cars.embedding, embedding));\n * ```\n *\n * ```ts\n * // Select distance of cars and embedding\n * // to the given embedding\n * db.select({distance: l1Distance(cars.embedding, embedding)}).from(cars)\n * ```\n */\nexport function l1Distance(\n\tcolumn: SQLWrapper | AnyColumn,\n\tvalue: number[] | string[] | TypedQueryBuilder<any> | string,\n): SQL {\n\tif (Array.isArray(value)) {\n\t\treturn sql`${column} <+> ${toSql(value)}`;\n\t}\n\treturn sql`${column} <+> ${value}`;\n}\n\n/**\n * Used in sorting and in querying, if used in sorting,\n * this specifies that the given column or expression should be sorted in an order\n * that minimizes the inner product distance to the given value.\n * If used in querying, this specifies that it should return the inner product distance\n * between the given column or expression and the given value.\n *\n * ## Examples\n *\n * ```ts\n * // Sort cars by embedding similarity\n * // to the given embedding\n * db.select().from(cars)\n *   .orderBy(innerProduct(cars.embedding, embedding));\n * ```\n *\n * ```ts\n * // Select distance of cars and embedding\n * // to the given embedding\n * db.select({ distance: innerProduct(cars.embedding, embedding) }).from(cars)\n * ```\n */\nexport function innerProduct(\n\tcolumn: SQLWrapper | AnyColumn,\n\tvalue: number[] | string[] | TypedQueryBuilder<any> | string,\n): SQL {\n\tif (Array.isArray(value)) {\n\t\treturn sql`${column} <#> ${toSql(value)}`;\n\t}\n\treturn sql`${column} <#> ${value}`;\n}\n\n/**\n * Used in sorting and in querying, if used in sorting,\n * this specifies that the given column or expression should be sorted in an order\n * that minimizes the cosine distance to the given value.\n * If used in querying, this specifies that it should return the cosine distance\n * between the given column or expression and the given value.\n *\n * ## Examples\n *\n * ```ts\n * // Sort cars by embedding similarity\n * // to the given embedding\n * db.select().from(cars)\n *   .orderBy(cosineDistance(cars.embedding, embedding));\n * ```\n *\n * ```ts\n * // Select distance of cars and embedding\n * // to the given embedding\n * db.select({distance: cosineDistance(cars.embedding, embedding)}).from(cars)\n * ```\n */\nexport function cosineDistance(\n\tcolumn: SQLWrapper | AnyColumn,\n\tvalue: number[] | string[] | TypedQueryBuilder<any> | string,\n): SQL {\n\tif (Array.isArray(value)) {\n\t\treturn sql`${column} <=> ${toSql(value)}`;\n\t}\n\treturn sql`${column} <=> ${value}`;\n}\n\n/**\n * Hamming distance between two strings or vectors of equal length is the number of positions at which the\n * corresponding symbols are different. In other words, it measures the minimum number of\n * substitutions required to change one string into the other, or equivalently,\n * the minimum number of errors that could have transformed one string into the other\n *\n * ## Examples\n *\n * ```ts\n * // Sort cars by embedding similarity\n * // to the given embedding\n * db.select().from(cars)\n *   .orderBy(hammingDistance(cars.embedding, embedding));\n * ```\n */\nexport function hammingDistance(\n\tcolumn: SQLWrapper | AnyColumn,\n\tvalue: number[] | string[] | TypedQueryBuilder<any> | string,\n): SQL {\n\tif (Array.isArray(value)) {\n\t\treturn sql`${column} <~> ${toSql(value)}`;\n\t}\n\treturn sql`${column} <~> ${value}`;\n}\n\n/**\n * ## Examples\n *\n * ```ts\n * // Sort cars by embedding similarity\n * // to the given embedding\n * db.select().from(cars)\n *   .orderBy(jaccardDistance(cars.embedding, embedding));\n * ```\n */\nexport function jaccardDistance(\n\tcolumn: SQLWrapper | AnyColumn,\n\tvalue: number[] | string[] | TypedQueryBuilder<any> | string,\n): SQL {\n\tif (Array.isArray(value)) {\n\t\treturn sql`${column} <%> ${toSql(value)}`;\n\t}\n\treturn sql`${column} <%> ${value}`;\n}\n"
  },
  {
    "path": "drizzle-orm/src/sql/index.ts",
    "content": "export * from './expressions/index.ts';\nexport * from './functions/index.ts';\nexport * from './sql.ts';\n"
  },
  {
    "path": "drizzle-orm/src/sql/sql.ts",
    "content": "import type { CasingCache } from '~/casing.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { isPgEnum } from '~/pg-core/columns/enum.ts';\nimport type { SelectResult } from '~/query-builders/select.types.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { Assume, Equal } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { AnyColumn } from '../column.ts';\nimport { Column } from '../column.ts';\nimport { IsAlias, Table } from '../table.ts';\n\n/**\n * This class is used to indicate a primitive param value that is used in `sql` tag.\n * It is only used on type level and is never instantiated at runtime.\n * If you see a value of this type in the code, its runtime value is actually the primitive param value.\n */\nexport class FakePrimitiveParam {\n\tstatic readonly [entityKind]: string = 'FakePrimitiveParam';\n}\n\nexport type Chunk =\n\t| string\n\t| Table\n\t| View\n\t| AnyColumn\n\t| Name\n\t| Param\n\t| Placeholder\n\t| SQL;\n\nexport interface BuildQueryConfig {\n\tcasing: CasingCache;\n\tescapeName(name: string): string;\n\tescapeParam(num: number, value: unknown): string;\n\tescapeString(str: string): string;\n\tprepareTyping?: (encoder: DriverValueEncoder<unknown, unknown>) => QueryTypingsValue;\n\tparamStartIndex?: { value: number };\n\tinlineParams?: boolean;\n\tinvokeSource?: 'indexes' | undefined;\n}\n\nexport type QueryTypingsValue = 'json' | 'decimal' | 'time' | 'timestamp' | 'uuid' | 'date' | 'none';\n\nexport interface Query {\n\tsql: string;\n\tparams: unknown[];\n}\n\nexport interface QueryWithTypings extends Query {\n\ttypings?: QueryTypingsValue[];\n}\n\n/**\n * Any value that implements the `getSQL` method. The implementations include:\n * - `Table`\n * - `Column`\n * - `View`\n * - `Subquery`\n * - `SQL`\n * - `SQL.Aliased`\n * - `Placeholder`\n * - `Param`\n */\nexport interface SQLWrapper {\n\tgetSQL(): SQL;\n\tshouldOmitSQLParens?(): boolean;\n}\n\nexport function isSQLWrapper(value: unknown): value is SQLWrapper {\n\treturn value !== null && value !== undefined && typeof (value as any).getSQL === 'function';\n}\n\nfunction mergeQueries(queries: QueryWithTypings[]): QueryWithTypings {\n\tconst result: QueryWithTypings = { sql: '', params: [] };\n\tfor (const query of queries) {\n\t\tresult.sql += query.sql;\n\t\tresult.params.push(...query.params);\n\t\tif (query.typings?.length) {\n\t\t\tif (!result.typings) {\n\t\t\t\tresult.typings = [];\n\t\t\t}\n\t\t\tresult.typings.push(...query.typings);\n\t\t}\n\t}\n\treturn result;\n}\n\nexport class StringChunk implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'StringChunk';\n\n\treadonly value: string[];\n\n\tconstructor(value: string | string[]) {\n\t\tthis.value = Array.isArray(value) ? value : [value];\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport class SQL<T = unknown> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'SQL';\n\n\tdeclare _: {\n\t\tbrand: 'SQL';\n\t\ttype: T;\n\t};\n\n\t/** @internal */\n\tdecoder: DriverValueDecoder<T, any> = noopDecoder;\n\tprivate shouldInlineParams = false;\n\n\t/** @internal */\n\tusedTables: string[] = [];\n\n\tconstructor(readonly queryChunks: SQLChunk[]) {\n\t\tfor (const chunk of queryChunks) {\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\n\t\t\t\tthis.usedTables.push(\n\t\t\t\t\tschemaName === undefined\n\t\t\t\t\t\t? chunk[Table.Symbol.Name]\n\t\t\t\t\t\t: schemaName + '.' + chunk[Table.Symbol.Name],\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tappend(query: SQL): this {\n\t\tthis.queryChunks.push(...query.queryChunks);\n\t\treturn this;\n\t}\n\n\ttoQuery(config: BuildQueryConfig): QueryWithTypings {\n\t\treturn tracer.startActiveSpan('drizzle.buildSQL', (span) => {\n\t\t\tconst query = this.buildQueryFromSourceParams(this.queryChunks, config);\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': query.sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(query.params),\n\t\t\t});\n\t\t\treturn query;\n\t\t});\n\t}\n\n\tbuildQueryFromSourceParams(chunks: SQLChunk[], _config: BuildQueryConfig): Query {\n\t\tconst config = Object.assign({}, _config, {\n\t\t\tinlineParams: _config.inlineParams || this.shouldInlineParams,\n\t\t\tparamStartIndex: _config.paramStartIndex || { value: 0 },\n\t\t});\n\n\t\tconst {\n\t\t\tcasing,\n\t\t\tescapeName,\n\t\t\tescapeParam,\n\t\t\tprepareTyping,\n\t\t\tinlineParams,\n\t\t\tparamStartIndex,\n\t\t} = config;\n\n\t\treturn mergeQueries(chunks.map((chunk): QueryWithTypings => {\n\t\t\tif (is(chunk, StringChunk)) {\n\t\t\t\treturn { sql: chunk.value.join(''), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Name)) {\n\t\t\t\treturn { sql: escapeName(chunk.value), params: [] };\n\t\t\t}\n\n\t\t\tif (chunk === undefined) {\n\t\t\t\treturn { sql: '', params: [] };\n\t\t\t}\n\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\tconst result: SQLChunk[] = [new StringChunk('(')];\n\t\t\t\tfor (const [i, p] of chunk.entries()) {\n\t\t\t\t\tresult.push(p);\n\t\t\t\t\tif (i < chunk.length - 1) {\n\t\t\t\t\t\tresult.push(new StringChunk(', '));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult.push(new StringChunk(')'));\n\t\t\t\treturn this.buildQueryFromSourceParams(result, config);\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL)) {\n\t\t\t\treturn this.buildQueryFromSourceParams(chunk.queryChunks, {\n\t\t\t\t\t...config,\n\t\t\t\t\tinlineParams: inlineParams || chunk.shouldInlineParams,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\t\t\t\tconst tableName = chunk[Table.Symbol.Name];\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined || chunk[IsAlias]\n\t\t\t\t\t\t? escapeName(tableName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(tableName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Column)) {\n\t\t\t\tconst columnName = casing.getColumnCasing(chunk);\n\t\t\t\tif (_config.invokeSource === 'indexes') {\n\t\t\t\t\treturn { sql: escapeName(columnName), params: [] };\n\t\t\t\t}\n\n\t\t\t\tconst schemaName = chunk.table[Table.Symbol.Schema];\n\t\t\t\treturn {\n\t\t\t\t\tsql: chunk.table[IsAlias] || schemaName === undefined\n\t\t\t\t\t\t? escapeName(chunk.table[Table.Symbol.Name]) + '.' + escapeName(columnName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(chunk.table[Table.Symbol.Name]) + '.'\n\t\t\t\t\t\t\t+ escapeName(columnName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, View)) {\n\t\t\t\tconst schemaName = chunk[ViewBaseConfig].schema;\n\t\t\t\tconst viewName = chunk[ViewBaseConfig].name;\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined || chunk[ViewBaseConfig].isAlias\n\t\t\t\t\t\t? escapeName(viewName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(viewName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Param)) {\n\t\t\t\tif (is(chunk.value, Placeholder)) {\n\t\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t\t}\n\n\t\t\t\tconst mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);\n\n\t\t\t\tif (is(mappedValue, SQL)) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([mappedValue], config);\n\t\t\t\t}\n\n\t\t\t\tif (inlineParams) {\n\t\t\t\t\treturn { sql: this.mapInlineParam(mappedValue, config), params: [] };\n\t\t\t\t}\n\n\t\t\t\tlet typings: QueryTypingsValue[] = ['none'];\n\t\t\t\tif (prepareTyping) {\n\t\t\t\t\ttypings = [prepareTyping(chunk.encoder)];\n\t\t\t\t}\n\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };\n\t\t\t}\n\n\t\t\tif (is(chunk, Placeholder)) {\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {\n\t\t\t\treturn { sql: escapeName(chunk.fieldAlias), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Subquery)) {\n\t\t\t\tif (chunk._.isWith) {\n\t\t\t\t\treturn { sql: escapeName(chunk._.alias), params: [] };\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk._.sql,\n\t\t\t\t\tnew StringChunk(') '),\n\t\t\t\t\tnew Name(chunk._.alias),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (isPgEnum(chunk)) {\n\t\t\t\tif (chunk.schema) {\n\t\t\t\t\treturn { sql: escapeName(chunk.schema) + '.' + escapeName(chunk.enumName), params: [] };\n\t\t\t\t}\n\t\t\t\treturn { sql: escapeName(chunk.enumName), params: [] };\n\t\t\t}\n\n\t\t\tif (isSQLWrapper(chunk)) {\n\t\t\t\tif (chunk.shouldOmitSQLParens?.()) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([chunk.getSQL()], config);\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk.getSQL(),\n\t\t\t\t\tnew StringChunk(')'),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (inlineParams) {\n\t\t\t\treturn { sql: this.mapInlineParam(chunk, config), params: [] };\n\t\t\t}\n\n\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t}));\n\t}\n\n\tprivate mapInlineParam(\n\t\tchunk: unknown,\n\t\t{ escapeString }: BuildQueryConfig,\n\t): string {\n\t\tif (chunk === null) {\n\t\t\treturn 'null';\n\t\t}\n\t\tif (typeof chunk === 'number' || typeof chunk === 'boolean') {\n\t\t\treturn chunk.toString();\n\t\t}\n\t\tif (typeof chunk === 'string') {\n\t\t\treturn escapeString(chunk);\n\t\t}\n\t\tif (typeof chunk === 'object') {\n\t\t\tconst mappedValueAsString = chunk.toString();\n\t\t\tif (mappedValueAsString === '[object Object]') {\n\t\t\t\treturn escapeString(JSON.stringify(chunk));\n\t\t\t}\n\t\t\treturn escapeString(mappedValueAsString);\n\t\t}\n\t\tthrow new Error('Unexpected param value: ' + chunk);\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this;\n\t}\n\n\tas(alias: string): SQL.Aliased<T>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(): SQL<TData>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(alias: string): SQL.Aliased<TData>;\n\tas(alias?: string): SQL<T> | SQL.Aliased<T> {\n\t\t// TODO: remove with deprecated overloads\n\t\tif (alias === undefined) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn new SQL.Aliased(this, alias);\n\t}\n\n\tmapWith<\n\t\tTDecoder extends\n\t\t\t| DriverValueDecoder<any, any>\n\t\t\t| DriverValueDecoder<any, any>['mapFromDriverValue'],\n\t>(decoder: TDecoder): SQL<GetDecoderResult<TDecoder>> {\n\t\tthis.decoder = typeof decoder === 'function' ? { mapFromDriverValue: decoder } : decoder;\n\t\treturn this as SQL<GetDecoderResult<TDecoder>>;\n\t}\n\n\tinlineParams(): this {\n\t\tthis.shouldInlineParams = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * This method is used to conditionally include a part of the query.\n\t *\n\t * @param condition - Condition to check\n\t * @returns itself if the condition is `true`, otherwise `undefined`\n\t */\n\tif(condition: any | undefined): this | undefined {\n\t\treturn condition ? this : undefined;\n\t}\n}\n\nexport type GetDecoderResult<T> = T extends Column ? T['_']['data'] : T extends\n\t| DriverValueDecoder<infer TData, any>\n\t| DriverValueDecoder<infer TData, any>['mapFromDriverValue'] ? TData\n: never;\n\n/**\n * Any DB name (table, column, index etc.)\n */\nexport class Name implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Name';\n\n\tprotected brand!: 'Name';\n\n\tconstructor(readonly value: string) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/**\n * Any DB name (table, column, index etc.)\n * @deprecated Use `sql.identifier` instead.\n */\nexport function name(value: string): Name {\n\treturn new Name(value);\n}\n\nexport interface DriverValueDecoder<TData, TDriverParam> {\n\tmapFromDriverValue(value: TDriverParam): TData;\n}\n\nexport interface DriverValueEncoder<TData, TDriverParam> {\n\tmapToDriverValue(value: TData): TDriverParam | SQL;\n}\n\nexport function isDriverValueEncoder(value: unknown): value is DriverValueEncoder<any, any> {\n\treturn typeof value === 'object' && value !== null && 'mapToDriverValue' in value\n\t\t&& typeof (value as any).mapToDriverValue === 'function';\n}\n\nexport const noopDecoder: DriverValueDecoder<any, any> = {\n\tmapFromDriverValue: (value) => value,\n};\n\nexport const noopEncoder: DriverValueEncoder<any, any> = {\n\tmapToDriverValue: (value) => value,\n};\n\nexport interface DriverValueMapper<TData, TDriverParam>\n\textends DriverValueDecoder<TData, TDriverParam>, DriverValueEncoder<TData, TDriverParam>\n{}\n\nexport const noopMapper: DriverValueMapper<any, any> = {\n\t...noopDecoder,\n\t...noopEncoder,\n};\n\n/** Parameter value that is optionally bound to an encoder (for example, a column). */\nexport class Param<TDataType = unknown, TDriverParamType = TDataType> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Param';\n\n\tprotected brand!: 'BoundParamValue';\n\n\t/**\n\t * @param value - Parameter value\n\t * @param encoder - Encoder to convert the value to a driver parameter\n\t */\n\tconstructor(\n\t\treadonly value: TDataType,\n\t\treadonly encoder: DriverValueEncoder<TDataType, TDriverParamType> = noopEncoder,\n\t) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.param` instead. */\nexport function param<TData, TDriver>(\n\tvalue: TData,\n\tencoder?: DriverValueEncoder<TData, TDriver>,\n): Param<TData, TDriver> {\n\treturn new Param(value, encoder);\n}\n\n/**\n * Anything that can be passed to the `` sql`...` `` tagged function.\n */\nexport type SQLChunk =\n\t| StringChunk\n\t| SQLChunk[]\n\t| SQLWrapper\n\t| SQL\n\t| Table\n\t| View\n\t| Subquery\n\t| AnyColumn\n\t| Param\n\t| Name\n\t| undefined\n\t| FakePrimitiveParam\n\t| Placeholder;\n\nexport function sql<T>(strings: TemplateStringsArray, ...params: any[]): SQL<T>;\n/*\n\tThe type of `params` is specified as `SQLChunk[]`, but that's slightly incorrect -\n\tin runtime, users won't pass `FakePrimitiveParam` instances as `params` - they will pass primitive values\n\twhich will be wrapped in `Param`. That's why the overload specifies `params` as `any[]` and not as `SQLSourceParam[]`.\n\tThis type is used to make our lives easier and the type checker happy.\n*/\nexport function sql(strings: TemplateStringsArray, ...params: SQLChunk[]): SQL {\n\tconst queryChunks: SQLChunk[] = [];\n\tif (params.length > 0 || (strings.length > 0 && strings[0] !== '')) {\n\t\tqueryChunks.push(new StringChunk(strings[0]!));\n\t}\n\tfor (const [paramIndex, param] of params.entries()) {\n\t\tqueryChunks.push(param, new StringChunk(strings[paramIndex + 1]!));\n\t}\n\n\treturn new SQL(queryChunks);\n}\n\nexport namespace sql {\n\texport function empty(): SQL {\n\t\treturn new SQL([]);\n\t}\n\n\t/** @deprecated - use `sql.join()` */\n\texport function fromList(list: SQLChunk[]): SQL {\n\t\treturn new SQL(list);\n\t}\n\n\t/**\n\t * Convenience function to create an SQL query from a raw string.\n\t * @param str The raw SQL query string.\n\t */\n\texport function raw(str: string): SQL {\n\t\treturn new SQL([new StringChunk(str)]);\n\t}\n\n\t/**\n\t * Join a list of SQL chunks with a separator.\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`]);\n\t * // sql`abc`\n\t * ```\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`], sql`, `);\n\t * // sql`a, b, c`\n\t * ```\n\t */\n\texport function join(chunks: SQLChunk[], separator?: SQLChunk): SQL {\n\t\tconst result: SQLChunk[] = [];\n\t\tfor (const [i, chunk] of chunks.entries()) {\n\t\t\tif (i > 0 && separator !== undefined) {\n\t\t\t\tresult.push(separator);\n\t\t\t}\n\t\t\tresult.push(chunk);\n\t\t}\n\t\treturn new SQL(result);\n\t}\n\n\t/**\n\t * Create a SQL chunk that represents a DB identifier (table, column, index etc.).\n\t * When used in a query, the identifier will be escaped based on the DB engine.\n\t * For example, in PostgreSQL, identifiers are escaped with double quotes.\n\t *\n\t * **WARNING: This function does not offer any protection against SQL injections, so you must validate any user input beforehand.**\n\t *\n\t * @example ```ts\n\t * const query = sql`SELECT * FROM ${sql.identifier('my-table')}`;\n\t * // 'SELECT * FROM \"my-table\"'\n\t * ```\n\t */\n\texport function identifier(value: string): Name {\n\t\treturn new Name(value);\n\t}\n\n\texport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\t\treturn new Placeholder(name);\n\t}\n\n\texport function param<TData, TDriver>(\n\t\tvalue: TData,\n\t\tencoder?: DriverValueEncoder<TData, TDriver>,\n\t): Param<TData, TDriver> {\n\t\treturn new Param(value, encoder);\n\t}\n}\n\nexport namespace SQL {\n\texport class Aliased<T = unknown> implements SQLWrapper {\n\t\tstatic readonly [entityKind]: string = 'SQL.Aliased';\n\n\t\tdeclare _: {\n\t\t\tbrand: 'SQL.Aliased';\n\t\t\ttype: T;\n\t\t};\n\n\t\t/** @internal */\n\t\tisSelectionField = false;\n\n\t\tconstructor(\n\t\t\treadonly sql: SQL,\n\t\t\treadonly fieldAlias: string,\n\t\t) {}\n\n\t\tgetSQL(): SQL {\n\t\t\treturn this.sql;\n\t\t}\n\n\t\t/** @internal */\n\t\tclone() {\n\t\t\treturn new Aliased(this.sql, this.fieldAlias);\n\t\t}\n\t}\n}\n\nexport class Placeholder<TName extends string = string, TValue = any> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Placeholder';\n\n\tdeclare protected: TValue;\n\n\tconstructor(readonly name: TName) {}\n\n\tgetSQL(): SQL {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.placeholder` instead. */\nexport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\treturn new Placeholder(name);\n}\n\nexport function fillPlaceholders(params: unknown[], values: Record<string, unknown>): unknown[] {\n\treturn params.map((p) => {\n\t\tif (is(p, Placeholder)) {\n\t\t\tif (!(p.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn values[p.name];\n\t\t}\n\n\t\tif (is(p, Param) && is(p.value, Placeholder)) {\n\t\t\tif (!(p.value.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.value.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn p.encoder.mapToDriverValue(values[p.value.name]);\n\t\t}\n\n\t\treturn p;\n\t});\n}\n\nexport type ColumnsSelection = Record<string, unknown>;\n\nconst IsDrizzleView = Symbol.for('drizzle:IsDrizzleView');\n\nexport abstract class View<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'View';\n\n\tdeclare _: {\n\t\tbrand: 'View';\n\t\tviewBrand: string;\n\t\tname: TName;\n\t\texisting: TExisting;\n\t\tselectedFields: TSelection;\n\t};\n\n\t/** @internal */\n\t[ViewBaseConfig]: {\n\t\tname: TName;\n\t\toriginalName: TName;\n\t\tschema: string | undefined;\n\t\tselectedFields: ColumnsSelection;\n\t\tisExisting: TExisting;\n\t\tquery: TExisting extends true ? undefined : SQL;\n\t\tisAlias: boolean;\n\t};\n\n\t/** @internal */\n\t[IsDrizzleView] = true;\n\n\tdeclare readonly $inferSelect: InferSelectViewModel<View<Assume<TName, string>, TExisting, TSelection>>;\n\n\tconstructor(\n\t\t{ name, schema, selectedFields, query }: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t},\n\t) {\n\t\tthis[ViewBaseConfig] = {\n\t\t\tname,\n\t\t\toriginalName: name,\n\t\t\tschema,\n\t\t\tselectedFields,\n\t\t\tquery: query as (TExisting extends true ? undefined : SQL),\n\t\t\tisExisting: !query as TExisting,\n\t\t\tisAlias: false,\n\t\t};\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport function isView(view: unknown): view is View {\n\treturn typeof view === 'object' && view !== null && IsDrizzleView in view;\n}\n\nexport function getViewName<T extends View>(view: T): T['_']['name'] {\n\treturn view[ViewBaseConfig].name;\n}\n\nexport type InferSelectViewModel<TView extends View> =\n\tEqual<TView['_']['selectedFields'], { [x: string]: unknown }> extends true ? { [x: string]: unknown }\n\t\t: SelectResult<\n\t\t\tTView['_']['selectedFields'],\n\t\t\t'single',\n\t\t\tRecord<TView['_']['name'], 'not-null'>\n\t\t>;\n\n// Defined separately from the Column class to resolve circular dependency\nColumn.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// Defined separately from the Table class to resolve circular dependency\nTable.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// Defined separately from the Column class to resolve circular dependency\nSubquery.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n"
  },
  {
    "path": "drizzle-orm/src/sql-js/driver.ts",
    "content": "import type { Database } from 'sql.js';\nimport { DefaultLogger } from '~/logger.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { BaseSQLiteDatabase } from '~/sqlite-core/db.ts';\nimport { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport { SQLJsSession } from './session.ts';\n\nexport type SQLJsDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> = BaseSQLiteDatabase<'sync', void, TSchema>;\n\nexport function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: Database,\n\tconfig: DrizzleConfig<TSchema> = {},\n): SQLJsDatabase<TSchema> {\n\tconst dialect = new SQLiteSyncDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new SQLJsSession(client, dialect, schema, { logger });\n\treturn new BaseSQLiteDatabase('sync', dialect, session, schema) as SQLJsDatabase<TSchema>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/sql-js/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/sql-js/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { SQLJsDatabase } from './driver.ts';\n\nexport function migrate<TSchema extends Record<string, unknown>>(\n\tdb: SQLJsDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tdb.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/sql-js/session.ts",
    "content": "import type { BindParams, Database } from 'sql.js';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, sql } from '~/sql/sql.ts';\nimport type { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport { SQLiteTransaction } from '~/sqlite-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts';\nimport type {\n\tPreparedQueryConfig as PreparedQueryConfigBase,\n\tSQLiteExecuteMethod,\n\tSQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { SQLitePreparedQuery as PreparedQueryBase, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport interface SQLJsSessionOptions {\n\tlogger?: Logger;\n}\n\ntype PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\n\nexport class SQLJsSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteSession<'sync', void, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLJsSession';\n\n\tprivate logger: Logger;\n\n\tconstructor(\n\t\tprivate client: Database,\n\t\tdialect: SQLiteSyncDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: SQLJsSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\tprepareQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t): PreparedQuery<T> {\n\t\treturn new PreparedQuery(this.client, query, this.logger, fields, executeMethod, isResponseInArrayMode);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: SQLJsTransaction<TFullSchema, TSchema>) => T,\n\t\tconfig: SQLiteTransactionConfig = {},\n\t): T {\n\t\tconst tx = new SQLJsTransaction('sync', this.dialect, this, this.schema);\n\t\tthis.run(sql.raw(`begin${config.behavior ? ` ${config.behavior}` : ''}`));\n\t\ttry {\n\t\t\tconst result = transaction(tx);\n\t\t\tthis.run(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tthis.run(sql`rollback`);\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class SQLJsTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteTransaction<'sync', void, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLJsTransaction';\n\n\toverride transaction<T>(transaction: (tx: SQLJsTransaction<TFullSchema, TSchema>) => T): T {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new SQLJsTransaction('sync', this.dialect, this.session, this.schema, this.nestedIndex + 1);\n\t\ttx.run(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = transaction(tx);\n\t\t\ttx.run(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\ttx.run(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends PreparedQueryBase<\n\t{ type: 'sync'; run: void; all: T['all']; get: T['get']; values: T['values']; execute: T['execute'] }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLJsPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: Database,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => unknown,\n\t) {\n\t\tsuper('sync', executeMethod, query);\n\t}\n\n\trun(placeholderValues?: Record<string, unknown>): void {\n\t\tconst stmt = this.client.prepare(this.query.sql);\n\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\tconst result = stmt.run(params as BindParams);\n\n\t\tstmt.free();\n\n\t\treturn result;\n\t}\n\n\tall(placeholderValues?: Record<string, unknown>): T['all'] {\n\t\tconst stmt = this.client.prepare(this.query.sql);\n\n\t\tconst { fields, joinsNotNullableMap, logger, query, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\t\tlogger.logQuery(query.sql, params);\n\t\t\tstmt.bind(params as BindParams);\n\t\t\tconst rows: unknown[] = [];\n\t\t\twhile (stmt.step()) {\n\t\t\t\trows.push(stmt.getAsObject());\n\t\t\t}\n\n\t\t\tstmt.free();\n\n\t\t\treturn rows;\n\t\t}\n\n\t\tconst rows = this.values(placeholderValues) as unknown[][];\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows, normalizeFieldValue) as T['all'];\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow(fields!, row.map((v) => normalizeFieldValue(v)), joinsNotNullableMap));\n\t}\n\n\tget(placeholderValues?: Record<string, unknown>): T['get'] {\n\t\tconst stmt = this.client.prepare(this.query.sql);\n\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\n\t\tconst { fields, joinsNotNullableMap, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst result = stmt.getAsObject(params as BindParams);\n\n\t\t\tstmt.free();\n\n\t\t\treturn result;\n\t\t}\n\n\t\tconst row = stmt.get(params as BindParams);\n\n\t\tstmt.free();\n\n\t\tif (!row || (row.length === 0 && fields!.length > 0)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper([row], normalizeFieldValue) as T['get'];\n\t\t}\n\n\t\treturn mapResultRow(fields!, row.map((v) => normalizeFieldValue(v)), joinsNotNullableMap);\n\t}\n\n\tvalues(placeholderValues?: Record<string, unknown>): T['values'] {\n\t\tconst stmt = this.client.prepare(this.query.sql);\n\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\tstmt.bind(params as BindParams);\n\t\tconst rows: unknown[] = [];\n\t\twhile (stmt.step()) {\n\t\t\trows.push(stmt.get());\n\t\t}\n\n\t\tstmt.free();\n\n\t\treturn rows;\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nfunction normalizeFieldValue(value: unknown) {\n\tif (value instanceof Uint8Array) { // eslint-disable-line no-instanceof/no-instanceof\n\t\tif (typeof Buffer !== 'undefined') {\n\t\t\tif (!(value instanceof Buffer)) { // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t\treturn Buffer.from(value);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tif (typeof TextDecoder !== 'undefined') {\n\t\t\treturn new TextDecoder().decode(value);\n\t\t}\n\t\tthrow new Error('TextDecoder is not available. Please provide either Buffer or TextDecoder polyfill.');\n\t}\n\treturn value;\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/README.md",
    "content": "<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzle ORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver                                                                | Support |                                    |\n|:----------------------------------------------------------------------|:-------:|:----------------------------------:|\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3)          |    ✅    |                                    |\n| [sql.js](https://github.com/sql-js/sql.js/)                           |    ✅    |                                    |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3)              |    ⏳    |                                    |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) |    ✅    |  [Example](/examples/bun-sqlite)   |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/)                |    ✅    | [Example](/examples/cloudflare-d1) |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/)          |    ✅    |                                    |\n| [libSQL server](https://github.com/libsql/sqld/)                      |    ✅    |    [Example](/examples/libsql)     |\n| [Turso](https://turso.tech/)                                          |    ✅    |    [Example](/examples/libsql)     |\n| [Custom proxy driver](/examples/sqlite-proxy)                         |    ✅    |                                    |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport Database from 'better-sqlite3';\n\nconst users = sqliteTable('users', {\n  id: integer('id').primaryKey(),  // 'id' is the column name\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database('sqlite.db');\nconst db = drizzle(sqlite);\n\nconst allUsers = db.select().from(users).all();\n```\n\n### Using Drizzle ORM in Next.js App Router\n\nNext.js' App Router have zero-config support for Drizzle ORM.\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';\nimport Database from 'better-sqlite3';\n\nconst sqlite = new Database('sqlite.db');\nconst db/*: BetterSQLite3Database*/ = drizzle(sqlite);\nconst result = db.select().from(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite';\nimport { Database } from 'bun:sqlite';\n\nconst sqlite = new Database('nw.sqlite');\nconst db/*: BunSQLiteDatabase*/ = drizzle(sqlite);\nconst result = db.select().from(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm/d1';\n\n// env.DB from cloudflare worker environment\nconst db/*: DrizzleD1Database*/ = drizzle(env.DB);\nconst result = await db.select().from(users).all(); // pay attention this one is async\n\n// libSQL or Turso\nimport { drizzle, LibSQLDatabase } from 'drizzle-orm/libsql';\nimport { Database } from '@libsql/sqlite3';\n\nconst sqlite = new Database('libsql://...'); // Remote server\n// or\nconst sqlite = new Database('sqlite.db'); // Local file\n\nconst db/*: LibSQLDatabase*/ = drizzle(sqlite);\nconst result = await db.select().from(users).all(); // pay attention this one is async\n\n// Custom Proxy HTTP driver\n  const db = drizzle(async (sql, params, method) => {\n    try {\n      const rows = await axios.post('http://localhost:3000/query', { sql, params, method });\n\n      return { rows: rows.data };\n    } catch (e: any) {\n      console.error('Error from sqlite proxy server: ', e.response.data)\n      return { rows: [] };\n    }\n  });\n// More example for proxy: https://github.com/drizzle-team/drizzle-orm/tree/main/examples/sqlite-proxy\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. \n\nℹ Every column has a special _column type_ function that accepts the name of the column in the database (like `integer('id')`)\n\nPlease pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from 'drizzle-orm/sqlite-core';\n\nexport const countries = sqliteTable('countries', {\n    id: integer('id').primaryKey(),\n    name: text('name'),\n  }, (countries) => ({\n    nameIdx: uniqueIndex('nameIdx').on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable('cities', {\n  id: integer('id').primaryKey(),\n  name: text('name'),\n  countryId: integer('country_id').references(() => countries.id),\n})\n```\n\n### Database and table entity types\n\n```typescript\nimport { text, integer, sqliteTable } from 'drizzle-orm/sqlite-core';\nimport { InferModel } from 'drizzle-orm';\n\nconst users = sqliteTable('users', {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, 'insert'> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';\nimport Database from 'better-sqlite3';\n\nconst sqlite = new Database('sqlite.db');\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select().from(users).all();\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n### Customizing the table name\n\nThere is a \"table creator\" available, which allow you to customize the table name, for example, to add a prefix or suffix. This is useful if you need to have tables for different environments or applications in the same database.\n\n```ts\nimport { sqliteTableCreator } from 'drizzle-orm/sqlite-core';\n\nconst sqliteTable = sqliteTableCreator((name) => `myprefix_${name}`);\n\nconst users = sqliteTable('users', {\n  id: int('id').primaryKey(),\n  name: text('name').notNull(),\n});\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](/docs/custom-types.md)\n\n```typescript\ninteger('...');\ninteger('...', { mode: 'number' | 'timestamp' | 'timestamp_ms' })\nreal('...');\ntext('...');\ntext('role', { enum: ['admin', 'user'] });\n\nblob('...');\nblob('...', { mode: 'json' | 'buffer' });\nblob('...').$type<{ foo: string }>();\n\ncolumn.primaryKey();\ncolumn.notNull();\ncolumn.default(...);\n```\n\n### Customizing column data type\n\nEvery column builder has a `.$type()` method, which allows you to customize the data type of the column. This is useful, for example, with branded types.\n\n```ts\nconst users = sqliteTable('users', {\n  id: integer('id').$type<UserId>().primaryKey(),\n  jsonField: blob('json_field').$type<Data>(),\n});\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, primaryKey, text, integer, index, uniqueIndex, AnySQLiteColumn } from \"drizzle-orm/sqlite-core\";\n\nexport const countries = sqliteTable('countries', {\n    id: integer('id').primaryKey(),\n    name: text('name'),\n    population: integer('population'),\n    capital: integer('capital').references(() => cities.id, { onUpdate: 'cascade', onDelete: 'cascade' })\n  }, (countries) => ({\n    nameIdx: index('name_idx').on(countries.name), // one column\n    namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable('cities', {\n  id: integer('id').primaryKey(),\n  name: text('name'),\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\n  countryName: text('country_id'),\n  sisterCityId: integer('sister_city_id').references((): AnySQLiteColumn => cities.id), // self-referencing foreign key\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex('name_idx').on(table.column).where(sql``)\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\nimport { and, asc, desc, eq, or } from 'drizzle-orm'\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport Database from 'better-sqlite3';\n\nconst users = sqliteTable('users', {\n  id: integer('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst sqlite = new Database('sqlite.db');\nconst db = drizzle(sqlite);\n\ndb.select().from(users).all();\ndb.select().from(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select().from(users).where(and(eq(users.id, 42), eq(users.name, 'Dan'))).all();\n\ndb.select().from(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db\n  .select({\n    field1: users.id,\n    field2: users.name,\n  })\n  .from(users)\n  .all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select().from(users).limit(10).offset(10).all();\ndb.select().from(users).orderBy(users.name).all();\ndb.select().from(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select().from(users).orderBy(asc(users.name), desc(users.name)).all();\n```\n\n#### Select from/join raw SQL\n\n```typescript\ndb.select({ x: sql<number>`x` }).from(sql`generate_series(2, 4) as g(x)`).all();\n\ndb\n  .select({\n    x1: sql<number>`g1.x`,\n    x2: sql<number>`g2.x`\n  })\n  .from(sql`generate_series(2, 4) as g1(x)`)\n  .leftJoin(sql`generate_series(2, 4) as g2(x)`)\n  .all();\n```\n\n#### Conditionally select fields\n\n```typescript\nfunction selectUsers(withName: boolean) {\n  return db\n    .select({\n      id: users.id,\n      ...(withName ? { name: users.name } : {}),\n    })\n    .from(users)\n    .all();\n}\n\nconst users = selectUsers(true);\n```\n\n#### WITH clause\n\n```typescript\nconst sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\nconst result = db.with(sq).select().from(sq).all();\n```\n\n> [!NOTE]\n> Keep in mind that if you need to select raw `sql` in a WITH subquery and reference that field in other queries, you must add an alias to it:\n\n```typescript\nconst sq = db.$with('sq').as(db.select({ name: sql<string>`upper(${users.name})`.as('name') }).from(users));\nconst result = db.with(sq).select({ name: sq.name }).from(sq).all();\n```\n\nOtherwise, the field type will become `DrizzleTypeError` and you won't be able to reference it in other queries. If you ignore the type error and still try to reference the field, you will get a runtime error, because we cannot reference that field without an alias.\n\n#### Select from subquery\n\n```typescript\nconst sq = db.select().from(users).where(eq(users.id, 42)).as('sq');\nconst result = db.select().from(sq).all();\n```\n\nSubqueries in joins are supported, too:\n\n```typescript\nconst result = db.select().from(users).leftJoin(sq, eq(users.id, sq.id)).all();\n```\n\n#### List of all filter operators\n\n```typescript\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(...expressions: Expr[])\nor(...expressions: Expr[])\n```\n\n### Insert\n\n```typescript\nimport { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\nimport { InferModel } from 'drizzle-orm';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport Database from 'better-sqlite3';\n\nconst sqlite = new Database('sqlite.db');\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable('users', {\n  id: integer('id').primaryKey(),\n  name: text('name'),\n  createdAt: integer('created_at', { mode: 'timestamp' }),\n});\n\ntype NewUser = InferModel<typeof users, \"insert\">;\n\nconst newUser: NewUser = {\n  name: 'Andrew',\n  createdAt: new Date(),\n};\n\ndb.insert(users).values(newUser).run();\n\nconst insertedUsers/*: NewUser[]*/ = db.insert(users).values(newUser).returning().all();\n\nconst insertedUsersIds/*: { insertedId: number }[]*/ = db.insert(users)\n  .values(newUser)\n  .returning({ insertedId: users.id })\n  .all();\n```\n\n#### Insert several items\n\n```ts\ndb.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  )\n  .run();\n```\n\n#### Insert array of items\n\n```ts\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\ndb.insert(users).values(newUsers).run();\n```\n\n### Upsert (Insert with on conflict statement)\n\n```typescript\ndb.insert(users)\n  .values({ id: 1, name: 'Dan' })\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } })\n  .run();\n\ndb.insert(users)\n  .values({ id: 1, name: 'John' })\n  .onConflictDoNothing()\n  .run();\n\ndb.insert(users)\n  .values({ id: 1, name: 'John' })\n  .onConflictDoNothing({ target: users.id })\n  .run();\n```\n\n### Update and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable('order', {\n  id: integer('id').primaryKey(),\n  orderDate: integer('order_date', { mode: 'timestamp' }).notNull(),\n  requiredDate: integer('required_date', { mode: 'timestamp' }).notNull(),\n  shippedDate: integer('shipped_date', { mode: 'timestamp' }),\n  shipVia: integer('ship_via').notNull(),\n  freight: numeric('freight').notNull(),\n  shipName: text('ship_name').notNull(),\n  shipCity: text('ship_city').notNull(),\n  shipRegion: text('ship_region'),\n  shipPostalCode: text('ship_postal_code'),\n  shipCountry: text('ship_country').notNull(),\n  customerId: text('customer_id').notNull(),\n  employeeId: integer('employee_id').notNull(),\n});\n\nconst details = sqliteTable('order_detail', {\n  unitPrice: numeric('unit_price').notNull(),\n  quantity: integer('quantity').notNull(),\n  discount: numeric('discount').notNull(),\n  orderId: integer('order_id').notNull(),\n  productId: integer('product_id').notNull(),\n});\n\n\ndb\n  .select({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql<number>`count(${details.productId})`,\n    quantitySum: sql<number>`sum(${details.quantity})`,\n    totalPrice: sql<number>`sum(${details.quantity} * ${details.unitPrice})`,\n  })\n  .from(orders)\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\n> [!NOTE]\n> For in-depth partial select joins documentation, refer to [this page](/docs/joins.md).\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\n\nconst cities = sqliteTable('cities', {\n  id: integer('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = sqliteTable('users', {\n  id: integer('id').primaryKey(),\n  name: text('name'),\n  cityId: integer('city_id').references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select().from(cities).leftJoin(users, eq(cities.id, users.cityId)).all();\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable('users', {\n  id: integer('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = sqliteTable('chat_groups', {\n  id: integer('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = sqliteTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb\n  .select()\n  .from(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm/sqlite-core';\n\nexport const files = sqliteTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, 'nested_files');\ndb.select().from(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'))\n  .all();\n// will return files and folders and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb\n  .select({\n    id: cities.id,\n    cityName: cities.name,\n    userId: users.id\n  })\n  .from(cities)\n  .leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## Transactions\n\n```ts\ndb.transaction((tx) => {\n  tx.insert(users).values(newUser).run();\n  tx.update(users).set({ name: 'Mr. Dan' }).where(eq(users.name, 'Dan')).run();\n  tx.delete(users).where(eq(users.name, 'Dan')).run();\n});\n```\n\n### Nested transactions\n\n```ts\ndb.transaction((tx) => {\n  tx.insert(users).values(newUser).run();\n  tx.transaction((tx2) => {\n    tx2.update(users).set({ name: 'Mr. Dan' }).where(eq(users.name, 'Dan')).run();\n    tx2.delete(users).where(eq(users.name, 'Dan')).run();\n  });\n});\n```\n\n### Transaction settings\n\n```ts\ninterface SQLiteTransactionConfig {\n  behavior?: 'deferred' | 'immediate' | 'exclusive';\n}\n\ndb.transaction((tx) => { ... }, {\n  behavior: 'immediate',\n});\n```\n\n## Query builder\n\nDrizzle ORM provides a standalone query builder that allows you to build queries without creating a database instance.\n\n```ts\nimport { queryBuilder as qb } from 'drizzle-orm/sqlite-core';\n\nconst query = qb.select().from(users).where(eq(users.name, 'Dan'));\nconst { sql, params } = query.toSQL();\n```\n\n## Views (WIP)\n\n> [!WARNING]\n> views are currently only implemented on the ORM side. That means you can query the views that already exist in the database, but they won't be added to drizzle-kit migrations or `db push` yet.\n\n### Creating a view\n\n```ts\nimport { sqliteView } from 'drizzle-orm/sqlite-core';\n\nconst newYorkers = sqliteView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n```\n\n> [!WARNING]\n> All the parameters inside the query will be inlined, instead of replaced by `$1`, `$2`, etc.\n\nYou can also use the [`queryBuilder` instance](#query-builder) directly instead of passing a callback, if you already have it imported.\n\n```ts\nimport { queryBuilder as qb } from 'drizzle-orm/sqlite-core';\n\nconst newYorkers = sqliteView('new_yorkers').as(qb.select().from(users2Table).where(eq(users2Table.cityId, 1)));\n```\n\n### Using raw SQL in a view query\n\nIn case you need to specify the view query using a syntax that is not supported by the query builder, you can directly use SQL. In that case, you also need to specify the view shape.\n\n```ts\nconst newYorkers = sqliteView('new_yorkers', {\n  id: integer('id').primaryKey(),\n  name: text('name').notNull(),\n  cityId: integer('city_id').notNull(),\n}).as(sql`select * from ${users} where ${eq(users.cityId, 1)}`);\n```\n\n### Describing existing views\n\nThere are cases when you are given readonly access to an existing view. In such cases you can just describe the view shape without specifying the query itself or using it in the migrations.\n\n```ts\nconst newYorkers = sqliteView('new_yorkers', {\n  userId: integer('user_id').notNull(),\n  cityId: integer('city_id'),\n}).existing();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from 'drizzle-orm';\n\nconst db = drizzle(...);\n\nconst q = db.select().from(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select().from(customers).where(eq(customers.id, placeholder('id'))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db\n  .select()\n  .from(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder('name')}`)\n  .prepare();\n\nq.all({ name: '%an%' }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[Drizzle Kit](https://www.npmjs.com/package/drizzle-kit) is a CLI migrator tool for Drizzle ORM. It is probably the one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\nCheck out the [docs for Drizzle Kit](https://github.com/drizzle-team/drizzle-kit-mirror).\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const users = sqliteTable('users', {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n}, (users) => ({\n  nameIdx: index('name_idx', users.fullName),\n}));\n\nexport const authOtps = sqliteTable('auth_otp', {\n  id: integer('id').primaryKey(),\n  phone: text('phone'),\n  userId: integer('user_id').references(() => users.id),\n});\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  'id' INTEGER PRIMARY KEY,\n  'phone' TEXT,\n  'user_id' INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  'id' INTEGER PRIMARY KEY,\n  'full_name' TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { migrate } from 'drizzle-orm/better-sqlite3/migrator';\nimport Database from 'better-sqlite3';\n\nconst sqlite = new Database('sqlite.db');\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: './drizzle' });\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db\n  .select({ id: users.id, name: users.name })\n  .from(users)\n  .groupBy(users.id)\n  .toSQL();\n// query:\n{\n  sql: 'select 'id', 'name' from 'users' group by 'users'.'id'',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`);\n```\n\n## Logging\n\nTo enable default query logging, just pass `{ logger: true }` to the `drizzle` function:\n\n```typescript\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\n\nconst db = drizzle(sqlite, { logger: true });\n```\n\nYou can change the logs destination by creating a `DefaultLogger` instance and providing a custom `writer` to it:\n\n```typescript\nimport { DefaultLogger, LogWriter } from 'drizzle-orm/logger';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\n\nclass MyLogWriter implements LogWriter {\n  write(message: string) {\n    // Write to file, console, etc.\n  }\n}\n\nconst logger = new DefaultLogger({ writer: new MyLogWriter() });\n\nconst db = drizzle(sqlite, { logger });\n```\n\nYou can also create a custom logger:\n\n```typescript\nimport { Logger } from 'drizzle-orm/logger';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\n\nclass MyLogger implements Logger {\n  logQuery(query: string, params: unknown[]): void {\n    console.log({ query, params });\n  }\n}\n\nconst db = drizzle(sqlite, { logger: new MyLogger() });\n```\n\n## Table introspect API\n\nSee [dedicated docs](/docs/table-introspect-api.md).\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/alias.ts",
    "content": "import { TableAliasProxyHandler } from '~/alias.ts';\nimport type { BuildAliasTable } from './query-builders/select.types.ts';\n\nimport type { SQLiteTable } from './table.ts';\nimport type { SQLiteViewBase } from './view-base.ts';\n\nexport function alias<TTable extends SQLiteTable | SQLiteViewBase, TAlias extends string>(\n\ttable: TTable,\n\talias: TAlias,\n): BuildAliasTable<TTable, TAlias> {\n\treturn new Proxy(table, new TableAliasProxyHandler(alias, false)) as any;\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/checks.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { SQLiteTable } from './table.ts';\n\nexport class CheckBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteCheckBuilder';\n\n\tprotected brand!: 'SQLiteConstraintBuilder';\n\n\tconstructor(public name: string, public value: SQL) {}\n\n\tbuild(table: SQLiteTable): Check {\n\t\treturn new Check(table, this);\n\t}\n}\n\nexport class Check {\n\tstatic readonly [entityKind]: string = 'SQLiteCheck';\n\n\tdeclare _: {\n\t\tbrand: 'SQLiteCheck';\n\t};\n\n\treadonly name: string;\n\treadonly value: SQL;\n\n\tconstructor(public table: SQLiteTable, builder: CheckBuilder) {\n\t\tthis.name = builder.name;\n\t\tthis.value = builder.value;\n\t}\n}\n\nexport function check(name: string, value: SQL): CheckBuilder {\n\treturn new CheckBuilder(name, value);\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/columns/all.ts",
    "content": "import { blob } from './blob.ts';\nimport { customType } from './custom.ts';\nimport { integer } from './integer.ts';\nimport { numeric } from './numeric.ts';\nimport { real } from './real.ts';\nimport { text } from './text.ts';\n\nexport function getSQLiteColumnBuilders() {\n\treturn {\n\t\tblob,\n\t\tcustomType,\n\t\tinteger,\n\t\tnumeric,\n\t\treal,\n\t\ttext,\n\t};\n}\n\nexport type SQLiteColumnBuilders = ReturnType<typeof getSQLiteColumnBuilders>;\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/columns/blob.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig, textDecoder } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\ntype BlobMode = 'buffer' | 'json' | 'bigint';\n\nexport type SQLiteBigIntBuilderInitial<TName extends string> = SQLiteBigIntBuilder<{\n\tname: TName;\n\tdataType: 'bigint';\n\tcolumnType: 'SQLiteBigInt';\n\tdata: bigint;\n\tdriverParam: Buffer;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteBigIntBuilder<T extends ColumnBuilderBaseConfig<'bigint', 'SQLiteBigInt'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBigIntBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'bigint', 'SQLiteBigInt');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBigInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteBigInt<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any>);\n\t}\n}\n\nexport class SQLiteBigInt<T extends ColumnBaseConfig<'bigint', 'SQLiteBigInt'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBigInt';\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n\n\toverride mapFromDriverValue(value: Buffer | Uint8Array | ArrayBuffer): bigint {\n\t\tif (typeof Buffer !== 'undefined' && Buffer.from) {\n\t\t\tconst buf = Buffer.isBuffer(value)\n\t\t\t\t? value\n\t\t\t\t// eslint-disable-next-line no-instanceof/no-instanceof\n\t\t\t\t: value instanceof ArrayBuffer\n\t\t\t\t? Buffer.from(value)\n\t\t\t\t: value.buffer\n\t\t\t\t? Buffer.from(value.buffer, value.byteOffset, value.byteLength)\n\t\t\t\t: Buffer.from(value);\n\t\t\treturn BigInt(buf.toString('utf8'));\n\t\t}\n\n\t\treturn BigInt(textDecoder!.decode(value));\n\t}\n\n\toverride mapToDriverValue(value: bigint): Buffer {\n\t\treturn Buffer.from(value.toString());\n\t}\n}\n\nexport type SQLiteBlobJsonBuilderInitial<TName extends string> = SQLiteBlobJsonBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'SQLiteBlobJson';\n\tdata: unknown;\n\tdriverParam: Buffer;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteBlobJsonBuilder<T extends ColumnBuilderBaseConfig<'json', 'SQLiteBlobJson'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobJsonBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'SQLiteBlobJson');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBlobJson<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteBlobJson<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteBlobJson<T extends ColumnBaseConfig<'json', 'SQLiteBlobJson'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobJson';\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n\n\toverride mapFromDriverValue(value: Buffer | Uint8Array | ArrayBuffer): T['data'] {\n\t\tif (typeof Buffer !== 'undefined' && Buffer.from) {\n\t\t\tconst buf = Buffer.isBuffer(value)\n\t\t\t\t? value\n\t\t\t\t// eslint-disable-next-line no-instanceof/no-instanceof\n\t\t\t\t: value instanceof ArrayBuffer\n\t\t\t\t? Buffer.from(value)\n\t\t\t\t: value.buffer\n\t\t\t\t? Buffer.from(value.buffer, value.byteOffset, value.byteLength)\n\t\t\t\t: Buffer.from(value);\n\t\t\treturn JSON.parse(buf.toString('utf8'));\n\t\t}\n\n\t\treturn JSON.parse(textDecoder!.decode(value));\n\t}\n\n\toverride mapToDriverValue(value: T['data']): Buffer {\n\t\treturn Buffer.from(JSON.stringify(value));\n\t}\n}\n\nexport type SQLiteBlobBufferBuilderInitial<TName extends string> = SQLiteBlobBufferBuilder<{\n\tname: TName;\n\tdataType: 'buffer';\n\tcolumnType: 'SQLiteBlobBuffer';\n\tdata: Buffer;\n\tdriverParam: Buffer;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteBlobBufferBuilder<T extends ColumnBuilderBaseConfig<'buffer', 'SQLiteBlobBuffer'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobBufferBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'buffer', 'SQLiteBlobBuffer');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBlobBuffer<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteBlobBuffer<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any>);\n\t}\n}\n\nexport class SQLiteBlobBuffer<T extends ColumnBaseConfig<'buffer', 'SQLiteBlobBuffer'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobBuffer';\n\n\toverride mapFromDriverValue(value: Buffer | Uint8Array | ArrayBuffer): T['data'] {\n\t\tif (Buffer.isBuffer(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn Buffer.from(value as Uint8Array);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n}\n\nexport interface BlobConfig<TMode extends BlobMode = BlobMode> {\n\tmode: TMode;\n}\n\n/**\n *  It's recommended to use `text('...', { mode: 'json' })` instead of `blob` in JSON mode, because it supports JSON functions:\n * >All JSON functions currently throw an error if any of their arguments are BLOBs because BLOBs are reserved for a future enhancement in which BLOBs will store the binary encoding for JSON.\n *\n * https://www.sqlite.org/json1.html\n */\nexport function blob(): SQLiteBlobJsonBuilderInitial<''>;\nexport function blob<TMode extends BlobMode = BlobMode>(\n\tconfig?: BlobConfig<TMode>,\n): Equal<TMode, 'bigint'> extends true ? SQLiteBigIntBuilderInitial<''>\n\t: Equal<TMode, 'buffer'> extends true ? SQLiteBlobBufferBuilderInitial<''>\n\t: SQLiteBlobJsonBuilderInitial<''>;\nexport function blob<TName extends string, TMode extends BlobMode = BlobMode>(\n\tname: TName,\n\tconfig?: BlobConfig<TMode>,\n): Equal<TMode, 'bigint'> extends true ? SQLiteBigIntBuilderInitial<TName>\n\t: Equal<TMode, 'buffer'> extends true ? SQLiteBlobBufferBuilderInitial<TName>\n\t: SQLiteBlobJsonBuilderInitial<TName>;\nexport function blob(a?: string | BlobConfig, b?: BlobConfig) {\n\tconst { name, config } = getColumnNameAndConfig<BlobConfig | undefined>(a, b);\n\tif (config?.mode === 'json') {\n\t\treturn new SQLiteBlobJsonBuilder(name);\n\t}\n\tif (config?.mode === 'bigint') {\n\t\treturn new SQLiteBigIntBuilder(name);\n\t}\n\treturn new SQLiteBlobBufferBuilder(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/columns/common.ts",
    "content": "import type {\n\tColumnBuilderBase,\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tHasGenerated,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport { ColumnBuilder } from '~/column-builder.ts';\nimport { Column } from '~/column.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { ForeignKey, UpdateDeleteAction } from '~/sqlite-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/sqlite-core/foreign-keys.ts';\nimport type { AnySQLiteTable, SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Update } from '~/utils.ts';\nimport { uniqueKeyName } from '../unique-constraint.ts';\n\nexport interface ReferenceConfig {\n\tref: () => SQLiteColumn;\n\tactions: {\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport interface SQLiteColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> extends ColumnBuilderBase<T, TTypeConfig & { dialect: 'sqlite' }> {}\n\nexport interface SQLiteGeneratedColumnConfig {\n\tmode?: 'virtual' | 'stored';\n}\n\nexport abstract class SQLiteColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = object,\n> extends ColumnBuilder<T, TRuntimeConfig, TTypeConfig & { dialect: 'sqlite' }, TExtraConfig>\n\timplements SQLiteColumnBuilderBase<T, TTypeConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteColumnBuilder';\n\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tactions: ReferenceConfig['actions'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, actions });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(as: SQL | T['data'] | (() => SQL), config?: SQLiteGeneratedColumnConfig): HasGenerated<this, {\n\t\ttype: 'always';\n\t}> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: config?.mode ?? 'virtual',\n\t\t};\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: SQLiteColumn, table: SQLiteTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, actions }) => {\n\t\t\treturn ((ref, actions) => {\n\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\treturn { columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t});\n\t\t\t\tif (actions.onUpdate) {\n\t\t\t\t\tbuilder.onUpdate(actions.onUpdate);\n\t\t\t\t}\n\t\t\t\tif (actions.onDelete) {\n\t\t\t\t\tbuilder.onDelete(actions.onDelete);\n\t\t\t\t}\n\t\t\t\treturn builder.build(table);\n\t\t\t})(ref, actions);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteColumn<MakeColumnConfig<T, TTableName>>;\n}\n\n// To understand how to use `SQLiteColumn` and `AnySQLiteColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class SQLiteColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = {},\n\tTTypeConfig extends object = {},\n> extends Column<T, TRuntimeConfig, TTypeConfig & { dialect: 'sqlite' }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteColumn';\n\n\tconstructor(\n\t\toverride readonly table: SQLiteTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tif (!config.uniqueName) {\n\t\t\tconfig.uniqueName = uniqueKeyName(table, [config.name]);\n\t\t}\n\t\tsuper(table, config);\n\t}\n}\n\nexport type AnySQLiteColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = SQLiteColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/columns/custom.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { AnySQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type ConvertCustomConfig<TName extends string, T extends Partial<CustomTypeValues>> =\n\t& {\n\t\tname: TName;\n\t\tdataType: 'custom';\n\t\tcolumnType: 'SQLiteCustomColumn';\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverData'];\n\t\tenumValues: undefined;\n\t}\n\t& (T['notNull'] extends true ? { notNull: true } : {})\n\t& (T['default'] extends true ? { hasDefault: true } : {});\n\nexport interface SQLiteCustomColumnInnerConfig {\n\tcustomTypeValues: CustomTypeValues;\n}\n\nexport class SQLiteCustomColumnBuilder<T extends ColumnBuilderBaseConfig<'custom', 'SQLiteCustomColumn'>>\n\textends SQLiteColumnBuilder<\n\t\tT,\n\t\t{\n\t\t\tfieldConfig: CustomTypeValues['config'];\n\t\t\tcustomTypeParams: CustomTypeParams<any>;\n\t\t},\n\t\t{\n\t\t\tsqliteColumnBuilderBrand: 'SQLiteCustomColumnBuilderBrand';\n\t\t}\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteCustomColumnBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\tfieldConfig: CustomTypeValues['config'],\n\t\tcustomTypeParams: CustomTypeParams<any>,\n\t) {\n\t\tsuper(name, 'custom', 'SQLiteCustomColumn');\n\t\tthis.config.fieldConfig = fieldConfig;\n\t\tthis.config.customTypeParams = customTypeParams;\n\t}\n\n\t/** @internal */\n\tbuild<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteCustomColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteCustomColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteCustomColumn<T extends ColumnBaseConfig<'custom', 'SQLiteCustomColumn'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteCustomColumn';\n\n\tprivate sqlName: string;\n\tprivate mapTo?: (value: T['data']) => T['driverParam'];\n\tprivate mapFrom?: (value: T['driverParam']) => T['data'];\n\n\tconstructor(\n\t\ttable: AnySQLiteTable<{ name: T['tableName'] }>,\n\t\tconfig: SQLiteCustomColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.sqlName = config.customTypeParams.dataType(config.fieldConfig);\n\t\tthis.mapTo = config.customTypeParams.toDriver;\n\t\tthis.mapFrom = config.customTypeParams.fromDriver;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.sqlName;\n\t}\n\n\toverride mapFromDriverValue(value: T['driverParam']): T['data'] {\n\t\treturn typeof this.mapFrom === 'function' ? this.mapFrom(value) : value as T['data'];\n\t}\n\n\toverride mapToDriverValue(value: T['data']): T['driverParam'] {\n\t\treturn typeof this.mapTo === 'function' ? this.mapTo(value) : value as T['data'];\n\t}\n}\n\nexport type CustomTypeValues = {\n\t/**\n\t * Required type for custom column, that will infer proper type model\n\t *\n\t * Examples:\n\t *\n\t * If you want your column to be `string` type after selecting/or on inserting - use `data: string`. Like `text`, `varchar`\n\t *\n\t * If you want your column to be `number` type after selecting/or on inserting - use `data: number`. Like `integer`\n\t */\n\tdata: unknown;\n\n\t/**\n\t * Type helper, that represents what type database driver is accepting for specific database data type\n\t */\n\tdriverData?: unknown;\n\n\t/**\n\t * What config type should be used for {@link CustomTypeParams} `dataType` generation\n\t */\n\tconfig?: Record<string, any>;\n\n\t/**\n\t * Whether the config argument should be required or not\n\t * @default false\n\t */\n\tconfigRequired?: boolean;\n\n\t/**\n\t * If your custom data type should be notNull by default you can use `notNull: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t  dataType() {\n\t * \t    return 'serial';\n\t *    },\n\t * });\n\t */\n\tnotNull?: boolean;\n\n\t/**\n\t * If your custom data type has default you can use `default: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t  dataType() {\n\t * \t    return 'serial';\n\t *    },\n\t * });\n\t */\n\tdefault?: boolean;\n};\n\nexport interface CustomTypeParams<T extends CustomTypeValues> {\n\t/**\n\t * Database data type string representation, that is used for migrations\n\t * @example\n\t * ```\n\t * `jsonb`, `text`\n\t * ```\n\t *\n\t * If database data type needs additional params you can use them from `config` param\n\t * @example\n\t * ```\n\t * `varchar(256)`, `numeric(2,3)`\n\t * ```\n\t *\n\t * To make `config` be of specific type please use config generic in {@link CustomTypeValues}\n\t *\n\t * @example\n\t * Usage example\n\t * ```\n\t *   dataType() {\n\t *     return 'boolean';\n\t *   },\n\t * ```\n\t * Or\n\t * ```\n\t *   dataType(config) {\n\t * \t   return typeof config.length !== 'undefined' ? `varchar(${config.length})` : `varchar`;\n\t * \t }\n\t * ```\n\t */\n\tdataType: (config: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined)) => string;\n\n\t/**\n\t * Optional mapping function, between user input and driver\n\t * @example\n\t * For example, when using jsonb we need to map JS/TS object to string before writing to database\n\t * ```\n\t * toDriver(value: TData): string {\n\t * \t return JSON.stringify(value);\n\t * }\n\t * ```\n\t */\n\ttoDriver?: (value: T['data']) => T['driverData'] | SQL;\n\n\t/**\n\t * Optional mapping function, that is responsible for data mapping from database to JS/TS code\n\t * @example\n\t * For example, when using timestamp we need to map string Date representation to JS Date\n\t * ```\n\t * fromDriver(value: string): Date {\n\t * \treturn new Date(value);\n\t * },\n\t * ```\n\t */\n\tfromDriver?: (value: T['driverData']) => T['data'];\n}\n\n/**\n * Custom sqlite database data type generator\n */\nexport function customType<T extends CustomTypeValues = CustomTypeValues>(\n\tcustomTypeParams: CustomTypeParams<T>,\n): Equal<T['configRequired'], true> extends true ? {\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig: TConfig,\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig: T['config'],\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n\t: {\n\t\t(): SQLiteCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig?: TConfig,\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig?: T['config'],\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n{\n\treturn <TName extends string>(\n\t\ta?: TName | T['config'],\n\t\tb?: T['config'],\n\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<TName, T>> => {\n\t\tconst { name, config } = getColumnNameAndConfig<T['config']>(a, b);\n\t\treturn new SQLiteCustomColumnBuilder(\n\t\t\tname as ConvertCustomConfig<TName, T>['name'],\n\t\t\tconfig,\n\t\t\tcustomTypeParams,\n\t\t);\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/columns/index.ts",
    "content": "export * from './blob.ts';\nexport * from './common.ts';\nexport * from './custom.ts';\nexport * from './integer.ts';\nexport * from './numeric.ts';\nexport * from './real.ts';\nexport * from './text.ts';\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/columns/integer.ts",
    "content": "import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tHasDefault,\n\tIsPrimaryKey,\n\tMakeColumnConfig,\n\tNotNull,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { OnConflict } from '~/sqlite-core/utils.ts';\nimport { type Equal, getColumnNameAndConfig, type Or } from '~/utils.ts';\nimport type { AnySQLiteTable } from '../table.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport interface PrimaryKeyConfig {\n\tautoIncrement?: boolean;\n\tonConflict?: OnConflict;\n}\n\nexport abstract class SQLiteBaseIntegerBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n> extends SQLiteColumnBuilder<\n\tT,\n\tTRuntimeConfig & { autoIncrement: boolean },\n\t{},\n\t{ primaryKeyHasDefault: true }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBaseIntegerBuilder';\n\n\tconstructor(name: T['name'], dataType: T['dataType'], columnType: T['columnType']) {\n\t\tsuper(name, dataType, columnType);\n\t\tthis.config.autoIncrement = false;\n\t}\n\n\toverride primaryKey(config?: PrimaryKeyConfig): IsPrimaryKey<HasDefault<NotNull<this>>> {\n\t\tif (config?.autoIncrement) {\n\t\t\tthis.config.autoIncrement = true;\n\t\t}\n\t\tthis.config.hasDefault = true;\n\t\treturn super.primaryKey() as IsPrimaryKey<HasDefault<NotNull<this>>>;\n\t}\n\n\t/** @internal */\n\tabstract override build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBaseInteger<MakeColumnConfig<T, TTableName>>;\n}\n\nexport abstract class SQLiteBaseInteger<\n\tT extends ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n> extends SQLiteColumn<T, TRuntimeConfig & { autoIncrement: boolean }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBaseInteger';\n\n\treadonly autoIncrement: boolean = this.config.autoIncrement;\n\n\tgetSQLType(): string {\n\t\treturn 'integer';\n\t}\n}\n\nexport type SQLiteIntegerBuilderInitial<TName extends string> = SQLiteIntegerBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SQLiteInteger';\n\tdata: number;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteIntegerBuilder<T extends ColumnBuilderBaseConfig<'number', 'SQLiteInteger'>>\n\textends SQLiteBaseIntegerBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteIntegerBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'SQLiteInteger');\n\t}\n\n\tbuild<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteInteger<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteInteger<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteInteger<T extends ColumnBaseConfig<'number', 'SQLiteInteger'>> extends SQLiteBaseInteger<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteInteger';\n}\n\nexport type SQLiteTimestampBuilderInitial<TName extends string> = SQLiteTimestampBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'SQLiteTimestamp';\n\tdata: Date;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteTimestampBuilder<T extends ColumnBuilderBaseConfig<'date', 'SQLiteTimestamp'>>\n\textends SQLiteBaseIntegerBuilder<T, { mode: 'timestamp' | 'timestamp_ms' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTimestampBuilder';\n\n\tconstructor(name: T['name'], mode: 'timestamp' | 'timestamp_ms') {\n\t\tsuper(name, 'date', 'SQLiteTimestamp');\n\t\tthis.config.mode = mode;\n\t}\n\n\t/**\n\t * @deprecated Use `default()` with your own expression instead.\n\t *\n\t * Adds `DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer))` to the column, which is the current epoch timestamp in milliseconds.\n\t */\n\tdefaultNow(): HasDefault<this> {\n\t\treturn this.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`) as any;\n\t}\n\n\tbuild<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteTimestamp<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteTimestamp<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteTimestamp<T extends ColumnBaseConfig<'date', 'SQLiteTimestamp'>>\n\textends SQLiteBaseInteger<T, { mode: 'timestamp' | 'timestamp_ms' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTimestamp';\n\n\treadonly mode: 'timestamp' | 'timestamp_ms' = this.config.mode;\n\n\toverride mapFromDriverValue(value: number): Date {\n\t\tif (this.config.mode === 'timestamp') {\n\t\t\treturn new Date(value * 1000);\n\t\t}\n\t\treturn new Date(value);\n\t}\n\n\toverride mapToDriverValue(value: Date): number {\n\t\tconst unix = value.getTime();\n\t\tif (this.config.mode === 'timestamp') {\n\t\t\treturn Math.floor(unix / 1000);\n\t\t}\n\t\treturn unix;\n\t}\n}\n\nexport type SQLiteBooleanBuilderInitial<TName extends string> = SQLiteBooleanBuilder<{\n\tname: TName;\n\tdataType: 'boolean';\n\tcolumnType: 'SQLiteBoolean';\n\tdata: boolean;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteBooleanBuilder<T extends ColumnBuilderBaseConfig<'boolean', 'SQLiteBoolean'>>\n\textends SQLiteBaseIntegerBuilder<T, { mode: 'boolean' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBooleanBuilder';\n\n\tconstructor(name: T['name'], mode: 'boolean') {\n\t\tsuper(name, 'boolean', 'SQLiteBoolean');\n\t\tthis.config.mode = mode;\n\t}\n\n\tbuild<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBoolean<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteBoolean<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteBoolean<T extends ColumnBaseConfig<'boolean', 'SQLiteBoolean'>>\n\textends SQLiteBaseInteger<T, { mode: 'boolean' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBoolean';\n\n\treadonly mode: 'boolean' = this.config.mode;\n\n\toverride mapFromDriverValue(value: number): boolean {\n\t\treturn Number(value) === 1;\n\t}\n\n\toverride mapToDriverValue(value: boolean): number {\n\t\treturn value ? 1 : 0;\n\t}\n}\n\nexport interface IntegerConfig<\n\tTMode extends 'number' | 'timestamp' | 'timestamp_ms' | 'boolean' =\n\t\t| 'number'\n\t\t| 'timestamp'\n\t\t| 'timestamp_ms'\n\t\t| 'boolean',\n> {\n\tmode: TMode;\n}\n\nexport function integer(): SQLiteIntegerBuilderInitial<''>;\nexport function integer<TMode extends IntegerConfig['mode']>(\n\tconfig?: IntegerConfig<TMode>,\n): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilderInitial<''>\n\t: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilderInitial<''>\n\t: SQLiteIntegerBuilderInitial<''>;\nexport function integer<TName extends string, TMode extends IntegerConfig['mode']>(\n\tname: TName,\n\tconfig?: IntegerConfig<TMode>,\n): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilderInitial<TName>\n\t: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilderInitial<TName>\n\t: SQLiteIntegerBuilderInitial<TName>;\nexport function integer(a?: string | IntegerConfig, b?: IntegerConfig) {\n\tconst { name, config } = getColumnNameAndConfig<IntegerConfig | undefined>(a, b);\n\tif (config?.mode === 'timestamp' || config?.mode === 'timestamp_ms') {\n\t\treturn new SQLiteTimestampBuilder(name, config.mode);\n\t}\n\tif (config?.mode === 'boolean') {\n\t\treturn new SQLiteBooleanBuilder(name, config.mode);\n\t}\n\treturn new SQLiteIntegerBuilder(name);\n}\n\nexport const int = integer;\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/columns/numeric.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type SQLiteNumericBuilderInitial<TName extends string> = SQLiteNumericBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SQLiteNumeric';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteNumericBuilder<T extends ColumnBuilderBaseConfig<'string', 'SQLiteNumeric'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'SQLiteNumeric');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteNumeric<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteNumeric<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteNumeric<T extends ColumnBaseConfig<'string', 'SQLiteNumeric'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumeric';\n\n\toverride mapFromDriverValue(value: unknown): string {\n\t\tif (typeof value === 'string') return value;\n\n\t\treturn String(value);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'numeric';\n\t}\n}\n\nexport type SQLiteNumericNumberBuilderInitial<TName extends string> = SQLiteNumericNumberBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SQLiteNumericNumber';\n\tdata: number;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteNumericNumberBuilder<T extends ColumnBuilderBaseConfig<'number', 'SQLiteNumericNumber'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericNumberBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'SQLiteNumericNumber');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteNumericNumber<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteNumericNumber<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteNumericNumber<T extends ColumnBaseConfig<'number', 'SQLiteNumericNumber'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericNumber';\n\n\toverride mapFromDriverValue(value: unknown): number {\n\t\tif (typeof value === 'number') return value;\n\n\t\treturn Number(value);\n\t}\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\treturn 'numeric';\n\t}\n}\n\nexport type SQLiteNumericBigIntBuilderInitial<TName extends string> = SQLiteNumericBigIntBuilder<{\n\tname: TName;\n\tdataType: 'bigint';\n\tcolumnType: 'SQLiteNumericBigInt';\n\tdata: bigint;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteNumericBigIntBuilder<T extends ColumnBuilderBaseConfig<'bigint', 'SQLiteNumericBigInt'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericBigIntBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'bigint', 'SQLiteNumericBigInt');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteNumericBigInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteNumericBigInt<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteNumericBigInt<T extends ColumnBaseConfig<'bigint', 'SQLiteNumericBigInt'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericBigInt';\n\n\toverride mapFromDriverValue = BigInt;\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\treturn 'numeric';\n\t}\n}\n\nexport type SQLiteNumericConfig<T extends 'string' | 'number' | 'bigint' = 'string' | 'number' | 'bigint'> = {\n\tmode: T;\n};\n\nexport function numeric<TMode extends SQLiteNumericConfig['mode']>(\n\tconfig?: SQLiteNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? SQLiteNumericNumberBuilderInitial<''>\n\t: Equal<TMode, 'bigint'> extends true ? SQLiteNumericBigIntBuilderInitial<''>\n\t: SQLiteNumericBuilderInitial<''>;\nexport function numeric<TName extends string, TMode extends SQLiteNumericConfig['mode']>(\n\tname: TName,\n\tconfig?: SQLiteNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? SQLiteNumericNumberBuilderInitial<TName>\n\t: Equal<TMode, 'bigint'> extends true ? SQLiteNumericBigIntBuilderInitial<TName>\n\t: SQLiteNumericBuilderInitial<TName>;\nexport function numeric(a?: string | SQLiteNumericConfig, b?: SQLiteNumericConfig) {\n\tconst { name, config } = getColumnNameAndConfig<SQLiteNumericConfig>(a, b);\n\tconst mode = config?.mode;\n\treturn mode === 'number'\n\t\t? new SQLiteNumericNumberBuilder(name)\n\t\t: mode === 'bigint'\n\t\t? new SQLiteNumericBigIntBuilder(name)\n\t\t: new SQLiteNumericBuilder(name);\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/columns/real.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable } from '../table.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type SQLiteRealBuilderInitial<TName extends string> = SQLiteRealBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SQLiteReal';\n\tdata: number;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteRealBuilder<T extends ColumnBuilderBaseConfig<'number', 'SQLiteReal'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteRealBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'SQLiteReal');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteReal<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteReal<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class SQLiteReal<T extends ColumnBaseConfig<'number', 'SQLiteReal'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteReal';\n\n\tgetSQLType(): string {\n\t\treturn 'real';\n\t}\n}\n\nexport function real(): SQLiteRealBuilderInitial<''>;\nexport function real<TName extends string>(name: TName): SQLiteRealBuilderInitial<TName>;\nexport function real(name?: string) {\n\treturn new SQLiteRealBuilder(name ?? '');\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/columns/text.ts",
    "content": "import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type SQLiteTextBuilderInitial<\n\tTName extends string,\n\tTEnum extends [string, ...string[]],\n\tTLength extends number | undefined,\n> = SQLiteTextBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SQLiteText';\n\tdata: TEnum[number];\n\tdriverParam: string;\n\tenumValues: TEnum;\n\tlength: TLength;\n}>;\n\nexport class SQLiteTextBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'SQLiteText'> & { length?: number | undefined },\n> extends SQLiteColumnBuilder<\n\tT,\n\t{ length: T['length']; enumValues: T['enumValues'] },\n\t{ length: T['length'] }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTextBuilder';\n\n\tconstructor(name: T['name'], config: SQLiteTextConfig<'text', T['enumValues'], T['length']>) {\n\t\tsuper(name, 'string', 'SQLiteText');\n\t\tthis.config.enumValues = config.enum;\n\t\tthis.config.length = config.length;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteText<MakeColumnConfig<T, TTableName> & { length: T['length'] }> {\n\t\treturn new SQLiteText<MakeColumnConfig<T, TTableName> & { length: T['length'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteText<T extends ColumnBaseConfig<'string', 'SQLiteText'> & { length?: number | undefined }>\n\textends SQLiteColumn<T, { length: T['length']; enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteText';\n\n\toverride readonly enumValues = this.config.enumValues;\n\n\treadonly length: T['length'] = this.config.length;\n\n\tconstructor(\n\t\ttable: AnySQLiteTable<{ name: T['tableName'] }>,\n\t\tconfig: SQLiteTextBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `text${this.config.length ? `(${this.config.length})` : ''}`;\n\t}\n}\n\nexport type SQLiteTextJsonBuilderInitial<TName extends string> = SQLiteTextJsonBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'SQLiteTextJson';\n\tdata: unknown;\n\tdriverParam: string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SQLiteTextJsonBuilder<T extends ColumnBuilderBaseConfig<'json', 'SQLiteTextJson'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTextJsonBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'SQLiteTextJson');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteTextJson<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteTextJson<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteTextJson<T extends ColumnBaseConfig<'json', 'SQLiteTextJson'>>\n\textends SQLiteColumn<T, { length: number | undefined; enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTextJson';\n\n\tgetSQLType(): string {\n\t\treturn 'text';\n\t}\n\n\toverride mapFromDriverValue(value: string): T['data'] {\n\t\treturn JSON.parse(value);\n\t}\n\n\toverride mapToDriverValue(value: T['data']): string {\n\t\treturn JSON.stringify(value);\n\t}\n}\n\nexport type SQLiteTextConfig<\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n\tTLength extends number | undefined = number | undefined,\n> = TMode extends 'text' ? {\n\t\tmode?: TMode;\n\t\tlength?: TLength;\n\t\tenum?: TEnum;\n\t}\n\t: {\n\t\tmode?: TMode;\n\t};\n\nexport function text(): SQLiteTextBuilderInitial<'', [string, ...string[]], undefined>;\nexport function text<\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n>(\n\tconfig?: SQLiteTextConfig<TMode, T | Writable<T>, L>,\n): Equal<TMode, 'json'> extends true ? SQLiteTextJsonBuilderInitial<''>\n\t: SQLiteTextBuilderInitial<'', Writable<T>, L>;\nexport function text<\n\tTName extends string,\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n>(\n\tname: TName,\n\tconfig?: SQLiteTextConfig<TMode, T | Writable<T>, L>,\n): Equal<TMode, 'json'> extends true ? SQLiteTextJsonBuilderInitial<TName>\n\t: SQLiteTextBuilderInitial<TName, Writable<T>, L>;\nexport function text(a?: string | SQLiteTextConfig, b: SQLiteTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<SQLiteTextConfig>(a, b);\n\tif (config.mode === 'json') {\n\t\treturn new SQLiteTextJsonBuilder(name);\n\t}\n\treturn new SQLiteTextBuilder(name, config as any);\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/db.ts",
    "content": "import type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { type ColumnsSelection, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect, SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport {\n\tQueryBuilder,\n\tSQLiteDeleteBase,\n\tSQLiteInsertBuilder,\n\tSQLiteSelectBuilder,\n\tSQLiteUpdateBuilder,\n} from '~/sqlite-core/query-builders/index.ts';\nimport type {\n\tDBResult,\n\tResult,\n\tSQLiteSession,\n\tSQLiteTransaction,\n\tSQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { DrizzleTypeError } from '~/utils.ts';\nimport { SQLiteCountBuilder } from './query-builders/count.ts';\nimport { RelationalQueryBuilder } from './query-builders/query.ts';\nimport { SQLiteRaw } from './query-builders/raw.ts';\nimport type { SelectedFields } from './query-builders/select.types.ts';\nimport type { WithBuilder } from './subquery.ts';\nimport type { SQLiteViewBase } from './view-base.ts';\n\nexport class BaseSQLiteDatabase<\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = ExtractTablesWithRelations<TFullSchema>,\n> {\n\tstatic readonly [entityKind]: string = 'BaseSQLiteDatabase';\n\n\tdeclare readonly _: {\n\t\treadonly schema: TSchema | undefined;\n\t\treadonly fullSchema: TFullSchema;\n\t\treadonly tableNamesMap: Record<string, string>;\n\t};\n\n\tquery: TFullSchema extends Record<string, never>\n\t\t? DrizzleTypeError<'Seems like the schema generic is missing - did you forget to add it to your DB type?'>\n\t\t: {\n\t\t\t[K in keyof TSchema]: RelationalQueryBuilder<TResultKind, TFullSchema, TSchema, TSchema[K]>;\n\t\t};\n\n\tconstructor(\n\t\tprivate resultKind: TResultKind,\n\t\t/** @internal */\n\t\treadonly dialect: { sync: SQLiteSyncDialect; async: SQLiteAsyncDialect }[TResultKind],\n\t\t/** @internal */\n\t\treadonly session: SQLiteSession<TResultKind, TRunResult, TFullSchema, TSchema>,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t) {\n\t\tthis._ = schema\n\t\t\t? {\n\t\t\t\tschema: schema.schema,\n\t\t\t\tfullSchema: schema.fullSchema as TFullSchema,\n\t\t\t\ttableNamesMap: schema.tableNamesMap,\n\t\t\t}\n\t\t\t: {\n\t\t\t\tschema: undefined,\n\t\t\t\tfullSchema: {} as TFullSchema,\n\t\t\t\ttableNamesMap: {},\n\t\t\t};\n\t\tthis.query = {} as typeof this['query'];\n\t\tconst query = this.query as {\n\t\t\t[K in keyof TSchema]: RelationalQueryBuilder<TResultKind, TFullSchema, TSchema, TSchema[K]>;\n\t\t};\n\t\tif (this._.schema) {\n\t\t\tfor (const [tableName, columns] of Object.entries(this._.schema)) {\n\t\t\t\tquery[tableName as keyof TSchema] = new RelationalQueryBuilder(\n\t\t\t\t\tresultKind,\n\t\t\t\t\tschema!.fullSchema,\n\t\t\t\t\tthis._.schema,\n\t\t\t\t\tthis._.tableNamesMap,\n\t\t\t\t\tschema!.fullSchema[tableName] as SQLiteTable,\n\t\t\t\t\tcolumns,\n\t\t\t\t\tdialect,\n\t\t\t\t\tsession as SQLiteSession<any, any, any, any> as any,\n\t\t\t\t) as typeof query[keyof TSchema];\n\t\t\t}\n\t\t}\n\t\tthis.$cache = { invalidate: async (_params: any) => {} };\n\t}\n\n\t/**\n\t * Creates a subquery that defines a temporary named result set as a CTE.\n\t *\n\t * It is useful for breaking down complex queries into simpler parts and for reusing the result set in subsequent parts of the query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param alias The alias for the subquery.\n\t *\n\t * Failure to provide an alias will result in a DrizzleTypeError, preventing the subquery from being referenced in other queries.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Create a subquery with alias 'sq' and use it in the select query\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t *\n\t * To select arbitrary SQL values as fields in a CTE and reference them in other CTEs or in the main query, you need to add aliases to them:\n\t *\n\t * ```ts\n\t * // Select an arbitrary SQL value as a field in a CTE and reference it in the main query\n\t * const sq = db.$with('sq').as(db.select({\n\t *   name: sql<string>`upper(${users.name})`.as('name'),\n\t * })\n\t * .from(users));\n\t *\n\t * const result = await db.with(sq).select({ name: sq.name }).from(sq);\n\t * ```\n\t */\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst self = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(new QueryBuilder(self.dialect));\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t);\n\t\t};\n\t\treturn { as };\n\t};\n\n\t$count(\n\t\tsource: SQLiteTable | SQLiteViewBase | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t) {\n\t\treturn new SQLiteCountBuilder({ source, filters, session: this.session });\n\t}\n\n\t/**\n\t * Incorporates a previously defined CTE (using `$with`) into the main query.\n\t *\n\t * This method allows the main query to reference a temporary named result set.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param queries The CTEs to incorporate into the main query.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Define a subquery 'sq' as a CTE using $with\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * // Incorporate the CTE 'sq' into the main query and select from it\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t */\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\t/**\n\t\t * Creates a select query.\n\t\t *\n\t\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all columns and all rows from the 'cars' table\n\t\t * const allCars: Car[] = await db.select().from(cars);\n\t\t *\n\t\t * // Select specific columns and all rows from the 'cars' table\n\t\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t\t *   id: cars.id,\n\t\t *   brand: cars.brand\n\t\t * })\n\t\t *   .from(cars);\n\t\t * ```\n\t\t *\n\t\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t\t *\n\t\t * ```ts\n\t\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t\t *   id: cars.id,\n\t\t *   lowerBrand: sql<string>`lower(${cars.brand})`,\n\t\t * })\n\t\t *   .from(cars);\n\t\t * ```\n\t\t */\n\t\tfunction select(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\t\tfunction select(\n\t\t\tfields?: SelectedFields,\n\t\t): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct` expression to the select query.\n\t\t *\n\t\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all unique rows from the 'cars' table\n\t\t * await db.selectDistinct()\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.id, cars.brand, cars.color);\n\t\t *\n\t\t * // Select all unique brands from the 'cars' table\n\t\t * await db.selectDistinct({ brand: cars.brand })\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.brand);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinct(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\t\tfunction selectDistinct(\n\t\t\tfields?: SelectedFields,\n\t\t): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Creates an update query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t\t *\n\t\t * Use `.set()` method to specify which values to update.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t\t *\n\t\t * @param table The table to update.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Update all rows in the 'cars' table\n\t\t * await db.update(cars).set({ color: 'red' });\n\t\t *\n\t\t * // Update rows with filters and conditions\n\t\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t\t *\n\t\t * // Update with returning clause\n\t\t * const updatedCar: Car[] = await db.update(cars)\n\t\t *   .set({ color: 'red' })\n\t\t *   .where(eq(cars.id, 1))\n\t\t *   .returning();\n\t\t * ```\n\t\t */\n\t\tfunction update<TTable extends SQLiteTable>(table: TTable): SQLiteUpdateBuilder<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteUpdateBuilder(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates an insert query.\n\t\t *\n\t\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t\t *\n\t\t * @param table The table to insert into.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Insert one row\n\t\t * await db.insert(cars).values({ brand: 'BMW' });\n\t\t *\n\t\t * // Insert multiple rows\n\t\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t\t *\n\t\t * // Insert with returning clause\n\t\t * const insertedCar: Car[] = await db.insert(cars)\n\t\t *   .values({ brand: 'BMW' })\n\t\t *   .returning();\n\t\t * ```\n\t\t */\n\t\tfunction insert<TTable extends SQLiteTable>(into: TTable): SQLiteInsertBuilder<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteInsertBuilder(into, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates a delete query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t\t *\n\t\t * @param table The table to delete from.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Delete all rows in the 'cars' table\n\t\t * await db.delete(cars);\n\t\t *\n\t\t * // Delete rows with filters and conditions\n\t\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t\t *\n\t\t * // Delete with returning clause\n\t\t * const deletedCar: Car[] = await db.delete(cars)\n\t\t *   .where(eq(cars.id, 1))\n\t\t *   .returning();\n\t\t * ```\n\t\t */\n\t\tfunction delete_<TTable extends SQLiteTable>(from: TTable): SQLiteDeleteBase<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteDeleteBase(from, self.session, self.dialect, queries);\n\t\t}\n\n\t\treturn { select, selectDistinct, update, insert, delete: delete_ };\n\t}\n\n\t/**\n\t * Creates a select query.\n\t *\n\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all columns and all rows from the 'cars' table\n\t * const allCars: Car[] = await db.select().from(cars);\n\t *\n\t * // Select specific columns and all rows from the 'cars' table\n\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t *   id: cars.id,\n\t *   brand: cars.brand\n\t * })\n\t *   .from(cars);\n\t * ```\n\t *\n\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t *\n\t * ```ts\n\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t *   id: cars.id,\n\t *   lowerBrand: sql<string>`lower(${cars.brand})`,\n\t * })\n\t *   .from(cars);\n\t * ```\n\t */\n\tselect(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\tselect(fields?: SelectedFields): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\treturn new SQLiteSelectBuilder({ fields: fields ?? undefined, session: this.session, dialect: this.dialect });\n\t}\n\n\t/**\n\t * Adds `distinct` expression to the select query.\n\t *\n\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all unique rows from the 'cars' table\n\t * await db.selectDistinct()\n\t *   .from(cars)\n\t *   .orderBy(cars.id, cars.brand, cars.color);\n\t *\n\t * // Select all unique brands from the 'cars' table\n\t * await db.selectDistinct({ brand: cars.brand })\n\t *   .from(cars)\n\t *   .orderBy(cars.brand);\n\t * ```\n\t */\n\tselectDistinct(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\tselectDistinct(\n\t\tfields?: SelectedFields,\n\t): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\treturn new SQLiteSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t/**\n\t * Creates an update query.\n\t *\n\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t *\n\t * Use `.set()` method to specify which values to update.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param table The table to update.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Update all rows in the 'cars' table\n\t * await db.update(cars).set({ color: 'red' });\n\t *\n\t * // Update rows with filters and conditions\n\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t *\n\t * // Update with returning clause\n\t * const updatedCar: Car[] = await db.update(cars)\n\t *   .set({ color: 'red' })\n\t *   .where(eq(cars.id, 1))\n\t *   .returning();\n\t * ```\n\t */\n\tupdate<TTable extends SQLiteTable>(table: TTable): SQLiteUpdateBuilder<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteUpdateBuilder(table, this.session, this.dialect);\n\t}\n\n\t$cache: { invalidate: Cache['onMutate'] };\n\n\t/**\n\t * Creates an insert query.\n\t *\n\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t *\n\t * @param table The table to insert into.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Insert one row\n\t * await db.insert(cars).values({ brand: 'BMW' });\n\t *\n\t * // Insert multiple rows\n\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t *\n\t * // Insert with returning clause\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t *   .values({ brand: 'BMW' })\n\t *   .returning();\n\t * ```\n\t */\n\tinsert<TTable extends SQLiteTable>(into: TTable): SQLiteInsertBuilder<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteInsertBuilder(into, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates a delete query.\n\t *\n\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param table The table to delete from.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Delete all rows in the 'cars' table\n\t * await db.delete(cars);\n\t *\n\t * // Delete rows with filters and conditions\n\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t *\n\t * // Delete with returning clause\n\t * const deletedCar: Car[] = await db.delete(cars)\n\t *   .where(eq(cars.id, 1))\n\t *   .returning();\n\t * ```\n\t */\n\tdelete<TTable extends SQLiteTable>(from: TTable): SQLiteDeleteBase<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteDeleteBase(from, this.session, this.dialect);\n\t}\n\n\trun(query: SQLWrapper | string): DBResult<TResultKind, TRunResult> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.run(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'run',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawRunValueFromBatchResult.bind(this.session),\n\t\t\t) as DBResult<TResultKind, TRunResult>;\n\t\t}\n\t\treturn this.session.run(sequel) as DBResult<TResultKind, TRunResult>;\n\t}\n\n\tall<T = unknown>(query: SQLWrapper | string): DBResult<TResultKind, T[]> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.all(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'all',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawAllValueFromBatchResult.bind(this.session),\n\t\t\t) as any;\n\t\t}\n\t\treturn this.session.all(sequel) as DBResult<TResultKind, T[]>;\n\t}\n\n\tget<T = unknown>(query: SQLWrapper | string): DBResult<TResultKind, T> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.get(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'get',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawGetValueFromBatchResult.bind(this.session),\n\t\t\t) as DBResult<TResultKind, T>;\n\t\t}\n\t\treturn this.session.get(sequel) as DBResult<TResultKind, T>;\n\t}\n\n\tvalues<T extends unknown[] = unknown[]>(query: SQLWrapper | string): DBResult<TResultKind, T[]> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.values(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'values',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawValuesValueFromBatchResult.bind(this.session),\n\t\t\t) as any;\n\t\t}\n\t\treturn this.session.values(sequel) as DBResult<TResultKind, T[]>;\n\t}\n\n\ttransaction<T>(\n\t\ttransaction: (tx: SQLiteTransaction<TResultKind, TRunResult, TFullSchema, TSchema>) => Result<TResultKind, T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Result<TResultKind, T> {\n\t\treturn this.session.transaction(transaction, config);\n\t}\n}\n\nexport type SQLiteWithReplicas<Q> = Q & { $primary: Q; $replicas: Q[] };\n\nexport const withReplicas = <\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n\tQ extends BaseSQLiteDatabase<\n\t\tTResultKind,\n\t\tTRunResult,\n\t\tTFullSchema,\n\t\tTSchema extends Record<string, unknown> ? ExtractTablesWithRelations<TFullSchema> : TSchema\n\t>,\n>(\n\tprimary: Q,\n\treplicas: [Q, ...Q[]],\n\tgetReplica: (replicas: Q[]) => Q = () => replicas[Math.floor(Math.random() * replicas.length)]!,\n): SQLiteWithReplicas<Q> => {\n\tconst select: Q['select'] = (...args: []) => getReplica(replicas).select(...args);\n\tconst selectDistinct: Q['selectDistinct'] = (...args: []) => getReplica(replicas).selectDistinct(...args);\n\tconst $count: Q['$count'] = (...args: [any]) => getReplica(replicas).$count(...args);\n\tconst $with: Q['with'] = (...args: []) => getReplica(replicas).with(...args);\n\n\tconst update: Q['update'] = (...args: [any]) => primary.update(...args);\n\tconst insert: Q['insert'] = (...args: [any]) => primary.insert(...args);\n\tconst $delete: Q['delete'] = (...args: [any]) => primary.delete(...args);\n\tconst run: Q['run'] = (...args: [any]) => primary.run(...args);\n\tconst all: Q['all'] = (...args: [any]) => primary.all(...args);\n\tconst get: Q['get'] = (...args: [any]) => primary.get(...args);\n\tconst values: Q['values'] = (...args: [any]) => primary.values(...args);\n\tconst transaction: Q['transaction'] = (...args: [any]) => primary.transaction(...args);\n\n\treturn {\n\t\t...primary,\n\t\tupdate,\n\t\tinsert,\n\t\tdelete: $delete,\n\t\trun,\n\t\tall,\n\t\tget,\n\t\tvalues,\n\t\ttransaction,\n\t\t$primary: primary,\n\t\t$replicas: replicas,\n\t\tselect,\n\t\tselectDistinct,\n\t\t$count,\n\t\twith: $with,\n\t\tget query() {\n\t\t\treturn getReplica(replicas).query;\n\t\t},\n\t};\n};\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/dialect.ts",
    "content": "import { aliasedTable, aliasedTableColumn, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport type { AnyColumn } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta } from '~/migrator.ts';\nimport {\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tgetOperators,\n\tgetOrderByOperators,\n\tMany,\n\tnormalizeRelation,\n\tOne,\n\ttype Relation,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { Name, Placeholder } from '~/sql/index.ts';\nimport { and, eq } from '~/sql/index.ts';\nimport { Param, type QueryWithTypings, SQL, sql, type SQLChunk } from '~/sql/sql.ts';\nimport { SQLiteColumn } from '~/sqlite-core/columns/index.ts';\nimport type {\n\tAnySQLiteSelectQueryBuilder,\n\tSQLiteDeleteConfig,\n\tSQLiteInsertConfig,\n\tSQLiteUpdateConfig,\n} from '~/sqlite-core/query-builders/index.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table } from '~/table.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type {\n\tSelectedFieldsOrdered,\n\tSQLiteSelectConfig,\n\tSQLiteSelectJoinConfig,\n} from './query-builders/select.types.ts';\nimport type { SQLiteSession } from './session.ts';\nimport { SQLiteViewBase } from './view-base.ts';\n\nexport interface SQLiteDialectConfig {\n\tcasing?: Casing;\n}\n\nexport abstract class SQLiteDialect {\n\tstatic readonly [entityKind]: string = 'SQLiteDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: SQLiteDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\"${name}\"`;\n\t}\n\n\tescapeParam(_num: number): string {\n\t\treturn '?';\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({ table, where, returning, withList, limit, orderBy }: SQLiteDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\tbuildUpdateSet(table: SQLiteTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter((colName) =>\n\t\t\tset[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined\n\t\t);\n\n\t\tconst setSize = columnNames.length;\n\t\treturn sql.join(columnNames.flatMap((colName, i) => {\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tconst onUpdateFnResult = col.onUpdateFn?.();\n\t\t\tconst value = set[colName] ?? (is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col));\n\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\tif (i < setSize - 1) {\n\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t}\n\t\t\treturn [res];\n\t\t}));\n\t}\n\n\tbuildUpdateQuery({ table, set, where, returning, withList, joins, from, limit, orderBy }: SQLiteUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst fromSql = from && sql.join([sql.raw(' from '), this.buildFromTable(from)]);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields\n\t\t\t.flatMap(({ field }, i) => {\n\t\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tnew SQL(\n\t\t\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\t\t\tif (is(c, Column)) {\n\t\t\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn c;\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(query);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Column)) {\n\t\t\t\t\tconst tableName = field.table[Table.Symbol.Name];\n\t\t\t\t\tif (field.columnType === 'SQLiteNumericBigInt') {\n\t\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\t\tchunk.push(sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\t\tsql`cast(${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))} as text)`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\t\tchunk.push(sql.identifier(this.casing.getColumnCasing(field)));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\t\tconst entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];\n\n\t\t\t\t\tif (entries.length === 1) {\n\t\t\t\t\t\tconst entry = entries[0]![1];\n\n\t\t\t\t\t\tconst fieldDecoder = is(entry, SQL)\n\t\t\t\t\t\t\t? entry.decoder\n\t\t\t\t\t\t\t: is(entry, Column)\n\t\t\t\t\t\t\t? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }\n\t\t\t\t\t\t\t: entry.sql.decoder;\n\t\t\t\t\t\tif (fieldDecoder) field._.sql.decoder = fieldDecoder;\n\t\t\t\t\t}\n\t\t\t\t\tchunk.push(field);\n\t\t\t\t}\n\n\t\t\t\tif (i < columnsLen - 1) {\n\t\t\t\t\tchunk.push(sql`, `);\n\t\t\t\t}\n\n\t\t\t\treturn chunk;\n\t\t\t});\n\n\t\treturn sql.join(chunks);\n\t}\n\n\tprivate buildJoins(joins: SQLiteSelectJoinConfig[] | undefined): SQL | undefined {\n\t\tif (!joins || joins.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst joinsArray: SQL[] = [];\n\n\t\tif (joins) {\n\t\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t\tconst table = joinMeta.table;\n\t\t\t\tconst onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;\n\n\t\t\t\tif (is(table, SQLiteTable)) {\n\t\t\t\t\tconst tableName = table[SQLiteTable.Symbol.Name];\n\t\t\t\t\tconst tableSchema = table[SQLiteTable.Symbol.Schema];\n\t\t\t\t\tconst origTableName = table[SQLiteTable.Symbol.OriginalName];\n\t\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${\n\t\t\t\t\t\t\tsql.identifier(origTableName)\n\t\t\t\t\t\t}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${table}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (index < joins.length - 1) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sql.join(joinsArray);\n\t}\n\n\tprivate buildLimit(limit: number | Placeholder | undefined): SQL | undefined {\n\t\treturn typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\t}\n\n\tprivate buildOrderBy(orderBy: (SQLiteColumn | SQL | SQL.Aliased)[] | undefined): SQL | undefined {\n\t\tconst orderByList: (SQLiteColumn | SQL | SQL.Aliased)[] = [];\n\n\t\tif (orderBy) {\n\t\t\tfor (const [index, orderByValue] of orderBy.entries()) {\n\t\t\t\torderByList.push(orderByValue);\n\n\t\t\t\tif (index < orderBy.length - 1) {\n\t\t\t\t\torderByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : undefined;\n\t}\n\n\tprivate buildFromTable(\n\t\ttable: SQL | Subquery | SQLiteViewBase | SQLiteTable | undefined,\n\t): SQL | Subquery | SQLiteViewBase | SQLiteTable | undefined {\n\t\tif (is(table, Table) && table[Table.Symbol.IsAlias]) {\n\t\t\treturn sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? '')}.`.if(table[Table.Symbol.Schema])}${\n\t\t\t\tsql.identifier(table[Table.Symbol.OriginalName])\n\t\t\t} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t}\n\n\t\treturn table;\n\t}\n\n\tbuildSelectQuery(\n\t\t{\n\t\t\twithList,\n\t\t\tfields,\n\t\t\tfieldsFlat,\n\t\t\twhere,\n\t\t\thaving,\n\t\t\ttable,\n\t\t\tjoins,\n\t\t\torderBy,\n\t\t\tgroupBy,\n\t\t\tlimit,\n\t\t\toffset,\n\t\t\tdistinct,\n\t\t\tsetOperators,\n\t\t}: SQLiteSelectConfig,\n\t): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<SQLiteColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, SQLiteViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(({ alias }) =>\n\t\t\t\t\t\talias === (table[Table.Symbol.IsAlias] ? getTableName(table) : table[Table.Symbol.BaseName])\n\t\t\t\t\t))(f.field.table)\n\t\t\t) {\n\t\t\t\tconst tableName = getTableName(f.field.table);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Your \"${\n\t\t\t\t\t\tf.path.join('->')\n\t\t\t\t\t}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst isSingleTable = !joins || joins.length === 0;\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst distinctSql = distinct ? sql` distinct` : undefined;\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable });\n\n\t\tconst tableSql = this.buildFromTable(table);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tconst groupByList: (SQL | AnyColumn | SQL.Aliased)[] = [];\n\t\tif (groupBy) {\n\t\t\tfor (const [index, groupByValue] of groupBy.entries()) {\n\t\t\t\tgroupByList.push(groupByValue);\n\n\t\t\t\tif (index < groupBy.length - 1) {\n\t\t\t\t\tgroupByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;\n\n\t\tif (setOperators.length > 0) {\n\t\t\treturn this.buildSetOperations(finalQuery, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(leftSelect: SQL, setOperators: SQLiteSelectConfig['setOperators']): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: { leftSelect: SQL; setOperator: SQLiteSelectConfig['setOperators'][number] }): SQL {\n\t\t// SQLite doesn't support parenthesis in set operations\n\t\tconst leftChunk = sql`${leftSelect.getSQL()} `;\n\t\tconst rightChunk = sql`${rightSelect.getSQL()}`;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\tconst orderByValues: (SQL<unknown> | Name)[] = [];\n\n\t\t\t// The next bit is necessary because the sql operator replaces ${table.column} with `table`.`column`\n\t\t\t// which is invalid Sql syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const singleOrderBy of orderBy) {\n\t\t\t\tif (is(singleOrderBy, SQLiteColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(singleOrderBy.name));\n\t\t\t\t} else if (is(singleOrderBy, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < singleOrderBy.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = singleOrderBy.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, SQLiteColumn)) {\n\t\t\t\t\t\t\tsingleOrderBy.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery(\n\t\t{ table, values: valuesOrSelect, onConflict, returning, withList, select }: SQLiteInsertConfig,\n\t): SQL {\n\t\t// const isSingleValue = values.length === 1;\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, SQLiteColumn> = table[Table.Symbol.Columns];\n\n\t\tconst colEntries: [string, SQLiteColumn][] = Object.entries(columns).filter(([_, col]) =>\n\t\t\t!col.shouldDisableInsert()\n\t\t);\n\t\tconst insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnySQLiteSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (colValue === undefined || (is(colValue, Param) && colValue.value === undefined)) {\n\t\t\t\t\t\tlet defaultValue;\n\t\t\t\t\t\tif (col.default !== null && col.default !== undefined) {\n\t\t\t\t\t\t\tdefaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tdefaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tdefaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdefaultValue = sql`null`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst onConflictSql = onConflict?.length\n\t\t\t? sql.join(onConflict)\n\t\t\t: undefined;\n\n\t\t// if (isSingleValue && valuesSqlList.length === 0){\n\t\t// \treturn sql`insert into ${table} default values ${onConflictSql}${returningSql}`;\n\t\t// }\n\n\t\treturn sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\tbuildRelationalQuery({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: SQLiteTable;\n\t\ttableConfig: TableRelationalConfig;\n\t\tqueryConfig: true | DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: Relation;\n\t\tjoinOn?: SQL;\n\t}): BuildRelationalQueryResult<SQLiteTable, SQLiteColumn> {\n\t\tlet selection: BuildRelationalQueryResult<SQLiteTable, SQLiteColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: SQLiteSelectConfig['orderBy'] = [], where;\n\t\tconst joins: SQLiteSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as SQLiteColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: SQLiteColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as SQLiteColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | DBQueryConfig<'many', false>;\n\t\t\t\trelation: Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as SQLiteColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\t// const relationTable = schema[relationTableTsName]!;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this.buildRelationalQuery({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as SQLiteTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = (sql`(${builtRelation.sql})`).as(selectedRelationTsKey);\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage:\n\t\t\t\t\t`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.`,\n\t\t\t});\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field }) =>\n\t\t\t\t\t\tis(field, SQLiteColumn)\n\t\t\t\t\t\t\t? sql.identifier(this.casing.getColumnCasing(field))\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, Many)) {\n\t\t\t\tfield = sql`coalesce(json_group_array(${field}), json_array())`;\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield: field.as('data'),\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\torderBy,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n}\n\nexport class SQLiteSyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncDialect';\n\n\tmigrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<'sync', unknown, Record<string, unknown>, TablesRelationalConfig>,\n\t\tconfig?: string | MigrationConfig,\n\t): void {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric\n\t\t\t)\n\t\t`;\n\t\tsession.run(migrationTableCreate);\n\n\t\tconst dbMigrations = session.values<[number, string, string]>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\t\tsession.run(sql`BEGIN`);\n\n\t\ttry {\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tsession.run(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tsession.run(\n\t\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsession.run(sql`COMMIT`);\n\t\t} catch (e) {\n\t\t\tsession.run(sql`ROLLBACK`);\n\t\t\tthrow e;\n\t\t}\n\t}\n}\n\nexport class SQLiteAsyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncDialect';\n\n\tasync migrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<'async', any, any, any>,\n\t\tconfig?: string | MigrationConfig,\n\t): Promise<void> {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric\n\t\t\t)\n\t\t`;\n\t\tawait session.run(migrationTableCreate);\n\n\t\tconst dbMigrations = await session.values<[number, string, string]>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\n\t\tawait session.transaction(async (tx) => {\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tawait tx.run(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tawait tx.run(\n\t\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/expressions.ts",
    "content": "import { bindIfParam } from '~/sql/expressions/index.ts';\nimport type { SQL, SQLChunk, SQLWrapper } from '~/sql/sql.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { SQLiteColumn } from '~/sqlite-core/columns/index.ts';\n\nexport * from '~/sql/expressions/index.ts';\n\nexport function concat(column: SQLiteColumn | SQL.Aliased, value: string | SQLWrapper): SQL {\n\treturn sql`${column} || ${bindIfParam(value, column)}`;\n}\n\nexport function substring(\n\tcolumn: SQLiteColumn | SQL.Aliased,\n\t{ from, for: _for }: { from?: number | SQLWrapper; for?: number | SQLWrapper },\n): SQL {\n\tconst chunks: SQLChunk[] = [sql`substring(`, column];\n\tif (from !== undefined) {\n\t\tchunks.push(sql` from `, bindIfParam(from, column));\n\t}\n\tif (_for !== undefined) {\n\t\tchunks.push(sql` for `, bindIfParam(_for, column));\n\t}\n\tchunks.push(sql`)`);\n\treturn sql.join(chunks);\n}\n\nexport function rowId(): SQL<number> {\n\treturn sql<number>`rowid`;\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/foreign-keys.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { AnySQLiteColumn, SQLiteColumn } from './columns/index.ts';\nimport type { SQLiteTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: SQLiteColumn[];\n\treadonly foreignTable: SQLiteTable;\n\treadonly foreignColumns: SQLiteColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteForeignKeyBuilder';\n\n\tdeclare _: {\n\t\tbrand: 'SQLiteForeignKeyBuilder';\n\t\tforeignTableName: 'TForeignTableName';\n\t};\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined;\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: SQLiteColumn[];\n\t\t\tforeignColumns: SQLiteColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as SQLiteTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'SQLiteForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(readonly table: SQLiteTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[TableName],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[TableName],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends SQLiteColumn[],\n> = { [Key in keyof TColumns]: AnySQLiteColumn<{ tableName: TTableName }> };\n\n/**\n * @deprecated please use `foreignKey({ columns: [], foreignColumns: [] })` syntax without callback\n * @param config\n * @returns\n */\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnySQLiteColumn<{ tableName: TTableName }>, ...AnySQLiteColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: () => {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder;\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnySQLiteColumn<{ tableName: TTableName }>, ...AnySQLiteColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder;\nexport function foreignKey(\n\tconfig: any,\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tif (typeof config === 'function') {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tcolumns,\n\t\t\t\tforeignColumns,\n\t\t\t};\n\t\t}\n\t\treturn config;\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/index.ts",
    "content": "export * from './alias.ts';\nexport * from './checks.ts';\nexport * from './columns/index.ts';\nexport * from './db.ts';\nexport * from './dialect.ts';\nexport * from './foreign-keys.ts';\nexport * from './indexes.ts';\nexport * from './primary-keys.ts';\nexport * from './query-builders/index.ts';\nexport * from './session.ts';\nexport * from './subquery.ts';\nexport * from './table.ts';\nexport * from './unique-constraint.ts';\nexport * from './utils.ts';\nexport * from './view.ts';\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/indexes.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { SQLiteColumn } from './columns/index.ts';\nimport type { SQLiteTable } from './table.ts';\n\nexport interface IndexConfig {\n\tname: string;\n\tcolumns: IndexColumn[];\n\tunique: boolean;\n\twhere: SQL | undefined;\n}\n\nexport type IndexColumn = SQLiteColumn | SQL;\n\nexport class IndexBuilderOn {\n\tstatic readonly [entityKind]: string = 'SQLiteIndexBuilderOn';\n\n\tconstructor(private name: string, private unique: boolean) {}\n\n\ton(...columns: [IndexColumn, ...IndexColumn[]]): IndexBuilder {\n\t\treturn new IndexBuilder(this.name, columns, this.unique);\n\t}\n}\n\nexport class IndexBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteIndexBuilder';\n\n\tdeclare _: {\n\t\tbrand: 'SQLiteIndexBuilder';\n\t};\n\n\t/** @internal */\n\tconfig: IndexConfig;\n\n\tconstructor(name: string, columns: IndexColumn[], unique: boolean) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tunique,\n\t\t\twhere: undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Condition for partial index.\n\t */\n\twhere(condition: SQL): this {\n\t\tthis.config.where = condition;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): Index {\n\t\treturn new Index(this.config, table);\n\t}\n}\n\nexport class Index {\n\tstatic readonly [entityKind]: string = 'SQLiteIndex';\n\n\tdeclare _: {\n\t\tbrand: 'SQLiteIndex';\n\t};\n\n\treadonly config: IndexConfig & { table: SQLiteTable };\n\n\tconstructor(config: IndexConfig, table: SQLiteTable) {\n\t\tthis.config = { ...config, table };\n\t}\n}\n\nexport function index(name: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(name, false);\n}\n\nexport function uniqueIndex(name: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(name, true);\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/primary-keys.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { AnySQLiteColumn, SQLiteColumn } from './columns/index.ts';\nimport { SQLiteTable } from './table.ts';\n\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumn extends AnySQLiteColumn<{ tableName: TTableName }>,\n\tTColumns extends AnySQLiteColumn<{ tableName: TTableName }>[],\n>(config: { name?: string; columns: [TColumn, ...TColumns] }): PrimaryKeyBuilder;\n/**\n * @deprecated: Please use primaryKey({ columns: [] }) instead of this function\n * @param columns\n */\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumns extends AnySQLiteColumn<{ tableName: TTableName }>[],\n>(...columns: TColumns): PrimaryKeyBuilder;\nexport function primaryKey(...config: any) {\n\tif (config[0].columns) {\n\t\treturn new PrimaryKeyBuilder(config[0].columns, config[0].name);\n\t}\n\treturn new PrimaryKeyBuilder(config);\n}\nexport class PrimaryKeyBuilder {\n\tstatic readonly [entityKind]: string = 'SQLitePrimaryKeyBuilder';\n\n\tdeclare _: {\n\t\tbrand: 'SQLitePrimaryKeyBuilder';\n\t};\n\n\t/** @internal */\n\tcolumns: SQLiteColumn[];\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tcolumns: SQLiteColumn[],\n\t\tname?: string,\n\t) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): PrimaryKey {\n\t\treturn new PrimaryKey(table, this.columns, this.name);\n\t}\n}\n\nexport class PrimaryKey {\n\tstatic readonly [entityKind]: string = 'SQLitePrimaryKey';\n\n\treadonly columns: SQLiteColumn[];\n\treadonly name?: string;\n\n\tconstructor(readonly table: SQLiteTable, columns: SQLiteColumn[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\tgetName(): string {\n\t\treturn this.name\n\t\t\t?? `${this.table[SQLiteTable.Symbol.Name]}_${this.columns.map((column) => column.name).join('_')}_pk`;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/query-builders/count.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteSession } from '../session.ts';\nimport type { SQLiteTable } from '../table.ts';\nimport type { SQLiteView } from '../view.ts';\n\nexport class SQLiteCountBuilder<\n\tTSession extends SQLiteSession<any, any, any, any>,\n> extends SQL<number> implements Promise<number>, SQLWrapper {\n\tprivate sql: SQL<number>;\n\n\tstatic override readonly [entityKind] = 'SQLiteCountBuilderAsync';\n\t[Symbol.toStringTag] = 'SQLiteCountBuilderAsync';\n\n\tprivate session: TSession;\n\n\tprivate static buildEmbeddedCount(\n\t\tsource: SQLiteTable | SQLiteView | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`(select count(*) from ${source}${sql.raw(' where ').if(filters)}${filters})`;\n\t}\n\n\tprivate static buildCount(\n\t\tsource: SQLiteTable | SQLiteView | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`select count(*) from ${source}${sql.raw(' where ').if(filters)}${filters}`;\n\t}\n\n\tconstructor(\n\t\treadonly params: {\n\t\t\tsource: SQLiteTable | SQLiteView | SQL | SQLWrapper;\n\t\t\tfilters?: SQL<unknown>;\n\t\t\tsession: TSession;\n\t\t},\n\t) {\n\t\tsuper(SQLiteCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);\n\n\t\tthis.session = params.session;\n\n\t\tthis.sql = SQLiteCountBuilder.buildCount(\n\t\t\tparams.source,\n\t\t\tparams.filters,\n\t\t);\n\t}\n\n\tthen<TResult1 = number, TResult2 = never>(\n\t\tonfulfilled?: ((value: number) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n\t\tonrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn Promise.resolve(this.session.count(this.sql)).then(\n\t\t\tonfulfilled,\n\t\t\tonrejected,\n\t\t);\n\t}\n\n\tcatch(\n\t\tonRejected?: ((reason: any) => never | PromiseLike<never>) | null | undefined,\n\t): Promise<number> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<number> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/query-builders/delete.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { Placeholder, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { type DrizzleTypeError, orderSelectedFields, type ValueOrArray } from '~/utils.ts';\nimport type { SQLiteColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\n\nexport type SQLiteDeleteWithout<\n\tT extends AnySQLiteDeleteBase,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T\n\t: Omit<\n\t\tSQLiteDeleteBase<\n\t\t\tT['_']['table'],\n\t\t\tT['_']['resultType'],\n\t\t\tT['_']['runResult'],\n\t\t\tT['_']['returning'],\n\t\t\tTDynamic,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>,\n\t\tT['_']['excludedMethods'] | K\n\t>;\n\nexport type SQLiteDelete<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n> = SQLiteDeleteBase<TTable, TResultType, TRunResult, TReturning, true, never>;\n\nexport interface SQLiteDeleteConfig {\n\twhere?: SQL | undefined;\n\tlimit?: number | Placeholder;\n\torderBy?: (SQLiteColumn | SQL | SQL.Aliased)[];\n\ttable: SQLiteTable;\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type SQLiteDeleteReturningAll<\n\tT extends AnySQLiteDeleteBase,\n\tTDynamic extends boolean,\n> = SQLiteDeleteWithout<\n\tSQLiteDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tT['_']['dynamic'],\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteDeleteReturning<\n\tT extends AnySQLiteDeleteBase,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = SQLiteDeleteWithout<\n\tSQLiteDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tT['_']['dynamic'],\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteDeleteExecute<T extends AnySQLiteDeleteBase> = T['_']['returning'] extends undefined\n\t? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteDeletePrepare<T extends AnySQLiteDeleteBase> = SQLitePreparedQuery<{\n\ttype: T['_']['resultType'];\n\trun: T['_']['runResult'];\n\tall: T['_']['returning'] extends undefined ? DrizzleTypeError<'.all() cannot be used without .returning()'>\n\t\t: T['_']['returning'][];\n\tget: T['_']['returning'] extends undefined ? DrizzleTypeError<'.get() cannot be used without .returning()'>\n\t\t: T['_']['returning'] | undefined;\n\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t: any[][];\n\texecute: SQLiteDeleteExecute<T>;\n}>;\n\nexport type SQLiteDeleteDynamic<T extends AnySQLiteDeleteBase> = SQLiteDelete<\n\tT['_']['table'],\n\tT['_']['resultType'],\n\tT['_']['runResult'],\n\tT['_']['returning']\n>;\n\nexport type AnySQLiteDeleteBase = SQLiteDeleteBase<any, any, any, any, any, any>;\n\nexport interface SQLiteDeleteBase<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tQueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\tdialect: 'sqlite';\n\t\treadonly table: TTable;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? TRunResult : TReturning[];\n\t};\n}\n\nexport class SQLiteDeleteBase<\n\tTTable extends SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n\timplements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteDelete';\n\n\t/** @internal */\n\tconfig: SQLiteDeleteConfig;\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: SQLiteSession<any, any, any, any>,\n\t\tprivate dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, withList };\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will delete only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be deleted.\n\t *\n\t * ```ts\n\t * // Delete all cars with green color\n\t * db.delete(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * db.delete(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Delete all BMW cars with a green color\n\t * db.delete(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Delete all cars with the green or blue color\n\t * db.delete(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): SQLiteDeleteWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\torderBy(\n\t\tbuilder: (deleteTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteDeleteWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SQLiteColumn | SQL | SQL.Aliased)[]): SQLiteDeleteWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(deleteTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteDeleteWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as any,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\tlimit(limit: number | Placeholder): SQLiteDeleteWithout<this, TDynamic, 'limit'> {\n\t\tthis.config.limit = limit;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the deleted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete#delete-with-return}\n\t *\n\t * @example\n\t * ```ts\n\t * // Delete all cars with the green color and return all fields\n\t * const deletedCars: Car[] = await db.delete(cars)\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning();\n\t *\n\t * // Delete all cars with the green color and return only their id and brand fields\n\t * const deletedCarsIdsAndBrands: { id: number, brand: string }[] = await db.delete(cars)\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): SQLiteDeleteReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): SQLiteDeleteReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.table[SQLiteTable.Symbol.Columns],\n\t): SQLiteDeleteReturning<this, TDynamic, any> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildDeleteQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteDeletePrepare<this> {\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\ttrue,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\ttype: 'delete',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t},\n\t\t) as SQLiteDeletePrepare<this>;\n\t}\n\n\tprepare(): SQLiteDeletePrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\toverride async execute(placeholderValues?: Record<string, unknown>): Promise<SQLiteDeleteExecute<this>> {\n\t\treturn this._prepare().execute(placeholderValues) as SQLiteDeleteExecute<this>;\n\t}\n\n\t$dynamic(): SQLiteDeleteDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/query-builders/index.ts",
    "content": "export * from './delete.ts';\nexport * from './insert.ts';\nexport * from './query-builder.ts';\nexport * from './select.ts';\nexport * from './select.types.ts';\nexport * from './update.ts';\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/query-builders/insert.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { Param, SQL, sql } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { IndexColumn } from '~/sqlite-core/indexes.ts';\nimport type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { Columns, Table } from '~/table.ts';\nimport { type DrizzleTypeError, haveSameKeys, mapUpdateSet, orderSelectedFields, type Simplify } from '~/utils.ts';\nimport type { AnySQLiteColumn, SQLiteColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport { QueryBuilder } from './query-builder.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\nimport type { SQLiteUpdateSetSource } from './update.ts';\n\nexport interface SQLiteInsertConfig<TTable extends SQLiteTable = SQLiteTable> {\n\ttable: TTable;\n\tvalues: Record<string, Param | SQL>[] | SQLiteInsertSelectQueryBuilder<TTable> | SQL;\n\twithList?: Subquery[];\n\tonConflict?: SQL[];\n\treturning?: SelectedFieldsOrdered;\n\tselect?: boolean;\n}\n\nexport type SQLiteInsertValue<TTable extends SQLiteTable> = Simplify<\n\t{\n\t\t[Key in keyof TTable['$inferInsert']]: TTable['$inferInsert'][Key] | SQL | Placeholder;\n\t}\n>;\n\nexport type SQLiteInsertSelectQueryBuilder<TTable extends SQLiteTable> = TypedQueryBuilder<\n\t{ [K in keyof TTable['$inferInsert']]: AnySQLiteColumn | SQL | SQL.Aliased | TTable['$inferInsert'][K] }\n>;\n\nexport class SQLiteInsertBuilder<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteInsertBuilder';\n\n\tconstructor(\n\t\tprotected table: TTable,\n\t\tprotected session: SQLiteSession<any, any, any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprivate withList?: Subquery[],\n\t) {}\n\n\tvalues(value: SQLiteInsertValue<TTable>): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tvalues(values: SQLiteInsertValue<TTable>[]): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tvalues(\n\t\tvalues: SQLiteInsertValue<TTable> | SQLiteInsertValue<TTable>[],\n\t): SQLiteInsertBase<TTable, TResultType, TRunResult> {\n\t\tvalues = Array.isArray(values) ? values : [values];\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('values() must be called with at least one value');\n\t\t}\n\t\tconst mappedValues = values.map((entry) => {\n\t\t\tconst result: Record<string, Param | SQL> = {};\n\t\t\tconst cols = this.table[Table.Symbol.Columns];\n\t\t\tfor (const colKey of Object.keys(entry)) {\n\t\t\t\tconst colValue = entry[colKey as keyof typeof entry];\n\t\t\t\tresult[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);\n\t\t\t}\n\t\t\treturn result;\n\t\t});\n\n\t\t// if (mappedValues.length > 1 && mappedValues.some((t) => Object.keys(t).length === 0)) {\n\t\t// \tthrow new Error(\n\t\t// \t\t`One of the values you want to insert is empty. In SQLite you can insert only one empty object per statement. For this case Drizzle with use \"INSERT INTO ... DEFAULT VALUES\" syntax`,\n\t\t// \t);\n\t\t// }\n\n\t\treturn new SQLiteInsertBase(this.table, mappedValues, this.session, this.dialect, this.withList);\n\t}\n\n\tselect(\n\t\tselectQuery: (qb: QueryBuilder) => SQLiteInsertSelectQueryBuilder<TTable>,\n\t): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(selectQuery: (qb: QueryBuilder) => SQL): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(selectQuery: SQL): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(selectQuery: SQLiteInsertSelectQueryBuilder<TTable>): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(\n\t\tselectQuery:\n\t\t\t| SQL\n\t\t\t| SQLiteInsertSelectQueryBuilder<TTable>\n\t\t\t| ((qb: QueryBuilder) => SQLiteInsertSelectQueryBuilder<TTable> | SQL),\n\t): SQLiteInsertBase<TTable, TResultType, TRunResult> {\n\t\tconst select = typeof selectQuery === 'function' ? selectQuery(new QueryBuilder()) : selectQuery;\n\n\t\tif (\n\t\t\t!is(select, SQL)\n\t\t\t&& !haveSameKeys(this.table[Columns], select._.selectedFields)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t'Insert select error: selected fields are not the same or are in a different order compared to the table definition',\n\t\t\t);\n\t\t}\n\n\t\treturn new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true);\n\t}\n}\n\nexport type SQLiteInsertWithout<T extends AnySQLiteInsert, TDynamic extends boolean, K extends keyof T & string> =\n\tTDynamic extends true ? T\n\t\t: Omit<\n\t\t\tSQLiteInsertBase<\n\t\t\t\tT['_']['table'],\n\t\t\t\tT['_']['resultType'],\n\t\t\t\tT['_']['runResult'],\n\t\t\t\tT['_']['returning'],\n\t\t\t\tTDynamic,\n\t\t\t\tT['_']['excludedMethods'] | K\n\t\t\t>,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>;\n\nexport type SQLiteInsertReturning<\n\tT extends AnySQLiteInsert,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = SQLiteInsertWithout<\n\tSQLiteInsertBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteInsertReturningAll<\n\tT extends AnySQLiteInsert,\n\tTDynamic extends boolean,\n> = SQLiteInsertWithout<\n\tSQLiteInsertBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteInsertOnConflictDoUpdateConfig<T extends AnySQLiteInsert> = {\n\ttarget: IndexColumn | IndexColumn[];\n\t/** @deprecated - use either `targetWhere` or `setWhere` */\n\twhere?: SQL;\n\t// TODO: add tests for targetWhere and setWhere\n\ttargetWhere?: SQL;\n\tsetWhere?: SQL;\n\tset: SQLiteUpdateSetSource<T['_']['table']>;\n};\n\nexport type SQLiteInsertDynamic<T extends AnySQLiteInsert> = SQLiteInsert<\n\tT['_']['table'],\n\tT['_']['resultType'],\n\tT['_']['runResult'],\n\tT['_']['returning']\n>;\n\nexport type SQLiteInsertExecute<T extends AnySQLiteInsert> = T['_']['returning'] extends undefined ? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteInsertPrepare<T extends AnySQLiteInsert> = SQLitePreparedQuery<\n\t{\n\t\ttype: T['_']['resultType'];\n\t\trun: T['_']['runResult'];\n\t\tall: T['_']['returning'] extends undefined ? DrizzleTypeError<'.all() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'][];\n\t\tget: T['_']['returning'] extends undefined ? DrizzleTypeError<'.get() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'];\n\t\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t\t: any[][];\n\t\texecute: SQLiteInsertExecute<T>;\n\t}\n>;\n\nexport type AnySQLiteInsert = SQLiteInsertBase<any, any, any, any, any, any>;\n\nexport type SQLiteInsert<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTReturning = any,\n> = SQLiteInsertBase<TTable, TResultType, TRunResult, TReturning, true, never>;\n\nexport interface SQLiteInsertBase<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tSQLWrapper,\n\tQueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>\n{\n\treadonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly table: TTable;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? TRunResult : TReturning[];\n\t};\n}\n\nexport class SQLiteInsertBase<\n\tTTable extends SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n\timplements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteInsert';\n\n\t/** @internal */\n\tconfig: SQLiteInsertConfig<TTable>;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tvalues: SQLiteInsertConfig['values'],\n\t\tprivate session: SQLiteSession<any, any, any, any>,\n\t\tprivate dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t\tselect?: boolean,\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, values: values as any, withList, select };\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the inserted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#insert-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and return all fields\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t *   .values({ brand: 'BMW' })\n\t *   .returning();\n\t *\n\t * // Insert one row and return only the id\n\t * const insertedCarId: { id: number }[] = await db.insert(cars)\n\t *   .values({ brand: 'BMW' })\n\t *   .returning({ id: cars.id });\n\t * ```\n\t */\n\treturning(): SQLiteInsertReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): SQLiteInsertReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.config.table[SQLiteTable.Symbol.Columns],\n\t): SQLiteInsertWithout<AnySQLiteInsert, TDynamic, 'returning'> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `on conflict do nothing` clause to the query.\n\t *\n\t * Calling this method simply avoids inserting a row as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#on-conflict-do-nothing}\n\t *\n\t * @param config The `target` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and cancel the insert if there's a conflict\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onConflictDoNothing();\n\t *\n\t * // Explicitly specify conflict target\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onConflictDoNothing({ target: cars.id });\n\t * ```\n\t */\n\tonConflictDoNothing(config: { target?: IndexColumn | IndexColumn[]; where?: SQL } = {}): this {\n\t\tif (!this.config.onConflict) this.config.onConflict = [];\n\n\t\tif (config.target === undefined) {\n\t\t\tthis.config.onConflict.push(sql` on conflict do nothing`);\n\t\t} else {\n\t\t\tconst targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;\n\t\t\tconst whereSql = config.where ? sql` where ${config.where}` : sql``;\n\t\t\tthis.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds an `on conflict do update` clause to the query.\n\t *\n\t * Calling this method will update the existing row that conflicts with the row proposed for insertion as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#upserts-and-conflicts}\n\t *\n\t * @param config The `target`, `set` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Update the row if there's a conflict\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onConflictDoUpdate({\n\t *     target: cars.id,\n\t *     set: { brand: 'Porsche' }\n\t *   });\n\t *\n\t * // Upsert with 'where' clause\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onConflictDoUpdate({\n\t *     target: cars.id,\n\t *     set: { brand: 'newBMW' },\n\t *     where: sql`${cars.createdAt} > '2023-01-01'::date`,\n\t *   });\n\t * ```\n\t */\n\tonConflictDoUpdate(config: SQLiteInsertOnConflictDoUpdateConfig<this>): this {\n\t\tif (config.where && (config.targetWhere || config.setWhere)) {\n\t\t\tthrow new Error(\n\t\t\t\t'You cannot use both \"where\" and \"targetWhere\"/\"setWhere\" at the same time - \"where\" is deprecated, use \"targetWhere\" or \"setWhere\" instead.',\n\t\t\t);\n\t\t}\n\n\t\tif (!this.config.onConflict) this.config.onConflict = [];\n\n\t\tconst whereSql = config.where ? sql` where ${config.where}` : undefined;\n\t\tconst targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;\n\t\tconst setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;\n\t\tconst targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;\n\t\tconst setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));\n\t\tthis.config.onConflict.push(\n\t\t\tsql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`,\n\t\t);\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildInsertQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteInsertPrepare<this> {\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\ttrue,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\ttype: 'insert',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t},\n\t\t) as SQLiteInsertPrepare<this>;\n\t}\n\n\tprepare(): SQLiteInsertPrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\toverride async execute(): Promise<SQLiteInsertExecute<this>> {\n\t\treturn (this.config.returning ? this.all() : this.run()) as SQLiteInsertExecute<this>;\n\t}\n\n\t$dynamic(): SQLiteInsertDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/query-builders/query-builder.ts",
    "content": "import { entityKind, is } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport type { SQLiteDialectConfig } from '~/sqlite-core/dialect.ts';\nimport { SQLiteDialect, SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport type { WithBuilder } from '~/sqlite-core/subquery.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport { SQLiteSelectBuilder } from './select.ts';\nimport type { SelectedFields } from './select.types.ts';\n\nexport class QueryBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteQueryBuilder';\n\n\tprivate dialect: SQLiteDialect | undefined;\n\tprivate dialectConfig: SQLiteDialectConfig | undefined;\n\n\tconstructor(dialect?: SQLiteDialect | SQLiteDialectConfig) {\n\t\tthis.dialect = is(dialect, SQLiteDialect) ? dialect : undefined;\n\t\tthis.dialectConfig = is(dialect, SQLiteDialect) ? undefined : dialect;\n\t}\n\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst queryBuilder = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(queryBuilder);\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t) as any;\n\t\t};\n\t\treturn { as };\n\t};\n\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\tfunction select(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\tfunction selectDistinct(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\treturn { select, selectDistinct };\n\t}\n\n\tselect(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\treturn new SQLiteSelectBuilder({ fields: fields ?? undefined, session: undefined, dialect: this.getDialect() });\n\t}\n\n\tselectDistinct(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\treturn new SQLiteSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t// Lazy load dialect to avoid circular dependency\n\tprivate getDialect() {\n\t\tif (!this.dialect) {\n\t\t\tthis.dialect = new SQLiteSyncDialect(this.dialectConfig);\n\t\t}\n\n\t\treturn this.dialect;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/query-builders/query.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport {\n\ttype BuildQueryResult,\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tmapRelationalRow,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Query, QueryWithTypings, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { KnownKeysOnly } from '~/utils.ts';\nimport type { SQLiteDialect } from '../dialect.ts';\nimport type { PreparedQueryConfig, SQLitePreparedQuery, SQLiteSession } from '../session.ts';\nimport type { SQLiteTable } from '../table.ts';\n\nexport type SQLiteRelationalQueryKind<TMode extends 'sync' | 'async', TResult> = TMode extends 'async'\n\t? SQLiteRelationalQuery<TMode, TResult>\n\t: SQLiteSyncRelationalQuery<TResult>;\n\nexport class RelationalQueryBuilder<\n\tTMode extends 'sync' | 'async',\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n\tTFields extends TableRelationalConfig,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteAsyncRelationalQueryBuilder';\n\n\tconstructor(\n\t\tprotected mode: TMode,\n\t\tprotected fullSchema: Record<string, unknown>,\n\t\tprotected schema: TSchema,\n\t\tprotected tableNamesMap: Record<string, string>,\n\t\tprotected table: SQLiteTable,\n\t\tprotected tableConfig: TableRelationalConfig,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprotected session: SQLiteSession<'async', unknown, TFullSchema, TSchema>,\n\t) {}\n\n\tfindMany<TConfig extends DBQueryConfig<'many', true, TSchema, TFields>>(\n\t\tconfig?: KnownKeysOnly<TConfig, DBQueryConfig<'many', true, TSchema, TFields>>,\n\t): SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TConfig>[]> {\n\t\treturn (this.mode === 'sync'\n\t\t\t? new SQLiteSyncRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? (config as DBQueryConfig<'many', true>) : {},\n\t\t\t\t'many',\n\t\t\t)\n\t\t\t: new SQLiteRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? (config as DBQueryConfig<'many', true>) : {},\n\t\t\t\t'many',\n\t\t\t)) as SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TConfig>[]>;\n\t}\n\n\tfindFirst<TSelection extends Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>(\n\t\tconfig?: KnownKeysOnly<TSelection, Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>,\n\t): SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TSelection> | undefined> {\n\t\treturn (this.mode === 'sync'\n\t\t\t? new SQLiteSyncRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? { ...(config as DBQueryConfig<'many', true> | undefined), limit: 1 } : { limit: 1 },\n\t\t\t\t'first',\n\t\t\t)\n\t\t\t: new SQLiteRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? { ...(config as DBQueryConfig<'many', true> | undefined), limit: 1 } : { limit: 1 },\n\t\t\t\t'first',\n\t\t\t)) as SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TSelection> | undefined>;\n\t}\n}\n\nexport class SQLiteRelationalQuery<TType extends 'sync' | 'async', TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncRelationalQuery';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly type: TType;\n\t\treadonly result: TResult;\n\t};\n\n\t/** @internal */\n\tmode: 'many' | 'first';\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: TablesRelationalConfig,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\t/** @internal */\n\t\tpublic table: SQLiteTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: SQLiteDialect,\n\t\tprivate session: SQLiteSession<'sync' | 'async', unknown, Record<string, unknown>, TablesRelationalConfig>,\n\t\tprivate config: DBQueryConfig<'many', true> | true,\n\t\tmode: 'many' | 'first',\n\t) {\n\t\tsuper();\n\t\tthis.mode = mode;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildRelationalQuery({\n\t\t\tfullSchema: this.fullSchema,\n\t\t\tschema: this.schema,\n\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t}).sql as SQL;\n\t}\n\n\t/** @internal */\n\t_prepare(\n\t\tisOneTimeQuery = false,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }> {\n\t\tconst { query, builtQuery } = this._toSQL();\n\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tbuiltQuery,\n\t\t\tundefined,\n\t\t\tthis.mode === 'first' ? 'get' : 'all',\n\t\t\ttrue,\n\t\t\t(rawRows, mapColumnValue) => {\n\t\t\t\tconst rows = rawRows.map((row) =>\n\t\t\t\t\tmapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue)\n\t\t\t\t);\n\t\t\t\tif (this.mode === 'first') {\n\t\t\t\t\treturn rows[0] as TResult;\n\t\t\t\t}\n\t\t\t\treturn rows as TResult;\n\t\t\t},\n\t\t) as SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }>;\n\t}\n\n\tprepare(): SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }> {\n\t\treturn this._prepare(false);\n\t}\n\n\tprivate _toSQL(): { query: BuildRelationalQueryResult; builtQuery: QueryWithTypings } {\n\t\tconst query = this.dialect.buildRelationalQuery({\n\t\t\tfullSchema: this.fullSchema,\n\t\t\tschema: this.schema,\n\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t});\n\n\t\tconst builtQuery = this.dialect.sqlToQuery(query.sql as SQL);\n\n\t\treturn { query, builtQuery };\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this._toSQL().builtQuery;\n\t}\n\n\t/** @internal */\n\texecuteRaw(): TResult {\n\t\tif (this.mode === 'first') {\n\t\t\treturn this._prepare(false).get() as TResult;\n\t\t}\n\t\treturn this._prepare(false).all() as TResult;\n\t}\n\n\toverride async execute(): Promise<TResult> {\n\t\treturn this.executeRaw();\n\t}\n}\n\nexport class SQLiteSyncRelationalQuery<TResult> extends SQLiteRelationalQuery<'sync', TResult> {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncRelationalQuery';\n\n\tsync(): TResult {\n\t\treturn this.executeRaw();\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/query-builders/raw.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect } from '../dialect.ts';\n\ntype SQLiteRawAction = 'all' | 'get' | 'values' | 'run';\nexport interface SQLiteRawConfig {\n\taction: SQLiteRawAction;\n}\n\nexport interface SQLiteRaw<TResult> extends QueryPromise<TResult>, RunnableQuery<TResult, 'sqlite'>, SQLWrapper {}\n\nexport class SQLiteRaw<TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'sqlite'>, SQLWrapper, PreparedQuery\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteRaw';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly result: TResult;\n\t};\n\n\t/** @internal */\n\tconfig: SQLiteRawConfig;\n\n\tconstructor(\n\t\tpublic execute: () => Promise<TResult>,\n\t\t/** @internal */\n\t\tpublic getSQL: () => SQL,\n\t\taction: SQLiteRawAction,\n\t\tprivate dialect: SQLiteAsyncDialect,\n\t\tprivate mapBatchResult: (result: unknown) => unknown,\n\t) {\n\t\tsuper();\n\t\tthis.config = { action };\n\t}\n\n\tgetQuery() {\n\t\treturn { ...this.dialect.sqlToQuery(this.getSQL()), method: this.config.action };\n\t}\n\n\tmapResult(result: unknown, isFromBatch?: boolean) {\n\t\treturn isFromBatch ? this.mapBatchResult(result) : result;\n\t}\n\n\t_prepare(): PreparedQuery {\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/query-builders/select.ts",
    "content": "import type { CacheConfig, WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tGetSelectTableSelection,\n\tJoinNullability,\n\tJoinType,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { SQL, View } from '~/sql/sql.ts';\nimport type { ColumnsSelection, Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteColumn } from '~/sqlite-core/columns/index.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLiteSession } from '~/sqlite-core/session.ts';\nimport type { SubqueryWithSelection } from '~/sqlite-core/subquery.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport {\n\tapplyMixins,\n\tgetTableColumns,\n\tgetTableLikeName,\n\thaveSameKeys,\n\torderSelectedFields,\n\ttype ValueOrArray,\n} from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport { SQLiteViewBase } from '../view-base.ts';\nimport type {\n\tAnySQLiteSelect,\n\tCreateSQLiteSelectFromBuilderMode,\n\tGetSQLiteSetOperators,\n\tSelectedFields,\n\tSetOperatorRightSelect,\n\tSQLiteCreateSetOperatorFn,\n\tSQLiteSelectConfig,\n\tSQLiteSelectCrossJoinFn,\n\tSQLiteSelectDynamic,\n\tSQLiteSelectExecute,\n\tSQLiteSelectHKT,\n\tSQLiteSelectHKTBase,\n\tSQLiteSelectJoinFn,\n\tSQLiteSelectPrepare,\n\tSQLiteSelectWithout,\n\tSQLiteSetOperatorExcludedMethods,\n\tSQLiteSetOperatorWithResult,\n} from './select.types.ts';\n\nexport class SQLiteSelectBuilder<\n\tTSelection extends SelectedFields | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTBuilderMode extends 'db' | 'qb' = 'db',\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteSelectBuilder';\n\n\tprivate fields: TSelection;\n\tprivate session: SQLiteSession<any, any, any, any> | undefined;\n\tprivate dialect: SQLiteDialect;\n\tprivate withList: Subquery[] | undefined;\n\tprivate distinct: boolean | undefined;\n\n\tconstructor(\n\t\tconfig: {\n\t\t\tfields: TSelection;\n\t\t\tsession: SQLiteSession<any, any, any, any> | undefined;\n\t\t\tdialect: SQLiteDialect;\n\t\t\twithList?: Subquery[];\n\t\t\tdistinct?: boolean;\n\t\t},\n\t) {\n\t\tthis.fields = config.fields;\n\t\tthis.session = config.session;\n\t\tthis.dialect = config.dialect;\n\t\tthis.withList = config.withList;\n\t\tthis.distinct = config.distinct;\n\t}\n\n\tfrom<TFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL>(\n\t\tsource: TFrom,\n\t): CreateSQLiteSelectFromBuilderMode<\n\t\tTBuilderMode,\n\t\tGetSelectTableName<TFrom>,\n\t\tTResultType,\n\t\tTRunResult,\n\t\tTSelection extends undefined ? GetSelectTableSelection<TFrom> : TSelection,\n\t\tTSelection extends undefined ? 'single' : 'partial'\n\t> {\n\t\tconst isPartialSelect = !!this.fields;\n\n\t\tlet fields: SelectedFields;\n\t\tif (this.fields) {\n\t\t\tfields = this.fields;\n\t\t} else if (is(source, Subquery)) {\n\t\t\t// This is required to use the proxy handler to get the correct field values from the subquery\n\t\t\tfields = Object.fromEntries(\n\t\t\t\tObject.keys(source._.selectedFields).map((\n\t\t\t\t\tkey,\n\t\t\t\t) => [key, source[key as unknown as keyof typeof source] as unknown as SelectedFields[string]]),\n\t\t\t);\n\t\t} else if (is(source, SQLiteViewBase)) {\n\t\t\tfields = source[ViewBaseConfig].selectedFields as SelectedFields;\n\t\t} else if (is(source, SQL)) {\n\t\t\tfields = {};\n\t\t} else {\n\t\t\tfields = getTableColumns<SQLiteTable>(source);\n\t\t}\n\n\t\treturn new SQLiteSelectBase({\n\t\t\ttable: source,\n\t\t\tfields,\n\t\t\tisPartialSelect,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\twithList: this.withList,\n\t\t\tdistinct: this.distinct,\n\t\t}) as any;\n\t}\n}\n\nexport abstract class SQLiteSelectQueryBuilderBase<\n\tTHKT extends SQLiteSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends TypedQueryBuilder<TSelectedFields, TResult> {\n\tstatic override readonly [entityKind]: string = 'SQLiteSelectQueryBuilder';\n\n\toverride readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly hkt: THKT;\n\t\treadonly tableName: TTableName;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t\treadonly config: SQLiteSelectConfig;\n\t};\n\n\t/** @internal */\n\tconfig: SQLiteSelectConfig;\n\tprotected joinsNotNullableMap: Record<string, boolean>;\n\tprivate tableName: string | undefined;\n\tprivate isPartialSelect: boolean;\n\tprotected session: SQLiteSession<any, any, any, any> | undefined;\n\tprotected dialect: SQLiteDialect;\n\tprotected cacheConfig?: WithCacheConfig = undefined;\n\tprotected usedTables: Set<string> = new Set();\n\n\tconstructor(\n\t\t{ table, fields, isPartialSelect, session, dialect, withList, distinct }: {\n\t\t\ttable: SQLiteSelectConfig['table'];\n\t\t\tfields: SQLiteSelectConfig['fields'];\n\t\t\tisPartialSelect: boolean;\n\t\t\tsession: SQLiteSession<any, any, any, any> | undefined;\n\t\t\tdialect: SQLiteDialect;\n\t\t\twithList: Subquery[] | undefined;\n\t\t\tdistinct: boolean | undefined;\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis.config = {\n\t\t\twithList,\n\t\t\ttable,\n\t\t\tfields: { ...fields },\n\t\t\tdistinct,\n\t\t\tsetOperators: [],\n\t\t};\n\t\tthis.isPartialSelect = isPartialSelect;\n\t\tthis.session = session;\n\t\tthis.dialect = dialect;\n\t\tthis._ = {\n\t\t\tselectedFields: fields as TSelectedFields,\n\t\t\tconfig: this.config,\n\t\t} as this['_'];\n\t\tthis.tableName = getTableLikeName(table);\n\t\tthis.joinsNotNullableMap = typeof this.tableName === 'string' ? { [this.tableName]: true } : {};\n\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\t}\n\n\t/** @internal */\n\tgetUsedTables() {\n\t\treturn [...this.usedTables];\n\t}\n\n\tprivate createJoin<TJoinType extends JoinType>(\n\t\tjoinType: TJoinType,\n\t): 'cross' extends TJoinType ? SQLiteSelectCrossJoinFn<this, TDynamic>\n\t\t: SQLiteSelectJoinFn<this, TDynamic, TJoinType>\n\t{\n\t\treturn (\n\t\t\ttable: SQLiteTable | Subquery | SQLiteViewBase | SQL,\n\t\t\ton?: ((aliases: TSelection) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst baseTableName = this.tableName;\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\t// store all tables used in a query\n\t\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins?.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (!this.isPartialSelect) {\n\t\t\t\t// If this is the first join and this is not a partial select and we're not selecting from raw SQL, \"move\" the fields from the main table to the nested object\n\t\t\t\tif (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === 'string') {\n\t\t\t\t\tthis.config.fields = {\n\t\t\t\t\t\t[baseTableName]: this.config.fields,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (typeof tableName === 'string' && !is(table, SQL)) {\n\t\t\t\t\tconst selection = is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t: is(table, View)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields\n\t\t\t\t\t\t: table[Table.Symbol.Columns];\n\t\t\t\t\tthis.config.fields[tableName] = selection;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.fields,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as TSelection,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (!this.config.joins) {\n\t\t\t\tthis.config.joins = [];\n\t\t\t}\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName });\n\n\t\t\tif (typeof tableName === 'string') {\n\t\t\t\tswitch (joinType) {\n\t\t\t\t\tcase 'left': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'right': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'cross':\n\t\t\t\t\tcase 'inner': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'full': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Executes a `left join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet | null; }[] = await db.select()\n\t *   .from(users)\n\t *   .leftJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number | null; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .leftJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tleftJoin = this.createJoin('left');\n\n\t/**\n\t * Executes a `right join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the joined table with the corresponding row from the main table, if a match is found. If no matching row exists, it sets all columns of the main table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#right-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .rightJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .rightJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\trightJoin = this.createJoin('right');\n\n\t/**\n\t * Executes an `inner join` operation, creating a new table by combining rows from two tables that have matching values.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .innerJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .innerJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tinnerJoin = this.createJoin('inner');\n\n\t/**\n\t * Executes a `full join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging rows with matching values and filling in `null` for non-matching columns.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#full-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet | null; }[] = await db.select()\n\t *   .from(users)\n\t *   .fullJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number | null; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .fullJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tfullJoin = this.createJoin('full');\n\n\t/**\n\t * Executes a `cross join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging all rows from each table.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join}\n\t *\n\t * @param table the table to join.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users, each user with every pet\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t *   .from(users)\n\t *   .crossJoin(pets)\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t *   userId: users.id,\n\t *   petId: pets.id,\n\t * })\n\t *   .from(users)\n\t *   .crossJoin(pets)\n\t * ```\n\t */\n\tcrossJoin = this.createJoin('cross');\n\n\tprivate createSetOperator(\n\t\ttype: SetOperator,\n\t\tisAll: boolean,\n\t): <TValue extends SQLiteSetOperatorWithResult<TResult>>(\n\t\trightSelection:\n\t\t\t| ((setOperators: GetSQLiteSetOperators) => SetOperatorRightSelect<TValue, TResult>)\n\t\t\t| SetOperatorRightSelect<TValue, TResult>,\n\t) => SQLiteSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tSQLiteSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\treturn (rightSelection) => {\n\t\t\tconst rightSelect = (typeof rightSelection === 'function'\n\t\t\t\t? rightSelection(getSQLiteSetOperators())\n\t\t\t\t: rightSelection) as TypedQueryBuilder<\n\t\t\t\t\tany,\n\t\t\t\t\tTResult\n\t\t\t\t>;\n\n\t\t\tif (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.setOperators.push({ type, isAll, rightSelect });\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Adds `union` set operator to the query.\n\t *\n\t * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all unique names from customers and users tables\n\t * await db.select({ name: users.name })\n\t *   .from(users)\n\t *   .union(\n\t *     db.select({ name: customers.name }).from(customers)\n\t *   );\n\t * // or\n\t * import { union } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await union(\n\t *   db.select({ name: users.name }).from(users),\n\t *   db.select({ name: customers.name }).from(customers)\n\t * );\n\t * ```\n\t */\n\tunion = this.createSetOperator('union', false);\n\n\t/**\n\t * Adds `union all` set operator to the query.\n\t *\n\t * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all transaction ids from both online and in-store sales\n\t * await db.select({ transaction: onlineSales.transactionId })\n\t *   .from(onlineSales)\n\t *   .unionAll(\n\t *     db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t *   );\n\t * // or\n\t * import { unionAll } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await unionAll(\n\t *   db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n\t *   db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t * );\n\t * ```\n\t */\n\tunionAll = this.createSetOperator('union', true);\n\n\t/**\n\t * Adds `intersect` set operator to the query.\n\t *\n\t * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select course names that are offered in both departments A and B\n\t * await db.select({ courseName: depA.courseName })\n\t *   .from(depA)\n\t *   .intersect(\n\t *     db.select({ courseName: depB.courseName }).from(depB)\n\t *   );\n\t * // or\n\t * import { intersect } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await intersect(\n\t *   db.select({ courseName: depA.courseName }).from(depA),\n\t *   db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\tintersect = this.createSetOperator('intersect', false);\n\n\t/**\n\t * Adds `except` set operator to the query.\n\t *\n\t * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all courses offered in department A but not in department B\n\t * await db.select({ courseName: depA.courseName })\n\t *   .from(depA)\n\t *   .except(\n\t *     db.select({ courseName: depB.courseName }).from(depB)\n\t *   );\n\t * // or\n\t * import { except } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await except(\n\t *   db.select({ courseName: depA.courseName }).from(depA),\n\t *   db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\texcept = this.createSetOperator('except', false);\n\n\t/** @internal */\n\taddSetOperators(setOperators: SQLiteSelectConfig['setOperators']): SQLiteSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tSQLiteSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\tthis.config.setOperators.push(...setOperators);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#filtering}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be selected.\n\t *\n\t * ```ts\n\t * // Select all cars with green color\n\t * await db.select().from(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.select().from(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Select all BMW cars with a green color\n\t * await db.select().from(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Select all cars with the green or blue color\n\t * await db.select().from(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(\n\t\twhere: ((aliases: TSelection) => SQL | undefined) | SQL | undefined,\n\t): SQLiteSelectWithout<this, TDynamic, 'where'> {\n\t\tif (typeof where === 'function') {\n\t\t\twhere = where(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `having` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition. It is typically used with aggregate functions to filter the aggregated data based on a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @param having the `having` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all brands with more than one car\n\t * await db.select({\n\t * \tbrand: cars.brand,\n\t * \tcount: sql<number>`cast(count(${cars.id}) as int)`,\n\t * })\n\t *   .from(cars)\n\t *   .groupBy(cars.brand)\n\t *   .having(({ count }) => gt(count, 1));\n\t * ```\n\t */\n\thaving(\n\t\thaving: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): SQLiteSelectWithout<this, TDynamic, 'having'> {\n\t\tif (typeof having === 'function') {\n\t\t\thaving = having(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.having = having;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `group by` clause to the query.\n\t *\n\t * Calling this method will group rows that have the same values into summary rows, often used for aggregation purposes.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Group and count people by their last names\n\t * await db.select({\n\t *    lastName: people.lastName,\n\t *    count: sql<number>`cast(count(*) as int)`\n\t * })\n\t *   .from(people)\n\t *   .groupBy(people.lastName);\n\t * ```\n\t */\n\tgroupBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(...columns: (SQLiteColumn | SQL)[]): SQLiteSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteSelectWithout<this, TDynamic, 'groupBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst groupBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t\tthis.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];\n\t\t} else {\n\t\t\tthis.config.groupBy = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `order by` clause to the query.\n\t *\n\t * Calling this method will sort the result-set in ascending or descending order. By default, the sort order is ascending.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#order-by}\n\t *\n\t * @example\n\t *\n\t * ```\n\t * // Select cars ordered by year\n\t * await db.select().from(cars).orderBy(cars.year);\n\t * ```\n\t *\n\t * You can specify whether results are in ascending or descending order with the `asc()` and `desc()` operators.\n\t *\n\t * ```ts\n\t * // Select cars ordered by year in descending order\n\t * await db.select().from(cars).orderBy(desc(cars.year));\n\t *\n\t * // Select cars ordered by year and price\n\t * await db.select().from(cars).orderBy(asc(cars.year), desc(cars.price));\n\t * ```\n\t */\n\torderBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SQLiteColumn | SQL)[]): SQLiteSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteSelectWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `limit` clause to the query.\n\t *\n\t * Calling this method will set the maximum number of rows that will be returned by this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param limit the `limit` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the first 10 people from this query.\n\t * await db.select().from(people).limit(10);\n\t * ```\n\t */\n\tlimit(limit: number | Placeholder): SQLiteSelectWithout<this, TDynamic, 'limit'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.limit = limit;\n\t\t} else {\n\t\t\tthis.config.limit = limit;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `offset` clause to the query.\n\t *\n\t * Calling this method will skip a number of rows when returning results from this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param offset the `offset` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the 10th-20th people from this query.\n\t * await db.select().from(people).offset(10).limit(10);\n\t * ```\n\t */\n\toffset(offset: number | Placeholder): SQLiteSelectWithout<this, TDynamic, 'offset'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.offset = offset;\n\t\t} else {\n\t\t\tthis.config.offset = offset;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildSelectQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\tas<TAlias extends string>(\n\t\talias: TAlias,\n\t): SubqueryWithSelection<this['_']['selectedFields'], TAlias> {\n\t\tconst usedTables: string[] = [];\n\t\tusedTables.push(...extractUsedTable(this.config.table));\n\t\tif (this.config.joins) { for (const it of this.config.joins) usedTables.push(...extractUsedTable(it.table)); }\n\n\t\treturn new Proxy(\n\t\t\tnew Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]),\n\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as SubqueryWithSelection<this['_']['selectedFields'], TAlias>;\n\t}\n\n\t/** @internal */\n\toverride getSelectedFields(): this['_']['selectedFields'] {\n\t\treturn new Proxy(\n\t\t\tthis.config.fields,\n\t\t\tnew SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): SQLiteSelectDynamic<this> {\n\t\treturn this;\n\t}\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface SQLiteSelectBase<\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode = 'single',\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends\n\tSQLiteSelectQueryBuilderBase<\n\t\tSQLiteSelectHKT,\n\t\tTTableName,\n\t\tTResultType,\n\t\tTRunResult,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tQueryPromise<TResult>\n{}\n\nexport class SQLiteSelectBase<\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection,\n\tTSelectMode extends SelectMode = 'single',\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends SQLiteSelectQueryBuilderBase<\n\tSQLiteSelectHKT,\n\tTTableName,\n\tTResultType,\n\tTRunResult,\n\tTSelection,\n\tTSelectMode,\n\tTNullabilityMap,\n\tTDynamic,\n\tTExcludedMethods,\n\tTResult,\n\tTSelectedFields\n> implements RunnableQuery<TResult, 'sqlite'>, SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'SQLiteSelect';\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteSelectPrepare<this> {\n\t\tif (!this.session) {\n\t\t\tthrow new Error('Cannot execute a query on a query builder. Please use a database instance instead.');\n\t\t}\n\t\tconst fieldsList = orderSelectedFields<SQLiteColumn>(this.config.fields);\n\t\tconst query = this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tfieldsList,\n\t\t\t'all',\n\t\t\ttrue,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\ttype: 'select',\n\t\t\t\ttables: [...this.usedTables],\n\t\t\t},\n\t\t\tthis.cacheConfig,\n\t\t);\n\t\tquery.joinsNotNullableMap = this.joinsNotNullableMap;\n\t\treturn query as ReturnType<this['prepare']>;\n\t}\n\n\t$withCache(config?: { config?: CacheConfig; tag?: string; autoInvalidate?: boolean } | false) {\n\t\tthis.cacheConfig = config === undefined\n\t\t\t? { config: {}, enable: true, autoInvalidate: true }\n\t\t\t: config === false\n\t\t\t? { enable: false }\n\t\t\t: { enable: true, autoInvalidate: true, ...config };\n\t\treturn this;\n\t}\n\n\tprepare(): SQLiteSelectPrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\tasync execute(): Promise<SQLiteSelectExecute<this>> {\n\t\treturn this.all() as SQLiteSelectExecute<this>;\n\t}\n}\n\napplyMixins(SQLiteSelectBase, [QueryPromise]);\n\nfunction createSetOperator(type: SetOperator, isAll: boolean): SQLiteCreateSetOperatorFn {\n\treturn (leftSelect, rightSelect, ...restSelects) => {\n\t\tconst setOperators = [rightSelect, ...restSelects].map((select) => ({\n\t\t\ttype,\n\t\t\tisAll,\n\t\t\trightSelect: select as AnySQLiteSelect,\n\t\t}));\n\n\t\tfor (const setOperator of setOperators) {\n\t\t\tif (!haveSameKeys((leftSelect as any).getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn (leftSelect as AnySQLiteSelect).addSetOperators(setOperators) as any;\n\t};\n}\n\nconst getSQLiteSetOperators = () => ({\n\tunion,\n\tunionAll,\n\tintersect,\n\texcept,\n});\n\n/**\n * Adds `union` set operator to the query.\n *\n * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n *\n * @example\n *\n * ```ts\n * // Select all unique names from customers and users tables\n * import { union } from 'drizzle-orm/sqlite-core'\n *\n * await union(\n *   db.select({ name: users.name }).from(users),\n *   db.select({ name: customers.name }).from(customers)\n * );\n * // or\n * await db.select({ name: users.name })\n *   .from(users)\n *   .union(\n *     db.select({ name: customers.name }).from(customers)\n *   );\n * ```\n */\nexport const union = createSetOperator('union', false);\n\n/**\n * Adds `union all` set operator to the query.\n *\n * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n *\n * @example\n *\n * ```ts\n * // Select all transaction ids from both online and in-store sales\n * import { unionAll } from 'drizzle-orm/sqlite-core'\n *\n * await unionAll(\n *   db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n *   db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * // or\n * await db.select({ transaction: onlineSales.transactionId })\n *   .from(onlineSales)\n *   .unionAll(\n *     db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n *   );\n * ```\n */\nexport const unionAll = createSetOperator('union', true);\n\n/**\n * Adds `intersect` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n *\n * @example\n *\n * ```ts\n * // Select course names that are offered in both departments A and B\n * import { intersect } from 'drizzle-orm/sqlite-core'\n *\n * await intersect(\n *   db.select({ courseName: depA.courseName }).from(depA),\n *   db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n *   .from(depA)\n *   .intersect(\n *     db.select({ courseName: depB.courseName }).from(depB)\n *   );\n * ```\n */\nexport const intersect = createSetOperator('intersect', false);\n\n/**\n * Adds `except` set operator to the query.\n *\n * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n *\n * @example\n *\n * ```ts\n * // Select all courses offered in department A but not in department B\n * import { except } from 'drizzle-orm/sqlite-core'\n *\n * await except(\n *   db.select({ courseName: depA.courseName }).from(depA),\n *   db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n *   .from(depA)\n *   .except(\n *     db.select({ courseName: depB.courseName }).from(depB)\n *   );\n * ```\n */\nexport const except = createSetOperator('except', false);\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/query-builders/select.types.ts",
    "content": "import type { ColumnsSelection, Placeholder, SQL, View } from '~/sql/sql.ts';\nimport type { SQLiteColumn } from '~/sqlite-core/columns/index.ts';\nimport type { SQLiteTable, SQLiteTableWithColumns } from '~/sqlite-core/table.ts';\nimport type { Assume, ValidateShape } from '~/utils.ts';\n\nimport type {\n\tSelectedFields as SelectFieldsBase,\n\tSelectedFieldsFlat as SelectFieldsFlatBase,\n\tSelectedFieldsOrdered as SelectFieldsOrderedBase,\n} from '~/operations.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tAppendToNullabilityMap,\n\tAppendToResult,\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tJoinNullability,\n\tJoinType,\n\tMapColumnsToTableAlias,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport type { Table, UpdateTableConfig } from '~/table.ts';\nimport type { SQLitePreparedQuery } from '../session.ts';\nimport type { SQLiteViewBase } from '../view-base.ts';\nimport type { SQLiteViewWithSelection } from '../view.ts';\nimport type { SQLiteSelectBase, SQLiteSelectQueryBuilderBase } from './select.ts';\n\nexport interface SQLiteSelectJoinConfig {\n\ton: SQL | undefined;\n\ttable: SQLiteTable | Subquery | SQLiteViewBase | SQL;\n\talias: string | undefined;\n\tjoinType: JoinType;\n}\n\nexport type BuildAliasTable<TTable extends SQLiteTable | View, TAlias extends string> = TTable extends Table\n\t? SQLiteTableWithColumns<\n\t\tUpdateTableConfig<TTable['_']['config'], {\n\t\t\tname: TAlias;\n\t\t\tcolumns: MapColumnsToTableAlias<TTable['_']['columns'], TAlias, 'sqlite'>;\n\t\t}>\n\t>\n\t: TTable extends View ? SQLiteViewWithSelection<\n\t\t\tTAlias,\n\t\t\tTTable['_']['existing'],\n\t\t\tMapColumnsToTableAlias<TTable['_']['selectedFields'], TAlias, 'sqlite'>\n\t\t>\n\t: never;\n\nexport interface SQLiteSelectConfig {\n\twithList?: Subquery[];\n\tfields: Record<string, unknown>;\n\tfieldsFlat?: SelectedFieldsOrdered;\n\twhere?: SQL;\n\thaving?: SQL;\n\ttable: SQLiteTable | Subquery | SQLiteViewBase | SQL;\n\tlimit?: number | Placeholder;\n\toffset?: number | Placeholder;\n\tjoins?: SQLiteSelectJoinConfig[];\n\torderBy?: (SQLiteColumn | SQL | SQL.Aliased)[];\n\tgroupBy?: (SQLiteColumn | SQL | SQL.Aliased)[];\n\tdistinct?: boolean;\n\tsetOperators: {\n\t\trightSelect: TypedQueryBuilder<any, any>;\n\t\ttype: SetOperator;\n\t\tisAll: boolean;\n\t\torderBy?: (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\tlimit?: number | Placeholder;\n\t\toffset?: number | Placeholder;\n\t}[];\n}\n\nexport type SQLiteSelectJoin<\n\tT extends AnySQLiteSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n\tTJoinedTable extends SQLiteTable | Subquery | SQLiteViewBase | SQL,\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n> = T extends any ? SQLiteSelectWithout<\n\t\tSQLiteSelectKind<\n\t\t\tT['_']['hkt'],\n\t\t\tT['_']['tableName'],\n\t\t\tT['_']['resultType'],\n\t\t\tT['_']['runResult'],\n\t\t\tAppendToResult<\n\t\t\t\tT['_']['tableName'],\n\t\t\t\tT['_']['selection'],\n\t\t\t\tTJoinedName,\n\t\t\t\tTJoinedTable extends SQLiteTable ? TJoinedTable['_']['columns']\n\t\t\t\t\t: TJoinedTable extends Subquery | View ? Assume<TJoinedTable['_']['selectedFields'], SelectedFields>\n\t\t\t\t\t: never,\n\t\t\t\tT['_']['selectMode']\n\t\t\t>,\n\t\t\tT['_']['selectMode'] extends 'partial' ? T['_']['selectMode'] : 'multiple',\n\t\t\tAppendToNullabilityMap<T['_']['nullabilityMap'], TJoinedName, TJoinType>,\n\t\t\tT['_']['dynamic'],\n\t\t\tT['_']['excludedMethods']\n\t\t>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>\n\t: never;\n\nexport type SQLiteSelectJoinFn<\n\tT extends AnySQLiteSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n> = <\n\tTJoinedTable extends SQLiteTable | Subquery | SQLiteViewBase | SQL,\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n>(\n\ttable: TJoinedTable,\n\ton: ((aliases: T['_']['selection']) => SQL | undefined) | SQL | undefined,\n) => SQLiteSelectJoin<T, TDynamic, TJoinType, TJoinedTable, TJoinedName>;\n\nexport type SQLiteSelectCrossJoinFn<\n\tT extends AnySQLiteSelectQueryBuilder,\n\tTDynamic extends boolean,\n> = <\n\tTJoinedTable extends SQLiteTable | Subquery | SQLiteViewBase | SQL,\n\tTJoinedName extends GetSelectTableName<TJoinedTable> = GetSelectTableName<TJoinedTable>,\n>(table: TJoinedTable) => SQLiteSelectJoin<T, TDynamic, 'cross', TJoinedTable, TJoinedName>;\n\nexport type SelectedFieldsFlat = SelectFieldsFlatBase<SQLiteColumn>;\n\nexport type SelectedFields = SelectFieldsBase<SQLiteColumn, SQLiteTable>;\n\nexport type SelectedFieldsOrdered = SelectFieldsOrderedBase<SQLiteColumn>;\n\nexport interface SQLiteSelectHKTBase {\n\ttableName: string | undefined;\n\tresultType: 'sync' | 'async';\n\trunResult: unknown;\n\tselection: unknown;\n\tselectMode: SelectMode;\n\tnullabilityMap: unknown;\n\tdynamic: boolean;\n\texcludedMethods: string;\n\tresult: unknown;\n\tselectedFields: unknown;\n\t_type: unknown;\n}\n\nexport type SQLiteSelectKind<\n\tT extends SQLiteSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability>,\n\tTDynamic extends boolean,\n\tTExcludedMethods extends string,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> = (T & {\n\ttableName: TTableName;\n\tresultType: TResultType;\n\trunResult: TRunResult;\n\tselection: TSelection;\n\tselectMode: TSelectMode;\n\tnullabilityMap: TNullabilityMap;\n\tdynamic: TDynamic;\n\texcludedMethods: TExcludedMethods;\n\tresult: TResult;\n\tselectedFields: TSelectedFields;\n})['_type'];\n\nexport interface SQLiteSelectQueryBuilderHKT extends SQLiteSelectHKTBase {\n\t_type: SQLiteSelectQueryBuilderBase<\n\t\tSQLiteSelectQueryBuilderHKT,\n\t\tthis['tableName'],\n\t\tthis['resultType'],\n\t\tthis['runResult'],\n\t\tAssume<this['selection'], ColumnsSelection>,\n\t\tthis['selectMode'],\n\t\tAssume<this['nullabilityMap'], Record<string, JoinNullability>>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods'],\n\t\tAssume<this['result'], any[]>,\n\t\tAssume<this['selectedFields'], ColumnsSelection>\n\t>;\n}\n\nexport interface SQLiteSelectHKT extends SQLiteSelectHKTBase {\n\t_type: SQLiteSelectBase<\n\t\tthis['tableName'],\n\t\tthis['resultType'],\n\t\tthis['runResult'],\n\t\tAssume<this['selection'], ColumnsSelection>,\n\t\tthis['selectMode'],\n\t\tAssume<this['nullabilityMap'], Record<string, JoinNullability>>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods'],\n\t\tAssume<this['result'], any[]>,\n\t\tAssume<this['selectedFields'], ColumnsSelection>\n\t>;\n}\n\nexport type SQLiteSetOperatorExcludedMethods =\n\t| 'config'\n\t| 'leftJoin'\n\t| 'rightJoin'\n\t| 'innerJoin'\n\t| 'fullJoin'\n\t| 'where'\n\t| 'having'\n\t| 'groupBy';\n\nexport type CreateSQLiteSelectFromBuilderMode<\n\tTBuilderMode extends 'db' | 'qb',\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n> = TBuilderMode extends 'db' ? SQLiteSelectBase<\n\t\tTTableName,\n\t\tTResultType,\n\t\tTRunResult,\n\t\tTSelection,\n\t\tTSelectMode\n\t>\n\t: SQLiteSelectQueryBuilderBase<\n\t\tSQLiteSelectQueryBuilderHKT,\n\t\tTTableName,\n\t\tTResultType,\n\t\tTRunResult,\n\t\tTSelection,\n\t\tTSelectMode\n\t>;\n\nexport type SQLiteSelectWithout<\n\tT extends AnySQLiteSelectQueryBuilder,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n\tTResetExcluded extends boolean = false,\n> = TDynamic extends true ? T : Omit<\n\tSQLiteSelectKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['tableName'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['selection'],\n\t\tT['_']['selectMode'],\n\t\tT['_']['nullabilityMap'],\n\t\tTDynamic,\n\t\tTResetExcluded extends true ? K : T['_']['excludedMethods'] | K,\n\t\tT['_']['result'],\n\t\tT['_']['selectedFields']\n\t>,\n\tTResetExcluded extends true ? K : T['_']['excludedMethods'] | K\n>;\n\nexport type SQLiteSelectExecute<T extends AnySQLiteSelect> = T['_']['result'];\n\nexport type SQLiteSelectPrepare<T extends AnySQLiteSelect> = SQLitePreparedQuery<\n\t{\n\t\ttype: T['_']['resultType'];\n\t\trun: T['_']['runResult'];\n\t\tall: T['_']['result'];\n\t\tget: T['_']['result'][number] | undefined;\n\t\tvalues: any[][];\n\t\texecute: SQLiteSelectExecute<T>;\n\t}\n>;\n\nexport type SQLiteSelectDynamic<T extends AnySQLiteSelectQueryBuilder> = SQLiteSelectKind<\n\tT['_']['hkt'],\n\tT['_']['tableName'],\n\tT['_']['resultType'],\n\tT['_']['runResult'],\n\tT['_']['selection'],\n\tT['_']['selectMode'],\n\tT['_']['nullabilityMap'],\n\ttrue,\n\tnever,\n\tT['_']['result'],\n\tT['_']['selectedFields']\n>;\n\nexport type SQLiteSelectQueryBuilder<\n\tTHKT extends SQLiteSelectHKTBase = SQLiteSelectQueryBuilderHKT,\n\tTTableName extends string | undefined = string | undefined,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n\tTResult extends any[] = unknown[],\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> = SQLiteSelectQueryBuilderBase<\n\tTHKT,\n\tTTableName,\n\tTResultType,\n\tTRunResult,\n\tTSelection,\n\tTSelectMode,\n\tTNullabilityMap,\n\ttrue,\n\tnever,\n\tTResult,\n\tTSelectedFields\n>;\n\nexport type AnySQLiteSelectQueryBuilder = SQLiteSelectQueryBuilderBase<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany\n>;\n\nexport type AnySQLiteSetOperatorInterface = SQLiteSetOperatorInterface<any, any, any, any, any, any, any, any, any>;\n\nexport interface SQLiteSetOperatorInterface<\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode = 'single',\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> {\n\t_: {\n\t\treadonly hkt: SQLiteSelectHKTBase;\n\t\treadonly tableName: TTableName;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t};\n}\n\nexport type SQLiteSetOperatorWithResult<TResult extends any[]> = SQLiteSetOperatorInterface<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tTResult,\n\tany\n>;\n\nexport type SQLiteSelect<\n\tTTableName extends string | undefined = string | undefined,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTSelection extends ColumnsSelection = Record<string, any>,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n> = SQLiteSelectBase<TTableName, TResultType, TRunResult, TSelection, TSelectMode, TNullabilityMap, true, never>;\n\nexport type AnySQLiteSelect = SQLiteSelectBase<any, any, any, any, any, any, any, any, any, any>;\n\nexport type SQLiteSetOperator<\n\tTTableName extends string | undefined = string | undefined,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTSelection extends ColumnsSelection = Record<string, any>,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n> = SQLiteSelectBase<\n\tTTableName,\n\tTResultType,\n\tTRunResult,\n\tTSelection,\n\tTSelectMode,\n\tTNullabilityMap,\n\ttrue,\n\tSQLiteSetOperatorExcludedMethods\n>;\n\nexport type SetOperatorRightSelect<\n\tTValue extends SQLiteSetOperatorWithResult<TResult>,\n\tTResult extends any[],\n> = TValue extends SQLiteSetOperatorInterface<any, any, any, any, any, any, any, any, infer TValueResult, any>\n\t? ValidateShape<\n\t\tTValueResult[number],\n\t\tTResult[number],\n\t\tTypedQueryBuilder<any, TValueResult>\n\t>\n\t: TValue;\n\nexport type SetOperatorRestSelect<\n\tTValue extends readonly SQLiteSetOperatorWithResult<TResult>[],\n\tTResult extends any[],\n> = TValue extends [infer First, ...infer Rest]\n\t? First extends SQLiteSetOperatorInterface<any, any, any, any, any, any, any, any, infer TValueResult, any>\n\t\t? Rest extends AnySQLiteSetOperatorInterface[] ? [\n\t\t\t\tValidateShape<TValueResult[number], TResult[number], TypedQueryBuilder<any, TValueResult>>,\n\t\t\t\t...SetOperatorRestSelect<Rest, TResult>,\n\t\t\t]\n\t\t: ValidateShape<TValueResult[number], TResult[number], TypedQueryBuilder<any, TValueResult>[]>\n\t: never\n\t: TValue;\n\nexport type SQLiteCreateSetOperatorFn = <\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection extends ColumnsSelection,\n\tTValue extends SQLiteSetOperatorWithResult<TResult>,\n\tTRest extends SQLiteSetOperatorWithResult<TResult>[],\n\tTSelectMode extends SelectMode = 'single',\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n>(\n\tleftSelect: SQLiteSetOperatorInterface<\n\t\tTTableName,\n\t\tTResultType,\n\t\tTRunResult,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\trightSelect: SetOperatorRightSelect<TValue, TResult>,\n\t...restSelects: SetOperatorRestSelect<TRest, TResult>\n) => SQLiteSelectWithout<\n\tSQLiteSelectBase<\n\t\tTTableName,\n\t\tTResultType,\n\t\tTRunResult,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tfalse,\n\tSQLiteSetOperatorExcludedMethods,\n\ttrue\n>;\n\nexport type GetSQLiteSetOperators = {\n\tunion: SQLiteCreateSetOperatorFn;\n\tintersect: SQLiteCreateSetOperatorFn;\n\texcept: SQLiteCreateSetOperatorFn;\n\tunionAll: SQLiteCreateSetOperatorFn;\n};\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/query-builders/update.ts",
    "content": "import type { GetColumnData } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { JoinType, SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { Placeholder, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport {\n\ttype DrizzleTypeError,\n\tgetTableLikeName,\n\tmapUpdateSet,\n\torderSelectedFields,\n\ttype UpdateSet,\n\ttype ValueOrArray,\n} from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { SQLiteColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport { SQLiteViewBase } from '../view-base.ts';\nimport type { SelectedFields, SelectedFieldsOrdered, SQLiteSelectJoinConfig } from './select.types.ts';\n\nexport interface SQLiteUpdateConfig {\n\twhere?: SQL | undefined;\n\tlimit?: number | Placeholder;\n\torderBy?: (SQLiteColumn | SQL | SQL.Aliased)[];\n\tset: UpdateSet;\n\ttable: SQLiteTable;\n\tfrom?: SQLiteTable | Subquery | SQLiteViewBase | SQL;\n\tjoins: SQLiteSelectJoinConfig[];\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type SQLiteUpdateSetSource<TTable extends SQLiteTable> =\n\t& {\n\t\t[Key in keyof TTable['$inferInsert']]?:\n\t\t\t| GetColumnData<TTable['_']['columns'][Key], 'query'>\n\t\t\t| SQL\n\t\t\t| SQLiteColumn\n\t\t\t| undefined;\n\t}\n\t& {};\n\nexport class SQLiteUpdateBuilder<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteUpdateBuilder';\n\n\tdeclare readonly _: {\n\t\treadonly table: TTable;\n\t};\n\n\tconstructor(\n\t\tprotected table: TTable,\n\t\tprotected session: SQLiteSession<any, any, any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprivate withList?: Subquery[],\n\t) {}\n\n\tset(\n\t\tvalues: SQLiteUpdateSetSource<TTable>,\n\t): SQLiteUpdateWithout<\n\t\tSQLiteUpdateBase<TTable, TResultType, TRunResult>,\n\t\tfalse,\n\t\t'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'\n\t> {\n\t\treturn new SQLiteUpdateBase(\n\t\t\tthis.table,\n\t\t\tmapUpdateSet(this.table, values),\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t) as any;\n\t}\n}\n\nexport type SQLiteUpdateWithout<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T : Omit<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tT['_']['returning'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods'] | K\n\t>,\n\tT['_']['excludedMethods'] | K\n>;\n\nexport type SQLiteUpdateWithJoins<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL,\n> = TDynamic extends true ? T : Omit<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tTFrom,\n\t\tT['_']['returning'],\n\t\tTDynamic,\n\t\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n\t>,\n\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n>;\n\nexport type SQLiteUpdateReturningAll<T extends AnySQLiteUpdate, TDynamic extends boolean> = SQLiteUpdateWithout<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteUpdateReturning<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFields,\n> = SQLiteUpdateWithout<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteUpdateExecute<T extends AnySQLiteUpdate> = T['_']['returning'] extends undefined ? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteUpdatePrepare<T extends AnySQLiteUpdate> = SQLitePreparedQuery<\n\t{\n\t\ttype: T['_']['resultType'];\n\t\trun: T['_']['runResult'];\n\t\tall: T['_']['returning'] extends undefined ? DrizzleTypeError<'.all() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'][];\n\t\tget: T['_']['returning'] extends undefined ? DrizzleTypeError<'.get() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'];\n\t\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t\t: any[][];\n\t\texecute: SQLiteUpdateExecute<T>;\n\t}\n>;\n\nexport type SQLiteUpdateJoinFn<\n\tT extends AnySQLiteUpdate,\n> = <\n\tTJoinedTable extends SQLiteTable | Subquery | SQLiteViewBase | SQL,\n>(\n\ttable: TJoinedTable,\n\ton:\n\t\t| (\n\t\t\t(\n\t\t\t\tupdateTable: T['_']['table']['_']['columns'],\n\t\t\t\tfrom: T['_']['from'] extends SQLiteTable ? T['_']['from']['_']['columns']\n\t\t\t\t\t: T['_']['from'] extends Subquery | SQLiteViewBase ? T['_']['from']['_']['selectedFields']\n\t\t\t\t\t: never,\n\t\t\t) => SQL | undefined\n\t\t)\n\t\t| SQL\n\t\t| undefined,\n) => T;\n\nexport type SQLiteUpdateDynamic<T extends AnySQLiteUpdate> = SQLiteUpdate<\n\tT['_']['table'],\n\tT['_']['resultType'],\n\tT['_']['runResult'],\n\tT['_']['returning']\n>;\n\nexport type SQLiteUpdate<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = any,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = SQLiteUpdateBase<TTable, TResultType, TRunResult, TFrom, TReturning, true, never>;\n\nexport type AnySQLiteUpdate = SQLiteUpdateBase<any, any, any, any, any, any, any>;\n\nexport interface SQLiteUpdateBase<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends SQLWrapper, QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]> {\n\treadonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly table: TTable;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly from: TFrom;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? TRunResult : TReturning[];\n\t};\n}\n\nexport class SQLiteUpdateBase<\n\tTTable extends SQLiteTable = SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n\timplements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteUpdate';\n\n\t/** @internal */\n\tconfig: SQLiteUpdateConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tset: UpdateSet,\n\t\tprivate session: SQLiteSession<any, any, any, any>,\n\t\tprivate dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { set, table, withList, joins: [] };\n\t}\n\n\tfrom<TFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL>(\n\t\tsource: TFrom,\n\t): SQLiteUpdateWithJoins<this, TDynamic, TFrom> {\n\t\tthis.config.from = source;\n\t\treturn this as any;\n\t}\n\n\tprivate createJoin<TJoinType extends JoinType>(\n\t\tjoinType: TJoinType,\n\t): SQLiteUpdateJoinFn<this> {\n\t\treturn ((\n\t\t\ttable: SQLiteTable | Subquery | SQLiteViewBase | SQL,\n\t\t\ton: ((updateTable: TTable, from: TFrom) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\tconst from = this.config.from\n\t\t\t\t\t? is(table, SQLiteTable)\n\t\t\t\t\t\t? table[Table.Symbol.Columns]\n\t\t\t\t\t\t: is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t: is(table, SQLiteViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields\n\t\t\t\t\t\t: undefined\n\t\t\t\t\t: undefined;\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t\tfrom && new Proxy(\n\t\t\t\t\t\tfrom,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName });\n\n\t\t\treturn this as any;\n\t\t}) as any;\n\t}\n\n\tleftJoin = this.createJoin('left');\n\n\trightJoin = this.createJoin('right');\n\n\tinnerJoin = this.createJoin('inner');\n\n\tfullJoin = this.createJoin('full');\n\n\t/**\n\t * Adds a 'where' clause to the query.\n\t *\n\t * Calling this method will update only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param where the 'where' clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be updated.\n\t *\n\t * ```ts\n\t * // Update all cars with green color\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'));\n\t * // or\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Update all BMW cars with a green color\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Update all cars with the green or blue color\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): SQLiteUpdateWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\torderBy(\n\t\tbuilder: (updateTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SQLiteColumn | SQL | SQL.Aliased)[]): SQLiteUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(updateTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteUpdateWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as any,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\tlimit(limit: number | Placeholder): SQLiteUpdateWithout<this, TDynamic, 'limit'> {\n\t\tthis.config.limit = limit;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the updated rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update#update-with-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Update all cars with the green color and return all fields\n\t * const updatedCars: Car[] = await db.update(cars)\n\t *   .set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning();\n\t *\n\t * // Update all cars with the green color and return only their id and brand fields\n\t * const updatedCarsIdsAndBrands: { id: number, brand: string }[] = await db.update(cars)\n\t *   .set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): SQLiteUpdateReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFields>(\n\t\tfields: TSelectedFields,\n\t): SQLiteUpdateReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFields = this.config.table[SQLiteTable.Symbol.Columns],\n\t): SQLiteUpdateWithout<AnySQLiteUpdate, TDynamic, 'returning'> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildUpdateQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteUpdatePrepare<this> {\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\ttrue,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\ttype: 'insert',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t},\n\t\t) as SQLiteUpdatePrepare<this>;\n\t}\n\n\tprepare(): SQLiteUpdatePrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\toverride async execute(): Promise<SQLiteUpdateExecute<this>> {\n\t\treturn (this.config.returning ? this.all() : this.run()) as SQLiteUpdateExecute<this>;\n\t}\n\n\t$dynamic(): SQLiteUpdateDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/session.ts",
    "content": "import { type Cache, hashQuery, NoopCache } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError, DrizzleQueryError, TransactionRollbackError } from '~/errors.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { TablesRelationalConfig } from '~/relations.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect, SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport { BaseSQLiteDatabase } from './db.ts';\nimport type { SQLiteRaw } from './query-builders/raw.ts';\nimport type { SelectedFieldsOrdered } from './query-builders/select.types.ts';\n\nexport interface PreparedQueryConfig {\n\ttype: 'sync' | 'async';\n\trun: unknown;\n\tall: unknown;\n\tget: unknown;\n\tvalues: unknown;\n\texecute: unknown;\n}\n\nexport class ExecuteResultSync<T> extends QueryPromise<T> {\n\tstatic override readonly [entityKind]: string = 'ExecuteResultSync';\n\n\tconstructor(private resultCb: () => T) {\n\t\tsuper();\n\t}\n\n\toverride async execute(): Promise<T> {\n\t\treturn this.resultCb();\n\t}\n\n\tsync(): T {\n\t\treturn this.resultCb();\n\t}\n}\n\nexport type ExecuteResult<TType extends 'sync' | 'async', TResult> = TType extends 'async' ? Promise<TResult>\n\t: ExecuteResultSync<TResult>;\n\nexport abstract class SQLitePreparedQuery<T extends PreparedQueryConfig> implements PreparedQuery {\n\tstatic readonly [entityKind]: string = 'PreparedQuery';\n\n\t/** @internal */\n\tjoinsNotNullableMap?: Record<string, boolean>;\n\n\tconstructor(\n\t\tprivate mode: 'sync' | 'async',\n\t\tprivate executeMethod: SQLiteExecuteMethod,\n\t\tprotected query: Query,\n\t\tprivate cache?: Cache,\n\t\t// per query related metadata\n\t\tprivate queryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\t// config that was passed through $withCache\n\t\tprivate cacheConfig?: WithCacheConfig,\n\t) {\n\t\t// it means that no $withCache options were passed and it should be just enabled\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enable: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enable) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\t}\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tif (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any mutations, if globally is false\n\t\tif (this.cacheConfig && !this.cacheConfig.enable) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// For mutate queries, we should query the database, wait for a response, and then perform invalidation\n\t\tif (\n\t\t\t(\n\t\t\t\tthis.queryMetadata.type === 'insert' || this.queryMetadata.type === 'update'\n\t\t\t\t|| this.queryMetadata.type === 'delete'\n\t\t\t) && this.queryMetadata.tables.length > 0\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst [res] = await Promise.all([\n\t\t\t\t\tquery(),\n\t\t\t\t\tthis.cache.onMutate({ tables: this.queryMetadata.tables }),\n\t\t\t\t]);\n\t\t\t\treturn res;\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any reads if globally disabled\n\t\tif (!this.cacheConfig) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.queryMetadata.type === 'select') {\n\t\t\tconst fromCache = await this.cache.get(\n\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\tthis.queryMetadata.tables,\n\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\tthis.cacheConfig.autoInvalidate,\n\t\t\t);\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tlet result;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await query();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t\t}\n\n\t\t\t\t// put actual key\n\t\t\t\tawait this.cache.put(\n\t\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tthis.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [],\n\t\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\t\tthis.cacheConfig.config,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\t\ttry {\n\t\t\treturn await query();\n\t\t} catch (e) {\n\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t}\n\t}\n\n\tgetQuery(): Query {\n\t\treturn this.query;\n\t}\n\n\tabstract run(placeholderValues?: Record<string, unknown>): Result<T['type'], T['run']>;\n\n\tmapRunResult(result: unknown, _isFromBatch?: boolean): unknown {\n\t\treturn result;\n\t}\n\n\tabstract all(placeholderValues?: Record<string, unknown>): Result<T['type'], T['all']>;\n\n\tmapAllResult(_result: unknown, _isFromBatch?: boolean): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tabstract get(placeholderValues?: Record<string, unknown>): Result<T['type'], T['get']>;\n\n\tmapGetResult(_result: unknown, _isFromBatch?: boolean): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tabstract values(placeholderValues?: Record<string, unknown>): Result<T['type'], T['values']>;\n\n\texecute(placeholderValues?: Record<string, unknown>): ExecuteResult<T['type'], T['execute']> {\n\t\tif (this.mode === 'async') {\n\t\t\treturn this[this.executeMethod](placeholderValues) as ExecuteResult<T['type'], T['execute']>;\n\t\t}\n\t\treturn new ExecuteResultSync(() => this[this.executeMethod](placeholderValues));\n\t}\n\n\tmapResult(response: unknown, isFromBatch?: boolean) {\n\t\tswitch (this.executeMethod) {\n\t\t\tcase 'run': {\n\t\t\t\treturn this.mapRunResult(response, isFromBatch);\n\t\t\t}\n\t\t\tcase 'all': {\n\t\t\t\treturn this.mapAllResult(response, isFromBatch);\n\t\t\t}\n\t\t\tcase 'get': {\n\t\t\t\treturn this.mapGetResult(response, isFromBatch);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @internal */\n\tabstract isResponseInArrayMode(): boolean;\n}\n\nexport interface SQLiteTransactionConfig {\n\tbehavior?: 'deferred' | 'immediate' | 'exclusive';\n}\n\nexport type SQLiteExecuteMethod = 'run' | 'all' | 'get';\n\nexport abstract class SQLiteSession<\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteSession';\n\n\tconstructor(\n\t\t/** @internal */\n\t\treadonly dialect: { sync: SQLiteSyncDialect; async: SQLiteAsyncDialect }[TResultKind],\n\t) {}\n\n\tabstract prepareQuery(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => unknown,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TResultKind }>;\n\n\tprepareOneTimeQuery(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => unknown,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TResultKind }> {\n\t\treturn this.prepareQuery(\n\t\t\tquery,\n\t\t\tfields,\n\t\t\texecuteMethod,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t);\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: SQLiteTransaction<TResultKind, TRunResult, TFullSchema, TSchema>) => Result<TResultKind, T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Result<TResultKind, T>;\n\n\trun(query: SQL): Result<TResultKind, TRunResult> {\n\t\tconst staticQuery = this.dialect.sqlToQuery(query);\n\t\ttry {\n\t\t\treturn this.prepareOneTimeQuery(staticQuery, undefined, 'run', false).run() as Result<TResultKind, TRunResult>;\n\t\t} catch (err) {\n\t\t\tthrow new DrizzleError({ cause: err, message: `Failed to run the query '${staticQuery.sql}'` });\n\t\t}\n\t}\n\n\t/** @internal */\n\textractRawRunValueFromBatchResult(result: unknown) {\n\t\treturn result;\n\t}\n\n\tall<T = unknown>(query: SQL): Result<TResultKind, T[]> {\n\t\treturn this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, 'run', false).all() as Result<\n\t\t\tTResultKind,\n\t\t\tT[]\n\t\t>;\n\t}\n\n\t/** @internal */\n\textractRawAllValueFromBatchResult(_result: unknown): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tget<T = unknown>(query: SQL): Result<TResultKind, T> {\n\t\treturn this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, 'run', false).get() as Result<\n\t\t\tTResultKind,\n\t\t\tT\n\t\t>;\n\t}\n\n\t/** @internal */\n\textractRawGetValueFromBatchResult(_result: unknown): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tvalues<T extends any[] = unknown[]>(\n\t\tquery: SQL,\n\t): Result<TResultKind, T[]> {\n\t\treturn this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, 'run', false).values() as Result<\n\t\t\tTResultKind,\n\t\t\tT[]\n\t\t>;\n\t}\n\n\tasync count(sql: SQL) {\n\t\tconst result = await this.values(sql) as [[number]];\n\n\t\treturn result[0][0];\n\t}\n\n\t/** @internal */\n\textractRawValuesValueFromBatchResult(_result: unknown): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n}\n\nexport type Result<TKind extends 'sync' | 'async', TResult> = { sync: TResult; async: Promise<TResult> }[TKind];\n\nexport type DBResult<TKind extends 'sync' | 'async', TResult> = { sync: TResult; async: SQLiteRaw<TResult> }[TKind];\n\nexport abstract class SQLiteTransaction<\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends BaseSQLiteDatabase<TResultType, TRunResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTransaction';\n\n\tconstructor(\n\t\tresultType: TResultType,\n\t\tdialect: { sync: SQLiteSyncDialect; async: SQLiteAsyncDialect }[TResultType],\n\t\tsession: SQLiteSession<TResultType, TRunResult, TFullSchema, TSchema>,\n\t\tprotected schema: {\n\t\t\tfullSchema: Record<string, unknown>;\n\t\t\tschema: TSchema;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t} | undefined,\n\t\tprotected readonly nestedIndex = 0,\n\t) {\n\t\tsuper(resultType, dialect, session, schema);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/subquery.ts",
    "content": "import type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { AddAliasToSelection } from '~/query-builders/select.types.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport type { Subquery, WithSubquery, WithSubqueryWithoutSelection } from '~/subquery.ts';\nimport type { QueryBuilder } from './query-builders/query-builder.ts';\n\nexport type SubqueryWithSelection<TSelection extends ColumnsSelection, TAlias extends string> =\n\t& Subquery<TAlias, AddAliasToSelection<TSelection, TAlias, 'sqlite'>>\n\t& AddAliasToSelection<TSelection, TAlias, 'sqlite'>;\n\nexport type WithSubqueryWithSelection<TSelection extends ColumnsSelection, TAlias extends string> =\n\t& WithSubquery<TAlias, AddAliasToSelection<TSelection, TAlias, 'sqlite'>>\n\t& AddAliasToSelection<TSelection, TAlias, 'sqlite'>;\n\nexport interface WithBuilder {\n\t<TAlias extends string>(alias: TAlias): {\n\t\tas: {\n\t\t\t<TSelection extends ColumnsSelection>(\n\t\t\t\tqb: TypedQueryBuilder<TSelection> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelection>),\n\t\t\t): WithSubqueryWithSelection<TSelection, TAlias>;\n\t\t\t(\n\t\t\t\tqb: TypedQueryBuilder<undefined> | ((qb: QueryBuilder) => TypedQueryBuilder<undefined>),\n\t\t\t): WithSubqueryWithoutSelection<TAlias>;\n\t\t};\n\t};\n\t<TAlias extends string, TSelection extends ColumnsSelection>(alias: TAlias, selection: TSelection): {\n\t\tas: (qb: SQL | ((qb: QueryBuilder) => SQL)) => WithSubqueryWithSelection<TSelection, TAlias>;\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/table.ts",
    "content": "import type { BuildColumns, BuildExtraConfigColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport { getSQLiteColumnBuilders, type SQLiteColumnBuilders } from './columns/all.ts';\nimport type { SQLiteColumn, SQLiteColumnBuilder, SQLiteColumnBuilderBase } from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { IndexBuilder } from './indexes.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type SQLiteTableExtraConfigValue =\n\t| IndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder;\n\nexport type SQLiteTableExtraConfig = Record<\n\tstring,\n\tSQLiteTableExtraConfigValue\n>;\n\nexport type TableConfig = TableConfigBase<SQLiteColumn<any>>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:SQLiteInlineForeignKeys');\n\nexport class SQLiteTable<T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTable';\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t});\n\n\t/** @internal */\n\toverride [Table.Symbol.Columns]!: NonNullable<T['columns']>;\n\n\t/** @internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]:\n\t\t| ((self: Record<string, SQLiteColumn>) => SQLiteTableExtraConfig)\n\t\t| undefined = undefined;\n}\n\nexport type AnySQLiteTable<TPartial extends Partial<TableConfig> = {}> = SQLiteTable<\n\tUpdateTableConfig<TableConfig, TPartial>\n>;\n\nexport type SQLiteTableWithColumns<T extends TableConfig> =\n\t& SQLiteTable<T>\n\t& {\n\t\t[Key in keyof T['columns']]: T['columns'][Key];\n\t};\n\nexport interface SQLiteTableFn<TSchema extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: BuildColumns<TTableName, TColumnsMap, 'sqlite'>,\n\t\t) => SQLiteTableExtraConfigValue[],\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: SQLiteColumnBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'sqlite'>) => SQLiteTableExtraConfigValue[],\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n\t/**\n\t * @deprecated The third parameter of sqliteTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'sqlite'>) => SQLiteTableExtraConfig,\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n\n\t/**\n\t * @deprecated The third parameter of sqliteTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: SQLiteColumnBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'sqlite'>) => SQLiteTableExtraConfig,\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n}\n\nfunction sqliteTableBase<\n\tTTableName extends string,\n\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\tTSchema extends string | undefined,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap | ((columnTypes: SQLiteColumnBuilders) => TColumnsMap),\n\textraConfig:\n\t\t| ((\n\t\t\tself: BuildColumns<TTableName, TColumnsMap, 'sqlite'>,\n\t\t) => SQLiteTableExtraConfig | SQLiteTableExtraConfigValue[])\n\t\t| undefined,\n\tschema?: TSchema,\n\tbaseName = name,\n): SQLiteTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchema;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\tdialect: 'sqlite';\n}> {\n\tconst rawTable = new SQLiteTable<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>(name, schema, baseName);\n\n\tconst parsedColumns: TColumnsMap = typeof columns === 'function' ? columns(getSQLiteColumnBuilders()) : columns;\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as SQLiteColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumns as unknown as BuildExtraConfigColumns<\n\t\tTTableName,\n\t\tTColumnsMap,\n\t\t'sqlite'\n\t>;\n\n\tif (extraConfig) {\n\t\ttable[SQLiteTable.Symbol.ExtraConfigBuilder] = extraConfig as (\n\t\t\tself: Record<string, SQLiteColumn>,\n\t\t) => SQLiteTableExtraConfig;\n\t}\n\n\treturn table;\n}\n\nexport const sqliteTable: SQLiteTableFn = (name, columns, extraConfig) => {\n\treturn sqliteTableBase(name, columns, extraConfig);\n};\n\nexport function sqliteTableCreator(customizeTableName: (name: string) => string): SQLiteTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn sqliteTableBase(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/unique-constraint.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { SQLiteColumn } from './columns/common.ts';\nimport type { SQLiteTable } from './table.ts';\n\nexport function uniqueKeyName(table: SQLiteTable, columns: string[]) {\n\treturn `${table[TableName]}_${columns.join('_')}_unique`;\n}\n\nexport function unique(name?: string): UniqueOnConstraintBuilder {\n\treturn new UniqueOnConstraintBuilder(name);\n}\n\nexport class UniqueConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteUniqueConstraintBuilder';\n\n\t/** @internal */\n\tcolumns: SQLiteColumn[];\n\n\tconstructor(\n\t\tcolumns: SQLiteColumn[],\n\t\tprivate name?: string,\n\t) {\n\t\tthis.columns = columns;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): UniqueConstraint {\n\t\treturn new UniqueConstraint(table, this.columns, this.name);\n\t}\n}\n\nexport class UniqueOnConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteUniqueOnConstraintBuilder';\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tname?: string,\n\t) {\n\t\tthis.name = name;\n\t}\n\n\ton(...columns: [SQLiteColumn, ...SQLiteColumn[]]) {\n\t\treturn new UniqueConstraintBuilder(columns, this.name);\n\t}\n}\n\nexport class UniqueConstraint {\n\tstatic readonly [entityKind]: string = 'SQLiteUniqueConstraint';\n\n\treadonly columns: SQLiteColumn[];\n\treadonly name?: string;\n\n\tconstructor(readonly table: SQLiteTable, columns: SQLiteColumn[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n\t}\n\n\tgetName() {\n\t\treturn this.name;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/utils.ts",
    "content": "import { is } from '~/entity.ts';\nimport { SQL } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { Check } from './checks.ts';\nimport { CheckBuilder } from './checks.ts';\nimport type { ForeignKey } from './foreign-keys.ts';\nimport { ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { Index } from './indexes.ts';\nimport { IndexBuilder } from './indexes.ts';\nimport type { PrimaryKey } from './primary-keys.ts';\nimport { PrimaryKeyBuilder } from './primary-keys.ts';\nimport { SQLiteTable } from './table.ts';\nimport { type UniqueConstraint, UniqueConstraintBuilder } from './unique-constraint.ts';\nimport type { SQLiteViewBase } from './view-base.ts';\nimport type { SQLiteView } from './view.ts';\n\nexport function getTableConfig<TTable extends SQLiteTable>(table: TTable) {\n\tconst columns = Object.values(table[SQLiteTable.Symbol.Columns]);\n\tconst indexes: Index[] = [];\n\tconst checks: Check[] = [];\n\tconst primaryKeys: PrimaryKey[] = [];\n\tconst uniqueConstraints: UniqueConstraint[] = [];\n\tconst foreignKeys: ForeignKey[] = Object.values(table[SQLiteTable.Symbol.InlineForeignKeys]);\n\tconst name = table[Table.Symbol.Name];\n\n\tconst extraConfigBuilder = table[SQLiteTable.Symbol.ExtraConfigBuilder];\n\n\tif (extraConfigBuilder !== undefined) {\n\t\tconst extraConfig = extraConfigBuilder(table[SQLiteTable.Symbol.Columns]);\n\t\tconst extraValues = Array.isArray(extraConfig) ? extraConfig.flat(1) as any[] : Object.values(extraConfig);\n\t\tfor (const builder of Object.values(extraValues)) {\n\t\t\tif (is(builder, IndexBuilder)) {\n\t\t\t\tindexes.push(builder.build(table));\n\t\t\t} else if (is(builder, CheckBuilder)) {\n\t\t\t\tchecks.push(builder.build(table));\n\t\t\t} else if (is(builder, UniqueConstraintBuilder)) {\n\t\t\t\tuniqueConstraints.push(builder.build(table));\n\t\t\t} else if (is(builder, PrimaryKeyBuilder)) {\n\t\t\t\tprimaryKeys.push(builder.build(table));\n\t\t\t} else if (is(builder, ForeignKeyBuilder)) {\n\t\t\t\tforeignKeys.push(builder.build(table));\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tcolumns,\n\t\tindexes,\n\t\tforeignKeys,\n\t\tchecks,\n\t\tprimaryKeys,\n\t\tuniqueConstraints,\n\t\tname,\n\t};\n}\n\nexport function extractUsedTable(table: SQLiteTable | Subquery | SQLiteViewBase | SQL): string[] {\n\tif (is(table, SQLiteTable)) {\n\t\treturn [`${table[Table.Symbol.BaseName]}`];\n\t}\n\tif (is(table, Subquery)) {\n\t\treturn table._.usedTables ?? [];\n\t}\n\tif (is(table, SQL)) {\n\t\treturn table.usedTables ?? [];\n\t}\n\treturn [];\n}\n\nexport type OnConflict = 'rollback' | 'abort' | 'fail' | 'ignore' | 'replace';\n\nexport function getViewConfig<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n>(view: SQLiteView<TName, TExisting>) {\n\treturn {\n\t\t...view[ViewBaseConfig],\n\t\t// ...view[SQLiteViewConfig],\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/view-base.ts",
    "content": "import { entityKind } from '~/entity.ts';\nimport type { ColumnsSelection } from '~/sql/sql.ts';\nimport { View } from '~/sql/sql.ts';\n\nexport abstract class SQLiteViewBase<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> extends View<TName, TExisting, TSelection> {\n\tstatic override readonly [entityKind]: string = 'SQLiteViewBase';\n\n\tdeclare _: View<TName, TExisting, TSelection>['_'] & {\n\t\tviewBrand: 'SQLiteView';\n\t};\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/view-common.ts",
    "content": "export const SQLiteViewConfig = Symbol.for('drizzle:SQLiteViewConfig');\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-core/view.ts",
    "content": "import type { BuildColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { AddAliasToSelection } from '~/query-builders/select.types.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport { getTableColumns } from '~/utils.ts';\nimport type { SQLiteColumn, SQLiteColumnBuilderBase } from './columns/common.ts';\nimport { QueryBuilder } from './query-builders/query-builder.ts';\nimport { sqliteTable } from './table.ts';\nimport { SQLiteViewBase } from './view-base.ts';\n\nexport interface ViewBuilderConfig {\n\talgorithm?: 'undefined' | 'merge' | 'temptable';\n\tdefiner?: string;\n\tsqlSecurity?: 'definer' | 'invoker';\n\twithCheckOption?: 'cascaded' | 'local';\n}\n\nexport class ViewBuilderCore<\n\tTConfig extends { name: string; columns?: unknown },\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteViewBuilderCore';\n\n\tdeclare readonly _: {\n\t\treadonly name: TConfig['name'];\n\t\treadonly columns: TConfig['columns'];\n\t};\n\n\tconstructor(\n\t\tprotected name: TConfig['name'],\n\t) {}\n\n\tprotected config: ViewBuilderConfig = {};\n}\n\nexport class ViewBuilder<TName extends string = string> extends ViewBuilderCore<{ name: TName }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteViewBuilder';\n\n\tas<TSelection extends ColumnsSelection>(\n\t\tqb: TypedQueryBuilder<TSelection> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelection>),\n\t): SQLiteViewWithSelection<TName, false, AddAliasToSelection<TSelection, TName, 'sqlite'>> {\n\t\tif (typeof qb === 'function') {\n\t\t\tqb = qb(new QueryBuilder());\n\t\t}\n\t\tconst selectionProxy = new SelectionProxyHandler<TSelection>({\n\t\t\talias: this.name,\n\t\t\tsqlBehavior: 'error',\n\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\treplaceOriginalName: true,\n\t\t});\n\t\t// const aliasedSelectedFields = new Proxy(qb.getSelectedFields(), selectionProxy);\n\t\tconst aliasedSelectedFields = qb.getSelectedFields();\n\t\treturn new Proxy(\n\t\t\tnew SQLiteView({\n\t\t\t\t// sqliteConfig: this.config,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: undefined,\n\t\t\t\t\tselectedFields: aliasedSelectedFields,\n\t\t\t\t\tquery: qb.getSQL().inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tselectionProxy as any,\n\t\t) as SQLiteViewWithSelection<TName, false, AddAliasToSelection<TSelection, TName, 'sqlite'>>;\n\t}\n}\n\nexport class ManualViewBuilder<\n\tTName extends string = string,\n\tTColumns extends Record<string, SQLiteColumnBuilderBase> = Record<string, SQLiteColumnBuilderBase>,\n> extends ViewBuilderCore<\n\t{ name: TName; columns: TColumns }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteManualViewBuilder';\n\n\tprivate columns: Record<string, SQLiteColumn>;\n\n\tconstructor(\n\t\tname: TName,\n\t\tcolumns: TColumns,\n\t) {\n\t\tsuper(name);\n\t\tthis.columns = getTableColumns(sqliteTable(name, columns)) as BuildColumns<TName, TColumns, 'sqlite'>;\n\t}\n\n\texisting(): SQLiteViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'sqlite'>> {\n\t\treturn new Proxy(\n\t\t\tnew SQLiteView({\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: undefined,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: undefined,\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as SQLiteViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'sqlite'>>;\n\t}\n\n\tas(query: SQL): SQLiteViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'sqlite'>> {\n\t\treturn new Proxy(\n\t\t\tnew SQLiteView({\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: undefined,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: query.inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as SQLiteViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'sqlite'>>;\n\t}\n}\n\nexport class SQLiteView<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> extends SQLiteViewBase<TName, TExisting, TSelection> {\n\tstatic override readonly [entityKind]: string = 'SQLiteView';\n\n\tconstructor({ config }: {\n\t\tconfig: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t};\n\t}) {\n\t\tsuper(config);\n\t}\n}\n\nexport type SQLiteViewWithSelection<\n\tTName extends string,\n\tTExisting extends boolean,\n\tTSelection extends ColumnsSelection,\n> = SQLiteView<TName, TExisting, TSelection> & TSelection;\n\nexport function sqliteView<TName extends string>(name: TName): ViewBuilder<TName>;\nexport function sqliteView<TName extends string, TColumns extends Record<string, SQLiteColumnBuilderBase>>(\n\tname: TName,\n\tcolumns: TColumns,\n): ManualViewBuilder<TName, TColumns>;\nexport function sqliteView(\n\tname: string,\n\tselection?: Record<string, SQLiteColumnBuilderBase>,\n): ViewBuilder | ManualViewBuilder {\n\tif (selection) {\n\t\treturn new ManualViewBuilder(name, selection);\n\t}\n\treturn new ViewBuilder(name);\n}\n\nexport const view = sqliteView;\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-proxy/driver.ts",
    "content": "import type { BatchItem, BatchResponse } from '~/batch.ts';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { createTableRelationsHelpers, extractTablesRelationalConfig } from '~/relations.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { BaseSQLiteDatabase } from '~/sqlite-core/db.ts';\nimport { SQLiteAsyncDialect } from '~/sqlite-core/dialect.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport { SQLiteRemoteSession } from './session.ts';\n\nexport interface SqliteRemoteResult<T = unknown> {\n\trows?: T[];\n}\n\nexport class SqliteRemoteDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends BaseSQLiteDatabase<'async', SqliteRemoteResult, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SqliteRemoteDatabase';\n\n\t/** @internal */\n\tdeclare readonly session: SQLiteRemoteSession<TSchema, ExtractTablesWithRelations<TSchema>>;\n\n\tasync batch<U extends BatchItem<'sqlite'>, T extends Readonly<[U, ...U[]]>>(\n\t\tbatch: T,\n\t): Promise<BatchResponse<T>> {\n\t\treturn this.session.batch(batch) as Promise<BatchResponse<T>>;\n\t}\n}\n\nexport type AsyncRemoteCallback = (\n\tsql: string,\n\tparams: any[],\n\tmethod: 'run' | 'all' | 'values' | 'get',\n) => Promise<{ rows: any[] }>;\n\nexport type AsyncBatchRemoteCallback = (batch: {\n\tsql: string;\n\tparams: any[];\n\tmethod: 'run' | 'all' | 'values' | 'get';\n}[]) => Promise<{ rows: any[] }[]>;\n\nexport type RemoteCallback = AsyncRemoteCallback;\n\nexport function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tcallback: RemoteCallback,\n\tconfig?: DrizzleConfig<TSchema>,\n): SqliteRemoteDatabase<TSchema>;\nexport function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tcallback: RemoteCallback,\n\tbatchCallback?: AsyncBatchRemoteCallback,\n\tconfig?: DrizzleConfig<TSchema>,\n): SqliteRemoteDatabase<TSchema>;\nexport function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tcallback: RemoteCallback,\n\tbatchCallback?: AsyncBatchRemoteCallback | DrizzleConfig<TSchema>,\n\tconfig?: DrizzleConfig<TSchema>,\n): SqliteRemoteDatabase<TSchema> {\n\tconst dialect = new SQLiteAsyncDialect({ casing: config?.casing });\n\tlet logger;\n\tlet cache;\n\tlet _batchCallback: AsyncBatchRemoteCallback | undefined;\n\tlet _config: DrizzleConfig<TSchema> = {};\n\n\tif (batchCallback) {\n\t\tif (typeof batchCallback === 'function') {\n\t\t\t_batchCallback = batchCallback as AsyncBatchRemoteCallback;\n\t\t\t_config = config ?? {};\n\t\t} else {\n\t\t\t_batchCallback = undefined;\n\t\t\t_config = batchCallback as DrizzleConfig<TSchema>;\n\t\t}\n\n\t\tif (_config.logger === true) {\n\t\t\tlogger = new DefaultLogger();\n\t\t} else if (_config.logger !== false) {\n\t\t\tlogger = _config.logger;\n\t\t\tcache = _config.cache;\n\t\t}\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (_config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\t_config.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: _config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new SQLiteRemoteSession(callback, dialect, schema, _batchCallback, { logger, cache });\n\tconst db = new SqliteRemoteDatabase('async', dialect, session, schema) as SqliteRemoteDatabase<TSchema>;\n\t(<any> db).$cache = cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = cache?.onMutate;\n\t}\n\treturn db;\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-proxy/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-proxy/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { SqliteRemoteDatabase } from './driver.ts';\n\nexport type ProxyMigrator = (migrationQueries: string[]) => Promise<void>;\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: SqliteRemoteDatabase<TSchema>,\n\tcallback: ProxyMigrator,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\n\tconst migrationsTable = typeof config === 'string'\n\t\t? '__drizzle_migrations'\n\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\n\tconst migrationTableCreate = sql`\n\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\tid SERIAL PRIMARY KEY,\n\t\t\thash text NOT NULL,\n\t\t\tcreated_at numeric\n\t\t)\n\t`;\n\n\tawait db.run(migrationTableCreate);\n\n\tconst dbMigrations = await db.values<[number, string, string]>(\n\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t);\n\n\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\n\tconst queriesToRun: string[] = [];\n\tfor (const migration of migrations) {\n\t\tif (\n\t\t\t!lastDbMigration\n\t\t\t|| Number(lastDbMigration[2])! < migration.folderMillis\n\t\t) {\n\t\t\tqueriesToRun.push(\n\t\t\t\t...migration.sql,\n\t\t\t\t`INSERT INTO \\`${migrationsTable}\\` (\"hash\", \"created_at\") VALUES('${migration.hash}', '${migration.folderMillis}')`,\n\t\t\t);\n\t\t}\n\t}\n\n\tawait callback(queriesToRun);\n}\n"
  },
  {
    "path": "drizzle-orm/src/sqlite-proxy/session.ts",
    "content": "import type { BatchItem } from '~/batch.ts';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport { fillPlaceholders, type Query, sql } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect } from '~/sqlite-core/dialect.ts';\nimport { SQLiteTransaction } from '~/sqlite-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts';\nimport type {\n\tPreparedQueryConfig as PreparedQueryConfigBase,\n\tSQLiteExecuteMethod,\n\tSQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { mapResultRow } from '~/utils.ts';\nimport type { AsyncBatchRemoteCallback, AsyncRemoteCallback, RemoteCallback, SqliteRemoteResult } from './driver.ts';\n\nexport interface SQLiteRemoteSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport type PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\n\nexport class SQLiteRemoteSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteSession<'async', SqliteRemoteResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLiteRemoteSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: RemoteCallback,\n\t\tdialect: SQLiteAsyncDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate batchCLient?: AsyncBatchRemoteCallback,\n\t\toptions: SQLiteRemoteSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => unknown,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): RemotePreparedQuery<T> {\n\t\treturn new RemotePreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\texecuteMethod,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\tasync batch<T extends BatchItem<'sqlite'>[] | readonly BatchItem<'sqlite'>[]>(queries: T) {\n\t\tconst preparedQueries: PreparedQuery[] = [];\n\t\tconst builtQueries: { sql: string; params: any[]; method: 'run' | 'all' | 'values' | 'get' }[] = [];\n\n\t\tfor (const query of queries) {\n\t\t\tconst preparedQuery = query._prepare();\n\t\t\tconst builtQuery = (preparedQuery as RemotePreparedQuery).getQuery();\n\t\t\tpreparedQueries.push(preparedQuery);\n\t\t\tbuiltQueries.push({ sql: builtQuery.sql, params: builtQuery.params, method: builtQuery.method });\n\t\t}\n\n\t\tconst batchResults = await (this.batchCLient as AsyncBatchRemoteCallback)(builtQueries);\n\t\treturn batchResults.map((result, i) => preparedQueries[i]!.mapResult(result, true));\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: SQLiteProxyTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Promise<T> {\n\t\tconst tx = new SQLiteProxyTransaction('async', this.dialect, this, this.schema);\n\t\tawait this.run(sql.raw(`begin${config?.behavior ? ' ' + config.behavior : ''}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait this.run(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait this.run(sql`rollback`);\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\toverride extractRawAllValueFromBatchResult(result: unknown): unknown {\n\t\treturn (result as SqliteRemoteResult).rows;\n\t}\n\n\toverride extractRawGetValueFromBatchResult(result: unknown): unknown {\n\t\treturn (result as SqliteRemoteResult).rows![0];\n\t}\n\n\toverride extractRawValuesValueFromBatchResult(result: unknown): unknown {\n\t\treturn (result as SqliteRemoteResult).rows;\n\t}\n}\n\nexport class SQLiteProxyTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteTransaction<'async', SqliteRemoteResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLiteProxyTransaction';\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: SQLiteProxyTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex}`;\n\t\tconst tx = new SQLiteProxyTransaction('async', this.dialect, this.session, this.schema, this.nestedIndex + 1);\n\t\tawait this.session.run(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait this.session.run(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait this.session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class RemotePreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends SQLitePreparedQuery<\n\t{ type: 'async'; run: SqliteRemoteResult; all: T['all']; get: T['get']; values: T['values']; execute: T['execute'] }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteProxyPreparedQuery';\n\n\tprivate method: SQLiteExecuteMethod;\n\n\tconstructor(\n\t\tprivate client: RemoteCallback,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\t/** @internal */ public customResultMapper?: (\n\t\t\trows: unknown[][],\n\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t) => unknown,\n\t) {\n\t\tsuper('async', executeMethod, query, cache, queryMetadata, cacheConfig);\n\t\tthis.customResultMapper = customResultMapper;\n\t\tthis.method = executeMethod;\n\t}\n\n\toverride getQuery(): Query & { method: SQLiteExecuteMethod } {\n\t\treturn { ...this.query, method: this.method };\n\t}\n\n\tasync run(placeholderValues?: Record<string, unknown>): Promise<SqliteRemoteResult> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn await this.queryWithCache(this.query.sql, params, async () => {\n\t\t\treturn await (this.client as AsyncRemoteCallback)(this.query.sql, params, 'run');\n\t\t});\n\t}\n\n\toverride mapAllResult(rows: unknown, isFromBatch?: boolean): unknown {\n\t\tif (isFromBatch) {\n\t\t\trows = (rows as SqliteRemoteResult).rows;\n\t\t}\n\n\t\tif (!this.fields && !this.customResultMapper) {\n\t\t\treturn rows;\n\t\t}\n\n\t\tif (this.customResultMapper) {\n\t\t\treturn this.customResultMapper(rows as unknown[][]) as T['all'];\n\t\t}\n\n\t\treturn (rows as unknown[][]).map((row) => {\n\t\t\treturn mapResultRow(\n\t\t\t\tthis.fields!,\n\t\t\t\trow,\n\t\t\t\tthis.joinsNotNullableMap,\n\t\t\t);\n\t\t});\n\t}\n\n\tasync all(placeholderValues?: Record<string, unknown>): Promise<T['all']> {\n\t\tconst { query, logger, client } = this;\n\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\tlogger.logQuery(query.sql, params);\n\n\t\tconst { rows } = await this.queryWithCache(query.sql, params, async () => {\n\t\t\treturn await (client as AsyncRemoteCallback)(query.sql, params, 'all');\n\t\t});\n\t\treturn this.mapAllResult(rows);\n\t}\n\n\tasync get(placeholderValues?: Record<string, unknown>): Promise<T['get']> {\n\t\tconst { query, logger, client } = this;\n\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\tlogger.logQuery(query.sql, params);\n\n\t\tconst clientResult = await this.queryWithCache(query.sql, params, async () => {\n\t\t\treturn await (client as AsyncRemoteCallback)(query.sql, params, 'get');\n\t\t});\n\n\t\treturn this.mapGetResult(clientResult.rows);\n\t}\n\n\toverride mapGetResult(rows: unknown, isFromBatch?: boolean): unknown {\n\t\tif (isFromBatch) {\n\t\t\trows = (rows as SqliteRemoteResult).rows;\n\t\t}\n\n\t\tconst row = rows as unknown[];\n\n\t\tif (!this.fields && !this.customResultMapper) {\n\t\t\treturn row;\n\t\t}\n\n\t\tif (!row) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (this.customResultMapper) {\n\t\t\treturn this.customResultMapper([rows] as unknown[][]) as T['get'];\n\t\t}\n\n\t\treturn mapResultRow(\n\t\t\tthis.fields!,\n\t\t\trow,\n\t\t\tthis.joinsNotNullableMap,\n\t\t);\n\t}\n\n\tasync values<T extends any[] = unknown[]>(placeholderValues?: Record<string, unknown>): Promise<T[]> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\tconst clientResult = await this.queryWithCache(this.query.sql, params, async () => {\n\t\t\treturn await (this.client as AsyncRemoteCallback)(this.query.sql, params, 'values');\n\t\t});\n\t\treturn clientResult.rows as T[];\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/subquery.ts",
    "content": "import { entityKind } from './entity.ts';\nimport type { SQL, SQLWrapper } from './sql/sql.ts';\n\nexport interface Subquery<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTAlias extends string = string,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\nexport class Subquery<\n\tTAlias extends string = string,\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Subquery';\n\n\tdeclare _: {\n\t\tbrand: 'Subquery';\n\t\tsql: SQL;\n\t\tselectedFields: TSelectedFields;\n\t\talias: TAlias;\n\t\tisWith: boolean;\n\t\tusedTables?: string[];\n\t};\n\n\tconstructor(sql: SQL, fields: TSelectedFields, alias: string, isWith = false, usedTables: string[] = []) {\n\t\tthis._ = {\n\t\t\tbrand: 'Subquery',\n\t\t\tsql,\n\t\t\tselectedFields: fields as TSelectedFields,\n\t\t\talias: alias as TAlias,\n\t\t\tisWith,\n\t\t\tusedTables,\n\t\t};\n\t}\n\n\t// getSQL(): SQL<unknown> {\n\t// \treturn new SQL([this]);\n\t// }\n}\n\nexport class WithSubquery<\n\tTAlias extends string = string,\n\tTSelection extends Record<string, unknown> = Record<string, unknown>,\n> extends Subquery<TAlias, TSelection> {\n\tstatic override readonly [entityKind]: string = 'WithSubquery';\n}\n\nexport type WithSubqueryWithoutSelection<TAlias extends string> = WithSubquery<TAlias, {}>;\n"
  },
  {
    "path": "drizzle-orm/src/supabase/index.ts",
    "content": "export * from './rls.ts';\n"
  },
  {
    "path": "drizzle-orm/src/supabase/rls.ts",
    "content": "import { bigserial, pgSchema, text, timestamp, uuid, varchar } from '~/pg-core/index.ts';\nimport { pgRole } from '~/pg-core/roles.ts';\nimport { sql } from '~/sql/sql.ts';\n\nexport const anonRole = pgRole('anon').existing();\nexport const authenticatedRole = pgRole('authenticated').existing();\nexport const serviceRole = pgRole('service_role').existing();\nexport const postgresRole = pgRole('postgres_role').existing();\nexport const supabaseAuthAdminRole = pgRole('supabase_auth_admin').existing();\n\n/* ------------------------------ auth schema; ------------------------------ */\nconst auth = pgSchema('auth');\n\nexport const authUsers = auth.table('users', {\n\tid: uuid().primaryKey().notNull(),\n\temail: varchar({ length: 255 }),\n\tphone: text().unique(),\n\temailConfirmedAt: timestamp('email_confirmed_at', { withTimezone: true }),\n\tphoneConfirmedAt: timestamp('phone_confirmed_at', { withTimezone: true }),\n\tlastSignInAt: timestamp('last_sign_in_at', { withTimezone: true }),\n\tcreatedAt: timestamp('created_at', { withTimezone: true }),\n\tupdatedAt: timestamp('updated_at', { withTimezone: true }),\n});\n\n/* ------------------------------ realtime schema; ------------------------------- */\nconst realtime = pgSchema('realtime');\n\nexport const realtimeMessages = realtime.table(\n\t'messages',\n\t{\n\t\tid: bigserial({ mode: 'bigint' }).primaryKey(),\n\t\ttopic: text().notNull(),\n\t\textension: text({\n\t\t\tenum: ['presence', 'broadcast', 'postgres_changes'],\n\t\t}).notNull(),\n\t},\n);\n\nexport const authUid = sql`(select auth.uid())`;\nexport const realtimeTopic = sql`realtime.topic()`;\n"
  },
  {
    "path": "drizzle-orm/src/table.ts",
    "content": "import type { Column, GetColumnData } from './column.ts';\nimport { entityKind } from './entity.ts';\nimport type { OptionalKeyOnly, RequiredKeyOnly } from './operations.ts';\nimport type { SQLWrapper } from './sql/sql.ts';\nimport { TableName } from './table.utils.ts';\nimport type { Simplify, Update } from './utils.ts';\n\nexport interface TableConfig<TColumn extends Column = Column<any>> {\n\tname: string;\n\tschema: string | undefined;\n\tcolumns: Record<string, TColumn>;\n\tdialect: string;\n}\n\nexport type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<\n\tUpdate<T, TUpdate>\n>;\n\n/** @internal */\nexport const Schema = Symbol.for('drizzle:Schema');\n\n/** @internal */\nexport const Columns = Symbol.for('drizzle:Columns');\n\n/** @internal */\nexport const ExtraConfigColumns = Symbol.for('drizzle:ExtraConfigColumns');\n\n/** @internal */\nexport const OriginalName = Symbol.for('drizzle:OriginalName');\n\n/** @internal */\nexport const BaseName = Symbol.for('drizzle:BaseName');\n\n/** @internal */\nexport const IsAlias = Symbol.for('drizzle:IsAlias');\n\n/** @internal */\nexport const ExtraConfigBuilder = Symbol.for('drizzle:ExtraConfigBuilder');\n\nconst IsDrizzleTable = Symbol.for('drizzle:IsDrizzleTable');\n\nexport interface Table<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends TableConfig = TableConfig,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n\nexport class Table<T extends TableConfig = TableConfig> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Table';\n\n\tdeclare readonly _: {\n\t\treadonly brand: 'Table';\n\t\treadonly config: T;\n\t\treadonly name: T['name'];\n\t\treadonly schema: T['schema'];\n\t\treadonly columns: T['columns'];\n\t\treadonly inferSelect: InferSelectModel<Table<T>>;\n\t\treadonly inferInsert: InferInsertModel<Table<T>>;\n\t};\n\n\tdeclare readonly $inferSelect: InferSelectModel<Table<T>>;\n\tdeclare readonly $inferInsert: InferInsertModel<Table<T>>;\n\n\t/** @internal */\n\tstatic readonly Symbol = {\n\t\tName: TableName as typeof TableName,\n\t\tSchema: Schema as typeof Schema,\n\t\tOriginalName: OriginalName as typeof OriginalName,\n\t\tColumns: Columns as typeof Columns,\n\t\tExtraConfigColumns: ExtraConfigColumns as typeof ExtraConfigColumns,\n\t\tBaseName: BaseName as typeof BaseName,\n\t\tIsAlias: IsAlias as typeof IsAlias,\n\t\tExtraConfigBuilder: ExtraConfigBuilder as typeof ExtraConfigBuilder,\n\t};\n\n\t/**\n\t * @internal\n\t * Can be changed if the table is aliased.\n\t */\n\t[TableName]: string;\n\n\t/**\n\t * @internal\n\t * Used to store the original name of the table, before any aliasing.\n\t */\n\t[OriginalName]: string;\n\n\t/** @internal */\n\t[Schema]: string | undefined;\n\n\t/** @internal */\n\t[Columns]!: T['columns'];\n\n\t/** @internal */\n\t[ExtraConfigColumns]!: Record<string, unknown>;\n\n\t/**\n\t *  @internal\n\t * Used to store the table name before the transformation via the `tableCreator` functions.\n\t */\n\t[BaseName]: string;\n\n\t/** @internal */\n\t[IsAlias] = false;\n\n\t/** @internal */\n\t[IsDrizzleTable] = true;\n\n\t/** @internal */\n\t[ExtraConfigBuilder]: ((self: any) => Record<string, unknown> | unknown[]) | undefined = undefined;\n\n\tconstructor(name: string, schema: string | undefined, baseName: string) {\n\t\tthis[TableName] = this[OriginalName] = name;\n\t\tthis[Schema] = schema;\n\t\tthis[BaseName] = baseName;\n\t}\n}\n\nexport function isTable(table: unknown): table is Table {\n\treturn typeof table === 'object' && table !== null && IsDrizzleTable in table;\n}\n\n/**\n * Any table with a specified boundary.\n *\n * @example\n\t```ts\n\t// Any table with a specific name\n\ttype AnyUsersTable = AnyTable<{ name: 'users' }>;\n\t```\n *\n * To describe any table with any config, simply use `Table` without any type arguments, like this:\n *\n\t```ts\n\tfunction needsTable(table: Table) {\n\t\t...\n\t}\n\t```\n */\nexport type AnyTable<TPartial extends Partial<TableConfig>> = Table<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport function getTableName<T extends Table>(table: T): T['_']['name'] {\n\treturn table[TableName];\n}\n\nexport function getTableUniqueName<T extends Table>(table: T): `${T['_']['schema']}.${T['_']['name']}` {\n\treturn `${table[Schema] ?? 'public'}.${table[TableName]}`;\n}\n\nexport type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> =\n\tTDBColumNames extends true ? TColumn['_']['name']\n\t\t: TName;\n\nexport type InferModelFromColumns<\n\tTColumns extends Record<string, Column>,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean; override?: boolean } = { dbColumnNames: false; override: false },\n> = Simplify<\n\tTInferMode extends 'insert' ?\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as RequiredKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as OptionalKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key],\n\t\t\t\t\t\tTConfig['override']\n\t\t\t\t\t>\n\t\t\t\t]?: GetColumnData<TColumns[Key], 'query'> | undefined;\n\t\t\t}\n\t\t: {\n\t\t\t[\n\t\t\t\tKey in keyof TColumns & string as MapColumnName<\n\t\t\t\t\tKey,\n\t\t\t\t\tTColumns[Key],\n\t\t\t\t\tTConfig['dbColumnNames']\n\t\t\t\t>\n\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t}\n>;\n\n/** @deprecated Use one of the alternatives: {@link InferSelectModel} / {@link InferInsertModel}, or `table.$inferSelect` / `table.$inferInsert`\n */\nexport type InferModel<\n\tTTable extends Table,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], TInferMode, TConfig>;\n\nexport type InferSelectModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'select', TConfig>;\n\nexport type InferInsertModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean; override?: boolean } = { dbColumnNames: false; override: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'insert', TConfig>;\n\nexport type InferEnum<T> = T extends { enumValues: readonly (infer U)[] } ? U\n\t: never;\n"
  },
  {
    "path": "drizzle-orm/src/table.utils.ts",
    "content": "/** @internal */\nexport const TableName = Symbol.for('drizzle:Name');\n"
  },
  {
    "path": "drizzle-orm/src/tidb-serverless/driver.ts",
    "content": "import { type Config, connect, type Connection } from '@tidbcloud/serverless';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { MySqlDatabase } from '~/mysql-core/db.ts';\nimport { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport type { TiDBServerlessPreparedQueryHKT, TiDBServerlessQueryResultHKT } from './session.ts';\nimport { TiDBServerlessSession } from './session.ts';\n\nexport interface TiDBServerlessSDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class TiDBServerlessDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends MySqlDatabase<TiDBServerlessQueryResultHKT, TiDBServerlessPreparedQueryHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'TiDBServerlessDatabase';\n}\n\nfunction construct<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: Connection,\n\tconfig: DrizzleConfig<TSchema> = {},\n): TiDBServerlessDatabase<TSchema> & {\n\t$client: Connection;\n} {\n\tconst dialect = new MySqlDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new TiDBServerlessSession(client, dialect, undefined, schema, { logger, cache: config.cache });\n\tconst db = new TiDBServerlessDatabase(dialect, session, schema as any, 'default') as TiDBServerlessDatabase<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Connection = Connection,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t& ({\n\t\t\tconnection: string | Config;\n\t\t} | {\n\t\t\tclient: TClient;\n\t\t})\n\t\t& DrizzleConfig<TSchema>,\n\t]\n): TiDBServerlessDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = connect({\n\t\t\turl: params[0],\n\t\t});\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& { connection?: Config | string; client?: TClient }\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tconst instance = typeof connection === 'string'\n\t\t\t? connect({\n\t\t\t\turl: connection,\n\t\t\t})\n\t\t\t: connect(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): TiDBServerlessDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/tidb-serverless/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/tidb-serverless/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { TiDBServerlessDatabase } from './driver.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: TiDBServerlessDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tawait db.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/tidb-serverless/session.ts",
    "content": "import type { Connection, ExecuteOptions, FullResult, Tx } from '@tidbcloud/serverless';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { Column } from '~/column.ts';\n\nimport { entityKind, is } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { SelectedFieldsOrdered } from '~/mysql-core/query-builders/select.types.ts';\nimport {\n\tMySqlPreparedQuery,\n\ttype MySqlPreparedQueryConfig,\n\ttype MySqlPreparedQueryHKT,\n\ttype MySqlQueryResultHKT,\n\tMySqlSession,\n\tMySqlTransaction,\n} from '~/mysql-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nconst executeRawConfig = { fullResult: true } satisfies ExecuteOptions;\nconst queryConfig = { arrayMode: true } satisfies ExecuteOptions;\n\nexport class TiDBServerlessPreparedQuery<T extends MySqlPreparedQueryConfig> extends MySqlPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'TiDBPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: Tx | Connection,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\t// Keys that were used in $default and the value that was generated for them\n\t\tprivate generatedIds?: Record<string, unknown>[],\n\t\t// Keys that should be returned, it has the column with all properries + key from object\n\t\tprivate returningIds?: SelectedFieldsOrdered,\n\t) {\n\t\tsuper(cache, queryMetadata, cacheConfig);\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\tthis.logger.logQuery(this.queryString, params);\n\n\t\tconst { fields, client, queryString, joinsNotNullableMap, customResultMapper, returningIds, generatedIds } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst res = await this.queryWithCache(queryString, params, async () => {\n\t\t\t\treturn await client.execute(queryString, params, executeRawConfig) as FullResult;\n\t\t\t});\n\t\t\tconst insertId = res.lastInsertId ?? 0;\n\t\t\tconst affectedRows = res.rowsAffected ?? 0;\n\t\t\t// for each row, I need to check keys from\n\t\t\tif (returningIds) {\n\t\t\t\tconst returningResponse = [];\n\t\t\t\tlet j = 0;\n\t\t\t\tfor (let i = insertId; i < insertId + affectedRows; i++) {\n\t\t\t\t\tfor (const column of returningIds) {\n\t\t\t\t\t\tconst key = returningIds[0]!.path[0]!;\n\t\t\t\t\t\tif (is(column.field, Column)) {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tif (column.field.primary && column.field.autoIncrement) {\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: i });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (column.field.defaultFn && generatedIds) {\n\t\t\t\t\t\t\t\t// generatedIds[rowIdx][key]\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: generatedIds[j]![key] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tj++;\n\t\t\t\t}\n\n\t\t\t\treturn returningResponse;\n\t\t\t}\n\t\t\treturn res;\n\t\t}\n\n\t\tconst rows = await this.queryWithCache(queryString, params, async () => {\n\t\t\treturn await client.execute(queryString, params, queryConfig) as unknown[][];\n\t\t});\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows);\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t}\n\n\toverride iterator(_placeholderValues?: Record<string, unknown>): AsyncGenerator<T['iterator']> {\n\t\tthrow new Error('Streaming is not supported by the TiDB Cloud Serverless driver');\n\t}\n}\n\nexport interface TiDBServerlessSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class TiDBServerlessSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlSession<TiDBServerlessQueryResultHKT, TiDBServerlessPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'TiDBServerlessSession';\n\n\tprivate logger: Logger;\n\tprivate client: Tx | Connection;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate baseClient: Connection,\n\t\tdialect: MySqlDialect,\n\t\ttx: Tx | undefined,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: TiDBServerlessSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.client = tx ?? baseClient;\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends MySqlPreparedQueryConfig = MySqlPreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tgeneratedIds?: Record<string, unknown>[],\n\t\treturningIds?: SelectedFieldsOrdered,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): MySqlPreparedQuery<T> {\n\t\treturn new TiDBServerlessPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tcustomResultMapper,\n\t\t\tgeneratedIds,\n\t\t\treturningIds,\n\t\t);\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\tconst querySql = this.dialect.sqlToQuery(query);\n\t\tthis.logger.logQuery(querySql.sql, querySql.params);\n\t\treturn this.client.execute(querySql.sql, querySql.params) as Promise<T[]>;\n\t}\n\n\toverride async count(sql: SQL): Promise<number> {\n\t\tconst res = await this.execute<{ rows: [{ count: string }] }>(sql);\n\n\t\treturn Number(\n\t\t\tres['rows'][0]['count'],\n\t\t);\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst nativeTx = await this.baseClient.begin();\n\t\ttry {\n\t\t\tconst session = new TiDBServerlessSession(this.baseClient, this.dialect, nativeTx, this.schema, this.options);\n\t\t\tconst tx = new TiDBServerlessTransaction<TFullSchema, TSchema>(\n\t\t\t\tthis.dialect,\n\t\t\t\tsession as MySqlSession<any, any, any, any>,\n\t\t\t\tthis.schema,\n\t\t\t);\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait nativeTx.commit();\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait nativeTx.rollback();\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class TiDBServerlessTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlTransaction<TiDBServerlessQueryResultHKT, TiDBServerlessPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'TiDBServerlessTransaction';\n\n\tconstructor(\n\t\tdialect: MySqlDialect,\n\t\tsession: MySqlSession,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tnestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, schema, nestedIndex, 'default');\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new TiDBServerlessTransaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\t\tawait tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport interface TiDBServerlessQueryResultHKT extends MySqlQueryResultHKT {\n\ttype: FullResult;\n}\n\nexport interface TiDBServerlessPreparedQueryHKT extends MySqlPreparedQueryHKT {\n\ttype: TiDBServerlessPreparedQuery<Assume<this['config'], MySqlPreparedQueryConfig>>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/tracing-utils.ts",
    "content": "export function iife<T extends unknown[], U>(fn: (...args: T) => U, ...args: T): U {\n\treturn fn(...args);\n}\n"
  },
  {
    "path": "drizzle-orm/src/tracing.ts",
    "content": "import type { Span, Tracer } from '@opentelemetry/api';\nimport { iife } from '~/tracing-utils.ts';\nimport { npmVersion } from '~/version.ts';\n\nlet otel: typeof import('@opentelemetry/api') | undefined;\nlet rawTracer: Tracer | undefined;\n// try {\n// \totel = await import('@opentelemetry/api');\n// } catch (err: any) {\n// \tif (err.code !== 'MODULE_NOT_FOUND' && err.code !== 'ERR_MODULE_NOT_FOUND') {\n// \t\tthrow err;\n// \t}\n// }\n\ntype SpanName =\n\t| 'drizzle.operation'\n\t| 'drizzle.prepareQuery'\n\t| 'drizzle.buildSQL'\n\t| 'drizzle.execute'\n\t| 'drizzle.driver.execute'\n\t| 'drizzle.mapResponse';\n\n/** @internal */\nexport const tracer = {\n\tstartActiveSpan<F extends (span?: Span) => unknown>(name: SpanName, fn: F): ReturnType<F> {\n\t\tif (!otel) {\n\t\t\treturn fn() as ReturnType<F>;\n\t\t}\n\n\t\tif (!rawTracer) {\n\t\t\trawTracer = otel.trace.getTracer('drizzle-orm', npmVersion);\n\t\t}\n\n\t\treturn iife(\n\t\t\t(otel, rawTracer) =>\n\t\t\t\trawTracer.startActiveSpan(\n\t\t\t\t\tname,\n\t\t\t\t\t((span: Span) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn fn(span);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\t\t\tcode: otel.SpanStatusCode.ERROR,\n\t\t\t\t\t\t\t\tmessage: e instanceof Error ? e.message : 'Unknown error', // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tspan.end();\n\t\t\t\t\t\t}\n\t\t\t\t\t}) as F,\n\t\t\t\t),\n\t\t\totel,\n\t\t\trawTracer,\n\t\t);\n\t},\n};\n"
  },
  {
    "path": "drizzle-orm/src/utils.ts",
    "content": "import type { Cache } from './cache/core/cache.ts';\nimport type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { is } from './entity.ts';\nimport type { Logger } from './logger.ts';\nimport type { SelectedFieldsOrdered } from './operations.ts';\nimport type { TableLike } from './query-builders/select.types.ts';\nimport { Param, SQL, View } from './sql/sql.ts';\nimport type { DriverValueDecoder } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { getTableName, Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\n/** @internal */\nexport function mapResultRow<TResult>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\trow: unknown[],\n\tjoinsNotNullableMap: Record<string, boolean> | undefined,\n): TResult {\n\t// Key -> nested object key, value -> table name if all fields in the nested object are from the same table, false otherwise\n\tconst nullifyMap: Record<string, string | false> = {};\n\n\tconst result = columns.reduce<Record<string, any>>(\n\t\t(result, { path, field }, columnIndex) => {\n\t\t\tlet decoder: DriverValueDecoder<unknown, unknown>;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\tdecoder = field._.sql.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tlet node = result;\n\t\t\tfor (const [pathChunkIndex, pathChunk] of path.entries()) {\n\t\t\t\tif (pathChunkIndex < path.length - 1) {\n\t\t\t\t\tif (!(pathChunk in node)) {\n\t\t\t\t\t\tnode[pathChunk] = {};\n\t\t\t\t\t}\n\t\t\t\t\tnode = node[pathChunk];\n\t\t\t\t} else {\n\t\t\t\t\tconst rawValue = row[columnIndex]!;\n\t\t\t\t\tconst value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);\n\n\t\t\t\t\tif (joinsNotNullableMap && is(field, Column) && path.length === 2) {\n\t\t\t\t\t\tconst objectName = path[0]!;\n\t\t\t\t\t\tif (!(objectName in nullifyMap)) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = value === null ? getTableName(field.table) : false;\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttypeof nullifyMap[objectName] === 'string' && nullifyMap[objectName] !== getTableName(field.table)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\t{},\n\t);\n\n\t// Nullify all nested objects from nullifyMap that are nullable\n\tif (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {\n\t\tfor (const [objectName, tableName] of Object.entries(nullifyMap)) {\n\t\t\tif (typeof tableName === 'string' && !joinsNotNullableMap[tableName]) {\n\t\t\t\tresult[objectName] = null;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result as TResult;\n}\n\n/** @internal */\nexport function orderSelectedFields<TColumn extends AnyColumn>(\n\tfields: Record<string, unknown>,\n\tpathPrefix?: string[],\n): SelectedFieldsOrdered<TColumn> {\n\treturn Object.entries(fields).reduce<SelectedFieldsOrdered<AnyColumn>>((result, [name, field]) => {\n\t\tif (typeof name !== 'string') {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst newPath = pathPrefix ? [...pathPrefix, name] : [name];\n\t\tif (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased) || is(field, Subquery)) {\n\t\t\tresult.push({ path: newPath, field });\n\t\t} else if (is(field, Table)) {\n\t\t\tresult.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));\n\t\t} else {\n\t\t\tresult.push(...orderSelectedFields(field as Record<string, unknown>, newPath));\n\t\t}\n\t\treturn result;\n\t}, []) as SelectedFieldsOrdered<TColumn>;\n}\n\nexport function haveSameKeys(left: Record<string, unknown>, right: Record<string, unknown>) {\n\tconst leftKeys = Object.keys(left);\n\tconst rightKeys = Object.keys(right);\n\n\tif (leftKeys.length !== rightKeys.length) {\n\t\treturn false;\n\t}\n\n\tfor (const [index, key] of leftKeys.entries()) {\n\t\tif (key !== rightKeys[index]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/** @internal */\nexport function mapUpdateSet(table: Table, values: Record<string, unknown>): UpdateSet {\n\tconst entries: [string, UpdateSet[string]][] = Object.entries(values)\n\t\t.filter(([, value]) => value !== undefined)\n\t\t.map(([key, value]) => {\n\t\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\t\tif (is(value, SQL) || is(value, Column)) {\n\t\t\t\treturn [key, value];\n\t\t\t} else {\n\t\t\t\treturn [key, new Param(value, table[Table.Symbol.Columns][key])];\n\t\t\t}\n\t\t});\n\n\tif (entries.length === 0) {\n\t\tthrow new Error('No values to set');\n\t}\n\n\treturn Object.fromEntries(entries);\n}\n\nexport type UpdateSet = Record<string, SQL | Param | AnyColumn | null | undefined>;\n\nexport type OneOrMany<T> = T | T[];\n\nexport type Update<T, TUpdate> =\n\t& {\n\t\t[K in Exclude<keyof T, keyof TUpdate>]: T[K];\n\t}\n\t& TUpdate;\n\nexport type Simplify<T> =\n\t& {\n\t\t// @ts-ignore - \"Type parameter 'K' has a circular constraint\", not sure why\n\t\t[K in keyof T]: T[K];\n\t}\n\t& {};\n\nexport type Not<T extends boolean> = T extends true ? false : true;\n\nexport type IsNever<T> = [T] extends [never] ? true : false;\n\nexport type IsUnion<T, U extends T = T> = (T extends any ? (U extends T ? false : true) : never) extends false ? false\n\t: true;\n\nexport type SingleKeyObject<T, TError extends string, K = keyof T> = IsNever<K> extends true ? never\n\t: IsUnion<K> extends true ? DrizzleTypeError<TError>\n\t: T;\n\nexport type FromSingleKeyObject<T, Result, TError extends string, K = keyof T> = IsNever<K> extends true ? never\n\t: IsUnion<K> extends true ? DrizzleTypeError<TError>\n\t: Result;\n\nexport type SimplifyMappedType<T> = [T] extends [unknown] ? T : never;\n\nexport type ShallowRecord<K extends keyof any, T> = SimplifyMappedType<{ [P in K]: T }>;\n\nexport type Assume<T, U> = T extends U ? T : U;\n\nexport type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;\n\nexport interface DrizzleTypeError<T extends string> {\n\t$drizzleTypeError: T;\n}\n\nexport type ValueOrArray<T> = T | T[];\n\n/** @internal */\nexport function applyMixins(baseClass: any, extendedClasses: any[]) {\n\tfor (const extendedClass of extendedClasses) {\n\t\tfor (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {\n\t\t\tif (name === 'constructor') continue;\n\n\t\t\tObject.defineProperty(\n\t\t\t\tbaseClass.prototype,\n\t\t\t\tname,\n\t\t\t\tObject.getOwnPropertyDescriptor(extendedClass.prototype, name) || Object.create(null),\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport type Or<T1, T2> = T1 extends true ? true : T2 extends true ? true : false;\n\nexport type IfThenElse<If, Then, Else> = If extends true ? Then : Else;\n\nexport type PromiseOf<T> = T extends Promise<infer U> ? U : T;\n\nexport type Writable<T> = {\n\t-readonly [P in keyof T]: T[P];\n};\n\nexport type NonArray<T> = T extends any[] ? never : T;\n\nexport function getTableColumns<T extends Table>(table: T): T['_']['columns'] {\n\treturn table[Table.Symbol.Columns];\n}\n\nexport function getViewSelectedFields<T extends View>(view: T): T['_']['selectedFields'] {\n\treturn view[ViewBaseConfig].selectedFields;\n}\n\n/** @internal */\nexport function getTableLikeName(table: TableLike): string | undefined {\n\treturn is(table, Subquery)\n\t\t? table._.alias\n\t\t: is(table, View)\n\t\t? table[ViewBaseConfig].name\n\t\t: is(table, SQL)\n\t\t? undefined\n\t\t: table[Table.Symbol.IsAlias]\n\t\t? table[Table.Symbol.Name]\n\t\t: table[Table.Symbol.BaseName];\n}\n\nexport type ColumnsWithTable<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyColumn<{ tableName: TTableName }>[],\n> = { [Key in keyof TColumns]: AnyColumn<{ tableName: TForeignTableName }> };\n\nexport type Casing = 'snake_case' | 'camelCase';\n\nexport interface DrizzleConfig<TSchema extends Record<string, unknown> = Record<string, never>> {\n\tlogger?: boolean | Logger;\n\tschema?: TSchema;\n\tcasing?: Casing;\n\tcache?: Cache;\n}\nexport type ValidateShape<T, ValidShape, TResult = T> = T extends ValidShape\n\t? Exclude<keyof T, keyof ValidShape> extends never ? TResult\n\t: DrizzleTypeError<\n\t\t`Invalid key(s): ${Exclude<(keyof T) & (string | number | bigint | boolean | null | undefined), keyof ValidShape>}`\n\t>\n\t: never;\n\nexport type KnownKeysOnly<T, U> = {\n\t[K in keyof T]: K extends keyof U ? T[K] : never;\n};\n\nexport type IsAny<T> = 0 extends (1 & T) ? true : false;\n\n/** @internal */\nexport function getColumnNameAndConfig<\n\tTConfig extends Record<string, any> | undefined,\n>(a: string | TConfig | undefined, b: TConfig | undefined) {\n\treturn {\n\t\tname: typeof a === 'string' && a.length > 0 ? a : '' as string,\n\t\tconfig: typeof a === 'object' ? a : b as TConfig,\n\t};\n}\n\nexport type IfNotImported<T, Y, N> = unknown extends T ? Y : N;\n\nexport type ImportTypeError<TPackageName extends string> =\n\t`Please install \\`${TPackageName}\\` to allow Drizzle ORM to connect to the database`;\n\nexport type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Keys extends any\n\t? Required<Pick<T, Keys>> & Partial<Omit<T, Keys>>\n\t: never;\n\ntype ExpectedConfigShape = {\n\tlogger?: boolean | {\n\t\tlogQuery(query: string, params: unknown[]): void;\n\t};\n\tschema?: Record<string, never>;\n\tcasing?: 'snake_case' | 'camelCase';\n};\n\n// If this errors, you must update config shape checker function with new config specs\nconst _: DrizzleConfig = {} as ExpectedConfigShape;\nconst __: ExpectedConfigShape = {} as DrizzleConfig;\n\nexport function isConfig(data: any): boolean {\n\tif (typeof data !== 'object' || data === null) return false;\n\n\tif (data.constructor.name !== 'Object') return false;\n\n\tif ('logger' in data) {\n\t\tconst type = typeof data['logger'];\n\t\tif (\n\t\t\ttype !== 'boolean' && (type !== 'object' || typeof data['logger']['logQuery'] !== 'function')\n\t\t\t&& type !== 'undefined'\n\t\t) return false;\n\n\t\treturn true;\n\t}\n\n\tif ('schema' in data) {\n\t\tconst type = typeof data['schema'];\n\t\tif (type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('casing' in data) {\n\t\tconst type = typeof data['casing'];\n\t\tif (type !== 'string' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('mode' in data) {\n\t\tif (data['mode'] !== 'default' || data['mode'] !== 'planetscale' || data['mode'] !== undefined) return false;\n\n\t\treturn true;\n\t}\n\n\tif ('connection' in data) {\n\t\tconst type = typeof data['connection'];\n\t\tif (type !== 'string' && type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('client' in data) {\n\t\tconst type = typeof data['client'];\n\t\tif (type !== 'object' && type !== 'function' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif (Object.keys(data).length === 0) return true;\n\n\treturn false;\n}\n\nexport type NeonAuthToken = string | (() => string | Promise<string>);\n\nexport const textDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder();\n"
  },
  {
    "path": "drizzle-orm/src/vercel-postgres/driver.ts",
    "content": "import { sql } from '@vercel/postgres';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/index.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { type VercelPgClient, type VercelPgQueryResultHKT, VercelPgSession } from './session.ts';\n\nexport interface VercelPgDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class VercelPgDriver {\n\tstatic readonly [entityKind]: string = 'VercelPgDriver';\n\n\tconstructor(\n\t\tprivate client: VercelPgClient,\n\t\tprivate dialect: PgDialect,\n\t\tprivate options: VercelPgDriverOptions = {},\n\t) {\n\t}\n\n\tcreateSession(\n\t\tschema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,\n\t): VercelPgSession<Record<string, unknown>, TablesRelationalConfig> {\n\t\treturn new VercelPgSession(this.client, this.dialect, schema, {\n\t\t\tlogger: this.options.logger,\n\t\t\tcache: this.options.cache,\n\t\t});\n\t}\n}\n\nexport class VercelPgDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<VercelPgQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'VercelPgDatabase';\n}\n\nfunction construct<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: VercelPgClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): VercelPgDatabase<TSchema> & {\n\t$client: VercelPgClient;\n} {\n\tconst dialect = new PgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst driver = new VercelPgDriver(client, dialect, { logger, cache: config.cache });\n\tconst session = driver.createSession(schema);\n\tconst db = new VercelPgDatabase(dialect, session, schema as any) as VercelPgDatabase<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends VercelPgClient = typeof sql,\n>(\n\t...params: [] | [\n\t\tTClient,\n\t] | [\n\t\tTClient,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tclient?: TClient;\n\t\t\t})\n\t\t),\n\t]\n): VercelPgDatabase<TSchema> & {\n\t$client: VercelPgClient extends TClient ? typeof sql : TClient;\n} {\n\tif (isConfig(params[0])) {\n\t\tconst { client, ...drizzleConfig } = params[0] as ({ client?: TClient } & DrizzleConfig<TSchema>);\n\t\treturn construct(client ?? sql, drizzleConfig) as any;\n\t}\n\n\treturn construct((params[0] ?? sql) as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): VercelPgDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/vercel-postgres/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/vercel-postgres/migrator.ts",
    "content": "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { VercelPgDatabase } from './driver.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: VercelPgDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tawait db.dialect.migrate(migrations, db.session, config);\n}\n"
  },
  {
    "path": "drizzle-orm/src/vercel-postgres/session.ts",
    "content": "import {\n\ttype QueryArrayConfig,\n\ttype QueryConfig,\n\ttype QueryResult,\n\ttype QueryResultRow,\n\ttypes,\n\ttype VercelClient,\n\tVercelPool,\n\ttype VercelPoolClient,\n} from '@vercel/postgres';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { NoopCache } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport { type Logger, NoopLogger } from '~/logger.ts';\nimport { type PgDialect, PgTransaction } from '~/pg-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport { PgPreparedQuery, PgSession } from '~/pg-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nexport type VercelPgClient = VercelPool | VercelClient | VercelPoolClient;\n\nexport class VercelPgPreparedQuery<T extends PreparedQueryConfig> extends PgPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'VercelPgPreparedQuery';\n\n\tprivate rawQuery: QueryConfig;\n\tprivate queryConfig: QueryArrayConfig;\n\n\tconstructor(\n\t\tprivate client: VercelPgClient,\n\t\tqueryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t\tthis.rawQuery = {\n\t\t\tname,\n\t\t\ttext: queryString,\n\t\t\ttypes: {\n\t\t\t\t// @ts-ignore\n\t\t\t\tgetTypeParser: (typeId, format) => {\n\t\t\t\t\tif (typeId === types.builtins.TIMESTAMPTZ) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.TIMESTAMP) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.DATE) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.INTERVAL) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// numeric[]\n\t\t\t\t\tif (typeId === 1231 as any) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// timestamp[]\n\t\t\t\t\tif (typeId === 1115 as any) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// timestamp with timezone[]\n\t\t\t\t\tif (typeId === 1185 as any) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// interval[]\n\t\t\t\t\tif (typeId === 1187 as any) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// date[]\n\t\t\t\t\tif (typeId === 1182 as any) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\treturn types.getTypeParser(typeId, format);\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\tthis.queryConfig = {\n\t\t\tname,\n\t\t\ttext: queryString,\n\t\t\trowMode: 'array',\n\t\t\ttypes: {\n\t\t\t\t// @ts-ignore\n\t\t\t\tgetTypeParser: (typeId, format) => {\n\t\t\t\t\tif (typeId === types.builtins.TIMESTAMPTZ) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.TIMESTAMP) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.DATE) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId === types.builtins.INTERVAL) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// numeric[]\n\t\t\t\t\tif (typeId === 1231 as any) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// timestamp[]\n\t\t\t\t\tif (typeId === 1115 as any) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// timestamp with timezone[]\n\t\t\t\t\tif (typeId === 1185 as any) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// interval[]\n\t\t\t\t\tif (typeId === 1187 as any) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// date[]\n\t\t\t\t\tif (typeId === 1182 as any) {\n\t\t\t\t\t\treturn (val: any) => val;\n\t\t\t\t\t}\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\treturn types.getTypeParser(typeId, format);\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\tthis.logger.logQuery(this.rawQuery.text, params);\n\n\t\tconst { fields, rawQuery, client, queryConfig: query, joinsNotNullableMap, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn this.queryWithCache(rawQuery.text, params, async () => {\n\t\t\t\treturn await client.query(rawQuery, params);\n\t\t\t});\n\t\t}\n\n\t\tconst { rows } = await this.queryWithCache(query.text, params, async () => {\n\t\t\treturn await client.query(query, params);\n\t\t});\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows);\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t}\n\n\tall(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['all']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\t\tthis.logger.logQuery(this.rawQuery.text, params);\n\t\treturn this.queryWithCache(this.rawQuery.text, params, async () => {\n\t\t\treturn await this.client.query(this.rawQuery, params);\n\t\t}).then((result) => result.rows);\n\t}\n\n\tvalues(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['values']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\t\tthis.logger.logQuery(this.rawQuery.text, params);\n\t\treturn this.queryWithCache(this.queryConfig.text, params, async () => {\n\t\t\treturn await this.client.query(this.queryConfig, params);\n\t\t}).then((result) => result.rows);\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport interface VercelPgSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class VercelPgSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgSession<VercelPgQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'VercelPgSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: VercelPgClient,\n\t\tdialect: PgDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: VercelPgSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgPreparedQuery<T> {\n\t\treturn new VercelPgPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tname,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\tasync query(query: string, params: unknown[]): Promise<QueryResult> {\n\t\tthis.logger.logQuery(query, params);\n\t\tconst result = await this.client.query({\n\t\t\trowMode: 'array',\n\t\t\ttext: query,\n\t\t\tvalues: params,\n\t\t});\n\t\treturn result;\n\t}\n\n\tasync queryObjects<T extends QueryResultRow>(\n\t\tquery: string,\n\t\tparams: unknown[],\n\t): Promise<QueryResult<T>> {\n\t\treturn this.client.query<T>(query, params);\n\t}\n\n\toverride async count(sql: SQL): Promise<number> {\n\t\tconst result = await this.execute(sql);\n\n\t\treturn Number((result as any)['rows'][0]['count']);\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: VercelPgTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig | undefined,\n\t): Promise<T> {\n\t\tconst session = this.client instanceof VercelPool // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t? new VercelPgSession(await this.client.connect(), this.dialect, this.schema, this.options)\n\t\t\t: this;\n\t\tconst tx = new VercelPgTransaction<TFullSchema, TSchema>(this.dialect, session, this.schema);\n\t\tawait tx.execute(sql`begin${config ? sql` ${tx.getTransactionConfigSQL(config)}` : undefined}`);\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tawait tx.execute(sql`rollback`);\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tif (this.client instanceof VercelPool) { // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t\t(session.client as VercelPoolClient).release();\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport class VercelPgTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgTransaction<VercelPgQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'VercelPgTransaction';\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: VercelPgTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new VercelPgTransaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\t\tawait tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport interface VercelPgQueryResultHKT extends PgQueryResultHKT {\n\ttype: QueryResult<Assume<this['row'], QueryResultRow>>;\n}\n"
  },
  {
    "path": "drizzle-orm/src/version.ts",
    "content": "// @ts-ignore - imported using Rollup json plugin\nexport { version as npmVersion } from '../package.json';\n// In version 7, we changed the PostgreSQL indexes API\nexport const compatibilityVersion = 10;\n"
  },
  {
    "path": "drizzle-orm/src/view-common.ts",
    "content": "export const ViewBaseConfig = Symbol.for('drizzle:ViewBaseConfig');\n"
  },
  {
    "path": "drizzle-orm/src/xata-http/driver.ts",
    "content": "import type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { createTableRelationsHelpers, extractTablesRelationalConfig } from '~/relations.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport type { XataHttpClient, XataHttpQueryResultHKT } from './session.ts';\nimport { XataHttpSession } from './session.ts';\n\nexport interface XataDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class XataHttpDriver {\n\tstatic readonly [entityKind]: string = 'XataDriver';\n\n\tconstructor(\n\t\tprivate client: XataHttpClient,\n\t\tprivate dialect: PgDialect,\n\t\tprivate options: XataDriverOptions = {},\n\t) {\n\t\tthis.initMappers();\n\t}\n\n\tcreateSession(\n\t\tschema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,\n\t): XataHttpSession<Record<string, unknown>, TablesRelationalConfig> {\n\t\treturn new XataHttpSession(this.client, this.dialect, schema, {\n\t\t\tlogger: this.options.logger,\n\t\t\tcache: this.options.cache,\n\t\t});\n\t}\n\n\tinitMappers() {\n\t\t// TODO: Add custom type parsers\n\t}\n}\n\nexport class XataHttpDatabase<TSchema extends Record<string, unknown> = Record<string, never>>\n\textends PgDatabase<XataHttpQueryResultHKT, TSchema>\n{\n\tstatic override readonly [entityKind]: string = 'XataHttpDatabase';\n\n\t/** @internal */\n\tdeclare readonly session: XataHttpSession<TSchema, ExtractTablesWithRelations<TSchema>>;\n}\n\nexport function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: XataHttpClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): XataHttpDatabase<TSchema> & {\n\t$client: XataHttpClient;\n} {\n\tconst dialect = new PgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst driver = new XataHttpDriver(client, dialect, { logger, cache: config.cache });\n\tconst session = driver.createSession(schema);\n\n\tconst db = new XataHttpDatabase(\n\t\tdialect,\n\t\tsession,\n\t\tschema as RelationalSchemaConfig<ExtractTablesWithRelations<TSchema>> | undefined,\n\t);\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n"
  },
  {
    "path": "drizzle-orm/src/xata-http/index.ts",
    "content": "export * from './driver.ts';\nexport * from './session.ts';\n"
  },
  {
    "path": "drizzle-orm/src/xata-http/migrator.ts",
    "content": "import { readMigrationFiles } from '~/migrator.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { XataHttpDatabase } from './driver.ts';\n\nexport interface MigrationConfig {\n\tmigrationsFolder: string;\n\tmigrationsTable?: string;\n}\n\n/**\n * This function reads migrationFolder and execute each unapplied migration and mark it as executed in database\n *\n * NOTE: The Xata HTTP driver does not support transactions. This means that if any part of a migration fails,\n * no rollback will be executed. Currently, you will need to handle unsuccessful migration yourself.\n * @param db - drizzle db instance\n * @param config - path to migration folder generated by drizzle-kit\n */ export async function migrate<TSchema extends Record<string, unknown>>(\n\tdb: XataHttpDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tconst migrationsTable = config.migrationsTable ?? '__drizzle_migrations';\n\tconst migrationTableCreate = sql`\n\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\tid SERIAL PRIMARY KEY,\n\t\t\thash text NOT NULL,\n\t\t\tcreated_at bigint\n\t\t)\n\t`;\n\tawait db.session.execute(migrationTableCreate);\n\n\tconst dbMigrations = await db.session.all<{\n\t\tid: number;\n\t\thash: string;\n\t\tcreated_at: string;\n\t}>(\n\t\tsql`select id, hash, created_at from ${sql.identifier(migrationsTable)} order by created_at desc limit 1`,\n\t);\n\n\tconst lastDbMigration = dbMigrations[0];\n\n\tfor await (const migration of migrations) {\n\t\tif (!lastDbMigration || Number(lastDbMigration.created_at) < migration.folderMillis) {\n\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\tawait db.session.execute(sql.raw(stmt));\n\t\t\t}\n\n\t\t\tawait db.session.execute(\n\t\t\t\tsql`insert into ${\n\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t} (\"hash\", \"created_at\") values(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "drizzle-orm/src/xata-http/session.ts",
    "content": "import type { SQLPluginResult, SQLQueryResult } from '@xata.io/client';\nimport type { Cache } from '~/cache/core/index.ts';\nimport { NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgTransaction } from '~/pg-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport { PgPreparedQuery, PgSession } from '~/pg-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query } from '~/sql/sql.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport type XataHttpClient = {\n\tsql: SQLPluginResult;\n};\n\nexport interface QueryResults<ArrayMode extends 'json' | 'array'> {\n\trowCount: number;\n\trows: ArrayMode extends 'array' ? any[][] : Record<string, any>[];\n\trowAsArray: ArrayMode extends 'array' ? true : false;\n}\n\nexport class XataHttpPreparedQuery<T extends PreparedQueryConfig> extends PgPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'XataHttpPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: XataHttpClient,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t) {\n\t\tsuper(query, cache, queryMetadata, cacheConfig);\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\n\t\tthis.logger.logQuery(this.query.sql, params);\n\n\t\tconst { fields, client, query, customResultMapper, joinsNotNullableMap } = this;\n\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn this.queryWithCache(query.sql, params, async () => {\n\t\t\t\treturn await client.sql<Record<string, any>>({ statement: query.sql, params });\n\t\t\t});\n\t\t}\n\n\t\tconst { rows, warning } = await this.queryWithCache(query.sql, params, async () => {\n\t\t\treturn await client.sql({ statement: query.sql, params, responseType: 'array' });\n\t\t});\n\n\t\tif (warning) console.warn(warning);\n\n\t\treturn customResultMapper\n\t\t\t? customResultMapper(rows as unknown[][])\n\t\t\t: rows.map((row) => mapResultRow<T['execute']>(fields!, row as unknown[], joinsNotNullableMap));\n\t}\n\n\tall(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['all']> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.queryWithCache(this.query.sql, params, async () => {\n\t\t\treturn this.client.sql({ statement: this.query.sql, params, responseType: 'array' });\n\t\t}).then((result) => result.rows);\n\t}\n\n\tvalues(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['values']> {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.queryWithCache(this.query.sql, params, async () => {\n\t\t\treturn this.client.sql({ statement: this.query.sql, params });\n\t\t}).then((result) => result.records);\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode() {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport interface XataHttpSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class XataHttpSession<TFullSchema extends Record<string, unknown>, TSchema extends TablesRelationalConfig>\n\textends PgSession<\n\t\tXataHttpQueryResultHKT,\n\t\tTFullSchema,\n\t\tTSchema\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'XataHttpSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: XataHttpClient,\n\t\tdialect: PgDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: XataHttpSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgPreparedQuery<T> {\n\t\treturn new XataHttpPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\tasync query(query: string, params: unknown[]): Promise<QueryResults<'array'>> {\n\t\tthis.logger.logQuery(query, params);\n\t\tconst result = await this.client.sql({ statement: query, params, responseType: 'array' });\n\n\t\treturn {\n\t\t\trowCount: result.rows.length,\n\t\t\trows: result.rows,\n\t\t\trowAsArray: true,\n\t\t};\n\t}\n\n\tasync queryObjects(query: string, params: unknown[]): Promise<QueryResults<'json'>> {\n\t\tconst result = await this.client.sql<Record<string, any>>({ statement: query, params });\n\n\t\treturn {\n\t\t\trowCount: result.records.length,\n\t\t\trows: result.records,\n\t\t\trowAsArray: false,\n\t\t};\n\t}\n\n\toverride async transaction<T>(\n\t\t_transaction: (tx: XataTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t_config: PgTransactionConfig = {},\n\t): Promise<T> {\n\t\tthrow new Error('No transactions support in Xata Http driver');\n\t}\n}\n\nexport class XataTransaction<TFullSchema extends Record<string, unknown>, TSchema extends TablesRelationalConfig>\n\textends PgTransaction<\n\t\tXataHttpQueryResultHKT,\n\t\tTFullSchema,\n\t\tTSchema\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'XataHttpTransaction';\n\n\toverride async transaction<T>(_transaction: (tx: XataTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T> {\n\t\tthrow new Error('No transactions support in Xata Http driver');\n\t}\n}\n\nexport interface XataHttpQueryResultHKT extends PgQueryResultHKT {\n\ttype: SQLQueryResult<this['row']>;\n}\n"
  },
  {
    "path": "drizzle-orm/tests/casing/casing.test.ts",
    "content": "import { describe, it } from 'vitest';\nimport { toCamelCase, toSnakeCase } from '~/casing';\n\ndescribe.concurrent('casing', () => {\n\tit('transforms to snake case', ({ expect }) => {\n\t\texpect(toSnakeCase('drizzleKit')).toEqual('drizzle_kit');\n\t});\n\n\tit('transforms an uppercase acronym/abbreviation to snake case', ({ expect }) => {\n\t\texpect(toSnakeCase('drizzleORM')).toEqual('drizzle_orm');\n\t});\n\n\tit('transforms a camel case acronym/abbreviation to snake case', ({ expect }) => {\n\t\texpect(toSnakeCase('drizzleOrm')).toEqual('drizzle_orm');\n\t});\n\n\tit('transforms an uppercase acronym/abbreviation followed by a word to snake case', ({ expect }) => {\n\t\texpect(toSnakeCase('drizzleORMAndKit')).toEqual('drizzle_orm_and_kit');\n\t});\n\n\tit('transforms a camel case acronym/abbreviation followed by a word to snake case', ({ expect }) => {\n\t\texpect(toSnakeCase('drizzleOrmAndKit')).toEqual('drizzle_orm_and_kit');\n\t});\n\n\tit('transforms to camel case 1', ({ expect }) => {\n\t\texpect(toCamelCase('drizzle_kit')).toEqual('drizzleKit');\n\t});\n});\n"
  },
  {
    "path": "drizzle-orm/tests/casing/mysql-to-camel.test.ts",
    "content": "import { Client } from '@planetscale/database';\nimport { connect } from '@tidbcloud/serverless';\nimport { beforeEach, describe, it } from 'vitest';\nimport { alias, boolean, int, mysqlSchema, mysqlTable, serial, text, union } from '~/mysql-core';\nimport { drizzle as planetscale } from '~/planetscale-serverless';\nimport { relations } from '~/relations';\nimport { asc, eq, sql } from '~/sql';\nimport { drizzle as mysql } from '~/tidb-serverless';\n\nconst testSchema = mysqlSchema('test');\nconst users = mysqlTable('users', {\n\tid: serial().primaryKey(),\n\tfirst_name: text().notNull(),\n\tlast_name: text().notNull(),\n\t// Test that custom aliases remain\n\tage: int('AGE'),\n});\nconst usersRelations = relations(users, ({ one }) => ({\n\tdevelopers: one(developers),\n}));\nconst developers = testSchema.table('developers', {\n\tuser_id: serial().primaryKey().references(() => users.id),\n\tuses_drizzle_orm: boolean().notNull(),\n});\nconst developersRelations = relations(developers, ({ one }) => ({\n\tuser: one(users, {\n\t\tfields: [developers.user_id],\n\t\treferences: [users.id],\n\t}),\n}));\nconst devs = alias(developers, 'devs');\nconst schema = { users, usersRelations, developers, developersRelations };\n\nconst db = mysql(connect({}), { schema, casing: 'camelCase' });\nconst ps = planetscale(new Client({}), { schema, casing: 'camelCase' });\n\nconst usersCache = {\n\t'public.users.id': 'id',\n\t'public.users.first_name': 'firstName',\n\t'public.users.last_name': 'lastName',\n\t'public.users.AGE': 'age',\n};\nconst developersCache = {\n\t'test.developers.user_id': 'userId',\n\t'test.developers.uses_drizzle_orm': 'usesDrizzleOrm',\n};\nconst cache = {\n\t...usersCache,\n\t...developersCache,\n};\n\nconst fullName = sql`${users.first_name} || ' ' || ${users.last_name}`.as('name');\n\ndescribe('mysql to snake case', () => {\n\tbeforeEach(() => {\n\t\tps.dialect.casing.clearCache();\n\t\tdb.dialect.casing.clearCache();\n\t});\n\n\tit('select', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ name: fullName, age: users.age })\n\t\t\t.from(users)\n\t\t\t.leftJoin(developers, eq(users.id, developers.user_id))\n\t\t\t.orderBy(asc(users.first_name));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t\"select `users`.`firstName` || ' ' || `users`.`lastName` as `name`, `users`.`AGE` from `users` left join `test`.`developers` on `users`.`id` = `test`.`developers`.`userId` order by `users`.`firstName` asc\",\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('select (with alias)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ firstName: users.first_name })\n\t\t\t.from(users)\n\t\t\t.leftJoin(devs, eq(users.id, devs.user_id));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select `users`.`firstName` from `users` left join `test`.`developers` `devs` on `users`.`id` = `devs`.`userId`',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('with CTE', ({ expect }) => {\n\t\tconst cte = db.$with('cte').as(db.select({ name: fullName }).from(users));\n\t\tconst query = db.with(cte).select().from(cte);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: \"with `cte` as (select `firstName` || ' ' || `lastName` as `name` from `users`) select `name` from `cte`\",\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('with CTE (with query builder)', ({ expect }) => {\n\t\tconst cte = db.$with('cte').as((qb) => qb.select({ name: fullName }).from(users));\n\t\tconst query = db.with(cte).select().from(cte);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: \"with `cte` as (select `firstName` || ' ' || `lastName` as `name` from `users`) select `name` from `cte`\",\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('set operator', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ firstName: users.first_name })\n\t\t\t.from(users)\n\t\t\t.union(db.select({ firstName: users.first_name }).from(users));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: '(select `firstName` from `users`) union (select `firstName` from `users`)',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('set operator (function)', ({ expect }) => {\n\t\tconst query = union(\n\t\t\tdb.select({ firstName: users.first_name }).from(users),\n\t\t\tdb.select({ firstName: users.first_name }).from(users),\n\t\t);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: '(select `firstName` from `users`) union (select `firstName` from `users`)',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('query (find first)', ({ expect }) => {\n\t\tconst query = db.query.users.findFirst({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tuses_drizzle_orm: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t\"select `users`.`id`, `users`.`AGE`, `users`.`firstName` || ' ' || `users`.`lastName` as `name`, `users_developers`.`data` as `developers` from `users` `users` left join lateral (select json_array(`users_developers`.`usesDrizzleOrm`) as `data` from (select * from `test`.`developers` `users_developers` where `users_developers`.`userId` = `users`.`id` limit ?) `users_developers`) `users_developers` on true where `users`.`id` = ? limit ?\",\n\t\t\tparams: [1, 1, 1],\n\t\t\ttypings: ['none', 'none', 'none'],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('query (find first, planetscale)', ({ expect }) => {\n\t\tconst query = ps.query.users.findFirst({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tuses_drizzle_orm: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t\"select `id`, `AGE`, `firstName` || ' ' || `lastName` as `name`, (select json_array(`usesDrizzleOrm`) from (select * from `test`.`developers` `users_developers` where `users_developers`.`userId` = `users`.`id` limit ?) `users_developers`) as `developers` from `users` `users` where `users`.`id` = ? limit ?\",\n\t\t\tparams: [1, 1, 1],\n\t\t\ttypings: ['none', 'none', 'none'],\n\t\t});\n\t\texpect(ps.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('query (find many)', ({ expect }) => {\n\t\tconst query = db.query.users.findMany({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tuses_drizzle_orm: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t\"select `users`.`id`, `users`.`AGE`, `users`.`firstName` || ' ' || `users`.`lastName` as `name`, `users_developers`.`data` as `developers` from `users` `users` left join lateral (select json_array(`users_developers`.`usesDrizzleOrm`) as `data` from (select * from `test`.`developers` `users_developers` where `users_developers`.`userId` = `users`.`id` limit ?) `users_developers`) `users_developers` on true where `users`.`id` = ?\",\n\t\t\tparams: [1, 1],\n\t\t\ttypings: ['none', 'none'],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('query (find many, planetscale)', ({ expect }) => {\n\t\tconst query = ps.query.users.findMany({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tuses_drizzle_orm: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t\"select `id`, `AGE`, `firstName` || ' ' || `lastName` as `name`, (select json_array(`usesDrizzleOrm`) from (select * from `test`.`developers` `users_developers` where `users_developers`.`userId` = `users`.`id` limit ?) `users_developers`) as `developers` from `users` `users` where `users`.`id` = ?\",\n\t\t\tparams: [1, 1],\n\t\t\ttypings: ['none', 'none'],\n\t\t});\n\t\texpect(ps.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('insert', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.insert(users)\n\t\t\t.values({ first_name: 'John', last_name: 'Doe', age: 30 });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'insert into `users` (`id`, `firstName`, `lastName`, `AGE`) values (default, ?, ?, ?)',\n\t\t\tparams: ['John', 'Doe', 30],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('insert (on duplicate key update)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.insert(users)\n\t\t\t.values({ first_name: 'John', last_name: 'Doe', age: 30 })\n\t\t\t.onDuplicateKeyUpdate({ set: { age: 31 } });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into `users` (`id`, `firstName`, `lastName`, `AGE`) values (default, ?, ?, ?) on duplicate key update `AGE` = ?',\n\t\t\tparams: ['John', 'Doe', 30, 31],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('update', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.update(users)\n\t\t\t.set({ first_name: 'John', last_name: 'Doe', age: 30 })\n\t\t\t.where(eq(users.id, 1));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'update `users` set `firstName` = ?, `lastName` = ?, `AGE` = ? where `users`.`id` = ?',\n\t\t\tparams: ['John', 'Doe', 30, 1],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('delete', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.delete(users)\n\t\t\t.where(eq(users.id, 1));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'delete from `users` where `users`.`id` = ?',\n\t\t\tparams: [1],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n});\n"
  },
  {
    "path": "drizzle-orm/tests/casing/mysql-to-snake.test.ts",
    "content": "import { Client } from '@planetscale/database';\nimport { connect } from '@tidbcloud/serverless';\nimport { beforeEach, describe, it } from 'vitest';\nimport { alias, boolean, int, mysqlSchema, mysqlTable, serial, text, union } from '~/mysql-core';\nimport { drizzle as planetscale } from '~/planetscale-serverless';\nimport { relations } from '~/relations';\nimport { asc, eq, sql } from '~/sql';\nimport { drizzle as mysql } from '~/tidb-serverless';\n\nconst testSchema = mysqlSchema('test');\nconst users = mysqlTable('users', {\n\tid: serial().primaryKey(),\n\tfirstName: text().notNull(),\n\tlastName: text().notNull(),\n\t// Test that custom aliases remain\n\tage: int('AGE'),\n});\nconst usersRelations = relations(users, ({ one }) => ({\n\tdevelopers: one(developers),\n}));\nconst developers = testSchema.table('developers', {\n\tuserId: serial().primaryKey().references(() => users.id),\n\tusesDrizzleORM: boolean().notNull(),\n});\nconst developersRelations = relations(developers, ({ one }) => ({\n\tuser: one(users, {\n\t\tfields: [developers.userId],\n\t\treferences: [users.id],\n\t}),\n}));\nconst devs = alias(developers, 'devs');\nconst schema = { users, usersRelations, developers, developersRelations };\n\nconst db = mysql(connect({}), { schema, casing: 'snake_case' });\nconst ps = planetscale(new Client({}), { schema, casing: 'snake_case' });\n\nconst usersCache = {\n\t'public.users.id': 'id',\n\t'public.users.firstName': 'first_name',\n\t'public.users.lastName': 'last_name',\n\t'public.users.AGE': 'age',\n};\nconst developersCache = {\n\t'test.developers.userId': 'user_id',\n\t'test.developers.usesDrizzleORM': 'uses_drizzle_orm',\n};\nconst cache = {\n\t...usersCache,\n\t...developersCache,\n};\n\nconst fullName = sql`${users.firstName} || ' ' || ${users.lastName}`.as('name');\n\ndescribe('mysql to snake case', () => {\n\tbeforeEach(() => {\n\t\tdb.dialect.casing.clearCache();\n\t\tps.dialect.casing.clearCache();\n\t});\n\n\tit('select', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ name: fullName, age: users.age })\n\t\t\t.from(users)\n\t\t\t.leftJoin(developers, eq(users.id, developers.userId))\n\t\t\t.orderBy(asc(users.firstName));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t\"select `users`.`first_name` || ' ' || `users`.`last_name` as `name`, `users`.`AGE` from `users` left join `test`.`developers` on `users`.`id` = `test`.`developers`.`user_id` order by `users`.`first_name` asc\",\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('select (with alias)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ firstName: users.firstName })\n\t\t\t.from(users)\n\t\t\t.leftJoin(devs, eq(users.id, devs.userId));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select `users`.`first_name` from `users` left join `test`.`developers` `devs` on `users`.`id` = `devs`.`user_id`',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('with CTE', ({ expect }) => {\n\t\tconst cte = db.$with('cte').as(db.select({ name: fullName }).from(users));\n\t\tconst query = db.with(cte).select().from(cte);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: \"with `cte` as (select `first_name` || ' ' || `last_name` as `name` from `users`) select `name` from `cte`\",\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('with CTE (with query builder)', ({ expect }) => {\n\t\tconst cte = db.$with('cte').as((qb) => qb.select({ name: fullName }).from(users));\n\t\tconst query = db.with(cte).select().from(cte);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: \"with `cte` as (select `first_name` || ' ' || `last_name` as `name` from `users`) select `name` from `cte`\",\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('set operator', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ firstName: users.firstName })\n\t\t\t.from(users)\n\t\t\t.union(db.select({ firstName: users.firstName }).from(users));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: '(select `first_name` from `users`) union (select `first_name` from `users`)',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('set operator (function)', ({ expect }) => {\n\t\tconst query = union(\n\t\t\tdb.select({ firstName: users.firstName }).from(users),\n\t\t\tdb.select({ firstName: users.firstName }).from(users),\n\t\t);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: '(select `first_name` from `users`) union (select `first_name` from `users`)',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('query (find first)', ({ expect }) => {\n\t\tconst query = db.query.users.findFirst({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tusesDrizzleORM: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t\"select `users`.`id`, `users`.`AGE`, `users`.`first_name` || ' ' || `users`.`last_name` as `name`, `users_developers`.`data` as `developers` from `users` `users` left join lateral (select json_array(`users_developers`.`uses_drizzle_orm`) as `data` from (select * from `test`.`developers` `users_developers` where `users_developers`.`user_id` = `users`.`id` limit ?) `users_developers`) `users_developers` on true where `users`.`id` = ? limit ?\",\n\t\t\tparams: [1, 1, 1],\n\t\t\ttypings: ['none', 'none', 'none'],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('query (find first, planetscale)', ({ expect }) => {\n\t\tconst query = ps.query.users.findFirst({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tusesDrizzleORM: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t\"select `id`, `AGE`, `first_name` || ' ' || `last_name` as `name`, (select json_array(`uses_drizzle_orm`) from (select * from `test`.`developers` `users_developers` where `users_developers`.`user_id` = `users`.`id` limit ?) `users_developers`) as `developers` from `users` `users` where `users`.`id` = ? limit ?\",\n\t\t\tparams: [1, 1, 1],\n\t\t\ttypings: ['none', 'none', 'none'],\n\t\t});\n\t\texpect(ps.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('query (find many)', ({ expect }) => {\n\t\tconst query = db.query.users.findMany({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tusesDrizzleORM: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t\"select `users`.`id`, `users`.`AGE`, `users`.`first_name` || ' ' || `users`.`last_name` as `name`, `users_developers`.`data` as `developers` from `users` `users` left join lateral (select json_array(`users_developers`.`uses_drizzle_orm`) as `data` from (select * from `test`.`developers` `users_developers` where `users_developers`.`user_id` = `users`.`id` limit ?) `users_developers`) `users_developers` on true where `users`.`id` = ?\",\n\t\t\tparams: [1, 1],\n\t\t\ttypings: ['none', 'none'],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('query (find many, planetscale)', ({ expect }) => {\n\t\tconst query = ps.query.users.findMany({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tusesDrizzleORM: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t\"select `id`, `AGE`, `first_name` || ' ' || `last_name` as `name`, (select json_array(`uses_drizzle_orm`) from (select * from `test`.`developers` `users_developers` where `users_developers`.`user_id` = `users`.`id` limit ?) `users_developers`) as `developers` from `users` `users` where `users`.`id` = ?\",\n\t\t\tparams: [1, 1],\n\t\t\ttypings: ['none', 'none'],\n\t\t});\n\t\texpect(ps.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('insert', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.insert(users)\n\t\t\t.values({ firstName: 'John', lastName: 'Doe', age: 30 });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'insert into `users` (`id`, `first_name`, `last_name`, `AGE`) values (default, ?, ?, ?)',\n\t\t\tparams: ['John', 'Doe', 30],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('insert (on duplicate key update)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.insert(users)\n\t\t\t.values({ firstName: 'John', lastName: 'Doe', age: 30 })\n\t\t\t.onDuplicateKeyUpdate({ set: { age: 31 } });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into `users` (`id`, `first_name`, `last_name`, `AGE`) values (default, ?, ?, ?) on duplicate key update `AGE` = ?',\n\t\t\tparams: ['John', 'Doe', 30, 31],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('update', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.update(users)\n\t\t\t.set({ firstName: 'John', lastName: 'Doe', age: 30 })\n\t\t\t.where(eq(users.id, 1));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'update `users` set `first_name` = ?, `last_name` = ?, `AGE` = ? where `users`.`id` = ?',\n\t\t\tparams: ['John', 'Doe', 30, 1],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('delete', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.delete(users)\n\t\t\t.where(eq(users.id, 1));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'delete from `users` where `users`.`id` = ?',\n\t\t\tparams: [1],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n});\n"
  },
  {
    "path": "drizzle-orm/tests/casing/pg-to-camel.test.ts",
    "content": "import postgres from 'postgres';\nimport { beforeEach, describe, it } from 'vitest';\nimport { alias, boolean, integer, pgSchema, pgTable, serial, text, union } from '~/pg-core';\nimport { drizzle } from '~/postgres-js';\nimport { relations } from '~/relations';\nimport { asc, eq, sql } from '~/sql';\n\nconst testSchema = pgSchema('test');\nconst users = pgTable('users', {\n\tid: serial().primaryKey(),\n\tfirst_name: text().notNull(),\n\tlast_name: text().notNull(),\n\t// Test that custom aliases remain\n\tage: integer('AGE'),\n});\nconst usersRelations = relations(users, ({ one }) => ({\n\tdevelopers: one(developers),\n}));\nconst developers = testSchema.table('developers', {\n\tuser_id: serial().primaryKey().references(() => users.id),\n\tuses_drizzle_orm: boolean().notNull(),\n});\nconst developersRelations = relations(developers, ({ one }) => ({\n\tuser: one(users, {\n\t\tfields: [developers.user_id],\n\t\treferences: [users.id],\n\t}),\n}));\nconst devs = alias(developers, 'devs');\nconst schema = { users, usersRelations, developers, developersRelations };\n\nconst db = drizzle(postgres(''), { schema, casing: 'camelCase' });\n\nconst usersCache = {\n\t'public.users.id': 'id',\n\t'public.users.first_name': 'firstName',\n\t'public.users.last_name': 'lastName',\n\t'public.users.AGE': 'age',\n};\nconst developersCache = {\n\t'test.developers.user_id': 'userId',\n\t'test.developers.uses_drizzle_orm': 'usesDrizzleOrm',\n};\nconst cache = {\n\t...usersCache,\n\t...developersCache,\n};\n\nconst fullName = sql`${users.first_name} || ' ' || ${users.last_name}`.as('name');\n\ndescribe('postgres to camel case', () => {\n\tbeforeEach(() => {\n\t\tdb.dialect.casing.clearCache();\n\t});\n\n\tit('select', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ name: fullName, age: users.age })\n\t\t\t.from(users)\n\t\t\t.leftJoin(developers, eq(users.id, developers.user_id))\n\t\t\t.orderBy(asc(users.first_name));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"users\".\"firstName\" || \\' \\' || \"users\".\"lastName\" as \"name\", \"users\".\"AGE\" from \"users\" left join \"test\".\"developers\" on \"users\".\"id\" = \"test\".\"developers\".\"userId\" order by \"users\".\"firstName\" asc',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('select (with alias)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ first_name: users.first_name })\n\t\t\t.from(users)\n\t\t\t.leftJoin(devs, eq(users.id, devs.user_id));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"users\".\"firstName\" from \"users\" left join \"test\".\"developers\" \"devs\" on \"users\".\"id\" = \"devs\".\"userId\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('with CTE', ({ expect }) => {\n\t\tconst cte = db.$with('cte').as(db.select({ name: fullName }).from(users));\n\t\tconst query = db.with(cte).select().from(cte);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'with \"cte\" as (select \"firstName\" || \\' \\' || \"lastName\" as \"name\" from \"users\") select \"name\" from \"cte\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('with CTE (with query builder)', ({ expect }) => {\n\t\tconst cte = db.$with('cte').as((qb) => qb.select({ name: fullName }).from(users));\n\t\tconst query = db.with(cte).select().from(cte);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'with \"cte\" as (select \"firstName\" || \\' \\' || \"lastName\" as \"name\" from \"users\") select \"name\" from \"cte\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('set operator', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ first_name: users.first_name })\n\t\t\t.from(users)\n\t\t\t.union(db.select({ first_name: users.first_name }).from(users));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: '(select \"firstName\" from \"users\") union (select \"firstName\" from \"users\")',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('set operator (function)', ({ expect }) => {\n\t\tconst query = union(\n\t\t\tdb.select({ first_name: users.first_name }).from(users),\n\t\t\tdb.select({ first_name: users.first_name }).from(users),\n\t\t);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: '(select \"firstName\" from \"users\") union (select \"firstName\" from \"users\")',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('query (find first)', ({ expect }) => {\n\t\tconst query = db.query.users.findFirst({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tuses_drizzle_orm: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"users\".\"id\", \"users\".\"AGE\", \"users\".\"firstName\" || \\' \\' || \"users\".\"lastName\" as \"name\", \"users_developers\".\"data\" as \"developers\" from \"users\" \"users\" left join lateral (select json_build_array(\"users_developers\".\"usesDrizzleOrm\") as \"data\" from (select * from \"test\".\"developers\" \"users_developers\" where \"users_developers\".\"userId\" = \"users\".\"id\" limit $1) \"users_developers\") \"users_developers\" on true where \"users\".\"id\" = $2 limit $3',\n\t\t\tparams: [1, 1, 1],\n\t\t\ttypings: ['none', 'none', 'none'],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('query (find many)', ({ expect }) => {\n\t\tconst query = db.query.users.findMany({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tuses_drizzle_orm: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"users\".\"id\", \"users\".\"AGE\", \"users\".\"firstName\" || \\' \\' || \"users\".\"lastName\" as \"name\", \"users_developers\".\"data\" as \"developers\" from \"users\" \"users\" left join lateral (select json_build_array(\"users_developers\".\"usesDrizzleOrm\") as \"data\" from (select * from \"test\".\"developers\" \"users_developers\" where \"users_developers\".\"userId\" = \"users\".\"id\" limit $1) \"users_developers\") \"users_developers\" on true where \"users\".\"id\" = $2',\n\t\t\tparams: [1, 1],\n\t\t\ttypings: ['none', 'none'],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('insert (on conflict do nothing)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.insert(users)\n\t\t\t.values({ first_name: 'John', last_name: 'Doe', age: 30 })\n\t\t\t.onConflictDoNothing({ target: users.first_name })\n\t\t\t.returning({ first_name: users.first_name, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"users\" (\"id\", \"firstName\", \"lastName\", \"AGE\") values (default, $1, $2, $3) on conflict (\"firstName\") do nothing returning \"firstName\", \"AGE\"',\n\t\t\tparams: ['John', 'Doe', 30],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('insert (on conflict do update)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.insert(users)\n\t\t\t.values({ first_name: 'John', last_name: 'Doe', age: 30 })\n\t\t\t.onConflictDoUpdate({ target: users.first_name, set: { age: 31 } })\n\t\t\t.returning({ first_name: users.first_name, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"users\" (\"id\", \"firstName\", \"lastName\", \"AGE\") values (default, $1, $2, $3) on conflict (\"firstName\") do update set \"AGE\" = $4 returning \"firstName\", \"AGE\"',\n\t\t\tparams: ['John', 'Doe', 30, 31],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('update', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.update(users)\n\t\t\t.set({ first_name: 'John', last_name: 'Doe', age: 30 })\n\t\t\t.where(eq(users.id, 1))\n\t\t\t.returning({ first_name: users.first_name, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'update \"users\" set \"firstName\" = $1, \"lastName\" = $2, \"AGE\" = $3 where \"users\".\"id\" = $4 returning \"firstName\", \"AGE\"',\n\t\t\tparams: ['John', 'Doe', 30, 1],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('delete', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.delete(users)\n\t\t\t.where(eq(users.id, 1))\n\t\t\t.returning({ first_name: users.first_name, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'delete from \"users\" where \"users\".\"id\" = $1 returning \"firstName\", \"AGE\"',\n\t\t\tparams: [1],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n});\n"
  },
  {
    "path": "drizzle-orm/tests/casing/pg-to-snake.test.ts",
    "content": "import postgres from 'postgres';\nimport { beforeEach, describe, it } from 'vitest';\nimport { alias, boolean, integer, pgSchema, pgTable, serial, text, union } from '~/pg-core';\nimport { drizzle } from '~/postgres-js';\nimport { relations } from '~/relations';\nimport { asc, eq, sql } from '~/sql';\n\nconst testSchema = pgSchema('test');\nconst users = pgTable('users', {\n\tid: serial().primaryKey(),\n\tfirstName: text().notNull(),\n\tlastName: text().notNull(),\n\t// Test that custom aliases remain\n\tage: integer('AGE'),\n});\nconst usersRelations = relations(users, ({ one }) => ({\n\tdevelopers: one(developers),\n}));\nconst developers = testSchema.table('developers', {\n\tuserId: serial().primaryKey().references(() => users.id),\n\tusesDrizzleORM: boolean().notNull(),\n});\nconst developersRelations = relations(developers, ({ one }) => ({\n\tuser: one(users, {\n\t\tfields: [developers.userId],\n\t\treferences: [users.id],\n\t}),\n}));\nconst devs = alias(developers, 'devs');\nconst schema = { users, usersRelations, developers, developersRelations };\n\nconst db = drizzle(postgres(''), { schema, casing: 'snake_case' });\n\nconst usersCache = {\n\t'public.users.id': 'id',\n\t'public.users.firstName': 'first_name',\n\t'public.users.lastName': 'last_name',\n\t'public.users.AGE': 'age',\n};\nconst developersCache = {\n\t'test.developers.userId': 'user_id',\n\t'test.developers.usesDrizzleORM': 'uses_drizzle_orm',\n};\nconst cache = {\n\t...usersCache,\n\t...developersCache,\n};\n\nconst fullName = sql`${users.firstName} || ' ' || ${users.lastName}`.as('name');\n\ndescribe('postgres to snake case', () => {\n\tbeforeEach(() => {\n\t\tdb.dialect.casing.clearCache();\n\t});\n\n\tit('select', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ name: fullName, age: users.age })\n\t\t\t.from(users)\n\t\t\t.leftJoin(developers, eq(users.id, developers.userId))\n\t\t\t.orderBy(asc(users.firstName));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"users\".\"first_name\" || \\' \\' || \"users\".\"last_name\" as \"name\", \"users\".\"AGE\" from \"users\" left join \"test\".\"developers\" on \"users\".\"id\" = \"test\".\"developers\".\"user_id\" order by \"users\".\"first_name\" asc',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('select (with alias)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ firstName: users.firstName })\n\t\t\t.from(users)\n\t\t\t.leftJoin(devs, eq(users.id, devs.userId));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"users\".\"first_name\" from \"users\" left join \"test\".\"developers\" \"devs\" on \"users\".\"id\" = \"devs\".\"user_id\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('with CTE', ({ expect }) => {\n\t\tconst cte = db.$with('cte').as(db.select({ name: fullName }).from(users));\n\t\tconst query = db.with(cte).select().from(cte);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'with \"cte\" as (select \"first_name\" || \\' \\' || \"last_name\" as \"name\" from \"users\") select \"name\" from \"cte\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('with CTE (with query builder)', ({ expect }) => {\n\t\tconst cte = db.$with('cte').as((qb) => qb.select({ name: fullName }).from(users));\n\t\tconst query = db.with(cte).select().from(cte);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'with \"cte\" as (select \"first_name\" || \\' \\' || \"last_name\" as \"name\" from \"users\") select \"name\" from \"cte\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('set operator', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ firstName: users.firstName })\n\t\t\t.from(users)\n\t\t\t.union(db.select({ firstName: users.firstName }).from(users));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: '(select \"first_name\" from \"users\") union (select \"first_name\" from \"users\")',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('set operator (function)', ({ expect }) => {\n\t\tconst query = union(\n\t\t\tdb.select({ firstName: users.firstName }).from(users),\n\t\t\tdb.select({ firstName: users.firstName }).from(users),\n\t\t);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: '(select \"first_name\" from \"users\") union (select \"first_name\" from \"users\")',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('query (find first)', ({ expect }) => {\n\t\tconst query = db.query.users.findFirst({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tusesDrizzleORM: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"users\".\"id\", \"users\".\"AGE\", \"users\".\"first_name\" || \\' \\' || \"users\".\"last_name\" as \"name\", \"users_developers\".\"data\" as \"developers\" from \"users\" \"users\" left join lateral (select json_build_array(\"users_developers\".\"uses_drizzle_orm\") as \"data\" from (select * from \"test\".\"developers\" \"users_developers\" where \"users_developers\".\"user_id\" = \"users\".\"id\" limit $1) \"users_developers\") \"users_developers\" on true where \"users\".\"id\" = $2 limit $3',\n\t\t\tparams: [1, 1, 1],\n\t\t\ttypings: ['none', 'none', 'none'],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('query (find many)', ({ expect }) => {\n\t\tconst query = db.query.users.findMany({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tusesDrizzleORM: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"users\".\"id\", \"users\".\"AGE\", \"users\".\"first_name\" || \\' \\' || \"users\".\"last_name\" as \"name\", \"users_developers\".\"data\" as \"developers\" from \"users\" \"users\" left join lateral (select json_build_array(\"users_developers\".\"uses_drizzle_orm\") as \"data\" from (select * from \"test\".\"developers\" \"users_developers\" where \"users_developers\".\"user_id\" = \"users\".\"id\" limit $1) \"users_developers\") \"users_developers\" on true where \"users\".\"id\" = $2',\n\t\t\tparams: [1, 1],\n\t\t\ttypings: ['none', 'none'],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('insert (on conflict do nothing)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.insert(users)\n\t\t\t.values({ firstName: 'John', lastName: 'Doe', age: 30 })\n\t\t\t.onConflictDoNothing({ target: users.firstName })\n\t\t\t.returning({ firstName: users.firstName, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"users\" (\"id\", \"first_name\", \"last_name\", \"AGE\") values (default, $1, $2, $3) on conflict (\"first_name\") do nothing returning \"first_name\", \"AGE\"',\n\t\t\tparams: ['John', 'Doe', 30],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('insert (on conflict do update)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.insert(users)\n\t\t\t.values({ firstName: 'John', lastName: 'Doe', age: 30 })\n\t\t\t.onConflictDoUpdate({ target: users.firstName, set: { age: 31 } })\n\t\t\t.returning({ firstName: users.firstName, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"users\" (\"id\", \"first_name\", \"last_name\", \"AGE\") values (default, $1, $2, $3) on conflict (\"first_name\") do update set \"AGE\" = $4 returning \"first_name\", \"AGE\"',\n\t\t\tparams: ['John', 'Doe', 30, 31],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('update', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.update(users)\n\t\t\t.set({ firstName: 'John', lastName: 'Doe', age: 30 })\n\t\t\t.where(eq(users.id, 1))\n\t\t\t.returning({ firstName: users.firstName, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'update \"users\" set \"first_name\" = $1, \"last_name\" = $2, \"AGE\" = $3 where \"users\".\"id\" = $4 returning \"first_name\", \"AGE\"',\n\t\t\tparams: ['John', 'Doe', 30, 1],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('delete', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.delete(users)\n\t\t\t.where(eq(users.id, 1))\n\t\t\t.returning({ firstName: users.firstName, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'delete from \"users\" where \"users\".\"id\" = $1 returning \"first_name\", \"AGE\"',\n\t\t\tparams: [1],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n});\n"
  },
  {
    "path": "drizzle-orm/tests/casing/sqlite-to-camel.test.ts",
    "content": "import Database from 'better-sqlite3';\nimport { beforeEach, describe, it } from 'vitest';\nimport { drizzle } from '~/better-sqlite3';\nimport { relations } from '~/relations';\nimport { asc, eq, sql } from '~/sql';\nimport { alias, integer, sqliteTable, text, union } from '~/sqlite-core';\n\nconst users = sqliteTable('users', {\n\tid: integer().primaryKey({ autoIncrement: true }),\n\tfirst_name: text().notNull(),\n\tlast_name: text().notNull(),\n\t// Test that custom aliases remain\n\tage: integer('AGE'),\n});\nconst usersRelations = relations(users, ({ one }) => ({\n\tdevelopers: one(developers),\n}));\nconst developers = sqliteTable('developers', {\n\tuser_id: integer().primaryKey().references(() => users.id),\n\tuses_drizzle_orm: integer({ mode: 'boolean' }).notNull(),\n});\nconst developersRelations = relations(developers, ({ one }) => ({\n\tuser: one(users, {\n\t\tfields: [developers.user_id],\n\t\treferences: [users.id],\n\t}),\n}));\nconst devs = alias(developers, 'devs');\nconst schema = { users, usersRelations, developers, developersRelations };\n\nconst db = drizzle(new Database(':memory:'), { schema, casing: 'camelCase' });\n\nconst usersCache = {\n\t'public.users.id': 'id',\n\t'public.users.first_name': 'firstName',\n\t'public.users.last_name': 'lastName',\n\t'public.users.AGE': 'age',\n};\nconst developersCache = {\n\t'public.developers.user_id': 'userId',\n\t'public.developers.uses_drizzle_orm': 'usesDrizzleOrm',\n};\nconst cache = {\n\t...usersCache,\n\t...developersCache,\n};\n\nconst fullName = sql`${users.first_name} || ' ' || ${users.last_name}`.as('name');\n\ndescribe('sqlite to camel case', () => {\n\tbeforeEach(() => {\n\t\tdb.dialect.casing.clearCache();\n\t});\n\n\tit('select', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ name: fullName, age: users.age })\n\t\t\t.from(users)\n\t\t\t.leftJoin(developers, eq(users.id, developers.user_id))\n\t\t\t.orderBy(asc(users.first_name));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"users\".\"firstName\" || \\' \\' || \"users\".\"lastName\" as \"name\", \"users\".\"AGE\" from \"users\" left join \"developers\" on \"users\".\"id\" = \"developers\".\"userId\" order by \"users\".\"firstName\" asc',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('select (with alias)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ first_name: users.first_name })\n\t\t\t.from(users)\n\t\t\t.leftJoin(devs, eq(users.id, devs.user_id));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'select \"users\".\"firstName\" from \"users\" left join \"developers\" \"devs\" on \"users\".\"id\" = \"devs\".\"userId\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('with CTE', ({ expect }) => {\n\t\tconst cte = db.$with('cte').as(db.select({ name: fullName }).from(users));\n\t\tconst query = db.with(cte).select().from(cte);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'with \"cte\" as (select \"firstName\" || \\' \\' || \"lastName\" as \"name\" from \"users\") select \"name\" from \"cte\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('with CTE (with query builder)', ({ expect }) => {\n\t\tconst cte = db.$with('cte').as((qb) => qb.select({ name: fullName }).from(users));\n\t\tconst query = db.with(cte).select().from(cte);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'with \"cte\" as (select \"firstName\" || \\' \\' || \"lastName\" as \"name\" from \"users\") select \"name\" from \"cte\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('set operator', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ first_name: users.first_name })\n\t\t\t.from(users)\n\t\t\t.union(db.select({ first_name: users.first_name }).from(users));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'select \"firstName\" from \"users\" union select \"firstName\" from \"users\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('set operator (function)', ({ expect }) => {\n\t\tconst query = union(\n\t\t\tdb.select({ first_name: users.first_name }).from(users),\n\t\t\tdb.select({ first_name: users.first_name }).from(users),\n\t\t);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'select \"firstName\" from \"users\" union select \"firstName\" from \"users\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('query (find first)', ({ expect }) => {\n\t\tconst query = db.query.users.findFirst({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tuses_drizzle_orm: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"id\", \"AGE\", \"firstName\" || \\' \\' || \"lastName\" as \"name\", (select json_array(\"usesDrizzleOrm\") as \"data\" from (select * from \"developers\" \"users_developers\" where \"users_developers\".\"userId\" = \"users\".\"id\" limit ?) \"users_developers\") as \"developers\" from \"users\" \"users\" where \"users\".\"id\" = ? limit ?',\n\t\t\tparams: [1, 1, 1],\n\t\t\ttypings: ['none', 'none', 'none'],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('query (find many)', ({ expect }) => {\n\t\tconst query = db.query.users.findMany({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tuses_drizzle_orm: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"id\", \"AGE\", \"firstName\" || \\' \\' || \"lastName\" as \"name\", (select json_array(\"usesDrizzleOrm\") as \"data\" from (select * from \"developers\" \"users_developers\" where \"users_developers\".\"userId\" = \"users\".\"id\" limit ?) \"users_developers\") as \"developers\" from \"users\" \"users\" where \"users\".\"id\" = ?',\n\t\t\tparams: [1, 1],\n\t\t\ttypings: ['none', 'none'],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('insert (on conflict do nothing)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.insert(users)\n\t\t\t.values({ first_name: 'John', last_name: 'Doe', age: 30 })\n\t\t\t.onConflictDoNothing({ target: users.first_name })\n\t\t\t.returning({ first_name: users.first_name, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"users\" (\"id\", \"firstName\", \"lastName\", \"AGE\") values (null, ?, ?, ?) on conflict (\"users\".\"firstName\") do nothing returning \"firstName\", \"AGE\"',\n\t\t\tparams: ['John', 'Doe', 30],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('insert (on conflict do update)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.insert(users)\n\t\t\t.values({ first_name: 'John', last_name: 'Doe', age: 30 })\n\t\t\t.onConflictDoUpdate({ target: users.first_name, set: { age: 31 } })\n\t\t\t.returning({ first_name: users.first_name, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"users\" (\"id\", \"firstName\", \"lastName\", \"AGE\") values (null, ?, ?, ?) on conflict (\"users\".\"firstName\") do update set \"AGE\" = ? returning \"firstName\", \"AGE\"',\n\t\t\tparams: ['John', 'Doe', 30, 31],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('update', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.update(users)\n\t\t\t.set({ first_name: 'John', last_name: 'Doe', age: 30 })\n\t\t\t.where(eq(users.id, 1))\n\t\t\t.returning({ first_name: users.first_name, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'update \"users\" set \"firstName\" = ?, \"lastName\" = ?, \"AGE\" = ? where \"users\".\"id\" = ? returning \"firstName\", \"AGE\"',\n\t\t\tparams: ['John', 'Doe', 30, 1],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('delete', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.delete(users)\n\t\t\t.where(eq(users.id, 1))\n\t\t\t.returning({ first_name: users.first_name, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'delete from \"users\" where \"users\".\"id\" = ? returning \"firstName\", \"AGE\"',\n\t\t\tparams: [1],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n});\n"
  },
  {
    "path": "drizzle-orm/tests/casing/sqlite-to-snake.test.ts",
    "content": "import Database from 'better-sqlite3';\nimport { beforeEach, describe, it } from 'vitest';\nimport { drizzle } from '~/better-sqlite3';\nimport { relations } from '~/relations';\nimport { asc, eq, sql } from '~/sql';\nimport { alias, integer, sqliteTable, text, union } from '~/sqlite-core';\n\nconst users = sqliteTable('users', {\n\tid: integer().primaryKey({ autoIncrement: true }),\n\tfirstName: text().notNull(),\n\tlastName: text().notNull(),\n\t// Test that custom aliases remain\n\tage: integer('AGE'),\n});\nconst usersRelations = relations(users, ({ one }) => ({\n\tdevelopers: one(developers),\n}));\nconst developers = sqliteTable('developers', {\n\tuserId: integer().primaryKey().references(() => users.id),\n\tusesDrizzleORM: integer({ mode: 'boolean' }).notNull(),\n});\nconst developersRelations = relations(developers, ({ one }) => ({\n\tuser: one(users, {\n\t\tfields: [developers.userId],\n\t\treferences: [users.id],\n\t}),\n}));\nconst devs = alias(developers, 'devs');\nconst schema = { users, usersRelations, developers, developersRelations };\n\nconst db = drizzle(new Database(':memory:'), { schema, casing: 'snake_case' });\n\nconst usersCache = {\n\t'public.users.id': 'id',\n\t'public.users.firstName': 'first_name',\n\t'public.users.lastName': 'last_name',\n\t'public.users.AGE': 'age',\n};\nconst developersCache = {\n\t'public.developers.userId': 'user_id',\n\t'public.developers.usesDrizzleORM': 'uses_drizzle_orm',\n};\nconst cache = {\n\t...usersCache,\n\t...developersCache,\n};\n\nconst fullName = sql`${users.firstName} || ' ' || ${users.lastName}`.as('name');\n\ndescribe('sqlite to camel case', () => {\n\tbeforeEach(() => {\n\t\tdb.dialect.casing.clearCache();\n\t});\n\n\tit('select', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ name: fullName, age: users.age })\n\t\t\t.from(users)\n\t\t\t.leftJoin(developers, eq(users.id, developers.userId))\n\t\t\t.orderBy(asc(users.firstName));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"users\".\"first_name\" || \\' \\' || \"users\".\"last_name\" as \"name\", \"users\".\"AGE\" from \"users\" left join \"developers\" on \"users\".\"id\" = \"developers\".\"user_id\" order by \"users\".\"first_name\" asc',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('select (with alias)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ firstName: users.firstName })\n\t\t\t.from(users)\n\t\t\t.leftJoin(devs, eq(users.id, devs.userId));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'select \"users\".\"first_name\" from \"users\" left join \"developers\" \"devs\" on \"users\".\"id\" = \"devs\".\"user_id\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('with CTE', ({ expect }) => {\n\t\tconst cte = db.$with('cte').as(db.select({ name: fullName }).from(users));\n\t\tconst query = db.with(cte).select().from(cte);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'with \"cte\" as (select \"first_name\" || \\' \\' || \"last_name\" as \"name\" from \"users\") select \"name\" from \"cte\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('with CTE (with query builder)', ({ expect }) => {\n\t\tconst cte = db.$with('cte').as((qb) => qb.select({ name: fullName }).from(users));\n\t\tconst query = db.with(cte).select().from(cte);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'with \"cte\" as (select \"first_name\" || \\' \\' || \"last_name\" as \"name\" from \"users\") select \"name\" from \"cte\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('set operator', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.select({ firstName: users.firstName })\n\t\t\t.from(users)\n\t\t\t.union(db.select({ firstName: users.firstName }).from(users));\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'select \"first_name\" from \"users\" union select \"first_name\" from \"users\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('set operator (function)', ({ expect }) => {\n\t\tconst query = union(\n\t\t\tdb.select({ firstName: users.firstName }).from(users),\n\t\t\tdb.select({ firstName: users.firstName }).from(users),\n\t\t);\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'select \"first_name\" from \"users\" union select \"first_name\" from \"users\"',\n\t\t\tparams: [],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('query (find first)', ({ expect }) => {\n\t\tconst query = db.query.users.findFirst({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tusesDrizzleORM: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"id\", \"AGE\", \"first_name\" || \\' \\' || \"last_name\" as \"name\", (select json_array(\"uses_drizzle_orm\") as \"data\" from (select * from \"developers\" \"users_developers\" where \"users_developers\".\"user_id\" = \"users\".\"id\" limit ?) \"users_developers\") as \"developers\" from \"users\" \"users\" where \"users\".\"id\" = ? limit ?',\n\t\t\tparams: [1, 1, 1],\n\t\t\ttypings: ['none', 'none', 'none'],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('query (find many)', ({ expect }) => {\n\t\tconst query = db.query.users.findMany({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tage: true,\n\t\t\t},\n\t\t\textras: {\n\t\t\t\tfullName,\n\t\t\t},\n\t\t\twhere: eq(users.id, 1),\n\t\t\twith: {\n\t\t\t\tdevelopers: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tusesDrizzleORM: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"id\", \"AGE\", \"first_name\" || \\' \\' || \"last_name\" as \"name\", (select json_array(\"uses_drizzle_orm\") as \"data\" from (select * from \"developers\" \"users_developers\" where \"users_developers\".\"user_id\" = \"users\".\"id\" limit ?) \"users_developers\") as \"developers\" from \"users\" \"users\" where \"users\".\"id\" = ?',\n\t\t\tparams: [1, 1],\n\t\t\ttypings: ['none', 'none'],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(cache);\n\t});\n\n\tit('insert (on conflict do nothing)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.insert(users)\n\t\t\t.values({ firstName: 'John', lastName: 'Doe', age: 30 })\n\t\t\t.onConflictDoNothing({ target: users.firstName })\n\t\t\t.returning({ firstName: users.firstName, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"users\" (\"id\", \"first_name\", \"last_name\", \"AGE\") values (null, ?, ?, ?) on conflict (\"users\".\"first_name\") do nothing returning \"first_name\", \"AGE\"',\n\t\t\tparams: ['John', 'Doe', 30],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('insert (on conflict do update)', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.insert(users)\n\t\t\t.values({ firstName: 'John', lastName: 'Doe', age: 30 })\n\t\t\t.onConflictDoUpdate({ target: users.firstName, set: { age: 31 } })\n\t\t\t.returning({ firstName: users.firstName, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"users\" (\"id\", \"first_name\", \"last_name\", \"AGE\") values (null, ?, ?, ?) on conflict (\"users\".\"first_name\") do update set \"AGE\" = ? returning \"first_name\", \"AGE\"',\n\t\t\tparams: ['John', 'Doe', 30, 31],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('update', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.update(users)\n\t\t\t.set({ firstName: 'John', lastName: 'Doe', age: 30 })\n\t\t\t.where(eq(users.id, 1))\n\t\t\t.returning({ firstName: users.firstName, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql:\n\t\t\t\t'update \"users\" set \"first_name\" = ?, \"last_name\" = ?, \"AGE\" = ? where \"users\".\"id\" = ? returning \"first_name\", \"AGE\"',\n\t\t\tparams: ['John', 'Doe', 30, 1],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n\n\tit('delete', ({ expect }) => {\n\t\tconst query = db\n\t\t\t.delete(users)\n\t\t\t.where(eq(users.id, 1))\n\t\t\t.returning({ first_name: users.firstName, age: users.age });\n\n\t\texpect(query.toSQL()).toEqual({\n\t\t\tsql: 'delete from \"users\" where \"users\".\"id\" = ? returning \"first_name\", \"AGE\"',\n\t\t\tparams: [1],\n\t\t});\n\t\texpect(db.dialect.casing.cache).toEqual(usersCache);\n\t});\n});\n"
  },
  {
    "path": "drizzle-orm/tests/exports.test.ts",
    "content": "import { globSync } from 'glob';\nimport { Project } from 'ts-morph';\nimport { assert, test } from 'vitest';\n\nconst project = new Project({ tsConfigFilePath: './tsconfig.build.json' });\n\nconst filesList = globSync('src/**/*.ts');\n\nfor (const filePath of filesList) {\n\ttest(filePath, () => {\n\t\tconst conflicts: { name: string; files: [string, string] }[] = [];\n\t\tconst exports = new Map<string, string>();\n\n\t\tconst sourceFile = project.getSourceFileOrThrow(filePath);\n\n\t\tfor (const decl of sourceFile.getExportDeclarations()) {\n\t\t\tconst moduleSpecifier = decl.getModuleSpecifierValue();\n\t\t\tif (!moduleSpecifier || !moduleSpecifier.endsWith('.ts')) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst exportSourcePath = decl.getModuleSpecifierSourceFile()!.getFilePath();\n\t\t\tconst exported = project.getSourceFileOrThrow(exportSourcePath);\n\n\t\t\tfor (const symbol of exported.getExportSymbols()) {\n\t\t\t\tconst name = symbol.getName();\n\t\t\t\tconst from = exports.get(name);\n\t\t\t\tif (from) {\n\t\t\t\t\tconflicts.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tfiles: [from, moduleSpecifier],\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\texports.set(name, moduleSpecifier);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (conflicts.length) {\n\t\t\tassert.fail(\n\t\t\t\tconflicts.map(({ name, files }) => `\\n- ${name} is exported from ${files.join(' and ')}`).join('\\n'),\n\t\t\t);\n\t\t}\n\t});\n}\n"
  },
  {
    "path": "drizzle-orm/tests/is.test.ts",
    "content": "import { describe, test } from 'vitest';\nimport { Column, is } from '~/index.ts';\nimport { PgArray, PgColumn, PgSerial, pgTable, serial } from '~/pg-core/index.ts';\n\nconst pgExampleTable = pgTable('test', {\n\ta: serial('a').array(),\n});\n\ndescribe.concurrent('is', () => {\n\ttest('Column', ({ expect }) => {\n\t\texpect(is(pgExampleTable.a, Column)).toBe(true);\n\t\texpect(is(pgExampleTable.a, PgColumn)).toBe(true);\n\t\texpect(is(pgExampleTable.a, PgArray)).toBe(true);\n\t\texpect(is(pgExampleTable.a, PgSerial)).toBe(false);\n\t});\n});\n"
  },
  {
    "path": "drizzle-orm/tests/makePgArray.test.ts",
    "content": "import { describe, it } from 'vitest';\nimport { customType, pgTable } from '~/pg-core/index.ts';\n\nconst anyColumn = customType<{ data: any }>({\n\tdataType() {\n\t\treturn 'any';\n\t},\n});\n\nconst table = pgTable('test', {\n\ta: anyColumn('a').array(),\n\tb: anyColumn('a').array().array(),\n});\n\ndescribe.concurrent('makePgArray', () => {\n\tit('parses simple 1D array', ({ expect }) => {\n\t\tconst input = ['1', '2', '3'];\n\t\tconst output = table.a.mapToDriverValue(input);\n\t\texpect(output).toEqual('{\"1\",\"2\",\"3\"}');\n\t});\n\n\tit('parses simple 2D array', ({ expect }) => {\n\t\tconst input = [\n\t\t\t['1', '2', '3'],\n\t\t\t['4', '5', '6'],\n\t\t\t['7', '8', '9'],\n\t\t];\n\t\tconst output = table.b.mapToDriverValue(input);\n\t\texpect(output).toEqual('{{\"1\",\"2\",\"3\"},{\"4\",\"5\",\"6\"},{\"7\",\"8\",\"9\"}}');\n\t});\n\n\tit('parses array with quoted values', ({ expect }) => {\n\t\tconst input = ['1', '2,3', '4'];\n\t\tconst output = table.a.mapToDriverValue(input);\n\t\texpect(output).toEqual('{\"1\",\"2,3\",\"4\"}');\n\t});\n\n\tit('parses array with nested quoted values', ({ expect }) => {\n\t\tconst input = [\n\t\t\t['1', '2,3', '4'],\n\t\t\t['5', '6,7', '8'],\n\t\t];\n\t\tconst output = table.b.mapToDriverValue(input);\n\t\texpect(output).toEqual('{{\"1\",\"2,3\",\"4\"},{\"5\",\"6,7\",\"8\"}}');\n\t});\n\n\tit('parses array with empty values', ({ expect }) => {\n\t\tconst input = ['1', '', '3'];\n\t\tconst output = table.a.mapToDriverValue(input);\n\t\texpect(output).toEqual('{\"1\",\"\",\"3\"}');\n\t});\n\n\tit('parses array with empty nested values', ({ expect }) => {\n\t\tconst input = [\n\t\t\t['1', '2', '3'],\n\t\t\t['', '5', '6'],\n\t\t\t['7', '8', '9'],\n\t\t];\n\t\tconst output = table.b.mapToDriverValue(input);\n\t\texpect(output).toEqual('{{\"1\",\"2\",\"3\"},{\"\",\"5\",\"6\"},{\"7\",\"8\",\"9\"}}');\n\t});\n\n\tit('parses empty array', ({ expect }) => {\n\t\tconst input: string[] = [];\n\t\tconst output = table.a.mapToDriverValue(input);\n\t\texpect(output).toEqual('{}');\n\t});\n\n\tit('parses empty nested array', ({ expect }) => {\n\t\tconst input = [[]];\n\t\tconst output = table.b.mapToDriverValue(input);\n\t\texpect(output).toEqual('{{}}');\n\t});\n\n\tit('parses single-level array with strings', ({ expect }) => {\n\t\tconst input = ['one', 'two', 'three'];\n\t\tconst output = table.a.mapToDriverValue(input);\n\t\texpect(output).toEqual('{\"one\",\"two\",\"three\"}');\n\t});\n\n\tit('parses single-level array with mixed values', ({ expect }) => {\n\t\tconst input = ['1', 'two', '3'];\n\t\tconst output = table.a.mapToDriverValue(input);\n\t\texpect(output).toEqual('{\"1\",\"two\",\"3\"}');\n\t});\n\n\tit('parses single-level array with commas inside quotes', ({ expect }) => {\n\t\tconst input = ['1', 'two, three', '4'];\n\t\tconst output = table.a.mapToDriverValue(input);\n\t\texpect(output).toEqual('{\"1\",\"two, three\",\"4\"}');\n\t});\n\n\tit('parses single-level array with escaped quotes inside quotes', ({ expect }) => {\n\t\tconst input = ['1', 'two \"three\", four', '5'];\n\t\tconst output = table.a.mapToDriverValue(input);\n\t\texpect(output).toEqual('{\"1\",\"two \\\\\"three\\\\\", four\",\"5\"}');\n\t});\n\n\tit('parses two-dimensional array with strings', ({ expect }) => {\n\t\tconst input = [\n\t\t\t['one', 'two', 'three'],\n\t\t\t['four', 'five', 'six'],\n\t\t\t['seven', 'eight', 'nine'],\n\t\t];\n\t\tconst output = table.b.mapToDriverValue(input);\n\t\texpect(output).toEqual('{{\"one\",\"two\",\"three\"},{\"four\",\"five\",\"six\"},{\"seven\",\"eight\",\"nine\"}}');\n\t});\n\n\tit('parses two-dimensional array with mixed values and escaped quotes', ({ expect }) => {\n\t\tconst input = [\n\t\t\t['1', 'two \"and a half\", three', '3'],\n\t\t\t['four', 'five \"and a half\", six', '6'],\n\t\t\t['seven', 'eight', 'nine'],\n\t\t];\n\t\tconst output = table.b.mapToDriverValue(input);\n\t\texpect(output).toEqual(\n\t\t\t'{{\"1\",\"two \\\\\"and a half\\\\\", three\",\"3\"},{\"four\",\"five \\\\\"and a half\\\\\", six\",\"6\"},{\"seven\",\"eight\",\"nine\"}}',\n\t\t);\n\t});\n\n\tit('parses an array with null values', ({ expect }) => {\n\t\tconst input = ['1', null, '3'];\n\t\tconst output = table.a.mapToDriverValue(input);\n\t\texpect(output).toEqual('{\"1\",null,\"3\"}');\n\t});\n\n\tit('parses an array with null values in nested arrays', ({ expect }) => {\n\t\tconst input = [\n\t\t\t['1', '2', '3'],\n\t\t\t[null, '5', '6'],\n\t\t\t['7', '8', '9'],\n\t\t];\n\t\tconst output = table.b.mapToDriverValue(input);\n\t\texpect(output).toEqual('{{\"1\",\"2\",\"3\"},{null,\"5\",\"6\"},{\"7\",\"8\",\"9\"}}');\n\t});\n\n\tit('parses string array with empty strings', ({ expect }) => {\n\t\tconst input = ['1', '', '3'];\n\t\tconst output = table.a.mapToDriverValue(input);\n\t\texpect(output).toEqual('{\"1\",\"\",\"3\"}');\n\t});\n\n\tit('parses string array with backlash strings', ({ expect }) => {\n\t\tconst input = ['1', '\\n', '3\\\\'];\n\t\tconst output = table.a.mapToDriverValue(input);\n\t\texpect(output).toEqual('{\"1\",\"\\n\",\"3\\\\\\\\\"}');\n\t});\n});\n"
  },
  {
    "path": "drizzle-orm/tests/parsePgArray.test.ts",
    "content": "import { describe, it } from 'vitest';\nimport { customType, pgTable } from '~/pg-core/index.ts';\n\nconst anyColumn = customType<{ data: any }>({\n\tdataType() {\n\t\treturn 'any';\n\t},\n});\n\nconst table = pgTable('test', {\n\ta: anyColumn('a').array(),\n\tb: anyColumn('a').array().array(),\n});\n\ndescribe.concurrent('parsePgArray', () => {\n\tit('parses simple 1D array', ({ expect }) => {\n\t\tconst input = '{1,2,3}';\n\t\tconst output = table.a.mapFromDriverValue(input);\n\t\texpect(output).toEqual(['1', '2', '3']);\n\t});\n\n\tit('parses simple 2D array', ({ expect }) => {\n\t\tconst input = '{{1,2,3},{4,5,6},{7,8,9}}';\n\t\tconst output = table.b.mapFromDriverValue(input);\n\t\texpect(output).toEqual([\n\t\t\t['1', '2', '3'],\n\t\t\t['4', '5', '6'],\n\t\t\t['7', '8', '9'],\n\t\t]);\n\t});\n\n\tit('parses array with quoted values', ({ expect }) => {\n\t\tconst input = '{1,\"2,3\",4}';\n\t\tconst output = table.a.mapFromDriverValue(input);\n\t\texpect(output).toEqual(['1', '2,3', '4']);\n\t});\n\n\tit('parses array with nested quoted values', ({ expect }) => {\n\t\tconst input = '{{1,\"2,3\",4},{5,\"6,7\",8}}';\n\t\tconst output = table.b.mapFromDriverValue(input);\n\t\texpect(output).toEqual([\n\t\t\t['1', '2,3', '4'],\n\t\t\t['5', '6,7', '8'],\n\t\t]);\n\t});\n\n\tit('parses array with empty values', ({ expect }) => {\n\t\tconst input = '{1,\"\",3}';\n\t\tconst output = table.a.mapFromDriverValue(input);\n\t\texpect(output).toEqual(['1', '', '3']);\n\t});\n\n\tit('parses array with empty nested values', ({ expect }) => {\n\t\tconst input = '{{1,2,3},{,5,6},{7,8,9}}';\n\t\tconst output = table.b.mapFromDriverValue(input);\n\t\texpect(output).toEqual([\n\t\t\t['1', '2', '3'],\n\t\t\t['', '5', '6'],\n\t\t\t['7', '8', '9'],\n\t\t]);\n\t});\n\n\tit('parses empty array', ({ expect }) => {\n\t\tconst input = '{}';\n\t\tconst output = table.a.mapFromDriverValue(input);\n\t\texpect(output).toEqual([]);\n\t});\n\n\tit('parses empty nested array', ({ expect }) => {\n\t\tconst input = '{{}}';\n\t\tconst output = table.b.mapFromDriverValue(input);\n\t\texpect(output).toEqual([[]]);\n\t});\n\n\tit('parses single-level array with strings', ({ expect }) => {\n\t\tconst input = '{\"one\",\"two\",\"three\"}';\n\t\tconst output = table.a.mapFromDriverValue(input);\n\t\texpect(output).toEqual(['one', 'two', 'three']);\n\t});\n\n\tit('parses single-level array with mixed values', ({ expect }) => {\n\t\tconst input = '{1,\"two\",3}';\n\t\tconst output = table.a.mapFromDriverValue(input);\n\t\texpect(output).toEqual(['1', 'two', '3']);\n\t});\n\n\tit('parses single-level array with commas inside quotes', ({ expect }) => {\n\t\tconst input = '{1,\"two, three\",4}';\n\t\tconst output = table.a.mapFromDriverValue(input);\n\t\texpect(output).toEqual(['1', 'two, three', '4']);\n\t});\n\n\tit('parses single-level array with escaped quotes inside quotes', ({ expect }) => {\n\t\tconst input = '{1,\"two \\\\\"three\\\\\", four\",5}';\n\t\tconst output = table.a.mapFromDriverValue(input);\n\t\texpect(output).toEqual(['1', 'two \"three\", four', '5']);\n\t});\n\n\tit('parses two-dimensional array with strings', ({ expect }) => {\n\t\tconst input = '{{\"one\",\"two\",three},{\"four\",five,\"six\"},{seven,eight,\"nine\"}}';\n\t\tconst output = table.b.mapFromDriverValue(input);\n\t\texpect(output).toEqual([\n\t\t\t['one', 'two', 'three'],\n\t\t\t['four', 'five', 'six'],\n\t\t\t['seven', 'eight', 'nine'],\n\t\t]);\n\t});\n\n\tit('parses two-dimensional array with mixed values and escaped quotes', ({ expect }) => {\n\t\tconst input =\n\t\t\t'{{1,\"two \\\\\"and a half\\\\\", three\",3},{\"four\",\"five \\\\\"and a half\\\\\", six\",6},{\"seven\",\"eight\",\"nine\"}}';\n\t\tconst output = table.b.mapFromDriverValue(input);\n\t\texpect(output).toEqual([\n\t\t\t['1', 'two \"and a half\", three', '3'],\n\t\t\t['four', 'five \"and a half\", six', '6'],\n\t\t\t['seven', 'eight', 'nine'],\n\t\t]);\n\t});\n});\n"
  },
  {
    "path": "drizzle-orm/tests/relation.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { pgSchema, pgTable } from '~/pg-core/index.ts';\nimport { createTableRelationsHelpers, extractTablesRelationalConfig } from '~/relations.ts';\n\ntest('tables with same name in different schemas', () => {\n\tconst folder = pgSchema('folder');\n\tconst schema = {\n\t\tfolder: {\n\t\t\tusersInFolder: folder.table('users', {}),\n\t\t},\n\t\tpublic: {\n\t\t\tusers: pgTable('users', {}),\n\t\t},\n\t};\n\n\tconst relationalSchema = {\n\t\t...Object.fromEntries(\n\t\t\tObject.entries(schema)\n\t\t\t\t.flatMap(([key, val]) => {\n\t\t\t\t\t// have unique keys across schemas\n\n\t\t\t\t\tconst mappedTableEntries = Object.entries(val).map((tableEntry) => {\n\t\t\t\t\t\treturn [`__${key}__.${tableEntry[0]}`, tableEntry[1]];\n\t\t\t\t\t});\n\n\t\t\t\t\treturn mappedTableEntries;\n\t\t\t\t}),\n\t\t),\n\t};\n\n\tconst relationsConfig = extractTablesRelationalConfig(\n\t\trelationalSchema,\n\t\tcreateTableRelationsHelpers,\n\t);\n\n\texpect(Object.keys(relationsConfig)).toHaveLength(2);\n});\n"
  },
  {
    "path": "drizzle-orm/tests/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.build.json\",\n\t\"compilerOptions\": {\n\t\t\"rootDir\": \"..\"\n\t},\n\t\"include\": [\".\", \"../src\"]\n}\n"
  },
  {
    "path": "drizzle-orm/tests/type-hints.test.ts",
    "content": "import { RDSDataClient } from '@aws-sdk/client-rds-data';\nimport crypto from 'crypto';\nimport { expect, test } from 'vitest';\n\nimport { drizzle } from '~/aws-data-api/pg';\nimport { customType, json, PgDialect, pgTable, text, timestamp, uuid, varchar } from '~/pg-core';\nimport { sql } from '~/sql/sql';\n\nconst db = drizzle(new RDSDataClient(), {\n\tdatabase: '',\n\tresourceArn: '',\n\tsecretArn: '',\n});\n\ntest('type hints - case #1', () => {\n\tconst t = pgTable('t', {\n\t\tid: varchar('id', { length: 255 }).primaryKey(),\n\t\tworkspaceID: varchar('workspace_id', { length: 255 }).notNull(),\n\t\tdescription: text('description').notNull(),\n\t\tenrichment: json('enrichment').notNull(),\n\t\tcategory: text('category'),\n\t\ttags: text('tags').array().notNull(),\n\t\tcounterpartyName: text('counterparty_name'),\n\t\ttimePlaced: timestamp('time_placed').notNull(),\n\t\ttimeSynced: timestamp('time_synced').notNull(),\n\t});\n\n\tconst q = db.insert(t).values({\n\t\tid: 'id',\n\t\ttags: [],\n\t\tworkspaceID: 'workspaceID',\n\t\tenrichment: {},\n\t\tcategory: 'category',\n\t\tdescription: 'description',\n\t\ttimePlaced: new Date(),\n\t\ttimeSynced: sql<string>`CURRENT_TIMESTAMP(6)`,\n\t\tcounterpartyName: 'counterpartyName',\n\t});\n\n\tconst query = new PgDialect().sqlToQuery(q.getSQL());\n\n\texpect(query.typings).toEqual(['none', 'none', 'none', 'json', 'none', 'none', 'none', 'timestamp']);\n});\n\ntest('type hints - case #2', () => {\n\tconst prefixedUlid = <Prefix extends string, PrefixedUlid = `${Prefix}_${string}`>(\n\t\tname: string,\n\t\topts: { prefix: Prefix },\n\t) =>\n\t\tcustomType<{ data: PrefixedUlid; driverData: string }>({\n\t\t\tdataType: () => 'uuid',\n\t\t\ttoDriver: (value) => {\n\t\t\t\treturn value as string;\n\t\t\t},\n\t\t\tfromDriver: (value) => {\n\t\t\t\treturn `${opts.prefix}_${value}` as PrefixedUlid;\n\t\t\t},\n\t\t})(name);\n\n\tconst calendars = pgTable('calendars', {\n\t\tid: uuid('id').primaryKey().default(sql`gen_random_uuid()`),\n\t\torgMembershipId: prefixedUlid('om_id', { prefix: 'om' }).notNull(),\n\t\tplatform: text('platform').notNull(),\n\t\texternalId: text('external_id').notNull(),\n\t\texternalData: json('external_data').notNull(),\n\t\tupdatedAt: timestamp('updated_at').notNull().default(sql`now()`),\n\t\tcreatedAt: timestamp('created_at').notNull().default(sql`now()`),\n\t});\n\n\tconst q = db\n\t\t.insert(calendars)\n\t\t.values({\n\t\t\tid: crypto.randomUUID(),\n\t\t\torgMembershipId: 'om_id',\n\t\t\tplatform: 'platform',\n\t\t\texternalId: 'externalId',\n\t\t\texternalData: {},\n\t\t})\n\t\t.returning();\n\n\tconst query = new PgDialect().sqlToQuery(q.getSQL());\n\n\texpect(query.typings).toEqual(['uuid', 'none', 'none', 'none', 'json']);\n});\n"
  },
  {
    "path": "drizzle-orm/tsconfig.build.json",
    "content": "{\n\t\"extends\": \"./tsconfig.json\",\n\t\"include\": [\"src\"]\n}\n"
  },
  {
    "path": "drizzle-orm/tsconfig.dts.json",
    "content": "{\n\t\"extends\": \"./tsconfig.build.json\",\n\t\"compilerOptions\": {\n\t\t\"composite\": false,\n\t\t\"rootDir\": \"src\",\n\t\t\"outDir\": \"dist-dts\",\n\t\t\"declaration\": true,\n\t\t\"noEmit\": false,\n\t\t\"emitDeclarationOnly\": true,\n\t\t\"incremental\": false\n\t},\n\t\"include\": [\"src\"]\n}\n"
  },
  {
    "path": "drizzle-orm/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"baseUrl\": \".\",\n\t\t\"paths\": {\n\t\t\t\"~/*\": [\"src/*\"]\n\t\t},\n\t\t\"declaration\": true,\n\t\t\"outDir\": \"dist\",\n\t\t\"noEmit\": true\n\t},\n\t\"include\": [\"src\", \"scripts\"]\n}\n"
  },
  {
    "path": "drizzle-orm/tsup.config.ts",
    "content": "import { globSync } from 'glob';\nimport { defineConfig } from 'tsup';\n\nconst entries = globSync('src/**/*.ts');\n\nexport default defineConfig({\n\tentry: entries,\n\toutDir: 'dist.new',\n\tformat: ['cjs', 'esm'],\n\tbundle: false,\n\tsplitting: false,\n\tsourcemap: true,\n\toutExtension({ format }) {\n\t\treturn {\n\t\t\tjs: format === 'cjs' ? '.cjs' : '.js',\n\t\t};\n\t},\n\ttsconfig: 'tsconfig.build.json',\n});\n"
  },
  {
    "path": "drizzle-orm/type-tests/common/aliased-table.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils.ts';\nimport { eq } from '~/index.ts';\nimport { drizzle as sqlited } from '~/libsql/index.ts';\nimport { alias as mysqlAliasFn } from '~/mysql-core/alias.ts';\nimport { mysqlView } from '~/mysql-core/view.ts';\nimport { drizzle as mysqld } from '~/mysql2/index.ts';\nimport { alias as pgAliasFn } from '~/pg-core/alias.ts';\nimport { pgView } from '~/pg-core/view.ts';\nimport { drizzle as pgd } from '~/postgres-js/index.ts';\nimport { alias as sqliteAliasFn } from '~/sqlite-core/alias.ts';\nimport { sqliteView } from '~/sqlite-core/view.ts';\nimport { users as mysqlUsers } from '../mysql/tables.ts';\nimport { users as pgUsers } from '../pg/tables.ts';\nimport { users as sqliteUsers } from '../sqlite/tables.ts';\n\nconst pg = pgd.mock();\nconst sqlite = sqlited.mock();\nconst mysql = mysqld.mock();\n\nconst pgvUsers = pgView('users_view').as((qb) => qb.select().from(pgUsers));\nconst sqlitevUsers = sqliteView('users_view').as((qb) => qb.select().from(sqliteUsers));\nconst mysqlvUsers = mysqlView('users_view').as((qb) => qb.select().from(mysqlUsers));\n\nconst pgAlias = pgAliasFn(pgUsers, 'usersAlias');\nconst sqliteAlias = sqliteAliasFn(sqliteUsers, 'usersAlias');\nconst mysqlAlias = mysqlAliasFn(mysqlUsers, 'usersAlias');\n\nconst pgvAlias = pgAliasFn(pgvUsers, 'usersvAlias');\nconst sqlitevAlias = sqliteAliasFn(sqlitevUsers, 'usersvAlias');\nconst mysqlvAlias = mysqlAliasFn(mysqlvUsers, 'usersvAlias');\n\nconst pgRes = await pg.select().from(pgUsers).leftJoin(pgAlias, eq(pgAlias.id, pgUsers.id));\nconst sqliteRes = await sqlite.select().from(sqliteUsers).leftJoin(sqliteAlias, eq(sqliteAlias.id, sqliteUsers.id));\nconst mysqlRes = await mysql.select().from(mysqlUsers).leftJoin(mysqlAlias, eq(mysqlAlias.id, mysqlUsers.id));\n\nconst pgvRes = await pg.select().from(pgUsers).leftJoin(pgvAlias, eq(pgvAlias.id, pgUsers.id));\nconst sqlitevRes = await sqlite.select().from(sqliteUsers).leftJoin(sqlitevAlias, eq(sqlitevAlias.id, sqliteUsers.id));\nconst mysqlvRes = await mysql.select().from(mysqlUsers).leftJoin(mysqlvAlias, eq(mysqlvAlias.id, mysqlUsers.id));\n\nExpect<\n\tEqual<typeof pgRes, {\n\t\tusers_table: {\n\t\t\tid: number;\n\t\t\tuuid: string;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\ttext: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\tarrayCol: string[];\n\t\t};\n\t\tusersAlias: {\n\t\t\tid: number;\n\t\t\tuuid: string;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\ttext: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\tarrayCol: string[];\n\t\t} | null;\n\t}[]>\n>;\n\nExpect<\n\tEqual<typeof sqliteRes, {\n\t\tusers_table: {\n\t\t\tid: number;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number | null;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\tname: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t};\n\t\tusersAlias: {\n\t\t\tid: number;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number | null;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\tname: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t} | null;\n\t}[]>\n>;\n\nExpect<\n\tEqual<typeof mysqlRes, {\n\t\tusers_table: {\n\t\t\tid: number;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\ttext: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t};\n\t\tusersAlias: {\n\t\t\tid: number;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\ttext: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t} | null;\n\t}[]>\n>;\n\nExpect<\n\tEqual<typeof pgvRes, {\n\t\tusers_table: {\n\t\t\tid: number;\n\t\t\tuuid: string;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\ttext: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\tarrayCol: string[];\n\t\t};\n\t\tusersvAlias: {\n\t\t\tid: number;\n\t\t\tuuid: string;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\ttext: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\tarrayCol: string[];\n\t\t} | null;\n\t}[]>\n>;\n\nExpect<\n\tEqual<typeof sqlitevRes, {\n\t\tusers_table: {\n\t\t\tid: number;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number | null;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\tname: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t};\n\t\tusersvAlias: {\n\t\t\tid: number;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number | null;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\tname: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t} | null;\n\t}[]>\n>;\n\nExpect<\n\tEqual<typeof mysqlvRes, {\n\t\tusers_table: {\n\t\t\tid: number;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\ttext: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t};\n\t\tusersvAlias: {\n\t\t\tid: number;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\ttext: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t} | null;\n\t}[]>\n>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/1-to-1-fk.ts",
    "content": "import { type GelColumn, integer } from '~/gel-core/columns/index.ts';\nimport { gelTable } from '~/gel-core/table.ts';\n\n{\n\tconst test1 = gelTable('test1_table', {\n\t\tid: integer('id').primaryKey(),\n\t\ttest2Id: integer('test2_id').references(() => test2.id),\n\t});\n\n\tconst test1Id = integer('test1_id').references(() => test1.id);\n\n\tconst test2 = gelTable('test2_table', {\n\t\tid: integer('id').primaryKey(),\n\t\ttest1Id,\n\t});\n}\n\n{\n\tconst test1 = gelTable('test1_table', {\n\t\tid: integer('id').primaryKey(),\n\t\ttest2Id: integer('test2_id').references((): GelColumn => test2.id),\n\t});\n\n\tconst test2 = gelTable('test2_table', {\n\t\tid: integer('id').primaryKey(),\n\t\ttest1Id: integer('test1_id').references(() => test1.id),\n\t});\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/array.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils.ts';\nimport type { Column } from '~/column.ts';\nimport { gelTable, integer } from '~/gel-core/index.ts';\n\n{\n\tconst table = gelTable('table', {\n\t\ta: integer('a').array().notNull(),\n\t});\n\tExpect<\n\t\tEqual<\n\t\t\tColumn<\n\t\t\t\t{\n\t\t\t\t\tname: 'a';\n\t\t\t\t\ttableName: 'table';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'GelInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t\t{}\n\t\t\t>,\n\t\t\ttypeof table['a']['_']['baseColumn']\n\t\t>\n\t>;\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/count.ts",
    "content": "import { Expect } from 'type-tests/utils.ts';\nimport { gelTable, integer, text } from '~/gel-core/index.ts';\nimport { and, gt, ne } from '~/sql/expressions/index.ts';\nimport type { Equal } from '~/utils.ts';\nimport { db } from './db.ts';\n\nconst names = gelTable('names', {\n\tid: integer('id').primaryKey(),\n\tname: text('name'),\n\tauthorId: integer('author_id'),\n});\n\nconst separate = await db.$count(names);\n\nconst separateFilters = await db.$count(names, and(gt(names.id, 1), ne(names.name, 'forbidden')));\n\nconst embedded = await db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tauthorId: names.authorId,\n\t\tcount1: db.$count(names).as('count1'),\n\t})\n\t.from(names);\n\nconst embeddedFilters = await db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tauthorId: names.authorId,\n\t\tcount1: db.$count(names, and(gt(names.id, 1), ne(names.name, 'forbidden'))).as('count1'),\n\t})\n\t.from(names);\n\nExpect<Equal<number, typeof separate>>;\n\nExpect<Equal<number, typeof separateFilters>>;\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t}[],\n\t\ttypeof embedded\n\t>\n>;\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t}[],\n\t\ttypeof embeddedFilters\n\t>\n>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/db-rel.ts",
    "content": "import * as gel from 'gel';\nimport { type Equal, Expect } from 'type-tests/utils.ts';\nimport { drizzle } from '~/gel/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport * as schema from './tables-rel.ts';\n\nconst db = drizzle(gel.createClient(), { schema });\n\n{\n\tconst result = await db.query.users.findMany({\n\t\twhere: (users, { sql }) => sql`char_length(${users.name} > 1)`,\n\t\tlimit: sql.placeholder('l'),\n\t\torderBy: (users, { asc, desc }) => [asc(users.name), desc(users.id)],\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { sql }) => sql`char_length(${posts.title} > 1)`,\n\t\t\t\tlimit: sql.placeholder('l'),\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: false,\n\t\t\t\t\ttitle: undefined,\n\t\t\t\t},\n\t\t\t\twith: {\n\t\t\t\t\tauthor: true,\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twhere: (comments, { sql }) => sql`char_length(${comments.text} > 1)`,\n\t\t\t\t\t\tlimit: sql.placeholder('l'),\n\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\ttext: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: {\n\t\t\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\t\t\tid: undefined,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\t\t\tcity: {\n\t\t\t\t\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\t\t\t\t\tusers: true,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tcityId: number;\n\t\t\thomeCityId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tposts: {\n\t\t\t\ttitle: string;\n\t\t\t\tauthorId: number | null;\n\t\t\t\tcomments: {\n\t\t\t\t\ttext: string;\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tcity: {\n\t\t\t\t\t\t\tid: number;\n\t\t\t\t\t\t\tname: string;\n\t\t\t\t\t\t\tusers: {\n\t\t\t\t\t\t\t\tid: number;\n\t\t\t\t\t\t\t\tname: string;\n\t\t\t\t\t\t\t\tcityId: number;\n\t\t\t\t\t\t\t\thomeCityId: number | null;\n\t\t\t\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t\t\t\t}[];\n\t\t\t\t\t\t};\n\t\t\t\t\t} | null;\n\t\t\t\t}[];\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tcityId: number;\n\t\t\t\t\thomeCityId: number | null;\n\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[], typeof result>\n\t>;\n}\n\n{\n\tconst result = await db.query.users.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tauthorId: true,\n\t\t\t\t},\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${schema.posts.title})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tposts: {\n\t\t\t\t\tauthorId: number | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t}[];\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/db.ts",
    "content": "import * as gel from 'gel';\nimport { drizzle } from '~/gel/index.ts';\n\nexport const db = drizzle(gel.createClient());\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/delete.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport type { GelDelete } from '~/gel-core/index.ts';\nimport { eq } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\nimport { users } from './tables.ts';\n\nconst deleteAll = await db.delete(users);\nExpect<Equal<unknown, typeof deleteAll>>;\n\nconst deleteAllStmt = db.delete(users).prepare('deleteAllStmt');\nconst deleteAllPrepared = await deleteAllStmt.execute();\nExpect<Equal<unknown, typeof deleteAllPrepared>>;\n\nconst deleteWhere = await db.delete(users).where(eq(users.id, 1));\nExpect<Equal<unknown, typeof deleteWhere>>;\n\nconst deleteWhereStmt = db.delete(users).where(eq(users.id, 1)).prepare('deleteWhereStmt');\nconst deleteWherePrepared = await deleteWhereStmt.execute();\nExpect<Equal<unknown, typeof deleteWherePrepared>>;\n\nconst deleteReturningAll = await db.delete(users).returning();\nExpect<Equal<(typeof users.$inferSelect)[], typeof deleteReturningAll>>;\n\nconst deleteReturningAllStmt = db.delete(users).returning().prepare('deleteReturningAllStmt');\nconst deleteReturningAllPrepared = await deleteReturningAllStmt.execute();\nExpect<Equal<(typeof users.$inferSelect)[], typeof deleteReturningAllPrepared>>;\n\nconst deleteReturningPartial = await db.delete(users).returning({\n\tmyId: users.id,\n\tmyHomeCity: users.homeCity,\n});\nExpect<Equal<{ myId: number; myHomeCity: number }[], typeof deleteReturningPartial>>;\n\nconst deleteReturningPartialStmt = db\n\t.delete(users)\n\t.returning({\n\t\tmyId: users.id,\n\t\tmyHomeCity: users.homeCity,\n\t})\n\t.prepare('deleteReturningPartialStmt');\nconst deleteReturningPartialPrepared = await deleteReturningPartialStmt.execute();\nExpect<Equal<{ myId: number; myHomeCity: number }[], typeof deleteReturningPartialPrepared>>;\n\n{\n\tfunction dynamic<T extends GelDelete>(qb: T) {\n\t\treturn qb.where(sql``).returning();\n\t}\n\n\tconst qbBase = db.delete(users).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<(typeof users.$inferSelect)[], typeof result>>;\n}\n\n{\n\tfunction withReturning<T extends GelDelete>(qb: T) {\n\t\treturn qb.returning();\n\t}\n\n\tconst qbBase = db.delete(users).$dynamic();\n\tconst qb = withReturning(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<(typeof users.$inferSelect)[], typeof result>>;\n}\n\n{\n\tdb.delete(users)\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n\n\tdb.delete(users)\n\t\t.returning()\n\t\t// @ts-expect-error method was already called\n\t\t.returning();\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/generated-columns.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils';\nimport { gelTable, integer, text } from '~/gel-core';\nimport { type InferInsertModel, type InferSelectModel, sql } from '~/index';\nimport { drizzle } from '~/node-postgres';\nimport { db } from './db';\n\nconst users = gelTable(\n\t'users',\n\t{\n\t\tid: integer('id').primaryKey(),\n\t\tfirstName: text('first_name'),\n\t\tlastName: text('last_name'),\n\t\temail: text('email').notNull(),\n\t\tfullName: text('full_name').generatedAlwaysAs(sql`concat_ws(first_name, ' ', last_name)`).notNull(),\n\t\tupperName: text('upper_name').generatedAlwaysAs(\n\t\t\tsql` case when first_name is null then null else upper(first_name) end `,\n\t\t),\n\t},\n);\n{\n\ttype User = typeof users.$inferSelect;\n\ttype NewUser = typeof users.$inferInsert;\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string;\n\t\t\t\tupperName: string | null;\n\t\t\t},\n\t\t\tUser\n\t\t>\n\t>();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\temail: string;\n\t\t\t\tid: number;\n\t\t\t\tfirstName?: string | null | undefined;\n\t\t\t\tlastName?: string | null | undefined;\n\t\t\t},\n\t\t\tNewUser\n\t\t>\n\t>();\n}\n\n{\n\ttype User = InferSelectModel<typeof users>;\n\ttype NewUser = InferInsertModel<typeof users>;\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string;\n\t\t\t\tupperName: string | null;\n\t\t\t},\n\t\t\tUser\n\t\t>\n\t>();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\temail: string;\n\t\t\t\tid: number;\n\t\t\t\tfirstName?: string | null | undefined;\n\t\t\t\tlastName?: string | null | undefined;\n\t\t\t},\n\t\t\tNewUser\n\t\t>\n\t>();\n}\n\n{\n\tconst dbUsers = await db.select().from(users);\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string;\n\t\t\t\tupperName: string | null;\n\t\t\t}[],\n\t\t\ttypeof dbUsers\n\t\t>\n\t>();\n}\n\n{\n\tconst db = drizzle({} as any, { schema: { users } });\n\n\tconst dbUser = await db.query.users.findFirst();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string;\n\t\t\t\tupperName: string | null;\n\t\t\t} | undefined,\n\t\t\ttypeof dbUser\n\t\t>\n\t>();\n}\n\n{\n\tconst db = drizzle({} as any, { schema: { users } });\n\n\tconst dbUser = await db.query.users.findMany();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string;\n\t\t\t\tupperName: string | null;\n\t\t\t}[],\n\t\t\ttypeof dbUser\n\t\t>\n\t>();\n}\n\n{\n\t// @ts-expect-error - Can't use the fullName because it's a generated column\n\tawait db.insert(users).values({\n\t\tfirstName: 'test',\n\t\tlastName: 'test',\n\t\temail: 'test',\n\t\tfullName: 'test',\n\t});\n}\n\n{\n\tawait db.update(users).set({\n\t\tfirstName: 'test',\n\t\tlastName: 'test',\n\t\temail: 'test',\n\t\t// @ts-expect-error - Can't use the fullName because it's a generated column\n\t\tfullName: 'test',\n\t});\n}\n\nconst users2 = gelTable(\n\t'users',\n\t{\n\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\tid2: integer('id').generatedAlwaysAsIdentity(),\n\t},\n);\n\n{\n\ttype User = typeof users2.$inferSelect;\n\ttype NewUser = typeof users2.$inferInsert;\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tid2: number;\n\t\t\t},\n\t\t\tUser\n\t\t>\n\t>();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid?: number | undefined;\n\t\t\t},\n\t\t\tNewUser\n\t\t>\n\t>();\n}\n\nconst usersSeq = gelTable(\n\t'users',\n\t{\n\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\tid2: integer('id').generatedAlwaysAsIdentity(),\n\t},\n);\n\n{\n\ttype User = typeof usersSeq.$inferSelect;\n\ttype NewUser = typeof usersSeq.$inferInsert;\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tid2: number;\n\t\t\t},\n\t\t\tUser\n\t\t>\n\t>();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid?: number | undefined;\n\t\t\t},\n\t\t\tNewUser\n\t\t>\n\t>();\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/insert.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { boolean, gelTable, integer, QueryBuilder, text } from '~/gel-core/index.ts';\nimport type { GelInsert } from '~/gel-core/query-builders/insert.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\nimport { identityColumnsTable, users } from './tables.ts';\n\nconst insert = await db\n\t.insert(users)\n\t.values({\n\t\tid: 1,\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tcreatedAt: new Date(),\n\t\tuuid: '',\n\t\tage1: 1,\n\t\tarrayCol: [''],\n\t});\nExpect<Equal<unknown, typeof insert>>;\n\nconst insertStmt = db\n\t.insert(users)\n\t.values({\n\t\tid: 1,\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tcreatedAt: new Date(),\n\t\tuuid: '',\n\t\tage1: 1,\n\t\tarrayCol: [''],\n\t})\n\t.prepare('insertStmt');\nconst insertPrepared = await insertStmt.execute();\nExpect<Equal<unknown, typeof insertPrepared>>;\n\nconst insertSql = await db.insert(users).values({\n\tid: 1,\n\thomeCity: sql`123`,\n\tclass: 'A',\n\tage1: 1,\n\tcreatedAt: new Date(),\n\tuuid: '',\n\tarrayCol: [''],\n});\nExpect<Equal<unknown, typeof insertSql>>;\n\nconst insertSqlStmt = db\n\t.insert(users)\n\t.values({\n\t\tid: 1,\n\t\thomeCity: sql`123`,\n\t\tclass: 'A',\n\t\tage1: 1,\n\t\tcreatedAt: new Date(),\n\t\tuuid: '',\n\t\tarrayCol: [''],\n\t})\n\t.prepare('insertSqlStmt');\nconst insertSqlPrepared = await insertSqlStmt.execute();\nExpect<Equal<unknown, typeof insertSqlPrepared>>;\n\nconst insertReturning = await db\n\t.insert(users)\n\t.values({\n\t\tid: 1,\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tage1: 1,\n\t\tcreatedAt: new Date(),\n\t\tuuid: '',\n\t\tarrayCol: [''],\n\t})\n\t.returning();\nExpect<Equal<typeof users.$inferSelect[], typeof insertReturning>>;\n\nconst insertReturningStmt = db\n\t.insert(users)\n\t.values({\n\t\tid: 1,\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tcreatedAt: new Date(),\n\t\tuuid: '',\n\t\tage1: 1,\n\t\tarrayCol: [''],\n\t})\n\t.returning()\n\t.prepare('insertReturningStmt');\nconst insertReturningPrepared = await insertReturningStmt.execute();\nExpect<Equal<typeof users.$inferSelect[], typeof insertReturningPrepared>>;\n\nconst insertReturningPartial = await db\n\t.insert(users)\n\t.values({\n\t\tid: 1,\n\t\thomeCity: 1,\n\t\tcreatedAt: new Date(),\n\t\tuuid: '',\n\t\tclass: 'A',\n\t\tage1: 1,\n\t\tarrayCol: [''],\n\t})\n\t.returning({\n\t\tid: users.id,\n\t\thomeCity: users.homeCity,\n\t\tmySubclass: users.subClass,\n\t});\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\thomeCity: number;\n\t\tmySubclass: string | null;\n\t}[], typeof insertReturningPartial>\n>;\n\nconst insertReturningPartialStmt = db\n\t.insert(users)\n\t.values({\n\t\tid: 1,\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tcreatedAt: new Date(),\n\t\tuuid: '',\n\t\tage1: 1,\n\t\tarrayCol: [''],\n\t})\n\t.returning({\n\t\tid: users.id,\n\t\thomeCity: users.homeCity,\n\t\tmySubclass: users.subClass,\n\t})\n\t.prepare('insertReturningPartialStmt');\nconst insertReturningPartialPrepared = await insertReturningPartialStmt.execute();\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\thomeCity: number;\n\t\tmySubclass: string | null;\n\t}[], typeof insertReturningPartialPrepared>\n>;\n\nconst insertReturningSql = await db\n\t.insert(users)\n\t.values({\n\t\tid: 1,\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tage1: sql`2 + 2`,\n\t\tcreatedAt: new Date(),\n\t\tuuid: '',\n\t\tarrayCol: [''],\n\t})\n\t.returning({\n\t\tid: users.id,\n\t\thomeCity: users.homeCity,\n\t\tsubclassLower: sql`lower(${users.subClass})`,\n\t\tclassLower: sql<string>`lower(${users.class})`,\n\t});\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\thomeCity: number;\n\t\tsubclassLower: unknown;\n\t\tclassLower: string;\n\t}[], typeof insertReturningSql>\n>;\n\nconst insertReturningSqlStmt = db\n\t.insert(users)\n\t.values({\n\t\tid: 1,\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tcreatedAt: new Date(),\n\t\tuuid: '',\n\t\tage1: sql`2 + 2`,\n\t\tarrayCol: [''],\n\t})\n\t.returning({\n\t\tid: users.id,\n\t\thomeCity: users.homeCity,\n\t\tsubclassLower: sql`lower(${users.subClass})`,\n\t\tclassLower: sql<string>`lower(${users.class})`,\n\t})\n\t.prepare('insertReturningSqlStmt');\nconst insertReturningSqlPrepared = await insertReturningSqlStmt.execute();\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\thomeCity: number;\n\t\tsubclassLower: unknown;\n\t\tclassLower: string;\n\t}[], typeof insertReturningSqlPrepared>\n>;\n\n{\n\tfunction dynamic<T extends GelInsert>(qb: T) {\n\t\treturn qb.returning();\n\t}\n\n\tconst qbBase = db.insert(users).values({\n\t\tid: 1,\n\t\tage1: 0,\n\t\tclass: 'A',\n\t\thomeCity: 0,\n\t\tarrayCol: [],\n\t\tcreatedAt: new Date(),\n\t\tuuid: '',\n\t}).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tfunction withReturning<T extends GelInsert>(qb: T) {\n\t\treturn qb.returning();\n\t}\n\n\tconst qbBase = db.insert(users).values({\n\t\tid: 1,\n\t\tage1: 0,\n\t\tclass: 'A',\n\t\thomeCity: 0,\n\t\tarrayCol: [],\n\t\tcreatedAt: new Date(),\n\t\tuuid: '',\n\t}).$dynamic();\n\tconst qb = withReturning(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tdb\n\t\t.insert(users)\n\t\t.values({ id: 1, age1: 0, class: 'A', homeCity: 0, arrayCol: [], createdAt: new Date(), uuid: '' })\n\t\t.returning()\n\t\t// @ts-expect-error method was already called\n\t\t.returning();\n}\n\n{\n\tconst users1 = gelTable('users1', {\n\t\tid: integer('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tadmin: boolean('admin').notNull().default(false),\n\t});\n\tconst users2 = gelTable('users2', {\n\t\tid: integer('id').primaryKey(),\n\t\tfirstName: text('first_name').notNull(),\n\t\tlastName: text('last_name').notNull(),\n\t\tadmin: boolean('admin').notNull().default(false),\n\t\tphoneNumber: text('phone_number'),\n\t});\n\n\tconst qb = new QueryBuilder();\n\n\tdb.insert(users1).select(sql`select * from users1`);\n\tdb.insert(users1).select(() => sql`select * from users1`);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tid: users2.id,\n\t\t\t\tname: users2.firstName,\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2),\n\t\t);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tid: users2.id,\n\t\t\t\tname: users2.firstName,\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2).where(sql``),\n\t\t);\n\n\tdb\n\t\t.insert(users2)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tid: users2.id,\n\t\t\t\tfirstName: users2.firstName,\n\t\t\t\tlastName: users2.lastName,\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2),\n\t\t);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tid: users2.id,\n\t\t\t\tname: sql`${users2.firstName} || ' ' || ${users2.lastName}`.as('name'),\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2),\n\t\t);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\t// @ts-expect-error name is undefined\n\t\t\tqb.select({ admin: users1.admin }).from(users1),\n\t\t);\n\n\tdb.insert(users1).select(db.select().from(users1));\n\tdb.insert(users1).select(() => db.select().from(users1));\n\tdb.insert(users1).select((qb) => qb.select().from(users1));\n\t// @ts-expect-error tables have different keys\n\tdb.insert(users1).select(db.select().from(users2));\n\t// @ts-expect-error tables have different keys\n\tdb.insert(users1).select(() => db.select().from(users2));\n}\n\n{\n\tdb.insert(identityColumnsTable).values([\n\t\t{ byDefaultAsIdentity: 4, name: 'fdf' },\n\t]);\n\n\t// @ts-expect-error\n\tdb.insert(identityColumnsTable).values([\n\t\t{ alwaysAsIdentity: 2 },\n\t]);\n\n\tdb.insert(identityColumnsTable).overridingSystemValue().values([\n\t\t{ alwaysAsIdentity: 2 },\n\t]);\n\n\t// @ts-expect-error\n\tdb.insert(identityColumnsTable).values([\n\t\t{ generatedCol: 2 },\n\t]);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/no-strict-null-checks/test.ts",
    "content": "import { drizzle } from '~/gel';\nimport { gelTable, integer, text } from '~/gel-core';\n\nexport const test = gelTable(\n\t'test',\n\t{\n\t\tid: text('id')\n\t\t\t.primaryKey()\n\t\t\t.generatedAlwaysAs('genstr'),\n\t\tintId: integer('int_id')\n\t\t\t.primaryKey()\n\t\t\t.generatedAlwaysAsIdentity(),\n\t\tint2Id: integer('int2_id').generatedByDefaultAsIdentity(),\n\t\tname: text('name').$defaultFn(() => '' as string),\n\t\ttitle: text('title').notNull(),\n\t\tdescription: text('description'),\n\t\tdbdef: text('dbdef').default('dbdefval'),\n\t},\n);\n\nconst db = drizzle.mock();\n\ndb.update(test)\n\t.set({\n\t\t// @ts-expect-error\n\t\tid: '1',\n\t\tname: 'name',\n\t\ttitle: 'title',\n\t\tdescription: 'desc',\n\t\tdbdef: 'upddef',\n\t});\n\ndb.update(test)\n\t.set({\n\t\t// @ts-expect-error\n\t\tintId: 1,\n\t\tname: 'name',\n\t\ttitle: 'title',\n\t\tdescription: 'desc',\n\t\tdbdef: 'upddef',\n\t});\n\ndb.update(test)\n\t.set({\n\t\tint2Id: 1,\n\t\tname: 'name',\n\t\ttitle: 'title',\n\t\tdescription: 'desc',\n\t\tdbdef: 'upddef',\n\t});\n\ndb.update(test)\n\t.set({\n\t\tname: 'name',\n\t\ttitle: 'title',\n\t\tdescription: 'desc',\n\t\tdbdef: 'upddef',\n\t});\n\ndb.insert(test).values({\n\t// @ts-expect-error\n\tid: '1',\n\tname: 'name',\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\t// @ts-expect-error\n\tintId: 1,\n\tname: 'name',\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\tint2Id: 1,\n\tname: 'name',\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\tname: 'name',\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n\tdescription: 'desc',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n});\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/no-strict-null-checks/tsconfig.json",
    "content": "{\n\t\"extends\": \"../../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"noEmit\": true,\n\t\t\"strictNullChecks\": false,\n\t\t\"strictPropertyInitialization\": false,\n\t\t\"exactOptionalPropertyTypes\": false\n\t},\n\t\"include\": [\"./test.ts\"]\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/other.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { eq, inArray } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\nimport { users } from './tables.ts';\n\nconst rawQuery = await db.execute(\n\tsql`select ${users.id}, ${users.class} from ${users} where ${inArray(users.id, [1, 2, 3])} and ${\n\t\teq(users.class, 'A')\n\t}`,\n);\n\nExpect<Equal<Record<string, unknown>[], typeof rawQuery>>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/select.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\n\nimport { alias } from '~/gel-core/alias.ts';\nimport {\n\tboolean,\n\t// gelMaterializedView,\n\ttype GelSelect,\n\ttype GelSelectQueryBuilder,\n\tgelTable,\n\t// gelView,\n\tinteger,\n\tQueryBuilder,\n\ttext,\n} from '~/gel-core/index.ts';\nimport {\n\tand,\n\tarrayContained,\n\tarrayContains,\n\tarrayOverlaps,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from '~/sql/expressions/index.ts';\nimport { type SQL, sql } from '~/sql/sql.ts';\n\nimport { db } from './db.ts';\nimport { cities, classes, users } from './tables.ts';\n\nconst city = alias(cities, 'city');\nconst city1 = alias(cities, 'city1');\n\nconst leftJoinFull = await db.select().from(users).leftJoin(city, eq(users.id, city.id));\n\n{\n\tawait db.select().from(users).leftJoin(city, eq(users.id, city.id));\n}\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof cities.$inferSelect | null;\n\t\t}[],\n\t\ttypeof leftJoinFull\n\t>\n>;\n\nconst rightJoinFull = await db.select().from(users).rightJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect | null;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof rightJoinFull\n\t>\n>;\n\nconst innerJoinFull = await db.select().from(users).innerJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof innerJoinFull\n\t>\n>;\n\nconst fullJoinFull = await db.select().from(users).fullJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect | null;\n\t\t\tcity: typeof city.$inferSelect | null;\n\t\t}[],\n\t\ttypeof fullJoinFull\n\t>\n>;\n\nconst crossJoinFull = await db.select().from(users).crossJoin(city);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof crossJoinFull\n\t>\n>;\n\nconst leftJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.leftJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserText: string | null;\n\t\tcityId: number | null;\n\t\tcityName: string | null;\n\t}[], typeof leftJoinFlat>\n>;\n\nconst rightJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.rightJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number | null;\n\t\tuserText: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof rightJoinFlat>\n>;\n\nconst innerJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.innerJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserText: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof innerJoinFlat>\n>;\n\nconst fullJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.fullJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number | null;\n\t\tuserText: string | null;\n\t\tcityId: number | null;\n\t\tcityName: string | null;\n\t}[], typeof fullJoinFlat>\n>;\n\nconst crossJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.crossJoin(city);\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserText: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof crossJoinFlat>\n>;\n\nconst leftJoinMixed = await db\n\t.select({\n\t\tid: users.id,\n\t\ttext: users.text,\n\t\ttextUpper: sql<string | null>`upper(${users.text})`,\n\t\tidComplex: sql<string | null>`${users.id}::text || ${city.id}::text`,\n\t\tcity: {\n\t\t\tid: city.id,\n\t\t\tname: city.name,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\ttext: string | null;\n\t\t\ttextUpper: string | null;\n\t\t\tidComplex: string | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[],\n\t\ttypeof leftJoinMixed\n\t>\n>;\n\nconst leftJoinMixed2 = await db\n\t.select({\n\t\tid: users.id,\n\t\ttext: users.text,\n\t\tfoo: {\n\t\t\tbar: users.uuid,\n\t\t\tbaz: cities.id,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(cities, eq(users.id, cities.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\ttext: string | null;\n\t\t\tfoo: {\n\t\t\t\tbar: string;\n\t\t\t\tbaz: number | null;\n\t\t\t};\n\t\t}[],\n\t\ttypeof leftJoinMixed2\n\t>\n>;\n\nconst join1 = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t\ttext: users.text,\n\t\t},\n\t\tcity: {\n\t\t\tid: city.id,\n\t\t\tname: city.name,\n\t\t\tnameUpper: sql<string>`upper(${city.name})`,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuser: {\n\t\t\tid: number;\n\t\t\ttext: string | null;\n\t\t};\n\t\tcity: {\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tnameUpper: string;\n\t\t} | null;\n\t}[], typeof join1>\n>;\n\nconst join = await db\n\t.select({\n\t\tusers,\n\t\tcities,\n\t\tcity,\n\t\tcity1: {\n\t\t\tid: city1.id,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(cities, eq(users.id, cities.id))\n\t.rightJoin(city, eq(city.id, users.id))\n\t.rightJoin(city1, eq(city1.id, users.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers: {\n\t\t\t\tid: number;\n\t\t\t\tuuid: string;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tclass: string;\n\t\t\t\tsubClass: string | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tarrayCol: string[];\n\t\t\t} | null;\n\t\t\tcities: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tcity1: {\n\t\t\t\tid: number;\n\t\t\t};\n\t\t}[],\n\t\ttypeof join\n\t>\n>;\n\nconst join2 = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t})\n\t.from(users)\n\t.fullJoin(cities, eq(users.id, cities.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t} | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t} | null;\n\t\t}[],\n\t\ttypeof join2\n\t>\n>;\n\nconst join3 = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\tclass: {\n\t\t\tid: classes.id,\n\t\t},\n\t})\n\t.from(users)\n\t.fullJoin(cities, eq(users.id, cities.id))\n\t.rightJoin(classes, eq(users.id, classes.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t} | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t} | null;\n\t\t\tclass: {\n\t\t\t\tid: number;\n\t\t\t};\n\t\t}[],\n\t\ttypeof join3\n\t>\n>;\n\ndb.select()\n\t.from(users)\n\t.where(exists(db.select().from(cities).where(eq(users.homeCity, cities.id))));\n\nfunction mapFunkyFuncResult(valueFromDriver: unknown) {\n\treturn {\n\t\tfoo: (valueFromDriver as Record<string, any>)['foo'],\n\t};\n}\n\nconst age = 1;\n\nconst allOperators = await db\n\t.select({\n\t\tcol2: sql`5 - ${users.id} + 1`, // unknown\n\t\tcol3: sql<number>`${users.id} + 1`, // number\n\t\tcol33: sql`${users.id} + 1`.mapWith(users.id), // number\n\t\tcol34: sql`${users.id} + 1`.mapWith(mapFunkyFuncResult), // number\n\t\tcol4: sql<string | number>`one_or_another(${users.id}, ${users.class})`, // string | number\n\t\tcol5: sql`true`, // unknown\n\t\tcol6: sql<boolean>`true`, // boolean\n\t\tcol7: sql<number>`random()`, // number\n\t\tcol8: sql`some_funky_func(${users.id})`.mapWith(mapFunkyFuncResult), // { foo: string }\n\t\tcol9: sql`greatest(${users.createdAt}, ${sql.param(new Date(), users.createdAt)})`, // unknown\n\t\tcol10: sql<Date | boolean>`date_or_false(${users.createdAt}, ${\n\t\t\tsql.param(\n\t\t\t\tnew Date(),\n\t\t\t\tusers.createdAt,\n\t\t\t)\n\t\t})`, // Date | boolean\n\t\tcol11: sql`${users.age1} + ${age}`, // unknown\n\t\tcol12: sql`${users.age1} + ${sql.param(age, users.age1)}`, // unknown\n\t\tcol13: sql`lower(${users.class})`, // unknown\n\t\tcol14: sql<number>`length(${users.class})`, // number\n\t\tcount: sql<number>`count(*)::int`, // number\n\t})\n\t.from(users)\n\t.where(\n\t\tand(\n\t\t\teq(users.id, 1),\n\t\t\tne(users.id, 1),\n\t\t\tor(eq(users.id, 1), ne(users.id, 1)),\n\t\t\tnot(eq(users.id, 1)),\n\t\t\tgt(users.id, 1),\n\t\t\tgte(users.id, 1),\n\t\t\tlt(users.id, 1),\n\t\t\tlte(users.id, 1),\n\t\t\tinArray(users.id, [1, 2, 3]),\n\t\t\tinArray(users.id, db.select({ id: users.id }).from(users)),\n\t\t\tinArray(users.id, sql`select id from ${users}`),\n\t\t\tnotInArray(users.id, [1, 2, 3]),\n\t\t\tnotInArray(users.id, db.select({ id: users.id }).from(users)),\n\t\t\tnotInArray(users.id, sql`select id from ${users}`),\n\t\t\tisNull(users.subClass),\n\t\t\tisNotNull(users.id),\n\t\t\texists(db.select({ id: users.id }).from(users)),\n\t\t\texists(sql`select id from ${users}`),\n\t\t\tnotExists(db.select({ id: users.id }).from(users)),\n\t\t\tnotExists(sql`select id from ${users}`),\n\t\t\tbetween(users.id, 1, 2),\n\t\t\tnotBetween(users.id, 1, 2),\n\t\t\tlike(users.id, '%1%'),\n\t\t\tnotLike(users.id, '%1%'),\n\t\t\tilike(users.id, '%1%'),\n\t\t\tnotIlike(users.id, '%1%'),\n\t\t\tarrayContains(users.arrayCol, ['abc']),\n\t\t\tarrayContains(users.arrayCol, db.select({ arrayCol: users.arrayCol }).from(users)),\n\t\t\tarrayContains(users.arrayCol, sql`select array_col from ${users}`),\n\t\t\tarrayContained(users.arrayCol, ['abc']),\n\t\t\tarrayContained(users.arrayCol, db.select({ arrayCol: users.arrayCol }).from(users)),\n\t\t\tarrayContained(users.arrayCol, sql`select array_col from ${users}`),\n\t\t\tarrayOverlaps(users.arrayCol, ['abc']),\n\t\t\tarrayOverlaps(users.arrayCol, db.select({ arrayCol: users.arrayCol }).from(users)),\n\t\t\tarrayOverlaps(users.arrayCol, sql`select array_col from ${users}`),\n\t\t),\n\t);\n\nExpect<\n\tEqual<{\n\t\tcol2: unknown;\n\t\tcol3: number;\n\t\tcol33: number;\n\t\tcol34: { foo: any };\n\t\tcol4: string | number;\n\t\tcol5: unknown;\n\t\tcol6: boolean;\n\t\tcol7: number;\n\t\tcol8: {\n\t\t\tfoo: any;\n\t\t};\n\t\tcol9: unknown;\n\t\tcol10: boolean | Date;\n\t\tcol11: unknown;\n\t\tcol12: unknown;\n\t\tcol13: unknown;\n\t\tcol14: number;\n\t\tcount: number;\n\t}[], typeof allOperators>\n>;\n\nconst textSelect = await db\n\t.select({\n\t\tt: users.text,\n\t})\n\t.from(users);\n\nExpect<Equal<{ t: string | null }[], typeof textSelect>>;\n\nconst homeCity = alias(cities, 'homeCity');\nconst c = alias(classes, 'c');\nconst otherClass = alias(classes, 'otherClass');\nconst anotherClass = alias(classes, 'anotherClass');\nconst friend = alias(users, 'friend');\nconst currentCity = alias(cities, 'currentCity');\nconst subscriber = alias(users, 'subscriber');\nconst closestCity = alias(cities, 'closestCity');\nconst closestCity2 = alias(cities, 'closestCity2');\nconst closestCity3 = alias(cities, 'closestCity3');\nconst closestCity4 = alias(cities, 'closestCity4');\nconst closestCity5 = alias(cities, 'closestCity5');\nconst closestCity6 = alias(cities, 'closestCity6');\nconst closestCity7 = alias(cities, 'closestCity7');\n\nconst megaJoin = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t\tmaxAge: sql`max(${users.age1})`,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\thomeCity,\n\t\tc,\n\t\totherClass,\n\t\tanotherClass,\n\t\tfriend,\n\t\tcurrentCity,\n\t\tsubscriber,\n\t\tclosestCity,\n\t})\n\t.from(users)\n\t.innerJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.innerJoin(homeCity, sql`${users.homeCity} = ${homeCity.id}`)\n\t.innerJoin(c, eq(c.id, users.class))\n\t.innerJoin(otherClass, sql`${c.id} = ${otherClass.id}`)\n\t.innerJoin(anotherClass, sql`${users.class} = ${anotherClass.id}`)\n\t.innerJoin(friend, sql`${users.id} = ${friend.id}`)\n\t.innerJoin(currentCity, sql`${homeCity.id} = ${currentCity.id}`)\n\t.innerJoin(subscriber, sql`${users.class} = ${subscriber.id}`)\n\t.innerJoin(closestCity, sql`${users.currentCity} = ${closestCity.id}`)\n\t.where(and(sql`${users.age1} > 0`, eq(cities.id, 1)))\n\t.limit(1)\n\t.offset(1);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tmaxAge: unknown;\n\t\t\t};\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t};\n\t\t\thomeCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t\tc: {\n\t\t\t\tid: number;\n\t\t\t\tclass: string | null;\n\t\t\t\tsubClass: string;\n\t\t\t};\n\t\t\totherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: string | null;\n\t\t\t\tsubClass: string;\n\t\t\t};\n\t\t\tanotherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: string | null;\n\t\t\t\tsubClass: string;\n\t\t\t};\n\t\t\tfriend: {\n\t\t\t\tid: number;\n\t\t\t\tuuid: string;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tclass: string;\n\t\t\t\tsubClass: string | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tarrayCol: string[];\n\t\t\t};\n\t\t\tcurrentCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t\tsubscriber: {\n\t\t\t\tid: number;\n\t\t\t\tuuid: string;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tclass: string;\n\t\t\t\tsubClass: string | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tarrayCol: string[];\n\t\t\t};\n\t\t\tclosestCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t}[],\n\t\ttypeof megaJoin\n\t>\n>;\n\nconst megaLeftJoin = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t\tmaxAge: sql`max(${users.age1})`,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\thomeCity,\n\t\tc,\n\t\totherClass,\n\t\tanotherClass,\n\t\tfriend,\n\t\tcurrentCity,\n\t\tsubscriber,\n\t\tclosestCity,\n\t\tclosestCity2,\n\t\tclosestCity3,\n\t\tclosestCity4,\n\t\tclosestCity5,\n\t\tclosestCity6,\n\t\tclosestCity7,\n\t})\n\t.from(users)\n\t.leftJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.leftJoin(homeCity, sql`${users.homeCity} = ${homeCity.id}`)\n\t.leftJoin(c, eq(c.id, users.class))\n\t.leftJoin(otherClass, sql`${c.id} = ${otherClass.id}`)\n\t.leftJoin(anotherClass, sql`${users.class} = ${anotherClass.id}`)\n\t.leftJoin(friend, sql`${users.id} = ${friend.id}`)\n\t.leftJoin(currentCity, sql`${homeCity.id} = ${currentCity.id}`)\n\t.leftJoin(subscriber, sql`${users.class} = ${subscriber.id}`)\n\t.leftJoin(closestCity, sql`${users.currentCity} = ${closestCity.id}`)\n\t.leftJoin(closestCity2, sql`${users.currentCity} = ${closestCity.id}`)\n\t.leftJoin(closestCity3, sql`${users.currentCity} = ${closestCity.id}`)\n\t.leftJoin(closestCity4, sql`${users.currentCity} = ${closestCity.id}`)\n\t.leftJoin(closestCity5, sql`${users.currentCity} = ${closestCity.id}`)\n\t.leftJoin(closestCity6, sql`${users.currentCity} = ${closestCity.id}`)\n\t.leftJoin(closestCity7, sql`${users.currentCity} = ${closestCity.id}`)\n\t.where(and(sql`${users.age1} > 0`, eq(cities.id, 1)))\n\t.limit(1)\n\t.offset(1);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tmaxAge: unknown;\n\t\t\t};\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t} | null;\n\t\t\thomeCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tc: {\n\t\t\t\tid: number;\n\t\t\t\tclass: string | null;\n\t\t\t\tsubClass: string;\n\t\t\t} | null;\n\t\t\totherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: string | null;\n\t\t\t\tsubClass: string;\n\t\t\t} | null;\n\t\t\tanotherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: string | null;\n\t\t\t\tsubClass: string;\n\t\t\t} | null;\n\t\t\tfriend: {\n\t\t\t\tid: number;\n\t\t\t\tuuid: string;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\n\t\t\t\tclass: string;\n\t\t\t\tsubClass: string | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\n\t\t\t\tarrayCol: string[];\n\t\t\t} | null;\n\t\t\tcurrentCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tsubscriber: {\n\t\t\t\tid: number;\n\t\t\t\tuuid: string;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\n\t\t\t\tclass: string;\n\t\t\t\tsubClass: string | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\n\t\t\t\tarrayCol: string[];\n\t\t\t} | null;\n\t\t\tclosestCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tclosestCity2: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tclosestCity3: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tclosestCity4: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tclosestCity5: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tclosestCity6: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tclosestCity7: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t}[],\n\t\ttypeof megaLeftJoin\n\t>\n>;\n\nawait db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t\tmaxAge: sql`max(${users.age1})`,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\thomeCity,\n\t\tc,\n\t\totherClass,\n\t\tanotherClass,\n\t\tfriend,\n\t\tcurrentCity,\n\t\tsubscriber,\n\t\tclosestCity,\n\t\tclosestCity2,\n\t\tclosestCity3,\n\t\tclosestCity4,\n\t\tclosestCity5,\n\t\tclosestCity6,\n\t\tclosestCity7,\n\t})\n\t.from(users)\n\t.fullJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.fullJoin(homeCity, sql`${users.homeCity} = ${homeCity.id}`)\n\t.fullJoin(c, eq(c.id, users.class))\n\t.fullJoin(otherClass, sql`${c.id} = ${otherClass.id}`)\n\t.fullJoin(anotherClass, sql`${users.class} = ${anotherClass.id}`)\n\t.fullJoin(friend, sql`${users.id} = ${friend.id}`)\n\t.fullJoin(currentCity, sql`${homeCity.id} = ${currentCity.id}`)\n\t.fullJoin(subscriber, sql`${users.class} = ${subscriber.id}`)\n\t.fullJoin(closestCity, sql`${users.currentCity} = ${closestCity.id}`)\n\t.fullJoin(closestCity2, sql`${users.currentCity} = ${closestCity.id}`)\n\t.fullJoin(closestCity3, sql`${users.currentCity} = ${closestCity.id}`)\n\t.fullJoin(closestCity4, sql`${users.currentCity} = ${closestCity.id}`)\n\t.fullJoin(closestCity5, sql`${users.currentCity} = ${closestCity.id}`)\n\t.fullJoin(closestCity6, sql`${users.currentCity} = ${closestCity.id}`)\n\t.fullJoin(closestCity7, sql`${users.currentCity} = ${closestCity.id}`)\n\t.where(and(sql`${users.age1} > 0`, eq(cities.id, 1)))\n\t.limit(1)\n\t.offset(1);\n\nconst friends = alias(users, 'friends');\n\nconst join4 = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\tclass: classes,\n\t\tfriend: friends,\n\t})\n\t.from(users)\n\t.innerJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.innerJoin(classes, sql`${cities.id} = ${classes.id}`)\n\t.innerJoin(friends, sql`${friends.id} = ${users.id}`)\n\t.where(sql`${users.age1} > 0`);\n\nExpect<\n\tEqual<{\n\t\tuser: {\n\t\t\tid: number;\n\t\t};\n\t\tcity: {\n\t\t\tid: number;\n\t\t};\n\t\tclass: {\n\t\t\tid: number;\n\t\t\tclass: string | null;\n\t\t\tsubClass: string;\n\t\t};\n\t\tfriend: {\n\t\t\tid: number;\n\t\t\tuuid: string;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\n\t\t\tclass: string;\n\t\t\tsubClass: string | null;\n\t\t\ttext: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\n\t\t\tarrayCol: string[];\n\t\t};\n\t}[], typeof join4>\n>;\n\n{\n\tconst authenticated = false as boolean;\n\n\tconst result = await db\n\t\t.select({\n\t\t\tid: users.id,\n\t\t\t...(authenticated ? { city: users.homeCity } : {}),\n\t\t})\n\t\t.from(users);\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tcity?: number;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\nawait db\n\t.select()\n\t.from(users)\n\t.for('update');\n\nawait db\n\t.select()\n\t.from(users)\n\t.for('no key update', { of: users });\n\nawait db\n\t.select()\n\t.from(users)\n\t.for('no key update', { of: users, skipLocked: true });\n\nawait db\n\t.select()\n\t.from(users)\n\t.for('share', { of: users, noWait: true });\n\nawait db\n\t.select()\n\t.from(users)\n\t// @ts-expect-error - can't use both skipLocked and noWait\n\t.for('share', { of: users, noWait: true, skipLocked: true });\n\nawait db\n\t.select({\n\t\tid: cities.id,\n\t\tname: sql<string>`upper(${cities.name})`.as('name'),\n\t\tusersCount: sql<number>`count(${users.id})`.as('users'),\n\t})\n\t.from(cities)\n\t.leftJoin(users, eq(users.homeCity, cities.id))\n\t.where(({ name }) => sql`length(${name}) >= 3`)\n\t.groupBy(cities.id)\n\t.having(({ usersCount }) => sql`${usersCount} > 0`);\n\n{\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1));\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1))\n\t\t// @ts-expect-error - can't use where twice\n\t\t.where(eq(users.id, 1));\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1))\n\t\t.limit(10)\n\t\t// @ts-expect-error - can't use where twice\n\t\t.where(eq(users.id, 1));\n}\n\n{\n\tfunction withFriends<T extends GelSelect>(qb: T) {\n\t\tconst friends = alias(users, 'friends');\n\t\tconst friends2 = alias(users, 'friends2');\n\t\tconst friends3 = alias(users, 'friends3');\n\t\tconst friends4 = alias(users, 'friends4');\n\t\tconst friends5 = alias(users, 'friends5');\n\t\treturn qb\n\t\t\t.leftJoin(friends, sql`true`)\n\t\t\t.leftJoin(friends2, sql`true`)\n\t\t\t.leftJoin(friends3, sql`true`)\n\t\t\t.leftJoin(friends4, sql`true`)\n\t\t\t.leftJoin(friends5, sql`true`);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await withFriends(qb);\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tfriends: typeof users.$inferSelect | null;\n\t\t\tfriends2: typeof users.$inferSelect | null;\n\t\t\tfriends3: typeof users.$inferSelect | null;\n\t\t\tfriends4: typeof users.$inferSelect | null;\n\t\t\tfriends5: typeof users.$inferSelect | null;\n\t\t}[]>\n\t>;\n}\n\n{\n\tfunction withFriends<T extends GelSelectQueryBuilder>(qb: T) {\n\t\tconst friends = alias(users, 'friends');\n\t\tconst friends2 = alias(users, 'friends2');\n\t\tconst friends3 = alias(users, 'friends3');\n\t\tconst friends4 = alias(users, 'friends4');\n\t\tconst friends5 = alias(users, 'friends5');\n\t\treturn qb\n\t\t\t.leftJoin(friends, sql`true`)\n\t\t\t.leftJoin(friends2, sql`true`)\n\t\t\t.leftJoin(friends3, sql`true`)\n\t\t\t.leftJoin(friends4, sql`true`)\n\t\t\t.leftJoin(friends5, sql`true`);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await withFriends(qb);\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tfriends: typeof users.$inferSelect | null;\n\t\t\tfriends2: typeof users.$inferSelect | null;\n\t\t\tfriends3: typeof users.$inferSelect | null;\n\t\t\tfriends4: typeof users.$inferSelect | null;\n\t\t\tfriends5: typeof users.$inferSelect | null;\n\t\t}[]>\n\t>;\n}\n\n{\n\tfunction dynamic<T extends GelSelect>(qb: T) {\n\t\treturn qb.where(sql``).having(sql``).groupBy(sql``).orderBy(sql``).limit(1).offset(1).for('update');\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await dynamic(qb);\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\n{\n\t// TODO: add to docs\n\tfunction dynamic<T extends GelSelectQueryBuilder>(qb: T) {\n\t\treturn qb.where(sql``).having(sql``).groupBy(sql``).orderBy(sql``).limit(1).offset(1).for('update');\n\t}\n\n\tconst query = new QueryBuilder().select().from(users).$dynamic();\n\tdynamic(query);\n}\n\n{\n\t// TODO: add to docs\n\tfunction paginated<T extends GelSelect>(qb: T, page: number) {\n\t\treturn qb.limit(10).offset((page - 1) * 10);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await paginated(qb, 1);\n\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\n{\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.having(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.having(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.groupBy(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.groupBy(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.orderBy(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.orderBy(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.limit(10)\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.limit(10);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.offset(10)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.offset(10);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.for('update')\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.for('update');\n}\n\n{\n\tconst users = gelTable('users', {\n\t\tdeveloper: boolean('developer'),\n\t\tapplication: text('application'),\n\t});\n\n\tconst startIt = (whereCallback: (condition: SQL) => SQL | undefined = (c) => c) => {\n\t\treturn db.select().from(users).where(whereCallback(eq(users.developer, true)));\n\t};\n\n\tstartIt((c) => and(c, eq(users.application, 'approved')));\n}\n\n{\n\tconst school = gelTable('school', {\n\t\tfaculty: integer('faculty'),\n\t\tstudentid: integer('studentid'),\n\t});\n\n\tconst student = gelTable('student', {\n\t\tid: integer('id'),\n\t\temail: text('email'),\n\t});\n\n\tawait db\n\t\t.select()\n\t\t.from(school)\n\t\t.where(\n\t\t\tand(\n\t\t\t\teq(school.faculty, 2),\n\t\t\t\teq(\n\t\t\t\t\tschool.studentid,\n\t\t\t\t\tdb.select({ id: student.id }).from(student).where(eq(student.email, 'foo@demo.com')),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n}\n\n{\n\tconst table1 = gelTable('table1', {\n\t\tid: integer().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst table2 = gelTable('table2', {\n\t\tid: integer().primaryKey(),\n\t\tage: integer().notNull(),\n\t\ttable1Id: integer().references(() => table1.id).notNull(),\n\t});\n\n\tconst leftLateralRawRes = await db.select({\n\t\ttable1,\n\t\tsqId: sql<number | null>`${sql.identifier('t2')}.${sql.identifier('id')}`.as('sqId'),\n\t}).from(table1).leftJoinLateral(sql`(SELECT * FROM ${table2}) as ${sql.identifier('t2')}`, sql`true`);\n\n\tExpect<\n\t\tEqual<typeof leftLateralRawRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsqId: number | null;\n\t\t}[]>\n\t>;\n\n\tconst leftLateralSubRes = await db.select().from(table1).leftJoinLateral(\n\t\tdb.select().from(table2).as('sub'),\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof leftLateralSubRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsub: {\n\t\t\t\tid: number;\n\t\t\t\tage: number;\n\t\t\t\ttable1Id: number;\n\t\t\t} | null;\n\t\t}[]>\n\t>;\n\n\tconst sqLeftLateral = db.select().from(table2).as('sub');\n\n\tconst leftLateralSubSelectionRes = await db.select(\n\t\t{\n\t\t\tid: table1.id,\n\t\t\tsId: sqLeftLateral.id,\n\t\t},\n\t).from(table1).leftJoinLateral(\n\t\tsqLeftLateral,\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof leftLateralSubSelectionRes, {\n\t\t\tid: number;\n\t\t\tsId: number | null;\n\t\t}[]>\n\t>;\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.leftJoinLateral(table2, sql`true`);\n\n\tconst innerLateralRawRes = await db.select({\n\t\ttable1,\n\t\tsqId: sql<number>`${sql.identifier('t2')}.${sql.identifier('id')}`.as('sqId'),\n\t}).from(table1).innerJoinLateral(sql`(SELECT * FROM ${table2}) as ${sql.identifier('t2')}`, sql`true`);\n\n\tExpect<\n\t\tEqual<typeof innerLateralRawRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsqId: number;\n\t\t}[]>\n\t>;\n\n\tconst innerLateralSubRes = await db.select().from(table1).innerJoinLateral(\n\t\tdb.select().from(table2).as('sub'),\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof innerLateralSubRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsub: {\n\t\t\t\tid: number;\n\t\t\t\tage: number;\n\t\t\t\ttable1Id: number;\n\t\t\t};\n\t\t}[]>\n\t>;\n\n\tconst sqInnerLateral = db.select().from(table2).as('sub');\n\n\tconst innerLateralSubSelectionRes = await db.select(\n\t\t{\n\t\t\tid: table1.id,\n\t\t\tsId: sqLeftLateral.id,\n\t\t},\n\t).from(table1).innerJoinLateral(\n\t\tsqInnerLateral,\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof innerLateralSubSelectionRes, {\n\t\t\tid: number;\n\t\t\tsId: number;\n\t\t}[]>\n\t>;\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.innerJoinLateral(table2, sql`true`);\n\n\tconst crossLateralRawRes = await db.select({\n\t\ttable1,\n\t\tsqId: sql<number>`${sql.identifier('t2')}.${sql.identifier('id')}`.as('sqId'),\n\t}).from(table1).crossJoinLateral(sql`(SELECT * FROM ${table2}) as ${sql.identifier('t2')}`);\n\n\tExpect<\n\t\tEqual<typeof crossLateralRawRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsqId: number;\n\t\t}[]>\n\t>;\n\n\tconst crossLateralSubRes = await db.select().from(table1).crossJoinLateral(\n\t\tdb.select().from(table2).as('sub'),\n\t);\n\n\tExpect<\n\t\tEqual<typeof crossLateralSubRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsub: {\n\t\t\t\tid: number;\n\t\t\t\tage: number;\n\t\t\t\ttable1Id: number;\n\t\t\t};\n\t\t}[]>\n\t>;\n\n\tconst sqCrossLateral = db.select().from(table2).as('sub');\n\n\tconst crossLateralSubSelectionRes = await db.select(\n\t\t{\n\t\t\tid: table1.id,\n\t\t\tsId: sqCrossLateral.id,\n\t\t},\n\t).from(table1).crossJoinLateral(\n\t\tsqInnerLateral,\n\t);\n\n\tExpect<\n\t\tEqual<typeof crossLateralSubSelectionRes, {\n\t\t\tid: number;\n\t\t\tsId: number;\n\t\t}[]>\n\t>;\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.crossJoinLateral(table2);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/set-operators.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils.ts';\nimport { except, exceptAll, type GelSetOperator, intersect, intersectAll, union, unionAll } from '~/gel-core/index.ts';\nimport { eq } from '~/sql/expressions/index.ts';\nimport { desc, sql } from '~/sql/index.ts';\nimport { db } from './db.ts';\nimport { cities, classes, users } from './tables.ts';\n\nconst except2Test = await except(\n\tdb.select({\n\t\tuserId: users.id,\n\t})\n\t\t.from(users),\n\tdb.select({\n\t\tuserId: users.id,\n\t}).from(users),\n);\n\nExpect<Equal<{ userId: number }[], typeof except2Test>>;\n\nconst exceptAll2Test = await exceptAll(\n\tdb.select({\n\t\tid: users.id,\n\t\tage1: users.age1,\n\t})\n\t\t.from(users).where(sql``),\n\tdb.select({\n\t\tid: users.id,\n\t\tage1: users.age1,\n\t}).from(users),\n);\n\nExpect<Equal<{ id: number; age1: number }[], typeof exceptAll2Test>>;\n\nconst unionTest = await db\n\t.select({ id: users.id })\n\t.from(users)\n\t.union(\n\t\tdb\n\t\t\t.select({ id: users.id })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number }[], typeof unionTest>>;\n\nconst unionAllTest = await db\n\t.select({ id: users.id, age: users.age1 })\n\t.from(users)\n\t.unionAll(\n\t\tdb.select({ id: users.id, age: users.age1 })\n\t\t\t.from(users)\n\t\t\t.leftJoin(cities, eq(users.id, cities.id)),\n\t);\n\nExpect<Equal<{ id: number; age: number }[], typeof unionAllTest>>;\n\nconst intersectTest = await db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t.intersect(({ intersect }) =>\n\t\tintersect(\n\t\t\tdb\n\t\t\t\t.select({ id: users.id, homeCity: users.homeCity })\n\t\t\t\t.from(users),\n\t\t\tdb\n\t\t\t\t.select({ id: users.id, homeCity: sql`${users.homeCity}`.mapWith(Number) })\n\t\t\t\t.from(users),\n\t\t)\n\t);\n\nExpect<Equal<{ id: number; homeCity: number }[], typeof intersectTest>>;\n\nconst intersectAllTest = await db\n\t.select({ id: users.id, homeCity: users.class })\n\t.from(users)\n\t.intersect(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: users.class })\n\t\t\t.from(users)\n\t\t\t.leftJoin(cities, eq(users.id, cities.id)),\n\t);\n\nExpect<Equal<{ id: number; homeCity: string }[], typeof intersectAllTest>>;\n\nconst exceptTest = await db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t.except(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: sql`${users.homeCity}`.mapWith(Number) })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number; homeCity: number }[], typeof exceptTest>>;\n\nconst exceptAllTest = await db\n\t.select({ id: users.id, homeCity: users.class })\n\t.from(users)\n\t.except(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: sql<string>`${users.class}` })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number; homeCity: string }[], typeof exceptAllTest>>;\n\nconst union2Test = await union(db.select().from(cities), db.select().from(cities), db.select().from(cities));\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof union2Test>>;\n\nconst unionAll2Test = await unionAll(\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select().from(cities),\n);\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof unionAll2Test>>;\n\nconst intersect2Test = await intersect(\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n);\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof intersect2Test>>;\n\nconst intersectAll2Test = await intersectAll(\n\tunion(\n\t\tdb.select({\n\t\t\tid: cities.id,\n\t\t}).from(cities),\n\t\tdb.select({\n\t\t\tid: cities.id,\n\t\t})\n\t\t\t.from(cities).where(sql``),\n\t),\n\tdb.select({\n\t\tid: cities.id,\n\t})\n\t\t.from(cities),\n).orderBy(desc(cities.id)).limit(23);\n\nExpect<Equal<{ id: number }[], typeof intersectAll2Test>>;\n\nconst unionfull = await union(db.select().from(users), db.select().from(users)).orderBy(sql``).limit(1).offset(2);\n\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\tuuid: string;\n\t\thomeCity: number;\n\t\tcurrentCity: number | null;\n\t\tclass: string;\n\t\tsubClass: string | null;\n\t\ttext: string | null;\n\t\tage1: number;\n\t\tcreatedAt: Date;\n\t\tarrayCol: string[];\n\t}[], typeof unionfull>\n>;\n\nunion(db.select().from(users), db.select().from(users))\n\t.orderBy(sql``)\n\t// @ts-expect-error - method was already called\n\t.orderBy(sql``);\n\nunion(db.select().from(users), db.select().from(users))\n\t.offset(1)\n\t// @ts-expect-error - method was already called\n\t.offset(2);\n\nunion(db.select().from(users), db.select().from(users))\n\t.orderBy(sql``)\n\t// @ts-expect-error - method was already called\n\t.orderBy(sql``);\n\n{\n\tfunction dynamic<T extends GelSetOperator>(qb: T) {\n\t\treturn qb.orderBy(sql``).limit(1).offset(2);\n\t}\n\n\tconst qb = union(db.select().from(users), db.select().from(users)).$dynamic();\n\tconst result = await dynamic(qb);\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\nawait db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\t.intersect(({ intersect }) => intersect(db.select().from(users), db.select().from(users)));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select().from(classes).union(db.select({ id: classes.id }).from(classes));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select({ id: classes.id }).from(classes).union(db.select().from(classes).where(sql``));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select({ id: classes.id }).from(classes).union(db.select().from(classes));\n\nunion(\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select().from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name, population: cities.population }).from(cities),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``).limit(3).$dynamic(),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities).where(sql``),\n\tdb.select({ id: sql<number>`${cities.id}` }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name, population: cities.population }).from(cities).where(sql``),\n);\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/subquery.ts",
    "content": "import { Expect } from 'type-tests/utils.ts';\nimport { alias, gelTable, integer, text } from '~/gel-core/index.ts';\nimport { and, eq } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { DrizzleTypeError, Equal } from '~/utils.ts';\nimport { db } from './db.ts';\n\nconst names = gelTable('names', {\n\tid: integer('id').primaryKey(),\n\tname: text('name'),\n\tauthorId: integer('author_id'),\n});\n\nconst n1 = db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tauthorId: names.authorId,\n\t\tcount1: sql<number>`count(1)::int`.as('count1'),\n\t})\n\t.from(names)\n\t.groupBy(names.id, names.name, names.authorId)\n\t.as('n1');\n\nconst n2 = db\n\t.select({\n\t\tid: names.id,\n\t\tauthorId: names.authorId,\n\t\ttotalCount: sql<number>`count(1)::int`.as('totalCount'),\n\t})\n\t.from(names)\n\t.groupBy(names.id, names.authorId)\n\t.as('n2');\n\nconst result = await db\n\t.select({\n\t\tname: n1.name,\n\t\tauthorId: n1.authorId,\n\t\tcount1: n1.count1,\n\t\ttotalCount: n2.totalCount,\n\t})\n\t.from(n1)\n\t.innerJoin(n2, and(eq(n2.id, n1.id), eq(n2.authorId, n1.authorId)));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t\ttotalCount: number;\n\t\t}[],\n\t\ttypeof result\n\t>\n>;\n\nconst names2 = alias(names, 'names2');\n\nconst sq1 = db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tid2: names2.id,\n\t})\n\t.from(names)\n\t.leftJoin(names2, eq(names.name, names2.name))\n\t.as('sq1');\n\nconst res = await db.select().from(sq1);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tid2: number | null;\n\t\t}[],\n\t\ttypeof res\n\t>\n>;\n\n{\n\tconst sq = db.select({ count: sql<number>`count(1)::int` }).from(names).as('sq');\n\tExpect<typeof sq.count extends DrizzleTypeError<any> ? true : false>;\n}\n\nconst sqUnion = db.select().from(names).union(db.select().from(names2)).as('sqUnion');\n\nconst resUnion = await db.select().from(sqUnion);\n\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\tname: string | null;\n\t\tauthorId: number | null;\n\t}[], typeof resUnion>\n>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/tables-rel.ts",
    "content": "import { foreignKey, gelTable, integer, text, timestamptz } from '~/gel-core/index.ts';\nimport { relations } from '~/relations.ts';\n\nexport const users = gelTable('users', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: integer('city_id').references(() => cities.id).notNull(),\n\thomeCityId: integer('home_city_id').references(() => cities.id),\n\tcreatedAt: timestamptz('created_at').notNull(),\n});\nexport const usersConfig = relations(users, ({ one, many }) => ({\n\tcity: one(cities, { relationName: 'UsersInCity', fields: [users.cityId], references: [cities.id] }),\n\thomeCity: one(cities, { fields: [users.homeCityId], references: [cities.id] }),\n\tposts: many(posts),\n\tcomments: many(comments),\n}));\n\nexport const cities = gelTable('cities', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n});\nexport const citiesConfig = relations(cities, ({ many }) => ({\n\tusers: many(users, { relationName: 'UsersInCity' }),\n}));\n\nexport const posts = gelTable('posts', {\n\tid: integer('id').primaryKey(),\n\ttitle: text('title').notNull(),\n\tauthorId: integer('author_id').references(() => users.id),\n});\nexport const postsConfig = relations(posts, ({ one, many }) => ({\n\tauthor: one(users, { fields: [posts.authorId], references: [users.id] }),\n\tcomments: many(comments),\n}));\n\nexport const comments = gelTable('comments', {\n\tid: integer('id').primaryKey(),\n\tpostId: integer('post_id').references(() => posts.id).notNull(),\n\tauthorId: integer('author_id').references(() => users.id),\n\ttext: text('text').notNull(),\n});\nexport const commentsConfig = relations(comments, ({ one }) => ({\n\tpost: one(posts, { fields: [comments.postId], references: [posts.id] }),\n\tauthor: one(users, { fields: [comments.authorId], references: [users.id] }),\n}));\n\nexport const books = gelTable('books', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n});\nexport const booksConfig = relations(books, ({ many }) => ({\n\tauthors: many(bookAuthors),\n}));\n\nexport const bookAuthors = gelTable('book_authors', {\n\tbookId: integer('book_id').references(() => books.id).notNull(),\n\tauthorId: integer('author_id').references(() => users.id).notNull(),\n\trole: text('role').notNull(),\n});\nexport const bookAuthorsConfig = relations(bookAuthors, ({ one }) => ({\n\tbook: one(books, { fields: [bookAuthors.bookId], references: [books.id] }),\n\tauthor: one(users, { fields: [bookAuthors.authorId], references: [users.id] }),\n}));\n\nexport const node = gelTable('node', {\n\tid: integer('id').primaryKey(),\n\tparentId: integer('parent_id'),\n\tleftId: integer('left_id'),\n\trightId: integer('right_id'),\n}, (node) => ({\n\tfk1: foreignKey({ columns: [node.parentId], foreignColumns: [node.id] }),\n\tfk2: foreignKey({ columns: [node.leftId], foreignColumns: [node.id] }),\n\tfk3: foreignKey({ columns: [node.rightId], foreignColumns: [node.id] }),\n}));\nexport const nodeRelations = relations(node, ({ one }) => ({\n\tparent: one(node, { fields: [node.parentId], references: [node.id] }),\n\tleft: one(node, { fields: [node.leftId], references: [node.id] }),\n\tright: one(node, { fields: [node.rightId], references: [node.id] }),\n}));\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/tables.ts",
    "content": "import { DateDuration, Duration, LocalDate, LocalDateTime, RelativeDuration } from 'gel';\nimport crypto from 'node:crypto';\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { relDuration } from '~/gel-core/columns/relative-duration.ts';\nimport {\n\tbigint,\n\tbigintT,\n\tboolean,\n\tcheck,\n\tdateDuration,\n\tdecimal,\n\tdoublePrecision,\n\tduration,\n\tforeignKey,\n\ttype GelColumn,\n\tgelTable,\n\ttype GelTableWithColumns,\n\tindex,\n\tinteger,\n\tjson,\n\tlocalDate,\n\tprimaryKey,\n\treal,\n\tsmallint,\n\ttext,\n\ttimestamp,\n\ttimestamptz,\n\tuniqueIndex,\n\tuuid,\n} from '~/gel-core/index.ts';\nimport { gelSchema } from '~/gel-core/schema.ts';\nimport { eq } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { InferInsertModel, InferSelectModel } from '~/table.ts';\nimport type { Simplify } from '~/utils.ts';\nimport { db } from './db.ts';\n\n// export const myEnum = gelEnum('my_enum', ['a', 'b', 'c']);\n\nexport const identityColumnsTable = gelTable('identity_columns_table', {\n\tgeneratedCol: integer('generated_col').generatedAlwaysAs(1),\n\talwaysAsIdentity: integer('always_as_identity').generatedAlwaysAsIdentity(),\n\tbyDefaultAsIdentity: integer('by_default_as_identity').generatedByDefaultAsIdentity(),\n\tname: text('name'),\n});\n\nExpect<Equal<InferSelectModel<typeof identityColumnsTable>, typeof identityColumnsTable['$inferSelect']>>;\nExpect<Equal<InferSelectModel<typeof identityColumnsTable>, typeof identityColumnsTable['_']['inferSelect']>>;\nExpect<Equal<InferInsertModel<typeof identityColumnsTable>, typeof identityColumnsTable['$inferInsert']>>;\nExpect<Equal<InferInsertModel<typeof identityColumnsTable>, typeof identityColumnsTable['_']['inferInsert']>>;\nExpect<\n\tEqual<\n\t\tInferInsertModel<typeof identityColumnsTable, { dbColumnNames: false; override: true }>,\n\t\tSimplify<typeof identityColumnsTable['$inferInsert'] & { alwaysAsIdentity?: number | undefined }>\n\t>\n>;\nExpect<\n\tEqual<\n\t\tInferInsertModel<typeof identityColumnsTable, { dbColumnNames: false; override: true }>,\n\t\tSimplify<typeof identityColumnsTable['_']['inferInsert'] & { alwaysAsIdentity?: number | undefined }>\n\t>\n>;\n\nexport const users = gelTable(\n\t'users_table',\n\t{\n\t\tid: integer('id').primaryKey(),\n\t\tuuid: uuid('uuid').notNull(),\n\t\thomeCity: integer('home_city')\n\t\t\t.notNull()\n\t\t\t.references(() => cities.id),\n\t\tcurrentCity: integer('current_city').references(() => cities.id),\n\t\tclass: text('class').notNull(),\n\t\tsubClass: text('sub_class'),\n\t\ttext: text('text'),\n\t\tage1: integer('age1').notNull(),\n\t\tcreatedAt: timestamptz('created_at').notNull(),\n\t\tarrayCol: text('array_col').array().notNull(),\n\t},\n\t(users) => [\n\t\tuniqueIndex('usersAge1Idx').on(users.class.asc().nullsFirst(), sql``),\n\t\tindex('usersAge2Idx').on(sql``),\n\t\tuniqueIndex('uniqueClass')\n\t\t\t.using('btree', users.class.desc().op('text_ops'), users.subClass.nullsLast())\n\t\t\t.where(sql`${users.class} is not null`)\n\t\t\t.concurrently(),\n\t\tcheck('legalAge', sql`${users.age1} > 18`),\n\t\tforeignKey({ columns: [users.subClass], foreignColumns: [classes.subClass] })\n\t\t\t.onUpdate('cascade')\n\t\t\t.onDelete('cascade'),\n\t\tforeignKey({\n\t\t\tcolumns: [users.class, users.subClass],\n\t\t\tforeignColumns: [classes.class, classes.subClass],\n\t\t}),\n\t\tprimaryKey({ columns: [users.age1, users.class] }),\n\t],\n);\n\nExpect<Equal<InferSelectModel<typeof users>, typeof users['$inferSelect']>>;\nExpect<Equal<InferSelectModel<typeof users>, typeof users['_']['inferSelect']>>;\nExpect<Equal<InferInsertModel<typeof users>, typeof users['$inferInsert']>>;\nExpect<Equal<InferInsertModel<typeof users>, typeof users['_']['inferInsert']>>;\n\nexport const cities = gelTable('cities_table', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tpopulation: integer('population').default(0),\n}, (cities) => ({\n\tcitiesNameIdx: index().on(cities.id),\n}));\n\nexport const classes = gelTable('classes_table', {\n\tid: integer('id').primaryKey(),\n\tclass: text('class'),\n\tsubClass: text('sub_class').notNull(),\n});\n\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\tclass?: string | null;\n\t\tsubClass: string;\n\t}, typeof classes.$inferInsert>\n>;\n\nexport const salEmp = gelTable('sal_emp', {\n\tname: text('name').notNull(),\n\tpayByQuarter: integer('pay_by_quarter').array().notNull(),\n\tschedule: text('schedule').array().array().notNull(),\n});\n\nexport const tictactoe = gelTable('tictactoe', {\n\tsquares: integer('squares').array(3).array(3).notNull(),\n});\n\nexport const customSchema = gelSchema('custom');\n\nexport const citiesCustom = customSchema.table('cities_table', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tpopulation: integer('population').default(0),\n}, (cities) => [index().on(cities.id)]);\n\n// TODO not exists\n// {\n// \tconst newYorkers = gelView('new_yorkers', {\n// \t\tuserId: integer('user_id').notNull(),\n// \t\tcityId: integer('city_id'),\n// \t}).existing();\n\n// \tExpect<\n// \t\tEqual<\n// \t\t\tGelViewWithSelection<'new_yorkers', true, {\n// \t\t\t\tuserId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'user_id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelInteger';\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam: string | number;\n// \t\t\t\t\thasDefault: false;\n// \t\t\t\t\tnotNull: true;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: false;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t\tcityId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'city_id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelInteger';\n// \t\t\t\t\tnotNull: false;\n// \t\t\t\t\thasDefault: false;\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam: string | number;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: false;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t}>,\n// \t\t\ttypeof newYorkers\n// \t\t>\n// \t>;\n// }\n\n// {\n// \tconst newYorkers = customSchema.view('new_yorkers', {\n// \t\tuserId: integer('user_id').notNull(),\n// \t\tcityId: integer('city_id'),\n// \t}).existing();\n\n// \tExpect<\n// \t\tEqual<\n// \t\t\tGelViewWithSelection<'new_yorkers', true, {\n// \t\t\t\tuserId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'user_id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelInteger';\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam: number;\n// \t\t\t\t\thasDefault: false;\n// \t\t\t\t\tnotNull: true;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: false;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t\tcityId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'city_id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelInteger';\n// \t\t\t\t\tnotNull: false;\n// \t\t\t\t\thasDefault: false;\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam:  number;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: false;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t}>,\n// \t\t\ttypeof newYorkers\n// \t\t>\n// \t>;\n// }\n\n// export const newYorkers2 = gelMaterializedView('new_yorkers')\n// \t.using('btree')\n// \t.with({\n// \t\tfillfactor: 90,\n// \t\ttoastTupleTarget: 0.5,\n// \t\tautovacuumEnabled: true,\n// \t})\n// \t.tablespace('custom_tablespace')\n// \t.withNoData()\n// \t.as((qb) => {\n// \t\tconst sq = qb\n// \t\t\t.$with('sq')\n// \t\t\t.as(\n// \t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n// \t\t\t\t\t.from(users)\n// \t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n// \t\t\t\t\t.where(sql`${users.age1} > 18`),\n// \t\t\t);\n// \t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n// \t});\n\n// Expect<\n// \tEqual<\n// \t\tGelMaterializedViewWithSelection<'new_yorkers', false, {\n// \t\t\tuserId: GelColumn<{\n// \t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\tname: 'id';\n// \t\t\t\tdataType: 'number';\n// \t\t\t\tcolumnType: 'GelSerial';\n// \t\t\t\tdata: number;\n// \t\t\t\tdriverParam: number;\n// \t\t\t\tnotNull: true;\n// \t\t\t\thasDefault: true;\n// \t\t\t\tenumValues: undefined;\n// \t\t\t\tbaseColumn: never;\n// \t\t\t\tgenerated: undefined;\n// \t\t\t\tidentity: undefined;\n// \t\t\t\tisPrimaryKey: true;\n// \t\t\t\tisAutoincrement: false;\n// \t\t\t\thasRuntimeDefault: false;\n// \t\t\t}>;\n// \t\t\tcityId: GelColumn<{\n// \t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\tname: 'id';\n// \t\t\t\tdataType: 'number';\n// \t\t\t\tcolumnType: 'GelSerial';\n// \t\t\t\tdata: number;\n// \t\t\t\tdriverParam: number;\n// \t\t\t\tnotNull: false;\n// \t\t\t\thasDefault: true;\n// \t\t\t\tenumValues: undefined;\n// \t\t\t\tbaseColumn: never;\n// \t\t\t\tgenerated: undefined;\n// \t\t\t\tidentity: undefined;\n// \t\t\t\tisPrimaryKey: true;\n// \t\t\t\tisAutoincrement: false;\n// \t\t\t\thasRuntimeDefault: false;\n// \t\t\t}>;\n// \t\t}>,\n// \t\ttypeof newYorkers2\n// \t>\n// >;\n\n// {\n// \tconst newYorkers2 = customSchema.materializedView('new_yorkers')\n// \t\t.using('btree')\n// \t\t.with({\n// \t\t\tfillfactor: 90,\n// \t\t\ttoastTupleTarget: 0.5,\n// \t\t\tautovacuumEnabled: true,\n// \t\t})\n// \t\t.tablespace('custom_tablespace')\n// \t\t.withNoData()\n// \t\t.as((qb) => {\n// \t\t\tconst sq = qb\n// \t\t\t\t.$with('sq')\n// \t\t\t\t.as(\n// \t\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n// \t\t\t\t\t\t.from(users)\n// \t\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n// \t\t\t\t\t\t.where(sql`${users.age1} > 18`),\n// \t\t\t\t);\n// \t\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n// \t\t});\n\n// \tExpect<\n// \t\tEqual<\n// \t\t\tGelMaterializedViewWithSelection<'new_yorkers', false, {\n// \t\t\t\tuserId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelSerial';\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam: number;\n// \t\t\t\t\tnotNull: true;\n// \t\t\t\t\thasDefault: true;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: true;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t\tcityId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelSerial';\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam: number;\n// \t\t\t\t\tnotNull: false;\n// \t\t\t\t\thasDefault: true;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: true;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t}>,\n// \t\t\ttypeof newYorkers2\n// \t\t>\n// \t>;\n// }\n\n// {\n// \tconst newYorkers2 = gelMaterializedView('new_yorkers', {\n// \t\tuserId: integer('user_id').notNull(),\n// \t\tcityId: integer('city_id'),\n// \t})\n// \t\t.using('btree')\n// \t\t.with({\n// \t\t\tfillfactor: 90,\n// \t\t\ttoastTupleTarget: 0.5,\n// \t\t\tautovacuumEnabled: true,\n// \t\t})\n// \t\t.tablespace('custom_tablespace')\n// \t\t.withNoData()\n// \t\t.as(\n// \t\t\tsql`select ${users.id} as user_id, ${cities.id} as city_id from ${users} left join ${cities} on ${\n// \t\t\t\teq(cities.id, users.homeCity)\n// \t\t\t} where ${gt(users.age1, 18)}`,\n// \t\t);\n\n// \tExpect<\n// \t\tEqual<\n// \t\t\tGelMaterializedViewWithSelection<'new_yorkers', false, {\n// \t\t\t\tuserId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'user_id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelInteger';\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam: string | number;\n// \t\t\t\t\thasDefault: false;\n// \t\t\t\t\tnotNull: true;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: false;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t\tcityId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'city_id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelInteger';\n// \t\t\t\t\tnotNull: false;\n// \t\t\t\t\thasDefault: false;\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam: string | number;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: false;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t}>,\n// \t\t\ttypeof newYorkers2\n// \t\t>\n// \t>;\n// }\n\n// {\n// \tconst newYorkers2 = customSchema.materializedView('new_yorkers', {\n// \t\tuserId: integer('user_id').notNull(),\n// \t\tcityId: integer('city_id'),\n// \t})\n// \t\t.using('btree')\n// \t\t.with({\n// \t\t\tfillfactor: 90,\n// \t\t\ttoastTupleTarget: 0.5,\n// \t\t\tautovacuumEnabled: true,\n// \t\t})\n// \t\t.tablespace('custom_tablespace')\n// \t\t.withNoData()\n// \t\t.as(\n// \t\t\tsql`select ${users.id} as user_id, ${cities.id} as city_id from ${users} left join ${cities} on ${\n// \t\t\t\teq(cities.id, users.homeCity)\n// \t\t\t} where ${gt(users.age1, 18)}`,\n// \t\t);\n\n// \tExpect<\n// \t\tEqual<\n// \t\t\tGelMaterializedViewWithSelection<'new_yorkers', false, {\n// \t\t\t\tuserId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'user_id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelInteger';\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam: string | number;\n// \t\t\t\t\thasDefault: false;\n// \t\t\t\t\tnotNull: true;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: false;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t\tcityId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'city_id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelInteger';\n// \t\t\t\t\tnotNull: false;\n// \t\t\t\t\thasDefault: false;\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam: string | number;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: false;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t}>,\n// \t\t\ttypeof newYorkers2\n// \t\t>\n// \t>;\n// }\n\n// {\n// \tconst newYorkers2 = gelMaterializedView('new_yorkers', {\n// \t\tuserId: integer('user_id').notNull(),\n// \t\tcityId: integer('city_id'),\n// \t}).existing();\n\n// \tExpect<\n// \t\tEqual<\n// \t\t\tGelMaterializedViewWithSelection<'new_yorkers', true, {\n// \t\t\t\tuserId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'user_id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelInteger';\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam: string | number;\n// \t\t\t\t\thasDefault: false;\n// \t\t\t\t\tnotNull: true;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: false;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t\tcityId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'city_id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelInteger';\n// \t\t\t\t\tnotNull: false;\n// \t\t\t\t\thasDefault: false;\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam: string | number;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: false;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t}>,\n// \t\t\ttypeof newYorkers2\n// \t\t>\n// \t>;\n// }\n\n// {\n// \tconst newYorkers2 = customSchema.materializedView('new_yorkers', {\n// \t\tuserId: integer('user_id').notNull(),\n// \t\tcityId: integer('city_id'),\n// \t}).existing();\n\n// \tExpect<\n// \t\tEqual<\n// \t\t\tGelMaterializedViewWithSelection<'new_yorkers', true, {\n// \t\t\t\tuserId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'user_id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelInteger';\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam: string | number;\n// \t\t\t\t\thasDefault: false;\n// \t\t\t\t\tnotNull: true;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: false;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t\tcityId: GelColumn<{\n// \t\t\t\t\ttableName: 'new_yorkers';\n// \t\t\t\t\tname: 'city_id';\n// \t\t\t\t\tdataType: 'number';\n// \t\t\t\t\tcolumnType: 'GelInteger';\n// \t\t\t\t\tnotNull: false;\n// \t\t\t\t\thasDefault: false;\n// \t\t\t\t\tdata: number;\n// \t\t\t\t\tdriverParam: string | number;\n// \t\t\t\t\tenumValues: undefined;\n// \t\t\t\t\tbaseColumn: never;\n// \t\t\t\t\tgenerated: undefined;\n// \t\t\t\t\tidentity: undefined;\n// \t\t\t\t\tisPrimaryKey: false;\n// \t\t\t\t\tisAutoincrement: false;\n// \t\t\t\t\thasRuntimeDefault: false;\n// \t\t\t\t}>;\n// \t\t\t}>,\n// \t\t\ttypeof newYorkers2\n// \t\t>\n// \t>;\n// }\n\n// await db.refreshMaterializedView(newYorkers2).concurrently();\n// await db.refreshMaterializedView(newYorkers2).withNoData();\n// await db.refreshMaterializedView(newYorkers2).concurrently().withNoData();\n// await db.refreshMaterializedView(newYorkers2).withNoData().concurrently();\n\n// await migrate(db, {\n// \tmigrationsFolder: './drizzle/gel',\n// \tonMigrationError(error) {\n// \t\tif (['0001_drizli_klaud', '0002_beep_boop'].includes(error.migration.name)) {\n// \t\t\treturn;\n// \t\t}\n// \t\tthrow error;\n// \t},\n// });\n\n// TODO not sure that this should be implemented now\n// {\n// \tconst customTextRequired = customType<{\n// \t\tdata: string;\n// \t\tdriverData: string;\n// \t\tconfig: { length: number };\n// \t\tconfigRequired: true;\n// \t}>({\n// \t\tdataType(config) {\n// \t\t\tExpect<Equal<{ length: number }, typeof config>>;\n// \t\t\treturn `varchar(${config.length})`;\n// \t\t},\n\n// \t\ttoDriver(value) {\n// \t\t\tExpect<Equal<string, typeof value>>();\n// \t\t\treturn value;\n// \t\t},\n\n// \t\tfromDriver(value) {\n// \t\t\tExpect<Equal<string, typeof value>>();\n// \t\t\treturn value;\n// \t\t},\n// \t});\n\n// \tcustomTextRequired('t', { length: 10 });\n// \tcustomTextRequired({ length: 10 });\n// \t// @ts-expect-error - config is required\n// \tcustomTextRequired('t');\n// \t// @ts-expect-error - config is required\n// \tcustomTextRequired();\n// }\n\n// {\n// \tconst customTextOptional = customType<{\n// \t\tdata: string;\n// \t\tdriverData: string;\n// \t\tconfig: { length: number };\n// \t}>({\n// \t\tdataType(config) {\n// \t\t\tExpect<Equal<{ length: number } | undefined, typeof config>>;\n// \t\t\treturn config ? `varchar(${config.length})` : `text`;\n// \t\t},\n\n// \t\ttoDriver(value) {\n// \t\t\tExpect<Equal<string, typeof value>>();\n// \t\t\treturn value;\n// \t\t},\n\n// \t\tfromDriver(value) {\n// \t\t\tExpect<Equal<string, typeof value>>();\n// \t\t\treturn value;\n// \t\t},\n// \t});\n\n// \tcustomTextOptional('t', { length: 10 });\n// \tcustomTextOptional('t');\n// \tcustomTextOptional({ length: 10 });\n// \tcustomTextOptional();\n// }\n\n{\n\tconst cities1 = gelTable('cities_table', {\n\t\tid: integer('id').primaryKey(),\n\t\tname: text('name').notNull().primaryKey(),\n\t\trole: text('role').$type<'admin' | 'user'>().default('user').notNull(),\n\t\tpopulation: integer('population').default(0),\n\t});\n\tconst cities2 = gelTable('cities_table', ({ text, integer }) => ({\n\t\tid: integer('id').primaryKey(),\n\t\tname: text('name').notNull().primaryKey(),\n\t\trole: text('role').$type<'admin' | 'user'>().default('user').notNull(),\n\t\tpopulation: integer('population').default(0),\n\t}));\n\n\ttype Expected = GelTableWithColumns<{\n\t\tname: 'cities_table';\n\t\tschema: undefined;\n\t\tdialect: 'gel';\n\t\tcolumns: {\n\t\t\tid: GelColumn<{\n\t\t\t\ttableName: 'cities_table';\n\t\t\t\tname: 'id';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'GelInteger';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: number;\n\t\t\t\thasDefault: false;\n\t\t\t\tnotNull: true;\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t\tname: GelColumn<{\n\t\t\t\ttableName: 'cities_table';\n\t\t\t\tname: 'name';\n\t\t\t\tdataType: 'string';\n\t\t\t\tcolumnType: 'GelText';\n\t\t\t\tdata: string;\n\t\t\t\tdriverParam: string;\n\t\t\t\thasDefault: false;\n\t\t\t\tenumValues: undefined;\n\t\t\t\tnotNull: true;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t\trole: GelColumn<\n\t\t\t\t{\n\t\t\t\t\ttableName: 'cities_table';\n\t\t\t\t\tname: 'role';\n\t\t\t\t\tdataType: 'string';\n\t\t\t\t\tcolumnType: 'GelText';\n\t\t\t\t\tdata: 'admin' | 'user';\n\t\t\t\t\tdriverParam: string;\n\t\t\t\t\thasDefault: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t\t{ $type: 'admin' | 'user' }\n\t\t\t>;\n\t\t\tpopulation: GelColumn<{\n\t\t\t\ttableName: 'cities_table';\n\t\t\t\tname: 'population';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'GelInteger';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: number;\n\t\t\t\tnotNull: false;\n\t\t\t\thasDefault: true;\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: false;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t};\n\t}>;\n\n\tExpect<Equal<Expected, typeof cities1>>;\n\tExpect<Equal<Expected, typeof cities2>>;\n}\n\n{\n\tgelTable('test', {\n\t\tbigint: bigintT('bigintT').default(BigInt(10)),\n\t\ttimestamp: timestamp('timestamp').default(new LocalDateTime(2023, 12, 3, 12, 3, 12)),\n\t\ttimestamptz: timestamptz('timestamp2').default(new Date()),\n\t});\n}\n\n{\n\tconst test = gelTable('test', {\n\t\tcol1: decimal('col1').notNull().default('10.2'),\n\t});\n\tExpect<Equal<{ col1: string }, typeof test.$inferSelect>>;\n}\n\n{\n\tconst getUsersTable = <TSchema extends string>(schemaName: TSchema) => {\n\t\treturn gelSchema(schemaName).table('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\t};\n\n\tconst users1 = getUsersTable('id1');\n\tExpect<Equal<'id1', typeof users1._.schema>>;\n\n\tconst users2 = getUsersTable('id2');\n\tExpect<Equal<'id2', typeof users2._.schema>>;\n}\n\n{\n\tconst internalStaff = gelTable('internal_staff', {\n\t\tuserId: integer('user_id').notNull(),\n\t});\n\n\tconst customUser = gelTable('custom_user', {\n\t\tid: integer('id').notNull(),\n\t});\n\n\tconst ticket = gelTable('ticket', {\n\t\tstaffId: integer('staff_id').notNull(),\n\t});\n\n\tconst subq = db\n\t\t.select()\n\t\t.from(internalStaff)\n\t\t.leftJoin(\n\t\t\tcustomUser,\n\t\t\teq(internalStaff.userId, customUser.id),\n\t\t).as('internal_staff');\n\n\tconst mainQuery = await db\n\t\t.select()\n\t\t.from(ticket)\n\t\t.leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId));\n\n\tExpect<\n\t\tEqual<{\n\t\t\tinternal_staff: {\n\t\t\t\tinternal_staff: {\n\t\t\t\t\tuserId: number;\n\t\t\t\t};\n\t\t\t\tcustom_user: {\n\t\t\t\t\tid: number | null;\n\t\t\t\t};\n\t\t\t} | null;\n\t\t\tticket: {\n\t\t\t\tstaffId: number;\n\t\t\t};\n\t\t}[], typeof mainQuery>\n\t>;\n}\n\n{\n\tconst test = gelTable('test', {\n\t\tid: text('id').$defaultFn(() => crypto.randomUUID()).primaryKey(),\n\t});\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid?: string;\n\t\t}, typeof test.$inferInsert>\n\t>;\n}\n\n{\n\tgelTable('test', {\n\t\tid: integer('id').$default(() => 1),\n\t\tid2: integer('id').$defaultFn(() => 1),\n\t\t// @ts-expect-error - should be number\n\t\tid3: integer('id').$default(() => '1'),\n\t\t// @ts-expect-error - should be number\n\t\tid4: integer('id').$defaultFn(() => '1'),\n\t});\n}\n\n{\n\tgelTable('all_columns', {\n\t\tsm: smallint('smallint'),\n\t\tsmdef: smallint('smallint_def').default(10),\n\t\tint: integer('integer'),\n\t\tintdef: integer('integer_def').default(10),\n\t\tbigint: bigint('bigint'),\n\t\tbigintT: bigintT('bigintT').default(BigInt(100)),\n\t\tbool: boolean('boolean'),\n\t\tbooldef: boolean('boolean_def').default(true),\n\t\ttext: text('text'),\n\t\ttextdef: text('textdef').default('text'),\n\t\tdecimal: decimal('decimal'),\n\t\tdecimaldef: decimal('decimaldef').default('100.0'),\n\t\tdoublePrecision: doublePrecision('doublePrecision'),\n\t\tdoublePrecisiondef: doublePrecision('doublePrecisiondef').default(100),\n\t\treal: real('real'),\n\t\trealdef: real('realdef').default(100),\n\t\tjson: json('json').$type<{ attr: string }>(),\n\t\tjsondef: json('jsondef').$type<{ attr: string }>().default({ attr: 'value' }),\n\t\tjsonb: json('json').$type<{ attr: string }>(),\n\t\tjsonbdef: json('json').$type<{ attr: string }>().default({ attr: 'value' }),\n\t\tlocalDate: localDate('localDate'),\n\t\tlocalDate2: localDate('local_date_def').default(new LocalDate(2023, 12, 1)),\n\t\tduration: duration('duration'),\n\t\tdurationdef: duration('durationdef').default(new Duration(12, 523, 0, 9, 0, 0, 0, 0, 0, 0)),\n\t\trelDuration: relDuration('relDuration'),\n\t\trelDurationdef: relDuration('relDurationdef').default(new RelativeDuration(12, 523, 0, 9, 0, 0, 0, 0, 0)),\n\t\tdateDuration: dateDuration('dateDuration'),\n\t\tdateDurationdef: dateDuration('relDurationdef').default(new DateDuration(12, 12, 12, 6)),\n\t\ttimestamp: timestamp('timestamp'),\n\t\ttimestampdef: timestamp('timestamp_def').default(new LocalDateTime(2023, 1, 1, 1, 1, 14, 0, 0, 0)),\n\t\ttimestamptz: timestamptz('timestamp3'),\n\t\ttimestamptz2: timestamptz('timestampdef').default(new Date()),\n\t});\n}\n\n{\n\tconst keysAsColumnNames = gelTable('test', {\n\t\tid: integer(),\n\t\tname: text(),\n\t});\n\n\tExpect<Equal<typeof keysAsColumnNames['id']['_']['name'], 'id'>>;\n\tExpect<Equal<typeof keysAsColumnNames['name']['_']['name'], 'name'>>;\n}\n\n{\n\tgelTable('all_columns_without_name', {\n\t\tsm: smallint(),\n\t\tsmdef: smallint().default(10),\n\t\tint: integer(),\n\t\tintdef: integer().default(10),\n\t\tbigint: bigint(),\n\t\tbigintT: bigintT().default(BigInt(100)),\n\t\tbool: boolean(),\n\t\tbooldef: boolean().default(true),\n\t\ttext: text(),\n\t\ttextdef: text().default('text'),\n\t\tdecimal: decimal(),\n\t\tdecimaldef: decimal().default('100.0'),\n\t\tdoublePrecision: doublePrecision(),\n\t\tdoublePrecisiondef: doublePrecision().default(100),\n\t\treal: real(),\n\t\trealdef: real().default(100),\n\t\tjson: json().$type<{ attr: string }>(),\n\t\tjsondef: json().$type<{ attr: string }>().default({ attr: 'value' }),\n\t\tjsonb: json().$type<{ attr: string }>(),\n\t\tjsonbdef: json().$type<{ attr: string }>().default({ attr: 'value' }),\n\t\tlocalDate: localDate(),\n\t\tlocalDate2: localDate().default(new LocalDate(2023, 12, 1)),\n\t\tduration: duration(),\n\t\tdurationdef: duration().default(new Duration(12, 523, 0, 9, 0, 0, 0, 0, 0, 0)),\n\t\trelDuration: relDuration(),\n\t\trelDurationdef: relDuration().default(new RelativeDuration(12, 523, 0, 9, 0, 0, 0, 0, 0)),\n\t\tdateDuration: dateDuration(),\n\t\tdateDurationdef: dateDuration().default(new DateDuration(12, 12, 12, 6)),\n\t\ttimestamp: timestamp(),\n\t\ttimestampdef: timestamp().default(new LocalDateTime(2023, 1, 1, 1, 1, 14, 0, 0, 0)),\n\t\ttimestamptz: timestamptz(),\n\t\ttimestamptz2: timestamptz().default(new Date()),\n\t});\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/update.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport type { GelUpdate } from '~/gel-core/index.ts';\nimport { eq } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { Simplify } from '~/utils.ts';\nimport { db } from './db.ts';\nimport { cities, salEmp, users } from './tables.ts';\n\nconst update = await db.update(users)\n\t.set({\n\t\ttext: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1));\nExpect<Equal<unknown, typeof update>>;\n\nconst updateStmt = db.update(users)\n\t.set({\n\t\ttext: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1))\n\t.prepare('updateStmt');\nconst updatePrepared = await updateStmt.execute();\nExpect<Equal<unknown, typeof updatePrepared>>;\n\nconst updateReturning = await db.update(users)\n\t.set({\n\t\ttext: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1))\n\t.returning({\n\t\ttext: users.text,\n\t});\nExpect<Equal<{ text: string | null }[], typeof updateReturning>>;\n\nconst updateReturningStmt = db.update(users)\n\t.set({\n\t\ttext: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1))\n\t.returning({\n\t\ttext: users.text,\n\t})\n\t.prepare('updateReturningStmt');\nconst updateReturningPrepared = await updateReturningStmt.execute();\nExpect<Equal<{ text: string | null }[], typeof updateReturningPrepared>>;\n\n{\n\tfunction dynamic<T extends GelUpdate>(qb: T) {\n\t\treturn qb.where(sql``).returning();\n\t}\n\n\tconst qbBase = db.update(users).set({}).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tfunction withReturning<T extends GelUpdate>(qb: T) {\n\t\treturn qb.returning();\n\t}\n\n\tconst qbBase = db.update(users).set({}).$dynamic();\n\tconst qb = withReturning(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.returning()\n\t\t// @ts-expect-error method was already called\n\t\t.returning();\n\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n}\n\n{\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.from(sql``)\n\t\t.leftJoin(sql``, (table, from) => {\n\t\t\tExpect<Equal<typeof users['_']['columns'], typeof table>>;\n\t\t\tExpect<Equal<never, typeof from>>;\n\t\t\treturn sql``;\n\t\t});\n\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.from(cities)\n\t\t.leftJoin(sql``, (table, from) => {\n\t\t\tExpect<Equal<typeof users['_']['columns'], typeof table>>;\n\t\t\tExpect<Equal<typeof cities['_']['columns'], typeof from>>;\n\t\t\treturn sql``;\n\t\t});\n\n\tconst citiesSq = db.$with('cities_sq').as(db.select({ id: cities.id }).from(cities));\n\n\tdb\n\t\t.with(citiesSq)\n\t\t.update(users)\n\t\t.set({})\n\t\t.from(citiesSq)\n\t\t.leftJoin(sql``, (table, from) => {\n\t\t\tExpect<Equal<typeof users['_']['columns'], typeof table>>;\n\t\t\tExpect<Equal<typeof citiesSq['_']['selectedFields'], typeof from>>;\n\t\t\treturn sql``;\n\t\t});\n\n\tdb\n\t\t.with(citiesSq)\n\t\t.update(users)\n\t\t.set({\n\t\t\thomeCity: citiesSq.id,\n\t\t})\n\t\t.from(citiesSq);\n}\n\n{\n\tconst result = await db.update(users).set({}).from(cities).returning();\n\tExpect<\n\t\tEqual<Simplify<\n\t\t\ttypeof users.$inferSelect & {\n\t\t\t\tcities_table: typeof cities.$inferSelect;\n\t\t\t}\n\t\t>[], typeof result>\n\t>;\n}\n\n{\n\tconst result1 = await db.update(users).set({}).from(cities).leftJoin(salEmp, sql``).returning();\n\tExpect<\n\t\tEqual<Simplify<\n\t\t\ttypeof users.$inferSelect & {\n\t\t\t\tcities_table: typeof cities.$inferSelect;\n\t\t\t\tsal_emp: typeof salEmp.$inferSelect | null;\n\t\t\t}\n\t\t>[], typeof result1>\n\t>;\n\n\tconst result2 = await db.update(users).set({}).from(cities).rightJoin(salEmp, sql``).returning();\n\tExpect<\n\t\tEqual<Simplify<\n\t\t\t{ [K in keyof typeof users.$inferSelect]: typeof users.$inferSelect[K] | null } & {\n\t\t\t\tcities_table: typeof cities.$inferSelect | null;\n\t\t\t\tsal_emp: typeof salEmp.$inferSelect;\n\t\t\t}\n\t\t>[], typeof result2>\n\t>;\n\n\tconst result3 = await db.update(users).set({}).from(cities).innerJoin(salEmp, sql``).returning();\n\tExpect<\n\t\tEqual<Simplify<\n\t\t\ttypeof users.$inferSelect & {\n\t\t\t\tcities_table: typeof cities.$inferSelect;\n\t\t\t\tsal_emp: typeof salEmp.$inferSelect;\n\t\t\t}\n\t\t>[], typeof result3>\n\t>;\n\n\tconst result4 = await db.update(users).set({}).from(cities).fullJoin(salEmp, sql``).returning();\n\tExpect<\n\t\tEqual<Simplify<\n\t\t\t{ [K in keyof typeof users.$inferSelect]: typeof users.$inferSelect[K] | null } & {\n\t\t\t\tcities_table: typeof cities.$inferSelect | null;\n\t\t\t\tsal_emp: typeof salEmp.$inferSelect | null;\n\t\t\t}\n\t\t>[], typeof result4>\n\t>;\n}\n\n{\n\tconst result = await db.update(users).set({}).from(cities).returning({\n\t\tid: users.id,\n\t\tcities: cities,\n\t\tcityName: cities.name,\n\t});\n\tExpect<\n\t\tEqual<Simplify<{\n\t\t\tid: number;\n\t\t\tcities: typeof cities.$inferSelect;\n\t\t\tcityName: string;\n\t\t}>[], typeof result>\n\t>;\n}\n\n{\n\tconst result1 = await db.update(users).set({}).from(cities).leftJoin(salEmp, sql``).returning({\n\t\tid: users.id,\n\t\tcities: cities,\n\t\tcityName: cities.name,\n\t\tsalEmp: salEmp,\n\t\tsalEmpName: salEmp.name,\n\t});\n\tExpect<\n\t\tEqual<Simplify<{\n\t\t\tid: number;\n\t\t\tcities: typeof cities.$inferSelect;\n\t\t\tcityName: string;\n\t\t\tsalEmp: typeof salEmp.$inferSelect | null;\n\t\t\tsalEmpName: string | null;\n\t\t}>[], typeof result1>\n\t>;\n\n\tconst result2 = await db.update(users).set({}).from(cities).rightJoin(salEmp, sql``).returning({\n\t\tid: users.id,\n\t\tcities: cities,\n\t\tcityName: cities.name,\n\t\tsalEmp: salEmp,\n\t\tsalEmpName: salEmp.name,\n\t});\n\tExpect<\n\t\tEqual<Simplify<{\n\t\t\tid: number | null;\n\t\t\tcities: typeof cities.$inferSelect | null;\n\t\t\tcityName: string | null;\n\t\t\tsalEmp: typeof salEmp.$inferSelect;\n\t\t\tsalEmpName: string;\n\t\t}>[], typeof result2>\n\t>;\n\n\tconst result3 = await db.update(users).set({}).from(cities).innerJoin(salEmp, sql``).returning({\n\t\tid: users.id,\n\t\tcities: cities,\n\t\tcityName: cities.name,\n\t\tsalEmp: salEmp,\n\t\tsalEmpName: salEmp.name,\n\t});\n\tExpect<\n\t\tEqual<Simplify<{\n\t\t\tid: number;\n\t\t\tcities: typeof cities.$inferSelect;\n\t\t\tcityName: string;\n\t\t\tsalEmp: typeof salEmp.$inferSelect;\n\t\t\tsalEmpName: string;\n\t\t}>[], typeof result3>\n\t>;\n\n\tconst result4 = await db.update(users).set({}).from(cities).fullJoin(salEmp, sql``).returning({\n\t\tid: users.id,\n\t\tcities: cities,\n\t\tcityName: cities.name,\n\t\tsalEmp: salEmp,\n\t\tsalEmpName: salEmp.name,\n\t});\n\tExpect<\n\t\tEqual<Simplify<{\n\t\t\tid: number | null;\n\t\t\tcities: typeof cities.$inferSelect | null;\n\t\t\tcityName: string | null;\n\t\t\tsalEmp: typeof salEmp.$inferSelect | null;\n\t\t\tsalEmpName: string | null;\n\t\t}>[], typeof result4>\n\t>;\n}\n\n{\n\tawait db\n\t\t.update(users)\n\t\t.set({})\n\t\t// @ts-expect-error can't use joins before from\n\t\t.fullJoin(salEmp, sql``);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/geldb/with.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { gelTable, integer, text } from '~/gel-core/index.ts';\nimport { gt, inArray, like } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\n\nconst orders = gelTable('orders', {\n\tid: integer('id').primaryKey(),\n\tregion: text('region').notNull(),\n\tproduct: text('product').notNull(),\n\tamount: integer('amount').notNull(),\n\tquantity: integer('quantity').notNull(),\n\tgenerated: text('generatedText').generatedAlwaysAs(sql``),\n});\n\n{\n\tconst regionalSales = db\n\t\t.$with('regional_sales')\n\t\t.as((qb) =>\n\t\t\tqb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.groupBy(orders.region)\n\t\t);\n\n\tconst topRegions = db\n\t\t.$with('top_regions')\n\t\t.as((qb) =>\n\t\t\tqb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: orders.amount,\n\t\t\t\t})\n\t\t\t\t.from(regionalSales)\n\t\t\t\t.where(\n\t\t\t\t\tgt(\n\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\tdb.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t);\n\n\tconst result = await db\n\t\t.with(regionalSales, topRegions)\n\t\t.select({\n\t\t\tregion: orders.region,\n\t\t\tproduct: orders.product,\n\t\t\tproductUnits: sql<number>`sum(${orders.quantity})`,\n\t\t\tproductSales: sql<number>`sum(${orders.amount})`,\n\t\t})\n\t\t.from(orders)\n\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)));\n\n\tExpect<\n\t\tEqual<{\n\t\t\tregion: string;\n\t\t\tproduct: string;\n\t\t\tproductUnits: number;\n\t\t\tproductSales: number;\n\t\t}[], typeof result>\n\t>;\n\n\tconst allOrdersWith = db.$with('all_orders_with').as(db.select().from(orders));\n\tconst allFromWith = await db.with(allOrdersWith).select().from(allOrdersWith);\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid: number;\n\t\t\tregion: string;\n\t\t\tproduct: string;\n\t\t\tamount: number;\n\t\t\tquantity: number;\n\t\t\tgenerated: string | null;\n\t\t}[], typeof allFromWith>\n\t>;\n\n\tconst regionalSalesWith = db.$with('regional_sales_with').as(db.select().from(regionalSales));\n\tdb.with(regionalSalesWith).select().from(regionalSalesWith).where(like(regionalSalesWith.totalSales, 'abc'));\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/knex/index.ts",
    "content": "import { knex } from 'knex';\nimport { type Equal, Expect } from 'type-tests/utils.ts';\nimport { pgTable, serial, text } from '~/pg-core/index.ts';\nimport type { PromiseOf } from '~/utils.ts';\nimport '~/knex';\n\nconst test = pgTable('test', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\ndeclare module 'knex/types/tables.ts' {\n\tinterface Tables {\n\t\ttest: Knexify<typeof test>;\n\t}\n}\n\nconst db = knex({});\n\n{\n\tconst res = db('test').select();\n\tExpect<Equal<PromiseOf<typeof res>, typeof test.$inferSelect[]>>;\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/kysely/index.ts",
    "content": "import { Kysely, PostgresDialect } from 'kysely';\nimport pg from 'pg';\nimport { type Equal, Expect } from 'type-tests/utils.ts';\nimport type { Kyselify } from '~/kysely/index.ts';\nimport { char, mysqlTable, timestamp as mysqlTimestamp, varchar as mysqlVarchar } from '~/mysql-core/index.ts';\nimport { integer, pgEnum, pgTable, serial, text, timestamp, varchar } from '~/pg-core/index.ts';\nimport type { PromiseOf } from '~/utils.ts';\n\nconst { Pool } = pg;\n\nconst test = pgTable('test', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\ninterface Database {\n\ttest: Kyselify<typeof test>;\n}\n\nconst db = new Kysely<Database>({\n\tdialect: new PostgresDialect({\n\t\tpool: new Pool(),\n\t}),\n});\n\nconst result = db.selectFrom('test').selectAll().execute();\nExpect<Equal<PromiseOf<typeof result>, typeof test.$inferSelect[]>>();\n\n{\n\tconst units = mysqlTable('units', {\n\t\tid: char('id', { length: 16 }).primaryKey(),\n\t\tname: mysqlVarchar('name', { length: 255 }).notNull(),\n\t\tabbreviation: mysqlVarchar('abbreviation', { length: 10 }).notNull(),\n\t\tcreated_at: mysqlTimestamp('created_at').defaultNow().notNull(),\n\t\tupdated_at: mysqlTimestamp('updated_at').defaultNow().notNull().onUpdateNow(),\n\t});\n\n\ttype UnitModel = typeof units;\n\n\tinterface Database {\n\t\tunits: Kyselify<UnitModel>;\n\t}\n\n\tconst db = new Kysely<Database>({\n\t\tdialect: new PostgresDialect({\n\t\t\tpool: new Pool(),\n\t\t}),\n\t});\n\n\tawait db\n\t\t.insertInto('units')\n\t\t.values({\n\t\t\tid: 'my-unique-id',\n\t\t\tabbreviation: 'foo',\n\t\t\tname: 'bar',\n\t\t})\n\t\t.execute();\n}\n\n{\n\tconst uploadStateEnum = pgEnum('upload_state', ['uploading', 'uploaded', 'failed']);\n\tconst uploadTypeEnum = pgEnum('upload_type', ['image', 'video']);\n\n\tconst uploads = pgTable('uploads', {\n\t\tid: varchar('id', { length: 100 }).primaryKey(),\n\t\tstate: uploadStateEnum('state').notNull().default('uploading'),\n\t\ttype: uploadTypeEnum('type').notNull(),\n\t\tfileName: varchar('file_name', { length: 100 }).notNull(),\n\t\tfileType: varchar('file_type', { length: 100 }).notNull(),\n\t\tfileSize: integer('file_size').notNull(),\n\t\tcreatedAt: timestamp('created_at').notNull().defaultNow(),\n\t\tuploadedAt: timestamp('uploaded_at'),\n\t});\n\n\tinterface Database {\n\t\tuploads: Kyselify<typeof uploads>;\n\t}\n\n\tconst db = new Kysely<Database>({\n\t\tdialect: new PostgresDialect({\n\t\t\tpool: new Pool(),\n\t\t}),\n\t});\n\n\tawait db\n\t\t.insertInto('uploads')\n\t\t.values({\n\t\t\tid: '1',\n\t\t\tfile_name: 'fileName',\n\t\t\tfile_type: 'contentType',\n\t\t\ttype: 'image',\n\t\t\tfile_size: 1,\n\t\t})\n\t\t.returning('id')\n\t\t.executeTakeFirst();\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/1-to-1-fk.ts",
    "content": "import { int, serial } from '~/mysql-core/columns/index.ts';\nimport { mysqlTable } from '~/mysql-core/table.ts';\n\nconst test1 = mysqlTable('test1_table', {\n\tid: serial('id').primaryKey(),\n\ttest2Id: int('test2_id').references(() => test2.id),\n});\n\nconst test1Id = int('test1_id').references(() => test1.id);\n\nconst test2 = mysqlTable('test2_table', {\n\tid: serial('id').primaryKey(),\n\ttest1Id,\n});\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/1000columns.ts",
    "content": "import { bigint, double, mysqlTable, varchar } from '~/mysql-core/index.ts';\n\nmysqlTable('test', {\n\tcol0: double('col1').primaryKey().autoincrement().default(0),\n\tcol1: double('col1').primaryKey().autoincrement().default(0),\n\tcol2: double('col1').primaryKey().autoincrement().default(0),\n\tcol3: double('col1').primaryKey().autoincrement().default(0),\n\tcol4: double('col1').primaryKey().autoincrement().default(0),\n\tcol5: double('col1').primaryKey().autoincrement().default(0),\n\tcol6: double('col1').primaryKey().autoincrement().default(0),\n\tcol8: double('col1').primaryKey().autoincrement().default(0),\n\tcol9: double('col1').primaryKey().autoincrement().default(0),\n\tcol10: double('col1').primaryKey().autoincrement().default(0),\n\tcol11: double('col1').primaryKey().autoincrement().default(0),\n\tcol12: double('col1').primaryKey().autoincrement().default(0),\n\tcol13: double('col1').primaryKey().autoincrement().default(0),\n\tcol14: double('col1').primaryKey().autoincrement().default(0),\n\tcol15: double('col1').primaryKey().autoincrement().default(0),\n\tcol16: double('col1').primaryKey().autoincrement().default(0),\n\tcol18: double('col1').primaryKey().autoincrement().default(0),\n\tcol19: double('col1').primaryKey().autoincrement().default(0),\n\tcol20: double('col1').primaryKey().autoincrement().default(0),\n\tcol21: double('col1').primaryKey().autoincrement().default(0),\n\tcol22: double('col1').primaryKey().autoincrement().default(0),\n\tcol23: double('col1').primaryKey().autoincrement().default(0),\n\tcol24: double('col1').primaryKey().autoincrement().default(0),\n\tcol25: double('col1').primaryKey().autoincrement().default(0),\n\tcol26: double('col1').primaryKey().autoincrement().default(0),\n\tcol28: double('col1').primaryKey().autoincrement().default(0),\n\tcol29: double('col1').primaryKey().autoincrement().default(0),\n\tcol30: double('col1').primaryKey().autoincrement().default(0),\n\tcol31: double('col1').primaryKey().autoincrement().default(0),\n\tcol32: double('col1').primaryKey().autoincrement().default(0),\n\tcol33: double('col1').primaryKey().autoincrement().default(0),\n\tcol34: double('col1').primaryKey().autoincrement().default(0),\n\tcol35: double('col1').primaryKey().autoincrement().default(0),\n\tcol36: double('col1').primaryKey().autoincrement().default(0),\n\tcol38: double('col1').primaryKey().autoincrement().default(0),\n\tcol39: double('col1').primaryKey().autoincrement().default(0),\n\tcol40: double('col1').primaryKey().autoincrement().default(0),\n\tcol41: double('col1').primaryKey().autoincrement().default(0),\n\tcol42: double('col1').primaryKey().autoincrement().default(0),\n\tcol43: double('col1').primaryKey().autoincrement().default(0),\n\tcol44: double('col1').primaryKey().autoincrement().default(0),\n\tcol45: double('col1').primaryKey().autoincrement().default(0),\n\tcol46: double('col1').primaryKey().autoincrement().default(0),\n\tcol48: double('col1').primaryKey().autoincrement().default(0),\n\tcol49: double('col1').primaryKey().autoincrement().default(0),\n\tcol50: double('col1').primaryKey().autoincrement().default(0),\n\tcol51: double('col1').primaryKey().autoincrement().default(0),\n\tcol52: double('col1').primaryKey().autoincrement().default(0),\n\tcol53: double('col1').primaryKey().autoincrement().default(0),\n\tcol54: double('col1').primaryKey().autoincrement().default(0),\n\tcol55: double('col1').primaryKey().autoincrement().default(0),\n\tcol56: double('col1').primaryKey().autoincrement().default(0),\n\tcol58: double('col1').primaryKey().autoincrement().default(0),\n\tcol59: double('col1').primaryKey().autoincrement().default(0),\n\tcol60: double('col1').primaryKey().autoincrement().default(0),\n\tcol61: double('col1').primaryKey().autoincrement().default(0),\n\tcol62: double('col1').primaryKey().autoincrement().default(0),\n\tcol63: double('col1').primaryKey().autoincrement().default(0),\n\tcol64: double('col1').primaryKey().autoincrement().default(0),\n\tcol65: double('col1').primaryKey().autoincrement().default(0),\n\tcol66: double('col1').primaryKey().autoincrement().default(0),\n\tcol68: double('col1').primaryKey().autoincrement().default(0),\n\tcol69: double('col1').primaryKey().autoincrement().default(0),\n\tcol70: double('col1').primaryKey().autoincrement().default(0),\n\tcol71: double('col1').primaryKey().autoincrement().default(0),\n\tcol72: double('col1').primaryKey().autoincrement().default(0),\n\tcol73: double('col1').primaryKey().autoincrement().default(0),\n\tcol74: double('col1').primaryKey().autoincrement().default(0),\n\tcol75: double('col1').primaryKey().autoincrement().default(0),\n\tcol76: double('col1').primaryKey().autoincrement().default(0),\n\tcol78: double('col1').primaryKey().autoincrement().default(0),\n\tcol79: double('col1').primaryKey().autoincrement().default(0),\n\tcol80: double('col1').primaryKey().autoincrement().default(0),\n\tcol81: double('col1').primaryKey().autoincrement().default(0),\n\tcol82: double('col1').primaryKey().autoincrement().default(0),\n\tcol83: double('col1').primaryKey().autoincrement().default(0),\n\tcol84: double('col1').primaryKey().autoincrement().default(0),\n\tcol85: double('col1').primaryKey().autoincrement().default(0),\n\tcol86: double('col1').primaryKey().autoincrement().default(0),\n\tcol88: double('col1').primaryKey().autoincrement().default(0),\n\tcol89: double('col1').primaryKey().autoincrement().default(0),\n\tcol90: double('col1').primaryKey().autoincrement().default(0),\n\tcol91: double('col1').primaryKey().autoincrement().default(0),\n\tcol92: double('col1').primaryKey().autoincrement().default(0),\n\tcol93: double('col1').primaryKey().autoincrement().default(0),\n\tcol94: double('col1').primaryKey().autoincrement().default(0),\n\tcol95: double('col1').primaryKey().autoincrement().default(0),\n\tcol96: double('col1').primaryKey().autoincrement().default(0),\n\tcol98: double('col1').primaryKey().autoincrement().default(0),\n\tcol99: double('col1').primaryKey().autoincrement().default(0),\n\tcol100: double('col1').primaryKey().autoincrement().default(0),\n\tcol101: double('col1').primaryKey().autoincrement().default(0),\n\tcol102: double('col1').primaryKey().autoincrement().default(0),\n\tcol103: double('col1').primaryKey().autoincrement().default(0),\n\tcol104: double('col1').primaryKey().autoincrement().default(0),\n\tcol105: double('col1').primaryKey().autoincrement().default(0),\n\tcol106: double('col1').primaryKey().autoincrement().default(0),\n\tcol108: double('col1').primaryKey().autoincrement().default(0),\n\tcol109: double('col1').primaryKey().autoincrement().default(0),\n\tcol110: double('col11').primaryKey().autoincrement().default(0),\n\tcol111: double('col11').primaryKey().autoincrement().default(0),\n\tcol112: double('col11').primaryKey().autoincrement().default(0),\n\tcol113: double('col11').primaryKey().autoincrement().default(0),\n\tcol114: double('col11').primaryKey().autoincrement().default(0),\n\tcol115: double('col11').primaryKey().autoincrement().default(0),\n\tcol116: double('col11').primaryKey().autoincrement().default(0),\n\tcol118: double('col11').primaryKey().autoincrement().default(0),\n\tcol119: double('col11').primaryKey().autoincrement().default(0),\n\tcol120: double('col11').primaryKey().autoincrement().default(0),\n\tcol121: double('col11').primaryKey().autoincrement().default(0),\n\tcol122: double('col11').primaryKey().autoincrement().default(0),\n\tcol123: double('col11').primaryKey().autoincrement().default(0),\n\tcol124: double('col11').primaryKey().autoincrement().default(0),\n\tcol125: double('col11').primaryKey().autoincrement().default(0),\n\tcol126: double('col11').primaryKey().autoincrement().default(0),\n\tcol128: double('col11').primaryKey().autoincrement().default(0),\n\tcol129: double('col11').primaryKey().autoincrement().default(0),\n\tcol130: double('col11').primaryKey().autoincrement().default(0),\n\tcol131: double('col11').primaryKey().autoincrement().default(0),\n\tcol132: double('col11').primaryKey().autoincrement().default(0),\n\tcol133: double('col11').primaryKey().autoincrement().default(0),\n\tcol134: double('col11').primaryKey().autoincrement().default(0),\n\tcol135: double('col11').primaryKey().autoincrement().default(0),\n\tcol136: double('col11').primaryKey().autoincrement().default(0),\n\tcol138: double('col11').primaryKey().autoincrement().default(0),\n\tcol139: double('col11').primaryKey().autoincrement().default(0),\n\tcol140: double('col11').primaryKey().autoincrement().default(0),\n\tcol141: double('col11').primaryKey().autoincrement().default(0),\n\tcol142: double('col11').primaryKey().autoincrement().default(0),\n\tcol143: double('col11').primaryKey().autoincrement().default(0),\n\tcol144: double('col11').primaryKey().autoincrement().default(0),\n\tcol145: double('col11').primaryKey().autoincrement().default(0),\n\tcol146: double('col11').primaryKey().autoincrement().default(0),\n\tcol148: double('col11').primaryKey().autoincrement().default(0),\n\tcol149: double('col11').primaryKey().autoincrement().default(0),\n\tcol150: double('col11').primaryKey().autoincrement().default(0),\n\tcol151: double('col11').primaryKey().autoincrement().default(0),\n\tcol152: double('col11').primaryKey().autoincrement().default(0),\n\tcol153: double('col11').primaryKey().autoincrement().default(0),\n\tcol154: double('col11').primaryKey().autoincrement().default(0),\n\tcol155: double('col11').primaryKey().autoincrement().default(0),\n\tcol156: double('col11').primaryKey().autoincrement().default(0),\n\tcol158: double('col11').primaryKey().autoincrement().default(0),\n\tcol159: double('col11').primaryKey().autoincrement().default(0),\n\tcol160: double('col11').primaryKey().autoincrement().default(0),\n\tcol161: double('col11').primaryKey().autoincrement().default(0),\n\tcol162: double('col11').primaryKey().autoincrement().default(0),\n\tcol163: double('col11').primaryKey().autoincrement().default(0),\n\tcol164: double('col11').primaryKey().autoincrement().default(0),\n\tcol165: double('col11').primaryKey().autoincrement().default(0),\n\tcol166: double('col11').primaryKey().autoincrement().default(0),\n\tcol168: double('col11').primaryKey().autoincrement().default(0),\n\tcol169: double('col11').primaryKey().autoincrement().default(0),\n\tcol170: double('col11').primaryKey().autoincrement().default(0),\n\tcol171: double('col11').primaryKey().autoincrement().default(0),\n\tcol172: double('col11').primaryKey().autoincrement().default(0),\n\tcol173: double('col11').primaryKey().autoincrement().default(0),\n\tcol174: double('col11').primaryKey().autoincrement().default(0),\n\tcol175: double('col11').primaryKey().autoincrement().default(0),\n\tcol176: double('col11').primaryKey().autoincrement().default(0),\n\tcol178: double('col11').primaryKey().autoincrement().default(0),\n\tcol179: double('col11').primaryKey().autoincrement().default(0),\n\tcol180: double('col11').primaryKey().autoincrement().default(0),\n\tcol181: double('col11').primaryKey().autoincrement().default(0),\n\tcol182: double('col11').primaryKey().autoincrement().default(0),\n\tcol183: double('col11').primaryKey().autoincrement().default(0),\n\tcol184: double('col11').primaryKey().autoincrement().default(0),\n\tcol185: double('col11').primaryKey().autoincrement().default(0),\n\tcol186: double('col11').primaryKey().autoincrement().default(0),\n\tcol188: double('col11').primaryKey().autoincrement().default(0),\n\tcol189: double('col11').primaryKey().autoincrement().default(0),\n\tcol190: double('col11').primaryKey().autoincrement().default(0),\n\tcol191: double('col11').primaryKey().autoincrement().default(0),\n\tcol192: double('col11').primaryKey().autoincrement().default(0),\n\tcol193: double('col11').primaryKey().autoincrement().default(0),\n\tcol194: double('col11').primaryKey().autoincrement().default(0),\n\tcol195: double('col11').primaryKey().autoincrement().default(0),\n\tcol196: double('col11').primaryKey().autoincrement().default(0),\n\tcol198: double('col11').primaryKey().autoincrement().default(0),\n\tcol199: double('col11').primaryKey().autoincrement().default(0),\n\tcol200: double('col2').primaryKey().autoincrement().default(0),\n\tcol201: double('col2').primaryKey().autoincrement().default(0),\n\tcol202: double('col2').primaryKey().autoincrement().default(0),\n\tcol203: double('col2').primaryKey().autoincrement().default(0),\n\tcol204: double('col2').primaryKey().autoincrement().default(0),\n\tcol205: double('col2').primaryKey().autoincrement().default(0),\n\tcol206: double('col2').primaryKey().autoincrement().default(0),\n\tcol208: double('col2').primaryKey().autoincrement().default(0),\n\tcol209: double('col2').primaryKey().autoincrement().default(0),\n\tcol210: double('col21').primaryKey().autoincrement().default(0),\n\tcol211: double('col21').primaryKey().autoincrement().default(0),\n\tcol212: double('col21').primaryKey().autoincrement().default(0),\n\tcol213: double('col21').primaryKey().autoincrement().default(0),\n\tcol214: double('col21').primaryKey().autoincrement().default(0),\n\tcol215: double('col21').primaryKey().autoincrement().default(0),\n\tcol216: double('col21').primaryKey().autoincrement().default(0),\n\tcol218: double('col21').primaryKey().autoincrement().default(0),\n\tcol219: double('col21').primaryKey().autoincrement().default(0),\n\tcol220: double('col21').primaryKey().autoincrement().default(0),\n\tcol221: double('col21').primaryKey().autoincrement().default(0),\n\tcol222: double('col21').primaryKey().autoincrement().default(0),\n\tcol223: double('col21').primaryKey().autoincrement().default(0),\n\tcol224: double('col21').primaryKey().autoincrement().default(0),\n\tcol225: double('col21').primaryKey().autoincrement().default(0),\n\tcol226: double('col21').primaryKey().autoincrement().default(0),\n\tcol228: double('col21').primaryKey().autoincrement().default(0),\n\tcol229: double('col21').primaryKey().autoincrement().default(0),\n\tcol230: double('col21').primaryKey().autoincrement().default(0),\n\tcol231: double('col21').primaryKey().autoincrement().default(0),\n\tcol232: double('col21').primaryKey().autoincrement().default(0),\n\tcol233: double('col21').primaryKey().autoincrement().default(0),\n\tcol234: double('col21').primaryKey().autoincrement().default(0),\n\tcol235: double('col21').primaryKey().autoincrement().default(0),\n\tcol236: double('col21').primaryKey().autoincrement().default(0),\n\tcol238: double('col21').primaryKey().autoincrement().default(0),\n\tcol239: double('col21').primaryKey().autoincrement().default(0),\n\tcol240: double('col21').primaryKey().autoincrement().default(0),\n\tcol241: double('col21').primaryKey().autoincrement().default(0),\n\tcol242: double('col21').primaryKey().autoincrement().default(0),\n\tcol243: double('col21').primaryKey().autoincrement().default(0),\n\tcol244: double('col21').primaryKey().autoincrement().default(0),\n\tcol245: double('col21').primaryKey().autoincrement().default(0),\n\tcol246: double('col21').primaryKey().autoincrement().default(0),\n\tcol248: double('col21').primaryKey().autoincrement().default(0),\n\tcol249: double('col21').primaryKey().autoincrement().default(0),\n\tcol250: double('col21').primaryKey().autoincrement().default(0),\n\tcol251: double('col21').primaryKey().autoincrement().default(0),\n\tcol252: double('col21').primaryKey().autoincrement().default(0),\n\tcol253: double('col21').primaryKey().autoincrement().default(0),\n\tcol254: double('col21').primaryKey().autoincrement().default(0),\n\tcol255: double('col21').primaryKey().autoincrement().default(0),\n\tcol256: double('col21').primaryKey().autoincrement().default(0),\n\tcol258: double('col21').primaryKey().autoincrement().default(0),\n\tcol259: double('col21').primaryKey().autoincrement().default(0),\n\tcol260: double('col21').primaryKey().autoincrement().default(0),\n\tcol261: double('col21').primaryKey().autoincrement().default(0),\n\tcol262: double('col21').primaryKey().autoincrement().default(0),\n\tcol263: double('col21').primaryKey().autoincrement().default(0),\n\tcol264: double('col21').primaryKey().autoincrement().default(0),\n\tcol265: double('col21').primaryKey().autoincrement().default(0),\n\tcol266: double('col21').primaryKey().autoincrement().default(0),\n\tcol268: double('col21').primaryKey().autoincrement().default(0),\n\tcol269: double('col21').primaryKey().autoincrement().default(0),\n\tcol270: double('col21').primaryKey().autoincrement().default(0),\n\tcol271: double('col21').primaryKey().autoincrement().default(0),\n\tcol272: double('col21').primaryKey().autoincrement().default(0),\n\tcol273: double('col21').primaryKey().autoincrement().default(0),\n\tcol274: double('col21').primaryKey().autoincrement().default(0),\n\tcol275: double('col21').primaryKey().autoincrement().default(0),\n\tcol276: double('col21').primaryKey().autoincrement().default(0),\n\tcol278: double('col21').primaryKey().autoincrement().default(0),\n\tcol279: double('col21').primaryKey().autoincrement().default(0),\n\tcol280: double('col21').primaryKey().autoincrement().default(0),\n\tcol281: double('col21').primaryKey().autoincrement().default(0),\n\tcol282: double('col21').primaryKey().autoincrement().default(0),\n\tcol283: double('col21').primaryKey().autoincrement().default(0),\n\tcol284: double('col21').primaryKey().autoincrement().default(0),\n\tcol285: double('col21').primaryKey().autoincrement().default(0),\n\tcol286: double('col21').primaryKey().autoincrement().default(0),\n\tcol288: double('col21').primaryKey().autoincrement().default(0),\n\tcol289: double('col21').primaryKey().autoincrement().default(0),\n\tcol290: double('col21').primaryKey().autoincrement().default(0),\n\tcol291: double('col21').primaryKey().autoincrement().default(0),\n\tcol292: double('col21').primaryKey().autoincrement().default(0),\n\tcol293: double('col21').primaryKey().autoincrement().default(0),\n\tcol294: double('col21').primaryKey().autoincrement().default(0),\n\tcol295: double('col21').primaryKey().autoincrement().default(0),\n\tcol296: double('col21').primaryKey().autoincrement().default(0),\n\tcol298: double('col21').primaryKey().autoincrement().default(0),\n\tcol299: double('col21').primaryKey().autoincrement().default(0),\n\tcol300: double('col3').primaryKey().autoincrement().default(0),\n\tcol301: double('col3').primaryKey().autoincrement().default(0),\n\tcol302: double('col3').primaryKey().autoincrement().default(0),\n\tcol303: double('col3').primaryKey().autoincrement().default(0),\n\tcol304: double('col3').primaryKey().autoincrement().default(0),\n\tcol305: double('col3').primaryKey().autoincrement().default(0),\n\tcol306: double('col3').primaryKey().autoincrement().default(0),\n\tcol308: double('col3').primaryKey().autoincrement().default(0),\n\tcol309: double('col3').primaryKey().autoincrement().default(0),\n\tcol310: double('col31').primaryKey().autoincrement().default(0),\n\tcol311: double('col31').primaryKey().autoincrement().default(0),\n\tcol312: double('col31').primaryKey().autoincrement().default(0),\n\tcol313: double('col31').primaryKey().autoincrement().default(0),\n\tcol314: double('col31').primaryKey().autoincrement().default(0),\n\tcol315: double('col31').primaryKey().autoincrement().default(0),\n\tcol316: double('col31').primaryKey().autoincrement().default(0),\n\tcol318: double('col31').primaryKey().autoincrement().default(0),\n\tcol319: double('col31').primaryKey().autoincrement().default(0),\n\tcol320: double('col31').primaryKey().autoincrement().default(0),\n\tcol321: double('col31').primaryKey().autoincrement().default(0),\n\tcol322: double('col31').primaryKey().autoincrement().default(0),\n\tcol323: double('col31').primaryKey().autoincrement().default(0),\n\tcol324: double('col31').primaryKey().autoincrement().default(0),\n\tcol325: double('col31').primaryKey().autoincrement().default(0),\n\tcol326: double('col31').primaryKey().autoincrement().default(0),\n\tcol328: double('col31').primaryKey().autoincrement().default(0),\n\tcol329: double('col31').primaryKey().autoincrement().default(0),\n\tcol330: double('col31').primaryKey().autoincrement().default(0),\n\tcol331: double('col31').primaryKey().autoincrement().default(0),\n\tcol332: double('col31').primaryKey().autoincrement().default(0),\n\tcol333: double('col31').primaryKey().autoincrement().default(0),\n\tcol334: double('col31').primaryKey().autoincrement().default(0),\n\tcol335: double('col31').primaryKey().autoincrement().default(0),\n\tcol336: double('col31').primaryKey().autoincrement().default(0),\n\tcol338: double('col31').primaryKey().autoincrement().default(0),\n\tcol339: double('col31').primaryKey().autoincrement().default(0),\n\tcol340: double('col31').primaryKey().autoincrement().default(0),\n\tcol341: double('col31').primaryKey().autoincrement().default(0),\n\tcol342: double('col31').primaryKey().autoincrement().default(0),\n\tcol343: double('col31').primaryKey().autoincrement().default(0),\n\tcol344: double('col31').primaryKey().autoincrement().default(0),\n\tcol345: double('col31').primaryKey().autoincrement().default(0),\n\tcol346: double('col31').primaryKey().autoincrement().default(0),\n\tcol348: double('col31').primaryKey().autoincrement().default(0),\n\tcol349: double('col31').primaryKey().autoincrement().default(0),\n\tcol350: double('col31').primaryKey().autoincrement().default(0),\n\tcol351: double('col31').primaryKey().autoincrement().default(0),\n\tcol352: double('col31').primaryKey().autoincrement().default(0),\n\tcol353: double('col31').primaryKey().autoincrement().default(0),\n\tcol354: double('col31').primaryKey().autoincrement().default(0),\n\tcol355: double('col31').primaryKey().autoincrement().default(0),\n\tcol356: double('col31').primaryKey().autoincrement().default(0),\n\tcol358: double('col31').primaryKey().autoincrement().default(0),\n\tcol359: double('col31').primaryKey().autoincrement().default(0),\n\tcol360: double('col31').primaryKey().autoincrement().default(0),\n\tcol361: double('col31').primaryKey().autoincrement().default(0),\n\tcol362: double('col31').primaryKey().autoincrement().default(0),\n\tcol363: double('col31').primaryKey().autoincrement().default(0),\n\tcol364: double('col31').primaryKey().autoincrement().default(0),\n\tcol365: double('col31').primaryKey().autoincrement().default(0),\n\tcol366: double('col31').primaryKey().autoincrement().default(0),\n\tcol368: double('col31').primaryKey().autoincrement().default(0),\n\tcol369: double('col31').primaryKey().autoincrement().default(0),\n\tcol370: double('col31').primaryKey().autoincrement().default(0),\n\tcol371: double('col31').primaryKey().autoincrement().default(0),\n\tcol372: double('col31').primaryKey().autoincrement().default(0),\n\tcol373: double('col31').primaryKey().autoincrement().default(0),\n\tcol374: double('col31').primaryKey().autoincrement().default(0),\n\tcol375: double('col31').primaryKey().autoincrement().default(0),\n\tcol376: double('col31').primaryKey().autoincrement().default(0),\n\tcol378: double('col31').primaryKey().autoincrement().default(0),\n\tcol379: double('col31').primaryKey().autoincrement().default(0),\n\tcol380: double('col31').primaryKey().autoincrement().default(0),\n\tcol381: double('col31').primaryKey().autoincrement().default(0),\n\tcol382: double('col31').primaryKey().autoincrement().default(0),\n\tcol383: double('col31').primaryKey().autoincrement().default(0),\n\tcol384: double('col31').primaryKey().autoincrement().default(0),\n\tcol385: double('col31').primaryKey().autoincrement().default(0),\n\tcol386: double('col31').primaryKey().autoincrement().default(0),\n\tcol388: double('col31').primaryKey().autoincrement().default(0),\n\tcol389: double('col31').primaryKey().autoincrement().default(0),\n\tcol390: double('col31').primaryKey().autoincrement().default(0),\n\tcol391: double('col31').primaryKey().autoincrement().default(0),\n\tcol392: double('col31').primaryKey().autoincrement().default(0),\n\tcol393: double('col31').primaryKey().autoincrement().default(0),\n\tcol394: double('col31').primaryKey().autoincrement().default(0),\n\tcol395: double('col31').primaryKey().autoincrement().default(0),\n\tcol396: double('col31').primaryKey().autoincrement().default(0),\n\tcol398: double('col31').primaryKey().autoincrement().default(0),\n\tcol399: double('col31').primaryKey().autoincrement().default(0),\n\tcol400: double('col4').primaryKey().autoincrement().default(0),\n\tcol401: double('col4').primaryKey().autoincrement().default(0),\n\tcol402: double('col4').primaryKey().autoincrement().default(0),\n\tcol403: double('col4').primaryKey().autoincrement().default(0),\n\tcol404: double('col4').primaryKey().autoincrement().default(0),\n\tcol405: double('col4').primaryKey().autoincrement().default(0),\n\tcol406: double('col4').primaryKey().autoincrement().default(0),\n\tcol408: double('col4').primaryKey().autoincrement().default(0),\n\tcol409: double('col4').primaryKey().autoincrement().default(0),\n\tcol410: double('col41').primaryKey().autoincrement().default(0),\n\tcol411: double('col41').primaryKey().autoincrement().default(0),\n\tcol412: double('col41').primaryKey().autoincrement().default(0),\n\tcol413: double('col41').primaryKey().autoincrement().default(0),\n\tcol414: double('col41').primaryKey().autoincrement().default(0),\n\tcol415: double('col41').primaryKey().autoincrement().default(0),\n\tcol416: double('col41').primaryKey().autoincrement().default(0),\n\tcol418: double('col41').primaryKey().autoincrement().default(0),\n\tcol419: double('col41').primaryKey().autoincrement().default(0),\n\tcol420: double('col41').primaryKey().autoincrement().default(0),\n\tcol421: double('col41').primaryKey().autoincrement().default(0),\n\tcol422: double('col41').primaryKey().autoincrement().default(0),\n\tcol423: double('col41').primaryKey().autoincrement().default(0),\n\tcol424: double('col41').primaryKey().autoincrement().default(0),\n\tcol425: double('col41').primaryKey().autoincrement().default(0),\n\tcol426: double('col41').primaryKey().autoincrement().default(0),\n\tcol428: double('col41').primaryKey().autoincrement().default(0),\n\tcol429: double('col41').primaryKey().autoincrement().default(0),\n\tcol430: double('col41').primaryKey().autoincrement().default(0),\n\tcol431: double('col41').primaryKey().autoincrement().default(0),\n\tcol432: double('col41').primaryKey().autoincrement().default(0),\n\tcol433: double('col41').primaryKey().autoincrement().default(0),\n\tcol434: double('col41').primaryKey().autoincrement().default(0),\n\tcol435: double('col41').primaryKey().autoincrement().default(0),\n\tcol436: double('col41').primaryKey().autoincrement().default(0),\n\tcol438: double('col41').primaryKey().autoincrement().default(0),\n\tcol439: double('col41').primaryKey().autoincrement().default(0),\n\tcol440: double('col41').primaryKey().autoincrement().default(0),\n\tcol441: double('col41').primaryKey().autoincrement().default(0),\n\tcol442: double('col41').primaryKey().autoincrement().default(0),\n\tcol443: double('col41').primaryKey().autoincrement().default(0),\n\tcol444: double('col41').primaryKey().autoincrement().default(0),\n\tcol445: double('col41').primaryKey().autoincrement().default(0),\n\tcol446: double('col41').primaryKey().autoincrement().default(0),\n\tcol448: double('col41').primaryKey().autoincrement().default(0),\n\tcol449: double('col41').primaryKey().autoincrement().default(0),\n\tcol450: double('col41').primaryKey().autoincrement().default(0),\n\tcol451: double('col41').primaryKey().autoincrement().default(0),\n\tcol452: double('col41').primaryKey().autoincrement().default(0),\n\tcol453: double('col41').primaryKey().autoincrement().default(0),\n\tcol454: double('col41').primaryKey().autoincrement().default(0),\n\tcol455: double('col41').primaryKey().autoincrement().default(0),\n\tcol456: double('col41').primaryKey().autoincrement().default(0),\n\tcol458: double('col41').primaryKey().autoincrement().default(0),\n\tcol459: double('col41').primaryKey().autoincrement().default(0),\n\tcol460: double('col41').primaryKey().autoincrement().default(0),\n\tcol461: double('col41').primaryKey().autoincrement().default(0),\n\tcol462: double('col41').primaryKey().autoincrement().default(0),\n\tcol463: double('col41').primaryKey().autoincrement().default(0),\n\tcol464: double('col41').primaryKey().autoincrement().default(0),\n\tcol465: double('col41').primaryKey().autoincrement().default(0),\n\tcol466: double('col41').primaryKey().autoincrement().default(0),\n\tcol468: double('col41').primaryKey().autoincrement().default(0),\n\tcol469: double('col41').primaryKey().autoincrement().default(0),\n\tcol470: double('col41').primaryKey().autoincrement().default(0),\n\tcol471: double('col41').primaryKey().autoincrement().default(0),\n\tcol472: double('col41').primaryKey().autoincrement().default(0),\n\tcol473: double('col41').primaryKey().autoincrement().default(0),\n\tcol474: double('col41').primaryKey().autoincrement().default(0),\n\tcol475: double('col41').primaryKey().autoincrement().default(0),\n\tcol476: double('col41').primaryKey().autoincrement().default(0),\n\tcol478: double('col41').primaryKey().autoincrement().default(0),\n\tcol479: double('col41').primaryKey().autoincrement().default(0),\n\tcol480: double('col41').primaryKey().autoincrement().default(0),\n\tcol481: double('col41').primaryKey().autoincrement().default(0),\n\tcol482: double('col41').primaryKey().autoincrement().default(0),\n\tcol483: double('col41').primaryKey().autoincrement().default(0),\n\tcol484: double('col41').primaryKey().autoincrement().default(0),\n\tcol485: double('col41').primaryKey().autoincrement().default(0),\n\tcol486: double('col41').primaryKey().autoincrement().default(0),\n\tcol488: double('col41').primaryKey().autoincrement().default(0),\n\tcol489: double('col41').primaryKey().autoincrement().default(0),\n\tcol490: double('col41').primaryKey().autoincrement().default(0),\n\tcol491: double('col41').primaryKey().autoincrement().default(0),\n\tcol492: double('col41').primaryKey().autoincrement().default(0),\n\tcol493: double('col41').primaryKey().autoincrement().default(0),\n\tcol494: double('col41').primaryKey().autoincrement().default(0),\n\tcol495: double('col41').primaryKey().autoincrement().default(0),\n\tcol496: double('col41').primaryKey().autoincrement().default(0),\n\tcol498: double('col41').primaryKey().autoincrement().default(0),\n\tcol499: double('col41').primaryKey().autoincrement().default(0),\n\tcol500: double('col5').primaryKey().autoincrement().default(0),\n\tcol501: double('col5').primaryKey().autoincrement().default(0),\n\tcol502: double('col5').primaryKey().autoincrement().default(0),\n\tcol503: double('col5').primaryKey().autoincrement().default(0),\n\tcol504: double('col5').primaryKey().autoincrement().default(0),\n\tcol505: double('col5').primaryKey().autoincrement().default(0),\n\tcol506: double('col5').primaryKey().autoincrement().default(0),\n\tcol508: double('col5').primaryKey().autoincrement().default(0),\n\tcol509: double('col5').primaryKey().autoincrement().default(0),\n\tcol510: double('col51').primaryKey().autoincrement().default(0),\n\tcol511: double('col51').primaryKey().autoincrement().default(0),\n\tcol512: double('col51').primaryKey().autoincrement().default(0),\n\tcol513: double('col51').primaryKey().autoincrement().default(0),\n\tcol514: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol515: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol516: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol518: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol519: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol520: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol521: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol522: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol523: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol524: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol525: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol526: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol528: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol529: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol530: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol531: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol532: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol533: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol534: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol535: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol536: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol538: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol539: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol540: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol541: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol542: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol543: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol544: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol545: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol546: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol548: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol549: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol550: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol551: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol552: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol553: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol554: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol555: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol556: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol558: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol559: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol560: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol561: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol562: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol563: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol564: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol565: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol566: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol568: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol569: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol570: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol571: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol572: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol573: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol574: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol575: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol576: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol578: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol579: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol580: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol581: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol582: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol583: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol584: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol585: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol586: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol588: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol589: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol590: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol591: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol592: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol593: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol594: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol595: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol596: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol598: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol599: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol600: bigint('col6', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol601: double('col6').primaryKey().autoincrement().default(0),\n\tcol602: double('col6').primaryKey().autoincrement().default(0),\n\tcol603: double('col6').primaryKey().autoincrement().default(0),\n\tcol604: double('col6').primaryKey().autoincrement().default(0),\n\tcol605: double('col6').primaryKey().autoincrement().default(0),\n\tcol606: double('col6').primaryKey().autoincrement().default(0),\n\tcol608: double('col6').primaryKey().autoincrement().default(0),\n\tcol609: double('col6').primaryKey().autoincrement().default(0),\n\tcol610: double('col61').primaryKey().autoincrement().default(0),\n\tcol611: double('col61').primaryKey().autoincrement().default(0),\n\tcol612: double('col61').primaryKey().autoincrement().default(0),\n\tcol613: double('col61').primaryKey().autoincrement().default(0),\n\tcol614: double('col61').primaryKey().autoincrement().default(0),\n\tcol615: double('col61').primaryKey().autoincrement().default(0),\n\tcol616: double('col61').primaryKey().autoincrement().default(0),\n\tcol618: double('col61').primaryKey().autoincrement().default(0),\n\tcol619: double('col61').primaryKey().autoincrement().default(0),\n\tcol620: double('col61').primaryKey().autoincrement().default(0),\n\tcol621: double('col61').primaryKey().autoincrement().default(0),\n\tcol622: double('col61').primaryKey().autoincrement().default(0),\n\tcol623: double('col61').primaryKey().autoincrement().default(0),\n\tcol624: double('col61').primaryKey().autoincrement().default(0),\n\tcol625: double('col61').primaryKey().autoincrement().default(0),\n\tcol626: double('col61').primaryKey().autoincrement().default(0),\n\tcol628: double('col61').primaryKey().autoincrement().default(0),\n\tcol629: double('col61').primaryKey().autoincrement().default(0),\n\tcol630: double('col61').primaryKey().autoincrement().default(0),\n\tcol631: double('col61').primaryKey().autoincrement().default(0),\n\tcol632: double('col61').primaryKey().autoincrement().default(0),\n\tcol633: double('col61').primaryKey().autoincrement().default(0),\n\tcol634: double('col61').primaryKey().autoincrement().default(0),\n\tcol635: double('col61').primaryKey().autoincrement().default(0),\n\tcol636: double('col61').primaryKey().autoincrement().default(0),\n\tcol638: double('col61').primaryKey().autoincrement().default(0),\n\tcol639: double('col61').primaryKey().autoincrement().default(0),\n\tcol640: double('col61').primaryKey().autoincrement().default(0),\n\tcol641: double('col61').primaryKey().autoincrement().default(0),\n\tcol642: double('col61').primaryKey().autoincrement().default(0),\n\tcol643: double('col61').primaryKey().autoincrement().default(0),\n\tcol644: double('col61').primaryKey().autoincrement().default(0),\n\tcol645: double('col61').primaryKey().autoincrement().default(0),\n\tcol646: double('col61').primaryKey().autoincrement().default(0),\n\tcol648: double('col61').primaryKey().autoincrement().default(0),\n\tcol649: double('col61').primaryKey().autoincrement().default(0),\n\tcol650: double('col61').primaryKey().autoincrement().default(0),\n\tcol651: double('col61').primaryKey().autoincrement().default(0),\n\tcol652: double('col61').primaryKey().autoincrement().default(0),\n\tcol653: double('col61').primaryKey().autoincrement().default(0),\n\tcol654: double('col61').primaryKey().autoincrement().default(0),\n\tcol655: double('col61').primaryKey().autoincrement().default(0),\n\tcol656: double('col61').primaryKey().autoincrement().default(0),\n\tcol658: double('col61').primaryKey().autoincrement().default(0),\n\tcol659: double('col61').primaryKey().autoincrement().default(0),\n\tcol660: double('col61').primaryKey().autoincrement().default(0),\n\tcol661: double('col61').primaryKey().autoincrement().default(0),\n\tcol662: double('col61').primaryKey().autoincrement().default(0),\n\tcol663: double('col61').primaryKey().autoincrement().default(0),\n\tcol664: double('col61').primaryKey().autoincrement().default(0),\n\tcol665: double('col61').primaryKey().autoincrement().default(0),\n\tcol666: double('col61').primaryKey().autoincrement().default(0),\n\tcol668: double('col61').primaryKey().autoincrement().default(0),\n\tcol669: double('col61').primaryKey().autoincrement().default(0),\n\tcol670: double('col61').primaryKey().autoincrement().default(0),\n\tcol671: double('col61').primaryKey().autoincrement().default(0),\n\tcol672: double('col61').primaryKey().autoincrement().default(0),\n\tcol673: double('col61').primaryKey().autoincrement().default(0),\n\tcol674: double('col61').primaryKey().autoincrement().default(0),\n\tcol675: double('col61').primaryKey().autoincrement().default(0),\n\tcol676: double('col61').primaryKey().autoincrement().default(0),\n\tcol678: double('col61').primaryKey().autoincrement().default(0),\n\tcol679: double('col61').primaryKey().autoincrement().default(0),\n\tcol680: double('col61').primaryKey().autoincrement().default(0),\n\tcol681: double('col61').primaryKey().autoincrement().default(0),\n\tcol682: double('col61').primaryKey().autoincrement().default(0),\n\tcol683: double('col61').primaryKey().autoincrement().default(0),\n\tcol684: double('col61').primaryKey().autoincrement().default(0),\n\tcol685: double('col61').primaryKey().autoincrement().default(0),\n\tcol686: double('col61').primaryKey().autoincrement().default(0),\n\tcol688: double('col61').primaryKey().autoincrement().default(0),\n\tcol689: double('col61').primaryKey().autoincrement().default(0),\n\tcol690: double('col61').primaryKey().autoincrement().default(0),\n\tcol691: double('col61').primaryKey().autoincrement().default(0),\n\tcol692: double('col61').primaryKey().autoincrement().default(0),\n\tcol693: double('col61').primaryKey().autoincrement().default(0),\n\tcol694: double('col61').primaryKey().autoincrement().default(0),\n\tcol695: double('col61').primaryKey().autoincrement().default(0),\n\tcol696: double('col61').primaryKey().autoincrement().default(0),\n\tcol698: double('col61').primaryKey().autoincrement().default(0),\n\tcol699: double('col61').primaryKey().autoincrement().default(0),\n\tcol700: double('col7').primaryKey().autoincrement().default(0),\n\tcol701: double('col7').primaryKey().autoincrement().default(0),\n\tcol702: double('col7').primaryKey().autoincrement().default(0),\n\tcol703: double('col7').primaryKey().autoincrement().default(0),\n\tcol704: double('col7').primaryKey().autoincrement().default(0),\n\tcol705: double('col7').primaryKey().autoincrement().default(0),\n\tcol706: double('col7').primaryKey().autoincrement().default(0),\n\tcol708: double('col7').primaryKey().autoincrement().default(0),\n\tcol709: double('col7').primaryKey().autoincrement().default(0),\n\tcol710: double('col71').primaryKey().autoincrement().default(0),\n\tcol711: double('col71').primaryKey().autoincrement().default(0),\n\tcol712: double('col71').primaryKey().autoincrement().default(0),\n\tcol713: double('col71').primaryKey().autoincrement().default(0),\n\tcol714: double('col71').primaryKey().autoincrement().default(0),\n\tcol715: double('col71').primaryKey().autoincrement().default(0),\n\tcol716: double('col71').primaryKey().autoincrement().default(0),\n\tcol718: double('col71').primaryKey().autoincrement().default(0),\n\tcol719: double('col71').primaryKey().autoincrement().default(0),\n\tcol720: double('col71').primaryKey().autoincrement().default(0),\n\tcol721: double('col71').primaryKey().autoincrement().default(0),\n\tcol722: double('col71').primaryKey().autoincrement().default(0),\n\tcol723: double('col71').primaryKey().autoincrement().default(0),\n\tcol724: double('col71').primaryKey().autoincrement().default(0),\n\tcol725: double('col71').primaryKey().autoincrement().default(0),\n\tcol726: double('col71').primaryKey().autoincrement().default(0),\n\tcol728: double('col71').primaryKey().autoincrement().default(0),\n\tcol729: double('col71').primaryKey().autoincrement().default(0),\n\tcol730: double('col71').primaryKey().autoincrement().default(0),\n\tcol731: double('col71').primaryKey().autoincrement().default(0),\n\tcol732: double('col71').primaryKey().autoincrement().default(0),\n\tcol733: double('col71').primaryKey().autoincrement().default(0),\n\tcol734: double('col71').primaryKey().autoincrement().default(0),\n\tcol735: double('col71').primaryKey().autoincrement().default(0),\n\tcol736: double('col71').primaryKey().autoincrement().default(0),\n\tcol738: double('col71').primaryKey().autoincrement().default(0),\n\tcol739: double('col71').primaryKey().autoincrement().default(0),\n\tcol740: double('col71').primaryKey().autoincrement().default(0),\n\tcol741: double('col71').primaryKey().autoincrement().default(0),\n\tcol742: double('col71').primaryKey().autoincrement().default(0),\n\tcol743: double('col71').primaryKey().autoincrement().default(0),\n\tcol744: double('col71').primaryKey().autoincrement().default(0),\n\tcol745: double('col71').primaryKey().autoincrement().default(0),\n\tcol746: double('col71').primaryKey().autoincrement().default(0),\n\tcol748: double('col71').primaryKey().autoincrement().default(0),\n\tcol749: double('col71').primaryKey().autoincrement().default(0),\n\tcol750: double('col71').primaryKey().autoincrement().default(0),\n\tcol751: double('col71').primaryKey().autoincrement().default(0),\n\tcol752: double('col71').primaryKey().autoincrement().default(0),\n\tcol753: double('col71').primaryKey().autoincrement().default(0),\n\tcol754: double('col71').primaryKey().autoincrement().default(0),\n\tcol755: double('col71').primaryKey().autoincrement().default(0),\n\tcol756: double('col71').primaryKey().autoincrement().default(0),\n\tcol758: double('col71').primaryKey().autoincrement().default(0),\n\tcol759: double('col71').primaryKey().autoincrement().default(0),\n\tcol760: double('col71').primaryKey().autoincrement().default(0),\n\tcol761: double('col71').primaryKey().autoincrement().default(0),\n\tcol762: double('col71').primaryKey().autoincrement().default(0),\n\tcol763: double('col71').primaryKey().autoincrement().default(0),\n\tcol764: double('col71').primaryKey().autoincrement().default(0),\n\tcol765: double('col71').primaryKey().autoincrement().default(0),\n\tcol766: double('col71').primaryKey().autoincrement().default(0),\n\tcol768: double('col71').primaryKey().autoincrement().default(0),\n\tcol769: double('col71').primaryKey().autoincrement().default(0),\n\tcol770: double('col71').primaryKey().autoincrement().default(0),\n\tcol771: double('col71').primaryKey().autoincrement().default(0),\n\tcol772: double('col71').primaryKey().autoincrement().default(0),\n\tcol773: double('col71').primaryKey().autoincrement().default(0),\n\tcol774: double('col71').primaryKey().autoincrement().default(0),\n\tcol775: double('col71').primaryKey().autoincrement().default(0),\n\tcol776: double('col71').primaryKey().autoincrement().default(0),\n\tcol778: double('col71').primaryKey().autoincrement().default(0),\n\tcol779: double('col71').primaryKey().autoincrement().default(0),\n\tcol780: double('col71').primaryKey().autoincrement().default(0),\n\tcol781: double('col71').primaryKey().autoincrement().default(0),\n\tcol782: double('col71').primaryKey().autoincrement().default(0),\n\tcol783: double('col71').primaryKey().autoincrement().default(0),\n\tcol784: double('col71').primaryKey().autoincrement().default(0),\n\tcol785: double('col71').primaryKey().autoincrement().default(0),\n\tcol786: double('col71').primaryKey().autoincrement().default(0),\n\tcol788: double('col71').primaryKey().autoincrement().default(0),\n\tcol789: double('col71').primaryKey().autoincrement().default(0),\n\tcol790: double('col71').primaryKey().autoincrement().default(0),\n\tcol791: double('col71').primaryKey().autoincrement().default(0),\n\tcol792: double('col71').primaryKey().autoincrement().default(0),\n\tcol793: double('col71').primaryKey().autoincrement().default(0),\n\tcol794: double('col71').primaryKey().autoincrement().default(0),\n\tcol795: double('col71').primaryKey().autoincrement().default(0),\n\tcol796: double('col71').primaryKey().autoincrement().default(0),\n\tcol798: double('col71').primaryKey().autoincrement().default(0),\n\tcol799: double('col71').primaryKey().autoincrement().default(0),\n\tcol800: double('col8').primaryKey().autoincrement().default(0),\n\tcol801: double('col8').primaryKey().autoincrement().default(0),\n\tcol802: double('col8').primaryKey().autoincrement().default(0),\n\tcol803: double('col8').primaryKey().autoincrement().default(0),\n\tcol804: double('col8').primaryKey().autoincrement().default(0),\n\tcol805: double('col8').primaryKey().autoincrement().default(0),\n\tcol806: double('col8').primaryKey().autoincrement().default(0),\n\tcol808: double('col8').primaryKey().autoincrement().default(0),\n\tcol809: double('col8').primaryKey().autoincrement().default(0),\n\tcol810: double('col81').primaryKey().autoincrement().default(0),\n\tcol811: double('col81').primaryKey().autoincrement().default(0),\n\tcol812: double('col81').primaryKey().autoincrement().default(0),\n\tcol813: double('col81').primaryKey().autoincrement().default(0),\n\tcol814: double('col81').primaryKey().autoincrement().default(0),\n\tcol815: double('col81').primaryKey().autoincrement().default(0),\n\tcol816: double('col81').primaryKey().autoincrement().default(0),\n\tcol818: double('col81').primaryKey().autoincrement().default(0),\n\tcol819: double('col81').primaryKey().autoincrement().default(0),\n\tcol820: double('col81').primaryKey().autoincrement().default(0),\n\tcol821: double('col81').primaryKey().autoincrement().default(0),\n\tcol822: double('col81').primaryKey().autoincrement().default(0),\n\tcol823: double('col81').primaryKey().autoincrement().default(0),\n\tcol824: double('col81').primaryKey().autoincrement().default(0),\n\tcol825: double('col81').primaryKey().autoincrement().default(0),\n\tcol826: double('col81').primaryKey().autoincrement().default(0),\n\tcol828: double('col81').primaryKey().autoincrement().default(0),\n\tcol829: double('col81').primaryKey().autoincrement().default(0),\n\tcol830: double('col81').primaryKey().autoincrement().default(0),\n\tcol831: double('col81').primaryKey().autoincrement().default(0),\n\tcol832: double('col81').primaryKey().autoincrement().default(0),\n\tcol833: double('col81').primaryKey().autoincrement().default(0),\n\tcol834: double('col81').primaryKey().autoincrement().default(0),\n\tcol835: double('col81').primaryKey().autoincrement().default(0),\n\tcol836: double('col81').primaryKey().autoincrement().default(0),\n\tcol838: double('col81').primaryKey().autoincrement().default(0),\n\tcol839: double('col81').primaryKey().autoincrement().default(0),\n\tcol840: double('col81').primaryKey().autoincrement().default(0),\n\tcol841: double('col81').primaryKey().autoincrement().default(0),\n\tcol842: double('col81').primaryKey().autoincrement().default(0),\n\tcol843: double('col81').primaryKey().autoincrement().default(0),\n\tcol844: double('col81').primaryKey().autoincrement().default(0),\n\tcol845: double('col81').primaryKey().autoincrement().default(0),\n\tcol846: double('col81').primaryKey().autoincrement().default(0),\n\tcol848: double('col81').primaryKey().autoincrement().default(0),\n\tcol849: double('col81').primaryKey().autoincrement().default(0),\n\tcol850: double('col81').primaryKey().autoincrement().default(0),\n\tcol851: double('col81').primaryKey().autoincrement().default(0),\n\tcol852: double('col81').primaryKey().autoincrement().default(0),\n\tcol853: double('col81').primaryKey().autoincrement().default(0),\n\tcol854: double('col81').primaryKey().autoincrement().default(0),\n\tcol855: double('col81').primaryKey().autoincrement().default(0),\n\tcol856: double('col81').primaryKey().autoincrement().default(0),\n\tcol858: double('col81').primaryKey().autoincrement().default(0),\n\tcol859: double('col81').primaryKey().autoincrement().default(0),\n\tcol860: double('col81').primaryKey().autoincrement().default(0),\n\tcol861: double('col81').primaryKey().autoincrement().default(0),\n\tcol862: double('col81').primaryKey().autoincrement().default(0),\n\tcol863: double('col81').primaryKey().autoincrement().default(0),\n\tcol864: double('col81').primaryKey().autoincrement().default(0),\n\tcol865: double('col81').primaryKey().autoincrement().default(0),\n\tcol866: double('col81').primaryKey().autoincrement().default(0),\n\tcol868: double('col81').primaryKey().autoincrement().default(0),\n\tcol869: double('col81').primaryKey().autoincrement().default(0),\n\tcol870: double('col81').primaryKey().autoincrement().default(0),\n\tcol871: double('col81').primaryKey().autoincrement().default(0),\n\tcol872: double('col81').primaryKey().autoincrement().default(0),\n\tcol873: double('col81').primaryKey().autoincrement().default(0),\n\tcol874: double('col81').primaryKey().autoincrement().default(0),\n\tcol875: double('col81').primaryKey().autoincrement().default(0),\n\tcol876: double('col81').primaryKey().autoincrement().default(0),\n\tcol878: double('col81').primaryKey().autoincrement().default(0),\n\tcol879: double('col81').primaryKey().autoincrement().default(0),\n\tcol880: double('col81').primaryKey().autoincrement().default(0),\n\tcol881: double('col81').primaryKey().autoincrement().default(0),\n\tcol882: double('col81').primaryKey().autoincrement().default(0),\n\tcol883: double('col81').primaryKey().autoincrement().default(0),\n\tcol884: double('col81').primaryKey().autoincrement().default(0),\n\tcol885: double('col81').primaryKey().autoincrement().default(0),\n\tcol886: double('col81').primaryKey().autoincrement().default(0),\n\tcol888: double('col81').primaryKey().autoincrement().default(0),\n\tcol889: double('col81').primaryKey().autoincrement().default(0),\n\tcol890: double('col81').primaryKey().autoincrement().default(0),\n\tcol891: double('col81').primaryKey().autoincrement().default(0),\n\tcol892: double('col81').primaryKey().autoincrement().default(0),\n\tcol893: double('col81').primaryKey().autoincrement().default(0),\n\tcol894: double('col81').primaryKey().autoincrement().default(0),\n\tcol895: double('col81').primaryKey().autoincrement().default(0),\n\tcol896: double('col81').primaryKey().autoincrement().default(0),\n\tcol898: double('col81').primaryKey().autoincrement().default(0),\n\tcol899: double('col81').primaryKey().autoincrement().default(0),\n\tcol900: double('col9').primaryKey().autoincrement().default(0),\n\tcol901: double('col9').primaryKey().autoincrement().default(0),\n\tcol902: double('col9').primaryKey().autoincrement().default(0),\n\tcol903: double('col9').primaryKey().autoincrement().default(0),\n\tcol904: double('col9').primaryKey().autoincrement().default(0),\n\tcol905: double('col9').primaryKey().autoincrement().default(0),\n\tcol906: double('col9').primaryKey().autoincrement().default(0),\n\tcol908: double('col9').primaryKey().autoincrement().default(0),\n\tcol909: double('col9').primaryKey().autoincrement().default(0),\n\tcol910: double('col91').primaryKey().autoincrement().default(0),\n\tcol911: double('col91').primaryKey().autoincrement().default(0),\n\tcol912: double('col91').primaryKey().autoincrement().default(0),\n\tcol913: double('col91').primaryKey().autoincrement().default(0),\n\tcol914: double('col91').primaryKey().autoincrement().default(0),\n\tcol915: double('col91').primaryKey().autoincrement().default(0),\n\tcol916: double('col91').primaryKey().autoincrement().default(0),\n\tcol918: double('col91').primaryKey().autoincrement().default(0),\n\tcol919: double('col91').primaryKey().autoincrement().default(0),\n\tcol920: double('col91').primaryKey().autoincrement().default(0),\n\tcol921: double('col91').primaryKey().autoincrement().default(0),\n\tcol922: double('col91').primaryKey().autoincrement().default(0),\n\tcol923: double('col91').primaryKey().autoincrement().default(0),\n\tcol924: double('col91').primaryKey().autoincrement().default(0),\n\tcol925: double('col91').primaryKey().autoincrement().default(0),\n\tcol926: double('col91').primaryKey().autoincrement().default(0),\n\tcol928: double('col91').primaryKey().autoincrement().default(0),\n\tcol929: double('col91').primaryKey().autoincrement().default(0),\n\tcol930: double('col91').primaryKey().autoincrement().default(0),\n\tcol931: double('col91').primaryKey().autoincrement().default(0),\n\tcol932: double('col91').primaryKey().autoincrement().default(0),\n\tcol933: double('col91').primaryKey().autoincrement().default(0),\n\tcol934: double('col91').primaryKey().autoincrement().default(0),\n\tcol935: double('col91').primaryKey().autoincrement().default(0),\n\tcol936: double('col91').primaryKey().autoincrement().default(0),\n\tcol938: double('col91').primaryKey().autoincrement().default(0),\n\tcol939: double('col91').primaryKey().autoincrement().default(0),\n\tcol940: double('col91').primaryKey().autoincrement().default(0),\n\tcol941: double('col91').primaryKey().autoincrement().default(0),\n\tcol942: double('col91').primaryKey().autoincrement().default(0),\n\tcol943: double('col91').primaryKey().autoincrement().default(0),\n\tcol944: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol945: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol946: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol948: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol949: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol950: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol951: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol952: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol953: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol954: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol955: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol956: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol958: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol959: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol960: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol961: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol962: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol963: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol964: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol965: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol966: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol968: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol969: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol970: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol971: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol972: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol973: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol974: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol975: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol976: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol978: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol979: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol980: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol981: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol982: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol983: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol984: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol985: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol986: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol988: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol989: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol990: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol991: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol992: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol993: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol994: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol995: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol996: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol998: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol999: varchar('col91', { length: 200 }).primaryKey().default('0'),\n});\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/count.ts",
    "content": "import { Expect } from 'type-tests/utils.ts';\nimport { int, mysqlTable, serial, text } from '~/mysql-core/index.ts';\nimport { and, gt, ne } from '~/sql/expressions/index.ts';\nimport type { Equal } from '~/utils.ts';\nimport { db } from './db.ts';\n\nconst names = mysqlTable('names', {\n\tid: serial('id').primaryKey(),\n\tname: text('name'),\n\tauthorId: int('author_id'),\n});\n\nconst separate = await db.$count(names);\n\nconst separateFilters = await db.$count(names, and(gt(names.id, 1), ne(names.name, 'forbidden')));\n\nconst embedded = await db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tauthorId: names.authorId,\n\t\tcount1: db.$count(names).as('count1'),\n\t})\n\t.from(names);\n\nconst embeddedFilters = await db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tauthorId: names.authorId,\n\t\tcount1: db.$count(names, and(gt(names.id, 1), ne(names.name, 'forbidden'))).as('count1'),\n\t})\n\t.from(names);\n\nExpect<Equal<number, typeof separate>>;\n\nExpect<Equal<number, typeof separateFilters>>;\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t}[],\n\t\ttypeof embedded\n\t>\n>;\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t}[],\n\t\ttypeof embeddedFilters\n\t>\n>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/db-rel.ts",
    "content": "import pg from 'pg';\nimport { type Equal, Expect } from 'type-tests/utils.ts';\nimport { drizzle } from '~/node-postgres/index.ts';\nimport { placeholder, sql } from '~/sql/sql.ts';\nimport * as schema from './tables-rel.ts';\n\nconst { Pool } = pg;\n\nconst pdb = new Pool({ connectionString: process.env['PG_CONNECTION_STRING'] });\nconst db = drizzle(pdb, { schema });\n\n{\n\tconst result = await db.query.users.findMany({\n\t\twhere: (users, { sql }) => sql`char_length(${users.name} > 1)`,\n\t\tlimit: placeholder('l'),\n\t\torderBy: (users, { asc, desc }) => [asc(users.name), desc(users.id)],\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { sql }) => sql`char_length(${posts.title} > 1)`,\n\t\t\t\tlimit: placeholder('l'),\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: false,\n\t\t\t\t},\n\t\t\t\twith: {\n\t\t\t\t\tauthor: true,\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twhere: (comments, { sql }) => sql`char_length(${comments.text} > 1)`,\n\t\t\t\t\t\tlimit: placeholder('l'),\n\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\ttext: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: {\n\t\t\t\t\t\t\t\tcolumns: {},\n\t\t\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\t\t\tcity: {\n\t\t\t\t\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\t\t\t\t\tusers: true,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tcityId: number;\n\t\t\thomeCityId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tposts: {\n\t\t\t\ttitle: string;\n\t\t\t\tauthorId: number | null;\n\t\t\t\tcomments: {\n\t\t\t\t\ttext: string;\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tcity: {\n\t\t\t\t\t\t\tid: number;\n\t\t\t\t\t\t\tname: string;\n\t\t\t\t\t\t\tusers: {\n\t\t\t\t\t\t\t\tid: number;\n\t\t\t\t\t\t\t\tname: string;\n\t\t\t\t\t\t\t\tcityId: number;\n\t\t\t\t\t\t\t\thomeCityId: number | null;\n\t\t\t\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t\t\t\t}[];\n\t\t\t\t\t\t};\n\t\t\t\t\t} | null;\n\t\t\t\t}[];\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tcityId: number;\n\t\t\t\t\thomeCityId: number | null;\n\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[], typeof result>\n\t>;\n}\n\n{\n\tconst result = await db.query.users.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tauthorId: true,\n\t\t\t\t},\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${schema.posts.title})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tposts: {\n\t\t\t\t\tauthorId: number | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t}[];\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/db.ts",
    "content": "import { createPool } from 'mysql2/promise';\nimport { drizzle } from '~/mysql2/index.ts';\n\nconst pool = createPool({});\n\nexport const db = drizzle(pool);\n\n{\n\tdrizzle(pool);\n\t// @ts-expect-error - missing mode\n\tdrizzle(pool, { schema: {} });\n\tdrizzle(pool, { schema: {}, mode: 'default' });\n\tdrizzle(pool, { schema: {}, mode: 'planetscale' });\n\tdrizzle(pool, { mode: 'default' });\n\tdrizzle(pool, { mode: 'planetscale' });\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/delete.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport type { MySqlDelete } from '~/mysql-core/index.ts';\nimport type { MySqlRawQueryResult } from '~/mysql2/index.ts';\nimport { eq } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\nimport { users } from './tables.ts';\n\nconst deleteAll = await db.delete(users);\nExpect<Equal<MySqlRawQueryResult, typeof deleteAll>>;\n\nconst deleteAllStmt = db.delete(users).prepare();\nconst deleteAllPrepared = await deleteAllStmt.execute();\nExpect<Equal<MySqlRawQueryResult, typeof deleteAllPrepared>>;\n\nconst deleteWhere = await db.delete(users).where(eq(users.id, 1));\nExpect<Equal<MySqlRawQueryResult, typeof deleteWhere>>;\n\nconst deleteWhereStmt = db.delete(users).where(eq(users.id, 1)).prepare();\nconst deleteWherePrepared = await deleteWhereStmt.execute();\nExpect<Equal<MySqlRawQueryResult, typeof deleteWherePrepared>>;\n\nconst deleteReturningAll = await db.delete(users);\nExpect<Equal<MySqlRawQueryResult, typeof deleteReturningAll>>;\n\nconst deleteReturningAllStmt = db.delete(users).prepare();\nconst deleteReturningAllPrepared = await deleteReturningAllStmt.execute();\nExpect<Equal<MySqlRawQueryResult, typeof deleteReturningAllPrepared>>;\n\nconst deleteReturningPartial = await db.delete(users);\nExpect<Equal<MySqlRawQueryResult, typeof deleteReturningPartial>>;\n\nconst deleteReturningPartialStmt = db.delete(users).prepare();\nconst deleteReturningPartialPrepared = await deleteReturningPartialStmt.execute();\nExpect<Equal<MySqlRawQueryResult, typeof deleteReturningPartialPrepared>>;\n\n{\n\tfunction dynamic<T extends MySqlDelete>(qb: T) {\n\t\treturn qb.where(sql``);\n\t}\n\n\tconst qbBase = db.delete(users).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<MySqlRawQueryResult, typeof result>>;\n}\n\n{\n\tdb\n\t\t.delete(users)\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n\n\tdb\n\t\t.delete(users)\n\t\t.$dynamic()\n\t\t.where(sql``)\n\t\t.where(sql``);\n}\n\n{\n\tdb.delete(users).where(sql``).limit(1).orderBy(sql``);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/generated-columns.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils';\nimport { type InferInsertModel, type InferSelectModel, sql } from '~/index';\nimport { mysqlTable, serial, text, varchar } from '~/mysql-core';\nimport { drizzle } from '~/mysql2';\nimport { db } from './db';\n\nconst users = mysqlTable(\n\t'users',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\tfirstName: varchar('first_name', { length: 255 }),\n\t\tlastName: varchar('last_name', { length: 255 }),\n\t\temail: text('email').notNull(),\n\t\tfullName: text('full_name').generatedAlwaysAs(sql`concat_ws(first_name, ' ', last_name)`),\n\t\tupperName: text('upper_name').generatedAlwaysAs(\n\t\t\tsql` case when first_name is null then null else upper(first_name) end `,\n\t\t).$type<string | null>(), // There is no way for drizzle to detect nullability in these cases. This is how the user can work around it\n\t},\n);\n\n{\n\ttype User = typeof users.$inferSelect;\n\ttype NewUser = typeof users.$inferInsert;\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string | null;\n\t\t\t\tupperName: string | null;\n\t\t\t},\n\t\t\tUser\n\t\t>\n\t>();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\temail: string;\n\t\t\t\tid?: number | undefined;\n\t\t\t\tfirstName?: string | null | undefined;\n\t\t\t\tlastName?: string | null | undefined;\n\t\t\t},\n\t\t\tNewUser\n\t\t>\n\t>();\n}\n\n{\n\ttype User = InferSelectModel<typeof users>;\n\ttype NewUser = InferInsertModel<typeof users>;\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string | null;\n\t\t\t\tupperName: string | null;\n\t\t\t},\n\t\t\tUser\n\t\t>\n\t>();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\temail: string;\n\t\t\t\tid?: number | undefined;\n\t\t\t\tfirstName?: string | null | undefined;\n\t\t\t\tlastName?: string | null | undefined;\n\t\t\t},\n\t\t\tNewUser\n\t\t>\n\t>();\n}\n\n{\n\tconst dbUsers = await db.select().from(users);\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string | null;\n\t\t\t\tupperName: string | null;\n\t\t\t}[],\n\t\t\ttypeof dbUsers\n\t\t>\n\t>();\n}\n\n{\n\tconst db = drizzle({} as any, { schema: { users }, mode: 'default' });\n\n\tconst dbUser = await db.query.users.findFirst();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string | null;\n\t\t\t\tupperName: string | null;\n\t\t\t} | undefined,\n\t\t\ttypeof dbUser\n\t\t>\n\t>();\n}\n\n{\n\tconst db = drizzle({} as any, { schema: { users }, mode: 'default' });\n\n\tconst dbUser = await db.query.users.findMany();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string | null;\n\t\t\t\tupperName: string | null;\n\t\t\t}[],\n\t\t\ttypeof dbUser\n\t\t>\n\t>();\n}\n\n{\n\t// @ts-expect-error - Can't use the fullName because it's a generated column\n\tawait db.insert(users).values({\n\t\tfirstName: 'test',\n\t\tlastName: 'test',\n\t\temail: 'test',\n\t\tfullName: 'test',\n\t});\n}\n\n{\n\tawait db.update(users).set({\n\t\tfirstName: 'test',\n\t\tlastName: 'test',\n\t\temail: 'test',\n\t\t// @ts-expect-error - Can't use the fullName because it's a generated column\n\t\tfullName: 'test',\n\t});\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/insert.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { boolean, int, mysqlTable, QueryBuilder, serial, text } from '~/mysql-core/index.ts';\nimport type { MySqlInsert } from '~/mysql-core/index.ts';\nimport type { MySqlRawQueryResult } from '~/mysql2/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\nimport { users } from './tables.ts';\n\nconst mysqlInsertReturning = await db.insert(users).values({\n\t//    ^?\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n}).$returningId();\n\nExpect<Equal<{ id: number; serialNullable: number; serialNotNull: number }[], typeof mysqlInsertReturning>>;\n\nconst insert = await db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n});\nExpect<Equal<MySqlRawQueryResult, typeof insert>>;\n\nconst insertStmt = db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n}).prepare();\nconst insertPrepared = await insertStmt.execute();\nExpect<Equal<MySqlRawQueryResult, typeof insertPrepared>>;\n\nconst insertSql = await db.insert(users).values({\n\thomeCity: sql`123`,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: sql`foobar`,\n});\nExpect<Equal<MySqlRawQueryResult, typeof insertSql>>;\n\nconst insertSqlStmt = db.insert(users).values({\n\thomeCity: sql`123`,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: sql`foobar`,\n}).prepare();\nconst insertSqlPrepared = await insertSqlStmt.execute();\nExpect<Equal<MySqlRawQueryResult, typeof insertSqlPrepared>>;\n\nconst insertReturning = await db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n});\nExpect<Equal<MySqlRawQueryResult, typeof insertReturning>>;\n\nconst insertReturningStmt = db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n}).prepare();\nconst insertReturningPrepared = await insertReturningStmt.execute();\nExpect<Equal<MySqlRawQueryResult, typeof insertReturningPrepared>>;\n\nconst insertReturningPartial = await db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n});\nExpect<Equal<MySqlRawQueryResult, typeof insertReturningPartial>>;\n\nconst insertReturningPartialStmt = db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n}).prepare();\nconst insertReturningPartialPrepared = await insertReturningPartialStmt.execute();\nExpect<Equal<MySqlRawQueryResult, typeof insertReturningPartialPrepared>>;\n\nconst insertReturningSql = await db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: sql`2 + 2`,\n\tenumCol: 'a',\n});\nExpect<Equal<MySqlRawQueryResult, typeof insertReturningSql>>;\n\nconst insertReturningSqlStmt = db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: sql`2 + 2`,\n\tenumCol: 'a',\n}).prepare();\nconst insertReturningSqlPrepared = await insertReturningSqlStmt.execute();\nExpect<Equal<MySqlRawQueryResult, typeof insertReturningSqlPrepared>>;\n\n{\n\tconst users = mysqlTable('users', {\n\t\tid: int('id').autoincrement().primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tage: int('age'),\n\t\toccupation: text('occupation'),\n\t});\n\n\tawait db.insert(users).values({ name: 'John Wick', age: 58, occupation: 'housekeeper' });\n}\n\n{\n\tfunction dynamic<T extends MySqlInsert>(qb: T) {\n\t\treturn qb.onDuplicateKeyUpdate({ set: {} });\n\t}\n\n\tconst qbBase = db.insert(users).values({ age1: 0, class: 'A', enumCol: 'a', homeCity: 0 }).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\n\tExpect<Equal<MySqlRawQueryResult, typeof result>>;\n}\n\n{\n\tdb\n\t\t.insert(users)\n\t\t.values({ age1: 0, class: 'A', enumCol: 'a', homeCity: 0 })\n\t\t.onDuplicateKeyUpdate({ set: {} })\n\t\t// @ts-expect-error method was already called\n\t\t.onDuplicateKeyUpdate({ set: {} });\n}\n\n{\n\tconst users1 = mysqlTable('users1', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tadmin: boolean('admin').notNull().default(false),\n\t});\n\tconst users2 = mysqlTable('users2', {\n\t\tid: serial('id').primaryKey(),\n\t\tfirstName: text('first_name').notNull(),\n\t\tlastName: text('last_name').notNull(),\n\t\tadmin: boolean('admin').notNull().default(false),\n\t\tphoneNumber: text('phone_number'),\n\t});\n\n\tconst qb = new QueryBuilder();\n\n\tdb.insert(users1).select(sql`select * from users1`);\n\tdb.insert(users1).select(() => sql`select * from users1`);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tname: users2.firstName,\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2),\n\t\t);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tname: users2.firstName,\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2).where(sql``),\n\t\t);\n\n\tdb\n\t\t.insert(users2)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tfirstName: users2.firstName,\n\t\t\t\tlastName: users2.lastName,\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2),\n\t\t);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tname: sql`${users2.firstName} || ' ' || ${users2.lastName}`.as('name'),\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2),\n\t\t);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\t// @ts-expect-error name is undefined\n\t\t\tqb.select({ admin: users1.admin }).from(users1),\n\t\t);\n\n\tdb.insert(users1).select(db.select().from(users1));\n\tdb.insert(users1).select(() => db.select().from(users1));\n\tdb.insert(users1).select((qb) => qb.select().from(users1));\n\t// @ts-expect-error tables have different keys\n\tdb.insert(users1).select(db.select().from(users2));\n\t// @ts-expect-error tables have different keys\n\tdb.insert(users1).select(() => db.select().from(users2));\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/no-strict-null-checks/test.ts",
    "content": "import { mysqlTable, text } from '~/mysql-core';\nimport { drizzle } from '~/mysql2';\n\nexport const test = mysqlTable(\n\t'test',\n\t{\n\t\tid: text('id')\n\t\t\t.primaryKey()\n\t\t\t.generatedAlwaysAs('genstr'),\n\t\tname: text('name').$defaultFn(() => '' as string),\n\t\ttitle: text('title').notNull(),\n\t\tdescription: text('description'),\n\t\tdbdef: text('dbdef').default('dbdefval'),\n\t},\n);\n\nconst db = drizzle.mock();\n\ndb.update(test)\n\t.set({\n\t\t// @ts-expect-error\n\t\tid: '1',\n\t\tname: 'name',\n\t\ttitle: 'title',\n\t\tdescription: 'desc',\n\t\tdbdef: 'upddef',\n\t});\n\ndb.update(test)\n\t.set({\n\t\tname: 'name',\n\t\ttitle: 'title',\n\t\tdescription: 'desc',\n\t\tdbdef: 'upddef',\n\t});\n\ndb.insert(test).values({\n\t// @ts-expect-error\n\tid: '1',\n\tname: 'name',\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\tname: 'name',\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n\tdescription: 'desc',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n});\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/no-strict-null-checks/tsconfig.json",
    "content": "{\n\t\"extends\": \"../../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"noEmit\": true,\n\t\t\"strictNullChecks\": false,\n\t\t\"strictPropertyInitialization\": false,\n\t\t\"exactOptionalPropertyTypes\": false\n\t},\n\t\"include\": [\"./test.ts\"]\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/select.ts",
    "content": "import { alias } from '~/mysql-core/alias.ts';\nimport {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from '~/sql/expressions/index.ts';\nimport { type InferSelectViewModel, param, sql } from '~/sql/sql.ts';\n\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport {\n\tindex,\n\tint,\n\ttype MySqlSelect,\n\ttype MySqlSelectQueryBuilder,\n\tmysqlTable,\n\tmysqlView,\n\tQueryBuilder,\n\ttext,\n} from '~/mysql-core/index.ts';\nimport { db } from './db.ts';\nimport { cities, classes, newYorkers, users } from './tables.ts';\n\nconst city = alias(cities, 'city');\nconst city1 = alias(cities, 'city1');\n\nconst leftJoinFull = await db.select().from(users).leftJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof cities.$inferSelect | null;\n\t\t}[],\n\t\ttypeof leftJoinFull\n\t>\n>;\n\nconst rightJoinFull = await db.select().from(users).rightJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect | null;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof rightJoinFull\n\t>\n>;\n\nconst innerJoinFull = await db.select().from(users).innerJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof innerJoinFull\n\t>\n>;\n\nconst crossJoinFull = await db.select().from(users).crossJoin(city);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof crossJoinFull\n\t>\n>;\n\nconst leftJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.leftJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserText: string | null;\n\t\tcityId: number | null;\n\t\tcityName: string | null;\n\t}[], typeof leftJoinFlat>\n>;\n\nconst rightJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.rightJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number | null;\n\t\tuserText: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof rightJoinFlat>\n>;\n\nconst innerJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.innerJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserText: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof innerJoinFlat>\n>;\n\nconst crossJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.crossJoin(city);\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserText: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof crossJoinFlat>\n>;\n\nconst leftJoinMixed = await db\n\t.select({\n\t\tid: users.id,\n\t\ttext: users.text,\n\t\ttextUpper: sql<string | null>`upper(${users.text})`,\n\t\tidComplex: sql<string | null>`${users.id}::text || ${city.id}::text`,\n\t\tcity: {\n\t\t\tid: city.id,\n\t\t\tname: city.name,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\ttext: string | null;\n\t\t\ttextUpper: string | null;\n\t\t\tidComplex: string | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[],\n\t\ttypeof leftJoinMixed\n\t>\n>;\n\nconst leftJoinMixed2 = await db\n\t.select({\n\t\tid: users.id,\n\t\ttext: users.text,\n\t\tfoo: {\n\t\t\tbar: users.id,\n\t\t\tbaz: cities.id,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(cities, eq(users.id, cities.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\ttext: string | null;\n\t\t\tfoo: {\n\t\t\t\tbar: number;\n\t\t\t\tbaz: number | null;\n\t\t\t};\n\t\t}[],\n\t\ttypeof leftJoinMixed2\n\t>\n>;\n\nconst join = await db\n\t.select({\n\t\tusers,\n\t\tcities,\n\t\tcity,\n\t\tcity1: {\n\t\t\tid: city1.id,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(cities, eq(users.id, cities.id))\n\t.rightJoin(city, eq(city.id, users.id))\n\t.rightJoin(city1, eq(city1.id, users.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers: {\n\t\t\t\tid: number;\n\t\t\t\ttext: string | null;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t} | null;\n\t\t\tcities: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tcity1: {\n\t\t\t\tid: number;\n\t\t\t};\n\t\t}[],\n\t\ttypeof join\n\t>\n>;\n\ndb\n\t.select()\n\t.from(users)\n\t.where(exists(db.select().from(cities).where(eq(users.homeCity, cities.id))));\n\nfunction mapFunkyFuncResult(valueFromDriver: unknown) {\n\treturn {\n\t\tfoo: (valueFromDriver as Record<string, any>)['foo'],\n\t};\n}\n\nconst age = 1;\n\nconst allOperators = await db\n\t.select({\n\t\tcol2: sql`5 - ${users.id} + 1`, // unknown\n\t\tcol3: sql<number>`${users.id} + 1`, // number\n\t\tcol33: sql`${users.id} + 1`.mapWith(users.id), // number\n\t\tcol34: sql`${users.id} + 1`.mapWith(mapFunkyFuncResult), // number\n\t\tcol4: sql<string | number>`one_or_another(${users.id}, ${users.class})`, // string | number\n\t\tcol5: sql`true`, // unknown\n\t\tcol6: sql<boolean>`true`, // boolean\n\t\tcol7: sql<number>`random()`, // number\n\t\tcol8: sql`some_funky_func(${users.id})`.mapWith(mapFunkyFuncResult), // { foo: string }\n\t\tcol9: sql`greatest(${users.createdAt}, ${param(new Date(), users.createdAt)})`, // unknown\n\t\tcol10: sql<Date | boolean>`date_or_false(${users.createdAt}, ${param(new Date(), users.createdAt)})`, // Date | boolean\n\t\tcol11: sql`${users.age1} + ${age}`, // unknown\n\t\tcol12: sql`${users.age1} + ${param(age, users.age1)}`, // unknown\n\t\tcol13: sql`lower(${users.class})`, // unknown\n\t\tcol14: sql<number>`length(${users.class})`, // number\n\t\tcount: sql<number>`count(*)::int`, // number\n\t})\n\t.from(users)\n\t.where(and(\n\t\teq(users.id, 1),\n\t\tne(users.id, 1),\n\t\tor(eq(users.id, 1), ne(users.id, 1)),\n\t\tnot(eq(users.id, 1)),\n\t\tgt(users.id, 1),\n\t\tgte(users.id, 1),\n\t\tlt(users.id, 1),\n\t\tlte(users.id, 1),\n\t\tinArray(users.id, [1, 2, 3]),\n\t\tinArray(users.id, db.select({ id: users.id }).from(users)),\n\t\tinArray(users.id, sql`select id from ${users}`),\n\t\tnotInArray(users.id, [1, 2, 3]),\n\t\tnotInArray(users.id, db.select({ id: users.id }).from(users)),\n\t\tnotInArray(users.id, sql`select id from ${users}`),\n\t\tisNull(users.subClass),\n\t\tisNotNull(users.id),\n\t\texists(db.select({ id: users.id }).from(users)),\n\t\texists(sql`select id from ${users}`),\n\t\tnotExists(db.select({ id: users.id }).from(users)),\n\t\tnotExists(sql`select id from ${users}`),\n\t\tbetween(users.id, 1, 2),\n\t\tnotBetween(users.id, 1, 2),\n\t\tlike(users.id, '%1%'),\n\t\tnotLike(users.id, '%1%'),\n\t\tilike(users.id, '%1%'),\n\t\tnotIlike(users.id, '%1%'),\n\t));\n\nExpect<\n\tEqual<{\n\t\tcol2: unknown;\n\t\tcol3: number;\n\t\tcol33: number;\n\t\tcol34: { foo: any };\n\t\tcol4: string | number;\n\t\tcol5: unknown;\n\t\tcol6: boolean;\n\t\tcol7: number;\n\t\tcol8: {\n\t\t\tfoo: any;\n\t\t};\n\t\tcol9: unknown;\n\t\tcol10: boolean | Date;\n\t\tcol11: unknown;\n\t\tcol12: unknown;\n\t\tcol13: unknown;\n\t\tcol14: number;\n\t\tcount: number;\n\t}[], typeof allOperators>\n>;\n\nconst textSelect = await db\n\t.select({\n\t\tt: users.text,\n\t})\n\t.from(users);\n\nExpect<Equal<{ t: string | null }[], typeof textSelect>>;\n\nconst homeCity = alias(cities, 'homeCity');\nconst c = alias(classes, 'c');\nconst otherClass = alias(classes, 'otherClass');\nconst anotherClass = alias(classes, 'anotherClass');\nconst friend = alias(users, 'friend');\nconst currentCity = alias(cities, 'currentCity');\nconst subscriber = alias(users, 'subscriber');\nconst closestCity = alias(cities, 'closestCity');\n\nconst megaJoin = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t\tmaxAge: sql`max(${users.age1})`,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\thomeCity,\n\t\tc,\n\t\totherClass,\n\t\tanotherClass,\n\t\tfriend,\n\t\tcurrentCity,\n\t\tsubscriber,\n\t\tclosestCity,\n\t})\n\t.from(users)\n\t.innerJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.innerJoin(homeCity, sql`${users.homeCity} = ${homeCity.id}`)\n\t.innerJoin(c, eq(c.id, users.class))\n\t.innerJoin(otherClass, sql`${c.id} = ${otherClass.id}`)\n\t.innerJoin(anotherClass, sql`${users.class} = ${anotherClass.id}`)\n\t.innerJoin(friend, sql`${users.id} = ${friend.id}`)\n\t.innerJoin(currentCity, sql`${homeCity.id} = ${currentCity.id}`)\n\t.innerJoin(subscriber, sql`${users.class} = ${subscriber.id}`)\n\t.innerJoin(closestCity, sql`${users.currentCity} = ${closestCity.id}`)\n\t.where(and(sql`${users.age1} > 0`, eq(cities.id, 1)))\n\t.limit(1)\n\t.offset(1);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tmaxAge: unknown;\n\t\t\t};\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t};\n\t\t\thomeCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t\tc: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t};\n\t\t\totherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t};\n\t\t\tanotherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t};\n\t\t\tfriend: {\n\t\t\t\tid: number;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t};\n\t\t\tcurrentCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t\tsubscriber: {\n\t\t\t\tid: number;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t};\n\t\t\tclosestCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t}[],\n\t\ttypeof megaJoin\n\t>\n>;\n\nconst friends = alias(users, 'friends');\n\nconst join4 = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\tclass: classes,\n\t\tfriend: friends,\n\t})\n\t.from(users)\n\t.innerJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.innerJoin(classes, sql`${cities.id} = ${classes.id}`)\n\t.innerJoin(friends, sql`${friends.id} = ${users.id}`)\n\t.where(sql`${users.age1} > 0`);\n\nExpect<\n\tEqual<{\n\t\tuser: {\n\t\t\tid: number;\n\t\t};\n\t\tcity: {\n\t\t\tid: number;\n\t\t};\n\t\tclass: {\n\t\t\tid: number;\n\t\t\tclass: 'A' | 'C' | null;\n\t\t\tsubClass: 'B' | 'D';\n\t\t};\n\t\tfriend: {\n\t\t\tid: number;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\ttext: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t};\n\t}[], typeof join4>\n>;\n\n{\n\tconst authenticated = false as boolean;\n\n\tconst result = await db\n\t\t.select({\n\t\t\tid: users.id,\n\t\t\t...(authenticated ? { city: users.homeCity } : {}),\n\t\t})\n\t\t.from(users);\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tcity?: number;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\nawait db.select().from(users).for('update');\nawait db.select().from(users).for('share', { skipLocked: true });\nawait db.select().from(users).for('update', { noWait: true });\nawait db\n\t.select()\n\t.from(users)\n\t// @ts-expect-error - can't use both skipLocked and noWait\n\t.for('share', { noWait: true, skipLocked: true });\n\n{\n\tconst result = await db.select().from(newYorkers);\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tuserId: number;\n\t\t\t\tcityId: number | null;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\n{\n\tconst result = await db.select({ userId: newYorkers.userId }).from(newYorkers);\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tuserId: number;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\n{\n\tconst query = db.select().from(users).prepare().iterator();\n\tfor await (const row of query) {\n\t\tExpect<Equal<typeof users.$inferSelect, typeof row>>();\n\t}\n}\n\n{\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1));\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1))\n\t\t// @ts-expect-error - can't use where twice\n\t\t.where(eq(users.id, 1));\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1))\n\t\t.limit(10)\n\t\t// @ts-expect-error - can't use where twice\n\t\t.where(eq(users.id, 1));\n}\n\n{\n\tfunction withFriends<T extends MySqlSelect>(qb: T) {\n\t\tconst friends = alias(users, 'friends');\n\t\tconst friends2 = alias(users, 'friends2');\n\t\tconst friends3 = alias(users, 'friends3');\n\t\tconst friends4 = alias(users, 'friends4');\n\t\tconst friends5 = alias(users, 'friends5');\n\t\treturn qb\n\t\t\t.leftJoin(friends, sql`true`)\n\t\t\t.leftJoin(friends2, sql`true`)\n\t\t\t.leftJoin(friends3, sql`true`)\n\t\t\t.leftJoin(friends4, sql`true`)\n\t\t\t.leftJoin(friends5, sql`true`);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await withFriends(qb);\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tfriends: typeof users.$inferSelect | null;\n\t\t\tfriends2: typeof users.$inferSelect | null;\n\t\t\tfriends3: typeof users.$inferSelect | null;\n\t\t\tfriends4: typeof users.$inferSelect | null;\n\t\t\tfriends5: typeof users.$inferSelect | null;\n\t\t}[]>\n\t>;\n}\n\n{\n\tfunction withFriends<T extends MySqlSelectQueryBuilder>(qb: T) {\n\t\tconst friends = alias(users, 'friends');\n\t\tconst friends2 = alias(users, 'friends2');\n\t\tconst friends3 = alias(users, 'friends3');\n\t\tconst friends4 = alias(users, 'friends4');\n\t\tconst friends5 = alias(users, 'friends5');\n\t\treturn qb\n\t\t\t.leftJoin(friends, sql`true`)\n\t\t\t.leftJoin(friends2, sql`true`)\n\t\t\t.leftJoin(friends3, sql`true`)\n\t\t\t.leftJoin(friends4, sql`true`)\n\t\t\t.leftJoin(friends5, sql`true`);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await withFriends(qb);\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tfriends: typeof users.$inferSelect | null;\n\t\t\tfriends2: typeof users.$inferSelect | null;\n\t\t\tfriends3: typeof users.$inferSelect | null;\n\t\t\tfriends4: typeof users.$inferSelect | null;\n\t\t\tfriends5: typeof users.$inferSelect | null;\n\t\t}[]>\n\t>;\n}\n\n{\n\tfunction dynamic<T extends MySqlSelect>(qb: T) {\n\t\treturn qb.where(sql``).having(sql``).groupBy(sql``).orderBy(sql``).limit(1).offset(1).for('update');\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await dynamic(qb);\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\n{\n\t// TODO: add to docs\n\tfunction dynamic<T extends MySqlSelectQueryBuilder>(qb: T) {\n\t\treturn qb.where(sql``).having(sql``).groupBy(sql``).orderBy(sql``).limit(1).offset(1).for('update');\n\t}\n\n\tconst query = new QueryBuilder().select().from(users).$dynamic();\n\tdynamic(query);\n}\n\n{\n\t// TODO: add to docs\n\tfunction paginated<T extends MySqlSelect>(qb: T, page: number) {\n\t\treturn qb.limit(10).offset((page - 1) * 10);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await paginated(qb, 1);\n\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\n{\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.having(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.having(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.groupBy(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.groupBy(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.orderBy(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.orderBy(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.limit(10)\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.limit(10);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.offset(10)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.offset(10);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.for('update')\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.for('update');\n}\n\n{\n\tconst table1 = mysqlTable('table1', {\n\t\tid: int().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst table2 = mysqlTable('table2', {\n\t\tid: int().primaryKey(),\n\t\tage: int().notNull(),\n\t});\n\tconst table3 = mysqlTable('table3', {\n\t\tid: int().primaryKey(),\n\t\tphone: text().notNull(),\n\t});\n\tconst view = mysqlView('view').as((qb) =>\n\t\tqb.select({\n\t\t\ttable: table1,\n\t\t\tcolumn: table2.age,\n\t\t\tnested: {\n\t\t\t\tcolumn: table3.phone,\n\t\t\t},\n\t\t}).from(table1).innerJoin(table2, sql``).leftJoin(table3, sql``)\n\t);\n\tconst result = await db.select().from(view);\n\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\ttable: typeof table1.$inferSelect;\n\t\t\tcolumn: number;\n\t\t\tnested: {\n\t\t\t\tcolumn: string | null;\n\t\t\t};\n\t\t}[]>\n\t>;\n\tExpect<Equal<typeof result, typeof view.$inferSelect[]>>;\n\tExpect<Equal<typeof result, InferSelectViewModel<typeof view>[]>>;\n}\n\n{\n\tconst table1 = mysqlTable('table1', {\n\t\tid: int().primaryKey(),\n\t\tname: text().notNull(),\n\t}, () => [table1NameIndex]);\n\tconst table1NameIndex = index('table1_name_index').on(table1.name);\n\n\tconst table2 = mysqlTable('table2', {\n\t\tid: int().primaryKey(),\n\t\tage: int().notNull(),\n\t\ttable1Id: int().references(() => table1.id).notNull(),\n\t}, () => [table2AgeIndex, table2Table1Index]);\n\tconst table2AgeIndex = index('table2_name_index').on(table2.age);\n\tconst table2Table1Index = index('table2_table1_index').on(table2.table1Id);\n\n\tconst view = mysqlView('view').as((qb) => qb.select().from(table2));\n\tconst sq = db.select().from(table2, { useIndex: ['posts_text_index'] }).as('sq');\n\n\tawait db.select().from(table1, {\n\t\tuseIndex: table1NameIndex,\n\t\tforceIndex: table1NameIndex,\n\t\tignoreIndex: table1NameIndex,\n\t});\n\tawait db.select().from(table1, {\n\t\tuseIndex: [table1NameIndex],\n\t\tforceIndex: [table1NameIndex],\n\t\tignoreIndex: [table1NameIndex],\n\t});\n\tawait db.select().from(table1, {\n\t\tuseIndex: table1NameIndex,\n\t\t// @ts-expect-error\n\t\ttable1NameIndex,\n\t\tforceIndex: table1NameIndex,\n\t\tignoreIndex: table1NameIndex,\n\t});\n\n\t// @ts-expect-error\n\tawait db.select().from(view, {\n\t\tuseIndex: table1NameIndex,\n\t\tforceIndex: table1NameIndex,\n\t\ttable1NameIndex,\n\t\tignoreIndex: [table1NameIndex],\n\t});\n\n\t// @ts-expect-error\n\tawait db.select().from(sq, {\n\t\tuseIndex: table1NameIndex,\n\t\tforceIndex: table1NameIndex,\n\t\ttable1NameIndex,\n\t\tignoreIndex: [table1NameIndex],\n\t});\n\n\tconst join1 = await db.select().from(table1)\n\t\t.leftJoin(table2, eq(table1.id, table2.table1Id), {\n\t\t\tuseIndex: table2AgeIndex,\n\t\t\tforceIndex: table2AgeIndex,\n\t\t\tignoreIndex: table2AgeIndex,\n\t\t});\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\ttable1: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t};\n\t\t\t\ttable2: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tage: number;\n\t\t\t\t\ttable1Id: number;\n\t\t\t\t} | null;\n\t\t\t}[],\n\t\t\ttypeof join1\n\t\t>\n\t>;\n\n\tconst join2 = await db.select().from(table1)\n\t\t.leftJoin(table2, eq(table1.id, table2.table1Id), {\n\t\t\tuseIndex: [table2AgeIndex, table2Table1Index],\n\t\t\tforceIndex: [table2AgeIndex, table2Table1Index],\n\t\t\tignoreIndex: [table2AgeIndex, table2Table1Index],\n\t\t});\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\ttable1: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t};\n\t\t\t\ttable2: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tage: number;\n\t\t\t\t\ttable1Id: number;\n\t\t\t\t} | null;\n\t\t\t}[],\n\t\t\ttypeof join2\n\t\t>\n\t>;\n\n\tconst join3 = await db.select().from(table1)\n\t\t.crossJoin(table2, {\n\t\t\tuseIndex: [table2AgeIndex, table2Table1Index],\n\t\t\tforceIndex: [table2AgeIndex, table2Table1Index],\n\t\t\tignoreIndex: [table2AgeIndex, table2Table1Index],\n\t\t});\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\ttable1: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t};\n\t\t\t\ttable2: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tage: number;\n\t\t\t\t\ttable1Id: number;\n\t\t\t\t};\n\t\t\t}[],\n\t\t\ttypeof join3\n\t\t>\n\t>;\n\n\tconst sqJoin1 = await db.select().from(table1, {\n\t\tuseIndex: table1NameIndex,\n\t})\n\t\t.leftJoin(sq, eq(table1.id, sq.table1Id));\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\ttable1: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t};\n\t\t\t\tsq: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tage: number;\n\t\t\t\t\ttable1Id: number;\n\t\t\t\t} | null;\n\t\t\t}[],\n\t\t\ttypeof sqJoin1\n\t\t>\n\t>;\n\n\tconst sqJoin2 = await db.select().from(table1, {\n\t\tuseIndex: [table1NameIndex, table1NameIndex],\n\t})\n\t\t.leftJoin(sq, eq(table1.id, sq.table1Id));\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\ttable1: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t};\n\t\t\t\tsq: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tage: number;\n\t\t\t\t\ttable1Id: number;\n\t\t\t\t} | null;\n\t\t\t}[],\n\t\t\ttypeof sqJoin2\n\t\t>\n\t>;\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.leftJoin(view, eq(table1.id, view.table1Id), {\n\t\t\tuseIndex: table2AgeIndex,\n\t\t\tforceIndex: table2AgeIndex,\n\t\t\ttable2Table1Index,\n\t\t\tignoreIndex: [table2AgeIndex, table2Table1Index],\n\t\t});\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.leftJoin(sq, eq(table1.id, sq.table1Id), {\n\t\t\tuseIndex: table2AgeIndex,\n\t\t\tforceIndex: table2AgeIndex,\n\t\t\ttable2Table1Index,\n\t\t\tignoreIndex: [table2AgeIndex, table2Table1Index],\n\t\t});\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.crossJoin(table2, eq(table1.id, table2.table1Id), {\n\t\t\tuseIndex: [table2AgeIndex, table2Table1Index],\n\t\t\tforceIndex: [table2AgeIndex, table2Table1Index],\n\t\t\tignoreIndex: [table2AgeIndex, table2Table1Index],\n\t\t});\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.crossJoin(table2, eq(table1.id, table2.table1Id));\n}\n\n{\n\tconst table1 = mysqlTable('table1', {\n\t\tid: int().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst table2 = mysqlTable('table2', {\n\t\tid: int().primaryKey(),\n\t\tage: int().notNull(),\n\t\ttable1Id: int().references(() => table1.id).notNull(),\n\t});\n\n\tconst view = mysqlView('view').as((qb) => qb.select().from(table2));\n\n\tconst leftLateralRawRes = await db.select({\n\t\ttable1,\n\t\tsqId: sql<number | null>`${sql.identifier('t2')}.${sql.identifier('id')}`.as('sqId'),\n\t}).from(table1).leftJoinLateral(sql`(SELECT * FROM ${table2}) as ${sql.identifier('t2')}`, sql`true`);\n\n\tExpect<\n\t\tEqual<typeof leftLateralRawRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsqId: number | null;\n\t\t}[]>\n\t>;\n\n\tconst leftLateralSubRes = await db.select().from(table1).leftJoinLateral(\n\t\tdb.select().from(table2).as('sub'),\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof leftLateralSubRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsub: {\n\t\t\t\tid: number;\n\t\t\t\tage: number;\n\t\t\t\ttable1Id: number;\n\t\t\t} | null;\n\t\t}[]>\n\t>;\n\n\tconst sqLeftLateral = db.select().from(table2).as('sub');\n\n\tconst leftLateralSubSelectionRes = await db.select(\n\t\t{\n\t\t\tid: table1.id,\n\t\t\tsId: sqLeftLateral.id,\n\t\t},\n\t).from(table1).leftJoinLateral(\n\t\tsqLeftLateral,\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof leftLateralSubSelectionRes, {\n\t\t\tid: number;\n\t\t\tsId: number | null;\n\t\t}[]>\n\t>;\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.leftJoinLateral(table2, sql`true`);\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.leftJoinLateral(view, sql`true`);\n\n\tconst innerLateralRawRes = await db.select({\n\t\ttable1,\n\t\tsqId: sql<number>`${sql.identifier('t2')}.${sql.identifier('id')}`.as('sqId'),\n\t}).from(table1).innerJoinLateral(sql`(SELECT * FROM ${table2}) as ${sql.identifier('t2')}`, sql`true`);\n\n\tExpect<\n\t\tEqual<typeof innerLateralRawRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsqId: number;\n\t\t}[]>\n\t>;\n\n\tconst innerLateralSubRes = await db.select().from(table1).innerJoinLateral(\n\t\tdb.select().from(table2).as('sub'),\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof innerLateralSubRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsub: {\n\t\t\t\tid: number;\n\t\t\t\tage: number;\n\t\t\t\ttable1Id: number;\n\t\t\t};\n\t\t}[]>\n\t>;\n\n\tconst sqInnerLateral = db.select().from(table2).as('sub');\n\n\tconst innerLateralSubSelectionRes = await db.select(\n\t\t{\n\t\t\tid: table1.id,\n\t\t\tsId: sqLeftLateral.id,\n\t\t},\n\t).from(table1).innerJoinLateral(\n\t\tsqInnerLateral,\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof innerLateralSubSelectionRes, {\n\t\t\tid: number;\n\t\t\tsId: number;\n\t\t}[]>\n\t>;\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.innerJoinLateral(table2, sql`true`);\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.innerJoinLateral(view, sql`true`);\n\n\tconst crossLateralRawRes = await db.select({\n\t\ttable1,\n\t\tsqId: sql<number>`${sql.identifier('t2')}.${sql.identifier('id')}`.as('sqId'),\n\t}).from(table1).crossJoinLateral(sql`(SELECT * FROM ${table2}) as ${sql.identifier('t2')}`);\n\n\tExpect<\n\t\tEqual<typeof crossLateralRawRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsqId: number;\n\t\t}[]>\n\t>;\n\n\tconst crossLateralSubRes = await db.select().from(table1).crossJoinLateral(\n\t\tdb.select().from(table2).as('sub'),\n\t);\n\n\tExpect<\n\t\tEqual<typeof crossLateralSubRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsub: {\n\t\t\t\tid: number;\n\t\t\t\tage: number;\n\t\t\t\ttable1Id: number;\n\t\t\t};\n\t\t}[]>\n\t>;\n\n\tconst sqCrossLateral = db.select().from(table2).as('sub');\n\n\tconst crossLateralSubSelectionRes = await db.select(\n\t\t{\n\t\t\tid: table1.id,\n\t\t\tsId: sqCrossLateral.id,\n\t\t},\n\t).from(table1).crossJoinLateral(\n\t\tsqInnerLateral,\n\t);\n\n\tExpect<\n\t\tEqual<typeof crossLateralSubSelectionRes, {\n\t\t\tid: number;\n\t\t\tsId: number;\n\t\t}[]>\n\t>;\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.crossJoinLateral(table2);\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.crossJoinLateral(view);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/set-operators.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils.ts';\nimport {\n\texcept,\n\texceptAll,\n\tintersect,\n\tintersectAll,\n\ttype MySqlSetOperator,\n\tunion,\n\tunionAll,\n} from '~/mysql-core/index.ts';\nimport { eq } from '~/sql/expressions/index.ts';\nimport { desc, sql } from '~/sql/index.ts';\nimport { db } from './db.ts';\nimport { cities, classes, newYorkers, users } from './tables.ts';\n\nconst unionTest = await db\n\t.select({ id: users.id })\n\t.from(users)\n\t.union(\n\t\tdb\n\t\t\t.select({ id: users.id })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number }[], typeof unionTest>>;\n\nconst unionAllTest = await db\n\t.select({ id: users.id, age: users.age1 })\n\t.from(users)\n\t.unionAll(\n\t\tdb.select({ id: users.id, age: users.age1 })\n\t\t\t.from(users)\n\t\t\t.leftJoin(cities, eq(users.id, cities.id)),\n\t);\n\nExpect<Equal<{ id: number; age: number }[], typeof unionAllTest>>;\n\nconst intersectTest = await db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t.intersect(({ intersect }) =>\n\t\tintersect(\n\t\t\tdb\n\t\t\t\t.select({ id: users.id, homeCity: users.homeCity })\n\t\t\t\t.from(users),\n\t\t\tdb\n\t\t\t\t.select({ id: users.id, homeCity: sql`${users.homeCity}`.mapWith(Number) })\n\t\t\t\t.from(users),\n\t\t)\n\t);\n\nExpect<Equal<{ id: number; homeCity: number }[], typeof intersectTest>>;\n\nconst intersectAllTest = await db\n\t.select({ id: users.id, homeCity: users.class })\n\t.from(users)\n\t.intersect(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: users.class })\n\t\t\t.from(users)\n\t\t\t.leftJoin(cities, eq(users.id, cities.id)),\n\t);\n\nExpect<Equal<{ id: number; homeCity: 'A' | 'C' }[], typeof intersectAllTest>>;\n\nconst exceptTest = await db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t.except(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: sql`${users.homeCity}`.mapWith(Number) })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number; homeCity: number }[], typeof exceptTest>>;\n\nconst exceptAllTest = await db\n\t.select({ id: users.id, homeCity: users.class })\n\t.from(users)\n\t.except(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: sql<'A' | 'C'>`${users.class}` })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number; homeCity: 'A' | 'C' }[], typeof exceptAllTest>>;\n\nconst union2Test = await union(db.select().from(cities), db.select().from(cities), db.select().from(cities));\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof union2Test>>;\n\nconst unionAll2Test = await unionAll(\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select().from(cities),\n);\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof unionAll2Test>>;\n\nconst intersect2Test = await intersect(\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n);\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof intersect2Test>>;\n\nconst intersectAll2Test = await intersectAll(\n\tunion(\n\t\tdb.select({\n\t\t\tid: cities.id,\n\t\t}).from(cities),\n\t\tdb.select({\n\t\t\tid: cities.id,\n\t\t})\n\t\t\t.from(cities).where(sql``),\n\t),\n\tdb.select({\n\t\tid: cities.id,\n\t})\n\t\t.from(cities),\n).orderBy(desc(cities.id)).limit(23);\n\nExpect<Equal<{ id: number }[], typeof intersectAll2Test>>;\n\nconst except2Test = await except(\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t})\n\t\t.from(newYorkers),\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t}).from(newYorkers),\n);\n\nExpect<Equal<{ userId: number }[], typeof except2Test>>;\n\nconst exceptAll2Test = await exceptAll(\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t\tcityId: newYorkers.cityId,\n\t})\n\t\t.from(newYorkers).where(sql``),\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t\tcityId: newYorkers.cityId,\n\t}).from(newYorkers).leftJoin(users, sql``),\n);\n\nExpect<Equal<{ userId: number; cityId: number | null }[], typeof exceptAll2Test>>;\n\nconst unionfull = await union(db.select().from(users), db.select().from(users)).orderBy(sql``).limit(1).offset(2);\n\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\ttext: string | null;\n\t\thomeCity: number;\n\t\tcurrentCity: number | null;\n\t\tserialNullable: number;\n\t\tserialNotNull: number;\n\t\tclass: 'A' | 'C';\n\t\tsubClass: 'B' | 'D' | null;\n\t\tage1: number;\n\t\tcreatedAt: Date;\n\t\tenumCol: 'a' | 'b' | 'c';\n\t}[], typeof unionfull>\n>;\n\nunion(db.select().from(users), db.select().from(users))\n\t.orderBy(sql``)\n\t// @ts-expect-error - method was already called\n\t.orderBy(sql``);\n\nunion(db.select().from(users), db.select().from(users))\n\t.offset(1)\n\t// @ts-expect-error - method was already called\n\t.offset(2);\n\nunion(db.select().from(users), db.select().from(users))\n\t.orderBy(sql``)\n\t// @ts-expect-error - method was already called\n\t.orderBy(sql``);\n\n{\n\tfunction dynamic<T extends MySqlSetOperator>(qb: T) {\n\t\treturn qb.orderBy(sql``).limit(1).offset(2);\n\t}\n\n\tconst qb = union(db.select().from(users), db.select().from(users)).$dynamic();\n\tconst result = await dynamic(qb);\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\nawait db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\t.intersect(({ intersect }) => intersect(db.select().from(users), db.select().from(users)));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select().from(classes).union(db.select({ id: classes.id }).from(classes));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select({ id: classes.id }).from(classes).union(db.select().from(classes).where(sql``));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select({ id: classes.id }).from(classes).union(db.select().from(classes));\n\nunion(\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select().from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name, population: cities.population }).from(cities),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``).limit(3).$dynamic(),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: newYorkers.userId }).from(newYorkers),\n\tdb.select({ id: cities.id }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities).where(sql``),\n\tdb.select({ id: sql<number>`${cities.id}` }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name, population: cities.population }).from(cities).where(sql``),\n);\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/subquery.ts",
    "content": "import { Expect } from 'type-tests/utils.ts';\nimport { alias, int, mysqlTable, serial, text } from '~/mysql-core/index.ts';\nimport { and, eq } from '~/sql/expressions/index.ts';\nimport { count } from '~/sql/functions/aggregate.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { DrizzleTypeError, Equal } from '~/utils.ts';\nimport { db } from './db.ts';\n\nconst users = mysqlTable('names', {\n\tid: serial('id').primaryKey(),\n\tname: text('name'),\n\tmanagerId: int('author_id'),\n});\n\nconst posts = mysqlTable('posts', {\n\tid: serial('id').primaryKey(),\n\tauthorId: int('author_id'),\n\ttitle: text('title'),\n});\n\nconst n1 = db\n\t.select({\n\t\tid: users.id,\n\t\tname: users.name,\n\t\tauthorId: users.managerId,\n\t\tcount1: sql<number>`count(1)::int`.as('count1'),\n\t})\n\t.from(users)\n\t.groupBy(users.id, users.name, users.managerId)\n\t.as('n1');\n\nconst n2 = db\n\t.select({\n\t\tid: users.id,\n\t\tauthorId: users.managerId,\n\t\ttotalCount: sql<number>`count(1)::int`.as('totalCount'),\n\t})\n\t.from(users)\n\t.groupBy(users.id, users.managerId)\n\t.as('n2');\n\nconst result = await db\n\t.select({\n\t\tname: n1.name,\n\t\tauthorId: n1.authorId,\n\t\tcount1: n1.count1,\n\t\ttotalCount: n2.totalCount,\n\t})\n\t.from(n1)\n\t.innerJoin(n2, and(eq(n2.id, n1.id), eq(n2.authorId, n1.authorId)));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t\ttotalCount: number;\n\t\t}[],\n\t\ttypeof result\n\t>\n>;\n\nconst names2 = alias(users, 'names2');\n\nconst sq1 = db\n\t.select({\n\t\tid: users.id,\n\t\tname: users.name,\n\t\tid2: names2.id,\n\t})\n\t.from(users)\n\t.leftJoin(names2, eq(users.name, names2.name))\n\t.as('sq1');\n\nconst res = await db.select().from(sq1);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tid2: number | null;\n\t\t}[],\n\t\ttypeof res\n\t>\n>;\n\n{\n\tconst sq = db.select({ count: sql<number>`count(1)::int` }).from(users).as('sq');\n\tExpect<typeof sq.count extends DrizzleTypeError<any> ? true : false>;\n}\n\nconst sqUnion = db.select().from(users).union(db.select().from(names2)).as('sqUnion');\n\nconst resUnion = await db.select().from(sqUnion);\n\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\tname: string | null;\n\t\tmanagerId: number | null;\n\t}[], typeof resUnion>\n>;\n\nconst fromSubquery = await db.select({\n\tcount: db.select({ count: count().as('c') }).from(posts).where(eq(posts.authorId, users.id)).as('count'),\n}).from(users);\n\nExpect<Equal<typeof fromSubquery, { count: number }[]>>;\n\nconst fromSubquery2 = await db.select({\n\tname: db.select({ name: users.name }).from(users).where(eq(users.id, posts.authorId)).as('name'),\n}).from(posts);\n\nExpect<Equal<typeof fromSubquery2, { name: string | null }[]>>;\n\nconst errorSubquery = await db.select({\n\tname: db.select({ name: users.name, managerId: users.managerId }).from(users).where(eq(users.id, posts.authorId)).as(\n\t\t'name',\n\t),\n}).from(posts);\n\nExpect<Equal<typeof errorSubquery, { name: DrizzleTypeError<'You can only select one column in the subquery'> }[]>>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/tables-rel.ts",
    "content": "import { foreignKey, int, mysqlTable, serial, text, timestamp } from '~/mysql-core/index.ts';\nimport { relations } from '~/relations.ts';\n\nexport const users = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: int('city_id').references(() => cities.id).notNull(),\n\thomeCityId: int('home_city_id').references(() => cities.id),\n\tcreatedAt: timestamp('created_at').notNull(),\n});\nexport const usersConfig = relations(users, ({ one, many }) => ({\n\tcity: one(cities, { relationName: 'UsersInCity', fields: [users.cityId], references: [cities.id] }),\n\thomeCity: one(cities, { fields: [users.homeCityId], references: [cities.id] }),\n\tposts: many(posts),\n\tcomments: many(comments),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\nexport const citiesConfig = relations(cities, ({ many }) => ({\n\tusers: many(users, { relationName: 'UsersInCity' }),\n}));\n\nexport const posts = mysqlTable('posts', {\n\tid: serial('id').primaryKey(),\n\ttitle: text('title').notNull(),\n\tauthorId: int('author_id').references(() => users.id),\n});\nexport const postsConfig = relations(posts, ({ one, many }) => ({\n\tauthor: one(users, { fields: [posts.authorId], references: [users.id] }),\n\tcomments: many(comments),\n}));\n\nexport const comments = mysqlTable('comments', {\n\tid: serial('id').primaryKey(),\n\tpostId: int('post_id').references(() => posts.id).notNull(),\n\tauthorId: int('author_id').references(() => users.id),\n\ttext: text('text').notNull(),\n});\nexport const commentsConfig = relations(comments, ({ one }) => ({\n\tpost: one(posts, { fields: [comments.postId], references: [posts.id] }),\n\tauthor: one(users, { fields: [comments.authorId], references: [users.id] }),\n}));\n\nexport const books = mysqlTable('books', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\nexport const booksConfig = relations(books, ({ many }) => ({\n\tauthors: many(bookAuthors),\n}));\n\nexport const bookAuthors = mysqlTable('book_authors', {\n\tbookId: int('book_id').references(() => books.id).notNull(),\n\tauthorId: int('author_id').references(() => users.id).notNull(),\n\trole: text('role').notNull(),\n});\nexport const bookAuthorsConfig = relations(bookAuthors, ({ one }) => ({\n\tbook: one(books, { fields: [bookAuthors.bookId], references: [books.id] }),\n\tauthor: one(users, { fields: [bookAuthors.authorId], references: [users.id] }),\n}));\n\nexport const node = mysqlTable('node', {\n\tid: serial('id').primaryKey(),\n\tparentId: int('parent_id'),\n\tleftId: int('left_id'),\n\trightId: int('right_id'),\n}, (node) => ({\n\tfk1: foreignKey({ columns: [node.parentId], foreignColumns: [node.id] }),\n\tfk2: foreignKey({ columns: [node.leftId], foreignColumns: [node.id] }),\n\tfk3: foreignKey({ columns: [node.rightId], foreignColumns: [node.id] }),\n}));\nexport const nodeRelations = relations(node, ({ one }) => ({\n\tparent: one(node, { fields: [node.parentId], references: [node.id] }),\n\tleft: one(node, { fields: [node.leftId], references: [node.id] }),\n\tright: one(node, { fields: [node.rightId], references: [node.id] }),\n}));\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/tables.ts",
    "content": "import * as crypto from 'node:crypto';\nimport { type Equal, Expect } from 'type-tests/utils.ts';\nimport type { BuildColumn } from '~/column-builder.ts';\nimport {\n\tbigint,\n\tbinary,\n\tboolean,\n\tchar,\n\tcheck,\n\tcustomType,\n\tdate,\n\tdatetime,\n\tdecimal,\n\tdouble,\n\tfloat,\n\tforeignKey,\n\tindex,\n\tint,\n\tjson,\n\tlongtext,\n\tmediumint,\n\tmediumtext,\n\ttype MySqlColumn,\n\tmysqlEnum,\n\tmysqlTable,\n\tprimaryKey,\n\treal,\n\tserial,\n\tsmallint,\n\ttext,\n\ttime,\n\ttimestamp,\n\ttinyint,\n\ttinytext,\n\tunique,\n\tuniqueIndex,\n\tvarbinary,\n\tvarchar,\n\tyear,\n} from '~/mysql-core/index.ts';\nimport { mysqlSchema } from '~/mysql-core/schema.ts';\nimport { mysqlView, type MySqlViewWithSelection } from '~/mysql-core/view.ts';\nimport { eq, gt } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { InferSelectModel } from '~/table.ts';\nimport type { Simplify } from '~/utils.ts';\nimport { db } from './db.ts';\n\nexport const users = mysqlTable(\n\t'users_table',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\thomeCity: int('home_city')\n\t\t\t.notNull()\n\t\t\t.references(() => cities.id),\n\t\tcurrentCity: int('current_city').references(() => cities.id),\n\t\tserialNullable: serial('serial1'),\n\t\tserialNotNull: serial('serial2').notNull(),\n\t\tclass: text('class', { enum: ['A', 'C'] }).notNull(),\n\t\tsubClass: text('sub_class', { enum: ['B', 'D'] }),\n\t\ttext: text('text'),\n\t\tage1: int('age1').notNull(),\n\t\tcreatedAt: timestamp('created_at', { mode: 'date' }).notNull().defaultNow(),\n\t\tenumCol: mysqlEnum('enum_col', ['a', 'b', 'c']).notNull(),\n\t},\n\t(users) => ({\n\t\tusersAge1Idx: uniqueIndex('usersAge1Idx').on(users.class),\n\t\tusersAge2Idx: index('usersAge2Idx').on(users.class),\n\t\tuniqueClass: uniqueIndex('uniqueClass')\n\t\t\t.on(users.class, users.subClass)\n\t\t\t.lock('default')\n\t\t\t.algorithm('copy')\n\t\t\t.using(`btree`),\n\t\tlegalAge: check('legalAge', sql`${users.age1} > 18`),\n\t\tusersClassFK: foreignKey({ columns: [users.subClass], foreignColumns: [classes.subClass] }),\n\t\tusersClassComplexFK: foreignKey({\n\t\t\tcolumns: [users.class, users.subClass],\n\t\t\tforeignColumns: [classes.class, classes.subClass],\n\t\t}),\n\t\tpk: primaryKey(users.age1, users.class),\n\t}),\n);\n\nexport const cities = mysqlTable('cities_table', {\n\tid: serial('id').primaryKey(),\n\tname: text('name_db').notNull(),\n\tpopulation: int('population').default(0),\n}, (cities) => ({\n\tcitiesNameIdx: index('citiesNameIdx').on(cities.id),\n}));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: MySqlColumn<\n\t\t\t\t{\n\t\t\t\t\tname: 'id';\n\t\t\t\t\ttableName: 'cities_table';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'MySqlSerial';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\thasDefault: true;\n\t\t\t\t\tisPrimaryKey: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisAutoincrement: true;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t\t{}\n\t\t\t>;\n\t\t\tname: MySqlColumn<\n\t\t\t\t{\n\t\t\t\t\tname: 'name_db';\n\t\t\t\t\ttableName: 'cities_table';\n\t\t\t\t\tdataType: 'string';\n\t\t\t\t\tcolumnType: 'MySqlText';\n\t\t\t\t\tdata: string;\n\t\t\t\t\tdriverParam: string;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tenumValues: [string, ...string[]];\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t\t{}\n\t\t\t>;\n\t\t\tpopulation: MySqlColumn<\n\t\t\t\t{\n\t\t\t\t\tname: 'population';\n\t\t\t\t\ttableName: 'cities_table';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'MySqlInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: true;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t\t{}\n\t\t\t>;\n\t\t},\n\t\ttypeof cities._.columns\n\t>\n>;\n\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\tname_db: string;\n\t\tpopulation: number | null;\n\t}, InferSelectModel<typeof cities, { dbColumnNames: true }>>\n>;\n\nExpect<\n\tEqual<{\n\t\tid?: number;\n\t\tname: string;\n\t\tpopulation?: number | null;\n\t}, typeof cities.$inferInsert>\n>;\n\nexport const customSchema = mysqlSchema('custom_schema');\n\nexport const citiesCustom = customSchema.table('cities_table', {\n\tid: serial('id').primaryKey(),\n\tname: text('name_db').notNull(),\n\tpopulation: int('population').default(0),\n}, (cities) => ({\n\tcitiesNameIdx: index('citiesNameIdx').on(cities.id),\n}));\n\nExpect<Equal<typeof cities._.columns, typeof citiesCustom._.columns>>;\n\nexport const classes = mysqlTable('classes_table', ({ serial, text }) => ({\n\tid: serial('id').primaryKey(),\n\tclass: text('class', { enum: ['A', 'C'] }),\n\tsubClass: text('sub_class', { enum: ['B', 'D'] }).notNull(),\n}));\n\n/* export const classes2 = mysqlTable('classes_table', {\n\tid: serial().primaryKey(),\n\tclass: text({ enum: ['A', 'C'] }).$dbName('class_db'),\n\tsubClass: text({ enum: ['B', 'D'] }).notNull(),\n}); */\n\nexport const newYorkers = mysqlView('new_yorkers')\n\t.algorithm('merge')\n\t.sqlSecurity('definer')\n\t.as((qb) => {\n\t\tconst sq = qb\n\t\t\t.$with('sq')\n\t\t\t.as(\n\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n\t\t\t\t\t.from(users)\n\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n\t\t\t\t\t.where(sql`${users.age1} > 18`),\n\t\t\t);\n\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n\t});\n\nExpect<\n\tEqual<\n\t\tMySqlViewWithSelection<'new_yorkers', false, {\n\t\t\tuserId: MySqlColumn<{\n\t\t\t\tname: 'id';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'MySqlSerial';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: number;\n\t\t\t\tnotNull: true;\n\t\t\t\thasDefault: true;\n\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t\tisAutoincrement: true;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t\tcityId: MySqlColumn<{\n\t\t\t\tname: 'id';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'MySqlSerial';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: number;\n\t\t\t\tnotNull: false;\n\t\t\t\thasDefault: true;\n\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t\tisAutoincrement: true;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t}>,\n\t\ttypeof newYorkers\n\t>\n>;\n\n{\n\tconst newYorkers = customSchema.view('new_yorkers')\n\t\t.algorithm('merge')\n\t\t.sqlSecurity('definer')\n\t\t.as((qb) => {\n\t\t\tconst sq = qb\n\t\t\t\t.$with('sq')\n\t\t\t\t.as(\n\t\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n\t\t\t\t\t\t.from(users)\n\t\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n\t\t\t\t\t\t.where(sql`${users.age1} > 18`),\n\t\t\t\t);\n\t\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n\t\t});\n\n\tExpect<\n\t\tEqual<\n\t\t\tMySqlViewWithSelection<'new_yorkers', false, {\n\t\t\t\tuserId: MySqlColumn<{\n\t\t\t\t\tname: 'id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'MySqlSerial';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\thasDefault: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: true;\n\t\t\t\t\tisAutoincrement: true;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: MySqlColumn<{\n\t\t\t\t\tname: 'id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'MySqlSerial';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: true;\n\t\t\t\t\tisAutoincrement: true;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers = mysqlView('new_yorkers', {\n\t\tuserId: int('user_id').notNull(),\n\t\tcityId: int('city_id'),\n\t})\n\t\t.algorithm('merge')\n\t\t.sqlSecurity('definer')\n\t\t.as(\n\t\t\tsql`select ${users.id} as user_id, ${cities.id} as city_id from ${users} left join ${cities} on ${\n\t\t\t\teq(cities.id, users.homeCity)\n\t\t\t} where ${gt(users.age1, 18)}`,\n\t\t);\n\n\tExpect<\n\t\tEqual<\n\t\t\tMySqlViewWithSelection<'new_yorkers', false, {\n\t\t\t\tuserId: MySqlColumn<{\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'MySqlInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: MySqlColumn<{\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'MySqlInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers = customSchema.view('new_yorkers', {\n\t\tuserId: int('user_id').notNull(),\n\t\tcityId: int('city_id'),\n\t})\n\t\t.algorithm('merge')\n\t\t.sqlSecurity('definer')\n\t\t.as(\n\t\t\tsql`select ${users.id} as user_id, ${cities.id} as city_id from ${users} left join ${cities} on ${\n\t\t\t\teq(cities.id, users.homeCity)\n\t\t\t} where ${gt(users.age1, 18)}`,\n\t\t);\n\n\tExpect<\n\t\tEqual<\n\t\t\tMySqlViewWithSelection<'new_yorkers', false, {\n\t\t\t\tuserId: MySqlColumn<{\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'MySqlInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: MySqlColumn<{\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'MySqlInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers = mysqlView('new_yorkers', {\n\t\tuserId: int('user_id').notNull(),\n\t\tcityId: int('city_id'),\n\t}).existing();\n\n\tExpect<\n\t\tEqual<\n\t\t\tMySqlViewWithSelection<'new_yorkers', true, {\n\t\t\t\tuserId: MySqlColumn<{\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'MySqlInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: MySqlColumn<{\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'MySqlInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers = customSchema.view('new_yorkers', {\n\t\tuserId: int('user_id').notNull(),\n\t\tcityId: int('city_id'),\n\t}).existing();\n\n\tExpect<\n\t\tEqual<\n\t\t\tMySqlViewWithSelection<'new_yorkers', true, {\n\t\t\t\tuserId: MySqlColumn<{\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'MySqlInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: MySqlColumn<{\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'MySqlInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst customText = customType<{ data: string }>({\n\t\tdataType() {\n\t\t\treturn 'text';\n\t\t},\n\t});\n\n\tconst t = customText('name').notNull();\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tbrand: 'Column';\n\t\t\t\tname: 'name';\n\t\t\t\ttableName: 'table';\n\t\t\t\tdataType: 'custom';\n\t\t\t\tcolumnType: 'MySqlCustomColumn';\n\t\t\t\tdata: string;\n\t\t\t\tdriverParam: unknown;\n\t\t\t\tnotNull: true;\n\t\t\t\thasDefault: false;\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tdialect: 'mysql';\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: false;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t},\n\t\t\tSimplify<BuildColumn<'table', typeof t, 'mysql'>['_']>\n\t\t>\n\t>;\n}\n\n{\n\tmysqlTable('test', {\n\t\tbigint: bigint('bigint', { mode: 'bigint' }),\n\t\tnumber: bigint('number', { mode: 'number' }),\n\t\tdate: date('date').default(new Date()),\n\t\tdate2: date('date2', { mode: 'date' }).default(new Date()),\n\t\tdate3: date('date3', { mode: 'string' }).default('2020-01-01'),\n\t\tdate4: date('date4', { mode: undefined }).default(new Date()),\n\t\tdatetime: datetime('datetime').default(new Date()),\n\t\tdatetime2: datetime('datetime2', { mode: 'date' }).default(new Date()),\n\t\tdatetime3: datetime('datetime3', { mode: 'string' }).default('2020-01-01'),\n\t\tdatetime4: datetime('datetime4', { mode: undefined }).default(new Date()),\n\t\ttimestamp: timestamp('timestamp').default(new Date()),\n\t\ttimestamp2: timestamp('timestamp2', { mode: 'date' }).default(new Date()),\n\t\ttimestamp3: timestamp('timestamp3', { mode: 'string' }).default('2020-01-01'),\n\t\ttimestamp4: timestamp('timestamp4', { mode: undefined }).default(new Date()),\n\t});\n}\n\n{\n\tmysqlTable('test', {\n\t\tcol1: decimal('col1').default('1'),\n\t});\n}\n\n{\n\tconst test = mysqlTable('test', {\n\t\ttest1: mysqlEnum('test', ['a', 'b', 'c'] as const).notNull(),\n\t\ttest2: mysqlEnum('test', ['a', 'b', 'c']).notNull(),\n\t\ttest3: varchar('test', { length: 255, enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest4: varchar('test', { length: 255, enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttest5: text('test', { enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest6: text('test', { enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttest7: tinytext('test', { enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest8: tinytext('test', { enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttest9: mediumtext('test', { enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest10: mediumtext('test', { enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttest11: longtext('test', { enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest12: longtext('test', { enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttest13: char('test', { enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest14: char('test', { enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttest15: text('test').notNull(),\n\t});\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test1.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test2.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test3.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test4.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test5.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test6.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test7.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test8.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test9.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test10.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test11.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test12.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test13.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test14.enumValues>>;\n\tExpect<Equal<[string, ...string[]], typeof test.test15.enumValues>>;\n}\n\n{ // All types with generated columns\n\tconst test = mysqlTable('test', {\n\t\ttest1: mysqlEnum('test', ['a', 'b', 'c'] as const).generatedAlwaysAs(sql``),\n\t\ttest2: mysqlEnum('test', ['a', 'b', 'c']).generatedAlwaysAs(sql``),\n\t\ttest3: varchar('test', { length: 255, enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest4: varchar('test', { length: 255, enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\ttest5: text('test', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest6: text('test', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\ttest7: tinytext('test', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest8: tinytext('test', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\ttest9: mediumtext('test', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest10: mediumtext('test', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\ttest11: longtext('test', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest12: longtext('test', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\ttest13: char('test', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest14: char('test', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\ttest15: text('test').generatedAlwaysAs(sql``),\n\t});\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test1.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test2.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test3.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test4.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test5.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test6.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test7.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test8.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test9.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test10.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test11.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test12.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test13.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test14.enumValues>>;\n\tExpect<Equal<[string, ...string[]], typeof test.test15.enumValues>>;\n}\n\n{\n\tconst getUsersTable = <TSchema extends string>(schemaName: TSchema) => {\n\t\treturn mysqlSchema(schemaName).table('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\t};\n\n\tconst users1 = getUsersTable('id1');\n\tExpect<Equal<'id1', typeof users1._.schema>>;\n\n\tconst users2 = getUsersTable('id2');\n\tExpect<Equal<'id2', typeof users2._.schema>>;\n}\n\n{\n\tconst internalStaff = mysqlTable('internal_staff', {\n\t\tuserId: int('user_id').notNull(),\n\t});\n\n\tconst customUser = mysqlTable('custom_user', {\n\t\tid: int('id').notNull(),\n\t});\n\n\tconst ticket = mysqlTable('ticket', {\n\t\tstaffId: int('staff_id').notNull(),\n\t});\n\n\tconst subq = db\n\t\t.select()\n\t\t.from(internalStaff)\n\t\t.leftJoin(\n\t\t\tcustomUser,\n\t\t\teq(internalStaff.userId, customUser.id),\n\t\t).as('internal_staff');\n\n\tconst mainQuery = await db\n\t\t.select()\n\t\t.from(ticket)\n\t\t.leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId));\n\n\tExpect<\n\t\tEqual<{\n\t\t\tinternal_staff: {\n\t\t\t\tinternal_staff: {\n\t\t\t\t\tuserId: number;\n\t\t\t\t};\n\t\t\t\tcustom_user: {\n\t\t\t\t\tid: number | null;\n\t\t\t\t};\n\t\t\t} | null;\n\t\t\tticket: {\n\t\t\t\tstaffId: number;\n\t\t\t};\n\t\t}[], typeof mainQuery>\n\t>;\n}\n\n{\n\tconst newYorkers = mysqlView('new_yorkers')\n\t\t.as((qb) => {\n\t\t\tconst sq = qb\n\t\t\t\t.$with('sq')\n\t\t\t\t.as(\n\t\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n\t\t\t\t\t\t.from(users)\n\t\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n\t\t\t\t\t\t.where(sql`${users.age1} > 18`),\n\t\t\t\t);\n\t\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n\t\t});\n\n\tawait db.select().from(newYorkers).leftJoin(newYorkers, eq(newYorkers.userId, newYorkers.userId));\n}\n\n{\n\tconst test = mysqlTable('test', {\n\t\tid: text('id').$defaultFn(() => crypto.randomUUID()).primaryKey(),\n\t});\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid?: string;\n\t\t}, typeof test.$inferInsert>\n\t>;\n}\n\n{\n\tmysqlTable('test', {\n\t\tid: int('id').$default(() => 1),\n\t\tid2: int('id').$defaultFn(() => 1),\n\t\t// @ts-expect-error - should be number\n\t\tid3: int('id').$default(() => '1'),\n\t\t// @ts-expect-error - should be number\n\t\tid4: int('id').$defaultFn(() => '1'),\n\t});\n}\n{\n\tconst emailLog = mysqlTable(\n\t\t'email_log',\n\t\t{\n\t\t\tid: int('id', { unsigned: true }).autoincrement().notNull(),\n\t\t\tclientId: int('id_client', { unsigned: true }).references((): MySqlColumn => emailLog.id, {\n\t\t\t\tonDelete: 'set null',\n\t\t\t\tonUpdate: 'cascade',\n\t\t\t}),\n\t\t\treceiverEmail: varchar('receiver_email', { length: 255 }).notNull(),\n\t\t\tmessageId: varchar('message_id', { length: 255 }),\n\t\t\tcontextId: int('context_id', { unsigned: true }),\n\t\t\tcontextType: mysqlEnum('context_type', ['test']).$type<['test']>(),\n\t\t\taction: varchar('action', { length: 80 }).$type<['test']>(),\n\t\t\tevents: json('events').$type<{ t: 'test' }[]>(),\n\t\t\tcreatedAt: timestamp('created_at', { mode: 'string' }).defaultNow().notNull(),\n\t\t\tupdatedAt: timestamp('updated_at', { mode: 'string' }).defaultNow().onUpdateNow(),\n\t\t},\n\t\t(table) => {\n\t\t\treturn {\n\t\t\t\temailLogId: primaryKey({ columns: [table.id], name: 'email_log_id' }),\n\t\t\t\temailLogMessageIdUnique: unique('email_log_message_id_unique').on(table.messageId),\n\t\t\t};\n\t\t},\n\t);\n\n\tExpect<\n\t\tEqual<{\n\t\t\treceiverEmail: string;\n\t\t\tid?: number | undefined;\n\t\t\tcreatedAt?: string | undefined;\n\t\t\tclientId?: number | null | undefined;\n\t\t\tmessageId?: string | null | undefined;\n\t\t\tcontextId?: number | null | undefined;\n\t\t\tcontextType?: ['test'] | null | undefined;\n\t\t\taction?: ['test'] | null | undefined;\n\t\t\tevents?:\n\t\t\t\t| {\n\t\t\t\t\tt: 'test';\n\t\t\t\t}[]\n\t\t\t\t| null\n\t\t\t\t| undefined;\n\t\t\tupdatedAt?: string | null | undefined;\n\t\t}, typeof emailLog.$inferInsert>\n\t>;\n}\n\n{\n\tconst customRequiredConfig = customType<{\n\t\tdata: string;\n\t\tdriverData: string;\n\t\tconfig: { length: number };\n\t\tconfigRequired: true;\n\t}>({\n\t\tdataType(config) {\n\t\t\tExpect<Equal<{ length: number }, typeof config>>;\n\t\t\treturn `varchar(${config.length})`;\n\t\t},\n\n\t\ttoDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\n\t\tfromDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\t});\n\n\tcustomRequiredConfig('t', { length: 10 });\n\tcustomRequiredConfig({ length: 10 });\n\t// @ts-expect-error - config is required\n\tcustomRequiredConfig('t');\n\t// @ts-expect-error - config is required\n\tcustomRequiredConfig();\n}\n\n{\n\tconst customOptionalConfig = customType<{\n\t\tdata: string;\n\t\tdriverData: string;\n\t\tconfig: { length: number };\n\t}>({\n\t\tdataType(config) {\n\t\t\tExpect<Equal<{ length: number } | undefined, typeof config>>;\n\t\t\treturn config ? `varchar(${config.length})` : `text`;\n\t\t},\n\n\t\ttoDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\n\t\tfromDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\t});\n\n\tcustomOptionalConfig('t', { length: 10 });\n\tcustomOptionalConfig('t');\n\tcustomOptionalConfig({ length: 10 });\n\tcustomOptionalConfig();\n}\n\n{\n\tmysqlTable('all_columns', {\n\t\tbigint: bigint('bigint', { mode: 'number' }),\n\t\tbigint2: bigint('bigint', { mode: 'number', unsigned: true }),\n\t\tbigintdef: bigint('bigintdef', { mode: 'number' }).default(0),\n\t\tbinary: binary('binary'),\n\t\tbinary1: binary('binary1', { length: 1 }),\n\t\tbinarydef: binary('binarydef').default(''),\n\t\tboolean: boolean('boolean'),\n\t\tbooleandef: boolean('booleandef').default(false),\n\t\tchar: char('char'),\n\t\tchar2: char('char2', { length: 1 }),\n\t\tchar3: char('char3', { enum: ['a', 'b', 'c'] }),\n\t\tchar4: char('char4', { length: 1, enum: ['a', 'b', 'c'] }),\n\t\tchardef: char('chardef').default(''),\n\t\tdate: date('date'),\n\t\tdate2: date('date2', { mode: 'string' }),\n\t\tdatedef: date('datedef').default(new Date()),\n\t\tdatetime: datetime('datetime'),\n\t\tdatetime2: datetime('datetime2', { mode: 'string' }),\n\t\tdatetime3: datetime('datetime3', { mode: 'string', fsp: 3 }),\n\t\tdatetimedef: datetime('datetimedef').default(new Date()),\n\t\tdecimal: decimal('decimal'),\n\t\tdecimal2: decimal('decimal2', { precision: 10 }),\n\t\tdecimal3: decimal('decimal3', { scale: 2 }),\n\t\tdecimal4: decimal('decimal4', { precision: 10, scale: 2 }),\n\t\tdecimaldef: decimal('decimaldef').default('0'),\n\t\tdouble: double('double'),\n\t\tdouble2: double('double2', { precision: 10 }),\n\t\tdouble3: double('double3', { scale: 2 }),\n\t\tdouble4: double('double4', { precision: 10, scale: 2 }),\n\t\tdoubledef: double('doubledef').default(0),\n\t\tenum: mysqlEnum('enum', ['a', 'b', 'c']),\n\t\tenumdef: mysqlEnum('enumdef', ['a', 'b', 'c']).default('a'),\n\t\tfloat: float('float'),\n\t\tfloat2: float('float2', { precision: 10 }),\n\t\tfloat3: float('float3', { scale: 2 }),\n\t\tfloat4: float('float4', { precision: 10, scale: 2 }),\n\t\tfloatdef: float('floatdef').default(0),\n\t\tint: int('int'),\n\t\tint2: int('int2', { unsigned: true }),\n\t\tintdef: int('intdef').default(0),\n\t\tjson: json('json'),\n\t\tjsondef: json('jsondef').default({}),\n\t\tmediumint: mediumint('mediumint'),\n\t\tmediumint2: mediumint('mediumint2', { unsigned: true }),\n\t\tmediumintdef: mediumint('mediumintdef').default(0),\n\t\treal: real('real'),\n\t\treal2: real('real2', { precision: 10 }),\n\t\treal3: real('real3', { scale: 2 }),\n\t\treal4: real('real4', { precision: 10, scale: 2 }),\n\t\trealdef: real('realdef').default(0),\n\t\tserial: serial('serial'),\n\t\tserialdef: serial('serialdef').default(0),\n\t\tsmallint: smallint('smallint'),\n\t\tsmallint2: smallint('smallint2', { unsigned: true }),\n\t\tsmallintdef: smallint('smallintdef').default(0),\n\t\ttext: text('text'),\n\t\ttext2: text('text2', { enum: ['a', 'b', 'c'] }),\n\t\ttextdef: text('textdef').default(''),\n\t\ttinytext: tinytext('tinytext'),\n\t\ttinytext2: tinytext('tinytext2', { enum: ['a', 'b', 'c'] }),\n\t\ttinytextdef: tinytext('tinytextdef').default(''),\n\t\tmediumtext: mediumtext('mediumtext'),\n\t\tmediumtext2: mediumtext('mediumtext2', { enum: ['a', 'b', 'c'] }),\n\t\tmediumtextdef: mediumtext('mediumtextdef').default(''),\n\t\tlongtext: longtext('longtext'),\n\t\tlongtext2: longtext('longtext2', { enum: ['a', 'b', 'c'] }),\n\t\tlongtextdef: longtext('longtextdef').default(''),\n\t\ttime: time('time'),\n\t\ttime2: time('time2', { fsp: 1 }),\n\t\ttimedef: time('timedef').default('00:00:00'),\n\t\ttimestamp: timestamp('timestamp'),\n\t\ttimestamp2: timestamp('timestamp2', { mode: 'string' }),\n\t\ttimestamp3: timestamp('timestamp3', { mode: 'string', fsp: 1 }),\n\t\ttimestamp4: timestamp('timestamp4', { fsp: 1 }),\n\t\ttimestampdef: timestamp('timestampdef').default(new Date()),\n\t\ttinyint: tinyint('tinyint'),\n\t\ttinyint2: tinyint('tinyint2', { unsigned: true }),\n\t\ttinyintdef: tinyint('tinyintdef').default(0),\n\t\tvarbinary: varbinary('varbinary', { length: 1 }),\n\t\tvarbinarydef: varbinary('varbinarydef', { length: 1 }).default(''),\n\t\tvarchar: varchar('varchar', { length: 1 }),\n\t\tvarchar2: varchar('varchar2', { length: 1, enum: ['a', 'b', 'c'] }),\n\t\tvarchardef: varchar('varchardef', { length: 1 }).default(''),\n\t\tyear: year('year'),\n\t\tyeardef: year('yeardef').default(0),\n\t});\n}\n\n{\n\tconst keysAsColumnNames = mysqlTable('test', {\n\t\tid: int(),\n\t\tname: text(),\n\t});\n\n\tExpect<Equal<typeof keysAsColumnNames['id']['_']['name'], 'id'>>;\n\tExpect<Equal<typeof keysAsColumnNames['name']['_']['name'], 'name'>>;\n}\n\n{\n\tmysqlTable('all_columns_without_name', {\n\t\tbigint: bigint({ mode: 'number' }),\n\t\tbigint2: bigint({ mode: 'number', unsigned: true }),\n\t\tbigintdef: bigint({ mode: 'number' }).default(0),\n\t\tbinary: binary(),\n\t\tbinrary1: binary({ length: 1 }),\n\t\tbinarydef: binary().default(''),\n\t\tboolean: boolean(),\n\t\tbooleandef: boolean().default(false),\n\t\tchar: char(),\n\t\tchar2: char({ length: 1 }),\n\t\tchar3: char({ enum: ['a', 'b', 'c'] }),\n\t\tchar4: char({ length: 1, enum: ['a', 'b', 'c'] }),\n\t\tchardef: char().default(''),\n\t\tdate: date(),\n\t\tdate2: date({ mode: 'string' }),\n\t\tdatedef: date('datedef').default(new Date()),\n\t\tdatetime: datetime(),\n\t\tdatetime2: datetime({ mode: 'string' }),\n\t\tdatetime3: datetime({ mode: 'string', fsp: 3 }),\n\t\tdatetimedef: datetime('datetimedef').default(new Date()),\n\t\tdecimal: decimal(),\n\t\tdecimal2: decimal({ precision: 10 }),\n\t\tdecimal3: decimal({ scale: 2 }),\n\t\tdecimal4: decimal({ precision: 10, scale: 2 }),\n\t\tdecimaldef: decimal('decimaldef').default('0'),\n\t\tdouble: double(),\n\t\tdouble2: double({ precision: 10 }),\n\t\tdouble3: double({ scale: 2 }),\n\t\tdouble4: double({ precision: 10, scale: 2 }),\n\t\tdoubledef: double().default(0),\n\t\tenum: mysqlEnum(['a', 'b', 'c']),\n\t\tenumdef: mysqlEnum(['a', 'b', 'c']).default('a'),\n\t\tfloat: float(),\n\t\tfloat2: float({ precision: 10 }),\n\t\tfloat3: float({ scale: 2 }),\n\t\tfloat4: float({ precision: 10, scale: 2 }),\n\t\tfloatdef: float().default(0),\n\t\tint: int(),\n\t\tint2: int({ unsigned: true }),\n\t\tintdef: int().default(0),\n\t\tjson: json(),\n\t\tjsondef: json().default({}),\n\t\tmediumint: mediumint(),\n\t\tmediumint2: mediumint({ unsigned: true }),\n\t\tmediumintdef: mediumint().default(0),\n\t\treal: real(),\n\t\treal2: real({ precision: 10 }),\n\t\treal3: real({ scale: 2 }),\n\t\treal4: real({ precision: 10, scale: 2 }),\n\t\trealdef: real().default(0),\n\t\tserial: serial(),\n\t\tserialdef: serial().default(0),\n\t\tsmallint: smallint(),\n\t\tsmallint2: smallint({ unsigned: true }),\n\t\tsmallintdef: smallint().default(0),\n\t\ttext: text(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }),\n\t\ttextdef: text().default(''),\n\t\ttinytext: tinytext(),\n\t\ttinytext2: tinytext({ enum: ['a', 'b', 'c'] }),\n\t\ttinytextdef: tinytext().default(''),\n\t\tmediumtext: mediumtext(),\n\t\tmediumtext2: mediumtext({ enum: ['a', 'b', 'c'] }),\n\t\tmediumtextdef: mediumtext().default(''),\n\t\tlongtext: longtext(),\n\t\tlongtext2: longtext({ enum: ['a', 'b', 'c'] }),\n\t\tlongtextdef: longtext().default(''),\n\t\ttime: time(),\n\t\ttime2: time({ fsp: 1 }),\n\t\ttimedef: time().default('00:00:00'),\n\t\ttimestamp: timestamp(),\n\t\ttimestamp2: timestamp({ mode: 'string' }),\n\t\ttimestamp3: timestamp({ mode: 'string', fsp: 1 }),\n\t\ttimestamp4: timestamp({ fsp: 1 }),\n\t\ttimestampdef: timestamp().default(new Date()),\n\t\ttinyint: tinyint(),\n\t\ttinyint2: tinyint({ unsigned: true }),\n\t\ttinyintdef: tinyint().default(0),\n\t\tvarbinary: varbinary({ length: 1 }),\n\t\tvarbinarydef: varbinary({ length: 1 }).default(''),\n\t\tvarchar: varchar({ length: 1 }),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }),\n\t\tvarchardef: varchar({ length: 1 }).default(''),\n\t\tyear: year(),\n\t\tyeardef: year().default(0),\n\t});\n}\n\n{\n\tenum Role {\n\t\tadmin = 'admin',\n\t\tuser = 'user',\n\t\tguest = 'guest',\n\t}\n\n\tenum RoleNonString {\n\t\tadmin,\n\t\tuser,\n\t\tguest,\n\t}\n\n\tenum RolePartiallyString {\n\t\tadmin,\n\t\tuser = 'user',\n\t\tguest = 'guest',\n\t}\n\n\tconst table = mysqlTable('table', {\n\t\tenum: mysqlEnum('enum', Role),\n\t\t// @ts-expect-error\n\t\tenum1: mysqlEnum('enum1', RoleNonString),\n\t\t// @ts-expect-error\n\t\tenum2: mysqlEnum('enum2', RolePartiallyString),\n\t});\n\n\tconst res = await db.select({ enum: table.enum }).from(table);\n\n\tExpect<Equal<{ enum: Role | null }[], typeof res>>;\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/update.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils.ts';\nimport type { MySqlUpdate } from '~/mysql-core/index.ts';\nimport type { MySqlRawQueryResult } from '~/mysql2/session.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\nimport { users } from './tables.ts';\n\n{\n\tfunction dynamic<T extends MySqlUpdate>(qb: T) {\n\t\treturn qb.where(sql``);\n\t}\n\n\tconst qbBase = db.update(users).set({}).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<MySqlRawQueryResult, typeof result>>;\n}\n\n{\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n}\n\n{\n\tdb.update(users).set({}).where(sql``).limit(1).orderBy(sql``);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/mysql/with.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { int, mysqlTable, serial, text } from '~/mysql-core/index.ts';\nimport { gt, inArray, like } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\n\nconst orders = mysqlTable('orders', {\n\tid: serial('id').primaryKey(),\n\tregion: text('region').notNull(),\n\tproduct: text('product').notNull(),\n\tamount: int('amount').notNull(),\n\tquantity: int('quantity').notNull(),\n\tgenerated: text('generatedText').generatedAlwaysAs(sql``),\n});\n\n{\n\tconst regionalSales = db\n\t\t.$with('regional_sales')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.groupBy(orders.region),\n\t\t);\n\n\tconst topRegions = db\n\t\t.$with('top_regions')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: orders.amount,\n\t\t\t\t})\n\t\t\t\t.from(regionalSales)\n\t\t\t\t.where(\n\t\t\t\t\tgt(\n\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\tdb.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t);\n\n\tconst result = await db\n\t\t.with(regionalSales, topRegions)\n\t\t.select({\n\t\t\tregion: orders.region,\n\t\t\tproduct: orders.product,\n\t\t\tproductUnits: sql<number>`sum(${orders.quantity})`,\n\t\t\tproductSales: sql<number>`sum(${orders.amount})`,\n\t\t})\n\t\t.from(orders)\n\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)));\n\n\tExpect<\n\t\tEqual<{\n\t\t\tregion: string;\n\t\t\tproduct: string;\n\t\t\tproductUnits: number;\n\t\t\tproductSales: number;\n\t\t}[], typeof result>\n\t>;\n\n\tconst allOrdersWith = db.$with('all_orders_with').as(db.select().from(orders));\n\tconst allFromWith = await db.with(allOrdersWith).select().from(allOrdersWith);\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid: number;\n\t\t\tregion: string;\n\t\t\tproduct: string;\n\t\t\tamount: number;\n\t\t\tquantity: number;\n\t\t\tgenerated: string | null;\n\t\t}[], typeof allFromWith>\n\t>;\n\n\tconst regionalSalesWith = db.$with('regional_sales_with').as(db.select().from(regionalSales));\n\tdb.with(regionalSalesWith).select().from(regionalSalesWith).where(like(regionalSalesWith.totalSales, 'abc'));\n}\n\n{\n\tconst providers = mysqlTable('providers', {\n\t\tid: serial().primaryKey(),\n\t\tproviderName: text().notNull(),\n\t});\n\n\tconst sq1 = db.$with('providers_sq', {\n\t\tname: providers.providerName,\n\t}).as(sql`select provider_name as name from providers`);\n\tconst q1 = await db.with(sq1).select().from(sq1);\n\tExpect<Equal<typeof q1, { name: string }[]>>;\n\n\tconst sq2 = db.$with('providers_sq', {\n\t\tnested: {\n\t\t\tid: providers.id,\n\t\t},\n\t}).as(() => sql`select id from providers`);\n\tconst q2 = await db.with(sq2).select().from(sq2);\n\tExpect<Equal<typeof q2, { nested: { id: number } }[]>>;\n\n\t// @ts-expect-error\n\tdb.$with('providers_sq', { name: providers.providerName }).as(db.select().from(providers));\n\t// @ts-expect-error\n\tdb.$with('providers_sq', { name: providers.providerName }).as((qb) => qb.select().from(providers));\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/1-to-1-fk.ts",
    "content": "import { integer, type PgColumn, serial } from '~/pg-core/columns/index.ts';\nimport { pgTable } from '~/pg-core/table.ts';\n\n{\n\tconst test1 = pgTable('test1_table', {\n\t\tid: serial('id').primaryKey(),\n\t\ttest2Id: integer('test2_id').references(() => test2.id),\n\t});\n\n\tconst test1Id = integer('test1_id').references(() => test1.id);\n\n\tconst test2 = pgTable('test2_table', {\n\t\tid: serial('id').primaryKey(),\n\t\ttest1Id,\n\t});\n}\n\n{\n\tconst test1 = pgTable('test1_table', {\n\t\tid: serial('id').primaryKey(),\n\t\ttest2Id: integer('test2_id').references((): PgColumn => test2.id),\n\t});\n\n\tconst test2 = pgTable('test2_table', {\n\t\tid: serial('id').primaryKey(),\n\t\ttest1Id: integer('test1_id').references(() => test1.id),\n\t});\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/array.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils.ts';\nimport type { Column } from '~/column.ts';\nimport { integer, pgTable } from '~/pg-core/index.ts';\n\n{\n\tconst table = pgTable('table', {\n\t\ta: integer('a').array().notNull(),\n\t});\n\tExpect<\n\t\tEqual<\n\t\t\tColumn<\n\t\t\t\t{\n\t\t\t\t\tname: 'a';\n\t\t\t\t\ttableName: 'table';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t\t{}\n\t\t\t>,\n\t\t\ttypeof table['a']['_']['baseColumn']\n\t\t>\n\t>;\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/count.ts",
    "content": "import { Expect } from 'type-tests/utils.ts';\nimport { integer, pgTable, serial, text } from '~/pg-core/index.ts';\nimport { and, gt, ne } from '~/sql/expressions/index.ts';\nimport type { Equal } from '~/utils.ts';\nimport { db } from './db.ts';\n\nconst names = pgTable('names', {\n\tid: serial('id').primaryKey(),\n\tname: text('name'),\n\tauthorId: integer('author_id'),\n});\n\nconst separate = await db.$count(names);\n\nconst separateFilters = await db.$count(names, and(gt(names.id, 1), ne(names.name, 'forbidden')));\n\nconst embedded = await db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tauthorId: names.authorId,\n\t\tcount1: db.$count(names).as('count1'),\n\t})\n\t.from(names);\n\nconst embeddedFilters = await db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tauthorId: names.authorId,\n\t\tcount1: db.$count(names, and(gt(names.id, 1), ne(names.name, 'forbidden'))).as('count1'),\n\t})\n\t.from(names);\n\nExpect<Equal<number, typeof separate>>;\n\nExpect<Equal<number, typeof separateFilters>>;\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t}[],\n\t\ttypeof embedded\n\t>\n>;\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t}[],\n\t\ttypeof embeddedFilters\n\t>\n>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/db-rel.ts",
    "content": "import pg from 'pg';\nimport { type Equal, Expect } from 'type-tests/utils.ts';\nimport { drizzle } from '~/node-postgres/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport * as schema from './tables-rel.ts';\n\nconst { Pool } = pg;\n\nconst pdb = new Pool({ connectionString: process.env['PG_CONNECTION_STRING'] });\nconst db = drizzle(pdb, { schema });\n\n{\n\tconst result = await db.query.users.findMany({\n\t\twhere: (users, { sql }) => sql`char_length(${users.name} > 1)`,\n\t\tlimit: sql.placeholder('l'),\n\t\torderBy: (users, { asc, desc }) => [asc(users.name), desc(users.id)],\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { sql }) => sql`char_length(${posts.title} > 1)`,\n\t\t\t\tlimit: sql.placeholder('l'),\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: false,\n\t\t\t\t\ttitle: undefined,\n\t\t\t\t},\n\t\t\t\twith: {\n\t\t\t\t\tauthor: true,\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twhere: (comments, { sql }) => sql`char_length(${comments.text} > 1)`,\n\t\t\t\t\t\tlimit: sql.placeholder('l'),\n\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\ttext: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: {\n\t\t\t\t\t\t\t\tcolumns: {\n\t\t\t\t\t\t\t\t\tid: undefined,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\t\t\tcity: {\n\t\t\t\t\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\t\t\t\t\tusers: true,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tcityId: number;\n\t\t\thomeCityId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tposts: {\n\t\t\t\ttitle: string;\n\t\t\t\tauthorId: number | null;\n\t\t\t\tcomments: {\n\t\t\t\t\ttext: string;\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tcity: {\n\t\t\t\t\t\t\tid: number;\n\t\t\t\t\t\t\tname: string;\n\t\t\t\t\t\t\tusers: {\n\t\t\t\t\t\t\t\tid: number;\n\t\t\t\t\t\t\t\tname: string;\n\t\t\t\t\t\t\t\tcityId: number;\n\t\t\t\t\t\t\t\thomeCityId: number | null;\n\t\t\t\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t\t\t\t}[];\n\t\t\t\t\t\t};\n\t\t\t\t\t} | null;\n\t\t\t\t}[];\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tcityId: number;\n\t\t\t\t\thomeCityId: number | null;\n\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[], typeof result>\n\t>;\n}\n\n{\n\tconst result = await db.query.users.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tauthorId: true,\n\t\t\t\t},\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${schema.posts.title})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tposts: {\n\t\t\t\t\tauthorId: number | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t}[];\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/db.ts",
    "content": "import pg from 'pg';\nimport { drizzle } from '~/node-postgres/index.ts';\n\nconst { Client } = pg;\n\nexport const db = drizzle(new Client());\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/delete.ts",
    "content": "import type { QueryResult } from 'pg';\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport type { PgDelete } from '~/pg-core/index.ts';\nimport { eq } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\nimport { users } from './tables.ts';\n\nconst deleteAll = await db.delete(users);\nExpect<Equal<QueryResult<never>, typeof deleteAll>>;\n\nconst deleteAllStmt = db.delete(users).prepare('deleteAllStmt');\nconst deleteAllPrepared = await deleteAllStmt.execute();\nExpect<Equal<QueryResult<never>, typeof deleteAllPrepared>>;\n\nconst deleteWhere = await db.delete(users).where(eq(users.id, 1));\nExpect<Equal<QueryResult<never>, typeof deleteWhere>>;\n\nconst deleteWhereStmt = db.delete(users).where(eq(users.id, 1)).prepare('deleteWhereStmt');\nconst deleteWherePrepared = await deleteWhereStmt.execute();\nExpect<Equal<QueryResult<never>, typeof deleteWherePrepared>>;\n\nconst deleteReturningAll = await db.delete(users).returning();\nExpect<Equal<typeof users.$inferSelect[], typeof deleteReturningAll>>;\n\nconst deleteReturningAllStmt = db.delete(users).returning().prepare('deleteReturningAllStmt');\nconst deleteReturningAllPrepared = await deleteReturningAllStmt.execute();\nExpect<Equal<typeof users.$inferSelect[], typeof deleteReturningAllPrepared>>;\n\nconst deleteReturningPartial = await db.delete(users).returning({\n\tmyId: users.id,\n\tmyHomeCity: users.homeCity,\n});\nExpect<Equal<{ myId: number; myHomeCity: number }[], typeof deleteReturningPartial>>;\n\nconst deleteReturningPartialStmt = db.delete(users).returning({\n\tmyId: users.id,\n\tmyHomeCity: users.homeCity,\n}).prepare('deleteReturningPartialStmt');\nconst deleteReturningPartialPrepared = await deleteReturningPartialStmt.execute();\nExpect<Equal<{ myId: number; myHomeCity: number }[], typeof deleteReturningPartialPrepared>>;\n\n{\n\tfunction dynamic<T extends PgDelete>(qb: T) {\n\t\treturn qb.where(sql``).returning();\n\t}\n\n\tconst qbBase = db.delete(users).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tfunction withReturning<T extends PgDelete>(qb: T) {\n\t\treturn qb.returning();\n\t}\n\n\tconst qbBase = db.delete(users).$dynamic();\n\tconst qb = withReturning(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tdb\n\t\t.delete(users)\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n\n\tdb\n\t\t.delete(users)\n\t\t.returning()\n\t\t// @ts-expect-error method was already called\n\t\t.returning();\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/generated-columns.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils';\nimport { type InferInsertModel, type InferSelectModel, sql } from '~/index';\nimport { drizzle } from '~/node-postgres';\nimport { integer, pgTable, serial, text, varchar } from '~/pg-core';\nimport { db } from './db';\n\nconst users = pgTable(\n\t'users',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\tfirstName: varchar('first_name', { length: 255 }),\n\t\tlastName: varchar('last_name', { length: 255 }),\n\t\temail: text('email').notNull(),\n\t\tfullName: text('full_name').generatedAlwaysAs(sql`concat_ws(first_name, ' ', last_name)`).notNull(),\n\t\tupperName: text('upper_name').generatedAlwaysAs(\n\t\t\tsql` case when first_name is null then null else upper(first_name) end `,\n\t\t),\n\t},\n);\n{\n\ttype User = typeof users.$inferSelect;\n\ttype NewUser = typeof users.$inferInsert;\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string;\n\t\t\t\tupperName: string | null;\n\t\t\t},\n\t\t\tUser\n\t\t>\n\t>();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\temail: string;\n\t\t\t\tid?: number | undefined;\n\t\t\t\tfirstName?: string | null | undefined;\n\t\t\t\tlastName?: string | null | undefined;\n\t\t\t},\n\t\t\tNewUser\n\t\t>\n\t>();\n}\n\n{\n\ttype User = InferSelectModel<typeof users>;\n\ttype NewUser = InferInsertModel<typeof users>;\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string;\n\t\t\t\tupperName: string | null;\n\t\t\t},\n\t\t\tUser\n\t\t>\n\t>();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\temail: string;\n\t\t\t\tid?: number | undefined;\n\t\t\t\tfirstName?: string | null | undefined;\n\t\t\t\tlastName?: string | null | undefined;\n\t\t\t},\n\t\t\tNewUser\n\t\t>\n\t>();\n}\n\n{\n\tconst dbUsers = await db.select().from(users);\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string;\n\t\t\t\tupperName: string | null;\n\t\t\t}[],\n\t\t\ttypeof dbUsers\n\t\t>\n\t>();\n}\n\n{\n\tconst db = drizzle({} as any, { schema: { users } });\n\n\tconst dbUser = await db.query.users.findFirst();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string;\n\t\t\t\tupperName: string | null;\n\t\t\t} | undefined,\n\t\t\ttypeof dbUser\n\t\t>\n\t>();\n}\n\n{\n\tconst db = drizzle({} as any, { schema: { users } });\n\n\tconst dbUser = await db.query.users.findMany();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string;\n\t\t\t\tupperName: string | null;\n\t\t\t}[],\n\t\t\ttypeof dbUser\n\t\t>\n\t>();\n}\n\n{\n\t// @ts-expect-error - Can't use the fullName because it's a generated column\n\tawait db.insert(users).values({\n\t\tfirstName: 'test',\n\t\tlastName: 'test',\n\t\temail: 'test',\n\t\tfullName: 'test',\n\t});\n}\n\n{\n\tawait db.update(users).set({\n\t\tfirstName: 'test',\n\t\tlastName: 'test',\n\t\temail: 'test',\n\t\t// @ts-expect-error - Can't use the fullName because it's a generated column\n\t\tfullName: 'test',\n\t});\n}\n\nconst users2 = pgTable(\n\t'users',\n\t{\n\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\tid2: integer('id').generatedAlwaysAsIdentity(),\n\t},\n);\n\n{\n\ttype User = typeof users2.$inferSelect;\n\ttype NewUser = typeof users2.$inferInsert;\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tid2: number;\n\t\t\t},\n\t\t\tUser\n\t\t>\n\t>();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid?: number | undefined;\n\t\t\t},\n\t\t\tNewUser\n\t\t>\n\t>();\n}\n\nconst usersSeq = pgTable(\n\t'users',\n\t{\n\t\tid: integer('id').generatedByDefaultAsIdentity(),\n\t\tid2: integer('id').generatedAlwaysAsIdentity(),\n\t},\n);\n\n{\n\ttype User = typeof usersSeq.$inferSelect;\n\ttype NewUser = typeof usersSeq.$inferInsert;\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tid2: number;\n\t\t\t},\n\t\t\tUser\n\t\t>\n\t>();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid?: number | undefined;\n\t\t\t},\n\t\t\tNewUser\n\t\t>\n\t>();\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/insert.ts",
    "content": "import type { QueryResult } from 'pg';\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { boolean, pgTable, QueryBuilder, serial, text } from '~/pg-core/index.ts';\nimport type { PgInsert } from '~/pg-core/query-builders/insert.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\nimport { identityColumnsTable, users } from './tables.ts';\n\nconst insert = await db\n\t.insert(users)\n\t.values({\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tage1: 1,\n\t\tenumCol: 'a',\n\t\tarrayCol: [''],\n\t});\nExpect<Equal<QueryResult<never>, typeof insert>>;\n\nconst insertStmt = db\n\t.insert(users)\n\t.values({\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tage1: 1,\n\t\tenumCol: 'a',\n\t\tarrayCol: [''],\n\t})\n\t.prepare('insertStmt');\nconst insertPrepared = await insertStmt.execute();\nExpect<Equal<QueryResult<never>, typeof insertPrepared>>;\n\nconst insertSql = await db.insert(users).values({\n\thomeCity: sql`123`,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: sql`foobar`,\n\tarrayCol: [''],\n});\nExpect<Equal<QueryResult<never>, typeof insertSql>>;\n\nconst insertSqlStmt = db\n\t.insert(users)\n\t.values({\n\t\thomeCity: sql`123`,\n\t\tclass: 'A',\n\t\tage1: 1,\n\t\tenumCol: sql`foobar`,\n\t\tarrayCol: [''],\n\t})\n\t.prepare('insertSqlStmt');\nconst insertSqlPrepared = await insertSqlStmt.execute();\nExpect<Equal<QueryResult<never>, typeof insertSqlPrepared>>;\n\nconst insertReturning = await db\n\t.insert(users)\n\t.values({\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tage1: 1,\n\t\tenumCol: 'a',\n\t\tarrayCol: [''],\n\t})\n\t.returning();\nExpect<Equal<typeof users.$inferSelect[], typeof insertReturning>>;\n\nconst insertReturningStmt = db\n\t.insert(users)\n\t.values({\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tage1: 1,\n\t\tenumCol: 'a',\n\t\tarrayCol: [''],\n\t})\n\t.returning()\n\t.prepare('insertReturningStmt');\nconst insertReturningPrepared = await insertReturningStmt.execute();\nExpect<Equal<typeof users.$inferSelect[], typeof insertReturningPrepared>>;\n\nconst insertReturningPartial = await db\n\t.insert(users)\n\t.values({\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tage1: 1,\n\t\tenumCol: 'a',\n\t\tarrayCol: [''],\n\t})\n\t.returning({\n\t\tid: users.id,\n\t\thomeCity: users.homeCity,\n\t\tmySubclass: users.subClass,\n\t});\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\thomeCity: number;\n\t\tmySubclass: 'B' | 'D' | null;\n\t}[], typeof insertReturningPartial>\n>;\n\nconst insertReturningPartialStmt = db\n\t.insert(users)\n\t.values({\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tage1: 1,\n\t\tenumCol: 'a',\n\t\tarrayCol: [''],\n\t})\n\t.returning({\n\t\tid: users.id,\n\t\thomeCity: users.homeCity,\n\t\tmySubclass: users.subClass,\n\t})\n\t.prepare('insertReturningPartialStmt');\nconst insertReturningPartialPrepared = await insertReturningPartialStmt.execute();\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\thomeCity: number;\n\t\tmySubclass: 'B' | 'D' | null;\n\t}[], typeof insertReturningPartialPrepared>\n>;\n\nconst insertReturningSql = await db\n\t.insert(users)\n\t.values({\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tage1: sql`2 + 2`,\n\t\tenumCol: 'a',\n\t\tarrayCol: [''],\n\t})\n\t.returning({\n\t\tid: users.id,\n\t\thomeCity: users.homeCity,\n\t\tsubclassLower: sql`lower(${users.subClass})`,\n\t\tclassLower: sql<string>`lower(${users.class})`,\n\t});\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\thomeCity: number;\n\t\tsubclassLower: unknown;\n\t\tclassLower: string;\n\t}[], typeof insertReturningSql>\n>;\n\nconst insertReturningSqlStmt = db\n\t.insert(users)\n\t.values({\n\t\thomeCity: 1,\n\t\tclass: 'A',\n\t\tage1: sql`2 + 2`,\n\t\tenumCol: 'a',\n\t\tarrayCol: [''],\n\t})\n\t.returning({\n\t\tid: users.id,\n\t\thomeCity: users.homeCity,\n\t\tsubclassLower: sql`lower(${users.subClass})`,\n\t\tclassLower: sql<string>`lower(${users.class})`,\n\t})\n\t.prepare('insertReturningSqlStmt');\nconst insertReturningSqlPrepared = await insertReturningSqlStmt.execute();\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\thomeCity: number;\n\t\tsubclassLower: unknown;\n\t\tclassLower: string;\n\t}[], typeof insertReturningSqlPrepared>\n>;\n\n{\n\tfunction dynamic<T extends PgInsert>(qb: T) {\n\t\treturn qb.returning().onConflictDoNothing().onConflictDoUpdate({ set: {}, target: users.id, where: sql`` });\n\t}\n\n\tconst qbBase = db.insert(users).values({ age1: 0, class: 'A', enumCol: 'a', homeCity: 0, arrayCol: [] }).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tfunction withReturning<T extends PgInsert>(qb: T) {\n\t\treturn qb.returning();\n\t}\n\n\tconst qbBase = db.insert(users).values({ age1: 0, class: 'A', enumCol: 'a', homeCity: 0, arrayCol: [] }).$dynamic();\n\tconst qb = withReturning(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tdb\n\t\t.insert(users)\n\t\t.values({ age1: 0, class: 'A', enumCol: 'a', homeCity: 0, arrayCol: [] })\n\t\t.returning()\n\t\t// @ts-expect-error method was already called\n\t\t.returning();\n}\n\n{\n\tconst users1 = pgTable('users1', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tadmin: boolean('admin').notNull().default(false),\n\t});\n\tconst users2 = pgTable('users2', {\n\t\tid: serial('id').primaryKey(),\n\t\tfirstName: text('first_name').notNull(),\n\t\tlastName: text('last_name').notNull(),\n\t\tadmin: boolean('admin').notNull().default(false),\n\t\tphoneNumber: text('phone_number'),\n\t});\n\n\tconst qb = new QueryBuilder();\n\n\tdb.insert(users1).select(sql`select * from users1`);\n\tdb.insert(users1).select(() => sql`select * from users1`);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tname: users2.firstName,\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2),\n\t\t);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tname: users2.firstName,\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2).where(sql``),\n\t\t);\n\n\tdb\n\t\t.insert(users2)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tfirstName: users2.firstName,\n\t\t\t\tlastName: users2.lastName,\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2),\n\t\t);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tname: sql`${users2.firstName} || ' ' || ${users2.lastName}`.as('name'),\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2),\n\t\t);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\t// @ts-expect-error name is undefined\n\t\t\tqb.select({ admin: users1.admin }).from(users1),\n\t\t);\n\n\tdb.insert(users1).select(db.select().from(users1));\n\tdb.insert(users1).select(() => db.select().from(users1));\n\tdb.insert(users1).select((qb) => qb.select().from(users1));\n\t// @ts-expect-error tables have different keys\n\tdb.insert(users1).select(db.select().from(users2));\n\t// @ts-expect-error tables have different keys\n\tdb.insert(users1).select(() => db.select().from(users2));\n}\n\n{\n\tdb.insert(identityColumnsTable).values([\n\t\t{ byDefaultAsIdentity: 4, name: 'fdf' },\n\t]);\n\n\t// @ts-expect-error\n\tdb.insert(identityColumnsTable).values([\n\t\t{ alwaysAsIdentity: 2 },\n\t]);\n\n\tdb.insert(identityColumnsTable).overridingSystemValue().values([\n\t\t{ alwaysAsIdentity: 2 },\n\t]);\n\n\t// @ts-expect-error\n\tdb.insert(identityColumnsTable).values([\n\t\t{ generatedCol: 2 },\n\t]);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/no-strict-null-checks/test.ts",
    "content": "import { drizzle } from '~/node-postgres';\nimport { integer, pgTable, text } from '~/pg-core';\n\nexport const test = pgTable(\n\t'test',\n\t{\n\t\tid: text('id')\n\t\t\t.primaryKey()\n\t\t\t.generatedAlwaysAs('genstr'),\n\t\tintId: integer('int_id')\n\t\t\t.primaryKey()\n\t\t\t.generatedAlwaysAsIdentity(),\n\t\tint2Id: integer('int2_id').generatedByDefaultAsIdentity(),\n\t\tname: text('name').$defaultFn(() => '' as string),\n\t\ttitle: text('title').notNull(),\n\t\tdescription: text('description'),\n\t\tdbdef: text('dbdef').default('dbdefval'),\n\t},\n);\n\nconst db = drizzle.mock();\n\ndb.update(test)\n\t.set({\n\t\t// @ts-expect-error\n\t\tid: '1',\n\t\tname: 'name',\n\t\ttitle: 'title',\n\t\tdescription: 'desc',\n\t\tdbdef: 'upddef',\n\t});\n\ndb.update(test)\n\t.set({\n\t\t// @ts-expect-error\n\t\tintId: 1,\n\t\tname: 'name',\n\t\ttitle: 'title',\n\t\tdescription: 'desc',\n\t\tdbdef: 'upddef',\n\t});\n\ndb.update(test)\n\t.set({\n\t\tint2Id: 1,\n\t\tname: 'name',\n\t\ttitle: 'title',\n\t\tdescription: 'desc',\n\t\tdbdef: 'upddef',\n\t});\n\ndb.update(test)\n\t.set({\n\t\tname: 'name',\n\t\ttitle: 'title',\n\t\tdescription: 'desc',\n\t\tdbdef: 'upddef',\n\t});\n\ndb.insert(test).values({\n\t// @ts-expect-error\n\tid: '1',\n\tname: 'name',\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\t// @ts-expect-error\n\tintId: 1,\n\tname: 'name',\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\tint2Id: 1,\n\tname: 'name',\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\tname: 'name',\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n\tdescription: 'desc',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n});\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/no-strict-null-checks/tsconfig.json",
    "content": "{\n\t\"extends\": \"../../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"noEmit\": true,\n\t\t\"strictNullChecks\": false,\n\t\t\"strictPropertyInitialization\": false,\n\t\t\"exactOptionalPropertyTypes\": false\n\t},\n\t\"include\": [\"./test.ts\"]\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/other.ts",
    "content": "import type { QueryResult } from 'pg';\nimport { eq, inArray } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\n\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { db } from './db.ts';\nimport { users } from './tables.ts';\n\nconst rawQuery = await db.execute(\n\tsql`select ${users.id}, ${users.class} from ${users} where ${inArray(users.id, [1, 2, 3])} and ${\n\t\teq(users.class, 'A')\n\t}`,\n);\n\nExpect<Equal<QueryResult<Record<string, unknown>>, typeof rawQuery>>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/select.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\n\nimport { alias } from '~/pg-core/alias.ts';\nimport {\n\tboolean,\n\tinteger,\n\tpgMaterializedView,\n\ttype PgSelect,\n\ttype PgSelectQueryBuilder,\n\tpgTable,\n\tpgView,\n\tQueryBuilder,\n\ttext,\n} from '~/pg-core/index.ts';\nimport {\n\tand,\n\tarrayContained,\n\tarrayContains,\n\tarrayOverlaps,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from '~/sql/expressions/index.ts';\nimport { type InferSelectViewModel, type SQL, sql } from '~/sql/sql.ts';\n\nimport { db } from './db.ts';\nimport { cities, classes, newYorkers, newYorkers2, users } from './tables.ts';\n\nconst city = alias(cities, 'city');\nconst city1 = alias(cities, 'city1');\n\nconst leftJoinFull = await db.select().from(users).leftJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof cities.$inferSelect | null;\n\t\t}[],\n\t\ttypeof leftJoinFull\n\t>\n>;\n\nconst rightJoinFull = await db.select().from(users).rightJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect | null;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof rightJoinFull\n\t>\n>;\n\nconst innerJoinFull = await db.select().from(users).innerJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof innerJoinFull\n\t>\n>;\n\nconst fullJoinFull = await db.select().from(users).fullJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect | null;\n\t\t\tcity: typeof city.$inferSelect | null;\n\t\t}[],\n\t\ttypeof fullJoinFull\n\t>\n>;\n\nconst crossJoinFull = await db.select().from(users).crossJoin(city);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof crossJoinFull\n\t>\n>;\n\nconst leftJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.leftJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserText: string | null;\n\t\tcityId: number | null;\n\t\tcityName: string | null;\n\t}[], typeof leftJoinFlat>\n>;\n\nconst rightJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.rightJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number | null;\n\t\tuserText: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof rightJoinFlat>\n>;\n\nconst innerJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.innerJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserText: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof innerJoinFlat>\n>;\n\nconst fullJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.fullJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number | null;\n\t\tuserText: string | null;\n\t\tcityId: number | null;\n\t\tcityName: string | null;\n\t}[], typeof fullJoinFlat>\n>;\n\nconst crossJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.crossJoin(city);\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserText: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof crossJoinFlat>\n>;\n\nconst leftJoinMixed = await db\n\t.select({\n\t\tid: users.id,\n\t\ttext: users.text,\n\t\ttextUpper: sql<string | null>`upper(${users.text})`,\n\t\tidComplex: sql<string | null>`${users.id}::text || ${city.id}::text`,\n\t\tcity: {\n\t\t\tid: city.id,\n\t\t\tname: city.name,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\ttext: string | null;\n\t\t\ttextUpper: string | null;\n\t\t\tidComplex: string | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[],\n\t\ttypeof leftJoinMixed\n\t>\n>;\n\nconst leftJoinMixed2 = await db\n\t.select({\n\t\tid: users.id,\n\t\ttext: users.text,\n\t\tfoo: {\n\t\t\tbar: users.uuid,\n\t\t\tbaz: cities.id,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(cities, eq(users.id, cities.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\ttext: string | null;\n\t\t\tfoo: {\n\t\t\t\tbar: string;\n\t\t\t\tbaz: number | null;\n\t\t\t};\n\t\t}[],\n\t\ttypeof leftJoinMixed2\n\t>\n>;\n\nconst join1 = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t\ttext: users.text,\n\t\t},\n\t\tcity: {\n\t\t\tid: city.id,\n\t\t\tname: city.name,\n\t\t\tnameUpper: sql<string>`upper(${city.name})`,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuser: {\n\t\t\tid: number;\n\t\t\ttext: string | null;\n\t\t};\n\t\tcity: {\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tnameUpper: string;\n\t\t} | null;\n\t}[], typeof join1>\n>;\n\nconst join = await db\n\t.select({\n\t\tusers,\n\t\tcities,\n\t\tcity,\n\t\tcity1: {\n\t\t\tid: city1.id,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(cities, eq(users.id, cities.id))\n\t.rightJoin(city, eq(city.id, users.id))\n\t.rightJoin(city1, eq(city1.id, users.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers: {\n\t\t\t\tid: number;\n\t\t\t\tuuid: string;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t\tarrayCol: string[];\n\t\t\t} | null;\n\t\t\tcities: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tcity1: {\n\t\t\t\tid: number;\n\t\t\t};\n\t\t}[],\n\t\ttypeof join\n\t>\n>;\n\nconst join2 = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t})\n\t.from(users)\n\t.fullJoin(cities, eq(users.id, cities.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t} | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t} | null;\n\t\t}[],\n\t\ttypeof join2\n\t>\n>;\n\nconst join3 = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\tclass: {\n\t\t\tid: classes.id,\n\t\t},\n\t})\n\t.from(users)\n\t.fullJoin(cities, eq(users.id, cities.id))\n\t.rightJoin(classes, eq(users.id, classes.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t} | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t} | null;\n\t\t\tclass: {\n\t\t\t\tid: number;\n\t\t\t};\n\t\t}[],\n\t\ttypeof join3\n\t>\n>;\n\ndb.select()\n\t.from(users)\n\t.where(exists(db.select().from(cities).where(eq(users.homeCity, cities.id))));\n\nfunction mapFunkyFuncResult(valueFromDriver: unknown) {\n\treturn {\n\t\tfoo: (valueFromDriver as Record<string, any>)['foo'],\n\t};\n}\n\nconst age = 1;\n\nconst allOperators = await db\n\t.select({\n\t\tcol2: sql`5 - ${users.id} + 1`, // unknown\n\t\tcol3: sql<number>`${users.id} + 1`, // number\n\t\tcol33: sql`${users.id} + 1`.mapWith(users.id), // number\n\t\tcol34: sql`${users.id} + 1`.mapWith(mapFunkyFuncResult), // number\n\t\tcol4: sql<string | number>`one_or_another(${users.id}, ${users.class})`, // string | number\n\t\tcol5: sql`true`, // unknown\n\t\tcol6: sql<boolean>`true`, // boolean\n\t\tcol7: sql<number>`random()`, // number\n\t\tcol8: sql`some_funky_func(${users.id})`.mapWith(mapFunkyFuncResult), // { foo: string }\n\t\tcol9: sql`greatest(${users.createdAt}, ${sql.param(new Date(), users.createdAt)})`, // unknown\n\t\tcol10: sql<Date | boolean>`date_or_false(${users.createdAt}, ${\n\t\t\tsql.param(\n\t\t\t\tnew Date(),\n\t\t\t\tusers.createdAt,\n\t\t\t)\n\t\t})`, // Date | boolean\n\t\tcol11: sql`${users.age1} + ${age}`, // unknown\n\t\tcol12: sql`${users.age1} + ${sql.param(age, users.age1)}`, // unknown\n\t\tcol13: sql`lower(${users.class})`, // unknown\n\t\tcol14: sql<number>`length(${users.class})`, // number\n\t\tcount: sql<number>`count(*)::int`, // number\n\t})\n\t.from(users)\n\t.where(\n\t\tand(\n\t\t\teq(users.id, 1),\n\t\t\tne(users.id, 1),\n\t\t\tor(eq(users.id, 1), ne(users.id, 1)),\n\t\t\tnot(eq(users.id, 1)),\n\t\t\tgt(users.id, 1),\n\t\t\tgte(users.id, 1),\n\t\t\tlt(users.id, 1),\n\t\t\tlte(users.id, 1),\n\t\t\tinArray(users.id, [1, 2, 3]),\n\t\t\tinArray(users.id, db.select({ id: users.id }).from(users)),\n\t\t\tinArray(users.id, sql`select id from ${users}`),\n\t\t\tnotInArray(users.id, [1, 2, 3]),\n\t\t\tnotInArray(users.id, db.select({ id: users.id }).from(users)),\n\t\t\tnotInArray(users.id, sql`select id from ${users}`),\n\t\t\tisNull(users.subClass),\n\t\t\tisNotNull(users.id),\n\t\t\texists(db.select({ id: users.id }).from(users)),\n\t\t\texists(sql`select id from ${users}`),\n\t\t\tnotExists(db.select({ id: users.id }).from(users)),\n\t\t\tnotExists(sql`select id from ${users}`),\n\t\t\tbetween(users.id, 1, 2),\n\t\t\tnotBetween(users.id, 1, 2),\n\t\t\tlike(users.id, '%1%'),\n\t\t\tnotLike(users.id, '%1%'),\n\t\t\tilike(users.id, '%1%'),\n\t\t\tnotIlike(users.id, '%1%'),\n\t\t\tarrayContains(users.arrayCol, ['abc']),\n\t\t\tarrayContains(users.arrayCol, db.select({ arrayCol: users.arrayCol }).from(users)),\n\t\t\tarrayContains(users.arrayCol, sql`select array_col from ${users}`),\n\t\t\tarrayContained(users.arrayCol, ['abc']),\n\t\t\tarrayContained(users.arrayCol, db.select({ arrayCol: users.arrayCol }).from(users)),\n\t\t\tarrayContained(users.arrayCol, sql`select array_col from ${users}`),\n\t\t\tarrayOverlaps(users.arrayCol, ['abc']),\n\t\t\tarrayOverlaps(users.arrayCol, db.select({ arrayCol: users.arrayCol }).from(users)),\n\t\t\tarrayOverlaps(users.arrayCol, sql`select array_col from ${users}`),\n\t\t),\n\t);\n\nExpect<\n\tEqual<{\n\t\tcol2: unknown;\n\t\tcol3: number;\n\t\tcol33: number;\n\t\tcol34: { foo: any };\n\t\tcol4: string | number;\n\t\tcol5: unknown;\n\t\tcol6: boolean;\n\t\tcol7: number;\n\t\tcol8: {\n\t\t\tfoo: any;\n\t\t};\n\t\tcol9: unknown;\n\t\tcol10: boolean | Date;\n\t\tcol11: unknown;\n\t\tcol12: unknown;\n\t\tcol13: unknown;\n\t\tcol14: number;\n\t\tcount: number;\n\t}[], typeof allOperators>\n>;\n\nconst textSelect = await db\n\t.select({\n\t\tt: users.text,\n\t})\n\t.from(users);\n\nExpect<Equal<{ t: string | null }[], typeof textSelect>>;\n\nconst homeCity = alias(cities, 'homeCity');\nconst c = alias(classes, 'c');\nconst otherClass = alias(classes, 'otherClass');\nconst anotherClass = alias(classes, 'anotherClass');\nconst friend = alias(users, 'friend');\nconst currentCity = alias(cities, 'currentCity');\nconst subscriber = alias(users, 'subscriber');\nconst closestCity = alias(cities, 'closestCity');\nconst closestCity2 = alias(cities, 'closestCity2');\nconst closestCity3 = alias(cities, 'closestCity3');\nconst closestCity4 = alias(cities, 'closestCity4');\nconst closestCity5 = alias(cities, 'closestCity5');\nconst closestCity6 = alias(cities, 'closestCity6');\nconst closestCity7 = alias(cities, 'closestCity7');\n\nconst megaJoin = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t\tmaxAge: sql`max(${users.age1})`,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\thomeCity,\n\t\tc,\n\t\totherClass,\n\t\tanotherClass,\n\t\tfriend,\n\t\tcurrentCity,\n\t\tsubscriber,\n\t\tclosestCity,\n\t})\n\t.from(users)\n\t.innerJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.innerJoin(homeCity, sql`${users.homeCity} = ${homeCity.id}`)\n\t.innerJoin(c, eq(c.id, users.class))\n\t.innerJoin(otherClass, sql`${c.id} = ${otherClass.id}`)\n\t.innerJoin(anotherClass, sql`${users.class} = ${anotherClass.id}`)\n\t.innerJoin(friend, sql`${users.id} = ${friend.id}`)\n\t.innerJoin(currentCity, sql`${homeCity.id} = ${currentCity.id}`)\n\t.innerJoin(subscriber, sql`${users.class} = ${subscriber.id}`)\n\t.innerJoin(closestCity, sql`${users.currentCity} = ${closestCity.id}`)\n\t.where(and(sql`${users.age1} > 0`, eq(cities.id, 1)))\n\t.limit(1)\n\t.offset(1);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tmaxAge: unknown;\n\t\t\t};\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t};\n\t\t\thomeCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t\tc: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t};\n\t\t\totherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t};\n\t\t\tanotherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t};\n\t\t\tfriend: {\n\t\t\t\tid: number;\n\t\t\t\tuuid: string;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t\tarrayCol: string[];\n\t\t\t};\n\t\t\tcurrentCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t\tsubscriber: {\n\t\t\t\tid: number;\n\t\t\t\tuuid: string;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t\tarrayCol: string[];\n\t\t\t};\n\t\t\tclosestCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t}[],\n\t\ttypeof megaJoin\n\t>\n>;\n\nconst megaLeftJoin = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t\tmaxAge: sql`max(${users.age1})`,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\thomeCity,\n\t\tc,\n\t\totherClass,\n\t\tanotherClass,\n\t\tfriend,\n\t\tcurrentCity,\n\t\tsubscriber,\n\t\tclosestCity,\n\t\tclosestCity2,\n\t\tclosestCity3,\n\t\tclosestCity4,\n\t\tclosestCity5,\n\t\tclosestCity6,\n\t\tclosestCity7,\n\t})\n\t.from(users)\n\t.leftJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.leftJoin(homeCity, sql`${users.homeCity} = ${homeCity.id}`)\n\t.leftJoin(c, eq(c.id, users.class))\n\t.leftJoin(otherClass, sql`${c.id} = ${otherClass.id}`)\n\t.leftJoin(anotherClass, sql`${users.class} = ${anotherClass.id}`)\n\t.leftJoin(friend, sql`${users.id} = ${friend.id}`)\n\t.leftJoin(currentCity, sql`${homeCity.id} = ${currentCity.id}`)\n\t.leftJoin(subscriber, sql`${users.class} = ${subscriber.id}`)\n\t.leftJoin(closestCity, sql`${users.currentCity} = ${closestCity.id}`)\n\t.leftJoin(closestCity2, sql`${users.currentCity} = ${closestCity.id}`)\n\t.leftJoin(closestCity3, sql`${users.currentCity} = ${closestCity.id}`)\n\t.leftJoin(closestCity4, sql`${users.currentCity} = ${closestCity.id}`)\n\t.leftJoin(closestCity5, sql`${users.currentCity} = ${closestCity.id}`)\n\t.leftJoin(closestCity6, sql`${users.currentCity} = ${closestCity.id}`)\n\t.leftJoin(closestCity7, sql`${users.currentCity} = ${closestCity.id}`)\n\t.where(and(sql`${users.age1} > 0`, eq(cities.id, 1)))\n\t.limit(1)\n\t.offset(1);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tmaxAge: unknown;\n\t\t\t};\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t} | null;\n\t\t\thomeCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tc: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t} | null;\n\t\t\totherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t} | null;\n\t\t\tanotherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t} | null;\n\t\t\tfriend: {\n\t\t\t\tid: number;\n\t\t\t\tuuid: string;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t\tarrayCol: string[];\n\t\t\t} | null;\n\t\t\tcurrentCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tsubscriber: {\n\t\t\t\tid: number;\n\t\t\t\tuuid: string;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t\tarrayCol: string[];\n\t\t\t} | null;\n\t\t\tclosestCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tclosestCity2: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tclosestCity3: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tclosestCity4: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tclosestCity5: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tclosestCity6: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tclosestCity7: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t}[],\n\t\ttypeof megaLeftJoin\n\t>\n>;\n\nawait db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t\tmaxAge: sql`max(${users.age1})`,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\thomeCity,\n\t\tc,\n\t\totherClass,\n\t\tanotherClass,\n\t\tfriend,\n\t\tcurrentCity,\n\t\tsubscriber,\n\t\tclosestCity,\n\t\tclosestCity2,\n\t\tclosestCity3,\n\t\tclosestCity4,\n\t\tclosestCity5,\n\t\tclosestCity6,\n\t\tclosestCity7,\n\t})\n\t.from(users)\n\t.fullJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.fullJoin(homeCity, sql`${users.homeCity} = ${homeCity.id}`)\n\t.fullJoin(c, eq(c.id, users.class))\n\t.fullJoin(otherClass, sql`${c.id} = ${otherClass.id}`)\n\t.fullJoin(anotherClass, sql`${users.class} = ${anotherClass.id}`)\n\t.fullJoin(friend, sql`${users.id} = ${friend.id}`)\n\t.fullJoin(currentCity, sql`${homeCity.id} = ${currentCity.id}`)\n\t.fullJoin(subscriber, sql`${users.class} = ${subscriber.id}`)\n\t.fullJoin(closestCity, sql`${users.currentCity} = ${closestCity.id}`)\n\t.fullJoin(closestCity2, sql`${users.currentCity} = ${closestCity.id}`)\n\t.fullJoin(closestCity3, sql`${users.currentCity} = ${closestCity.id}`)\n\t.fullJoin(closestCity4, sql`${users.currentCity} = ${closestCity.id}`)\n\t.fullJoin(closestCity5, sql`${users.currentCity} = ${closestCity.id}`)\n\t.fullJoin(closestCity6, sql`${users.currentCity} = ${closestCity.id}`)\n\t.fullJoin(closestCity7, sql`${users.currentCity} = ${closestCity.id}`)\n\t.where(and(sql`${users.age1} > 0`, eq(cities.id, 1)))\n\t.limit(1)\n\t.offset(1);\n\nconst friends = alias(users, 'friends');\n\nconst join4 = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\tclass: classes,\n\t\tfriend: friends,\n\t})\n\t.from(users)\n\t.innerJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.innerJoin(classes, sql`${cities.id} = ${classes.id}`)\n\t.innerJoin(friends, sql`${friends.id} = ${users.id}`)\n\t.where(sql`${users.age1} > 0`);\n\nExpect<\n\tEqual<{\n\t\tuser: {\n\t\t\tid: number;\n\t\t};\n\t\tcity: {\n\t\t\tid: number;\n\t\t};\n\t\tclass: {\n\t\t\tid: number;\n\t\t\tclass: 'A' | 'C' | null;\n\t\t\tsubClass: 'B' | 'D';\n\t\t};\n\t\tfriend: {\n\t\t\tid: number;\n\t\t\tuuid: string;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\ttext: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\tarrayCol: string[];\n\t\t};\n\t}[], typeof join4>\n>;\n\n{\n\tconst authenticated = false as boolean;\n\n\tconst result = await db\n\t\t.select({\n\t\t\tid: users.id,\n\t\t\t...(authenticated ? { city: users.homeCity } : {}),\n\t\t})\n\t\t.from(users);\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tcity?: number;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\nawait db\n\t.select()\n\t.from(users)\n\t.for('update');\n\nawait db\n\t.select()\n\t.from(users)\n\t.for('no key update', { of: users });\n\nawait db\n\t.select()\n\t.from(users)\n\t.for('no key update', { of: users, skipLocked: true });\n\nawait db\n\t.select()\n\t.from(users)\n\t.for('share', { of: users, noWait: true });\n\nawait db\n\t.select()\n\t.from(users)\n\t// @ts-expect-error - can't use both skipLocked and noWait\n\t.for('share', { of: users, noWait: true, skipLocked: true });\n\nawait db\n\t.select({\n\t\tid: cities.id,\n\t\tname: sql<string>`upper(${cities.name})`.as('name'),\n\t\tusersCount: sql<number>`count(${users.id})`.as('users'),\n\t})\n\t.from(cities)\n\t.leftJoin(users, eq(users.homeCity, cities.id))\n\t.where(({ name }) => sql`length(${name}) >= 3`)\n\t.groupBy(cities.id)\n\t.having(({ usersCount }) => sql`${usersCount} > 0`);\n\n{\n\tconst result = await db.select().from(newYorkers);\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tuserId: number;\n\t\t\t\tcityId: number | null;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\n{\n\tconst result = await db.select({ userId: newYorkers.userId }).from(newYorkers);\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tuserId: number;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\n{\n\tconst result = await db.select().from(newYorkers2);\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tuserId: number;\n\t\t\t\tcityId: number | null;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\n{\n\tconst result = await db.select({ userId: newYorkers.userId }).from(newYorkers2);\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tuserId: number;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\n{\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1));\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1))\n\t\t// @ts-expect-error - can't use where twice\n\t\t.where(eq(users.id, 1));\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1))\n\t\t.limit(10)\n\t\t// @ts-expect-error - can't use where twice\n\t\t.where(eq(users.id, 1));\n}\n\n{\n\tfunction withFriends<T extends PgSelect>(qb: T) {\n\t\tconst friends = alias(users, 'friends');\n\t\tconst friends2 = alias(users, 'friends2');\n\t\tconst friends3 = alias(users, 'friends3');\n\t\tconst friends4 = alias(users, 'friends4');\n\t\tconst friends5 = alias(users, 'friends5');\n\t\treturn qb\n\t\t\t.leftJoin(friends, sql`true`)\n\t\t\t.leftJoin(friends2, sql`true`)\n\t\t\t.leftJoin(friends3, sql`true`)\n\t\t\t.leftJoin(friends4, sql`true`)\n\t\t\t.leftJoin(friends5, sql`true`);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await withFriends(qb);\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tfriends: typeof users.$inferSelect | null;\n\t\t\tfriends2: typeof users.$inferSelect | null;\n\t\t\tfriends3: typeof users.$inferSelect | null;\n\t\t\tfriends4: typeof users.$inferSelect | null;\n\t\t\tfriends5: typeof users.$inferSelect | null;\n\t\t}[]>\n\t>;\n}\n\n{\n\tfunction withFriends<T extends PgSelectQueryBuilder>(qb: T) {\n\t\tconst friends = alias(users, 'friends');\n\t\tconst friends2 = alias(users, 'friends2');\n\t\tconst friends3 = alias(users, 'friends3');\n\t\tconst friends4 = alias(users, 'friends4');\n\t\tconst friends5 = alias(users, 'friends5');\n\t\treturn qb\n\t\t\t.leftJoin(friends, sql`true`)\n\t\t\t.leftJoin(friends2, sql`true`)\n\t\t\t.leftJoin(friends3, sql`true`)\n\t\t\t.leftJoin(friends4, sql`true`)\n\t\t\t.leftJoin(friends5, sql`true`);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await withFriends(qb);\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tfriends: typeof users.$inferSelect | null;\n\t\t\tfriends2: typeof users.$inferSelect | null;\n\t\t\tfriends3: typeof users.$inferSelect | null;\n\t\t\tfriends4: typeof users.$inferSelect | null;\n\t\t\tfriends5: typeof users.$inferSelect | null;\n\t\t}[]>\n\t>;\n}\n\n{\n\tfunction dynamic<T extends PgSelect>(qb: T) {\n\t\treturn qb.where(sql``).having(sql``).groupBy(sql``).orderBy(sql``).limit(1).offset(1).for('update');\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await dynamic(qb);\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\n{\n\t// TODO: add to docs\n\tfunction dynamic<T extends PgSelectQueryBuilder>(qb: T) {\n\t\treturn qb.where(sql``).having(sql``).groupBy(sql``).orderBy(sql``).limit(1).offset(1).for('update');\n\t}\n\n\tconst query = new QueryBuilder().select().from(users).$dynamic();\n\tdynamic(query);\n}\n\n{\n\t// TODO: add to docs\n\tfunction paginated<T extends PgSelect>(qb: T, page: number) {\n\t\treturn qb.limit(10).offset((page - 1) * 10);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await paginated(qb, 1);\n\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\n{\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.having(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.having(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.groupBy(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.groupBy(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.orderBy(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.orderBy(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.limit(10)\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.limit(10);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.offset(10)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.offset(10);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.for('update')\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.for('update');\n}\n\n{\n\tconst users = pgTable('users', {\n\t\tdeveloper: boolean('developer'),\n\t\tapplication: text('application', { enum: ['pending', 'approved'] }),\n\t});\n\n\tconst startIt = (whereCallback: (condition: SQL) => SQL | undefined = (c) => c) => {\n\t\treturn db.select().from(users).where(whereCallback(eq(users.developer, true)));\n\t};\n\n\tstartIt((c) => and(c, eq(users.application, 'approved')));\n}\n\n{\n\tconst school = pgTable('school', {\n\t\tfaculty: integer('faculty'),\n\t\tstudentid: integer('studentid'),\n\t});\n\n\tconst student = pgTable('student', {\n\t\tid: integer('id'),\n\t\temail: text('email'),\n\t});\n\n\tawait db\n\t\t.select()\n\t\t.from(school)\n\t\t.where(\n\t\t\tand(\n\t\t\t\teq(school.faculty, 2),\n\t\t\t\teq(\n\t\t\t\t\tschool.studentid,\n\t\t\t\t\tdb.select({ id: student.id }).from(student).where(eq(student.email, 'foo@demo.com')),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n}\n\n{\n\tconst table1 = pgTable('table1', {\n\t\tid: integer().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst table2 = pgTable('table2', {\n\t\tid: integer().primaryKey(),\n\t\tage: integer().notNull(),\n\t});\n\tconst table3 = pgTable('table3', {\n\t\tid: integer().primaryKey(),\n\t\tphone: text().notNull(),\n\t});\n\tconst view = pgView('view').as((qb) =>\n\t\tqb.select({\n\t\t\ttable: table1,\n\t\t\tcolumn: table2.age,\n\t\t\tnested: {\n\t\t\t\tcolumn: table3.phone,\n\t\t\t},\n\t\t}).from(table1).innerJoin(table2, sql``).leftJoin(table3, sql``)\n\t);\n\tconst result = await db.select().from(view);\n\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\ttable: typeof table1.$inferSelect;\n\t\t\tcolumn: number;\n\t\t\tnested: {\n\t\t\t\tcolumn: string | null;\n\t\t\t};\n\t\t}[]>\n\t>;\n\tExpect<Equal<typeof result, typeof view.$inferSelect[]>>;\n\tExpect<Equal<typeof result, InferSelectViewModel<typeof view>[]>>;\n}\n\n{\n\tconst table1 = pgTable('table1', {\n\t\tid: integer().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst table2 = pgTable('table2', {\n\t\tid: integer().primaryKey(),\n\t\tage: integer().notNull(),\n\t});\n\tconst table3 = pgTable('table3', {\n\t\tid: integer().primaryKey(),\n\t\tphone: text().notNull(),\n\t});\n\tconst view = pgMaterializedView('view').as((qb) =>\n\t\tqb.select({\n\t\t\ttable: table1,\n\t\t\tcolumn: table2.age,\n\t\t\tnested: {\n\t\t\t\tcolumn: table3.phone,\n\t\t\t},\n\t\t}).from(table1).innerJoin(table2, sql``).leftJoin(table3, sql``)\n\t);\n\tconst result = await db.select().from(view);\n\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\ttable: typeof table1.$inferSelect;\n\t\t\tcolumn: number;\n\t\t\tnested: {\n\t\t\t\tcolumn: string | null;\n\t\t\t};\n\t\t}[]>\n\t>;\n\tExpect<Equal<typeof result, typeof view.$inferSelect[]>>;\n\tExpect<Equal<typeof result, InferSelectViewModel<typeof view>[]>>;\n}\n\n{\n\tconst table1 = pgTable('table1', {\n\t\tid: integer().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst table2 = pgTable('table2', {\n\t\tid: integer().primaryKey(),\n\t\tage: integer().notNull(),\n\t\ttable1Id: integer().references(() => table1.id).notNull(),\n\t});\n\n\tconst view = pgView('view').as((qb) => qb.select().from(table2));\n\n\tconst leftLateralRawRes = await db.select({\n\t\ttable1,\n\t\tsqId: sql<number | null>`${sql.identifier('t2')}.${sql.identifier('id')}`.as('sqId'),\n\t}).from(table1).leftJoinLateral(sql`(SELECT * FROM ${table2}) as ${sql.identifier('t2')}`, sql`true`);\n\n\tExpect<\n\t\tEqual<typeof leftLateralRawRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsqId: number | null;\n\t\t}[]>\n\t>;\n\n\tconst leftLateralSubRes = await db.select().from(table1).leftJoinLateral(\n\t\tdb.select().from(table2).as('sub'),\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof leftLateralSubRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsub: {\n\t\t\t\tid: number;\n\t\t\t\tage: number;\n\t\t\t\ttable1Id: number;\n\t\t\t} | null;\n\t\t}[]>\n\t>;\n\n\tconst sqLeftLateral = db.select().from(table2).as('sub');\n\n\tconst leftLateralSubSelectionRes = await db.select(\n\t\t{\n\t\t\tid: table1.id,\n\t\t\tsId: sqLeftLateral.id,\n\t\t},\n\t).from(table1).leftJoinLateral(\n\t\tsqLeftLateral,\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof leftLateralSubSelectionRes, {\n\t\t\tid: number;\n\t\t\tsId: number | null;\n\t\t}[]>\n\t>;\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.leftJoinLateral(table2, sql`true`);\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.leftJoinLateral(view, sql`true`);\n\n\tconst innerLateralRawRes = await db.select({\n\t\ttable1,\n\t\tsqId: sql<number>`${sql.identifier('t2')}.${sql.identifier('id')}`.as('sqId'),\n\t}).from(table1).innerJoinLateral(sql`(SELECT * FROM ${table2}) as ${sql.identifier('t2')}`, sql`true`);\n\n\tExpect<\n\t\tEqual<typeof innerLateralRawRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsqId: number;\n\t\t}[]>\n\t>;\n\n\tconst innerLateralSubRes = await db.select().from(table1).innerJoinLateral(\n\t\tdb.select().from(table2).as('sub'),\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof innerLateralSubRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsub: {\n\t\t\t\tid: number;\n\t\t\t\tage: number;\n\t\t\t\ttable1Id: number;\n\t\t\t};\n\t\t}[]>\n\t>;\n\n\tconst sqInnerLateral = db.select().from(table2).as('sub');\n\n\tconst innerLateralSubSelectionRes = await db.select(\n\t\t{\n\t\t\tid: table1.id,\n\t\t\tsId: sqLeftLateral.id,\n\t\t},\n\t).from(table1).innerJoinLateral(\n\t\tsqInnerLateral,\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof innerLateralSubSelectionRes, {\n\t\t\tid: number;\n\t\t\tsId: number;\n\t\t}[]>\n\t>;\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.innerJoinLateral(table2, sql`true`);\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.innerJoinLateral(view, sql`true`);\n\n\tconst crossLateralRawRes = await db.select({\n\t\ttable1,\n\t\tsqId: sql<number>`${sql.identifier('t2')}.${sql.identifier('id')}`.as('sqId'),\n\t}).from(table1).crossJoinLateral(sql`(SELECT * FROM ${table2}) as ${sql.identifier('t2')}`);\n\n\tExpect<\n\t\tEqual<typeof crossLateralRawRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsqId: number;\n\t\t}[]>\n\t>;\n\n\tconst crossLateralSubRes = await db.select().from(table1).crossJoinLateral(\n\t\tdb.select().from(table2).as('sub'),\n\t);\n\n\tExpect<\n\t\tEqual<typeof crossLateralSubRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsub: {\n\t\t\t\tid: number;\n\t\t\t\tage: number;\n\t\t\t\ttable1Id: number;\n\t\t\t};\n\t\t}[]>\n\t>;\n\n\tconst sqCrossLateral = db.select().from(table2).as('sub');\n\n\tconst crossLateralSubSelectionRes = await db.select(\n\t\t{\n\t\t\tid: table1.id,\n\t\t\tsId: sqCrossLateral.id,\n\t\t},\n\t).from(table1).crossJoinLateral(\n\t\tsqInnerLateral,\n\t);\n\n\tExpect<\n\t\tEqual<typeof crossLateralSubSelectionRes, {\n\t\t\tid: number;\n\t\t\tsId: number;\n\t\t}[]>\n\t>;\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.crossJoinLateral(table2);\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.crossJoinLateral(view);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/set-operators.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils.ts';\nimport { except, exceptAll, intersect, intersectAll, type PgSetOperator, union, unionAll } from '~/pg-core/index.ts';\nimport { eq } from '~/sql/expressions/index.ts';\nimport { desc, sql } from '~/sql/index.ts';\nimport { db } from './db.ts';\nimport { cities, classes, newYorkers, users } from './tables.ts';\n\nconst unionTest = await db\n\t.select({ id: users.id })\n\t.from(users)\n\t.union(\n\t\tdb\n\t\t\t.select({ id: users.id })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number }[], typeof unionTest>>;\n\nconst unionAllTest = await db\n\t.select({ id: users.id, age: users.age1 })\n\t.from(users)\n\t.unionAll(\n\t\tdb.select({ id: users.id, age: users.age1 })\n\t\t\t.from(users)\n\t\t\t.leftJoin(cities, eq(users.id, cities.id)),\n\t);\n\nExpect<Equal<{ id: number; age: number }[], typeof unionAllTest>>;\n\nconst intersectTest = await db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t.intersect(({ intersect }) =>\n\t\tintersect(\n\t\t\tdb\n\t\t\t\t.select({ id: users.id, homeCity: users.homeCity })\n\t\t\t\t.from(users),\n\t\t\tdb\n\t\t\t\t.select({ id: users.id, homeCity: sql`${users.homeCity}`.mapWith(Number) })\n\t\t\t\t.from(users),\n\t\t)\n\t);\n\nExpect<Equal<{ id: number; homeCity: number }[], typeof intersectTest>>;\n\nconst intersectAllTest = await db\n\t.select({ id: users.id, homeCity: users.class })\n\t.from(users)\n\t.intersect(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: users.class })\n\t\t\t.from(users)\n\t\t\t.leftJoin(cities, eq(users.id, cities.id)),\n\t);\n\nExpect<Equal<{ id: number; homeCity: 'A' | 'C' }[], typeof intersectAllTest>>;\n\nconst exceptTest = await db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t.except(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: sql`${users.homeCity}`.mapWith(Number) })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number; homeCity: number }[], typeof exceptTest>>;\n\nconst exceptAllTest = await db\n\t.select({ id: users.id, homeCity: users.class })\n\t.from(users)\n\t.except(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: sql<'A' | 'C'>`${users.class}` })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number; homeCity: 'A' | 'C' }[], typeof exceptAllTest>>;\n\nconst union2Test = await union(db.select().from(cities), db.select().from(cities), db.select().from(cities));\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof union2Test>>;\n\nconst unionAll2Test = await unionAll(\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select().from(cities),\n);\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof unionAll2Test>>;\n\nconst intersect2Test = await intersect(\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n);\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof intersect2Test>>;\n\nconst intersectAll2Test = await intersectAll(\n\tunion(\n\t\tdb.select({\n\t\t\tid: cities.id,\n\t\t}).from(cities),\n\t\tdb.select({\n\t\t\tid: cities.id,\n\t\t})\n\t\t\t.from(cities).where(sql``),\n\t),\n\tdb.select({\n\t\tid: cities.id,\n\t})\n\t\t.from(cities),\n).orderBy(desc(cities.id)).limit(23);\n\nExpect<Equal<{ id: number }[], typeof intersectAll2Test>>;\n\nconst except2Test = await except(\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t})\n\t\t.from(newYorkers),\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t}).from(newYorkers),\n);\n\nExpect<Equal<{ userId: number }[], typeof except2Test>>;\n\nconst exceptAll2Test = await exceptAll(\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t\tcityId: newYorkers.cityId,\n\t})\n\t\t.from(newYorkers).where(sql``),\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t\tcityId: newYorkers.cityId,\n\t}).from(newYorkers).leftJoin(users, sql``),\n);\n\nExpect<Equal<{ userId: number; cityId: number | null }[], typeof exceptAll2Test>>;\n\nconst unionfull = await union(db.select().from(users), db.select().from(users)).orderBy(sql``).limit(1).offset(2);\n\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\tuuid: string;\n\t\thomeCity: number;\n\t\tcurrentCity: number | null;\n\t\tserialNullable: number;\n\t\tserialNotNull: number;\n\t\tclass: 'A' | 'C';\n\t\tsubClass: 'B' | 'D' | null;\n\t\ttext: string | null;\n\t\tage1: number;\n\t\tcreatedAt: Date;\n\t\tenumCol: 'a' | 'b' | 'c';\n\t\tarrayCol: string[];\n\t}[], typeof unionfull>\n>;\n\nunion(db.select().from(users), db.select().from(users))\n\t.orderBy(sql``)\n\t// @ts-expect-error - method was already called\n\t.orderBy(sql``);\n\nunion(db.select().from(users), db.select().from(users))\n\t.offset(1)\n\t// @ts-expect-error - method was already called\n\t.offset(2);\n\nunion(db.select().from(users), db.select().from(users))\n\t.orderBy(sql``)\n\t// @ts-expect-error - method was already called\n\t.orderBy(sql``);\n\n{\n\tfunction dynamic<T extends PgSetOperator>(qb: T) {\n\t\treturn qb.orderBy(sql``).limit(1).offset(2);\n\t}\n\n\tconst qb = union(db.select().from(users), db.select().from(users)).$dynamic();\n\tconst result = await dynamic(qb);\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\nawait db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\t.intersect(({ intersect }) => intersect(db.select().from(users), db.select().from(users)));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select().from(classes).union(db.select({ id: classes.id }).from(classes));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select({ id: classes.id }).from(classes).union(db.select().from(classes).where(sql``));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select({ id: classes.id }).from(classes).union(db.select().from(classes));\n\nunion(\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select().from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name, population: cities.population }).from(cities),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``).limit(3).$dynamic(),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: newYorkers.userId }).from(newYorkers),\n\tdb.select({ id: cities.id }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities).where(sql``),\n\tdb.select({ id: sql<number>`${cities.id}` }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name, population: cities.population }).from(cities).where(sql``),\n);\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/subquery.ts",
    "content": "import { Expect } from 'type-tests/utils.ts';\nimport { alias, integer, pgTable, serial, text } from '~/pg-core/index.ts';\nimport { and, eq } from '~/sql/expressions/index.ts';\nimport { count } from '~/sql/functions/aggregate.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { DrizzleTypeError, Equal } from '~/utils.ts';\nimport { db } from './db.ts';\n\nconst users = pgTable('names', {\n\tid: serial('id').primaryKey(),\n\tname: text('name'),\n\tmanagerId: integer('author_id'),\n});\n\nconst posts = pgTable('posts', {\n\tid: serial('id').primaryKey(),\n\tauthorId: integer('author_id'),\n\ttitle: text('title'),\n});\n\nconst n1 = db\n\t.select({\n\t\tid: users.id,\n\t\tname: users.name,\n\t\tauthorId: users.managerId,\n\t\tcount1: sql<number>`count(1)::int`.as('count1'),\n\t})\n\t.from(users)\n\t.groupBy(users.id, users.name, users.managerId)\n\t.as('n1');\n\nconst n2 = db\n\t.select({\n\t\tid: users.id,\n\t\tauthorId: users.managerId,\n\t\ttotalCount: sql<number>`count(1)::int`.as('totalCount'),\n\t})\n\t.from(users)\n\t.groupBy(users.id, users.managerId)\n\t.as('n2');\n\nconst result = await db\n\t.select({\n\t\tname: n1.name,\n\t\tauthorId: n1.authorId,\n\t\tcount1: n1.count1,\n\t\ttotalCount: n2.totalCount,\n\t})\n\t.from(n1)\n\t.innerJoin(n2, and(eq(n2.id, n1.id), eq(n2.authorId, n1.authorId)));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t\ttotalCount: number;\n\t\t}[],\n\t\ttypeof result\n\t>\n>;\n\nconst names2 = alias(users, 'names2');\n\nconst sq1 = db\n\t.select({\n\t\tid: users.id,\n\t\tname: users.name,\n\t\tid2: names2.id,\n\t})\n\t.from(users)\n\t.leftJoin(names2, eq(users.name, names2.name))\n\t.as('sq1');\n\nconst res = await db.select().from(sq1);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tid2: number | null;\n\t\t}[],\n\t\ttypeof res\n\t>\n>;\n\n{\n\tconst sq = db.select({ count: sql<number>`count(1)::int` }).from(users).as('sq');\n\tExpect<typeof sq.count extends DrizzleTypeError<any> ? true : false>;\n}\n\nconst sqUnion = db.select().from(users).union(db.select().from(names2)).as('sqUnion');\n\nconst resUnion = await db.select().from(sqUnion);\n\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\tname: string | null;\n\t\tmanagerId: number | null;\n\t}[], typeof resUnion>\n>;\n\nconst fromSubquery = await db.select({\n\tcount: db.select({ count: count().as('c') }).from(posts).where(eq(posts.authorId, users.id)).as('count'),\n}).from(users);\n\nExpect<Equal<typeof fromSubquery, { count: number }[]>>;\n\nconst fromSubquery2 = await db.select({\n\tname: db.select({ name: users.name }).from(users).where(eq(users.id, posts.authorId)).as('name'),\n}).from(posts);\n\nExpect<Equal<typeof fromSubquery2, { name: string | null }[]>>;\n\nconst errorSubquery = await db.select({\n\tname: db.select({ name: users.name, managerId: users.managerId }).from(users).where(eq(users.id, posts.authorId)).as(\n\t\t'name',\n\t),\n}).from(posts);\n\nExpect<Equal<typeof errorSubquery, { name: DrizzleTypeError<'You can only select one column in the subquery'> }[]>>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/tables-rel.ts",
    "content": "import { foreignKey, integer, pgTable, serial, text, timestamp } from '~/pg-core/index.ts';\nimport { relations } from '~/relations.ts';\n\nexport const users = pgTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: integer('city_id').references(() => cities.id).notNull(),\n\thomeCityId: integer('home_city_id').references(() => cities.id),\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull(),\n});\nexport const usersConfig = relations(users, ({ one, many }) => ({\n\tcity: one(cities, { relationName: 'UsersInCity', fields: [users.cityId], references: [cities.id] }),\n\thomeCity: one(cities, { fields: [users.homeCityId], references: [cities.id] }),\n\tposts: many(posts),\n\tcomments: many(comments),\n}));\n\nexport const cities = pgTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\nexport const citiesConfig = relations(cities, ({ many }) => ({\n\tusers: many(users, { relationName: 'UsersInCity' }),\n}));\n\nexport const posts = pgTable('posts', {\n\tid: serial('id').primaryKey(),\n\ttitle: text('title').notNull(),\n\tauthorId: integer('author_id').references(() => users.id),\n});\nexport const postsConfig = relations(posts, ({ one, many }) => ({\n\tauthor: one(users, { fields: [posts.authorId], references: [users.id] }),\n\tcomments: many(comments),\n}));\n\nexport const comments = pgTable('comments', {\n\tid: serial('id').primaryKey(),\n\tpostId: integer('post_id').references(() => posts.id).notNull(),\n\tauthorId: integer('author_id').references(() => users.id),\n\ttext: text('text').notNull(),\n});\nexport const commentsConfig = relations(comments, ({ one }) => ({\n\tpost: one(posts, { fields: [comments.postId], references: [posts.id] }),\n\tauthor: one(users, { fields: [comments.authorId], references: [users.id] }),\n}));\n\nexport const books = pgTable('books', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\nexport const booksConfig = relations(books, ({ many }) => ({\n\tauthors: many(bookAuthors),\n}));\n\nexport const bookAuthors = pgTable('book_authors', {\n\tbookId: integer('book_id').references(() => books.id).notNull(),\n\tauthorId: integer('author_id').references(() => users.id).notNull(),\n\trole: text('role').notNull(),\n});\nexport const bookAuthorsConfig = relations(bookAuthors, ({ one }) => ({\n\tbook: one(books, { fields: [bookAuthors.bookId], references: [books.id] }),\n\tauthor: one(users, { fields: [bookAuthors.authorId], references: [users.id] }),\n}));\n\nexport const node = pgTable('node', {\n\tid: serial('id').primaryKey(),\n\tparentId: integer('parent_id'),\n\tleftId: integer('left_id'),\n\trightId: integer('right_id'),\n}, (node) => ({\n\tfk1: foreignKey({ columns: [node.parentId], foreignColumns: [node.id] }),\n\tfk2: foreignKey({ columns: [node.leftId], foreignColumns: [node.id] }),\n\tfk3: foreignKey({ columns: [node.rightId], foreignColumns: [node.id] }),\n}));\nexport const nodeRelations = relations(node, ({ one }) => ({\n\tparent: one(node, { fields: [node.parentId], references: [node.id] }),\n\tleft: one(node, { fields: [node.leftId], references: [node.id] }),\n\tright: one(node, { fields: [node.rightId], references: [node.id] }),\n}));\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/tables.ts",
    "content": "import crypto from 'node:crypto';\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { z } from 'zod';\nimport {\n\tbigint,\n\tbigserial,\n\tbit,\n\tboolean,\n\tchar,\n\tcheck,\n\tcidr,\n\tcustomType,\n\tdate,\n\tdecimal,\n\tdoublePrecision,\n\tforeignKey,\n\tgeometry,\n\thalfvec,\n\tindex,\n\tinet,\n\tinteger,\n\tjson,\n\tjsonb,\n\tline,\n\tmacaddr,\n\tmacaddr8,\n\tnumeric,\n\ttype PgColumn,\n\tpgEnum,\n\tpgTable,\n\ttype PgTableWithColumns,\n\tpoint,\n\tprimaryKey,\n\treal,\n\tserial,\n\tsmallint,\n\tsmallserial,\n\tsparsevec,\n\ttext,\n\ttime,\n\ttimestamp,\n\tuniqueIndex,\n\tuuid,\n\tvarchar,\n\tvector,\n} from '~/pg-core/index.ts';\nimport { pgSchema } from '~/pg-core/schema.ts';\nimport {\n\tpgMaterializedView,\n\ttype PgMaterializedViewWithSelection,\n\tpgView,\n\ttype PgViewWithSelection,\n} from '~/pg-core/view.ts';\nimport { eq, gt } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { InferInsertModel, InferSelectModel } from '~/table.ts';\nimport type { Simplify } from '~/utils.ts';\nimport { db } from './db.ts';\n\nexport const myEnum = pgEnum('my_enum', ['a', 'b', 'c']);\n\nexport const identityColumnsTable = pgTable('identity_columns_table', {\n\tgeneratedCol: integer('generated_col').generatedAlwaysAs(1),\n\talwaysAsIdentity: integer('always_as_identity').generatedAlwaysAsIdentity(),\n\tbyDefaultAsIdentity: integer('by_default_as_identity').generatedByDefaultAsIdentity(),\n\tname: text('name'),\n});\n\nExpect<Equal<InferSelectModel<typeof identityColumnsTable>, typeof identityColumnsTable['$inferSelect']>>;\nExpect<Equal<InferSelectModel<typeof identityColumnsTable>, typeof identityColumnsTable['_']['inferSelect']>>;\nExpect<Equal<InferInsertModel<typeof identityColumnsTable>, typeof identityColumnsTable['$inferInsert']>>;\nExpect<Equal<InferInsertModel<typeof identityColumnsTable>, typeof identityColumnsTable['_']['inferInsert']>>;\nExpect<\n\tEqual<\n\t\tInferInsertModel<typeof identityColumnsTable, { dbColumnNames: false; override: true }>,\n\t\tSimplify<typeof identityColumnsTable['$inferInsert'] & { alwaysAsIdentity?: number | undefined }>\n\t>\n>;\nExpect<\n\tEqual<\n\t\tInferInsertModel<typeof identityColumnsTable, { dbColumnNames: false; override: true }>,\n\t\tSimplify<typeof identityColumnsTable['_']['inferInsert'] & { alwaysAsIdentity?: number | undefined }>\n\t>\n>;\n\nexport const users = pgTable(\n\t'users_table',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\tuuid: uuid('uuid').defaultRandom().notNull(),\n\t\thomeCity: integer('home_city')\n\t\t\t.notNull()\n\t\t\t.references(() => cities.id),\n\t\tcurrentCity: integer('current_city').references(() => cities.id),\n\t\tserialNullable: serial('serial1'),\n\t\tserialNotNull: serial('serial2').notNull(),\n\t\tclass: text('class', { enum: ['A', 'C'] }).notNull(),\n\t\tsubClass: text('sub_class', { enum: ['B', 'D'] }),\n\t\ttext: text('text'),\n\t\tage1: integer('age1').notNull(),\n\t\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n\t\tenumCol: myEnum('enum_col').notNull(),\n\t\tarrayCol: text('array_col').array().notNull(),\n\t},\n\t(users) => [\n\t\tuniqueIndex('usersAge1Idx').on(users.class.asc().nullsFirst(), sql``),\n\t\tindex('usersAge2Idx').on(sql``),\n\t\tuniqueIndex('uniqueClass')\n\t\t\t.using('btree', users.class.desc().op('text_ops'), users.subClass.nullsLast())\n\t\t\t.where(sql`${users.class} is not null`)\n\t\t\t.concurrently(),\n\t\tcheck('legalAge', sql`${users.age1} > 18`),\n\t\tforeignKey({ columns: [users.subClass], foreignColumns: [classes.subClass] })\n\t\t\t.onUpdate('cascade')\n\t\t\t.onDelete('cascade'),\n\t\tforeignKey({\n\t\t\tcolumns: [users.class, users.subClass],\n\t\t\tforeignColumns: [classes.class, classes.subClass],\n\t\t}),\n\t\tprimaryKey(users.age1, users.class),\n\t],\n);\n\nExpect<Equal<InferSelectModel<typeof users>, typeof users['$inferSelect']>>;\nExpect<Equal<InferSelectModel<typeof users>, typeof users['_']['inferSelect']>>;\nExpect<Equal<InferInsertModel<typeof users>, typeof users['$inferInsert']>>;\nExpect<Equal<InferInsertModel<typeof users>, typeof users['_']['inferInsert']>>;\n\nexport const cities = pgTable('cities_table', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tpopulation: integer('population').default(0),\n}, (cities) => ({\n\tcitiesNameIdx: index().on(cities.id),\n}));\n\nexport const smallSerialTest = pgTable('cities_table', {\n\tid: smallserial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tpopulation: integer('population').default(0),\n});\n\nExpect<\n\tEqual<{\n\t\tid?: number;\n\t\tname: string;\n\t\tpopulation?: number | null;\n\t}, typeof smallSerialTest.$inferInsert>\n>;\n\nexport const classes = pgTable('classes_table', {\n\tid: serial('id').primaryKey(),\n\tclass: text('class', { enum: ['A', 'C'] }),\n\tsubClass: text('sub_class', { enum: ['B', 'D'] }).notNull(),\n});\n\nExpect<\n\tEqual<{\n\t\tid?: number;\n\t\tclass?: 'A' | 'C' | null;\n\t\tsubClass: 'B' | 'D';\n\t}, typeof classes.$inferInsert>\n>;\n\nexport const network = pgTable('network_table', {\n\tinet: inet('inet').notNull(),\n\tcidr: cidr('cidr').notNull(),\n\tmacaddr: macaddr('macaddr').notNull(),\n\tmacaddr8: macaddr8('macaddr8').notNull(),\n});\n\nExpect<\n\tEqual<{\n\t\tinet: string;\n\t\tcidr: string;\n\t\tmacaddr: string;\n\t\tmacaddr8: string;\n\t}, typeof network.$inferSelect>\n>;\n\nexport const salEmp = pgTable('sal_emp', {\n\tname: text('name').notNull(),\n\tpayByQuarter: integer('pay_by_quarter').array().notNull(),\n\tschedule: text('schedule').array().array().notNull(),\n});\n\nexport const tictactoe = pgTable('tictactoe', {\n\tsquares: integer('squares').array(3).array(3).notNull(),\n});\n\nexport const customSchema = pgSchema('custom');\n\nexport const citiesCustom = customSchema.table('cities_table', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tpopulation: integer('population').default(0),\n}, (cities) => [index().on(cities.id)]);\n\nexport const newYorkers = pgView('new_yorkers')\n\t.with({\n\t\tcheckOption: 'cascaded',\n\t\tsecurityBarrier: true,\n\t\tsecurityInvoker: true,\n\t})\n\t.as((qb) => {\n\t\tconst sq = qb\n\t\t\t.$with('sq')\n\t\t\t.as(\n\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n\t\t\t\t\t.from(users)\n\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n\t\t\t\t\t.where(sql`${users.age1} > 18`),\n\t\t\t);\n\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n\t});\n\nExpect<\n\tEqual<\n\t\tPgViewWithSelection<'new_yorkers', false, {\n\t\t\tuserId: PgColumn<{\n\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\tname: 'id';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'PgSerial';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: number;\n\t\t\t\tnotNull: true;\n\t\t\t\thasDefault: true;\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t\tcityId: PgColumn<{\n\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\tname: 'id';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'PgSerial';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: number;\n\t\t\t\tnotNull: false;\n\t\t\t\thasDefault: true;\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t}>,\n\t\ttypeof newYorkers\n\t>\n>;\n\n{\n\tconst newYorkers = customSchema.view('new_yorkers')\n\t\t.with({\n\t\t\tcheckOption: 'cascaded',\n\t\t\tsecurityBarrier: true,\n\t\t\tsecurityInvoker: true,\n\t\t})\n\t\t.as((qb) => {\n\t\t\tconst sq = qb\n\t\t\t\t.$with('sq')\n\t\t\t\t.as(\n\t\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n\t\t\t\t\t\t.from(users)\n\t\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n\t\t\t\t\t\t.where(sql`${users.age1} > 18`),\n\t\t\t\t);\n\t\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n\t\t});\n\n\tExpect<\n\t\tEqual<\n\t\t\tPgViewWithSelection<'new_yorkers', false, {\n\t\t\t\tuserId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgSerial';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\thasDefault: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: true;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgSerial';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: true;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers = pgView('new_yorkers', {\n\t\tuserId: integer('user_id').notNull(),\n\t\tcityId: integer('city_id'),\n\t})\n\t\t.with({\n\t\t\tcheckOption: 'cascaded',\n\t\t\tsecurityBarrier: true,\n\t\t\tsecurityInvoker: true,\n\t\t})\n\t\t.as(\n\t\t\tsql`select ${users.id} as user_id, ${cities.id} as city_id from ${users} left join ${cities} on ${\n\t\t\t\teq(cities.id, users.homeCity)\n\t\t\t} where ${gt(users.age1, 18)}`,\n\t\t);\n\n\tExpect<\n\t\tEqual<\n\t\t\tPgViewWithSelection<'new_yorkers', false, {\n\t\t\t\tuserId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers = customSchema.view('new_yorkers', {\n\t\tuserId: integer('user_id').notNull(),\n\t\tcityId: integer('city_id'),\n\t})\n\t\t.with({\n\t\t\tcheckOption: 'cascaded',\n\t\t\tsecurityBarrier: true,\n\t\t\tsecurityInvoker: true,\n\t\t})\n\t\t.as(\n\t\t\tsql`select ${users.id} as user_id, ${cities.id} as city_id from ${users} left join ${cities} on ${\n\t\t\t\teq(cities.id, users.homeCity)\n\t\t\t} where ${gt(users.age1, 18)}`,\n\t\t);\n\n\tExpect<\n\t\tEqual<\n\t\t\tPgViewWithSelection<'new_yorkers', false, {\n\t\t\t\tuserId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers = pgView('new_yorkers', {\n\t\tuserId: integer('user_id').notNull(),\n\t\tcityId: integer('city_id'),\n\t}).existing();\n\n\tExpect<\n\t\tEqual<\n\t\t\tPgViewWithSelection<'new_yorkers', true, {\n\t\t\t\tuserId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers = customSchema.view('new_yorkers', {\n\t\tuserId: integer('user_id').notNull(),\n\t\tcityId: integer('city_id'),\n\t}).existing();\n\n\tExpect<\n\t\tEqual<\n\t\t\tPgViewWithSelection<'new_yorkers', true, {\n\t\t\t\tuserId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\nexport const newYorkers2 = pgMaterializedView('new_yorkers')\n\t.using('btree')\n\t.with({\n\t\tfillfactor: 90,\n\t\ttoastTupleTarget: 0.5,\n\t\tautovacuumEnabled: true,\n\t})\n\t.tablespace('custom_tablespace')\n\t.withNoData()\n\t.as((qb) => {\n\t\tconst sq = qb\n\t\t\t.$with('sq')\n\t\t\t.as(\n\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n\t\t\t\t\t.from(users)\n\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n\t\t\t\t\t.where(sql`${users.age1} > 18`),\n\t\t\t);\n\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n\t});\n\nExpect<\n\tEqual<\n\t\tPgMaterializedViewWithSelection<'new_yorkers', false, {\n\t\t\tuserId: PgColumn<{\n\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\tname: 'id';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'PgSerial';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: number;\n\t\t\t\tnotNull: true;\n\t\t\t\thasDefault: true;\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t\tcityId: PgColumn<{\n\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\tname: 'id';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'PgSerial';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: number;\n\t\t\t\tnotNull: false;\n\t\t\t\thasDefault: true;\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t}>,\n\t\ttypeof newYorkers2\n\t>\n>;\n\n{\n\tconst newYorkers2 = customSchema.materializedView('new_yorkers')\n\t\t.using('btree')\n\t\t.with({\n\t\t\tfillfactor: 90,\n\t\t\ttoastTupleTarget: 0.5,\n\t\t\tautovacuumEnabled: true,\n\t\t})\n\t\t.tablespace('custom_tablespace')\n\t\t.withNoData()\n\t\t.as((qb) => {\n\t\t\tconst sq = qb\n\t\t\t\t.$with('sq')\n\t\t\t\t.as(\n\t\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n\t\t\t\t\t\t.from(users)\n\t\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n\t\t\t\t\t\t.where(sql`${users.age1} > 18`),\n\t\t\t\t);\n\t\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n\t\t});\n\n\tExpect<\n\t\tEqual<\n\t\t\tPgMaterializedViewWithSelection<'new_yorkers', false, {\n\t\t\t\tuserId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgSerial';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\thasDefault: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: true;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgSerial';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: true;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers2\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers2 = pgMaterializedView('new_yorkers', {\n\t\tuserId: integer('user_id').notNull(),\n\t\tcityId: integer('city_id'),\n\t})\n\t\t.using('btree')\n\t\t.with({\n\t\t\tfillfactor: 90,\n\t\t\ttoastTupleTarget: 0.5,\n\t\t\tautovacuumEnabled: true,\n\t\t})\n\t\t.tablespace('custom_tablespace')\n\t\t.withNoData()\n\t\t.as(\n\t\t\tsql`select ${users.id} as user_id, ${cities.id} as city_id from ${users} left join ${cities} on ${\n\t\t\t\teq(cities.id, users.homeCity)\n\t\t\t} where ${gt(users.age1, 18)}`,\n\t\t);\n\n\tExpect<\n\t\tEqual<\n\t\t\tPgMaterializedViewWithSelection<'new_yorkers', false, {\n\t\t\t\tuserId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers2\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers2 = customSchema.materializedView('new_yorkers', {\n\t\tuserId: integer('user_id').notNull(),\n\t\tcityId: integer('city_id'),\n\t})\n\t\t.using('btree')\n\t\t.with({\n\t\t\tfillfactor: 90,\n\t\t\ttoastTupleTarget: 0.5,\n\t\t\tautovacuumEnabled: true,\n\t\t})\n\t\t.tablespace('custom_tablespace')\n\t\t.withNoData()\n\t\t.as(\n\t\t\tsql`select ${users.id} as user_id, ${cities.id} as city_id from ${users} left join ${cities} on ${\n\t\t\t\teq(cities.id, users.homeCity)\n\t\t\t} where ${gt(users.age1, 18)}`,\n\t\t);\n\n\tExpect<\n\t\tEqual<\n\t\t\tPgMaterializedViewWithSelection<'new_yorkers', false, {\n\t\t\t\tuserId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers2\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers2 = pgMaterializedView('new_yorkers', {\n\t\tuserId: integer('user_id').notNull(),\n\t\tcityId: integer('city_id'),\n\t}).existing();\n\n\tExpect<\n\t\tEqual<\n\t\t\tPgMaterializedViewWithSelection<'new_yorkers', true, {\n\t\t\t\tuserId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers2\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers2 = customSchema.materializedView('new_yorkers', {\n\t\tuserId: integer('user_id').notNull(),\n\t\tcityId: integer('city_id'),\n\t}).existing();\n\n\tExpect<\n\t\tEqual<\n\t\t\tPgMaterializedViewWithSelection<'new_yorkers', true, {\n\t\t\t\tuserId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: PgColumn<{\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers2\n\t\t>\n\t>;\n}\n\nawait db.refreshMaterializedView(newYorkers2).concurrently();\nawait db.refreshMaterializedView(newYorkers2).withNoData();\nawait db.refreshMaterializedView(newYorkers2).concurrently().withNoData();\nawait db.refreshMaterializedView(newYorkers2).withNoData().concurrently();\n\n// await migrate(db, {\n// \tmigrationsFolder: './drizzle/pg',\n// \tonMigrationError(error) {\n// \t\tif (['0001_drizli_klaud', '0002_beep_boop'].includes(error.migration.name)) {\n// \t\t\treturn;\n// \t\t}\n// \t\tthrow error;\n// \t},\n// });\n\n{\n\tconst customTextRequired = customType<{\n\t\tdata: string;\n\t\tdriverData: string;\n\t\tconfig: { length: number };\n\t\tconfigRequired: true;\n\t}>({\n\t\tdataType(config) {\n\t\t\tExpect<Equal<{ length: number }, typeof config>>;\n\t\t\treturn `varchar(${config.length})`;\n\t\t},\n\n\t\ttoDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\n\t\tfromDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\t});\n\n\tcustomTextRequired('t', { length: 10 });\n\tcustomTextRequired({ length: 10 });\n\t// @ts-expect-error - config is required\n\tcustomTextRequired('t');\n\t// @ts-expect-error - config is required\n\tcustomTextRequired();\n}\n\n{\n\tconst customTextOptional = customType<{\n\t\tdata: string;\n\t\tdriverData: string;\n\t\tconfig: { length: number };\n\t}>({\n\t\tdataType(config) {\n\t\t\tExpect<Equal<{ length: number } | undefined, typeof config>>;\n\t\t\treturn config ? `varchar(${config.length})` : `text`;\n\t\t},\n\n\t\ttoDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\n\t\tfromDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\t});\n\n\tcustomTextOptional('t', { length: 10 });\n\tcustomTextOptional('t');\n\tcustomTextOptional({ length: 10 });\n\tcustomTextOptional();\n}\n\n{\n\tconst cities1 = pgTable('cities_table', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull().primaryKey(),\n\t\trole: text('role', { enum: ['admin', 'user'] }).default('user').notNull(),\n\t\tpopulation: integer('population').default(0),\n\t});\n\tconst cities2 = pgTable('cities_table', ({ serial, text, integer }) => ({\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull().primaryKey(),\n\t\trole: text('role', { enum: ['admin', 'user'] }).default('user').notNull(),\n\t\tpopulation: integer('population').default(0),\n\t}));\n\n\ttype Expected = PgTableWithColumns<{\n\t\tname: 'cities_table';\n\t\tschema: undefined;\n\t\tdialect: 'pg';\n\t\tcolumns: {\n\t\t\tid: PgColumn<{\n\t\t\t\ttableName: 'cities_table';\n\t\t\t\tname: 'id';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'PgSerial';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: number;\n\t\t\t\thasDefault: true;\n\t\t\t\tnotNull: true;\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t\tname: PgColumn<{\n\t\t\t\ttableName: 'cities_table';\n\t\t\t\tname: 'name';\n\t\t\t\tdataType: 'string';\n\t\t\t\tcolumnType: 'PgText';\n\t\t\t\tdata: string;\n\t\t\t\tdriverParam: string;\n\t\t\t\thasDefault: false;\n\t\t\t\tenumValues: [string, ...string[]];\n\t\t\t\tnotNull: true;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t\trole: PgColumn<{\n\t\t\t\ttableName: 'cities_table';\n\t\t\t\tname: 'role';\n\t\t\t\tdataType: 'string';\n\t\t\t\tcolumnType: 'PgText';\n\t\t\t\tdata: 'admin' | 'user';\n\t\t\t\tdriverParam: string;\n\t\t\t\thasDefault: true;\n\t\t\t\tenumValues: ['admin', 'user'];\n\t\t\t\tnotNull: true;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: false;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t\tpopulation: PgColumn<{\n\t\t\t\ttableName: 'cities_table';\n\t\t\t\tname: 'population';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'PgInteger';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: string | number;\n\t\t\t\tnotNull: false;\n\t\t\t\thasDefault: true;\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisPrimaryKey: false;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t};\n\t}>;\n\n\tExpect<Equal<Expected, typeof cities1>>;\n\tExpect<Equal<Expected, typeof cities2>>;\n}\n\n{\n\tpgTable('test', {\n\t\tbigint: bigint('bigint', { mode: 'bigint' }).default(BigInt(10)),\n\t\tbigintNumber: bigint('bigintNumber', { mode: 'number' }),\n\t\tbigserial: bigserial('bigserial', { mode: 'bigint' }).default(BigInt(10)),\n\t\tbigserialNumber: bigserial('bigserialNumber', { mode: 'number' }),\n\t\ttimestamp: timestamp('timestamp').default(new Date()),\n\t\ttimestamp2: timestamp('timestamp2', { mode: 'date' }).default(new Date()),\n\t\ttimestamp3: timestamp('timestamp3', { mode: undefined }).default(new Date()),\n\t\ttimestamp4: timestamp('timestamp4', { mode: 'string' }).default('2020-01-01'),\n\t});\n}\n\n{\n\tconst test = pgTable('test', {\n\t\tcol1: decimal('col1', { precision: 10, scale: 2 }).notNull().default('10.2'),\n\t});\n\tExpect<Equal<{ col1: string }, typeof test.$inferSelect>>;\n}\n\n{\n\tconst a = ['a', 'b', 'c'] as const;\n\tconst b = pgEnum('test', a);\n\tz.enum(b.enumValues);\n}\n\n{\n\tconst b = pgEnum('test', ['a', 'b', 'c']);\n\tz.enum(b.enumValues);\n}\n\n{\n\tconst getUsersTable = <TSchema extends string>(schemaName: TSchema) => {\n\t\treturn pgSchema(schemaName).table('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\t};\n\n\tconst users1 = getUsersTable('id1');\n\tExpect<Equal<'id1', typeof users1._.schema>>;\n\n\tconst users2 = getUsersTable('id2');\n\tExpect<Equal<'id2', typeof users2._.schema>>;\n}\n\n{\n\tconst internalStaff = pgTable('internal_staff', {\n\t\tuserId: integer('user_id').notNull(),\n\t});\n\n\tconst customUser = pgTable('custom_user', {\n\t\tid: integer('id').notNull(),\n\t});\n\n\tconst ticket = pgTable('ticket', {\n\t\tstaffId: integer('staff_id').notNull(),\n\t});\n\n\tconst subq = db\n\t\t.select()\n\t\t.from(internalStaff)\n\t\t.leftJoin(\n\t\t\tcustomUser,\n\t\t\teq(internalStaff.userId, customUser.id),\n\t\t).as('internal_staff');\n\n\tconst mainQuery = await db\n\t\t.select()\n\t\t.from(ticket)\n\t\t.leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId));\n\n\tExpect<\n\t\tEqual<{\n\t\t\tinternal_staff: {\n\t\t\t\tinternal_staff: {\n\t\t\t\t\tuserId: number;\n\t\t\t\t};\n\t\t\t\tcustom_user: {\n\t\t\t\t\tid: number | null;\n\t\t\t\t};\n\t\t\t} | null;\n\t\t\tticket: {\n\t\t\t\tstaffId: number;\n\t\t\t};\n\t\t}[], typeof mainQuery>\n\t>;\n}\n\n{\n\tconst newYorkers = pgView('new_yorkers')\n\t\t.as((qb) => {\n\t\t\tconst sq = qb\n\t\t\t\t.$with('sq')\n\t\t\t\t.as(\n\t\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n\t\t\t\t\t\t.from(users)\n\t\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n\t\t\t\t\t\t.where(sql`${users.age1} > 18`),\n\t\t\t\t);\n\t\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n\t\t});\n\n\tawait db.select().from(newYorkers).leftJoin(newYorkers, eq(newYorkers.userId, newYorkers.userId));\n}\n\n{\n\tconst testSchema = pgSchema('test');\n\n\tconst e1 = pgEnum('test', ['a', 'b', 'c']);\n\tconst e2 = pgEnum('test', ['a', 'b', 'c'] as const);\n\tconst e3 = testSchema.enum('test', ['a', 'b', 'c']);\n\tconst e4 = testSchema.enum('test', ['a', 'b', 'c'] as const);\n\n\tconst test = pgTable('test', {\n\t\tcol1: char('col1', { enum: ['a', 'b', 'c'] as const }),\n\t\tcol2: char('col2', { enum: ['a', 'b', 'c'] }),\n\t\tcol3: char('col3'),\n\t\tcol4: e1('col4'),\n\t\tcol5: e2('col5'),\n\t\tcol6: text('col6', { enum: ['a', 'b', 'c'] as const }),\n\t\tcol7: text('col7', { enum: ['a', 'b', 'c'] }),\n\t\tcol8: text('col8'),\n\t\tcol9: varchar('col9', { enum: ['a', 'b', 'c'] as const }),\n\t\tcol10: varchar('col10', { enum: ['a', 'b', 'c'] }),\n\t\tcol11: varchar('col11'),\n\t\tcol12: e3('col4'),\n\t\tcol13: e4('col5'),\n\t});\n\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col1.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col2.enumValues>>;\n\tExpect<Equal<[string, ...string[]], typeof test.col3.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col4.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col5.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col6.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col7.enumValues>>;\n\tExpect<Equal<[string, ...string[]], typeof test.col8.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col9.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col10.enumValues>>;\n\tExpect<Equal<[string, ...string[]], typeof test.col11.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col12.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col13.enumValues>>;\n}\n\n{\n\tconst testSchema = pgSchema('test');\n\n\tconst e1 = pgEnum('test', ['a', 'b', 'c']);\n\tconst e2 = pgEnum('test', ['a', 'b', 'c'] as const);\n\tconst e3 = testSchema.enum('test', ['a', 'b', 'c']);\n\tconst e4 = testSchema.enum('test', ['a', 'b', 'c'] as const);\n\n\tconst test = pgTable('test', {\n\t\tcol1: char('col1', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\tcol2: char('col2', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\tcol3: char('col3').generatedAlwaysAs(sql``),\n\t\tcol4: e1('col4').generatedAlwaysAs(sql``),\n\t\tcol5: e2('col5').generatedAlwaysAs(sql``),\n\t\tcol6: text('col6', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\tcol7: text('col7', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\tcol8: text('col8').generatedAlwaysAs(sql``),\n\t\tcol9: varchar('col9', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\tcol10: varchar('col10', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\tcol11: varchar('col11').generatedAlwaysAs(sql``),\n\t\tcol12: e3('col4').generatedAlwaysAs(sql``),\n\t\tcol13: e4('col5').generatedAlwaysAs(sql``),\n\t});\n\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col1.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col2.enumValues>>;\n\tExpect<Equal<[string, ...string[]], typeof test.col3.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col4.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col5.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col6.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col7.enumValues>>;\n\tExpect<Equal<[string, ...string[]], typeof test.col8.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col9.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col10.enumValues>>;\n\tExpect<Equal<[string, ...string[]], typeof test.col11.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col12.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.col13.enumValues>>;\n}\n\n{\n\tconst test = pgTable('test', {\n\t\tid: text('id').$defaultFn(() => crypto.randomUUID()).primaryKey(),\n\t});\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid?: string;\n\t\t}, typeof test.$inferInsert>\n\t>;\n}\n\n{\n\tpgTable('test', {\n\t\tid: integer('id').$default(() => 1),\n\t\tid2: integer('id').$defaultFn(() => 1),\n\t\t// @ts-expect-error - should be number\n\t\tid3: integer('id').$default(() => '1'),\n\t\t// @ts-expect-error - should be number\n\t\tid4: integer('id').$defaultFn(() => '1'),\n\t});\n}\n\n{\n\tconst enum_ = pgEnum('enum', ['a', 'b', 'c']);\n\n\tpgTable('all_columns', {\n\t\tenum: enum_('enum'),\n\t\tenumdef: enum_('enumdef').default('a'),\n\t\tsm: smallint('smallint'),\n\t\tsmdef: smallint('smallint_def').default(10),\n\t\tint: integer('integer'),\n\t\tintdef: integer('integer_def').default(10),\n\t\tnumeric: numeric('numeric'),\n\t\tnumeric2: numeric('numeric2', { precision: 5 }),\n\t\tnumeric3: numeric('numeric3', { scale: 2 }),\n\t\tnumeric4: numeric('numeric4', { precision: 5, scale: 2 }),\n\t\tnumericdef: numeric('numeridef').default('100'),\n\t\tbigint: bigint('bigint', { mode: 'number' }),\n\t\tbigintdef: bigint('bigintdef', { mode: 'number' }).default(100),\n\t\tbool: boolean('boolean'),\n\t\tbooldef: boolean('boolean_def').default(true),\n\t\ttext: text('text'),\n\t\ttextdef: text('textdef').default('text'),\n\t\tvarchar: varchar('varchar'),\n\t\tvarchardef: varchar('varchardef').default('text'),\n\t\tserial: serial('serial'),\n\t\tbigserial: bigserial('bigserial', { mode: 'number' }),\n\t\tdecimal: decimal('decimal', { precision: 100, scale: 2 }),\n\t\tdecimaldef: decimal('decimaldef', { precision: 100, scale: 2 }).default('100.0'),\n\t\tdoublePrecision: doublePrecision('doublePrecision'),\n\t\tdoublePrecisiondef: doublePrecision('doublePrecisiondef').default(100),\n\t\treal: real('real'),\n\t\trealdef: real('realdef').default(100),\n\t\tjson: json('json').$type<{ attr: string }>(),\n\t\tjsondef: json('jsondef').$type<{ attr: string }>().default({ attr: 'value' }),\n\t\tjsonb: jsonb('jsonb').$type<{ attr: string }>(),\n\t\tjsonbdef: jsonb('jsonbdef').$type<{ attr: string }>().default({ attr: 'value' }),\n\t\ttime: time('time'),\n\t\ttime2: time('time2', { precision: 6, withTimezone: true }),\n\t\ttimedef: time('timedef').default('00:00:00'),\n\t\ttimedefnow: time('timedefnow').defaultNow(),\n\t\ttimestamp: timestamp('timestamp'),\n\t\ttimestamp2: timestamp('timestamp2', { precision: 6, withTimezone: true }),\n\t\ttimestamp3: timestamp('timestamp3', { withTimezone: true }),\n\t\ttimestamp4: timestamp('timestamp4', { precision: 4 }),\n\t\ttimestampdef: timestamp('timestampdef').default(new Date()),\n\t\tdate: date('date', { mode: 'date' }),\n\t\tdatedef: date('datedef').default('2024-01-01'),\n\t\tdatedefnow: date('datedefnow').defaultNow(),\n\t});\n\n\tpgTable('all_postgis_columns', {\n\t\tgeometry: geometry('geometry'),\n\t\tgeometry2: geometry('geometry2', { srid: 2, mode: 'xy' }),\n\t\tgeometry3: geometry('geometry3', { srid: 3, mode: 'tuple' }),\n\t\tgeometry4: geometry('geometry4', { mode: 'tuple' }),\n\t\tgeometrydef: geometry('geometrydef').default([1, 2]),\n\t\tpoint: point('point'),\n\t\tpoint2: point('point2', { mode: 'xy' }),\n\t\tpointdef: point('pointdef').default([1, 2]),\n\t\tline: line('line'),\n\t\tline2: line('line2', { mode: 'abc' }),\n\t\tlinedef: line('linedef').default([1, 2, 3]),\n\t});\n\n\tpgTable('all_vector_columns', {\n\t\tbit: bit('bit', { dimensions: 1 }),\n\t\tbitdef: bit('bitdef', { dimensions: 1 }).default('1'),\n\t\thalfvec: halfvec('halfvec', { dimensions: 1 }),\n\t\thalfvecdef: halfvec('halfvecdef', { dimensions: 1 }).default([1]),\n\t\tsparsevec: sparsevec('sparsevec', { dimensions: 1 }),\n\t\tsparsevecdef: sparsevec('sparsevecdef', { dimensions: 1 }).default('{1:1}/1'),\n\t\tvector: vector('vector', { dimensions: 1 }),\n\t\tvectordef: vector('vectordef', { dimensions: 1 }).default([1]),\n\t});\n}\n\n{\n\tconst keysAsColumnNames = pgTable('test', {\n\t\tid: serial(),\n\t\tname: text(),\n\t});\n\n\tExpect<Equal<typeof keysAsColumnNames['id']['_']['name'], 'id'>>;\n\tExpect<Equal<typeof keysAsColumnNames['name']['_']['name'], 'name'>>;\n}\n\n{\n\tconst enum_ = pgEnum('enum', ['a', 'b', 'c']);\n\n\tpgTable('all_columns_without_name', {\n\t\tenum: enum_(),\n\t\tenumdef: enum_().default('a'),\n\t\tsm: smallint(),\n\t\tsmdef: smallint().default(10),\n\t\tint: integer(),\n\t\tintdef: integer().default(10),\n\t\tnumeric: numeric(),\n\t\tnumeric2: numeric({ precision: 5 }),\n\t\tnumeric3: numeric({ scale: 2 }),\n\t\tnumeric4: numeric({ precision: 5, scale: 2 }),\n\t\tnumericdef: numeric().default('100'),\n\t\tbigint: bigint({ mode: 'number' }),\n\t\tbigintdef: bigint({ mode: 'number' }).default(100),\n\t\tbool: boolean(),\n\t\tbooldef: boolean().default(true),\n\t\ttext: text(),\n\t\ttextdef: text().default('text'),\n\t\tvarchar: varchar(),\n\t\tvarchardef: varchar().default('text'),\n\t\tserial: serial(),\n\t\tbigserial: bigserial({ mode: 'number' }),\n\t\tdecimal: decimal({ precision: 100, scale: 2 }),\n\t\tdecimaldef: decimal({ precision: 100, scale: 2 }).default('100.0'),\n\t\tdoublePrecision: doublePrecision(),\n\t\tdoublePrecisiondef: doublePrecision().default(100),\n\t\treal: real(),\n\t\trealdef: real().default(100),\n\t\tjson: json().$type<{ attr: string }>(),\n\t\tjsondef: json().$type<{ attr: string }>().default({ attr: 'value' }),\n\t\tjsonb: jsonb().$type<{ attr: string }>(),\n\t\tjsonbdef: jsonb().$type<{ attr: string }>().default({ attr: 'value' }),\n\t\ttime: time(),\n\t\ttime2: time({ precision: 6, withTimezone: true }),\n\t\ttimedef: time().default('00:00:00'),\n\t\ttimedefnow: time().defaultNow(),\n\t\ttimestamp: timestamp(),\n\t\ttimestamp2: timestamp({ precision: 6, withTimezone: true }),\n\t\ttimestamp3: timestamp({ withTimezone: true }),\n\t\ttimestamp4: timestamp({ precision: 4 }),\n\t\ttimestampdef: timestamp().default(new Date()),\n\t\tdate: date({ mode: 'date' }),\n\t\tdatedef: date().default('2024-01-01'),\n\t\tdatedefnow: date().defaultNow(),\n\t});\n\n\tpgTable('all_postgis_columns', {\n\t\tgeometry: geometry(),\n\t\tgeometry2: geometry({ srid: 2, mode: 'xy' }),\n\t\tgeometry3: geometry({ srid: 3, mode: 'tuple' }),\n\t\tgeometry4: geometry({ mode: 'tuple' }),\n\t\tgeometrydef: geometry().default([1, 2]),\n\t\tpoint: point(),\n\t\tpoint2: point({ mode: 'xy' }),\n\t\tpointdef: point().default([1, 2]),\n\t\tline: line(),\n\t\tline2: line({ mode: 'abc' }),\n\t\tlinedef: line().default([1, 2, 3]),\n\t});\n\n\tpgTable('all_vector_columns', {\n\t\tbit: bit({ dimensions: 1 }),\n\t\tbitdef: bit({ dimensions: 1 }).default('1'),\n\t\thalfvec: halfvec({ dimensions: 1 }),\n\t\thalfvecdef: halfvec({ dimensions: 1 }).default([1]),\n\t\tsparsevec: sparsevec({ dimensions: 1 }),\n\t\tsparsevecdef: sparsevec({ dimensions: 1 }).default('{1:1}/1'),\n\t\tvector: vector({ dimensions: 1 }),\n\t\tvectordef: vector({ dimensions: 1 }).default([1]),\n\t});\n}\n\n// ts enums test\n{\n\tenum Role {\n\t\tadmin = 'admin',\n\t\tuser = 'user',\n\t\tguest = 'guest',\n\t}\n\n\tconst role = pgEnum('role', Role);\n\n\tenum RoleNonString {\n\t\tadmin,\n\t\tuser,\n\t\tguest,\n\t}\n\n\t// @ts-expect-error\n\tpgEnum('role', RoleNonString);\n\n\tenum RolePartiallyString {\n\t\tadmin,\n\t\tuser = 'user',\n\t\tguest = 'guest',\n\t}\n\n\t// @ts-expect-error\n\tpgEnum('role', RolePartiallyString);\n\n\tconst table = pgTable('table', {\n\t\tenum: role('enum'),\n\t});\n\n\tconst res = await db.select().from(table);\n\n\tExpect<Equal<{ enum: Role | null }[], typeof res>>;\n\n\tconst mySchema = pgSchema('my_schema');\n\n\tconst schemaRole = mySchema.enum('role', Role);\n\n\t// @ts-expect-error\n\tmySchema.enum('role', RoleNonString);\n\n\t// @ts-expect-error\n\tmySchema.enum('role', RolePartiallyString);\n\n\tconst schemaTable = mySchema.table('table', {\n\t\tenum: schemaRole('enum'),\n\t});\n\n\tconst schemaRes = await db.select().from(schemaTable);\n\n\tExpect<Equal<{ enum: Role | null }[], typeof schemaRes>>;\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/update.ts",
    "content": "import type { QueryResult } from 'pg';\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport type { PgUpdate } from '~/pg-core/index.ts';\nimport { eq } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { Simplify } from '~/utils.ts';\nimport { db } from './db.ts';\nimport { cities, salEmp, users } from './tables.ts';\n\nconst update = await db.update(users)\n\t.set({\n\t\ttext: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1));\nExpect<Equal<QueryResult<never>, typeof update>>;\n\nconst updateStmt = db.update(users)\n\t.set({\n\t\ttext: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1))\n\t.prepare('updateStmt');\nconst updatePrepared = await updateStmt.execute();\nExpect<Equal<QueryResult<never>, typeof updatePrepared>>;\n\nconst updateReturning = await db.update(users)\n\t.set({\n\t\ttext: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1))\n\t.returning({\n\t\ttext: users.text,\n\t});\nExpect<Equal<{ text: string | null }[], typeof updateReturning>>;\n\nconst updateReturningStmt = db.update(users)\n\t.set({\n\t\ttext: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1))\n\t.returning({\n\t\ttext: users.text,\n\t})\n\t.prepare('updateReturningStmt');\nconst updateReturningPrepared = await updateReturningStmt.execute();\nExpect<Equal<{ text: string | null }[], typeof updateReturningPrepared>>;\n\n{\n\tfunction dynamic<T extends PgUpdate>(qb: T) {\n\t\treturn qb.where(sql``).returning();\n\t}\n\n\tconst qbBase = db.update(users).set({}).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tfunction withReturning<T extends PgUpdate>(qb: T) {\n\t\treturn qb.returning();\n\t}\n\n\tconst qbBase = db.update(users).set({}).$dynamic();\n\tconst qb = withReturning(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.returning()\n\t\t// @ts-expect-error method was already called\n\t\t.returning();\n\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n}\n\n{\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.from(sql``)\n\t\t.leftJoin(sql``, (table, from) => {\n\t\t\tExpect<Equal<typeof users['_']['columns'], typeof table>>;\n\t\t\tExpect<Equal<never, typeof from>>;\n\t\t\treturn sql``;\n\t\t});\n\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.from(cities)\n\t\t.leftJoin(sql``, (table, from) => {\n\t\t\tExpect<Equal<typeof users['_']['columns'], typeof table>>;\n\t\t\tExpect<Equal<typeof cities['_']['columns'], typeof from>>;\n\t\t\treturn sql``;\n\t\t});\n\n\tconst citiesSq = db.$with('cities_sq').as(db.select({ id: cities.id }).from(cities));\n\n\tdb\n\t\t.with(citiesSq)\n\t\t.update(users)\n\t\t.set({})\n\t\t.from(citiesSq)\n\t\t.leftJoin(sql``, (table, from) => {\n\t\t\tExpect<Equal<typeof users['_']['columns'], typeof table>>;\n\t\t\tExpect<Equal<typeof citiesSq['_']['selectedFields'], typeof from>>;\n\t\t\treturn sql``;\n\t\t});\n\n\tdb\n\t\t.with(citiesSq)\n\t\t.update(users)\n\t\t.set({\n\t\t\thomeCity: citiesSq.id,\n\t\t})\n\t\t.from(citiesSq);\n}\n\n{\n\tconst result = await db.update(users).set({}).from(cities).returning();\n\tExpect<\n\t\tEqual<Simplify<\n\t\t\ttypeof users.$inferSelect & {\n\t\t\t\tcities_table: typeof cities.$inferSelect;\n\t\t\t}\n\t\t>[], typeof result>\n\t>;\n}\n\n{\n\tconst result1 = await db.update(users).set({}).from(cities).leftJoin(salEmp, sql``).returning();\n\tExpect<\n\t\tEqual<Simplify<\n\t\t\ttypeof users.$inferSelect & {\n\t\t\t\tcities_table: typeof cities.$inferSelect;\n\t\t\t\tsal_emp: typeof salEmp.$inferSelect | null;\n\t\t\t}\n\t\t>[], typeof result1>\n\t>;\n\n\tconst result2 = await db.update(users).set({}).from(cities).rightJoin(salEmp, sql``).returning();\n\tExpect<\n\t\tEqual<Simplify<\n\t\t\t{ [K in keyof typeof users.$inferSelect]: typeof users.$inferSelect[K] | null } & {\n\t\t\t\tcities_table: typeof cities.$inferSelect | null;\n\t\t\t\tsal_emp: typeof salEmp.$inferSelect;\n\t\t\t}\n\t\t>[], typeof result2>\n\t>;\n\n\tconst result3 = await db.update(users).set({}).from(cities).innerJoin(salEmp, sql``).returning();\n\tExpect<\n\t\tEqual<Simplify<\n\t\t\ttypeof users.$inferSelect & {\n\t\t\t\tcities_table: typeof cities.$inferSelect;\n\t\t\t\tsal_emp: typeof salEmp.$inferSelect;\n\t\t\t}\n\t\t>[], typeof result3>\n\t>;\n\n\tconst result4 = await db.update(users).set({}).from(cities).fullJoin(salEmp, sql``).returning();\n\tExpect<\n\t\tEqual<Simplify<\n\t\t\t{ [K in keyof typeof users.$inferSelect]: typeof users.$inferSelect[K] | null } & {\n\t\t\t\tcities_table: typeof cities.$inferSelect | null;\n\t\t\t\tsal_emp: typeof salEmp.$inferSelect | null;\n\t\t\t}\n\t\t>[], typeof result4>\n\t>;\n}\n\n{\n\tconst result = await db.update(users).set({}).from(cities).returning({\n\t\tid: users.id,\n\t\tcities: cities,\n\t\tcityName: cities.name,\n\t});\n\tExpect<\n\t\tEqual<Simplify<{\n\t\t\tid: number;\n\t\t\tcities: typeof cities.$inferSelect;\n\t\t\tcityName: string;\n\t\t}>[], typeof result>\n\t>;\n}\n\n{\n\tconst result1 = await db.update(users).set({}).from(cities).leftJoin(salEmp, sql``).returning({\n\t\tid: users.id,\n\t\tcities: cities,\n\t\tcityName: cities.name,\n\t\tsalEmp: salEmp,\n\t\tsalEmpName: salEmp.name,\n\t});\n\tExpect<\n\t\tEqual<Simplify<{\n\t\t\tid: number;\n\t\t\tcities: typeof cities.$inferSelect;\n\t\t\tcityName: string;\n\t\t\tsalEmp: typeof salEmp.$inferSelect | null;\n\t\t\tsalEmpName: string | null;\n\t\t}>[], typeof result1>\n\t>;\n\n\tconst result2 = await db.update(users).set({}).from(cities).rightJoin(salEmp, sql``).returning({\n\t\tid: users.id,\n\t\tcities: cities,\n\t\tcityName: cities.name,\n\t\tsalEmp: salEmp,\n\t\tsalEmpName: salEmp.name,\n\t});\n\tExpect<\n\t\tEqual<Simplify<{\n\t\t\tid: number | null;\n\t\t\tcities: typeof cities.$inferSelect | null;\n\t\t\tcityName: string | null;\n\t\t\tsalEmp: typeof salEmp.$inferSelect;\n\t\t\tsalEmpName: string;\n\t\t}>[], typeof result2>\n\t>;\n\n\tconst result3 = await db.update(users).set({}).from(cities).innerJoin(salEmp, sql``).returning({\n\t\tid: users.id,\n\t\tcities: cities,\n\t\tcityName: cities.name,\n\t\tsalEmp: salEmp,\n\t\tsalEmpName: salEmp.name,\n\t});\n\tExpect<\n\t\tEqual<Simplify<{\n\t\t\tid: number;\n\t\t\tcities: typeof cities.$inferSelect;\n\t\t\tcityName: string;\n\t\t\tsalEmp: typeof salEmp.$inferSelect;\n\t\t\tsalEmpName: string;\n\t\t}>[], typeof result3>\n\t>;\n\n\tconst result4 = await db.update(users).set({}).from(cities).fullJoin(salEmp, sql``).returning({\n\t\tid: users.id,\n\t\tcities: cities,\n\t\tcityName: cities.name,\n\t\tsalEmp: salEmp,\n\t\tsalEmpName: salEmp.name,\n\t});\n\tExpect<\n\t\tEqual<Simplify<{\n\t\t\tid: number | null;\n\t\t\tcities: typeof cities.$inferSelect | null;\n\t\t\tcityName: string | null;\n\t\t\tsalEmp: typeof salEmp.$inferSelect | null;\n\t\t\tsalEmpName: string | null;\n\t\t}>[], typeof result4>\n\t>;\n}\n\n{\n\tawait db\n\t\t.update(users)\n\t\t.set({})\n\t\t// @ts-expect-error can't use joins before from\n\t\t.fullJoin(salEmp, sql``);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/pg/with.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { integer, pgTable, serial, text } from '~/pg-core/index.ts';\nimport { gt, inArray, like } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { DrizzleTypeError } from '~/utils.ts';\nimport { db } from './db.ts';\n\n{\n\tconst orders = pgTable('orders', {\n\t\tid: serial('id').primaryKey(),\n\t\tregion: text('region').notNull(),\n\t\tproduct: text('product').notNull(),\n\t\tamount: integer('amount').notNull(),\n\t\tquantity: integer('quantity').notNull(),\n\t\tgenerated: text('generatedText').generatedAlwaysAs(sql``),\n\t});\n\n\tconst regionalSales = db\n\t\t.$with('regional_sales')\n\t\t.as((qb) =>\n\t\t\tqb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.groupBy(orders.region)\n\t\t);\n\n\tconst topRegions = db\n\t\t.$with('top_regions')\n\t\t.as((qb) =>\n\t\t\tqb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: orders.amount,\n\t\t\t\t})\n\t\t\t\t.from(regionalSales)\n\t\t\t\t.where(\n\t\t\t\t\tgt(\n\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\tdb.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t);\n\n\tconst result = await db\n\t\t.with(regionalSales, topRegions)\n\t\t.select({\n\t\t\tregion: orders.region,\n\t\t\tproduct: orders.product,\n\t\t\tproductUnits: sql<number>`sum(${orders.quantity})`,\n\t\t\tproductSales: sql<number>`sum(${orders.amount})`,\n\t\t})\n\t\t.from(orders)\n\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)));\n\n\tExpect<\n\t\tEqual<{\n\t\t\tregion: string;\n\t\t\tproduct: string;\n\t\t\tproductUnits: number;\n\t\t\tproductSales: number;\n\t\t}[], typeof result>\n\t>;\n\n\tconst allOrdersWith = db.$with('all_orders_with').as(db.select().from(orders));\n\tconst allFromWith = await db.with(allOrdersWith).select().from(allOrdersWith);\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid: number;\n\t\t\tregion: string;\n\t\t\tproduct: string;\n\t\t\tamount: number;\n\t\t\tquantity: number;\n\t\t\tgenerated: string | null;\n\t\t}[], typeof allFromWith>\n\t>;\n\n\tconst regionalSalesWith = db.$with('regional_sales_with').as(db.select().from(regionalSales));\n\tdb.with(regionalSalesWith).select().from(regionalSalesWith).where(like(regionalSalesWith.totalSales, 'abc'));\n}\n\n{\n\tconst providers = pgTable('providers', {\n\t\tid: serial().primaryKey(),\n\t\tproviderName: text().notNull(),\n\t});\n\tconst products = pgTable('products', {\n\t\tid: serial().primaryKey(),\n\t\tproductName: text().notNull(),\n\t});\n\n\tconst sq1 = db.$with('inserted_products').as(\n\t\tdb.insert(products).values({ productName: sql`` }),\n\t);\n\tconst sq2 = db.$with('inserted_products').as(\n\t\tdb.insert(products).values({ productName: sql`` }).returning(),\n\t);\n\tconst sq3 = db.$with('inserted_products').as(\n\t\tdb.insert(products).values({ productName: sql`` }).returning({ productName: products.productName }),\n\t);\n\n\t// @ts-expect-error\n\tdb.with(sq1).select().from(sq1);\n\t// @ts-expect-error\n\tdb.with(sq1).select().from(providers).leftJoin(sq1, sql``);\n\n\tconst q3 = await db.with(sq2).select().from(sq2);\n\tExpect<\n\t\tEqual<typeof q3, {\n\t\t\tid: number;\n\t\t\tproductName: string;\n\t\t}[]>\n\t>;\n\tconst q4 = await db.with(sq3).select().from(providers).leftJoin(sq2, sql``);\n\tExpect<\n\t\tEqual<typeof q4, {\n\t\t\tproviders: {\n\t\t\t\tid: number;\n\t\t\t\tproviderName: string;\n\t\t\t};\n\t\t\tinserted_products: {\n\t\t\t\tid: number;\n\t\t\t\tproductName: string;\n\t\t\t} | null;\n\t\t}[]>\n\t>;\n\n\tconst q5 = await db.with(sq3).select().from(sq3);\n\tExpect<Equal<typeof q5, { productName: string }[]>>;\n\tconst q6 = await db.with(sq3).select().from(providers).leftJoin(sq3, sql``);\n\tExpect<\n\t\tEqual<\n\t\t\ttypeof q6,\n\t\t\t{ providers: { id: number; providerName: string }; inserted_products: { productName: string } | null }[]\n\t\t>\n\t>;\n}\n\n{\n\tconst providers = pgTable('providers', {\n\t\tid: serial().primaryKey(),\n\t\tproviderName: text().notNull(),\n\t});\n\tconst products = pgTable('products', {\n\t\tid: serial().primaryKey(),\n\t\tproductName: text().notNull(),\n\t});\n\tconst otherProducts = pgTable('other_products', {\n\t\tid: serial().primaryKey(),\n\t\tproductName: text().notNull(),\n\t});\n\n\tconst sq1 = db.$with('updated_products').as(\n\t\tdb.update(products).set({ productName: sql`` }),\n\t);\n\tconst sq2 = db.$with('updated_products').as(\n\t\tdb.update(products).set({ productName: sql`` }).returning(),\n\t);\n\tconst sq3 = db.$with('updated_products').as(\n\t\tdb.update(products).set({ productName: sql`` }).returning({ productName: products.productName }),\n\t);\n\tconst sq4 = db.$with('updated_products').as(\n\t\tdb.update(products).set({ productName: sql`` }).from(otherProducts).returning(),\n\t);\n\n\t// @ts-expect-error\n\tdb.with(sq1).select().from(sq1);\n\t// @ts-expect-error\n\tdb.with(sq1).select().from(providers).leftJoin(sq1, sql``);\n\n\tconst q3 = await db.with(sq2).select().from(sq2);\n\tExpect<\n\t\tEqual<typeof q3, {\n\t\t\tid: number;\n\t\t\tproductName: string;\n\t\t}[]>\n\t>;\n\tconst q4 = await db.with(sq3).select().from(providers).leftJoin(sq2, sql``);\n\tExpect<\n\t\tEqual<typeof q4, {\n\t\t\tproviders: {\n\t\t\t\tid: number;\n\t\t\t\tproviderName: string;\n\t\t\t};\n\t\t\tupdated_products: {\n\t\t\t\tid: number;\n\t\t\t\tproductName: string;\n\t\t\t} | null;\n\t\t}[]>\n\t>;\n\n\tconst q5 = await db.with(sq3).select().from(sq3);\n\tExpect<\n\t\tEqual<typeof q5, {\n\t\t\tproductName: string;\n\t\t}[]>\n\t>;\n\tconst q6 = await db.with(sq3).select().from(providers).leftJoin(sq3, sql``);\n\tExpect<\n\t\tEqual<typeof q6, {\n\t\t\tproviders: {\n\t\t\t\tid: number;\n\t\t\t\tproviderName: string;\n\t\t\t};\n\t\t\tupdated_products: {\n\t\t\t\tproductName: string;\n\t\t\t} | null;\n\t\t}[]>\n\t>;\n\n\tconst q7 = await db.with(sq4).select().from(sq4);\n\tExpect<\n\t\tEqual<typeof q7, {\n\t\t\tproducts: {\n\t\t\t\tid: number;\n\t\t\t\tproductName: string;\n\t\t\t};\n\t\t\tother_products: {\n\t\t\t\tid: number;\n\t\t\t\tproductName: string;\n\t\t\t};\n\t\t}[]>\n\t>;\n\tconst q8 = await db.with(sq4).select().from(providers).leftJoin(sq4, sql``);\n\tExpect<\n\t\tEqual<typeof q8, {\n\t\t\tproviders: {\n\t\t\t\tid: number;\n\t\t\t\tproviderName: string;\n\t\t\t};\n\t\t\tupdated_products: {\n\t\t\t\tproducts: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tproductName: string;\n\t\t\t\t};\n\t\t\t\tother_products: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tproductName: string;\n\t\t\t\t};\n\t\t\t} | null;\n\t\t}[]>\n\t>;\n}\n\n{\n\tconst providers = pgTable('providers', {\n\t\tid: serial().primaryKey(),\n\t\tproviderName: text().notNull(),\n\t});\n\tconst products = pgTable('products', {\n\t\tid: serial().primaryKey(),\n\t\tproductName: text().notNull(),\n\t});\n\n\tconst sq1 = db.$with('inserted_products').as(\n\t\tdb.delete(products),\n\t);\n\tconst sq2 = db.$with('inserted_products').as(\n\t\tdb.delete(products).returning(),\n\t);\n\tconst sq3 = db.$with('inserted_products').as(\n\t\tdb.delete(products).returning({ productName: products.productName }),\n\t);\n\n\t// @ts-expect-error\n\tdb.with(sq1).select().from(sq1);\n\t// @ts-expect-error\n\tdb.with(sq1).select().from(providers).leftJoin(sq1, sql``);\n\n\tconst q3 = await db.with(sq2).select().from(sq2);\n\tExpect<\n\t\tEqual<typeof q3, {\n\t\t\tid: number;\n\t\t\tproductName: string;\n\t\t}[]>\n\t>;\n\tconst q4 = await db.with(sq3).select().from(providers).leftJoin(sq2, sql``);\n\tExpect<\n\t\tEqual<typeof q4, {\n\t\t\tproviders: {\n\t\t\t\tid: number;\n\t\t\t\tproviderName: string;\n\t\t\t};\n\t\t\tinserted_products: {\n\t\t\t\tid: number;\n\t\t\t\tproductName: string;\n\t\t\t} | null;\n\t\t}[]>\n\t>;\n\n\tconst q5 = await db.with(sq3).select().from(sq3);\n\tExpect<Equal<typeof q5, { productName: string }[]>>;\n\tconst q6 = await db.with(sq3).select().from(providers).leftJoin(sq3, sql``);\n\tExpect<\n\t\tEqual<\n\t\t\ttypeof q6,\n\t\t\t{ providers: { id: number; providerName: string }; inserted_products: { productName: string } | null }[]\n\t\t>\n\t>;\n}\n\n{\n\tconst providers = pgTable('providers', {\n\t\tid: serial().primaryKey(),\n\t\tproviderName: text().notNull(),\n\t});\n\n\tconst sq1 = db.$with('providers_sq', {\n\t\tname: providers.providerName,\n\t}).as(sql`select provider_name as name from providers`);\n\tconst q1 = await db.with(sq1).select().from(sq1);\n\tExpect<Equal<typeof q1, { name: string }[]>>;\n\n\tconst sq2 = db.$with('providers_sq', {\n\t\tnested: {\n\t\t\tid: providers.id,\n\t\t},\n\t}).as(() => sql`select id from providers`);\n\tconst q2 = await db.with(sq2).select().from(sq2);\n\tExpect<Equal<typeof q2, { nested: { id: number } }[]>>;\n\n\t// @ts-expect-error\n\tdb.$with('providers_sq', { name: providers.providerName }).as(db.select().from(providers));\n\t// @ts-expect-error\n\tdb.$with('providers_sq', { name: providers.providerName }).as((qb) => qb.select().from(providers));\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/singlestore/1000columns.ts",
    "content": "import { bigint, double, singlestoreTable, varchar } from '~/singlestore-core/index.ts';\n\nsinglestoreTable('test', {\n\tcol0: double('col1').primaryKey().autoincrement().default(0),\n\tcol1: double('col1').primaryKey().autoincrement().default(0),\n\tcol2: double('col1').primaryKey().autoincrement().default(0),\n\tcol3: double('col1').primaryKey().autoincrement().default(0),\n\tcol4: double('col1').primaryKey().autoincrement().default(0),\n\tcol5: double('col1').primaryKey().autoincrement().default(0),\n\tcol6: double('col1').primaryKey().autoincrement().default(0),\n\tcol8: double('col1').primaryKey().autoincrement().default(0),\n\tcol9: double('col1').primaryKey().autoincrement().default(0),\n\tcol10: double('col1').primaryKey().autoincrement().default(0),\n\tcol11: double('col1').primaryKey().autoincrement().default(0),\n\tcol12: double('col1').primaryKey().autoincrement().default(0),\n\tcol13: double('col1').primaryKey().autoincrement().default(0),\n\tcol14: double('col1').primaryKey().autoincrement().default(0),\n\tcol15: double('col1').primaryKey().autoincrement().default(0),\n\tcol16: double('col1').primaryKey().autoincrement().default(0),\n\tcol18: double('col1').primaryKey().autoincrement().default(0),\n\tcol19: double('col1').primaryKey().autoincrement().default(0),\n\tcol20: double('col1').primaryKey().autoincrement().default(0),\n\tcol21: double('col1').primaryKey().autoincrement().default(0),\n\tcol22: double('col1').primaryKey().autoincrement().default(0),\n\tcol23: double('col1').primaryKey().autoincrement().default(0),\n\tcol24: double('col1').primaryKey().autoincrement().default(0),\n\tcol25: double('col1').primaryKey().autoincrement().default(0),\n\tcol26: double('col1').primaryKey().autoincrement().default(0),\n\tcol28: double('col1').primaryKey().autoincrement().default(0),\n\tcol29: double('col1').primaryKey().autoincrement().default(0),\n\tcol30: double('col1').primaryKey().autoincrement().default(0),\n\tcol31: double('col1').primaryKey().autoincrement().default(0),\n\tcol32: double('col1').primaryKey().autoincrement().default(0),\n\tcol33: double('col1').primaryKey().autoincrement().default(0),\n\tcol34: double('col1').primaryKey().autoincrement().default(0),\n\tcol35: double('col1').primaryKey().autoincrement().default(0),\n\tcol36: double('col1').primaryKey().autoincrement().default(0),\n\tcol38: double('col1').primaryKey().autoincrement().default(0),\n\tcol39: double('col1').primaryKey().autoincrement().default(0),\n\tcol40: double('col1').primaryKey().autoincrement().default(0),\n\tcol41: double('col1').primaryKey().autoincrement().default(0),\n\tcol42: double('col1').primaryKey().autoincrement().default(0),\n\tcol43: double('col1').primaryKey().autoincrement().default(0),\n\tcol44: double('col1').primaryKey().autoincrement().default(0),\n\tcol45: double('col1').primaryKey().autoincrement().default(0),\n\tcol46: double('col1').primaryKey().autoincrement().default(0),\n\tcol48: double('col1').primaryKey().autoincrement().default(0),\n\tcol49: double('col1').primaryKey().autoincrement().default(0),\n\tcol50: double('col1').primaryKey().autoincrement().default(0),\n\tcol51: double('col1').primaryKey().autoincrement().default(0),\n\tcol52: double('col1').primaryKey().autoincrement().default(0),\n\tcol53: double('col1').primaryKey().autoincrement().default(0),\n\tcol54: double('col1').primaryKey().autoincrement().default(0),\n\tcol55: double('col1').primaryKey().autoincrement().default(0),\n\tcol56: double('col1').primaryKey().autoincrement().default(0),\n\tcol58: double('col1').primaryKey().autoincrement().default(0),\n\tcol59: double('col1').primaryKey().autoincrement().default(0),\n\tcol60: double('col1').primaryKey().autoincrement().default(0),\n\tcol61: double('col1').primaryKey().autoincrement().default(0),\n\tcol62: double('col1').primaryKey().autoincrement().default(0),\n\tcol63: double('col1').primaryKey().autoincrement().default(0),\n\tcol64: double('col1').primaryKey().autoincrement().default(0),\n\tcol65: double('col1').primaryKey().autoincrement().default(0),\n\tcol66: double('col1').primaryKey().autoincrement().default(0),\n\tcol68: double('col1').primaryKey().autoincrement().default(0),\n\tcol69: double('col1').primaryKey().autoincrement().default(0),\n\tcol70: double('col1').primaryKey().autoincrement().default(0),\n\tcol71: double('col1').primaryKey().autoincrement().default(0),\n\tcol72: double('col1').primaryKey().autoincrement().default(0),\n\tcol73: double('col1').primaryKey().autoincrement().default(0),\n\tcol74: double('col1').primaryKey().autoincrement().default(0),\n\tcol75: double('col1').primaryKey().autoincrement().default(0),\n\tcol76: double('col1').primaryKey().autoincrement().default(0),\n\tcol78: double('col1').primaryKey().autoincrement().default(0),\n\tcol79: double('col1').primaryKey().autoincrement().default(0),\n\tcol80: double('col1').primaryKey().autoincrement().default(0),\n\tcol81: double('col1').primaryKey().autoincrement().default(0),\n\tcol82: double('col1').primaryKey().autoincrement().default(0),\n\tcol83: double('col1').primaryKey().autoincrement().default(0),\n\tcol84: double('col1').primaryKey().autoincrement().default(0),\n\tcol85: double('col1').primaryKey().autoincrement().default(0),\n\tcol86: double('col1').primaryKey().autoincrement().default(0),\n\tcol88: double('col1').primaryKey().autoincrement().default(0),\n\tcol89: double('col1').primaryKey().autoincrement().default(0),\n\tcol90: double('col1').primaryKey().autoincrement().default(0),\n\tcol91: double('col1').primaryKey().autoincrement().default(0),\n\tcol92: double('col1').primaryKey().autoincrement().default(0),\n\tcol93: double('col1').primaryKey().autoincrement().default(0),\n\tcol94: double('col1').primaryKey().autoincrement().default(0),\n\tcol95: double('col1').primaryKey().autoincrement().default(0),\n\tcol96: double('col1').primaryKey().autoincrement().default(0),\n\tcol98: double('col1').primaryKey().autoincrement().default(0),\n\tcol99: double('col1').primaryKey().autoincrement().default(0),\n\tcol100: double('col1').primaryKey().autoincrement().default(0),\n\tcol101: double('col1').primaryKey().autoincrement().default(0),\n\tcol102: double('col1').primaryKey().autoincrement().default(0),\n\tcol103: double('col1').primaryKey().autoincrement().default(0),\n\tcol104: double('col1').primaryKey().autoincrement().default(0),\n\tcol105: double('col1').primaryKey().autoincrement().default(0),\n\tcol106: double('col1').primaryKey().autoincrement().default(0),\n\tcol108: double('col1').primaryKey().autoincrement().default(0),\n\tcol109: double('col1').primaryKey().autoincrement().default(0),\n\tcol110: double('col11').primaryKey().autoincrement().default(0),\n\tcol111: double('col11').primaryKey().autoincrement().default(0),\n\tcol112: double('col11').primaryKey().autoincrement().default(0),\n\tcol113: double('col11').primaryKey().autoincrement().default(0),\n\tcol114: double('col11').primaryKey().autoincrement().default(0),\n\tcol115: double('col11').primaryKey().autoincrement().default(0),\n\tcol116: double('col11').primaryKey().autoincrement().default(0),\n\tcol118: double('col11').primaryKey().autoincrement().default(0),\n\tcol119: double('col11').primaryKey().autoincrement().default(0),\n\tcol120: double('col11').primaryKey().autoincrement().default(0),\n\tcol121: double('col11').primaryKey().autoincrement().default(0),\n\tcol122: double('col11').primaryKey().autoincrement().default(0),\n\tcol123: double('col11').primaryKey().autoincrement().default(0),\n\tcol124: double('col11').primaryKey().autoincrement().default(0),\n\tcol125: double('col11').primaryKey().autoincrement().default(0),\n\tcol126: double('col11').primaryKey().autoincrement().default(0),\n\tcol128: double('col11').primaryKey().autoincrement().default(0),\n\tcol129: double('col11').primaryKey().autoincrement().default(0),\n\tcol130: double('col11').primaryKey().autoincrement().default(0),\n\tcol131: double('col11').primaryKey().autoincrement().default(0),\n\tcol132: double('col11').primaryKey().autoincrement().default(0),\n\tcol133: double('col11').primaryKey().autoincrement().default(0),\n\tcol134: double('col11').primaryKey().autoincrement().default(0),\n\tcol135: double('col11').primaryKey().autoincrement().default(0),\n\tcol136: double('col11').primaryKey().autoincrement().default(0),\n\tcol138: double('col11').primaryKey().autoincrement().default(0),\n\tcol139: double('col11').primaryKey().autoincrement().default(0),\n\tcol140: double('col11').primaryKey().autoincrement().default(0),\n\tcol141: double('col11').primaryKey().autoincrement().default(0),\n\tcol142: double('col11').primaryKey().autoincrement().default(0),\n\tcol143: double('col11').primaryKey().autoincrement().default(0),\n\tcol144: double('col11').primaryKey().autoincrement().default(0),\n\tcol145: double('col11').primaryKey().autoincrement().default(0),\n\tcol146: double('col11').primaryKey().autoincrement().default(0),\n\tcol148: double('col11').primaryKey().autoincrement().default(0),\n\tcol149: double('col11').primaryKey().autoincrement().default(0),\n\tcol150: double('col11').primaryKey().autoincrement().default(0),\n\tcol151: double('col11').primaryKey().autoincrement().default(0),\n\tcol152: double('col11').primaryKey().autoincrement().default(0),\n\tcol153: double('col11').primaryKey().autoincrement().default(0),\n\tcol154: double('col11').primaryKey().autoincrement().default(0),\n\tcol155: double('col11').primaryKey().autoincrement().default(0),\n\tcol156: double('col11').primaryKey().autoincrement().default(0),\n\tcol158: double('col11').primaryKey().autoincrement().default(0),\n\tcol159: double('col11').primaryKey().autoincrement().default(0),\n\tcol160: double('col11').primaryKey().autoincrement().default(0),\n\tcol161: double('col11').primaryKey().autoincrement().default(0),\n\tcol162: double('col11').primaryKey().autoincrement().default(0),\n\tcol163: double('col11').primaryKey().autoincrement().default(0),\n\tcol164: double('col11').primaryKey().autoincrement().default(0),\n\tcol165: double('col11').primaryKey().autoincrement().default(0),\n\tcol166: double('col11').primaryKey().autoincrement().default(0),\n\tcol168: double('col11').primaryKey().autoincrement().default(0),\n\tcol169: double('col11').primaryKey().autoincrement().default(0),\n\tcol170: double('col11').primaryKey().autoincrement().default(0),\n\tcol171: double('col11').primaryKey().autoincrement().default(0),\n\tcol172: double('col11').primaryKey().autoincrement().default(0),\n\tcol173: double('col11').primaryKey().autoincrement().default(0),\n\tcol174: double('col11').primaryKey().autoincrement().default(0),\n\tcol175: double('col11').primaryKey().autoincrement().default(0),\n\tcol176: double('col11').primaryKey().autoincrement().default(0),\n\tcol178: double('col11').primaryKey().autoincrement().default(0),\n\tcol179: double('col11').primaryKey().autoincrement().default(0),\n\tcol180: double('col11').primaryKey().autoincrement().default(0),\n\tcol181: double('col11').primaryKey().autoincrement().default(0),\n\tcol182: double('col11').primaryKey().autoincrement().default(0),\n\tcol183: double('col11').primaryKey().autoincrement().default(0),\n\tcol184: double('col11').primaryKey().autoincrement().default(0),\n\tcol185: double('col11').primaryKey().autoincrement().default(0),\n\tcol186: double('col11').primaryKey().autoincrement().default(0),\n\tcol188: double('col11').primaryKey().autoincrement().default(0),\n\tcol189: double('col11').primaryKey().autoincrement().default(0),\n\tcol190: double('col11').primaryKey().autoincrement().default(0),\n\tcol191: double('col11').primaryKey().autoincrement().default(0),\n\tcol192: double('col11').primaryKey().autoincrement().default(0),\n\tcol193: double('col11').primaryKey().autoincrement().default(0),\n\tcol194: double('col11').primaryKey().autoincrement().default(0),\n\tcol195: double('col11').primaryKey().autoincrement().default(0),\n\tcol196: double('col11').primaryKey().autoincrement().default(0),\n\tcol198: double('col11').primaryKey().autoincrement().default(0),\n\tcol199: double('col11').primaryKey().autoincrement().default(0),\n\tcol200: double('col2').primaryKey().autoincrement().default(0),\n\tcol201: double('col2').primaryKey().autoincrement().default(0),\n\tcol202: double('col2').primaryKey().autoincrement().default(0),\n\tcol203: double('col2').primaryKey().autoincrement().default(0),\n\tcol204: double('col2').primaryKey().autoincrement().default(0),\n\tcol205: double('col2').primaryKey().autoincrement().default(0),\n\tcol206: double('col2').primaryKey().autoincrement().default(0),\n\tcol208: double('col2').primaryKey().autoincrement().default(0),\n\tcol209: double('col2').primaryKey().autoincrement().default(0),\n\tcol210: double('col21').primaryKey().autoincrement().default(0),\n\tcol211: double('col21').primaryKey().autoincrement().default(0),\n\tcol212: double('col21').primaryKey().autoincrement().default(0),\n\tcol213: double('col21').primaryKey().autoincrement().default(0),\n\tcol214: double('col21').primaryKey().autoincrement().default(0),\n\tcol215: double('col21').primaryKey().autoincrement().default(0),\n\tcol216: double('col21').primaryKey().autoincrement().default(0),\n\tcol218: double('col21').primaryKey().autoincrement().default(0),\n\tcol219: double('col21').primaryKey().autoincrement().default(0),\n\tcol220: double('col21').primaryKey().autoincrement().default(0),\n\tcol221: double('col21').primaryKey().autoincrement().default(0),\n\tcol222: double('col21').primaryKey().autoincrement().default(0),\n\tcol223: double('col21').primaryKey().autoincrement().default(0),\n\tcol224: double('col21').primaryKey().autoincrement().default(0),\n\tcol225: double('col21').primaryKey().autoincrement().default(0),\n\tcol226: double('col21').primaryKey().autoincrement().default(0),\n\tcol228: double('col21').primaryKey().autoincrement().default(0),\n\tcol229: double('col21').primaryKey().autoincrement().default(0),\n\tcol230: double('col21').primaryKey().autoincrement().default(0),\n\tcol231: double('col21').primaryKey().autoincrement().default(0),\n\tcol232: double('col21').primaryKey().autoincrement().default(0),\n\tcol233: double('col21').primaryKey().autoincrement().default(0),\n\tcol234: double('col21').primaryKey().autoincrement().default(0),\n\tcol235: double('col21').primaryKey().autoincrement().default(0),\n\tcol236: double('col21').primaryKey().autoincrement().default(0),\n\tcol238: double('col21').primaryKey().autoincrement().default(0),\n\tcol239: double('col21').primaryKey().autoincrement().default(0),\n\tcol240: double('col21').primaryKey().autoincrement().default(0),\n\tcol241: double('col21').primaryKey().autoincrement().default(0),\n\tcol242: double('col21').primaryKey().autoincrement().default(0),\n\tcol243: double('col21').primaryKey().autoincrement().default(0),\n\tcol244: double('col21').primaryKey().autoincrement().default(0),\n\tcol245: double('col21').primaryKey().autoincrement().default(0),\n\tcol246: double('col21').primaryKey().autoincrement().default(0),\n\tcol248: double('col21').primaryKey().autoincrement().default(0),\n\tcol249: double('col21').primaryKey().autoincrement().default(0),\n\tcol250: double('col21').primaryKey().autoincrement().default(0),\n\tcol251: double('col21').primaryKey().autoincrement().default(0),\n\tcol252: double('col21').primaryKey().autoincrement().default(0),\n\tcol253: double('col21').primaryKey().autoincrement().default(0),\n\tcol254: double('col21').primaryKey().autoincrement().default(0),\n\tcol255: double('col21').primaryKey().autoincrement().default(0),\n\tcol256: double('col21').primaryKey().autoincrement().default(0),\n\tcol258: double('col21').primaryKey().autoincrement().default(0),\n\tcol259: double('col21').primaryKey().autoincrement().default(0),\n\tcol260: double('col21').primaryKey().autoincrement().default(0),\n\tcol261: double('col21').primaryKey().autoincrement().default(0),\n\tcol262: double('col21').primaryKey().autoincrement().default(0),\n\tcol263: double('col21').primaryKey().autoincrement().default(0),\n\tcol264: double('col21').primaryKey().autoincrement().default(0),\n\tcol265: double('col21').primaryKey().autoincrement().default(0),\n\tcol266: double('col21').primaryKey().autoincrement().default(0),\n\tcol268: double('col21').primaryKey().autoincrement().default(0),\n\tcol269: double('col21').primaryKey().autoincrement().default(0),\n\tcol270: double('col21').primaryKey().autoincrement().default(0),\n\tcol271: double('col21').primaryKey().autoincrement().default(0),\n\tcol272: double('col21').primaryKey().autoincrement().default(0),\n\tcol273: double('col21').primaryKey().autoincrement().default(0),\n\tcol274: double('col21').primaryKey().autoincrement().default(0),\n\tcol275: double('col21').primaryKey().autoincrement().default(0),\n\tcol276: double('col21').primaryKey().autoincrement().default(0),\n\tcol278: double('col21').primaryKey().autoincrement().default(0),\n\tcol279: double('col21').primaryKey().autoincrement().default(0),\n\tcol280: double('col21').primaryKey().autoincrement().default(0),\n\tcol281: double('col21').primaryKey().autoincrement().default(0),\n\tcol282: double('col21').primaryKey().autoincrement().default(0),\n\tcol283: double('col21').primaryKey().autoincrement().default(0),\n\tcol284: double('col21').primaryKey().autoincrement().default(0),\n\tcol285: double('col21').primaryKey().autoincrement().default(0),\n\tcol286: double('col21').primaryKey().autoincrement().default(0),\n\tcol288: double('col21').primaryKey().autoincrement().default(0),\n\tcol289: double('col21').primaryKey().autoincrement().default(0),\n\tcol290: double('col21').primaryKey().autoincrement().default(0),\n\tcol291: double('col21').primaryKey().autoincrement().default(0),\n\tcol292: double('col21').primaryKey().autoincrement().default(0),\n\tcol293: double('col21').primaryKey().autoincrement().default(0),\n\tcol294: double('col21').primaryKey().autoincrement().default(0),\n\tcol295: double('col21').primaryKey().autoincrement().default(0),\n\tcol296: double('col21').primaryKey().autoincrement().default(0),\n\tcol298: double('col21').primaryKey().autoincrement().default(0),\n\tcol299: double('col21').primaryKey().autoincrement().default(0),\n\tcol300: double('col3').primaryKey().autoincrement().default(0),\n\tcol301: double('col3').primaryKey().autoincrement().default(0),\n\tcol302: double('col3').primaryKey().autoincrement().default(0),\n\tcol303: double('col3').primaryKey().autoincrement().default(0),\n\tcol304: double('col3').primaryKey().autoincrement().default(0),\n\tcol305: double('col3').primaryKey().autoincrement().default(0),\n\tcol306: double('col3').primaryKey().autoincrement().default(0),\n\tcol308: double('col3').primaryKey().autoincrement().default(0),\n\tcol309: double('col3').primaryKey().autoincrement().default(0),\n\tcol310: double('col31').primaryKey().autoincrement().default(0),\n\tcol311: double('col31').primaryKey().autoincrement().default(0),\n\tcol312: double('col31').primaryKey().autoincrement().default(0),\n\tcol313: double('col31').primaryKey().autoincrement().default(0),\n\tcol314: double('col31').primaryKey().autoincrement().default(0),\n\tcol315: double('col31').primaryKey().autoincrement().default(0),\n\tcol316: double('col31').primaryKey().autoincrement().default(0),\n\tcol318: double('col31').primaryKey().autoincrement().default(0),\n\tcol319: double('col31').primaryKey().autoincrement().default(0),\n\tcol320: double('col31').primaryKey().autoincrement().default(0),\n\tcol321: double('col31').primaryKey().autoincrement().default(0),\n\tcol322: double('col31').primaryKey().autoincrement().default(0),\n\tcol323: double('col31').primaryKey().autoincrement().default(0),\n\tcol324: double('col31').primaryKey().autoincrement().default(0),\n\tcol325: double('col31').primaryKey().autoincrement().default(0),\n\tcol326: double('col31').primaryKey().autoincrement().default(0),\n\tcol328: double('col31').primaryKey().autoincrement().default(0),\n\tcol329: double('col31').primaryKey().autoincrement().default(0),\n\tcol330: double('col31').primaryKey().autoincrement().default(0),\n\tcol331: double('col31').primaryKey().autoincrement().default(0),\n\tcol332: double('col31').primaryKey().autoincrement().default(0),\n\tcol333: double('col31').primaryKey().autoincrement().default(0),\n\tcol334: double('col31').primaryKey().autoincrement().default(0),\n\tcol335: double('col31').primaryKey().autoincrement().default(0),\n\tcol336: double('col31').primaryKey().autoincrement().default(0),\n\tcol338: double('col31').primaryKey().autoincrement().default(0),\n\tcol339: double('col31').primaryKey().autoincrement().default(0),\n\tcol340: double('col31').primaryKey().autoincrement().default(0),\n\tcol341: double('col31').primaryKey().autoincrement().default(0),\n\tcol342: double('col31').primaryKey().autoincrement().default(0),\n\tcol343: double('col31').primaryKey().autoincrement().default(0),\n\tcol344: double('col31').primaryKey().autoincrement().default(0),\n\tcol345: double('col31').primaryKey().autoincrement().default(0),\n\tcol346: double('col31').primaryKey().autoincrement().default(0),\n\tcol348: double('col31').primaryKey().autoincrement().default(0),\n\tcol349: double('col31').primaryKey().autoincrement().default(0),\n\tcol350: double('col31').primaryKey().autoincrement().default(0),\n\tcol351: double('col31').primaryKey().autoincrement().default(0),\n\tcol352: double('col31').primaryKey().autoincrement().default(0),\n\tcol353: double('col31').primaryKey().autoincrement().default(0),\n\tcol354: double('col31').primaryKey().autoincrement().default(0),\n\tcol355: double('col31').primaryKey().autoincrement().default(0),\n\tcol356: double('col31').primaryKey().autoincrement().default(0),\n\tcol358: double('col31').primaryKey().autoincrement().default(0),\n\tcol359: double('col31').primaryKey().autoincrement().default(0),\n\tcol360: double('col31').primaryKey().autoincrement().default(0),\n\tcol361: double('col31').primaryKey().autoincrement().default(0),\n\tcol362: double('col31').primaryKey().autoincrement().default(0),\n\tcol363: double('col31').primaryKey().autoincrement().default(0),\n\tcol364: double('col31').primaryKey().autoincrement().default(0),\n\tcol365: double('col31').primaryKey().autoincrement().default(0),\n\tcol366: double('col31').primaryKey().autoincrement().default(0),\n\tcol368: double('col31').primaryKey().autoincrement().default(0),\n\tcol369: double('col31').primaryKey().autoincrement().default(0),\n\tcol370: double('col31').primaryKey().autoincrement().default(0),\n\tcol371: double('col31').primaryKey().autoincrement().default(0),\n\tcol372: double('col31').primaryKey().autoincrement().default(0),\n\tcol373: double('col31').primaryKey().autoincrement().default(0),\n\tcol374: double('col31').primaryKey().autoincrement().default(0),\n\tcol375: double('col31').primaryKey().autoincrement().default(0),\n\tcol376: double('col31').primaryKey().autoincrement().default(0),\n\tcol378: double('col31').primaryKey().autoincrement().default(0),\n\tcol379: double('col31').primaryKey().autoincrement().default(0),\n\tcol380: double('col31').primaryKey().autoincrement().default(0),\n\tcol381: double('col31').primaryKey().autoincrement().default(0),\n\tcol382: double('col31').primaryKey().autoincrement().default(0),\n\tcol383: double('col31').primaryKey().autoincrement().default(0),\n\tcol384: double('col31').primaryKey().autoincrement().default(0),\n\tcol385: double('col31').primaryKey().autoincrement().default(0),\n\tcol386: double('col31').primaryKey().autoincrement().default(0),\n\tcol388: double('col31').primaryKey().autoincrement().default(0),\n\tcol389: double('col31').primaryKey().autoincrement().default(0),\n\tcol390: double('col31').primaryKey().autoincrement().default(0),\n\tcol391: double('col31').primaryKey().autoincrement().default(0),\n\tcol392: double('col31').primaryKey().autoincrement().default(0),\n\tcol393: double('col31').primaryKey().autoincrement().default(0),\n\tcol394: double('col31').primaryKey().autoincrement().default(0),\n\tcol395: double('col31').primaryKey().autoincrement().default(0),\n\tcol396: double('col31').primaryKey().autoincrement().default(0),\n\tcol398: double('col31').primaryKey().autoincrement().default(0),\n\tcol399: double('col31').primaryKey().autoincrement().default(0),\n\tcol400: double('col4').primaryKey().autoincrement().default(0),\n\tcol401: double('col4').primaryKey().autoincrement().default(0),\n\tcol402: double('col4').primaryKey().autoincrement().default(0),\n\tcol403: double('col4').primaryKey().autoincrement().default(0),\n\tcol404: double('col4').primaryKey().autoincrement().default(0),\n\tcol405: double('col4').primaryKey().autoincrement().default(0),\n\tcol406: double('col4').primaryKey().autoincrement().default(0),\n\tcol408: double('col4').primaryKey().autoincrement().default(0),\n\tcol409: double('col4').primaryKey().autoincrement().default(0),\n\tcol410: double('col41').primaryKey().autoincrement().default(0),\n\tcol411: double('col41').primaryKey().autoincrement().default(0),\n\tcol412: double('col41').primaryKey().autoincrement().default(0),\n\tcol413: double('col41').primaryKey().autoincrement().default(0),\n\tcol414: double('col41').primaryKey().autoincrement().default(0),\n\tcol415: double('col41').primaryKey().autoincrement().default(0),\n\tcol416: double('col41').primaryKey().autoincrement().default(0),\n\tcol418: double('col41').primaryKey().autoincrement().default(0),\n\tcol419: double('col41').primaryKey().autoincrement().default(0),\n\tcol420: double('col41').primaryKey().autoincrement().default(0),\n\tcol421: double('col41').primaryKey().autoincrement().default(0),\n\tcol422: double('col41').primaryKey().autoincrement().default(0),\n\tcol423: double('col41').primaryKey().autoincrement().default(0),\n\tcol424: double('col41').primaryKey().autoincrement().default(0),\n\tcol425: double('col41').primaryKey().autoincrement().default(0),\n\tcol426: double('col41').primaryKey().autoincrement().default(0),\n\tcol428: double('col41').primaryKey().autoincrement().default(0),\n\tcol429: double('col41').primaryKey().autoincrement().default(0),\n\tcol430: double('col41').primaryKey().autoincrement().default(0),\n\tcol431: double('col41').primaryKey().autoincrement().default(0),\n\tcol432: double('col41').primaryKey().autoincrement().default(0),\n\tcol433: double('col41').primaryKey().autoincrement().default(0),\n\tcol434: double('col41').primaryKey().autoincrement().default(0),\n\tcol435: double('col41').primaryKey().autoincrement().default(0),\n\tcol436: double('col41').primaryKey().autoincrement().default(0),\n\tcol438: double('col41').primaryKey().autoincrement().default(0),\n\tcol439: double('col41').primaryKey().autoincrement().default(0),\n\tcol440: double('col41').primaryKey().autoincrement().default(0),\n\tcol441: double('col41').primaryKey().autoincrement().default(0),\n\tcol442: double('col41').primaryKey().autoincrement().default(0),\n\tcol443: double('col41').primaryKey().autoincrement().default(0),\n\tcol444: double('col41').primaryKey().autoincrement().default(0),\n\tcol445: double('col41').primaryKey().autoincrement().default(0),\n\tcol446: double('col41').primaryKey().autoincrement().default(0),\n\tcol448: double('col41').primaryKey().autoincrement().default(0),\n\tcol449: double('col41').primaryKey().autoincrement().default(0),\n\tcol450: double('col41').primaryKey().autoincrement().default(0),\n\tcol451: double('col41').primaryKey().autoincrement().default(0),\n\tcol452: double('col41').primaryKey().autoincrement().default(0),\n\tcol453: double('col41').primaryKey().autoincrement().default(0),\n\tcol454: double('col41').primaryKey().autoincrement().default(0),\n\tcol455: double('col41').primaryKey().autoincrement().default(0),\n\tcol456: double('col41').primaryKey().autoincrement().default(0),\n\tcol458: double('col41').primaryKey().autoincrement().default(0),\n\tcol459: double('col41').primaryKey().autoincrement().default(0),\n\tcol460: double('col41').primaryKey().autoincrement().default(0),\n\tcol461: double('col41').primaryKey().autoincrement().default(0),\n\tcol462: double('col41').primaryKey().autoincrement().default(0),\n\tcol463: double('col41').primaryKey().autoincrement().default(0),\n\tcol464: double('col41').primaryKey().autoincrement().default(0),\n\tcol465: double('col41').primaryKey().autoincrement().default(0),\n\tcol466: double('col41').primaryKey().autoincrement().default(0),\n\tcol468: double('col41').primaryKey().autoincrement().default(0),\n\tcol469: double('col41').primaryKey().autoincrement().default(0),\n\tcol470: double('col41').primaryKey().autoincrement().default(0),\n\tcol471: double('col41').primaryKey().autoincrement().default(0),\n\tcol472: double('col41').primaryKey().autoincrement().default(0),\n\tcol473: double('col41').primaryKey().autoincrement().default(0),\n\tcol474: double('col41').primaryKey().autoincrement().default(0),\n\tcol475: double('col41').primaryKey().autoincrement().default(0),\n\tcol476: double('col41').primaryKey().autoincrement().default(0),\n\tcol478: double('col41').primaryKey().autoincrement().default(0),\n\tcol479: double('col41').primaryKey().autoincrement().default(0),\n\tcol480: double('col41').primaryKey().autoincrement().default(0),\n\tcol481: double('col41').primaryKey().autoincrement().default(0),\n\tcol482: double('col41').primaryKey().autoincrement().default(0),\n\tcol483: double('col41').primaryKey().autoincrement().default(0),\n\tcol484: double('col41').primaryKey().autoincrement().default(0),\n\tcol485: double('col41').primaryKey().autoincrement().default(0),\n\tcol486: double('col41').primaryKey().autoincrement().default(0),\n\tcol488: double('col41').primaryKey().autoincrement().default(0),\n\tcol489: double('col41').primaryKey().autoincrement().default(0),\n\tcol490: double('col41').primaryKey().autoincrement().default(0),\n\tcol491: double('col41').primaryKey().autoincrement().default(0),\n\tcol492: double('col41').primaryKey().autoincrement().default(0),\n\tcol493: double('col41').primaryKey().autoincrement().default(0),\n\tcol494: double('col41').primaryKey().autoincrement().default(0),\n\tcol495: double('col41').primaryKey().autoincrement().default(0),\n\tcol496: double('col41').primaryKey().autoincrement().default(0),\n\tcol498: double('col41').primaryKey().autoincrement().default(0),\n\tcol499: double('col41').primaryKey().autoincrement().default(0),\n\tcol500: double('col5').primaryKey().autoincrement().default(0),\n\tcol501: double('col5').primaryKey().autoincrement().default(0),\n\tcol502: double('col5').primaryKey().autoincrement().default(0),\n\tcol503: double('col5').primaryKey().autoincrement().default(0),\n\tcol504: double('col5').primaryKey().autoincrement().default(0),\n\tcol505: double('col5').primaryKey().autoincrement().default(0),\n\tcol506: double('col5').primaryKey().autoincrement().default(0),\n\tcol508: double('col5').primaryKey().autoincrement().default(0),\n\tcol509: double('col5').primaryKey().autoincrement().default(0),\n\tcol510: double('col51').primaryKey().autoincrement().default(0),\n\tcol511: double('col51').primaryKey().autoincrement().default(0),\n\tcol512: double('col51').primaryKey().autoincrement().default(0),\n\tcol513: double('col51').primaryKey().autoincrement().default(0),\n\tcol514: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol515: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol516: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol518: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol519: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol520: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol521: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol522: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol523: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol524: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol525: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol526: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol528: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol529: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol530: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol531: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol532: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol533: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol534: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol535: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol536: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol538: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol539: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol540: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol541: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol542: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol543: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol544: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol545: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol546: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol548: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol549: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol550: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol551: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol552: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol553: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol554: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol555: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol556: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol558: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol559: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol560: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol561: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol562: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol563: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol564: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol565: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol566: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol568: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol569: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol570: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol571: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol572: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol573: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol574: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol575: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol576: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol578: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol579: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol580: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol581: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol582: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol583: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol584: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol585: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol586: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol588: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol589: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol590: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol591: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol592: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol593: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol594: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol595: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol596: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol598: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol599: bigint('col51', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol600: bigint('col6', { mode: 'number' }).primaryKey().autoincrement().default(0),\n\tcol601: double('col6').primaryKey().autoincrement().default(0),\n\tcol602: double('col6').primaryKey().autoincrement().default(0),\n\tcol603: double('col6').primaryKey().autoincrement().default(0),\n\tcol604: double('col6').primaryKey().autoincrement().default(0),\n\tcol605: double('col6').primaryKey().autoincrement().default(0),\n\tcol606: double('col6').primaryKey().autoincrement().default(0),\n\tcol608: double('col6').primaryKey().autoincrement().default(0),\n\tcol609: double('col6').primaryKey().autoincrement().default(0),\n\tcol610: double('col61').primaryKey().autoincrement().default(0),\n\tcol611: double('col61').primaryKey().autoincrement().default(0),\n\tcol612: double('col61').primaryKey().autoincrement().default(0),\n\tcol613: double('col61').primaryKey().autoincrement().default(0),\n\tcol614: double('col61').primaryKey().autoincrement().default(0),\n\tcol615: double('col61').primaryKey().autoincrement().default(0),\n\tcol616: double('col61').primaryKey().autoincrement().default(0),\n\tcol618: double('col61').primaryKey().autoincrement().default(0),\n\tcol619: double('col61').primaryKey().autoincrement().default(0),\n\tcol620: double('col61').primaryKey().autoincrement().default(0),\n\tcol621: double('col61').primaryKey().autoincrement().default(0),\n\tcol622: double('col61').primaryKey().autoincrement().default(0),\n\tcol623: double('col61').primaryKey().autoincrement().default(0),\n\tcol624: double('col61').primaryKey().autoincrement().default(0),\n\tcol625: double('col61').primaryKey().autoincrement().default(0),\n\tcol626: double('col61').primaryKey().autoincrement().default(0),\n\tcol628: double('col61').primaryKey().autoincrement().default(0),\n\tcol629: double('col61').primaryKey().autoincrement().default(0),\n\tcol630: double('col61').primaryKey().autoincrement().default(0),\n\tcol631: double('col61').primaryKey().autoincrement().default(0),\n\tcol632: double('col61').primaryKey().autoincrement().default(0),\n\tcol633: double('col61').primaryKey().autoincrement().default(0),\n\tcol634: double('col61').primaryKey().autoincrement().default(0),\n\tcol635: double('col61').primaryKey().autoincrement().default(0),\n\tcol636: double('col61').primaryKey().autoincrement().default(0),\n\tcol638: double('col61').primaryKey().autoincrement().default(0),\n\tcol639: double('col61').primaryKey().autoincrement().default(0),\n\tcol640: double('col61').primaryKey().autoincrement().default(0),\n\tcol641: double('col61').primaryKey().autoincrement().default(0),\n\tcol642: double('col61').primaryKey().autoincrement().default(0),\n\tcol643: double('col61').primaryKey().autoincrement().default(0),\n\tcol644: double('col61').primaryKey().autoincrement().default(0),\n\tcol645: double('col61').primaryKey().autoincrement().default(0),\n\tcol646: double('col61').primaryKey().autoincrement().default(0),\n\tcol648: double('col61').primaryKey().autoincrement().default(0),\n\tcol649: double('col61').primaryKey().autoincrement().default(0),\n\tcol650: double('col61').primaryKey().autoincrement().default(0),\n\tcol651: double('col61').primaryKey().autoincrement().default(0),\n\tcol652: double('col61').primaryKey().autoincrement().default(0),\n\tcol653: double('col61').primaryKey().autoincrement().default(0),\n\tcol654: double('col61').primaryKey().autoincrement().default(0),\n\tcol655: double('col61').primaryKey().autoincrement().default(0),\n\tcol656: double('col61').primaryKey().autoincrement().default(0),\n\tcol658: double('col61').primaryKey().autoincrement().default(0),\n\tcol659: double('col61').primaryKey().autoincrement().default(0),\n\tcol660: double('col61').primaryKey().autoincrement().default(0),\n\tcol661: double('col61').primaryKey().autoincrement().default(0),\n\tcol662: double('col61').primaryKey().autoincrement().default(0),\n\tcol663: double('col61').primaryKey().autoincrement().default(0),\n\tcol664: double('col61').primaryKey().autoincrement().default(0),\n\tcol665: double('col61').primaryKey().autoincrement().default(0),\n\tcol666: double('col61').primaryKey().autoincrement().default(0),\n\tcol668: double('col61').primaryKey().autoincrement().default(0),\n\tcol669: double('col61').primaryKey().autoincrement().default(0),\n\tcol670: double('col61').primaryKey().autoincrement().default(0),\n\tcol671: double('col61').primaryKey().autoincrement().default(0),\n\tcol672: double('col61').primaryKey().autoincrement().default(0),\n\tcol673: double('col61').primaryKey().autoincrement().default(0),\n\tcol674: double('col61').primaryKey().autoincrement().default(0),\n\tcol675: double('col61').primaryKey().autoincrement().default(0),\n\tcol676: double('col61').primaryKey().autoincrement().default(0),\n\tcol678: double('col61').primaryKey().autoincrement().default(0),\n\tcol679: double('col61').primaryKey().autoincrement().default(0),\n\tcol680: double('col61').primaryKey().autoincrement().default(0),\n\tcol681: double('col61').primaryKey().autoincrement().default(0),\n\tcol682: double('col61').primaryKey().autoincrement().default(0),\n\tcol683: double('col61').primaryKey().autoincrement().default(0),\n\tcol684: double('col61').primaryKey().autoincrement().default(0),\n\tcol685: double('col61').primaryKey().autoincrement().default(0),\n\tcol686: double('col61').primaryKey().autoincrement().default(0),\n\tcol688: double('col61').primaryKey().autoincrement().default(0),\n\tcol689: double('col61').primaryKey().autoincrement().default(0),\n\tcol690: double('col61').primaryKey().autoincrement().default(0),\n\tcol691: double('col61').primaryKey().autoincrement().default(0),\n\tcol692: double('col61').primaryKey().autoincrement().default(0),\n\tcol693: double('col61').primaryKey().autoincrement().default(0),\n\tcol694: double('col61').primaryKey().autoincrement().default(0),\n\tcol695: double('col61').primaryKey().autoincrement().default(0),\n\tcol696: double('col61').primaryKey().autoincrement().default(0),\n\tcol698: double('col61').primaryKey().autoincrement().default(0),\n\tcol699: double('col61').primaryKey().autoincrement().default(0),\n\tcol700: double('col7').primaryKey().autoincrement().default(0),\n\tcol701: double('col7').primaryKey().autoincrement().default(0),\n\tcol702: double('col7').primaryKey().autoincrement().default(0),\n\tcol703: double('col7').primaryKey().autoincrement().default(0),\n\tcol704: double('col7').primaryKey().autoincrement().default(0),\n\tcol705: double('col7').primaryKey().autoincrement().default(0),\n\tcol706: double('col7').primaryKey().autoincrement().default(0),\n\tcol708: double('col7').primaryKey().autoincrement().default(0),\n\tcol709: double('col7').primaryKey().autoincrement().default(0),\n\tcol710: double('col71').primaryKey().autoincrement().default(0),\n\tcol711: double('col71').primaryKey().autoincrement().default(0),\n\tcol712: double('col71').primaryKey().autoincrement().default(0),\n\tcol713: double('col71').primaryKey().autoincrement().default(0),\n\tcol714: double('col71').primaryKey().autoincrement().default(0),\n\tcol715: double('col71').primaryKey().autoincrement().default(0),\n\tcol716: double('col71').primaryKey().autoincrement().default(0),\n\tcol718: double('col71').primaryKey().autoincrement().default(0),\n\tcol719: double('col71').primaryKey().autoincrement().default(0),\n\tcol720: double('col71').primaryKey().autoincrement().default(0),\n\tcol721: double('col71').primaryKey().autoincrement().default(0),\n\tcol722: double('col71').primaryKey().autoincrement().default(0),\n\tcol723: double('col71').primaryKey().autoincrement().default(0),\n\tcol724: double('col71').primaryKey().autoincrement().default(0),\n\tcol725: double('col71').primaryKey().autoincrement().default(0),\n\tcol726: double('col71').primaryKey().autoincrement().default(0),\n\tcol728: double('col71').primaryKey().autoincrement().default(0),\n\tcol729: double('col71').primaryKey().autoincrement().default(0),\n\tcol730: double('col71').primaryKey().autoincrement().default(0),\n\tcol731: double('col71').primaryKey().autoincrement().default(0),\n\tcol732: double('col71').primaryKey().autoincrement().default(0),\n\tcol733: double('col71').primaryKey().autoincrement().default(0),\n\tcol734: double('col71').primaryKey().autoincrement().default(0),\n\tcol735: double('col71').primaryKey().autoincrement().default(0),\n\tcol736: double('col71').primaryKey().autoincrement().default(0),\n\tcol738: double('col71').primaryKey().autoincrement().default(0),\n\tcol739: double('col71').primaryKey().autoincrement().default(0),\n\tcol740: double('col71').primaryKey().autoincrement().default(0),\n\tcol741: double('col71').primaryKey().autoincrement().default(0),\n\tcol742: double('col71').primaryKey().autoincrement().default(0),\n\tcol743: double('col71').primaryKey().autoincrement().default(0),\n\tcol744: double('col71').primaryKey().autoincrement().default(0),\n\tcol745: double('col71').primaryKey().autoincrement().default(0),\n\tcol746: double('col71').primaryKey().autoincrement().default(0),\n\tcol748: double('col71').primaryKey().autoincrement().default(0),\n\tcol749: double('col71').primaryKey().autoincrement().default(0),\n\tcol750: double('col71').primaryKey().autoincrement().default(0),\n\tcol751: double('col71').primaryKey().autoincrement().default(0),\n\tcol752: double('col71').primaryKey().autoincrement().default(0),\n\tcol753: double('col71').primaryKey().autoincrement().default(0),\n\tcol754: double('col71').primaryKey().autoincrement().default(0),\n\tcol755: double('col71').primaryKey().autoincrement().default(0),\n\tcol756: double('col71').primaryKey().autoincrement().default(0),\n\tcol758: double('col71').primaryKey().autoincrement().default(0),\n\tcol759: double('col71').primaryKey().autoincrement().default(0),\n\tcol760: double('col71').primaryKey().autoincrement().default(0),\n\tcol761: double('col71').primaryKey().autoincrement().default(0),\n\tcol762: double('col71').primaryKey().autoincrement().default(0),\n\tcol763: double('col71').primaryKey().autoincrement().default(0),\n\tcol764: double('col71').primaryKey().autoincrement().default(0),\n\tcol765: double('col71').primaryKey().autoincrement().default(0),\n\tcol766: double('col71').primaryKey().autoincrement().default(0),\n\tcol768: double('col71').primaryKey().autoincrement().default(0),\n\tcol769: double('col71').primaryKey().autoincrement().default(0),\n\tcol770: double('col71').primaryKey().autoincrement().default(0),\n\tcol771: double('col71').primaryKey().autoincrement().default(0),\n\tcol772: double('col71').primaryKey().autoincrement().default(0),\n\tcol773: double('col71').primaryKey().autoincrement().default(0),\n\tcol774: double('col71').primaryKey().autoincrement().default(0),\n\tcol775: double('col71').primaryKey().autoincrement().default(0),\n\tcol776: double('col71').primaryKey().autoincrement().default(0),\n\tcol778: double('col71').primaryKey().autoincrement().default(0),\n\tcol779: double('col71').primaryKey().autoincrement().default(0),\n\tcol780: double('col71').primaryKey().autoincrement().default(0),\n\tcol781: double('col71').primaryKey().autoincrement().default(0),\n\tcol782: double('col71').primaryKey().autoincrement().default(0),\n\tcol783: double('col71').primaryKey().autoincrement().default(0),\n\tcol784: double('col71').primaryKey().autoincrement().default(0),\n\tcol785: double('col71').primaryKey().autoincrement().default(0),\n\tcol786: double('col71').primaryKey().autoincrement().default(0),\n\tcol788: double('col71').primaryKey().autoincrement().default(0),\n\tcol789: double('col71').primaryKey().autoincrement().default(0),\n\tcol790: double('col71').primaryKey().autoincrement().default(0),\n\tcol791: double('col71').primaryKey().autoincrement().default(0),\n\tcol792: double('col71').primaryKey().autoincrement().default(0),\n\tcol793: double('col71').primaryKey().autoincrement().default(0),\n\tcol794: double('col71').primaryKey().autoincrement().default(0),\n\tcol795: double('col71').primaryKey().autoincrement().default(0),\n\tcol796: double('col71').primaryKey().autoincrement().default(0),\n\tcol798: double('col71').primaryKey().autoincrement().default(0),\n\tcol799: double('col71').primaryKey().autoincrement().default(0),\n\tcol800: double('col8').primaryKey().autoincrement().default(0),\n\tcol801: double('col8').primaryKey().autoincrement().default(0),\n\tcol802: double('col8').primaryKey().autoincrement().default(0),\n\tcol803: double('col8').primaryKey().autoincrement().default(0),\n\tcol804: double('col8').primaryKey().autoincrement().default(0),\n\tcol805: double('col8').primaryKey().autoincrement().default(0),\n\tcol806: double('col8').primaryKey().autoincrement().default(0),\n\tcol808: double('col8').primaryKey().autoincrement().default(0),\n\tcol809: double('col8').primaryKey().autoincrement().default(0),\n\tcol810: double('col81').primaryKey().autoincrement().default(0),\n\tcol811: double('col81').primaryKey().autoincrement().default(0),\n\tcol812: double('col81').primaryKey().autoincrement().default(0),\n\tcol813: double('col81').primaryKey().autoincrement().default(0),\n\tcol814: double('col81').primaryKey().autoincrement().default(0),\n\tcol815: double('col81').primaryKey().autoincrement().default(0),\n\tcol816: double('col81').primaryKey().autoincrement().default(0),\n\tcol818: double('col81').primaryKey().autoincrement().default(0),\n\tcol819: double('col81').primaryKey().autoincrement().default(0),\n\tcol820: double('col81').primaryKey().autoincrement().default(0),\n\tcol821: double('col81').primaryKey().autoincrement().default(0),\n\tcol822: double('col81').primaryKey().autoincrement().default(0),\n\tcol823: double('col81').primaryKey().autoincrement().default(0),\n\tcol824: double('col81').primaryKey().autoincrement().default(0),\n\tcol825: double('col81').primaryKey().autoincrement().default(0),\n\tcol826: double('col81').primaryKey().autoincrement().default(0),\n\tcol828: double('col81').primaryKey().autoincrement().default(0),\n\tcol829: double('col81').primaryKey().autoincrement().default(0),\n\tcol830: double('col81').primaryKey().autoincrement().default(0),\n\tcol831: double('col81').primaryKey().autoincrement().default(0),\n\tcol832: double('col81').primaryKey().autoincrement().default(0),\n\tcol833: double('col81').primaryKey().autoincrement().default(0),\n\tcol834: double('col81').primaryKey().autoincrement().default(0),\n\tcol835: double('col81').primaryKey().autoincrement().default(0),\n\tcol836: double('col81').primaryKey().autoincrement().default(0),\n\tcol838: double('col81').primaryKey().autoincrement().default(0),\n\tcol839: double('col81').primaryKey().autoincrement().default(0),\n\tcol840: double('col81').primaryKey().autoincrement().default(0),\n\tcol841: double('col81').primaryKey().autoincrement().default(0),\n\tcol842: double('col81').primaryKey().autoincrement().default(0),\n\tcol843: double('col81').primaryKey().autoincrement().default(0),\n\tcol844: double('col81').primaryKey().autoincrement().default(0),\n\tcol845: double('col81').primaryKey().autoincrement().default(0),\n\tcol846: double('col81').primaryKey().autoincrement().default(0),\n\tcol848: double('col81').primaryKey().autoincrement().default(0),\n\tcol849: double('col81').primaryKey().autoincrement().default(0),\n\tcol850: double('col81').primaryKey().autoincrement().default(0),\n\tcol851: double('col81').primaryKey().autoincrement().default(0),\n\tcol852: double('col81').primaryKey().autoincrement().default(0),\n\tcol853: double('col81').primaryKey().autoincrement().default(0),\n\tcol854: double('col81').primaryKey().autoincrement().default(0),\n\tcol855: double('col81').primaryKey().autoincrement().default(0),\n\tcol856: double('col81').primaryKey().autoincrement().default(0),\n\tcol858: double('col81').primaryKey().autoincrement().default(0),\n\tcol859: double('col81').primaryKey().autoincrement().default(0),\n\tcol860: double('col81').primaryKey().autoincrement().default(0),\n\tcol861: double('col81').primaryKey().autoincrement().default(0),\n\tcol862: double('col81').primaryKey().autoincrement().default(0),\n\tcol863: double('col81').primaryKey().autoincrement().default(0),\n\tcol864: double('col81').primaryKey().autoincrement().default(0),\n\tcol865: double('col81').primaryKey().autoincrement().default(0),\n\tcol866: double('col81').primaryKey().autoincrement().default(0),\n\tcol868: double('col81').primaryKey().autoincrement().default(0),\n\tcol869: double('col81').primaryKey().autoincrement().default(0),\n\tcol870: double('col81').primaryKey().autoincrement().default(0),\n\tcol871: double('col81').primaryKey().autoincrement().default(0),\n\tcol872: double('col81').primaryKey().autoincrement().default(0),\n\tcol873: double('col81').primaryKey().autoincrement().default(0),\n\tcol874: double('col81').primaryKey().autoincrement().default(0),\n\tcol875: double('col81').primaryKey().autoincrement().default(0),\n\tcol876: double('col81').primaryKey().autoincrement().default(0),\n\tcol878: double('col81').primaryKey().autoincrement().default(0),\n\tcol879: double('col81').primaryKey().autoincrement().default(0),\n\tcol880: double('col81').primaryKey().autoincrement().default(0),\n\tcol881: double('col81').primaryKey().autoincrement().default(0),\n\tcol882: double('col81').primaryKey().autoincrement().default(0),\n\tcol883: double('col81').primaryKey().autoincrement().default(0),\n\tcol884: double('col81').primaryKey().autoincrement().default(0),\n\tcol885: double('col81').primaryKey().autoincrement().default(0),\n\tcol886: double('col81').primaryKey().autoincrement().default(0),\n\tcol888: double('col81').primaryKey().autoincrement().default(0),\n\tcol889: double('col81').primaryKey().autoincrement().default(0),\n\tcol890: double('col81').primaryKey().autoincrement().default(0),\n\tcol891: double('col81').primaryKey().autoincrement().default(0),\n\tcol892: double('col81').primaryKey().autoincrement().default(0),\n\tcol893: double('col81').primaryKey().autoincrement().default(0),\n\tcol894: double('col81').primaryKey().autoincrement().default(0),\n\tcol895: double('col81').primaryKey().autoincrement().default(0),\n\tcol896: double('col81').primaryKey().autoincrement().default(0),\n\tcol898: double('col81').primaryKey().autoincrement().default(0),\n\tcol899: double('col81').primaryKey().autoincrement().default(0),\n\tcol900: double('col9').primaryKey().autoincrement().default(0),\n\tcol901: double('col9').primaryKey().autoincrement().default(0),\n\tcol902: double('col9').primaryKey().autoincrement().default(0),\n\tcol903: double('col9').primaryKey().autoincrement().default(0),\n\tcol904: double('col9').primaryKey().autoincrement().default(0),\n\tcol905: double('col9').primaryKey().autoincrement().default(0),\n\tcol906: double('col9').primaryKey().autoincrement().default(0),\n\tcol908: double('col9').primaryKey().autoincrement().default(0),\n\tcol909: double('col9').primaryKey().autoincrement().default(0),\n\tcol910: double('col91').primaryKey().autoincrement().default(0),\n\tcol911: double('col91').primaryKey().autoincrement().default(0),\n\tcol912: double('col91').primaryKey().autoincrement().default(0),\n\tcol913: double('col91').primaryKey().autoincrement().default(0),\n\tcol914: double('col91').primaryKey().autoincrement().default(0),\n\tcol915: double('col91').primaryKey().autoincrement().default(0),\n\tcol916: double('col91').primaryKey().autoincrement().default(0),\n\tcol918: double('col91').primaryKey().autoincrement().default(0),\n\tcol919: double('col91').primaryKey().autoincrement().default(0),\n\tcol920: double('col91').primaryKey().autoincrement().default(0),\n\tcol921: double('col91').primaryKey().autoincrement().default(0),\n\tcol922: double('col91').primaryKey().autoincrement().default(0),\n\tcol923: double('col91').primaryKey().autoincrement().default(0),\n\tcol924: double('col91').primaryKey().autoincrement().default(0),\n\tcol925: double('col91').primaryKey().autoincrement().default(0),\n\tcol926: double('col91').primaryKey().autoincrement().default(0),\n\tcol928: double('col91').primaryKey().autoincrement().default(0),\n\tcol929: double('col91').primaryKey().autoincrement().default(0),\n\tcol930: double('col91').primaryKey().autoincrement().default(0),\n\tcol931: double('col91').primaryKey().autoincrement().default(0),\n\tcol932: double('col91').primaryKey().autoincrement().default(0),\n\tcol933: double('col91').primaryKey().autoincrement().default(0),\n\tcol934: double('col91').primaryKey().autoincrement().default(0),\n\tcol935: double('col91').primaryKey().autoincrement().default(0),\n\tcol936: double('col91').primaryKey().autoincrement().default(0),\n\tcol938: double('col91').primaryKey().autoincrement().default(0),\n\tcol939: double('col91').primaryKey().autoincrement().default(0),\n\tcol940: double('col91').primaryKey().autoincrement().default(0),\n\tcol941: double('col91').primaryKey().autoincrement().default(0),\n\tcol942: double('col91').primaryKey().autoincrement().default(0),\n\tcol943: double('col91').primaryKey().autoincrement().default(0),\n\tcol944: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol945: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol946: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol948: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol949: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol950: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol951: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol952: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol953: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol954: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol955: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol956: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol958: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol959: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol960: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol961: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol962: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol963: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol964: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol965: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol966: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol968: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol969: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol970: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol971: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol972: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol973: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol974: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol975: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol976: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol978: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol979: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol980: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol981: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol982: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol983: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol984: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol985: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol986: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol988: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol989: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol990: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol991: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol992: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol993: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol994: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol995: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol996: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol998: varchar('col91', { length: 200 }).primaryKey().default('0'),\n\tcol999: varchar('col91', { length: 200 }).primaryKey().default('0'),\n});\n"
  },
  {
    "path": "drizzle-orm/type-tests/singlestore/count.ts",
    "content": "import { Expect } from 'type-tests/utils.ts';\nimport { int, serial, singlestoreTable, text } from '~/singlestore-core/index.ts';\nimport { and, gt, ne } from '~/sql/expressions/index.ts';\nimport type { Equal } from '~/utils.ts';\nimport { db } from './db.ts';\n\nconst names = singlestoreTable('names', {\n\tid: serial('id').primaryKey(),\n\tname: text('name'),\n\tauthorId: int('author_id'),\n});\n\nconst separate = await db.$count(names);\n\nconst separateFilters = await db.$count(names, and(gt(names.id, 1), ne(names.name, 'forbidden')));\n\nconst embedded = await db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tauthorId: names.authorId,\n\t\tcount1: db.$count(names).as('count1'),\n\t})\n\t.from(names);\n\nconst embeddedFilters = await db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tauthorId: names.authorId,\n\t\tcount1: db.$count(names, and(gt(names.id, 1), ne(names.name, 'forbidden'))).as('count1'),\n\t})\n\t.from(names);\n\nExpect<Equal<number, typeof separate>>;\n\nExpect<Equal<number, typeof separateFilters>>;\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t}[],\n\t\ttypeof embedded\n\t>\n>;\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t}[],\n\t\ttypeof embeddedFilters\n\t>\n>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/singlestore/db.ts",
    "content": "import { createPool } from 'mysql2/promise';\nimport { drizzle } from '~/singlestore/index.ts';\n\nconst pool = createPool({});\n\nexport const db = drizzle(pool);\n\n{\n\tdrizzle(pool);\n\tdrizzle(pool, { schema: {} });\n\tdrizzle(pool, { schema: {} });\n\tdrizzle(pool, {});\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/singlestore/delete.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport type { SingleStoreDelete } from '~/singlestore-core/index.ts';\nimport type { SingleStoreRawQueryResult } from '~/singlestore/index.ts';\nimport { eq } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\nimport { users } from './tables.ts';\n\nconst deleteAll = await db.delete(users);\nExpect<Equal<SingleStoreRawQueryResult, typeof deleteAll>>;\n\nconst deleteAllStmt = db.delete(users).prepare();\nconst deleteAllPrepared = await deleteAllStmt.execute();\nExpect<Equal<SingleStoreRawQueryResult, typeof deleteAllPrepared>>;\n\nconst deleteWhere = await db.delete(users).where(eq(users.id, 1));\nExpect<Equal<SingleStoreRawQueryResult, typeof deleteWhere>>;\n\nconst deleteWhereStmt = db.delete(users).where(eq(users.id, 1)).prepare();\nconst deleteWherePrepared = await deleteWhereStmt.execute();\nExpect<Equal<SingleStoreRawQueryResult, typeof deleteWherePrepared>>;\n\nconst deleteReturningAll = await db.delete(users);\nExpect<Equal<SingleStoreRawQueryResult, typeof deleteReturningAll>>;\n\nconst deleteReturningAllStmt = db.delete(users).prepare();\nconst deleteReturningAllPrepared = await deleteReturningAllStmt.execute();\nExpect<Equal<SingleStoreRawQueryResult, typeof deleteReturningAllPrepared>>;\n\nconst deleteReturningPartial = await db.delete(users);\nExpect<Equal<SingleStoreRawQueryResult, typeof deleteReturningPartial>>;\n\nconst deleteReturningPartialStmt = db.delete(users).prepare();\nconst deleteReturningPartialPrepared = await deleteReturningPartialStmt.execute();\nExpect<Equal<SingleStoreRawQueryResult, typeof deleteReturningPartialPrepared>>;\n\n{\n\tfunction dynamic<T extends SingleStoreDelete>(qb: T) {\n\t\treturn qb.where(sql``);\n\t}\n\n\tconst qbBase = db.delete(users).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<SingleStoreRawQueryResult, typeof result>>;\n}\n\n{\n\tdb\n\t\t.delete(users)\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n\n\tdb\n\t\t.delete(users)\n\t\t.$dynamic()\n\t\t.where(sql``)\n\t\t.where(sql``);\n}\n\n{\n\tdb.delete(users).where(sql``).limit(1).orderBy(sql``);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/singlestore/insert.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { int, singlestoreTable, text } from '~/singlestore-core/index.ts';\nimport type { SingleStoreInsert } from '~/singlestore-core/index.ts';\nimport type { SingleStoreRawQueryResult } from '~/singlestore/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\nimport { users } from './tables.ts';\n\nconst singlestoreInsertReturning = await db.insert(users).values({\n\t//    ^?\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n}).$returningId();\n\nExpect<Equal<{ id: number; serialNullable: number; serialNotNull: number }[], typeof singlestoreInsertReturning>>;\n\nconst insert = await db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n});\nExpect<Equal<SingleStoreRawQueryResult, typeof insert>>;\n\nconst insertStmt = db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n}).prepare();\nconst insertPrepared = await insertStmt.execute();\nExpect<Equal<SingleStoreRawQueryResult, typeof insertPrepared>>;\n\nconst insertSql = await db.insert(users).values({\n\thomeCity: sql`123`,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: sql`foobar`,\n});\nExpect<Equal<SingleStoreRawQueryResult, typeof insertSql>>;\n\nconst insertSqlStmt = db.insert(users).values({\n\thomeCity: sql`123`,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: sql`foobar`,\n}).prepare();\nconst insertSqlPrepared = await insertSqlStmt.execute();\nExpect<Equal<SingleStoreRawQueryResult, typeof insertSqlPrepared>>;\n\nconst insertReturning = await db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n});\nExpect<Equal<SingleStoreRawQueryResult, typeof insertReturning>>;\n\nconst insertReturningStmt = db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n}).prepare();\nconst insertReturningPrepared = await insertReturningStmt.execute();\nExpect<Equal<SingleStoreRawQueryResult, typeof insertReturningPrepared>>;\n\nconst insertReturningPartial = await db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n});\nExpect<Equal<SingleStoreRawQueryResult, typeof insertReturningPartial>>;\n\nconst insertReturningPartialStmt = db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n}).prepare();\nconst insertReturningPartialPrepared = await insertReturningPartialStmt.execute();\nExpect<Equal<SingleStoreRawQueryResult, typeof insertReturningPartialPrepared>>;\n\nconst insertReturningSql = await db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: sql`2 + 2`,\n\tenumCol: 'a',\n});\nExpect<Equal<SingleStoreRawQueryResult, typeof insertReturningSql>>;\n\nconst insertReturningSqlStmt = db.insert(users).values({\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: sql`2 + 2`,\n\tenumCol: 'a',\n}).prepare();\nconst insertReturningSqlPrepared = await insertReturningSqlStmt.execute();\nExpect<Equal<SingleStoreRawQueryResult, typeof insertReturningSqlPrepared>>;\n\n{\n\tconst users = singlestoreTable('users', {\n\t\tid: int('id').autoincrement().primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tage: int('age'),\n\t\toccupation: text('occupation'),\n\t});\n\n\tawait db.insert(users).values({ name: 'John Wick', age: 58, occupation: 'housekeeper' });\n}\n\n{\n\tfunction dynamic<T extends SingleStoreInsert>(qb: T) {\n\t\treturn qb.onDuplicateKeyUpdate({ set: {} });\n\t}\n\n\tconst qbBase = db.insert(users).values({ age1: 0, class: 'A', enumCol: 'a', homeCity: 0 }).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\n\tExpect<Equal<SingleStoreRawQueryResult, typeof result>>;\n}\n\n{\n\tdb\n\t\t.insert(users)\n\t\t.values({ age1: 0, class: 'A', enumCol: 'a', homeCity: 0 })\n\t\t.onDuplicateKeyUpdate({ set: {} })\n\t\t// @ts-expect-error method was already called\n\t\t.onDuplicateKeyUpdate({ set: {} });\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/singlestore/no-strict-null-checks/test.ts",
    "content": "import { drizzle } from '~/singlestore';\nimport { singlestoreTable, text } from '~/singlestore-core';\n\nexport const test = singlestoreTable(\n\t'test',\n\t{\n\t\tid: text('id')\n\t\t\t.primaryKey()\n\t\t\t.generatedAlwaysAs('genstr'),\n\t\tname: text('name').$defaultFn(() => '' as string),\n\t\ttitle: text('title').notNull(),\n\t\tdescription: text('description'),\n\t\tdbdef: text('dbdef').default('dbdefval'),\n\t},\n);\n\nconst db = drizzle.mock();\n\n// Enable after `.generatedAlwaysAs()` is implemented\n// db.update(test)\n// \t.set({\n// \t\t// @ts-expect-error\n// \t\tid: '1',\n// \t\tname: 'name',\n// \t\ttitle: 'title',\n// \t\tdescription: 'desc',\n// \t\tdbdef: 'upddef',\n// \t});\n\ndb.update(test)\n\t.set({\n\t\tname: 'name',\n\t\ttitle: 'title',\n\t\tdescription: 'desc',\n\t\tdbdef: 'upddef',\n\t});\n\n// Enable after `.generatedAlwaysAs()` is implemented\n// db.insert(test).values({\n// \t// @ts-expect-error\n// \tid: '1',\n// \tname: 'name',\n// \ttitle: 'title',\n// \tdescription: 'desc',\n// \tdbdef: 'upddef',\n// });\n\ndb.insert(test).values({\n\tname: 'name',\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n\tdescription: 'desc',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n});\n"
  },
  {
    "path": "drizzle-orm/type-tests/singlestore/no-strict-null-checks/tsconfig.json",
    "content": "{\n\t\"extends\": \"../../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"noEmit\": true,\n\t\t\"strictNullChecks\": false,\n\t\t\"strictPropertyInitialization\": false,\n\t\t\"exactOptionalPropertyTypes\": false\n\t},\n\t\"include\": [\"./test.ts\"]\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/singlestore/select.ts",
    "content": "import { alias } from '~/singlestore-core/alias.ts';\nimport {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from '~/sql/expressions/index.ts';\nimport { param, sql } from '~/sql/sql.ts';\n\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport {\n\tint,\n\tQueryBuilder,\n\ttype SingleStoreSelect,\n\ttype SingleStoreSelectQueryBuilder,\n\tsinglestoreTable,\n\ttext,\n} from '~/singlestore-core/index.ts';\nimport { db } from './db.ts';\nimport { cities, classes, users } from './tables.ts';\n\nconst city = alias(cities, 'city');\nconst city1 = alias(cities, 'city1');\n\nconst leftJoinFull = await db.select().from(users).leftJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof cities.$inferSelect | null;\n\t\t}[],\n\t\ttypeof leftJoinFull\n\t>\n>;\n\nconst rightJoinFull = await db.select().from(users).rightJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect | null;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof rightJoinFull\n\t>\n>;\n\nconst innerJoinFull = await db.select().from(users).innerJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof innerJoinFull\n\t>\n>;\n\nconst fullJoinFull = await db.select().from(users).fullJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect | null;\n\t\t\tcity: typeof city.$inferSelect | null;\n\t\t}[],\n\t\ttypeof fullJoinFull\n\t>\n>;\n\nconst crossJoinFull = await db.select().from(users).crossJoin(city);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof crossJoinFull\n\t>\n>;\n\nconst leftJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.leftJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserText: string | null;\n\t\tcityId: number | null;\n\t\tcityName: string | null;\n\t}[], typeof leftJoinFlat>\n>;\n\nconst rightJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.rightJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number | null;\n\t\tuserText: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof rightJoinFlat>\n>;\n\nconst innerJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.innerJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserText: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof innerJoinFlat>\n>;\n\nconst fullJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.fullJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<{\n\t\tuserId: number | null;\n\t\tuserText: string | null;\n\t\tcityId: number | null;\n\t\tcityName: string | null;\n\t}[], typeof fullJoinFlat>\n>;\n\nconst crossJoinFlat = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserText: users.text,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.crossJoin(city);\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserText: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof crossJoinFlat>\n>;\n\nconst leftJoinMixed = await db\n\t.select({\n\t\tid: users.id,\n\t\ttext: users.text,\n\t\ttextUpper: sql<string | null>`upper(${users.text})`,\n\t\tidComplex: sql<string | null>`${users.id}::text || ${city.id}::text`,\n\t\tcity: {\n\t\t\tid: city.id,\n\t\t\tname: city.name,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(city, eq(users.id, city.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\ttext: string | null;\n\t\t\ttextUpper: string | null;\n\t\t\tidComplex: string | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[],\n\t\ttypeof leftJoinMixed\n\t>\n>;\n\nconst leftJoinMixed2 = await db\n\t.select({\n\t\tid: users.id,\n\t\ttext: users.text,\n\t\tfoo: {\n\t\t\tbar: users.id,\n\t\t\tbaz: cities.id,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(cities, eq(users.id, cities.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\ttext: string | null;\n\t\t\tfoo: {\n\t\t\t\tbar: number;\n\t\t\t\tbaz: number | null;\n\t\t\t};\n\t\t}[],\n\t\ttypeof leftJoinMixed2\n\t>\n>;\n\nconst join = await db\n\t.select({\n\t\tusers,\n\t\tcities,\n\t\tcity,\n\t\tcity1: {\n\t\t\tid: city1.id,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(cities, eq(users.id, cities.id))\n\t.rightJoin(city, eq(city.id, users.id))\n\t.rightJoin(city1, eq(city1.id, users.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers: {\n\t\t\t\tid: number;\n\t\t\t\ttext: string | null;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t} | null;\n\t\t\tcities: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t} | null;\n\t\t\tcity1: {\n\t\t\t\tid: number;\n\t\t\t};\n\t\t}[],\n\t\ttypeof join\n\t>\n>;\n\nconst join2 = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tcityId: cities.id,\n\t})\n\t.from(users)\n\t.fullJoin(cities, eq(users.id, cities.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuserId: number | null;\n\t\t\tcityId: number | null;\n\t\t}[],\n\t\ttypeof join2\n\t>\n>;\n\nconst join3 = await db\n\t.select({\n\t\tuserId: users.id,\n\t\tcityId: cities.id,\n\t\tclassId: classes.id,\n\t})\n\t.from(users)\n\t.fullJoin(cities, eq(users.id, cities.id))\n\t.rightJoin(classes, eq(users.id, classes.id));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuserId: number | null;\n\t\t\tcityId: number | null;\n\t\t\tclassId: number;\n\t\t}[],\n\t\ttypeof join3\n\t>\n>;\n\ndb\n\t.select()\n\t.from(users)\n\t.where(exists(db.select().from(cities).where(eq(users.homeCity, cities.id))));\n\nfunction mapFunkyFuncResult(valueFromDriver: unknown) {\n\treturn {\n\t\tfoo: (valueFromDriver as Record<string, any>)['foo'],\n\t};\n}\n\nconst age = 1;\n\nconst allOperators = await db\n\t.select({\n\t\tcol2: sql`5 - ${users.id} + 1`, // unknown\n\t\tcol3: sql<number>`${users.id} + 1`, // number\n\t\tcol33: sql`${users.id} + 1`.mapWith(users.id), // number\n\t\tcol34: sql`${users.id} + 1`.mapWith(mapFunkyFuncResult), // number\n\t\tcol4: sql<string | number>`one_or_another(${users.id}, ${users.class})`, // string | number\n\t\tcol5: sql`true`, // unknown\n\t\tcol6: sql<boolean>`true`, // boolean\n\t\tcol7: sql<number>`random()`, // number\n\t\tcol8: sql`some_funky_func(${users.id})`.mapWith(mapFunkyFuncResult), // { foo: string }\n\t\tcol9: sql`greatest(${users.createdAt}, ${param(new Date(), users.createdAt)})`, // unknown\n\t\tcol10: sql<Date | boolean>`date_or_false(${users.createdAt}, ${param(new Date(), users.createdAt)})`, // Date | boolean\n\t\tcol11: sql`${users.age1} + ${age}`, // unknown\n\t\tcol12: sql`${users.age1} + ${param(age, users.age1)}`, // unknown\n\t\tcol13: sql`lower(${users.class})`, // unknown\n\t\tcol14: sql<number>`length(${users.class})`, // number\n\t\tcount: sql<number>`count(*)::int`, // number\n\t})\n\t.from(users)\n\t.where(and(\n\t\teq(users.id, 1),\n\t\tne(users.id, 1),\n\t\tor(eq(users.id, 1), ne(users.id, 1)),\n\t\tnot(eq(users.id, 1)),\n\t\tgt(users.id, 1),\n\t\tgte(users.id, 1),\n\t\tlt(users.id, 1),\n\t\tlte(users.id, 1),\n\t\tinArray(users.id, [1, 2, 3]),\n\t\tinArray(users.id, db.select({ id: users.id }).from(users)),\n\t\tinArray(users.id, sql`select id from ${users}`),\n\t\tnotInArray(users.id, [1, 2, 3]),\n\t\tnotInArray(users.id, db.select({ id: users.id }).from(users)),\n\t\tnotInArray(users.id, sql`select id from ${users}`),\n\t\tisNull(users.subClass),\n\t\tisNotNull(users.id),\n\t\texists(db.select({ id: users.id }).from(users)),\n\t\texists(sql`select id from ${users}`),\n\t\tnotExists(db.select({ id: users.id }).from(users)),\n\t\tnotExists(sql`select id from ${users}`),\n\t\tbetween(users.id, 1, 2),\n\t\tnotBetween(users.id, 1, 2),\n\t\tlike(users.id, '%1%'),\n\t\tnotLike(users.id, '%1%'),\n\t\tilike(users.id, '%1%'),\n\t\tnotIlike(users.id, '%1%'),\n\t));\n\nExpect<\n\tEqual<{\n\t\tcol2: unknown;\n\t\tcol3: number;\n\t\tcol33: number;\n\t\tcol34: { foo: any };\n\t\tcol4: string | number;\n\t\tcol5: unknown;\n\t\tcol6: boolean;\n\t\tcol7: number;\n\t\tcol8: {\n\t\t\tfoo: any;\n\t\t};\n\t\tcol9: unknown;\n\t\tcol10: boolean | Date;\n\t\tcol11: unknown;\n\t\tcol12: unknown;\n\t\tcol13: unknown;\n\t\tcol14: number;\n\t\tcount: number;\n\t}[], typeof allOperators>\n>;\n\nconst textSelect = await db\n\t.select({\n\t\tt: users.text,\n\t})\n\t.from(users);\n\nExpect<Equal<{ t: string | null }[], typeof textSelect>>;\n\nconst homeCity = alias(cities, 'homeCity');\nconst c = alias(classes, 'c');\nconst otherClass = alias(classes, 'otherClass');\nconst anotherClass = alias(classes, 'anotherClass');\nconst friend = alias(users, 'friend');\nconst currentCity = alias(cities, 'currentCity');\nconst subscriber = alias(users, 'subscriber');\nconst closestCity = alias(cities, 'closestCity');\n\nconst megaJoin = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t\tmaxAge: sql`max(${users.age1})`,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\thomeCity,\n\t\tc,\n\t\totherClass,\n\t\tanotherClass,\n\t\tfriend,\n\t\tcurrentCity,\n\t\tsubscriber,\n\t\tclosestCity,\n\t})\n\t.from(users)\n\t.innerJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.innerJoin(homeCity, sql`${users.homeCity} = ${homeCity.id}`)\n\t.innerJoin(c, eq(c.id, users.class))\n\t.innerJoin(otherClass, sql`${c.id} = ${otherClass.id}`)\n\t.innerJoin(anotherClass, sql`${users.class} = ${anotherClass.id}`)\n\t.innerJoin(friend, sql`${users.id} = ${friend.id}`)\n\t.innerJoin(currentCity, sql`${homeCity.id} = ${currentCity.id}`)\n\t.innerJoin(subscriber, sql`${users.class} = ${subscriber.id}`)\n\t.innerJoin(closestCity, sql`${users.currentCity} = ${closestCity.id}`)\n\t.where(and(sql`${users.age1} > 0`, eq(cities.id, 1)))\n\t.limit(1)\n\t.offset(1);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tmaxAge: unknown;\n\t\t\t};\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t};\n\t\t\thomeCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t\tc: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t};\n\t\t\totherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t};\n\t\t\tanotherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t};\n\t\t\tfriend: {\n\t\t\t\tid: number;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t};\n\t\t\tcurrentCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t\tsubscriber: {\n\t\t\t\tid: number;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t};\n\t\t\tclosestCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t}[],\n\t\ttypeof megaJoin\n\t>\n>;\n\nconst friends = alias(users, 'friends');\n\nconst join4 = await db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\tclass: classes,\n\t\tfriend: friends,\n\t})\n\t.from(users)\n\t.innerJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.innerJoin(classes, sql`${cities.id} = ${classes.id}`)\n\t.innerJoin(friends, sql`${friends.id} = ${users.id}`)\n\t.where(sql`${users.age1} > 0`);\n\nExpect<\n\tEqual<{\n\t\tuser: {\n\t\t\tid: number;\n\t\t};\n\t\tcity: {\n\t\t\tid: number;\n\t\t};\n\t\tclass: {\n\t\t\tid: number;\n\t\t\tclass: 'A' | 'C' | null;\n\t\t\tsubClass: 'B' | 'D';\n\t\t};\n\t\tfriend: {\n\t\t\tid: number;\n\t\t\thomeCity: number;\n\t\t\tcurrentCity: number | null;\n\t\t\tserialNullable: number;\n\t\t\tserialNotNull: number;\n\t\t\tclass: 'A' | 'C';\n\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\ttext: string | null;\n\t\t\tage1: number;\n\t\t\tcreatedAt: Date;\n\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t};\n\t}[], typeof join4>\n>;\n\n{\n\tconst authenticated = false as boolean;\n\n\tconst result = await db\n\t\t.select({\n\t\t\tid: users.id,\n\t\t\t...(authenticated ? { city: users.homeCity } : {}),\n\t\t})\n\t\t.from(users);\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tcity?: number;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\nawait db.select().from(users).for('update');\nawait db.select().from(users).for('share', { skipLocked: true });\nawait db.select().from(users).for('update', { noWait: true });\n// TODO Implement views for SingleStore (https://docs.singlestore.com/cloud/reference/sql-reference/data-definition-language-ddl/create-view/)\n/* await db\n\t.select()\n\t.from(users)\n\t// @ts-expect-error - can't use both skipLocked and noWait\n\t.for('share', { noWait: true, skipLocked: true });\n\n{\n\tconst result = await db.select().from(newYorkers);\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tuserId: number;\n\t\t\t\tcityId: number | null;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\n{\n\tconst result = await db.select({ userId: newYorkers.userId }).from(newYorkers);\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tuserId: number;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n} */\n\n{\n\tconst query = db.select().from(users).prepare().iterator();\n\tfor await (const row of query) {\n\t\tExpect<Equal<typeof users.$inferSelect, typeof row>>();\n\t}\n}\n\n{\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1));\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1))\n\t\t// @ts-expect-error - can't use where twice\n\t\t.where(eq(users.id, 1));\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1))\n\t\t.limit(10)\n\t\t// @ts-expect-error - can't use where twice\n\t\t.where(eq(users.id, 1));\n}\n\n{\n\tfunction withFriends<T extends SingleStoreSelect>(qb: T) {\n\t\tconst friends = alias(users, 'friends');\n\t\tconst friends2 = alias(users, 'friends2');\n\t\tconst friends3 = alias(users, 'friends3');\n\t\tconst friends4 = alias(users, 'friends4');\n\t\tconst friends5 = alias(users, 'friends5');\n\t\treturn qb\n\t\t\t.leftJoin(friends, sql`true`)\n\t\t\t.leftJoin(friends2, sql`true`)\n\t\t\t.leftJoin(friends3, sql`true`)\n\t\t\t.leftJoin(friends4, sql`true`)\n\t\t\t.leftJoin(friends5, sql`true`);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await withFriends(qb);\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tfriends: typeof users.$inferSelect | null;\n\t\t\tfriends2: typeof users.$inferSelect | null;\n\t\t\tfriends3: typeof users.$inferSelect | null;\n\t\t\tfriends4: typeof users.$inferSelect | null;\n\t\t\tfriends5: typeof users.$inferSelect | null;\n\t\t}[]>\n\t>;\n}\n\n{\n\tfunction withFriends<T extends SingleStoreSelectQueryBuilder>(qb: T) {\n\t\tconst friends = alias(users, 'friends');\n\t\tconst friends2 = alias(users, 'friends2');\n\t\tconst friends3 = alias(users, 'friends3');\n\t\tconst friends4 = alias(users, 'friends4');\n\t\tconst friends5 = alias(users, 'friends5');\n\t\treturn qb\n\t\t\t.leftJoin(friends, sql`true`)\n\t\t\t.leftJoin(friends2, sql`true`)\n\t\t\t.leftJoin(friends3, sql`true`)\n\t\t\t.leftJoin(friends4, sql`true`)\n\t\t\t.leftJoin(friends5, sql`true`);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await withFriends(qb);\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tfriends: typeof users.$inferSelect | null;\n\t\t\tfriends2: typeof users.$inferSelect | null;\n\t\t\tfriends3: typeof users.$inferSelect | null;\n\t\t\tfriends4: typeof users.$inferSelect | null;\n\t\t\tfriends5: typeof users.$inferSelect | null;\n\t\t}[]>\n\t>;\n}\n\n{\n\tfunction dynamic<T extends SingleStoreSelect>(qb: T) {\n\t\treturn qb.where(sql``).having(sql``).groupBy(sql``).orderBy(sql``).limit(1).offset(1).for('update');\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await dynamic(qb);\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\n{\n\t// TODO: add to docs\n\tfunction dynamic<T extends SingleStoreSelectQueryBuilder>(qb: T) {\n\t\treturn qb.where(sql``).having(sql``).groupBy(sql``).orderBy(sql``).limit(1).offset(1).for('update');\n\t}\n\n\tconst query = new QueryBuilder().select().from(users).$dynamic();\n\tdynamic(query);\n}\n\n{\n\t// TODO: add to docs\n\tfunction paginated<T extends SingleStoreSelect>(qb: T, page: number) {\n\t\treturn qb.limit(10).offset((page - 1) * 10);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await paginated(qb, 1);\n\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\n{\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.having(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.having(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.groupBy(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.groupBy(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.orderBy(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.orderBy(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.limit(10)\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.limit(10);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.offset(10)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.offset(10);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.for('update')\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.for('update');\n}\n\n{\n\tconst table1 = singlestoreTable('table1', {\n\t\tid: int().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst table2 = singlestoreTable('table2', {\n\t\tid: int().primaryKey(),\n\t\tage: int().notNull(),\n\t\ttable1Id: int().notNull(),\n\t});\n\n\tconst leftLateralRawRes = await db.select({\n\t\ttable1,\n\t\tsqId: sql<number | null>`${sql.identifier('t2')}.${sql.identifier('id')}`.as('sqId'),\n\t}).from(table1).leftJoinLateral(sql`(SELECT * FROM ${table2}) as ${sql.identifier('t2')}`, sql`true`);\n\n\tExpect<\n\t\tEqual<typeof leftLateralRawRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsqId: number | null;\n\t\t}[]>\n\t>;\n\n\tconst leftLateralSubRes = await db.select().from(table1).leftJoinLateral(\n\t\tdb.select().from(table2).as('sub'),\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof leftLateralSubRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsub: {\n\t\t\t\tid: number;\n\t\t\t\tage: number;\n\t\t\t\ttable1Id: number;\n\t\t\t} | null;\n\t\t}[]>\n\t>;\n\n\tconst sqLeftLateral = db.select().from(table2).as('sub');\n\n\tconst leftLateralSubSelectionRes = await db.select(\n\t\t{\n\t\t\tid: table1.id,\n\t\t\tsId: sqLeftLateral.id,\n\t\t},\n\t).from(table1).leftJoinLateral(\n\t\tsqLeftLateral,\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof leftLateralSubSelectionRes, {\n\t\t\tid: number;\n\t\t\tsId: number | null;\n\t\t}[]>\n\t>;\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.leftJoinLateral(table2, sql`true`);\n\n\tconst innerLateralRawRes = await db.select({\n\t\ttable1,\n\t\tsqId: sql<number>`${sql.identifier('t2')}.${sql.identifier('id')}`.as('sqId'),\n\t}).from(table1).innerJoinLateral(sql`(SELECT * FROM ${table2}) as ${sql.identifier('t2')}`, sql`true`);\n\n\tExpect<\n\t\tEqual<typeof innerLateralRawRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsqId: number;\n\t\t}[]>\n\t>;\n\n\tconst innerLateralSubRes = await db.select().from(table1).innerJoinLateral(\n\t\tdb.select().from(table2).as('sub'),\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof innerLateralSubRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsub: {\n\t\t\t\tid: number;\n\t\t\t\tage: number;\n\t\t\t\ttable1Id: number;\n\t\t\t};\n\t\t}[]>\n\t>;\n\n\tconst sqInnerLateral = db.select().from(table2).as('sub');\n\n\tconst innerLateralSubSelectionRes = await db.select(\n\t\t{\n\t\t\tid: table1.id,\n\t\t\tsId: sqLeftLateral.id,\n\t\t},\n\t).from(table1).innerJoinLateral(\n\t\tsqInnerLateral,\n\t\tsql`true`,\n\t);\n\n\tExpect<\n\t\tEqual<typeof innerLateralSubSelectionRes, {\n\t\t\tid: number;\n\t\t\tsId: number;\n\t\t}[]>\n\t>;\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.innerJoinLateral(table2, sql`true`);\n\n\tconst crossLateralRawRes = await db.select({\n\t\ttable1,\n\t\tsqId: sql<number>`${sql.identifier('t2')}.${sql.identifier('id')}`.as('sqId'),\n\t}).from(table1).crossJoinLateral(sql`(SELECT * FROM ${table2}) as ${sql.identifier('t2')}`);\n\n\tExpect<\n\t\tEqual<typeof crossLateralRawRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsqId: number;\n\t\t}[]>\n\t>;\n\n\tconst crossLateralSubRes = await db.select().from(table1).crossJoinLateral(\n\t\tdb.select().from(table2).as('sub'),\n\t);\n\n\tExpect<\n\t\tEqual<typeof crossLateralSubRes, {\n\t\t\ttable1: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t\tsub: {\n\t\t\t\tid: number;\n\t\t\t\tage: number;\n\t\t\t\ttable1Id: number;\n\t\t\t};\n\t\t}[]>\n\t>;\n\n\tconst sqCrossLateral = db.select().from(table2).as('sub');\n\n\tconst crossLateralSubSelectionRes = await db.select(\n\t\t{\n\t\t\tid: table1.id,\n\t\t\tsId: sqCrossLateral.id,\n\t\t},\n\t).from(table1).crossJoinLateral(\n\t\tsqInnerLateral,\n\t);\n\n\tExpect<\n\t\tEqual<typeof crossLateralSubSelectionRes, {\n\t\t\tid: number;\n\t\t\tsId: number;\n\t\t}[]>\n\t>;\n\n\tawait db.select().from(table1)\n\t\t// @ts-expect-error\n\t\t.crossJoinLateral(table2);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/singlestore/set-operators.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils.ts';\nimport { intersect, type SingleStoreSetOperator, union, unionAll } from '~/singlestore-core/index.ts';\nimport { eq } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/index.ts';\nimport { db } from './db.ts';\nimport { cities, classes, users } from './tables.ts';\n\nconst unionTest = await db\n\t.select({ id: users.id })\n\t.from(users)\n\t.union(\n\t\tdb\n\t\t\t.select({ id: users.id })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number }[], typeof unionTest>>;\n\nconst unionAllTest = await db\n\t.select({ id: users.id, age: users.age1 })\n\t.from(users)\n\t.unionAll(\n\t\tdb.select({ id: users.id, age: users.age1 })\n\t\t\t.from(users)\n\t\t\t.leftJoin(cities, eq(users.id, cities.id)),\n\t);\n\nExpect<Equal<{ id: number; age: number }[], typeof unionAllTest>>;\n\nconst intersectTest = await db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t.intersect(({ intersect }) =>\n\t\tintersect(\n\t\t\tdb\n\t\t\t\t.select({ id: users.id, homeCity: users.homeCity })\n\t\t\t\t.from(users),\n\t\t\tdb\n\t\t\t\t.select({ id: users.id, homeCity: sql`${users.homeCity}`.mapWith(Number) })\n\t\t\t\t.from(users),\n\t\t)\n\t);\n\nExpect<Equal<{ id: number; homeCity: number }[], typeof intersectTest>>;\n\nconst exceptTest = await db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t.except(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: sql`${users.homeCity}`.mapWith(Number) })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number; homeCity: number }[], typeof exceptTest>>;\n\nconst minusTest = await db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t.minus(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: sql`${users.homeCity}`.mapWith(Number) })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number; homeCity: number }[], typeof minusTest>>;\n\nconst union2Test = await union(db.select().from(cities), db.select().from(cities), db.select().from(cities));\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof union2Test>>;\n\nconst unionAll2Test = await unionAll(\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select().from(cities),\n);\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof unionAll2Test>>;\n\nconst intersect2Test = await intersect(\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n);\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof intersect2Test>>;\n\n// TODO Implement views for SingleStore (https://docs.singlestore.com/cloud/reference/sql-reference/data-definition-language-ddl/create-view/)\n/* const except2Test = await except(\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t})\n\t\t.from(newYorkers),\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t}).from(newYorkers),\n);\n\nExpect<Equal<{ userId: number }[], typeof except2Test>>; */\n\nconst unionfull = await union(db.select().from(users), db.select().from(users)).orderBy(sql``).limit(1).offset(2);\n\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\ttext: string | null;\n\t\thomeCity: number;\n\t\tcurrentCity: number | null;\n\t\tserialNullable: number;\n\t\tserialNotNull: number;\n\t\tclass: 'A' | 'C';\n\t\tsubClass: 'B' | 'D' | null;\n\t\tage1: number;\n\t\tcreatedAt: Date;\n\t\tenumCol: 'a' | 'b' | 'c';\n\t}[], typeof unionfull>\n>;\n\nunion(db.select().from(users), db.select().from(users))\n\t.orderBy(sql``)\n\t// @ts-expect-error - method was already called\n\t.orderBy(sql``);\n\nunion(db.select().from(users), db.select().from(users))\n\t.offset(1)\n\t// @ts-expect-error - method was already called\n\t.offset(2);\n\nunion(db.select().from(users), db.select().from(users))\n\t.orderBy(sql``)\n\t// @ts-expect-error - method was already called\n\t.orderBy(sql``);\n\n{\n\tfunction dynamic<T extends SingleStoreSetOperator>(qb: T) {\n\t\treturn qb.orderBy(sql``).limit(1).offset(2);\n\t}\n\n\tconst qb = union(db.select().from(users), db.select().from(users)).$dynamic();\n\tconst result = await dynamic(qb);\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\nawait db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\t.intersect(({ intersect }) => intersect(db.select().from(users), db.select().from(users)));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select().from(classes).union(db.select({ id: classes.id }).from(classes));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select({ id: classes.id }).from(classes).union(db.select().from(classes).where(sql``));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select({ id: classes.id }).from(classes).union(db.select().from(classes));\n\nunion(\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select().from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name, population: cities.population }).from(cities),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``).limit(3).$dynamic(),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t/* db.select({ id: newYorkers.userId }).from(newYorkers), */\n\tdb.select({ id: cities.id }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities).where(sql``),\n\tdb.select({ id: sql<number>`${cities.id}` }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name, population: cities.population }).from(cities).where(sql``),\n);\n"
  },
  {
    "path": "drizzle-orm/type-tests/singlestore/subquery.ts",
    "content": "import { Expect } from 'type-tests/utils.ts';\nimport { alias, int, serial, singlestoreTable, text } from '~/singlestore-core/index.ts';\nimport { and, eq } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { DrizzleTypeError, Equal } from '~/utils.ts';\nimport { db } from './db.ts';\n\nconst names = singlestoreTable('names', {\n\tid: serial('id').primaryKey(),\n\tname: text('name'),\n\tauthorId: int('author_id'),\n});\n\nconst n1 = db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tauthorId: names.authorId,\n\t\tcount1: sql<number>`count(1)::int`.as('count1'),\n\t})\n\t.from(names)\n\t.groupBy(names.id, names.name, names.authorId)\n\t.as('n1');\n\nconst n2 = db\n\t.select({\n\t\tid: names.id,\n\t\tauthorId: names.authorId,\n\t\ttotalCount: sql<number>`count(1)::int`.as('totalCount'),\n\t})\n\t.from(names)\n\t.groupBy(names.id, names.authorId)\n\t.as('n2');\n\nconst result = await db\n\t.select({\n\t\tname: n1.name,\n\t\tauthorId: n1.authorId,\n\t\tcount1: n1.count1,\n\t\ttotalCount: n2.totalCount,\n\t})\n\t.from(n1)\n\t.innerJoin(n2, and(eq(n2.id, n1.id), eq(n2.authorId, n1.authorId)));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t\ttotalCount: number;\n\t\t}[],\n\t\ttypeof result\n\t>\n>;\n\nconst names2 = alias(names, 'names2');\n\nconst sq1 = db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tid2: names2.id,\n\t})\n\t.from(names)\n\t.leftJoin(names2, eq(names.name, names2.name))\n\t.as('sq1');\n\nconst res = await db.select().from(sq1);\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tid2: number | null;\n\t\t}[],\n\t\ttypeof res\n\t>\n>;\n\n{\n\tconst sq = db.select({ count: sql<number>`count(1)::int` }).from(names).as('sq');\n\tExpect<typeof sq.count extends DrizzleTypeError<any> ? true : false>;\n}\n\nconst sqUnion = db.select().from(names).union(db.select().from(names2)).as('sqUnion');\n\nconst resUnion = await db.select().from(sqUnion);\n\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\tname: string | null;\n\t\tauthorId: number | null;\n\t}[], typeof resUnion>\n>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/singlestore/tables.ts",
    "content": "import * as crypto from 'node:crypto';\nimport { type Equal, Expect } from 'type-tests/utils.ts';\nimport type { BuildColumn } from '~/column-builder.ts';\nimport {\n\tbigint,\n\tbinary,\n\tboolean,\n\tchar,\n\tcustomType,\n\tdate,\n\tdatetime,\n\tdecimal,\n\tdouble,\n\tfloat,\n\tindex,\n\tint,\n\tjson,\n\tlongtext,\n\tmediumint,\n\tmediumtext,\n\tprimaryKey,\n\treal,\n\tserial,\n\ttype SingleStoreColumn,\n\tsinglestoreEnum,\n\tsinglestoreTable,\n\tsmallint,\n\ttext,\n\ttime,\n\ttimestamp,\n\ttinyint,\n\ttinytext,\n\tunique,\n\tuniqueIndex,\n\tvarbinary,\n\tvarchar,\n\tvector,\n\tyear,\n} from '~/singlestore-core/index.ts';\nimport { singlestoreSchema } from '~/singlestore-core/schema.ts';\nimport { eq } from '~/sql/expressions/index.ts';\n/* import { singlestoreView, type SingleStoreViewWithSelection } from '~/singlestore-core/view.ts'; */\nimport type { InferSelectModel } from '~/table.ts';\nimport type { Simplify } from '~/utils.ts';\nimport { db } from './db.ts';\n\nexport const users = singlestoreTable(\n\t'users_table',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\thomeCity: int('home_city')\n\t\t\t.notNull(),\n\t\tcurrentCity: int('current_city'),\n\t\tserialNullable: serial('serial1'),\n\t\tserialNotNull: serial('serial2').notNull(),\n\t\tclass: text('class', { enum: ['A', 'C'] }).notNull(),\n\t\tsubClass: text('sub_class', { enum: ['B', 'D'] }),\n\t\ttext: text('text'),\n\t\tage1: int('age1').notNull(),\n\t\tcreatedAt: timestamp('created_at', { mode: 'date' }).notNull().defaultNow(),\n\t\tenumCol: singlestoreEnum('enum_col', ['a', 'b', 'c']).notNull(),\n\t},\n\t(users) => ({\n\t\tusersAge1Idx: uniqueIndex('usersAge1Idx').on(users.class),\n\t\tusersAge2Idx: index('usersAge2Idx').on(users.class),\n\t\tuniqueClass: uniqueIndex('uniqueClass')\n\t\t\t.on(users.class, users.subClass)\n\t\t\t.lock('default')\n\t\t\t.algorithm('copy')\n\t\t\t.using(`btree`),\n\t\tpk: primaryKey(users.age1, users.class),\n\t}),\n);\n\nexport const cities = singlestoreTable('cities_table', {\n\tid: serial('id').primaryKey(),\n\tname: text('name_db').notNull(),\n\tpopulation: int('population').default(0),\n}, (cities) => ({\n\tcitiesNameIdx: index('citiesNameIdx').on(cities.id),\n}));\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: SingleStoreColumn<\n\t\t\t\t{\n\t\t\t\t\tname: 'id';\n\t\t\t\t\ttableName: 'cities_table';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SingleStoreSerial';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\thasDefault: true;\n\t\t\t\t\tisPrimaryKey: true;\n\t\t\t\t\tisAutoincrement: true;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t\t{}\n\t\t\t>;\n\t\t\tname: SingleStoreColumn<\n\t\t\t\t{\n\t\t\t\t\tname: 'name_db';\n\t\t\t\t\ttableName: 'cities_table';\n\t\t\t\t\tdataType: 'string';\n\t\t\t\t\tcolumnType: 'SingleStoreText';\n\t\t\t\t\tdata: string;\n\t\t\t\t\tdriverParam: string;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t\tenumValues: [string, ...string[]];\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t\t{}\n\t\t\t>;\n\t\t\tpopulation: SingleStoreColumn<\n\t\t\t\t{\n\t\t\t\t\tname: 'population';\n\t\t\t\t\ttableName: 'cities_table';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SingleStoreInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: true;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t\t{}\n\t\t\t>;\n\t\t},\n\t\ttypeof cities._.columns\n\t>\n>;\n\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\tname_db: string;\n\t\tpopulation: number | null;\n\t}, InferSelectModel<typeof cities, { dbColumnNames: true }>>\n>;\n\nExpect<\n\tEqual<{\n\t\tid?: number;\n\t\tname: string;\n\t\tpopulation?: number | null;\n\t}, typeof cities.$inferInsert>\n>;\n\nexport const customSchema = singlestoreSchema('custom_schema');\n\nexport const citiesCustom = customSchema.table('cities_table', {\n\tid: serial('id').primaryKey(),\n\tname: text('name_db').notNull(),\n\tpopulation: int('population').default(0),\n}, (cities) => ({\n\tcitiesNameIdx: index('citiesNameIdx').on(cities.id),\n}));\n\nExpect<Equal<typeof cities._.columns, typeof citiesCustom._.columns>>;\n\nexport const classes = singlestoreTable('classes_table', ({ serial, text }) => ({\n\tid: serial('id').primaryKey(),\n\tclass: text('class', { enum: ['A', 'C'] }),\n\tsubClass: text('sub_class', { enum: ['B', 'D'] }).notNull(),\n}));\n\n// TODO Implement views for SingleStore (https://docs.singlestore.com/cloud/reference/sql-reference/data-definition-language-ddl/create-view/)\n/* export const classes2 = singlestoreTable('classes_table', {\n\tid: serial().primaryKey(),\n\tclass: text({ enum: ['A', 'C'] }).$dbName('class_db'),\n\tsubClass: text({ enum: ['B', 'D'] }).notNull(),\n}); */\n\n/* export const newYorkers = singlestoreView('new_yorkers')\n\t.algorithm('merge')\n\t.sqlSecurity('definer')\n\t.as((qb) => {\n\t\tconst sq = qb\n\t\t\t.$with('sq')\n\t\t\t.as(\n\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n\t\t\t\t\t.from(users)\n\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n\t\t\t\t\t.where(sql`${users.age1} > 18`),\n\t\t\t);\n\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n\t});\n\nExpect<\n\tEqual<\n\t\tSingleStoreViewWithSelection<'new_yorkers', false, {\n\t\t\tuserId: SingleStoreColumn<{\n\t\t\t\tname: 'id';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'SingleStoreSerial';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: number;\n\t\t\t\tnotNull: true;\n\t\t\t\thasDefault: true;\n\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t\tisAutoincrement: true;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t\tcityId: SingleStoreColumn<{\n\t\t\t\tname: 'id';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'SingleStoreSerial';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: number;\n\t\t\t\tnotNull: false;\n\t\t\t\thasDefault: true;\n\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t\tisAutoincrement: true;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t}>;\n\t\t}>,\n\t\ttypeof newYorkers\n\t>\n>;\n\n{\n\tconst newYorkers = customSchema.view('new_yorkers')\n\t\t.algorithm('merge')\n\t\t.sqlSecurity('definer')\n\t\t.as((qb) => {\n\t\t\tconst sq = qb\n\t\t\t\t.$with('sq')\n\t\t\t\t.as(\n\t\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n\t\t\t\t\t\t.from(users)\n\t\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n\t\t\t\t\t\t.where(sql`${users.age1} > 18`),\n\t\t\t\t);\n\t\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n\t\t});\n\n\tExpect<\n\t\tEqual<\n\t\t\tSingleStoreViewWithSelection<'new_yorkers', false, {\n\t\t\t\tuserId: SingleStoreColumn<{\n\t\t\t\t\tname: 'id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SingleStoreSerial';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\thasDefault: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tisPrimaryKey: true;\n\t\t\t\t\tisAutoincrement: true;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: SingleStoreColumn<{\n\t\t\t\t\tname: 'id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SingleStoreSerial';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tisPrimaryKey: true;\n\t\t\t\t\tisAutoincrement: true;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers = singlestoreView('new_yorkers', {\n\t\tuserId: int('user_id').notNull(),\n\t\tcityId: int('city_id'),\n\t})\n\t\t.algorithm('merge')\n\t\t.sqlSecurity('definer')\n\t\t.as(\n\t\t\tsql`select ${users.id} as user_id, ${cities.id} as city_id from ${users} left join ${cities} on ${\n\t\t\t\teq(cities.id, users.homeCity)\n\t\t\t} where ${gt(users.age1, 18)}`,\n\t\t);\n\n\tExpect<\n\t\tEqual<\n\t\t\tSingleStoreViewWithSelection<'new_yorkers', false, {\n\t\t\t\tuserId: SingleStoreColumn<{\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SingleStoreInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: SingleStoreColumn<{\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SingleStoreInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers = customSchema.view('new_yorkers', {\n\t\tuserId: int('user_id').notNull(),\n\t\tcityId: int('city_id'),\n\t})\n\t\t.algorithm('merge')\n\t\t.sqlSecurity('definer')\n\t\t.as(\n\t\t\tsql`select ${users.id} as user_id, ${cities.id} as city_id from ${users} left join ${cities} on ${\n\t\t\t\teq(cities.id, users.homeCity)\n\t\t\t} where ${gt(users.age1, 18)}`,\n\t\t);\n\n\tExpect<\n\t\tEqual<\n\t\t\tSingleStoreViewWithSelection<'new_yorkers', false, {\n\t\t\t\tuserId: SingleStoreColumn<{\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SingleStoreInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: SingleStoreColumn<{\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SingleStoreInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers = singlestoreView('new_yorkers', {\n\t\tuserId: int('user_id').notNull(),\n\t\tcityId: int('city_id'),\n\t}).existing();\n\n\tExpect<\n\t\tEqual<\n\t\t\tSingleStoreViewWithSelection<'new_yorkers', true, {\n\t\t\t\tuserId: SingleStoreColumn<{\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SingleStoreInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: SingleStoreColumn<{\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SingleStoreInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers = customSchema.view('new_yorkers', {\n\t\tuserId: int('user_id').notNull(),\n\t\tcityId: int('city_id'),\n\t}).existing();\n\n\tExpect<\n\t\tEqual<\n\t\t\tSingleStoreViewWithSelection<'new_yorkers', true, {\n\t\t\t\tuserId: SingleStoreColumn<{\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SingleStoreInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: SingleStoreColumn<{\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SingleStoreInt';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: string | number;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n} */\n\n{\n\tconst customText = customType<{ data: string }>({\n\t\tdataType() {\n\t\t\treturn 'text';\n\t\t},\n\t});\n\n\tconst t = customText('name').notNull();\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tname: 'name';\n\t\t\t\ttableName: 'table';\n\t\t\t\tdataType: 'custom';\n\t\t\t\tcolumnType: 'SingleStoreCustomColumn';\n\t\t\t\tdata: string;\n\t\t\t\tdriverParam: unknown;\n\t\t\t\tnotNull: true;\n\t\t\t\thasDefault: false;\n\t\t\t\tisPrimaryKey: false;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tidentity: undefined;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tbrand: 'Column';\n\t\t\t\tdialect: 'singlestore';\n\t\t\t},\n\t\t\tSimplify<BuildColumn<'table', typeof t, 'singlestore'>['_']>\n\t\t>\n\t>;\n}\n\n{\n\tsinglestoreTable('test', {\n\t\tbigint: bigint('bigint', { mode: 'bigint' }),\n\t\tnumber: bigint('number', { mode: 'number' }),\n\t\tdate: date('date').default(new Date()),\n\t\tdate2: date('date2', { mode: 'date' }).default(new Date()),\n\t\tdate3: date('date3', { mode: 'string' }).default('2020-01-01'),\n\t\tdate4: date('date4', { mode: undefined }).default(new Date()),\n\t\tdatetime: datetime('datetime').default(new Date()),\n\t\tdatetime2: datetime('datetime2', { mode: 'date' }).default(new Date()),\n\t\tdatetime3: datetime('datetime3', { mode: 'string' }).default('2020-01-01'),\n\t\tdatetime4: datetime('datetime4', { mode: undefined }).default(new Date()),\n\t\ttimestamp: timestamp('timestamp').default(new Date()),\n\t\ttimestamp2: timestamp('timestamp2', { mode: 'date' }).default(new Date()),\n\t\ttimestamp3: timestamp('timestamp3', { mode: 'string' }).default('2020-01-01'),\n\t\ttimestamp4: timestamp('timestamp4', { mode: undefined }).default(new Date()),\n\t});\n}\n\n{\n\tsinglestoreTable('test', {\n\t\tcol1: decimal('col1').default('1'),\n\t});\n}\n\n{\n\tconst test = singlestoreTable('test', {\n\t\ttest1: singlestoreEnum('test', ['a', 'b', 'c'] as const).notNull(),\n\t\ttest2: singlestoreEnum('test', ['a', 'b', 'c']).notNull(),\n\t\ttest3: varchar('test', { length: 255, enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest4: varchar('test', { length: 255, enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttest5: text('test', { enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest6: text('test', { enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttest7: tinytext('test', { enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest8: tinytext('test', { enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttest9: mediumtext('test', { enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest10: mediumtext('test', { enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttest11: longtext('test', { enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest12: longtext('test', { enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttest13: char('test', { enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest14: char('test', { enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttest15: text('test').notNull(),\n\t});\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test1.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test2.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test3.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test4.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test5.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test6.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test7.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test8.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test9.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test10.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test11.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test12.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test13.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test14.enumValues>>;\n\tExpect<Equal<[string, ...string[]], typeof test.test15.enumValues>>;\n}\n\n/* { // All types with generated columns\n\tconst test = singlestoreTable('test', {\n\t\ttest1: singlestoreEnum('test', ['a', 'b', 'c'] as const).generatedAlwaysAs(sql``),\n\t\ttest2: singlestoreEnum('test', ['a', 'b', 'c']).generatedAlwaysAs(sql``),\n\t\ttest3: varchar('test', { length: 255, enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest4: varchar('test', { length: 255, enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\ttest5: text('test', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest6: text('test', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\ttest7: tinytext('test', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest8: tinytext('test', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\ttest9: mediumtext('test', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest10: mediumtext('test', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\ttest11: longtext('test', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest12: longtext('test', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\ttest13: char('test', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest14: char('test', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\ttest15: text('test').generatedAlwaysAs(sql``),\n\t});\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test1.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test2.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test3.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test4.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test5.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test6.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test7.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test8.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test9.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test10.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test11.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test12.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test13.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test14.enumValues>>;\n\tExpect<Equal<[string, ...string[]], typeof test.test15.enumValues>>;\n} */\n\n{\n\tconst getUsersTable = <TSchema extends string>(schemaName: TSchema) => {\n\t\treturn singlestoreSchema(schemaName).table('users', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\t};\n\n\tconst users1 = getUsersTable('id1');\n\tExpect<Equal<'id1', typeof users1._.schema>>;\n\n\tconst users2 = getUsersTable('id2');\n\tExpect<Equal<'id2', typeof users2._.schema>>;\n}\n\n{\n\tconst internalStaff = singlestoreTable('internal_staff', {\n\t\tuserId: int('user_id').notNull(),\n\t});\n\n\tconst customUser = singlestoreTable('custom_user', {\n\t\tid: int('id').notNull(),\n\t});\n\n\tconst ticket = singlestoreTable('ticket', {\n\t\tstaffId: int('staff_id').notNull(),\n\t});\n\n\tconst subq = db\n\t\t.select()\n\t\t.from(internalStaff)\n\t\t.leftJoin(\n\t\t\tcustomUser,\n\t\t\teq(internalStaff.userId, customUser.id),\n\t\t).as('internal_staff');\n\n\tconst mainQuery = await db\n\t\t.select()\n\t\t.from(ticket)\n\t\t.leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId));\n\n\tExpect<\n\t\tEqual<{\n\t\t\tinternal_staff: {\n\t\t\t\tinternal_staff: {\n\t\t\t\t\tuserId: number;\n\t\t\t\t};\n\t\t\t\tcustom_user: {\n\t\t\t\t\tid: number | null;\n\t\t\t\t};\n\t\t\t} | null;\n\t\t\tticket: {\n\t\t\t\tstaffId: number;\n\t\t\t};\n\t\t}[], typeof mainQuery>\n\t>;\n}\n\n// TODO Implement views for SingleStore (https://docs.singlestore.com/cloud/reference/sql-reference/data-definition-language-ddl/create-view/)\n/* {\n\tconst newYorkers = singlestoreView('new_yorkers')\n\t\t.as((qb) => {\n\t\t\tconst sq = qb\n\t\t\t\t.$with('sq')\n\t\t\t\t.as(\n\t\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n\t\t\t\t\t\t.from(users)\n\t\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n\t\t\t\t\t\t.where(sql`${users.age1} > 18`),\n\t\t\t\t);\n\t\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n\t\t});\n\n\tawait db.select().from(newYorkers).leftJoin(newYorkers, eq(newYorkers.userId, newYorkers.userId));\n} */\n\n{\n\tconst test = singlestoreTable('test', {\n\t\tid: text('id').$defaultFn(() => crypto.randomUUID()).primaryKey(),\n\t});\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid?: string;\n\t\t}, typeof test.$inferInsert>\n\t>;\n}\n\n{\n\tsinglestoreTable('test', {\n\t\tid: int('id').$default(() => 1),\n\t\tid2: int('id').$defaultFn(() => 1),\n\t\t// @ts-expect-error - should be number\n\t\tid3: int('id').$default(() => '1'),\n\t\t// @ts-expect-error - should be number\n\t\tid4: int('id').$defaultFn(() => '1'),\n\t});\n}\n{\n\tconst emailLog = singlestoreTable(\n\t\t'email_log',\n\t\t{\n\t\t\tid: int('id', { unsigned: true }).autoincrement().notNull(),\n\t\t\tclientId: int('id_client', { unsigned: true }),\n\t\t\treceiverEmail: varchar('receiver_email', { length: 255 }).notNull(),\n\t\t\tmessageId: varchar('message_id', { length: 255 }),\n\t\t\tcontextId: int('context_id', { unsigned: true }),\n\t\t\tcontextType: singlestoreEnum('context_type', ['test']).$type<['test']>(),\n\t\t\taction: varchar('action', { length: 80 }).$type<['test']>(),\n\t\t\tevents: json('events').$type<{ t: 'test' }[]>(),\n\t\t\tcreatedAt: timestamp('created_at', { mode: 'string' }).defaultNow().notNull(),\n\t\t\tupdatedAt: timestamp('updated_at', { mode: 'string' }).defaultNow().onUpdateNow(),\n\t\t},\n\t\t(table) => {\n\t\t\treturn {\n\t\t\t\temailLogId: primaryKey({ columns: [table.id], name: 'email_log_id' }),\n\t\t\t\temailLogMessageIdUnique: unique('email_log_message_id_unique').on(table.messageId),\n\t\t\t};\n\t\t},\n\t);\n\n\tExpect<\n\t\tEqual<{\n\t\t\treceiverEmail: string;\n\t\t\tid?: number | undefined;\n\t\t\tcreatedAt?: string | undefined;\n\t\t\tclientId?: number | null | undefined;\n\t\t\tmessageId?: string | null | undefined;\n\t\t\tcontextId?: number | null | undefined;\n\t\t\tcontextType?: ['test'] | null | undefined;\n\t\t\taction?: ['test'] | null | undefined;\n\t\t\tevents?:\n\t\t\t\t| {\n\t\t\t\t\tt: 'test';\n\t\t\t\t}[]\n\t\t\t\t| null\n\t\t\t\t| undefined;\n\t\t\tupdatedAt?: string | null | undefined;\n\t\t}, typeof emailLog.$inferInsert>\n\t>;\n}\n\n{\n\tconst customRequiredConfig = customType<{\n\t\tdata: string;\n\t\tdriverData: string;\n\t\tconfig: { length: number };\n\t\tconfigRequired: true;\n\t}>({\n\t\tdataType(config) {\n\t\t\tExpect<Equal<{ length: number }, typeof config>>;\n\t\t\treturn `varchar(${config.length})`;\n\t\t},\n\n\t\ttoDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\n\t\tfromDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\t});\n\n\tcustomRequiredConfig('t', { length: 10 });\n\tcustomRequiredConfig({ length: 10 });\n\t// @ts-expect-error - config is required\n\tcustomRequiredConfig('t');\n\t// @ts-expect-error - config is required\n\tcustomRequiredConfig();\n}\n\n{\n\tconst customOptionalConfig = customType<{\n\t\tdata: string;\n\t\tdriverData: string;\n\t\tconfig: { length: number };\n\t}>({\n\t\tdataType(config) {\n\t\t\tExpect<Equal<{ length: number } | undefined, typeof config>>;\n\t\t\treturn config ? `varchar(${config.length})` : `text`;\n\t\t},\n\n\t\ttoDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\n\t\tfromDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\t});\n\n\tcustomOptionalConfig('t', { length: 10 });\n\tcustomOptionalConfig('t');\n\tcustomOptionalConfig({ length: 10 });\n\tcustomOptionalConfig();\n}\n\n{\n\tsinglestoreTable('all_columns', {\n\t\tbigint: bigint('bigint', { mode: 'number' }),\n\t\tbigint2: bigint('bigint', { mode: 'number', unsigned: true }),\n\t\tbigintdef: bigint('bigintdef', { mode: 'number' }).default(0),\n\t\tbinary: binary('binary'),\n\t\tbinary1: binary('binary1', { length: 1 }),\n\t\tbinarydef: binary('binarydef').default(''),\n\t\tboolean: boolean('boolean'),\n\t\tbooleandef: boolean('booleandef').default(false),\n\t\tchar: char('char'),\n\t\tchar2: char('char2', { length: 1 }),\n\t\tchar3: char('char3', { enum: ['a', 'b', 'c'] }),\n\t\tchar4: char('char4', { length: 1, enum: ['a', 'b', 'c'] }),\n\t\tchardef: char('chardef').default(''),\n\t\tdate: date('date'),\n\t\tdate2: date('date2', { mode: 'string' }),\n\t\tdatedef: date('datedef').default(new Date()),\n\t\tdatetime: datetime('datetime'),\n\t\tdatetime2: datetime('datetime2', { mode: 'string' }),\n\t\tdatetimedef: datetime('datetimedef').default(new Date()),\n\t\tdecimal: decimal('decimal'),\n\t\tdecimal2: decimal('decimal2', { precision: 10 }),\n\t\tdecimal3: decimal('decimal3', { scale: 2 }),\n\t\tdecimal4: decimal('decimal4', { precision: 10, scale: 2 }),\n\t\tdecimaldef: decimal('decimaldef').default('0'),\n\t\tdouble: double('double'),\n\t\tdouble2: double('double2', { precision: 10 }),\n\t\tdouble3: double('double3', { scale: 2 }),\n\t\tdouble4: double('double4', { precision: 10, scale: 2 }),\n\t\tdoubledef: double('doubledef').default(0),\n\t\tenum: singlestoreEnum('enum', ['a', 'b', 'c']),\n\t\tenumdef: singlestoreEnum('enumdef', ['a', 'b', 'c']).default('a'),\n\t\tfloat: float('float'),\n\t\tfloat2: float('float2', { precision: 10 }),\n\t\tfloat3: float('float3', { scale: 2 }),\n\t\tfloat4: float('float4', { precision: 10, scale: 2 }),\n\t\tfloatdef: float('floatdef').default(0),\n\t\tint: int('int'),\n\t\tint2: int('int2', { unsigned: true }),\n\t\tintdef: int('intdef').default(0),\n\t\tjson: json('json'),\n\t\tjsondef: json('jsondef').default({}),\n\t\tmediumint: mediumint('mediumint'),\n\t\tmediumint2: mediumint('mediumint2', { unsigned: true }),\n\t\tmediumintdef: mediumint('mediumintdef').default(0),\n\t\treal: real('real'),\n\t\treal2: real('real2', { precision: 10 }),\n\t\treal3: real('real3', { scale: 2 }),\n\t\treal4: real('real4', { precision: 10, scale: 2 }),\n\t\trealdef: real('realdef').default(0),\n\t\tserial: serial('serial'),\n\t\tserialdef: serial('serialdef').default(0),\n\t\tsmallint: smallint('smallint'),\n\t\tsmallint2: smallint('smallint2', { unsigned: true }),\n\t\tsmallintdef: smallint('smallintdef').default(0),\n\t\ttext: text('text'),\n\t\ttext2: text('text2', { enum: ['a', 'b', 'c'] }),\n\t\ttextdef: text('textdef').default(''),\n\t\ttinytext: tinytext('tinytext'),\n\t\ttinytext2: tinytext('tinytext2', { enum: ['a', 'b', 'c'] }),\n\t\ttinytextdef: tinytext('tinytextdef').default(''),\n\t\tmediumtext: mediumtext('mediumtext'),\n\t\tmediumtext2: mediumtext('mediumtext2', { enum: ['a', 'b', 'c'] }),\n\t\tmediumtextdef: mediumtext('mediumtextdef').default(''),\n\t\tlongtext: longtext('longtext'),\n\t\tlongtext2: longtext('longtext2', { enum: ['a', 'b', 'c'] }),\n\t\tlongtextdef: longtext('longtextdef').default(''),\n\t\ttime: time('time'),\n\t\ttimedef: time('timedef').default('00:00:00'),\n\t\ttimestamp: timestamp('timestamp'),\n\t\ttimestamp2: timestamp('timestamp2', { mode: 'string' }),\n\t\ttimestamp3: timestamp('timestamp3', { mode: 'string' }),\n\t\ttimestamp4: timestamp('timestamp4'),\n\t\ttimestampdef: timestamp('timestampdef').default(new Date()),\n\t\ttinyint: tinyint('tinyint'),\n\t\ttinyint2: tinyint('tinyint2', { unsigned: true }),\n\t\ttinyintdef: tinyint('tinyintdef').default(0),\n\t\tvarbinary: varbinary('varbinary', { length: 1 }),\n\t\tvarbinarydef: varbinary('varbinarydef', { length: 1 }).default(''),\n\t\tvarchar: varchar('varchar', { length: 1 }),\n\t\tvarchar2: varchar('varchar2', { length: 1, enum: ['a', 'b', 'c'] }),\n\t\tvarchardef: varchar('varchardef', { length: 1 }).default(''),\n\t\tvector: vector('vector', { dimensions: 1 }),\n\t\tvector2: vector('vector2', { dimensions: 1, elementType: 'I8' }),\n\t\tyear: year('year'),\n\t\tyeardef: year('yeardef').default(0),\n\t});\n}\n\n{\n\tconst keysAsColumnNames = singlestoreTable('test', {\n\t\tid: int(),\n\t\tname: text(),\n\t});\n\n\tExpect<Equal<typeof keysAsColumnNames['id']['_']['name'], 'id'>>;\n\tExpect<Equal<typeof keysAsColumnNames['name']['_']['name'], 'name'>>;\n}\n\n{\n\tsinglestoreTable('all_columns_without_name', {\n\t\tbigint: bigint({ mode: 'number' }),\n\t\tbigint2: bigint({ mode: 'number', unsigned: true }),\n\t\tbigintdef: bigint({ mode: 'number' }).default(0),\n\t\tbinary: binary(),\n\t\tbinrary1: binary({ length: 1 }),\n\t\tbinarydef: binary().default(''),\n\t\tboolean: boolean(),\n\t\tbooleandef: boolean().default(false),\n\t\tchar: char(),\n\t\tchar2: char({ length: 1 }),\n\t\tchar3: char({ enum: ['a', 'b', 'c'] }),\n\t\tchar4: char({ length: 1, enum: ['a', 'b', 'c'] }),\n\t\tchardef: char().default(''),\n\t\tdate: date(),\n\t\tdate2: date({ mode: 'string' }),\n\t\tdatedef: date('datedef').default(new Date()),\n\t\tdatetime: datetime(),\n\t\tdatetime2: datetime({ mode: 'string' }),\n\t\tdatetimedef: datetime('datetimedef').default(new Date()),\n\t\tdecimal: decimal(),\n\t\tdecimal2: decimal({ precision: 10 }),\n\t\tdecimal3: decimal({ scale: 2 }),\n\t\tdecimal4: decimal({ precision: 10, scale: 2 }),\n\t\tdecimaldef: decimal('decimaldef').default('0'),\n\t\tdouble: double(),\n\t\tdouble2: double({ precision: 10 }),\n\t\tdouble3: double({ scale: 2 }),\n\t\tdouble4: double({ precision: 10, scale: 2 }),\n\t\tdoubledef: double().default(0),\n\t\tenum: singlestoreEnum(['a', 'b', 'c']),\n\t\tenumdef: singlestoreEnum(['a', 'b', 'c']).default('a'),\n\t\tfloat: float(),\n\t\tfloat2: float({ precision: 10 }),\n\t\tfloat3: float({ scale: 2 }),\n\t\tfloat4: float({ precision: 10, scale: 2 }),\n\t\tfloatdef: float().default(0),\n\t\tint: int(),\n\t\tint2: int({ unsigned: true }),\n\t\tintdef: int().default(0),\n\t\tjson: json(),\n\t\tjsondef: json().default({}),\n\t\tmediumint: mediumint(),\n\t\tmediumint2: mediumint({ unsigned: true }),\n\t\tmediumintdef: mediumint().default(0),\n\t\treal: real(),\n\t\treal2: real({ precision: 10 }),\n\t\treal3: real({ scale: 2 }),\n\t\treal4: real({ precision: 10, scale: 2 }),\n\t\trealdef: real().default(0),\n\t\tserial: serial(),\n\t\tserialdef: serial().default(0),\n\t\tsmallint: smallint(),\n\t\tsmallint2: smallint({ unsigned: true }),\n\t\tsmallintdef: smallint().default(0),\n\t\ttext: text(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }),\n\t\ttextdef: text().default(''),\n\t\ttinytext: tinytext(),\n\t\ttinytext2: tinytext({ enum: ['a', 'b', 'c'] }),\n\t\ttinytextdef: tinytext().default(''),\n\t\tmediumtext: mediumtext(),\n\t\tmediumtext2: mediumtext({ enum: ['a', 'b', 'c'] }),\n\t\tmediumtextdef: mediumtext().default(''),\n\t\tlongtext: longtext(),\n\t\tlongtext2: longtext({ enum: ['a', 'b', 'c'] }),\n\t\tlongtextdef: longtext().default(''),\n\t\ttime: time(),\n\t\ttimedef: time().default('00:00:00'),\n\t\ttimestamp: timestamp(),\n\t\ttimestamp2: timestamp({ mode: 'string' }),\n\t\ttimestamp3: timestamp({ mode: 'string' }),\n\t\ttimestamp4: timestamp(),\n\t\ttimestampdef: timestamp().default(new Date()),\n\t\ttinyint: tinyint(),\n\t\ttinyint2: tinyint({ unsigned: true }),\n\t\ttinyintdef: tinyint().default(0),\n\t\tvarbinary: varbinary({ length: 1 }),\n\t\tvarbinarydef: varbinary({ length: 1 }).default(''),\n\t\tvarchar: varchar({ length: 1 }),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }),\n\t\tvarchardef: varchar({ length: 1 }).default(''),\n\t\tvector: vector({ dimensions: 1 }),\n\t\tvector2: vector({ dimensions: 1, elementType: 'I8' }),\n\t\tyear: year(),\n\t\tyeardef: year().default(0),\n\t});\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/singlestore/update.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils.ts';\nimport type { SingleStoreUpdate } from '~/singlestore-core/index.ts';\nimport type { SingleStoreRawQueryResult } from '~/singlestore/session.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\nimport { users } from './tables.ts';\n\n{\n\tfunction dynamic<T extends SingleStoreUpdate>(qb: T) {\n\t\treturn qb.where(sql``);\n\t}\n\n\tconst qbBase = db.update(users).set({}).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<SingleStoreRawQueryResult, typeof result>>;\n}\n\n{\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n}\n\n{\n\tdb.update(users).set({}).where(sql``).limit(1).orderBy(sql``);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/singlestore/with.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { int, serial, singlestoreTable, text } from '~/singlestore-core/index.ts';\nimport { gt, inArray } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { db } from './db.ts';\n\nconst orders = singlestoreTable('orders', {\n\tid: serial('id').primaryKey(),\n\tregion: text('region').notNull(),\n\tproduct: text('product').notNull(),\n\tamount: int('amount').notNull(),\n\tquantity: int('quantity').notNull(),\n\t/* generated: text('generatedText').generatedAlwaysAs(sql``), */\n});\n\n{\n\tconst regionalSales = db\n\t\t.$with('regional_sales')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.groupBy(orders.region),\n\t\t);\n\n\tconst topRegions = db\n\t\t.$with('top_regions')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: orders.amount,\n\t\t\t\t})\n\t\t\t\t.from(regionalSales)\n\t\t\t\t.where(\n\t\t\t\t\tgt(\n\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\tdb.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t);\n\n\tconst result = await db\n\t\t.with(regionalSales, topRegions)\n\t\t.select({\n\t\t\tregion: orders.region,\n\t\t\tproduct: orders.product,\n\t\t\tproductUnits: sql<number>`sum(${orders.quantity})`,\n\t\t\tproductSales: sql<number>`sum(${orders.amount})`,\n\t\t})\n\t\t.from(orders)\n\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)));\n\n\tExpect<\n\t\tEqual<{\n\t\t\tregion: string;\n\t\t\tproduct: string;\n\t\t\tproductUnits: number;\n\t\t\tproductSales: number;\n\t\t}[], typeof result>\n\t>;\n\n\tconst allOrdersWith = db.$with('all_orders_with').as(db.select().from(orders));\n\tconst allFromWith = await db.with(allOrdersWith).select().from(allOrdersWith);\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid: number;\n\t\t\tregion: string;\n\t\t\tproduct: string;\n\t\t\tamount: number;\n\t\t\tquantity: number;\n\t\t\t/* generated: string | null; */\n\t\t}[], typeof allFromWith>\n\t>;\n}\n\n{\n\tconst providers = singlestoreTable('providers', {\n\t\tid: serial().primaryKey(),\n\t\tproviderName: text().notNull(),\n\t});\n\n\tconst sq1 = db.$with('providers_sq', {\n\t\tname: providers.providerName,\n\t}).as(sql`select provider_name as name from providers`);\n\tconst q1 = await db.with(sq1).select().from(sq1);\n\tExpect<Equal<typeof q1, { name: string }[]>>;\n\n\tconst sq2 = db.$with('providers_sq', {\n\t\tnested: {\n\t\t\tid: providers.id,\n\t\t},\n\t}).as(() => sql`select id from providers`);\n\tconst q2 = await db.with(sq2).select().from(sq2);\n\tExpect<Equal<typeof q2, { nested: { id: number } }[]>>;\n\n\t// @ts-expect-error\n\tdb.$with('providers_sq', { name: providers.providerName }).as(db.select().from(providers));\n\t// @ts-expect-error\n\tdb.$with('providers_sq', { name: providers.providerName }).as((qb) => qb.select().from(providers));\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/.gitignore",
    "content": "./database.db\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/count.ts",
    "content": "import { Expect } from 'type-tests/utils.ts';\nimport { and, gt, ne } from '~/sql/expressions/index.ts';\nimport { integer, sqliteTable, text } from '~/sqlite-core/index.ts';\nimport type { Equal } from '~/utils.ts';\nimport { db } from './db.ts';\n\nconst names = sqliteTable('names', {\n\tid: integer('id').primaryKey(),\n\tname: text('name'),\n\tauthorId: integer('author_id'),\n});\n\nconst separate = await db.$count(names);\n\nconst separateFilters = await db.$count(names, and(gt(names.id, 1), ne(names.name, 'forbidden')));\n\nconst embedded = await db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tauthorId: names.authorId,\n\t\tcount1: db.$count(names).as('count1'),\n\t})\n\t.from(names);\n\nconst embeddedFilters = await db\n\t.select({\n\t\tid: names.id,\n\t\tname: names.name,\n\t\tauthorId: names.authorId,\n\t\tcount1: db.$count(names, and(gt(names.id, 1), ne(names.name, 'forbidden'))).as('count1'),\n\t})\n\t.from(names);\n\nExpect<Equal<number, typeof separate>>;\n\nExpect<Equal<number, typeof separateFilters>>;\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t}[],\n\t\ttypeof embedded\n\t>\n>;\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t}[],\n\t\ttypeof embeddedFilters\n\t>\n>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/db.ts",
    "content": "import Database from 'better-sqlite3';\nimport { Database as BunDatabase } from 'bun:sqlite';\nimport { drizzle as drizzleBetterSqlite3 } from '~/better-sqlite3/index.ts';\nimport { drizzle as drizzleBun } from '~/bun-sqlite/index.ts';\nimport { drizzle as drizzleD1 } from '~/d1/index.ts';\nimport { drizzle as durableSqlite } from '~/durable-sqlite/index.ts';\n\nconst client = new Database(':memory:');\nconst bunClient = new BunDatabase(':memory:');\ndeclare const d1: D1Database;\ndeclare const durableSql: DurableObjectStorage;\n\nexport const db = drizzleBetterSqlite3(client);\nexport const bunDb = drizzleBun(bunClient);\nexport const d1Db = drizzleD1(d1);\nexport const durableSqliteDb = durableSqlite(durableSql);\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/delete.ts",
    "content": "import type { RunResult } from 'better-sqlite3';\nimport { eq } from '~/sql/expressions/index.ts';\n\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { SQLiteDelete } from '~/sqlite-core/index.ts';\nimport type { DrizzleTypeError } from '~/utils.ts';\nimport { bunDb, db } from './db.ts';\nimport { users } from './tables.ts';\n\nconst deleteRun = db.delete(users).run();\nExpect<Equal<RunResult, typeof deleteRun>>;\n\nconst deleteAll = db.delete(users).all();\nExpect<Equal<DrizzleTypeError<'.all() cannot be used without .returning()'>, typeof deleteAll>>;\n\nconst deleteGet = db.delete(users).get();\nExpect<Equal<DrizzleTypeError<'.get() cannot be used without .returning()'>, typeof deleteGet>>;\n\nconst deleteValues = db.delete(users).values();\nExpect<Equal<DrizzleTypeError<'.values() cannot be used without .returning()'>, typeof deleteValues>>;\n\nconst deleteRunBun = bunDb.delete(users).run();\nExpect<Equal<void, typeof deleteRunBun>>;\n\nconst deleteAllBun = bunDb.delete(users).all();\nExpect<Equal<DrizzleTypeError<'.all() cannot be used without .returning()'>, typeof deleteAllBun>>;\n\nconst deleteGetBun = bunDb.delete(users).get();\nExpect<Equal<DrizzleTypeError<'.get() cannot be used without .returning()'>, typeof deleteGetBun>>;\n\nconst deleteValuesBun = bunDb.delete(users).values();\nExpect<Equal<DrizzleTypeError<'.values() cannot be used without .returning()'>, typeof deleteValuesBun>>;\n\nconst deleteRunWhere = db.delete(users).where(eq(users.id, 1)).run();\nExpect<Equal<RunResult, typeof deleteRunWhere>>;\n\nconst deleteAllWhere = db.delete(users).where(eq(users.id, 1)).all();\nExpect<Equal<DrizzleTypeError<'.all() cannot be used without .returning()'>, typeof deleteAllWhere>>;\n\nconst deleteGetWhere = db.delete(users).where(eq(users.id, 1)).get();\nExpect<Equal<DrizzleTypeError<'.get() cannot be used without .returning()'>, typeof deleteGetWhere>>;\n\nconst deleteValuesWhere = db.delete(users).where(eq(users.id, 1)).values();\nExpect<Equal<DrizzleTypeError<'.values() cannot be used without .returning()'>, typeof deleteValuesWhere>>;\n\nconst deleteRunBunWhere = bunDb.delete(users).where(eq(users.id, 1)).run();\nExpect<Equal<void, typeof deleteRunBunWhere>>;\n\nconst deleteAllBunWhere = bunDb.delete(users).where(eq(users.id, 1)).all();\nExpect<Equal<DrizzleTypeError<'.all() cannot be used without .returning()'>, typeof deleteAllBunWhere>>;\n\nconst deleteGetBunWhere = bunDb.delete(users).where(eq(users.id, 1)).get();\nExpect<Equal<DrizzleTypeError<'.get() cannot be used without .returning()'>, typeof deleteGetBunWhere>>;\n\nconst deleteValuesBunWhere = bunDb.delete(users).where(eq(users.id, 1)).values();\nExpect<Equal<DrizzleTypeError<'.values() cannot be used without .returning()'>, typeof deleteValuesBunWhere>>;\n\nconst deleteRunReturning = db.delete(users).returning().run();\nExpect<Equal<RunResult, typeof deleteRunReturning>>;\n\nconst deleteAllReturning = db.delete(users).returning().all();\nExpect<Equal<typeof users.$inferSelect[], typeof deleteAllReturning>>;\n\nconst deleteGetReturning = db.delete(users).returning().get();\nExpect<Equal<typeof users.$inferSelect | undefined, typeof deleteGetReturning>>;\n\nconst deleteValuesReturning = db.delete(users).returning().values();\nExpect<Equal<any[][], typeof deleteValuesReturning>>;\n\nconst deleteRunBunReturning = bunDb.delete(users).returning().run();\nExpect<Equal<void, typeof deleteRunBunReturning>>;\n\nconst deleteAllBunReturning = bunDb.delete(users).returning().all();\nExpect<Equal<typeof users.$inferSelect[], typeof deleteAllBunReturning>>;\n\nconst deleteGetBunReturning = bunDb.delete(users).returning().get();\nExpect<Equal<typeof users.$inferSelect | undefined, typeof deleteGetBunReturning>>;\n\nconst deleteValuesBunReturning = bunDb.delete(users).returning().values();\nExpect<Equal<any[][], typeof deleteValuesBunReturning>>;\n\nconst deleteAllReturningPartial = db.delete(users).returning({\n\tmyId: users.id,\n\tmyHomeCity: users.homeCity,\n}).all();\nExpect<Equal<{ myId: number; myHomeCity: number }[], typeof deleteAllReturningPartial>>;\n\nconst deleteGetReturningPartial = db.delete(users).returning({\n\tmyId: users.id,\n\tmyHomeCity: users.homeCity,\n}).get();\nExpect<Equal<{ myId: number; myHomeCity: number } | undefined, typeof deleteGetReturningPartial>>;\n\nconst deleteValuesReturningPartial = db.delete(users).returning({\n\tmyId: users.id,\n\tmyHomeCity: users.homeCity,\n}).values();\nExpect<Equal<any[][], typeof deleteValuesReturningPartial>>;\n\nconst deleteAllBunReturningPartial = bunDb.delete(users).returning({\n\tmyId: users.id,\n\tmyHomeCity: users.homeCity,\n}).all();\nExpect<Equal<{ myId: number; myHomeCity: number }[], typeof deleteAllBunReturningPartial>>;\n\nconst deleteGetBunReturningPartial = bunDb.delete(users).returning({\n\tmyId: users.id,\n\tmyHomeCity: users.homeCity,\n}).get();\nExpect<Equal<{ myId: number; myHomeCity: number } | undefined, typeof deleteGetBunReturningPartial>>;\n\nconst deleteValuesBunReturningPartial = bunDb.delete(users).returning({\n\tmyId: users.id,\n\tmyHomeCity: users.homeCity,\n}).values();\nExpect<Equal<any[][], typeof deleteValuesBunReturningPartial>>;\n\n{\n\tfunction dynamic<T extends SQLiteDelete>(qb: T) {\n\t\treturn qb.where(sql``).returning();\n\t}\n\n\tconst qbBase = db.delete(users).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tfunction withReturning<T extends SQLiteDelete>(qb: T) {\n\t\treturn qb.returning();\n\t}\n\n\tconst qbBase = db.delete(users).$dynamic();\n\tconst qb = withReturning(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tdb\n\t\t.delete(users)\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n\n\tdb\n\t\t.delete(users)\n\t\t.returning()\n\t\t// @ts-expect-error method was already called\n\t\t.returning();\n}\n\n{\n\tdb.delete(users).where(sql``).limit(1).orderBy(sql``);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/generated-columns.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils';\nimport { type InferInsertModel, type InferSelectModel, sql } from '~/index';\nimport { drizzle } from '~/libsql';\nimport { int, sqliteTable, text } from '~/sqlite-core';\nimport { db } from './db';\n\nconst users = sqliteTable(\n\t'users',\n\t{\n\t\tid: int('id').primaryKey(),\n\t\tfirstName: text('first_name', { length: 255 }),\n\t\tlastName: text('last_name', { length: 255 }),\n\t\temail: text('email').notNull(),\n\t\tfullName: text('full_name')\n\t\t\t.generatedAlwaysAs(sql`concat_ws(first_name, ' ', last_name)`),\n\t\tupperName: text('upper_name').generatedAlwaysAs(\n\t\t\tsql` case when first_name is null then null else upper(first_name) end `,\n\t\t).$type<string | null>(), // There is no way for drizzle to detect nullability in these cases. This is how the user can work around it\n\t},\n);\n\n{\n\ttype User = typeof users.$inferSelect;\n\ttype NewUser = typeof users.$inferInsert;\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string | null;\n\t\t\t\tupperName: string | null;\n\t\t\t},\n\t\t\tUser\n\t\t>\n\t>();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\temail: string;\n\t\t\t\tid?: number | undefined;\n\t\t\t\tfirstName?: string | null | undefined;\n\t\t\t\tlastName?: string | null | undefined;\n\t\t\t},\n\t\t\tNewUser\n\t\t>\n\t>();\n}\n\n{\n\ttype User = InferSelectModel<typeof users>;\n\ttype NewUser = InferInsertModel<typeof users>;\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string | null;\n\t\t\t\tupperName: string | null;\n\t\t\t},\n\t\t\tUser\n\t\t>\n\t>();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\temail: string;\n\t\t\t\tid?: number | undefined;\n\t\t\t\tfirstName?: string | null | undefined;\n\t\t\t\tlastName?: string | null | undefined;\n\t\t\t},\n\t\t\tNewUser\n\t\t>\n\t>();\n}\n\n{\n\tconst dbUsers = await db.select().from(users);\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string | null;\n\t\t\t\tupperName: string | null;\n\t\t\t}[],\n\t\t\ttypeof dbUsers\n\t\t>\n\t>();\n}\n\n{\n\tconst db = drizzle({} as any, { schema: { users } });\n\n\tconst dbUser = await db.query.users.findFirst();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string | null;\n\t\t\t\tupperName: string | null;\n\t\t\t} | undefined,\n\t\t\ttypeof dbUser\n\t\t>\n\t>();\n}\n\n{\n\tconst db = drizzle({} as any, { schema: { users } });\n\n\tconst dbUser = await db.query.users.findMany();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tfirstName: string | null;\n\t\t\t\tlastName: string | null;\n\t\t\t\temail: string;\n\t\t\t\tfullName: string | null;\n\t\t\t\tupperName: string | null;\n\t\t\t}[],\n\t\t\ttypeof dbUser\n\t\t>\n\t>();\n}\n\n{\n\t// @ts-expect-error - Can't use the fullName because it's a generated column\n\tawait db.insert(users).values({\n\t\tfirstName: 'test',\n\t\tlastName: 'test',\n\t\temail: 'test',\n\t\tfullName: 'test',\n\t});\n}\n\n{\n\tawait db.update(users).set({\n\t\tfirstName: 'test',\n\t\tlastName: 'test',\n\t\temail: 'test',\n\t\t// @ts-expect-error - Can't use the fullName because it's a generated column\n\t\tfullName: 'test',\n\t});\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/insert.ts",
    "content": "import type { RunResult } from 'better-sqlite3';\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { and, eq } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { integer, QueryBuilder, sqliteTable, text } from '~/sqlite-core/index.ts';\nimport type { SQLiteInsert } from '~/sqlite-core/query-builders/insert.ts';\nimport type { DrizzleTypeError } from '~/utils.ts';\nimport { bunDb, db } from './db.ts';\nimport type { NewUser } from './tables.ts';\nimport { users } from './tables.ts';\n\nconst newUser: NewUser = {\n\thomeCity: 1,\n\tclass: 'A',\n\tage1: 1,\n\tenumCol: 'a',\n\tserialNotNull: 1,\n};\n\nconst insertRun = db.insert(users).values(newUser).run();\nExpect<Equal<RunResult, typeof insertRun>>;\n\nconst insertRunBun = bunDb.insert(users).values(newUser).run();\nExpect<Equal<void, typeof insertRunBun>>;\n\nconst insertAll = db.insert(users).values(newUser).all();\nExpect<Equal<DrizzleTypeError<'.all() cannot be used without .returning()'>, typeof insertAll>>;\n\nconst insertAllBun = bunDb.insert(users).values(newUser).all();\nExpect<Equal<DrizzleTypeError<'.all() cannot be used without .returning()'>, typeof insertAllBun>>;\n\nconst insertGet = db.insert(users).values(newUser).get();\nExpect<Equal<DrizzleTypeError<'.get() cannot be used without .returning()'>, typeof insertGet>>;\n\nconst insertGetBun = bunDb.insert(users).values(newUser).get();\nExpect<Equal<DrizzleTypeError<'.get() cannot be used without .returning()'>, typeof insertGetBun>>;\n\nconst insertValues = db.insert(users).values(newUser).values();\nExpect<Equal<DrizzleTypeError<'.values() cannot be used without .returning()'>, typeof insertValues>>;\n\nconst insertValuesBun = bunDb.insert(users).values(newUser).values();\nExpect<Equal<DrizzleTypeError<'.values() cannot be used without .returning()'>, typeof insertValuesBun>>;\n\nconst insertRunReturningAll = db.insert(users).values(newUser).returning().run();\nExpect<Equal<RunResult, typeof insertRunReturningAll>>;\n\nconst insertRunReturningAllBun = bunDb.insert(users).values(newUser).returning().run();\nExpect<Equal<void, typeof insertRunReturningAllBun>>;\n\nconst insertAllReturningAll = db.insert(users).values(newUser).returning().all();\nExpect<Equal<typeof users.$inferSelect[], typeof insertAllReturningAll>>;\n\nconst insertAllReturningAllBun = bunDb.insert(users).values(newUser).returning().all();\nExpect<Equal<typeof users.$inferSelect[], typeof insertAllReturningAllBun>>;\n\nconst insertGetReturningAll = db.insert(users).values(newUser).returning().get();\nExpect<Equal<typeof users.$inferSelect, typeof insertGetReturningAll>>;\n\nconst insertGetReturningAllBun = bunDb.insert(users).values(newUser).returning().get();\nExpect<Equal<typeof users.$inferSelect, typeof insertGetReturningAllBun>>;\n\nconst insertValuesReturningAll = db.insert(users).values(newUser).returning().values();\nExpect<Equal<any[][], typeof insertValuesReturningAll>>;\n\nconst insertValuesReturningAllBun = bunDb.insert(users).values(newUser).returning().values();\nExpect<Equal<any[][], typeof insertValuesReturningAllBun>>;\n\nconst insertRunReturningPartial = db.insert(users).values(newUser).returning({\n\tid: users.id,\n\thomeCity: users.homeCity,\n\tmySubclass: users.subClass,\n}).run();\nExpect<Equal<RunResult, typeof insertRunReturningPartial>>;\n\nconst insertRunReturningPartialBun = bunDb.insert(users).values(newUser).returning({\n\tid: users.id,\n\thomeCity: users.homeCity,\n\tmySubclass: users.subClass,\n}).run();\nExpect<Equal<void, typeof insertRunReturningPartialBun>>;\n\nconst insertAllReturningPartial = db.insert(users).values(newUser).returning({\n\tid: users.id,\n\thomeCity: users.homeCity,\n\tmySubclass: users.subClass,\n}).all();\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\thomeCity: number;\n\t\t\tmySubclass: 'B' | 'D' | null;\n\t\t}[],\n\t\ttypeof insertAllReturningPartial\n\t>\n>;\n\nconst insertAllReturningPartialBun = bunDb.insert(users).values(newUser).returning({\n\tid: users.id,\n\thomeCity: users.homeCity,\n\tmySubclass: users.subClass,\n}).all();\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\thomeCity: number;\n\t\t\tmySubclass: 'B' | 'D' | null;\n\t\t}[],\n\t\ttypeof insertAllReturningPartialBun\n\t>\n>;\n\nconst insertReturningSql = db.insert(users).values(newUser).returning({\n\tid: users.id,\n\thomeCity: users.homeCity,\n\tsubclassLower: sql`lower(${users.subClass})`,\n\tclassLower: sql<string>`lower(${users.class})`,\n}).all();\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\thomeCity: number;\n\t\tsubclassLower: unknown;\n\t\tclassLower: string;\n\t}[], typeof insertReturningSql>\n>;\n\nconst insertReturningSqlBun = bunDb.insert(users).values(newUser).returning({\n\tid: users.id,\n\thomeCity: users.homeCity,\n\tsubclassLower: sql`lower(${users.subClass})`,\n\tclassLower: sql<string>`lower(${users.class})`,\n}).all();\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\thomeCity: number;\n\t\tsubclassLower: unknown;\n\t\tclassLower: string;\n\t}[], typeof insertReturningSqlBun>\n>;\n\ndb.insert(users).values(newUser).onConflictDoNothing().run();\ndb.insert(users).values(newUser).onConflictDoNothing({ target: users.class }).run();\ndb.insert(users).values(newUser).onConflictDoNothing({\n\ttarget: [\n\t\tsql`${users.class} collate nocase asc`,\n\t\tsql`${users.age1} desc`,\n\t\tusers.subClass,\n\t],\n}).run();\n\ndb.insert(users).values(newUser).onConflictDoUpdate({\n\ttarget: users.age1,\n\tset: { age1: sql`${users.age1} + 1` },\n})\n\t.run();\n\ndb.insert(users).values(newUser)\n\t.onConflictDoUpdate({\n\t\ttarget: users.age1,\n\t\tset: { age1: sql`${users.age1} + 1` },\n\t\twhere: sql`${users.age1} > 10`,\n\t})\n\t.onConflictDoNothing()\n\t.run();\n\nconst stmt = db.select().from(users)\n\t.where(and(eq(users.id, sql.placeholder('id'))))\n\t.offset(sql.placeholder('offset'))\n\t.limit(sql.placeholder('limit'))\n\t.prepare();\nstmt.run({ id: 1, limit: 10, offset: 20 });\n\n{\n\tfunction dynamic<T extends SQLiteInsert>(qb: T) {\n\t\treturn qb.returning().onConflictDoNothing().onConflictDoUpdate({ set: {}, target: users.id, where: sql`` });\n\t}\n\n\tconst qbBase = db.insert(users).values({ age1: 0, class: 'A', enumCol: 'a', homeCity: 0, serialNotNull: 0 })\n\t\t.$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tfunction withReturning<T extends SQLiteInsert>(qb: T) {\n\t\treturn qb.returning();\n\t}\n\n\tconst qbBase = db.insert(users).values({ age1: 0, class: 'A', enumCol: 'a', homeCity: 0, serialNotNull: 0 })\n\t\t.$dynamic();\n\tconst qb = withReturning(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tdb\n\t\t.insert(users)\n\t\t.values({ age1: 0, class: 'A', enumCol: 'a', homeCity: 0, serialNotNull: 0 })\n\t\t.returning()\n\t\t// @ts-expect-error method was already called\n\t\t.returning();\n}\n\n{\n\tconst users1 = sqliteTable('users1', {\n\t\tid: integer('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tadmin: integer('admin', { mode: 'boolean' }).notNull().default(false),\n\t});\n\tconst users2 = sqliteTable('users2', {\n\t\tid: integer('id').primaryKey(),\n\t\tfirstName: text('first_name').notNull(),\n\t\tlastName: text('last_name').notNull(),\n\t\tadmin: integer('admin', { mode: 'boolean' }).notNull().default(false),\n\t\tphoneNumber: text('phone_number'),\n\t});\n\n\tconst qb = new QueryBuilder();\n\n\tdb.insert(users1).select(sql`select * from users1`);\n\tdb.insert(users1).select(() => sql`select * from users1`);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tname: users2.firstName,\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2),\n\t\t);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tname: users2.firstName,\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2).where(sql``),\n\t\t);\n\n\tdb\n\t\t.insert(users2)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tfirstName: users2.firstName,\n\t\t\t\tlastName: users2.lastName,\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2),\n\t\t);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\tqb.select({\n\t\t\t\tname: sql`${users2.firstName} || ' ' || ${users2.lastName}`.as('name'),\n\t\t\t\tadmin: users2.admin,\n\t\t\t}).from(users2),\n\t\t);\n\n\tdb\n\t\t.insert(users1)\n\t\t.select(\n\t\t\t// @ts-expect-error name is undefined\n\t\t\tqb.select({ admin: users1.admin }).from(users1),\n\t\t);\n\n\tdb.insert(users1).select(db.select().from(users1));\n\tdb.insert(users1).select(() => db.select().from(users1));\n\tdb.insert(users1).select((qb) => qb.select().from(users1));\n\t// @ts-expect-error tables have different keys\n\tdb.insert(users1).select(db.select().from(users2));\n\t// @ts-expect-error tables have different keys\n\tdb.insert(users1).select(() => db.select().from(users2));\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/no-strict-null-checks/test.ts",
    "content": "import { drizzle } from '~/better-sqlite3';\nimport { sqliteTable, text } from '~/sqlite-core';\n\nexport const test = sqliteTable(\n\t'test',\n\t{\n\t\tid: text('id')\n\t\t\t.primaryKey()\n\t\t\t.generatedAlwaysAs('genstr'),\n\t\tname: text('name').$defaultFn(() => '' as string),\n\t\ttitle: text('title').notNull(),\n\t\tdescription: text('description'),\n\t\tdbdef: text('dbdef').default('dbdefval'),\n\t},\n);\n\nconst db = drizzle.mock();\n\ndb.update(test)\n\t.set({\n\t\t// @ts-expect-error\n\t\tid: '1',\n\t\tname: 'name',\n\t\ttitle: 'title',\n\t\tdescription: 'desc',\n\t\tdbdef: 'upddef',\n\t});\n\ndb.update(test)\n\t.set({\n\t\tname: 'name',\n\t\ttitle: 'title',\n\t\tdescription: 'desc',\n\t\tdbdef: 'upddef',\n\t});\n\ndb.insert(test).values({\n\t// @ts-expect-error\n\tid: '1',\n\tname: 'name',\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\tname: 'name',\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n\tdescription: 'desc',\n\tdbdef: 'upddef',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n\tdescription: 'desc',\n});\n\ndb.insert(test).values({\n\ttitle: 'title',\n});\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/no-strict-null-checks/tsconfig.json",
    "content": "{\n\t\"extends\": \"../../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"noEmit\": true,\n\t\t\"strictNullChecks\": false,\n\t\t\"strictPropertyInitialization\": false,\n\t\t\"exactOptionalPropertyTypes\": false\n\t},\n\t\"include\": [\"./test.ts\"]\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/other.ts",
    "content": "import type { RunResult } from 'better-sqlite3';\nimport { eq, inArray } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\n\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { db } from './db.ts';\nimport { users } from './tables.ts';\n\nconst query = sql`select ${users.id}, ${users.class} from ${users} where ${inArray(users.id, [1, 2, 3])} and ${\n\teq(users.class, 'A')\n}`;\n\nconst all = await db.all(query);\nExpect<Equal<unknown[], typeof all>>;\n\nconst allValuesTyped = await db.values<[number, 'A' | 'B' | 'C']>(query);\nExpect<Equal<[number, 'A' | 'B' | 'C'][], typeof allValuesTyped>>;\n\nconst allObjects = await db.all(query);\nExpect<Equal<unknown[], typeof allObjects>>;\n\nconst allObjectsTyped = await db.all<{ id: number; class: 'A' | 'B' | 'C' }>(query);\nExpect<Equal<{ id: number; class: 'A' | 'B' | 'C' }[], typeof allObjectsTyped>>;\n\nconst run = await db.run(query);\nExpect<Equal<RunResult, typeof run>>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/select.ts",
    "content": "import {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from '~/sql/expressions/index.ts';\nimport { type InferSelectViewModel, param, sql } from '~/sql/sql.ts';\nimport { alias } from '~/sqlite-core/alias.ts';\n\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { integer, text } from '~/sqlite-core/index.ts';\nimport type { SQLiteSelect, SQLiteSelectQueryBuilder } from '~/sqlite-core/query-builders/select.types.ts';\nimport { sqliteTable } from '~/sqlite-core/table.ts';\nimport { sqliteView } from '~/sqlite-core/view.ts';\nimport { db } from './db.ts';\nimport { cities, classes, newYorkers, users } from './tables.ts';\n\nconst city = alias(cities, 'city');\nconst city1 = alias(cities, 'city1');\n\nconst leftJoinFull = db.select().from(users).leftJoin(city, eq(users.id, city.id)).all();\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof cities.$inferSelect | null;\n\t\t}[],\n\t\ttypeof leftJoinFull\n\t>\n>;\n\nconst rightJoinFull = db.select().from(users).rightJoin(city, eq(users.id, city.id)).all();\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect | null;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof rightJoinFull\n\t>\n>;\n\nconst innerJoinFull = db.select().from(users).innerJoin(city, eq(users.id, city.id)).all();\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof innerJoinFull\n\t>\n>;\n\nconst fullJoinFull = db.select().from(users).fullJoin(city, eq(users.id, city.id)).all();\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect | null;\n\t\t\tcity: typeof city.$inferSelect | null;\n\t\t}[],\n\t\ttypeof fullJoinFull\n\t>\n>;\n\nconst crossJoinFull = db.select().from(users).crossJoin(city).all();\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tcity: typeof city.$inferSelect;\n\t\t}[],\n\t\ttypeof crossJoinFull\n\t>\n>;\n\nconst leftJoinFlat = db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserName: users.name,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.leftJoin(city, eq(users.id, city.id))\n\t.all();\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserName: string | null;\n\t\tcityId: number | null;\n\t\tcityName: string | null;\n\t}[], typeof leftJoinFlat>\n>;\n\nconst rightJoinFlat = db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserName: users.name,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.rightJoin(city, eq(users.id, city.id))\n\t.all();\n\nExpect<\n\tEqual<{\n\t\tuserId: number | null;\n\t\tuserName: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof rightJoinFlat>\n>;\n\nconst innerJoinFlat = db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserName: users.name,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.innerJoin(city, eq(users.id, city.id))\n\t.all();\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserName: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof innerJoinFlat>\n>;\n\nconst fullJoinFlat = db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserName: users.name,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.fullJoin(city, eq(users.id, city.id))\n\t.all();\n\nExpect<\n\tEqual<{\n\t\tuserId: number | null;\n\t\tuserName: string | null;\n\t\tcityId: number | null;\n\t\tcityName: string | null;\n\t}[], typeof fullJoinFlat>\n>;\n\nconst crossJoinFlat = db\n\t.select({\n\t\tuserId: users.id,\n\t\tuserName: users.name,\n\t\tcityId: city.id,\n\t\tcityName: city.name,\n\t})\n\t.from(users)\n\t.crossJoin(city)\n\t.all();\n\nExpect<\n\tEqual<{\n\t\tuserId: number;\n\t\tuserName: string | null;\n\t\tcityId: number;\n\t\tcityName: string;\n\t}[], typeof crossJoinFlat>\n>;\n\nconst leftJoinMixed = db\n\t.select({\n\t\tid: users.id,\n\t\tname: users.name,\n\t\tnameUpper: sql<string | null>`upper(${users.name})`,\n\t\tidComplex: sql<string | null>`${users.id}::text || ${city.id}::text`,\n\t\tcity: {\n\t\t\tid: city.id,\n\t\t\tname: city.name,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(city, eq(users.id, city.id))\n\t.all();\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tnameUpper: string | null;\n\t\t\tidComplex: string | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[],\n\t\ttypeof leftJoinMixed\n\t>\n>;\n\nconst leftJoinMixed2 = db\n\t.select({\n\t\tid: users.id,\n\t\tname: users.name,\n\t\tfoo: {\n\t\t\tbar: users.id,\n\t\t\tbaz: cities.id,\n\t\t},\n\t})\n\t.from(users)\n\t.leftJoin(cities, eq(users.id, cities.id))\n\t.all();\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tfoo: {\n\t\t\t\tbar: number;\n\t\t\t\tbaz: number | null;\n\t\t\t};\n\t\t}[],\n\t\ttypeof leftJoinMixed2\n\t>\n>;\n\nconst joinAll = db\n\t.select()\n\t.from(users)\n\t.leftJoin(cities, eq(users.id, cities.id))\n\t.rightJoin(city, eq(city.id, users.id))\n\t.rightJoin(city1, eq(city1.id, users.id))\n\t.all();\nExpect<\n\tEqual<{\n\t\tusers_table: typeof users.$inferSelect | null;\n\t\tcities_table: typeof cities.$inferSelect | null;\n\t\tcity: typeof city.$inferSelect | null;\n\t\tcity1: typeof city1.$inferSelect;\n\t}[], typeof joinAll>\n>;\n\nconst joinGet = db\n\t.select()\n\t.from(users)\n\t.leftJoin(cities, eq(users.id, cities.id))\n\t.rightJoin(city, eq(city.id, users.id))\n\t.rightJoin(city1, eq(city1.id, users.id))\n\t.get();\nExpect<\n\tEqual<\n\t\t{\n\t\t\tusers_table: typeof users.$inferSelect | null;\n\t\t\tcities_table: typeof cities.$inferSelect | null;\n\t\t\tcity: typeof city.$inferSelect | null;\n\t\t\tcity1: typeof city1.$inferSelect;\n\t\t} | undefined,\n\t\ttypeof joinGet\n\t>\n>;\n\nconst joinValues = db\n\t.select()\n\t.from(users)\n\t.leftJoin(cities, eq(users.id, cities.id))\n\t.rightJoin(city, eq(city.id, users.id))\n\t.rightJoin(city1, eq(city1.id, users.id))\n\t.values();\nExpect<Equal<any[][], typeof joinValues>>;\n\nconst joinPartial = db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t\tage: users.age1,\n\t\t\tname: users.name,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t\tname: cities.name,\n\t\t},\n\t})\n\t.from(users)\n\t.fullJoin(cities, eq(users.id, cities.id))\n\t.all();\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string | null;\n\t\t\t\tage: number;\n\t\t\t} | null;\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[],\n\t\ttypeof joinPartial\n\t>\n>;\n\nconst join3 = db\n\t.select({\n\t\tuserId: users.id,\n\t\tcityId: cities.id,\n\t\tclassId: classes.id,\n\t})\n\t.from(users)\n\t.fullJoin(cities, eq(users.id, cities.id))\n\t.rightJoin(classes, eq(users.id, classes.id)).all();\n\nExpect<\n\tEqual<{\n\t\tuserId: number | null;\n\t\tcityId: number | null;\n\t\tclassId: number;\n\t}[], typeof join3>\n>;\n\ndb\n\t.select()\n\t.from(users)\n\t.where(exists(db.select().from(cities).where(eq(users.homeCity, cities.id))));\n\nfunction mapFunkyFuncResult(valueFromDriver: unknown) {\n\treturn {\n\t\tfoo: (valueFromDriver as Record<string, any>)['foo'],\n\t};\n}\n\nconst age = 1;\n\nconst allOperators = db\n\t.select({\n\t\tcol2: sql`5 - ${users.id} + 1`, // unknown\n\t\tcol3: sql<number>`${users.id} + 1`, // number\n\t\tcol33: sql`${users.id} + 1`.mapWith(users.id), // number\n\t\tcol34: sql`${users.id} + 1`.mapWith(mapFunkyFuncResult), // number\n\t\tcol4: sql<string | number>`one_or_another(${users.id}, ${users.class})`, // string | number\n\t\tcol5: sql`true`, // unknown\n\t\tcol6: sql<boolean>`true`, // boolean\n\t\tcol7: sql<number>`random()`, // number\n\t\tcol8: sql`some_funky_func(${users.id})`.mapWith(mapFunkyFuncResult), // { foo: string }\n\t\tcol9: sql`greatest(${users.createdAt}, ${param(new Date(), users.createdAt)})`, // unknown\n\t\tcol10: sql<Date | boolean>`date_or_false(${users.createdAt}, ${param(new Date(), users.createdAt)})`, // Date | boolean\n\t\tcol11: sql`${users.age1} + ${age}`, // unknown\n\t\tcol12: sql`${users.age1} + ${param(age, users.age1)}`, // unknown\n\t\tcol13: sql`lower(${users.class})`, // unknown\n\t\tcol14: sql<number>`length(${users.class})`, // number\n\t\tcount: sql<number>`count(*)`, // number\n\t})\n\t.from(users)\n\t.where(and(\n\t\teq(users.id, 1),\n\t\tne(users.id, 1),\n\t\tor(eq(users.id, 1), ne(users.id, 1)),\n\t\tnot(eq(users.id, 1)),\n\t\tgt(users.id, 1),\n\t\tgte(users.id, 1),\n\t\tlt(users.id, 1),\n\t\tlte(users.id, 1),\n\t\tinArray(users.id, [1, 2, 3]),\n\t\tinArray(users.id, db.select({ id: users.id }).from(users)),\n\t\tinArray(users.id, sql`select id from ${users}`),\n\t\tnotInArray(users.id, [1, 2, 3]),\n\t\tnotInArray(users.id, db.select({ id: users.id }).from(users)),\n\t\tnotInArray(users.id, sql`select id from ${users}`),\n\t\tisNull(users.subClass),\n\t\tisNotNull(users.id),\n\t\texists(db.select({ id: users.id }).from(users)),\n\t\texists(sql`select id from ${users}`),\n\t\tnotExists(db.select({ id: users.id }).from(users)),\n\t\tnotExists(sql`select id from ${users}`),\n\t\tbetween(users.id, 1, 2),\n\t\tnotBetween(users.id, 1, 2),\n\t\tlike(users.id, '%1%'),\n\t\tnotLike(users.id, '%1%'),\n\t\tilike(users.id, '%1%'),\n\t\tnotIlike(users.id, '%1%'),\n\t)).all();\n\nExpect<\n\tEqual<{\n\t\tcol2: unknown;\n\t\tcol3: number;\n\t\tcol33: number;\n\t\tcol34: { foo: any };\n\t\tcol4: string | number;\n\t\tcol5: unknown;\n\t\tcol6: boolean;\n\t\tcol7: number;\n\t\tcol8: {\n\t\t\tfoo: any;\n\t\t};\n\t\tcol9: unknown;\n\t\tcol10: boolean | Date;\n\t\tcol11: unknown;\n\t\tcol12: unknown;\n\t\tcol13: unknown;\n\t\tcol14: number;\n\t\tcount: number;\n\t}[], typeof allOperators>\n>;\n\nconst textSelect = db\n\t.select({\n\t\tt: users.name,\n\t})\n\t.from(users)\n\t.all();\n\nExpect<Equal<{ t: string | null }[], typeof textSelect>>;\n\nconst homeCity = alias(cities, 'homeCity');\nconst c = alias(classes, 'c');\nconst otherClass = alias(classes, 'otherClass');\nconst anotherClass = alias(classes, 'anotherClass');\nconst friend = alias(users, 'friend');\nconst currentCity = alias(cities, 'currentCity');\nconst subscriber = alias(users, 'subscriber');\nconst closestCity = alias(cities, 'closestCity');\n\nconst megaJoin = db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t\tmaxAge: sql`max(${users.age1})`,\n\t\t},\n\t\tcity: {\n\t\t\tid: cities.id,\n\t\t},\n\t\thomeCity,\n\t\tc,\n\t\totherClass,\n\t\tanotherClass,\n\t\tfriend,\n\t\tcurrentCity,\n\t\tsubscriber,\n\t\tclosestCity,\n\t})\n\t.from(users)\n\t.innerJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.innerJoin(homeCity, sql`${users.homeCity} = ${homeCity.id}`)\n\t.innerJoin(c, eq(c.id, users.class))\n\t.innerJoin(otherClass, sql`${c.id} = ${otherClass.id}`)\n\t.innerJoin(anotherClass, sql`${users.class} = ${anotherClass.id}`)\n\t.innerJoin(friend, sql`${users.id} = ${friend.id}`)\n\t.innerJoin(currentCity, sql`${homeCity.id} = ${currentCity.id}`)\n\t.innerJoin(subscriber, sql`${users.class} = ${subscriber.id}`)\n\t.innerJoin(closestCity, sql`${users.currentCity} = ${closestCity.id}`)\n\t.where(and(sql`${users.age1} > 0`, eq(cities.id, 1)))\n\t.limit(1)\n\t.offset(1).all();\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tmaxAge: unknown;\n\t\t\t};\n\t\t\tcity: {\n\t\t\t\tid: number;\n\t\t\t};\n\t\t\thomeCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t\tcurrentCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t\tc: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t};\n\t\t\totherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t};\n\t\t\tanotherClass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t};\n\t\t\tfriend: {\n\t\t\t\tid: number;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number | null;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\tname: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t};\n\t\t\tsubscriber: {\n\t\t\t\tid: number;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number | null;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\tname: string | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t};\n\t\t\tclosestCity: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t}[],\n\t\ttypeof megaJoin\n\t>\n>;\n\nconst friends = alias(users, 'friends');\n\nconst join4 = db\n\t.select({\n\t\tuser: {\n\t\t\tid: users.id,\n\t\t},\n\t\tusers123: {\n\t\t\tid: users.id,\n\t\t},\n\t\tcity: {\n\t\t\tname: cities.name,\n\t\t\tpopulation: cities.population,\n\t\t},\n\t\tclass: classes,\n\t\tfriend: friends,\n\t})\n\t.from(users)\n\t.innerJoin(cities, sql`${users.id} = ${cities.id}`)\n\t.innerJoin(classes, sql`${cities.id} = ${classes.id}`)\n\t.innerJoin(friends, sql`${friends.id} = ${users.id}`)\n\t.where(sql`${users.age1} > 0`).all();\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t};\n\t\t\tusers123: {\n\t\t\t\tid: number;\n\t\t\t};\n\t\t\tcity: {\n\t\t\t\tname: string;\n\t\t\t\tpopulation: number | null;\n\t\t\t};\n\t\t\tclass: {\n\t\t\t\tid: number;\n\t\t\t\tclass: 'A' | 'C' | null;\n\t\t\t\tsubClass: 'B' | 'D';\n\t\t\t};\n\t\t\tfriend: {\n\t\t\t\tid: number;\n\t\t\t\tname: string | null;\n\t\t\t\thomeCity: number;\n\t\t\t\tcurrentCity: number | null;\n\t\t\t\tserialNullable: number | null;\n\t\t\t\tserialNotNull: number;\n\t\t\t\tclass: 'A' | 'C';\n\t\t\t\tsubClass: 'B' | 'D' | null;\n\t\t\t\tage1: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tenumCol: 'a' | 'b' | 'c';\n\t\t\t};\n\t\t}[],\n\t\ttypeof join4\n\t>\n>;\n\n{\n\tconst authenticated = false as boolean;\n\n\tconst result = db\n\t\t.select({\n\t\t\tid: users.id,\n\t\t\t...(authenticated ? { city: users.homeCity } : {}),\n\t\t})\n\t\t.from(users)\n\t\t.all();\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tcity?: number;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\n{\n\tconst result = db.select().from(newYorkers).all();\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tuserId: number;\n\t\t\t\tcityId: number | null;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\n{\n\tconst result = db.select({ userId: newYorkers.userId }).from(newYorkers).all();\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tuserId: number;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n}\n\n{\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1));\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1))\n\t\t// @ts-expect-error - can't use where twice\n\t\t.where(eq(users.id, 1));\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(eq(users.id, 1))\n\t\t.limit(10)\n\t\t// @ts-expect-error - can't use where twice\n\t\t.where(eq(users.id, 1));\n}\n\n{\n\tfunction withFriends<T extends SQLiteSelect>(qb: T) {\n\t\tconst friends = alias(users, 'friends');\n\t\tconst friends2 = alias(users, 'friends2');\n\t\tconst friends3 = alias(users, 'friends3');\n\t\tconst friends4 = alias(users, 'friends4');\n\t\tconst friends5 = alias(users, 'friends5');\n\t\treturn qb\n\t\t\t.leftJoin(friends, sql`true`)\n\t\t\t.leftJoin(friends2, sql`true`)\n\t\t\t.leftJoin(friends3, sql`true`)\n\t\t\t.leftJoin(friends4, sql`true`)\n\t\t\t.leftJoin(friends5, sql`true`);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await withFriends(qb);\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tfriends: typeof users.$inferSelect | null;\n\t\t\tfriends2: typeof users.$inferSelect | null;\n\t\t\tfriends3: typeof users.$inferSelect | null;\n\t\t\tfriends4: typeof users.$inferSelect | null;\n\t\t\tfriends5: typeof users.$inferSelect | null;\n\t\t}[]>\n\t>;\n}\n\n{\n\tfunction withFriends<T extends SQLiteSelectQueryBuilder>(qb: T) {\n\t\tconst friends = alias(users, 'friends');\n\t\tconst friends2 = alias(users, 'friends2');\n\t\tconst friends3 = alias(users, 'friends3');\n\t\tconst friends4 = alias(users, 'friends4');\n\t\tconst friends5 = alias(users, 'friends5');\n\t\treturn qb\n\t\t\t.leftJoin(friends, sql`true`)\n\t\t\t.leftJoin(friends2, sql`true`)\n\t\t\t.leftJoin(friends3, sql`true`)\n\t\t\t.leftJoin(friends4, sql`true`)\n\t\t\t.leftJoin(friends5, sql`true`);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await withFriends(qb);\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\tusers_table: typeof users.$inferSelect;\n\t\t\tfriends: typeof users.$inferSelect | null;\n\t\t\tfriends2: typeof users.$inferSelect | null;\n\t\t\tfriends3: typeof users.$inferSelect | null;\n\t\t\tfriends4: typeof users.$inferSelect | null;\n\t\t\tfriends5: typeof users.$inferSelect | null;\n\t\t}[]>\n\t>;\n}\n\n{\n\tfunction dynamic<T extends SQLiteSelect>(qb: T) {\n\t\treturn qb.where(sql``).having(sql``).groupBy(sql``).orderBy(sql``).limit(1).offset(1);\n\t}\n\n\tconst qb = db.select().from(users).$dynamic();\n\tconst result = await dynamic(qb);\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\n{\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.where(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.having(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.having(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.groupBy(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.groupBy(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.orderBy(sql``)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.orderBy(sql``);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.limit(10)\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.limit(10);\n\n\tdb\n\t\t.select()\n\t\t.from(users)\n\t\t.offset(10)\n\t\t.limit(10)\n\t\t// @ts-expect-error method was already called\n\t\t.offset(10);\n}\n\n{\n\tconst table1 = sqliteTable('table1', {\n\t\tid: integer().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst table2 = sqliteTable('table2', {\n\t\tid: integer().primaryKey(),\n\t\tage: integer().notNull(),\n\t});\n\tconst table3 = sqliteTable('table3', {\n\t\tid: integer().primaryKey(),\n\t\tphone: text().notNull(),\n\t});\n\tconst view = sqliteView('view').as((qb) =>\n\t\tqb.select({\n\t\t\ttable: table1,\n\t\t\tcolumn: table2.age,\n\t\t\tnested: {\n\t\t\t\tcolumn: table3.phone,\n\t\t\t},\n\t\t}).from(table1).innerJoin(table2, sql``).leftJoin(table3, sql``)\n\t);\n\tconst result = await db.select().from(view);\n\n\tExpect<\n\t\tEqual<typeof result, {\n\t\t\ttable: typeof table1.$inferSelect;\n\t\t\tcolumn: number;\n\t\t\tnested: {\n\t\t\t\tcolumn: string | null;\n\t\t\t};\n\t\t}[]>\n\t>;\n\tExpect<Equal<typeof result, typeof view.$inferSelect[]>>;\n\tExpect<Equal<typeof result, InferSelectViewModel<typeof view>[]>>;\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/set-operators.ts",
    "content": "import { type Equal, Expect } from 'type-tests/utils.ts';\nimport { eq } from '~/sql/expressions/index.ts';\nimport { desc, sql } from '~/sql/index.ts';\nimport { except, intersect, type SQLiteSetOperator, union, unionAll } from '~/sqlite-core/index.ts';\nimport { db } from './db.ts';\nimport { cities, classes, newYorkers, users } from './tables.ts';\n\nconst unionTest = await db\n\t.select({ id: users.id })\n\t.from(users)\n\t.union(\n\t\tdb\n\t\t\t.select({ id: users.id })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number }[], typeof unionTest>>;\n\nconst unionAllTest = await db\n\t.select({ id: users.id, text: users.name })\n\t.from(users)\n\t.unionAll(\n\t\tdb.select({ id: users.id, text: users.name })\n\t\t\t.from(users)\n\t\t\t.leftJoin(cities, eq(users.id, cities.id)),\n\t);\n\nExpect<Equal<{ id: number; text: string | null }[], typeof unionAllTest>>;\n\nconst intersectTest = await db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t.intersect(({ intersect }) =>\n\t\tintersect(\n\t\t\tdb\n\t\t\t\t.select({ id: users.id, homeCity: users.homeCity })\n\t\t\t\t.from(users),\n\t\t\tdb\n\t\t\t\t.select({ id: users.id, homeCity: sql`${users.homeCity}`.mapWith(Number) })\n\t\t\t\t.from(users),\n\t\t)\n\t);\n\nExpect<Equal<{ id: number; homeCity: number }[], typeof intersectTest>>;\n\nconst intersectAllTest = await db\n\t.select({ id: users.id, homeCity: users.class })\n\t.from(users)\n\t.intersect(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: users.class })\n\t\t\t.from(users)\n\t\t\t.leftJoin(cities, eq(users.id, cities.id)),\n\t);\n\nExpect<Equal<{ id: number; homeCity: 'A' | 'C' }[], typeof intersectAllTest>>;\n\nconst exceptTest = await db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t.except(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: sql`${users.homeCity}`.mapWith(Number) })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number; homeCity: number }[], typeof exceptTest>>;\n\nconst exceptAllTest = await db\n\t.select({ id: users.id, homeCity: users.class })\n\t.from(users)\n\t.except(\n\t\tdb\n\t\t\t.select({ id: users.id, homeCity: sql<'A' | 'C'>`${users.class}` })\n\t\t\t.from(users),\n\t);\n\nExpect<Equal<{ id: number; homeCity: 'A' | 'C' }[], typeof exceptAllTest>>;\n\nconst union2Test = await union(db.select().from(cities), db.select().from(cities), db.select().from(cities));\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof union2Test>>;\n\nconst unionAll2Test = await unionAll(\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select().from(cities),\n);\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof unionAll2Test>>;\n\nconst intersect2Test = await intersect(\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n\tdb.select({\n\t\tid: cities.id,\n\t\tname: cities.name,\n\t\tpopulation: cities.population,\n\t}).from(cities),\n);\n\nExpect<Equal<{ id: number; name: string; population: number | null }[], typeof intersect2Test>>;\n\nconst intersectAll2Test = await intersect(\n\tunion(\n\t\tdb.select({\n\t\t\tid: cities.id,\n\t\t}).from(cities),\n\t\tdb.select({\n\t\t\tid: cities.id,\n\t\t})\n\t\t\t.from(cities).where(sql``),\n\t),\n\tdb.select({\n\t\tid: cities.id,\n\t})\n\t\t.from(cities),\n).orderBy(desc(cities.id)).limit(23);\n\nExpect<Equal<{ id: number }[], typeof intersectAll2Test>>;\n\nconst except2Test = await except(\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t})\n\t\t.from(newYorkers),\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t}).from(newYorkers),\n);\n\nExpect<Equal<{ userId: number }[], typeof except2Test>>;\n\nconst exceptAll2Test = await except(\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t\tcityId: newYorkers.cityId,\n\t})\n\t\t.from(newYorkers).where(eq(newYorkers.cityId, 2)),\n\tdb.select({\n\t\tuserId: newYorkers.userId,\n\t\tcityId: newYorkers.cityId,\n\t}).from(newYorkers).leftJoin(users, sql``),\n);\n\nExpect<Equal<{ userId: number; cityId: number | null }[], typeof exceptAll2Test>>;\n\nconst unionfull = await union(db.select().from(users), db.select().from(users)).orderBy(sql``).limit(1).offset(2);\n\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\tname: string | null;\n\t\thomeCity: number;\n\t\tcurrentCity: number | null;\n\t\tserialNullable: number | null;\n\t\tserialNotNull: number;\n\t\tclass: 'A' | 'C';\n\t\tsubClass: 'B' | 'D' | null;\n\t\tage1: number;\n\t\tcreatedAt: Date;\n\t\tenumCol: 'a' | 'b' | 'c';\n\t}[], typeof unionfull>\n>;\n\nunion(db.select().from(users), db.select().from(users))\n\t.orderBy(sql``)\n\t// @ts-expect-error - method was already called\n\t.orderBy(sql``);\n\nunion(db.select().from(users), db.select().from(users))\n\t.offset(1)\n\t// @ts-expect-error - method was already called\n\t.offset(2);\n\nunion(db.select().from(users), db.select().from(users))\n\t.orderBy(sql``)\n\t// @ts-expect-error - method was already called\n\t.orderBy(sql``);\n\n{\n\tfunction dynamic<T extends SQLiteSetOperator>(qb: T) {\n\t\treturn qb.orderBy(sql``).limit(1).offset(2);\n\t}\n\n\tconst qb = union(db.select().from(users), db.select().from(users)).$dynamic();\n\tconst result = await dynamic(qb);\n\tExpect<Equal<typeof result, typeof users.$inferSelect[]>>;\n}\n\nawait db\n\t.select({ id: users.id, homeCity: users.homeCity })\n\t.from(users)\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\t.intersect(({ intersect }) => intersect(db.select().from(users), db.select().from(users)));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select().from(classes).union(db.select({ id: classes.id }).from(classes));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select({ id: classes.id }).from(classes).union(db.select().from(classes).where(sql``));\n\n// All queries in combining statements should return the same number of columns\n// and the corresponding columns should have compatible data type\n// @ts-expect-error\ndb.select({ id: classes.id }).from(classes).union(db.select().from(classes));\n\nunion(\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select().from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name, population: cities.population }).from(cities),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities).where(sql``).limit(3).$dynamic(),\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: newYorkers.userId }).from(newYorkers),\n\tdb.select({ id: cities.id }).from(cities),\n);\n\nunion(\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\tdb.select({ id: cities.id }).from(cities).where(sql``),\n\tdb.select({ id: sql<number>`${cities.id}` }).from(cities),\n\tdb.select({ id: cities.id }).from(cities),\n\t// All queries in combining statements should return the same number of columns\n\t// and the corresponding columns should have compatible data type\n\t// @ts-expect-error\n\tdb.select({ id: cities.id, name: cities.name, population: cities.population }).from(cities).where(sql``),\n);\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/subquery.ts",
    "content": "import { Expect } from 'type-tests/utils.ts';\nimport { and, eq } from '~/sql/expressions/index.ts';\nimport { count } from '~/sql/functions/aggregate.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { alias, integer, sqliteTable, text } from '~/sqlite-core/index.ts';\nimport type { DrizzleTypeError, Equal } from '~/utils.ts';\nimport { db } from './db.ts';\n\nconst users = sqliteTable('names', {\n\tid: integer('id').primaryKey(),\n\tname: text('name'),\n\tmanagerId: integer('author_id'),\n});\n\nconst posts = sqliteTable('posts', {\n\tid: integer('id').primaryKey(),\n\tauthorId: integer('author_id'),\n\ttitle: text('title'),\n});\n\nconst n1 = db\n\t.select({\n\t\tid: users.id,\n\t\tname: users.name,\n\t\tauthorId: users.managerId,\n\t\tcount1: sql<number>`count(1)::int`.as('count1'),\n\t})\n\t.from(users)\n\t.groupBy(users.id, users.name, users.managerId)\n\t.as('n1');\n\nconst n2 = db\n\t.select({\n\t\tid: users.id,\n\t\tauthorId: users.managerId,\n\t\ttotalCount: sql<number>`count(1)::int`.as('totalCount'),\n\t})\n\t.from(users)\n\t.groupBy(users.id, users.managerId)\n\t.as('n2');\n\nconst result = db\n\t.select({\n\t\tname: n1.name,\n\t\tauthorId: n1.authorId,\n\t\tcount1: n1.count1,\n\t\ttotalCount: n2.totalCount,\n\t})\n\t.from(n1)\n\t.innerJoin(n2, and(eq(n2.id, n1.id), eq(n2.authorId, n1.authorId)))\n\t.all();\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tname: string | null;\n\t\t\tauthorId: number | null;\n\t\t\tcount1: number;\n\t\t\ttotalCount: number;\n\t\t}[],\n\t\ttypeof result\n\t>\n>;\n\nconst names2 = alias(users, 'names2');\n\nconst sq1 = db\n\t.select({\n\t\tid: users.id,\n\t\tname: users.name,\n\t\tid2: names2.id,\n\t})\n\t.from(users)\n\t.leftJoin(names2, eq(users.name, names2.name))\n\t.as('sq1');\n\nconst res = db.select().from(sq1).all();\n\nExpect<\n\tEqual<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string | null;\n\t\t\tid2: number | null;\n\t\t}[],\n\t\ttypeof res\n\t>\n>;\n\n{\n\tconst sq = db.select({ count: sql<number>`count(1)::int` }).from(users).as('sq');\n\tExpect<typeof sq.count extends DrizzleTypeError<any> ? true : false>;\n}\n\nconst sqUnion = db.select().from(users).union(db.select().from(names2)).as('sqUnion');\n\nconst resUnion = await db.select().from(sqUnion);\n\nExpect<\n\tEqual<{\n\t\tid: number;\n\t\tname: string | null;\n\t\tmanagerId: number | null;\n\t}[], typeof resUnion>\n>;\n\nconst fromSubquery = await db.select({\n\tcount: db.select({ count: count().as('c') }).from(posts).where(eq(posts.authorId, users.id)).as('count'),\n}).from(users);\n\nExpect<Equal<typeof fromSubquery, { count: number }[]>>;\n\nconst fromSubquery2 = await db.select({\n\tname: db.select({ name: users.name }).from(users).where(eq(users.id, posts.authorId)).as('name'),\n}).from(posts);\n\nExpect<Equal<typeof fromSubquery2, { name: string | null }[]>>;\n\nconst errorSubquery = await db.select({\n\tname: db.select({ name: users.name, managerId: users.managerId }).from(users).where(eq(users.id, posts.authorId)).as(\n\t\t'name',\n\t),\n}).from(posts);\n\nExpect<Equal<typeof errorSubquery, { name: DrizzleTypeError<'You can only select one column in the subquery'> }[]>>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/tables.ts",
    "content": "import * as crypto from 'node:crypto';\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { eq, gt } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport {\n\talias,\n\tblob,\n\tcheck,\n\tcustomType,\n\tforeignKey,\n\tindex,\n\tinteger,\n\tnumeric,\n\tprimaryKey,\n\treal,\n\ttype SQLiteColumn,\n\tsqliteTable,\n\ttext,\n\tuniqueIndex,\n} from '~/sqlite-core/index.ts';\nimport { sqliteView, type SQLiteViewWithSelection } from '~/sqlite-core/view.ts';\nimport { db } from './db.ts';\n\nexport const users = sqliteTable(\n\t'users_table',\n\t{\n\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\thomeCity: integer('home_city')\n\t\t\t.notNull()\n\t\t\t.references(() => cities.id),\n\t\tcurrentCity: integer('current_city').references(() => cities.id),\n\t\tserialNullable: integer('serial1'),\n\t\tserialNotNull: integer('serial2').notNull(),\n\t\tclass: text('class', { enum: ['A', 'C'] }).notNull(),\n\t\tsubClass: text('sub_class', { enum: ['B', 'D'] }),\n\t\tname: text('name'),\n\t\tage1: integer('age1').notNull(),\n\t\tcreatedAt: integer('created_at', { mode: 'timestamp' }).notNull().defaultNow(),\n\t\tenumCol: text('enum_col', { enum: ['a', 'b', 'c'] }).notNull(),\n\t},\n\t(users) => ({\n\t\tusersAge1Idx: uniqueIndex('usersAge1Idx').on(users.class),\n\t\tusersAge2Idx: index('usersAge2Idx').on(users.class),\n\t\tuniqueClass: uniqueIndex('uniqueClass')\n\t\t\t.on(users.class, users.subClass)\n\t\t\t.where(\n\t\t\t\tsql`${users.class} is not null`,\n\t\t\t),\n\t\tuniqueClassEvenBetterThanPrisma: uniqueIndex('uniqueClass')\n\t\t\t.on(users.class, users.subClass)\n\t\t\t.where(\n\t\t\t\tsql`${users.class} is not null`,\n\t\t\t),\n\t\tlegalAge: check('legalAge', sql`${users.age1} > 18`),\n\t\tusersClassFK: foreignKey(() => ({ columns: [users.subClass], foreignColumns: [classes.subClass] })),\n\t\tusersClassComplexFK: foreignKey(() => ({\n\t\t\tcolumns: [users.class, users.subClass],\n\t\t\tforeignColumns: [classes.class, classes.subClass],\n\t\t})),\n\t\tpk: primaryKey(users.age1, users.class),\n\t}),\n);\n\nexport type User = typeof users.$inferSelect;\nExpect<\n\tEqual<User, {\n\t\tid: number;\n\t\thomeCity: number;\n\t\tcurrentCity: number | null;\n\t\tserialNullable: number | null;\n\t\tserialNotNull: number;\n\t\tclass: 'A' | 'C';\n\t\tsubClass: 'B' | 'D' | null;\n\t\tname: string | null;\n\t\tage1: number;\n\t\tcreatedAt: Date;\n\t\tenumCol: 'a' | 'b' | 'c';\n\t}>\n>;\n\nexport type NewUser = typeof users.$inferInsert;\nExpect<\n\tEqual<NewUser, {\n\t\tid?: number;\n\t\thomeCity: number;\n\t\tcurrentCity?: number | null;\n\t\tserialNullable?: number | null;\n\t\tserialNotNull: number;\n\t\tclass: 'A' | 'C';\n\t\tsubClass?: 'B' | 'D' | null;\n\t\tname?: string | null;\n\t\tage1: number;\n\t\tcreatedAt?: Date;\n\t\tenumCol: 'a' | 'b' | 'c';\n\t}>\n>;\n\nexport const cities = sqliteTable('cities_table', ({ integer, text }) => ({\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tpopulation: integer('population').default(0),\n}));\n\nexport type City = typeof cities.$inferSelect;\nExpect<\n\tEqual<City, {\n\t\tid: number;\n\t\tname: string;\n\t\tpopulation: number | null;\n\t}>\n>;\n\nexport type NewCity = typeof cities.$inferInsert;\nExpect<\n\tEqual<NewCity, {\n\t\tid?: number;\n\t\tname: string;\n\t\tpopulation?: number | null;\n\t}>\n>;\n\nexport const classes = sqliteTable('classes_table', {\n\tid: integer('id').primaryKey(),\n\tclass: text('class', { enum: ['A', 'C'] }),\n\tsubClass: text('sub_class', { enum: ['B', 'D'] }).notNull(),\n});\n\nexport type Class = typeof classes.$inferSelect;\nExpect<\n\tEqual<Class, {\n\t\tid: number;\n\t\tclass: 'A' | 'C' | null;\n\t\tsubClass: 'B' | 'D';\n\t}>\n>;\n\nexport type NewClass = typeof classes.$inferInsert;\nExpect<\n\tEqual<NewClass, {\n\t\tid?: number;\n\t\tclass?: 'A' | 'C' | null;\n\t\tsubClass: 'B' | 'D';\n\t}>\n>;\n\nexport const newYorkers = sqliteView('new_yorkers')\n\t.as((qb) => {\n\t\tconst sq = qb\n\t\t\t.$with('sq')\n\t\t\t.as(\n\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n\t\t\t\t\t.from(users)\n\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n\t\t\t\t\t.where(sql`${users.age1} > 18`),\n\t\t\t);\n\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n\t});\n\nExpect<\n\tEqual<\n\t\tSQLiteViewWithSelection<'new_yorkers', false, {\n\t\t\tuserId: SQLiteColumn<{\n\t\t\t\tname: 'id';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'SQLiteInteger';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: number;\n\t\t\t\tnotNull: true;\n\t\t\t\thasDefault: true;\n\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t}>;\n\t\t\tcityId: SQLiteColumn<{\n\t\t\t\tname: 'id';\n\t\t\t\tdataType: 'number';\n\t\t\t\tcolumnType: 'SQLiteInteger';\n\t\t\t\tdata: number;\n\t\t\t\tdriverParam: number;\n\t\t\t\tnotNull: false;\n\t\t\t\thasDefault: true;\n\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\tenumValues: undefined;\n\t\t\t\tbaseColumn: never;\n\t\t\t\tgenerated: undefined;\n\t\t\t\tidentity: undefined;\n\t\t\t\tisAutoincrement: false;\n\t\t\t\thasRuntimeDefault: false;\n\t\t\t\tisPrimaryKey: true;\n\t\t\t}>;\n\t\t}>,\n\t\ttypeof newYorkers\n\t>\n>;\n\n{\n\tconst newYorkers = sqliteView('new_yorkers', {\n\t\tuserId: integer('user_id').notNull(),\n\t\tcityId: integer('city_id'),\n\t})\n\t\t.as(\n\t\t\tsql`select ${users.id} as user_id, ${cities.id} as city_id from ${users} left join ${cities} on ${\n\t\t\t\teq(cities.id, users.homeCity)\n\t\t\t} where ${gt(users.age1, 18)}`,\n\t\t);\n\n\tExpect<\n\t\tEqual<\n\t\t\tSQLiteViewWithSelection<'new_yorkers', false, {\n\t\t\t\tuserId: SQLiteColumn<{\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SQLiteInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: SQLiteColumn<{\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SQLiteInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tconst newYorkers = sqliteView('new_yorkers', {\n\t\tuserId: integer('user_id').notNull(),\n\t\tcityId: integer('city_id'),\n\t}).existing();\n\n\tExpect<\n\t\tEqual<\n\t\t\tSQLiteViewWithSelection<'new_yorkers', true, {\n\t\t\t\tuserId: SQLiteColumn<{\n\t\t\t\t\tname: 'user_id';\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SQLiteInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tnotNull: true;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t}>;\n\t\t\t\tcityId: SQLiteColumn<{\n\t\t\t\t\tname: 'city_id';\n\t\t\t\t\tnotNull: false;\n\t\t\t\t\thasDefault: false;\n\t\t\t\t\tdataType: 'number';\n\t\t\t\t\tcolumnType: 'SQLiteInteger';\n\t\t\t\t\tdata: number;\n\t\t\t\t\tdriverParam: number;\n\t\t\t\t\ttableName: 'new_yorkers';\n\t\t\t\t\tenumValues: undefined;\n\t\t\t\t\tbaseColumn: never;\n\t\t\t\t\tgenerated: undefined;\n\t\t\t\t\tidentity: undefined;\n\t\t\t\t\tisAutoincrement: false;\n\t\t\t\t\thasRuntimeDefault: false;\n\t\t\t\t\tisPrimaryKey: false;\n\t\t\t\t}>;\n\t\t\t}>,\n\t\t\ttypeof newYorkers\n\t\t>\n\t>;\n}\n\n{\n\tsqliteTable('test', {\n\t\tcol1: integer('col1').default(1),\n\t\tcol2: integer('col2', { mode: 'number' }).default(1),\n\t\tcol3: integer('col3', { mode: 'timestamp' }).default(new Date()),\n\t\tcol4: integer('col4', { mode: 'timestamp_ms' }).default(new Date()),\n\t\t// @ts-expect-error - invalid mode\n\t\tcol5: integer('col4', { mode: undefined }).default(new Date()),\n\t});\n}\n\n{\n\tconst internalStaff = sqliteTable('internal_staff', {\n\t\tuserId: integer('user_id').notNull(),\n\t});\n\n\tconst customUser = sqliteTable('custom_user', {\n\t\tid: integer('id').notNull(),\n\t});\n\n\tconst ticket = sqliteTable('ticket', {\n\t\tstaffId: integer('staff_id').notNull(),\n\t});\n\n\tconst subq = db\n\t\t.select()\n\t\t.from(internalStaff)\n\t\t.leftJoin(\n\t\t\tcustomUser,\n\t\t\teq(internalStaff.userId, customUser.id),\n\t\t).as('internal_staff');\n\n\tconst mainQuery = db\n\t\t.select()\n\t\t.from(ticket)\n\t\t.leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId))\n\t\t.all();\n\n\tExpect<\n\t\tEqual<{\n\t\t\tinternal_staff: {\n\t\t\t\tinternal_staff: {\n\t\t\t\t\tuserId: number;\n\t\t\t\t};\n\t\t\t\tcustom_user: {\n\t\t\t\t\tid: number | null;\n\t\t\t\t};\n\t\t\t} | null;\n\t\t\tticket: {\n\t\t\t\tstaffId: number;\n\t\t\t};\n\t\t}[], typeof mainQuery>\n\t>;\n}\n\n{\n\tconst newYorkers = sqliteView('new_yorkers')\n\t\t.as((qb) => {\n\t\t\tconst sq = qb\n\t\t\t\t.$with('sq')\n\t\t\t\t.as(\n\t\t\t\t\tqb.select({ userId: users.id, cityId: cities.id })\n\t\t\t\t\t\t.from(users)\n\t\t\t\t\t\t.leftJoin(cities, eq(cities.id, users.homeCity))\n\t\t\t\t\t\t.where(sql`${users.age1} > 18`),\n\t\t\t\t);\n\t\t\treturn qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);\n\t\t});\n\n\tconst ny1 = alias(newYorkers, 'ny1');\n\n\tconst result = db.select().from(newYorkers).leftJoin(ny1, eq(newYorkers.userId, ny1.userId)).all();\n\n\tExpect<\n\t\tEqual<{\n\t\t\tnew_yorkers: {\n\t\t\t\tuserId: number;\n\t\t\t\tcityId: number | null;\n\t\t\t};\n\t\t\tny1: {\n\t\t\t\tuserId: number;\n\t\t\t\tcityId: number | null;\n\t\t\t} | null;\n\t\t}[], typeof result>\n\t>;\n}\n\n{\n\ttype Id = number & { __id: true };\n\n\tconst _table = sqliteTable('test', {\n\t\t// @ts-expect-error - type should be Id, not number\n\t\tcol1: integer('col1').$type<Id>().default(1),\n\t\tcol2: integer('col2').$type<Id>().default(1 as Id),\n\t});\n\n\tconst table = sqliteTable('test', {\n\t\tcol1: integer('col1').$type<Id>().notNull(),\n\t});\n\n\tExpect<\n\t\tEqual<{\n\t\t\tcol1: Id;\n\t\t}, typeof table.$inferSelect>\n\t>;\n}\n\n{\n\tconst test = sqliteTable('test', {\n\t\tid: text('id').$defaultFn(() => crypto.randomUUID()).primaryKey(),\n\t});\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid?: string;\n\t\t}, typeof test.$inferInsert>\n\t>;\n}\n\n{\n\tsqliteTable('test', {\n\t\tid: integer('id').$default(() => 1),\n\t\tid2: integer('id').$defaultFn(() => 1),\n\t\t// @ts-expect-error - should be number\n\t\tid3: integer('id').$default(() => '1'),\n\t\t// @ts-expect-error - should be number\n\t\tid4: integer('id').$defaultFn(() => '1'),\n\t});\n}\n\n{\n\tconst table = sqliteTable('test', {\n\t\tdata: text('data', { mode: 'json' }).notNull(),\n\t\tdataTyped: text('dataTyped', { mode: 'json' }).$type<{ a: number }>().notNull(),\n\t});\n\n\tExpect<\n\t\tEqual<{\n\t\t\tdata: unknown;\n\t\t\tdataTyped: { a: number };\n\t\t}, typeof table.$inferSelect>\n\t>;\n}\n\n{\n\tconst test = sqliteTable('test', {\n\t\ttest1: text('test', { length: 255, enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest2: text('test', { length: 255, enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttest3: text('test', { enum: ['a', 'b', 'c'] as const }).notNull(),\n\t\ttest4: text('test', { enum: ['a', 'b', 'c'] }).notNull(),\n\t});\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test1.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test2.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test3.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test4.enumValues>>;\n}\n\n{ // All types with generated columns\n\tconst test = sqliteTable('test', {\n\t\ttest1: text('test', { length: 255, enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest2: text('test', { length: 255, enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t\ttest3: text('test', { enum: ['a', 'b', 'c'] as const }).generatedAlwaysAs(sql``),\n\t\ttest4: text('test', { enum: ['a', 'b', 'c'] }).generatedAlwaysAs(sql``),\n\t});\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test1.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test2.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test3.enumValues>>;\n\tExpect<Equal<['a', 'b', 'c'], typeof test.test4.enumValues>>;\n}\n\n{\n\tconst customRequiredConfig = customType<{\n\t\tdata: string;\n\t\tdriverData: string;\n\t\tconfig: { length: number };\n\t\tconfigRequired: true;\n\t}>({\n\t\tdataType(config) {\n\t\t\tExpect<Equal<{ length: number }, typeof config>>;\n\t\t\treturn `varchar(${config.length})`;\n\t\t},\n\n\t\ttoDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\n\t\tfromDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\t});\n\n\tcustomRequiredConfig('t', { length: 10 });\n\tcustomRequiredConfig({ length: 10 });\n\t// @ts-expect-error - config is required\n\tcustomRequiredConfig('t');\n\t// @ts-expect-error - config is required\n\tcustomRequiredConfig();\n}\n\n{\n\tconst customOptionalConfig = customType<{\n\t\tdata: string;\n\t\tdriverData: string;\n\t\tconfig: { length: number };\n\t}>({\n\t\tdataType(config) {\n\t\t\tExpect<Equal<{ length: number } | undefined, typeof config>>;\n\t\t\treturn config ? `varchar(${config.length})` : `text`;\n\t\t},\n\n\t\ttoDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\n\t\tfromDriver(value) {\n\t\t\tExpect<Equal<string, typeof value>>();\n\t\t\treturn value;\n\t\t},\n\t});\n\n\tcustomOptionalConfig('t', { length: 10 });\n\tcustomOptionalConfig('t');\n\tcustomOptionalConfig({ length: 10 });\n\tcustomOptionalConfig();\n}\n\n{\n\tsqliteTable('all_columns', {\n\t\tblob: blob('blob'),\n\t\tblob2: blob('blob2', { mode: 'bigint' }),\n\t\tblobdef: blob('blobdef').default(0),\n\t\tinteger: integer('integer'),\n\t\tinteger2: integer('integer2', { mode: 'boolean' }),\n\t\tintegerdef: integer('integerdef').default(0),\n\t\tnumeric: numeric('numeric'),\n\t\tnumericdef: numeric('numericdef').default(''),\n\t\treal: real('real'),\n\t\trealdef: real('realdef').default(0),\n\t\ttext: text('text'),\n\t\ttext2: text('text2', { enum: ['a', 'b', 'c'] }),\n\t\ttext3: text('text3', { length: 1 }),\n\t\ttext4: text('text4', { length: 1, enum: ['a', 'b', 'c'] }),\n\t\ttext5: text('text5', { mode: 'json' }),\n\t\ttextdef: text('textdef').default(''),\n\t});\n}\n\n{\n\tconst keysAsColumnNames = sqliteTable('test', {\n\t\tid: integer(),\n\t\tname: text(),\n\t});\n\n\tExpect<Equal<typeof keysAsColumnNames['id']['_']['name'], 'id'>>;\n\tExpect<Equal<typeof keysAsColumnNames['name']['_']['name'], 'name'>>;\n}\n\n{\n\tsqliteTable('all_columns_without_name', {\n\t\tblob: blob(),\n\t\tblob2: blob({ mode: 'bigint' }),\n\t\tblobdef: blob().default(0),\n\t\tinteger: integer(),\n\t\tinteger2: integer({ mode: 'boolean' }),\n\t\tintegerdef: integer().default(0),\n\t\tnumeric: numeric(),\n\t\tnumericdef: numeric().default(''),\n\t\treal: real(),\n\t\trealdef: real().default(0),\n\t\ttext: text(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }),\n\t\ttext3: text({ length: 1 }),\n\t\ttext4: text({ length: 1, enum: ['a', 'b', 'c'] }),\n\t\ttext5: text({ mode: 'json' }),\n\t\ttextdef: text().default(''),\n\t});\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/update.ts",
    "content": "import type { RunResult } from 'better-sqlite3';\nimport type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { eq } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { SQLiteUpdate } from '~/sqlite-core/query-builders/update.ts';\nimport type { DrizzleTypeError } from '~/utils.ts';\nimport { bunDb, db } from './db.ts';\nimport { cities, users } from './tables.ts';\n\nconst updateRun = db.update(users)\n\t.set({\n\t\tname: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1))\n\t.run();\nExpect<Equal<RunResult, typeof updateRun>>;\n\nconst updateRunBun = bunDb.update(users)\n\t.set({\n\t\tname: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1))\n\t.run();\nExpect<Equal<void, typeof updateRunBun>>;\n\nconst updateAll = db.update(users)\n\t.set({\n\t\tname: 'John',\n\t\tage1: 30,\n\t})\n\t.all();\nExpect<Equal<DrizzleTypeError<'.all() cannot be used without .returning()'>, typeof updateAll>>;\n\nconst updateAllBun = bunDb.update(users)\n\t.set({\n\t\tname: 'John',\n\t\tage1: 30,\n\t})\n\t.all();\nExpect<Equal<DrizzleTypeError<'.all() cannot be used without .returning()'>, typeof updateAllBun>>;\n\nconst updateGet = db.update(users)\n\t.set({\n\t\tname: 'John',\n\t\tage1: 30,\n\t}).get();\nExpect<Equal<DrizzleTypeError<'.get() cannot be used without .returning()'>, typeof updateGet>>;\n\nconst updateGetBun = bunDb.update(users)\n\t.set({\n\t\tname: 'John',\n\t\tage1: 30,\n\t}).get();\nExpect<Equal<DrizzleTypeError<'.get() cannot be used without .returning()'>, typeof updateGetBun>>;\n\nconst updateAllReturningAll = db.update(users)\n\t.set({\n\t\tname: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1))\n\t.returning()\n\t.all();\nExpect<Equal<typeof users.$inferSelect[], typeof updateAllReturningAll>>;\n\nconst updateAllReturningAllBun = bunDb.update(users)\n\t.set({\n\t\tname: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1))\n\t.returning()\n\t.all();\nExpect<Equal<typeof users.$inferSelect[], typeof updateAllReturningAllBun>>;\n\nconst updateGetReturningAll = db.update(users)\n\t.set({\n\t\tname: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1))\n\t.returning()\n\t.get();\nExpect<Equal<typeof users.$inferSelect, typeof updateGetReturningAll>>;\n\nconst updateGetReturningAllBun = bunDb.update(users)\n\t.set({\n\t\tname: 'John',\n\t\tage1: 30,\n\t})\n\t.where(eq(users.id, 1))\n\t.returning()\n\t.get();\nExpect<Equal<typeof users.$inferSelect, typeof updateGetReturningAllBun>>;\n\n{\n\tfunction dynamic<T extends SQLiteUpdate>(qb: T) {\n\t\treturn qb.where(sql``).returning();\n\t}\n\n\tconst qbBase = db.update(users).set({}).$dynamic();\n\tconst qb = dynamic(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tfunction withReturning<T extends SQLiteUpdate>(qb: T) {\n\t\treturn qb.returning();\n\t}\n\n\tconst qbBase = db.update(users).set({}).$dynamic();\n\tconst qb = withReturning(qbBase);\n\tconst result = await qb;\n\tExpect<Equal<typeof users.$inferSelect[], typeof result>>;\n}\n\n{\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.returning()\n\t\t// @ts-expect-error method was already called\n\t\t.returning();\n\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.where(sql``)\n\t\t// @ts-expect-error method was already called\n\t\t.where(sql``);\n}\n\n{\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.from(sql``)\n\t\t.leftJoin(sql``, (table, from) => {\n\t\t\tExpect<Equal<typeof users['_']['columns'], typeof table>>;\n\t\t\tExpect<Equal<never, typeof from>>;\n\t\t\treturn sql``;\n\t\t});\n\n\tdb\n\t\t.update(users)\n\t\t.set({})\n\t\t.from(cities)\n\t\t.leftJoin(sql``, (table, from) => {\n\t\t\tExpect<Equal<typeof users['_']['columns'], typeof table>>;\n\t\t\tExpect<Equal<typeof cities['_']['columns'], typeof from>>;\n\t\t\treturn sql``;\n\t\t});\n\n\tconst citiesSq = db.$with('cities_sq').as(db.select({ id: cities.id }).from(cities));\n\n\tdb\n\t\t.with(citiesSq)\n\t\t.update(users)\n\t\t.set({})\n\t\t.from(citiesSq)\n\t\t.leftJoin(sql``, (table, from) => {\n\t\t\tExpect<Equal<typeof users['_']['columns'], typeof table>>;\n\t\t\tExpect<Equal<typeof citiesSq['_']['selectedFields'], typeof from>>;\n\t\t\treturn sql``;\n\t\t});\n\n\tdb\n\t\t.with(citiesSq)\n\t\t.update(users)\n\t\t.set({\n\t\t\thomeCity: citiesSq.id,\n\t\t})\n\t\t.from(citiesSq);\n}\n\n{\n\tconst result = await db.update(users).set({}).from(cities).returning();\n\tExpect<\n\t\tEqual<typeof users.$inferSelect[], typeof result>\n\t>;\n}\n\n{\n\tconst result = await db.update(users).set({}).from(cities).returning({\n\t\tid: users.id,\n\t});\n\tExpect<\n\t\tEqual<{\n\t\t\tid: number;\n\t\t}[], typeof result>\n\t>;\n\tdb.update(users).set({}).where(sql``).limit(1).orderBy(sql``);\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/sqlite/with.ts",
    "content": "import type { Equal } from 'type-tests/utils.ts';\nimport { Expect } from 'type-tests/utils.ts';\nimport { gt, inArray, like } from '~/sql/expressions/index.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { integer, sqliteTable, text } from '~/sqlite-core/index.ts';\nimport { db } from './db.ts';\n\nconst orders = sqliteTable('orders', {\n\tid: integer('id').primaryKey(),\n\tregion: text('region').notNull(),\n\tproduct: text('product').notNull(),\n\tamount: integer('amount').notNull(),\n\tquantity: integer('quantity').notNull(),\n\tgenerated: text('generatedText').generatedAlwaysAs(sql``),\n});\n\n{\n\tconst regionalSales = db\n\t\t.$with('regional_sales')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.groupBy(orders.region),\n\t\t);\n\n\tconst topRegions = db\n\t\t.$with('top_regions')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: orders.amount,\n\t\t\t\t})\n\t\t\t\t.from(regionalSales)\n\t\t\t\t.where(\n\t\t\t\t\tgt(\n\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\tdb.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t);\n\n\tconst result = db\n\t\t.with(regionalSales, topRegions)\n\t\t.select({\n\t\t\tregion: orders.region,\n\t\t\tproduct: orders.product,\n\t\t\tproductUnits: sql<number>`sum(${orders.quantity})`,\n\t\t\tproductSales: sql<number>`sum(${orders.amount})`,\n\t\t})\n\t\t.from(orders)\n\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t.all();\n\n\tExpect<\n\t\tEqual<{\n\t\t\tregion: string;\n\t\t\tproduct: string;\n\t\t\tproductUnits: number;\n\t\t\tproductSales: number;\n\t\t}[], typeof result>\n\t>;\n\n\tconst allOrdersWith = db.$with('all_orders_with').as(db.select().from(orders));\n\tconst allFromWith = await db.with(allOrdersWith).select().from(allOrdersWith);\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid: number;\n\t\t\tregion: string;\n\t\t\tproduct: string;\n\t\t\tamount: number;\n\t\t\tquantity: number;\n\t\t\tgenerated: string | null;\n\t\t}[], typeof allFromWith>\n\t>;\n\n\tconst regionalSalesWith = db.$with('regional_sales_with').as(db.select().from(regionalSales));\n\tdb.with(regionalSalesWith).select().from(regionalSalesWith).where(like(regionalSalesWith.totalSales, 'abc'));\n}\n\n{\n\tconst providers = sqliteTable('providers', {\n\t\tid: integer().primaryKey(),\n\t\tproviderName: text().notNull(),\n\t});\n\n\tconst sq1 = db.$with('providers_sq', {\n\t\tname: providers.providerName,\n\t}).as(sql`select provider_name as name from providers`);\n\tconst q1 = await db.with(sq1).select().from(sq1);\n\tExpect<Equal<typeof q1, { name: string }[]>>;\n\n\tconst sq2 = db.$with('providers_sq', {\n\t\tnested: {\n\t\t\tid: providers.id,\n\t\t},\n\t}).as(() => sql`select id from providers`);\n\tconst q2 = await db.with(sq2).select().from(sq2);\n\tExpect<Equal<typeof q2, { nested: { id: number } }[]>>;\n\n\t// @ts-expect-error\n\tdb.$with('providers_sq', { name: providers.providerName }).as(db.select().from(providers));\n\t// @ts-expect-error\n\tdb.$with('providers_sq', { name: providers.providerName }).as((qb) => qb.select().from(providers));\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.build.json\",\n\t\"compilerOptions\": {\n\t\t\"composite\": false,\n\t\t\"noEmit\": true,\n\t\t\"rootDir\": \"..\",\n\t\t\"outDir\": \"./.cache\"\n\t},\n\t\"include\": [\".\", \"../src\"],\n\t\"exclude\": [\"**/playground\"]\n}\n"
  },
  {
    "path": "drizzle-orm/type-tests/utils/neon-auth-token.ts",
    "content": "import type { HTTPQueryOptions } from '@neondatabase/serverless';\nimport { type Equal, Expect } from 'type-tests/utils.ts';\nimport type { NeonAuthToken } from '~/utils';\n\nExpect<Equal<Exclude<HTTPQueryOptions<true, true>['authToken'], undefined>, NeonAuthToken>>;\n"
  },
  {
    "path": "drizzle-orm/type-tests/utils.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\nexport function Expect<T extends true>() {}\n\nexport type Equal<X, Y extends X> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true\n\t: false;\n"
  },
  {
    "path": "drizzle-orm/vitest.config.ts",
    "content": "import { viteCommonjs } from '@originjs/vite-plugin-commonjs';\nimport tsconfigPaths from 'vite-tsconfig-paths';\nimport { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n\ttest: {\n\t\ttypecheck: {\n\t\t\ttsconfig: 'tests/tsconfig.json',\n\t\t},\n\t},\n\tplugins: [viteCommonjs(), tsconfigPaths()],\n});\n"
  },
  {
    "path": "drizzle-seed/README.md",
    "content": "# Drizzle Seed\r\n\r\n> [!NOTE]\r\n> `drizzle-seed` can only be used with `drizzle-orm@0.36.4` or higher. Versions lower than this may work at runtime but could have type issues and identity column issues, as this patch was introduced in `drizzle-orm@0.36.4`\r\n\r\n## Documentation\r\n\r\nThe full API reference and package overview can be found in our [official documentation](https://orm.drizzle.team/docs/seed-overview)\r\n\r\n## Overview\r\n\r\n`drizzle-seed` is a TypeScript library that helps you generate deterministic, yet realistic,\r\nfake data to populate your database. By leveraging a seedable pseudorandom number generator (pRNG),\r\nit ensures that the data you generate is consistent and reproducible across different runs.\r\nThis is especially useful for testing, development, and debugging purposes.\r\n\r\n#### What is Deterministic Data Generation?\r\n\r\nDeterministic data generation means that the same input will always produce the same output.\r\nIn the context of `drizzle-seed`, when you initialize the library with the same seed number,\r\nit will generate the same sequence of fake data every time. This allows for predictable and repeatable data sets.\r\n\r\n#### Pseudorandom Number Generator (pRNG)\r\n\r\nA pseudorandom number generator is an algorithm that produces a sequence of numbers\r\nthat approximates the properties of random numbers. However, because it's based on an initial value\r\ncalled a seed, you can control its randomness. By using the same seed, the pRNG will produce the\r\nsame sequence of numbers, making your data generation process reproducible.\r\n\r\n#### Benefits of Using a pRNG:\r\n\r\n- Consistency: Ensures that your tests run on the same data every time.\r\n- Debugging: Makes it easier to reproduce and fix bugs by providing a consistent data set.\r\n- Collaboration: Team members can share seed numbers to work with the same data sets.\r\n\r\nWith drizzle-seed, you get the best of both worlds: the ability to generate realistic fake data and the control to reproduce it whenever needed.\r\n\r\n## Getting started\r\n\r\n`npm install drizzle-seed`\r\n\r\nYou have to install `drizzle-orm` in order to use `drizzle-seed`.\r\n\r\n`npm install drizzle-orm`\r\n\r\n## Basic Usage\r\n\r\nIn this example we will create 10 users with random names and ids\r\n\r\n```ts {12}\r\nimport { pgTable, integer, text } from \"drizzle-orm/pg-core\";\r\nimport { drizzle } from \"drizzle-orm/node-postgres\";\r\nimport { seed } from \"drizzle-seed\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: integer().primaryKey(),\r\n  name: text().notNull(),\r\n});\r\n\r\nasync function main() {\r\n  const db = drizzle(process.env.DATABASE_URL!);\r\n  await seed(db, { users });\r\n}\r\n\r\nmain();\r\n```\r\n\r\n## Options\r\n\r\n**`count`**\r\n\r\nBy default, the `seed` function will create 10 entities.\r\nHowever, if you need more for your tests, you can specify this in the seed options object\r\n\r\n```ts\r\nawait seed(db, schema, { count: 1000 });\r\n```\r\n\r\n**`seed`**\r\n\r\nIf you need a seed to generate a different set of values for all subsequent runs, you can define a different number\r\nin the `seed` option. Any new number will generate a unique set of values\r\n\r\n```ts\r\nawait seed(db, schema, { seed: 12345 });\r\n```\r\n\r\n## Reset databases\r\n\r\nWith `drizzle-seed`, you can easily reset your database and seed it with new values, for example, in your test suites\r\n\r\n```ts\r\n// path to a file with schema you want to reset\r\nimport * as schema from \"./schema.ts\";\r\nimport { reset } from \"drizzle-seed\";\r\n\r\nasync function main() {\r\n  const db = drizzle(process.env.DATABASE_URL!);\r\n  await reset(db, schema);\r\n}\r\n\r\nmain();\r\n```\r\n\r\nMore examples are available in our [official documentation](https://orm.drizzle.team/docs/seed-overview)"
  },
  {
    "path": "drizzle-seed/package.json",
    "content": "{\n\t\"name\": \"drizzle-seed\",\n\t\"version\": \"0.3.1\",\n\t\"main\": \"index.js\",\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"build\": \"tsx scripts/build.ts\",\n\t\t\"pack\": \"(cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz\",\n\t\t\"test\": \"vitest --config ./vitest.config.ts\",\n\t\t\"test:types\": \"cd type-tests && tsc\",\n\t\t\"generate-for-tests:pg\": \"drizzle-kit generate --config=./src/tests/pg/drizzle.config.ts\",\n\t\t\"generate-for-tests:mysql\": \"drizzle-kit generate --config=./src/tests/mysql/drizzle.config.ts\",\n\t\t\"generate-for-tests:sqlite\": \"drizzle-kit generate --config=./src/tests/sqlite/drizzle.config.ts\",\n\t\t\"generate\": \"drizzle-kit generate\",\n\t\t\"start\": \"npx tsx ./src/dev/test.ts\",\n\t\t\"start:pg\": \"npx tsx ./src/tests/northwind/pgTest.ts\",\n\t\t\"start:mysql\": \"npx tsx ./src/tests/northwind/mysqlTest.ts\",\n\t\t\"start:sqlite\": \"npx tsx ./src/tests/northwind/sqliteTest.ts\",\n\t\t\"benchmark\": \"npx tsx ./src/tests/benchmarks/generatorsBenchmark.ts\",\n\t\t\"publish\": \"npm publish package.tgz\"\n\t},\n\t\"author\": \"Drizzle Team\",\n\t\"license\": \"Apache-2.0\",\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/drizzle-team/drizzle-orm/issues\"\n\t},\n\t\"keywords\": [\n\t\t\"drizzle\",\n\t\t\"orm\",\n\t\t\"pg\",\n\t\t\"mysql\",\n\t\t\"postgresql\",\n\t\t\"postgres\",\n\t\t\"sqlite\",\n\t\t\"database\",\n\t\t\"sql\",\n\t\t\"typescript\",\n\t\t\"ts\",\n\t\t\"drizzle-orm\",\n\t\t\"drizzle-seed\",\n\t\t\"seeding\",\n\t\t\"seed\"\n\t],\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git+https://github.com/drizzle-team/drizzle-orm.git\"\n\t},\n\t\"publishConfig\": {\n\t\t\"provenance\": true\n\t},\n\t\"sideEffects\": false,\n\t\"description\": \"A package to seed your database using Drizzle ORM\",\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./index.d.mts\",\n\t\t\t\t\"default\": \"./index.mjs\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./index.d.cjs\",\n\t\t\t\t\"default\": \"./index.cjs\"\n\t\t\t},\n\t\t\t\"types\": \"./index.d.ts\",\n\t\t\t\"default\": \"./index.mjs\"\n\t\t}\n\t},\n\t\"peerDependencies\": {\n\t\t\"drizzle-orm\": \">=0.36.4\"\n\t},\n\t\"peerDependenciesMeta\": {\n\t\t\"drizzle-orm\": {\n\t\t\t\"optional\": true\n\t\t}\n\t},\n\t\"devDependencies\": {\n\t\t\"@arethetypeswrong/cli\": \"^0.16.1\",\n\t\t\"@electric-sql/pglite\": \"^0.2.12\",\n\t\t\"@rollup/plugin-terser\": \"^0.4.4\",\n\t\t\"@rollup/plugin-typescript\": \"^11.1.6\",\n\t\t\"@types/better-sqlite3\": \"^7.6.11\",\n\t\t\"@types/dockerode\": \"^3.3.31\",\n\t\t\"@types/node\": \"^22.5.4\",\n\t\t\"@types/pg\": \"^8.11.6\",\n\t\t\"@types/uuid\": \"^10.0.0\",\n\t\t\"better-sqlite3\": \"^11.1.2\",\n\t\t\"cpy\": \"^11.1.0\",\n\t\t\"dockerode\": \"^4.0.6\",\n\t\t\"dotenv\": \"^16.4.5\",\n\t\t\"drizzle-kit\": \"workspace:./drizzle-kit/dist\",\n\t\t\"drizzle-orm\": \"workspace:./drizzle-orm/dist\",\n\t\t\"get-port\": \"^7.1.0\",\n\t\t\"mysql2\": \"^3.14.1\",\n\t\t\"pg\": \"^8.12.0\",\n\t\t\"resolve-tspaths\": \"^0.8.19\",\n\t\t\"rollup\": \"^3.29.5\",\n\t\t\"tslib\": \"^2.7.0\",\n\t\t\"tsx\": \"^4.19.0\",\n\t\t\"uuid\": \"^10.0.0\",\n\t\t\"vitest\": \"^3.1.3\",\n\t\t\"zx\": \"^8.1.5\"\n\t},\n\t\"dependencies\": {\n\t\t\"pure-rand\": \"^6.1.0\"\n\t}\n}\n"
  },
  {
    "path": "drizzle-seed/rollup.config.ts",
    "content": "import typescript from '@rollup/plugin-typescript';\nimport { defineConfig } from 'rollup';\n\nexport default defineConfig([\n\t{\n\t\tinput: 'src/index.ts',\n\t\toutput: [\n\t\t\t{\n\t\t\t\tformat: 'esm',\n\t\t\t\tdir: 'dist',\n\t\t\t\tentryFileNames: '[name].mjs',\n\t\t\t\tchunkFileNames: '[name]-[hash].mjs',\n\t\t\t\tsourcemap: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tformat: 'cjs',\n\t\t\t\tdir: 'dist',\n\t\t\t\tentryFileNames: '[name].cjs',\n\t\t\t\tchunkFileNames: '[name]-[hash].cjs',\n\t\t\t\tsourcemap: true,\n\t\t\t},\n\t\t],\n\t\texternal: [/^drizzle-orm\\/?/, 'pure-rand'],\n\t\tplugins: [\n\t\t\ttypescript({\n\t\t\t\ttsconfig: 'tsconfig.build.json',\n\t\t\t}),\n\t\t],\n\t},\n]);\n"
  },
  {
    "path": "drizzle-seed/scripts/build.ts",
    "content": "#!/usr/bin/env -S pnpm tsx\nimport 'zx/globals';\nimport cpy from 'cpy';\n\nawait fs.remove('dist');\nawait $`rollup --config rollup.config.ts --configPlugin typescript`;\nawait $`resolve-tspaths`;\nawait fs.copy('README.md', 'dist/README.md');\nawait cpy('dist/**/*.d.ts', 'dist', {\n\trename: (basename) => basename.replace(/\\.d\\.ts$/, '.d.mts'),\n});\nawait cpy('dist/**/*.d.ts', 'dist', {\n\trename: (basename) => basename.replace(/\\.d\\.ts$/, '.d.cts'),\n});\nawait fs.copy('package.json', 'dist/package.json');\n"
  },
  {
    "path": "drizzle-seed/src/datasets/adjectives.ts",
    "content": "/**\n * The original source for the Adjectives data was taken from https://www.kaggle.com/datasets/jordansiem/adjectives-list\n */\nexport default [\n\t'abandoned',\n\t'abdominal',\n\t'abhorrent',\n\t'abiding',\n\t'abject',\n\t'able',\n\t'able-bodied',\n\t'abnormal',\n\t'abounding',\n\t'abrasive',\n\t'abrupt',\n\t'absent',\n\t'absentminded',\n\t'absolute',\n\t'absorbed',\n\t'absorbing',\n\t'abstracted',\n\t'absurd',\n\t'abundant',\n\t'abusive',\n\t'abysmal',\n\t'academic',\n\t'acceptable',\n\t'accepting',\n\t'accessible',\n\t'accidental',\n\t'acclaimed',\n\t'accommodating',\n\t'accompanying',\n\t'accountable',\n\t'accurate',\n\t'accusative',\n\t'accused',\n\t'accusing',\n\t'acerbic',\n\t'achievable',\n\t'aching',\n\t'acid',\n\t'acidic',\n\t'acknowledged',\n\t'acoustic',\n\t'acrid',\n\t'acrimonious',\n\t'acrobatic',\n\t'actionable',\n\t'active',\n\t'actual',\n\t'adhoc',\n\t'adamant',\n\t'adaptable',\n\t'adaptive',\n\t'addicted',\n\t'addictive',\n\t'additional',\n\t'adept',\n\t'adequate',\n\t'adhesive',\n\t'adjacent',\n\t'adjoining',\n\t'adjustable',\n\t'administrative',\n\t'admirable',\n\t'admired',\n\t'admiring',\n\t'adopted',\n\t'adoptive',\n\t'adorable',\n\t'adored',\n\t'adoring',\n\t'adrenalized',\n\t'adroit',\n\t'adult',\n\t'advanced',\n\t'advantageous',\n\t'adventurous',\n\t'adversarial',\n\t'advisable',\n\t'aerial',\n\t'affable',\n\t'affected',\n\t'affectionate',\n\t'affirmative',\n\t'affordable',\n\t'afraid',\n\t'afternoon',\n\t'ageless',\n\t'aggravated',\n\t'aggravating',\n\t'aggressive',\n\t'agitated',\n\t'agonizing',\n\t'agrarian',\n\t'agreeable',\n\t'aimless',\n\t'airline',\n\t'airsick',\n\t'ajar',\n\t'alarmed',\n\t'alarming',\n\t'alert',\n\t'algebraic',\n\t'alien',\n\t'alienated',\n\t'alike',\n\t'alive',\n\t'all-around',\n\t'alleged',\n\t'allowable',\n\t'all-purpose',\n\t'all-too-common',\n\t'alluring',\n\t'allusive',\n\t'alone',\n\t'aloof',\n\t'alterable',\n\t'alternating',\n\t'alternative',\n\t'amazed',\n\t'amazing',\n\t'ambiguous',\n\t'ambitious',\n\t'ambulant',\n\t'ambulatory',\n\t'amiable',\n\t'amicable',\n\t'amphibian',\n\t'amused',\n\t'amusing',\n\t'ancient',\n\t'anecdotal',\n\t'anemic',\n\t'angelic',\n\t'angered',\n\t'angry',\n\t'angular',\n\t'animal',\n\t'animated',\n\t'annoyed',\n\t'annoying',\n\t'annual',\n\t'anonymous',\n\t'another',\n\t'antagonistic',\n\t'anticipated',\n\t'anticlimactic',\n\t'anticorrosive',\n\t'antiquated',\n\t'antiseptic',\n\t'antisocial',\n\t'antsy',\n\t'anxious',\n\t'any',\n\t'apathetic',\n\t'apologetic',\n\t'apologizing',\n\t'appalling',\n\t'appealing',\n\t'appetizing',\n\t'applauding',\n\t'applicable',\n\t'applicative',\n\t'appreciative',\n\t'apprehensive',\n\t'approachable',\n\t'approaching',\n\t'appropriate',\n\t'approving',\n\t'approximate',\n\t'aquatic',\n\t'architectural',\n\t'ardent',\n\t'arduous',\n\t'arguable',\n\t'argumentative',\n\t'arid',\n\t'aristocratic',\n\t'aromatic',\n\t'arresting',\n\t'arrogant',\n\t'artful',\n\t'artificial',\n\t'artistic',\n\t'artless',\n\t'ashamed',\n\t'aspiring',\n\t'assertive',\n\t'assignable',\n\t'assorted',\n\t'assumable',\n\t'assured',\n\t'assuring',\n\t'astonished',\n\t'astonishing',\n\t'astounded',\n\t'astounding',\n\t'astringent',\n\t'astronomical',\n\t'astute',\n\t'asymmetrical',\n\t'athletic',\n\t'atomic',\n\t'atrocious',\n\t'attachable',\n\t'attainable',\n\t'attentive',\n\t'attractive',\n\t'attributable',\n\t'atypical',\n\t'audacious',\n\t'auspicious',\n\t'authentic',\n\t'authoritarian',\n\t'authoritative',\n\t'autobiographic',\n\t'autographed',\n\t'automatic',\n\t'autonomous',\n\t'available',\n\t'avant-garde',\n\t'avenging',\n\t'average',\n\t'avian',\n\t'avid',\n\t'avoidable',\n\t'awake',\n\t'awakening',\n\t'aware',\n\t'away',\n\t'awesome',\n\t'awful',\n\t'awkward',\n\t'axiomatic',\n\t'babbling',\n\t'baby',\n\t'background',\n\t'backhanded',\n\t'bacterial',\n\t'bad',\n\t'bad-tempered',\n\t'baffled',\n\t'baffling',\n\t'bald',\n\t'balding',\n\t'balmy',\n\t'bandaged',\n\t'banging',\n\t'bankable',\n\t'banned',\n\t'bantering',\n\t'barbaric',\n\t'barbarous',\n\t'barbequed',\n\t'barefooted',\n\t'barking',\n\t'barren',\n\t'bashful',\n\t'basic',\n\t'battered',\n\t'batty',\n\t'bawling',\n\t'beady',\n\t'beaming',\n\t'bearable',\n\t'beautiful',\n\t'beckoning',\n\t'bedazzled',\n\t'bedazzling',\n\t'beefy',\n\t'beeping',\n\t'befitting',\n\t'befuddled',\n\t'beginning',\n\t'belching',\n\t'believable',\n\t'bellicose',\n\t'belligerent',\n\t'bellowing',\n\t'bendable',\n\t'beneficial',\n\t'benevolent',\n\t'benign',\n\t'bent',\n\t'berserk',\n\t'best',\n\t'betrayed',\n\t'better',\n\t'betteroff',\n\t'better-late-than-never',\n\t'bewildered',\n\t'bewildering',\n\t'bewitched',\n\t'bewitching',\n\t'biased',\n\t'biblical',\n\t'big',\n\t'big-city',\n\t'bigger',\n\t'biggest',\n\t'big-headed',\n\t'bighearted',\n\t'bigoted',\n\t'bilingual',\n\t'billable',\n\t'billowy',\n\t'binary',\n\t'binding',\n\t'bioactive',\n\t'biodegradable',\n\t'biographical',\n\t'bite-sized',\n\t'biting',\n\t'bitter',\n\t'bizarre',\n\t'black',\n\t'black-and-blue',\n\t'blamable',\n\t'blameless',\n\t'bland',\n\t'blank',\n\t'blaring',\n\t'blasphemous',\n\t'blatant',\n\t'blazing',\n\t'bleached',\n\t'bleak',\n\t'bleary',\n\t'bleary-eyed',\n\t'blessed',\n\t'blind',\n\t'blindfolded',\n\t'blinding',\n\t'blissful',\n\t'blistering',\n\t'bloated',\n\t'blonde',\n\t'bloodied',\n\t'blood-red',\n\t'bloodthirsty',\n\t'bloody',\n\t'blooming',\n\t'blossoming',\n\t'blue',\n\t'blundering',\n\t'blunt',\n\t'blurred',\n\t'blurry',\n\t'blushing',\n\t'boastful',\n\t'bodacious',\n\t'bohemian',\n\t'boiling',\n\t'boisterous',\n\t'bold',\n\t'bookish',\n\t'booming',\n\t'boorish',\n\t'bordering',\n\t'bored',\n\t'boring',\n\t'born',\n\t'bossy',\n\t'both',\n\t'bothered',\n\t'bouncing',\n\t'bouncy',\n\t'boundless',\n\t'bountiful',\n\t'boyish',\n\t'braided',\n\t'brainless',\n\t'brainy',\n\t'brash',\n\t'brassy',\n\t'brave',\n\t'brawny',\n\t'brazen',\n\t'breakable',\n\t'breathable',\n\t'breathless',\n\t'breathtaking',\n\t'breezy',\n\t'bribable',\n\t'brick',\n\t'brief',\n\t'bright',\n\t'bright-eyed',\n\t'bright-red',\n\t'brilliant',\n\t'briny',\n\t'brisk',\n\t'bristly',\n\t'broad',\n\t'broken',\n\t'broken-hearted',\n\t'bronchial',\n\t'bronze',\n\t'bronzed',\n\t'brooding',\n\t'brown',\n\t'bruised',\n\t'brunette',\n\t'brutal',\n\t'brutish',\n\t'bubbly',\n\t'budget',\n\t'built-in',\n\t'bulky',\n\t'bumpy',\n\t'bungling',\n\t'buoyant',\n\t'bureaucratic',\n\t'burly',\n\t'burnable',\n\t'burning',\n\t'bushy',\n\t'busiest',\n\t'business',\n\t'bustling',\n\t'busy',\n\t'buzzing',\n\t'cackling',\n\t'caged',\n\t'cagey',\n\t'calculable',\n\t'calculated',\n\t'calculating',\n\t'callous',\n\t'calm',\n\t'calming',\n\t'camouflaged',\n\t'cancelled',\n\t'cancerous',\n\t'candid',\n\t'cantankerous',\n\t'capable',\n\t'capricious',\n\t'captivated',\n\t'captivating',\n\t'captive',\n\t'carefree',\n\t'careful',\n\t'careless',\n\t'caring',\n\t'carnivorous',\n\t'carpeted',\n\t'carsick',\n\t'casual',\n\t'catastrophic',\n\t'catatonic',\n\t'catchable',\n\t'caustic',\n\t'cautious',\n\t'cavalier',\n\t'cavernous',\n\t'ceaseless',\n\t'celebrated',\n\t'celestial',\n\t'centered',\n\t'central',\n\t'cerebral',\n\t'ceremonial',\n\t'certain',\n\t'certifiable',\n\t'certified',\n\t'challenged',\n\t'challenging',\n\t'chance',\n\t'changeable',\n\t'changing',\n\t'chanting',\n\t'charging',\n\t'charismatic',\n\t'charitable',\n\t'charmed',\n\t'charming',\n\t'chattering',\n\t'chatting',\n\t'chatty',\n\t'chauvinistic',\n\t'cheap',\n\t'cheapest',\n\t'cheeky',\n\t'cheerful',\n\t'cheering',\n\t'cheerless',\n\t'cheery',\n\t'chemical',\n\t'chewable',\n\t'chewy',\n\t'chic',\n\t'chicken',\n\t'chief',\n\t'childish',\n\t'childlike',\n\t'chilling',\n\t'chilly',\n\t'chivalrous',\n\t'choice',\n\t'choking',\n\t'choppy',\n\t'chronological',\n\t'chubby',\n\t'chuckling',\n\t'chunky',\n\t'cinematic',\n\t'circling',\n\t'circular',\n\t'circumstantial',\n\t'civil',\n\t'civilian',\n\t'civilized',\n\t'clammy',\n\t'clamoring',\n\t'clandestine',\n\t'clanging',\n\t'clapping',\n\t'clashing',\n\t'classic',\n\t'classical',\n\t'classifiable',\n\t'classified',\n\t'classy',\n\t'clean',\n\t'cleanable',\n\t'clear',\n\t'cleared',\n\t'clearheaded',\n\t'clever',\n\t'climatic',\n\t'climbable',\n\t'clinging',\n\t'clingy',\n\t'clinical',\n\t'cliquish',\n\t'clogged',\n\t'cloistered',\n\t'close',\n\t'closeable',\n\t'closed',\n\t'close-minded',\n\t'cloudless',\n\t'cloudy',\n\t'clownish',\n\t'clueless',\n\t'clumsy',\n\t'cluttered',\n\t'coachable',\n\t'coarse',\n\t'cockamamie',\n\t'cocky',\n\t'codified',\n\t'coercive',\n\t'cognitive',\n\t'coherent',\n\t'cohesive',\n\t'coincidental',\n\t'cold',\n\t'coldhearted',\n\t'collaborative',\n\t'collapsed',\n\t'collapsing',\n\t'collectable',\n\t'collegial',\n\t'colloquial',\n\t'colonial',\n\t'colorful',\n\t'colorless',\n\t'colossal',\n\t'combative',\n\t'combined',\n\t'comfortable',\n\t'comforted',\n\t'comforting',\n\t'comical',\n\t'commanding',\n\t'commemorative',\n\t'commendable',\n\t'commercial',\n\t'committed',\n\t'common',\n\t'communal',\n\t'communicable',\n\t'communicative',\n\t'communist',\n\t'compact',\n\t'comparable',\n\t'comparative',\n\t'compassionate',\n\t'compelling',\n\t'competent',\n\t'competitive',\n\t'complacent',\n\t'complaining',\n\t'complete',\n\t'completed',\n\t'complex',\n\t'compliant',\n\t'complicated',\n\t'complimentary',\n\t'compound',\n\t'comprehensive',\n\t'compulsive',\n\t'compulsory',\n\t'computer',\n\t'computerized',\n\t'concealable',\n\t'concealed',\n\t'conceited',\n\t'conceivable',\n\t'concerned',\n\t'concerning',\n\t'concerted',\n\t'concise',\n\t'concurrent',\n\t'condemned',\n\t'condensed',\n\t'condescending',\n\t'conditional',\n\t'confident',\n\t'confidential',\n\t'confirmable',\n\t'confirmed',\n\t'conflicted',\n\t'conflicting',\n\t'conformable',\n\t'confounded',\n\t'confused',\n\t'confusing',\n\t'congenial',\n\t'congested',\n\t'congressional',\n\t'congruent',\n\t'congruous',\n\t'connectable',\n\t'connected',\n\t'connecting',\n\t'connective',\n\t'conscientious',\n\t'conscious',\n\t'consecutive',\n\t'consensual',\n\t'consenting',\n\t'conservative',\n\t'considerable',\n\t'considerate',\n\t'consistent',\n\t'consoling',\n\t'conspicuous',\n\t'conspiratorial',\n\t'constant',\n\t'constitutional',\n\t'constrictive',\n\t'constructive',\n\t'consumable',\n\t'consummate',\n\t'contagious',\n\t'containable',\n\t'contemplative',\n\t'contemporary',\n\t'contemptible',\n\t'contemptuous',\n\t'content',\n\t'contented',\n\t'contentious',\n\t'contextual',\n\t'continual',\n\t'continuing',\n\t'continuous',\n\t'contoured',\n\t'contractual',\n\t'contradicting',\n\t'contradictory',\n\t'contrarian',\n\t'contrary',\n\t'contributive',\n\t'contrite',\n\t'controllable',\n\t'controlling',\n\t'controversial',\n\t'convenient',\n\t'conventional',\n\t'conversational',\n\t'convinced',\n\t'convincing',\n\t'convoluted',\n\t'convulsive',\n\t'cooing',\n\t'cooked',\n\t'cool',\n\t'coolest',\n\t'cooperative',\n\t'coordinated',\n\t'copious',\n\t'coquettish',\n\t'cordial',\n\t'corner',\n\t'cornered',\n\t'corny',\n\t'corporate',\n\t'corpulent',\n\t'correct',\n\t'correctable',\n\t'corrective',\n\t'corresponding',\n\t'corrosive',\n\t'corrupt',\n\t'corrupting',\n\t'corruptive',\n\t'cosmetic',\n\t'cosmic',\n\t'costly',\n\t'cottony',\n\t'coughing',\n\t'courageous',\n\t'courteous',\n\t'covert',\n\t'coveted',\n\t'cowardly',\n\t'cowering',\n\t'coy',\n\t'cozy',\n\t'crabby',\n\t'cracked',\n\t'crackling',\n\t'crafty',\n\t'craggy',\n\t'crammed',\n\t'cramped',\n\t'cranky',\n\t'crashing',\n\t'crass',\n\t'craven',\n\t'crawling',\n\t'crazy',\n\t'creaking',\n\t'creaky',\n\t'creamy',\n\t'creative',\n\t'credible',\n\t'creeping',\n\t'creepy',\n\t'crestfallen',\n\t'criminal',\n\t'crippled',\n\t'crippling',\n\t'crisp',\n\t'crispy',\n\t'critical',\n\t'crooked',\n\t'cropped',\n\t'cross',\n\t'crossed',\n\t'crotchety',\n\t'crowded',\n\t'crucial',\n\t'crude',\n\t'cruel',\n\t'crumbling',\n\t'crumbly',\n\t'crumply',\n\t'crunchable',\n\t'crunching',\n\t'crunchy',\n\t'crushable',\n\t'crushed',\n\t'crusty',\n\t'crying',\n\t'cryptic',\n\t'crystalline',\n\t'crystallized',\n\t'cuddly',\n\t'culpable',\n\t'cultural',\n\t'cultured',\n\t'cumbersome',\n\t'cumulative',\n\t'cunning',\n\t'curable',\n\t'curative',\n\t'curious',\n\t'curly',\n\t'current',\n\t'cursed',\n\t'curt',\n\t'curved',\n\t'curvy',\n\t'customary',\n\t'cut',\n\t'cute',\n\t'cutting',\n\t'cylindrical',\n\t'cynical',\n\t'daffy',\n\t'daft',\n\t'daily',\n\t'dainty',\n\t'damaged',\n\t'damaging',\n\t'damp',\n\t'danceable',\n\t'dandy',\n\t'dangerous',\n\t'dapper',\n\t'daring',\n\t'dark',\n\t'darkened',\n\t'dashing',\n\t'daughterly',\n\t'daunting',\n\t'dawdling',\n\t'day',\n\t'dazed',\n\t'dazzling',\n\t'dead',\n\t'deadly',\n\t'deadpan',\n\t'deaf',\n\t'deafening',\n\t'dear',\n\t'debatable',\n\t'debonair',\n\t'decadent',\n\t'decayed',\n\t'decaying',\n\t'deceitful',\n\t'deceivable',\n\t'deceiving',\n\t'decent',\n\t'decentralized',\n\t'deceptive',\n\t'decimated',\n\t'decipherable',\n\t'decisive',\n\t'declining',\n\t'decorative',\n\t'decorous',\n\t'decreasing',\n\t'decrepit',\n\t'dedicated',\n\t'deep',\n\t'deepening',\n\t'deeply',\n\t'defeated',\n\t'defective',\n\t'defendable',\n\t'defenseless',\n\t'defensible',\n\t'defensive',\n\t'defiant',\n\t'deficient',\n\t'definable',\n\t'definitive',\n\t'deformed',\n\t'degenerative',\n\t'degraded',\n\t'dehydrated',\n\t'dejected',\n\t'delectable',\n\t'deliberate',\n\t'deliberative',\n\t'delicate',\n\t'delicious',\n\t'delighted',\n\t'delightful',\n\t'delinquent',\n\t'delirious',\n\t'deliverable',\n\t'deluded',\n\t'demanding',\n\t'demented',\n\t'democratic',\n\t'demonic',\n\t'demonstrative',\n\t'demure',\n\t'deniable',\n\t'dense',\n\t'dependable',\n\t'dependent',\n\t'deplorable',\n\t'deploring',\n\t'depraved',\n\t'depressed',\n\t'depressing',\n\t'depressive',\n\t'deprived',\n\t'deranged',\n\t'derivative',\n\t'derogative',\n\t'derogatory',\n\t'descriptive',\n\t'deserted',\n\t'designer',\n\t'desirable',\n\t'desirous',\n\t'desolate',\n\t'despairing',\n\t'desperate',\n\t'despicable',\n\t'despised',\n\t'despondent',\n\t'destroyed',\n\t'destructive',\n\t'detachable',\n\t'detached',\n\t'detailed',\n\t'detectable',\n\t'determined',\n\t'detestable',\n\t'detrimental',\n\t'devastated',\n\t'devastating',\n\t'devious',\n\t'devoted',\n\t'devout',\n\t'dexterous',\n\t'diabolical',\n\t'diagonal',\n\t'didactic',\n\t'different',\n\t'difficult',\n\t'diffuse',\n\t'digestive',\n\t'digital',\n\t'dignified',\n\t'digressive',\n\t'dilapidated',\n\t'diligent',\n\t'dim',\n\t'diminishing',\n\t'diminutive',\n\t'dingy',\n\t'diplomatic',\n\t'dire',\n\t'direct',\n\t'direful',\n\t'dirty',\n\t'disabled',\n\t'disadvantaged',\n\t'disadvantageous',\n\t'disaffected',\n\t'disagreeable',\n\t'disappearing',\n\t'disappointed',\n\t'disappointing',\n\t'disapproving',\n\t'disarming',\n\t'disastrous',\n\t'discarded',\n\t'discernable',\n\t'disciplined',\n\t'disconnected',\n\t'discontented',\n\t'discordant',\n\t'discouraged',\n\t'discouraging',\n\t'discourteous',\n\t'discredited',\n\t'discreet',\n\t'discriminating',\n\t'discriminatory',\n\t'discussable',\n\t'disdainful',\n\t'diseased',\n\t'disenchanted',\n\t'disgraceful',\n\t'disgruntled',\n\t'disgusted',\n\t'disgusting',\n\t'disheartened',\n\t'disheartening',\n\t'dishonest',\n\t'dishonorable',\n\t'disillusioned',\n\t'disinclined',\n\t'disingenuous',\n\t'disinterested',\n\t'disjointed',\n\t'dislikeable',\n\t'disliked',\n\t'disloyal',\n\t'dismal',\n\t'dismissive',\n\t'disobedient',\n\t'disorderly',\n\t'disorganized',\n\t'disparaging',\n\t'disparate',\n\t'dispassionate',\n\t'dispensable',\n\t'displaced',\n\t'displeased',\n\t'displeasing',\n\t'disposable',\n\t'disproportionate',\n\t'disproved',\n\t'disputable',\n\t'disputatious',\n\t'disputed',\n\t'disreputable',\n\t'disrespectful',\n\t'disruptive',\n\t'dissatisfied',\n\t'dissimilar',\n\t'dissolvable',\n\t'dissolving',\n\t'dissonant',\n\t'dissuasive',\n\t'distant',\n\t'distasteful',\n\t'distinct',\n\t'distinctive',\n\t'distinguished',\n\t'distracted',\n\t'distracting',\n\t'distraught',\n\t'distressed',\n\t'distressing',\n\t'distrustful',\n\t'disturbed',\n\t'disturbing',\n\t'divergent',\n\t'diverging',\n\t'diverse',\n\t'diversified',\n\t'divided',\n\t'divine',\n\t'divisive',\n\t'dizzy',\n\t'dizzying',\n\t'doable',\n\t'documentary',\n\t'dogged',\n\t'doggish',\n\t'dogmatic',\n\t'doleful',\n\t'dollish',\n\t'domed',\n\t'domestic',\n\t'dominant',\n\t'domineering',\n\t'dorsal',\n\t'doting',\n\t'double',\n\t'doubtful',\n\t'doubting',\n\t'dovish',\n\t'dowdy',\n\t'down',\n\t'down-and-out',\n\t'downhearted',\n\t'downloadable',\n\t'downtown',\n\t'downward',\n\t'dozing',\n\t'drab',\n\t'drained',\n\t'dramatic',\n\t'drastic',\n\t'dreaded',\n\t'dreadful',\n\t'dreaming',\n\t'dreamy',\n\t'dreary',\n\t'drenched',\n\t'dress',\n\t'dressy',\n\t'dried',\n\t'dripping',\n\t'drivable',\n\t'driven',\n\t'droll',\n\t'drooping',\n\t'droopy',\n\t'drowsy',\n\t'drunk',\n\t'dry',\n\t'dual',\n\t'dubious',\n\t'due',\n\t'dulcet',\n\t'dull',\n\t'duplicitous',\n\t'durable',\n\t'dusty',\n\t'dutiful',\n\t'dwarfish',\n\t'dwindling',\n\t'dynamic',\n\t'dysfunctional',\n\t'each',\n\t'eager',\n\t'early',\n\t'earnest',\n\t'ear-piercing',\n\t'ear-splitting',\n\t'earthshaking',\n\t'earthy',\n\t'east',\n\t'eastern',\n\t'easy',\n\t'eatable',\n\t'eccentric',\n\t'echoing',\n\t'ecological',\n\t'economic',\n\t'economical',\n\t'economy',\n\t'ecstatic',\n\t'edgy',\n\t'editable',\n\t'educated',\n\t'educational',\n\t'eerie',\n\t'effective',\n\t'effervescent',\n\t'efficacious',\n\t'efficient',\n\t'effortless',\n\t'effusive',\n\t'egalitarian',\n\t'egocentric',\n\t'egomaniacal',\n\t'egotistical',\n\t'eight',\n\t'eighth',\n\t'either',\n\t'elaborate',\n\t'elastic',\n\t'elated',\n\t'elderly',\n\t'electric',\n\t'electrical',\n\t'electrifying',\n\t'electronic',\n\t'elegant',\n\t'elementary',\n\t'elevated',\n\t'elfish',\n\t'eligible',\n\t'elite',\n\t'eloquent',\n\t'elusive',\n\t'emaciated',\n\t'embarrassed',\n\t'embarrassing',\n\t'embattled',\n\t'embittered',\n\t'emblematic',\n\t'emboldened',\n\t'embroiled',\n\t'emergency',\n\t'eminent',\n\t'emotional',\n\t'emotionless',\n\t'empirical',\n\t'empty',\n\t'enamored',\n\t'enchanted',\n\t'enchanting',\n\t'encouraged',\n\t'encouraging',\n\t'encrusted',\n\t'endangered',\n\t'endearing',\n\t'endemic',\n\t'endless',\n\t'endurable',\n\t'enduring',\n\t'energetic',\n\t'energizing',\n\t'enforceable',\n\t'engaging',\n\t'engrossing',\n\t'enhanced',\n\t'enigmatic',\n\t'enjoyable',\n\t'enlarged',\n\t'enlightened',\n\t'enormous',\n\t'enough',\n\t'enraged',\n\t'ensuing',\n\t'enterprising',\n\t'entertained',\n\t'entertaining',\n\t'enthralled',\n\t'enthused',\n\t'enthusiastic',\n\t'enticing',\n\t'entire',\n\t'entranced',\n\t'entrepreneurial',\n\t'enumerable',\n\t'enviable',\n\t'envious',\n\t'environmental',\n\t'episodic',\n\t'equable',\n\t'equal',\n\t'equidistant',\n\t'equitable',\n\t'equivalent',\n\t'erasable',\n\t'erect',\n\t'eroding',\n\t'errant',\n\t'erratic',\n\t'erroneous',\n\t'eruptive',\n\t'escalating',\n\t'esoteric',\n\t'essential',\n\t'established',\n\t'estimated',\n\t'estranged',\n\t'eternal',\n\t'ethereal',\n\t'ethical',\n\t'ethnic',\n\t'euphemistic',\n\t'euphoric',\n\t'evasive',\n\t'even',\n\t'evenhanded',\n\t'evening',\n\t'eventful',\n\t'eventual',\n\t'everlasting',\n\t'every',\n\t'evil',\n\t'evocative',\n\t'exacerbating',\n\t'exact',\n\t'exacting',\n\t'exaggerated',\n\t'exalted',\n\t'exasperated',\n\t'exasperating',\n\t'excellent',\n\t'exceptional',\n\t'excessive',\n\t'exchangeable',\n\t'excitable',\n\t'excited',\n\t'exciting',\n\t'exclusive',\n\t'excruciating',\n\t'excusable',\n\t'executable',\n\t'exemplary',\n\t'exhausted',\n\t'exhausting',\n\t'exhaustive',\n\t'exhilarated',\n\t'exhilarating',\n\t'existing',\n\t'exotic',\n\t'expandable',\n\t'expanded',\n\t'expanding',\n\t'expansive',\n\t'expectant',\n\t'expected',\n\t'expedient',\n\t'expeditious',\n\t'expendable',\n\t'expensive',\n\t'experimental',\n\t'expert',\n\t'expired',\n\t'expiring',\n\t'explainable',\n\t'explicit',\n\t'exploding',\n\t'exploitative',\n\t'exploited',\n\t'explosive',\n\t'exponential',\n\t'exposed',\n\t'express',\n\t'expressionistic',\n\t'expressionless',\n\t'expressive',\n\t'exquisite',\n\t'extemporaneous',\n\t'extendable',\n\t'extended',\n\t'extension',\n\t'extensive',\n\t'exterior',\n\t'external',\n\t'extra',\n\t'extra-large',\n\t'extraneous',\n\t'extraordinary',\n\t'extra-small',\n\t'extravagant',\n\t'extreme',\n\t'exuberant',\n\t'eye-popping',\n\t'fabled',\n\t'fabulous',\n\t'facetious',\n\t'facial',\n\t'factitious',\n\t'factual',\n\t'faded',\n\t'fading',\n\t'failed',\n\t'faint',\n\t'fainthearted',\n\t'fair',\n\t'faithful',\n\t'faithless',\n\t'fallacious',\n\t'false',\n\t'falsified',\n\t'faltering',\n\t'familiar',\n\t'famished',\n\t'famous',\n\t'fanatical',\n\t'fanciful',\n\t'fancy',\n\t'fantastic',\n\t'far',\n\t'faraway',\n\t'farcical',\n\t'far-flung',\n\t'farsighted',\n\t'fascinated',\n\t'fascinating',\n\t'fascistic',\n\t'fashionable',\n\t'fast',\n\t'fastest',\n\t'fastidious',\n\t'fast-moving',\n\t'fat',\n\t'fatal',\n\t'fateful',\n\t'fatherly',\n\t'fathomable',\n\t'fathomless',\n\t'fatigued',\n\t'faulty',\n\t'favorable',\n\t'favorite',\n\t'fawning',\n\t'feared',\n\t'fearful',\n\t'fearless',\n\t'fearsome',\n\t'feathered',\n\t'feathery',\n\t'feckless',\n\t'federal',\n\t'feeble',\n\t'feebleminded',\n\t'feeling',\n\t'feigned',\n\t'felonious',\n\t'female',\n\t'feminine',\n\t'fermented',\n\t'ferocious',\n\t'fertile',\n\t'fervent',\n\t'fervid',\n\t'festive',\n\t'fetching',\n\t'fetid',\n\t'feudal',\n\t'feverish',\n\t'few,',\n\t'fewer',\n\t'fictional',\n\t'fictitious',\n\t'fidgeting',\n\t'fidgety',\n\t'fiendish',\n\t'fierce',\n\t'fiery',\n\t'fifth',\n\t'filmy',\n\t'filtered',\n\t'filthy',\n\t'final',\n\t'financial',\n\t'fine',\n\t'finicky',\n\t'finite',\n\t'fireproof',\n\t'firm',\n\t'first',\n\t'fiscal',\n\t'fishy',\n\t'fit',\n\t'fitted',\n\t'fitting',\n\t'five',\n\t'fixable',\n\t'fixed',\n\t'flabby',\n\t'flagrant',\n\t'flaky',\n\t'flamboyant',\n\t'flaming',\n\t'flammable',\n\t'flashy',\n\t'flat',\n\t'flattened',\n\t'flattered',\n\t'flattering',\n\t'flavored',\n\t'flavorful',\n\t'flavorless',\n\t'flawed',\n\t'flawless',\n\t'fleeting',\n\t'flexible',\n\t'flickering',\n\t'flimsy',\n\t'flippant',\n\t'flirtatious',\n\t'floating',\n\t'flooded',\n\t'floppy',\n\t'floral',\n\t'flowering',\n\t'flowery',\n\t'fluent',\n\t'fluffy',\n\t'flushed',\n\t'fluttering',\n\t'flying',\n\t'foamy',\n\t'focused',\n\t'foggy',\n\t'folded',\n\t'following',\n\t'fond',\n\t'foolhardy',\n\t'foolish',\n\t'forbidding',\n\t'forceful',\n\t'foreboding',\n\t'foregoing',\n\t'foreign',\n\t'forensic',\n\t'foreseeable',\n\t'forged',\n\t'forgetful',\n\t'forgettable',\n\t'forgivable',\n\t'forgiving',\n\t'forgotten',\n\t'forked',\n\t'formal',\n\t'formative',\n\t'former',\n\t'formidable',\n\t'formless',\n\t'formulaic',\n\t'forthright',\n\t'fortuitous',\n\t'fortunate',\n\t'forward',\n\t'foul',\n\t'foul-smelling',\n\t'four',\n\t'fourth',\n\t'foxy',\n\t'fractional',\n\t'fractious',\n\t'fragile',\n\t'fragmented',\n\t'fragrant',\n\t'frail',\n\t'frank',\n\t'frantic',\n\t'fraternal',\n\t'fraudulent',\n\t'frayed',\n\t'freakish',\n\t'freaky',\n\t'freckled',\n\t'free',\n\t'freezing',\n\t'frequent',\n\t'fresh',\n\t'fretful',\n\t'fried',\n\t'friendly',\n\t'frightened',\n\t'frightening',\n\t'frightful',\n\t'frigid',\n\t'frilly',\n\t'frisky',\n\t'frivolous',\n\t'front',\n\t'frosty',\n\t'frothy',\n\t'frowning',\n\t'frozen',\n\t'frugal',\n\t'fruitful',\n\t'fruitless',\n\t'fruity',\n\t'frumpy',\n\t'frustrated',\n\t'frustrating',\n\t'fulfilled',\n\t'fulfilling',\n\t'full',\n\t'fully-grown',\n\t'fumbling',\n\t'fuming',\n\t'fun',\n\t'functional',\n\t'fundamental',\n\t'fun-loving',\n\t'funniest',\n\t'funny',\n\t'furious',\n\t'furry',\n\t'furthest',\n\t'furtive',\n\t'fussy',\n\t'futile',\n\t'future',\n\t'futuristic',\n\t'fuzzy',\n\t'gabby',\n\t'gainful',\n\t'gallant',\n\t'galling',\n\t'game',\n\t'gangly',\n\t'gaping',\n\t'garbled',\n\t'gargantuan',\n\t'garish',\n\t'garrulous',\n\t'gaseous',\n\t'gasping',\n\t'gaudy',\n\t'gaunt',\n\t'gauzy',\n\t'gawky',\n\t'general',\n\t'generative',\n\t'generic',\n\t'generous',\n\t'genial',\n\t'gentle',\n\t'genuine',\n\t'geographic',\n\t'geologic',\n\t'geometric',\n\t'geriatric',\n\t'ghastly',\n\t'ghostly',\n\t'ghoulish',\n\t'giant',\n\t'giddy',\n\t'gifted',\n\t'gigantic',\n\t'giggling',\n\t'gilded',\n\t'giving',\n\t'glad',\n\t'glamorous',\n\t'glaring',\n\t'glass',\n\t'glassy',\n\t'gleaming',\n\t'glib',\n\t'glistening',\n\t'glittering',\n\t'global',\n\t'globular',\n\t'gloomy',\n\t'glorious',\n\t'glossy',\n\t'glowing',\n\t'gluey',\n\t'glum',\n\t'gluttonous',\n\t'gnarly',\n\t'gold',\n\t'golden',\n\t'good',\n\t'good-looking',\n\t'good-natured',\n\t'gooey',\n\t'goofy',\n\t'gorgeous',\n\t'graceful',\n\t'gracious',\n\t'gradual',\n\t'grainy',\n\t'grand',\n\t'grandiose',\n\t'graphic',\n\t'grateful',\n\t'gratified',\n\t'gratifying',\n\t'grating',\n\t'gratis',\n\t'gratuitous',\n\t'grave',\n\t'gray',\n\t'greasy',\n\t'great',\n\t'greatest',\n\t'greedy',\n\t'green',\n\t'gregarious',\n\t'grey',\n\t'grieving',\n\t'grim',\n\t'grimacing',\n\t'grimy',\n\t'grinding',\n\t'grinning',\n\t'gripping',\n\t'gritty',\n\t'grizzled',\n\t'groaning',\n\t'groggy',\n\t'groomed',\n\t'groovy',\n\t'gross',\n\t'grotesque',\n\t'grouchy',\n\t'growling',\n\t'grown-up',\n\t'grubby',\n\t'grueling',\n\t'gruesome',\n\t'gruff',\n\t'grumbling',\n\t'grumpy',\n\t'guaranteed',\n\t'guarded',\n\t'guiltless',\n\t'guilt-ridden',\n\t'guilty',\n\t'gullible',\n\t'gurgling',\n\t'gushing',\n\t'gushy',\n\t'gusty',\n\t'gutsy',\n\t'habitable',\n\t'habitual',\n\t'haggard',\n\t'hairless',\n\t'hairy',\n\t'half',\n\t'halfhearted',\n\t'hallowed',\n\t'halting',\n\t'handsome',\n\t'handy',\n\t'hanging',\n\t'haphazard',\n\t'hapless',\n\t'happy',\n\t'hard',\n\t'hard-to-find',\n\t'hardworking',\n\t'hardy',\n\t'harebrained',\n\t'harmful',\n\t'harmless',\n\t'harmonic',\n\t'harmonious',\n\t'harried',\n\t'harsh',\n\t'hasty',\n\t'hated',\n\t'hateful',\n\t'haughty',\n\t'haunting',\n\t'hawkish',\n\t'hazardous',\n\t'hazy',\n\t'head',\n\t'heady',\n\t'healthy',\n\t'heartbreaking',\n\t'heartbroken',\n\t'heartless',\n\t'heartrending',\n\t'hearty',\n\t'heated',\n\t'heavenly',\n\t'heavy',\n\t'hectic',\n\t'hefty',\n\t'heinous',\n\t'helpful',\n\t'helpless',\n\t'her',\n\t'heroic',\n\t'hesitant',\n\t'hideous',\n\t'high',\n\t'highest',\n\t'highfalutin',\n\t'high-functioning',\n\t'high-maintenance',\n\t'high-pitched',\n\t'high-risk',\n\t'hilarious',\n\t'his',\n\t'hissing',\n\t'historical',\n\t'hoarse',\n\t'hoggish',\n\t'holiday',\n\t'holistic',\n\t'hollow',\n\t'home',\n\t'homeless',\n\t'homely',\n\t'homeopathic',\n\t'homey',\n\t'homogeneous',\n\t'honest',\n\t'honking',\n\t'honorable',\n\t'hopeful',\n\t'hopeless',\n\t'horizontal',\n\t'hormonal',\n\t'horned',\n\t'horrendous',\n\t'horrible',\n\t'horrid',\n\t'horrific',\n\t'horrified',\n\t'horrifying',\n\t'hospitable',\n\t'hostile',\n\t'hot',\n\t'hotpink',\n\t'hot-blooded',\n\t'hotheaded',\n\t'hot-shot',\n\t'hot-tempered',\n\t'hour-long',\n\t'house',\n\t'howling',\n\t'huffy',\n\t'huge',\n\t'huggable',\n\t'hulking',\n\t'human',\n\t'humanitarian',\n\t'humanlike',\n\t'humble',\n\t'humdrum',\n\t'humid',\n\t'humiliated',\n\t'humiliating',\n\t'humming',\n\t'humongous',\n\t'humorless',\n\t'humorous',\n\t'hungry',\n\t'hurried',\n\t'hurt',\n\t'hurtful',\n\t'hushed',\n\t'husky',\n\t'hydraulic',\n\t'hydrothermal',\n\t'hygienic',\n\t'hyper-active',\n\t'hyperbolic',\n\t'hypercritical',\n\t'hyperirritable',\n\t'hypersensitive',\n\t'hypertensive',\n\t'hypnotic',\n\t'hypnotizable',\n\t'hypothetical',\n\t'hysterical',\n\t'icky',\n\t'iconoclastic',\n\t'icy',\n\t'icy-cold',\n\t'ideal',\n\t'idealistic',\n\t'identical',\n\t'identifiable',\n\t'idiosyncratic',\n\t'idiotic',\n\t'idyllic',\n\t'ignorable',\n\t'ignorant',\n\t'ill',\n\t'illegal',\n\t'illegible',\n\t'illegitimate',\n\t'ill-equipped',\n\t'ill-fated',\n\t'ill-humored',\n\t'illicit',\n\t'ill-informed',\n\t'illiterate',\n\t'illogical',\n\t'illuminating',\n\t'illusive',\n\t'illustrious',\n\t'imaginable',\n\t'imaginary',\n\t'imaginative',\n\t'imitative',\n\t'immaculate',\n\t'immanent',\n\t'immature',\n\t'immeasurable',\n\t'immediate',\n\t'immense',\n\t'immensurable',\n\t'imminent',\n\t'immobile',\n\t'immodest',\n\t'immoral',\n\t'immortal',\n\t'immovable',\n\t'impartial',\n\t'impassable',\n\t'impassioned',\n\t'impatient',\n\t'impeccable',\n\t'impenetrable',\n\t'imperative',\n\t'imperceptible',\n\t'imperceptive',\n\t'imperfect',\n\t'imperial',\n\t'imperialistic',\n\t'impermeable',\n\t'impersonal',\n\t'impertinent',\n\t'impervious',\n\t'impetuous',\n\t'impish',\n\t'implausible',\n\t'implicit',\n\t'implosive',\n\t'impolite',\n\t'imponderable',\n\t'important',\n\t'imported',\n\t'imposing',\n\t'impossible',\n\t'impoverished',\n\t'impractical',\n\t'imprecise',\n\t'impressionable',\n\t'impressive',\n\t'improbable',\n\t'improper',\n\t'improvable',\n\t'improved',\n\t'improving',\n\t'imprudent',\n\t'impulsive',\n\t'impure',\n\t'inaccessible',\n\t'inaccurate',\n\t'inactive',\n\t'inadequate',\n\t'inadmissible',\n\t'inadvertent',\n\t'inadvisable',\n\t'inalienable',\n\t'inalterable',\n\t'inane',\n\t'inanimate',\n\t'inapplicable',\n\t'inappropriate',\n\t'inapt',\n\t'inarguable',\n\t'inarticulate',\n\t'inartistic',\n\t'inattentive',\n\t'inaudible',\n\t'inauspicious',\n\t'incalculable',\n\t'incandescent',\n\t'incapable',\n\t'incessant',\n\t'incidental',\n\t'inclusive',\n\t'incoherent',\n\t'incomparable',\n\t'incompatible',\n\t'incompetent',\n\t'incomplete',\n\t'incomprehensible',\n\t'inconceivable',\n\t'inconclusive',\n\t'incongruent',\n\t'incongruous',\n\t'inconsequential',\n\t'inconsiderable',\n\t'inconsiderate',\n\t'inconsistent',\n\t'inconsolable',\n\t'inconspicuous',\n\t'incontrovertible',\n\t'inconvenient',\n\t'incorrect',\n\t'incorrigible',\n\t'incorruptible',\n\t'increasing',\n\t'incredible',\n\t'incredulous',\n\t'incremental',\n\t'incurable',\n\t'indecent',\n\t'indecipherable',\n\t'indecisive',\n\t'indefensible',\n\t'indefinable',\n\t'indefinite',\n\t'indelible',\n\t'independent',\n\t'indescribable',\n\t'indestructible',\n\t'indeterminable',\n\t'indeterminate',\n\t'indicative',\n\t'indifferent',\n\t'indigenous',\n\t'indignant',\n\t'indirect',\n\t'indiscreet',\n\t'indiscriminate',\n\t'indispensable',\n\t'indisputable',\n\t'indistinct',\n\t'individual',\n\t'individualistic',\n\t'indivisible',\n\t'indomitable',\n\t'inductive',\n\t'indulgent',\n\t'industrial',\n\t'industrious',\n\t'ineffective',\n\t'ineffectual',\n\t'inefficient',\n\t'inelegant',\n\t'ineloquent',\n\t'inequitable',\n\t'inert',\n\t'inescapable',\n\t'inevitable',\n\t'inexact',\n\t'inexcusable',\n\t'inexhaustible',\n\t'inexpedient',\n\t'inexpensive',\n\t'inexplicable',\n\t'inexpressible',\n\t'inexpressive',\n\t'inextricable',\n\t'infallible',\n\t'infamous',\n\t'infantile',\n\t'infatuated',\n\t'infected',\n\t'infectious',\n\t'inferable',\n\t'inferior',\n\t'infernal',\n\t'infinite',\n\t'infinitesimal',\n\t'inflamed',\n\t'inflammable',\n\t'inflammatory',\n\t'inflatable',\n\t'inflated',\n\t'inflexible',\n\t'influential',\n\t'informal',\n\t'informative',\n\t'informed',\n\t'infrequent',\n\t'infuriated',\n\t'infuriating',\n\t'ingenious',\n\t'ingenuous',\n\t'inglorious',\n\t'ingratiating',\n\t'inhabitable',\n\t'inharmonious',\n\t'inherent',\n\t'inhibited',\n\t'inhospitable',\n\t'inhuman',\n\t'inhumane',\n\t'initial',\n\t'injudicious',\n\t'injured',\n\t'injurious',\n\t'innate',\n\t'inner',\n\t'innocent',\n\t'innocuous',\n\t'innovative',\n\t'innumerable',\n\t'inoffensive',\n\t'inoperable',\n\t'inoperative',\n\t'inopportune',\n\t'inordinate',\n\t'inorganic',\n\t'inquiring',\n\t'inquisitive',\n\t'insane',\n\t'insatiable',\n\t'inscrutable',\n\t'insecure',\n\t'insensible',\n\t'insensitive',\n\t'inseparable',\n\t'inside',\n\t'insidious',\n\t'insightful',\n\t'insignificant',\n\t'insincere',\n\t'insipid',\n\t'insistent',\n\t'insolent',\n\t'inspirational',\n\t'inspired',\n\t'inspiring',\n\t'instant',\n\t'instantaneous',\n\t'instinctive',\n\t'instinctual',\n\t'institutional',\n\t'instructive',\n\t'instrumental',\n\t'insubordinate',\n\t'insufferable',\n\t'insufficient',\n\t'insulted',\n\t'insulting',\n\t'insurable',\n\t'insurmountable',\n\t'intangible',\n\t'integral',\n\t'intellectual',\n\t'intelligent',\n\t'intelligible',\n\t'intended',\n\t'intense',\n\t'intensive',\n\t'intentional',\n\t'interactive',\n\t'interchangeable',\n\t'interdepartmental',\n\t'interdependent',\n\t'interested',\n\t'interesting',\n\t'interior',\n\t'intermediate',\n\t'intermittent',\n\t'internal',\n\t'international',\n\t'interpersonal',\n\t'interracial',\n\t'intestinal',\n\t'intimate',\n\t'intimidating',\n\t'intolerable',\n\t'intolerant',\n\t'intravenous',\n\t'intrepid',\n\t'intricate',\n\t'intrigued',\n\t'intriguing',\n\t'intrinsic',\n\t'introductory',\n\t'introspective',\n\t'introverted',\n\t'intrusive',\n\t'intuitive',\n\t'invalid',\n\t'invaluable',\n\t'invasive',\n\t'inventive',\n\t'invigorating',\n\t'invincible',\n\t'invisible',\n\t'invited',\n\t'inviting',\n\t'involuntary',\n\t'involved',\n\t'inward',\n\t'irascible',\n\t'irate',\n\t'iridescent',\n\t'irksome',\n\t'iron',\n\t'iron-fisted',\n\t'ironic',\n\t'irrational',\n\t'irreconcilable',\n\t'irrefutable',\n\t'irregular',\n\t'irrelative',\n\t'irrelevant',\n\t'irremovable',\n\t'irreparable',\n\t'irreplaceable',\n\t'irrepressible',\n\t'irresistible',\n\t'irresponsible',\n\t'irretrievably',\n\t'irreverent',\n\t'irreversible',\n\t'irrevocable',\n\t'irritable',\n\t'irritated',\n\t'irritating',\n\t'isolated',\n\t'itchy',\n\t'its',\n\t'itty-bitty',\n\t'jabbering',\n\t'jaded',\n\t'jagged',\n\t'jarring',\n\t'jaundiced',\n\t'jazzy',\n\t'jealous',\n\t'jeering',\n\t'jerky',\n\t'jiggling',\n\t'jittery',\n\t'jobless',\n\t'jocular',\n\t'joint',\n\t'jolly',\n\t'jovial',\n\t'joyful',\n\t'joyless',\n\t'joyous',\n\t'jubilant',\n\t'judgmental',\n\t'judicious',\n\t'juicy',\n\t'jumbled',\n\t'jumpy',\n\t'junior',\n\t'just',\n\t'justifiable',\n\t'juvenile',\n\t'kaput',\n\t'keen',\n\t'key',\n\t'kind',\n\t'kindhearted',\n\t'kindly',\n\t'kinesthetic',\n\t'kingly',\n\t'kitchen',\n\t'knavish',\n\t'knightly',\n\t'knobbed',\n\t'knobby',\n\t'knotty',\n\t'knowable',\n\t'knowing',\n\t'knowledgeable',\n\t'known',\n\t'labored',\n\t'laborious',\n\t'lackadaisical',\n\t'lacking',\n\t'lacy',\n\t'lame',\n\t'lamentable',\n\t'languid',\n\t'languishing',\n\t'lanky',\n\t'larcenous',\n\t'large',\n\t'larger',\n\t'largest',\n\t'lascivious',\n\t'last',\n\t'lasting',\n\t'late',\n\t'latent',\n\t'later',\n\t'lateral',\n\t'latest',\n\t'latter',\n\t'laudable',\n\t'laughable',\n\t'laughing',\n\t'lavish',\n\t'lawful',\n\t'lawless',\n\t'lax',\n\t'lazy',\n\t'lead',\n\t'leading',\n\t'lean',\n\t'learnable',\n\t'learned',\n\t'leased',\n\t'least',\n\t'leather',\n\t'leathery',\n\t'lecherous',\n\t'leering',\n\t'left',\n\t'left-handed',\n\t'legal',\n\t'legendary',\n\t'legible',\n\t'legislative',\n\t'legitimate',\n\t'lengthy',\n\t'lenient',\n\t'less',\n\t'lesser',\n\t'lesser-known',\n\t'less-qualified',\n\t'lethal',\n\t'lethargic',\n\t'level',\n\t'liable',\n\t'libelous',\n\t'liberal',\n\t'licensed',\n\t'life',\n\t'lifeless',\n\t'lifelike',\n\t'lifelong',\n\t'light',\n\t'light-blue',\n\t'lighthearted',\n\t'likable',\n\t'likeable',\n\t'likely',\n\t'like-minded',\n\t'lily-livered',\n\t'limber',\n\t'limited',\n\t'limitless',\n\t'limp',\n\t'limping',\n\t'linear',\n\t'lined',\n\t'lingering',\n\t'linguistic',\n\t'liquid',\n\t'listless',\n\t'literal',\n\t'literary',\n\t'literate',\n\t'lithe',\n\t'lithographic',\n\t'litigious',\n\t'little',\n\t'livable',\n\t'live',\n\t'lively',\n\t'livid',\n\t'living',\n\t'loathsome',\n\t'local',\n\t'locatable',\n\t'locked',\n\t'lofty',\n\t'logarithmic',\n\t'logical',\n\t'logistic',\n\t'lonely',\n\t'long',\n\t'longer',\n\t'longest',\n\t'longing',\n\t'long-term',\n\t'long-winded',\n\t'loose',\n\t'lopsided',\n\t'loquacious',\n\t'lordly',\n\t'lost',\n\t'loud',\n\t'lousy',\n\t'loutish',\n\t'lovable',\n\t'loveable',\n\t'lovely',\n\t'loving',\n\t'low',\n\t'low-calorie',\n\t'low-carb',\n\t'lower',\n\t'low-fat',\n\t'lowly',\n\t'low-maintenance',\n\t'low-ranking',\n\t'low-risk',\n\t'loyal',\n\t'lucent',\n\t'lucid',\n\t'lucky',\n\t'lucrative',\n\t'ludicrous',\n\t'lukewarm',\n\t'lulling',\n\t'luminescent',\n\t'luminous',\n\t'lumpy',\n\t'lurid',\n\t'luscious',\n\t'lush',\n\t'lustrous',\n\t'luxurious',\n\t'lying',\n\t'lyrical',\n\t'macabre',\n\t'Machiavellian',\n\t'macho',\n\t'mad',\n\t'maddening',\n\t'magenta',\n\t'magic',\n\t'magical',\n\t'magnanimous',\n\t'magnetic',\n\t'magnificent',\n\t'maiden',\n\t'main',\n\t'maintainable',\n\t'majestic',\n\t'major',\n\t'makeable',\n\t'makeshift',\n\t'maladjusted',\n\t'male',\n\t'malevolent',\n\t'malicious',\n\t'malignant',\n\t'malleable',\n\t'mammoth',\n\t'manageable',\n\t'managerial',\n\t'mandatory',\n\t'maneuverable',\n\t'mangy',\n\t'maniacal',\n\t'manic',\n\t'manicured',\n\t'manipulative',\n\t'man-made',\n\t'manual',\n\t'many,',\n\t'marbled',\n\t'marginal',\n\t'marked',\n\t'marketable',\n\t'married',\n\t'marvelous',\n\t'masked',\n\t'massive',\n\t'master',\n\t'masterful',\n\t'matchless',\n\t'material',\n\t'materialistic',\n\t'maternal',\n\t'mathematical',\n\t'matronly',\n\t'matted',\n\t'mature',\n\t'maximum',\n\t'meager',\n\t'mean',\n\t'meandering',\n\t'meaningful',\n\t'meaningless',\n\t'mean-spirited',\n\t'measly',\n\t'measurable',\n\t'meat-eating',\n\t'meaty',\n\t'mechanical',\n\t'medical',\n\t'medicinal',\n\t'meditative',\n\t'medium',\n\t'medium-rare',\n\t'meek',\n\t'melancholy',\n\t'mellow',\n\t'melodic',\n\t'melodious',\n\t'melodramatic',\n\t'melted',\n\t'memorable',\n\t'menacing',\n\t'menial',\n\t'mental',\n\t'merciful',\n\t'merciless',\n\t'mercurial',\n\t'mere',\n\t'merry',\n\t'messy',\n\t'metabolic',\n\t'metallic',\n\t'metaphoric',\n\t'meteoric',\n\t'meticulous',\n\t'microscopic',\n\t'microwaveable',\n\t'middle',\n\t'middle-class',\n\t'midweek',\n\t'mighty',\n\t'mild',\n\t'militant',\n\t'militaristic',\n\t'military',\n\t'milky',\n\t'mincing',\n\t'mind-bending',\n\t'mindful',\n\t'mindless',\n\t'mini',\n\t'miniature',\n\t'minimal',\n\t'minimum',\n\t'minor',\n\t'minute',\n\t'miraculous',\n\t'mirthful',\n\t'miscellaneous',\n\t'mischievous',\n\t'miscreant',\n\t'miserable',\n\t'miserly',\n\t'misguided',\n\t'misleading',\n\t'mission',\n\t'mistaken',\n\t'mistrustful',\n\t'mistrusting',\n\t'misty',\n\t'mixed',\n\t'mnemonic',\n\t'moaning',\n\t'mobile',\n\t'mocking',\n\t'moderate',\n\t'modern',\n\t'modest',\n\t'modified',\n\t'modular',\n\t'moist',\n\t'moldy',\n\t'momentary',\n\t'momentous',\n\t'monetary',\n\t'money-grubbing',\n\t'monopolistic',\n\t'monosyllabic',\n\t'monotone',\n\t'monotonous',\n\t'monstrous',\n\t'monumental',\n\t'moody',\n\t'moral',\n\t'moralistic',\n\t'morbid',\n\t'mordant',\n\t'more',\n\t'moronic',\n\t'morose',\n\t'mortal',\n\t'mortified',\n\t'most',\n\t'mother',\n\t'motherly',\n\t'motionless',\n\t'motivated',\n\t'motivating',\n\t'motivational',\n\t'motor',\n\t'mountain',\n\t'mountainous',\n\t'mournful',\n\t'mouthwatering',\n\t'movable',\n\t'moved',\n\t'moving',\n\t'much',\n\t'muddled',\n\t'muddy',\n\t'muffled',\n\t'muggy',\n\t'multicultural',\n\t'multifaceted',\n\t'multipurpose',\n\t'multitalented',\n\t'mumbled',\n\t'mundane',\n\t'municipal',\n\t'murky',\n\t'muscular',\n\t'mushy',\n\t'musical',\n\t'musky',\n\t'musty',\n\t'mutative',\n\t'mute',\n\t'muted',\n\t'mutinous',\n\t'muttering',\n\t'mutual',\n\t'my',\n\t'myopic',\n\t'mysterious',\n\t'mystic',\n\t'mystical',\n\t'mystified',\n\t'mystifying',\n\t'mythical',\n\t'naive',\n\t'nameless',\n\t'narcissistic',\n\t'narrow',\n\t'narrow-minded',\n\t'nasal',\n\t'nasty',\n\t'national',\n\t'native',\n\t'natural',\n\t'naughty',\n\t'nauseating',\n\t'nauseous',\n\t'nautical',\n\t'navigable',\n\t'navy-blue',\n\t'near',\n\t'nearby',\n\t'nearest',\n\t'nearsighted',\n\t'neat',\n\t'nebulous',\n\t'necessary',\n\t'needless',\n\t'needy',\n\t'nefarious',\n\t'negative',\n\t'neglected',\n\t'neglectful',\n\t'negligent',\n\t'negligible',\n\t'negotiable',\n\t'neighborly',\n\t'neither',\n\t'nerve-racking',\n\t'nervous',\n\t'neurological',\n\t'neurotic',\n\t'neutral',\n\t'new',\n\t'newest',\n\t'next',\n\t'next-door',\n\t'nice',\n\t'nifty',\n\t'nightmarish',\n\t'nimble',\n\t'nine',\n\t'ninth',\n\t'nippy',\n\t'no',\n\t'noble',\n\t'nocturnal',\n\t'noiseless',\n\t'noisy',\n\t'nominal',\n\t'nonabrasive',\n\t'nonaggressive',\n\t'nonchalant',\n\t'noncommittal',\n\t'noncompetitive',\n\t'nonconsecutive',\n\t'nondescript',\n\t'nondestructive',\n\t'nonexclusive',\n\t'nonnegotiable',\n\t'nonproductive',\n\t'nonrefundable',\n\t'nonrenewable',\n\t'nonresponsive',\n\t'nonrestrictive',\n\t'nonreturnable',\n\t'nonsensical',\n\t'nonspecific',\n\t'nonstop',\n\t'nontransferable',\n\t'nonverbal',\n\t'nonviolent',\n\t'normal',\n\t'north',\n\t'northeast',\n\t'northerly',\n\t'northwest',\n\t'nostalgic',\n\t'nosy',\n\t'notable',\n\t'noticeable',\n\t'notorious',\n\t'novel',\n\t'noxious',\n\t'null',\n\t'numb',\n\t'numberless',\n\t'numbing',\n\t'numerable',\n\t'numeric',\n\t'numerous',\n\t'nutritional',\n\t'nutritious',\n\t'nutty',\n\t'oafish',\n\t'obedient',\n\t'obeisant',\n\t'obese',\n\t'objectionable',\n\t'objective',\n\t'obligatory',\n\t'obliging',\n\t'oblique',\n\t'oblivious',\n\t'oblong',\n\t'obnoxious',\n\t'obscene',\n\t'obscure',\n\t'observable',\n\t'observant',\n\t'obsessive',\n\t'obsolete',\n\t'obstinate',\n\t'obstructive',\n\t'obtainable',\n\t'obtrusive',\n\t'obtuse',\n\t'obvious',\n\t'occasional',\n\t'occupational',\n\t'occupied',\n\t'oceanic',\n\t'odd',\n\t'odd-looking',\n\t'odiferous',\n\t'odious',\n\t'odorless',\n\t'odorous',\n\t'offbeat',\n\t'offensive',\n\t'offhanded',\n\t'official',\n\t'officious',\n\t'oily',\n\t'OK',\n\t'okay',\n\t'old',\n\t'older',\n\t'oldest',\n\t'old-fashioned',\n\t'ominous',\n\t'omniscient',\n\t'omnivorous',\n\t'one',\n\t'one-hour',\n\t'onerous',\n\t'one-sided',\n\t'only',\n\t'opaque',\n\t'open',\n\t'opened',\n\t'openhanded',\n\t'openhearted',\n\t'opening',\n\t'open-minded',\n\t'operable',\n\t'operatic',\n\t'operational',\n\t'operative',\n\t'opinionated',\n\t'opportune',\n\t'opportunistic',\n\t'opposable',\n\t'opposed',\n\t'opposing',\n\t'opposite',\n\t'oppressive',\n\t'optimal',\n\t'optimistic',\n\t'optional',\n\t'opulent',\n\t'oral',\n\t'orange',\n\t'ordinary',\n\t'organic',\n\t'organizational',\n\t'original',\n\t'ornamental',\n\t'ornate',\n\t'ornery',\n\t'orphaned',\n\t'orthopedic',\n\t'ossified',\n\t'ostentatious',\n\t'other',\n\t'otherwise',\n\t'our',\n\t'outer',\n\t'outermost',\n\t'outgoing',\n\t'outlandish',\n\t'outraged',\n\t'outrageous',\n\t'outside',\n\t'outspoken',\n\t'outstanding',\n\t'outward',\n\t'oval',\n\t'overactive',\n\t'overaggressive',\n\t'overall',\n\t'overambitious',\n\t'overassertive',\n\t'overbearing',\n\t'overcast',\n\t'overcautious',\n\t'overconfident',\n\t'overcritical',\n\t'overcrowded',\n\t'overemotional',\n\t'overenthusiastic',\n\t'overjoyed',\n\t'overoptimistic',\n\t'overpowering',\n\t'overpriced',\n\t'overprotective',\n\t'overqualified',\n\t'overrated',\n\t'oversensitive',\n\t'oversized',\n\t'overt',\n\t'overwhelmed',\n\t'overwhelming',\n\t'overworked',\n\t'overwrought',\n\t'overzealous',\n\t'own',\n\t'oxymoronic',\n\t'padded',\n\t'painful',\n\t'painless',\n\t'painstaking',\n\t'palatable',\n\t'palatial',\n\t'pale',\n\t'pallid',\n\t'palpable',\n\t'paltry',\n\t'pampered',\n\t'panicky',\n\t'panoramic',\n\t'paradoxical',\n\t'parallel',\n\t'paranormal',\n\t'parasitic',\n\t'parched',\n\t'pardonable',\n\t'parental',\n\t'parenthetic',\n\t'parking',\n\t'parsimonious',\n\t'partial',\n\t'particular',\n\t'partisan',\n\t'part-time',\n\t'party',\n\t'passing',\n\t'passionate',\n\t'passive',\n\t'past',\n\t'pastoral',\n\t'patched',\n\t'patchy',\n\t'patented',\n\t'paternal',\n\t'paternalistic',\n\t'pathetic',\n\t'pathological',\n\t'patient',\n\t'patriotic',\n\t'patronizing',\n\t'patterned',\n\t'payable',\n\t'peaceable',\n\t'peaceful',\n\t'peculiar',\n\t'pedantic',\n\t'pedestrian',\n\t'peerless',\n\t'peeved',\n\t'peevish',\n\t'penetrable',\n\t'penetrating',\n\t'pensive',\n\t'peppery',\n\t'perceivable',\n\t'perceptible',\n\t'perceptive',\n\t'perceptual',\n\t'peremptory',\n\t'perennial',\n\t'perfect',\n\t'perfumed',\n\t'perilous',\n\t'period',\n\t'periodic',\n\t'peripheral',\n\t'perishable',\n\t'perky',\n\t'permanent',\n\t'permeable',\n\t'permissible',\n\t'permissive',\n\t'pernicious',\n\t'perpendicular',\n\t'perpetual',\n\t'perplexed',\n\t'perplexing',\n\t'persevering',\n\t'persistent',\n\t'personable',\n\t'personal',\n\t'persuasive',\n\t'pert',\n\t'pertinent',\n\t'perturbed',\n\t'perturbing',\n\t'pervasive',\n\t'perverse',\n\t'pessimistic',\n\t'petite',\n\t'pettish',\n\t'petty',\n\t'petulant',\n\t'pharmaceutical',\n\t'phenomenal',\n\t'philanthropic',\n\t'philosophical',\n\t'phobic',\n\t'phonemic',\n\t'phonetic',\n\t'phosphorescent',\n\t'photographic',\n\t'physical',\n\t'physiological',\n\t'picturesque',\n\t'piercing',\n\t'pigheaded',\n\t'pink',\n\t'pious',\n\t'piquant',\n\t'pitch-dark',\n\t'pitch-perfect',\n\t'piteous',\n\t'pithy',\n\t'pitiful',\n\t'pitiless',\n\t'pivotal',\n\t'placid',\n\t'plaid',\n\t'plain',\n\t'plane',\n\t'planned',\n\t'plastic',\n\t'platonic',\n\t'plausible',\n\t'playful',\n\t'pleading',\n\t'pleasant',\n\t'pleased',\n\t'pleasing',\n\t'pleasurable',\n\t'plentiful',\n\t'pliable',\n\t'plodding',\n\t'plopping',\n\t'plucky',\n\t'plump',\n\t'pluralistic',\n\t'plus',\n\t'plush',\n\t'pneumatic',\n\t'poetic',\n\t'poignant',\n\t'pointless',\n\t'poised',\n\t'poisonous',\n\t'polished',\n\t'polite',\n\t'political',\n\t'polka-dotted',\n\t'polluted',\n\t'polyunsaturated',\n\t'pompous',\n\t'ponderous',\n\t'poor',\n\t'poorer',\n\t'poorest',\n\t'popping',\n\t'popular',\n\t'populous',\n\t'porous',\n\t'portable',\n\t'portly',\n\t'positive',\n\t'possessive',\n\t'possible',\n\t'posthoc',\n\t'posthumous',\n\t'postoperative',\n\t'potable',\n\t'potent',\n\t'potential',\n\t'powdery',\n\t'powerful',\n\t'powerless',\n\t'practical',\n\t'pragmatic',\n\t'praiseworthy',\n\t'precarious',\n\t'precious',\n\t'precipitous',\n\t'precise',\n\t'precocious',\n\t'preconceived',\n\t'predicative',\n\t'predictable',\n\t'predisposed',\n\t'predominant',\n\t'preeminent',\n\t'preemptive',\n\t'prefabricated',\n\t'preferable',\n\t'preferential',\n\t'pregnant',\n\t'prehistoric',\n\t'prejudiced',\n\t'prejudicial',\n\t'preliminary',\n\t'premature',\n\t'premeditated',\n\t'premium',\n\t'prenatal',\n\t'preoccupied',\n\t'preoperative',\n\t'preparative',\n\t'prepared',\n\t'preposterous',\n\t'prescriptive',\n\t'present',\n\t'presentable',\n\t'presidential',\n\t'pressing',\n\t'pressurized',\n\t'prestigious',\n\t'presumable',\n\t'presumptive',\n\t'presumptuous',\n\t'pretend',\n\t'pretentious',\n\t'pretty',\n\t'prevalent',\n\t'preventable',\n\t'preventative',\n\t'preventive',\n\t'previous',\n\t'priceless',\n\t'pricey',\n\t'prickly',\n\t'prim',\n\t'primary',\n\t'primitive',\n\t'primordial',\n\t'princely',\n\t'principal',\n\t'principled',\n\t'prior',\n\t'prissy',\n\t'pristine',\n\t'private',\n\t'prize',\n\t'prized',\n\t'proactive',\n\t'probabilistic',\n\t'probable',\n\t'problematic',\n\t'procedural',\n\t'prodigious',\n\t'productive',\n\t'profane',\n\t'professed',\n\t'professional',\n\t'professorial',\n\t'proficient',\n\t'profitable',\n\t'profound',\n\t'profuse',\n\t'programmable',\n\t'progressive',\n\t'prohibitive',\n\t'prolific',\n\t'prominent',\n\t'promised',\n\t'promising',\n\t'prompt',\n\t'pronounceable',\n\t'pronounced',\n\t'proof',\n\t'proper',\n\t'prophetic',\n\t'proportional',\n\t'proportionate',\n\t'proportioned',\n\t'prospective',\n\t'prosperous',\n\t'protective',\n\t'prototypical',\n\t'proud',\n\t'proverbial',\n\t'provisional',\n\t'provocative',\n\t'provoking',\n\t'proximal',\n\t'proximate',\n\t'prudent',\n\t'prudential',\n\t'prying',\n\t'psychedelic',\n\t'psychiatric',\n\t'psychological',\n\t'psychosomatic',\n\t'psychotic',\n\t'public',\n\t'puckish',\n\t'puffy',\n\t'pugnacious',\n\t'pumped',\n\t'punctual',\n\t'pungent',\n\t'punishable',\n\t'punitive',\n\t'puny',\n\t'pure',\n\t'purified',\n\t'puritanical',\n\t'purple',\n\t'purported',\n\t'purposeful',\n\t'purposeless',\n\t'purring',\n\t'pushy',\n\t'pusillanimous',\n\t'putrid',\n\t'puzzled',\n\t'puzzling',\n\t'pyrotechnic',\n\t'quackish',\n\t'quacky',\n\t'quaint',\n\t'qualified',\n\t'qualitative',\n\t'quality',\n\t'quantifiable',\n\t'quantitative',\n\t'quarrelsome',\n\t'queasy',\n\t'queenly',\n\t'querulous',\n\t'questionable',\n\t'quick',\n\t'quick-acting',\n\t'quick-drying',\n\t'quickest',\n\t'quick-minded',\n\t'quick-paced',\n\t'quick-tempered',\n\t'quick-thinking',\n\t'quick-witted',\n\t'quiet',\n\t'quintessential',\n\t'quirky',\n\t'quivering',\n\t'quizzical',\n\t'quotable',\n\t'rabid',\n\t'racial',\n\t'racist',\n\t'radiant',\n\t'radical',\n\t'radioactive',\n\t'ragged',\n\t'raging',\n\t'rainbowcolored',\n\t'rainy',\n\t'rakish',\n\t'rambling',\n\t'rambunctious',\n\t'rampageous',\n\t'rampant',\n\t'rancid',\n\t'rancorous',\n\t'random',\n\t'rank',\n\t'rapid',\n\t'rapid-fire',\n\t'rapturous',\n\t'rare',\n\t'rascally',\n\t'rash',\n\t'rasping',\n\t'raspy',\n\t'rational',\n\t'ratty',\n\t'ravenous',\n\t'raving',\n\t'ravishing',\n\t'raw',\n\t'razor-edged',\n\t'reactive',\n\t'ready',\n\t'real',\n\t'realistic',\n\t'reasonable',\n\t'reassured',\n\t'reassuring',\n\t'rebel',\n\t'rebellious',\n\t'receding',\n\t'recent',\n\t'receptive',\n\t'recessive',\n\t'rechargeable',\n\t'reciprocal',\n\t'reckless',\n\t'reclusive',\n\t'recognizable',\n\t'recognized',\n\t'rectangular',\n\t'rectifiable',\n\t'recurrent',\n\t'recyclable',\n\t'red',\n\t'red-blooded',\n\t'reddish',\n\t'redeemable',\n\t'redolent',\n\t'redundant',\n\t'referential',\n\t'refillable',\n\t'reflective',\n\t'refractive',\n\t'refreshing',\n\t'refundable',\n\t'refurbished',\n\t'refutable',\n\t'regal',\n\t'regional',\n\t'regretful',\n\t'regrettable',\n\t'regular',\n\t'reigning',\n\t'relatable',\n\t'relative',\n\t'relaxed',\n\t'relaxing',\n\t'relentless',\n\t'relevant',\n\t'reliable',\n\t'relieved',\n\t'religious',\n\t'reluctant',\n\t'remaining',\n\t'remarkable',\n\t'remedial',\n\t'reminiscent',\n\t'remorseful',\n\t'remorseless',\n\t'remote',\n\t'removable',\n\t'renegotiable',\n\t'renewable',\n\t'rented',\n\t'repairable',\n\t'repaired',\n\t'repeatable',\n\t'repeated',\n\t'repentant',\n\t'repetitious',\n\t'repetitive',\n\t'replaceable',\n\t'replicable',\n\t'reported',\n\t'reprehensible',\n\t'representative',\n\t'repressive',\n\t'reproachful',\n\t'reproductive',\n\t'republican',\n\t'repugnant',\n\t'repulsive',\n\t'reputable',\n\t'reputed',\n\t'rescued',\n\t'resealable',\n\t'resentful',\n\t'reserved',\n\t'resident',\n\t'residential',\n\t'residual',\n\t'resilient',\n\t'resolute',\n\t'resolvable',\n\t'resonant',\n\t'resounding',\n\t'resourceful',\n\t'respectable',\n\t'respectful',\n\t'respective',\n\t'responsible',\n\t'responsive',\n\t'rested',\n\t'restful',\n\t'restless',\n\t'restored',\n\t'restrained',\n\t'restrictive',\n\t'retired',\n\t'retroactive',\n\t'retrogressive',\n\t'retrospective',\n\t'reusable',\n\t'revamped',\n\t'revealing',\n\t'revengeful',\n\t'reverent',\n\t'reverential',\n\t'reverse',\n\t'reversible',\n\t'reviewable',\n\t'reviled',\n\t'revisable',\n\t'revised',\n\t'revocable',\n\t'revolting',\n\t'revolutionary',\n\t'rewarding',\n\t'rhetorical',\n\t'rhythmic',\n\t'rich',\n\t'richer',\n\t'richest',\n\t'ridiculing',\n\t'ridiculous',\n\t'right',\n\t'righteous',\n\t'rightful',\n\t'right-handed',\n\t'rigid',\n\t'rigorous',\n\t'ringing',\n\t'riotous',\n\t'ripe',\n\t'rippling',\n\t'risky',\n\t'ritualistic',\n\t'ritzy',\n\t'riveting',\n\t'roaring',\n\t'roasted',\n\t'robotic',\n\t'robust',\n\t'rocketing',\n\t'roguish',\n\t'romantic',\n\t'roomy',\n\t'rosy',\n\t'rotating',\n\t'rotten',\n\t'rotting',\n\t'rotund',\n\t'rough',\n\t'round',\n\t'roundtable',\n\t'rousing',\n\t'routine',\n\t'rowdy',\n\t'royal',\n\t'ruddy',\n\t'rude',\n\t'rudimentary',\n\t'rueful',\n\t'rugged',\n\t'ruined',\n\t'ruinous',\n\t'rumbling',\n\t'rumpled',\n\t'ruptured',\n\t'rural',\n\t'rusted',\n\t'rustic',\n\t'rustling',\n\t'rusty',\n\t'ruthless',\n\t'rutted',\n\t'saccharin',\n\t'sacred',\n\t'sacrificial',\n\t'sacrilegious',\n\t'sad',\n\t'saddened',\n\t'safe',\n\t'saintly',\n\t'salacious',\n\t'salient',\n\t'salt',\n\t'salted',\n\t'salty',\n\t'salvageable',\n\t'salvaged',\n\t'same',\n\t'sanctimonious',\n\t'sandy',\n\t'sane',\n\t'sanguine',\n\t'sanitary',\n\t'sappy',\n\t'sarcastic',\n\t'sardonic',\n\t'sassy',\n\t'satin',\n\t'satiny',\n\t'satiric',\n\t'satirical',\n\t'satisfactory',\n\t'satisfied',\n\t'satisfying',\n\t'saucy',\n\t'savage',\n\t'savory',\n\t'savvy',\n\t'scalding',\n\t'scaly',\n\t'scandalous',\n\t'scant',\n\t'scanty',\n\t'scarce',\n\t'scared',\n\t'scarred',\n\t'scary',\n\t'scathing',\n\t'scattered',\n\t'scenic',\n\t'scented',\n\t'scheduled',\n\t'schematic',\n\t'scholarly',\n\t'scholastic',\n\t'scientific',\n\t'scintillating',\n\t'scorching',\n\t'scornful',\n\t'scrabbled',\n\t'scraggly',\n\t'scrappy',\n\t'scratched',\n\t'scratchy',\n\t'scrawny',\n\t'screaming',\n\t'screeching',\n\t'scribbled',\n\t'scriptural',\n\t'scruffy',\n\t'scrumptious',\n\t'scrupulous',\n\t'sculpted',\n\t'sculptural',\n\t'scummy',\n\t'sea',\n\t'sealed',\n\t'seamless',\n\t'searching',\n\t'searing',\n\t'seasick',\n\t'seasonable',\n\t'seasonal',\n\t'secluded',\n\t'second',\n\t'secondary',\n\t'second-hand',\n\t'secret',\n\t'secretive',\n\t'secular',\n\t'secure',\n\t'secured',\n\t'sedate',\n\t'seditious',\n\t'seductive',\n\t'seedy',\n\t'seeming',\n\t'seemly',\n\t'seething',\n\t'seismic',\n\t'select',\n\t'selected',\n\t'selective',\n\t'self-absorbed',\n\t'self-aggrandizing',\n\t'self-assured',\n\t'self-centered',\n\t'self-confident',\n\t'self-directed',\n\t'self-disciplined',\n\t'self-effacing',\n\t'self-indulgent',\n\t'self-interested',\n\t'selfish',\n\t'selfless',\n\t'self-reliant',\n\t'self-respect',\n\t'self-satisfied',\n\t'sellable',\n\t'semiconscious',\n\t'semiofficial',\n\t'semiprecious',\n\t'semiprofessional',\n\t'senior',\n\t'sensational',\n\t'senseless',\n\t'sensible',\n\t'sensitive',\n\t'sensual',\n\t'sensuous',\n\t'sentimental',\n\t'separate',\n\t'sequential',\n\t'serendipitous',\n\t'serene',\n\t'serial',\n\t'serious',\n\t'serrated',\n\t'serviceable',\n\t'seven',\n\t'seventh',\n\t'several',\n\t'severe',\n\t'shabbiest',\n\t'shabby',\n\t'shaded',\n\t'shadowed',\n\t'shadowy',\n\t'shady',\n\t'shaggy',\n\t'shaky',\n\t'shallow',\n\t'shamefaced',\n\t'shameful',\n\t'shameless',\n\t'shapeless',\n\t'shapely',\n\t'sharp',\n\t'sharpened',\n\t'shattered',\n\t'shattering',\n\t'sheepish',\n\t'sheer',\n\t'sheltered',\n\t'shifty',\n\t'shimmering',\n\t'shining',\n\t'shiny',\n\t'shivering',\n\t'shivery',\n\t'shocked',\n\t'shocking',\n\t'shoddy',\n\t'short',\n\t'short-lived',\n\t'shortsighted',\n\t'short-tempered',\n\t'short-term',\n\t'showy',\n\t'shrewd',\n\t'shrieking',\n\t'shrill',\n\t'shut',\n\t'shy',\n\t'sick',\n\t'sickened',\n\t'sickening',\n\t'sickly',\n\t'side-splitting',\n\t'signed',\n\t'significant',\n\t'silent',\n\t'silky',\n\t'silly',\n\t'silver',\n\t'silver-tongued',\n\t'simian',\n\t'similar',\n\t'simple',\n\t'simpleminded',\n\t'simplified',\n\t'simplistic',\n\t'simultaneous',\n\t'sincere',\n\t'sinful',\n\t'single',\n\t'single-minded',\n\t'singular',\n\t'sinister',\n\t'sinuous',\n\t'sisterly',\n\t'six',\n\t'sixth',\n\t'sizable',\n\t'sizzling',\n\t'skeptical',\n\t'sketchy',\n\t'skilled',\n\t'skillful',\n\t'skimpy',\n\t'skin-deep',\n\t'skinny',\n\t'skittish',\n\t'sky-blue',\n\t'slanderous',\n\t'slanted',\n\t'slanting',\n\t'sleek',\n\t'sleeping',\n\t'sleepless',\n\t'sleepy',\n\t'slender',\n\t'slick',\n\t'slight',\n\t'slim',\n\t'slimy',\n\t'slippery',\n\t'sloped',\n\t'sloping',\n\t'sloppy',\n\t'slothful',\n\t'slow',\n\t'slow-moving',\n\t'sluggish',\n\t'slushy',\n\t'sly',\n\t'small',\n\t'smaller',\n\t'smallest',\n\t'small-minded',\n\t'small-scale',\n\t'small-time',\n\t'small-town',\n\t'smarmy',\n\t'smart',\n\t'smarter',\n\t'smartest',\n\t'smashing',\n\t'smeared',\n\t'smelly',\n\t'smiling',\n\t'smoggy',\n\t'smoked',\n\t'smoky',\n\t'smooth',\n\t'smothering',\n\t'smudged',\n\t'smug',\n\t'snapping',\n\t'snappish',\n\t'snappy',\n\t'snarling',\n\t'sneaky',\n\t'snide',\n\t'snippy',\n\t'snobbish',\n\t'snoopy',\n\t'snooty',\n\t'snoring',\n\t'snotty',\n\t'snow-white',\n\t'snug',\n\t'snuggly',\n\t'soaked',\n\t'soaking',\n\t'soakingwet',\n\t'soaring',\n\t'sober',\n\t'sociable',\n\t'social',\n\t'socialist',\n\t'sociological',\n\t'soft',\n\t'softhearted',\n\t'soggy',\n\t'solar',\n\t'soldierly',\n\t'sole',\n\t'solemn',\n\t'solicitous',\n\t'solid',\n\t'solitary',\n\t'somatic',\n\t'somber',\n\t'some,',\n\t'sonic',\n\t'sonly',\n\t'soothed',\n\t'soothing',\n\t'sophisticated',\n\t'sordid',\n\t'sore',\n\t'sorrowful',\n\t'sorry',\n\t'soulful',\n\t'soulless',\n\t'soundless',\n\t'sour',\n\t'south',\n\t'southeasterly',\n\t'southern',\n\t'southwestern',\n\t'spacious',\n\t'spare',\n\t'sparing',\n\t'sparkling',\n\t'sparkly',\n\t'sparse',\n\t'spasmodic',\n\t'spastic',\n\t'spatial',\n\t'spattered',\n\t'special',\n\t'specialist',\n\t'specialized',\n\t'specific',\n\t'speckled',\n\t'spectacular',\n\t'spectral',\n\t'speculative',\n\t'speechless',\n\t'speedy',\n\t'spellbinding',\n\t'spendthrift',\n\t'spherical',\n\t'spicy',\n\t'spiffy',\n\t'spiky',\n\t'spinal',\n\t'spineless',\n\t'spiral',\n\t'spiraled',\n\t'spirited',\n\t'spiritless',\n\t'spiritual',\n\t'spiteful',\n\t'splashing',\n\t'splashy',\n\t'splattered',\n\t'splendid',\n\t'splintered',\n\t'spoiled',\n\t'spoken',\n\t'spongy',\n\t'spontaneous',\n\t'spooky',\n\t'sporadic',\n\t'sporting',\n\t'sportsmanly',\n\t'spotless',\n\t'spotted',\n\t'spotty',\n\t'springy',\n\t'sprite',\n\t'spry',\n\t'spurious',\n\t'squalid',\n\t'squandered',\n\t'square',\n\t'squashed',\n\t'squashy',\n\t'squatting',\n\t'squawking',\n\t'squealing',\n\t'squeamish',\n\t'squeezable',\n\t'squiggly',\n\t'squirming',\n\t'squirrelly',\n\t'stable',\n\t'stackable',\n\t'stacked',\n\t'staggering',\n\t'stagnant',\n\t'stained',\n\t'stale',\n\t'stanch',\n\t'standard',\n\t'standing',\n\t'standoffish',\n\t'starched',\n\t'star-crossed',\n\t'stark',\n\t'startled',\n\t'startling',\n\t'starving',\n\t'stately',\n\t'static',\n\t'statistical',\n\t'statuesque',\n\t'status',\n\t'statutory',\n\t'staunch',\n\t'steadfast',\n\t'steady',\n\t'stealth',\n\t'steaming',\n\t'steamy',\n\t'steel',\n\t'steely',\n\t'steep',\n\t'stereophonic',\n\t'stereotyped',\n\t'stereotypical',\n\t'sterile',\n\t'stern',\n\t'sticky',\n\t'stiff',\n\t'stifled',\n\t'stifling',\n\t'stigmatic',\n\t'still',\n\t'stilled',\n\t'stilted',\n\t'stimulating',\n\t'stinging',\n\t'stingy',\n\t'stinking',\n\t'stinky',\n\t'stirring',\n\t'stock',\n\t'stodgy',\n\t'stoic',\n\t'stony',\n\t'stormy',\n\t'stout',\n\t'straggly',\n\t'straight',\n\t'straightforward',\n\t'stranded',\n\t'strange',\n\t'strategic',\n\t'streaked',\n\t'street',\n\t'strenuous',\n\t'stressful',\n\t'stretchy',\n\t'strict',\n\t'strident',\n\t'striking',\n\t'stringent',\n\t'striped',\n\t'strong',\n\t'stronger',\n\t'strongest',\n\t'structural',\n\t'stubborn',\n\t'stubby',\n\t'stuck-up',\n\t'studied',\n\t'studious',\n\t'stuffed',\n\t'stuffy',\n\t'stumbling',\n\t'stunned',\n\t'stunning',\n\t'stupendous',\n\t'sturdy',\n\t'stuttering',\n\t'stylish',\n\t'stylistic',\n\t'suave',\n\t'subconscious',\n\t'subdued',\n\t'subject',\n\t'subjective',\n\t'sublime',\n\t'subliminal',\n\t'submissive',\n\t'subordinate',\n\t'subsequent',\n\t'subservient',\n\t'substantial',\n\t'substantiated',\n\t'substitute',\n\t'subterranean',\n\t'subtitled',\n\t'subtle',\n\t'subversive',\n\t'successful',\n\t'successive',\n\t'succinct',\n\t'succulent',\n\t'such',\n\t'sudden',\n\t'suffering',\n\t'sufficient',\n\t'sugary',\n\t'suggestive',\n\t'suitable',\n\t'sulky',\n\t'sullen',\n\t'sumptuous',\n\t'sunny',\n\t'super',\n\t'superabundant',\n\t'superb',\n\t'supercilious',\n\t'superficial',\n\t'superhuman',\n\t'superior',\n\t'superlative',\n\t'supernatural',\n\t'supersensitive',\n\t'supersonic',\n\t'superstitious',\n\t'supple',\n\t'supportive',\n\t'supposed',\n\t'suppressive',\n\t'supreme',\n\t'sure',\n\t'sure-footed',\n\t'surgical',\n\t'surly',\n\t'surmountable',\n\t'surprised',\n\t'surprising',\n\t'surrealistic',\n\t'survivable',\n\t'susceptible',\n\t'suspected',\n\t'suspicious',\n\t'sustainable',\n\t'swaggering',\n\t'swanky',\n\t'swaying',\n\t'sweaty',\n\t'sweeping',\n\t'sweet',\n\t'sweltering',\n\t'swift',\n\t'swimming',\n\t'swinish',\n\t'swishing',\n\t'swollen',\n\t'swooping',\n\t'syllabic',\n\t'syllogistic',\n\t'symbiotic',\n\t'symbolic',\n\t'symmetrical',\n\t'sympathetic',\n\t'symptomatic',\n\t'synergistic',\n\t'synonymous',\n\t'syntactic',\n\t'synthetic',\n\t'systematic',\n\t'taboo',\n\t'tacit',\n\t'tacky',\n\t'tactful',\n\t'tactical',\n\t'tactless',\n\t'tactual',\n\t'tainted',\n\t'take-charge',\n\t'talented',\n\t'talkative',\n\t'tall',\n\t'taller',\n\t'tallest',\n\t'tame',\n\t'tamed',\n\t'tan',\n\t'tangential',\n\t'tangible',\n\t'tangled',\n\t'tangy',\n\t'tanned',\n\t'tantalizing',\n\t'tapered',\n\t'tardy',\n\t'targeted',\n\t'tarnished',\n\t'tart',\n\t'tasteful',\n\t'tasteless',\n\t'tasty',\n\t'tattered',\n\t'taunting',\n\t'taut',\n\t'taxing',\n\t'teachable',\n\t'tearful',\n\t'tearing',\n\t'teasing',\n\t'technical',\n\t'technological',\n\t'tectonic',\n\t'tedious',\n\t'teenage',\n\t'teensy',\n\t'teeny',\n\t'teeny-tiny',\n\t'telegraphic',\n\t'telekinetic',\n\t'telepathic',\n\t'telephonic',\n\t'telescopic',\n\t'telling',\n\t'temperamental',\n\t'temperate',\n\t'tempestuous',\n\t'temporary',\n\t'tempted',\n\t'tempting',\n\t'ten',\n\t'tenable',\n\t'tenacious',\n\t'tender',\n\t'tenderhearted',\n\t'ten-minute',\n\t'tense',\n\t'tentative',\n\t'tenth',\n\t'tenuous',\n\t'tepid',\n\t'terminal',\n\t'terrestrial',\n\t'terrible',\n\t'terrific',\n\t'terrified',\n\t'terrifying',\n\t'territorial',\n\t'terse',\n\t'tested',\n\t'testy',\n\t'tetchy',\n\t'textual',\n\t'textural',\n\t'thankful',\n\t'thankless',\n\t'that',\n\t'the',\n\t'theatrical',\n\t'their',\n\t'thematic',\n\t'theological',\n\t'theoretical',\n\t'therapeutic',\n\t'thermal',\n\t'these',\n\t'thick',\n\t'thievish',\n\t'thin',\n\t'thinkable',\n\t'third',\n\t'thirsty',\n\t'this',\n\t'thorny',\n\t'thorough',\n\t'those',\n\t'thoughtful',\n\t'thoughtless',\n\t'thrashed',\n\t'threatened',\n\t'threatening',\n\t'three',\n\t'thriftless',\n\t'thrifty',\n\t'thrilled',\n\t'thrilling',\n\t'throbbing',\n\t'thumping',\n\t'thundering',\n\t'thunderous',\n\t'ticking',\n\t'tickling',\n\t'ticklish',\n\t'tidal',\n\t'tidy',\n\t'tight',\n\t'tightfisted',\n\t'time',\n\t'timeless',\n\t'timely',\n\t'timid',\n\t'timorous',\n\t'tiny',\n\t'tipsy',\n\t'tired',\n\t'tireless',\n\t'tiresome',\n\t'tiring',\n\t'tolerable',\n\t'tolerant',\n\t'tonal',\n\t'tone-deaf',\n\t'toneless',\n\t'toothsome',\n\t'toothy',\n\t'top',\n\t'topical',\n\t'topographical',\n\t'tormented',\n\t'torpid',\n\t'torrential',\n\t'torrid',\n\t'torturous',\n\t'total',\n\t'touched',\n\t'touching',\n\t'touchy',\n\t'tough',\n\t'towering',\n\t'toxic',\n\t'traditional',\n\t'tragic',\n\t'trainable',\n\t'trained',\n\t'training',\n\t'traitorous',\n\t'tranquil',\n\t'transcendent',\n\t'transcendental',\n\t'transformational',\n\t'transformative',\n\t'transformed',\n\t'transient',\n\t'transitional',\n\t'transitory',\n\t'translucent',\n\t'transparent',\n\t'transplanted',\n\t'trapped',\n\t'trashed',\n\t'trashy',\n\t'traumatic',\n\t'treacherous',\n\t'treasonable',\n\t'treasonous',\n\t'treasured',\n\t'treatable',\n\t'tremendous',\n\t'tremulous',\n\t'trenchant',\n\t'trendy',\n\t'triangular',\n\t'tribal',\n\t'trick',\n\t'tricky',\n\t'trim',\n\t'tripping',\n\t'trite',\n\t'triumphant',\n\t'trivial',\n\t'tropical',\n\t'troubled',\n\t'troublesome',\n\t'troubling',\n\t'truculent',\n\t'true',\n\t'trusted',\n\t'trustful',\n\t'trusting',\n\t'trustworthy',\n\t'trusty',\n\t'truthful',\n\t'trying',\n\t'tumultuous',\n\t'tuneful',\n\t'tuneless',\n\t'turbulent',\n\t'twinkling',\n\t'twinkly',\n\t'twisted',\n\t'twitchy',\n\t'two',\n\t'typical',\n\t'tyrannical',\n\t'tyrannous',\n\t'ubiquitous',\n\t'ugly',\n\t'ultimate',\n\t'ultraconservative',\n\t'ultrasensitive',\n\t'ultrasonic',\n\t'ultraviolet',\n\t'unabashed',\n\t'unabated',\n\t'unable',\n\t'unacceptable',\n\t'unaccompanied',\n\t'unaccountable',\n\t'unaccustomed',\n\t'unacknowledged',\n\t'unadorned',\n\t'unadulterated',\n\t'unadventurous',\n\t'unadvised',\n\t'unaffected',\n\t'unaffordable',\n\t'unafraid',\n\t'unaggressive',\n\t'unaided',\n\t'unalienable',\n\t'unalterable',\n\t'unaltered',\n\t'unambiguous',\n\t'unanimous',\n\t'unannounced',\n\t'unanswerable',\n\t'unanticipated',\n\t'unapologetic',\n\t'unappealing',\n\t'unappetizing',\n\t'unappreciative',\n\t'unapproachable',\n\t'unashamed',\n\t'unassailable',\n\t'unassertive',\n\t'unassisted',\n\t'unattached',\n\t'unattainable',\n\t'unattractive',\n\t'unauthorized',\n\t'unavailable',\n\t'unavailing',\n\t'unavoidable',\n\t'unbalanced',\n\t'unbearable',\n\t'unbeatable',\n\t'unbeaten',\n\t'unbecoming',\n\t'unbelievable',\n\t'unbelieving',\n\t'unbendable',\n\t'unbending',\n\t'unbiased',\n\t'unblemished',\n\t'unblinking',\n\t'unblushing',\n\t'unbounded',\n\t'unbreakable',\n\t'unbridled',\n\t'uncanny',\n\t'uncaring',\n\t'unceasing',\n\t'unceremonious',\n\t'uncertain',\n\t'unchangeable',\n\t'unchanging',\n\t'uncharacteristic',\n\t'uncharitable',\n\t'uncharted',\n\t'uncivil',\n\t'uncivilized',\n\t'unclassified',\n\t'unclean',\n\t'uncluttered',\n\t'uncomely',\n\t'uncomfortable',\n\t'uncommitted',\n\t'uncommon',\n\t'uncommunicative',\n\t'uncomplaining',\n\t'uncomprehending',\n\t'uncompromising',\n\t'unconcerned',\n\t'unconditional',\n\t'unconfirmed',\n\t'unconquerable',\n\t'unconscionable',\n\t'unconscious',\n\t'unconstitutional',\n\t'unconstrained',\n\t'unconstructive',\n\t'uncontainable',\n\t'uncontrollable',\n\t'unconventional',\n\t'unconvinced',\n\t'unconvincing',\n\t'uncooked',\n\t'uncooperative',\n\t'uncoordinated',\n\t'uncouth',\n\t'uncovered',\n\t'uncreative',\n\t'uncritical',\n\t'undamaged',\n\t'undated',\n\t'undaunted',\n\t'undeclared',\n\t'undefeated',\n\t'undefined',\n\t'undemocratic',\n\t'undeniable',\n\t'undependable',\n\t'underdeveloped',\n\t'underfunded',\n\t'underhanded',\n\t'underprivileged',\n\t'understandable',\n\t'understanding',\n\t'understated',\n\t'understood',\n\t'undeserved',\n\t'undesirable',\n\t'undetected',\n\t'undeterred',\n\t'undeveloped',\n\t'undeviating',\n\t'undifferentiated',\n\t'undignified',\n\t'undiminished',\n\t'undiplomatic',\n\t'undisciplined',\n\t'undiscovered',\n\t'undisguised',\n\t'undisputed',\n\t'undistinguished',\n\t'undivided',\n\t'undoubted',\n\t'unearthly',\n\t'uneasy',\n\t'uneducated',\n\t'unemotional',\n\t'unemployed',\n\t'unencumbered',\n\t'unending',\n\t'unendurable',\n\t'unenforceable',\n\t'unenthusiastic',\n\t'unenviable',\n\t'unequal',\n\t'unequaled',\n\t'unequivocal',\n\t'unerring',\n\t'uneven',\n\t'uneventful',\n\t'unexceptional',\n\t'unexcited',\n\t'unexpected',\n\t'unexplainable',\n\t'unexplored',\n\t'unexpressive',\n\t'unfailing',\n\t'unfair',\n\t'unfaithful',\n\t'unfaltering',\n\t'unfamiliar',\n\t'unfashionable',\n\t'unfathomable',\n\t'unfavorable',\n\t'unfeeling',\n\t'unfettered',\n\t'unfilled',\n\t'unflagging',\n\t'unflappable',\n\t'unflattering',\n\t'unflinching',\n\t'unfocused',\n\t'unforeseeable',\n\t'unforgettable',\n\t'unforgivable',\n\t'unforgiving',\n\t'unfortunate',\n\t'unfriendly',\n\t'unfulfilled',\n\t'ungallant',\n\t'ungenerous',\n\t'ungentlemanly',\n\t'unglamorous',\n\t'ungraceful',\n\t'ungracious',\n\t'ungrateful',\n\t'unguarded',\n\t'unhandsome',\n\t'unhappy',\n\t'unharmed',\n\t'unhealthy',\n\t'unheated',\n\t'unheeded',\n\t'unhelpful',\n\t'unhesitating',\n\t'unhurried',\n\t'uniform',\n\t'unilateral',\n\t'unimaginable',\n\t'unimaginative',\n\t'unimpeachable',\n\t'unimpeded',\n\t'unimpressive',\n\t'unincorporated',\n\t'uninformed',\n\t'uninhabitable',\n\t'uninhibited',\n\t'uninitiated',\n\t'uninjured',\n\t'uninspired',\n\t'uninsurable',\n\t'unintelligent',\n\t'unintelligible',\n\t'unintended',\n\t'unintentional',\n\t'uninterested',\n\t'uninterrupted',\n\t'uninvited',\n\t'unique',\n\t'united',\n\t'universal',\n\t'unjust',\n\t'unjustifiable',\n\t'unkempt',\n\t'unkind',\n\t'unknowing',\n\t'unknown',\n\t'unlawful',\n\t'unlicensed',\n\t'unlikable',\n\t'unlikely',\n\t'unlivable',\n\t'unloved',\n\t'unlucky',\n\t'unmanageable',\n\t'unmanly',\n\t'unmanned',\n\t'unmarketable',\n\t'unmasked',\n\t'unmatched',\n\t'unmemorable',\n\t'unmentionable',\n\t'unmerciful',\n\t'unmistakable',\n\t'unmitigated',\n\t'unmodified',\n\t'unmotivated',\n\t'unnatural',\n\t'unnecessary',\n\t'unnerved',\n\t'unnerving',\n\t'unnoticeable',\n\t'unobserved',\n\t'unobtainable',\n\t'unobtrusive',\n\t'unofficial',\n\t'unopened',\n\t'unopposed',\n\t'unorthodox',\n\t'unostentatious',\n\t'unpalatable',\n\t'unpardonable',\n\t'unpersuasive',\n\t'unperturbed',\n\t'unplanned',\n\t'unpleasant',\n\t'unprecedented',\n\t'unpredictable',\n\t'unpretentious',\n\t'unprincipled',\n\t'unproductive',\n\t'unprofessional',\n\t'unprofitable',\n\t'unpromising',\n\t'unpronounceable',\n\t'unprovoked',\n\t'unqualified',\n\t'unquantifiable',\n\t'unquenchable',\n\t'unquestionable',\n\t'unquestioned',\n\t'unquestioning',\n\t'unraveled',\n\t'unreachable',\n\t'unreadable',\n\t'unrealistic',\n\t'unrealized',\n\t'unreasonable',\n\t'unreceptive',\n\t'unrecognizable',\n\t'unrecognized',\n\t'unredeemable',\n\t'unregulated',\n\t'unrelenting',\n\t'unreliable',\n\t'unremarkable',\n\t'unremitting',\n\t'unrepentant',\n\t'unrepresentative',\n\t'unrepresented',\n\t'unreserved',\n\t'unrespectable',\n\t'unresponsive',\n\t'unrestrained',\n\t'unripe',\n\t'unrivaled',\n\t'unromantic',\n\t'unruffled',\n\t'unruly',\n\t'unsafe',\n\t'unsalvageable',\n\t'unsatisfactory',\n\t'unsatisfied',\n\t'unscheduled',\n\t'unscholarly',\n\t'unscientific',\n\t'unscrupulous',\n\t'unseasonable',\n\t'unseemly',\n\t'unselfish',\n\t'unsettled',\n\t'unsettling',\n\t'unshakable',\n\t'unshapely',\n\t'unsightly',\n\t'unsigned',\n\t'unsinkable',\n\t'unskilled',\n\t'unsociable',\n\t'unsolicited',\n\t'unsolvable',\n\t'unsolved',\n\t'unsophisticated',\n\t'unsound',\n\t'unsparing',\n\t'unspeakable',\n\t'unspoiled',\n\t'unstable',\n\t'unstated',\n\t'unsteady',\n\t'unstoppable',\n\t'unstressed',\n\t'unstructured',\n\t'unsubstantial',\n\t'unsubstantiated',\n\t'unsuccessful',\n\t'unsuitable',\n\t'unsuited',\n\t'unsupervised',\n\t'unsupported',\n\t'unsure',\n\t'unsurpassable',\n\t'unsurpassed',\n\t'unsurprising',\n\t'unsuspected',\n\t'unsuspecting',\n\t'unsustainable',\n\t'unsympathetic',\n\t'unsystematic',\n\t'untainted',\n\t'untamable',\n\t'untamed',\n\t'untapped',\n\t'untenable',\n\t'untested',\n\t'unthinkable',\n\t'unthinking',\n\t'untidy',\n\t'untimely',\n\t'untitled',\n\t'untouchable',\n\t'untraditional',\n\t'untrained',\n\t'untried',\n\t'untroubled',\n\t'untrustworthy',\n\t'untruthful',\n\t'unused',\n\t'unusual',\n\t'unverified',\n\t'unwary',\n\t'unwashed',\n\t'unwatchable',\n\t'unwavering',\n\t'unwholesome',\n\t'unwieldy',\n\t'unwilling',\n\t'unwise',\n\t'unwitting',\n\t'unworkable',\n\t'unworldly',\n\t'unworthy',\n\t'unwritten',\n\t'unyielding',\n\t'upbeat',\n\t'upmost',\n\t'upper',\n\t'uppity',\n\t'upright',\n\t'uproarious',\n\t'upset',\n\t'upsetting',\n\t'upstairs',\n\t'uptight',\n\t'up-to-date',\n\t'up-to-the-minute',\n\t'upward',\n\t'urbane',\n\t'urgent',\n\t'usable',\n\t'used',\n\t'useful',\n\t'useless',\n\t'usual',\n\t'utilitarian',\n\t'utopian',\n\t'utter',\n\t'uttermost',\n\t'vacant',\n\t'vacillating',\n\t'vacuous',\n\t'vagabond',\n\t'vagrant',\n\t'vague',\n\t'vain',\n\t'valiant',\n\t'valid',\n\t'valorous',\n\t'valuable',\n\t'vanishing',\n\t'vapid',\n\t'vaporous',\n\t'variable',\n\t'varied',\n\t'various',\n\t'varying',\n\t'vast',\n\t'vegetable',\n\t'vegetarian',\n\t'vegetative',\n\t'vehement',\n\t'velvety',\n\t'venal',\n\t'venerable',\n\t'vengeful',\n\t'venomous',\n\t'venturesome',\n\t'venturous',\n\t'veracious',\n\t'verbal',\n\t'verbose',\n\t'verdant',\n\t'verifiable',\n\t'verified',\n\t'veritable',\n\t'vernacular',\n\t'versatile',\n\t'versed',\n\t'vertical',\n\t'very',\n\t'vexed',\n\t'vexing',\n\t'viable',\n\t'vibrant',\n\t'vibrating',\n\t'vicarious',\n\t'vicious',\n\t'victorious',\n\t'vigilant',\n\t'vigorous',\n\t'vile',\n\t'villainous',\n\t'vindictive',\n\t'vinegary',\n\t'violent',\n\t'violet',\n\t'viperous',\n\t'viral',\n\t'virtual',\n\t'virtuous',\n\t'virulent',\n\t'visceral',\n\t'viscous',\n\t'visible',\n\t'visionary',\n\t'visual',\n\t'vital',\n\t'vitriolic',\n\t'vivacious',\n\t'vivid',\n\t'vocal',\n\t'vocational',\n\t'voiceless',\n\t'volatile',\n\t'volcanic',\n\t'voluminous',\n\t'voluntary',\n\t'voluptuous',\n\t'voracious',\n\t'vulgar',\n\t'vulnerable',\n\t'wacky',\n\t'wailing',\n\t'waiting',\n\t'wakeful',\n\t'wandering',\n\t'wanting',\n\t'wanton',\n\t'warlike',\n\t'warm',\n\t'warmest',\n\t'warning',\n\t'warring',\n\t'wary',\n\t'waspish',\n\t'waste',\n\t'wasted',\n\t'wasteful',\n\t'watchful',\n\t'waterlogged',\n\t'waterproof',\n\t'watertight',\n\t'watery',\n\t'wavering',\n\t'wax',\n\t'waxen',\n\t'weak',\n\t'weakened',\n\t'weak-willed',\n\t'wealthy',\n\t'wearisome',\n\t'weary',\n\t'wee',\n\t'weedy',\n\t'week-long',\n\t'weekly',\n\t'weightless',\n\t'weighty',\n\t'weird',\n\t'welcoming',\n\t'well',\n\t'well-adjusted',\n\t'well-argued',\n\t'well-aware',\n\t'well-balanced',\n\t'well-behaved',\n\t'well-built',\n\t'well-conceived',\n\t'well-considered',\n\t'well-crafted',\n\t'well-deserved',\n\t'well-developed',\n\t'well-done',\n\t'well-dressed',\n\t'well-educated',\n\t'well-equipped',\n\t'well-established',\n\t'well-founded',\n\t'well-groomed',\n\t'well-heeled',\n\t'well-honed',\n\t'well-informed',\n\t'well-intentioned',\n\t'well-kempt',\n\t'well-known',\n\t'well-liked',\n\t'well-lit',\n\t'well-made',\n\t'well-maintained',\n\t'well-mannered',\n\t'well-meaning',\n\t'well-off',\n\t'well-placed',\n\t'well-planned',\n\t'well-prepared',\n\t'well-qualified',\n\t'well-read',\n\t'well-received',\n\t'well-rounded',\n\t'well-spoken',\n\t'well-suited',\n\t'well-thought-of',\n\t'well-thought-out',\n\t'well-to-do',\n\t'well-traveled',\n\t'well-used',\n\t'well-versed',\n\t'well-worn',\n\t'well-written',\n\t'west',\n\t'western',\n\t'wet',\n\t'what',\n\t'wheezing',\n\t'which',\n\t'whimpering',\n\t'whimsical',\n\t'whining',\n\t'whispering',\n\t'whistling',\n\t'white',\n\t'whole',\n\t'wholehearted',\n\t'wholesale',\n\t'wholesome',\n\t'whooping',\n\t'whopping',\n\t'whose',\n\t'wicked',\n\t'wide',\n\t'wide-eyed',\n\t'wide-ranging',\n\t'widespread',\n\t'wiggly',\n\t'wild',\n\t'willful',\n\t'willing',\n\t'wily',\n\t'windy',\n\t'winning',\n\t'winsome',\n\t'winter',\n\t'wintery',\n\t'wiry',\n\t'wise',\n\t'wishful',\n\t'wispy',\n\t'wistful',\n\t'withering',\n\t'witless',\n\t'witty',\n\t'wizardly',\n\t'wobbly',\n\t'woeful',\n\t'wolfish',\n\t'wonderful',\n\t'wondrous',\n\t'wonted',\n\t'wood',\n\t'wooden',\n\t'wooing',\n\t'wool',\n\t'woolen',\n\t'woozy',\n\t'wordless',\n\t'wordy',\n\t'work',\n\t'workable',\n\t'working',\n\t'work-oriented',\n\t'worldly',\n\t'worn',\n\t'worndown',\n\t'wornout',\n\t'worried',\n\t'worrisome',\n\t'worrying',\n\t'worse',\n\t'worshipful',\n\t'worst',\n\t'worth',\n\t'worthless',\n\t'worthwhile',\n\t'worthy',\n\t'wounding',\n\t'wrathful',\n\t'wrenching',\n\t'wretched',\n\t'wriggling',\n\t'wriggly',\n\t'wrinkled',\n\t'wrinkly',\n\t'written',\n\t'wrong',\n\t'wrongful',\n\t'wry',\n\t'yawning',\n\t'yearly',\n\t'yearning',\n\t'yellow',\n\t'yelping',\n\t'yielding',\n\t'young',\n\t'younger',\n\t'youngest',\n\t'youthful',\n\t'yummy',\n\t'zany',\n\t'zealous',\n\t'zestful',\n\t'zesty',\n\t'zippy',\n\t'zonked',\n\t'zoological',\n];\n\nexport const maxStringLength = 22;\n"
  },
  {
    "path": "drizzle-seed/src/datasets/cityNames.ts",
    "content": "/**\n * The original source for cities names data was taken from https://www.kaggle.com/datasets/juanmah/world-cities\n * We've excluded a few countries and their cities from this list because we don't think they should ever appear in any list\n */\nexport default [\n\t'Humpata',\n\t'Qunghirot',\n\t'Erdek',\n\t'Asenovgrad',\n\t'Payyoli',\n\t'Pidhorodne',\n\t'Clawson',\n\t'Kala Diara',\n\t'Kadan',\n\t'Tumut',\n\t'Bayat',\n\t'Gangoli',\n\t'Nuqui',\n\t'Lochau',\n\t'Albignasego',\n\t'Narayanganj',\n\t'Novo Lino',\n\t'Regeneracao',\n\t'Belvedere Marittimo',\n\t'Santana de Parnaiba',\n\t'Miyako',\n\t'Aniche',\n\t'Andrijevica',\n\t'Buggenhout',\n\t'Kurikka',\n\t'Milanowek',\n\t'Liaquatpur',\n\t'Khamaria',\n\t'Jora Khurd',\n\t'Petal',\n\t'Pak Tin Pa',\n\t'Xiantangcun',\n\t'Bovingdon',\n\t'Lianmuqin Kancun',\n\t'Sainte-Maxime',\n\t'Campinorte',\n\t'Vammanal',\n\t'Yabelo',\n\t'Wani',\n\t'Kaita',\n\t'Monkey Bay',\n\t'Ianapera',\n\t'Mariestad',\n\t'Bukomansimbi',\n\t'Kavaje',\n\t'Amahai',\n\t'Luis Alves',\n\t'Altmunster',\n\t'Spring Lake',\n\t'Niemasson',\n\t'Douala',\n\t'Naranjos',\n\t'Madhubani',\n\t'Atotonilco el Alto',\n\t'Palmar de Varela',\n\t'Hanerik',\n\t'Wadhraf',\n\t'Terre Neuve',\n\t'Libungan',\n\t'Mattigiri',\n\t'Prieto Diaz',\n\t'Barjora',\n\t'Kagamino',\n\t'Pakokku',\n\t'Bol',\n\t'Prienai',\n\t'Tan Phong',\n\t'Kali',\n\t'Rauenberg',\n\t'Chios',\n\t'Jerico',\n\t\"Qal'acha\",\n\t'Biwong',\n\t'Albi',\n\t'Plantation',\n\t'Nargund',\n\t'Yamakita',\n\t'Ghota Fatehgarh',\n\t'Vredenburg',\n\t'Sherman',\n\t'Penal',\n\t'Varkaus',\n\t'Zhongwei',\n\t'Miri',\n\t'Guarapuava',\n\t'Bolszewo',\n\t'Park Forest Village',\n\t'Cianjur',\n\t'Kempsey',\n\t'Guaraci',\n\t'Odorheiu Secuiesc',\n\t'Alytus',\n\t'Mulanje',\n\t'Evinayong',\n\t'Bukkapatnam',\n\t'Berd',\n\t'Kisaran',\n\t'Bitung',\n\t'Selcuk',\n\t'Xikeng',\n\t'Cantanhede',\n\t'Pasuquin',\n\t'Steinheim am der Murr',\n\t'Mahem',\n\t'Gloria',\n\t'Benbrook',\n\t'Beforona',\n\t'Borken',\n\t'Ouled Rahmoun',\n\t'Pedras de Maria da Cruz',\n\t'Al Fuhays',\n\t'Titiribi',\n\t'Kien Luong',\n\t'Shediac',\n\t'Villasanta',\n\t'Guelph',\n\t'Duzkoy',\n\t'Narkher',\n\t'Tateyama',\n\t'Penzance',\n\t'Pasay City',\n\t'San Lucas Sacatepequez',\n\t'Skardu',\n\t'Maharajapuram',\n\t'Al `Asharah',\n\t'Tanant',\n\t'Kawaguchi',\n\t'Madhuban Bediban',\n\t'Bridge City',\n\t'Greenbelt',\n\t'Iara',\n\t'Baton Rouge',\n\t'Yopal',\n\t'Moribila',\n\t'Ciudad-Rodrigo',\n\t'Madira',\n\t'Bobonong',\n\t'Fort Hood',\n\t'Amboasary',\n\t'Sostanj',\n\t'Fnidq',\n\t'Vikasnagar',\n\t'Yangping',\n\t'Arraias',\n\t'Goslar',\n\t'Shuixi',\n\t'Lagoa da Canoa',\n\t'Baiersbronn',\n\t'Forest',\n\t'Sedavi',\n\t'Kosonsoy',\n\t'Trelleborg',\n\t'Bucheya',\n\t'Kidricevo',\n\t'Gokulgarh',\n\t'Coswig',\n\t'Marechal Taumaturgo',\n\t'Sidi Akkacha',\n\t'Kouarfa',\n\t'Finspang',\n\t'Timberlane',\n\t'Colotenango',\n\t'Puerto Ayora',\n\t'Goytapa',\n\t'Tarlapalli',\n\t'Acandi',\n\t'General Luna',\n\t'Calamba',\n\t'Miqiao',\n\t'Linxia Chengguanzhen',\n\t'Nizamabad',\n\t'Doria Sonapur',\n\t'Chongoroi',\n\t'Oskaloosa',\n\t'Prevalje',\n\t'Lubang',\n\t'Ladispoli',\n\t'Coite do Noia',\n\t'Sarjapur',\n\t'Panuco',\n\t'Jendouba',\n\t'Nayakanhatti',\n\t\"'Ain Mouilah\",\n\t'Chapeco',\n\t'Stanton',\n\t'Balve',\n\t'Libante',\n\t'Etah',\n\t'Yarim',\n\t'Litchfield Beach',\n\t'Tsingoni',\n\t'Kendall Park',\n\t'Karkala',\n\t'Vlaardingen',\n\t'Torrente',\n\t'Periyanegamam',\n\t'Senhor do Bonfim',\n\t'Fleet',\n\t'Geita',\n\t'Chettipalaiyam',\n\t'New Washington',\n\t'Vlore',\n\t'San Juan Ermita',\n\t'Lagonglong',\n\t'Shwebo',\n\t'Hattiesburg',\n\t'Mering',\n\t'Basibasy',\n\t'Sarahs',\n\t'Nadendla',\n\t'Palaiyam',\n\t'Porto de Pedras',\n\t'Porto Novo',\n\t'Westampton',\n\t'Oriximina',\n\t'Al Jaghbub',\n\t'Hajjah',\n\t'Cutler Bay',\n\t'Toyokawa',\n\t'Tehuipango',\n\t'Catabola',\n\t'Ivanic-Grad',\n\t'Caudete',\n\t'Del Rio',\n\t'Clarence-Rockland',\n\t'Morrisville',\n\t'Divisopolis',\n\t'Chigasaki',\n\t'West Auckland',\n\t'Suzu',\n\t'Blythe',\n\t'Khunti',\n\t'Putussibau',\n\t'Ourikela',\n\t'Ambano',\n\t'Calpe',\n\t'Ambohitralanana',\n\t'Longjin',\n\t'Sao Filipe',\n\t'San Jose de Gracia',\n\t'Bura',\n\t'Ziarat',\n\t'Termoli',\n\t'Vohindava',\n\t'Xinbu',\n\t'Biliaivka',\n\t'Sahneh',\n\t'Rutherglen',\n\t'Naolinco de Victoria',\n\t'Windlesham',\n\t'Manchester',\n\t'Orinda',\n\t'South Yarmouth',\n\t'Tabaco',\n\t'Kayseri',\n\t'Ibiapina',\n\t'Murcia',\n\t'Swieqi',\n\t'Valencia',\n\t'Chirala',\n\t'Eloxochitlan',\n\t'Dembeni',\n\t'Fardis',\n\t'Misaki',\n\t'Nagar',\n\t'Miyajima',\n\t'Brikama',\n\t'Umurlu',\n\t'Brierley Hill',\n\t'Khodabandeh',\n\t'Ozgon',\n\t'Reze',\n\t'Tinajeros',\n\t'Novomyrhorod',\n\t'Fully',\n\t'Biak',\n\t'Colider',\n\t'Kashiwara',\n\t'Sjenica',\n\t'Hednesford',\n\t'Madukkarai',\n\t'Villaflores',\n\t'Chiautla de Tapia',\n\t'Taormina',\n\t'Huwei',\n\t'Seiyo',\n\t'Washim',\n\t'Benton',\n\t'Venturina',\n\t'Kakalur',\n\t'Andamooka',\n\t'Anghad',\n\t'West Hempfield',\n\t'Turnhout',\n\t'Markkleeberg',\n\t'Poko',\n\t'Wealdstone',\n\t'Ban Na Pa',\n\t'Cerklje na Gorenjskem',\n\t'Bombon',\n\t'Arimalam',\n\t'Jangy-Kyshtak',\n\t'Isny im Allgau',\n\t'Braga',\n\t'Kawadgaon',\n\t'Bonate di Sopra',\n\t'Tonneins',\n\t'Munagala',\n\t'Chinna Mushidivada',\n\t'Talagutong',\n\t'Neihuzhai',\n\t'Agua de Dios',\n\t'Herceg Novi',\n\t\"Nerk'in Getashen\",\n\t'Botucatu',\n\t'Arroio do Meio',\n\t'Villafranca del Panades',\n\t'Madikeri',\n\t'Serik',\n\t'San Sebastian Huehuetenango',\n\t'Kyzyl-Adyr',\n\t'Somarasampettai',\n\t'Surmene',\n\t'Turbana',\n\t'Chilas',\n\t'Marinette',\n\t'The Hammocks',\n\t'McPherson',\n\t'General MacArthur',\n\t'Strasbourg',\n\t'Tibana',\n\t'Polatli',\n\t'Sur',\n\t'Lye',\n\t'West Carson',\n\t'Uludere',\n\t'Moroni',\n\t'Mata de Sao Joao',\n\t'Pachmir',\n\t'Saskatoon',\n\t'Nina Rodrigues',\n\t'Chinnakkavundanur',\n\t'Norton Shores',\n\t'Abu',\n\t'Santo Angelo',\n\t'Pianezza',\n\t'Wythenshawe',\n\t'Mabeskraal',\n\t'Fort Drum',\n\t'Gobindpur',\n\t'Kostopil',\n\t'Calca',\n\t'Nonkon',\n\t'Kolno',\n\t'Tati',\n\t'Glastonbury',\n\t'Itakura',\n\t'Payyanadam',\n\t'Puerto Caimito',\n\t'Thionville',\n\t'Wezep',\n\t'Llandudno',\n\t'Antequera',\n\t'Camp Perrin',\n\t'Sao Luis do Paraitinga',\n\t'Kabatas',\n\t'Volta Redonda',\n\t'Beni Mered',\n\t'Kaffrine',\n\t'Reutlingen',\n\t'Fort Morgan',\n\t'Naucalpan de Juarez',\n\t'Ebo',\n\t'Dargaz',\n\t'Vina del Mar',\n\t'Ilam',\n\t'Kyzyl-Suu',\n\t'Perinton',\n\t'Nenmini',\n\t'La Mirada',\n\t'Sumbe',\n\t'Jicin',\n\t'Indian Trail',\n\t'Nova Bassano',\n\t'Batam Centre',\n\t'Tocache Nuevo',\n\t'Tambaram',\n\t'Kikugawa',\n\t'Sari',\n\t'Borca',\n\t'Beja',\n\t'Feltre',\n\t'Godo',\n\t'Oshawa',\n\t'German Flatts',\n\t'Schaffhausen',\n\t'Albino',\n\t'Wejherowo',\n\t'Plav',\n\t'Beccar',\n\t'Pitsea',\n\t'Lauro de Freitas',\n\t'Gogrial',\n\t'Ferros',\n\t'Tipp City',\n\t'Waynesboro',\n\t'Khost',\n\t'Golungo Alto',\n\t'Tamesis',\n\t'Almondbury',\n\t'Bernardo de Irigoyen',\n\t'Vairampatti',\n\t'Neiafu',\n\t'Everswinkel',\n\t'Garden Acres',\n\t'Yufu',\n\t'Coxim',\n\t'Dilra',\n\t'Guwahati',\n\t'Tan Phu',\n\t\"Khairpur Mir's\",\n\t'Poza Rica de Hidalgo',\n\t'Trancoso',\n\t'Koytendag',\n\t'At Tafilah',\n\t'Ranohira',\n\t'Legionowo',\n\t'Romitan Shahri',\n\t'The Villages',\n\t'Carroll',\n\t'Mogi Mirim',\n\t'Mo i Rana',\n\t'San Miguel Duenas',\n\t'Dardoq',\n\t'Abaetetuba',\n\t'New Milford',\n\t'Palda',\n\t'Tsinjomitondraka',\n\t'Pisz',\n\t'Otaru',\n\t'Caldas Novas',\n\t'Pampanito',\n\t'Panuco de Coronado',\n\t'Lanyi',\n\t'Mayoyao',\n\t'Tlagasana',\n\t'Chetouane',\n\t'Grand-Popo',\n\t'Nagaoki',\n\t'Chong Nonsi',\n\t'Emmiganur',\n\t'Looc',\n\t'Vila Muriqui',\n\t'Frattamaggiore',\n\t'Ormoz',\n\t'Goynucek',\n\t'Arles',\n\t'Laungowal',\n\t'Jalhay',\n\t'Wan Tau Tong',\n\t'Villa Angela',\n\t'Mariyammanahalli',\n\t'Pivka',\n\t'Firmat',\n\t'Patsanda',\n\t'Colle Salvetti',\n\t'Gyula',\n\t'Valparai',\n\t'Issaquah',\n\t'Jeronimo Monteiro',\n\t'Bugasong',\n\t'Broxbourne',\n\t'Tsundupalle',\n\t'Jacupiranga',\n\t'San Juan Ixcoy',\n\t'Ambatomirahavavy',\n\t'Lanco',\n\t'Monsenhor Gil',\n\t'Sabaa Aiyoun',\n\t'Narnaul',\n\t'Carutapera',\n\t'Altay',\n\t'Ambodiampana',\n\t'Kouvola',\n\t'Harahan',\n\t'Paoskoto',\n\t'Vargem Grande Paulista',\n\t'Schwarzenbruck',\n\t'Bellheim',\n\t'Oak Ridge',\n\t'Chimaltenango',\n\t'Issaba',\n\t'Tiri',\n\t'Taroudannt',\n\t'Nonahi',\n\t'Ranquitte',\n\t'Tala Yfassene',\n\t'Meybod',\n\t'Muchamiel',\n\t'Antohobe',\n\t'Axochiapan',\n\t'Malakanagiri',\n\t'Whitchurch',\n\t'Lake in the Hills',\n\t'San Mateo del Mar',\n\t'Curuzu Cuatia',\n\t'Schweizer-Reineke',\n\t'Babusnica',\n\t'Montgomeryville',\n\t'Gundugolanu',\n\t'Abi al Khasib',\n\t'Pillanallur',\n\t'Soulei',\n\t'Ayas',\n\t'Azuqueca de Henares',\n\t'Chodov',\n\t'Mingjiujie',\n\t'Patar',\n\t'Porto Murtinho',\n\t'Jafra',\n\t'El Progreso',\n\t'Rulin',\n\t'Penetanguishene',\n\t'Ban Khek Noi',\n\t'Tubao',\n\t'Calw',\n\t'Gaundra',\n\t'Nasik',\n\t'Gaolingcun',\n\t'Kalol',\n\t'Meadowbrook',\n\t'Kidapawan',\n\t'Rudsar',\n\t'Maddaloni',\n\t'Kabul',\n\t'Karlskoga',\n\t'Yazd',\n\t'Podalakur',\n\t'Asakura',\n\t'Teranikallu',\n\t'Keokuk',\n\t'Uyuni',\n\t'Yorosso',\n\t'Pfaffikon',\n\t'Arniquet',\n\t'Kyzyl-Kyshtak',\n\t'Kambur',\n\t'Mburucuya',\n\t'Mingacevir',\n\t'Zvolen',\n\t'Cabaceiras do Paraguacu',\n\t'Tamworth',\n\t'Guantanamo',\n\t'Darregueira',\n\t'Ezequiel Montes',\n\t'Fomboni',\n\t'Quintanar de la Orden',\n\t'Siachoque',\n\t'Kericho',\n\t'Mineral de Angangueo',\n\t'Peka',\n\t'Fenglin',\n\t'Quetzaltenango',\n\t'Sevanagala',\n\t'Port Pirie',\n\t'Tengyue',\n\t'Novoyavorovskoye',\n\t'Forli',\n\t'Suchitoto',\n\t'Hosdurga',\n\t'Arcoverde',\n\t'Vale de Cambra',\n\t'San Pablo Atlazalpan',\n\t'Hockenheim',\n\t'Dandu Mailaram',\n\t'Tadjmout',\n\t'Port of Spain',\n\t'Nanaimo',\n\t'Colonia del Sol',\n\t'Primeiro de Maio',\n\t'Valletta',\n\t'Horishni Plavni',\n\t'Kingswood',\n\t'Furstenwalde',\n\t'Grosse Pointe Farms',\n\t'Bang Kruai',\n\t'Haiger',\n\t'Chansolme',\n\t'Xiaoganzhan',\n\t'Mulaikkaraippatti',\n\t'Nandazhang',\n\t'Hambuhren',\n\t'Medellin',\n\t'Canapolis',\n\t'Corozal',\n\t'Bignona',\n\t'Nova Vodolaha',\n\t'Shedbal',\n\t'Maojiatang',\n\t'Greentree',\n\t'Mahayag',\n\t'Rajendranagar',\n\t'Guararema',\n\t'Pirane',\n\t'Tall Dhahab',\n\t'Sipoo',\n\t'Aiquile',\n\t'Kish',\n\t'Taltal',\n\t'Kushmanchi',\n\t'Santa Genoveva de Docordo',\n\t'Tapiales',\n\t'Yunak',\n\t'Floirac',\n\t'Parbata',\n\t'Zhangzhengqiao',\n\t'Zossen',\n\t'Caselle Torinese',\n\t'Zaliohouan',\n\t'Waldkirchen',\n\t'Sao Jose da Coroa Grande',\n\t'Pasinler',\n\t'Gaspe',\n\t'Soubakaniedougou',\n\t'Nabire',\n\t'Sieyik',\n\t'Sao Jose de Piranhas',\n\t'Gioia del Colle',\n\t'Villanueva de Arosa',\n\t'Marihatag',\n\t'Daugavpils',\n\t'Saint Helens',\n\t'Jiannan',\n\t'Gross Kreutz',\n\t'Ganapathivattam',\n\t'Santiago de Cuba',\n\t'Katanning',\n\t'Marotolana',\n\t'Dingzhou',\n\t'Spoleto',\n\t'San Agustin Chahal',\n\t'Calheta de Sao Miguel',\n\t'Aragua de Barcelona',\n\t'Vammala',\n\t'Sao Goncalo do Amarante',\n\t'Shahba',\n\t'Cornedo Vicentino',\n\t'Kew Green',\n\t'Kuzuculu',\n\t'Tobati',\n\t'Currais Novos',\n\t'Mounds View',\n\t'Wetzlar',\n\t'Nesoddtangen',\n\t'Bosilovo',\n\t'Marolambo',\n\t'Horodyshche',\n\t'Aleksandrow Kujawski',\n\t'Sao Jose do Cedro',\n\t'Dhabauli',\n\t'Macka',\n\t'Oelsnitz',\n\t'Kiambu',\n\t'Mugutkhan Hubli',\n\t'Jalkaura',\n\t\"Bo'ao\",\n\t'Emmiganuru',\n\t'Manglur',\n\t'Shenmu',\n\t'Kerch',\n\t'Paluan',\n\t'Jaguaribe',\n\t'Palmeira dos Indios',\n\t'Zorgo',\n\t'Chagne',\n\t'Ugrinovci',\n\t'Feuchtwangen',\n\t'Mitake',\n\t'Pacora',\n\t\"Rui'an\",\n\t'West Hanover',\n\t'Buca',\n\t'Sam Son',\n\t'Matsuyama',\n\t'Gouka',\n\t'Tuchin',\n\t'Tonantins',\n\t'Narangba',\n\t'Inami',\n\t'Wolf Trap',\n\t'Kumharsan',\n\t'Gundi',\n\t'Rubiera',\n\t'Balia',\n\t'Estarreja',\n\t'Golkoy',\n\t'Nordestina',\n\t'Dattapulia',\n\t'Wapienica',\n\t'Unao',\n\t'Vasterhaninge',\n\t'Wenxian Chengguanzhen',\n\t'Hanover Park',\n\t'Urrugne',\n\t'San Antonio Ilotenango',\n\t'San Vicente dels Horts',\n\t\"Sao Miguel d'Oeste\",\n\t'Caerfyrddin',\n\t'Sidi Rahhal',\n\t'Olongapo',\n\t'Jasol',\n\t'Castelnuovo Rangone',\n\t'Don Benito',\n\t'Thung Song',\n\t'Zhanibek',\n\t'Male',\n\t'Anpachi',\n\t'Buford',\n\t'Kwekwe',\n\t'Urmston',\n\t'Fernan-Nunez',\n\t'Rio das Ostras',\n\t'Zhmerynka',\n\t'Shahrud',\n\t'Las Lomitas',\n\t'Curuca',\n\t'Ar Ramadi',\n\t'Jamundi',\n\t'Skalica',\n\t'Taixing',\n\t'Huron',\n\t'Basse-Goulaine',\n\t'Arteche',\n\t'Roxbury',\n\t'Nawnghkio',\n\t'Terryville',\n\t'Eastlake',\n\t'Guarabira',\n\t'Zionsville',\n\t'Yala',\n\t'Os',\n\t'Tuquerres',\n\t'Zlatograd',\n\t'Harnai',\n\t'Cherukara',\n\t'Numancia',\n\t'Negotino',\n\t'Sparta',\n\t'Buzen',\n\t'Karuvelampatti',\n\t'Monte San Pietro',\n\t'Rosario do Catete',\n\t'Thamaga',\n\t'Johnstown',\n\t'Manaira',\n\t'Zabrat',\n\t'Tebourba',\n\t'Cornelius',\n\t'Al Mu`addamiyah',\n\t'Epinal',\n\t'Haria',\n\t'Surrey',\n\t'Tarapoto',\n\t'Morecambe',\n\t'Maribojoc',\n\t'Savda',\n\t'Calbiga',\n\t'Ayodhyapattanam',\n\t'Dulmen',\n\t'Porteirinha',\n\t'Armstrong',\n\t'Darton',\n\t'Poco Redondo',\n\t'Yoboki',\n\t'Maevka',\n\t'Pihra',\n\t'Nong Khae',\n\t'Mascoutah',\n\t'Ukrainka',\n\t'Ivrea',\n\t'Vadavalam',\n\t'Huaraz',\n\t'Gjakove',\n\t'Penablanca',\n\t'Lishuping',\n\t'Kiso',\n\t'Guaranda',\n\t'Palliman',\n\t'Rawtenstall',\n\t'Atchampeta',\n\t'Tarazona de Aragon',\n\t'Vincent',\n\t'Longtang',\n\t'Muragacha',\n\t'Gwadar',\n\t'Aguilas',\n\t'Karttigappalli',\n\t'Rahway',\n\t'Churi',\n\t'Leini',\n\t'Ragan Sur',\n\t'Hongliuwan',\n\t'Bayang',\n\t'Plattsburgh',\n\t'Anagni',\n\t'Gidan Ider',\n\t'Ait Bouchta',\n\t'Sidi Abdelkader',\n\t'Salaverry',\n\t\"Ma'erkang\",\n\t'Niena',\n\t'Santamaguluru',\n\t'Buxtehude',\n\t'Ugep',\n\t'Zelezniki',\n\t'Emmendingen',\n\t'Monforte de Lemos',\n\t'Tourza',\n\t'Rivalta di Torino',\n\t'Orange Cove',\n\t'Bijbiara',\n\t'Jardim do Serido',\n\t'Kajaani',\n\t'Barros Cassal',\n\t'Shengang',\n\t'Candido de Abreu',\n\t'Ashdod',\n\t'Bhit Bhagwanpur',\n\t'Sajoszentpeter',\n\t'Ambolotarakely',\n\t'Viota',\n\t'Muskegon',\n\t'Hanau',\n\t'Madhupur',\n\t'Popesti-Leordeni',\n\t'Coyhaique',\n\t'Hojai',\n\t'Nehe',\n\t'Maddagiri',\n\t'Bodrum',\n\t'Mountain View',\n\t'Tash-Komur',\n\t'Cili',\n\t'Kristianstad',\n\t'Pehuajo',\n\t'Jam',\n\t'Frederickson',\n\t'Aywaille',\n\t'Heule',\n\t'Kasungu',\n\t'Koge',\n\t'Mukdahan',\n\t'Dialakoroba',\n\t'Les Sorinieres',\n\t'Al Kiswah',\n\t'Dongxiaozhai',\n\t'Mirandela',\n\t'Mochizuki',\n\t'Hanumantanpatti',\n\t'Bregenz',\n\t'Kongjiazhuangcun',\n\t'Xianxi',\n\t'Kovin',\n\t'Konan',\n\t'La Serena',\n\t'Menomonie',\n\t'Zemmouri',\n\t'Nakagusuku',\n\t'Gharbara',\n\t'Oro-Medonte',\n\t'Qiloane',\n\t'Larantuka',\n\t'Nonoai',\n\t'Silvarpatti',\n\t'Kharagbani',\n\t'Nghia Lo',\n\t'Kissimmee',\n\t'Higuey',\n\t'Susques',\n\t'Pyalakurti',\n\t'Sleaford',\n\t'Barranco de Loba',\n\t'Rattihalli',\n\t'Standish',\n\t'Holyoke',\n\t'Nettadahalli',\n\t'Torrejon de la Calzada',\n\t'Nidzica',\n\t'Sovata',\n\t'Ilha Solteira',\n\t'Rampur Khajuriya',\n\t'Pappinissheri',\n\t'Sint Willebrord',\n\t'Benito Soliven',\n\t\"Sek'ot'a\",\n\t'Jhang City',\n\t'Vadakkanandal',\n\t'Kolo',\n\t'Montecorvino Rovella',\n\t'Mancio Lima',\n\t'Kashkar-Kyshtak',\n\t'Mohania',\n\t'Kochgawan',\n\t'Honiara',\n\t'Brejoes',\n\t'Krasnyy Yar',\n\t'Otrokovice',\n\t'Saidpur',\n\t'Nainijor',\n\t'Jhanjharpur',\n\t'Yarm',\n\t'Caransebes',\n\t'Santa Teresa del Tuy',\n\t'Banate',\n\t'Altadena',\n\t'Sihu',\n\t'Velten',\n\t'San Pablo',\n\t'Chbar Mon',\n\t'Baraderes',\n\t'Baraon',\n\t'Telsang',\n\t'Saint Budeaux',\n\t'Candelaria',\n\t'Silva Jardim',\n\t'Udburu',\n\t'Mastic',\n\t'Itapora',\n\t'Iklin',\n\t'Vlasotince',\n\t'Svay Pak',\n\t'Havelock North',\n\t'Kalipatnam',\n\t'Mozarlandia',\n\t'Kamarhati',\n\t'Strehaia',\n\t'Joshimath',\n\t'Bridgnorth',\n\t'Batticaloa',\n\t'Pallisa',\n\t'Coronel Dorrego',\n\t'Chelmek',\n\t'Hinthada',\n\t'Nola',\n\t'Little Rock',\n\t'New Braunfels',\n\t'Havre',\n\t'Lavezares',\n\t'Lamphun',\n\t'Karajgi',\n\t'Maheshram',\n\t'Rangasamudram',\n\t'Cuango',\n\t'Tonse East',\n\t'Morlanwelz-Mariemont',\n\t'Otavalo',\n\t'Nerkunram',\n\t'Jaque',\n\t'Okha',\n\t'Bhamo',\n\t'Gadabay',\n\t'Timbauba',\n\t'Andapafito',\n\t'Punta Umbria',\n\t'Vanj',\n\t'Kun Puhal',\n\t'Timmendorfer Strand',\n\t'Pau dos Ferros',\n\t'Matsuzaka',\n\t'Columbus',\n\t'Putina',\n\t'Kotdwara',\n\t'Tagana-an',\n\t'Ajdovscina',\n\t'Siegen',\n\t'Sangin',\n\t'Bihpuriagaon',\n\t'Biswanath Chariali',\n\t'Chiva',\n\t'Paszto',\n\t'Ban Wang Daeng',\n\t'Karlsfeld',\n\t'El Alamo',\n\t'Lelystad',\n\t'Chand Chaur',\n\t'Nioaque',\n\t'Yargatti',\n\t'Hilzingen',\n\t'Ayvacik',\n\t'Suceava',\n\t'Padova',\n\t'Carneys Point',\n\t'Winkfield',\n\t'Absecon',\n\t'Guntakal Junction',\n\t'Bhadwar',\n\t'Iwaka',\n\t'San Pedro de Lloc',\n\t'Key Largo',\n\t'Monterotondo',\n\t'Al Hillah',\n\t'Zaouia Ait Ishak',\n\t'Floriana',\n\t'Ubajara',\n\t'Ouled Fayet',\n\t'Novo Cruzeiro',\n\t'Selwyn',\n\t'Phitsanulok',\n\t'Amarzgane',\n\t'Punakha',\n\t'Liperi',\n\t'Biblis',\n\t'Pavlodar',\n\t'Salalah',\n\t'Tysvaer',\n\t'Yapqan',\n\t'Vetapalem',\n\t'Baisari',\n\t'Boryeong',\n\t'Dhanauli',\n\t'Atenco',\n\t'Little Chute',\n\t'Mimasaka',\n\t'Champapur',\n\t'Itamonte',\n\t'Marple',\n\t'El Callao',\n\t'Whanganui',\n\t'Korschenbroich',\n\t'Zhuqi',\n\t'Asfarvarin',\n\t'Kodayattur',\n\t'Yozyovon',\n\t'Thompson',\n\t'Wingles',\n\t'Karliova',\n\t'Radyvyliv',\n\t'Mollendo',\n\t'Jagdalpur',\n\t'Nandgaon',\n\t'Toyono',\n\t'Gryfino',\n\t'Ventspils',\n\t'Sibiti',\n\t'Shishi',\n\t'Lulhaul',\n\t'Bhalpatti',\n\t'Norman',\n\t'Halesowen',\n\t'Al Midhnab',\n\t'Viroflay',\n\t'Nether Providence',\n\t'Anglet',\n\t'Seven Corners',\n\t'Kurort Steinbach-Hallenberg',\n\t'Eden Prairie',\n\t'Firestone',\n\t'Shanywathit',\n\t'North Wantagh',\n\t'Grenzach-Wyhlen',\n\t'Chiari',\n\t'Keningau',\n\t'Miranda do Corvo',\n\t'Tenambakkam',\n\t'Tilburg',\n\t'Budipuram',\n\t'Nallamada',\n\t'San Giovanni la Punta',\n\t'Middle',\n\t'Nanzhai',\n\t'Castelfiorentino',\n\t'Mont-Royal',\n\t'Khasbalanda',\n\t'Zirara',\n\t'Carluke',\n\t'Kawatana',\n\t'Idangansalai',\n\t'Mandi',\n\t'Sabanitas',\n\t'Balangir',\n\t'Phillipsburg',\n\t'Poniatowa',\n\t'Jizzax',\n\t'Corumbaiba',\n\t'Sampues',\n\t'Muynoq',\n\t'Valga',\n\t'Daharia',\n\t'Mundakkal',\n\t'Qarqin',\n\t'Gandu',\n\t'Los Vilos',\n\t'Arkonam',\n\t'Kananya',\n\t'South Middleton',\n\t'Devsar',\n\t'Kamin-Kashyrskyi',\n\t'Hauterive',\n\t'Raitar',\n\t'Swords',\n\t'Elche',\n\t'Shakhtinsk',\n\t'Meadow Woods',\n\t'Kadiapattanam',\n\t'Sherrelwood',\n\t'Altamura',\n\t'Bloomingdale',\n\t'Hesperia',\n\t'Marathon',\n\t'Sogndal',\n\t'Timberlake',\n\t'Upper Gwynedd',\n\t'Saint-Andre-de-Cubzac',\n\t'Chelmsford',\n\t'Udaipur Bithwar',\n\t'Provins',\n\t'Prievidza',\n\t'Loiyo',\n\t'Dabou',\n\t'Kastav',\n\t'Vellarivalli',\n\t'Orchards',\n\t'Summerfield',\n\t'Ilidza',\n\t'Badiadka',\n\t'Ypsilanti',\n\t'Warsaw',\n\t'Randers',\n\t'Aqtobe',\n\t'Rosendael',\n\t'New Paltz',\n\t'Port Neches',\n\t'Cranford',\n\t'Hadamar',\n\t'Bergenfield',\n\t'Orland Park',\n\t'Ba Chuc',\n\t'Fomento',\n\t'Tegueste',\n\t'Omagh',\n\t'Maria Pinto',\n\t'Ban Suan',\n\t'Cuernavaca',\n\t'Leominster',\n\t'Eidsvold',\n\t'Sohtha',\n\t'Todi',\n\t'Choszczno',\n\t'Yamato',\n\t'Lengquancun',\n\t'Sultanpur Mazra',\n\t'Boumalne',\n\t'Manises',\n\t'Xiaoli',\n\t'Zolochiv',\n\t'Pyapon',\n\t'Lake Ronkonkoma',\n\t'Hasselt',\n\t'El Minie',\n\t'Ambinanindovoka',\n\t'Trittau',\n\t'Mulavur',\n\t'Loyish Shaharchasi',\n\t'Bembereke',\n\t'Antratsyt',\n\t'Sayalkudi',\n\t'Chorrocho',\n\t'Ipiau',\n\t'Pembroke Pines',\n\t'Palghar',\n\t'Frodsham',\n\t'Sullana',\n\t'Sunamganj',\n\t'Finike',\n\t'Qiryat Mozqin',\n\t'Correia Pinto',\n\t'Macheng',\n\t'Ban Du',\n\t'Agde',\n\t'Santa Quiteria',\n\t'Voyenno-Antonovka',\n\t'Kapellen',\n\t'An Chau',\n\t'Valera',\n\t'Glen Parva',\n\t'Mahikeng',\n\t'Gland',\n\t'Northallerton',\n\t'Su-ngai Kolok',\n\t'Ash Shaykhan',\n\t'Roztoky',\n\t'Kokomo',\n\t'Duren',\n\t'Iver',\n\t'Campanha',\n\t'Befody',\n\t'Vaisampakkal',\n\t'Ucar',\n\t'Janesville',\n\t'Aksehir',\n\t'Buur Gaabo',\n\t'Ouled Fares',\n\t'Eseka',\n\t'Cossimbazar',\n\t'Abingdon',\n\t'Andrychow',\n\t'Calimesa',\n\t'Manati',\n\t'Hannoversch Munden',\n\t'Nalakadoddi',\n\t'Xiaoba',\n\t'Suo-Oshima',\n\t'Beaver Dam',\n\t'Oulad Ouchchih',\n\t'Analavory',\n\t'Lopez Jaena',\n\t'Midland',\n\t'Zhongbu',\n\t'Tarrytown',\n\t'Brighton',\n\t'Vannes',\n\t'Rajgir',\n\t'Kuppam',\n\t'Kottakota',\n\t'Onesti',\n\t'Massa',\n\t'Sebastian',\n\t'Benahavis',\n\t'Gigmoto',\n\t'Probolinggo',\n\t'Valkenswaard',\n\t'Momostenango',\n\t'Det Udom',\n\t'Myrza-Ake',\n\t'Bou Saada',\n\t'Maur Kalan',\n\t'Cholargos',\n\t'Senglea',\n\t'Baranzate',\n\t'Point Fortin',\n\t'Wutiancun',\n\t'South Whittier',\n\t'Tiran',\n\t'Fitchburg',\n\t'Eyvan',\n\t'Burbaliq',\n\t'Heanor',\n\t'Rancharia',\n\t'Karumattampatti',\n\t'Piagapo',\n\t'Rishivandiyam',\n\t'Amposta',\n\t'Tultepec',\n\t'Cabaret',\n\t'Cloquet',\n\t'Plouzane',\n\t'Wilnecote',\n\t'Presidente Epitacio',\n\t'Mossaka',\n\t'Piano di Sorrento',\n\t'Colomiers',\n\t'Kaithal',\n\t'Cotoca',\n\t'Kofele',\n\t'Nangong',\n\t'Yhu',\n\t'Chepo',\n\t'Kyoto',\n\t'Sorocaba',\n\t'Phagwara',\n\t'Ludenscheid',\n\t'Guotang',\n\t'Vayakkalattu',\n\t'Mianeh',\n\t'Closepet',\n\t'Kronshagen',\n\t'Unye',\n\t'Vale de Cavalos',\n\t'Zitorada',\n\t'Ramnicu Valcea',\n\t'Samastipur',\n\t'West Hempstead',\n\t'Saunshi',\n\t'Atamyrat',\n\t'Morfelden-Walldorf',\n\t'Okahandja',\n\t'Shaoyu',\n\t'Mirpur Mathelo',\n\t'Odendaalsrus',\n\t'Jisrayn',\n\t'Elankur',\n\t'Facatativa',\n\t'Leshan',\n\t'Halle',\n\t'Paharpur',\n\t'Dialafara',\n\t'Villeneuve-Loubet',\n\t'Regidor',\n\t'Pukkulam',\n\t'Torre Boldone',\n\t'Tirukkalikkunram',\n\t'Xihuangcun',\n\t'Artemida',\n\t'Lorrach',\n\t'Governador Valadares',\n\t'Virton',\n\t'Xochiatipan de Castillo',\n\t'Ehingen an der Donau',\n\t'Carlosama',\n\t'Zarzal',\n\t'Terni',\n\t'Tomaszow Mazowiecki',\n\t'Villa Union',\n\t'North Lakes',\n\t'Lospalos',\n\t'Wuhan',\n\t'La Puebla del Rio',\n\t'Caraga',\n\t'Drolshagen',\n\t'Mahad',\n\t'Charleville',\n\t'Dhorimanna',\n\t'Hakodate',\n\t'Soumagne',\n\t'Magra',\n\t'Chulumani',\n\t'Alloa',\n\t'Montegranaro',\n\t'Singhara Buzurg',\n\t'Errahalli',\n\t'Sakleshpur',\n\t'Serris',\n\t'Zell am See',\n\t'Danbury',\n\t'Yoshioka',\n\t'Eruh',\n\t'Kinshasa',\n\t'Mellieha',\n\t'Ibadan',\n\t'Filottrano',\n\t'Dongjiangshui',\n\t'Mariehamn',\n\t'Mbalmayo',\n\t'Cobija',\n\t'Cairo',\n\t'Jatara',\n\t'Famalicao',\n\t'Bayonet Point',\n\t'Trang Bang',\n\t'Fandriana',\n\t'Copceac',\n\t'Nhamunda',\n\t'Sriperumbudur',\n\t'Kitamoto',\n\t'Le Grand-Quevilly',\n\t'Higuera de Zaragoza',\n\t'Sa Dec',\n\t'Plougastel-Daoulas',\n\t'IJsselstein',\n\t'Rivoli',\n\t'Neu Bleckede',\n\t'Am-Timan',\n\t'Jobabo',\n\t'Lerik',\n\t'Chaiyo',\n\t'Bergen op Zoom',\n\t'Niederzier',\n\t'Sesimbra',\n\t'Jagta',\n\t'Levis',\n\t\"Stara L'ubovna\",\n\t'Horbury',\n\t'Bialy Kamien',\n\t'Alamo',\n\t'Palaio Faliro',\n\t'Roselle Park',\n\t'Rudewa',\n\t'Kotma',\n\t'Cojedes',\n\t'Guangming',\n\t'Shanwei',\n\t'Vanimo',\n\t'Alesd',\n\t'Sidmouth',\n\t'Hamah',\n\t'Alejandro Korn',\n\t'Emsworth',\n\t'Shenjiabang',\n\t'Calatayud',\n\t'Furano',\n\t'Moca',\n\t'Viraghattam',\n\t'Farshut',\n\t'Nachod',\n\t'Patzun',\n\t'Southborough',\n\t'Hopetown',\n\t'Regina',\n\t'Estavayer-le-Lac',\n\t'Castellammare di Stabia',\n\t'Marabut',\n\t'Wegrow',\n\t'Moncton',\n\t'Pochuta',\n\t'Yumbe',\n\t'Raynes Park',\n\t'Kaiserslautern',\n\t'Ixtahuacan',\n\t'Montemor-o-Novo',\n\t'Palanisettipatti',\n\t'Baaqline',\n\t'Pen-y-Bont ar Ogwr',\n\t'Altinekin',\n\t'Villaba',\n\t'Cudahy',\n\t'Pazhanji',\n\t'Icononzo',\n\t'Yaozhuangcun',\n\t'Sanson',\n\t'Mol',\n\t'Lejiangxiang',\n\t'Prien am Chiemsee',\n\t'Heerde',\n\t'Nabatiye',\n\t'Dobre Miasto',\n\t'Franklin',\n\t'Ban Khi Lek',\n\t'Calumpang',\n\t'Levelland',\n\t'San Jose de Bocay',\n\t'Xichang',\n\t'Uravakonda',\n\t'Madinat Zayid',\n\t'Udayagiri',\n\t\"Jeppe's Reef\",\n\t\"Nek'emte\",\n\t'Fajardo',\n\t'Ratodero',\n\t'South Elgin',\n\t'Gogogogo',\n\t'Awjilah',\n\t'Kantharalak',\n\t'La Trinidad',\n\t'Nakanoto',\n\t'Paamiut',\n\t'Augustdorf',\n\t'Ferizli',\n\t'Belauncha',\n\t'Elurupadu',\n\t'Abuna',\n\t'Kuantan',\n\t'Casimiro de Abreu',\n\t'Battle Creek',\n\t'Ohara',\n\t'Knottingley',\n\t'Varzedo',\n\t'Ouled Slama Tahta',\n\t'Sorrento',\n\t'Lalmatie',\n\t'Hemavati',\n\t'Lewisboro',\n\t'Gary',\n\t'Hartbeespoort',\n\t'Piriyapatna',\n\t'Fulacunda',\n\t'Coatzacoalcos',\n\t'Puliyara',\n\t'Busca',\n\t'Jamkhed',\n\t'Targu Lapus',\n\t\"Ra's al Ma`arrah\",\n\t'Nakhtarana',\n\t'Monte Plata',\n\t'Gravenhurst',\n\t'Jingcheng',\n\t'Starnberg',\n\t'Sa al Hajar',\n\t'Whitehouse',\n\t'Batatais',\n\t'Ciempozuelos',\n\t'Bingmei',\n\t'Divinopolis',\n\t'Como',\n\t'Sirgora',\n\t'Ban Bang Yai',\n\t'Tejucuoca',\n\t'Soavina Antanety',\n\t'Grapevine',\n\t'Waseca',\n\t'Sindelfingen',\n\t'Ulhasnagar',\n\t'Tulcan',\n\t'Ararica',\n\t'Camoapa',\n\t'Zoubiria',\n\t'Dour',\n\t'Terku Narippaiyur',\n\t'Llagostera',\n\t'Qo`rg`ontepa',\n\t'San Rafael La Independencia',\n\t'Sandino',\n\t'Dasoguz',\n\t'Bankra',\n\t'Mauguio',\n\t'Viagrande',\n\t'Bay Village',\n\t'Galivedu',\n\t'Oulad Fares',\n\t'Patapatnam',\n\t'Swinoujscie',\n\t'Dharmkot',\n\t'Recklinghausen',\n\t'General Viamonte',\n\t'Cyangugu',\n\t'Monteux',\n\t'Ozalp',\n\t'Quintero',\n\t'Baocheng',\n\t'Marhaura',\n\t'La Solana',\n\t'Simpang Renggam',\n\t'Bad Durkheim',\n\t'Sao Bento do Sapucai',\n\t'Mitzic',\n\t'Etajima',\n\t'Volos',\n\t'Hailey',\n\t'Weinsberg',\n\t'Dahi',\n\t'Braselton',\n\t'Miro Khan',\n\t'Qujingpu',\n\t'Ince-in-Makerfield',\n\t'Spanish Springs',\n\t'Montanhas',\n\t'Presevo',\n\t'San Carlos Centro',\n\t'Nandnawan',\n\t'Nowy Sacz',\n\t'View Royal',\n\t'West Rembo',\n\t'Paragould',\n\t'Tortoli',\n\t'Guapiacu',\n\t'Gijon',\n\t'Ilesa',\n\t'Tongjiang',\n\t'Belakvadi',\n\t'Santa Sylvina',\n\t'Adelfia',\n\t'Mandya',\n\t'Bay City',\n\t'Rosny-sous-Bois',\n\t'Angono',\n\t'Uzhhorod',\n\t'Ap Phu Hai',\n\t'Bembe',\n\t'Palma di Montechiaro',\n\t'Shanhe',\n\t'Oued el Djemaa',\n\t'Atturkuppam',\n\t'Adwa',\n\t'Zabbar',\n\t'Bhagalpur',\n\t'West Valley City',\n\t'Ruislip',\n\t'Talatamaty',\n\t'Ban Wang Krachae',\n\t'Iskapalem',\n\t'Kashmar',\n\t'Bouchagroun',\n\t'Timissa',\n\t'Xizi',\n\t'Elmwood Park',\n\t'Santa Ana Huista',\n\t'Hickory Hills',\n\t'Rayong',\n\t'Zambrow',\n\t'Diamantina',\n\t'Carmen de Areco',\n\t'Kodigenahalli',\n\t'Jamikunta',\n\t'Soyaux',\n\t'Juraqan',\n\t'Burgess Hill',\n\t'Piskent',\n\t'Wloclawek',\n\t'Meerssen',\n\t'Cruz Alta',\n\t'Huitzilan',\n\t'Melo',\n\t'Takelsa',\n\t'Xiaoyi',\n\t'Jhabua',\n\t'Jagna',\n\t'Sondiha',\n\t'Sopiste',\n\t'Koungou',\n\t'Yeldurti',\n\t'Dois Irmaos',\n\t'Jaru',\n\t'Kulasekharapuram',\n\t'Shinshiro',\n\t'Qaanaaq',\n\t'Cangucu',\n\t'Rosas',\n\t'Westtown',\n\t'Kaka',\n\t'Gobardanga',\n\t'Fangyuan',\n\t'Kallupatti',\n\t'Raiganj',\n\t'Chitapur',\n\t'Benevides',\n\t'Miercurea-Ciuc',\n\t'Massapequa',\n\t'Kallakkudi',\n\t'Dinuba',\n\t'Ouagadougou',\n\t'Hanford',\n\t'Mfou',\n\t'Mandalapalle',\n\t'Alvand',\n\t'Fort Campbell North',\n\t'Kueneng',\n\t'Bunnik',\n\t'Radnor',\n\t'Ikoto',\n\t'Blankenburg',\n\t'Santa Marinella',\n\t'Snizhne',\n\t'Zerakpur',\n\t'Caetite',\n\t'Boechout',\n\t'Gulbarga',\n\t'Southern Pines',\n\t'Nanakuli',\n\t'Miarinarivo',\n\t'Lakshmeshwar',\n\t'Gaocheng',\n\t'Laheji',\n\t'Bagumbayan',\n\t'Goshen',\n\t'Neopolis',\n\t'Baohe',\n\t'Diss',\n\t'Hangu',\n\t'Muyinga',\n\t'Apahida',\n\t'Miagao',\n\t'Videm pri Ptuju',\n\t'Kuysinjaq',\n\t'Kalfou',\n\t'Danilovgrad',\n\t'Ambalatany',\n\t'Katkol',\n\t'Forio',\n\t'Chaohucun',\n\t'Manki',\n\t'Capulhuac',\n\t'White Rock',\n\t'Ban Pa Tueng',\n\t'Marahom',\n\t'Constanta',\n\t'Ntoum',\n\t'Los Minas',\n\t'Nabaruh',\n\t'Mahuver',\n\t'Crosia',\n\t'Bilenke',\n\t'Miranda de Ebro',\n\t'Oshakati',\n\t'Kochugaon',\n\t'Paralimni',\n\t'Ramon Santana',\n\t'Villa Bisono',\n\t'Ichikai',\n\t'Nefasit',\n\t'Sangmelima',\n\t'Jasmine Estates',\n\t'Marion Oaks',\n\t'Ahmedabad',\n\t'Bello',\n\t'Koporo-Kenie-na',\n\t'Attard',\n\t'Kamargani',\n\t'Greenwood Village',\n\t'Dubacherla',\n\t'Ad Dabyah',\n\t'Katosi',\n\t'Nhandeara',\n\t'Thap Than',\n\t'Andranambolava',\n\t'Totutla',\n\t'Gambettola',\n\t'Hatoyama',\n\t'Shanyincun',\n\t'Pinjranwan',\n\t'Yadiki',\n\t'Ceelbuur',\n\t'Petrovec',\n\t'Tighenif',\n\t'Berwick-Upon-Tweed',\n\t'Pakhtaobod',\n\t'Sentilj',\n\t'Barahra',\n\t'Pingdeng',\n\t'Zunil',\n\t'Darwen',\n\t'Trang',\n\t'Napier',\n\t'Oroshaza',\n\t'Sao Tiago',\n\t'Sipe Sipe',\n\t'Gera',\n\t'Sadhoa',\n\t'Sungo',\n\t'Papagaios',\n\t'Yahaba',\n\t'Tassera',\n\t'Cuyotenango',\n\t'Doumanaba',\n\t'Tortuguitas',\n\t'La Prairie',\n\t'Enfida',\n\t'Nafpaktos',\n\t'Chhapra',\n\t'Hoenheim',\n\t'Bondoufle',\n\t'La Virginia',\n\t'Guneysu',\n\t'Champaign',\n\t'Kampala',\n\t'Sundararaopeta',\n\t'Uppidamangalam',\n\t'Ikkadu',\n\t'Valjevo',\n\t'Xidiancun',\n\t'Bangkinang',\n\t'Ermenek',\n\t'Bayaguana',\n\t'Bitburg',\n\t'North Smithfield',\n\t'Lagunas',\n\t'Chuquicamata',\n\t'Kannamangalam',\n\t'Taunggyi',\n\t'Bibipet',\n\t'Fangcun',\n\t'Baikatpur',\n\t'Sultanpur',\n\t'Rio de Mouro',\n\t'Dongcun',\n\t'Yali',\n\t'Gora Kalwaria',\n\t'Ottawa',\n\t'Achankovil',\n\t'Przemysl',\n\t'Ambohinamboarina',\n\t'Sangalbahita',\n\t'Ban Pet',\n\t'Segaon',\n\t'Watertown',\n\t'Baghmaria',\n\t'Meissen',\n\t'Chebli',\n\t'Santo Antonio do Descoberto',\n\t'Santa Rosa de Rio Primero',\n\t'Gold Canyon',\n\t'Marburg',\n\t'Bhadas',\n\t'Arcos',\n\t'Kediri',\n\t'Kasaoka',\n\t'Teisendorf',\n\t'Tadikombu',\n\t'Enger',\n\t'Hajan',\n\t'Fenggeling',\n\t'Guroymak',\n\t'Kolanpak',\n\t'Magam',\n\t'Marsberg',\n\t'Panagar',\n\t'Nove Mesto nad Vahom',\n\t'Koluszki',\n\t'Tan-Tan',\n\t'Dehdasht',\n\t'Karimganj',\n\t'Tekman',\n\t'Dudelange',\n\t'Remscheid',\n\t'Xiaolongtan',\n\t'Srisailain',\n\t'Pike Road',\n\t'Villaquilambre',\n\t'Neustadt',\n\t'Anserma',\n\t'Prerov',\n\t'Mandleshwar',\n\t'Entrerrios',\n\t'Andranopasy',\n\t'Ambohibe',\n\t'Eagle Mountain',\n\t'Kadimetla',\n\t'Obala',\n\t'Nichinan',\n\t'Kouloum',\n\t'Karumba',\n\t'Sagamihara',\n\t'Multi',\n\t'Imabari',\n\t'Vizela',\n\t'Chiquimula',\n\t'Okkerneutboom',\n\t'Faribault',\n\t'Seyhan',\n\t'Vinces',\n\t'Vijayapuri North',\n\t'Santa Clara del Cobre',\n\t'Yorkville',\n\t'Purisima de Bustos',\n\t'Belhi',\n\t'Balarampur',\n\t'Buluan',\n\t'Jefferson Valley-Yorktown',\n\t'Buchs',\n\t'Agua Boa',\n\t'Karayazi',\n\t'Raipur Buzurg',\n\t'Sisa',\n\t'Adigala',\n\t'Demba',\n\t'Tangerhutte',\n\t'Sidi Moussa Ben Ali',\n\t'Alpharetta',\n\t'Shangping',\n\t'Sabha',\n\t'Iguatemi',\n\t'Ragampet',\n\t'Andranovao',\n\t'Chitaga',\n\t'Olalapadi',\n\t'Chenalho',\n\t'Kent',\n\t'Gorele',\n\t'Fiumicino',\n\t'Carrboro',\n\t'Sihanoukville',\n\t'Cepin',\n\t'Mawlaik',\n\t'Melmuri',\n\t'Mapai',\n\t'Ciudad Lopez Mateos',\n\t'Santaluz',\n\t'Leninskoe',\n\t'Esbiaat',\n\t'Shterpce',\n\t'Sidi Abdelkarim',\n\t'Meoqui',\n\t'Wajimazakimachi',\n\t'Sulya',\n\t'Kangersuatsiaq',\n\t'Telpur',\n\t'Osmanabad',\n\t'Diourbel',\n\t'Waycross',\n\t'Hohenmolsen',\n\t'Mukhtarpur Salkani',\n\t'Campo Grande',\n\t'Willebroek',\n\t'Bamaur',\n\t'Vico Equense',\n\t'Andipalaiyam',\n\t'Peraia',\n\t'Ashtown',\n\t'Biro',\n\t'Weddington',\n\t'Arboletes',\n\t'Tauramena',\n\t'Bayserke',\n\t'Toretsk',\n\t'Ha Tinh',\n\t'Redondela',\n\t'Patcham',\n\t'Hilden',\n\t'New Corella',\n\t'San Francisco del Rincon',\n\t'Tlacolulan',\n\t'Letlhakane',\n\t'Rubanda',\n\t'Bohechio',\n\t'Boujediane',\n\t'Hacienda Heights',\n\t'Alderwood Manor',\n\t'Hendrik-Ido-Ambacht',\n\t'Dhangadhi',\n\t'Chanute',\n\t'Paraippatti',\n\t'Senftenberg',\n\t'Remich',\n\t'Nimbahera',\n\t'Kadrabad',\n\t'Taperoa',\n\t'Dharan',\n\t'Bidar',\n\t'Jiaozuo',\n\t'Waterford',\n\t'Nanao',\n\t'Verona',\n\t'Bawali',\n\t'Vellakkovil',\n\t'Lakkavaram',\n\t'Lyss',\n\t'Punnavalli',\n\t'Martil',\n\t'Melut',\n\t'Newburgh',\n\t'Qaskeleng',\n\t'Crevillente',\n\t'Assemini',\n\t'Kilankundal',\n\t'Rades',\n\t'Beidao',\n\t'Leiden',\n\t'Phu Ly',\n\t'Antehiroka',\n\t'Ouolodo',\n\t'Vaddepalli',\n\t'Andalusia',\n\t'Marechal Candido Rondon',\n\t'Malaut',\n\t'Port Shepstone',\n\t'Julich',\n\t'Spitak',\n\t'Si Wilai',\n\t'Oblesevo',\n\t'Nantes',\n\t'Totana',\n\t'Godhavn',\n\t'Augusto Correa',\n\t'Mirchpur',\n\t'Yzeure',\n\t'Pelabuhanratu',\n\t'Werneuchen',\n\t'Dospat',\n\t'Ikkarai Boluvampatti',\n\t'Sareh Mowndeh',\n\t'Ramiriqui',\n\t'Sorriso',\n\t'Wasi',\n\t'Indi',\n\t'Talavera de la Reina',\n\t'Lichuan',\n\t'Cachoeiro de Itapemirim',\n\t'Kariba',\n\t'Narita',\n\t'Dazhou',\n\t'Marmeleiro',\n\t'Wollongong',\n\t'Alwaye',\n\t'Fazilka',\n\t'Tynemouth',\n\t'Aramari',\n\t'Bantay',\n\t'Helmond',\n\t'Talegaon Dabhade',\n\t'Dowbaran',\n\t'Babak',\n\t'Country Walk',\n\t'Irara',\n\t'Simoes',\n\t'Surakarta',\n\t'Carapegua',\n\t'Lal Khatanga',\n\t'Nowshera',\n\t'Sao Leopoldo',\n\t'Pinrang',\n\t'Bouchegouf',\n\t'Kipili',\n\t'Yuzhne',\n\t'Narasimharajapura',\n\t'Halls',\n\t'Paco',\n\t'Tarija',\n\t'Vergina',\n\t'Sheridan',\n\t'Bastrop',\n\t'Cota',\n\t'Jinghong',\n\t'Aylestone',\n\t'Tlalixcoyan',\n\t'Tiszakecske',\n\t'Blackwells Mills',\n\t'Serarou',\n\t'Kherameh',\n\t'Kampung Baharu Nilai',\n\t'Gomboussougou',\n\t'Mulheim-Karlich',\n\t'Oshnaviyeh',\n\t'Ocnita',\n\t'Thornton Heath',\n\t'Enfield',\n\t'Castricum',\n\t'Rio dos Cedros',\n\t'West Chester',\n\t'Beanana',\n\t'Wiener Neudorf',\n\t'Takkolam',\n\t'Santo Antonio de Posse',\n\t'Les Abricots',\n\t'Higashi-Matsuyama',\n\t'Burutu',\n\t'Yingtan',\n\t'Valkeala',\n\t'Council Bluffs',\n\t'North Decatur',\n\t'Gaozhou',\n\t'Ghabrah',\n\t'Barun',\n\t'Mugla',\n\t'Olgiy',\n\t'Pramatam',\n\t'Ituacu',\n\t'Hihya',\n\t'Faridkot',\n\t'Zarand',\n\t'Escada',\n\t'Ambaguio',\n\t'Sao Joao Nepomuceno',\n\t'Bardoli',\n\t'Murakami',\n\t'Leinefelde',\n\t'Zawyat an Nwacer',\n\t'Banjul',\n\t'Genthin',\n\t'Susono',\n\t'Buin',\n\t'Vryheid',\n\t'El Tocuyo',\n\t'Pompton Lakes',\n\t'Ibipitanga',\n\t'Magwe',\n\t'Ocuilan de Arteaga',\n\t'Solleftea',\n\t'Areal',\n\t'Casal di Principe',\n\t'Hyvinkaa',\n\t'Kukdeshwar',\n\t'Ludlow',\n\t'Klamath Falls',\n\t'Husnabad',\n\t'Belwara',\n\t'Tonisvorst',\n\t'Shekhupur',\n\t'Yokaichiba',\n\t'Amlash',\n\t'Usumatlan',\n\t'Mascota',\n\t'Hemau',\n\t'Bhawana',\n\t'Dongshi',\n\t'Siriari',\n\t'Gulf Hills',\n\t'Khromtau',\n\t'Jalal-Abad',\n\t'Ayvalik',\n\t'Baza',\n\t'Knowsley',\n\t'Gibsonville',\n\t'Tondangi',\n\t'Uzunkopru',\n\t'Pedda Penki',\n\t'New Rochelle',\n\t'Limache',\n\t'Nasiyanur',\n\t'Pansemal',\n\t'Ottendorf-Okrilla',\n\t'Karukurti',\n\t'Xiangjiaba',\n\t'Varennes',\n\t'Del Gallego',\n\t'Riviera Beach',\n\t'Chicacole',\n\t'Marignane',\n\t'Nova Vas',\n\t'Dammaj',\n\t'Kayunga',\n\t'Wallaceburg',\n\t'Bangkalan',\n\t'Kandi',\n\t'Corman Park No. 344',\n\t'Lavinia',\n\t'Estelle',\n\t'Parthenay',\n\t'Datiana',\n\t'Tamzoura',\n\t'Banapur',\n\t'Campia Turzii',\n\t'Pylaia',\n\t'Las Heras',\n\t'Diamantino',\n\t'Dachepalle',\n\t'Vegarai',\n\t'Campbell',\n\t'Sao Cristovao',\n\t'Nossa Senhora do Socorro',\n\t'Ocotal',\n\t'Del Carmen',\n\t'Mangalvedha',\n\t'Bamba',\n\t'Yaojia',\n\t'Ecully',\n\t'Tadjourah',\n\t'Flanders',\n\t'Nordhragota',\n\t'Stutterheim',\n\t'Sher',\n\t'Seferhisar',\n\t'Lieshout',\n\t'Brignoles',\n\t'Alcoa',\n\t'Senta',\n\t'Isola della Scala',\n\t'Ekchari',\n\t'Formello',\n\t'Rio Bananal',\n\t'Uppalapadu',\n\t'Apatzingan de la Constitucion',\n\t'Yuancun',\n\t'Mandi Burewala',\n\t'Baraka',\n\t'Ban Bang Khu Lat',\n\t'Tradate',\n\t'Fangliao',\n\t'Santa Ana de Yacuma',\n\t'Castel San Giovanni',\n\t'Aachen',\n\t'Ginan',\n\t'Riviere-du-Loup',\n\t'Blain',\n\t'Alawandi',\n\t'Xo`jayli Shahri',\n\t'Samut Prakan',\n\t'Ban Wang Nok Aen',\n\t'Triprangottur',\n\t'Tumbes',\n\t'Vandam',\n\t'Bistan',\n\t'Punnaikkayal',\n\t'St. Francis',\n\t'Garforth',\n\t'Sultanbeyli',\n\t'Jalpaiguri',\n\t'Nelas',\n\t'Embrun',\n\t'Karia Ba Mohamed',\n\t'Guasavito',\n\t'Chiroqchi',\n\t'Leander',\n\t'Adrano',\n\t'Boudjima',\n\t'Ostroh',\n\t'Kodriva',\n\t'Meriden',\n\t'Nova Laranjeiras',\n\t'Barnoldswick',\n\t'Urbiztondo',\n\t'Marapanim',\n\t'Jiangshan',\n\t'Jamshoro',\n\t'Aki',\n\t'Lackawanna',\n\t'Kafr Nubl',\n\t'Siroda',\n\t'Whittier',\n\t'Junqueiro',\n\t'Karavaram',\n\t'Jaguariaiva',\n\t'Fort Stewart',\n\t'Alvarado',\n\t'Vicopisano',\n\t'Raseiniai',\n\t'Zolotonosha',\n\t'Arbutus',\n\t'Parsahi Sirsia',\n\t'Alcora',\n\t'Canutama',\n\t'Edmonton',\n\t'Kalaa Srira',\n\t'Shirayamamachi',\n\t'Orito',\n\t'Mahadebnagar',\n\t'Wallaroo',\n\t'Ciampino',\n\t'Sirumugai',\n\t'Zhangshicun',\n\t'Fanambana',\n\t'Los Guayos',\n\t'Santa Gertrudes',\n\t'Godome',\n\t'Formby',\n\t'Paramankurichi',\n\t'Caratinga',\n\t'Dayalpur Sapha',\n\t'Mahuakheraganj',\n\t'Pine Hill',\n\t'Zhosaly',\n\t'Kousseri',\n\t'Jabalpur',\n\t'Bad Lauchstadt',\n\t'Julu',\n\t'Cortazar',\n\t'Drexel Heights',\n\t'Bolzano',\n\t'Plano',\n\t'Grossenhain',\n\t'Ventaquemada',\n\t'Bechem',\n\t'Masaki',\n\t'Denpasar',\n\t'Gaggiano',\n\t'Roxas',\n\t'Wickede',\n\t'Gomoh',\n\t'Arklow',\n\t'Fossano',\n\t'Stralsund',\n\t'Kresek',\n\t'Pohrebyshche',\n\t'Siruvalur',\n\t'Karpi',\n\t'Adra',\n\t'Rafiganj',\n\t'Oftringen',\n\t'Ilirska Bistrica',\n\t'Anazzou',\n\t'Jonnagiri',\n\t'Norcross',\n\t'Sidi Bennour',\n\t'Berkine',\n\t'Ueckermunde',\n\t'Walsall',\n\t'Dingle',\n\t'Raxaul',\n\t'Chard',\n\t'Cataingan',\n\t'Ervadi',\n\t'Santiago',\n\t'Dallgow-Doberitz',\n\t'Poperinge',\n\t'Shankarpur',\n\t'Felton',\n\t'Nesebar',\n\t'Junction City',\n\t'Socorro',\n\t'Horb am Neckar',\n\t'Slavonski Brod',\n\t'Samaniego',\n\t'Bolingbrook',\n\t'Sombrerete',\n\t'Pastrana',\n\t'Bertoua',\n\t'Zungeru',\n\t'Ataleia',\n\t'Ath Thawrah',\n\t'Palisades Park',\n\t'Biatorbagy',\n\t'Perches',\n\t'Ashqelon',\n\t'Janjanbureh',\n\t'Stendal',\n\t'Quixabeira',\n\t'San Giovanni Valdarno',\n\t'Madepalli',\n\t'Bubanza',\n\t'Fatehpur Shahbaz',\n\t'Vigonza',\n\t'Pallikapuzha',\n\t'Stepney',\n\t'Sibiu',\n\t'Bodagudipadu',\n\t'Isidro Casanova',\n\t'Chatia',\n\t'Angor',\n\t'Ouro Verde',\n\t'Markala',\n\t'Sapkyo',\n\t'Amarapuuram',\n\t'Kannadiparamba',\n\t'Koula',\n\t'Laksar',\n\t'Uonuma',\n\t'Mainpuri',\n\t'Liberia',\n\t'Zarah Sharan',\n\t'Alcaniz',\n\t'Lakhaura',\n\t'Bansbari',\n\t'Kurikuppi',\n\t'Muan',\n\t'Sandrandahy',\n\t'Corail',\n\t'Sardrud',\n\t'Ambositra',\n\t'Zhengtun',\n\t'Ijebu-Ode',\n\t'Athol',\n\t'Menderes',\n\t'Shirbadgi',\n\t'Oaxaca',\n\t'Nogales',\n\t'Tekkattur',\n\t'Mobile',\n\t'Pazaryeri',\n\t'Hirakud',\n\t'Oyama',\n\t'Anrochte',\n\t'Mashiko',\n\t'Vobkent Shahri',\n\t'Neumunster',\n\t'Lingbao Chengguanzhen',\n\t'Elbistan',\n\t'Hakka',\n\t'Safranbolu',\n\t'Goulds',\n\t'Kadriye',\n\t'Komae',\n\t'Mahdia',\n\t'Peer',\n\t'Mbulungu',\n\t'Prince George',\n\t'Bir Ben Laabed',\n\t'Manukau City',\n\t'Isfana',\n\t'Buxton',\n\t'Hassfurt',\n\t'Paro',\n\t'Andimeshk',\n\t'Mockmuhl',\n\t'Leonora',\n\t'Healdsburg',\n\t'Pyrgos',\n\t'Dardilly',\n\t'Richardson',\n\t'Espiritu',\n\t'Dipolog',\n\t'Oyodo',\n\t'Concord',\n\t'Rye Brook',\n\t'Komoro',\n\t'Liedekerke',\n\t'Nishon Tumani',\n\t'Wyke',\n\t'Padangsidempuan',\n\t'Milton',\n\t'Princes Town',\n\t'Bandar-e Deylam',\n\t'Perry Hall',\n\t\"Ahmer el 'Ain\",\n\t'Kampong Cham',\n\t'Vijayawada',\n\t'Kendal',\n\t'Sabinas',\n\t'Sihanamaro',\n\t'Kanye',\n\t'George Town',\n\t'Piquete',\n\t'Mullach Ide',\n\t'Fukushima',\n\t'Hohen Neuendorf',\n\t'Antsahabe',\n\t'Navoiy',\n\t'Riehen',\n\t'Castel Bolognese',\n\t'Virovitica',\n\t'Solihull',\n\t'Galaat el Andeless',\n\t'Endwell',\n\t'Langeloop',\n\t'Tuban',\n\t'Quaregnon',\n\t'Mastchoh',\n\t'La Chapelle-sur-Erdre',\n\t'Tapes',\n\t'Bac Ninh',\n\t'Tustin',\n\t'Leava',\n\t'Nagai',\n\t'Huatusco',\n\t'Kyjov',\n\t'Duque Bacelar',\n\t'Tanbei',\n\t'Copiague',\n\t'Langenzenn',\n\t'Iaciara',\n\t'Bimbo',\n\t'Guri',\n\t'Lake Ridge',\n\t'Star Dojran',\n\t'Nivala',\n\t'Damme',\n\t'Ambohitompoina',\n\t'Slovenj Gradec',\n\t'Najibabad',\n\t'Ziguinchor',\n\t'Chatenay-Malabry',\n\t'Mulanay',\n\t'Nakasi',\n\t'Guadalajara',\n\t'Bad Hersfeld',\n\t'Raciborz',\n\t'Sesto San Giovanni',\n\t'Walker',\n\t'Nonnweiler',\n\t'Dujiashigou',\n\t'Akune',\n\t'Malabang',\n\t'Konarka',\n\t'Chaves',\n\t'Yueqing',\n\t'Goias',\n\t'Isbergues',\n\t'Esenler',\n\t'Jovellanos',\n\t'Hajin',\n\t'Forest Acres',\n\t'Duchcov',\n\t'Keza',\n\t'Summit View',\n\t'Sokotindji',\n\t'Chitvel',\n\t'Tunis',\n\t'Sarkoy',\n\t'Nerang',\n\t'Berlaar',\n\t'Lukovica',\n\t'Bilthoven',\n\t'Muddebihal',\n\t'Thi Tran Mau A',\n\t'Fano',\n\t'Samtse',\n\t'Litian Gezhuang',\n\t'Dundalk',\n\t'Silistra',\n\t'Jangamguda',\n\t'Borna',\n\t'Bassar',\n\t'Gerstungen',\n\t'Talevad',\n\t'Worksop',\n\t'Sidlaghatta',\n\t'Chapulhuacan',\n\t'Guasdualito',\n\t'Garhi',\n\t'Cugir',\n\t'Epitacio Huerta',\n\t'Sankhavaram',\n\t'Sabotsy',\n\t'Nausori',\n\t'Purnea',\n\t'Ponnamaravati',\n\t'Sarkikaraagac',\n\t'Bourem',\n\t'Quepos',\n\t'South San Jose Hills',\n\t'Changchunpu',\n\t'Wissen',\n\t'Nova Canaa',\n\t'Whitburn',\n\t'Wysokie Mazowieckie',\n\t'Soacha',\n\t'Nagathan',\n\t'Daly City',\n\t'Antanimasaka',\n\t'Pura',\n\t'Petersfield',\n\t'Overlea',\n\t'Patjirwa',\n\t'Weldiya',\n\t'Iringa',\n\t'Guaruja',\n\t'Sitges',\n\t'Paola',\n\t'West End',\n\t'Nasice',\n\t'Mullanwala',\n\t'Nanjangud',\n\t'Jozefoslaw',\n\t'Zalau',\n\t'Petorca',\n\t'Zandhoven',\n\t'Xiashi',\n\t'Jaspur',\n\t'Pasuruan',\n\t'Bergen',\n\t'Gangneung',\n\t'Stargard Szczecinski',\n\t'President Roxas',\n\t'El Achir',\n\t'Beltangadi',\n\t'Iida',\n\t'Ardooie',\n\t'Swallownest',\n\t'Bairi Chak',\n\t'Zhijiang',\n\t'Shiyan',\n\t'Huzurabad',\n\t'Kampene',\n\t'Norden',\n\t'Chumpak',\n\t'Kokrajhar',\n\t'Arbelaez',\n\t'Mendig',\n\t'Independent Hill',\n\t'Etimesgut',\n\t'White Settlement',\n\t'Pottanur',\n\t'Shisui',\n\t'Mukkudal',\n\t'Mellila',\n\t'Pinagkaisahan',\n\t'Alcorta',\n\t'Dhantola',\n\t'San Carlos de Bariloche',\n\t'New Kingman-Butler',\n\t'Lawang',\n\t'Taki',\n\t'Khanpur',\n\t'Pirallahi',\n\t'Amatlan de los Reyes',\n\t'Kottapuram',\n\t'Mount Magnet',\n\t'Hunedoara',\n\t'Urayasu',\n\t'Provadia',\n\t'Siddarampuram',\n\t'Warfield',\n\t'Lemery',\n\t'Lidkoping',\n\t'Kalikiri',\n\t'Cravinhos',\n\t'Mukkanur',\n\t'Lakeland Highlands',\n\t'Pilani',\n\t'Al Mayadin',\n\t'Port Charlotte',\n\t'Jinshan',\n\t'Zeydabad',\n\t'Cantonment',\n\t'Nakhon Thai',\n\t'Dingras',\n\t'Kirippatti',\n\t'Haverford',\n\t'Rufisque',\n\t'Alagarai',\n\t'Bang Ban',\n\t'Querencia do Norte',\n\t'Puebloviejo',\n\t'Helena Valley Southeast',\n\t'Mezitli',\n\t'Pryor Creek',\n\t'Hem',\n\t'Antadinga',\n\t'Costa de Caparica',\n\t'Ghardimaou',\n\t'Shuinancun',\n\t'Shelek',\n\t'Saldanha',\n\t'Maues',\n\t'Apaseo el Grande',\n\t'Gendou',\n\t'Conceicao da Aparecida',\n\t'Burtonsville',\n\t'Eagle Pass',\n\t'Babhangawan',\n\t'Halle-Neustadt',\n\t\"Bahla'\",\n\t'Matelandia',\n\t'Muddanuru',\n\t'Coroaci',\n\t'Morro Agudo',\n\t'Lipjan',\n\t'Mizusawa',\n\t'Cangola',\n\t'Montanha',\n\t'Rethymno',\n\t'Westwood Lakes',\n\t'Valpovo',\n\t'Cayambe',\n\t'Itapicuru',\n\t'Bourdoud',\n\t'Polasara',\n\t'Beltinci',\n\t'Armentieres',\n\t'Nuriston',\n\t'Hattian Bala',\n\t'Torre del Campo',\n\t'Hormigueros',\n\t'Tan An',\n\t'Sao Jose dos Campos',\n\t'Belem de Maria',\n\t'Ksar Lmajaz',\n\t'Ossining',\n\t'Tikota',\n\t'Matsumoto',\n\t'Reina Mercedes Viejo',\n\t'New Plymouth',\n\t'Ocean Pointe',\n\t'Zogbodome',\n\t'Ahlaf',\n\t'Southfield',\n\t'Nijverdal',\n\t'Mumias',\n\t'Vac',\n\t'Hevie',\n\t'Malumfashi',\n\t'Merignac',\n\t'Agua Prieta',\n\t'Parabcan',\n\t'Kako',\n\t'Chestermere',\n\t'Nijar',\n\t'Esanboy',\n\t'Loango',\n\t'Boulder City',\n\t'Pedda Mupparam',\n\t'Bender',\n\t'Snellville',\n\t'Aibongo',\n\t'Geraardsbergen',\n\t'Skillounta',\n\t'Zalingei',\n\t'Argyroupoli',\n\t'Steiner Ranch',\n\t'Meghraj',\n\t'Midrand',\n\t'Akola',\n\t'Sacacoyo',\n\t'Osogbo',\n\t'Kaukhali',\n\t'Cotui',\n\t'Nzalat Laadam',\n\t'Bunji',\n\t'East Meadow',\n\t'Yangasso',\n\t'Saint-Cyprien',\n\t'Banda Aceh',\n\t'Shipley',\n\t'Nelamangala',\n\t'Sidi Redouane',\n\t'Mahomet',\n\t'El Abadia',\n\t'Kanagicho',\n\t'Port Elgin',\n\t'Parkway',\n\t'Kashiwazaki',\n\t'Belabo',\n\t'Rajauli',\n\t'Vlist',\n\t'Lucheng',\n\t'Chania',\n\t'Garching bei Munchen',\n\t'Taurianova',\n\t'Kahhale',\n\t'Novellara',\n\t'Cerejeiras',\n\t'Maintal',\n\t'Old Orchard Beach',\n\t'Lecco',\n\t'Oirase',\n\t'Kailahun',\n\t'Tres Valles',\n\t'Sao Jose de Ribamar',\n\t'Pala',\n\t'Galikesh',\n\t'Phularwan',\n\t'Santo Tomas de los Platanos',\n\t'Sher Chakla',\n\t'Rumia',\n\t'Almasi',\n\t'Hasanpur Juned',\n\t'Acambaro',\n\t'Market Warsop',\n\t'Diankabou',\n\t'Yelahanka',\n\t'Florissant',\n\t'Daegu',\n\t'Neckarsulm',\n\t'Suan',\n\t'Abadan',\n\t'Piritu',\n\t'Tulancingo',\n\t'Al Malikiyah',\n\t'Hazel Grove',\n\t'Zhanlicun',\n\t'Shoreline',\n\t'Sutihar',\n\t'Kopa',\n\t'Conshohocken',\n\t'Cuilco',\n\t'Budaun',\n\t'Makhar',\n\t'Kondrukota',\n\t'South Huron',\n\t'Jambukuttaippatti',\n\t'Plabennec',\n\t'Benoni',\n\t'Maddikera',\n\t'Vredendal',\n\t'Aci Castello',\n\t'Solotvyno',\n\t'Tarhzout',\n\t'Webb City',\n\t'Shagamu',\n\t'Svendborg',\n\t'Manokwari',\n\t'Lalian',\n\t'Kings Mountain',\n\t'Sambhar',\n\t'Kovacica',\n\t'Sumperk',\n\t'Barra Bonita',\n\t'Cedeno',\n\t'El Paraiso',\n\t'Zeghanghane',\n\t'Parihara',\n\t'Chosica',\n\t'Allur',\n\t'Al Qatif',\n\t'Wadlakonda',\n\t'Itoshima',\n\t'Huckelhoven',\n\t'Lempaala',\n\t'Fleming Island',\n\t'Sewai',\n\t'Mahesh Khunt',\n\t'Cranbourne',\n\t'Bahia Honda',\n\t'Sanderstead',\n\t'Munagapaka',\n\t'Kamata',\n\t'Arakere',\n\t'Nasirabad',\n\t'Tennala',\n\t'Sumbal',\n\t'Mandaluyong City',\n\t'Sunne',\n\t'Skierniewice',\n\t'Dilarpur',\n\t'Qujing',\n\t'Minneapolis',\n\t'Abalessa',\n\t'Roosevelt',\n\t'Balatonfured',\n\t'Mel Palaiyam',\n\t'Maitum',\n\t'Umm el Fahm',\n\t'Nanpala',\n\t'Isahara',\n\t'Qantir',\n\t'Boucherville',\n\t'Port Townsend',\n\t'Sassuolo',\n\t'Lipno',\n\t'Vahdat',\n\t'Orastie',\n\t'Oakland',\n\t'Reus',\n\t'Arpacay',\n\t'Andenne',\n\t'Kafr Takharim',\n\t'Wakasa',\n\t'Rutigliano',\n\t'Marianao',\n\t'Norderstedt',\n\t'Orobo',\n\t'Helsinki',\n\t'Bria',\n\t'Wehr',\n\t'Melsungen',\n\t'Saint-Basile-le-Grand',\n\t'Keisen',\n\t'Khorramshahr',\n\t'Brighouse',\n\t'Mount Dora',\n\t'Bogor',\n\t'Ayni',\n\t'Karoi',\n\t'Kujri',\n\t'Codo',\n\t'Police',\n\t'Ascension',\n\t'Chaguaramas',\n\t'Montauban',\n\t'Kukichuo',\n\t'Ruti',\n\t'Abbottabad',\n\t'Zgornje Jezersko',\n\t'Bushkill',\n\t'Ilobu',\n\t'Allison Park',\n\t'Abreu e Lima',\n\t'Magdalena',\n\t'Natividade do Carangola',\n\t'Chiclayo',\n\t'Hard',\n\t'Singrauliya',\n\t'Thanh Phu',\n\t'Kraljevo',\n\t'Grossos',\n\t'Algonquin',\n\t'Nowgong',\n\t'San Pietro in Casale',\n\t'Si Racha',\n\t'Anjoma-Ramartina',\n\t'Somain',\n\t'Ronkonkoma',\n\t'Draper',\n\t'Gudikallu',\n\t'Anandnagar',\n\t'Bouknadel',\n\t'Torri di Quartesolo',\n\t'Kaluvaya',\n\t'Benato-Toby',\n\t'Bormujos',\n\t'Xinzhou',\n\t'Qingyuan',\n\t'Tiruppattur',\n\t'Rotherham',\n\t'Alawalpur',\n\t'West Perrine',\n\t'Sahab',\n\t'Brejo do Cruz',\n\t'Uchiko',\n\t'Lichfield',\n\t'Schwaz',\n\t'Prevost',\n\t'Srimushnam',\n\t'Isalo',\n\t'Malinagar',\n\t'Tucson Estates',\n\t'Santiago do Cacem',\n\t'Neuenhaus',\n\t'Sa`dah',\n\t'Diebougou',\n\t'Karmah an Nuzul',\n\t'Muradpur',\n\t'Hov',\n\t'Duffel',\n\t'Ankeny',\n\t'Selim',\n\t'San Juan Bautista',\n\t'La Lisa',\n\t'Upper Arlington',\n\t'Chagallu',\n\t'West Wickham',\n\t'Godhra',\n\t'Bilaspur',\n\t'Bijeraghogarh',\n\t'Misterbianco',\n\t'Immingham',\n\t'Lawndale',\n\t'Ham Lake',\n\t'Bytow',\n\t'Lahnstein',\n\t'Illertissen',\n\t'Carpi',\n\t'Uch Sharif',\n\t'Pariconia',\n\t'Teixeira de Freitas',\n\t'Newstead',\n\t'Chegga',\n\t'Potsdam',\n\t'Korinthos',\n\t'Palmital',\n\t'Undavalli',\n\t'Onteniente',\n\t'Ayutuxtepeque',\n\t'Parbhani',\n\t'Ban Noen Kum Nueng',\n\t'Sucha Beskidzka',\n\t'Pieve di Soligo',\n\t'Sioux City',\n\t'Bni Darkoul',\n\t'Mae O',\n\t'Nova Sintra',\n\t'Piratininga',\n\t'Massantola',\n\t'Alice Springs',\n\t'Tidili Masfiywat',\n\t'Mahaly',\n\t'Baglar',\n\t'Heartland',\n\t'Kuyucak',\n\t'Pili',\n\t'Katri',\n\t'Saladas',\n\t'Samarinda',\n\t'Okhtyrka',\n\t'Sulagiri',\n\t'Pluzine',\n\t'Di Linh',\n\t'Kabacan',\n\t'Koprubasi',\n\t'Bayanauyl',\n\t'Murray Bridge',\n\t'Sunchales',\n\t'Holzminden',\n\t'Solon',\n\t'Orosi',\n\t'Ofaqim',\n\t'Vadakkangara',\n\t'Tooele',\n\t'`Adra',\n\t'Nagercoil',\n\t'Berriche',\n\t'Hyuga',\n\t'Santos Reyes Nopala',\n\t'Sezana',\n\t'Halifax',\n\t'Ambodisakoana',\n\t'Booneville',\n\t'Kirkenes',\n\t'Mahmutlar',\n\t'Bad Mergentheim',\n\t'Tnine Lgharbia',\n\t'Tanamarina-Sakay',\n\t'Escaudain',\n\t'Paterno',\n\t'Lepe',\n\t'Marui',\n\t'Lalitpur',\n\t'Las Veredas',\n\t'Pocos de Caldas',\n\t'Guasave',\n\t'Canterbury',\n\t'Rakhwari',\n\t'Benbutucun',\n\t'Harrisburg',\n\t'Casalgrande',\n\t'Mercaderes',\n\t'Celorico de Basto',\n\t'Goiania',\n\t'Thiruvananthapuram',\n\t'Padrauna',\n\t'Navarro',\n\t'Minturno',\n\t'Sarari',\n\t'Carugate',\n\t'Math Lohiyar',\n\t'Vairichettipalaiyam',\n\t'Leo',\n\t'Saposoa',\n\t'Vasa',\n\t'Heggadadevankote',\n\t'Po',\n\t'Rock Springs',\n\t'Kantilo',\n\t'Jedeida',\n\t'Pignon',\n\t'Izunokuni',\n\t'Shiyeli',\n\t'Mandiavato',\n\t'San Jose del Monte',\n\t'Ouenou',\n\t'Bouabout',\n\t'Kangaba',\n\t'Ulm',\n\t'Gwalior',\n\t'Recke',\n\t'Puruk Cahu',\n\t'Leonia',\n\t'Zapala',\n\t'Ban Na San',\n\t'Morant Bay',\n\t'Teonthar',\n\t'Douar Bou Tlelis',\n\t'Gondia',\n\t'Pulur',\n\t'Andonabe',\n\t'Santo Antonio do Jacinto',\n\t'Poldokhtar',\n\t'Setubal',\n\t'Mogalturru',\n\t'Tlahuelilpan',\n\t'Strood',\n\t'Pirapetinga',\n\t'Hamina',\n\t'Pompeia',\n\t'Pistoia',\n\t'Varre-Sai',\n\t'Tonosho',\n\t'Cisneros',\n\t'Bad Sackingen',\n\t'Yinggen',\n\t'Barwa Sagar',\n\t'Ayorou',\n\t'Chandhaus',\n\t'Mehsari',\n\t'Bobrovytsia',\n\t'McKinney',\n\t'Gernsbach',\n\t'Huejutla de Reyes',\n\t'Cintalapa de Figueroa',\n\t'Terra Alta',\n\t'Isemi-Ile',\n\t'Nishiwaki',\n\t'Siruma',\n\t'Leinfelden-Echterdingen',\n\t'Bernissart',\n\t'Dharampur',\n\t'Golden',\n\t'Beek',\n\t'Noordwijk',\n\t'Elixku',\n\t\"Piest'any\",\n\t'Kilvisharam',\n\t'Andria',\n\t'Nanjakkad',\n\t'Sankaridrug',\n\t'Ondorhaan',\n\t'Campo Novo do Parecis',\n\t'Castellon de la Plana',\n\t'Houthulst',\n\t'Choi Hung',\n\t'Zabrze',\n\t'Madaya',\n\t'Alfafar',\n\t'Nili',\n\t'Robertsonpet',\n\t'Yedapalli',\n\t'Cidade de Nacala',\n\t'Mathibestad',\n\t'Oued Tlelat',\n\t'Cuetzalan',\n\t'Juli',\n\t'Xixinzhuangzhen',\n\t'Hanwell',\n\t'Pomezia',\n\t'Lucani',\n\t'Fastiv',\n\t'Bela Palanka',\n\t'Kumarkhali',\n\t'Golubac',\n\t'Svencionys',\n\t'Sesena',\n\t'Savigny-sur-Orge',\n\t'Cal',\n\t'Brown Deer',\n\t'Thessaloniki',\n\t'Jiroft',\n\t'Taoyang',\n\t'Beziers',\n\t'Pathraha',\n\t'Minalabac',\n\t'Genova',\n\t'Sarea Khas',\n\t'Mahabe',\n\t'Bela Vista',\n\t'Zawyat Ahancal',\n\t'Speyer',\n\t'Cicekdagi',\n\t'Ouled Brahim',\n\t'Yinying',\n\t'Aguas Vermelhas',\n\t'Lille',\n\t'Dillingen',\n\t'Silang',\n\t'Monsey',\n\t'Kalakada',\n\t'Comarapa',\n\t'Tit Mellil',\n\t'Sergio Osmena Sr',\n\t'Tabapua',\n\t'Nata',\n\t'Redlands',\n\t'Jaggisettigudem',\n\t'Loma de Cabrera',\n\t'Kasongo',\n\t'Kincardine',\n\t'Aukstieji Paneriai',\n\t'Sabana Grande',\n\t'Barwadih',\n\t'Eragny',\n\t'Mochudi',\n\t'New Ulm',\n\t'La Chorrera',\n\t'Teresa',\n\t'Pingtan',\n\t'Caete',\n\t'Wieruszow',\n\t'Torrelavega',\n\t'Waltham Cross',\n\t'Yaupi',\n\t'Becancour',\n\t'Sao Fidelis',\n\t'Koch',\n\t'San Martin de Valdeiglesias',\n\t'Akron',\n\t'Cruzeiro do Sul',\n\t'Halabjah',\n\t'Channapatna',\n\t'Aliquippa',\n\t'Tilehurst',\n\t'Sabaoani',\n\t'Berck-sur-Mer',\n\t'Marquetalia',\n\t'Shepparton',\n\t'Stalybridge',\n\t'Banos',\n\t'Rengam',\n\t'Andradina',\n\t'Andicun',\n\t'Changde',\n\t'Vacaville',\n\t'Sattegalam',\n\t'Dadukou',\n\t'Machida',\n\t'Quisqueya',\n\t'Solcava',\n\t'Annecy',\n\t'Golakpur',\n\t'Altenburg',\n\t'Vahdattiyeh',\n\t'Damoh',\n\t'Mojo',\n\t'Vercelli',\n\t'Simijaca',\n\t'Chainpur',\n\t'Esopus',\n\t'Dimasalang',\n\t'Grand Rapids',\n\t'Bowdon',\n\t'Socastee',\n\t'Sibila',\n\t'Miches',\n\t'Kalkuni',\n\t'Kananga',\n\t'Ain Legdah',\n\t'Songo',\n\t'Huandacareo',\n\t'Panazol',\n\t'Iacu',\n\t'Kelandis',\n\t'Miragoane',\n\t'Pote',\n\t'Shimabara',\n\t'Mariluz',\n\t'Anyuan',\n\t'Guisborough',\n\t'Hashtgerd',\n\t'La Esperanza',\n\t'Gitarama',\n\t'San Miguel de Tucuman',\n\t'Hialeah',\n\t'Lake Wales',\n\t'Orihuela',\n\t'Lakhzazra',\n\t'Marivan',\n\t'Whitehorse',\n\t'Arawa',\n\t'Ono',\n\t'Sidi Bou Ali',\n\t'Papa',\n\t'Guankou',\n\t'Marghita',\n\t'Takarazuka',\n\t'Sao Joao do Manhuacu',\n\t\"G'ijduvon Shahri\",\n\t'Puerto Heath',\n\t'San Juanito de Escobedo',\n\t'Mattenhof',\n\t'Amriswil',\n\t'Semara',\n\t'Lokeren',\n\t'Nevers',\n\t'Ken Caryl',\n\t'Hungen',\n\t'Kehl',\n\t'Tysmenytsia',\n\t'Khaur',\n\t'Hawsh al Bahdaliyah',\n\t'Palasa',\n\t'Vaduz',\n\t'Munnuru',\n\t'Oranjestad',\n\t'Tallkalakh',\n\t'Elwood',\n\t'Tocaima',\n\t'Ostringen',\n\t'Fontoura Xavier',\n\t'Palau',\n\t'Eastleigh',\n\t'Ferry Pass',\n\t'Renigunta',\n\t'Gig Harbor',\n\t'Guma',\n\t'Angadikkal Tekkekara',\n\t'Pathri',\n\t'Neya',\n\t'Santa Ana Maya',\n\t'Campobello di Mazara',\n\t'Zhongshu',\n\t'Lorton',\n\t'Wankaner',\n\t'Claremont',\n\t'Casca',\n\t'Izumi',\n\t'Lodhwe',\n\t'Sidi Boushab',\n\t'Karcag',\n\t'Siyabuswa',\n\t'Simeria',\n\t'Nemby',\n\t'Tema',\n\t'Komatsushimacho',\n\t'Canhotinho',\n\t'Ubstadt-Weiher',\n\t'Mill Hill',\n\t'Stange',\n\t'Rincon',\n\t'Leteri',\n\t'Cavite City',\n\t'Msaken',\n\t'Maputsoe',\n\t'Martorell',\n\t'Villiers-le-Bel',\n\t'San Esteban',\n\t'Fruita',\n\t'Sagunto',\n\t'Monkayo',\n\t'Maurepas',\n\t'Jianguang',\n\t'Zetel',\n\t'Dordrecht',\n\t'Kangbao',\n\t'Linkou',\n\t'Virginia',\n\t'Freital',\n\t'Tut',\n\t'Tashi',\n\t'Lang Son',\n\t'Falun',\n\t'Tentena',\n\t'Cristino Castro',\n\t'Langwedel',\n\t'Joaima',\n\t'Maraiyur',\n\t'Mata Grande',\n\t'Estanzuela',\n\t'Rosemere',\n\t'Kloof',\n\t'Or `Aqiva',\n\t'Cerro Grande',\n\t'Villa Berthet',\n\t'Buena Park',\n\t'Balkanabat',\n\t'Yaguate',\n\t'Katagon',\n\t'Cantaura',\n\t'Stung Treng',\n\t'Shambu',\n\t'Froha',\n\t'Anzio',\n\t'Trichur',\n\t'Bhatranha',\n\t'Sideropolis',\n\t'Herbrechtingen',\n\t'Gent',\n\t'Burhaniye',\n\t'Odienne',\n\t'Hendon',\n\t'Rustenburg',\n\t'Ninohe',\n\t'Godollo',\n\t'Muelle de los Bueyes',\n\t'Astorga',\n\t'Nowy Dwor Mazowiecki',\n\t'Pilibangan',\n\t'Rapu-Rapu',\n\t'Ingham',\n\t'Sable-sur-Sarthe',\n\t'Andre Fernandes',\n\t'Khomeyni Shahr',\n\t'Languyan',\n\t'Schwyz',\n\t'Terranuova Bracciolini',\n\t'Sangan',\n\t'Nirpur',\n\t'Palmeira',\n\t'Aziylal',\n\t\"Vel'ky Krtis\",\n\t'Babhnoul',\n\t'Ait Yaazem',\n\t'Usti nad Orlici',\n\t'Bonham',\n\t'Achampet',\n\t'San Baudilio de Llobregat',\n\t'Tres Arroyos',\n\t'Suva',\n\t'Hameln',\n\t'Oued Taria',\n\t'Tamalameque',\n\t'Aguinaldo',\n\t'Kitajima',\n\t'Bilhorod-Dnistrovskyi',\n\t'Glocester',\n\t'Nuevo Ideal',\n\t'Rialma',\n\t'Tukums',\n\t'Calhoun',\n\t'Ambalavero',\n\t'Idappadi',\n\t'Benevento',\n\t'Lormont',\n\t'Anndevarapeta',\n\t'Upton',\n\t'Zamalka',\n\t'Sasaram',\n\t'Bucksburn',\n\t'Segamat',\n\t'Zywiec',\n\t'Ribnitz-Damgarten',\n\t'Marly',\n\t'Mogwase',\n\t'Senaki',\n\t'Arroio Grande',\n\t'Grobbendonk',\n\t'Clarendon Hills',\n\t'Vyshneve',\n\t'Lomas del Mirador',\n\t'Royal Palm Beach',\n\t'Koloriang',\n\t'Niort',\n\t'Tazhakara',\n\t'Papanasam',\n\t'Arroio do Tigre',\n\t'Los Bajos',\n\t'Ostuncalco',\n\t'Jastrzebie-Zdroj',\n\t'Bejucal',\n\t'St. Clements',\n\t'Itanhem',\n\t'Bayamo',\n\t'Vejle',\n\t'Kishanpur Ratwara',\n\t'Chok Chai',\n\t'Oberhausen-Rheinhausen',\n\t'Karawang',\n\t'Lengir',\n\t'Katori',\n\t'Karapinar',\n\t'Talcahuano',\n\t'Ciudad de Huajuapam de Leon',\n\t'Hindupur',\n\t'Keller',\n\t'Fagaras',\n\t'Wodonga',\n\t'Tanakkangulam',\n\t'Pereira',\n\t'Clonmel',\n\t'Eunice',\n\t'Eberswalde',\n\t'Tottiyam',\n\t'Iquira',\n\t'Ergani',\n\t'Santa Clara',\n\t'Jaitpur',\n\t'Anzin',\n\t'Toumodi',\n\t'Sitio do Mato',\n\t'Drabar',\n\t'Srikhanda',\n\t'Ban Mae Hia Nai',\n\t'Shimubi',\n\t'Ozd',\n\t'Mucur',\n\t'Burdeos',\n\t'Hawthorne',\n\t'El Aouana',\n\t'Kirkuk',\n\t'Mekele',\n\t'Barguna',\n\t'Brzeg Dolny',\n\t'Santa Maria Tonameca',\n\t'San Luis',\n\t'Les Ponts-de-Ce',\n\t'Helong',\n\t'Marneuli',\n\t'Anjiamangirana I',\n\t'Punjai Kalamangalam',\n\t'Phan Thiet',\n\t'Beni Mellal',\n\t'Jose Panganiban',\n\t'Boxley',\n\t'Tamalpais-Homestead Valley',\n\t'Raisari',\n\t'Calanasan',\n\t'Kazanlak',\n\t'Buved',\n\t'Amarpatan',\n\t'Quang Tri',\n\t'Premia de Mar',\n\t'Nandimandalam',\n\t'Leeuwarden',\n\t'Difficult Run',\n\t'Bergamo',\n\t'Kuwana',\n\t'Paignton',\n\t'Puduparambubhagam',\n\t'Tranqueras',\n\t'Haren',\n\t'Wertingen',\n\t'Castelar',\n\t'Glenrothes',\n\t'Bilimora',\n\t'Funes',\n\t'Longview',\n\t'Afdem',\n\t'Soyalo',\n\t'Nasatta',\n\t'Takkali',\n\t'Downpatrick',\n\t'Khotyn',\n\t'Sidi Brahim',\n\t'Halewood',\n\t'Lawton',\n\t'Surampatti',\n\t'Arroio dos Ratos',\n\t'Ain Zohra',\n\t'Barking',\n\t'Sucre',\n\t'Amboanjo',\n\t'Lubalo',\n\t'Chachapoyas',\n\t'Villa Yapacani',\n\t'Vettakkaranpudur',\n\t'Montemarciano',\n\t'Aracatu',\n\t'Avigliano',\n\t'Roanne',\n\t'Nadur',\n\t'Weinan',\n\t'Heyuan',\n\t'Tabontabon',\n\t'Peterborough',\n\t'Dieli',\n\t'El Ach',\n\t'Ezanville',\n\t'Gore',\n\t'Bougoula',\n\t'Porlamar',\n\t'Sedona',\n\t'Saint-Louis',\n\t'Cebazat',\n\t'Nueva Guinea',\n\t'Sao Francisco de Assis',\n\t'Achi',\n\t'Mummidivaram',\n\t'Antsirabe',\n\t'Samalapuram',\n\t'Chandler',\n\t'Shuanghe',\n\t'Santana do Paraiso',\n\t'Ampondra',\n\t'Delavan',\n\t'Cacoal',\n\t'Abangaritos',\n\t'South Londonderry',\n\t'Triesenberg',\n\t'Amantea',\n\t'Bou Arkoub',\n\t'Tamponala',\n\t'Sogamoso',\n\t'Verdun',\n\t'Mali Zvornik',\n\t'La Democracia',\n\t'El Prat de Llobregat',\n\t'Borgloon',\n\t'Morwa',\n\t'Jarville-la-Malgrange',\n\t'Evans',\n\t'Peto',\n\t'Forde',\n\t'Grants',\n\t'Maglie',\n\t'Altagracia de Orituco',\n\t'Budaors',\n\t'El Affroun',\n\t'Azhikkod',\n\t'Hiramandalam',\n\t'Botad',\n\t'Rye',\n\t'Broadstairs',\n\t'Tilmi',\n\t'Harleysville',\n\t'Moncao',\n\t'Usti nad Labem',\n\t'Maracha',\n\t'Gaojiayingcun',\n\t'Castelnuovo di Verona',\n\t'Versmold',\n\t'Luzilandia',\n\t'Vernier',\n\t'Southold',\n\t'Nkhata Bay',\n\t'Chavkandak',\n\t'Paniqui',\n\t'South Milwaukee',\n\t'Mauranwan',\n\t'Sidi Ladjel',\n\t'Mozirje',\n\t'Mthatha',\n\t'Novotroitske',\n\t'Aracinovo',\n\t'Fulin',\n\t'Tatalon',\n\t'Carpentersville',\n\t'Vaijapur',\n\t'Zhongcheng',\n\t'Glendale',\n\t'Saugeen Shores',\n\t'Saint-Paul-les-Dax',\n\t'Kobeliaky',\n\t'Pai Bigha',\n\t'Bay St. Louis',\n\t'Bluffdale',\n\t'Zagora',\n\t'Careiro',\n\t'Karahrud',\n\t'Mudakkal',\n\t'Amuru',\n\t'Ismailia',\n\t'Chodavaram',\n\t'Kiyose',\n\t'Cerritos',\n\t'Ambondrona',\n\t'Penn Hills',\n\t'Le Taillan-Medoc',\n\t'Girua',\n\t'Rio Linda',\n\t'Poas',\n\t'Lucas do Rio Verde',\n\t'Pratapgarh',\n\t'Daddi',\n\t'Lifford',\n\t'Vandikarai',\n\t'Westhoughton',\n\t'Rajepur',\n\t'Monreal',\n\t'Loviisa',\n\t'Juanacatlan',\n\t'Hankey',\n\t'Amboise',\n\t'Bozkir',\n\t'Ha Tien',\n\t'Kucukcekmece',\n\t'Posse',\n\t'Buerarema',\n\t'Leixlip',\n\t'Huanren',\n\t'Bawgalegyi',\n\t'Manage',\n\t'Dumanjog',\n\t'Mulifanua',\n\t'Traun',\n\t'Pantelho',\n\t'Gundur',\n\t'Mirialguda',\n\t'Russelsheim',\n\t'Quixelo',\n\t'Chipata',\n\t'Macaubas',\n\t'Fujino',\n\t'Craig',\n\t'Iskapalli',\n\t'Solhan',\n\t'Costessey',\n\t'La Vega',\n\t'Espejo',\n\t'Perevalsk',\n\t'Middle Island',\n\t'Zavora',\n\t'Lorain',\n\t'Leninskiy',\n\t'Rossdorf',\n\t'Pembroke',\n\t'Weirton',\n\t'Villa Gonzalez',\n\t'Multan',\n\t'Patamundai',\n\t'Wicklow',\n\t'Florence',\n\t'Tibati',\n\t'Steti',\n\t'Ugento',\n\t'Messstetten',\n\t'Pestel',\n\t'Sujangarh',\n\t'Camanducaia',\n\t'Acarau',\n\t'Balagam',\n\t'Sungal',\n\t'Linyi',\n\t'Tukuyu',\n\t'Faetano',\n\t'Batgram',\n\t'Saundatti',\n\t'Roux',\n\t'Hermosa Beach',\n\t'Mavelikara',\n\t'Canapi',\n\t'Lovendegem',\n\t'Busogo',\n\t'Villeneuve-les-Avignon',\n\t'Phokeng',\n\t\"Sant'Arpino\",\n\t'Ambasamudram',\n\t'Gobernador Virasora',\n\t'Langley Park',\n\t'Mungo',\n\t'Carrick on Shannon',\n\t'Warangal',\n\t'Haan',\n\t'Markt Indersdorf',\n\t'Ngororero',\n\t'Pavannur',\n\t'Boekel',\n\t'Sotteville-les-Rouen',\n\t'Sarai Alamgir',\n\t'Kutiyana',\n\t'Great Cornard',\n\t'Oiapoque',\n\t'Diondiori',\n\t'Xiangshui',\n\t'Benesov',\n\t'Borja',\n\t'Traunstein',\n\t'Cardito',\n\t'Evreux',\n\t'Camponogara',\n\t'Kladovo',\n\t'Oncativo',\n\t'Nazret',\n\t'Cachoeiras de Macacu',\n\t'Bayport',\n\t'Mandaguari',\n\t'Katha',\n\t'Scarborough',\n\t'Hotan',\n\t'Dinangorou',\n\t'Kilimli',\n\t'Killamarsh',\n\t'Bifoun',\n\t'Gorom-Gorom',\n\t'Reddish',\n\t'Wildomar',\n\t'Tlalmanalco',\n\t'Grafenhainichen',\n\t\"Sama'il\",\n\t'Touwu',\n\t'Castillos',\n\t'Sipacapa',\n\t'Dionisio Cerqueira',\n\t'Maqsuda',\n\t'Iranduba',\n\t'Bharweli',\n\t'Irakleio',\n\t'Shima',\n\t'Zandvoort',\n\t'Edremit',\n\t'Vitomirice',\n\t'Laoaoba',\n\t'Kocakoy',\n\t'Barnet',\n\t'Majitha',\n\t'Minnehaha',\n\t'Holbaek',\n\t'Panchgram',\n\t'San Michele al Tagliamento',\n\t'San Agustin de Guadalix',\n\t'Fanjakana',\n\t'Piat',\n\t'Marjampad',\n\t'River Falls',\n\t'Gualan',\n\t'Capannori',\n\t'Takashima',\n\t'Siripur',\n\t'Antakotako',\n\t\"Qa'en\",\n\t'Agadir Melloul',\n\t'West Jordan',\n\t'Dipalpur',\n\t'Ar Rudayyif',\n\t'New Hyde Park',\n\t'Rasdhoo',\n\t'Amakusa',\n\t'Jember',\n\t'North Richland Hills',\n\t'Andrainjato',\n\t\"Bo'ness\",\n\t'Curridabat',\n\t'Wangaratta',\n\t'Mirante',\n\t'Pulppatta',\n\t'Prestwick',\n\t'El Tarra',\n\t'Ambodimanga II',\n\t'Beausoleil',\n\t'Raisio',\n\t'Puttur',\n\t'Diriamba',\n\t'Davyhulme',\n\t'Murukondapadu',\n\t'North Union',\n\t'Guayaramerin',\n\t'Mingguang',\n\t'Milaor',\n\t'Dongluocun',\n\t'Ghuenke',\n\t'Market Harborough',\n\t'Sainte-Savine',\n\t'Makaha',\n\t'Security-Widefield',\n\t'Donabate',\n\t'Wigan',\n\t'Tasquillo',\n\t'Villasagar',\n\t'Buikwe',\n\t\"Ouro Preto d'Oeste\",\n\t'Roldanillo',\n\t\"Ait I'yach\",\n\t'Camliyayla',\n\t'Cinderford',\n\t'Maraial',\n\t'Santo Stefano di Magra',\n\t'Anaiyur',\n\t'Kushk',\n\t'Amontada',\n\t'Marituba',\n\t'Cambe',\n\t'Horjul',\n\t'Seguela',\n\t'Wagin',\n\t'Schwandorf',\n\t'Lawaan',\n\t'Kadirli',\n\t'Vaughan',\n\t'East Retford',\n\t'Hinatuan',\n\t'Shoranur',\n\t'Rayen',\n\t'Bistrica ob Sotli',\n\t'Acharnes',\n\t'Rajsamand',\n\t'Aipe',\n\t'Faxinal',\n\t'Ollioules',\n\t'Ismaning',\n\t'Smartno',\n\t'Lamhadi',\n\t'Lecce',\n\t'Bredbury',\n\t'Adjarra',\n\t'Lichana',\n\t'La Troncal',\n\t'Sao Caetano do Sul',\n\t'Koppal',\n\t'Hansa',\n\t'Sirinhaem',\n\t'Weissenfels',\n\t'Aloha',\n\t'Tailai',\n\t'Jucuaran',\n\t'Summerstrand',\n\t'Amnat Charoen',\n\t'Kornwestheim',\n\t'Sorum',\n\t'Iarpur',\n\t'Minquan',\n\t'Srivaikuntam',\n\t'Almunecar',\n\t'Ban Don Thong',\n\t'Targu Jiu',\n\t'Tamparan',\n\t'Oyabe',\n\t'Stadtlohn',\n\t'Hazorasp',\n\t'Torredembarra',\n\t'Kalavad',\n\t'Ochakiv',\n\t'Williamsburg',\n\t'North Greenbush',\n\t'Victor Larco Herrera',\n\t'Karasu',\n\t'Sabnima',\n\t'Iramala',\n\t'Hoa Binh',\n\t'Naregal',\n\t'Concordia Sagittaria',\n\t'Portishead',\n\t'Zhaltyr',\n\t'Liberty Triangle',\n\t'Chegurumomadi',\n\t'Vila Junqueiro',\n\t'Bitlis',\n\t\"Tajura'\",\n\t'Ambodivoara',\n\t'Highbury',\n\t'Nizza Monferrato',\n\t'Kesariya',\n\t'Walur',\n\t'Turbat',\n\t'Kars',\n\t'Colorado Springs',\n\t'Lashkar Gah',\n\t'Lavaur',\n\t'Nova Petropolis',\n\t'Goalpara',\n\t'Padra',\n\t'Fallbrook',\n\t'Imotski',\n\t'Domnesti',\n\t'Ilami',\n\t'Edewecht',\n\t'Playas de Rosarito',\n\t'Palo Negro',\n\t'Ban Song',\n\t'Batna',\n\t'Galt',\n\t'Ambatolava',\n\t'Le Cannet',\n\t'Urumita',\n\t'Ankily',\n\t'Missouri City',\n\t'Partap Tanr',\n\t'Margarita',\n\t'Vandiperiyar',\n\t'Kaminokawa',\n\t'Goldach',\n\t'Viamao',\n\t'Nainpur',\n\t'Ya`bad',\n\t'Palhano',\n\t'Chhatapur',\n\t'Commune Sidi Youssef Ben Ahmed',\n\t'Jucati',\n\t'Con Dao',\n\t\"Al Bayda'\",\n\t'Badhoevedorp',\n\t'San Rafael Oriente',\n\t'Ndulo',\n\t'Az Zulfi',\n\t'Ban San Pong',\n\t'Antioch',\n\t'Stoke-on-Trent',\n\t'Sahuli',\n\t'Asagi Ayibli',\n\t'Palukudoddi',\n\t'Chorfa',\n\t'Campos Novos',\n\t'Borim',\n\t'Hueytown',\n\t'Anuppur',\n\t'Port Lincoln',\n\t'Sertanopolis',\n\t'Cradock',\n\t'Winsford',\n\t'Bakhchysarai',\n\t'Spreitenbach',\n\t'Arese',\n\t'Buug',\n\t'Paruchuru',\n\t'Lower Swatara',\n\t'Vinica',\n\t'Pottsville',\n\t'Moncalieri',\n\t'Lamzoudia',\n\t'Crestwood',\n\t'Damongo',\n\t'Greece',\n\t'Utinga',\n\t'Niamtougou',\n\t'Kallayi',\n\t'Trogir',\n\t'Osmaneli',\n\t'Friendly',\n\t'Kanchanpur',\n\t'Hawera',\n\t'Carupano',\n\t'Nador',\n\t'Grand-Couronne',\n\t'Ogbomoso',\n\t'Sahagun',\n\t'Bridgwater',\n\t'Xicotepec de Juarez',\n\t'Durham',\n\t'Jerez de los Caballeros',\n\t'North Hykeham',\n\t'Stannington',\n\t'Ibanda',\n\t'Batac',\n\t'Logten',\n\t'Hoorn',\n\t'Roussillon',\n\t'Minzhu',\n\t'Blindio',\n\t'Mainz',\n\t'Catarman',\n\t'Lumberton',\n\t'Payabon',\n\t'Sangeorz-Bai',\n\t\"Pau d'Alho\",\n\t'Honggu',\n\t'Sauk Rapids',\n\t'Ortaklar',\n\t'Thousand Oaks',\n\t'Kocani',\n\t'Kudangulam',\n\t'Chicoloapan',\n\t'De Meern',\n\t'Qiblai',\n\t'Montevista',\n\t'San Felipe Orizatlan',\n\t'Lakatoro',\n\t'Badia Polesine',\n\t'Bad Kissingen',\n\t'Bom Jesus do Itabapoana',\n\t'Erenler',\n\t'Katwijk',\n\t'Sao Francisco do Sul',\n\t'Lila',\n\t'Na Sceiri',\n\t'Perumbakkam',\n\t'Leling',\n\t'Gladstone',\n\t'Al `Aqabah',\n\t'Waregem',\n\t'Mulgund',\n\t'Ambolomadinika',\n\t'Osorno',\n\t'Gorgab',\n\t'Udaipur',\n\t'Khomam',\n\t'Sindalakkundu',\n\t'Toukountouna',\n\t'Chebba',\n\t'Pettampalaiyam',\n\t'Baile Atha Luain',\n\t'Nurobod Shahri',\n\t'Kropyvnytskyi',\n\t'Guarapari',\n\t'Caidat Sidi Boubker El Haj',\n\t'Ala-Buka',\n\t'Turin',\n\t'Bucharest',\n\t'Gingoog',\n\t'Youngsville',\n\t'Angwali',\n\t'Orikhiv',\n\t'Hofn',\n\t'Varzea da Palma',\n\t'Lower Makefield',\n\t'Chillicothe',\n\t'Seabrook',\n\t'Phetchaburi',\n\t'Fujisawa',\n\t'Matara',\n\t'Kepno',\n\t'Alden',\n\t'Omigawa',\n\t'Bayombong',\n\t'Toride',\n\t'Mirabela',\n\t'Tullukuttinayakkanur',\n\t'Ugong',\n\t'Zhangye',\n\t'Mangha',\n\t'Krsko',\n\t'Comrat',\n\t'Sudbury',\n\t'Almaty',\n\t'Sonamukhi',\n\t'Terrabona',\n\t'Windsor',\n\t'Coralville',\n\t'Capela',\n\t'Qufu',\n\t'Stallings',\n\t'Kingaroy',\n\t'Downham Market',\n\t'Calapan',\n\t'Aizuwakamatsu',\n\t'Kaintragarh',\n\t'Inhuma',\n\t'Pangururan',\n\t'Scotchtown',\n\t'La Marque',\n\t'Iwata',\n\t'Zrece',\n\t'Waldheim',\n\t'Ajmer',\n\t'Pamekasan',\n\t'Mafune',\n\t'Weiyuan',\n\t'Gunzburg',\n\t'Drohobych',\n\t'Damal',\n\t'Sigtuna',\n\t'Campulung',\n\t'Patancheruvu',\n\t'Gavardo',\n\t'Acushnet',\n\t'Poiana Mare',\n\t'Tarsus',\n\t'Betanzos',\n\t'Chau Doc',\n\t'Cacequi',\n\t'Lalsaraia',\n\t'Aweitancun',\n\t'Gia Rai',\n\t'Corat',\n\t'Arcos de la Frontera',\n\t'Akassato',\n\t\"Samch'ok\",\n\t'Lake Tapps',\n\t'Aine Draham',\n\t'Vertou',\n\t'Neenah',\n\t'Tanhacu',\n\t'Shimla',\n\t'Keal',\n\t'Rani',\n\t'Kadaiyanallur',\n\t'Sefwi Wiawso',\n\t'Shankarpur Khawas',\n\t'Veliyangod',\n\t'Senador Guiomard',\n\t'Danzao',\n\t'Ndele',\n\t'Pornic',\n\t'Nowy Tomysl',\n\t'Scenic Oaks',\n\t'Ursulo Galvan',\n\t'Freudenberg',\n\t'Araruna',\n\t'Popayan',\n\t'Centereach',\n\t'Kamaishi',\n\t'Sainte-Marthe-sur-le-Lac',\n\t'Imilchil',\n\t'Zimapan',\n\t'Meschede',\n\t'Puthuppariyaram',\n\t'Paso de los Libres',\n\t'Longbenton',\n\t'Kampong Speu',\n\t'Novy Jicin',\n\t'Jinggang',\n\t'Asahi',\n\t'Khokri Kalan',\n\t'Kaveripatnam',\n\t'Lviv',\n\t'Bowling Green',\n\t'Braganca',\n\t'Panjgirain Kalan',\n\t'Emeryville',\n\t'Ruhango',\n\t'Tarim',\n\t'Castiglione del Lago',\n\t'Kyiv',\n\t'Mineral Wells',\n\t'Burnsville',\n\t'Franeker',\n\t'Teignmouth',\n\t'Canas',\n\t'Ajjampur',\n\t'Barhauna',\n\t'Zacharo',\n\t'Fujimi',\n\t'Billerica',\n\t'Falconara Marittima',\n\t'Alto Araguaia',\n\t'Tak Bai',\n\t'Bishops Cleeve',\n\t'Orhangazi',\n\t'Spokane Valley',\n\t'Kovel',\n\t'Walworth',\n\t'Zushi',\n\t'Aglasun',\n\t'Romainville',\n\t'Sorsogon',\n\t'Castellamonte',\n\t'Des Plaines',\n\t'Xai',\n\t\"'Ain Abid\",\n\t'Plattekill',\n\t'Sinzheim',\n\t'Cipanas',\n\t'Paliaturutu',\n\t'Katwe',\n\t'Lorenskog',\n\t'San Tung Chung Hang',\n\t'Abrego',\n\t'Viana',\n\t'Ishtixon Shahri',\n\t'Kharika',\n\t'Sautron',\n\t'San Narciso',\n\t'Hilton Head Island',\n\t'Lingolsheim',\n\t'Bornheim',\n\t'Koregaon',\n\t'Matao',\n\t'Sumida',\n\t'Ketsch',\n\t'Gopalnagar',\n\t'Rodez',\n\t'Canelones',\n\t'Tolten',\n\t'Crawley',\n\t'Tillsonburg',\n\t'Wislane',\n\t'Mortsel',\n\t'Akitakata',\n\t'Halasztelek',\n\t'Herselt',\n\t'Kartal',\n\t'Balabac',\n\t'Ungaran',\n\t'Da',\n\t'Sao Joao del Rei',\n\t'Ghanipur Bejha',\n\t'Al Quway`iyah',\n\t'Zalaegerszeg',\n\t'Carquefou',\n\t'Huanimaro',\n\t'Ponte Nova',\n\t'Monte Azul',\n\t'Melito di Porto Salvo',\n\t'Shimenzhai',\n\t'Pinehurst',\n\t\"K'ebri Beyah\",\n\t'Molsheim',\n\t'Konigstein im Taunus',\n\t'Taranagar',\n\t'Farciennes',\n\t'Bhilai',\n\t'Mathurapur',\n\t'Port-a-Piment',\n\t'Kyegegwa',\n\t'Ortakoy',\n\t'Antonibe',\n\t'Mercedes Umana',\n\t'Coronel',\n\t'Pedrinhas',\n\t'Suhagi',\n\t'Jaboatao dos Guararapes',\n\t'Oxon Hill',\n\t'Jalolquduq',\n\t'Morros',\n\t'Sumbas',\n\t'Chingola',\n\t'Rada Tilly',\n\t'Kolachel',\n\t'Bandarawela',\n\t'Pallattur',\n\t'Carauari',\n\t'Colares',\n\t'Santa Fe do Sul',\n\t'Musapur',\n\t'Arni',\n\t'Negage',\n\t'Graham',\n\t'Lake Grove',\n\t'Tolosa',\n\t'Marlboro',\n\t'Kandrawan',\n\t'Ponte Serrada',\n\t'Shanghai',\n\t'Ouedeme',\n\t'Saki',\n\t'Chembra',\n\t'Syston',\n\t'Palmeirais',\n\t'Borlange',\n\t'Bordj Bounaama',\n\t'Montceau-les-Mines',\n\t'Zhufeng',\n\t'Frei Paulo',\n\t'Western Springs',\n\t'Hemmingen',\n\t'Santa Cruz del Sur',\n\t'Pleasantville',\n\t'Chandla',\n\t'Maihma Sarja',\n\t'Sacaba',\n\t'Reynoldsburg',\n\t'Highland',\n\t'Sunyani',\n\t'Ajnala',\n\t'Ourem',\n\t'Zaltan',\n\t'Vannikkonendal',\n\t'Suchindram',\n\t'Metouia',\n\t'Bandar-e Lengeh',\n\t'Sestu',\n\t'Troisdorf',\n\t'Tibasosa',\n\t\"Villenave-d'Ornon\",\n\t'Huseni',\n\t'Komorniki',\n\t'Ankerana',\n\t'Planura',\n\t'Saguenay',\n\t'Xiangping',\n\t'Almendralejo',\n\t'Slawno',\n\t'Bir Ghbalou',\n\t'Luna',\n\t'Tiaret',\n\t'Pulakurti',\n\t'General Santos',\n\t'Shibancun',\n\t'Lansing',\n\t'Lake Los Angeles',\n\t'Hala',\n\t'Port Washington',\n\t'Cortalim',\n\t'Apostoles',\n\t'Radnevo',\n\t'Reina Mercedes',\n\t'Tivoli',\n\t'Gomishan',\n\t'Maigh Nuad',\n\t'Gujiao',\n\t'Sorvagur',\n\t'Milpitas',\n\t'Ramnagar Bankat',\n\t'Longyearbyen',\n\t'Sarauni',\n\t'Angel R. Cabada',\n\t'Brooksville',\n\t'Bochaha',\n\t'Alguazas',\n\t'Tigaraksa',\n\t'Guiguinto',\n\t'Granbury',\n\t'Aiyetoro Gbede',\n\t'Zenica',\n\t'Itsoseng',\n\t\"Al Madrah Sama'il\",\n\t'Murtajapur',\n\t'Gyongyos',\n\t'Kabale',\n\t'Armiansk',\n\t'Bandar-e Kong',\n\t'Makhambet',\n\t'Naval',\n\t'Issoudun',\n\t'Valmiera',\n\t'Virapandiyanpattanam',\n\t'Beirut',\n\t'Tagbilaran City',\n\t'El Factor',\n\t'Banikane',\n\t'Khartoum',\n\t'Jiangna',\n\t'Bhawanipatna',\n\t'Aungban',\n\t'Leonding',\n\t'Limeil-Brevannes',\n\t'Obernkirchen',\n\t'Nova Trento',\n\t'Zambezi',\n\t'Leith',\n\t'Gessate',\n\t'Huguan Nongchang',\n\t'Tirupati',\n\t'Cilimli',\n\t'Brie-Comte-Robert',\n\t'Cebu City',\n\t'Patti',\n\t'Germi',\n\t'Jaleshwar',\n\t'Piliscsaba',\n\t'Devipattinam',\n\t'Chato',\n\t'Khartoum North',\n\t'Brushy Creek',\n\t'Vlagtwedde',\n\t'Amacuzac',\n\t'Kosigi',\n\t'Aranjuez',\n\t'Leama',\n\t'Roanoke',\n\t'Limpio',\n\t'Kemalpasa',\n\t'Haisyn',\n\t'Peoria',\n\t'Stade',\n\t'In Guezzam',\n\t'Gashua',\n\t'Nerubaiske',\n\t'Ratlam',\n\t'Mahmutlu',\n\t'Srirampuram',\n\t'Veldurti',\n\t'Wemmel',\n\t'Phichit',\n\t'Dibaya-Lubwe',\n\t'Madurai',\n\t'Sao Goncalo do Para',\n\t'Vitry-le-Francois',\n\t'Anantarazupeta',\n\t'Boudinar',\n\t'Zschopau',\n\t'Quellon',\n\t'Longonjo',\n\t'Hexham',\n\t'Mangqu',\n\t'Hoxut',\n\t'Twickenham',\n\t'Gueckedou',\n\t'Labbaikkudikkadu',\n\t'Mittenwalde',\n\t'Hatton',\n\t'Feldbach',\n\t'Lahij',\n\t'Sasan',\n\t'Miastko',\n\t'Waitakere',\n\t'Shizuoka',\n\t'West Warwick',\n\t'Galati',\n\t'Biu',\n\t'Kudatini',\n\t'Viradouro',\n\t'Saffle',\n\t'Gyumai',\n\t'Zhongshan',\n\t'Picayune',\n\t'Antaly',\n\t'Anse-a-Veau',\n\t'Saint Peter Port',\n\t'Ambohitrolomahitsy',\n\t'Avadattur',\n\t'Calasiao',\n\t'Bambang',\n\t'Warder',\n\t'Koforidua',\n\t'Tangier',\n\t'Duggirala',\n\t'Glenville',\n\t'Bagrinagar',\n\t'Ingelmunster',\n\t'Carrigaline',\n\t'Ashtabula',\n\t'Galeras',\n\t'Ulchin',\n\t'Paarl',\n\t'Bandung',\n\t'Roxana',\n\t'Gulu',\n\t'Kesavapuram',\n\t'Beantake',\n\t'Yokoshiba',\n\t'Kaohsiung',\n\t'Piranguinho',\n\t'Port-de-Bouc',\n\t'Lakri',\n\t'Cadereyta Jimenez',\n\t'Merad',\n\t'Centralia',\n\t'Putte',\n\t'Baozhong',\n\t'Tougan',\n\t'Knutsford',\n\t'Estancia Velha',\n\t'Nawada',\n\t'Gangelt',\n\t'Frontignan',\n\t'Chiconcuac',\n\t'Gunnedah',\n\t'Lingen',\n\t'Bozmargi',\n\t'Porac',\n\t'St. Peter',\n\t'East Hempfield',\n\t'Tapalpa',\n\t'Jolfa',\n\t'Photharam',\n\t'`Ajman',\n\t'Altunhisar',\n\t'Staufenberg',\n\t'Fgura',\n\t'Heist-op-den-Berg',\n\t'Colima',\n\t'Hoogstraten',\n\t'Oi',\n\t'Rustington',\n\t'Vandamettu',\n\t'Manzanares el Real',\n\t'Laohekou',\n\t'Szigethalom',\n\t'Colindres',\n\t'Harrow',\n\t'Kishanganj',\n\t'Brejo Santo',\n\t'Dalfsen',\n\t'Werdau',\n\t'Rijkevorsel',\n\t'Coondapoor',\n\t'Kagizman',\n\t'Pardi',\n\t'Paombong',\n\t'Pitseng',\n\t'Chikwawa',\n\t'Togou',\n\t'Akanavaritota',\n\t'Ojus',\n\t'Buhl',\n\t'Ganjing',\n\t'Sona',\n\t'Vayalpad',\n\t'Taishacho-kizukikita',\n\t'Ocoee',\n\t'Noda',\n\t'Nurdagi',\n\t'Maidan Shahr',\n\t'Culleredo',\n\t'Paravurkambolam',\n\t'Olintepeque',\n\t'Kien Giang',\n\t'Kunoy',\n\t'Zawyat Sidi al Mekki',\n\t'Aleksinac',\n\t'Mandalay',\n\t'La Laguna',\n\t'Kanabur',\n\t'San Miguel Panan',\n\t'Batumi',\n\t'Gambolo',\n\t'Cibitoke',\n\t'Swatara',\n\t'Ganga',\n\t'Cotorro',\n\t'Skofljica',\n\t'Piranhas',\n\t'Aricak',\n\t'Darb-e Behesht',\n\t'Ampana',\n\t'North Bellmore',\n\t'La Roche-sur-Yon',\n\t'Challapata',\n\t'Binghamton',\n\t'Hatod',\n\t'Gouveia',\n\t'Gardendale',\n\t'Newnan',\n\t'Le Haillan',\n\t'Lencois Paulista',\n\t'Dangriga',\n\t'Mallan',\n\t'Forest Park',\n\t'Chiyoda',\n\t'Pirenopolis',\n\t'Sao Joao do Piaui',\n\t'Mahavanona',\n\t'Hanzhong',\n\t'Madalag',\n\t'Los Osos',\n\t'Guatajiagua',\n\t'Berri',\n\t'Lardero',\n\t'El Jicaral',\n\t'Ter Apel',\n\t'Kola',\n\t'Vasteras',\n\t\"Al 'Attawia\",\n\t'Pamplona',\n\t'Tomobe',\n\t'Bejaia',\n\t'Kullorsuaq',\n\t'Arganil',\n\t'Comapa',\n\t'Dehqonobod',\n\t'Gaoping',\n\t'Buntok',\n\t'Somerton',\n\t'Herstal',\n\t'Igualada',\n\t'Tumaco',\n\t'Saint Joseph',\n\t'Mandeville',\n\t'Monterrey',\n\t'Jamindan',\n\t'Nguti',\n\t'Sidi Lahssen',\n\t'Redruth',\n\t'Akcakoca',\n\t'Jankampet',\n\t'Tataouine',\n\t'Manizales',\n\t'Narasannapeta',\n\t'Karempudi',\n\t'St. Augustine',\n\t'Cumanayagua',\n\t'Montesilvano',\n\t'Gracias',\n\t'Congaz',\n\t'Poso',\n\t'Humenne',\n\t'Shalqar',\n\t'Lago Ranco',\n\t'Morogoro',\n\t'Qingan',\n\t'Anini-y',\n\t'Marche-en-Famenne',\n\t'Erseke',\n\t'Presidente Venceslau',\n\t'Abomey',\n\t'Dorohoi',\n\t'Talipparamba',\n\t'Bonito',\n\t'Algarrobo',\n\t'Yamoussoukro',\n\t'Lafey',\n\t'Kadi',\n\t'Beberibe',\n\t'Yurihama',\n\t'Viana do Castelo',\n\t'Assen',\n\t'Sniatyn',\n\t'Spanish Fort',\n\t'Xintianfeng',\n\t'Bukungu',\n\t'Xiaqiaotou',\n\t'Peshtera',\n\t'Hueyapan de Ocampo',\n\t'Marreddipalli',\n\t'Kaimati',\n\t'Isabela',\n\t'Selfoss',\n\t'Delhi',\n\t'Fujikawaguchiko',\n\t'Marutharod',\n\t'Bom Repouso',\n\t'Jagadhri',\n\t'El Valle',\n\t'Zlotoryja',\n\t'Grover Beach',\n\t'Hashtpar',\n\t'San Alejo',\n\t'Nazarje',\n\t'Hillcrest',\n\t'Sananduva',\n\t'Peissenberg',\n\t'Bada Barabil',\n\t'Watampone',\n\t'Nove Mesto nad Metuji',\n\t'Karankot',\n\t'Pucon',\n\t'Guangshui',\n\t'Falls Church',\n\t'Danihe',\n\t'Mudakkiraye',\n\t'Ceuti',\n\t'Fussen',\n\t'Zaghouan',\n\t'Yongbei',\n\t'Hong Ngu',\n\t'Conchas',\n\t'Manivilundan',\n\t'Tadhwa Nandpur',\n\t'Monistrol-sur-Loire',\n\t'Chateaubriant',\n\t'Sangar',\n\t'Fafe',\n\t'Shoshong',\n\t'Madang',\n\t'Marcy',\n\t'Puttlingen',\n\t'Groves',\n\t'Al Bahah',\n\t'Gorham',\n\t'Afogados da Ingazeira',\n\t'Knokke-Heist',\n\t'Pariyaram',\n\t'Zagreb',\n\t'Winton',\n\t'Les Iles-de-la-Madeleine',\n\t'Kusterdingen',\n\t'Paraguari',\n\t'Kuknur',\n\t'Black River',\n\t'Baishaling',\n\t'Sigulda',\n\t'Uppsala',\n\t'Selm',\n\t'Muy Muy',\n\t'Paracale',\n\t'Luleburgaz',\n\t'La Llagosta',\n\t'Demirci',\n\t'Kalasin',\n\t'Ibajay',\n\t'Ceska Lipa',\n\t'Camocim de Sao Felix',\n\t'Ogose',\n\t'Menlo Park',\n\t'Ouedo-Agueko',\n\t'Karakurisshi',\n\t'Franklin Lakes',\n\t'Ismayilli',\n\t'Gottingen',\n\t'Melmadai',\n\t'Meulaboh',\n\t'Ogre',\n\t'Bad Abbach',\n\t'Longmen',\n\t'Awka',\n\t'Braco do Norte',\n\t'Bigadic',\n\t'General Pacheco',\n\t'Sint-Oedenrode',\n\t'Annamalainagar',\n\t'Angamali',\n\t'Julio de Castilhos',\n\t'Capao Bonito',\n\t'Poynton',\n\t'Santa Cruz Atizapan',\n\t'Ekeren',\n\t'Gandara West',\n\t'Metairie',\n\t'Katsuren-haebaru',\n\t'Dupnitsa',\n\t'Tricase',\n\t'Mokpo',\n\t'Dassari',\n\t'Givatayim',\n\t'Jambai',\n\t'Hamsavaram',\n\t'Foggia',\n\t'Scott',\n\t'Inkhil',\n\t'Catamayo',\n\t'Nana',\n\t'Ntchisi',\n\t'Olomouc',\n\t'Madison Heights',\n\t'Genzano di Roma',\n\t'Vieux Fort',\n\t'Kagvad',\n\t'Motegi',\n\t'Breves',\n\t'Myitkyina',\n\t'Aqkol',\n\t'Al `Ashir min Ramadan',\n\t'Ariano Irpino',\n\t'Restrepo',\n\t'Jeumont',\n\t'Drazinda',\n\t'San Pedro de Ribas',\n\t'Chintakommadinne',\n\t'Tank',\n\t'Preili',\n\t'Konakli',\n\t'Julita',\n\t'Meda',\n\t'Ciudad Obregon',\n\t'Barabai',\n\t'Gizycko',\n\t'Boureit',\n\t'Arambagh',\n\t'Bonito Oriental',\n\t'Mbanga',\n\t'Chemmanam',\n\t'Kakira',\n\t'Mundka',\n\t'Noniya',\n\t'Marianske Lazne',\n\t'Khanaqin',\n\t'Pajacuaran',\n\t'Ain el Bya',\n\t'Bacliff',\n\t'Sewari',\n\t'Altusried',\n\t'Zinapecuaro',\n\t'Matsuo',\n\t'Vasylivka',\n\t'Peda-Houeyogbe',\n\t'Nossa Senhora dos Remedios',\n\t'Chaltabaria',\n\t'Hailakandi',\n\t'Poznan',\n\t'Taoudenni',\n\t'Sidhwan',\n\t'Guadalajara de Buga',\n\t'Rozhyshche',\n\t'Caracarai',\n\t'Suwannaphum',\n\t\"Bur Fu'ad\",\n\t'Fderik',\n\t'Mezotur',\n\t'Las Vegas',\n\t'Limassol',\n\t'Jursinci',\n\t'Taggia',\n\t'Poco das Trincheiras',\n\t'Douar Oulad Naoual',\n\t'Calarca',\n\t'Mont-Tremblant',\n\t'Belterra',\n\t'Sheikhpura',\n\t'North Olmsted',\n\t'Ramdurg',\n\t'Orumanayur',\n\t'Villafranca de los Barros',\n\t'Esztergom',\n\t'Payakaraopeta',\n\t'Ramchandrapur',\n\t'Khajamahalpur',\n\t'Najafgarh',\n\t'Athni',\n\t'Mikkelin Maalaiskunta',\n\t'Bijnor',\n\t'Ighram',\n\t'Dragash',\n\t'Thargomindah',\n\t'Castel Maggiore',\n\t'Belambo',\n\t'Nueva Palmira',\n\t'Kurabur',\n\t'Yahsihan',\n\t'Chesterton',\n\t'Konduru',\n\t'Tordesillas',\n\t'Biala Podlaska',\n\t'Katsuragi',\n\t'South Bradenton',\n\t'Naranja',\n\t'Okhmalynka',\n\t'Newtownards',\n\t'Pimenta Bueno',\n\t'Naraura',\n\t'Craponne',\n\t'Auta',\n\t'Kumaravadi',\n\t'Anajas',\n\t'Mouiat Ouennsa',\n\t'Norvenich',\n\t'Jaruco',\n\t'Stockelsdorf',\n\t'Moron de la Frontera',\n\t'Dalmine',\n\t'Le Pont-de-Claix',\n\t'Ambahy',\n\t'Fianga',\n\t'Pinecrest',\n\t'San Bonifacio',\n\t'Carpinteria',\n\t'Stip',\n\t'Ergolding',\n\t'Lokossa',\n\t'Siniloan',\n\t'Seeheim-Jugenheim',\n\t'Nottingham',\n\t'Abrantes',\n\t'San Felipe Jalapa de Diaz',\n\t'Boninal',\n\t'Digor',\n\t'Hosur',\n\t'Trepuzzi',\n\t'Koidu',\n\t'Kumta',\n\t'Paracatu',\n\t'Shinkai',\n\t'Thuan An',\n\t'Pokaran',\n\t'Betzdorf',\n\t'Binde',\n\t'Ghazni',\n\t'Vembur',\n\t'Pontivy',\n\t'Juterbog',\n\t'Sheerness',\n\t'Chhindwara',\n\t'Alagoinhas',\n\t'Itabira',\n\t'San Jose Ojetenam',\n\t'Mazatenango',\n\t'Nabinagar',\n\t'Manavgat',\n\t'Ovenden',\n\t'Lagkadas',\n\t'Gaildorf',\n\t'Chirpan',\n\t'Vidalia',\n\t'Maracaju',\n\t'Pindwara',\n\t'Nova Dubnica',\n\t'Mokarrampur',\n\t'Bocaue',\n\t'Warsop',\n\t'Florida',\n\t'Gangajalghati',\n\t'Monte Alegre do Sul',\n\t'Kibi',\n\t'Pirakkad',\n\t'Bani `Ubayd',\n\t'Tiberias',\n\t'Palombara Sabina',\n\t'Rongat',\n\t'Wabagai',\n\t'Maceio',\n\t'Agliana',\n\t'Bell',\n\t'Yosano',\n\t'Potiragua',\n\t'Mannamangalam',\n\t'Yerevan',\n\t'Valledupar',\n\t'Faversham',\n\t'Xavantes',\n\t'Embrach',\n\t'Desanagi',\n\t'Ciudad de Ceuta',\n\t'Contagem',\n\t'As Sib',\n\t'Kulgam',\n\t'Kanigiri',\n\t'Kuljibrin',\n\t'Palm Beach Gardens',\n\t'Mugnano di Napoli',\n\t'Chunian',\n\t'Merzig',\n\t'Dhilwan Kalan',\n\t'Stainz',\n\t'Betera',\n\t'Vallur',\n\t'Seva',\n\t'Puerto Lopez',\n\t'Inekar',\n\t'Suong',\n\t'Tiruvottiyur',\n\t'Baghlan',\n\t'Ilo',\n\t'Bautzen',\n\t'Koutiala',\n\t'Allahabad',\n\t'Lhokseumawe',\n\t'San Juan del Sur',\n\t'Taua',\n\t'Sapa Sapa',\n\t'Otuke',\n\t'Sabra',\n\t'Kutahya',\n\t'Coccaglio',\n\t'Mamun',\n\t'Billerbeck',\n\t'Weil am Rhein',\n\t'Lajia',\n\t'Argentan',\n\t'Ninheira',\n\t'Aranya Kalan',\n\t'Lumding',\n\t'Comendador Levy Gasparian',\n\t'Lilongwe',\n\t'Cerro Largo',\n\t'Oosterhout',\n\t'Oswestry',\n\t'Gaspar',\n\t'Videle',\n\t'Maumelle',\n\t'Azezo',\n\t'Osuna',\n\t'Pulla',\n\t'Yangshuling',\n\t'Khirkiyan',\n\t'Hamilton',\n\t'Kalgoorlie',\n\t'Rejiche',\n\t'Aylesford',\n\t'Nagaoka',\n\t'Monterey Park',\n\t'Potavaram',\n\t'Jequeri',\n\t'Boisbriand',\n\t'Meliana',\n\t'Quilenda',\n\t'Santa Leopoldina',\n\t'Lakeland',\n\t'Eatontown',\n\t'Basilisa',\n\t'Wernau',\n\t'Sassenheim',\n\t'Twistringen',\n\t'Talitay',\n\t'East Wenatchee',\n\t'Jinbi',\n\t'`Anbarabad',\n\t'Shimanto',\n\t'Caputira',\n\t'Goppingen',\n\t'Turuttikkara',\n\t'Zhongtai',\n\t'San Francisco Zapotitlan',\n\t'Hazebrouck',\n\t'Clemencia',\n\t'Surandai',\n\t'Khijri',\n\t'Jacarezinho',\n\t'Lunsar',\n\t'Ouled Sidi Brahim',\n\t'Chaqra',\n\t'Distraccion',\n\t'Eppelborn',\n\t'Vakhrusheve',\n\t'San Carlos del Zulia',\n\t'Khairpur Tamewah',\n\t'Shongzhy',\n\t'Ban Bang Kaeo',\n\t'Murillo',\n\t'Ban Mai',\n\t'Lakoucun',\n\t'Kottaikuppam',\n\t'Sini',\n\t'Karditsa',\n\t'Penumur',\n\t'Ramos',\n\t'Arauco',\n\t'Chatayamangalam',\n\t'Nieuw-Lekkerland',\n\t'Ixhuatlan del Sureste',\n\t'Bog Walk',\n\t'Daltonganj',\n\t'Guamo',\n\t'Kiklah',\n\t'Bongouanou',\n\t'Las Pinas City',\n\t'Narni',\n\t'Olesa de Montserrat',\n\t'Barrancabermeja',\n\t'Souama',\n\t'Sokolow Podlaski',\n\t'Katakwi',\n\t'Sunset',\n\t'Dilawarpur',\n\t'Telagh',\n\t'Caapiranga',\n\t'Pavittiram',\n\t'Yunzhong',\n\t'Paicandu',\n\t'Farafangana',\n\t'Zawyat Sidi Ben Hamdoun',\n\t'Bosilegrad',\n\t'Cabanaquinta',\n\t'Eaubonne',\n\t'El Paujil',\n\t'Matca',\n\t'Rawdon',\n\t'Tongoma',\n\t'Monsefu',\n\t'Itaguara',\n\t'Mihama',\n\t'Alengad',\n\t'Zhumadian',\n\t'Schlieren',\n\t'Murree',\n\t'Seto',\n\t'Yenipazar',\n\t'Kharak Kalan',\n\t'Ambares-et-Lagrave',\n\t'Kawlin',\n\t'Sainte-Julienne',\n\t'Khagaul',\n\t'Dyersburg',\n\t'Ekuvukeni',\n\t'Virginopolis',\n\t'Zhenzhou',\n\t'Jiashizhuangcun',\n\t'Changchong',\n\t'Notodden',\n\t'Stephenville',\n\t'Rellingen',\n\t'Keolari',\n\t'Los Alcarrizos',\n\t'Brake',\n\t'Yuzawa',\n\t'Cabatuan',\n\t'Kanegasaki',\n\t'Vohiposa',\n\t'Arequipa',\n\t'Antseza',\n\t'Puspokladany',\n\t'Natick',\n\t'Astrea',\n\t'Auchel',\n\t'Aquidauana',\n\t'Mohlin',\n\t'Redcar',\n\t'Brookline',\n\t'Jekabpils',\n\t'Melville',\n\t'Pintadas',\n\t'Manfalut',\n\t'Aasiaat',\n\t'Sao Borja',\n\t'Ransiki',\n\t'Ibipetuba',\n\t'Kuala Lumpur',\n\t\"Tong'anyi\",\n\t'Eklahra',\n\t'Satara',\n\t'Pupri',\n\t'Gualcince',\n\t'Friedberg',\n\t'Sinnai',\n\t'Saynshand',\n\t'Bupoto',\n\t'Kalanjur',\n\t'Hilversum',\n\t'Shobara',\n\t'Mahaplag',\n\t'Puturge',\n\t'Oued Jdida',\n\t'Melnik',\n\t'Pointe-Noire',\n\t'Tipton',\n\t'Tekari',\n\t'Ounagha',\n\t'Cavriago',\n\t'Lupon',\n\t'Paoay',\n\t'Follonica',\n\t'Bhachhi Asli',\n\t'Hofheim',\n\t'Kasukabe',\n\t'Viligili',\n\t'Tinton Falls',\n\t'Limay',\n\t'Pauktaw',\n\t'Sedziszow Malopolski',\n\t'Citrus',\n\t'Chirongui',\n\t'Mitane',\n\t'Payimattam',\n\t'Pajaros',\n\t'Gelves',\n\t'Tupi Paulista',\n\t'Pokhuria',\n\t'Thetford Mines',\n\t'Iselin',\n\t'Bandar Murcaayo',\n\t'Taungoo',\n\t'Hikawadai',\n\t'Los Santos',\n\t'Marbella',\n\t'Vranje',\n\t'Squamish',\n\t'Mahthi',\n\t'Toura',\n\t'Cicciano',\n\t'Wernigerode',\n\t'Xiaobazi',\n\t'Reforma',\n\t'Ispir',\n\t'Ntcheu',\n\t'Samboan',\n\t'Kelamangalam',\n\t'Diglipur',\n\t'Malkhaid',\n\t'Tomakomai',\n\t'Vidhareidhi',\n\t'Rio Grande City',\n\t'Puerto Libertador',\n\t'Ariccia',\n\t'Mashhad',\n\t'Renkum',\n\t'Sakabansi',\n\t'Dandeli',\n\t'Gahanna',\n\t'Waupun',\n\t'Sonoma',\n\t'Kutchan',\n\t'Phetchabun',\n\t'Bischwiller',\n\t'Barotac Viejo',\n\t'Giresun',\n\t'Caieiras',\n\t'Rodeiro',\n\t'Guabo',\n\t'Kusti',\n\t'Ketou',\n\t'Oestrich-Winkel',\n\t'Cayce',\n\t'Sume',\n\t'Yaese',\n\t'Zemamra',\n\t'Spring Garden',\n\t'Sheron',\n\t'Karnawad',\n\t'Neu-Ulm',\n\t'Grafelfing',\n\t'Costa Mesa',\n\t'Wangjia',\n\t'Joaquim Gomes',\n\t'Al Qurnah',\n\t'Naivasha',\n\t'Borgerhout',\n\t'Santa Rosalia',\n\t'Corocoro',\n\t'Liskeard',\n\t'Kruibeke',\n\t'Mingaora',\n\t'Latauna',\n\t'Sepolno Krajenskie',\n\t'Madison',\n\t'Berkane',\n\t'San Giovanni Rotondo',\n\t'Siwah',\n\t'Aldeia de Paio Pires',\n\t'Krosno Odrzanskie',\n\t'Zriba-Village',\n\t'Tampico',\n\t'Gastre',\n\t'Katrineholm',\n\t'Joao Pinheiro',\n\t'Martensville',\n\t'Karakocan',\n\t'San Antero',\n\t'Pocinhos',\n\t'Erravaram',\n\t'Ogaki',\n\t'Ezzhiliga',\n\t'Dimmbal',\n\t'Torul',\n\t'Darlaston',\n\t'Itapissuma',\n\t'Mragowo',\n\t'Buton',\n\t'Villach',\n\t'Xinzhancun',\n\t'Rusape',\n\t'Ialoveni',\n\t'Biltine',\n\t'Alukkuli',\n\t'Panpuli',\n\t'Barili',\n\t'Kempen',\n\t\"`Alem T'ena\",\n\t'Wustermark',\n\t'Murnau am Staffelsee',\n\t'El Ghomri',\n\t'Kambhaladinne',\n\t'Ciego de Avila',\n\t'Khoragachhi',\n\t'Tiburon',\n\t'Ohata',\n\t'San Martin Zapotitlan',\n\t'Priego de Cordoba',\n\t\"Mun'gyong\",\n\t'Placetas',\n\t'Comodoro Rivadavia',\n\t'Goluwali',\n\t'Janglot',\n\t'Ammanford',\n\t'Juquia',\n\t'Parapua',\n\t'Mitchell',\n\t'Lincoln',\n\t'Kafr Sa`d',\n\t'Dhanwada',\n\t'Vergiate',\n\t'Son Servera',\n\t'Uto',\n\t'Gesuba',\n\t'Jamaat Shaim',\n\t'Basirhat',\n\t'Dalain Hob',\n\t'Bishenpur',\n\t'Regensburg',\n\t'Altensteig',\n\t'Kekem',\n\t'Sanwal',\n\t'Palankottai',\n\t'Raquira',\n\t'Antsahanoro',\n\t'Cerignola',\n\t'Beesel',\n\t'Burj al `Arab',\n\t'Rantepao',\n\t'Ankadindambo',\n\t'Jinotega',\n\t'Hechingen',\n\t'Ingersoll',\n\t'Vitoria da Conquista',\n\t'Parma',\n\t'Vaciamadrid',\n\t'Daita',\n\t'Santa Catarina Juquila',\n\t'Kozje',\n\t'Hagen',\n\t'Pargi',\n\t'Porto Nacional',\n\t'Krishnarajpur',\n\t'Huazangsi',\n\t'Blida',\n\t'Majra',\n\t'Sahasoa',\n\t'Inzai',\n\t'Murrysville',\n\t'Jalalpur',\n\t'Belakoba',\n\t'Ichalkaranji',\n\t'Almagro',\n\t'Vassouras',\n\t'Taubate',\n\t'Sarrat',\n\t'Jupiter',\n\t'Icara',\n\t'Avrankou',\n\t'Brick',\n\t\"Giv`at Shemu'el\",\n\t'Bargarh',\n\t'Wang Tau Hom',\n\t'Teixeira',\n\t'Darmstadt',\n\t'Kasuya',\n\t'Periya Pattanam',\n\t'Dangbo',\n\t'El Viejo',\n\t'Xapuri',\n\t'Woodbury',\n\t'Pampatar',\n\t'Waspan',\n\t'Samabouro',\n\t'Al Ahad al Masarihah',\n\t'Koath',\n\t'Gwanda',\n\t'Vinhais',\n\t'Islahiye',\n\t'Mogpog',\n\t'Bayt Jala',\n\t'Nagireddipalli',\n\t'Miami Beach',\n\t'Conversano',\n\t'Quartier Militaire',\n\t'Cauto Cristo',\n\t'Arhribs',\n\t\"Villa O'Higgins\",\n\t'Orange Walk',\n\t'Dharmavaram',\n\t'Paraiso do Tocantins',\n\t'Calolziocorte',\n\t'Capitan Sarmiento',\n\t'Tyagadurgam',\n\t'Vendram',\n\t'Harstad',\n\t'Caldogno',\n\t'Tlaxcoapan',\n\t'Jiangjiafan',\n\t'Arta',\n\t'Jacona de Plancarte',\n\t'Sarpol-e Zahab',\n\t'Nahuala',\n\t'Boa Esperanca',\n\t'Mealhada',\n\t'Troutdale',\n\t'Wharton',\n\t'Tournon-sur-Rhone',\n\t'Casino',\n\t'Saint-Lin--Laurentides',\n\t'Jaco',\n\t'Evander',\n\t'Figeac',\n\t'Elukone',\n\t'Camocim',\n\t'Sahpur',\n\t'Lower Tungawan',\n\t'Vengur',\n\t'Miraima',\n\t'Ximeicun',\n\t'Hoogland',\n\t'Weimar',\n\t'Kokkola',\n\t'Atiquizaya',\n\t'Oldenburg in Holstein',\n\t'Kulattuppalaiyam',\n\t'Ramada',\n\t'Itampolo',\n\t'Bommarbettu',\n\t'Piove di Sacco',\n\t'Kanavaypatti',\n\t'Ise',\n\t\"Oktyabr'sk\",\n\t'Tigzirt',\n\t'Oulad Amrane',\n\t'Kundal',\n\t'Cheria',\n\t'Kalchini',\n\t'Dschang',\n\t'Bentiu',\n\t'Emboscada',\n\t'Sangram',\n\t'Plerin',\n\t'Kezi',\n\t'Grobenzell',\n\t'Tomino',\n\t'Santa Cruz do Rio Pardo',\n\t'Isorana',\n\t'Al Qbab',\n\t'Sleepy Hollow',\n\t'Dehloran',\n\t'Taixi',\n\t'Noamundi',\n\t'Ankilimalinika',\n\t'Hwasu-dong',\n\t'San Bruno',\n\t'Dijon',\n\t'Yiyang',\n\t'Guntakal',\n\t'Suluova',\n\t'Kottacheruvu',\n\t'Ludwigshafen',\n\t'Ghargaon',\n\t'Rosa',\n\t'Sual',\n\t'Miller Place',\n\t'Dronten',\n\t'Dobbs Ferry',\n\t'Santa Marta',\n\t'Khopoli',\n\t'Kelilalina',\n\t'Bela Cruz',\n\t'Klela',\n\t'Santomera',\n\t'Chortoq',\n\t'Kemp Mill',\n\t'Mae Rim',\n\t'Yalvac',\n\t'Meridiala',\n\t'Itaporanga',\n\t'Macerata Campania',\n\t'Maxeville',\n\t'Sierra Colorada',\n\t'Ginatilan',\n\t'Fortaleza',\n\t'Tenmalai',\n\t'Oyonnax',\n\t'Taishi',\n\t'Krapkowice',\n\t'Sojitra',\n\t\"Alamat'a\",\n\t'Flemalle-Haute',\n\t'Jeannette',\n\t'Edessa',\n\t'Fairview Park',\n\t'Pabianice',\n\t'An Nayrab',\n\t'Gussago',\n\t'Aridagawa',\n\t'Inebolu',\n\t'Ponte Buggianese',\n\t'Comallo',\n\t'Handeni',\n\t'Kadogawa',\n\t'Vesala',\n\t'Santana do Manhuacu',\n\t'Vicente Guerrero',\n\t'Trnovska Vas',\n\t'Franklin Square',\n\t'Hessle',\n\t'Tuvur',\n\t'Les Mureaux',\n\t'Rikuzen-Takata',\n\t'Shahmirzad',\n\t'Irshava',\n\t'Almirante Tamandare',\n\t'Bhairapura',\n\t'Grand Forks',\n\t'Adolfo Gonzales Chaves',\n\t'Donmatias',\n\t'Jobat',\n\t'Jami',\n\t'Norfolk',\n\t'Kasagi',\n\t'Senador Canedo',\n\t'Bhabanipur',\n\t'Danville',\n\t'Guaraciaba do Norte',\n\t'Perez',\n\t'Akaiwa',\n\t'Santa Cruz do Monte Castelo',\n\t'Deerlijk',\n\t'Key West',\n\t'Somandepalle',\n\t'Bartoszyce',\n\t'Tsuiki',\n\t'Hillegom',\n\t\"Qa'emiyeh\",\n\t'Sahidganj',\n\t'Terrier Rouge',\n\t'Marikina City',\n\t'Vinzons',\n\t'Makouda',\n\t'Conceicao da Barra',\n\t'Tebesbest',\n\t'Hachinohe',\n\t'Carora',\n\t'Luckeesarai',\n\t'Castelo',\n\t'Bommagondanahalli',\n\t'Kutavur',\n\t'Bedworth',\n\t'Laarne',\n\t'East Grand Rapids',\n\t'Itatiba',\n\t'Pineville',\n\t'Banhatti',\n\t'Thiotte',\n\t'San Martin de las Piramides',\n\t'Puconci',\n\t'Saidpur Dabra',\n\t'Xaghra',\n\t'Zhuhai',\n\t'Altamonte Springs',\n\t'Warminster',\n\t'Zollikon',\n\t'Patiala',\n\t'Oxted',\n\t'Gornja Radgona',\n\t'Bade',\n\t'Dahe',\n\t'Risca',\n\t'Puxinana',\n\t'Mixtla de Altamirano',\n\t'Haderslev',\n\t'Sun Village',\n\t'Mahazoarivo',\n\t'Asara',\n\t'Tortosa',\n\t'Bellmead',\n\t'San Marino',\n\t'Khrestivka',\n\t'Usuki',\n\t'Yasynuvata',\n\t'North Valley',\n\t'Chennur',\n\t'Bishnupur',\n\t'Fanzhao',\n\t'Oltinko`l',\n\t'El Carmen',\n\t'Lagawe',\n\t'Argentona',\n\t'Torgau',\n\t'Tiflet',\n\t'Xincun',\n\t'Thap Khlo',\n\t'Havant',\n\t'Sulingen',\n\t'Apt',\n\t'Sabana de Torres',\n\t'Qyzylorda',\n\t'Hebburn',\n\t'Katerini',\n\t'Werota',\n\t'Taishan Houcun',\n\t'Zefyri',\n\t'Akseki',\n\t'Nkawkaw',\n\t'Sabangan',\n\t'West Sacramento',\n\t'Calandala',\n\t'Charcas',\n\t'Ash Shaykh `Uthman',\n\t'Mahajeran-e Kamar',\n\t'Toundout',\n\t'Mainvilliers',\n\t'Kronach',\n\t'Jayal',\n\t'Ruthen',\n\t'Kamenz',\n\t'Cayirova',\n\t'Temple',\n\t'Sammamish',\n\t'Agstafa',\n\t'Gleno',\n\t'Sattahip',\n\t'Kichha',\n\t'Tartagal',\n\t'Pingliang',\n\t'Ganvie',\n\t'Zapotiltic',\n\t'Temsamane',\n\t'Gyegu',\n\t'Shangqiu',\n\t'Niquen',\n\t'Baotou',\n\t'Orzesze',\n\t'Ghanzi',\n\t'Manikkal',\n\t'Zaraza',\n\t'Sarbisheh',\n\t'Mabehiri',\n\t'Clitheroe',\n\t'Jastrebarsko',\n\t'Frydek-Mistek',\n\t'Taxila',\n\t'Valencia West',\n\t'Ambalaroka',\n\t'Fouriesburg',\n\t'Ojuelos de Jalisco',\n\t'Saurimo',\n\t'Bereket',\n\t'Ledbury',\n\t'Lenexa',\n\t'Bakhor',\n\t'Come',\n\t'Tonk Khurd',\n\t'Chak Jhumra',\n\t'Qarah',\n\t'Macaparana',\n\t'Dormagen',\n\t'Kamirenjaku',\n\t'Nhlangano',\n\t'Loughton',\n\t'Carcarana',\n\t'Bahawalpur',\n\t'Hengshui',\n\t'Pointe-a-Pitre',\n\t'Louvain-la-Neuve',\n\t'Lindong',\n\t'Elsfleth',\n\t'Gangavalli',\n\t'Aguelmous',\n\t'Termas de Rio Hondo',\n\t'Nueva Paz',\n\t'Karuvellur',\n\t'Dholka',\n\t'Dishashah',\n\t'Neropolis',\n\t'Ourilandia do Norte',\n\t'Gorna Oryahovitsa',\n\t'Dangyang',\n\t'Raiganj Bazar',\n\t'Piliv',\n\t'Chosei',\n\t'Chambas',\n\t'Ringwood',\n\t'Bongaigaon',\n\t'Polignano a Mare',\n\t'Naranda',\n\t'Mondai',\n\t'Babadag',\n\t'Nattam',\n\t'Crosne',\n\t'Ananipalle',\n\t'Sorata',\n\t'Collipulli',\n\t'Famenin',\n\t'Waddinxveen',\n\t'Koratgi',\n\t'Mojokerto',\n\t'Moreno Valley',\n\t'Baltit',\n\t'Wokha',\n\t'Salzwedel',\n\t'Shangtangcun',\n\t'Stahnsdorf',\n\t'Jetpur',\n\t'Vellallur',\n\t'Drouin',\n\t'Tochigi',\n\t'Kaniyambadi',\n\t'Aran Bidgol',\n\t'Park Ridge',\n\t'Ammon',\n\t'Guipavas',\n\t'Miaoli',\n\t'Monchengladbach',\n\t'Sulahpet',\n\t'McMinns Lagoon',\n\t'Palangotu Adwar',\n\t'Delray Beach',\n\t'Singura',\n\t'Oakland Park',\n\t'Goonellabah',\n\t'Drezdenko',\n\t'Athurugiriya',\n\t'Aizumi',\n\t'Maria la Baja',\n\t'Toshloq',\n\t'Pale',\n\t'Burhar',\n\t'Murrieta',\n\t'Loufan',\n\t'Kibungo',\n\t'Doi Lo',\n\t'New Bedford',\n\t'Srinivaspur',\n\t'Atru',\n\t'Mataili Khemchand',\n\t'Ashibetsu',\n\t'Hansi',\n\t'Bacong',\n\t'Rukhae',\n\t'Kosching',\n\t'Addison',\n\t'Rangpur',\n\t'Toppenish',\n\t'Eyvanekey',\n\t'Girardot',\n\t'Piravanthur',\n\t'Korem',\n\t'Porto Torres',\n\t'Lagoa Grande',\n\t'Aratuba',\n\t'Hadithah',\n\t'Bel Air South',\n\t'Buluko',\n\t'Ambala',\n\t'Baie du Tombeau',\n\t'El Cairo',\n\t'Caluire-et-Cuire',\n\t'Caluya',\n\t'Ponedera',\n\t'Ban Bang Mae Nang',\n\t'Leer',\n\t'Kissing',\n\t'Shamalgan',\n\t\"'s-Heerenberg\",\n\t'Miguel Calmon',\n\t'Bar',\n\t'Birak',\n\t'Igana',\n\t'Onnaing',\n\t'Sveta Trojica v Slovenskih Goricah',\n\t'Boca do Acre',\n\t'Amaravati',\n\t'Dhulkot',\n\t'Joubb Jannine',\n\t'Edeia',\n\t'Toda',\n\t'Okinoshima',\n\t'Murra',\n\t'East Renton Highlands',\n\t'Badshahpur',\n\t'Lalgudi',\n\t'Bomareddipalli',\n\t'Curaca',\n\t'Zetale',\n\t'Yuci',\n\t'Levittown',\n\t'Linbian',\n\t'Toyooka',\n\t'Krugersdorp',\n\t'Northfleet',\n\t'McKee City',\n\t'Atescatempa',\n\t'Dundo',\n\t'Sarableh',\n\t'Santo Domingo',\n\t'Lucca',\n\t'Le Chambon-Feugerolles',\n\t'Kanyato',\n\t'Sokoura',\n\t'Ponte de Lima',\n\t'Kafr Laha',\n\t'Covenas',\n\t'Shchastia',\n\t'Bamenda',\n\t'Tolmin',\n\t'Ottakkadai',\n\t'Palmetto Bay',\n\t'Castrop-Rauxel',\n\t'Barra dos Coqueiros',\n\t'Mahdishahr',\n\t'Angra do Heroismo',\n\t'Chulucanas',\n\t'Haslev',\n\t'Cahul',\n\t'Luocheng',\n\t'Asyut',\n\t'Muping',\n\t'Country Club Hills',\n\t'Ambondro',\n\t'Nakayama',\n\t'Boljevac',\n\t'Chaman',\n\t'Birqash',\n\t'Ghat',\n\t'Cungus',\n\t'Cuyapo',\n\t'Kissane Ltouqi',\n\t'Mexborough',\n\t'Mansinghpur Bijrauli',\n\t'Komlo',\n\t'Boissy-Saint-Leger',\n\t'Sabinopolis',\n\t'Talkhvoncheh',\n\t\"'s-Gravendeel\",\n\t'Malkara',\n\t'Glace Bay',\n\t'San Andres Sajcabaja',\n\t'Pforzheim',\n\t'Wombwell',\n\t'New Hanover',\n\t'Schneverdingen',\n\t'Vidisha',\n\t'Neubiberg',\n\t'Banu Chhapra',\n\t'Pamidi',\n\t'Benkovac',\n\t'Cocoa',\n\t'Stawell',\n\t'Saint-Quentin',\n\t'Northdale',\n\t'Clermont',\n\t'Don Torcuato',\n\t'Hanchuan',\n\t'Hessisch Lichtenau',\n\t'Jena',\n\t'Tursunzoda',\n\t'Avintes',\n\t'Burela de Cabo',\n\t'Gladenbach',\n\t'Myszkow',\n\t'Quiroga',\n\t'Azove',\n\t'Sao Geraldo',\n\t'Penrith',\n\t'Arenapolis',\n\t'Miyada',\n\t'Jurbarkas',\n\t'Matias Olimpio',\n\t'Bindki',\n\t'Ditzingen',\n\t'Babaeski',\n\t'Lyngdal',\n\t'Baarn',\n\t'Xinmin',\n\t'Sondho Dullah',\n\t'San Onofre',\n\t'Halawah',\n\t'Soran',\n\t'Suihua',\n\t'Perere',\n\t'Ban Thum',\n\t'Massy',\n\t'Delta',\n\t'Qom',\n\t'Eldoret',\n\t'Tournavista',\n\t'Cangas',\n\t'Juchen',\n\t'Pattikonda',\n\t'Cacuaco',\n\t'Kamisato',\n\t'Ilarionove',\n\t'Spijkenisse',\n\t'Anavatti',\n\t'Seringueiras',\n\t'Beipiao',\n\t'Kouribga',\n\t'Kirangur',\n\t'Bismarck',\n\t'Ahaus',\n\t'Barajor',\n\t'Canta',\n\t'Sierre',\n\t'Gopalpur',\n\t'Fremont',\n\t'Baixa Grande',\n\t'Apolo',\n\t'Xigujing',\n\t'Vevcani',\n\t'Madhura',\n\t'Feucht',\n\t'Fehmarnsund',\n\t'Cesme',\n\t'Nerviano',\n\t'Brownsweg',\n\t'Baynala',\n\t'Ky Anh',\n\t'Khunti Dhanaili',\n\t'Arjona',\n\t'Ciudad Sandino',\n\t'Lyantonde',\n\t'Pililla',\n\t\"Santa Croce sull' Arno\",\n\t'Liangshi',\n\t'Pirkkala',\n\t'Saligrama',\n\t'Odugattur',\n\t'Pullanvidudi',\n\t'Fort Irwin',\n\t'Veliko Gradiste',\n\t'Culiacan',\n\t'Singa',\n\t\"Conde-sur-l'Escaut\",\n\t'North Fort Myers',\n\t'Martinez',\n\t'Raisinghnagar',\n\t'Heubach',\n\t'Accokeek',\n\t'Citta di Castello',\n\t'Sint-Genesius-Rode',\n\t'Iruma',\n\t'Curico',\n\t'Pitlam',\n\t'Niamey',\n\t'Araci',\n\t'Zaozhuang',\n\t'Az Zahiriyah',\n\t'Takouta',\n\t'Douar Bouchfaa',\n\t'Mirna',\n\t'Aron',\n\t'Firminopolis',\n\t'Niederwerrn',\n\t'Chandi',\n\t'Parana',\n\t'Bom Jesus do Galho',\n\t'Boussu',\n\t'General Nakar',\n\t'Elancourt',\n\t'Tirodi',\n\t'Cosenza',\n\t'Sooke',\n\t'Alga',\n\t'Duruma',\n\t'`Amuda',\n\t'Aburi',\n\t'Short Hills',\n\t'Haripura',\n\t'Granada',\n\t'The Mumbles',\n\t'Yadavolu',\n\t'East Honolulu',\n\t'Vellalapuram',\n\t'Boufarik',\n\t'Oer-Erkenschwick',\n\t'Terkuvenganallur',\n\t'Orodara',\n\t'Didouche Mourad',\n\t'Stapleford',\n\t'Iles',\n\t'Cantilan',\n\t'Kennebunk',\n\t'Urasoe',\n\t'Singosari',\n\t'Onda',\n\t'Rushall',\n\t'Bukhara',\n\t'Ibbenburen',\n\t'Epsom',\n\t'Glendale Heights',\n\t'Ubai',\n\t'Chatra',\n\t'Ranavav',\n\t'Chevilly-Larue',\n\t'Kemijarvi',\n\t'Ungoofaaru',\n\t'Zaouiat Moulay Bouchta El Khammar',\n\t'Vinaninkarena',\n\t'Zaleze',\n\t'Zelenikovo',\n\t'Newfane',\n\t'Langedijk',\n\t'Orly',\n\t'Berchha',\n\t'Guimba',\n\t'Gamboula',\n\t'Alakamisy Itenina',\n\t'Alotau',\n\t'Sothgaon',\n\t'Bockum',\n\t'Sawai Madhopur',\n\t'Lahan',\n\t'Santa Ignacia',\n\t'Modesto',\n\t'Jales',\n\t'Baragaon',\n\t'Huarmey',\n\t'North Ridgeville',\n\t'Kolomyia',\n\t'San Martin de los Andes',\n\t'Saboeiro',\n\t'Bucay',\n\t'Xexeu',\n\t'Santo Stino di Livenza',\n\t'Boca Chica',\n\t'Keskin',\n\t'Namtu',\n\t'Nyenga',\n\t'Carlow',\n\t'Medemblik',\n\t'Cadoneghe',\n\t'Hagondange',\n\t'Zozocolco de Hidalgo',\n\t'Desamparados',\n\t'Bengonbeyene',\n\t'Bou Zemou',\n\t'Bellary',\n\t'Bremen',\n\t'Fitzgerald',\n\t'Finale Emilia',\n\t'Bilgi',\n\t'Starobilsk',\n\t'Korangal',\n\t'Ingeniero Maschwitz',\n\t'Akat Amnuai',\n\t'Afua',\n\t'Dondon',\n\t'Dhangaraha',\n\t'Avellaneda',\n\t'Castelfranco di Sopra',\n\t'Bang Racham',\n\t'Bisaul',\n\t'Persan',\n\t'Palaw',\n\t'Manja',\n\t'Lindesberg',\n\t'Halton Hills',\n\t'Mandaon',\n\t'Ratingen',\n\t'Staszow',\n\t'Sitakili',\n\t'Niebull',\n\t'Malabo',\n\t'Berceni',\n\t'Floha',\n\t'Wiltz',\n\t'Anamoros',\n\t'Banqiao',\n\t'Afgooye',\n\t'Druzhba',\n\t'Montevrain',\n\t'Socopo',\n\t'Logatec',\n\t'Prestatyn',\n\t'Lodhikheda',\n\t'Phuket',\n\t'Berriozabal',\n\t'Puan',\n\t'Brooklyn',\n\t'Casma',\n\t'New Square',\n\t'Lake Station',\n\t'San Juan de Rio Coco',\n\t'Korydallos',\n\t'Cubatao',\n\t'Stidia',\n\t'Kalamansig',\n\t'Amstetten',\n\t'Ventersburg',\n\t'Khovaling',\n\t'Millburn',\n\t'Halba',\n\t'Tenggarong',\n\t'Stelle',\n\t'Bacup',\n\t'Cacak',\n\t'Khamanon Kalan',\n\t'Fanyang',\n\t'Patikul',\n\t'Igarassu',\n\t'Lakeland Village',\n\t'Sanxing',\n\t'Kongsberg',\n\t'Harelbeke',\n\t'Chintalapudi',\n\t'Chinna Ganjam',\n\t'Utena',\n\t'Carai',\n\t'Calcoene',\n\t'Salgar',\n\t'Maardu',\n\t'Tarhunah',\n\t'Breaza',\n\t'Villamontes',\n\t'Vadakakarai',\n\t'Jaidte Lbatma',\n\t'Chautapal',\n\t'Dois Corregos',\n\t'Mahmudabad Nemuneh',\n\t'Raul Soares',\n\t'Walker Mill',\n\t'Qiaoyang',\n\t'Alachua',\n\t'Nailsea',\n\t'Ipaumirim',\n\t'Wakabadai',\n\t'Sebt Labrikiyne',\n\t'Anupshahr',\n\t'Calinog',\n\t'Hammamet',\n\t'Famagusta',\n\t'Norwich',\n\t'Little Falls',\n\t'Arealva',\n\t'Bad Schwalbach',\n\t'Dovzhansk',\n\t'Amiens',\n\t'Floridia',\n\t'Sukma',\n\t'Zoeterwoude',\n\t'Narahia',\n\t'Santo Nino',\n\t'Acate',\n\t'Zuromin',\n\t'Kagithane',\n\t'Quarrata',\n\t'Ivankiv',\n\t'Sougueur',\n\t'Ain Harrouda',\n\t'Temsia',\n\t'Yangjiang',\n\t'Baja',\n\t'Ampasina-Maningory',\n\t'Porto',\n\t'Kolavallur',\n\t'Dianbu',\n\t'Sakuragawa',\n\t\"L'Union\",\n\t'Prattipadu',\n\t'Mogosoaia',\n\t'Lija',\n\t'Dornbirn',\n\t'Madera Acres',\n\t'Munro Turuttu',\n\t'Ban Ao Nang',\n\t'Catubig',\n\t'Kibungan',\n\t'Cienfuegos',\n\t'Taza',\n\t'Zoma-Bealoka',\n\t'Zabid',\n\t'Sandare',\n\t'Labuleng',\n\t'Dresden',\n\t'The Valley',\n\t'Le Kram',\n\t'Shihe',\n\t'Zira',\n\t'Kurume',\n\t'Wengtiancun',\n\t'Mucuri',\n\t'Burnley',\n\t'Aborlan',\n\t'Allen',\n\t'Diriomo',\n\t'Metro',\n\t'Mandalgovi',\n\t'Etten-Leur',\n\t'Almeria',\n\t'Wootton',\n\t'Doukouya',\n\t'Ban Tha Khlong',\n\t'Trikala',\n\t'Hasanpura',\n\t'Gisborne',\n\t'Cooper City',\n\t'Mukasi Pidariyur',\n\t'Oulad Yaich',\n\t'Ibitita',\n\t'Majarhat',\n\t'Naas',\n\t'Sete Barras',\n\t'Ongata Rongai',\n\t'El Parral',\n\t'Hayrabolu',\n\t'Kasipalaiyam',\n\t'Jamaame',\n\t'Tripoli',\n\t'Ettapur',\n\t'Gurnee',\n\t'Ofunato',\n\t'Statesville',\n\t'Taiwa',\n\t'Boekenhouthoek',\n\t'Bandar-e Khamir',\n\t'Meningie',\n\t'Valle de La Pascua',\n\t'Vinhedo',\n\t'Ksar',\n\t'Al Mindak',\n\t'Blackrock',\n\t'Kaua Kol',\n\t'Ban Yaeng',\n\t'Kodaimangalam',\n\t'Brownsville',\n\t'Zhushan',\n\t'Vrede',\n\t'Pombas',\n\t'Albatera',\n\t'Puerto Narino',\n\t'Pakpattan',\n\t'Awfouss',\n\t'Santa Cruz de Los Taques',\n\t'Thi Tran Ngai Giao',\n\t'Pakkam',\n\t'Chibok',\n\t'Wollert',\n\t'Berisso',\n\t'Pocone',\n\t'Eindhoven',\n\t'Eramala',\n\t'Alphen aan den Rijn',\n\t'Kamuli',\n\t'Puerto Quijarro',\n\t'Manaus',\n\t'Burleson',\n\t'Topsham',\n\t'Maribondo',\n\t'Buta',\n\t'Tampamolon Corona',\n\t'Alagoinha',\n\t'Valljkkod',\n\t'Nilo Pecanha',\n\t'Chachahuantla',\n\t'Dax',\n\t'Texcatepec',\n\t'Horizontina',\n\t'Serra Negra',\n\t'Kolda',\n\t'Bee Ridge',\n\t'Nekarikallu',\n\t'Wasilla',\n\t'Vatana',\n\t'Bestobe',\n\t'Fatsa',\n\t\"Sao Joao d'Alianca\",\n\t'Sondrio',\n\t'Gorgonzola',\n\t'Nongstoin',\n\t'Yaguajay',\n\t'Solapur',\n\t'Abington',\n\t'Star',\n\t'Asuncion',\n\t'Valdosta',\n\t'Zhongtanying',\n\t'Rewahi',\n\t'Ankarana-Miraihina',\n\t'Debar',\n\t'Playa Grande',\n\t'Guabiruba',\n\t'Del Aire',\n\t'Tumen',\n\t'Perket',\n\t'Sinor',\n\t'Canford Cliffs',\n\t'Khorramdarreh',\n\t'Latehar',\n\t'Guerouma',\n\t'Pine Ridge',\n\t'Alba Iulia',\n\t'Qalansuwa',\n\t'Orocue',\n\t'Taraz',\n\t'Jesus Maria',\n\t'Langsa',\n\t'Trikkunnapuzha',\n\t'Nosy Varika',\n\t'Nishi',\n\t'Anjangaon',\n\t'Trebisacce',\n\t'Taucha',\n\t'Grosshansdorf',\n\t'Shirone',\n\t'Swakopmund',\n\t\"Bog'ot\",\n\t'Antenor Navarro',\n\t'Parsippany-Troy Hills',\n\t'East Northport',\n\t'Sur Singh',\n\t'Huy',\n\t'Gandikunta',\n\t'Tamarakulam',\n\t'Cerknica',\n\t'Hindaun',\n\t'Vichy',\n\t'Hilo',\n\t'Branson',\n\t'Kalimala',\n\t'Othello',\n\t'Dol',\n\t'Nanga Eboko',\n\t'Angical',\n\t'Plains',\n\t'Culpeper',\n\t'Famjin',\n\t'Watrap',\n\t'Basrur',\n\t'Aracoiaba da Serra',\n\t'Bretten',\n\t'Gavere',\n\t'Lingxi',\n\t'Doctor Juan Eulogio Estigarribia',\n\t'Aracatuba',\n\t'Fredonia',\n\t'Wittmund',\n\t'Hirao',\n\t'Elmshorn',\n\t'Pfullingen',\n\t'Temse',\n\t'Betim',\n\t'Bhiraha',\n\t'Taquara',\n\t'Orivesi',\n\t'Thanh Pho Uong Bi',\n\t'Kamalganj',\n\t'Manamadurai',\n\t'Sint-Kruis',\n\t'Sankaramangalam',\n\t'Evergreen Park',\n\t'Catigbian',\n\t'Auhar Sheikh',\n\t'Gornji Vakuf',\n\t'Obanazawa',\n\t'Casandrino',\n\t'Saquisili',\n\t'Narsinghgarh',\n\t'Mitcham',\n\t'Carmelo',\n\t'Green',\n\t'Ringsted',\n\t'Timmins',\n\t'Wobulenzi',\n\t'Haddington',\n\t'Lohna',\n\t'West Mifflin',\n\t'Al Musayyib',\n\t'Brugg',\n\t'Jyvaskyla',\n\t'Al Muharraq',\n\t'Heroica Caborca',\n\t'Mapandan',\n\t'Osimo',\n\t'Srem',\n\t'Caxito',\n\t'Tantega',\n\t'Mahajamba',\n\t'Stara Tura',\n\t'Palo Alto',\n\t'Miskolc',\n\t'Dharmapuri',\n\t'Krefeld',\n\t'Sibutao',\n\t'Itinga',\n\t'Kuacjok',\n\t'Zhaodong',\n\t'Ambikapur',\n\t'Cologno al Serio',\n\t'Agua Branca',\n\t'Barskoon',\n\t'Jora',\n\t'Ciudadela',\n\t'Yenice',\n\t'Anderlecht',\n\t'Sunny Isles Beach',\n\t'Pilikodu',\n\t'San Marzano di San Giuseppe',\n\t'Hunenberg',\n\t'Khandpara',\n\t'Bieber',\n\t'Timezgana',\n\t'Sam Phran',\n\t'Yuquan',\n\t'`Akko',\n\t'Ittikara',\n\t'Louveira',\n\t'Kalingiyam',\n\t'La Grande-Motte',\n\t'Maebara',\n\t'Billinghurst',\n\t'Bou Adel',\n\t'Leszno',\n\t'Inhumas',\n\t'Atoka',\n\t'Kerou',\n\t'Saint-Benoit',\n\t'Zhangzhou',\n\t'Belazao',\n\t'Senapparetti',\n\t'Cua',\n\t'Tangerang',\n\t'Zebbug',\n\t'Levanger',\n\t'Liminka',\n\t'Punceres',\n\t'Mavinpalli',\n\t'Jharsugra',\n\t'Hassan Abdal',\n\t'Karaburun',\n\t'Zazafotsy',\n\t'Simri Bakhriarpur',\n\t'Caprino Veronese',\n\t'Yorito',\n\t'Makaya',\n\t'Tenango de Doria',\n\t'Minamata',\n\t'Fujimino',\n\t'Vecchiano',\n\t'Tavas',\n\t'Punta Indio',\n\t'San Gregorio Atzompa',\n\t'Ambohimiarivo',\n\t'Hessisch Oldendorf',\n\t'Geretsried',\n\t'Calabozo',\n\t'Kara-Balta',\n\t'Pieta',\n\t'Grande Prairie',\n\t'Los Angeles',\n\t'Dingalan',\n\t'Potengi',\n\t'San Jose de Ocoa',\n\t'Suncheon',\n\t'Fornaka',\n\t'Rehti',\n\t'Bandixon',\n\t'Virapperumanallur',\n\t'North Lindenhurst',\n\t'Sainte-Julie',\n\t'Los Reyes de Salgado',\n\t'Pinamar',\n\t'Mayfield Heights',\n\t'Santa Apolonia',\n\t'Harpur Bhindi',\n\t'Campodarsego',\n\t'Urbana',\n\t\"Braine-l'Alleud\",\n\t'Wukari',\n\t'Martahalli',\n\t'Leppavirta',\n\t'Kastel Stari',\n\t'Sansare',\n\t'Braganca Paulista',\n\t'Bridgeport',\n\t'Cecina',\n\t'Ossett',\n\t'Chepica',\n\t'Koratagere',\n\t'Muthuswamipuram',\n\t'Kamigori',\n\t'Tuchola',\n\t'Fukang',\n\t'Balanga',\n\t'Isola Capo Rizzuto',\n\t'Galmaarden',\n\t'Heinola',\n\t'Gioia Tauro',\n\t'Zelfana',\n\t'Quarai',\n\t'Frauenfeld',\n\t'Makole',\n\t'Puerto Lempira',\n\t'Brandenburg',\n\t'Kot Radha Kishan',\n\t'Armazem',\n\t'Mahaboboka',\n\t'Jingjiazhuang',\n\t'Ongole',\n\t'Magalhaes de Almeida',\n\t'Darat `Izzah',\n\t'Longtian',\n\t'Ahualulco de Mercado',\n\t'Alexander City',\n\t'Iwai',\n\t'Coolbaugh',\n\t'Khambhaliya',\n\t'Narayanavanam',\n\t'Littleton',\n\t'Ciudad Lerdo',\n\t'Martin Coronado',\n\t'Vialonga',\n\t'Hamminkeln',\n\t'Arrah',\n\t'Pianco',\n\t'Villa Elisa',\n\t'Tawaramoto',\n\t'Skien',\n\t'Santa Clara La Laguna',\n\t'Takad Sahel',\n\t'Giardini',\n\t'Barbosa Ferraz',\n\t'Brevnov',\n\t'Fuenlabrada',\n\t'Birhana',\n\t'Kaberamaido',\n\t'Siocon',\n\t'Loja',\n\t'Midori',\n\t'Sambhu Chak',\n\t'Federacion',\n\t'Masan',\n\t'Lousada',\n\t'Laguna Salada',\n\t'Pooler',\n\t'Geisenfeld',\n\t'Orlandia',\n\t'El Castillo de La Concepcion',\n\t'Koriyama',\n\t'Altagracia',\n\t'Minalin',\n\t'San Feliu de Llobregat',\n\t'Uithoorn',\n\t'Rivadavia',\n\t'Castello de Ampurias',\n\t'Zhur',\n\t'Greenock',\n\t'Criuleni',\n\t'Nangola',\n\t'Claymont',\n\t'Sihecun',\n\t'Palmers Green',\n\t'Guatica',\n\t'Mandaue City',\n\t'Pharkia',\n\t'Cambui',\n\t'Placerville',\n\t'Junin de los Andes',\n\t'Omachi',\n\t'Gaspar Hernandez',\n\t'Valinda',\n\t'Fort Walton Beach',\n\t'Arttuvattala',\n\t'Mahela',\n\t'Dowa',\n\t'Kelme',\n\t'Chippenham',\n\t'Metahara',\n\t'Marovantaza',\n\t\"Saint David's\",\n\t'West Windsor',\n\t'Cleburne',\n\t'Itupiranga',\n\t'Trikarpur North',\n\t'Miyanaga',\n\t'Gandhari',\n\t'Tatarbunary',\n\t'Zholymbet',\n\t'Springwater',\n\t'Seekonk',\n\t'Groningen',\n\t'Chocaman',\n\t'Lianzhou',\n\t'Siggiewi',\n\t'Ig',\n\t'Sarh',\n\t'Al Hayy',\n\t'Chum Phae',\n\t'Meridjonou',\n\t'El Copey',\n\t'Salerno',\n\t'Antsampandrano',\n\t'Zahana',\n\t'Stuttgart',\n\t'Razan',\n\t'Hexiang',\n\t'North Merrick',\n\t'Hicksville',\n\t'Palmares Paulista',\n\t'Kalpi',\n\t'Sariyer',\n\t'Nandamuru',\n\t'Guidel',\n\t'Morinda',\n\t'Jinhe',\n\t'Yasinia',\n\t'Nova Friburgo',\n\t'Buriti Alegre',\n\t'Shahin Shahr',\n\t'Chivolo',\n\t'Gosforth',\n\t'Hunchun',\n\t'Gexianzhuang',\n\t'Mareno di Piave',\n\t'Montville',\n\t'Kikuyu',\n\t'Wauwatosa',\n\t'Dhalaa',\n\t'Villa del Carbon',\n\t'Tigbao',\n\t'Aidlingen',\n\t'Mekla',\n\t'Nieuwegein',\n\t'Geldern',\n\t'Pepillo Salcedo',\n\t'Belampalli',\n\t'Karakol',\n\t'Saint-Louis du Nord',\n\t'Bartabwa',\n\t'Zardab',\n\t'Kanakpur',\n\t'Dock Sur',\n\t'Todos Santos Cuchumatan',\n\t'Sunbat',\n\t'Matmata',\n\t'Le Passage',\n\t'Panr',\n\t'Galdacano',\n\t'Wa',\n\t'West Freehold',\n\t'Merville',\n\t'Sonderborg',\n\t'Corovode',\n\t'Tizgane',\n\t'Kadinhani',\n\t'Penalva',\n\t'Piqua',\n\t'Wenwu',\n\t'Castanuelas',\n\t'Jazan',\n\t'Nowe Miasto Lubawskie',\n\t'Velletri',\n\t'Cativa',\n\t'Niihama',\n\t'Carapebus',\n\t'Jai',\n\t'Sao Jose da Laje',\n\t'Southgate',\n\t'Ottaikkalmantapam',\n\t'Ladhuka',\n\t'Kulkent',\n\t'Mobetsu',\n\t'Pincourt',\n\t'Tagoloan',\n\t'Kiseljak',\n\t'Maryport',\n\t'Flores da Cunha',\n\t'Sao Jeronimo',\n\t'Ban Nong Han',\n\t'Kirk of Shotts',\n\t'Diyadin',\n\t'Uchti',\n\t'Marlboro Village',\n\t'El Consejo',\n\t'Dasraha Bhograjpur',\n\t'Hagenow',\n\t'Beniajan',\n\t'Halfway',\n\t'Jiming',\n\t'Antibes',\n\t'Manushmuria',\n\t'Nantucket',\n\t'La Mision',\n\t'Limbang',\n\t'Rubano',\n\t'Tchaourou',\n\t'Repatriacion',\n\t'Danyang',\n\t'Ad Duraykish',\n\t'Osterode',\n\t'Karvetnagar',\n\t'Secunda',\n\t'Kuhbanan',\n\t'Poissy',\n\t'Itupeva',\n\t'Liuhe',\n\t'New Smyrna Beach',\n\t'Okuta',\n\t'Shuangqiao',\n\t'Irati',\n\t'Lampa',\n\t'Gautampura',\n\t'Cacahoatan',\n\t'Mooirivier',\n\t'Spanaway',\n\t'Abu Hardub',\n\t'Bor',\n\t'Dingjiagouxiang',\n\t'Rehburg-Loccum',\n\t'Ambajogai',\n\t'Detmold',\n\t'Yuncheng',\n\t'Boyarka',\n\t'Eden',\n\t'Penne',\n\t'Barghat',\n\t'Ampahimanga',\n\t'Turkmenabat',\n\t'Zarqan',\n\t'Dover',\n\t'Sindirgi',\n\t'Panabo',\n\t'Holliston',\n\t'Tambolaka',\n\t'Ciudad Arce',\n\t'Nadbai',\n\t'Nova Era',\n\t'Bekodoka',\n\t'South Fayette',\n\t'Ampanavoana',\n\t'Mahbubabad',\n\t'Palkonda',\n\t'Alasehir',\n\t'Dongshicuo',\n\t'Uniondale',\n\t'Bhakua',\n\t'Damavand',\n\t'Kami-kawabe',\n\t'Deutschlandsberg',\n\t'Domahani',\n\t'Pallippatti',\n\t'Kaolack',\n\t'Bolhrad',\n\t'Murfreesboro',\n\t'Sankt Georgen im Schwarzwald',\n\t'Antanambe',\n\t'Macajuba',\n\t'Thies',\n\t'Tarlac City',\n\t'Taquaritinga',\n\t'City of Orange',\n\t'Glendora',\n\t'Tufanganj',\n\t'Claremore',\n\t'Zejtun',\n\t'Figueira da Foz',\n\t'Holmen',\n\t'Aiea',\n\t'Runkel',\n\t'Forbe Oroya',\n\t'Ondjiva',\n\t'Tosu',\n\t'Surinam',\n\t'Rahatgarh',\n\t'Winterswijk',\n\t'Sakiet ed Daier',\n\t'Kolonnawa',\n\t'Wawizaght',\n\t'Imisli',\n\t'Horokhiv',\n\t'Shenjiatun',\n\t'Lenguazaque',\n\t'Newington',\n\t'Lecheng',\n\t'Gamboma',\n\t'Manubolu',\n\t'Perumbalam',\n\t'Bougaribaya',\n\t'Dryden',\n\t'Kielce',\n\t'Edeleny',\n\t'Ouidah',\n\t'Comalapa',\n\t'Harrogate',\n\t'Qianwu',\n\t'Nguru',\n\t'South Daytona',\n\t'Corbin',\n\t'Abnub',\n\t'Saren',\n\t'Beydag',\n\t'Monthey',\n\t'Bonheiden',\n\t'August',\n\t'North Miami Beach',\n\t'Aulnay-sous-Bois',\n\t'Aaley',\n\t'Talne',\n\t'Kodungallur',\n\t'San Buenaventura',\n\t'Gerlingen',\n\t'West Earl',\n\t'Pacatu',\n\t'Hallein',\n\t'Nueva Ocotepeque',\n\t'Biassono',\n\t'Garfield Heights',\n\t'Motozintla',\n\t'Gerpinnes',\n\t'Mnasra',\n\t'Riohacha',\n\t'Etacheri',\n\t'Pudur',\n\t\"Sant'Antonio Abate\",\n\t'Steinhagen',\n\t'Sfax',\n\t'San Miguel Chicaj',\n\t'El Congo',\n\t'Falimari',\n\t'Pinhal Novo',\n\t'Ystrad Mynach',\n\t'Wangen im Allgau',\n\t'Qazmalar',\n\t'Severinia',\n\t'Nonea',\n\t'Dargecit',\n\t'Sukumo',\n\t'Cittadella',\n\t'Yamba',\n\t'Sao Luis de Montes Belos',\n\t'Suleswaranpatti',\n\t'Abu Tisht',\n\t'Ploermel',\n\t'Arvika',\n\t'Warud',\n\t'Mazatlan Villa de Flores',\n\t'Inga',\n\t'Jaworzno',\n\t'Canalete',\n\t'Balayan',\n\t'Ankazomborona',\n\t'Nadimpalem',\n\t'Illintsi',\n\t'Laives',\n\t'Juchitan de Zaragoza',\n\t'Ponot',\n\t'Annan',\n\t'Fiorentino',\n\t'Lambarkiyine',\n\t'Linluo',\n\t'Neu-Anspach',\n\t'Rio Maria',\n\t'South Venice',\n\t'Moranbah',\n\t'North Haledon',\n\t'Orchard Park',\n\t'Pico Truncado',\n\t'Gomez Palacio',\n\t'I-n-Amenas',\n\t'Barreiros',\n\t'San Mateo',\n\t'Harran',\n\t'Toccoa',\n\t'Ghoradal',\n\t'Medgidia',\n\t'Roermond',\n\t'Madinat al Habbaniyah',\n\t'San Agustin Tlaxiaca',\n\t'Nakodar',\n\t'La Baneza',\n\t'Citrus Park',\n\t'Guttal',\n\t'Lovington',\n\t'Carahue',\n\t'Vicosa do Ceara',\n\t'Saitama',\n\t'Whistler',\n\t'Amjhera',\n\t'Rio Brilhante',\n\t'Mora',\n\t'I-n-Salah',\n\t'Sao Joaquim do Monte',\n\t'Huanian',\n\t'Alcalde Diaz',\n\t'Bijaynagar',\n\t'Lowton',\n\t'Anjahamarina',\n\t'Tohoue',\n\t'Birkenhead',\n\t'Ghogaon',\n\t'Kadachchinallur',\n\t'Lal-lo',\n\t'Colorado do Oeste',\n\t'Boukoumbe',\n\t'La Source',\n\t'Knittelfeld',\n\t'Guangping',\n\t'Torrington',\n\t'Yako',\n\t'Batesville',\n\t'Dhobipet',\n\t'Ain Kechera',\n\t'Prey Veng',\n\t'Webster Groves',\n\t'Huai Yot',\n\t'Thandewala',\n\t'Koksijde',\n\t'Vosselaar',\n\t'Ashtarak',\n\t'Timaru',\n\t'Myrtle Beach',\n\t'Ban Na Sai',\n\t'Masbate',\n\t'Buloqboshi',\n\t'Trzebnica',\n\t'Biskra',\n\t'Sidi Bousber',\n\t'Jiangjiehe',\n\t'Qinhe',\n\t'Kunnur',\n\t'Palmerston North',\n\t'Kodanad',\n\t'Gulyam',\n\t'Gulou',\n\t'Fort Dodge',\n\t\"Mek'i\",\n\t'Mount Olive',\n\t'Marco de Canavezes',\n\t'Ucuma',\n\t'Kucukkuyu',\n\t'Sendamaram',\n\t'Minacu',\n\t'Quezon City',\n\t'Caxias do Sul',\n\t'Banjarbaru',\n\t'Analamisampy',\n\t'Zhongwangzhuang',\n\t'Morroa',\n\t'Laghzawna',\n\t'Talakulam',\n\t'Pailin',\n\t'Clearfield',\n\t'Soumpi',\n\t'Drochtersen',\n\t'Lourinha',\n\t'Zerbst',\n\t'Beohari',\n\t'Marina di Carrara',\n\t'Sherpur Khurd',\n\t'Ploufragan',\n\t'Sucat',\n\t'Nadikude',\n\t'Live Oak',\n\t'Puerto Casado',\n\t'Mortara',\n\t'Beichengqu',\n\t'Iwanuma',\n\t'Melle',\n\t'Guney',\n\t'Geneva',\n\t'Whitley Bay',\n\t'Chintalavadi',\n\t'Buwama',\n\t'Midlothian',\n\t'Guatire',\n\t'Baghauni',\n\t'Chiang Mai',\n\t'East Ham',\n\t'Lenyenye',\n\t'Shirakawa-tsuda',\n\t'Dibulla',\n\t'Nocera Superiore',\n\t'Paispamba',\n\t'Puerto Princesa',\n\t'Ban Ton Thong Chai',\n\t'Markham',\n\t'Bileh Savar',\n\t'Timmapuram',\n\t'Kone',\n\t'Tchindjendje',\n\t'Bir el Djir',\n\t'Saldus',\n\t'Coalville',\n\t'Waterville',\n\t'North Canton',\n\t'Dalandzadgad',\n\t'New Franklin',\n\t'Presidencia de la Plaza',\n\t\"M'Chedallah\",\n\t'Heves',\n\t'Brodnica',\n\t'Kicevo',\n\t'Niaogho',\n\t'Sao Pedro',\n\t'Connahs Quay',\n\t'Renningen',\n\t'Kaiwen',\n\t'Frejus',\n\t'Nobeji',\n\t'Le Bardo',\n\t'North Fair Oaks',\n\t'Metzingen',\n\t'Thonex',\n\t'Argos Orestiko',\n\t'Erdington',\n\t'Takasaki',\n\t'Storm Lake',\n\t'Ronnenberg',\n\t'Freetown',\n\t'Neuenburg',\n\t'Pinotepa',\n\t'Wood Buffalo',\n\t'Usme',\n\t'Kitaakita',\n\t'Nagykoros',\n\t'Midleton',\n\t'South Ockendon',\n\t'Brahmana Periya Agraharam',\n\t'Mantua',\n\t'Hayange',\n\t'Qarshi',\n\t'Komono',\n\t'Yasuj',\n\t'Cuartero',\n\t'Fuding',\n\t'Oberderdingen',\n\t'Consaca',\n\t'Calatrava',\n\t'San Vicente de Baracaldo',\n\t'Yakakent',\n\t'Sowan',\n\t'Major Isidoro',\n\t'Dongou',\n\t'Monza',\n\t'Millbrae',\n\t'Panshi',\n\t'Roquebrune-sur-Argens',\n\t'Satravada',\n\t'Visby',\n\t'Iseyin',\n\t'Kesarimangalam',\n\t'Greensburg',\n\t'Nova Paka',\n\t'Butterworth',\n\t'Fort Liberte',\n\t'Hongseong',\n\t'Anand',\n\t'Kalamasseri',\n\t'Kazhukambalam',\n\t'Beian',\n\t'Derik',\n\t'Malalag',\n\t'Prakhon Chai',\n\t'Laje',\n\t'Upper Uwchlan',\n\t'Sun Prairie',\n\t'Maghaghah',\n\t'Al Qaryatayn',\n\t'Ghonchi',\n\t'Masabdisa',\n\t'Luan Chau',\n\t'Czersk Pomorski',\n\t'Poggibonsi',\n\t'Privas',\n\t'Sa`adat Shahr',\n\t'Divinolandia',\n\t'Frontino',\n\t'Nurota',\n\t'Kpandae',\n\t'Kamitonda',\n\t'Molln',\n\t'Rogozno',\n\t'Kavital',\n\t'Sarlat-la-Caneda',\n\t'Reserva',\n\t'Ankazotsifantatra',\n\t'Shiraoka',\n\t'Baisha',\n\t'Sodertalje',\n\t'Sao Mateus do Sul',\n\t'Cimahi',\n\t'Nirakpurpali',\n\t'Baluntaicun',\n\t'Aloran',\n\t'Usmat Shaharchasi',\n\t'Jalpura',\n\t'Prairieville',\n\t'Neuenburg am Rhein',\n\t'Pangzawl',\n\t'Oshkosh',\n\t'Kalaidasht',\n\t'El Milia',\n\t'Williams Lake',\n\t'Lillebonne',\n\t'Kalyves Polygyrou',\n\t'Nova Europa',\n\t'Kawit',\n\t'Grande Saline',\n\t'Shuili',\n\t'Khanda',\n\t'Sa`idi',\n\t'Mount Eliza',\n\t'Queensferry',\n\t'Gibara',\n\t'Bathurst',\n\t'Itri',\n\t'Cosquin',\n\t'Dakovo',\n\t'Jimbolia',\n\t'Parsad',\n\t'Tartar',\n\t'Santarem',\n\t'Ingenio',\n\t'Az Za`ayin',\n\t'Avola',\n\t'Campiernagar',\n\t'Hioki',\n\t'Gaizhou',\n\t'Amancio',\n\t'Fort Salonga',\n\t'Ramhormoz',\n\t'Es Senia',\n\t'Konosu',\n\t'Tallaght',\n\t'San Giovanni in Marignano',\n\t'Al Mahallah al Kubra',\n\t'Nashville',\n\t'Nkongsamba',\n\t'Cazenga',\n\t'Teutonia',\n\t'Asthanwan',\n\t'Genappe',\n\t'Neuenstadt am Kocher',\n\t'Grammichele',\n\t'Latteri',\n\t'Aragarcas',\n\t'Thevur',\n\t'Yaglidere',\n\t'Radomir',\n\t'Bearsden',\n\t'Novo Airao',\n\t'Bierun Stary',\n\t'Lagunia Surajkanth',\n\t'Dengtangcun',\n\t'Schwechat',\n\t'Kalkar',\n\t'Cukurca',\n\t'Xiedian',\n\t'Teramo',\n\t'Yonago',\n\t'Samakhiali',\n\t'Pemba',\n\t'Rancho Palos Verdes',\n\t'Barclayville',\n\t'Bridgeton',\n\t'Eslov',\n\t'Shahpur',\n\t'Mandalgarh',\n\t'Nordstemmen',\n\t'Portlethen',\n\t'Opmeer',\n\t'Gemona del Friuli',\n\t'Askim',\n\t'Sidi Moussa',\n\t'Josefina',\n\t'Oskarshamn',\n\t'Kaujalgi',\n\t'Vicente Lopez',\n\t'Mandasa',\n\t'Bordj Menaiel',\n\t'Melgaco',\n\t'Beaufort',\n\t'Catskill',\n\t'Madaba',\n\t'Savoy',\n\t'Rahta',\n\t'Chiran',\n\t'London Grove',\n\t'Malov',\n\t'Serra Caiada',\n\t'Arico el Nuevo',\n\t'Dongping',\n\t'Elumalai',\n\t'Montelimar',\n\t'Weingarten',\n\t'Talbahat',\n\t'Bima',\n\t'Frouzins',\n\t'Kanur',\n\t'Beavercreek',\n\t'Vange',\n\t'Tianwei',\n\t'Westbury',\n\t'Donduseni',\n\t'Teotepeque',\n\t'Felidhoo',\n\t'McCordsville',\n\t'Catamarca',\n\t'Gurpinar',\n\t'Matola',\n\t'Lezajsk',\n\t'Chinna Gollapalem',\n\t'Fervedouro',\n\t'Ambodihara',\n\t'Bagalkot',\n\t'Quillabamba',\n\t'Boundiali',\n\t'Ankara',\n\t'Montfoort',\n\t'Union',\n\t'Pulheim',\n\t'Itako',\n\t'Kampong Tunah Jambu',\n\t'Bandar `Abbas',\n\t'Ghotki',\n\t'Phek',\n\t'Calabar',\n\t'Taft',\n\t'Nong Bua Lamphu',\n\t'Yenkuvarigudem',\n\t'Sebeta',\n\t'Freeport',\n\t'Gehrden',\n\t'Doctor Phillips',\n\t'Leers',\n\t'Mannedorf',\n\t'Linz',\n\t'Carvin',\n\t'Zhengdong',\n\t'Itabera',\n\t'Fujita',\n\t'Fazakerley',\n\t'Rillieux-la-Pape',\n\t'Xikou',\n\t'Grain Valley',\n\t'Chia',\n\t'Taiobeiras',\n\t'Kamianske',\n\t'Novyi Svit',\n\t'Pasni',\n\t'Nawanagar',\n\t'Zwickau',\n\t'Albstadt',\n\t'Tawau',\n\t'Sandnes',\n\t'Hilsa',\n\t'Trollhattan',\n\t'Le Mee-sur-Seine',\n\t'Villa del Rosario',\n\t'Barlinek',\n\t'Dacheng',\n\t'Ardestan',\n\t'Morbegno',\n\t'Bujaru',\n\t'Oued el Abtal',\n\t'Catio',\n\t'Mabalacat',\n\t'Venkidanga',\n\t'Leshou',\n\t'Makedonska Kamenica',\n\t'Pipra Latif',\n\t'Lae',\n\t'Myeik',\n\t'Lisburn',\n\t'Curralinho',\n\t'Cunen',\n\t'Wanparti',\n\t'Marica',\n\t'Muscle Shoals',\n\t'Nykobing Mors',\n\t'Rwamagana',\n\t\"Jin'e\",\n\t'Quitandinha',\n\t'Nilufer',\n\t'Camisano Vicentino',\n\t'Masera di Padova',\n\t'Brockville',\n\t'Ashiya',\n\t'Velenje',\n\t'Chencha',\n\t'Pongotan',\n\t'Rogaska Slatina',\n\t'Barasat',\n\t'Lognes',\n\t\"N'Goussa\",\n\t'Bordeaux',\n\t'Huaquillas',\n\t'Puvalur',\n\t'Pasraha',\n\t'Belladere',\n\t'Tonghae',\n\t'Montebelluna',\n\t'Nihonmatsu',\n\t'Mariano Roque Alonso',\n\t'Doura',\n\t'Xiangxiang',\n\t'Mang La',\n\t'Dumjor',\n\t'Jedrzejow',\n\t'Butler',\n\t'Rebola',\n\t'Douar Hammadi',\n\t'Sala Consilina',\n\t'Alassio',\n\t'Fenoarivobe',\n\t'Pueblo Rico',\n\t'Bramhapuri',\n\t'Mejillones',\n\t'Arcore',\n\t'Wiefelstede',\n\t'Wick',\n\t'Porsa',\n\t'Urdinarrain',\n\t'Seabra',\n\t'Pompton Plains',\n\t'Wells',\n\t'Paete',\n\t'Thorne',\n\t'Moss Vale',\n\t'Kortrijk',\n\t'San Giovanni in Fiore',\n\t'Dhar',\n\t'Bonneuil-sur-Marne',\n\t'Beregadougou',\n\t'Khandaich',\n\t'Arrigorriaga',\n\t'Glossop',\n\t'Neusass',\n\t'Olivenza',\n\t'Chaodongcun',\n\t'Lichtenburg',\n\t'Perupalem',\n\t'Pulimathu',\n\t'Buharkent',\n\t'Lancing',\n\t'Arendal',\n\t'Mpessoba',\n\t'Massillon',\n\t'Lordelo do Ouro',\n\t'Tlaltenango de Sanchez Roman',\n\t'Berkley',\n\t'Tracunhaem',\n\t'Avitanallur',\n\t'Livron-sur-Drome',\n\t'Badoc',\n\t'Salman Bak',\n\t'Vaihingen an der Enz',\n\t'Las Torres de Cotillas',\n\t'Claxton Bay',\n\t'Popasna',\n\t'Astana',\n\t'Fairhope',\n\t'Barras',\n\t'Acala',\n\t'Balti',\n\t'San Bartolome Jocotenango',\n\t'Capalonga',\n\t'Probistip',\n\t'Candoi',\n\t'Dapa',\n\t'Yei',\n\t'Roznov pod Radhostem',\n\t\"Oulad 'Azzouz\",\n\t'Sherobod',\n\t'Andondabe',\n\t'Gedera',\n\t'Mandi Dabwali',\n\t'Le Blanc-Mesnil',\n\t'Elambalur',\n\t'Altlandsberg',\n\t'Chouafaa',\n\t'Sao Jose da Tapera',\n\t'Loimaa',\n\t'Concepcion',\n\t'Dhrol',\n\t'Kulpahar',\n\t'Mililani Town',\n\t'Goondiwindi',\n\t'Varzea Nova',\n\t'Sampgaon',\n\t'Dibraghani',\n\t'Wiwili',\n\t'Elk Grove',\n\t'Iskenderun',\n\t'Tandarampattu',\n\t'Bani Mazar',\n\t'Parramos',\n\t'Northwood',\n\t'Charabidya',\n\t'Villa Sandino',\n\t'Karsiyang',\n\t'Loughborough',\n\t'Tetari',\n\t'Nigde',\n\t'Yarmouth',\n\t'Bonen',\n\t'Monserrato',\n\t'Echirolles',\n\t'Iglesias',\n\t'Senges',\n\t'Tacambaro de Codallos',\n\t'Zwolle',\n\t'Baradero',\n\t'Belize City',\n\t'Ponmundam',\n\t'Vaterstetten',\n\t'Tiddas',\n\t'Uracoa',\n\t'Nandigaon',\n\t'Greven',\n\t'Vila Franca do Campo',\n\t'Dhumnagar',\n\t'Yiwu',\n\t'Casoria',\n\t'Tovuz',\n\t'Yakossi',\n\t'Domont',\n\t'Bai Chay',\n\t'Grimsby',\n\t'Manzini',\n\t'Tiszaujvaros',\n\t'Sapele',\n\t'Lihuzhuang',\n\t'Michalovce',\n\t'Tanamarina',\n\t'Apartado',\n\t'Albu Kamal',\n\t'Griffith',\n\t'Zhashkiv',\n\t'Oroco',\n\t'Falkirk',\n\t'Derassi',\n\t'Vipava',\n\t'Berriane',\n\t'Kiskunhalas',\n\t'Gradiska',\n\t'Doesburg',\n\t'Jamestown',\n\t'Kingston upon Hull',\n\t'Djibloho',\n\t'Sachin',\n\t'`Aliabad-e Katul',\n\t'Bouanri',\n\t'Chandpur',\n\t'Godalming',\n\t'Toamasina',\n\t'Basarh',\n\t'Taviano',\n\t'Apricena',\n\t'Takayama',\n\t'Nossen',\n\t'Hashima',\n\t'Staines-upon-Thames',\n\t'Lachen',\n\t'Ecclesfield',\n\t'Kiraz',\n\t'Cercado Abajo',\n\t'Mangalpur Gudaria',\n\t'Anolaima',\n\t'Ban Mae Chedi',\n\t'Namur',\n\t'Bragadiru',\n\t'Cusano Milanino',\n\t'Shirosato',\n\t'Khilchipur',\n\t'Lymington',\n\t'Kuala Kurun',\n\t'Santa Cruz Balanya',\n\t'North Babylon',\n\t'Thogaduru',\n\t'Shirin',\n\t'El Ghourdane',\n\t'Qanliko`l',\n\t'Jangalapalli',\n\t'Mariakerke',\n\t'Kukkundur',\n\t'Coyula',\n\t'Meghauna',\n\t'Ain el Hadjar',\n\t'Sen Monorom',\n\t'Madakasira',\n\t'Shepton Mallet',\n\t'Biggleswade',\n\t'Llallagua',\n\t'Birzai',\n\t'Beneditinos',\n\t\"Kattaqo'rg'on Shahri\",\n\t'La Crucecita',\n\t'Tall Abyad',\n\t'Ar Rahmaniyah',\n\t'Milnrow',\n\t'Shasta Lake',\n\t'San Giovanni Lupatoto',\n\t'Lovejoy',\n\t'Fo-Boure',\n\t'Konigswinter',\n\t'Ironton',\n\t'Sabirabad',\n\t'Sai Wan Ho',\n\t'Ueda',\n\t'Yinchengpu',\n\t'Miandrarivo',\n\t'Horley',\n\t'Djidian',\n\t'Koundara',\n\t'Dereli',\n\t'Sidi Merouane',\n\t'Alwal',\n\t'Debre Tabor',\n\t'Beltsville',\n\t'San Francisco de los Romo',\n\t'Singkawang',\n\t'Kryvyi Rih',\n\t'Cisnadie',\n\t'Altotting',\n\t'Cape Canaveral',\n\t'Mitsuke',\n\t'Baroueli',\n\t'Abrandabad-e Shahediyeh',\n\t'Merkanam',\n\t'Huazalingo',\n\t\"L'Hay-les-Roses\",\n\t'Riorges',\n\t'Serra Dourada',\n\t'Woensdrecht',\n\t'Castelli Calepio',\n\t'Kiruna',\n\t'Fatima',\n\t'Bensonville',\n\t'Weissenhorn',\n\t'San Jose El Idolo',\n\t'Racconigi',\n\t'Lluchmayor',\n\t'Inabe',\n\t'Amgachia',\n\t'Aswapuram',\n\t'Wilmette',\n\t'Zwonitz',\n\t'Haji Shah',\n\t'Nava',\n\t'El Cerrito',\n\t'Tabira',\n\t'Treuchtlingen',\n\t'Ponte da Barca',\n\t'Poitiers',\n\t'Watari',\n\t'As Safirah',\n\t'Handsworth',\n\t'Muniz Freire',\n\t'God',\n\t'Nova Crixas',\n\t'Tujg',\n\t'Jakobstad',\n\t'San Bartolo Tutotepec',\n\t'Kennewick',\n\t'Baianopolis',\n\t'Las Navas',\n\t'Paracelis',\n\t'Moniquira',\n\t'Porumamilla',\n\t'Arroyo Seco',\n\t'Bom Sucesso',\n\t'West Haven',\n\t'Kinik',\n\t'Nangavalli',\n\t'Draksharama',\n\t'Wells Branch',\n\t'Shumanay',\n\t'Zlocieniec',\n\t'Monte di Procida',\n\t'Novodnistrovsk',\n\t'Chitungwiza',\n\t'San Pedro de Macoris',\n\t'Mombin Crochu',\n\t'Dumbarton',\n\t'Ostersund',\n\t'Le Grand-Saconnex',\n\t'Uijeongbu',\n\t'Lomianki',\n\t'Piazza Armerina',\n\t'Butebo',\n\t'Kirsehir',\n\t'Huamachuco',\n\t'Ismailpur',\n\t'North Amityville',\n\t'Lanquin',\n\t'Rio Negrinho',\n\t'Ukrainsk',\n\t'Rockingham',\n\t'Zarasai',\n\t'Terneuzen',\n\t'Musiri',\n\t'Badanahatti',\n\t'Edayikunnam',\n\t'Caridade',\n\t'Jensen Beach',\n\t'Kuriyama',\n\t'Antarvedi',\n\t'Amos',\n\t'Byatarayanpur',\n\t'Sao Domingos do Maranhao',\n\t'Tarutung',\n\t'Worthington',\n\t'Fujiidera',\n\t'Gerd Faramarz Shahediyeh',\n\t'Buchach',\n\t'Igarape',\n\t'Lincolnton',\n\t'Ameskroud',\n\t'Bad Oldesloe',\n\t'Yorii',\n\t'Juticalpa',\n\t'Lakshmaneswaram',\n\t'Catanduvas',\n\t'Ryhope',\n\t'Wesselsbron',\n\t'As Suwayhirah as Sahil',\n\t'Selvazzano Dentro',\n\t'Tanxia',\n\t'East Hampton',\n\t'Agua Fria',\n\t'Garanhuns',\n\t'Saint-Lazare',\n\t'Char Fasson',\n\t'Malanguan',\n\t'Waco',\n\t'Kanaya',\n\t'Totolapan',\n\t'Bloemhof',\n\t'Tokkavadi',\n\t'Nogent-sur-Marne',\n\t'Zhuolan',\n\t'Nandyalampeta',\n\t'Invercargill',\n\t'Trabia',\n\t'Boromo',\n\t'Blackfalds',\n\t'General Trias',\n\t'Kalakkadu',\n\t'Ellesmere Port',\n\t'Gampola',\n\t'Macclesfield',\n\t'Bachhauta',\n\t'Unzen',\n\t'Balbalan',\n\t'Maimon',\n\t'Minanba',\n\t'Andalucia',\n\t'Baclaran',\n\t'Sumqayit',\n\t'Amargosa',\n\t'Ghatawan',\n\t'Alajuela',\n\t'Maroaloka',\n\t'Bongandanga',\n\t'Papagos',\n\t'Bairia',\n\t'Ghagga',\n\t'Lillehammer',\n\t'Iizuna',\n\t'Kifosso',\n\t'Crailsheim',\n\t'Zvornik',\n\t'Devgadh Bariya',\n\t'Imola',\n\t'Estreito',\n\t'Haga',\n\t'Toyoyama',\n\t'Abeokuta',\n\t'Laoang',\n\t'West Seneca',\n\t'Kharhial',\n\t'Menzel Temime',\n\t'Jankinagar',\n\t'El Carmen de Chucuri',\n\t'Huari',\n\t'Maua',\n\t'Pekalongan',\n\t'Coltauco',\n\t'Carmen de Apicala',\n\t'Cacador',\n\t'Andohajango',\n\t'Yangiqo`rg`on',\n\t'Yesagyo',\n\t'Sahuayo de Morelos',\n\t'Nijmegen',\n\t'West Whittier-Los Nietos',\n\t'Santa Rosa del Sur',\n\t'Tharial',\n\t'Boves',\n\t'Bodhan',\n\t'Bagula',\n\t'Gobabis',\n\t'Ouahigouya',\n\t'Maubeuge',\n\t'Eldorado',\n\t'Bakhtawarpur',\n\t'Ternivka',\n\t'Kasserine',\n\t'Sayula de Aleman',\n\t'Fallanden',\n\t'Fonseca',\n\t'Lipari',\n\t'Bou Djeniba',\n\t'Jagraon',\n\t'Parrita',\n\t'Erongaricuaro',\n\t'Mizumaki',\n\t'Dieramana',\n\t'Moyamba',\n\t'La Linea de la Concepcion',\n\t'Kiffa',\n\t'Silleda',\n\t'Port Said',\n\t'Gross-Gerau',\n\t'Ilakatra',\n\t'Wooster',\n\t'Sicasica',\n\t'Eureka',\n\t'Dodworth',\n\t'Hereford',\n\t'`Amran',\n\t\"La Chapelle d'Armentieres\",\n\t'Pelsall',\n\t'Borshchiv',\n\t'Kaiyuan',\n\t'Pandag',\n\t'Mortagua',\n\t'Errachidia',\n\t'Gaya',\n\t'Dietzenbach',\n\t'An Najaf',\n\t'Dungarpur',\n\t'Oued Seguin',\n\t'Sampaloc',\n\t'Traralgon',\n\t'Andalatanosy',\n\t'Gillingham',\n\t'Mudon',\n\t'Deville-les-Rouen',\n\t'Xicheng',\n\t'Afonso Claudio',\n\t'Daanbantayan',\n\t'Horqueta',\n\t'Bahraigh',\n\t'North Brunswick',\n\t'Marotsiraka',\n\t'Ribnita',\n\t'North Royalton',\n\t'Kalemie',\n\t'El Oro de Hidalgo',\n\t'Woods Cross',\n\t'Tsiamalao',\n\t'Shankarampet',\n\t'Tecpan de Galeana',\n\t'Humlebaek',\n\t'Phatthalung',\n\t'Meddappakkam',\n\t'Raha',\n\t'Sensuntepeque',\n\t'Paidiipalli',\n\t'Itatira',\n\t'Siddapur',\n\t'Catemaco',\n\t'Joue-les-Tours',\n\t'Amal',\n\t'Bara Belun',\n\t'Hidalgotitlan',\n\t'Algeciras',\n\t'Carbonita',\n\t'Kulrian',\n\t'Kasaishi',\n\t'Pasir Gudang',\n\t'Yingchuan',\n\t'Owo',\n\t'Saanich',\n\t'Altos',\n\t'Dana Point',\n\t'Morro da Fumaca',\n\t'Copparo',\n\t'Gerze',\n\t'Werneck',\n\t'Athis-Mons',\n\t'Yanam',\n\t'Palmilla',\n\t'Port St. John',\n\t'Kapay',\n\t'Pottipuram',\n\t'Vaniyambadi',\n\t'Glenmont',\n\t'Ocara',\n\t'Huasuo',\n\t'Raver',\n\t'Manouba',\n\t'Volklingen',\n\t'Calcado',\n\t'Kattiyeri',\n\t'West Boldon',\n\t'Asaita',\n\t'Maradah',\n\t'Nagasu',\n\t'Mundelein',\n\t'Boerne',\n\t'Kuji',\n\t'Voi',\n\t'Hafnarfjordhur',\n\t'Huatabampo',\n\t'Juliaca',\n\t'Parkland',\n\t'Kedougou',\n\t'Suqian',\n\t'Caicedonia',\n\t'Dhing',\n\t'Azambuja',\n\t'Sekimachi',\n\t'Jasauli',\n\t'Benxi',\n\t'Ifanhim',\n\t'Sparti',\n\t'Reichelsheim',\n\t'Beni Khalled',\n\t'Salkhua',\n\t'Rotenburg an der Fulda',\n\t'Cheticheri',\n\t'Dorking',\n\t'Al Majma`ah',\n\t'Ghajnsielem',\n\t'Yomou',\n\t'Monsummano',\n\t'Richton Park',\n\t'Capbreton',\n\t'Curitibanos',\n\t'East Brandywine',\n\t'Karmana',\n\t'As Salamiyah',\n\t'Pallippurattuseri',\n\t'Mareeba',\n\t'Port Sudan',\n\t'Jumilla',\n\t'Schleswig',\n\t'Cedar Lake',\n\t'Richmond West',\n\t'Puqi',\n\t'Sbeitla',\n\t'Vaddapalli',\n\t'River Grove',\n\t'Northbridge',\n\t'Erkoklu',\n\t'Miliana',\n\t'Autun',\n\t'Lohja',\n\t'Ixtaczoquitlan',\n\t'Tczew',\n\t\"Shaqra'\",\n\t'Djugu',\n\t\"Ben N'Choud\",\n\t'East Kilbride',\n\t'Ciudad Melchor Muzquiz',\n\t'Tezpur',\n\t'Aldershot',\n\t'Tankara',\n\t'Honganur',\n\t'Nikshahr',\n\t'Jeffersonville',\n\t'Portage',\n\t'Waremme',\n\t'Bacuag',\n\t'Bhajani',\n\t'Kutno',\n\t'Kinston',\n\t'Macabebe',\n\t'Greater Napanee',\n\t'Isla Vista',\n\t'Santona',\n\t'Rimavska Sobota',\n\t'Sultanganj',\n\t'Mittweida',\n\t'Humayingcun',\n\t'Buon Ma Thuot',\n\t'Meaux',\n\t'Beibu',\n\t'La Vergne',\n\t'Warri',\n\t'Huaibaijie',\n\t'Yasica Arriba',\n\t'Zayda',\n\t'East Whittier',\n\t'Wasquehal',\n\t'Elkton',\n\t'Pasupatikovil',\n\t'Leuna',\n\t'Jamtara',\n\t'Baildon',\n\t'Lobo',\n\t'Karor',\n\t'Havsa',\n\t'Puente de Piedra',\n\t'Santana do Ipanema',\n\t'Strombeek-Bever',\n\t'Egg',\n\t'Charter Oak',\n\t'Romit',\n\t'Sevenoaks',\n\t'Toshima',\n\t'Lashio',\n\t'Tocina',\n\t'Phu My',\n\t'El Fula',\n\t'Dimona',\n\t'Leopoldshohe',\n\t'Marungur',\n\t'Goleniow',\n\t'Ouangani',\n\t'Dumalinao',\n\t'Sulz am Neckar',\n\t'Colchester',\n\t'Tarin Kot',\n\t'Bhairahawa',\n\t'Jaguaretama',\n\t'Shin',\n\t\"Pallazzolo sull'Oglio\",\n\t'Rajnagar',\n\t'Massi',\n\t'Redlynch',\n\t'Badin',\n\t'Paredes de Coura',\n\t'Malambo',\n\t'Abjij',\n\t'Bekasi',\n\t'Shaomi',\n\t'Salzano',\n\t'Harlow',\n\t'Flower Hill',\n\t'Soasio',\n\t'Oakton',\n\t'Lukula',\n\t'Garhakota',\n\t'Monteforte Irpino',\n\t'Shamsabad',\n\t'Marsala',\n\t'Lauri',\n\t'Lala',\n\t'Siniscola',\n\t'Huixtla',\n\t'Taxisco',\n\t'Pesaro',\n\t'Khapalu',\n\t'Oyster Bay',\n\t'Ivanhoe',\n\t'Xai-Xai',\n\t'Medulla',\n\t'Naini',\n\t'Santa Cruz del Quiche',\n\t'Saint-Gratien',\n\t'Sante Bennur',\n\t'Al Brouj',\n\t'Raje',\n\t'Perladka',\n\t'Ban Laem Chabang',\n\t'Gora',\n\t'Monitos',\n\t'Panchanandapur',\n\t'Pandacan',\n\t'Surbiton',\n\t'Sandy',\n\t'Wittenheim',\n\t'Gujranwala',\n\t'Zaria',\n\t'Hirayama',\n\t'Neyveli',\n\t'Guane',\n\t'Oak Forest',\n\t'Suzhou',\n\t'Tulle',\n\t'Prantij',\n\t'Rocca di Papa',\n\t'Tielt',\n\t'Bleicherode',\n\t'Ponte San Pietro',\n\t\"'Ain el Turk\",\n\t'Bagou',\n\t'Taragi',\n\t'Ukal',\n\t'Ruy Barbosa',\n\t'Siroki Brijeg',\n\t'Pabellon de Arteaga',\n\t'Granite City',\n\t'Ait Majdane',\n\t'Hirehaluhosahalli',\n\t'Pinabacdao',\n\t'Kawa',\n\t'Phaltan',\n\t'Piombino Dese',\n\t'Belmopan',\n\t'Kodad',\n\t'Bozova',\n\t'Quibala',\n\t'Nakur',\n\t'Berkovitsa',\n\t'Chiredzi',\n\t'Sanmenxia',\n\t'Bugdayli',\n\t'Nersingen',\n\t'Palma Campania',\n\t'Paceco',\n\t'Isesaki',\n\t'Lopatcong',\n\t'Pecan Grove',\n\t'Thomaston',\n\t'Sri Jayewardenepura Kotte',\n\t'Quang Yen',\n\t'Greeley',\n\t'Omidiyeh',\n\t'Namakkal',\n\t'Macuro',\n\t'Neuenkirchen',\n\t'Goure',\n\t'Kehen',\n\t'Dongyangshi',\n\t'Fiumefreddo di Sicilia',\n\t'Alta Floresta',\n\t'Ban Na Chom Thian',\n\t'Viet Tri',\n\t'Kashgar',\n\t'Shawinigan',\n\t'Danghara',\n\t'Belgrade',\n\t'Puerto Tejada',\n\t'Tulin',\n\t'Agblangandan',\n\t'Poranga',\n\t'Lagos',\n\t'Mallig',\n\t'Ciftlik',\n\t'Sao Francisco de Paula',\n\t'Kiyama',\n\t'Crespo',\n\t'Bad Salzungen',\n\t'Doganhisar',\n\t'Indargarh',\n\t'Miandrivazo',\n\t'Mondovi',\n\t'Quthing',\n\t'Guipos',\n\t'Dikhil',\n\t'Polakala',\n\t'Ambaliha',\n\t'Anuppampattu',\n\t'Aquitania',\n\t'La Rinconada',\n\t'Paramaribo',\n\t\"Ma'anshan\",\n\t'Uniao da Vitoria',\n\t'Cuihua',\n\t'Areka',\n\t'Huldenberg',\n\t'Gudlavalleru',\n\t'Alasandigutta',\n\t'Changtoushang',\n\t'Segni',\n\t'Durlesti',\n\t'Chivhu',\n\t'Carmen de Carupa',\n\t'Prachin Buri',\n\t'Buzhum',\n\t'Phalodi',\n\t'Munak',\n\t'Rewari',\n\t'La Gomera',\n\t'Yuhuan',\n\t'Woburn',\n\t'Aghbal',\n\t'Santa Maria a Vico',\n\t'Bogo',\n\t'Mendon',\n\t'Kong',\n\t'Benapol',\n\t'Sakoueba',\n\t'Uruana',\n\t'Chengam',\n\t'Freising',\n\t'Nobsa',\n\t'Ciechocinek',\n\t'Chengjiao',\n\t'Cerca Carvajal',\n\t'Matawan',\n\t'Al Madamud',\n\t'Mettmann',\n\t'Yakumo',\n\t'Bir Mogrein',\n\t'Puerto Acosta',\n\t'Nunna',\n\t'Gunjapalle',\n\t'Collier',\n\t'Mateszalka',\n\t'Bento Goncalves',\n\t'Umbrete',\n\t'Kapakli',\n\t'Padada',\n\t'Oud-Turnhout',\n\t'Karukh',\n\t'Fort Meade',\n\t'Domanic',\n\t'Emsburen',\n\t'Braunsbedra',\n\t'Sacramento',\n\t'Vidauban',\n\t'Ranomafana',\n\t'Chone',\n\t'Malapannanagudi',\n\t'Siralkoppa',\n\t'Mequon',\n\t'Rottingdean',\n\t'Lindenwold',\n\t'Chanal',\n\t'Wakuya',\n\t'Malaba',\n\t'Chaabat el Leham',\n\t'Huinan',\n\t'Port-Vila',\n\t'Silopi',\n\t'Tanabi',\n\t'Yelmalla',\n\t'Siteki',\n\t'Casiguran',\n\t'Kennedale',\n\t'Kenduadih',\n\t'Intibuca',\n\t'Fos-sur-Mer',\n\t'Nueva Era',\n\t'Jicheon',\n\t'Rovigo',\n\t'Acipayam',\n\t'Bajala',\n\t'Drama',\n\t'Shiv',\n\t'San Giorgio a Cremano',\n\t'Antonio Dias',\n\t'Jalajala',\n\t'Ocsa',\n\t'Oviedo',\n\t'University City',\n\t'Boquira',\n\t'Gaura',\n\t'Naaldwijk',\n\t'Manteswar',\n\t'Farmingville',\n\t'Bokonbaev',\n\t'Qingxicun',\n\t'Scharbeutz',\n\t'Hamrun',\n\t'Lake Barcroft',\n\t'Adeje',\n\t'Saint Austell',\n\t'Jarrow',\n\t'Kandira',\n\t'Lincang',\n\t'Orsay',\n\t'Affoltern am Albis',\n\t'Bilozerka',\n\t'Lishaocun',\n\t'Ochanthururtha',\n\t'Koekelare',\n\t'Vengikkal',\n\t'Dysselsdorp',\n\t'New Scotland',\n\t'Isfara',\n\t'Cuers',\n\t'Derry',\n\t'Tampere',\n\t'Debiapur',\n\t'Yandian',\n\t'Awan Patti',\n\t'Kara-Kyshtak',\n\t'Oguz',\n\t'Qualiano',\n\t'Jose Maria Ezeiza',\n\t'Pfaffenhofen',\n\t'Sidi Ali',\n\t'Arayat',\n\t'Carvajal',\n\t'Palakollu',\n\t'Jingzhou',\n\t'Owerri',\n\t'Bato',\n\t'Yanyan',\n\t'Dasmarinas',\n\t'Srifa',\n\t'Duzhuang',\n\t'Qazi Ahmad',\n\t'Brook Park',\n\t'Market Drayton',\n\t'Kitahiroshima',\n\t'Swindon',\n\t'Pilibhit',\n\t'Hoyland',\n\t'Georgsmarienhutte',\n\t'Chigorodo',\n\t'Abu Qir',\n\t'Marysville',\n\t'Singerei',\n\t\"Town 'n' Country\",\n\t'Jangany',\n\t'Atwater',\n\t'Fuchucho',\n\t'Rutana',\n\t'Shamgarh',\n\t'Cotegipe',\n\t'Atascadero',\n\t'Maisons-Alfort',\n\t'Bela Vista de Minas',\n\t'Kopervik',\n\t'Madugula',\n\t'Semra',\n\t'Binh Hoa',\n\t'Krnov',\n\t'Itapaci',\n\t'Sao Raimundo Nonato',\n\t'Sint-Joost-ten-Node',\n\t'Maski',\n\t'Regen',\n\t'Folkestone',\n\t'Rardhu',\n\t'Toyohashi',\n\t'Duragan',\n\t'Guelendeng',\n\t'Bugongi',\n\t'Montecchio Emilia',\n\t'Mahwah',\n\t'Dayrut',\n\t'Papeete',\n\t'Worsley',\n\t'Mponela',\n\t'Barakpur',\n\t'Broken Hill',\n\t'Sakiet ez Zit',\n\t'Glen Burnie',\n\t'Negapatam',\n\t'Itahari',\n\t'Kambainellur',\n\t'Cienega de Flores',\n\t'Jau',\n\t'Xalatlaco',\n\t'Dalaman',\n\t'Thi Tran Dong Dang',\n\t'Zacatlan',\n\t'Changbang',\n\t'Chikugo',\n\t'Uden',\n\t'Kansas City',\n\t'Sremska Mitrovica',\n\t'Pizhou',\n\t'Fannuj',\n\t'Slany',\n\t'Soye',\n\t'Painal',\n\t'Station des Essais M.V.A.',\n\t'Egg Harbor',\n\t'Morsi',\n\t'Araioses',\n\t'Escondido',\n\t'Castelnuovo Berardenga',\n\t'Ijra',\n\t'Ndora',\n\t'Ain Taya',\n\t'Essaouira',\n\t'Kimba',\n\t'Taher',\n\t'Bouar',\n\t'Kyrenia',\n\t'Chilca',\n\t'Quatis',\n\t'Badulla',\n\t'Kalpatta',\n\t'Turffontein',\n\t'Potunuru',\n\t'Karuhatan',\n\t'Amalfi',\n\t'Wuppertal',\n\t'Cayo Mambi',\n\t'Riva del Garda',\n\t'Boucau',\n\t'Sejong',\n\t'Elesbao Veloso',\n\t'Jiaojiangcun',\n\t'Pullanpallikonam',\n\t'Borborema',\n\t'Corella',\n\t'Schkeuditz',\n\t'Gurgenpinari',\n\t'Buddayyakota',\n\t\"Zd'ar nad Sazavou\",\n\t'Jiangmen',\n\t'Tallahassee',\n\t'Ciudad Lazaro Cardenas',\n\t'Peabiru',\n\t'Ghomrassen',\n\t'Sultan Kudarat',\n\t'Brunswick',\n\t'Brookes Point',\n\t'Jihlava',\n\t'Kotharpettai',\n\t'Koumia',\n\t'Hasanpur',\n\t'Riachao do Dantas',\n\t'Tinqueux',\n\t'Stillwater',\n\t'Tempoal de Sanchez',\n\t'Weiterstadt',\n\t'Ichikikushikino',\n\t'Atlapadu',\n\t'Kiashahr',\n\t'Bertioga',\n\t'Centro Habana',\n\t'Makassar',\n\t'Rajakheri',\n\t'Kuhbil',\n\t'Baldwin Park',\n\t'Chunchura',\n\t'Shepshed',\n\t'Yakima',\n\t'Rayagada',\n\t'Saltpond',\n\t'Karamadai',\n\t'Sainte-Suzanne',\n\t\"St. John's\",\n\t'Peddannavaripalle',\n\t'Ban Houayxay',\n\t'Pir Maker',\n\t'Bagewadi',\n\t'Chemancheri',\n\t'San Luis Rio Colorado',\n\t'Fullerton',\n\t'Khargram',\n\t'Yacuiba',\n\t'Rancho Grande',\n\t'Giurgiu',\n\t'San Blas Atempa',\n\t'Koulamoutou',\n\t'Jwaneng',\n\t'Kamalapuram',\n\t'Crna Trava',\n\t'Brooklyn Park',\n\t'Singapperumalkovil',\n\t'Kiban',\n\t'Budalur',\n\t'Yeonil',\n\t'Nsele',\n\t'Cumra',\n\t'Baie-Comeau',\n\t'Avila',\n\t'Chantilly',\n\t'Tongyangdao',\n\t'Izamal',\n\t'Yalaguina',\n\t'Obersiggenthal',\n\t'Sadalgi',\n\t'Cuprija',\n\t'Laufenburg (Baden)',\n\t'Bukan',\n\t'Siyana',\n\t'Kafue',\n\t'Portmore',\n\t'Perchtoldsdorf',\n\t'Catemu',\n\t'Kaimana',\n\t'Demir Hisar',\n\t'Tabor',\n\t'Alakamisy',\n\t'Bayt Lahya',\n\t'Rosiori de Vede',\n\t'Sarnia',\n\t'Venustiano Carranza',\n\t'Nunchia',\n\t'Kankakee',\n\t'Chittur',\n\t'Duma',\n\t'Bou Arada',\n\t'Burton',\n\t'Itatiaiucu',\n\t'Mason',\n\t'Araputanga',\n\t'San Juan Tecuaco',\n\t'Meghaul',\n\t'Abhwar',\n\t'Zhujiacun',\n\t'Saline',\n\t'Fethiye',\n\t'Leeds',\n\t'Ogori',\n\t'Keffi',\n\t'Karanja',\n\t'Heiligenhaus',\n\t'Haci Zeynalabdin',\n\t'Gubin',\n\t'Chenab Nagar',\n\t'Gormi',\n\t'Lydenburg',\n\t'Neuhaus am Rennweg',\n\t'Kings Grant',\n\t'Umi',\n\t'Dengka',\n\t'Gangaur',\n\t'Atsugicho',\n\t'Ibshaway',\n\t'Mananasy-Tsitakondaza',\n\t'Itacarambi',\n\t'Minowa',\n\t'Corzuela',\n\t'Vanduvancheri',\n\t'Bohl-Iggelheim',\n\t'Shinile',\n\t'Wilde',\n\t'Montlucon',\n\t'Latham',\n\t'Picana',\n\t'Tuao',\n\t'Drapetsona',\n\t'Mountain Brook',\n\t'Montechiarugolo',\n\t'Kasba Tanora',\n\t'Rajghat Garail',\n\t'Kasumpti',\n\t'Devirammanahalli',\n\t'Singalandapuram',\n\t'Chevy Chase',\n\t'Aspropyrgos',\n\t\"'Ain Taghrout\",\n\t'Delft',\n\t'Beining',\n\t'Blainville',\n\t'Krasnohrad',\n\t'Siem Reap',\n\t'Betamcherla',\n\t'Labin',\n\t'Pompei',\n\t'Gospic',\n\t'Hakui',\n\t'Gomaringen',\n\t'Saint-Brevin-les-Pins',\n\t'Langtang',\n\t'Mangalapadi',\n\t'Santa Lucia del Camino',\n\t'East Whiteland',\n\t'Morioka',\n\t'Bouira',\n\t'Coria del Rio',\n\t'Varzea Paulista',\n\t'Araira',\n\t'Thana Bhawan',\n\t'Ain Taoujdat',\n\t'Mumbwa',\n\t'Comandante Luis Piedra Buena',\n\t'Powell River',\n\t'Nampa',\n\t'Nisang',\n\t'Piran',\n\t'Bude',\n\t'Merosina',\n\t'Kamez',\n\t'Fairborn',\n\t'Abhar',\n\t'Giffoni Valle Piana',\n\t'Jose Bonifacio',\n\t'Andhana',\n\t'Kisanuki',\n\t'Landover',\n\t'Dekanme',\n\t'Raposos',\n\t'Columbio',\n\t'Flieden',\n\t'Antalaha',\n\t'Impruneta',\n\t'Pyapali',\n\t'Butuan',\n\t'Hlevakha',\n\t'Braslovce',\n\t'Kalajoki',\n\t'Minami-Boso',\n\t'Tocumen',\n\t'Matan',\n\t'Zapopan',\n\t'Calbayog City',\n\t'Liloy',\n\t'Durgi',\n\t'Byadgi',\n\t'Vero Beach South',\n\t'Hongtuliang',\n\t'Baharu',\n\t'Hounslow',\n\t'Joquicingo',\n\t'Cranleigh',\n\t'Cassilandia',\n\t'Burton Latimer',\n\t'Poco Fundo',\n\t'Starogard Gdanski',\n\t'Paikpara',\n\t'Calera',\n\t'Gyumri',\n\t'Higashine',\n\t'Hialeah Gardens',\n\t'Moravce',\n\t'Lac',\n\t'Poruvakara',\n\t'Cadaval',\n\t'Pasig City',\n\t'Montpellier',\n\t'Nantang',\n\t'Baruni',\n\t'Imani',\n\t'Rommerskirchen',\n\t'Orizaba',\n\t\"Saint Ann's Bay\",\n\t\"Olho d'Agua das Flores\",\n\t'Amvrosiivka',\n\t\"M'dhilla\",\n\t'Abulug',\n\t'Helmstedt',\n\t'La Chapelle-Saint-Luc',\n\t'Delitzsch',\n\t'Gurmaila',\n\t'Sainte-Anne-des-Plaines',\n\t'Gardhabaer',\n\t'Sodankyla',\n\t'Chandrakona',\n\t'Leczyca',\n\t'Madhipura',\n\t'Khargapur',\n\t'Cruz do Espirito Santo',\n\t'Gloucester City',\n\t'Latisana',\n\t'Doranda',\n\t'Holly Springs',\n\t'Mechtras',\n\t'Grenoble',\n\t'Red Bluff',\n\t'Titu',\n\t'Karavalur',\n\t'Chiquimulilla',\n\t'Kirkcaldy',\n\t'Soledad de Doblado',\n\t'Ben Nasseur',\n\t'Miyato',\n\t'Temecula',\n\t'Araripe',\n\t'Ambatoharanana',\n\t'Union Park',\n\t'Cuemba',\n\t'Birkirkara',\n\t'Ambohitsilaozana',\n\t'La Louviere',\n\t'Enniscorthy',\n\t'Ishkashim',\n\t'Touna',\n\t'Presidente Olegario',\n\t'Maranguape',\n\t'Mati',\n\t'Sainte-Catherine',\n\t'Nerja',\n\t'Freiburg im Breisgau',\n\t'Cairo Montenotte',\n\t'Uchchangidurgam',\n\t'Jhansi',\n\t'Elmali',\n\t'Al Jabin',\n\t'Orono',\n\t'Wickliffe',\n\t'Lontras',\n\t'Mound',\n\t'Cosio',\n\t'Drummondville',\n\t'Royal Tunbridge Wells',\n\t'Dolneni',\n\t'Tabogon',\n\t'Sosnowiec',\n\t'Badrashni',\n\t'Papanduva',\n\t'Kalayaan',\n\t'Zottegem',\n\t'General Salgado',\n\t'Ozatlan',\n\t'Southchase',\n\t'Santa Adelia',\n\t'Aribinda',\n\t'Nakanojomachi',\n\t'Coroata',\n\t'Marovatolena',\n\t'Saubara',\n\t'Pingtiancun',\n\t'Syosset',\n\t'Dinslaken',\n\t'Carpentras',\n\t'San Martino di Lupari',\n\t'Tabarka',\n\t'Yulara',\n\t'Ratzeburg',\n\t'Punta Gorda',\n\t'San Rafael del Yuma',\n\t'Arima',\n\t'Jannat Shahr',\n\t'El Escorial',\n\t'Honwada',\n\t'Bhagwanpur Khurd',\n\t'Ayutla de los Libres',\n\t'Guaiba',\n\t'Garzon',\n\t'Tarangnan',\n\t'Marktheidenfeld',\n\t'Ban Chang Phuak',\n\t'Aurad',\n\t'Epazoyucan',\n\t'Tone',\n\t'Seforong',\n\t'Lichtervelde',\n\t'Seriate',\n\t'Suileng',\n\t'Viraganur',\n\t'Novi Banovci',\n\t'Knaresborough',\n\t'Bulisa',\n\t'Shaqlawah',\n\t'Kingstowne',\n\t'Zalec',\n\t'Siano',\n\t'Flexeiras',\n\t'Ar Raqqah',\n\t'Kercem',\n\t'El Kef',\n\t'Cicero Dantas',\n\t'Schonefeld',\n\t'Neves Paulista',\n\t'Fish Hawk',\n\t'Akjoujt',\n\t'La Courneuve',\n\t'Biliran',\n\t'Telkap',\n\t'Sher Muhammadpuram',\n\t'Arapoti',\n\t'Laupheim',\n\t'Boden',\n\t'Ratau',\n\t'Rudesheim am Rhein',\n\t'Xintai',\n\t'Temerin',\n\t'Rebordosa',\n\t'Bernolakovo',\n\t'Sulat',\n\t'Ellwangen',\n\t'Gates',\n\t'Merano',\n\t'Nacozari de Garcia',\n\t'Camp Springs',\n\t'Taraka',\n\t'Yutiancun',\n\t'Soanpeta',\n\t'Navgilem',\n\t'Nagakute',\n\t'Ipetumodu',\n\t'Minnetonka',\n\t'The Acreage',\n\t'American Canyon',\n\t'Tripurantakam',\n\t'Acara',\n\t'Greer',\n\t'Conception Bay South',\n\t'Oiwa',\n\t'Ukhai Purbari Patti',\n\t'My Hoa',\n\t'Miklavz na Dravskem Polju',\n\t'Porbandar',\n\t'As Samawah',\n\t'Tamba',\n\t'Namangan',\n\t'Alluru',\n\t'Zinzana',\n\t'Karasburg',\n\t\"Ich'on\",\n\t'Vojnik',\n\t'San Miguel Siguila',\n\t'Lome',\n\t'Vieiro',\n\t'Hardas Bigha',\n\t\"Jalawla'\",\n\t'Belfast',\n\t'Sotik Post',\n\t'Hejiaji',\n\t'Lovech',\n\t'Rokupr',\n\t'Yalda',\n\t'Mangaldai',\n\t'Goodyear',\n\t'Kolakaluru',\n\t'Bonney Lake',\n\t'Alcobaca',\n\t'Bideford',\n\t'Godawari',\n\t'Parnaiba',\n\t'Eskilstuna',\n\t'Conceicao do Almeida',\n\t'San Carlos Park',\n\t'Dolyna',\n\t'East Liverpool',\n\t'Ceylanpinar',\n\t'Adachi',\n\t'Pottassheri',\n\t'Kauhajoki',\n\t'Rio Paranaiba',\n\t'Patos de Minas',\n\t'Saint-Jean-de-Monts',\n\t'Irapuato',\n\t'Zhuolu',\n\t'Miadanandriana',\n\t'Inashiki',\n\t'Hildesheim',\n\t'Cold Springs',\n\t'Merksplas',\n\t'Engen',\n\t'LaSalle',\n\t'Uyo',\n\t'Vinh Chau',\n\t'Parsuram',\n\t'Yoshimi',\n\t'Jaypul',\n\t'Minooka',\n\t'Mehtar Lam',\n\t'Corsico',\n\t'Wanding',\n\t'Corbas',\n\t'Shaogang',\n\t'Lusanga',\n\t'Xining',\n\t'Navalgund',\n\t'Binh Minh',\n\t'Dindigul',\n\t'Doddanahalli',\n\t'Tefenni',\n\t'Samdrup Jongkhar',\n\t'Taylorsville',\n\t'Bulicun',\n\t'Lisieux',\n\t'Valley Falls',\n\t'Salpazari',\n\t'Pianoro',\n\t'Kedia',\n\t'Green Valley',\n\t'Cape Breton',\n\t'Rencun',\n\t'Bandar-e Genaveh',\n\t'Beaverton',\n\t'Purranque',\n\t'My Tho',\n\t'Wendlingen am Neckar',\n\t'Mohon',\n\t'Ngaoundere',\n\t'Boryslav',\n\t'Antonio Prado',\n\t'Ramgarh',\n\t'Gdynia',\n\t'Hoyland Nether',\n\t'Cori',\n\t'Adakli',\n\t'Na Wa',\n\t'Ramla',\n\t'Ellicott',\n\t'Nowa Sol',\n\t'Laakirchen',\n\t'Jalalpur Bhattian',\n\t'Jaragua do Sul',\n\t'Ilic',\n\t'Guimar',\n\t'Bullas',\n\t'Dalawarpur',\n\t'Anuradhapura',\n\t'Carnaubal',\n\t'Yokosuka',\n\t'Lake Mohawk',\n\t'Phulwar',\n\t'Bohemia',\n\t'Imzouren',\n\t'Tibigan',\n\t'Apostolove',\n\t'Cantley',\n\t'Mbuji-Mayi',\n\t'Uarini',\n\t\"Qarah Zia' od Din\",\n\t'Cortes',\n\t'Cullercoats',\n\t'Reggio di Calabria',\n\t'Figline Valdarno',\n\t'Mutsu',\n\t'Maiquinique',\n\t'New Panamao',\n\t'Odder',\n\t'Mar de Espanha',\n\t'Bukedea',\n\t'Rath To',\n\t'Choppington',\n\t'Irugur',\n\t'Padang Besar',\n\t'Cine',\n\t'Beckett Ridge',\n\t'Baghuz Fawqani',\n\t'Campos del Puerto',\n\t'Bandar-e Torkaman',\n\t'Sakon Nakhon',\n\t'San Juan de Alicante',\n\t'Benicarlo',\n\t'Beuningen',\n\t'Vrable',\n\t'Hennebont',\n\t'Mamobihat',\n\t'Three Springs',\n\t\"Saint-Cyr-l'Ecole\",\n\t'Brod',\n\t'Taourirt',\n\t'Sliven',\n\t'Stanytsia Luhanska',\n\t'Ruston',\n\t'Plauen',\n\t'Sarasota Springs',\n\t'Sao Gotardo',\n\t'Beloeil',\n\t'Liuguang',\n\t'Bani Suhayla',\n\t'Pilar',\n\t'Sao Joao do Araguaia',\n\t'Teseney',\n\t'Domzale',\n\t'Feira',\n\t'Ambatoria',\n\t\"Guang'an\",\n\t'Carice',\n\t'Loha',\n\t'Carmo do Rio Claro',\n\t'Calle Larga',\n\t'Ban Yang Hom',\n\t'Ilha de Mocambique',\n\t'Barwani',\n\t'Lowes Island',\n\t'Liaocheng',\n\t'Shergarh',\n\t'La Loggia',\n\t'Halden',\n\t'Khowrzuq',\n\t'Sahavalanina-Antenina',\n\t'Alum Rock',\n\t'Kilakkarai',\n\t'Finsterwalde',\n\t'Ouedo',\n\t'Tlalnepantla',\n\t'Tafi Viejo',\n\t'Minnampalli',\n\t'Santa Comba',\n\t'Sant Joan de Vilatorrada',\n\t'Marl',\n\t'Hulkoti',\n\t'Libourne',\n\t'Orasje',\n\t'Svolvaer',\n\t'Villa Curuguaty',\n\t'Velden am Worthersee',\n\t'Riverton',\n\t'Selmane',\n\t'Jamshedpur',\n\t'Sinsina',\n\t'Amity',\n\t'Kani-Bonzon',\n\t'Ilopango',\n\t'Kiliia',\n\t'Trelew',\n\t'Kowdalli',\n\t'Sao Martinho do Bispo',\n\t'Bayabas',\n\t'Marcolandia',\n\t'Hemel Hempstead',\n\t'Titlagarh',\n\t'Thathupur',\n\t'Kavieng',\n\t'Pepa',\n\t'Mangarwara',\n\t'Wanderlandia',\n\t'Sokolka',\n\t'Nara',\n\t'Koror',\n\t'Mbamba Bay',\n\t'Wezembeek-Oppem',\n\t'Tanjombato',\n\t'Eichstatt',\n\t'Independence',\n\t'Kagoshima',\n\t'Velingara',\n\t'Ouistreham',\n\t'St. Stephens',\n\t'Altinova',\n\t'Juchipila',\n\t'Jiaxing',\n\t'Millcreek',\n\t'Ameca',\n\t'Palmacia',\n\t'Fiano Romano',\n\t'Costa Volpino',\n\t'Rioja',\n\t'Kalkara',\n\t'Zanica',\n\t'Husainabad',\n\t'Naters',\n\t'Mistrato',\n\t'Ambahive',\n\t'Savanna-la-Mar',\n\t'Irinjalakuda',\n\t'Padappakara',\n\t'Chiantla',\n\t'Cidade Gaucha',\n\t'Walton-on-the-Naze',\n\t'Habiganj',\n\t'Irukanni',\n\t'Tekpanja',\n\t'Ellisville',\n\t'Luancheng',\n\t'Rudauli',\n\t'Abu al Matamir',\n\t'Nabas',\n\t'Kagadi',\n\t'Los Llanos',\n\t'Ilovaisk',\n\t'Ar Rumaythah',\n\t'Melun',\n\t'Catral',\n\t'Canico',\n\t'Pandharpur',\n\t'Hiroshima',\n\t'Don Bosco',\n\t'Billericay',\n\t'Mentana',\n\t'Sandravinany',\n\t'Pacos de Ferreira',\n\t'Darsi',\n\t'Tuineje',\n\t'Medinipur',\n\t'Mensora',\n\t'Nikaia',\n\t'Tan Chau',\n\t'Ma`alot Tarshiha',\n\t\"Huai'an\",\n\t'Spinea',\n\t'Silvia',\n\t'Alcarraz',\n\t'Dongxishan',\n\t'Putrajaya',\n\t'Two Rivers',\n\t'Inacio Martins',\n\t'Kharahara',\n\t'Jakarta',\n\t'Hurth',\n\t'Giengen an der Brenz',\n\t'New Delhi',\n\t'Morlenbach',\n\t'Krus na Ligas',\n\t'Tornquist',\n\t'Hacine',\n\t'Yanji',\n\t'Fraiburgo',\n\t'Gursu',\n\t'San Giljan',\n\t'Verin',\n\t'Moissac',\n\t'Baghambarpur',\n\t'Bhatpara',\n\t'Pontinha',\n\t'Cunha Alta',\n\t'Riacho das Almas',\n\t'Yadwad',\n\t'St. Albert',\n\t'Agno',\n\t'Sitarganj',\n\t'Budhni',\n\t'Comayagua',\n\t'Matagua',\n\t'Remagen',\n\t'Aigle',\n\t'Forest Hills',\n\t'Wangtan',\n\t'Avanhandava',\n\t'Karnobat',\n\t'Chanp',\n\t'Amherst',\n\t'Duiven',\n\t'Bilohirsk',\n\t'Pleternica',\n\t'Marogong',\n\t'Kefar Sava',\n\t'Quilmes',\n\t'Conchagua',\n\t'Al Khankah',\n\t'Dulken',\n\t'Lobatse',\n\t'Utehia',\n\t'Sotomayor',\n\t'Traunreut',\n\t'Aleksandrovka',\n\t'Hetane',\n\t'Bad Oeynhausen',\n\t'Pescara',\n\t'Ashkezar',\n\t'Seiro',\n\t'Torrejon de Ardoz',\n\t'Antanimora Atsinanana',\n\t'Yiewsley',\n\t'Fojnica',\n\t'Iharana',\n\t'Dutse',\n\t'Ban Lao Yao',\n\t'Dirusumarru',\n\t'Tame',\n\t'Beledweyne',\n\t'San Andres Xecul',\n\t'Formia',\n\t'Mengla',\n\t'Croix',\n\t'Kraslava',\n\t'Pedagadi',\n\t'Denbigh',\n\t'Barharwa Kalan',\n\t'Alexania',\n\t'Sakhnin',\n\t'Yenagoa',\n\t'Kaya',\n\t'Karlstad',\n\t'Bundibugyo',\n\t'Harrai',\n\t'Dragor',\n\t'San Jose de Las Matas',\n\t'Gabela',\n\t'Alpu',\n\t'Karema',\n\t'Yevlax',\n\t'Allanmyo',\n\t'Ghafurov',\n\t'Brandis',\n\t'Pulupandan',\n\t'Eidsvoll',\n\t'Hinunangan',\n\t'Manmad',\n\t'Guledagudda',\n\t'Bangshang',\n\t'Kujwa',\n\t'Fairview',\n\t'Arani',\n\t'Spoltore',\n\t'Peiting',\n\t'Panj',\n\t'Sahavato',\n\t'Cramlington',\n\t'Poggio a Caiano',\n\t'Sisauna',\n\t'Mamushe',\n\t'Tsevie',\n\t'Barikot',\n\t'Tecax',\n\t'Sivapuram',\n\t'Kalbacar',\n\t'Mitry-Mory',\n\t'Biguacu',\n\t'Trowbridge',\n\t'Hasanganj',\n\t'Chamblee',\n\t'Sid',\n\t'Alboraya',\n\t'Pinar del Rio',\n\t'Calvillo',\n\t'Mercedes',\n\t'Chapel en le Frith',\n\t'Kalat',\n\t\"Ra's al Khaymah\",\n\t'Mapoteng',\n\t'Ponta de Pedras',\n\t'Glenfield',\n\t'Temple Terrace',\n\t'Tlokweng',\n\t'Raun',\n\t'Aquin',\n\t'Boiling Springs',\n\t'Slobozhanske',\n\t'Truckee',\n\t'Nuremberg',\n\t'Yanghe',\n\t'Charqueadas',\n\t'Clarkston',\n\t'Wallingford Center',\n\t'Colleferro',\n\t'Luxor',\n\t'Gadsden',\n\t'Dautphe',\n\t'Macedo de Cavaleiros',\n\t'Venissieux',\n\t'Shamva',\n\t'Chesapeake',\n\t'Felsberg',\n\t'East Los Angeles',\n\t'Monte Caseros',\n\t'Misawa',\n\t'Souaflia',\n\t'Bouguirat',\n\t'Talara',\n\t'Iarinarivo',\n\t'Atalaia do Norte',\n\t'Pangunattam',\n\t'Little Ferry',\n\t'Oulad Tayeb',\n\t'Masar',\n\t'Melena del Sur',\n\t'Miura',\n\t'Panihati',\n\t'Andresy',\n\t'Ramayampet',\n\t'Basoko',\n\t'Thala',\n\t'Chifeng',\n\t'Majhaul',\n\t'Nediyanad',\n\t'Chaumont',\n\t'Belen de Escobar',\n\t'Karak',\n\t'Araxa',\n\t'Canteleu',\n\t'Vanrhynsdorp',\n\t'Achaguas',\n\t'Norwood',\n\t'Kandahar',\n\t'Santa Teresa',\n\t'Salmon Arm',\n\t'Kalutara',\n\t'Greene',\n\t'Harrisonburg',\n\t'Lohur',\n\t'Dingman',\n\t'Phon Charoen',\n\t'Farakka',\n\t'College Place',\n\t'Wodzislaw Slaski',\n\t'Alimodian',\n\t'Kemi',\n\t'Khapdeh',\n\t'Xaafuun',\n\t'Pongalur',\n\t'Chandwara',\n\t'Tecali',\n\t'Villacanas',\n\t'Kalluru',\n\t'Bouarouss',\n\t'Misantla',\n\t'Mazinde',\n\t'Rixensart',\n\t'Satellite Beach',\n\t'Jinhua',\n\t'Reedsburg',\n\t\"Togoch'ale\",\n\t'Marchena',\n\t'Wan Long',\n\t\"Lyuboml'\",\n\t'Ivancice',\n\t'Wendelstein',\n\t'Helston',\n\t'Manduria',\n\t'Shama',\n\t'Sedriano',\n\t'Cheruvaranam',\n\t'Nechi',\n\t'Mandu',\n\t'Binefar',\n\t'Sha Kok Mei',\n\t'Muta',\n\t'Caripito',\n\t'Petrolina de Goias',\n\t'Lianhe',\n\t'Brock',\n\t'Schonaich',\n\t'Aloguinsan',\n\t'Acapulco de Juarez',\n\t'Ayt Mohamed',\n\t'Poplar Bluff',\n\t'Limburgerhof',\n\t'Jaggampeta',\n\t'Ostroleka',\n\t'Kalamboli',\n\t'Ash Shihr',\n\t'Sasaima',\n\t'Vesele',\n\t'Lac-Brome',\n\t'Matnog',\n\t'Skokie',\n\t\"Ha'il\",\n\t'Tzaneen',\n\t'Greenford',\n\t'Savanur',\n\t'Permet',\n\t'Mallapur',\n\t'Ladyzhyn',\n\t'Dama',\n\t'Angers',\n\t'Montigny-le-Bretonneux',\n\t'Xiaodian',\n\t'Narok',\n\t'Eching',\n\t'Castel San Pietro Terme',\n\t'Itondy',\n\t'Alcudia',\n\t'Periyanayakkanpalaiyam',\n\t'Artigues-pres-Bordeaux',\n\t'Marikina Heights',\n\t'Ben Zakkay',\n\t'Cachipay',\n\t'Hertzogville',\n\t'Daman',\n\t'Wilsdruff',\n\t'Ben Guerir',\n\t'Sciacca',\n\t'Signa',\n\t'Tuy',\n\t'Kireka',\n\t'Reston',\n\t'Sarab-e Taveh-ye `Olya',\n\t'Singida',\n\t'Waldorf',\n\t'Ain Jemaa',\n\t'Al Ghat',\n\t'Deodrug',\n\t'Kotmale',\n\t'Guemar',\n\t'Skoura',\n\t'Tuaran',\n\t'Outa Bouabane',\n\t'Talaivasal',\n\t'Jerusalem',\n\t'Hegang',\n\t'Daskasan',\n\t'Hannan',\n\t'Murowana Goslina',\n\t'Bomlo',\n\t'Nova Veneza',\n\t'Coppell',\n\t'Miguelopolis',\n\t'Stadtallendorf',\n\t'Kishundaspur',\n\t'Yuxiaguan',\n\t'Aleksandrovac',\n\t'Mianwali',\n\t'Mujikharf',\n\t'Develi',\n\t'Khawr Fakkan',\n\t'Billapadu',\n\t'Cacu',\n\t'Oldenburg',\n\t'Lens',\n\t'Veternik',\n\t'Canet de Mar',\n\t'Vellaturu',\n\t'Colmar',\n\t'Guadalupe Nuevo',\n\t'Hulin',\n\t'Talwandi Bhai',\n\t'Sighisoara',\n\t'Santa Monica',\n\t'Alessandria',\n\t'Idku',\n\t'Barsaun',\n\t'Podebrady',\n\t'Dona Ines',\n\t'Eppelheim',\n\t'Lonavale',\n\t'Comitan',\n\t'Darby',\n\t'Billingham',\n\t'Saint-Maximin-la-Sainte-Baume',\n\t'Volterra',\n\t'Kombissiri',\n\t'San Lorenzo de Guayubin',\n\t'Mashyal',\n\t'Cogua',\n\t'Parral',\n\t'Coaticook',\n\t'Bekobod',\n\t'Ribadeo',\n\t'Bhanukumari',\n\t'Kampong Chhnang',\n\t'Vrbovec',\n\t'South Sioux City',\n\t'Kalaki',\n\t'Panama City',\n\t'Mustafabad',\n\t'Morur',\n\t'Zurbatiyah',\n\t'Gamba',\n\t'Toukoroba',\n\t'Bully-les-Mines',\n\t'Nattakkadaiyur',\n\t'Sand Springs',\n\t'Turek',\n\t'Nejapa',\n\t'Woodridge',\n\t'Laranjeiras',\n\t'Xiaozui',\n\t'Kottaiyur',\n\t'Sebaste',\n\t'Penn Forest',\n\t'La Esmeralda',\n\t'Nohsa',\n\t'Eskisehir',\n\t'Chillan Viejo',\n\t'Kani',\n\t'Terdal',\n\t'Sarta',\n\t'Jinan',\n\t'Oborniki',\n\t'Taketoyo',\n\t'Badnor',\n\t'Panchkula',\n\t'Tres Passos',\n\t'Cartaya',\n\t'Barra de Santa Rosa',\n\t'Ganapavaram',\n\t'Mulampilli',\n\t'Damaishan',\n\t'Meihuacun',\n\t'Pahsara',\n\t'Atessa',\n\t'Toucheng',\n\t'Chamba',\n\t'Kranuan',\n\t'Pasaul',\n\t'Westview',\n\t'Grimari',\n\t'San Jacinto de Buena Fe',\n\t'Porecatu',\n\t'Ihtiman',\n\t'Misilmeri',\n\t'Friesenheim',\n\t'Wentang',\n\t'Bageshwar',\n\t'Mahtha',\n\t'Tenes',\n\t'Eraclea',\n\t'Evesham',\n\t'Elmhurst',\n\t'Nahorkatiya',\n\t'Oil City',\n\t'Sidi Jaber',\n\t'Laxou',\n\t'Royal Kunia',\n\t'Dong Xoai',\n\t'Hathauri',\n\t'Ambinanintromby',\n\t'Jurovski Dol',\n\t'Erwitte',\n\t'Jerada',\n\t'Costas de Cao',\n\t'Douetire',\n\t'Terku Valliyur',\n\t'Samesi',\n\t'Halgeri',\n\t'Huichapan',\n\t'Bolpur',\n\t'Ban Bu Sung',\n\t'Dandong',\n\t'Bucaramanga',\n\t'Bhavnagar',\n\t'Walia',\n\t'Puerto Vallarta',\n\t'Rishikesh',\n\t'Solebury',\n\t'Maratturai',\n\t'Lindlar',\n\t'Bariarpur Kandh',\n\t'Yerbas Buenas',\n\t'Ottur',\n\t'Torpa',\n\t'Debre Zeyit',\n\t'Lemgo',\n\t'Piritiba',\n\t'San Lorenzo de El Escorial',\n\t'Paterson',\n\t'Gonzaga',\n\t'Calabasas',\n\t'Miahuatlan',\n\t'Castelo do Piaui',\n\t'Sprockhovel',\n\t'Adelaide',\n\t'Clay Cross',\n\t\"Do'stlik Shahri\",\n\t'Carrieres-sous-Poissy',\n\t'Hizan',\n\t'Mios',\n\t'Edenburg',\n\t'Worplesdon',\n\t'Le Kremlin-Bicetre',\n\t'Nanjundapuram',\n\t'Muratli',\n\t'Massena',\n\t'Girona',\n\t'Arifwala',\n\t'Chillum',\n\t'Salcedo',\n\t'Caoayan',\n\t'Kolonodale',\n\t'Curacautin',\n\t'Ixchiguan',\n\t'Dubnica nad Vahom',\n\t'Careiro da Varzea',\n\t'Meckenbeuren',\n\t'Lacombe',\n\t'Chifubu',\n\t'Kostinbrod',\n\t'Lipova',\n\t'Sao Joao Evangelista',\n\t'Messini',\n\t'Santangpai',\n\t'Viransehir',\n\t'Ait Ali',\n\t'Harsova',\n\t'Mamou',\n\t'Denkendorf',\n\t'Kalardasht',\n\t'Santo Antonio do Leverger',\n\t'Qusar',\n\t'San Tan Valley',\n\t'Kushima',\n\t'West Norriton',\n\t'Brasilia de Minas',\n\t'Hassleholm',\n\t'Shahdol',\n\t'Faqus',\n\t'Abbots Langley',\n\t'Zanandore',\n\t'Canon City',\n\t'Manjeri',\n\t'New Milton',\n\t'Regensdorf',\n\t'Flower Mound',\n\t'Dharphari',\n\t'Chapra',\n\t'Tazert',\n\t'Hirehadagalli',\n\t'Walkden',\n\t'Hatti',\n\t'Ohangaron',\n\t'Bujanovac',\n\t'Dharmapuram',\n\t'Munchenstein',\n\t'Ishigaki',\n\t'Cocody',\n\t'Karimpur',\n\t'Appukkudal',\n\t'New Kensington',\n\t'Palmas de Monte Alto',\n\t'Baghduma',\n\t'Sorisole',\n\t'Qarazhal',\n\t'Shemonaikha',\n\t'Korfez',\n\t'Mbale',\n\t'Shahar Telpa',\n\t'Gangwuzhen',\n\t'Qianzhou',\n\t'Potosi',\n\t'Monte Chingolo',\n\t'Baba Bakala',\n\t'Nottuln',\n\t'Talakad',\n\t'Dearborn Heights',\n\t'Mulakumud',\n\t'`Ali Shahr',\n\t'Nashtifan',\n\t'Buriti',\n\t'Veliko Tarnovo',\n\t'Forest Lake',\n\t'Mizuho',\n\t'Birni Lafia',\n\t'Honda',\n\t'Fortin de las Flores',\n\t'Corral de Bustos',\n\t'Dracut',\n\t'Dighwa',\n\t'La Riche',\n\t'Karsaut',\n\t'Mito',\n\t'Xunjiansi',\n\t'Gandia',\n\t'Sidi Makhlouf',\n\t'Xibeijie',\n\t'Peritoro',\n\t'Sanjiangkou',\n\t'Bounaamane',\n\t'Barja',\n\t'San Felipe del Progreso',\n\t'Daisen',\n\t'Avadi',\n\t'North Bay Shore',\n\t'Dagohoy',\n\t'Fuying',\n\t'Dabas',\n\t'Koipadi',\n\t'Bloomington',\n\t'Mecheria',\n\t'Sundargarh',\n\t'Rajod',\n\t'Serramazzoni',\n\t'Kokofata',\n\t'Urlati',\n\t'Temixco',\n\t'Barbadanes',\n\t'Peddapalli',\n\t'Le Mont-sur-Lausanne',\n\t'Berthoud',\n\t'Navrongo',\n\t'Brockworth',\n\t'West Goshen',\n\t'Arcos de Valdevez',\n\t'Lalgola',\n\t'Bakhmut',\n\t'Majibacoa',\n\t'Yangfang',\n\t'Malisheve',\n\t'Cloverdale',\n\t'Petah Tiqwa',\n\t'Yamanashi',\n\t'Riofrio',\n\t'Merta',\n\t'Yoro',\n\t'Trinidad',\n\t'Sobreda',\n\t'Sidi Allal el Bahraoui',\n\t'Naranammalpuram',\n\t'Baicoi',\n\t'Rolling Meadows',\n\t'Linjiang',\n\t'Aralam',\n\t\"Citta Sant'Angelo\",\n\t'Kaous',\n\t'Zacualpa',\n\t'Rivas',\n\t'Vellipalaiyam',\n\t'Ciudad Santa Catarina',\n\t'Chaungtha',\n\t'Los Lunas',\n\t'Crna na Koroskem',\n\t'San Miguel Ixtahuacan',\n\t'Pantukan',\n\t'Tsushima',\n\t'Donggangli',\n\t'Nalbach',\n\t'Begles',\n\t'Addlestone',\n\t'Maluso',\n\t'Atchison',\n\t'Vertentes',\n\t'Perth',\n\t'Deori Khas',\n\t'Cho Phuoc Hai',\n\t'Pacifica',\n\t'Belhatti',\n\t'Audincourt',\n\t'Baraidih',\n\t'Tsiningia',\n\t'Ampary',\n\t'Drobeta-Turnu Severin',\n\t'Tsumeb',\n\t'Atlantic City',\n\t'Villaguay',\n\t'Gyangze',\n\t'Wokingham',\n\t'Cowdenbeath',\n\t'Tehuacan',\n\t'Babanusah',\n\t'Kolobrzeg',\n\t'Iguala de la Independencia',\n\t'Shanklin',\n\t'Nasriganj',\n\t'Haql',\n\t'Bonab',\n\t'Ratnanagar',\n\t'Ermoupoli',\n\t'Besalampy',\n\t'Mannar',\n\t'Vigo',\n\t'Wolverhampton',\n\t'Idfu',\n\t'Zacapa',\n\t'Malacacheta',\n\t'Jersey City',\n\t'Tanmpegre',\n\t'Gemlik',\n\t'Bilovodsk',\n\t'Putyvl',\n\t'Memmelsdorf',\n\t'Ar Rustaq',\n\t'Munster',\n\t'Dano',\n\t'Barhan',\n\t'San Giorgio Ionico',\n\t'Shevington',\n\t'Larnaca',\n\t'Mawu',\n\t'Rio Verde de Mato Grosso',\n\t'Arroyos y Esteros',\n\t'Thoubal',\n\t'Breisach am Rhein',\n\t'Aizawl',\n\t'Bamessing',\n\t'Nurmo',\n\t'Lewistown',\n\t'Marseille',\n\t'Hyde Park',\n\t'Antsahalava',\n\t'Gardelegen',\n\t'Ramena',\n\t'Centerville',\n\t'Berdiansk',\n\t'Contla',\n\t'Lunavada',\n\t'Schwetzingen',\n\t'Vilangurichchi',\n\t'Lijiaxiang',\n\t'North Tustin',\n\t'Sycow',\n\t'San Severo',\n\t'Tugaya',\n\t'Luziania',\n\t'Bay',\n\t'Sete',\n\t'Torbat-e Heydariyeh',\n\t'Lerum',\n\t'Las Tunas',\n\t'Chalala',\n\t'Surat',\n\t'Tobias Barreto',\n\t'Svilengrad',\n\t'Viswanathaperi',\n\t'Duartina',\n\t'Basantpur',\n\t'Chikodi',\n\t'Joplin',\n\t'Hilongos',\n\t'Whitefish Bay',\n\t'Sisian',\n\t'Grimbergen',\n\t'Soham',\n\t'Bage',\n\t'Senlis',\n\t'Matungao',\n\t'Roche-a-Bateau',\n\t'Belfort',\n\t'Asarcik',\n\t'Alotenango',\n\t'Santa Catarina Ayotzingo',\n\t'Villa Tunari',\n\t'Dangcheng',\n\t'Sievierodonetsk',\n\t'Vigan',\n\t'Anahuac',\n\t'Iesolo',\n\t'Chandili',\n\t'Aleksandrow Lodzki',\n\t'Palkur',\n\t'Parwaha',\n\t'Machali',\n\t'Corleone',\n\t'Heemstede',\n\t'Vallehermoso',\n\t'Ermezinde',\n\t'Sedalia',\n\t'Guanxi',\n\t'Valea lui Mihai',\n\t'Montescaglioso',\n\t'Heerlerbaan',\n\t'Seika',\n\t'Tongxiao',\n\t'Ronneby',\n\t'Badou',\n\t'Andilana Avaratra',\n\t'Hope Mills',\n\t'Taiynsha',\n\t'Borgampad',\n\t'Gonder',\n\t'Weigelstown',\n\t'Boukhralfa',\n\t'Kurshab',\n\t'Bad Liebenwerda',\n\t'Hodal',\n\t'Franco da Rocha',\n\t'Gangtok',\n\t'Kamianka-Dniprovska',\n\t'Acilia',\n\t'Paks',\n\t'Dastgerd',\n\t'Montbeliard',\n\t'Molteno',\n\t'Lakshmipuram',\n\t'El Tabo',\n\t'North Massapequa',\n\t'San Juan Cotzal',\n\t'Buftea',\n\t'Freystadt',\n\t'Chiltiupan',\n\t'Jabera',\n\t'Ikizce',\n\t'Khurmi',\n\t'`Ajlun',\n\t'Kalpitiya',\n\t'Idlib',\n\t'Yuza',\n\t'Gaohucun',\n\t'Lavis',\n\t'Olesnica',\n\t'Parnera',\n\t'Windorah',\n\t'Munnarkod',\n\t'Tuckahoe',\n\t'Schotten',\n\t'Blansko',\n\t'Carregal do Sal',\n\t'Okemos',\n\t'Central Coast',\n\t'Anjehalli',\n\t'West Hollywood',\n\t'Chanthaburi',\n\t'Barauna',\n\t'Chettinayakkanpatti',\n\t'Aomori',\n\t'Sukurhutu',\n\t'Tiruvalam',\n\t'Lisala',\n\t'Al Bajur',\n\t'Santa Filomena',\n\t'Padre Paraiso',\n\t'Boura',\n\t'Teocuitatlan de Corona',\n\t'Inowroclaw',\n\t'Nova Milanese',\n\t'Yalta',\n\t'Lukulu',\n\t'Ambila',\n\t'Oulad Hassoune',\n\t'Folignano',\n\t'Salaman',\n\t'Belem de Sao Francisco',\n\t'Khvaf',\n\t'Rio Bravo',\n\t'Kotri',\n\t'Bom Jesus',\n\t'Ambodibonara',\n\t'Balvi',\n\t'Jiaozishan',\n\t'Cubuk',\n\t'Cagnes-sur-Mer',\n\t'Harrow Weald',\n\t'Nantingcun',\n\t'Choctaw',\n\t'Adalaj',\n\t'Hoi An',\n\t'Chintamani',\n\t'Ajka',\n\t'Havelock',\n\t'Votuporanga',\n\t'Uta',\n\t'Incirliova',\n\t'Ankazondandy',\n\t'Ash Shunah ash Shamaliyah',\n\t'Skegness',\n\t'Kedu',\n\t'Petite-Synthe',\n\t'Mungeli',\n\t'Anjahabe',\n\t'Maceira',\n\t'Sakurai',\n\t'Talya',\n\t'Ochtrup',\n\t'Polur',\n\t'Wake Forest',\n\t'Bushenyi',\n\t'Yihezhuang',\n\t'Vega Baja',\n\t'East Goshen',\n\t'Serra Talhada',\n\t'Ribeira Grande',\n\t'Branquinha',\n\t'Chimakurti',\n\t'Smyrna',\n\t'Lamesa',\n\t'Tabuelan',\n\t'Tuxpam de Rodriguez Cano',\n\t'Satyamangalam',\n\t'El Sauce',\n\t'Nasrullahganj',\n\t'Acerra',\n\t'Horlivka',\n\t'Beloit',\n\t'Adigaratti',\n\t'Puraini',\n\t'Gueltat Sidi Saad',\n\t'Egra',\n\t'Comendador',\n\t'Verrieres-le-Buisson',\n\t'Novoberde',\n\t'Onchan',\n\t'Puri',\n\t'Oudtshoorn',\n\t'Ab Pakhsh',\n\t'Melouza',\n\t'Schoonhoven',\n\t'Quilicura',\n\t'Arlon',\n\t'Steinkjer',\n\t'Port Macquarie',\n\t'Inca',\n\t'Erkelenz',\n\t'Lebrija',\n\t'Mandla',\n\t'Brus Laguna',\n\t'Deniliquin',\n\t'Schramberg',\n\t'Mokhotlong',\n\t'Walbrzych',\n\t'Azarshahr',\n\t'Highland Springs',\n\t'Ambodilazana',\n\t'Timurni',\n\t'Corbera de Llobregat',\n\t'Sanand',\n\t'Lugu',\n\t'Plovdiv',\n\t'Nokia',\n\t'Emden',\n\t'Biganos',\n\t'Sao Joao do Triunfo',\n\t'Carrollton',\n\t'Qadian',\n\t'Lowenberg',\n\t'Hongshandian',\n\t'Sultanpur Mor',\n\t'Uusikaupunki',\n\t'Manosque',\n\t'Itapevi',\n\t'Saudade',\n\t'Russi',\n\t'Brecksville',\n\t'Abaran',\n\t'Abu Suwayr',\n\t'Laranjeiras do Sul',\n\t'Krasnyi Luch',\n\t'Chekkal',\n\t'Grimma',\n\t'Aksum',\n\t'Arari',\n\t'Bromborough',\n\t'Yufle',\n\t'Indio',\n\t'Xonobod',\n\t'Trairi',\n\t'The Pinery',\n\t'Wehrheim',\n\t'Martuni',\n\t'Burbank',\n\t'Muritiba',\n\t'Nieuw-Vennep',\n\t'Cannock',\n\t'Neuhausen am Rheinfall',\n\t'Rostamabad',\n\t'Broome',\n\t'Voru',\n\t'Asilah',\n\t'Fazendinha',\n\t'West Orange',\n\t'Sirigeri',\n\t'Gurmatkal',\n\t'Simplicio Mendes',\n\t'Ede',\n\t'Rolesville',\n\t'Ashtian',\n\t'Saint-Genis-Laval',\n\t'Morada Nova',\n\t'Rohri',\n\t'Easton',\n\t'Tonacatepeque',\n\t'Marmande',\n\t'Neratovice',\n\t'Mildenhall',\n\t'Telaprolu',\n\t'North Perth',\n\t'Vengat',\n\t'Shirako',\n\t'Khanewal',\n\t'Malitbog',\n\t'Uherske Hradiste',\n\t'Sinsheim',\n\t'Baguanos',\n\t'Guigang',\n\t'Kumarankari',\n\t'Minudasht',\n\t'Bilauri',\n\t'Sihushan',\n\t'El Dovio',\n\t\"Sant'Anastasia\",\n\t'Puertollano',\n\t'Rotorua',\n\t'Douar Azla',\n\t'Tostedt',\n\t'Silkeborg',\n\t'Velakalnattam',\n\t'Malvik',\n\t'Redentora',\n\t'Kimhae',\n\t'Cankuzo',\n\t'Turuvanur',\n\t'Siliancun',\n\t'Davie',\n\t'Ouled Rahou',\n\t'Pederneiras',\n\t'Aviano',\n\t'Kwale',\n\t'Knik-Fairview',\n\t'Baiyashi',\n\t'Pendekallu',\n\t'Sarai Ranjan',\n\t'Appleton',\n\t'San Pedro',\n\t'Bautista',\n\t'Maurilandia',\n\t'San Giovanni in Persiceto',\n\t'East Bethel',\n\t'Slovenska Bistrica',\n\t'Caerdydd',\n\t'Satana',\n\t'Fakola',\n\t'Waukee',\n\t'Lindsay',\n\t'Bailleul',\n\t'Ventimiglia',\n\t'Zaltbommel',\n\t'Arua',\n\t'Mansingha',\n\t'Amauna',\n\t'Muridke',\n\t'Burgthann',\n\t'Kayapinar',\n\t'Kawachicho',\n\t'Jiuru',\n\t'Hartland',\n\t'Oberwingert',\n\t'Shiddapur',\n\t'Sherbrooke',\n\t'Divaca',\n\t'Tayum',\n\t'Trecate',\n\t'El Menzel',\n\t'Rawson',\n\t'Imaculada',\n\t'Mindat',\n\t\"L'Epiphanie\",\n\t'Ambarimaninga',\n\t'Oststeinbek',\n\t'Kuala Terengganu',\n\t'Sankt Polten',\n\t'Pageralam',\n\t'Carmen de Viboral',\n\t'Kety',\n\t'Inhambupe',\n\t'Nonantola',\n\t'South Lake Tahoe',\n\t'Hiji',\n\t'Erbaocun',\n\t'Millis',\n\t'Chervonohrad',\n\t'Williamsport',\n\t'Son La',\n\t'Leon de los Aldama',\n\t'Kraulshavn',\n\t'Figuil',\n\t'Ritterhude',\n\t'Sahel',\n\t'Karaga',\n\t'Rosarno',\n\t'Chudamani',\n\t'Stonehaven',\n\t'Jataizinho',\n\t'Surdulica',\n\t'Veghel',\n\t'Oki',\n\t'Hoxter',\n\t'Memari',\n\t'Holubivske',\n\t'Texcoco',\n\t'Aja',\n\t'Bayyavaram',\n\t'Pueblo',\n\t'Fengcheng',\n\t'Mossingen',\n\t'Arinos',\n\t'Bedesa',\n\t'Dolenjske Toplice',\n\t'Shadegan',\n\t'Pontecorvo',\n\t'Camano',\n\t'Fairburn',\n\t'Villefranche-sur-Saone',\n\t'Maiduguri',\n\t'Roxas City',\n\t'Biddeford',\n\t'Sokone',\n\t'Aravelli',\n\t'Palikir',\n\t'Herford',\n\t'Otsego',\n\t'Kamiita',\n\t'Brambleton',\n\t'Hongsi',\n\t'Bamafele',\n\t'Al Qurayn',\n\t'Naousa',\n\t'Urdorf',\n\t'Esira',\n\t'Cachoeira do Sul',\n\t'Botevgrad',\n\t'Jamjamal',\n\t'Sowerby Bridge',\n\t'Remada',\n\t'Vistahermosa',\n\t'Los Lagos',\n\t'Abengourou',\n\t'Jean-Mermoz',\n\t'Parker',\n\t'Hisor',\n\t'Oulunsalo',\n\t'Aguilar',\n\t'Yuscaran',\n\t'Sedro-Woolley',\n\t'Lankaran',\n\t'Zaniena',\n\t'Lucerne',\n\t'Tortum',\n\t'Lynbrook',\n\t'Rasiari',\n\t'Trappes',\n\t'Kirkel',\n\t'Balakrishnanpatti',\n\t'Getafe',\n\t'Bad Vilbel',\n\t'Mankayan',\n\t'Trindade',\n\t'La Ceja',\n\t'Tacuba',\n\t'Tagbina',\n\t'Severna Park',\n\t'Canosa di Puglia',\n\t'Gasan',\n\t'Daiwanishi',\n\t'Polohy',\n\t'Qaraghandy',\n\t'Ziri',\n\t'San Antonio de Padua',\n\t'Rarott',\n\t'Itami',\n\t'Carapo',\n\t'La Cruz de Rio Grande',\n\t'Ruskin',\n\t'Camooweal',\n\t'Barika',\n\t'Tohoku',\n\t'Pante Macassar',\n\t'Vocklabruck',\n\t'Erutukada',\n\t'Koili Simra',\n\t'Edea',\n\t'Targoviste',\n\t'Antanankambano',\n\t'Bangzha',\n\t'Bankass',\n\t'Podstrana',\n\t'Kakuma',\n\t'Quezaltepeque',\n\t'Schaan',\n\t'Daxincun',\n\t'Trikodi',\n\t'Yawatahama-shi',\n\t'Pefki',\n\t'The Hague',\n\t'Tamu',\n\t'Guli',\n\t'Shing',\n\t'Bakersfield',\n\t'Lanxi',\n\t'Singaparna',\n\t'Aljustrel',\n\t'Chirchiq',\n\t'Rio Acima',\n\t'Halstenbek',\n\t'Pandhurna',\n\t'Boa Nova',\n\t'Cerkvenjak',\n\t'Saint-Jean-le-Blanc',\n\t'Largo',\n\t'Basse-Terre',\n\t'Jimalalud',\n\t'Bhanas Hivre',\n\t\"Sant'Ilario d'Enza\",\n\t'Santa Lucia Utatlan',\n\t'Parasurampur',\n\t'New Providence',\n\t'Sofiivka',\n\t'Ban Muang Kham',\n\t'Pingdu',\n\t'Kyle',\n\t'Nellutla',\n\t'Hualqui',\n\t'New City',\n\t'Tangancicuaro de Arista',\n\t'Brawley',\n\t'Rucheng',\n\t'Bendorf',\n\t'Steinen',\n\t'Welby',\n\t'Valentigney',\n\t'Jacinto City',\n\t'Mweka',\n\t'Baler',\n\t'Sasso Marconi',\n\t'Fanzeres',\n\t'Sunrise',\n\t'Ovidiopol',\n\t'Canarana I',\n\t'Jaitwar',\n\t'Settat',\n\t'Villa Paranacito',\n\t'Lerdo de Tejada',\n\t'Westerstede',\n\t'Rangapukur',\n\t'Vinukonda',\n\t'Mastaga',\n\t'Terrasini Favarotta',\n\t'El Fuerte',\n\t'Heydarabad',\n\t'Rapperswil-Jona',\n\t'Preston',\n\t'Mahasamund',\n\t'Bossier City',\n\t'Kotamobagu',\n\t'Sowme`eh Sara',\n\t'Charala',\n\t'Gayeri',\n\t'Calape',\n\t'Villa Rica',\n\t'Panying',\n\t'Khandauli',\n\t'Oristano',\n\t'Ar Ramtha',\n\t'Ben Gardane',\n\t'Donnacona',\n\t'Bagamoyo',\n\t'Caras',\n\t'Chikha',\n\t'Kalikavu',\n\t'Lewiston',\n\t'Maseru',\n\t'Huanchaco',\n\t'Higuerote',\n\t'Yangshe',\n\t'Salinas Victoria',\n\t'Marofoty',\n\t'Yamen',\n\t'Hyderabad City',\n\t'Gusang',\n\t'Mexicali',\n\t'Yedtare',\n\t'Salgado de Sao Felix',\n\t'Gaffney',\n\t'Torcy',\n\t'Hodos',\n\t'Sangerhausen',\n\t'Tsuruta',\n\t'Bladensburg',\n\t\"Sach'on\",\n\t'Sabanozu',\n\t'Agustin Codazzi',\n\t'Kings Park West',\n\t'Periyamuttur',\n\t'Varnsdorf',\n\t'Akbez',\n\t'The Woodlands',\n\t'Puente Nacional',\n\t'Golcuk',\n\t'Sandbach',\n\t'Tullamore',\n\t'Chimalhuacan',\n\t'Kula',\n\t'Oliveira de Frades',\n\t'Yuasa',\n\t'Jieyang',\n\t'Conceicao de Jacuipe',\n\t'Pezinok',\n\t'Malgrat de Mar',\n\t'Ceske Budejovice',\n\t'Qapshaghay',\n\t'Membakut',\n\t'General Acha',\n\t'Studenka',\n\t'Cleveland',\n\t'Mehnajpur',\n\t'Darasuram',\n\t'Rubengera',\n\t'Kusadasi',\n\t'Buddh Gaya',\n\t\"Clermont-l'Herault\",\n\t'Bifeng',\n\t'Nakama',\n\t'Kuiju',\n\t'Scheessel',\n\t'Kajo Kaji',\n\t'Medina Estates',\n\t'Pointe-Claire',\n\t'Savannakhet',\n\t'Yarumal',\n\t'Saint-Egreve',\n\t'Sokoto',\n\t'Timonium',\n\t'Tire',\n\t'Ota',\n\t'Otwock',\n\t'Pretoria-Noord',\n\t'Iziaslav',\n\t'Bell Gardens',\n\t'Ecija',\n\t'Khunays',\n\t'Kottaipatti',\n\t'Garin',\n\t'Tuktukan',\n\t'Ibara',\n\t'Tyre',\n\t'Casteldaccia',\n\t'Gulgam',\n\t'Jaffna',\n\t'Gariadhar',\n\t'Zoetermeer',\n\t'Kasulu',\n\t'Santo Antonio dos Lopes',\n\t'Pannawonica',\n\t'Cajuru',\n\t'Belchertown',\n\t'Sonseca',\n\t'Non Sung',\n\t'Kardla',\n\t'Furstenfeldbruck',\n\t'Ban Tat',\n\t'Bydgoszcz',\n\t'Semere',\n\t'Fortuna',\n\t'Corralillo',\n\t'Coin',\n\t'Siegburg',\n\t'Comacchio',\n\t'Bellavista',\n\t'Mission Bend',\n\t'Avezzano',\n\t'Rancho Mission Viejo',\n\t'Mechraa Bel Ksiri',\n\t'Shirebrook',\n\t'Kizhariyur',\n\t'Bueng Kan',\n\t'Matigou',\n\t'Misratah',\n\t'Deventer',\n\t'Luau',\n\t'Kiratpur Rajaram',\n\t'Huanuni',\n\t'Kannamanayakkanur',\n\t'Kluczbork',\n\t'North Battleford',\n\t'Lukaya',\n\t'Bo`ka',\n\t'Baicheng',\n\t'Channahon',\n\t'Terrace Heights',\n\t'Uniao',\n\t'Kunigal',\n\t\"Porto Sant'Elpidio\",\n\t'Marin',\n\t'Bimun',\n\t'Dilijan',\n\t'Satkhira',\n\t'Erie',\n\t'Hemsworth',\n\t'Gueppi',\n\t'Urubici',\n\t'Daraw',\n\t'Kastoria',\n\t'Yutz',\n\t'Lichtenstein',\n\t'Unquillo',\n\t'Homewood',\n\t'Accrington',\n\t'Kalyanpur',\n\t'Diego de Almagro',\n\t'Beeville',\n\t'Koila',\n\t'Hathiakan',\n\t'Coka',\n\t'Bouake',\n\t'Veyrier',\n\t'Akhaltsikhe',\n\t'Tinaquillo',\n\t'Moncada',\n\t'Gladbeck',\n\t'Telpaneca',\n\t'Central Elgin',\n\t'Vari',\n\t'Plonsk',\n\t'Chateau-Thierry',\n\t'Schkopau',\n\t'Nawalpur',\n\t'Jagatpur',\n\t'La Ceiba',\n\t'Omuthiya',\n\t'Soalandy',\n\t'Kimberley',\n\t'Kappiyara',\n\t'Hyattsville',\n\t'Shichigahama',\n\t'Koronowo',\n\t'Modra',\n\t'Manolo Fortich',\n\t'Neuilly-sur-Marne',\n\t'San Juanito',\n\t'Sedhiou',\n\t'Pailon',\n\t'Vechta',\n\t'Schortens',\n\t\"Qia'erbagecun\",\n\t'Coalinga',\n\t'Plankstadt',\n\t'Cachoeira Alta',\n\t'Grand Prairie',\n\t'Ulsan',\n\t'Bouguenais',\n\t'Campina da Lagoa',\n\t'Sorong',\n\t'Churumuco de Morelos',\n\t'Byron Bay',\n\t'Sarny',\n\t'Bilbays',\n\t'Patiali',\n\t'Milagro',\n\t'Kothri Kalan',\n\t'Idaho Falls',\n\t'Bombo',\n\t'Muttunayakkanpatti',\n\t'Nidamanuru',\n\t'Countryside',\n\t'Buu Long',\n\t'Capitan Bado',\n\t'Surpur',\n\t'Reggane',\n\t'Campi Bisenzio',\n\t'Anantasagaram',\n\t'Salto Grande',\n\t'Baduria',\n\t'Echague',\n\t'Hollywood',\n\t'Rahat',\n\t'Lower Paxton',\n\t'Trebbin',\n\t'Wardha',\n\t'Beek en Donk',\n\t'Vilhena',\n\t'Bergeijk',\n\t'Chhapia',\n\t'Ganaram',\n\t'Chhanera',\n\t'Kapangan',\n\t'Roncade',\n\t'Walcourt',\n\t'Waltenhofen',\n\t'Bahar',\n\t'Oiba',\n\t'Willoughby',\n\t'Babol',\n\t'Alashankou',\n\t'Groton',\n\t'Ban Talat Rangsit',\n\t'Neijiang',\n\t'Johvi',\n\t'Ulao',\n\t'Nagold',\n\t'Lacey',\n\t'Marigot',\n\t'Zabljak',\n\t'Atushi',\n\t'Pileru',\n\t'Borodyanka',\n\t'Guaymate',\n\t'Alakamisy Anativato',\n\t'Montecchio Maggiore',\n\t'Umea',\n\t'Mekambo',\n\t'Jericho',\n\t'Urrao',\n\t'Conceicao do Mato Dentro',\n\t'Cutro',\n\t'Narayankher',\n\t'Ocoyoacac',\n\t'Las Margaritas',\n\t'North Cornwall',\n\t'Katiena',\n\t'Liangwancun',\n\t'Tarawan',\n\t'Tianjin',\n\t'Eltham',\n\t'Ampitasimo',\n\t'Patzcuaro',\n\t'Boortmeerbeek',\n\t'Zary',\n\t'New Tecumseth',\n\t'Izki',\n\t'Faradonbeh',\n\t'Ezine',\n\t'Mushie',\n\t'Kuvango',\n\t'La Quiaca',\n\t'Tamgrout',\n\t'Buenos Aires',\n\t'Khowrhesht',\n\t'Muskegon Heights',\n\t'Wangsicun',\n\t'Kimwanyi',\n\t'Narra',\n\t'Belton',\n\t'Khlong Luang',\n\t'Barhadashi',\n\t'Ixtlahuacan de los Membrillos',\n\t'Lauterbach',\n\t'Mohda',\n\t'Chepstow',\n\t'Blegny',\n\t'Reykjavik',\n\t'Jangalapalle',\n\t'Cumayeri',\n\t'Tarashcha',\n\t'Cervera',\n\t'Pouso Redondo',\n\t'Bunde',\n\t'Bariyarpur',\n\t'Zweibrucken',\n\t'Alzenau in Unterfranken',\n\t'Santo Tomas',\n\t'Taxtako`pir',\n\t'Colinas do Tocantins',\n\t'Vryburg',\n\t'Hooksett',\n\t'Rahui',\n\t'Daejeon',\n\t'Chinaval',\n\t'Pornichet',\n\t'Hazelwood',\n\t'Sherkot',\n\t'Shuishang',\n\t'Palmitos',\n\t'Erin',\n\t'Lagoa do Itaenga',\n\t'Uthal',\n\t'Whippany',\n\t'Zamboanguita',\n\t'Kasugai',\n\t'Kuurne',\n\t'Embarcacion',\n\t'Alsfeld',\n\t'Saint-Avertin',\n\t'Lokwabe',\n\t'Bronte',\n\t'Gemerek',\n\t'Diamond Bar',\n\t'Germantown',\n\t'Tengampudur',\n\t'Myanaung',\n\t'Amritpur',\n\t'Manhattan Beach',\n\t'Spring Valley Lake',\n\t'Niangoloko',\n\t'Crevalcore',\n\t'Bamble',\n\t'Hollabrunn',\n\t'Furtwangen im Schwarzwald',\n\t'Ariquemes',\n\t'Baruari',\n\t'Paura Madan Singh',\n\t'Bracknell',\n\t'Le Bouscat',\n\t'Pirapozinho',\n\t'Puyappalli',\n\t'Zhengjiatun',\n\t'Garibaldi',\n\t'Aydin',\n\t'Sestri Levante',\n\t'Panjampatti',\n\t'Chengbin',\n\t'Ambohitrambo',\n\t'Olympia Heights',\n\t'Fuxin',\n\t'Jupiter Farms',\n\t'Birjand',\n\t'Sugauna',\n\t'Villa La Angostura',\n\t'Abu Hummus',\n\t'Igreja Nova',\n\t'Sanghera',\n\t'Tremembe',\n\t'Bhopalia',\n\t'Vila Velha',\n\t'Papampeta',\n\t'Dhanga',\n\t'Sheyban',\n\t'Jaltenango',\n\t'Tagapul-an',\n\t'Kulusuk',\n\t'Montesson',\n\t'Chascomus',\n\t'Guernica y Luno',\n\t'Itamarati',\n\t'Metepec',\n\t'Wadersloh',\n\t'Costa Marques',\n\t'Barod',\n\t'Bhaisalotan',\n\t'Velez-Malaga',\n\t'Raunds',\n\t'Hushihacun',\n\t'Sindgi',\n\t'Quivican',\n\t'Ivoti',\n\t'Maroteza',\n\t'Bazar-Korgon',\n\t'Baduriatola',\n\t'Tysons',\n\t'Saidapet',\n\t'Busto Arsizio',\n\t'Cabanatuan City',\n\t'Sami',\n\t'Logansport',\n\t'Besozzo',\n\t'Sonaguera',\n\t'Acevedo',\n\t'Harbiye',\n\t'Prairie Ridge',\n\t'Kasaragod',\n\t\"Hosa'ina\",\n\t'Borgo San Dalmazzo',\n\t'Cockeysville',\n\t'Kabirpur',\n\t'Mikuszowice',\n\t'Kamiichi',\n\t'Arsali',\n\t'Enugu',\n\t'Sahanivotry-Manandona',\n\t'Savar',\n\t'Al Khubar',\n\t'Haddon',\n\t'Allahdurg',\n\t'Rodynske',\n\t'Puduru',\n\t'Jiquirica',\n\t'Kirishima',\n\t'Skive',\n\t'Aj Jourf',\n\t'Uedem',\n\t'Cananea',\n\t'Stryzhavka',\n\t'Bankapur',\n\t'`Afrin',\n\t'Saint-Colomban',\n\t'Imperia',\n\t'Valsequillo de Gran Canaria',\n\t'Jette',\n\t'Hamm',\n\t'Piranga',\n\t'Rixheim',\n\t'Currimao',\n\t'Opuwo',\n\t'Herohalli',\n\t'Larreynaga',\n\t'Gravina in Puglia',\n\t'Benton Harbor',\n\t'Afragola',\n\t'Castelldefels',\n\t'Lubao',\n\t'Brahmanbaria',\n\t'Barkly West',\n\t'San Rafael del Norte',\n\t'Abu Dhabi',\n\t'Mamburao',\n\t'Chartres',\n\t'Hawick',\n\t'Shiruru',\n\t'Butajira',\n\t'Newcastle',\n\t'Igarape-Miri',\n\t'San Mariano',\n\t'Statesboro',\n\t'Cachoeira do Arari',\n\t'Goumori',\n\t'Kassaro',\n\t'Karaisali',\n\t'Yoshida',\n\t'Stekene',\n\t'Walajabad',\n\t'Alcorcon',\n\t'Seneca',\n\t'Cabagan',\n\t'Mansfield',\n\t'Valsad',\n\t'Monaragala',\n\t'Barro',\n\t'Assebroek',\n\t'Al Mubarraz',\n\t\"L'Isle-d'Abeau\",\n\t'Cajueiro',\n\t'Wanstead',\n\t'Iten',\n\t'Salamina',\n\t'Jacinto Machado',\n\t'Kuyganyor',\n\t'Ar Rusayfah',\n\t'Morgantown',\n\t'Balta',\n\t'Anse-a-Foleur',\n\t'Crnomelj',\n\t'Dagbe',\n\t'Nubl',\n\t'Isumi',\n\t'Arumbavur',\n\t'Lohuti',\n\t'Backa Palanka',\n\t'Marktoberdorf',\n\t'Massango',\n\t'Gamay',\n\t'Asbury Park',\n\t'Piracicaba',\n\t'Tadas',\n\t'Malanvadi',\n\t'Ranko',\n\t'Falam',\n\t'Kerava',\n\t'Brevik',\n\t'Fort Madison',\n\t'San Pablo Villa de Mitla',\n\t'La Resolana',\n\t'Irun',\n\t'Santa Juana',\n\t'Senirkent',\n\t'Colbun',\n\t'Chasiv Yar',\n\t'Bailleston',\n\t'Mairwa',\n\t'Ba Don',\n\t'Caetanopolis',\n\t'Popovo',\n\t'Bandipura',\n\t'Brewer',\n\t'Raesfeld',\n\t'Chityal',\n\t'Bois-Guillaume',\n\t'Miahuatlan de Porfirio Diaz',\n\t'Eupen',\n\t'Riemst',\n\t'Reims',\n\t'Menen',\n\t'Wundanyi',\n\t'Guarenas',\n\t'Biankouma',\n\t'Vila Bela da Santissima Trindade',\n\t'Pallappalaiyam',\n\t'Farmington',\n\t'Bradenton',\n\t'Singoli',\n\t'Cainta',\n\t'Farahalana',\n\t'Simoes Filho',\n\t'San Zenon',\n\t'Planadas',\n\t'Catole do Rocha',\n\t'Solrod Strand',\n\t'Rovinj',\n\t'Dracena',\n\t'Jablonec nad Nisou',\n\t'Chhagalnaiya',\n\t'Ampataka',\n\t'Lohagara',\n\t'Zarautz',\n\t'Tiquisio',\n\t'Epinay-sous-Senart',\n\t'Soka',\n\t'Gandarbal',\n\t'Los Muermos',\n\t'Akyaka',\n\t'Az Zaqaziq',\n\t'Ibaretama',\n\t'San Jose Guayabal',\n\t'Phulparas',\n\t'Unity',\n\t'Anderson',\n\t'Post Falls',\n\t'Bandio',\n\t'Quiindy',\n\t'Mazoe',\n\t'Gokarna',\n\t'Weston-super-Mare',\n\t'Donihue',\n\t'Maliano',\n\t'Sahibganj',\n\t'Stropkov',\n\t'Williston',\n\t'Khutauna',\n\t'Mishrikot',\n\t'Rice Lake',\n\t'Boa Viagem',\n\t'Ashkhaneh',\n\t'Wabag',\n\t'Ban Mangkon',\n\t'Bognor Regis',\n\t'Alabel',\n\t'Hoor',\n\t'Perote',\n\t'Sotkamo',\n\t'Mukondapalli',\n\t'Kenzingen',\n\t'El Alia',\n\t'Barssel',\n\t'Libon',\n\t'Pljevlja',\n\t'Karumulaikkal',\n\t'Atlatlahucan',\n\t'Puteaux',\n\t'Ramnicu Sarat',\n\t'Karariya',\n\t'Floro',\n\t'Richard-Toll',\n\t'Semuto',\n\t'Jilotlan de los Dolores',\n\t'Nellikkuppam',\n\t'Malsch',\n\t'Khowrasgan',\n\t'Ambodimahabibo',\n\t'Safidon',\n\t'Canoinhas',\n\t'Ban Na Yang',\n\t'Kuttur',\n\t'Makubetsu',\n\t'Tsavo',\n\t'Guape',\n\t'Mapleton',\n\t'Sao Sebastiao da Grama',\n\t'Cannanore',\n\t'Sama',\n\t'Vail',\n\t'Alwar',\n\t'Cherlagandlapalem',\n\t'Zyryanovsk',\n\t'Kopong',\n\t'Wabrzezno',\n\t'Antsampanimahazo',\n\t'Forney',\n\t'Obock',\n\t'Banstead',\n\t'Kovurupalli',\n\t'Bientina',\n\t'Le Creusot',\n\t'Bontang',\n\t'Pierre',\n\t'Sidi Aissa',\n\t'San Ignacio Cerro Gordo',\n\t'Lancon-Provence',\n\t'Sao Bento do Sul',\n\t'Arkadelphia',\n\t'Lalru',\n\t'Neriyamangalam',\n\t'Kwai Chung',\n\t'Matsubara',\n\t'Metapan',\n\t'Hopatcong',\n\t'Baniyas',\n\t'Song Phi Nong',\n\t'Labason',\n\t'Kashima',\n\t'Bafanji',\n\t'Isola del Liri',\n\t'Las Rozas de Madrid',\n\t'Herdecke',\n\t'Ait Bousarane',\n\t'Itanhandu',\n\t'Odemis',\n\t'Mohgaon',\n\t'Bilgoraj',\n\t'Poquoson',\n\t'Dilolo',\n\t'Soliman',\n\t'Videira',\n\t'Sankt Augustin',\n\t'Hachimantai',\n\t'Oneida',\n\t'Medeiros Neto',\n\t'Sakri',\n\t'Chestnut Ridge',\n\t'Burubaytal',\n\t'Oruro',\n\t'Beauraing',\n\t'Mauli',\n\t'Curanilahue',\n\t'Great Neck',\n\t'Skofja Loka',\n\t'Aiken',\n\t'Roncador',\n\t'Temuco',\n\t'Oros',\n\t'Timmapur',\n\t'Kununurra',\n\t'Naqadeh',\n\t'Clarin',\n\t'Podgorica',\n\t'Beldanga',\n\t'Mutluru',\n\t'South Whitehall',\n\t'Prince Rupert',\n\t'Nirasaki',\n\t'Hodatsushimizu',\n\t'Trani',\n\t'Voghera',\n\t'Purkersdorf',\n\t'Medapadu',\n\t'Puerto Francisco de Orellana',\n\t'Fatao',\n\t'Sidi Yahia El Gharb',\n\t'Spiez',\n\t'Pujili',\n\t'Renk',\n\t'Quemado de Guines',\n\t'Antenetibe',\n\t'Rueil-Malmaison',\n\t'Saimbeyli',\n\t'Asagi Quscu',\n\t'Tsarahasina',\n\t'Hunasagi',\n\t'Chilpancingo',\n\t'Goycay',\n\t'Republic',\n\t'Bocholt',\n\t'Montgeron',\n\t'Dodji-Bata',\n\t'Panzgam',\n\t'Joinville-le-Pont',\n\t'Fergus',\n\t'Tenkasi',\n\t'Groveland',\n\t'El Carmen de Atrato',\n\t'Garou',\n\t'Sangao',\n\t'Buffalo',\n\t'Oulad Amrane el Mekki',\n\t'Bethune',\n\t'Sidfa',\n\t'Cuichapa',\n\t'Maria Aurora',\n\t'Sanzana',\n\t'Vaxjo',\n\t'Tsrar Sharif',\n\t'Samut Sakhon',\n\t'Novate Milanese',\n\t'Mirdaul',\n\t'Broadview Heights',\n\t'Domaa-Ahenkro',\n\t'Herseh Chhina',\n\t'Tupa',\n\t'Porec',\n\t'Mount Evelyn',\n\t'Balboa Heights',\n\t'Xuqiaocun',\n\t'Sumbawa Besar',\n\t'Nahiyat Khan Bani Sa`d',\n\t'Danli',\n\t'Bartin',\n\t'Feyzin',\n\t'Peruvanthanam',\n\t'Chene-Bougeries',\n\t'Malakal',\n\t'North Middleton',\n\t'Hauzenberg',\n\t'Datteln',\n\t'Goiatuba',\n\t'Solan',\n\t'Ol Kalou',\n\t'Kaedi',\n\t'Sakib',\n\t'Reyes',\n\t'Freudenstadt',\n\t'Anamalais',\n\t'Chengxiang',\n\t'Ely',\n\t'Monmouth',\n\t'Fukude',\n\t'Nepanagar',\n\t'Bousse',\n\t'Emba',\n\t'Ghusiya',\n\t'Noisiel',\n\t'Barharia',\n\t'Techiman',\n\t'Castilho',\n\t'Higashi-osaka',\n\t'Kerugoya',\n\t'Bouaiche',\n\t'Laurel',\n\t'Suluktu',\n\t'Hanzviur',\n\t'Rosrath',\n\t'Ciro Marina',\n\t'Cabanillas del Campo',\n\t'Qahjavarestan',\n\t'Zuidhorn',\n\t'Beilen',\n\t'Minami-Soma',\n\t'Douentza',\n\t'Florianopolis',\n\t'Darende',\n\t'Catanduva',\n\t'Wao',\n\t'Rasingapuram',\n\t'Huodoushancun',\n\t'Fontaine-les-Dijon',\n\t'Shinyanga',\n\t'Sargodha',\n\t'Penfield',\n\t'Dunaujvaros',\n\t'Ube',\n\t'Ain Dfali',\n\t'Andrembesoa',\n\t'Kochas',\n\t'Kondalampatti',\n\t'Khejroli',\n\t'Manassas',\n\t'Macaiba',\n\t'Uson',\n\t'Langelsheim',\n\t'Kottukal',\n\t'Sharan',\n\t'Longueuil',\n\t'Parappur',\n\t'Kurivikod',\n\t'Pindi Bhattian',\n\t'Buuhoodle',\n\t'Karjat',\n\t'Befandriana',\n\t'Alto Santo',\n\t'Pinneli',\n\t'Mlawa',\n\t'Cortez',\n\t'Katteragandla',\n\t'Badalona',\n\t'Zibo',\n\t'Keizer',\n\t'Marijampole',\n\t'Loncoche',\n\t'Mpika',\n\t'Hobro',\n\t'Mancora',\n\t'Bosconia',\n\t'Frohburg',\n\t'Weilerswist',\n\t'Las Charcas',\n\t'Carney',\n\t'Bhansia',\n\t'Simrahi',\n\t'Guildford',\n\t'Fuquay-Varina',\n\t'Braunau am Inn',\n\t'Pine Hills',\n\t'Franconville',\n\t'Noordwijkerhout',\n\t'Bezons',\n\t'Sliema',\n\t'Pinellas Park',\n\t'Kafr Qasim',\n\t'Dundee',\n\t'Valley',\n\t'Bromsgrove',\n\t'Coacalco',\n\t'Kralupy nad Vltavou',\n\t'Lafrayta',\n\t'Tunapuna',\n\t'Barmstedt',\n\t'Upper Saucon',\n\t'Palaiya Ayakkudi',\n\t'Mladenovac',\n\t'Qaratau',\n\t'Hurtgenwald',\n\t'Mailapur',\n\t'Tucurui',\n\t'Australia',\n\t'Cidelandia',\n\t'Holly Hill',\n\t'Kannandahalli',\n\t'Gilgit',\n\t'Roetgen',\n\t'Jirkov',\n\t'Madavur',\n\t'Eastham',\n\t'Kachavaram',\n\t'Qal`at an Nakhl',\n\t'Pearl River',\n\t'Oberstdorf',\n\t'Andilamena',\n\t'Tittagudi',\n\t'Ceel Baraf',\n\t'Meerbusch',\n\t'Jaunpur',\n\t'Terrell',\n\t'Ban Nong Kula',\n\t'Sarmiento',\n\t'Coaldale',\n\t'Baneh',\n\t'Leh',\n\t'Mirai',\n\t'Ambodisikidy',\n\t'Amtar',\n\t'Boise',\n\t'Solsona',\n\t'Maizuru',\n\t'Villa Luvianos',\n\t'Twentynine Palms',\n\t'Murapaka',\n\t'Monclova',\n\t'Miharu',\n\t'Krumbach',\n\t'Haldensleben',\n\t'Inaja',\n\t'Iguatu',\n\t'Ponto Novo',\n\t'Batabano',\n\t'Itape',\n\t'Poggiomarino',\n\t'Gayaspur',\n\t'Monte San Juan',\n\t'Kostiantynivka',\n\t'Bagalvad',\n\t'Pozoblanco',\n\t'Gaunivaripalle',\n\t'Gandhidham',\n\t'Pingxiangcheng',\n\t'Flers-lez-Lille',\n\t'Owasso',\n\t'Summerville',\n\t'Ban Tap Tao',\n\t'Mahisanrh',\n\t'Podaturpeta',\n\t'Kalanchak',\n\t'Lira',\n\t'Yaguaron',\n\t'Saharanpur',\n\t'Guthrie',\n\t'Tirat Karmel',\n\t'Sagala',\n\t'Griesheim',\n\t'Riesa',\n\t'Anaikal',\n\t'Kontiolahti',\n\t'Betania',\n\t'Varjota',\n\t'Pisaflores',\n\t'Encarnacion de Diaz',\n\t'Tafeng',\n\t'Ioannina',\n\t'Ha Giang',\n\t'Ash Shinan',\n\t'Maromiandra',\n\t'Kampel',\n\t'Seyyedan',\n\t'Elk',\n\t'Marcos Juarez',\n\t'Timri',\n\t'Ewarton',\n\t'Betul Bazar',\n\t'Sao Jose do Belmonte',\n\t'Amboahangibe',\n\t'Isser',\n\t'Yellayapalem',\n\t'Bhiwani',\n\t'Ad Dakhla',\n\t'Edmond',\n\t'Lourosa',\n\t'Aslanapa',\n\t'Ilsede',\n\t'Phoenix',\n\t'Negrine',\n\t'Prabhat Pattan',\n\t'Tapaktuan',\n\t'Camalig',\n\t'Upper Montclair',\n\t'Binh Long',\n\t'Trincomalee',\n\t'Yellowknife',\n\t'Turbo',\n\t'Kashaf',\n\t'Rapur',\n\t'Jamiltepec',\n\t'Zaggota',\n\t'Serui',\n\t'Ban Nam Dip Luang',\n\t'Sursee',\n\t'Miyoshidai',\n\t'Chichiriviche',\n\t'Kariat Ben Aouda',\n\t'Tranomaro',\n\t'Torokbalint',\n\t'Eiheiji',\n\t'Fartura',\n\t'Lonate Pozzolo',\n\t'Lixingcun',\n\t'Purwakarta',\n\t\"Fu'an\",\n\t'Havi Bhauar',\n\t'Livinjipuram',\n\t'Sherwood',\n\t'Cayenne',\n\t'Hamme',\n\t'Bao Loc',\n\t'Cameta',\n\t'San Fructuoso de Bages',\n\t'Mawlamyine',\n\t'Yonkers',\n\t'Doudian',\n\t'Orebro',\n\t'Longvic',\n\t'Penaballi',\n\t'Sinzig',\n\t'Jambi',\n\t'Bandundu',\n\t'Poshkent',\n\t'Dhamdaha',\n\t'Springettsbury',\n\t'Savage',\n\t'Iga',\n\t'Narsimlapet',\n\t'Hatwans',\n\t'Marco Island',\n\t'Mallikkundam',\n\t'Loharda',\n\t'Aguada de Pasajeros',\n\t'Jining',\n\t'Dhana',\n\t'Raceland',\n\t'Wroclaw',\n\t'Sao Lourenco da Mata',\n\t'Kiblawan',\n\t'Alagoa Nova',\n\t'Trentham',\n\t'Alofi',\n\t'Missoula',\n\t'Pecanha',\n\t'Atok',\n\t'Paipa',\n\t'Kouroussa',\n\t'Arnavutkoy',\n\t'Ankaran',\n\t'Jorhat',\n\t'Susari',\n\t'Higashi-Hiroshima',\n\t'Incline Village',\n\t'Rafael Calzada',\n\t'Thetford',\n\t'Jelgava',\n\t'Manono',\n\t'Tuncheng',\n\t'Potrerillos',\n\t'Lopon',\n\t'Moline',\n\t'Cornelio Procopio',\n\t'Dali',\n\t'Agropoli',\n\t'Inazawa',\n\t'Korosavada',\n\t'Elne',\n\t'Karur',\n\t'Vasudevanallur',\n\t'Viti',\n\t'Rezina',\n\t'Paju',\n\t'Thohoyandou',\n\t'Enniskillen',\n\t'Bad Fallingbostel',\n\t'Sokobanja',\n\t'Pleven',\n\t'Bang Phongphang',\n\t'Danga',\n\t'Tahuna',\n\t'Belsara',\n\t'Battalgazi',\n\t'Paravada',\n\t'General Belgrano',\n\t'Qingping',\n\t'Jinsha',\n\t'Malmedy',\n\t'Santa Cruz Mulua',\n\t'Lindenberg im Allgau',\n\t'Karpenisi',\n\t'Dondo',\n\t'Viralippatti',\n\t'Tado',\n\t'Cimanggis',\n\t'Barra do Bugres',\n\t'Kudahuvadhoo',\n\t'Badru Khan',\n\t'Samorin',\n\t'Tiruverumbur',\n\t'Taloda',\n\t'Roding',\n\t'Bante',\n\t'La Independencia',\n\t'Basseterre',\n\t'Ati',\n\t'Cavinti',\n\t'Chitembo',\n\t'Ryugasaki',\n\t'Eschborn',\n\t'Vertientes',\n\t'Bobingen',\n\t'Haliyal',\n\t'Sao Gabriel da Cachoeira',\n\t'Dielheim',\n\t'Siirt',\n\t'Oosterend',\n\t'Aich',\n\t'Ilkhchi',\n\t'Labrador City',\n\t'Chioggia',\n\t'Neuquen',\n\t'Upper Allen',\n\t'Itajobi',\n\t'Baltimore',\n\t'Nagra',\n\t'Wegorzewo',\n\t'Sansa',\n\t'Suaita',\n\t'Purral',\n\t'Narwar',\n\t'Denan',\n\t'Kandla Port',\n\t'Koubel-Koundia',\n\t'Airdrie',\n\t'Karumandi Chellipalaiyam',\n\t'Parol',\n\t'San Francisco la Union',\n\t'Kocasinan',\n\t'Sidi Abdallah',\n\t'Merzenich',\n\t'Correntina',\n\t'Saunda',\n\t'Paducah',\n\t'Keve',\n\t'Nandiala',\n\t'Indramayu',\n\t'Qusmuryn',\n\t'Aramangalam',\n\t'Mavorano',\n\t'Koppaka',\n\t'Corroios',\n\t'Thornbury',\n\t'Palm City',\n\t'Sao Felix da Marinha',\n\t'Giffnock',\n\t'Cardenas',\n\t'Kyaunggon',\n\t'Zhoukou',\n\t'Red Deer',\n\t'Constanza',\n\t'Libertador General San Martin',\n\t'Ducheng',\n\t'Orsova',\n\t'Bures-sur-Yvette',\n\t'Tixtla de Guerrero',\n\t'Tlachichilco',\n\t'Kangan',\n\t'Lyndhurst',\n\t'Wexford',\n\t'Chitipa',\n\t'Palagonia',\n\t'Olsberg',\n\t'Antongomena-Bevary',\n\t'Wayaobu',\n\t'Irosin',\n\t\"Sa'ada\",\n\t'Lamwo',\n\t'Bibemi',\n\t'Bartow',\n\t'Floresti',\n\t'Kemin',\n\t'Baramandougou',\n\t'Baybay',\n\t'Nansang',\n\t'Frenstat pod Radhostem',\n\t'Mizhhiria',\n\t'Zelino',\n\t'Beni Abbes',\n\t'Tarkwa',\n\t'Ezhipram',\n\t'Vicente Noble',\n\t'Hitachi-ota',\n\t'Muhembo',\n\t'Ksar el Hirane',\n\t'Lauchhammer',\n\t'Agboville',\n\t'Big Bear City',\n\t'Oradea',\n\t'Mabitac',\n\t'Trashigang',\n\t'An Nasiriyah',\n\t'Belo Oriente',\n\t'Pampas',\n\t'Schifferstadt',\n\t'Guatemala City',\n\t'Pithampur',\n\t'I`zaz',\n\t'Poranki',\n\t'Arcola',\n\t'Perugia',\n\t'Betmangala',\n\t'Haqqulobod',\n\t'Wujiaying',\n\t'Ankazoabokely',\n\t'Agrestina',\n\t'Rodenbach',\n\t'Nowshahr',\n\t'Sierning',\n\t'Santa Maria de Jesus',\n\t'Madalena',\n\t'Tarrafal',\n\t'Mitoma',\n\t'Roseaux',\n\t'Wichita',\n\t'Grudziadz',\n\t'Zarnesti',\n\t'Findikli',\n\t'Sarnen',\n\t'Irpin',\n\t'Rouen',\n\t'Qishe',\n\t'Dammartin-en-Goele',\n\t'Hazel Dell',\n\t'Charikar',\n\t'Ostrzeszow',\n\t'Tunari',\n\t'Kingri',\n\t'La Reina',\n\t'Boriziny',\n\t'Nangavaram',\n\t'Jahangirpur Salkhani',\n\t'Mangobandar',\n\t'Gustavia',\n\t'Alangudi',\n\t'Naumburg',\n\t'Sarikishty',\n\t'Dania Beach',\n\t'Budaka',\n\t'Tillmans Corner',\n\t'Ramotswa',\n\t'Menges',\n\t'Dasuya',\n\t'Darreh Shahr',\n\t'Perumkulam',\n\t'Moorreesburg',\n\t'El Ejido',\n\t'Lingayen',\n\t'Fontana',\n\t'Ubaporanga',\n\t'Shoo',\n\t'Heroica Matamoros',\n\t'Bayog',\n\t'Marikal',\n\t'Da Nang',\n\t'Lampertheim',\n\t'Basbiti',\n\t'Ramonville-Saint-Agne',\n\t'Kuwait City',\n\t'Manakana',\n\t'Mandra',\n\t'Tehata',\n\t'Stein bei Nurnberg',\n\t'Crigglestone',\n\t'Brofodoume',\n\t'Trnava',\n\t'Thimphu',\n\t'Gurmia',\n\t'Cacem',\n\t'Alahina',\n\t'Mongo',\n\t'Khayelitsha',\n\t'Sadri',\n\t'Fukui',\n\t'Dharmaj',\n\t'Kaatsheuvel',\n\t'Dammarie-le-Lys',\n\t'Matsakabanja',\n\t'Ait Ouaoumana',\n\t'Kirovsk',\n\t'Savur',\n\t'Baranivka',\n\t'Kodaikanal',\n\t'Lantana',\n\t'Shache',\n\t'Jacobabad',\n\t'President Quirino',\n\t'Kozienice',\n\t'Coatetelco',\n\t'Tha Muang',\n\t'Fanlu',\n\t'Ejutla de Crespo',\n\t'Senhora da Hora',\n\t'Bhadarwah',\n\t'Almazora',\n\t'Americus',\n\t'Schaesberg',\n\t'Liulin',\n\t'Shahrak-e Ja`fariyeh',\n\t'Pathankot',\n\t'Kirkkonummi',\n\t'Koyulhisar',\n\t'Adamankottai',\n\t'Ketama',\n\t'Irineopolis',\n\t'Kavali',\n\t'Sambalhera',\n\t'Nanjian',\n\t'San Juan de Uraba',\n\t'Tola Khadda',\n\t'Mulheim',\n\t'Berhoum',\n\t'Hawaiian Paradise Park',\n\t'Marg`ilon',\n\t'Eilendorf',\n\t'Oostzaan',\n\t'Evanston',\n\t'Mantasoa',\n\t'Ixtlahuaca',\n\t'Capao da Canoa',\n\t'Baker',\n\t'Altintas',\n\t'Taipei',\n\t'Siktiahi',\n\t'Ramabitsa',\n\t'Tarmount',\n\t'Haciqabul',\n\t'Ellore',\n\t'Palangkaraya',\n\t'Mugumu',\n\t'Ed Damer',\n\t'Steinfurt',\n\t'Malthone',\n\t'Villagarzon',\n\t'Elizabeth City',\n\t'La Farlede',\n\t'Binaqadi',\n\t'Barquisimeto',\n\t'Simaria',\n\t'Castel Volturno',\n\t'Frickenhausen',\n\t'Ait Ikkou',\n\t'Gauravaram',\n\t'Ubeda',\n\t'Simcoe',\n\t'Oakley',\n\t'Capas',\n\t'Jixian',\n\t'Muthabana',\n\t'Masalli',\n\t'Leganes',\n\t'Beidaying',\n\t'Hyeres',\n\t'Vinnamala',\n\t'Chatteris',\n\t'Parit Buntar',\n\t'Khelil',\n\t'Igaci',\n\t'Raytown',\n\t'Janakpur',\n\t'Ilford',\n\t'Bojnurd',\n\t'Toyota',\n\t'Orte',\n\t'Saint-Brieuc',\n\t'The Nation / La Nation',\n\t'Ghulja',\n\t'Lagoa do Mato',\n\t'Mohelnice',\n\t'Lavumisa',\n\t'Harda Khas',\n\t'Pendlebury',\n\t'Sonakhal',\n\t'Unagatla',\n\t'Sandhurst',\n\t'Villa Krause',\n\t'Sherghati',\n\t'Supaul',\n\t'Busovaca',\n\t'Luathaha',\n\t'Liversedge',\n\t'Liberty',\n\t'Yian',\n\t'Sion',\n\t'Itamogi',\n\t'Berrouaghia',\n\t'Bharuch',\n\t'Waunakee',\n\t'Adel',\n\t'Crestline',\n\t'Savissivik',\n\t'Meiganga',\n\t'Sannai',\n\t'Cuizhuangzi',\n\t'Cold Lake',\n\t'Agrigento',\n\t'Rio Branco do Sul',\n\t'Carneirinho',\n\t'Viborg',\n\t'Munsan',\n\t'Big Lake',\n\t'Rute',\n\t'Mela Gudalur',\n\t'Mbala',\n\t'Mateus Leme',\n\t'Kakamega',\n\t'Al Atarib',\n\t'Bad Harzburg',\n\t'Tigbauan',\n\t'Phak Hai',\n\t'San Juan de la Costa',\n\t\"Cornate d'Adda\",\n\t'Bewdley',\n\t'Nyimba',\n\t'Vedelago',\n\t'Asaba',\n\t'Bozyazi',\n\t'Tuxtla',\n\t'Alvin',\n\t'Castiglion Fiorentino',\n\t'Umag',\n\t'Taquaritinga do Norte',\n\t'Ghoti Budrukh',\n\t'Relangi',\n\t'Woodward',\n\t'Santiago de Tolu',\n\t'Marcali',\n\t'Stanley',\n\t'Dulay` Rashid',\n\t'Five Forks',\n\t'Jandaia do Sul',\n\t'Culfa',\n\t'Suzano',\n\t'Motomachi',\n\t'Ahermoumou',\n\t'Jose Cardel',\n\t'Marsella',\n\t'Tyngsborough',\n\t'Eijsden',\n\t'Checy',\n\t'Hamidiye',\n\t'Mocimboa da Praia',\n\t'Cossato',\n\t'Adjohon',\n\t'Jamapa',\n\t'Dahana',\n\t'Banfora',\n\t'Rabo de Peixe',\n\t'Caloto',\n\t'West Lampeter',\n\t'Princeton Meadows',\n\t'Whitwick',\n\t'Siversk',\n\t'Mpraeso',\n\t'Borovskoy',\n\t'Cockermouth',\n\t'Mogadishu',\n\t'Traipu',\n\t'Frechen',\n\t'Cabras',\n\t'Enkakad',\n\t'Bocas de Satinga',\n\t'Tomares',\n\t'Umbauba',\n\t'Itiki',\n\t'Nordhorn',\n\t'Macetown',\n\t'Quilengues',\n\t'Chiclana de la Frontera',\n\t'Lagoa Seca',\n\t'Zielonka',\n\t'Xinqing',\n\t'Pedro Carbo',\n\t'Vespasiano',\n\t'Masis',\n\t'Prichard',\n\t'Sandomierz',\n\t'Fulwood',\n\t'Bad Liebenzell',\n\t'Zvenyhorodka',\n\t'Bellevue',\n\t'Gudgeri',\n\t'Srikrishnapur',\n\t'Madgaon',\n\t'Piedecuesta',\n\t'Ibrahimpatnam',\n\t'Mandrosonoro',\n\t'Tlumach',\n\t'Citrus Springs',\n\t'Cabestany',\n\t'Metuchen',\n\t'Baxiangshan',\n\t'Bithauli',\n\t'Araguaina',\n\t'Ban Piang Luang',\n\t'Kamrej',\n\t'Chicaman',\n\t'Kishiwada',\n\t'Tabua',\n\t'San Rafael del Sur',\n\t'Cibolo',\n\t'Le Relecq-Kerhuon',\n\t'Boca Raton',\n\t'Amecameca de Juarez',\n\t'Radstock',\n\t'Launceston',\n\t'Gorantla',\n\t'Babar',\n\t'Jammalamadugu',\n\t'Gordes',\n\t'Vich',\n\t'Arroyo Grande',\n\t'Dvur Kralove nad Labem',\n\t'Novoukrainka',\n\t'Gurgunta',\n\t'Oued Cheham',\n\t'Salinopolis',\n\t'Oak Lawn',\n\t'Fatehgarh Churian',\n\t'San Alberto',\n\t'Wetaskiwin',\n\t'San Jose Pinula',\n\t'Montataire',\n\t'Aduku',\n\t'Planken',\n\t'Trussville',\n\t'Sidi Lmokhtar',\n\t'Machchand',\n\t'Moletai',\n\t'Grand-Lahou',\n\t'Ergoldsbach',\n\t'Sao Joao dos Patos',\n\t'Cajapio',\n\t'Sestao',\n\t'Bayshore Gardens',\n\t'Jaragua',\n\t'Canuelas',\n\t'Campo do Meio',\n\t'Chada',\n\t'Bibala',\n\t'Suining',\n\t'Granby',\n\t'Ostend',\n\t'Split',\n\t'Clark',\n\t'Baikunthapur',\n\t'Eppingen',\n\t'Bara Khurd',\n\t'Las Vigas de Ramirez',\n\t'Sharm ash Shaykh',\n\t'Sainthia',\n\t'Lowestoft',\n\t'Kaldenkirchen',\n\t'Acailandia',\n\t'Rosita',\n\t'Antardipa',\n\t'Ihaddadene',\n\t'Kennett',\n\t'Houlong',\n\t'Sriramapuram',\n\t'Nava Raipur',\n\t'Zielona Gora',\n\t'Biella',\n\t'Niceville',\n\t'Koscierzyna',\n\t'Lonkly',\n\t'Miramas',\n\t'Zubin Potok',\n\t'Sao Vicente Ferrer',\n\t'Fouka',\n\t'Rasak',\n\t'Nyzhnia Krynka',\n\t'Bijni',\n\t'West Bend',\n\t'Kurumul',\n\t'Golbaf',\n\t'Carencro',\n\t'Mercer Island',\n\t'Lai',\n\t'Rimini',\n\t'Labutta',\n\t'Goubellat',\n\t'Yakymivka',\n\t'Fianarantsoa',\n\t'Zhengding',\n\t'Vittoria',\n\t'Tactic',\n\t'Arrecife',\n\t'Parkes',\n\t'Ibicoara',\n\t'Gidi',\n\t'Afumati',\n\t'Dongning',\n\t'Tameslouht',\n\t'Ashwaubenon',\n\t'Alto Parana',\n\t'Mattanur',\n\t'Chinchali',\n\t'Monte Siao',\n\t'Kallanai',\n\t'Florania',\n\t'Ghorahi',\n\t'Uchqurghon Shahri',\n\t'Tres Isletas',\n\t'Bambara-Maounde',\n\t'Bela Vista de Goias',\n\t'Nova Granada',\n\t'Kesap',\n\t'Beldibi',\n\t'Hyderabad',\n\t'Otaki',\n\t'Bhuban',\n\t'Stansbury Park',\n\t'Halgur',\n\t'Arda',\n\t'Dalupura',\n\t'Maraveh Tappeh',\n\t'Kankandighi',\n\t'Chornomorske',\n\t'Nikopol',\n\t'Shinagawa-ku',\n\t'Zeralda',\n\t'St. Michael',\n\t'Fortaleza dos Nogueiras',\n\t'Nansan',\n\t'Edattala',\n\t'Phu Tu Son',\n\t'Cipo',\n\t'Bintulu',\n\t'Amayan',\n\t'Rainbow City',\n\t'Dougabougou',\n\t'Levakant',\n\t'Allada',\n\t'Tabursuq',\n\t'Hoshangabad',\n\t'Gerli',\n\t'Bardsir',\n\t'Sarsawa',\n\t'Manicaragua',\n\t'Sint-Pieters-Leeuw',\n\t'Pescantina',\n\t'Nimule',\n\t'Ambovombe',\n\t'Navsari',\n\t'Wilbraham',\n\t'Keene',\n\t'Novska',\n\t'Vallabh Vidyanagar',\n\t'Kifri',\n\t'Gornji Petrovci',\n\t'Bareggio',\n\t'Tosa',\n\t'Kafr Shukr',\n\t'Konotop',\n\t'Frei Miguelinho',\n\t'Pirapora do Bom Jesus',\n\t'Nemocon',\n\t'Ribeirao Bonito',\n\t'Kundli',\n\t'Zola Predosa',\n\t'Bileca',\n\t'Vargem Grande',\n\t'Martinopolis',\n\t'Madna',\n\t'Colonial Park',\n\t'Fecamp',\n\t'Sesto Fiorentino',\n\t'Bouzina',\n\t'Bischofswerda',\n\t'Saulkrasti',\n\t'Margram',\n\t'Zapresic',\n\t'Muriyad',\n\t'Ayun',\n\t'Harlingen',\n\t'San Juan de los Morros',\n\t'Kozy',\n\t'Kandern',\n\t'Taibao',\n\t'Savonlinna',\n\t'Fountainebleau',\n\t\"L'Ile-Perrot\",\n\t'Zomin Shaharchasi',\n\t'PortoAlexandre',\n\t'Nes Ziyyona',\n\t'Watervliet',\n\t'Bonito de Santa Fe',\n\t'Murgod',\n\t'Aurisina',\n\t'Kochlowice',\n\t'Lierre',\n\t'Wellesley',\n\t'East Greenwich',\n\t'Jacarau',\n\t'Nawa',\n\t'Upper St. Clair',\n\t'Qalyub',\n\t'Darbhanga',\n\t'Balakliia',\n\t'Makulubita',\n\t'Giesen',\n\t'Sarkeghat',\n\t'Paiania',\n\t'Thandla',\n\t'Gravata',\n\t'Ad Dis',\n\t'Nawada Gobindganj',\n\t'Mosrah',\n\t'Ballwin',\n\t'Rehovot',\n\t\"Chateau-d'Olonne\",\n\t'Barendrecht',\n\t'Kihei',\n\t'Forbes',\n\t'Van Wert',\n\t'Angola',\n\t'Sokuluk',\n\t'Gadarpur',\n\t'Beji',\n\t'Palmela',\n\t'Bad Lippspringe',\n\t'Al Badrashayn',\n\t'Angelim',\n\t'Higashimurayama',\n\t'Tangshan',\n\t'Fritzlar',\n\t'Hobyo',\n\t'Erumapalaiyam',\n\t'Kahului',\n\t'Varkkallai',\n\t'Sayula',\n\t'Waverly',\n\t'Koranampatti',\n\t'Peristeri',\n\t'Weilheim an der Teck',\n\t'Mustafakemalpasa',\n\t'Babolsar',\n\t'Concepcion Chiquirichapa',\n\t'Yueshanwan',\n\t'Sangeorgiu de Mures',\n\t'Edamon',\n\t'Moston',\n\t'Gabes',\n\t'Heesch',\n\t'Sahjanwa',\n\t'Auburn',\n\t'Sorel-Tracy',\n\t'Sagua de Tanamo',\n\t'Wassenaar',\n\t'Sarospatak',\n\t'Sapahi',\n\t'Kangayam',\n\t'Oodweyne',\n\t'Bac Kan',\n\t'Hole Narsipur',\n\t'Canmore',\n\t'Mulungu do Morro',\n\t'Fagnano Olona',\n\t'Sawankhalok',\n\t'Odanavattam',\n\t'Tiruvambalapuram',\n\t'Torotoro',\n\t'Kil Valur',\n\t'Koshizuka',\n\t'Kyonpyaw',\n\t'Annaberg-Buchholz',\n\t'Lissone',\n\t'Maracana',\n\t'Paysandu',\n\t'Batu',\n\t'Ciudad Acuna',\n\t'Kanavaikuli',\n\t'Lahaina',\n\t'Ma`an',\n\t'Comala',\n\t'Xiongzhou',\n\t'Coalcoman de Vazquez Pallares',\n\t'Benemerito',\n\t'Kuchinarai',\n\t'Lugo',\n\t'Kibuku',\n\t'Pirajui',\n\t'Fountain Valley',\n\t'Zentsujicho',\n\t'Shahreza',\n\t'Dragomer',\n\t'Puyehue',\n\t'Floridablanca',\n\t'Bitterfeld',\n\t'Bozkurt',\n\t'Sewa',\n\t'Soreang',\n\t'Varedo',\n\t'Narot Mehra',\n\t'Rogasovci',\n\t'Nukan',\n\t'Skipton',\n\t'Bidur',\n\t'Walldurn',\n\t'Ipero',\n\t'Aritao',\n\t'Breckerfeld',\n\t'Manakayi',\n\t'Narapalli',\n\t'Waraseoni',\n\t'Nogent-sur-Oise',\n\t'Itumbiara',\n\t'Ban Mae Sam Laep',\n\t'El Retorno',\n\t'Dunfermline',\n\t'Tamaraikkulam',\n\t'Dingli',\n\t'Ouadda',\n\t'Hillview',\n\t'Eceabat',\n\t'Yangmei',\n\t'Mamoudzou',\n\t'Dietikon',\n\t'Siauliai',\n\t'Pierrelatte',\n\t'Hamada',\n\t'Hooper',\n\t'Sakuho',\n\t'Beijing',\n\t'Limoeiro do Norte',\n\t'Ladario',\n\t'Karuveppampatti',\n\t'Sheffield',\n\t'Aguas de Lindoia',\n\t'Boac',\n\t'Mende',\n\t'Gohuma Bairia',\n\t'Riscani',\n\t'Koroth',\n\t'Sibenik',\n\t'Avalurpet',\n\t'Roberval',\n\t'Madinat as Sadis min Uktubar',\n\t'Rosoman',\n\t'Porto Alegre',\n\t'Brugherio',\n\t'Brody',\n\t'Keuruu',\n\t'Lehre',\n\t'Zawiercie',\n\t'Dalyoni Bolo',\n\t'Loay',\n\t'Kolonia',\n\t'Bussy-Saint-Georges',\n\t'Oulad Imloul',\n\t'Lagoa Formosa',\n\t'Wurselen',\n\t'Kestel',\n\t'Orhei',\n\t'Lubuagan',\n\t'Quixere',\n\t'Scottdale',\n\t'Caparrapi',\n\t\"Bruay-sur-l'Escaut\",\n\t'Nova Ponte',\n\t'Rostam Kola',\n\t'Asuncion Nochixtlan',\n\t'Colton',\n\t'Little River',\n\t\"Jian'ou\",\n\t'Diekirch',\n\t'Fateha',\n\t'Cimitarra',\n\t'Hombal',\n\t'Lindenhurst',\n\t'Ouled Djellal',\n\t'Comanesti',\n\t'Bousso',\n\t'Streamwood',\n\t'Roulia',\n\t'Duzce',\n\t'Asuke',\n\t'Libona',\n\t'Rellivalasa',\n\t'Ukwa',\n\t'Yavatmal',\n\t'Greasley',\n\t'Sivas',\n\t'Hukumati Gizab',\n\t'Balikpapan',\n\t'Qincheng',\n\t'Hongfengcun',\n\t'Nakai',\n\t'Oued Zem',\n\t'Pumalakkundu',\n\t'Umaria',\n\t'Sao Lourenco da Serra',\n\t'Amawom',\n\t'Barra do Mendes',\n\t'Aklim',\n\t'Sambrial',\n\t'Bunkeflostrand',\n\t'Taskent',\n\t'Rakitovo',\n\t'Nerima',\n\t'Waxhaw',\n\t'Hoogezand',\n\t'San Vicente de Tagua Tagua',\n\t'Recreio',\n\t'Lope de Vega',\n\t'Hejin',\n\t'Margherita',\n\t'Bend',\n\t'Strijen',\n\t'Manin',\n\t'Nogi',\n\t'Tilothu',\n\t'Manching',\n\t'Masindi Port',\n\t'Sumba',\n\t'Amizmiz',\n\t'Canada de Gomez',\n\t'Siddhapur',\n\t'Ankaramena',\n\t'Aleppo',\n\t'Sansanding',\n\t'Tirumakudal Narsipur',\n\t'Gumla',\n\t'Usa',\n\t'At Tawahi',\n\t'Koumantou',\n\t'De Panne',\n\t'Kukes',\n\t'Lenoir City',\n\t'Tiruppalaikudi',\n\t'Canyon Lake',\n\t'Nanpingcun',\n\t'Gubbio',\n\t'Jasaan',\n\t'Galaosiyo Shahri',\n\t'Mount Sinai',\n\t'Tulshia',\n\t'Sankt Johann im Pongau',\n\t'Sandi',\n\t'Banda',\n\t'Kilkunda',\n\t'Solymar',\n\t'Shenzhou',\n\t'As Sallum',\n\t'Baohezhuangcun',\n\t'Gogui',\n\t'Aarschot',\n\t'Kadappuram',\n\t'Sorkheh',\n\t'Gawler',\n\t'La Falda',\n\t'Masqat',\n\t'Bazeh Kalagh',\n\t'Forfar',\n\t'Kelafo',\n\t'Conde',\n\t'Porciuncula',\n\t'Palanas',\n\t'Cuyo',\n\t'Las Cabezas de San Juan',\n\t'Kranidi',\n\t'New Orleans',\n\t'Mettupalaiyam',\n\t'Kati',\n\t'Carregado',\n\t'Hornsby Bend',\n\t'Salvatierra',\n\t'Begamganj',\n\t'Cishan',\n\t'Draa Ben Khedda',\n\t'Eshtehard',\n\t'Sidi Daoud',\n\t'Las Nieves',\n\t'Nea Alikarnassos',\n\t'San Francisco Ixhuatan',\n\t'Luodong',\n\t'Waihee-Waiehu',\n\t'Rosolini',\n\t'Tundla',\n\t'Ash Shihaniyah',\n\t'SeaTac',\n\t'Daigo',\n\t'Solana Beach',\n\t'Kittanapalli',\n\t'Guspini',\n\t'Rahimyar Khan',\n\t'Antanambao',\n\t'New Silksworth',\n\t'Bixby',\n\t'Sahnaya',\n\t'Kudal',\n\t'Guaira',\n\t'Ibaiti',\n\t'Iksan',\n\t'Muttamtura',\n\t'Darnetal',\n\t'Karma',\n\t'Leyland',\n\t'Strzelin',\n\t'Tam Diep',\n\t'Tagaytay',\n\t'Finale Ligure',\n\t'Cottonwood',\n\t'Cutlerville',\n\t'Santa Cruz de Bezana',\n\t'Frydlant nad Ostravici',\n\t'Aracuai',\n\t'Huangyadong',\n\t'Herzele',\n\t'Sakarya',\n\t'Extremoz',\n\t'Bauta',\n\t'Kela Khera',\n\t'Castelvetrano',\n\t'Kalisz',\n\t'Qorovul',\n\t'Sanchez',\n\t'Tamezmout',\n\t'Boundji',\n\t'Bellinzago Novarese',\n\t'Tungi',\n\t'Ichenhausen',\n\t'Sao Sebastiao do Uatuma',\n\t'Inver Grove Heights',\n\t'Villefranche-de-Rouergue',\n\t'Uad Damran',\n\t'Rishon LeZiyyon',\n\t'Nellimarla',\n\t'Bountiful',\n\t'Sahaswan',\n\t'Kamonkoli',\n\t'Santo Augusto',\n\t'Hammersmith',\n\t'Breyten',\n\t'Northwich',\n\t'Nagambhotlapalem',\n\t'Montabaur',\n\t'Ammavarikuppam',\n\t'Amasya',\n\t'Bhankarpur',\n\t'Santa Rosa del Penon',\n\t'Anshun',\n\t'Feidh el Botma',\n\t'Abdurahmoni Jomi',\n\t'Rionero in Vulture',\n\t'Bundi',\n\t'Almargem',\n\t'McNair',\n\t'East Palo Alto',\n\t'Las Flores',\n\t'Carmo da Mata',\n\t'Wilkau-Hasslau',\n\t'Barentin',\n\t'Outat Oulad Al Haj',\n\t'Chemax',\n\t'Ayapango',\n\t'Ramacca',\n\t'Oton',\n\t'Ghoswari',\n\t'Al Fallujah',\n\t'Cheviot',\n\t'Alnavar',\n\t'Al Qasr',\n\t'Santo Domingo Suchitepequez',\n\t'Sulleru',\n\t'Barahpur',\n\t'Chapalamadugu',\n\t'Ar Rutbah',\n\t'Areia Branca',\n\t'Avenel',\n\t'Hoover',\n\t'Velykodolynske',\n\t'Beladi',\n\t'Changchun',\n\t'Linden',\n\t'Hillside',\n\t'Taxco de Alarcon',\n\t'Kathri',\n\t'Belemoka',\n\t'San-Pedro',\n\t'Ban Huai Hin',\n\t'Olovo',\n\t'Sundekuppam',\n\t'El Alto',\n\t'Totonicapan',\n\t'Mujiayu',\n\t'Makhtal',\n\t'Ikoma',\n\t'Sylhet',\n\t'Passo de Camarajibe',\n\t'Bad Driburg',\n\t'Rangapara',\n\t'Komarom',\n\t'Bakhmach',\n\t'Qionghu',\n\t'Ecatzingo',\n\t'Pallipram',\n\t'Taicheng',\n\t'Datu Piang',\n\t'Tlaltetela',\n\t'Preveza',\n\t'Cambuci',\n\t'Werkendam',\n\t'Ipira',\n\t'Gosport',\n\t'Grytviken',\n\t'Rondonopolis',\n\t'Phra Phutthabat',\n\t'La Puebla de Cazalla',\n\t'Leposaviq',\n\t'San Juan Cotzocon',\n\t'Sederot',\n\t'Nidiyanga',\n\t'Makamba',\n\t'Resistencia',\n\t'Rio Blanco',\n\t'Monte Escobedo',\n\t'Vasylkiv',\n\t'Eyl',\n\t'Fenoarivo',\n\t'Pokrov',\n\t'Bang Sao Thong',\n\t'Granite Bay',\n\t'Fortul',\n\t'Lenoir',\n\t'Trent Hills',\n\t'Le Petit-Quevilly',\n\t'Tifra',\n\t'Jaroslaw',\n\t'Perrysburg',\n\t'Ericeira',\n\t'Maniago',\n\t'Al Qusiyah',\n\t'Norridge',\n\t'Palamos',\n\t'Pochampalli',\n\t'Buni',\n\t'Preetz',\n\t'Anaconda',\n\t'Chinde',\n\t'Bakouma',\n\t'Jakar',\n\t'Tavros',\n\t'Doranala',\n\t'Mayiladi',\n\t'Villecresnes',\n\t'Phulgachhi',\n\t'Pen',\n\t'Somersworth',\n\t'Igrejinha',\n\t'Umburetama',\n\t'Kakumiro',\n\t'Arauquita',\n\t'Schwieberdingen',\n\t'Berkeley',\n\t'Alquizar',\n\t'Adigappadi',\n\t'Hardinxveld-Giessendam',\n\t'Baindur',\n\t'Beko',\n\t'Belley',\n\t'Mousoulou',\n\t'Ome',\n\t'Finnsnes',\n\t'High Point',\n\t'Budenheim',\n\t'Temara',\n\t'Sulejowek',\n\t'Grecia',\n\t'Deoghar',\n\t'Macerata',\n\t'Monghyr',\n\t'Hullhorst',\n\t'Tervuren',\n\t'On Top of the World Designated Place',\n\t'Isernhagen-Sud',\n\t'Parner',\n\t'Llanera',\n\t'Tsurugashima',\n\t'Dhamaun',\n\t'Porto Valter',\n\t'Loyalsock',\n\t'Guntersville',\n\t'Gandorhun',\n\t'Zella-Mehlis',\n\t'Pazin',\n\t'Bunyan',\n\t'Toyama',\n\t'Lamrasla',\n\t'Huliyar',\n\t'Springville',\n\t'Orkelljunga',\n\t'Pillutla',\n\t'Paruthur',\n\t'Zahedan',\n\t'Baskil',\n\t'Morteza Gerd',\n\t'Remchi',\n\t'Chiaravalle',\n\t'Grunstadt',\n\t'Sofifi',\n\t'Londrina',\n\t'Mazatlan',\n\t'Khathjari',\n\t'Chiang Klang',\n\t'Wulfrath',\n\t\"Qal'at Mgouna\",\n\t'Irigny',\n\t'Senahu',\n\t'Perenchies',\n\t'Vero Beach',\n\t'Ocho Rios',\n\t'Castanhal',\n\t'Soe',\n\t'My Drarga',\n\t'Boxtel',\n\t'Hoyo de Manzanares',\n\t'Cruz Machado',\n\t'Morges',\n\t'Guano',\n\t'Anantapalle',\n\t'Tvrdosin',\n\t'Caojia',\n\t'Plaza Huincul',\n\t'Ranillug',\n\t'Yonezawa',\n\t'Parnu',\n\t'Zerizer',\n\t'Rabta',\n\t'Suginami-ku',\n\t'San Jose del Guaviare',\n\t'Khaira Tola',\n\t'Ain Oussera',\n\t'Badvel',\n\t'Wijnegem',\n\t'Frome',\n\t'Theux',\n\t'Caimbambo',\n\t'Wang Saphung',\n\t'Dabhoi',\n\t'Gebre Guracha',\n\t'Basatpur',\n\t'Zambrano',\n\t'Puttai',\n\t'Brainerd',\n\t'San Salvador El Seco',\n\t'Shostka',\n\t'Tabocas do Brejo Velho',\n\t'Tabriz',\n\t'Bhatpuri',\n\t'Arpajon',\n\t'Curti',\n\t'Hyde',\n\t'Cayetano Germosen',\n\t'Cafelandia',\n\t'Mnagueur',\n\t'Rygge',\n\t'Landskrona',\n\t'Kokubunji',\n\t'Resende',\n\t'Aguasay',\n\t'Painan',\n\t'Komagane',\n\t'Malhada de Pedras',\n\t'Zhutian',\n\t'Baabda',\n\t'Jackson',\n\t'Qoorlugud',\n\t'Fraserpet',\n\t'La Crau',\n\t'Pioltello',\n\t'Araure',\n\t'Ilsenburg',\n\t'Yanhewan',\n\t'Narayanpur',\n\t'Holtsville',\n\t'Vimmerby',\n\t'Binzhou',\n\t'Ligang',\n\t'Quillota',\n\t'Montmagny',\n\t'Malaga',\n\t'Juatuba',\n\t'Ascope',\n\t'Effia-Kuma',\n\t'Bellwood',\n\t'Encarnacion',\n\t'Mannur',\n\t'Puerto Santander',\n\t'Kendraparha',\n\t'Wewak',\n\t'Sendjas',\n\t'San Pedro Pinula',\n\t'Kampong Thom',\n\t'Mpanda',\n\t'Trebaseleghe',\n\t'Kerkyra',\n\t'Rogatec',\n\t'Katigang',\n\t'Yushu',\n\t'Saint-Hyacinthe',\n\t'Capelle aan den IJssel',\n\t'Eisenach',\n\t'Reinfeld',\n\t'Idri',\n\t'Kunnattur',\n\t'Cakung',\n\t'Rayadrug',\n\t'Baoshan',\n\t'Laramie',\n\t'El Meghaier',\n\t'Naperville',\n\t'Macatuba',\n\t'Katalpur',\n\t'Carpina',\n\t'Blyth',\n\t'Veseli nad Moravou',\n\t'Burhia Dhanghatta',\n\t'Svitlodarsk',\n\t'Lugait',\n\t'Rancho Cucamonga',\n\t'Tabara Arriba',\n\t'Spondon',\n\t'Marienberg',\n\t'Middelburg',\n\t'Huyton',\n\t'Sroda Slaska',\n\t'Woomera',\n\t'Bethalto',\n\t'Concepcion de Ataco',\n\t'Fagersta',\n\t'Halfmoon Bay',\n\t'Estancia',\n\t'Makow Mazowiecki',\n\t'Malangas',\n\t'Pittsburg',\n\t'Adukam',\n\t'West Melbourne',\n\t'Haverstraw',\n\t'Lousa',\n\t'Kulpsville',\n\t'Plasnica',\n\t'Charuanwan',\n\t'Foca',\n\t'Gombe',\n\t'Cordeiropolis',\n\t'Chakicherla',\n\t'Licey al Medio',\n\t'Conceicao das Alagoas',\n\t'Colonia',\n\t'Yisuhe',\n\t'Vignola',\n\t'San Martin Sacatepequez',\n\t'Mbanza-Ngungu',\n\t'Oppatavadi',\n\t'Eitorf',\n\t'Ubach-Palenberg',\n\t'Ranibennur',\n\t'Aklvidu',\n\t'Capoeiras',\n\t'Mucambo',\n\t'Palmares do Sul',\n\t'Kondakomarla',\n\t'Niteroi',\n\t'Sai Ngam',\n\t'City Bell',\n\t'Biougra',\n\t'White',\n\t'Kumru',\n\t'Alcala de Henares',\n\t'Kalawit',\n\t'Porto Xavier',\n\t'Balancan',\n\t'Vodice',\n\t'Zouping',\n\t'Nagawaram',\n\t'Mareth',\n\t'Kakraul',\n\t'Horten',\n\t'Padinjarebagam',\n\t'Karattuppalaiyam',\n\t'Redding',\n\t'Wolgast',\n\t'Ambrolauri',\n\t'Dhanot',\n\t'Nilakkottai',\n\t'Abaete',\n\t'Veendam',\n\t'Oslo',\n\t'Paiganapalli',\n\t'White Center',\n\t'Taminango',\n\t'Constitucion',\n\t'Begijnendijk',\n\t'Baragua',\n\t'Inverigo',\n\t'Belsandi Tara',\n\t'Rumst',\n\t'Pinner',\n\t'Reinheim',\n\t'Liancourt',\n\t'Villa Canas',\n\t'Metlika',\n\t'Balderton',\n\t'Gauripur',\n\t'Yamada',\n\t'Cardona',\n\t'Sartalillo',\n\t'Odaiyakulam',\n\t'Laguna Paiva',\n\t'Carolina',\n\t'Bhilavadi',\n\t'Al Qardahah',\n\t'Campo Bom',\n\t'Laichingen',\n\t'Montero',\n\t'Nagoya',\n\t'Portici',\n\t'Sherpur',\n\t'Baiheqiao',\n\t'Saint-Chamas',\n\t'Bloemfontein',\n\t'Songyang',\n\t'Mamfe',\n\t'Bijiao',\n\t'Tongobory',\n\t'Barra do Dande',\n\t'Revere',\n\t'Celtik',\n\t'Carigara',\n\t'Laindon',\n\t'Chapa de Mota',\n\t'Djanet',\n\t'Vinings',\n\t'Saltillo',\n\t'Gueoul',\n\t'Parnagua',\n\t'Burton upon Trent',\n\t'Bocaiuva do Sul',\n\t'Nova Xavantina',\n\t'Esteli',\n\t'Sremska Kamenica',\n\t'Pennsauken',\n\t'Bad Wurzach',\n\t'Banbury',\n\t'Nkowakowa',\n\t'Koloti',\n\t'Chaita',\n\t'Las Parejas',\n\t'Guerande',\n\t'Ski',\n\t'Suphan Buri',\n\t'Cheyenne',\n\t'San Isidro de Lules',\n\t'Cisternino',\n\t'Rajbalhai',\n\t'San Ferdinando di Puglia',\n\t'Nosivka',\n\t'Singhwara',\n\t'Ankarabato',\n\t'Dod Ballapur',\n\t'Wattignies',\n\t'Lebu',\n\t'Elangunnapuzha',\n\t'Korneuburg',\n\t'Saint Andrews',\n\t'Exmouth',\n\t'Menaa',\n\t'Bungotakada',\n\t'Isagarh',\n\t'Bilecik',\n\t'Oulad Bou Rahmoun',\n\t'Manambondro',\n\t'Port Morant',\n\t'Townsend',\n\t'Ca Mau',\n\t'Kostolac',\n\t'Presov',\n\t'Valle',\n\t'Sahambala',\n\t'Chapala',\n\t'Tepechitlan',\n\t'Uruacu',\n\t'Bangued',\n\t'Renton',\n\t'Ummannur',\n\t'Lalmanirhat',\n\t'Nurkot',\n\t'Brownfield',\n\t'San Miguel del Padron',\n\t'Toualet',\n\t'San Antonio Aguas Calientes',\n\t'Los Alamitos',\n\t'Jilib',\n\t'San Mateo Ixtatan',\n\t'Anapolis',\n\t'Burhanpur',\n\t'Yokotemachi',\n\t'Torrinha',\n\t'Mouzaia',\n\t'Harshin',\n\t'Cirencester',\n\t'Bentley',\n\t'Man',\n\t'Yezhi',\n\t'Kota',\n\t'Sovicille',\n\t'Otawara',\n\t'Zihuatanejo',\n\t'Charata',\n\t'Paduma',\n\t'Otake',\n\t'Guanta',\n\t'Aduru',\n\t'Mannarai',\n\t'Youghal',\n\t'Haacht',\n\t'Stowmarket',\n\t'Fourou',\n\t'Barari',\n\t'Libanggaon',\n\t'Amari',\n\t'Lucknow',\n\t'Babra',\n\t'Idanre',\n\t'Bedigoazon',\n\t'Acari',\n\t'Burslem',\n\t'Lohara',\n\t'Beersel',\n\t'Polillo',\n\t'Librazhd-Qender',\n\t'Kumalarang',\n\t'Tzitzio',\n\t'Bisceglie',\n\t'Karayilan',\n\t\"Samarra'\",\n\t'Bafwasende',\n\t'North Arlington',\n\t'Souq Sebt Oulad Nemma',\n\t'Bhalswa Jahangirpur',\n\t'Wolfsburg',\n\t'Eningen unter Achalm',\n\t'Szubin',\n\t'Varadarajampettai',\n\t'Zelenodolsk',\n\t'Karagwe',\n\t'Vissannapeta',\n\t'Cheramkod',\n\t'Sanandaj',\n\t'Karben',\n\t'Bueng Khong Long',\n\t'Jaboatao',\n\t'Vrilissia',\n\t'Cumaral',\n\t'Akil',\n\t'Ap Da Loi',\n\t'Normanton',\n\t'Trois-Rivieres',\n\t'Almirante',\n\t'Esperalvillo',\n\t'Kongupatti',\n\t'Quirinopolis',\n\t'Lask',\n\t'Sainte-Luce-sur-Loire',\n\t'Castel San Giorgio',\n\t'Bang Phae',\n\t'Chinnayagudem',\n\t'Arsin',\n\t'Numata',\n\t'Sab` al Bur',\n\t'Cumaru',\n\t'Tecamac',\n\t'Rodelas',\n\t'Seyah Cheshmeh',\n\t'Kashan',\n\t'Nanzhangcheng',\n\t'Kendari',\n\t'Jurado',\n\t'Monrovia',\n\t'Peshawar',\n\t'Guacharachi',\n\t'Kloten',\n\t'Bandirma',\n\t'Quevedo',\n\t'Adekar Kebouche',\n\t'Huinca Renanco',\n\t'Dakpatthar',\n\t'Chicoutimi',\n\t'Baiyan',\n\t'Pimenteiras',\n\t'Las Brenas',\n\t'Kusnacht',\n\t'Burnie',\n\t'Ercolano',\n\t'Kroonstad',\n\t'Modena',\n\t'Kalna',\n\t'Bonneville',\n\t'Bellair-Meadowbrook Terrace',\n\t'Jiyyammavalasa',\n\t'Kisai',\n\t'Vadodara',\n\t'Nagtala',\n\t'Kandiyankovil',\n\t'Lorena',\n\t'Taphan Hin',\n\t'Juneau',\n\t'Iati',\n\t'Niksar',\n\t'Roy',\n\t'Kapoeta',\n\t'Samdhin',\n\t'Arafat',\n\t'Kornepadu',\n\t'Ait Faska',\n\t'Olevsk',\n\t'Rantoul',\n\t'Glencoe',\n\t'Stocksbridge',\n\t'Tela',\n\t'Chethakal',\n\t'Canatlan',\n\t'Guia de Isora',\n\t'Veglie',\n\t'Taguig City',\n\t'Qillin',\n\t'Harsinghpur',\n\t'Sitangkai',\n\t'Michigan City',\n\t'Nagaizumi',\n\t'Guariba',\n\t'El Seibo',\n\t'Woolton',\n\t'Tainai',\n\t'Mukher',\n\t'Cartama',\n\t'Suknadanga',\n\t'Philippsburg',\n\t'Ladysmith',\n\t'Atherton',\n\t'Baeza',\n\t'Yazikonak',\n\t'Santa Maria Texmelucan',\n\t'Ban Mae Kaluang',\n\t'Khiriawan',\n\t'Eschen',\n\t'Tobetsu',\n\t'Nova Vicosa',\n\t'Ankarongana',\n\t'Shahedshahr',\n\t'Sonoita',\n\t'Kudligi',\n\t'Saint-Felicien',\n\t'Bukama',\n\t'Nilgiri',\n\t'Zwevegem',\n\t'Muang Sing',\n\t'Pinhal',\n\t'Saranga',\n\t'Ebelo',\n\t'Toli',\n\t'Cataguases',\n\t'Miyaki',\n\t'Caracol',\n\t'Amol',\n\t'Basdeopur',\n\t'Cevicos',\n\t'Charlotte',\n\t'Canavieiras',\n\t'Deva',\n\t'North Shields',\n\t'Icaraima',\n\t'Hoskins',\n\t'Kamalshahr',\n\t'Guapiles',\n\t'Araguari',\n\t'Bouhlou',\n\t'Castilla La Nueva',\n\t'Azemmour',\n\t'Juvignac',\n\t'Medjedel',\n\t'Goksun',\n\t'San Justo',\n\t'Iyo',\n\t'Teploklyuchenka',\n\t'Yaounde',\n\t'Ain Kercha',\n\t'Treviglio',\n\t'Novi Pazar',\n\t'San Lazzaro di Savena',\n\t'Nakhon Ratchasima',\n\t'Alcantara',\n\t'Bull Mountain',\n\t'Oldeani',\n\t'Chardonnieres',\n\t'Chini',\n\t'Piketberg',\n\t'Baranoa',\n\t'Buldon',\n\t'Akora',\n\t'Santa',\n\t'Olivet',\n\t'Kouinine',\n\t'Vanipenta',\n\t'Shahr-e Babak',\n\t'Porto de Moz',\n\t'The Hills',\n\t'Kaharlyk',\n\t'Manpaur',\n\t'G`azalkent',\n\t'Hodmezovasarhely',\n\t'Oak Creek',\n\t'Kladanj',\n\t'Merouana',\n\t'Hiratsuka',\n\t'Alvares Machado',\n\t'Lagoa Dourada',\n\t'Mishan',\n\t'Puerto Deseado',\n\t'Befandriana Atsimo',\n\t'Supia',\n\t'Avon Lake',\n\t'Rialto',\n\t'Renca',\n\t'Mesra',\n\t'Rognac',\n\t'Pongode',\n\t'Birkhadem',\n\t'Talacogon',\n\t'Turhapatti',\n\t'Szigetszentmiklos',\n\t'Onoto',\n\t'Norala',\n\t'Sorala',\n\t'Diallassagou',\n\t'Handa',\n\t'Wieliczka',\n\t'Tilougguit',\n\t'Jaimalpura',\n\t'Allentown',\n\t'Crissiumal',\n\t'Varberg',\n\t'Abidjan',\n\t'Cesky Tesin',\n\t'Burgkirchen an der Alz',\n\t'Nagina',\n\t'Shahpur Baghauni',\n\t'Itarhi',\n\t'Bad Pyrmont',\n\t'Raksaha',\n\t'Pandireddigudem',\n\t'Sinfra',\n\t'Bayonne',\n\t'Bahir Dar',\n\t'Bobo-Dioulasso',\n\t'Tubaran',\n\t'Chihuahua',\n\t'Hun',\n\t'Rexburg',\n\t'Kherson',\n\t'Harad',\n\t'Saint-Fons',\n\t'Iazizatene',\n\t'Sao Pedro do Sul',\n\t'Tirmaigiri',\n\t'Otumba',\n\t'East Cleveland',\n\t'Bankoumana',\n\t'Goiatins',\n\t'Kushtagi',\n\t'Patori',\n\t'Bertrix',\n\t'Palanan',\n\t'Achaljamu',\n\t'Elanad',\n\t'Mahmud-e Raqi',\n\t'Bougou',\n\t'American Fork',\n\t'East Barnet',\n\t'Mangrauni',\n\t'Raghunathpur',\n\t'Ierapetra',\n\t'Crvenka',\n\t'Mentor',\n\t'Fidirana',\n\t'Sangareddi',\n\t'Pflugerville',\n\t'Kupiskis',\n\t\"Vil'nyans'k\",\n\t'Sonipat',\n\t'Zestaponi',\n\t'Goffstown',\n\t'Lengshuijiang',\n\t'Scottsdale',\n\t'Rosemont',\n\t'Garsekurti',\n\t'Collierville',\n\t'Bulaevo',\n\t'Tosagua',\n\t'Burzaco',\n\t'Silea',\n\t'Roosendaal',\n\t'Tuusula',\n\t'Turnu Magurele',\n\t'An Nabk',\n\t'Sasebo',\n\t'San Vicente de Castellet',\n\t'Andranomenatsa',\n\t'Tbilisi',\n\t'Postojna',\n\t'Kessel-Lo',\n\t'Arnsberg',\n\t'Itarare',\n\t'Mazeikiai',\n\t'Pujehun',\n\t'Vicovu de Sus',\n\t'Okayama',\n\t'Sarauli',\n\t'Lakeville',\n\t'Dashtigulho',\n\t'Itapolis',\n\t'Al Hazm',\n\t'Hammelburg',\n\t'Berastagi',\n\t'Orlu',\n\t'Castanet-Tolosan',\n\t'Lumbayanague',\n\t'Oeiras do Para',\n\t'Whitney',\n\t'Tubara',\n\t'Santa Maria Madalena',\n\t'Salinas de Hidalgo',\n\t'Sangonera la Verde',\n\t'Noisy-le-Sec',\n\t'Glenview',\n\t'Bern',\n\t'Song Cau',\n\t'Dyer',\n\t'Chabal Kalan',\n\t'Segala Mba',\n\t'Upper Hutt',\n\t'Massigui',\n\t'Nalgonda',\n\t'Terra Boa',\n\t'Svrljig',\n\t\"'Ain Tellout\",\n\t'Bellefontaine Neighbors',\n\t'Sahibpur Kamal',\n\t'Nieuwleusen',\n\t'Acarlar',\n\t'Chuo',\n\t'Hellesdon',\n\t'Kotor',\n\t'Montepulciano',\n\t'Emstek',\n\t'Daye',\n\t'Kona',\n\t'Saint-Genis-Pouilly',\n\t'Puerto Rico',\n\t'Sitamau',\n\t'Anguera',\n\t'North Lebanon',\n\t'Pesqueira',\n\t'Guarei',\n\t'Pendurti',\n\t'Falls',\n\t'Pinillos',\n\t'Sighetu Marmatiei',\n\t'Bangui',\n\t'Tchitado',\n\t'Tanga',\n\t'Kesamudram',\n\t'Narayangarh',\n\t'Dapitan',\n\t'Kaithahi',\n\t'Saint-Cyr-sur-Mer',\n\t'Jandaira',\n\t'Bedum',\n\t'Tomatlan',\n\t'Pirapemas',\n\t'Bemahatazana-Belobaka',\n\t'Poblacion',\n\t'El Cua',\n\t'Maldonado',\n\t'Pando',\n\t'Madappalli',\n\t'Cumru',\n\t'Al Mahwit',\n\t'Chake Chake',\n\t'Oria',\n\t'Zimnicea',\n\t'Kivisto',\n\t'Bumahen',\n\t'Wichian Buri',\n\t'Carrascal',\n\t'Pedro Betancourt',\n\t'Hire Megalageri',\n\t'Ternate',\n\t'Saoner',\n\t'Itaituba',\n\t'Vohitrafeno',\n\t'Caluula',\n\t'Muggia',\n\t'Aizenay',\n\t'Khokha',\n\t'Ipokia',\n\t'Venmani Padinjara',\n\t'Siklos',\n\t'Yangshuwa',\n\t'Kanekallu',\n\t'Golbey',\n\t'Gengzhuangqiaocun',\n\t'Gustavsberg',\n\t'Parabiago',\n\t'Ambohibary',\n\t'Valladolid',\n\t'Matamey',\n\t'Bisee',\n\t'Tete',\n\t'Vreden',\n\t'Toribio',\n\t'Fucecchio',\n\t'Zangareddigudem',\n\t'Ceglie Messapico',\n\t'Licinio de Almeida',\n\t'Ad Dabbah',\n\t'Sapian',\n\t'Naranjo',\n\t'Wollaston',\n\t'Celaya',\n\t'Dire',\n\t'Gajiginhalu',\n\t'Mulug',\n\t'Upper Makefield',\n\t'Rodriguez',\n\t'Bocoio',\n\t'Thalwil',\n\t'Carate Brianza',\n\t'Bondada',\n\t'Ayagoz',\n\t'Xiada',\n\t'Vohburg an der Donau',\n\t'Mansala',\n\t'Rafha',\n\t'Anastacio',\n\t'Nove Mesto na Morave',\n\t'Ramechhap',\n\t'Ambinanindrano',\n\t'Leibnitz',\n\t'Alvaraes',\n\t'Baure',\n\t'Sohano',\n\t'Tunja',\n\t'Goriar',\n\t'Msambweni',\n\t'Aibak',\n\t'Penugolanu',\n\t'Castagneto Carducci',\n\t'Ecclesall',\n\t'Dunmore',\n\t'North Londonderry',\n\t'Carnot-Moon',\n\t'Pau Brasil',\n\t'Taka',\n\t'Sihor',\n\t'Terra Nova',\n\t'Choachi',\n\t'Tenri',\n\t'Port Louis',\n\t'Laoag',\n\t'San Martin de la Vega',\n\t'Nguigmi',\n\t'Bendapudi',\n\t'Eminabad',\n\t'Aldenham',\n\t'Vianen',\n\t'Nagasamudram',\n\t'Zemst',\n\t'Khalkhal',\n\t'Mount Clemens',\n\t'Teotlaltzingo',\n\t'Siribala',\n\t'Ligao',\n\t'Dom Pedrito',\n\t'Bushey',\n\t'Namakgale',\n\t'Waiuku',\n\t'Juruaia',\n\t'Sikasso',\n\t'Laplace',\n\t'Gao',\n\t'Casarano',\n\t'Ratangarh',\n\t'Brunssum',\n\t'Castrovillari',\n\t'Tarkeshwar',\n\t'Ruisui',\n\t'Monschau',\n\t'Alat',\n\t'Hetauda',\n\t'Tunglangan',\n\t'Panipat',\n\t'El Chal',\n\t'Bhanumukkala',\n\t'Don Galo',\n\t'Saddiqabad',\n\t'Santo Domingo Petapa',\n\t'Bingol',\n\t'Piraju',\n\t'Camp Verde',\n\t'Chembagaramanpudur',\n\t'Behara',\n\t'Harrison',\n\t'Nagulapadu',\n\t'Knemis Dades',\n\t'Youwangjie',\n\t'Sarab',\n\t'Rustavi',\n\t'Obama',\n\t'Dymka',\n\t'Bijie',\n\t'Tairan Camp',\n\t'Sahoria Subhai',\n\t'Southampton',\n\t'Port Moody',\n\t'Guaratinga',\n\t'Xa Muteba',\n\t'Ahmadnagar',\n\t'Limanowa',\n\t'Dembi Dolo',\n\t'Samrala',\n\t'Aichach',\n\t'Codroipo',\n\t'Nattarampalli',\n\t'Induno Olona',\n\t'Gosen',\n\t'Bevato',\n\t'Elkridge',\n\t'Trissino',\n\t'Siping',\n\t'Bou Hanifia el Hamamat',\n\t'Juayua',\n\t'Tordera',\n\t'Osnabruck',\n\t'Zegoua',\n\t'Ramain',\n\t'Varanasi',\n\t'Miedzyrzecz',\n\t'Bradfordville',\n\t'Arkansas City',\n\t'Sidi Mohamed Lahmar',\n\t'Paravai',\n\t'Baltara',\n\t'Paide',\n\t'Manakara',\n\t'Edassheri',\n\t'Usiacuri',\n\t'Yildirim',\n\t'Keflavik',\n\t'Tsetserleg',\n\t'Paris',\n\t'Gagnoa',\n\t'Xintang',\n\t'Sarni',\n\t'Xico',\n\t'Capitan Bermudez',\n\t'Contenda',\n\t'Garhwa',\n\t'Huayin',\n\t'Basuo',\n\t'Tenjo',\n\t'Cachan',\n\t'Quimperle',\n\t'Misato',\n\t'Pittsgrove',\n\t'Dumont',\n\t'Salford',\n\t'Bontoc',\n\t'Lexington Park',\n\t'Yame',\n\t'Narasaraopet',\n\t'Kesla',\n\t'Ystad',\n\t'Laqraqra',\n\t'Milot',\n\t'Benoy',\n\t'Jalandhar',\n\t'Qahderijan',\n\t'Wake',\n\t'Flowing Wells',\n\t'Santana do Acarau',\n\t'Kurdi',\n\t'Sison',\n\t'Mazamet',\n\t'Montrouis',\n\t'Kalaruch',\n\t'Sarotar',\n\t'Dabuleni',\n\t'Thepaha Raja Ram',\n\t'Glenn Heights',\n\t'Tuxtepec',\n\t'Whickham',\n\t'Targu Frumos',\n\t'Lauriya Nandangarh',\n\t'Taineste',\n\t'Medjez el Bab',\n\t'Sagon',\n\t'Cinisello Balsamo',\n\t'Bartalah',\n\t'Valabhipur',\n\t'Tangdukou',\n\t'Barreirinha',\n\t'Calintaan',\n\t'Binan',\n\t'Rampur',\n\t'Malatya',\n\t'Clemson',\n\t'Wyszkow',\n\t'Carmiano',\n\t'Yeovil',\n\t'Cajobi',\n\t'Yabuki',\n\t'Dorud',\n\t'Marrupa',\n\t'Maitland',\n\t'Jahrom',\n\t'Kurgunta',\n\t'Tonyrefail',\n\t'Virreyes',\n\t'Kalu Khan',\n\t'Al Qurayya',\n\t'Libertyville',\n\t'Kharagpur',\n\t'Woodley',\n\t'Mineola',\n\t'Chalon-sur-Saone',\n\t'Bouhmama',\n\t'Mena',\n\t'San Cataldo',\n\t'Quipungo',\n\t'Alakamisy-Ambohimaha',\n\t'Gloversville',\n\t'Chuimatan',\n\t'Nadugadda',\n\t'Borjomi',\n\t'Sibonga',\n\t'Palanpur',\n\t'Kodinar',\n\t'Asingan',\n\t'Chahchaheh',\n\t'Dobrova',\n\t'Ruzomberok',\n\t'Chhoti Sadri',\n\t'Langzhong',\n\t'Anekal',\n\t'Pontal do Parana',\n\t'Muhammadabad',\n\t'Moreira',\n\t'Civita Castellana',\n\t'Kpalime',\n\t'Mahespur',\n\t'Louny',\n\t'Venkatapuram',\n\t'Khaw Zar Chaung Wa',\n\t'Dahutang',\n\t'Data',\n\t'Cheddra',\n\t'Madridejos',\n\t'DeLand',\n\t'Koewarasan',\n\t'Palaiseau',\n\t'Ropczyce',\n\t'Urakawa',\n\t'Tanque Novo',\n\t'Guider',\n\t'Kiruhura',\n\t'Kasese',\n\t'Murrhardt',\n\t'Andingcun',\n\t'Kuhdasht',\n\t'Freire',\n\t'Singera',\n\t'Panglong',\n\t'Tampa',\n\t'Mirik',\n\t'Hatti Mattur',\n\t'Nakatsugawa',\n\t'Jitwarpur Nizamat',\n\t'Carmo',\n\t'Jocotan',\n\t'Forquilha',\n\t'Vargem Grande do Sul',\n\t'Peniche',\n\t'Xinying',\n\t'Nahulingo',\n\t'Goranboy',\n\t'San Pedro Sula',\n\t'Burr Ridge',\n\t'Leatherhead',\n\t'Belisce',\n\t'Villalonga',\n\t'Santa Anita',\n\t'Mayluu-Suu',\n\t'Skovde',\n\t'Buston',\n\t'Domodossola',\n\t'Avelgem',\n\t'El Malah',\n\t'Azusa',\n\t'Neyriz',\n\t'Coronel Suarez',\n\t'Saquarema',\n\t'Meizhou',\n\t'Apia',\n\t'Jawor',\n\t'Saint-Pol-sur-Mer',\n\t'Heguri',\n\t'Bobangui',\n\t'Montalegre',\n\t'Ben Taieb',\n\t'Pande',\n\t'Horsell',\n\t'Sanjo',\n\t'`Aynkawah',\n\t'Sfantu-Gheorghe',\n\t'Escuinapa',\n\t'Talikota',\n\t'Guapiara',\n\t'Point Pleasant',\n\t'Ambohipandrano',\n\t'Khangaon',\n\t'Namlea',\n\t'Kottapalem',\n\t'Sebastiao Laranjeiras',\n\t'Phra Samut Chedi',\n\t'Madanancheri',\n\t'Farnworth',\n\t'Coshocton',\n\t'Garrison',\n\t'Peso da Regua',\n\t'Jaguaruna',\n\t'Katihar',\n\t'West Fargo',\n\t'Melaka',\n\t'Ambohimanambola',\n\t'Pabegou',\n\t'Nossa Senhora das Dores',\n\t'Burladingen',\n\t'Byumba',\n\t'Vallikunnam',\n\t'Mohan Eghu',\n\t'San Julian',\n\t'Miracema do Tocantins',\n\t'Palma',\n\t'Goh',\n\t'DeKalb',\n\t'Azle',\n\t'Mont-de-Marsan',\n\t'Slovenske Konjice',\n\t'Manazary',\n\t'Shende',\n\t'Portland',\n\t'Lamarao',\n\t'Reinach',\n\t'Chrzanow',\n\t'Hendek',\n\t'Iwakura',\n\t'Agua Clara',\n\t'Capim',\n\t'Brasilandia',\n\t'Port Colborne',\n\t'Ilsfeld',\n\t'Cienaga de Oro',\n\t'Faxinal dos Guedes',\n\t'Earlestown',\n\t'Andranomeva',\n\t'Visalia',\n\t'Tazhava',\n\t'Linquan',\n\t'Rampur Jalalpur',\n\t'Cricova',\n\t'Cholula de Rivadabia',\n\t'Apiai',\n\t'Vilandai',\n\t'Castellana Grotte',\n\t'Baturbari',\n\t'Jandiala',\n\t'Rive-de-Gier',\n\t'Feltham',\n\t'Laguna Niguel',\n\t'Kannal',\n\t'Purmerend',\n\t'Succasunna',\n\t'Ejea de los Caballeros',\n\t'Dolisie',\n\t'Vernag',\n\t'Tabount',\n\t'Kirksville',\n\t'Rahuri',\n\t'Nanjai Kilabadi',\n\t'Parigi',\n\t'Dhamsain',\n\t'Bainbridge',\n\t'Zumpango',\n\t'Le Beausset',\n\t'Westphalia',\n\t'Cabinda',\n\t'Bagahi',\n\t'Valmontone',\n\t'Al `Ajami',\n\t'Maromby',\n\t'Maaseik',\n\t'Wuyishan',\n\t'Ulbroka',\n\t'Santiago Juxtlahuaca',\n\t'Ranomena',\n\t'Buadiposo-Buntong',\n\t'Khurai',\n\t'`Aqrah',\n\t'Priverno',\n\t'Geldrop',\n\t'Balandougou',\n\t'Legnago',\n\t'Don Carlos',\n\t'Keitumkawn',\n\t'Levice',\n\t'Gulam',\n\t'Ratne',\n\t'Jiayuguan',\n\t'Gidha',\n\t'Juba',\n\t'Ksar Belezma',\n\t'Puerto Baquerizo Moreno',\n\t'Ponta Pora',\n\t'Sidrolandia',\n\t'Achim',\n\t'North Lynnwood',\n\t'Haslett',\n\t'Porto Ferreira',\n\t'Anqing',\n\t'Takahagi',\n\t'Fray Luis A. Beltran',\n\t'Basudebpur',\n\t'Concon',\n\t'Mangochi',\n\t'McKeesport',\n\t'Matheu',\n\t'Sumbha',\n\t'Murajpur',\n\t'Champerico',\n\t'Iki',\n\t'Port-Bouet',\n\t'Santa Luzia',\n\t'Chitaldrug',\n\t'Baliqchi',\n\t'Uthai Thani',\n\t'Az Zubaydiyah',\n\t'Cicero',\n\t'Rampurwa',\n\t'El Salto',\n\t'Duero',\n\t'Littleover',\n\t'Ropazi',\n\t'Andradas',\n\t'Tirur',\n\t'Caramoan',\n\t'San Carlos Alzatate',\n\t'Zuojiawu',\n\t'Karacasu',\n\t'Namioka',\n\t'Brumunddal',\n\t'West Milford',\n\t'Alandatte',\n\t'Dumingag',\n\t'Petrolandia',\n\t'Arachchalur',\n\t'Urussanga',\n\t'Cerrillos',\n\t'Ortega',\n\t'Kanyobagonga',\n\t'Atibaia',\n\t'Eustis',\n\t'Sefaatli',\n\t'Lasam',\n\t'Montalto di Castro',\n\t'Cihuatlan',\n\t'Cirebon',\n\t'Rangewala',\n\t'Tekkalakote',\n\t'Cameron Park',\n\t'Bardaskan',\n\t'Manambidala',\n\t'Bukittinggi',\n\t'Sora',\n\t'Dashouping',\n\t'Escarcega',\n\t'Tezoyuca',\n\t'Karadichittur',\n\t'Roskilde',\n\t'West Caln',\n\t\"Pereyaslav-Khmel'nyts'kyy\",\n\t'Senmanat',\n\t'Formosa',\n\t'Schaumburg',\n\t'Tarnobrzeg',\n\t'Kadaladi',\n\t'Ouled Haddaj',\n\t'Vuyyuru',\n\t'Baruipur',\n\t'Teniente Primero Manuel Irala Fernandez',\n\t'Menaceur',\n\t'Sedeh Lanjan',\n\t'Ciney',\n\t'Amboavory',\n\t'Jale',\n\t'Kalmar',\n\t'Koori',\n\t'Alsager',\n\t'Gulagac',\n\t'Zwedru',\n\t'Kadiyampatti',\n\t'Wilkes-Barre',\n\t'Bremerhaven',\n\t'Motru',\n\t'Bad Tolz',\n\t'Nha Trang',\n\t'Andranomavo',\n\t'Punta Prieta',\n\t'Masmouda',\n\t'Vavatenina',\n\t'Divandarreh',\n\t'Atambua',\n\t'Krosuru',\n\t'Wrecsam',\n\t'Apache Junction',\n\t'Barri',\n\t'Shingucho-shingu',\n\t'Kusaha',\n\t'Sidi Ahmed El Khadir',\n\t'West Springfield',\n\t'Al Wajh',\n\t'Massangena',\n\t'Doda',\n\t'Shutayil',\n\t'Messamena',\n\t'Navalcarnero',\n\t'Bellaire',\n\t'Nichelino',\n\t'Serra Azul',\n\t'Rantabe',\n\t'Padaivedu',\n\t'Monteroni di Lecce',\n\t'Drodro',\n\t'Rees',\n\t'Bulgan',\n\t'Fraijanes',\n\t'Montbrison',\n\t'Kangaroo Flat',\n\t'Urbach',\n\t'Lindon',\n\t'Olen',\n\t'Langgons',\n\t'Velim',\n\t'Marhamat',\n\t'Anamur',\n\t'Milattur',\n\t'Forecariah',\n\t'Quartier Morin',\n\t'Worb',\n\t'Playas',\n\t'Kingsville',\n\t'North Strabane',\n\t'Kolumalapalle',\n\t'Narippatta',\n\t'Yotsukaido',\n\t'Takahashi',\n\t'Dulce Nombre de Maria',\n\t'Reguiba',\n\t'Dapi',\n\t'Elk River',\n\t'Karaagac',\n\t'Duba',\n\t'Rasnov',\n\t'Cabrobo',\n\t'Easthampton',\n\t'Parvatipuram',\n\t'Husainpur',\n\t'Nipomo',\n\t'Chettimangurichchi',\n\t'Bekitro',\n\t'Itapagipe',\n\t'Palestina',\n\t\"Erval d'Oeste\",\n\t'Vasilika',\n\t'Kolappalur',\n\t'Batken',\n\t'Bank',\n\t'Qorako`l Shahri',\n\t'Manor',\n\t'Majanji',\n\t'Al Balyana',\n\t'Niederkassel',\n\t'Dulce Nombre de Jesus',\n\t'Mason City',\n\t'Lavello',\n\t'Zaruma',\n\t'Mignoure',\n\t'Namyslow',\n\t'Hagaranahalli',\n\t'Filippoi',\n\t'Ita',\n\t'Wuzhong',\n\t'Bedfordview',\n\t'Mollet',\n\t'Malipakar',\n\t'Innisfil',\n\t'Cehegin',\n\t'Stone',\n\t'Lake St. Louis',\n\t'Panskura',\n\t'Injibara',\n\t'Festus',\n\t'Cicevac',\n\t'Busra ash Sham',\n\t'Krompachy',\n\t'Mumford',\n\t'Phulmalik',\n\t'Jundiai',\n\t'Annaka',\n\t'Senhora dos Remedios',\n\t'Anthem',\n\t'Sadarak',\n\t'Naga City',\n\t'Xiping',\n\t'Planeta Rica',\n\t'Kilgore',\n\t'Ciudad Sabinas Hidalgo',\n\t'Tsaratanana',\n\t'Puduppalli Kunnam',\n\t'Manilva',\n\t'Colorno',\n\t'Majsperk',\n\t'Pibrac',\n\t'Nova Gorica',\n\t'Sorbolo',\n\t'Halberstadt',\n\t'Magalang',\n\t'Cozumel',\n\t'Chanco',\n\t'Gympie',\n\t'Colwood',\n\t'Vire',\n\t'Troina',\n\t'Oudenbosch',\n\t'Bertinoro',\n\t'El Bazouriye',\n\t'Cabra',\n\t'Alakamisy-Ambohimahazo',\n\t'Milan',\n\t'Sanare',\n\t'Trencin',\n\t'Minas',\n\t'Santa Vitoria do Palmar',\n\t'Saintes',\n\t'San Jose de las Lajas',\n\t'Governador Dix-Sept Rosado',\n\t'Ville-la-Grand',\n\t'Stjordal',\n\t'Kirkwall',\n\t'Aigaleo',\n\t'Uppukkottai',\n\t'Lakeway',\n\t'Cuchi',\n\t'Kamina',\n\t'Rawa Mazowiecka',\n\t'Xinyuan',\n\t'Scarsdale',\n\t'Tosashimizu',\n\t'Akot',\n\t'Yaritagua',\n\t'East Rancho Dominguez',\n\t'Pongoz',\n\t'Ambazoa',\n\t'Liuchuan',\n\t'Higashiura',\n\t'Blackfoot',\n\t'Gniezno',\n\t'Blanchard',\n\t'Zadar',\n\t'Nakaechi',\n\t'Mairena del Aljarafe',\n\t'Massama',\n\t'Mobo',\n\t'Kezmarok',\n\t'La Porte',\n\t'Berching',\n\t'Siegsdorf',\n\t'New Albany',\n\t'Half Way Tree',\n\t'Jharka',\n\t'Zinacantepec',\n\t'Draveil',\n\t'Bek-Abad',\n\t'Fayetteville',\n\t'Oyam',\n\t'Pasil',\n\t'Clamart',\n\t'Mbuzini',\n\t'Ouenza',\n\t'Perdur',\n\t'Soamanandrariny',\n\t'Hanawa',\n\t'Yekambarakuppam',\n\t'Mashiki',\n\t'Thibodaux',\n\t'Nijkerk',\n\t'Hayang',\n\t'Malabon',\n\t'Aparri',\n\t'Bwana Mkubwa',\n\t'Charqueada',\n\t'Kuju',\n\t'Kwamhlanga',\n\t'Alimos',\n\t'Ypane',\n\t'Sahave',\n\t'Marib',\n\t'Shirley',\n\t'Bunbury',\n\t'Talayan',\n\t'Ljungby',\n\t'San Juan de Betulia',\n\t'Laixi',\n\t'La Ferte-Bernard',\n\t'Lagos de Moreno',\n\t'Tangbian',\n\t'Adalar',\n\t'Nyamira',\n\t'Desert Hot Springs',\n\t'Datia',\n\t'Cognac',\n\t'Jaltipan de Morelos',\n\t'Ponsacco',\n\t'Dindori',\n\t'Hlaingbwe',\n\t'Delijan',\n\t'Cirie',\n\t'Une',\n\t'Boldesti-Scaeni',\n\t'Sapeacu',\n\t'Nagdah',\n\t'Douar Ezzerarda',\n\t'Bali',\n\t'Stevenage',\n\t'Saryshaghan',\n\t'Melchor Romero',\n\t'Barbana',\n\t'Zanjan',\n\t'Sennan',\n\t'Ponta Delgada',\n\t'Royse City',\n\t'Wonthaggi',\n\t'Putaendo',\n\t'Kokawa',\n\t'Wloszczowa',\n\t'Warner Robins',\n\t'Kranenburg',\n\t'Tome',\n\t'Usilampatti',\n\t'Puerto Pinasco',\n\t'El Maiten',\n\t'Gurgaon',\n\t'Immenstadt im Allgau',\n\t'Wisla',\n\t'Gannavaram',\n\t'Yingzhong',\n\t'Masho Khel',\n\t'Reitz',\n\t'Belen de Umbria',\n\t'Ripollet',\n\t'Lauaan',\n\t'Beira',\n\t'Ratu',\n\t'Mure',\n\t'Medicine Hat',\n\t'Ixcatepec',\n\t'Bois-des-Filion',\n\t'Nogent-le-Rotrou',\n\t'Djibouti',\n\t'University of California-Santa Barbara',\n\t'Byahatti',\n\t'Bentonville',\n\t'Danau Kandimarg',\n\t'Tevragh Zeina',\n\t'Sattar',\n\t'Tranoroa',\n\t'Mengdong',\n\t'Luz',\n\t'Wuyang',\n\t'Batemans Bay',\n\t'Dinas',\n\t'Itauna',\n\t'Artena',\n\t'Carouge',\n\t'Xylokastro',\n\t'Bahia de Caraquez',\n\t'Marabella',\n\t'Bremerton',\n\t'Ixtlahuacan del Rio',\n\t'Garchitorena',\n\t'Huittinen',\n\t'Fonsorbes',\n\t'Bafia',\n\t'Da Lat',\n\t'Pasian di Prato',\n\t'Sarayonu',\n\t'Chiman',\n\t'Colombo',\n\t'Kirikera',\n\t'Pemmperena',\n\t'Grunwald',\n\t'Savalgi',\n\t'Chambly',\n\t'Puduppatti',\n\t'Himamaylan',\n\t'Lansdowne',\n\t'Douar Mzoura',\n\t'Powell',\n\t'Erfurt',\n\t'Kizhake Chalakudi',\n\t\"L'Arbaa Nait Irathen\",\n\t'Galmi',\n\t'Junagarh',\n\t'Murgap',\n\t'Sallanches',\n\t'Loutete',\n\t'Rosa Zarate',\n\t'Caninde',\n\t'Santa Tecla',\n\t'Skoghall',\n\t'Banswada',\n\t'Cresskill',\n\t'Dabaozi',\n\t'Cortland',\n\t'Ennery',\n\t'Ifanirea',\n\t'Antsaidoha-Bebao',\n\t'Tepic',\n\t'Qiryat Gat',\n\t'Cabeceiras de Basto',\n\t'Pirot',\n\t'Waxahachie',\n\t'De Pere',\n\t'Salsomaggiore Terme',\n\t'Potenza Picena',\n\t'Wright',\n\t'Resadiye',\n\t'Melito di Napoli',\n\t'Toui',\n\t'Guercif',\n\t'Daga',\n\t'Porto Feliz',\n\t'Sinende',\n\t'Goasi',\n\t'Kikube',\n\t'North Tidworth',\n\t'Narona',\n\t'Capitao Eneas',\n\t'Makakilo',\n\t'Billere',\n\t'Tabas',\n\t'Klang',\n\t'Agogo',\n\t'Turnov',\n\t'Fairhaven',\n\t'Muriae',\n\t'Chakai',\n\t'Maniamkulam',\n\t'Seberang Jaya',\n\t'Jaboticatubas',\n\t'Burley',\n\t'Four Square Mile',\n\t'Kirchlinteln',\n\t'El Quetzal',\n\t'Mar del Plata',\n\t'Elattur',\n\t'Mezica',\n\t'Brunn am Gebirge',\n\t'Quetta',\n\t'Morokweng',\n\t'Kitanagoya',\n\t'Manacapuru',\n\t'Towamencin',\n\t'Aragona',\n\t'Regla',\n\t'Caldeirao Grande',\n\t'Musina',\n\t'Jacksonville',\n\t'Azul',\n\t'Winter Park',\n\t'Englefield Green',\n\t'Ambon',\n\t'Lucena',\n\t'Huntington Station',\n\t'Itarema',\n\t'San Francisco Chimalpa',\n\t'Ondokuzmayis',\n\t'Basford',\n\t'Antsaravibe',\n\t'Meilen',\n\t'Tangermunde',\n\t'Wijchen',\n\t'Castilleja de la Cuesta',\n\t'Lanark',\n\t'Usak',\n\t'Wall',\n\t'Mijas',\n\t'Sitionuevo',\n\t'East Lake',\n\t'Mahabo-Mananivo',\n\t'Dhoraji',\n\t'Jalacingo',\n\t'Willstatt',\n\t'Nakhl-e Taqi',\n\t'Opelousas',\n\t'Golo-Djigbe',\n\t'Santiago Nonualco',\n\t'Pulsano',\n\t'Simrol',\n\t'Ihnasya al Madinah',\n\t'Pozzallo',\n\t'Ramayipatti',\n\t'Sihaul',\n\t'Wanze',\n\t'Senduria',\n\t'Ergue-Gaberic',\n\t'Mauldin',\n\t'Sempeter pri Gorici',\n\t'Ammanabrolu',\n\t'Mitrapur',\n\t'Massarosa',\n\t'Binnish',\n\t'La Tour-de-Peilz',\n\t'Lavaltrie',\n\t'Barsbuttel',\n\t'Seberi',\n\t\"Murang'a\",\n\t'Macherla',\n\t'Acharipallam',\n\t'Setana',\n\t'Yichun',\n\t'Lugus',\n\t'Parnamirim',\n\t'Kayes',\n\t'Chinu',\n\t'Tubmanburg',\n\t'Cekme',\n\t'Mehdauli',\n\t'Vaulx-en-Velin',\n\t'Waikabubak',\n\t'Fontibon',\n\t'Omaha',\n\t'Pambujan',\n\t'Kassorola',\n\t'Khonj',\n\t'La Maddalena',\n\t'Fandrandava',\n\t'Chinna Mupparam',\n\t'Nea Smyrni',\n\t'Burgdorf',\n\t'Ituporanga',\n\t'Rayamangalam',\n\t'Albury',\n\t'Paranapanema',\n\t'Smiltene',\n\t'Lohmar',\n\t'Puliyankunnu',\n\t'Tiruvalla',\n\t'Hochberg',\n\t'Minto',\n\t'Antelope',\n\t'Mohanur',\n\t'Wiang Sa',\n\t'Dobrich',\n\t'Ingelheim',\n\t'Shetou',\n\t'Gavle',\n\t'Svedala',\n\t'Borogani',\n\t'Kisoro',\n\t'Ortenberg',\n\t'Uttarpara',\n\t'Rajaldesar',\n\t'Al Badari',\n\t'Masinigudi',\n\t'Gold Coast',\n\t'Indiana',\n\t'Swissvale',\n\t\"Al Jazirah al Hamra'\",\n\t'Santa Maria Capua Vetere',\n\t'Mangala',\n\t'Upper Bicutan',\n\t'Hacilar',\n\t'Woltersdorf',\n\t'Khwazakhela',\n\t'Santa Fe de Antioquia',\n\t'Gammasa',\n\t'Iwashita',\n\t'Bohmte',\n\t'Tondabayashicho',\n\t'Salobrena',\n\t'Unebicho',\n\t'Isaszeg',\n\t'Bloomsburg',\n\t'Vidor',\n\t'Niquero',\n\t'Niepolomice',\n\t'Halacho',\n\t'Khanpur Khairanti',\n\t'Sao Roque',\n\t'Shively',\n\t'Fox Crossing',\n\t'Postmasburg',\n\t'Vicentinopolis',\n\t'Rafael Delgado',\n\t'Fuglafjordhur',\n\t'Bekapaika',\n\t'Rastede',\n\t'Devnya',\n\t'Derecik',\n\t'Nida',\n\t'Odayarpatti',\n\t'Bala',\n\t'Harra',\n\t'Ain Youcef',\n\t'Kenge',\n\t'Sapone',\n\t'Dongtai',\n\t'Ratnapur',\n\t'Giron',\n\t'Kartuzy',\n\t'Lake Villa',\n\t'Kolaccheri',\n\t'Kiridh',\n\t'Hattersheim',\n\t'Daheba',\n\t'Et Taiyiba',\n\t'Ciudad del Plata',\n\t'Ohringen',\n\t'Tegina',\n\t'Ishii',\n\t'Gahmar',\n\t'Lancaster',\n\t'Carmel',\n\t'Firminy',\n\t'Akishima',\n\t\"Milla'ab\",\n\t'Beparasy',\n\t'Esperanza',\n\t'Bignay',\n\t'Spruce Grove',\n\t'Krommenie',\n\t'Hollviken',\n\t'Westminster',\n\t'Shymkent',\n\t'Majhaulia',\n\t'Biscarrosse',\n\t'Kadur Sahib',\n\t'Luce',\n\t\"Al Ha'ir\",\n\t'Teluk Intan',\n\t'Dubove',\n\t'Qiaotouba',\n\t'Qasbat Tadla',\n\t'North Walsham',\n\t'Aspe',\n\t'Dokkum',\n\t'Plaridel',\n\t'Sonsbeck',\n\t\"Cava de' Tirreni\",\n\t'Santa Elena',\n\t'Barka Gaon',\n\t'Asagicinik',\n\t'Dagua',\n\t'Campina Verde',\n\t'Kaitaia',\n\t'Leverkusen',\n\t'Merchtem',\n\t'Kiwoko',\n\t'Samborondon',\n\t'Palm Valley',\n\t'Fengjia',\n\t'Muhos',\n\t\"'Ain Kerma\",\n\t'Sihma',\n\t'Tuminkatti',\n\t'Letychiv',\n\t'Notse',\n\t'Pearsall',\n\t'Jeypore',\n\t'San Antonio Palopo',\n\t'Kingstown',\n\t'Lislique',\n\t'Sannat',\n\t'Monnickendam',\n\t'Kurabalakota',\n\t'Miranorte',\n\t'Rudersberg',\n\t'Kasama',\n\t'Granja',\n\t'Amarwa Khurd',\n\t'Ad Diwaniyah',\n\t'Evington',\n\t'Warman',\n\t'Kuttampuzha',\n\t'Mons',\n\t'Korsholm',\n\t'Gourma Rharous',\n\t'General Alvear',\n\t'Matelica',\n\t'Bongabon',\n\t'Irituia',\n\t'Son en Breugel',\n\t'Chauny',\n\t'Bayeux',\n\t'Unicov',\n\t'Shaler',\n\t'Aesch',\n\t'Rahata',\n\t'Porangaba',\n\t'Hattingen',\n\t'Ocampo',\n\t'Pirna',\n\t'Perunad',\n\t'Umm Badr',\n\t'Ramganj Mandi',\n\t'Saidia',\n\t'Mutata',\n\t'Manatuto',\n\t'Lambayeque',\n\t'Grasse',\n\t'Centreville',\n\t'Bandrele',\n\t'Glogow',\n\t'Canagatan',\n\t'Trisshileri',\n\t'Pavona',\n\t'Diamniadio',\n\t'Harsola',\n\t'Gulariya',\n\t'Dubendorf',\n\t'San Prisco',\n\t'Maissade',\n\t'Agios Nikolaos',\n\t'Dubak',\n\t'Nalut',\n\t'Bhadrachalam',\n\t'Upper Moreland',\n\t'Geyve',\n\t'El Tejar',\n\t'Castilla',\n\t'Amsin',\n\t'Meulebeke',\n\t'San Francisco El Alto',\n\t'Presidente Getulio',\n\t'Pakwach',\n\t'Mayfield',\n\t'Kalawana',\n\t'Evosmos',\n\t'Killarney',\n\t'Zhubei',\n\t'El Ksiba',\n\t'Sierpc',\n\t'Lambari',\n\t'Fakfak',\n\t'Dawlish',\n\t'Kambaliyampatti',\n\t'Dianke',\n\t'Gaoya',\n\t'Almenara',\n\t'Molina de Segura',\n\t'Zighout Youcef',\n\t'San Jose Poaquil',\n\t'Louvres',\n\t'Los Altos',\n\t'Newton Aycliffe',\n\t'Chesterfield',\n\t'Korhogo',\n\t'Srbac',\n\t'Warstein',\n\t'Talladega',\n\t'Tigaon',\n\t'Pozos',\n\t'Raja Pakar',\n\t'Kuttiyeri',\n\t'Tres Cachoeiras',\n\t'Luena',\n\t'Betatao',\n\t'Sredisce ob Dravi',\n\t'West Monroe',\n\t'Sonabedha',\n\t'Rhenen',\n\t'Talainayar Agraharam',\n\t'Serido',\n\t'Campobasso',\n\t'Zabkowice Slaskie',\n\t'Harji',\n\t'Ubata',\n\t'`Ajab Shir',\n\t'Tatoufet',\n\t'Hailun',\n\t'Kiratot',\n\t'El Idrissia',\n\t'Liannong',\n\t'Nedelisce',\n\t'Pirangi',\n\t'Beringen',\n\t'Leopoldo de Bulhoes',\n\t'Northolt',\n\t'Quesada',\n\t'Peumo',\n\t'Zitiste',\n\t'Kerman',\n\t'Cigli',\n\t'Gaibandha',\n\t'Tostado',\n\t'Ilog',\n\t'Mohana',\n\t'Erbach',\n\t'Mahasoabe',\n\t'Latifpur',\n\t'Rajim',\n\t'Tirhassaline',\n\t'Rathenow',\n\t'Strendur',\n\t'Grigny',\n\t'Skoczow',\n\t'Belwa',\n\t'Kasavanampatti',\n\t'Kalinagar',\n\t'Navappatti',\n\t'Megara',\n\t'Lolotique',\n\t'Saint-Junien',\n\t'Pijino del Carmen',\n\t'Guelph/Eramosa',\n\t'Solok',\n\t'Ciudad del Este',\n\t'Khagaria',\n\t'Kinogitan',\n\t'La Garenne-Colombes',\n\t'Manaquiri',\n\t'Telgte',\n\t'Igaracu do Tiete',\n\t'Mantsala',\n\t'Bogatic',\n\t'St. Cloud',\n\t'Huntertown',\n\t'Smithville',\n\t'Nueva Valencia',\n\t'Piru',\n\t'Yukarikaraman',\n\t'Merzifon',\n\t'Cosham',\n\t'Kharian',\n\t'Mantes-la-Ville',\n\t'Duanzhuang',\n\t'Kashipur',\n\t'Seaside',\n\t'Orchha',\n\t'Djemmorah',\n\t'Kocarli',\n\t'Mojkovac',\n\t'Nigel',\n\t'Kursunlu',\n\t'Soyagaon',\n\t'Pamuru',\n\t'Bassila',\n\t'Di An',\n\t'Vaureal',\n\t'El Dificil',\n\t'Troyan',\n\t'Toca',\n\t'Bet Shemesh',\n\t'Kayalpattanam',\n\t'Bernards',\n\t'Zomba',\n\t'Okabecho-okabe',\n\t'Nedroma',\n\t'Kostel',\n\t'Mosbach',\n\t'Miyauchi',\n\t'Jhitkahiya',\n\t'Rhymney',\n\t'Banisilan',\n\t'Medina',\n\t'Sayarpuram',\n\t'Landsberg',\n\t'Sevastopol',\n\t'Ceara-Mirim',\n\t'Assisi',\n\t'Goudomp',\n\t\"Debark'\",\n\t'Melrose Park',\n\t'Le Rheu',\n\t'Port Douglas',\n\t'San Andres Tuxtla',\n\t'Princetown',\n\t'Seybaplaya',\n\t'Riegelsberg',\n\t'Cagayan de Oro',\n\t'Lommel',\n\t'Wapi',\n\t'Feira de Santana',\n\t'Obertshausen',\n\t'Imarui',\n\t'Soavinandriana',\n\t'Strathmore',\n\t'Kanke',\n\t'Arraial do Cabo',\n\t'Matsudo',\n\t'Pandhana',\n\t'Sao Miguel do Guapore',\n\t'Medea',\n\t'Rheinfelden (Baden)',\n\t'Taglio',\n\t'Korgan',\n\t'Pantabangan',\n\t'Bhattiprolu',\n\t'Lingampet',\n\t'Puerto Pimentel',\n\t'Velampatti',\n\t'Vilsbiburg',\n\t'Mianpur Dubauli',\n\t'Panguipulli',\n\t'Hafr al Batin',\n\t'Brasnorte',\n\t'Vignate',\n\t'Frederikshavn',\n\t'Alpena',\n\t'Pagbilao',\n\t'Villers-les-Nancy',\n\t'Chagalamarri',\n\t'Dispur',\n\t'Menemen',\n\t'Baqershahr',\n\t'Jandola',\n\t'Oborniki Slaskie',\n\t'Bandlaguda',\n\t'Goulburn',\n\t'Safotulafai',\n\t'Dreieich',\n\t'Galatsi',\n\t'Meixedo',\n\t'Banovici',\n\t'San Martino Buon Albergo',\n\t'Recani',\n\t'Prudnik',\n\t'Sao Miguel do Araguaia',\n\t'Sunkarevu',\n\t'New Castle',\n\t'Ban Thung Tam Sao',\n\t'Nariman',\n\t'Pata Ellamilli',\n\t'Capitolio',\n\t'Dobele',\n\t'Leicester',\n\t'Giovinazzo',\n\t'Ribeiro do Amparo',\n\t'Pailitas',\n\t'San Pedro Ayampuc',\n\t'Stalowa Wola',\n\t'Khargone',\n\t'Lustenau',\n\t'Sale',\n\t'Narhan',\n\t'Rubiataba',\n\t'Arceburgo',\n\t'Hokitika',\n\t'Vila Frescainha',\n\t'Lomme',\n\t'Lazarevac',\n\t'Tikrit',\n\t'Sudak',\n\t'Phrae',\n\t'Ramapo',\n\t'Ninomiya',\n\t'Hrazdan',\n\t'Taguasco',\n\t'Serravalle',\n\t'Bushtyno',\n\t'Gobo',\n\t'Kuttalam',\n\t'Awans',\n\t'Chancay',\n\t'Jocotenango',\n\t'Woodhouse',\n\t'KwaDukuza',\n\t'Wildau',\n\t'Batobato',\n\t'Crest Hill',\n\t'Balvadi',\n\t'Karkudalpatti',\n\t'Santa Ines',\n\t'Guacari',\n\t'Mantena',\n\t'Ladera Ranch',\n\t'Sulechow',\n\t'Matruh',\n\t'Isla de Maipo',\n\t'Gothva',\n\t'Frutillar',\n\t'Raxruha',\n\t'Machesney Park',\n\t'Wingene',\n\t'Lejanias',\n\t'Le Chesnay',\n\t'Bissendorf',\n\t'Abadiania',\n\t'Ometepec',\n\t'Enna',\n\t'Petarukan',\n\t'Boone',\n\t'Awbari',\n\t'Annaram',\n\t'Boki-Were',\n\t'Al Mijlad',\n\t'Raiparthi',\n\t'Aougrout',\n\t'Ranchi',\n\t'Onojo',\n\t'Saumalkol',\n\t'Atri',\n\t'Kara-Kol',\n\t'Lauria Inferiore',\n\t'San Felice Circeo',\n\t'Wooburn',\n\t'Agualva',\n\t'Fotadrevo',\n\t'Herenfa',\n\t'Berlin',\n\t'Astolfo Dutra',\n\t'Gahini',\n\t'Ambanja',\n\t'Hargeysa',\n\t'Santa Cruz do Capibaribe',\n\t'Ertis',\n\t'Esperantina',\n\t'Biloxi',\n\t'Hang Tram',\n\t'Diinsoor',\n\t'Asfour',\n\t'Pula',\n\t'Cacaopera',\n\t'Noida',\n\t'Pittsfield',\n\t'Le Muy',\n\t'Barletta',\n\t'Buraydah',\n\t'Ingolstadt',\n\t'Chautham',\n\t'Northwest Harborcreek',\n\t'Oldsmar',\n\t'Neder-Over-Heembeek',\n\t'Kamisu',\n\t'Puerto Piritu',\n\t'Ambatolahy',\n\t'Daru',\n\t'New Brighton',\n\t'Queluz',\n\t'Epernay',\n\t'Bacalar',\n\t'Ban Nikhom Phatthana',\n\t'Valbonne',\n\t'Yondo',\n\t'Khowrmuj',\n\t'Jingdezhen',\n\t'Campana',\n\t'Kuli',\n\t'Ogimachi',\n\t'Biskupiec',\n\t'Framingham',\n\t'Lomma',\n\t'Papraur',\n\t'Mukumbura',\n\t'Kawayan',\n\t'Ncora',\n\t'Zhaoling',\n\t'Boscombe',\n\t'Abbeville',\n\t'Reisterstown',\n\t'Tongeren',\n\t'Joal-Fadiout',\n\t'Rosario de Lerma',\n\t'Velpuru',\n\t'Douarnenez',\n\t'Sofia',\n\t'Itayanagi',\n\t'Ekinozu',\n\t'Bonanza',\n\t'Mohlanapeng',\n\t'Cudworth',\n\t'Barga',\n\t'Okinawa',\n\t'Owase',\n\t'Ainan',\n\t'Nyunzu',\n\t'Yokohama',\n\t'Aiud',\n\t'Tachov',\n\t'Khagam',\n\t'Anosiarivo',\n\t'Khust',\n\t'Apolda',\n\t'Bogra',\n\t'Djinet',\n\t'Holiday City-Berkeley',\n\t'Carmo do Rio Verde',\n\t'Kirchseeon',\n\t'Victorica',\n\t'Lahar',\n\t'Veranopolis',\n\t'Bechar',\n\t'Noceto',\n\t'Nossa Senhora da Gloria',\n\t'Bhaluhar',\n\t'Hofu',\n\t'Sozopol',\n\t'Kyabe',\n\t'Sosua',\n\t'Benedikt',\n\t'Bad Neuenahr-Ahrweiler',\n\t'Narendrapatnam',\n\t'Gurramkonda',\n\t'Pinhel',\n\t'Shiling',\n\t'Nadol',\n\t'Paredes',\n\t'Adjido',\n\t'Trebnje',\n\t'Yelpur',\n\t'Sirpur',\n\t'Barvala',\n\t'Angol',\n\t'Birpur Barapatti Pindraun',\n\t'Hendijan',\n\t'Parakou',\n\t'Mangaratiba',\n\t'Schwabisch Hall',\n\t'Sarqan',\n\t'Aleshtar',\n\t'Warin Chamrap',\n\t'West Des Moines',\n\t'Cutervo',\n\t'Valiyakumaramangalam',\n\t'Kottoppadam',\n\t'Sukth',\n\t'Sambhal',\n\t'Velliyod',\n\t'Waldshut-Tiengen',\n\t'Lakhnaur',\n\t'Barrocas',\n\t'Djamaa',\n\t'Matale',\n\t'Ban Phai',\n\t'Sao Paulo de Olivenca',\n\t'Harar',\n\t'Barbasa',\n\t'Kukatpalli',\n\t'Aisho',\n\t'Raynham',\n\t'Harborcreek',\n\t'Bafra',\n\t'Gibsons',\n\t'Cluj-Napoca',\n\t'Hoeselt',\n\t'Acopiara',\n\t'Filipstad',\n\t'Camardi',\n\t'Bunol',\n\t'Rania',\n\t\"Su'ao\",\n\t'Konen Agrahar',\n\t'Sidi Qacem',\n\t'Chapada dos Guimaraes',\n\t'Bad Berleburg',\n\t'Thabazimbi',\n\t'Bradley',\n\t'Masif Sarsink',\n\t'Anse Rouge',\n\t'Galten',\n\t'Oshoba',\n\t\"Alta Floresta D'Oeste\",\n\t'Ranaghat',\n\t'Patchur',\n\t'Rameswaram',\n\t'Fonadhoo',\n\t'Kuraymah',\n\t'Bosanska Krupa',\n\t'Cajica',\n\t'Sabou',\n\t'Fundacion',\n\t'Koba',\n\t'Rudra Nagar',\n\t'Tskhinvali',\n\t'Itarantim',\n\t'Mirzapur',\n\t'Mocajuba',\n\t'Berazategui',\n\t'Penjamo',\n\t'Doctor Mora',\n\t'Boleslawiec',\n\t'Angat',\n\t'Siraha',\n\t'Rock Ferry',\n\t'Salt',\n\t'Az Zintan',\n\t'Livno',\n\t'Winterville',\n\t'Daryabad',\n\t'Newton Mearns',\n\t'Milovice',\n\t'Nanqiao',\n\t'Nord',\n\t'Doba',\n\t'Guayacanes',\n\t'Didcot',\n\t'Skelmersdale',\n\t'Ivoamba',\n\t'Roessleville',\n\t'Sadovoye',\n\t'Magugpo Poblacion',\n\t'Toritama',\n\t'Mulakaledu',\n\t'Baia da Traicao',\n\t'Pissila',\n\t'Echuca',\n\t'Les Cayes',\n\t'Gajwel',\n\t'San Jose de Jachal',\n\t'Swedru',\n\t'Ribeirao',\n\t'Zhetibay',\n\t'Monatele',\n\t'Gibraleon',\n\t'Kufstein',\n\t'Chak Five Hundred Seventy-five',\n\t'Sterling',\n\t'Khattan',\n\t'Kuse',\n\t'Euless',\n\t'Baggao',\n\t'Al Juwayyidah',\n\t'Ilobasco',\n\t'Assi Bou Nif',\n\t'Ikniwn',\n\t'Gudja',\n\t'Monteiro',\n\t'Bryn Mawr-Skyway',\n\t'Corona de Tucson',\n\t'Sonson',\n\t'Clevedon',\n\t'Palestrina',\n\t'Uberherrn',\n\t'Civitella in Val di Chiana',\n\t'Balya',\n\t'Vinanivao',\n\t'Alexandria',\n\t'Merida',\n\t'Kursumlija',\n\t'Delgado',\n\t'Menton',\n\t'Dharampur Bande',\n\t'Goiana',\n\t'Matican',\n\t'Carballo',\n\t'Itapebi',\n\t'Minsk Mazowiecki',\n\t'Bhadaur',\n\t'Saidu Sharif',\n\t'Lalla Mimouna',\n\t'Mian Sahib',\n\t'Borzna',\n\t'Pakenham',\n\t'Al Kut',\n\t'Guemoukouraba',\n\t'Dhandhuka',\n\t'Crawfordsville',\n\t'Arak',\n\t'Acahay',\n\t'`Abasan al Kabirah',\n\t'Farashband',\n\t'San Tomas',\n\t'Calasparra',\n\t'Ambahoabe',\n\t'Bayindir',\n\t'Merauke',\n\t'Ayagawa',\n\t'Ndjamba',\n\t'Lakewood',\n\t'Krishnanagar',\n\t'Kyustendil',\n\t'Porto Franco',\n\t'Anoka',\n\t'Tulsa',\n\t'De Haan',\n\t'Caluco',\n\t'Dumraon',\n\t'Fauske',\n\t'Jogiara',\n\t'Rambha',\n\t'Campina Grande do Sul',\n\t'Pontevedra',\n\t'Brejolandia',\n\t'Sundarpur',\n\t'Waltikon',\n\t'Putten',\n\t'Jardim',\n\t'Siemianowice Slaskie',\n\t'Buchen in Odenwald',\n\t'Ningde',\n\t'Tonsberg',\n\t'Shaliuhe',\n\t'Siracusa',\n\t'Galleh Dar',\n\t'Ponneri',\n\t'Gifhorn',\n\t'Avarua',\n\t'Longzhou',\n\t'Wenxicun',\n\t'Pontardulais',\n\t'Alipur',\n\t'Doetinchem',\n\t'Maravatio de Ocampo',\n\t'Elma',\n\t'Paravur Tekkumbhagam',\n\t'Oak Hills Place',\n\t'Dorou',\n\t'Galapagar',\n\t'Prata',\n\t'Bytca',\n\t'Kanmaki',\n\t'Ban Pong Tao',\n\t'Antsohihy',\n\t'Ban Ang Sila',\n\t'Gorisnica',\n\t'Abrera',\n\t'Visaginas',\n\t'Suoluntun',\n\t'Le Perreux-Sur-Marne',\n\t'Durbat',\n\t'Ourinhos',\n\t'Homa Bay',\n\t'Kolkwitz',\n\t'Gornji Grad',\n\t'Soroca',\n\t'Licata',\n\t'Zhangshanying',\n\t'Shuangcheng',\n\t'Shariff Aguak',\n\t'Redcliff',\n\t'Selargius',\n\t'Zapotlan del Rey',\n\t'Uetersen',\n\t'Rochedale',\n\t'Mongeri',\n\t'Tonala',\n\t'Lloydminster',\n\t'Ribeira Brava',\n\t'Xingcheng',\n\t'Baku',\n\t'Ban Dung',\n\t'Klatovy',\n\t'Empangeni',\n\t'Chundale',\n\t'Sorontona',\n\t'Dieppe',\n\t'Grandville',\n\t'Udawantnagar',\n\t'Qaqortoq',\n\t'Bischheim',\n\t'Urucui',\n\t'Uychi',\n\t'Kalispell',\n\t'Amman',\n\t'Esplugas de Llobregat',\n\t'Lohfelden',\n\t'Nacimiento',\n\t'Phongsali',\n\t'Ngerulmud',\n\t'Mulsen',\n\t'Yby Yau',\n\t'Balassagyarmat',\n\t'Malingaon',\n\t'Xionglin',\n\t'Glenvar Heights',\n\t'Miho',\n\t'North Liberty',\n\t'Dongshan',\n\t'Bauang',\n\t'Beguedo',\n\t'Cruz Grande',\n\t'Douar Trougout',\n\t'Primrose',\n\t'Merrimack',\n\t'Raigarh',\n\t'Potomac',\n\t'Voorhees',\n\t'Dalippur',\n\t'Castle Pines',\n\t'La Montanita',\n\t'Sabang',\n\t'Vintar',\n\t'Mikumi',\n\t'Sydney',\n\t'Tarhjicht',\n\t'Nizao',\n\t'Cahors',\n\t'Elland',\n\t'Diplahan',\n\t'Kayankulam',\n\t'Custodia',\n\t'Felipe Carrillo Puerto',\n\t'Paraguacu',\n\t'Lohafary',\n\t'Austintown',\n\t'Huixquilucan',\n\t'Pulpi',\n\t'Oakleaf Plantation',\n\t'Katsina',\n\t'Florennes',\n\t'Bad Honnef am Rhein',\n\t'Brenes',\n\t'West Linn',\n\t'Xanthi',\n\t'Saint-Saulve',\n\t'Sierra Bullones',\n\t'Dravograd',\n\t'Bizen',\n\t'Kurman',\n\t'Kuzma',\n\t'Kolagallu',\n\t'Bordj Ghdir',\n\t'Jogeva',\n\t\"Sofiyivs'ka Borshchahivka\",\n\t'Pipra',\n\t'Lubeck',\n\t'Oppegard',\n\t'Kuopio',\n\t'Tuscumbia',\n\t'Kasaji',\n\t'Fort Atkinson',\n\t'Tamar',\n\t'Middelfart',\n\t'Grumo Nevano',\n\t'Downey',\n\t'Singhanwala',\n\t'Kawasaki',\n\t'Opglabbeek',\n\t'Maun',\n\t'Bosel',\n\t'Benaulim',\n\t'Smethwick',\n\t'Maromandia',\n\t'Hawaiian Gardens',\n\t'Jantho',\n\t'Malangam',\n\t'Rock Hill',\n\t'Livingstone',\n\t'Jaranwala',\n\t'Krong Kep',\n\t'West Covina',\n\t'Belzig',\n\t'Kitagata',\n\t'Fountain',\n\t'San Lorenzo de Descardazar',\n\t'Bati',\n\t'Quzanli',\n\t'Hosuru',\n\t'Poco Verde',\n\t'Simeulu',\n\t'Yangquan',\n\t'Shahzadpur',\n\t'Lopik',\n\t'Tarogong',\n\t'Iraiyur',\n\t'Freiberg',\n\t'Corinto',\n\t'Ukiha',\n\t'Alindao',\n\t'Ambohimahavelona',\n\t'Sosan',\n\t'Bhagabanpur',\n\t'Madamba',\n\t'Liubymivka',\n\t'Hassan',\n\t'Sham Shui Po',\n\t'Barbalha',\n\t'Wonju',\n\t'Taftanaz',\n\t'Waipio',\n\t'Guidan Roumdji',\n\t'Vohringen',\n\t'Crusinallo',\n\t'Nagareyama',\n\t'Geel',\n\t'Takahama',\n\t'Czarna Bialostocka',\n\t'Matthews',\n\t'Fleury-Merogis',\n\t'Tall `Aran',\n\t'Kamikawa',\n\t'Rose Belle',\n\t'Anorombato',\n\t'Wolfsberg',\n\t'Montreal',\n\t'Macrohon',\n\t'Miribel',\n\t'Cobanlar',\n\t'Gelsenkirchen',\n\t'Noblesville',\n\t'Sabaur',\n\t'Aizkraukle',\n\t'El Bayadh',\n\t'Bir Jdid',\n\t'Gunjur',\n\t'Nauta',\n\t'Browns Mills',\n\t'Shawnee',\n\t'Bredasdorp',\n\t'Camas',\n\t'Malebennur',\n\t'Ninh Binh',\n\t'Alto do Rodrigues',\n\t'Wilton Manors',\n\t'Fort Hunt',\n\t'Usia',\n\t'Lorgues',\n\t'Sanrha',\n\t'Bluffton',\n\t'Kendallville',\n\t'Preddvor',\n\t'Xovos',\n\t'Staoueli',\n\t'James Island',\n\t'Pampa del Infierno',\n\t'Lucaya',\n\t'Chino Valley',\n\t'Fort Leonard Wood',\n\t'Mirpur Bhtoro',\n\t'Ixtapa Zihuatanejo',\n\t'Albemarle',\n\t'Bekkaria',\n\t'Payatas',\n\t'Vitanje',\n\t'Koila Dewa',\n\t'Zhaoqing',\n\t'Sabac',\n\t'Kakonko',\n\t'Hojambaz',\n\t'Voinjama',\n\t'Xiaba',\n\t'Ramasingavaram',\n\t'Of',\n\t'Champoton',\n\t'Burntwood',\n\t'Viernheim',\n\t'Estoril',\n\t'Aflou',\n\t'Ampanefena',\n\t'Kamiamakusa',\n\t'Juan L. Lacaze',\n\t'Motkur',\n\t'My Luong',\n\t'Vernouillet',\n\t'Balatan',\n\t'Samaipata',\n\t'Alwa Tirunagari',\n\t'Saku',\n\t'Kuilsrivier',\n\t'Lynn Haven',\n\t'Maisach',\n\t'Bingerville',\n\t'Alicia',\n\t'Riversdale',\n\t'Bishunpur',\n\t'Tepoztlan',\n\t'Vishakhapatnam',\n\t'Gameleira',\n\t'Nyanza',\n\t'Bad Frankenhausen',\n\t'Huasca de Ocampo',\n\t'Kasongan',\n\t'Tortoreto',\n\t'Moschato',\n\t'Requena',\n\t'Kelowna',\n\t'Nyahanga',\n\t'Pohadi',\n\t'Kalibo',\n\t'Round Rock',\n\t'Pequannock',\n\t'Haifa',\n\t'Ezpeleta',\n\t'Boosaaso',\n\t'Oberschleissheim',\n\t'Seesen',\n\t'Alexandreia',\n\t'Salihli',\n\t'Mandali',\n\t'Xoxocotla',\n\t'Jakkampalaiyam',\n\t'Bradford West Gwillimbury',\n\t'West Perth',\n\t'Jaszbereny',\n\t'Vukovar',\n\t'Wittstock',\n\t'Dartmouth',\n\t'Zacatecas',\n\t'Oswego',\n\t\"Debre Werk'\",\n\t'Annemasse',\n\t'Juripiranga',\n\t'Tultitlan de Mariano Escobedo',\n\t'Coachella',\n\t'Zagubica',\n\t'Altepexi',\n\t'Balao',\n\t'Velappadi',\n\t'Pamukkale',\n\t'West Vancouver',\n\t'Encamp',\n\t'Gudibanda',\n\t'Bensenville',\n\t'Augusta',\n\t'Natitingou',\n\t'Ganyesa',\n\t'Jiujiang',\n\t'Bad Schwartau',\n\t'Kings Norton',\n\t'Dharampuri',\n\t'Huanta',\n\t'Iganga',\n\t'Buckeburg',\n\t'Perryville',\n\t'Bingham',\n\t'Severn',\n\t'As Sulayyil',\n\t'Les Coteaux',\n\t'Jinmingsi',\n\t'Mel Nariyappanur',\n\t'Timimoun',\n\t'Nato',\n\t'Unisan',\n\t'Danao',\n\t'Mount Hagen',\n\t'Fiesole',\n\t'Concepcion Las Minas',\n\t'Zagorje',\n\t'Eilenburg',\n\t'Vardenik',\n\t'Ribeirao Branco',\n\t'Bismil',\n\t'Lichinga',\n\t'Reinosa',\n\t'Paray-le-Monial',\n\t'Villamediana de Iregua',\n\t'Madisonville',\n\t'Cheam',\n\t'Qabatiyah',\n\t'Bagnacavallo',\n\t'Shankou',\n\t'San Giuseppe Vesuviano',\n\t'Penaflor',\n\t'Amatenango del Valle',\n\t'Vanderbijlpark',\n\t'Coelemu',\n\t'Labiod Medjadja',\n\t'Olkusz',\n\t'Shefar`am',\n\t'Ulan Hua',\n\t'Sirka',\n\t'Caceres',\n\t'Gurh',\n\t'Oildale',\n\t'Colonial Heights',\n\t'eMuziwezinto',\n\t'Uster',\n\t'Pampur',\n\t'Martinsville',\n\t'Suttamalli',\n\t'Go Cong',\n\t'San Miguel de Papasquiaro',\n\t'Aliabad',\n\t'Huaura',\n\t'Denderleeuw',\n\t'Kremiss',\n\t'Kattukkottai',\n\t'Sakaka',\n\t'Khuran Milik',\n\t\"Al Ma`alla'\",\n\t'Belluno',\n\t'Liptovsky Mikulas',\n\t'Baghra',\n\t'Touboro',\n\t'Science City of Munoz',\n\t'Trzebinia',\n\t'Filandia',\n\t'Myjava',\n\t'Ramachandrapuran',\n\t'Agdangan',\n\t'Bourzanga',\n\t'Barstow',\n\t'Annigeri',\n\t'Taio',\n\t'Deokali',\n\t'Lake Country',\n\t'Taizhou',\n\t'Adwick le Street',\n\t'Quilon',\n\t'Partesh',\n\t'Cwmbran',\n\t'Vaerlose',\n\t'San Calixto',\n\t'Oued Sly',\n\t'Lomazzo',\n\t'Guzelbahce',\n\t'Fishkill',\n\t'Annapolis',\n\t'Washington Terrace',\n\t'Keansburg',\n\t'Xintangcun',\n\t'Eastwood',\n\t'Sinmperekou',\n\t'Long Hill',\n\t'Roswell',\n\t'Budakeszi',\n\t'Lincolnia',\n\t'Flagstaff',\n\t'Eynesil',\n\t'Ban Wiang Ka Long',\n\t'Groveton',\n\t'Des Peres',\n\t'Namacunde',\n\t'Zlotow',\n\t'Chittoor',\n\t'Torre del Greco',\n\t'Morrinhos',\n\t'Upper Chichester',\n\t'Marousi',\n\t'Calimete',\n\t'Oytal',\n\t'Sao Joao dos Angolares',\n\t'Anenii Noi',\n\t'Perry',\n\t'Ait Melloul',\n\t'Kitchener',\n\t'Amboronabo',\n\t'Burtonwood',\n\t'Croydon',\n\t'San Celoni',\n\t'Suhaj',\n\t'Hod HaSharon',\n\t'Kitenkela',\n\t'Alagappapuram',\n\t'Ramat HaSharon',\n\t'Tortona',\n\t'Rota',\n\t'Innisfail',\n\t'Cuyahoga Falls',\n\t'Guadix',\n\t'Wil',\n\t'Vemuladivi',\n\t'Taungup',\n\t'Itaocara',\n\t'San Pedro Mixtepec',\n\t'Konce',\n\t'Puerto Guzman',\n\t'Mahuwa Singhrai',\n\t'North Merritt Island',\n\t'Most',\n\t'Lahstedt',\n\t'Westland',\n\t'Liuma',\n\t'Charagua',\n\t'Krasnogorskiy',\n\t'Pakarya Harsidhi',\n\t'Beni Oulid',\n\t'Daqing',\n\t'Ecorse',\n\t'Pineto',\n\t'Olbernhau',\n\t'Dorfen',\n\t'Madeira',\n\t'Sassnitz',\n\t'Susegana',\n\t'Suamico',\n\t'Spring',\n\t'Milazzo',\n\t'Erada',\n\t'Obernburg am Main',\n\t'Oak Harbor',\n\t'Marokarima',\n\t'Malangawa',\n\t'McAllen',\n\t'Merrill',\n\t'Pe de Serra',\n\t'Bilohorodka',\n\t'Dhakaich',\n\t'Malhador',\n\t'Wenatchee',\n\t'Almere',\n\t'Benguela',\n\t'Pisek',\n\t'Matam',\n\t'Sidi Bouzid',\n\t'Chhota Udepur',\n\t'Tehran',\n\t'Panjakent',\n\t'Itapage',\n\t'Quarteira',\n\t\"Mi'eso\",\n\t'Saverne',\n\t'Panchimalco',\n\t'Parambil',\n\t'San Miguel de Salcedo',\n\t'Sanwas',\n\t'Sidhap Kalan',\n\t'Umraniye',\n\t'Falavarjan',\n\t'Gaalkacyo',\n\t'La Ferte-sous-Jouarre',\n\t'Schwalbach',\n\t'La Junta',\n\t'Timbuktu',\n\t'Jessore',\n\t'Tomisato',\n\t'Parachinar',\n\t'Myslowice',\n\t'Beelitz',\n\t'Minehead',\n\t'Samadiala',\n\t'Mankera',\n\t'San Pedro Sacatepequez',\n\t'Gaithersburg',\n\t'Pongnam',\n\t'Chambery',\n\t'Wareham',\n\t'Catu',\n\t'Gangania',\n\t'Shingu',\n\t'Sawahlunto',\n\t'Aydincik',\n\t'Somvarpet',\n\t'Beshariq',\n\t'Hongjiang',\n\t'Nallamadu',\n\t'Hengelo',\n\t'Sidi Tabet',\n\t'Pucioasa',\n\t'Salvaterra',\n\t'Zhongbai',\n\t'Pital',\n\t'Acu',\n\t'La Ligua',\n\t'Kalugumalai',\n\t'Raharpur',\n\t'La Grande',\n\t'Sint-Lievens-Houtem',\n\t'Ban Tha Pho',\n\t'Shangluhu',\n\t'Ciudad Madero',\n\t'Matias Barbosa',\n\t'Yara',\n\t'Lamitan',\n\t'Port Laoise',\n\t'Adiyaman',\n\t'Jaguey Grande',\n\t'Douai',\n\t'Tecuci',\n\t'Tifni',\n\t'Changsha',\n\t'Acatzingo',\n\t'Eilat',\n\t'South Ogden',\n\t'Talsi',\n\t'Dzuunmod',\n\t'Kafr al Kurdi',\n\t'Cochrane',\n\t'Xigaze',\n\t'Terra Santa',\n\t'Na Klang',\n\t'Parsa',\n\t'Side',\n\t'Noshiromachi',\n\t'Tepehuacan de Guerrero',\n\t'Makri',\n\t'Bernex',\n\t'Magway',\n\t'Modugno',\n\t'East Gwillimbury',\n\t'Dornakal',\n\t'The Crossings',\n\t'Gazi',\n\t'Dengjiazhuang',\n\t'Betroka',\n\t'Manno',\n\t'Hausjarvi',\n\t'Menifee',\n\t'Qobustan',\n\t'Ban Bang Pu Mai',\n\t'Macau',\n\t'Lithgow',\n\t'Kissa',\n\t'Kenadsa',\n\t'Mosul',\n\t'Letterkenny',\n\t'Conda',\n\t'Poonamallee',\n\t'Huruta',\n\t'Chennevieres-sur-Marne',\n\t'Camiri',\n\t'Cazanga',\n\t'East Bakersfield',\n\t'Baiji',\n\t'Garsfontein',\n\t'Bad Iburg',\n\t'Glen Carbon',\n\t'Arvin',\n\t'Sobhapur',\n\t'Talas',\n\t'Aalborg',\n\t'Bagnara Calabra',\n\t'Pokhram',\n\t'Aragoiania',\n\t'Aravankara',\n\t'East Nottingham',\n\t'Ramjibanpur',\n\t'Kilmangalam',\n\t'Talisay',\n\t'Krusevac',\n\t'Baranain',\n\t'Gauli Palasiya',\n\t'Sieverne',\n\t'Chakradharpur',\n\t'Ipil',\n\t'Xiamen',\n\t'Henichesk',\n\t'Wajir',\n\t'Polonuevo',\n\t'Las Piedras',\n\t'Vysokyi',\n\t'Barra do Pirai',\n\t'Malancha',\n\t'Vendome',\n\t'Kisarazu',\n\t'Ambohidanerana',\n\t'Villareal',\n\t'San',\n\t'Ipele',\n\t'Bologna',\n\t'Berwyn',\n\t'Kadambanad',\n\t'Diest',\n\t'Tuy Hoa',\n\t'Neuilly-sur-Seine',\n\t'Kiryas Joel',\n\t'Takoma Park',\n\t'Suwa',\n\t'Heiloo',\n\t'Chorbogh',\n\t'Teror',\n\t'Passo do Sertao',\n\t'Akim Swedru',\n\t'Bucheon',\n\t'Upper',\n\t'Kobuleti',\n\t'Adesar',\n\t'Hugli',\n\t'El Khroub',\n\t'Mwaya',\n\t'Atome-Avegame',\n\t'Dhahran',\n\t'Ratnapura',\n\t'Roncq',\n\t'Ambatomena',\n\t'Ichihara',\n\t'Waiblingen',\n\t'Anapoima',\n\t'Tizi Nisly',\n\t'Schiffdorf',\n\t'Merrick',\n\t'Jesenik',\n\t'Jnane Bouih',\n\t'Victoria Falls',\n\t'Genhe',\n\t'Charne',\n\t'Bicas',\n\t'Yandrapalle',\n\t'Onklou',\n\t'Arezzo',\n\t'Taung',\n\t'Paphos',\n\t'Otacilio Costa',\n\t'Ichora',\n\t'Urlaha',\n\t'Espelkamp',\n\t'Birao',\n\t'Lora del Rio',\n\t'Altavilla Milicia',\n\t'Anchorage',\n\t'Pendik',\n\t'Bugojno',\n\t'Kadavur',\n\t'Zahirabad',\n\t'Oschersleben',\n\t'Guerrero Negro',\n\t'Posadas',\n\t'Tabligbo',\n\t'Bermeo',\n\t'Coquimatlan',\n\t'Farg`ona',\n\t'Resita',\n\t'Syurte',\n\t'Viacha',\n\t'Tsing Yi Town',\n\t'Pultusk',\n\t'Patratu',\n\t'Satbayev',\n\t'Bonga',\n\t'San Salvador',\n\t'Szentendre',\n\t'Yvetot',\n\t'Bilpura',\n\t'Kabugao',\n\t'Haskovo',\n\t'Ingleside',\n\t'Wapakoneta',\n\t'Alhendin',\n\t'Mandialaza',\n\t'Kharsawan',\n\t'Chanda',\n\t'Maulavi Bazar',\n\t'Rautara',\n\t'Ljig',\n\t'Iona',\n\t'Sakaiminato',\n\t'North Myrtle Beach',\n\t'Peralillo',\n\t'Santa Flavia',\n\t'Ban Thung Khao Phuang',\n\t'Mandalavadi',\n\t'Bulanik',\n\t'Chong-Aryk',\n\t'Jayamkondacholapuram',\n\t'Havran',\n\t'Belobaka',\n\t'Fujisawacho-niinuma',\n\t'Puyallup',\n\t'Anderanboukan',\n\t'San Lazaro',\n\t'Metpalli',\n\t'Cerkezkoy',\n\t'Attleborough',\n\t'Chunakara Vadakku',\n\t'Eqlid',\n\t'Rockhampton',\n\t'Onalaska',\n\t'Hani i Elezit',\n\t'Ituzaingo',\n\t'Teculutan',\n\t'Bajwara',\n\t'Loran',\n\t'Guinayangan',\n\t'Wunstorf',\n\t'Sheopur',\n\t'Gol Tappeh',\n\t'Casselberry',\n\t'Jurema',\n\t'Chimay',\n\t'Horasan',\n\t'Sankt Wendel',\n\t'Eksambe',\n\t'Francisco Morato',\n\t'Panfilovka',\n\t'Ensley',\n\t'Kudavasal',\n\t'Palpala',\n\t'Itapecerica',\n\t'Drancy',\n\t'Monaghan',\n\t'Beamsville',\n\t'Crato',\n\t'Keila',\n\t'Riedlingen',\n\t'Bucine',\n\t'Vadippatti',\n\t'Segou',\n\t'Bag`dod',\n\t'Vellanad',\n\t'Conceicao do Castelo',\n\t'Alenquer',\n\t'Kalgi',\n\t'Somers Point',\n\t'McMinnville',\n\t'Erlangen',\n\t'Dabeiba',\n\t'Selkirk',\n\t'Toffo',\n\t'Aba',\n\t'Landi Kotal',\n\t'Duyen Hai',\n\t'Ostermundigen',\n\t'Doutou',\n\t'Emmeloord',\n\t'Ainsdale',\n\t'Isla Mujeres',\n\t'Bosobolo',\n\t'Forst (Lausitz)',\n\t'Swarzedz',\n\t'Guttenberg',\n\t'Gibsonton',\n\t'Moa',\n\t'Nattarasankottai',\n\t'Itaberai',\n\t'Teghra English',\n\t'Bellingham',\n\t'Lafayette',\n\t'Fort Wayne',\n\t'Odranci',\n\t'Hannut',\n\t'Ashburn',\n\t'Malate',\n\t'Jardin',\n\t'Clarington',\n\t'Mandiakui',\n\t'Merrydale',\n\t'Uirauna',\n\t'Panvel',\n\t'Chaguanas',\n\t'Basaha',\n\t'Susanville',\n\t'Kharik',\n\t'Grandview',\n\t'Mallapalli',\n\t'Ban Krang',\n\t'Camaiore',\n\t'Gross-Zimmern',\n\t'Vehkalahti',\n\t'Merchweiler',\n\t'Mohnesee',\n\t'Beach Park',\n\t'Yeghvard',\n\t'Beckingen',\n\t'Monte Dourado',\n\t'Gori',\n\t'Striano',\n\t'Barueri',\n\t'Tinogasta',\n\t'Santa Isabel do Rio Negro',\n\t'Kriftel',\n\t'Shiroishi',\n\t'Uaua',\n\t'Pinamalayan',\n\t'Sitalpur',\n\t'Las Matas de Santa Cruz',\n\t'Longchang',\n\t'Causeni',\n\t'Lajinha',\n\t'Sabbashahr',\n\t'Itacoatiara',\n\t'Mashan',\n\t'Trondheim',\n\t'Walsall Wood',\n\t'Lompoc',\n\t'Ibicuitinga',\n\t'Machang',\n\t'Babai',\n\t'Kobe',\n\t'Imsida',\n\t'Florida Ridge',\n\t'Antanambao Mahatsara',\n\t'Gudivada',\n\t'Apopka',\n\t'Bissau',\n\t'Itaete',\n\t'Shuiding',\n\t'Bratunac',\n\t'Beaconsfield',\n\t'Attnang-Puchheim',\n\t'Mennzel Bou Zelfa',\n\t'Dourados',\n\t'Obukhiv',\n\t'Lengede',\n\t'Riberalta',\n\t'Cafayate',\n\t'Bourem Inali',\n\t'Carapicuiba',\n\t'Orangevale',\n\t'La Homa',\n\t'Jaladurgam',\n\t'Gilarchat',\n\t'Reyhanli',\n\t'Durango',\n\t'Carros',\n\t'Hima',\n\t'Panthersville',\n\t'Arab',\n\t'Parasia',\n\t'Graca',\n\t'Metekora',\n\t'Harunabad',\n\t'Thonon-les-Bains',\n\t'Kodikulam',\n\t'Sarai Jattan',\n\t'Anderson Creek',\n\t'Gazulapalle',\n\t'Warrenton',\n\t'Qiman al `Arus',\n\t'Vaux-le-Penil',\n\t'Wuyi',\n\t'Calafell',\n\t'General Carneiro',\n\t'Sylvan Lake',\n\t'Onslow',\n\t'Sidi Amrane',\n\t'Heusden',\n\t'Yushan',\n\t'Kodakkal',\n\t'Dodvad',\n\t'Chaoshan',\n\t'San Jose de Urquico',\n\t'Rosmalen',\n\t'Sumilao',\n\t'Bharno',\n\t'Caversham',\n\t'Union Choco',\n\t'Annappes',\n\t'Angostura',\n\t'Nandasmo',\n\t'Ielmo Marinho',\n\t'Overland Park',\n\t'Umrapur',\n\t'Pirai do Sul',\n\t'Kumlu',\n\t'Kiyosu',\n\t'Paragaticherla',\n\t'Maayon',\n\t'Bardejov',\n\t'Masaka',\n\t'Maoming',\n\t'Santa Josefa',\n\t'Itarsi',\n\t'Prilep',\n\t'Pangil',\n\t'Kottapadi',\n\t'Central Falls',\n\t'Navarre',\n\t'Jatai',\n\t'Antsoantany',\n\t'Tiszavasvari',\n\t'Philadelphia',\n\t'Sundsvall',\n\t'Teapa',\n\t'Sansanne-Mango',\n\t'Itanhomi',\n\t'Upanema',\n\t'Longbridge',\n\t'Bryan',\n\t'Nueva Granada',\n\t'Malial',\n\t'Basud',\n\t'Kurichchi',\n\t'Pichidegua',\n\t'Amarante do Maranhao',\n\t'Kankol',\n\t'Tinajdad',\n\t'Amwa Majhar',\n\t'Pinetown',\n\t'Cherry Hill Mall',\n\t'Nangloi Jat',\n\t'Teopisca',\n\t'Bintuni',\n\t'Vengavasal',\n\t'Westmount',\n\t'Garmsar',\n\t'Sao Lourenco do Sul',\n\t'Duncan',\n\t'Kongarapalli',\n\t'Taounate',\n\t'Itapipoca',\n\t'Yungay',\n\t'Matalom',\n\t'Cartavio',\n\t'Bind',\n\t'Marck',\n\t'Galvarino',\n\t'Midvale',\n\t'Bangkok',\n\t'Tausa',\n\t'Gaoyou',\n\t'Balingen',\n\t'Wambrechies',\n\t'Pomerode',\n\t'Dolbeau',\n\t'Miyar',\n\t'Mahalapye',\n\t'Mandritsara',\n\t'Petrovske',\n\t'Mansa Konko',\n\t'Achern',\n\t'Malvern',\n\t'Veurne',\n\t'Tarauaca',\n\t'Sahna',\n\t'Patiram',\n\t'Nandurbar',\n\t'Nalwar',\n\t'Bahawalnagar',\n\t'Douar Ouled Ayad',\n\t'Guaitarilla',\n\t'Campo Mourao',\n\t'Sartana',\n\t'Yaojiazhuangcun',\n\t'Ma`raba',\n\t'Santo Tome',\n\t'Sapulpa',\n\t'Iasi',\n\t'Starkville',\n\t'Monte Cristi',\n\t'Youfangcun',\n\t'Vestal',\n\t'Shashemene',\n\t'Cambre',\n\t'Catonsville',\n\t'Honow',\n\t'Efkarpia',\n\t'West Caldwell',\n\t'Lianga',\n\t'Losser',\n\t'La Peche',\n\t'Kolea',\n\t'Avrig',\n\t'Mahatsinjony',\n\t'Sukhodilsk',\n\t'Le Bourget',\n\t'Sao Geraldo do Araguaia',\n\t'Palos Verdes Estates',\n\t'Millville',\n\t'Sao Miguel das Matas',\n\t'Saarbrucken',\n\t'Tres de Maio',\n\t'Sortobe',\n\t'Dhulia',\n\t'Pilate',\n\t'Itai',\n\t'Groot-Brakrivier',\n\t'Lemsid',\n\t'Cimarron Hills',\n\t'Boppard',\n\t'Shouguang',\n\t'Ares',\n\t'Aioun',\n\t'Catmon',\n\t'Kizilpinar',\n\t\"Ta' Xbiex\",\n\t'Zuzemberk',\n\t'Vicksburg',\n\t'Koppies',\n\t'Karaj',\n\t'Cherrapunji',\n\t'Qasr-e Shirin',\n\t'El Penol',\n\t'Bacuri',\n\t'Rozenburg',\n\t'Phusro',\n\t'Howard',\n\t'Masquefa',\n\t'Taisar',\n\t'Tirebolu',\n\t'Wallenhorst',\n\t'Pa',\n\t'Baghpat',\n\t'Woodburn',\n\t'Tonawanda',\n\t'Mparo',\n\t'Douar Lamrabih',\n\t'Avondale',\n\t'Arenys de Mar',\n\t'Anguillara Sabazia',\n\t'Alblasserdam',\n\t'Otukpo',\n\t'Chandera',\n\t'Rubino',\n\t'Boskoop',\n\t'Boujad',\n\t'Bijai',\n\t'Teotihuacan',\n\t'Choba',\n\t'Swellendam',\n\t'Wood Dale',\n\t'Motta di Livenza',\n\t'Modakkurichchi',\n\t'Rajahmundry',\n\t'Rio Formoso',\n\t'Shantipur',\n\t'Wolvega',\n\t'Ennigerloh',\n\t'Seydi',\n\t'Melvindale',\n\t'Shangcaiyuan',\n\t'Gooty',\n\t'Ituiutaba',\n\t'Dakota Ridge',\n\t'Langen',\n\t'Klaukkala',\n\t'Lessines',\n\t'Saraykoy',\n\t'Oshu',\n\t'Kac',\n\t'Nanan',\n\t'Mandvi',\n\t'Larbert',\n\t'Garalo',\n\t'Binningen',\n\t'Templeton',\n\t'Yejituo',\n\t'San Estanislao',\n\t'Lake Stevens',\n\t'Kothanuru',\n\t'Dhanaura',\n\t'Goba',\n\t'Kasba',\n\t'Hot Springs',\n\t'Tiruvalur',\n\t'Birzebbuga',\n\t'Morafeno',\n\t'Cruzilia',\n\t'Sao Bras de Alportel',\n\t'Balingoan',\n\t'Purisima de la Concepcion',\n\t'Augustinopolis',\n\t'Caloocan City',\n\t'Itubera',\n\t'Lublin',\n\t'Temoaya',\n\t'Sebdou',\n\t'Beclean',\n\t'Itamarandiba',\n\t'Bayramic',\n\t'Ban Lam Narai',\n\t'Sirsa',\n\t'Talaja',\n\t'Amberieu-en-Bugey',\n\t'Arilje',\n\t'Gorbea',\n\t'Zakopane',\n\t'Izium',\n\t'Masvingo',\n\t'Shulan',\n\t'Chester',\n\t'Shinozaki',\n\t'Rupahi',\n\t'Douar Ait Taleb',\n\t\"'Ain Boucif\",\n\t'San Gil',\n\t'Charters Towers',\n\t'Monovar',\n\t'Tierra Amarilla',\n\t'Toprakkale',\n\t'Pehcevo',\n\t'Cinfaes',\n\t'Lawang Bato',\n\t'Olinda',\n\t'Jiaoxi',\n\t'Bogatynia',\n\t'Bhawanipur Rajdham',\n\t'Jardin America',\n\t'Castelginest',\n\t'Herborn',\n\t'Cordeiro',\n\t'Dharmsala',\n\t'Gitega',\n\t'Vransko',\n\t'Pananaw',\n\t'Wettingen',\n\t'Deressia',\n\t'Secunderabad',\n\t'Queimada Nova',\n\t'Kollankulam',\n\t'Dharmaragar',\n\t'Beylaqan',\n\t'Lutsk',\n\t'Madinat as Sadat',\n\t'Shengping',\n\t'Yasu',\n\t'Hanmayingcun',\n\t'Ukiah',\n\t'Svilajnac',\n\t'Itoman',\n\t'Kathu',\n\t'Dugny',\n\t'Guanajuato',\n\t'Dreux',\n\t'Brovary',\n\t'Sicuani',\n\t'Hsenwi',\n\t'Manama',\n\t'Schleiden',\n\t'Kovancilar',\n\t'Tekkali',\n\t'Schlangen',\n\t'Zama',\n\t'Hostivice',\n\t'Calpulalpan',\n\t'Chalchihuitan',\n\t'Fondettes',\n\t'Messadine',\n\t'Duas Barras',\n\t'Alencon',\n\t'Cankiri',\n\t'Lake Zurich',\n\t'Bararam',\n\t'Nim ka Thana',\n\t'Woodlawn',\n\t'Contramaestre',\n\t'Monroe',\n\t'Kannod',\n\t'Ciechanow',\n\t'Kishunpur',\n\t'Haikou',\n\t'Fene',\n\t'Moree',\n\t'Rasulpur Dhuria',\n\t'Bowie',\n\t'Besiri',\n\t'Texistepec',\n\t'Langenau',\n\t'Nowra',\n\t'Metema',\n\t'Mokeri',\n\t'Kelibia',\n\t'Contamana',\n\t'Albergaria-a-Velha',\n\t'Paracuaro',\n\t'Kokshetau',\n\t'Campo Magro',\n\t'General Mariano Alvarez',\n\t'Stevenston',\n\t'Nagda',\n\t'Sliedrecht',\n\t'Kilmarnock',\n\t'Guantiankan',\n\t'Barira',\n\t'Dunn',\n\t'Portugalete',\n\t'Nizampatam',\n\t'Anse a Galets',\n\t'Louisville',\n\t'Policka',\n\t'Moita',\n\t'Sitanagaram',\n\t'Vrchlabi',\n\t'Greystones',\n\t'Kriel',\n\t'Guachochi',\n\t'Tuzla',\n\t'Juigalpa',\n\t'Paramonga',\n\t'Perali',\n\t'Idanha-a-Nova',\n\t'Ambilobe',\n\t'Kaga Bandoro',\n\t'Gilroy',\n\t'Nilavarappatti',\n\t'Tokat',\n\t'Miaojiaping',\n\t'Cascais',\n\t'Bilzen',\n\t'Malmo',\n\t'Tutong',\n\t'Tergnier',\n\t'Kalicherla',\n\t'Bishop Auckland',\n\t'Kyotamba',\n\t'Sonsonate',\n\t'Edmundston',\n\t'Ban Nong Tong',\n\t'Carnarvon',\n\t'Sloviansk',\n\t'Molave',\n\t'Kurobeshin',\n\t'Le Raincy',\n\t'Chinobod',\n\t'Alamnagar',\n\t'Kot Bhai',\n\t'Altenholz',\n\t'Esanai',\n\t'Kita-ku',\n\t'Lambidou',\n\t'Corumba',\n\t'North Providence',\n\t'Aulnoye-Aymeries',\n\t'Suifenhe',\n\t'Shar',\n\t'Vakfikebir',\n\t'Mudgee',\n\t'Vailoa',\n\t'Georgina',\n\t'Pachalum',\n\t'Al Fqih Ben Calah',\n\t'Lahti',\n\t'Eura',\n\t'Wolsztyn',\n\t'Santa Maria da Boa Vista',\n\t'Udipi',\n\t'Olgiate Olona',\n\t'Okinawa Numero Uno',\n\t'Albany',\n\t'Saint Sampson',\n\t'Bakel',\n\t'Governador Lindenberg',\n\t'Sannieshof',\n\t'Charlottetown',\n\t'Bidkhun',\n\t'Tenafly',\n\t'Dandarah',\n\t'Yunnanyi',\n\t'Mary',\n\t'Ouankoro',\n\t'Zhaicun',\n\t'Loboc',\n\t'Naduvannur',\n\t'Biedenkopf',\n\t'Jarash',\n\t'Yuanyangzhen',\n\t'Ashington',\n\t'Rufino',\n\t'Chodziez',\n\t'Heidenheim',\n\t'Aanekoski',\n\t'Puerto Tirol',\n\t'Attock Khurd',\n\t'Sihung',\n\t'Pennsville',\n\t'Vejen',\n\t'Sanford',\n\t'Loano',\n\t'West Deer',\n\t'Safsaf',\n\t'Collingswood',\n\t'East Setauket',\n\t'Sever do Vouga',\n\t'Savona',\n\t'Mayilur',\n\t'Bouchabel',\n\t'Mbarara',\n\t'Bersenbruck',\n\t'Bevonotra',\n\t'Linghai',\n\t'Aksay',\n\t'Santiago Tangamandapio',\n\t'Changshu',\n\t'Buckhurst Hill',\n\t'Yangchun',\n\t'Tumbao',\n\t'Mazagran',\n\t'Bussy',\n\t'Meerzorg',\n\t'Veys',\n\t'Peddapuram',\n\t'Wuwei',\n\t'Kongnolli',\n\t'Uar Esgudud',\n\t'Munxar',\n\t'Targu Secuiesc',\n\t'Zuvvaladinne',\n\t'Tombos',\n\t'Sanjianxiang',\n\t'Colonie',\n\t'Velakkuttai',\n\t'Haveri',\n\t'Machilipatnam',\n\t'Witbank',\n\t'Tierralta',\n\t'Blytheville',\n\t'Gorgan',\n\t'Pallapatti',\n\t'Sariq',\n\t'Fort Worth',\n\t'Hatonuevo',\n\t'Steinbach',\n\t'Anloga',\n\t'East Stroudsburg',\n\t'Rioverde',\n\t'Villa Castelli',\n\t'Hopa',\n\t'Knysna',\n\t'Koumassi',\n\t'Pampierstad',\n\t'Agawam',\n\t'Utrera',\n\t'Oggaz',\n\t'Wadgira',\n\t'Pagqen',\n\t'Mizdah',\n\t'Bni Tajjit',\n\t'Douar Snada',\n\t'Sandy Springs',\n\t'Louviers',\n\t'Mamak',\n\t'Rimouski',\n\t'Giddarbaha',\n\t'Ittiva',\n\t'Pedro Luro',\n\t'Kerepestarcsa',\n\t'Shohimardon',\n\t'Santa Ana',\n\t'La Sierra',\n\t'Diguapo',\n\t'Soio',\n\t'Saint-Jean-de-Luz',\n\t'Illkirch-Graffenstaden',\n\t'Saint-Pierre-des-Corps',\n\t'Aivanallur',\n\t'Rio Piracicaba',\n\t'Kompalle',\n\t'Chiayi',\n\t'Rostraver',\n\t'Flossmoor',\n\t'Frunze',\n\t'General Roca',\n\t'Aglipay',\n\t'Nussloch',\n\t'Yakinca',\n\t'Kattupputtur',\n\t'Kolkata',\n\t'Bo',\n\t'San Antonio del Tachira',\n\t'Patrocinio',\n\t'Cuvelai',\n\t'Duarte',\n\t'Panetha',\n\t'Cave',\n\t'Lahore',\n\t'Maijdi',\n\t'Janhapara',\n\t'Tondi',\n\t'Al Hamalah',\n\t'Ludhiana',\n\t'El Hammadia',\n\t'Ejura',\n\t'Antsalova',\n\t'Fiadanana',\n\t'Nedumana',\n\t'Novo Aripuana',\n\t'Qufadah',\n\t'Igreja',\n\t'Punganuru',\n\t'Ranigaon',\n\t'Presidente Kennedy',\n\t'Pedda Kotayalanka',\n\t'Loudoun Valley Estates',\n\t'Vezirkopru',\n\t'Dronfield',\n\t'Ugo',\n\t'Obburdon',\n\t'Camiling',\n\t'Cermik',\n\t'Ampatuan',\n\t'Alangulam',\n\t'Candler-McAfee',\n\t'Behenjy',\n\t'Talanga',\n\t'Garissa',\n\t'Mbandaka',\n\t'Senboku',\n\t'Banganapalle',\n\t'Pedreiras',\n\t'Loreto',\n\t'Elias Fausto',\n\t'Columbia',\n\t'Sao Ludgero',\n\t'Revelganj',\n\t'Uhersky Brod',\n\t'Feira Grande',\n\t'Norten-Hardenberg',\n\t'Omura',\n\t'Wilcannia',\n\t'Bishopbriggs',\n\t'Dandoli',\n\t'Satna',\n\t'Palni',\n\t'Elda',\n\t'Bakhtiyarpur',\n\t'Kara-Tash',\n\t'Holden',\n\t'Kodumba',\n\t'Udayendram',\n\t'Wangjiaxian',\n\t'Ragusa',\n\t'Pijijiapan',\n\t'Muret',\n\t'Feldkirchen-Westerham',\n\t'Ineu',\n\t'Smithtown',\n\t'Incesu',\n\t'Svay Rieng',\n\t'Bhucho Mandi',\n\t'Mukaiengaru',\n\t'Maiquetia',\n\t'Manglaur',\n\t'Centennial',\n\t'Bonfinopolis',\n\t'Cova Figueira',\n\t'Ianca',\n\t'Mahesana',\n\t'San Francisco de Mostazal',\n\t'Langenfeld',\n\t'Buchholz in der Nordheide',\n\t'Coutras',\n\t'Grigiskes',\n\t'Biswan',\n\t'Perumbalai',\n\t'Shujalpur',\n\t'Ciudad Manuel Doblado',\n\t'Tunzi',\n\t'Great Harwood',\n\t'Andhra Tharhi',\n\t'Toudja',\n\t'Ramsar',\n\t'Gaesti',\n\t'Champigny-sur-Marne',\n\t'Ash Shaddadah',\n\t'Santaquin',\n\t'Quilpie',\n\t'Tubay',\n\t'Babylon',\n\t'Pualas',\n\t'Johi',\n\t'Sahaspur',\n\t'Padiham',\n\t'Busto Garolfo',\n\t'Kamatero',\n\t'Miary',\n\t'Ialysos',\n\t'Seydisehir',\n\t'Morgan Hill',\n\t'Malard',\n\t'Kafr ad Dawwar',\n\t'Sancoale',\n\t'Sakata',\n\t'Jinoba-an',\n\t'Sorgues',\n\t'Sumedang',\n\t'Sanrh Majhgawan',\n\t'Dalanzadgad',\n\t'Chundal',\n\t'Piombino',\n\t'Port Harcourt',\n\t'Goyang',\n\t'Puntarenas',\n\t'Gaszowice',\n\t'Santa Rosa de Copan',\n\t'Carmo da Cachoeira',\n\t'Bargersville',\n\t'Beius',\n\t'Stony Brook University',\n\t'Razlog',\n\t'Spenge',\n\t'Ban Mae Kha Tai',\n\t'Chilpur',\n\t'Pacific Grove',\n\t'Kalyan',\n\t'Balmazujvaros',\n\t'Hortolandia',\n\t'Pataili',\n\t'San Agustin de las Juntas',\n\t'Sao Felix do Xingu',\n\t'Prior Lake',\n\t'Puzol',\n\t'Udumanthala',\n\t'Novopskov',\n\t'Auerbach',\n\t'Zarate',\n\t'Makuyu',\n\t'Ertvelde',\n\t'Kommuru',\n\t'Manari',\n\t'Belonia',\n\t'Immokalee',\n\t'Kuiyibagecun',\n\t'Ascoli Piceno',\n\t\"Cassina de' Pecchi\",\n\t'Sousa',\n\t'Alhaurin de la Torre',\n\t'Djidian Kenieba',\n\t'Los Rios',\n\t'Castel Goffredo',\n\t'Resana',\n\t'Rehli',\n\t'Puerto Boyaca',\n\t'Bandar-e Anzali',\n\t'Martha Lake',\n\t'Chopinzinho',\n\t'Friedrichsdorf',\n\t'La Granja',\n\t'San Agustin Loxicha',\n\t'Platteville',\n\t'Dighaun',\n\t'Mebane',\n\t'Pavumba',\n\t'Epinay-sur-Seine',\n\t'Alfredo Wagner',\n\t'Singen',\n\t'El Asintal',\n\t'Sankrail',\n\t'Nghi Son',\n\t'Pithoragarh',\n\t'Pudunagaram',\n\t'Tsuchiura',\n\t'Jhundpura',\n\t'Itapecuru Mirim',\n\t'Naranjal',\n\t'Pinneberg',\n\t'Schnaittach',\n\t'Penco',\n\t'Oissel',\n\t'Dungra Chhota',\n\t'Amudat',\n\t\"Qo'shko'pir\",\n\t'Pachahi',\n\t'Sufian',\n\t'Haguenau',\n\t'Mansapur',\n\t'Discovery Bay',\n\t\"'Ain Leuh\",\n\t'Tabernes de Valldigna',\n\t'Medvode',\n\t'Sillamae',\n\t'Baker City',\n\t'Gllogovc',\n\t'Dhrangadhra',\n\t'Homosassa Springs',\n\t'Outreau',\n\t'Beni',\n\t'Meltonakkal',\n\t'Mango',\n\t'San Pedro Jocopilas',\n\t'Roodepoort',\n\t'Unterhaching',\n\t'Ibiruba',\n\t'San Bernardo',\n\t'Marhanets',\n\t'Itapitanga',\n\t'Sivalarkulam',\n\t'Maguing',\n\t'Lianran',\n\t'Smila',\n\t'Forrest City',\n\t'Lumino',\n\t'Qingzhou',\n\t'Bajina Basta',\n\t'Bruggen',\n\t'Tapiramuta',\n\t'Ganga Sagar',\n\t'Hvardiiske',\n\t'Capitao Poco',\n\t'Carranglan',\n\t'Ekpe',\n\t'Camana',\n\t'Choyr',\n\t'Tullahoma',\n\t'Bothell',\n\t'Livadeia',\n\t'Samarate',\n\t'Brixham',\n\t'Anororo',\n\t'Ypejhu',\n\t'Bradford-on-Avon',\n\t'Wigston Magna',\n\t'Acigol',\n\t'Puerto Salgar',\n\t'Benicia',\n\t'Fundeni',\n\t'Dioumanzana',\n\t'Chellalat el Adhaouara',\n\t'Zonhoven',\n\t'Vellar',\n\t'Sceaux',\n\t'Luuka Town',\n\t'Kristiansand',\n\t'Ripley',\n\t'Lutry',\n\t'Gurabo al Medio',\n\t'Sepidan',\n\t'Chubbuck',\n\t'Harding',\n\t'Rogatica',\n\t'Maple Valley',\n\t'Qal`at Bishah',\n\t'Boladi',\n\t'Terlizzi',\n\t'Morriston',\n\t'Jaslo',\n\t'Mendrisio',\n\t'Valangiman',\n\t'Medveda',\n\t'Barton upon Humber',\n\t'Sauk Village',\n\t'Dison',\n\t'Little Bookham',\n\t'Marlton',\n\t'Harhorin',\n\t'Rampur Kalan',\n\t'Trofa',\n\t'Gatesville',\n\t'Etchojoa',\n\t'Baichigan',\n\t'New Hartford',\n\t'Charleville-Mezieres',\n\t'Anna',\n\t'Unchahra',\n\t'Porto de Mos',\n\t'Ambhua',\n\t'Al Minya',\n\t'Morro do Chapeu',\n\t'Saintard',\n\t'Bukwo',\n\t'Kawartha Lakes',\n\t'Badr Hunayn',\n\t'Valley Cottage',\n\t'Duxbury',\n\t'Baipingshan',\n\t'Fuente de Oro',\n\t'Nayudupet',\n\t'Zhexiang',\n\t'Khagra',\n\t'Sarakhs',\n\t'Saint-Pierre-du-Mont',\n\t'Urumqi',\n\t'Vannivedu',\n\t'Cesano Maderno',\n\t'Juarez',\n\t'Neuruppin',\n\t'Dig',\n\t'Momil',\n\t'Gondal',\n\t'Torres Novas',\n\t'Akkattettar',\n\t'Dourbali',\n\t'Ondo',\n\t'Monjas',\n\t'Mechernich',\n\t'Arlit',\n\t'Mandelieu-la-Napoule',\n\t'Murska Sobota',\n\t'Daean',\n\t'Kalaleh',\n\t'Bamei',\n\t'Myingyan',\n\t'Lingquan',\n\t'Pescia',\n\t'Malloussa',\n\t'El Attaf',\n\t'Panmana',\n\t'Caqueza',\n\t'Moulay Bousselham',\n\t'Pathein',\n\t'Reha Mota',\n\t'Florencio Varela',\n\t'Al Lataminah',\n\t'Azogues',\n\t'Jhandapur',\n\t'Verucchio',\n\t'Subachoque',\n\t'Solila',\n\t\"Rava-Rus'ka\",\n\t'Witu',\n\t'Gander',\n\t'General Pico',\n\t'Tongluo',\n\t'Serinhisar',\n\t\"Fiorenzuola d'Arda\",\n\t'Vadamadurai',\n\t'Bayou Cane',\n\t'Plunge',\n\t'Quakertown',\n\t\"Limeira d'Oeste\",\n\t'Qulan',\n\t'Agramonte',\n\t'Jamunamukh',\n\t'Gondomar',\n\t'Lajas',\n\t'Quinapundan',\n\t'Kurten',\n\t'Coremas',\n\t'Mafra',\n\t'Pinewood',\n\t'Linguere',\n\t'Miradouro',\n\t'Baganga',\n\t'Pauini',\n\t'Trebur',\n\t'Bollnas',\n\t'Romulus',\n\t'Banire Kore',\n\t'Legnaro',\n\t'Manatanna',\n\t'Deruta',\n\t'Finestrat',\n\t'Chico',\n\t'Mankono',\n\t'Pimentel',\n\t'Umirim',\n\t'Velanganni',\n\t'Natchitoches',\n\t'Kanungu',\n\t'West Palm Beach',\n\t'Caraballeda',\n\t'Tha Bo',\n\t'Nishio',\n\t'Bragado',\n\t'Palopo',\n\t'Concorezzo',\n\t'Nagla',\n\t'Nobres',\n\t'Sagada',\n\t'Bayona',\n\t'Cheat Lake',\n\t'Zion',\n\t'Kochi',\n\t'Cho Lach',\n\t'Sannicandro di Bari',\n\t'Pelotas',\n\t'Selb',\n\t'Sugarmill Woods',\n\t'Oatlands',\n\t'Basoda',\n\t'Lakewood Ranch',\n\t'Tenango del Aire',\n\t'Tulkarm',\n\t'Bella Union',\n\t'Heath',\n\t'Massaranduba',\n\t'Higashikagawa',\n\t'Barra do Choca',\n\t'Bolivar',\n\t'Aguacatan',\n\t'Yakacik',\n\t'Alexander Bay',\n\t'Dehri',\n\t'Mehnatobod',\n\t'Thol',\n\t'Burkburnett',\n\t'Sanarate',\n\t'Pollokshaws',\n\t'Sencur',\n\t'Zhanjiang',\n\t'San Pedro Ixcatlan',\n\t'Le Pre-Saint-Gervais',\n\t'Jamunia',\n\t'Opol',\n\t'Ambalajia',\n\t'Penola',\n\t'Mangindrano',\n\t'Oued el Alleug',\n\t'Marai Kalan',\n\t'Zatec',\n\t'Southern Cross',\n\t'San Luis de la Paz',\n\t'Omihachiman',\n\t'Illapel',\n\t'Tsianisiha',\n\t'Siteia',\n\t'McFarland',\n\t'Nova Resende',\n\t'Rheinfelden',\n\t'Mubi',\n\t'Ourika Wawrmas',\n\t'Quinte West',\n\t'Korce',\n\t'Kalanaur',\n\t'Dhulian',\n\t'Balen',\n\t'Auterive',\n\t'Wronki',\n\t'Budha Theh',\n\t'Quy Nhon',\n\t'Cedro',\n\t'Garlasco',\n\t'Biharamulo',\n\t'Chateaurenard',\n\t'General Cabrera',\n\t'Gostynin',\n\t'Ad Diraz',\n\t'Asau',\n\t'Oceanside',\n\t'Longmont',\n\t'Nanzhuang',\n\t'Satadougou',\n\t\"Saint-Barthelemy-d'Anjou\",\n\t'Owariasahi',\n\t'Zombo',\n\t'Dudley',\n\t'San Agustin Acasaguastlan',\n\t'Lochem',\n\t'Nidderau',\n\t'Devarkonda',\n\t'Leven',\n\t'Munchberg',\n\t'Mariani',\n\t'Cornillon',\n\t'Svidnik',\n\t'Heek',\n\t'Chak Thirty-six North Branch',\n\t'Tholey',\n\t'Charsadda',\n\t'Restinga Seca',\n\t'Villeneuve-Tolosane',\n\t'Profondeville',\n\t'Amla',\n\t'Ludwigslust',\n\t'Caterham',\n\t'Al Ghardaqah',\n\t'Mineral de la Reforma',\n\t'Kosice',\n\t'Sehnde',\n\t'Imam Qasim',\n\t'Ain El Aouda',\n\t'Candido Mendes',\n\t'Hacari',\n\t'Massafra',\n\t'Vittal',\n\t'Koh Kong',\n\t'Stockach',\n\t\"Saint Paul's Bay\",\n\t'Tieshansi',\n\t'Xinyi',\n\t'Rawanduz',\n\t'Nanyuki',\n\t'Sarpamari',\n\t'Tres Coracoes',\n\t'Narutocho-mitsuishi',\n\t'Cukai',\n\t'Douchy-les-Mines',\n\t'Mandirituba',\n\t'Imouzzer Kandar',\n\t'Oulad Teima',\n\t'Lere',\n\t'Kanavaypudur',\n\t'Naugaon Sadat',\n\t'Bonnyrigg',\n\t'Charthawal',\n\t'Znojmo',\n\t'Cankova',\n\t'Tondo',\n\t'Badhan',\n\t\"Wu'an\",\n\t'North Bellport',\n\t'Ambatosoratra',\n\t'Naduvattam',\n\t'Columbia Heights',\n\t'Neustadt am Rubenberge',\n\t'Maturin',\n\t'Ehringshausen',\n\t'Dandkhora',\n\t'Xinzhai',\n\t'Winter Gardens',\n\t'Bayur',\n\t'Dame-Marie',\n\t'Saco',\n\t'Metsemotlhaba',\n\t'Apen',\n\t'Nuevo Laredo',\n\t'Cofimvaba',\n\t'Miryal',\n\t'Shuangluan',\n\t'Thorold',\n\t'Zagarolo',\n\t'Wenling',\n\t'Dengtalu',\n\t'Oharu',\n\t'Sumoto',\n\t'Osmaniye',\n\t'Aquiraz',\n\t'Bury Saint Edmunds',\n\t'Nacajuca',\n\t'Baao',\n\t'Velbert',\n\t'Pyskowice',\n\t'North Platte',\n\t'Prostejov',\n\t'Paradise',\n\t'Newington Forest',\n\t'Gonghaur',\n\t'Rawicz',\n\t'Lamsabih',\n\t'Zaoqiao',\n\t'Chaoke',\n\t'Renala Khurd',\n\t'Saint-Sulpice-la-Pointe',\n\t'Kerkrade',\n\t'Glen Cove',\n\t'Cottbus',\n\t'Laurens',\n\t'Mont-Laurier',\n\t'Omalur',\n\t'Loum',\n\t'An Nu`maniyah',\n\t'Allende',\n\t'Jagdispur',\n\t'Bourgoin-Jallieu',\n\t'Icapui',\n\t'Niiza',\n\t'Disa',\n\t'Rhynern',\n\t'Mata',\n\t'Straubing',\n\t'Kingsnorth',\n\t'Esch-sur-Alzette',\n\t'Moyobamba',\n\t'Flores Costa Cuca',\n\t'Vetlanda',\n\t'Hengbei',\n\t'Hatillo de Loba',\n\t'Conway',\n\t'Ashta',\n\t'Diphu',\n\t'Sutculer',\n\t'Bad Worishofen',\n\t'Mahta',\n\t'Umm Qurun',\n\t'Strongsville',\n\t'Kamidani',\n\t'Playa del Carmen',\n\t'Moralzarzal',\n\t'Lauffen am Neckar',\n\t'Kelishad va Sudarjan',\n\t'Cocentaina',\n\t'Harrislee',\n\t'Sojat',\n\t'Mahallat Damanah',\n\t'South Frontenac',\n\t'Ban Phan Chali',\n\t'San Sebastian Coatan',\n\t'Diego Martin',\n\t'Thai Nguyen',\n\t'Pewaukee',\n\t'Ifanadiana',\n\t'Asjen',\n\t'Mankachar',\n\t'Apparaopeta',\n\t'DeRidder',\n\t'Orleans',\n\t'Nagojanahalli',\n\t'Peddavadlapudi',\n\t'Dadrewa',\n\t'Sagure',\n\t'Natal',\n\t'Shirakawa',\n\t'Calera de Tango',\n\t'Sahbuz',\n\t'Rodeio',\n\t'Shaying',\n\t'Sakoabe',\n\t'Ramabhadrapuram',\n\t'Kararan',\n\t'Zolote',\n\t'El Espinal',\n\t'Laverton',\n\t'Ramgarha',\n\t'Sant Julia de Loria',\n\t\"Sant'Agnello\",\n\t'Lidzbark Warminski',\n\t'Shu',\n\t'Pweto',\n\t'Burscough',\n\t\"Foum Jam'a\",\n\t'Hua Hin',\n\t'Marovato',\n\t'Gangapatnam',\n\t'Rijeka',\n\t'Jihong',\n\t'Seacombe',\n\t'Friendswood',\n\t'Estreito de Camara de Lobos',\n\t'Loei',\n\t'Dan',\n\t'Jerez de Garcia Salinas',\n\t'Pukhrayan',\n\t'Choma',\n\t'Tlapa de Comonfort',\n\t'Catbalogan',\n\t'Boudenib',\n\t'Paraparaumu Beach',\n\t'East Lansing',\n\t'Stradella',\n\t'Tenali',\n\t'Irungalur',\n\t'Hollymead',\n\t'Farap',\n\t'Pitesti',\n\t'Muzambinho',\n\t'La Mesa',\n\t'Mulki',\n\t'Bruck an der Mur',\n\t'Gongguan',\n\t'Vayalar',\n\t'Freiberg am Neckar',\n\t'Passa e Fica',\n\t'Myrhorod',\n\t'Mutoko',\n\t'Warwick',\n\t'Shanmukhasundarapuram',\n\t'Koscian',\n\t'Nanyangcun',\n\t'Patton',\n\t'Grimes',\n\t'Vempatti',\n\t'Smizany',\n\t'Chipinge',\n\t'Miyota',\n\t'Villajoyosa',\n\t'Almoloya del Rio',\n\t\"'Ali Ben Sliman\",\n\t'Brodosqui',\n\t'Vikrutamala',\n\t'Valatt',\n\t'Aparecida',\n\t'Guskhara',\n\t'Oke-Mesi',\n\t'Roche-la-Moliere',\n\t'Sentrupert',\n\t'Buraan',\n\t'Kisii',\n\t'Lohardaga',\n\t'Angleton',\n\t'Quakenbruck',\n\t'Bystrzyca Klodzka',\n\t'Ippagudem',\n\t'Lunner',\n\t'Almora',\n\t'Hasilpur',\n\t'Agiripalle',\n\t'Parys',\n\t'Loningen',\n\t'King City',\n\t'Suitland',\n\t'Bathnaha',\n\t'Gachancipa',\n\t'Bad Bentheim',\n\t'Fuyang',\n\t'Federal Heights',\n\t'Vallirana',\n\t'Manandroy',\n\t'Varidhanam',\n\t'Valreas',\n\t'Konstanz',\n\t'Hissaramuruvani',\n\t'Uripa',\n\t'Kimbe',\n\t'Medina Sidonia',\n\t'Tarragona',\n\t'Antindra',\n\t'Montana',\n\t'Cervignano del Friuli',\n\t'Hezuo',\n\t'Puerto Escondido',\n\t'Salto de Pirapora',\n\t'Gaobeidian',\n\t'Chak Husaini',\n\t'Grajales',\n\t'Lykovrysi',\n\t'Ankatafa',\n\t'Sbiba',\n\t'Matanog',\n\t'Sikka',\n\t'Avsallar',\n\t'Sarykemer',\n\t'Lighthouse Point',\n\t'Fatehpur Sikri',\n\t'Lakhminia',\n\t'Nagari',\n\t'Ansongo',\n\t'Bad Nauheim',\n\t'Trostberg an der Alz',\n\t'Mogila',\n\t'Mahrail',\n\t'Mouans-Sartoux',\n\t'Hude',\n\t'Lazi',\n\t'Berkhampstead',\n\t'Nehram',\n\t'Fussa',\n\t'Waipahu',\n\t'Dawei',\n\t'Haldia',\n\t'Olten',\n\t'Apastepeque',\n\t'Krzeszowice',\n\t'Koini',\n\t'Douar Messassa',\n\t'Lima',\n\t'Honcho',\n\t'Mulchen',\n\t'Acheres',\n\t'Harper Woods',\n\t'Tlacoachistlahuaca',\n\t'Baikonur',\n\t'De Bilt',\n\t'Vianden',\n\t'Arnold',\n\t'Bhabhua',\n\t'Al Ghizlaniyah',\n\t'Chakur',\n\t'Jixi',\n\t'Kibiti',\n\t'Viechtach',\n\t'Comalcalco',\n\t'Westfield',\n\t'Uacu Cungo',\n\t'Camargo',\n\t'San Juan del Rio del Centauro del Norte',\n\t'Bebington',\n\t'Largs',\n\t'Sompeta',\n\t'Ipsala',\n\t'Pola de Laviana',\n\t'Jose Maria Morelos',\n\t'Wasserburg am Inn',\n\t'Al Hawiyah',\n\t'Kilrajakularaman',\n\t'Chak Sixty-one Gugera Branch',\n\t'Jafaro',\n\t'Yattir',\n\t'Piura',\n\t'Dachau',\n\t'Bom Jesus dos Perdoes',\n\t'Itacare',\n\t'Delcevo',\n\t'Negombo',\n\t'Tenedla',\n\t'Amadora',\n\t'At-Bashy',\n\t'Fort Collins',\n\t'Amuria',\n\t'Vicuna',\n\t'Dahu',\n\t'Eloy Alfaro',\n\t'Beaumont',\n\t'Lloro',\n\t'Vinh Long',\n\t'Padiyanallur',\n\t'Tobruk',\n\t'Pazar',\n\t'Bideipur',\n\t'Magdalena de Kino',\n\t'Parla',\n\t'Kanuma',\n\t'Quatro Barras',\n\t'Chikusei',\n\t'Panambi',\n\t'Arecibo',\n\t'Bekatra Maromiandra',\n\t'Ahus',\n\t'Tilingzhai',\n\t'Hanahan',\n\t'Lunbei',\n\t'Majhua',\n\t'Bad Segeberg',\n\t'Holywell',\n\t'Tivim',\n\t'El Charco',\n\t'Mailiao',\n\t'Chenlu',\n\t'Beylul',\n\t'Camarajibe',\n\t'Le Puy-en-Velay',\n\t'Santander de Quilichao',\n\t'Nakasongola',\n\t'Shabestar',\n\t'Lindau',\n\t'Hathaura',\n\t\"Ayt 'Attou ou L'Arbi\",\n\t'Fiuggi',\n\t'Dhekiajuli',\n\t'Shuyangzha',\n\t'Tokoroa',\n\t'Chaozhou',\n\t'Durres',\n\t'Old Jamestown',\n\t'Chimbote',\n\t'Ivanovka',\n\t'Silver Firs',\n\t'Santa Ana Nextlalpan',\n\t'Ourtzagh',\n\t'Lysa nad Labem',\n\t'Hirakata',\n\t'Udine',\n\t'Andrelandia',\n\t'Seysses',\n\t'Atami',\n\t'Woudrichem',\n\t'Brzeszcze',\n\t'Zhangping',\n\t'Rolante',\n\t'Mabai',\n\t'Varatanapalli',\n\t'Catak',\n\t'Mahabaleshwar',\n\t'Galgamuwa',\n\t'Kelso',\n\t'Esquipulas',\n\t'Seoni Malwa',\n\t'Laboulaye',\n\t'Winter Haven',\n\t'Jimaguayu',\n\t'Rury',\n\t'Lubbenau/Spreewald',\n\t'Dijiasuoxiang',\n\t'Wielsbeke',\n\t'Pagani',\n\t'Kizhur',\n\t'San Carlos City',\n\t'Chaudfontaine',\n\t'Camacupa',\n\t'Celina',\n\t'Roudnice nad Labem',\n\t'Rajni',\n\t'Umm Ruwaba',\n\t'Harir',\n\t'Suwasra',\n\t'Rio Casca',\n\t'Bry-sur-Marne',\n\t'Fleron',\n\t'Minamikyushu',\n\t'Tsallagundla',\n\t'Bashtanka',\n\t'Soresina',\n\t'Sogut',\n\t'Parkersburg',\n\t'Artesia',\n\t'Barka Parbatta',\n\t'San Carlos de Guaroa',\n\t'Abreus',\n\t'Sarsai Nawar',\n\t'Saint-Marc',\n\t'George',\n\t'Kamamaung',\n\t'Bayburt',\n\t'Narsampet',\n\t'As Sidrah',\n\t'Menasha',\n\t'Aberaman',\n\t'Irikkur',\n\t'Herning',\n\t'Apeldoorn',\n\t'El Campo',\n\t'Thakhek',\n\t'Karanjia',\n\t'Maullin',\n\t'Druten',\n\t'Mundra',\n\t'Paveh',\n\t'Carovigno',\n\t'Jodar',\n\t'Montevarchi',\n\t'LaGrange',\n\t'Masanasa',\n\t'Maddela',\n\t'Chicago',\n\t'Kamayakkavundanpatti',\n\t'Xiangyang',\n\t'Leizhou',\n\t'Atner',\n\t'Siderno Marina',\n\t'Agra',\n\t'Shin-Kamigoto',\n\t'Anenecuilco',\n\t'Sejenane',\n\t'Paletwa',\n\t'Pantanaw',\n\t'Senec',\n\t'Messaad',\n\t'Brielle',\n\t'Cangxi',\n\t'Dagarua',\n\t'Kingston South East',\n\t'Allestree',\n\t'Oslob',\n\t'Bolsover',\n\t'Grand Turk',\n\t'Bohodukhiv',\n\t'Boulogne-sur-Mer',\n\t'Kyotanabe',\n\t'Coimbatore',\n\t'Jinshi',\n\t'Ornskoldsvik',\n\t'Woonsocket',\n\t'Buhusi',\n\t'Villanueva de la Canada',\n\t'Karugamad',\n\t'Jumla',\n\t'Pueblo Nuevo Vinas',\n\t'Tres de Mayo',\n\t'Sal Rei',\n\t'Valkeakoski',\n\t'Kungsangen',\n\t'Zulte',\n\t'Kerewan',\n\t'Tabango',\n\t'Naha',\n\t'Akkus',\n\t'Tulcea',\n\t'Moratuwa',\n\t'Utsunomiya',\n\t'Noeux-les-Mines',\n\t'Los Barrios',\n\t'Agadi',\n\t'Hlohovec',\n\t'Gages Lake',\n\t'Tiverton',\n\t'Golmarmara',\n\t'Puszczykowo',\n\t'Mangabe',\n\t'Hohr-Grenzhausen',\n\t'Zango',\n\t'Cua Lo',\n\t'Mansalay',\n\t'Leverano',\n\t'Yanahuanca',\n\t'Sinaia',\n\t'Gudluru',\n\t'Vadugapatti',\n\t'Ban Tha Phra',\n\t'Kikwit',\n\t'Cantagalo',\n\t\"Yan'an Beilu\",\n\t'Tampakan',\n\t'Glanerbrug',\n\t'Copalchi',\n\t'Zacualtipan',\n\t'Fidenza',\n\t'Tsararano',\n\t'Ferguson',\n\t'Renukut',\n\t'Sao Sebastiao do Cai',\n\t'Mainburg',\n\t'Ceres',\n\t'Uluberiya',\n\t'Mauji',\n\t'Telfs',\n\t'Cachoeira dos Indios',\n\t'Triunfo',\n\t'Mittegrossefehn',\n\t'Murehwa',\n\t'Velika Polana',\n\t'Borgosesia',\n\t'Shichuanxiang',\n\t'Befandefa',\n\t'Pilar do Sul',\n\t'Quimper',\n\t'Saeby',\n\t'Netanya',\n\t'Peri-Mirim',\n\t'Tidjelabine',\n\t'Tecolutla',\n\t'Anakaputtur',\n\t'Quipapa',\n\t'Dikili',\n\t'Yuma',\n\t'Parakadavu',\n\t'Oxapampa',\n\t'Odense',\n\t'Tanambao-Daoud',\n\t'Bussum',\n\t'Dartford',\n\t'Bilaua',\n\t'Stoughton',\n\t'Alcanena',\n\t'Cloverleaf',\n\t'Akambadam',\n\t'Anomabu',\n\t'Lo Barnechea',\n\t\"Wen'anyi\",\n\t'Port Orchard',\n\t'Ahuachapan',\n\t'Horta',\n\t'Bourg-de-Peage',\n\t'Neuville-les-Dieppe',\n\t'Walton upon Thames',\n\t'Jaguaquara',\n\t'Koshigaya',\n\t'Wendeburg',\n\t'Tall Shihab',\n\t'Tounfafi',\n\t'Al Hamah',\n\t'Mostar',\n\t'Illizi',\n\t'Khaspur',\n\t'Sirvan',\n\t'Lapu-Lapu City',\n\t'Sint-Gillis-Waas',\n\t'Cassongue',\n\t'Beahitse',\n\t'Virapalle',\n\t'Geislingen an der Steige',\n\t'Bogalusa',\n\t'Stavanger',\n\t'Jiaji',\n\t'Kannapuram',\n\t'Bamukumbit',\n\t'Maroua',\n\t'Correggio',\n\t'Bikkavolu',\n\t'Kumaranallur',\n\t'Guinagourou',\n\t'Salonta',\n\t'Zhutang',\n\t'Tamarankottai',\n\t'Tzucacab',\n\t'Gurais',\n\t'Taichung',\n\t'Oas',\n\t'Anjukulippatti',\n\t'Melchor Ocampo',\n\t'Nochistlan de Mejia',\n\t'Victor',\n\t'Limeira',\n\t'Chalfont Saint Peter',\n\t'La Marsa',\n\t'Cullinan',\n\t'Shimeo',\n\t'Neuhof',\n\t'Kannulu',\n\t'Daganbhuiya',\n\t'Antigua Guatemala',\n\t'Bowmanville',\n\t'Zemoura',\n\t'Tyele',\n\t'Cedartown',\n\t'Kingsland',\n\t'Toyomamachi-teraike',\n\t'Bni Khloug',\n\t'Montargis',\n\t'Sarasambo',\n\t'Aurora',\n\t'Nilka',\n\t'Siena',\n\t'Santa Vitoria',\n\t'Goz-Beida',\n\t'Murray',\n\t'Hennaya',\n\t'Santa Isabel Cholula',\n\t'Bellamkonda',\n\t'Andasibe',\n\t'Quvasoy',\n\t'Villa Park',\n\t'Thaon-les-Vosges',\n\t'Acri',\n\t'Limbdi',\n\t'Kaisariani',\n\t'Coconut Creek',\n\t'Kitakoriyamacho',\n\t'Gaggenau',\n\t'Newmarket',\n\t'Grombalia',\n\t'Dogansehir',\n\t'Chinsali',\n\t'Moisei',\n\t'La Vallee de Jacmel',\n\t'Kadamalaikkundu',\n\t'Wagga Wagga',\n\t'Sonthofen',\n\t'Sukkur',\n\t'Zhaozhou',\n\t'Boshruyeh',\n\t'Macara',\n\t'Cheongju',\n\t'Nisko',\n\t'Meftah',\n\t'Amilly',\n\t'Ageoshimo',\n\t'Butzbach',\n\t'Giria',\n\t'Sultonobod',\n\t'Sucua',\n\t'Keregodu',\n\t'Dudhgaon',\n\t'Chalma',\n\t'Pierre-Benite',\n\t'Oberriet',\n\t'Tramandai',\n\t'Shiggaon',\n\t'Whitestown',\n\t'Zaqatala',\n\t'Zaboli',\n\t'Houston',\n\t'Sorab',\n\t'Enkhuizen',\n\t'Kaniwara',\n\t'Sare-Yamou',\n\t'Kriens',\n\t'Petersburg',\n\t'Rawah',\n\t'Montenegro',\n\t'Boorama',\n\t'Gangawati',\n\t'Manjuyod',\n\t'Argostoli',\n\t'Clarksburg',\n\t'Fall River',\n\t'Boffa',\n\t'Sodag',\n\t'Hingyon',\n\t'Kanding',\n\t'Gresham',\n\t'Peruru',\n\t'Kemigawa',\n\t'Manbazar',\n\t'Capitol Hill',\n\t'Bo`z',\n\t'Murshidabad',\n\t'Resplendor',\n\t'Baishi Airikecun',\n\t'Bulancak',\n\t'Aibonito',\n\t'East Islip',\n\t'Mengibar',\n\t'Kotwapatti Rampur',\n\t'Qaryat al Qi`an',\n\t'Estiva Gerbi',\n\t'Sipalay',\n\t'Mandrosohasina',\n\t'Hadera',\n\t'Partick',\n\t'Pulawy',\n\t'Lobamba',\n\t'Vitoria de Santo Antao',\n\t'Fada Ngourma',\n\t'Al Hoceima',\n\t'Agcogon',\n\t'Konina',\n\t'Mahbubnagar',\n\t'Temamatla',\n\t'Assab',\n\t'Gautier',\n\t'Mangalkot',\n\t'San Benito',\n\t'Ben Ahmed',\n\t'Natori-shi',\n\t'Wymondham',\n\t'Hassi el Ghella',\n\t'Pesca',\n\t'Kuttappatti',\n\t'Campo de Criptana',\n\t'Pelham',\n\t'Mont-Saint-Hilaire',\n\t'Sao Joaquim',\n\t'Lusca',\n\t\"Topol'cany\",\n\t'Itagui',\n\t'Artur Nogueira',\n\t'Cheadle Hulme',\n\t'Timmiarmiut',\n\t'Carmopolis',\n\t'Dolhasca',\n\t'Mangghystau',\n\t'Much',\n\t'Vadamugam Vellodu',\n\t'Vamanapuram',\n\t'Bordj Mokhtar',\n\t'Tougouni',\n\t'Beldaur',\n\t'Limbuhan',\n\t'Paraibano',\n\t'Realeza',\n\t'Puchheim',\n\t'Cardedeu',\n\t'Cacocum',\n\t'Luacano',\n\t'Villavicencio',\n\t'Fray Bartolome de Las Casas',\n\t'Burke',\n\t'Dabiya',\n\t'Pizarra',\n\t'Kothapet',\n\t'Ile-Ife',\n\t'Chittattukara',\n\t'Chuadanga',\n\t'Wausau',\n\t'Ban Tha Ton',\n\t'Feyzabad',\n\t'Frankenberg',\n\t'Gostivar',\n\t'Magelang',\n\t'Sabaya',\n\t'Maleme Hodar',\n\t'Virakeralam',\n\t'Bhisho',\n\t'Rakhiv',\n\t'Manjimup',\n\t'Catalpinar',\n\t'Liaoyuan',\n\t'Akureyri',\n\t'Ris-Orangis',\n\t'Larena',\n\t'Ampelokipoi',\n\t'Waterloo',\n\t'Siguiri',\n\t'Sujina',\n\t'Monte Alegre do Piaui',\n\t'Maicao',\n\t'Ambohimiadana',\n\t\"Pan'an\",\n\t'Vallauris',\n\t'Lingampalli',\n\t'Ewell',\n\t'Tambau',\n\t'South Union',\n\t'Moga',\n\t'Talghar',\n\t'Salinas',\n\t'Gonghe',\n\t'Temple City',\n\t'Ternat',\n\t'San Ramon de la Nueva Oran',\n\t'Donaueschingen',\n\t'Adilcevaz',\n\t'Plainedge',\n\t'Salotgi',\n\t'Barotac Nuevo',\n\t'Chevigny-Saint-Sauveur',\n\t'Jaisalmer',\n\t'Cameri',\n\t'Lowshan',\n\t'Pleasant View',\n\t'Gazipura',\n\t'Indwe',\n\t'Yen Bai',\n\t'Hospet',\n\t'Jamai',\n\t'Palmetto Estates',\n\t'Ponnani',\n\t'Hwlffordd',\n\t'Tiny',\n\t'Bhattu Kolan',\n\t'Yangsan',\n\t'Allanridge',\n\t'Quyang',\n\t'Agoo',\n\t'Sabbavaram',\n\t'Chamical',\n\t'Buritama',\n\t'Minna',\n\t'Millbury',\n\t'San Jose Villa de Allende',\n\t'Ercis',\n\t'Mogok',\n\t'Dona Remedios Trinidad',\n\t'Rio Novo do Sul',\n\t'Kormend',\n\t'Ambohimitombo',\n\t'New Carrollton',\n\t'Mount Airy',\n\t'Qinhuangdao',\n\t'Madingou',\n\t'Robbinsdale',\n\t'Huejucar',\n\t'Erraballa',\n\t'Andover',\n\t'Kefar Yona',\n\t'Sweet Home',\n\t'Deming',\n\t'Asakuchi',\n\t'Al Mu`abbadah',\n\t'Varna',\n\t'Pine Bluff',\n\t'Rovira',\n\t'Brackley',\n\t'Kodala',\n\t'Patu',\n\t'Satoraljaujhely',\n\t'Ambohimanga',\n\t'Cherukolattur',\n\t'Marechal Deodoro',\n\t'Pelaya',\n\t'Cape Town',\n\t'Sarakkayhalli',\n\t'Manado Light',\n\t'Ihsaniye',\n\t'Yangiobod',\n\t'Natagaima',\n\t'Mattathur',\n\t'Strathroy-Caradoc',\n\t'Talagante',\n\t'Montclair',\n\t'Kiryandongo',\n\t'Nzeto',\n\t'Pativilca',\n\t'Quiapo',\n\t'Pulilan',\n\t'Serra Preta',\n\t'Alagoa Grande',\n\t'Jerez',\n\t'Edam',\n\t'Merces',\n\t'Galaz',\n\t'Pahuatlan de Valle',\n\t'Nathpur',\n\t'Orem',\n\t'Milford Mill',\n\t'Vimercate',\n\t'Baie de Henne',\n\t'Fanandrana',\n\t'Stenungsund',\n\t'Fondi',\n\t'Vipparla',\n\t'Arroyomolinos',\n\t'Kaniyur',\n\t'Cristuru Secuiesc',\n\t'Marawi City',\n\t'Dong Hoa',\n\t'Moura',\n\t'Selsey',\n\t'Dinalupihan',\n\t'Busko-Zdroj',\n\t'Itatim',\n\t'Foumban',\n\t'Purwa',\n\t'Woippy',\n\t'Muzhakkunnu',\n\t'Backa Topola',\n\t'Colmenarejo',\n\t'Burg',\n\t'Ashoknagar',\n\t'Manerbio',\n\t'Montmorency',\n\t'Carteret',\n\t'Kotekara',\n\t'El Socorro',\n\t'Mayahaura',\n\t'Besigheim',\n\t'Barsinghausen',\n\t'Raita',\n\t'Zwenkau',\n\t'Fords',\n\t'Palamedu',\n\t'McHenry',\n\t'Rahovec',\n\t'Lajosmizse',\n\t'Sakhmohan',\n\t'Lyons',\n\t'Ulatu',\n\t'Tuskegee',\n\t'Humacao',\n\t'Launaguet',\n\t'Paranaiba',\n\t'Shitab Diara',\n\t'Asansol',\n\t'Signal Mountain',\n\t'Hammam Bou Hadjar',\n\t'Novi Sad',\n\t'Karghar',\n\t'Arzano',\n\t'Thatri',\n\t'Vossevangen',\n\t'Cuya',\n\t'Lymanka',\n\t'Bucak',\n\t'Cathedral City',\n\t'Sidi Slimane',\n\t'Tapejara',\n\t'Marco',\n\t'Tingloy',\n\t'Shelby',\n\t'Sijua',\n\t'Moss Point',\n\t'Satwas',\n\t'Parkal',\n\t'Sitapur',\n\t'Maniyamturuttu',\n\t'Nakhla',\n\t'Ispica',\n\t'Nayagaon',\n\t'Telimele',\n\t'Mono',\n\t'Kolga',\n\t'Mirjaveh',\n\t'Warrensburg',\n\t'Furstenfeld',\n\t'Oswiecim',\n\t'Pariyapuram',\n\t'Cuito Cuanavale',\n\t'Yoqne`am `Illit',\n\t'Komatsu',\n\t'Farmersville',\n\t'Mazar-e Sharif',\n\t'Tasil',\n\t'Surla',\n\t'`Ain el Hadjel',\n\t'Potukonda',\n\t'Alcochete',\n\t'McKinleyville',\n\t'Lage',\n\t'Dugda',\n\t'Candijay',\n\t\"Intich'o\",\n\t'Mercier',\n\t'Kamnik',\n\t'Tleta Taghramt',\n\t'Dungannon',\n\t'Montespertoli',\n\t'Port Jervis',\n\t'Matiguas',\n\t'Tago',\n\t'Oulad Daoud',\n\t'Haymana',\n\t'Tshela',\n\t'Aso',\n\t'South Hadley',\n\t'Doranahalli',\n\t'La Palma',\n\t'Laitila',\n\t'Stara Zagora',\n\t'Az Zuwaydah',\n\t'Storozhynets',\n\t'Muppalla',\n\t'Urganch',\n\t'Bialystok',\n\t'Libertad',\n\t'Bilara',\n\t'Zemio',\n\t'Mbabane',\n\t'Tsukawaki',\n\t'Middle Valley',\n\t'Sierra Vista Southeast',\n\t'Balboa',\n\t'Ostrowiec Swietokrzyski',\n\t'Lucapa',\n\t'Chiang Rai',\n\t'Khujand',\n\t'Great Baddow',\n\t'Buthidaung',\n\t'El Chol',\n\t'Albuera',\n\t'Carmignano',\n\t'Sommacampagna',\n\t'Kutum',\n\t'Cambambe',\n\t'Cunha Pora',\n\t'Longtaixiang',\n\t'Lawas',\n\t'Meru',\n\t'Ibiuna',\n\t'Aalen',\n\t'Kuah',\n\t'Bertem',\n\t'Consuegra',\n\t'Gamarra',\n\t'Chunakhali',\n\t'Tavsanli',\n\t'Kolwezi',\n\t'Dori',\n\t'Melsele',\n\t'Murugampalaiyam',\n\t'Yirga `Alem',\n\t'Vrnjacka Banja',\n\t'Bentota',\n\t'Bron',\n\t'Uncia',\n\t'Woerden',\n\t'San Juan Nonualco',\n\t'National City',\n\t'Rajshahi',\n\t'Mount Kisco',\n\t'Ludza',\n\t'Pattambi',\n\t'Korsimoro',\n\t'Keota',\n\t'Marion',\n\t'Kyaukmyaung',\n\t'Algun',\n\t'Montrose',\n\t'Loganville',\n\t'Gracemere',\n\t'Anthony',\n\t'Lapeer',\n\t'Blachownia',\n\t'Dimiao',\n\t'Dellys',\n\t'Haramachida',\n\t'Porto da Folha',\n\t'Ullo',\n\t'Iju',\n\t'Caister-on-Sea',\n\t'Dunaharaszti',\n\t'Ghanpur',\n\t'Ban Mae Ka Hua Thung',\n\t'Ajodhya',\n\t'La Garriga',\n\t'Canela',\n\t'Mallappadi',\n\t'Rossington',\n\t'Suriapet',\n\t'La Caleta',\n\t'Kumbhraj',\n\t'Chengdu',\n\t'Tarnowskie Gory',\n\t'Wattwil',\n\t'Hoogeveen',\n\t'Jagalur',\n\t'Veymandoo',\n\t'Sahatona-Tamboharivo',\n\t'Jaqueira',\n\t'Marshfield',\n\t'Jonkoping',\n\t'Navabad',\n\t'Phuc Yen',\n\t'Pinyahan',\n\t'Palanga',\n\t'Fujiyoshida',\n\t'Quela',\n\t'Ulcinj',\n\t'Sao Raimundo das Mangabeiras',\n\t\"L'Oulja\",\n\t'Polas',\n\t'Vattalkundu',\n\t'Lod',\n\t'Suwanee',\n\t'Asse',\n\t'Bensekrane',\n\t'Siki',\n\t'Neira',\n\t'Middelharnis',\n\t'Managua',\n\t'Ambatomborona',\n\t'Touama',\n\t'Karatepe',\n\t'Willoughby Hills',\n\t'Boonton',\n\t'Mwatate',\n\t'Sanchahe',\n\t'Bommayapalaiyam',\n\t'Fort Bliss',\n\t'Bronx',\n\t'Nahuizalco',\n\t'Ankazomiriotra',\n\t'East Kelowna',\n\t'Bacioi',\n\t'Hassloch',\n\t'Hengyang',\n\t'Xishan',\n\t'Tamuin',\n\t'Vestmanna',\n\t'Bochnia',\n\t'Znin',\n\t'Purattur',\n\t'Arapongas',\n\t'Montividiu',\n\t'Yagoua',\n\t'Chinna Annaluru',\n\t'Chiatura',\n\t'Dhalai',\n\t'El Tablon',\n\t'Jyllinge',\n\t'Ives Estates',\n\t'Arenoso',\n\t'Eppstein',\n\t'Stony Plain',\n\t'Charleroi',\n\t'Bressanone',\n\t'Graulhet',\n\t'Diksmuide',\n\t'Heverlee',\n\t'Nova Russas',\n\t'Sholaqqorghan',\n\t'Viskovo',\n\t'Palenque',\n\t'Gatada',\n\t'Kannanendal',\n\t'Wadenswil',\n\t'Nepomuceno',\n\t'Dalli Rajhara',\n\t'Okpo',\n\t'Canelinha',\n\t'Saharbani',\n\t'Somma Lombardo',\n\t'Bojnik',\n\t'Beylikduzu',\n\t'Ban Pha Bong',\n\t'Trumbull Center',\n\t'Mandera',\n\t'Rio do Pires',\n\t'Bagnolo in Piano',\n\t'Tianchang',\n\t'Lillerod',\n\t'Ipswich',\n\t'Olaippatti',\n\t'Duzici',\n\t'Pernamitta',\n\t'Villa de Zaachila',\n\t'Wakefield',\n\t'Mandello del Lario',\n\t'Heywood',\n\t'Adigrat',\n\t'Juchitepec',\n\t'Nizhyn',\n\t'San Miguel de Allende',\n\t'Salemata',\n\t'Fenton',\n\t'As Sulaymaniyah',\n\t'Olhanpur',\n\t'Moon',\n\t'Churchdown',\n\t'Berezne',\n\t'Avenal',\n\t'Mettuppalaiyam',\n\t'Fort St. John',\n\t'Ghogardiha',\n\t'Palia Kalan',\n\t'Dardenne Prairie',\n\t'Bezerros',\n\t'Iowa City',\n\t'Mondragone',\n\t'Baojishi',\n\t'Cuiaba',\n\t'Kopparam',\n\t'Gokavaram',\n\t'Karamursel',\n\t'Bariariya Tola Rajpur',\n\t'Guambog',\n\t\"Mirassol d'Oeste\",\n\t'Manbengtang',\n\t'Cali',\n\t'Yaguachi Nuevo',\n\t'Tiruppalai',\n\t'Kodivalasa',\n\t'Elakadu',\n\t'Hadyach',\n\t'Kumaralingam',\n\t'La Victoria de Acentejo',\n\t'Busembatia',\n\t'Arbroath',\n\t'Mahanoro',\n\t'El Qaa',\n\t'Ixhuatlan de Madero',\n\t'Golub-Dobrzyn',\n\t'Bundala',\n\t'Lurate Caccivio',\n\t'Palapag',\n\t'Biba',\n\t'Gokceada',\n\t'Kuzhittura',\n\t'Assomada',\n\t'Imias',\n\t'Obihiro',\n\t'Makinohara',\n\t'Chettiyapatti',\n\t'Wuyuan',\n\t'Tukrah',\n\t'Gorinchem',\n\t'Chettikulam',\n\t'Knic',\n\t'Piratini',\n\t'Takamatsu',\n\t'Ichhapur',\n\t'Ross',\n\t'Jamay',\n\t'Coyotepec',\n\t'Hani',\n\t'Malilipot',\n\t'Kozloduy',\n\t'Antwerp',\n\t'Vikramasingapuram',\n\t'Houma',\n\t'Osawa',\n\t'Colonia del Sacramento',\n\t'Daulatnagar',\n\t'Nannamukku',\n\t'Wanderley',\n\t'Dunhuang',\n\t'Campolongo Maggiore',\n\t'Chiche',\n\t'Merksem',\n\t'Kaboila',\n\t'Boscoreale',\n\t'Lordegan',\n\t'Douar Laouamra',\n\t'General Juan Madariaga',\n\t'Kottangara',\n\t'Badurpalle',\n\t'Rumoi',\n\t'Blackstone',\n\t'Marinha Grande',\n\t'Honmachi',\n\t'Oostkamp',\n\t'Xingangli',\n\t'Castelfidardo',\n\t'Zemun',\n\t'Krishnagiri',\n\t'Haomen',\n\t'Korbach',\n\t'Governador Celso Ramos',\n\t'East Pennsboro',\n\t'Aurich',\n\t'Ajjipuram',\n\t'Bury',\n\t'Nazare da Mata',\n\t'Humberto de Campos',\n\t'Pechea',\n\t'Cinarcik',\n\t'Jidd Hafs',\n\t'Noyon',\n\t'Zhaodianzi',\n\t'Sacavem',\n\t'Bilopillya',\n\t'Pader',\n\t'Miami Lakes',\n\t'Aplao',\n\t'Camabatela',\n\t'Domingos Martins',\n\t'Mahon',\n\t'Takaba',\n\t'Konskie',\n\t'Basso',\n\t'San Juan Despi',\n\t'Picui',\n\t'Ranipet',\n\t'Shidongcun',\n\t'Santa Rita do Sapucai',\n\t'Park Hills',\n\t'Caldera',\n\t'Gorenja Vas',\n\t'Holborn',\n\t'Welland',\n\t'Radzyn Podlaski',\n\t'Riacho dos Machados',\n\t'Dukli',\n\t'Motherwell',\n\t'Santa Rosa de Viterbo',\n\t'El Ateuf',\n\t'Villa Corona',\n\t'Rajaram',\n\t'Payipira',\n\t'Molnlycke',\n\t'Kautalam',\n\t'Duisburg',\n\t'Ghoradongri',\n\t'Sangasso',\n\t'Tacna',\n\t'Santa Helena',\n\t'Casablanca',\n\t'Kalliyassheri',\n\t'Xiancun',\n\t'Dabaga',\n\t'Chilcuautla',\n\t'Sihora',\n\t'New Britain',\n\t'Kingsburg',\n\t'Saint-Raymond',\n\t'Garoua',\n\t'Tulunan',\n\t'Torello',\n\t'Punal',\n\t'Beutelsbach',\n\t'Telenesti',\n\t'Abim',\n\t'Ed Damour',\n\t'Tecamachalco',\n\t'Nootdorp',\n\t'Centar Zupa',\n\t'Bernay',\n\t'Jatauba',\n\t'Azrou',\n\t'Hashtrud',\n\t'Chimichagua',\n\t'Radzymin',\n\t'Feldkirchen',\n\t'Houzhuang',\n\t'Brant',\n\t'Saint-Mande',\n\t'Marauatpur',\n\t'Radovljica',\n\t'La Entrada',\n\t'Kidbrooke',\n\t'Dnestrovsc',\n\t'Melksham',\n\t'Keshan',\n\t'Stockholm',\n\t'Fort Mitchell',\n\t'Haigerloch',\n\t'Altinozu',\n\t'Odzaci',\n\t'La Dorada',\n\t'Al Buraymi',\n\t'New Glasgow',\n\t'Vermilion',\n\t'Chongshan',\n\t'Kavarna',\n\t'Ban San Phak Wan Luang',\n\t'Puliyampatti',\n\t'Benslimane',\n\t'Chaumont-Gistoux',\n\t'Mae Hong Son',\n\t'Agia Paraskevi',\n\t'Kattipparutti',\n\t'Afyonkarahisar',\n\t'Berdychiv',\n\t'Alewah',\n\t'Pachrukhi',\n\t'Warzat',\n\t'Tilaran',\n\t\"Gonfreville-l'Orcher\",\n\t'Muradiye',\n\t'Qara',\n\t'Defiance',\n\t'Bagu Na Mohra',\n\t'Milenaka',\n\t'Ruda Slaska',\n\t'Suchiapa',\n\t'Pachuca',\n\t'Kingston upon Thames',\n\t'Kumiyama',\n\t'Enriquillo',\n\t'El Astillero',\n\t'Bergheim',\n\t'Pindoretama',\n\t'Ardabil',\n\t'Lucban',\n\t'Cacuso',\n\t'Merimandroso',\n\t\"Sa'in Qal`eh\",\n\t'Paula Candido',\n\t'Varapatti',\n\t'Erikolam',\n\t'Clarksdale',\n\t'Carhue',\n\t'Lisle',\n\t'Teotitlan',\n\t'Chebrolu',\n\t'Gabrovo',\n\t'Shambhunath',\n\t'Creve Coeur',\n\t'Silver City',\n\t'Matehuala',\n\t'Tefe',\n\t'Nohfelden',\n\t'Yangambi',\n\t'Camotan',\n\t'Las Mercedes',\n\t'Chevella',\n\t'Sokolov',\n\t'Porto Calvo',\n\t'Kayattar',\n\t'Batu Gajah',\n\t'Uppada',\n\t'Majalgaon',\n\t'Saint-Ghislain',\n\t'Staveley',\n\t'Jaffar Khanpet',\n\t'Chaiyaphum',\n\t'Parole',\n\t'Arara',\n\t'Hatfield',\n\t'Santiago Chimaltenango',\n\t'Cao Bang',\n\t'Gungoren',\n\t'Marechal Floriano',\n\t'Rio Cuarto',\n\t'Tazishan',\n\t'Binjai',\n\t'Pattensen',\n\t'Zhangjiazhuang',\n\t'Maasin',\n\t'Kizhakkanela',\n\t'Taquarituba',\n\t'Quedlinburg',\n\t'Schorndorf',\n\t'Melilli',\n\t'Griffin',\n\t'Ambondromisotra',\n\t'Cetinje',\n\t'Channelview',\n\t'Hanur',\n\t'Kenmore',\n\t'Jayrud',\n\t'Dollis Hill',\n\t'Taldyqorghan',\n\t'Al `Uqaylah',\n\t'Mutia',\n\t'Dabra',\n\t'Mae Ai',\n\t'Bamban',\n\t'Mayantoc',\n\t'Mechta Ouled Oulha',\n\t'Sacapulas',\n\t'Jaynagar-Majilpur',\n\t'Gladeview',\n\t'Dayong',\n\t'Monte Rico',\n\t'Nova Soure',\n\t'San Juan Zitlaltepec',\n\t'Almel',\n\t'Sakhua',\n\t'Kromeriz',\n\t'Vitorino',\n\t'Hayward',\n\t'Kahnuj',\n\t'Manalurpettai',\n\t'Altstatten',\n\t'Sydney Mines',\n\t'Liuhu',\n\t'Kasaali',\n\t'Acton',\n\t'Jiquipilas',\n\t'Talegaon Dhamdhere',\n\t'San Antonio Enchisi',\n\t'Kaduna',\n\t'Saint-Ave',\n\t'Renapur',\n\t'Carlos Spegazzini',\n\t'Riverdale',\n\t'Sint-Gillis-bij-Dendermonde',\n\t'El Aioun',\n\t'Ichinoseki',\n\t'Phulera',\n\t'Donwari',\n\t'Motipur',\n\t'Capitao de Campos',\n\t'York',\n\t'Rancho Mirage',\n\t'Ekma',\n\t'Thogapalle',\n\t'Glodeni',\n\t'Sedan',\n\t'Cupar',\n\t'Charbagh',\n\t'Sahasmal',\n\t\"Bazal'tove\",\n\t'Gorkha',\n\t'Banha',\n\t'Oguzeli',\n\t'Nauagarhi',\n\t'Zaio',\n\t'Pirojgarh',\n\t'Aoshang',\n\t'Faruka',\n\t'Boaco',\n\t'Rani Sagar',\n\t'Cao Lanh',\n\t'Boyabat',\n\t'Waslala',\n\t'Vohitsaoka',\n\t'Dayton',\n\t'Borujen',\n\t'Konya',\n\t'Naj` Hammadi',\n\t'Yatomi',\n\t'Laferriere',\n\t'Deo',\n\t'Pampan',\n\t'Citluk',\n\t'Naranjito',\n\t'Haiwei',\n\t'Bohinjska Bistrica',\n\t'Kochkor-Ata',\n\t'Chiromo',\n\t'Kimitsu',\n\t'Linkoping',\n\t'Valinhos',\n\t'Lozova',\n\t'Siyazan',\n\t'Blenheim',\n\t\"Olho d'Agua das Cunhas\",\n\t'Oak Park',\n\t'La Macarena',\n\t'Tasso Fragoso',\n\t'Ladkhed',\n\t'Taber',\n\t'Atchoupa',\n\t'Quilpue',\n\t'Cimislia',\n\t'Cimerak',\n\t'Ar Ruhaybah',\n\t'Xo`jaobod',\n\t'Antombana',\n\t'Tarnos',\n\t'Blackhawk',\n\t'Hengchun',\n\t'Petrzalka',\n\t'Ambatolampy',\n\t'Renai',\n\t'Massalubrense',\n\t'Marcianise',\n\t'Mako',\n\t'Palmito',\n\t'Marshalltown',\n\t'Taywarah',\n\t'Guiyang',\n\t'Patan',\n\t'Montichiari',\n\t'Vittoriosa',\n\t'Chili',\n\t'Manasa',\n\t'Khushab',\n\t'Kujukuri',\n\t'Zhongzhai',\n\t'Cagua',\n\t'Kryzhopil',\n\t'Phuntsholing',\n\t'Chhapra Bahas',\n\t'Banak',\n\t'Wolfhagen',\n\t'Biyala',\n\t\"An'gang\",\n\t'Ban Phe',\n\t'Andoain',\n\t'Martina Franca',\n\t'Tadikonda',\n\t'Itapetininga',\n\t'Wusong',\n\t'La Carolina',\n\t'Greeneville',\n\t'Datori',\n\t'Gulbahor',\n\t'Weifen',\n\t'Farnley',\n\t'Piedade',\n\t'Reiskirchen',\n\t'Mahitsy',\n\t'Akouda',\n\t'Hucclecote',\n\t'Antsenavolo',\n\t'Jever',\n\t'Sablayan',\n\t'Holzkirchen',\n\t'Ramara',\n\t'Phulhara',\n\t'Ridgeland',\n\t'Youdiou',\n\t'Talwandi Chaudhrian',\n\t'Tadian',\n\t'Messias',\n\t'Suar',\n\t'Minamisuita',\n\t'Nipani',\n\t'Jugial',\n\t'Bisignano',\n\t'Opole',\n\t'El Jicaro',\n\t'Joensuu',\n\t'Todupulai',\n\t'Kamituga',\n\t'Guararapes',\n\t'Pike Creek Valley',\n\t'Taimali',\n\t'Chiconquiaco',\n\t'Brookfield',\n\t'Belo Jardim',\n\t'Uttaramerur',\n\t'Tokorozawa',\n\t'Mulungu',\n\t'Spencer',\n\t'Sopron',\n\t'Catape',\n\t'Mata-Utu',\n\t'Cha Grande',\n\t'Jandira',\n\t'Kunnatnad',\n\t'Kolhapur',\n\t'Manchenahalli',\n\t\"Cox's Bazar\",\n\t'Mahisi',\n\t'Nunspeet',\n\t'Xocali',\n\t'Hitachiomiya',\n\t'Beaucaire',\n\t'Soissons',\n\t'Hjorring',\n\t'Antonio Cardoso',\n\t'Blaydon',\n\t'Jhalida',\n\t'Minden',\n\t'Wardenburg',\n\t'Ain Bessem',\n\t'Milwaukee',\n\t'Coventry',\n\t'Puli',\n\t'Arqalyq',\n\t'Januaria',\n\t'Los Almacigos',\n\t'Moreton',\n\t'Jennings',\n\t'Laguna Woods',\n\t'Biloela',\n\t'Chaddesden',\n\t'Monmouth Junction',\n\t'Sullivan',\n\t'Wassenberg',\n\t'Canyon',\n\t'Mograne',\n\t'Mardakan',\n\t'Areia',\n\t'El Tigre',\n\t'Wallingford',\n\t'Goshogawara',\n\t'Chandannagar',\n\t'San Marcos',\n\t'Pedra Branca',\n\t'Dhani Sukhan',\n\t'Barni',\n\t'Maumere',\n\t'Strathroy',\n\t'Guozhen',\n\t'Hlobyne',\n\t'Blace',\n\t'Pentecoste',\n\t'Malden',\n\t'Bad Orb',\n\t'Hallstahammar',\n\t'Delano',\n\t'Bhadsara',\n\t'Thal',\n\t'Dongnanyanfa',\n\t'Rio Bueno',\n\t'Vendas Novas',\n\t'Chhara',\n\t'Katarmala',\n\t'Ngorongoro',\n\t'Takaoka',\n\t'Kalianpur',\n\t'Smarje',\n\t'Mangaldan',\n\t'Aulla',\n\t'Koila Belwa',\n\t'Shenjiaba',\n\t'Emmen',\n\t'Ambalavayal',\n\t'Crepy-en-Valois',\n\t'Ladwa',\n\t'Oxchuc',\n\t'Khagaur',\n\t'Esmeraldas',\n\t'Cirkulane',\n\t'Kaviti',\n\t'Wadsworth',\n\t'Lukovit',\n\t'Venafro',\n\t'Saint-Gely-du-Fesc',\n\t'Paramount',\n\t'Dounan',\n\t'Fort Beaufort',\n\t'Ban Mueang Na Tai',\n\t'Hornsey',\n\t'Collingwood',\n\t'Lower Allen',\n\t'Rangwasa',\n\t'Merelbeke',\n\t'Jamao al Norte',\n\t'Caudebec-les-Elbeuf',\n\t'Cakovec',\n\t'Matatiele',\n\t'Carmen de Patagones',\n\t'Kivsharivka',\n\t'Faberg',\n\t'Doornkop',\n\t'Istres',\n\t'Ancud',\n\t'Ovidiu',\n\t'Strangnas',\n\t'Shazhou',\n\t'Gazantarak',\n\t'Daule',\n\t'El Ksar',\n\t'Riobamba',\n\t'Paxtakor Shahri',\n\t'Vontimitta',\n\t'Pyinmana',\n\t'Sunset Hills',\n\t'Raha Tiga',\n\t'Ujfeherto',\n\t'Kiskoros',\n\t'Benin City',\n\t'Delhi Cantonment',\n\t'Khowy',\n\t'Ban Rangsit',\n\t'Cabudare',\n\t'Valderrama',\n\t'Turki',\n\t'Lohne',\n\t'Pangkalpinang',\n\t'Bazhajiemicun',\n\t'Ribat Al Khayr',\n\t'Estaimpuis',\n\t'Mineros',\n\t'Huanghuajie',\n\t'Espungabera',\n\t'Bawku',\n\t'San Bartolo',\n\t'Raghogarh',\n\t'Jaito',\n\t'Kakiri',\n\t'Radzionkow Nowy',\n\t'Chilakalurupet',\n\t'Maragheh',\n\t'Alacati',\n\t'Gata',\n\t'Rohera',\n\t'Lakshmicharipara',\n\t'Myronivka',\n\t'Matriz de Camarajibe',\n\t'Tamarana',\n\t\"Ambinanin' Andravory\",\n\t'Kirakira',\n\t'Bramhall',\n\t'Roccastrada',\n\t'Hasbergen',\n\t'Ranjal',\n\t'Sawakin',\n\t'Romblon',\n\t'Jogaili',\n\t'Kaga',\n\t'Jinka',\n\t'Limerick',\n\t'Chatou',\n\t'Narman',\n\t'Ponce',\n\t'Baskale',\n\t'Wilnsdorf',\n\t\"Saint-Michel de l'Atalaye\",\n\t'Pakala',\n\t'Sao Sebastiao da Boa Vista',\n\t'Spring Hill',\n\t'Orkney',\n\t'Mahasolo',\n\t'Ranranagudipeta',\n\t'Oeiras',\n\t'Carlos Manuel de Cespedes',\n\t'Stavroupoli',\n\t'Conner',\n\t'Koscielisko',\n\t'San Donato Milanese',\n\t'Udon Thani',\n\t'Jinchang',\n\t'Dzuunharaa',\n\t'Castries',\n\t'Inegol',\n\t'Novohrodivka',\n\t'Chyhyryn',\n\t'Cabarete',\n\t'Ganderkesee',\n\t'Bielawa',\n\t'Roura',\n\t'Namegawa',\n\t'Shabqadar',\n\t'Geylegphug',\n\t'Guapi',\n\t'Urgnano',\n\t'Zhitiqara',\n\t'Wildberg',\n\t'Begusarai',\n\t'Heihe',\n\t'Zegzel',\n\t'Or Yehuda',\n\t'Uenohara',\n\t'Atherstone',\n\t'Taku',\n\t'Central Islip',\n\t'Dessel',\n\t'Coal',\n\t'Gaoua',\n\t'Narwana',\n\t'Shuzenji',\n\t'West Lafayette',\n\t'Hazar',\n\t'Kongsvinger',\n\t'Povoa de Varzim',\n\t'Zunheboto',\n\t'Kalmiuske',\n\t'Zacatepec',\n\t'Rethen',\n\t'Benjamin Aceval',\n\t'Bandeirantes',\n\t'Yakou',\n\t'Passi',\n\t'Malanje',\n\t'Catacaos',\n\t'Capelinha',\n\t'Qingyang',\n\t'Alcira',\n\t'La Gloria',\n\t'Tucson',\n\t'Ban Chorakhe Samphan',\n\t'Cienaga',\n\t'Pebane',\n\t'Lontra',\n\t'Haikoucun',\n\t'Dhanwar',\n\t'Weifang',\n\t'Thari Mir Wah',\n\t'Nakano',\n\t'Coron',\n\t'Maysville',\n\t'Jeonghae',\n\t'Trgoviste',\n\t'Salaga',\n\t\"Nan'ao\",\n\t'Locri',\n\t'Kenndie',\n\t'Florsheim',\n\t'Ouroeste',\n\t'Pizzo',\n\t'Woodmere',\n\t'Muzaffarpur',\n\t'Vicencia',\n\t'Yuriria',\n\t'Andoas',\n\t'Chauhanpatti',\n\t'Debila',\n\t'Xiwanzi',\n\t'Mexico City',\n\t'Perico',\n\t'Nova Ipixuna',\n\t'Pullambadi',\n\t'Osaka',\n\t'Kazo',\n\t'Garut',\n\t'Tonya',\n\t'Zawiyat Razin',\n\t'Hajdunanas',\n\t'Mollerusa',\n\t'Nuevo San Carlos',\n\t'Inverurie',\n\t'Cuddapah',\n\t'Leiria',\n\t'Magdeburg',\n\t'As Saqlawiyah',\n\t'Sidhi',\n\t'Jitaicun',\n\t'Alegrete',\n\t'Arwal',\n\t'Pueblo Nuevo',\n\t'Kovilur',\n\t'Valaiyampattu',\n\t'Kollengode',\n\t'Southside',\n\t'Tiruvattar',\n\t'Ahlat',\n\t'Chandpura',\n\t'Singleton',\n\t'Valu lui Traian',\n\t\"K'olito\",\n\t'Norzagaray',\n\t'Onet Village',\n\t'Maserada sul Piave',\n\t'Gaziantep',\n\t'Borgentreich',\n\t'Cheb',\n\t'Santa Maria Atzompa',\n\t'Caspe',\n\t'Dalton',\n\t'Ilebo',\n\t'Harpenden',\n\t'Tiznit',\n\t'Fredrikstad',\n\t'Itaparica',\n\t'Zabol',\n\t'Majali',\n\t'Ubombo',\n\t'Karaiyampudur',\n\t'Port Orange',\n\t'Atitalaquia',\n\t'Caldas',\n\t'Shyroke',\n\t'Songadh',\n\t'Hai Duong',\n\t'Ayamonte',\n\t'Heroica Guaymas',\n\t'Haraiya',\n\t'Iarintsena',\n\t'Cardoso',\n\t'Yoloten',\n\t'Tandrano',\n\t'Tingo Maria',\n\t'Quimbaya',\n\t'Jambalo',\n\t'Samaxi',\n\t'Leme',\n\t'Bougtob',\n\t'Sudipen',\n\t'Artigas',\n\t'Ambatotsipihina',\n\t'Charlottesville',\n\t'Creutzwald',\n\t'Mangbwalu',\n\t'Tempe',\n\t'Agareb',\n\t'Jurh',\n\t'Tambo',\n\t'Kungalv',\n\t'Navipet',\n\t'Ramapattanam',\n\t'Baykan',\n\t'Suhr',\n\t'Taurisano',\n\t'Maydolong',\n\t'Oulad Said',\n\t'Pianiga',\n\t'Jefferson Hills',\n\t'Paine',\n\t'Pocheon',\n\t'Vennesla',\n\t'Porto Recanati',\n\t'Mirpeta',\n\t'Sendenhorst',\n\t'Carmichael',\n\t'Borgo San Lorenzo',\n\t'Torton',\n\t'Banta',\n\t'Urbino',\n\t'Kedzierzyn-Kozle',\n\t'Yamunanagar',\n\t'Ishidoriyacho-eso',\n\t'Tatui',\n\t'Amarapura',\n\t'Kodoli',\n\t'Monterey',\n\t'Basavakalyan',\n\t'Beroun',\n\t'East Donegal',\n\t'To`raqo`rg`on',\n\t'Usharal',\n\t'Harihar',\n\t'Amborompotsy',\n\t'Barkly East',\n\t'Charaut',\n\t'Kuttattuppatti',\n\t'Aracagi',\n\t'Hongzhai',\n\t'Sonqor',\n\t'Krishnamsettipalle',\n\t'Balugan',\n\t'Agua Preta',\n\t'Laayoune',\n\t'Huyuk',\n\t'Muban Saeng Bua Thong',\n\t'Saviano',\n\t'Florina',\n\t'Naestved',\n\t'Itabaianinha',\n\t'Tekkumbagam',\n\t'Valls',\n\t'Ozuluama de Mascarenas',\n\t'Wanluan',\n\t'Toledo',\n\t'Beawar',\n\t'Parimpudi',\n\t'Ramachandrapuram',\n\t'Jalpatagua',\n\t'Chur',\n\t'Jajireddigudem',\n\t'Salgotarjan',\n\t'Thames Ditton',\n\t'Sao Joao dos Poleiros',\n\t'Japoata',\n\t'Backi Petrovac',\n\t'Mugalivakkam',\n\t'Bachra',\n\t'Ahmadpur East',\n\t'Ganserndorf',\n\t'Attibele',\n\t'Briniamaro',\n\t'Bazidpur',\n\t'Santos',\n\t'Aimores',\n\t'Ciudad de la Costa',\n\t'Westchester',\n\t'Brand',\n\t'Codlea',\n\t'Nallagunta',\n\t'Rovinari',\n\t'Schiedam',\n\t'Highland Village',\n\t'Heikendorf',\n\t'Ifs',\n\t'Chuzhou',\n\t'`Anadan',\n\t'Acornhoek',\n\t'Fonds Verrettes',\n\t'Hikone',\n\t'Cartagena del Chaira',\n\t'Moyogalpa',\n\t'Cariari',\n\t'Moe',\n\t'Sahatavy',\n\t'Otley',\n\t'Nambiyur',\n\t'Camden',\n\t'Pomona',\n\t'Vizianagaram',\n\t'Lalo',\n\t'Kafr Zayta',\n\t'Bruchsal',\n\t'Gua',\n\t'Ali Sabieh',\n\t'Ouargaye',\n\t'Huzurnagar',\n\t'Pharaha',\n\t'Yayas de Viajama',\n\t'Novi di Modena',\n\t'Chofugaoka',\n\t'Besagarahalli',\n\t'Paulinia',\n\t'Davis',\n\t'Landhaura',\n\t'Apace',\n\t'San Felice sul Panaro',\n\t'Silvino Lobos',\n\t'Liugoucun',\n\t'Cislago',\n\t'Bububu',\n\t'Gohpur',\n\t'Bhatkal',\n\t'Kotal',\n\t'Lons-le-Saunier',\n\t'Sisai',\n\t'Palangarai',\n\t'Harohalli',\n\t'Tawargeri',\n\t'Newton',\n\t'Muscoy',\n\t'Kade',\n\t'Sene',\n\t'Morarano Chrome',\n\t'Nibria',\n\t'Rosbach vor der Hohe',\n\t'Hilpoltstein',\n\t'Seddouk Oufella',\n\t'Arbaa Sahel',\n\t'Olivar',\n\t'Sevan',\n\t'Forquilhinha',\n\t'Lake Mary',\n\t'Paramus',\n\t'Naula',\n\t'Hukeri',\n\t'Pinheiro',\n\t'Sivaganga',\n\t'Baleraja',\n\t'Koiri Bigha',\n\t'Le Pecq',\n\t'Koflach',\n\t'Namerikawa',\n\t'Yavuzeli',\n\t'Songzi',\n\t'Etawa',\n\t'Shek Tong Tsui',\n\t'Long Binh',\n\t'Tecuala',\n\t'Vyronas',\n\t'Potirendaba',\n\t'Luino',\n\t'Hazle',\n\t'Capitan Mauricio Jose Troche',\n\t'Attiecoube',\n\t'Queensburgh',\n\t'Santiponce',\n\t'Fleurus',\n\t'Ammapettai',\n\t'Montoro',\n\t'Al Waqf',\n\t'Bam',\n\t'Dehaqan',\n\t'Santa Lucia Cotzumalguapa',\n\t'Tucuran',\n\t'Ambesisika',\n\t'Bholsar',\n\t'Chino',\n\t'Androndrona Anava',\n\t'Country Club Estates',\n\t'Laren',\n\t'Asolo',\n\t'Aarsal',\n\t'Sumner',\n\t'Majalengka',\n\t'Barwaaqo',\n\t'Bon Air',\n\t'Ampitatafika',\n\t'Lizzano',\n\t'Majdel Aanjar',\n\t'Dahmani',\n\t'Bhauradah',\n\t'Qaha',\n\t'Khorramabad',\n\t'Shyamnagar',\n\t'Suisun City',\n\t'Frecheirinha',\n\t'Shaw',\n\t'Chepen',\n\t'Nulvi',\n\t'Sao Miguel Arcanjo',\n\t'Kollipara',\n\t'Pajara',\n\t'Kortemark',\n\t'Cha da Alegria',\n\t'Crawford',\n\t'Mistelbach',\n\t'Erkner',\n\t'Ituni',\n\t'Odate',\n\t'Nanded',\n\t'Piekary Slaskie',\n\t'Ainapur',\n\t'Kapaa',\n\t'Nemuro',\n\t'Huolu',\n\t'Banane',\n\t'Tredegar',\n\t'Farkhor',\n\t'Tlayacapan',\n\t'Szprotawa',\n\t'Panchari Bazar',\n\t'Hirson',\n\t'Kukrahill',\n\t'Zierikzee',\n\t'Talata-Volonondry',\n\t'Medjana',\n\t'Santa Maria La Pila',\n\t'Puligunta',\n\t'Kataha',\n\t'Weston',\n\t'Kaikalur',\n\t'Glen Ellyn',\n\t'East St. Paul',\n\t'Crown Point',\n\t'Lagoa',\n\t'Aybasti',\n\t'Awaji',\n\t'Sulibele',\n\t'Puerto Caicedo',\n\t'La Jigua',\n\t'Vera',\n\t'Friedrichsthal',\n\t'El Dorado',\n\t'Bezaha',\n\t'Pagegiai',\n\t'Ban Sai Ma Tai',\n\t'Trzic',\n\t'Sao Benedito do Rio Preto',\n\t'Arcata',\n\t'Brunete',\n\t'Cousse',\n\t'Itapeva',\n\t'Shaoshanzhan',\n\t'Ban Samo Khae',\n\t'Fort Smith',\n\t'Giannitsa',\n\t'Gerona',\n\t'Degeh Bur',\n\t'Awsim',\n\t'Blitar',\n\t'Basavilbaso',\n\t'Palsud',\n\t'Sibolga',\n\t\"Dias d'Avila\",\n\t'Cascades',\n\t'Tecpan Guatemala',\n\t'Overland',\n\t'Levin',\n\t'Tolongoina',\n\t'Asten',\n\t'Tamandare',\n\t'Kannamangalam Tekku',\n\t'Kandakkadava',\n\t'Kilattingal',\n\t'Bayyanagudem',\n\t'Bremervorde',\n\t'Wyandanch',\n\t'Lutz',\n\t'Kasanda',\n\t'Tungavi',\n\t'Palompon',\n\t'Vinjamur',\n\t'Ponteland',\n\t'Kamienna Gora',\n\t'Springboro',\n\t'Morsbach',\n\t'Depalpur',\n\t'Londuimbali',\n\t'Garbagnate Milanese',\n\t'Yenimahalle',\n\t'Masagua',\n\t'Machiques',\n\t'Carbonia',\n\t'Pisco',\n\t'Lynwood',\n\t'Choisy-le-Roi',\n\t'Ambalaromba',\n\t'Seremban',\n\t'Kolar',\n\t'Telkapalli',\n\t'Deoria',\n\t'Glenn Dale',\n\t'Notre-Dame-des-Prairies',\n\t'Majayjay',\n\t'Luzhang',\n\t'Steha',\n\t'Sao Jose do Cerrito',\n\t'Zwettl',\n\t'Lubango',\n\t'Moka',\n\t'Sarpang',\n\t'Farrukhnagar',\n\t'Acanceh',\n\t'Dumas',\n\t'Minignan',\n\t'Mazatan',\n\t'Kadod',\n\t'Capotille',\n\t'Wertheim',\n\t'Gloucester Point',\n\t'Jibou',\n\t'Champasak',\n\t'Katuete',\n\t'Atuntaqui',\n\t'Tupi',\n\t'Nort-sur-Erdre',\n\t'Leland',\n\t'Zongolica',\n\t'North St. Paul',\n\t'O`nhayot',\n\t'South River',\n\t'Euclid',\n\t'Miedzyrzec Podlaski',\n\t'Madinat ash Shamal',\n\t'Sandanski',\n\t'Parora',\n\t'Gela',\n\t'Beronono',\n\t'Nederland',\n\t'Lower Macungie',\n\t'Acambay',\n\t'Cape Girardeau',\n\t'Mafamude',\n\t'Siddhirganj',\n\t'Gonbad-e Kavus',\n\t'San Antonio del Sur',\n\t'Tsuruga',\n\t'Sarcelles',\n\t'Pont-Saint-Esprit',\n\t'Serekali',\n\t'Iguape',\n\t'Rosemount',\n\t'Hulikal',\n\t'Nordenham',\n\t'Bannur',\n\t'Westerkappeln',\n\t'Bozdogan',\n\t'Eslohe',\n\t'Koth',\n\t'Kattari',\n\t'Caltanissetta',\n\t'Francavilla al Mare',\n\t'Iguai',\n\t'Moundou',\n\t'Kozakai-cho',\n\t'Alfaro',\n\t'Sonsoro',\n\t'Ljubljana',\n\t'Charakunda',\n\t'Ambohidranandriana',\n\t'Caraguatay',\n\t'Moriyama',\n\t'Voula',\n\t'Penamiller',\n\t'Ponnai',\n\t'Juan Aldama',\n\t'Douglasville',\n\t'Pati',\n\t'Pfarrkirchen',\n\t'Roman',\n\t'Busan',\n\t'Kottapeta',\n\t'Nagua',\n\t'Salaya',\n\t'Ciudad Dario',\n\t'Buttelborn',\n\t'Victorville',\n\t'San Pelayo',\n\t'Mauren',\n\t'Khairtal',\n\t'Bombarral',\n\t'Cadillac',\n\t'Isiro',\n\t'Cabral',\n\t'Pelagor',\n\t'Guastalla',\n\t'Cruces',\n\t'Gungu',\n\t'Milford',\n\t'Tigrana',\n\t'Mundargi',\n\t'Daram',\n\t'Saudharkrokur',\n\t'Canonsburg',\n\t'Aourir',\n\t'Blue Springs',\n\t'Commerce',\n\t'Saint-Die-des-Vosges',\n\t'Lubuklinggau',\n\t'Lake City',\n\t'Bougouni',\n\t'Netrakona',\n\t'Meral',\n\t'Csongrad',\n\t'Tokai',\n\t'Linthicum',\n\t'Taylorville',\n\t'Sano',\n\t'Araguatins',\n\t'Prokuplje',\n\t'Dhansaria',\n\t'Turtkul',\n\t'Gyzylgaya',\n\t'Bollullos de la Mitacion',\n\t'Mallagunta',\n\t'San Luis Potosi',\n\t'Ukmerge',\n\t'Chenove',\n\t'Huejuquilla el Alto',\n\t'South Gate',\n\t'Llantwit Major',\n\t'Thomazeau',\n\t'Memunda',\n\t'Stockton-on-Tees',\n\t'Himatnagar',\n\t'Rapid City',\n\t'Banes',\n\t'Rheydt',\n\t'Bobenheim-Roxheim',\n\t'Lauterach',\n\t'Kalmthout',\n\t'Yashan',\n\t'Baures',\n\t'Malanday',\n\t'Treviso',\n\t'Ico',\n\t'Vladimirci',\n\t'Dora',\n\t'Abergavenny',\n\t'Parow',\n\t'Tineghir',\n\t'Iapu',\n\t'Cremona',\n\t'Tazmalt',\n\t'Vernon Hills',\n\t'Palermo',\n\t'Ambiula',\n\t'Alaverdi',\n\t'Altamira',\n\t'Sao Goncalo',\n\t'Sakado',\n\t'Pingree Grove',\n\t'Newton Abbot',\n\t'Puerto Morelos',\n\t'Buesaco',\n\t'Santa Maria da Vitoria',\n\t'Zeuthen',\n\t'Hebri',\n\t'Petua',\n\t'Sertania',\n\t'Yangiyer',\n\t'Mahmudabad',\n\t'Dinhata',\n\t'Bariarpur',\n\t'Mondeville',\n\t'Efatsy-Anandroza',\n\t'Rasht',\n\t'Port Royal',\n\t'Marotta',\n\t'Suffern',\n\t'Pearland',\n\t'Paduvari',\n\t'Ain Lechiakh',\n\t'Ruvo di Puglia',\n\t'Wittingen',\n\t'Rochester Hills',\n\t'Matsavaram',\n\t'Dunakeszi',\n\t'Sowa Town',\n\t'Barneveld',\n\t'Koycegiz',\n\t'Shanhu',\n\t'Zaidpur',\n\t'Valenca',\n\t'Rockaway',\n\t'Champua',\n\t'Caojiachuan',\n\t'Saraykent',\n\t'Gheorgheni',\n\t'Shonai',\n\t'Itaueira',\n\t'Itanagar',\n\t'Bandar-e Mahshahr',\n\t'Yelandur',\n\t'Kempston',\n\t'Elazig',\n\t'San Juan Guichicovi',\n\t'Tom Price',\n\t'Zhegaozhen',\n\t'Igdir',\n\t'Chang',\n\t'Nyakrom',\n\t'Shamunpet',\n\t'Sultanabad',\n\t'Tazarka',\n\t'Rathdrum',\n\t'Souahlia',\n\t'Konnur',\n\t'Rinconada',\n\t'Lamballe',\n\t'Planaltina',\n\t'Sunadkuppi',\n\t'Mangpa',\n\t'Marsciano',\n\t'Eonyang',\n\t'Bani Murr',\n\t'Baba Hassen',\n\t'Colatina',\n\t'Tianningcun',\n\t'Morazan',\n\t'Guantingzhan',\n\t'Misserghin',\n\t'Carolina Forest',\n\t'Tanakallu',\n\t'Castellarano',\n\t'Kumla',\n\t'Yorktown',\n\t'Santo Domingo Xenacoj',\n\t'Louga',\n\t'Fort Lee',\n\t'Tepperumalnallur',\n\t'Ampanety',\n\t'Ajuy',\n\t'Idstein',\n\t'Pristina',\n\t'Snina',\n\t'Habaswein',\n\t'Joghtay',\n\t'Shimizucho',\n\t'Kotancheri',\n\t'Woodstock',\n\t'Falagueira',\n\t'Moorestown-Lenola',\n\t'San Juan Sacatepequez',\n\t'Rio do Sul',\n\t'Mirador',\n\t'Moba',\n\t'Hassi Khelifa',\n\t'Nossa Senhora Aparecida',\n\t'Ibiza',\n\t'Watauga',\n\t'Zemrane',\n\t'Santa Cruz Xoxocotlan',\n\t'Pilis',\n\t'Evian-les-Bains',\n\t'Beraketa',\n\t'Goldsboro',\n\t'Isulan',\n\t'Sundern',\n\t'Aikaranad',\n\t'Yola',\n\t'Sunderland',\n\t'Ouled Ben Abd el Kader',\n\t'Pakaur',\n\t'Antsirabe Avaratra',\n\t'Schofield Barracks',\n\t'Serang',\n\t'Lede',\n\t'Guernica',\n\t'Mostoles',\n\t'Villa Mercedes',\n\t'Carcar',\n\t'Beruniy',\n\t'Mariano Acosta',\n\t'Toin',\n\t'Kashikishi',\n\t'Dar Chabanne',\n\t'uMhlanga Rocks',\n\t'Mieres',\n\t'Chipurupalle',\n\t'Aranda',\n\t'Nacogdoches',\n\t'Benner',\n\t'Ahvaz',\n\t'Sint-Michiels',\n\t'Yamamoto',\n\t'Retie',\n\t'Pitman',\n\t'Bagabag',\n\t'Phalaborwa',\n\t'Couva',\n\t'Kheri Naru',\n\t'Bazidpur Madhaul',\n\t'Carlton Colville',\n\t'Al Mafraq',\n\t'Amasra',\n\t'Peruibe',\n\t'Cuarte de Huerva',\n\t'Labrador',\n\t'Bawshar',\n\t'Pirojpur',\n\t'Taraza',\n\t'Teminabuan',\n\t'Shimotsuke',\n\t'Garca',\n\t'Rifadpur',\n\t'Los Chiles',\n\t'Bhandarso',\n\t'Capurso',\n\t'Caetes',\n\t'Pajapita',\n\t'Puerto Real',\n\t'East York',\n\t'Teteven',\n\t'Coruche',\n\t'Wurzen',\n\t'Pescaria Brava',\n\t'Guzhou',\n\t'Stanwell',\n\t'Khanabad',\n\t'Xisa',\n\t'Guruzala',\n\t'Basla',\n\t'Sabana Larga',\n\t'Dom Feliciano',\n\t'Kuytun',\n\t\"L'Asile\",\n\t'Bokhtar',\n\t'Nazarabad',\n\t'Leticia',\n\t'Malang',\n\t'Ambohimiera',\n\t'Amjhar',\n\t'Veitshochheim',\n\t'Besana in Brianza',\n\t'Lynn',\n\t'Barura',\n\t'Statte',\n\t'Balchik',\n\t'Ottappidaram',\n\t'Afir',\n\t'Barleben',\n\t'Ashland',\n\t'Jirja',\n\t'Woodbridge',\n\t'Smithton',\n\t'Neustadt bei Coburg',\n\t'Hewitt',\n\t'Ulstein',\n\t'Nong Bua',\n\t'Piracanjuba',\n\t'New Mirpur',\n\t'Darabani',\n\t'Szolnok',\n\t'Nqutu',\n\t'Ii',\n\t'Glassmanor',\n\t'Eruvatti',\n\t'Magarao',\n\t'Sunam',\n\t'Sonaimukh',\n\t'Chapelle-lez-Herlaimont',\n\t\"Hai'an\",\n\t'Blaricum',\n\t'El Marsa',\n\t'Jutiapa',\n\t'Cihanbeyli',\n\t'Bershad',\n\t'La Mujer',\n\t'Sompting',\n\t'Lomas de Sargentillo',\n\t'Guacui',\n\t'Mpwapwa',\n\t'Sanhe',\n\t'Kampong Trach',\n\t'Govindgarh',\n\t'Weilmunster',\n\t'Hopkinsville',\n\t'Xicotencatl',\n\t'Crikvenica',\n\t'Faizabad',\n\t'Dehgolan',\n\t'Changji',\n\t'Obita',\n\t'Ottobrunn',\n\t'Pak Phanang',\n\t'Dongta',\n\t'Guaduas',\n\t'Clarksville',\n\t'Luxembourg',\n\t'Kut-e `Abdollah',\n\t'Puerto Penasco',\n\t'Hebli',\n\t'Locust Grove',\n\t'Lappeenranta',\n\t'Kizilcasar',\n\t'Terenos',\n\t'Kamen',\n\t'Barra de Santo Antonio',\n\t'Saint-Servan-sur-Mer',\n\t'Pinto',\n\t'Beverly Hills',\n\t'Rouyn-Noranda',\n\t'Joaquim Pires',\n\t'Wichelen',\n\t'Saint-Medard-en-Jalles',\n\t'Dibrugarh',\n\t'Gouvieux',\n\t'Schriesheim',\n\t'Taliwang',\n\t'Prachuap Khiri Khan',\n\t'Salida',\n\t'Dahivel',\n\t'Tanjung Selor',\n\t'Tabio',\n\t'Ilampillai',\n\t'Acaxochitlan',\n\t'West Donegal',\n\t'Marosakoa',\n\t'Coahuitlan',\n\t'Valasske Mezirici',\n\t'Mengmeng',\n\t'Umm ar Rizam',\n\t'Altindag',\n\t'Lewisburg',\n\t'Kamifurano',\n\t'Pune',\n\t'Miami Springs',\n\t'San Sebastian de Yali',\n\t'Berwick',\n\t'Quixada',\n\t'Wujindian',\n\t'Jiadong',\n\t'Bagnan',\n\t'Puke',\n\t'Bogazliyan',\n\t'Sertaozinho',\n\t'Beiya',\n\t'Pragadavaram',\n\t'Alarobia Bemaha',\n\t'Lara',\n\t'Pyryatyn',\n\t'Kantabanji',\n\t'Kodusseri',\n\t'Meiningen',\n\t'Fontainebleau',\n\t'Panapur',\n\t'Ulaangom',\n\t'Bihpur',\n\t'Bodinayakkanur',\n\t'Lins',\n\t'Helsingor',\n\t'Maryanaj',\n\t'New Kru Town',\n\t'Mococa',\n\t'Bab Ezzouar',\n\t'Ghazaouet',\n\t'Pulaski',\n\t'Grenchen',\n\t'East Riverdale',\n\t'Bourne',\n\t'Maqat',\n\t'Oliveirinha',\n\t'Deltona',\n\t'Vermillion',\n\t'Chotala',\n\t\"Hong'an\",\n\t'Houbu',\n\t'Furth',\n\t'Tchibanga',\n\t'Ishaka',\n\t'Namala Guimbala',\n\t'Aire-sur-la-Lys',\n\t'Shentang',\n\t'Guilford',\n\t'Oswaldtwistle',\n\t'Binga',\n\t'Birstall',\n\t'Kandukur',\n\t'Dunleary',\n\t'Majia',\n\t'Pamban',\n\t'Hata',\n\t'Mitchells Plain',\n\t'Blankenfelde',\n\t'Itoigawa',\n\t'Andriba',\n\t'Maghra',\n\t'Bugarama',\n\t'Urk',\n\t'Hoima',\n\t'Binbrook',\n\t'Manali',\n\t'Manevychi',\n\t'Gotzis',\n\t'Byala Slatina',\n\t'Capoocan',\n\t'Pepperell',\n\t'Ayr',\n\t'Saint-Jean-de-Braye',\n\t'Chungju',\n\t'Barobo',\n\t'Laamarna',\n\t'Mudichchur',\n\t'Madhyamgram',\n\t'Sefrou',\n\t'Haora',\n\t'Harlakhi',\n\t'Bremgarten',\n\t'Conselheiro Lafaiete',\n\t'Nanbei',\n\t\"'Ain Mabed\",\n\t'Koper',\n\t'Knowle',\n\t'Cerkno',\n\t'Perai',\n\t'Baghin',\n\t'Colne',\n\t'Kingsborough',\n\t'Mahagaon',\n\t'Chengguan',\n\t'Santa Eugenia',\n\t'Yuli',\n\t'Bad Rothenfelde',\n\t'Chongqing',\n\t'Aviles',\n\t'Gokhulapur',\n\t'Lokapur',\n\t'Menfi',\n\t'Kisvarda',\n\t'Sungai Guntung',\n\t'Ambolidibe Atsinanana',\n\t'Oberkirch',\n\t'Poteau',\n\t'Raleigh',\n\t'Ulongue',\n\t'Floresta Azul',\n\t'Migori',\n\t'Veracruz',\n\t'Roubaix',\n\t'Mariscal Jose Felix Estigarribia',\n\t'Sint-Michielsgestel',\n\t'Gering',\n\t'Yanchep',\n\t'Hof',\n\t'Villa Regina',\n\t'South Amboy',\n\t'Songkhla',\n\t'Barwah',\n\t'Stourbridge',\n\t'Bodegraven',\n\t'New Windsor',\n\t'Kubadupuram',\n\t'Lagoa dos Gatos',\n\t\"Pa'in Chaf\",\n\t'Allagadda',\n\t'Casilda',\n\t'Tarancon',\n\t'Adilabad',\n\t'Chakla Waini',\n\t'Sabadell',\n\t'Bekipay',\n\t'Tajimi',\n\t'Ciputat',\n\t'Oulad Khallouf',\n\t'Rajpur Kalan',\n\t'Ghadamis',\n\t'Nyaungdon',\n\t'Bimo',\n\t'Tena',\n\t'Kendall',\n\t'Muzaffarabad',\n\t'Tongren',\n\t'Vrbas',\n\t'Resende Costa',\n\t'Cherchell',\n\t'Namayingo',\n\t'Port Angeles',\n\t'Egersund',\n\t'Bhasaula Danapur',\n\t'Wavre',\n\t'Itariri',\n\t'Timbiras',\n\t'Mahajanga',\n\t'Lochearn',\n\t'Vestby',\n\t'Kulgo',\n\t'Mola di Bari',\n\t'Istrana',\n\t'Shangtianba',\n\t'Aue',\n\t'Kirchzarten',\n\t'Lanling',\n\t'Tuneri',\n\t'Montrouge',\n\t'Taslicay',\n\t'Choro',\n\t'Schio',\n\t'Diadema',\n\t'Rosstal',\n\t'Taohongpozhen',\n\t'Nueva Guadalupe',\n\t'Tacoma',\n\t'Mayyanad',\n\t'Botou',\n\t'Alfonso',\n\t'Bexley',\n\t'Marginea',\n\t'Alliance',\n\t'Davuluru',\n\t'Candiac',\n\t\"Hammam M'Bails\",\n\t'Corridonia',\n\t'Jaguarari',\n\t'Bouati Mahmoud',\n\t'Topeka',\n\t'Honiton',\n\t'Sambalpur',\n\t'Kalamner',\n\t'Tulua',\n\t'Baesweiler',\n\t'Chatra Gobraura',\n\t'Swanage',\n\t'Santa Magdalena',\n\t'Marrero',\n\t'Mizunami',\n\t'Bickley',\n\t'Ocala',\n\t'Dera Baba Nanak',\n\t'Reda',\n\t'Bourem Guindou',\n\t'Tagum',\n\t'Talata Ampano',\n\t'Poninguinim',\n\t'Bad Urach',\n\t'Alterosa',\n\t'Lake Hiawatha',\n\t'Rhosllanerchrugog',\n\t'Zirapur',\n\t'Bakixanov',\n\t'Scottburgh',\n\t'Laubach',\n\t'Bhakkar',\n\t'Bath',\n\t'Iztapa',\n\t'Kaabong',\n\t'Haiku-Pauwela',\n\t'Walthamstow',\n\t'Leiyang',\n\t'Silverton',\n\t'Hangzhou',\n\t'Namminikara',\n\t'Badr',\n\t'Ban Bang Rin',\n\t'Skydra',\n\t'Changting',\n\t'Bou Nouh',\n\t'Villorba',\n\t'Conceicao de Macabu',\n\t'Haldipur',\n\t'Chavakkad',\n\t'Artondale',\n\t'Isla Raton',\n\t'Taiyur',\n\t'Mel Bhuvanagiri',\n\t'Faratsiho',\n\t'Piso Firme',\n\t'Venlo',\n\t'Nules',\n\t'San Gaspar Ixchil',\n\t'London Colney',\n\t'Hesarghatta',\n\t'Gingee',\n\t'Shahpura',\n\t'Bhikhi',\n\t'Kamenice',\n\t'Amesbury',\n\t'Hanoi',\n\t'Davenport',\n\t'Bishunpur Sundar',\n\t'Oggiono',\n\t'Beinan',\n\t'Tsimasham',\n\t'Campos',\n\t'Chaponost',\n\t'Amondara',\n\t'Pariyari',\n\t'Brusque',\n\t'Coquimbo',\n\t'Promissao',\n\t'Malakoff',\n\t'Yunxian Chengguanzhen',\n\t'Baiao',\n\t'Tremelo',\n\t'Sesto Calende',\n\t'Pozega',\n\t'Liepaja',\n\t'Lonigo',\n\t'San Leonardo',\n\t'Gonabad',\n\t'Valdemoro',\n\t'Sikandra',\n\t'Vise',\n\t'Rybnik',\n\t'Hit',\n\t'Rosu',\n\t'Fengrenxu',\n\t'Barrie',\n\t'Adjud',\n\t'Manta',\n\t'Susuz',\n\t'Junin',\n\t'Lauda-Konigshofen',\n\t'Rocas de Santo Domingo',\n\t'Barjhar',\n\t'Kurdamir',\n\t'Prabumulih',\n\t'Miyazaki',\n\t'Menzel Kamel',\n\t'Micco',\n\t'Sankt Leon-Rot',\n\t'De Pinte',\n\t'Chanaral',\n\t'Abiko',\n\t'Carlos A. Carrillo',\n\t'Sarande',\n\t'Matoes',\n\t'Cholchol',\n\t'Gangarampur',\n\t'Aihua',\n\t'Yanggao',\n\t'Portalegre',\n\t'Falea',\n\t'Qapqal',\n\t'Gotenba',\n\t'Villanueva del Pardillo',\n\t'Boysun',\n\t'Bundu',\n\t'Jucas',\n\t'Abony',\n\t'Bahabad',\n\t'Paradarami',\n\t'Eerbeek',\n\t'Nyon',\n\t'Shannon',\n\t'Barreirinhas',\n\t'Manompana',\n\t'Fron',\n\t'Nathdwara',\n\t'Ganassi',\n\t'Korntal-Munchingen',\n\t'Tessenderlo',\n\t'Prescott',\n\t'Chivilcoy',\n\t'Juina',\n\t'Primero de Enero',\n\t'Campiglia Marittima',\n\t'Bharra',\n\t'Naju',\n\t'Halls Creek',\n\t'Sakawa',\n\t'Ain Temouchent',\n\t'Caimanera',\n\t'Mahao',\n\t'Zacatelco',\n\t'Perumuchchi',\n\t'Aberdeen',\n\t'Dentsville',\n\t'Lincoln Village',\n\t'Bou Hadjar',\n\t'Retiro',\n\t'Ouaouzgane',\n\t'Balrampur',\n\t'Iznik',\n\t'Coatepeque',\n\t'Dicle',\n\t'Phon',\n\t'Sanpaicun',\n\t'Zgornja Kungota',\n\t'Coulommiers',\n\t'Woodhaven',\n\t'Pirai',\n\t'Marana',\n\t'Benjamin Constant',\n\t'Kimpese',\n\t'Kashiba',\n\t'Vandithavalam',\n\t'Ar Ruseris',\n\t'Fusui',\n\t'Aalten',\n\t'Hiranai',\n\t'Kigumba',\n\t'Ocosingo',\n\t'Kotabommali',\n\t'Sugar Hill',\n\t'Covington',\n\t'Mielec',\n\t'Totness',\n\t'Ribeirao Preto',\n\t'Caotun',\n\t'Salaiya',\n\t'Karapurcek',\n\t'Hornchurch',\n\t'Hlyboka',\n\t'Azizpur Chande',\n\t'Sokhodewara',\n\t'Brus',\n\t'Dilovasi',\n\t'Manjathala',\n\t'Sabbah',\n\t'Sadiola',\n\t'Lomita',\n\t'Aveiro',\n\t'Kittur',\n\t'Rajpur',\n\t'Betsukai',\n\t'Shintomi',\n\t'Tahara',\n\t'Vuliyattara',\n\t'El Kelaa des Srarhna',\n\t'Gammarth',\n\t\"Sal'a\",\n\t'Kolin',\n\t'Ceel Dheere',\n\t'Magpet',\n\t'Tarhzirt',\n\t'Chateauguay',\n\t'Qovlar',\n\t'Gryfice',\n\t'Bokakhat',\n\t'Terrace',\n\t'Acajutiba',\n\t'Tefam',\n\t'Wolow',\n\t'Kuaidamao',\n\t'Punnayur',\n\t'Maliana',\n\t'Ouando',\n\t'Howell',\n\t'Kodarma',\n\t'Gines',\n\t'Douglas',\n\t'Werve',\n\t'Corfe Mullen',\n\t'Rayon',\n\t'Tequila',\n\t'Kozani',\n\t'Rafina',\n\t'Placido de Castro',\n\t'Mascara',\n\t'Pszczyna',\n\t'Hochheim am Main',\n\t'Babahoyo',\n\t'Tanglou',\n\t'Villagarcia de Arosa',\n\t'Sao Romao',\n\t'Izmir',\n\t'Kabwe',\n\t'Wulan',\n\t'Lake Charles',\n\t'Babhantoli',\n\t'Villaviciosa',\n\t'Doljevac',\n\t'Achchippatti',\n\t'Parasbani',\n\t'Agadez',\n\t'Yalluru',\n\t'Saumur',\n\t'Ambodiriana',\n\t'Panda',\n\t'Jadupatti',\n\t'Santo Domingo Este',\n\t'Manakambahiny',\n\t'Hajduhadhaz',\n\t'Kitamilo',\n\t'Shenwan',\n\t'Madattukkulam',\n\t'La Romana',\n\t'Glasgow',\n\t'Aars',\n\t'Niquelandia',\n\t'South Farmingdale',\n\t'Mangalia',\n\t'Kualaserba',\n\t'Flandes',\n\t'Veroli',\n\t'Ixtapan de la Sal',\n\t'Makarska',\n\t'Lakho',\n\t'Dhanur Kalyanwadi',\n\t'Castillo',\n\t'Jamui',\n\t'Mutyalapalle',\n\t'Karaikkudi',\n\t'Gogounou',\n\t'Kurumbapalaiyam',\n\t'Myrne',\n\t'Maroamalona',\n\t'Collado-Villalba',\n\t'Sikandarpur',\n\t'Olonne-sur-Mer',\n\t'Cambundi Catembo',\n\t'Vohimasina',\n\t'Chenango',\n\t'Muara Teweh',\n\t'Las Matas de Farfan',\n\t'Livermore',\n\t'West Columbia',\n\t'Anqiu',\n\t'Mumbai',\n\t'Ogijares',\n\t'Bethesda',\n\t'Wyndham',\n\t'Lake Shore',\n\t'Yuchi',\n\t'Jalandhar Cantonment',\n\t'Manevy',\n\t'Sao Jose do Rio Pardo',\n\t'Chimoio',\n\t'Dagami',\n\t'Sagarejo',\n\t\"Lin'an\",\n\t'Gobardhanpur Kanap',\n\t'Apple Valley',\n\t'Allauch',\n\t'Villafranca di Verona',\n\t'Yulin',\n\t'Herbolzheim',\n\t'Dolton',\n\t'Terebovlya',\n\t'Sri Madhopur',\n\t'Benifayo',\n\t'Valambur',\n\t'Sendrisoa',\n\t'Ranipur',\n\t'Media Luna',\n\t'Ocna Mures',\n\t'Kulundu',\n\t'Damdama',\n\t'Milagros',\n\t'Smithfield',\n\t'Lake Butler',\n\t'Ciudad Barrios',\n\t'Escuintla',\n\t'Cherry Hinton',\n\t'Solonytsivka',\n\t'Ribeirao Claro',\n\t'Balussheri',\n\t'Nanjikkottai',\n\t'Asela',\n\t'Martos',\n\t'Canto do Buriti',\n\t'Samalut',\n\t'Dhuburi',\n\t'Maltahohe',\n\t'Horst',\n\t'Bafang',\n\t'La Blanca',\n\t'Seraing',\n\t'Hedensted',\n\t'Chala',\n\t'Bou Salem',\n\t'Boralday',\n\t'Marktredwitz',\n\t'Neuenrade',\n\t'Muddada',\n\t'Serrinha',\n\t'Horizon West',\n\t'Machalpur',\n\t'Pathra',\n\t'Nelspruit',\n\t'Rankhandi',\n\t'Gaoniang',\n\t'Ohrid',\n\t'Conguaco',\n\t'Taylors',\n\t'Aqadyr',\n\t'Kirkop',\n\t'El Golea',\n\t'Slupsk',\n\t'Sawran',\n\t'Ansan',\n\t'Villa Dominico',\n\t'Kambia',\n\t'Sainte-Genevieve-des-Bois',\n\t'An Nuhud',\n\t'Samarkand',\n\t'Ringsaker',\n\t'Blangmangat',\n\t'Nuenen',\n\t'North Aurora',\n\t'Hoek van Holland',\n\t'Santa Cruz Cabralia',\n\t'Suvalan',\n\t'Phra Pradaeng',\n\t'Arnedo',\n\t'Pagsanjan',\n\t'Pietermaritzburg',\n\t'Weissenthurm',\n\t'Pebberu',\n\t'Kangazha',\n\t'Ancona',\n\t'Bou Noura',\n\t'Owensboro',\n\t'Catalina Foothills',\n\t'Alegre',\n\t'Douar Imoukkane',\n\t'Tirkadavur',\n\t'Washington Court House',\n\t'Colmenar Viejo',\n\t'Baikunthpur',\n\t'Sitrah',\n\t'Presidente Janio Quadros',\n\t'St. Louis Park',\n\t'Kempten',\n\t'Dergaon',\n\t'Pannaipuram',\n\t'Gifu',\n\t'Toul',\n\t'Sirakorola',\n\t'Vaals',\n\t'Barranca',\n\t'Elgoibar',\n\t'Kasamatsucho',\n\t'Ampitahana',\n\t'Totowa',\n\t'Mocoa',\n\t'Beni Slimane',\n\t'Bethany',\n\t'Ramdiri',\n\t'Bariadi',\n\t'Cofradia',\n\t'Tandil',\n\t'Bolton',\n\t'Sirat',\n\t'Uspenka',\n\t'Capim Branco',\n\t'Ozumba',\n\t'Dighawani',\n\t'Keonjhargarh',\n\t'Makurazaki',\n\t'Sada',\n\t'Sarmin',\n\t'Yamkanmardi',\n\t'Zhujiezhen',\n\t'Brampton',\n\t'Nynashamn',\n\t'Dawson Creek',\n\t'Analalava',\n\t'Dobrovnik',\n\t'Puxi',\n\t'Beni Tamou',\n\t'Damargidda',\n\t'San Casciano in Val di Pesa',\n\t'Springdale',\n\t'Luque',\n\t'Zara',\n\t'Dakit',\n\t'Urena',\n\t'Naduhatti',\n\t'General Jose de San Martin',\n\t'Raia',\n\t'Bhuj',\n\t'Tisnov',\n\t'Tekkekoy',\n\t'Faridpur',\n\t'Sao Vicente',\n\t'Bad Salzuflen',\n\t'Itororo',\n\t'Petersberg',\n\t'Castelsarrasin',\n\t'Madiama',\n\t'Voluntari',\n\t'Butaleja',\n\t'Carandai',\n\t'Arusha',\n\t'Strumica',\n\t'Quijingue',\n\t'Banovce nad Bebravou',\n\t'Huaibei',\n\t'Siswa',\n\t'Ansiao',\n\t'Baisa',\n\t'Kozuchow',\n\t'Mions',\n\t'Kenema',\n\t'Rajaudha',\n\t'Onga',\n\t'City of Calamba',\n\t'Buli',\n\t'Lokhvytsya',\n\t'Chak Thathi',\n\t'Qasr-e Qomsheh',\n\t'Wilson',\n\t'Tarawa',\n\t'Libjo',\n\t'Batocina',\n\t'Tajpur',\n\t'Kanyakulam',\n\t'Manzhouli',\n\t'Bougaa',\n\t'Kitzingen',\n\t'Fenoughil',\n\t'Dhanera',\n\t'Dhorgaon',\n\t'Abohar',\n\t'Zug',\n\t'Ghaura',\n\t'Aparecida do Taboado',\n\t'Zapotlanejo',\n\t'Natanz',\n\t'Guarda',\n\t'Chengara',\n\t'Tup',\n\t'Livani',\n\t'Sirsia Hanumanganj',\n\t'Qal`at al Madiq',\n\t'Tamarac',\n\t'South Miami',\n\t'Thung Sai',\n\t'Grodzisk Wielkopolski',\n\t'Jiutepec',\n\t'Nautanwa',\n\t'Grenada',\n\t'Nandod',\n\t'Helotes',\n\t'Nang Rong',\n\t'Makiivka',\n\t'Paxtaobod',\n\t'Susaki',\n\t'Fuso',\n\t'Tsawwassen',\n\t'Villeurbanne',\n\t'Ternopil',\n\t'Pandaul',\n\t'Nardo',\n\t'Puerto Aysen',\n\t'Marvdasht',\n\t'Funafuti',\n\t'Siraway',\n\t'El Milagro',\n\t'Dinapore',\n\t'Conisbrough',\n\t'Ban Duea',\n\t'Kawm Umbu',\n\t'Derhachi',\n\t'Setubinha',\n\t'Assis',\n\t'Shikarpur',\n\t'Hukumati Baghran',\n\t'Manuel Urbano',\n\t'Penacova',\n\t'Mishawaka',\n\t'Kremenchuk',\n\t'Salzkotten',\n\t'Sakai',\n\t'Ostercappeln',\n\t'Sebikhotane',\n\t'Mahatalaky',\n\t'Recanati',\n\t'Sainte-Foy-les-Lyon',\n\t'Hengshan',\n\t'Antonio Enes',\n\t'Adivala',\n\t'Odaipatti',\n\t'Aginiparru',\n\t'Sao Goncalo dos Campos',\n\t'Sagaing',\n\t'Anjad',\n\t'Jevargi',\n\t'Bastia',\n\t'General Tinio',\n\t'Kailua',\n\t'Fukutsu',\n\t'Nogata',\n\t'Park Forest',\n\t'Lolokhur',\n\t'Moengo',\n\t'Hermosillo',\n\t'Greencastle',\n\t'Pittsburgh',\n\t'Luuq',\n\t'Toluca',\n\t'Satgachia',\n\t'Nova Varos',\n\t'Tetovo',\n\t'Empalme',\n\t'Cherryland',\n\t'Ka-Bungeni',\n\t'Fernandopolis',\n\t'Oita',\n\t'Walnut',\n\t'Dalian',\n\t'Viersen',\n\t'Jyvaskylan Maalaiskunta',\n\t'Warragul',\n\t'Malaikkal',\n\t'Loule',\n\t'Honolulu',\n\t'Azalea Park',\n\t'Samba Cango',\n\t'Boblingen',\n\t'Istmina',\n\t'Southend',\n\t'Kallithea',\n\t'Khiria',\n\t'Huaral',\n\t'Mendota',\n\t'Upper Buchanan',\n\t'Damietta',\n\t'Porto Empedocle',\n\t'Santo Antonio do Ica',\n\t'Nunungan',\n\t'Naysar',\n\t'Pico Rivera',\n\t'Riano',\n\t'Snodland',\n\t'Sangre Grande',\n\t'Sun City',\n\t'Naunhof',\n\t'Fisciano',\n\t'Vedene',\n\t'Khawad',\n\t'Vernon',\n\t'Ahiro',\n\t'Chidambaram',\n\t'Chacabuco',\n\t'Elsdorf',\n\t'Chuhal',\n\t'Djelfa',\n\t'Qiryat Shemona',\n\t'Altamirano',\n\t'Cubellas',\n\t'Allonnes',\n\t'Aracaju',\n\t'Novi Knezevac',\n\t'Ikalamavony',\n\t'Staunton',\n\t'Mpophomeni',\n\t'Manombo Atsimo',\n\t'Madinat Hamad',\n\t'Guntramsdorf',\n\t'Elchuru',\n\t'Dongyang',\n\t'Gardony',\n\t'Taro',\n\t'Tablat',\n\t'Garulia',\n\t'Gopichettipalaiyam',\n\t'Raibari Mahuawa',\n\t'Tibba',\n\t'Taoyuan District',\n\t'Manavadar',\n\t'San Pedro Garza Garcia',\n\t'Amuntai',\n\t'Damua',\n\t'Desio',\n\t'Tomboutou',\n\t'Parlier',\n\t'Modasa',\n\t'Ubud',\n\t'Makan',\n\t'Vieux-Conde',\n\t'Maranga',\n\t'Acobamba',\n\t'Rugby',\n\t'Paramirim',\n\t'Nirgua',\n\t'Alto Paraiso de Goias',\n\t'Bandar Lampung',\n\t'Koumaira',\n\t'Sebt Ait Ikkou',\n\t'Vavuniya',\n\t'Grand Terrace',\n\t'Surajgarha',\n\t'Pedro Velho',\n\t'Lanzhou',\n\t'Tieli',\n\t'Jadia',\n\t'Mapanas',\n\t'Nangan',\n\t'Glazoue',\n\t'Villa Literno',\n\t'Qianshanhong Nongchang',\n\t'Paso de Carrasco',\n\t'Calliaqua',\n\t'Watertown Town',\n\t'Tasgaon',\n\t'China',\n\t'Yoshinogari',\n\t'Warora',\n\t'Castlebar',\n\t'Hezhou',\n\t'Tijuana',\n\t'Vilachcheri',\n\t'Tama',\n\t'Stony Brook',\n\t'Puurs',\n\t'Dam Dam',\n\t'Muktsar',\n\t'Wishaw',\n\t'Clay',\n\t'Hattula',\n\t'Marojala',\n\t'Aguas Belas',\n\t'Ogano',\n\t'Kattagaram',\n\t'Sulakyurt',\n\t'Mariveles',\n\t'Kavala',\n\t'Leavenworth',\n\t'Ambohitsimanova',\n\t'Lingsugur',\n\t'Delicias',\n\t'Xihuachi',\n\t'Kukarmunda',\n\t'Saruu',\n\t'Lwengo',\n\t'Bokod',\n\t'Andraitx',\n\t'Polanco',\n\t'Willowbrook',\n\t'Peddapalle',\n\t'Doddipatla',\n\t'Basco',\n\t'Bhimavaram',\n\t'Timoktene',\n\t'Tizi',\n\t'Mettet',\n\t'Matadi',\n\t'Xiaotangzhuang',\n\t'Guna',\n\t'Villaricca',\n\t'Pfedelbach',\n\t'Barud',\n\t'San Antonio del Monte',\n\t'Advi Devalpalli',\n\t'Nowy Dwor Gdanski',\n\t'Hsinchu',\n\t'Bad Kreuznach',\n\t'Pasaje',\n\t'Miluo Chengguanzhen',\n\t'Puyang Chengguanzhen',\n\t'Vasto',\n\t'Abarkuh',\n\t'West Plains',\n\t'Carazinho',\n\t'Vedi',\n\t'Port Maria',\n\t'Karratha',\n\t'Fes',\n\t'Ghulakandoz',\n\t'Porto Acre',\n\t'Jinzhong',\n\t'Thyolo',\n\t'Dien Bien Phu',\n\t'Panniyannur',\n\t'Banbhag',\n\t'Saint-Lambert',\n\t'Bhoj',\n\t'Salug',\n\t'Sobraon',\n\t'Reigate',\n\t'Colts Neck',\n\t'Salcaja',\n\t'Liesti',\n\t'Tianyingcun',\n\t'Maia',\n\t'Befeta',\n\t'Ina',\n\t'Sutherlin',\n\t'Saint-Brice-sous-Foret',\n\t'St. Louis',\n\t'Bistaria',\n\t'Nixa',\n\t'Boqueirao',\n\t'Khimlasa',\n\t'Munai',\n\t'Encinitas',\n\t'Citlaltepec',\n\t'Tokigawa',\n\t'Kalloni',\n\t'Sachse',\n\t'Huckeswagen',\n\t'Meric',\n\t'Ilkal',\n\t'Bawana',\n\t'Greetland',\n\t'Alcazar de San Juan',\n\t'Soltau',\n\t'Wahiawa',\n\t'Mogogelo',\n\t'Villerupt',\n\t'Carqueiranne',\n\t'Morohongo',\n\t'Hervey Bay',\n\t'Lakhna',\n\t'Mardin',\n\t'Lidingo',\n\t'Dar Chioukh',\n\t'Juncos',\n\t'Alliston',\n\t'Ilorin',\n\t'Arita',\n\t'Skara',\n\t'Progress Village',\n\t'Savelugu',\n\t'Khirpai',\n\t'Kamalnagar',\n\t'Mount Holly',\n\t'Vreed-en-Hoop',\n\t'Akcakale',\n\t'Vence',\n\t'Kurawar',\n\t'Seoul',\n\t'Novi Grad',\n\t'Kudamatsu',\n\t'Colina',\n\t'Kottagudem',\n\t'Tankal',\n\t'Kazarman',\n\t'East Orange',\n\t'Mulanur',\n\t'Sfizef',\n\t'Larvik',\n\t'Pawni',\n\t'San Juan de Vilasar',\n\t'Venmani',\n\t'Gentilly',\n\t'Picnic Point',\n\t'Beiwusidui',\n\t'Pakdasht',\n\t'Tatvan',\n\t'Ardmore',\n\t'Capela do Alto Alegre',\n\t'Rakai',\n\t'Yakouren',\n\t'Puerto Asis',\n\t'Shirali',\n\t'Adjumani',\n\t'Huite',\n\t'Indaiatuba',\n\t'Ouled Moussa',\n\t'Tamboril',\n\t'Kasimkota',\n\t'Iligan',\n\t'Stratton Saint Margaret',\n\t'Jiancheng',\n\t'Mungod',\n\t'Sremcica',\n\t'Sara',\n\t'Garrel',\n\t'Narela',\n\t'Meilan',\n\t'Martinsicuro',\n\t'Culaba',\n\t'Suez',\n\t'Villamaria',\n\t'Baytunya',\n\t'Oleshky',\n\t'Mogaung',\n\t'Twinsburg',\n\t'Casatenovo',\n\t'Sadda',\n\t'Shiyali',\n\t'Independencia',\n\t'Jinotepe',\n\t'Guilin',\n\t'Samal',\n\t'Gouda',\n\t'Tarui',\n\t'Sao Felipe',\n\t'Srivilliputtur',\n\t'Malmal',\n\t'Pembroke Dock',\n\t'Schwaikheim',\n\t'Beizhou',\n\t'Horw',\n\t'Gohi Bishunpur',\n\t'Taby',\n\t'Ramallo',\n\t'Woodcrest',\n\t'San Jacinto Amilpas',\n\t'Sundarsi',\n\t'Basildon',\n\t'Harasta',\n\t'Brislington',\n\t'Collingdale',\n\t'Brezice',\n\t'Xam Nua',\n\t'Ans',\n\t'Hardiya',\n\t'Linnich',\n\t'Varamin',\n\t'Asuncion Mita',\n\t'Dalgan',\n\t'Sahawar',\n\t'Jiutai',\n\t'Bruckmuhl',\n\t'Bingley',\n\t'Dundigal',\n\t'Somers',\n\t'Villas',\n\t'Ouro Branco',\n\t'Apora',\n\t'Miduturu',\n\t'Manambolosy',\n\t'Wuchuan',\n\t'Kasumbalesa',\n\t'Brent',\n\t'Balma',\n\t'Beidou',\n\t'Farim',\n\t'Dagmara',\n\t'Bijaipur',\n\t'Karera',\n\t'Amersfoort',\n\t'Gold',\n\t'Patilar',\n\t'Tweed Heads',\n\t'San Quintin',\n\t'Saloa',\n\t'Ruiming',\n\t'Sarayan',\n\t'Silver Springs Shores',\n\t'Vakon',\n\t'Ingenbohl',\n\t'Chetma',\n\t'Blacksburg',\n\t'Pondokaren',\n\t'Queimadas',\n\t'Encantado',\n\t'Tsubata',\n\t'Mers el Hadjad',\n\t'Northglenn',\n\t'Genc',\n\t'Lohiyar Ujain',\n\t'Ruoqiang',\n\t'Madera',\n\t'Santana do Cariri',\n\t'Ramamangalam',\n\t'Bangawan',\n\t'Emirdag',\n\t'Santa Fe Springs',\n\t'Cabucgayan',\n\t'Beaver Falls',\n\t'Cypress',\n\t'Glanmire',\n\t'Ipua',\n\t'Jaca',\n\t'Pueblo Viejo',\n\t'Kashiwa',\n\t'Dos Hermanas',\n\t'Ras Tanura',\n\t'Sidi Abdellah Ben Taazizt',\n\t'Badger',\n\t'Velingrad',\n\t'Velsen-Zuid',\n\t'Iscuande',\n\t'Ziro',\n\t'Charneca',\n\t'Tourlaville',\n\t'Loma Linda',\n\t'Sevran',\n\t'Eraniel',\n\t'Trece Martires City',\n\t'Franceville',\n\t'Coari',\n\t'Khairabad',\n\t'Bunhe',\n\t'Taguatinga',\n\t'Gilan-e Gharb',\n\t'Nyborg',\n\t'Kawagoe',\n\t'Pinheiral',\n\t'Bavaro',\n\t'Lisse',\n\t'Shuilou',\n\t'Paraty',\n\t'San Pedro Huamelula',\n\t'Bamber Bridge',\n\t'Port Huron',\n\t'Quba',\n\t'Ajacuba',\n\t'Lambarene',\n\t'Sikandarabad',\n\t'Chornobaivka',\n\t'Dores de Campos',\n\t'Wakoro',\n\t'Palomares del Rio',\n\t'Ankola',\n\t'Chibia',\n\t'Birmingham',\n\t'Antrim',\n\t'Kingsport',\n\t'Rockledge',\n\t'Carrillos',\n\t'Irig',\n\t'Denekamp',\n\t'Oberhaching',\n\t'Tisma',\n\t'Uriangato',\n\t'Tori-Cada',\n\t'Wolomin',\n\t'Montignies-le-Tilleul',\n\t'Des Moines',\n\t'Angeles City',\n\t'Morinville',\n\t'Zunyi',\n\t'Port Blair',\n\t'Daparkha',\n\t'Petrosani',\n\t'Lewes',\n\t'Douar Souk L`qolla',\n\t'Siaton',\n\t'Beyne-Heusay',\n\t'Padang',\n\t'Nova Kakhovka',\n\t'Assare',\n\t'Garh Sisai',\n\t'Ulster',\n\t'Magny-les-Hameaux',\n\t'Vallieres',\n\t'Garagoa',\n\t'Sungurlu',\n\t'Gadaul',\n\t'Taraclia',\n\t'Aden',\n\t'Grand Bourg',\n\t'Sao Francisco do Guapore',\n\t'Meruoca',\n\t'Oud-Beijerland',\n\t'Nitra',\n\t'Capoterra',\n\t'Tasikmalaya',\n\t'Cuevo',\n\t'Fruit Cove',\n\t'Le Teil',\n\t'Beur',\n\t'Bouskene',\n\t'Saint-Pierre',\n\t'Palitana',\n\t'Bourkika',\n\t'Jiquilisco',\n\t'Hassa',\n\t'Ixtapaluca',\n\t'Velyka Dymerka',\n\t'Kampli',\n\t'Caetano',\n\t'Luis Antonio',\n\t'Horgen',\n\t'Nalatvad',\n\t'Quime',\n\t'Betsiboka',\n\t'Rancheria Payau',\n\t'Dongxing',\n\t'Panagyurishte',\n\t'Soure',\n\t'Sinalunga',\n\t'Bhopatpur',\n\t'Tottington',\n\t'Zogno',\n\t'Alpinopolis',\n\t'Ibirite',\n\t'Talusan',\n\t'Mae Wang',\n\t'Prato',\n\t'Barvynkove',\n\t'Altavilla Vicentina',\n\t'Mussomeli',\n\t'Hilchenbach',\n\t'Agueda',\n\t'Botupora',\n\t'San Fernando',\n\t'Gallarate',\n\t'Balombo',\n\t'Philipsburg',\n\t'Oulad Aissa',\n\t'Brazzaville',\n\t'Tissaf',\n\t'Sanniquellie',\n\t'Zeist',\n\t'Turgutlu',\n\t'Ashikaga',\n\t'Seclin',\n\t'Actopan',\n\t'Accra',\n\t'Destelbergen',\n\t'Paiker',\n\t'Iowa Colony',\n\t'Muvattupula',\n\t'Springe',\n\t'Coqueiral',\n\t'Gmunden',\n\t'Perry Barr',\n\t'Cuneo',\n\t'Masur',\n\t'Calimera',\n\t'Diang',\n\t'Nacozari Viejo',\n\t'Jurmala',\n\t'Tsarasaotra',\n\t'Chon Thanh',\n\t'Dandenong',\n\t'Zutphen',\n\t'Bunawan',\n\t'Kottaram',\n\t'Majhgawan',\n\t'Macedonia',\n\t'Totogalpa',\n\t'Grand Junction',\n\t'Medfield',\n\t'Tolcayuca',\n\t'Santiago del Estero',\n\t'Ibague',\n\t'Caucaia',\n\t'Quartucciu',\n\t'Shangshan',\n\t'Roldan',\n\t'Tiddim',\n\t'El Bosque',\n\t'Mangapet',\n\t'Enfield Lock',\n\t'Paulo Afonso',\n\t'Golden Gate',\n\t'Del City',\n\t'Brandys nad Labem-Stara Boleslav',\n\t'Ambatomasina',\n\t'San Pascual',\n\t'Gothurutha',\n\t'Budapest',\n\t'El Hamel',\n\t'Vadakadu',\n\t'Casalpusterlengo',\n\t'Vardannapet',\n\t'Glucholazy',\n\t'Talkha',\n\t'Victoriaville',\n\t'Fengdeng',\n\t'Bhalki',\n\t\"Sao Jorge d'Oeste\",\n\t'Calaca',\n\t'Al `Awwamiyah',\n\t'Listowel',\n\t'Komenda',\n\t'Janiuay',\n\t'Copperas Cove',\n\t'Kovvali',\n\t'Cucer-Sandevo',\n\t'Birkat as Sab`',\n\t'Silaiyampatti',\n\t'Lianzhuangcun',\n\t'Arataca',\n\t'Natchez',\n\t'Guangyuan',\n\t'Ko Samui',\n\t'Hajduboszormeny',\n\t'Ambatondrazaka',\n\t'Akonolinga',\n\t'Barpeta',\n\t'Torrelodones',\n\t'Norrtalje',\n\t'Saurh',\n\t'Wohlen',\n\t'Felling',\n\t'Honjo',\n\t'Petare',\n\t'Proper Bansud',\n\t'Dendermonde',\n\t'Parauna',\n\t'Bibhutpur',\n\t'Sultepec',\n\t'Chiquinquira',\n\t'Lint',\n\t'Zhedao',\n\t'Santo Antonio de Padua',\n\t'Alburquerque',\n\t'Fuzuli',\n\t'Ocean Pines',\n\t'Atacames',\n\t'Francheville',\n\t\"Wadi Halfa'\",\n\t'Ninh Hoa',\n\t'Baiquan',\n\t'Antigua',\n\t'Bevata',\n\t'Xinpo',\n\t'Warkan',\n\t'Qibray',\n\t'Gisors',\n\t'Pa Mok',\n\t'Tabuleiro do Norte',\n\t'Melres',\n\t'Sangam',\n\t'Ostrhauderfehn',\n\t'Buritirama',\n\t'Oleksandriia',\n\t'Dongzhang',\n\t'Rio Preto da Eva',\n\t'Idupugallu',\n\t'Florida City',\n\t'Tobias Fornier',\n\t'Newquay',\n\t'Ivins',\n\t'Kotah-ye `Ashro',\n\t'Klaksvik',\n\t'Klaeng',\n\t'Vatutine',\n\t'Rignano Flaminio',\n\t'Soamahamanina',\n\t'Essex',\n\t'Arenzano',\n\t'Arbaoun',\n\t'Ain Kansara',\n\t'Stein',\n\t'Gleisdorf',\n\t'Ottaviano',\n\t'Lloret de Mar',\n\t'Sindos',\n\t'Lausanne',\n\t'Swadlincote',\n\t'Buffalo Grove',\n\t'Coelho Neto',\n\t'Msata',\n\t'Ciudad Cuauhtemoc',\n\t'Home Gardens',\n\t'Resen',\n\t'Khergam',\n\t'Neu Isenburg',\n\t'Kiato',\n\t'Mahina',\n\t'Keelung',\n\t'Mahiari',\n\t'Itambacuri',\n\t'Tsiatajavona-Ankaratra',\n\t'Sake',\n\t'Narrabri',\n\t'Popovaca',\n\t'Uruma',\n\t'Doha',\n\t'Ilaiyankudi',\n\t'Cabo Frio',\n\t'Mustang',\n\t'Kolbermoor',\n\t'Anahidrano',\n\t'Skikda',\n\t'Omurtag',\n\t'Maqu',\n\t'Mouscron',\n\t'Anchieta',\n\t'Pendembu',\n\t'Mokokchung',\n\t'Cestos City',\n\t'Oulad Zemam',\n\t'Beerse',\n\t'Solin',\n\t'Orani',\n\t'Itapira',\n\t'Elburg',\n\t'Pretoria',\n\t'Nishihara',\n\t'Siparia',\n\t'Fort Riley',\n\t'Dar Chaifat',\n\t'Khiria Jhansi',\n\t'Rezvanshahr',\n\t'Gacheta',\n\t'Rio Mayo',\n\t'Huainan',\n\t'Sarkisla',\n\t'Frias',\n\t'Msila',\n\t'Neumarkt',\n\t'Ajjanahalli',\n\t'Santa Maria Xadani',\n\t'Loikaw',\n\t'Gebze',\n\t\"Shin'onsen\",\n\t'Bhind',\n\t'Nakhon Si Thammarat',\n\t'Wangzhuang',\n\t'Ban Kao',\n\t'Barki Saria',\n\t'Wylie',\n\t'Birdsville',\n\t'Atoyac de Alvarez',\n\t'Bamberg',\n\t'Agourai',\n\t'Saavedra',\n\t'Gundelfingen',\n\t'Hunucma',\n\t'Ambohitrimanjaka',\n\t'San Pedro Necta',\n\t'Eeklo',\n\t'Gutalac',\n\t'Chankou',\n\t'Cerro Cora',\n\t'Gulfport',\n\t'Southaven',\n\t'Vemulapudi',\n\t'Pinal de Amoles',\n\t'Montgomery',\n\t'Conchali',\n\t'Cercola',\n\t'Baependi',\n\t'Urgup',\n\t'Qurayyat',\n\t'Ban Si Don Chai',\n\t'Duyun',\n\t'Gentio do Ouro',\n\t'Detroit Lakes',\n\t'Muna',\n\t'Pine Lake Park',\n\t'Omerli',\n\t'Ambatondrakalavao',\n\t'Las Cabras',\n\t'Dueville',\n\t'Darjeeling',\n\t'Los Gatos',\n\t'Poa',\n\t'Keren',\n\t'Jiajin',\n\t'Vogosca',\n\t'Radece',\n\t'Damonojodi',\n\t'Khurda',\n\t'Surallah',\n\t'Johor Bahru',\n\t'Cuervos',\n\t'Brixton',\n\t'Kasap',\n\t'San Juan La Laguna',\n\t'Dambai',\n\t'Marantao',\n\t'Aguazul',\n\t'Teoloyucan',\n\t'Munnar',\n\t'Madhopur Hazari',\n\t'Yaotsu',\n\t'Le Ray',\n\t'Segbwema',\n\t'La Apartada',\n\t'Vitrolles',\n\t'Amtali',\n\t'Neston',\n\t'Portage La Prairie',\n\t'Taytay',\n\t'Barahbatta',\n\t'Tiorpara',\n\t'Hajira',\n\t'As Sabburah',\n\t'Krynica',\n\t'East Rutherford',\n\t'Stovring',\n\t'Andernach',\n\t'Levski',\n\t'Vihiga',\n\t'Kadikkad',\n\t'Husepur',\n\t'Nokha',\n\t'Santa Isabel do Ivai',\n\t'Bithar',\n\t'Gaziemir',\n\t'Manapparai',\n\t'Sinait',\n\t'Brandfort',\n\t'Ibaraki',\n\t'General San Martin',\n\t'Parma Heights',\n\t'Yoshiwara',\n\t'Mudanya',\n\t'Bafq',\n\t'Mikolow',\n\t\"Chang'an\",\n\t'Chota',\n\t'Kesbewa',\n\t'Sinacaban',\n\t'Ambarawa',\n\t'Molodohvardiisk',\n\t'Herat',\n\t'Sakaidecho',\n\t'Honefoss',\n\t'Handan',\n\t'Clydebank',\n\t'Glenpool',\n\t'Uman',\n\t'San Biagio di Callalta',\n\t'Ocean City',\n\t'Qiryat Yam',\n\t'Baldwin',\n\t'Sweden',\n\t'Soavina',\n\t'Hugo',\n\t'Tra Vinh',\n\t'Taibet',\n\t'Turi',\n\t'Agua Blanca Iturbide',\n\t'Cherasco',\n\t'Parun',\n\t'Cedar Hills',\n\t'Arugollu',\n\t'Puduppattanam',\n\t'Monki',\n\t'Dorog',\n\t'Tissamaharama',\n\t'Seffner',\n\t'Tongchuan',\n\t'Nethirimangalam',\n\t'Ambalanirana',\n\t'Torbat-e Jam',\n\t'Balangkayan',\n\t'Malazgirt',\n\t\"Uchtepa Qishlog'i\",\n\t'Les Anglais',\n\t'Sing Buri',\n\t'Zhaoxiang',\n\t'Porta Westfalica',\n\t'Kajur',\n\t'Casa Grande',\n\t'Nkoteng',\n\t'Pasca',\n\t'Merefa',\n\t'Perols',\n\t'Ellensburg',\n\t'Mannukara',\n\t'Rum',\n\t'Moglingen',\n\t'Tendrara',\n\t'Traiskirchen',\n\t'Dialoube',\n\t'Poona-Piagapo',\n\t'Orthez',\n\t'Hollinwood',\n\t'Ferryhill',\n\t'Heerhugowaard',\n\t'Bad Soden-Salmunster',\n\t'Twin Falls',\n\t'Imamoglu',\n\t'Gartringen',\n\t'Vaudreuil-Dorion',\n\t'Chonthrhu',\n\t'Aberbargoed',\n\t'Langar',\n\t'Cabarroguis',\n\t'Anakapalle',\n\t'Geraldton',\n\t'Seara',\n\t'Guasca',\n\t'Ban Mae Sun Luang',\n\t'Sankt Johann in Tirol',\n\t'Musselburgh',\n\t'Nave',\n\t'Bhola',\n\t'Mansehra',\n\t'Villa Sarmiento',\n\t'Sao Bento do Una',\n\t'Balasan',\n\t'Bocana de Paiwas',\n\t'Costesti',\n\t'Podu Iloaiei',\n\t'Jaitpura',\n\t'Rio Colorado',\n\t'Villa Nueva',\n\t'Tlaquepaque',\n\t'Sutton on Hull',\n\t'Radomyshl',\n\t'Muttanampalaiyam',\n\t'Elon',\n\t'Great Falls',\n\t'Al `Amirat',\n\t'Ganzhu',\n\t'Machachi',\n\t'Lehututu',\n\t'Ambohimierambe-Andranofito',\n\t'Singur',\n\t'Lagindingan',\n\t'Bocaina',\n\t'Siguatepeque',\n\t'Jalalkhera',\n\t'Santa Lucija',\n\t'Colmeia',\n\t'Aneho',\n\t'Beterou',\n\t'Mont-Organise',\n\t'Cabanas',\n\t'Leduc',\n\t'Euxton',\n\t'Trebinje',\n\t'Patri',\n\t'Ostrava',\n\t'Bay Shore',\n\t'Ghatkesar',\n\t'Gia Nghia',\n\t'University Heights',\n\t'Montigny-les-Metz',\n\t'Pipraun',\n\t'Villa de Cura',\n\t'Polokwane',\n\t'Daloa',\n\t'Souma',\n\t'Cerea',\n\t'Gracanice',\n\t'Anteza',\n\t'Dedza',\n\t'Hilsea',\n\t'Koduvalli',\n\t'Katravulapalle',\n\t'Nembro',\n\t'Wanlaweyn',\n\t'Sardulgarh',\n\t'Hatibanda',\n\t'Khizrpur',\n\t'Sailana',\n\t'Holbrook',\n\t'Horwich',\n\t'Motibennur',\n\t'Kenner',\n\t'Bugallon',\n\t'Angermunde',\n\t'Boguszow-Gorce',\n\t'Motomiya',\n\t'Nanzhuangzhen',\n\t'Tangxing',\n\t'Tamanrasset',\n\t'Brasileia',\n\t'Canandaigua',\n\t'Gardez',\n\t'Qorasuv',\n\t'Halemba',\n\t'Biandanshan',\n\t'Mauleon',\n\t'Komarno',\n\t'Husi',\n\t'Ngaoundal',\n\t'Ferreiros',\n\t'Gatunda',\n\t'Aioi',\n\t'Jainagar',\n\t'Longyan',\n\t'Mocimboa',\n\t'Central Point',\n\t'Machadodorp',\n\t'Niesky',\n\t'Trets',\n\t'Kajang',\n\t'Tuxpan',\n\t'Anosy Avaratra',\n\t'Novhorod-Siverskyi',\n\t'Zhenjiang',\n\t'Srungavarapukota',\n\t'San Sebastian de la Gomera',\n\t'Frankston',\n\t'Ninga',\n\t'Morauna',\n\t'Saginaw',\n\t'Kussnacht',\n\t'Lerida',\n\t'Silchar',\n\t'Thakurainia',\n\t'Wote',\n\t'Riom',\n\t'Khachrod',\n\t'Takizawa',\n\t'Psychiko',\n\t'Niasso',\n\t'Rio das Pedras',\n\t'La Maquina',\n\t'Kaguchi',\n\t'San Fabian',\n\t'Devarapalle',\n\t'Nahiyat Ghammas',\n\t'Tlapacoyan',\n\t'Debe',\n\t'Santa Maria de Itabira',\n\t'Ifigha',\n\t'Neduvattur',\n\t'Monteprandone',\n\t'San Pedro Perulapan',\n\t\"Bou'nane\",\n\t'Ponnagyun',\n\t'Guaicara',\n\t'Krivogastani',\n\t'Ino',\n\t'Stupava',\n\t'New Mills',\n\t'Ankadimanga',\n\t'Liaoyang',\n\t'Chittaurgarh',\n\t'Bim Son',\n\t'Cullera',\n\t'Blackburn',\n\t'Great Driffield',\n\t'Mukacheve',\n\t'Warka',\n\t'Villers-la-Ville',\n\t'Gavarr',\n\t'Khrustalnyi',\n\t'Easley',\n\t'Caykara',\n\t'Woudenberg',\n\t'Kismaayo',\n\t'Chojnice',\n\t'Holladay',\n\t'Leiderdorp',\n\t'Reading',\n\t'Evansville',\n\t'Bamaiya Harlal',\n\t'Johns Creek',\n\t'Qo`qon',\n\t'Tambaga',\n\t'Kouande',\n\t'Sapang Dalaga',\n\t'Rocafuerte',\n\t'Curepipe',\n\t'Jabuticabal',\n\t'Hasroun',\n\t'Nishinoomote',\n\t'Salemi',\n\t'Bailongqiaocun',\n\t'Niefern-Oschelbronn',\n\t'Jablah',\n\t'Susa',\n\t'Ortuella',\n\t'Bitonto',\n\t'Karadge',\n\t'Quelimane',\n\t'Pirthipur',\n\t'Crisopolis',\n\t'Venosa',\n\t'Anantapur',\n\t'Grajau',\n\t'Idah',\n\t'Sidlice',\n\t'Middle Smithfield',\n\t'Kanie',\n\t'Khari',\n\t'Patnagarh',\n\t'Tamentit',\n\t'Ciudad Valles',\n\t'Kampen',\n\t'Madangir',\n\t'Swidwin',\n\t'Analaroa',\n\t'Cayirli',\n\t'Cernay',\n\t'Houghton Regis',\n\t'Redon',\n\t'Belchatow',\n\t'Maktar',\n\t'Belagal',\n\t'Chikkarampalaiyam',\n\t'Novato',\n\t'Notre-Dame-de-Gravenchon',\n\t'Wuustwezel',\n\t'Palaiyampatti',\n\t'Kandanur',\n\t'Nahavand',\n\t'Tokushima',\n\t'Sandakan',\n\t'Avidha',\n\t'Chaital',\n\t'Shri Mahavirji',\n\t'Tashir',\n\t'Taghbalt',\n\t'Cottage Grove',\n\t'Paso de los Toros',\n\t'Ilicinia',\n\t\"Monteforte d'Alpone\",\n\t'Helleland',\n\t'Corcuera',\n\t'Goa',\n\t'Oqqo`rg`on',\n\t'Chalco',\n\t'Chorwad',\n\t'Jhenida',\n\t'Triesen',\n\t'Ban Don Kaeo',\n\t'Nova Prata',\n\t'Pyrzyce',\n\t'Sogod',\n\t'Kilindoni',\n\t'Condega',\n\t'Qatana',\n\t'Nuth',\n\t'Ban Phru',\n\t'Kiiminki',\n\t'Antanandehibe',\n\t'La Concordia',\n\t'Guilherand',\n\t'Antsiranana',\n\t'Mersch',\n\t'Al Awjam',\n\t'Selouane',\n\t'Coronda',\n\t'Oregon City',\n\t'Bordj Zemoura',\n\t'Alwarkurichchi',\n\t'Kangasala',\n\t'Sonada',\n\t'Burdur',\n\t'Lollar',\n\t'Bethel Park',\n\t'Higashiagatsuma',\n\t'Gandujie',\n\t'Talugtug',\n\t'Cocotitlan',\n\t'Cassano al Ionio',\n\t'New Hamburg',\n\t'Jacobina',\n\t'Tourougoumbe',\n\t'Ribeiropolis',\n\t'Midsomer Norton',\n\t'Gretz-Armainvilliers',\n\t'Nagqu',\n\t'Sunnyvale',\n\t'Canberra',\n\t'Rupana',\n\t'Owosso',\n\t'Sao Jose do Norte',\n\t'Mantaly',\n\t'Socota',\n\t'Cape St. Claire',\n\t'Lepakshi',\n\t'Rounia',\n\t'Tavira',\n\t'Qazyan',\n\t'Chettipulam',\n\t'Grantsville',\n\t'Nagarote',\n\t'Baras',\n\t'Ashaiman',\n\t'Birendranagar',\n\t'West Allis',\n\t'Ouricuri',\n\t'Sarzana',\n\t'Vallegrande',\n\t'El Kseur',\n\t'Assenede',\n\t'Chitauria',\n\t'Steinheim',\n\t'Amsterdam',\n\t'Goth Tando Sumro',\n\t'Santa Cruz Itundujia',\n\t'Cartago',\n\t'Nandaime',\n\t'Andes',\n\t'Dialakorodji',\n\t'Schulzendorf',\n\t'Bantacan',\n\t'Calarasi',\n\t\"Ra's Gharib\",\n\t'East Lake-Orient Park',\n\t'Baitoa',\n\t'Ormesson-sur-Marne',\n\t'El`ad',\n\t'Campechuela',\n\t'Shiotacho-matsusaki',\n\t'Kankaanpaa',\n\t'Ronda',\n\t'Urucuia',\n\t'Morlaix',\n\t'Satwar',\n\t'Bethel',\n\t'Corvallis',\n\t'Yinchuan',\n\t'Talavera',\n\t'Shahriston',\n\t'Royston',\n\t'Bexbach',\n\t'Vilangudi',\n\t'Brinkmann',\n\t'Hellendoorn',\n\t'Imi-n-Tanout',\n\t'South Hayling',\n\t'Schroeder',\n\t'Petrovka',\n\t'Zouerate',\n\t'Bingen am Rhein',\n\t'Bovenden',\n\t'Biri',\n\t'Teaneck',\n\t'Yvoir',\n\t'Santa Eulalia del Rio',\n\t'Rolleston',\n\t'Badantola',\n\t'Waimea',\n\t'Muzo',\n\t'Staro Nagoricane',\n\t'Paranhos',\n\t'Neustrelitz',\n\t'Paouignan',\n\t'Oakashicho',\n\t'Iygli',\n\t'Rangra',\n\t'Sassenage',\n\t'Lommedalen',\n\t'Giyon',\n\t'Conroe',\n\t'Upperu',\n\t'Qorao`zak',\n\t'Lingal',\n\t'Jasien',\n\t'Nonoichi',\n\t'Al Bardiyah',\n\t'Arrentela',\n\t'Saharsa',\n\t'Kalwakurti',\n\t'Lakeland North',\n\t'Bad Ems',\n\t'Quibaxi',\n\t'Huskvarna',\n\t'Bihac',\n\t\"'Ain Naga\",\n\t'Euclides da Cunha',\n\t'East Grinstead',\n\t'Koneurgench',\n\t'Calauag',\n\t'Kiangan',\n\t'Mill Valley',\n\t'Turpan',\n\t'Cacimbinhas',\n\t'Urucuca',\n\t'Anouvong',\n\t'Kunimedu',\n\t'Islamabad',\n\t'Chahar Borj-e Qadim',\n\t'Maribor',\n\t'Ilgin',\n\t'Mount Lavinia',\n\t'Tsukumiura',\n\t'Aix-en-Provence',\n\t'Ipaporanga',\n\t'Pokotylivka',\n\t'Nazipur',\n\t'Tebingtinggi',\n\t'Wenzenbach',\n\t'Solingen',\n\t'Beveren',\n\t'Koszalin',\n\t'Ticul',\n\t'Kuroishi',\n\t'Marialva',\n\t'Auria',\n\t'Raffadali',\n\t'Kumagaya',\n\t'Ruppichteroth',\n\t'Dougoufe',\n\t'Dompu',\n\t'Petrus Steyn',\n\t'Lattes',\n\t'Raalte',\n\t'Taungdwingyi',\n\t'Guixi',\n\t'Ganta',\n\t'Schonwalde-Siedlung',\n\t'Ifatsy',\n\t'Baroda',\n\t'Los Andes',\n\t'Zhaitangcun',\n\t'Simraungadh',\n\t'Fada',\n\t'Moldova Noua',\n\t'Sankt Andra',\n\t'Ica',\n\t'Ngora',\n\t'Robbah',\n\t'Rahiar Kunchi',\n\t'Ouatagouna',\n\t'Benavente',\n\t'Suluru',\n\t'Burstadt',\n\t'Hindoli',\n\t'Santa Maria Petapa',\n\t'Sanana',\n\t'Mangidy',\n\t'Buldan',\n\t'Ustrzyki Dolne',\n\t'Bouznika',\n\t'Florstadt',\n\t'Santiago Papasquiaro',\n\t'Sirur Tajband',\n\t'Ottumwa',\n\t'Terralba',\n\t'Henrietta',\n\t'Adrar',\n\t'Koni',\n\t'Cardonal',\n\t'Haskah Menah',\n\t'Dawmat al Jandal',\n\t'Salzgitter',\n\t'Shikharpur',\n\t'So-Awa',\n\t'Baghmari',\n\t\"'Ain Arnat\",\n\t'Gojra',\n\t'Majidpur',\n\t'Cayeli',\n\t'Bouansa',\n\t'Barhi',\n\t'New Amsterdam',\n\t'Ibigawa',\n\t'Schwarzenberg',\n\t'Darling',\n\t'Borgaon',\n\t'Daudnagar',\n\t'Kitsuki',\n\t'Fairfax',\n\t'Mannarakkat',\n\t'Oberasbach',\n\t'Murphy',\n\t'Laurentides',\n\t'Manjha',\n\t'Kobo',\n\t'Kameoka',\n\t'Bafut',\n\t'Krasyliv',\n\t'Saiha',\n\t'Edinburgh',\n\t'Kishkenekol',\n\t'Leyton',\n\t'Isiolo',\n\t'Maibog',\n\t'Chiranellur',\n\t'Athens',\n\t'Sampit',\n\t'Ak-Suu',\n\t'Toulal',\n\t'Rangia',\n\t'Morton Grove',\n\t'Kaithinia',\n\t'Antipolo',\n\t'Tabant',\n\t'Starachowice',\n\t'Al Yadudah',\n\t'Zonguldak',\n\t'Piaseczno',\n\t'Nirna',\n\t'Mitrovice',\n\t'Plainfield',\n\t'Wheat Ridge',\n\t'Oakbrook',\n\t'Yahualica de Gonzalez Gallo',\n\t'Drimmelen',\n\t'Campo de la Cruz',\n\t'El Roble',\n\t'Umarga',\n\t'Mqam at Tolba',\n\t'Consett',\n\t'Ponders End',\n\t'Mount Lebanon',\n\t'Harima',\n\t'Marquette-les-Lille',\n\t'Spata',\n\t'Panaon',\n\t'Viravada',\n\t'Juazeiro do Norte',\n\t'Tieling',\n\t'Montemorelos',\n\t'Manggar',\n\t'Scicli',\n\t'Gorlice',\n\t'Rong Kwang',\n\t'Mill Creek',\n\t'Rivne',\n\t'Linamon',\n\t'Creazzo',\n\t'Moody',\n\t'Patnanungan',\n\t'Qasr al Qarabulli',\n\t'Leingarten',\n\t'Saqultah',\n\t'Farob',\n\t'Chinju',\n\t'Bartolome Maso',\n\t'Pedreguer',\n\t'Kuldiga',\n\t'San Bernardo del Viento',\n\t'Kushiro',\n\t'Maha Sarakham',\n\t'Campbell River',\n\t'Balaxani',\n\t'Kilakkurichchi',\n\t'Uitenhage',\n\t'Tudela de Duero',\n\t'Brianka',\n\t'Garkha',\n\t'Kassel',\n\t'Avigliana',\n\t'Herk-de-Stad',\n\t'Kassama',\n\t'Al Jubayl',\n\t'Longavi',\n\t'Ugamedi',\n\t'Leutkirch im Allgau',\n\t'Lambeth',\n\t'Koduman',\n\t'Bais',\n\t\"Petite Riviere de l'Artibonite\",\n\t'Presidencia Roque Saenz Pena',\n\t'Bad Munder am Deister',\n\t'Kottadindulu',\n\t'Thorigny-sur-Marne',\n\t'Tinkoni',\n\t'Bilacari',\n\t'Madruga',\n\t'Chula Vista',\n\t'Strzelce Opolskie',\n\t'Chalgeri',\n\t'Teningen',\n\t'Cumanda',\n\t'Ankilivalo',\n\t'Arica',\n\t'Mabacun',\n\t'Agios Dimitrios',\n\t'Pihuamo',\n\t'Bithlo',\n\t'Lititz',\n\t'Barth',\n\t'Nkhotakota',\n\t'Castellammare del Golfo',\n\t'Tearce',\n\t'Jinzhou',\n\t'Mahaditra',\n\t'Nelkattumseval',\n\t'Marinilla',\n\t'Taguai',\n\t'Ambohidronono',\n\t'Ansfelden',\n\t'Angus',\n\t'Chintalapalli',\n\t'Piedra Blanca',\n\t'Prenzlau',\n\t'San Manuel Chaparron',\n\t'Grantham',\n\t'Atyra',\n\t'Cornwall',\n\t'Conselice',\n\t'Brasilia',\n\t'Igarape Grande',\n\t'Toplita',\n\t'Malaimbandy',\n\t'Kasane',\n\t'Villa Ocampo',\n\t'Simarwara Durgapur',\n\t'Piripa',\n\t'Giza',\n\t'Xianyang',\n\t'Rodas',\n\t'Canal Winchester',\n\t'Vashon',\n\t'Pully',\n\t'Venice',\n\t'Miantsoarivo',\n\t'Rio Cauto',\n\t'Shahjanpur',\n\t'Motala',\n\t\"'Ain Azel\",\n\t'Taebaek',\n\t'Mankato',\n\t'Sevres',\n\t'Sarangani',\n\t'Berndorf',\n\t'Paratinga',\n\t'Floral Park',\n\t'Santa Catalina',\n\t'Greenacres',\n\t'Verviers',\n\t'Deoni Buzurg',\n\t'Lantapan',\n\t'Brakpan',\n\t'Santa Ana Chiautempan',\n\t'Chamtha',\n\t'Umarkhed',\n\t'Chai Nat',\n\t'Willingboro',\n\t'Licab',\n\t'Esquel',\n\t'Santiago Tuxtla',\n\t'Suran',\n\t'Mazenod',\n\t'Holmdel',\n\t'Saguiaran',\n\t'Nidadavole',\n\t'Santa Rosa de Calamuchita',\n\t'Malkanur',\n\t'Avaniyapuram',\n\t'Saktipur',\n\t'Lynnfield',\n\t'Orange Park',\n\t'Lanuvio',\n\t'Magna',\n\t'Hanumangarh',\n\t'Ashmun',\n\t'Ayirapuram',\n\t'Viale',\n\t'Andarai',\n\t'Falesti',\n\t'Soverato Marina',\n\t'Loeches',\n\t'Ibirataia',\n\t'Chester-le-Street',\n\t'Gouna',\n\t'Azeffoun',\n\t'Burlingame',\n\t'Crest',\n\t'Flowood',\n\t'Lupane',\n\t'Iferhounene',\n\t'Eravattur',\n\t'Mayaguez',\n\t'Butte',\n\t'Azangaro',\n\t'Viladecans',\n\t'Argenta',\n\t'Rauma',\n\t'Khombole',\n\t'Trstenik',\n\t'Kiryu',\n\t'Mambusao',\n\t'Tan Uyen',\n\t'Yazoo City',\n\t'Turnisce',\n\t'Navolato',\n\t'San Giustino',\n\t'Lice',\n\t'Antsambahara',\n\t'Nagahama',\n\t'Herndon',\n\t'Phibun Mangsahan',\n\t'Lushnje',\n\t'Wanaque',\n\t'Chuncheon',\n\t'Thomassique',\n\t'Havza',\n\t'Wellington',\n\t'Nagato',\n\t'Aucamville',\n\t'Corupa',\n\t\"Ra's al Khafji\",\n\t'Novi Ligure',\n\t'Isnos',\n\t'Taiyong',\n\t'Beigangwa',\n\t'Greymouth',\n\t'Sevilla',\n\t'Beech Grove',\n\t'Viry-Chatillon',\n\t'Bogdanci',\n\t'Hillsdale',\n\t'Pao de Acucar',\n\t'Fuqing',\n\t'Oderzo',\n\t'Osterholz-Scharmbeck',\n\t'Saint-Maurice',\n\t'Puluvappatti',\n\t'Kabala',\n\t'Marchtrenk',\n\t'Lorch',\n\t'Kamtaul',\n\t'San Rafael Pie de la Cuesta',\n\t'La Puente',\n\t'San Andres',\n\t'Robore',\n\t'Baladharmaram',\n\t'Breza',\n\t'Rio del Mar',\n\t'Bocas del Toro',\n\t'Gorleston-on-Sea',\n\t'Fair Oaks',\n\t'Rapallo',\n\t'Villahermosa',\n\t'Kalappatti',\n\t'Wilmington Island',\n\t'San Francisco Menendez',\n\t'Champahati',\n\t'Baden',\n\t'Maxaranguape',\n\t'Macas',\n\t'Rio Tinto',\n\t'Ingre',\n\t'Teroual',\n\t'Nikki',\n\t'Bir Tam Tam',\n\t'Myrtle Grove',\n\t'Wuxi',\n\t'Si Mustapha',\n\t'Rundu',\n\t'Bar Bigha',\n\t'Iriba',\n\t'Jebba',\n\t'Mohanpur Gaughata',\n\t'Fetromby',\n\t'Halwara',\n\t'Carignano',\n\t'Eagan',\n\t'Bambari',\n\t'Lachhmipur',\n\t'Khemis Miliana',\n\t'Candeias',\n\t'Nioro du Rip',\n\t'San Andres de la Barca',\n\t'San Juan Nepomuceno',\n\t'Knightdale',\n\t'Marano Vicentino',\n\t'Cergy',\n\t\"Ping'anbao\",\n\t'Zhovti Vody',\n\t'Saalfelden am Steinernen Meer',\n\t'Lubumbashi',\n\t'Oxkutzkab',\n\t'Conakry',\n\t'Puenteareas',\n\t'Gotsucho',\n\t'Sohna',\n\t'Morehead City',\n\t'Lingshou',\n\t'Antotohazo',\n\t'Ceadir-Lunga',\n\t'Apucarana',\n\t'Ihosy',\n\t'Oulad Barhil',\n\t'Turkoglu',\n\t'Progreso',\n\t'Oued el Aneb',\n\t'Kendall West',\n\t'Kignan',\n\t'Camborne',\n\t'Bagha Purana',\n\t'Meskiana',\n\t'Do Gonbadan',\n\t'Geesthacht',\n\t'Lodja',\n\t'Winterthur',\n\t'Taketa',\n\t'Maple Heights',\n\t'Kelangah',\n\t'Stary Sacz',\n\t'Chaplynka',\n\t'Carlos Chagas',\n\t'Metlaoui',\n\t'Ciudad de Huitzuco',\n\t'Ranod',\n\t'Clevelandia',\n\t'Alabat',\n\t'Belovodskoe',\n\t'Arriaga',\n\t'Sandy Hook',\n\t'Sainte-Agathe-des-Monts',\n\t'Guacara',\n\t\"Quan'ancun\",\n\t'Arques',\n\t'Nenmem',\n\t'Gravatal',\n\t'Saidabad',\n\t'Kolasin',\n\t'Merritt Island',\n\t'Jieshou',\n\t'Hvalba',\n\t'Maglaj',\n\t'Favara',\n\t'Elk Grove Village',\n\t'Oppeano',\n\t'Budai',\n\t'Novi',\n\t'Tambe',\n\t'Balungao',\n\t'Bocaranga',\n\t'Pickering',\n\t'Turuttiyad',\n\t'Fihaonana',\n\t'Kidira',\n\t'Hopkins',\n\t'Vitoria-Gasteiz',\n\t'Harpur',\n\t'Sibundoy',\n\t'El Kouif',\n\t'Furth im Wald',\n\t'Vazhani',\n\t'Mississippi Mills',\n\t'Sayville',\n\t'Bhawanipur',\n\t'Bel Air',\n\t'Lishui',\n\t'Katuria',\n\t'Sepatan',\n\t'Uwchlan',\n\t'Vieste',\n\t'Pfullendorf',\n\t'Poggio Renatico',\n\t'Balha',\n\t'Brandywine',\n\t'Manville',\n\t'Sokcho',\n\t'Gaigirgordub',\n\t'Kadattur',\n\t'Munnelli',\n\t'San Pancrazio Salentino',\n\t'Kourani',\n\t'As Suwayrah',\n\t'Lubliniec',\n\t'Poytya',\n\t'Stezzano',\n\t'Novomoskovsk',\n\t'Conchal',\n\t'Sandona',\n\t'Nishitokyo',\n\t'Gardnerville Ranchos',\n\t'Nyiregyhaza',\n\t'Encheng',\n\t'Al Maraghah',\n\t'Willmar',\n\t'Sharg`un',\n\t'Kaiken',\n\t'Peravur',\n\t'Ikot Abasi',\n\t'Swift Current',\n\t'Oizumi',\n\t'Lieksa',\n\t'Tarare',\n\t'Marton',\n\t'Berilo',\n\t'Oldham',\n\t'Kuppadi',\n\t'Horodnia',\n\t'Ataco',\n\t'Nassjo',\n\t'Wednesfield',\n\t'Los Bellosos',\n\t'Mombaca',\n\t'Recife',\n\t'Dalupo',\n\t'Capitan Pablo Lagerenza',\n\t'Tsarabaria',\n\t'La Guaira',\n\t'Ain Fakroun',\n\t'Tsiatosika',\n\t'Melikgazi',\n\t'San Gabriel',\n\t'Shek Wai Kok',\n\t'Pati do Alferes',\n\t'Nueva Santa Rosa',\n\t'Gerasdorf bei Wien',\n\t'Sesheke',\n\t'Nueva Rosita',\n\t'Diamante',\n\t'Fyzabad',\n\t'Masinloc',\n\t'Bejofo',\n\t'Ayolas',\n\t'Eski Arab',\n\t'Kaihua',\n\t'Narlica',\n\t'Amaga',\n\t'Haaltert',\n\t'Inhapim',\n\t'Itacurubi de la Cordillera',\n\t'Rawatsar',\n\t'Kakhovka',\n\t'Virapandi',\n\t'Dasai',\n\t'Laukaa',\n\t'Uummannaq',\n\t'Florin',\n\t'Perampuzha',\n\t'Mercato San Severino',\n\t'Zografos',\n\t'Bukit Gambir',\n\t'Mericourt',\n\t'Tchibota',\n\t'Mantova',\n\t'Santa Cruz Amilpas',\n\t'Atarra',\n\t'Saint-Jean',\n\t'Mansong',\n\t'Barbacha',\n\t'Perondi',\n\t'Lavasan',\n\t'Poljcane',\n\t'Haedo',\n\t'Sumber',\n\t'Riedisheim',\n\t'Manvel',\n\t'Willenhall',\n\t'Green Cove Springs',\n\t'Covasna',\n\t'Zantiebougou',\n\t'Mityana',\n\t'Schiffweiler',\n\t'San Antonio Sacatepequez',\n\t'Kalas',\n\t'Recreo',\n\t'Bugiri',\n\t'Rentachintala',\n\t'Babhani Bholwa',\n\t'Sedgley',\n\t'Dimapur',\n\t'Elkhart',\n\t'Musoma',\n\t'Luneburg',\n\t'New Iberia',\n\t'Espera Feliz',\n\t'Catumbela',\n\t'Leyte',\n\t'Palkot',\n\t'San Cugat del Valles',\n\t'Briancon',\n\t'Ermita',\n\t'Kunnumel',\n\t'Rain',\n\t'Barretos',\n\t'Jbail',\n\t'Hadibu',\n\t'Nagalapuram',\n\t'Sibagat',\n\t'Chamalieres',\n\t'Minamishibetsucho',\n\t'Gedaref',\n\t'Mrirt',\n\t'Rasra',\n\t'Holbeach',\n\t'San Angelo',\n\t'Olawa',\n\t'Sroda Wielkopolska',\n\t'Sabalpur',\n\t'Ban Plai Bua Phatthana',\n\t'Homer Glen',\n\t'Esparza',\n\t'Media',\n\t'Fasintsara',\n\t'Atarfe',\n\t'Tyamagondal',\n\t'Panganiban',\n\t'Arao',\n\t'Campogalliano',\n\t'Port Dickson',\n\t'Iracemapolis',\n\t'Ahmadabad',\n\t'Kruje',\n\t'Gourcy',\n\t'Penn',\n\t'Lubartow',\n\t'Yigilca',\n\t'Tiwi',\n\t'Buffelshoek',\n\t'Camacari',\n\t'Kunitomi',\n\t'Druento',\n\t'Qarabalyq',\n\t'Reghaia',\n\t'Edavanakad',\n\t'Baden-Baden',\n\t'Seevetal',\n\t'Puerto Viejo',\n\t'Segarai',\n\t'Khadbari',\n\t'Zag',\n\t'Amta',\n\t'Biritinga',\n\t\"Hayma'\",\n\t'Nebbi',\n\t'Malacky',\n\t'Bacolod',\n\t'Nkouraba',\n\t'Cuatro Cienegas de Carranza',\n\t'Barishal',\n\t'Lower',\n\t'Lam Luk Ka',\n\t'Petershagen',\n\t'Balham',\n\t'Titusville',\n\t'Vijes',\n\t'Harpur Bochaha',\n\t'Sido',\n\t'Sogam',\n\t'Victorias',\n\t'Khaira',\n\t'Capanema',\n\t'Slatina',\n\t'Hajduszoboszlo',\n\t'Kentau',\n\t'Ba',\n\t'Amagasaki',\n\t'Changzhi',\n\t'Orange Lake',\n\t'Montigny-en-Gohelle',\n\t'Gangaikondan',\n\t'Shibin al Kawm',\n\t'Kai',\n\t'Bayanhongor',\n\t'Erer Sata',\n\t'Hamamatsu',\n\t'Cedar Rapids',\n\t'Lubbeek',\n\t'Pingyi',\n\t'Reo',\n\t'Ban Chomphu Nuea',\n\t'Mundi',\n\t'Kantai',\n\t'Genoa',\n\t'Agadir',\n\t'Wawarsing',\n\t'Best',\n\t'Tanjore',\n\t'Tiete',\n\t'Pacajus',\n\t'Varzea Grande',\n\t'Inawashiro',\n\t'Sigmaringen',\n\t'Banjarmasin',\n\t'Punata',\n\t'Fairview Heights',\n\t'Embu',\n\t'Brea',\n\t'Mohacs',\n\t'Rosedale',\n\t'Hammam al `Alil',\n\t'Papireddippatti',\n\t'Beaumont-sur-Oise',\n\t'Makokou',\n\t'Eastchester',\n\t'Huntington',\n\t'Zarumilla',\n\t'San Sebastian de Buenavista',\n\t'Ouezzane',\n\t'Ambalarondra',\n\t'Waukegan',\n\t'San Pablo Huixtepec',\n\t'Kasangati',\n\t'Boanamary',\n\t'Nancy',\n\t'El Pueblito',\n\t'South Miami Heights',\n\t'Sayyid Sadiq',\n\t'Xghajra',\n\t'Bulacan',\n\t'Tanichchiyam',\n\t'Heilbron',\n\t'Sao Caetano de Odivelas',\n\t'Ayos',\n\t'Rawasari',\n\t'Herve',\n\t'Fairview Shores',\n\t'Naklo nad Notecia',\n\t'San Carlos',\n\t'Varazze',\n\t'Konak',\n\t'Kattakampala',\n\t'New Berlin',\n\t'Tuam',\n\t'Talaigua Nuevo',\n\t'Suchanino',\n\t'Alcobendas',\n\t'Mangalapuram',\n\t'Lombard',\n\t'Temacine',\n\t'Fancheng',\n\t'Norristown',\n\t'Kasrawad',\n\t'Memuro-minami',\n\t'Newman',\n\t'Kumamoto',\n\t'Shimizu',\n\t'Adrogue',\n\t'Belo Horizonte',\n\t'Kurtalan',\n\t'Gulf Shores',\n\t'Kenitra',\n\t'Esquipulas Palo Gordo',\n\t'Dursunbey',\n\t'Pazhayannur',\n\t'Little Elm',\n\t'Bassersdorf',\n\t'Sant Just Desvern',\n\t'Surir',\n\t'Goodlettsville',\n\t'Nanjo',\n\t'Al Jammaliyah',\n\t'Binyin',\n\t'Osterwieck',\n\t'Novoishimskiy',\n\t'Ananas',\n\t'Lower Moreland',\n\t'Gradsko',\n\t'Qiaotou',\n\t'Gole',\n\t'Marale',\n\t'Kantang',\n\t'Rajapur',\n\t'Boha',\n\t'Orbetello',\n\t'Suances',\n\t'Cheshunt',\n\t'Nagykallo',\n\t\"Bu'aale\",\n\t'Chikitigarh',\n\t'Djenne',\n\t'Le Luc',\n\t'Sankeshwar',\n\t'Hrebinka',\n\t'Ronchin',\n\t'Pugo',\n\t'Putnam Valley',\n\t'Valka',\n\t'Sig',\n\t'Andernos-les-Bains',\n\t'Neuchatel',\n\t'Varginha',\n\t'Noventa Vicentina',\n\t'Athy',\n\t'Aradeo',\n\t'Cururupu',\n\t'Funza',\n\t'Alghero',\n\t'Termiz',\n\t'Rockwall',\n\t'Joliet',\n\t'Alatri',\n\t'Damarcherla',\n\t'Nako',\n\t'Muzaffarnagar',\n\t'Kazlu Ruda',\n\t'Urun-Islampur',\n\t'Thorpe Saint Andrew',\n\t'Baubau',\n\t'Felixstowe',\n\t'Mimata',\n\t'Babenhausen',\n\t'Valley Center',\n\t'Trabzon',\n\t'Ban Pak Phun',\n\t'Koudougou',\n\t'Wisbech',\n\t'Danvers',\n\t'Dhamnod',\n\t'Rudrur',\n\t'Nueva Italia de Ruiz',\n\t'Beacon',\n\t'Deerfield Beach',\n\t'Tinkhang',\n\t'Aiyomojok',\n\t'Gevas',\n\t'Salou',\n\t'Pontarlier',\n\t'Valluvandad',\n\t'Pingtouchuanxiang',\n\t'Takasagocho-takasemachi',\n\t'Marsaskala',\n\t'Zequ',\n\t'Sarapui',\n\t'Bhangha',\n\t'Saint Albans',\n\t'Fountain Hills',\n\t'Bultfontein',\n\t'Plant City',\n\t'Bidestan',\n\t'Alvorada',\n\t'Faenza',\n\t'Benyahia Abderrahmane',\n\t'Al Hindiyah',\n\t'Vohitromby',\n\t'Guadalupe Victoria',\n\t'Croissy-sur-Seine',\n\t'Agudo',\n\t'Carire',\n\t'Rho',\n\t'Gassino Torinese',\n\t'Uzice',\n\t'Magny-le-Hongre',\n\t'Bazimini',\n\t'New York',\n\t'Croata',\n\t'Shahgarh',\n\t'Nyzhnohirskyi',\n\t'St. Simons',\n\t'Fleury-les-Aubrais',\n\t'Paulino Neves',\n\t'Buderim',\n\t'Kapchagay',\n\t'Ahogbeya',\n\t'Warabi',\n\t'Sasagawa',\n\t'Edappalli',\n\t'Bobleshwar',\n\t'Sardinata',\n\t'Niederhasli',\n\t'Grez-Doiceau',\n\t'Crimmitschau',\n\t'Bound Brook',\n\t'Magog',\n\t'Pottstown',\n\t'Loveland',\n\t'Fort Mill',\n\t'Kpandu',\n\t'Ngoc Son',\n\t'San Agustin',\n\t'Turkeli',\n\t'Keynsham',\n\t'Padre Las Casas',\n\t'Huangzhai',\n\t'Acul du Nord',\n\t'Sha Tin',\n\t'Reddipalle',\n\t'Dalby',\n\t'Chigwell',\n\t'Chaigoubu',\n\t'Marolinta',\n\t'Tarma',\n\t'Schwabisch Gmund',\n\t'La Teste-de-Buch',\n\t'Bouna',\n\t'Creil',\n\t'Balatonalmadi',\n\t'Srivardhan',\n\t'Ettenheim',\n\t'Spanish Town',\n\t'Castellabate',\n\t'Salimpur',\n\t'Bhusaval',\n\t'Ayomi',\n\t'Babhniyawan',\n\t'Dundankop',\n\t'Khulna',\n\t'Incheon',\n\t'Prizren',\n\t'Yuvileine',\n\t'Taastrup',\n\t'Maibara',\n\t'Liberec',\n\t'Bordj Bou Arreridj',\n\t'Bueu',\n\t'Baba I',\n\t'Uttarkashi',\n\t'Karuizawa',\n\t'Ikast',\n\t'Tapolca',\n\t'Matrah',\n\t'Chakia',\n\t'Sosa',\n\t'Kabalo',\n\t'High River',\n\t'Chemnitz',\n\t'Mirganj',\n\t\"Mohale's Hoek\",\n\t'Capena',\n\t\"Fanja'\",\n\t'Idumbavanam',\n\t'Travagliato',\n\t'Noicattaro',\n\t'Lasht-e Nesha',\n\t'Bel Air North',\n\t'Missour',\n\t'Itaipe',\n\t'Sandpoint',\n\t'Villepinte',\n\t'Tendukheda',\n\t'Ljubovija',\n\t'Mount Pleasant',\n\t'Yucca Valley',\n\t'Lai Chau',\n\t'Litija',\n\t'Liberty Lake',\n\t'Kidamangalam',\n\t'Cambara',\n\t'Funchal',\n\t'Nansana',\n\t'Ongwediva',\n\t'Jamhra',\n\t'Gulbene',\n\t'Hot Springs Village',\n\t'Gothini',\n\t\"Douar 'Ayn Dfali\",\n\t'Belsh',\n\t'Shimokodanaka',\n\t'Gerash',\n\t\"Welench'iti\",\n\t'Pozorrubio',\n\t'Placer',\n\t'Streatham',\n\t'Muttalakanpatti',\n\t'Bougival',\n\t'Porteiras',\n\t'Liuguoju',\n\t'Sultanhani',\n\t'Dhutauli',\n\t'Jilin',\n\t'Dongsu',\n\t'Saho',\n\t'Santa Cecilia',\n\t'Jalor',\n\t'Kuruvambalam',\n\t'Maraba',\n\t'Yairipok',\n\t'Shafter',\n\t'Zabari',\n\t'Sauzal',\n\t'Barharwa',\n\t'Sisia',\n\t'Fabriano',\n\t'Buttar',\n\t'Corlu',\n\t'Kailashahar',\n\t'Mosina',\n\t'Novo Oriente',\n\t'Ploemeur',\n\t'Goshaingaon',\n\t'Amba Icharua',\n\t'Lehara',\n\t'eXobho',\n\t'Waldenbuch',\n\t'Marimba',\n\t'Kavundappadi',\n\t'Al Hudaydah',\n\t\"Castelnovo ne' Monti\",\n\t'Ipuiuna',\n\t'Az Zawiyah',\n\t'Barros Blancos',\n\t'Royan',\n\t'Zaojiao',\n\t'Tiztoutine',\n\t'Tanashicho',\n\t'Ebbw Vale',\n\t'Swidnik',\n\t'Snohomish',\n\t'Melendugno',\n\t'Pavia',\n\t'Whitman',\n\t'Cuilo',\n\t'Russas',\n\t'Callao',\n\t'`Izbat al Burj',\n\t'Lushoto',\n\t'Dayr al Barsha',\n\t'Pepinster',\n\t'Bustos',\n\t'Ureshinomachi-shimojuku',\n\t'Sabugal',\n\t'Forest City',\n\t'Afonso Bezerra',\n\t'Kaliganj',\n\t'Hato Mayor',\n\t'Kete Krachi',\n\t'Rasipuram',\n\t'Ennepetal',\n\t\"Cassano d'Adda\",\n\t'Ronne',\n\t'Olpe',\n\t'Karlsruhe',\n\t'Janpur',\n\t'Wepener',\n\t'Happy Valley',\n\t'Bhadrakh',\n\t'Gaz',\n\t'Kayanza',\n\t'St. Ann',\n\t'Chitcani',\n\t'Tafrant',\n\t'Itabuna',\n\t'Iracoubo',\n\t'Mirzanagar',\n\t'Livry-Gargan',\n\t'Bequimao',\n\t'Dazhangzi',\n\t'Zhugang',\n\t'Waalre',\n\t'La Roda',\n\t'Kamthi',\n\t'Piggs Peak',\n\t'Mahadeopur',\n\t'Annakattumula',\n\t'Patterson',\n\t'Koriukivka',\n\t'Altenberge',\n\t'Rajula',\n\t'Hayden',\n\t'Yambio',\n\t'Saram',\n\t'Vereeniging',\n\t'Beauharnois',\n\t'La Ravoire',\n\t'Kulhudhuffushi',\n\t'Alatsinainy-Bakaro',\n\t'Nedugula',\n\t'Goaso',\n\t'Araucaria',\n\t'Fort Washington',\n\t'Sargur',\n\t\"Boula'wane\",\n\t'Hussepur',\n\t'Frederick',\n\t'An Nimas',\n\t'Joao Pessoa',\n\t'La Eliana',\n\t'Samsun',\n\t'Bang Phlat',\n\t'Ketugram',\n\t'Dhobauli',\n\t'Bad Wildungen',\n\t'Estancia Pozo Colorado',\n\t'Roseller Lim',\n\t'Skarzysko-Kamienna',\n\t'Alba',\n\t'Sengurichchi',\n\t'Togitsu',\n\t'Chas',\n\t'Petlad',\n\t'El Rama',\n\t'Parkstone',\n\t'Lorca',\n\t'Western Bicutan',\n\t'Harare',\n\t'Fort Valley',\n\t'Staryy Beyneu',\n\t'Mainit',\n\t'Rosales',\n\t'Isafjordhur',\n\t'Moreau',\n\t'Kapra',\n\t'Tarascon',\n\t'Tubbergen',\n\t'Santa Comba Dao',\n\t'Fatikchari',\n\t'Sumy',\n\t'Ignacio de la Llave',\n\t\"Sant'Elpidio a Mare\",\n\t'Pocono',\n\t'Kakogawacho-honmachi',\n\t'Guajara-Mirim',\n\t'Beekman',\n\t'Meymand',\n\t'University of Virginia',\n\t'Haines City',\n\t'Simao Dias',\n\t'Signal Hill',\n\t'Makedonski Brod',\n\t'Kamakurayama',\n\t'Blackpool',\n\t'Poxoreo',\n\t'Kohir',\n\t'Talata-Angavo',\n\t'Bielefeld',\n\t'Tomesti',\n\t'Universal City',\n\t'Kotka',\n\t'Uttukkottai',\n\t'Baruta',\n\t'Solana',\n\t'Ain Mediouna',\n\t'Garoowe',\n\t'Ap Tan Ngai',\n\t'Sarigol',\n\t'Muong Lay',\n\t'Guryongpo',\n\t'Moorestown',\n\t'Nottampatti',\n\t'Marienheide',\n\t'Tiruppur',\n\t'Bikkatti',\n\t'Fereydunshahr',\n\t'Ezhamkulam',\n\t'Ajax',\n\t'Buguda',\n\t'Shijiazhuang',\n\t'Pantanal',\n\t'Meylan',\n\t'Dobanovci',\n\t'Bizerte',\n\t'Gingin',\n\t'Baroni Khurd',\n\t'Cusseta',\n\t'Alhambra',\n\t'Chaoyang',\n\t'Wakema',\n\t'Holland',\n\t'Prunedale',\n\t'Akure',\n\t'Huautla',\n\t'Ghora Gali',\n\t'Ayase',\n\t'Ciudad de Loreto',\n\t'Bittou',\n\t'Andong',\n\t'Halluin',\n\t'Yuncos',\n\t'Eurajoki',\n\t'Morden',\n\t'Gueret',\n\t'Mutukula',\n\t'Abovyan',\n\t'Al Hufuf',\n\t'Tapaua',\n\t'Tegalbuleud',\n\t'Brackenheim',\n\t'Tanaina',\n\t'Siloam Springs',\n\t'Kuusankoski',\n\t'Concordia',\n\t'Parsippany',\n\t'Lapanga',\n\t'Manhuacu',\n\t'Extrema',\n\t'El Manteco',\n\t'Setti Fatma',\n\t'Guneysinir',\n\t'Sagara',\n\t'Kohima',\n\t'Guacheta',\n\t'Hidaj',\n\t'Gollalagunta',\n\t'Sawla',\n\t'Tamazouzt',\n\t'Qoryooley',\n\t'Constantine',\n\t'Boulsa',\n\t'Bhataulia',\n\t'Oued Athmenia',\n\t'Villa Ballester',\n\t'Leipzig',\n\t'Khewra',\n\t'Wondelgem',\n\t'Somanya',\n\t'Melissa',\n\t'Wangdue Phodrang',\n\t'Rietavas',\n\t'Kirkby in Ashfield',\n\t'Khadra',\n\t'Whitemarsh',\n\t'Palauig',\n\t'Aleg',\n\t'El Barrio de la Soledad',\n\t'Rosario Oeste',\n\t'Pappakudi',\n\t'Zorneding',\n\t'Grodzisk Mazowiecki',\n\t'Osowa',\n\t'Samayanallur',\n\t'Manampizha',\n\t'Bago',\n\t'Country Club',\n\t\"Lu'an\",\n\t'Santa Teresinha (2)',\n\t'East Rockaway',\n\t'Minja',\n\t'Ilkhechi',\n\t'Moreno',\n\t'Novoazovsk',\n\t'Seondha',\n\t'Castleton',\n\t'Hannover',\n\t'Bhopal',\n\t'Barnoi',\n\t'Casaluce',\n\t'Hola',\n\t\"Trezzo sull'Adda\",\n\t'Minxiong',\n\t'Eboli',\n\t'Bairiya',\n\t'Bad Waldsee',\n\t'Montagu',\n\t'Torres',\n\t'Pelitli',\n\t'Ararenda',\n\t'Coronel Fabriciano',\n\t'Monteria',\n\t'Kavlinge',\n\t'Grand Gosier',\n\t'Tidjikja',\n\t'Palayad',\n\t'Kattipudi',\n\t'Kibichuo',\n\t'Guoxing',\n\t'Viera West',\n\t'Aw Dheegle',\n\t'Ipanguacu',\n\t'Oued Fodda',\n\t'Yoju',\n\t'Leesburg',\n\t'Sathiala',\n\t'Senkaya',\n\t'Kucevo',\n\t'Mandal',\n\t'Dauis',\n\t'Oyon',\n\t'Kulmbach',\n\t'Macul',\n\t'Aysha',\n\t'Ash Shajarah',\n\t'Huishi',\n\t'Chiyoda-ku',\n\t'Ceccano',\n\t'Massenya',\n\t'Impasugong',\n\t'Champlin',\n\t'Saint Ives',\n\t'Sycamore',\n\t'Mahalgaon',\n\t'Yanqi',\n\t'Puren',\n\t'Koronadal',\n\t'Santa Catarina Ixtahuacan',\n\t'Dulmial',\n\t'Bourg-les-Valence',\n\t'Du Yar',\n\t'Marsa',\n\t'Bootle',\n\t'Swidnica',\n\t'Saint-Avold',\n\t'Goleta',\n\t'Peshkopi',\n\t'Ahenkro',\n\t'Fort Lewis',\n\t'Barra do Garcas',\n\t'Greytown',\n\t'Thouare-sur-Loire',\n\t'Abdul Hakim',\n\t'Pont-Sainte-Maxence',\n\t'Malindi',\n\t'Meridian',\n\t'Katsuyama',\n\t'Pigue',\n\t'Iradan',\n\t'Mukerian',\n\t'Yuzhang',\n\t'Quang Ngai',\n\t'Vila Nova de Gaia',\n\t'Tembagapura',\n\t'California City',\n\t'Dolores Hidalgo Cuna de la Independencia Nacional',\n\t'Guazacapan',\n\t'Tympaki',\n\t'Zhuozhou',\n\t'Tangub',\n\t'Gelemso',\n\t'Paal',\n\t'Hassi Berkane',\n\t'Plandiste',\n\t'Eduttavaynattam',\n\t'Alice',\n\t'Hannibal',\n\t'Novi Travnik',\n\t'Kairana',\n\t'Ilinden',\n\t'Mmabatho',\n\t'Hoyacho',\n\t'Menzel Bourguiba',\n\t'Tinsukia',\n\t'Medina del Campo',\n\t'Ramon',\n\t'Pierrefitte-sur-Seine',\n\t'Monroeville',\n\t'Randaberg',\n\t'Maple Shade',\n\t'Grottaglie',\n\t'Hisua',\n\t'Endicott',\n\t'Palagiano',\n\t'Martigues',\n\t'Huacho',\n\t'Wangtang',\n\t'Daiyue',\n\t'Chiguayante',\n\t'Einbeck',\n\t'Tezonapa',\n\t'Sousse',\n\t'Vikravandi',\n\t'Hellemmes-Lille',\n\t'Manampaneva',\n\t'Spresiano',\n\t'San Jose La Arada',\n\t'Salina Cruz',\n\t'Pindamonhangaba',\n\t'Bad Aibling',\n\t'Zhangjiazhuangcun',\n\t'Selestat',\n\t'Ascencion de Guarayos',\n\t'Hastinapur',\n\t'Xangda',\n\t'Trujillo Alto',\n\t\"Ji'an\",\n\t'Dapaong',\n\t'Kernersville',\n\t'Conceicao do Coite',\n\t'Aguas Santas',\n\t'A Coruna',\n\t'Yanshanbu',\n\t'Boizenburg',\n\t'Zachary',\n\t'Lake Forest',\n\t'La Paz',\n\t'Malta',\n\t'Alfreton',\n\t'Halfeti',\n\t'Paracuru',\n\t'Valdivia',\n\t'Belen',\n\t'Cawayan',\n\t'Oda',\n\t'Ankililoaka',\n\t'Pondaluru',\n\t'Larkana',\n\t'Polaia Kalan',\n\t'Curua',\n\t'Hayashima',\n\t'Brigham City',\n\t'Beverungen',\n\t'Towcester',\n\t'Nove Zamky',\n\t'Palpa',\n\t'Gollapudi',\n\t'Gescher',\n\t'Camboriu',\n\t'El Plan',\n\t'Sokolo',\n\t'Titel',\n\t'Vallentuna',\n\t'Montreux',\n\t'Delmas',\n\t'Edirne',\n\t'Ngolonianasso',\n\t'Nsiika',\n\t'Rowlett',\n\t'Kuchlagh',\n\t'La Palma del Condado',\n\t'Senago',\n\t'Antanandava',\n\t'Steger',\n\t'Thatta',\n\t'Al Hamzah',\n\t'Krolevets',\n\t'Cabrera',\n\t'Baia-Sprie',\n\t'Santiago Suchilquitongo',\n\t'Aabenraa',\n\t'San Marco in Lamis',\n\t'Kota Bharu',\n\t'Guayabal',\n\t'Dasaut',\n\t'Kauhava',\n\t'Sabie',\n\t'Garrucha',\n\t'Maungdaw',\n\t'Kaduturutti',\n\t'Castenedolo',\n\t'Rio Rico',\n\t'Varese',\n\t'Chadchan',\n\t'Seoni Chhapara',\n\t'Rodeo',\n\t'Saint-Esteve',\n\t'Kierspe',\n\t'Velke Mezirici',\n\t'Khajuraho',\n\t'Thuin',\n\t'Douz',\n\t'Bac Lieu',\n\t'Differdange',\n\t'Imqabba',\n\t'Barao de Cocais',\n\t'Bijar',\n\t'Payerne',\n\t'Janakammapeta',\n\t'Takaishi',\n\t'Los Alamos',\n\t'Xianshuigu',\n\t'San Giuliano Terme',\n\t'Leigh',\n\t'Sinjar',\n\t'Chalastra',\n\t'Souakene',\n\t'Carmo do Cajuru',\n\t'Tirumangalam',\n\t'Nagardevla Budrukh',\n\t'Aqchah',\n\t'As Sars',\n\t\"'Ain el Assel\",\n\t'Cusco',\n\t'Bacarra',\n\t'Maracacume',\n\t'Tanhuato de Guerrero',\n\t'Winston-Salem',\n\t'Fukuchiyama',\n\t'Grangemouth',\n\t'Olive Branch',\n\t'Zumpango del Rio',\n\t'Mardan',\n\t'Greenwood',\n\t'Torre de Moncorvo',\n\t'Nanthankulam',\n\t'Gadzin Han',\n\t'Manappakkam',\n\t'San Vicente Pacaya',\n\t'Suresnes',\n\t'Piraziz',\n\t'Anadia',\n\t'Valle Nacional',\n\t'Zhongdong Shequ',\n\t'Howick',\n\t'San Pedro de Uraba',\n\t'Konaje',\n\t'Rayappanpatti',\n\t'Nanuque',\n\t'Zhutailing',\n\t'Bovec',\n\t'Villa Riva',\n\t'Sanza Pombo',\n\t'Brossard',\n\t'Olbia',\n\t'Bredene',\n\t'Kaliro',\n\t'Joetsu',\n\t'Kruszwica',\n\t'Surajpura',\n\t'Primeira Cruz',\n\t'Hanumana',\n\t'Ghattupal',\n\t'Changamkari',\n\t'Bistrita',\n\t'Les Herbiers',\n\t'As Suqaylibiyah',\n\t'Quebec City',\n\t'Wiehl',\n\t'Waltrop',\n\t'Kadiana',\n\t'Tadapurambakkam',\n\t'Delportshoop',\n\t'Pinghu',\n\t'Bad Endorf',\n\t'Singarayakonda',\n\t'Prestwich',\n\t'Weesp',\n\t'Itamukkala',\n\t'Ad Dab`ah',\n\t'Salvador',\n\t'Weipa',\n\t'Agdam',\n\t'Tolu Viejo',\n\t'Erzincan',\n\t'Arfoud',\n\t'Giulianova',\n\t'El Paso de Robles',\n\t'Pedda Nindrakolanu',\n\t'Shawangunk',\n\t'Flamanzi',\n\t'Icod de los Vinos',\n\t'Vatananto',\n\t'Frattaminore',\n\t'Sterling Heights',\n\t'Zhongliao',\n\t'Tirmalgiri',\n\t'Deutsch-Wagram',\n\t'Peddaboddepalle',\n\t'Kilosa',\n\t'Gulbaar',\n\t'Malema',\n\t'Novo Horizonte',\n\t'Blairgowrie',\n\t'Nieder-Olm',\n\t'Pertuis',\n\t'Xacmaz',\n\t'Tenerife',\n\t'Krishnapuram',\n\t'Molndal',\n\t'Luba',\n\t'Puttalam',\n\t'Jegunovce',\n\t'Kauniainen',\n\t'Zapatoca',\n\t'Abong Mbang',\n\t'Tiana',\n\t'Ryki',\n\t'Mitai',\n\t'Mullingar',\n\t'Dom Pedro',\n\t'Simiti',\n\t'Naguilian',\n\t'Roccapiemonte',\n\t'Lanaken',\n\t'Svatove',\n\t'Salto del Guaira',\n\t'Liman',\n\t'Paisley',\n\t'Skwierzyna',\n\t'Balagtas',\n\t'Belma',\n\t'Olathe',\n\t'Kumil',\n\t'Hamworthy',\n\t'Solwezi',\n\t'Fucheng',\n\t'Lanivo',\n\t'Dao',\n\t'Putao',\n\t'Rafaela',\n\t'Yozgat',\n\t'Sao Joao da Boa Vista',\n\t'Sapanca',\n\t'Prebold',\n\t'Gwangyang',\n\t'Imerintsiatosika',\n\t'Munnalam',\n\t'Tizayuca',\n\t'Sorso',\n\t'Anah',\n\t'Locarno',\n\t'Wageningen',\n\t'Muhammadganj',\n\t'Binangonan',\n\t'San Gregorio de Nigua',\n\t'Oneonta',\n\t'Bole',\n\t'Mannara',\n\t'Darnah',\n\t'Habo',\n\t'Aubagne',\n\t'Pinili',\n\t'Ostuni',\n\t'Jitwarpur Chauth',\n\t'Mainaschaff',\n\t'Inderbor',\n\t'Westlake',\n\t'Esher',\n\t'Gaimersheim',\n\t'Fort Knox',\n\t'Tiruvambadi',\n\t'Towada',\n\t'Kasangulu',\n\t'Chernihiv',\n\t'Pardubice',\n\t'Ekibastuz',\n\t'Tramore',\n\t'Luchenza',\n\t'Asarganj',\n\t'Mascalucia',\n\t'Bartica',\n\t'Ipixuna',\n\t'Gainza',\n\t'Buea',\n\t'Puerto Concordia',\n\t'Mohammadabad',\n\t'Kindia',\n\t'Kadingilan',\n\t'Amboasary-Gara',\n\t'Kanchanadit',\n\t'Sabaneta',\n\t'Amingaon',\n\t'Los Polvorines',\n\t'Catano',\n\t'Alto Longa',\n\t'Zharkent',\n\t'Samba',\n\t'Hempstead',\n\t'Arandelovac',\n\t'Ghogha',\n\t'Cluses',\n\t'Kumarapalaiyam',\n\t'Warendorf',\n\t'Ath',\n\t'Thanh Xuan',\n\t'Esik',\n\t'Luneville',\n\t'Burgstadt',\n\t'Deggendorf',\n\t'Kozlu',\n\t'Abdullahnagar',\n\t'Penarroya-Pueblonuevo',\n\t'Curug',\n\t'Cosmopolis',\n\t'Schoningen',\n\t'Desri',\n\t'Tandubas',\n\t'Masiu',\n\t'Petawawa',\n\t'Buxerolles',\n\t'Wazirabad',\n\t'Wath upon Dearne',\n\t'Agios Athanasios',\n\t'Novi Marof',\n\t'Chotebor',\n\t'Ciudad General Belgrano',\n\t'Kitaibaraki',\n\t\"'s-Gravenzande\",\n\t'Wellington North',\n\t'Jiuduhe',\n\t'Villingen-Schwenningen',\n\t'Stockbridge',\n\t'Wauconda',\n\t'Kayyngdy',\n\t'Sultandagi',\n\t'Torshavn',\n\t'Wadala Sandhuan',\n\t'Nordkirchen',\n\t'Nandikotkur',\n\t'Geisenheim',\n\t'Shirvan',\n\t'Port Victoria',\n\t'Santo Antonio de Jesus',\n\t'Matulji',\n\t'Bagaces',\n\t'Thisted',\n\t'Perur',\n\t'Coreau',\n\t'Chitose',\n\t'Marka',\n\t'Weener',\n\t'Barrinha',\n\t'Limburg',\n\t'Qazax',\n\t'Itapa-Ekiti',\n\t'Cajetina',\n\t'Bendougouba',\n\t'Buriti do Tocantins',\n\t'Uppur',\n\t'Hikari',\n\t'Parnarama',\n\t'Hammerfest',\n\t'Alcala la Real',\n\t'Deolali',\n\t'Arukutti',\n\t'Dar Si Aissa',\n\t'Ratia',\n\t'Gangaura Behra',\n\t'Mehdya',\n\t'Vagos',\n\t'Ramdeora',\n\t'Saint Helena Bay',\n\t\"'Ain Fekan\",\n\t'Saint-Germain-les-Arpajon',\n\t'Farrukhabad',\n\t'Palmeiras',\n\t'Saint-Lo',\n\t'Marwa',\n\t\"Khmis Sidi al 'Aydi\",\n\t'San Joaquin',\n\t'Koteshwar',\n\t'Pandalkudi',\n\t'Kukawa',\n\t'Lydney',\n\t'Kanchanpalli',\n\t'Chlef',\n\t'Moquegua',\n\t'Yanguancun',\n\t'Dalavaypattanam',\n\t'Gundlupet',\n\t'Sabinov',\n\t'Praia Grande',\n\t'Tamba-Sasayama',\n\t'Dachengzicun',\n\t'Biloziria',\n\t'Sanaur',\n\t'Rudehen',\n\t'Palmares',\n\t'Fairfax Station',\n\t'Bangor',\n\t'Mula',\n\t'North Chicago',\n\t'Koencho',\n\t'Mahibadhoo',\n\t'Vallejuelo',\n\t'Cajola',\n\t'Mvurwi',\n\t'Jinku',\n\t'Zgorzelec',\n\t'Barnstable',\n\t'San Ignacio de Velasco',\n\t'Fuquan',\n\t'Bayan Lepas',\n\t'Clovis',\n\t'Kappeln',\n\t'Ivaipora',\n\t'Piraquara',\n\t'Capul',\n\t'Sieradz',\n\t'Mombasa',\n\t'Bayawan',\n\t'Kahrizak',\n\t'Rohnert Park',\n\t'Ouzera',\n\t'Mampong',\n\t'Mezokovesd',\n\t'Briceni',\n\t'Pedara',\n\t'Koch Bihar',\n\t'Thaba Nchu',\n\t'Dehti',\n\t'Sebnitz',\n\t'Metz',\n\t'Mansa',\n\t'Sanwer',\n\t'Bingawan',\n\t'Vechur',\n\t'Kirkja',\n\t'Tororo',\n\t'Miandasht',\n\t'Peringom',\n\t'Nambutalai',\n\t'Zarafshon Shahri',\n\t'Deer Park',\n\t'Atalaia',\n\t'Congleton',\n\t'Srebrenik',\n\t'Rauch',\n\t'Slavuta',\n\t'Vengattur',\n\t'Bokoro',\n\t'Pureparo de Echaiz',\n\t'Osijek',\n\t'Divrigi',\n\t'East San Gabriel',\n\t'Gapan',\n\t'Comilla',\n\t'Ropar',\n\t'Oak Bay',\n\t'San Felipe',\n\t'Dinmanpur',\n\t'Konigslutter am Elm',\n\t'Nittenau',\n\t'Ardahan',\n\t'Kelaa Kebira',\n\t'Gulcho',\n\t'Sanzhou',\n\t'Albinea',\n\t'Acireale',\n\t'Wadegaon',\n\t'Australind',\n\t'Yaopu',\n\t'Ramnagar',\n\t'Tummalacheruvu',\n\t'Morretes',\n\t'Askoy',\n\t'Teziutlan',\n\t'Tupiza',\n\t'Monastir',\n\t'Dumri',\n\t\"Estrela d'Oeste\",\n\t'Ribeirao Pires',\n\t'Holesov',\n\t'Ghatal',\n\t'Santa Maria Huatulco',\n\t'Vleuten',\n\t'Ambatomiady',\n\t'Isale',\n\t'Chalmette',\n\t'Tirukkoyilur',\n\t'Ishikari',\n\t'Lunglei',\n\t'Desuri',\n\t'Kaikoura',\n\t'Vaghodia',\n\t'Al Fayd',\n\t'Kahoku',\n\t'Bettendorf',\n\t'Palafolls',\n\t'Hadzici',\n\t'Jocoro',\n\t'Nanto',\n\t'Botelhos',\n\t'St. Clair Shores',\n\t'Rahon',\n\t'Monte Santo',\n\t'Watsonville',\n\t'Shankar Saraiya',\n\t'Zlin',\n\t'Maner',\n\t'Sauce',\n\t'Pudupattanam',\n\t'Midalt',\n\t'Jarinu',\n\t'Goma',\n\t'Laqtah',\n\t'Ghorbanki',\n\t'Nehoiu',\n\t'Comayaguela',\n\t'Sardhana',\n\t'Butiama',\n\t'Novo Hamburgo',\n\t'Isahaya',\n\t'Rouiba',\n\t'Minatitlan',\n\t'Devikolam',\n\t'Putatan',\n\t'Ala',\n\t'Sirsi',\n\t'Lawrence',\n\t'Sarapaka',\n\t'Turmalina',\n\t'Yaguara',\n\t'Tongjin',\n\t'Monte Alegre de Minas',\n\t'Nesher',\n\t'Morsand',\n\t'Rafsanjan',\n\t'Brisbane',\n\t'Rheinberg',\n\t'Assamannur',\n\t'Unterageri',\n\t'Sanquelim',\n\t'Steinhaus',\n\t'Banja Luka',\n\t'Guaimaro',\n\t'Luquembo',\n\t'Ambatomarina',\n\t'Kucove',\n\t'Thilogne',\n\t'Sangereng',\n\t'Beni Saf',\n\t'Itabela',\n\t'Woodfield',\n\t'Sandavagur',\n\t'Drobak',\n\t'Fuldabruck',\n\t'San Luis Obispo',\n\t'Chandralapadu',\n\t'Kanp',\n\t'Sainte-Sophie',\n\t'Karakopru',\n\t'Maple Grove',\n\t'Yachiyo',\n\t'Wuling',\n\t'Foammulah',\n\t'Mouvaux',\n\t'Gorizia',\n\t'Umarkot',\n\t'Forestdale',\n\t'Rawatbhata',\n\t'Bongaree',\n\t'Jalingo',\n\t'Koog aan de Zaan',\n\t'Lapy',\n\t'Rayleigh',\n\t'Khandsa',\n\t\"Fontaine-l'Eveque\",\n\t'Den Helder',\n\t'Nanmucun',\n\t'Sakaraha',\n\t'Flixton',\n\t'Magenta',\n\t'Muroto-misakicho',\n\t'Panhar',\n\t'Ait Ourir',\n\t'Mawkanin',\n\t'Cheadle',\n\t'Kuusamo',\n\t'Velivennu',\n\t'Espoo',\n\t'Kakhandiki',\n\t'Kortenberg',\n\t'Krasnodon',\n\t'Hennigsdorf',\n\t'Olmos',\n\t'Maropaika',\n\t'Mahadipur',\n\t'Itatuba',\n\t'Uckfield',\n\t'Belle Glade',\n\t'Acatlan de Osorio',\n\t'Elfers',\n\t'Al Jumayl',\n\t'Hatsukaichi',\n\t'At Tall',\n\t'Uzynaghash',\n\t'Beatrice',\n\t'Frogn',\n\t'Yao',\n\t'Monfort Heights',\n\t'El Mansouria',\n\t'Sileby',\n\t'Emerald',\n\t'Alubijid',\n\t'Llanquihue',\n\t'Yerrapalem',\n\t'Tuguegarao',\n\t'Tiel',\n\t'Mahallat',\n\t'Varena',\n\t'Cherukunnu',\n\t'Lahat',\n\t'Nevsehir',\n\t'Suonan',\n\t'Cloncurry',\n\t'Chikhli Kalan',\n\t'Vedasandur',\n\t'Coyaima',\n\t'Yinajia',\n\t'Rewtith',\n\t'Villa Adelina',\n\t'Siur',\n\t'Urucania',\n\t'Petrinja',\n\t'Bruntal',\n\t'Wietmarschen',\n\t'Tumkur',\n\t'Qana',\n\t'Darlowo',\n\t'Qamdo',\n\t'Nova Gradiska',\n\t'Barhiya',\n\t'Balighattam',\n\t'St. Petersburg',\n\t'Paglat',\n\t'Nauhata',\n\t'Derdara',\n\t'Barai',\n\t\"King's Lynn\",\n\t'San Pablo Tacachico',\n\t'Presidente Bernardes',\n\t'Elizabethton',\n\t'Ezhou',\n\t'Kallamalai',\n\t'Estrela',\n\t'Tuburan',\n\t'Solapuram',\n\t'Dohta',\n\t'Yazihan',\n\t'Monett',\n\t'Mayang Imphal',\n\t'Starse',\n\t'Chilon',\n\t'Libano',\n\t'Raneswar',\n\t'Raydah',\n\t'Tanjungpandan',\n\t'Puning',\n\t'Cabreuva',\n\t'Shoufeng',\n\t'Ipecaeta',\n\t'Lujan',\n\t'Sultanhisar',\n\t'Kaynarca',\n\t'Mwanza',\n\t'Newport',\n\t'Beypazari',\n\t'Ramshir',\n\t'Trakai',\n\t'Mohiuddinnagar',\n\t'Geddes',\n\t'Rinteln',\n\t'Nagarur',\n\t'Bagra',\n\t'Polkowice',\n\t'Ban Sathan',\n\t'Cotonou',\n\t'Trier',\n\t'Odenthal',\n\t'Oyim',\n\t'Tajarhi',\n\t'Birigui',\n\t'Moravske-Toplice',\n\t'Tatebayashi',\n\t'Serravalle Pistoiese',\n\t'Targuist',\n\t'Datu Paglas',\n\t'Aral',\n\t'Mazarron',\n\t'Dank',\n\t'Elk City',\n\t'Chandankiari',\n\t'Shatiancun',\n\t'Kakamas',\n\t'Sikat',\n\t'Bhawanandpur',\n\t'Stone Ridge',\n\t'Kushimoto',\n\t'Great Wyrley',\n\t'Tall Banat',\n\t'Yunfu',\n\t'Westville',\n\t'Karkamis',\n\t'Ingabu',\n\t'Rensselaer',\n\t'Tonbridge',\n\t'Phai Sali',\n\t'Vaiano',\n\t'Bikramganj',\n\t'Nawsari',\n\t'Akcaabat',\n\t\"Al Qa'im\",\n\t'Carambei',\n\t'Boloso',\n\t'Shijiazhuangnan',\n\t'Sidi Lahsene',\n\t'River Edge',\n\t'Shuozhou',\n\t'Walnut Park',\n\t'Ben Chicao',\n\t'Eggenfelden',\n\t'Floriano',\n\t'Sevilimedu',\n\t'Vesoul',\n\t'Chinna Kalaiyamputtur',\n\t'Los Cordobas',\n\t'Malimono',\n\t'Eslamabad-e Gharb',\n\t'Akersberga',\n\t'Bhaktapur',\n\t'Tokha',\n\t'Egelsbach',\n\t'Windham',\n\t'Shantou',\n\t'Joyo',\n\t'Asni',\n\t'Camacan',\n\t'Lomas de Zamora',\n\t'Pedernales',\n\t'Presidente Medici',\n\t'Itabirito',\n\t'Heris',\n\t'Zarraga',\n\t'Korgas',\n\t'Horti',\n\t'Aksaray',\n\t'Ghal Kalan',\n\t'Apex',\n\t'Tummapala',\n\t'Vavveru',\n\t'Maumee',\n\t'Chicomba',\n\t'La Madeleine',\n\t'Mekra',\n\t'Mataquescuintla',\n\t'Sitio do Quinto',\n\t'Khanah Sur',\n\t'World Golf Village',\n\t'Mambore',\n\t'Limoux',\n\t'Hinode',\n\t'Spodnji Duplek',\n\t'Yancheng',\n\t'Patia',\n\t'Caiguantun',\n\t'Gualdo Tadino',\n\t'Fulshear',\n\t'Dacun',\n\t'Nawabshah',\n\t'Sannicolau Mare',\n\t'Zontecomatlan de Lopez y Fuentes',\n\t'Devanangurichchi',\n\t'Kovur',\n\t'Manikganj',\n\t'Qal`ah-ye Zal',\n\t'Schuttorf',\n\t'Fushun',\n\t'Tsuruno',\n\t'Sikhio',\n\t'Tomelloso',\n\t'Israin Kalan',\n\t'Dinajpur',\n\t'Douar Oulad Mbarek',\n\t'Afanyangan',\n\t'North Branch',\n\t'Pattukkottai',\n\t'Malo Crnice',\n\t'Taboao da Serra',\n\t'Kathurah',\n\t'Tottori',\n\t'Gundlapelle',\n\t'Dusseldorf',\n\t'Guisser',\n\t'Abuyog',\n\t'Sabalgarh',\n\t'Cabugao',\n\t'Pata Kalidindi',\n\t'Mountain Top',\n\t'Limonar',\n\t'Urupes',\n\t'Mudhol',\n\t'Peranampattu',\n\t'Deyr',\n\t'San Enrique',\n\t'Santa Lucia',\n\t'Ghoriyan',\n\t'Pervomaiskyi',\n\t'Obikiik',\n\t'Jauli',\n\t'Grevenbroich',\n\t'Chupaca',\n\t'Ban Bueng Kok',\n\t'Rada`',\n\t'Chapeltique',\n\t'Ghazipur',\n\t'Barcarena Nova',\n\t'Kayaralam',\n\t'Saint-Gilles',\n\t'Crosby',\n\t'Tatahuicapan',\n\t'Nedumangad',\n\t'Meitingen',\n\t'Matomou',\n\t'Balud',\n\t'Yatou',\n\t'Stephanskirchen',\n\t'Same',\n\t'Rome',\n\t'Oud-Heverlee',\n\t'Mau Dhaneshpur',\n\t'Sparks',\n\t'Kyotango',\n\t'Hirokawa',\n\t'Kahama',\n\t'General Emilio Aguinaldo',\n\t'Bozhou',\n\t'Areiopolis',\n\t'Izumisano',\n\t'Karmauli',\n\t'Itele',\n\t'Ghedi',\n\t'Champdani',\n\t'Ringas',\n\t'Istog',\n\t'Madre de Deus',\n\t'San Jose',\n\t'Duraiswamipuram',\n\t'Kele',\n\t'Andujar',\n\t'Erdemli',\n\t'Iwakuni',\n\t'Clarines',\n\t'Saint-Martin-de-Crau',\n\t'Kankipadu',\n\t'Bantayan',\n\t'Kilibo',\n\t'Kerpen',\n\t'Moultrie',\n\t'Belaur',\n\t'Juan Rodriguez Clara',\n\t\"P'yongch'ang\",\n\t'Verukulambu',\n\t'Esenyurt',\n\t'Ban Muang Ngam',\n\t'Wako',\n\t'Yankou',\n\t'Radeberg',\n\t'Haddada',\n\t'Mill Creek East',\n\t'Szekesfehervar',\n\t'Lower Saucon',\n\t'Lijiacha',\n\t'Xushan',\n\t'Tumauini',\n\t'Molakalumuru',\n\t'Mayureswar',\n\t'Gnarrenburg',\n\t'Kefamenanu',\n\t'Lockhart',\n\t'Pulgaon',\n\t'El Palmar',\n\t'Champlain',\n\t'Adalpur',\n\t'Omboue',\n\t'Yueyaquan',\n\t'Melila',\n\t'Potomac Park',\n\t'Barranqueras',\n\t'Santa Cruz de la Sierra',\n\t\"Yan'an\",\n\t'Talwara',\n\t'Kod',\n\t'Hechi',\n\t'Green Bay',\n\t'Murzuq',\n\t'Farnham',\n\t'Roznava',\n\t'Merate',\n\t'Nathana',\n\t'Malakwal',\n\t'Buhi',\n\t'Tadepallegudem',\n\t'Monastyryshche',\n\t'Sneek',\n\t'Gaoshu',\n\t'Pergine Valsugana',\n\t'Fond des Blancs',\n\t'College',\n\t'Liuliang',\n\t'Huilongcun',\n\t'Ballymena',\n\t'Fitampito',\n\t'Herzogenaurach',\n\t'Weilheim',\n\t'Melegnano',\n\t'Coribe',\n\t'Thondiamannu',\n\t'Bermejo',\n\t'Granville',\n\t'Retalhuleu',\n\t'Mayari',\n\t'Tall Qasab',\n\t'Bisaria',\n\t'Bellinzona',\n\t'Klodzko',\n\t'Dessalines',\n\t'Zamosc',\n\t'Village St. George',\n\t'Sturgis',\n\t'Sanyi',\n\t'Vennandur',\n\t'El Paso',\n\t'Andurkonam',\n\t'Zitsa',\n\t'Dainyor',\n\t'Kaysville',\n\t'Tijucas do Sul',\n\t'Cap-Haitien',\n\t'Linslade',\n\t'Banki',\n\t'Santo Antonio do Amparo',\n\t'Diapaga',\n\t'Buqda Caqable',\n\t'Cochabamba',\n\t'Irthlingborough',\n\t'Ena',\n\t'Donostia',\n\t'Dippoldiswalde',\n\t'Gisenyi',\n\t'As Sanamayn',\n\t\"Capo d'Orlando\",\n\t'Bahcesaray',\n\t'Yamanouchi',\n\t'Balangkas',\n\t'Mihona',\n\t'Ambodimandresy',\n\t'El Mirage',\n\t'Gazojak',\n\t'Marvast',\n\t'Etzatlan',\n\t'Sicklerville',\n\t'Pocao',\n\t'Nicoadala',\n\t'Belo Campo',\n\t'Maina',\n\t'Piripiri',\n\t'Bani Hasan ash Shuruq',\n\t'McComb',\n\t'Southeast',\n\t'Cavriglia',\n\t'Kole',\n\t'Granger',\n\t'Rivera',\n\t'Ponferrada',\n\t'St. Anthony',\n\t'Queanbeyan',\n\t'Rangsdorf',\n\t'Rio Grande da Serra',\n\t'Carrieres-sur-Seine',\n\t'Brookhaven',\n\t'Lauderhill',\n\t'Puerto Jimenez',\n\t'Casas Adobes',\n\t'Aligudarz',\n\t'Buchireddipalem',\n\t'Mae Sai',\n\t'Guarai',\n\t'Sprimont',\n\t'Huizucar',\n\t'Teano',\n\t'Liria',\n\t'Zhemgang',\n\t'Funing',\n\t'Amorebieta',\n\t'Irece',\n\t'Bansang',\n\t'Shizukuishi',\n\t'Kummarapurugupalem',\n\t'Buzovna',\n\t'Vadakkumbagam',\n\t'Nago',\n\t'Toma',\n\t'Barra do Ribeiro',\n\t'Mentone',\n\t'Chorhat',\n\t'Norrkoping',\n\t'Hohoe',\n\t'Montefiascone',\n\t'Dario Meira',\n\t'Sopetran',\n\t'Dras',\n\t'Sadpur',\n\t'Miryang',\n\t'Jagoniguda',\n\t'Naklo',\n\t'Agcabadi',\n\t'Kermanshah',\n\t'Kauswagan',\n\t'Barah',\n\t'Araujos',\n\t'Herculandia',\n\t'Sironj',\n\t'Varazdin',\n\t'Macomb',\n\t'Corcoran',\n\t'Molfetta',\n\t'River Vale',\n\t'Ban Bang Krang',\n\t'Cutrofiano',\n\t'Muh Hasan',\n\t'Warnes',\n\t'Ottobeuren',\n\t'Pendencias',\n\t'Wood-Ridge',\n\t'Guttikonda',\n\t\"Saint John's\",\n\t'White Marsh',\n\t'Vatomandry',\n\t'Shrirampur',\n\t'Ambahita',\n\t'Olean',\n\t'Hanno',\n\t'Jask',\n\t'Navelim',\n\t'Camalaniugan',\n\t'Boumahra Ahmed',\n\t'Porto Real do Colegio',\n\t'Geneseo',\n\t'Risod',\n\t'Rio Negro',\n\t'Kendu Bay',\n\t'Soro',\n\t'Etawah',\n\t'Khed Brahma',\n\t'Fukuyoshi',\n\t'Ikot Okoro',\n\t'Marahra',\n\t'Coimbra',\n\t'Svitavy',\n\t'Urdaneta',\n\t'Takhatgarh',\n\t'Khanjahanpur',\n\t'Chatelet',\n\t'Babile',\n\t'Budrio',\n\t'Samma',\n\t'Konigsbach-Stein',\n\t'Dobris',\n\t'Rheine',\n\t'Porkeri',\n\t'Menzel Abderhaman',\n\t'Jhonkar',\n\t'Torrance',\n\t'Ladan Kara',\n\t'Lealman',\n\t'Witzenhausen',\n\t'Ribeira do Pombal',\n\t'Madhopur',\n\t'Villarrica',\n\t'Makurdi',\n\t'Pleasanton',\n\t'Gullapuram',\n\t'Aboisso',\n\t'Gravatai',\n\t'Chinnamanur',\n\t'Longjia',\n\t'Chinna Orampadu',\n\t'Bangar',\n\t'Summerlin South',\n\t'Obiliq',\n\t'Kurate',\n\t'Wentzville',\n\t'Vallet',\n\t'Moalboal',\n\t'Ambohidrapeto',\n\t'Tecozautla',\n\t'Passagem Franca',\n\t'Armthorpe',\n\t'Kuchai Kot',\n\t'Lata',\n\t'Kashasha',\n\t'Auburndale',\n\t'Ban Tom Klang',\n\t'Shendurjana',\n\t'Chikushino',\n\t'Varandarapilli',\n\t'Highlands',\n\t'Harua',\n\t'Namaacha',\n\t'Presidente Dutra',\n\t'Ipu',\n\t'Bockhorn',\n\t'Davangere',\n\t'Saint-Michel-sur-Orge',\n\t'Crowley',\n\t'Tamganj',\n\t'Aklera',\n\t'Tiruppachur',\n\t'Candelaria de La Frontera',\n\t'Sidi Aoun',\n\t'Verrettes',\n\t'El Bolson',\n\t'Itamaraju',\n\t'Corbetta',\n\t'Borger',\n\t'Kodavatipudi',\n\t'Poisy',\n\t'Kakamigahara',\n\t'Petite Riviere de Nippes',\n\t'Hammanskraal',\n\t'Tonami',\n\t'Santa Maria Jalapa del Marques',\n\t'Los Palacios',\n\t'Rolim de Moura',\n\t'Ambahatrazo',\n\t'North Little Rock',\n\t'Cheyyar',\n\t'Masakkavundanchettipalaiyam',\n\t'Moorhead',\n\t'Khamir',\n\t\"L'Assomption\",\n\t'Galliate',\n\t'Bad Zwischenahn',\n\t'Tiruvadi',\n\t'Ferreira do Zezere',\n\t'Brecht',\n\t'Mampikony',\n\t'La Pointe',\n\t'Ulipuram',\n\t'Rubizhne',\n\t\"Sant'Angelo in Lizzola\",\n\t'Charkhari',\n\t'Atascocita',\n\t'Ternitz',\n\t'Olfen',\n\t'Hughenden',\n\t'Getulina',\n\t'Kewatgawan',\n\t'Konza',\n\t'Ocean',\n\t'Koziatyn',\n\t'Epanomi',\n\t'Mattul',\n\t'Meise',\n\t'Hazrat Shiura',\n\t'Plzen',\n\t'Tokunoshima',\n\t'Guelmim',\n\t'Targu Neamt',\n\t'Fugu',\n\t'Petroupoli',\n\t'Cueramaro',\n\t'Karaman',\n\t'Palmira',\n\t'Rajasur',\n\t'Calenzano',\n\t'Puerto Cabello',\n\t'Kaizu',\n\t'Pavullo nel Frignano',\n\t'Embalse',\n\t'Pocatello',\n\t'Milngavie',\n\t'Cachoeira de Minas',\n\t'Barra',\n\t'Savanette',\n\t'Surbo',\n\t'Ronda Alta',\n\t'Baghlia',\n\t'Chanasma',\n\t'Waterlooville',\n\t'Stord',\n\t'Kapiri Mposhi',\n\t'Plombieres',\n\t'Khutubi',\n\t'Pobe',\n\t'Trashi Yangtse',\n\t'Cranston',\n\t'Capinota',\n\t'Itambe',\n\t'Undi',\n\t'South Lyon',\n\t'St. George',\n\t'Anlu',\n\t'Anantavur',\n\t'Lake Arrowhead',\n\t'Kankuria',\n\t'Mellacheruvu',\n\t'Novy Bor',\n\t'Palacaguina',\n\t'La Corredoria',\n\t'Somerset',\n\t'Encrucijada',\n\t'Rampur Tilak',\n\t'Bay Point',\n\t'Changhua',\n\t'Ousseltia',\n\t\"Finch'a'a\",\n\t'Ap Binh Thanh',\n\t'Coonoor',\n\t'Nachikatsuura',\n\t'Shanhur',\n\t'Proserpine',\n\t'Melavayi',\n\t'Celebration',\n\t'Chalkari',\n\t'Pedda Pendyala',\n\t'Aravakkurichchi',\n\t'Oranjemund',\n\t'Langfang',\n\t'Jinjiang',\n\t'Ziracuaretiro',\n\t'Misseni',\n\t'El Ayote',\n\t'Penamaluru',\n\t'Kadinamkulam',\n\t'Villa Hidalgo',\n\t'Hallandale Beach',\n\t'Periya Semur',\n\t'Ifakara',\n\t'Baucau',\n\t'Cesa',\n\t'Antiguo Cuscatlan',\n\t'Barnstaple',\n\t'Grottammare',\n\t'Rottenburg an der Laaber',\n\t'Befasy',\n\t'Nusaybin',\n\t'White Bear Lake',\n\t'Joaquin V. Gonzalez',\n\t'Dorval',\n\t'Raghopur',\n\t'La Garde',\n\t'Laukaha',\n\t'Chawalhati',\n\t'Burnham',\n\t'Padinska Skela',\n\t'Bilehra',\n\t'Rosemead',\n\t'Grafton',\n\t'Diemen',\n\t'Centre de Flacq',\n\t'Yomra',\n\t'Attanur',\n\t'Haspra',\n\t'Liquica',\n\t'Mala Vyska',\n\t'Sanger',\n\t'Ban Kat',\n\t'Miami',\n\t'Karmegh',\n\t'Montmelo',\n\t'Santa Cruz Verapaz',\n\t'Sao Gabriel',\n\t'Jose Marmol',\n\t'Wallisellen',\n\t'Izumiotsu',\n\t'Mashhad Rizeh',\n\t'Tiszafoldvar',\n\t'Limoges',\n\t'Kuzhippilli',\n\t'Vergara',\n\t'Bukavu',\n\t'Awasa',\n\t'Rusera',\n\t'Baragoi',\n\t'Coolidge',\n\t'Karjan',\n\t'Jagannathpur',\n\t'Somireddipalle',\n\t'Hamura',\n\t'Domchanch',\n\t'Salama',\n\t'Charmahin',\n\t'Ocotlan',\n\t'Cajidiocan',\n\t'Dembecha',\n\t'Great Sankey',\n\t'Katsepy',\n\t'Casteel',\n\t'Netapur Tanda',\n\t'Vangviang',\n\t'Lala Musa',\n\t'Treia',\n\t'Coon Rapids',\n\t'Jaromer',\n\t'Sociedad',\n\t'Ganda',\n\t'Belao',\n\t'Una',\n\t'Feijo',\n\t'Halen',\n\t'Courrieres',\n\t'Rendsburg',\n\t'Djangoa',\n\t'Gotse Delchev',\n\t'Pematangsiantar',\n\t'City of Isabela',\n\t'Traversetolo',\n\t'Sahuria',\n\t'Hardia',\n\t'Bhagwanpur Desua',\n\t'Karamay',\n\t'Dammennu',\n\t'Pedra Preta',\n\t'Zakiyah',\n\t'Wagner',\n\t'Naka',\n\t'Searcy',\n\t'Pak Chong',\n\t'Kreuzau',\n\t'Ammur',\n\t'Curimata',\n\t'Oued Lill',\n\t'Esplanada',\n\t'Dagana',\n\t'Villalba',\n\t'Qorovulbozor',\n\t'Mengdan',\n\t'Kenosha',\n\t'Lumbatan',\n\t'Beyla',\n\t'Billdal',\n\t'Barao do Grajau',\n\t'Antsatramidola',\n\t'Moirang',\n\t'Jalakati',\n\t'Sakhipur',\n\t'Tyler',\n\t'Gornji Milanovac',\n\t'Ootacamund',\n\t'Luruaco',\n\t'Cowra',\n\t'Jenison',\n\t'Dar`a',\n\t'Guamare',\n\t'Palatka',\n\t'Brooklyn Center',\n\t'Bondo',\n\t'Paracuellos de Jarama',\n\t'Troon',\n\t'Passy',\n\t'Laredo',\n\t'Rubim',\n\t'Brand-Erbisdorf',\n\t'Pofadder',\n\t'Itzehoe',\n\t'Yuyao',\n\t'Sao Carlos',\n\t'Jiangdi',\n\t'Avon',\n\t'Mission Viejo',\n\t'Mbaiki',\n\t'Kakan',\n\t'Aland',\n\t'Marlborough',\n\t'Mesetas',\n\t'Shahrinav',\n\t'Kourou',\n\t'Kobilje',\n\t'Kragujevac',\n\t'Corigliano Calabro',\n\t'Jalpan',\n\t'Kongoussi',\n\t'Sursand',\n\t'Jiangjiadong',\n\t'Ja`fariyeh',\n\t'Fulham',\n\t'Jhabrera',\n\t'Tumberi',\n\t'Masunga',\n\t'Schellenberg',\n\t'Binfield',\n\t'Jose C. Paz',\n\t'Padre Garcia',\n\t'Tillor Khurd',\n\t'Alta Gracia',\n\t'Subotica',\n\t'Zaandijk',\n\t'Ochsenfurt',\n\t'Cholpon-Ata',\n\t'Veinticinco de Diciembre',\n\t'Shuangtian',\n\t'Madalum',\n\t'Dianguirde',\n\t'Pitangui',\n\t'Patacamaya',\n\t'Kosvik',\n\t'Xiba',\n\t'Debagram',\n\t'Ban Na Kham',\n\t'Sao Francisco do Conde',\n\t'Stegen',\n\t'Bulalacao',\n\t'Pala Oua',\n\t'Pak Kret',\n\t'Mundahal Khurd',\n\t'Befotaka',\n\t'Gobindpura',\n\t'Al Aaroui',\n\t'Mwenga',\n\t'Caturama',\n\t'Pelengana',\n\t'Kandel',\n\t'Vila Real',\n\t'Bechloul',\n\t'Nykobing Falster',\n\t'Mazabuka',\n\t'Binka',\n\t'Konongo',\n\t'Wrzesnia',\n\t'Vasiana',\n\t'Khan Shaykhun',\n\t'Tolna',\n\t'Piedrahita',\n\t'Wilsele',\n\t'Ye',\n\t'Acucena',\n\t'Ames',\n\t'Ventnor City',\n\t'Elhovo',\n\t'Bajiao',\n\t'Torreon',\n\t'Lana',\n\t'Herrenberg',\n\t'Pira',\n\t'Pascagoula',\n\t'Takeo',\n\t'Nuevitas',\n\t'Foothill Farms',\n\t'Mogotes',\n\t'Los Palacios y Villafranca',\n\t'Tanuku',\n\t'Oroszlany',\n\t'Sanyo-Onoda',\n\t'Eichenau',\n\t'Sundapalaiyam',\n\t'Kanoni',\n\t'Dioungani',\n\t'Evora',\n\t'Funtua',\n\t'Kawkareik',\n\t'Coffs Harbour',\n\t'Villiers',\n\t'Caldiran',\n\t'Palakkuzhi',\n\t'Sassenburg',\n\t'Oravita',\n\t'Liaojiayuan',\n\t'Nisshin',\n\t'Sirkhandi Bhitha',\n\t'Union de Tula',\n\t'Chitila',\n\t'Montecito',\n\t'Bozuyuk',\n\t'Sahiwal',\n\t'Nidamangalam',\n\t'Beixingzhuang',\n\t'Alaminos',\n\t'Kobiri',\n\t'Drawsko Pomorskie',\n\t'Manassas Park',\n\t'Nu`ayjah',\n\t'Ndjili',\n\t'Hamidiyeh',\n\t'Pleiku',\n\t'Candon',\n\t'Samokov',\n\t'La Belleza',\n\t'Kargil',\n\t'Barugo',\n\t'Leichlingen',\n\t'Rizal',\n\t'Chhabila',\n\t'Sinanpasa',\n\t'Kabudarahang',\n\t'Yonghetun',\n\t'Selden',\n\t'Longchuan',\n\t'Guanduqiao',\n\t'Tinnanur',\n\t'Mandsaur',\n\t'Joso',\n\t'Besarh',\n\t'Decin',\n\t'Kut Chap',\n\t'Botolan',\n\t'Grad',\n\t'Dumaguete City',\n\t'Mimoso do Sul',\n\t'Tello',\n\t'Iwate',\n\t'Pordenone',\n\t'Naihati',\n\t'Painesville',\n\t'Alatsinainy Ialamarina',\n\t'Rinopolis',\n\t'Mut',\n\t'Shirahama',\n\t'Port Alfred',\n\t'Nantan',\n\t'Catuipe',\n\t'Isola Vicentina',\n\t'Barahkurwa',\n\t'Kladno',\n\t'Biritiba-Mirim',\n\t'Southwater',\n\t'Kariya',\n\t'Kearney',\n\t'Botosani',\n\t'Queen Creek',\n\t'Tamanique',\n\t'Putla Villa de Guerrero',\n\t'Visbek',\n\t'Apac',\n\t'Grossbeeren',\n\t'Chislehurst',\n\t'Esposende',\n\t'Winnipeg',\n\t'Thermi',\n\t'Mahires',\n\t'Neshannock',\n\t'Clearwater',\n\t'Tallinn',\n\t'Manegaon',\n\t'Nabua',\n\t'Baxter',\n\t'Arlington Heights',\n\t'Manafwa',\n\t'Groenlo',\n\t'Ngerengere',\n\t'Lakato',\n\t'Corner Brook',\n\t'Palakodu',\n\t'San Pietro Vernotico',\n\t'Arouca',\n\t'Bad Nenndorf',\n\t'Ban Nong Hoi',\n\t'Grand Island',\n\t'Perris',\n\t'Long My',\n\t'Contai',\n\t'Berlare',\n\t'Hlinsko',\n\t'Oum Hadjer',\n\t'Kusatsu',\n\t'Kamudi',\n\t\"N'Zerekore\",\n\t'Minoo',\n\t'Moulares',\n\t'Taybad',\n\t'Nayanagar',\n\t'Barberena',\n\t'Oromocto',\n\t'Phirangipuram',\n\t'Neosho',\n\t'Leno',\n\t'Fakirtaki',\n\t'Noto',\n\t'Phulpur',\n\t'Karahal',\n\t'Alur',\n\t'Garcia Hernandez',\n\t'Zawodzie',\n\t'Gararu',\n\t'Wallsend',\n\t'Debre Birhan',\n\t'Bargaon',\n\t'Washougal',\n\t'Wutong',\n\t'Kajha',\n\t'Tamilisan',\n\t'Ambohimasina',\n\t'Abha',\n\t'Holguin',\n\t'Epe',\n\t'Owen Sound',\n\t'Essen',\n\t'Sermadevi',\n\t'Naga',\n\t'Kanjikkovil',\n\t'Maracai',\n\t'Kyongju',\n\t'Oulad Friha',\n\t'Camp Pendleton South',\n\t'Govindapuram',\n\t'Sligo',\n\t'Cubal',\n\t'Mamuju',\n\t'Talca',\n\t'Carcagente',\n\t'Bagepalli',\n\t'Liuba',\n\t'Nao-Me-Toque',\n\t'Punitaqui',\n\t'Saint-Pierre-du-Perray',\n\t'Manila',\n\t'Alkmaar',\n\t'Providence',\n\t'Xinguara',\n\t'Jangaon',\n\t'Ibimirim',\n\t'McAlester',\n\t'Saalfeld',\n\t'Palladam',\n\t'Yacuanquer',\n\t'Port Denison',\n\t'Mama Khel',\n\t'Stabroek',\n\t'Lake Arbor',\n\t'Killingworth',\n\t'Ouled Chebel',\n\t'Utnur',\n\t'Kandangan',\n\t'Soest',\n\t'Tbeng Meanchey',\n\t'Haoping',\n\t'Sater',\n\t'West Bromwich',\n\t'Mandiraja Kulon',\n\t'Karczew',\n\t'Krems an der Donau',\n\t'Osako',\n\t'Budwan',\n\t'Scalea',\n\t'Gersthofen',\n\t'Shiloh',\n\t'Kopargo',\n\t'Trotwood',\n\t'Teltow',\n\t'Annonay',\n\t'Makwassie',\n\t'Ouled Rached',\n\t'Rankweil',\n\t'Farmington Hills',\n\t'Mbini',\n\t'Horice',\n\t'Jacqueville',\n\t'Banbishancun',\n\t'Tamanar',\n\t'Konidena',\n\t'Hengzhou',\n\t'Liverpool',\n\t'Marofototra',\n\t'Cheruvannur',\n\t'Iormughanlo',\n\t'Tomar',\n\t'Si Satchanalai',\n\t'Guiseley',\n\t'Bicske',\n\t'Richland',\n\t'Elizabeth',\n\t'Linares',\n\t'Narbonne',\n\t'Agua Azul do Norte',\n\t'Crateus',\n\t'Luton',\n\t'Bardstown',\n\t'Amiawar',\n\t'Dulhanganj',\n\t'Senanga',\n\t'Kobylka',\n\t'Imlil',\n\t'St. Catharines',\n\t'Laziska Gorne',\n\t'An Cabhan',\n\t'Tarbes',\n\t'Leutenbach',\n\t'Frederiksvaerk',\n\t'Sechura',\n\t'Geldermalsen',\n\t'Krishnarajasagara',\n\t'Catarroja',\n\t'Dugo Selo',\n\t'Brieselang',\n\t'Kosum Phisai',\n\t'East Fishkill',\n\t'Sendhwa',\n\t'Ampasinambo',\n\t'Urbano Santos',\n\t'Myaydo',\n\t'Premnagar',\n\t'Andovoranto',\n\t'Yaraka',\n\t'Fuller Heights',\n\t'Tarqui',\n\t'Struer',\n\t'Chintalapalle',\n\t'Boali',\n\t'Keswick',\n\t'Deal',\n\t'Tayasan',\n\t'Sakha',\n\t'Vandalur',\n\t'Somma Vesuviana',\n\t'Almaguer',\n\t'Jacksonville Beach',\n\t'Yuxi',\n\t'Torhout',\n\t'Buqkoosaar',\n\t\"O'Hara\",\n\t'Dortmund',\n\t'Freeport City',\n\t'Poptun',\n\t'Upper Grand Lagoon',\n\t'Shendi',\n\t'Cuautitlan Izcalli',\n\t'Blagnac',\n\t'Letpandan',\n\t'Bhachhi',\n\t'Dunavarsany',\n\t'Lessogou',\n\t'Elze',\n\t'Clare',\n\t'Harvey',\n\t'Ain Feka',\n\t'Wayne',\n\t'Pohang',\n\t'Pothia',\n\t'Pokhraira',\n\t'Pontalina',\n\t'Amatura',\n\t'Sao Joao das Lampas',\n\t'Pinan',\n\t'Sidi Lakhdar',\n\t'Badami',\n\t'Matadepera',\n\t\"Sant'Agata di Militello\",\n\t'Laiyang',\n\t'Selmana',\n\t'Rothwell',\n\t'Kamareddipet',\n\t'Hobe Sound',\n\t'Mong Tun',\n\t'Armur',\n\t'Islampur',\n\t'Wadgassen',\n\t'Selma',\n\t'Momanpet',\n\t'Aktepe',\n\t'Mjolby',\n\t'Patchogue',\n\t'Nueva Loja',\n\t'Kronjo',\n\t'Turuvekere',\n\t'Tejupilco',\n\t'Vetraz-Monthoux',\n\t'Rickmansworth',\n\t'Cicuco',\n\t'Chandigarh',\n\t'Winslow',\n\t'Amtala',\n\t'Waingapu',\n\t'Mayuge',\n\t'Ruse',\n\t'Sindangan',\n\t'Xankandi',\n\t'Al Qutayfah',\n\t'Llorente',\n\t'Naliya',\n\t\"Az Zarqa'\",\n\t'Bomporto',\n\t'Wadern',\n\t'Cegled',\n\t'Jalapa',\n\t'Shizhaobi',\n\t'Union de Reyes',\n\t'Nahargarh',\n\t'Massapequa Park',\n\t'Kalvarija',\n\t'Portes-les-Valence',\n\t'Sidi ech Chahmi',\n\t'Hope',\n\t'Cumbal',\n\t'Soalkuchi',\n\t'Modling',\n\t'Khujner',\n\t'Biederitz',\n\t'Laval',\n\t'Mikkeli',\n\t'Otopeni',\n\t'Qashyr',\n\t'Noisy-le-Grand',\n\t'Titao',\n\t'Koga',\n\t'Tipasa',\n\t'Bukoba',\n\t'Pruszcz Gdanski',\n\t'Tachiarai',\n\t'Na Yung',\n\t'Oignies',\n\t'Fillmore',\n\t'Tachilek',\n\t'Lathrop',\n\t'Binalbagan',\n\t'Kallidaikurichi',\n\t'Leova',\n\t'Adazi',\n\t'Caibarien',\n\t'El Obeid',\n\t'Pareo',\n\t'Whitstable',\n\t'Raymond',\n\t'Centenario',\n\t'Zhangziying',\n\t'Satyavedu',\n\t'Uspantan',\n\t'Castelli',\n\t'Zuitou',\n\t'Chiradzulu',\n\t'Tadif',\n\t'Stains',\n\t'Mathba',\n\t'St. Clair',\n\t'Beni Ounif',\n\t'Aripuana',\n\t'Cumana',\n\t'Bhui',\n\t'Jeddah',\n\t'Settara',\n\t'San Andres de Llevaneras',\n\t'Fermo',\n\t'Kinross',\n\t'Sanjiaocheng',\n\t'Serrita',\n\t'Analapatsy',\n\t'La Bruyere',\n\t'Bac Giang',\n\t'Manticao',\n\t'Jaen',\n\t'Uzumlu',\n\t'Pauri',\n\t'Fernandina Beach',\n\t'Mullaittivu',\n\t'Fairfield Glade',\n\t'Dougouni',\n\t'Shuangyashan',\n\t'Ashford',\n\t'Dalan',\n\t'Longchamps',\n\t'Berat',\n\t'Mirangaba',\n\t'Bhagta',\n\t'Bodmin',\n\t'Wittenbach',\n\t'Capriolo',\n\t'Plock',\n\t'Petropolis',\n\t'Nimmekal',\n\t'Eisenberg',\n\t'Minakshipuram',\n\t'Fox Lake',\n\t'Simunul',\n\t'Zhangatas',\n\t'Besikduzu',\n\t'Diepenbeek',\n\t'Castalla',\n\t'Nakaseke',\n\t'Daimiel',\n\t'Aguascalientes',\n\t'Bluefields',\n\t'Weinheim',\n\t'Khirhar',\n\t'Vilkaviskis',\n\t'Gorha',\n\t'Condeixa-a-Nova',\n\t'Shikokuchuo',\n\t'Maghar',\n\t'Khutha Baijnath',\n\t'Kathmandu',\n\t'Tornesch',\n\t'Isernia',\n\t'Koriapatti',\n\t'Tharike',\n\t'Hastings',\n\t'Pindra',\n\t'Eislingen',\n\t'Bridgetown',\n\t'Salt Lake City',\n\t'Kashti',\n\t'Hulyaypole',\n\t'Sexmoan',\n\t'Shrewsbury',\n\t'Tha Yang',\n\t'Waghai',\n\t'Scone',\n\t'Ritto',\n\t'Sukrah',\n\t'Strausberg',\n\t'Kurhani',\n\t'Nesarg',\n\t'Ciudad Constitucion',\n\t'Francavilla Fontana',\n\t'Langenselbold',\n\t'Soklogbo',\n\t'Deinze',\n\t'Zaanstad',\n\t'Lafia',\n\t'Prosperidad',\n\t'Rumuruti',\n\t'Savigliano',\n\t'Hundested',\n\t'Neuhausen auf den Fildern',\n\t'Chitre',\n\t'Sarrebourg',\n\t'Ayanikkad',\n\t'Dapoli',\n\t'Centerton',\n\t'Plettenberg',\n\t'Skocjan',\n\t'Oamishirasato',\n\t'Penticton',\n\t'Aurillac',\n\t'Red Hook',\n\t'Kiel',\n\t'Mannadipattu',\n\t'Ronchi dei Legionari',\n\t'Az Zuwaytinah',\n\t'Ulverston',\n\t'Tholikuzhi',\n\t'Phrai Bueng',\n\t'St. Paul',\n\t'Shenley Church End',\n\t'Gourrama',\n\t'Itiuba',\n\t'Bena',\n\t'Partinico',\n\t'Fort Thomas',\n\t'Marasesti',\n\t\"Monte Sant'Angelo\",\n\t'Lubbecke',\n\t'Grande-Synthe',\n\t'Jincheng',\n\t'Monteros',\n\t'Randburg',\n\t'Shakopee',\n\t'Escuque',\n\t'Bauko',\n\t'Muscatine',\n\t'Ralla',\n\t'Usuppur',\n\t'Iwaki',\n\t'Compton',\n\t'Isna',\n\t'Suhbaatar',\n\t'Igboho',\n\t'San Rafael Cedros',\n\t'Lapua',\n\t'Zdzieszowice',\n\t'Arcadia',\n\t'Orotina',\n\t'Bogande',\n\t'Alpignano',\n\t'Highland Park',\n\t'Newberg',\n\t'Veles',\n\t'Scituate',\n\t'Bellatti',\n\t'Tempio Pausania',\n\t'Buri Ram',\n\t'Marquette',\n\t'Niquinohomo',\n\t'Cuddalore',\n\t'Waimalu',\n\t'Potiskum',\n\t'Mohammedia',\n\t'Bamiantong',\n\t'La Trinitaria',\n\t'Bekes',\n\t'Cajabamba',\n\t'Conyers',\n\t'Malungun',\n\t'Takehara',\n\t'Aspen Hill',\n\t'Suzuka',\n\t'Ait Youssef Ou Ali',\n\t'Klaipeda',\n\t'Churriana de la Vega',\n\t'Malpura',\n\t'Romano di Lombardia',\n\t'Jose de Freitas',\n\t'Soc Trang',\n\t'Brahmadesam',\n\t'Chalons-en-Champagne',\n\t'Guria',\n\t'Talwandi Sabo',\n\t'Makhmur',\n\t'Podvelka',\n\t'Satghara',\n\t'Chimteppa',\n\t'Yaypan',\n\t'Kearsley',\n\t'Qianwangcun',\n\t'Suratgarh',\n\t'Santa Helena de Goias',\n\t'San Andres Itzapa',\n\t'Zulakallu',\n\t'Pinos Puente',\n\t'El Carmen de Bolivar',\n\t'Nahiyat al Iskandariyah',\n\t'Kasterlee',\n\t'Cabries',\n\t'Dakhan',\n\t'Senguio',\n\t'Lachute',\n\t'Bni Quolla',\n\t'Indanan',\n\t'Spennymoor',\n\t'Pottireddippatti',\n\t'Chaville',\n\t'Goto',\n\t'Somoto',\n\t'Antaritarika',\n\t'Chikkala',\n\t'Maheswa',\n\t'Schmallenberg',\n\t'Itajuba',\n\t'Udarband',\n\t'Itanhaem',\n\t'Sandiacre',\n\t'Castlegar',\n\t'Maler Kotla',\n\t'Kuressaare',\n\t'Huangxicun',\n\t'Sand',\n\t'Farrokh Shahr',\n\t'Valandovo',\n\t'Madakkathara',\n\t'Kaurihar',\n\t'Santa Lucia La Reforma',\n\t'Gjirokaster',\n\t'Indore',\n\t'Thorigne-Fouillard',\n\t'Fiorano Modenese',\n\t'Drexel Hill',\n\t'Ash Shamiyah',\n\t'Baia Farta',\n\t'Chakdaha',\n\t'Dambulla',\n\t'Muttukuru',\n\t'Chiesanuova',\n\t'Mehran',\n\t'Metkovic',\n\t'Portomaggiore',\n\t'Spokane',\n\t'Oldbury',\n\t'Vilattikulam',\n\t'Nasushiobara',\n\t'San Martin de Loba',\n\t'Campo Largo',\n\t'Yenakiieve',\n\t'Uropa',\n\t'Kaleybar',\n\t'Mit Salsil',\n\t'Hedehusene',\n\t'Gross-Enzersdorf',\n\t'Germiston',\n\t'Qal`eh Chan`an',\n\t'Rocky Point',\n\t'Cingoli',\n\t'Garden Grove',\n\t'Ouro Preto',\n\t'Mead Valley',\n\t'Liwonde',\n\t'Kokologo',\n\t'Monona',\n\t'Funato',\n\t'College Park',\n\t'Tighedouine',\n\t'Peringottukurusshi',\n\t'Ankilimivory',\n\t'Tabina',\n\t'Bahagalpur',\n\t'Huelva',\n\t'Musashino',\n\t'Igapora',\n\t'San Antonio Huista',\n\t'Cristais',\n\t'Rajkot',\n\t'Hasseh',\n\t'Wyckoff',\n\t'Rukungiri',\n\t'Rio Pomba',\n\t'Morteros',\n\t'Camillus',\n\t'Cholai',\n\t'Alto Rio Doce',\n\t'Imperatriz',\n\t'Ross on Wye',\n\t'Gairtganj',\n\t'Sakubva',\n\t'Porsgrunn',\n\t'Oss',\n\t'Dickson',\n\t'Famailla',\n\t'Napak',\n\t'La Tebaida',\n\t'Dhaka',\n\t'Pulicat',\n\t'Dayr Mawas',\n\t'Rampur Kudarkatti',\n\t'La Rochelle',\n\t'Cowansville',\n\t'Van Buren',\n\t'Montevideo',\n\t\"Sant'Antimo\",\n\t'IJmuiden',\n\t'Urtaowul',\n\t'Chtiba',\n\t'Bavanat',\n\t'Mooresville',\n\t'Longbangcun',\n\t'Marawi',\n\t'Meppel',\n\t'Ha Long',\n\t'Matsubushi',\n\t'Massakory',\n\t'Jamsaut',\n\t'Uzungoz',\n\t'Phatthaya',\n\t'Glew',\n\t'Gavimane',\n\t'Ionia',\n\t'Hackney',\n\t'Shanshan',\n\t'Chilanga',\n\t'Puerto El Triunfo',\n\t'Egg Buckland',\n\t'Ladner',\n\t'Chapadinha',\n\t'Mangualde',\n\t'Aisai',\n\t'Itamati',\n\t'Kunkalagunta',\n\t'Yucheng',\n\t'Ozhur',\n\t'Volochysk',\n\t'Garliava',\n\t'Ananindeua',\n\t'Naugatuck',\n\t'Toronto',\n\t'Daoukro',\n\t'Isperih',\n\t'Sebaco',\n\t'Apizaco',\n\t'Curepto',\n\t'Phimai',\n\t'Melzo',\n\t'Edd',\n\t'Santo Agostinho',\n\t'Chystiakove',\n\t'Kobilo',\n\t'Rafai',\n\t'Potchefstroom',\n\t'Ban Bang Sai',\n\t'Makato',\n\t'Mairinque',\n\t'Suwalki',\n\t'Vinh Yen',\n\t'Odobesti',\n\t'Rogerstone',\n\t'Campos Belos',\n\t'Nanguneri',\n\t'Ban Mon Pin',\n\t'Bududa',\n\t'Devikapuram',\n\t'Pietrasanta',\n\t'Lienen',\n\t'Ma`arrat an Nu`man',\n\t'Jicome',\n\t'Bockenem',\n\t'Bossembele',\n\t'Dongchuan',\n\t'Tepetlan',\n\t'Piddig',\n\t'Cheektowaga',\n\t'Vohipeno',\n\t'Soubala',\n\t'Xalapa',\n\t'Peru',\n\t'Middlesborough',\n\t'Oral',\n\t'Villa Celina',\n\t'Bacacay',\n\t'Gangapur',\n\t'Loyola Heights',\n\t'South Riding',\n\t'Gurupi',\n\t'Galapa',\n\t'Bagor',\n\t'Chitemo',\n\t'Birnin Kebbi',\n\t'Tagajo',\n\t'Maychew',\n\t'Worms',\n\t'Tesanj',\n\t'South El Monte',\n\t'Kitcharao',\n\t'Shorewood',\n\t'Agen',\n\t'Kargi',\n\t'Oppicherla',\n\t'Van',\n\t'Port Augusta',\n\t'Ahlen',\n\t'Moudjbara',\n\t'Ghaxaq',\n\t'El Arrouch',\n\t'Carson',\n\t'Kitatajima',\n\t'Kamp-Lintfort',\n\t'Kachhari',\n\t'Fort Myers',\n\t'Imbituva',\n\t'North Charleston',\n\t'Unterfohring',\n\t'Triangle',\n\t'Tuntum',\n\t'Dollard-des-Ormeaux',\n\t'Eschweiler',\n\t'Pomorie',\n\t'Xewkija',\n\t'Buenavista',\n\t'Arsanjan',\n\t'Demnat',\n\t'Saharefo',\n\t'Maragogi',\n\t'Odivelas',\n\t'Villaviciosa de Odon',\n\t'Keszthely',\n\t'Alcantarilla',\n\t'Loutraki',\n\t'Falou',\n\t'Linfen',\n\t'Azamnagar',\n\t'Karvina',\n\t'Shady Hills',\n\t'Chopda',\n\t'Vredefort',\n\t'Westmont',\n\t'Ulaanbaatar',\n\t'Southbridge',\n\t'North Druid Hills',\n\t'Viseu',\n\t'Le Thor',\n\t'Tacaratu',\n\t'Elur',\n\t'Motupe',\n\t'Trim',\n\t'Chorzow',\n\t'Kelle',\n\t'Ljutomer',\n\t'Kanbara',\n\t'Maroviro',\n\t'Zapotitlan',\n\t'Forlimpopoli',\n\t'Dhuusamarreeb',\n\t'Bakwa-Kalonji',\n\t'Bakeshiyingcun',\n\t'Ngoulemakong',\n\t'Nor Hachn',\n\t'Ejmiatsin',\n\t'Handlova',\n\t'Pillaiyarkuppam',\n\t'Miramar',\n\t'Nanyo',\n\t'Northampton',\n\t'Heerenveen',\n\t'Doiwala',\n\t'Engenheiro Caldas',\n\t'Undrajavaram',\n\t'Mahudha',\n\t'Ashtead',\n\t'Kotagiri',\n\t'Nieuw Amsterdam',\n\t'Hamakita',\n\t'Ipueiras',\n\t'Mannargudi',\n\t'Ramsey',\n\t'La Mata',\n\t'Strabane',\n\t'Meaford',\n\t'Truseni',\n\t'Kanhangad',\n\t'Matanga',\n\t'Seohara',\n\t'Hijuelas',\n\t'Narvik',\n\t'Alamada',\n\t'Moslem Ebn-e `Aqil',\n\t'Kabasalan',\n\t'Mataram',\n\t'Jagodina',\n\t'Zifta',\n\t'Jambughoda',\n\t'Ledeberg',\n\t'Melonguane',\n\t'Okuizumo',\n\t'Petion-Ville',\n\t'Coweta',\n\t'Chiniot',\n\t'Ntara',\n\t'Munuf',\n\t'West Falls Church',\n\t'Kanchanaburi',\n\t'Nahiyat al Kifl',\n\t'Aqsu',\n\t'Ghaziabad',\n\t'Katpadi',\n\t'Midalam',\n\t'Omegna',\n\t'Noci',\n\t'Taniyama-chuo',\n\t'Patrocinio Paulista',\n\t'Merseburg',\n\t'Nashua',\n\t'Lamut',\n\t'Ankang',\n\t'Ahor',\n\t'Edakkunnam',\n\t'South Shields',\n\t'Liangwu',\n\t'Sonbari',\n\t'Shinjo',\n\t'Patuvilayi',\n\t'Ponte de Sor',\n\t'Kawamata',\n\t'Ulvila',\n\t'Polomolok',\n\t'Saila',\n\t'Mahaiza',\n\t'El Trebol',\n\t'Cisterniga',\n\t'Fossombrone',\n\t'Nyala',\n\t'Villa Gesell',\n\t'Lapa',\n\t'Nidamaluru',\n\t'Peraiyur',\n\t'Dodarasinakere',\n\t'Pachino',\n\t'Saint-Etienne-du-Rouvray',\n\t'Gilching',\n\t'Laurentian Valley',\n\t'Garhshankar',\n\t'Lambesc',\n\t'Hanamaki Onsen',\n\t'Seagoville',\n\t'Rheda-Wiedenbruck',\n\t'Sutton Coldfield',\n\t'Safaja',\n\t'Enns',\n\t'Mutki',\n\t'Villa de Leyva',\n\t'Chauk',\n\t'Aadorf',\n\t'Lukow',\n\t'Yuanquan',\n\t'Muniz',\n\t'Maxixe',\n\t'Soquel',\n\t'Hillcrest Heights',\n\t'Mancheral',\n\t'Featherstone',\n\t'Chelak',\n\t'Tondela',\n\t'Hostomel',\n\t'Alfonsine',\n\t'Iskilip',\n\t'Jaciara',\n\t'Gidri',\n\t'Tulare',\n\t'Mushabani',\n\t'Patharia',\n\t'Coudekerque-Branche',\n\t'Bastos',\n\t'San Antonio Abad',\n\t'Eagle Point',\n\t'Fernando de la Mora',\n\t'Mhajar',\n\t'Longhua',\n\t'Sevnica',\n\t'Karian',\n\t'Narsipatnam',\n\t'Nuuk',\n\t'Mount Juliet',\n\t'Tome-Acu',\n\t'Ferozepore',\n\t'Sirakoro',\n\t'Barra Velha',\n\t'Zabok',\n\t'Azandarian',\n\t'Conewago',\n\t'El Gara',\n\t'Mamungan',\n\t'Livorno',\n\t'Ain Zaouia',\n\t'Ilamatlan',\n\t\"Anse d'Hainault\",\n\t'Voloina',\n\t'Itaitinga',\n\t'Odatturai',\n\t'Vedaranniyam',\n\t'Bretzfeld',\n\t'Lom Sak',\n\t'Yingyangcun',\n\t'Manamodu',\n\t'Cerqueira Cesar',\n\t'Sorgun',\n\t'Ban',\n\t'Oyrarbakki',\n\t'Mandaguacu',\n\t\"Sered'\",\n\t'Ringkobing',\n\t'Kalihati',\n\t'Modi`in Makkabbim Re`ut',\n\t'Malverne',\n\t'Copenhagen',\n\t\"L'Ancienne-Lorette\",\n\t'Dagenham',\n\t'Marovandrika',\n\t'Nossa Senhora dos Milagres',\n\t'Sacueni',\n\t'Santa Maria a Monte',\n\t'Souq Jamaa Fdalate',\n\t'Chinguar',\n\t'Swiedbodzin',\n\t'Mangalme',\n\t'San Anselmo',\n\t'Ban Patong',\n\t'Bazar-e Yakawlang',\n\t'Teresopolis',\n\t'Baliangao',\n\t'Hunsur',\n\t'Idigny',\n\t'Kose',\n\t'Pedra Azul',\n\t'Mount Vernon',\n\t'Uzun',\n\t'Hamadanak',\n\t'As',\n\t'Tounfit',\n\t'Blumberg',\n\t'Konstancin-Jeziorna',\n\t'Ebino',\n\t'Hull',\n\t'Tajumulco',\n\t'Castellaneta',\n\t'Sidhapa',\n\t'Slagelse',\n\t'Dunbar',\n\t'Nahariyya',\n\t'Tsuyama',\n\t'Selston',\n\t'Brummen',\n\t'Gigante',\n\t'Caluquembe',\n\t'Nirkunnam',\n\t'Peabody',\n\t'Braunstone',\n\t'San Fernando de Henares',\n\t'Sebt Bni Smith',\n\t'Lakkampatti',\n\t'Miami Gardens',\n\t'Gluckstadt',\n\t'Santa Maria de Palautordera',\n\t'Bas Limbe',\n\t'El Puerto de Santa Maria',\n\t'Bundaberg',\n\t'Giszowiec',\n\t'Gweru',\n\t'Belle-Anse',\n\t'Bodupal',\n\t'Inopacan',\n\t'Pencoed',\n\t'Zittau',\n\t'Sialkot City',\n\t'Obera',\n\t'Naikankudi',\n\t\"L'Aquila\",\n\t'Plan-les-Ouates',\n\t\"Ch'ungmu\",\n\t'Corte Madera',\n\t'Kaukauna',\n\t'Tsararafa',\n\t'Lembok',\n\t'Altena',\n\t'Gliwice',\n\t'Bora',\n\t'Hagen im Bremischen',\n\t'Tsaramasoandro',\n\t'Alto Rio Senguer',\n\t'Inungur',\n\t'Alor Setar',\n\t'Al Hajar al Aswad',\n\t'Kurunegala',\n\t'Efringen-Kirchen',\n\t'Little Egg Harbor',\n\t'Itagi',\n\t'Koppunur',\n\t'Bemidji',\n\t'Tantoyuca',\n\t'Guiratinga',\n\t'Barton',\n\t'An Khe',\n\t'Yamagata',\n\t\"Lee's Summit\",\n\t'Nea Filadelfeia',\n\t'Bagneux',\n\t'Samtredia',\n\t'Yingcheng',\n\t'Shibata',\n\t'Mount Pearl Park',\n\t'Arendonk',\n\t'Dhenkanal',\n\t'Kapenguria',\n\t'Saida',\n\t'Gloucester',\n\t'Bibai',\n\t'Lebbeke',\n\t'Dhusar Tikapatti',\n\t'Rondon',\n\t'Tamayo',\n\t'Daksinkali',\n\t'Plymouth',\n\t'Scordia',\n\t'Haywards Heath',\n\t'Battle Ground',\n\t'Fishers',\n\t'Gonen',\n\t'Xingren',\n\t'Queenstown',\n\t'Port Coquitlam',\n\t'Raritan',\n\t'Nagykovacsi',\n\t'North Bend',\n\t'Wilmot',\n\t'Taal',\n\t'Ruhengeri',\n\t'Zhovkva',\n\t'Sangtuda',\n\t'Pont-Rouge',\n\t'Urbandale',\n\t'Reeuwijksebrug',\n\t'Hamburg',\n\t'Midsayap',\n\t'Janai',\n\t'Harrow on the Hill',\n\t'Nakao',\n\t'Kaoma',\n\t'Verbania',\n\t'Dancagan',\n\t'Tecumseh',\n\t'Luhansk',\n\t'Elanjivaliseri',\n\t'Dhariwal',\n\t'Mahuva',\n\t'Dabhaura',\n\t'Pilisvorosvar',\n\t'Ravne na Koroskem',\n\t'As Suwayq',\n\t'Semri',\n\t'Siliana',\n\t'Noria',\n\t'Chabahar',\n\t'Gimpo',\n\t'Parempuyre',\n\t'Tam Hiep',\n\t'Bir',\n\t'Miranda',\n\t'Dhemaji',\n\t'Menongue',\n\t'Argao',\n\t'Fuldatal',\n\t'Gualeguaychu',\n\t'Hoboken',\n\t'Melgar',\n\t'Bishunpura',\n\t'Karabuk',\n\t'Tirthahalli',\n\t'Binmaley',\n\t'Trajano de Morais',\n\t'Villeneuve-Saint-Georges',\n\t'Moribabougou',\n\t'Al Mansurah',\n\t'Palangavangudi',\n\t'Nasugbu',\n\t'Giugliano in Campania',\n\t'Emsdetten',\n\t'Satte',\n\t'Prescot',\n\t'Carles',\n\t'Razkrizje',\n\t'Djado',\n\t'Wurzburg',\n\t'Langhnaj',\n\t'Kysucke Nove Mesto',\n\t'Ar Rastan',\n\t'Huehuetoca',\n\t'Cerca la Source',\n\t'Goris',\n\t'Plon',\n\t'Bad Lauterberg',\n\t'Gasparillo',\n\t'Sao Amaro das Brotas',\n\t'Rangvasa',\n\t'Kolokonde',\n\t'Osmancik',\n\t'Trofaiach',\n\t'Seaford',\n\t'Appley Bridge',\n\t'Majadahonda',\n\t'Sudley',\n\t'Raman Mandi',\n\t'Diyarbakir',\n\t'Xiaoxita',\n\t'Azacualpa',\n\t'Mullassheri',\n\t'Aruppukkottai',\n\t'El Rosario',\n\t'Puyo',\n\t'Pomichna',\n\t'Plaisance-du-Touch',\n\t'Ghosrawan',\n\t'Yuba City',\n\t'Homs',\n\t'Baunatal',\n\t'Cape Coral',\n\t'Umburanas',\n\t'Kakegawa',\n\t'Shahr-e Pir',\n\t'Neiba',\n\t'Thiers',\n\t'Chorbog',\n\t'Melton Mowbray',\n\t'Ariyalur',\n\t'Suarez',\n\t'Manoel Vitorino',\n\t'Sint-Katelijne-Waver',\n\t'Nongzhangjie',\n\t'Bayan',\n\t'Ceduna',\n\t'Grand Falls',\n\t'Masallatah',\n\t'Meppen',\n\t'Bromley',\n\t'Vanves',\n\t'Novelda',\n\t'Kaspi',\n\t'Horseheads',\n\t'Rath',\n\t'Vadakarai Kil Pidagai',\n\t'El Kansera',\n\t'Tanmen',\n\t'Henin-Beaumont',\n\t'Fort Payne',\n\t'Southlake',\n\t'Kaeng Khoi',\n\t'Broughton Astley',\n\t'Oyamazaki',\n\t'Rodolfo Sanchez Taboada',\n\t'Devrukh',\n\t'Kombai',\n\t'Juvisy-sur-Orge',\n\t'Aigua',\n\t'Sandridge',\n\t'Oum el Bouaghi',\n\t'Marilandia',\n\t'Pirbahora',\n\t'Bauria',\n\t'Matsushige',\n\t'Ipatinga',\n\t'Venkatagirikota',\n\t'Hazel Crest',\n\t'Codegua',\n\t'North Castle',\n\t'Talhar',\n\t'Kirchberg',\n\t'Achocalla',\n\t'Apam',\n\t'Cloverly',\n\t'La Trinite',\n\t'Zivinice',\n\t'Thanh Hoa',\n\t'Pocao de Pedras',\n\t'Tiruvadanai',\n\t'Koshu',\n\t'Cuencame de Ceniceros',\n\t'Tellar',\n\t'Praia do Carvoeiro',\n\t'Pursat',\n\t'Cunupia',\n\t'North Lakhimpur',\n\t'Carlsbad',\n\t'Breinigsville',\n\t'Saint-Bruno-de-Montarville',\n\t'Oro Valley',\n\t'Msemrir',\n\t'Papendrecht',\n\t'Pedersore',\n\t'Balasore',\n\t'Cadale',\n\t'Viera East',\n\t'Kambila',\n\t'Snaresbrook',\n\t'Rockville',\n\t'Culcheth',\n\t'San Valentino Torio',\n\t'Sharbaqty',\n\t'Chainpura',\n\t'Laligam',\n\t'Huntsville',\n\t'Pidigan',\n\t'Hohenems',\n\t'Rabinal',\n\t'Campo do Brito',\n\t'Les Lilas',\n\t'Kudali',\n\t'Binnaguri',\n\t\"Land O' Lakes\",\n\t'Hatch End',\n\t'Abiy Adi',\n\t'Prijedor',\n\t'Affton',\n\t'Pilon',\n\t'Boditi',\n\t'Ferdows',\n\t'Villa Dolores',\n\t'Desenzano del Garda',\n\t'Venaria Reale',\n\t'Cuite',\n\t'Nonthaburi',\n\t'Lawrenceburg',\n\t'Guasipati',\n\t'Tottenham',\n\t'Utica',\n\t'Al Basrah',\n\t'Gorukle',\n\t'Caranavi',\n\t'Douglass',\n\t'Havirov',\n\t'Sukheke Mandi',\n\t'Audubon',\n\t'Puerto del Rosario',\n\t'Chilkuru',\n\t'Burco',\n\t'La Mornaghia',\n\t'Amatitan',\n\t'Songhuajiangcun',\n\t'San Antonio de las Vueltas',\n\t'Azadshahr',\n\t'Bislig',\n\t'Rampura',\n\t'Ban Klang',\n\t'Granadero Baigorria',\n\t'Usuda',\n\t'Montego Bay',\n\t'Chornomorsk',\n\t'Saint-Lys',\n\t'Sabana Grande de Palenque',\n\t'Xiluodu',\n\t'Gigaquit',\n\t'Carrollwood',\n\t'Kigali',\n\t'Lyman',\n\t'Sao Luis',\n\t'Patakakani',\n\t'Mar de Ajo',\n\t'Inverell',\n\t'Neuville-en-Ferrain',\n\t'Molde',\n\t'Petrel',\n\t'Indian Harbour Beach',\n\t'Gahi Mammar',\n\t'Alanya',\n\t'Shazand',\n\t'Leso',\n\t'Auray',\n\t'Panauti',\n\t'Ovada',\n\t'Tokoname',\n\t'Junnar',\n\t'Chahar Dangeh',\n\t'Monte Aprazivel',\n\t'Maida Babhangawan',\n\t'Matias Romero',\n\t'Nasu',\n\t'Quata',\n\t'Barracao',\n\t'Dila',\n\t'Piatykhatky',\n\t'Sikeston',\n\t'Luzzi',\n\t'Diabougou',\n\t'Wiesbaden',\n\t'Chumphon',\n\t'Cervia',\n\t'South Dundas',\n\t'Halfmoon',\n\t'Jardim de Piranhas',\n\t'Carol Stream',\n\t'Coronel Du Graty',\n\t\"L'Isle-sur-la-Sorgue\",\n\t'Kapolei',\n\t'Bad Windsheim',\n\t'Hitchin',\n\t'Almeirim',\n\t'Kurakhove',\n\t'Mataro',\n\t'Khao Yoi',\n\t'Shihezi',\n\t'Itaiopolis',\n\t'Iskandar',\n\t'Pinamungahan',\n\t'Highland City',\n\t\"Ping'an\",\n\t'Khe Sanh',\n\t'Konigs Wusterhausen',\n\t'Kottampatti',\n\t'Tshabong',\n\t'Gastonia',\n\t'Fuensalida',\n\t'Cabot',\n\t'Celldomolk',\n\t'Sakiai',\n\t'Pirmasens',\n\t'Bostonia',\n\t'Ngathainggyaung',\n\t'Nattappettai',\n\t'Oulad Hamdane',\n\t'Campo Belo',\n\t'Portsmouth',\n\t'Birmitrapur',\n\t'La Fare-les-Oliviers',\n\t'Biberach',\n\t'Kadoli',\n\t'Sremski Karlovci',\n\t'Leon Valley',\n\t'La Huacana',\n\t'Cambados',\n\t'Ban Bang Non',\n\t'Ranai',\n\t'Orumiyeh',\n\t'Moyuta',\n\t'Hansot',\n\t'Pasewalk',\n\t'Ukunda',\n\t'Guarne',\n\t'Bethal',\n\t'Schwabach',\n\t'Laventille',\n\t'North Reading',\n\t'Hithadhoo',\n\t'Shubrakhit',\n\t'Overath',\n\t'Karikad',\n\t'Nakatsu',\n\t'Pancevo',\n\t'Hamirpur',\n\t'Pilar de la Horadada',\n\t'Akdepe',\n\t'Phillaur',\n\t'Itaquaquecetuba',\n\t'Bridport',\n\t'Marotaolana',\n\t'Kowary',\n\t'Ibaan',\n\t'Derazhnia',\n\t'Baishan',\n\t'Strzelce Krajenskie',\n\t'Ampere',\n\t'West Nipissing / Nipissing Ouest',\n\t'Dashiqiao',\n\t'Iguaraci',\n\t'Minglanilla',\n\t'Andalgala',\n\t'Dili',\n\t'Galena Park',\n\t'Cinar',\n\t'Akropong',\n\t'Aston',\n\t'Ire',\n\t'Vrhnika',\n\t'Randfontein',\n\t'Rorvik',\n\t'Sugbongkogon',\n\t'Trancas',\n\t'Dusti',\n\t'Pernes-les-Fontaines',\n\t'Gamharia',\n\t'Rozdilna',\n\t'Harchoune',\n\t'Cherakara',\n\t'Valantaravai',\n\t'Todmorden',\n\t'Rehau',\n\t'Draguignan',\n\t'Clifton',\n\t'Murud',\n\t'Jalna',\n\t'Chhatarpur',\n\t'Palavur',\n\t'Balangiga',\n\t'Canete',\n\t'Stoneham-et-Tewkesbury',\n\t'Puttanattam',\n\t'Lisen',\n\t'Carrefour',\n\t'Qostanay',\n\t'Triggiano',\n\t'Chingleput',\n\t'Sonupur',\n\t'Spodnje Hoce',\n\t'Oftersheim',\n\t'Chom Thong',\n\t'Nagod',\n\t'Ecoporanga',\n\t'Cowley',\n\t'Schiltigheim',\n\t'San Andres del Rabanedo',\n\t'Velilla de San Antonio',\n\t'Bad Neustadt',\n\t'Timbo',\n\t'Muskogee',\n\t'Enid',\n\t'Batouri',\n\t'Kragero',\n\t'Mirano',\n\t'Alangayam',\n\t'Cianorte',\n\t'Crystal Lake',\n\t'Sebt Gzoula',\n\t'Kyazanga',\n\t'Lendava',\n\t'Bad Durrheim',\n\t'Jiangguanchi',\n\t'Gonzalez Catan',\n\t'La Roche-sur-Foron',\n\t'Itapiranga',\n\t'Aktuluk',\n\t'Uslar',\n\t'Luis Correia',\n\t'Anjahamana',\n\t'Dracevo',\n\t'Pavlikeni',\n\t'Salvatierra de Mino',\n\t'El Karimia',\n\t'Heilsbronn',\n\t'Honaz',\n\t'Multai',\n\t'Zarghun Shahr',\n\t'Jesenice',\n\t'Catanauan',\n\t'Haaksbergen',\n\t'Tiruvasaladi',\n\t'Karvarakundu',\n\t'Malay',\n\t'Tamura',\n\t'Loma Plata',\n\t'Hamilton Square',\n\t'Dewal Thal',\n\t'Partur',\n\t'Koilakh',\n\t'Great Dunmow',\n\t'Sinj',\n\t'Bekily',\n\t'Hercules',\n\t'Dunstable',\n\t'Kosgi',\n\t'Xinsi',\n\t'Tomboco',\n\t'Southwick',\n\t'Sangamner',\n\t'Mossoro',\n\t'Khon Kaen',\n\t'Dhamnagar',\n\t'Denain',\n\t'Berezivka',\n\t'Humaita',\n\t'Malhipur',\n\t'San Luis de Since',\n\t'Martin',\n\t'Rajapudi',\n\t'Yucaipa',\n\t'Ortigueira',\n\t'City of Paranaque',\n\t'Kabira',\n\t'Kalandy',\n\t'Uwajima',\n\t'Fantino',\n\t'San Juan Atitan',\n\t'Kennesaw',\n\t'Prattville',\n\t'Showa',\n\t'Hakmana',\n\t'Maastricht',\n\t'Pesqueria',\n\t'Ban Ngao',\n\t'Amparafaravola',\n\t'Bhagwatpur',\n\t'Landshut',\n\t'Justo Daract',\n\t'San Vicente',\n\t'Hall in Tirol',\n\t'Avare',\n\t'Binxian',\n\t'Llaillay',\n\t'Hoskote',\n\t'La Massana',\n\t'Tucker',\n\t'Pacasmayo',\n\t'Ambato',\n\t'Apiuna',\n\t'Shaxi',\n\t'Mpigi',\n\t'Evere',\n\t'Sakaki',\n\t'Sampona',\n\t'Puerto Leguizamo',\n\t'Santiago del Teide',\n\t'Wudalianchi',\n\t'Blieskastel',\n\t'Rutesheim',\n\t'Phan Ri Cua',\n\t'Itahri',\n\t'Chilibre',\n\t'Schalksmuhle',\n\t'Askale',\n\t'Vite',\n\t'Ibipora',\n\t'Haugesund',\n\t'Valdemorillo',\n\t'Iringal',\n\t'Tariba',\n\t'Hays',\n\t'Annur',\n\t'Mariental',\n\t'Cieza',\n\t'Kirkland',\n\t'Nohar',\n\t'Shiso',\n\t'Yoshinogawa',\n\t'La Motte-Servolex',\n\t'Sippola',\n\t'Bonthe',\n\t'Rijswijk',\n\t'Pontinia',\n\t'Aarhus',\n\t'Kitaotao',\n\t'Rreshen',\n\t'Mahinawan',\n\t'Manrar',\n\t'Pattanapuram',\n\t'Baidoa',\n\t'Zhongxiang',\n\t'La Colonia Tovar',\n\t'Amelia',\n\t'Fuveau',\n\t'Aguas Formosas',\n\t'Trikonavattam',\n\t'Chewara',\n\t'Bhado Khara',\n\t'Novyi Rozdil',\n\t'Palepalli',\n\t'Ellamanda',\n\t'San Martin Totolan',\n\t'Edinet',\n\t'Weihai',\n\t'Granadilla de Abona',\n\t'Sulphur Springs',\n\t'Astoria',\n\t'Seyitgazi',\n\t'Kingsteignton',\n\t'Weybridge',\n\t'Plumtree',\n\t'Brugnera',\n\t'Stony Point',\n\t'Shikrapur',\n\t'Canguaretama',\n\t'Pedreira',\n\t'Kot Kapura',\n\t'Banyuwangi',\n\t'Sueca',\n\t'Afzala',\n\t'Kenilworth',\n\t'Stuhr',\n\t'Riverbank',\n\t'Jdour',\n\t'Al Minshah',\n\t'Warren',\n\t'Kalundborg',\n\t'Farroupilha',\n\t'Walsrode',\n\t'Ilheus',\n\t'Heroica Ciudad de Tlaxiaco',\n\t'Smoline',\n\t'Cueto',\n\t'Pingtang',\n\t'Khorugh',\n\t'Engandiyur',\n\t'Canlaon',\n\t'El Reno',\n\t'Gadwal',\n\t'Villa Verde',\n\t'Pulluru',\n\t'Talatona',\n\t'Badepalli',\n\t'Oltiariq',\n\t'Aizumisato',\n\t'Antsoso',\n\t'Jianganj',\n\t'Mullurkara',\n\t'Taouloukoult',\n\t'Chambray-les-Tours',\n\t'Tabarre',\n\t'Bamumkumbit',\n\t'Maquela do Zombo',\n\t'Widnau',\n\t'Kurihara',\n\t'Shumen',\n\t'Kosatarosh',\n\t'Villa Vasquez',\n\t'Nampicuan',\n\t'Waasmunster',\n\t'Wilmington',\n\t'Silao',\n\t'Geseke',\n\t'Jamsa',\n\t'Forres',\n\t'Tukh',\n\t'Aversa',\n\t'Sanpetru',\n\t'Terra de Areia',\n\t'Samahuta',\n\t'North Kingstown',\n\t'Chiplun',\n\t'Sztum',\n\t'Neustadt an der Donau',\n\t'Alajuelita',\n\t'Peyziwat',\n\t'San Carlos Sija',\n\t\"Ji'an Shi\",\n\t'Ciudad de Allende',\n\t'Carmo do Paranaiba',\n\t'Dakar',\n\t'Paulista',\n\t\"Rignano sull'Arno\",\n\t'Papenburg',\n\t'Imanombo',\n\t'Cabangan',\n\t'Miedzychod',\n\t'Guanabacoa',\n\t'Djemmal',\n\t'Alpedrete',\n\t'Alcacer do Sal',\n\t'Barhagarh',\n\t'Nong Ki',\n\t'Kot Shamir',\n\t'Yugawara',\n\t'Polangui',\n\t'Villa Ygatimi',\n\t'Mathura',\n\t'Morley',\n\t'Gokak',\n\t'Red Hill',\n\t'Bad Durrenberg',\n\t'Yeghegnadzor',\n\t'Muroran',\n\t'Fair Lawn',\n\t'Urai',\n\t'Caiaponia',\n\t'Chimbarongo',\n\t'Buabidi',\n\t'Erba',\n\t'Elandsdoorn',\n\t'Mongar',\n\t'Basankusu',\n\t'Longji',\n\t'Sucun',\n\t'Kakata',\n\t'Altus',\n\t'Elizabethtown',\n\t'Kamlapur',\n\t'Birkenau',\n\t'San Mateo Atenco',\n\t'Viqueque',\n\t'Dibaya',\n\t'Sao Benedito',\n\t'Daphne',\n\t'Irving',\n\t'Randazzo',\n\t'Cameron',\n\t'Gasa',\n\t'Salyan',\n\t'Magadi',\n\t'Pingzhen',\n\t'Kibiito',\n\t'Katherine',\n\t'Sebekoro',\n\t'Itamaraca',\n\t'Changling',\n\t'Tunduru',\n\t'River Ridge',\n\t'El Adjiba',\n\t'Pardiguda',\n\t'Guaranesia',\n\t'Subaykhan',\n\t'Dar Naim',\n\t'Fulda',\n\t'Meiti',\n\t'Choybalsan',\n\t'Granollers',\n\t'Al Qays',\n\t'Moldava nad Bodvou',\n\t'El Molar',\n\t'Bayt Saham',\n\t'Coruripe',\n\t'Leawood',\n\t\"Kunp'o\",\n\t'Aracati',\n\t'Soaserana',\n\t'Ambatofotsy',\n\t'Linganore',\n\t'Rotterdam',\n\t'Kumano',\n\t'Shoeburyness',\n\t'Palayan City',\n\t'Oak Island',\n\t'Saylac',\n\t'Darwa',\n\t'Heidelberg',\n\t'Puerto Maldonado',\n\t'Szazhalombatta',\n\t'Fatwa',\n\t'Kolattupuzha',\n\t'Mahinog',\n\t'Villa Rumipal',\n\t'Somnaha',\n\t'Veauche',\n\t'Baheri',\n\t'Sangzishi',\n\t'Moser',\n\t'Cologne',\n\t'Rypin',\n\t'Salinas da Margarida',\n\t'Carini',\n\t'Gloria do Goita',\n\t'Tekes',\n\t'Northport',\n\t'Seven Oaks',\n\t'Nemmara',\n\t'Consolacion del Sur',\n\t'El Calafate',\n\t'Foumbot',\n\t'Magnolia',\n\t'Carangola',\n\t'Caracas',\n\t'Vallahbhapuram',\n\t'Al `Aqiq',\n\t'Sincan',\n\t'Bebra',\n\t'Malkapur',\n\t'Valongo',\n\t'Flawil',\n\t'Piprahi',\n\t'Cheney',\n\t'Tarar',\n\t'Gode',\n\t'Tangkak',\n\t'La Canada Flintridge',\n\t'Schwanewede',\n\t'Thomasville',\n\t'Wolossebougou',\n\t'Zunilito',\n\t'Aristobulo del Valle',\n\t'Staden',\n\t'Bakhri',\n\t'Chatillon',\n\t'Puerto Varas',\n\t'El Tarf',\n\t'Goianinha',\n\t'Bimgal',\n\t'Abu Qurqas',\n\t\"Aghbalou n'Kerdous\",\n\t'Tayakou',\n\t'Johnson City',\n\t'Stjordalshalsen',\n\t'Kot Mumin',\n\t'Orbassano',\n\t'Carius',\n\t'Dikwella South',\n\t'Gallipoli',\n\t'Wschowa',\n\t'Sundarnagar',\n\t'Gustrow',\n\t'Pindai',\n\t'Mit Ghamr',\n\t'Xinyaoshang',\n\t'Torbeck',\n\t'Marrakech',\n\t'Xiushuicun',\n\t'Valasa',\n\t'Tuttlingen',\n\t'Avesta',\n\t'Highgate',\n\t'Osian',\n\t'Kanniyambram',\n\t'Malinao',\n\t'Xingsha',\n\t'Oltenita',\n\t'Capiata',\n\t'Malanville',\n\t'Hunters Creek',\n\t'Balwa',\n\t'Muli',\n\t'Lotte',\n\t'Hikkaduwa',\n\t'Pelahiivka',\n\t'Chilapa de Alvarez',\n\t'Farafenni',\n\t'Tanbaichicho',\n\t'Saks',\n\t'Calilabad',\n\t'Salvaterra de Magos',\n\t'Chittayankottai',\n\t'Popondetta',\n\t'Synelnykove',\n\t'Flying Fish Cove',\n\t'Gikongoro',\n\t'Baraki',\n\t'Karebilachi',\n\t'El Hachimia',\n\t'Highland Heights',\n\t'Chilecito',\n\t'Kawashiri',\n\t'Scotch Plains',\n\t'Adi Keyh',\n\t'Cheung Chau',\n\t'Therwil',\n\t'Tiruvalanjuli',\n\t'Bagrami',\n\t'San Juan Lalana',\n\t'Nodinge-Nol',\n\t'Gonzalez',\n\t'Moshi',\n\t'Zhangjiajie',\n\t'Bafilo',\n\t'Presidente Prudente',\n\t'Sassenberg',\n\t'Kot Addu',\n\t'Nicholasville',\n\t'Magitang',\n\t'Glauchau',\n\t'Bendrahalli',\n\t'Mislinja',\n\t'Nysa',\n\t'Tomaz pri Ormozu',\n\t'Tassin-la-Demi-Lune',\n\t'Schubelbach',\n\t'Juban',\n\t'Epinay-sur-Orge',\n\t'West Bradford',\n\t'Genk',\n\t'Miyakonojo',\n\t'Eastpointe',\n\t'Quispamsis',\n\t'Gadda Madiral',\n\t'Nouadhibou',\n\t'Neuss',\n\t'Yanagawa',\n\t'Kirano',\n\t'Sheldon',\n\t'Florange',\n\t'Albert',\n\t'Vilcun',\n\t'Mannheim',\n\t'Qahramon',\n\t'Joaquim Tavora',\n\t'Amravati',\n\t'Small Heath',\n\t'Ancon',\n\t'San Juan Chamelco',\n\t'Neunkirchen',\n\t'Timargara',\n\t'Poole',\n\t'Tenkodogo',\n\t'Jidigunta',\n\t'Agoncillo',\n\t'Diosd',\n\t'Kondaparti',\n\t'Darauli',\n\t'San Giuliano Milanese',\n\t'Farkhana',\n\t'Upernavik',\n\t'Isehara',\n\t'Ginsheim-Gustavsburg',\n\t\"Port Saint John's\",\n\t'Shekhupura',\n\t'Malvinas Argentinas',\n\t'Mirbat',\n\t'Kishangarh',\n\t'Ibicui',\n\t'Tangalla',\n\t'Napa',\n\t'Tavares',\n\t'Koro',\n\t'Edasseri',\n\t'Negotin',\n\t'Barcs',\n\t'Keshwari',\n\t'Depew',\n\t'Kottaya',\n\t'Khair Khan',\n\t'Toviklin',\n\t'New Port Richey East',\n\t'Tarrega',\n\t'Mariel',\n\t'Krabi',\n\t'Rinconada de Malloa',\n\t'Felida',\n\t'Sidi Ifni',\n\t'Tobre',\n\t'Yorba Linda',\n\t'Casper',\n\t'Hartswater',\n\t'Guanambi',\n\t'Winthrop',\n\t'Marcacao',\n\t'Bridlington',\n\t'Feicheng',\n\t'Pinhalzinho',\n\t'Dubai',\n\t'Periyakulam',\n\t'Tranent',\n\t'Hammam Sousse',\n\t'Ampasimbe',\n\t'Santa Mariana',\n\t'San Antonio de Ibarra',\n\t'Charlton Kings',\n\t'Tecoanapa',\n\t'Kamwenge',\n\t'Arai',\n\t'Jocotepec',\n\t'Kiziltepe',\n\t'Hadali',\n\t'Bahadurpur',\n\t'Thoen',\n\t'Nakhon Phanom',\n\t'Nayoro',\n\t'Baramati',\n\t'Lamas',\n\t'Krupanj',\n\t\"Ning'an\",\n\t'Monfalcone',\n\t'Hitachi-Naka',\n\t'Lower Burrell',\n\t'Formoso do Araguaia',\n\t'Vadigenhalli',\n\t'Bansbaria',\n\t'Tupanatinga',\n\t'Dome',\n\t'Niles',\n\t'Siquirres',\n\t'Boddikurapadu',\n\t'Bryant',\n\t'Serebryansk',\n\t\"'Ain el Hammam\",\n\t'Aldo Bonzi',\n\t'Gajhara',\n\t'Tokyo',\n\t'Karakthal',\n\t'Cabildo',\n\t'Buon Trap',\n\t'Liushui',\n\t'Echternach',\n\t'Vagur',\n\t'Bicester',\n\t'Rheden',\n\t'Asaka',\n\t'Ulladulla',\n\t'Titara',\n\t'Haya',\n\t'Francisville',\n\t'Robat Karim',\n\t'Shidong',\n\t'Bhadohi',\n\t'Otsuki',\n\t'Barnaon',\n\t'Valavanur',\n\t'Kyenjojo',\n\t'Mara Rosa',\n\t'Markgroningen',\n\t'Planegg',\n\t'Cajvana',\n\t'Tatabanya',\n\t'Andemaka',\n\t'Nazilli',\n\t'Leusden',\n\t'Kanada',\n\t'Dasol',\n\t'Al Wakrah',\n\t'Lucan',\n\t'Jelilyuzi',\n\t'Puerto Quito',\n\t'Cran-Gevrier',\n\t'Damous',\n\t'Gunungsitoli',\n\t'Minamikarasuyama',\n\t'Sandton',\n\t'San Antonio del Tequendama',\n\t'Paiporta',\n\t'Guying',\n\t'Fontenay-le-Fleury',\n\t'Denov',\n\t'Bulambuli',\n\t'Yulu',\n\t'Cajamar',\n\t'Brvenica',\n\t'Ocozocoautla de Espinosa',\n\t'Panapur Langa',\n\t'Memmingen',\n\t'Ban Non Sombun',\n\t'Oegstgeest',\n\t'Aigio',\n\t'Bhanuvalli',\n\t'Rankovce',\n\t'Bagchini',\n\t'Voitsberg',\n\t'Ban Nong Kathao',\n\t'Canby',\n\t'Cosne sur Loire',\n\t'Nilothi',\n\t'Ma`arratmisrin',\n\t'Lyndon',\n\t'Gurgentepe',\n\t'Adjahome',\n\t'Andippatti',\n\t'West Manheim',\n\t'Brunsbuttel',\n\t'Grave',\n\t'Zapotlan de Juarez',\n\t'Yakkabog`',\n\t'Tan Phuoc Khanh',\n\t'Tinley Park',\n\t'Baligaon',\n\t'Bell Ville',\n\t'Gwagwalada',\n\t'Pie de Pato',\n\t'Mount Fletcher',\n\t'Waris Aliganj',\n\t'Queens',\n\t'Tamana',\n\t'Craibas',\n\t'Caivano',\n\t'Grants Pass',\n\t'Citrus Hills',\n\t'Elko',\n\t'El Abiodh Sidi Cheikh',\n\t'Pathardi',\n\t'Acatlan',\n\t'Westwood',\n\t'Cibinong',\n\t'Dayr `Atiyah',\n\t'Ja`ar',\n\t'Archdale',\n\t'Seguin',\n\t'Vif',\n\t'San Vicente de Canete',\n\t'Limbe',\n\t'Calumet City',\n\t'Ain el Hadid',\n\t'Sint-Andries',\n\t'Skhirate',\n\t'Assi-Ben Okba',\n\t'San Ildefonso',\n\t'Saint-Raphael',\n\t'Dire Dawa',\n\t'Koropi',\n\t'Murata',\n\t'Mongu',\n\t'Villa Maria',\n\t'Taqah',\n\t'I-n-Amguel',\n\t'Moloacan',\n\t'Milford Haven',\n\t'Campo Alegre',\n\t'Atlantic Beach',\n\t'Kalikapur',\n\t'Fuefuki',\n\t'Centralina',\n\t'Sarafand',\n\t'Chuangjian',\n\t'Kheralu',\n\t'Sulecin',\n\t'Kirchhain',\n\t'Coffeyville',\n\t'Uji',\n\t'Westport',\n\t'Compostela',\n\t'Stratford-upon-Avon',\n\t'Tougue',\n\t'Neves',\n\t'Satiro Dias',\n\t'Numbrecht',\n\t'Galle',\n\t'Ilion',\n\t'Dasarhalli',\n\t'Flat Rock',\n\t'Old Bridge',\n\t'Barbacena',\n\t'Essa',\n\t'Peddakurapadu',\n\t'Chervonopartyzansk',\n\t'Perth East',\n\t'Margosatubig',\n\t'Bossangoa',\n\t'Ngorkou',\n\t'Frankenthal',\n\t'Reguengos de Monsaraz',\n\t'Roverbella',\n\t'Annecy-le-Vieux',\n\t'Woodmoor',\n\t'Imizucho',\n\t'Villanueva de la Serena',\n\t'Kinalur',\n\t'Depok',\n\t'Ahrensburg',\n\t'Kingman',\n\t'Magu',\n\t'Guiping',\n\t'Kopavogur',\n\t'Hunasamaranhalli',\n\t'Tora',\n\t'Malvar',\n\t'Lentini',\n\t'Pont-du-Chateau',\n\t'Laghouat',\n\t'Jima Abajo',\n\t'Garbahaarrey',\n\t'Samsikapuram',\n\t'Vinanitelo',\n\t'Nong Wua So',\n\t'Jawad',\n\t'Tirunageswaram',\n\t'Koure',\n\t'Villabate',\n\t'Rezekne',\n\t'Nenton',\n\t'Canovanas',\n\t'Los Banos',\n\t\"Berre-l'Etang\",\n\t'Al Qunfudhah',\n\t'Buenopolis',\n\t'Le Plessis-Robinson',\n\t'Bilar',\n\t'San Antonio de Los Altos',\n\t'Elblag',\n\t'Masamba',\n\t'Czeladz',\n\t'Tmassah',\n\t'San Vicente del Raspeig',\n\t'Tejutla',\n\t'Albano Laziale',\n\t'Sibkund',\n\t'Goio-Ere',\n\t'Kanoya',\n\t'Dahibhat Madhopur',\n\t'Santa Maria Ajoloapan',\n\t'Srebrenica',\n\t'Bacoor',\n\t'Novopavlovka',\n\t'Marcory',\n\t'Argos',\n\t'Ivandrika',\n\t'Iqaluit',\n\t'Kondazhi',\n\t'Kos',\n\t'Newhaven',\n\t'Bakwa',\n\t'Mirante da Serra',\n\t'Limbach-Oberfrohna',\n\t'Asadabad',\n\t'Damulog',\n\t'Bishops Stortford',\n\t'Jaguaribara',\n\t'Vadasikarambattu',\n\t'Kairaki',\n\t'Koidu-Bulma',\n\t'Alto-Cuilo',\n\t'Mondoro',\n\t'Buon Ho',\n\t'Laibin',\n\t'Prymorskyi',\n\t'Berane',\n\t'Wulongpu',\n\t'Bernalillo',\n\t'Koturkolkara',\n\t'Bellerive-sur-Allier',\n\t'Jambe',\n\t'Kerwada',\n\t'Kadoma',\n\t'Antanamalaza',\n\t'Yildiz',\n\t'Kamrawan',\n\t\"Kan'onjicho\",\n\t'Sekiyado',\n\t'Tartarugalzinho',\n\t'Kudra',\n\t'Mauban',\n\t'El Tambo',\n\t'Taquarana',\n\t'Winneba',\n\t'Damghan',\n\t'Balikumbat',\n\t'Ulundi',\n\t'Salo',\n\t'Nyakosoba',\n\t'Jeffersontown',\n\t'Lievin',\n\t'Santeramo in Colle',\n\t'Casale Monferrato',\n\t'Palma del Rio',\n\t'Yizhu',\n\t'Ankafina Tsarafidy',\n\t'Nisarpur',\n\t'Tadpatri',\n\t'Peebles',\n\t'Nawalgarh',\n\t'Ulliyil',\n\t'Paittur',\n\t'Chhajli',\n\t'Concepcion Batres',\n\t'Nkpor',\n\t'DuPont',\n\t'Burgum',\n\t'Kaposvar',\n\t'Labangan',\n\t'Santany',\n\t'Appingedam',\n\t'Barton upon Irwell',\n\t'Bagli',\n\t'Hatta',\n\t'Leeds and the Thousand Islands',\n\t'Catende',\n\t'Friedeburg',\n\t'Udaipura',\n\t'Aranzazu',\n\t'Umga',\n\t'Vize',\n\t'Coriano',\n\t'Janjgir',\n\t'Brwinow',\n\t'Teays Valley',\n\t'Ban Kaeng',\n\t'Huebampo',\n\t'Oadby',\n\t'Hovsan',\n\t'Torre-Pacheco',\n\t'Kolluru',\n\t'Araban',\n\t'Ishiki',\n\t'Daganzo de Arriba',\n\t'Jagannadapuram',\n\t'Quinhamel',\n\t'Nsukka',\n\t'Midwest City',\n\t'Alcala',\n\t'Payson',\n\t'Kita Chauhattar',\n\t'Sao Luis Gonzaga do Maranhao',\n\t'Quezon',\n\t'Mani',\n\t'Khammam',\n\t'Belo Tsiribihina',\n\t'Carmaux',\n\t'Idar',\n\t'Denison',\n\t'Lucera',\n\t'Buda',\n\t'Ankofa',\n\t'San Miguel',\n\t'Isaka',\n\t'Netherton',\n\t'Conil de la Frontera',\n\t'Gorazde',\n\t'Manullahpatti',\n\t'Preah Vihear',\n\t'Coello',\n\t'Sopo',\n\t'Valadares',\n\t'Suruc',\n\t'Ros Comain',\n\t'Alto Hospicio',\n\t'Bargas',\n\t\"Anzola dell'Emilia\",\n\t'Eichenzell',\n\t'Lucelia',\n\t'Betsiaka',\n\t'Sidi Bibi',\n\t'Thale',\n\t'South Stormont',\n\t'Kaladgi',\n\t'Alpen',\n\t'Zumbagua',\n\t'Encruzilhada do Sul',\n\t'Megrine',\n\t'Panorama',\n\t'Chitrada',\n\t'Adamantina',\n\t'Harsum',\n\t'Unguturu',\n\t'San Juan Capistrano',\n\t'Klasterec nad Ohri',\n\t'Fernley',\n\t'Aldenhoven',\n\t'Pien',\n\t'Cansancao',\n\t'Kuje',\n\t'Valenca do Piaui',\n\t'Fraga',\n\t'Carleton Place',\n\t'Castle Bromwich',\n\t'Leichi',\n\t'Armacao dos Buzios',\n\t'Valenton',\n\t'Myawadi',\n\t'Leandro N. Alem',\n\t'Merlo',\n\t'Lugazi',\n\t'Foster City',\n\t'Shurugwi',\n\t'Labe',\n\t'Ruwa',\n\t'Inongo',\n\t'Coto Brus',\n\t'Tiruchengodu',\n\t'Dharmasagaram',\n\t'Ommen',\n\t'Khajawa',\n\t'Urandi',\n\t'Fayroz Koh',\n\t'Bajpe',\n\t'Epalinges',\n\t'Longreach',\n\t'Omdurman',\n\t'Campos Altos',\n\t'East Lampeter',\n\t'Podilsk',\n\t'Bemaharivo',\n\t'Al Ahmadi',\n\t'Vallapuram',\n\t'Sirvel',\n\t'Gaurdah',\n\t'Cottica',\n\t'Izmail',\n\t'Orangeburg',\n\t'Crystal Beach',\n\t'Toumoukro',\n\t'Chittarkottal',\n\t'Klipphausen',\n\t'Donji Vakuf',\n\t'Tazah Khurmatu',\n\t'Laur',\n\t'Raiyam',\n\t\"Saint-Jean-d'Illac\",\n\t'Dubrovnik',\n\t'Mikkabi',\n\t'Masasi',\n\t'Artvin',\n\t'Maisaram',\n\t'Ostwald',\n\t'Wuzhou',\n\t'San Bartolome Milpas Altas',\n\t'Zhunan',\n\t'Pine',\n\t'Susner',\n\t'Sibalom',\n\t'Ormoc',\n\t'Dimataling',\n\t'Maroantsetra',\n\t'Trevignano',\n\t'La Presa',\n\t'North Dumfries',\n\t'Munguia',\n\t'Mangalam',\n\t'Kraainem',\n\t'Bathgate',\n\t'Russell',\n\t'Oliveira do Bairro',\n\t'Vettur',\n\t'Basavana Bagevadi',\n\t'Ub',\n\t'Yepocapa',\n\t'Spearfish',\n\t'Stassfurt',\n\t'Irvine',\n\t'Bratislava',\n\t'Coatbridge',\n\t'Hudli',\n\t'Beni Amrane',\n\t'Mansourah',\n\t'Addanki',\n\t'Volnovakha',\n\t'Lagoa Real',\n\t'Salua',\n\t'Talata-Vohimena',\n\t'Kyotera',\n\t'Rovato',\n\t'Vilankulo',\n\t'Nanterre',\n\t'Timahdit',\n\t'Blandford Forum',\n\t'Bombardopolis',\n\t'eManzimtoti',\n\t'Garges-les-Gonesse',\n\t'Araceli',\n\t'Weslaco',\n\t'Catembe',\n\t'Ta Khmau',\n\t'Zempoala',\n\t'Terracina',\n\t'Sint-Amandsberg',\n\t'Monte Santo de Minas',\n\t'Umm Salal `Ali',\n\t'Mudbidri',\n\t'Dores do Indaia',\n\t'Osilnica',\n\t'Eger',\n\t'Chi Linh',\n\t'El Omaria',\n\t'Itapui',\n\t'Ban Bueng',\n\t'Balad',\n\t'Blooming Grove',\n\t'Kivertsi',\n\t'Bacabal',\n\t'Fujin',\n\t'Combs-la-Ville',\n\t'Aschheim',\n\t'Kettering',\n\t'Chinggil',\n\t'Nangandao',\n\t'Avalepalli',\n\t'London',\n\t'Aguachica',\n\t'Leidschendam',\n\t'Sannicandro Garganico',\n\t'Cambrils',\n\t'Tenenkou',\n\t'Lincoln City',\n\t'San Gennaro Vesuviano',\n\t'Dumaran',\n\t'Yuki',\n\t'Llanes',\n\t'Ksar Hellal',\n\t'Clanton',\n\t'Khomeyn',\n\t'Petrovaradin',\n\t'Whitecourt',\n\t'San Sebastian Salitrillo',\n\t'Steubenville',\n\t'Santiago Atitlan',\n\t'Cecil',\n\t'Barnegat',\n\t'Alto Garcas',\n\t'Xinfeng',\n\t'Innsbruck',\n\t'Santa Margarita de Mombuy',\n\t'Goya',\n\t'Inisa',\n\t'Temascalapa',\n\t'Ouake',\n\t'Ambararatabe',\n\t'Las Delicias',\n\t'Zawal',\n\t'Longkoucun',\n\t\"Fil'akovo\",\n\t'Concepcion del Uruguay',\n\t'Seixal',\n\t'Empedrado',\n\t'Meram',\n\t'Matagob',\n\t'Boufatis',\n\t'Juanjui',\n\t'Butha-Buthe',\n\t'Mutterstadt',\n\t'Koulikoro',\n\t'Narhat',\n\t'Hateg',\n\t'Americana',\n\t'Copacabana',\n\t'Lajkovac',\n\t'Beasain',\n\t'Miyoshi',\n\t'Mooka',\n\t'Zhuangwei',\n\t'Dobeln',\n\t'Brest',\n\t'Hartlepool',\n\t'Jajpur',\n\t'Moncagua',\n\t'Tarnow',\n\t'Holt',\n\t'Hancheng',\n\t'Ciudad Guzman',\n\t'Boudouaou el Bahri',\n\t'Suhiya',\n\t'Oteapan',\n\t'Zhoujia',\n\t'Hohhot',\n\t'Bulle',\n\t'Helensburgh',\n\t'San Jose Villanueva',\n\t'Lethem',\n\t'Landen',\n\t'Gonaives',\n\t'Mahopac',\n\t'Tuyen Quang',\n\t'Shaowu',\n\t'Celbridge',\n\t'Artsyz',\n\t'Heshan',\n\t'Boutilimit',\n\t'Bure',\n\t'Jangid',\n\t'Doberlug-Kirchhain',\n\t'Kawara',\n\t'Meldola',\n\t'Xinglong',\n\t'Ntungamo',\n\t'Shubra al Khaymah',\n\t'Eldama Ravine',\n\t'Sukuta',\n\t'Ain Tedeles',\n\t'Bara',\n\t'Barei',\n\t'Caballococha',\n\t'Locorotondo',\n\t'Pine Creek',\n\t'Mechanicsville',\n\t'Baxdo',\n\t'Mysliborz',\n\t'Androtsy',\n\t'Newcastle under Lyme',\n\t'San Jose de Chiquitos',\n\t'Forchheim',\n\t'Sabana Iglesia',\n\t'Saint-Max',\n\t'Cordenons',\n\t'Dent',\n\t'Verdejante',\n\t'Enkoping',\n\t'Paradise Valley',\n\t'Arnaud',\n\t'Janapul',\n\t'Sintra',\n\t'Misserete',\n\t'Lapinig',\n\t'Singhbari',\n\t'Librazhd',\n\t'Amberg',\n\t'Pires do Rio',\n\t'Kenora',\n\t'Satosho',\n\t'Anosivelo',\n\t'Coos Bay',\n\t'Pathum Thani',\n\t'Curchorem',\n\t'Bergambacht',\n\t'Dahbed',\n\t'Haslingden',\n\t'Shahin Dezh',\n\t'Faridabad',\n\t'Patera',\n\t'Saint-Cyr-sur-Loire',\n\t'Ilhota',\n\t'Chianki',\n\t'Garcia',\n\t'Meine',\n\t'Kalamazoo',\n\t'Spitalfields',\n\t'Maralal',\n\t'Aruvapalam',\n\t'Pedro Juan Caballero',\n\t'Antanifotsy',\n\t'Suhl',\n\t'Hancha',\n\t'Sansepolcro',\n\t'Villa Martin Colchak',\n\t'Ksar Chellala',\n\t'Voznesensk',\n\t'Requinoa',\n\t'Vemalwada',\n\t'Athieme',\n\t'Neuburg',\n\t'Tikamgarh',\n\t'Mazidagi',\n\t'Florence-Graham',\n\t'Ikeja',\n\t'Dinara',\n\t'Ampanihy',\n\t'Woodinville',\n\t'El Palomar',\n\t'Shafinagar',\n\t'Jandrapeta',\n\t'Finglas',\n\t'Pikesville',\n\t'Sidney',\n\t'Tiffin',\n\t'Belvedere Park',\n\t'Bad Breisig',\n\t'Afega',\n\t'Canilla',\n\t'Hisarcik',\n\t'Hertford',\n\t'Chichkah',\n\t'Santa Rosa',\n\t'Palampur',\n\t'Sanmu',\n\t'Apuiares',\n\t'Courtenay',\n\t'Aiuaba',\n\t'Hidirbey',\n\t'Chikuma',\n\t'Hiddenhausen',\n\t'Shikohabad',\n\t'Chilliwack',\n\t'Tagalft',\n\t'Chelmno',\n\t'Colfontaine',\n\t'Upper Dublin',\n\t'Ungheni',\n\t'Estiva',\n\t'Sveta Ana',\n\t'Watsa',\n\t'Gilbert',\n\t'At Turrah',\n\t'Payariq Shahri',\n\t'Ibipeba',\n\t'San Juan de los Lagos',\n\t'Barcelona',\n\t'Ambalamanasy II',\n\t'Homnabad',\n\t'Bad Freienwalde',\n\t'Chandauli',\n\t'Comitancillo',\n\t'Bad Konig',\n\t\"Sint-Job-in-'t-Goor\",\n\t'Templin',\n\t\"D'Iberville\",\n\t'Adelanto',\n\t'Tepeapulco',\n\t'Moreni',\n\t'Blois',\n\t'Moberly',\n\t'Encruzilhada',\n\t'Tokol',\n\t'Kaneohe',\n\t'Macomia',\n\t'Tlalpujahua de Rayon',\n\t'Kaglipur',\n\t'Baiceng',\n\t'Muisne',\n\t'Fareham',\n\t'Polistena',\n\t'Razampeta',\n\t'Ipojuca',\n\t'Sandrakatsy',\n\t'Dagiapara',\n\t'Madhurapur',\n\t'Zhuangyuan',\n\t'Shkoder',\n\t'Hillsboro',\n\t'Vidin',\n\t'Quatipuru',\n\t'Dubrajpur',\n\t'Capenda Camulemba',\n\t'Jaisinghpur',\n\t'Sonneberg',\n\t'Gonesse',\n\t'Toging am Inn',\n\t'Laranjal Paulista',\n\t'Tucuru',\n\t'Arcueil',\n\t'Francisco I. Madero',\n\t'Tarumizu',\n\t'Estrela de Alagoas',\n\t'Charleston',\n\t'Cowes',\n\t'Sessa Aurunca',\n\t'Fougeres',\n\t\"Gricignano d'Aversa\",\n\t'New Germany',\n\t'Paraparaumu',\n\t'Pleasant Prairie',\n\t'Alfena',\n\t'Payakumbuh',\n\t'Ramree',\n\t'Maromme',\n\t'Kovvur',\n\t'Derince',\n\t'Caledon',\n\t'Jieshang',\n\t'Navan',\n\t'Kumbo',\n\t'Santa Rita do Passa Quatro',\n\t'Ridgefield',\n\t'Kllokot',\n\t'Niramaruthur',\n\t'Despujols',\n\t'Narammala',\n\t'Oroqen Zizhiqi',\n\t'San Luis del Palmar',\n\t'Mallawi',\n\t'Polzela',\n\t'Troy',\n\t'El Refugio',\n\t'Marau',\n\t'Thaton',\n\t'Gerede',\n\t'Lakhanapuram',\n\t'Chinchina',\n\t'Duenas',\n\t'Devizes',\n\t'Amarillo',\n\t'Dakor',\n\t'Brotas',\n\t'North Auburn',\n\t'Soamanonga',\n\t'Villa Alemana',\n\t'Sathamba',\n\t'Kanazawa',\n\t'Namayumba',\n\t'Ngozi',\n\t'Mavalli',\n\t'Maxhutte-Haidhof',\n\t'Ratnapuram',\n\t'Midoun',\n\t'Gostyn',\n\t'Olopa',\n\t'Fugangcun',\n\t'Perungala',\n\t'Mount Washington',\n\t'Tekirdag',\n\t'Cerro Azul',\n\t'Lahra Muhabbat',\n\t'Ontario',\n\t'Santa Maria Chiquimula',\n\t'North Hempstead',\n\t'Arma',\n\t'Awash',\n\t'Felanitx',\n\t'Olmaliq',\n\t'Torremolinos',\n\t'Gbawe',\n\t'Sivrihisar',\n\t'Preussisch Oldendorf',\n\t'Herrin',\n\t'Vellalur',\n\t'Doboj',\n\t'Guaramirim',\n\t'Bafoulabe',\n\t'Nolensville',\n\t'Acomb',\n\t'Balaungi',\n\t'San Juan Ixcaquixtla',\n\t'Cadereyta',\n\t'Tarra',\n\t'Ponta do Sol',\n\t'Ikaruga',\n\t'Kaboua',\n\t'Inagawa',\n\t'Jacaltenango',\n\t'Nankana Sahib',\n\t'Ciudad Melchor de Mencos',\n\t'Braine-le-Chateau',\n\t'Gerzat',\n\t'Abaiara',\n\t'Maricopa',\n\t'Saint Neots',\n\t'Sao Goncalo do Sapucai',\n\t'Myebon',\n\t'Markapur',\n\t'Nova Zagora',\n\t'Gombong',\n\t'Gambela',\n\t'Magsingal',\n\t'Brezovica',\n\t'Greifswald',\n\t'Saint-Nazaire',\n\t'Poinciana',\n\t'Hombori',\n\t'Tsivory',\n\t'Weiz',\n\t'Jaguaripe',\n\t'Kibaya',\n\t'Wallasey',\n\t'Nangal Township',\n\t'Chongzuo',\n\t'Takamori',\n\t'Pajo',\n\t'Daboh',\n\t'Jisr ez Zarqa',\n\t'Tizi Rached',\n\t'Nangal Chaudhri',\n\t'North Huntingdon',\n\t'Balilihan',\n\t'San Josecito',\n\t'Steinfeld',\n\t'Velika Gorica',\n\t'New Cassel',\n\t'Kyaukme',\n\t'Kafr Batna',\n\t'Tepetzintla',\n\t'Takaharu',\n\t'Valdepenas',\n\t'Old Harbour',\n\t'Siruguppa',\n\t'Arasur',\n\t'Grajewo',\n\t'Aci Catena',\n\t'Itau de Minas',\n\t'Zundert',\n\t'Djakotome',\n\t'Toulou',\n\t'Sahar',\n\t'Opfikon',\n\t'Damanhur',\n\t'Yengema',\n\t'Subic',\n\t'Kolambugan',\n\t'Taougrite',\n\t'Eriyodu',\n\t'Kiskunmajsa',\n\t'Germasogeia',\n\t'Peresecina',\n\t'Yoshikawa',\n\t\"Coeur d'Alene\",\n\t'Mobaye',\n\t'Borda da Mata',\n\t'Vecses',\n\t'Kui Buri',\n\t'Newport Beach',\n\t'Palo del Colle',\n\t'Ripoll',\n\t'Galsi',\n\t'Aldama',\n\t'La Grita',\n\t'Paese',\n\t'Sambir',\n\t'Chapelle',\n\t'Canteras',\n\t'Vega Alta',\n\t'Bhachau',\n\t'Nanfengcun',\n\t'Nelson',\n\t'Chikuzen',\n\t'Burrillville',\n\t'Nambour',\n\t'Sanganakallu',\n\t'Punch',\n\t'Borehamwood',\n\t'Bagan Si Api-api',\n\t'Tiogollo',\n\t'Pratteln',\n\t'Coleford',\n\t'Huajing',\n\t'Amoucha',\n\t'Kannivadi',\n\t'Winfield',\n\t'Kimilili',\n\t'Bugganipalle',\n\t'Mont-Dore',\n\t'Chaukhata',\n\t'Long Lama',\n\t'Taysan',\n\t'Caico',\n\t'Sakardih',\n\t'Owando',\n\t'Foleshill',\n\t'Katlehong',\n\t'Falkoping',\n\t'Vellithiruthi',\n\t'Pancas',\n\t'Rojales',\n\t'Juazeiro',\n\t'Sluis',\n\t'Matala',\n\t'Banikoara',\n\t'Ilicakoy',\n\t'Montalban',\n\t'La Algaba',\n\t'Makeni',\n\t'Mangrol',\n\t'Shirdi',\n\t'Kamphaeng Phet',\n\t'Prelouc',\n\t'Podujeve',\n\t'Redencao',\n\t'Isaka-Ivondro',\n\t'Pollensa',\n\t'Eemnes',\n\t'Kogon Shahri',\n\t'Asarhi',\n\t'Bang Khla',\n\t'San Andres de Sotavento',\n\t'Shertallai',\n\t'Fenglu',\n\t'El Doncello',\n\t'Prachatice',\n\t'Biel/Bienne',\n\t'Tsabit',\n\t'Mirante do Paranapanema',\n\t'Kotoura',\n\t'Port St. Lucie',\n\t'Minamichita',\n\t'Arapiraca',\n\t'Balcarce',\n\t'Scionzier',\n\t'Kharv-e Sofla',\n\t'Redan',\n\t'Rolandia',\n\t'Turrialba',\n\t'Tsaravary',\n\t'Sayda',\n\t'Banepa',\n\t'Soller',\n\t'Kaith',\n\t'Mahdasht',\n\t'Sandhausen',\n\t'Redditch',\n\t'Bemiss',\n\t'Callaway',\n\t'Rioblanco',\n\t'Maesteg',\n\t'Saronno',\n\t'Fulgazi',\n\t'Revuca',\n\t'Lysychansk',\n\t'Mandan',\n\t'Wangjiazhai',\n\t'Capela de Santana',\n\t'Toukoto',\n\t'Vwawa',\n\t'Dublin',\n\t'Newark upon Trent',\n\t'Zacoalco de Torres',\n\t'Pustomyty',\n\t'Sangi',\n\t'Zymohiria',\n\t'Clinton',\n\t'Nenjiang',\n\t'Nova Ubirata',\n\t'Cosautlan',\n\t'Kibuye',\n\t'Darfield',\n\t'Cornaredo',\n\t'Ciudad Choluteca',\n\t'Tvoroyri',\n\t'Giussano',\n\t'Manambur',\n\t'Benfreha',\n\t'Medarametla',\n\t'Meridianville',\n\t'Al Qa`idah',\n\t'Treinta y Tres',\n\t'Nagar Nahusa',\n\t'Kedainiai',\n\t'Kursenai',\n\t'Shunan',\n\t'Dzolokpuita',\n\t'Lyon',\n\t'Kleve',\n\t'Sadon',\n\t'Fort Pierce',\n\t'Sanski Most',\n\t'Zedelgem',\n\t'Paracho de Verduzco',\n\t'Hattem',\n\t'Cantel',\n\t'Miary-Taheza',\n\t'Maintirano',\n\t'Denham Springs',\n\t'Ap Khanh Hoa',\n\t'Kaler',\n\t'Le Pradet',\n\t'Uxbridge',\n\t'Cugnaux',\n\t'Altdorf',\n\t'Oberhausen',\n\t'Caacupe',\n\t'Moyo',\n\t'Muchun',\n\t'Roquevaire',\n\t'Tubod',\n\t'Bacolor',\n\t'Nijgaon Paranpur',\n\t'Sao Pedro da Aldeia',\n\t'Adrian',\n\t'Remedios de Escalada',\n\t'Pehowa',\n\t'Orlando',\n\t\"Mosciano Sant'Angelo\",\n\t'Kasempa',\n\t'Tomigusuku',\n\t'Naic',\n\t'Blanes',\n\t'Iguacu',\n\t'Ben Arous',\n\t'Ben',\n\t'Westborough',\n\t'Parkent',\n\t'Nokaneng',\n\t'Goianesia',\n\t'Raniwara Kalan',\n\t'Lambersart',\n\t'Handewitt',\n\t'Beni Haoua',\n\t'Pargas',\n\t'Temascalcingo',\n\t'Abano Terme',\n\t'Petmanhalli',\n\t'Karis',\n\t'Dezhou',\n\t'Guigue',\n\t'Melitopol',\n\t'Tajerouine',\n\t'Malaimarpuram',\n\t'Asti',\n\t'Hanimciftligi',\n\t'Isua',\n\t'Enkesen',\n\t'Birtouta',\n\t'Relizane',\n\t'Igrapiuna',\n\t'Belle Chasse',\n\t'Calubian',\n\t'Ararat',\n\t'Caucete',\n\t'Hybla Valley',\n\t'Wipperfurth',\n\t'Bom Jesus da Lapa',\n\t'North Salt Lake',\n\t'Dayan',\n\t'Zouar',\n\t'Parang',\n\t'Mandi Bahauddin',\n\t'Rovereto',\n\t'Jinta',\n\t'Araua',\n\t'Eugenopolis',\n\t'Chota Mollakhali',\n\t'Nabha',\n\t'Mit Nama',\n\t'Baia Mare',\n\t'Katridih',\n\t'Iwamuro-onsen',\n\t'Sao Miguel do Iguacu',\n\t'Suesca',\n\t'Al Mudaybi',\n\t'Nauen',\n\t'Nansio',\n\t'Nada',\n\t'Camaligan',\n\t'Catandica',\n\t'Ostrov',\n\t'Wargal',\n\t'Simarbani',\n\t'Santa Venera',\n\t'Bad Gandersheim',\n\t'Kumbadaje',\n\t'Samrong',\n\t'Higashiomi',\n\t'Chandragiri',\n\t'General Enrique Mosconi',\n\t'Seregno',\n\t'La Florida',\n\t'Envigado',\n\t'Landerneau',\n\t'Sao Pedro da Agua Branca',\n\t'Orion',\n\t'Mudgere',\n\t'Kentwood',\n\t'Hirono',\n\t'Kongen',\n\t'Swamimalai',\n\t'Tiruchendur',\n\t'Piploda',\n\t'Cajamarca',\n\t'Upata',\n\t'Lobau',\n\t'Les Pavillons-sous-Bois',\n\t'Karungu',\n\t'Araruama',\n\t'Fraser',\n\t'Queven',\n\t'Kibingo',\n\t'Senden',\n\t'Zarbdor Shaharchasi',\n\t'Goner',\n\t'West Athens',\n\t'Butembo',\n\t'Vadakku Valliyur',\n\t'Huasco',\n\t'Brandsen',\n\t'Halikko',\n\t'Sabinanigo',\n\t'Niagara Falls',\n\t'Sarikei',\n\t'Okegawa',\n\t'Reichenbach/Vogtland',\n\t'Triuggio',\n\t'Villa Hayes',\n\t'Tiruttangal',\n\t'Hasuda',\n\t'Marpingen',\n\t'Toms River',\n\t'Belalcazar',\n\t'Gembloux',\n\t'Shuizhai',\n\t'Ihumwa',\n\t'Zacualpan de Amilpas',\n\t'Doddappanayakkanur',\n\t'Covina',\n\t'Brikama Ba',\n\t'Yerkoy',\n\t'Essenbach',\n\t'Xiushui',\n\t'Obuase',\n\t'Riga',\n\t'Pokhara',\n\t'Somoniyon',\n\t'Itogon',\n\t'Zelzate',\n\t'Valence',\n\t'Bourges',\n\t'Samthar',\n\t'Elavalli',\n\t'Ibitinga',\n\t'Chembrassheri',\n\t'Pilao Arcado',\n\t'Carignan',\n\t'Sipilou',\n\t'Colonia Nicolich',\n\t'Valbom',\n\t'Naogaon',\n\t'Decan',\n\t'Nellore',\n\t'Makilala',\n\t'Borgne',\n\t'Santa Clarita',\n\t'Vadso',\n\t'Nandura Buzurg',\n\t'Polavaram',\n\t'Bike',\n\t'Lapinlahti',\n\t'Cambanugoy',\n\t'Umri',\n\t'Kribi',\n\t'Dogachi',\n\t'Kara-Kulja',\n\t'Karibib',\n\t'La Salvetat-Saint-Gilles',\n\t'Sidi Ben Adda',\n\t'Tinpiple',\n\t'Santa Perpetua de Moguda',\n\t'Dushanove',\n\t'Plewiska',\n\t'Filderstadt',\n\t'Yerres',\n\t'Verkhivtseve',\n\t'Lop Buri',\n\t'Saldana',\n\t'Gujo',\n\t'Dodge City',\n\t'Belari',\n\t'Minano',\n\t'Hamira',\n\t'Keles',\n\t'Bichena',\n\t'Lagoa da Prata',\n\t'Ormskirk',\n\t'Heide',\n\t'Borj Hammoud',\n\t'Zhuzhou',\n\t'Heilbronn',\n\t'Geertruidenberg',\n\t'Salumbar',\n\t'Kings Park',\n\t'Neralakaje',\n\t'Ciudad Apodaca',\n\t'Amircan',\n\t'Samalkha',\n\t'Hvannasund',\n\t'Lier',\n\t'Skadovsk',\n\t'Nong Khai',\n\t'Soderhamn',\n\t'Aghbala',\n\t'Ban Wisit',\n\t'Ahram',\n\t'Dianopolis',\n\t'North College Hill',\n\t'Barrechid',\n\t'Elandakuttai',\n\t'Yatagan',\n\t'Macae',\n\t'Fukayacho',\n\t'Camaqua',\n\t'Ypacarai',\n\t'Santa Paula',\n\t'Manjo',\n\t'Sarmada',\n\t'La Seyne-sur-Mer',\n\t'Heze',\n\t'Auch',\n\t'Nuvem',\n\t'Lowicz',\n\t'Erdokertes',\n\t'Kothia',\n\t'Bassenge',\n\t'Bagh-e Malek',\n\t'New Port Richey',\n\t'Soisy-sous-Montmorency',\n\t'Toluprpatti',\n\t'Niimi',\n\t'Huaniu',\n\t'Marratxi',\n\t'Schwerte',\n\t'Kontich',\n\t'Jaynagar',\n\t'Saint-Fargeau',\n\t'Tamm',\n\t'Ain Sefra',\n\t'Glassboro',\n\t'Pitoa',\n\t'Hohenhameln',\n\t'Babati',\n\t'Madnur',\n\t'Chicopee',\n\t'Tanza',\n\t'Burke Centre',\n\t'Guntur',\n\t'Arvayheer',\n\t'Ban Pa Hung',\n\t'Santa Margarita',\n\t'Manihari',\n\t'Lamorlaye',\n\t'Mengen',\n\t'Pullach im Isartal',\n\t'Orleaes',\n\t'Patuakhali',\n\t'Kharan',\n\t'Berriozar',\n\t'Arad',\n\t'Bra',\n\t'Bucimas',\n\t'Lindas',\n\t'Datca',\n\t'Vlotho',\n\t'Zabalj',\n\t'San Jose del Cabo',\n\t'Aflao',\n\t'Joliette',\n\t'Mamidipalli',\n\t'Ganguvarpatti',\n\t'Sitamarhi',\n\t'Hockessin',\n\t'Piamonte',\n\t'Arroyohondo',\n\t'Alapli',\n\t'Conflans-Sainte-Honorine',\n\t'San Lawrenz',\n\t'Cangas de Narcea',\n\t'Apaseo el Alto',\n\t'Castelfranco Emilia',\n\t'Boucan Carre',\n\t'Mongat',\n\t'Sutton',\n\t'Koungheul',\n\t'Capodrise',\n\t'Manhumirim',\n\t'Mohnyin',\n\t'San Francisco de Macoris',\n\t'Veraval',\n\t'Sint-Martens-Lennik',\n\t'Ban Bo Haeo',\n\t'Colinas',\n\t'Ajaigarh',\n\t'Arroyito',\n\t'Gravelines',\n\t'Little Lever',\n\t'Sayama',\n\t'Vitoria do Mearim',\n\t'Ariana',\n\t'Thatcham',\n\t'Chateaudun',\n\t'Laranja da Terra',\n\t'Sidi Azzouz',\n\t'Lokoja',\n\t'Chamgardan',\n\t'Worcester Park',\n\t'Bagnolo Mella',\n\t'Dewas',\n\t'Safo',\n\t'Villanueva y Geltru',\n\t'Shangxiao',\n\t'Ayabe',\n\t'Neo Psychiko',\n\t'Appenzell',\n\t'Pototan',\n\t'Carlos Casares',\n\t'Vandoeuvre-les-Nancy',\n\t'Blagoevgrad',\n\t'Amirli',\n\t'Jalalpur Jattan',\n\t'Bilis Qooqaani',\n\t'Hemsbach',\n\t'Woodway',\n\t'Stow',\n\t'Fukuyama',\n\t'Geilenkirchen',\n\t'Villa Isabela',\n\t'Mosjoen',\n\t'High Wycombe',\n\t'Yumbel',\n\t'Ampasimazava',\n\t'Mulbagal',\n\t'Payao',\n\t'New Garden',\n\t'Newburn',\n\t\"Ak'ordat\",\n\t'Northborough',\n\t'Pueblo Bello',\n\t'Prijepolje',\n\t\"Espigao D'Oeste\",\n\t'Horstel',\n\t'Seropedica',\n\t'Terrytown',\n\t'Kinnelon',\n\t'Menggala',\n\t'Atimonan',\n\t'Grand Baie',\n\t'Dodoni',\n\t'Engenheiro Coelho',\n\t'Santa Croce Camerina',\n\t'Mambajao',\n\t'Fateh Nangal',\n\t'Karimnagar',\n\t'Oliveira dos Brejinhos',\n\t'Neykkarappatti',\n\t'Hooglede',\n\t'Malacatan',\n\t'Gbadolite',\n\t'Bhai Rupa',\n\t'Khallikot',\n\t'Uiwang',\n\t'Kamianka',\n\t'Omuta',\n\t'Okagaki',\n\t'Stepanavan',\n\t'Kisujszallas',\n\t'Digar',\n\t'Glenwood',\n\t'Siqba',\n\t'Olsztyn',\n\t'Zargar',\n\t'Leamington',\n\t'Seymour',\n\t'Ban Mae Ngon Khilek',\n\t'Wyomissing',\n\t'Anyang',\n\t'Paranacity',\n\t'Paderno Dugnano',\n\t'Haselunne',\n\t'Kampong Thum',\n\t'Paldorak',\n\t'Brandermill',\n\t'Wunsiedel',\n\t'Ribeirao do Largo',\n\t'Shirud',\n\t'Melong',\n\t'Romeoville',\n\t'Palma Soriano',\n\t'Filadelfia',\n\t'Taiyuan',\n\t'Medicina',\n\t'Kara',\n\t'Perunturuttu',\n\t\"Sant'Eufemia Lamezia\",\n\t'Villa Canales',\n\t'Boankra',\n\t'Dildarnagar',\n\t'Arraijan',\n\t'Sonzacate',\n\t'Manghit',\n\t'La Valette-du-Var',\n\t'Loon op Zand',\n\t'Mutis',\n\t'Ewa Gentry',\n\t'Congonhal',\n\t'Tirua',\n\t'Firuzoba',\n\t'Mushin',\n\t'Okazaki',\n\t'Thornton',\n\t'Torbali',\n\t'Rumburk',\n\t'Sgamna',\n\t'Bel-Air',\n\t'Cassia',\n\t'Oliveira de Azemeis',\n\t'Sangrur',\n\t'Thongwa',\n\t'Cunco',\n\t'Bonn',\n\t'Kalanadu',\n\t'Magalia',\n\t'Ficarazzi',\n\t'Bemarivo',\n\t'Hadim',\n\t'Forster',\n\t'Mahis',\n\t'Axixa',\n\t'Putignano',\n\t'Claye-Souilly',\n\t'Jaguariuna',\n\t'Kilifi',\n\t'Santo Cristo',\n\t'Gandlapenta',\n\t'Langenhagen',\n\t'Orillia',\n\t'Tshilenge',\n\t'Donggou',\n\t'West Lincoln',\n\t'Victoria',\n\t'Hoh Ereg',\n\t'Queensbury',\n\t'Snovsk',\n\t'Dabrowa Gornicza',\n\t'Rosenberg',\n\t'Nayanakulam',\n\t'Kreminna',\n\t'Bissora',\n\t'Brezno',\n\t'Xireg',\n\t'Wittlich',\n\t'Kanyana',\n\t'Ohrdruf',\n\t'Libagon',\n\t'Fot',\n\t'Ban Ratchakrut',\n\t'Xinnongcun',\n\t'Sotik',\n\t'Hindarx',\n\t'Engelskirchen',\n\t'Marcos',\n\t'San Miguel Acatan',\n\t'Mariano Escobedo',\n\t'Capdepera',\n\t'Camarate',\n\t'Corinth',\n\t'Mejicanos',\n\t'Sirohi',\n\t'Takhli',\n\t'Hodonin',\n\t'Dabat',\n\t'Humansdorp',\n\t'Doncaster',\n\t'Ballitoville',\n\t'Combita',\n\t'Beilngries',\n\t'Soanierana Ivongo',\n\t'Mella',\n\t'Poti',\n\t'Dongola',\n\t'Deptford',\n\t'Azaourisse',\n\t'Itabirinha de Mantena',\n\t'Saluzzo',\n\t'Dumbravita',\n\t'Cacongo',\n\t'Mechelen',\n\t'Sablan',\n\t'Doaba',\n\t'Borre',\n\t'Benghazi',\n\t'Vasilevo',\n\t'Nyuzen',\n\t'Thames Centre',\n\t'Chavara Gramam',\n\t'Nivelles',\n\t'Fairmont',\n\t'Villa Luzuriaga',\n\t'Carletonville',\n\t'Varash',\n\t'Montemurlo',\n\t'Mukocho',\n\t'Sa Kaeo',\n\t'Gonegandla',\n\t'Bebandem',\n\t'Kulp',\n\t'Plainsboro',\n\t'Pedro Leopoldo',\n\t'Mokolo',\n\t'Mesolongi',\n\t'Formosa do Rio Preto',\n\t'Vellmar',\n\t'Yoko',\n\t'Sax',\n\t'Sirvar',\n\t'Boadilla del Monte',\n\t'Ziama Mansouria',\n\t'Brasov',\n\t'Remedios',\n\t'Rita',\n\t'Thane',\n\t'Fukusaki',\n\t'Pontypridd',\n\t'Beysehir',\n\t'Uchquduq Shahri',\n\t'Feilding',\n\t'Silves',\n\t'Galvan',\n\t'Great Linford',\n\t'Zimna Voda',\n\t'Hirado',\n\t'Edinburgh of the Seven Seas',\n\t'Vellodu',\n\t'Prayagraj',\n\t'Clermont-Ferrand',\n\t'La Crosse',\n\t'San Cristobal Verapaz',\n\t'Apollo Beach',\n\t'Cerete',\n\t'Leskovac',\n\t'Poltava',\n\t'Anan',\n\t'Al Fujayrah',\n\t'Leramatang',\n\t'Guastatoya',\n\t'Fort Wellington',\n\t'Erumad',\n\t'Genet',\n\t'Jondor Shaharchasi',\n\t'Pudong',\n\t'Dip',\n\t'Bystrc',\n\t'Gakuch',\n\t'Napoleon',\n\t'Mathigeri',\n\t'Hathapur',\n\t'Kinh Mon',\n\t'Eidsberg',\n\t'Quincy-sous-Senart',\n\t'Yardimli',\n\t'San Juan Cancuc',\n\t'Kolbuszowa',\n\t'Conegliano',\n\t'Eski Ikan',\n\t'Hildburghausen',\n\t'Tirubhuvane',\n\t'Nikaido-kaminoshocho',\n\t'Simbahan',\n\t'Havixbeck',\n\t'Para',\n\t'Blomberg',\n\t'Tionk Essil',\n\t'Clearview',\n\t'Imassogo',\n\t'Whittlesey',\n\t'Panchgani',\n\t'Gumani',\n\t'Kaikkudi',\n\t'Amatepec',\n\t'Klotze',\n\t'Kohtla-Jarve',\n\t'Vilanova del Cami',\n\t'Belison',\n\t'Kakinada',\n\t'Monte Alto',\n\t'Walldorf',\n\t'Alangalang',\n\t'Carson City',\n\t'Moises Padilla',\n\t'Ad Dir`iyah',\n\t'Hlatikulu',\n\t'Vigna di Valle',\n\t'Mosta',\n\t'Eastern Goleta Valley',\n\t'Ballenger Creek',\n\t'Tsukubamirai',\n\t'Metu',\n\t'Modachchur',\n\t'Sukabumi',\n\t'San Nicolas de los Arroyos',\n\t'Umingan',\n\t'Tinnevelly',\n\t'San Juan Opico',\n\t'San Vicente de Chucuri',\n\t'Jacunda',\n\t'Kaura Namoda',\n\t'Lodi',\n\t'Nakhon Sawan',\n\t'Dunwoody',\n\t'Katahra',\n\t'Zhonghechang',\n\t'Troyes',\n\t'Goalundo Ghat',\n\t'Saadatpur Aguani',\n\t'Ji-Parana',\n\t'Baroy',\n\t'Scoresbysund',\n\t'Santurce-Antiguo',\n\t'Gagny',\n\t'La Libertad',\n\t'Beypore',\n\t'Puerto Cumarebo',\n\t'Rasol',\n\t'Kamalia',\n\t'Singhana',\n\t'Vancouver',\n\t'Angouleme',\n\t'Cacapava',\n\t'Laurinburg',\n\t'Ilhavo',\n\t'Rangamati',\n\t'Leogane',\n\t'Ilkeston',\n\t'Luganville',\n\t'Somerville',\n\t'Biot',\n\t'Nanyang',\n\t'Sidi Yahya Zaer',\n\t'Saltangara',\n\t'Ban Doi Suthep',\n\t'San Lorenzo de Esmeraldas',\n\t'Srinagar',\n\t'Alberton',\n\t'Khenchela',\n\t'Belcista',\n\t'Chiramanangad',\n\t'Ordu',\n\t'Channubanda',\n\t'Niandjila',\n\t'Tellicherry',\n\t'Steenokkerzeel',\n\t'Conceicao do Rio Verde',\n\t'Kusapin',\n\t'Sanjat',\n\t'Nanxicun',\n\t'Cedros',\n\t'Soanenga',\n\t'La Orotava',\n\t'Pasvalys',\n\t'Verdal',\n\t'Romans-sur-Isere',\n\t'Katangi',\n\t'Zhob',\n\t'Frosinone',\n\t'Plan-de-Cuques',\n\t'Bree',\n\t'Sveti Nikole',\n\t'Ciudad Tecun Uman',\n\t'Helsinge',\n\t'Velez',\n\t'Balcova',\n\t'Beni Yakhlef',\n\t'Arumuganeri',\n\t'Condado',\n\t'Xiangkhoang',\n\t'Parsons',\n\t'Rouissat',\n\t'Cetraro',\n\t'Ozieri',\n\t\"Say'un\",\n\t'San Luis Jilotepeque',\n\t'Vynohradiv',\n\t'Nampula',\n\t'Kunsan',\n\t'Hounde',\n\t'Robertson',\n\t'Oarai',\n\t'Sigus',\n\t'Golborne',\n\t'Richmond Heights',\n\t'Gateshead',\n\t'Zhenbeibu',\n\t'Chesham',\n\t'Canals',\n\t'Bakau',\n\t'Belas',\n\t'Hurricane',\n\t'Oyo',\n\t'Ciudad Piar',\n\t'Palmerston',\n\t'Chik Ballapur',\n\t'Bressuire',\n\t'Mountain Park',\n\t'Pantelimon',\n\t'Gooik',\n\t'Flitwick',\n\t'Kulattur',\n\t'Plumstead',\n\t'Verzej',\n\t'Kapasiawan',\n\t'Olds',\n\t'Nidgundi',\n\t'Santo Antonio',\n\t'Dimitrovgrad',\n\t'Oued Zenati',\n\t'Kahramanmaras',\n\t'Chengtangcun',\n\t'Gonikoppal',\n\t'Skidaway Island',\n\t'Moriguchi',\n\t'Devonport',\n\t'Samamea',\n\t'Tsimafana',\n\t'Lakeside',\n\t'San Matias',\n\t'Visconde do Rio Branco',\n\t'Rivarolo Canavese',\n\t'Normal',\n\t'Bahharet Oulad Ayyad',\n\t'Hurzuf',\n\t'Allendale',\n\t'Saint-Charles-Borromee',\n\t'Netivot',\n\t'Tunasan',\n\t'Mazagao',\n\t'Czarnkow',\n\t'Ubatuba',\n\t'Baco',\n\t'Aralik',\n\t'Rosamond',\n\t'Masindi',\n\t'Vargem da Roca',\n\t'Mbeya',\n\t'Byram',\n\t'Court-Saint-Etienne',\n\t'Karath',\n\t'Sidcup',\n\t'Anage',\n\t'Midway',\n\t'Mountain Ash',\n\t'Agouna',\n\t'Iakora',\n\t'Adendorf',\n\t'Warni',\n\t'Nakhon Nayok',\n\t'G`ozg`on',\n\t'Achacachi',\n\t'Soamanova',\n\t'Sao Mamede de Infesta',\n\t'Brumadinho',\n\t'Kosamba',\n\t'Sabuncu',\n\t'Alicante',\n\t'Youganning',\n\t'Neviges',\n\t'Jaro',\n\t'Juangriego',\n\t'Meshkin Dasht',\n\t'Veinticinco de Mayo',\n\t'Buyan',\n\t'Khirbat Ghazalah',\n\t'Dabola',\n\t'Bundehra',\n\t'Bierbeek',\n\t'Gherla',\n\t'Tammampatti',\n\t'Avranches',\n\t'Dubbo',\n\t'Southport',\n\t'Ban Om Noi',\n\t'Koumra',\n\t'Bridgeview',\n\t'Madipakkam',\n\t'Fiche',\n\t'Gura Humorului',\n\t'Satsumasendai',\n\t'Nautan Dube',\n\t'Ngaputaw',\n\t'Erlin',\n\t'Segorbe',\n\t'Khandela',\n\t'Bikrampur Bande',\n\t'Diavata',\n\t'Taurage',\n\t'Tula de Allende',\n\t'Minato',\n\t'Tumba',\n\t\"Trostyanets'\",\n\t'La Matanza de Acentejo',\n\t'Sathmalpur',\n\t'Coycoyan de las Flores',\n\t'Sierra Madre',\n\t'Masjed Soleyman',\n\t'Yokoshibahikari',\n\t'Trezzano sul Naviglio',\n\t'Leon',\n\t'Xinpu',\n\t'Karacabey',\n\t'Graaff-Reinet',\n\t'Maputo',\n\t'Bargoed',\n\t'Ndali',\n\t'Vettikkavala',\n\t'Bat Yam',\n\t'Boxmeer',\n\t'Anao',\n\t'Riccione Marina',\n\t'Marilao',\n\t\"Saint-Martin-d'Heres\",\n\t'Badamdar',\n\t'Shaoguan',\n\t'Asker',\n\t'Benedito Novo',\n\t'Az Zubayr',\n\t'Nemyriv',\n\t'Madanpur',\n\t'Hakha',\n\t'Bumba',\n\t'Fushe Kosove',\n\t'Shahrisabz',\n\t'Clondalkin',\n\t'Delvada',\n\t'Waldwick',\n\t'Pemagatshel',\n\t'Tubingen',\n\t'Ejido',\n\t'Awankh',\n\t'Shyorongi',\n\t'Houghton le Spring',\n\t'Albert Lea',\n\t'Lazdijai',\n\t'Sanando',\n\t'Galugah',\n\t'Nagcarlan',\n\t'Huong Thuy',\n\t'Nettuno',\n\t'Baalbek',\n\t'Kunnamkulam',\n\t'Oiso',\n\t'Barra do Sul',\n\t'Bishunpur Hakimabad',\n\t'North Adams',\n\t'Shamsa',\n\t'Madhuban',\n\t'Tirumala',\n\t'Ganthier',\n\t'Guben',\n\t'Lakamane',\n\t'Preakness',\n\t'Caraguatatuba',\n\t'Ferrol',\n\t'Partibanur',\n\t'Venkatadripalem',\n\t'Aquidaba',\n\t'Sedico',\n\t'Baixo Guandu',\n\t'Navadwip',\n\t'Zgharta',\n\t'Morro Bay',\n\t'Miramichi',\n\t'Jose Batlle y Ordonez',\n\t'Zuwarah',\n\t'Espinal',\n\t'Brcko',\n\t'Cham',\n\t'Kika',\n\t'Helixi',\n\t'Pillaro',\n\t'Lam Tin',\n\t'Trzebiatow',\n\t'Nidda',\n\t'Paulo Lopes',\n\t\"Santa Barbara d'Oeste\",\n\t'San Pedro de Ycuamandiyu',\n\t'Wenchang',\n\t'Hovd',\n\t'Scunthorpe',\n\t'Maspalomas',\n\t'Oskemen',\n\t'Raibhir',\n\t'Palmview',\n\t'Herrsching am Ammersee',\n\t'Frederikssund',\n\t'Yachimata',\n\t'Rosario de la Frontera',\n\t'Sinimbu',\n\t'Valdagno',\n\t'Roseto degli Abruzzi',\n\t'Sidi Allal Tazi',\n\t'Gantt',\n\t'Pulimel',\n\t'Ambatomainty',\n\t'Kumaripur',\n\t'Haldwani',\n\t'Zwiesel',\n\t'Nanqiaotou',\n\t'Jovellar',\n\t'Mizhou',\n\t'Asafabad',\n\t'Kielczow',\n\t'Ciying',\n\t'Erice',\n\t\"Palmeira d'Oeste\",\n\t'Comiso',\n\t'Colac',\n\t'St. Peters',\n\t'Gutersloh',\n\t'Chililabombwe',\n\t'Joure',\n\t'Axixa do Tocantins',\n\t'Celeken',\n\t'Khvansar',\n\t'Shepperton',\n\t'Baghdad',\n\t'Darwin',\n\t'Pasaco',\n\t'Diamond Harbour',\n\t'Tiruvallur',\n\t'Hackettstown',\n\t'Santo Antonio da Platina',\n\t'General Eugenio A. Garay',\n\t'St. Helens',\n\t'Hollister',\n\t'Patra',\n\t'Casalmaggiore',\n\t'Villarrubia de los Ojos',\n\t'Brejo da Madre de Deus',\n\t'Attapu',\n\t'Bambous',\n\t'Neuenhof',\n\t'Massape',\n\t'Hurlingham',\n\t'Longxing',\n\t'Xinjun',\n\t'Yaofeng',\n\t'Ipubi',\n\t'Sarikaya',\n\t'Pambadi',\n\t'Qinggang',\n\t'Pirai do Norte',\n\t'Tha Mai',\n\t'Scranton',\n\t'Dang`ara',\n\t'Murliganj',\n\t'Villa Sola de Vega',\n\t'Diedorf',\n\t'Panchi',\n\t'Pagadian',\n\t'Unna',\n\t'Dongyuancun',\n\t'Joacaba',\n\t'San Andres de Giles',\n\t'Niigata',\n\t'Bihat',\n\t'Torqabeh',\n\t'Rio do Fogo',\n\t'Yogyakarta',\n\t'Candido Sales',\n\t'Barangka',\n\t'Paramati',\n\t'Imito',\n\t'Sugar Land',\n\t'Kyaliwajjala',\n\t'Silappadi',\n\t'Golfito',\n\t'Kilcock',\n\t'Moinesti',\n\t'Gujrat',\n\t'Keevallur',\n\t'Culasi',\n\t'Inanantonana',\n\t'Sidi Ghiles',\n\t'Cacolo',\n\t'Nierstein',\n\t'Guia Lopes da Laguna',\n\t'Takieta',\n\t'Lumaco',\n\t'Gatteo',\n\t'Weehawken',\n\t'Logan',\n\t'Olimpia',\n\t'Sidi Zouine',\n\t'Pardanjan',\n\t'Celle',\n\t'Santa Brigida',\n\t'Kifisia',\n\t'Leimen',\n\t'Denizciler',\n\t'Berezhany',\n\t'Rangkasbitung',\n\t'Pagidyala',\n\t'Infanta',\n\t'Hackensack',\n\t'Nakhon Pathom',\n\t'Tamsaout',\n\t'Towson',\n\t'San Teodoro',\n\t'Mahmuda',\n\t'Port-Gentil',\n\t'Federal Way',\n\t'Kondapalle',\n\t'Missao Velha',\n\t'Castres',\n\t\"Ash Shuhada'\",\n\t'Almusafes',\n\t'Limbiate',\n\t'Jiguani',\n\t'Amherstburg',\n\t'Ryde',\n\t'Nazare Paulista',\n\t'Lqoliaa',\n\t'Balua',\n\t'Pathrajolhania',\n\t'Ain Karma',\n\t'Ekangar Sarai',\n\t'Dunhua',\n\t'Cherupulassheri',\n\t'Vutukuru',\n\t'Cesario Lange',\n\t'Coevorden',\n\t'Xiayang',\n\t'Converse',\n\t'Shivpuri',\n\t'Lido di Iesolo',\n\t'Capao do Leao',\n\t'Yangliuqing',\n\t'Kanata',\n\t'Vientiane',\n\t'Darhan',\n\t'Pola',\n\t'Bardai',\n\t'Taskopru',\n\t'Marcq-en-Baroeul',\n\t'Chestnuthill',\n\t'Tonse West',\n\t'Ibirapitanga',\n\t'Carmo de Minas',\n\t'Nirala',\n\t'Gardner',\n\t'Chorozinho',\n\t'Novo Selo',\n\t'Koilkuntla',\n\t'Ixmiquilpan',\n\t'Pinole',\n\t'Kirkby',\n\t'Rokytne',\n\t'Haivoron',\n\t'Charana',\n\t'Shreveport',\n\t'Dunkerque',\n\t'Businga',\n\t'El Salvador',\n\t'Teustepe',\n\t'Begowal',\n\t'Al `Ayn',\n\t'Xiaguanying',\n\t'Mhow',\n\t'Vittorio Veneto',\n\t'Savignano sul Rubicone',\n\t'Bitola',\n\t'Chomutov',\n\t'Natividad',\n\t'Pont-a-Mousson',\n\t'Ballincollig',\n\t'Ballymoney',\n\t'Peixe',\n\t'As Saff',\n\t'San Antonio de Areco',\n\t'Ibi',\n\t'Hathwan',\n\t'Esperance',\n\t'Wangjiabian',\n\t'Pokrovsk',\n\t'Davao',\n\t'Anniston',\n\t'Rodental',\n\t'Maple Ridge',\n\t'Esneux',\n\t'Ahwa',\n\t'Monticello Conte Otto',\n\t'Royal Leamington Spa',\n\t'Carei',\n\t'Real',\n\t'Burjasot',\n\t'Pingdingshan',\n\t'Wumayingcun',\n\t'Asane',\n\t'Souto Soares',\n\t'Arvada',\n\t'Palu',\n\t'Narasapur',\n\t'Ivry-sur-Seine',\n\t\"Saint-Ouen-l'Aumone\",\n\t'High Blantyre',\n\t'Draganesti-Olt',\n\t'Pattoki',\n\t'Cologno Monzese',\n\t\"Ville-d'Avray\",\n\t'Dornava',\n\t'Ambatomanoina',\n\t'Qinbaling',\n\t'So',\n\t'Villanchirai',\n\t'Emet',\n\t'Agatogba',\n\t'Saint-Laurent-du-Var',\n\t'Airway Heights',\n\t'Brasil Novo',\n\t'Fangting',\n\t'Mutukuru',\n\t'Erlensee',\n\t'Mangur',\n\t'Olivenca',\n\t\"L'Isle-Jourdain\",\n\t'Kodmial',\n\t'Manresa',\n\t'Antsahadinta',\n\t'Fort-Shevchenko',\n\t'Eisenhuttenstadt',\n\t'Nicastro',\n\t'Widekum',\n\t'Delmenhorst',\n\t'San Gwann',\n\t'Soalala',\n\t'Soweto',\n\t'Pachor',\n\t'Naugachhia',\n\t'Mount Isa',\n\t'Afmadow',\n\t'Suzukawa',\n\t'Radcliffe',\n\t'Boksburg',\n\t'Hipperholme',\n\t'Harim',\n\t'Chinnampalaiyam',\n\t'Tilari',\n\t'Giporlos',\n\t'Perleberg',\n\t'Bankya',\n\t'Capua',\n\t'Lilio',\n\t'Qinzhou',\n\t'Aratuipe',\n\t'Itaborai',\n\t'Oldebroek',\n\t'Tibbar',\n\t'Douar Ain Chkef',\n\t'Nueva Tolten',\n\t'Tetela de Ocampo',\n\t'Denby Dale',\n\t'Viareggio',\n\t'Gangadhar',\n\t'Durgapur',\n\t'Arcahaie',\n\t'Kupiansk',\n\t'Achhnera',\n\t'Cherupazhasshi',\n\t'Benalla',\n\t'Labhgaon',\n\t'Bou Fekrane',\n\t'Chahbounia',\n\t'Middlebury',\n\t'Wallerfangen',\n\t'Fribourg',\n\t'Chilly-Mazarin',\n\t'Tibu',\n\t'Wachtersbach',\n\t'Valparaiso',\n\t'Vettavalam',\n\t'Zamania',\n\t'Farmers Branch',\n\t'Neqab',\n\t'Ayinikkad',\n\t'Messkirch',\n\t'Nagamangala',\n\t'Joinvile',\n\t\"M'diq\",\n\t'Schwaigern',\n\t'Ban Bang Phun',\n\t'Xudat',\n\t'Silay',\n\t'Thikriwala',\n\t'Lake Wylie',\n\t'Doukombo',\n\t'Tual',\n\t'Phu Quoc',\n\t'Huludao',\n\t'Jabonga',\n\t'Uetze',\n\t'San Mauro Pascoli',\n\t'Sao Desiderio',\n\t'Brignais',\n\t'Rancho Cordova',\n\t'Pelezi',\n\t'Sangota',\n\t'Ikhlaspur',\n\t'Guaratuba',\n\t'Mibu',\n\t'Arris',\n\t'Lysander',\n\t'Kameda-honcho',\n\t'Mzuzu',\n\t'Shibukawa',\n\t'Dongyuya',\n\t'Allahpur',\n\t'Harrodsburg',\n\t'Brig-Glis',\n\t'Villa San Giovanni',\n\t'Zhangaozen',\n\t'Alabang',\n\t'Saint-Jacques-de-la-Lande',\n\t'Rampur Rajwa',\n\t'Te Anau',\n\t'Ashwaraopeta',\n\t'Fridley',\n\t'Hukou',\n\t'Yerere',\n\t'Itajuipe',\n\t'Toda Rai Singh',\n\t'Oconomowoc',\n\t'Hudiksvall',\n\t'Ploiesti',\n\t'Camilo Ponce Enriquez',\n\t'Aheqi',\n\t'Povoa de Santa Iria',\n\t'Salaspils',\n\t'Marti',\n\t'Heswall',\n\t'Barcelos',\n\t'Axim',\n\t'Datoda',\n\t'Kandra',\n\t'Montreuil',\n\t'Lakhnadon',\n\t'Tarnok',\n\t'Brades',\n\t'Sabana Yegua',\n\t'Ed Daein',\n\t'Mchinji',\n\t'Jaral del Progreso',\n\t'Bouskoura',\n\t'Gradignan',\n\t'Norresundby',\n\t'Bairagnia',\n\t'Chai Prakan',\n\t'Cocos',\n\t'Mwingi',\n\t'Lucao',\n\t'Matauna',\n\t'Pihani',\n\t'Taishan',\n\t'Mocamedes',\n\t'Didieni',\n\t'Ankiabe-Salohy',\n\t'Dammapeta',\n\t\"La'tamna\",\n\t'Upi',\n\t'Annakunnu',\n\t'Iizuka',\n\t'Pattani',\n\t'Qiqihar',\n\t'Maharlika Village',\n\t'Harborne',\n\t'Chamusca',\n\t'Nanshuicun',\n\t'Milledgeville',\n\t'Seven Pagodas',\n\t'Semirom',\n\t'Candiba',\n\t'Antofagasta',\n\t'Tayug',\n\t'Konobougou',\n\t'Profesor Salvador Mazza',\n\t'Perry Heights',\n\t'Charouine',\n\t'Unterschleissheim',\n\t'Kyzyl-Kyya',\n\t'Hadjout',\n\t'Zhailuo',\n\t'Bobigny',\n\t'Champs-Sur-Marne',\n\t'Amatan',\n\t'Tadmait',\n\t'Zao',\n\t'Temperance',\n\t'Grenaa',\n\t'Zebala',\n\t'Steynsrus',\n\t'Buka',\n\t'Itapororoca',\n\t'Maranchi',\n\t'Sikandra Rao',\n\t'Neftcala',\n\t'Nguekhokh',\n\t'Pawtucket',\n\t'Mechanicsburg',\n\t'Mold',\n\t'Tipitapa',\n\t'Gobindgarh',\n\t'Bemanevika',\n\t'Sureshjan',\n\t'Abomey-Calavi',\n\t'Caracuaro',\n\t'Vohimarina',\n\t'Didim',\n\t'Getulio Vargas',\n\t'Hoogvliet',\n\t'Denton',\n\t'Rodgau',\n\t'Abbiategrasso',\n\t'Oum Drou',\n\t'Sagwara',\n\t'Huetor-Tajar',\n\t'Canovellas',\n\t'Calan',\n\t'Droitwich',\n\t'Gradacac',\n\t'Czechowice-Dziedzice',\n\t'Newton in Makerfield',\n\t'Zabreh',\n\t'Otavi',\n\t'Molina',\n\t'Duncanville',\n\t'Kumaramputtur',\n\t'Visnagar',\n\t'Ichikawa',\n\t'Shiojiri',\n\t'Trinity',\n\t'Shchuchinsk',\n\t'Kemberg',\n\t'Isla',\n\t'Bedele',\n\t'Cocorna',\n\t'Pozo Colorado',\n\t'Motobu',\n\t'Rodinghausen',\n\t'Osterhofen',\n\t'Beckwith',\n\t'Yafran',\n\t'Buguey',\n\t'Hawkesbury',\n\t'Seria',\n\t'New London',\n\t'Agia Varvara',\n\t'Talisayan',\n\t'Pothuhera',\n\t'Tiruppuvanam',\n\t'Koumpentoum',\n\t'Sesquile',\n\t'Freehold',\n\t'El Haouaria',\n\t'Tall Rif`at',\n\t'Nova Timboteua',\n\t'Novi Iskar',\n\t'Choghadak',\n\t'Trinitapoli',\n\t'Orimattila',\n\t'Mussoorie',\n\t'Kozan',\n\t'Mahatsinjo',\n\t'Guajiquiro',\n\t'Bear',\n\t'Zhoushan',\n\t'Safford',\n\t'M.A. Rasulzada',\n\t'Kalaun',\n\t'Grijo',\n\t'San Cristobal Totonicapan',\n\t'Marbach am Neckar',\n\t'Panukulan',\n\t'Salcininkai',\n\t'Neptune',\n\t'Cerro de Pasco',\n\t'Pisac',\n\t'Puttankulam',\n\t'Vordingborg',\n\t'Coto de Caza',\n\t'Ahumada',\n\t'Angicos',\n\t'Jeonju',\n\t'Detroit',\n\t'La Gi',\n\t'Puerto Ayacucho',\n\t'La Reja',\n\t'Mymensingh',\n\t'Bondy',\n\t'Altoona',\n\t'Loberia',\n\t'Novooleksiivka',\n\t'Vriddhachalam',\n\t'Tirumalaippatti',\n\t'Kontcha',\n\t'Chennai',\n\t'Nagykata',\n\t'Havre de Grace',\n\t'Jimani',\n\t'Beaune',\n\t'Montornes del Valles',\n\t'Dothan',\n\t'Saiki',\n\t'Indaial',\n\t'Nantwich',\n\t'Foshan',\n\t'Abu Hamad',\n\t'Prilly',\n\t'Chelora',\n\t'Santa Isabel Ishuatan',\n\t'Urpaar',\n\t'Highfields',\n\t'Choix',\n\t'Poway',\n\t'Ormeau',\n\t'Pulivalam',\n\t'Maruim',\n\t'Minobu',\n\t'Circleville',\n\t'Noksan',\n\t'Almada',\n\t'Sali',\n\t'New Brunswick',\n\t'Ottapparai',\n\t'Sadabe',\n\t'Tomi',\n\t'Ramanayakkanpalaiyam',\n\t'Golpazari',\n\t'Grunheide',\n\t'Punalur',\n\t'Essex Junction',\n\t\"Ibra'\",\n\t'Balupur',\n\t'Collegno',\n\t'Gzira',\n\t'Santa Cruz',\n\t'Les Irois',\n\t'Lobos',\n\t'Slubice',\n\t'Ichinohe',\n\t'Phonsavan',\n\t'Had Oulad Issa',\n\t'Diffun',\n\t'Cuijk',\n\t'Algete',\n\t'Laascaanood',\n\t'Sayo',\n\t'Sayada',\n\t'Xonqa',\n\t'Numan',\n\t'Benetuser',\n\t'Ilaka Atsinanana',\n\t'Debno',\n\t'Nagtipunan',\n\t'Chegutu',\n\t'Yabu',\n\t'Maskanah',\n\t'Tiruvankod',\n\t'Japaratinga',\n\t'Horodok',\n\t'Maevatanana',\n\t'Lanester',\n\t'Jequitinhonha',\n\t'Gibraltar',\n\t'Acqui Terme',\n\t'Acasusso',\n\t'Cumberland',\n\t'Yildizeli',\n\t'Coronel Bogado',\n\t'Daruvar',\n\t'Dupax del Sur',\n\t'Gharb',\n\t'Becerril',\n\t'Peachtree City',\n\t'Najrij',\n\t'Pabna',\n\t'Millstone',\n\t'Blidet Amor',\n\t'Kayapa',\n\t'Progress',\n\t'San Pedro del Pinatar',\n\t'Ambakireny',\n\t'Afranio',\n\t'Salangaippalaiyam',\n\t'Cupira',\n\t'Elmas',\n\t'Taunton',\n\t'Bianyang',\n\t'Piracaia',\n\t'Pudsey',\n\t'Qiryat Ata',\n\t'Lusaka',\n\t'Carterton',\n\t'Robbinsville',\n\t'Namorona',\n\t'Vicam Pueblo',\n\t'Baytown',\n\t'Kapfenberg',\n\t'Makoua',\n\t'Sobral de Monte Agraco',\n\t'Belek',\n\t'Rio de Oro',\n\t'Biga',\n\t'Shiliguri',\n\t'Agdas',\n\t'Bougara',\n\t'Mit Damsis',\n\t'Alto Alegre dos Parecis',\n\t'Cantillana',\n\t'Waldfeucht',\n\t'Urcos',\n\t'Kishanpura Kalan',\n\t'Buchloe',\n\t'Suffolk',\n\t'Gummersbach',\n\t'Khandhar',\n\t'Coracora',\n\t'Mpondwe',\n\t'Lalin',\n\t'Xiulin',\n\t'Chanwari',\n\t'Kumba',\n\t'Aware',\n\t'Colgong',\n\t'Zeven',\n\t'Mariano Comense',\n\t'Campos Lindos',\n\t'Diu',\n\t'Aligarh',\n\t'Nova Pazova',\n\t'Barhni',\n\t'Djibo',\n\t'Soddy-Daisy',\n\t'Seneffe',\n\t'Tarn Taran',\n\t'Dragasani',\n\t'Bannewitz',\n\t'Badagabettu',\n\t'Angichettippalaiyam',\n\t'Heroica Nogales',\n\t'Osecina',\n\t'Kuhsan',\n\t'Grimstad',\n\t'Tufanbeyli',\n\t'Sweetwater',\n\t'Chandur',\n\t'Novyi Buh',\n\t'Alzey',\n\t'Telsiai',\n\t'Purwokerto',\n\t'Tarakeswar',\n\t'Slupca',\n\t'Malone',\n\t'Nowrangapur',\n\t'Khorol',\n\t'Gudofredo Viana',\n\t'Od',\n\t'Tavriisk',\n\t'Shakhtarsk',\n\t'Silago',\n\t'Muskego',\n\t'Kartarpur',\n\t'Shofirkon Shahri',\n\t'Zhangjiakou Shi Xuanhua Qu',\n\t'Lloyd',\n\t'Togane',\n\t'Minabe',\n\t'Paloma Creek South',\n\t'Koelwar',\n\t'Takestan',\n\t'Cotorra',\n\t'Lugang',\n\t'Osaki',\n\t'Adiyakkamangalam',\n\t'Fatipura',\n\t'Jiaoxiyakou',\n\t'Lakkireddipalle',\n\t'Calamar',\n\t'Eastbourne',\n\t'Manlleu',\n\t'Santo Andre',\n\t'Glowno',\n\t'Ozorkow',\n\t'Herzliyya',\n\t'Zaladanki',\n\t'Druzhkivka',\n\t'Naron',\n\t'Nasim Shahr',\n\t'Penicuik',\n\t'Kamianets-Podilskyi',\n\t'Rezzato',\n\t'Wandlitz',\n\t'Eufaula',\n\t'El Hamma',\n\t'Kattirippulam',\n\t'Tafo',\n\t'Bad Sassendorf',\n\t'Tuticorin',\n\t'Venado Tuerto',\n\t'Kanasanapalle',\n\t'Paulistana',\n\t'Tauberbischofsheim',\n\t'Mino',\n\t'Bapaura',\n\t'Lao Cai',\n\t'Winchendon',\n\t'Akyazi',\n\t'Baclayon',\n\t'Radhanpur',\n\t'Inkerman',\n\t'Donsol',\n\t'Vila Real de Santo Antonio',\n\t'Bottrop',\n\t'South Orange Village',\n\t'Grezzana',\n\t'Konkavaripalle',\n\t'Nybro',\n\t'Dharmastala',\n\t'Waldbrol',\n\t'Shimomura',\n\t'Hangal',\n\t'Ribeirao das Neves',\n\t'Hachirud',\n\t'Asmara',\n\t'Mercogliano',\n\t'Isparta',\n\t'Choshi',\n\t'Rosetta',\n\t'Shimotsuma',\n\t'Souagui',\n\t'Nishigo',\n\t'Duitama',\n\t'Salkhad',\n\t'Tenares',\n\t'Paita',\n\t'Zephyrhills',\n\t'Nacaome',\n\t'Lezignan-Corbieres',\n\t'Moncks Corner',\n\t'Maracena',\n\t'Gutao',\n\t'Coseley',\n\t'Susurluk',\n\t'Hoofddorp',\n\t'Taufkirchen',\n\t'Lebork',\n\t'West Bridgford',\n\t'Roda',\n\t'Laatatra',\n\t'Sin-le-Noble',\n\t'Lake Morton-Berrydale',\n\t'Junik',\n\t'Gorey',\n\t'Ferrara',\n\t'Falla',\n\t'Atotonilco el Grande',\n\t'Barnala',\n\t'Port Chester',\n\t'Rutland',\n\t'Gistel',\n\t'Palestina de los Altos',\n\t'Manujan',\n\t'Koja',\n\t'Vitre',\n\t'Antsambalahy',\n\t'Ewo',\n\t'Silivri',\n\t'Nitte',\n\t'Riyadh',\n\t'Ginir',\n\t'Figueras',\n\t'Porvoo',\n\t'Belamoty',\n\t'Vista Hermosa de Negrete',\n\t'Heysham',\n\t'Laoac East',\n\t'Ad Dammam',\n\t'Chisinau',\n\t'Lanus',\n\t'Lockport',\n\t'Powder Springs',\n\t'Panamarattuppatti',\n\t'Bisingen',\n\t'Cotacachi',\n\t'Bayanan',\n\t'Ozoir-la-Ferriere',\n\t'Ouyen',\n\t'Kuttuparamba',\n\t'Velimese',\n\t'Nabeul',\n\t'Anisio de Abreu',\n\t'Uozu',\n\t'Cumaribo',\n\t'Bhadravati',\n\t'Kuroshio',\n\t\"Barano d'Ischia\",\n\t\"Qian'an\",\n\t'Oulmes',\n\t'Bethulie',\n\t'Tebessa',\n\t'Columbia City',\n\t'Kalvarpatti',\n\t'Nesconset',\n\t'Quilali',\n\t'Uddevalla',\n\t'Teplice',\n\t'Pindobacu',\n\t'Xihu',\n\t'Altonia',\n\t'Asudapuram',\n\t'North Fayette',\n\t'Konstantynow Lodzki',\n\t'Castellanza',\n\t'Penalolen',\n\t'Zimatlan de Alvarez',\n\t'Minad',\n\t'Martellago',\n\t'Chitral',\n\t'Yumbo',\n\t'Dunajska Streda',\n\t'Didy',\n\t'Horquetas',\n\t'Pinas',\n\t'Farragut',\n\t'Castro Alves',\n\t'Saatli',\n\t'Naranapuram',\n\t'Pine Castle',\n\t'Penzberg',\n\t'Fomeque',\n\t'Goodmayes',\n\t'Aru',\n\t'Dobrovo',\n\t'Martinez de la Torre',\n\t'West Glens Falls',\n\t'Vaddadi',\n\t'Barra da Estiva',\n\t'Whitefield',\n\t'Milford city',\n\t'Guarulhos',\n\t'Fangchenggang',\n\t'Edwardsville',\n\t'Broussard',\n\t'Lieto',\n\t'Quimili',\n\t'Kaiyun',\n\t'Mocha',\n\t'Volkach',\n\t'Vazante',\n\t'Thu Duc',\n\t'Penapolis',\n\t'Nanchital de Lazaro Cardenas del Rio',\n\t'Phayao',\n\t'Talwat',\n\t'Tineo',\n\t'Opwijk',\n\t'Diabali',\n\t'Andranovorivato',\n\t'Huron East',\n\t'Poirino',\n\t'Juquitiba',\n\t'Tizi Gheniff',\n\t'Rudolstadt',\n\t'Kozhinjampara',\n\t'Huangyoutang',\n\t'Triel-sur-Seine',\n\t'Bordj el Kiffan',\n\t'Unwana',\n\t'Vanthli',\n\t'Gramado',\n\t'Ogawara',\n\t'Arbatache',\n\t'Mubende',\n\t'Itaperuna',\n\t'Beccles',\n\t'Balabagan',\n\t'Jeomchon',\n\t'Fountain Inn',\n\t'Passaic',\n\t'Apaxco de Ocampo',\n\t'Bhairi',\n\t'Kalayapuram',\n\t'Tlahualilo de Zaragoza',\n\t'Mangasamudram',\n\t'Kvivik',\n\t'Arnstadt',\n\t'South Lebanon',\n\t'Vinnytsia',\n\t'Bhimbar',\n\t'Panakkudi',\n\t'Paraisopolis',\n\t'Deux-Montagnes',\n\t'Antarvedipalem',\n\t'Pushing',\n\t'Ichinomiya',\n\t'Padre Bernardo',\n\t'Jiblah',\n\t'Bestwig',\n\t'Tuba',\n\t'Porto Amboim',\n\t'Gonohe',\n\t'Caernarfon',\n\t'Oostakker',\n\t'Ataq',\n\t'General Panfilo Natera',\n\t'Sabratah',\n\t'Andira',\n\t'Ichtegem',\n\t'Coban',\n\t'Sangli',\n\t'Balhapur',\n\t'Narayanraopet',\n\t'Paimio',\n\t'Alvorada do Sul',\n\t'El Transito',\n\t'Tonk',\n\t'Methil',\n\t'Ban Phonla Krang',\n\t'Arac',\n\t'Selydove',\n\t'Pecinci',\n\t'Benidorm',\n\t'Binkolo',\n\t'Kailaras',\n\t'Quibdo',\n\t'Nieuw Nickerie',\n\t'Magstadt',\n\t'Bhirua',\n\t'Pallipalaiyam',\n\t'Ampasimatera',\n\t'Vila do Conde',\n\t'Fariman',\n\t'Darihat',\n\t'Jurong',\n\t'Zurrieq',\n\t'Oschatz',\n\t'Godella',\n\t'Martano',\n\t'Wuhu',\n\t'Gafanha da Nazare',\n\t'Elsmere',\n\t'Malior',\n\t'Sidi el Mokhfi',\n\t'Mingxing',\n\t'Elsen',\n\t'Zinvie',\n\t'Orange',\n\t'Rakovnik',\n\t'Courcouronnes',\n\t'Eregli',\n\t'Shengaocun',\n\t'Badkulla',\n\t'Zile',\n\t'North Highlands',\n\t'Bhubaneshwar',\n\t'Deurne',\n\t'Bassano del Grappa',\n\t'Paonta Sahib',\n\t'Chapantongo',\n\t'Samannud',\n\t'Narayanpet',\n\t'Chintapalle',\n\t'Myslenice',\n\t'Pama',\n\t'Pedro II',\n\t'Imperial',\n\t'Tuvagudi',\n\t'Erftstadt',\n\t'Ningbo',\n\t'Burglengenfeld',\n\t'Coatepec',\n\t'Horr-e Riahi',\n\t'Duayaw-Nkwanta',\n\t'Unchagao',\n\t'Sayram',\n\t'Herouville-Saint-Clair',\n\t'Nurhak',\n\t'Joniskis',\n\t'Fish Town',\n\t\"Vranov nad Topl'ou\",\n\t'Thief River Falls',\n\t'North Miami',\n\t'Szarvas',\n\t'Poing',\n\t'Xanxere',\n\t'Bulolo',\n\t'Tin Shui Wai',\n\t'Auriol',\n\t'La Calera',\n\t'Mannachchanellur',\n\t'San Miguelito',\n\t'Harsefeld',\n\t'Zdunska Wola',\n\t'Hellin',\n\t'Tours',\n\t'Uryzhar',\n\t'Villebon-sur-Yvette',\n\t\"'Ain Kihal\",\n\t'Ocean Acres',\n\t'Paranagua',\n\t'Coaraci',\n\t'Saaminki',\n\t'Ullur',\n\t'Muttatodi',\n\t'Abashiri',\n\t'Tadikalapudi',\n\t'Mahin',\n\t'Duderstadt',\n\t'Utazu',\n\t'Oleiros',\n\t'Bolekhiv',\n\t'Beuvry',\n\t'Ilagan',\n\t'Lakhipur',\n\t'Tepotzotlan',\n\t'Vallendar',\n\t'Quimavango',\n\t'Cobh',\n\t'Ayutla',\n\t'Pau',\n\t'Ngong',\n\t'Doorn',\n\t'Libenge',\n\t'Bin-Houye',\n\t'Shahr-e Kord',\n\t'Santiago de Maria',\n\t'Sabya',\n\t'Sunninghill',\n\t'Alhama de Murcia',\n\t'Usakos',\n\t'Boke',\n\t'Ingichka',\n\t'Montgomery Village',\n\t'Almonte',\n\t'Campagnano di Roma',\n\t'Akbou',\n\t'Andaingo Gara',\n\t'Herzberg',\n\t'Sande',\n\t'Aracataca',\n\t'Dipaculao',\n\t'La Celle-Saint-Cloud',\n\t'Soja',\n\t'Semari',\n\t'Bareilly',\n\t'Mahna',\n\t'Wandsworth',\n\t'Danwan',\n\t'Manganam',\n\t'Dinant',\n\t'Delran',\n\t'Shangzhen',\n\t'Mallampalli',\n\t'Czluchow',\n\t'San Borja',\n\t'Sanya',\n\t'Galion',\n\t'Tinchlik',\n\t'Show Low',\n\t'Mbouda',\n\t'Hong Kong',\n\t'Cedar Hill',\n\t'Baraawe',\n\t'Rabaul',\n\t'Matsukawa',\n\t'Farum',\n\t'Jishi',\n\t'Rush',\n\t'Ubay',\n\t'Schleusingen',\n\t'Hengken',\n\t'Pawai',\n\t'Margherita di Savoia',\n\t'Togba',\n\t'Faradabad',\n\t'Soron',\n\t'Ban Tha Mai I',\n\t'Santa Marta de Tormes',\n\t'Llantrisant',\n\t'Huauchinango',\n\t'Darmaha',\n\t'Hadano',\n\t'Porto Real',\n\t'Pakri',\n\t\"N'Djamena\",\n\t'Skuvoy',\n\t'Novopokrovka',\n\t'Dighirpar',\n\t'Summerside',\n\t'Young',\n\t'Campagna',\n\t'Chavuttahalli',\n\t'Malalbergo',\n\t'San Victor Abajo',\n\t'Robertsganj',\n\t'Toubakoro',\n\t'Namakadu',\n\t'Clayton',\n\t'Xalqobod',\n\t'Moerdijk',\n\t'Bergerac',\n\t'Linxi',\n\t'La Barca',\n\t'Hopewell',\n\t'Riverview',\n\t'Nanfang',\n\t'Garwolin',\n\t'Gannan',\n\t'Cowell',\n\t'Zhongguyue',\n\t'Cacapava do Sul',\n\t'Fenyang',\n\t'Chimore',\n\t'Bahadurganj',\n\t'Dantewara',\n\t'San Feliu de Guixols',\n\t'Puente-Genil',\n\t'Basmanpur',\n\t'Baar',\n\t'Chinautla',\n\t'Iriga City',\n\t'Gonglang',\n\t'Pecs',\n\t'La Paz Centro',\n\t'Lienz',\n\t'Japaratuba',\n\t'Chiba',\n\t'Havlickuv Brod',\n\t'Ranchos',\n\t'Corning',\n\t'Zinder',\n\t'Sankt Gallen',\n\t'Al Lith',\n\t'Kaminoyama',\n\t'Morarano',\n\t'Sokyriany',\n\t'Untergruppenbach',\n\t'Makapanstad',\n\t'Hullahalli',\n\t'Empoli',\n\t'Melton',\n\t'Abiramam',\n\t'Villapinzon',\n\t'Le Vesinet',\n\t'Den Chai',\n\t'Khasab',\n\t'General Deheza',\n\t'Rideau Lakes',\n\t'Banora Point',\n\t'Dillenburg',\n\t'Acarape',\n\t'Olympia',\n\t'Zilina',\n\t'Chuarrancho',\n\t'Jaipur Chuhar',\n\t'Scaggsville',\n\t'Bat Khela',\n\t'Villa Jaragua',\n\t'Oosterzele',\n\t'La Banda',\n\t'West Pensacola',\n\t'Cleckheaton',\n\t'Gizo',\n\t'Guaimaca',\n\t'Chalkida',\n\t'Namegata',\n\t'Shibam',\n\t'Duekoue',\n\t'Bir Anzarane',\n\t'Sidi Yahia',\n\t'Port Hedland',\n\t'Cisterna di Latina',\n\t'Dolo',\n\t'Castro Daire',\n\t'Kolattur',\n\t'Hachioji',\n\t'Sakti',\n\t'Stanford',\n\t'Asakapalle',\n\t'Mazhang',\n\t'Claypole',\n\t'Sokal',\n\t'Byureghavan',\n\t'Ghasri',\n\t'Harbin',\n\t'Renqiu',\n\t'Bhaur',\n\t'Canillo',\n\t'Capellen',\n\t'Kenton',\n\t'Balasamudram',\n\t'Sondershausen',\n\t'Coburg',\n\t'Makrana',\n\t'Zvishavane',\n\t'Petapa',\n\t'Piparia',\n\t'Kiamba',\n\t'Meyerton',\n\t'Yi Xian',\n\t'Tewkesbury',\n\t'Menomonee Falls',\n\t'Wilkinsburg',\n\t'Cildir',\n\t'Sao Mateus do Maranhao',\n\t'Belleville',\n\t'Sandefjord',\n\t'Santa Branca',\n\t'Hinckley',\n\t'Tomblaine',\n\t'Chizhou',\n\t'Hardenberg',\n\t'Victor Harbor',\n\t'Broadlands',\n\t'Iskourane',\n\t'Yuanli',\n\t'Erattukulakkada',\n\t'Selcuklu',\n\t'Colesville',\n\t'Port Hope',\n\t'Sidi Amer El Hadi',\n\t'Bowringpet',\n\t'Kalpakathukonam',\n\t'Adonara',\n\t'Mesquite',\n\t'Papara',\n\t'Karambakkudi',\n\t'El Aguila',\n\t'West Derby',\n\t'Bhanvad',\n\t'Borj el Qoble',\n\t'Kamikita-kita',\n\t'Rio Pardo de Minas',\n\t'Paso Canoas',\n\t'Holalu',\n\t'Owani',\n\t'Katoya',\n\t'Semdinli',\n\t'Manaratsandry',\n\t'San Martin Texmelucan de Labastida',\n\t'Palo',\n\t'Vestavia Hills',\n\t'Deogarh',\n\t'San Juan del Cesar',\n\t'Teorama',\n\t'Secaucus',\n\t'Tepecoyo',\n\t'Kadur',\n\t'Belampona',\n\t'Ghattu',\n\t'Sao Jose do Calcado',\n\t'Shinto',\n\t'Al Hibah',\n\t'Gateway',\n\t'Werdohl',\n\t'Lenzburg',\n\t'Gjilan',\n\t'Zory',\n\t'Vodurivandlagudem',\n\t'Hoddesdon',\n\t'Rawmarsh',\n\t'Yajalon',\n\t'Taisheng',\n\t'Kizhattur',\n\t'Yongcong',\n\t'Macomer',\n\t'Iwamizawa',\n\t'Bail-Hongal',\n\t'Maglod',\n\t'Jauja',\n\t'Kadiyadda',\n\t'Tiruvengadam',\n\t'Alovera',\n\t'Sao Goncalo do Rio Abaixo',\n\t'Velike Lasce',\n\t'Foxborough',\n\t'Collo',\n\t'Cincinnati',\n\t'Manambolo',\n\t'Rugeley',\n\t'Kulob',\n\t'Saparua',\n\t'Plympton',\n\t'Malekan',\n\t'Calheta',\n\t'Kalanak',\n\t'Sines',\n\t'San Ignacio Cohuirimpo',\n\t'Grottaferrata',\n\t'Skhira',\n\t'Harker Heights',\n\t'El Nido',\n\t'Morangis',\n\t'Belp',\n\t'Estremoz',\n\t'Baft',\n\t'State College',\n\t'Likak',\n\t'Kanjiza',\n\t'Schwabmunchen',\n\t'Adzope',\n\t'Balamban',\n\t'Yaojiafen',\n\t'Klosterneuburg',\n\t'Coracao de Jesus',\n\t'Pereshchepyne',\n\t'Dayr Abu Sa`id',\n\t'Tofol',\n\t'Vasad',\n\t'Rychnov nad Kneznou',\n\t'Sontha',\n\t'Mandza',\n\t'Jatibonico',\n\t'North Whitehall',\n\t'Ringnod',\n\t'Palamel',\n\t'Pampa',\n\t'Ahrensfelde',\n\t'Barwat Pasrain',\n\t'Haider Khel',\n\t'Zuera',\n\t'Yampil',\n\t'Wyoming',\n\t'El Outaya',\n\t'Kikinda',\n\t'Zefat',\n\t'Naganuma',\n\t'Chingford',\n\t'Weisswasser/Oberlausitz',\n\t'Stockton',\n\t'Tournefeuille',\n\t'Wolfenbuttel',\n\t'Kieta',\n\t'Manambaro',\n\t'Abejorral',\n\t'Tchitato',\n\t'Horsforth',\n\t'Kunithala',\n\t'Yesilhisar',\n\t'Gulshan',\n\t'Sanuki',\n\t'Laanoussar',\n\t'Kerouane',\n\t'Huaycan',\n\t'Curtorim',\n\t'Tamallalt',\n\t'Coronado',\n\t'Mata Verde',\n\t'Charenton-le-Pont',\n\t'Tamri',\n\t'Villiersdorp',\n\t'Miorimivalana',\n\t\"Ain M'Lila\",\n\t'Siruvachchur',\n\t'Valdez',\n\t'Bou Arfa',\n\t'Bonifacio',\n\t'Valpoy',\n\t'Jun Bel',\n\t'Northcote',\n\t'Macenta',\n\t'Guira de Melena',\n\t'Moranha',\n\t\"Jem'at Oulad 'Abbou\",\n\t'Upminster',\n\t'Bulawayo',\n\t'Laguna',\n\t'Adria',\n\t'Qatlupur',\n\t'Rumphi',\n\t'Omaezaki',\n\t'Ksar El Kebir',\n\t'Cruzeiro',\n\t'Semic',\n\t'Moparipalaiyam',\n\t'Quanzhou',\n\t'Wisil',\n\t'Meadow Lakes',\n\t'Qrendi',\n\t'Ang Thong',\n\t'Nandi Hills',\n\t'Grayslake',\n\t'Teguise',\n\t'Kakunodatemachi',\n\t'Marupe',\n\t'Mayen',\n\t'Miguel Alves',\n\t'Karnal',\n\t'Owings Mills',\n\t'Lewe',\n\t'Dyykan-Kyshtak',\n\t'Kentville',\n\t'Ilijas',\n\t'San Pedro de Coche',\n\t'Yermal',\n\t'Zipaquira',\n\t'Linganaboyinacherla',\n\t'Es Sebt',\n\t'Luisiana',\n\t'Tamahu',\n\t'Kudowa-Zdroj',\n\t'Susice',\n\t'Saucillo',\n\t'Castelletto sopra Ticino',\n\t'Repentigny',\n\t'Manganj',\n\t'Algemesi',\n\t'Methuen Town',\n\t'Reota',\n\t'Aiyampuzha',\n\t'Nisia Floresta',\n\t'Tukwila',\n\t'Cayey',\n\t'Phu Tho',\n\t'Pishin',\n\t'Manuel B. Gonnet',\n\t'Moguer',\n\t'Petit-Goave',\n\t'Oulad Salmane',\n\t'Kadikoy',\n\t'Cocoa Beach',\n\t\"Bulung'ur Shahri\",\n\t'Ambalavato',\n\t'Qal`eh Ganj',\n\t'Quierschied',\n\t'Barrow in Furness',\n\t'Beifan',\n\t'Cubulco',\n\t'Hallbergmoos',\n\t'Porcari',\n\t'Kombolcha',\n\t'Kirkagac',\n\t'Cacule',\n\t'Daraga',\n\t'Qandala',\n\t'Bagaha',\n\t'Isoanala',\n\t'Baulia',\n\t'Boultham',\n\t'Samundri',\n\t'Amangal',\n\t'Perambalur',\n\t'Gose',\n\t'San Pedro La Laguna',\n\t'Mahendragarh',\n\t'Offenburg',\n\t'Sagae',\n\t'Uttamapalaiyam',\n\t'Lesquin',\n\t'Novohrad-Volynskyi',\n\t'Takab',\n\t'Shahmirpet',\n\t'Dom Basilio',\n\t'Witten',\n\t'Lavandevil',\n\t'Katowice',\n\t'Valavakattumula',\n\t'Mel Seval',\n\t'Santa Catarina Otzolotepec',\n\t'Engenheiro Paulo de Frontin',\n\t'Alta',\n\t'Uran',\n\t'Santo Tirso',\n\t'Hochstadt an der Aisch',\n\t'Texistepeque',\n\t'Stevens Point',\n\t'Karadipara',\n\t'Diafarabe',\n\t'Travnik',\n\t'Sibi',\n\t'Bichkunda',\n\t'Tarpon Springs',\n\t'Cuicatlan',\n\t'Bealanana',\n\t'Nalhati',\n\t'Surak',\n\t'Kurumbalur',\n\t'Whangarei',\n\t'Hatten',\n\t'Valrico',\n\t'Johnstone',\n\t'Enterprise',\n\t'Olutanga',\n\t'Aguelhok',\n\t'Mezdra',\n\t'Tanghin-Dassouri',\n\t'Kamien Pomorski',\n\t'Santo Domingo Tehuantepec',\n\t'Ap Phu My',\n\t'Stamboliyski',\n\t'Kilis',\n\t'Ho Nai',\n\t'Taree',\n\t'Teulada',\n\t'Virac',\n\t'Vigia',\n\t'Shahrak-e Pars',\n\t'Zhengzhou',\n\t'Vikarabad',\n\t'Liubotyn',\n\t'Tremonton',\n\t'Tirmitine',\n\t'Genas',\n\t'Evato',\n\t'Pisa',\n\t'Kathua',\n\t'El Bordo',\n\t'Surin',\n\t'Bariri',\n\t'Trelaze',\n\t'Thatto Heath',\n\t'Takon',\n\t'Praya',\n\t'Baoding',\n\t'Nakashunbetsu',\n\t'Eloy',\n\t'Sao Miguel de Touros',\n\t'Moulay Driss Zerhoun',\n\t'El Pinar',\n\t'Mongomo',\n\t'Andranovelona',\n\t'Malbork',\n\t'Soatanana',\n\t'Hillerod',\n\t'Cape Elizabeth',\n\t'Tirwa',\n\t'Salatiga',\n\t'Roncaglia',\n\t'Selu',\n\t'Borgo Maggiore',\n\t'Shelbyville',\n\t'Bandar-e `Asaluyeh',\n\t'Ferizaj',\n\t'Ufeyn',\n\t'Devanhalli',\n\t'Akyurt',\n\t'Jawalgeri',\n\t'Cambita Garabitos',\n\t'Manalapan',\n\t'Surendranagar',\n\t'Tadinada',\n\t'Heumen',\n\t'Inzago',\n\t'Bulach',\n\t'Tinipuka',\n\t'Manohisoa',\n\t'Leisure City',\n\t'Hilvan',\n\t'La Estrella',\n\t'Vulcan',\n\t'Wallan',\n\t'Ramareddi',\n\t'Gava',\n\t'Beroy Atsimo',\n\t'Huejotzingo',\n\t'Tucupita',\n\t'Ouled Beni Messous',\n\t'Bedzin',\n\t'Bidston',\n\t'Marilandia do Sul',\n\t'Sechelt',\n\t'Beernem',\n\t'Palwal',\n\t'Puerto Iguazu',\n\t'Banchpar',\n\t'Targu Ocna',\n\t'Sacile',\n\t'Lajeado',\n\t'Razole',\n\t'Peringalam',\n\t'Cavaillon',\n\t'Panaji',\n\t'Kesennuma',\n\t'Linhai',\n\t'Silvi Paese',\n\t'Bairnsdale',\n\t'Mehidpur',\n\t'Sivrice',\n\t'Waynesville',\n\t'Oulu',\n\t'Mairena del Alcor',\n\t'Omatjete',\n\t'Mokena',\n\t'Awlouz',\n\t'Douar Bni Malek',\n\t'Bonao',\n\t'Al Karak',\n\t'Pitimbu',\n\t'Pandami',\n\t'Monzon',\n\t'Molbergen',\n\t'Sahit',\n\t'Castleford',\n\t'Perungulam',\n\t'Tonekabon',\n\t'Jasdan',\n\t'Dharmajigudem',\n\t'El Cacao',\n\t'Salavan',\n\t'Plato',\n\t'Fontenay-aux-Roses',\n\t'San Luis de La Loma',\n\t'Dinbela',\n\t'Hawthorn Woods',\n\t'Corabia',\n\t'Arboledas',\n\t'Utrecht',\n\t'Douar Lehouifrat',\n\t'Dois Vizinhos',\n\t'Cabo Bojador',\n\t'Amalou',\n\t'Rock Falls',\n\t'Sitebe',\n\t'Vakkam',\n\t'Dasnapur',\n\t'Ankirondro',\n\t'Rajupalem',\n\t'El Cajon',\n\t'Gunbarrel',\n\t'Yulee',\n\t'Chatan',\n\t'Palmer',\n\t'Fronteiras',\n\t'Chicureo Abajo',\n\t'Newberry',\n\t'Severance',\n\t'Sattenapalle',\n\t'Koping',\n\t'Muhlhausen',\n\t'Sylvania',\n\t'San Elizario',\n\t'Hameenkyro',\n\t'Confresa',\n\t'Barbate de Franco',\n\t'Ararangua',\n\t'Boston',\n\t'Frankfurt (Oder)',\n\t'Ganshoren',\n\t'Mehdipur',\n\t'Ambodinonoka',\n\t'Cajari',\n\t'La Primavera',\n\t'Brahmanandapuram',\n\t'Oued Rhiou',\n\t'Polegate',\n\t'Dodoma',\n\t'Mecheraa Asfa',\n\t'Aracas',\n\t'Rushden',\n\t'Korosten',\n\t'Deodora',\n\t'Pell City',\n\t'Beppu',\n\t'Greenburgh',\n\t'Analaiva',\n\t'Haar',\n\t'Cervantes',\n\t'Uelzen',\n\t'Budd Lake',\n\t'Puyang',\n\t'Aladag',\n\t'Hajeb el Aioun',\n\t'Camajuani',\n\t'Savannah',\n\t'Pithapuram',\n\t'Eldersburg',\n\t'San Policarpo',\n\t'Mennecy',\n\t'Ibirapua',\n\t'Gholia Kalan',\n\t'Pickerington',\n\t'Qadsayya',\n\t'Waldniel',\n\t'Bagalur',\n\t'Sao Pedro do Piaui',\n\t'Bar-le-Duc',\n\t'Nakhyaungcharipara',\n\t'Tralee',\n\t'Penukonda',\n\t'Ghosai',\n\t'Pasaquina',\n\t'Gevgelija',\n\t'Chokkampatti',\n\t'Illzach',\n\t'Huadian',\n\t'Baryshivka',\n\t'Siofok',\n\t'Yutan',\n\t'Njombe',\n\t'Khlung',\n\t'Dabouziya',\n\t'Tumpat',\n\t'Tangpingcun',\n\t'Chinna Salem',\n\t'Basaithi',\n\t'Aranguez',\n\t'Marand',\n\t'Tanudan',\n\t\"Bet She'an\",\n\t'Pingxiang',\n\t'Westerlo',\n\t'Jomasho`y',\n\t'Brussels',\n\t'Kempele',\n\t'Kiranomena',\n\t'Porto Esperidiao',\n\t'Padre Burgos',\n\t'Banda del Rio Sali',\n\t'Cortlandt',\n\t'Tepatitlan de Morelos',\n\t'Eau Claire',\n\t'Saint-Constant',\n\t'Schermbeck',\n\t'Cuautitlan',\n\t'Kolnur',\n\t'Ehden',\n\t'Dazhuangzi',\n\t'Pebble Creek',\n\t'Meihekou',\n\t'Qianjiang Shequ',\n\t'Matamoros',\n\t'Calama',\n\t'Stoneham',\n\t'Dassel',\n\t'Khanna',\n\t'Cankaya',\n\t'Palos Hills',\n\t'Elurpatti',\n\t'Kallakkurichchi',\n\t'Monte San Giovanni Campano',\n\t'Orhaneli',\n\t'Bungoono',\n\t'Blankenberge',\n\t'Cordele',\n\t'Kure',\n\t'Bolgatanga',\n\t'Bansalan',\n\t'Race',\n\t'Morales',\n\t'Courcelles',\n\t'Evaz',\n\t'Pantepec',\n\t'Nyirbator',\n\t'Bellegarde-sur-Valserine',\n\t'Barahi',\n\t'Espinosa',\n\t'Fatehgarh',\n\t'Tangcun',\n\t'Brzeziny',\n\t'Pardwal',\n\t'Gonzales',\n\t'San Juan y Martinez',\n\t'Hirriyat Raznah',\n\t'Rokhaty',\n\t'Jiangyin',\n\t'Andahuaylas',\n\t'Pamiers',\n\t'Pinarbasi',\n\t'Rio Vermelho',\n\t'Boca del Rio',\n\t'Timana',\n\t'Cambridge',\n\t'Shancheng',\n\t'San German',\n\t'Mata Roma',\n\t'Compiegne',\n\t'Kadanganeri',\n\t'Argelato',\n\t'Torokszentmiklos',\n\t'Ardesen',\n\t'Cariamanga',\n\t'Korahia',\n\t'Saarwellingen',\n\t'South Abington',\n\t'Balete',\n\t'Fuman',\n\t'Amdel',\n\t'Dedemsvaart',\n\t'Plasencia',\n\t'Sharonville',\n\t'Villamarchante',\n\t'Slobozia',\n\t'Jinji',\n\t'Malak Abad',\n\t'Adakplame',\n\t'Manoke',\n\t'Companiganj',\n\t'Ozu',\n\t'Friedrichshafen',\n\t'Loudi',\n\t'Meerut',\n\t'Sheohar',\n\t'Sanjiang Nongchang',\n\t'Jos',\n\t'Zhangmu Touwei',\n\t'Siuna',\n\t'Clervaux',\n\t'Nocera Inferiore',\n\t'Borvayeh-ye Al Bu `Aziz',\n\t'Uki',\n\t'Humble',\n\t'Valaparla',\n\t'Ajim',\n\t'Kok-Janggak',\n\t'Etropole',\n\t'Idukki',\n\t'Olmue',\n\t'Maracanau',\n\t'Ar Rass',\n\t'Anivorano Avaratra',\n\t'Jonesboro',\n\t'Sanlucar de Barrameda',\n\t'Estahban',\n\t'Sujapur',\n\t'Yilong',\n\t'Ciudad Altamirano',\n\t'Rudnyy',\n\t'Wladyslawowo',\n\t'Hekinan',\n\t'Cittanova',\n\t'Schonebeck',\n\t'Mangalore',\n\t'Pehonko',\n\t'Kacanik',\n\t'Cauquenes',\n\t'Chikni',\n\t'Yongcheng',\n\t'Town and Country',\n\t'Assai',\n\t'Liujiaxia',\n\t'Harwich',\n\t'Attur',\n\t'Ganjam',\n\t'Matar',\n\t'Grovetown',\n\t'Hazro',\n\t'Findlay',\n\t'Lower Merion',\n\t'Hennef',\n\t'Musikot-Khalanga',\n\t'Vinjam',\n\t'Sao Jose',\n\t'Gengenbach',\n\t'Salmon Creek',\n\t'Katoomba',\n\t'Arrapalli',\n\t'Krasnystaw',\n\t'Ban Chang',\n\t\"Tai'an\",\n\t'Manucan',\n\t'Bopolu',\n\t'Tissint',\n\t'Vohimasy',\n\t'Ocana',\n\t'Dickinson',\n\t'Middelkerke',\n\t'Jarajus',\n\t'El Jadid',\n\t'Altinyayla',\n\t'Rongcheng',\n\t'Puthupalli',\n\t'Pedro Afonso',\n\t'Muurame',\n\t'Castro Valley',\n\t'Cookstown',\n\t'Santa Maria das Barreiras',\n\t'Konand',\n\t'Dilbeek',\n\t'Meicheng',\n\t'Hamma Bouziane',\n\t'Rottweil',\n\t'Sao Luis do Curu',\n\t'Dowlatabad',\n\t'South Strabane',\n\t'Schenectady',\n\t'Baihar',\n\t'Blacklick Estates',\n\t'Villa Nougues',\n\t'Al Qurayyat',\n\t'Sao Jose de Mipibu',\n\t'Huddersfield',\n\t'Chibuto',\n\t'Groutville',\n\t'Vert-Saint-Denis',\n\t'Patzicia',\n\t'Kankon',\n\t'La Chaux-de-Fonds',\n\t'Altenbeken',\n\t'Blonie',\n\t'Anda',\n\t'Masterton',\n\t'Wieringerwerf',\n\t'Peruwelz',\n\t'Ilawa',\n\t'Dirba',\n\t'Shankarpalli',\n\t'Longquan',\n\t'Bodippatti',\n\t'Nasukarasuyama',\n\t'Sam',\n\t'Ban Nong Prue',\n\t'Monreale',\n\t'Barreira',\n\t'Hetanpur',\n\t'Shishgarh',\n\t'Tafresh',\n\t'Saltcoats',\n\t'Gopalasamudram',\n\t'Kafr Saqr',\n\t'Espinho',\n\t'Peine',\n\t'Radevormwald',\n\t'Pompano Beach',\n\t'Chavinda',\n\t'Yishi',\n\t'Janauba',\n\t'Ankalgi',\n\t'Pluderhausen',\n\t'Sopot',\n\t'Varpalota',\n\t'Sanming',\n\t'Santander',\n\t'Niskayuna',\n\t'Gumushacikoy',\n\t'Obalapuram',\n\t'Bollate',\n\t'Ghardaia',\n\t'Davorlim',\n\t'San Jacinto del Cauca',\n\t'Ridderkerk',\n\t'Athiringal',\n\t'Jimenez',\n\t'Ketrzyn',\n\t'Grugliasco',\n\t'Segoubougou',\n\t'Lanji',\n\t'Cocorote',\n\t'Mizil',\n\t'Francisco Beltrao',\n\t'Toksun',\n\t'Haka',\n\t'Bilasuvar',\n\t'Sabaneta de Yasica',\n\t'Abqaiq',\n\t'Hinundayan',\n\t'King',\n\t'Satun',\n\t'Fujioka',\n\t'Ankadinondry-Sakay',\n\t'Sentani',\n\t'Bady Bassitt',\n\t'Concepcion Tutuapa',\n\t'Woking',\n\t'Manlius',\n\t'Mutsamudu',\n\t'Khuzdar',\n\t'Czernica',\n\t'Balzers',\n\t'Saydnaya',\n\t'Suthalia',\n\t'Stevenson Ranch',\n\t'Dar Ould Zidouh',\n\t'South Salt Lake',\n\t'Voerde',\n\t'South San Francisco',\n\t'Sarstedt',\n\t'Neuwied',\n\t'Northview',\n\t'Diez',\n\t'Cuscatancingo',\n\t'Worth',\n\t'Wrentham',\n\t'Pueblo West',\n\t'Bispham',\n\t'Shillong',\n\t'Goes',\n\t'Talayazham',\n\t'Kosk',\n\t'Imus',\n\t'Montigny-les-Cormeilles',\n\t'El Guetar',\n\t'Campinas',\n\t'Muggio',\n\t'Latsia',\n\t'Leopoldsburg',\n\t'Tagazhi',\n\t'Tacaimbo',\n\t'Karimkunnum',\n\t'Olifantshoek',\n\t'Cocal',\n\t'Petrovac na Mlavi',\n\t'Likasi',\n\t'Marmaris',\n\t'Qarabulaq',\n\t'Dalin',\n\t'Straseni',\n\t'Tamluk',\n\t'Lemon Grove',\n\t'Shoreview',\n\t'Ewa Beach',\n\t'Ado-Ekiti',\n\t'Rio Verde',\n\t'Marina',\n\t\"Xi'an\",\n\t'Jutai',\n\t\"Quartu Sant'Elena\",\n\t'Santa Ursula',\n\t'Padiala',\n\t'Sigatoka',\n\t'Bien Unido',\n\t'Yotoco',\n\t'Goundam',\n\t'Iconha',\n\t'Pathari',\n\t'Kotra',\n\t'Brookside',\n\t'Palos de la Frontera',\n\t'Ban Bang Phlap',\n\t'Halwan',\n\t'Arth',\n\t'Jiaoxiling',\n\t'Dicholi',\n\t'Uruapan',\n\t'Bromont',\n\t'Yaprakli',\n\t'Junagadh',\n\t'Sirvintos',\n\t'Nandayure',\n\t'Karimama',\n\t'Pangantocan',\n\t'Kanpur',\n\t'Sao Manuel',\n\t'Schwelm',\n\t'North Bergen',\n\t'Curvelo',\n\t'Zafargarh',\n\t'Travilah',\n\t'Arifiye',\n\t'Eusebio',\n\t'Ba`qubah',\n\t'Nutakki',\n\t'Hermantown',\n\t'Kremenets',\n\t'Enrile',\n\t'Tavarede',\n\t'Wiesmoor',\n\t'Soke',\n\t'Bandraboua',\n\t'Dera Allahyar',\n\t'Welzheim',\n\t'Calbuco',\n\t'Markovci',\n\t'Dumka',\n\t'Dumaria',\n\t'Bogue',\n\t'Manuel Tames',\n\t'Longjumeau',\n\t'Igny',\n\t'Medenine',\n\t'Govindapalle',\n\t'Justice',\n\t'Surappalli',\n\t'Fara',\n\t'Sao Francisco do Maranhao',\n\t'Nandiyalam',\n\t'Tarrasa',\n\t'Amaliada',\n\t'El Hadjira',\n\t'Hickory',\n\t'Mandramo',\n\t'Celendin',\n\t'Almansa',\n\t'Yamatotakada',\n\t'Rhaude',\n\t'Lingtang',\n\t'Kfar Kidde',\n\t'Abadla',\n\t'Nova Serrana',\n\t'La Victoria',\n\t'Adis Zemen',\n\t'Nanticoke',\n\t'Douar El Arbaa Bou Quorra',\n\t'Passo Fundo',\n\t'Ain el Mediour',\n\t'Ban Lam Sam Kaeo',\n\t'Hinwil',\n\t'Moradabad',\n\t'Douar Toulal',\n\t'Hong',\n\t'Lubbock',\n\t'Higashikagura',\n\t'Trentola',\n\t'Prymorsk',\n\t'Trzcianka',\n\t'Borujerd',\n\t'Elefsina',\n\t'Teruel',\n\t'Mugdampalli',\n\t'Manampatrana',\n\t'Sisak',\n\t'Simpelveld',\n\t'Jonava',\n\t'Solola',\n\t'Santo Anastacio',\n\t'Nalayh',\n\t'Dumarao',\n\t'Imgarr',\n\t'Puerto Triunfo',\n\t'Dhubaria',\n\t'San Jose de Aerocuar',\n\t'Destrnik',\n\t'Dasso',\n\t'Calanogas',\n\t'Ash Shaykh Badr',\n\t'Klerksdorp',\n\t'Sardasht',\n\t'Udamalpet',\n\t'Xihuangni',\n\t'Agudos do Sul',\n\t'Ciudad de Atlixco',\n\t'Huntley',\n\t'Leonberg',\n\t'North Glengarry',\n\t'Baciu',\n\t'Hemmoor',\n\t\"Montopoli in Val d'Arno\",\n\t'Settimo Torinese',\n\t'Pul-e `Alam',\n\t'Kizilcahamam',\n\t'Bulnes',\n\t'Koiridih',\n\t'Ho',\n\t'Heber',\n\t'Bristol',\n\t'Turbaco',\n\t'Arbaa Laaounate',\n\t'Ayyagarpet',\n\t'Xiluo',\n\t'Nordre Fale',\n\t'Stara Pazova',\n\t'Uchinada',\n\t'Bhikkiwind Uttar',\n\t'Guerou',\n\t'Landeh',\n\t'Lilburn',\n\t'Calvizzano',\n\t'San Jose del Rincon Centro',\n\t'Bagh',\n\t'Mau',\n\t'Vincennes',\n\t'Warrenville',\n\t'Madiun',\n\t'Boma',\n\t'Vettam',\n\t'Magione',\n\t'Piscataway',\n\t'Souk et Tnine Jorf el Mellah',\n\t'Marly-le-Roi',\n\t'Khansahibpuram',\n\t'Otsu',\n\t'Vitoria',\n\t'Motril',\n\t'Asheboro',\n\t'Cobham',\n\t'Kalilangan',\n\t'Dahua',\n\t'Pozo Almonte',\n\t'Salem',\n\t'Babhangaon',\n\t'Zero Branco',\n\t'Berberati',\n\t'Laharpur',\n\t'Nihal Singhwala',\n\t'Pesnica',\n\t'Santa Cruz da Baixa Verde',\n\t'Newburyport',\n\t'Alcala de Guadaira',\n\t'Sodegaura',\n\t'Al Mazar ash Shamali',\n\t'Aransas Pass',\n\t'Xuddur',\n\t'Port-de-Paix',\n\t'Kirkstall',\n\t'Erd',\n\t'Saint-Martin-Boulogne',\n\t'Wulong',\n\t'Nagdha Simla',\n\t'Roeselare',\n\t'Lubin',\n\t'Barberino di Mugello',\n\t'Cranberry',\n\t'Oldenzaal',\n\t'Mascouche',\n\t'Ashgabat',\n\t'Mtwara',\n\t'Mankal',\n\t'Este',\n\t'Caririacu',\n\t'Piranshahr',\n\t'Xiaozhengzhuang',\n\t'Khamis Mushayt',\n\t'Prineville',\n\t'Sidi Namane',\n\t'Tapachula',\n\t'Massawa',\n\t'Ramewadi',\n\t'Abancay',\n\t'Biratnagar',\n\t'Chilakhana',\n\t'Tadepalle',\n\t'Passau',\n\t'Imerimandroso',\n\t'Nilanga',\n\t'Tsukuba-kenkyugakuen-toshi',\n\t'Veldhoven',\n\t'Longjiang',\n\t'Armidale',\n\t'Alcoy',\n\t'Gabaldon',\n\t'Klippansbruk',\n\t'Yongyang',\n\t'Canton',\n\t'Hammonton',\n\t'Pena Forte',\n\t'Panamaram',\n\t'Kankan',\n\t'Sanaa',\n\t'Kilchberg',\n\t'Fulton',\n\t'Prainha',\n\t'Andranofasika',\n\t'Barela',\n\t'Bhogpur',\n\t'Crayford',\n\t'Glenshaw',\n\t'San Lorenzo',\n\t'Thiais',\n\t'Bahce',\n\t'Oliveira do Hospital',\n\t'Bhander',\n\t'Taitung',\n\t'Caldas da Rainha',\n\t'Decatur',\n\t'Basaon',\n\t'Matteson',\n\t'Al Hammam',\n\t'Tayyibat al Imam',\n\t'Jhakhra',\n\t'Stiring-Wendel',\n\t'Vlissingen',\n\t'Zhongling',\n\t'Palm Springs',\n\t\"Qacha's Nek\",\n\t'Kambaneri Pudukkudi',\n\t'Khardah',\n\t'Artashat',\n\t'Bua Yai',\n\t'Point Pedro',\n\t'Tozeur',\n\t'Luxitun',\n\t'San Sebastian de Mariquita',\n\t'Saint-Sauveur',\n\t'Rumilly',\n\t'Mortad',\n\t'Kaithwar',\n\t'Abertillery',\n\t'Sulzbach',\n\t'Tillaivilagam',\n\t'Veroia',\n\t'Zeitz',\n\t'Graz',\n\t'Kitakyushu',\n\t'Picasent',\n\t'Rahden',\n\t'Mecatlan',\n\t'Tehri',\n\t'Mauganj',\n\t'Burshtyn',\n\t'Espargos',\n\t'Travis Ranch',\n\t'Chokkanathapuram',\n\t'Bhalil',\n\t'Pateros',\n\t'Nambuangongo',\n\t'Beckum',\n\t'Sanary-sur-Mer',\n\t'Budili',\n\t'Akalapura',\n\t'Belo Vale',\n\t'Pavlohrad',\n\t'Swinton',\n\t'Cento',\n\t'Nantou',\n\t'Flora',\n\t'Carnaiba',\n\t'Piotrkow Trybunalski',\n\t'Conceicao da Feira',\n\t'Dohazari',\n\t'Sugito',\n\t'Si Sa Ket',\n\t'Sirjan',\n\t'Zaandam',\n\t'Titisee-Neustadt',\n\t'Rafelbunol',\n\t'Abadou',\n\t'Suhareke',\n\t'Pipariya',\n\t'Binidayan',\n\t'Kunzelsau',\n\t'Panjgur',\n\t'Juana Diaz',\n\t'Afzalpur',\n\t'Porirua',\n\t'Elbasan',\n\t'Hardi',\n\t'Forbesganj',\n\t'Shah Alam',\n\t'Tiruvegapra',\n\t'Cat',\n\t'Clichy-sous-Bois',\n\t'Qumqo`rg`on',\n\t'Ban Tha Thong',\n\t'Auburn Hills',\n\t'Castelo Branco',\n\t'Borgo',\n\t'Rich',\n\t'Karukachal',\n\t'Maltby',\n\t'Notteroy',\n\t'Glens Falls North',\n\t'Cunha',\n\t'Alebtong',\n\t'Balneario de Camboriu',\n\t'Anandapuram',\n\t'Bambalang',\n\t'Touggourt',\n\t'Taihe',\n\t'Saidoke',\n\t'Jori Kalan',\n\t'Golet',\n\t'Sankaranayinar Kovil',\n\t'Sao Sepe',\n\t'Saugus',\n\t'Capaci',\n\t'Puerto Morazan',\n\t'Fao Rai',\n\t'Caracase',\n\t'Tranas',\n\t'San Giorgio del Sannio',\n\t'Abeche',\n\t'Pak Thong Chai',\n\t'Sola',\n\t'Bensalem',\n\t'Talen',\n\t'Cidreira',\n\t'Phangnga',\n\t'Kalavapudi',\n\t'Kapsabet',\n\t'Nawan Shahr',\n\t'Pyu',\n\t'Mitsinjo',\n\t'Bradford',\n\t\"N'Gaous\",\n\t'Mionica',\n\t'Echelon',\n\t'Antonio Carlos',\n\t'La Tuque',\n\t'Nairn',\n\t'Steenbergen',\n\t'Sidi Abdelaziz',\n\t'Jijel',\n\t'Manzanares',\n\t'Zofingen',\n\t'Ryuyo',\n\t'Tigard',\n\t'Belm',\n\t'Piastow',\n\t'Sebring',\n\t'Vastervik',\n\t'Hengshuicun',\n\t'Riverside',\n\t'Montecristi',\n\t'Aprilia',\n\t'Penistone',\n\t'Mogeiro',\n\t'Sao Joao de Ver',\n\t'Robles',\n\t'Saint-Germain-en-Laye',\n\t'Bethelsdorp',\n\t'Saka',\n\t'Butia',\n\t'Gudipallipadu',\n\t'Pulivendla',\n\t'Huntingdon',\n\t'Vila Teixeira da Silva',\n\t'Antsakanalabe',\n\t'Amneville',\n\t'Lummen',\n\t'Dbaiye',\n\t'Semmarikulan',\n\t'Risalpur Cantonment',\n\t'Acala del Rio',\n\t'Porur',\n\t'Amarchinta',\n\t'Olamze',\n\t'Kairouan',\n\t'Qiantangcun',\n\t'Montegrotto Terme',\n\t'Bensheim',\n\t'Lenvik',\n\t'Pariquera-Acu',\n\t'Sambre',\n\t'Tekkebhagam',\n\t'Blerick',\n\t'Parobe',\n\t'Clive',\n\t'Davos',\n\t'Devanakavundanur',\n\t'Tupran',\n\t'Rossano',\n\t'Raman',\n\t'Hosan',\n\t'Erding',\n\t'Ban Tha Kham',\n\t'Huercal-Overa',\n\t'Fairmount',\n\t'Kamabougou',\n\t'Alcaudete',\n\t'El Banco',\n\t'Saksohara',\n\t'Ferkessedougou',\n\t'Darsur',\n\t'Gagnef',\n\t'Mostaganem',\n\t'Opatija',\n\t'Cambira',\n\t'Moninnpebougou',\n\t'Pinia',\n\t'Sillod',\n\t'Santo Antonio do Sudoeste',\n\t'Baxt',\n\t'Yomitan',\n\t'Porto Firme',\n\t'Kalungu',\n\t'Tarime',\n\t'Dingxi',\n\t'Garuva',\n\t'Alton',\n\t'Poprad',\n\t'Comandante Fontana',\n\t'Luanzhou',\n\t'Cuitzeo del Porvenir',\n\t\"Sant'Agata de' Goti\",\n\t'Tsinjoarivo',\n\t'Tamiahua',\n\t'Barnis',\n\t'Minami-Alps',\n\t'Jalam',\n\t'Arandu',\n\t'Spanish Fork',\n\t'Tiruvennanallur',\n\t'Mohammadia',\n\t'Bayt Sahur',\n\t'Wilhelmshaven',\n\t'Claudio',\n\t'Nelali',\n\t'San Andres Villa Seca',\n\t'North Dundas',\n\t'Kilminnal',\n\t'Alamogordo',\n\t'Antsakabary',\n\t'Ibicarai',\n\t'Eral',\n\t'Zdolbuniv',\n\t'Drochia',\n\t'Saikaicho-kobago',\n\t'Coroneo',\n\t'Gabasumdo',\n\t'River Forest',\n\t'Ecatepec',\n\t'Bekopaka',\n\t'Fort McMurray',\n\t'Ban Mae Tuen',\n\t'Dizicheh',\n\t'Biggin Hill',\n\t'Lower Bicutan',\n\t'Tunceli',\n\t'Kurim',\n\t'Curiti',\n\t'Seminole',\n\t'Tori-Bossito',\n\t'Lake Havasu City',\n\t'San Benito Abad',\n\t\"'Ain el Bell\",\n\t'Bocsa',\n\t'Batuco',\n\t'Ughara',\n\t'Kakdwip',\n\t'Nallajerla',\n\t'Lumbang',\n\t'Sarbogard',\n\t'Bowral',\n\t'Kristinehamn',\n\t'Meiwa',\n\t'Tetela del Volcan',\n\t'Rupenaguntla',\n\t'Palera',\n\t'Attleboro',\n\t'Vitomarci',\n\t'Guraahai',\n\t'Henley on Thames',\n\t'Stanford le Hope',\n\t'Cazones de Herrera',\n\t'Middleborough',\n\t'Port Perry',\n\t'Saryaghash',\n\t'Tay',\n\t'Marlow',\n\t\"Granarolo del l'Emilia\",\n\t'Whitby',\n\t'Pahou',\n\t'Santa Maria di Sala',\n\t'Rani Sawargaon',\n\t'Moore',\n\t'Tizimin',\n\t'Gabane',\n\t'Lichtenau',\n\t'Wetter (Ruhr)',\n\t'Quva',\n\t'Ipaucu',\n\t'Tahla',\n\t'Enschede',\n\t'Padinjaremuri',\n\t'Oued Essalem',\n\t'Sanatikri',\n\t'Razanj',\n\t'Ban Bang Lamung',\n\t'Camberley',\n\t'Avignon',\n\t'Sittingbourne',\n\t'Maduraivayal',\n\t'Onate',\n\t'Arboga',\n\t'Duluth',\n\t'Iluppur',\n\t'Tehachapi',\n\t'Tijucas',\n\t'Bahadarpur',\n\t'Bugugoucun',\n\t'Bayi',\n\t'Nakuru',\n\t'Fontenay-sous-Bois',\n\t'Tachikawa',\n\t'Amroha',\n\t'Boo',\n\t'Fochville',\n\t'Idak',\n\t'Campbellsville',\n\t'Limonade',\n\t'Lucea',\n\t'Tetouan',\n\t'Sesori',\n\t'Criciuma',\n\t'Bedford',\n\t'Osvaldo Cruz',\n\t'Karacoban',\n\t'Rafael Castillo',\n\t'Faranah',\n\t'Paina',\n\t'Santa Maria del Tule',\n\t'Puno',\n\t'Cove',\n\t'Sanankoroba',\n\t'Nowogard',\n\t'Pallipattu',\n\t'Bhalwal',\n\t'Torre Annunziata',\n\t'Gavinivaripalem',\n\t'Harike',\n\t'Kameyama',\n\t'Amala',\n\t'Struthers',\n\t'Ilindu Kothi',\n\t'Rio Grande',\n\t'Coral Gables',\n\t'San Francisco Libre',\n\t'Esteban Echeverria',\n\t'Than',\n\t'Bere',\n\t'Villa San Jose',\n\t'Gaurihar Khaliqnagar',\n\t'Yonabaru',\n\t'Kretinga',\n\t'Banolas',\n\t'Kalocsa',\n\t'Atlautla',\n\t'Al Muzayrib',\n\t'Tsitondroina',\n\t'Picture Rocks',\n\t'Ostbevern',\n\t'Purwa Utar',\n\t'Pontchateau',\n\t'Bandiagara',\n\t'Midar',\n\t'Abasingammedda',\n\t'Chinnamandem',\n\t'Zhydachiv',\n\t'Fayzobod',\n\t'Bad Bevensen',\n\t'Nedumpura',\n\t'Azua',\n\t'Earley',\n\t'Sao Sebastiao do Maranhao',\n\t'Nossa Senhora do Livramento',\n\t'Desaguadero',\n\t'The Village',\n\t'Richfield',\n\t'Medway',\n\t'Panglao',\n\t'Erraguntla',\n\t'Tapilula',\n\t'South Park',\n\t'Shovot',\n\t'Samaca',\n\t'Fehrbellin',\n\t'Pouytenga',\n\t'Wenping',\n\t'Mendefera',\n\t'Matanao',\n\t'Bataguacu',\n\t'Kljuc',\n\t'Saint-Malo',\n\t'Hiriyur',\n\t'Copan',\n\t'Comodoro',\n\t'Ampasimpotsy-Gara',\n\t'Issum',\n\t'Thundersley',\n\t'Nandavaram',\n\t'Ivisan',\n\t'Uvinza',\n\t'Bituruna',\n\t'Salzhemmendorf',\n\t'Oguchi',\n\t'Maubin',\n\t'Pullman',\n\t'Lower Gwynedd',\n\t'Kidal',\n\t'Ghariyah al Gharbiyah',\n\t'Sagarpur',\n\t'Cottage Lake',\n\t'Macon',\n\t'Siayan',\n\t'Fatick',\n\t'Hinda',\n\t'Betio',\n\t'Ramos Arizpe',\n\t'Mbuyapey',\n\t'Tirana',\n\t'Uzyn',\n\t'Jolo',\n\t'Knoxville',\n\t'Durant',\n\t'Khmelnytskyi',\n\t'Mong Duong',\n\t'Mujui dos Campos',\n\t'Hendaye',\n\t'Despatch',\n\t'Borne',\n\t'Goirle',\n\t'Petnjica',\n\t'Barda',\n\t'Feliz',\n\t'Ut Bulag',\n\t'Fasano',\n\t'Gtarna',\n\t'Greensboro',\n\t'Boskovice',\n\t'Barrafranca',\n\t'Estero',\n\t'Osmangazi',\n\t'Demre',\n\t'Manjil',\n\t'Temascaltepec de Gonzalez',\n\t'Mendota Heights',\n\t'Nalgora',\n\t'Gwangju',\n\t'Qitai',\n\t'Zakhu',\n\t'Krishnarajpet',\n\t'Hayes',\n\t'Vitthalapuram',\n\t'Burla',\n\t'Salay',\n\t'Skuodas',\n\t'Nagano',\n\t'Dambal',\n\t'Sarauni Kalan',\n\t'Bocaiuva',\n\t'Chimbas',\n\t'South Pasadena',\n\t'Dar El Kebdani',\n\t'Matanzas',\n\t'Jarocin',\n\t'Sarioglan',\n\t'Ibate',\n\t'Kisenzi',\n\t'Shibirghan',\n\t'Viseu de Sus',\n\t'Majhariya Sheikh',\n\t'Qulicun',\n\t'Aswan',\n\t'Kowloon City',\n\t'Yverdon-les-Bains',\n\t'Sera',\n\t'Mililani Mauka',\n\t'Acworth',\n\t'Tibubeneng',\n\t'Saijo',\n\t'Wetzikon',\n\t'Americo Brasiliense',\n\t'Nova Cruz',\n\t'Pantao-Ragat',\n\t'Chichibu',\n\t'Kyankwanzi',\n\t'Jabalya',\n\t'Caparica',\n\t'Rewa',\n\t'Castiglione delle Stiviere',\n\t'Demir Kapija',\n\t'Ramat Gan',\n\t'Porto-Novo',\n\t'River Road',\n\t'Canarana',\n\t'Penagam',\n\t'Maldah',\n\t'Rapho',\n\t'Vilvoorde',\n\t'Gauting',\n\t'Aschaffenburg',\n\t'Samux',\n\t'Ekamba',\n\t'Kepsut',\n\t'Esfahan',\n\t'Andramy',\n\t'Sarezzo',\n\t'Miracatu',\n\t'Kramatorsk',\n\t'Daping',\n\t'Tunuyan',\n\t'Bonyhad',\n\t'Sao Joao da Barra',\n\t'Kidsgrove',\n\t'San Jeronimo',\n\t'Chinnachauku',\n\t'Abai',\n\t'Kaipram',\n\t'Paleng',\n\t'Devarshola',\n\t'Utraula',\n\t'Meadville',\n\t'Satupa`itea',\n\t'Pacatuba',\n\t'Saint-Georges',\n\t'Remigio',\n\t'Puerto Suarez',\n\t'Arden-Arcade',\n\t'Kankanalapalle',\n\t'Mankada',\n\t'Willow Grove',\n\t'Tamaki',\n\t'Pijnacker',\n\t'Naryai ka Puri',\n\t'Al Mazyunah',\n\t'Bharhopur',\n\t'Ekero',\n\t'Deh',\n\t'El Jem',\n\t'Curacavi',\n\t'Ladue',\n\t'Barki Ballia',\n\t'Yecapixtla',\n\t'Petaluma',\n\t'Bradley Gardens',\n\t'Caapora',\n\t'Dinklage',\n\t'Karad',\n\t'Niuchangqiao',\n\t'Mahalingpur',\n\t'Walcz',\n\t'Mannamturuttu',\n\t'Les Clayes-sous-Bois',\n\t'Garhara',\n\t'Mumaradikop',\n\t'Davutlar',\n\t'Haripur',\n\t'Sahsaul',\n\t'Pachora',\n\t'Testour',\n\t'Ratchaburi',\n\t'Marovoay',\n\t'Valente',\n\t'Pouso Alegre',\n\t'Chinnavadampatti',\n\t'Mariana',\n\t'Unjha',\n\t'Keighley',\n\t'Detva',\n\t'Allouez',\n\t'Bamako',\n\t'Adrasmon',\n\t'Ramannapeta',\n\t'Fort Lauderdale',\n\t'Webuye',\n\t'Peligros',\n\t'Leeton',\n\t'Bollene',\n\t'Lianjiang',\n\t'Antsirabe Afovoany',\n\t'Ada',\n\t'Tixkokob',\n\t'Kamagaya',\n\t'Cassa de la Selva',\n\t'Takeocho-takeo',\n\t'Butig',\n\t'Algiers',\n\t'Straelen',\n\t'Mechelen-aan-de-Maas',\n\t'Esmeralda',\n\t'Nuevo Casas Grandes',\n\t'Houilles',\n\t'Itano',\n\t'San Javier',\n\t'Emiliano Zapata',\n\t'Seattle',\n\t'Narino',\n\t'Tiruvannamalai',\n\t'Clausthal-Zellerfeld',\n\t'Asola',\n\t'Antonina',\n\t'Dun Dealgan',\n\t'Rifle',\n\t'Maharajgani',\n\t'Las Cruces',\n\t'Mossel Bay',\n\t'Tinglayan',\n\t'Arapgir',\n\t'Locogahoue',\n\t'White House',\n\t'Havana',\n\t'Zhetisay',\n\t'Navinipatti',\n\t'Duptiair',\n\t'Abcoude',\n\t'Capinopolis',\n\t'Arucas',\n\t'Nova Lima',\n\t'Cunhinga',\n\t'Haftkel',\n\t'Andacollo',\n\t'Kawachinagano',\n\t'Mountlake Terrace',\n\t'Kalynivka',\n\t'Perintalmanna',\n\t'Rio Real',\n\t'Cottingham',\n\t'Bas Goynuk',\n\t'Jianshe',\n\t'Wermelskirchen',\n\t'Hariharpara',\n\t'Jucuapa',\n\t'Choa Saidan Shah',\n\t'Agaram',\n\t'Carmen',\n\t'Anguo',\n\t'Challakere',\n\t'Rahimpur',\n\t'Pitanga',\n\t'Zumarraga',\n\t'Gohna',\n\t'Coyuca de Catalan',\n\t'Matinhos',\n\t'Torun',\n\t'Taluqan',\n\t'Aurad Shahjahani',\n\t'Persembe',\n\t'Bochil',\n\t'Nadvirna',\n\t'Niagadina',\n\t'Gubeng',\n\t'Sitalkuchi',\n\t'Dashtobod',\n\t'Lascano',\n\t'Bergisch Gladbach',\n\t'Dumalag',\n\t'Wahga',\n\t'Guarambare',\n\t'Raniyah',\n\t'Maddur',\n\t'Buba',\n\t'Mobarakeh',\n\t'Ouaklim Oukider',\n\t'Ito',\n\t'Lonar',\n\t'Okhargara',\n\t'Esil',\n\t'Devrek',\n\t'Pefka',\n\t'Chamonix-Mont-Blanc',\n\t'Bad Bergzabern',\n\t'Las Condes',\n\t'Ptolemaida',\n\t'Helena-West Helena',\n\t'Chimboy Shahri',\n\t'Franconia',\n\t'Szentes',\n\t'San Vito',\n\t'Panasapadu',\n\t'Ogden',\n\t'Harpalpur',\n\t'Road Town',\n\t'Montague',\n\t'Issoire',\n\t'Bagac',\n\t'Shuichecun',\n\t'Aylesbury',\n\t'Jijiga',\n\t'Dettingen an der Erms',\n\t'Thakraha',\n\t'Worth am Rhein',\n\t'Moissy-Cramayel',\n\t'Possneck',\n\t'Punjai Turaiyampalaiyam',\n\t'Ustka',\n\t'Velair',\n\t'As Sukhnah',\n\t'Carlisle',\n\t'Alausi',\n\t'Chantal',\n\t'Ouro Fino',\n\t'Korsun-Shevchenkivskyi',\n\t'North Andover',\n\t'Melekeok',\n\t'Mbake',\n\t'San Vito dei Normanni',\n\t'Cheranallur',\n\t'Whitewater',\n\t'Port Moresby',\n\t'Bryans Road',\n\t'Vegachi',\n\t'Yolombo',\n\t'Kewanee',\n\t'Mingjian',\n\t'Thonotosassa',\n\t'Isapur',\n\t'Kostrzyn nad Odra',\n\t'Friesoythe',\n\t'Lalam',\n\t'Maruturu',\n\t'Pudu',\n\t'Zahed Shahr',\n\t'Dungu',\n\t'Manica',\n\t'Draa el Mizan',\n\t'Tolmezzo',\n\t'Farsley',\n\t'Agame',\n\t'Pachauth',\n\t'Sittard',\n\t'Mableton',\n\t'Guaratingueta',\n\t'Lucenec',\n\t'Catchiungo',\n\t'Pitalito',\n\t'Bensville',\n\t'Shimohata',\n\t'Zawiat Moulay Brahim',\n\t'Anilao',\n\t'Eloi Mendes',\n\t'Erlanger',\n\t'Minamiaso',\n\t'Diffa',\n\t'Shark',\n\t'Osterburg',\n\t'Barwell',\n\t'Ambalanur',\n\t'Sigaboy',\n\t'Iretama',\n\t'Alucra',\n\t'Sivandipuram',\n\t'Opalenica',\n\t'Fray Bentos',\n\t'Kottur',\n\t'Yasugicho',\n\t'Anacortes',\n\t'Sangola',\n\t'Vanimel',\n\t'Guatape',\n\t'Zorbig',\n\t'Pitogo',\n\t'Busayra',\n\t'Puerto Carreno',\n\t'Nandigama',\n\t'Ampasimanolotra',\n\t\"Ma'ai\",\n\t'Mapiri',\n\t'Serra',\n\t'Santa Iria da Azoia',\n\t'Pyeongtaek',\n\t'Hartford',\n\t'Hokuei',\n\t'Caldicot',\n\t'Tucacas',\n\t'Santiago Texacuangos',\n\t'Turvo',\n\t'Torredonjimeno',\n\t'Fontanafredda',\n\t'Rhede',\n\t'Agri',\n\t'Mandawa',\n\t'Sibate',\n\t'Tutrakan',\n\t'Dinga',\n\t'San Andres Cholula',\n\t'Sarpsborg',\n\t'Palashi',\n\t'Attili',\n\t'Pilas',\n\t'Libonik',\n\t'Tulum',\n\t'Tomarza',\n\t'Pato Branco',\n\t'Currumbin',\n\t'Fourmies',\n\t'Caxias',\n\t'Okondja',\n\t'Cantu',\n\t'Jeremoabo',\n\t'Ciudad General Escobedo',\n\t'Amberomanga',\n\t'Magdiwang',\n\t'Baardheere',\n\t'Ubala',\n\t'Chakwai',\n\t'Uibai',\n\t'Achuapa',\n\t'Nastola',\n\t'Partapnagar',\n\t'Naujan',\n\t'Letchworth',\n\t'Calceta',\n\t'Jafarabad',\n\t'Mamnur',\n\t'Merthyr Tudful',\n\t'Sept-Iles',\n\t'Bekalta',\n\t'Cambrai',\n\t'Rokiskis',\n\t'Pamukova',\n\t'Bad Laasphe',\n\t'Harper',\n\t'Registro',\n\t'Fern Down',\n\t'Perkiomen',\n\t'Lushar',\n\t'Lautaro',\n\t'Bhainsahi',\n\t'Welling',\n\t'Imaricho-ko',\n\t'Caerphilly',\n\t'Cunda dia Baze',\n\t'Monte Quemado',\n\t'Khipro',\n\t'Reriutaba',\n\t'DeBary',\n\t'Talapalli',\n\t'Taverny',\n\t'Jarjanaz',\n\t'Targu-Mures',\n\t'Bhasawar',\n\t'Siverek',\n\t'Grenade',\n\t'Sinincay',\n\t'Soledade',\n\t'Chattogram',\n\t'Srikurmam',\n\t'Daitocho',\n\t'Rombas',\n\t'Surabaya',\n\t'Le Mans',\n\t'Varzea Alegre',\n\t'Jonuta',\n\t'Batavia',\n\t'Pulimakkal',\n\t'Giaveno',\n\t'Sarangpur',\n\t'Septemes-les-Vallons',\n\t'Dolynska',\n\t'Targovishte',\n\t'Aldridge',\n\t'Abilene',\n\t'Santa Maria Jacatepec',\n\t'Khash',\n\t'Reni',\n\t'Denville',\n\t'Caracal',\n\t'Puebla',\n\t'Paravakkottai',\n\t'Great Bookham',\n\t'Bodo',\n\t'Mountougoula',\n\t'Mogi Guacu',\n\t'Yanagawamachi-saiwaicho',\n\t'Datu Odin Sinsuat',\n\t'Morbach',\n\t'Chincholi',\n\t'Cangzhou',\n\t'Pichilemu',\n\t'Saravan',\n\t'Sainte-Adele',\n\t'Rapar',\n\t'Langford Station',\n\t'Porthcawl',\n\t'Hilvarenbeek',\n\t'Jalarpet',\n\t'Bellview',\n\t'Initao',\n\t'Antaretra',\n\t'Iriona',\n\t'Peonga',\n\t'Vadavalli',\n\t'Port Talbot',\n\t\"Arbi'a Tighadwiyn\",\n\t'Ciudad Vieja',\n\t'Newtown',\n\t'Sarasota',\n\t'Rohtak',\n\t\"'s-Hertogenbosch\",\n\t'Ras Baalbek',\n\t'Harinakunda',\n\t'Calahorra',\n\t'Beitbridge',\n\t'Las Tablas',\n\t'Zhongli',\n\t'Dauin',\n\t'Saraqib',\n\t'Karranah',\n\t'Solaro',\n\t'Dehra Dun',\n\t'Riolandia',\n\t'Wai',\n\t'Golubovci',\n\t'Lomza',\n\t'Nkurenkuru',\n\t'Oudenburg',\n\t'North Laurel',\n\t'Ammi Moussa',\n\t'Puruliya',\n\t'Ayungon',\n\t'Mailavaram',\n\t'Ban Dong Mada',\n\t'San Sebastian',\n\t'Le Petit-Couronne',\n\t'Bani Walid',\n\t'Molins de Rey',\n\t'Bekoratsaka',\n\t'Luperon',\n\t'Abakaliki',\n\t'Vila Nova de Cerveira',\n\t'Rocca Priora',\n\t'Raurkela',\n\t'Romny',\n\t'Santa Marcela',\n\t'Chinhoyi',\n\t'Tanki Leendert',\n\t'Dej',\n\t'Berber',\n\t'Perryton',\n\t'Haarlem',\n\t'Xique-Xique',\n\t'Mirdoddi',\n\t'El Rodeo',\n\t'Truskavets',\n\t'Zugdidi',\n\t'Dharhwa',\n\t'Esslingen',\n\t'Kakching Khunou',\n\t'Campos Sales',\n\t'Saundhonwali',\n\t'Hemei',\n\t'Pindorama',\n\t'Cospicua',\n\t'Sevur',\n\t'Fiume Veneto',\n\t'South Hill',\n\t'Charipara',\n\t'Borio',\n\t'Mount Barker',\n\t'Soliera',\n\t'San Clemente',\n\t'Polonne',\n\t'Barreiras',\n\t'Cabrero',\n\t'Sainte-Therese',\n\t'Merredin',\n\t'Doume',\n\t'Guaynabo',\n\t'Mohyliv-Podilskyi',\n\t'Santiago de Chuco',\n\t'Auriflama',\n\t'Sao Jeronimo da Serra',\n\t'Rowland Heights',\n\t'Telkathu',\n\t'Zhentang',\n\t'Ifrane',\n\t'Chailaha',\n\t'Acoyapa',\n\t'Grunberg',\n\t'Illescas',\n\t'Jacare',\n\t'Grabels',\n\t'Anshan',\n\t'Caloundra',\n\t'Ruyigi',\n\t'Kalleribhagam',\n\t'Rochester',\n\t'Ban Rawai',\n\t'Dera',\n\t'Takanezawa',\n\t'Palmer Ranch',\n\t'Rampatti',\n\t'Heyunkeng',\n\t'Sittwe',\n\t'Hiep Hoa',\n\t'Gorlitz',\n\t'Yanggezhuang',\n\t'Ogawa',\n\t'Zafarwal',\n\t'Cachoeirinha',\n\t'Ra`ananna',\n\t'Raymore',\n\t'Deneysville',\n\t'Nurpur',\n\t'Nosibe',\n\t'Minamishiro',\n\t'Northbrook',\n\t'Colonia General Felipe Angeles',\n\t'Acacias',\n\t'G`uzor',\n\t'Oberwil',\n\t'Yanjiang',\n\t'Iflissen',\n\t'Vsetin',\n\t'Nimes',\n\t'Sangrampur',\n\t'Germering',\n\t'Coulsdon',\n\t'Lebon Regis',\n\t'Malaimachchampatti',\n\t'Rarz',\n\t'Clacton-on-Sea',\n\t'Droylsden',\n\t'Maroli',\n\t'Xintian',\n\t'Wangi',\n\t'Blaine',\n\t'Aliganj',\n\t'Michendorf',\n\t'Kalaikunda',\n\t'Betigeri',\n\t'Talipao',\n\t'Bheja',\n\t'Red Wing',\n\t'Merrillville',\n\t'Minamisatsuma',\n\t'Ramsbottom',\n\t'Catarina',\n\t'Korb',\n\t'Lingyuan',\n\t'Rendon',\n\t'Ambongo',\n\t'Aliyabad',\n\t'Millington',\n\t'Brdovec',\n\t'Gujar Khan',\n\t'Heeze',\n\t'Binondo',\n\t'Aix-les-Bains',\n\t'Civril',\n\t'Aranyaprathet',\n\t'Bargteheide',\n\t'Ambodiangezoka',\n\t'Talsint',\n\t'Silvania',\n\t'Jindayris',\n\t'Pacuarito',\n\t'Nuku`alofa',\n\t'Imi Mokorn',\n\t'Panjipara',\n\t'Portales',\n\t'Ksebia',\n\t'Sodo',\n\t'Hoppegarten',\n\t'Amparo',\n\t'Pirayu',\n\t'Narat',\n\t'Bagaura',\n\t'Puerto Gaitan',\n\t'Hoyerswerda',\n\t'Beckley',\n\t'Tsarazaza',\n\t'Mari`',\n\t'Panitan',\n\t'Phoenixville',\n\t'Kinkala',\n\t'Pilachikare',\n\t'Chellaston',\n\t'Ranchuelo',\n\t'Schuylkill',\n\t'Can-Avid',\n\t'Northam',\n\t'Dedham',\n\t'Bad Camberg',\n\t'Oyten',\n\t'Guaymas',\n\t'Gaeta',\n\t'Ankadinandriana',\n\t'Holalagondi',\n\t'North Guwahati',\n\t'Saint-Gaudens',\n\t'Rancho San Diego',\n\t'Vicar',\n\t'San Pedro Pochutla',\n\t'Uhingen',\n\t'Policoro',\n\t'Nabilatuk',\n\t'Bauyrzhan Momyshuly',\n\t'Mulakad',\n\t'Kesan',\n\t'Asosa',\n\t'Dewangarh',\n\t'Ash Shaykh Zuwayd',\n\t'Nunihat',\n\t'Itki Thakurgaon',\n\t'Korsor',\n\t'Cenovi',\n\t'Aroali',\n\t'Schweinfurt',\n\t'Hirpardangal',\n\t'Nadisal',\n\t'El Amim',\n\t'Zeewolde',\n\t'Plaisance',\n\t'Mokronog',\n\t'Xiaojiangcun',\n\t'Muhradah',\n\t'Santa Rosa de Lima',\n\t'Halvad',\n\t'Welkenraedt',\n\t'Kronberg',\n\t'Lagoa Santa',\n\t'Liutuancun',\n\t'Iguig',\n\t'Blue Island',\n\t'Codru',\n\t'Caramoran',\n\t'Stuart',\n\t'Marino',\n\t'Tacheng',\n\t'Bandar-e Gaz',\n\t'San Leandro',\n\t'Athi River',\n\t'Leirvik',\n\t'Wattrelos',\n\t\"As Suwayda'\",\n\t'Singampunari',\n\t'Velampalaiyam',\n\t'Semarang',\n\t'Garland',\n\t'Coronel Oviedo',\n\t'Waldkirch',\n\t'Gusau',\n\t'Campton Hills',\n\t'Kalangala',\n\t'Palafrugell',\n\t'Esfarayen',\n\t'Qazaly',\n\t'Chelsea',\n\t'Gokce',\n\t'Harrisonville',\n\t'Weare',\n\t'Shiji',\n\t'Bakharia',\n\t'Soanindrariny',\n\t'Dhanbad',\n\t'Jayaque',\n\t'Tanque Verde',\n\t'Northenden',\n\t'Matias Cardoso',\n\t'St. Charles',\n\t'Gaomi',\n\t'Moreira Sales',\n\t'Bharatpur',\n\t'Chauki',\n\t'Gokcebey',\n\t'Kishtwar',\n\t'Hambantota',\n\t'Ez Zahra',\n\t'Ain Beida',\n\t'Bauru',\n\t'Chickasha',\n\t'Simpsonville',\n\t'Taman Johor Jaya',\n\t'Skelleftea',\n\t'Bellaa',\n\t'Narlidere',\n\t'Lanciano',\n\t'Bellmawr',\n\t'Tataltepec de Valdes',\n\t'Molo',\n\t'Kiskunfelegyhaza',\n\t'Kaisiadorys',\n\t'San Dionisio',\n\t'Corpus Christi',\n\t'Tutin',\n\t'Betanty',\n\t'Ambatomanjaka',\n\t'Koprukoy',\n\t'Matuga',\n\t'South Normanton',\n\t'Kalamata',\n\t'Trieste',\n\t'Balikesir',\n\t'Magsaysay',\n\t'Fuji',\n\t'Dorado',\n\t'Teyateyaneng',\n\t'Foiano della Chiana',\n\t'Borba',\n\t'Gaborone',\n\t'Puerto Armuelles',\n\t'Edgware',\n\t'Ahirauliya',\n\t'Felpham',\n\t'Amboaboa',\n\t'Paso del Macho',\n\t'Raymond Terrace',\n\t'Kambam',\n\t'Los Arabos',\n\t'Johnston',\n\t'Placentia',\n\t'Kharkiv',\n\t'Sault Ste. Marie',\n\t'East Glenville',\n\t'Tamza',\n\t'Akalgarh',\n\t'Nwoya',\n\t'Ordubad',\n\t'Bulan',\n\t'Musashimurayama',\n\t'Lipa City',\n\t'Tirupporur',\n\t'Kannudaiyampatti',\n\t'Sendafa',\n\t'Angelholm',\n\t'Carneiros',\n\t'Vellikulangara',\n\t'Andanappettai',\n\t'Mira',\n\t'Wangqing',\n\t'Asahikawa',\n\t'Stryi',\n\t'Kittery',\n\t'Rosso',\n\t'Ramsgate',\n\t'Diabigue',\n\t'Anjarkandi',\n\t'Santiago Tulantepec',\n\t'Kaul',\n\t'Pruszkow',\n\t'Karlskrona',\n\t'Porto-Vecchio',\n\t'Pasadena Hills',\n\t'Ban Bung Kha',\n\t'Wilmslow',\n\t'San Juan de Limay',\n\t'Puran Bigha',\n\t'Paramagudi',\n\t'Xima',\n\t'Khashuri',\n\t'San Lorenzo della Costa',\n\t'Medikunda',\n\t'Belpara',\n\t'Mountain Home',\n\t'Burnaby',\n\t'Sapouy',\n\t'Rhar el Melah',\n\t'Pessac',\n\t'Grevenmacher',\n\t'Santo Antonio do Monte',\n\t'Gros Islet',\n\t'Tarabha',\n\t'Wimauma',\n\t'Kumage',\n\t'Sivamalai',\n\t'Salmas',\n\t'Bad Salzdetfurth',\n\t'Taohuajiang',\n\t'Tsirang',\n\t'Dera Ismail Khan',\n\t'Westbrook',\n\t\"'Ayn Bni Mathar\",\n\t'Veppattur',\n\t'Nettappakkam',\n\t'Saint-Herblain',\n\t'Cassano delle Murge',\n\t'San Jose Acatempa',\n\t'Sripur',\n\t'Rae Bareli',\n\t'Dazaifu',\n\t'Benguema',\n\t'Dobni Para',\n\t'Hajipur',\n\t'Villars-sur-Glane',\n\t'Tejen',\n\t'Itabaiana',\n\t'Exu',\n\t'Ninove',\n\t'Riposto',\n\t'Baraki Barak',\n\t'Surat Thani',\n\t'Setlagode',\n\t'Rajhanpur',\n\t'Wancheng',\n\t'Bom Conselho',\n\t'Karkkila',\n\t'Arden Hills',\n\t'Jasim',\n\t'Tangainony',\n\t'Ganguru',\n\t'Tamiami',\n\t'Anjiajia',\n\t'Angren',\n\t'Balimbing',\n\t'Vallejo',\n\t'Sabae',\n\t'Podgorze',\n\t'Rio Pardo',\n\t'Sarzeau',\n\t'Koniz',\n\t'El Segundo',\n\t'Werther',\n\t'Phalia',\n\t'Sidi Abd el Moumene',\n\t'Rajanagaram',\n\t'Riachao das Neves',\n\t'Betrandraka',\n\t'Graben-Neudorf',\n\t\"Ighrem n'Ougdal\",\n\t'Kourimat',\n\t'Reno',\n\t'Verwood',\n\t'Naspur',\n\t'Douar El Mellaliyine',\n\t'Pichanal',\n\t'Octeville',\n\t'Hamadan',\n\t'Rackeve',\n\t'Khesht',\n\t'Anew',\n\t'South Fulton',\n\t'Cabo Verde',\n\t'Cooma',\n\t'Unnao',\n\t'Kandanati',\n\t'Sainkhera',\n\t'Hasbrouck Heights',\n\t'Antananarivo',\n\t'Puca Urco',\n\t'Hebron',\n\t'Qal`ah-ye Now',\n\t'Bara Malehra',\n\t'Vinales',\n\t'Kotturu',\n\t'Ainaro',\n\t'Kawambwa',\n\t'Santiago Ixcuintla',\n\t'Donzdorf',\n\t'Thong Pha Phum',\n\t'West Carrollton',\n\t'Imbau',\n\t'Shatrana',\n\t'Nalerigu',\n\t'Namli',\n\t'Cumbernauld',\n\t'Al Musayfirah',\n\t'Lulea',\n\t'Jamaica',\n\t'Vijayapati',\n\t'Monte Porzio Catone',\n\t'Carshalton',\n\t'Gumia',\n\t'Arvand Kenar',\n\t'Karaund',\n\t'Minamiaizu',\n\t'Gronau',\n\t'Jinxing',\n\t'Sixaola',\n\t'Oulad Hammou',\n\t'Trongsa',\n\t'Khenichet-sur Ouerrha',\n\t'Naifaru',\n\t\"K'ebri Dehar\",\n\t'Namagiripettai',\n\t'East London',\n\t'Neibu',\n\t'Himi',\n\t'Cameron Highlands',\n\t'Amfilochia',\n\t'Saranambana',\n\t'Qingshan',\n\t'Ishikawa',\n\t'Monkseaton',\n\t\"Al Jahra'\",\n\t'Simmerath',\n\t\"At Ta'if\",\n\t'Bama',\n\t'Meknes',\n\t'Tiahounkossi',\n\t'Tucuma',\n\t'Lower Salford',\n\t'Punto Fijo',\n\t'East Greenbush',\n\t'Ambodimanary',\n\t'Nilambur',\n\t'Jalalabad',\n\t'Qingnian',\n\t'Barberton',\n\t'Atari',\n\t'Jilikul',\n\t'Cranbrook',\n\t'Lobogo',\n\t'Xiegang',\n\t'La Habra',\n\t'Alingsas',\n\t'Onverwacht',\n\t'Pimpri-Chinchwad',\n\t'Yatangcun',\n\t'Coueron',\n\t'Yaren',\n\t'Kazincbarcika',\n\t'Tanta',\n\t'Rasaunk',\n\t'Campoalegre',\n\t'Jurua',\n\t'Kallur',\n\t'Cekerek',\n\t'Tarwara',\n\t'Burketown',\n\t'South St. Paul',\n\t'Corgao',\n\t'An Thanh B',\n\t'Borgholzhausen',\n\t'Tahlequah',\n\t'Vierzon',\n\t'Qagan Us',\n\t'Baravat',\n\t'Vrsac',\n\t\"Za'roura\",\n\t'Bennington',\n\t'Talamba',\n\t'Nandyal',\n\t'Laiwu',\n\t'Tacuarembo',\n\t'Cuncolim',\n\t'Xiaping',\n\t'Landazuri',\n\t'Cuautla',\n\t'Pires Ferreira',\n\t'Banaz',\n\t'Cote-Saint-Luc',\n\t'Manacor',\n\t'Tantangan',\n\t'Emmaus',\n\t'Sonora',\n\t'Pontiac',\n\t'Chinandega',\n\t'Armutlu',\n\t'Besni',\n\t'Qingquan',\n\t'Ceyu',\n\t'Majuro',\n\t'Herxheim',\n\t'Bluefield',\n\t'Oerlinghausen',\n\t'Aigues-Mortes',\n\t'Tosya',\n\t\"L'Ile-Saint-Denis\",\n\t'Ban Ngio Ngam',\n\t'Fortim',\n\t'Rio Gallegos',\n\t'Schleiz',\n\t'Zoudjame',\n\t'Ondangwa',\n\t'Ampasimanjeva',\n\t'Altamont',\n\t'Wittelsheim',\n\t'Jayapura',\n\t'Arni ka Khera',\n\t'Commack',\n\t'Morombe',\n\t'Akdagmadeni',\n\t'Reidsville',\n\t'Chinnakkampalaiyam',\n\t'Girau do Ponciano',\n\t'Ardrossan',\n\t'Cherutana Tekku',\n\t'Kondur',\n\t'Gwelej',\n\t'Traiguen',\n\t'Sannois',\n\t'Zarach',\n\t'Lhuentse',\n\t'Redondo Beach',\n\t'Maynard',\n\t'Carmopolis de Minas',\n\t'Chino Hills',\n\t'Sohta',\n\t'Velddrif',\n\t'Tarifa',\n\t'Wheatfield',\n\t'Lasko',\n\t'Ho Chi Minh City',\n\t'Osakarovka',\n\t'Sirajganj',\n\t'Waidhofen an der Ybbs',\n\t'Lieusaint',\n\t'Worsborough',\n\t'Mandoto',\n\t'Kochkor',\n\t'Hindang',\n\t'Wolmirstedt',\n\t'Angri',\n\t'Bagnolet',\n\t'Hatogaya-honcho',\n\t'Panelas',\n\t'Campestre',\n\t'Boras',\n\t'Danderesso',\n\t'Vila Verde',\n\t'Amborondra',\n\t'Itapemirim',\n\t'Muthutala',\n\t'Qeshm',\n\t'Halawa',\n\t'Dosso',\n\t'Villazon',\n\t'Breukelen',\n\t'Pandi',\n\t'Audenge',\n\t'Ngou',\n\t'Urucara',\n\t'Baham',\n\t'Mudukulattur',\n\t'Tubarao',\n\t\"Dek'emhare\",\n\t'Sidi Yakoub',\n\t'Bandhi',\n\t'Karsiyaka',\n\t'Shibin al Qanatir',\n\t'Ajas',\n\t'Dunedin',\n\t'Asturias',\n\t'California',\n\t'Catania',\n\t'Vinh',\n\t'Celano',\n\t'Tierra Colorada',\n\t'Dosquebradas',\n\t'Dunblane',\n\t'Brejao',\n\t'Toguere-Koumbe',\n\t'Lianshan',\n\t'Roghun',\n\t'Gokdepe',\n\t'Aul',\n\t'Gotvand',\n\t'Harnes',\n\t'Choloma',\n\t'Mamanguape',\n\t'Miguelturra',\n\t'Karlovo',\n\t'Goole',\n\t'Emir Abdelkader',\n\t'Sironko',\n\t'Bokaro Steel City',\n\t'Altos del Rosario',\n\t'Saint-Jean-de-Vedas',\n\t'Hyosha',\n\t'Tamiang Layang',\n\t'Scartho',\n\t'Oltu',\n\t'Sillanwali',\n\t'Tadangam',\n\t'Loures',\n\t'Kalecik',\n\t'Sao Jose do Egito',\n\t'Morelia',\n\t'Mizan Teferi',\n\t'Dar Bel Hamri',\n\t'Ingeniero Guillermo N. Juarez',\n\t'Vendrell',\n\t'Wembley',\n\t'Fritissa',\n\t'Narasingapuram',\n\t'Hatvan',\n\t'Gharyala',\n\t'Cachoeira Paulista',\n\t'Pata Putrela',\n\t'Batang',\n\t'Burnham-on-Sea',\n\t'Stuarts Draft',\n\t'Balzan',\n\t'Pollachi',\n\t'Rajpura',\n\t'Drachten',\n\t'Agadallanka',\n\t'Habikino',\n\t'Mabole',\n\t'Katipunan',\n\t'Pachhapur',\n\t'Banaso',\n\t'Grinnell',\n\t'Euskirchen',\n\t'Ahar',\n\t'Iranshahr',\n\t'Mostardas',\n\t'Shimotsucho-kominami',\n\t'Maharagama',\n\t'Owego',\n\t'Madan',\n\t'Tomaszow Lubelski',\n\t'Oisterwijk',\n\t'Sao Francisco',\n\t'San Martin Jilotepeque',\n\t'Iperu',\n\t'Balaoan',\n\t'Dubno',\n\t'Tall `Afar',\n\t'Kaufungen',\n\t'Sohwal',\n\t'Guamuchil',\n\t'Fosses',\n\t'Casillas',\n\t'Ban Noen Phoem',\n\t'Cuellar',\n\t'Aurelino Leal',\n\t'Zeulenroda',\n\t'Porto Tolle',\n\t'Lower Hutt',\n\t'Castelnau-le-Lez',\n\t'Matabhanga',\n\t'Ban Ko',\n\t'Balsa Nova',\n\t'Brentwood',\n\t'Brumath',\n\t'Luban',\n\t'Mainaguri',\n\t'Buwenge',\n\t'Qabqa',\n\t'Al `Aziziyah',\n\t'Frutillar Alto',\n\t'Vatluru',\n\t'Casale',\n\t'Ambararata',\n\t'Studenicani',\n\t'Lanskroun',\n\t'Sveti Ivan Zelina',\n\t'Tokamachi',\n\t'Bishopstoke',\n\t'Broxburn',\n\t'Timizart',\n\t'Maroharatra',\n\t'Isselburg',\n\t'Vandiyur',\n\t'Los Llanos de Aridane',\n\t'Winder',\n\t'Banga',\n\t'Trophy Club',\n\t'Olmsted Falls',\n\t'Zanesville',\n\t'Zhudong',\n\t'Bapatla',\n\t'Peringanad',\n\t'Cedar Falls',\n\t'Leanja',\n\t'Eydhafushi',\n\t'Paoua',\n\t'Andribavontsona',\n\t'Pergamino',\n\t'Kouri',\n\t'Bellmore',\n\t'Bondeno',\n\t'Comines',\n\t'Volendam',\n\t'Pio IX',\n\t'Cotija de la Paz',\n\t'Koratla',\n\t'Tallbisah',\n\t'Hakubacho',\n\t'Helsingborg',\n\t'Braila',\n\t'Samalpur',\n\t'Afourar',\n\t'Briceno',\n\t'Kabanga',\n\t'Ambohimahamasina',\n\t'Quirima',\n\t'Hakone',\n\t'Nova Londrina',\n\t'Nuneaton',\n\t'Plaisir',\n\t'Kirikhan',\n\t'Eccles',\n\t'West Little River',\n\t'Nideggen',\n\t'Gyor',\n\t'Parchim',\n\t'Hagere Hiywet',\n\t'Mirinzal',\n\t'Lupi Viejo',\n\t'Buckeye',\n\t'Ravutulapudi',\n\t'Landupdih',\n\t'Santa Barbara de Pinto',\n\t'Haysville',\n\t'Dimbokro',\n\t'Toulouse',\n\t'Mangdongshan',\n\t'Vladicin Han',\n\t'Soma',\n\t'Springfield',\n\t'Wedel',\n\t'Dokuchaievsk',\n\t'Thai Binh',\n\t'Mbulu',\n\t'Muconda',\n\t'Pearl',\n\t'Pleszew',\n\t'Qualicum Beach',\n\t'Harihans',\n\t'Yangtangxu',\n\t'Boa Esperanca do Sul',\n\t'Saravia',\n\t'Wepangandla',\n\t'Morristown',\n\t'Karaikandi',\n\t'Elverum',\n\t'Mexicaltzingo',\n\t'Kamdoli',\n\t'Tayabas',\n\t'Hillsborough',\n\t'Joao Monlevade',\n\t'Syracuse',\n\t'Elliot Lake',\n\t'Ciudad Guadalupe Victoria',\n\t'Shampur',\n\t'Beverstedt',\n\t'Miajadas',\n\t'Erode',\n\t'Sao Pedro do Ivai',\n\t'Volkermarkt',\n\t'Lagoa de Itaenga',\n\t'Kokstad',\n\t'Jinshui',\n\t'Miesbach',\n\t'Lakeland South',\n\t'Dong Hoi',\n\t'Illingen',\n\t'San Dona di Piave',\n\t'Liantang',\n\t'Jujutla',\n\t'Ad Darb',\n\t'Osicala',\n\t'Huehuetla',\n\t'Yambol',\n\t'Muthallath al Azraq',\n\t'Asago',\n\t'Periya Soragai',\n\t'Anar',\n\t'Velika Plana',\n\t'Becej',\n\t'Hengnan',\n\t'Brad',\n\t'Tudiyalur',\n\t'Skhour Rehamna',\n\t'Seonar',\n\t'Muktagacha',\n\t'Saffron Walden',\n\t'Cilacap',\n\t'Ankiliabo',\n\t'Ramon Magsaysay',\n\t'Sarenja',\n\t'Yamanobe',\n\t'Marcinelle',\n\t'Abergele',\n\t'Saraunja',\n\t'Arankhola',\n\t'Calexico',\n\t'Dalaguete',\n\t'Owatonna',\n\t'Jalpa de Mendez',\n\t'Villalbilla',\n\t'Frameries',\n\t'Lakewood Park',\n\t'Erlun',\n\t'Thandwe',\n\t'Mons-en-Baroeul',\n\t'Netishyn',\n\t'Mindelo',\n\t'Repelon',\n\t'Sidon',\n\t'Ouinhri',\n\t'Miramar Beach',\n\t'Cam Ranh',\n\t'Certaldo',\n\t'Vedurupavaluru',\n\t'Alginet',\n\t'Egil',\n\t'Ruteng',\n\t'Chesapeake Ranch Estates',\n\t'Sao Jose do Jacuipe',\n\t'Perafita',\n\t'Barnsley',\n\t'Hammond',\n\t'Simav',\n\t'South Euclid',\n\t'Tiquipaya',\n\t'Moorpark',\n\t'Chernivtsi',\n\t'Joigny',\n\t'Cary',\n\t'Pennadam',\n\t'Yongping',\n\t'Sagnay',\n\t'Lalibela',\n\t'Tazoult-Lambese',\n\t'Orta Nova',\n\t'Dumangas',\n\t'Trujillo',\n\t'Borovnica',\n\t'Buttayagudem',\n\t'Kegalle',\n\t'Oshikango',\n\t'San Juan de Arama',\n\t'Hathiaundha',\n\t'Eirunepe',\n\t'Pakka Kalan',\n\t'Kita',\n\t'Msoga',\n\t'Solothurn',\n\t'Welkom',\n\t'La Quinta',\n\t'Stamford',\n\t'Serpa',\n\t'Cadelbosco di Sopra',\n\t\"'Ain Tolba\",\n\t'Chaiwu',\n\t'Kundiawa',\n\t'Clorinda',\n\t'Liushuquan',\n\t'Pingquan',\n\t'Ouesso',\n\t'Jiaganj',\n\t'Ibiraci',\n\t'Varaklani',\n\t'Whakatane',\n\t'Brzesko',\n\t'Fort Oglethorpe',\n\t'Pervomaisk',\n\t'Guiuan',\n\t'Hadiaya',\n\t'El Zulia',\n\t'Mahates',\n\t'Rio Segundo',\n\t'Patos',\n\t'Summerland',\n\t'Zalantun',\n\t'Khundawandpur',\n\t'Soledad de Graciano Sanchez',\n\t'Xocavand',\n\t'Denizli',\n\t'Mangai',\n\t'Chedaopo',\n\t'Rathfarnham',\n\t'Sibanicu',\n\t'Oxnard',\n\t'Surubim',\n\t'Bergama',\n\t'Keta',\n\t'Ochiai',\n\t'Yellanda',\n\t'Wilsonville',\n\t'Iguidiy',\n\t'Cordoba',\n\t'Tsarahonenana',\n\t'Flint',\n\t'Valentim Gentil',\n\t'Gumushane',\n\t'Cherbourg',\n\t'Hosir',\n\t'Makariv',\n\t'Pikine',\n\t'Acayucan',\n\t'Trebisov',\n\t'Bagong Pag-Asa',\n\t'Barr Elias',\n\t'Santa Coloma de Farnes',\n\t'Simao',\n\t'Ballarat',\n\t'Andoharanomaitso',\n\t'Bethlehem',\n\t'Mevani',\n\t'Sao Miguel dos Campos',\n\t'Heinsberg',\n\t'Al Kufah',\n\t'Pont Sonde',\n\t'Turkmenbasy',\n\t'Goldasht',\n\t'Hamar',\n\t'Pastores',\n\t'Veruela',\n\t\"Nong'an\",\n\t'Senica',\n\t'Steinau an der Strasse',\n\t'Wibsey',\n\t'Long Khanh',\n\t'Lubny',\n\t'Aalsmeer',\n\t'Citong',\n\t'Charxin',\n\t'Soyapango',\n\t'Avanos',\n\t'Milas',\n\t'Padmanabhapuram',\n\t'Les Palmes',\n\t'Rangoon',\n\t'Guichen',\n\t'Vadakkum',\n\t'Holon',\n\t'Faraskur',\n\t'Cifteler',\n\t'Malente',\n\t'Salgado',\n\t'Udalguri',\n\t'Broadwater',\n\t'Olot',\n\t'Kirkintilloch',\n\t'Amares',\n\t'West Drayton',\n\t'Pliezhausen',\n\t'Manicore',\n\t'Kanniparamba',\n\t'Larisa',\n\t'Stans',\n\t'Entraigues-sur-la-Sorgue',\n\t'Bhelsi',\n\t'Nuwara Eliya',\n\t'Montignoso',\n\t'Yavoriv',\n\t'Thillangeri',\n\t'Gajendragarh',\n\t'Narva',\n\t'Chirak',\n\t'Forestville',\n\t'Waitangi',\n\t'Yicheng',\n\t'Machagai',\n\t'Rasivarai Tottam',\n\t'Poienile de sub Munte',\n\t'Dogubayazit',\n\t'Abhia',\n\t'Etampes',\n\t'Puerto San Martin',\n\t'Panama City Beach',\n\t'Mittahalli',\n\t'Rudravaram',\n\t'Nassau',\n\t'Bladel',\n\t'Bauan',\n\t'Bryne',\n\t'Mandi Bamora',\n\t'Schenefeld',\n\t'Gosaingaon',\n\t'Nallur',\n\t'Soanierana',\n\t'Akhnur',\n\t'Pedda Adsarlapalli',\n\t'Waalwijk',\n\t'Sekondi',\n\t'Kelo',\n\t'Squinzano',\n\t'Itikalapalle',\n\t'Tattamangalam',\n\t'Segue',\n\t'Jaltocan',\n\t'Coram',\n\t'Entre Rios',\n\t'Hafizabad',\n\t'Konarak',\n\t'Betsizaraina',\n\t'Ulanhot',\n\t'Augsburg',\n\t'Modica',\n\t'Nova Olinda',\n\t'Eastvale',\n\t'Lechang',\n\t'Wanaka',\n\t'Ormesby',\n\t'Malegaon',\n\t'Rincon de Romos',\n\t'Bihta',\n\t'Mukilteo',\n\t'Codajas',\n\t'Hindalgi',\n\t'Radviliskis',\n\t'Vasai-Virar',\n\t'Salor',\n\t'Eraura',\n\t'Labrea',\n\t'Nanuet',\n\t'Maryborough',\n\t'Bramhabarada',\n\t'Rubeho',\n\t'Scherpenzeel',\n\t'Osan',\n\t'Obando',\n\t'San Antonio',\n\t'Mamarappatti',\n\t'Padangpanjang',\n\t'Wau',\n\t'Thiene',\n\t'Avocado Heights',\n\t'Lake Forest Park',\n\t'Sallaumines',\n\t'Nova Venecia',\n\t'Varadero',\n\t'Amalner',\n\t'Debaltseve',\n\t'Levoca',\n\t'Beachwood',\n\t\"Motta Sant'Anastasia\",\n\t'Kreuztal',\n\t'Kirundo',\n\t'Ingeniero White',\n\t'Tasucu',\n\t'Spelle',\n\t'Radomsko',\n\t'Baleyara',\n\t'Wencheng',\n\t'Ambohijanahary',\n\t'Oullins',\n\t'Ain Oulmene',\n\t'Sakete',\n\t'Alattur',\n\t'Sobradinho',\n\t'Hoki',\n\t'Calgary',\n\t'Praia',\n\t'Atbasar',\n\t'Kisslegg',\n\t'Chapaev',\n\t'Chipindo',\n\t'Livramento de Nossa Senhora',\n\t'Odemira',\n\t'Molango',\n\t'Mortugaba',\n\t'Kuttanallur',\n\t'Dahegam',\n\t'Gardena',\n\t'Round Lake',\n\t'San Nicolas',\n\t'Kinhalu',\n\t'Osorio',\n\t'Alanganallur',\n\t'Santa Cruz del Norte',\n\t'La Grange',\n\t'Habra',\n\t'Ciamis',\n\t'Zhuji',\n\t'Maduru',\n\t'Manyas',\n\t\"'Ain el Arbaa\",\n\t'Alampalaiyam',\n\t'Ribera',\n\t'Qorashina',\n\t'Penafiel',\n\t'Tiraspol',\n\t'Pitou',\n\t'Pallikondai',\n\t'Kabuga',\n\t'Westerland',\n\t'Luckau',\n\t'Saddlebrooke',\n\t'Bijeljina',\n\t'Villepreux',\n\t'Karianga',\n\t'Tomar do Geru',\n\t'Guaraniacu',\n\t'Moravska Trebova',\n\t'Sunrise Manor',\n\t'King of Prussia',\n\t'Lemon Hill',\n\t'Condeuba',\n\t'Sikonge',\n\t'Metlili Chaamba',\n\t'Maplewood',\n\t'Qasigiannguit',\n\t'Banjar',\n\t'Cucuta',\n\t'Vazquez',\n\t'Sour el Ghozlane',\n\t'Oran',\n\t'Long Thanh',\n\t'Sao Domingos do Prata',\n\t'Fungurume',\n\t'Grado',\n\t'Sezze',\n\t'San Pedro Tapanatepec',\n\t'Uvalde',\n\t'Buenaventura',\n\t'Kanhauli',\n\t'Tadaoka-higashi',\n\t'Svitlovodsk',\n\t'Samut Songkhram',\n\t'Scherpenheuvel',\n\t'Filomeno Mata',\n\t'Mallappulasseri',\n\t'Royken',\n\t'Westerville',\n\t'Nioro',\n\t'Devendranagar',\n\t'Itabashi',\n\t'Itapuranga',\n\t'Chanteloup-les-Vignes',\n\t'Santa Lucia di Piave',\n\t'Satu Mare',\n\t'Tuni',\n\t'Chouafa',\n\t'Sevilla La Nueva',\n\t'Chaugain',\n\t'Cuquio',\n\t'Palm Coast',\n\t'Antanimieva',\n\t'Baltasar Brum',\n\t'Harnaut',\n\t'Lagoa do Carro',\n\t'Arenys de Munt',\n\t'Landecy',\n\t'Tancitaro',\n\t'Shanawan',\n\t'Mangoli',\n\t'Baharestan',\n\t'Pia',\n\t'Witney',\n\t'Guillena',\n\t'Namchi',\n\t'Naryn',\n\t'Ujhana',\n\t'Itigi',\n\t'Douar Oulad Sidi Moussa',\n\t'Natuba',\n\t'Hazel Park',\n\t'Farias Brito',\n\t'Corumba de Goias',\n\t'Rhyl',\n\t'Barkuhi',\n\t'Piracuruca',\n\t'Ranst',\n\t'Koka',\n\t'Yunshan',\n\t'Jiran',\n\t'Zanhuang',\n\t'Grahamstown',\n\t'Erandio',\n\t'Podili',\n\t'Neerpelt',\n\t'Leczna',\n\t'Richterich',\n\t'Narsingdi',\n\t'Arnhem',\n\t'Vodil',\n\t'Hakkari',\n\t'Simbach am Inn',\n\t'Panzos',\n\t'Chichester',\n\t'Driouch',\n\t'Tezontepec',\n\t'Palmeiras de Goias',\n\t'Tizi-n-Bechar',\n\t'Rosyth',\n\t'Greenlawn',\n\t'Mali',\n\t'Sidi Chiker',\n\t'Kwiha',\n\t'Busaar',\n\t'Gangammapeta',\n\t\"Be'er Ya`aqov\",\n\t'Potangal',\n\t'Murayama',\n\t'Bang Bua Thong',\n\t'Lerma',\n\t'Santo Antonio do Taua',\n\t'Fair Lakes',\n\t'Creteil',\n\t'Qigexingcun',\n\t'Ymittos',\n\t'Flemington',\n\t'Northlake',\n\t'Edlapadu',\n\t'Angalakuduru Malepalle',\n\t'Pila',\n\t'Sinop',\n\t'La Higuerita',\n\t'Plymstock',\n\t'Cateel',\n\t'Augustow',\n\t'Ianantsony',\n\t'Bando',\n\t'Sizhan',\n\t'Uppalaguptam',\n\t'Damu',\n\t'Bordj Okhriss',\n\t'Panjab',\n\t'North Versailles',\n\t'Adh Dhakhirah',\n\t'Grove City',\n\t'Le Poire-sur-Vie',\n\t'Keshod',\n\t'Corby',\n\t'Inhassoro',\n\t'Hinesville',\n\t'Espartinas',\n\t'Gien',\n\t'Chennirkara',\n\t'Time',\n\t'Ziar nad Hronom',\n\t'Ravels',\n\t'Pakxan',\n\t'Namin',\n\t'Yaragol',\n\t'Maimbung',\n\t'Kominato',\n\t'Bayghanin',\n\t'South Bend',\n\t'Manzanillo',\n\t'Hartselle',\n\t'Balarampuram',\n\t'Cay',\n\t'Estepa',\n\t'Heliopolis',\n\t'Analila',\n\t'Korba',\n\t'Gusinje',\n\t'Lake Magdalene',\n\t'Ambahikily',\n\t'Rijen',\n\t'Tuta',\n\t'Jardinopolis',\n\t'Cypress Gardens',\n\t'Bijawar',\n\t'Soeda',\n\t'Buena Vista Tomatlan',\n\t'Lalejin',\n\t'Muro del Alcoy',\n\t'Lincoln Park',\n\t'Beecher',\n\t'Tansandra',\n\t'Ambohimanga Atsimo',\n\t'Manjhi',\n\t'Nahiyat al Karmah',\n\t'Rainhill',\n\t'Elizabethtown-Kitley',\n\t'Palotina',\n\t'Alfter',\n\t'Meppayyur',\n\t'Domoni',\n\t'Abay',\n\t'Nettetal',\n\t'Paithan',\n\t'Hafshejan',\n\t'Dubliany',\n\t'Balaka',\n\t'Barauli',\n\t'Kleinblittersdorf',\n\t'Belpasso',\n\t'Shopokov',\n\t'Eugene',\n\t'Navalyal',\n\t'Cieszyn',\n\t'Bom Retiro do Sul',\n\t'Taylor',\n\t'Perehinske',\n\t'Montale',\n\t'Attingal',\n\t'Fresnes',\n\t'Marofinaritra',\n\t'Arumbakkam',\n\t'Djebahia',\n\t'Diai Koura',\n\t'Candelaria Loxicha',\n\t'Boituva',\n\t'Broni',\n\t'Orangetown',\n\t'Pastos Bons',\n\t'Derinkuyu',\n\t'Stratford',\n\t'Ocotlan de Morelos',\n\t'Trbovlje',\n\t'Kitui',\n\t'Dhone',\n\t'Mohdra',\n\t'Zwijndrecht',\n\t'Chocen',\n\t'Hameenlinna',\n\t'Londonderry',\n\t'Ujre',\n\t'Koko',\n\t'Pomfret',\n\t'Rosdorf',\n\t'Monopoli',\n\t'Lingig',\n\t'Ravenna',\n\t'Herenthout',\n\t'Bovalino Marina',\n\t'Wheaton',\n\t'Almoradi',\n\t'Estanzuelas',\n\t'Sao Sebastiao do Passe',\n\t'Pont-y-pwl',\n\t'Puliyur',\n\t'Lagoa da Confusao',\n\t'Nighoj',\n\t'Giannouli',\n\t'Paivalike',\n\t'Yalamakuru',\n\t'Aplahoue',\n\t'Kotabumi',\n\t'Los Corrales de Buelna',\n\t'Marumori',\n\t'Sujnipur',\n\t'Pleasant Valley',\n\t'Buala',\n\t'Downers Grove',\n\t'Magallanes',\n\t'Bayt al Faqih',\n\t'Hualien',\n\t'Edgewater Park',\n\t'Pascani',\n\t'Ukkayapalle',\n\t'Cabrayil',\n\t'Xizhou',\n\t'Ravulapalem',\n\t'Villefontaine',\n\t'Al Fayyum',\n\t'Ulukisla',\n\t'Hargawan',\n\t'Tummanatti',\n\t'Pearl City',\n\t'Mucuge',\n\t'Selibe Phikwe',\n\t'Itsukaichi',\n\t'Seravezza',\n\t'Gopalganj',\n\t'Bodoco',\n\t'Paderborn',\n\t'Butare',\n\t'Sandur',\n\t'Zgornja Hajdina',\n\t'Stilfontein',\n\t'Xuan Trung',\n\t'Alampur Gonpura',\n\t'Thimiri',\n\t'Buhriz',\n\t'Ballston',\n\t'Kotla Qasim Khan',\n\t'Mannegudam',\n\t'Marinka',\n\t'Machakos',\n\t'Mankoeng',\n\t'Mirandola',\n\t'Dinard',\n\t'Komen',\n\t'Highlands Ranch',\n\t'Kanra',\n\t'Boldaji',\n\t'Kampenhout',\n\t'Ardea',\n\t'Long Branch',\n\t'Katiola',\n\t'Rancagua',\n\t'Taima',\n\t'Innsbrook',\n\t'Fedosiia',\n\t'Vohitrindry',\n\t'Tres Pontas',\n\t'Kharial',\n\t'Belinta',\n\t'Tsu',\n\t'Zhucaoying',\n\t'West Chicago',\n\t'Exeter',\n\t'Ovar',\n\t'Fort Portal',\n\t'Upper Merion',\n\t'Tiruvarpu',\n\t'Karmiel',\n\t'Ivanec',\n\t'Project Six',\n\t'Luofeng',\n\t'Muttayyapuram',\n\t'Kawaminami',\n\t'Bila Tserkva',\n\t'Pfungstadt',\n\t'Hebi',\n\t'Kizugawa',\n\t'Gumusova',\n\t'Wellingborough',\n\t'Shimencun',\n\t'Ourense',\n\t'Sollies-Pont',\n\t'Jatani',\n\t'Ushuaia',\n\t'Drongen',\n\t'Lagarto',\n\t'Las Guaranas',\n\t'Minas Novas',\n\t'Ponnampatti',\n\t'Hola Prystan',\n\t'Cojutepeque',\n\t'Randolph',\n\t'Matsue',\n\t'Adohoun',\n\t'Divonne-les-Bains',\n\t'Talsur',\n\t'Auki',\n\t'Obo',\n\t'Spilamberto',\n\t'Konodimini',\n\t'Hanam',\n\t'Gopavaram',\n\t'Xambioa',\n\t'Terra Rica',\n\t'Pitea',\n\t'Jussara',\n\t'Ahuimanu',\n\t'Hampstead',\n\t'Bala Cynwyd',\n\t'El Rosal',\n\t'Labasa',\n\t'Garner',\n\t'Las Maravillas',\n\t'Toowoomba',\n\t'Kukshi',\n\t'Buzau',\n\t'Tahoua',\n\t'Koboko',\n\t'Carlopolis',\n\t'Wildeshausen',\n\t'Hershey',\n\t'Landsmeer',\n\t'Swarna',\n\t'Wordsley',\n\t'Gagarin Shahri',\n\t'Bad Laer',\n\t'Adigoppula',\n\t'Kratovo',\n\t'Desavilakku',\n\t'Qalat',\n\t'Senador Pompeu',\n\t'Solonopole',\n\t'Bainet',\n\t'Mandurah',\n\t'Kyaukpyu',\n\t'Willistown',\n\t'Pirri',\n\t'Aweil',\n\t'Akividu',\n\t'Majdanpek',\n\t'Qal`eh Tall',\n\t'Garopaba',\n\t'Sograha',\n\t'Al Jizah',\n\t'Shurobod',\n\t'Warden',\n\t'Danielskuil',\n\t'Paidha',\n\t'Vargem Alta',\n\t'Chamestan',\n\t'Kumasi',\n\t'Kafr ash Shaykh',\n\t'Chirundu',\n\t'Arzachena',\n\t'Dobrada',\n\t'Arcot',\n\t'Matlock',\n\t'Usmanpur',\n\t'Silute',\n\t'Al Qunaytirah',\n\t'Jablanica',\n\t'Gaada',\n\t'Tarazu',\n\t'Lagoa do Ouro',\n\t'Yuksekova',\n\t'Mirfield',\n\t'Kurmuk',\n\t'Macia',\n\t'Karuvakulam',\n\t'Nice',\n\t'Ignalina',\n\t'East Franklin',\n\t'Malhada',\n\t'Imbituba',\n\t'Kasumi',\n\t'Tiangua',\n\t'Leonforte',\n\t'Enumulapalle',\n\t'Pushpattur',\n\t'Romford',\n\t'El Talar de Pacheco',\n\t'Osakasayama',\n\t'Lanuza',\n\t'Bordighera',\n\t'Bennane',\n\t'Japura',\n\t'Yesilli',\n\t'Marcos Paz',\n\t'Hickam Housing',\n\t'Ban Khamen',\n\t'Shirguppi',\n\t'Chemmaruthi',\n\t'Woodlesford',\n\t'Povazska Bystrica',\n\t'Kotia',\n\t'Gunri',\n\t'Nawagarh',\n\t'Judenburg',\n\t'Hammam-Lif',\n\t'Matina',\n\t'Verkhnodniprovsk',\n\t'San Lucas',\n\t'Jacaraci',\n\t'Glarus',\n\t'Manoli',\n\t'Monticello',\n\t'Urziceni',\n\t'Pryluky',\n\t'Langhirano',\n\t'Buriti Bravo',\n\t'Skenderaj',\n\t'Bari',\n\t'Cho Moi',\n\t'Kahla',\n\t'Grojec',\n\t'Berea',\n\t'Wyandotte',\n\t'Jaguapita',\n\t'Modavandisatyamangalam',\n\t'Danesfahan',\n\t'Larache',\n\t'North Potomac',\n\t'Kharupatia',\n\t'Kisangani',\n\t'Nuoro',\n\t'Janakkala',\n\t'Bhatkhori',\n\t'Mungaoli',\n\t'Yalova',\n\t'Qaratog',\n\t'Yesilova',\n\t'Tualatin',\n\t'Sandviken',\n\t'Bickenhill',\n\t'Inwood',\n\t'Meckenheim',\n\t'Davidson',\n\t'Kanhaipur',\n\t'Longton',\n\t'Sendurai',\n\t'Paniem',\n\t'Jujharpur',\n\t'Sasolburg',\n\t'Rambouillet',\n\t'March',\n\t'Ewing',\n\t'Seogwipo',\n\t'Huber Heights',\n\t'Calabanga',\n\t'Mallasamudram',\n\t'Dharawat',\n\t'Ngara',\n\t'Pensacola',\n\t'Tuzluca',\n\t'Lauenburg',\n\t'Kidangazhi',\n\t'Ucu Seles',\n\t'Enebakk',\n\t'Nalua',\n\t'Aubiere',\n\t'Manfredonia',\n\t'Nacunday',\n\t'Street',\n\t'Sao Bernardo do Campo',\n\t'Sidhauli',\n\t'Igarape-Acu',\n\t'Teodoro Schmidt',\n\t'Barra do Corda',\n\t'Tangua',\n\t'Yibin',\n\t'Ozdere',\n\t'Chak Habib',\n\t'Medchal',\n\t'Surab',\n\t'Snyder',\n\t'Teus',\n\t'Oulad Slim',\n\t'Ingurti',\n\t'Manaure',\n\t'Jaipur',\n\t'Zlate Moravce',\n\t'Castillejos',\n\t'Kalakeri',\n\t'Mahavelona',\n\t'Iesi',\n\t'Bedford Heights',\n\t'Dinokana',\n\t'Shimogamo',\n\t'Mohammad Yar',\n\t'Ban Kham Pom',\n\t'Nannestad',\n\t'Espiye',\n\t'Jiji',\n\t'Bulandshahr',\n\t'Wetteren',\n\t'Valattur',\n\t'Hejian',\n\t'Wete',\n\t'Beverley',\n\t'Marar',\n\t'Olecko',\n\t'Chalatenango',\n\t'Dommasandra',\n\t'Chilamatturu',\n\t'Petit-Trou de Nippes',\n\t'Ratnagiri',\n\t'Crozet',\n\t'Birganj',\n\t'Dehiba',\n\t'Vettweiss',\n\t'Kucuk Dalyan',\n\t'Nirmal',\n\t'Simi Valley',\n\t'Wels',\n\t'Fredericton',\n\t'Nykoping',\n\t'Salgueiro',\n\t'Naantali',\n\t'Koliakkod',\n\t'Cruz das Almas',\n\t'Cardoso Moreira',\n\t'Sao Paulo',\n\t'Lugovoy',\n\t'Sheffield Lake',\n\t'Focsani',\n\t'Saarijarvi',\n\t'La Magdalena Chichicaspa',\n\t'Clarkstown',\n\t'Bongabong',\n\t'Raisen',\n\t'Aguadas',\n\t'Pomaz',\n\t'Shahpur Undi',\n\t'Wervershoof',\n\t'Cochoapa el Grande',\n\t'Malaybalay',\n\t'Mesudiye',\n\t'Caravaggio',\n\t'Moviya',\n\t'Manay',\n\t'Kitanakagusuku',\n\t'Basi',\n\t'Kant',\n\t'Garmeh',\n\t'Weeze',\n\t'Kenieran',\n\t'Epping',\n\t'Serra do Salitre',\n\t'Sabzevar',\n\t'Timbiqui',\n\t'Andilanatoby',\n\t'West Point',\n\t'Nneyi-Umuleri',\n\t'Brembate',\n\t'Bendigo',\n\t'Pitrufquen',\n\t'Mobara',\n\t'Tuku',\n\t'Herkimer',\n\t'Rokunohe',\n\t'Aliso Viejo',\n\t'Shirataka',\n\t'Huajiang',\n\t'Imam Sahib',\n\t'Toyoake',\n\t'Cidade Velha',\n\t'Bull Run',\n\t'Leguevin',\n\t'Sao Domingos',\n\t'Sidi Barani',\n\t'Ejeda',\n\t'Xishrov',\n\t'Ebebiyin',\n\t'Oruvadalkotta',\n\t'Gurwalia Biswas',\n\t'Mariupol',\n\t'Ulft',\n\t'Necocli',\n\t'Ambriz',\n\t'Saltsjobaden',\n\t'Oulad Dahmane',\n\t'Adelaide River',\n\t'Bikaner',\n\t'Condoto',\n\t'Shah Latif Town',\n\t'Manantheri',\n\t'Mossley',\n\t'Piracununga',\n\t'Parappanangadi',\n\t'Revel',\n\t'Atmakuru',\n\t'Pullappalli',\n\t'Shengli',\n\t'Salto',\n\t'Los Mochis',\n\t'Pattittara',\n\t'Dahuaishu',\n\t'Yamasa',\n\t\"Val-d'Or\",\n\t'Holic',\n\t'Tarxien',\n\t'Meishan',\n\t'Baghant',\n\t'Panrepatti',\n\t'Edemissen',\n\t'Rockport',\n\t'Chavassheri',\n\t'Swampscott',\n\t'Torroella de Montgri',\n\t'Chauk Azam',\n\t'Moul El Bergui',\n\t'Isla-Cristina',\n\t'Oulad Ayyad',\n\t'Qorveh',\n\t'Yoshiicho-shimobaru',\n\t'Jangipur',\n\t'Port Alberni',\n\t'Beauchamp',\n\t'Ratba',\n\t'Beni Douala',\n\t'Kunduz',\n\t'Seosaeng',\n\t'Etaples',\n\t'Bludenz',\n\t'Golaghat',\n\t'Sujanpur',\n\t'Doctor Arroyo',\n\t'Bugho',\n\t'Borgarnes',\n\t'Solanea',\n\t'Boulogne-Billancourt',\n\t'Khosrowshahr',\n\t'Paithan Kawai',\n\t'Kaltenkirchen',\n\t'Jordan',\n\t'Motiong',\n\t'Daraj',\n\t'Manhattan',\n\t'Debica',\n\t'Bina',\n\t'Nanjanad',\n\t'Campina',\n\t'Antsahavaribe',\n\t'Maizal',\n\t'Saint-Nicolas',\n\t'Round Lake Beach',\n\t'Kamalasai',\n\t'Yeola',\n\t'Dangila',\n\t'East Bradford',\n\t'Noale',\n\t'Germencik',\n\t'De Aar',\n\t'Taihecun',\n\t'Kilinochchi',\n\t'Karivalamvandanallur',\n\t'Vinany',\n\t'Pudtol',\n\t'Visselhovede',\n\t'Perigny',\n\t'Izalco',\n\t'Dhuri',\n\t'Rudarpur',\n\t'San Marzano sul Sarno',\n\t'Kambar',\n\t'Le Hochet',\n\t'Skalavik',\n\t'Dharhara',\n\t'Agutaya',\n\t'Montpelier',\n\t'Santa Pola',\n\t'Budelsdorf',\n\t'Gyapekurom',\n\t'Medan',\n\t'Egilsstadhir',\n\t'Somasso',\n\t'Carsamba',\n\t'Nepalganj',\n\t'Bobil',\n\t'San Guillermo',\n\t'Hyrum',\n\t'Dhauni',\n\t'Al Hisn',\n\t'Hengkou',\n\t'Nenagh',\n\t'Lake Monticello',\n\t'Kokiladanga',\n\t'Aves',\n\t'Iwaizumi',\n\t'Santa Quiteria do Maranhao',\n\t'Kusugal',\n\t'Misano Adriatico',\n\t'Liangyi',\n\t\"Qa'em Shahr\",\n\t'Okene',\n\t'Dorsten',\n\t'Inglewood',\n\t'Waianae',\n\t'Nerupperichchal',\n\t'Ghandinagar',\n\t'Le Portel',\n\t'Nazare',\n\t'Douar Lehgagcha',\n\t'Boende',\n\t'Aracruz',\n\t'Atar',\n\t'Golhisar',\n\t'Niar',\n\t'Kristiansund',\n\t\"Mu'minobod\",\n\t'Ilchester',\n\t'Jodoigne',\n\t'Mudanjiang',\n\t'Parapatti',\n\t'Youssoufia',\n\t'Has',\n\t'Rzeszow',\n\t'View Park-Windsor Hills',\n\t'Redland',\n\t'Bni Sidel',\n\t'Cumbum',\n\t'Sue',\n\t'Ban Pae',\n\t'Eghezee',\n\t'Lebedinovka',\n\t'Demerval Lobao',\n\t'Teplodar',\n\t'Moose Jaw',\n\t'Rahika',\n\t'Edwards',\n\t'Imdina',\n\t'Zuhres',\n\t'Gillette',\n\t'Tixter',\n\t'Valenii de Munte',\n\t'Zhangliangcun',\n\t'Failsworth',\n\t'Dormentes',\n\t'Chowchilla',\n\t'Osasco',\n\t'Cheste',\n\t'Elmadag',\n\t'Timberwood Park',\n\t'Tiruttani',\n\t'Souba',\n\t'Maripad',\n\t'Tiltil',\n\t'Piossasco',\n\t'Comstock Park',\n\t'Sagrada Familia',\n\t'San Raimundo',\n\t'Killeen',\n\t'Miracema',\n\t'Singapore',\n\t'Olocuilta',\n\t'Ribeirao do Pinhal',\n\t'Itaquitinga',\n\t'Haltom City',\n\t'Chanderi',\n\t'Jarabulus',\n\t'Chennampatti',\n\t'Izumo',\n\t'Taruma',\n\t'Sottaiyampalaiyam',\n\t'Ichikawamisato',\n\t'Brockton',\n\t'Pandua',\n\t'Willow Street',\n\t'Truro',\n\t'Topola',\n\t'Blumenau',\n\t'Braine-le-Comte',\n\t'Duga Resa',\n\t'Liesveld',\n\t'Cairu',\n\t'Kolongo-Bozo',\n\t'Huanghua',\n\t'La Oliva',\n\t'Yokkaichi',\n\t'Tres Lagoas',\n\t'Westervoort',\n\t'Michelstadt',\n\t'Cavalcante',\n\t'La Lima',\n\t'Ampanotokana',\n\t'Roma',\n\t'Latacunga',\n\t'Eckington',\n\t'Cam Pha',\n\t'Kangqiao',\n\t'Remanso',\n\t'Jipijapa',\n\t'Dbarwa',\n\t'Cody',\n\t'Narsarsuaq',\n\t'Windhoek',\n\t'Razgrad',\n\t'Xinhualu',\n\t'Aosta',\n\t\"M'Chouneche\",\n\t'Aydarken',\n\t'Analamitsivalana',\n\t'Boro',\n\t'Yelur',\n\t'Manteno',\n\t'As Sarw',\n\t'Ban Bueng Phra',\n\t'Puliyankudi',\n\t'Istaravshan',\n\t'Pithaura',\n\t'Onex',\n\t'Chakdarra',\n\t'Kareli',\n\t'Dinshaway',\n\t'Matalam',\n\t'Yongju',\n\t'Kumarapuram',\n\t'Yidu',\n\t'St. Joseph',\n\t'Fort Bonifacio',\n\t'Mecayapan',\n\t'Saint-Dizier',\n\t'Sharurah',\n\t'Uruara',\n\t'Macusani',\n\t'Stollberg',\n\t'Avelino Lopes',\n\t'Eschenbach',\n\t'Kamianka-Buzka',\n\t'Merced',\n\t'Ishizaki',\n\t'Ratan',\n\t'Majholi',\n\t'Portimao',\n\t'Guyancourt',\n\t'Ampasimena',\n\t'Dengshangcun',\n\t'Teno',\n\t'Cachira',\n\t'Davaci',\n\t'Tamamura',\n\t'Clifton Park',\n\t'Ma`bar',\n\t'Aartselaar',\n\t'Blundellsands',\n\t'Richards Bay',\n\t'Bussolengo',\n\t'Ratnahalli',\n\t'Bestensee',\n\t'Manjacaze',\n\t'Solano',\n\t'Mercerville',\n\t'Wujie',\n\t'Luderitz',\n\t'Campo Formoso',\n\t'Pobiedziska',\n\t'Ennamangalam',\n\t'Claiborne',\n\t'Elesvaram',\n\t'Begogo',\n\t'San Salvo',\n\t'Tambura',\n\t'Zumbo',\n\t'Margate',\n\t'Naini Tal',\n\t'Mao',\n\t'Castelfranco di Sotto',\n\t'Guachaves',\n\t'Artemisa',\n\t'Ovalle',\n\t'Piedras Blancas',\n\t'Dhanauri',\n\t'Vengapalli',\n\t'Tnine Sidi Lyamani',\n\t'Balindong',\n\t'Busia',\n\t'Codigoro',\n\t'Shiqiao',\n\t'Eidson Road',\n\t'Malita',\n\t'Kapatagan',\n\t'Ervalia',\n\t'Sibuco',\n\t'Rattaphum',\n\t'Wolfratshausen',\n\t'Jucurucu',\n\t'Lismore',\n\t'Lagangilang',\n\t'Ech Chaibat',\n\t'Iguaba Grande',\n\t'Bayan Hot',\n\t'Senjan',\n\t'Mihara',\n\t'Sandwich',\n\t'Huanglongsi',\n\t'Hualaihue',\n\t'Campos do Jordao',\n\t'Radauti',\n\t'Hersham',\n\t'Rutherford',\n\t'Kavallemmavu',\n\t'Bindura',\n\t'Niono',\n\t'Hammam Dalaa',\n\t'Varto',\n\t'Qina',\n\t'Aringay',\n\t'Trofarello',\n\t'Goshikicho-aihara-minamidani',\n\t'Taozhou',\n\t'Wickford',\n\t'Casale sul Sile',\n\t'Pointe a Raquettes',\n\t'Dolianova',\n\t'Morpeth',\n\t'Safdarabad',\n\t'Asamankese',\n\t'Mifune',\n\t'South Huntington',\n\t'Antri',\n\t'Ambohimahazo',\n\t'Nangis',\n\t'Lincolnwood',\n\t'Vieira do Minho',\n\t'Marigliano',\n\t'Sankt Valentin',\n\t'Ota-ku',\n\t'Montes Claros',\n\t'Scottsboro',\n\t'Gulni',\n\t'Bogovinje',\n\t'Tlalnelhuayocan',\n\t'Little Canada',\n\t'Bni Bouayach',\n\t'Porto Rafti',\n\t'Pontal',\n\t'Milha',\n\t'Kigoma',\n\t'Littleborough',\n\t'Tarur',\n\t'Myers Corner',\n\t'Salamedu',\n\t'Hernando',\n\t'Sava',\n\t'Rowley Regis',\n\t'Qax',\n\t'Mor',\n\t'Jalalaqsi',\n\t'Fereydun Kenar',\n\t'Aubergenville',\n\t'Puranattukara',\n\t'Vondrozo',\n\t'Pombal',\n\t'Upper Providence',\n\t'Huizhou',\n\t'Mali Idos',\n\t'Townsville',\n\t'Bolbec',\n\t'Nanpara',\n\t'Tocantins',\n\t'Oulgaret',\n\t'Marmara Ereglisi',\n\t'Pedra',\n\t'Sahapur',\n\t'Puerto Lleras',\n\t'Soccorro',\n\t'Enerhodar',\n\t'Adams',\n\t'Khetko',\n\t'Bacobampo',\n\t'Naxxar',\n\t'Wilton',\n\t'Manantenina',\n\t'Montecatini Terme',\n\t'Ocumare del Tuy',\n\t'Kas',\n\t'Nagarpara',\n\t'Tagounite',\n\t'Magnago',\n\t'Paripueira',\n\t'Guerra',\n\t'Ecaussinnes-Lalaing',\n\t'Tittachcheri',\n\t'Cariacica',\n\t'Missaglia',\n\t'Niscemi',\n\t'Ajdabiya',\n\t'Santa Cruz das Palmeiras',\n\t'Bogucice',\n\t'Centurion',\n\t'Aalst',\n\t'Tupelo',\n\t'Kochhor',\n\t'Riihimaki',\n\t'Sjobo',\n\t'Dongguan',\n\t'Melbourne',\n\t'Goluchow',\n\t'Devapur',\n\t'Merimbula',\n\t'North Port',\n\t'Bou Izakarn',\n\t'Cuisnahuat',\n\t'Cunday',\n\t'Sao Bernardo',\n\t'Everett',\n\t'Gyal',\n\t'Cedar Grove',\n\t'Piriapolis',\n\t'Mamakating',\n\t'Narathiwat',\n\t'Wood River',\n\t'Kebemer',\n\t'Salzburg',\n\t'Roebourne',\n\t'Port-au-Prince',\n\t'Ulliyeri',\n\t'Simferopol',\n\t'Navojoa',\n\t'Kuna',\n\t'Ikeda',\n\t'Dinan',\n\t'Champadanga',\n\t'Kottayam',\n\t'Itajai',\n\t'Moulay Abdallah',\n\t'Ponnuru',\n\t'Pakribarawan',\n\t'Canakkale',\n\t'Mestre',\n\t'Kannampalaiyam',\n\t'Lang Suan',\n\t'Libiaz',\n\t'Naftalan',\n\t'Guanzhai',\n\t'Juruti',\n\t'Hautmont',\n\t'Coro',\n\t'Navani',\n\t'Cagdianao',\n\t'Bauska',\n\t'Waltershausen',\n\t'Karippira',\n\t'Kodiyeri',\n\t'Huercal de Almeria',\n\t'Lebane',\n\t'Tando Allahyar',\n\t'El Bordj',\n\t'Polva',\n\t'Asasa',\n\t'Capilla de Guadalupe',\n\t'Vadapalanji',\n\t'Mekhe',\n\t'Leigh-on-Sea',\n\t'Velykyi Bychkiv',\n\t'Sihali Jagir',\n\t'Tepetitlan',\n\t'Sincelejo',\n\t'Caorle',\n\t'Burrel',\n\t'Ebetsu',\n\t'Niagara-on-the-Lake',\n\t'Tucson Mountains',\n\t'Manawar',\n\t'Uige',\n\t'Ankaramy',\n\t'Guinobatan',\n\t'Andrakata',\n\t'Patulul',\n\t'Patnos',\n\t'Bengkulu',\n\t'Strakonice',\n\t'Bairo',\n\t'Sint Anthonis',\n\t'Astorp',\n\t'Chantepie',\n\t'Stara Gora',\n\t'Fierenana',\n\t'Phenix City',\n\t'Schmalkalden',\n\t'Nadi',\n\t'Vimodrone',\n\t'Maramag',\n\t'Satipo',\n\t'El Oued',\n\t'Dogbo',\n\t'Needham',\n\t'Mitu',\n\t'North Vancouver',\n\t'Belmonte',\n\t'Turmanin',\n\t'Beandrarezona',\n\t'Shiraz',\n\t'Edgewood',\n\t'Eqbaliyeh',\n\t'West Whiteland',\n\t'Nchelenge',\n\t'Sason',\n\t'Suknah',\n\t'Alhandra',\n\t'Boghni',\n\t'Versoix',\n\t'Beverwijk',\n\t'Satyun',\n\t'Village Green-Green Ridge',\n\t'Luuk',\n\t'Speedway',\n\t'Yanbu',\n\t'Bhitarwar',\n\t'Kluang',\n\t'Sastamala',\n\t'Mulangodi',\n\t'Olivares',\n\t'Kondhali',\n\t'Inkollu',\n\t'Piedras Negras',\n\t'Consuelito',\n\t'Uruguaiana',\n\t'Nowy Targ',\n\t'Puvali',\n\t'Hulshout',\n\t'Pleasant Grove',\n\t'Armant',\n\t'Viga',\n\t'Igbanke',\n\t'Plover',\n\t'Bene Beraq',\n\t'Yopougon',\n\t'San Nicolas de los Ranchos',\n\t'Piui',\n\t'Gieraltowice',\n\t'Tarana',\n\t'Yanai',\n\t'Chariyakulam',\n\t'Bogota',\n\t'Minamisanriku',\n\t'Werl',\n\t'Manuel Ribas',\n\t'Heusenstamm',\n\t'Grosseto',\n\t'Villeparisis',\n\t'Serramanna',\n\t'Sudlohn',\n\t'Mawatagama',\n\t'Starokostiantyniv',\n\t'Vaikam',\n\t'Ipiales',\n\t'New Baltimore',\n\t'Quinta de Tilcoco',\n\t'Borgaro Torinese',\n\t'Tapiratiba',\n\t'Cazzago San Martino',\n\t'Esperanca',\n\t'Yirol',\n\t'Mila',\n\t'Tangalan',\n\t'Sardarshahr',\n\t'Palmetto',\n\t'Heddesheim',\n\t'Grossburgwedel',\n\t'Pradera',\n\t'Bela Vista do Paraiso',\n\t'Kilwinning',\n\t'Dunn Loring',\n\t'Bcharre',\n\t'Bhagirathpur',\n\t'Cabadbaran',\n\t'Hino',\n\t'Runcorn',\n\t'Santiago de Compostela',\n\t'Sotouboua',\n\t'Tecate',\n\t'Morasar',\n\t'Vanono',\n\t'Sankt Ingbert',\n\t'Jajce',\n\t'Xinyu',\n\t'Hochst im Odenwald',\n\t'Kawthoung',\n\t'Cherry Hill',\n\t'Riebeeckstad',\n\t'Cacheu',\n\t'Tranovaho',\n\t'Douar Sgarta',\n\t'Tlemcen',\n\t'Mandabe',\n\t'Idil',\n\t'Bohicon',\n\t'East Cocalico',\n\t'Wekiwa Springs',\n\t'Magdalena Milpas Altas',\n\t'South Charleston',\n\t'Dougba',\n\t'Glenwood Springs',\n\t'Dumfries',\n\t'Moyale',\n\t'Mabini',\n\t'Santa Terezinha de Goias',\n\t'Evergreen',\n\t'Watford',\n\t'Rabor',\n\t'Castel Mella',\n\t'Tanabe',\n\t'Tafaraoui',\n\t'Hilter',\n\t'Shujaabad',\n\t'Videm',\n\t'Kecskemet',\n\t'Obertraubling',\n\t'Folomana',\n\t'Novi Becej',\n\t'Molalla',\n\t'Hagta',\n\t'Tisina',\n\t'Raikal',\n\t'Wendell',\n\t'Canet-en-Roussillon',\n\t'Kennedy',\n\t'Herzberg am Harz',\n\t'San Simon',\n\t'Miyatoko',\n\t'Pali',\n\t'Copiapo',\n\t'Muhldorf',\n\t'Bambadinca',\n\t'Igbaras',\n\t'Kothi',\n\t'Souq Sebt Says',\n\t'San Rafael Abajo',\n\t'Halisahar',\n\t'Mamaroneck',\n\t'Varisshiyakuni',\n\t'Matsoandakana',\n\t'Burgas',\n\t'Bhanghi',\n\t'Beverly',\n\t'Raichur',\n\t'Tahannawt',\n\t'Tota',\n\t'Lunel',\n\t'Souk Tlet El Gharb',\n\t'Racine',\n\t'Stockerau',\n\t'Mazamitla',\n\t'Guachucal',\n\t'Malepur',\n\t'Sarikamis',\n\t'Gothenburg',\n\t'Suganwan',\n\t'Kirikkale',\n\t'Maghull',\n\t'Chonchi',\n\t'Ospitaletto',\n\t'Maria da Fe',\n\t'Chalandri',\n\t'Bobon',\n\t'Naqadah',\n\t'Martinopole',\n\t'Enghien',\n\t'Savigny-le-Temple',\n\t'Ramchandarpur',\n\t'Caio',\n\t'Belo',\n\t'Bukowno',\n\t'Tel Aviv-Yafo',\n\t'Avabodji',\n\t'Puerto America',\n\t'Hanson',\n\t'Huangshan',\n\t'Bulusan',\n\t'Domazlice',\n\t'Linkenheim-Hochstetten',\n\t'Suaza',\n\t'Mangalagiri',\n\t'Rocky River',\n\t'Tanakoub',\n\t'Canicatti',\n\t'Las Rosas',\n\t'Mahlaing',\n\t'Jelenia Gora',\n\t'Mathila',\n\t'Aizawa',\n\t'Itatiaia',\n\t'Neuri',\n\t'Chivacoa',\n\t'Arvorezinha',\n\t'Armanaz',\n\t'Buritizeiro',\n\t'Bien Hoa',\n\t'Bruchkobel',\n\t'Dolo Bay',\n\t'Lefkada',\n\t'Tasiusaq',\n\t'Pallappatti',\n\t'Kanchrapara',\n\t'San Roque',\n\t'Jefferson',\n\t'Santiago de Baney',\n\t'Kofu',\n\t'Harchandpur',\n\t'Moss Bluff',\n\t'Vushtrri',\n\t'Mithi',\n\t'Smederevska Palanka',\n\t'Apan',\n\t'Deodha',\n\t'Nallihan',\n\t'Guapo',\n\t\"Ghinda'e\",\n\t'Sar-e Pul',\n\t'Christiansburg',\n\t'Pont-a-Celles',\n\t'Overijse',\n\t'Trecastagni',\n\t'Oulad Embarek',\n\t'Dayr Hafir',\n\t'Caldas de Reyes',\n\t'Arkalochori',\n\t'Gafsa',\n\t'Cipolletti',\n\t'Kaikaram',\n\t'Shuangshuicun',\n\t'Iquitos',\n\t'Hazaribagh',\n\t'Bedidy',\n\t'Mayate',\n\t'Chumbicha',\n\t'Dilasag',\n\t'Karapa',\n\t'Petaling Jaya',\n\t'Castel Gandolfo',\n\t'Yevpatoriia',\n\t'Kuchaiburi',\n\t'Hanyu',\n\t'Horn Lake',\n\t'Kadiria',\n\t'Zhongba',\n\t'Godoy Cruz',\n\t'Malappuram',\n\t'East Peoria',\n\t'Markranstadt',\n\t'Livonia',\n\t'Dongen',\n\t'Golbasi',\n\t'Bhagwangola',\n\t'Elektrenai',\n\t'Hat Yai',\n\t'Saint John',\n\t'Torihama',\n\t'Galimuyod',\n\t'Raikot',\n\t'Bagre',\n\t'Komijan',\n\t'Ibia',\n\t'Holyhead',\n\t'Akwatia',\n\t'Elavanasur',\n\t'Tandag',\n\t'Chilwell',\n\t'Ciudad Ojeda',\n\t'Ciudad Serdan',\n\t'Radlett',\n\t'Vembarpatti',\n\t'Atripalda',\n\t'Gourock',\n\t'Anama',\n\t'Amblecote',\n\t'Excelsior Springs',\n\t'Dadu',\n\t'Offa',\n\t'Brindisi',\n\t'Kovilpatti',\n\t'Chrudim',\n\t'Cesson-Sevigne',\n\t'Mediouna',\n\t'Zengqiao',\n\t'Aguilares',\n\t'Siay',\n\t'Mananjary',\n\t'Kolarovo',\n\t'Melissia',\n\t'Stari Trg',\n\t'Viadana',\n\t'Stolberg',\n\t'Berekum',\n\t'Farako',\n\t'Joyabaj',\n\t'San Giorgio di Piano',\n\t'Carbonera',\n\t'Mackay',\n\t'Meltham',\n\t'Challapalle',\n\t'Saricam',\n\t'Tres Barras',\n\t'Cannes',\n\t'Upper Darby',\n\t'Arlington',\n\t'Sanxi',\n\t'Sanankoro Djitoumou',\n\t'Birur',\n\t'Manne Ekeli',\n\t'Regenstauf',\n\t'Midsalip',\n\t'Reggello',\n\t'Corinda',\n\t'Babatngon',\n\t'Bungku',\n\t'Zhangshu',\n\t'Idiofa',\n\t'Amboanana',\n\t'Langley',\n\t'Fishersville',\n\t'Mateare',\n\t'Linda',\n\t'Helena',\n\t'Hohenstein-Ernstthal',\n\t'Korla',\n\t'Bairuo',\n\t'Limoeiro do Ajuru',\n\t'Gandevi',\n\t'Rogers',\n\t'Dexing',\n\t'Padugaipattu',\n\t'Ilmenau',\n\t'Litovel',\n\t'Yasenivskyi',\n\t'Boca da Mata',\n\t'Sarkad',\n\t'Pawayan',\n\t'Avon Park',\n\t'Kondarangi Kiranur',\n\t'Novgorodskoye',\n\t'Nanattuparai',\n\t'Krishnapur',\n\t'Mendez-Nunez',\n\t'Alacam',\n\t'Pelissanne',\n\t'Colotlan',\n\t'Raahe',\n\t'Ridder',\n\t'Jisr ash Shughur',\n\t'Hoveyzeh',\n\t'Rokkasho',\n\t'Muquem de Sao Francisco',\n\t'Tsuru',\n\t'Ross-Betio',\n\t'Escanaba',\n\t'Tacana',\n\t'Traverse City',\n\t'Gounarou',\n\t'Fontaine',\n\t'Sahuarita',\n\t'Bracciano',\n\t'Araripina',\n\t'Gambissara',\n\t'Lumphat',\n\t'Gwangmyeongni',\n\t'Kirrayach',\n\t'University Place',\n\t'Unai',\n\t'Paracin',\n\t'Juara',\n\t'Ware',\n\t'Hilltown',\n\t'Summit Park',\n\t'Mislata',\n\t'Rottofreno',\n\t'Uniontown',\n\t'Kulu',\n\t'Bunia',\n\t'Ciudad Bolivar',\n\t'Gitagum',\n\t'Uniao dos Palmares',\n\t'Erumaippatti',\n\t'Pichhor',\n\t'Yuanlin',\n\t'Bulungu',\n\t'Kadakola',\n\t'Harur',\n\t'Raunheim',\n\t'Mothihari',\n\t'Malahide',\n\t'Macapa',\n\t'Mahabo',\n\t'Andonabe Atsimo',\n\t'Hita',\n\t'Salesopolis',\n\t'Tirkakara',\n\t'Malhargarh',\n\t'Oakengates',\n\t'Agrinio',\n\t'Whitehall',\n\t'Lapuyan',\n\t'Botticino Sera',\n\t'Tinoc',\n\t'Jiquilpan de Juarez',\n\t'Rockville Centre',\n\t'Ibatiba',\n\t'Ballina',\n\t'Broken Arrow',\n\t'Ziniare',\n\t'Clayton le Moors',\n\t'Fredensborg',\n\t'Kharod',\n\t'Umm al `Abid',\n\t'Goldenrod',\n\t'Yacopi',\n\t'Halsur',\n\t'Opoczno',\n\t'Kottapalle',\n\t'Ubrique',\n\t'Sodrazica',\n\t'Irakleia',\n\t'Sao Luis Gonzaga',\n\t'Sao Paulo do Potengi',\n\t'North Gates',\n\t'Alsip',\n\t'Choele Choel',\n\t'Antsiatsiaka',\n\t'Beocin',\n\t'Tenancingo',\n\t'Monselice',\n\t'Marpalli',\n\t'Yangqingcun',\n\t'Columbine',\n\t'Sahamadio',\n\t'San Nicolas Buenos Aires',\n\t'Tiruvur',\n\t'Anosimparihy',\n\t'Lariano',\n\t'Chaval',\n\t'Karavan',\n\t'Kingsbury',\n\t'Koduru',\n\t'Bangolo',\n\t'Heidenau',\n\t'Petrolina',\n\t'Archena',\n\t'Natonin',\n\t'Casalnuovo di Napoli',\n\t'Nova Odessa',\n\t'Kariz',\n\t'Caen',\n\t'Scugog',\n\t'Bangalore',\n\t'Zijinglu',\n\t'Catford',\n\t'Chakapara',\n\t'Safita',\n\t'Acquaviva',\n\t'Satai',\n\t'Ghabaghib',\n\t'La Spezia',\n\t'Iquique',\n\t'Barhampur',\n\t'Chalungalpadam',\n\t'Kerur',\n\t'Gulnar',\n\t'Banigbe',\n\t'Metamorfosi',\n\t\"Ma'muniyeh\",\n\t'Tura',\n\t'Seelze',\n\t'White Plains',\n\t'Reddippatti',\n\t'Ticuantepe',\n\t'Ntoroko',\n\t'Nairobi',\n\t'Glubczyce',\n\t'Safi',\n\t'Larne',\n\t'Sebin Karahisar',\n\t'Donegal',\n\t'Pasto',\n\t'Ceyhan',\n\t'East Grand Forks',\n\t'Qarqan',\n\t'Ferney-Voltaire',\n\t'Caybasi',\n\t'Ayanavelikulangara Tekku',\n\t'Derventa',\n\t'Homburg',\n\t'Zaouiet Says',\n\t'Jethuli',\n\t'Ketti',\n\t'Rochdale',\n\t'Zevio',\n\t'Made',\n\t'Eleskirt',\n\t'Iijima',\n\t'Rubirizi',\n\t'Mombris',\n\t'Santa Teresita',\n\t'Pedappai',\n\t'Vineland',\n\t'Saint-Amable',\n\t'Awara',\n\t'Betton',\n\t'Alsbach-Hahnlein',\n\t'Tongzhou',\n\t'Nopala de Villagran',\n\t'Propria',\n\t'Jawkatia',\n\t'Morrovalle',\n\t'Bella Vista',\n\t'Lufeng',\n\t'Lebach',\n\t'Wanda',\n\t'East Highland Park',\n\t'Phu Yen',\n\t'Masangshy',\n\t'Bou Sfer',\n\t'Kumirimora',\n\t'Shibushi',\n\t'Falticeni',\n\t'Wallington',\n\t'Bryn',\n\t'Dornstadt',\n\t'Sembe',\n\t'Onan',\n\t'Brandizzo',\n\t'Voerendaal',\n\t'Qaladizay',\n\t'Butwal',\n\t'Kunzell',\n\t'Dindanko',\n\t'Knezha',\n\t'Half Moon Bay',\n\t'Upleta',\n\t'Cambuslang',\n\t'Zupanja',\n\t'Ronse',\n\t'Seneca Falls',\n\t'Karlshamn',\n\t'Attippattu',\n\t'Terzigno',\n\t'Brumado',\n\t'Bangaon',\n\t'Szczecin',\n\t'Jauharabad',\n\t'Pisticci',\n\t'Gukeng',\n\t'Conceicao do Araguaia',\n\t'Saltash',\n\t'Parvomay',\n\t'Ban Wat Phrik',\n\t'Cabaiguan',\n\t'Awa',\n\t'Nemours',\n\t'Yukuhashi',\n\t'Bujari',\n\t'Jiwachhpur',\n\t'Rongwo',\n\t'Puerto Nare',\n\t'Anjomachi',\n\t'Lagbe',\n\t'Mickleover',\n\t'Mianyang',\n\t'Eshowe',\n\t'Bonnievale',\n\t'Radekhiv',\n\t'Sagauli',\n\t'Ankirihitra',\n\t'University Park',\n\t'Punjai Lakkapuram',\n\t'Hamlin',\n\t'Feni',\n\t'Legnica',\n\t'Gandhali',\n\t'Deyang',\n\t'Scotts Valley',\n\t'North Ogden',\n\t'Tocantinopolis',\n\t'Princesa Isabel',\n\t'Weert',\n\t'Chos Malal',\n\t'West Odessa',\n\t'Mawanella',\n\t'Aljaraque',\n\t'Majhariya',\n\t'Nagayalanka',\n\t'Tring',\n\t'Lenox',\n\t'Kebila',\n\t'Fatehpur Bala',\n\t'Mucheln',\n\t'Sangolqui',\n\t'Gohadi',\n\t'Komaki',\n\t'Malaudh',\n\t'Coquitlam',\n\t'Florencia',\n\t'Kalisizo',\n\t'Eslamshahr',\n\t'Tychy',\n\t'Lazaro Cardenas',\n\t'Pallarimangalam',\n\t'Yang Talat',\n\t'Arsuz',\n\t'Bhavani',\n\t'Maniwa',\n\t'Santa Luzia do Itanhy',\n\t'Oranienburg',\n\t'Huangshi',\n\t'Zaranj',\n\t'Halver',\n\t'Areado',\n\t'Hadjadj',\n\t'Balykchy',\n\t'Effingham',\n\t'Valley Stream',\n\t'Pinhao',\n\t'West New York',\n\t'Heishanzuicun',\n\t'Bordentown',\n\t'Inirida',\n\t'La Huerta',\n\t\"Sant'Egidio alla Vibrata\",\n\t'Dharapuram',\n\t'Ad Dulu`iyah',\n\t'Kaarina',\n\t'Rekovac',\n\t'Manitowoc',\n\t'Goroka',\n\t'Motul',\n\t'Narasingam',\n\t'Beckenham',\n\t'Kirkwood',\n\t'Kolondieba',\n\t'Pasadena',\n\t'Qo`ng`irot Shahri',\n\t'Winsen',\n\t'Mers el Kebir',\n\t'Poro',\n\t'Knjazevac',\n\t'Dajiecun',\n\t'Tangjin',\n\t'Karbinci',\n\t'Beykoz',\n\t'Amadeo',\n\t'Manamelkudi',\n\t'Tekanpur',\n\t'Busolwe',\n\t'Ac-cahrij',\n\t'Coroico',\n\t'Inhambane',\n\t'Jacinto',\n\t'Carlentini',\n\t'Skippack',\n\t'Federal',\n\t'Valenzano',\n\t'Zhangcun',\n\t'Loenen',\n\t'Muswellbrook',\n\t'Tamazunchale',\n\t'Moatize',\n\t'Port Salerno',\n\t'Lisbon',\n\t'Santo Estevao',\n\t'Irondequoit',\n\t'Levallois-Perret',\n\t'San Antonio Suchitepequez',\n\t'Zvecan',\n\t'Douar Lamjaara',\n\t'Winter Springs',\n\t'Bimawan',\n\t'Pentapadu Kasba',\n\t'Montijo',\n\t'Sena Madureira',\n\t'Virei',\n\t'Varzaneh',\n\t'Sariveliler',\n\t'Vatakemuri',\n\t'Machelen',\n\t'Nabunturan',\n\t\"Yong'ancun\",\n\t'Dalsingh Sarai',\n\t'Etoumbi',\n\t'Funadhoo',\n\t'Antur',\n\t'Superior',\n\t'Matouying',\n\t'Abucay',\n\t'Kengarai',\n\t'Paterna',\n\t'Saqqez',\n\t'Spring Creek',\n\t'Garaimari',\n\t'Nan Zhuang',\n\t'Jones',\n\t'Bou Khadra',\n\t'Rosh Ha`Ayin',\n\t'Adalhat',\n\t'Capaya',\n\t'Kuruman',\n\t'Chaoyangdicun',\n\t'Villacarrillo',\n\t'South Portland',\n\t'Bambui',\n\t'Apalit',\n\t'Biddupur',\n\t'Baqiabad',\n\t'Kostanjevica na Krki',\n\t'Rechaiga',\n\t'Morwell',\n\t'Koundian',\n\t'Higashimiyoshi',\n\t'Castro',\n\t'At Tur',\n\t'Pirnagar',\n\t'Vandalia',\n\t'Nellipaka',\n\t'Zerong',\n\t'Goodlands',\n\t'Hatay',\n\t'Bielsko-Biala',\n\t'Grosse Pointe Woods',\n\t'Ajijic',\n\t'Dhanupra',\n\t'Pachrukha',\n\t'Handwara',\n\t'Ranopiso',\n\t'Vallenar',\n\t'Santa Maria do Suacui',\n\t'Loyalist',\n\t'Chinameca',\n\t'Mahazoma',\n\t'Silifke',\n\t'Falakata',\n\t'Ghordaur',\n\t'Black Forest',\n\t'Dale City',\n\t'Ranbirsinghpura',\n\t'Ibiassuce',\n\t'Tetagunta',\n\t'Pereiro',\n\t'Marmagao',\n\t'Amparihy',\n\t'Ereymentau',\n\t'Heishuikeng',\n\t'As Salt',\n\t'Los Patios',\n\t'Masyaf',\n\t'Ban Sai Yoi',\n\t'Abre Campo',\n\t'El Maknassi',\n\t'Rosaryville',\n\t'Dupax Del Norte',\n\t'Kosai',\n\t'La Queue-en-Brie',\n\t'Rasulpur',\n\t'Chelm',\n\t'Caserta',\n\t'Devmaudaldal',\n\t'Biancavilla',\n\t'Nilaiyur',\n\t'Budhanilkantha',\n\t'Weyburn',\n\t'Schertz',\n\t'Bela Simri',\n\t'Kimje',\n\t'Jerome',\n\t'Rangapuram',\n\t'Sandalpur',\n\t'Nea Erythraia',\n\t'Entebbe',\n\t'San Bartolome',\n\t'Al Karnak',\n\t'Estepona',\n\t'Lempdes',\n\t'Zengjiaba',\n\t'Lipkovo',\n\t'Buckingham',\n\t'Bevoay',\n\t'Sokouhoue',\n\t'Tecklenburg',\n\t'Bochum',\n\t'San Luis Talpa',\n\t'Ijui',\n\t'Woodlyn',\n\t'Capivari',\n\t'Purna',\n\t'Bayugan',\n\t'Imbert',\n\t'Durgauti',\n\t'Belen de los Andaquies',\n\t'Menghan',\n\t'Gangapur Athar',\n\t'Inza',\n\t'Tiaong',\n\t'Cagliari',\n\t'Inverness',\n\t'Ciudad Sahagun',\n\t'Gerakas',\n\t'Vubatalai',\n\t'Ratauli',\n\t'Catalao',\n\t'Telsen',\n\t'Secovce',\n\t'Sirugamani',\n\t'Lake Norman of Catawba',\n\t'Vevey',\n\t'Quakers Hill',\n\t'Struga',\n\t'Amarwara',\n\t'Mont-Saint-Martin',\n\t'Nova Crnja',\n\t'Hirehalli',\n\t'Ablu',\n\t'Llavallol',\n\t'El Almendro',\n\t'Ad Darwa',\n\t'Bietigheim-Bissingen',\n\t'Ul',\n\t'Indianola',\n\t'Ankisabe',\n\t'Minster',\n\t\"Wik'ro\",\n\t'Barapire',\n\t'A Yun Pa',\n\t'Retirolandia',\n\t'Shahkot',\n\t'Itaberaba',\n\t'Pilappulli',\n\t'Coesfeld',\n\t'Azare',\n\t'Dix Hills',\n\t'Nazira',\n\t'Velen',\n\t'Mnichovo Hradiste',\n\t'Cedar City',\n\t'Bofete',\n\t'Haiphong',\n\t'Tokmok',\n\t'Goianapolis',\n\t'Texas City',\n\t'Marakkara',\n\t'Cameli',\n\t'Lundazi',\n\t'Antanambaobe',\n\t'Akhmim',\n\t'Abhayapuri',\n\t'Saint-Philbert-de-Grand-Lieu',\n\t'Lutterworth',\n\t'Vinci',\n\t'Kidlington',\n\t'Sao Joao',\n\t'Leopold',\n\t'Vigevano',\n\t'Croix-des-Bouquets',\n\t'Zele',\n\t'Ibateguara',\n\t'West Lealman',\n\t'Taran',\n\t'Pingshang',\n\t'Douar Ait Sidi Daoud',\n\t'San Martin',\n\t'Bajram Curri',\n\t'Fouesnant',\n\t'Hosbach',\n\t'Jiamusi',\n\t'Mendi',\n\t'Gennevilliers',\n\t'Suramala',\n\t'Lambunao',\n\t'Guatuba',\n\t'Hassi Bahbah',\n\t'Mineral del Monte',\n\t'Menglie',\n\t'Chitarpur',\n\t'Cristopolis',\n\t'Ad Diwem',\n\t'Tocopilla',\n\t'Calella',\n\t'Bedwas',\n\t'Sarur',\n\t'Wuhai',\n\t'Flero',\n\t'Jork',\n\t'Juma Shahri',\n\t'Hawtat Sudayr',\n\t'Viyapuram',\n\t'La Nucia',\n\t'Chalhuanca',\n\t'`Utaybah',\n\t'Ilkley',\n\t'Bloomfield',\n\t'Dobhawan',\n\t'Chempalli',\n\t'Tipo-Tipo',\n\t'Risch',\n\t'Marosangy',\n\t'Kirchheim bei Munchen',\n\t'Ubaira',\n\t'Maragondon',\n\t'Al `Aydabi',\n\t'Lamia',\n\t'Chippewa Falls',\n\t'Ora',\n\t'Androy',\n\t'Valle del Guamuez',\n\t'Sykies',\n\t'Barahari',\n\t'Peters',\n\t'Naxcivan',\n\t'Anderlues',\n\t'Doraville',\n\t'Banaue',\n\t'Eersel',\n\t'Ganapatipalaiyam',\n\t'Bernal',\n\t'Tole Bi',\n\t'Badiangan',\n\t'Newry',\n\t'Boom',\n\t'Baguineda',\n\t'Thulusdhoo',\n\t'Kanniyakumari',\n\t'Ramagiri Udayagiri',\n\t'Tangjiacun',\n\t'Naranattenvanpatti',\n\t'Megarine',\n\t'Angallu',\n\t'Yeni Suraxani',\n\t'Gudimulakhandrika',\n\t'Port-Alfred',\n\t'Bantval',\n\t'Banska Bystrica',\n\t'Ratanpur',\n\t'Sihui',\n\t'Ambohimangakely',\n\t'Mineshita',\n\t'San Rafael',\n\t'Bhambia Bhai',\n\t'Nauheim',\n\t'Russellville',\n\t'Naushahro Firoz',\n\t'Sarvestan',\n\t'Pagalungan',\n\t'Carsibasi',\n\t'Emirgazi',\n\t'Ciudad Rio Bravo',\n\t'Proddatur',\n\t'Bruz',\n\t'Bartlett',\n\t'Yeadon',\n\t'Timbedgha',\n\t'Rishton',\n\t'Thaba-Tseka',\n\t'Pappampatti',\n\t'Alianca',\n\t'Skowhegan',\n\t'Gongzhuling',\n\t'Port Arthur',\n\t'Budingen',\n\t'Vallam',\n\t'Agios Ioannis Rentis',\n\t'Birine',\n\t'Quirino',\n\t'Honeygo',\n\t'Usulutan',\n\t'Abram',\n\t'Taranto',\n\t'Tyrnavos',\n\t'Nagongera',\n\t'Farsan',\n\t'Santa Rita',\n\t'Bueno Brandao',\n\t'Amingarh',\n\t'Port Loko',\n\t'Hellevoetsluis',\n\t'Surigao',\n\t'Pattamadai',\n\t'Balsas',\n\t'Matipo',\n\t'Onitsha',\n\t'Strasshof an der Nordbahn',\n\t'Rochefort',\n\t'Doral',\n\t'Limoeiro',\n\t'Ambalanjanakomby',\n\t'Cohoes',\n\t'Jaguaruana',\n\t'Vadakethara',\n\t'Prospect Heights',\n\t'Bonita',\n\t'Jarvenpaa',\n\t'Baj Baj',\n\t'Alamadi',\n\t'Nanzhou',\n\t'Sanatoga',\n\t'Arruda dos Vinhos',\n\t'Malapatan',\n\t'Soroti',\n\t'Dargahan',\n\t'Meze',\n\t'Pemangkat',\n\t'Dinagat',\n\t'Villemomble',\n\t'Donetsk',\n\t'Viru',\n\t'Dazhangzicun',\n\t'Vigneux-sur-Seine',\n\t'Amolatar',\n\t'Nemili',\n\t'Nagykanizsa',\n\t'Kedgaon',\n\t'Boumia',\n\t'Guisa',\n\t'Maur',\n\t'Saint-Laurent-du-Maroni',\n\t'Chenggong',\n\t'Rengali',\n\t'Bacau',\n\t'Kaunra',\n\t'Ballyfermot',\n\t'Aurahi',\n\t'Perito Moreno',\n\t'Shetang',\n\t'Suwon',\n\t'Virappanchathiram',\n\t'Celje',\n\t'Turhal',\n\t'Taquari',\n\t'Ikot Ekpene',\n\t'Allinagaram',\n\t'Bolintin Vale',\n\t'Maga',\n\t'Kolnad',\n\t'Sori',\n\t'Totoro',\n\t'San Rafael Obrajuelo',\n\t'Alayaman',\n\t'Ouani',\n\t'Tadla',\n\t'Pirque',\n\t'Cuxhaven',\n\t'Zhongzai',\n\t'Aliwal North',\n\t'Plum',\n\t'Saint Helier',\n\t'Dongcha',\n\t'Gokarn',\n\t'Sassandra',\n\t'Balneario do Rincao',\n\t'Kafr Buhum',\n\t'Hlukhiv',\n\t'Sandacho',\n\t'Arizona City',\n\t'Silamalai',\n\t'Mohanpur',\n\t'Diaobingshancun',\n\t'Ratekau',\n\t'Halgar',\n\t'Albertville',\n\t'Gadani',\n\t'Ascheberg',\n\t'Godda',\n\t'Tangdong',\n\t'Sholinghur',\n\t'Zuidlaren',\n\t'Jadopur Shukul',\n\t'Ekalbehri',\n\t'Puerto Plata',\n\t'Ambatturai',\n\t'Masanwa',\n\t'Crystal',\n\t'Dasungezhuang',\n\t'Eenhana',\n\t'Xiangtan',\n\t'Arbon',\n\t'Jerez de la Frontera',\n\t'Barkagaon',\n\t'Sumter',\n\t'Maroochydore',\n\t'Rach Gia',\n\t'Mirna Pec',\n\t'St. John',\n\t'Medianeira',\n\t'Muqui',\n\t'Farah',\n\t'Dedougou',\n\t'Manduri',\n\t'Monserrat',\n\t'Myrnohrad',\n\t'Segbana',\n\t'Gelnhausen',\n\t'Chuanliaocun',\n\t'Reshetylivka',\n\t'College Station',\n\t'Wum',\n\t'Imst',\n\t'Kumar Khad',\n\t'Bjarred',\n\t'Ambatofisaka II',\n\t'Nocatee',\n\t'Kanel',\n\t'Philipstown',\n\t'Torrevieja',\n\t'Frankfort Square',\n\t'Gudur',\n\t'Oak Grove',\n\t'Santana',\n\t'Polukallu',\n\t'Kanhai',\n\t'Trapani',\n\t'Sanchez-Mira',\n\t'Wangtuan',\n\t'Punta del Este',\n\t'Zevenaar',\n\t'Ban Tha Pha',\n\t'Sainte-Marie',\n\t'Karonga',\n\t'Cremlingen',\n\t'Ramallah',\n\t'Gatumba',\n\t'Caowotan',\n\t'Tomah',\n\t'Lorraine',\n\t'Odumase',\n\t'Amritsar',\n\t'Vlasim',\n\t'Yangcunzai',\n\t'Prataparampuram',\n\t'Indurti',\n\t'Tanjay',\n\t'Brzeg',\n\t'Manthani',\n\t'Passa Quatro',\n\t'Dallas',\n\t'Chinnatadagam',\n\t'Roxborough Park',\n\t'Ban Wang Pradu',\n\t'Were Ilu',\n\t'Tourcoing',\n\t'Shimokizukuri',\n\t'Dehui',\n\t'Ithaca',\n\t'Hamtic',\n\t'Saint-Zotique',\n\t'Mossendjo',\n\t'Ban Bo Phlap',\n\t'Arar',\n\t'Meekatharra',\n\t'Ghouazi',\n\t'Amora',\n\t'Yongji',\n\t'Nurtingen',\n\t'Pantar',\n\t'Yantai',\n\t'Shamli',\n\t'Sidi Kasem',\n\t'League City',\n\t'Ylojarvi',\n\t'Chakpi Karong',\n\t'Lehman',\n\t'Gunzenhausen',\n\t'Pirpirituba',\n\t'Titz',\n\t'Vynnyky',\n\t'Nicolas Romero',\n\t'Tekit',\n\t'Prinzapolka',\n\t'Nueva Esparta',\n\t'Hedongcun',\n\t'Lobougoula',\n\t'Socuellamos',\n\t'East Hemet',\n\t'Sebiston',\n\t'Ban Laem',\n\t'Mukono',\n\t'Mineiros do Tiete',\n\t'Warrnambool',\n\t'Normandia',\n\t'Monte Alegre',\n\t'Volda',\n\t'Yasothon',\n\t'Kearny',\n\t'Kahan',\n\t'Mihqan',\n\t'Playa Vicente',\n\t'Shimoga',\n\t'Konseguela',\n\t'Outapi',\n\t'Layton',\n\t'Brock Hall',\n\t'Kilsyth',\n\t'Al Mukalla',\n\t'Dhamtari',\n\t'Alijo',\n\t'Alacuas',\n\t'Higashiizu',\n\t'Lopez',\n\t'Ta`izz',\n\t'Corato',\n\t'Chuhuiv',\n\t'Albacete',\n\t'Gundumal',\n\t'Sidi Embarek',\n\t'Calais',\n\t'Camapua',\n\t'Portogruaro',\n\t'Bad Langensalza',\n\t'Tecolotlan',\n\t'Roseburg',\n\t'Saint-Jerome',\n\t'Sandila',\n\t'Coldwater',\n\t'Zhongcun',\n\t'Westonaria',\n\t'Pattanam',\n\t'Guihulngan',\n\t'Phaphot',\n\t'Huili Chengguanzhen',\n\t'Mabinay',\n\t'Bothell East',\n\t'Banavar',\n\t'Nallippalaiyam',\n\t'Quetigny',\n\t'Tsuno',\n\t'Geiro',\n\t'Zarrin Shahr',\n\t'Balpyq Bi',\n\t'San Antonio Oeste',\n\t'Krasnohorivka',\n\t'Bled',\n\t'Ama',\n\t'Lototla',\n\t'Azzano',\n\t'Ivai',\n\t'Mitanty',\n\t'Calicut',\n\t'Chelghoum el Aid',\n\t'Kitee',\n\t'Koffiefontein',\n\t'Fair Oaks Ranch',\n\t'Sao Marcos',\n\t'Disuq',\n\t'Bouzeghaia',\n\t'Hudson',\n\t'Fortuna Foothills',\n\t'Raska',\n\t'Rafah',\n\t'Birsfelden',\n\t'Loon',\n\t'Ivrindi',\n\t'Pacho',\n\t'Sasaguri',\n\t'Oroville',\n\t'Odiongan',\n\t'Bagua Grande',\n\t'Dera Ghazi Khan',\n\t'Moorslede',\n\t'Pilkha',\n\t'Kalar',\n\t'Odawara',\n\t'Monte Belo',\n\t'Ludwigsfelde',\n\t'Lopary',\n\t'Boriguma',\n\t'Storrs',\n\t'Khrystynivka',\n\t'Villa Aldama',\n\t'Sirali',\n\t'Bulwell',\n\t'Vadacheri',\n\t'Aytre',\n\t'Kwidzyn',\n\t'Furukawa',\n\t'Sukand',\n\t'Esquimalt',\n\t'Caraubas',\n\t'Antsohimbondrona',\n\t'Waltham Abbey',\n\t'Sagua la Grande',\n\t'Taulaha',\n\t'Roslyn',\n\t'Hale Dyamavvanahalli',\n\t'Cortona',\n\t'Minnal',\n\t'Brunoy',\n\t'Kunisakimachi-tsurugawa',\n\t'Rincao',\n\t'Golden Glades',\n\t'Matsuda-soryo',\n\t'Pirauba',\n\t'Ghriss',\n\t'Mopipi',\n\t'Chateauroux',\n\t'Chortkiv',\n\t'Theniet el Had',\n\t'Balkh',\n\t'Casalecchio di Reno',\n\t'Guacimo',\n\t'Arona',\n\t'Novaci',\n\t'Diakon',\n\t'Taunusstein',\n\t'Sawangan',\n\t'Jigani',\n\t'Parabita',\n\t'Candaba',\n\t'Jardim Alegre',\n\t'Berovo',\n\t'Cascina',\n\t'Ambohijanaka',\n\t'Sao Tome',\n\t'Cleethorpes',\n\t'Kalmunai',\n\t'Vaslui',\n\t'Fort William',\n\t'Bolobo',\n\t'Sanlucar la Mayor',\n\t'El Hajeb',\n\t'Quesnel',\n\t'Leuwiliang',\n\t'Caraibas',\n\t'Sugaon',\n\t'Villers-Cotterets',\n\t'Santamesa',\n\t'Santa Teresinha',\n\t'Anosibe-Ifanja',\n\t'Agarpur',\n\t'Kutavettur',\n\t'Itapetinga',\n\t'Lubsko',\n\t'Banbalah',\n\t'Tala',\n\t'Arcachon',\n\t'Muturkha',\n\t'Miyazu',\n\t'Akcadag',\n\t'Castaic',\n\t'Xindian',\n\t'Los Hidalgos',\n\t'Kekava',\n\t'Jacala',\n\t'Lapseki',\n\t'Cartaxo',\n\t'Londerzeel',\n\t'Ermua',\n\t'Ipiranga',\n\t'Trat',\n\t'Guiglo',\n\t\"Sant'Antioco\",\n\t'Linton Hall',\n\t'Huaiyin',\n\t'San Salvador de Jujuy',\n\t'Ksour Essaf',\n\t'El Quisco',\n\t'Central',\n\t'Muttupet',\n\t'Juan de Herrera',\n\t'Qaryat Suluq',\n\t'Kressbronn am Bodensee',\n\t'Kall',\n\t'Thingangyun',\n\t'Lauf',\n\t'Villa de Alvarez',\n\t'Sipacate',\n\t'Andirin',\n\t\"Cournon-d'Auvergne\",\n\t'Bhayandar',\n\t'Borongan',\n\t'Meerane',\n\t'Pekanbaru',\n\t'Szczytno',\n\t'Obu',\n\t'Chinnalapatti',\n\t'Angalakurichchi',\n\t'Caldas de Montbuy',\n\t'Altata',\n\t'Sonepur',\n\t'Benisa',\n\t'San Lucas Toliman',\n\t'Japeri',\n\t'Ecublens',\n\t'Kowloon',\n\t'Ivancna Gorica',\n\t'Bougzoul',\n\t'Jelcz-Laskowice',\n\t'Engenheiro Beltrao',\n\t'Stonecrest',\n\t'Cheltenham',\n\t'Ospino',\n\t'Qingdao',\n\t'Port Lavaca',\n\t'Weichanglu',\n\t'Gudiyattam',\n\t'Fujikawa',\n\t'Bamhni',\n\t'Porterville',\n\t'El Khemis des Beni Chegdal',\n\t'Surany',\n\t'Knurow',\n\t'Znamianka',\n\t'Huntersville',\n\t'El Eulma',\n\t'Bungoma',\n\t'Al Kharjah',\n\t'Rivesaltes',\n\t'Denzlingen',\n\t'Pul-e Khumri',\n\t'Niedernhausen',\n\t'Nova Floresta',\n\t'Cazin',\n\t'Virginia Beach',\n\t'Cassino',\n\t'Finnentrop',\n\t'Khajuri',\n\t'Cotabato',\n\t'Mahamaibe',\n\t'Aksu',\n\t'Campbellton',\n\t'Panay',\n\t'Otofuke',\n\t'Sarria',\n\t'Oklahoma City',\n\t'Waggaman',\n\t'Powdersville',\n\t'Ambongamarina',\n\t'Mirpur Khas',\n\t'Jamhor',\n\t'Florham Park',\n\t'Seram',\n\t'Senda',\n\t'Mancha Real',\n\t'Mint Hill',\n\t'Eggenstein-Leopoldshafen',\n\t'Bachhraon',\n\t'Friern Barnet',\n\t'Toboso',\n\t'Caledonia',\n\t'Dawley',\n\t'Bataredh',\n\t'Podenzano',\n\t'Hemiksem',\n\t'Pielisjarvi',\n\t'Pursa',\n\t'Marsabit',\n\t'Malar',\n\t'Tabubil',\n\t'White Meadow Lake',\n\t'Winter Garden',\n\t'Ryuo',\n\t'Jequie',\n\t'Ravar',\n\t'Gudalur',\n\t'Yenisehir',\n\t'Brookings',\n\t'Hamtramck',\n\t'Orizona',\n\t'Saint-Ouen',\n\t'Wietze',\n\t'Hwange',\n\t'Barentu',\n\t'Yedappalli',\n\t'Caucagua',\n\t'Gudensberg',\n\t'New Hope',\n\t'Benaguacil',\n\t'Aymangala',\n\t'Waltham',\n\t'Horndean',\n\t'Torquay',\n\t'Amulung',\n\t'Woolwich',\n\t'Sentjur',\n\t'Gondauli',\n\t'Krosno',\n\t'Nagasaki',\n\t'Luebo',\n\t'Sogutlu',\n\t'Valle de Santiago',\n\t'Ranzan',\n\t'Chachoengsao',\n\t'Golpayegan',\n\t'Mocuba',\n\t'Warrington',\n\t'Yercaud',\n\t'Capinzal',\n\t'Paullo',\n\t'Ozark',\n\t'Kargahia Purab',\n\t'Villanueva',\n\t'Jbabra',\n\t'Chunar',\n\t'Likiskiai',\n\t'Al Husayniyah',\n\t'Rockcreek',\n\t'Chichicastenango',\n\t'Siasi',\n\t'Beni Zouli',\n\t'Saint-Hilaire-de-Riez',\n\t'Devgeri',\n\t'Arniya',\n\t'Dennis',\n\t'Bopa',\n\t'East Norriton',\n\t'Marancheri',\n\t'Kalghatgi',\n\t'Andkhoy',\n\t'Dinanagar',\n\t'Kaifeng Chengguanzhen',\n\t'Jieshangya',\n\t'Yima',\n\t'Gamu',\n\t'Safashahr',\n\t'Pervari',\n\t'Agoue',\n\t'Presidente Franco',\n\t'Bad Homburg',\n\t'Taveta',\n\t'Croxley Green',\n\t'Bani',\n\t'Liberal',\n\t'Santa Maria de Ipire',\n\t'Hranice',\n\t'Mery-sur-Oise',\n\t'Ipupiara',\n\t'Takanabe',\n\t\"G'allaorol Shahri\",\n\t'Syke',\n\t'Sembabule',\n\t'Kenley',\n\t'Bishnah',\n\t'Santa Lucia Milpas Altas',\n\t'Ahfir',\n\t'Virudunagar',\n\t'Cuapiaxtla de Madero',\n\t'Erquelinnes',\n\t'Galanta',\n\t'Islington',\n\t'Alaca',\n\t'Ganca',\n\t'Colcapirhua',\n\t'Katano',\n\t'White Oak',\n\t'Burgos',\n\t'Macalelon',\n\t'Bullhead City',\n\t'Obukhivka',\n\t'Krupka',\n\t'Rovaniemi',\n\t'Vrapciste',\n\t'Puerto Padre',\n\t'Cristalina',\n\t'Drug',\n\t'Bocono',\n\t'Abaji',\n\t'Annoeullin',\n\t'Savja',\n\t'El Coco',\n\t'Vauvert',\n\t'Rumbek',\n\t'Tettnang',\n\t'Tatsuno',\n\t'Olton',\n\t'Kabinda',\n\t'Miami Shores',\n\t'Chinnasekkadu',\n\t'Cotia',\n\t'Sapiranga',\n\t'Bad Rappenau',\n\t'Sharunah',\n\t'Cormeilles-en-Parisis',\n\t'Dossenheim',\n\t'Ozarow Mazowiecki',\n\t'Pichucalco',\n\t'Dowlaiswaram',\n\t'Palm Harbor',\n\t'Longba',\n\t'Chinique',\n\t'Roscoe',\n\t'Douar Oulad Bouziane',\n\t'Dayr az Zawr',\n\t'French Valley',\n\t'Kalasa',\n\t'Cave Spring',\n\t'Yakage',\n\t'Phagu',\n\t'Taishituncun',\n\t'Sumisip',\n\t'Littleport',\n\t'Kulachi',\n\t'Saravena',\n\t'Aguai',\n\t'Nederweert',\n\t'Haskoy',\n\t'Saguday',\n\t'Shushtar',\n\t'Cuilapa',\n\t'Formigine',\n\t'Kalateh-ye Mir Ab',\n\t'Farsund',\n\t'Ripon',\n\t'Munich',\n\t'Himora',\n\t'Banamba',\n\t'Mkokotoni',\n\t'Anori',\n\t'Hartsville',\n\t'Thikri',\n\t'Xiantao',\n\t'Libmanan',\n\t'Shahritus',\n\t'Hayle',\n\t'Arakkal',\n\t'Hoa Thanh',\n\t'Chetumal',\n\t'Cormano',\n\t'Witham',\n\t'Cleveland Heights',\n\t'Ludus',\n\t'Tolanaro',\n\t'Saint-Doulchard',\n\t'Pradopolis',\n\t'Lourdes',\n\t'Siswar',\n\t'Alabaster',\n\t'Kasibu',\n\t'Saint-Leu-la-Foret',\n\t'Sakaddi',\n\t'Entre Ijuis',\n\t'Bilina',\n\t'Boyovut',\n\t'Ambohinihaonana',\n\t'Patrasaer',\n\t'North Augusta',\n\t'Ciudad Nezahualcoyotl',\n\t'Jenks',\n\t'Shiyuan',\n\t'San Carlos Yautepec',\n\t'Kabarore',\n\t'Durban',\n\t'Dajabon',\n\t'Leognan',\n\t\"Chech'on\",\n\t'Guelma',\n\t'Rossmoor',\n\t'Cano Martin Pena',\n\t'Standerton',\n\t'Kaimuh',\n\t'Bellflower',\n\t'Sibutu',\n\t'Guateque',\n\t'Vejer de la Frontera',\n\t'Gornalwood',\n\t'Serhetabat',\n\t'Kondayampalaiyam',\n\t'Andal',\n\t'Kingersheim',\n\t'Ait Ben Daoudi',\n\t'Ixhuatlancillo',\n\t'Song Doc',\n\t'Schoten',\n\t'Gan Yavne',\n\t'Koprivnice',\n\t'Wadi',\n\t'Belvidere',\n\t'Haibach',\n\t'Chishtian',\n\t'Ras El Oued',\n\t'New Haven',\n\t'Alamuru',\n\t'Qaminis',\n\t'Saint-Eustache',\n\t'Port Wentworth',\n\t'Hashimoto',\n\t'Thara',\n\t'Qingzhen',\n\t'Sancti Spiritus',\n\t'Andiyappanur',\n\t'Pozi',\n\t'Songnam',\n\t'Alken',\n\t'Horsens',\n\t'Al Hashimiyah',\n\t'Vanadzor',\n\t'Fatehpur',\n\t'Necochea',\n\t'Sagbayan',\n\t'La Virgen',\n\t'Villagran',\n\t'Elyria',\n\t'Perunkolattur',\n\t'Talavadi',\n\t'Melrose',\n\t'Penaranda',\n\t'Aroeiras',\n\t'Caucasia',\n\t'Maryland Heights',\n\t'Ambatomifanongoa',\n\t'Fairfield',\n\t'Liuquancun',\n\t'Siqueira Campos',\n\t'Villa Carlos Paz',\n\t'Blitta',\n\t'Ciudad de Melilla',\n\t'Arajpur',\n\t'Pantano Grande',\n\t'Central Signal Village',\n\t'Tirumuruganpundi',\n\t'Vilakkudi',\n\t'Kavadarci',\n\t'La Plata',\n\t'Short Pump',\n\t'Shivganj',\n\t'Fangasso',\n\t'Douar Ain Maatouf',\n\t'Harlau',\n\t'Egypt Lake-Leto',\n\t'Greiz',\n\t'Al Khums',\n\t'Inabanga',\n\t'Ylivieska',\n\t'Halmstad',\n\t'West St. Paul',\n\t'Boudouaou',\n\t'Banaybanay',\n\t'Pinheiro Machado',\n\t'Bongao',\n\t'Parras de la Fuente',\n\t'Tabhka Khas',\n\t'Basingstoke',\n\t'Ovejas',\n\t'Bandwar',\n\t'Abu Ghurayb',\n\t'Bekescsaba',\n\t'Arutla',\n\t'Kadwa',\n\t'Kyaukse',\n\t'North Bethesda',\n\t'Jilotepec',\n\t'Kafr `Awan',\n\t'Takua Pa',\n\t'Aberystwyth',\n\t'Bataipora',\n\t'Timmarasanayakkanur',\n\t'Aradippou',\n\t'Khampat',\n\t'Caln',\n\t'Ambodimadiro',\n\t'Paso de Ovejas',\n\t'Manavalakurichi',\n\t'Chajari',\n\t'Jacarei',\n\t'Bals',\n\t'Bishkek',\n\t'Ikela',\n\t'Saladoblanco',\n\t'Sirsilla',\n\t'Dara',\n\t'Wuchang',\n\t'Haiyang',\n\t'Arida',\n\t'Kalaiyamputtur',\n\t\"'Tlat Bni Oukil\",\n\t'Dixon',\n\t'Mogi das Cruzes',\n\t'Tizi Ouzou',\n\t'Hopkinton',\n\t'Buchanan',\n\t'Amami',\n\t'Juiz de Fora',\n\t'Kargipinar',\n\t'Saint-Orens-de-Gameville',\n\t'Charlton',\n\t'Dortyol',\n\t'Parepare',\n\t'Cadaado',\n\t'Boryspil',\n\t'Marina del Rey',\n\t'Uchen',\n\t'Betulia',\n\t'Kerema',\n\t'Chartoun',\n\t'Shajapur',\n\t'Brooks',\n\t'Nova Odesa',\n\t'Sogne',\n\t'Sarahandrano',\n\t'Nea Ionia',\n\t'Sumidouro',\n\t'Yayladagi',\n\t'Cesky Krumlov',\n\t'Tay Ninh',\n\t'Ottweiler',\n\t'Pedro Brand',\n\t'Neka',\n\t'Masse',\n\t'Darcheh',\n\t'Adelphi',\n\t'Melur',\n\t'Bergneustadt',\n\t'Salempur',\n\t'Avanigadda',\n\t'Guruvarajukuppam',\n\t'Chandwa',\n\t'Saclepea',\n\t'Kathanian',\n\t'Kari',\n\t'San Jacinto',\n\t'Southall',\n\t'Jinja',\n\t'Sungaiselam',\n\t'Sirmaur',\n\t'Friedland',\n\t'Alpine',\n\t'Kerben',\n\t'Lubaczow',\n\t'Ambodimangavolo',\n\t'Chuxiong',\n\t'Ciudad Mante',\n\t'Chorkuh',\n\t'Indalvai',\n\t'Fengruncun',\n\t'Azpeitia',\n\t'Sallisaw',\n\t'Karanganyar',\n\t'Tokmak',\n\t'Baripada',\n\t'St. Marys',\n\t'Platon Sanchez',\n\t'Bugembe',\n\t'Nihtaur',\n\t'Kharsod B',\n\t'Shahriar',\n\t'Jabbeke',\n\t'Mogtedo',\n\t'Mayorga',\n\t'Rastatt',\n\t'Prairie Village',\n\t'Hato Corozal',\n\t'Dubuque',\n\t'Rocha',\n\t'Pataskala',\n\t'Blue Ash',\n\t'Sarandi',\n\t'Nkayi',\n\t'Coldstream',\n\t'Guru Har Sahai',\n\t'Gardanne',\n\t'Waukesha',\n\t'Saran',\n\t'Alfred and Plantagenet',\n\t'Tiadiaye',\n\t'Huchuan',\n\t'Lujan de Cuyo',\n\t'Fundao',\n\t'Ben Tre',\n\t'Balingasag',\n\t'Safipur',\n\t'Mitoyo',\n\t'At Taji',\n\t'Doany',\n\t'Fuyuan',\n\t'Hayesville',\n\t'Schwerin',\n\t'Phelan',\n\t'Bethanie',\n\t'Weymouth',\n\t'Kibanseke Premiere',\n\t'Buey Arriba',\n\t'Ibotirama',\n\t'Yamaguchi',\n\t'Vadasseri',\n\t'Wantage',\n\t'Iaboutene',\n\t'Karlivka',\n\t'Manabo',\n\t'San Kamphaeng',\n\t'El Hermel',\n\t'Corrente',\n\t'Voisins-le-Bretonneux',\n\t'Vemuluru',\n\t'Jasauli Patti',\n\t'Paraguacu Paulista',\n\t'Umreth',\n\t'Rakovski',\n\t'Kottagudi Muttanad',\n\t'Sao Felix do Araguaia',\n\t'Huong Tra',\n\t'Yukon',\n\t'Miena',\n\t'Datang',\n\t'Petrich',\n\t'Tholen',\n\t'Mosopa',\n\t'Fara in Sabina',\n\t'Alesund',\n\t'Penwortham',\n\t'Poyo',\n\t'Ruma',\n\t'Scorze',\n\t'Cedral',\n\t'Forest Grove',\n\t'Szeged',\n\t'Firavahana',\n\t'Bagno a Ripoli',\n\t'Caravelas',\n\t'Horn-Bad Meinberg',\n\t'Porto Alegre do Norte',\n\t'Shtime',\n\t'Raba',\n\t'Chisec',\n\t'Lagunia Raghukanth',\n\t'Ensenada Berisso',\n\t'Do`stobod',\n\t'Amarpur',\n\t'Lunca Cetatuii',\n\t'Dagupan City',\n\t'Saumlaki',\n\t'Karkamb',\n\t'Sobrado de Paiva',\n\t'Kalappalangulam',\n\t'Joao Lisboa',\n\t'The Dalles',\n\t'Slateng Dua',\n\t'Lingwala',\n\t'Latiano',\n\t'Orangeville',\n\t'Borazjan',\n\t'Pizarro',\n\t'Pilich',\n\t'Veintiocho de Noviembre',\n\t'Huntington Park',\n\t'Jesus Menendez',\n\t\"'Ain Abessa\",\n\t'Descalvado',\n\t'Krapina',\n\t'Harwood Heights',\n\t'Banco Filipino International Village',\n\t'Guadarrama',\n\t'Channagiri',\n\t'Mokri',\n\t'Sanjiang',\n\t'Kokri',\n\t'Tirkha',\n\t'Zhangjiakou',\n\t'Veresegyhaz',\n\t'Zhuanghe',\n\t'Balkonda',\n\t'Siemiatycze',\n\t'Ban Saeo',\n\t'Torrijos',\n\t'Faches-Thumesnil',\n\t'Campo Alegre de Lourdes',\n\t'Francofonte',\n\t'Alarobia',\n\t'Worthing',\n\t'Rochelle',\n\t'Ilvesheim',\n\t'Billings',\n\t'Batangas',\n\t'Vochaiko',\n\t'Zaragoza',\n\t'Heppenheim',\n\t'La Mana',\n\t'Son Tay',\n\t'Magilampupuram',\n\t'Logrono',\n\t'Chiavari',\n\t'Gujan-Mestras',\n\t'Katako-Kombe',\n\t'Chaparral',\n\t'Batie',\n\t'Foligno',\n\t'University',\n\t'Iruttarakonam',\n\t'Kotla',\n\t'East Hanover',\n\t'Jomboy Shahri',\n\t'Changanacheri',\n\t'Kensington',\n\t'Dobje',\n\t'Maisons-Laffitte',\n\t'Oroquieta',\n\t'Parambatt Kavu',\n\t'Dois Riachos',\n\t'Latina',\n\t'Babhanganwa',\n\t'Ambohimahasoa',\n\t'Pandino',\n\t'Chefchaouene',\n\t'Teixeiras',\n\t'Saveh',\n\t'Glens Falls',\n\t'Tonj',\n\t'Bhulwal',\n\t'Luozi',\n\t'Adoni',\n\t'Mahazony',\n\t'Setagaya',\n\t'Banning',\n\t'Minamishimabara',\n\t'Tuz Khurmatu',\n\t'Sundarapandiyam',\n\t'Kodaira',\n\t'Santa Cruz de la Palma',\n\t'Candiota',\n\t'Pittsford',\n\t'Yakeshi',\n\t'Lengerich',\n\t\"Da'an\",\n\t'Pacaembu',\n\t'East Point',\n\t'Miacatlan',\n\t'Sendamangalam',\n\t'Sidi Khaled',\n\t'Landquart',\n\t'Reinbek',\n\t'Millau',\n\t'Itaosy',\n\t'Bellefontaine',\n\t'Aracoiaba',\n\t'Melipilla',\n\t'Monor',\n\t'Collinsville',\n\t'Lenggries',\n\t'Pio Duran',\n\t'Rhondda',\n\t'Abu Sir Bana',\n\t'Cholavaram',\n\t'Kamepalle',\n\t'Yeppoon',\n\t'Sangenjo',\n\t'Hradec Kralove',\n\t'Kibeho',\n\t'Ahmetli',\n\t'Yurihonjo',\n\t'Pontassieve',\n\t'Cahokia Heights',\n\t'Ubaidullahganj',\n\t'Brakel',\n\t'Berezan',\n\t'Noya',\n\t'Reggio Emilia',\n\t'Huesca',\n\t'Bopfingen',\n\t'Bhainsa',\n\t'Dhupgari',\n\t'Itaiba',\n\t'Camenca',\n\t'Chmistar',\n\t'Sao Luis do Quitunde',\n\t'Foix',\n\t'Kond Rud',\n\t'Laterza',\n\t'Schopfheim',\n\t'Kasuga',\n\t'Ouadhia',\n\t'Dala',\n\t'Sonagazi',\n\t'Songjiangcun',\n\t'Mamidalapadu',\n\t'Biarritz',\n\t'Theodore',\n\t'Ngudu',\n\t'Ntorosso',\n\t'Buxar',\n\t'Kaliyaganj',\n\t'Milanoa',\n\t'Spisska Nova Ves',\n\t'Fuli',\n\t'Kisi',\n\t'Jhargram',\n\t'Zaporizhzhia',\n\t'Gazipasa',\n\t'Suyo',\n\t'North Saanich',\n\t'San Ricardo',\n\t'Komatipoort',\n\t'Mallapuram',\n\t'Yitiaoshan',\n\t'Kargilik',\n\t'Kinoni',\n\t'Qazyqurt',\n\t'Cajazeiras',\n\t'Semnan',\n\t'Pandan',\n\t'Koceljeva',\n\t'Ambodimotso Atsimo',\n\t'Valenza',\n\t'Puerto de la Cruz',\n\t'Tepetlaoxtoc',\n\t'Adjala-Tosorontio',\n\t'Zillah',\n\t'Diamondhead',\n\t'Hallstadt',\n\t'Anseong',\n\t'Libacao',\n\t'Bharella',\n\t'Yilan',\n\t'Cadolzburg',\n\t'Papantla de Olarte',\n\t'Fengguangcun',\n\t'Jhelum',\n\t'Dalanping',\n\t'Tegucigalpa',\n\t'Batala',\n\t'El Kerma',\n\t'Yangzhou',\n\t'Passira',\n\t'Hagonoy',\n\t'Kambaduru',\n\t'Jambusar',\n\t'Teddington',\n\t'Murambi',\n\t'Corsham',\n\t'Arzew',\n\t'Nittedal',\n\t'Paingkyon',\n\t'Maravilha',\n\t'Edison',\n\t'Montlhery',\n\t'Mokameh',\n\t'Canegrate',\n\t'Tezoatlan de Segura y Luna',\n\t'Iraucuba',\n\t'Kattivakkam',\n\t'Lino Lakes',\n\t'Kalyani',\n\t'El Playon',\n\t'Kabbur',\n\t'San Miguel Xoxtla',\n\t'Zirndorf',\n\t'Guama Abajo',\n\t'Sevlievo',\n\t'Kawai',\n\t'Edingen-Neckarhausen',\n\t'Chimalapadu',\n\t'Huatan',\n\t'Cascavel',\n\t'Naravarikuppam',\n\t'Pasighat',\n\t'Chimthana',\n\t'Priolo Gargallo',\n\t'Diema',\n\t'Yingshouyingzi',\n\t'Hardoi',\n\t'Shpola',\n\t'Alipur Duar',\n\t'Parambu',\n\t'Igaratinga',\n\t'Xinxing',\n\t'Damboa',\n\t'Edgemere',\n\t'Cypress Lake',\n\t'Lemont',\n\t'Karedu',\n\t'Puerto Villamil',\n\t'Thornaby on Tees',\n\t'Basarabeasca',\n\t'Bolama',\n\t'Islip',\n\t'Sonkach',\n\t'Cinco Ranch',\n\t'Tibiao',\n\t'Kuala Belait',\n\t'Nahazari',\n\t'Culion',\n\t'Villa Alegre',\n\t'Santiago Amoltepec',\n\t'Edgewater',\n\t'Sinuni',\n\t'Posusje',\n\t'Castellbisbal',\n\t'Bhainsoda',\n\t'Jindrichuv Hradec',\n\t'Pattiyurgramam',\n\t'Manlin',\n\t'Kabayan',\n\t'Boulder Hill',\n\t'Pastpar',\n\t'Mablethorpe',\n\t'Kodumur',\n\t'Kegen',\n\t'Wugang',\n\t'Cerquilho Velho',\n\t'Bent Jbail',\n\t'Bornova',\n\t'Hoganas',\n\t'Queretaro',\n\t'Ar Rayyan',\n\t'Bondues',\n\t'Pierrelaye',\n\t'Baiyin',\n\t'La Sierpe',\n\t'Selendi',\n\t'Antony',\n\t'Mathukumnel',\n\t'Kingoonya',\n\t'Nueva Gerona',\n\t'Alitagtag',\n\t'Simojovel de Allende',\n\t'Kralendijk',\n\t'Kanal',\n\t'Umm al Qaywayn',\n\t'Dodola',\n\t'Risaralda',\n\t'Lugoff',\n\t'Steinheim am Albuch',\n\t'Sussen',\n\t'Mulavana',\n\t'Loanda',\n\t'Holiday',\n\t'Catriel',\n\t'Rotonda',\n\t'North Codorus',\n\t'Amanganj',\n\t'Sahakevo',\n\t'Cadca',\n\t\"Ch'onan\",\n\t'Ponte San Giovanni',\n\t'Villa Altagracia',\n\t'Maywood',\n\t'Saraburi',\n\t'Tyldesley',\n\t'Satuluru',\n\t'Neufahrn bei Freising',\n\t'Zigon',\n\t'Calne',\n\t'Serere',\n\t'Cumberland Hill',\n\t'Ivanjica',\n\t'Konz',\n\t'Perth Amboy',\n\t'Alerce',\n\t'Berikai',\n\t'Foum Zguid',\n\t'Had Dra',\n\t'Cinere',\n\t'Dalkeith',\n\t'Fresnillo',\n\t'Yaizu',\n\t'Ciro Redondo',\n\t'Despotovac',\n\t'Kakkat',\n\t'Bassum',\n\t'Najran',\n\t'Segrate',\n\t'Mexico',\n\t'Kinrooi',\n\t'Moknine',\n\t'Andreba',\n\t'Bresso',\n\t'Venadillo',\n\t'Reoti',\n\t'Baharly',\n\t'Los Palmitos',\n\t'Jordania',\n\t'Great Missenden',\n\t'Puerto Cortes',\n\t'Los Alcazares',\n\t'Agbangnizoun',\n\t'Chausa',\n\t'Capistrano',\n\t'West Richland',\n\t'Pingyuanjie',\n\t'Coomera',\n\t'Bteghrine',\n\t'Occhiobello',\n\t'Olagadam',\n\t'Deerfield',\n\t'Aroroy',\n\t'Macedon',\n\t'Spout Springs',\n\t'East Patchogue',\n\t'Ebina',\n\t'Soria',\n\t'Ouled Mimoun',\n\t'Navapur',\n\t'Balumath',\n\t'Hennenman',\n\t'Barkot',\n\t'Denduluru',\n\t'Raca',\n\t'Kumbhari',\n\t'Bayaram',\n\t'Liuzhou',\n\t'Belmonte Mezzagno',\n\t'Harvard',\n\t'Wandiwash',\n\t'Cukurcayir',\n\t'Dinkelsbuhl',\n\t'Chero',\n\t'Ngolobougou',\n\t'Quilevo',\n\t'Saint-Claude',\n\t'Sonari',\n\t'Zaventem',\n\t'Venecia',\n\t'Sharjah',\n\t'Shoreham-by-Sea',\n\t'Governador Archer',\n\t'Cerese',\n\t'Lazarivo',\n\t'Angara-Debou',\n\t'Kaele',\n\t'Mahe',\n\t'Leighton Buzzard',\n\t'Erfelek',\n\t'Willimantic',\n\t'Sao Joaquim da Barra',\n\t'Littau',\n\t'Kayanna',\n\t'Temperley',\n\t'Jirwa',\n\t'Moses Lake',\n\t'Merriam',\n\t'Cerreto Guidi',\n\t'San Miniato',\n\t'Tumby Bay',\n\t'Wielun',\n\t'Tirukkattuppalli',\n\t'North Las Vegas',\n\t'Mahemdavad',\n\t'Nagaiyampatti',\n\t'Atyrau',\n\t'Chorley',\n\t'Ravansar',\n\t'Bettioua',\n\t'Green River',\n\t'Chicacao',\n\t'Karukkalvadi',\n\t'Dar el Beida',\n\t'Langarivo',\n\t'Tettu',\n\t'Santa Barbara',\n\t'Ban Pong',\n\t'San Nicolas de los Garza',\n\t'Tres Coroas',\n\t'Muttattuteruvu',\n\t'Coracao de Maria',\n\t'Nieuwpoort',\n\t'Laatzen',\n\t'Kusumbe',\n\t'Xiangyuncun',\n\t'Coral Springs',\n\t'Escaldes-Engordany',\n\t'Durpalli',\n\t'Kundian',\n\t'Acatlan de Perez Figueroa',\n\t'Mendes',\n\t'Sansale',\n\t'Batan',\n\t'Paslek',\n\t'San Severino Marche',\n\t'Madinat `Isa',\n\t'Youwarou',\n\t'Paghman',\n\t'Aruvikkara',\n\t'Osthofen',\n\t'Tianzhong',\n\t'Marudur',\n\t'Crensovci',\n\t'Ceerigaabo',\n\t'Brusciano',\n\t'Sabana de La Mar',\n\t'Aileu',\n\t'Kutaisi',\n\t'Maebashi',\n\t'Wanggezhuang',\n\t'Banska Stiavnica',\n\t'Tola',\n\t'Hovelhof',\n\t'Johannesburg',\n\t\"Sant Sadurni d'Anoia\",\n\t'Binalonan',\n\t'Dingcheng',\n\t'Henderson',\n\t'Bloxwich',\n\t'Gberouboue',\n\t'Dharmaram',\n\t'Abomsa',\n\t'Imtarfa',\n\t'Rancho Santa Margarita',\n\t'Meuselwitz',\n\t'Ad Dali`',\n\t'Nilandhoo',\n\t'Bayramaly',\n\t'Lufkin',\n\t'Talcher',\n\t'Menaka',\n\t'Rupauli',\n\t'Ipanema',\n\t'Tindwara',\n\t'Piendamo',\n\t'Gennep',\n\t'Kachnar',\n\t'Vitez',\n\t'Oporapa',\n\t'Litvinov',\n\t'Lich',\n\t'Hericourt',\n\t'Sanghar',\n\t'Sao Lourenco',\n\t'Bir Ali Ben Khalifa',\n\t'Hlucin',\n\t'Erith',\n\t'Ebejico',\n\t'Qulsary',\n\t'Pichor',\n\t'Lubon',\n\t'Lufilufi',\n\t'Mayamankurichchi',\n\t'Kulittalai',\n\t'Marshall',\n\t'Weil der Stadt',\n\t'Mahabako',\n\t'Lemoore',\n\t\"Al M'aziz\",\n\t'Behat',\n\t'Mauriti',\n\t'Memphis',\n\t'Antas',\n\t'Novo Mesto',\n\t'Zinkiv',\n\t'Mi`rabah',\n\t'Ksar Sghir',\n\t'Mandapam',\n\t'Cupang',\n\t'Mina',\n\t'Bytom',\n\t'Kikuyo',\n\t'Yankton',\n\t'Spilimbergo',\n\t'Gottmadingen',\n\t'Vanersborg',\n\t'Harduli',\n\t'Wierden',\n\t'Paloncha',\n\t'Chikmagalur',\n\t'Qubadli',\n\t'Longwood',\n\t'Nay Pyi Taw',\n\t'Wald-Michelbach',\n\t'Kafr al Battikh',\n\t'Orai',\n\t'Juchique de Ferrer',\n\t'Swiebodzice',\n\t'Behbahan',\n\t'Sehore',\n\t'Te Awamutu',\n\t'Shacheng',\n\t'Kano',\n\t'Ciftlikkoy',\n\t'Op',\n\t'Yendi',\n\t'Sun Valley',\n\t'Guabari',\n\t'Kalyanpur Bamaiya',\n\t'Rauco',\n\t'Pedro de Toledo',\n\t'Kandhkot',\n\t'Degollado',\n\t'Kasai',\n\t'Krasnik',\n\t'Abu Khashab',\n\t'Middlesbrough',\n\t'Cifuentes',\n\t'Ganxi',\n\t'Mae Sot',\n\t'Raubling',\n\t'Myoko',\n\t'McLean',\n\t'Trail',\n\t'Reggada',\n\t'Migdal Ha`Emeq',\n\t'Banni',\n\t'La Grange Park',\n\t'Ojiya',\n\t'Youngstown',\n\t'East Longmeadow',\n\t'Perunkalattu',\n\t'Guimaraes',\n\t'Sete Lagoas',\n\t'Bhandaria',\n\t'Stretford',\n\t'Corrientes',\n\t'Hurst',\n\t'Satuek',\n\t'Suhum',\n\t'Majiagoucha',\n\t'Caltagirone',\n\t'Asthal Bohar',\n\t'Chipiona',\n\t'Aravan',\n\t'Kiboga',\n\t'Ephrata',\n\t'Lystrup',\n\t'Nowa Deba',\n\t'Vangaindrano',\n\t'New Westminster',\n\t'Cestas',\n\t'Bithan',\n\t'Saraiya',\n\t'Bad Soden am Taunus',\n\t'Cinnaminson',\n\t'Mansidao',\n\t'Heroldsberg',\n\t'Opovo',\n\t'Shinhidaka',\n\t'Mildura',\n\t'Sahatsiho-Ambohimanjaka',\n\t'Dok Kham Tai',\n\t'Szombathely',\n\t'Nova Olinda do Norte',\n\t'Brantford',\n\t'Cobram',\n\t'Sulzbach-Rosenberg',\n\t'Key Biscayne',\n\t'South Ubian',\n\t'Varde',\n\t'Scandiano',\n\t'Santa Cruz do Sul',\n\t'Cedar Park',\n\t'Erstein',\n\t'Matozinhos',\n\t'Buxin',\n\t'Chortiatis',\n\t'Camrose',\n\t'Ettimadai',\n\t'Montagnana',\n\t'Ivybridge',\n\t'Middlewich',\n\t'Tivat',\n\t'Babai Kalan',\n\t'Al Qusayr',\n\t'Vatolatsaka',\n\t'Cruz',\n\t'Linstead',\n\t'Lakkundi',\n\t'Serrolandia',\n\t'Shuibian',\n\t'Llanelli',\n\t'Six-Fours-les-Plages',\n\t'Entre Rios de Minas',\n\t'Saude',\n\t\"Karbala'\",\n\t'Godinlabe',\n\t'Ocatlan',\n\t'Paranatama',\n\t'Begampur',\n\t'Khulm',\n\t'Alegria',\n\t'Partanna',\n\t'Bothaville',\n\t'Vaal Reefs',\n\t\"Alvorada D'Oeste\",\n\t'Cotes de Fer',\n\t'Sibirila',\n\t'Heshancun',\n\t'Adustina',\n\t'Uberlingen',\n\t'Shawano',\n\t'Santa Fe',\n\t'Bolivia',\n\t'Maniche',\n\t'Chikura',\n\t'Amstelveen',\n\t'Mwinilunga',\n\t'Tetiiv',\n\t'Losal',\n\t'Ortakent',\n\t'Mirassol',\n\t'Yerba Buena',\n\t'Kasongo-Lunda',\n\t'Zongdi',\n\t'Pirmed',\n\t'Ashton',\n\t'La Union',\n\t'Anaco',\n\t'Front Royal',\n\t'Faro',\n\t'Votorantim',\n\t'Bengbu',\n\t'Aldaya',\n\t'Khem Karan',\n\t'Dushanbe',\n\t'Campulung Moldovenesc',\n\t'Quixeramobim',\n\t'Chabet el Ameur',\n\t'Pingtung',\n\t'Fukuoka',\n\t'Itapiuna',\n\t'Khiram',\n\t'Lami',\n\t'Morubagalu',\n\t'South Kingstown',\n\t'Chatham',\n\t'Cefalu',\n\t'Pattanakkad',\n\t'Silvan',\n\t'Souk Et-Tleta des Oulad Hamdane',\n\t\"Mai'Adua\",\n\t'Ban Bang Khu Wat',\n\t'Ardal',\n\t'Collegedale',\n\t'Irbid',\n\t'Lanham',\n\t'San Pablo Jocopilas',\n\t'Santuario',\n\t'Betma',\n\t'Inezgane',\n\t'Pout',\n\t'Batcha',\n\t'Irlam',\n\t'Aldoar',\n\t'Atakpame',\n\t'Ban Bo Luang',\n\t'Finchley',\n\t'Tamalous',\n\t'Bagnols-sur-Ceze',\n\t'Matsushima',\n\t'Yecuatla',\n\t'Wuxue',\n\t'Ocean Springs',\n\t'Petilia Policastro',\n\t'Benenitra',\n\t'Elgin',\n\t'Guntupalle',\n\t'Itirucu',\n\t'Chengde',\n\t'Castelvetro di Modena',\n\t'Ramkali',\n\t'Marki',\n\t'Loudima Poste',\n\t'Usta Muhammad',\n\t'Banfield',\n\t'Patna',\n\t'Lendinara',\n\t'Toliara',\n\t'Tioribougou',\n\t'Mosbrough',\n\t'Yenangyaung',\n\t'Analanampotsy',\n\t'Zgornje Gorje',\n\t'Al Qubbah',\n\t'Lakeshore',\n\t'Kocaali',\n\t'Sombor',\n\t'Punta Arenas',\n\t'Elmira',\n\t'Serekunda',\n\t'Ban Khlong',\n\t'Ried im Innkreis',\n\t'Olivehurst',\n\t'Naruto',\n\t'Plainville',\n\t'Nakhal',\n\t'Hampton Bays',\n\t'Yaita',\n\t'Ambatosia',\n\t'Guindulman',\n\t'Wommelgem',\n\t'Jasper',\n\t'Sao Joao da Madeira',\n\t'Curiuva',\n\t'Destin',\n\t'Zigong',\n\t'Kushijima',\n\t'Fameck',\n\t'Telmar',\n\t'Noboribetsu',\n\t'Guanare',\n\t'Adis `Alem',\n\t'Angatuba',\n\t'Santa Cruz Zenzontepec',\n\t'Dongguazhen',\n\t'Castle Rock',\n\t'Millbrook',\n\t'Erlenbach am Main',\n\t'Kamloops',\n\t'South Jordan',\n\t'Colombia',\n\t'Baguio City',\n\t'Turkaguda',\n\t'Momchilgrad',\n\t'Aiyappan Kovil',\n\t'Strada',\n\t'Rostock',\n\t'Lichtenfels',\n\t'Al Majaridah',\n\t'Bagh-e Bahadoran',\n\t'Irvington',\n\t'Maheshwar',\n\t'Jhagarua',\n\t'Birchington',\n\t'Iba',\n\t'Wang Nam Yen',\n\t'Heilbad Heiligenstadt',\n\t'Meinerzhagen',\n\t'Shandiz',\n\t'Fallston',\n\t'Landivisiau',\n\t'San Juan de Aznalfarache',\n\t'Ettaiyapuram',\n\t'Kota Kinabalu',\n\t'Roseira',\n\t'Fusagasuga',\n\t'Bovisio Masciago',\n\t'Vilpatti',\n\t'Old Forge',\n\t'Kadiyam',\n\t'Goraya',\n\t'Almelo',\n\t'Rescaldina',\n\t'Bad Munstereifel',\n\t'Atebubu',\n\t'Panapakkam',\n\t'Morag',\n\t'Ferrier',\n\t'Velaux',\n\t'Sellersburg',\n\t'Kambhampadu',\n\t'Ubbergen',\n\t'Quilandi',\n\t'Digos',\n\t'Slavutych',\n\t'Terre Haute',\n\t'Schlitz',\n\t'`Unayzah',\n\t'Zaoyang',\n\t'Beauvais',\n\t'Allacapan',\n\t'Shangjing',\n\t'Nayagarh',\n\t'Kanasin',\n\t'Velasco Ibarra',\n\t'Agan',\n\t'Nouna',\n\t'Puthiyangadi',\n\t'Salar',\n\t'Povoa de Lanhoso',\n\t'Brotas de Macaubas',\n\t'Donggang',\n\t'Inuyama',\n\t'Balakan',\n\t'Camara de Lobos',\n\t'Tanauan',\n\t'Ribas do Rio Pardo',\n\t'Fagundes',\n\t'San Rafael Petzal',\n\t'Iraci',\n\t'Kadena',\n\t'Ramos Mejia',\n\t'Vaasa',\n\t'Goribidnur',\n\t'Changping',\n\t'Oregon',\n\t'Schiller Park',\n\t'Mereeg',\n\t'Toro',\n\t'Lynnwood',\n\t'Iiyama',\n\t'Punta Alta',\n\t'Cervello',\n\t'Sariosiyo',\n\t'Kunitachi',\n\t'Thu Dau Mot',\n\t'Viljandi',\n\t'Kurichedu',\n\t'Saugerties',\n\t'Noveleta',\n\t'Paripiranga',\n\t'Odesa',\n\t'Ibirama',\n\t'Coamo',\n\t'Smolyan',\n\t'Montilla',\n\t'Khan Bebin',\n\t'Ambovonomby',\n\t'Serinyol',\n\t'Ayapel',\n\t'San Antonio de los Cobres',\n\t'Kadiri',\n\t'Quatre Bornes',\n\t'Bareh',\n\t'Buritis',\n\t'Los Cerrillos',\n\t'Potenza',\n\t'Sughrain',\n\t'Nehbandan',\n\t'Ampthill',\n\t'Palmeira das Missoes',\n\t'Dombovar',\n\t'Angadanan',\n\t'Yuanping',\n\t'Martapura',\n\t'Curumani',\n\t'Benhao',\n\t'Ban Bang Toei',\n\t'Stadskanaal',\n\t'Secanj',\n\t'Renaico',\n\t'Buckhall',\n\t'Tirutturaippundi',\n\t'Komotini',\n\t'Suroth',\n\t'Guene',\n\t'Canudos',\n\t'Bhagsar',\n\t'Lubben (Spreewald)',\n\t'La Ciotat',\n\t'Stirling',\n\t'Praia da Vitoria',\n\t'Pakra',\n\t'Harpanahalli',\n\t'Tururu',\n\t'Andranomanelatra',\n\t'Sirnia',\n\t'Steyr',\n\t'Lake Stickney',\n\t'Villa Ojo de Agua',\n\t'Tuyserkan',\n\t'Saint-Jean-de-la-Ruelle',\n\t'Ranapur',\n\t'Kheiredine',\n\t'Villa El Carmen',\n\t'Sherborne',\n\t'Kerai',\n\t'Barughutu',\n\t'Tienen',\n\t'Cherkasy',\n\t'Turmero',\n\t'Ahigbe Koffikro',\n\t'Rio Azul',\n\t'Baro',\n\t'Koshanam',\n\t'Malinalco',\n\t'Afula',\n\t'Perpignan',\n\t'Timayy al Imdid',\n\t'Kotgir',\n\t'Forbach',\n\t'Malka',\n\t'Palm Beach',\n\t'Falmouth',\n\t'Beihai',\n\t'Kalbarri',\n\t'Ivato',\n\t'Picos',\n\t'Marcon',\n\t'Pieksamaki',\n\t'Carlet',\n\t'Salobe',\n\t'Yacimiento Rio Turbio',\n\t'Omiyacho',\n\t'Kodikkulam',\n\t'Shorapur',\n\t'Dniprorudne',\n\t'Neutraubling',\n\t'Kizhakkemanad',\n\t'Banagi',\n\t'Mount Gambier',\n\t'Malkajgiri',\n\t'Sokhumi',\n\t'Douera',\n\t'Chekfa',\n\t'Mairi',\n\t'Ortaca',\n\t'Loria',\n\t'San al Hajar al Qibliyah',\n\t'Galeana',\n\t'Aguadulce',\n\t'Carepa',\n\t'Jogipet',\n\t'Tambacounda',\n\t'Hingham',\n\t'Huntington Beach',\n\t'Yeniciftlik',\n\t'Talupula',\n\t'Naruar',\n\t'Tudela',\n\t'Ayyampalaiyam',\n\t'Kolwara',\n\t'Cisauk',\n\t'Jettihalli',\n\t'Surt',\n\t'Allen Park',\n\t'Casier',\n\t'Zhaxi',\n\t'Itu',\n\t'Quilombo',\n\t'Gharghur',\n\t'Keerbergen',\n\t'Gbarnga',\n\t'Degana',\n\t'Gretna',\n\t'Cerro Maggiore',\n\t'Santa Cruz Michapa',\n\t'Diamou',\n\t'Tiruppanandal',\n\t'Bayji',\n\t'Njeru',\n\t'Sour',\n\t'Martinengo',\n\t'Rocklin',\n\t'Saint-Vallier',\n\t'Yabrud',\n\t'Alfortville',\n\t'Kopoky',\n\t'Phuoc Long',\n\t'Giarre',\n\t'Kindu',\n\t'Ain Cheggag',\n\t'Babila',\n\t'Busumbala',\n\t'Basmenj',\n\t'Tangjia',\n\t'Karimunjawa',\n\t'Bhagatpur',\n\t'Murtazabad',\n\t'Konganapuram',\n\t'Kapelle',\n\t'Sidi Lamine',\n\t'Nezahualcoyotl',\n\t'Prague',\n\t'Chandreru',\n\t'Nelliyalam',\n\t'Kouhu',\n\t'Bollullos par del Condado',\n\t'Chiryu',\n\t'Ain Defla',\n\t'Trzin',\n\t'Llandybie',\n\t'Ushtobe',\n\t'Mecitozu',\n\t'Lys-les-Lannoy',\n\t'Campo Ere',\n\t'Antambohobe',\n\t'Kanifing',\n\t'Mulukuku',\n\t'Micoud',\n\t'Siran',\n\t'Markt Schwaben',\n\t'Porangatu',\n\t'Manimala',\n\t'Liege',\n\t'Shiremoor',\n\t'Itaperucu',\n\t'Puerto Pilon',\n\t'Bourg-la-Reine',\n\t'Kadalur',\n\t'Kodikuthi',\n\t'Thame',\n\t'Soahany',\n\t'Kyritz',\n\t'Longtoushan Jiezi',\n\t'Meiktila',\n\t'Centenario do Sul',\n\t'Cunit',\n\t'Engerwitzdorf',\n\t'Ebreichsdorf',\n\t'Newbury',\n\t'Almoloya de Alquisiras',\n\t'Krishnarayapuram',\n\t'Kadamakudi',\n\t'Yongzhou',\n\t'Sartell',\n\t'Madeley',\n\t'Koszutka',\n\t'Iacanga',\n\t'Ekhari',\n\t'Kratie',\n\t'Nyeri',\n\t'Qazigund',\n\t'Langdu',\n\t'Pong Nam Ron',\n\t'Timon',\n\t'Gyeongsan',\n\t'Minerbio',\n\t'Singia',\n\t'East Niles',\n\t'Mmopone',\n\t'Masaurhi Buzurg',\n\t'Liantangcun',\n\t'Banino',\n\t'Altopascio',\n\t'Tillaberi',\n\t'Riachao do Jacuipe',\n\t'Nalikkalpatti',\n\t'Romanshorn',\n\t'Xinjing',\n\t'Cha-am',\n\t'Cumpana',\n\t'Shenandoah',\n\t'Pathanamthitta',\n\t'Tata',\n\t'Lake Elsinore',\n\t'Vilavur',\n\t'Ogdensburg',\n\t'Santa Maria de Cayon',\n\t'Rakvere',\n\t'Baretha',\n\t'Ankaraobato',\n\t'Miguel Pereira',\n\t'West Islip',\n\t'Tekkekara Kizhakku',\n\t'Chita',\n\t'Futrono',\n\t'Cordon',\n\t'Ampefy',\n\t'Santo Domingo de los Colorados',\n\t'Mtskheta',\n\t'Dassa-Zoume',\n\t'San Cristobal',\n\t'Corona',\n\t'Telemaco Borba',\n\t'Pedregulho',\n\t'Walajapet',\n\t'Kurnool',\n\t'Bois-Colombes',\n\t'Bitritto',\n\t'Baia Formosa',\n\t'Mopti',\n\t'Sassari',\n\t'General Pinedo',\n\t'Capim Grosso',\n\t'Sanok',\n\t'Nawashahr',\n\t'Radom',\n\t'Esbjerg',\n\t'Scheveningen',\n\t'Woodland Park',\n\t'Ljubno',\n\t'Tirkarur',\n\t'Mississauga',\n\t'Oudewater',\n\t'Plochingen',\n\t'Villa Donato Guerra',\n\t'Kuangfu',\n\t'Mabuhay',\n\t'Deh-e Shu',\n\t'Anjur',\n\t'Sung Noen',\n\t'Fife',\n\t'Mhangura',\n\t'Chalchuapa',\n\t'Herisau',\n\t'Cesis',\n\t'Flensburg',\n\t'Prado',\n\t'Fujisaki',\n\t'Winterveld',\n\t'Mlimba',\n\t'Chintakunta',\n\t'Marsaxlokk',\n\t'Munakata',\n\t'Corciano',\n\t'Sibilia',\n\t'Pullalacheruvu',\n\t'Trescore Balneario',\n\t'Querfurt',\n\t'Palestine',\n\t'Salta',\n\t'Scafati',\n\t'Atbara',\n\t'Unhel',\n\t'Rosenheim',\n\t'Khambhat',\n\t'Serafina Corea',\n\t'Guayos',\n\t'Ladson',\n\t'Martinho Campos',\n\t'Rondon do Para',\n\t'Gandajika',\n\t'Konigsbrunn',\n\t'Dabrowa Tarnowska',\n\t'Dudhpura',\n\t'Hurdiyo',\n\t'Vi Thanh',\n\t'Blaubeuren',\n\t'Berubari',\n\t'Wujiaqu',\n\t'Warrensville Heights',\n\t'Duc Pho',\n\t'Misungwi',\n\t'Jeju',\n\t'Diamond Springs',\n\t'Rabot',\n\t'Chateau-Gontier',\n\t'Culver City',\n\t'Chanhassen',\n\t'Campamento',\n\t'Venturosa',\n\t'Bom Principio',\n\t'Huquan',\n\t'Odlabari',\n\t'Burbage',\n\t'Siladon',\n\t'Nutley',\n\t'Kinzau-Vuete',\n\t'Ickenham',\n\t'Belavabary',\n\t'Kariyapatti',\n\t'Dzierzoniow',\n\t'North Cowichan',\n\t'Mine',\n\t'Srvanampatti',\n\t'Uba',\n\t'Monte Alegre de Sergipe',\n\t'Espanola',\n\t'Lenart v Slovenskih Goricah',\n\t'Hirske',\n\t'Nallikodur',\n\t'Kisara',\n\t'Salamanca',\n\t'North New Hyde Park',\n\t'Prudente de Morais',\n\t'Peragamanna',\n\t'Kaippakancheri',\n\t'Venray',\n\t'Kitakata',\n\t'Napindan',\n\t'Beinasco',\n\t'Anyksciai',\n\t'Piera',\n\t'Morab',\n\t'Charef',\n\t'Fraserburgh',\n\t'Maghalleen',\n\t'Palatine',\n\t'Batuan',\n\t'Maldegem',\n\t'Kalabahi',\n\t'Hollola',\n\t'Quimbele',\n\t'Ippy',\n\t'Oirschot',\n\t'Hrib-Loski Potok',\n\t'Ras el Metn',\n\t'Dalaba',\n\t'Thun',\n\t'Caguas',\n\t'Jadayampalaiyam',\n\t'Biaora',\n\t'Brno',\n\t'Fino Mornasco',\n\t'Lohagaon',\n\t'Silale',\n\t'Kouka',\n\t'Tulchyn',\n\t'Caimito',\n\t'Teijlingen',\n\t'Szczecinek',\n\t'Oulad Rahmoun',\n\t'Khat Azakane',\n\t'Koupela',\n\t'Giddalur',\n\t'Francisco Sa',\n\t'Adda-Doueni',\n\t'Santa Catarina Mita',\n\t'Nova Olimpia',\n\t'Sabalito',\n\t'Hire Vadvatti',\n\t'Duvva',\n\t'Iloilo',\n\t'Catalca',\n\t'Pribram',\n\t'McCalla',\n\t'Oleggio',\n\t'Lajes',\n\t'Entroncamento',\n\t'Vidapanakallu',\n\t'Moju',\n\t'East Brunswick',\n\t'Samalkot',\n\t'Birnin Konni',\n\t'Ipaba',\n\t'Sebba',\n\t'Joao Camara',\n\t'Sho`rchi',\n\t'De Witt',\n\t'Ebolowa',\n\t'Nandipeta',\n\t'Bokaro',\n\t'Port Glasgow',\n\t'Vellakkinar',\n\t'Goldenstedt',\n\t'Al Jawf',\n\t'Adliswil',\n\t'Castelnaudary',\n\t'Bula',\n\t'Swan Hill',\n\t'Brikcha',\n\t'Valkurti',\n\t'Lake Hopatcong',\n\t'Ingeniero Jacobacci',\n\t'Kemise',\n\t'Obidos',\n\t'Central Saanich',\n\t'Shioya',\n\t'Ulus',\n\t'Chicago Heights',\n\t'Tracy',\n\t'Al Matariyah',\n\t'Chelmza',\n\t'Ban Wat Chan',\n\t'Chelles',\n\t'Basni',\n\t'Moriya',\n\t'Arzignano',\n\t'Bharanikavu Tekku',\n\t'Paikpar',\n\t'Lake Elmo',\n\t'Pottanikad',\n\t'Gorakhpur',\n\t'Rose Hill',\n\t'Sallimedu',\n\t'Kearns',\n\t'Berehove',\n\t'Kidderminster',\n\t'Marieville',\n\t'Lillers',\n\t'Voreppe',\n\t'Rovenky',\n\t'Spittal an der Drau',\n\t'Vohipaho',\n\t'Selnica ob Dravi',\n\t'Musile di Piave',\n\t'Sado',\n\t'El Ancer',\n\t'Lamego',\n\t'Kaeng Khro',\n\t'Laguna Hills',\n\t'Bag',\n\t'Krotoszyn',\n\t'Makhu',\n\t'Kotha Guru',\n\t'Bandar-e Bushehr',\n\t'Borsbeek',\n\t'Manbij',\n\t'Mabaruma',\n\t'Godohou',\n\t'Landau an der Isar',\n\t'Zamboanga City',\n\t'Bendarhalli',\n\t'Vanavasi',\n\t'Karlovac',\n\t'Saraland',\n\t'Vaucresson',\n\t'Clusone',\n\t'Kumi',\n\t'Turayf',\n\t'Konakondla',\n\t'Adet',\n\t'Yuanhucun',\n\t'Iramaia',\n\t'Buttar Khurd',\n\t'New Richmond',\n\t'McDonough',\n\t'Monte Cristo',\n\t'Save',\n\t'Khutaha',\n\t'Erzin',\n\t'Lovrenc na Pohorju',\n\t'Tangail',\n\t'Tadmur',\n\t'Midyat',\n\t'Guanajay',\n\t'Colombes',\n\t'Garbsen',\n\t'Leribe',\n\t'Gamail',\n\t'Abu Hulayfah',\n\t'Azcoitia',\n\t'Abelardo Luz',\n\t'Kamavarapukota',\n\t'Bolongongo',\n\t'Paraiso',\n\t'Dum Duma',\n\t'Auckland',\n\t'Peterlee',\n\t'Turiacu',\n\t'Xaignabouli',\n\t'Huangyan',\n\t'Camarillo',\n\t'Volksrust',\n\t'San Jose de Guaribe',\n\t'Roca Sales',\n\t'Glogow Malopolski',\n\t'Tototlan',\n\t'Murrells Inlet',\n\t'Oxford',\n\t'Amodei',\n\t'Harbel',\n\t'Hue',\n\t'Kajhi Hridenagar',\n\t'Silvani',\n\t'Voorschoten',\n\t'Villeneuve-sur-Lot',\n\t'Kavaklidere',\n\t'Chibemba',\n\t'Avellino',\n\t'Brejinho',\n\t'Oulad Cherif',\n\t'Abra de Ilog',\n\t'Kurtkoti',\n\t'Tovala',\n\t'Gqeberha',\n\t'Almoloya',\n\t'Sao Joao do Paraiso',\n\t'Pella',\n\t'Zabre',\n\t'Higashimatsushima',\n\t'Fairland',\n\t'Arambakkam',\n\t'Skvyra',\n\t'Lamacaes',\n\t'Lumbreras',\n\t'Campbelltown',\n\t'Anoviara',\n\t'Jurawanpur Karari',\n\t'Imatra',\n\t'Medford',\n\t'Ban Phan Don',\n\t'Marietta',\n\t'Pennagaram',\n\t'Rotselaar',\n\t'Tezze sul Brenta',\n\t'Ponnada',\n\t'Golmud',\n\t'Ehningen',\n\t'Amambai',\n\t'Princeton',\n\t'Tepeji del Rio de Ocampo',\n\t'Mosonmagyarovar',\n\t'Tianguistengo',\n\t'Mongagua',\n\t'Elkhorn',\n\t'Langenthal',\n\t'Mehrabpur',\n\t'Obra',\n\t'Kabo',\n\t'Ban Mueang Nga',\n\t'Nga Bay',\n\t'Kannankurichchi',\n\t'Bayou Blue',\n\t'Et Tira',\n\t'Solita',\n\t'Bauchi',\n\t'Uribia',\n\t'Painkulam',\n\t'Calkini',\n\t'Sanchor',\n\t'Zoersel',\n\t'Tomiya',\n\t'Huvin Hippargi',\n\t'Teodoro Sampaio',\n\t'Lambton Shores',\n\t'Tissemsilt',\n\t'Kolding',\n\t'Quillacollo',\n\t'Tenosique',\n\t'Birnagar',\n\t'Laeken',\n\t'Talant',\n\t'Richterswil',\n\t'Kundgol',\n\t'Vitry-sur-Seine',\n\t'Conwy',\n\t'Oqtosh Shahri',\n\t'Yellapur',\n\t'Kumbakonam',\n\t'Jizhou',\n\t'Visoko',\n\t'Kassala',\n\t'Bloemendaal',\n\t'Perl',\n\t'Kaniv',\n\t'Ensenada',\n\t'Armavir',\n\t'Hirnyk',\n\t'Turgutalp',\n\t'Gaoual',\n\t'Mazzarino',\n\t'Batley',\n\t'Trichinopoly',\n\t'Ban Kang',\n\t'Manado',\n\t'Gerstetten',\n\t'Nechmeya',\n\t'Khan Yunis',\n\t'Anatuya',\n\t'Sosale',\n\t'Nindiri',\n\t'Uzwil',\n\t'Kesli',\n\t'Srbobran',\n\t'Jacmel',\n\t'Malibu',\n\t'Mulongo',\n\t'Balehonnur',\n\t'Froyland',\n\t'Vernal',\n\t'Kollegal',\n\t'San Juan',\n\t'Wayland',\n\t'Sirdala',\n\t'Redwood City',\n\t'Patalia',\n\t'Lycksele',\n\t'Alcantaras',\n\t'Majdal Shams',\n\t'Villa de San Diego de Ubate',\n\t\"Sa-ch'on\",\n\t'Jalakandapuram',\n\t'Husum',\n\t'Coral Terrace',\n\t'Chropaczow',\n\t'Khalari',\n\t'Talence',\n\t'Arroyo Naranjo',\n\t'Gundrajukuppam',\n\t'Hinis',\n\t'Luoyang',\n\t'Argenteuil',\n\t'Dnipro',\n\t'Zajecar',\n\t'Usgao',\n\t'Serra Branca',\n\t'Hunduan',\n\t'Anosipatrana',\n\t'Constantina',\n\t'Sirur',\n\t'Bandar Seri Begawan',\n\t'Zavrc',\n\t'Rampur Parhat',\n\t'Saito',\n\t'Jurupa Valley',\n\t'Pedras de Fogo',\n\t'Kalymnos',\n\t'Jerissa',\n\t'Beni Khiar',\n\t'Ginebra',\n\t'Recco',\n\t'Kanajanahalli',\n\t'Miani',\n\t'Rionegro',\n\t'Honavar',\n\t'Bolu',\n\t'Shepherdsville',\n\t'Babura',\n\t'Vilnohirsk',\n\t'Saint-Loubes',\n\t'Machados',\n\t'Roselle',\n\t'Valle de Bravo',\n\t'Stoke Gifford',\n\t'Settiyarpatti',\n\t'Citrus Heights',\n\t'Amityville',\n\t'Muntinlupa City',\n\t'Poco Branco',\n\t'Ciudad Cortes',\n\t'Muncie',\n\t'Ballenstedt',\n\t'Kipushi',\n\t'Simri',\n\t'Satrovka',\n\t'Parasi',\n\t'Dumra',\n\t'Tha Luang',\n\t'Galatina',\n\t'Chiampo',\n\t'Robinson',\n\t'Chelsfield',\n\t'Hersbruck',\n\t'Ambodivoanio',\n\t'Carache',\n\t'Hagfors',\n\t'Hazlet',\n\t'Luchong',\n\t'Maili',\n\t'Kiangara',\n\t'Dengtacun',\n\t'Tuodian',\n\t'Prudhoe',\n\t'Codogno',\n\t'Philippeville',\n\t'Agsu',\n\t'Onomichi',\n\t'Kajiado',\n\t'Louang Namtha',\n\t'Sobral',\n\t'Hermosa',\n\t'Ouargla',\n\t'Welwyn Garden City',\n\t'Niel',\n\t'San Ramon',\n\t'Eutin',\n\t'Patarra',\n\t'Plainview',\n\t'Iioka',\n\t'Shamshernagar',\n\t'Ravanusa',\n\t'Madha',\n\t'Mmadinare',\n\t'Rawalpindi',\n\t'Calcinaia',\n\t'Chak Pahar',\n\t'Sunbury',\n\t'Cruzeiro do Oeste',\n\t'Pemberton',\n\t'Putian',\n\t'Sapucaia',\n\t'Worpswede',\n\t'Anaheim',\n\t'Tupancireta',\n\t'Lyaskovets',\n\t'Setouchi',\n\t'Tanay',\n\t'Takerbouzt',\n\t'Tarabuco',\n\t'Volpago del Montello',\n\t'Al `Arish',\n\t'Foley',\n\t'Avion',\n\t'Dina',\n\t'Kazerun',\n\t'Tuljapur',\n\t'Tocuyito',\n\t'Arakawa',\n\t'Sao Jose do Rio Preto',\n\t'Labuan',\n\t'Kadama',\n\t'Kollo',\n\t'Nieuwkoop',\n\t'Butalangu',\n\t'Haeryong',\n\t'Minbu',\n\t'Nobeoka',\n\t'Heunghae',\n\t'Chaidari',\n\t'Hoa Thuong',\n\t'Oelde',\n\t'Finote Selam',\n\t'Valayam',\n\t\"O'Fallon\",\n\t'Araquari',\n\t'Nazaria',\n\t'Hofgeismar',\n\t'Masaya',\n\t'Saarlouis',\n\t'Schluchtern',\n\t'Mankara',\n\t'Mersa',\n\t'Sioux Falls',\n\t'Altinopolis',\n\t'South Plainfield',\n\t'Eccleston',\n\t'Louangphabang',\n\t'Kudachi',\n\t'Outjo',\n\t'Arluno',\n\t'Almus',\n\t'Zehak',\n\t'Elsenfeld',\n\t'Garag',\n\t'Agano',\n\t'Ferndale',\n\t'Yui',\n\t'Kasba Maker',\n\t'Krakow',\n\t'Aghbalou Aqourar',\n\t'Zakynthos',\n\t'Zhuchangba',\n\t'Tan Van',\n\t'Xiezhou',\n\t'Cinisi',\n\t'Drogheda',\n\t'Balurghat',\n\t'San Sebastian de los Reyes',\n\t'Kavaratti',\n\t'Egirdir',\n\t'Tolentino',\n\t'Iwanai',\n\t'Bhongir',\n\t'Nuzvid',\n\t'Amaha',\n\t'Jemaat Oulad Mhamed',\n\t'Karlovy Vary',\n\t'Kengri',\n\t'Khawaspur',\n\t'Palm Bay',\n\t'Murungattoluvu',\n\t'Autlan de Navarro',\n\t'Bursa',\n\t'Bruhl',\n\t'Montemor-o-Velho',\n\t'Berbera',\n\t'Mattoon',\n\t'Mboro',\n\t'Texcaltitlan',\n\t'Ellicott City',\n\t'Banbridge',\n\t'Bandipur',\n\t'Talakkad',\n\t'Ostroda',\n\t'Imphal',\n\t'Porto Belo',\n\t'Chattanooga',\n\t'Cogan',\n\t'Oued el Kheir',\n\t'Girard',\n\t'Tongshan',\n\t'Bhogapuram',\n\t'Cabanglasan',\n\t'Caleta Olivia',\n\t'Lozovo',\n\t'Hythe',\n\t'Izra',\n\t'Toba',\n\t'Sipocot',\n\t'Borgosatollo',\n\t'Messina',\n\t'Manadhoo',\n\t'Jumri Tilaiya',\n\t'Ollerton',\n\t'Riverhead',\n\t'Dinguiraye',\n\t'Salehpur',\n\t'Horizon City',\n\t'Tettuppatti',\n\t'Manorville',\n\t'Gumaca',\n\t'Barpathar',\n\t'Ankasakasabe',\n\t'Rio Caribe',\n\t'Mutare',\n\t'Kiramangalam',\n\t'Voorst',\n\t'El Ancor',\n\t'Marsta',\n\t'Wombourn',\n\t'Bagong Silangan',\n\t'Mogiyon',\n\t'Maracaibo',\n\t'Amay',\n\t'Ostrow Wielkopolski',\n\t'Herent',\n\t'Yecla',\n\t'Barrington',\n\t'Cananeia',\n\t'Crowborough',\n\t'Kandori',\n\t'Toconao',\n\t'Cazombo',\n\t'Basel',\n\t'Halavagalu',\n\t'Baile an Bhiataigh',\n\t'Baraboo',\n\t'Kambla',\n\t'Hung Yen',\n\t'Sun City Center',\n\t'Panniperumthalai',\n\t'Gwacheon',\n\t'Hikawa',\n\t'Zamora',\n\t'Las Lajas',\n\t'Dan Gorayo',\n\t'Racale',\n\t'La Paloma',\n\t'Kon Tum',\n\t'Oloron-Sainte-Marie',\n\t'Piacabucu',\n\t'Bourke',\n\t'Piraeus',\n\t'Ciudad Benito Juarez',\n\t'Peje',\n\t'Sagar',\n\t'Sivagiri',\n\t'Biyahmu',\n\t'Vianopolis',\n\t'Curitiba',\n\t'Larkspur',\n\t'Harenkarspel',\n\t'Reghin',\n\t'Kapchorwa',\n\t'Hohenau',\n\t'Villa Alsina',\n\t'Tagami',\n\t'We',\n\t'Lac des Oiseaux',\n\t'Pariharpur',\n\t'Volodymyrets',\n\t'Areraj',\n\t'Chupinguaia',\n\t'Anantpur',\n\t'Gif-sur-Yvette',\n\t'Bronkhorstspruit',\n\t'Krimpen aan den IJssel',\n\t'Rock Island',\n\t'Ban Huai So Nuea',\n\t'Barcellona-Pozzo di Gotto',\n\t'Tumbippadi',\n\t'Pontoise',\n\t'Bandar Emam',\n\t'Reconquista',\n\t'Braniewo',\n\t'Vettaikkaraniruppu',\n\t'Ancuabe',\n\t'Hitachi',\n\t'Malolos',\n\t'Ngaparou',\n\t'Bayamon',\n\t'Abyek',\n\t'Tlahuiltepa',\n\t'Lugano',\n\t'Crispiano',\n\t'Padre Hurtado',\n\t'Wlodawa',\n\t'Placheri',\n\t'General Martin Miguel de Guemes',\n\t'Yangyuhe',\n\t'La Chapelle-Saint-Mesmin',\n\t'Darmanesti',\n\t'`Ayn al `Arab',\n\t'Yorkshire',\n\t'Calcinato',\n\t'Sadiqpur Maraul',\n\t'Tadley',\n\t'Nkokonjeru',\n\t'Fatime',\n\t'Selby',\n\t'Kafr Ruma',\n\t'South Brunswick',\n\t'Yahotyn',\n\t'North Grenville',\n\t'Mahajjah',\n\t'Wangyuanqiao',\n\t'Hrastnik',\n\t'Luckenwalde',\n\t'Kalaiya',\n\t'Matagalpa',\n\t'Bulbula',\n\t'Shirva',\n\t'Nogoya',\n\t'Leulumoega',\n\t'San Diego Country Estates',\n\t'Magong',\n\t'Kourouma',\n\t'Vorkadi',\n\t'Shibuya',\n\t'Madathapatti',\n\t'Cilegon',\n\t'Betun',\n\t'Mantes-la-Jolie',\n\t'Tokar',\n\t'Medog',\n\t'Medleri',\n\t'El Viso del Alcor',\n\t'Sao Joaquim de Bicas',\n\t'Cyuve',\n\t'Igarapava',\n\t'Hamilton Township',\n\t'Baldock',\n\t'Evren',\n\t'Sangarebougou',\n\t'Sohagpur',\n\t'Razua',\n\t'Naurhiya',\n\t'Tromsdalen',\n\t'Mairipora',\n\t'Yesilyurt',\n\t'Malacatancito',\n\t'Szydlowiec',\n\t'Masiaboay',\n\t'Taozhuangcun',\n\t'Gongyefu',\n\t'Qiziltepa',\n\t'Pivnichne',\n\t'Anandpur',\n\t'Machinga',\n\t'Irmo',\n\t'Guntapalli',\n\t'Indang',\n\t'Baetov',\n\t'Sarvar',\n\t'Eberbach',\n\t'Douar Oulad Driss',\n\t'Tanagura',\n\t'Ikare',\n\t'Yumurtalik',\n\t'Kapuvar',\n\t'Margraten',\n\t'General Las Heras',\n\t'Yinhua',\n\t'Badnawar',\n\t'Grao Mogol',\n\t'Dalja',\n\t'Abensberg',\n\t'Roque Perez',\n\t'Rustampur',\n\t'Cajati',\n\t'Sarso',\n\t'Samadh Bhai',\n\t'Azazga',\n\t'Kenar',\n\t'Ealing',\n\t'Versailles',\n\t'Kalima',\n\t'Stillorgan',\n\t'Portao',\n\t'Kwinana',\n\t'Gemena',\n\t'Oulad Chikh',\n\t'Arslanbob',\n\t'Sumenep',\n\t'Kleppe',\n\t'Anisoc',\n\t'Chapel Hill',\n\t'Timisoara',\n\t'Saint-Denis',\n\t'Temescal Valley',\n\t'Alayor',\n\t'Siuri',\n\t'Puerto Colombia',\n\t'San Andres Timilpan',\n\t'Tadjenanet',\n\t'La Londe-les-Maures',\n\t'Tivaouane',\n\t'Singaraja',\n\t'Frisco',\n\t'Pozzuoli',\n\t'Robe',\n\t'Kutina',\n\t'Escoublac',\n\t'Ginosa',\n\t'Weil im Schonbuch',\n\t\"Jeffrey's Bay\",\n\t'Emporia',\n\t'Arbaoua',\n\t'Saint-Augustin-de-Desmaures',\n\t'Asslar',\n\t'Bischofshofen',\n\t'Vakhsh',\n\t'Upper Macungie',\n\t'Karpuzlu',\n\t'Dattapara',\n\t'Vaikuntam',\n\t'Haverhill',\n\t'Craiova',\n\t'Santo Amaro da Imperatriz',\n\t'Orpington',\n\t'Tibri',\n\t'Arlov',\n\t'Luwuk',\n\t'Pipra Naurangia',\n\t'Yingkou',\n\t'Sidi Okba',\n\t'Torrox',\n\t'Toki',\n\t'Matera',\n\t'Cristinapolis',\n\t'Ivano-Frankivsk',\n\t'Ramu',\n\t'Mangawan',\n\t'Ishioka',\n\t'Leones',\n\t'Mougins',\n\t'Maco',\n\t'Hanko',\n\t'Backnang',\n\t'Bakamune',\n\t'Gubbi',\n\t'Bazhou',\n\t'Guangzhou',\n\t'Badajoz',\n\t'Masdi',\n\t'Estcourt',\n\t'Kale',\n\t'Amaraji',\n\t'Guire',\n\t'Mesa',\n\t'Utebo',\n\t'Al Khawr',\n\t'Pararia',\n\t'Hapur',\n\t'Maigo',\n\t'Grimmen',\n\t'Saratoga Springs',\n\t'Villejuif',\n\t'Tucapel',\n\t'Zhoujiajing',\n\t'Nicosia',\n\t'Tirumalaiyampalaiyam',\n\t'Tamorot',\n\t'Radford',\n\t'Ambarakaraka',\n\t'Maragogipe',\n\t'Mettlach',\n\t'Nautla',\n\t'Nuevo Paysandu',\n\t'Kuppachchipalaiyam',\n\t'Steinbach am Taunus',\n\t'Calverton',\n\t'Ainring',\n\t'Olanchito',\n\t'Calayan',\n\t'Girardota',\n\t'Salem Lakes',\n\t'South Houston',\n\t'Maharajpur',\n\t'Saboya',\n\t'San Jose de Maipo',\n\t'Chennimalai',\n\t'Kecioren',\n\t'Auchi',\n\t'Elk Plain',\n\t'Galbois',\n\t'Shuilin',\n\t'Malabuyoc',\n\t'Buyuk Cakirman',\n\t'Rishra',\n\t'Aruja',\n\t'Piata',\n\t'Uvira',\n\t'Sohana',\n\t'Garmdarreh',\n\t'Wulingshancun',\n\t'Nijoni',\n\t'Kudlu',\n\t'Braunfels',\n\t'Attappampatti',\n\t'Pedana',\n\t'Guayaquil',\n\t'Crotone',\n\t'Anse a Pitre',\n\t'Svishtov',\n\t'Couzeix',\n\t'Seinajoki',\n\t'Schagen',\n\t'Weatherford',\n\t'Hidaka',\n\t'Klazienaveen',\n\t'Al Harah',\n\t'Qabb Elias',\n\t'Al Fashn',\n\t'Berja',\n\t'Prieska',\n\t'Ban Son Loi',\n\t'Togo',\n\t'Asagiri',\n\t'Zafferana Etnea',\n\t'The Bottom',\n\t'Kannapolis',\n\t'Ussel',\n\t'Nukus',\n\t'Susehri',\n\t'Yawata-shimizui',\n\t'Bhayala',\n\t'Leagrave',\n\t'Hermitage',\n\t'Seynod',\n\t'Lubawa',\n\t'Gran',\n\t'Nazerabad',\n\t'Shenzhen',\n\t'Lone Tree',\n\t'Birecik',\n\t'Ikongo',\n\t'Amudalavalasa',\n\t'Rajgarh',\n\t'Xalpatlahuac',\n\t'Lunga-Lunga',\n\t'Haubourdin',\n\t'Ambolomoty',\n\t'Nyamata',\n\t'Sukhsena',\n\t'Wanzleben',\n\t'Brazopolis',\n\t'Pupiales',\n\t'Smederevo',\n\t'Bischofsheim',\n\t'Mato Verde',\n\t'Jawhar',\n\t'Shiraoi',\n\t'Huanghuajing',\n\t'San Rafael Arriba',\n\t'Freienbach',\n\t'Edegem',\n\t'Sao Sebastiao de Lagoa de Roca',\n\t'Yangirabot',\n\t'Chhapera',\n\t'Izu',\n\t'East St. Louis',\n\t'Chegur',\n\t'Naawan',\n\t'Shuangxianxiang',\n\t'Kalamaria',\n\t'Shangzhi',\n\t'Bardiha Turki',\n\t'Alfeld',\n\t'Sacele',\n\t'Pereira Barreto',\n\t'Tiptree',\n\t'Bala Koh',\n\t'Buyende',\n\t'Macuspana',\n\t'Gediz',\n\t'Tocancipa',\n\t'Taneichi',\n\t'Makabana',\n\t'Richland Hills',\n\t'Puerto Limon',\n\t'Dighwara',\n\t'Radovis',\n\t'Hobbs',\n\t'Quinchia',\n\t'Santa Catarina Masahuat',\n\t'Roquetas de Mar',\n\t'Willowick',\n\t'Chahana',\n\t'Samai',\n\t'Tasiilaq',\n\t'Anao-aon',\n\t'Kattanam',\n\t'Derbisek',\n\t'Changuinola',\n\t'Schwalmstadt',\n\t'Camposampiero',\n\t'Mayumba',\n\t'Raipur',\n\t'Stanmore',\n\t'Wesseling',\n\t'Poldasht',\n\t'Keora',\n\t'Hettstedt',\n\t'Kihoku',\n\t'Cabimas',\n\t'Stadthagen',\n\t'Gorontalo',\n\t'Cherial',\n\t'Khonobod',\n\t'Barntrup',\n\t'Bhojpur Kadim',\n\t'Jaltenco',\n\t'Attendorn',\n\t'Andranovory',\n\t'Binche',\n\t'Muscat',\n\t'Ludwigsburg',\n\t'Ain Zora',\n\t'Dabutou',\n\t'Landgraaf',\n\t'Kaunas',\n\t'Sandwa',\n\t'Dingolfing',\n\t'Rothenbach an der Pegnitz',\n\t'Sheghnan',\n\t'Mawai',\n\t'Sunnyside',\n\t'Esteio',\n\t'Carnoustie',\n\t'Sakura',\n\t'Monte Compatri',\n\t'Rize',\n\t'Walvisbaai',\n\t'Gouande',\n\t'Bardipuram',\n\t'Rockford',\n\t'Pipra Dewas',\n\t'Jagdishpur',\n\t'Sonwan',\n\t'Bridgewater',\n\t'Akpassi',\n\t'Zoumi',\n\t'Tongchuanshi',\n\t'Guagua',\n\t'Ayacucho',\n\t'Lom',\n\t'Wang Sombun',\n\t'Pran Buri',\n\t'Rass el Djebel',\n\t'Pita',\n\t'Ait Hani',\n\t'Saraikela',\n\t'Cepagatti',\n\t'Monte Patria',\n\t'Bessemer',\n\t'Santa Juliana',\n\t'Obuse',\n\t'Schilde',\n\t'Varel',\n\t'Almhult',\n\t'Wesel',\n\t'Xanten',\n\t'Bastogne',\n\t'Glyka Nera',\n\t'Tasova',\n\t'Rampur Shamchand',\n\t'Maarssen',\n\t'La Asuncion',\n\t'Streaky Bay',\n\t'Ridgefield Park',\n\t'Tichi',\n\t'Busuanga',\n\t'Arakvaz-e Malekshahi',\n\t'Ban Bong Tai',\n\t\"Vel'ke Kapusany\",\n\t'Maracas',\n\t'Rio das Flores',\n\t'Moers',\n\t'Bexleyheath',\n\t'Savsat',\n\t'Morsott',\n\t'Germersheim',\n\t'Pungulam',\n\t'Sussex',\n\t'Bilwi',\n\t'Abare',\n\t'El Tumbador',\n\t'Guebwiller',\n\t'Bourg-en-Bresse',\n\t'Koskapur',\n\t'Orvieto',\n\t'Quartz Hill',\n\t'Espita',\n\t'Vechelde',\n\t'Banting',\n\t'Cancun',\n\t'Humahuaca',\n\t'Hockley',\n\t'Barwan',\n\t'Gravesend',\n\t'Palhalan',\n\t'Galway',\n\t'Shotley Bridge',\n\t'Guioyo',\n\t'Xaxim',\n\t'Dunkirk',\n\t'Amreli',\n\t'Balqash',\n\t'Buruanga',\n\t'Nachchandupatti',\n\t'Nejo',\n\t'Lumba-a-Bayabao',\n\t'Harri',\n\t'Gaoliying Ercun',\n\t'Erumakkuzhi',\n\t'Campina Grande',\n\t'Palimbang',\n\t'Al Jabayish',\n\t'Gurdaspur',\n\t'Spaichingen',\n\t'Le Pontet',\n\t'Villiers-sur-Marne',\n\t'Doruma',\n\t'Isa',\n\t'Puerto San Jose',\n\t'Gunupur',\n\t'Salcea',\n\t'Maruttuvakkudi',\n\t'Nsanje',\n\t'Mahamda',\n\t'Pola de Siero',\n\t'Radenci',\n\t'Chincha Alta',\n\t'Ed Damazin',\n\t'Red Bank',\n\t'Whitehaven',\n\t'Oulad Driss',\n\t'Edinburg',\n\t'Floresta',\n\t'Vili',\n\t'Saghar Sultanpur',\n\t'Salon-de-Provence',\n\t'Batufah',\n\t'Dalkola',\n\t'Fostoria',\n\t'Yauco',\n\t'Maridi',\n\t'Nueva Imperial',\n\t'Saint-Jean-sur-Richelieu',\n\t'Tupaciguara',\n\t'Palmdale',\n\t\"Notre-Dame-de-l'Ile-Perrot\",\n\t'Rio Largo',\n\t'Ntossoni',\n\t'Nagnur',\n\t'Wallkill',\n\t'Breda',\n\t'Solindabad',\n\t'Penkridge',\n\t'Agui',\n\t'George Mason',\n\t'Aliartos',\n\t'Itatinga',\n\t'Tekkampatti',\n\t'Turicato',\n\t'Chorleywood',\n\t'Grootfontein',\n\t'Kassa',\n\t'Kotli',\n\t'Sayreville',\n\t'Kottavalasa',\n\t'North Plainfield',\n\t'Madanapalle',\n\t'Santa Eulalia',\n\t'Farnborough',\n\t'Lerwick',\n\t'Rohar',\n\t'Holalkere',\n\t'Gavirate',\n\t'Pace',\n\t'Bharokhara',\n\t'Oraiokastro',\n\t'Senekane',\n\t'Ambohitrarivo',\n\t'Regente Feijo',\n\t'Ambotaka',\n\t'El Crucero',\n\t'Gummudipundi',\n\t'Romilly-sur-Seine',\n\t'Tanggemu Nongchang',\n\t'Chubek',\n\t'Quattro Castella',\n\t'Sai Buri',\n\t'Piuma',\n\t'Cerveteri',\n\t'West Rancho Dominguez',\n\t'Carmona',\n\t'Santa Maria',\n\t'Cayiralan',\n\t'Wennigsen',\n\t'Batalha',\n\t'Vatican City',\n\t'Bahrain',\n\t'Tenente Ananias Gomes',\n\t'Lusambo',\n\t'Angra dos Reis',\n\t'Pilkhua',\n\t'San Marcelino',\n\t'Kuching',\n\t'Moche',\n\t'Straza',\n\t'Ban Ueam',\n\t'Kibale',\n\t'Shahdadpur',\n\t'West Long Branch',\n\t'Killai',\n\t'Chandia',\n\t'Los Teques',\n\t'Hpa-An',\n\t'Wenden',\n\t'Sao Bento',\n\t'Wentorf bei Hamburg',\n\t'Farajok',\n\t'Uppugunduru',\n\t'Samkir',\n\t'Samraong',\n\t'Pind Dadan Khan',\n\t'Rajmahal',\n\t'Paz de Ariporo',\n\t'Rincon de la Victoria',\n\t'Vyshhorod',\n\t'Khaniadhana',\n\t'Fuxing',\n\t'Xibang',\n\t'Antanananivo',\n\t'Peekskill',\n\t'Kanhauli Manohar',\n\t'Kengtung',\n\t'Yahyali',\n\t'Yecun',\n\t'Albolote',\n\t'Etrotroka',\n\t'Robstown',\n\t'Bacoli',\n\t'Godfrey',\n\t'Savastepe',\n\t'Netphen',\n\t'Cam',\n\t'Moortebeek',\n\t'Koufalia',\n\t'Tabatinga',\n\t'Qadirganj',\n\t'Tlanchinol',\n\t'Kokopo',\n\t'Parelhas',\n\t'Bergkamen',\n\t'Crossville',\n\t'Charallave',\n\t'Mahugaon',\n\t'Tazhakudi',\n\t'Nawa Nagar Nizamat',\n\t'Rizhao',\n\t'Bilasipara',\n\t'Kfar Aabida',\n\t\"E'erguna\",\n\t'Rio Branco',\n\t'Buique',\n\t'Maesawa',\n\t'Rabak',\n\t'Noqui',\n\t'Maxcanu',\n\t'Otegen Batyr',\n\t'Nellipoyil',\n\t'Oakville',\n\t'Serowe',\n\t'Conselheiro Pena',\n\t'Ban Fang Tuen',\n\t'Santa Isabel',\n\t'Sukhasan',\n\t'Ocos',\n\t'Cai Lay',\n\t'Mangamila',\n\t'Sikar',\n\t'Ogoshi',\n\t'Wimbledon',\n\t'Islam Qal`ah',\n\t'Iawar',\n\t'Kuala Lipis',\n\t'Gressier',\n\t'South Laurel',\n\t'Greendale',\n\t'Ilfracombe',\n\t'Prestonpans',\n\t'Stonegate',\n\t'Willich',\n\t'Forssa',\n\t'Enghien-les-Bains',\n\t'Balintawak',\n\t'Kitgum',\n\t'Pucallpa',\n\t'Bhilai Karanja',\n\t'Uzundere',\n\t'Boshof',\n\t'Maradi',\n\t'Bekasi Kota',\n\t'Mission',\n\t'Lecherias',\n\t'Valverde del Camino',\n\t'Bojaca',\n\t'Khowai',\n\t'Heerlen',\n\t'Bucyrus',\n\t'Ipameri',\n\t'Kadaiyam',\n\t'Guanagazapa',\n\t'Lencois',\n\t'Riosucio',\n\t'Sredets',\n\t'Rio de Janeiro',\n\t'Peringuzha',\n\t'Rabat',\n\t'Kupang',\n\t'Louis Trichardt',\n\t'Tlalixtac de Cabrera',\n\t'Quincy',\n\t'Kerrville',\n\t'Khandala',\n\t'Waconia',\n\t'Aventura',\n\t'Mahabad',\n\t'Ciudad Miguel Aleman',\n\t'Al Hamdaniyah',\n\t'Mankur',\n\t'Dumbea',\n\t'Sungailiat',\n\t'Huitan',\n\t'Naubatpur',\n\t'Soubre',\n\t'Kaniama',\n\t'Dholbaja',\n\t'Kuala Kapuas',\n\t'Oplotnica',\n\t'Rampur Hat',\n\t'Sangaree',\n\t'Fatoma',\n\t'El Arba Des Bir Lenni',\n\t'Huamantla',\n\t'Enamadala',\n\t'Alibunar',\n\t'Madirovalo',\n\t'Bampur',\n\t'Karachi',\n\t'Lehi',\n\t'Cross Lanes',\n\t'Abou el Hassan',\n\t'Telwa',\n\t'Ga-Kgapane',\n\t'Navraftor',\n\t'Janapadu',\n\t'Garesnica',\n\t'Awantipur',\n\t'El Fanar',\n\t'Ayyampettai',\n\t'Shangzhuangcun',\n\t'Gainesville',\n\t'Santanopolis',\n\t'La Goulette',\n\t'Chiknayakanhalli',\n\t'Murtosa',\n\t'Tirano',\n\t'Heckmondwike',\n\t'Mantenopolis',\n\t'Villa Corzo',\n\t'Gacko',\n\t'Etterbeek',\n\t'Dargot',\n\t'Kattamuru',\n\t'Thazhamel',\n\t'Armilla',\n\t'Eisenstadt',\n\t'Elbeuf',\n\t'Metsamor',\n\t\"'Ain el Melh\",\n\t'Karunagapalli',\n\t'Dayr al Balah',\n\t'Qazvin',\n\t'Brokopondo',\n\t'Keetmanshoop',\n\t'Chopadandi',\n\t'Shinas',\n\t'Silverdale',\n\t'Orcutt',\n\t'La Concepcion',\n\t'Kebili',\n\t'Tecoluca',\n\t'Kursaha',\n\t'Laiyuan',\n\t'Hilliard',\n\t'Summit',\n\t'Vadakku Viravanallur',\n\t'Phanat Nikhom',\n\t'Vila Rica',\n\t'Vantaa',\n\t'Saint-Amand-les-Eaux',\n\t'Inole',\n\t'Barrancas',\n\t'Upala',\n\t'Albania',\n\t'Puerto Galera',\n\t'Calulo',\n\t'Mioveni',\n\t'Yangiariq',\n\t'Newport News',\n\t'Puerto Villarroel',\n\t'San Juan del Rio',\n\t'Badarwas',\n\t'Chertsey',\n\t'Montalvo',\n\t'Nulivedu',\n\t'Ain Nouissy',\n\t'Linhares',\n\t'Sao Joao da Ponte',\n\t'Palos Heights',\n\t'Mondolfo',\n\t'Vibo Valentia',\n\t\"Colle di Val d'Elsa\",\n\t'Tache',\n\t'Mixquiahuala de Juarez',\n\t'Montegiardino',\n\t'Franca',\n\t'Iwo',\n\t'Northfield',\n\t'Neyyattinkara',\n\t'Hirna',\n\t'Acquaviva delle Fonti',\n\t'Voiron',\n\t'Iturama',\n\t'Aklanpa',\n\t'Raymondville',\n\t'Ambohimandroso',\n\t'Lakshmipur',\n\t'Torgelow',\n\t'Trento',\n\t'Neiva',\n\t'Umuarama',\n\t'San Mauro Torinese',\n\t'Pago Pago',\n\t'Ulricehamn',\n\t'San Cristobal Cucho',\n\t'Owendo',\n\t'Basht',\n\t'Conthey',\n\t'Damba',\n\t'Senmayacho-senmaya',\n\t'Gdansk',\n\t'Antilla',\n\t'Husavik',\n\t'Frankfurt',\n\t'Seaham',\n\t'Zagan',\n\t'Westerly',\n\t'Sivasli',\n\t'Nablus',\n\t'El Wak',\n\t'Saddle Brook',\n\t'Tepelene',\n\t'Vyskov',\n\t'Tavagnacco',\n\t'Ndende',\n\t'Salanso',\n\t'Laranjeira',\n\t'Tranquebar',\n\t'Battulapalle',\n\t'Bhilwara',\n\t'Cork',\n\t'Ennis',\n\t'Danjiangkou',\n\t'North Logan',\n\t'Viralimalai',\n\t'Firoza',\n\t'Bettiah',\n\t'Atharga',\n\t'Tallimarjon Shahri',\n\t'Yangi Marg`ilon',\n\t'Lohariandava',\n\t'Opera',\n\t'Gampaha',\n\t'Teboulba',\n\t'Solofra',\n\t'Portoferraio',\n\t'Daijiazhuang',\n\t'Jiexiu',\n\t'Sinkolo',\n\t'Joutseno',\n\t'Donauworth',\n\t'South Glengarry',\n\t'Nawabganj',\n\t'Lodhran',\n\t'Rio San Juan',\n\t'Kriva Palanka',\n\t'Rozaje',\n\t'Manapla',\n\t'Negresti-Oas',\n\t'Plaine Magnien',\n\t'Satsuma',\n\t'Fatehabad',\n\t'Rio do Antonio',\n\t'Calafat',\n\t'Preganziol',\n\t'Spalding',\n\t'Xinji',\n\t'Kilkottai',\n\t'Guding',\n\t'Milici',\n\t'Paranavai',\n\t'Skopun',\n\t\"Debre Mark'os\",\n\t'Isingiro',\n\t'Port-Margot',\n\t'Ludinghausen',\n\t'Grossenluder',\n\t'Fenyuan',\n\t'Araras',\n\t'Terme',\n\t'Conneaut',\n\t'Winnetka',\n\t'Pelhrimov',\n\t'Pir Bakran',\n\t'Sukkampatti',\n\t'Shrirangapattana',\n\t'Vatra Dornei',\n\t'Palmaner',\n\t'Goose Creek',\n\t'Hailsham',\n\t'Douar Tabouda',\n\t'Douar Echbanat',\n\t'Adre',\n\t'Quinto di Treviso',\n\t'Lagoa Vermelha',\n\t'Ambatomivary',\n\t'Maidencreek',\n\t'Huanuco',\n\t'Sommerda',\n\t\"Sant'Arcangelo di Romagna\",\n\t'Huancavelica',\n\t'Erramvaripalem',\n\t'Gyomaendrod',\n\t'Szigetvar',\n\t\"Xin'an\",\n\t'Behror',\n\t'Antanimenabaka',\n\t'Sonbarsa',\n\t'Cuajinicuilapa',\n\t'Lovosice',\n\t'Carlos Barbosa',\n\t'Mlada Boleslav',\n\t'Wesley Chapel',\n\t'Adelsdorf',\n\t'Temascal',\n\t'Novovolynsk',\n\t'Brattleboro',\n\t'Yapacani',\n\t'Sao Sebastiao do Curral',\n\t'Makinsk',\n\t'Ojinaga',\n\t'Shaoxing',\n\t'Numazu',\n\t'Edakkazhiyur',\n\t'Riesi',\n\t'Bagamanoc',\n\t'Inkster',\n\t'Sugarland Run',\n\t'Savenay',\n\t'Eidhi',\n\t'Elvas',\n\t'Pannimadai',\n\t'Dorverden',\n\t'Luanshya',\n\t'Grays',\n\t'Tenente Portela',\n\t'Iuna',\n\t'Okmulgee',\n\t'Busra al Harir',\n\t'Kil Perambalur',\n\t'Urucurituba',\n\t'Villa Aberastain',\n\t'Sitakund',\n\t'Ras el-Barr',\n\t'Luwero',\n\t'Itaguacu',\n\t'Vadasinor',\n\t'Sile',\n\t'Inhapi',\n\t'Tanguieta',\n\t'Olney',\n\t'Sonpur',\n\t'Gillitts',\n\t'Fond du Lac',\n\t'Aboso',\n\t'Oujda-Angad',\n\t'Tiquisate',\n\t'Chuqung',\n\t'Jose Abad Santos',\n\t'Holsbeek',\n\t'Lioua',\n\t'Wiang Haeng',\n\t'Sirugudi',\n\t'Gomparou',\n\t'Kodangipatti',\n\t'Jitwarpur Kumhra',\n\t'Dhaula',\n\t'Monte Carmelo',\n\t'Zhytomyr',\n\t'Copertino',\n\t'Panggezhuang',\n\t\"M'lang\",\n\t'Caconde',\n\t'Sao Sebastiao',\n\t'Rurrenabaque',\n\t'Canaman',\n\t'Vienna',\n\t'Shichinohe',\n\t'Catia La Mar',\n\t'Pachchaimalaiyankottai',\n\t'Bema',\n\t'Guadalupe',\n\t'Fouchana',\n\t'Takatsuki',\n\t'Nakrekal',\n\t'Greenfield',\n\t'Mirabel',\n\t'Sharon',\n\t'Valenzuela',\n\t'Shiroi',\n\t'Polotitlan de la Ilustracion',\n\t'Skawina',\n\t'Merrifield',\n\t'Bitetto',\n\t'Hinsdale',\n\t'Kalafotsy',\n\t'Reddigudem',\n\t'El Colegio',\n\t'Santa Ana Jilotzingo',\n\t'Korkuteli',\n\t'Xieqiaocun',\n\t'Nikko',\n\t'Purulha',\n\t'Al Hasakah',\n\t'Puigcerda',\n\t'Diabugu',\n\t'Sao Joao de Pirabas',\n\t'Yegainnyin',\n\t'Itasca',\n\t'Italva',\n\t'Olavarria',\n\t'Dikirnis',\n\t'Tantoucun',\n\t'Al Khmissat',\n\t'Woodland',\n\t'Vasco Da Gama',\n\t'Amalapuram',\n\t'Los Amates',\n\t'Gotha',\n\t'Burscheid',\n\t'Tanippadi',\n\t'Xinyingheyan',\n\t'St. Pete Beach',\n\t'Chieri',\n\t'Ahmadpur',\n\t'Capela do Alto',\n\t'Ebn Ziad',\n\t'Moimenta da Beira',\n\t'Schwarzenbek',\n\t'Sasthankotta',\n\t'Lannion',\n\t'Oupeye',\n\t'Digne-les-Bains',\n\t'Kami',\n\t'Widnes',\n\t'Bala Cangamba',\n\t'Edmonds',\n\t'Qabr as Sitt',\n\t'Lorient',\n\t'Antsinanantsena',\n\t'Liteni',\n\t'Belsand',\n\t'Tibau do Sul',\n\t'Melpanaikkadu',\n\t'Uranganpatti',\n\t'Canasgordas',\n\t'Totnes',\n\t'King Edward Point',\n\t'Ben Daoud',\n\t'Aarau',\n\t'San Sebastiano al Vesuvio',\n\t'Bagam',\n\t'Hobart',\n\t'Shimada',\n\t'Roelofarendsveen',\n\t'Broomfield',\n\t'Palenga',\n\t'Rainham',\n\t'Molepolole',\n\t'Hayama',\n\t'Guines',\n\t'Gonubie',\n\t'Filiasi',\n\t'Gethaura',\n\t'General Rodriguez',\n\t'Guilderland',\n\t'Acarigua',\n\t'Lowell',\n\t'Subulussalam',\n\t'Boiro',\n\t'Workington',\n\t'Sebes',\n\t'Konibodom',\n\t'Grevesmuhlen',\n\t'Mixco',\n\t'St. Andrews',\n\t'Tirora',\n\t'Gubat',\n\t'Edattirutti',\n\t'Bad Wildbad',\n\t'Newport Pagnell',\n\t'Jadcherla',\n\t'Mountain House',\n\t'Pindare-Mirim',\n\t'Hollins',\n\t'Barddhaman',\n\t'Castro-Urdiales',\n\t'Bandora',\n\t'Masandra',\n\t'Charo',\n\t'Qiryat Bialik',\n\t'Turangi',\n\t'Lavras da Mangabeira',\n\t'Hanover',\n\t'Middleburg',\n\t'Umm Qasr',\n\t'Kingswinford',\n\t'Dachne',\n\t'Surcin',\n\t'Al Manaqil',\n\t'Sorombo',\n\t'Maruteru',\n\t'Chaona',\n\t'Morbi',\n\t'Rani Shakarpura',\n\t'Tiko',\n\t'Picarras',\n\t'Keratsini',\n\t'West Deptford',\n\t'Natividade',\n\t'Kalale',\n\t'Hohenkirchen-Siegertsbrunn',\n\t'Huachipato',\n\t'Ubaitaba',\n\t'Shashijie',\n\t'Nalambur',\n\t'Monte Mor',\n\t'Halikner',\n\t'Pinczow',\n\t'Vellavadanparappu',\n\t'Ankli',\n\t'Oakdale',\n\t'Ar Rommani',\n\t'Phulwaria',\n\t'Berchem',\n\t'Ban Bang Muang',\n\t'Mangalapur',\n\t'Maki',\n\t'Puente Alto',\n\t'Paoy Paet',\n\t'Parsagarhi',\n\t'Gobernador Galvez',\n\t'Narpes',\n\t'Kodumudi',\n\t'Vostochnyy',\n\t'Grabouw',\n\t'Volketswil',\n\t'Qabala',\n\t'Falan',\n\t'Sankt Veit an der Glan',\n\t'Bargur',\n\t'Zalishchyky',\n\t'Paraiso do Norte',\n\t'Guymon',\n\t'Corsicana',\n\t'Malargue',\n\t'Cheran',\n\t'Makhmalpur',\n\t'Mitchellville',\n\t'Ouamri',\n\t'Kegeyli Shahar',\n\t'Nalbari',\n\t'Caazapa',\n\t'Bebedouro',\n\t'Crixas',\n\t'Jaisinghnagar',\n\t'Cuimba',\n\t'Ankireddikuntapalem',\n\t'Biknur',\n\t'Parauli',\n\t'Solec Kujawski',\n\t'La Riviera',\n\t'Sakae',\n\t'Ville Bonheur',\n\t'Galkot',\n\t'Tessalit',\n\t'Joao Alfredo',\n\t'Vinkovci',\n\t'Karuppur',\n\t'Vedappatti',\n\t'Palocabildo',\n\t'Nanjing',\n\t'Haidarnagar',\n\t'Kabankalan',\n\t'Acapetahua',\n\t'Yashio',\n\t'Wasaga Beach',\n\t'Gorzow Wielkopolski',\n\t'Erzurum',\n\t'Jordbro',\n\t'Ilmajoki',\n\t'Cuauhtemoc',\n\t'Soldanesti',\n\t'Kontagora',\n\t'Baleno',\n\t'Umbertide',\n\t'Cividale del Friuli',\n\t'Maidenhead',\n\t'Taupo',\n\t'Potters Bar',\n\t'Hubli',\n\t'Kakching',\n\t'Aguadilla',\n\t'Dobrna',\n\t'Souk Ahras',\n\t'Giessen',\n\t'Feriana',\n\t'Simdega',\n\t'Kadugli',\n\t'Makati City',\n\t'Harqalah',\n\t'Flowery Branch',\n\t'Spartanburg',\n\t'Royal Oak',\n\t'Fukuroi',\n\t'Kishmat Dhanbari',\n\t'Somerset East',\n\t'Behisatse',\n\t'Tummalapenta',\n\t'Central District',\n\t'Tubize',\n\t'Issy-les-Moulineaux',\n\t'Lezhe',\n\t'Buriti dos Lopes',\n\t'Krusevo',\n\t'Shibuya-ku',\n\t'Cachoeira',\n\t'Takahata',\n\t'Bozeman',\n\t'Yongqing',\n\t'Rio Vista',\n\t'Primavera',\n\t'Bainbridge Island',\n\t'Lo Miranda',\n\t'Sanharo',\n\t'Sentjernej',\n\t'Coral Hills',\n\t'Serres',\n\t'Kapan',\n\t'Caruaru',\n\t'Shijonawate',\n\t'Para de Minas',\n\t'Buco Zau',\n\t'Shaker Heights',\n\t'Zhaoyu',\n\t'Koto-ku',\n\t'Parvatgiri',\n\t'Evergem',\n\t'Asalem',\n\t\"Mu'tah\",\n\t'Mahalleh-ye Shirinu',\n\t'Douar Oulad Hssine',\n\t'Villa Purificacion',\n\t'Arras',\n\t\"Sao Lourenco d'Oeste\",\n\t'Bad Krozingen',\n\t'Olgiate Comasco',\n\t'Hanumannagar',\n\t'Echemmaia Est',\n\t'Lennox',\n\t'Kalimpong',\n\t'Kitob',\n\t'Las Palmas',\n\t'Guacima',\n\t'Urgut Shahri',\n\t'Carnot',\n\t'Lambertville',\n\t'Sabara Bangou',\n\t'Shahr-e Herat',\n\t'Longford',\n\t'Kambove',\n\t'Cartagena',\n\t'Odessa',\n\t'Bani Suwayf',\n\t'Toqsu',\n\t'Bibbiano',\n\t'Torres Vedras',\n\t'Bareja',\n\t'Maying',\n\t'Gross-Umstadt',\n\t'Anzoategui',\n\t'Holstebro',\n\t'Baturite',\n\t'Neduvannur',\n\t\"Terra Roxa d'Oeste\",\n\t'Cencheng',\n\t'Marondera',\n\t'Azumino',\n\t'Sanha',\n\t'Porto Grande',\n\t'Ansermanuevo',\n\t'Perigueux',\n\t'Makronia',\n\t\"Bek'oji\",\n\t'Los Blancos',\n\t'Argeles-sur-Mer',\n\t'Khorabar',\n\t'Fushe-Kruje',\n\t'Fotsialanana',\n\t'Aomar',\n\t'Guardamar del Segura',\n\t'Ksibet el Mediouni',\n\t'Georgian Bluffs',\n\t'Stockport',\n\t'Saray',\n\t'Buckley',\n\t'Daventry',\n\t'Jaqma',\n\t'Guifoes',\n\t'Patpara',\n\t'Bonhill',\n\t'Presidente Figueiredo',\n\t'Cutral-Co',\n\t'Morgan City',\n\t'Cernusco sul Naviglio',\n\t'Beheloka',\n\t'Bargny',\n\t'Brits',\n\t'Nakasato',\n\t'San Jose de Feliciano',\n\t'Lithia Springs',\n\t'Kushtia',\n\t'Nasipit',\n\t'Alsdorf',\n\t'Rockland',\n\t'Homestead',\n\t'Ziketan',\n\t'Ludvika',\n\t'Erbil',\n\t'Meguro',\n\t'Teolo',\n\t'Lapovo',\n\t'Streetly',\n\t'Dar es Salaam',\n\t'Middleton',\n\t'Ayancik',\n\t'Canoas',\n\t'Kanrangana',\n\t'Parczew',\n\t'Puck',\n\t'Mario Campos',\n\t'Bedourie',\n\t'Bohumin',\n\t'Freha',\n\t'Juventino Rosas',\n\t'Kolaras',\n\t'Oued Sebbah',\n\t'Kinattukkadavu',\n\t'Peravurani',\n\t'Barahona',\n\t'Kalabo',\n\t'Kumluca',\n\t'Saint-Priest',\n\t'Tagkawayan',\n\t'Durazno',\n\t'Ouled Rabah',\n\t'Susangerd',\n\t'Reynosa',\n\t'Araraquara',\n\t'Ambinanynony',\n\t'Puerto Madryn',\n\t'Villa Juarez',\n\t'Bletchley',\n\t'Santo Tomas de Janico',\n\t'El Arahal',\n\t'Bijapur',\n\t'Villeneuve-la-Garenne',\n\t'Nantong',\n\t'Semera',\n\t'Dean Funes',\n\t'Koblenz',\n\t'Montebello',\n\t'Sideradougou',\n\t'Luzhou',\n\t'Yuanchang',\n\t'Tulbagh',\n\t'Hitoyoshi',\n\t'Wijk bij Duurstede',\n\t'Damascus',\n\t'Branchburg',\n\t'Bahutal',\n\t'Payyanpalli',\n\t'Gjovik',\n\t'Pudukkottai',\n\t'Lakhdaria',\n\t'Paracambi',\n\t'El Bagre',\n\t'Ban Cho Ho',\n\t'Villamartin',\n\t'Natogyi',\n\t'Wildwood',\n\t'Tall Salhab',\n\t'Fort Erie',\n\t'Kirtipur',\n\t'Quirihue',\n\t'Masamagrell',\n\t'Medak',\n\t'Futtsu',\n\t'Cuamba',\n\t'Zbarazh',\n\t'Beniel',\n\t'Azzaba',\n\t'Banaruyeh',\n\t'Denver',\n\t'Slough',\n\t'Khenifra',\n\t'Nanbu',\n\t'Ibarra',\n\t'Galashiels',\n\t'Malyn',\n\t'Biei',\n\t'Eranapuram',\n\t'Miechow',\n\t'San Benedetto del Tronto',\n\t'St. Matthews',\n\t'Muhlenberg',\n\t'Cape Coast',\n\t'Massa Lombarda',\n\t'Raybag',\n\t'Villeta',\n\t'Jogbani',\n\t'Agua Blanca',\n\t'Kaluderica',\n\t'Dinnington',\n\t'Jepara',\n\t'Bhimadolu',\n\t'Ortona',\n\t'Xincheng',\n\t'Huancayo',\n\t'Crewe',\n\t'Koduvilarpatti',\n\t'Eggertsville',\n\t'Agege',\n\t'Gharyan',\n\t'Sucupira do Norte',\n\t'Datian',\n\t'Kaldsletta',\n\t'Paillaco',\n\t'Anjanazana',\n\t'Sulphur',\n\t'Kakrala',\n\t'Walin',\n\t'Francisco Caballero Alvarez',\n\t'Frenda',\n\t'Robertsport',\n\t'Simanggang',\n\t'Flers',\n\t'Tindouf',\n\t'Azna',\n\t'Umrat',\n\t'Chhimluang',\n\t'Felixlandia',\n\t'Tung Tau Tsuen',\n\t'Soledar',\n\t'Mejorada del Campo',\n\t'Nijlen',\n\t'Przeworsk',\n\t'Upper Leacock',\n\t'Machico',\n\t'Arakkapadi',\n\t'Gawan',\n\t'Tracuateua',\n\t'Tilbury',\n\t'Indiaroba',\n\t'Villa Constitucion',\n\t'Gil',\n\t'Soyaniquilpan',\n\t'Nanchang',\n\t'Guaxupe',\n\t'Gardone Val Trompia',\n\t'Lampang',\n\t'Kahror Pakka',\n\t'Kundurpi',\n\t'Gallatin',\n\t'Belper',\n\t'Beruri',\n\t'El Pinon',\n\t'Chengjiao Chengguanzhen',\n\t'Ad Darbasiyah',\n\t'Neo Karlovasi',\n\t'Mersin',\n\t'Glyfada',\n\t'Bastak',\n\t'Wolfersheim',\n\t'Albenga',\n\t'Kuqa',\n\t'Isanlu',\n\t'Kaji',\n\t'Barranquilla',\n\t'Sai Kung Tuk',\n\t'Hish',\n\t'Overpelt',\n\t'La Vista',\n\t'Livingston',\n\t'Bangassi-Nangou',\n\t'Purcellville',\n\t'Mashpee',\n\t'Alushta',\n\t'Tikar',\n\t'Katima Mulilo',\n\t'Duvvuru',\n\t'Paragominas',\n\t'Mosquera',\n\t'Yuzhnoukrainsk',\n\t'Senador Jose Porfirio',\n\t'Mutuipe',\n\t'Castenaso',\n\t'Schmolln',\n\t'Mporokoso',\n\t'Tawsalun',\n\t'Malo',\n\t'Myedu',\n\t'Orsta',\n\t'Staten Island',\n\t'Goch',\n\t'Dulag',\n\t'Bedlington',\n\t'Mangatarem',\n\t'Lubok Antu',\n\t'Zongo',\n\t'Toktogul',\n\t'Sabana Grande de Boya',\n\t'Mullheim',\n\t'Mogilno',\n\t'Abra Pampa',\n\t'Sidi Baizid',\n\t'Rostusa',\n\t'Glen Allen',\n\t'Barra de Sao Francisco',\n\t'Jocotitlan',\n\t'Pensilvania',\n\t'Petropavl',\n\t'Radlje ob Dravi',\n\t'Chichaoua',\n\t'Irondale',\n\t'Namhkam',\n\t'Liestal',\n\t'Yazu',\n\t'Douar Olad. Salem',\n\t'Mecca',\n\t'Fergus Falls',\n\t'Shimotoba',\n\t'Purificacion',\n\t'Qal`at Sukkar',\n\t'Zhezqazghan',\n\t'Kenafif',\n\t'Chak That',\n\t'Roanoke Rapids',\n\t'Manakondur',\n\t'Beni Enzar',\n\t\"Nefas Mewch'a\",\n\t'Kerap',\n\t'Narsingi',\n\t'Arys',\n\t'Ajaccio',\n\t'Lihue',\n\t'Herentals',\n\t'Tarakan',\n\t'San Jose del Fragua',\n\t'Sitio Novo de Goias',\n\t'Jammu',\n\t'Ballesteros',\n\t'Bayreuth',\n\t'Schererville',\n\t'Kara-Suu',\n\t'Mbandjok',\n\t'Xinpi',\n\t'Caudry',\n\t'Jalhalli',\n\t'Rosario de Mora',\n\t'Hampden',\n\t'Tevaram',\n\t'Annapolis Neck',\n\t'Minokamo',\n\t'Ghataro Chaturbhuj',\n\t'Neyshabur',\n\t'North Mankato',\n\t'Nea Makri',\n\t'Matino',\n\t'San Vito al Tagliamento',\n\t'Shangchuankou',\n\t'Maldon',\n\t'Tirupparangunram',\n\t'Chateauneuf-les-Martigues',\n\t'Sumare',\n\t'La Calamine',\n\t'Plettenberg Bay',\n\t\"Monteroni d'Arbia\",\n\t'Ban Charoen Mueang',\n\t'Pukekohe East',\n\t'Ban Sop Tia',\n\t'Barbacoas',\n\t'Plottier',\n\t'Fleetwood',\n\t'Fultondale',\n\t'Karahia',\n\t'Grefrath',\n\t'Kalavai',\n\t'Borsa',\n\t'Bournville',\n\t'Changwon',\n\t'Chik Banavar',\n\t'Kungsbacka',\n\t'Yunoshima',\n\t'Pithiviers',\n\t'Zepce',\n\t'Rosario do Sul',\n\t'Nadiad',\n\t'Besancon',\n\t'Rupbas',\n\t'Muong Theng',\n\t'Dubrovytsya',\n\t'Someren',\n\t'Lianyuan',\n\t'Huilongping',\n\t'Zrenjanin',\n\t'Ban Wiang Phan',\n\t'Jucurutu',\n\t'Alamos',\n\t'Zetang',\n\t'Lymm',\n\t'Sarajevo',\n\t'Saint-Sebastien-sur-Loire',\n\t'Sereflikochisar',\n\t'Suai',\n\t'La Leonesa',\n\t'Tequisquiapan',\n\t'Faya',\n\t'Fort Saskatchewan',\n\t'Neuilly-Plaisance',\n\t'Elenga',\n\t'Dearborn',\n\t'Gok',\n\t'Ipora',\n\t'Mierlo',\n\t'Ottappalam',\n\t'Mirandiba',\n\t'Rongjiawan',\n\t'Sarno',\n\t'Volpiano',\n\t'Ain Touta',\n\t'Swietochlowice',\n\t'San Dimas',\n\t'Brenham',\n\t'Birkenfeld',\n\t'Sveti Jurij',\n\t'Montfermeil',\n\t'Bowen',\n\t'Xiangcheng',\n\t'Bariariya',\n\t'Albufeira',\n\t'Pantin',\n\t'Ruffano',\n\t'Buurhakaba',\n\t'Kulai',\n\t'Nordlingen',\n\t'Alcanar',\n\t'Ostfildern',\n\t'San Juan del Puerto',\n\t'Zunhua',\n\t'Yuregir',\n\t'Amha',\n\t'San Antonio de los Banos',\n\t'Pojuca',\n\t'Cernavoda',\n\t'Maria',\n\t'Saky',\n\t'Ciudad Victoria',\n\t'Qasr-e Qand',\n\t'North Lauderdale',\n\t'Manahari',\n\t'Kartikapalli',\n\t'Herne',\n\t'Zabki',\n\t'Middle River',\n\t'Moncion',\n\t'Er Regueb',\n\t'Ridge',\n\t'Tezu',\n\t'Djendel',\n\t'Tynaarlo',\n\t'Katra',\n\t'Le Plessis-Trevise',\n\t'Pernik',\n\t'Grossostheim',\n\t'Dharir',\n\t'Kherrata',\n\t'Guamal',\n\t'Mangrawan',\n\t'Haldibari',\n\t'Yingzhou Linchang',\n\t'Zgierz',\n\t'Brownsburg',\n\t'Radebeul',\n\t'Novara',\n\t'Markacho',\n\t'Lochristi',\n\t'Oyem',\n\t'Porcia',\n\t'Bogoso',\n\t'Tapa',\n\t'Carmagnola',\n\t'Alto Parnaiba',\n\t'Prosper',\n\t'Nossombougou',\n\t'Tohana',\n\t'Turlock',\n\t'Gualaquiza',\n\t'Masrakh',\n\t\"Arba Minch'\",\n\t'Moroto',\n\t'Carcassonne',\n\t'Paraipaba',\n\t'Jajarm',\n\t'Raparla',\n\t\"Diao'ecun\",\n\t'Oued Laou',\n\t'Sint-Niklaas',\n\t'Masuda',\n\t'Tilvalli',\n\t'Tauranga',\n\t'Upplands Vasby',\n\t'Wabash',\n\t'Tapas',\n\t'Al `Alamayn',\n\t'Huozhou',\n\t'Tshikapa',\n\t'Kennedy Town',\n\t'Wisconsin Rapids',\n\t'Yangiyul',\n\t'Quezalguaque',\n\t'Bougado',\n\t'Cuautepec de Hinojosa',\n\t'Mundo Novo',\n\t'Verl',\n\t'Maghnia',\n\t'Dzouz',\n\t'Principe da Beira',\n\t'Bamessi',\n\t'Soloma',\n\t'Basay',\n\t'Closter',\n\t'Amatenango de la Frontera',\n\t'Bazarak',\n\t'Benairia',\n\t'Mocharim',\n\t'Kuchesfahan',\n\t'Kurayoshi',\n\t'Luohe',\n\t'Kampot',\n\t'Chaska',\n\t'Lynden',\n\t'Purushottampur',\n\t'Konin',\n\t'Long Xuyen',\n\t'Kizhakkott',\n\t'Peachtree Corners',\n\t'Natshal',\n\t'Saleaula',\n\t'Bahia Blanca',\n\t'Semey',\n\t'Rianxo',\n\t'Caridad',\n\t'Hammam el Rhezez',\n\t'Kudelstaart',\n\t'Huizen',\n\t'Narasapuram',\n\t'Parkville',\n\t'Kadungapuram',\n\t'Garden City',\n\t'Daulatkhan',\n\t'Tectitan',\n\t'Maroambihy',\n\t'Pallini',\n\t'Center Point',\n\t'North Bay',\n\t'Maihar',\n\t'Lons',\n\t'Huehuetenango',\n\t'Qalqilyah',\n\t'Koryo',\n\t'Betafo',\n\t'Rheinbach',\n\t'Surprise',\n\t'Sumbawanga',\n\t'Thatha',\n\t'Kurugodu',\n\t'Neustadt in Holstein',\n\t'Jupi',\n\t'Santa Isabel do Para',\n\t'Chandrawada',\n\t'Tamra',\n\t'Cusset',\n\t'Le Cres',\n\t'Tunduma',\n\t\"Toyloq Qishlog'i\",\n\t'Southbourne',\n\t'Hempfield',\n\t'Dhilwan',\n\t'Roseville',\n\t'Sisimiut',\n\t'Aizubange',\n\t'Lleida',\n\t'Muri',\n\t'Phalombe',\n\t'Antsoha',\n\t'Saha',\n\t'Muana',\n\t'Djambala',\n\t'Istanbul',\n\t'Andoharanofotsy',\n\t'Seligenstadt',\n\t'Djougou',\n\t'Boukadir',\n\t'Ingeniero Pablo Nogues',\n\t'Barwon Heads',\n\t'Hazleton',\n\t'Ciudad Tula',\n\t'Northeim',\n\t'Galela',\n\t'Rehoboth',\n\t'Bemanonga',\n\t'Nawucun',\n\t'Gallup',\n\t'Malayer',\n\t'Abu Za`bal',\n\t'Seia',\n\t'Samalsar',\n\t'Melfi',\n\t'Puduvayal',\n\t'Namsos',\n\t\"Bailey's Crossroads\",\n\t'Gardere',\n\t'Bermo',\n\t'Gaillard',\n\t'Qiushanxiang',\n\t'Rokycany',\n\t'Cesena',\n\t'Alto Piquiri',\n\t'Mendoza',\n\t'Rudrangi',\n\t'Kotido',\n\t'Turbihal',\n\t'Comox',\n\t'Shangpa',\n\t'Tzintzuntzan',\n\t'Nao Kothi',\n\t'Cogolin',\n\t'Nhan Trach',\n\t'Royal Wootton Bassett',\n\t'Suhar',\n\t'Prestea',\n\t'Zahle',\n\t'Cherniakhiv',\n\t'Thinadhoo',\n\t'Phuthaditjhaba',\n\t'Pasco',\n\t'Madhavaram',\n\t'Chuo-ku',\n\t'Kishi',\n\t'Tavistock',\n\t'Jitpur',\n\t'Legnano',\n\t'Heusweiler',\n\t'Punnila',\n\t'Bonoufla',\n\t\"Qiryat Mal'akhi\",\n\t'Jaguari',\n\t'Erraguntlakota',\n\t'Valdobbiadene',\n\t'Lupao',\n\t'Hille',\n\t'Cosamaloapan',\n\t'Tromso',\n\t'Charkhi Dadri',\n\t'Dolo Odo',\n\t'Ebersbach an der Fils',\n\t'Chojnow',\n\t'Perkasie',\n\t'Zhamog',\n\t'Seiada',\n\t'Bjelovar',\n\t'Puerto Natales',\n\t'Camaguey',\n\t'Dabakala',\n\t'Katagami',\n\t'Panchla',\n\t'Borgoricco',\n\t'St. Albans',\n\t'Campeche',\n\t'Kontela',\n\t'Broughty Ferry',\n\t'Shihuajie',\n\t'Alvinopolis',\n\t'Parilla',\n\t'Georgetown',\n\t'North Palm Beach',\n\t'Canela Baja',\n\t'Darpa',\n\t'Battipaglia',\n\t'Upland',\n\t'Bombinhas',\n\t'Houten',\n\t'Ibiracu',\n\t'Paraopeba',\n\t'Hokota',\n\t'Whitpain',\n\t'Nakoushi',\n\t'Krasnoilsk',\n\t'Guapimirim',\n\t'Bom Jesus da Serra',\n\t'Tesalia',\n\t'Arohi',\n\t'Pyay',\n\t'Tryavna',\n\t'Mufulira',\n\t'Weligama',\n\t'Gaillac',\n\t'Rettanai',\n\t'Marano di Napoli',\n\t'Jefferson City',\n\t'Tulagi',\n\t'Nirmali',\n\t'Passos',\n\t'Htison',\n\t'Harewa',\n\t'Miren',\n\t'Shika',\n\t'Alfajayucan',\n\t'San Pedro Masahuat',\n\t'Galhinna',\n\t'Silla',\n\t'Dong Ha',\n\t'Legazpi City',\n\t'Hassi Messaoud',\n\t'Bhadrapur',\n\t'Anjahambe',\n\t'Sirsaganj',\n\t'Menglang',\n\t'Qarchak',\n\t'Gandhwani',\n\t'Penedo',\n\t'Peralta',\n\t'Rappang',\n\t'Bad Bramstedt',\n\t'Weinfelden',\n\t'Aliaga',\n\t'Douar Sidi Laaroussi',\n\t'Regedor Quissico',\n\t'Sidi Dahbi',\n\t'Joppatowne',\n\t'Borgo a Buggiano',\n\t'Tiqqi',\n\t'Stakhanov',\n\t'Basmakci',\n\t'Oulad Fraj',\n\t'Moron',\n\t'Thunder Bay',\n\t'Manoharpur',\n\t'Kuniyamuttur',\n\t'Onondaga',\n\t'Lopare',\n\t'Zumaia',\n\t'Kahemba',\n\t'Altenstadt',\n\t'Cabuyao',\n\t'Kafr az Zayyat',\n\t'Burriana',\n\t'Kulharia',\n\t'Barinas',\n\t'Nelmadur',\n\t'Demirozu',\n\t\"Bois-d'Arcy\",\n\t'Lahad Datu',\n\t'Venganellur',\n\t'Tsuruoka',\n\t'Bordertown',\n\t'Amrabad',\n\t'Sala',\n\t'Coronel Freitas',\n\t'Bassin Bleu',\n\t'Porto Santo Stefano',\n\t'Ait Yazza',\n\t'Thanhlyin',\n\t'Tournai',\n\t'Valea Adanca',\n\t'Saint-Cloud',\n\t'Ginowan',\n\t\"Welk'it'e\",\n\t'Siilinjarvi',\n\t'Inhangapi',\n\t'Huazhou',\n\t'Eski Yakkabog`',\n\t'Tobelo',\n\t'Horsholm',\n\t'Springs',\n\t'Lorengau',\n\t'Manwat',\n\t'Khmilnyk',\n\t'Hrubieszow',\n\t'Santa Teresa di Riva',\n\t'Portel',\n\t'El Dorado Hills',\n\t'Pattiswaram',\n\t'Bad Reichenhall',\n\t'Dourdan',\n\t'Dakhram',\n\t'Rio de Contas',\n\t'Pagudpud',\n\t'Sao Felix',\n\t'Kosjeric',\n\t'Lebanon',\n\t'Fargo',\n\t'Mont-Saint-Aignan',\n\t'Wald',\n\t'Eckernforde',\n\t'Chicholi',\n\t'Goldap',\n\t'Kurashiki',\n\t'Santa Maria Colotepec',\n\t'Kawaii',\n\t'Narapala',\n\t'Maimanah',\n\t'Ponda',\n\t\"'Ain Roua\",\n\t'Manyoni',\n\t'Mineiros',\n\t'Moussoro',\n\t'Olhao',\n\t'Ridley',\n\t'Sidi Ouassay',\n\t'Nancagua',\n\t'Sagay',\n\t'Majurwa',\n\t'Okotoks',\n\t'Chengannur',\n\t'Middletown',\n\t'Heredia',\n\t'Mbanza Kongo',\n\t'Texenna',\n\t'Urania',\n\t'Cantemir',\n\t'Albertirsa',\n\t'Qala',\n\t'Molinella',\n\t'Pahrump',\n\t'Padugupadu',\n\t'Utiel',\n\t'Harbatpur',\n\t'Orestiada',\n\t'Tiachiv',\n\t'Kahta',\n\t'Cesenatico',\n\t'Omaruru',\n\t'Siquijor',\n\t'America Dourada',\n\t'Kilkis',\n\t'Ascot',\n\t'Zhujiagua',\n\t'Bagheria',\n\t'Puerto Wilches',\n\t'Torre Maggiore',\n\t'Tomuk',\n\t'Huanggang',\n\t'Trovagunta',\n\t'Devanakonda',\n\t'Sa Pa',\n\t'Narashino',\n\t'Koganei',\n\t'West Memphis',\n\t'Pendleton',\n\t'Edenvale',\n\t'Dieburg',\n\t'Ankavandra',\n\t'Gondalga',\n\t'Quang Ha',\n\t'Xochistlahuaca',\n\t'Niiyama',\n\t'Viedma',\n\t'Sukhothai',\n\t'Cuorgne',\n\t'Janzur',\n\t'Dhansura',\n\t'Rio Maior',\n\t'Penuganchiprolu',\n\t'Jaora',\n\t'Kanzakimachi-kanzaki',\n\t'Hunfeld',\n\t'Yabayo',\n\t'Torre del Mar',\n\t'Shenyang',\n\t'Odacho-oda',\n\t'Lagdo',\n\t'Otuzco',\n\t'Hagi',\n\t'Pompeu',\n\t'Repalle',\n\t'Majagual',\n\t'Yulinshi',\n\t'Periyakoduveri',\n\t'Ubon Ratchathani',\n\t'Al `Amadiyah',\n\t'Saint-Andre',\n\t'Omis',\n\t'Arcozelo',\n\t'Doujing',\n\t'Vuhledar',\n\t'Hindley',\n\t'Aphaur',\n\t'Oliveira',\n\t'Nasir',\n\t'Palm Desert',\n\t'Khategaon',\n\t'Esmoriz',\n\t'Belmont',\n\t'Koani',\n\t'Gyomro',\n\t'Mackworth',\n\t'Rubio',\n\t'Zafra',\n\t'San Juan Evangelista',\n\t'Qoubaiyat',\n\t'Lautoka',\n\t'Cerkes',\n\t'Villeneuve-le-Roi',\n\t'Xinhua',\n\t'Touros',\n\t'Nyaungu',\n\t'Chakand',\n\t'Aluksne',\n\t'Yishui',\n\t'Timperley',\n\t'Oakwood',\n\t'Chakwal',\n\t'Tarauna',\n\t'Khandrauli',\n\t'Huaquechula',\n\t'Bhatinda',\n\t'Puerto Williams',\n\t'Tongliao',\n\t'Staffanstorp',\n\t'Kisumu',\n\t'Mangueirinha',\n\t'Leopoldina',\n\t'Luchow',\n\t'Harrismith',\n\t'Indija',\n\t'Campo Redondo',\n\t'Lastra a Signa',\n\t'Akhisar',\n\t'Alnif',\n\t'Tega Cay',\n\t'Foughala',\n\t'Jinjicun',\n\t'Kangning',\n\t'Treze Tilias',\n\t'Landau',\n\t'Vaires-sur-Marne',\n\t'Udiyavara',\n\t'Boquim',\n\t'Hekou',\n\t'Kirchheim unter Teck',\n\t'Kondakindi Agraharam',\n\t'Sao Mateus',\n\t'Simonesia',\n\t'Pinerolo',\n\t'Ptuj',\n\t'Mezobereny',\n\t'Gex',\n\t'Unnan',\n\t'Dayr Abu Hinnis',\n\t'Sanampudi',\n\t'Simon Bolivar',\n\t'Oteiza',\n\t'Gragnano',\n\t'Khartsyzk',\n\t'Beramanja',\n\t'Richmond Hill',\n\t'Juru',\n\t'Padavedu',\n\t'Ekwari',\n\t'Brescia',\n\t'La Cruz',\n\t'Pulimaddi',\n\t'Pleasant Hill',\n\t'Hozin',\n\t\"Sant'Ambrogio di Valpolicella\",\n\t'Telua',\n\t'Bilozerske',\n\t'Adami Tulu',\n\t'Manteca',\n\t'Delmiro Gouveia',\n\t'Mindelheim',\n\t'Fate',\n\t'Hokur Badasgom',\n\t'Sidi Kada',\n\t'Talayolaparambu',\n\t'Connersville',\n\t'Gurinhem',\n\t'Skopje',\n\t'Fairless Hills',\n\t'Debrecen',\n\t'El Realejo',\n\t'Gadhada',\n\t'Schwalmtal',\n\t'Yamaga',\n\t'Bihar',\n\t'Pakil',\n\t'Loni',\n\t'Chilgazi',\n\t'Varzobkala',\n\t'Samandag',\n\t'Portela',\n\t'Wanghong Yidui',\n\t'Qianxi',\n\t'Dese',\n\t'Hathidah Buzurg',\n\t'Periyapuliyur',\n\t'Bilston',\n\t'Laja',\n\t'Makhdumpur',\n\t'Les Pennes-Mirabeau',\n\t'Himmatpura',\n\t'Denia',\n\t'Keimoes',\n\t'Castillo de Teayo',\n\t'Conselve',\n\t'Longmeadow',\n\t'Herne Bay',\n\t'Sao Miguel do Guama',\n\t'Sunland Park',\n\t'Israna',\n\t'Bassian',\n\t'Qift',\n\t'Behshahr',\n\t'Kotli Ablu',\n\t'Hidrolandia',\n\t'Torre Santa Susanna',\n\t'Kirdasah',\n\t'Tanjungpinang',\n\t'Reshuijie',\n\t'Wappinger',\n\t'Perungudi',\n\t'Goworowo',\n\t'Knin',\n\t'Vardhamankota',\n\t'Campo Limpo',\n\t'Sermoneta',\n\t'Limoeiro de Anadia',\n\t'Otsuchi',\n\t'Niamina',\n\t'Kasumigaura',\n\t'West Puente Valley',\n\t'Sungai Petani',\n\t'East Windsor',\n\t'Pedro Celestino Negrete',\n\t'Yorkton',\n\t'Gueznaia',\n\t'Telica',\n\t'Mong Cai',\n\t'El Paisnal',\n\t'Provo',\n\t'Stefan Voda',\n\t'Vargem',\n\t'Treillieres',\n\t'Procida',\n\t'Sens',\n\t'Aperibe',\n\t'Comasagua',\n\t'Hulbuk',\n\t'Talakag',\n\t'Puduva',\n\t'Hashikami',\n\t'Randallstown',\n\t'Sahline',\n\t'Bejar',\n\t'Isnapuram',\n\t'Teghra',\n\t'Eschwege',\n\t'Carver',\n\t'Franklin Park',\n\t'Tremedal',\n\t'Itahara',\n\t'Lancut',\n\t'Vettikattiri',\n\t'Meyzieu',\n\t'Al Abraq',\n\t'Basista',\n\t'Charlotte Amalie',\n\t'Palembang',\n\t'Esparraguera',\n\t'Villacidro',\n\t'Berettyoujfalu',\n\t'Peravali',\n\t'Mastic Beach',\n\t'Perundurai',\n\t'San Francisco',\n\t'Bangassou',\n\t'Kauriya',\n\t'Carinhanha',\n\t'Otjiwarongo',\n\t'Minot',\n\t'Covilha',\n\t'Shahe',\n\t'Petrila',\n\t'Portchester',\n\t'Ban Lueak',\n\t'Aminpur',\n\t'Calenga',\n\t'Bafata',\n\t'Cumnock',\n\t'Clichy',\n\t'Tabernes Blanques',\n\t'Siloe',\n\t'Qiaotouyi',\n\t'Candido Mota',\n\t'Barbosa',\n\t'Borcka',\n\t'Maryland City',\n\t'Lacarak',\n\t'Crestview',\n\t'Jounie',\n\t'Hochdorf',\n\t'Montelibano',\n\t'Tundhul',\n\t'Osku',\n\t'Monsenhor Tabosa',\n\t'Anosiala',\n\t'Ban Pa Sak',\n\t'Kanakir',\n\t'Wakayama',\n\t'Muttenz',\n\t'Makale',\n\t'Medesano',\n\t'Lamerd',\n\t'Bakarpur Ogairah',\n\t'Wetherby',\n\t'Nakagawa',\n\t'Sao Jose dos Pinhais',\n\t\"Nova Brasilandia d'Oeste\",\n\t'Piquet Carneiro',\n\t'Valmadrera',\n\t'Pua',\n\t'Chak Forty-one',\n\t'Sandvika',\n\t'Stansted Mountfitchet',\n\t'Snoqualmie',\n\t'Pereiras',\n\t'Joaquim Nabuco',\n\t'Mondragon',\n\t'Huixcolotla',\n\t'Minamiuonuma',\n\t'Gap',\n\t'General Villegas',\n\t'Matane',\n\t'El Monte',\n\t'Minamiminowa',\n\t'Saint-Andre-les-Vergers',\n\t'Ibb',\n\t'Oudenaarde',\n\t'Lainate',\n\t'Box Elder',\n\t'Karanchedu',\n\t'Guanhaes',\n\t'Calderara di Reno',\n\t'Itainopolis',\n\t'Gattaran',\n\t'Muhlacker',\n\t'Rengo',\n\t'Winkler',\n\t'Marathalli',\n\t'Cambuquira',\n\t'Ilulissat',\n\t'Kalyandrug',\n\t'Kesabpur',\n\t'Santiago de Anaya',\n\t'Ano Liosia',\n\t'Vung Tau',\n\t'Monaco',\n\t'Cuesmes',\n\t\"Ra's al `Ayn\",\n\t'Rasebetsane',\n\t'Tagudin',\n\t'Basopatti',\n\t'Mack',\n\t'Pedra Badejo',\n\t\"Les Sables-d'Olonne\",\n\t'Hosakote',\n\t'Barbastro',\n\t'Tutoia',\n\t'Manpur',\n\t'Higashiyamato',\n\t'Varvarin',\n\t'Manhica',\n\t'Kachchippalli',\n\t'Velugodu',\n\t'Palin',\n\t'Xinchangcun',\n\t'Alchevsk',\n\t'Anzegem',\n\t'Doi Saket',\n\t'Amersham',\n\t'Namburu',\n\t'Union Hill-Novelty Hill',\n\t'Apopa',\n\t'Zafarabad',\n\t'Nanminda',\n\t'Burlington',\n\t'Hibbing',\n\t'Galloway',\n\t'Union City',\n\t'Dukinfield',\n\t'Montecristo',\n\t'Shrigonda',\n\t'Uchoa',\n\t'Tizi-n-Tleta',\n\t'Stellenbosch',\n\t'Olaine',\n\t'Isabel',\n\t'Luqa',\n\t'Matinha',\n\t'Bni Rzine',\n\t'Attimarappatti',\n\t'Circasia',\n\t'Ban Krot',\n\t'Selimpasa',\n\t'Xangongo',\n\t'Simiganj',\n\t'Coacoatzintla',\n\t'Nueva Helvecia',\n\t'Chenzhou',\n\t'Lota',\n\t'Lawrenceville',\n\t'Vayanur',\n\t'Tobe',\n\t'Ende',\n\t'Haslemere',\n\t'Calabayan',\n\t'Pakxe',\n\t'Pajapan',\n\t'Udhampur',\n\t'Tsararivotra',\n\t'Telerghma',\n\t'Haydock',\n\t'Surmon Chogga Grong',\n\t'Trebic',\n\t'Alafaya',\n\t'Kafr Sajnah',\n\t'Conceicao',\n\t'Vellore',\n\t'Usingen',\n\t'Terenure',\n\t'Bouca',\n\t'Ghat Borul',\n\t'Baisuhalli',\n\t'Daulatpur',\n\t'Grossrohrsdorf',\n\t'Lorica',\n\t'Hagaribommanahalli',\n\t'Ban Thoet Thai',\n\t'Loznica',\n\t'Ponmala',\n\t'Padiyur',\n\t'Tigoa',\n\t'Budva',\n\t'Mistassini',\n\t\"'Ain Babouche\",\n\t'El Limon',\n\t'Diouna',\n\t'Rieti',\n\t'Kuttyadi',\n\t'Xinyang',\n\t'Killiney',\n\t'Pop',\n\t'Guaymango',\n\t'Springbok',\n\t'Presque Isle',\n\t'Timra',\n\t'Abuja',\n\t'Miyakojima',\n\t'Payyannur',\n\t'Xunyang',\n\t'Bailen',\n\t'Chambellan',\n\t'Bukit Mertajam',\n\t'Cattolica',\n\t'Serdar',\n\t'Sarare',\n\t'Coronel Vivida',\n\t'Herriman',\n\t'Guliston',\n\t'Rouvroy',\n\t'Garfield',\n\t'Elmina',\n\t'Sarreguemines',\n\t'Milwaukie',\n\t'Ershui',\n\t'Garot',\n\t'Czestochowa',\n\t'Kirklareli',\n\t'La Jagua de Ibirico',\n\t'Stroud',\n\t'Kocaeli',\n\t'Calimaya',\n\t'Savalou',\n\t'Manalalondo',\n\t'Cikupa',\n\t'Cide',\n\t'Idylwood',\n\t'East Massapequa',\n\t'Andijon',\n\t'Ibusuki',\n\t'Brahmapur',\n\t'Mount Prospect',\n\t'St. James',\n\t'Vila Franca de Xira',\n\t'Bhadreswar',\n\t'Khandwa',\n\t'Amporoforo',\n\t'Celic',\n\t'Gomec',\n\t'Fort Carson',\n\t'Kosiv',\n\t'Fria',\n\t'Cliftonville',\n\t'Narvacan',\n\t'Ramanathapuram',\n\t'Jawasa',\n\t'Guclukonak',\n\t'Samobor',\n\t'Ceska Trebova',\n\t\"Anan'evo\",\n\t'Zinjibar',\n\t'Indianapolis',\n\t'Yanggok',\n\t'Aberdare',\n\t'Palm River-Clair Mel',\n\t'Diari',\n\t'Chilmil',\n\t'Callosa de Segura',\n\t'Kummersbruck',\n\t'Sambava',\n\t'Pritzwalk',\n\t'Karai',\n\t'Lachhmangarh Sikar',\n\t'Wade Hampton',\n\t'Rapla',\n\t'Assa',\n\t'Malavalli',\n\t'Trinec',\n\t'La Verne',\n\t'Selibaby',\n\t'Zagnanado',\n\t'Commerce City',\n\t'Tredyffrin',\n\t'Salaberry-de-Valleyfield',\n\t'Longtan',\n\t'Karatsu',\n\t'Badian',\n\t'Sao Sebastiao do Paraiso',\n\t'Satyamangala',\n\t'Balsta',\n\t'Gamagori',\n\t'Chinampa de Gorostiza',\n\t\"Ambinanin'i Sakaleona\",\n\t'Itiquira',\n\t'Center',\n\t'Umargam',\n\t'Ozurgeti',\n\t'Montereau-faut-Yonne',\n\t'Amau',\n\t'Nova Esperanca',\n\t'Venezuela',\n\t'Kafia Kingi',\n\t'Tanguturu',\n\t'Vinto',\n\t'Sonosari',\n\t'Sturovo',\n\t'Date',\n\t'Niska Banja',\n\t'An Nhon',\n\t'Littlehampton',\n\t'Fuente Palmera',\n\t'Sokode',\n\t'Donghua',\n\t'South Holland',\n\t'Frimley',\n\t'Bachchannapet',\n\t'Junnardev',\n\t'Dole',\n\t'Neuotting',\n\t'Monforte del Cid',\n\t'Baguley',\n\t'Brimington',\n\t'Calauan',\n\t'Durmersheim',\n\t'Wittenberge',\n\t'Echizen',\n\t'Dobropillia',\n\t'Ayuquitan',\n\t'Viramgam',\n\t'Matsuura',\n\t'Abu Dis',\n\t'Winsum',\n\t'Gentbrugge',\n\t'Villa Victoria',\n\t'Yovon',\n\t'Boaz',\n\t'Kotta Kalidindi',\n\t'Great Bend',\n\t'Tarcento',\n\t'Limbazi',\n\t'Bajos de Haina',\n\t'Karakax',\n\t'Ibira',\n\t'Yakushima',\n\t'Goito',\n\t'Nabari',\n\t'Sabanalarga',\n\t'Tiou',\n\t'Renens',\n\t'Dolores',\n\t'Agago',\n\t'Madakalavaripalli',\n\t'Mapastepec',\n\t'La Lucila',\n\t'Cherakhera',\n\t'Sadaseopet',\n\t'Neerijnen',\n\t'Krathum Baen',\n\t'Gansbaai',\n\t'Mahalandi',\n\t'Chanaur',\n\t'La Argentina',\n\t'Jesup',\n\t'Bela Crkva',\n\t'Soteapan',\n\t'Siechnice',\n\t'Lwakhakha',\n\t'Uspallata',\n\t'Imbatug',\n\t'Altavas',\n\t'Jaglot',\n\t'Colangute',\n\t'Kumatori',\n\t'Andapa',\n\t'Choconta',\n\t'Sarhari',\n\t'Santiago Jocotepec',\n\t'Arauca',\n\t'Hailin',\n\t'Shahr-e Majlesi',\n\t'Guyuan',\n\t'Murfatlar',\n\t'Chon Buri',\n\t'Bacnotan',\n\t'Kutna Hora',\n\t'Xiva',\n\t'Mizque',\n\t'West Ham',\n\t'Roatan',\n\t'Doylestown',\n\t'Tarichar Kalan',\n\t'Foz do Iguacu',\n\t'Garching an der Alz',\n\t'Tifariti',\n\t'Longwy',\n\t'Tarikere',\n\t'Alameda',\n\t'Gbanhi',\n\t'Catunda',\n\t'Kirchhundem',\n\t'Cuenca',\n\t'Delareyville',\n\t'Cliffside Park',\n\t'Orting',\n\t'Kapadvanj',\n\t'Nigran',\n\t'Fengyicun',\n\t'Pazardzhik',\n\t'Yeddumailaram',\n\t'Longkeng',\n\t'Nikaho',\n\t'Altofonte',\n\t'Douar Oulad Youssef',\n\t'Lathi',\n\t'Osh',\n\t'Daytona Beach',\n\t'Atharan Hazari',\n\t'Ami',\n\t'Balaguer',\n\t'Malnate',\n\t'Quanzhang',\n\t'Rio Claro',\n\t'Hajdusamson',\n\t'Gouvea',\n\t'Kunming',\n\t'Kulasegaram',\n\t'Pori',\n\t'Braintree',\n\t'Bijelo Polje',\n\t'Mateur',\n\t'Kozova',\n\t'Fenoarivo Atsinanana',\n\t'Leisure World',\n\t'Taman Senai',\n\t'Nerinjippettai',\n\t'Washington',\n\t'Basapatna',\n\t'Mwene-Ditu',\n\t'Norak',\n\t'South Upi',\n\t'Yokadouma',\n\t'Abbigeri',\n\t'Kouoro',\n\t'Freilassing',\n\t'Nymburk',\n\t'Cangandala',\n\t'Dihri',\n\t'Arakli',\n\t'Huaihua',\n\t'Turkauliya',\n\t'Ramainandro',\n\t'Aytos',\n\t'Lihe',\n\t'Raseborg',\n\t'Tomioka',\n\t'Sakrand',\n\t'Belur',\n\t'Kaseda-shirakame',\n\t'Mettingen',\n\t'Bugalagrande',\n\t'Annandale',\n\t'Mambere',\n\t'Oume',\n\t'Al Buwaydah',\n\t'Eagle',\n\t'Ustron',\n\t'Pegnitz',\n\t'Massaguet',\n\t'Bibbiena',\n\t'Saint-Vith',\n\t'Geelong',\n\t'Glen Rock',\n\t'Miarinavaratra',\n\t'Sao Simao',\n\t'Gurlan',\n\t'La Escala',\n\t'Mian Channun',\n\t'Tono',\n\t'Kevelaer',\n\t'Jiaozhou',\n\t'Einsiedeln',\n\t'Udaypur Gadhi',\n\t'Molagavalli',\n\t'Sira',\n\t'Ospina',\n\t'Kuduru',\n\t'Komarolu',\n\t'Arnprior',\n\t'Breclav',\n\t'Qornet Chahouane',\n\t'Okaya',\n\t'Montesarchio',\n\t'Tecoh',\n\t'Dezful',\n\t'Quiculungo',\n\t'Tam Ky',\n\t'Qaracuxur',\n\t'Daxin',\n\t'Horsham',\n\t'Tafalla',\n\t'Yehud',\n\t'Abertawe',\n\t'Darien',\n\t'Shodoshima',\n\t'El Arenal',\n\t'Litomerice',\n\t'Caboolture',\n\t'Norwalk',\n\t'Mananara Avaratra',\n\t'Herten',\n\t'Kihihi',\n\t'Aira',\n\t'Kuttampala',\n\t'Noumea',\n\t'Phon-Hong',\n\t'Thair',\n\t'Herzogenrath',\n\t'Planalto',\n\t'Arrecifes',\n\t'Fuente-Alamo de Murcia',\n\t'Gilbues',\n\t'Miltenberg',\n\t'Bubong',\n\t'Henstedt-Ulzburg',\n\t'Rayavaram',\n\t'Alberique',\n\t'Pimpalgaon Raja',\n\t'Palencia',\n\t'Lalganj',\n\t\"L'Isle-Adam\",\n\t'Abasolo',\n\t'Sirikonda',\n\t'Devadanappatti',\n\t'Pokrovka',\n\t'Baliguian',\n\t'Corum',\n\t'Tlacolula de Matamoros',\n\t'Jeremie',\n\t'Myaungmya',\n\t'Tissa',\n\t'Capljina',\n\t'Ambariokorano',\n\t'Gemert',\n\t'Akayu',\n\t'Bhiwandi',\n\t'Chishui',\n\t'Abbotsford',\n\t'La Carlota',\n\t'Antalya',\n\t'Yongjing',\n\t'Tres Marias',\n\t'Haa',\n\t'Meerhout',\n\t'Sibu',\n\t'Astara',\n\t'Gar',\n\t'Ndola',\n\t'Sao Tiago de Custoias',\n\t'Karrapur',\n\t'Chartiers',\n\t'Songea',\n\t'Mouila',\n\t'Streator',\n\t'Al Qamishli',\n\t'Nikaweratiya',\n\t'Delbruck',\n\t'Batonyterenye',\n\t'Odzak',\n\t'Agudos',\n\t'Gatineau',\n\t'Vineyard',\n\t'Saint-Rambert',\n\t'Kesath',\n\t'Sugar Grove',\n\t'Tuensang',\n\t'Los Reyes de Juarez',\n\t'Sardinal',\n\t'Eksjo',\n\t'Safety Harbor',\n\t'Kilkenny',\n\t'Tsiroanomandidy',\n\t'Agartala',\n\t'Agrate Brianza',\n\t'Nomimachi',\n\t'North Tonawanda',\n\t'Stafford',\n\t'Paramoti',\n\t'Cavdir',\n\t'Houmt Souk',\n\t'Domagnano',\n\t'Kaset Wisai',\n\t'Piedmont',\n\t'Nazareth',\n\t'Anjialava',\n\t'Stebnyk',\n\t'Golyaka',\n\t'Zehdenick',\n\t'Birstonas',\n\t'Chaklasi',\n\t'Carira',\n\t'Sapatgram',\n\t'Bankura',\n\t'Rosignano Marittimo',\n\t'Quchan',\n\t'Hoeilaart',\n\t'Angul',\n\t'Erechim',\n\t'Xinshi',\n\t'Jima',\n\t'Upper Southampton',\n\t'Baramula',\n\t'Joao Neiva',\n\t'Vanukuru',\n\t'Shiwan',\n\t'White Horse',\n\t'Morong',\n\t'Frascati',\n\t'Schrobenhausen',\n\t'Luvungi',\n\t'Itirapina',\n\t'Nari Bhadaun',\n\t'Tarnaveni',\n\t'Mytilini',\n\t'Destrehan',\n\t'Eybens',\n\t'Dianga',\n\t'Pasarkemis',\n\t'Najafabad',\n\t'Swiecie',\n\t'Cobourg',\n\t'San Jorge',\n\t'Pfastatt',\n\t'Kusmaul',\n\t'Fallersleben',\n\t'Pershotravensk',\n\t'Mahambo',\n\t'Sigli',\n\t'Annaba',\n\t'Turku',\n\t'Pedda Vegi',\n\t'Mesa Geitonia',\n\t'Charam',\n\t'Charentsavan',\n\t'Imielin',\n\t'Orvault',\n\t'Lodz',\n\t'Sam Ko',\n\t'Foz',\n\t'Alexandroupoli',\n\t'Demmin',\n\t'Castelleone',\n\t'Burauen',\n\t'Capilla del Monte',\n\t'Ettlingen',\n\t'Srirangapur',\n\t'Camamu',\n\t'Saruhanli',\n\t'Ferfer',\n\t'Aurangabad',\n\t'Taromske',\n\t'Hinigaran',\n\t'San Juan de Dios',\n\t'Saint-Maur-des-Fosses',\n\t'Bunkyo-ku',\n\t'Renfrew',\n\t'Mus',\n\t'Lake Jackson',\n\t'Xirdalan',\n\t'Samayac',\n\t'Spanish Lake',\n\t'Izegem',\n\t'Nema',\n\t'Dongducheon',\n\t'Hecelchakan',\n\t'Seoni',\n\t'Wood Green',\n\t'Castelfranco Veneto',\n\t'Bostanici',\n\t'Itajiba',\n\t'Inagi',\n\t'Oakham',\n\t'Boa Vista',\n\t'Puquio',\n\t'Chittaranjan',\n\t'Tibro',\n\t'Pitangueiras',\n\t'Rouached',\n\t'Nouakchott',\n\t'Nuevo San Juan Parangaricutiro',\n\t'Sao Jose do Campestre',\n\t'Heyin',\n\t'Vacaria',\n\t'Lukavac',\n\t'Katy',\n\t'Caibiran',\n\t'Villasis',\n\t'Pontianak',\n\t'Pallijkarani',\n\t'Rayapalle',\n\t'San Pedro Carcha',\n\t'Kabirwala',\n\t'Idhna',\n\t'Kiama',\n\t'Armadale',\n\t'Braunschweig',\n\t'Lathasepura',\n\t'Bajo Boquete',\n\t'Shal',\n\t'Balyqshy',\n\t\"Long'e\",\n\t'Felgueiras',\n\t'Arteijo',\n\t'Dhanaula',\n\t'Kaoni',\n\t'Telford',\n\t'Laukaria',\n\t'Druskininkai',\n\t'Sayhat',\n\t'Skanderborg',\n\t'Lindome',\n\t'Paramanandal',\n\t'Quebrangulo',\n\t'Bida',\n\t'Narragansett',\n\t'Valle Hermoso',\n\t'Santa Catarina Pinula',\n\t'Muriedas',\n\t'Tawnza',\n\t'Arnouville-les-Gonesse',\n\t'Ouaoula',\n\t'Shahrixon',\n\t'Alcamo',\n\t'Naujoji Akmene',\n\t'Pappakurichchi',\n\t'Toyonaka',\n\t'Uttukkuli',\n\t'Ilave',\n\t'Villupuram',\n\t'Bhojpur Jadid',\n\t'Ischia',\n\t'Rio Verde Arriba',\n\t'Radolfzell am Bodensee',\n\t'Llica',\n\t'Erjie',\n\t'Qiaomaichuan',\n\t'Lamont',\n\t'Bezliudivka',\n\t'Five Corners',\n\t'Niksic',\n\t'Hnivan',\n\t'Tamale',\n\t'Khanapur',\n\t'Ichnia',\n\t'Sesvete',\n\t'Reeuwijk',\n\t'Qutur',\n\t'Moana',\n\t'San Pedro Atocpan',\n\t'Osny',\n\t'Toda Bhim',\n\t'Zaouiet Sousse',\n\t'Lavras',\n\t'Ouardenine',\n\t'Katakos',\n\t'Hetton le Hole',\n\t'Iseo',\n\t'Lehigh',\n\t'Hallim',\n\t'Bonou',\n\t'Moita Bonita',\n\t'Shakargarh',\n\t'Chiapa de Corzo',\n\t'Zhanggu',\n\t'Meudon',\n\t'Ayikudi',\n\t'Cunduacan',\n\t'Jingling',\n\t'Jiantang',\n\t'Laojiezi',\n\t'Bazid Chak Kasturi',\n\t'Elliniko',\n\t'Rifu',\n\t'Duanshan',\n\t'Busselton',\n\t'Liubashivka',\n\t'Maniyur',\n\t'Singuilucan',\n\t'Erkrath',\n\t'Mucari',\n\t'Tumwater',\n\t'Yaoquan',\n\t'Santa Maria Ixhuatan',\n\t'Sidi Bel Abbes',\n\t'Namanga',\n\t'Afsin',\n\t'An Phu',\n\t'Bamyan',\n\t'Mannanchori',\n\t'Shahr-e Qods',\n\t'Bierun',\n\t'Vijapur',\n\t'Boli',\n\t'Hirni',\n\t'Ibitiara',\n\t'Pachchampalaiyam',\n\t'Hutto',\n\t'Talibon',\n\t'Bilbao',\n\t'Readington',\n\t'Pasivedalajimma',\n\t'Sariaya',\n\t'Lappersdorf',\n\t'Jodhpur',\n\t'Opava',\n\t'Shelton',\n\t'Ledegem',\n\t'Cabedelo',\n\t'Tiptur',\n\t'Narsapur',\n\t'Jamira',\n\t'Kaufbeuren',\n\t'Ricany',\n\t'Ansonia',\n\t'Mirandopolis',\n\t'Gondizalves',\n\t'Brilon',\n\t'Tarumirim',\n\t'Leek',\n\t'Sheopuria',\n\t'Dongfeng',\n\t'Pozanti',\n\t'Fuyingzicun',\n\t'Sartrouville',\n\t'Vigonovo',\n\t'Tatakan',\n\t'Kountouri',\n\t'Gharbia',\n\t'Figuig',\n\t'Shire',\n\t'Swabi',\n\t'Wismar',\n\t'Chachagui',\n\t'Nedumudi',\n\t'Carrickfergus',\n\t'St. Thomas',\n\t'Jaicos',\n\t'Tiruvaduturai',\n\t'Bolinao',\n\t'Eumseong',\n\t'Edina',\n\t'Essey-les-Nancy',\n\t'Saint-Julien-en-Genevois',\n\t'Grosuplje',\n\t'Grand Haven',\n\t'Al Faw',\n\t'Androrangavola',\n\t'Hassi Maameche',\n\t'Rubi',\n\t'Busesa',\n\t'Villa Tapia',\n\t'Divo',\n\t'Benalmadena',\n\t'Redmond',\n\t'Rajaori',\n\t'Kraaipan',\n\t'Nisporeni',\n\t'Wandan',\n\t'Aguia Branca',\n\t'Lake Park',\n\t'Hoquiam',\n\t'Jan Kempdorp',\n\t'Lentvaris',\n\t'Waikanae',\n\t'Reboucas',\n\t\"Pomigliano d'Arco\",\n\t'Meycauayan',\n\t'Saugor',\n\t'Pasacao',\n\t'Schinnen',\n\t'Glan',\n\t'Lavagna',\n\t'Betnoti',\n\t'Ban Wat Sala Daeng',\n\t'Romsey',\n\t'Campi Salentina',\n\t'Glinde',\n\t'Gamprin',\n\t'Chandanais',\n\t'Taiping',\n\t'Marivorahona',\n\t'Store',\n\t'Vardenis',\n\t'Salima',\n\t'Kadanadu',\n\t'Jarqo`rg`on',\n\t'Barlad',\n\t'Bethpage',\n\t'Boscotrecase',\n\t'Dhamua',\n\t'Yelm',\n\t'Tlacotepec',\n\t'Parame',\n\t'Haapsalu',\n\t'Diadi',\n\t'Huetor Vega',\n\t'Jozefow',\n\t'Diessen am Ammersee',\n\t'Meyrin',\n\t'Crofton',\n\t'Galvez',\n\t'Boulder',\n\t'Masi-Manimba',\n\t'Aubervilliers',\n\t'Unguia',\n\t'Caslav',\n\t'El Centro',\n\t'El Fasher',\n\t'Beersheba',\n\t'Hujra Shah Muqim',\n\t'Bajil',\n\t'Tomas Oppus',\n\t'Liancheng',\n\t'Arkivan',\n\t'Jasidih',\n\t'Marturu',\n\t'Evry',\n\t'Easttown',\n\t'Lebedyn',\n\t'Garhpura',\n\t'Chinaur',\n\t'Jean-Rabel',\n\t'Chichigalpa',\n\t'Talukkara',\n\t'Kakuda',\n\t'Bozoum',\n\t'Tuzdybastau',\n\t'Pudimadaka',\n\t'Iraquara',\n\t'Blanquefort',\n\t'Batman',\n\t'Iserlohn',\n\t'Castano Primo',\n\t'Uttaradit',\n\t'Bartlesville',\n\t'Sapna',\n\t'Humpolec',\n\t'Avanashipalaiyam',\n\t'Rawajaya',\n\t'Gadarwara',\n\t'Mascote',\n\t'Narkatpalli',\n\t'Kendale Lakes',\n\t'White City',\n\t'Moss',\n\t'Nnewi',\n\t'Douar Oulad Aj-jabri',\n\t'Pata Uppal',\n\t'Dhiban',\n\t'Salitre',\n\t'West Babylon',\n\t'Khulays',\n\t'Teplohirsk',\n\t'Bannu',\n\t'Mudki',\n\t'Agar',\n\t'Al Madad',\n\t'Chokwe',\n\t'Udala',\n\t'Chichli',\n\t'Lemington',\n\t'Khatima',\n\t'Shangrao',\n\t'Chiriguana',\n\t'Baliuag',\n\t'Balua Rampur',\n\t'Nafplio',\n\t'Kudat',\n\t'Cabusao',\n\t'Acatic',\n\t'Madougou',\n\t'Tiszafured',\n\t'Akurana',\n\t'Kingston',\n\t'Pariaman',\n\t'Seacroft',\n\t'Tecoman',\n\t'Alavus',\n\t'Kanteru',\n\t'Jaramana',\n\t'Schodack',\n\t'Eniwa',\n\t'Fuzhou',\n\t'Klobuck',\n\t'Budhma',\n\t'Lelydorp',\n\t'Great Yarmouth',\n\t'Missoes',\n\t'Porto Velho',\n\t'Muhanga',\n\t'Porto Ingles',\n\t'Harderwijk',\n\t'Ubungo',\n\t'Phopnar Kalan',\n\t'Chrysoupoli',\n\t'Zarzis',\n\t'Nanning',\n\t'Tekeli',\n\t'Drammen',\n\t'Montivilliers',\n\t'Gualeguay',\n\t'Nishinomiya-hama',\n\t'Laguna de Duero',\n\t'Moraga',\n\t'Alzano Lombardo',\n\t'Miki',\n\t'Janin',\n\t'Frederico Westphalen',\n\t'Moulins',\n\t'Kuningan',\n\t'Castelnuovo di Porto',\n\t'Irimbiliyam',\n\t'Kharar',\n\t'Cholavandan',\n\t'Csomor',\n\t'Amurrio',\n\t'Tiruchchuli',\n\t'Steffisburg',\n\t'Parksville',\n\t'Anontsibe-Sakalava',\n\t'Nueva Concepcion',\n\t'Le Locle',\n\t'Harsewinkel',\n\t'Kaonke',\n\t'Sao Joao Batista',\n\t'Hokuto',\n\t'Aubange',\n\t'Bni Boufrah',\n\t'Sirmatpur',\n\t'Gignac-la-Nerthe',\n\t'Igarata',\n\t'Kharki',\n\t'Pamarru',\n\t'Bhimunipatnam',\n\t'Perdoes',\n\t'Qarqaraly',\n\t'Iisalmi',\n\t'Koussane',\n\t'Pittalavanipalem',\n\t'Tilakpur',\n\t'Okuchi-shinohara',\n\t'Alfenas',\n\t'Mindouli',\n\t'Chokkalingapuram',\n\t'Webster',\n\t'Rorschach',\n\t'Mascali',\n\t'Stauceni',\n\t'Mucaba',\n\t'Heemskerk',\n\t'Tari',\n\t'Bitam',\n\t'Ullal',\n\t'Qari Kola-ye Arateh',\n\t'Brownwood',\n\t'Santee',\n\t'Akbarpur',\n\t'Mega',\n\t'Motosu',\n\t'Csorna',\n\t'Cavarzere',\n\t'Omallur',\n\t'Virarajendrapet',\n\t'Wixom',\n\t'Murak',\n\t'Niederkruchten',\n\t'Aldine',\n\t'Jalihalli',\n\t'Batajnica',\n\t'Bardibas',\n\t'Madina do Boe',\n\t'Kallar',\n\t'Rhennouch',\n\t'East Providence',\n\t'Oras',\n\t'Vittuone',\n\t'Corbelia',\n\t'San Pedro Jicayan',\n\t'Telnal',\n\t'Parmanpur',\n\t'Morena',\n\t'Olindina',\n\t'Sumpango',\n\t'Bielsk Podlaski',\n\t'Mogoditshane',\n\t'Gulsehir',\n\t'Kumari',\n\t'Yantzaza',\n\t'Ambalavao',\n\t'Vohitany',\n\t'Qianxucun',\n\t'Pragatinagar',\n\t'Siaya',\n\t'Pombos',\n\t'Thuan Tien',\n\t'Minas de Matahambre',\n\t'Haaren',\n\t'Concarneau',\n\t'Al Marj',\n\t'Desborough',\n\t'Brewster',\n\t'San Miguel Ocotenco',\n\t'Toba Tek Singh',\n\t'Quito',\n\t'Pushkar',\n\t'Bagasra',\n\t'Snihurivka',\n\t'Nsawam',\n\t'Raonta',\n\t'Pishbar',\n\t'Hanamsagar',\n\t'Lemay',\n\t'Douliu',\n\t'Linlithgow',\n\t'Mamqan',\n\t'Phulaut',\n\t'Colwyn Bay',\n\t'East Leake',\n\t'Bargara',\n\t'Phan Rang-Thap Cham',\n\t'Jouy-le-Moutier',\n\t'Whyalla',\n\t'La Rioja',\n\t'Ferrenafe',\n\t'Yenmangandla',\n\t\"Ben 'Aknoun\",\n\t'Fier',\n\t'Baharampur',\n\t'Kin',\n\t'Staphorst',\n\t'Gondar',\n\t'Pantnagar',\n\t'Barnagar',\n\t'Campobello di Licata',\n\t'Rukan',\n\t'Masatepe',\n\t'Barroso',\n\t'Savnik',\n\t'Huilong',\n\t'Porto Seguro',\n\t'Tanjungbalai',\n\t'Sembedu',\n\t'Lunenburg',\n\t'Kampung Tengah',\n\t'Tatsunocho-tominaga',\n\t'Oosterwolde',\n\t'Aver-o-Mar',\n\t'Poughkeepsie',\n\t'Anjozorobe',\n\t'Zengcun',\n\t'Soavimbahoaka',\n\t'Warr Acres',\n\t'Donacarney',\n\t'Galesburg',\n\t'Alma',\n\t'Fuchu',\n\t'Lehrte',\n\t'Angelopolis',\n\t'Ventanas',\n\t'Barro Alto',\n\t'Santana do Matos',\n\t'Patnongon',\n\t'East Dereham',\n\t'Tibagi',\n\t'Rambilli',\n\t'Punturin',\n\t'Balzar',\n\t'Beaufort West',\n\t'Sendai',\n\t'Szekszard',\n\t'Kaizuka',\n\t'Motatan',\n\t'Smiths Falls',\n\t'Litherland',\n\t'Maisenhausen',\n\t'Gandara',\n\t'Ban Mae Kham Lang Wat',\n\t'Madrid',\n\t'Pasrur',\n\t'Shahganj',\n\t'Escazu',\n\t'Pakruojis',\n\t'Shiogama',\n\t'Kallad',\n\t'Matinilla',\n\t'Delemont',\n\t'Bilga',\n\t'Kasur',\n\t'Khattab',\n\t'Palmi',\n\t'Sariz',\n\t'Didymoteicho',\n\t'Pallippuram',\n\t'Wagrowiec',\n\t'Munro',\n\t'Aschersleben',\n\t'Ndalatando',\n\t'Cecchina',\n\t'Meizichong',\n\t'Elamattur',\n\t'Umred',\n\t'Bonita Springs',\n\t'Cujubim',\n\t'Red Oak',\n\t'Montlouis-sur-Loire',\n\t'Santa Rosa de Osos',\n\t'Dehmoi',\n\t'Pesochin',\n\t'Sadao',\n\t'Nagyatad',\n\t'Khusropur',\n\t'Klagenfurt',\n\t'Bou Merdes',\n\t'Acatenango',\n\t'Demiryol',\n\t'Sinnuris',\n\t'Juazeirinho',\n\t'Sivakasi',\n\t'Hunxe',\n\t'Lamu',\n\t'Ravensthorpe',\n\t'Streetsboro',\n\t'Marugame',\n\t'Nizampur',\n\t'Salina',\n\t'Baglung',\n\t'Aketao',\n\t'Schwedt (Oder)',\n\t'Medrissa',\n\t'Nordwalde',\n\t'Rielasingen-Worblingen',\n\t'Santiago Tianguistenco',\n\t'Dahuk',\n\t'Lubutu',\n\t'Ambohipihaonana',\n\t'Felino',\n\t'Kitwe',\n\t'Langarud',\n\t'San Rafael Las Flores',\n\t'Kurwa Mathia',\n\t'Deuil-la-Barre',\n\t'Sitampiky',\n\t'Westchase',\n\t'Korkut',\n\t'Aracariguama',\n\t'Verneuil-sur-Seine',\n\t'Sucy-en-Brie',\n\t'Vulcanesti',\n\t'Berkeley Heights',\n\t'Suhut',\n\t'Saratamata',\n\t'Owk',\n\t'Holzgerlingen',\n\t'Neckargemund',\n\t'Piacenza',\n\t'Kakkalapalle',\n\t'Tendo',\n\t'Atlanta',\n\t'Kamsar',\n\t'East Bridgewater',\n\t'Krizevci',\n\t'Mandapeta',\n\t'Kusumha',\n\t'South Valley',\n\t'Bhargaon',\n\t'Birkerod',\n\t'Olintla',\n\t'Jiabong',\n\t'Winona',\n\t'Ambinanitelo',\n\t'Tlajomulco de Zuniga',\n\t'Monument',\n\t'Matay',\n\t'Jingping',\n\t'Gadoon',\n\t'Yingmen',\n\t'Bondoukou',\n\t'Sirpanandal',\n\t'Materi',\n\t'Englewood',\n\t'Nea Moudania',\n\t'Shanglingcun',\n\t'Sutton in Ashfield',\n\t'Maule',\n\t'Djidja',\n\t'Long Eaton',\n\t'Wasco',\n\t'Satao',\n\t'Idrija',\n\t'Catacamas',\n\t'Oga',\n\t'Canelli',\n\t'Seydunganallur',\n\t'Sidi Ettiji',\n\t'Civitavecchia',\n\t'Bouc-Bel-Air',\n\t'Itapetim',\n\t'Shizuishan',\n\t'Ron',\n\t'San Sebastian Tutla',\n\t'Lupeni',\n\t'Buenaventura Lakes',\n\t'Morsang-sur-Orge',\n\t'Adamstown',\n\t'Daraina',\n\t'Penugonda',\n\t'Pachkhal',\n\t'Genemuiden',\n\t'Supe',\n\t'Sahri',\n\t'Ingraj Bazar',\n\t'Poloros',\n\t'Chalil',\n\t'Collecchio',\n\t'Ipiranga do Piaui',\n\t'Hove',\n\t'Ahmadli',\n\t'Karahalli',\n\t'Matosinhos',\n\t'Navalmoral de la Mata',\n\t'Bialogard',\n\t'Radcliff',\n\t'Padakanti',\n\t'Malasiqui',\n\t'Mendicino',\n\t'Fredericksburg',\n\t'Javanrud',\n\t'Tegal',\n\t'Bailesti',\n\t'Beeston',\n\t'Huaixiangcun',\n\t'Puranpur',\n\t'Manlio Fabio Altamirano',\n\t'Roddam',\n\t'Celakovice',\n\t'El Espinar',\n\t'Plattling',\n\t'Juan de Acosta',\n\t'Sidi Rahal',\n\t'Zrnovci',\n\t'Montepuez',\n\t'Guruvayur',\n\t'Kouti',\n\t'Sipalakottai',\n\t'Vuzenica',\n\t'Fontenay-le-Comte',\n\t'Jianshi',\n\t'Soignies',\n\t'Tewksbury',\n\t'Montelupo Fiorentino',\n\t'Lacin',\n\t'Kibaha',\n\t'Minakami',\n\t'Bedburg',\n\t'Cuttack',\n\t'Had Zraqtane',\n\t'Mandamari',\n\t'Sadabad',\n\t'Azhikkal',\n\t'Huaiyang',\n\t'Ovruch',\n\t'Khetia',\n\t'Monte Azul Paulista',\n\t'Amparihitsokatra',\n\t'Luling',\n\t'Ayaviri',\n\t'Pekin',\n\t'Dhihdhoo',\n\t'Sylacauga',\n\t'Venkatagiri',\n\t'Piro',\n\t'Rasauli',\n\t'Verde Village',\n\t'Ostrow Mazowiecka',\n\t'Bahon',\n\t'Teixeira Soares',\n\t'Qasr al Farafirah',\n\t'Ambohimalaza',\n\t'Tabuk',\n\t'Tubungan',\n\t'Norseman',\n\t'Fresno',\n\t'Lingamparti',\n\t'Burgau',\n\t'Coatepec Harinas',\n\t'Haridwar',\n\t'Itaugua',\n\t'Cruz del Eje',\n\t'Hidalgo',\n\t'Nellaya',\n\t'Mandishah',\n\t'Digboi',\n\t'Darlington',\n\t'Solim',\n\t'Kintampo',\n\t'Rancho Arriba',\n\t'San Isidro',\n\t'Atlapexco',\n\t'Morada Nova de Minas',\n\t'Dwarka',\n\t'Ambatofinandrahana',\n\t'Tha Chang',\n\t'Wangguanzhuang Sicun',\n\t'Chatellerault',\n\t'Benicasim',\n\t'Norwell',\n\t'Moanda',\n\t'Balsamo',\n\t'Cesson',\n\t'Mels',\n\t'Lokbatan',\n\t'Karlapalem',\n\t'Otar',\n\t'Gainrha',\n\t'Panajachel',\n\t'Mulhouse',\n\t'Rafard',\n\t'Tabora',\n\t'Barroquinha',\n\t'Newport East',\n\t'Smarjeske Toplice',\n\t'Mallaram',\n\t'Qutubpur',\n\t'El Tortuguero',\n\t'Obernai',\n\t'Alella',\n\t'Susquehanna',\n\t'Caxambu',\n\t'Sibulan',\n\t'Kaleyanpur',\n\t'Asheville',\n\t'Albal',\n\t'Seshambe',\n\t'Sanga',\n\t'Furstenau',\n\t'Nea Artaki',\n\t'Flores',\n\t'Hualane',\n\t'Altun Kawbri',\n\t'McCandless',\n\t'Essau',\n\t'Andoany',\n\t'Navodari',\n\t'Cherry Creek',\n\t'Quitilipi',\n\t'Ermelo',\n\t'Arco',\n\t'Rosario del Tala',\n\t'Ravensburg',\n\t'Seveso',\n\t'Puerto Barrios',\n\t'Lucon',\n\t'Tadworth',\n\t'Banzhuangcun',\n\t'Sinnar',\n\t'Ladenburg',\n\t'Changzhou',\n\t'Futog',\n\t'Veenoord',\n\t'Pardes Hanna Karkur',\n\t'Palhoca',\n\t'Schaarbeek',\n\t'Jarabacoa',\n\t'Nazca',\n\t'Zurich',\n\t'Pacoti',\n\t'Lemmer',\n\t'Weizhou',\n\t'Nagpur',\n\t'Hueyotlipan',\n\t'Araria',\n\t'Kulat',\n\t'Horodenka',\n\t'Irupi',\n\t'Cinco Saltos',\n\t'Bhainsdehi',\n\t'Wamena',\n\t'West Haverstraw',\n\t'Ellon',\n\t'Fasa',\n\t'Turkan',\n\t'Tuzi',\n\t'Conjeeveram',\n\t'Imperial Beach',\n\t'Simria',\n\t'Golden Valley',\n\t'Tafas',\n\t'Hohenbrunn',\n\t'Harsin',\n\t'Mulundo',\n\t'Delaware',\n\t\"Sant'Angelo Lodigiano\",\n\t'El Reten',\n\t'Madukkur',\n\t'Padalarang',\n\t'Paraiba do Sul',\n\t'Toboali',\n\t'Bagcilar',\n\t'Dejen',\n\t'Carthage',\n\t'Yusufeli',\n\t'Ponduru',\n\t'Conceicao dos Ouros',\n\t'Finnkolo',\n\t'San Francisco Solano',\n\t'Vetralla',\n\t'Kheda',\n\t'Chauddagram',\n\t'Vinaroz',\n\t'Galatge',\n\t'Bradwell',\n\t'Orlova',\n\t'Korostyshiv',\n\t'San Adrian de Besos',\n\t'Bernburg',\n\t'Galatone',\n\t'Paradip Garh',\n\t'Kukraun',\n\t'Bruges',\n\t'Karuzi',\n\t'Hemet',\n\t'Vadnagar',\n\t'Bernardino de Campos',\n\t'Pansol',\n\t'Keystone',\n\t'Satuba',\n\t'Weinbohla',\n\t'Morris',\n\t'Piazzola sul Brenta',\n\t'Shalingzicun',\n\t'Falkensee',\n\t'Uberlandia',\n\t'Norco',\n\t'Narala',\n\t'Widhwidh',\n\t'Yahualica',\n\t'Mokrisset',\n\t'Bandalli',\n\t'Nizwa',\n\t'Seal Beach',\n\t'Shahpur Chaumukhi',\n\t'Bhangar',\n\t'Soldado Bartra',\n\t'Paratdiha',\n\t'Esme',\n\t'Goulmima',\n\t'Waiyuanshan',\n\t'Fukagawa',\n\t'Brookdale',\n\t'Leiktho',\n\t'West University Place',\n\t'Kaarst',\n\t'Sausar',\n\t'Pivijay',\n\t'Paraibuna',\n\t'Saint Bernard',\n\t'Ponta Grossa',\n\t'Ushiku',\n\t'Greenville',\n\t'Peduasi',\n\t'Le Loroux-Bottereau',\n\t'Sturbridge',\n\t'`Ibri',\n\t'Bururi',\n\t'Itarana',\n\t'Santol',\n\t'Saint-Amand-Montrond',\n\t'Palod',\n\t'Erdenet',\n\t'Bangramanjeshvara',\n\t'Schongau',\n\t'Tirumayam',\n\t'Barigarh',\n\t'Kinna',\n\t'Sarmera',\n\t'Middlesex',\n\t'Xixucun',\n\t'Anatoli',\n\t'Santa Cruz Naranjo',\n\t'Tocoa',\n\t'Cabo San Lucas',\n\t'Ban Dan Na Kham',\n\t'Martigny',\n\t'Morganton',\n\t'Caseros',\n\t'Ljubuski',\n\t'Itzer',\n\t'Januario Cicco',\n\t'Derzhavinsk',\n\t'Timoteo',\n\t'Cloppenburg',\n\t'Chirilagua',\n\t'Ordino',\n\t'Birsinghpur',\n\t'Nea Michaniona',\n\t'Sisophon',\n\t'Setif',\n\t'Porto San Giorgio',\n\t'Lakheri',\n\t'Gobernador Gregores',\n\t'Mazapil',\n\t'Arsikere',\n\t'Leon Postigo',\n\t'Ambovombe Afovoany',\n\t'Corbeil-Essonnes',\n\t'Ouda-yamaguchi',\n\t'Schloss Holte-Stukenbrock',\n\t'Ujjain',\n\t'Komorowice',\n\t'Pueblo Juarez',\n\t'Cookeville',\n\t'Caombo',\n\t'Heiligenhafen',\n\t'Lexington',\n\t'Maassluis',\n\t'Allschwil',\n\t'Ogulin',\n\t'Galveston',\n\t'Tepalcatepec',\n\t'Jericoacoara',\n\t'Gurupa',\n\t'Combarbala',\n\t'Poulton le Fylde',\n\t'Brandon',\n\t'Famy',\n\t'Fenggang',\n\t'Leping',\n\t'Recica',\n\t'Founougo',\n\t'San Diego',\n\t'Athar',\n\t'Teresina',\n\t'Xinbocun',\n\t'Piduguralla',\n\t'Buyukorhan',\n\t\"'Ain Merane\",\n\t'Bolvadin',\n\t'Carpenedolo',\n\t'Onna',\n\t'Nalegaon',\n\t'Grandola',\n\t'Frondenberg',\n\t'Hagerstown',\n\t'Lalmunia Munhara',\n\t'Shelburne',\n\t'Boulia',\n\t'Bni Drar',\n\t'Courbevoic',\n\t'Cocieri',\n\t'Lentate sul Seveso',\n\t'Claveria',\n\t'Margny-les-Compiegne',\n\t'Leoben',\n\t'Pavugada',\n\t'Werlte',\n\t'Turori',\n\t'Puerto Montt',\n\t'Hauppauge',\n\t'Nalas',\n\t'Daxiang',\n\t'Polygyros',\n\t'Asahni',\n\t'Dzhankoi',\n\t'Sanliurfa',\n\t'Motema',\n\t'Gadag',\n\t'Negele',\n\t'Cuevas del Almanzora',\n\t'David',\n\t'Singhanakhon',\n\t'Siwan',\n\t'Kalush',\n\t'Carnaubeira da Penha',\n\t'Odenton',\n\t'Caldono',\n\t'Ampahana',\n\t'Mozzate',\n\t'Hemer',\n\t'Barcaldine',\n\t'Kanan',\n\t'Itapecerica da Serra',\n\t'Toftir',\n\t'Peterhead',\n\t'Xishancun',\n\t'Worgl',\n\t'Hermanus',\n\t'Derby',\n\t'Aranda de Duero',\n\t\"Aci Sant'Antonio\",\n\t'Fetesti',\n\t'Masantol',\n\t'Vyara',\n\t'Puerto Berrio',\n\t'Norton',\n\t'St. Augustine Shores',\n\t'East Moline',\n\t'Shahbazpur',\n\t'Congonhas',\n\t'Naples',\n\t'Coromandel',\n\t'Aguas Zarcas',\n\t'Ceu Azul',\n\t'Sabanagrande',\n\t'Ranti',\n\t'Palapye',\n\t'Jitauna',\n\t'Brejo',\n\t'Abrisham',\n\t'Placilla de Penuelas',\n\t'Worcester',\n\t'Graneros',\n\t'Ras el Oued',\n\t'Tominian',\n\t'Kamatgi',\n\t'Tonakkal',\n\t'Dranesville',\n\t'Stepnogorsk',\n\t'Suchteln',\n\t'Casorate Primo',\n\t'Lajedo',\n\t'Chichihualco',\n\t'Loos',\n\t'Chust',\n\t'Winchester',\n\t'Tifton',\n\t'Deblin',\n\t'Armagh',\n\t'Mahonda',\n\t'Cheval',\n\t'Dzitbalche',\n\t'New Bern',\n\t'Le Teich',\n\t'Lamosina',\n\t'Oatfield',\n\t'Autazes',\n\t'Kikuchi',\n\t'Bni Gmil',\n\t'Ligonha',\n\t'Nepi',\n\t'Vohilengo',\n\t'Uruburetama',\n\t'Bajestan',\n\t'Al Kharj',\n\t'Cuito',\n\t'Vadakku Ariyanayakipuram',\n\t'Itaqui',\n\t'Cerro',\n\t'Acajutla',\n\t'Adjaouere',\n\t'Christchurch',\n\t'Miantso',\n\t'Damaturu',\n\t'Teluknaga',\n\t'Shaoyang',\n\t'Parappukara',\n\t'Buyukcekmece',\n\t'Pontefract',\n\t'Sangju',\n\t'Posoltega',\n\t'Longshan',\n\t'Scottsbluff',\n\t'Yate',\n\t'Rossville',\n\t'Khed',\n\t'Lokomby',\n\t'Pocking',\n\t'Duverge',\n\t'Mundamala',\n\t'Arivonimamo',\n\t'Bhimphedi',\n\t'Akiruno',\n\t'Toufen',\n\t'Civitanova Marche',\n\t'Chandlers Ford',\n\t'Titagarh',\n\t'Bengkalis',\n\t'Roth',\n\t'Lugoj',\n\t\"Yong'an\",\n\t'Sandusky',\n\t'Karuvambram',\n\t'Chambersburg',\n\t'Perivale',\n\t'Dayalpur',\n\t'Gafour',\n\t'Zeboudja',\n\t'Bee Cave',\n\t'El Amria',\n\t'Agioi Anargyroi',\n\t'Biberist',\n\t'Kerikeri',\n\t'Lequile',\n\t'DeSoto',\n\t'Waddan',\n\t'Sopur',\n\t'Ambattur',\n\t'Guayama',\n\t'Pontes e Lacerda',\n\t'Vellur',\n\t'Thebes',\n\t'Cedarburg',\n\t'Dzialdowo',\n\t'Mestrino',\n\t'Valeggio sul Mincio',\n\t'San Ignacio',\n\t'Dafni',\n\t'Burbach',\n\t'Milton Keynes',\n\t'Moman Barodiya',\n\t'Rantau Prapat',\n\t'Silver Spring',\n\t'Goldbach',\n\t'Bottesford',\n\t'Peruvancha',\n\t'Bad Ischl',\n\t'Olivar Bajo',\n\t'Shitan',\n\t'Vohilava',\n\t'Pinukpuk',\n\t'Dashao',\n\t'Pocharam',\n\t'Daireaux',\n\t'Putaparti',\n\t'Eysines',\n\t'Hasanparti',\n\t'Gumdag',\n\t'Chicago Ridge',\n\t'Quissama',\n\t'Colonia Leopoldina',\n\t'General Mamerto Natividad',\n\t'Steamboat Springs',\n\t'Walpole',\n\t'Mockern',\n\t'Sheboygan',\n\t'Korolevo',\n\t'Wichita Falls',\n\t'Chepes',\n\t'Airmont',\n\t'El Geneina',\n\t'Fruitville',\n\t'Hernani',\n\t'Casinhas',\n\t'Neuried',\n\t'Ain Aicha',\n\t'Correntes',\n\t'Loxstedt',\n\t'Yakoma',\n\t'Aqtau',\n\t'Aubenas',\n\t'Cedar Mill',\n\t'Drensteinfurt',\n\t'Bankheri',\n\t'Comarnic',\n\t'San Ignacio de Moxo',\n\t'Kattagan',\n\t'Podcetrtek',\n\t'Armenia',\n\t'Albina',\n\t'Ferraz de Vasconcelos',\n\t'Kibawe',\n\t'Navegantes',\n\t'Panna',\n\t'Sebt Ait Saghiouchen',\n\t'Nuevo Arraijan',\n\t'Milicz',\n\t'Alleppey',\n\t'Mondlo',\n\t'Tallmadge',\n\t'Birni',\n\t'Langrucun',\n\t'Maria Enzersdorf',\n\t'Birdaban',\n\t'Kalingalan Caluang',\n\t'Ormond Beach',\n\t'Pontedera',\n\t'Jilava',\n\t'Guduru',\n\t'Ashikita',\n\t'Port Antonio',\n\t'Termini Imerese',\n\t'Stranraer',\n\t'Muheza',\n\t'Sonapur',\n\t'Rothenburg ob der Tauber',\n\t'De Doorns',\n\t'Libreville',\n\t'Vargaur',\n\t'Madona',\n\t'Kirlampudi',\n\t'Usworth',\n\t'Ichchapuram',\n\t'Groairas',\n\t'Raipura',\n\t'Thanesar',\n\t'Gracanica',\n\t'Bukkarayasamudram',\n\t'Brunico',\n\t'Spremberg',\n\t'Sidi El Hattab',\n\t'Imeni Chapayeva',\n\t'Tandwa',\n\t'Ap Khanh Hung',\n\t'Bagulin',\n\t'Ziyodin Shaharchasi',\n\t'Catanzaro',\n\t'Kavak',\n\t'Nalchiti',\n\t'Pannaikkadu',\n\t'Vysoke Myto',\n\t'Punnappatti',\n\t'Kanchika',\n\t'Sibut',\n\t'Marblehead',\n\t'Mayenne',\n\t'Concepcion Huista',\n\t'Birch Bay',\n\t'Mulakaluru',\n\t'Lynchburg',\n\t'Titay',\n\t'Trou du Nord',\n\t'Murraysville',\n\t'Kalladai',\n\t'Ipoh',\n\t'Santa Maria Chilchotla',\n\t'Wervik',\n\t'Casa de Oro-Mount Helix',\n\t'Jamnagar',\n\t'Caotan',\n\t'Dewsbury',\n\t'La Pintana',\n\t'Betong',\n\t'Jhundo',\n\t'Saint-Gregoire',\n\t'Channarayapatna',\n\t'Lennestadt',\n\t'Bir Kasdali',\n\t'Kissidougou',\n\t'Palghat',\n\t'Winterberg',\n\t'San Jose Tenango',\n\t'Mays Chapel',\n\t'Barreiro',\n\t'Latakia',\n\t'Loudeac',\n\t'Periyapodu',\n\t'Bad Schussenried',\n\t'Himeji',\n\t'Ulaan-Uul',\n\t'Qormi',\n\t'Wamba',\n\t'Bovolone',\n\t'Limavady',\n\t'Kara-Bak',\n\t'Wilrijk',\n\t'Bissegem',\n\t'Richmond',\n\t'Quzhou',\n\t'Chamarru',\n\t'Arhavi',\n\t'Tartus',\n\t'Mboki',\n\t'Gramsh',\n\t'Jizhuang',\n\t'Capitola',\n\t'Ashby de la Zouch',\n\t'Saga',\n\t'Mage',\n\t'Manvi',\n\t'Baud',\n\t'Hincesti',\n\t'Santiago Sacatepequez',\n\t'Astley',\n\t'Moramanga',\n\t'Le Mars',\n\t'Mahinathpur',\n\t'Fort Mohave',\n\t'Turda',\n\t'Kadiolo',\n\t'Kannan',\n\t'Grossenkneten',\n\t'Tsiately',\n\t'Zhipingxiang',\n\t'Al `Amarah',\n\t'Florestopolis',\n\t'Mazara del Vallo',\n\t'Antonivka',\n\t'Laconia',\n\t'Bouka',\n\t'Vemulanarva',\n\t'Budakalasz',\n\t'Kelkheim (Taunus)',\n\t'Ventania',\n\t'Castanos',\n\t'Ganzhou',\n\t'Lauingen',\n\t'Borbon',\n\t'Lodwar',\n\t'Ober-Ramstadt',\n\t'Qardho',\n\t'Kathevaram',\n\t'Colorado',\n\t'Sierra Vista',\n\t'Walnut Creek',\n\t'Tainan',\n\t'Guaraciaba',\n\t'Beni Hassane',\n\t'Tabuse',\n\t'Isfisor',\n\t'Long Beach',\n\t'Mahraurh',\n\t'Langerwehe',\n\t'An',\n\t'Nueve de Julio',\n\t'Kastamonu',\n\t'Harmanli',\n\t'Welver',\n\t'Binisalem',\n\t\"Imi n'Oulaoun\",\n\t'Lizzanello',\n\t'Itapema',\n\t'Colon',\n\t'Andolofotsy',\n\t'Ilafy',\n\t'Chivasso',\n\t'Al Ghayzah',\n\t'Weno',\n\t'Hostotipaquillo',\n\t'Talugai',\n\t'Tomohon',\n\t'Saint-Remy-de-Provence',\n\t'Takikawa',\n\t'Ramgundam',\n\t'Shamaldy-Say',\n\t'Buram',\n\t'Curtea de Arges',\n\t'Labo',\n\t'Chahatpur',\n\t'Upington',\n\t'Andorinha',\n\t'Saymayl',\n\t'Nkheila',\n\t'Lindi',\n\t'Rio Tercero',\n\t'Grevena',\n\t'Peschiera del Garda',\n\t'Las Terrenas',\n\t'Holzwickede',\n\t'Mallet',\n\t'Ambara',\n\t'San Gregorio di Catania',\n\t'Chiramba',\n\t'Marudi',\n\t'Donji Kakanj',\n\t'Strand',\n\t'Azzano Decimo',\n\t'San Remo',\n\t'Brasschaat',\n\t'Barokhar',\n\t'Torghay',\n\t'Soledad',\n\t'Alfredo Chaves',\n\t'Dongsheng',\n\t'Enumclaw',\n\t'Bouafle',\n\t'Navotas',\n\t'Ambohitoaka',\n\t'Marotandrano',\n\t'Sao Miguel do Tapuio',\n\t'Wevelgem',\n\t'Pio XII',\n\t'Vigodarzere',\n\t'Gargzdai',\n\t'Rennes',\n\t'Lucala',\n\t'Piney Green',\n\t'Stokke',\n\t'Al `Ayyat',\n\t'Agoura Hills',\n\t'Akabira',\n\t'Cabiao',\n\t'Sevilla de Niefang',\n\t'Coconuco',\n\t'Yaxley',\n\t'Morondava',\n\t'Francistown',\n\t'Shush',\n\t'Papillion',\n\t'Morawa',\n\t'Halstead',\n\t'Lower Pottsgrove',\n\t'Rende',\n\t'Opelika',\n\t'Tanakpur',\n\t'Bolsward',\n\t'Majene',\n\t'Tullinge',\n\t'Ifield',\n\t'Calumpit',\n\t'Brajarajnagar',\n\t'Laon',\n\t'Tamagawa',\n\t'Avcilar',\n\t'Manikpur',\n\t'Portet-sur-Garonne',\n\t'East Chicago',\n\t'Reddiyapatti',\n\t'Bananal',\n\t'Somero',\n\t'Sabara',\n\t'Ragay',\n\t'Cupertino',\n\t'Kuala Pembuang',\n\t'Andranomamy',\n\t'Kavar',\n\t'Gommern',\n\t'Oxelosund',\n\t'Cheraro',\n\t'Repala',\n\t'Sannar',\n\t'Blaj',\n\t'Clemmons',\n\t'Kakarati',\n\t'Valenciennes',\n\t'Batad',\n\t'Kyeintali',\n\t'Mengjiacun',\n\t'Agdz',\n\t'Ula',\n\t'Parede',\n\t'Buguias',\n\t'Palleja',\n\t'Urubamba',\n\t'Bobbili',\n\t'Damalcheruvu',\n\t'Wantagh',\n\t'Wailuku',\n\t'La Piedad',\n\t'Texarkana',\n\t'Isangel',\n\t'Rosario',\n\t'Tublay',\n\t'Zapote',\n\t'Albox',\n\t'Kandulapuram',\n\t'Vrindavan',\n\t'Amudalapalle',\n\t'Cabo Rojo',\n\t'Sternberk',\n\t'Telde',\n\t'Kreuzlingen',\n\t'Dudu',\n\t'Vouzela',\n\t'Hullatti',\n\t'Yellandu',\n\t'Suzaka',\n\t'Ouled Abbes',\n\t'Ankilizato',\n\t'Pocklington',\n\t'Lescar',\n\t'Belgrave',\n\t'Az Zabadani',\n\t'Battambang',\n\t'Lehigh Acres',\n\t'Magurele',\n\t'Kato',\n\t'Bailin',\n\t'Kobarid',\n\t'Aketi',\n\t'Pokrovske',\n\t'Pecica',\n\t'Coringa',\n\t'Dosemealti',\n\t'Oued Amlil',\n\t'Gaotan',\n\t'Warburg',\n\t'Virgem da Lapa',\n\t'Amdjarass',\n\t'Duijiang',\n\t'Bagado',\n\t'Pujali',\n\t'Nan',\n\t'Ibrahimpatan',\n\t'Tornio',\n\t'Mount Vista',\n\t'Sanso',\n\t'Nam Dinh',\n\t'Martinsburg',\n\t'Eshkanan',\n\t'Maringa',\n\t'Alamosa',\n\t'Suzzara',\n\t'Portachuelo',\n\t'Vempalle',\n\t'San Antonio La Paz',\n\t'Stafa',\n\t'Basey',\n\t'Sabaudia',\n\t'Veliki Preslav',\n\t'West Manchester',\n\t'Weissenburg',\n\t'Le Havre',\n\t'Togamalai',\n\t'Omitama',\n\t'Bihariganj',\n\t'Redange-sur-Attert',\n\t'Saint-Chamond',\n\t'Anklam',\n\t'Perwez',\n\t'Qivraq',\n\t'Chieti',\n\t'Gossau',\n\t'Tutzing',\n\t'Bacaadweyn',\n\t'Kohat',\n\t'Durbuy',\n\t'Clarence',\n\t'Olesno',\n\t'Uberaba',\n\t'Andorra la Vella',\n\t'Ranong',\n\t'Meshgin Shahr',\n\t'Senigallia',\n\t'Siahkal',\n\t'Apatin',\n\t'West Park',\n\t'Fallsburg',\n\t'Bom Lugar',\n\t'Chassieu',\n\t'Chauki Hasan Chauki Makhdum',\n\t'Hejamadi',\n\t'Santa Maria do Para',\n\t'Al Jumayliyah',\n\t'Harij',\n\t'Reedley',\n\t'Wafangdian',\n\t'Suzak',\n\t'Hirekerur',\n\t'Muar',\n\t'Xarardheere',\n\t'Tando Muhammad Khan',\n\t'Uchturpan',\n\t'Kalba',\n\t'Clearlake',\n\t'Aulendorf',\n\t'Parur',\n\t'Joanopolis',\n\t'Belagola',\n\t'Chapeltown',\n\t'Shildon',\n\t'Uruoca',\n\t'Gevelsberg',\n\t'Hindoria',\n\t'Przasnysz',\n\t'Vigasio',\n\t'Alamedin',\n\t'Namrup',\n\t'Luenoufla',\n\t'Teofilo Otoni',\n\t'Gopalapuram',\n\t'Shahhat',\n\t'Mesagne',\n\t'Maisaka',\n\t'San Pedro Nonualco',\n\t'Panevezys',\n\t'Quibor',\n\t'Frutal',\n\t'Casa Branca',\n\t'Furukawamen',\n\t'Presidente Vargas',\n\t'Vadugappatti',\n\t'Nefta',\n\t'Maipu',\n\t'Opa-locka',\n\t'Maidstone',\n\t'Santo Tomas La Union',\n\t'Wheeling',\n\t'Kamakhyanagar',\n\t'Rozzano',\n\t'Boljoon',\n\t'Aconibe',\n\t'Huzhou',\n\t'Kongolo',\n\t'Tacloban',\n\t'Escalante',\n\t'Wadowice',\n\t'Machala',\n\t'Lagonoy',\n\t'Carnaubais',\n\t'Lubuk Sikaping',\n\t'Yupiltepeque',\n\t'Gwoza',\n\t'Padilla',\n\t'Dhari',\n\t'Refahiye',\n\t'Sevierville',\n\t'Fellbach',\n\t'Raub',\n\t'Plaine du Nord',\n\t'Tepexi de Rodriguez',\n\t'Garango',\n\t'Nakapiripirit',\n\t'Grosse Pointe Park',\n\t'Aerzen',\n\t'Lingcheng',\n\t'Mogliano Veneto',\n\t'Wiesloch',\n\t'Tokatippa',\n\t'Bezou',\n\t'Bela',\n\t'Wahlstedt',\n\t'Huichang',\n\t'Raghudebbati',\n\t'El Sobrante',\n\t'Badarpur',\n\t'Nakskov',\n\t'Kurwar',\n\t'Siquinala',\n\t'Berga',\n\t'Jamalpur',\n\t'Sidi Taibi',\n\t'Crema',\n\t'Tharad',\n\t'Colomba',\n\t'Marostica',\n\t'Temiskaming Shores',\n\t'Karwar',\n\t'Pallavaram',\n\t'Dokolo',\n\t'Nawai',\n\t'Cullman',\n\t'Waldkraiburg',\n\t'Yoichi',\n\t'Nizip',\n\t'Litomysl',\n\t'Huong Canh',\n\t'Appenweier',\n\t'Gimbi',\n\t'Hulst',\n\t'Beshkent Shahri',\n\t'Ban Wat Lak Hok',\n\t'San Martin De Porres',\n\t'Chuy',\n\t'Fallon',\n\t'Domerat',\n\t'Ruggell',\n\t'Subang',\n\t'Kapalong',\n\t'Shahrak-e Enqelab',\n\t'Finneytown',\n\t'Casamassima',\n\t'Forks',\n\t'Silvassa',\n\t'Pharr',\n\t'Ait Bouziyane',\n\t'Sirari',\n\t'Saint-Etienne',\n\t'Halol',\n\t'Aregua',\n\t'Calatagan',\n\t'Palmas',\n\t'Milajerd',\n\t'Ar Riqqah',\n\t'Waghausel',\n\t'Tlaxcala',\n\t'Pellezzano',\n\t'Segovia',\n\t'Villeneuve-les-Maguelone',\n\t'Narrogin',\n\t'Vila Pouca de Aguiar',\n\t'Madagh',\n\t'Tanambe',\n\t'Rheinau',\n\t'Tsubame',\n\t'Kozluk',\n\t'El Ghaziye',\n\t'Ciudad Insurgentes',\n\t'Zuchwil',\n\t'Shangzhou',\n\t'Morton',\n\t'Ieper',\n\t'Hefei',\n\t'Qiryat Ono',\n\t'West Vero Corridor',\n\t'Rumonge',\n\t'Suohe',\n\t'Juprelle',\n\t'Airmadidi',\n\t'Pecel',\n\t'Pa Sang',\n\t'Phra Nakhon Si Ayutthaya',\n\t'Castrolibero',\n\t'Koprivnica',\n\t'Formiga',\n\t'Petatlan',\n\t'Xuanzhou',\n\t'Navirai',\n\t'Weilburg',\n\t'Belgaum',\n\t'Sovetskoe',\n\t'Mwaline al Oued',\n\t'Fort-de-France',\n\t'Belkheir',\n\t'Sarapiqui',\n\t'Manandona',\n\t'Ernagudem',\n\t'Dunaivtsi',\n\t'Perama',\n\t'Eastmont',\n\t'Zeerust',\n\t'Sao Miguel',\n\t'La Crescenta-Montrose',\n\t'Kardzhali',\n\t'Faisalabad',\n\t'Asan',\n\t'Trenton',\n\t'Kuttyattur',\n\t'Ban Thap Kwang',\n\t'Sahtah',\n\t'Tila',\n\t'Ait Tamlil',\n\t'Tomball',\n\t'Pathiyanikunnu',\n\t'Markdorf',\n\t'Kitakami',\n\t'Zacatecoluca',\n\t'Thouars',\n\t'Belem',\n\t'Albuquerque',\n\t'Veenendaal',\n\t'Namutumba',\n\t'Chalette-sur-Loing',\n\t'Shilan',\n\t'Consolacion',\n\t'Brahmanpara',\n\t'Pola de Lena',\n\t'Gislaved',\n\t'Arlesheim',\n\t'Inuma',\n\t'Royton',\n\t'Sawadah',\n\t'La Magdalena Tlaltelulco',\n\t'Wenlan',\n\t'Portoviejo',\n\t'Jaguarao',\n\t'Atlit',\n\t'Yellareddi',\n\t'Chima',\n\t'Ribnica',\n\t'Loves Park',\n\t'Vera Cruz',\n\t'Sape',\n\t'Alauli',\n\t'Antargangi',\n\t'DeForest',\n\t'Lethbridge',\n\t'Fuerte Olimpo',\n\t'Kiskunlachaza',\n\t'Mahagama',\n\t'Ulubey',\n\t'Cacimba de Dentro',\n\t'Thames',\n\t'Junqueiropolis',\n\t'Ganeshpur',\n\t'Avrille',\n\t'Guediawaye',\n\t'Flores de Goias',\n\t'Nevele',\n\t'Osisioma',\n\t'Valtoha',\n\t'Alfonso Castaneda',\n\t'Embu-Guacu',\n\t'Ballia',\n\t'Elmont',\n\t'Adampur',\n\t'Montalto Uffugo',\n\t'Locate di Triulzi',\n\t'Jinju',\n\t'Xenia',\n\t'Douar Jwalla',\n\t'Zanzibar',\n\t'Ansbach',\n\t'Cafarnaum',\n\t'Riacho de Santana',\n\t'Magburaka',\n\t'Hampton',\n\t'Kumo',\n\t'Adana',\n\t'Salisbury',\n\t'Begoro',\n\t'Rehlingen-Siersburg',\n\t'Tambulig',\n\t'Howli',\n\t'Port Hueneme',\n\t'Saire',\n\t'Lishanpu',\n\t'Mykhailivka',\n\t'Xiazhai',\n\t'Sochaczew',\n\t'Minbya',\n\t'Vienne',\n\t'Shegaon',\n\t'Hajnowka',\n\t'Alberobello',\n\t'Karatas',\n\t'Nyamti',\n\t'Tatarikan',\n\t'Puqiancun',\n\t'Andrews',\n\t'Kraluv Dvur',\n\t'Calnali',\n\t'Anna Regina',\n\t'Voss',\n\t'Rietberg',\n\t'Baracoa',\n\t'Caglayancerit',\n\t'Larkhall',\n\t'Fairwood',\n\t'Sardoba',\n\t'Beni Fouda',\n\t'Lakshminarayanapuram',\n\t'Kandy',\n\t'Pigcawayan',\n\t'Yuchengcun',\n\t'Barru',\n\t'Wulflingen',\n\t'Koktokay',\n\t'Santa Rosa de Cabal',\n\t'Ramona',\n\t'Rucphen',\n\t'Jinghai',\n\t'Twist',\n\t'Alberdi',\n\t'Izola',\n\t'Bom Jardim',\n\t'Benito Juarez',\n\t'Grinon',\n\t'Mundgod',\n\t'Manito',\n\t'Ban Tha Luang Lang',\n\t'Colesberg',\n\t'Hinche',\n\t'Sidmant al Jabal',\n\t'Vilnius',\n\t'Mount Laurel',\n\t'Dyero',\n\t'Madari Hat',\n\t'Patian',\n\t'Guimbal',\n\t'Linnei',\n\t'Astaneh-ye Ashrafiyeh',\n\t'Delfzijl',\n\t'Walla Walla',\n\t'Saint-Louis du Sud',\n\t'Shilou',\n\t'Puchov',\n\t'Trossingen',\n\t'Spring Valley',\n\t'May Pen',\n\t'Hadleigh',\n\t'Hoffman Estates',\n\t'Hirschaid',\n\t'Dorridge',\n\t'Ampohibe',\n\t'Amapa',\n\t'Temirtau',\n\t'Lakhsetipet',\n\t'Raeren',\n\t'Liffre',\n\t'Hassi Fedoul',\n\t'West Grey',\n\t'Jaggayyapeta',\n\t'Akita',\n\t'Burien',\n\t'Kranjska Gora',\n\t'Urla',\n\t'Apapa',\n\t'Tucano',\n\t'Stouffville',\n\t'Bayt Ummar',\n\t'Chamrajnagar',\n\t'Cagwait',\n\t'Sorada',\n\t'Saoula',\n\t'Cavan Monaghan',\n\t'Somotillo',\n\t'Kabarnet',\n\t'Ash Shatrah',\n\t'Forest Hill',\n\t'Colleyville',\n\t'Nzega',\n\t'Kaufering',\n\t'Bikou',\n\t'Ksar Sbahi',\n\t'Muramvya',\n\t'Impfondo',\n\t'Dalachi',\n\t'Janze',\n\t'Baruun-Urt',\n\t'Scornicesti',\n\t'Caem',\n\t'Darayya',\n\t'Foya Tangia',\n\t'Robertsville',\n\t'Ban Ho Mae Salong',\n\t\"Bi'r al `Abd\",\n\t'Giyani',\n\t'Dhamar',\n\t'Bni Frassen',\n\t'Brownhills',\n\t'Buckie',\n\t'Majagua',\n\t'Gainsborough',\n\t'Ayotoxco de Guerrero',\n\t'East Milton',\n\t'Sanchi',\n\t'Pogradec',\n\t'Yurimaguas',\n\t'Xingyi',\n\t'Tripunittura',\n\t'Lady Lake',\n\t'Safotu',\n\t'Gabu',\n\t'Pitt Meadows',\n\t'Sahalanona',\n\t'Vilaseca de Solcina',\n\t'Shinjuku',\n\t'Phnom Penh',\n\t'Espumoso',\n\t'Tiantoujiao',\n\t'Haukipudas',\n\t'Cuilapan de Guerrero',\n\t'Bafoussam',\n\t'Sunjiayan',\n\t'Bhanpura',\n\t'Sarangapuram',\n\t'Frontera',\n\t'Roh',\n\t'Prince Albert',\n\t'San Bernardino',\n\t'Maranello',\n\t'Ales',\n\t'Shenley Brook End',\n\t'Morayra',\n\t'Maba',\n\t'Pelileo',\n\t'Majiadiancun',\n\t'Broadstone',\n\t'Eski-Nookat',\n\t'Axapusco',\n\t'Najasa',\n\t'Iuiu',\n\t'Morieres-les-Avignon',\n\t'Capilla del Senor',\n\t'Amarante',\n\t'Bretigny-sur-Orge',\n\t'Jhaua',\n\t'Deulgaon Mahi',\n\t'Waterbury',\n\t'Euriapolis',\n\t'Thika',\n\t'Rothrist',\n\t'Tinja',\n\t'Umarizal',\n\t'Vihari',\n\t'Tepatlaxco',\n\t'Tan Son',\n\t'Anjangoveratra',\n\t'Yelimane',\n\t'Poulsbo',\n\t'Hutchinson',\n\t'Ittikelakunta',\n\t'Villena',\n\t'Mositai',\n\t'Roi Et',\n\t'Tulsipur',\n\t'Munhall',\n\t'Staufen im Breisgau',\n\t'Ciudad Hidalgo',\n\t'Naama',\n\t'Vratsa',\n\t'Sales Oliveira',\n\t'Xingtai',\n\t'Monteriggioni',\n\t'Grey Highlands',\n\t'Camoluk',\n\t'Ochsenhausen',\n\t'Winnenden',\n\t'Bogen',\n\t'Ambinanisakana',\n\t'Rolla',\n\t'New Philadelphia',\n\t'Varzelandia',\n\t'Can Tho',\n\t'Tepetlixpa',\n\t'Gursarai',\n\t'Grumo Appula',\n\t'Rudraprayag',\n\t'Kelheim',\n\t'Pionki',\n\t'Kedavur',\n\t'Frankfort',\n\t'Bishamagiri',\n\t'Shingbwiyang',\n\t'Montes Altos',\n\t'Longtangwan',\n\t'Veszprem',\n\t'Vadnais Heights',\n\t'Pozarevac',\n\t'Zyrardow',\n\t'Nis',\n\t'Julianadorp',\n\t'Beigang',\n\t'Wuhuang',\n\t'Ambalakindresy',\n\t'Yeosu',\n\t'Hisar',\n\t'Chithara',\n\t'Caldwell',\n\t'San Remigio',\n\t'Budamangalam',\n\t'Tamani',\n\t'Shetpe',\n\t'Velyki Luchky',\n\t'Jaramijo',\n\t'East Finchley',\n\t'Siedlce',\n\t'Tadigadapa',\n\t'Umuahia',\n\t'Jalgaon',\n\t'Schneeberg',\n\t'Chilonga',\n\t'Zhdanivka',\n\t'Bananeiras',\n\t'Nasaud',\n\t'Karlsdorf-Neuthard',\n\t'Culemborg',\n\t'Luanco',\n\t'Analamary',\n\t'Hinabangan',\n\t'Borgomanero',\n\t'Don Sak',\n\t'Newark',\n\t'Salqin',\n\t'Tafersit',\n\t'Siyang',\n\t'Goussainville',\n\t'Cermenate',\n\t'Gurlapeta',\n\t'Kiri',\n\t'Luis Gomes',\n\t'Partizanske',\n\t'Puducherry',\n\t'Strzegom',\n\t'Sai Mai',\n\t'Petlawad',\n\t'Vicenza',\n\t'Debbache el Hadj Douadi',\n\t'Amarpura',\n\t'Val-des-Monts',\n\t'Haicheng',\n\t'Kempton Park',\n\t'Raspur Patasia',\n\t'Killimangalam',\n\t'Thanatpin',\n\t'Oji',\n\t'Neno',\n\t'Kato Polemidia',\n\t'Anapurus',\n\t'Shakiso',\n\t'Diepholz',\n\t'Altrincham',\n\t'Nowa Ruda',\n\t'Sirnak',\n\t'Pettaivayttalai',\n\t'Schmelz',\n\t'Velur',\n\t'Wolverton',\n\t'Goygol',\n\t'Groesbeek',\n\t'Kannavam',\n\t'Bujumbura',\n\t'Ihorombe',\n\t'Hasami',\n\t'Revur',\n\t'Nosiarina',\n\t'Ciudad Guayana',\n\t'Economy',\n\t'Rayachoti',\n\t'Naciria',\n\t'Rompicherla',\n\t'Fairbanks',\n\t'Timbio',\n\t'Santo Amaro',\n\t'Vares',\n\t'Mafeteng',\n\t\"G'oliblar Qishlog'i\",\n\t'Kumul',\n\t'Kline',\n\t'Alampur',\n\t'Moda',\n\t'Lhasa',\n\t'Sirhali Kalan',\n\t'Lower Providence',\n\t'Fuengirola',\n\t'Naigarhi',\n\t'Cottonwood Heights',\n\t'Aldeias Altas',\n\t'Sibinal',\n\t'Sulaco',\n\t'Pintuyan',\n\t'Sombrio',\n\t'Negrete',\n\t'Tsau',\n\t'Casa Nova',\n\t'Garupa',\n\t'Pencheng',\n\t'Langnau',\n\t'Gokinepalle',\n\t'General Conesa',\n\t'Bandamurlanka',\n\t'Morarano-Gara',\n\t'Tartu',\n\t'Hombrechtikon',\n\t'Wegberg',\n\t'Argelia',\n\t'Neubrandenburg',\n\t'Bardmoor',\n\t'Benipati',\n\t'Saint-Laurent-de-la-Salanque',\n\t'Sungai Penuh',\n\t'Iklod',\n\t'Alem Paraiba',\n\t'Uitgeest',\n\t'Kiranur',\n\t'Tinambac',\n\t'Ait Yaich',\n\t'Teniet el Abed',\n\t'Middlesex Centre',\n\t'Grand-Bassam',\n\t'Redhill',\n\t'Zhaotong',\n\t'Mohammad Shahr',\n\t'Cranendonck',\n\t'Vanzago',\n\t'Wiener Neustadt',\n\t'Telavi',\n\t'Fonte Boa',\n\t'Svalyava',\n\t'Valea Lupului',\n\t'Kitale',\n\t'Campos Gerais',\n\t'Dayr as Sanquriyah',\n\t'Atmakur',\n\t'Boynton Beach',\n\t'Can',\n\t'Kalongo',\n\t'Bad Voslau',\n\t'Trutnov',\n\t'Sunagawa',\n\t'Bandarbeyla',\n\t'San Pedro Ixtlahuaca',\n\t'Lonquimay',\n\t'Kangal',\n\t'Bornem',\n\t'Luanza',\n\t'Tacurong',\n\t'Totteridge',\n\t'Kumcati',\n\t\"Saint George's\",\n\t'Uttoxeter',\n\t'Neath',\n\t'Cairns',\n\t'Kelkit',\n\t'Banlung',\n\t'Minneola',\n\t'Nedre Eiker',\n\t'Vembaditalam',\n\t'Ramanayyapeta',\n\t'New Ross',\n\t'Szamotuly',\n\t'Lapao',\n\t'Sakkamapatti',\n\t'Anjuna',\n\t'Lower Southampton',\n\t'Uch-Korgon',\n\t'Salovci',\n\t'Bhawanigarh',\n\t'Venceslau Bras',\n\t'Hosahalli',\n\t'Sibsagar',\n\t'Pazarcik',\n\t'Grigoriopol',\n\t'Shencottah',\n\t'Trenque Lauquen',\n\t'Oak Hills',\n\t'Magangue',\n\t'Beharona',\n\t'Hirakawacho',\n\t'Katsuura',\n\t'Belpukur',\n\t'Xingang',\n\t'Topoloveni',\n\t'Auxerre',\n\t'Caba',\n\t'Amioun',\n\t'Lake Oswego',\n\t'Nicoya',\n\t'Piprai',\n\t'Takhemaret',\n\t'Jula Buzarg',\n\t'Nam Som',\n\t'Wad Medani',\n\t'Dubasari',\n\t'Ricaurte',\n\t'Kocevje',\n\t'Torit',\n\t'Kanamadi',\n\t'Tasso',\n\t'Hermiston',\n\t'Seven Hills',\n\t'Ahmed Rachedi',\n\t'Maryville',\n\t'Lunen',\n\t'Marondry',\n\t'Ridgewood',\n\t'Chajul',\n\t'Norosi',\n\t'Amatitlan',\n\t'Williamstown',\n\t'Uliastay',\n\t'Lorsch',\n\t'Tekkekara',\n\t'Manisa',\n\t'Piatra Neamt',\n\t'Serta',\n\t'Padarti',\n\t'Agaro',\n\t'Boa Vista do Tupim',\n\t'Hariana',\n\t'Kobayashi',\n\t'Jessup',\n\t'Chahe',\n\t'Bournemouth',\n\t'Anajatuba',\n\t'Tugatog',\n\t'Vavur',\n\t'Ksar el Boukhari',\n\t'Masku',\n\t'Sungandiancun',\n\t'Candoni',\n\t'Mori',\n\t'Saint-Omer',\n\t'Alhaurin el Grande',\n\t'Atasu',\n\t'Rodos',\n\t'Bordj el Bahri',\n\t'Iheddadene',\n\t'Golden Hills',\n\t'Vista',\n\t'Cabrican',\n\t'Guara',\n\t'Sendarappatti',\n\t'Djouab',\n\t'Altea',\n\t'Omagari',\n\t'Firou',\n\t'Guinguineo',\n\t'Poytug`',\n\t'Chennamangalam',\n\t'Ramantali',\n\t'Penonome',\n\t'Tindivanam',\n\t'New River',\n\t'Pedda Tumbalam',\n\t'Hendersonville',\n\t'East Ridge',\n\t'The Colony',\n\t'Velizy-Villacoublay',\n\t'Koheda',\n\t'Ouaregou',\n\t'Sint-Truiden',\n\t'Zonnebeke',\n\t'Cartersville',\n\t'Serro',\n\t'Smorumnedre',\n\t'Sebt Bni Garfett',\n\t'Budhlada',\n\t'Malmesbury',\n\t'Kranj',\n\t'Union de San Antonio',\n\t'Batu Pahat',\n\t'Lian',\n\t'Baldeogarh',\n\t'Katsushika-ku',\n\t'Kiho',\n\t'Decines-Charpieu',\n\t'Jangy-Nookat',\n\t'Mudgal',\n\t'Pocoes',\n\t'Nanping',\n\t'Mota',\n\t'Maoussa',\n\t'Wolnzach',\n\t'Deysbrook',\n\t'Bad Essen',\n\t'Edogawa',\n\t'Cromer',\n\t'Brejetuba',\n\t'Wasilkow',\n\t'Beni Rached',\n\t'Balch Springs',\n\t'Folsom',\n\t'Nakonde',\n\t'Priboj',\n\t'Sigma',\n\t'Monywa',\n\t'Raismes',\n\t'Patut',\n\t'Kangar',\n\t'Kostrzyn',\n\t'Settsu',\n\t'Nandongcun',\n\t'Moosburg',\n\t'Vohitrandriana',\n\t'Sidi Bou Othmane',\n\t'Had Sahary',\n\t'Prescott Valley',\n\t'Burghausen',\n\t'Meco',\n\t'Bourbonnais',\n\t'San Maurizio Canavese',\n\t'Tequixquiac',\n\t'Wanyuan',\n\t'Hungund',\n\t'Huambo',\n\t'Sopelana',\n\t'Madaoua',\n\t'Mottola',\n\t'North Valley Stream',\n\t'Schaafheim',\n\t'Mataas Na Kahoy',\n\t'Maracay',\n\t'Deh Bakri',\n\t'Turkistan',\n\t'Spiesen-Elversberg',\n\t'Lansdale',\n\t'Sinha',\n\t'Haddonfield',\n\t'Mechanicstown',\n\t'San Vicente del Caguan',\n\t'Middleburg Heights',\n\t'New Lenox',\n\t'Mehlville',\n\t'Ambalakirajy',\n\t'Tak',\n\t'Willemstad',\n\t'Yato',\n\t'Carbondale',\n\t'Wakiso',\n\t'Farsala',\n\t'Gudarah',\n\t'Dorchester',\n\t'Ban Pang Mu',\n\t'Mosgiel',\n\t'Grafing bei Munchen',\n\t'Domkonda',\n\t'Challans',\n\t'Sulmona',\n\t'Ayirurpara',\n\t'Kaman',\n\t'Kumaramangalam',\n\t'Jiaojiazhuang',\n\t'Kelsterbach',\n\t'Saratoga',\n\t'Haledon',\n\t'Apodi',\n\t'Kuchinda',\n\t'Slidell',\n\t'Miamisburg',\n\t'Ponmana',\n\t'Icatu',\n\t'Oliva',\n\t'Cliza',\n\t'Ellenabad',\n\t'Pikit',\n\t'Fengning',\n\t'Erbaa',\n\t'Koraput',\n\t'Bhiloda',\n\t'Thenia',\n\t'Chinoz',\n\t'Zaysan',\n\t'Sarmastpur',\n\t'Lerici',\n\t'Wachtberg',\n\t'Kunjatturu',\n\t'Mzimba',\n\t'Oficina Maria Elena',\n\t'Paco do Lumiar',\n\t'Swansea',\n\t'Showt',\n\t'Batroun',\n\t'El Hadjar',\n\t'Childwall',\n\t'Xekong',\n\t'Anta',\n\t'Khem Karan Saray',\n\t'Panruti',\n\t'Yatton',\n\t'Avalpundurai',\n\t'Kudayattur',\n\t'Al Miqdadiyah',\n\t'Humanes de Madrid',\n\t'Tako',\n\t'As Sa`diyah',\n\t'Santana do Livramento',\n\t'Terrebonne',\n\t'Caninde de Sao Francisco',\n\t'Dombachcheri',\n\t'Podlehnik',\n\t'Andergrove',\n\t'Mima',\n\t'San Vendemiano',\n\t'Kindi',\n\t'Mengdingjie',\n\t'Xindi',\n\t'Kembhavi',\n\t'Verden',\n\t'Tarboro',\n\t'Manga',\n\t'Santa Rosa Jauregui',\n\t'Eiras',\n\t'Sapporo',\n\t'Puerto Octay',\n\t'Bothell West',\n\t'Almolonga',\n\t'Asperg',\n\t'Nanchong',\n\t'Honnali',\n\t'Orange City',\n\t'Ommangi',\n\t'Marilia',\n\t'Tobyl',\n\t'Coatesville',\n\t'Laualagaon',\n\t'Chinacota',\n\t'Breuillet',\n\t'Sinnamary',\n\t'Sun Lakes',\n\t'Tandur',\n\t'La Uruca',\n\t'Ann Arbor',\n\t'Boumerdes',\n\t'Cizre',\n\t'Bicheno',\n\t'Ebersberg',\n\t'Diangoute Kamara',\n\t'Havanur',\n\t'Barra Mansa',\n\t'Santa Margherita Ligure',\n\t'Bruchhausen-Vilsen',\n\t'Daet',\n\t'Dumai',\n\t'Lanta',\n\t'Cahama',\n\t'Rajgadh',\n\t'Kapurthala',\n\t\"Sidi Smai'il\",\n\t'Bir el Ater',\n\t'Yesilkoy',\n\t'Yanshuiguan',\n\t'Arantangi',\n\t'Gaza',\n\t'Alajarvi',\n\t'Kondalahalli',\n\t'Salmanshahr',\n\t'Campo Maior',\n\t'Lago Vista',\n\t'Savignano sul Panaro',\n\t'Nong Kung Si',\n\t'Barnia',\n\t'Puttige',\n\t'Bracebridge',\n\t'Hipparga',\n\t'Bramsche',\n\t'Yangi Mirishkor',\n\t'Kimyogarlar',\n\t'Khemis el Khechna',\n\t'Maizieres-les-Metz',\n\t'Beyneu',\n\t'Eden Isle',\n\t'South Burlington',\n\t'Ramnagar Farsahi',\n\t'Vught',\n\t'Hexiwu',\n\t'Bhatpalli',\n\t'Kokoszki',\n\t'Rocky Mount',\n\t'Ano Syros',\n\t'Lutayan',\n\t'Ridgecrest',\n\t'Ranpur',\n\t'Ituango',\n\t'Kapelle-op-den-Bos',\n\t'Ladol',\n\t'Ambalabe',\n\t'Taramangalam',\n\t'Kumanovo',\n\t'Funyan Bira',\n\t\"Itaporanga d'Ajuda\",\n\t'Samana',\n\t'Nij Khari',\n\t'Kafr Nabudah',\n\t'Dombasle-sur-Meurthe',\n\t'Jurbise',\n\t'Ciudad del Carmen',\n\t'Toon',\n\t'Big Spring',\n\t'Talpa de Allende',\n\t'Hinton',\n\t'Araouane',\n\t'Morungaba',\n\t'Stolac',\n\t'Lobez',\n\t'Toulon',\n\t'San Cesareo',\n\t'Three Lakes',\n\t'Jacareacanga',\n\t'Marne',\n\t'Fredericia',\n\t'Convencion',\n\t'Tarquinia',\n\t'Tepe-Korgon',\n\t'El Ghiate',\n\t'Tashkent',\n\t'Kirchlengern',\n\t'Roseau',\n\t'Nahan',\n\t'Givors',\n\t'Ikom',\n\t'Bumpe',\n\t'Shirhatti',\n\t'Reggiolo',\n\t'San Blas',\n\t'Cholet',\n\t'Dhirwas',\n\t'Bata',\n\t'Taito',\n\t'Jind',\n\t'Sahil',\n\t'La Fleche',\n\t'Ardakan',\n\t'Batangafo',\n\t'Kaza',\n\t'Bac',\n\t'Rio Jimenez',\n\t'Caycuma',\n\t'Kippax',\n\t'Denyekoro',\n\t'Ganganagar',\n\t'Mahalpur',\n\t'Sarpavaram',\n\t'Punarakh',\n\t'Cessnock',\n\t'San Fausto de Campcentellas',\n\t'Scandicci',\n\t'Valle Vista',\n\t'Manaoag',\n\t'Noe',\n\t'Penha',\n\t'Couvin',\n\t'Bakun',\n\t'Porto Uniao',\n\t'Bolanos de Calatrava',\n\t'Sun City West',\n\t'Orzinuovi',\n\t'Carrara',\n\t'Tilhar',\n\t'Prudentopolis',\n\t'Ciudad Real',\n\t'Ermont',\n\t'Sulop',\n\t'Brive-la-Gaillarde',\n\t'El Estor',\n\t'Tirschenreuth',\n\t'Foum el Anser',\n\t'Ban Pong Yaeng Nai',\n\t'Lissegazoun',\n\t'Gucheng',\n\t'Louth',\n\t'Minamiise',\n\t'Janow Lubelski',\n\t'Zacualpan',\n\t'Bobrynets',\n\t'Bel Imour',\n\t'El Valle del Espiritu Santo',\n\t'Vodiriana',\n\t'Ad Dujayl',\n\t'Puerto La Cruz',\n\t'Cadiz',\n\t'Basse Santa Su',\n\t'Longuenesse',\n\t'Kalamula',\n\t'Ponca City',\n\t'Lebowakgomo',\n\t'Chittandikavundanur',\n\t'Villarrobledo',\n\t'Settivaripalle',\n\t'Maksi',\n\t'Whitnash',\n\t'Parintins',\n\t'Mykolaiv',\n\t'Somavarappatti',\n\t'Az Zaydiyah',\n\t'Chop',\n\t'Pingcha',\n\t'Gojo',\n\t'Anicuns',\n\t\"Vaprio d'Adda\",\n\t'Ailan Mubage',\n\t'Gernsheim',\n\t'Ozamiz City',\n\t'Bamendjou',\n\t'Mantingan',\n\t'Centre Wellington',\n\t'Somolu',\n\t'Ijevan',\n\t'Gurun',\n\t'Sonhauli',\n\t'Hoshoot',\n\t'Lippstadt',\n\t'Payshamba Shahri',\n\t'Pirapora',\n\t'Mariyadau',\n\t'Touba',\n\t'Cavallino',\n\t'Broomall',\n\t'Saint-Paul-Trois-Chateaux',\n\t'Pirangut',\n\t'Monte San Savino',\n\t'Addis Ababa',\n\t'Wenzhou',\n\t'Hongshui',\n\t'Bamora',\n\t'Dadeldhura',\n\t'Barrhead',\n\t'Qizilhacili',\n\t'Cenon',\n\t'Yany Kapu',\n\t'Lauderdale Lakes',\n\t'Franklin Farm',\n\t'Licheng',\n\t'Lacchiarella',\n\t'Oshwe',\n\t'Blantyre',\n\t'Birpur',\n\t'Bucha',\n\t'San Manuel',\n\t'Laguna Beach',\n\t'Donna',\n\t'Clute',\n\t'Achchampeta',\n\t'Rajapalaiyam',\n\t'Koszeg',\n\t'Venancio Aires',\n\t'Romang',\n\t'Four Corners',\n\t'Sturgeon Bay',\n\t'Tuscaloosa',\n\t'Goianira',\n\t'Chattamangalam',\n\t'Tadotsu',\n\t'Sindhnur',\n\t'Ouda-daito',\n\t'Harmah',\n\t'Nordhausen',\n\t'Had Laaounate',\n\t'Dolny Kubin',\n\t'Penarth',\n\t'Androka',\n\t'Cajibio',\n\t'Molesey',\n\t'Zhanjia',\n\t'Abuzar-e Ghaffari',\n\t'Sayaxche',\n\t'Austin',\n\t'Pipalrawan',\n\t'Chillan',\n\t'Baena',\n\t'Langenberg',\n\t'Mykolaivka',\n\t'Ferentino',\n\t'Biddulph',\n\t'Harnosand',\n\t'Koekelberg',\n\t'Little Hulton',\n\t'Al Qitena',\n\t'Lewisville',\n\t'Turaiyur',\n\t'Chakkuvarakal',\n\t'Tres Rios',\n\t'Banabuiu',\n\t'Muzaffargarh',\n\t'Erragondapalem',\n\t'Ghambiraopet',\n\t'Okara',\n\t'Ilioupoli',\n\t'Paddhari',\n\t'Nariar',\n\t'Longjing',\n\t\"M'Sila\",\n\t'Bongor',\n\t'Viterbo',\n\t'Vlasenica',\n\t'Montalvania',\n\t'Parali',\n\t'Spa',\n\t'Westford',\n\t'Muttam',\n\t'Raamsdonksveer',\n\t'Garoua Boulai',\n\t'Batarasa',\n\t'Vasylkivka',\n\t'Estevan',\n\t'Luanda',\n\t'MacArthur',\n\t'Zulpich',\n\t'Phulbani',\n\t'Ifarantsa',\n\t'Umbita',\n\t'Korogwe',\n\t'Ilhabela',\n\t'Baronissi',\n\t'Kalyvia Thorikou',\n\t'Lahfayr',\n\t'Ba Ria',\n\t'Bronderslev',\n\t'Kaynasli',\n\t'Usmate Velate',\n\t'Hirosaki',\n\t'Quedgeley',\n\t'Zawyat ech Cheikh',\n\t'Soledad Atzompa',\n\t'Ambohitromby',\n\t'Joao Teves',\n\t'Siddipet',\n\t'Bitkine',\n\t'Bellshill',\n\t'Feke',\n\t'Grass Valley',\n\t'Ashton in Makerfield',\n\t'Punjai Puliyampatti',\n\t'Lobito',\n\t'Bernalda',\n\t'Loudonville',\n\t'Asbury Lake',\n\t'Gyoda',\n\t'Artik',\n\t'Rio Rancho',\n\t'Roissy-en-Brie',\n\t'Garches',\n\t'Chemini',\n];\n\nexport const maxStringLength = 49;\n"
  },
  {
    "path": "drizzle-seed/src/datasets/companyNameSuffixes.ts",
    "content": "export default [\n\t'LLC',\n\t'Ltd',\n\t'Inc.',\n\t'Corp.',\n\t'PLC',\n\t'GmbH',\n\t'AG',\n\t'S.A.',\n\t'S.p.A.',\n\t'SARL',\n\t'B.V.',\n\t'N.V.',\n\t'Oy',\n\t'AB',\n\t'AS',\n\t'Pty Ltd',\n\t'K.K.',\n\t'JSC',\n\t'Ltda.',\n\t'Pvt Ltd',\n\t'Sdn Bhd',\n\t'A/S',\n\t'SAOG',\n\t'Co.',\n\t'SCC',\n];\n\nexport const maxStringLength = 7;\n"
  },
  {
    "path": "drizzle-seed/src/datasets/countries.ts",
    "content": "/**\n * The original source for countries data was taken from https://www.kaggle.com/datasets/manusmitajha/countrydatacsv\n * We've excluded a few countries and their cities from this list because we don't think they should ever appear in any list\n */\nexport default [\n\t'Afghanistan',\n\t'Albania',\n\t'Algeria',\n\t'Angola',\n\t'Antigua and Barbuda',\n\t'Argentina',\n\t'Armenia',\n\t'Australia',\n\t'Austria',\n\t'Azerbaijan',\n\t'Bahamas',\n\t'Bahrain',\n\t'Bangladesh',\n\t'Barbados',\n\t'Belgium',\n\t'Belize',\n\t'Benin',\n\t'Bhutan',\n\t'Bolivia',\n\t'Bosnia and Herzegovina',\n\t'Botswana',\n\t'Brazil',\n\t'Brunei',\n\t'Bulgaria',\n\t'Burkina Faso',\n\t'Burundi',\n\t'Cambodia',\n\t'Cameroon',\n\t'Canada',\n\t'Cape Verde',\n\t'Central African Republic',\n\t'Chad',\n\t'Chile',\n\t'China',\n\t'Colombia',\n\t'Comoros',\n\t'Congo, Dem. Rep.',\n\t'Congo, Rep.',\n\t'Costa Rica',\n\t\"Cote d'Ivoire\",\n\t'Croatia',\n\t'Cyprus',\n\t'Czech Republic',\n\t'Denmark',\n\t'Dominican Republic',\n\t'Ecuador',\n\t'Egypt',\n\t'El Salvador',\n\t'Equatorial Guinea',\n\t'Eritrea',\n\t'Estonia',\n\t'Fiji',\n\t'Finland',\n\t'France',\n\t'Gabon',\n\t'Gambia',\n\t'Georgia',\n\t'Germany',\n\t'Ghana',\n\t'Greece',\n\t'Grenada',\n\t'Guatemala',\n\t'Guinea',\n\t'Guinea-Bissau',\n\t'Guyana',\n\t'Haiti',\n\t'Hungary',\n\t'Iceland',\n\t'India',\n\t'Indonesia',\n\t'Iran',\n\t'Iraq',\n\t'Ireland',\n\t'Israel',\n\t'Italy',\n\t'Jamaica',\n\t'Japan',\n\t'Jordan',\n\t'Kazakhstan',\n\t'Kenya',\n\t'Kiribati',\n\t'Kuwait',\n\t'Kyrgyz Republic',\n\t'Lao',\n\t'Latvia',\n\t'Lebanon',\n\t'Lesotho',\n\t'Liberia',\n\t'Libya',\n\t'Lithuania',\n\t'Luxembourg',\n\t'Macedonia, FYR',\n\t'Madagascar',\n\t'Malawi',\n\t'Malaysia',\n\t'Maldives',\n\t'Mali',\n\t'Malta',\n\t'Mauritania',\n\t'Mauritius',\n\t'Micronesia, Fed. Sts.',\n\t'Moldova',\n\t'Mongolia',\n\t'Montenegro',\n\t'Morocco',\n\t'Mozambique',\n\t'Myanmar',\n\t'Namibia',\n\t'Nepal',\n\t'Netherlands',\n\t'New Zealand',\n\t'Niger',\n\t'Nigeria',\n\t'Norway',\n\t'Oman',\n\t'Pakistan',\n\t'Panama',\n\t'Paraguay',\n\t'Peru',\n\t'Philippines',\n\t'Poland',\n\t'Portugal',\n\t'Qatar',\n\t'Romania',\n\t'Rwanda',\n\t'Samoa',\n\t'Saudi Arabia',\n\t'Senegal',\n\t'Serbia',\n\t'Seychelles',\n\t'Sierra Leone',\n\t'Singapore',\n\t'Slovak Republic',\n\t'Slovenia',\n\t'Solomon Islands',\n\t'South Africa',\n\t'South Korea',\n\t'Spain',\n\t'Sri Lanka',\n\t'St. Vincent and the Grenadines',\n\t'Sudan',\n\t'Suriname',\n\t'Sweden',\n\t'Switzerland',\n\t'Tajikistan',\n\t'Tanzania',\n\t'Thailand',\n\t'Timor-Leste',\n\t'Togo',\n\t'Tonga',\n\t'Tunisia',\n\t'Turkey',\n\t'Turkmenistan',\n\t'Uganda',\n\t'Ukraine',\n\t'United Arab Emirates',\n\t'United Kingdom',\n\t'United States',\n\t'Uruguay',\n\t'Uzbekistan',\n\t'Vanuatu',\n\t'Venezuela',\n\t'Vietnam',\n\t'Yemen',\n\t'Zambia',\n];\n\nexport const maxStringLength = 30;\n"
  },
  {
    "path": "drizzle-seed/src/datasets/emailDomains.ts",
    "content": "export default [\n\t'gmail.com',\n\t'yahoo.com',\n\t'outlook.com',\n\t'msn.com',\n\t'hotmail.com',\n\t'aol.com',\n\t'hotmail.co.uk',\n\t'hotmail.fr',\n\t'yahoo.fr',\n\t'wanadoo.fr',\n\t'orange.fr',\n\t'comcast.net',\n\t'yahoo.co.uk',\n\t'yahoo.com.br',\n\t'yahoo.co.in',\n\t'live.com',\n\t'rediffmail.com',\n\t'free.fr',\n\t'gmx.de',\n\t'web.de',\n\t'ymail.com',\n\t'libero.it',\n];\n\nexport const maxStringLength = 14;\n"
  },
  {
    "path": "drizzle-seed/src/datasets/firstNames.ts",
    "content": "/**\n * The original source for first names data was taken from https://www.kaggle.com/datasets/kaggle/us-baby-names?select=StateNames.csv\n */\nexport default [\n\t'Robert',\n\t'John',\n\t'Michael',\n\t'David',\n\t'James',\n\t'Richard',\n\t'Christopher',\n\t'William',\n\t'Daniel',\n\t'Mark',\n\t'Thomas',\n\t'Jose',\n\t'Joseph',\n\t'Matthew',\n\t'Jason',\n\t'Andrew',\n\t'Joshua',\n\t'Steven',\n\t'Anthony',\n\t'Jonathan',\n\t'Angel',\n\t'Ryan',\n\t'Kevin',\n\t'Jacob',\n\t'Nicholas',\n\t'Brandon',\n\t'Justin',\n\t'Charles',\n\t'Gary',\n\t'Paul',\n\t'Scott',\n\t'George',\n\t'Christian',\n\t'Eric',\n\t'Brian',\n\t'Alexander',\n\t'Ronald',\n\t'Jayden',\n\t'Juan',\n\t'Edward',\n\t'Noah',\n\t'Diego',\n\t'Donald',\n\t'Ethan',\n\t'Kyle',\n\t'Peter',\n\t'Jeffrey',\n\t'Luis',\n\t'Timothy',\n\t'Nathan',\n\t'Tyler',\n\t'Frank',\n\t'Stephen',\n\t'Dennis',\n\t'Larry',\n\t'Jesus',\n\t'Kenneth',\n\t'Austin',\n\t'Adrian',\n\t'Adam',\n\t'Sebastian',\n\t'Gregory',\n\t'Carlos',\n\t'Aiden',\n\t'Gabriel',\n\t'Isaac',\n\t'Zachary',\n\t'Julian',\n\t'Benjamin',\n\t'Liam',\n\t'Billy',\n\t'Miguel',\n\t'Mason',\n\t'Aaron',\n\t'Mike',\n\t'Dylan',\n\t'Sean',\n\t'Alejandro',\n\t'Bryan',\n\t'Jordan',\n\t'Cody',\n\t'Jeremy',\n\t'Samuel',\n\t'Harry',\n\t'Victor',\n\t'Joe',\n\t'Eduardo',\n\t'Isaiah',\n\t'Jorge',\n\t'Logan',\n\t'Elijah',\n\t'Bruce',\n\t'Patrick',\n\t'Jerry',\n\t'Jesse',\n\t'Lawrence',\n\t'Steve',\n\t'Walter',\n\t'Harold',\n\t'Arthur',\n\t'Lucas',\n\t'Francisco',\n\t'Douglas',\n\t'Oscar',\n\t'Craig',\n\t'Alexis',\n\t'Todd',\n\t'Randy',\n\t'Alan',\n\t'Raymond',\n\t'Damian',\n\t'Willie',\n\t'Albert',\n\t'Ricardo',\n\t'Louis',\n\t'Luke',\n\t'Edgar',\n\t'Travis',\n\t'Evan',\n\t'Ricky',\n\t'Aidan',\n\t'Jack',\n\t'Jeff',\n\t'Jimmy',\n\t'Manuel',\n\t'Oliver',\n\t'Mateo',\n\t'Johnny',\n\t'Henry',\n\t'Cristian',\n\t'Terry',\n\t'Dominic',\n\t'Cameron',\n\t'Gerald',\n\t'Caleb',\n\t'Christop',\n\t'Bobby',\n\t'Alex',\n\t'Gavin',\n\t'Shawn',\n\t'Jackson',\n\t'Ivan',\n\t'Keith',\n\t'Antonio',\n\t'Vincent',\n\t'Philip',\n\t'Chad',\n\t'Alfred',\n\t'Eugene',\n\t'Erik',\n\t'Martin',\n\t'Omar',\n\t'Chris',\n\t'Stanley',\n\t'Sergio',\n\t'Francis',\n\t'Mario',\n\t'Fernando',\n\t'Taylor',\n\t'Herbert',\n\t'Santiago',\n\t'Nathaniel',\n\t'Cesar',\n\t'Barry',\n\t'Trevor',\n\t'Dustin',\n\t'Hunter',\n\t'Roger',\n\t'Andres',\n\t'Javier',\n\t'Bernard',\n\t'Jim',\n\t'Ian',\n\t'Wayne',\n\t'Leonardo',\n\t'Giovanni',\n\t'Josiah',\n\t'Jeremiah',\n\t'Glenn',\n\t'Hector',\n\t'Roberto',\n\t'Rodney',\n\t'Howard',\n\t'Eli',\n\t'Xavier',\n\t'Jaxon',\n\t'Levi',\n\t'Derek',\n\t'Danny',\n\t'Jared',\n\t'Landon',\n\t'Ralph',\n\t'Ruben',\n\t'Gael',\n\t'Connor',\n\t'Tommy',\n\t'Tony',\n\t'Marc',\n\t'Wyatt',\n\t'Rick',\n\t'Carter',\n\t'Ayden',\n\t'Tim',\n\t'Roy',\n\t'Owen',\n\t'Greg',\n\t'Joel',\n\t'Leonard',\n\t'Frederick',\n\t'Russell',\n\t'Jon',\n\t'Jaden',\n\t'Jeffery',\n\t'Irving',\n\t'Erick',\n\t'Darren',\n\t'Dale',\n\t'Carl',\n\t'Brayden',\n\t'Ronnie',\n\t'Gerardo',\n\t'Pedro',\n\t'Raul',\n\t'Elias',\n\t'Chase',\n\t'Alberto',\n\t'Troy',\n\t'Tom',\n\t'Axel',\n\t'Julio',\n\t'Emmanuel',\n\t'Edwin',\n\t'Norman',\n\t'Marcus',\n\t'Fred',\n\t'Bill',\n\t'Jake',\n\t'Marco',\n\t'Leo',\n\t'Rafael',\n\t'Armando',\n\t'Jace',\n\t'Garrett',\n\t'Jaime',\n\t'Earl',\n\t'Shane',\n\t'Cole',\n\t'Phillip',\n\t'Seth',\n\t'Corey',\n\t'Nicolas',\n\t'Randall',\n\t'Hayden',\n\t'Abraham',\n\t'Grayson',\n\t'Tristan',\n\t'Cory',\n\t'Josue',\n\t'Andy',\n\t'Warren',\n\t'Roman',\n\t'Devin',\n\t'Salvador',\n\t'Shaun',\n\t'Spencer',\n\t'Infant',\n\t'Ryder',\n\t'Dillon',\n\t'Max',\n\t'Salvatore',\n\t'Bradley',\n\t'Seymour',\n\t'Arturo',\n\t'Iker',\n\t'Dean',\n\t'Milton',\n\t'Sidney',\n\t'Gustavo',\n\t'Alfredo',\n\t'Blake',\n\t'Clarence',\n\t'Brody',\n\t'Enrique',\n\t'Brett',\n\t'Colton',\n\t'Dan',\n\t'Brendan',\n\t'Charlie',\n\t'Darrell',\n\t'Hudson',\n\t'Ezra',\n\t'Emiliano',\n\t'Ashton',\n\t'Darryl',\n\t'Dave',\n\t'Nolan',\n\t'Theodore',\n\t'Casey',\n\t'Colin',\n\t'Easton',\n\t'Caden',\n\t'Marcos',\n\t'Cooper',\n\t'Mitchell',\n\t'Morris',\n\t'Don',\n\t'Eddie',\n\t'Jay',\n\t'Marvin',\n\t'Kaden',\n\t'Curtis',\n\t'Lance',\n\t'Gerard',\n\t'Israel',\n\t'Ramon',\n\t'Rickey',\n\t'Alec',\n\t'Carson',\n\t'Ernesto',\n\t'Riley',\n\t'Kai',\n\t'Ezekiel',\n\t'Yahir',\n\t'Dakota',\n\t'Ron',\n\t'Bob',\n\t'Saul',\n\t'Kayden',\n\t'Adan',\n\t'Fabian',\n\t'Maxwell',\n\t'Allen',\n\t'Micheal',\n\t'Parker',\n\t'Micah',\n\t'Miles',\n\t'Gilbert',\n\t'Grant',\n\t'Malik',\n\t'Abel',\n\t'Darrin',\n\t'Johnathan',\n\t'Jase',\n\t'Kaleb',\n\t'Ray',\n\t'Jaxson',\n\t'Brent',\n\t'Wesley',\n\t'Tanner',\n\t'Chester',\n\t'Bryce',\n\t'Lincoln',\n\t'Preston',\n\t'Maximiliano',\n\t'Jerome',\n\t'Sam',\n\t'Ernest',\n\t'Bentley',\n\t'Colby',\n\t'Elmer',\n\t'Moises',\n\t'Joaquin',\n\t'Arnold',\n\t'Stuart',\n\t'Murray',\n\t'Asher',\n\t'Andre',\n\t'Neil',\n\t'Allan',\n\t'Brady',\n\t'Brad',\n\t'Maximus',\n\t'Dalton',\n\t'Jonah',\n\t'Kim',\n\t'Kirk',\n\t'Bryson',\n\t'Kurt',\n\t'Angelo',\n\t'Rene',\n\t'Jimmie',\n\t'Emilio',\n\t'Damien',\n\t'Harvey',\n\t'Moshe',\n\t'Derrick',\n\t'Kelly',\n\t'Franklin',\n\t'Rodrigo',\n\t'Woodrow',\n\t'Leon',\n\t'Esteban',\n\t'Hugo',\n\t'Clayton',\n\t'Guadalupe',\n\t'Darin',\n\t'Pablo',\n\t'Luca',\n\t'Ken',\n\t'Ismael',\n\t'Leroy',\n\t'Guillermo',\n\t'Tracy',\n\t'Melvin',\n\t'Lorenzo',\n\t'Clifford',\n\t'Hugh',\n\t'Mathew',\n\t'Jameson',\n\t'Billie',\n\t'Nelson',\n\t'Herman',\n\t'Ira',\n\t'Jamie',\n\t'Alexande',\n\t'Lester',\n\t'Glen',\n\t'Damon',\n\t'Emanuel',\n\t'Maverick',\n\t'Braxton',\n\t'Zayden',\n\t'Dominick',\n\t'Irwin',\n\t'Rudy',\n\t'Calvin',\n\t'Julius',\n\t'Jermaine',\n\t'Jakob',\n\t'Donovan',\n\t'Lee',\n\t'Shaquille',\n\t'Gordon',\n\t'Peyton',\n\t'Duane',\n\t'Declan',\n\t'Jalen',\n\t'Jude',\n\t'Tyrone',\n\t'Bret',\n\t'Gene',\n\t'Felix',\n\t'Guy',\n\t'Devon',\n\t'Cruz',\n\t'Rylan',\n\t'Clinton',\n\t'Jonathon',\n\t'Kaiden',\n\t'Kingston',\n\t'Kristopher',\n\t'Felipe',\n\t'Collin',\n\t'Alfonso',\n\t'Rodolfo',\n\t'King',\n\t'Everett',\n\t'Chance',\n\t'Johnnie',\n\t'Clyde',\n\t'Weston',\n\t'Karl',\n\t'Camden',\n\t'Maddox',\n\t'Bryant',\n\t'Gage',\n\t'Dwayne',\n\t'Shannon',\n\t'Gilberto',\n\t'Braden',\n\t'Lewis',\n\t'Greyson',\n\t'Rudolph',\n\t'Floyd',\n\t'Jayce',\n\t'Harrison',\n\t'Brayan',\n\t'Cayden',\n\t'Reginald',\n\t'Jaiden',\n\t'Brantley',\n\t'Hyman',\n\t'Perry',\n\t'Kent',\n\t'Alvin',\n\t'Cade',\n\t'Doug',\n\t'Romeo',\n\t'Jax',\n\t'Silas',\n\t'Ty',\n\t'Emmett',\n\t'Jackie',\n\t'Leslie',\n\t'Vernon',\n\t'Jessie',\n\t'Lloyd',\n\t'Cecil',\n\t'Roland',\n\t'Ted',\n\t'Amir',\n\t'Cash',\n\t'Gregg',\n\t'Uriel',\n\t'Donnie',\n\t'Noel',\n\t'Mauricio',\n\t'Dana',\n\t'Osvaldo',\n\t'Sawyer',\n\t'Rogelio',\n\t'Terrence',\n\t'Conner',\n\t'Darius',\n\t'Chaim',\n\t'Maurice',\n\t'Male',\n\t'Malachi',\n\t'Issac',\n\t'Ramiro',\n\t'Zane',\n\t'Jaylen',\n\t'Dawson',\n\t'Willard',\n\t'Randolph',\n\t'Wilbur',\n\t'Noe',\n\t'Huey',\n\t'Sammy',\n\t'Lonnie',\n\t'Morton',\n\t'Chandler',\n\t'Elliot',\n\t'Geoffrey',\n\t'Robin',\n\t'Muhammad',\n\t'Wallace',\n\t'Matt',\n\t'Drew',\n\t'Bailey',\n\t'Orlando',\n\t'Jasper',\n\t'Tyrese',\n\t'Matteo',\n\t'Leonel',\n\t'Simon',\n\t'Braylon',\n\t'Corbin',\n\t'Jayceon',\n\t'Gunner',\n\t'Dante',\n\t'Daryl',\n\t'Bennett',\n\t'Ulises',\n\t'Efrain',\n\t'Drake',\n\t'Rolando',\n\t'Lukas',\n\t'Arian',\n\t'Trenton',\n\t'Humberto',\n\t'Ryker',\n\t'Aldo',\n\t'Landen',\n\t'Xander',\n\t'Dwight',\n\t'Alvaro',\n\t'Sheldon',\n\t'Freddie',\n\t'Vicente',\n\t'Avery',\n\t'Marty',\n\t'Irvin',\n\t'Ariel',\n\t'Lane',\n\t'Nestor',\n\t'Chuck',\n\t'Dominique',\n\t'Baby',\n\t'Kerry',\n\t'Enzo',\n\t'Nick',\n\t'Yosef',\n\t'Edmund',\n\t'Oswaldo',\n\t'Kobe',\n\t'Aden',\n\t'Clair',\n\t'Freddy',\n\t'Karter',\n\t'Stacy',\n\t'Byron',\n\t'Roosevelt',\n\t'Claude',\n\t'Marion',\n\t'Thiago',\n\t'Colt',\n\t'Sol',\n\t'Lamont',\n\t'Neal',\n\t'August',\n\t'Cason',\n\t'Kason',\n\t'Reynaldo',\n\t'Malcolm',\n\t'Beau',\n\t'Ignacio',\n\t'Kareem',\n\t'Laurence',\n\t'Finn',\n\t'Domingo',\n\t'Rigoberto',\n\t'Solomon',\n\t'Aaden',\n\t'Case',\n\t'Horace',\n\t'Griffin',\n\t'Rocco',\n\t'Pete',\n\t'Ross',\n\t'Skyler',\n\t'Kenny',\n\t'Tucker',\n\t'Morgan',\n\t'Forrest',\n\t'Timmy',\n\t'Clint',\n\t'Garry',\n\t'Elwood',\n\t'Knox',\n\t'Elian',\n\t'Zion',\n\t'Trey',\n\t'Vito',\n\t'Jamel',\n\t'Junior',\n\t'Roderick',\n\t'Brooks',\n\t'Isidore',\n\t'Kelvin',\n\t'Ali',\n\t'Octavio',\n\t'Luther',\n\t'Milo',\n\t'Jett',\n\t'Unknown',\n\t'Milan',\n\t'Nickolas',\n\t'German',\n\t'Terence',\n\t'Virgil',\n\t'Conor',\n\t'Isaias',\n\t'Cristopher',\n\t'Jayson',\n\t'Brenden',\n\t'Joey',\n\t'Tevin',\n\t'Branden',\n\t'Arjun',\n\t'Carmine',\n\t'Wendell',\n\t'Judah',\n\t'Nikolas',\n\t'Izaiah',\n\t'Dick',\n\t'Jairo',\n\t'Giovani',\n\t'Ervin',\n\t'Graham',\n\t'Trent',\n\t'Tyson',\n\t'Cedric',\n\t'Elliott',\n\t'Myles',\n\t'Kameron',\n\t'Jaylon',\n\t'Hubert',\n\t'Grady',\n\t'Homer',\n\t'Quinn',\n\t'Payton',\n\t'Bennie',\n\t'River',\n\t'Dexter',\n\t'Emil',\n\t'Jamal',\n\t'Orion',\n\t'Alonzo',\n\t'Paxton',\n\t'Ashley',\n\t'Desmond',\n\t'Waylon',\n\t'Patsy',\n\t'Agustin',\n\t'Shimon',\n\t'Jarrod',\n\t'Rex',\n\t'Pat',\n\t'Rhett',\n\t'Benny',\n\t'Adriel',\n\t'Moses',\n\t'Daquan',\n\t'Johan',\n\t'Adolfo',\n\t'Otis',\n\t'Kadeem',\n\t'Jody',\n\t'Wilson',\n\t'Pasquale',\n\t'Kendrick',\n\t'Alonso',\n\t'Ben',\n\t'Ezequiel',\n\t'Jair',\n\t'Tomas',\n\t'Zackary',\n\t'Dane',\n\t'Nasir',\n\t'Alton',\n\t'Tristen',\n\t'Wilfredo',\n\t'Lyle',\n\t'Rowan',\n\t'Deandre',\n\t'Mordechai',\n\t'Mohamed',\n\t'Khalil',\n\t'Maximilian',\n\t'Devante',\n\t'Wade',\n\t'Norbert',\n\t'Yehuda',\n\t'Dallas',\n\t'Menachem',\n\t'Anderson',\n\t'Jonas',\n\t'Zachery',\n\t'Zaiden',\n\t'Giovanny',\n\t'Clifton',\n\t'Tommie',\n\t'Ronaldo',\n\t'Major',\n\t'Barrett',\n\t'Darnell',\n\t'Keegan',\n\t'Randal',\n\t'Aarav',\n\t'Burton',\n\t'Terrance',\n\t'Reid',\n\t'Fredrick',\n\t'Bobbie',\n\t'Ace',\n\t'Kyler',\n\t'Yoel',\n\t'Earnest',\n\t'Toby',\n\t'Merle',\n\t'Archer',\n\t'Santos',\n\t'Nico',\n\t'Beckett',\n\t'Yisroel',\n\t'Nehemiah',\n\t'Lynn',\n\t'Holden',\n\t'Matias',\n\t'Rufus',\n\t'Mohammed',\n\t'Hayes',\n\t'Marshall',\n\t'Trinidad',\n\t'Valentin',\n\t'Heath',\n\t'Weldon',\n\t'Ed',\n\t'Lionel',\n\t'Jaret',\n\t'Aron',\n\t'Bernardo',\n\t'Zander',\n\t'Devonte',\n\t'Meyer',\n\t'Ulysses',\n\t'Myron',\n\t'Lowell',\n\t'Linwood',\n\t'Rocky',\n\t'Phoenix',\n\t'Antoine',\n\t'Cyrus',\n\t'Demarcus',\n\t'Bruno',\n\t'Titus',\n\t'Madison',\n\t'Jarod',\n\t'Caiden',\n\t'Kash',\n\t'Jarvis',\n\t'Clay',\n\t'Notnamed',\n\t'Doyle',\n\t'Dallin',\n\t'Atticus',\n\t'Orville',\n\t'Nixon',\n\t'Loren',\n\t'Wilbert',\n\t'Karson',\n\t'Brennan',\n\t'Brittany',\n\t'Marlon',\n\t'Gonzalo',\n\t'Carlton',\n\t'Cary',\n\t'Marquis',\n\t'Amari',\n\t'Rohan',\n\t'Terrell',\n\t'Gianni',\n\t'Johnathon',\n\t'Jan',\n\t'Boston',\n\t'Ibrahim',\n\t'Yitzchok',\n\t'Jean',\n\t'Camron',\n\t'Ronny',\n\t'Porter',\n\t'Adonis',\n\t'Alessandro',\n\t'Stefan',\n\t'Giancarlo',\n\t'Clark',\n\t'Lupe',\n\t'Edgardo',\n\t'Scotty',\n\t'Messiah',\n\t'Benito',\n\t'Zachariah',\n\t'Kristian',\n\t'Bodhi',\n\t'Ronan',\n\t'Emerson',\n\t'Wilfred',\n\t'Heriberto',\n\t'Davis',\n\t'Stewart',\n\t'Efren',\n\t'Brock',\n\t'Christophe',\n\t'Sammie',\n\t'Kade',\n\t'Denis',\n\t'Ernie',\n\t'Kayson',\n\t'Quincy',\n\t'Abe',\n\t'Estevan',\n\t'Jamari',\n\t'Mohammad',\n\t'Kendall',\n\t'Demetrius',\n\t'Walker',\n\t'Shlomo',\n\t'Louie',\n\t'Kody',\n\t'Valentino',\n\t'Jaheim',\n\t'Vince',\n\t'Frankie',\n\t'Aubrey',\n\t'Quinton',\n\t'Royce',\n\t'Ari',\n\t'Abram',\n\t'Jessica',\n\t'Curt',\n\t'Bart',\n\t'Daren',\n\t'Braylen',\n\t'Alexandro',\n\t'Lamar',\n\t'Kasen',\n\t'Willis',\n\t'Vihaan',\n\t'Delbert',\n\t'Triston',\n\t'Yakov',\n\t'Courtney',\n\t'Niko',\n\t'Pierre',\n\t'Jaquan',\n\t'Braulio',\n\t'Santino',\n\t'Quentin',\n\t'Dario',\n\t'Dusty',\n\t'Neymar',\n\t'Bridger',\n\t'Tyrell',\n\t'Bertram',\n\t'Raymundo',\n\t'Isiah',\n\t'Reed',\n\t'Archie',\n\t'Prince',\n\t'Rory',\n\t'Davon',\n\t'Stacey',\n\t'Bradford',\n\t'Nikolai',\n\t'Kian',\n\t'Kase',\n\t'Casen',\n\t'Dion',\n\t'Isai',\n\t'Armand',\n\t'Percy',\n\t'Emily',\n\t'Leland',\n\t'Sterling',\n\t'Yandel',\n\t'Olin',\n\t'Sanford',\n\t'Marlin',\n\t'Denzel',\n\t'Mekhi',\n\t'Elbert',\n\t'Braydon',\n\t'Dewey',\n\t'Dudley',\n\t'Shmuel',\n\t'Jadon',\n\t'Braeden',\n\t'Yair',\n\t'Rob',\n\t'Mickey',\n\t'Monty',\n\t'Hannah',\n\t'Luciano',\n\t'Remington',\n\t'Akeem',\n\t'Julien',\n\t'Carmen',\n\t'Jensen',\n\t'Johnie',\n\t'Mack',\n\t'Rickie',\n\t'Javon',\n\t'Misael',\n\t'Elvis',\n\t'Eden',\n\t'Jess',\n\t'Phil',\n\t'Malakai',\n\t'Melvyn',\n\t'Rod',\n\t'Arnulfo',\n\t'Cohen',\n\t'Fidel',\n\t'Levar',\n\t'Dominik',\n\t'Grover',\n\t'Yaakov',\n\t'Landyn',\n\t'Colten',\n\t'Dorian',\n\t'Keaton',\n\t'Loyd',\n\t'Brodie',\n\t'Otto',\n\t'Eliezer',\n\t'Ahmed',\n\t'Shelby',\n\t'Hernan',\n\t'Odin',\n\t'Regis',\n\t'Jaydon',\n\t'Uriah',\n\t'Remy',\n\t'Tariq',\n\t'Sonny',\n\t'Carroll',\n\t'Xavi',\n\t'Christia',\n\t'Marcel',\n\t'Brendon',\n\t'Kellan',\n\t'Bowen',\n\t'Unnamed',\n\t'Scottie',\n\t'Justice',\n\t'Kurtis',\n\t'Stephan',\n\t'Daxton',\n\t'Coby',\n\t'Jadiel',\n\t'Dashawn',\n\t'Amare',\n\t'Cannon',\n\t'Blaine',\n\t'Tate',\n\t'Talmadge',\n\t'Nathanael',\n\t'Adolph',\n\t'Talan',\n\t'Tobias',\n\t'Sylvester',\n\t'Tadeo',\n\t'Darrel',\n\t'Winston',\n\t'Garland',\n\t'Meir',\n\t'Kory',\n\t'Joseluis',\n\t'Wilburn',\n\t'Rusty',\n\t'Avraham',\n\t'Ayaan',\n\t'Theo',\n\t'Mathias',\n\t'Marcelo',\n\t'Dino',\n\t'Kolby',\n\t'Cael',\n\t'Tzvi',\n\t'Davion',\n\t'Aryan',\n\t'Rhys',\n\t'Cain',\n\t'Duke',\n\t'Pierce',\n\t'Landry',\n\t'Tristin',\n\t'Emma',\n\t'Zackery',\n\t'Antone',\n\t'Rayan',\n\t'Hendrix',\n\t'Lucca',\n\t'Luka',\n\t'Jarrett',\n\t'Miguelangel',\n\t'Rodger',\n\t'Kevon',\n\t'Jacoby',\n\t'Damion',\n\t'Maximo',\n\t'Robbie',\n\t'Jovanny',\n\t'Trace',\n\t'Gunnar',\n\t'Kieran',\n\t'Cristobal',\n\t'Kris',\n\t'Ellis',\n\t'Matthias',\n\t'Eloy',\n\t'Sarah',\n\t'Donny',\n\t'Donte',\n\t'Ronin',\n\t'Reece',\n\t'Alijah',\n\t'Zayne',\n\t'Jamarion',\n\t'Laverne',\n\t'Gregorio',\n\t'Kellen',\n\t'Nathen',\n\t'Gideon',\n\t'Rosario',\n\t'Erwin',\n\t'Jakub',\n\t'Normand',\n\t'Rey',\n\t'Trevon',\n\t'Stetson',\n\t'Carmelo',\n\t'Rashad',\n\t'Tod',\n\t'Elizabeth',\n\t'Harley',\n\t'Darian',\n\t'Scot',\n\t'Tavon',\n\t'Keven',\n\t'Merlin',\n\t'Nash',\n\t'Deangelo',\n\t'Raiden',\n\t'Jahir',\n\t'Isidro',\n\t'Davian',\n\t'Raekwon',\n\t'Alphonse',\n\t'Reese',\n\t'Abigail',\n\t'Deshawn',\n\t'Ahmad',\n\t'Conrad',\n\t'Truman',\n\t'Kolton',\n\t'Ryland',\n\t'Jamaal',\n\t'Abdiel',\n\t'Aditya',\n\t'Keenan',\n\t'Brycen',\n\t'Thaddeus',\n\t'Austen',\n\t'Leonidas',\n\t'Raphael',\n\t'Jovani',\n\t'Brenton',\n\t'Jasmine',\n\t'Thurman',\n\t'Russel',\n\t'Emory',\n\t'Cornelius',\n\t'Roel',\n\t'Xzavier',\n\t'Jovanni',\n\t'Zev',\n\t'Eldon',\n\t'Deven',\n\t'Kamden',\n\t'Eliseo',\n\t'Franco',\n\t'Duncan',\n\t'Anton',\n\t'Amarion',\n\t'Deron',\n\t'Sage',\n\t'Babyboy',\n\t'Fredy',\n\t'Russ',\n\t'Omarion',\n\t'Ryne',\n\t'Jovany',\n\t'Camilo',\n\t'Stan',\n\t'Cullen',\n\t'Armani',\n\t'Adrien',\n\t'Royal',\n\t'Kane',\n\t'Ishaan',\n\t'Spenser',\n\t'Antwan',\n\t'Stephon',\n\t'Juanpablo',\n\t'Tiffany',\n\t'Garret',\n\t'Jagger',\n\t'Will',\n\t'Nigel',\n\t'Chadwick',\n\t'Casimir',\n\t'Abdirahman',\n\t'Odell',\n\t'Keanu',\n\t'Josh',\n\t'Mortimer',\n\t'Raheem',\n\t'Jordon',\n\t'Nery',\n\t'Monte',\n\t'Jaxton',\n\t'Deacon',\n\t'Reuben',\n\t'Carlo',\n\t'Skylar',\n\t'Jamarcus',\n\t'Robby',\n\t'Jaycob',\n\t'Kristofer',\n\t'Buddy',\n\t'Korbin',\n\t'Arlo',\n\t'Jennifer',\n\t'Rodrick',\n\t'Juwan',\n\t'Latrell',\n\t'Chaz',\n\t'Lawson',\n\t'Mendel',\n\t'Jordy',\n\t'Dirk',\n\t'Finnegan',\n\t'Eason',\n\t'Atlas',\n\t'Eddy',\n\t'Mitch',\n\t'Reagan',\n\t'Clement',\n\t'Jamar',\n\t'Kamari',\n\t'Jarred',\n\t'Lauren',\n\t'Roscoe',\n\t'Jefferson',\n\t'Devan',\n\t'Elton',\n\t'Cortez',\n\t'Leandro',\n\t'Finley',\n\t'Cordero',\n\t'Dov',\n\t'Eliyahu',\n\t'Princeton',\n\t'Avrohom',\n\t'Hassan',\n\t'Dangelo',\n\t'Shamar',\n\t'Gino',\n\t'Yusuf',\n\t'Jaylin',\n\t'Martez',\n\t'Shad',\n\t'Keyshawn',\n\t'Nikhil',\n\t'Yael',\n\t'Harlan',\n\t'Jeffry',\n\t'Frederic',\n\t'Derick',\n\t'Dondre',\n\t'Vance',\n\t'Markus',\n\t'London',\n\t'Arman',\n\t'Marley',\n\t'Van',\n\t'Jaeden',\n\t'Krish',\n\t'Benson',\n\t'Marquise',\n\t'Cristofer',\n\t'Dewayne',\n\t'Gannon',\n\t'Genaro',\n\t'Crew',\n\t'Rashawn',\n\t'Rayden',\n\t'Raylan',\n\t'Jaxen',\n\t'Fredric',\n\t'Beckham',\n\t'Tripp',\n\t'Mckay',\n\t'Deonte',\n\t'Johann',\n\t'Johnpaul',\n\t'Santo',\n\t'Hakeem',\n\t'Federico',\n\t'Bert',\n\t'Flynn',\n\t'Edison',\n\t'Enoch',\n\t'Shulem',\n\t'Jovan',\n\t'Art',\n\t'Isadore',\n\t'Hal',\n\t'Cristiano',\n\t'Urijah',\n\t'Dilan',\n\t'Benicio',\n\t'Kingsley',\n\t'Aydan',\n\t'Syed',\n\t'Nicole',\n\t'Rachel',\n\t'Tyree',\n\t'Maximillian',\n\t'Branson',\n\t'Davin',\n\t'Layton',\n\t'Joan',\n\t'Darien',\n\t'Deion',\n\t'Augustus',\n\t'Dariel',\n\t'Oziel',\n\t'Juancarlos',\n\t'Pranav',\n\t'Danielle',\n\t'Rubin',\n\t'Jerald',\n\t'Wilmer',\n\t'Deegan',\n\t'Teddy',\n\t'Mariano',\n\t'Nathanie',\n\t'Stevie',\n\t'Dorsey',\n\t'Maxim',\n\t'Jaron',\n\t'Coty',\n\t'Damarion',\n\t'Semaj',\n\t'Maria',\n\t'Jamison',\n\t'Domenick',\n\t'Emile',\n\t'Armaan',\n\t'Arnav',\n\t'Mackenzie',\n\t'Everardo',\n\t'Aurelio',\n\t'Cayson',\n\t'Edwardo',\n\t'Charley',\n\t'Geovanni',\n\t'Vincenzo',\n\t'Yadiel',\n\t'Francesco',\n\t'Koby',\n\t'Joziah',\n\t'Jasiah',\n\t'Makai',\n\t'Long',\n\t'Cassius',\n\t'Omari',\n\t'Ferdinand',\n\t'Samir',\n\t'Cleveland',\n\t'Olivia',\n\t'Lanny',\n\t'Sincere',\n\t'Hyrum',\n\t'Christina',\n\t'Lucian',\n\t'Margarito',\n\t'Osiel',\n\t'Kinsler',\n\t'Sydney',\n\t'Slade',\n\t'Lazaro',\n\t'Sal',\n\t'Lipa',\n\t'Hobert',\n\t'Coy',\n\t'Elroy',\n\t'Tatum',\n\t'Katherine',\n\t'Chloe',\n\t'Kyrie',\n\t'Amanda',\n\t'Buford',\n\t'Kymani',\n\t'Kacper',\n\t'Elmo',\n\t'Alphonso',\n\t'Ramses',\n\t'Homero',\n\t'Sherman',\n\t'Reinaldo',\n\t'Yechiel',\n\t'Jonatan',\n\t'Mychal',\n\t'Gustave',\n\t'Paris',\n\t'Zain',\n\t'Markanthony',\n\t'Dimitri',\n\t'Mamadou',\n\t'Apollo',\n\t'Bronson',\n\t'Hamza',\n\t'Samson',\n\t'Madden',\n\t'Tylor',\n\t'Jacquez',\n\t'Garth',\n\t'Giuseppe',\n\t'Stephanie',\n\t'Darion',\n\t'Yurem',\n\t'Antony',\n\t'Rico',\n\t'Rich',\n\t'Dontavious',\n\t'Erin',\n\t'Kannon',\n\t'Isaak',\n\t'Dovid',\n\t'Coleman',\n\t'Monroe',\n\t'Bryon',\n\t'Asa',\n\t'Patricio',\n\t'Arnoldo',\n\t'Alexandra',\n\t'Jessy',\n\t'Jules',\n\t'Alexzander',\n\t'Jerrod',\n\t'Talon',\n\t'Elvin',\n\t'Chace',\n\t'Amos',\n\t'Galen',\n\t'Kenji',\n\t'Rahul',\n\t'Delmar',\n\t'Nakia',\n\t'Abdullah',\n\t'Deon',\n\t'Brice',\n\t'Osbaldo',\n\t'Favian',\n\t'Mauro',\n\t'Tristian',\n\t'Leopoldo',\n\t'Hans',\n\t'Hank',\n\t'Tou',\n\t'Demond',\n\t'Jemal',\n\t'Ladarius',\n\t'Kylan',\n\t'Braiden',\n\t'Darwin',\n\t'Kamron',\n\t'Millard',\n\t'Dax',\n\t'Shaquan',\n\t'Aloysius',\n\t'Tyshawn',\n\t'Westley',\n\t'Marquez',\n\t'Shayne',\n\t'Kasey',\n\t'Usher',\n\t'Ares',\n\t'Killian',\n\t'Maynard',\n\t'Jeshua',\n\t'Vaughn',\n\t'Shia',\n\t'Naftali',\n\t'Zaire',\n\t'Taj',\n\t'Edmond',\n\t'Zechariah',\n\t'Ollie',\n\t'Hoyt',\n\t'Donnell',\n\t'Soren',\n\t'Isac',\n\t'Tyquan',\n\t'Legend',\n\t'Devyn',\n\t'Shon',\n\t'Gerry',\n\t'Ellsworth',\n\t'Naftuli',\n\t'Johnson',\n\t'Haywood',\n\t'Aydin',\n\t'Junius',\n\t'Wiley',\n\t'Lennox',\n\t'Siddharth',\n\t'Odis',\n\t'Zaid',\n\t'Lacy',\n\t'Hussein',\n\t'Nicklas',\n\t'Callen',\n\t'Izayah',\n\t'Jaziel',\n\t'Claud',\n\t'Horacio',\n\t'Cyril',\n\t'Jariel',\n\t'Shemar',\n\t'Rebecca',\n\t'Reyes',\n\t'Denny',\n\t'Dereck',\n\t'Marcelino',\n\t'Najee',\n\t'Mac',\n\t'Hollis',\n\t'Korey',\n\t'Addison',\n\t'Jordi',\n\t'Eleazar',\n\t'Lisandro',\n\t'Dayton',\n\t'Ammon',\n\t'Reymundo',\n\t'Erich',\n\t'Tenzin',\n\t'Mitchel',\n\t'Kristoffer',\n\t'Jerrold',\n\t'Kristoph',\n\t'Refugio',\n\t'Erasmo',\n\t'Samantha',\n\t'Simcha',\n\t'Abdullahi',\n\t'Booker',\n\t'Quadir',\n\t'Kyson',\n\t'Hoover',\n\t'Gus',\n\t'Azael',\n\t'Mervin',\n\t'Yoshio',\n\t'Jorje',\n\t'Jesiah',\n\t'Shirley',\n\t'Brigham',\n\t'Memphis',\n\t'Reyansh',\n\t'Flavio',\n\t'Lavern',\n\t'Rosendo',\n\t'Dantrell',\n\t'Devonta',\n\t'Forest',\n\t'Alden',\n\t'Lyndon',\n\t'Luiz',\n\t'Elisha',\n\t'Al',\n\t'Bentlee',\n\t'Eriberto',\n\t'Marques',\n\t'Alexandre',\n\t'Fidencio',\n\t'Jabari',\n\t'Arsenio',\n\t'Kaysen',\n\t'Ethen',\n\t'Cleo',\n\t'Blaze',\n\t'Aryeh',\n\t'Dequan',\n\t'Denver',\n\t'Luc',\n\t'Delmas',\n\t'Javion',\n\t'Gauge',\n\t'Martell',\n\t'Ever',\n\t'Gavyn',\n\t'Aldair',\n\t'Okey',\n\t'Carey',\n\t'Geovanny',\n\t'Kalel',\n\t'Layne',\n\t'Hiroshi',\n\t'Ayan',\n\t'Akiva',\n\t'Clare',\n\t'Sigmund',\n\t'Furman',\n\t'Claudio',\n\t'Garrison',\n\t'Draven',\n\t'Aidyn',\n\t'Vern',\n\t'Andreas',\n\t'Kwame',\n\t'Imanol',\n\t'Jorden',\n\t'Glynn',\n\t'Adalberto',\n\t'Varun',\n\t'Dashiell',\n\t'Baron',\n\t'Jasen',\n\t'Child',\n\t'Earle',\n\t'Izaac',\n\t'Vivaan',\n\t'Koa',\n\t'Lennon',\n\t'Marcoantonio',\n\t'Gaetano',\n\t'Sumner',\n\t'Barney',\n\t'Demarion',\n\t'Abner',\n\t'Delonte',\n\t'Val',\n\t'Jacky',\n\t'Demario',\n\t'Zavier',\n\t'Kale',\n\t'Wilton',\n\t'Jordyn',\n\t'Tatsuo',\n\t'Boyd',\n\t'Zayn',\n\t'Darron',\n\t'Moe',\n\t'Dillan',\n\t'Naquan',\n\t'Ned',\n\t'Kaylee',\n\t'Kelton',\n\t'Sahil',\n\t'Kermit',\n\t'Abelardo',\n\t'Sullivan',\n\t'Crosby',\n\t'Hagen',\n\t'Tyreek',\n\t'Jaquez',\n\t'Andrea',\n\t'Kyan',\n\t'Jeremias',\n\t'Tracey',\n\t'Ward',\n\t'Brixton',\n\t'Seamus',\n\t'Cedrick',\n\t'Enrico',\n\t'Emmitt',\n\t'Ford',\n\t'Travon',\n\t'Felton',\n\t'Blair',\n\t'Rio',\n\t'Dandre',\n\t'Kaeden',\n\t'Tiger',\n\t'Orval',\n\t'Castiel',\n\t'Yousef',\n\t'Anson',\n\t'Callan',\n\t'Jamey',\n\t'Darrius',\n\t'Tre',\n\t'Michel',\n\t'Mcarthur',\n\t'Rasheed',\n\t'Jamir',\n\t'Herschel',\n\t'Anibal',\n\t'Kinnick',\n\t'Hilario',\n\t'Shea',\n\t'Jencarlos',\n\t'Darrick',\n\t'Rishi',\n\t'Shaya',\n\t'Haden',\n\t'Ean',\n\t'Jaylan',\n\t'Rolland',\n\t'Leobardo',\n\t'Fermin',\n\t'Keon',\n\t'Lucio',\n\t'Keagan',\n\t'Savion',\n\t'Masao',\n\t'Damari',\n\t'Aarush',\n\t'Nunzio',\n\t'Anakin',\n\t'Mayson',\n\t'Westin',\n\t'Norberto',\n\t'Tavares',\n\t'Gorge',\n\t'Tavaris',\n\t'Joesph',\n\t'Sylas',\n\t'Huy',\n\t'Gerson',\n\t'Augustine',\n\t'Buster',\n\t'Jelani',\n\t'Haley',\n\t'Filip',\n\t'Shmiel',\n\t'Lucius',\n\t'Rojelio',\n\t'Gale',\n\t'Quintin',\n\t'Channing',\n\t'Brayton',\n\t'Keshawn',\n\t'Osmar',\n\t'Otha',\n\t'Eder',\n\t'Mary',\n\t'Eusebio',\n\t'Matheus',\n\t'Randell',\n\t'Brennen',\n\t'Trae',\n\t'Paolo',\n\t'Caesar',\n\t'Estill',\n\t'Camren',\n\t'Dhruv',\n\t'Cutter',\n\t'Rayyan',\n\t'Jeramiah',\n\t'Anish',\n\t'Donavan',\n\t'Sunny',\n\t'Hershel',\n\t'Salvator',\n\t'Jedidiah',\n\t'Romario',\n\t'Hershy',\n\t'Anders',\n\t'Trevion',\n\t'Murphy',\n\t'Kanye',\n\t'Jionni',\n\t'Bradyn',\n\t'Cordell',\n\t'Alek',\n\t'Luisangel',\n\t'Norris',\n\t'Nevin',\n\t'Jaleel',\n\t'Lenny',\n\t'Judson',\n\t'Tayshaun',\n\t'Aedan',\n\t'Rhyder',\n\t'Domenic',\n\t'Santana',\n\t'Rahsaan',\n\t'Sebastien',\n\t'Corban',\n\t'Rowdy',\n\t'Kiyoshi',\n\t'Armen',\n\t'Efraim',\n\t'Vladimir',\n\t'Callum',\n\t'Abdul',\n\t'Gianluca',\n\t'Mayer',\n\t'Mustafa',\n\t'Demarco',\n\t'Neyland',\n\t'Vidal',\n\t'Marshawn',\n\t'Rudolfo',\n\t'Nazir',\n\t'Azariah',\n\t'Shoji',\n\t'Worth',\n\t'Levern',\n\t'Jai',\n\t'Antione',\n\t'Dickie',\n\t'Yehoshua',\n\t'Cliff',\n\t'Kaison',\n\t'Kye',\n\t'Jaren',\n\t'Emir',\n\t'Henrik',\n\t'Maxx',\n\t'Kainoa',\n\t'Athan',\n\t'Cletus',\n\t'Jasir',\n\t'Dejon',\n\t'Jadyn',\n\t'Houston',\n\t'Kadin',\n\t'Erubiel',\n\t'Hadi',\n\t'Jaydin',\n\t'Brianna',\n\t'Alyssa',\n\t'Marcello',\n\t'Omer',\n\t'Ikaika',\n\t'Ramel',\n\t'Arron',\n\t'Bently',\n\t'Daron',\n\t'Avi',\n\t'Jerod',\n\t'Shelton',\n\t'Winfred',\n\t'Mendy',\n\t'Ryu',\n\t'Nikko',\n\t'Arley',\n\t'Kamdyn',\n\t'Bo',\n\t'Erica',\n\t'Faustino',\n\t'Fletcher',\n\t'Dionte',\n\t'Boyce',\n\t'Kennedy',\n\t'Reyli',\n\t'Paulo',\n\t'Baruch',\n\t'Bernie',\n\t'Mohamad',\n\t'Kahlil',\n\t'Kong',\n\t'Baldemar',\n\t'Murry',\n\t'Rogers',\n\t'Sandy',\n\t'Bodie',\n\t'Ivory',\n\t'Youssef',\n\t'Kee',\n\t'Jahiem',\n\t'Isabella',\n\t'Keoni',\n\t'Michelle',\n\t'Luigi',\n\t'Marcanthony',\n\t'Jericho',\n\t'Achilles',\n\t'Everette',\n\t'Americo',\n\t'Edson',\n\t'Hiram',\n\t'Jeramy',\n\t'Metro',\n\t'Davi',\n\t'Hezekiah',\n\t'Harper',\n\t'Kiel',\n\t'Brandan',\n\t'Said',\n\t'Noam',\n\t'Tarik',\n\t'Raquan',\n\t'Zeb',\n\t'Broderick',\n\t'Arath',\n\t'Emery',\n\t'Kip',\n\t'Tymir',\n\t'Garrick',\n\t'Anfernee',\n\t'Khalid',\n\t'Jamil',\n\t'Demian',\n\t'Amador',\n\t'Oran',\n\t'Franklyn',\n\t'Porfirio',\n\t'Delano',\n\t'Justyn',\n\t'Aharon',\n\t'Karol',\n\t'Alva',\n\t'Nicky',\n\t'Zack',\n\t'Jerimiah',\n\t'Josef',\n\t'Errol',\n\t'Hideo',\n\t'Tahj',\n\t'Ilan',\n\t'Kennith',\n\t'Nathanial',\n\t'Kyron',\n\t'Merton',\n\t'Danial',\n\t'Tuan',\n\t'Hung',\n\t'Massimo',\n\t'Krew',\n\t'Arya',\n\t'Jedediah',\n\t'Nosson',\n\t'Jakobe',\n\t'Eitan',\n\t'Edmundo',\n\t'Olen',\n\t'Benedict',\n\t'Quintavious',\n\t'Shalom',\n\t'Akash',\n\t'Maxton',\n\t'Anna',\n\t'Julia',\n\t'Melissa',\n\t'Victoria',\n\t'Kekoa',\n\t'Konner',\n\t'Kirby',\n\t'Heyward',\n\t'Davonte',\n\t'Magnus',\n\t'Zeus',\n\t'Neel',\n\t'Franky',\n\t'Isael',\n\t'Gaylon',\n\t'Kole',\n\t'Axton',\n\t'Brando',\n\t'Mateusz',\n\t'Lucien',\n\t'Marquavious',\n\t'Lon',\n\t'Gian',\n\t'Savannah',\n\t'Trinity',\n\t'Harris',\n\t'Kamarion',\n\t'Aydenn',\n\t'Cale',\n\t'Neo',\n\t'Justus',\n\t'Mose',\n\t'Tiago',\n\t'Saverio',\n\t'Eligh',\n\t'Mikel',\n\t'Eliot',\n\t'Alvis',\n\t'Argenis',\n\t'Musa',\n\t'Lonny',\n\t'Thad',\n\t'Guido',\n\t'Ceasar',\n\t'Obed',\n\t'Pinchas',\n\t'Barton',\n\t'Durell',\n\t'Johnatha',\n\t'Aric',\n\t'Geovany',\n\t'Fransisco',\n\t'Jaheem',\n\t'Jarett',\n\t'Yeshua',\n\t'Karim',\n\t'Aayden',\n\t'Merrill',\n\t'Michele',\n\t'Jaydan',\n\t'Octavius',\n\t'Jermiah',\n\t'Alexavier',\n\t'Brandyn',\n\t'Arvid',\n\t'Brentley',\n\t'Sutton',\n\t'Coen',\n\t'Ameer',\n\t'Giovany',\n\t'Ishan',\n\t'Blaise',\n\t'Bayron',\n\t'Kamil',\n\t'Brooklyn',\n\t'Catherine',\n\t'Akira',\n\t'Briggs',\n\t'Damani',\n\t'Rasheen',\n\t'Rayford',\n\t'Moishe',\n\t'Ephraim',\n\t'Esequiel',\n\t'Kenyon',\n\t'Constantine',\n\t'Silvio',\n\t'Brain',\n\t'Daylon',\n\t'Raymon',\n\t'Ayush',\n\t'Lazer',\n\t'Telly',\n\t'Elan',\n\t'Stone',\n\t'Marland',\n\t'Donn',\n\t'Shamel',\n\t'Silvestre',\n\t'Zephyr',\n\t'Merrick',\n\t'Fausto',\n\t'Dedrick',\n\t'Cornell',\n\t'Whitney',\n\t'Derrell',\n\t'Mitsuo',\n\t'Lucious',\n\t'Tad',\n\t'Lyric',\n\t'Darrion',\n\t'Dannie',\n\t'Gayle',\n\t'Burl',\n\t'Jayquan',\n\t'Carrol',\n\t'Laquan',\n\t'Tyrek',\n\t'Natividad',\n\t'Casimer',\n\t'Jael',\n\t'Aven',\n\t'Arnaldo',\n\t'Yovani',\n\t'Laura',\n\t'Dejuan',\n\t'Dimitrios',\n\t'Yash',\n\t'Esai',\n\t'Zavion',\n\t'Ora',\n\t'Durward',\n\t'Bradly',\n\t'Hazel',\n\t'Che',\n\t'Richie',\n\t'Diana',\n\t'Alois',\n\t'Lynwood',\n\t'Luverne',\n\t'Zeke',\n\t'Dash',\n\t'Cairo',\n\t'Delvin',\n\t'Kawika',\n\t'Josemanuel',\n\t'Devean',\n\t'Sameer',\n\t'Seneca',\n\t'Presley',\n\t'Jed',\n\t'Malaki',\n\t'Dominque',\n\t'Dontae',\n\t'Dev',\n\t'Darey',\n\t'Reggie',\n\t'Izaak',\n\t'Manny',\n\t'Jere',\n\t'Minh',\n\t'Ryden',\n\t'Montana',\n\t'Kaleo',\n\t'Jacorey',\n\t'Ignatius',\n\t'Filiberto',\n\t'Cache',\n\t'Yitzchak',\n\t'Yaseen',\n\t'Kentrell',\n\t'Basil',\n\t'Ivy',\n\t'Migel',\n\t'Jalon',\n\t'Lenwood',\n\t'Ellwood',\n\t'Zakary',\n\t'Haiden',\n\t'Dontrell',\n\t'Braedon',\n\t'Lorne',\n\t'Trever',\n\t'Mikael',\n\t'Kenzo',\n\t'Javaris',\n\t'Ambrose',\n\t'Alain',\n\t'Columbus',\n\t'Leif',\n\t'Jerold',\n\t'Anwar',\n\t'Gabino',\n\t'Dillion',\n\t'Kelby',\n\t'Denzil',\n\t'Ulisses',\n\t'Sami',\n\t'Jahmir',\n\t'Elimelech',\n\t'Dock',\n\t'Zahir',\n\t'Hardy',\n\t'Florian',\n\t'Jewel',\n\t'Tobin',\n\t'Curley',\n\t'Mahdi',\n\t'Mccoy',\n\t'Jaquavious',\n\t'Justen',\n\t'Lino',\n\t'Teodoro',\n\t'Kazuo',\n\t'Lenard',\n\t'Robb',\n\t'Takashi',\n\t'Maison',\n\t'Merlyn',\n\t'Brecken',\n\t'Ricki',\n\t'Jet',\n\t'Lars',\n\t'Ulices',\n\t'Dereon',\n\t'Fox',\n\t'Ajay',\n\t'Geraldo',\n\t'Maksim',\n\t'Jullian',\n\t'Kalani',\n\t'Andrei',\n\t'Jaidyn',\n\t'Maxie',\n\t'Javen',\n\t'Gail',\n\t'Ely',\n\t'Caroline',\n\t'Amber',\n\t'Crystal',\n\t'Kiara',\n\t'Megan',\n\t'Reilly',\n\t'Eugenio',\n\t'Fisher',\n\t'Langston',\n\t'Gavriel',\n\t'Abhinav',\n\t'Dee',\n\t'Kace',\n\t'Axl',\n\t'Isabel',\n\t'Uziel',\n\t'Sabastian',\n\t'Rylee',\n\t'Eliazar',\n\t'Renato',\n\t'Harland',\n\t'Lavar',\n\t'Stefano',\n\t'Mayra',\n\t'Valentine',\n\t'Bud',\n\t'Hasan',\n\t'Zaden',\n\t'Truett',\n\t'Korbyn',\n\t'Toshio',\n\t'Stockton',\n\t'Edd',\n\t'Trystan',\n\t'Daylan',\n\t'Jayven',\n\t'Dewitt',\n\t'Kraig',\n\t'Wilford',\n\t'Celestino',\n\t'Jacobo',\n\t'Patryk',\n\t'Hailey',\n\t'Nainoa',\n\t'Haskell',\n\t'Sharif',\n\t'Jerad',\n\t'Raynaldo',\n\t'Jacques',\n\t'Jessi',\n\t'Geary',\n\t'Gaige',\n\t'Garnett',\n\t'Jakari',\n\t'Yonatan',\n\t'Eino',\n\t'Phong',\n\t'Jerel',\n\t'Benzion',\n\t'Quinten',\n\t'Amado',\n\t'Blas',\n\t'Kimberly',\n\t'Cuauhtemoc',\n\t'Aayan',\n\t'Catarino',\n\t'Jeromy',\n\t'Kyree',\n\t'Apolonio',\n\t'Boy',\n\t'Antwon',\n\t'Hakim',\n\t'Creed',\n\t'Shiloh',\n\t'Shepherd',\n\t'Garett',\n\t'Oakley',\n\t'Miller',\n\t'Dajuan',\n\t'Mattias',\n\t'Titan',\n\t'Immanuel',\n\t'Lamarcus',\n\t'Devontae',\n\t'Reef',\n\t'Brayson',\n\t'Grey',\n\t'Deante',\n\t'Yariel',\n\t'Makhi',\n\t'Jayse',\n\t'Corbyn',\n\t'Domenico',\n\t'Sedrick',\n\t'Deontae',\n\t'Kou',\n\t'Shant',\n\t'Willy',\n\t'Austyn',\n\t'Shloime',\n\t'Masen',\n\t'Linus',\n\t'Florentino',\n\t'Gionni',\n\t'Boden',\n\t'Torrey',\n\t'Minoru',\n\t'Daulton',\n\t'Kolten',\n\t'Jennings',\n\t'Noble',\n\t'Hersh',\n\t'Kelsey',\n\t'Nicholaus',\n\t'Florencio',\n\t'Nam',\n\t'Juelz',\n\t'Kainalu',\n\t'Destin',\n\t'Damarcus',\n\t'Jacolby',\n\t'Nikita',\n\t'Artis',\n\t'Bilal',\n\t'Kendell',\n\t'Alexsander',\n\t'Parth',\n\t'Esau',\n\t'Glennon',\n\t'Kohen',\n\t'Isacc',\n\t'Aleksander',\n\t'Vinh',\n\t'Trenten',\n\t'Koen',\n\t'Candelario',\n\t'Connie',\n\t'Aram',\n\t'Wolfgang',\n\t'Amit',\n\t'Om',\n\t'Shyheim',\n\t'Raven',\n\t'Kendra',\n\t'Eliel',\n\t'Viet',\n\t'Kenyatta',\n\t'Sky',\n\t'Binyomin',\n\t'Deanthony',\n\t'Lachlan',\n\t'Tory',\n\t'Kenton',\n\t'Tamir',\n\t'Kramer',\n\t'Deshaun',\n\t'Javian',\n\t'Haruo',\n\t'Rupert',\n\t'Jevon',\n\t'Shlome',\n\t'Danilo',\n\t'Vanessa',\n\t'Fernand',\n\t'Daveon',\n\t'Les',\n\t'Marko',\n\t'Delmer',\n\t'Marlyn',\n\t'Winfield',\n\t'Wes',\n\t'Rosevelt',\n\t'Rayshawn',\n\t'Tai',\n\t'Kalvin',\n\t'Jerardo',\n\t'Sarkis',\n\t'Bertrand',\n\t'Kaimana',\n\t'Kaitlyn',\n\t'Summer',\n\t'Veer',\n\t'Waymon',\n\t'Evin',\n\t'Andrey',\n\t'Iain',\n\t'Kimi',\n\t'Foster',\n\t'Servando',\n\t'Mychael',\n\t'Derik',\n\t'Ryon',\n\t'Rowen',\n\t'Mel',\n\t'Ibn',\n\t'Werner',\n\t'Jameel',\n\t'Avrum',\n\t'Nachman',\n\t'Jomar',\n\t'Rudolf',\n\t'Tyrique',\n\t'Rayburn',\n\t'Khalif',\n\t'Rondal',\n\t'Bijan',\n\t'Rohit',\n\t'Jeremie',\n\t'Kain',\n\t'Nicola',\n\t'Bode',\n\t'Brogan',\n\t'Trayvon',\n\t'Turner',\n\t'Dwain',\n\t'Konnor',\n\t'Lev',\n\t'Zayd',\n\t'Finnley',\n\t'Brantlee',\n\t'Deonta',\n\t'Demetrio',\n\t'Ajani',\n\t'Arther',\n\t'Bianca',\n\t'Takeo',\n\t'Harding',\n\t'Jareth',\n\t'Rigo',\n\t'Epifanio',\n\t'Nahum',\n\t'Carleton',\n\t'Cosmo',\n\t'Shigeru',\n\t'Josias',\n\t'Takeshi',\n\t'Jacobi',\n\t'Michal',\n\t'Dorris',\n\t'Treveon',\n\t'Jaxx',\n\t'Aren',\n\t'Tejas',\n\t'Beverly',\n\t'Geoff',\n\t'Maddux',\n\t'Camryn',\n\t'Burt',\n\t'Norwood',\n\t'Sholom',\n\t'Ahron',\n\t'Macario',\n\t'Carol',\n\t'Camdyn',\n\t'Gennaro',\n\t'Leeroy',\n\t'Pinchus',\n\t'Kaito',\n\t'Burnell',\n\t'Frantz',\n\t'Laron',\n\t'Clemente',\n\t'Chasen',\n\t'Neri',\n\t'Jerrell',\n\t'Kashawn',\n\t'Keola',\n\t'Alvan',\n\t'Amar',\n\t'Ubaldo',\n\t'Roque',\n\t'Zalmen',\n\t'Daylen',\n\t'Kadyn',\n\t'Gil',\n\t'Bernice',\n\t'Yosgart',\n\t'Shaan',\n\t'Yahel',\n\t'Elon',\n\t'Levon',\n\t'Kit',\n\t'Brodrick',\n\t'Gaven',\n\t'Kaidyn',\n\t'Ansel',\n\t'Jewell',\n\t'Mikhail',\n\t'Derian',\n\t'Elam',\n\t'Tye',\n\t'Leigh',\n\t'Wayde',\n\t'Rian',\n\t'Artemio',\n\t'Ibrahima',\n\t'Noa',\n\t'Autumn',\n\t'Kylie',\n\t'Pernell',\n\t'Britton',\n\t'Deondre',\n\t'Arlen',\n\t'Aman',\n\t'Kelley',\n\t'Eliud',\n\t'Dijon',\n\t'Imran',\n\t'Eulalio',\n\t'Juvenal',\n\t'Agapito',\n\t'Brant',\n\t'Nima',\n\t'Yisrael',\n\t'Yerik',\n\t'Ewan',\n\t'Lathan',\n\t'Adair',\n\t'Gentry',\n\t'Kyren',\n\t'Lian',\n\t'Tayshawn',\n\t'Alejandra',\n\t'Jeancarlos',\n\t'Keyon',\n\t'Jade',\n\t'Shayan',\n\t'June',\n\t'Christos',\n\t'Adrain',\n\t'Jarom',\n\t'Kathryn',\n\t'Thor',\n\t'Haven',\n\t'Duy',\n\t'Enmanuel',\n\t'Montavious',\n\t'Cortney',\n\t'Teagan',\n\t'Blayne',\n\t'Anselmo',\n\t'Leyton',\n\t'Jonny',\n\t'Braylin',\n\t'Albaro',\n\t'Pascual',\n\t'Gasper',\n\t'Waldo',\n\t'Tyreke',\n\t'Dylon',\n\t'Narciso',\n\t'Ebony',\n\t'Hilton',\n\t'Margaret',\n\t'Brighton',\n\t'Martavious',\n\t'Demetrios',\n\t'Kishan',\n\t'Ansh',\n\t'Treyton',\n\t'Albin',\n\t'Rashon',\n\t'Rony',\n\t'Krystian',\n\t'Amrom',\n\t'Korver',\n\t'Richardo',\n\t'Kayla',\n\t'Katelyn',\n\t'Milford',\n\t'Bishop',\n\t'Ottis',\n\t'Emmet',\n\t'Codey',\n\t'Ayub',\n\t'Isreal',\n\t'Karas',\n\t'Kendarius',\n\t'Isamu',\n\t'Kunta',\n\t'Jermey',\n\t'Arvin',\n\t'Kayleb',\n\t'Sione',\n\t'Taurean',\n\t'Tyron',\n\t'Mihir',\n\t'Rami',\n\t'Vincente',\n\t'Zayan',\n\t'Mahlon',\n\t'Clovis',\n\t'Kirt',\n\t'Dyllan',\n\t'Ramsey',\n\t'Jeramie',\n\t'Nikolaus',\n\t'Edsel',\n\t'Asael',\n\t'Andrik',\n\t'Lisa',\n\t'Sandro',\n\t'Desean',\n\t'Narek',\n\t'Kiran',\n\t'Elzie',\n\t'Jered',\n\t'Arlie',\n\t'Yahya',\n\t'Lizandro',\n\t'Rollin',\n\t'Khiry',\n\t'Yuvraj',\n\t'Jeancarlo',\n\t'Anay',\n\t'Freeman',\n\t'Stevan',\n\t'Keller',\n\t'Ledger',\n\t'Jasiel',\n\t'Jacinto',\n\t'Sherwin',\n\t'Beaux',\n\t'Campbell',\n\t'Sherwood',\n\t'Torrence',\n\t'Daryle',\n\t'Chevy',\n\t'Adiel',\n\t'Patricia',\n\t'Jameer',\n\t'Bilbo',\n\t'Jayvon',\n\t'Early',\n\t'Boruch',\n\t'Jadarius',\n\t'Alpha',\n\t'Amadou',\n\t'Reino',\n\t'Betty',\n\t'Moussa',\n\t'Wolf',\n\t'Jenna',\n\t'Grace',\n\t'Natalie',\n\t'Javonte',\n\t'Crawford',\n\t'Damir',\n\t'Mckinley',\n\t'Elden',\n\t'Jhon',\n\t'Lemuel',\n\t'Colston',\n\t'Donta',\n\t'Pearl',\n\t'Taquan',\n\t'Salman',\n\t'Palmer',\n\t'Muhammed',\n\t'Brennon',\n\t'Cashton',\n\t'Ysidro',\n\t'Salomon',\n\t'Ocean',\n\t'Anirudh',\n\t'Aksel',\n\t'Cal',\n\t'Ishmael',\n\t'Brenda',\n\t'Abran',\n\t'Rome',\n\t'Leighton',\n\t'Canyon',\n\t'Kael',\n\t'Amin',\n\t'Antoni',\n\t'Tiara',\n\t'Heather',\n\t'Christine',\n\t'Brittney',\n\t'Angela',\n\t'Johathan',\n\t'Cipriano',\n\t'Coltin',\n\t'Verne',\n\t'Darrien',\n\t'Eamon',\n\t'Oskar',\n\t'Mikah',\n\t'Matix',\n\t'Kooper',\n\t'Antonino',\n\t'Duwayne',\n\t'Dagoberto',\n\t'Kolt',\n\t'Sanjay',\n\t'Tayden',\n\t'Waverly',\n\t'Abrahan',\n\t'Diamond',\n\t'West',\n\t'Jefferey',\n\t'Shigeo',\n\t'Kabir',\n\t'Jamell',\n\t'Jaedyn',\n\t'Malcom',\n\t'Gadiel',\n\t'Manav',\n\t'Audie',\n\t'Hipolito',\n\t'Theron',\n\t'Codie',\n\t'General',\n\t'Lindy',\n\t'Carver',\n\t'Nat',\n\t'Jacari',\n\t'Khamari',\n\t'Wally',\n\t'Kay',\n\t'Anastacio',\n\t'Jaymes',\n\t'Skip',\n\t'Cheyne',\n\t'Dameon',\n\t'Geronimo',\n\t'Kevyn',\n\t'Toney',\n\t'Arden',\n\t'Dontavius',\n\t'Rasheem',\n\t'Geovani',\n\t'Gaspar',\n\t'Baltazar',\n\t'Bladimir',\n\t'Rashan',\n\t'Rulon',\n\t'Karan',\n\t'Jory',\n\t'Chet',\n\t'Abiel',\n\t'Lazarus',\n\t'Britt',\n\t'Rodriquez',\n\t'Akil',\n\t'Zuriel',\n\t'Rylen',\n\t'Aston',\n\t'Graysen',\n\t'Jaysen',\n\t'Hillel',\n\t'Alford',\n\t'Tyriq',\n\t'Cassidy',\n\t'Rahiem',\n\t'Juanmanuel',\n\t'Demetri',\n\t'Jayton',\n\t'Timoteo',\n\t'Infantof',\n\t'Braedyn',\n\t'Corde',\n\t'Bee',\n\t'Valente',\n\t'Gildardo',\n\t'Feliciano',\n\t'Dalvin',\n\t'Tadashi',\n\t'Claudie',\n\t'Teng',\n\t'Genesis',\n\t'Tayler',\n\t'Joeangel',\n\t'Teruo',\n\t'Tylan',\n\t'Markel',\n\t'Linda',\n\t'Taven',\n\t'Pierson',\n\t'Newton',\n\t'Keandre',\n\t'Jayvion',\n\t'Donavon',\n\t'Encarnacion',\n\t'Melton',\n\t'Ritchie',\n\t'Erika',\n\t'Edgard',\n\t'Christoper',\n\t'Rocio',\n\t'Alvie',\n\t'Josedejesus',\n\t'Dashaun',\n\t'Travion',\n\t'Johny',\n\t'Marcell',\n\t'Monique',\n\t'Caitlin',\n\t'Durwood',\n\t'Gustav',\n\t'Rosalio',\n\t'Farhan',\n\t'Benuel',\n\t'Lashawn',\n\t'Shakeem',\n\t'Ocie',\n\t'Yasir',\n\t'Szymon',\n\t'Aaryan',\n\t'Hansel',\n\t'Slater',\n\t'Samarth',\n\t'Kiyan',\n\t'Storm',\n\t'Ava',\n\t'Yassin',\n\t'Dayquan',\n\t'Sherrill',\n\t'Khari',\n\t'Anas',\n\t'Cheskel',\n\t'Kamryn',\n\t'Zyaire',\n\t'Cristo',\n\t'Christofer',\n\t'Akhil',\n\t'Shreyas',\n\t'Ryley',\n\t'Gibson',\n\t'Haziel',\n\t'Talen',\n\t'Bracken',\n\t'Dallen',\n\t'Rashard',\n\t'Rockwell',\n\t'Colie',\n\t'Del',\n\t'Jihad',\n\t'Simeon',\n\t'Jahmari',\n\t'Ashwin',\n\t'Shraga',\n\t'Cian',\n\t'Alistair',\n\t'Cartier',\n\t'Stoney',\n\t'Verlyn',\n\t'Kavon',\n\t'Konrad',\n\t'Conrado',\n\t'Colon',\n\t'Randel',\n\t'Christ',\n\t'Jeremey',\n\t'Raleigh',\n\t'Lauro',\n\t'Dionicio',\n\t'Kauan',\n\t'Piotr',\n\t'Cleon',\n\t'Malique',\n\t'Rand',\n\t'Fritz',\n\t'Cordaro',\n\t'Pietro',\n\t'Faris',\n\t'Ezio',\n\t'Atharv',\n\t'Karthik',\n\t'Jahsir',\n\t'Saleem',\n\t'Abdoulaye',\n\t'Jiovanni',\n\t'Ezrah',\n\t'Everest',\n\t'Bronx',\n\t'Kruz',\n\t'Viktor',\n\t'Yasiel',\n\t'Thatcher',\n\t'Michelangelo',\n\t'Alaric',\n\t'Oneal',\n\t'Sahib',\n\t'Osiris',\n\t'Teo',\n\t'Joseangel',\n\t'Nate',\n\t'Walton',\n\t'Yousif',\n\t'Ezzard',\n\t'Yamil',\n\t'Angus',\n\t'Jhonny',\n\t'Fabio',\n\t'Darold',\n\t'Junious',\n\t'Atreyu',\n\t'Beck',\n\t'Adriano',\n\t'Amani',\n\t'Trevin',\n\t'Rudra',\n\t'Parsa',\n\t'Breon',\n\t'Umar',\n\t'Taha',\n\t'Cormac',\n\t'Yossi',\n\t'Jaison',\n\t'Saad',\n\t'Shloimy',\n\t'Chesky',\n\t'Ayman',\n\t'Alicia',\n\t'Chadd',\n\t'Broc',\n\t'Cynthia',\n\t'Reynold',\n\t'Ismail',\n\t'Gaylord',\n\t'Saburo',\n\t'Kao',\n\t'Masato',\n\t'Alfonzo',\n\t'Joshue',\n\t'Earvin',\n\t'Patric',\n\t'Robinson',\n\t'Serjio',\n\t'Gavino',\n\t'Stanford',\n\t'Thanh',\n\t'Kamren',\n\t'Vikram',\n\t'Roan',\n\t'Jeronimo',\n\t'Zahid',\n\t'Anjel',\n\t'Jayro',\n\t'Skye',\n\t'Baylor',\n\t'Drayden',\n\t'Pheng',\n\t'Yeng',\n\t'Wilber',\n\t'Meng',\n\t'Arik',\n\t'Jamarius',\n\t'Avigdor',\n\t'Ladarrius',\n\t'Nicklaus',\n\t'Gatlin',\n\t'Boone',\n\t'Jacen',\n\t'Antonia',\n\t'Kyran',\n\t'Quintavius',\n\t'Estil',\n\t'Casimiro',\n\t'Prentice',\n\t'Jodie',\n\t'Rashaad',\n\t'Konstantinos',\n\t'Allison',\n\t'Sophia',\n\t'Makayla',\n\t'Lillian',\n\t'Zymir',\n\t'Canaan',\n\t'Delfino',\n\t'Benton',\n\t'Apolinar',\n\t'Winford',\n\t'Dayne',\n\t'Shivam',\n\t'Fredi',\n\t'Yves',\n\t'Jarrell',\n\t'Ignazio',\n\t'Gamaliel',\n\t'Young',\n\t'Kiefer',\n\t'Juanjose',\n\t'Rehan',\n\t'Kegan',\n\t'Davante',\n\t'Naim',\n\t'Lyman',\n\t'Erskine',\n\t'Toivo',\n\t'Darrian',\n\t'Jad',\n\t'Ender',\n\t'Remi',\n\t'Rishaan',\n\t'Shaurya',\n\t'Viaan',\n\t'Chelsea',\n\t'Molly',\n\t'Sara',\n\t'Leib',\n\t'Azriel',\n\t'Howell',\n\t'Briar',\n\t'Korben',\n\t'Manning',\n\t'Job',\n\t'Brandt',\n\t'Jaedon',\n\t'Ozzy',\n\t'Cordarius',\n\t'Lannie',\n\t'Stanton',\n\t'Radames',\n\t'Blease',\n\t'Zyon',\n\t'Chadrick',\n\t'Watson',\n\t'Kentavious',\n\t'Taurus',\n\t'Adin',\n\t'Jordin',\n\t'Bryden',\n\t'Susumu',\n\t'Tamotsu',\n\t'Yukio',\n\t'Granville',\n\t'Ashby',\n\t'Tristyn',\n\t'Devaughn',\n\t'Deric',\n\t'Cecilio',\n\t'Pershing',\n\t'Noboru',\n\t'Rashaun',\n\t'Masaichi',\n\t'Juventino',\n\t'Norton',\n\t'Serafin',\n\t'Windell',\n\t'Cris',\n\t'Curtiss',\n\t'Boris',\n\t'Elio',\n\t'Williams',\n\t'Trung',\n\t'Torao',\n\t'Karon',\n\t'Canon',\n\t'Tyrik',\n\t'Naythan',\n\t'Michaelangelo',\n\t'Kavin',\n\t'Akshay',\n\t'Broden',\n\t'Quran',\n\t'Rishabh',\n\t'Hilbert',\n\t'Abbas',\n\t'Damoni',\n\t'Dillard',\n\t'Tigran',\n\t'Romel',\n\t'Chip',\n\t'Aeden',\n\t'Deagan',\n\t'Treyson',\n\t'Brannon',\n\t'Tremaine',\n\t'Fay',\n\t'Bryton',\n\t'Lucky',\n\t'Izak',\n\t'Edan',\n\t'Casper',\n\t'Koda',\n\t'Saquan',\n\t'Alcide',\n\t'Quinlan',\n\t'Maddex',\n\t'Hoyle',\n\t'Sandra',\n\t'Joshuah',\n\t'Lindsay',\n\t'Donato',\n\t'Jancarlos',\n\t'Kalin',\n\t'Zigmund',\n\t'Kalen',\n\t'Jalil',\n\t'Bonifacio',\n\t'Gabrielle',\n\t'Destiny',\n\t'Cheyenne',\n\t'Ulyses',\n\t'Rueben',\n\t'Markell',\n\t'Jermel',\n\t'Corwin',\n\t'Justine',\n\t'Idris',\n\t'Pilar',\n\t'Torrance',\n\t'Raeford',\n\t'Olan',\n\t'Octavious',\n\t'Quantavious',\n\t'Modesto',\n\t'Kashton',\n\t'Librado',\n\t'Bonnie',\n\t'Lois',\n\t'Justo',\n\t'Mahmoud',\n\t'Divine',\n\t'Baylen',\n\t'Rakeem',\n\t'Diesel',\n\t'Kyng',\n\t'Daisy',\n\t'Armon',\n\t'Joseantonio',\n\t'Montel',\n\t'Gearld',\n\t'Cloyd',\n\t'Lindell',\n\t'Nile',\n\t'Kashif',\n\t'Johnmichael',\n\t'Aramis',\n\t'Leopold',\n\t'Kamal',\n\t'Jerrad',\n\t'Jadin',\n\t'Mykel',\n\t'Jahlil',\n\t'Cheng',\n\t'Ezriel',\n\t'Aria',\n\t'Dajon',\n\t'Holt',\n\t'Chauncey',\n\t'Karsen',\n\t'Stryker',\n\t'Olaf',\n\t'Reno',\n\t'Colter',\n\t'Schuyler',\n\t'Orvil',\n\t'Auden',\n\t'Eyan',\n\t'Tyce',\n\t'Barbara',\n\t'Zamir',\n\t'Alexi',\n\t'Braelyn',\n\t'Brook',\n\t'Marchello',\n\t'Tyrel',\n\t'Oracio',\n\t'Jalin',\n\t'Verlon',\n\t'Raj',\n\t'Lindsey',\n\t'Andon',\n\t'Devlin',\n\t'Brysen',\n\t'Harman',\n\t'Treyvon',\n\t'Foy',\n\t'Arash',\n\t'Cuong',\n\t'Torin',\n\t'Rommel',\n\t'Lorenza',\n\t'Vishal',\n\t'Kenya',\n\t'Heber',\n\t'Victoriano',\n\t'Shay',\n\t'Tremayne',\n\t'Natanael',\n\t'Zachry',\n\t'Eros',\n\t'Veronica',\n\t'Wayland',\n\t'Rayquan',\n\t'Ana',\n\t'Jaceon',\n\t'Yida',\n\t'Rahmel',\n\t'Alter',\n\t'Lamarion',\n\t'Tavion',\n\t'Javin',\n\t'Lawerence',\n\t'Alessio',\n\t'Kristen',\n\t'Jacqueline',\n\t'Oren',\n\t'Aahil',\n\t'Adyan',\n\t'Augustin',\n\t'Coleton',\n\t'Wilfrid',\n\t'Dezmond',\n\t'Keelan',\n\t'Ike',\n\t'Kanoa',\n\t'Kedrick',\n\t'Chue',\n\t'Danniel',\n\t'Jowell',\n\t'Micahel',\n\t'Yonathan',\n\t'Finnian',\n\t'Garfield',\n\t'Joao',\n\t'Ezell',\n\t'Masaru',\n\t'Yoshito',\n\t'Pasco',\n\t'Yechezkel',\n\t'Shloma',\n\t'Adnan',\n\t'Jaythan',\n\t'Laith',\n\t'Greysen',\n\t'Maddix',\n\t'Alfonse',\n\t'Ernst',\n\t'Hobart',\n\t'Tavin',\n\t'Dajour',\n\t'Cy',\n\t'Estel',\n\t'Osman',\n\t'Vedant',\n\t'Rolf',\n\t'Ova',\n\t'Colson',\n\t'Kelan',\n\t'Oumar',\n\t'Olivier',\n\t'Seichi',\n\t'Tayson',\n\t'Roshan',\n\t'Blane',\n\t'Baxter',\n\t'Vu',\n\t'Tam',\n\t'Pao',\n\t'Wardell',\n\t'Davonta',\n\t'Montrell',\n\t'Ravi',\n\t'Durrell',\n\t'Bastian',\n\t'Aj',\n\t'Ren',\n\t'Loki',\n\t'Kairo',\n\t'Rock',\n\t'Mylo',\n\t'Lavell',\n\t'Bjorn',\n\t'Arvil',\n\t'Reinhold',\n\t'Yesenia',\n\t'Carsen',\n\t'Zephaniah',\n\t'Renzo',\n\t'Willem',\n\t'Unique',\n\t'Elmore',\n\t'Kalob',\n\t'Payne',\n\t'Leeland',\n\t'Naseem',\n\t'Yusef',\n\t'Aboubacar',\n\t'Ioannis',\n\t'Bohdan',\n\t'Javien',\n\t'Jakobi',\n\t'Dempsey',\n\t'Xavian',\n\t'Antavious',\n\t'Jc',\n\t'Dara',\n\t'Obie',\n\t'Celso',\n\t'Tyrin',\n\t'Eian',\n\t'Elgin',\n\t'Jaylyn',\n\t'Brandin',\n\t'Adyn',\n\t'Gabriela',\n\t'Jaidon',\n\t'Zavian',\n\t'Lonzo',\n\t'Elwin',\n\t'Tsutomu',\n\t'Jeanluc',\n\t'Caeden',\n\t'Auston',\n\t'Jasson',\n\t'Omid',\n\t'Gray',\n\t'Vang',\n\t'Nancy',\n\t'Nader',\n\t'Kylen',\n\t'Jarell',\n\t'Prentiss',\n\t'Tahir',\n\t'Ahmir',\n\t'Terell',\n\t'Ludwig',\n\t'Biagio',\n\t'Douglass',\n\t'Nafis',\n\t'Harlem',\n\t'Phineas',\n\t'Lochlan',\n\t'Hermon',\n\t'Wilder',\n\t'Aniello',\n\t'Attilio',\n\t'Shiv',\n\t'Montgomery',\n\t'Bowie',\n\t'Aries',\n\t'Itzae',\n\t'Isa',\n\t'Huxley',\n\t'Elwyn',\n\t'Advik',\n\t'Mahamadou',\n\t'Grayden',\n\t'Landin',\n\t'Decker',\n\t'Dakotah',\n\t'Ella',\n\t'Md',\n\t'Shayaan',\n\t'Isidor',\n\t'Joahan',\n\t'Tillman',\n\t'Jafet',\n\t'Panagiotis',\n\t'Jajuan',\n\t'Cristhian',\n\t'Demetric',\n\t'Zaylen',\n\t'Kacen',\n\t'Sloan',\n\t'Shedrick',\n\t'Denilson',\n\t'Buck',\n\t'Dyland',\n\t'Aris',\n\t'Demonte',\n\t'Telvin',\n\t'Raynard',\n\t'Quantavius',\n\t'Neftali',\n\t'Alma',\n\t'Kadarius',\n\t'Philippe',\n\t'Laurel',\n\t'Vadhir',\n\t'Juandiego',\n\t'Alekzander',\n\t'Napoleon',\n\t'Fabrizio',\n\t'Abisai',\n\t'Yasin',\n\t'Kamran',\n\t'Ole',\n\t'Nicolai',\n\t'Erling',\n\t'Jathan',\n\t'Zen',\n\t'Shiven',\n\t'Keshaun',\n\t'Nikola',\n\t'Loy',\n\t'Usman',\n\t'Concepcion',\n\t'Verlin',\n\t'Dedric',\n\t'Derwin',\n\t'Graig',\n\t'Serge',\n\t'Merritt',\n\t'Kervin',\n\t'Maleek',\n\t'Baldomero',\n\t'Germaine',\n\t'Hampton',\n\t'Shan',\n\t'Alvino',\n\t'Davy',\n\t'Arlington',\n\t'Brandy',\n\t'Timmie',\n\t'Andrae',\n\t'Terrion',\n\t'Quang',\n\t'Jeb',\n\t'Clem',\n\t'Judd',\n\t'Severo',\n\t'Woody',\n\t'Toan',\n\t'Alonza',\n\t'Gardner',\n\t'Delton',\n\t'Vinny',\n\t'Vilas',\n\t'Welton',\n\t'Sabian',\n\t'Dell',\n\t'Randolf',\n\t'Tyren',\n\t'Glenwood',\n\t'Antwain',\n\t'Savon',\n\t'Lesley',\n\t'Rashid',\n\t'Tavian',\n\t'Marvens',\n\t'Aleksandr',\n\t'Vivek',\n\t'Maximino',\n\t'Pavel',\n\t'Renee',\n\t'Charly',\n\t'Donell',\n\t'Shariff',\n\t'Ennis',\n\t'Menashe',\n\t'Ygnacio',\n\t'Hoke',\n\t'Lebron',\n\t'Hillard',\n\t'Xavion',\n\t'Nicolaus',\n\t'Kemari',\n\t'Sammuel',\n\t'Jessiah',\n\t'Virgle',\n\t'Niklas',\n\t'Allante',\n\t'Keenen',\n\t'Albino',\n\t'Rivaldo',\n\t'Jospeh',\n\t'Broadus',\n\t'Trequan',\n\t'Finis',\n\t'Sabas',\n\t'Abdoul',\n\t'Tyronne',\n\t'Tyreik',\n\t'Tyriek',\n\t'Linton',\n\t'Jashawn',\n\t'Ivey',\n\t'Janiel',\n\t'Jayme',\n\t'Lamarr',\n\t'Tiernan',\n\t'Meilech',\n\t'Fitzgerald',\n\t'Jonnathan',\n\t'Tashawn',\n\t'Verl',\n\t'Nichoals',\n\t'Urban',\n\t'Marquan',\n\t'Montez',\n\t'Akshaj',\n\t'Syrus',\n\t'Nehemias',\n\t'Nova',\n\t'Makaio',\n\t'Joselito',\n\t'Armin',\n\t'Monica',\n\t'Natasha',\n\t'Leonce',\n\t'Corby',\n\t'Doris',\n\t'Chancellor',\n\t'Yonah',\n\t'Gaston',\n\t'Alston',\n\t'Tyreese',\n\t'Gaither',\n\t'Donna',\n\t'Graeme',\n\t'Frances',\n\t'Earlie',\n\t'Oral',\n\t'Ruby',\n\t'Krishna',\n\t'Berkley',\n\t'Viraj',\n\t'Jame',\n\t'Judge',\n\t'Denim',\n\t'Guilherme',\n\t'Salim',\n\t'Rondell',\n\t'Marek',\n\t'Zac',\n\t'Seven',\n\t'Stellan',\n\t'Calder',\n\t'Eithan',\n\t'Eliam',\n\t'Gareth',\n\t'Auther',\n\t'Theodis',\n\t'Denzell',\n\t'Octave',\n\t'Destry',\n\t'Bartholomew',\n\t'Rajiv',\n\t'Jaxxon',\n\t'Maxson',\n\t'Adler',\n\t'Tyran',\n\t'Carnell',\n\t'Alben',\n\t'Saif',\n\t'Merwin',\n\t'Binyamin',\n\t'Hayward',\n\t'Arav',\n\t'Berry',\n\t'Daunte',\n\t'Arvo',\n\t'Gerhard',\n\t'Selmer',\n\t'Davie',\n\t'Courtland',\n\t'Athanasios',\n\t'Ori',\n\t'Aadi',\n\t'Kamar',\n\t'Jeremih',\n\t'Jayvian',\n\t'Doyne',\n\t'Macarthur',\n\t'Elza',\n\t'Harden',\n\t'Soham',\n\t'Alder',\n\t'Josemaria',\n\t'Iziah',\n\t'Jin',\n\t'Woodie',\n\t'Alfie',\n\t'Stefon',\n\t'Oswald',\n\t'Talmage',\n\t'Leander',\n\t'Jancarlo',\n\t'Sasha',\n\t'Lorin',\n\t'Roby',\n\t'Juanmiguel',\n\t'Johannes',\n\t'Allie',\n\t'Demetris',\n\t'Sharod',\n\t'Mynor',\n\t'Lex',\n\t'Tito',\n\t'Domonique',\n\t'Seferino',\n\t'Jourdan',\n\t'Marcial',\n\t'Herminio',\n\t'Mikal',\n\t'Alegandro',\n\t'Makana',\n\t'Bb',\n\t'Jarret',\n\t'Jemel',\n\t'Kareen',\n\t'Sierra',\n\t'Michale',\n\t'Jalyn',\n\t'Meredith',\n\t'Gracie',\n\t'Dawud',\n\t'Raylon',\n\t'Avan',\n\t'Dayshawn',\n\t'Livan',\n\t'Kendal',\n\t'Otho',\n\t'Dung',\n\t'Reuven',\n\t'Karmelo',\n\t'Myer',\n\t'Tadao',\n\t'Bentzion',\n\t'Tex',\n\t'Jamin',\n\t'Clois',\n\t'Sadao',\n\t'Tetsuo',\n\t'Izrael',\n\t'Avion',\n\t'Katsumi',\n\t'Gerrit',\n\t'Jamauri',\n\t'Kunal',\n\t'Nickolaus',\n\t'Hoang',\n\t'Bernabe',\n\t'Khristian',\n\t'Arne',\n\t'Javeon',\n\t'Vasilios',\n\t'Noach',\n\t'Ruger',\n\t'Kutter',\n\t'Kyden',\n\t'Marshal',\n\t'Jaelon',\n\t'Raffi',\n\t'Rito',\n\t'Parrish',\n\t'Duvid',\n\t'Jamario',\n\t'Verle',\n\t'Harmon',\n\t'Thai',\n\t'Claire',\n\t'Daiquan',\n\t'Didier',\n\t'Jonnie',\n\t'Arlan',\n\t'Taggart',\n\t'Henri',\n\t'Rogan',\n\t'Woodford',\n\t'Maceo',\n\t'Nyjah',\n\t'Smith',\n\t'Syncere',\n\t'Ballard',\n\t'Kenichi',\n\t'Khaled',\n\t'Dwaine',\n\t'Mathieu',\n\t'Ousmane',\n\t'Emmit',\n\t'Aayush',\n\t'Elyas',\n\t'Taysom',\n\t'Azaiah',\n\t'Axle',\n\t'Ander',\n\t'Azaan',\n\t'Vic',\n\t'Terrel',\n\t'Alen',\n\t'Fabricio',\n\t'Yeshaya',\n\t'Greggory',\n\t'Derrik',\n\t'Esgar',\n\t'Selwyn',\n\t'Binh',\n\t'Tarun',\n\t'Quoc',\n\t'Corry',\n\t'Wylie',\n\t'Jadan',\n\t'Aamir',\n\t'Barron',\n\t'Ciaran',\n\t'Melville',\n\t'Bronislaus',\n\t'Fong',\n\t'Hakop',\n\t'Jashua',\n\t'Stanislaus',\n\t'Keion',\n\t'Timmothy',\n\t'Kenan',\n\t'Banks',\n\t'Ammar',\n\t'Maxfield',\n\t'Tyre',\n\t'Chistian',\n\t'Son',\n\t'Shaka',\n\t'Jahmal',\n\t'Jerell',\n\t'Beckam',\n\t'Zakariya',\n\t'Jayshawn',\n\t'Orvel',\n\t'Yona',\n\t'Derrek',\n\t'Warner',\n\t'Rollie',\n\t'Adelbert',\n\t'Von',\n\t'Kathleen',\n\t'April',\n\t'Nikolaos',\n\t'Alika',\n\t'Barrington',\n\t'Inez',\n\t'Len',\n\t'Arsh',\n\t'Elyjah',\n\t'Eshaan',\n\t'Shayden',\n\t'Jaykob',\n\t'Raziel',\n\t'Makoa',\n\t'Cornelio',\n\t'Rufino',\n\t'Leamon',\n\t'Terrill',\n\t'Hai',\n\t'Jonerik',\n\t'Hamilton',\n\t'Lindbergh',\n\t'Enos',\n\t'Sabino',\n\t'Ara',\n\t'Raudel',\n\t'Jones',\n\t'Cedar',\n\t'Yohan',\n\t'Janet',\n\t'Archibald',\n\t'Boaz',\n\t'Cleotha',\n\t'Dontez',\n\t'Eldridge',\n\t'Abhay',\n\t'Butch',\n\t'Jayvien',\n\t'Rowland',\n\t'Kimo',\n\t'Gurney',\n\t'Virgilio',\n\t'Alfonza',\n\t'Perley',\n\t'Silverio',\n\t'Amilcar',\n\t'Kapena',\n\t'Issak',\n\t'Josemiguel',\n\t'Mikey',\n\t'Camille',\n\t'Gershon',\n\t'Mehki',\n\t'Carsten',\n\t'Lavelle',\n\t'Jamere',\n\t'Natale',\n\t'Elya',\n\t'Antwone',\n\t'Pedrohenrique',\n\t'Kyjuan',\n\t'Shakim',\n\t'Evaristo',\n\t'Lionell',\n\t'Helen',\n\t'Aariz',\n\t'Paige',\n\t'Jaquavius',\n\t'Adolphus',\n\t'Faith',\n\t'Breanna',\n\t'Martavius',\n\t'Armondo',\n\t'Yobani',\n\t'Missael',\n\t'Marcellus',\n\t'Rishab',\n\t'Jaxsen',\n\t'Jahleel',\n\t'Bernell',\n\t'Woodroe',\n\t'Breck',\n\t'Paden',\n\t'Trumaine',\n\t'Rogerio',\n\t'Cleve',\n\t'Ameen',\n\t'Jermain',\n\t'Shakir',\n\t'Berl',\n\t'Conley',\n\t'Vinson',\n\t'Andru',\n\t'Andrue',\n\t'Suraj',\n\t'Ruvim',\n\t'Rodriguez',\n\t'Benji',\n\t'Kylon',\n\t'Matheo',\n\t'Kellin',\n\t'Karsyn',\n\t'Izan',\n\t'Caysen',\n\t'Caison',\n\t'Witten',\n\t'Issa',\n\t'Audrey',\n\t'Sekou',\n\t'Januel',\n\t'Christpher',\n\t'Octaviano',\n\t'Jereme',\n\t'Basilio',\n\t'Kaine',\n\t'Jayvyn',\n\t'Vishnu',\n\t'Umberto',\n\t'Keondre',\n\t'Delroy',\n\t'Herve',\n\t'Rakim',\n\t'Denton',\n\t'Donavin',\n\t'Elder',\n\t'Ger',\n\t'Jazmin',\n\t'Schneider',\n\t'Ethyn',\n\t'Davien',\n\t'Cross',\n\t'Reginal',\n\t'Maksymilian',\n\t'Rahim',\n\t'Ridge',\n\t'Ved',\n\t'Bartosz',\n\t'Kaye',\n\t'Quamir',\n\t'Jasmin',\n\t'Diante',\n\t'Codi',\n\t'Khamani',\n\t'Juliocesar',\n\t'Lydell',\n\t'Dakari',\n\t'Eluzer',\n\t'Daniyal',\n\t'Isidoro',\n\t'Yousuf',\n\t'Rider',\n\t'Winthrop',\n\t'Diogo',\n\t'Kejuan',\n\t'Micaiah',\n\t'Ransom',\n\t'Rolla',\n\t'Leibish',\n\t'Ilyas',\n\t'Arham',\n\t'Adham',\n\t'Abdulrahman',\n\t'Lateef',\n\t'Rahmir',\n\t'Kollin',\n\t'Jamaine',\n\t'Khary',\n\t'De',\n\t'Jabbar',\n\t'Hardin',\n\t'Deryl',\n\t'Yanky',\n\t'Aviel',\n\t'Boubacar',\n\t'Eshan',\n\t'Hanley',\n\t'Hussain',\n\t'Tylon',\n\t'Leldon',\n\t'Raoul',\n\t'Braheem',\n\t'Kaseem',\n\t'Tyshaun',\n\t'Rashaan',\n\t'Kordell',\n\t'Anil',\n\t'Devion',\n\t'Mervyn',\n\t'Shaquil',\n\t'Shaquill',\n\t'Shaul',\n\t'Musab',\n\t'Muad',\n\t'Tomasz',\n\t'Madeline',\n\t'Delante',\n\t'Jahari',\n\t'Leah',\n\t'Tamika',\n\t'Britney',\n\t'Jeriel',\n\t'Yidel',\n\t'Jarad',\n\t'Oneil',\n\t'Fransico',\n\t'Shamir',\n\t'Carmello',\n\t'Abdulahi',\n\t'Shneur',\n\t'Yehudah',\n\t'Brown',\n\t'Sylvan',\n\t'Dontay',\n\t'French',\n\t'Griffen',\n\t'Faisal',\n\t'Dru',\n\t'Demitri',\n\t'Faron',\n\t'Deloy',\n\t'Juston',\n\t'Charleston',\n\t'Farrell',\n\t'Tab',\n\t'Donaciano',\n\t'Candido',\n\t'Joyce',\n\t'Marquel',\n\t'Lamonte',\n\t'Raheen',\n\t'Dashon',\n\t'Hieu',\n\t'Tyus',\n\t'Ciro',\n\t'Naeem',\n\t'Rush',\n\t'Keifer',\n\t'Christion',\n\t'Bladen',\n\t'Kobie',\n\t'Darell',\n\t'Mouhamed',\n\t'Jia',\n\t'Shepard',\n\t'Price',\n\t'Kasyn',\n\t'Truitt',\n\t'Jenson',\n\t'Aizen',\n\t'Markeith',\n\t'Braylan',\n\t'Jonmichael',\n\t'Damond',\n\t'Jaycion',\n\t'Platon',\n\t'Amaury',\n\t'Amaan',\n\t'Daven',\n\t'Tobey',\n\t'Hymen',\n\t'Altariq',\n\t'Jacory',\n\t'Ashtin',\n\t'Domonic',\n\t'Demari',\n\t'Denise',\n\t'Abimael',\n\t'Izaya',\n\t'Jovon',\n\t'Harout',\n\t'Caelan',\n\t'Donal',\n\t'Martel',\n\t'Jaskaran',\n\t'Alante',\n\t'Bradon',\n\t'Deborah',\n\t'Harrell',\n\t'Kaipo',\n\t'Klayton',\n\t'Danthony',\n\t'Justino',\n\t'Kamuela',\n\t'Barrie',\n\t'Argelis',\n\t'Dolores',\n\t'Jahaziel',\n\t'Iram',\n\t'Adian',\n\t'Rance',\n\t'Karsten',\n\t'Christain',\n\t'Jamarian',\n\t'Yee',\n\t'Adriana',\n\t'Jamichael',\n\t'Waino',\n\t'Anh',\n\t'Casmer',\n\t'Ronnell',\n\t'Tong',\n\t'Vicent',\n\t'Jarius',\n\t'Tiburcio',\n\t'Burdette',\n\t'Amadeo',\n\t'Kevan',\n\t'Arlyn',\n\t'Derald',\n\t'Waleed',\n\t'Jabez',\n\t'Khoa',\n\t'Neville',\n\t'Susan',\n\t'Leandre',\n\t'Jorgeluis',\n\t'Angelica',\n\t'Regan',\n\t'Froylan',\n\t'Tevita',\n\t'Sagar',\n\t'Drayton',\n\t'Zade',\n\t'Karriem',\n\t'Townes',\n\t'Ram',\n\t'Jaceyon',\n\t'Keng',\n\t'Isao',\n\t'Unkown',\n\t'Vivian',\n\t'Mamoru',\n\t'Dyllon',\n\t'Hagop',\n\t'Masami',\n\t'Shoichi',\n\t'Landan',\n\t'Cadence',\n\t'Yanixan',\n\t'Xzavion',\n\t'Javan',\n\t'Avian',\n\t'Cadyn',\n\t'Collier',\n\t'Clarance',\n\t'Karen',\n\t'Christy',\n\t'Toriano',\n\t'Diallo',\n\t'Mateus',\n\t'Caio',\n\t'Larue',\n\t'Gilmer',\n\t'Rhyan',\n\t'Elijiah',\n\t'Curren',\n\t'Souleymane',\n\t'Deklan',\n\t'Zakaria',\n\t'Hayk',\n\t'Ric',\n\t'Briley',\n\t'Oval',\n\t'Lovell',\n\t'Daryn',\n\t'Franz',\n\t'Spurgeon',\n\t'Giacomo',\n\t'Orrin',\n\t'Vester',\n\t'Taran',\n\t'Salem',\n\t'Naveen',\n\t'Linkin',\n\t'Kallen',\n\t'Kongmeng',\n\t'Patrice',\n\t'Bibb',\n\t'Arjan',\n\t'Fateh',\n\t'Clive',\n\t'Pharaoh',\n\t'Subhan',\n\t'Rayaan',\n\t'Zebulon',\n\t'Webster',\n\t'Raghav',\n\t'Zakai',\n\t'Ekam',\n\t'Caspian',\n\t'Atom',\n\t'Athen',\n\t'Esdras',\n\t'Vihan',\n\t'Ronav',\n\t'Arrow',\n\t'Izek',\n\t'Gaines',\n\t'Trajan',\n\t'Onofrio',\n\t'Romello',\n\t'Ramone',\n\t'Symir',\n\t'Kanyon',\n\t'Shomari',\n\t'Christo',\n\t'Anthoney',\n\t'Giovonni',\n\t'Gurshan',\n\t'Nathon',\n\t'Zach',\n\t'Jhonatan',\n\t'Shakur',\n\t'Favio',\n\t'Imani',\n\t'Asad',\n\t'Brien',\n\t'Aureliano',\n\t'Fischer',\n\t'Yadier',\n\t'Marino',\n\t'Kimball',\n\t'Saleh',\n\t'Greco',\n\t'Helmer',\n\t'Sai',\n\t'Khai',\n\t'Marius',\n\t'Joy',\n\t'Amauri',\n\t'Tegan',\n\t'Darl',\n\t'Cosimo',\n\t'Armond',\n\t'Yecheskel',\n\t'Natan',\n\t'Shabazz',\n\t'Devine',\n\t'Fabrice',\n\t'Tarek',\n\t'Renaldo',\n\t'Jarrel',\n\t'Gamal',\n\t'Rajesh',\n\t'Lavon',\n\t'Ahnaf',\n\t'Cono',\n\t'Gaspare',\n\t'Chas',\n\t'Jaspreet',\n\t'Tevon',\n\t'Kush',\n\t'Nuchem',\n\t'Jostin',\n\t'Wm',\n\t'Darnel',\n\t'Thurston',\n\t'Maliek',\n\t'Shakeel',\n\t'Coolidge',\n\t'Shaheed',\n\t'Anastasios',\n\t'Wesson',\n\t'Humza',\n\t'Kofi',\n\t'Jamelle',\n\t'Davey',\n\t'Llewellyn',\n\t'Nashawn',\n\t'Odie',\n\t'Jun',\n\t'Jahmere',\n\t'Bienvenido',\n\t'Safwan',\n\t'Mordche',\n\t'Demarius',\n\t'Cillian',\n\t'Alexandros',\n\t'Nochum',\n\t'Shareef',\n\t'Pawel',\n\t'Theadore',\n\t'Dorothy',\n\t'Geno',\n\t'Haris',\n\t'Dayvon',\n\t'Lemarcus',\n\t'Rayvon',\n\t'Laird',\n\t'Zayvion',\n\t'Dennie',\n\t'Dwane',\n\t'Orvis',\n\t'Chalmer',\n\t'Adil',\n\t'Zamari',\n\t'Kodi',\n\t'Braxtyn',\n\t'Fahim',\n\t'Merl',\n\t'Name',\n\t'Aaiden',\n\t'Dyson',\n\t'Westyn',\n\t'Wells',\n\t'Niles',\n\t'Nabil',\n\t'Kaelan',\n\t'Dmitri',\n\t'Demitrius',\n\t'Arlis',\n\t'Reco',\n\t'Glendon',\n\t'Abhishek',\n\t'Jammie',\n\t'Grabiel',\n\t'Jerson',\n\t'Gerhardt',\n\t'Kyrin',\n\t'Kipton',\n\t'Bear',\n\t'Jaciel',\n\t'Dakoda',\n\t'Kaelin',\n\t'Keilan',\n\t'Brendyn',\n\t'Fortino',\n\t'Diondre',\n\t'Arin',\n\t'Cleophus',\n\t'Dimas',\n\t'Caine',\n\t'Jakoby',\n\t'Hagan',\n\t'Layden',\n\t'Calen',\n\t'Nils',\n\t'Cisco',\n\t'Jerrick',\n\t'Gevork',\n\t'Mckenzie',\n\t'Justis',\n\t'Coltyn',\n\t'Brazos',\n\t'Jaycen',\n\t'Kemauri',\n\t'Tyrus',\n\t'Zaidyn',\n\t'Lenin',\n\t'Karlos',\n\t'Shrey',\n\t'Edric',\n\t'Tino',\n\t'Macklin',\n\t'Nevan',\n\t'Lawrance',\n\t'Arno',\n\t'Irby',\n\t'Namir',\n\t'Chayse',\n\t'Ronit',\n\t'Clemens',\n\t'Giorgio',\n\t'Khriz',\n\t'Khang',\n\t'Zidane',\n\t'Nomar',\n\t'Glade',\n\t'Doyce',\n\t'Kaya',\n\t'Surya',\n\t'Jaelen',\n\t'Vernell',\n\t'Issiah',\n\t'Henderson',\n\t'Jessejames',\n\t'Gaylen',\n\t'Aldahir',\n\t'An',\n\t'Asencion',\n\t'Garner',\n\t'Treston',\n\t'Evans',\n\t'Salome',\n\t'Cyle',\n\t'Sang',\n\t'Isaih',\n\t'Kirkland',\n\t'Loyal',\n\t'Jonpaul',\n\t'Cindy',\n\t'Bao',\n\t'Laurie',\n\t'Monico',\n\t'Kiptyn',\n\t'Toribio',\n\t'Cresencio',\n\t'Ruperto',\n\t'Dat',\n\t'Rustin',\n\t'Kendric',\n\t'Miquel',\n\t'Hasani',\n\t'Caron',\n\t'Jarron',\n\t'Enrigue',\n\t'Evelyn',\n\t'Paulino',\n\t'Eligio',\n\t'Melchor',\n\t'Deshon',\n\t'Johndavid',\n\t'Cliffton',\n\t'Ovidio',\n\t'Jacorian',\n\t'Laken',\n\t'Aedyn',\n\t'Ichiro',\n\t'Derion',\n\t'Sharon',\n\t'Yasuo',\n\t'Masayuki',\n\t'Andrez',\n\t'Dustyn',\n\t'Toua',\n\t'Jossue',\n\t'Zakkary',\n\t'Bernardino',\n\t'Deward',\n\t'Joanthan',\n\t'Sandeep',\n\t'Hercules',\n\t'Claudia',\n\t'Sampson',\n\t'Jacobe',\n\t'Hulon',\n\t'Ventura',\n\t'Blade',\n\t'Jayzen',\n\t'Jarren',\n\t'Nakoa',\n\t'Chan',\n\t'Jerrel',\n\t'Isamar',\n\t'Artie',\n\t'Amy',\n\t'Meghan',\n\t'Rockey',\n\t'Sixto',\n\t'Ascencion',\n\t'Damonte',\n\t'Golden',\n\t'Bubba',\n\t'Randle',\n\t'Adelard',\n\t'Rumaldo',\n\t'Nieves',\n\t'Marshaun',\n\t'Kavion',\n\t'Mikolaj',\n\t'Brees',\n\t'Gayland',\n\t'Herb',\n\t'Quenton',\n\t'Flint',\n\t'Lennie',\n\t'Tramaine',\n\t'Nadir',\n\t'Timur',\n\t'Keshav',\n\t'Malek',\n\t'Ozzie',\n\t'Dresden',\n\t'Eliah',\n\t'Benaiah',\n\t'Muhsin',\n\t'Walt',\n\t'Damen',\n\t'Enoc',\n\t'Giancarlos',\n\t'Darsh',\n\t'Maximilliano',\n\t'Yaniel',\n\t'Jeevan',\n\t'Malakhi',\n\t'Viggo',\n\t'Karlo',\n\t'Yosgar',\n\t'Xavior',\n\t'Frazier',\n\t'Orin',\n\t'Payson',\n\t'Tonatiuh',\n\t'Amando',\n\t'Angad',\n\t'Gibran',\n\t'Eben',\n\t'Deaundre',\n\t'Rajon',\n\t'Anand',\n\t'Andree',\n\t'Dany',\n\t'Kayvon',\n\t'Joell',\n\t'Jahsiah',\n\t'Rosaire',\n\t'Kc',\n\t'Page',\n\t'Salvadore',\n\t'Arjen',\n\t'Torey',\n\t'Manraj',\n\t'Lyam',\n\t'Mazen',\n\t'Autry',\n\t'Coopar',\n\t'Ranveer',\n\t'Santhiago',\n\t'Ronen',\n\t'Remmy',\n\t'Kamauri',\n\t'Andra',\n\t'Sohan',\n\t'Cayetano',\n\t'Jarrad',\n\t'Fortunato',\n\t'Magdaleno',\n\t'Dorman',\n\t'Cesario',\n\t'Doroteo',\n\t'Roddy',\n\t'Matilde',\n\t'Lafayette',\n\t'Edelmiro',\n\t'Higinio',\n\t'Yancy',\n\t'Zvi',\n\t'Pascal',\n\t'Timm',\n\t'Dickey',\n\t'Spiros',\n\t'Georgios',\n\t'Jarid',\n\t'Johnatho',\n\t'Nachum',\n\t'Efrem',\n\t'Stafford',\n\t'Pajtim',\n\t'Amelia',\n\t'Jada',\n\t'Lily',\n\t'Lydia',\n\t'Sherrod',\n\t'Stedman',\n\t'Ardis',\n\t'Levy',\n\t'Ulysse',\n\t'Zalman',\n\t'Marquette',\n\t'Gabe',\n\t'Blaize',\n\t'Ashanti',\n\t'Shaheem',\n\t'Hervey',\n\t'Abbott',\n\t'Boleslaw',\n\t'Tyshon',\n\t'Kimani',\n\t'Beecher',\n\t'Diquan',\n\t'Eulogio',\n\t'Arvel',\n\t'Kennth',\n\t'Benigno',\n\t'Luz',\n\t'Dionisio',\n\t'Eustacio',\n\t'Trino',\n\t'Eldred',\n\t'Primitivo',\n\t'Perfecto',\n\t'Delma',\n\t'Cosme',\n\t'Milburn',\n\t'Shameek',\n\t'Quayshaun',\n\t'Evert',\n\t'Green',\n\t'Brylan',\n\t'Crit',\n\t'Haskel',\n\t'Ancil',\n\t'Rayhan',\n\t'Rose',\n\t'Gianfranco',\n\t'Matan',\n\t'Derin',\n\t'Artem',\n\t'Abhiram',\n\t'Yovanni',\n\t'Stevenson',\n\t'Crue',\n\t'Krue',\n\t'Jethro',\n\t'Jakai',\n\t'Mattix',\n\t'Daxon',\n\t'Dallan',\n\t'Murl',\n\t'Harsh',\n\t'Uzziel',\n\t'Kemarion',\n\t'Jashaun',\n\t'Rodman',\n\t'Elie',\n\t'Desi',\n\t'Malikai',\n\t'Angello',\n\t'Amogh',\n\t'Advaith',\n\t'Adryan',\n\t'Nazareth',\n\t'Adolf',\n\t'Bosco',\n\t'Arshan',\n\t'Abdulaziz',\n\t'Theseus',\n\t'Riaan',\n\t'Reza',\n\t'Radley',\n\t'Mars',\n\t'Kirin',\n\t'Kiaan',\n\t'Evander',\n\t'Indiana',\n\t'Hanson',\n\t'Viliami',\n\t'Jaydenn',\n\t'Ilya',\n\t'Draco',\n\t'Riyan',\n\t'Onyx',\n\t'Xian',\n\t'Khristopher',\n\t'Ayrton',\n\t'Aurelius',\n\t'Crosley',\n\t'Obadiah',\n\t'Nihal',\n\t'Rithvik',\n\t'Constantino',\n\t'Jeyden',\n\t'Jaycee',\n\t'Bane',\n\t'Aakash',\n\t'Aniket',\n\t'Mathis',\n\t'Maximos',\n\t'Kohl',\n\t'Fuquan',\n\t'Rahman',\n\t'Aziel',\n\t'Alexys',\n\t'Iverson',\n\t'Marck',\n\t'Criss',\n\t'Arsen',\n\t'Angelgabriel',\n\t'Ronak',\n\t'Selvin',\n\t'Ibraheem',\n\t'Yordi',\n\t'Taylen',\n\t'Javari',\n\t'Jairus',\n\t'Hamzah',\n\t'Sacha',\n\t'Nayan',\n\t'Marciano',\n\t'Aneesh',\n\t'Manfred',\n\t'Adal',\n\t'Bernhard',\n\t'Jeovanny',\n\t'Satvik',\n\t'Nicolo',\n\t'Julious',\n\t'Weyman',\n\t'Roswell',\n\t'Brevin',\n\t'Amedeo',\n\t'Deforest',\n\t'Barnett',\n\t'Braydin',\n\t'Italo',\n\t'Adrienne',\n\t'Anne',\n\t'Jr',\n\t'Krystal',\n\t'Brion',\n\t'Wilberto',\n\t'Detrick',\n\t'Bucky',\n\t'Kristin',\n\t'Christohper',\n\t'Laddie',\n\t'Creighton',\n\t'Gust',\n\t'Darby',\n\t'Shanon',\n\t'Darious',\n\t'Josua',\n\t'Thang',\n\t'Demarkus',\n\t'Chistopher',\n\t'Ehren',\n\t'Marlo',\n\t'Matas',\n\t'Augusto',\n\t'Diamonte',\n\t'Maciej',\n\t'Jamon',\n\t'Marcin',\n\t'Valdemar',\n\t'Nickey',\n\t'Niam',\n\t'Ambrosio',\n\t'Crispin',\n\t'Lukasz',\n\t'Yazan',\n\t'Romell',\n\t'Darryle',\n\t'Renard',\n\t'Ewald',\n\t'Quint',\n\t'Andrzej',\n\t'Vittorio',\n\t'Keonte',\n\t'Lavonte',\n\t'Cordale',\n\t'Darvin',\n\t'Marvell',\n\t'Krzysztof',\n\t'Corben',\n\t'Keylan',\n\t'Haydon',\n\t'Ociel',\n\t'Zeth',\n\t'Ahmari',\n\t'Texas',\n\t'Yutaka',\n\t'Isami',\n\t'Adarius',\n\t'Juaquin',\n\t'Jaydn',\n\t'Jaidan',\n\t'Exavier',\n\t'Steffan',\n\t'Vahe',\n\t'Crystian',\n\t'Edilberto',\n\t'Jaquavion',\n\t'Xavien',\n\t'Delvon',\n\t'Otoniel',\n\t'Demontae',\n\t'Collins',\n\t'Keoki',\n\t'Nolberto',\n\t'Leng',\n\t'Karina',\n\t'Grigor',\n\t'Isrrael',\n\t'Kaoru',\n\t'Hisao',\n\t'Masayoshi',\n\t'Satoru',\n\t'Satoshi',\n\t'Nobuo',\n\t'Michaelanthony',\n\t'Lucero',\n\t'Jocelyn',\n\t'Yovany',\n\t'Joangel',\n\t'Jaelyn',\n\t'Caedmon',\n\t'Granger',\n\t'Heston',\n\t'Rhodes',\n\t'Kanon',\n\t'Judith',\n\t'Montavius',\n\t'Antron',\n\t'Xaiden',\n\t'Burhanuddin',\n\t'Stratton',\n\t'Kadence',\n\t'Jhett',\n\t'Jacion',\n\t'Aiyden',\n\t'Journey',\n\t'Jaziah',\n\t'Thien',\n\t'Travious',\n\t'Carsyn',\n\t'Quindarius',\n\t'Masyn',\n\t'Jalan',\n\t'Jaelin',\n\t'Dorien',\n\t'Aarron',\n\t'Dmarcus',\n\t'Ramin',\n\t'Christan',\n\t'Blain',\n\t'Rosa',\n\t'Christoher',\n\t'Vadim',\n\t'Martha',\n\t'Osher',\n\t'Laakea',\n\t'Chayton',\n\t'Keahi',\n\t'Johnatan',\n\t'Juanantonio',\n\t'Kahiau',\n\t'Sheridan',\n\t'Samual',\n\t'Luisalberto',\n\t'Zacharias',\n\t'Phi',\n\t'Marquice',\n\t'Chong',\n\t'Harpreet',\n\t'Fue',\n\t'Derrion',\n\t'Eber',\n\t'Kevion',\n\t'Beryl',\n\t'Gavan',\n\t'Liliana',\n\t'Fernie',\n\t'Sulo',\n\t'Jayren',\n\t'Lior',\n\t'Ruth',\n\t'Carlie',\n\t'Thierno',\n\t'Davontae',\n\t'Jamier',\n\t'Arye',\n\t'Kiernan',\n\t'Hanad',\n\t'Huston',\n\t'Winson',\n\t'Hobson',\n\t'Yates',\n\t'Kaua',\n\t'Einar',\n\t'Berish',\n\t'Annie',\n\t'Mahir',\n\t'Amr',\n\t'Sabir',\n\t'Ewell',\n\t'Orland',\n\t'Dujuan',\n\t'Harvie',\n\t'Dahmir',\n\t'Hosea',\n\t'Haneef',\n\t'Wei',\n\t'Nello',\n\t'Fishel',\n\t'Amere',\n\t'Rafi',\n\t'Charlton',\n\t'Colden',\n\t'Hughes',\n\t'Laurier',\n\t'Blong',\n\t'Shimshon',\n\t'Jahmel',\n\t'Steward',\n\t'Milbert',\n\t'Buel',\n\t'Hallie',\n\t'Comer',\n\t'Tafari',\n\t'Iver',\n\t'Evangelos',\n\t'Jaquarius',\n\t'Azan',\n\t'Braedan',\n\t'Jadarrius',\n\t'Vernie',\n\t'Andi',\n\t'Darry',\n\t'Jawad',\n\t'Uri',\n\t'Kennard',\n\t'Yishai',\n\t'Kijana',\n\t'Brekken',\n\t'Rajan',\n\t'Stevens',\n\t'Sunil',\n\t'Siddhant',\n\t'Sir',\n\t'Sire',\n\t'Jansen',\n\t'Theodor',\n\t'Kaedyn',\n\t'Tymere',\n\t'Zyair',\n\t'Tron',\n\t'Sanchez',\n\t'Amaru',\n\t'Anastasio',\n\t'Agastya',\n\t'Hawk',\n\t'Honor',\n\t'Sotero',\n\t'Saeed',\n\t'Ziggy',\n\t'Conan',\n\t'Arie',\n\t'Gloria',\n\t'Onesimo',\n\t'Wellington',\n\t'Alexei',\n\t'Tavarus',\n\t'Cayleb',\n\t'Arion',\n\t'Amadeus',\n\t'Bryer',\n\t'Jeter',\n\t'Merced',\n\t'Kaylon',\n\t'Lakendrick',\n\t'Nolen',\n\t'Niccolo',\n\t'Halston',\n\t'Deontre',\n\t'Ash',\n\t'Arush',\n\t'Artur',\n\t'Bidwell',\n\t'Tomie',\n\t'Author',\n\t'Izik',\n\t'Jeriah',\n\t'Edwyn',\n\t'Zhi',\n\t'Gilman',\n\t'Jawan',\n\t'Bryar',\n\t'Giles',\n\t'Talha',\n\t'Gill',\n\t'Abelino',\n\t'Kwasi',\n\t'Stavros',\n\t'Juanita',\n\t'Tri',\n\t'Consuelo',\n\t'Khambrel',\n\t'Peterson',\n\t'Brantly',\n\t'Brently',\n\t'Vitaliy',\n\t'Hashim',\n\t'Rain',\n\t'Quintus',\n\t'Matthieu',\n\t'Kayne',\n\t'Icker',\n\t'Valen',\n\t'Nels',\n\t'Josephus',\n\t'Nasario',\n\t'Romulo',\n\t'Kaisen',\n\t'Sulaiman',\n\t'Selim',\n\t'Mahad',\n\t'Steele',\n\t'Stryder',\n\t'Cristina',\n\t'Thornton',\n\t'Girard',\n\t'Prudencio',\n\t'Ethaniel',\n\t'Laurent',\n\t'Jayvin',\n\t'Jayveon',\n\t'Eladio',\n\t'Ellison',\n\t'Caius',\n\t'Christiano',\n\t'Navid',\n\t'Gerold',\n\t'Sven',\n\t'Advay',\n\t'Cabell',\n\t'Marcio',\n\t'Luisalfredo',\n\t'Ryatt',\n\t'Elijio',\n\t'Pax',\n\t'Neev',\n\t'Mehtab',\n\t'Eluterio',\n\t'Tahmir',\n\t'Davit',\n\t'Eliott',\n\t'Keane',\n\t'Kysen',\n\t'Rafe',\n\t'Legacy',\n\t'Erie',\n\t'Orlin',\n\t'Dawn',\n\t'Calum',\n\t'Adithya',\n\t'Adarsh',\n\t'Ulysee',\n\t'Thurmond',\n\t'Christen',\n\t'Thayne',\n\t'Sriram',\n\t'Yoav',\n\t'Lawton',\n\t'Kemar',\n\t'Duston',\n\t'Jatavious',\n\t'Luisfernando',\n\t'Maxime',\n\t'Rithik',\n\t'Dior',\n\t'Phuong',\n\t'Roni',\n\t'Manu',\n\t'Esteven',\n\t'Hazen',\n\t'Farris',\n\t'Leverne',\n\t'Ryen',\n\t'Tanay',\n\t'Seaborn',\n\t'Cicero',\n\t'Gianmarco',\n\t'Isak',\n\t'Lige',\n\t'Burke',\n\t'Authur',\n\t'Javarius',\n\t'Jeromie',\n\t'Jerred',\n\t'Silvano',\n\t'Keyan',\n\t'Briant',\n\t'Arun',\n\t'Jeremi',\n\t'Decarlos',\n\t'Jeanpierre',\n\t'Haydn',\n\t'Ab',\n\t'Anmol',\n\t'Shaye',\n\t'Nana',\n\t'Mateen',\n\t'Maurisio',\n\t'Nitin',\n\t'Dustan',\n\t'Srikar',\n\t'Arlin',\n\t'Burnett',\n\t'Johnathen',\n\t'Wyman',\n\t'Aleksandar',\n\t'Agustine',\n\t'Ronney',\n\t'Marisol',\n\t'Dmarion',\n\t'Keir',\n\t'Demetrice',\n\t'Jawon',\n\t'Ricci',\n\t'Javontae',\n\t'Armoni',\n\t'Alto',\n\t'Dawid',\n\t'Zakir',\n\t'Jarek',\n\t'Lary',\n\t'Dez',\n\t'Kaydon',\n\t'Henley',\n\t'Adonai',\n\t'Zahmir',\n\t'Youssouf',\n\t'Oisin',\n\t'Deniz',\n\t'Antonios',\n\t'Netanel',\n\t'Shlok',\n\t'Ranger',\n\t'Uzziah',\n\t'Eryk',\n\t'Sid',\n\t'Andersen',\n\t'Daylin',\n\t'Naftoli',\n\t'Lyn',\n\t'Orvin',\n\t'Kesean',\n\t'Hanif',\n\t'Adael',\n\t'Maury',\n\t'Ronn',\n\t'Carlyle',\n\t'Ankur',\n\t'Takumi',\n\t'Piero',\n\t'Jeanpaul',\n\t'Hoa',\n\t'Jacarri',\n\t'Jakhi',\n\t'Zyion',\n\t'Jeovany',\n\t'Eoin',\n\t'Etienne',\n\t'Amrit',\n\t'Dang',\n\t'Juliano',\n\t'Blakely',\n\t'Tauno',\n\t'Edin',\n\t'Dmitriy',\n\t'Lambert',\n\t'Roderic',\n\t'Felice',\n\t'Zaki',\n\t'Debra',\n\t'Teegan',\n\t'Tosh',\n\t'Nicholai',\n\t'Erickson',\n\t'Atharva',\n\t'Aaditya',\n\t'Anuj',\n\t'Diane',\n\t'Sachin',\n\t'Elazar',\n\t'Torian',\n\t'Tan',\n\t'Cristoval',\n\t'Jonathen',\n\t'Kobi',\n\t'Yuki',\n\t'Jacori',\n\t'Eduard',\n\t'Keron',\n\t'Tysean',\n\t'Deshun',\n\t'Hewitt',\n\t'Kaulana',\n\t'Jaydyn',\n\t'Sebastia',\n\t'Shamell',\n\t'Trysten',\n\t'Treshawn',\n\t'Samer',\n\t'Burnice',\n\t'Da',\n\t'Parris',\n\t'Royer',\n\t'Tien',\n\t'Tj',\n\t'Andranik',\n\t'Nino',\n\t'Luisenrique',\n\t'Andrick',\n\t'Graydon',\n\t'Pookela',\n\t'Nevaeh',\n\t'Zoe',\n\t'Hanna',\n\t'Joniel',\n\t'Jamarious',\n\t'Hurley',\n\t'Avante',\n\t'Iban',\n\t'Isaiha',\n\t'Chee',\n\t'Kealii',\n\t'Irbin',\n\t'Maynor',\n\t'Wendy',\n\t'Germain',\n\t'Shamus',\n\t'Zygmunt',\n\t'Garnet',\n\t'Lopaka',\n\t'Damar',\n\t'Ramy',\n\t'Everton',\n\t'Raylen',\n\t'Tryston',\n\t'Kullen',\n\t'Therman',\n\t'Khaliq',\n\t'Alon',\n\t'Arch',\n\t'Tylen',\n\t'Kalan',\n\t'Zacharia',\n\t'Dalen',\n\t'Bedford',\n\t'Lou',\n\t'Tsuneo',\n\t'Kalub',\n\t'Dadrian',\n\t'Jiro',\n\t'Fahad',\n\t'Quashawn',\n\t'Hisashi',\n\t'Fumio',\n\t'Carlito',\n\t'Ewing',\n\t'Zarek',\n\t'Leron',\n\t'Cardell',\n\t'Westen',\n\t'Hogan',\n\t'Payden',\n\t'Chazz',\n\t'Jarryd',\n\t'Sedric',\n\t'Homar',\n\t'Tylar',\n\t'Keone',\n\t'Dasean',\n\t'Lake',\n\t'Joeanthony',\n\t'Haroon',\n\t'Adonys',\n\t'Grayling',\n\t'Braelon',\n\t'Loras',\n\t'Jontavious',\n\t'Nesanel',\n\t'Carlisle',\n\t'Camillo',\n\t'Mandeep',\n\t'Yang',\n\t'Blayden',\n\t'Niall',\n\t'Evelio',\n\t'Zaragoza',\n\t'Shlomie',\n\t'Percell',\n\t'Baylee',\n\t'Garold',\n\t'Eriq',\n\t'Ozell',\n\t'Benjiman',\n\t'Wayman',\n\t'Saturnino',\n\t'Moody',\n\t'Deandra',\n\t'Estanislado',\n\t'Curvin',\n\t'Demonta',\n\t'Crimson',\n\t'Scout',\n\t'Daequan',\n\t'Izael',\n\t'Trine',\n\t'Demontre',\n\t'Rexford',\n\t'Fenix',\n\t'Raheim',\n\t'Rivers',\n\t'Cobe',\n\t'Jeron',\n\t'Yanuel',\n\t'Naftula',\n\t'Dwan',\n\t'Kanai',\n\t'Nicco',\n\t'Kaeson',\n\t'Shadman',\n\t'Cobi',\n\t'Raequan',\n\t'Shae',\n\t'Osama',\n\t'Ernan',\n\t'Dennys',\n\t'Aquil',\n\t'Tierra',\n\t'Sabrina',\n\t'Mia',\n\t'Melanie',\n\t'Marissa',\n\t'Carolyn',\n\t'Arielle',\n\t'Zaine',\n\t'Macen',\n\t'Shahin',\n\t'Casyn',\n\t'Osmin',\n\t'Alphonsus',\n\t'Carrington',\n\t'Chayce',\n\t'Opal',\n\t'Taylon',\n\t'Koy',\n\t'Ebenezer',\n\t'Amarii',\n\t'Keshun',\n\t'Kolin',\n\t'Aspen',\n\t'Cort',\n\t'Zaylon',\n\t'Zaedyn',\n\t'Zaydyn',\n\t'Tuff',\n\t'Holton',\n\t'Ashtyn',\n\t'Lathen',\n\t'Hershell',\n\t'Jerre',\n\t'Tsugio',\n\t'Josealberto',\n\t'Adien',\n\t'Acen',\n\t'Maurilio',\n\t'Ashten',\n\t'Wataru',\n\t'Keontae',\n\t'Donaven',\n\t'Javonta',\n\t'Jacobie',\n\t'Peng',\n\t'Ector',\n\t'Ankit',\n\t'Ann',\n\t'Kasim',\n\t'Parley',\n\t'Mizael',\n\t'Maxon',\n\t'Kylar',\n\t'Jjesus',\n\t'Kaven',\n\t'Curran',\n\t'Edvin',\n\t'Enrrique',\n\t'Donovin',\n\t'Godfrey',\n\t'Xayden',\n\t'Xzavian',\n\t'Carlosmanuel',\n\t'Ladainian',\n\t'Keithan',\n\t'Azrael',\n\t'Jae',\n\t'Marlow',\n\t'Aviv',\n\t'Orson',\n\t'Zamarion',\n\t'Chason',\n\t'Henrry',\n\t'Gevorg',\n\t'Dartagnan',\n\t'Zakee',\n\t'Giovannie',\n\t'Halen',\n\t'Vinay',\n\t'Wilfrido',\n\t'Winton',\n\t'Garet',\n\t'Josafat',\n\t'Manjot',\n\t'Juandaniel',\n\t'Manley',\n\t'Oshea',\n\t'Wali',\n\t'Reymond',\n\t'Harjot',\n\t'Sidharth',\n\t'Amer',\n\t'Camari',\n\t'Quincey',\n\t'Dawan',\n\t'Newell',\n\t'Sigurd',\n\t'Logen',\n\t'Rafiq',\n\t'Delonta',\n\t'Katrina',\n\t'Kristina',\n\t'Octavia',\n\t'Sade',\n\t'Ziyad',\n\t'Tovia',\n\t'Malachai',\n\t'Briana',\n\t'Alison',\n\t'Ashleigh',\n\t'Jerick',\n\t'Benedetto',\n\t'Fiore',\n\t'Mikail',\n\t'Qasim',\n\t'Yochanan',\n\t'Ettore',\n\t'Ferris',\n\t'Aziz',\n\t'Naseer',\n\t'Jabril',\n\t'Brodey',\n\t'Alvah',\n\t'Kalman',\n\t'Ziyon',\n\t'Zakery',\n\t'Sedale',\n\t'Jevin',\n\t'Kalmen',\n\t'Moishy',\n\t'Shai',\n\t'Zakari',\n\t'Bradlee',\n\t'Kenley',\n\t'Pratham',\n\t'Izeah',\n\t'Ilias',\n\t'Emari',\n\t'Race',\n\t'Zacarias',\n\t'Yuri',\n\t'Kleber',\n\t'Kailer',\n\t'Jhovany',\n\t'Iven',\n\t'Issaiah',\n\t'Hosie',\n\t'Dixon',\n\t'Massiah',\n\t'Remo',\n\t'Pinchos',\n\t'Mahki',\n\t'Gunther',\n\t'Irene',\n\t'Jamarie',\n\t'Kaan',\n\t'Jayon',\n\t'Moroni',\n\t'Jkwon',\n\t'Barack',\n\t'Alastair',\n\t'Fares',\n\t'Zackariah',\n\t'Yoshua',\n\t'Tanish',\n\t'Iann',\n\t'Linden',\n\t'Avinash',\n\t'Willam',\n\t'Iman',\n\t'Domanic',\n\t'Lenton',\n\t'Samad',\n\t'Aimar',\n\t'Buddie',\n\t'Jozef',\n\t'Josmar',\n\t'Mercer',\n\t'Collie',\n\t'Nephi',\n\t'Kenai',\n\t'Alquan',\n\t'Cezar',\n\t'Verbon',\n\t'Aeneas',\n\t'Jeremyah',\n\t'Eren',\n\t'Tej',\n\t'Jahad',\n\t'Deep',\n\t'Augusta',\n\t'Yaqub',\n\t'Yahye',\n\t'Vashon',\n\t'Kristoff',\n\t'Penn',\n\t'Loukas',\n\t'Kaydin',\n\t'Kaius',\n\t'Perseus',\n\t'Mykah',\n\t'Joab',\n\t'Cylus',\n\t'Emrys',\n\t'Mikko',\n\t'Jaxsyn',\n\t'Sudais',\n\t'Tiberius',\n\t'Rooney',\n\t'Yuvan',\n\t'Cletis',\n\t'Liev',\n\t'Ester',\n\t'Harlow',\n\t'Shreyan',\n\t'Samar',\n\t'Saharsh',\n\t'Ruhaan',\n\t'Zyler',\n\t'Yuma',\n\t'Dwyane',\n\t'Yanni',\n\t'Dutch',\n\t'Rajveer',\n\t'Tayton',\n\t'Kasir',\n\t'Luster',\n\t'Tage',\n\t'Damarius',\n\t'Elihu',\n\t'Heinz',\n\t'Manolo',\n\t'Makhai',\n\t'Madhav',\n\t'Sohum',\n\t'Omri',\n\t'Egbert',\n\t'Marie',\n\t'Keshon',\n\t'Jahmier',\n\t'Nachmen',\n\t'Mckade',\n\t'Moise',\n\t'Ames',\n\t'Iden',\n\t'Benard',\n\t'Yannick',\n\t'Pasha',\n\t'Sherrick',\n\t'Jordany',\n\t'Fenton',\n\t'Tytan',\n\t'Dashel',\n\t'Daksh',\n\t'Juliani',\n\t'Jhonathan',\n\t'Broxton',\n\t'Essie',\n\t'Devontay',\n\t'Maksym',\n\t'Park',\n\t'Dasani',\n\t'Severiano',\n\t'Kamel',\n\t'Chayanne',\n\t'Jarel',\n\t'Yolanda',\n\t'Tylik',\n\t'Marquell',\n\t'Jamarr',\n\t'Micky',\n\t'Socorro',\n\t'Waymond',\n\t'Michial',\n\t'Yoseph',\n\t'Lumir',\n\t'Placido',\n\t'Asif',\n\t'Needham',\n\t'Claiborne',\n\t'Tennis',\n\t'Burley',\n\t'Raffaele',\n\t'Shavar',\n\t'Atanacio',\n\t'Jahmar',\n\t'Arben',\n\t'Nabeel',\n\t'Cordarryl',\n\t'Danyal',\n\t'Bryston',\n\t'Lemont',\n\t'Elston',\n\t'Kerwin',\n\t'Riccardo',\n\t'Danzel',\n\t'Waldemar',\n\t'Ledarius',\n\t'Omarr',\n\t'Wilho',\n\t'Alger',\n\t'Raymie',\n\t'Kenney',\n\t'Abdallah',\n\t'Aristides',\n\t'Avram',\n\t'Tayvion',\n\t'Urbano',\n\t'Deontay',\n\t'Darcy',\n\t'Robbin',\n\t'Bartlomiej',\n\t'Dann',\n\t'Tyjuan',\n\t'Khaleel',\n\t'Winifred',\n\t'Claron',\n\t'Linford',\n\t'Hilliard',\n\t'Arlon',\n\t'Yong',\n\t'Malvin',\n\t'Zymere',\n\t'Newborn',\n\t'Eleuterio',\n\t'Glyn',\n\t'Koltyn',\n\t'Serapio',\n\t'Pius',\n\t'Ines',\n\t'Harrold',\n\t'Caitlyn',\n\t'Rajeev',\n\t'Constantinos',\n\t'Abid',\n\t'Calvert',\n\t'Parnell',\n\t'Aubry',\n\t'Damone',\n\t'Akim',\n\t'Adem',\n\t'Othel',\n\t'Joaopedro',\n\t'Tomer',\n\t'Brentlee',\n\t'Melquan',\n\t'Elpidio',\n\t'Jenny',\n\t'Alejos',\n\t'Romie',\n\t'Ardell',\n\t'Doctor',\n\t'Virginia',\n\t'Makenzie',\n\t'Maggie',\n\t'Tywan',\n\t'Elisaul',\n\t'Luby',\n\t'Teofilo',\n\t'Jermell',\n\t'Gumesindo',\n\t'Harless',\n\t'Croix',\n\t'Obinna',\n\t'Traveon',\n\t'Coley',\n\t'Tu',\n\t'Brylon',\n\t'Carlin',\n\t'Daneil',\n\t'Garen',\n\t'Ronell',\n\t'Chesley',\n\t'Tyrece',\n\t'Arville',\n\t'Eamonn',\n\t'Kayshawn',\n\t'Wilkie',\n\t'Zacchaeus',\n\t'Rapheal',\n\t'Cordaryl',\n\t'Quan',\n\t'Nhan',\n\t'Vann',\n\t'Franciscojavier',\n\t'Kinte',\n\t'Rui',\n\t'Chuong',\n\t'Chao',\n\t'Chai',\n\t'Linh',\n\t'Cirilo',\n\t'Ky',\n\t'Gwyn',\n\t'Hearl',\n\t'Tray',\n\t'Carmon',\n\t'Phuc',\n\t'Neiman',\n\t'Ladon',\n\t'Moua',\n\t'Eulises',\n\t'Jonte',\n\t'Yusuke',\n\t'Vinnie',\n\t'Seanpatrick',\n\t'Pearson',\n\t'Daemon',\n\t'Reyn',\n\t'Daekwon',\n\t'Garron',\n\t'Sequan',\n\t'Zavien',\n\t'Geovanie',\n\t'Jessee',\n\t'Richmond',\n\t'Osualdo',\n\t'Artin',\n\t'Devone',\n\t'Makoto',\n\t'Hitoshi',\n\t'Shinichi',\n\t'Samari',\n\t'Saxon',\n\t'Glennis',\n\t'Fadi',\n\t'Bronislaw',\n\t'Estuardo',\n\t'Shaheen',\n\t'Saman',\n\t'Lue',\n\t'Djuan',\n\t'Cord',\n\t'Linville',\n\t'Landis',\n\t'Cameren',\n\t'Herson',\n\t'Ellie',\n\t'Seanmichael',\n\t'Froilan',\n\t'Delon',\n\t'Jestin',\n\t'Mattew',\n\t'Toni',\n\t'Kelii',\n\t'Maribel',\n\t'Jadrian',\n\t'Traylon',\n\t'Kaiea',\n\t'Kaeo',\n\t'Taft',\n\t'Dameion',\n\t'Darryn',\n\t'Dondi',\n\t'Clell',\n\t'Corbett',\n\t'Lyndell',\n\t'Avenir',\n\t'Seldon',\n\t'Jakwon',\n\t'Jacque',\n\t'Deane',\n\t'Cheikh',\n\t'Carmel',\n\t'Kieth',\n\t'Tahmid',\n\t'Lillard',\n\t'Tasheem',\n\t'Jens',\n\t'Christobal',\n\t'Delos',\n\t'Lashon',\n\t'Jaimie',\n\t'Kary',\n\t'Kendarious',\n\t'Johnell',\n\t'Harlen',\n\t'Terron',\n\t'Corliss',\n\t'Liston',\n\t'Seng',\n\t'Phu',\n\t'Rasean',\n\t'Sung',\n\t'San',\n\t'Babak',\n\t'Adel',\n\t'Gillermo',\n\t'Avon',\n\t'Harlon',\n\t'Allyn',\n\t'Clary',\n\t'Orry',\n\t'Nazario',\n\t'Jamail',\n\t'Daeshawn',\n\t'Tal',\n\t'Moustafa',\n\t'Tarell',\n\t'Jahquan',\n\t'Jian',\n\t'Lazar',\n\t'Adama',\n\t'Benyamin',\n\t'Tayvon',\n\t'Lamel',\n\t'Davonne',\n\t'Tayquan',\n\t'Jusitn',\n\t'Shjon',\n\t'Leotis',\n\t'Kasheem',\n\t'Ilir',\n\t'Ravon',\n\t'Parish',\n\t'Ehan',\n\t'Daishawn',\n\t'Islam',\n\t'Pinches',\n\t'Ovadia',\n\t'Mechel',\n\t'Berlin',\n\t'Deryk',\n\t'Tymel',\n\t'Vijay',\n\t'Dyquan',\n\t'Agron',\n\t'Tarrell',\n\t'Itamar',\n\t'Mordcha',\n\t'Chrisotpher',\n\t'Alban',\n\t'Stephane',\n\t'Tanvir',\n\t'Demetriu',\n\t'Yan',\n\t'Asim',\n\t'Ahsan',\n\t'Mackenzi',\n\t'Kristofe',\n\t'Kenrick',\n\t'Cuahutemoc',\n\t'Tavis',\n\t'Audric',\n\t'Deaven',\n\t'Nicanor',\n\t'Mick',\n\t'Geoffery',\n\t'Timofey',\n\t'Dolphus',\n\t'Franciso',\n\t'Gorje',\n\t'Jobany',\n\t'Abdelrahman',\n\t'Clenton',\n\t'Yohance',\n\t'Milad',\n\t'Juanluis',\n\t'Luismario',\n\t'Marvyn',\n\t'Rushil',\n\t'Tenoch',\n\t'Trentin',\n\t'Fardeen',\n\t'Shashank',\n\t'Yuta',\n\t'Ritvik',\n\t'Akili',\n\t'Aleksei',\n\t'Gaurav',\n\t'Iran',\n\t'Caillou',\n\t'Borach',\n\t'Keisuke',\n\t'Kaushik',\n\t'Hari',\n\t'Izac',\n\t'Josejulian',\n\t'Juanangel',\n\t'Kasra',\n\t'Anthonie',\n\t'Daivd',\n\t'Dain',\n\t'Toren',\n\t'Sesar',\n\t'Eldor',\n\t'Pieter',\n\t'Yu',\n\t'Cloyce',\n\t'Dusten',\n\t'Aquiles',\n\t'Aslan',\n\t'Sevastian',\n\t'Siddarth',\n\t'Tysen',\n\t'Johncarlo',\n\t'Idan',\n\t'Daymian',\n\t'Domanick',\n\t'Arnie',\n\t'Bartley',\n\t'Newman',\n\t'Akram',\n\t'Abdulla',\n\t'Lew',\n\t'Geremy',\n\t'Jehu',\n\t'Josejuan',\n\t'Jailen',\n\t'Etai',\n\t'Fabien',\n\t'Victormanuel',\n\t'Ossie',\n\t'Egan',\n\t'Eldin',\n\t'Shamari',\n\t'Nussen',\n\t'Arda',\n\t'Sina',\n\t'Tytus',\n\t'Pranay',\n\t'Dylen',\n\t'Juandavid',\n\t'Kalil',\n\t'Kushal',\n\t'Hazael',\n\t'Lecil',\n\t'Belton',\n\t'Aleczander',\n\t'Terance',\n\t'Faizan',\n\t'Naithan',\n\t'Koji',\n\t'Akshat',\n\t'Andruw',\n\t'Bram',\n\t'Dieter',\n\t'Saahil',\n\t'Saulo',\n\t'Arnel',\n\t'Demarea',\n\t'Farhad',\n\t'Joeseph',\n\t'Alondra',\n\t'Belal',\n\t'Antoniodejesus',\n\t'Anival',\n\t'Choua',\n\t'Cha',\n\t'Bryn',\n\t'Xiong',\n\t'Aristeo',\n\t'Mehmet',\n\t'Moustapha',\n\t'Jandel',\n\t'Asante',\n\t'Yunus',\n\t'Schneur',\n\t'Steffen',\n\t'Leovardo',\n\t'Kacey',\n\t'Payam',\n\t'Salbador',\n\t'Nicholes',\n\t'Neema',\n\t'Clarke',\n\t'Marqus',\n\t'Araceli',\n\t'Jerman',\n\t'Marioalberto',\n\t'Joseguadalupe',\n\t'Emigdio',\n\t'Krishan',\n\t'Jessey',\n\t'Arcadio',\n\t'Zong',\n\t'Yoni',\n\t'Tirso',\n\t'Thompson',\n\t'Damarea',\n\t'Everado',\n\t'Edy',\n\t'Edder',\n\t'Nikki',\n\t'Clemmie',\n\t'Willian',\n\t'Marquese',\n\t'Perris',\n\t'Miriam',\n\t'Shelly',\n\t'Bulmaro',\n\t'Jasdeep',\n\t'Irvine',\n\t'Hue',\n\t'Gurpreet',\n\t'Donaldo',\n\t'Jonthan',\n\t'Geroge',\n\t'Francois',\n\t'Duc',\n\t'Jerico',\n\t'Avedis',\n\t'Chang',\n\t'Damario',\n\t'Kenta',\n\t'Nikkolas',\n\t'Khoi',\n\t'Garren',\n\t'Norma',\n\t'My',\n\t'Lam',\n\t'Sahir',\n\t'Yer',\n\t'Jaskarn',\n\t'Jeric',\n\t'Maximillion',\n\t'Elson',\n\t'Marin',\n\t'Loc',\n\t'Lemar',\n\t'Kristofor',\n\t'Nai',\n\t'Takoda',\n\t'Tung',\n\t'Thong',\n\t'Rayshaun',\n\t'Derreck',\n\t'Regino',\n\t'Nadav',\n\t'Luismiguel',\n\t'Josede',\n\t'Hao',\n\t'Rayce',\n\t'Zacary',\n\t'Nareg',\n\t'Khyree',\n\t'Chi',\n\t'Joanna',\n\t'Sevag',\n\t'Garin',\n\t'Juluis',\n\t'Petros',\n\t'Berel',\n\t'Abubakar',\n\t'Jorel',\n\t'Kazi',\n\t'Jaiceon',\n\t'Haider',\n\t'Feynman',\n\t'Muhammadali',\n\t'Jassiel',\n\t'Morrison',\n\t'Nakai',\n\t'Oden',\n\t'Odysseus',\n\t'Quest',\n\t'Kaidan',\n\t'Kilian',\n\t'Kirill',\n\t'Thorin',\n\t'Tru',\n\t'Xzander',\n\t'Taniela',\n\t'Roen',\n\t'Sho',\n\t'Aarin',\n\t'Gracen',\n\t'Gurfateh',\n\t'Gurman',\n\t'Hiro',\n\t'Edrick',\n\t'Esaias',\n\t'Johncarlos',\n\t'Sidi',\n\t'Cataldo',\n\t'Noor',\n\t'Philbert',\n\t'Eyad',\n\t'Arber',\n\t'Abrar',\n\t'Ladislaus',\n\t'Serafino',\n\t'Mannie',\n\t'Daevon',\n\t'Haseeb',\n\t'Yale',\n\t'Spiro',\n\t'Emre',\n\t'Daryan',\n\t'Camrin',\n\t'Kavi',\n\t'Doran',\n\t'Vaibhav',\n\t'Rayne',\n\t'Derric',\n\t'Orbie',\n\t'Reily',\n\t'Gio',\n\t'Gurnoor',\n\t'Jaasiel',\n\t'Naman',\n\t'Josaiah',\n\t'Josiyah',\n\t'Kasper',\n\t'Filippo',\n\t'Sigfredo',\n\t'Joesiah',\n\t'Rei',\n\t'Nahom',\n\t'Ojas',\n\t'Vladislav',\n\t'Hilary',\n\t'Rinaldo',\n\t'Even',\n\t'Gautam',\n\t'Cornel',\n\t'Julyan',\n\t'Inaki',\n\t'Iseah',\n\t'Itai',\n\t'Laurance',\n\t'Garey',\n\t'Lawerance',\n\t'Quindon',\n\t'Levin',\n\t'Leviticus',\n\t'Link',\n\t'Glenford',\n\t'Avyan',\n\t'Dmitry',\n\t'Eiden',\n\t'Advait',\n\t'Ahaan',\n\t'Arhaan',\n\t'Kassius',\n\t'Hendrick',\n\t'Jaiveer',\n\t'Nirvaan',\n\t'Reeve',\n\t'Torsten',\n\t'True',\n\t'Iwao',\n\t'Jahvon',\n\t'Paxson',\n\t'Kali',\n\t'Kwesi',\n\t'Yaron',\n\t'Ami',\n\t'Dashiel',\n\t'Meliton',\n\t'Sylus',\n\t'Mika',\n\t'Jireh',\n\t'Selig',\n\t'Adi',\n\t'Brenner',\n\t'Breyden',\n\t'Mitsuru',\n\t'Farley',\n\t'Montrel',\n\t'Kyland',\n\t'Jadakiss',\n\t'Tadarius',\n\t'Brooke',\n\t'Alexandria',\n\t'Alexa',\n\t'Abby',\n\t'Hayley',\n\t'Mallory',\n\t'Madelyn',\n\t'Layla',\n\t'Kirsten',\n\t'Quayshawn',\n\t'Deadrick',\n\t'Hobby',\n\t'Eunice',\n\t'Macon',\n\t'Ysabel',\n\t'Secundino',\n\t'Hulen',\n\t'Estle',\n\t'Tolbert',\n\t'Baker',\n\t'Tilford',\n\t'Shyheem',\n\t'Orbin',\n\t'Ruel',\n\t'Hurshel',\n\t'Jailyn',\n\t'Dequincy',\n\t'Jamall',\n\t'Draper',\n\t'Kenric',\n\t'Aime',\n\t'Cam',\n\t'Connell',\n\t'Treylon',\n\t'Bethel',\n\t'Rommie',\n\t'Alphonza',\n\t'Gussie',\n\t'Elridge',\n\t'Hillery',\n\t'Ruffin',\n\t'Farrel',\n\t'Wendall',\n\t'Gerome',\n\t'Ferrell',\n\t'Uvaldo',\n\t'Marshon',\n\t'Jawaun',\n\t'Trevell',\n\t'Tyvon',\n\t'Telesforo',\n\t'Ellery',\n\t'Cordae',\n\t'Loran',\n\t'Travell',\n\t'Lamari',\n\t'Errick',\n\t'Antwoine',\n\t'Starsky',\n\t'Chirag',\n\t'Donzell',\n\t'Tierre',\n\t'Ketan',\n\t'Crespin',\n\t'Orris',\n\t'Bawi',\n\t'Wanda',\n\t'Canuto',\n\t'Aniceto',\n\t'Braxten',\n\t'Audry',\n\t'Bartolo',\n\t'Brigido',\n\t'Garvin',\n\t'Vergil',\n\t'Olegario',\n\t'Thelma',\n\t'Crecencio',\n\t'Eleno',\n\t'Wright',\n\t'Burtis',\n\t'Dicky',\n\t'Avelino',\n\t'Norval',\n\t'Cirildo',\n\t'Darwyn',\n\t'Delwin',\n\t'Henery',\n\t'Beauford',\n\t'Little',\n\t'Ameir',\n\t'Arland',\n\t'Verner',\n\t'Taron',\n\t'Undra',\n\t'Khasir',\n\t'Kymir',\n\t'Aleem',\n\t'Ordean',\n\t'Carmino',\n\t'Lucus',\n\t'Jodeci',\n\t'Linn',\n\t'Sinclair',\n\t'Delorean',\n\t'Chalmers',\n\t'Kentavius',\n\t'Jarious',\n\t'Lajuan',\n\t'Narada',\n\t'Hussien',\n\t'Alonte',\n\t'Damarco',\n\t'Benjamen',\n\t'Randon',\n\t'Jabree',\n\t'Lawyer',\n\t'Wanya',\n\t'Samie',\n\t'Sim',\n\t'Washington',\n\t'Isom',\n\t'Keyton',\n\t'Quin',\n\t'Mahamed',\n\t'Liban',\n\t'Ramir',\n\t'Samaj',\n\t'Kipp',\n\t'Prentis',\n\t'Jibril',\n\t'Kyaire',\n\t'Buell',\n\t'Nasim',\n\t'Adell',\n\t'Mohamedamin',\n\t'Abdiaziz',\n\t'Harun',\n\t'Amire',\n\t'Eligah',\n\t'Parks',\n\t'Colonel',\n\t'Joaovictor',\n\t'Vinicius',\n\t'Mcdonald',\n\t'Manly',\n\t'Phares',\n\t'Geza',\n\t'Kemp',\n\t'Alphonzo',\n\t'Loring',\n\t'Haig',\n\t'Joaquim',\n\t'Craven',\n\t'Bynum',\n\t'Parke',\n\t'Ignatz',\n\t'Hebert',\n\t'Berton',\n\t'Ayomide',\n\t'Kidus',\n\t'Ayven',\n\t'Aziah',\n\t'Banner',\n\t'Barret',\n\t'Blayze',\n\t'Braddock',\n\t'Javoris',\n\t'Cortland',\n\t'Antavius',\n\t'Amaziah',\n\t'Santonio',\n\t'Slate',\n\t'Sylis',\n\t'Thierry',\n\t'Joanthony',\n\t'Rhylan',\n\t'Pryce',\n\t'Riggin',\n\t'Dequavious',\n\t'Bakari',\n\t'Marquavius',\n\t'Artavious',\n\t'Desmon',\n\t'Rajohn',\n\t'Faheem',\n\t'Kage',\n\t'Arkeem',\n\t'Jaquon',\n\t'Dontavis',\n\t'Quentavious',\n\t'Braysen',\n\t'Bricen',\n\t'Traevon',\n\t'Caidyn',\n\t'Collyn',\n\t'Joah',\n\t'Patton',\n\t'Coleson',\n\t'Eythan',\n\t'Hadley',\n\t'Jaaziel',\n\t'Johntavious',\n\t'Quadarius',\n\t'Rafeal',\n\t'Karam',\n\t'Krishiv',\n\t'Majd',\n\t'Yeray',\n\t'Whitten',\n\t'Johnluke',\n\t'Demani',\n\t'Easten',\n\t'Ediel',\n\t'Tellis',\n\t'Delvecchio',\n\t'Aleks',\n\t'Rylie',\n\t'Osmel',\n\t'Lelan',\n\t'Tamarion',\n\t'Cayman',\n\t'Hajime',\n\t'Akio',\n\t'Takao',\n\t'Seiji',\n\t'Ah',\n\t'Mitsugi',\n\t'Koichi',\n\t'Ikenna',\n\t'Tyquavious',\n\t'Brannen',\n\t'Slayde',\n\t'Sultan',\n\t'Cage',\n\t'Jillian',\n\t'Kara',\n\t'Simone',\n\t'Theresa',\n\t'Julie',\n\t'Alisha',\n\t'Candace',\n\t'Candice',\n\t'Jazmine',\n\t'Domani',\n\t'Tiana',\n\t'Jeovanni',\n\t'Khaleb',\n\t'Copeland',\n\t'Dathan',\n\t'Deleon',\n\t'Jakori',\n\t'Jayke',\n\t'Kadon',\n\t'Camdon',\n\t'Shandon',\n\t'Mylan',\n\t'Jaxin',\n\t'Beverley',\n\t'Dallon',\n\t'Jakeem',\n\t'Tallon',\n\t'Vraj',\n\t'Welford',\n\t'Jadarian',\n\t'Yancarlos',\n\t'Omkar',\n\t'Jamaree',\n\t'Alix',\n\t'Trevyn',\n\t'Orestes',\n\t'Trevis',\n\t'Refoel',\n\t'Roddrick',\n\t'Tarvis',\n\t'Tamarick',\n\t'Denard',\n\t'Kerem',\n\t'Treyden',\n\t'Stephano',\n\t'Shubh',\n\t'Carston',\n\t'Utah',\n\t'Treven',\n\t'Reshard',\n\t'Yerachmiel',\n\t'Osmany',\n\t'Vansh',\n\t'Samaad',\n\t'Shakil',\n\t'Saford',\n\t'Doyal',\n\t'Cai',\n\t'Alexey',\n\t'Cruze',\n\t'Masiah',\n\t'Kitai',\n\t'Fedor',\n\t'Algie',\n\t'Worley',\n\t'Jakhari',\n\t'Brison',\n\t'Lanier',\n\t'Eston',\n\t'Qadir',\n\t'Lonzie',\n\t'Rayfield',\n\t'Chirstopher',\n\t'Eron',\n\t'Deontray',\n\t'Zoltan',\n\t'Christon',\n\t'Byford',\n\t'Mikeal',\n\t'Talyn',\n\t'Stormy',\n\t'Laramie',\n\t'Chrisopher',\n\t'Breckin',\n\t'Kennon',\n\t'Json',\n\t'Deiondre',\n\t'Heron',\n\t'Mykal',\n\t'Kalai',\n\t'Ervey',\n\t'Brayam',\n\t'Alakai',\n\t'Maika',\n\t'Kelson',\n\t'Trevaughn',\n\t'Aundre',\n\t'Eathan',\n\t'Keylon',\n\t'Kolbe',\n\t'Sebastion',\n\t'Kalib',\n\t'Jermy',\n\t'Jarrid',\n\t'Gumaro',\n\t'Maliq',\n\t'Armstead',\n\t'Stephone',\n\t'Oris',\n\t'Hassel',\n\t'Antwine',\n\t'Lorraine',\n\t'Budd',\n\t'Irfan',\n\t'Kamrin',\n\t'Araf',\n\t'Affan',\n\t'Leiby',\n\t'Sruly',\n\t'Peretz',\n\t'Mildred',\n\t'Louise',\n\t'Ryken',\n\t'Ryler',\n\t'Tayven',\n\t'Taysen',\n\t'Brexton',\n\t'Zayaan',\n\t'Oronde',\n\t'Firman',\n\t'Collen',\n\t'Letcher',\n\t'Clearence',\n\t'Braydan',\n\t'Yasser',\n\t'Jeferson',\n\t'Yahsir',\n\t'Cavan',\n\t'Ivor',\n\t'Hasker',\n\t'Kodie',\n\t'Lori',\n\t'Jaysean',\n\t'Cadin',\n\t'Breydon',\n\t'Amaree',\n\t'Nyeem',\n\t'Menno',\n\t'Orlo',\n\t'Nassir',\n\t'Sylar',\n\t'Drevon',\n\t'Burech',\n\t'Lenox',\n\t'Shloima',\n\t'Daris',\n\t'Diontae',\n\t'Aidin',\n\t'Brydon',\n\t'Jasean',\n\t'Nasier',\n\t'Johney',\n\t'Gabrial',\n\t'Fate',\n\t'Colyn',\n\t'Kaleem',\n\t'Capers',\n\t'Rembert',\n\t'Jquan',\n\t'Legrand',\n\t'Kirubel',\n\t'Gaberiel',\n\t'Thaddaeus',\n\t'Rece',\n\t'Dymir',\n\t'Tylil',\n\t'Remigio',\n\t'Ahad',\n\t'Melquiades',\n\t'Ethel',\n\t'Euel',\n\t'Harvy',\n\t'Margarita',\n\t'Jakeb',\n\t'Kagan',\n\t'Trinton',\n\t'Faiz',\n\t'Iliyan',\n\t'Emeterio',\n\t'Ferman',\n\t'Keeton',\n\t'Decorian',\n\t'Hadyn',\n\t'Rashaud',\n\t'Davontay',\n\t'Brallan',\n\t'Benancio',\n\t'Espiridion',\n\t'Seledonio',\n\t'Estefan',\n\t'Chanse',\n\t'Dade',\n\t'Sisto',\n\t'Herbie',\n\t'Janson',\n\t'Eusevio',\n\t'Loye',\n\t'Leocadio',\n\t'Kaelon',\n\t'Trevian',\n\t'Christien',\n\t'Chrystian',\n\t'Daegan',\n\t'Rosbel',\n\t'Romero',\n\t'Kylin',\n\t'Treyvion',\n\t'Ezekial',\n\t'Jaice',\n\t'Jantzen',\n\t'Aadyn',\n\t'Tennyson',\n\t'Kaedan',\n\t'Kaiser',\n\t'Kanin',\n\t'Jerron',\n\t'Jonaven',\n\t'Elija',\n\t'Amon',\n\t'Valton',\n\t'Derwood',\n\t'Atilano',\n\t'Jovanie',\n\t'Kaemon',\n\t'Oluwatobi',\n\t'Atlee',\n\t'Tadd',\n\t'Tammy',\n\t'Lem',\n\t'Hilmar',\n\t'Foch',\n\t'Clenard',\n\t'Jd',\n\t'Jiovanny',\n\t'Ladarion',\n\t'Lleyton',\n\t'Adrik',\n\t'Webb',\n\t'Toddrick',\n\t'Jerrett',\n\t'Omero',\n\t'Wendel',\n\t'Teresa',\n\t'Cass',\n\t'Kedric',\n\t'Heraclio',\n\t'Rainier',\n\t'Lakota',\n\t'Sanjuan',\n\t'Daymon',\n\t'Rodd',\n\t'Yancey',\n\t'Trampas',\n\t'Viviano',\n\t'Heith',\n\t'Bj',\n\t'Trevante',\n\t'Ildefonso',\n\t'Jaeger',\n\t'Jamarkus',\n\t'Remijio',\n\t'Desiderio',\n\t'Ausencio',\n\t'Alejo',\n\t'Keldrick',\n\t'Sigifredo',\n\t'Treavor',\n\t'Britain',\n\t'Macedonio',\n\t'Kourtney',\n\t'Gerrick',\n\t'Jousha',\n\t'Klinton',\n\t'Montreal',\n\t'Catlin',\n\t'Danner',\n\t'Eliberto',\n\t'Eliodoro',\n\t'Lonnell',\n\t'Michiel',\n\t'Hermilo',\n\t'Jackey',\n\t'Todrick',\n\t'Irineo',\n\t'Wenceslao',\n\t'Duaine',\n\t'Cleto',\n\t'Gaylan',\n\t'Derrel',\n\t'Nabor',\n\t'Huck',\n\t'Hoy',\n\t'Antwaun',\n\t'Hoyte',\n\t'Flournoy',\n\t'Mayford',\n\t'Harlie',\n\t'Hansford',\n\t'Cutler',\n\t'Amerigo',\n\t'Teague',\n\t'Griffith',\n\t'Emidio',\n\t'Kenna',\n\t'Cru',\n\t'Arnett',\n\t'Gay',\n\t'Dencil',\n\t'Carman',\n\t'Doy',\n\t'Trevan',\n\t'Jahziel',\n\t'Rodricus',\n\t'Copper',\n\t'Dael',\n\t'Aydon',\n\t'Ricco',\n\t'Judas',\n\t'Kessler',\n\t'Romelo',\n\t'Slayton',\n\t'Marico',\n\t'Leevi',\n\t'Xadrian',\n\t'Jceon',\n\t'Kross',\n\t'Chancey',\n\t'Bayne',\n\t'Brylen',\n\t'Eidan',\n\t'Olvin',\n\t'Pearce',\n\t'Zak',\n\t'Jaiven',\n\t'Dani',\n\t'Bairon',\n\t'Cordarious',\n\t'Jaxyn',\n\t'Rylin',\n\t'Avin',\n\t'Bransen',\n\t'Eastyn',\n\t'Eyden',\n\t'Brenham',\n\t'Chaston',\n\t'Horatio',\n\t'Dakarai',\n\t'Jencarlo',\n\t'Jevan',\n\t'Jhayden',\n\t'Tracen',\n\t'Peggy',\n\t'Wynn',\n\t'Bennet',\n\t'Milas',\n\t'Ronal',\n\t'Kadrian',\n\t'Jhase',\n\t'Callahan',\n\t'Hays',\n\t'Braidyn',\n\t'Ezana',\n\t'Chidubem',\n\t'Virat',\n\t'Maxemiliano',\n\t'Ozias',\n\t'Pace',\n\t'Mordecai',\n\t'Tabor',\n\t'Phillipe',\n\t'Maritza',\n\t'Ricahrd',\n\t'Jeanette',\n\t'Sundeep',\n\t'Tyric',\n\t'Mina',\n\t'Nasser',\n\t'Nhia',\n\t'Giuliano',\n\t'Farid',\n\t'Ryo',\n\t'Delmont',\n\t'Klaus',\n\t'Traquan',\n\t'Dawayne',\n\t'Broward',\n\t'Drequan',\n\t'Cagney',\n\t'Shellie',\n\t'Torre',\n\t'Deepak',\n\t'Janmichael',\n\t'Lan',\n\t'Quentavius',\n\t'Quantez',\n\t'Markevious',\n\t'Melbourne',\n\t'Melford',\n\t'Xue',\n\t'Samnang',\n\t'Jarquez',\n\t'Montrez',\n\t'Dao',\n\t'Luvern',\n\t'Vue',\n\t'Jenaro',\n\t'Wacey',\n\t'Lorena',\n\t'Ly',\n\t'Casmere',\n\t'Marsean',\n\t'Marinus',\n\t'Shiro',\n\t'Shizuo',\n\t'Knowledge',\n\t'Baudelio',\n\t'Cher',\n\t'Christiaan',\n\t'Adriane',\n\t'Wilgus',\n\t'Gustabo',\n\t'Barnet',\n\t'Xeng',\n\t'Priscilla',\n\t'Sou',\n\t'Sumeet',\n\t'Vartan',\n\t'Herschell',\n\t'Montell',\n\t'Illya',\n\t'Flem',\n\t'Marwan',\n\t'Johnrobert',\n\t'Boleslaus',\n\t'Christie',\n\t'Ericberto',\n\t'Esmeralda',\n\t'Cecilia',\n\t'Purvis',\n\t'Benjie',\n\t'Sutter',\n\t'Sufyan',\n\t'Viraaj',\n\t'Sathvik',\n\t'Quitman',\n\t'Liborio',\n\t'Humbert',\n\t'Zakariah',\n\t'Yichen',\n\t'Seward',\n\t'Alf',\n\t'Sebastiano',\n\t'Guiseppe',\n\t'Stanislaw',\n\t'Tyrice',\n\t'Lenell',\n\t'Kewon',\n\t'Bahe',\n\t'Recardo',\n\t'Paola',\n\t'Ronson',\n\t'Naveed',\n\t'Karla',\n\t'Lamberto',\n\t'Leoncio',\n\t'Sandor',\n\t'Diamante',\n\t'Woodson',\n\t'Hargis',\n\t'Kelcey',\n\t'Daquon',\n\t'Estell',\n\t'Christapher',\n\t'Jalal',\n\t'Tania',\n\t'Tramell',\n\t'Victoralfonso',\n\t'Kento',\n\t'Kiet',\n\t'Krystopher',\n\t'Shaine',\n\t'Bejamin',\n\t'Virgel',\n\t'Toxie',\n\t'Goebel',\n\t'Tyon',\n\t'Norvin',\n\t'Savalas',\n\t'Othmar',\n\t'Jakaiden',\n\t'Reis',\n\t'Pratik',\n\t'Ashish',\n\t'Hutson',\n\t'Karmello',\n\t'Dacari',\n\t'Katsuji',\n\t'Sadamu',\n\t'Masatoshi',\n\t'Kiyoto',\n\t'Carols',\n\t'Waylen',\n\t'Shain',\n\t'Alexandru',\n\t'Jomo',\n\t'Kalei',\n\t'Shyam',\n\t'Zyan',\n\t'Tamar',\n\t'Prem',\n\t'Jamiyl',\n\t'Remmel',\n\t'Harlin',\n\t'Novak',\n\t'Fynn',\n\t'Gonsalo',\n\t'Maliki',\n\t'Loghan',\n\t'Cauy',\n\t'Kassem',\n\t'Jitsuo',\n\t'Itsuo',\n\t'Atsushi',\n\t'Sunao',\n\t'Sueo',\n\t'Hiromu',\n\t'Toshiyuki',\n\t'Osamu',\n\t'Mena',\n\t'Aldin',\n\t'Leticia',\n\t'Darick',\n\t'Kawan',\n\t'Rajahn',\n\t'Asmar',\n\t'Emarion',\n\t'Hilmer',\n\t'Dameyune',\n\t'Rondarius',\n\t'Brinson',\n\t'Trason',\n\t'Chung',\n\t'Eran',\n\t'Khanh',\n\t'Javarious',\n\t'Makel',\n\t'Zyquan',\n\t'Quintarius',\n\t'Duran',\n\t'Veasna',\n\t'Thao',\n\t'Gracin',\n\t'Eberardo',\n\t'Ming',\n\t'Lusiano',\n\t'Kaveh',\n\t'Truong',\n\t'Ying',\n\t'Kentravious',\n\t'Dillen',\n\t'Jamonte',\n\t'Arthuro',\n\t'Camarion',\n\t'Avett',\n\t'Mehdi',\n\t'Nishant',\n\t'Bartek',\n\t'Aarnav',\n\t'Jeffory',\n\t'Deen',\n\t'Dayshaun',\n\t'Kemonte',\n\t'Petar',\n\t'Yug',\n\t'Donat',\n\t'Sylvio',\n\t'Magdiel',\n\t'Christianjames',\n\t'Lessie',\n\t'Sander',\n\t'Rajvir',\n\t'Nahuel',\n\t'Pearlie',\n\t'Aaren',\n\t'Dimitry',\n\t'Aravind',\n\t'Aristotle',\n\t'Jeury',\n\t'Naji',\n\t'Tysheem',\n\t'Alcee',\n\t'Gustaf',\n\t'Jamarrion',\n\t'Zollie',\n\t'Malick',\n\t'Navin',\n\t'Juwon',\n\t'Usama',\n\t'Walid',\n\t'Quamel',\n\t'Sadiq',\n\t'Tamarcus',\n\t'Merwyn',\n\t'Ferdie',\n\t'Kalif',\n\t'Latif',\n\t'Davidson',\n\t'Aahan',\n\t'Shahid',\n\t'Min',\n\t'Kieren',\n\t'Oz',\n\t'Oryan',\n\t'Madox',\n\t'Kota',\n\t'Gurshaan',\n\t'Gagik',\n\t'Finnigan',\n\t'Finlay',\n\t'Exodus',\n\t'Kaileb',\n\t'Jullien',\n\t'Jiovani',\n\t'Maryland',\n\t'Weaver',\n\t'Williard',\n\t'Keyondre',\n\t'Kailen',\n\t'Kanan',\n\t'Luisantonio',\n\t'Izack',\n\t'Daniela',\n\t'Colm',\n\t'Raja',\n\t'Keeshawn',\n\t'Adhemar',\n\t'Hillary',\n\t'Abdimalik',\n\t'Roark',\n\t'Kolston',\n\t'Cheryl',\n\t'Richardson',\n\t'Arif',\n\t'Jahkeem',\n\t'Kumar',\n\t'Raywood',\n\t'Jaiquan',\n\t'Earley',\n\t'Buren',\n\t'Rossie',\n\t'Jakayden',\n\t'Ruffus',\n\t'Zaquan',\n\t'Tamer',\n\t'Devonne',\n\t'Ikeem',\n\t'Dhruva',\n\t'Georges',\n\t'Kwabena',\n\t'Yeriel',\n\t'Glover',\n\t'Sanders',\n\t'Adonay',\n\t'Gillis',\n\t'Yomar',\n\t'Ediberto',\n\t'Antwane',\n\t'Isahi',\n\t'Haidyn',\n\t'Elizandro',\n\t'Markjoseph',\n\t'Jezreel',\n\t'Isayah',\n\t'Zedekiah',\n\t'Nikolay',\n\t'Jenner',\n\t'Uriyah',\n\t'Taiga',\n\t'Daniele',\n\t'Zacharie',\n\t'Joanne',\n\t'Manpreet',\n\t'Mohan',\n\t'Eliu',\n\t'Faraz',\n\t'Robah',\n\t'Isham',\n\t'Omarian',\n\t'Gagandeep',\n\t'Zeno',\n\t'Waddell',\n\t'Plato',\n\t'Quavon',\n\t'Talib',\n\t'Bascom',\n\t'Mayo',\n\t'Tequan',\n\t'Teron',\n\t'Anatole',\n\t'Tajh',\n\t'Algenis',\n\t'Liridon',\n\t'Kervens',\n\t'Yunior',\n\t'Kenson',\n\t'Wesly',\n\t'Antwann',\n\t'Zelig',\n\t'Demetrious',\n\t'Johnbenedict',\n\t'Josecarlos',\n\t'Kona',\n\t'Cj',\n\t'Atul',\n\t'Asaf',\n\t'Aleck',\n\t'Anthoni',\n\t'Anuar',\n\t'Gedalya',\n\t'Rafay',\n\t'Eyal',\n\t'Andry',\n\t'Natanel',\n\t'Nissim',\n\t'Jahdiel',\n\t'Jophy',\n\t'Rehaan',\n\t'Jhovani',\n\t'Maxximus',\n\t'Nain',\n\t'Yomtov',\n\t'Sheikh',\n\t'Demir',\n\t'Markos',\n\t'Mouhamadou',\n\t'Ousman',\n\t'Izreal',\n\t'Hadrian',\n\t'Aldrin',\n\t'Conlan',\n\t'Degan',\n\t'Toi',\n\t'Finneas',\n\t'Latroy',\n\t'Adon',\n\t'Antuan',\n\t'Elchonon',\n\t'Uzair',\n\t'Mohid',\n\t'Nazier',\n\t'Eliab',\n\t'Roc',\n\t'Pavan',\n\t'Yovanny',\n\t'Sinjin',\n\t'Tavoris',\n\t'Asiel',\n\t'Brayant',\n\t'Alexsandro',\n\t'Adrean',\n\t'Darel',\n\t'Olajuwon',\n\t'Corderro',\n\t'Tynan',\n\t'Xaiver',\n\t'Travaris',\n\t'Yonis',\n\t'Gerren',\n\t'Demon',\n\t'Furnell',\n\t'Juel',\n\t'Harish',\n\t'Raiyan',\n\t'Elia',\n\t'Elijha',\n\t'Gautham',\n\t'Arvind',\n\t'Audel',\n\t'Almer',\n\t'Djimon',\n\t'Jahi',\n\t'Gehrig',\n\t'Avant',\n\t'Arnell',\n\t'Eliaz',\n\t'Kaedon',\n\t'Jaedin',\n\t'Voshon',\n\t'Malachy',\n\t'Gilad',\n\t'Gabriele',\n\t'Riku',\n\t'Cameran',\n\t'Yoskar',\n\t'Jahfari',\n\t'Alexiz',\n\t'Javante',\n\t'Gregor',\n\t'Izel',\n\t'Donnovan',\n\t'Nikos',\n\t'Kodey',\n\t'Eytan',\n\t'Betzalel',\n\t'Dimitrius',\n\t'Chananya',\n\t'Graylin',\n\t'Samvel',\n\t'Yi',\n\t'Wassillie',\n\t'Kelechi',\n\t'Erroll',\n\t'Ardit',\n\t'Rahn',\n\t'Delaine',\n\t'Jule',\n\t'Idus',\n\t'Dessie',\n\t'Juda',\n\t'Levester',\n\t'Kiante',\n\t'Earnie',\n\t'Ihor',\n\t'Kapono',\n\t'Akoni',\n\t'Koamalu',\n\t'Sholem',\n\t'Howie',\n\t'Dariusz',\n\t'Hall',\n\t'Kekai',\n\t'Onix',\n\t'Ozie',\n\t'Liem',\n\t'Collis',\n\t'Lemon',\n\t'Hinton',\n\t'Guss',\n\t'Ronda',\n\t'Siddhartha',\n\t'Owyn',\n\t'Rye',\n\t'Riot',\n\t'Vander',\n\t'Selena',\n\t'Barnie',\n\t'Lewie',\n\t'Jaxiel',\n\t'Kaizen',\n\t'Haloa',\n\t'Dermot',\n\t'Misha',\n\t'Mister',\n\t'Nicholis',\n\t'Kevork',\n\t'Kia',\n\t'Houa',\n\t'Huriel',\n\t'Jesu',\n\t'Dionta',\n\t'Silvino',\n\t'Ivery',\n\t'Iokepa',\n\t'Geo',\n\t'Dex',\n\t'Izaan',\n\t'Jasraj',\n\t'Jakson',\n\t'Niel',\n\t'Avelardo',\n\t'Arjay',\n\t'Aran',\n\t'Alanzo',\n\t'Aidric',\n\t'Lomax',\n\t'Rawn',\n\t'Simmie',\n\t'Tonnie',\n\t'Yuto',\n\t'Mataio',\n\t'Nicodemus',\n\t'Maximilien',\n\t'Raider',\n\t'Ridley',\n\t'Orest',\n\t'Ramzi',\n\t'Kaikea',\n\t'Kamahao',\n\t'Kyrillos',\n\t'Mace',\n\t'Lyrik',\n\t'Lyon',\n\t'Lux',\n\t'Ashkan',\n\t'Jurgen',\n\t'Khachik',\n\t'Maher',\n\t'Jaccob',\n\t'Jagdeep',\n\t'Wash',\n\t'Simpson',\n\t'Macy',\n\t'Haylee',\n\t'Hope',\n\t'Katie',\n\t'Thurmon',\n\t'Savanna',\n\t'Zoey',\n\t'Atiba',\n\t'Dylann',\n\t'Kaylen',\n\t'Helio',\n\t'Geovannie',\n\t'Praneel',\n\t'Kamau',\n\t'Rhamel',\n\t'Knoah',\n\t'Harm',\n\t'Nyle',\n\t'Maveric',\n\t'Neithan',\n\t'Niklaus',\n\t'Lejon',\n\t'Wai',\n\t'Indigo',\n\t'Sayed',\n\t'Abdias',\n\t'Daniil',\n\t'Rashod',\n\t'Wren',\n\t'Chico',\n\t'Jamarri',\n\t'Leiland',\n\t'Ranvir',\n\t'Mavrick',\n\t'Matai',\n\t'Deveon',\n\t'Teyon',\n\t'Ramell',\n\t'Haik',\n\t'Dupree',\n\t'Emon',\n\t'Jermal',\n\t'Bayley',\n\t'Marshell',\n\t'Blouncie',\n\t'Larson',\n\t'Lorenz',\n\t'Jhovanny',\n\t'Jeffie',\n\t'Portia',\n\t'Adron',\n\t'Calogero',\n\t'Mathews',\n\t'Aundra',\n\t'Aariv',\n\t'Keniel',\n\t'Jameis',\n\t'Konstantin',\n\t'Khayden',\n\t'Manford',\n\t'Polo',\n\t'Chanel',\n\t'Brittani',\n\t'Kazuki',\n\t'Kaelen',\n\t'Alice',\n\t'Maya',\n\t'Madeleine',\n\t'Kiana',\n\t'Latasha',\n\t'Felicia',\n\t'Gabriella',\n\t'Bolivar',\n\t'Eileen',\n\t'Alister',\n\t'Aidenn',\n\t'Nina',\n\t'Ellington',\n\t'Alecsander',\n\t'Ja',\n\t'Jarmaine',\n\t'Kyriakos',\n\t'Apostolos',\n\t'Leshawn',\n\t'Shondell',\n\t'Matvey',\n\t'Savino',\n\t'Zakariye',\n\t'Dozier',\n\t'Holland',\n\t'Haruto',\n\t'Hendrik',\n\t'Allah',\n\t'Johnanthony',\n\t'Eliyah',\n\t'Champ',\n\t'Dastan',\n\t'Caliph',\n\t'Manish',\n\t'Agostino',\n\t'Kaio',\n\t'Avyaan',\n\t'Gerasimos',\n\t'Refujio',\n\t'Munir',\n\t'Abdurrahman',\n\t'Selso',\n\t'Epimenio',\n\t'Suhayb',\n\t'Jock',\n\t'Larwence',\n\t'Saadiq',\n\t'Lilburn',\n\t'Selestino',\n\t'Randi',\n\t'Nysir',\n\t'Harlyn',\n\t'Basir',\n\t'Kathy',\n\t'Teddie',\n\t'Luqman',\n\t'Tyhir',\n\t'Mubarak',\n\t'Ridwan',\n\t'Filemon',\n\t'Bergen',\n\t'Danney',\n\t'Eual',\n\t'Melburn',\n\t'Esiquio',\n\t'Cree',\n\t'Dorwin',\n\t'Naasir',\n\t'Ysmael',\n\t'Nirav',\n\t'Chuckie',\n\t'Lashaun',\n\t'Darris',\n\t'Blase',\n\t'Kiley',\n\t'Demarko',\n\t'Taiwan',\n\t'Lamon',\n\t'Corrie',\n\t'Feras',\n\t'Excell',\n\t'Cornelious',\n\t'Martinez',\n\t'Marvel',\n\t'Climmie',\n\t'Martrell',\n\t'Valley',\n\t'Lonie',\n\t'Jovante',\n\t'Lavante',\n\t'Lugene',\n\t'Cordarro',\n\t'Lacey',\n\t'Derrius',\n\t'Tedd',\n\t'Levell',\n\t'Linas',\n\t'Taras',\n\t'Toma',\n\t'Klint',\n\t'Gualberto',\n\t'Feliberto',\n\t'Tarrance',\n\t'Theran',\n\t'Lakeith',\n\t'Mearl',\n\t'Karry',\n\t'Denarius',\n\t'Dontarius',\n\t'Nikia',\n\t'Rakesh',\n\t'Not',\n\t'Darek',\n\t'Gery',\n\t'Ontario',\n\t'Jimi',\n\t'Shamarion',\n\t'Kedarius',\n\t'Jermarcus',\n\t'Amarie',\n\t'Kordae',\n\t'Montie',\n\t'Haleem',\n\t'Inocencio',\n\t'Brockton',\n\t'Yoshiaki',\n\t'Ponciano',\n\t'Silvester',\n\t'Derron',\n\t'Davaughn',\n\t'Urie',\n\t'Juanito',\n\t'Corky',\n\t'Pasqual',\n\t'Marilyn',\n\t'Morley',\n\t'Ayoub',\n\t'Eliasar',\n\t'Mickel',\n\t'Skylor',\n\t'Kewan',\n\t'Teon',\n\t'Rafal',\n\t'Devanta',\n\t'Rosco',\n\t'Tywon',\n\t'Evon',\n\t'Cleven',\n\t'Hardie',\n\t'Tori',\n\t'Trayvond',\n\t'Maaz',\n\t'Masashi',\n\t'Neno',\n\t'Kahari',\n\t'Terri',\n\t'Toru',\n\t'Jalynn',\n\t'Avonte',\n\t'Satchel',\n\t'Tanya',\n\t'Kalab',\n\t'Avetis',\n\t'Miko',\n\t'Kodiak',\n\t'Lang',\n\t'Leondre',\n\t'Purnell',\n\t'Harutyun',\n\t'Gorman',\n\t'Vong',\n\t'Shervin',\n\t'Soloman',\n\t'Sue',\n\t'Amandeep',\n\t'Amritpal',\n\t'Leonides',\n\t'Melecio',\n\t'Mikhael',\n\t'Estaban',\n\t'Arius',\n\t'Calix',\n\t'Gurtaj',\n\t'Dilraj',\n\t'Dillinger',\n\t'Aidden',\n\t'Shivansh',\n\t'Shravan',\n\t'Saud',\n\t'Yarel',\n\t'Riker',\n\t'Yareth',\n\t'Zeppelin',\n\t'Ladarious',\n\t'Lucan',\n\t'Terren',\n\t'Tustin',\n\t'Nicolaas',\n\t'Rakan',\n\t'Johnjoseph',\n\t'Hovanes',\n\t'Navjot',\n\t'Henrique',\n\t'Marsalis',\n\t'Karanveer',\n\t'Jeffren',\n\t'Khairi',\n\t'Haruki',\n\t'Jadden',\n\t'Iliya',\n\t'Hansen',\n\t'Srihan',\n\t'Sartaj',\n\t'Rishik',\n\t'Rishan',\n\t'Octavian',\n\t'Ranbir',\n\t'Padraic',\n\t'Tanush',\n\t'Tlaloc',\n\t'Cadarius',\n\t'Yared',\n\t'Vahan',\n\t'Lakai',\n\t'Fionn',\n\t'Eziah',\n\t'Emillio',\n\t'Hakob',\n\t'Gryphon',\n\t'Harsha',\n\t'Hiroto',\n\t'Nivaan',\n\t'Radin',\n\t'Nicasio',\n\t'Mael',\n\t'Lysander',\n\t'Rees',\n\t'Roemello',\n\t'Bretton',\n\t'Christoph',\n\t'Eliceo',\n\t'Armany',\n\t'Axell',\n\t'Bogdan',\n\t'Luan',\n\t'Aldon',\n\t'Aeson',\n\t'Adhvik',\n\t'Jese',\n\t'Blanca',\n\t'Crisanto',\n\t'Dietrich',\n\t'Tarin',\n\t'Yama',\n\t'Yia',\n\t'Omeed',\n\t'Arbie',\n\t'Shayn',\n\t'Ranferi',\n\t'Ricard',\n\t'Farmer',\n\t'Goble',\n\t'Herald',\n\t'Hager',\n\t'Elva',\n\t'Carlis',\n\t'Evertt',\n\t'Ledford',\n\t'Dequarius',\n\t'Hughie',\n\t'Burgess',\n\t'Kourosh',\n\t'Jaun',\n\t'Nicko',\n\t'Victorhugo',\n\t'Roverto',\n\t'Shadi',\n\t'Sopheak',\n\t'Acie',\n\t'Demar',\n\t'Carolina',\n\t'Vinal',\n\t'Earland',\n\t'Sergey',\n\t'Dayon',\n\t'Kwamaine',\n\t'Kerney',\n\t'Ola',\n\t'Welby',\n\t'Kyon',\n\t'Tyion',\n\t'Kiyon',\n\t'Neng',\n\t'Raquel',\n\t'Nadeem',\n\t'Terran',\n\t'Tin',\n\t'Rudi',\n\t'Murad',\n\t'Murrell',\n\t'Lenville',\n\t'Rondall',\n\t'Han',\n\t'Hovhannes',\n\t'Karapet',\n\t'Hamed',\n\t'Alasdair',\n\t'Agam',\n\t'Areg',\n\t'Ariston',\n\t'Askari',\n\t'Ayansh',\n\t'Byran',\n\t'Dolan',\n\t'Devonn',\n\t'Edith',\n\t'Christoffer',\n\t'Alaa',\n\t'Ashraf',\n\t'Rondle',\n\t'Tavarius',\n\t'Michaeljames',\n\t'Nichols',\n\t'Sonia',\n\t'Ryanchristopher',\n\t'Garo',\n\t'Hien',\n\t'Corin',\n\t'Dillin',\n\t'Jerid',\n\t'Jesusalberto',\n\t'Zeferino',\n\t'Gobel',\n\t'Tykeem',\n\t'Miking',\n\t'Juno',\n\t'Jiraiya',\n\t'Kailash',\n\t'Madix',\n\t'Lucciano',\n\t'Llewyn',\n\t'Leone',\n\t'Knight',\n\t'Dorse',\n\t'Oak',\n\t'Irie',\n\t'Brodi',\n\t'Hridhaan',\n\t'Coda',\n\t'Dekker',\n\t'Evren',\n\t'Eisen',\n\t'Eddison',\n\t'Donatello',\n\t'Happy',\n\t'Devron',\n\t'Suleiman',\n\t'Siddhanth',\n\t'Zorawar',\n\t'Zadkiel',\n\t'Waylan',\n\t'Valor',\n\t'Triton',\n\t'Govanni',\n\t'Angelus',\n\t'Ashvin',\n\t'Matthews',\n\t'Elver',\n\t'Brendin',\n\t'Rhea',\n\t'Jyron',\n\t'Matisse',\n\t'Karanvir',\n\t'Kenshin',\n\t'Saketh',\n\t'Trigo',\n\t'Wil',\n\t'Tyrick',\n\t'Trejon',\n\t'Manvir',\n\t'Sascha',\n\t'Samay',\n\t'Prabhjot',\n\t'Piers',\n\t'Arshia',\n\t'Karo',\n\t'Makani',\n\t'Ludwin',\n\t'Kean',\n\t'Nikoli',\n\t'Garlin',\n\t'Georgio',\n\t'Jyren',\n\t'Ledell',\n\t'Jayceion',\n\t'Wiltz',\n\t'Elgie',\n\t'Jediah',\n\t'Izzac',\n\t'Izeyah',\n\t'Jeyson',\n\t'Hamid',\n\t'Jalani',\n\t'Rohin',\n\t'Shiva',\n\t'Ramces',\n\t'Claudell',\n\t'Daymien',\n\t'Aeron',\n\t'Aadan',\n\t'Alesandro',\n\t'Aleksey',\n\t'Galileo',\n\t'Esvin',\n\t'Indy',\n\t'Graden',\n\t'Gor',\n\t'Vlad',\n\t'Kendrell',\n\t'Saket',\n\t'Asahel',\n\t'Blue',\n\t'Arshdeep',\n\t'Adain',\n\t'Keneth',\n\t'Jacy',\n\t'Dasan',\n\t'Haniel',\n\t'Ethin',\n\t'Ericson',\n\t'Izick',\n\t'Elisandro',\n\t'Coltrane',\n\t'Kemani',\n\t'Josearmando',\n\t'Josealfredo',\n\t'Alias',\n\t'Anurag',\n\t'Carlitos',\n\t'Ceaser',\n\t'Sukhraj',\n\t'Severin',\n\t'Nishanth',\n\t'Mattox',\n\t'Rhiley',\n\t'Dareon',\n\t'Danyel',\n\t'Calan',\n\t'Nithin',\n\t'Donivan',\n\t'Taye',\n\t'Trustin',\n\t'Igor',\n\t'Jayr',\n\t'Kayin',\n\t'Pleas',\n\t'Aadit',\n\t'Balam',\n\t'Jovannie',\n\t'Quintrell',\n\t'Japheth',\n\t'Hero',\n\t'Edu',\n\t'Duvan',\n\t'Anden',\n\t'Anshul',\n\t'Ailton',\n\t'Raybon',\n\t'Rabon',\n\t'Kendry',\n\t'Manases',\n\t'Damyan',\n\t'Braven',\n\t'Dhani',\n\t'Isaia',\n\t'Hovik',\n\t'Sonnie',\n\t'Wolfe',\n\t'Banyan',\n\t'Hiroki',\n\t'Matin',\n\t'Sequoia',\n\t'Acelin',\n\t'Aarya',\n\t'Arsalan',\n\t'Carlosdaniel',\n\t'Jaryd',\n\t'Ariana',\n\t'Kylee',\n\t'Mariah',\n\t'Serenity',\n\t'Kailey',\n\t'Delaney',\n\t'Emilee',\n\t'Isabelle',\n\t'Jayla',\n\t'Drue',\n\t'Emani',\n\t'Juandedios',\n\t'Kedar',\n\t'Baily',\n\t'Daijon',\n\t'Daman',\n\t'Kentaro',\n\t'Damaria',\n\t'Mareco',\n\t'Valmore',\n\t'Theophile',\n\t'Winslow',\n\t'Ugo',\n\t'Cainan',\n\t'Finian',\n\t'Keiji',\n\t'Issack',\n\t'Blanchard',\n\t'Domingos',\n\t'Jarin',\n\t'Giovan',\n\t'Ovila',\n\t'Lovelace',\n\t'Albion',\n\t'Curry',\n\t'Christophr',\n\t'Nolton',\n\t'Unborn',\n\t'Torry',\n\t'Yoshi',\n\t'Perrion',\n\t'Nathyn',\n\t'Syler',\n\t'Sheila',\n\t'Jaedan',\n\t'Cobey',\n\t'Bashar',\n\t'Ehsan',\n\t'Daryll',\n\t'Seann',\n\t'Niels',\n\t'Nazar',\n\t'Frederico',\n\t'Esther',\n\t'Bobie',\n\t'Loyce',\n\t'Heberto',\n\t'Bentura',\n\t'Jafar',\n\t'Keigan',\n\t'Bertil',\n\t'Aloys',\n\t'Janie',\n\t'Paz',\n\t'Damacio',\n\t'Oiva',\n\t'Ingvald',\n\t'Walfred',\n\t'Jakeob',\n\t'Georgie',\n\t'Alcuin',\n\t'Raynold',\n\t'Josey',\n\t'Lasaro',\n\t'Jo',\n\t'Hjalmer',\n\t'Philemon',\n\t'Paula',\n\t'Christophor',\n\t'Estanislao',\n\t'Angelita',\n\t'Anacleto',\n\t'Alfons',\n\t'Lawayne',\n\t'Delrico',\n\t'Clemson',\n\t'Jaleen',\n\t'Jerimy',\n\t'Javaughn',\n\t'Tiofilo',\n\t'Hubbard',\n\t'Abundio',\n\t'Derl',\n\t'Keagen',\n\t'Aymen',\n\t'Freedom',\n\t'Venancio',\n\t'Pauline',\n\t'Gorden',\n\t'Hani',\n\t'Pharrell',\n\t'Jager',\n\t'Nyair',\n\t'Azeem',\n\t'Khyir',\n\t'Jabriel',\n\t'Yandiel',\n\t'Zaahir',\n\t'Laine',\n\t'Xai',\n\t'Vernard',\n\t'Augie',\n\t'Sostenes',\n\t'Darryll',\n\t'Asir',\n\t'Lindon',\n\t'Jearl',\n\t'Peder',\n\t'Rudolpho',\n\t'Clancy',\n\t'Yue',\n\t'Ronnald',\n\t'Onofre',\n\t'Kysir',\n\t'Helmuth',\n\t'Marlowe',\n\t'Derk',\n\t'Demetrick',\n\t'Jefrey',\n\t'Burrell',\n\t'Robie',\n\t'Marlan',\n\t'Thane',\n\t'Jamire',\n\t'Donnel',\n\t'Syaire',\n\t'York',\n\t'Asaad',\n\t'Kyair',\n\t'Devere',\n\t'Wing',\n\t'Yaniv',\n\t'Mathhew',\n\t'Silvia',\n\t'Chia',\n\t'Bren',\n\t'Cavin',\n\t'Aldrich',\n\t'Judy',\n\t'Erron',\n\t'Butler',\n\t'Carole',\n\t'Almon',\n\t'Gilles',\n\t'Christin',\n\t'Renald',\n\t'Sony',\n\t'Chavis',\n\t'Nghia',\n\t'Mercedes',\n\t'Real',\n\t'Josejesus',\n\t'Ryman',\n\t'Kori',\n\t'Ichael',\n\t'Jabier',\n\t'Nguyen',\n\t'Angeldejesus',\n\t'Bobak',\n\t'Brittan',\n\t'Shaunt',\n\t'Karlton',\n\t'Jerin',\n\t'Gerado',\n\t'Raymund',\n\t'Kerolos',\n\t'Rolan',\n\t'Wilbern',\n\t'Sipriano',\n\t'Hermes',\n\t'Robyn',\n\t'Ynes',\n\t'Vernice',\n\t'Pink',\n\t'Jevonte',\n\t'Jerame',\n\t'Tajuan',\n\t'Mingo',\n\t'Jeremia',\n\t'Edmon',\n\t'Castulo',\n\t'Cleofas',\n\t'Arlee',\n\t'Oather',\n\t'Larkin',\n\t'Mcarther',\n\t'Ryann',\n\t'Hong',\n\t'Jamieson',\n\t'Enedino',\n\t'Gerad',\n\t'Lenord',\n\t'Alireza',\n\t'Hollie',\n\t'Gilford',\n\t'Lajuane',\n\t'Izell',\n\t'Trenidad',\n\t'Shelley',\n\t'Ulysees',\n\t'Juana',\n\t'Coalton',\n\t'Remer',\n\t'Raiford',\n\t'Caydon',\n\t'Dalyn',\n\t'Wilhelm',\n\t'Lenzy',\n\t'Bartow',\n\t'Tibor',\n\t'Cebert',\n\t'Elizar',\n\t'Ellen',\n\t'Uchenna',\n\t'Toy',\n\t'Curlee',\n\t'Ralf',\n\t'Giulio',\n\t'Conway',\n\t'Ngai',\n\t'Chaka',\n\t'Engelbert',\n\t'Auburn',\n\t'Socrates',\n\t'Kostas',\n\t'Kamalei',\n\t'Kupono',\n\t'Carrell',\n\t'Lister',\n\t'Mattie',\n\t'Thermon',\n\t'Tina',\n\t'Kennan',\n\t'Adison',\n\t'Dalon',\n\t'Ephram',\n\t'Jaylynn',\n\t'Zabdiel',\n\t'Kaidon',\n\t'Juvencio',\n\t'Havis',\n\t'Dagan',\n\t'Dacorian',\n\t'Donavyn',\n\t'Evyn',\n\t'Issai',\n\t'Zenon',\n\t'Inman',\n\t'Hason',\n\t'Lehman',\n\t'Afton',\n\t'Clayborn',\n\t'Abrahm',\n\t'Neill',\n\t'Conard',\n\t'Mutsuo',\n\t'Seikichi',\n\t'Wetzel',\n\t'Masaji',\n\t'Masanobu',\n\t'Shigeto',\n\t'Edgel',\n\t'Goro',\n\t'Lovett',\n\t'Seiko',\n\t'Sakae',\n\t'Roshawn',\n\t'Antjuan',\n\t'Erby',\n\t'Jobe',\n\t'Ladarian',\n\t'Cyler',\n\t'Edel',\n\t'Hartsel',\n\t'Jill',\n\t'Jami',\n\t'Rabun',\n\t'Fulton',\n\t'Dreddy',\n\t'Corrado',\n\t'Harald',\n\t'Alterick',\n\t'Hala',\n\t'Powell',\n\t'Lesly',\n\t'Kalon',\n\t'Theodoros',\n\t'Etan',\n\t'Trev',\n\t'Javiel',\n\t'Jusiah',\n\t'Joncarlos',\n\t'Jhamari',\n\t'Rasheim',\n\t'Raysean',\n\t'Kreg',\n\t'Rahmell',\n\t'Kerby',\n\t'Eliga',\n\t'Clemon',\n\t'Aneudy',\n\t'Keiran',\n\t'Kensley',\n\t'Ludie',\n\t'Jorell',\n\t'Can',\n\t'Demondre',\n\t'Cierra',\n\t'Maurizio',\n\t'Tacuma',\n\t'Ryzen',\n\t'Jabar',\n\t'Tara',\n\t'Reign',\n\t'Jashon',\n\t'Lasean',\n\t'Artavius',\n\t'Akbar',\n\t'Un',\n\t'Kaikane',\n\t'Tanisha',\n\t'Elena',\n\t'Bridget',\n\t'Asia',\n\t'Latisha',\n\t'Rachael',\n\t'Latoya',\n\t'Elisabeth',\n\t'Janelle',\n\t'Ikea',\n\t'Kobey',\n\t'Kamaehu',\n\t'Keona',\n\t'Calixto',\n\t'Theotis',\n\t'Worthy',\n\t'Galo',\n\t'Holly',\n\t'Sevyn',\n\t'Petr',\n\t'Cerrone',\n\t'Tedrick',\n\t'Kymari',\n\t'Gerrard',\n\t'Eldo',\n\t'Alcides',\n\t'Derrian',\n\t'Eulas',\n\t'Leodis',\n\t'Akai',\n\t'Dalonte',\n\t'Pantelis',\n\t'Sheron',\n\t'Tommaso',\n\t'Treg',\n\t'Shirl',\n\t'Abrian',\n\t'Brewer',\n\t'Yamir',\n\t'Zadok',\n\t'Holdyn',\n\t'Jayanthony',\n\t'Eh',\n\t'Dayson',\n\t'Khaden',\n\t'Quintez',\n\t'Rontavious',\n\t'Markese',\n\t'Quintavis',\n\t'Daveion',\n\t'Tonny',\n\t'Jaevon',\n\t'Ahkeem',\n\t'Hy',\n\t'Adams',\n\t'Marian',\n\t'Huner',\n\t'Jarmarcus',\n\t'Treyon',\n\t'Tullio',\n\t'Oreste',\n\t'Oleg',\n\t'Xzavien',\n\t'Atzel',\n\t'Brenan',\n\t'Abriel',\n\t'Braylyn',\n\t'Chidera',\n\t'Lebaron',\n\t'Jameir',\n\t'Kameryn',\n\t'Shade',\n\t'Koltin',\n\t'Cordarrius',\n\t'Amelio',\n\t'Demarquez',\n\t'Tarus',\n\t'Calob',\n\t'Dmarco',\n\t'Creek',\n\t'Amen',\n\t'Cylas',\n\t'Davyn',\n\t'Haygen',\n\t'Godric',\n\t'Garn',\n\t'Renardo',\n\t'Locke',\n\t'Lexington',\n\t'Mazin',\n\t'Othniel',\n\t'Kruze',\n\t'Jaxston',\n\t'Jaxten',\n\t'Jeziah',\n\t'Jettson',\n\t'Zebastian',\n\t'Sarim',\n\t'Jawuan',\n\t'Tremain',\n\t'Hassell',\n\t'Quartez',\n\t'Hawkins',\n\t'Riggs',\n\t'Rebel',\n\t'Nael',\n\t'Kaycen',\n\t'Kamsiyochukwu',\n\t'Kagen',\n\t'Jrue',\n\t'Jaydeen',\n\t'Azazel',\n\t'Ayson',\n\t'Cheston',\n\t'Aarian',\n\t'Chavez',\n\t'Void',\n\t'Zacariah',\n\t'Keena',\n\t'Antwuan',\n\t'Labarron',\n\t'Quamere',\n\t'Mikell',\n\t'Prestyn',\n\t'Savian',\n\t'Dayden',\n\t'Jaivion',\n\t'Geremiah',\n\t'Aidon',\n\t'Bralyn',\n\t'Gianncarlo',\n\t'Jarquavious',\n\t'Muriel',\n\t'Akshar',\n\t'Kadir',\n\t'Najir',\n\t'Neko',\n\t'Jahaad',\n\t'Jdyn',\n\t'Kashon',\n\t'Jaquil',\n\t'Wah',\n\t'Delmos',\n\t'Masuo',\n\t'Nobuichi',\n\t'Kiichi',\n\t'Jerone',\n\t'Tatsumi',\n\t'Damarian',\n\t'Elier',\n\t'Lansing',\n\t'Heinrich',\n\t'Hasson',\n\t'Larrie',\n\t'Phyllis',\n\t'Jamoni',\n\t'Zylen',\n\t'Demoni',\n\t'Harrel',\n\t'Levie',\n\t'Zaryan',\n\t'Orazio',\n\t'Seymore',\n\t'Florence',\n\t'Kolter',\n\t'Kemper',\n\t'Daelyn',\n\t'Haddon',\n\t'Syon',\n\t'Sair',\n\t'Filadelfio',\n\t'Marquavion',\n\t'Breylon',\n\t'Filimon',\n\t'Abie',\n\t'Cortavious',\n\t'Achille',\n\t'Dontrez',\n\t'Matty',\n\t'Darshawn',\n\t'Overton',\n\t'Bashir',\n\t'Kavan',\n\t'Caidan',\n\t'Braelen',\n\t'Param',\n\t'Kani',\n\t'Percival',\n\t'Hartley',\n\t'Erminio',\n\t'Candler',\n\t'Ulyssee',\n\t'Damontae',\n\t'Ellijah',\n\t'Cesare',\n\t'Eleanor',\n\t'Eustace',\n\t'Joachim',\n\t'Tarique',\n\t'Altin',\n\t'Tyleek',\n\t'Posey',\n\t'Awais',\n\t'Daivon',\n\t'Zi',\n\t'Hammad',\n\t'Meshulem',\n\t'Nickie',\n\t'Brehon',\n\t'Dacoda',\n\t'Kwamane',\n\t'Rafuel',\n\t'Mikai',\n\t'Hensel',\n\t'Thelbert',\n\t'Valerio',\n\t'Trevonte',\n\t'Koran',\n\t'Cheick',\n\t'Shahzaib',\n\t'Tahsin',\n\t'Derry',\n\t'Mustapha',\n\t'Chucky',\n\t'Osborne',\n\t'Daquarius',\n\t'Marque',\n\t'Raquon',\n\t'Cherokee',\n\t'Keyshaun',\n\t'Mohamadou',\n\t'Keishawn',\n\t'Jahmeek',\n\t'Junaid',\n\t'Amil',\n\t'Mckoy',\n\t'Zackry',\n\t'Nyheim',\n\t'Nkosi',\n\t'Kweli',\n\t'Tydarius',\n\t'Umer',\n\t'Demorris',\n\t'Demarquis',\n\t'Hersch',\n\t'Luzer',\n\t'Li',\n\t'Aly',\n\t'Quade',\n\t'Quamaine',\n\t'Markee',\n\t'Jhoan',\n\t'Mert',\n\t'Supreme',\n\t'Tyheem',\n\t'Gomer',\n\t'Taseen',\n\t'Yousaf',\n\t'Yonason',\n\t'Gifford',\n\t'Ashar',\n\t'Sender',\n\t'Salah',\n\t'Saifan',\n\t'Raihan',\n\t'Nizar',\n\t'Abrahim',\n\t'Kunga',\n\t'Javis',\n\t'Evens',\n\t'Bayard',\n\t'Kaysan',\n\t'Padraig',\n\t'Ney',\n\t'Ahmet',\n\t'Misty',\n\t'Ayyan',\n\t'Saint',\n\t'Fern',\n\t'Wasil',\n\t'Nolie',\n\t'Zarif',\n\t'Younis',\n\t'Eesa',\n\t'Ketrick',\n\t'Veryl',\n\t'Refael',\n\t'Motty',\n\t'Naftuly',\n\t'Waseem',\n\t'Yusif',\n\t'Brigg',\n\t'Zaheer',\n\t'Shiya',\n\t'Karma',\n\t'Meilich',\n\t'Mihran',\n\t'Javares',\n\t'Efe',\n\t'Abubakr',\n\t'Avrumi',\n\t'Nayshawn',\n\t'Mostafa',\n\t'Hinckley',\n\t'Jahmeir',\n\t'Fintan',\n\t'Sollie',\n\t'Amiel',\n\t'Abu',\n\t'Yaro',\n\t'Josha',\n\t'Jermane',\n\t'Bertis',\n\t'Hernando',\n\t'Gerrod',\n\t'Haim',\n\t'Frandy',\n\t'Andrews',\n\t'Dayle',\n\t'Fleming',\n\t'Volvi',\n\t'Savior',\n\t'Shuford',\n\t'Plummer',\n\t'Ralston',\n\t'Dayvion',\n\t'Muhamed',\n\t'Naheem',\n\t'Nataniel',\n\t'Kaeleb',\n\t'Billyjoe',\n\t'Able',\n\t'Fareed',\n\t'Purcell',\n\t'Trayson',\n\t'Mackay',\n\t'Moyer',\n\t'Haynes',\n\t'Domnick',\n\t'Burnie',\n\t'Gleen',\n\t'Leavy',\n\t'Lennart',\n\t'Breken',\n\t'Arlind',\n\t'Clarnce',\n\t'Nissen',\n\t'Josiel',\n\t'Alvester',\n\t'Jaquay',\n\t'Nickolaos',\n\t'Ruddy',\n\t'Berkeley',\n\t'Flamur',\n\t'Sherif',\n\t'Shateek',\n\t'Ayodele',\n\t'Davone',\n\t'Meshach',\n\t'Kinston',\n\t'Algernon',\n\t'Dvonte',\n\t'Jawara',\n\t'Zamar',\n\t'Dayron',\n\t'Jaequan',\n\t'Tyrelle',\n\t'Jazion',\n\t'Tamel',\n\t'Torris',\n\t'Marguis',\n\t'Yuniel',\n\t'Saige',\n\t'Gottlieb',\n\t'Cori',\n\t'Dre',\n\t'Yordan',\n\t'Shaquell',\n\t'Jonel',\n\t'Kashaun',\n\t'Arjenis',\n\t'Tashan',\n\t'Fitzroy',\n\t'Francisc',\n\t'Kwaku',\n\t'Jakyri',\n\t'Trayton',\n\t'Jarrick',\n\t'Reginaldo',\n\t'Facundo',\n\t'Elma',\n\t'Dardan',\n\t'Dreshawn',\n\t'Demontray',\n\t'Chaddrick',\n\t'Roper',\n\t'Taariq',\n\t'Ausitn',\n\t'Jachai',\n\t'Duval',\n\t'Braun',\n\t'Taylan',\n\t'Dionis',\n\t'Samy',\n\t'Armistead',\n\t'Alize',\n\t'Tayshon',\n\t'Ainsley',\n\t'Kaheem',\n\t'Jaire',\n\t'Kyshawn',\n\t'Nahshon',\n\t'Aaliyah',\n\t'Shanard',\n\t'Azion',\n\t'Alana',\n\t'Alexia',\n\t'Breyon',\n\t'Trigg',\n\t'Wylder',\n\t'Zaydin',\n\t'Ziaire',\n\t'Zixuan',\n\t'Yanis',\n\t'Zair',\n\t'Zaven',\n\t'Alanmichael',\n\t'Viyan',\n\t'Vivan',\n\t'Klay',\n\t'Erico',\n\t'Tycho',\n\t'Waris',\n\t'Winter',\n\t'Aliyah',\n\t'Kamilo',\n\t'Kei',\n\t'Glendell',\n\t'Lilly',\n\t'Lauryn',\n\t'Jovian',\n\t'Shayla',\n\t'Tessa',\n\t'Jupiter',\n\t'Aaric',\n\t'Aadhav',\n\t'Jetson',\n\t'Abir',\n\t'Adhrit',\n\t'Alexandr',\n\t'Brooklynn',\n\t'Callie',\n\t'Ashlee',\n\t'Ashlyn',\n\t'Haleigh',\n\t'Heaven',\n\t'Jahkari',\n\t'Izaiyah',\n\t'Troyce',\n\t'Bige',\n\t'Hayze',\n\t'Neldon',\n\t'Marven',\n\t'Beckem',\n\t'Dvante',\n\t'Navarro',\n\t'Neiko',\n\t'Noeh',\n\t'Jen',\n\t'Torrian',\n\t'Helios',\n\t'Macallan',\n\t'Lio',\n\t'Wilkens',\n\t'Merrik',\n\t'Ameal',\n\t'Mujtaba',\n\t'Iktan',\n\t'Kavious',\n\t'Monterrio',\n\t'Hughey',\n\t'Calin',\n\t'Cali',\n\t'Jamaar',\n\t'Kenith',\n\t'Rihaan',\n\t'Deaglan',\n\t'Kelso',\n\t'Lavaris',\n\t'Ashot',\n\t'Marshun',\n\t'Rainer',\n\t'Rivan',\n\t'Talal',\n\t'Taiyo',\n\t'Minor',\n\t'Yvon',\n\t'Stonewall',\n\t'Merril',\n\t'Okie',\n\t'Trevino',\n\t'Imari',\n\t'Ithan',\n\t'Izmael',\n\t'Jayan',\n\t'Harut',\n\t'Harshaan',\n\t'Kainen',\n\t'Kalyan',\n\t'Kanishk',\n\t'Kotaro',\n\t'Josyah',\n\t'Vola',\n\t'Omarie',\n\t'Dmari',\n\t'Mannix',\n\t'Elad',\n\t'Shun',\n\t'Andriy',\n\t'Angelino',\n\t'Ary',\n\t'Axcel',\n\t'Becker',\n\t'Daxten',\n\t'Daemian',\n\t'Cypress',\n\t'Jakhai',\n\t'Warnie',\n\t'Maikel',\n\t'Davinci',\n\t'Calloway',\n\t'Vernal',\n\t'Tyrome',\n\t'Mont',\n\t'Ovie',\n\t'Hester',\n\t'Arvis',\n\t'Corbit',\n\t'Tarvaris',\n\t'Audra',\n\t'Cloud',\n\t'Taveon',\n\t'Balian',\n\t'Bodi',\n\t'Brodee',\n\t'Kainan',\n\t'Dezi',\n\t'Devesh',\n\t'Emad',\n\t'Esa',\n\t'Massie',\n\t'Moir',\n\t'Markavious',\n\t'Veachel',\n\t'Dalan',\n\t'Carles',\n\t'Antawn',\n\t'Jermichael',\n\t'Talin',\n\t'Sy',\n\t'Murrel',\n\t'Elster',\n\t'Kru',\n\t'Okley',\n\t'Maverik',\n\t'Diangelo',\n\t'Burns',\n\t'Jamaris',\n\t'Jayshaun',\n\t'Dantae',\n\t'Rahil',\n\t'Renny',\n\t'Rohith',\n\t'Strummer',\n\t'Birchel',\n\t'Astor',\n\t'Nolyn',\n\t'Neeko',\n\t'Reyan',\n\t'Kailan',\n\t'Jaideep',\n\t'Manveer',\n\t'Maeson',\n\t'Khris',\n\t'Lancelot',\n\t'Shaunak',\n\t'Shubham',\n\t'Siaosi',\n\t'Ruslan',\n\t'Sajan',\n\t'Renwick',\n\t'Yann',\n\t'Vitali',\n\t'Zealand',\n\t'Vyom',\n\t'Xabi',\n\t'Yazid',\n\t'Terrelle',\n\t'Oaks',\n\t'Kache',\n\t'Arjuna',\n\t'Cephas',\n\t'Holmes',\n\t'Rockie',\n\t'Elray',\n\t'Doc',\n\t'Mell',\n\t'Tyresse',\n\t'Maguire',\n\t'Sheddrick',\n\t'Loney',\n\t'Helaman',\n\t'Andrus',\n\t'Asberry',\n\t'Love',\n\t'Clebert',\n\t'Cashius',\n\t'Egypt',\n\t'Devansh',\n\t'Elige',\n\t'Tobe',\n\t'Taten',\n\t'Arias',\n\t'Leandrew',\n\t'Dekota',\n\t'Varian',\n\t'Lehi',\n\t'Colbert',\n\t'Ignace',\n\t'Suhas',\n\t'Syris',\n\t'Ahan',\n\t'Aithan',\n\t'Aiven',\n\t'Akshath',\n\t'Hamp',\n\t'Kato',\n\t'Leeon',\n\t'Reubin',\n\t'Lukah',\n\t'Wilmon',\n\t'Tait',\n\t'Theophilus',\n\t'Sion',\n\t'Maysen',\n\t'Nicoli',\n\t'Nason',\n\t'Mykell',\n\t'Montae',\n\t'Laszlo',\n\t'Lestat',\n\t'Prithvi',\n\t'Maxi',\n\t'Mekhai',\n\t'Hammond',\n\t'Atiksh',\n\t'Aldean',\n\t'Aldine',\n\t'Jedi',\n\t'Almond',\n\t'Edahi',\n\t'Hisham',\n\t'Clide',\n\t'Cosby',\n\t'Hayato',\n\t'Harnoor',\n\t'Gurjot',\n\t'Ethridge',\n\t'Dublin',\n\t'Daimian',\n\t'Derreon',\n\t'Hansell',\n\t'Mae',\n\t'Semisi',\n\t'Ulysess',\n\t'Render',\n\t'Eschol',\n\t'Rodell',\n\t'Atzin',\n\t'Alik',\n\t'Amiri',\n\t'Keyvon',\n\t'Noland',\n\t'Terius',\n\t'Isauro',\n\t'Harshith',\n\t'Pledger',\n\t'Tilman',\n\t'Lennis',\n\t'Jovin',\n\t'Jaymin',\n\t'Jaydee',\n\t'Asbury',\n\t'Lovie',\n\t'Mcclinton',\n\t'Grayton',\n\t'Cardin',\n\t'Jacey',\n\t'Gurveer',\n\t'Ethanmatthew',\n\t'Aaronjames',\n\t'Ascher',\n\t'Aarion',\n\t'Windle',\n\t'Jahan',\n\t'Jayen',\n\t'Jatin',\n\t'Jedrek',\n\t'Anthonyjr',\n\t'Dabney',\n\t'Galvin',\n\t'Ilijah',\n\t'Gohan',\n\t'Quaid',\n\t'Teancum',\n\t'Chael',\n\t'Chetan',\n\t'Cylis',\n\t'Manas',\n\t'Logun',\n\t'Karston',\n\t'Mickeal',\n\t'Iskander',\n\t'Isaah',\n\t'Aryaman',\n\t'Juvens',\n\t'Joncarlo',\n\t'Gurkirat',\n\t'Laymon',\n\t'Salesi',\n\t'Rion',\n\t'Tao',\n\t'Tadhg',\n\t'Stephens',\n\t'Terryl',\n\t'Jacquan',\n\t'Zubin',\n\t'Yul',\n\t'Yadriel',\n\t'Dolph',\n\t'Keiden',\n\t'Koston',\n\t'Demetre',\n\t'Kameren',\n\t'Kaedin',\n\t'Zebedee',\n\t'Tyrie',\n\t'Truth',\n\t'Lanorris',\n\t'Tilden',\n\t'Tidus',\n\t'Thelonious',\n\t'Tennessee',\n\t'Sirius',\n\t'Pervis',\n\t'Saatvik',\n\t'Adley',\n\t'Amarian',\n\t'Numa',\n\t'Bronco',\n\t'Zian',\n\t'Zephan',\n\t'Yaziel',\n\t'Ajit',\n\t'Arick',\n\t'Ollin',\n\t'Kort',\n\t'Tayvin',\n\t'Grason',\n\t'Leonid',\n\t'Nihaal',\n\t'Koah',\n\t'Southern',\n\t'Kavish',\n\t'Joeziah',\n\t'Javi',\n\t'Kaiyan',\n\t'Kyro',\n\t'Ziad',\n\t'Maxen',\n\t'Xion',\n\t'Mica',\n\t'Mansour',\n\t'Matteus',\n\t'Renner',\n\t'Jonan',\n\t'Shilo',\n\t'Josedaniel',\n\t'Kaj',\n\t'Robel',\n\t'Krithik',\n\t'Lautaro',\n\t'Evann',\n\t'Carden',\n\t'Nathaneal',\n\t'Wirt',\n\t'Kile',\n\t'Kevonte',\n\t'Jazz',\n\t'Vardan',\n\t'Tanav',\n\t'Tamim',\n\t'Ojani',\n\t'Raydel',\n\t'Rigel',\n\t'Sheamus',\n\t'Cameryn',\n\t'Jedd',\n\t'Dalessandro',\n\t'Daejon',\n\t'Zacheriah',\n\t'Jt',\n\t'Valeria',\n\t'Treshon',\n\t'Martynas',\n\t'Markeese',\n\t'Ladislado',\n\t'Fidensio',\n\t'Cincere',\n\t'Amonte',\n\t'Erion',\n\t'Emin',\n\t'Tayten',\n\t'Zachory',\n\t'Ysidoro',\n\t'Treshaun',\n\t'Franciszek',\n\t'Adit',\n\t'Neftaly',\n\t'Kaylan',\n\t'Dezmon',\n\t'Joby',\n\t'Terrick',\n\t'Irma',\n\t'Isiaha',\n\t'Micha',\n\t'Sylvia',\n\t'Dejan',\n\t'Kippy',\n\t'Tyreece',\n\t'Corie',\n\t'Martese',\n\t'Senovio',\n\t'Lexus',\n\t'Freddrick',\n\t'Jemarcus',\n\t'Kuba',\n\t'Corion',\n\t'Andrian',\n\t'Romualdo',\n\t'Lyndal',\n\t'Kalem',\n\t'Laderrick',\n\t'Jobin',\n\t'Chaise',\n\t'Naren',\n\t'Reynol',\n\t'Ohm',\n\t'Trashawn',\n\t'Danyell',\n\t'Diron',\n\t'Kameran',\n\t'Dunte',\n\t'Ikechukwu',\n\t'Trendon',\n\t'Visente',\n\t'Valeriano',\n\t'Dillian',\n\t'Chantz',\n\t'Bacilio',\n\t'Crescencio',\n\t'Policarpio',\n\t'Janice',\n\t'Kem',\n\t'Rutilio',\n\t'Jaqualin',\n\t'Kendon',\n\t'Keevin',\n\t'Adelaido',\n\t'Coltan',\n\t'Theodoro',\n\t'Devondre',\n\t'Dekendrick',\n\t'Deionte',\n\t'Taz',\n\t'Jimmey',\n\t'Cristan',\n\t'Chancelor',\n\t'Ascension',\n\t'Kemon',\n\t'Makari',\n\t'Cordel',\n\t'Colbey',\n\t'Ambrocio',\n\t'Marselino',\n\t'Dewain',\n\t'Graciano',\n\t'Gumecindo',\n\t'Lorenso',\n\t'Quaylon',\n\t'Halbert',\n\t'Celedonio',\n\t'Terrin',\n\t'Zuri',\n\t'Sherod',\n\t'Ermal',\n\t'Elisa',\n\t'Larnell',\n\t'Tully',\n\t'Wenceslaus',\n\t'Lashun',\n\t'Duan',\n\t'Correy',\n\t'Wilburt',\n\t'Antwoin',\n\t'Lynell',\n\t'Ramond',\n\t'Victorio',\n\t'Antion',\n\t'Dragan',\n\t'Priest',\n\t'Marice',\n\t'Laroy',\n\t'Ninos',\n\t'Byrl',\n\t'Ebert',\n\t'Keita',\n\t'Dimitris',\n\t'Zoran',\n\t'Khaalis',\n\t'Rollo',\n\t'Alwin',\n\t'Loraine',\n\t'Jerard',\n\t'Lyndle',\n\t'Quirino',\n\t'Ramey',\n\t'Jarian',\n\t'Marky',\n\t'Adlai',\n\t'Shamon',\n\t'Treyshawn',\n\t'Shaft',\n\t'Gumercindo',\n\t'Rita',\n\t'Derryl',\n\t'Chancy',\n\t'Kacy',\n\t'Jonothan',\n\t'Ruston',\n\t'Ranulfo',\n\t'Talik',\n\t'Johntae',\n\t'Kendale',\n\t'Diandre',\n\t'Reginold',\n\t'Tyris',\n\t'Davell',\n\t'Ladell',\n\t'Raymone',\n\t'Mariusz',\n\t'Edvardo',\n\t'Joh',\n\t'Lavontae',\n\t'Markie',\n\t'Laquinton',\n\t'Alexandar',\n\t'Divante',\n\t'Jabin',\n\t'Shawon',\n\t'Jawann',\n\t'Ladd',\n\t'Khali',\n\t'Gilmore',\n\t'Oliverio',\n\t'Thuan',\n\t'Daiel',\n\t'Kierre',\n\t'Javar',\n\t'Stevon',\n\t'Derius',\n\t'Chadley',\n\t'Manual',\n\t'Johnaton',\n\t'Lc',\n\t'Erek',\n\t'Jakaden',\n\t'Jden',\n\t'Drayke',\n\t'Dawsen',\n\t'Jadarion',\n\t'Shriyans',\n\t'Raylin',\n\t'Kaydan',\n\t'Lynden',\n\t'Duard',\n\t'Elo',\n\t'Amarius',\n\t'Cleburne',\n\t'Dailen',\n\t'Brance',\n\t'Braycen',\n\t'Daiden',\n\t'Cruzito',\n\t'Caedyn',\n\t'Aizik',\n\t'Abyan',\n\t'Felisiano',\n\t'Taevion',\n\t'Zaeden',\n\t'Zadrian',\n\t'Fredie',\n\t'Burnis',\n\t'Cleave',\n\t'Ki',\n\t'Quandarius',\n\t'Quavion',\n\t'Makell',\n\t'Myrl',\n\t'Tae',\n\t'Melik',\n\t'Samarion',\n\t'Branton',\n\t'Vollie',\n\t'Reynolds',\n\t'Draylon',\n\t'Keivon',\n\t'Kevontae',\n\t'Deundre',\n\t'Zaydrian',\n\t'Zaydan',\n\t'Jotham',\n\t'Janthony',\n\t'Sahid',\n\t'Keilon',\n\t'Lain',\n\t'Kenechukwu',\n\t'Kanaan',\n\t'Kamdon',\n\t'Ahmod',\n\t'Dong',\n\t'Nnamdi',\n\t'Jontavius',\n\t'Kelijah',\n\t'Searcy',\n\t'Wheeler',\n\t'Francisca',\n\t'Burrel',\n\t'Zyquavious',\n\t'Kortez',\n\t'Tres',\n\t'Tranquilino',\n\t'Guinn',\n\t'Hiawatha',\n\t'Jasiyah',\n\t'Arlos',\n\t'Celestine',\n\t'Deadrian',\n\t'Chinedu',\n\t'Cane',\n\t'Caedon',\n\t'Gabryel',\n\t'Garon',\n\t'Solon',\n\t'Udell',\n\t'Medardo',\n\t'Chon',\n\t'Zakk',\n\t'Trip',\n\t'Somtochukwu',\n\t'Shooter',\n\t'Frutoso',\n\t'Laurencio',\n\t'Izayiah',\n\t'Franko',\n\t'Izzak',\n\t'Braelan',\n\t'Dryden',\n\t'Wilborn',\n\t'Newt',\n\t'Petronilo',\n\t'Nathanel',\n\t'Jatavius',\n\t'Locadio',\n\t'Tyquez',\n\t'Laiden',\n\t'Allister',\n\t'Javarion',\n\t'Demarrio',\n\t'Shenouda',\n\t'Rodriques',\n\t'Jenard',\n\t'Azarias',\n\t'Axxel',\n\t'Ariyan',\n\t'Pate',\n\t'Raidyn',\n\t'Saylor',\n\t'Kreed',\n\t'Kayce',\n\t'Bray',\n\t'Zyren',\n\t'Zayvien',\n\t'Yeiden',\n\t'Kinta',\n\t'Trampus',\n\t'Lofton',\n\t'Zayvian',\n\t'Zaydon',\n\t'Zaidan',\n\t'Weslee',\n\t'Robben',\n\t'Rook',\n\t'Roston',\n\t'Trigger',\n\t'Steel',\n\t'Rustyn',\n\t'Jaeceon',\n\t'Hutton',\n\t'Hatcher',\n\t'Kartier',\n\t'Kallan',\n\t'Daxtyn',\n\t'Corvin',\n\t'Deklyn',\n\t'Kaveon',\n\t'Leviathan',\n\t'Leelan',\n\t'Lael',\n\t'Prynce',\n\t'Korban',\n\t'Khyren',\n\t'Omran',\n\t'Oluwademilade',\n\t'Orenthal',\n\t'Dequavius',\n\t'Quinterrius',\n\t'Quantavis',\n\t'Astin',\n\t'Asaiah',\n\t'Dace',\n\t'Brylee',\n\t'Kenyan',\n\t'Jeovani',\n\t'Kolson',\n\t'Dreyden',\n\t'Jujuan',\n\t'Gregoria',\n\t'Abdon',\n\t'Javious',\n\t'Latravious',\n\t'Nanya',\n\t'Kaleel',\n\t'Elsie',\n\t'Iris',\n\t'Javarus',\n\t'Hunner',\n\t'Ebubechukwu',\n\t'Ashaz',\n\t'Huntley',\n\t'Montravious',\n\t'Argelio',\n\t'Amaar',\n\t'Abdulmalik',\n\t'Deronte',\n\t'Ramirez',\n\t'Travius',\n\t'Xavius',\n\t'Rashamel',\n\t'Martice',\n\t'Oshay',\n\t'Jamerson',\n\t'Derico',\n\t'Benino',\n\t'Otilio',\n\t'Palani',\n\t'Trystin',\n\t'Domonick',\n\t'Jayron',\n\t'Josephine',\n\t'Dora',\n\t'Larence',\n\t'Feliz',\n\t'Tereso',\n\t'Natalio',\n\t'Olga',\n\t'Bralen',\n\t'Temple',\n\t'Keala',\n\t'Anita',\n\t'Eathen',\n\t'Lamond',\n\t'Jakobie',\n\t'Johnthan',\n\t'Elnathan',\n\t'Edris',\n\t'Alcario',\n\t'Cornie',\n\t'Ival',\n\t'Pantaleon',\n\t'Deavion',\n\t'Daevion',\n\t'Dorance',\n\t'Jailon',\n\t'Ragene',\n\t'Kaena',\n\t'Kaimipono',\n\t'Keaka',\n\t'Kiai',\n\t'Babygirl',\n\t'Aukai',\n\t'Kaitlin',\n\t'Kaikoa',\n\t'Jedadiah',\n\t'Pono',\n\t'Layth',\n\t'Kolbie',\n\t'Naaman',\n\t'Pacey',\n\t'Jearld',\n\t'Corinthian',\n\t'Bryceson',\n\t'Kayzen',\n\t'Mana',\n\t'Janee',\n\t'Janae',\n\t'Kelli',\n\t'Tamara',\n\t'Nora',\n\t'Sophie',\n\t'Rashida',\n\t'Princess',\n\t'Lakeisha',\n\t'Nadia',\n\t'Monet',\n\t'Meaghan',\n\t'Marquita',\n\t'Chiquita',\n\t'Charlotte',\n\t'Chantelle',\n\t'Cassandra',\n\t'Cara',\n\t'Brandi',\n\t'Asha',\n\t'Tatiana',\n\t'Haaheo',\n\t'Valerie',\n\t'Valencia',\n\t'Shoso',\n\t'Yoshimi',\n\t'Bristol',\n\t'Mikio',\n\t'Nobuyuki',\n\t'Tomio',\n\t'Kazumi',\n\t'Kunio',\n\t'Yoshiharu',\n\t'Balentin',\n\t'Paublo',\n\t'Nobuyoshi',\n\t'Toshiaki',\n\t'Matsuo',\n\t'Hachiro',\n\t'Tokio',\n\t'Eichi',\n\t'Manabu',\n\t'Masanori',\n\t'Yoshiyuki',\n\t'Tokuo',\n\t'Eustolio',\n\t'Petra',\n\t'Fukuichi',\n\t'Haruyoshi',\n\t'Eastin',\n\t'Keygan',\n\t'Kelin',\n\t'Lalo',\n\t'Ramona',\n\t'Felis',\n\t'Rodgers',\n\t'Deigo',\n\t'Guerin',\n\t'Arrington',\n\t'Bradin',\n\t'Aurora',\n\t'Calistro',\n\t'Ervie',\n\t'Velma',\n\t'Whit',\n\t'Adarian',\n\t'Jakevion',\n\t'Jadrien',\n\t'Calub',\n\t'Kaegan',\n\t'Jamorian',\n\t'Milam',\n\t'Usiel',\n\t'Drayven',\n\t'Orange',\n\t'Daelon',\n\t'Jatavion',\n\t'Vastine',\n\t'Preciliano',\n\t'Floyce',\n\t'Billye',\n\t'Burney',\n\t'Consepcion',\n\t'Dason',\n\t'Osie',\n\t'Tashaun',\n\t'Sajid',\n\t'Umair',\n\t'Tymarion',\n\t'Jakorian',\n\t'Ginobili',\n\t'Areeb',\n\t'Jonovan',\n\t'Jonavan',\n\t'Jaqualyn',\n\t'Billey',\n\t'Luisgustavo',\n\t'Lamario',\n\t'Telford',\n\t'Lekendrick',\n\t'Brinton',\n\t'Lebarron',\n\t'Marrio',\n\t'Tyshun',\n\t'Kendarrius',\n\t'Zylan',\n\t'Jarrius',\n\t'Kadarrius',\n\t'Marvis',\n\t'Orie',\n\t'Kimber',\n\t'Jakevious',\n\t'Shawndale',\n\t'Jakel',\n\t'Jaquarious',\n\t'Deakon',\n\t'Brevan',\n\t'Rochester',\n\t'Lemmie',\n\t'Athony',\n\t'Rosie',\n\t'Lillie',\n\t'Mozell',\n\t'Aubert',\n\t'Kimble',\n\t'Jaymon',\n\t'Gaza',\n\t'Lysle',\n\t'Wasco',\n\t'Zigmond',\n\t'Addie',\n\t'Erastus',\n\t'Claudius',\n\t'Audley',\n\t'Thadeus',\n\t'Exum',\n\t'Caldwell',\n\t'Emmert',\n\t'Teagen',\n\t'Royden',\n\t'Mykale',\n\t'Lindberg',\n\t'Elmon',\n\t'Norfleet',\n\t'Radford',\n\t'Romulus',\n\t'Thedore',\n\t'Cor',\n\t'Ledarrius',\n\t'Cyncere',\n\t'Hurbert',\n\t'Pearly',\n\t'Jobie',\n\t'Garvey',\n\t'Meade',\n\t'Casmir',\n\t'Bertie',\n\t'Belvin',\n\t'Lynford',\n\t'Verdun',\n\t'Junie',\n\t'Dover',\n\t'Harlee',\n\t'Romolo',\n\t'Sirr',\n\t'Bradey',\n\t'Kingsten',\n\t'Manuelito',\n\t'Leno',\n\t'Primo',\n\t'Antonie',\n\t'Jane',\n\t'Halsey',\n\t'Mujahid',\n\t'Quron',\n\t'Cleophas',\n\t'Amedio',\n\t'Gildo',\n\t'Norvel',\n\t'Livingston',\n\t'Norvell',\n\t'Fard',\n\t'Khaleef',\n\t'Dorr',\n\t'Chaquille',\n\t'Giro',\n\t'Verdell',\n\t'Concetto',\n\t'Taevon',\n\t'Amato',\n\t'Hasaan',\n\t'Burr',\n\t'Payten',\n\t'Baden',\n\t'Abdirizak',\n\t'Emran',\n\t'Abdurahman',\n\t'Greig',\n\t'Sabree',\n\t'Shymir',\n\t'Haakon',\n\t'Aasim',\n\t'Abdifatah',\n\t'Cheemeng',\n\t'Yuepheng',\n\t'Hamsa',\n\t'Abdalla',\n\t'Samatar',\n\t'Joshawa',\n\t'Leeman',\n\t'Hershal',\n\t'Fayette',\n\t'Patty',\n\t'Thom',\n\t'Yaaseen',\n\t'Alven',\n\t'Hillis',\n\t'Bard',\n\t'Nymir',\n\t'Imir',\n\t'Mohamud',\n\t'Muaad',\n\t'Mickael',\n\t'Hermann',\n\t'Varner',\n\t'Norm',\n\t'Suheyb',\n\t'Eivin',\n\t'Jamy',\n\t'Taro',\n\t'Caydin',\n\t'Masaharu',\n\t'Cassie',\n\t'Virgie',\n\t'Oddie',\n\t'Pamela',\n\t'Emmette',\n\t'Rayshon',\n\t'Vardaman',\n\t'Ruble',\n\t'Clance',\n\t'Rigdon',\n\t'Osborn',\n\t'Gina',\n\t'Rozell',\n\t'Marcy',\n\t'Farron',\n\t'Bartolomeo',\n\t'Dierre',\n\t'Demetrus',\n\t'Yoneo',\n\t'Blayke',\n\t'Decarlo',\n\t'Sebert',\n\t'Quayon',\n\t'Nihar',\n\t'Segundo',\n\t'Ritik',\n\t'Aljaquan',\n\t'Lealon',\n\t'Opie',\n\t'Darshan',\n\t'Trapper',\n\t'Ladarrion',\n\t'Thaine',\n\t'Abanoub',\n\t'Filipe',\n\t'Oley',\n\t'Zaylan',\n\t'Rushi',\n\t'Watie',\n\t'Cleatus',\n\t'Harshil',\n\t'Alferd',\n\t'Carthel',\n\t'Ogden',\n\t'Carmin',\n\t'Hiren',\n\t'Harl',\n\t'Drexel',\n\t'Shadeed',\n\t'Malvern',\n\t'Argus',\n\t'Sharief',\n\t'Almalik',\n\t'Audy',\n\t'Terral',\n\t'Nuno',\n\t'Verna',\n\t'Alim',\n\t'Sherron',\n\t'Terek',\n\t'Clardie',\n\t'Shadee',\n\t'Clendon',\n\t'Johnpatrick',\n\t'Chritopher',\n\t'Taheem',\n\t'Jahid',\n\t'Waitman',\n\t'Jabraylen',\n\t'Quasim',\n\t'Azim',\n\t'Eulis',\n\t'Wladyslaw',\n\t'Delmus',\n\t'Minter',\n\t'Kharter',\n\t'Zavhary',\n\t'Taji',\n\t'Hoskie',\n\t'Colsen',\n\t'Orlanda',\n\t'Shawntez',\n\t'Obryan',\n\t'Emanual',\n\t'Silviano',\n\t'Chrishawn',\n\t'Rayon',\n\t'Martino',\n\t'Fairley',\n\t'Lenward',\n\t'Autzen',\n\t'Selby',\n\t'Odus',\n\t'Redell',\n\t'Seavy',\n\t'Dennison',\n\t'Jamiere',\n\t'Rondy',\n\t'Donold',\n\t'Lindwood',\n\t'Laudie',\n\t'Obert',\n\t'Jahki',\n\t'Braidon',\n\t'Zalen',\n\t'Zymier',\n\t'Jahzir',\n\t'Nahsir',\n\t'Vikrant',\n\t'Shourya',\n\t'Eliyohu',\n\t'Tyheim',\n\t'Keyshon',\n\t'Kaydence',\n\t'Ekin',\n\t'Tresean',\n\t'Quendarius',\n\t'Shammond',\n\t'Malakye',\n\t'Findlay',\n\t'Ashrith',\n\t'Elfego',\n\t'Jalik',\n\t'Nyzir',\n\t'Boe',\n\t'Abdikadir',\n\t'Jameek',\n\t'Gyasi',\n\t'Khyri',\n\t'Mohit',\n\t'Shayquan',\n\t'Sivan',\n\t'Steffon',\n\t'Lord',\n\t'Leor',\n\t'Kujtim',\n\t'Haaris',\n\t'Rafid',\n\t'Nechemia',\n\t'Nyles',\n\t'Khalik',\n\t'Tysheen',\n\t'Shaheim',\n\t'Starling',\n\t'Taiquan',\n\t'Takeem',\n\t'Teshawn',\n\t'Tuvia',\n\t'Shu',\n\t'Schyler',\n\t'Indalecio',\n\t'Edouard',\n\t'Alverto',\n\t'Alexio',\n\t'Aurash',\n\t'Fabiola',\n\t'Firas',\n\t'Fredis',\n\t'Guthrie',\n\t'Babacar',\n\t'Ayinde',\n\t'Khallid',\n\t'Shadrach',\n\t'Rikki',\n\t'Prescott',\n\t'Saam',\n\t'Perla',\n\t'Michell',\n\t'Markis',\n\t'Nou',\n\t'Sher',\n\t'Tor',\n\t'Kyre',\n\t'Shykeem',\n\t'Jilberto',\n\t'Klye',\n\t'Jeramey',\n\t'Herber',\n\t'Kue',\n\t'Mainor',\n\t'Macaulay',\n\t'Jequan',\n\t'Bond',\n\t'Hykeem',\n\t'Husam',\n\t'Catalina',\n\t'Danh',\n\t'Aaronmichael',\n\t'Anthonyjames',\n\t'Jerrid',\n\t'Jobani',\n\t'Kenia',\n\t'Oshae',\n\t'Michaelvincent',\n\t'Mong',\n\t'Dawit',\n\t'Dabid',\n\t'Daisuke',\n\t'Geddy',\n\t'Ehab',\n\t'Jarmal',\n\t'Caelin',\n\t'Barak',\n\t'Gurtej',\n\t'Geordan',\n\t'Jacobb',\n\t'Estefani',\n\t'Esaul',\n\t'Karandeep',\n\t'Jevaughn',\n\t'Kassim',\n\t'Kion',\n\t'Vikas',\n\t'Infinite',\n\t'Yekusiel',\n\t'Zohaib',\n\t'Yaw',\n\t'Sakib',\n\t'Shah',\n\t'Zeshan',\n\t'Hassaan',\n\t'Masai',\n\t'Mattheus',\n\t'Jeniel',\n\t'Martine',\n\t'Maalik',\n\t'Jeanclaude',\n\t'Stirling',\n\t'Trayveon',\n\t'Paymon',\n\t'Ajai',\n\t'Habib',\n\t'Enis',\n\t'Grafton',\n\t'Nissan',\n\t'Oshane',\n\t'Mirza',\n\t'Malike',\n\t'Yianni',\n\t'Zachari',\n\t'Tadeh',\n\t'Patrik',\n\t'Richy',\n\t'Riki',\n\t'Yao',\n\t'Yadira',\n\t'Nylan',\n\t'Lennard',\n\t'Roldan',\n\t'Admir',\n\t'Oniel',\n\t'Addam',\n\t'Itzel',\n\t'Ivann',\n\t'Shabab',\n\t'Honorio',\n\t'Hrag',\n\t'Harutun',\n\t'Keano',\n\t'Kayvan',\n\t'Takahiro',\n\t'Juanfrancisco',\n\t'Eri',\n\t'Ermon',\n\t'Ramzy',\n\t'Selma',\n\t'Kasean',\n\t'Obrian',\n\t'Jonatha',\n\t'Jonahtan',\n\t'Davione',\n\t'Chandara',\n\t'Chantha',\n\t'Lo',\n\t'Loreto',\n\t'Derell',\n\t'Ganesh',\n\t'Janathan',\n\t'Alejandr',\n\t'Rodolphe',\n\t'Isaul',\n\t'Bejan',\n\t'Doron',\n\t'Yvette',\n\t'Erlon',\n\t'Erland',\n\t'Yuji',\n\t'Milagro',\n\t'Ndrew',\n\t'Pedram',\n\t'Thinh',\n\t'Vandy',\n\t'Vi',\n\t'Ryanjoseph',\n\t'Richar',\n\t'Hosey',\n\t'Adeel',\n\t'Nicholos',\n\t'Michaeljohn',\n\t'Philipe',\n\t'Bravlio',\n\t'Anup',\n\t'Davide',\n\t'Daquann',\n\t'Lequan',\n\t'Raymel',\n\t'Rahsean',\n\t'Woodley',\n\t'Jarmel',\n\t'Wiliam',\n\t'Joseh',\n\t'Somnang',\n\t'Colvin',\n\t'Jenkins',\n\t'Jaquawn',\n\t'Javonne',\n\t'Javed',\n\t'Joelle',\n\t'Lameek',\n\t'Kishawn',\n\t'Krikor',\n\t'Christipher',\n\t'Ghassan',\n\t'Essa',\n\t'Hovig',\n\t'Nayquan',\n\t'Shawndell',\n\t'Rawle',\n\t'Marwin',\n\t'Record',\n\t'Dmario',\n\t'Crist',\n\t'La',\n\t'Access',\n\t'Shaquel',\n\t'Tyrrell',\n\t'Tiquan',\n\t'Shavon',\n\t'Shatique',\n\t'Yochanon',\n\t'Keontay',\n\t'Shaquelle',\n\t'Kshawn',\n\t'Armend',\n\t'Eliazer',\n\t'Diony',\n\t'Saddam',\n\t'Takayuki',\n\t'Sukhdeep',\n\t'Shahan',\n\t'Valon',\n\t'Orel',\n\t'Tremell',\n\t'Chayim',\n\t'Jaquille',\n\t'Ayodeji',\n\t'Bekim',\n\t'Besnik',\n\t'Oluwanifemi',\n\t'Stalin',\n\t'Sadam',\n\t'Aniel',\n\t'Laureat',\n\t'Dyrell',\n\t'Jhony',\n\t'Barkim',\n\t'Ludger',\n\t'Mahendra',\n\t'Kadeen',\n\t'Jovaughn',\n\t'Khadeem',\n\t'Ardian',\n\t'Ravindra',\n\t'Harpal',\n\t'Jatinder',\n\t'Erving',\n\t'Gerrell',\n\t'Sylvestre',\n\t'Luismanuel',\n\t'Pharell',\n\t'Jahziah',\n\t'Salif',\n\t'Jakyrin',\n\t'Idrissa',\n\t'Daoud',\n\t'Swan',\n\t'Pryor',\n\t'Polk',\n\t'Rameses',\n\t'Prateek',\n\t'Lelon',\n\t'Ebrima',\n\t'Ezechiel',\n\t'Tevan',\n\t'Sohail',\n\t'Luiseduardo',\n\t'Clearance',\n\t'Brayn',\n\t'Alexsis',\n\t'Edwar',\n\t'Johnmark',\n\t'Hikaru',\n\t'Edon',\n\t'Chezkel',\n\t'Dinari',\n\t'Ahmadou',\n\t'Jadien',\n\t'Ismaeel',\n\t'Heshy',\n\t'Jhan',\n\t'Dejohn',\n\t'Ajdin',\n\t'Damier',\n\t'Cashmere',\n\t'Amitai',\n\t'Alp',\n\t'Avrahom',\n\t'Hooper',\n\t'Daichi',\n\t'Dariush',\n\t'Bryen',\n\t'Oseas',\n\t'Moyses',\n\t'Alderic',\n\t'Dickson',\n\t'Joon',\n\t'Justinkyle',\n\t'Jassiah',\n\t'Jaidin',\n\t'Lexie',\n\t'Mieczyslaw',\n\t'Joffre',\n\t'Augustino',\n\t'Adelino',\n\t'Tadeusz',\n\t'Humphrey',\n\t'Lonas',\n\t'Avry',\n\t'Tylin',\n\t'Dixie',\n\t'Goldman',\n\t'Yissachar',\n\t'Toure',\n\t'Yafet',\n\t'Siraj',\n\t'Nasiah',\n\t'Maor',\n\t'Roniel',\n\t'Kerim',\n\t'Danieljr',\n\t'Django',\n\t'Lion',\n\t'Baruc',\n\t'Cervando',\n\t'Akul',\n\t'Abdi',\n\t'Ameya',\n\t'Arhan',\n\t'Aliou',\n\t'Arcangel',\n\t'Avrumy',\n\t'Deandrea',\n\t'Dontreal',\n\t'Yossef',\n\t'Walden',\n\t'Tameem',\n\t'Kenderick',\n\t'Yassine',\n\t'Zeyad',\n\t'Riyad',\n\t'Kashmere',\n\t'Tevis',\n\t'Malichi',\n\t'Malakhai',\n\t'Yulian',\n\t'Clearnce',\n\t'Esco',\n\t'Fabrizzio',\n\t'Gianpaolo',\n\t'Jaskirat',\n\t'Termaine',\n\t'Daouda',\n\t'Abba',\n\t'Aaban',\n\t'Chanoch',\n\t'Raynell',\n\t'Ihsan',\n\t'Djibril',\n\t'Cassiel',\n\t'Ishaq',\n\t'Azlan',\n\t'Behruz',\n\t'Amirjon',\n\t'Anisjon',\n\t'Asadbek',\n\t'Dhilan',\n\t'Dream',\n\t'Daviel',\n\t'Mosha',\n\t'Rayane',\n\t'Shabsi',\n\t'Olie',\n\t'Vinicio',\n\t'Yuda',\n\t'Shohjahon',\n\t'Kylematthew',\n\t'Kien',\n\t'Matthewjames',\n\t'Giorgi',\n\t'Konstantine',\n\t'Jibreel',\n\t'Jadriel',\n\t'Lliam',\n\t'Travonte',\n\t'Taiki',\n\t'Rendell',\n\t'Wyland',\n\t'Arafat',\n\t'Tajon',\n\t'Loic',\n\t'Shaw',\n\t'Sukhman',\n\t'Randiel',\n\t'Stefanos',\n\t'Lukus',\n\t'Majesty',\n\t'Massimiliano',\n\t'Burach',\n\t'Jansel',\n\t'Ismaila',\n\t'Henoch',\n\t'Daelin',\n\t'Giordano',\n\t'Huber',\n\t'Rontrell',\n\t'Simran',\n\t'Majid',\n\t'Rayjon',\n\t'Pharoah',\n\t'Lamine',\n\t'Hanoch',\n\t'Chidi',\n\t'Jahmani',\n\t'Javid',\n\t'Kamani',\n\t'Endrit',\n\t'Endy',\n\t'Nasean',\n\t'Danyael',\n\t'Cinque',\n\t'Akaash',\n\t'Zeeshan',\n\t'Amel',\n\t'Adib',\n\t'Aboubakar',\n\t'Artan',\n\t'Burak',\n\t'Serigne',\n\t'Samin',\n\t'Hovsep',\n\t'Jomari',\n\t'Cesareo',\n\t'Dajohn',\n\t'Charbel',\n\t'Bakary',\n\t'Camerin',\n\t'Jaquel',\n\t'Pape',\n\t'Jahrel',\n\t'Jahrell',\n\t'Khadim',\n\t'Jeison',\n\t'Yobany',\n\t'Zaul',\n\t'Taryn',\n\t'Abou',\n\t'Besim',\n\t'Abdur',\n\t'Ebrahim',\n\t'Albi',\n\t'Haadi',\n\t'Saba',\n\t'Wen',\n\t'Felipedejesus',\n\t'Dragon',\n\t'Jamiel',\n\t'Alecxis',\n\t'Ashkon',\n\t'Tejon',\n\t'Meelad',\n\t'Renan',\n\t'Brailyn',\n\t'Harel',\n\t'Abdou',\n\t'Amier',\n\t'Jonathanjoseph',\n\t'Juanalberto',\n\t'Larenz',\n\t'Nerses',\n\t'Emmanuelle',\n\t'Jasmeet',\n\t'Jahred',\n\t'Elsworth',\n\t'Nyshawn',\n\t'Alexes',\n\t'Cranford',\n\t'Trenell',\n\t'Cephus',\n\t'Costas',\n\t'Rama',\n\t'Nickalas',\n\t'Moultrie',\n\t'Deklin',\n\t'Saafir',\n\t'Alexie',\n\t'Kajuan',\n\t'Jamahl',\n\t'Robet',\n\t'Antoin',\n\t'Turhan',\n\t'Mart',\n\t'Richrd',\n\t'Ante',\n\t'Bransyn',\n\t'Dargan',\n\t'Levan',\n\t'Milledge',\n\t'Ollis',\n\t'Morey',\n\t'Jeromey',\n\t'Ebon',\n\t'Nicholus',\n\t'Yvonne',\n\t'Gladstone',\n\t'Kwan',\n\t'Sherry',\n\t'Romney',\n\t'Nicolaos',\n\t'Oded',\n\t'Koty',\n\t'Mandy',\n\t'Adger',\n\t'Esaw',\n\t'Shaunte',\n\t'Nimesh',\n\t'Ahren',\n\t'Marcellino',\n\t'Attila',\n\t'Pinkney',\n\t'Reinhard',\n\t'Deanna',\n\t'Shanti',\n\t'Calmer',\n\t'Reda',\n\t'Darral',\n\t'Monserrate',\n\t'Levert',\n\t'Harce',\n\t'Ayham',\n\t'Breslin',\n\t'Dom',\n\t'Darrow',\n\t'Haidar',\n\t'Willaim',\n\t'Shann',\n\t'Regina',\n\t'Einer',\n\t'Zui',\n\t'Shonn',\n\t'Skipper',\n\t'Henning',\n\t'Jacek',\n\t'Wendelin',\n\t'Wilmar',\n\t'Algot',\n\t'Marlen',\n\t'Dquan',\n\t'Emanuele',\n\t'Erol',\n\t'Boby',\n\t'Elbin',\n\t'Londell',\n\t'Bradd',\n\t'Malo',\n\t'Mohamadali',\n\t'Toussaint',\n\t'Roald',\n\t'Trini',\n\t'Stace',\n\t'Erubey',\n\t'Labron',\n\t'Kyseem',\n\t'Duong',\n\t'Rande',\n\t'Siegfried',\n\t'Mamon',\n\t'Va',\n\t'Quy',\n\t'Raman',\n\t'Ramil',\n\t'Jasai',\n\t'Carla',\n\t'Belen',\n\t'Lawernce',\n\t'Jemar',\n\t'Markham',\n\t'Kym',\n\t'Jemaine',\n\t'Baldwin',\n\t'Damany',\n\t'Timonthy',\n\t'Tesfa',\n\t'Vinod',\n\t'Albertus',\n\t'Yupheng',\n\t'Danie',\n\t'Tashiem',\n\t'Uno',\n\t'Onnie',\n\t'Juliana',\n\t'Duff',\n\t'Doua',\n\t'Orman',\n\t'Kamaal',\n\t'Godwin',\n\t'Ulric',\n\t'Darrold',\n\t'Rennie',\n\t'Lory',\n\t'Jamile',\n\t'Terril',\n\t'Gable',\n\t'Hanh',\n\t'Grisel',\n\t'Jimmylee',\n\t'Mikkel',\n\t'Victorino',\n\t'Jaymere',\n\t'Rayn',\n\t'Duriel',\n\t'Ceferino',\n\t'Autrey',\n\t'Durant',\n\t'Kolsen',\n\t'Abayomi',\n\t'Azell',\n\t'Spyros',\n\t'Ato',\n\t'Damin',\n\t'Diogenes',\n\t'Barnaby',\n\t'Pinckney',\n\t'Keno',\n\t'Sherard',\n\t'Chukwuemeka',\n\t'Akin',\n\t'Harvel',\n\t'Marv',\n\t'Kenyetta',\n\t'Huel',\n\t'Royzell',\n\t'Luddie',\n\t'Olden',\n\t'Ardith',\n\t'Branch',\n\t'Bertha',\n\t'Hillman',\n\t'Namon',\n\t'Donnis',\n\t'Fitzhugh',\n\t'Lavaughn',\n\t'Lucille',\n\t'Amanuel',\n\t'Carvin',\n\t'Minnie',\n\t'Tivis',\n\t'Birt',\n\t'Bronner',\n\t'Vaden',\n\t'Joenathan',\n\t'Alphonsa',\n\t'Elvie',\n\t'Alpheus',\n\t'Clausell',\n\t'Clayburn',\n\t'Demetrias',\n\t'Avis',\n\t'Garlon',\n\t'Romaine',\n\t'Jamorris',\n\t'Swanson',\n\t'Perez',\n\t'Hurschel',\n\t'Virge',\n\t'Rutherford',\n\t'Lelton',\n\t'Tarris',\n\t'Denson',\n\t'Benjaman',\n\t'Rashun',\n\t'Keino',\n\t'Cedarius',\n\t'Keanthony',\n\t'Blakeley',\n\t'Burwell',\n\t'Kasai',\n\t'Euell',\n\t'Eldrick',\n\t'Ashford',\n\t'Demetruis',\n\t'Wood',\n\t'Blanton',\n\t'Daniell',\n\t'Robt',\n\t'Lamorris',\n\t'Waller',\n\t'Devoris',\n\t'Herley',\n\t'Jermery',\n\t'Jamicheal',\n\t'Horton',\n\t'Gradie',\n\t'Etheridge',\n\t'Millie',\n\t'Jammy',\n\t'Karey',\n\t'Rodregus',\n\t'Cordera',\n\t'Embry',\n\t'Forney',\n\t'Sims',\n\t'Gergory',\n\t'Rosser',\n\t'Benjamine',\n\t'Erskin',\n\t'Heflin',\n\t'Torrie',\n\t'Norville',\n\t'Arvie',\n\t'Bessie',\n\t'Keonta',\n\t'Tarrence',\n\t'Chapman',\n\t'Limmie',\n\t'Tavius',\n\t'Reynard',\n\t'Lonza',\n\t'Detroit',\n\t'Camauri',\n\t'Clanton',\n\t'Obbie',\n\t'Mizell',\n\t'Marshel',\n\t'Tollie',\n\t'Jondarius',\n\t'Therion',\n\t'Antoino',\n\t'Beatrice',\n\t'Keyonte',\n\t'Littleton',\n\t'Hozie',\n\t'Atwell',\n\t'Ottie',\n\t'Pelham',\n\t'Vickie',\n\t'Cederick',\n\t'Zaykeese',\n\t'Jadarious',\n\t'Shin',\n\t'Tizoc',\n\t'Mischa',\n\t'Tycen',\n\t'Jubal',\n\t'Kito',\n\t'Sabin',\n\t'Brannan',\n\t'Baltasar',\n\t'Hilda',\n\t'Orasio',\n\t'Bassel',\n\t'Ameet',\n\t'Talus',\n\t'Renne',\n\t'Reuel',\n\t'Saro',\n\t'Kam',\n\t'Heliodoro',\n\t'Hodari',\n\t'Mondo',\n\t'Damaso',\n\t'Damein',\n\t'Thunder',\n\t'Ravinder',\n\t'Remberto',\n\t'Rodel',\n\t'Yvan',\n\t'Marcelle',\n\t'Kiril',\n\t'Shem',\n\t'Bardo',\n\t'Carlson',\n\t'Jebediah',\n\t'Austreberto',\n\t'Hannibal',\n\t'Shawnn',\n\t'Kenyatte',\n\t'Geoffry',\n\t'Hadden',\n\t'Natnael',\n\t'Edurdo',\n\t'Errik',\n\t'Eva',\n\t'Gaelan',\n\t'Gilverto',\n\t'Antwaine',\n\t'Barclay',\n\t'Rithy',\n\t'Sarath',\n\t'Sasan',\n\t'Stefen',\n\t'Susana',\n\t'Le',\n\t'Mai',\n\t'Marquies',\n\t'Neeraj',\n\t'Galdino',\n\t'Cuitlahuac',\n\t'Griselda',\n\t'Jerret',\n\t'Filbert',\n\t'Travone',\n\t'Lizette',\n\t'Lourdes',\n\t'Ratana',\n\t'Sarith',\n\t'Ku',\n\t'Jocob',\n\t'Jushua',\n\t'Shaughn',\n\t'Sophal',\n\t'Sophana',\n\t'Stepan',\n\t'Tramel',\n\t'Veniamin',\n\t'Ha',\n\t'Halley',\n\t'Hiep',\n\t'Maclain',\n\t'Alberta',\n\t'Alejando',\n\t'Eliana',\n\t'Chay',\n\t'Esmond',\n\t'Frisco',\n\t'Dai',\n\t'Marta',\n\t'Man',\n\t'Kha',\n\t'Kin',\n\t'Sun',\n\t'Paulmichael',\n\t'Rj',\n\t'Jeoffrey',\n\t'Custodio',\n\t'Herberth',\n\t'Gerrad',\n\t'Seanpaul',\n\t'Sten',\n\t'Nereida',\n\t'Jasun',\n\t'Micharl',\n\t'Robbert',\n\t'Ronnel',\n\t'Rosio',\n\t'Othon',\n\t'Chau',\n\t'Hart',\n\t'Atthew',\n\t'Angelito',\n\t'Debbie',\n\t'Randol',\n\t'Jeffrie',\n\t'Kern',\n\t'Rohn',\n\t'Raef',\n\t'Arleigh',\n\t'Jef',\n\t'Reg',\n\t'Vinton',\n\t'Perrin',\n\t'Parry',\n\t'Sally',\n\t'Hoby',\n\t'Vint',\n\t'Dagmawi',\n\t'Mat',\n\t'Gregrey',\n\t'Darol',\n\t'Merik',\n\t'Rickard',\n\t'Clete',\n\t'Fredrik',\n\t'Darrol',\n\t'Lyall',\n\t'Jamare',\n\t'Duffy',\n\t'Barre',\n\t'Shawnee',\n\t'Tige',\n\t'Whittaker',\n\t'Tyrion',\n\t'Jamas',\n\t'Jud',\n\t'Spence',\n\t'Dione',\n\t'Erinn',\n\t'Bron',\n\t'Ackley',\n\t'Dal',\n\t'Monti',\n\t'Paco',\n\t'Kjell',\n\t'Gabor',\n\t'Davinder',\n\t'Shonte',\n\t'Maximiano',\n\t'Heshimu',\n\t'Jassen',\n\t'Jerami',\n\t'Jermon',\n\t'Keefe',\n\t'Keri',\n\t'Daric',\n\t'Christropher',\n\t'Johnney',\n\t'Dodd',\n\t'Wilferd',\n\t'Raymondo',\n\t'Keary',\n\t'Orlan',\n\t'Gerhart',\n\t'Clemence',\n\t'Pepe',\n\t'Whitaker',\n\t'Vaughan',\n\t'Wess',\n\t'Abenezer',\n\t'Miroslav',\n\t'Kurk',\n\t'Helmut',\n\t'Timothey',\n\t'Annette',\n\t'Cruise',\n\t'Jahel',\n\t'Itay',\n\t'Isaiahs',\n\t'Isack',\n\t'Eagan',\n\t'Finbar',\n\t'Famous',\n\t'Ethanjoseph',\n\t'Ethanjames',\n\t'Edi',\n\t'Isais',\n\t'Albeiro',\n\t'Abhijot',\n\t'Joshuajames',\n\t'Amine',\n\t'Edwardjames',\n\t'Donyae',\n\t'Danieljohn',\n\t'Avaneesh',\n\t'Aryav',\n\t'Andoni',\n\t'Yeison',\n\t'Lowen',\n\t'Obi',\n\t'Mycah',\n\t'Moksh',\n\t'Miliano',\n\t'Maxamillion',\n\t'Lazlo',\n\t'Jocsan',\n\t'Jibran',\n\t'Jerimyah',\n\t'Jefte',\n\t'Korde',\n\t'Kanav',\n\t'Tavita',\n\t'Taesean',\n\t'Yoltzin',\n\t'Xzavior',\n\t'Vibhav',\n\t'Romen',\n\t'Rocket',\n\t'Rai',\n\t'Orian',\n\t'Rumi',\n\t'Shota',\n\t'Shaheer',\n\t'Sadrac',\n\t'Semaje',\n\t'Sohrob',\n\t'Yuval',\n\t'Yuren',\n\t'Yannis',\n\t'Vineet',\n\t'Yarden',\n\t'Jesusjr',\n\t'Kartik',\n\t'Jairon',\n\t'Millen',\n\t'Nahun',\n\t'Krisna',\n\t'Kyrese',\n\t'Mher',\n\t'Mayan',\n\t'Kais',\n\t'Joshuan',\n\t'Jometh',\n\t'Keawe',\n\t'Siris',\n\t'Sinai',\n\t'Shuban',\n\t'Shian',\n\t'Sneijder',\n\t'Sota',\n\t'Uday',\n\t'Sevak',\n\t'Royale',\n\t'Yuuki',\n\t'Reyhan',\n\t'Seena',\n\t'Moisses',\n\t'Nayib',\n\t'Sumit',\n\t'Dayveon',\n\t'Christianpaul',\n\t'Garrin',\n\t'Edgerrin',\n\t'Edrees',\n\t'Estephan',\n\t'Assael',\n\t'Azad',\n\t'Tydus',\n\t'Yosuf',\n\t'Zekiel',\n\t'Strider',\n\t'Senai',\n\t'Edmar',\n\t'Dmorea',\n\t'Eman',\n\t'Darran',\n\t'Keston',\n\t'Keny',\n\t'Hardeep',\n\t'Heladio',\n\t'Hernesto',\n\t'Hovannes',\n\t'Sankalp',\n\t'Brenten',\n\t'Navraj',\n\t'Mavrik',\n\t'Nilmar',\n\t'Rishit',\n\t'Edwing',\n\t'Eswin',\n\t'Flabio',\n\t'Jasn',\n\t'Romar',\n\t'Sevan',\n\t'Shahab',\n\t'Justinmichael',\n\t'Joseandres',\n\t'Marcelus',\n\t'Mariana',\n\t'Andhy',\n\t'Angeles',\n\t'Tannor',\n\t'Tristain',\n\t'Joshuaray',\n\t'Luisdavid',\n\t'Damaris',\n\t'Daymond',\n\t'Anthonyjohn',\n\t'Dezhon',\n\t'Emelio',\n\t'Eulices',\n\t'Maclean',\n\t'Jaeson',\n\t'Ethanjohn',\n\t'Ethanjacob',\n\t'Jasiri',\n\t'Kaisei',\n\t'Khyle',\n\t'Jona',\n\t'Jeren',\n\t'Jeramyah',\n\t'Jesusantonio',\n\t'Jguadalupe',\n\t'Joseeduardo',\n\t'Elkin',\n\t'Prashant',\n\t'Anguel',\n\t'Anant',\n\t'Aisea',\n\t'Abhimanyu',\n\t'Daelen',\n\t'Dylin',\n\t'Dodge',\n\t'Nazaret',\n\t'Mikie',\n\t'Matthewjoseph',\n\t'Maximillan',\n\t'Savir',\n\t'Dhillon',\n\t'Donoven',\n\t'Ebin',\n\t'Edrei',\n\t'Elek',\n\t'Nykolas',\n\t'Nikash',\n\t'Nik',\n\t'Reyly',\n\t'Razi',\n\t'Presten',\n\t'Arul',\n\t'Avo',\n\t'Yandell',\n\t'Wynston',\n\t'Tallen',\n\t'Suhaib',\n\t'Joshuajohn',\n\t'Jesusmanuel',\n\t'Malacai',\n\t'Kethan',\n\t'Londen',\n\t'Larenzo',\n\t'Kriss',\n\t'Kohei',\n\t'Hamlet',\n\t'Martinjr',\n\t'Mansoor',\n\t'Archit',\n\t'Aniketh',\n\t'Kincaid',\n\t'Lunden',\n\t'Masaki',\n\t'Salam',\n\t'Sahith',\n\t'Nour',\n\t'Miqueas',\n\t'Estefano',\n\t'Hatim',\n\t'Gurvir',\n\t'Adeeb',\n\t'Tobiah',\n\t'Torrin',\n\t'Tushar',\n\t'Tyee',\n\t'Sulayman',\n\t'Takai',\n\t'Tayo',\n\t'Yoan',\n\t'Vegas',\n\t'Duilio',\n\t'Dyami',\n\t'Greko',\n\t'Harim',\n\t'Ioane',\n\t'Ashmit',\n\t'Bora',\n\t'Alekxander',\n\t'Alexanderjames',\n\t'Amanpreet',\n\t'Anthonny',\n\t'Brandom',\n\t'Daimon',\n\t'Sirus',\n\t'Seananthony',\n\t'Vignesh',\n\t'Vir',\n\t'Wisdom',\n\t'Rameen',\n\t'Kenzie',\n\t'Joshuamichael',\n\t'Josejr',\n\t'Joseenrique',\n\t'Jacksen',\n\t'Jeriko',\n\t'Jesua',\n\t'Myka',\n\t'Naithen',\n\t'Saurav',\n\t'Shalim',\n\t'Puneet',\n\t'Denali',\n\t'Daveyon',\n\t'Sohil',\n\t'Edilson',\n\t'Jafeth',\n\t'Nathin',\n\t'Maurion',\n\t'Mekai',\n\t'Nadim',\n\t'Jamani',\n\t'Jamisen',\n\t'Gared',\n\t'Gahel',\n\t'Emron',\n\t'Hanzel',\n\t'Xaviar',\n\t'Yohann',\n\t'Alam',\n\t'Brasen',\n\t'Ashlan',\n\t'Rury',\n\t'Ralphie',\n\t'Robertanthony',\n\t'Tomoki',\n\t'Zamuel',\n\t'Urian',\n\t'Vinayak',\n\t'Wilberth',\n\t'Jazziel',\n\t'Mizraim',\n\t'Mosiah',\n\t'Muneeb',\n\t'Lennin',\n\t'Chaitanya',\n\t'Cyrille',\n\t'Dilpreet',\n\t'Bhargav',\n\t'Captain',\n\t'Camil',\n\t'Jaion',\n\t'Eithen',\n\t'Dominyk',\n\t'Domenik',\n\t'Imad',\n\t'Dabin',\n\t'Ceejay',\n\t'Avishek',\n\t'Anoop',\n\t'Aaronjoshua',\n\t'Billal',\n\t'Euan',\n\t'Eion',\n\t'Beauregard',\n\t'Fouad',\n\t'Chriss',\n\t'Daimien',\n\t'Cyan',\n\t'Conall',\n\t'Inigo',\n\t'Jashan',\n\t'Jaicob',\n\t'Arek',\n\t'Benjaminjoseph',\n\t'Bodey',\n\t'Andrewjames',\n\t'Abdel',\n\t'Alian',\n\t'Artyom',\n\t'Anik',\n\t'Angeljesus',\n\t'Shriyan',\n\t'Sosaia',\n\t'Shabd',\n\t'Tayveon',\n\t'Samik',\n\t'Josephanthony',\n\t'Kaushal',\n\t'Gerardojr',\n\t'Haile',\n\t'Henok',\n\t'Imer',\n\t'Izaiha',\n\t'Vedanth',\n\t'Rishav',\n\t'Praveen',\n\t'Kenner',\n\t'Juanjr',\n\t'Kinan',\n\t'Maven',\n\t'Neven',\n\t'Niccolas',\n\t'Raynav',\n\t'Rani',\n\t'Noahjames',\n\t'Nirvan',\n\t'Nevaan',\n\t'Naythen',\n\t'Rhythm',\n\t'Samyak',\n\t'Sahas',\n\t'Roczen',\n\t'Kroy',\n\t'Johanna',\n\t'Miro',\n\t'Mayank',\n\t'Masson',\n\t'Yamato',\n\t'Xaden',\n\t'Vin',\n\t'Tyden',\n\t'Gaudencio',\n\t'Garreth',\n\t'Toryn',\n\t'Jaswinder',\n\t'Stiles',\n\t'Graciela',\n\t'Rutger',\n\t'Razmig',\n\t'Keo',\n\t'Kavir',\n\t'Kalev',\n\t'Kal',\n\t'Kabeer',\n\t'Jianni',\n\t'Terrace',\n\t'Vicken',\n\t'Westly',\n\t'Pardeep',\n\t'Lizeth',\n\t'Lucia',\n\t'Mandela',\n\t'Maricela',\n\t'Joshus',\n\t'Kayle',\n\t'Klyde',\n\t'Djavan',\n\t'Wang',\n\t'Aljandro',\n\t'Belisario',\n\t'Cristino',\n\t'Yihan',\n\t'Carina',\n\t'Chritian',\n\t'Juanramon',\n\t'Khan',\n\t'Jaiver',\n\t'Nefi',\n\t'Murtaza',\n\t'Raciel',\n\t'Marlene',\n\t'Maira',\n\t'Chima',\n\t'Cheenou',\n\t'Bijon',\n\t'Dorion',\n\t'Elber',\n\t'Emeka',\n\t'Ge',\n\t'Ratha',\n\t'Jaxxson',\n\t'Ryanjames',\n\t'Shannen',\n\t'Shue',\n\t'Sia',\n\t'Romaldo',\n\t'Zareh',\n\t'Tomy',\n\t'Vanna',\n\t'Xao',\n\t'Bertin',\n\t'Dhyan',\n\t'Dexton',\n\t'Esiah',\n\t'Ayce',\n\t'Avyukt',\n\t'Avner',\n\t'Caspar',\n\t'Cove',\n\t'Ciel',\n\t'Yen',\n\t'Yessenia',\n\t'Yony',\n\t'Fin',\n\t'Ezrael',\n\t'Ezel',\n\t'Ilay',\n\t'Harveer',\n\t'Hamad',\n\t'Asiah',\n\t'Ashwath',\n\t'Arcenio',\n\t'Aroldo',\n\t'Awet',\n\t'Alexx',\n\t'Arihant',\n\t'Arihaan',\n\t'Apolo',\n\t'Aero',\n\t'Advith',\n\t'Arren',\n\t'Beatriz',\n\t'Jony',\n\t'Joseramon',\n\t'Justinray',\n\t'Jamaul',\n\t'Tarren',\n\t'Cristal',\n\t'Dinh',\n\t'Chantra',\n\t'Dshawn',\n\t'Geraldine',\n\t'Fuad',\n\t'Edlin',\n\t'Jerren',\n\t'Jerrin',\n\t'Josje',\n\t'Chrystopher',\n\t'Darriel',\n\t'Takuya',\n\t'Vannak',\n\t'Zenas',\n\t'Miklos',\n\t'Marten',\n\t'Rondale',\n\t'Rothana',\n\t'Randeep',\n\t'Ryle',\n\t'Eduardoluis',\n\t'Christepher',\n\t'Davionne',\n\t'Eriverto',\n\t'Farbod',\n\t'Chauncy',\n\t'Charle',\n\t'Bayardo',\n\t'Ashneel',\n\t'Shoua',\n\t'Redmond',\n\t'Ustin',\n\t'Johnnathan',\n\t'Josephmichael',\n\t'Marisela',\n\t'Markandrew',\n\t'Michaeljoseph',\n\t'Marcua',\n\t'Nidal',\n\t'Phat',\n\t'Pritesh',\n\t'Seaver',\n\t'Ryananthony',\n\t'Tyan',\n\t'Vatche',\n\t'Thoren',\n\t'Othoniel',\n\t'Nicandro',\n\t'Rajdeep',\n\t'Tulio',\n\t'Soua',\n\t'Jovonte',\n\t'Kalyn',\n\t'Jamesryan',\n\t'Navdeep',\n\t'Maxmillian',\n\t'Kayon',\n\t'Koua',\n\t'Aaryn',\n\t'Wilver',\n\t'Zubair',\n\t'Ankush',\n\t'Andie',\n\t'Adonnis',\n\t'Jacobanthony',\n\t'Izekiel',\n\t'Izacc',\n\t'Escher',\n\t'Elijahjames',\n\t'Edrik',\n\t'Drayson',\n\t'Dj',\n\t'Giordan',\n\t'Dejaun',\n\t'Davidmichael',\n\t'Deshone',\n\t'Auron',\n\t'Auguste',\n\t'Athos',\n\t'Cutberto',\n\t'Hairo',\n\t'Anvay',\n\t'Adrick',\n\t'Aydeen',\n\t'Bassam',\n\t'Basem',\n\t'Kyrell',\n\t'Rjay',\n\t'Ozil',\n\t'Taisei',\n\t'Samanyu',\n\t'Marvion',\n\t'Mykael',\n\t'Mukund',\n\t'Namish',\n\t'Naoki',\n\t'Nishan',\n\t'Aideen',\n\t'Aalijah',\n\t'Hassani',\n\t'Harkirat',\n\t'Exzavier',\n\t'Hudsen',\n\t'Hrach',\n\t'Caelum',\n\t'Caeleb',\n\t'Destan',\n\t'Jaspal',\n\t'Huan',\n\t'Marcellous',\n\t'Mehran',\n\t'Luisfelipe',\n\t'Gelacio',\n\t'Eris',\n\t'Eneas',\n\t'Terin',\n\t'Sohrab',\n\t'Ravneet',\n\t'Uziah',\n\t'Vedansh',\n\t'Peni',\n\t'Nethaniel',\n\t'Niraj',\n\t'Odilon',\n\t'Kalden',\n\t'Mariela',\n\t'Levonte',\n\t'Elih',\n\t'Ej',\n\t'Eames',\n\t'Jarome',\n\t'Jishnu',\n\t'Gurtaaj',\n\t'Hamish',\n\t'Gryffin',\n\t'Jayin',\n\t'Trong',\n\t'Sebastain',\n\t'Sargon',\n\t'Wa',\n\t'Cheveyo',\n\t'Ariv',\n\t'Aum',\n\t'Caellum',\n\t'Bayan',\n\t'Balthazar',\n\t'Sagan',\n\t'Rowyn',\n\t'Sehaj',\n\t'Ivon',\n\t'Stavro',\n\t'Shrihan',\n\t'Noey',\n\t'Oswin',\n\t'Abrham',\n\t'Adalid',\n\t'Aldric',\n\t'Zayed',\n\t'Vonn',\n\t'Vaishnav',\n\t'Urias',\n\t'Yahshua',\n\t'Yago',\n\t'Darith',\n\t'Mantej',\n\t'Kyo',\n\t'Khyler',\n\t'Marcjacob',\n\t'Nayden',\n\t'Morrissey',\n\t'Benedicto',\n\t'Kendrix',\n\t'Xang',\n\t'Ranjit',\n\t'Raymar',\n\t'Milos',\n\t'Rayansh',\n\t'Rawley',\n\t'Paxon',\n\t'Krishang',\n\t'Leeam',\n\t'Yerick',\n\t'Yegor',\n\t'Viren',\n\t'Saathvik',\n\t'Shailen',\n\t'Sahaj',\n\t'Rydan',\n\t'Rollins',\n\t'Rivaan',\n\t'Soul',\n\t'Aerick',\n\t'Aladdin',\n\t'Catalino',\n\t'Berenice',\n\t'Branndon',\n\t'Kyleanthony',\n\t'Maclovio',\n\t'Kiven',\n\t'Johnchristopher',\n\t'Jonh',\n\t'Kassandra',\n\t'Jobanny',\n\t'Pastor',\n\t'Michaela',\n\t'Montre',\n\t'Morgen',\n\t'Gerber',\n\t'Danish',\n\t'Haroutun',\n\t'Duron',\n\t'Adrion',\n\t'Evrett',\n\t'Reegan',\n\t'Haskie',\n\t'Quamane',\n\t'Derrike',\n\t'Haydyn',\n\t'Glenville',\n\t'Dearl',\n\t'Deroe',\n\t'Dewell',\n\t'Lundy',\n\t'Cleaster',\n\t'Jeral',\n\t'Delontae',\n\t'Delford',\n\t'Argie',\n\t'Loise',\n\t'Elmar',\n\t'Donley',\n\t'Ferrel',\n\t'Carrel',\n\t'Athel',\n\t'Rector',\n\t'Cledith',\n\t'Dail',\n\t'Donzel',\n\t'Lenoard',\n\t'Winferd',\n\t'Birl',\n\t'Dorsie',\n\t'Olee',\n\t'Erman',\n\t'Dorsel',\n\t'Roma',\n\t'Othell',\n\t'Herold',\n\t'Chaffee',\n\t'Trygve',\n\t'Aubra',\n\t'Opha',\n\t'Dionne',\n\t'Colleen',\n\t'Ciara',\n\t'Cleotis',\n\t'Alissa',\n\t'Alesha',\n\t'Elise',\n\t'Emilie',\n\t'Tiera',\n\t'Tia',\n\t'Suzanne',\n\t'Jaleesa',\n\t'Jaclyn',\n\t'Ingrid',\n\t'India',\n\t'Georgia',\n\t'Francesca',\n\t'Female',\n\t'Fatima',\n\t'Rochelle',\n\t'Precious',\n\t'Nichelle',\n\t'Martina',\n\t'Lucy',\n\t'Latonya',\n\t'Cline',\n\t'Ott',\n\t'Ona',\n\t'Otmer',\n\t'Ersel',\n\t'Olufemi',\n\t'Gordy',\n\t'Marne',\n\t'Jahquez',\n\t'Daeshaun',\n\t'Nashaun',\n\t'Seiichi',\n\t'Shigeki',\n\t'Kazuto',\n\t'Shozo',\n\t'Alhaji',\n\t'Lonn',\n\t'Tevion',\n\t'Kaige',\n\t'Darlene',\n\t'Braydyn',\n\t'Masaaki',\n\t'Graeson',\n\t'Bernerd',\n\t'Lynne',\n\t'Dewaine',\n\t'Shig',\n\t'Junichi',\n\t'Toshiro',\n\t'Azavion',\n\t'Michio',\n\t'Yoshiro',\n\t'Heraldo',\n\t'Epitacio',\n\t'Mas',\n\t'Taequan',\n\t'Trindon',\n\t'Tirrell',\n\t'Dmonte',\n\t'Jaquante',\n\t'Yeeleng',\n\t'Maleik',\n\t'Airam',\n\t'Noname',\n\t'Shyhiem',\n\t'Tyquon',\n\t'Damonta',\n\t'Undray',\n\t'Shadrick',\n\t'Durwin',\n\t'Lataurus',\n\t'Corneall',\n\t'Dantonio',\n\t'Tilmon',\n\t'Mackie',\n\t'Ebbie',\n\t'Eligha',\n\t'Beth',\n\t'Barth',\n\t'Hezzie',\n\t'Artha',\n\t'Darrie',\n\t'Frederi',\n\t'Benford',\n\t'Elves',\n\t'Theodia',\n\t'Jaye',\n\t'Fran',\n\t'Khylan',\n\t'Berwyn',\n\t'Constance',\n\t'Markevion',\n\t'Martavion',\n\t'Jashun',\n\t'Jermarion',\n\t'Taylin',\n\t'Breland',\n\t'Franchot',\n\t'Chrishun',\n\t'Davarius',\n\t'Dearius',\n\t'Tredarius',\n\t'Jayland',\n\t'Cortavius',\n\t'Deyonta',\n\t'Tradarius',\n\t'Kemarrion',\n\t'Markavion',\n\t'Jmarion',\n\t'Jacarius',\n\t'Kairi',\n\t'Rasool',\n\t'Jarreau',\n\t'Khayree',\n\t'Brahin',\n\t'Hameed',\n\t'Rolen',\n\t'Cleason',\n\t'Cartez',\n\t'Nicholad',\n\t'Brahim',\n\t'Bryheem',\n\t'Khalief',\n\t'Anel',\n\t'Mcgwire',\n\t'Lula',\n\t'Gaddis',\n\t'Lowery',\n\t'Odies',\n\t'Rannie',\n\t'Artee',\n\t'Aurther',\n\t'Bookert',\n\t'Lenon',\n\t'Oree',\n\t'Gennie',\n\t'Emitt',\n\t'Sedgie',\n\t'Claudy',\n\t'Coyt',\n\t'Lieutenant',\n\t'Zannie',\n\t'Kenn',\n\t'Roosvelt',\n\t'Vertis',\n\t'Elex',\n\t'Eula',\n\t'Abron',\n\t'Perkins',\n\t'Emersyn',\n\t'Lakin',\n\t'Dravin',\n\t'Other',\n\t'President',\n\t'Carrie',\n\t'Cleother',\n\t'Estus',\n\t'Tee',\n\t'Raymont',\n\t'Woodard',\n\t'Ras',\n\t'Zennie',\n\t'Versie',\n\t'Mansfield',\n\t'Atha',\n\t'Bossie',\n\t'Smiley',\n\t'Kenard',\n\t'Jermie',\n\t'Vardell',\n\t'Kadan',\n\t'Roney',\n\t'Furney',\n\t'Caroll',\n\t'Benjy',\n\t'Shamond',\n\t'Tyrease',\n\t'Dontre',\n\t'Raekwan',\n\t'Raequon',\n\t'Chrishon',\n\t'Jahmez',\n\t'Jaques',\n\t'Zaveon',\n\t'Zaccheus',\n\t'Demaris',\n\t'Shaquile',\n\t'Shiheem',\n\t'Santario',\n\t'Monterio',\n\t'Jawaan',\n\t'Lavere',\n\t'Levere',\n\t'Guerino',\n\t'Lisle',\n\t'Fraser',\n\t'Grier',\n\t'Gurnie',\n\t'Lattie',\n\t'Wassil',\n\t'Domer',\n\t'Melio',\n\t'Zolton',\n\t'Haines',\n\t'Gervase',\n\t'Fermon',\n\t'Geneva',\n\t'Trask',\n\t'Linward',\n\t'Colen',\n\t'Dossie',\n\t'Zygmund',\n\t'Teofil',\n\t'Talbert',\n\t'Mosby',\n\t'Elworth',\n\t'Garvie',\n\t'Jiles',\n\t'Mallie',\n\t'Flay',\n\t'Stokes',\n\t'Bernis',\n\t'Gardiner',\n\t'Deno',\n\t'Algerd',\n\t'Handy',\n\t'Flake',\n\t'Hallet',\n\t'Coyte',\n\t'Wingate',\n\t'Burlie',\n\t'Sigmond',\n\t'Myrle',\n\t'Stiney',\n\t'Americus',\n\t'Claxton',\n\t'Acy',\n\t'Hill',\n\t'Fenner',\n\t'Festus',\n\t'Linnie',\n\t'Guilford',\n\t'Artice',\n\t'Constant',\n\t'Faber',\n\t'Jb',\n\t'Pleasant',\n\t'Dallis',\n\t'Vestal',\n\t'Terez',\n\t'English',\n\t'Allard',\n\t'Ingram',\n\t'Beaufort',\n\t'Chene',\n\t'Dequante',\n\t'Bubber',\n\t'Jamone',\n\t'Zebulun',\n\t'Daqwan',\n\t'Delshawn',\n\t'Jamond',\n\t'Dacota',\n\t'Wilmot',\n\t'Prue',\n\t'Wister',\n\t'Kenyata',\n\t'Darik',\n\t'Sumter',\n\t'Hovie',\n\t'Tallie',\n\t'Diontay',\n\t'Dontaye',\n\t'Brentt',\n\t'Felder',\n\t'Chappell',\n\t'Ralpheal',\n\t'Wofford',\n\t'Stclair',\n\t'Aiken',\n\t'Hashem',\n\t'Daire',\n\t'Grahm',\n\t'Jaivon',\n\t'Davarion',\n\t'Arnez',\n\t'Ryer',\n\t'Mousa',\n\t'Jahlon',\n\t'Leyland',\n\t'Maizen',\n\t'Zadyn',\n\t'Zein',\n\t'Amarri',\n\t'Hady',\n\t'Keegen',\n\t'Taeshawn',\n\t'Jontae',\n\t'Radwan',\n\t'Jsean',\n\t'Hartwell',\n\t'Roddey',\n\t'Arend',\n\t'Marjorie',\n\t'Clements',\n\t'Rae',\n\t'Pressley',\n\t'Saintclair',\n\t'Derrill',\n\t'Joann',\n\t'Cote',\n\t'Philo',\n\t'Urho',\n\t'Evart',\n\t'Vada',\n\t'Deo',\n\t'Tonie',\n\t'Irven',\n\t'Stjulian',\n\t'Durand',\n\t'Diarra',\n\t'Burnet',\n\t'Steed',\n\t'Demont',\n\t'Burris',\n\t'Donyell',\n\t'Gjon',\n\t'Demone',\n\t'Jodi',\n\t'Boban',\n\t'Brunson',\n\t'Mackey',\n\t'Delwyn',\n\t'Gordie',\n\t'Owens',\n\t'Efton',\n\t'Uel',\n\t'Ancel',\n\t'Zafir',\n\t'Kyeem',\n\t'Vencil',\n\t'Irl',\n\t'Tymeer',\n\t'Dymere',\n\t'Kier',\n\t'Murel',\n\t'Hale',\n\t'Lorn',\n\t'Tahjir',\n\t'Sufyaan',\n\t'Trig',\n\t'Yacqub',\n\t'Khadir',\n\t'Najib',\n\t'Ayuub',\n\t'Hamse',\n\t'Yassir',\n\t'Yussuf',\n\t'Abdihafid',\n\t'Abdinasir',\n\t'Abdiqani',\n\t'Tayon',\n\t'Abdirahim',\n\t'Abdishakur',\n\t'Mukhtar',\n\t'Bauer',\n\t'Damere',\n\t'Rashee',\n\t'Kalief',\n\t'Shyheed',\n\t'Dejour',\n\t'Kuran',\n\t'Qaadir',\n\t'Aldor',\n\t'Jasyah',\n\t'Hajj',\n\t'Ordell',\n\t'Gradyn',\n\t'Ayyub',\n\t'Atley',\n\t'Mahkai',\n\t'Lochlann',\n\t'Sakai',\n\t'Saamir',\n\t'Bernhardt',\n\t'Willmer',\n\t'Swen',\n\t'Hilding',\n\t'Knute',\n\t'Wael',\n\t'Thorvald',\n\t'Erle',\n\t'Melroy',\n\t'Valerian',\n\t'Jorgen',\n\t'Dacotah',\n\t'Shaydon',\n\t'Lamir',\n\t'Kahseem',\n\t'Jihaad',\n\t'Tylee',\n\t'Sakariye',\n\t'Qalid',\n\t'Syair',\n\t'Syire',\n\t'Safi',\n\t'Zaakir',\n\t'Sahmir',\n\t'Saahir',\n\t'Karlin',\n\t'Kowen',\n\t'Kahne',\n\t'Azir',\n\t'Tysir',\n\t'Maki',\n\t'Zekhi',\n\t'Pater',\n\t'Louden',\n\t'Jandiel',\n\t'Khaseem',\n\t'Livio',\n\t'Pellegrino',\n\t'Loretta',\n\t'Lothar',\n\t'Morty',\n\t'Harvard',\n\t'Jeris',\n\t'Arlene',\n\t'Salvotore',\n\t'Erasmus',\n\t'Canio',\n\t'Heywood',\n\t'Ivar',\n\t'Maitland',\n\t'Neale',\n\t'Gladys',\n\t'Ethelbert',\n\t'Fergus',\n\t'Arcangelo',\n\t'Sigismund',\n\t'Fremont',\n\t'Stillman',\n\t'Egidio',\n\t'Pincus',\n\t'Sabatino',\n\t'Solly',\n\t'Bela',\n\t'Stanly',\n\t'Faust',\n\t'Gesualdo',\n\t'Adolphe',\n\t'Ladislav',\n\t'Mandel',\n\t'Philander',\n\t'Catello',\n\t'Fordyce',\n\t'Brownie',\n\t'Darnley',\n\t'Alfio',\n\t'Emerito',\n\t'Darrly',\n\t'Delfin',\n\t'Chiam',\n\t'Beril',\n\t'Albie',\n\t'Roberts',\n\t'Ferdinando',\n\t'Maureen',\n\t'Herberto',\n\t'Lamark',\n\t'Philipp',\n\t'Uwe',\n\t'Dermott',\n\t'Amalio',\n\t'Sandford',\n\t'Shawnta',\n\t'Shannan',\n\t'Sheppard',\n\t'Jerauld',\n\t'Antoinne',\n\t'Oleh',\n\t'Tobie',\n\t'Thoms',\n\t'Valice',\n\t'Thurnell',\n\t'Deamonte',\n\t'Kendel',\n\t'Trevone',\n\t'Kaylob',\n\t'Carder',\n\t'Antrell',\n\t'Traven',\n\t'Jaymir',\n\t'Joni',\n\t'Keisean',\n\t'Krishawn',\n\t'Marquelle',\n\t'Dearis',\n\t'Delvonte',\n\t'Jamez',\n\t'Zebadiah',\n\t'Kreig',\n\t'Teran',\n\t'Resean',\n\t'Zackory',\n\t'Lamontae',\n\t'Albieri',\n\t'Albiery',\n\t'Chen',\n\t'Alexy',\n\t'Arslan',\n\t'Taliek',\n\t'Nakhi',\n\t'Naphtali',\n\t'Papa',\n\t'Pesach',\n\t'Michoel',\n\t'Salih',\n\t'Harshdeep',\n\t'Elhadj',\n\t'Izzy',\n\t'Jahkai',\n\t'Tyliek',\n\t'Vasilis',\n\t'Yaacov',\n\t'Sohaib',\n\t'Yissochor',\n\t'Mir',\n\t'Jasin',\n\t'Jensy',\n\t'Rehman',\n\t'Nazeer',\n\t'Jahmil',\n\t'Enson',\n\t'Nasif',\n\t'Rizwan',\n\t'Samiul',\n\t'Rahat',\n\t'Angelos',\n\t'Avroham',\n\t'Abdulai',\n\t'Adir',\n\t'Enes',\n\t'Yishay',\n\t'Doyt',\n\t'Gal',\n\t'Shoaib',\n\t'Quaron',\n\t'Ishraq',\n\t'Nazaire',\n\t'Nyzaiah',\n\t'Mattia',\n\t'Javone',\n\t'Mahesh',\n\t'Mamady',\n\t'Johnattan',\n\t'Jorman',\n\t'Kaliq',\n\t'Devendra',\n\t'Burhan',\n\t'Zishe',\n\t'Zeandre',\n\t'Arel',\n\t'Shalik',\n\t'Shameer',\n\t'Nisson',\n\t'Ralik',\n\t'Agim',\n\t'Amauris',\n\t'Atif',\n\t'Samory',\n\t'Shatiek',\n\t'Taner',\n\t'Rafat',\n\t'Zhen',\n\t'Radhames',\n\t'Raliek',\n\t'Ronel',\n\t'Sabbir',\n\t'Saqib',\n\t'Jeudy',\n\t'Hesham',\n\t'Hyun',\n\t'Lakeem',\n\t'Mishael',\n\t'Ivo',\n\t'Tajay',\n\t'Taleek',\n\t'Tishawn',\n\t'Tyreem',\n\t'Samori',\n\t'Nickholas',\n\t'Pearse',\n\t'Mamadi',\n\t'Elhadji',\n\t'Dawood',\n\t'Dilon',\n\t'Ishmel',\n\t'Yiannis',\n\t'Jahquel',\n\t'Jahquell',\n\t'El',\n\t'Equan',\n\t'Ho',\n\t'Delno',\n\t'Dinesh',\n\t'Damel',\n\t'Temitayo',\n\t'Tenzing',\n\t'Wahab',\n\t'Alisher',\n\t'Adonijah',\n\t'Bradan',\n\t'Efrayim',\n\t'Elnatan',\n\t'Elmin',\n\t'Hossain',\n\t'Eliav',\n\t'Azimjon',\n\t'Dovber',\n\t'Sheya',\n\t'Yahia',\n\t'Jasani',\n\t'Liav',\n\t'Kamare',\n\t'Kaysean',\n\t'Kinsley',\n\t'Nikoloz',\n\t'Nyrell',\n\t'Wyeth',\n\t'Jeremaih',\n\t'Mahin',\n\t'Matis',\n\t'Oriel',\n\t'Mourad',\n\t'Shmeil',\n\t'Messi',\n\t'Jonibek',\n\t'Jeyren',\n\t'Keyden',\n\t'Temur',\n\t'Tanveer',\n\t'Zyir',\n\t'Zidan',\n\t'Zayyan',\n\t'Varick',\n\t'Wesam',\n\t'Abdoulie',\n\t'Aqib',\n\t'Asani',\n\t'Bless',\n\t'Hasnain',\n\t'Hamdan',\n\t'Getzel',\n\t'Fatin',\n\t'Huzaifa',\n\t'Jarif',\n\t'Jahlani',\n\t'Davier',\n\t'Chuna',\n\t'Eashan',\n\t'Rafan',\n\t'Rakin',\n\t'Ngawang',\n\t'Mouhamad',\n\t'Rohaan',\n\t'Vanness',\n\t'Volvy',\n\t'Javel',\n\t'Jabir',\n\t'Jaevion',\n\t'Fahd',\n\t'Lean',\n\t'Machai',\n\t'Juniel',\n\t'Kaylin',\n\t'Jeremiyah',\n\t'Matisyahu',\n\t'Menasha',\n\t'Mikaeel',\n\t'Gaspard',\n\t'Lorik',\n\t'Shuaib',\n\t'Seif',\n\t'Shlomy',\n\t'Shneor',\n\t'Sonam',\n\t'Volf',\n\t'Yussef',\n\t'Ziv',\n\t'Krrish',\n\t'Machi',\n\t'Endi',\n\t'Frederik',\n\t'Abdo',\n\t'Alif',\n\t'Elchanan',\n\t'Yordy',\n\t'Shafin',\n\t'Siam',\n\t'Furkan',\n\t'Fallou',\n\t'Devyne',\n\t'Chaskel',\n\t'Arbi',\n\t'Younes',\n\t'Ziare',\n\t'Tanyon',\n\t'Terique',\n\t'Nicholaos',\n\t'Nickita',\n\t'Mordchai',\n\t'Saifullah',\n\t'Saliou',\n\t'Savier',\n\t'Jahmiere',\n\t'Jahson',\n\t'Javoni',\n\t'Jayel',\n\t'Jie',\n\t'Kwadwo',\n\t'Kahmani',\n\t'Johansel',\n\t'Murat',\n\t'Nasire',\n\t'Nezar',\n\t'Seydou',\n\t'Jamair',\n\t'Jahmeer',\n\t'Chanina',\n\t'Chezky',\n\t'Zyire',\n\t'Yoscar',\n\t'Alassane',\n\t'Aitan',\n\t'Dannon',\n\t'Donelle',\n\t'Harrington',\n\t'Sha',\n\t'Shamal',\n\t'Josph',\n\t'Torrell',\n\t'Ralphy',\n\t'Sharron',\n\t'Eleftherios',\n\t'Gedalia',\n\t'Kasheen',\n\t'Manoj',\n\t'Nuri',\n\t'Daran',\n\t'Devanand',\n\t'Evagelos',\n\t'Fatmir',\n\t'Haralambos',\n\t'Biju',\n\t'Nilson',\n\t'Wane',\n\t'Tarig',\n\t'Rober',\n\t'Sharone',\n\t'Lezer',\n\t'Odalis',\n\t'Glenston',\n\t'Josip',\n\t'Kostantinos',\n\t'Rahshawn',\n\t'Osei',\n\t'Shariyf',\n\t'Sotirios',\n\t'Aneudi',\n\t'Marios',\n\t'Biff',\n\t'Damiano',\n\t'Shean',\n\t'Rajendra',\n\t'Mare',\n\t'Richad',\n\t'Jaja',\n\t'Efstathios',\n\t'Nephtali',\n\t'Kowan',\n\t'Rhonda',\n\t'Pasqualino',\n\t'Confesor',\n\t'Linc',\n\t'Safet',\n\t'Sharrieff',\n\t'Kiron',\n\t'Damain',\n\t'Aurohom',\n\t'Kariem',\n\t'Tiheim',\n\t'Dushawn',\n\t'Kindu',\n\t'Aswad',\n\t'Kwane',\n\t'Oba',\n\t'Jermayne',\n\t'Dakeem',\n\t'Babatunde',\n\t'Ackeem',\n\t'Alvi',\n\t'Adetokunbo',\n\t'Akeel',\n\t'Kedwin',\n\t'Kayron',\n\t'Mergim',\n\t'Wilkins',\n\t'Wojciech',\n\t'Omair',\n\t'Kushtrim',\n\t'Kwamel',\n\t'Saiquan',\n\t'Naquon',\n\t'Quandell',\n\t'Veton',\n\t'Shaune',\n\t'Daguan',\n\t'Duquan',\n\t'Jency',\n\t'Ka',\n\t'Waqas',\n\t'Xiao',\n\t'Mahlik',\n\t'Kasiem',\n\t'Navindra',\n\t'Sayquan',\n\t'Shaquon',\n\t'Shiquan',\n\t'Rameek',\n\t'Jerelle',\n\t'Devaun',\n\t'Jakim',\n\t'Jaquell',\n\t'Eury',\n\t'Shaiquan',\n\t'Shakeal',\n\t'Shakiem',\n\t'Shaleek',\n\t'Ramesh',\n\t'Suhail',\n\t'Tylique',\n\t'Jawanza',\n\t'Jonell',\n\t'Hamdi',\n\t'Jaimeson',\n\t'Kerven',\n\t'Demetreus',\n\t'Giselle',\n\t'Aikeem',\n\t'Akiem',\n\t'Rondel',\n\t'Dow',\n\t'Gregroy',\n\t'Darnelle',\n\t'Naguan',\n\t'Tyronn',\n\t'Ricke',\n\t'Dishawn',\n\t'Rishawn',\n\t'Tarick',\n\t'Tynell',\n\t'Japhet',\n\t'Francesc',\n\t'Maximili',\n\t'Herby',\n\t'Jaqwan',\n\t'Kemal',\n\t'Akeen',\n\t'Azeez',\n\t'Devindra',\n\t'Deryck',\n\t'Deval',\n\t'Alessand',\n\t'Masood',\n\t'Uladimir',\n\t'Cadon',\n\t'Quanah',\n\t'Zimere',\n\t'Chatham',\n\t'Koi',\n\t'Zymire',\n\t'Jamaury',\n\t'Jahmire',\n\t'Ziyan',\n\t'Cowen',\n\t'Jamaurie',\n\t'Nyquan',\n\t'Jayleen',\n\t'Zymiere',\n\t'Zymarion',\n\t'Kahmari',\n\t'Langdon',\n\t'Zymari',\n\t'Jymir',\n\t'Kamaree',\n\t'Nycere',\n\t'Sayvion',\n\t'Jahmarion',\n\t'Justyce',\n\t'Tuck',\n\t'Thayer',\n\t'Mung',\n\t'Graison',\n\t'Delane',\n\t'Lemoyne',\n\t'Cinch',\n\t'Nevada',\n\t'Dhairya',\n\t'Jyaire',\n\t'Yazir',\n\t'Tahjmir',\n\t'Sequoyah',\n\t'Quention',\n\t'Tanmay',\n\t'Shreyansh',\n\t'Ahyan',\n\t'Aaryav',\n\t'Zaylin',\n\t'Laksh',\n\t'Basheer',\n\t'Bhavik',\n\t'Orley',\n\t'Vestel',\n\t'Altus',\n\t'Choice',\n\t'Bufford',\n\t'Quasir',\n\t'Emry',\n\t'Tressel',\n\t'Eppie',\n\t'Jayvier',\n\t'Prestin',\n\t'Haydin',\n\t'Caydan',\n\t'Corday',\n\t'Camdin',\n\t'Brodyn',\n\t'Liberato',\n\t'Trayon',\n\t'Telesfor',\n\t'Jayko',\n\t'Lavi',\n\t'Procopio',\n\t'Rubel',\n\t'Karder',\n\t'Jaymar',\n\t'Bryor',\n\t'Gottlob',\n\t'Saladin',\n\t'Tunis',\n\t'Saheed',\n\t'Alsexander',\n\t'Davonn',\n\t'Jaquill',\n\t'Shakeil',\n\t'Krunal',\n\t'Tashon',\n\t'Doyel',\n\t'Odes',\n\t'Thoams',\n\t'Rasul',\n\t'Wendyl',\n\t'Glendale',\n\t'Ahmid',\n\t'Altarik',\n\t'Amish',\n\t'Jaquis',\n\t'Dashan',\n\t'Salaam',\n\t'Bhavin',\n\t'Nashid',\n\t'Tauheed',\n\t'Jamill',\n\t'Cordney',\n\t'Derly',\n\t'Jamale',\n\t'Hristopher',\n\t'Camaron',\n\t'Domanique',\n\t'Desmund',\n\t'Keenon',\n\t'Paulanthony',\n\t'Demarques',\n\t'Meryl',\n\t'Medard',\n\t'Erbey',\n\t'Adrin',\n\t'Evo',\n\t'Pal',\n\t'Deke',\n\t'Glendal',\n\t'Tramayne',\n\t'Aloysuis',\n\t'Berthal',\n\t'Ashly',\n\t'Arien',\n\t'Teodulo',\n\t'Johsua',\n\t'Kelwin',\n\t'Quintan',\n\t'Mauel',\n\t'Quisto',\n\t'Gaylin',\n\t'Trayvion',\n\t'Tracer',\n\t'Ramsay',\n\t'Verlan',\n\t'Kyndal',\n\t'Donovon',\n\t'Samuell',\n\t'Treyveon',\n\t'Nereo',\n\t'Areli',\n\t'Dashun',\n\t'Devontre',\n\t'Stran',\n\t'Zarian',\n\t'Pacen',\n\t'Kamakani',\n\t'Alii',\n\t'Chidozie',\n\t'Cobie',\n\t'Acxel',\n\t'Jatavian',\n\t'Kelvon',\n\t'Keldon',\n\t'Giezi',\n\t'Gavon',\n\t'Virtus',\n\t'Burdell',\n\t'Dorrance',\n\t'Naail',\n\t'Lantz',\n\t'Travian',\n\t'Cleland',\n\t'Arish',\n\t'Elyan',\n\t'Chukwudi',\n\t'Shahrukh',\n\t'Coulter',\n\t'Karver',\n\t'Seeley',\n\t'Wynton',\n\t'Detric',\n\t'Quenten',\n\t'Joemichael',\n\t'Daruis',\n\t'Tyeler',\n\t'Montray',\n\t'Hermenegildo',\n\t'Donathan',\n\t'Mckenna',\n\t'Kijuan',\n\t'Braijon',\n\t'Vashawn',\n\t'Darvell',\n\t'Kennie',\n\t'Rejino',\n\t'Vickey',\n\t'Lyndall',\n\t'Reynoldo',\n\t'Malyk',\n\t'Armarion',\n\t'Brit',\n\t'Trayshawn',\n\t'Contrell',\n\t'Eutimio',\n\t'Dantrel',\n\t'Darrious',\n\t'Dawon',\n\t'Richey',\n\t'Arrion',\n\t'Zohair',\n\t'Randale',\n\t'Keyshone',\n\t'Kiwane',\n\t'Jibri',\n\t'Devell',\n\t'Beto',\n\t'Jaymz',\n\t'Ritchey',\n\t'Tremel',\n\t'Keante',\n\t'Vontrell',\n\t'Guadlupe',\n\t'Esiquiel',\n\t'Erasto',\n\t'Dub',\n\t'Augustas',\n\t'Panfilo',\n\t'Vuk',\n\t'Mickie',\n\t'Javonni',\n\t'Riddick',\n\t'Nikodem',\n\t'Marrion',\n\t'Kamareon',\n\t'Maks',\n\t'Eliverto',\n\t'Cresenciano',\n\t'Jerrol',\n\t'Joakim',\n\t'Maddax',\n\t'Kayvion',\n\t'Khizar',\n\t'Haze',\n\t'Aveon',\n\t'Amjad',\n\t'Audwin',\n\t'Almir',\n\t'Vicky',\n\t'Lonell',\n\t'Jabarie',\n\t'Jaylun',\n\t'Damarrion',\n\t'Mantas',\n\t'Dannye',\n\t'Aadarsh',\n\t'Caelen',\n\t'Tilton',\n\t'Kimmie',\n\t'Josgar',\n\t'Oleksandr',\n\t'Keyontae',\n\t'Fidelio',\n\t'Wiktor',\n\t'Maxymilian',\n\t'Cayce',\n\t'Rodric',\n\t'Manrique',\n\t'Kestutis',\n\t'Donnald',\n\t'Grayland',\n\t'Lavance',\n\t'Medgar',\n\t'Chaney',\n\t'Monta',\n\t'Lemond',\n\t'Medford',\n\t'Mareo',\n\t'Camerino',\n\t'Ronold',\n\t'Lancer',\n\t'Credell',\n\t'Elbridge',\n\t'Stony',\n\t'Dvid',\n\t'Hilberto',\n\t'Erineo',\n\t'Jerrald',\n\t'Antawan',\n\t'Cordario',\n\t'Levelle',\n\t'Ramsen',\n\t'Jigar',\n\t'Laroyce',\n\t'Lazerrick',\n\t'Artez',\n\t'Cordelro',\n\t'Creon',\n\t'Lonzell',\n\t'Shanton',\n\t'Orpheus',\n\t'Terris',\n\t'Renauld',\n\t'Deondra',\n\t'Fontaine',\n\t'Airrion',\n\t'Branko',\n\t'Enemencio',\n\t'Antiono',\n\t'Caprice',\n\t'Danyale',\n\t'Valdez',\n\t'Oswell',\n\t'Tahitoa',\n\t'Fannie',\n\t'Estes',\n\t'Herchel',\n\t'Seabron',\n\t'Bunyan',\n\t'Thelmon',\n\t'Agnew',\n\t'Broughton',\n\t'Harwell',\n\t'Mather',\n\t'Quillie',\n\t'Hardwick',\n\t'Phinizy',\n\t'Pope',\n\t'Addis',\n\t'Seals',\n\t'Thelman',\n\t'Summie',\n\t'Romano',\n\t'Zacari',\n\t'Kortney',\n\t'Makye',\n\t'Graycen',\n\t'Kavari',\n\t'Kamarri',\n\t'Ajahni',\n\t'Dayan',\n\t'Sharrod',\n\t'Pheonix',\n\t'Trentyn',\n\t'Jacai',\n\t'Jamesley',\n\t'Destyn',\n\t'Maddon',\n\t'Gianlucas',\n\t'Aydrian',\n\t'Bader',\n\t'Jaise',\n\t'Godson',\n\t'Gleb',\n\t'Jatniel',\n\t'Yaxiel',\n\t'Marvins',\n\t'Miron',\n\t'Yaroslav',\n\t'Legrande',\n\t'Lonzy',\n\t'Merrell',\n\t'Flemming',\n\t'Guerry',\n\t'Kimothy',\n\t'Remus',\n\t'Wyndell',\n\t'Barnard',\n\t'Denorris',\n\t'Edna',\n\t'Bevan',\n\t'Warnell',\n\t'Josie',\n\t'Arthor',\n\t'Theartis',\n\t'Kimsey',\n\t'Wymon',\n\t'Duglas',\n\t'Reshawn',\n\t'Natrone',\n\t'Treysen',\n\t'Davaris',\n\t'Jocqui',\n\t'Traivon',\n\t'Trevonne',\n\t'Tavarious',\n\t'Monson',\n\t'Kevis',\n\t'Ladonte',\n\t'Mackenson',\n\t'Bodee',\n\t'Chayden',\n\t'Dequon',\n\t'Keiondre',\n\t'Dewan',\n\t'Taige',\n\t'Renel',\n\t'Jasher',\n\t'Bayler',\n\t'Dodger',\n\t'Tyke',\n\t'Jarvin',\n\t'Edner',\n\t'Travonn',\n\t'Traxton',\n\t'Malosi',\n\t'Lavonta',\n\t'Janard',\n\t'Kyzer',\n\t'Packer',\n\t'Travoris',\n\t'Frantzy',\n\t'Makay',\n\t'Tamari',\n\t'Kanard',\n\t'Dairon',\n\t'Gabriell',\n\t'Kemaury',\n\t'Jshaun',\n\t'Karel',\n\t'Jakarri',\n\t'Rubens',\n\t'Zamauri',\n\t'Winsley',\n\t'Giulian',\n\t'Yosbel',\n\t'Kevaughn',\n\t'Jimson',\n\t'Kendly',\n\t'Dishon',\n\t'Dallyn',\n\t'Jephthe',\n\t'Luccas',\n\t'Kemuel',\n\t'Eddrick',\n\t'Ahmarion',\n\t'Amariyon',\n\t'Artavis',\n\t'Dewin',\n\t'Jacarie',\n\t'Jahn',\n\t'Janari',\n\t'Geordy',\n\t'Mardochee',\n\t'Jimari',\n\t'Yoshinobu',\n\t'Eiji',\n\t'Yasunobu',\n\t'Koon',\n\t'Hidemi',\n\t'Norio',\n\t'Kiyomi',\n\t'Shuichi',\n\t'Kazuyoshi',\n\t'Yoshitaka',\n\t'Kanji',\n\t'Tetsuro',\n\t'Asao',\n\t'Dominador',\n\t'Shogo',\n\t'Jakye',\n\t'Braelin',\n\t'Chrisangel',\n\t'Calab',\n\t'Morio',\n\t'Seiki',\n\t'Tsuyoshi',\n\t'Soichi',\n\t'Masakatsu',\n\t'Tadayoshi',\n\t'Tokuichi',\n\t'Yoshikatsu',\n\t'Matsuichi',\n\t'Lorrin',\n\t'Javeion',\n\t'Kail',\n\t'Jvon',\n\t'Joshwa',\n\t'Keylen',\n\t'Rylon',\n\t'Oved',\n\t'Kraven',\n\t'Koben',\n\t'Klever',\n\t'Nedved',\n\t'Dago',\n\t'Cortlen',\n\t'Reeves',\n\t'Yhair',\n\t'Xane',\n\t'Jamori',\n\t'Jayshon',\n\t'Jaiveon',\n\t'Joseth',\n\t'Drelynn',\n\t'Haldrin',\n\t'Keelyn',\n\t'Nathanuel',\n\t'Kvon',\n\t'Jayln',\n\t'Khyrie',\n\t'Zayveon',\n\t'Braxston',\n\t'Jaceion',\n\t'Jonavon',\n\t'Jesaiah',\n\t'Gaddiel',\n\t'Tobyn',\n\t'Becket',\n\t'Aydyn',\n\t'Arinze',\n\t'Dacian',\n\t'Aadin',\n\t'Fender',\n\t'Brysun',\n\t'Demarious',\n\t'Kaimi',\n\t'Ryson',\n\t'Jarrin',\n\t'Maleko',\n\t'Kamakana',\n\t'Kamalani',\n\t'Johnavon',\n\t'Kawena',\n\t'Aadil',\n\t'Blayde',\n\t'Garyn',\n\t'Izaih',\n\t'Bryndon',\n\t'Drelyn',\n\t'Demarian',\n\t'Kupaa',\n\t'Nalu',\n\t'Makena',\n\t'Lawaia',\n\t'Kaimalu',\n\t'Kanaloa',\n\t'Oshen',\n\t'Mj',\n\t'Kahekili',\n\t'Koalii',\n\t'Makua',\n\t'Promise',\n\t'Keylin',\n\t'Kevondrick',\n\t'Tobenna',\n\t'Infantboy',\n\t'Oluwatimilehin',\n\t'Nathanal',\n\t'Zakkery',\n\t'Shariq',\n\t'Sadler',\n\t'Rockne',\n\t'Drelon',\n\t'Ethon',\n\t'Catcher',\n\t'Clayten',\n\t'Kaniela',\n\t'Isaack',\n\t'Josten',\n\t'Zarius',\n\t'Tayte',\n\t'Ugochukwu',\n\t'Aiman',\n\t'Eduar',\n\t'Basel',\n\t'Canton',\n\t'Dyron',\n\t'Keaden',\n\t'Kayceon',\n\t'Kyrian',\n\t'Kree',\n\t'Jj',\n\t'Iaan',\n\t'Hudsyn',\n\t'Graceson',\n\t'Gatlyn',\n\t'Eydan',\n\t'Jak',\n\t'Townsend',\n\t'Owais',\n\t'Nandan',\n\t'Rayland',\n\t'Ridhaan',\n\t'Dantavious',\n\t'Lavoris',\n\t'Maricus',\n\t'Rodrigus',\n\t'Aayansh',\n\t'Chasten',\n\t'Durante',\n\t'Johnta',\n\t'Detavious',\n\t'Donterrius',\n\t'Rilyn',\n\t'Rilee',\n\t'Marquize',\n\t'Quinterius',\n\t'Jamarco',\n\t'Quinnton',\n\t'Deston',\n\t'Aceson',\n\t'Britten',\n\t'Adric',\n\t'Tabias',\n\t'Lajarvis',\n\t'Corderius',\n\t'Romon',\n\t'Que',\n\t'Nord',\n\t'Lerone',\n\t'Skylan',\n\t'Tobi',\n\t'Mccrae',\n\t'Mathayus',\n\t'Marcuz',\n\t'Levii',\n\t'Lander',\n\t'Oluwadarasimi',\n\t'Miklo',\n\t'Nijah',\n\t'Nero',\n\t'Quavis',\n\t'Zailyn',\n\t'Whitman',\n\t'Zavior',\n\t'Zlatan',\n\t'Crixus',\n\t'Cotton',\n\t'Chukwuebuka',\n\t'Draden',\n\t'Caston',\n\t'Aceyn',\n\t'Caeson',\n\t'Brax',\n\t'Azel',\n\t'Kaisyn',\n\t'Hunt',\n\t'Gaius',\n\t'Gabrian',\n\t'Falcon',\n\t'Iyan',\n\t'Jayjay',\n\t'Altonio',\n\t'Woodruff',\n\t'Tavare',\n\t'Kawaski',\n\t'Dontravious',\n\t'Gabreil',\n\t'Holten',\n\t'Dayvian',\n\t'Brennyn',\n\t'Chayson',\n\t'Dailon',\n\t'Keyshun',\n\t'Jaryn',\n\t'Jamyron',\n\t'Jakavion',\n\t'July',\n\t'Jonanthony',\n\t'Trenden',\n\t'Tobechukwu',\n\t'Yostin',\n\t'Casin',\n\t'Kaydyn',\n\t'Jshawn',\n\t'Keaghan',\n\t'Khalen',\n\t'Haylen',\n\t'Jamarques',\n\t'Alyjah',\n\t'Baylon',\n\t'Kemontae',\n\t'Taysean',\n\t'Slaton',\n\t'Saxton',\n\t'Yadir',\n\t'Tramon',\n\t'Traevion',\n\t'Raydon',\n\t'Raahim',\n\t'Olamide',\n\t'Oreoluwa',\n\t'Zyien',\n\t'Zayde',\n\t'Marqavious',\n\t'Marquavis',\n\t'Trevious',\n\t'Zyshonne',\n\t'Quindarrius',\n\t'Quintarious',\n\t'Quinterious',\n\t'Rodarius',\n\t'Deontavious',\n\t'Champion',\n\t'Decklan',\n\t'Daxx',\n\t'Pecos',\n\t'Jovonni',\n\t'Jaydrian',\n\t'Montravius',\n\t'Gunter',\n\t'Zerrick',\n\t'Quontavious',\n\t'Ayeden',\n\t'Audi',\n\t'Bentlie',\n\t'Brek',\n\t'Travonne',\n\t'Daquavious',\n\t'Jartavious',\n\t'Keldric',\n\t'Alezander',\n\t'Kamen',\n\t'Taytum',\n\t'Siler',\n\t'Yavuz',\n\t'Zaniel',\n\t'Yuriel',\n\t'Draiden',\n\t'Axzel',\n\t'Castin',\n\t'Keeland',\n\t'Jrake',\n\t'Jonhatan',\n\t'Jeziel',\n\t'Javery',\n\t'Severino',\n\t'Olavi',\n\t'Benoit',\n\t'Phillips',\n\t'Lothrop',\n\t'Konstanty',\n\t'Mato',\n\t'Carney',\n\t'Keithen',\n\t'Easley',\n\t'Chanler',\n\t'Erbie',\n\t'Ephriam',\n\t'Kentravion',\n\t'Kesan',\n\t'Ladamien',\n\t'Treshun',\n\t'Jakyron',\n\t'Burch',\n\t'Kaston',\n\t'Kyndall',\n\t'Jarden',\n\t'Shields',\n\t'Jontrell',\n\t'Thales',\n\t'Minnis',\n\t'Ida',\n\t'Hildred',\n\t'Helder',\n\t'Fernell',\n\t'Shone',\n\t'Laterrance',\n\t'Tuyen',\n\t'Roshun',\n\t'Vincient',\n\t'Ory',\n\t'Hilman',\n\t'Calton',\n\t'Clydell',\n\t'Vick',\n\t'Derrin',\n\t'Silton',\n\t'Tandy',\n\t'Emeal',\n\t'Rual',\n\t'Cardarius',\n\t'Jylan',\n\t'Hodge',\n\t'Charls',\n\t'Jacobey',\n\t'Jaqualon',\n\t'Jyrin',\n\t'Calib',\n\t'Fowler',\n\t'Kalep',\n\t'Osco',\n\t'Treylan',\n\t'Paschal',\n\t'Lowry',\n\t'Tydrick',\n\t'Ladavion',\n\t'Roe',\n\t'Jarmall',\n\t'Josuha',\n\t'Quindell',\n\t'Tra',\n\t'Jamaria',\n\t'Jermicheal',\n\t'Hobie',\n\t'Oluwaseun',\n\t'Trimayne',\n\t'Kaire',\n\t'Katrell',\n\t'Tradd',\n\t'Yohannes',\n\t'Oluwaseyi',\n\t'Tyski',\n\t'Lansana',\n\t'Tion',\n\t'Delontay',\n\t'Tavone',\n\t'Quante',\n\t'Taavon',\n\t'Daquane',\n\t'Burleigh',\n\t'Eyoel',\n\t'Cung',\n\t'Khodee',\n\t'Emilien',\n\t'Laurien',\n\t'Leonide',\n\t'Loomis',\n\t'Antrone',\n\t'Sewall',\n\t'Nicollas',\n\t'Vitor',\n\t'Jaythian',\n\t'Jasaun',\n\t'Tighe',\n\t'Colman',\n\t'Antionne',\n\t'Nygel',\n\t'Garnell',\n\t'Jamareon',\n\t'Alvey',\n\t'Carvel',\n\t'Carville',\n\t'Carlester',\n\t'Rutledge',\n\t'Mills',\n\t'Rayner',\n\t'Doil',\n\t'Gregario',\n\t'Aniseto',\n\t'Audon',\n\t'Brevyn',\n\t'Pio',\n\t'Tanis',\n\t'Jasinto',\n\t'Jaxtin',\n\t'Nugent',\n\t'Eldredge',\n\t'Egon',\n\t'Jong',\n\t'Pancho',\n\t'Lionardo',\n\t'Susano',\n\t'Trueman',\n\t'Braxtin',\n\t'Delphine',\n\t'Harroll',\n\t'Goree',\n\t'Manuela',\n\t'Epigmenio',\n\t'Laureano',\n\t'Josefina',\n\t'Tiodoro',\n\t'Silbestre',\n\t'Patrocinio',\n\t'Corando',\n\t'Maciah',\n\t'Quintyn',\n\t'Wrigley',\n\t'Onie',\n\t'Noal',\n\t'Duward',\n\t'Filomeno',\n\t'Cleburn',\n\t'Garvis',\n\t'Bisente',\n\t'Cedell',\n\t'Jap',\n\t'Rube',\n\t'Mavis',\n\t'Jarold',\n\t'Hijinio',\n\t'Dewie',\n\t'Trinida',\n\t'Jung',\n\t'Byrd',\n\t'Mcadoo',\n\t'Floy',\n\t'Eldie',\n\t'Volney',\n\t'Saragosa',\n\t'Derward',\n\t'Francico',\n\t'Genovevo',\n\t'Lindley',\n\t'Lasalle',\n\t'Borden',\n\t'Bonny',\n\t'Claudis',\n\t'Silberio',\n\t'Asuncion',\n\t'Rolly',\n\t'Doak',\n\t'Luvender',\n\t'Thurl',\n\t'Garl',\n\t'Arvine',\n\t'Johnnye',\n\t'Emiterio',\n\t'Crisoforo',\n\t'Eulojio',\n\t'Edell',\n\t'Infboy',\n\t'Ural',\n\t'Natalia',\n\t'Delia',\n\t'Acencion',\n\t'Joas',\n\t'Keagon',\n\t'Reice',\n\t'Esperanza',\n\t'Velton',\n\t'Eufemio',\n\t'Frumencio',\n\t'Dominga',\n\t'Eutiquio',\n\t'Dois',\n\t'Gean',\n\t'Odaniel',\n\t'Lyndel',\n\t'Kreigh',\n\t'Bobbye',\n\t'Rogue',\n\t'Deundra',\n\t'Cambron',\n\t'Kaitlynn',\n\t'Kayleigh',\n\t'Hailee',\n\t'Piper',\n\t'Sofia',\n\t'Carly',\n\t'Abigayle',\n\t'Angelina',\n\t'Tavish',\n\t'Christophere',\n\t'Anterrio',\n\t'Thimothy',\n\t'Montarius',\n\t'Marquarius',\n\t'Labradford',\n\t'Lawless',\n\t'Lenis',\n\t'Camile',\n\t'Tonya',\n\t'Hersey',\n\t'Abbie',\n\t'Loveless',\n\t'Aristide',\n\t'Ovey',\n\t'Ovide',\n\t'Robley',\n\t'Elward',\n\t'Leory',\n\t'Earlis',\n\t'Gaynell',\n\t'Printes',\n\t'Elzy',\n\t'Aswell',\n\t'Waver',\n\t'Wilma',\n\t'Minos',\n\t'Euclide',\n\t'Aster',\n\t'Demarrion',\n\t'Selbert',\n\t'Stoy',\n\t'Brack',\n\t'Strother',\n\t'Osa',\n\t'Ovel',\n\t'Custer',\n\t'Keveon',\n\t'Lenvil',\n\t'Hargus',\n\t'Kline',\n\t'Goldie',\n\t'Warfield',\n\t'Wavy',\n\t'Carless',\n\t'Proctor',\n\t'Holston',\n\t'Philopateer',\n\t'Loman',\n\t'Vernis',\n\t'Forster',\n\t'Jakie',\n\t'Martavis',\n\t'Louard',\n\t'Corbet',\n\t'Waldon',\n\t'Cluster',\n\t'Lafe',\n\t'Tayshun',\n\t'Browder',\n\t'Moss',\n\t'Rudell',\n\t'Loyde',\n\t'Glendel',\n\t'Elby',\n\t'Shafter',\n\t'Camila',\n\t'Elaine',\n\t'Scarlett',\n\t'Gertrude',\n\t'Bella',\n\t'Penelope',\n\t'Cathy',\n\t'Lizbeth',\n\t'Arianna',\n\t'Agnes',\n\t'Vicki',\n\t'Mila',\n\t'Ximena',\n\t'Delilah',\n\t'Stella',\n\t'Miranda',\n\t'Valentina',\n\t'Rosemary',\n\t'Khloe',\n\t'Heidi',\n\t'Desiree',\n\t'Violet',\n\t'Gianna',\n\t'Nayeli',\n\t'Luna',\n\t'Doreen',\n\t'Jennie',\n\t'Roberta',\n\t'Sheri',\n\t'Jeanne',\n\t'Alina',\n\t'Celeste',\n\t'Rosalie',\n\t'Naomi',\n\t'Teri',\n\t'Maryann',\n\t'Glenda',\n\t'Lynda',\n\t'Annabelle',\n\t'Antoinette',\n\t'Stephani',\n\t'Marcia',\n\t'Sherri',\n\t'Clara',\n\t'Julissa',\n\t'Becky',\n\t'Marianne',\n\t'Melody',\n\t'Sadie',\n\t'Sienna',\n\t'Marsha',\n\t'Belinda',\n\t'Jaylah',\n\t'Harriet',\n\t'Kristine',\n\t'Elizabet',\n\t'Paisley',\n\t'Genevieve',\n\t'Melinda',\n\t'Leilani',\n\t'Aubree',\n\t'Keira',\n\t'Kristy',\n\t'Sheryl',\n\t'Fernanda',\n\t'Tami',\n\t'Daleyza',\n\t'Rosemarie',\n\t'Francine',\n\t'Kristi',\n\t'Jaqueline',\n\t'Meagan',\n\t'Nichole',\n\t'Athena',\n\t'Anahi',\n\t'Marisa',\n\t'Yaretzi',\n\t'Lena',\n\t'Serena',\n\t'Miley',\n\t'Izabella',\n\t'Kate',\n\t'Joselyn',\n\t'Margie',\n\t'Krystle',\n\t'Dulce',\n\t'Pam',\n\t'Traci',\n\t'Mikayla',\n\t'Shari',\n\t'Delores',\n\t'Nellie',\n\t'Gisselle',\n\t'Blanche',\n\t'Clarissa',\n\t'Dianne',\n\t'Maxine',\n\t'Janis',\n\t'Carmela',\n\t'Mabel',\n\t'Estrella',\n\t'Emely',\n\t'Viola',\n\t'Penny',\n\t'Viviana',\n\t'Estelle',\n\t'Krista',\n\t'Adalynn',\n\t'Julianna',\n\t'Danna',\n\t'Marina',\n\t'Sheena',\n\t'Shawna',\n\t'Mya',\n\t'Leona',\n\t'Leila',\n\t'Isla',\n\t'Charlene',\n\t'Mindy',\n\t'Bernadette',\n\t'Audrina',\n\t'Tricia',\n\t'Adele',\n\t'Myrtle',\n\t'Nataly',\n\t'Kimberley',\n\t'Gwendolyn',\n\t'Emilia',\n\t'Janine',\n\t'Paulina',\n\t'Stefanie',\n\t'Marguerite',\n\t'Dayanara',\n\t'Katina',\n\t'Brielle',\n\t'Vera',\n\t'Jimena',\n\t'Aileen',\n\t'Bethany',\n\t'America',\n\t'Kellie',\n\t'Shanice',\n\t'Roxanne',\n\t'Darla',\n\t'Mamie',\n\t'Jocelyne',\n\t'Katherin',\n\t'Lyla',\n\t'Sonya',\n\t'Allyson',\n\t'Debora',\n\t'Chaya',\n\t'Jaslene',\n\t'Malia',\n\t'Daniella',\n\t'Alessandra',\n\t'Aimee',\n\t'Dina',\n\t'Arabella',\n\t'Juliet',\n\t'Laila',\n\t'Rhoda',\n\t'Angie',\n\t'Everly',\n\t'Adrianna',\n\t'Shelia',\n\t'Jana',\n\t'Analia',\n\t'Kamila',\n\t'Rebekah',\n\t'Myrna',\n\t'Concetta',\n\t'Amaya',\n\t'Juliette',\n\t'Litzy',\n\t'Marely',\n\t'Londyn',\n\t'Patti',\n\t'Adalyn',\n\t'Marla',\n\t'Tammie',\n\t'Cora',\n\t'Angelique',\n\t'Fiona',\n\t'Kari',\n\t'Jaylene',\n\t'Lucile',\n\t'Rubi',\n\t'Vivienne',\n\t'Hattie',\n\t'Noemi',\n\t'Celina',\n\t'Dena',\n\t'Sherlyn',\n\t'Selina',\n\t'Bonita',\n\t'Paulette',\n\t'Aisha',\n\t'Susie',\n\t'Adeline',\n\t'Elsa',\n\t'Shania',\n\t'Yasmin',\n\t'Dalia',\n\t'Jacquelyn',\n\t'Thalia',\n\t'Trina',\n\t'Allisson',\n\t'Chana',\n\t'Olive',\n\t'Helene',\n\t'Nelda',\n\t'Mireya',\n\t'Chelsey',\n\t'Cheri',\n\t'Kira',\n\t'Karissa',\n\t'Lynette',\n\t'Deneen',\n\t'Ivette',\n\t'Roslyn',\n\t'Kinley',\n\t'Rosalinda',\n\t'Lila',\n\t'Kaylie',\n\t'Dayana',\n\t'Melany',\n\t'Carissa',\n\t'Aniyah',\n\t'Kyla',\n\t'Yulissa',\n\t'Trisha',\n\t'Camilla',\n\t'Ansley',\n\t'Sarai',\n\t'Lola',\n\t'Arline',\n\t'Lara',\n\t'Stacie',\n\t'Annika',\n\t'Christi',\n\t'Brisa',\n\t'Gia',\n\t'Therese',\n\t'Abril',\n\t'Angeline',\n\t'Isabela',\n\t'Marcella',\n\t'Shanna',\n\t'Stephany',\n\t'Henrietta',\n\t'Tasha',\n\t'Brianne',\n\t'Rosanne',\n\t'Luann',\n\t'Frieda',\n\t'Renata',\n\t'Dianna',\n\t'Celia',\n\t'Sondra',\n\t'Aylin',\n\t'Melba',\n\t'Catina',\n\t'Alayna',\n\t'Mollie',\n\t'Nathalie',\n\t'Tabitha',\n\t'Tracie',\n\t'Scarlet',\n\t'Jayne',\n\t'Rachelle',\n\t'Jeannette',\n\t'Addyson',\n\t'Cecelia',\n\t'Annabella',\n\t'Dahlia',\n\t'Dorothea',\n\t'Annmarie',\n\t'Marlys',\n\t'Deirdre',\n\t'Evangeline',\n\t'Melina',\n\t'Erma',\n\t'Jeanine',\n\t'Roxana',\n\t'Yaritza',\n\t'Montserrat',\n\t'Lizzie',\n\t'Kerri',\n\t'Yoselin',\n\t'Migdalia',\n\t'Rivka',\n\t'Cathleen',\n\t'Lorene',\n\t'Yareli',\n\t'Bette',\n\t'Kyra',\n\t'Janette',\n\t'Beulah',\n\t'Danica',\n\t'Arely',\n\t'Lexi',\n\t'Shana',\n\t'Sherrie',\n\t'Alexus',\n\t'Mable',\n\t'Citlalli',\n\t'Nadine',\n\t'Shauna',\n\t'Ryleigh',\n\t'Jeri',\n\t'Phoebe',\n\t'Jazlyn',\n\t'Noreen',\n\t'Keisha',\n\t'Lora',\n\t'Brynlee',\n\t'Alivia',\n\t'Lottie',\n\t'Monserrat',\n\t'Giuliana',\n\t'Adelyn',\n\t'Deana',\n\t'Jacqueli',\n\t'Makenna',\n\t'Jeannie',\n\t'Noelle',\n\t'Imogene',\n\t'Daphne',\n\t'Reyna',\n\t'Katelynn',\n\t'Bettie',\n\t'Carmella',\n\t'Estefania',\n\t'Cassandr',\n\t'Betsy',\n\t'Brianda',\n\t'Iliana',\n\t'Bryanna',\n\t'Aranza',\n\t'Rihanna',\n\t'Anissa',\n\t'Alisa',\n\t'Azul',\n\t'Milagros',\n\t'Gemma',\n\t'Freda',\n\t'Ada',\n\t'Bettye',\n\t'Nia',\n\t'Oralia',\n\t'Alaina',\n\t'Anabelle',\n\t'Destinee',\n\t'Sallie',\n\t'Sonja',\n\t'Willow',\n\t'Staci',\n\t'Lia',\n\t'Breana',\n\t'Eliza',\n\t'Mikaela',\n\t'Mona',\n\t'Cataleya',\n\t'Jeannine',\n\t'Lilah',\n\t'Anabel',\n\t'Ashlynn',\n\t'Aleena',\n\t'Estella',\n\t'Ayla',\n\t'Adelaide',\n\t'Lilliana',\n\t'Kristie',\n\t'Nettie',\n\t'Cherie',\n\t'May',\n\t'Myra',\n\t'Nicolette',\n\t'Lissette',\n\t'Siena',\n\t'Ivanna',\n\t'Christa',\n\t'Caylee',\n\t'Roseann',\n\t'Anastasia',\n\t'Karin',\n\t'Corinne',\n\t'Ginger',\n\t'Flora',\n\t'Bria',\n\t'Gretchen',\n\t'Maryellen',\n\t'Lana',\n\t'Harmony',\n\t'Elvira',\n\t'Ilene',\n\t'Iesha',\n\t'Celine',\n\t'Faye',\n\t'Khadijah',\n\t'Elyse',\n\t'Joana',\n\t'Sharyn',\n\t'Leia',\n\t'Catherin',\n\t'Corina',\n\t'Sheree',\n\t'Salma',\n\t'Deja',\n\t'Liz',\n\t'Aracely',\n\t'Roselyn',\n\t'Samara',\n\t'Lorrie',\n\t'Frida',\n\t'Tessie',\n\t'Talia',\n\t'Rosalind',\n\t'Jailene',\n\t'Lisette',\n\t'Raelynn',\n\t'Yetta',\n\t'Catharine',\n\t'Adelynn',\n\t'Odalys',\n\t'Jolene',\n\t'Charity',\n\t'Aniya',\n\t'Sanjuanita',\n\t'Norah',\n\t'Terrie',\n\t'Yuliana',\n\t'Lorie',\n\t'Yazmin',\n\t'Eleanore',\n\t'Anika',\n\t'Elida',\n\t'Valery',\n\t'Matilda',\n\t'Nannie',\n\t'Eloise',\n\t'Gillian',\n\t'Tatyana',\n\t'Kimora',\n\t'Brynn',\n\t'Maliyah',\n\t'Madilyn',\n\t'Jenifer',\n\t'Maddison',\n\t'Colette',\n\t'Nanette',\n\t'Ayleen',\n\t'Winnie',\n\t'Jayda',\n\t'Deloris',\n\t'Tillie',\n\t'Kizzy',\n\t'Galilea',\n\t'Janessa',\n\t'Brenna',\n\t'Amelie',\n\t'Marybeth',\n\t'Lorna',\n\t'Kaia',\n\t'Sarahi',\n\t'Viridiana',\n\t'Rebeca',\n\t'Ericka',\n\t'Mareli',\n\t'Anaya',\n\t'Nathaly',\n\t'Candy',\n\t'Larissa',\n\t'Elle',\n\t'Yasmine',\n\t'Claudine',\n\t'Kyleigh',\n\t'Paloma',\n\t'Lenore',\n\t'Citlali',\n\t'Rosanna',\n\t'Misti',\n\t'Kasandra',\n\t'Zara',\n\t'Isis',\n\t'Alisson',\n\t'Cheyanne',\n\t'Reba',\n\t'Ariella',\n\t'Lavonne',\n\t'Miah',\n\t'Roxanna',\n\t'Anabella',\n\t'Suzette',\n\t'Kiera',\n\t'Gitty',\n\t'Farrah',\n\t'Helena',\n\t'Shaniqua',\n\t'Maryanne',\n\t'Liana',\n\t'Arleen',\n\t'Belle',\n\t'Katy',\n\t'Anya',\n\t'Selene',\n\t'Maura',\n\t'Chantel',\n\t'Keyla',\n\t'Maryjane',\n\t'Tisha',\n\t'Kisha',\n\t'Kaelyn',\n\t'Malka',\n\t'Maci',\n\t'Evelin',\n\t'Julianne',\n\t'Magdalena',\n\t'Kimberlee',\n\t'Ernestine',\n\t'Alyson',\n\t'Kaley',\n\t'Danika',\n\t'Kecia',\n\t'Leanne',\n\t'Tonia',\n\t'Nyla',\n\t'Ivonne',\n\t'Madelynn',\n\t'Ofelia',\n\t'Lakisha',\n\t'Adilene',\n\t'Wendi',\n\t'Susanne',\n\t'Katharine',\n\t'Faigy',\n\t'Raizy',\n\t'Tawny',\n\t'Jackeline',\n\t'Ariadne',\n\t'Giovanna',\n\t'Janiyah',\n\t'Alani',\n\t'Nayely',\n\t'Lilian',\n\t'Saundra',\n\t'Jazlynn',\n\t'Jaelynn',\n\t'Elliana',\n\t'Gayla',\n\t'Deena',\n\t'Earnestine',\n\t'Margo',\n\t'Herlinda',\n\t'Elinor',\n\t'Salina',\n\t'Casandra',\n\t'Nathalia',\n\t'Kaila',\n\t'Deanne',\n\t'Desirae',\n\t'Liza',\n\t'Bobbi',\n\t'Briella',\n\t'Gilda',\n\t'Averie',\n\t'Charlize',\n\t'Azalea',\n\t'Sanjuana',\n\t'Yajaira',\n\t'Brandie',\n\t'Aleah',\n\t'Della',\n\t'Elaina',\n\t'Yahaira',\n\t'Aja',\n\t'Bernadine',\n\t'Lela',\n\t'Annabel',\n\t'Xiomara',\n\t'Kassidy',\n\t'Nohely',\n\t'Aubrie',\n\t'Angelia',\n\t'Macie',\n\t'Shelbi',\n\t'Chelsie',\n\t'Lilyana',\n\t'Jazlene',\n\t'Amina',\n\t'Dorthy',\n\t'Noelia',\n\t'Addisyn',\n\t'Dalilah',\n\t'Clarisa',\n\t'Chrystal',\n\t'Oleta',\n\t'Georgina',\n\t'Adelina',\n\t'Edythe',\n\t'Lucinda',\n\t'Jannie',\n\t'Minerva',\n\t'Kelsie',\n\t'Madisyn',\n\t'Aida',\n\t'Katlyn',\n\t'Julieta',\n\t'Violeta',\n\t'Heidy',\n\t'Lea',\n\t'Leola',\n\t'Chasity',\n\t'Nell',\n\t'Felicity',\n\t'Kathi',\n\t'Karyn',\n\t'Hana',\n\t'Micaela',\n\t'Chandra',\n\t'Liberty',\n\t'Cielo',\n\t'Tameka',\n\t'Maude',\n\t'Malky',\n\t'Coraima',\n\t'Haylie',\n\t'Vanesa',\n\t'Sloane',\n\t'Karyme',\n\t'Evelynn',\n\t'Batsheva',\n\t'Nallely',\n\t'Tamra',\n\t'Maricruz',\n\t'Paislee',\n\t'Kynlee',\n\t'Marcela',\n\t'Marci',\n\t'Vonda',\n\t'Cinthia',\n\t'Amiyah',\n\t'Breanne',\n\t'Lisbeth',\n\t'Leanna',\n\t'Anais',\n\t'Flor',\n\t'Annemarie',\n\t'Amie',\n\t'Estela',\n\t'Tammi',\n\t'Rhiannon',\n\t'Denisse',\n\t'Leyla',\n\t'Iridian',\n\t'Dariana',\n\t'Romina',\n\t'Yamileth',\n\t'Lidia',\n\t'Sybil',\n\t'Elvia',\n\t'Debby',\n\t'Philomena',\n\t'Jacklyn',\n\t'Charlee',\n\t'Kathie',\n\t'Aryanna',\n\t'Katarina',\n\t'Elianna',\n\t'Zariah',\n\t'Andreina',\n\t'Filomena',\n\t'Xochitl',\n\t'Mariam',\n\t'Myla',\n\t'Janiya',\n\t'Kristal',\n\t'Estefany',\n\t'Debi',\n\t'Miracle',\n\t'Shaindy',\n\t'Evangelina',\n\t'Naya',\n\t'Maeve',\n\t'Judi',\n\t'Effie',\n\t'Lilia',\n\t'Dayami',\n\t'Kierra',\n\t'Vincenza',\n\t'Cari',\n\t'Lauri',\n\t'Bethzy',\n\t'Trudy',\n\t'Deidre',\n\t'Melisa',\n\t'Luciana',\n\t'Chantal',\n\t'Laisha',\n\t'Kennedi',\n\t'Ayanna',\n\t'Madalyn',\n\t'Dania',\n\t'Jaliyah',\n\t'Madilynn',\n\t'Citlaly',\n\t'Lolita',\n\t'Drema',\n\t'Iva',\n\t'Kailee',\n\t'Grecia',\n\t'Kailyn',\n\t'Ladonna',\n\t'Latanya',\n\t'Maia',\n\t'Jaquelin',\n\t'Alanna',\n\t'Etta',\n\t'Marlee',\n\t'Reina',\n\t'Aiyana',\n\t'Carolann',\n\t'Gizelle',\n\t'Greta',\n\t'Lynnette',\n\t'Cecile',\n\t'Shayna',\n\t'Savanah',\n\t'Annalise',\n\t'Nylah',\n\t'Lesa',\n\t'Jolie',\n\t'Arleth',\n\t'Laraine',\n\t'Selah',\n\t'Alysha',\n\t'Bridgette',\n\t'Madyson',\n\t'Marylou',\n\t'Adela',\n\t'Shaina',\n\t'Trista',\n\t'Katia',\n\t'Kayleen',\n\t'Lilianna',\n\t'Tamera',\n\t'Millicent',\n\t'Eugenia',\n\t'Myrtice',\n\t'Baila',\n\t'Charmaine',\n\t'Maegan',\n\t'Ruthie',\n\t'Jovanna',\n\t'Julisa',\n\t'Mayte',\n\t'Latrice',\n\t'Priscila',\n\t'Glenna',\n\t'Yitty',\n\t'Tawana',\n\t'Yessica',\n\t'Ina',\n\t'Brittni',\n\t'Johana',\n\t'Tess',\n\t'Caryn',\n\t'Natalee',\n\t'Barb',\n\t'Journee',\n\t'Malaysia',\n\t'Yulisa',\n\t'Alta',\n\t'Shaila',\n\t'Maurine',\n\t'Amira',\n\t'Tiffani',\n\t'Danette',\n\t'Fanny',\n\t'Justina',\n\t'Leann',\n\t'Dafne',\n\t'Ima',\n\t'Azucena',\n\t'Braylee',\n\t'Amaris',\n\t'Bailee',\n\t'Giana',\n\t'Josette',\n\t'Raegan',\n\t'Gena',\n\t'Luella',\n\t'Nita',\n\t'Laney',\n\t'Gisela',\n\t'Alexandrea',\n\t'Rosalia',\n\t'Odessa',\n\t'Laci',\n\t'Yamilex',\n\t'Tamia',\n\t'Astrid',\n\t'Luanne',\n\t'Gwen',\n\t'Tabatha',\n\t'Rivky',\n\t'Laureen',\n\t'Zina',\n\t'Amara',\n\t'Itzayana',\n\t'Adamaris',\n\t'Laylah',\n\t'Luisa',\n\t'Georgette',\n\t'Joselin',\n\t'Yamilet',\n\t'Nilda',\n\t'Luisana',\n\t'Coleen',\n\t'Cecily',\n\t'Jocelynn',\n\t'Mirella',\n\t'Jessika',\n\t'Moriah',\n\t'Halle',\n\t'Caren',\n\t'Earline',\n\t'Shantel',\n\t'Aliana',\n\t'Keila',\n\t'Maryam',\n\t'Marianna',\n\t'Magaly',\n\t'Sariah',\n\t'Marnie',\n\t'Kiersten',\n\t'Janeth',\n\t'Lyndsey',\n\t'Shelli',\n\t'Jaylee',\n\t'Ashlie',\n\t'Tianna',\n\t'Bree',\n\t'Isela',\n\t'Krystina',\n\t'Yaretzy',\n\t'Evelina',\n\t'Sarina',\n\t'Tyra',\n\t'Eloisa',\n\t'Maite',\n\t'Leilah',\n\t'Marcie',\n\t'Imelda',\n\t'Alena',\n\t'Juniper',\n\t'Shelbie',\n\t'Shakira',\n\t'Ember',\n\t'Emmalyn',\n\t'Elissa',\n\t'Skyla',\n\t'Lylah',\n\t'Xitlali',\n\t'Gisele',\n\t'Polly',\n\t'Ernestina',\n\t'Sandi',\n\t'Emmy',\n\t'Josefa',\n\t'Magali',\n\t'Ashely',\n\t'Eve',\n\t'Jayde',\n\t'Rosella',\n\t'Yuridia',\n\t'Sheyla',\n\t'Raelyn',\n\t'Domenica',\n\t'Valarie',\n\t'Herminia',\n\t'Katalina',\n\t'Shaquana',\n\t'Nelly',\n\t'Rosalyn',\n\t'Denice',\n\t'Saanvi',\n\t'Cambria',\n\t'Joseline',\n\t'Tomasa',\n\t'Milana',\n\t'Harriett',\n\t'Devorah',\n\t'Jackelyn',\n\t'Jacquelin',\n\t'Yadhira',\n\t'Antonella',\n\t'Shreya',\n\t'Janay',\n\t'Betzy',\n\t'Kaiya',\n\t'Terra',\n\t'Roseanne',\n\t'Karime',\n\t'Lina',\n\t'Macey',\n\t'Vilma',\n\t'Shaniya',\n\t'Deyanira',\n\t'Cindi',\n\t'Mandi',\n\t'Sanaa',\n\t'Lakesha',\n\t'Essence',\n\t'Faviola',\n\t'Brinley',\n\t'Kirstie',\n\t'Brissa',\n\t'Alia',\n\t'Janney',\n\t'Kaylynn',\n\t'Kamilah',\n\t'Kianna',\n\t'Adrianne',\n\t'Yasmeen',\n\t'Jerri',\n\t'Anayeli',\n\t'Ambar',\n\t'Lorri',\n\t'Hailie',\n\t'Demetria',\n\t'Awilda',\n\t'Isabell',\n\t'Leonor',\n\t'Florine',\n\t'Tennille',\n\t'Deann',\n\t'Nyah',\n\t'Jolette',\n\t'Xitlaly',\n\t'Vienna',\n\t'Lenora',\n\t'Keily',\n\t'Syble',\n\t'Ciera',\n\t'Milania',\n\t'Lainey',\n\t'Nyasia',\n\t'Carley',\n\t'Kelsi',\n\t'Blossom',\n\t'Maranda',\n\t'Ally',\n\t'Serina',\n\t'Charli',\n\t'Taraji',\n\t'Jena',\n\t'Natalya',\n\t'Hortencia',\n\t'Ila',\n\t'Kailani',\n\t'Mira',\n\t'Evie',\n\t'Ione',\n\t'Briseyda',\n\t'Aryana',\n\t'Yarely',\n\t'Susanna',\n\t'Amya',\n\t'Kaleigh',\n\t'Qiana',\n\t'Juli',\n\t'Mckayla',\n\t'Suzan',\n\t'Fallon',\n\t'Jacalyn',\n\t'Ileana',\n\t'Yesica',\n\t'Willa',\n\t'Fatoumata',\n\t'Arly',\n\t'Jakayla',\n\t'Chyna',\n\t'Jaida',\n\t'Sunshine',\n\t'Beyonce',\n\t'Lawanda',\n\t'Flossie',\n\t'Lupita',\n\t'Demi',\n\t'Keely',\n\t'Aliya',\n\t'Jeanie',\n\t'Tamiko',\n\t'Gigi',\n\t'Brissia',\n\t'Mariel',\n\t'Lluvia',\n\t'Jasleen',\n\t'Lizet',\n\t'Brittanie',\n\t'Kaci',\n\t'Alycia',\n\t'Madalynn',\n\t'Milena',\n\t'Coraline',\n\t'Kaela',\n\t'Soraya',\n\t'Mozelle',\n\t'Jessenia',\n\t'Wilhelmina',\n\t'Jazmyn',\n\t'Stefani',\n\t'Natali',\n\t'Christiana',\n\t'Ivana',\n\t'Eiza',\n\t'Zaria',\n\t'Zaira',\n\t'Lorelei',\n\t'Cherry',\n\t'Aline',\n\t'Briseida',\n\t'Siani',\n\t'Yara',\n\t'Rhianna',\n\t'Kalia',\n\t'Destiney',\n\t'Hindy',\n\t'Arlette',\n\t'Shyanne',\n\t'Joceline',\n\t'Janell',\n\t'Vianey',\n\t'Elnora',\n\t'Zoie',\n\t'Elba',\n\t'Jamila',\n\t'Rena',\n\t'Mari',\n\t'Chava',\n\t'Scarlette',\n\t'Shyla',\n\t'Corine',\n\t'Kaliyah',\n\t'Ailyn',\n\t'Liv',\n\t'Freya',\n\t'Diya',\n\t'Myrtis',\n\t'Aliah',\n\t'Margery',\n\t'Gracelyn',\n\t'Shira',\n\t'Riya',\n\t'Breann',\n\t'Siobhan',\n\t'Rochel',\n\t'Tiffanie',\n\t'Mirna',\n\t'Nilsa',\n\t'Tenley',\n\t'Aliza',\n\t'Celena',\n\t'Vianney',\n\t'Janel',\n\t'Toccara',\n\t'Dayna',\n\t'Rona',\n\t'Alba',\n\t'Althea',\n\t'Josselyn',\n\t'Karlie',\n\t'Alyce',\n\t'Erlinda',\n\t'Kadijah',\n\t'Rosalba',\n\t'Tangela',\n\t'Marlena',\n\t'Delois',\n\t'Chastity',\n\t'Coral',\n\t'Braelynn',\n\t'Dalila',\n\t'Rosetta',\n\t'Lu',\n\t'Venessa',\n\t'Kayley',\n\t'Barbra',\n\t'Jesica',\n\t'Dona',\n\t'Mitzi',\n\t'Catrina',\n\t'Gracelynn',\n\t'Ophelia',\n\t'Ayana',\n\t'Mara',\n\t'Calista',\n\t'Adyson',\n\t'Marilynn',\n\t'Tomeka',\n\t'Britni',\n\t'Whitley',\n\t'Karly',\n\t'Verenice',\n\t'Raylee',\n\t'Dayanna',\n\t'Shonda',\n\t'Felecia',\n\t'Betzaida',\n\t'Kaylani',\n\t'Shaylee',\n\t'Jazzlyn',\n\t'Giavanna',\n\t'Vivianna',\n\t'Jesusa',\n\t'Lashonda',\n\t'Maile',\n\t'Suzy',\n\t'Vania',\n\t'Giada',\n\t'Maisie',\n\t'Venus',\n\t'Emerald',\n\t'Wilda',\n\t'Saniya',\n\t'Naydelin',\n\t'Enid',\n\t'Leilany',\n\t'Jesenia',\n\t'Maliah',\n\t'Dortha',\n\t'Dalary',\n\t'Chany',\n\t'Amia',\n\t'Amalia',\n\t'Khaleesi',\n\t'Taina',\n\t'Abbey',\n\t'Dollie',\n\t'Joslyn',\n\t'Sommer',\n\t'Lilibeth',\n\t'Charleigh',\n\t'Sydell',\n\t'Shoshana',\n\t'Nechama',\n\t'Jamya',\n\t'Jeanmarie',\n\t'Albertha',\n\t'Akeelah',\n\t'Aanya',\n\t'Destini',\n\t'Kacie',\n\t'Maleah',\n\t'Cayla',\n\t'Bryana',\n\t'Zelma',\n\t'Anjanette',\n\t'Kaylah',\n\t'Tonja',\n\t'Amairani',\n\t'Karli',\n\t'Elina',\n\t'Aurelia',\n\t'Judie',\n\t'Letha',\n\t'Brittnee',\n\t'Yanira',\n\t'Ariza',\n\t'Kataleya',\n\t'Berta',\n\t'Soleil',\n\t'Marleen',\n\t'Desteny',\n\t'Gissel',\n\t'Suri',\n\t'Anjelica',\n\t'Lilith',\n\t'Breeanna',\n\t'Krysta',\n\t'Alysia',\n\t'Chrissy',\n\t'Lailah',\n\t'Cathryn',\n\t'Dawna',\n\t'Myah',\n\t'Lelia',\n\t'Aviana',\n\t'Xena',\n\t'Pansy',\n\t'Jazleen',\n\t'Kaylyn',\n\t'Mariann',\n\t'Celene',\n\t'Berniece',\n\t'Anjali',\n\t'Benita',\n\t'Reanna',\n\t'Sydnee',\n\t'Taliyah',\n\t'Raylene',\n\t'Kristyn',\n\t'Latonia',\n\t'Pa',\n\t'Nola',\n\t'Lyanne',\n\t'Danae',\n\t'Sharla',\n\t'Chanelle',\n\t'Aleyda',\n\t'Deb',\n\t'Sofie',\n\t'Shameka',\n\t'Emelia',\n\t'Miya',\n\t'Latricia',\n\t'Claribel',\n\t'Lacie',\n\t'Taisha',\n\t'Queen',\n\t'Breeana',\n\t'Ilana',\n\t'Erna',\n\t'Neha',\n\t'Melodie',\n\t'Ariah',\n\t'Ursula',\n\t'Janna',\n\t'Cienna',\n\t'Maryjo',\n\t'Vannessa',\n\t'Saniyah',\n\t'Mariajose',\n\t'Malaya',\n\t'Abbigail',\n\t'Elin',\n\t'Emi',\n\t'Shanaya',\n\t'Zahra',\n\t'Lorine',\n\t'Karrie',\n\t'Johnna',\n\t'Marni',\n\t'Karis',\n\t'Shelba',\n\t'Omayra',\n\t'Claudette',\n\t'Anitra',\n\t'Jenelle',\n\t'Zelda',\n\t'Alyse',\n\t'Alethea',\n\t'Jannet',\n\t'Myranda',\n\t'Corinna',\n\t'Pattie',\n\t'Jemma',\n\t'Avah',\n\t'Joycelyn',\n\t'Loriann',\n\t'Kirstin',\n\t'Davina',\n\t'Clementine',\n\t'Arantza',\n\t'Esme',\n\t'Vida',\n\t'Samira',\n\t'Alysa',\n\t'Ananya',\n\t'Cherish',\n\t'Jocelin',\n\t'Renae',\n\t'Jalisa',\n\t'Elease',\n\t'Salena',\n\t'Zhane',\n\t'Zulema',\n\t'Rubye',\n\t'Amerie',\n\t'Leatrice',\n\t'Geralyn',\n\t'Brigitte',\n\t'Sibyl',\n\t'Corrina',\n\t'Phylicia',\n\t'Karlee',\n\t'Kerrie',\n\t'Addilyn',\n\t'Alayah',\n\t'Jacquely',\n\t'Mirian',\n\t'Jovana',\n\t'Katelin',\n\t'Marielena',\n\t'Libby',\n\t'Aditi',\n\t'Nalani',\n\t'Lilyanna',\n\t'Mylee',\n\t'Goldy',\n\t'Melia',\n\t'Audriana',\n\t'Lillyana',\n\t'Enriqueta',\n\t'Tasia',\n\t'Debbi',\n\t'Ani',\n\t'Elyssa',\n\t'Yamile',\n\t'Bridgett',\n\t'Taniya',\n\t'Britany',\n\t'Latosha',\n\t'Shanda',\n\t'Estephanie',\n\t'Maudie',\n\t'Mariyah',\n\t'Tana',\n\t'Neva',\n\t'Kalea',\n\t'Oma',\n\t'Jazelle',\n\t'Neveah',\n\t'Leonora',\n\t'Miesha',\n\t'Corrine',\n\t'Jordynn',\n\t'Cornelia',\n\t'Ronni',\n\t'Malinda',\n\t'Janeen',\n\t'Neriah',\n\t'Brigette',\n\t'Windy',\n\t'Cassondra',\n\t'Klarissa',\n\t'Lizzette',\n\t'Tanika',\n\t'Izamar',\n\t'Tera',\n\t'Arianny',\n\t'Florene',\n\t'Evalyn',\n\t'Poppy',\n\t'Deisy',\n\t'Jannette',\n\t'Thania',\n\t'Kelsea',\n\t'Taniyah',\n\t'Geri',\n\t'Allyssa',\n\t'Zariyah',\n\t'Averi',\n\t'Leeann',\n\t'Kallie',\n\t'Loni',\n\t'Bryleigh',\n\t'Rosina',\n\t'Carlee',\n\t'Preslee',\n\t'Alexsandra',\n\t'Adamari',\n\t'Saray',\n\t'Yaneli',\n\t'Raina',\n\t'Lianna',\n\t'Keilani',\n\t'Tamela',\n\t'Ninfa',\n\t'Ireland',\n\t'Shante',\n\t'Racheal',\n\t'Zainab',\n\t'Blima',\n\t'Yocheved',\n\t'Gema',\n\t'Sayra',\n\t'Aretha',\n\t'Nya',\n\t'Criselda',\n\t'Anai',\n\t'Bracha',\n\t'Amirah',\n\t'Sury',\n\t'Twila',\n\t'Arissa',\n\t'Livia',\n\t'Jacquline',\n\t'Chiara',\n\t'Anneliese',\n\t'Quiana',\n\t'Monika',\n\t'Charisse',\n\t'Emerie',\n\t'Rosalva',\n\t'Halie',\n\t'Jenesis',\n\t'Zaylee',\n\t'Pricilla',\n\t'Ouida',\n\t'Felipa',\n\t'Latifah',\n\t'Kalley',\n\t'Clarice',\n\t'Nona',\n\t'Jaunita',\n\t'Hermelinda',\n\t'Analy',\n\t'Jizelle',\n\t'Theda',\n\t'Yoselyn',\n\t'Dottie',\n\t'Brittaney',\n\t'Meghann',\n\t'Azeneth',\n\t'Richelle',\n\t'Peggie',\n\t'Brittny',\n\t'Jaci',\n\t'Marietta',\n\t'Gissell',\n\t'Evolet',\n\t'Abbygail',\n\t'Naima',\n\t'Noelani',\n\t'Jaslyn',\n\t'Katheryn',\n\t'Ruthann',\n\t'Shelva',\n\t'Ashli',\n\t'Alianna',\n\t'Felicitas',\n\t'Delfina',\n\t'Rayna',\n\t'Christal',\n\t'Leta',\n\t'Tawnya',\n\t'Zaniyah',\n\t'Cathie',\n\t'Antonette',\n\t'Bethann',\n\t'Nannette',\n\t'Vita',\n\t'Santa',\n\t'Dejah',\n\t'Patience',\n\t'Alessia',\n\t'Ahuva',\n\t'Karely',\n\t'Anette',\n\t'Alfreda',\n\t'Cyndi',\n\t'Cami',\n\t'Shirlee',\n\t'Roxann',\n\t'Alvina',\n\t'Sima',\n\t'Star',\n\t'Tatianna',\n\t'Krissy',\n\t'Dreama',\n\t'Diann',\n\t'Birdie',\n\t'Yoshiko',\n\t'Violette',\n\t'Mylah',\n\t'Rosita',\n\t'Eartha',\n\t'Miabella',\n\t'Shanika',\n\t'Gricel',\n\t'Ariyah',\n\t'Emmalee',\n\t'Nidia',\n\t'Gladis',\n\t'Roxie',\n\t'Zoraida',\n\t'Kandace',\n\t'Annamarie',\n\t'Alannah',\n\t'Abrielle',\n\t'Mercy',\n\t'Lesli',\n\t'Sydni',\n\t'Kathrine',\n\t'Jiselle',\n\t'Anisa',\n\t'Felisha',\n\t'Kayli',\n\t'Nanci',\n\t'Ria',\n\t'Cailyn',\n\t'Melani',\n\t'Alyna',\n\t'Bambi',\n\t'Avril',\n\t'Amberly',\n\t'Towanda',\n\t'Malissa',\n\t'Kaleena',\n\t'Kinsey',\n\t'Andria',\n\t'Emogene',\n\t'Milani',\n\t'Milah',\n\t'Hadassah',\n\t'Avianna',\n\t'Aubri',\n\t'Pessy',\n\t'Dori',\n\t'Tea',\n\t'Keshia',\n\t'Adina',\n\t'Esha',\n\t'Magnolia',\n\t'Moesha',\n\t'Elana',\n\t'Vikki',\n\t'Lakendra',\n\t'Ilse',\n\t'Sydnie',\n\t'Laquita',\n\t'Hortense',\n\t'Elouise',\n\t'Tarah',\n\t'Shamika',\n\t'Genoveva',\n\t'Margot',\n\t'Aubrielle',\n\t'Aya',\n\t'Aleta',\n\t'Shantell',\n\t'Angelle',\n\t'Lakeshia',\n\t'Leota',\n\t'Stormie',\n\t'Caryl',\n\t'Cristy',\n\t'Sydelle',\n\t'Analisa',\n\t'Earlene',\n\t'Syreeta',\n\t'Paityn',\n\t'Citlally',\n\t'Nikole',\n\t'Leandra',\n\t'Elda',\n\t'Lizbet',\n\t'Blimy',\n\t'Lorelai',\n\t'Gittel',\n\t'Jasmyn',\n\t'Verania',\n\t'Zoya',\n\t'Anyssa',\n\t'Jeniffer',\n\t'Dorene',\n\t'Makaila',\n\t'Earlean',\n\t'Ysabella',\n\t'Brandee',\n\t'Nailea',\n\t'Stefany',\n\t'Amiya',\n\t'Carolee',\n\t'Kassie',\n\t'Theodora',\n\t'Merissa',\n\t'Skylah',\n\t'Alesia',\n\t'Leela',\n\t'Madge',\n\t'Shanta',\n\t'Soledad',\n\t'Sharonda',\n\t'Thea',\n\t'Capri',\n\t'Amparo',\n\t'Concha',\n\t'Karolina',\n\t'Keitha',\n\t'Harriette',\n\t'Evette',\n\t'Mylie',\n\t'Isha',\n\t'Suzie',\n\t'Carlene',\n\t'Brunilda',\n\t'Annamae',\n\t'Ariadna',\n\t'Sanai',\n\t'Gisell',\n\t'Danelle',\n\t'Dovie',\n\t'Lani',\n\t'Shavonne',\n\t'Janiah',\n\t'Kora',\n\t'Jessa',\n\t'Melva',\n\t'Yehudis',\n\t'Analee',\n\t'Enedina',\n\t'Oaklee',\n\t'Aubrianna',\n\t'Velia',\n\t'Zooey',\n\t'Dolly',\n\t'Shanae',\n\t'Lyndsay',\n\t'Allene',\n\t'Kamya',\n\t'Tedra',\n\t'Yecenia',\n\t'Nyree',\n\t'Shyann',\n\t'Kandice',\n\t'Edwina',\n\t'Aiyanna',\n\t'Carli',\n\t'Sariyah',\n\t'Gwyneth',\n\t'Roseanna',\n\t'Charla',\n\t'Nereyda',\n\t'Yides',\n\t'Helaine',\n\t'Evita',\n\t'Alanis',\n\t'Starr',\n\t'Rosalee',\n\t'Yaire',\n\t'Risa',\n\t'Kristel',\n\t'Greidys',\n\t'Lillianna',\n\t'Khushi',\n\t'Triniti',\n\t'Lilyan',\n\t'Myesha',\n\t'Kala',\n\t'Moira',\n\t'Neida',\n\t'Gisel',\n\t'Myriam',\n\t'Anali',\n\t'Izabel',\n\t'Savana',\n\t'Sanjana',\n\t'Willodean',\n\t'Briza',\n\t'Lyra',\n\t'Merry',\n\t'Cheryle',\n\t'Porsha',\n\t'Kaili',\n\t'Buffy',\n\t'Deidra',\n\t'Everleigh',\n\t'Gardenia',\n\t'Italia',\n\t'Novella',\n\t'Sahara',\n\t'Sirena',\n\t'Elide',\n\t'Madisen',\n\t'Katerina',\n\t'Ashlea',\n\t'Rianna',\n\t'Samatha',\n\t'Diandra',\n\t'Shanell',\n\t'Annalee',\n\t'Samiyah',\n\t'Joselyne',\n\t'Maylin',\n\t'Jazmyne',\n\t'Terese',\n\t'Nydia',\n\t'Stasia',\n\t'Saira',\n\t'Carlota',\n\t'Kathia',\n\t'Katya',\n\t'Elodie',\n\t'Priya',\n\t'Malena',\n\t'Aadhya',\n\t'Meera',\n\t'Tayla',\n\t'Jovita',\n\t'Rafaela',\n\t'Faiga',\n\t'Jaquelyn',\n\t'Elisheva',\n\t'Debbra',\n\t'Melyssa',\n\t'Chelsi',\n\t'Gricelda',\n\t'Tawanda',\n\t'Sharlene',\n\t'Mellissa',\n\t'Alene',\n\t'Amayah',\n\t'Nicolle',\n\t'Yanet',\n\t'Zissy',\n\t'Candi',\n\t'Hedwig',\n\t'Leyna',\n\t'Nichol',\n\t'Reva',\n\t'Fraidy',\n\t'Esty',\n\t'Kaily',\n\t'Mimi',\n\t'Shani',\n\t'Hadlee',\n\t'Naomy',\n\t'Kinslee',\n\t'Emmalynn',\n\t'Alverta',\n\t'Anushka',\n\t'Tinsley',\n\t'Armida',\n\t'Cleta',\n\t'Analise',\n\t'Ahtziri',\n\t'Anakaren',\n\t'Tracee',\n\t'Glynda',\n\t'Kaelynn',\n\t'Carie',\n\t'Avalon',\n\t'Eboni',\n\t'Shameeka',\n\t'Letitia',\n\t'Enola',\n\t'Rasheeda',\n\t'Taylee',\n\t'Jerrica',\n\t'Janely',\n\t'Taya',\n\t'Xochilt',\n\t'Rosana',\n\t'Doretha',\n\t'Henny',\n\t'Shaniece',\n\t'Charleen',\n\t'Abigale',\n\t'Marylyn',\n\t'Retha',\n\t'Keren',\n\t'Elly',\n\t'Ailani',\n\t'Aarna',\n\t'Starla',\n\t'Maren',\n\t'Nan',\n\t'Marivel',\n\t'Georgianna',\n\t'Era',\n\t'Kirra',\n\t'Maisha',\n\t'Caydence',\n\t'Dinah',\n\t'Noemy',\n\t'Tamatha',\n\t'Madonna',\n\t'Kristan',\n\t'Keana',\n\t'Kloe',\n\t'Maribeth',\n\t'Sana',\n\t'Korina',\n\t'Irania',\n\t'Izabelle',\n\t'Roxy',\n\t'Mariaguadalupe',\n\t'Sulema',\n\t'Vivien',\n\t'Tatia',\n\t'Holli',\n\t'Debrah',\n\t'Kattie',\n\t'Kaidence',\n\t'Cathey',\n\t'Anniston',\n\t'Refugia',\n\t'Renita',\n\t'Aubriella',\n\t'Kaleah',\n\t'Zuleyka',\n\t'Sherie',\n\t'Tomika',\n\t'Charisma',\n\t'Caridad',\n\t'Kailynn',\n\t'Gertie',\n\t'Jaslynn',\n\t'Agatha',\n\t'Avani',\n\t'Hennessy',\n\t'Pamala',\n\t'Malak',\n\t'Raizel',\n\t'Kami',\n\t'Rosalina',\n\t'Ferne',\n\t'Cloe',\n\t'Jeryl',\n\t'Louann',\n\t'Jacie',\n\t'Tais',\n\t'Johnsie',\n\t'Brittnie',\n\t'Collette',\n\t'Lettie',\n\t'Jeanna',\n\t'Kyara',\n\t'Renada',\n\t'Abrianna',\n\t'Nayelli',\n\t'Alda',\n\t'Yuna',\n\t'Cristi',\n\t'Yazmine',\n\t'Marlie',\n\t'Milly',\n\t'Anastacia',\n\t'Daria',\n\t'Caitlynn',\n\t'Shriya',\n\t'Vianca',\n\t'Sayuri',\n\t'Dennise',\n\t'Aleyna',\n\t'Jenni',\n\t'Tanesha',\n\t'Suzanna',\n\t'Zaniya',\n\t'Kesha',\n\t'Edie',\n\t'Ansleigh',\n\t'Emmie',\n\t'Marjory',\n\t'Lanette',\n\t'Babette',\n\t'Alaya',\n\t'Palma',\n\t'Tamie',\n\t'Nelle',\n\t'Haydee',\n\t'Zeinab',\n\t'Stephania',\n\t'Biridiana',\n\t'Yoshie',\n\t'Mayme',\n\t'Michaele',\n\t'Marimar',\n\t'Winona',\n\t'Christene',\n\t'Meadow',\n\t'Ariya',\n\t'Daleysa',\n\t'Thuy',\n\t'Nautica',\n\t'Hadleigh',\n\t'Aliyana',\n\t'Annabell',\n\t'Stacia',\n\t'Leonore',\n\t'Albina',\n\t'Daira',\n\t'Rhona',\n\t'Lisbet',\n\t'Alizae',\n\t'Aminata',\n\t'Samanta',\n\t'Jerilyn',\n\t'Darci',\n\t'Sudie',\n\t'Kynleigh',\n\t'Marva',\n\t'Karie',\n\t'Marbella',\n\t'Franchesca',\n\t'Kylah',\n\t'Lillyanna',\n\t'Melony',\n\t'Abygail',\n\t'Yulianna',\n\t'Sahana',\n\t'Velvet',\n\t'Michelina',\n\t'Treva',\n\t'Iona',\n\t'Adilynn',\n\t'Milla',\n\t'Teressa',\n\t'Coretta',\n\t'Venita',\n\t'Evalynn',\n\t'Chynna',\n\t'Janett',\n\t'Nohemi',\n\t'Symone',\n\t'Kaycee',\n\t'Racquel',\n\t'Jerica',\n\t'Chanda',\n\t'Vannesa',\n\t'Deasia',\n\t'Alanah',\n\t'Dasha',\n\t'Dian',\n\t'Iyana',\n\t'Katlin',\n\t'Shizue',\n\t'Mitsuko',\n\t'Shara',\n\t'Shanelle',\n\t'Sinead',\n\t'Jacinda',\n\t'Alecia',\n\t'Tanvi',\n\t'Genese',\n\t'Crissy',\n\t'Niki',\n\t'Shanequa',\n\t'Trish',\n\t'Shalonda',\n\t'Darleen',\n\t'Magda',\n\t'Annalisa',\n\t'Lashanda',\n\t'Carin',\n\t'Nahomi',\n\t'Londynn',\n\t'Alaysia',\n\t'Annaliese',\n\t'Valorie',\n\t'Naidelyn',\n\t'Abbe',\n\t'Karley',\n\t'Cinda',\n\t'Marilu',\n\t'Azaria',\n\t'Kitty',\n\t'Mechelle',\n\t'Jazzmin',\n\t'Malina',\n\t'Cianna',\n\t'Leesa',\n\t'Nahla',\n\t'Dorotha',\n\t'Jaeda',\n\t'Tinley',\n\t'Kelis',\n\t'Ayesha',\n\t'Cinthya',\n\t'Shawnte',\n\t'Fawn',\n\t'Calleigh',\n\t'Mittie',\n\t'Aide',\n\t'Lisset',\n\t'Tyesha',\n\t'Devora',\n\t'Analeigh',\n\t'Anahy',\n\t'Donnamarie',\n\t'Nala',\n\t'Haruko',\n\t'Lesia',\n\t'Aideliz',\n\t'Emme',\n\t'Mitsue',\n\t'Jamiya',\n\t'Joleen',\n\t'Missy',\n\t'Shawanda',\n\t'Chastelyn',\n\t'Jaleah',\n\t'Eulalia',\n\t'Elvera',\n\t'Kalina',\n\t'Adrina',\n\t'Nicolasa',\n\t'Belia',\n\t'Elodia',\n\t'Kazuko',\n\t'Ixchel',\n\t'Leena',\n\t'Yoseline',\n\t'Yocelin',\n\t'Jamiyah',\n\t'Mariama',\n\t'Audrianna',\n\t'Dasia',\n\t'Ieshia',\n\t'Malorie',\n\t'Toniann',\n\t'Genessis',\n\t'Makeda',\n\t'Cherise',\n\t'Tarsha',\n\t'Karri',\n\t'Romayne',\n\t'Beronica',\n\t'Nubia',\n\t'Shasta',\n\t'Cristin',\n\t'Cristine',\n\t'Eryn',\n\t'Jazzmine',\n\t'Alyssia',\n\t'Verona',\n\t'Divya',\n\t'Beatrix',\n\t'Chiyoko',\n\t'Destinie',\n\t'Hali',\n\t'Myisha',\n\t'Sabina',\n\t'Chante',\n\t'Brea',\n\t'Aundrea',\n\t'Harmoni',\n\t'Iyanna',\n\t'Rosaria',\n\t'Hettie',\n\t'Bronte',\n\t'Constanza',\n\t'Heavenly',\n\t'Georgiana',\n\t'Coco',\n\t'Eleni',\n\t'Brylie',\n\t'Ajee',\n\t'Jerrie',\n\t'Zella',\n\t'Xenia',\n\t'Djuana',\n\t'Bianka',\n\t'Lizett',\n\t'Destany',\n\t'Bettina',\n\t'Pennie',\n\t'Ciji',\n\t'Ciani',\n\t'Tosha',\n\t'Roxane',\n\t'Tenisha',\n\t'Pepper',\n\t'Ayva',\n\t'Dynasty',\n\t'Krysten',\n\t'Maud',\n\t'Janene',\n\t'Yomaira',\n\t'Kizzie',\n\t'Oriana',\n\t'Antionette',\n\t'Kamille',\n\t'Candis',\n\t'Kimberlie',\n\t'Britta',\n\t'Malika',\n\t'Khalilah',\n\t'Louisa',\n\t'Maiya',\n\t'Shanay',\n\t'Kellye',\n\t'Gaye',\n\t'Rosangelica',\n\t'Breonna',\n\t'Jenae',\n\t'Kaylene',\n\t'Rileigh',\n\t'Linnea',\n\t'Tawanna',\n\t'Harleen',\n\t'Tamya',\n\t'Makaylah',\n\t'Annabeth',\n\t'Alysson',\n\t'Adella',\n\t'Adalee',\n\t'Karisa',\n\t'Rosangela',\n\t'Ema',\n\t'Dayra',\n\t'Tena',\n\t'Mathilda',\n\t'Magan',\n\t'Dayanira',\n\t'Annelise',\n\t'Takisha',\n\t'Rosamaria',\n\t'Shifra',\n\t'Vianna',\n\t'Daysi',\n\t'Jalissa',\n\t'Samaya',\n\t'Aubriana',\n\t'Alora',\n\t'Emmeline',\n\t'Elora',\n\t'Laylani',\n\t'Willene',\n\t'Cathrine',\n\t'Ginny',\n\t'Lashunda',\n\t'Mikalah',\n\t'Kiyoko',\n\t'Wynter',\n\t'Zuleima',\n\t'Alease',\n\t'Louella',\n\t'Jubilee',\n\t'Allegra',\n\t'Karmen',\n\t'Emiliana',\n\t'Jianna',\n\t'Eisley',\n\t'Emmaline',\n\t'Teresita',\n\t'Mackenna',\n\t'Lauretta',\n\t'Krystin',\n\t'Kalene',\n\t'Aviva',\n\t'Zena',\n\t'Shanique',\n\t'Glynis',\n\t'Toya',\n\t'Linsey',\n\t'Denisha',\n\t'Marysol',\n\t'Marcelina',\n\t'Makiyah',\n\t'Masako',\n\t'Cintia',\n\t'Sharen',\n\t'Lahoma',\n\t'Magen',\n\t'Alyvia',\n\t'Shaniyah',\n\t'Anamaria',\n\t'Shivani',\n\t'Hannia',\n\t'Chavy',\n\t'Hayleigh',\n\t'Jaycie',\n\t'Mayah',\n\t'Delila',\n\t'Danita',\n\t'Modesta',\n\t'Arcelia',\n\t'Deedee',\n\t'Monserrath',\n\t'Angelie',\n\t'Mellisa',\n\t'Leisa',\n\t'Melannie',\n\t'Mafalda',\n\t'Kinlee',\n\t'Annetta',\n\t'Freida',\n\t'Anisha',\n\t'Mayrin',\n\t'Dajah',\n\t'Delylah',\n\t'Hortensia',\n\t'Joretta',\n\t'Lexy',\n\t'Laysha',\n\t'Anessa',\n\t'Jesusita',\n\t'Pearline',\n\t'Caleigh',\n\t'Liset',\n\t'Leilene',\n\t'Jaya',\n\t'Haily',\n\t'Tatyanna',\n\t'Desire',\n\t'Lisha',\n\t'Mindi',\n\t'Ivelisse',\n\t'Amariah',\n\t'Blythe',\n\t'Treasure',\n\t'Latarsha',\n\t'Emelda',\n\t'Latavia',\n\t'Debanhi',\n\t'Brynleigh',\n\t'Gala',\n\t'Jurnee',\n\t'Joslynn',\n\t'Harleigh',\n\t'Trang',\n\t'Audree',\n\t'Brande',\n\t'Genea',\n\t'Carri',\n\t'Kandy',\n\t'Kenisha',\n\t'Georgene',\n\t'Kamora',\n\t'Anabell',\n\t'Meranda',\n\t'Renesmee',\n\t'Rosaura',\n\t'Linette',\n\t'Rosamond',\n\t'Candida',\n\t'Crista',\n\t'Keeley',\n\t'Mykayla',\n\t'Rina',\n\t'Jonna',\n\t'Lorinda',\n\t'Wynona',\n\t'Kylene',\n\t'Kellee',\n\t'Elayne',\n\t'Chela',\n\t'Zykeria',\n\t'Shawnna',\n\t'Jaimee',\n\t'Zuleyma',\n\t'Britnee',\n\t'Mikala',\n\t'Coletta',\n\t'Morelia',\n\t'Isadora',\n\t'Anayah',\n\t'Amiah',\n\t'Ailin',\n\t'Jordana',\n\t'Casie',\n\t'Shakia',\n\t'Cordelia',\n\t'Analeah',\n\t'Janelly',\n\t'Adelita',\n\t'Yoana',\n\t'Lizabeth',\n\t'Latoria',\n\t'Pricila',\n\t'Margaretta',\n\t'Fumiko',\n\t'Lura',\n\t'Toshiko',\n\t'Marge',\n\t'Luana',\n\t'Marilee',\n\t'Jeana',\n\t'Tallulah',\n\t'Zia',\n\t'Betsabe',\n\t'Delanie',\n\t'Jenicka',\n\t'Kensington',\n\t'Navya',\n\t'Golda',\n\t'Kambree',\n\t'Orpha',\n\t'Rayleigh',\n\t'Kinleigh',\n\t'Karleigh',\n\t'Avalynn',\n\t'Addilynn',\n\t'Cambree',\n\t'Brinlee',\n\t'Liba',\n\t'Zendaya',\n\t'Farah',\n\t'Oumou',\n\t'Aislinn',\n\t'Karena',\n\t'Erendira',\n\t'Mariaelena',\n\t'Temperance',\n\t'Angelic',\n\t'Khadija',\n\t'Jonelle',\n\t'Aniah',\n\t'Aleigha',\n\t'Samaria',\n\t'Dedra',\n\t'Sammantha',\n\t'Bernardine',\n\t'Leilanie',\n\t'Makaela',\n\t'Samiya',\n\t'Porsche',\n\t'Krystel',\n\t'Simona',\n\t'Catarina',\n\t'Joi',\n\t'Etty',\n\t'Jannat',\n\t'Rubie',\n\t'Waneta',\n\t'Shaquita',\n\t'Shaindel',\n\t'Alida',\n\t'January',\n\t'Riana',\n\t'Jamilet',\n\t'Jala',\n\t'Gearldine',\n\t'Iola',\n\t'Tiesha',\n\t'Ariyana',\n\t'Josslyn',\n\t'Verla',\n\t'Gerri',\n\t'Emili',\n\t'Jennyfer',\n\t'Halo',\n\t'Raya',\n\t'Asusena',\n\t'Jessalyn',\n\t'Anaiah',\n\t'Sabine',\n\t'Dorinda',\n\t'Andriana',\n\t'Charissa',\n\t'Cambrie',\n\t'Daija',\n\t'Danyelle',\n\t'Maricarmen',\n\t'Melania',\n\t'Glinda',\n\t'Jaretzy',\n\t'Keesha',\n\t'Lucie',\n\t'Persephone',\n\t'Veda',\n\t'Avalyn',\n\t'Odilia',\n\t'Teena',\n\t'Daisha',\n\t'Shianne',\n\t'Nadya',\n\t'Peighton',\n\t'Shawana',\n\t'Lateefah',\n\t'Geena',\n\t'Aixa',\n\t'Magdalene',\n\t'Estefana',\n\t'China',\n\t'Tamekia',\n\t'Audrie',\n\t'Angely',\n\t'Charline',\n\t'Britny',\n\t'Quanisha',\n\t'Erykah',\n\t'Kenzi',\n\t'Carleigh',\n\t'Kamiyah',\n\t'Zayra',\n\t'Abagail',\n\t'Sulay',\n\t'Shelita',\n\t'Cattleya',\n\t'Ariela',\n\t'Yalitza',\n\t'Marleigh',\n\t'Colbie',\n\t'Lavergne',\n\t'Pyper',\n\t'Tawni',\n\t'Kasie',\n\t'Kati',\n\t'Cinnamon',\n\t'Trana',\n\t'Verda',\n\t'Romana',\n\t'Merrily',\n\t'Landri',\n\t'Bruchy',\n\t'Irlanda',\n\t'Lanie',\n\t'Kendyl',\n\t'Sanvi',\n\t'Akshara',\n\t'Aneesa',\n\t'Giulia',\n\t'Ruchy',\n\t'Giulianna',\n\t'Zahara',\n\t'Sumaya',\n\t'Guillermina',\n\t'Araseli',\n\t'Jackelin',\n\t'Norine',\n\t'Ariane',\n\t'Naidelin',\n\t'Gwenyth',\n\t'Kya',\n\t'Liyah',\n\t'Danya',\n\t'Sujey',\n\t'Grayce',\n\t'Honey',\n\t'Assunta',\n\t'Aleksandra',\n\t'Almeda',\n\t'Devany',\n\t'Spring',\n\t'Patrica',\n\t'Delisa',\n\t'Fantasia',\n\t'Cydney',\n\t'Laquisha',\n\t'Lynsey',\n\t'Stephenie',\n\t'Cassaundra',\n\t'Elisabet',\n\t'Echo',\n\t'Juliann',\n\t'Micayla',\n\t'Iridiana',\n\t'Antonietta',\n\t'Rosaisela',\n\t'Bayleigh',\n\t'Candelaria',\n\t'Zaida',\n\t'Mercedez',\n\t'Kindra',\n\t'Malayah',\n\t'Stephaine',\n\t'Nayla',\n\t'Tameeka',\n\t'Kiesha',\n\t'Pooja',\n\t'Sahar',\n\t'Paisleigh',\n\t'Kynslee',\n\t'Idella',\n\t'Arelis',\n\t'Shizuko',\n\t'Leslee',\n\t'Acacia',\n\t'Elexis',\n\t'Violetta',\n\t'Sailor',\n\t'Marceline',\n\t'Una',\n\t'Kamilla',\n\t'Aulani',\n\t'Aracelis',\n\t'Kikue',\n\t'Kasi',\n\t'Elwanda',\n\t'Brookelyn',\n\t'Kellyann',\n\t'Shaquanna',\n\t'Marielle',\n\t'Isel',\n\t'Agustina',\n\t'Vergie',\n\t'Arriana',\n\t'Perel',\n\t'Maylee',\n\t'Navy',\n\t'Lanell',\n\t'Rosann',\n\t'Carmelita',\n\t'Deisi',\n\t'Alyza',\n\t'Nailah',\n\t'Somaya',\n\t'Kiarra',\n\t'Tatiyana',\n\t'Nelida',\n\t'Demetra',\n\t'Thais',\n\t'Syriana',\n\t'Nicki',\n\t'Tyanna',\n\t'Idaly',\n\t'Ramonita',\n\t'Zuzanna',\n\t'Aiza',\n\t'Larae',\n\t'Alyanna',\n\t'Aleyah',\n\t'Elayna',\n\t'Blaire',\n\t'Laniyah',\n\t'Rilynn',\n\t'Kandi',\n\t'Sherryl',\n\t'Marti',\n\t'Cherri',\n\t'Kimberli',\n\t'Carma',\n\t'Trena',\n\t'Darcie',\n\t'Evelyne',\n\t'Allissa',\n\t'Meliza',\n\t'Regine',\n\t'Adalina',\n\t'Siya',\n\t'Seraphina',\n\t'Calliope',\n\t'Jiya',\n\t'Talisa',\n\t'Mistie',\n\t'Ignacia',\n\t'Crysta',\n\t'Lona',\n\t'Voncile',\n\t'Rutha',\n\t'Kamiya',\n\t'Anslee',\n\t'Janya',\n\t'Berenise',\n\t'Sonji',\n\t'Yaeko',\n\t'Nika',\n\t'Queena',\n\t'Yatziri',\n\t'Aiko',\n\t'Lisamarie',\n\t'Evalina',\n\t'Alline',\n\t'Alejandrina',\n\t'Trula',\n\t'Hinda',\n\t'Delinda',\n\t'Brisia',\n\t'Aminah',\n\t'Mariella',\n\t'Nayzeth',\n\t'Sherlin',\n\t'Idalia',\n\t'Madaline',\n\t'Shenika',\n\t'Janaya',\n\t'Fabiana',\n\t'Aleeah',\n\t'Lasonya',\n\t'Jania',\n\t'Breindy',\n\t'Mitzy',\n\t'Yaquelin',\n\t'Tzipora',\n\t'Serene',\n\t'Mikaila',\n\t'Aicha',\n\t'Brucha',\n\t'Myrka',\n\t'Kaaren',\n\t'Meg',\n\t'Lise',\n\t'Suhani',\n\t'Liane',\n\t'Celisse',\n\t'Jasmyne',\n\t'Sharde',\n\t'Dannielle',\n\t'Crystle',\n\t'Jenniffer',\n\t'Shaneka',\n\t'Leslye',\n\t'Hedy',\n\t'Tashina',\n\t'Letisia',\n\t'Carys',\n\t'Antonetta',\n\t'Tamisha',\n\t'Kaniya',\n\t'Darline',\n\t'Alizay',\n\t'Minna',\n\t'Raelene',\n\t'Rebecka',\n\t'Martika',\n\t'Makiya',\n\t'Idalis',\n\t'Keasia',\n\t'Breeann',\n\t'Vlasta',\n\t'Ellianna',\n\t'Caelyn',\n\t'Kaytlin',\n\t'Cathi',\n\t'Jamia',\n\t'Tahnee',\n\t'Zulma',\n\t'Mallorie',\n\t'Katlynn',\n\t'Mahi',\n\t'Carleen',\n\t'Honesty',\n\t'Rasheedah',\n\t'Ronna',\n\t'Lissa',\n\t'Sherika',\n\t'Carolynn',\n\t'Romona',\n\t'Jamesha',\n\t'Shakiyla',\n\t'Mccall',\n\t'Joanie',\n\t'Makala',\n\t'Brionna',\n\t'Shaunna',\n\t'Hawa',\n\t'Marylin',\n\t'Baylie',\n\t'Preslie',\n\t'Aaralyn',\n\t'Pia',\n\t'Beatris',\n\t'Adria',\n\t'Arianne',\n\t'Carmina',\n\t'Sebrina',\n\t'Malani',\n\t'Lovely',\n\t'Jahaira',\n\t'Miyah',\n\t'Sylvie',\n\t'Cassi',\n\t'Kaniyah',\n\t'Cailin',\n\t'Santina',\n\t'Nariah',\n\t'Calandra',\n\t'Georgine',\n\t'Serafina',\n\t'Keyana',\n\t'Amethyst',\n\t'Tehya',\n\t'Avni',\n\t'Alessa',\n\t'Novalee',\n\t'Mayleen',\n\t'Aadya',\n\t'Jacquelynn',\n\t'Izetta',\n\t'Sumiko',\n\t'Irasema',\n\t'Annamaria',\n\t'Niya',\n\t'Latrina',\n\t'Cicely',\n\t'Kristiana',\n\t'Kimiko',\n\t'Keara',\n\t'Mazie',\n\t'Najah',\n\t'Evelia',\n\t'Tiarra',\n\t'Jaela',\n\t'Montine',\n\t'Mandie',\n\t'Lavada',\n\t'Dimple',\n\t'Emiko',\n\t'Yocelyn',\n\t'Issabella',\n\t'Rowena',\n\t'Tanja',\n\t'Velda',\n\t'Chantell',\n\t'Gretel',\n\t'Jacelyn',\n\t'Kambri',\n\t'Zayla',\n\t'Anasofia',\n\t'Atiana',\n\t'Dulcemaria',\n\t'Zulay',\n\t'Tari',\n\t'Sahasra',\n\t'Rayleen',\n\t'Greydis',\n\t'Shiela',\n\t'Florinda',\n\t'Samya',\n\t'Shakima',\n\t'Shakeema',\n\t'Yanely',\n\t'Lavina',\n\t'Azalee',\n\t'Oneta',\n\t'Tammye',\n\t'Kelsy',\n\t'Kalie',\n\t'Keanna',\n\t'Daniya',\n\t'Antonina',\n\t'Katharin',\n\t'Tiare',\n\t'Yorley',\n\t'Jeslyn',\n\t'Emeli',\n\t'Zakia',\n\t'Massiel',\n\t'Latesha',\n\t'Jenessa',\n\t'Jayna',\n\t'Raylynn',\n\t'Ainslee',\n\t'Aralynn',\n\t'Khloee',\n\t'Ily',\n\t'Emeri',\n\t'Jeni',\n\t'Kassi',\n\t'Nakita',\n\t'Lakia',\n\t'Ariyanna',\n\t'Addalyn',\n\t'Keyanna',\n\t'Bibiana',\n\t'Genna',\n\t'Kathya',\n\t'Leana',\n\t'Trane',\n\t'Yomira',\n\t'Brigid',\n\t'Dionna',\n\t'Jerilynn',\n\t'Sarita',\n\t'Altha',\n\t'Laniya',\n\t'Zakiya',\n\t'Akilah',\n\t'Celestina',\n\t'Priyanka',\n\t'Taliah',\n\t'Donya',\n\t'Soila',\n\t'Quetzalli',\n\t'Cristel',\n\t'Naia',\n\t'Kailah',\n\t'Zitlaly',\n\t'Tonda',\n\t'Cate',\n\t'Lizzet',\n\t'Vesta',\n\t'Sherilyn',\n\t'Teruko',\n\t'Aldona',\n\t'Armandina',\n\t'Ciana',\n\t'Amairany',\n\t'Elysia',\n\t'Samarah',\n\t'Janyla',\n\t'Skylee',\n\t'Rolanda',\n\t'Sapphire',\n\t'Setsuko',\n\t'Miyoko',\n\t'Contina',\n\t'Imogen',\n\t'Jailine',\n\t'Vanellope',\n\t'Leora',\n\t'Jennah',\n\t'Perl',\n\t'Analiyah',\n\t'Hellen',\n\t'Tyasia',\n\t'Symphony',\n\t'Amada',\n\t'Otilia',\n\t'Avigail',\n\t'Tzivia',\n\t'Fradel',\n\t'Mariadelcarmen',\n\t'Ilona',\n\t'Dyan',\n\t'Zahraa',\n\t'Patrisia',\n\t'Jersey',\n\t'Lilla',\n\t'Lossie',\n\t'Somer',\n\t'Deserie',\n\t'Jaila',\n\t'Briseis',\n\t'Aniston',\n\t'Idell',\n\t'Raeleigh',\n\t'Gracyn',\n\t'Everlee',\n\t'Laurene',\n\t'Sherita',\n\t'Pinkie',\n\t'Nakisha',\n\t'Olevia',\n\t'Corene',\n\t'Loreen',\n\t'Sandie',\n\t'Keosha',\n\t'Kenleigh',\n\t'Alli',\n\t'Alyana',\n\t'Prisha',\n\t'Brookelynn',\n\t'Thaily',\n\t'Maddie',\n\t'Grettel',\n\t'Kinzley',\n\t'Jailynn',\n\t'Kalli',\n\t'Jazzlynn',\n\t'Klaudia',\n\t'Blanch',\n\t'Mariafernanda',\n\t'Makenzi',\n\t'Shonna',\n\t'Lita',\n\t'Karima',\n\t'Rebeccah',\n\t'Isaura',\n\t'Kalee',\n\t'Jori',\n\t'Allysa',\n\t'Tonisha',\n\t'Neda',\n\t'Jenine',\n\t'Chanell',\n\t'Jamaya',\n\t'Lorrayne',\n\t'Birtha',\n\t'Kanisha',\n\t'Nicollette',\n\t'Desiray',\n\t'Kaity',\n\t'Shamya',\n\t'Kathlene',\n\t'Jann',\n\t'Sari',\n\t'Lucila',\n\t'Tressie',\n\t'Charise',\n\t'Kalista',\n\t'Jamileth',\n\t'Kalena',\n\t'Sakura',\n\t'Blondell',\n\t'Thomasina',\n\t'Aila',\n\t'Mossie',\n\t'Tamala',\n\t'Siri',\n\t'Gertha',\n\t'Reta',\n\t'Easter',\n\t'Tala',\n\t'Vivianne',\n\t'Nila',\n\t'Merida',\n\t'Ahana',\n\t'Lanelle',\n\t'Hilaria',\n\t'Arlys',\n\t'Inell',\n\t'Rylynn',\n\t'Cosette',\n\t'Penne',\n\t'Jenevieve',\n\t'Jenilee',\n\t'Carlotta',\n\t'Ziva',\n\t'Hildegard',\n\t'Aleshia',\n\t'Nedra',\n\t'Madelaine',\n\t'Lisandra',\n\t'Pang',\n\t'Sindy',\n\t'Zenaida',\n\t'Lulu',\n\t'Shanya',\n\t'Shakema',\n\t'Katiria',\n\t'Raffaela',\n\t'Solange',\n\t'Illiana',\n\t'Chelsy',\n\t'Shanee',\n\t'Adriene',\n\t'Tyla',\n\t'Cailey',\n\t'Daijah',\n\t'Melonie',\n\t'Courteney',\n\t'Deysi',\n\t'Makinley',\n\t'Brynna',\n\t'Hildegarde',\n\t'Fiorella',\n\t'Kenadee',\n\t'Ellyn',\n\t'Ebonie',\n\t'Thu',\n\t'Charde',\n\t'Kaytlyn',\n\t'Kenadie',\n\t'Georgeann',\n\t'Analicia',\n\t'Emalee',\n\t'Shatara',\n\t'Lucerito',\n\t'Mckell',\n\t'Atiya',\n\t'Stormi',\n\t'Maleny',\n\t'Nariyah',\n\t'Steffanie',\n\t'Kirstyn',\n\t'Zayda',\n\t'Mariadejesus',\n\t'Deeann',\n\t'Abcde',\n\t'Eleanora',\n\t'Pearle',\n\t'Seana',\n\t'Denine',\n\t'Presleigh',\n\t'Keziah',\n\t'Queenie',\n\t'Henchy',\n\t'Merari',\n\t'Joscelyn',\n\t'Celest',\n\t'Mirel',\n\t'Sania',\n\t'Maryah',\n\t'Angelena',\n\t'Emelyn',\n\t'Gissele',\n\t'Fanta',\n\t'Gaylene',\n\t'Adelaida',\n\t'Madie',\n\t'Maja',\n\t'Nashaly',\n\t'Christel',\n\t'Rachele',\n\t'Raniyah',\n\t'Rashel',\n\t'Kavya',\n\t'Callista',\n\t'Elmira',\n\t'Rifky',\n\t'Syeda',\n\t'Tresa',\n\t'Detra',\n\t'Jarely',\n\t'Prisila',\n\t'Enedelia',\n\t'Trany',\n\t'Lainie',\n\t'Yisel',\n\t'Alynna',\n\t'Allysson',\n\t'Tamica',\n\t'Velva',\n\t'Nancee',\n\t'Breleigh',\n\t'Shanita',\n\t'Orelia',\n\t'Patrici',\n\t'Daja',\n\t'Shardae',\n\t'Abriana',\n\t'Halee',\n\t'Dorcas',\n\t'Kathey',\n\t'Rosia',\n\t'Princesa',\n\t'Lezly',\n\t'Dawnmarie',\n\t'Gaby',\n\t'Ania',\n\t'Denae',\n\t'Jahzara',\n\t'Jaymie',\n\t'Bari',\n\t'Suzann',\n\t'Alnisa',\n\t'Fatimah',\n\t'Zakiyyah',\n\t'Yana',\n\t'Naimah',\n\t'Tyisha',\n\t'Kathaleen',\n\t'Sameerah',\n\t'Chesney',\n\t'Shanteria',\n\t'Pamella',\n\t'Rayven',\n\t'Romelia',\n\t'Lucretia',\n\t'Tova',\n\t'Aura',\n\t'Chelsee',\n\t'Roizy',\n\t'Manha',\n\t'Nisha',\n\t'Tierney',\n\t'Girl',\n\t'Taelor',\n\t'Litzi',\n\t'Sneha',\n\t'Natisha',\n\t'Alliyah',\n\t'Sully',\n\t'Twyla',\n\t'Daisey',\n\t'Sarahy',\n\t'Shemeka',\n\t'Lexis',\n\t'Shalanda',\n\t'Kelcie',\n\t'Natacha',\n\t'Amyah',\n\t'Byanka',\n\t'Kymberly',\n\t'Navil',\n\t'Britani',\n\t'Karolyn',\n\t'Emelie',\n\t'Zana',\n\t'Vernita',\n\t'Leigha',\n\t'Romy',\n\t'Arlet',\n\t'Jazlin',\n\t'Laynie',\n\t'Jesslyn',\n\t'Adilyn',\n\t'Karoline',\n\t'Nyomi',\n\t'Maycee',\n\t'Nicol',\n\t'Daliah',\n\t'Lillyann',\n\t'Shawnda',\n\t'Dede',\n\t'Wiktoria',\n\t'Liah',\n\t'Liya',\n\t'Emmerson',\n\t'Aarohi',\n\t'Aribella',\n\t'Brayleigh',\n\t'Sumie',\n\t'Elke',\n\t'Taja',\n\t'Ahsley',\n\t'Tisa',\n\t'Dannette',\n\t'Gidget',\n\t'Misao',\n\t'Adelle',\n\t'Jamiah',\n\t'Joselynn',\n\t'Jalyssa',\n\t'Marnita',\n\t'Trinitee',\n\t'Bev',\n\t'Aleida',\n\t'Cloey',\n\t'Tahlia',\n\t'Melodee',\n\t'Anaiya',\n\t'Clover',\n\t'Prudence',\n\t'Kalynn',\n\t'Dezirae',\n\t'Solana',\n\t'Reena',\n\t'Mariko',\n\t'Tiffiny',\n\t'Elinore',\n\t'Madelyne',\n\t'Anela',\n\t'Bess',\n\t'Perri',\n\t'Loree',\n\t'Cyndy',\n\t'Yolonda',\n\t'Jolee',\n\t'Tequila',\n\t'Sumer',\n\t'Cherilyn',\n\t'Ela',\n\t'Kenlee',\n\t'Alexxis',\n\t'Larisa',\n\t'Nevaeha',\n\t'Nira',\n\t'Shaquasia',\n\t'Shanel',\n\t'Medina',\n\t'Rifka',\n\t'Sable',\n\t'Atara',\n\t'Aissatou',\n\t'Mecca',\n\t'Anastasi',\n\t'Falon',\n\t'Holley',\n\t'Yuliza',\n\t'Lili',\n\t'Siara',\n\t'Kiarah',\n\t'Tiffaney',\n\t'Alyah',\n\t'Annalia',\n\t'Naila',\n\t'Analiah',\n\t'Aymar',\n\t'Tambra',\n\t'Elna',\n\t'Eola',\n\t'Tkeyah',\n\t'Zola',\n\t'Francheska',\n\t'Aidee',\n\t'Alexzandra',\n\t'Cianni',\n\t'Myasia',\n\t'Carisa',\n\t'Ilah',\n\t'Yenifer',\n\t'Veronika',\n\t'Nahomy',\n\t'Madysen',\n\t'Elsy',\n\t'Lilli',\n\t'Belva',\n\t'Steffie',\n\t'Kaylea',\n\t'Ginamarie',\n\t'Sharman',\n\t'Latia',\n\t'Shakeria',\n\t'Audelia',\n\t'Odette',\n\t'Shaniah',\n\t'Diamantina',\n\t'Lorayne',\n\t'Ciarra',\n\t'Wilhelmena',\n\t'Zaina',\n\t'Niesha',\n\t'Kanesha',\n\t'Turquoise',\n\t'Tziporah',\n\t'Timi',\n\t'Fatou',\n\t'Karna',\n\t'Matsue',\n\t'Vina',\n\t'Ronisha',\n\t'Layan',\n\t'Viktoria',\n\t'Lilyann',\n\t'Maliya',\n\t'Jamilex',\n\t'Epifania',\n\t'Fidela',\n\t'Delphia',\n\t'Starasia',\n\t'Glennie',\n\t'Teodora',\n\t'Hatsue',\n\t'Margarett',\n\t'Margarette',\n\t'Laronda',\n\t'Vicenta',\n\t'Cotina',\n\t'Meilani',\n\t'Mannat',\n\t'Leylani',\n\t'Lailani',\n\t'Seerat',\n\t'Reya',\n\t'Amilia',\n\t'Avary',\n\t'Brocha',\n\t'Daneen',\n\t'Kimie',\n\t'Trudi',\n\t'Margret',\n\t'Djuna',\n\t'Charis',\n\t'Izzabella',\n\t'Brionne',\n\t'Elenora',\n\t'Lakeitha',\n\t'Jacki',\n\t'Beckie',\n\t'Guinevere',\n\t'Inara',\n\t'Landrie',\n\t'Nicoletta',\n\t'Ayari',\n\t'Zaniah',\n\t'Merlene',\n\t'Keli',\n\t'Maricella',\n\t'Leonela',\n\t'Donita',\n\t'Tehani',\n\t'Susannah',\n\t'Journi',\n\t'Machelle',\n\t'Tammara',\n\t'Cherrie',\n\t'Nelva',\n\t'Destanie',\n\t'Neyda',\n\t'Tabetha',\n\t'Wilhelmenia',\n\t'Brieanna',\n\t'Turkessa',\n\t'Ameera',\n\t'Avital',\n\t'Marycruz',\n\t'Zoila',\n\t'Tressa',\n\t'Joellen',\n\t'Raisa',\n\t'Bethanie',\n\t'Ermelinda',\n\t'Asiyah',\n\t'Monifa',\n\t'Samia',\n\t'Adamary',\n\t'Anahit',\n\t'Rania',\n\t'Miri',\n\t'Ether',\n\t'Desirea',\n\t'Chimere',\n\t'Erla',\n\t'Karisma',\n\t'Nalleli',\n\t'Larhonda',\n\t'Darlyn',\n\t'Anaisa',\n\t'Suellen',\n\t'Kamaria',\n\t'Nashla',\n\t'Yuriko',\n\t'Tzirel',\n\t'Tehila',\n\t'Myriah',\n\t'Frimet',\n\t'Cesilia',\n\t'Marika',\n\t'Frady',\n\t'Deloise',\n\t'Saleen',\n\t'Betsey',\n\t'Merri',\n\t'Laurette',\n\t'Sharita',\n\t'Shena',\n\t'Porscha',\n\t'Aerial',\n\t'Florrie',\n\t'Ayah',\n\t'Anusha',\n\t'Jeanelle',\n\t'Lessly',\n\t'Mahogany',\n\t'See',\n\t'Hang',\n\t'Karinna',\n\t'Leighann',\n\t'Elexus',\n\t'Markayla',\n\t'Kaneesha',\n\t'Barbie',\n\t'Aurea',\n\t'Kaeli',\n\t'Arwen',\n\t'Angelyn',\n\t'Jaclynn',\n\t'Tesla',\n\t'Maritsa',\n\t'Madelin',\n\t'Alisia',\n\t'Tyana',\n\t'Kimberlyn',\n\t'Dejanae',\n\t'Dalena',\n\t'Blessing',\n\t'Courtnie',\n\t'Amaria',\n\t'Micki',\n\t'Safa',\n\t'Jadah',\n\t'Mele',\n\t'Maryssa',\n\t'Channel',\n\t'Lianne',\n\t'Alea',\n\t'Chyanne',\n\t'Addelyn',\n\t'Aaleyah',\n\t'Michela',\n\t'Torri',\n\t'Indira',\n\t'Kanani',\n\t'Lashundra',\n\t'Mikaylah',\n\t'Zoee',\n\t'Taelyn',\n\t'Noheli',\n\t'Sarena',\n\t'Dariela',\n\t'Adalie',\n\t'Meggan',\n\t'Daniyah',\n\t'Sela',\n\t'Shaelyn',\n\t'Maylen',\n\t'Giovana',\n\t'Ayvah',\n\t'Arabelle',\n\t'Adaline',\n\t'Isyss',\n\t'Melanny',\n\t'Margaux',\n\t'Klara',\n\t'Janey',\n\t'Idolina',\n\t'Georgetta',\n\t'Amaiya',\n\t'Sianna',\n\t'Rebeka',\n\t'Meleny',\n\t'Kelle',\n\t'Angelika',\n\t'Malerie',\n\t'Latara',\n\t'Niamh',\n\t'Yevette',\n\t'Yomayra',\n\t'Karizma',\n\t'Nayelie',\n\t'Shantal',\n\t'Latoyia',\n\t'Jenee',\n\t'Shandra',\n\t'Magdalen',\n\t'Yatzari',\n\t'Jettie',\n\t'Charlsie',\n\t'Idy',\n\t'Inaya',\n\t'Yitta',\n\t'Reem',\n\t'Basya',\n\t'Skylynn',\n\t'Elyana',\n\t'Brynley',\n\t'Amor',\n\t'Amberlee',\n\t'Eternity',\n\t'Niyah',\n\t'Emiley',\n\t'Madeleyn',\n\t'Korie',\n\t'Sanaya',\n\t'Meira',\n\t'Chevonne',\n\t'Sabra',\n\t'Uma',\n\t'Kaira',\n\t'Isobel',\n\t'Elli',\n\t'Gurleen',\n\t'Berneice',\n\t'Alvera',\n\t'Ambrosia',\n\t'Roya',\n\t'Bettyann',\n\t'Alverda',\n\t'Tinamarie',\n\t'Tanasia',\n\t'Lavonda',\n\t'Jorja',\n\t'Heide',\n\t'Marwa',\n\t'Annaly',\n\t'Aaliah',\n\t'Ileen',\n\t'Lamonica',\n\t'Enjoli',\n\t'Ninel',\n\t'Milissa',\n\t'Dawne',\n\t'Joie',\n\t'Ashlei',\n\t'Elidia',\n\t'Maybelle',\n\t'Getsemani',\n\t'Gisella',\n\t'Mariya',\n\t'Adisyn',\n\t'Adia',\n\t'Caterina',\n\t'Bettyjane',\n\t'Kaydee',\n\t'Rasheda',\n\t'Camisha',\n\t'Chassidy',\n\t'Sadia',\n\t'Aislyn',\n\t'Ngoc',\n\t'Mirka',\n\t'Lanita',\n\t'Lashawnda',\n\t'Liridona',\n\t'Tynisa',\n\t'Arnelle',\n\t'Librada',\n\t'Marita',\n\t'Makyla',\n\t'Raniya',\n\t'Kandis',\n\t'Ethelyn',\n\t'Divina',\n\t'Genevie',\n\t'Jadelyn',\n\t'Ashleen',\n\t'Saya',\n\t'Marli',\n\t'Calli',\n\t'Anyla',\n\t'Sheng',\n\t'Vasiliki',\n\t'Yelena',\n\t'Darya',\n\t'Clarabelle',\n\t'Shirlene',\n\t'Tommye',\n\t'Julieann',\n\t'Jennefer',\n\t'Rana',\n\t'Raeann',\n\t'Suleima',\n\t'Lilyanne',\n\t'Jelisa',\n\t'Jaymee',\n\t'Rhylee',\n\t'Keyli',\n\t'Brooklin',\n\t'Meta',\n\t'Shakirah',\n\t'Loria',\n\t'Sharyl',\n\t'Sharday',\n\t'Manuelita',\n\t'Debera',\n\t'Lera',\n\t'Jacquie',\n\t'Ardella',\n\t'Jameria',\n\t'Winnifred',\n\t'Rossana',\n\t'Shemika',\n\t'Sedona',\n\t'Arvilla',\n\t'Samaira',\n\t'Aitana',\n\t'Daiana',\n\t'Cassia',\n\t'Lucianna',\n\t'Tama',\n\t'Shigeko',\n\t'Sueko',\n\t'Hatsuko',\n\t'Hazle',\n\t'Lida',\n\t'Wylene',\n\t'Sachiko',\n\t'Tahiry',\n\t'Renea',\n\t'Janina',\n\t'Becki',\n\t'Vy',\n\t'Cherryl',\n\t'Arionna',\n\t'Marrissa',\n\t'Randee',\n\t'Norita',\n\t'Sonali',\n\t'Susann',\n\t'Rachell',\n\t'Natashia',\n\t'Aspyn',\n\t'Malaika',\n\t'Nuvia',\n\t'Safiya',\n\t'Contessa',\n\t'Julyssa',\n\t'Analiese',\n\t'Jacee',\n\t'Kathlyn',\n\t'Gracey',\n\t'Chassity',\n\t'Kady',\n\t'Tytiana',\n\t'Katiana',\n\t'Eneida',\n\t'Teela',\n\t'Roiza',\n\t'Alaura',\n\t'Giuseppina',\n\t'Randa',\n\t'Danisha',\n\t'Mariza',\n\t'Marquisha',\n\t'Sharese',\n\t'Deseree',\n\t'Inaaya',\n\t'Rivkah',\n\t'Tawnie',\n\t'Miriah',\n\t'Shereen',\n\t'Candra',\n\t'Tomiko',\n\t'Whittney',\n\t'Aziza',\n\t'Ayala',\n\t'Hafsa',\n\t'Zaynab',\n\t'Kaileigh',\n\t'Yarima',\n\t'Danitza',\n\t'Maram',\n\t'Shakeya',\n\t'Emmer',\n\t'Kareema',\n\t'Maayan',\n\t'Rheanna',\n\t'Jaritza',\n\t'Marleny',\n\t'Zitlali',\n\t'Vanity',\n\t'Apryl',\n\t'Zully',\n\t'Tashia',\n\t'Courtnee',\n\t'Laporsha',\n\t'Luvenia',\n\t'Batya',\n\t'Ayelet',\n\t'Quetcy',\n\t'Tiny',\n\t'Felicita',\n\t'Omaira',\n\t'Nyssa',\n\t'Krystine',\n\t'Stevi',\n\t'Michiko',\n\t'Tennie',\n\t'Tomekia',\n\t'Billiejo',\n\t'Yohana',\n\t'Krystyna',\n\t'Kacee',\n\t'Naja',\n\t'Charmayne',\n\t'Twana',\n\t'Jeane',\n\t'Brittnay',\n\t'Cherelle',\n\t'Raechel',\n\t'Temeka',\n\t'Jasmeen',\n\t'Zuria',\n\t'Zailey',\n\t'Saydee',\n\t'Renatta',\n\t'Neta',\n\t'Bg',\n\t'Italy',\n\t'Terrica',\n\t'Goldia',\n\t'Monae',\n\t'Yelitza',\n\t'Ryanne',\n\t'Samirah',\n\t'Breckyn',\n\t'Nicolina',\n\t'Olympia',\n\t'Almeta',\n\t'Tamesha',\n\t'Zora',\n\t'Emmaleigh',\n\t'Loralei',\n\t'Kennadi',\n\t'Julieanna',\n\t'Jenavieve',\n\t'Shylah',\n\t'Akemi',\n\t'Fonda',\n\t'Nizhoni',\n\t'Iqra',\n\t'Gaetana',\n\t'Coreen',\n\t'Evonne',\n\t'Sadako',\n\t'Angele',\n\t'Macel',\n\t'Alinna',\n\t'Avneet',\n\t'Jannah',\n\t'Nickole',\n\t'Lotus',\n\t'Yukie',\n\t'Laiyah',\n\t'Kynzlee',\n\t'Mailen',\n\t'Nobuko',\n\t'Annaleigh',\n\t'Otila',\n\t'Shona',\n\t'Kimberely',\n\t'Delcie',\n\t'Zula',\n\t'Roselynn',\n\t'Aleeyah',\n\t'Bellarose',\n\t'Damya',\n\t'Cammie',\n\t'Treena',\n\t'Chanie',\n\t'Kaliah',\n\t'Abella',\n\t'Aahana',\n\t'Mileena',\n\t'Adaleigh',\n\t'Keiry',\n\t'Journie',\n\t'Myrtie',\n\t'Tsuruko',\n\t'Lyda',\n\t'Fernande',\n\t'Julee',\n\t'Estephany',\n\t'Louvenia',\n\t'Monserat',\n\t'Meena',\n\t'Jayline',\n\t'Brie',\n\t'Elicia',\n\t'Suzana',\n\t'Dusti',\n\t'Odile',\n\t'Hilma',\n\t'Katarzyna',\n\t'Jenise',\n\t'Hiromi',\n\t'Huong',\n\t'Deolinda',\n\t'Pamelia',\n\t'Awa',\n\t'Odelia',\n\t'Mattison',\n\t'Gwenda',\n\t'Sera',\n\t'Yuritzi',\n\t'Karishma',\n\t'Kaina',\n\t'Henna',\n\t'Norene',\n\t'Brina',\n\t'Chyenne',\n\t'Moncerrat',\n\t'Keilah',\n\t'Saphira',\n\t'Marylee',\n\t'Meri',\n\t'Lajuana',\n\t'Lindsy',\n\t'Shanise',\n\t'Sugey',\n\t'Jaimi',\n\t'Viki',\n\t'Ceola',\n\t'Naiya',\n\t'Adysen',\n\t'Shantavia',\n\t'Amberlyn',\n\t'Brihanna',\n\t'Laela',\n\t'Kenadi',\n\t'Hermine',\n\t'Bernita',\n\t'Deziree',\n\t'Anja',\n\t'Lawana',\n\t'Aletha',\n\t'Nella',\n\t'Irelyn',\n\t'Jakira',\n\t'Wynema',\n\t'Janai',\n\t'Keondra',\n\t'Venice',\n\t'Zenobia',\n\t'Jaelene',\n\t'Ammy',\n\t'Alizah',\n\t'Lakiesha',\n\t'Azure',\n\t'Aysha',\n\t'Saniah',\n\t'Mahnoor',\n\t'Ananda',\n\t'Asma',\n\t'Aissata',\n\t'Jaileen',\n\t'Yailin',\n\t'Xiana',\n\t'Laiza',\n\t'Liseth',\n\t'Marykate',\n\t'Daizy',\n\t'Neoma',\n\t'Tykeria',\n\t'Shamiya',\n\t'Nykeria',\n\t'Addalynn',\n\t'Kenzley',\n\t'Ardyce',\n\t'Anylah',\n\t'Vallie',\n\t'Darlyne',\n\t'Makiah',\n\t'Neela',\n\t'Naraly',\n\t'Danni',\n\t'Jolina',\n\t'Ailene',\n\t'Lyndia',\n\t'Erminia',\n\t'Asiya',\n\t'Alexius',\n\t'Mc',\n\t'Maylene',\n\t'Signe',\n\t'Adelfa',\n\t'Yusra',\n\t'Keyonna',\n\t'Yasuko',\n\t'Yukiko',\n\t'Augustina',\n\t'Leen',\n\t'Fumie',\n\t'Amora',\n\t'Annaleah',\n\t'Anvi',\n\t'Indie',\n\t'Haya',\n\t'Emmarie',\n\t'Enya',\n\t'Chieko',\n\t'Kinsleigh',\n\t'Shiann',\n\t'Eufemia',\n\t'Fusae',\n\t'Akiko',\n\t'Hosanna',\n\t'Alitzel',\n\t'Araya',\n\t'Anaiyah',\n\t'Rosy',\n\t'Nishka',\n\t'Gao',\n\t'Tamiya',\n\t'Lillyan',\n\t'Eudelia',\n\t'Kamea',\n\t'Berlyn',\n\t'Kahlan',\n\t'Alinah',\n\t'Mahealani',\n\t'Leeah',\n\t'Rosalynn',\n\t'Zadie',\n\t'Aolanis',\n\t'Esta',\n\t'Maisy',\n\t'Chevelle',\n\t'Jalayah',\n\t'Yatziry',\n\t'Alyne',\n\t'Jodell',\n\t'Sariya',\n\t'Yashica',\n\t'Jissel',\n\t'Letty',\n\t'Mariaisabel',\n\t'Lizzeth',\n\t'Yovana',\n\t'Dyanna',\n\t'Tamyra',\n\t'Monzerrat',\n\t'Seanna',\n\t'Eldora',\n\t'Mattea',\n\t'Zahira',\n\t'Jeanetta',\n\t'Aysia',\n\t'Ashlin',\n\t'Tenika',\n\t'Lezlie',\n\t'Kailie',\n\t'Jariyah',\n\t'Jovie',\n\t'Kiyah',\n\t'Lynlee',\n\t'Abriella',\n\t'Adleigh',\n\t'Ranada',\n\t'Vertie',\n\t'Flonnie',\n\t'Kynnedi',\n\t'Lya',\n\t'Acelynn',\n\t'Emalyn',\n\t'Emberly',\n\t'Yalexa',\n\t'Izabela',\n\t'Sadye',\n\t'Kamyla',\n\t'Jayleigh',\n\t'Cayleigh',\n\t'Ceil',\n\t'Inger',\n\t'Cindee',\n\t'Nena',\n\t'Loan',\n\t'Kiya',\n\t'Laure',\n\t'Cristen',\n\t'Celenia',\n\t'Fredda',\n\t'Ravyn',\n\t'Mee',\n\t'Graci',\n\t'Azalia',\n\t'Latina',\n\t'Hassie',\n\t'Dinorah',\n\t'Virna',\n\t'Autum',\n\t'Michala',\n\t'Macayla',\n\t'Franca',\n\t'Corissa',\n\t'Alysse',\n\t'Monisha',\n\t'Jessyca',\n\t'Nisa',\n\t'Jacqulyn',\n\t'Makaylee',\n\t'Ellin',\n\t'Jameelah',\n\t'Shalon',\n\t'Jlynn',\n\t'Kennady',\n\t'Brinkley',\n\t'Providence',\n\t'Phylis',\n\t'Eugenie',\n\t'Clementina',\n\t'Kadynce',\n\t'Yuvia',\n\t'Mailyn',\n\t'Taneisha',\n\t'Samone',\n\t'Aurore',\n\t'Brienne',\n\t'Tritia',\n\t'Fayth',\n\t'Jayci',\n\t'Jorie',\n\t'Loreal',\n\t'Taylar',\n\t'Maryn',\n\t'Melissia',\n\t'Midori',\n\t'Hisako',\n\t'Hulda',\n\t'Bobbijo',\n\t'Bulah',\n\t'Nancye',\n\t'Melvina',\n\t'Sherree',\n\t'Kierstin',\n\t'Merrilee',\n\t'Lonna',\n\t'Judyth',\n\t'Nancie',\n\t'Lark',\n\t'Candyce',\n\t'Kadejah',\n\t'Kenda',\n\t'Fara',\n\t'Estephania',\n\t'Cady',\n\t'Marilin',\n\t'Kadie',\n\t'Suleyma',\n\t'Jacquelyne',\n\t'Vonetta',\n\t'Tanairi',\n\t'Charlott',\n\t'Shannel',\n\t'Zenia',\n\t'Alise',\n\t'Takara',\n\t'Lyndsie',\n\t'Ivett',\n\t'Letisha',\n\t'Idania',\n\t'Lacee',\n\t'Candie',\n\t'Camelia',\n\t'Brittanee',\n\t'Mariaeduarda',\n\t'Geovanna',\n\t'Kirsti',\n\t'Michaella',\n\t'Kelsee',\n\t'Cheryll',\n\t'Cyrstal',\n\t'Keriann',\n\t'Latrisha',\n\t'Exie',\n\t'Deborha',\n\t'Verdie',\n\t'Zahava',\n\t'Zuleika',\n\t'Dorla',\n\t'Dominiqu',\n\t'Sharina',\n\t'Ardeth',\n\t'Alethia',\n\t'Starlene',\n\t'Shamira',\n\t'Shantelle',\n\t'Marilou',\n\t'Kyah',\n\t'Kyana',\n\t'Clemencia',\n\t'Cordie',\n\t'Meagen',\n\t'Xitlalic',\n\t'Gaia',\n\t'Ellia',\n\t'Elani',\n\t'Jaylani',\n\t'Krisha',\n\t'Khalia',\n\t'Aaradhya',\n\t'Aeris',\n\t'Avamarie',\n\t'Artemis',\n\t'Sheana',\n\t'Jolynn',\n\t'Sandee',\n\t'Wendie',\n\t'Willia',\n\t'Loriene',\n\t'Apolonia',\n\t'Eusebia',\n\t'Kazue',\n\t'Synthia',\n\t'Harue',\n\t'Siomara',\n\t'Nhi',\n\t'Maleni',\n\t'Toyoko',\n\t'Freeda',\n\t'Hideko',\n\t'Sherrye',\n\t'Bethanne',\n\t'Merrie',\n\t'Peri',\n\t'Ozella',\n\t'Venetia',\n\t'Revonda',\n\t'Breauna',\n\t'Arika',\n\t'Annissa',\n\t'Leeza',\n\t'Siera',\n\t'Jakiyah',\n\t'Kamaya',\n\t'Lashay',\n\t'Elvina',\n\t'Laquinta',\n\t'Faren',\n\t'Harmonie',\n\t'Brianny',\n\t'Jama',\n\t'Johna',\n\t'Sharalyn',\n\t'Aziyah',\n\t'Hadassa',\n\t'Shantinique',\n\t'Treasa',\n\t'Penni',\n\t'Shakera',\n\t'Carolyne',\n\t'Shaunda',\n\t'Talya',\n\t'Karyna',\n\t'Natosha',\n\t'Vivica',\n\t'Pauletta',\n\t'Laverna',\n\t'Danasia',\n\t'Shakita',\n\t'Sharee',\n\t'Yajayra',\n\t'Karlene',\n\t'Reatha',\n\t'Laiba',\n\t'Zamiyah',\n\t'Shirleen',\n\t'Bettylou',\n\t'Nakiya',\n\t'Eryka',\n\t'Bailie',\n\t'Janiece',\n\t'Keisa',\n\t'Kiah',\n\t'Jennica',\n\t'Niasia',\n\t'Hildy',\n\t'Jacquel',\n\t'Mahina',\n\t'Eshal',\n\t'Khloey',\n\t'Emelin',\n\t'Eesha',\n\t'Kaylei',\n\t'Aymee',\n\t'Alona',\n\t'Catelyn',\n\t'Arushi',\n\t'Ameerah',\n\t'Regenia',\n\t'Brailey',\n\t'Sparkle',\n\t'Giavonna',\n\t'Ashunti',\n\t'Naudia',\n\t'Kyrsten',\n\t'Emmalina',\n\t'Neve',\n\t'Aolani',\n\t'Gizella',\n\t'Tameika',\n\t'Leocadia',\n\t'Nidhi',\n\t'Wende',\n\t'Eshaal',\n\t'Cherice',\n\t'Lakeysha',\n\t'Menucha',\n\t'Ameena',\n\t'Kloey',\n\t'Nayelly',\n\t'Kathryne',\n\t'Lashawna',\n\t'Kristle',\n\t'Zaylie',\n\t'Keylee',\n\t'Landree',\n\t'Wynell',\n\t'Dezarae',\n\t'Angelli',\n\t'Haddie',\n\t'Ilyana',\n\t'Jaleigh',\n\t'Brilee',\n\t'Lakeya',\n\t'Kanika',\n\t'Lavinia',\n\t'Marykay',\n\t'Ruthanne',\n\t'Tenille',\n\t'Dorine',\n\t'Esabella',\n\t'Genavieve',\n\t'Zarah',\n\t'Mileidy',\n\t'Solara',\n\t'Yamila',\n\t'Amaia',\n\t'Season',\n\t'Cheree',\n\t'Luise',\n\t'Tracye',\n\t'Christeen',\n\t'Florida',\n\t'Breona',\n\t'Kathe',\n\t'Jakyra',\n\t'Zury',\n\t'Lakeesha',\n\t'Yaneth',\n\t'Keandra',\n\t'Agnieszka',\n\t'Markita',\n\t'Mariska',\n\t'Zada',\n\t'Breasia',\n\t'Aaniyah',\n\t'Kambria',\n\t'Lilit',\n\t'Sheilah',\n\t'Cherisse',\n\t'Hermione',\n\t'Angeli',\n\t'Britnie',\n\t'Lisett',\n\t'Joette',\n\t'Nga',\n\t'Ruthe',\n\t'Anamarie',\n\t'Mayeli',\n\t'Takia',\n\t'Lien',\n\t'Tenaya',\n\t'Kera',\n\t'Meah',\n\t'Mei',\n\t'Anoushka',\n\t'Annalyse',\n\t'Persia',\n\t'Sheccid',\n\t'Kyndra',\n\t'Susy',\n\t'Steffany',\n\t'Jennavecia',\n\t'Briannah',\n\t'Kynlie',\n\t'Alexxa',\n\t'Paizlee',\n\t'Jesika',\n\t'Kinzlee',\n\t'Ishani',\n\t'Freyja',\n\t'Julietta',\n\t'Raynette',\n\t'Nely',\n\t'Zayleigh',\n\t'Amberlynn',\n\t'Journei',\n\t'Eimy',\n\t'Delany',\n\t'Emarie',\n\t'Brilynn',\n\t'Audri',\n\t'Abilene',\n\t'Saoirse',\n\t'Naveah',\n\t'Ayelen',\n\t'Emeline',\n\t'Loryn',\n\t'Mykaela',\n\t'Skarlett',\n\t'Tionne',\n\t'Rashelle',\n\t'Jerline',\n\t'Ofilia',\n\t'Rufina',\n\t'Phillis',\n\t'Jenica',\n\t'Dineen',\n\t'Glory',\n\t'Camellia',\n\t'Alane',\n\t'Angelyna',\n\t'Amalie',\n\t'Kina',\n\t'Kateri',\n\t'Neyva',\n\t'Malisa',\n\t'Saida',\n\t'Jerika',\n\t'Bayli',\n\t'Crystale',\n\t'Silvana',\n\t'Inga',\n\t'Lyndi',\n\t'Leeanna',\n\t'Cheyanna',\n\t'Fayrene',\n\t'Torie',\n\t'Latashia',\n\t'Baleigh',\n\t'Fidencia',\n\t'Rori',\n\t'Lorianne',\n\t'Catrice',\n\t'Cherrelle',\n\t'Lashaunda',\n\t'Sammi',\n\t'Thomasena',\n\t'Roshanda',\n\t'Alazae',\n\t'Enza',\n\t'Mairead',\n\t'Pandora',\n\t'Kortni',\n\t'Timber',\n\t'Chasidy',\n\t'Danesha',\n\t'Camry',\n\t'Charlette',\n\t'Kaneshia',\n\t'Shadae',\n\t'Keturah',\n\t'Randye',\n\t'Kiyana',\n\t'Charlean',\n\t'Delana',\n\t'Tomasita',\n\t'Lilliam',\n\t'Bibi',\n\t'Marguita',\n\t'Maryalice',\n\t'Iraida',\n\t'Tyhessia',\n\t'Makeba',\n\t'Tanaya',\n\t'Keiara',\n\t'Madlyn',\n\t'Jelissa',\n\t'Shakayla',\n\t'Mickayla',\n\t'Aleisha',\n\t'Keyara',\n\t'Mekayla',\n\t'Mykala',\n\t'Riva',\n\t'Inaara',\n\t'Paulita',\n\t'Lashae',\n\t'Destynee',\n\t'Christianna',\n\t'Rise',\n\t'Larraine',\n\t'Luetta',\n\t'Merna',\n\t'Francena',\n\t'Diedre',\n\t'Georgiann',\n\t'Rubbie',\n\t'Denita',\n\t'Dyani',\n\t'Laticia',\n\t'Ludivina',\n\t'Suanne',\n\t'Hareem',\n\t'Nava',\n\t'Florie',\n\t'Sherly',\n\t'Vidhi',\n\t'Camie',\n\t'Sharell',\n\t'Chole',\n\t'Jolin',\n\t'Polina',\n\t'Brittiany',\n\t'Delicia',\n\t'Brystol',\n\t'Beaulah',\n\t'Leatha',\n\t'Jamilah',\n\t'Zona',\n\t'Elliette',\n\t'Joye',\n\t'Aashi',\n\t'Kerriann',\n\t'Xin',\n\t'Michaelene',\n\t'Senaida',\n\t'Emaan',\n\t'Nakayla',\n\t'Aine',\n\t'Jadalyn',\n\t'Maimouna',\n\t'Klaire',\n\t'Macee',\n\t'Shandi',\n\t'Heily',\n\t'Braylynn',\n\t'Aislynn',\n\t'Chevon',\n\t'Henretta',\n\t'Bellamy',\n\t'Icie',\n\t'Draya',\n\t'Darianna',\n\t'Zyana',\n\t'Zaelynn',\n\t'Story',\n\t'Kambrie',\n\t'Ranae',\n\t'Florencia',\n\t'Porfiria',\n\t'Elianny',\n\t'Karren',\n\t'Yachet',\n\t'Euna',\n\t'Naoma',\n\t'Stefania',\n\t'Liora',\n\t'Zlaty',\n\t'Margene',\n\t'Denna',\n\t'Isidra',\n\t'Faustina',\n\t'Bintou',\n\t'Arbutus',\n\t'Kelci',\n\t'Evelena',\n\t'Maudine',\n\t'Agapita',\n\t'Olyvia',\n\t'Loma',\n\t'Veola',\n\t'Mckinlee',\n\t'Lamya',\n\t'Nashali',\n\t'Baileigh',\n\t'Josselin',\n\t'Kaydance',\n\t'Paiton',\n\t'Myleigh',\n\t'Jazlyne',\n\t'Indya',\n\t'Siham',\n\t'Aryn',\n\t'Madalene',\n\t'Nefertiti',\n\t'Meridith',\n\t'Kamesha',\n\t'Peg',\n\t'Shelbey',\n\t'Pearlean',\n\t'Jamika',\n\t'Maryama',\n\t'Sabria',\n\t'Taniqua',\n\t'Maraya',\n\t'Joely',\n\t'Karys',\n\t'Charolette',\n\t'Orly',\n\t'Jennipher',\n\t'Kimbra',\n\t'Krislynn',\n\t'Kenlie',\n\t'Karrington',\n\t'Kambry',\n\t'Alasia',\n\t'Carletta',\n\t'Maija',\n\t'Nadirah',\n\t'Gladyce',\n\t'Shevy',\n\t'Jalessa',\n\t'Mushka',\n\t'Cyre',\n\t'Mabry',\n\t'Arihanna',\n\t'Brithany',\n\t'Ilianna',\n\t'Jozlynn',\n\t'Zandra',\n\t'Serinity',\n\t'Passion',\n\t'Lacresha',\n\t'Jeraldine',\n\t'Henriette',\n\t'Elenore',\n\t'Nastassia',\n\t'Ruchel',\n\t'Amal',\n\t'Madina',\n\t'Rosaline',\n\t'Liyana',\n\t'Pasqualina',\n\t'Keyra',\n\t'Kaycie',\n\t'Lyanna',\n\t'Naina',\n\t'Gennesis',\n\t'Aarushi',\n\t'Lariah',\n\t'Jakiya',\n\t'Kareena',\n\t'Rhiana',\n\t'Emilly',\n\t'Yeimi',\n\t'Matsuko',\n\t'Makhia',\n\t'Alin',\n\t'Addisen',\n\t'Lanae',\n\t'Oceana',\n\t'Laquanda',\n\t'Coralie',\n\t'Arina',\n\t'Harini',\n\t'Emy',\n\t'Emmarose',\n\t'Ellyana',\n\t'Eila',\n\t'Havana',\n\t'Dagny',\n\t'Leylah',\n\t'Shawanna',\n\t'Aleenah',\n\t'Adalia',\n\t'Aaliya',\n\t'Zyanya',\n\t'Felisa',\n\t'Tameca',\n\t'Sama',\n\t'Ripley',\n\t'Nayomi',\n\t'Quanesha',\n\t'Shequita',\n\t'Shanik',\n\t'Savina',\n\t'Nalah',\n\t'Magaby',\n\t'Cattaleya',\n\t'Calla',\n\t'Lillia',\n\t'Kaida',\n\t'Izabell',\n\t'Francia',\n\t'Caylin',\n\t'Bianey',\n\t'Hanah',\n\t'Julienne',\n\t'Viva',\n\t'Xochil',\n\t'Staphany',\n\t'Rayanne',\n\t'Marialuisa',\n\t'Devina',\n\t'Sabryna',\n\t'Estefanie',\n\t'Dinora',\n\t'Clarisse',\n\t'Josephina',\n\t'Milca',\n\t'Anjolie',\n\t'Akayla',\n\t'Malea',\n\t'Mea',\n\t'Meghana',\n\t'Briceida',\n\t'Betsaida',\n\t'Roselin',\n\t'Anuhea',\n\t'Megha',\n\t'Azusena',\n\t'Nandini',\n\t'Prisilla',\n\t'Shelsy',\n\t'Olene',\n\t'Kaneisha',\n\t'Onalee',\n\t'Jadore',\n\t'Monteen',\n\t'Trudie',\n\t'Leisha',\n\t'Drucilla',\n\t'Tamiyah',\n\t'Ashante',\n\t'Daysha',\n\t'Caliyah',\n\t'Sabella',\n\t'Emoni',\n\t'Jakyla',\n\t'Reginae',\n\t'Anyah',\n\t'Kierstyn',\n\t'Sharleen',\n\t'Doretta',\n\t'Harlene',\n\t'Gerrie',\n\t'Zofia',\n\t'Albertine',\n\t'Bronwyn',\n\t'Terresa',\n\t'Delta',\n\t'Anijah',\n\t'Mathilde',\n\t'Cindie',\n\t'Dalene',\n\t'Cyndee',\n\t'Eulah',\n\t'Ayako',\n\t'Beverlee',\n\t'Nicholle',\n\t'Kaitlan',\n\t'Yeraldin',\n\t'Tawney',\n\t'Tawnee',\n\t'Britteny',\n\t'Alishia',\n\t'Shireen',\n\t'Byanca',\n\t'Rebekka',\n\t'Annel',\n\t'Krizia',\n\t'Kerstin',\n\t'Shera',\n\t'Uyen',\n\t'Ligia',\n\t'Dallana',\n\t'Itsel',\n\t'Karine',\n\t'Sharmaine',\n\t'Noely',\n\t'Marrisa',\n\t'Karah',\n\t'Rayann',\n\t'Oksana',\n\t'Stephannie',\n\t'Brynne',\n\t'Alixandra',\n\t'Dyana',\n\t'Emilce',\n\t'Delmy',\n\t'Jamee',\n\t'Caitlan',\n\t'Marily',\n\t'Kiani',\n\t'Jennafer',\n\t'Nissa',\n\t'Jenell',\n\t'Jennette',\n\t'Marquitta',\n\t'Chimene',\n\t'Justyna',\n\t'Jenette',\n\t'Cassy',\n\t'Temika',\n\t'Katrice',\n\t'Brandis',\n\t'Consuela',\n\t'Chavon',\n\t'Angella',\n\t'Shantrell',\n\t'Christiane',\n\t'Shenna',\n\t'Donia',\n\t'Angelise',\n\t'Janyah',\n\t'Damiyah',\n\t'Luzmaria',\n\t'Meghna',\n\t'Natally',\n\t'Nerissa',\n\t'Kaori',\n\t'Laya',\n\t'Analyssa',\n\t'Teya',\n\t'Alizon',\n\t'Jasline',\n\t'Lavette',\n\t'Emmi',\n\t'Kamisha',\n\t'Taleah',\n\t'Shenita',\n\t'Kaytlynn',\n\t'Azariyah',\n\t'Dominica',\n\t'Malvina',\n\t'Skyy',\n\t'Shondra',\n\t'Lorina',\n\t'Donielle',\n\t'Kaisley',\n\t'Katalyna',\n\t'Jesslynn',\n\t'Yasmina',\n\t'Glada',\n\t'Maliha',\n\t'Irina',\n\t'Hiba',\n\t'Trinette',\n\t'Oona',\n\t'Aleeza',\n\t'Arisha',\n\t'Janean',\n\t'Cristie',\n\t'Syd',\n\t'Lavona',\n\t'Kennia',\n\t'Kyanna',\n\t'Lovenia',\n\t'Julieanne',\n\t'Launa',\n\t'Taunya',\n\t'Tytianna',\n\t'Becca',\n\t'Deonna',\n\t'Jihan',\n\t'Jomaira',\n\t'Shantay',\n\t'Talitha',\n\t'Shyra',\n\t'Alverna',\n\t'Chere',\n\t'Kamela',\n\t'Phaedra',\n\t'Stacee',\n\t'Gretta',\n\t'Kathyrn',\n\t'Shalee',\n\t'Beautiful',\n\t'Lissett',\n\t'Georgann',\n\t'Corrin',\n\t'Chelsa',\n\t'Cera',\n\t'Layna',\n\t'Lizanne',\n\t'Mariellen',\n\t'Lashandra',\n\t'Sophya',\n\t'Shruti',\n\t'Janea',\n\t'Rheta',\n\t'Jezebel',\n\t'Alizee',\n\t'Delaila',\n\t'Dayani',\n\t'Arieanna',\n\t'Amarah',\n\t'Janyia',\n\t'Makalah',\n\t'Dorie',\n\t'Tynisha',\n\t'Tran',\n\t'Prisma',\n\t'Shirin',\n\t'Tonette',\n\t'Suzi',\n\t'Alajah',\n\t'Lurline',\n\t'Adelia',\n\t'Tani',\n\t'Cassey',\n\t'Maha',\n\t'Cheyann',\n\t'Keyona',\n\t'Yezenia',\n\t'Vaness',\n\t'Stephine',\n\t'Cyndie',\n\t'Jaylanie',\n\t'Jeannemarie',\n\t'Mammie',\n\t'Sherice',\n\t'Delynn',\n\t'Aoife',\n\t'Kadiatou',\n\t'Sherese',\n\t'Trenyce',\n\t'Anaiz',\n\t'Anaiza',\n\t'Dajanae',\n\t'Lisaann',\n\t'Keiko',\n\t'Martiza',\n\t'Elysa',\n\t'Petrina',\n\t'Dierdre',\n\t'Davida',\n\t'Falyn',\n\t'Briona',\n\t'Maryjean',\n\t'Lanisha',\n\t'Marlenne',\n\t'Nawal',\n\t'Ethelene',\n\t'Alya',\n\t'Ariannah',\n\t'Jacinta',\n\t'Alaia',\n\t'Sindee',\n\t'Jalaya',\n\t'Mellanie',\n\t'Lasya',\n\t'Kyrah',\n\t'Mirabella',\n\t'Renay',\n\t'Seren',\n\t'Hiliana',\n\t'Kinzie',\n\t'Isra',\n\t'Hanan',\n\t'Kaleia',\n\t'Melynda',\n\t'Marine',\n\t'Twanna',\n\t'Lekisha',\n\t'Jamecia',\n\t'Penney',\n\t'Tiwanna',\n\t'Rylea',\n\t'Shekinah',\n\t'Mckenzi',\n\t'Abigael',\n\t'Patrizia',\n\t'Jamillah',\n\t'Caris',\n\t'Karmyn',\n\t'Kyli',\n\t'Princessa',\n\t'Sakinah',\n\t'Deserae',\n\t'Patrina',\n\t'Carmelina',\n\t'Mayela',\n\t'Sherise',\n\t'Ilda',\n\t'Florentina',\n\t'Nelwyn',\n\t'Jennine',\n\t'Aleeya',\n\t'Kynsley',\n\t'Arlett',\n\t'Tarra',\n\t'Lakyn',\n\t'Tyeisha',\n\t'Temima',\n\t'Mallori',\n\t'Ingeborg',\n\t'Elizaveta',\n\t'Jentry',\n\t'Kymber',\n\t'Maddisyn',\n\t'Allana',\n\t'Anistyn',\n\t'Emberlynn',\n\t'Faithlynn',\n\t'Arianah',\n\t'Tionna',\n\t'Lenda',\n\t'Laveta',\n\t'Alayla',\n\t'Aisling',\n\t'Miryam',\n\t'Marena',\n\t'Aneta',\n\t'Yzabella',\n\t'Mihika',\n\t'Raine',\n\t'Samiah',\n\t'Raveena',\n\t'Elfrieda',\n\t'Niccole',\n\t'Tatanisha',\n\t'Medha',\n\t'Katharina',\n\t'Jazmen',\n\t'Cally',\n\t'Louanne',\n\t'Caress',\n\t'Naylea',\n\t'Avarie',\n\t'Madelynne',\n\t'Dayla',\n\t'Shanterria',\n\t'Tesha',\n\t'Thanya',\n\t'Jalia',\n\t'Josalyn',\n\t'Ailey',\n\t'Brooklynne',\n\t'Dodie',\n\t'Champagne',\n\t'Taneka',\n\t'Tenesha',\n\t'Tinisha',\n\t'Deeanna',\n\t'Shelvia',\n\t'Chenoa',\n\t'Darcel',\n\t'Kailea',\n\t'Jatziry',\n\t'Merryl',\n\t'Sharlyn',\n\t'Harolyn',\n\t'Rilla',\n\t'Ayisha',\n\t'Jacklynn',\n\t'Chloee',\n\t'Makynzie',\n\t'Leyah',\n\t'Aalyiah',\n\t'Tynlee',\n\t'Statia',\n\t'Tyronda',\n\t'Tsuyako',\n\t'Casimira',\n\t'Kehaulani',\n\t'Ragan',\n\t'Lorissa',\n\t'Abelina',\n\t'Cuca',\n\t'Sachi',\n\t'Evany',\n\t'Elektra',\n\t'Sianni',\n\t'Raychel',\n\t'Natassia',\n\t'Vermell',\n\t'Sharifa',\n\t'Everley',\n\t'Ivanka',\n\t'Arisbeth',\n\t'Aleyza',\n\t'Bay',\n\t'Deedra',\n\t'Zarina',\n\t'Regena',\n\t'Kitana',\n\t'Latoshia',\n\t'Virgia',\n\t'Aili',\n\t'Breslyn',\n\t'Ishika',\n\t'Jhoana',\n\t'Dorrace',\n\t'Chanice',\n\t'Sheniqua',\n\t'Tashana',\n\t'Joetta',\n\t'Sanya',\n\t'Altamese',\n\t'Pari',\n\t'Niah',\n\t'Ysabelle',\n\t'Lisseth',\n\t'Parisa',\n\t'Aislin',\n\t'Leiah',\n\t'Atziri',\n\t'Anvita',\n\t'Jaydah',\n\t'Gabby',\n\t'Ashia',\n\t'Dymond',\n\t'Marah',\n\t'Uniqua',\n\t'Blimie',\n\t'Anny',\n\t'Dalinda',\n\t'Wauneta',\n\t'Gionna',\n\t'Rabia',\n\t'Jayanna',\n\t'Anica',\n\t'Maybell',\n\t'Kathern',\n\t'Amrita',\n\t'Mayerli',\n\t'Irais',\n\t'Kemberly',\n\t'Vena',\n\t'Kamri',\n\t'Destine',\n\t'Adreanna',\n\t'Seleste',\n\t'Claretha',\n\t'Brynnlee',\n\t'Anquette',\n\t'Komal',\n\t'Lysette',\n\t'Michayla',\n\t'Zamya',\n\t'Sierrah',\n\t'Felica',\n\t'Otelia',\n\t'Rihana',\n\t'Doloris',\n\t'Alanie',\n\t'Angelly',\n\t'Kassandr',\n\t'Rosemari',\n\t'Shaday',\n\t'Annemari',\n\t'Marlana',\n\t'Clorinda',\n\t'Oneida',\n\t'Shaunta',\n\t'Alexcia',\n\t'Takesha',\n\t'Amiracle',\n\t'Sharion',\n\t'Joline',\n\t'Jaziyah',\n\t'Teal',\n\t'Sueann',\n\t'Sora',\n\t'Kamiah',\n\t'Caressa',\n\t'Eleana',\n\t'Bernetha',\n\t'Alexyss',\n\t'Sharda',\n\t'Aishwarya',\n\t'Suhaill',\n\t'Radhika',\n\t'Wonda',\n\t'Renda',\n\t'Janny',\n\t'Ardelle',\n\t'Malory',\n\t'Jossie',\n\t'Anaid',\n\t'Mitsuye',\n\t'Shizuye',\n\t'Fariha',\n\t'Aiesha',\n\t'Nitya',\n\t'Nadiya',\n\t'Katerin',\n\t'Bruna',\n\t'Varsha',\n\t'Yaretsi',\n\t'Xitlalli',\n\t'Leshia',\n\t'Eda',\n\t'Sheronda',\n\t'Malikah',\n\t'Tayah',\n\t'Briann',\n\t'Tasnim',\n\t'Jayonna',\n\t'Kenedy',\n\t'Anarosa',\n\t'Zaya',\n\t'Kerline',\n\t'Brinda',\n\t'Amna',\n\t'Desarae',\n\t'Sarrah',\n\t'Silva',\n\t'Steffani',\n\t'Almarosa',\n\t'Alyshia',\n\t'Ariell',\n\t'Breeanne',\n\t'Alyxandra',\n\t'Juliane',\n\t'Jesseca',\n\t'Janisha',\n\t'Donisha',\n\t'Darnisha',\n\t'Jakeria',\n\t'Kirsty',\n\t'Markeisha',\n\t'Breena',\n\t'Selin',\n\t'Nikisha',\n\t'Adreana',\n\t'Elois',\n\t'Arrianna',\n\t'Melenie',\n\t'Rayanna',\n\t'Kaelee',\n\t'Shakyra',\n\t'Clotee',\n\t'Jakeline',\n\t'Kalysta',\n\t'Cesia',\n\t'Ankita',\n\t'Cristela',\n\t'Shunta',\n\t'Mozella',\n\t'Chrissie',\n\t'Adora',\n\t'Ashanty',\n\t'Ashna',\n\t'Lehua',\n\t'Nohealani',\n\t'Shruthi',\n\t'Metzli',\n\t'Jakelin',\n\t'Jisel',\n\t'Mikenna',\n\t'Miroslava',\n\t'Mansi',\n\t'Daphney',\n\t'Amisha',\n\t'Adara',\n\t'Alexzandria',\n\t'Alliah',\n\t'Yuriana',\n\t'Nanea',\n\t'Kahealani',\n\t'Ritika',\n\t'Arica',\n\t'Amayrani',\n\t'Kealani',\n\t'Dorina',\n\t'Lucienne',\n\t'Estrellita',\n\t'Kimberlin',\n\t'Lai',\n\t'Yovanna',\n\t'Rebekkah',\n\t'Azra',\n\t'Nada',\n\t'Gabryella',\n\t'Avigayil',\n\t'Binta',\n\t'Devoiry',\n\t'Raeanna',\n\t'Arlena',\n\t'Briauna',\n\t'Itati',\n\t'Grabiela',\n\t'Noella',\n\t'Teaghan',\n\t'Tzippy',\n\t'Faiza',\n\t'Zaara',\n\t'Tehilla',\n\t'Miki',\n\t'Sendy',\n\t'Kassondra',\n\t'Katherina',\n\t'Lissete',\n\t'Livier',\n\t'Lauran',\n\t'Dandrea',\n\t'Chelse',\n\t'Lizmarie',\n\t'Sunday',\n\t'Haidee',\n\t'Carrissa',\n\t'Nicholette',\n\t'Katey',\n\t'Katheryne',\n\t'Katty',\n\t'Kimia',\n\t'Leeanne',\n\t'Lizmary',\n\t'Jani',\n\t'Emmanuella',\n\t'Jahniya',\n\t'Talar',\n\t'Sintia',\n\t'Narda',\n\t'Chriselda',\n\t'Candance',\n\t'Delorise',\n\t'Daysy',\n\t'Lusine',\n\t'Raeanne',\n\t'Cherylann',\n\t'Ayat',\n\t'Halima',\n\t'Zissel',\n\t'Courtni',\n\t'Adahli',\n\t'Der',\n\t'Emree',\n\t'Brynlie',\n\t'Cherlyn',\n\t'Bostyn',\n\t'Francie',\n\t'Oaklie',\n\t'Shakeerah',\n\t'Hertha',\n\t'Haneefah',\n\t'Taheerah',\n\t'Nikkia',\n\t'Sheryll',\n\t'Donnabelle',\n\t'Teddi',\n\t'Jodee',\n\t'Tammera',\n\t'Janylah',\n\t'Laquesha',\n\t'Penina',\n\t'Gracee',\n\t'Thomasine',\n\t'Janyce',\n\t'Randie',\n\t'Mela',\n\t'Alka',\n\t'Cordia',\n\t'Shaquetta',\n\t'Mi',\n\t'Jaquetta',\n\t'Yoshiye',\n\t'Haruye',\n\t'Yoneko',\n\t'Fumi',\n\t'Wava',\n\t'Congetta',\n\t'Denee',\n\t'Kandyce',\n\t'Soraida',\n\t'Triana',\n\t'Kenedi',\n\t'Abena',\n\t'Talisha',\n\t'Rochell',\n\t'Sharisse',\n\t'Tijuana',\n\t'Amiee',\n\t'Nyesha',\n\t'Towana',\n\t'Lore',\n\t'Melodye',\n\t'Hayli',\n\t'Joyelle',\n\t'Shareen',\n\t'Amarilis',\n\t'Takiyah',\n\t'Takiya',\n\t'Keysha',\n\t'Feige',\n\t'Diahann',\n\t'Kloie',\n\t'Laynee',\n\t'Mariely',\n\t'Rainey',\n\t'Alizabeth',\n\t'Alyssandra',\n\t'Cambry',\n\t'Jadelynn',\n\t'Marylynn',\n\t'Keoka',\n\t'Jamaica',\n\t'Lus',\n\t'Shonta',\n\t'Kameelah',\n\t'Danell',\n\t'Evamarie',\n\t'Francoise',\n\t'Beata',\n\t'Caylie',\n\t'Elexa',\n\t'Joscelin',\n\t'Hessie',\n\t'Alazay',\n\t'Robena',\n\t'Texie',\n\t'Clarine',\n\t'Makennah',\n\t'Arletha',\n\t'Willette',\n\t'Amee',\n\t'Jetaun',\n\t'Anyia',\n\t'Aryssa',\n\t'Bonni',\n\t'Graciella',\n\t'Haileigh',\n\t'Sharae',\n\t'Shanea',\n\t'Ieisha',\n\t'Porche',\n\t'Teanna',\n\t'Ashanta',\n\t'Taiya',\n\t'Nicolett',\n\t'Naisha',\n\t'Sharice',\n\t'Madelein',\n\t'Kimberle',\n\t'Monifah',\n\t'Cameo',\n\t'Evelynne',\n\t'Edlyn',\n\t'Porcha',\n\t'Maricel',\n\t'Waleska',\n\t'Shakeena',\n\t'Shavone',\n\t'Ashlynne',\n\t'Yahira',\n\t'Shamecca',\n\t'Yashira',\n\t'Sherell',\n\t'Fiorela',\n\t'Nansi',\n\t'Shawntae',\n\t'Poonam',\n\t'Shala',\n\t'Kellyn',\n\t'Jazzmyn',\n\t'Asya',\n\t'Shatoya',\n\t'Yury',\n\t'Weronika',\n\t'Dawnette',\n\t'Lorita',\n\t'Michaelle',\n\t'Tomi',\n\t'Abbi',\n\t'Maudry',\n\t'Jaylinn',\n\t'Kynzie',\n\t'Lynnlee',\n\t'Madisson',\n\t'Denese',\n\t'Devona',\n\t'Sharika',\n\t'Sharilyn',\n\t'Zayna',\n\t'Janalee',\n\t'Sherril',\n\t'Timika',\n\t'Lynelle',\n\t'Rolayne',\n\t'Lubertha',\n\t'Jariah',\n\t'Kamala',\n\t'Taffy',\n\t'Marquetta',\n\t'Honora',\n\t'Frederica',\n\t'Monalisa',\n\t'Rashonda',\n\t'Francene',\n\t'Diedra',\n\t'Ceara',\n\t'Marylouise',\n\t'Kenesha',\n\t'Aisley',\n\t'Donnalee',\n\t'Genisis',\n\t'Debroah',\n\t'Helayne',\n\t'Raelee',\n\t'Maryrose',\n\t'Yalonda',\n\t'Chyla',\n\t'Edelmira',\n\t'Roselle',\n\t'Alyssah',\n\t'Brenley',\n\t'Gaynelle',\n\t'Shelvie',\n\t'Mackayla',\n\t'Linley',\n\t'Allizon',\n\t'Alonna',\n\t'Kendalyn',\n\t'Jozlyn',\n\t'Gwenn',\n\t'Jina',\n\t'Zariya',\n\t'Rosabella',\n\t'Emrie',\n\t'Tamu',\n\t'Senta',\n\t'Myia',\n\t'Emberlyn',\n\t'Emorie',\n\t'Arantxa',\n\t'Richele',\n\t'Christianne',\n\t'Lashan',\n\t'Koren',\n\t'Buffie',\n\t'Ronnette',\n\t'Marna',\n\t'Tuesday',\n\t'Helga',\n\t'Emilyn',\n\t'Cailee',\n\t'Shaquilla',\n\t'Dyamond',\n\t'Gerda',\n\t'Mckynzie',\n\t'Khloie',\n\t'Kendyll',\n\t'Maryfrances',\n\t'Khadejah',\n\t'Annalie',\n\t'Adaya',\n\t'Akia',\n\t'Markia',\n\t'Iyla',\n\t'Kaely',\n\t'Rafaella',\n\t'Tali',\n\t'Sukhmani',\n\t'Mili',\n\t'Kaylanie',\n\t'Maribelle',\n\t'Zharia',\n\t'Georgeanne',\n\t'Shamekia',\n\t'Siyona',\n\t'Layah',\n\t'Maylani',\n\t'Elianah',\n\t'Ellena',\n\t'Elyanna',\n\t'Yanilen',\n\t'Jashanti',\n\t'Lakita',\n\t'Juanell',\n\t'Caley',\n\t'Annella',\n\t'Vinita',\n\t'Zakiyah',\n\t'Sherian',\n\t'Palmira',\n\t'Delpha',\n\t'Creola',\n\t'Veta',\n\t'Sheneka',\n\t'Ameria',\n\t'Keonna',\n\t'Nathali',\n\t'Vaishnavi',\n\t'Zurisadai',\n\t'Mily',\n\t'Aalyah',\n\t'Hasini',\n\t'Irelynn',\n\t'Taneshia',\n\t'Lashanti',\n\t'Shatavia',\n\t'Shantoria',\n\t'Avelina',\n\t'Vanya',\n\t'Erline',\n\t'Surina',\n\t'Maribella',\n\t'Julieana',\n\t'Jazel',\n\t'Kalissa',\n\t'Marlis',\n\t'Hadasa',\n\t'Iveth',\n\t'Miliani',\n\t'Leiana',\n\t'Devynn',\n\t'Ahtziry',\n\t'Shilah',\n\t'Sicily',\n\t'Ashari',\n\t'Yarenis',\n\t'Tamiah',\n\t'Annis',\n\t'Azzie',\n\t'Sedalia',\n\t'Maebell',\n\t'Empress',\n\t'Fairy',\n\t'Najma',\n\t'Loreta',\n\t'Suhayla',\n\t'Sundus',\n\t'Vayda',\n\t'Doshia',\n\t'Ahlam',\n\t'Lashondra',\n\t'Ryanna',\n\t'Lala',\n\t'Merline',\n\t'Severa',\n\t'Kymora',\n\t'Fae',\n\t'Jameka',\n\t'Othella',\n\t'Wyoma',\n\t'Ailee',\n\t'Aishani',\n\t'Fransisca',\n\t'Noma',\n\t'Meztli',\n\t'Miliana',\n\t'Navaeh',\n\t'Swara',\n\t'Malillany',\n\t'Jaina',\n\t'Dia',\n\t'Ivyanna',\n\t'Jamira',\n\t'Jazaria',\n\t'Oletha',\n\t'Julieth',\n\t'Avia',\n\t'Elizebeth',\n\t'Yareni',\n\t'Korra',\n\t'Miraya',\n\t'Bernetta',\n\t'Helyn',\n\t'Suhaylah',\n\t'Laina',\n\t'Lassie',\n\t'Anyae',\n\t'Maleena',\n\t'Nirvana',\n\t'Danely',\n\t'Keilana',\n\t'Hildur',\n\t'Mariaclara',\n\t'Toshie',\n\t'Maniyah',\n\t'Hanako',\n\t'Asako',\n\t'Hiroko',\n\t'Hisae',\n\t'Suraya',\n\t'Kaileen',\n\t'Pearla',\n\t'Layal',\n\t'Batoul',\n\t'Johannah',\n\t'Gizel',\n\t'Venecia',\n\t'Yanelly',\n\t'Atianna',\n\t'Apple',\n\t'Arizbeth',\n\t'Sriya',\n\t'Natania',\n\t'Mayline',\n\t'Emmagrace',\n\t'Meriam',\n\t'Laree',\n\t'Tempie',\n\t'Sedonia',\n\t'Evalee',\n\t'Laquana',\n\t'Sheli',\n\t'Liesl',\n\t'Hazeline',\n\t'Blanchie',\n\t'Samyra',\n\t'Keelie',\n\t'Krislyn',\n\t'Yanelis',\n\t'Addysen',\n\t'Inis',\n\t'Tammra',\n\t'Johnette',\n\t'Amery',\n\t'Alayza',\n\t'Alaiyah',\n\t'Abree',\n\t'Amri',\n\t'Anapaula',\n\t'Jacelynn',\n\t'Kenzleigh',\n\t'Kenzlee',\n\t'Jaelah',\n\t'Brenlee',\n\t'Avalee',\n\t'Paizley',\n\t'Columbia',\n\t'Benedetta',\n\t'Daeja',\n\t'Myeshia',\n\t'Jeanene',\n\t'Terina',\n\t'Ethyl',\n\t'Oliwia',\n\t'Taniah',\n\t'Yaiza',\n\t'Eveline',\n\t'Monnie',\n\t'Margherita',\n\t'Jayana',\n\t'Macil',\n\t'Leontine',\n\t'Catera',\n\t'Wynelle',\n\t'Eldana',\n\t'Sallyann',\n\t'Yolande',\n\t'Marybelle',\n\t'Leanore',\n\t'Clothilde',\n\t'Tonita',\n\t'Kimaya',\n\t'Sumayah',\n\t'Latrenda',\n\t'Kelleen',\n\t'Deatrice',\n\t'Madelon',\n\t'Phyliss',\n\t'Argelia',\n\t'Mellie',\n\t'Emmah',\n\t'Jorley',\n\t'Muna',\n\t'Daphine',\n\t'Darina',\n\t'Bliss',\n\t'Karyl',\n\t'Taelynn',\n\t'Blenda',\n\t'Tonika',\n\t'Jerrilyn',\n\t'Sahra',\n\t'Keilyn',\n\t'Pearlene',\n\t'Arrie',\n\t'Ellene',\n\t'Fredericka',\n\t'Ladawn',\n\t'Maudell',\n\t'Rahma',\n\t'Jaylie',\n\t'Jaidah',\n\t'Vernetta',\n\t'Aleya',\n\t'Aubreigh',\n\t'Alaysha',\n\t'Adena',\n\t'Jacara',\n\t'Elfriede',\n\t'Maysel',\n\t'Munira',\n\t'Mumtaz',\n\t'Dorathy',\n\t'Chanin',\n\t'Ronette',\n\t'Maymie',\n\t'Providencia',\n\t'Mirta',\n\t'Loida',\n\t'Blakelyn',\n\t'Bentleigh',\n\t'Alliana',\n\t'Aleen',\n\t'Daliyah',\n\t'Jodene',\n\t'Johanne',\n\t'Timeka',\n\t'Ilhan',\n\t'Aloma',\n\t'Maris',\n\t'Arlyne',\n\t'Jene',\n\t'Hazelene',\n\t'Shakela',\n\t'Maida',\n\t'Maycie',\n\t'Makynlee',\n\t'Kawanda',\n\t'Consuella',\n\t'Sephora',\n\t'Andrianna',\n\t'Joshlyn',\n\t'Hollyn',\n\t'Kyliee',\n\t'Adaly',\n\t'Dailyn',\n\t'Averee',\n\t'Berklee',\n\t'Marly',\n\t'Gianella',\n\t'Ekaterina',\n\t'Colene',\n\t'Dayonna',\n\t'Shareka',\n\t'Roshni',\n\t'Latifa',\n\t'Merilyn',\n\t'Vernelle',\n\t'Marlyce',\n\t'Sabrena',\n\t'Jeneen',\n\t'Genie',\n\t'Lawanna',\n\t'Tashara',\n\t'Kayzlee',\n\t'Skylie',\n\t'Iyonna',\n\t'Honesti',\n\t'Cherylene',\n\t'Tahira',\n\t'Chizuko',\n\t'Aneesah',\n\t'Helmi',\n\t'Katrena',\n\t'Shyanna',\n\t'Zeola',\n\t'Lempi',\n\t'Arliss',\n\t'Madgie',\n\t'Verlie',\n\t'Ardys',\n\t'Twanda',\n\t'Kareemah',\n\t'Chardae',\n\t'Arlinda',\n\t'Darlena',\n\t'Karee',\n\t'Lorry',\n\t'Rolande',\n\t'Marlane',\n\t'Lelah',\n\t'Zahria',\n\t'Michalene',\n\t'Nayelis',\n\t'Abbigale',\n\t'Lorretta',\n\t'Sheril',\n\t'Priscille',\n\t'Cleda',\n\t'Kerrigan',\n\t'Wanita',\n\t'Ambria',\n\t'Wanetta',\n\t'Ebone',\n\t'Georgianne',\n\t'Karleen',\n\t'Laural',\n\t'Jonette',\n\t'Sharie',\n\t'Francina',\n\t'Yarelis',\n\t'Tempestt',\n\t'Kamie',\n\t'Julene',\n\t'Londa',\n\t'Haniya',\n\t'Kristeen',\n\t'Classie',\n\t'Nakiyah',\n\t'Valinda',\n\t'Kamree',\n\t'Micheline',\n\t'Mckaylee',\n\t'Prescilla',\n\t'Shaylynn',\n\t'Donelda',\n\t'Fayetta',\n\t'Terrye',\n\t'Dorthey',\n\t'Azilee',\n\t'Juanda',\n\t'Eustolia',\n\t'Nakeisha',\n\t'Hira',\n\t'Tarrah',\n\t'Jamyra',\n\t'Azaleah',\n\t'Aveline',\n\t'Chanae',\n\t'Andreana',\n\t'Banesa',\n\t'Berenis',\n\t'Brittini',\n\t'Orianna',\n\t'Reet',\n\t'Rayah',\n\t'Sofi',\n\t'Japji',\n\t'Kensie',\n\t'Roshonda',\n\t'Agripina',\n\t'Blasa',\n\t'Anevay',\n\t'Akari',\n\t'Krissi',\n\t'Maily',\n\t'Kitzia',\n\t'Keilly',\n\t'Raveen',\n\t'Kaiah',\n\t'Juliett',\n\t'Jocelynne',\n\t'Eowyn',\n\t'Calie',\n\t'Ebonee',\n\t'Chelcie',\n\t'Kayci',\n\t'Lauralee',\n\t'Trenity',\n\t'Deborrah',\n\t'Imagene',\n\t'Akasha',\n\t'Analaura',\n\t'Liani',\n\t'Lizania',\n\t'Lucina',\n\t'Melaine',\n\t'Sanah',\n\t'Stepanie',\n\t'Zabrina',\n\t'Janaye',\n\t'Jelena',\n\t'Kaylina',\n\t'Diavian',\n\t'Tasnia',\n\t'Nusrat',\n\t'Ashleymarie',\n\t'Maheen',\n\t'Ndeye',\n\t'Yumi',\n\t'Vittoria',\n\t'Amyra',\n\t'Yakelin',\n\t'Yudith',\n\t'Yumalay',\n\t'Juliza',\n\t'Daila',\n\t'Daenerys',\n\t'Calissa',\n\t'Tahirah',\n\t'Laquasia',\n\t'Jenay',\n\t'Crystina',\n\t'Eleonore',\n\t'Inessa',\n\t'Irine',\n\t'Vennie',\n\t'Oda',\n\t'Laurine',\n\t'Lavera',\n\t'Saraya',\n\t'Kerin',\n\t'Itzia',\n\t'Jennessa',\n\t'Katerine',\n\t'Rosselyn',\n\t'Leidy',\n\t'Adamariz',\n\t'Adylene',\n\t'Aylen',\n\t'Aniela',\n\t'Aleesha',\n\t'Alyssamarie',\n\t'Ainara',\n\t'Emalie',\n\t'Darlin',\n\t'Inna',\n\t'Emmely',\n\t'Eriana',\n\t'Esbeidy',\n\t'Chenelle',\n\t'Janise',\n\t'Sherrell',\n\t'Basilia',\n\t'Malayna',\n\t'Hilinai',\n\t'Mardell',\n\t'Romi',\n\t'Rosena',\n\t'Violett',\n\t'Zaylah',\n\t'Taia',\n\t'Anisah',\n\t'Esli',\n\t'Cleopatra',\n\t'Carisma',\n\t'Dezaray',\n\t'Swayze',\n\t'Raeven',\n\t'Neiva',\n\t'Myeisha',\n\t'Shelsea',\n\t'Yissel',\n\t'Velinda',\n\t'Josseline',\n\t'Denasia',\n\t'Digna',\n\t'Keiana',\n\t'Clytee',\n\t'Vernette',\n\t'Cheyene',\n\t'Roshunda',\n\t'Telisha',\n\t'Nilah',\n\t'Ayda',\n\t'Zykia',\n\t'Isabellamarie',\n\t'Melanee',\n\t'Laylanie',\n\t'Ajah',\n\t'Guiliana',\n\t'Oliva',\n\t'Mikela',\n\t'Mirabelle',\n\t'Nabiha',\n\t'Jasmina',\n\t'Hendy',\n\t'Ita',\n\t'Elif',\n\t'Reola',\n\t'Jamyah',\n\t'Tempest',\n\t'Arletta',\n\t'Keaira',\n\t'Ibeth',\n\t'Jerolyn',\n\t'Nelta',\n\t'Alishba',\n\t'Crisol',\n\t'Sabreena',\n\t'Silver',\n\t'Toba',\n\t'Yunuen',\n\t'Rishika',\n\t'Naomie',\n\t'Brittanya',\n\t'Annasophia',\n\t'Ayumi',\n\t'Jayleene',\n\t'Emmily',\n\t'Lyssa',\n\t'Natoya',\n\t'Vallerie',\n\t'Andee',\n\t'Annastasia',\n\t'Mazzy',\n\t'Zinnia',\n\t'Sheran',\n\t'Sumaiya',\n\t'Tasneem',\n\t'Aniylah',\n\t'Dua',\n\t'Tausha',\n\t'Jabria',\n\t'Lanora',\n\t'Janeli',\n\t'Mileydi',\n\t'Mikaella',\n\t'Ryah',\n\t'Rolonda',\n\t'Ajanae',\n\t'Ianna',\n\t'Xaria',\n\t'Winni',\n\t'Marializ',\n\t'Aidel',\n\t'Jonae',\n\t'Sanam',\n\t'Mao',\n\t'Tesia',\n\t'Yanina',\n\t'Brieana',\n\t'Genova',\n\t'Lashanae',\n\t'Anneke',\n\t'Siarra',\n\t'Sharhonda',\n\t'Zeldy',\n\t'Saron',\n\t'Johnisha',\n\t'Katelynne',\n\t'Janneth',\n\t'Corayma',\n\t'Helvi',\n\t'Asucena',\n\t'Lachelle',\n\t'Solmayra',\n\t'Tavia',\n\t'Marlina',\n\t'Rachal',\n\t'Sunni',\n\t'Nycole',\n\t'Aliannah',\n\t'Nafisa',\n\t'Simi',\n\t'Suki',\n\t'Jadalynn',\n\t'Kezia',\n\t'Athziri',\n\t'Huda',\n\t'Evy',\n\t'Jailah',\n\t'Jaselle',\n\t'Jaslyne',\n\t'Dalyla',\n\t'Emeraude',\n\t'Mahika',\n\t'Yoanna',\n\t'Fraida',\n\t'Tannia',\n\t'Selenne',\n\t'Analiz',\n\t'Angelene',\n\t'Anacristina',\n\t'Kylea',\n\t'Naydelyn',\n\t'Lecia',\n\t'Gitel',\n\t'Shareese',\n\t'Cassady',\n\t'Diem',\n\t'Perlita',\n\t'Monigue',\n\t'Marisha',\n\t'Emillee',\n\t'Kareli',\n\t'Shandreka',\n\t'Kerrin',\n\t'Tram',\n\t'Nohelani',\n\t'Monic',\n\t'Brandice',\n\t'Johnetta',\n\t'Evangelia',\n\t'Shakina',\n\t'Shunda',\n\t'Robbi',\n\t'Ariatna',\n\t'Shantae',\n\t'Sorangel',\n\t'Valene',\n\t'Aletta',\n\t'Libbie',\n\t'Marifer',\n\t'Deitra',\n\t'Despina',\n\t'Hayle',\n\t'Kassidi',\n\t'Dayrin',\n\t'Anjelina',\n\t'Gimena',\n\t'Llesenia',\n\t'Rainbow',\n\t'Muskaan',\n\t'Judit',\n\t'Kyley',\n\t'Tanna',\n\t'Luci',\n\t'Altagracia',\n\t'Kilee',\n\t'Kamry',\n\t'Kalyssa',\n\t'Jadeyn',\n\t'Virgen',\n\t'Damita',\n\t'Leinaala',\n\t'Illeana',\n\t'Nneka',\n\t'Onika',\n\t'Aralyn',\n\t'Mahalia',\n\t'Marelyn',\n\t'Jalene',\n\t'Bobbiejo',\n\t'Apollonia',\n\t'Anjuli',\n\t'Ricarda',\n\t'Fusako',\n\t'Michie',\n\t'Janira',\n\t'Citlalic',\n\t'Jannelle',\n\t'Tiffini',\n\t'Elisia',\n\t'Racine',\n\t'Marybel',\n\t'Xitlally',\n\t'Tynesha',\n\t'Sharay',\n\t'Shamara',\n\t'Aleene',\n\t'Rayssa',\n\t'Carlyn',\n\t'Falisha',\n\t'Lasandra',\n\t'Trinh',\n\t'Seema',\n\t'Tonianne',\n\t'Destani',\n\t'Nairobi',\n\t'Tomica',\n\t'Raena',\n\t'Ivania',\n\t'Odaliz',\n\t'Lilybeth',\n\t'Sheyenne',\n\t'Tereza',\n\t'Yuka',\n\t'Baleria',\n\t'Ayiana',\n\t'Floree',\n\t'Jhoanna',\n\t'Shakila',\n\t'Meleah',\n\t'Monserath',\n\t'Lelani',\n\t'Conception',\n\t'Zowie',\n\t'Teah',\n\t'Takayla',\n\t'Teaira',\n\t'Karyssa',\n\t'Delina',\n\t'Kamaile',\n\t'Rut',\n\t'Reanne',\n\t'Zamantha',\n\t'Ellyse',\n\t'Jisela',\n\t'Latonja',\n\t'Eiko',\n\t'Aylene',\n\t'Atziry',\n\t'Avila',\n\t'Andreya',\n\t'Delyla',\n\t'Aashna',\n\t'Dacia',\n\t'Shavonda',\n\t'Desirey',\n\t'Matea',\n\t'Makailah',\n\t'Henessy',\n\t'Naliyah',\n\t'Charlise',\n\t'Keirsten',\n\t'Ressie',\n\t'Halia',\n\t'Gweneth',\n\t'Manda',\n\t'Lilinoe',\n\t'Mariselda',\n\t'Tajuana',\n\t'Mahima',\n\t'Noeli',\n\t'Yanelli',\n\t'Sole',\n\t'Saloni',\n\t'Annistyn',\n\t'Marcille',\n\t'Thresa',\n\t'Cerenity',\n\t'Samnatha',\n\t'Alexah',\n\t'Analie',\n\t'Aryah',\n\t'Jazline',\n\t'Evony',\n\t'Erandy',\n\t'Jezelle',\n\t'Kamara',\n\t'Emelina',\n\t'Kadance',\n\t'Masae',\n\t'Davonna',\n\t'Shamaya',\n\t'Shalynn',\n\t'Rima',\n\t'Toria',\n\t'Zamira',\n\t'Cerina',\n\t'Fujiko',\n\t'Armine',\n\t'Morganne',\n\t'Gicela',\n\t'Desree',\n\t'Khaila',\n\t'Nikayla',\n\t'Kennedie',\n\t'Marylu',\n\t'Ilyssa',\n\t'Jatziri',\n\t'Shianna',\n\t'Dharma',\n\t'Resa',\n\t'Abra',\n\t'Neely',\n\t'Imo',\n\t'Betzabeth',\n\t'Briceyda',\n\t'Karenna',\n\t'Jakhia',\n\t'Ramiyah',\n\t'Khaliyah',\n\t'Tocarra',\n\t'Milee',\n\t'Athina',\n\t'Maleigha',\n\t'Shalyn',\n\t'Syliva',\n\t'Roseline',\n\t'Claira',\n\t'Jisselle',\n\t'Kiely',\n\t'Marisabel',\n\t'Maryanna',\n\t'Melena',\n\t'Mylene',\n\t'Mariangela',\n\t'Mailey',\n\t'Sonora',\n\t'Siana',\n\t'Shreeya',\n\t'Sevana',\n\t'Samhita',\n\t'Jackelyne',\n\t'Kyrstin',\n\t'Anslie',\n\t'Samella',\n\t'Jewelia',\n\t'Sammye',\n\t'Ayline',\n\t'Navneet',\n\t'Charlesetta',\n\t'Raye',\n\t'Yulonda',\n\t'Esmerelda',\n\t'Gianina',\n\t'Danessa',\n\t'Calia',\n\t'Everlena',\n\t'Sadaf',\n\t'Analucia',\n\t'Meriah',\n\t'Gwendalyn',\n\t'Disha',\n\t'Katana',\n\t'Kalaya',\n\t'Kaeley',\n\t'Tyonna',\n\t'Rozella',\n\t'Marjean',\n\t'Conchita',\n\t'Kylynn',\n\t'Aasiyah',\n\t'Maelynn',\n\t'Kahla',\n\t'Prachi',\n\t'Tajanae',\n\t'Megumi',\n\t'Micheala',\n\t'Yanitza',\n\t'Geselle',\n\t'Reather',\n\t'Annalicia',\n\t'Bonna',\n\t'Lilliann',\n\t'Callia',\n\t'Brigit',\n\t'Quintina',\n\t'Fujie',\n\t'Jolanda',\n\t'Nanami',\n\t'Yosselin',\n\t'Jakelyn',\n\t'Kadeja',\n\t'Eveny',\n\t'Emaly',\n\t'Ciena',\n\t'Julliana',\n\t'Jareli',\n\t'Jaretzi',\n\t'Kailin',\n\t'Kimiye',\n\t'Ammie',\n\t'Kiona',\n\t'Sumayyah',\n\t'Terre',\n\t'Laryssa',\n\t'Marleni',\n\t'Kamira',\n\t'Yulanda',\n\t'Jonda',\n\t'Lania',\n\t'Pippa',\n\t'Jazariah',\n\t'Takeya',\n\t'Shatima',\n\t'Ysenia',\n\t'Mikki',\n\t'Necole',\n\t'Etha',\n\t'Williemae',\n\t'Margurite',\n\t'Leonarda',\n\t'Inocencia',\n\t'Dominika',\n\t'Laisa',\n\t'Haylea',\n\t'Annamay',\n\t'Azia',\n\t'Mckynlee',\n\t'Maddilyn',\n\t'Scotlyn',\n\t'Lillith',\n\t'Mertie',\n\t'Kynzee',\n\t'Joshlynn',\n\t'Maelee',\n\t'Daleiza',\n\t'Xyla',\n\t'Royalty',\n\t'Railynn',\n\t'Patrycja',\n\t'Dotty',\n\t'Leda',\n\t'Toshiba',\n\t'Nelma',\n\t'Yeni',\n\t'Ottilie',\n\t'Lyna',\n\t'Leslieann',\n\t'Onita',\n\t'Darcey',\n\t'Marya',\n\t'Africa',\n\t'Seferina',\n\t'Theola',\n\t'Ysidra',\n\t'Zita',\n\t'Cing',\n\t'Zailynn',\n\t'Jennilee',\n\t'Sharmon',\n\t'Tyechia',\n\t'Irmgard',\n\t'Shameika',\n\t'Jemima',\n\t'Jazzelle',\n\t'Adlee',\n\t'Aliyanna',\n\t'Acelyn',\n\t'Catalaya',\n\t'Brileigh',\n\t'Braylie',\n\t'Angelin',\n\t'Arianni',\n\t'Ariani',\n\t'Kennya',\n\t'Maelyn',\n\t'Lillee',\n\t'Maripaz',\n\t'Laikyn',\n\t'Kenslee',\n\t'Ileane',\n\t'Puja',\n\t'Oanh',\n\t'Jakara',\n\t'Shawntay',\n\t'Cendy',\n\t'Erianna',\n\t'Chloie',\n\t'Birtie',\n\t'Korin',\n\t'Jannett',\n\t'Shawntel',\n\t'Markisha',\n\t'Nastassja',\n\t'Shalene',\n\t'Alexya',\n\t'Cloie',\n\t'Exa',\n\t'Jentri',\n\t'Modena',\n\t'Veronique',\n\t'Daina',\n\t'Mechele',\n\t'Lakesia',\n\t'Kawanna',\n\t'Clotilde',\n\t'Diamonique',\n\t'Teyana',\n\t'Rheagan',\n\t'Shanece',\n\t'Yanique',\n\t'Taysha',\n\t'Ulyssa',\n\t'Jadzia',\n\t'Kadija',\n\t'Towanna',\n\t'Lurlene',\n\t'Sharri',\n\t'Rosenda',\n\t'Daphna',\n\t'Hermina',\n\t'Shaquanda',\n\t'Saachi',\n\t'Sena',\n\t'Yazaira',\n\t'Yatzil',\n\t'Anam',\n\t'Sparrow',\n\t'Anetra',\n\t'Nalayah',\n\t'Jaylenne',\n\t'Joya',\n\t'Kensi',\n\t'Khylee',\n\t'Lilyrose',\n\t'Iasia',\n\t'Jaliah',\n\t'Melda',\n\t'Armella',\n\t'Zyasia',\n\t'Nazia',\n\t'Shanasia',\n\t'Krystie',\n\t'Dorothe',\n\t'Thora',\n\t'Adelene',\n\t'Avaya',\n\t'Aurielle',\n\t'Ailany',\n\t'Andromeda',\n\t'Loa',\n\t'Cleora',\n\t'Darling',\n\t'Caliana',\n\t'Keniyah',\n\t'Crystel',\n\t'Dimitra',\n\t'Renate',\n\t'Zyriah',\n\t'Taegan',\n\t'Marygrace',\n\t'Mckinzie',\n\t'Nivea',\n\t'Rhian',\n\t'Amarissa',\n\t'Kadee',\n\t'Devani',\n\t'Khara',\n\t'Aishia',\n\t'Annell',\n\t'Jaslin',\n\t'Jaide',\n\t'Briahna',\n\t'Merary',\n\t'Lauraine',\n\t'Tywana',\n\t'Athanasia',\n\t'Chantay',\n\t'Loretha',\n\t'Anyiah',\n\t'Marvine',\n\t'Jennelle',\n\t'Hiedi',\n\t'Sunnie',\n\t'Panagiota',\n\t'Lanesha',\n\t'Amity',\n\t'Denyse',\n\t'Nataleigh',\n\t'Amyia',\n\t'Avrie',\n\t'Analysa',\n\t'Ameris',\n\t'Ambrielle',\n\t'Kynnedy',\n\t'Gracy',\n\t'Kaelie',\n\t'Heydi',\n\t'Latrese',\n\t'Lavonia',\n\t'Latrelle',\n\t'Lynetta',\n\t'Graceann',\n\t'Susette',\n\t'Sarabeth',\n\t'Arnetta',\n\t'Shelonda',\n\t'Myiesha',\n\t'Shila',\n\t'Pascale',\n\t'Zenja',\n\t'Madelene',\n\t'Lalena',\n\t'Doria',\n\t'Dagmar',\n\t'Griselle',\n\t'Nitza',\n\t'Moraima',\n\t'Miguelina',\n\t'Brittania',\n\t'Emmalin',\n\t'Novie',\n\t'Chavonne',\n\t'Lashana',\n\t'Quyen',\n\t'Gennifer',\n\t'Zaryah',\n\t'Paytin',\n\t'Keeli',\n\t'Kolbi',\n\t'Maddyson',\n\t'Jackqueline',\n\t'Arnita',\n\t'Brynnley',\n\t'Edelyn',\n\t'Arial',\n\t'Yaneliz',\n\t'Ena',\n\t'Barbaraann',\n\t'Glendora',\n\t'Heavyn',\n\t'Neomi',\n\t'Rebbecca',\n\t'Laketa',\n\t'Renetta',\n\t'Carline',\n\t'Nezzie',\n\t'Shaneeka',\n\t'Desaray',\n\t'Hiromy',\n\t'Hallee',\n\t'Halli',\n\t'Sheba',\n\t'Tahisha',\n\t'Paetyn',\n\t'Katisha',\n\t'Joyell',\n\t'Joyel',\n\t'Zoei',\n\t'Zamiya',\n\t'Raygan',\n\t'Clydie',\n\t'Missouri',\n\t'Debany',\n\t'Kalisha',\n\t'Niurka',\n\t'Beverlyn',\n\t'Bell',\n\t'Zuly',\n\t'Lakayla',\n\t'Lainee',\n\t'Kynli',\n\t'Lundyn',\n\t'Erynn',\n\t'Braleigh',\n\t'Allena',\n\t'Lashanna',\n\t'Shaunya',\n\t'Tykia',\n\t'Leeba',\n\t'Bassheva',\n\t'Kandra',\n\t'Breyana',\n\t'Geovana',\n\t'Joandra',\n\t'Jessyka',\n\t'Analilia',\n\t'Charna',\n\t'Josefita',\n\t'Laurin',\n\t'Casi',\n\t'Jeniah',\n\t'Koraima',\n\t'Vivi',\n\t'Merlina',\n\t'Marinna',\n\t'Soriya',\n\t'Sarayu',\n\t'Ma',\n\t'Adali',\n\t'Abbygale',\n\t'Avonlea',\n\t'Bellah',\n\t'Makeyla',\n\t'Maanya',\n\t'Hania',\n\t'Ellah',\n\t'Esmee',\n\t'Jaylean',\n\t'Verlene',\n\t'Kendria',\n\t'Kasondra',\n\t'Kadesha',\n\t'Kadedra',\n\t'Reizel',\n\t'Reizy',\n\t'Sheryle',\n\t'Elka',\n\t'Caileigh',\n\t'Meya',\n\t'Rondi',\n\t'Janetta',\n\t'Dwana',\n\t'Yakira',\n\t'Donetta',\n\t'Laurissa',\n\t'Jordann',\n\t'Jenice',\n\t'Hasmik',\n\t'Mychelle',\n\t'Shabnam',\n\t'Sarahann',\n\t'Shaylene',\n\t'Zuleica',\n\t'Verenise',\n\t'Dejanee',\n\t'Alyx',\n\t'Breyanna',\n\t'Anum',\n\t'Jamesia',\n\t'Asheley',\n\t'Keya',\n\t'Lyzette',\n\t'Rossy',\n\t'Terilyn',\n\t'Rahaf',\n\t'Anabia',\n\t'Neala',\n\t'Payal',\n\t'Taheera',\n\t'Nakhia',\n\t'Shaela',\n\t'Krupa',\n\t'Suriya',\n\t'Victory',\n\t'Viviane',\n\t'Habiba',\n\t'Fortune',\n\t'Farida',\n\t'Erina',\n\t'Ranya',\n\t'Tifani',\n\t'Surie',\n\t'Aastha',\n\t'Joella',\n\t'Sherida',\n\t'Vonnie',\n\t'Bluma',\n\t'Gianny',\n\t'Naziyah',\n\t'Taylie',\n\t'Jakia',\n\t'Timia',\n\t'Farren',\n\t'Skylin',\n\t'Sabiha',\n\t'Nashley',\n\t'Blimi',\n\t'Annita',\n\t'Kristianna',\n\t'Delena',\n\t'Dalina',\n\t'Kyasia',\n\t'Cathlene',\n\t'Karalee',\n\t'Merilee',\n\t'Monette',\n\t'Asharia',\n\t'Jacquelina',\n\t'Nishat',\n\t'Charlcie',\n\t'Sukanya',\n\t'Celines',\n\t'Rashell',\n\t'Nadja',\n\t'Lamiyah',\n\t'Najae',\n\t'Zipporah',\n\t'Rawan',\n\t'Tailor',\n\t'Denesha',\n\t'Masiel',\n\t'Nida',\n\t'Assata',\n\t'Infiniti',\n\t'Cresencia',\n\t'Omega',\n\t'Meher',\n\t'Maneh',\n\t'Noura',\n\t'Yanine',\n\t'Maral',\n\t'Malori',\n\t'Safia',\n\t'Saori',\n\t'Vesper',\n\t'Audrinna',\n\t'Dea',\n\t'Kahlia',\n\t'Eliora',\n\t'Isley',\n\t'Laurinda',\n\t'Mignon',\n\t'Debie',\n\t'Denette',\n\t'Jolyn',\n\t'Casondra',\n\t'Donnisha',\n\t'Elysse',\n\t'Lazaria',\n\t'Aleia',\n\t'Shelbee',\n\t'Ivone',\n\t'Mazal',\n\t'Sherley',\n\t'Shantia',\n\t'Christelle',\n\t'Tatjana',\n\t'Roselia',\n\t'Pebbles',\n\t'Cleotilde',\n\t'Erendida',\n\t'Chardonnay',\n\t'Brittiny',\n\t'Brittanny',\n\t'Scarleth',\n\t'Mehar',\n\t'Neila',\n\t'Sofiya',\n\t'Lakshmi',\n\t'Lilianne',\n\t'Akeiba',\n\t'Shabreka',\n\t'Joannie',\n\t'Samiha',\n\t'Fatma',\n\t'Itzell',\n\t'Envy',\n\t'Maybelline',\n\t'Nashly',\n\t'Rya',\n\t'Kaelani',\n\t'Kailana',\n\t'Aylah',\n\t'Bellamarie',\n\t'Marizol',\n\t'Malyssa',\n\t'Madai',\n\t'Neelam',\n\t'Ysamar',\n\t'Sulma',\n\t'Sueling',\n\t'Song',\n\t'Sharayah',\n\t'Melisha',\n\t'Ashliegh',\n\t'Melodi',\n\t'Belem',\n\t'Chrystina',\n\t'Tonantzin',\n\t'Setareh',\n\t'Valeri',\n\t'Yaffa',\n\t'Niara',\n\t'Mame',\n\t'Janasia',\n\t'Flo',\n\t'Gustavia',\n\t'Lanya',\n\t'Nanie',\n\t'Velta',\n\t'Dot',\n\t'Luberta',\n\t'Ledora',\n\t'Olean',\n\t'Abbigayle',\n\t'Hadeel',\n\t'Rayma',\n\t'Mayola',\n\t'Nonnie',\n\t'Voncille',\n\t'Heloise',\n\t'Nolia',\n\t'Victorine',\n\t'Yola',\n\t'Vella',\n\t'Terrilyn',\n\t'Noelie',\n\t'Alean',\n\t'Allean',\n\t'Lorean',\n\t'Josiephine',\n\t'Heba',\n\t'Kerrianne',\n\t'Odeal',\n\t'Aigner',\n\t'Anaclara',\n\t'Gudrun',\n\t'Valborg',\n\t'Trenice',\n\t'Ardath',\n\t'Aune',\n\t'Teresia',\n\t'Lesha',\n\t'Dewanna',\n\t'Arlyce',\n\t'Jayliana',\n\t'Orene',\n\t'Paralee',\n\t'Jamyia',\n\t'Kemiyah',\n\t'Fredia',\n\t'Amyiah',\n\t'Doreatha',\n\t'Lashanta',\n\t'Cerissa',\n\t'Kawana',\n\t'Arizona',\n\t'Shanetta',\n\t'Jalesa',\n\t'Asmaa',\n\t'Garnette',\n\t'Clella',\n\t'Artemisa',\n\t'Liliya',\n\t'Oretha',\n\t'Adna',\n\t'Amyri',\n\t'Tyshae',\n\t'Maryan',\n\t'Santanna',\n\t'Bushra',\n\t'Jamyla',\n\t'Earma',\n\t'Delsie',\n\t'Verlean',\n\t'Sherena',\n\t'Carmelite',\n\t'Chari',\n\t'Darlean',\n\t'Shamia',\n\t'Audryna',\n\t'Genevia',\n\t'Avie',\n\t'Tamora',\n\t'Lavonna',\n\t'September',\n\t'Sharolyn',\n\t'Athziry',\n\t'Alyiah',\n\t'Aleina',\n\t'Alesandra',\n\t'Amoreena',\n\t'Nykia',\n\t'Drea',\n\t'Galilee',\n\t'Ainslie',\n\t'Ishita',\n\t'Jenavie',\n\t'Jezabel',\n\t'Erandi',\n\t'Evana',\n\t'Jiana',\n\t'Laniah',\n\t'Britanny',\n\t'Sanika',\n\t'Solash',\n\t'Laasya',\n\t'Nairi',\n\t'Leighla',\n\t'Kaiyah',\n\t'Suhana',\n\t'Taliya',\n\t'Maleia',\n\t'Candee',\n\t'Ninette',\n\t'Eugena',\n\t'Lateisha',\n\t'Salvatrice',\n\t'Quaneisha',\n\t'Mertis',\n\t'Bebe',\n\t'Rida',\n\t'Takyra',\n\t'Floye',\n\t'Christell',\n\t'Ozelle',\n\t'Juanice',\n\t'Genia',\n\t'Shaundra',\n\t'Shanin',\n\t'Wendee',\n\t'Cynde',\n\t'Adalynne',\n\t'Adelin',\n\t'Hayven',\n\t'Ayra',\n\t'Chimamanda',\n\t'Kenzlie',\n\t'Taylynn',\n\t'Zerenity',\n\t'Kynsleigh',\n\t'Dorthea',\n\t'Alley',\n\t'Melrose',\n\t'Keyondra',\n\t'Anglia',\n\t'Lynnea',\n\t'Tamira',\n\t'Terisa',\n\t'Tona',\n\t'Isaly',\n\t'Jeimy',\n\t'Giannah',\n\t'Leilanni',\n\t'Leya',\n\t'Quetzali',\n\t'Naylene',\n\t'Misaki',\n\t'Amely',\n\t'Donette',\n\t'Charlayne',\n\t'Selia',\n\t'Kittie',\n\t'Tamaya',\n\t'Lenna',\n\t'Zykerria',\n\t'Teisha',\n\t'Terrea',\n\t'Alita',\n\t'Bunny',\n\t'Deniece',\n\t'Inge',\n\t'Takira',\n\t'Monesha',\n\t'Mahala',\n\t'Donica',\n\t'Fortunata',\n\t'Valrie',\n\t'Zayah',\n\t'Ziyah',\n\t'Vela',\n\t'Vassie',\n\t'Omie',\n\t'Nadean',\n\t'Annalynn',\n\t'Adah',\n\t'Edmae',\n\t'Aalayah',\n\t'Yuritzy',\n\t'Ytzel',\n\t'Svetlana',\n\t'Soha',\n\t'Alfredia',\n\t'Kylei',\n\t'Landrey',\n\t'Lariyah',\n\t'Rozlyn',\n\t'Sakina',\n\t'Greer',\n\t'Bula',\n\t'Eura',\n\t'Harmonee',\n\t'Pecola',\n\t'Noreta',\n\t'Laveda',\n\t'Retta',\n\t'Rozlynn',\n\t'Skarlet',\n\t'Snow',\n\t'Zoha',\n\t'Sophiarose',\n\t'Anglea',\n\t'Itzabella',\n\t'Elanie',\n\t'Calirose',\n\t'Adhya',\n\t'Amaiyah',\n\t'Lavender',\n\t'Leylanie',\n\t'Kaliana',\n\t'Quetzaly',\n\t'Helon',\n\t'Nalia',\n\t'Cipriana',\n\t'Martyna',\n\t'Pola',\n\t'Dierra',\n\t'Maximina',\n\t'Sherica',\n\t'Murlene',\n\t'Berna',\n\t'Bernarda',\n\t'Ettie',\n\t'Laiken',\n\t'Hensley',\n\t'Fontella',\n\t'Modelle',\n\t'Timotea',\n\t'Venora',\n\t'Lakelyn',\n\t'Licia',\n\t'Laury',\n\t'Loralee',\n\t'Kamyah',\n\t'Verba',\n\t'Angelee',\n\t'Adalind',\n\t'Adaliz',\n\t'Ailynn',\n\t'Airi',\n\t'Alany',\n\t'Avika',\n\t'Avleen',\n\t'Leoni',\n\t'Saisha',\n\t'Savvy',\n\t'Philippa',\n\t'Jasneet',\n\t'Izabellah',\n\t'Elienai',\n\t'Kalayah',\n\t'Eureka',\n\t'Dionicia',\n\t'Zylah',\n\t'Zosia',\n\t'Yetzali',\n\t'Tigerlily',\n\t'Dorena',\n\t'Nakesha',\n\t'Lakenya',\n\t'Margarete',\n\t'Margarite',\n\t'Cloteal',\n\t'Adline',\n\t'Willadeen',\n\t'Anselma',\n\t'Marcheta',\n\t'Havyn',\n\t'Ilyanna',\n\t'Idalie',\n\t'Fallyn',\n\t'Emori',\n\t'Anzal',\n\t'Kalila',\n\t'Ellisyn',\n\t'Maddalyn',\n\t'Roslynn',\n\t'Hodan',\n\t'Emalynn',\n\t'Addy',\n\t'Adelyne',\n\t'Aizah',\n\t'Dalayza',\n\t'Cambri',\n\t'Annali',\n\t'Angelynn',\n\t'Caidence',\n\t'Auriana',\n\t'Azlynn',\n\t'Blakelee',\n\t'Brenleigh',\n\t'Tailynn',\n\t'Zyla',\n\t'Verline',\n\t'Pierina',\n\t'Panhia',\n\t'Valda',\n\t'Shela',\n\t'Uldine',\n\t'Vibha',\n\t'Wednesday',\n\t'Porshia',\n\t'Shabria',\n\t'Palmina',\n\t'Khristine',\n\t'Lannette',\n\t'Sandhya',\n\t'Janalyn',\n\t'Floreine',\n\t'Marchelle',\n\t'Minette',\n\t'Tawnia',\n\t'Wynne',\n\t'Sada',\n\t'Windi',\n\t'Clydene',\n\t'Shundra',\n\t'Joycie',\n\t'Delories',\n\t'Alvena',\n\t'Edmonia',\n\t'Denean',\n\t'Dhana',\n\t'Marjie',\n\t'Alicja',\n\t'Cammy',\n\t'Aryam',\n\t'Leonie',\n\t'Adrielle',\n\t'Felisita',\n\t'Tinnie',\n\t'Marinda',\n\t'Lamia',\n\t'Conchetta',\n\t'Naylah',\n\t'Sarayah',\n\t'Nataliya',\n\t'Delani',\n\t'Eknoor',\n\t'Ellee',\n\t'Maiah',\n\t'Mayumi',\n\t'Meara',\n\t'Kalliope',\n\t'Jewels',\n\t'Lanaya',\n\t'Yui',\n\t'Maxcine',\n\t'Yaqueline',\n\t'Yoceline',\n\t'Marilynne',\n\t'Maple',\n\t'Ronesha',\n\t'Marili',\n\t'Reema',\n\t'Rayana',\n\t'Aggie',\n\t'Talina',\n\t'Doristine',\n\t'Romelle',\n\t'Shaqueena',\n\t'Sharelle',\n\t'Caira',\n\t'Gelsey',\n\t'Tashawna',\n\t'Takeisha',\n\t'Jerlean',\n\t'Sunita',\n\t'Shalini',\n\t'Michaeline',\n\t'Audria',\n\t'Ronnisha',\n\t'Leonia',\n\t'Monna',\n\t'Ambra',\n\t'Corena',\n\t'Taren',\n\t'Alexiss',\n\t'Kajal',\n\t'Jordanne',\n\t'Kasia',\n\t'Brienna',\n\t'Gayane',\n\t'Deija',\n\t'Cidney',\n\t'Tabytha',\n\t'Raeleen',\n\t'Mkayla',\n\t'Harli',\n\t'Jassmin',\n\t'Ilo',\n\t'Lasheena',\n\t'Keianna',\n\t'Kally',\n\t'Makenzy',\n\t'Angelea',\n\t'Natasia',\n\t'Shaneequa',\n\t'Monay',\n\t'Moet',\n\t'Marcelline',\n\t'Shatia',\n\t'Sarafina',\n\t'Kaisha',\n\t'Tiffney',\n\t'Shenequa',\n\t'Sheretta',\n\t'Floria',\n\t'Alacia',\n\t'Kavita',\n\t'Kerianne',\n\t'Tameshia',\n\t'Jamye',\n\t'Shanese',\n\t'Latiqua',\n\t'Jesscia',\n\t'Johanny',\n\t'Daniqua',\n\t'Geneviev',\n\t'Bernadet',\n\t'Annice',\n\t'Megann',\n\t'Katee',\n\t'Nikeya',\n\t'Stavroula',\n\t'Tawna',\n\t'Sindia',\n\t'Marlaina',\n\t'Jury',\n\t'Tovah',\n\t'Shivonne',\n\t'Nekia',\n\t'Yvonnie',\n\t'Kyna',\n\t'Railey',\n\t'Xandria',\n\t'Genine',\n\t'Tashima',\n\t'Marycarmen',\n\t'Kiahna',\n\t'Jadynn',\n\t'Akua',\n\t'Eather',\n\t'Fatema',\n\t'Aiysha',\n\t'Allisa',\n\t'Ashleynicole',\n\t'Bobette',\n\t'Shandrika',\n\t'Hollace',\n\t'Chandni',\n\t'Cayley',\n\t'Brenae',\n\t'Areisy',\n\t'Annahi',\n\t'Anallely',\n\t'Klarisa',\n\t'Ayssa',\n\t'Jatavia',\n\t'Nohemy',\n\t'Mikyla',\n\t'Mariadelosang',\n\t'Shatina',\n\t'Kazandra',\n\t'Elsi',\n\t'Teryl',\n\t'Yennifer',\n\t'Destyni',\n\t'Damariz',\n\t'Areanna',\n\t'Everlean',\n\t'Lesslie',\n\t'Margrette',\n\t'Tuyet',\n\t'Jacquelene',\n\t'Grissel',\n\t'Walterine',\n\t'Shterna',\n\t'Gila',\n\t'Nabila',\n\t'Liel',\n\t'Sani',\n\t'Djeneba',\n\t'Angeliz',\n\t'Anari',\n\t'Amyrie',\n\t'Aissa',\n\t'Tichina',\n\t'Amariana',\n\t'Xiara',\n\t'Yamiles',\n\t'Isatou',\n\t'Airiana',\n\t'Carrigan',\n\t'Aldea',\n\t'Aarika',\n\t'Bryanne',\n\t'Alegandra',\n\t'Carrisa',\n\t'Andrina',\n\t'Casaundra',\n\t'Breanda',\n\t'Biviana',\n\t'Irena',\n\t'Denielle',\n\t'Lizzett',\n\t'Shaunice',\n\t'Sigourney',\n\t'Sona',\n\t'Paradise',\n\t'Lashanique',\n\t'Melaina',\n\t'Zoua',\n\t'Vaneza',\n\t'Tyresha',\n\t'Shyasia',\n\t'Tiyana',\n\t'Youa',\n\t'Zaneta',\n\t'Muskan',\n\t'Talissa',\n\t'Kennisha',\n\t'Lizandra',\n\t'Akosua',\n\t'Jaymi',\n\t'Chelby',\n\t'Chelci',\n\t'Aeriel',\n\t'Isamara',\n\t'Payge',\n\t'Hadja',\n\t'Fruma',\n\t'Fiza',\n\t'Fatumata',\n\t'Kabrina',\n\t'Feigy',\n\t'Zanaya',\n\t'Yanette',\n\t'Teairra',\n\t'Talor',\n\t'Kathrina',\n\t'Justeen',\n\t'Maryelizabeth',\n\t'Jannete',\n\t'Chantalle',\n\t'Haide',\n\t'Genelle',\n\t'Esthela',\n\t'Emilse',\n\t'Maegen',\n\t'Lyndsi',\n\t'Cristiana',\n\t'Clio',\n\t'Breindel',\n\t'Briyana',\n\t'Jamyria',\n\t'Jameshia',\n\t'Kadeshia',\n\t'Jamisha',\n\t'Faige',\n\t'Aishah',\n\t'Lorette',\n\t'Nandi',\n\t'Nastasia',\n\t'Shada',\n\t'Shakeia',\n\t'Shaneice',\n\t'Yanel',\n\t'Teryn',\n\t'Shaylyn',\n\t'Karimah',\n\t'Fabienne',\n\t'Shaianne',\n\t'Saleena',\n\t'Raychelle',\n\t'Pahoua',\n\t'Justyne',\n\t'Fransheska',\n\t'Katilyn',\n\t'Shadaya',\n\t'Quanasia',\n\t'Shantasia',\n\t'Nyasha',\n\t'Minahil',\n\t'Shahd',\n\t'Chani',\n\t'Bassy',\n\t'Zunairah',\n\t'Lynsie',\n\t'Charnelle',\n\t'Jaquana',\n\t'Taquana',\n\t'Shaasia',\n\t'Idelle',\n\t'Rogene',\n\t'Udy',\n\t'Devory',\n\t'Evanna',\n\t'Keisy',\n\t'Hadiya',\n\t'Brittainy',\n\t'Cortni',\n\t'Erikka',\n\t'Lindsie',\n\t'Mayraalejandra',\n\t'Topacio',\n\t'Elky',\n\t'Yita',\n\t'Sura',\n\t'Tiani',\n\t'Sadiya',\n\t'Kaitlen',\n\t'Jessicca',\n\t'Linna',\n\t'Stephy',\n\t'Hadia',\n\t'Jaiyana',\n\t'Aldina',\n\t'Frimy',\n\t'Tywanda',\n\t'Renarda',\n\t'Mardelle',\n\t'Alaijah',\n\t'Antoinetta',\n\t'Amyria',\n\t'Sheyanne',\n\t'Jackee',\n\t'Bina',\n\t'Khole',\n\t'Selenia',\n\t'Seidy',\n\t'Albertina',\n\t'Yoandra',\n\t'Yarelyn',\n\t'Kassaundra',\n\t'Lynzee',\n\t'Haneen',\n\t'Marshay',\n\t'Sharona',\n\t'Shanygne',\n\t'Nigeria',\n\t'Nechy',\n\t'Jhane',\n\t'Chrisette',\n\t'Gypsy',\n\t'Drusilla',\n\t'Milta',\n\t'Ranee',\n\t'Yvett',\n\t'Mykenzie',\n\t'Aracelia',\n\t'Vernessa',\n\t'Chekesha',\n\t'Cadance',\n\t'Moria',\n\t'Tsurue',\n\t'Yarisbel',\n\t'Verena',\n\t'Tomoe',\n\t'Breezy',\n\t'Swannie',\n\t'Tsuyuko',\n\t'Hisayo',\n\t'Gerianne',\n\t'Cailynn',\n\t'Adrionna',\n\t'Lillianne',\n\t'Eduarda',\n\t'Melinna',\n\t'Sanaiya',\n\t'Nohelia',\n\t'Zarela',\n\t'Yarethzy',\n\t'Sruthi',\n\t'Josefine',\n\t'Kiela',\n\t'Kersten',\n\t'Syriah',\n\t'Emaleigh',\n\t'Jazlynne',\n\t'Aeryn',\n\t'Danelly',\n\t'Dalylah',\n\t'Lexa',\n\t'Kherington',\n\t'Nivia',\n\t'Carolanne',\n\t'Sharlotte',\n\t'Vanda',\n\t'Deirdra',\n\t'Ilyse',\n\t'Judyann',\n\t'Venezia',\n\t'Mailee',\n\t'Latishia',\n\t'Ajla',\n\t'Lucine',\n\t'Shontell',\n\t'Rosiland',\n\t'Celinda',\n\t'Aanika',\n\t'Felicidad',\n\t'Denia',\n\t'Natsuko',\n\t'Analyse',\n\t'Angellina',\n\t'Brizeida',\n\t'Jazira',\n\t'Terah',\n\t'Reana',\n\t'Jennalyn',\n\t'Jenaya',\n\t'Kelani',\n\t'Miyuki',\n\t'Aracelie',\n\t'Dannika',\n\t'Danity',\n\t'Cadie',\n\t'Breelyn',\n\t'Kayra',\n\t'Mayli',\n\t'Malarie',\n\t'Tequilla',\n\t'Gerilyn',\n\t'Mieko',\n\t'Belynda',\n\t'Shamiyah',\n\t'Reaghan',\n\t'Ziya',\n\t'Rozanne',\n\t'Joyanne',\n\t'Zamaria',\n\t'Luiza',\n\t'Tamanika',\n\t'Kimya',\n\t'Patriciaann',\n\t'Eilene',\n\t'Bryna',\n\t'Yena',\n\t'Yarelly',\n\t'Maddyn',\n\t'Khylie',\n\t'Khyla',\n\t'Margueritte',\n\t'Ramya',\n\t'Jenea',\n\t'Jennavie',\n\t'Jazzlene',\n\t'Marelly',\n\t'Manya',\n\t'Lillyanne',\n\t'Gyselle',\n\t'Niyati',\n\t'Moana',\n\t'Kenosha',\n\t'Ezmeralda',\n\t'Anvitha',\n\t'Avelyn',\n\t'Dahlila',\n\t'Emmaly',\n\t'Dayamy',\n\t'Anajulia',\n\t'Mandee',\n\t'Valli',\n\t'Sharan',\n\t'Leasia',\n\t'Shiquita',\n\t'Malana',\n\t'Nadeen',\n\t'Parneet',\n\t'Lynna',\n\t'Saskia',\n\t'Samaiya',\n\t'Saffron',\n\t'Vianka',\n\t'Evey',\n\t'Ebelin',\n\t'Anishka',\n\t'Aneth',\n\t'Addelynn',\n\t'Kayly',\n\t'Alyzae',\n\t'Anniyah',\n\t'Ayme',\n\t'Alexsa',\n\t'Aidsa',\n\t'Elyn',\n\t'Illianna',\n\t'Greenlee',\n\t'Tinesha',\n\t'Sherline',\n\t'Yvanna',\n\t'Joslin',\n\t'Estee',\n\t'Lusia',\n\t'Nhung',\n\t'Janielle',\n\t'Smithie',\n\t'Yohanna',\n\t'Shanette',\n\t'Marilena',\n\t'Blannie',\n\t'Meleana',\n\t'Malie',\n\t'Jannine',\n\t'Kuulei',\n\t'Kawehi',\n\t'Velna',\n\t'Kuuipo',\n\t'Keani',\n\t'Tiffeny',\n\t'Billi',\n\t'Conni',\n\t'Elexia',\n\t'Sheily',\n\t'Mehak',\n\t'Ardelia',\n\t'Phung',\n\t'Aleasha',\n\t'Toyia',\n\t'Kalliopi',\n\t'Carrieann',\n\t'Shayal',\n\t'Brandye',\n\t'Shatisha',\n\t'Neola',\n\t'Pallavi',\n\t'Symantha',\n\t'Mackenzee',\n\t'Shalawn',\n\t'Krimson',\n\t'Jaquelinne',\n\t'Sonal',\n\t'Calysta',\n\t'Kaylamarie',\n\t'Kirah',\n\t'Belicia',\n\t'Anicia',\n\t'Aerin',\n\t'Marisel',\n\t'Priscella',\n\t'Lei',\n\t'Imaan',\n\t'Haruka',\n\t'Kila',\n\t'Jerusha',\n\t'Deva',\n\t'Charon',\n\t'Leida',\n\t'Deadra',\n\t'Areana',\n\t'Iriana',\n\t'Drenda',\n\t'Saadia',\n\t'Danne',\n\t'Jossalyn',\n\t'Kennadie',\n\t'Makaya',\n\t'Daelynn',\n\t'Daffne',\n\t'Galia',\n\t'Naida',\n\t'Yaira',\n\t'Latania',\n\t'Damarys',\n\t'Mireille',\n\t'Maribell',\n\t'Luzelena',\n\t'Anacani',\n\t'Sahira',\n\t'Shaylin',\n\t'Sejal',\n\t'Subrina',\n\t'Julaine',\n\t'Saby',\n\t'Zoraya',\n\t'Atalie',\n\t'Deseray',\n\t'Nacole',\n\t'Jennell',\n\t'Laneisha',\n\t'Ivie',\n\t'Darnella',\n\t'Lashone',\n\t'Lekeisha',\n\t'Puanani',\n\t'Uilani',\n\t'Donyale',\n\t'Terriann',\n\t'Marianela',\n\t'Josalynn',\n\t'Avari',\n\t'Blonnie',\n\t'Makya',\n\t'Seriah',\n\t'Nori',\n\t'Roselee',\n\t'Verbie',\n\t'Borghild',\n\t'Marcene',\n\t'Syretta',\n\t'Bama',\n\t'Eulene',\n\t'Chantale',\n\t'Shontae',\n\t'Mabell',\n\t'Hellon',\n\t'Shantanique',\n\t'Janki',\n\t'Dhara',\n\t'Buna',\n\t'Naeemah',\n\t'Tacara',\n\t'Shirleyann',\n\t'Tshwanda',\n\t'Nadege',\n\t'Georganne',\n\t'Leondra',\n\t'Fredricka',\n\t'Margaree',\n\t'Quincee',\n\t'Oaklynn',\n\t'Arlean',\n\t'Judee',\n\t'Nyoka',\n\t'Khia',\n\t'Kendia',\n\t'Mahek',\n\t'Anasia',\n\t'Jenin',\n\t'Gerline',\n\t'Elwillie',\n\t'Annsley',\n\t'Juhi',\n\t'Zettie',\n\t'Shacara',\n\t'Shantique',\n\t'Marijo',\n\t'Shakara',\n\t'Ersie',\n\t'Bionca',\n\t'Kolleen',\n\t'Ertha',\n\t'Chioma',\n\t'Roneisha',\n\t'Courtenay',\n\t'Altie',\n\t'Arla',\n\t'Delainey',\n\t'Rainelle',\n\t'Lockie',\n\t'Rayonna',\n\t'Nasiyah',\n\t'Zori',\n\t'Carollee',\n\t'Mima',\n\t'Irja',\n\t'Willadean',\n\t'Sigrid',\n\t'Myong',\n\t'Khaliah',\n\t'Sakeenah',\n\t'Saleemah',\n\t'Emmersyn',\n\t'Miyeko',\n\t'Brooksie',\n\t'Brailynn',\n\t'Raghad',\n\t'Nadira',\n\t'Hassana',\n\t'Toshiye',\n\t'Fumiye',\n\t'Kelise',\n\t'Angelis',\n\t'Earla',\n\t'Dilia',\n\t'Arwa',\n\t'Shaylie',\n\t'Synai',\n\t'Tanijah',\n\t'Jalaysia',\n\t'Charnita',\n\t'Marit',\n\t'Gaelle',\n\t'Shandiin',\n\t'Janelis',\n\t'Gatha',\n\t'Alahna',\n\t'Aniyla',\n\t'Mikelle',\n\t'Skai',\n\t'Merlinda',\n\t'Tariyah',\n\t'Arietta',\n\t'Terrika',\n\t'Elenor',\n\t'Ruthanna',\n\t'Evaline',\n\t'Abigaelle',\n\t'Alayjah',\n\t'Naysa',\n\t'Camya',\n\t'Pachia',\n\t'Kamia',\n\t'Sylvania',\n\t'Ambree',\n\t'Oakleigh',\n\t'Zania',\n\t'Murielle',\n\t'Charlyn',\n\t'Zykira',\n\t'Jestine',\n\t'Simonne',\n\t'Willodene',\n\t'Lyndee',\n\t'Sophonie',\n\t'Saddie',\n\t'Darlis',\n\t'Lynnda',\n\t'Marysa',\n\t'Seleena',\n\t'Raevyn',\n\t'Lilikoi',\n\t'Maiyer',\n\t'Kymberli',\n\t'Shayda',\n\t'Cassidee',\n\t'Jadira',\n\t'Delora',\n\t'Afsheen',\n\t'Adira',\n\t'Amena',\n\t'Canary',\n\t'Humaira',\n\t'Derricka',\n\t'Fatiha',\n\t'Xia',\n\t'Jaquelyne',\n\t'Aurianna',\n\t'Sarahjane',\n\t'Sanaz',\n\t'Taleen',\n\t'Teara',\n\t'Taiz',\n\t'Sharai',\n\t'Magally',\n\t'Manon',\n\t'Maizie',\n\t'Manisha',\n\t'Marisleysis',\n\t'Anjela',\n\t'Youlanda',\n\t'Jermani',\n\t'Elysha',\n\t'Claritza',\n\t'Gissela',\n\t'Icela',\n\t'Alixandria',\n\t'Asley',\n\t'Analuisa',\n\t'Maddalena',\n\t'Cortnee',\n\t'Coretha',\n\t'Audreanna',\n\t'Manal',\n\t'Kadijatou',\n\t'Pollie',\n\t'Mysti',\n\t'Tiffiany',\n\t'Corean',\n\t'Amiree',\n\t'Anner',\n\t'Cleone',\n\t'Lavone',\n\t'Fredna',\n\t'Konnie',\n\t'Robbyn',\n\t'Alica',\n\t'Bessy',\n\t'Aleesa',\n\t'Analleli',\n\t'Mischelle',\n\t'Bethani',\n\t'Baillie',\n\t'Odessie',\n\t'Erlene',\n\t'Marcile',\n\t'Edona',\n\t'Tylah',\n\t'Tyrah',\n\t'Rainell',\n\t'Precilla',\n\t'Genever',\n\t'Ajanee',\n\t'Chera',\n\t'Amye',\n\t'Monserratt',\n\t'Moorea',\n\t'Richa',\n\t'Willetta',\n\t'Shawne',\n\t'Trisa',\n\t'Lasonia',\n\t'Cleona',\n\t'Alizea',\n\t'Anayely',\n\t'Emelly',\n\t'Fionna',\n\t'Cerena',\n\t'Julyana',\n\t'Kaile',\n\t'Jacklin',\n\t'Brianca',\n\t'Ashleyann',\n\t'Richardine',\n\t'Kelcee',\n\t'Keyaira',\n\t'Mabelle',\n\t'Brecklyn',\n\t'Samyah',\n\t'Ayonna',\n\t'Mesha',\n\t'Tyeshia',\n\t'Tiffiney',\n\t'Tyara',\n\t'Azuri',\n\t'Merideth',\n\t'Hermie',\n\t'Leaner',\n\t'Mendi',\n\t'Kanoelani',\n\t'Kadeidra',\n\t'Akeela',\n\t'Lin',\n\t'Mindel',\n\t'Lashell',\n\t'Meegan',\n\t'Ia',\n\t'Ellamae',\n\t'Jasmen',\n\t'Nechuma',\n\t'Romilda',\n\t'Hiilei',\n\t'Osmara',\n\t'Keidy',\n\t'Rianne',\n\t'Afia',\n\t'Teylor',\n\t'Raquelle',\n\t'Grizelda',\n\t'Tasfia',\n\t'Laquasha',\n\t'Tandra',\n\t'Maeghan',\n\t'Kameshia',\n\t'Alara',\n\t'Emina',\n\t'Delaina',\n\t'Jacquetta',\n\t'Christena',\n\t'Topanga',\n\t'Viviann',\n\t'Eboney',\n\t'Kasha',\n\t'Sativa',\n\t'Secilia',\n\t'Niomi',\n\t'Neena',\n\t'Tanji',\n\t'Shandy',\n\t'Corryn',\n\t'Esly',\n\t'Silka',\n\t'Sanaii',\n\t'Annais',\n\t'Kaitlynne',\n\t'Epiphany',\n\t'Maniya',\n\t'Mali',\n\t'Madigan',\n\t'Sanii',\n\t'Jaeleen',\n\t'Faria',\n\t'Maralyn',\n\t'Johnae',\n\t'Lekesha',\n\t'Sharry',\n\t'Latecia',\n\t'Kimberl',\n\t'Charita',\n\t'Modean',\n\t'Marrie',\n\t'Lielle',\n\t'Zeina',\n\t'Pessel',\n\t'Sameera',\n\t'Eleonora',\n\t'Jannatul',\n\t'Coryn',\n\t'Dustie',\n\t'Demitria',\n\t'Jacqlyn',\n\t'Nekisha',\n\t'Latrecia',\n\t'Rabecca',\n\t'Malaysha',\n\t'Lugenia',\n\t'Elese',\n\t'Myrissa',\n\t'Lucrecia',\n\t'Lysandra',\n\t'Tarryn',\n\t'Tammey',\n\t'Bonnita',\n\t'Shiffy',\n\t'Shirel',\n\t'Clariza',\n\t'Analis',\n\t'Rechy',\n\t'Nusaiba',\n\t'Manahil',\n\t'Chamisa',\n\t'Almetta',\n\t'Moncia',\n\t'Leba',\n\t'Jeilyn',\n\t'Earnesteen',\n\t'Mennie',\n\t'Kieara',\n\t'Sheina',\n\t'Yo',\n\t'Sharnice',\n\t'Ravin',\n\t'Daisi',\n\t'Britini',\n\t'Carlina',\n\t'Arisa',\n\t'Margy',\n\t'Whitnee',\n\t'Krysti',\n\t'Odean',\n\t'Darlys',\n\t'Janita',\n\t'Donnetta',\n\t'Guynell',\n\t'Neomia',\n\t'Loyalty',\n\t'Serra',\n\t'Kaysie',\n\t'Preciosa',\n\t'Earleen',\n\t'Shatoria',\n\t'Kourtnie',\n\t'Kana',\n\t'Jahnavi',\n\t'Kyarra',\n\t'Licet',\n\t'Railyn',\n\t'Delisha',\n\t'Flordia',\n\t'Arsema',\n\t'Kena',\n\t'Kaelah',\n\t'Kashia',\n\t'Emonie',\n\t'Izola',\n\t'Linsay',\n\t'Naibe',\n\t'Natallie',\n\t'Rosi',\n\t'Taline',\n\t'Cortina',\n\t'Annett',\n\t'Kadi',\n\t'Lindsi',\n\t'Lasasha',\n\t'Tamre',\n\t'Yenny',\n\t'Yasaman',\n\t'Shawnice',\n\t'Thi',\n\t'Jannel',\n\t'Kaleen',\n\t'Demitra',\n\t'Meisha',\n\t'Mahira',\n\t'Emmanuela',\n\t'Janaiya',\n\t'Rechel',\n\t'Nazifa',\n\t'Zeynep',\n\t'Shalena',\n\t'Hila',\n\t'Ailish',\n\t'Altovise',\n\t'Anabeth',\n\t'Anavictoria',\n\t'Averey',\n\t'Berlynn',\n\t'Alitza',\n\t'Adelynne',\n\t'Aiva',\n\t'Alenna',\n\t'Harlowe',\n\t'Camrynn',\n\t'Daphnie',\n\t'Ezri',\n\t'Lanna',\n\t'Lua',\n\t'Maddilynn',\n\t'Maeva',\n\t'Maytte',\n\t'Jovi',\n\t'Karalyn',\n\t'Kataleah',\n\t'Kaylana',\n\t'Milliana',\n\t'Surveen',\n\t'Veera',\n\t'Nimrat',\n\t'Nimrit',\n\t'Radha',\n\t'Roisin',\n\t'Senna',\n\t'Ruhi',\n\t'Saja',\n\t'Glenice',\n\t'Damiana',\n\t'Mikeria',\n\t'Lakeria',\n\t'Yulia',\n\t'Zanna',\n\t'Lynnae',\n\t'Illa',\n\t'Buelah',\n\t'Novis',\n\t'Johnye',\n\t'Valree',\n\t'Santiaga',\n\t'Modell',\n\t'Maydell',\n\t'Elfida',\n\t'Charlyne',\n\t'Argentina',\n\t'Terica',\n\t'Kiandra',\n\t'Tangi',\n\t'Pascuala',\n\t'Narcisa',\n\t'Macaria',\n\t'Thomasa',\n\t'Verta',\n\t'Eulogia',\n\t'Trellis',\n\t'Tavaria',\n\t'Dakayla',\n\t'Oneita',\n\t'Kimberlynn',\n\t'Aslee',\n\t'Jenascia',\n\t'Shamaria',\n\t'Lakely',\n\t'Etna',\n\t'Gilberte',\n\t'Glena',\n\t'Delorse',\n\t'Margrett',\n\t'Endia',\n\t'Buena',\n\t'Alvilda',\n\t'Domitila',\n\t'Jasmaine',\n\t'Jaquita',\n\t'Shontavia',\n\t'Roneshia',\n\t'Leasa',\n\t'Feliciana',\n\t'Allyana',\n\t'Anaia',\n\t'Annalyn',\n\t'Ayane',\n\t'Belladonna',\n\t'Adanely',\n\t'Akshaya',\n\t'Aleiyah',\n\t'Tereasa',\n\t'Antonisha',\n\t'Darlah',\n\t'Dhalia',\n\t'Dianelly',\n\t'Elika',\n\t'Camillia',\n\t'Leonila',\n\t'Manreet',\n\t'Jazzlin',\n\t'Kaiulani',\n\t'Kashvi',\n\t'Talayah',\n\t'Viana',\n\t'Ximenna',\n\t'Shaylah',\n\t'Quorra',\n\t'Anagha',\n\t'Annalea',\n\t'Jaleyah',\n\t'Bethanny',\n\t'Zophia',\n\t'Alegria',\n\t'Advika',\n\t'Taneika',\n\t'Marye',\n\t'Latorya',\n\t'Sayler',\n\t'Nara',\n\t'Nithya',\n\t'Phoenyx',\n\t'Saiya',\n\t'Mellany',\n\t'Yazlin',\n\t'Adalena',\n\t'Adya',\n\t'Aliviah',\n\t'Aalia',\n\t'Rickia',\n\t'Eliyana',\n\t'Arella',\n\t'Audris',\n\t'Auria',\n\t'Avantika',\n\t'Aylani',\n\t'Beya',\n\t'Camilah',\n\t'Kaede',\n\t'Laylonie',\n\t'Jayani',\n\t'Katara',\n\t'Hera',\n\t'Audrea',\n\t'Nataley',\n\t'Nazli',\n\t'Neyla',\n\t'Noya',\n\t'Srinidhi',\n\t'Pranavi',\n\t'Sareen',\n\t'Satya',\n\t'Terika',\n\t'Zamora',\n\t'Jimmye',\n\t'Brigida',\n\t'Shereka',\n\t'Widline',\n\t'Natori',\n\t'Dorthie',\n\t'Berit',\n\t'Aretta',\n\t'Svea',\n\t'Wenona',\n\t'Amera',\n\t'Nayah',\n\t'Lollie',\n\t'Genice',\n\t'Fabianna',\n\t'Nazaria',\n\t'Edra',\n\t'Jamariah',\n\t'Willine',\n\t'Madolyn',\n\t'Wanell',\n\t'Lucetta',\n\t'Eudora',\n\t'Adda',\n\t'Shariah',\n\t'Jaelle',\n\t'Jalena',\n\t'Annelle',\n\t'Solveig',\n\t'Autherine',\n\t'Nobie',\n\t'Izora',\n\t'Eudell',\n\t'Wyolene',\n\t'Mariangel',\n\t'Mayar',\n\t'Luevenia',\n\t'Eniyah',\n\t'Lilie',\n\t'Eliany',\n\t'Ivyonna',\n\t'Beadie',\n\t'Zeta',\n\t'Merita',\n\t'Valjean',\n\t'Delbra',\n\t'Alanys',\n\t'Camiyah',\n\t'Edyth',\n\t'Kanya',\n\t'Perina',\n\t'Catelynn',\n\t'Angelisse',\n\t'Relda',\n\t'Eathel',\n\t'Kerrington',\n\t'Lyriq',\n\t'Brita',\n\t'Meda',\n\t'Zanya',\n\t'Emileigh',\n\t'Aracelys',\n\t'Lisania',\n\t'Evalena',\n\t'Traniya',\n\t'Janiyla',\n\t'Syesha',\n\t'Ahmya',\n\t'Camora',\n\t'Armonie',\n\t'Beula',\n\t'Veva',\n\t'Kateria',\n\t'Harumi',\n\t'Kimiyo',\n\t'Tangie',\n\t'Amayrany',\n\t'Alexiah',\n\t'Alyn',\n\t'Tokie',\n\t'Masayo',\n\t'Makenzee',\n\t'Arieana',\n\t'Asayo',\n\t'Seirra',\n\t'Elfrida',\n\t'Ariona',\n\t'Masue',\n\t'Mizuki',\n\t'Liliane',\n\t'Malanie',\n\t'Sabreen',\n\t'Yuritza',\n\t'Shanautica',\n\t'Kateleen',\n\t'Montanna',\n\t'Tiona',\n\t'Theresia',\n\t'Vernia',\n\t'Mahayla',\n\t'Glynna',\n\t'Shaelynn',\n\t'Isabelly',\n\t'Aileth',\n\t'Ailie',\n\t'Melvia',\n\t'Sherrel',\n\t'Ivah',\n\t'Himani',\n\t'Marayah',\n\t'Melane',\n\t'Evanie',\n\t'Atalia',\n\t'Athalia',\n\t'Bethsy',\n\t'Betzi',\n\t'California',\n\t'Bryonna',\n\t'Yaretsy',\n\t'Zamara',\n\t'Sanyah',\n\t'Gaylynn',\n\t'Vitoria',\n\t'Yoshino',\n\t'Hatsumi',\n\t'Tatsuko',\n\t'Samika',\n\t'Maili',\n\t'Charnae',\n\t'Jamilla',\n\t'Vieno',\n\t'Rylei',\n\t'Vanita',\n\t'Hydia',\n\t'Carmyn',\n\t'Kenslie',\n\t'Maryhelen',\n\t'Lamees',\n\t'Lilley',\n\t'Haunani',\n\t'Pualani',\n\t'Mikiyah',\n\t'Lovina',\n\t'Janith',\n\t'Kanoe',\n\t'Anouk',\n\t'Mayerly',\n\t'Kiele',\n\t'Lexia',\n\t'Janani',\n\t'Berlinda',\n\t'Belma',\n\t'Inayah',\n\t'Saloma',\n\t'Anely',\n\t'Anjolina',\n\t'Devonna',\n\t'Nikhita',\n\t'Nayana',\n\t'Naidely',\n\t'Hina',\n\t'Ismerai',\n\t'Daisie',\n\t'Sitlaly',\n\t'Yahayra',\n\t'Trinidy',\n\t'Vallery',\n\t'Ceaira',\n\t'Floretta',\n\t'Lavena',\n\t'Shawntavia',\n\t'Dessa',\n\t'Tareva',\n\t'Iyanla',\n\t'Kania',\n\t'Shakiya',\n\t'Latora',\n\t'Hermila',\n\t'Clora',\n\t'Tiyanna',\n\t'Saydie',\n\t'Sherlene',\n\t'Trixie',\n\t'Nadiyah',\n\t'Zarria',\n\t'Saidy',\n\t'Sabriya',\n\t'Keirra',\n\t'Leeana',\n\t'Leianna',\n\t'Jaia',\n\t'Ishanvi',\n\t'Ailed',\n\t'Fathima',\n\t'Hansika',\n\t'Delailah',\n\t'Caliah',\n\t'Dayleen',\n\t'Jolisa',\n\t'Sallye',\n\t'Levonia',\n\t'Tula',\n\t'Kristene',\n\t'Alanni',\n\t'Aleiah',\n\t'Aeva',\n\t'Ilean',\n\t'Annet',\n\t'Lateshia',\n\t'Markesha',\n\t'Nikol',\n\t'Nadolyn',\n\t'Kimyatta',\n\t'Ercilia',\n\t'Sheliah',\n\t'Heiley',\n\t'Metztli',\n\t'Teyla',\n\t'Saranya',\n\t'Tanishka',\n\t'Kayana',\n\t'Donnamae',\n\t'Lajoyce',\n\t'Kemya',\n\t'Kemora',\n\t'Jozelyn',\n\t'Keili',\n\t'Jaydy',\n\t'Linzy',\n\t'Marelin',\n\t'Melaney',\n\t'Aleksa',\n\t'Alynah',\n\t'Elyza',\n\t'Emmery',\n\t'Angeleen',\n\t'Annica',\n\t'Bindi',\n\t'Demya',\n\t'Nayleen',\n\t'Sadee',\n\t'Samah',\n\t'Shylee',\n\t'Talula',\n\t'Vannia',\n\t'Yarelli',\n\t'Zohar',\n\t'Miangel',\n\t'Orla',\n\t'Sundra',\n\t'Korinne',\n\t'Taniesha',\n\t'Zaliyah',\n\t'Zionna',\n\t'Amariyah',\n\t'Loris',\n\t'Cruzita',\n\t'Landa',\n\t'Eduvina',\n\t'Ileanna',\n\t'Ileene',\n\t'Jesselle',\n\t'Daviana',\n\t'Eleny',\n\t'Marijane',\n\t'Okla',\n\t'Violanda',\n\t'Dorma',\n\t'Leoma',\n\t'Esperansa',\n\t'Shanreka',\n\t'Baudelia',\n\t'Teasia',\n\t'Aubrei',\n\t'Jeree',\n\t'Ortencia',\n\t'Melida',\n\t'Pernie',\n\t'Sweetie',\n\t'Arelly',\n\t'Ariday',\n\t'Bhavya',\n\t'Aiyanah',\n\t'Akshita',\n\t'Ginette',\n\t'Docia',\n\t'Pegeen',\n\t'Alaynah',\n\t'Allanah',\n\t'Daniah',\n\t'Loriana',\n\t'Kenly',\n\t'Kenli',\n\t'Kendahl',\n\t'Kenady',\n\t'Senora',\n\t'Hetal',\n\t'Aloha',\n\t'Barri',\n\t'Shaniquah',\n\t'Feather',\n\t'Rica',\n\t'Adriann',\n\t'Fleta',\n\t'Shontel',\n\t'Kynisha',\n\t'Nahima',\n\t'Myracle',\n\t'Syniah',\n\t'Jomarie',\n\t'Leeandra',\n\t'Maylie',\n\t'Marijose',\n\t'Jaley',\n\t'Sydnei',\n\t'Amariya',\n\t'Alysandra',\n\t'Damia',\n\t'Laurieann',\n\t'Lucecita',\n\t'Miosotis',\n\t'Shelvy',\n\t'Bernina',\n\t'Darice',\n\t'Dorrie',\n\t'Myrta',\n\t'Yoko',\n\t'Vara',\n\t'Joanmarie',\n\t'Kerryann',\n\t'Carmesa',\n\t'Kenzington',\n\t'Oaklyn',\n\t'Shelbia',\n\t'Arhianna',\n\t'Ardyn',\n\t'Amarachi',\n\t'Cydnee',\n\t'Chloey',\n\t'Brailee',\n\t'Aily',\n\t'Rosette',\n\t'Geryl',\n\t'Luba',\n\t'Marguerita',\n\t'Ayannah',\n\t'Deziyah',\n\t'Lurdes',\n\t'Dawnelle',\n\t'Reiko',\n\t'Brynli',\n\t'Tenlee',\n\t'Kynadee',\n\t'Emersen',\n\t'Josilyn',\n\t'Jazalyn',\n\t'Maleyah',\n\t'Cozette',\n\t'Xoe',\n\t'Syria',\n\t'Charyl',\n\t'Gita',\n\t'Aniaya',\n\t'Yulemni',\n\t'Joleigh',\n\t'Kenzy',\n\t'Logann',\n\t'Genesys',\n\t'Cherita',\n\t'Trenise',\n\t'Stpehanie',\n\t'Riann',\n\t'Matilyn',\n\t'Akisha',\n\t'Coralee',\n\t'Presli',\n\t'Yariana',\n\t'Edda',\n\t'Lisabeth',\n\t'Farm',\n\t'Dennice',\n\t'Deepa',\n\t'Chiffon',\n\t'Alyzea',\n\t'Alexas',\n\t'Emylee',\n\t'Joellyn',\n\t'Zo',\n\t'Marybell',\n\t'Sapna',\n\t'Khristina',\n\t'Kellyanne',\n\t'Chrystie',\n\t'Damary',\n\t'Graziella',\n\t'Tene',\n\t'Shakisha',\n\t'Shirelle',\n\t'Gwynne',\n\t'Insha',\n\t'Lydiann',\n\t'Cuba',\n\t'Cortnie',\n\t'Denelle',\n\t'Huyen',\n\t'Brieann',\n\t'Cindia',\n\t'Shalina',\n\t'Linnette',\n\t'Kiamesha',\n\t'Anecia',\n\t'Brinna',\n\t'Kewanna',\n\t'Malke',\n\t'Yira',\n\t'Rashidah',\n\t'Karicia',\n\t'Chrislyn',\n\t'Idali',\n\t'Zandria',\n\t'Ruta',\n\t'Toshi',\n\t'Daena',\n\t'Aneliz',\n\t'Cherese',\n\t'Brandalyn',\n\t'Brieanne',\n\t'Chistina',\n\t'Denys',\n\t'Nyisha',\n\t'Lissie',\n\t'Sherine',\n\t'Marisal',\n\t'Tuwana',\n\t'Zyonna',\n\t'Shady',\n\t'Patrisha',\n\t'Laniece',\n\t'Jessamyn',\n\t'Letticia',\n\t'Shirlie',\n\t'Miyo',\n\t'Marilouise',\n\t'Yukiye',\n\t'Ltanya',\n\t'Geralynn',\n\t'Anastazia',\n\t'Mitzie',\n\t'Lluliana',\n\t'Rozanna',\n\t'Magalie',\n\t'Salima',\n\t'Bevin',\n\t'Gaudy',\n\t'Ieasha',\n\t'Makia',\n\t'Sacheen',\n\t'Sherene',\n\t'Mataya',\n\t'Hatsuye',\n\t'Chiyeko',\n\t'Devanny',\n\t'Nasya',\n\t'Odyssey',\n\t'Tunisia',\n\t'Caldonia',\n\t'Marsi',\n\t'Mindee',\n\t'Tamy',\n\t'Sherill',\n\t'Tsitsiki',\n\t'Arva',\n\t'Gayleen',\n\t'Kimmy',\n\t'Lenette',\n\t'Roxan',\n\t'Leanora',\n\t'Charlena',\n\t'Claudina',\n\t'Danise',\n\t'Denell',\n\t'Eydie',\n\t'Irish',\n\t'Hydeia',\n\t'Nichele',\n\t'Ronica',\n\t'Temre',\n\t'Cindra',\n\t'Vincenta',\n\t'Zyra',\n\t'Larita',\n\t'Jodine',\n\t'Ewelina',\n\t'Madylin',\n\t'Kinzleigh',\n\t'Malone',\n\t'Layken',\n\t'Verity',\n\t'Tinleigh',\n\t'Sophi',\n\t'Skyleigh',\n\t'Stanislawa',\n\t'Rylinn',\n\t'Natalynn',\n\t'Marlei',\n\t'Rhylie',\n\t'Payslee',\n\t'Paxtyn',\n\t'Brittyn',\n\t'Alaynna',\n\t'Avory',\n\t'Aubriee',\n\t'Jacqui',\n\t'Aseel',\n\t'Jannell',\n\t'Simra',\n\t'Raneem',\n\t'Kellene',\n\t'Shellee',\n\t'Tish',\n\t'Lashauna',\n\t'Ashira',\n\t'Sharrie',\n\t'Donnette',\n\t'Milarain',\n\t'Toshia',\n\t'Shariyah',\n\t'Dariah',\n\t'Gustava',\n\t'Leotha',\n\t'Sherelle',\n\t'Lindi',\n\t'Luanna',\n\t'Shanan',\n\t'Arelys',\n\t'Nyema',\n\t'Errin',\n\t'Fredrica',\n\t'Dhriti',\n\t'Yashvi',\n\t'Gaile',\n\t'Ermalinda',\n\t'Gregorita',\n\t'Klynn',\n\t'Kaedence',\n\t'Zaila',\n\t'Yaritzi',\n\t'Taylyn',\n\t'Tailyn',\n\t'Milka',\n\t'Maesyn',\n\t'Macyn',\n\t'Riyah',\n\t'Alleigh',\n\t'Aracelli',\n\t'Hadlie',\n\t'Iza',\n\t'Riddhi',\n\t'Kathleene',\n\t'Darely',\n\t'Eleyna',\n\t'Analiya',\n\t'Fanchon',\n\t'Allyce',\n\t'Jasma',\n\t'Porschia',\n\t'Deberah',\n\t'Zoi',\n\t'Sherlyne',\n\t'Favour',\n\t'Shakari',\n\t'Mckenzy',\n\t'Makinzie',\n\t'Maahi',\n\t'Jacqualine',\n\t'Nancyann',\n\t'Ronne',\n\t'Charmane',\n\t'Martie',\n\t'Leane',\n\t'Kama',\n\t'Corrinne',\n\t'Vangie',\n\t'Jonni',\n\t'Michon',\n\t'Sharise',\n\t'Shawnie',\n\t'Joane',\n\t'Rosary',\n\t'Noretta',\n\t'Zaylynn',\n\t'Paislie',\n\t'Infinity',\n\t'Amaryllis',\n\t'Altair',\n\t'Cookie',\n\t'Danyella',\n\t'Collyns',\n\t'Chrislynn',\n\t'Bryley',\n\t'Brelynn',\n\t'Finleigh',\n\t'Evianna',\n\t'Flavia',\n\t'Wilhemina',\n\t'Jaeliana',\n\t'Taija',\n\t'Naiomi',\n\t'Jennika',\n\t'Jenika',\n\t'Jaicee',\n\t'Laurice',\n\t'Ashaunti',\n\t'Alyxandria',\n\t'Delfinia',\n\t'Tyiesha',\n\t'Petrita',\n\t'Fedelina',\n\t'Eufelia',\n\t'Marshae',\n\t'Marquesha',\n\t'Feloniz',\n\t'Tyliyah',\n\t'Nadene',\n\t'Natascha',\n\t'Shawnette',\n\t'Jamese',\n\t'Tashay',\n\t'Mckenzee',\n\t'Mckinsey',\n\t'Langley',\n\t'Kensleigh',\n\t'Karolyna',\n\t'Coralyn',\n\t'Grethel',\n\t'Baylei',\n\t'Ariany',\n\t'Mekenzie',\n\t'Whitlee',\n\t'Sayde',\n\t'Willena',\n\t'Tzipporah',\n\t'Afsana',\n\t'Kearra',\n\t'Marialy',\n\t'Quiara',\n\t'Jing',\n\t'Dorathea',\n\t'Rachelann',\n\t'Melissaann',\n\t'Jeanett',\n\t'Jensine',\n\t'Jessicaann',\n\t'Ellesse',\n\t'Kaula',\n\t'Calley',\n\t'Malkie',\n\t'Shenelle',\n\t'Sheela',\n\t'Steffi',\n\t'Shadia',\n\t'Marielis',\n\t'Saima',\n\t'Tiarah',\n\t'Reginia',\n\t'Shaquala',\n\t'Shadiamond',\n\t'Kallista',\n\t'Allee',\n\t'Allexis',\n\t'Nakeya',\n\t'Reshma',\n\t'Sosha',\n\t'Kendrea',\n\t'Imalay',\n\t'Kyong',\n\t'Sharmin',\n\t'Sorah',\n\t'Alayshia',\n\t'Katja',\n\t'Chavie',\n\t'Farzana',\n\t'Lanasia',\n\t'Khayla',\n\t'Jamella',\n\t'Diva',\n\t'Ericca',\n\t'Brettany',\n\t'Imunique',\n\t'Tiasia',\n\t'Tajae',\n\t'Sidra',\n\t'Chelbi',\n\t'Kourtni',\n\t'Lamisha',\n\t'Krystyn',\n\t'Maly',\n\t'Mirtha',\n\t'Nary',\n\t'Nuria',\n\t'Falicia',\n\t'Zilpha',\n\t'Keyasia',\n\t'Ranisha',\n\t'Garnetta',\n\t'Alexxus',\n\t'Hae',\n\t'Herma',\n\t'Tasheena',\n\t'Philicia',\n\t'Fotini',\n\t'Avanell',\n\t'Czarina',\n\t'Kindle',\n\t'Antoinet',\n\t'Constanc',\n\t'Cassondr',\n\t'Destanee',\n\t'Christinia',\n\t'Shalisa',\n\t'Stepahnie',\n\t'Sopheap',\n\t'Somaly',\n\t'Shalane',\n\t'Saran',\n\t'Alaycia',\n\t'Carolynne',\n\t'Nikolette',\n\t'Saphire',\n\t'Dominigue',\n\t'Channa',\n\t'Leva',\n\t'Starquasia',\n\t'Shyan',\n\t'Sabah',\n\t'Shakiera',\n\t'Nagely',\n\t'Hajar',\n\t'Keniya',\n\t'Anhthu',\n\t'Ashle',\n\t'Taira',\n\t'Meline',\n\t'Rebeckah',\n\t'Daritza',\n\t'Kaysha',\n\t'Kathrin',\n\t'Edit',\n\t'Jennae',\n\t'Kaja',\n\t'Molli',\n\t'Hildreth',\n\t'Elyssia',\n\t'Keandrea',\n\t'Courtlyn',\n\t'Cova',\n\t'Kyndle',\n\t'Kadisha',\n\t'Mitchelle',\n\t'Chabeli',\n\t'Ashlen',\n\t'Feiga',\n\t'Shakena',\n\t'Lakeia',\n\t'Jehan',\n\t'Karianne',\n\t'Renisha',\n\t'Crystalyn',\n\t'Blia',\n\t'Amanada',\n\t'Neiba',\n\t'Oyuki',\n\t'Lianet',\n\t'Javaria',\n\t'Praise',\n\t'Sagal',\n\t'Avaleigh',\n\t'Amoni',\n\t'Fadumo',\n\t'Debhora',\n\t'Sharol',\n\t'Sahalie',\n\t'Aleana',\n\t'Dezire',\n\t'Catalia',\n\t'Barbarann',\n\t'Raelin',\n\t'Reniyah',\n\t'Jeniyah',\n\t'Jaziya',\n\t'Wilhemenia',\n\t'Wavie',\n\t'Modestine',\n\t'Tariah',\n\t'Cathern',\n\t'Asenath',\n\t'Nakya',\n\t'Reeva',\n\t'Tkai',\n\t'Orva',\n\t'Theora',\n\t'Brookie',\n\t'Breyonna',\n\t'Ellagrace',\n\t'Kaliya',\n\t'Jemimah',\n\t'Ahna',\n\t'Zetta',\n\t'Tanyia',\n\t'Dicie',\n\t'Malasia',\n\t'Janvi',\n\t'Talaysia',\n\t'Kaybree',\n\t'Teia',\n\t'Robertha',\n\t'Tilda',\n\t'Marykatherine',\n\t'Gusta',\n\t'Gola',\n\t'Malta',\n\t'Nija',\n\t'Kaija',\n\t'Tamaria',\n\t'Chyann',\n\t'Davianna',\n\t'Gae',\n\t'Ruther',\n\t'Kennadee',\n\t'Arvella',\n\t'Ashonti',\n\t'Euphemia',\n\t'Teyanna',\n\t'Jahnya',\n\t'Jamariya',\n\t'Ceanna',\n\t'Francenia',\n\t'Charletta',\n\t'Catheryn',\n\t'Theodosia',\n\t'Magdaline',\n\t'Samariah',\n\t'Jamara',\n\t'Nehemie',\n\t'Mikenzie',\n\t'Marielys',\n\t'Keilany',\n\t'Bernardita',\n\t'Marketa',\n\t'Takya',\n\t'Frona',\n\t'Draxie',\n\t'Genell',\n\t'Celesta',\n\t'Deloria',\n\t'Sister',\n\t'Icy',\n\t'Mardi',\n\t'Florance',\n\t'Azari',\n\t'Ahmiyah',\n\t'Chaniya',\n\t'Rheda',\n\t'Kateland',\n\t'Rielle',\n\t'Kjersten',\n\t'Olivette',\n\t'Tita',\n\t'Tharon',\n\t'Briasia',\n\t'Pakou',\n\t'Raniah',\n\t'Janaria',\n\t'Jaliya',\n\t'Alexiana',\n\t'Alayja',\n\t'Ailea',\n\t'Camiya',\n\t'Versa',\n\t'Vertell',\n\t'Loyola',\n\t'Mckelle',\n\t'Ebonique',\n\t'Jaynie',\n\t'Shamiah',\n\t'Keela',\n\t'Laterrica',\n\t'Fidelia',\n\t'Annia',\n\t'Rosslyn',\n\t'Robynn',\n\t'Darlynn',\n\t'Shakiara',\n\t'Shakeira',\n\t'Olinda',\n\t'Kionna',\n\t'Annslee',\n\t'Rudine',\n\t'Teonna',\n\t'Rudene',\n\t'Latrece',\n\t'Wynette',\n\t'Damiya',\n\t'Zonnie',\n\t'Jenne',\n\t'Deeanne',\n\t'Doree',\n\t'Jennilyn',\n\t'Lari',\n\t'Lourie',\n\t'Tedi',\n\t'Deaira',\n\t'Deairra',\n\t'Fatuma',\n\t'Gearldean',\n\t'Genise',\n\t'Karlyn',\n\t'Arleta',\n\t'Alla',\n\t'Donie',\n\t'Lady',\n\t'Rheba',\n\t'Nuha',\n\t'Olita',\n\t'Elzina',\n\t'Lutricia',\n\t'Tauna',\n\t'Teasha',\n\t'Elberta',\n\t'Jeralyn',\n\t'Shaketa',\n\t'Elonda',\n\t'Lafondra',\n\t'Shelle',\n\t'Lamiya',\n\t'Lejla',\n\t'Labria',\n\t'Wessie',\n\t'Cleola',\n\t'Suad',\n\t'Andretta',\n\t'Piccola',\n\t'Jadalee',\n\t'Louanna',\n\t'Donabelle',\n\t'Shauntel',\n\t'Vannie',\n\t'Naomia',\n\t'Ludell',\n\t'Ikram',\n\t'Ariyonna',\n\t'Anaelle',\n\t'Pamila',\n\t'Scheryl',\n\t'Kandee',\n\t'Donella',\n\t'Vicie',\n\t'Tajah',\n\t'Jodeen',\n\t'Debborah',\n\t'Varvara',\n\t'Jalisha',\n\t'Paw',\n\t'Tranette',\n\t'Ruwayda',\n\t'Jeanice',\n\t'Lowana',\n\t'Curlie',\n\t'Viveca',\n\t'Tommi',\n\t'Lynnel',\n\t'Shawneen',\n\t'Tora',\n\t'Ikhlas',\n\t'Delene',\n\t'Jillyn',\n\t'Abria',\n\t'Blondine',\n\t'Katharyn',\n\t'Gini',\n\t'Lynnell',\n\t'Laurey',\n\t'Ikran',\n\t'Madell',\n\t'Dura',\n\t'Trenia',\n\t'Arsie',\n\t'Runell',\n\t'Lawan',\n\t'Georgeanna',\n\t'Nashay',\n\t'Lasha',\n\t'Michi',\n\t'Arloa',\n\t'Kazuye',\n\t'Arnette',\n\t'Morghan',\n\t'Allure',\n\t'Kiyo',\n\t'Fusaye',\n\t'Sebrena',\n\t'Kikuye',\n\t'Mykia',\n\t'Soon',\n\t'Kyung',\n\t'Maysa',\n\t'Manessa',\n\t'Ople',\n\t'Amyre',\n\t'Katera',\n\t'Danaya',\n\t'Dorothey',\n\t'Shahidah',\n\t'Soliana',\n\t'Concettina',\n\t'Delphie',\n\t'Aqueelah',\n\t'Cassadee',\n\t'Larayne',\n\t'Burnette',\n\t'Diona',\n\t'Stasha',\n\t'Sheria',\n\t'Luciel',\n\t'Anise',\n\t'Cumi',\n\t'Marillyn',\n\t'Domenique',\n\t'Sumiye',\n\t'Masaye',\n\t'Imojean',\n\t'Louetta',\n\t'Taimi',\n\t'Berdie',\n\t'Jyl',\n\t'Cyrilla',\n\t'Kearstin',\n\t'Tosca',\n\t'Billee',\n\t'Milda',\n\t'Rema',\n\t'Tyne',\n\t'Altamease',\n\t'Aleaha',\n\t'Malaina',\n\t'Jersie',\n\t'Nadyne',\n\t'Suhailah',\n\t'Reghan',\n\t'Burma',\n\t'Kamyra',\n\t'Geraldean',\n\t'Ivalee',\n\t'Waunita',\n\t'Aritza',\n\t'Madalynne',\n\t'Talaya',\n\t'Azura',\n\t'Aldonia',\n\t'Robinette',\n\t'Ameenah',\n\t'Abeer',\n\t'Yamilette',\n\t'Tanae',\n\t'Mertha',\n\t'Jamirah',\n\t'Chun',\n\t'Avayah',\n\t'Janayah',\n\t'Bena',\n\t'Mahiyah',\n\t'Karn',\n\t'Kristien',\n\t'Mikesha',\n\t'Eriel',\n\t'Kemoni',\n\t'Aziya',\n\t'Raigan',\n\t'Rissie',\n\t'Tenna',\n\t'Tambria',\n\t'Birdell',\n\t'Almena',\n\t'Jonisha',\n\t'Marcey',\n\t'Rosebud',\n\t'Lakevia',\n\t'Shateria',\n\t'Nelia',\n\t'Rilda',\n\t'Doshie',\n\t'Onzell',\n\t'Safiyyah',\n\t'Lorilee',\n\t'Shiane',\n\t'Gauri',\n\t'Ashiya',\n\t'Yaileen',\n\t'Vendetta',\n\t'Margaretmary',\n\t'Telisa',\n\t'Imogean',\n\t'Sheryn',\n\t'Nance',\n\t'Mariette',\n\t'Keerthana',\n\t'Rosellen',\n\t'Michelene',\n\t'Kamrie',\n\t'Mayci',\n\t'Jerzi',\n\t'Vermelle',\n\t'Tondra',\n\t'Dorethea',\n\t'Wannetta',\n\t'Tilly',\n\t'Brightyn',\n\t'Patt',\n\t'Lynae',\n\t'Willo',\n\t'Cloma',\n\t'Yailyn',\n\t'Takeria',\n\t'Janyiah',\n\t'Rasheema',\n\t'Nafeesa',\n\t'Rosene',\n\t'Kellianne',\n\t'Taccara',\n\t'Quanda',\n\t'Patsie',\n\t'Chaquita',\n\t'Shakelia',\n\t'Guerline',\n\t'Tashika',\n\t'Taneesha',\n\t'Fatme',\n\t'Marliss',\n\t'Hye',\n\t'Marjo',\n\t'Meggie',\n\t'Maye',\n\t'Walline',\n\t'Dodi',\n\t'Kristyna',\n\t'Aliyyah',\n\t'Latravia',\n\t'Diania',\n\t'Elta',\n\t'Oralee',\n\t'Nikkita',\n\t'Rasha',\n\t'Sharena',\n\t'Tecora',\n\t'Pluma',\n\t'Ovell',\n\t'Keeya',\n\t'Dayja',\n\t'Sherrian',\n\t'Jinnie',\n\t'Ekta',\n\t'Javonda',\n\t'Shantrice',\n\t'Dava',\n\t'Kimbley',\n\t'Lafonda',\n\t'Lasonja',\n\t'Hiilani',\n\t'Danay',\n\t'Avree',\n\t'Kelliann',\n\t'Keasha',\n\t'Kimmarie',\n\t'Jannely',\n\t'Manasi',\n\t'Moncerat',\n\t'Miyu',\n\t'Jullianna',\n\t'Joelene',\n\t'Ynez',\n\t'Yazmeen',\n\t'Yasamin',\n\t'Syann',\n\t'Surena',\n\t'Tresia',\n\t'Trecia',\n\t'Sonjia',\n\t'Hokulani',\n\t'Amarilys',\n\t'Bethzaida',\n\t'Noraida',\n\t'Dietra',\n\t'Nealie',\n\t'Charice',\n\t'Alicea',\n\t'Jozie',\n\t'Delzora',\n\t'Jordis',\n\t'Jolett',\n\t'Kahlen',\n\t'Kallee',\n\t'Natilee',\n\t'Pecolia',\n\t'Iyari',\n\t'Shandrell',\n\t'Quintella',\n\t'Monchel',\n\t'Tysha',\n\t'Vanetta',\n\t'Shawneequa',\n\t'Odesser',\n\t'Lareina',\n\t'Jannifer',\n\t'Kinya',\n\t'Lateesha',\n\t'Dvora',\n\t'Katrin',\n\t'Denene',\n\t'Diondra',\n\t'Ciclali',\n\t'Sula',\n\t'Talena',\n\t'Afrika',\n\t'Cheron',\n\t'Emireth',\n\t'Cadee',\n\t'Jlyn',\n\t'Jermya',\n\t'Alyia',\n\t'Sitlali',\n\t'Sissy',\n\t'Felita',\n\t'Kerith',\n\t'Wendolyn',\n\t'Chaundra',\n\t'Angle',\n\t'Gladies',\n\t'Meygan',\n\t'Sereniti',\n\t'Saryn',\n\t'Vielka',\n\t'Tirzah',\n\t'Lynnmarie',\n\t'Lisanne',\n\t'Yliana',\n\t'Yamilett',\n\t'Keyoka',\n\t'Laquanta',\n\t'Teneshia',\n\t'Trenna',\n\t'Veronda',\n\t'Fronie',\n\t'Carlette',\n\t'Lanetta',\n\t'Raynelle',\n\t'Tianne',\n\t'Siria',\n\t'Mayda',\n\t'Lorien',\n\t'Celica',\n\t'Tabbitha',\n\t'Kayanna',\n\t'Julitza',\n\t'Kylia',\n\t'Heavenlee',\n\t'Nikka',\n\t'Rachana',\n\t'Mekenna',\n\t'Maritere',\n\t'Ai',\n\t'Angelisa',\n\t'Anysa',\n\t'Basia',\n\t'Ilka',\n\t'Geanine',\n\t'Kedra',\n\t'Caila',\n\t'Deysy',\n\t'Emilyann',\n\t'Samera',\n\t'Mackinzie',\n\t'Lynzie',\n\t'Akela',\n\t'Navpreet',\n\t'Reylene',\n\t'Reyanna',\n\t'Kathlynn',\n\t'Kiaira',\n\t'Guiselle',\n\t'Brinn',\n\t'Jerelyn',\n\t'Lorel',\n\t'Alandra',\n\t'Ardyth',\n\t'Kloee',\n\t'Mellody',\n\t'Carlisa',\n\t'Martinique',\n\t'Damali',\n\t'Cassandre',\n\t'Ivanelle',\n\t'Janaan',\n\t'Shontay',\n\t'Tamieka',\n\t'Tashema',\n\t'Irmalinda',\n\t'Tayna',\n\t'Berdena',\n\t'Janika',\n\t'Shauntay',\n\t'Nikea',\n\t'Ekaterini',\n\t'Glendaly',\n\t'Vernee',\n\t'Kang',\n\t'Candise',\n\t'Jamica',\n\t'Andera',\n\t'Katheleen',\n\t'Annagrace',\n\t'Bradleigh',\n\t'Kissy',\n\t'Lachandra',\n\t'Tamikia',\n\t'Shevon',\n\t'Wardean',\n\t'Betina',\n\t'Marcee',\n\t'Evia',\n\t'Carry',\n\t'Marica',\n\t'Tiwana',\n\t'Stacye',\n\t'Theressa',\n\t'Torsha',\n\t'Allayna',\n\t'Betania',\n\t'Berania',\n\t'Claryssa',\n\t'Clarise',\n\t'Cassidi',\n\t'Mehana',\n\t'Janella',\n\t'Mackenzy',\n\t'Kaeleigh',\n\t'Sanoe',\n\t'Neysa',\n\t'Shawntee',\n\t'Shannah',\n\t'Tihani',\n\t'Willye',\n\t'Zalma',\n\t'Serrina',\n\t'Shealyn',\n\t'Hiiaka',\n\t'Jeselle',\n\t'Mitsy',\n\t'Kela',\n\t'Aquila',\n\t'Marikay',\n\t'Christella',\n\t'Tameria',\n\t'Ebelina',\n\t'Maricar',\n\t'Shalimar',\n\t'Yanin',\n\t'Xuan',\n\t'Tifany',\n\t'Thy',\n\t'Quynh',\n\t'Shronda',\n\t'Kysha',\n\t'Lular',\n\t'Danee',\n\t'Christyna',\n\t'Antonieta',\n\t'Chara',\n\t'Bich',\n\t'Tishana',\n\t'Sophy',\n\t'Shoshanna',\n\t'Adrea',\n\t'Lavaun',\n\t'Keryn',\n\t'Okema',\n\t'Njeri',\n\t'Ashaki',\n\t'Alegra',\n\t'Anapatricia',\n\t'Terena',\n\t'Tuere',\n\t'Ensley',\n\t'Geraline',\n\t'Corrinna',\n\t'Carlye',\n\t'Dawnielle',\n\t'Fancy',\n\t'Akiba',\n\t'Korrie',\n\t'Lavita',\n\t'Chisa',\n\t'Lakishia',\n\t'Mandisa',\n\t'Lalita',\n\t'Sakeena',\n\t'Noami',\n\t'Olivea',\n\t'Lucilla',\n\t'Marialuiza',\n\t'Radonna',\n\t'Magaline',\n\t'Minda',\n\t'Annah',\n\t'Mitsuyo',\n\t'Kameko',\n\t'Miyako',\n\t'Satsuki',\n\t'Hatsuyo',\n\t'Aimie',\n\t'Jalexis',\n\t'Haruyo',\n\t'Tokiko',\n\t'Matsuyo',\n\t'Myiah',\n\t'Natalye',\n\t'Priseis',\n\t'Yeraldi',\n\t'Natsue',\n\t'Nobue',\n\t'Zyria',\n\t'Tierany',\n\t'Samyia',\n\t'Rhema',\n\t'Chiyo',\n\t'Lailoni',\n\t'Momoka',\n\t'Miku',\n\t'Havanna',\n\t'Izela',\n\t'Kendy',\n\t'Rashanda',\n\t'Aleysha',\n\t'Sherlita',\n\t'Tamana',\n\t'Kikuyo',\n\t'Tapanga',\n\t'Shauntell',\n\t'Adithi',\n\t'Chiamaka',\n\t'Devika',\n\t'Angy',\n\t'Arwyn',\n\t'Aparna',\n\t'Anneka',\n\t'Betzayra',\n\t'Analuiza',\n\t'Blondie',\n\t'October',\n\t'Yarexi',\n\t'Yarethzi',\n\t'Annaclaire',\n\t'Rosabel',\n\t'Jerlene',\n\t'Clelia',\n\t'Jatara',\n\t'Anzley',\n\t'Zamaya',\n\t'Venera',\n\t'Kalleigh',\n\t'Jaylynne',\n\t'Kaylor',\n\t'Milli',\n\t'Nelsy',\n\t'Laycee',\n\t'Arayah',\n\t'Betzabe',\n\t'Bethzi',\n\t'Haidy',\n\t'Chayla',\n\t'Elizah',\n\t'Evoleth',\n\t'Edyn',\n\t'Cyniah',\n\t'December',\n\t'Amerika',\n\t'Analea',\n\t'Ayshia',\n\t'Alauna',\n\t'Shamica',\n\t'Peaches',\n\t'Shenee',\n\t'Letecia',\n\t'Arminda',\n\t'Yolander',\n\t'Amariona',\n\t'Kaithlyn',\n\t'Jasiya',\n\t'Niharika',\n\t'Sareena',\n\t'Maryana',\n\t'Melanye',\n\t'Solei',\n\t'Suhey',\n\t'Soyla',\n\t'Koral',\n\t'Lilee',\n\t'Mercede',\n\t'Pennye',\n\t'Yumeka',\n\t'Mazel',\n\t'Vani',\n\t'Pattiann',\n\t'Shirell',\n\t'Carmencita',\n\t'Delayla',\n\t'Hailyn',\n\t'Brena',\n\t'Daana',\n\t'Lenise',\n\t'Ryhanna',\n\t'Lorely',\n\t'Tiannah',\n\t'Zabdi',\n\t'Kammy',\n\t'Josslynn',\n\t'Keilee',\n\t'Kamrynn',\n\t'Itza',\n\t'Jaidy',\n\t'Cherly',\n\t'Ladeana',\n\t'Memory',\n\t'Maresa',\n\t'Shauntae',\n\t'Risha',\n\t'Ilisa',\n\t'Debraann',\n\t'Gavriela',\n\t'Jenai',\n\t'Suzzette',\n\t'Mailani',\n\t'Leiloni',\n\t'Manasa',\n\t'Malin',\n\t'Faythe',\n\t'Haylei',\n\t'Haili',\n\t'Gwenivere',\n\t'Jamilette',\n\t'Naydeline',\n\t'Sakshi',\n\t'Nayda',\n\t'Nuala',\n\t'Chelsae',\n\t'Berenize',\n\t'Bahar',\n\t'Arpi',\n\t'Tearra',\n\t'Metta',\n\t'Lethia',\n\t'Akanksha',\n\t'Danine',\n\t'Alayne',\n\t'Jeanann',\n\t'Loyda',\n\t'Yamna',\n\t'Marsela',\n\t'Jolinda',\n\t'Leina',\n\t'Mariane',\n\t'Kaydince',\n\t'Etsuko',\n\t'Tinika',\n\t'Lashona',\n\t'Chidinma',\n\t'Jazell',\n\t'Derenda',\n\t'Cylinda',\n\t'Amaiah',\n\t'Alyzza',\n\t'Abbygayle',\n\t'Tashae',\n\t'Tesa',\n\t'Sarra',\n\t'Tanasha',\n\t'Latoy',\n\t'Dawnell',\n\t'Corinn',\n\t'Charmain',\n\t'Odetta',\n\t'Kimiya',\n\t'Kiaya',\n\t'Mairin',\n\t'Maelani',\n\t'Halena',\n\t'Dorianne',\n\t'Ilia',\n\t'Cheyenna',\n\t'Noora',\n\t'Nareh',\n\t'Namrata',\n\t'Sholanda',\n\t'Sita',\n\t'Dunia',\n\t'Betzayda',\n\t'Analissa',\n\t'Amulya',\n\t'Annaka',\n\t'Anneth',\n\t'Anaalicia',\n\t'Noemie',\n\t'Leni',\n\t'Robyne',\n\t'Skyleen',\n\t'Tiphanie',\n\t'Belmira',\n\t'Francelina',\n\t'Kreindy',\n\t'Kiri',\n\t'Kristena',\n\t'Lawren',\n\t'Christyn',\n\t'Deicy',\n\t'Hollyann',\n\t'Jamela',\n\t'Eriko',\n\t'Sotheary',\n\t'Lekeshia',\n\t'Onica',\n\t'Micole',\n\t'Marlisa',\n\t'Aqsa',\n\t'Bayla',\n\t'Abigal',\n\t'Charny',\n\t'Shaquira',\n\t'Rabab',\n\t'Yasemin',\n\t'Keishla',\n\t'Donasia',\n\t'Ellamarie',\n\t'Darianny',\n\t'Dahiana',\n\t'Areeba',\n\t'Shaquasha',\n\t'Oneisha',\n\t'Daicy',\n\t'Karem',\n\t'Kymberlee',\n\t'Kayleena',\n\t'Katryna',\n\t'Jessicamae',\n\t'Gessica',\n\t'Jameela',\n\t'Janele',\n\t'Naylani',\n\t'Anagabriela',\n\t'Andraya',\n\t'Andreanna',\n\t'Artavia',\n\t'Alexanderia',\n\t'Laporche',\n\t'Laporsche',\n\t'Folasade',\n\t'Kirandeep',\n\t'Davia',\n\t'Davona',\n\t'Darbi',\n\t'Baylea',\n\t'Sylwia',\n\t'Glendy',\n\t'Ivet',\n\t'Fritzi',\n\t'Lusero',\n\t'Marlayna',\n\t'Marlissa',\n\t'Leanny',\n\t'Duaa',\n\t'Ruchama',\n\t'Orli',\n\t'Nabeeha',\n\t'Maurissa',\n\t'Shevawn',\n\t'Shauni',\n\t'Shellby',\n\t'Sindi',\n\t'Taralyn',\n\t'Tanzania',\n\t'Sinthia',\n\t'Ondrea',\n\t'Nhu',\n\t'Narine',\n\t'Naly',\n\t'Yanett',\n\t'Temmy',\n\t'Manar',\n\t'Maimuna',\n\t'Arielys',\n\t'Dalya',\n\t'Allyse',\n\t'Mariateresa',\n\t'Mariade',\n\t'Lashea',\n\t'Kimberlyann',\n\t'Cyntia',\n\t'Cystal',\n\t'Elisse',\n\t'Tonimarie',\n\t'Nashalie',\n\t'Shatasia',\n\t'Teigan',\n\t'Muntaha',\n\t'Zlata',\n\t'Zehra',\n\t'Shaterra',\n\t'Leeya',\n\t'Keysi',\n\t'Christabel',\n\t'Alfrieda',\n\t'Mehgan',\n\t'Hyacinth',\n\t'Shley',\n\t'Caterin',\n\t'Darnesha',\n\t'Amaranta',\n\t'Jazzmen',\n\t'Kelia',\n\t'Kassy',\n\t'Grasiela',\n\t'Sheindy',\n\t'Yenty',\n\t'Tahani',\n\t'Umme',\n\t'Mayla',\n\t'Maryon',\n\t'Kiyanna',\n\t'Dezeray',\n\t'Macaela',\n\t'Nalley',\n\t'Mikeisha',\n\t'Sylvana',\n\t'Smantha',\n\t'Virdiana',\n\t'Afiya',\n\t'Chanise',\n\t'Glorimar',\n\t'Hui',\n\t'Hendel',\n\t'Junia',\n\t'Gioia',\n\t'Elene',\n\t'Dorothie',\n\t'Elynor',\n\t'Mercades',\n\t'Arfa',\n\t'Abiha',\n\t'Aayat',\n\t'Amarianna',\n\t'Raynisha',\n\t'Pahola',\n\t'Sarin',\n\t'Marixa',\n\t'Shavonna',\n\t'Tannya',\n\t'Tijera',\n\t'Girtha',\n\t'Tameko',\n\t'Caresse',\n\t'Bernyce',\n\t'Allisha',\n\t'Branda',\n\t'Jahmya',\n\t'Haleema',\n\t'Hodaya',\n\t'Samina',\n\t'Sheva',\n\t'Theadora',\n\t'Skylyn',\n\t'Razan',\n\t'Somalia',\n\t'Thalya',\n\t'Quadasia',\n\t'Yanil',\n\t'Arabia',\n\t'Edina',\n\t'Briyanna',\n\t'Verdia',\n\t'Sehar',\n\t'Naama',\n\t'Timberly',\n\t'Reann',\n\t'Narissa',\n\t'Maggy',\n\t'Marriah',\n\t'Joua',\n\t'Kellsie',\n\t'Kelcy',\n\t'Evonna',\n\t'Jacqueleen',\n\t'Xee',\n\t'Zaynah',\n\t'Janique',\n\t'Jailin',\n\t'Aniqa',\n\t'Melana',\n\t'Mariame',\n\t'Aundria',\n\t'Anacaren',\n\t'Anahid',\n\t'Jassmine',\n\t'Keoshia',\n\t'Keyera',\n\t'Delmi',\n\t'Briselda',\n\t'Carlisha',\n\t'Brittnei',\n\t'Clarrisa',\n\t'Dezerae',\n\t'Banessa',\n\t'Ariele',\n\t'Cherrell',\n\t'Daissy',\n\t'Cecila',\n\t'Jady',\n\t'Kristelle',\n\t'Kristinamarie',\n\t'Korinna',\n\t'Kortnee',\n\t'Jasimine',\n\t'Jahnay',\n\t'Farhana',\n\t'Shaliyah',\n\t'Nemesis',\n\t'Shakerria',\n\t'Phoua',\n\t'Carylon',\n\t'Ironesha',\n\t'Lariza',\n\t'Anesa',\n\t'Elantra',\n\t'Deandria',\n\t'Denecia',\n\t'Chelsia',\n\t'Teighlor',\n\t'Suzannah',\n\t'Zelene',\n\t'Zeena',\n\t'Catriona',\n\t'Tamarra',\n\t'Tannaz',\n\t'Titiana',\n\t'Briany',\n\t'Lyana',\n\t'Maytal',\n\t'Antanasia',\n\t'Kierston',\n\t'Dashia',\n\t'Ismenia',\n\t'Annessa',\n\t'Carolena',\n\t'Miasia',\n\t'Mikhaila',\n\t'Lamiracle',\n\t'Kassey',\n\t'Markeshia',\n\t'Hilarie',\n\t'Necha',\n\t'Ziara',\n\t'Jahniyah',\n\t'Safiyah',\n\t'Tanaisha',\n\t'Shamyra',\n\t'Laportia',\n\t'Shavy',\n\t'Viktoriya',\n\t'Khrystyne',\n\t'Kristyne',\n\t'Juanisha',\n\t'Jerrika',\n\t'Channelle',\n\t'Jacquiline',\n\t'Rakia',\n\t'Tamarah',\n\t'Sarha',\n\t'Mishelle',\n\t'Nastasha',\n\t'Acadia',\n\t'Brittiney',\n\t'Mickaela',\n\t'Natavia',\n\t'Seryna',\n\t'Ardene',\n\t'Special',\n\t'Simranjit',\n\t'Marivi',\n\t'Natassja',\n\t'Neira',\n\t'Nikkie',\n\t'Asiana',\n\t'Dazhane',\n\t'Channell',\n\t'Adryana',\n\t'Mariluz',\n\t'Dajia',\n\t'Breigh',\n\t'Zelpha',\n\t'Lataya',\n\t'Glenny',\n\t'Sharene',\n\t'Shaguana',\n\t'Henrine',\n\t'Camesha',\n\t'Birdia',\n\t'Dynisha',\n\t'Sherina',\n\t'Ayde',\n\t'Danille',\n\t'Charday',\n\t'Almadelia',\n\t'Larena',\n\t'Charlestine',\n\t'Suellyn',\n\t'Marry',\n\t'Constantina',\n\t'Tandi',\n\t'Lacretia',\n\t'Noralba',\n\t'Latresha',\n\t'Latacha',\n\t'Talynn',\n\t'Rox',\n\t'Chasey',\n\t'Nyia',\n\t'Alyissa',\n\t'Karilyn',\n\t'Shevonne',\n\t'Genny',\n\t'Tamicka',\n\t'Doneisha',\n\t'Cyrena',\n\t'Daisia',\n\t'Ravina',\n\t'Berdia',\n\t'Aneesha',\n\t'Vashti',\n\t'Latrica',\n\t'Kennetha',\n\t'Aarti',\n\t'Raiza',\n\t'Elspeth',\n\t'Kyleen',\n\t'Ronika',\n\t'Lyndsy',\n\t'Jone',\n\t'Chanta',\n\t'Serita',\n\t'Margree',\n\t'Ruthel',\n\t'Ruthella',\n\t'Breunna',\n\t'Cyann',\n\t'Atlanta',\n\t'Danniela',\n\t'Junita',\n\t'Floella',\n\t'Brittane',\n\t'Avanelle',\n\t'Priscill',\n\t'Luvina',\n\t'Jeneva',\n\t'Teretha',\n\t'Clarita',\n\t'Ilce',\n\t'Jacqualyn',\n\t'Justene',\n\t'Daysia',\n\t'Taylore',\n\t'Sadi',\n\t'Verenis',\n\t'Shyenne',\n\t'Toriana',\n\t'Alvira',\n\t'Kalah',\n\t'Rajanee',\n\t'Reonna',\n\t'Mariadelaluz',\n\t'Mychaela',\n\t'Charnele',\n\t'Aeisha',\n\t'Shaquaya',\n\t'Shaakira',\n\t'Tayana',\n\t'Cozetta',\n\t'Kensey',\n\t'Jazsmin',\n\t'Kaitlyne',\n\t'Hollye',\n\t'Lavren',\n\t'Sarit',\n\t'Shanieka',\n\t'Margorie',\n\t'Virgene',\n\t'Dannia',\n\t'Clorissa',\n\t'Breahna',\n\t'Rayla',\n\t'Dellanira',\n\t'Megen',\n\t'Matalie',\n\t'Taraneh',\n\t'Teila',\n\t'Etter',\n\t'Cheetara',\n\t'Shetara',\n\t'Jamielee',\n\t'Kariann',\n\t'Karess',\n\t'Bea',\n\t'Leyda',\n\t'Misa',\n\t'Mareena',\n\t'Maisee',\n\t'Yvonna',\n\t'Yocelyne',\n\t'Yilda',\n\t'Sabrinna',\n\t'Sirenia',\n\t'Tyriel',\n\t'Darrielle',\n\t'Siedah',\n\t'Yuko',\n\t'Stevee',\n\t'Chrystle',\n\t'Shaterrica',\n\t'Janyll',\n\t'Evelisse',\n\t'Belkis',\n\t'Renesmae',\n\t'Sahily',\n\t'Zurie',\n\t'Edelia',\n\t'Sequoya',\n\t'Waldine',\n\t'Marinell',\n\t'Moya',\n\t'Lavenia',\n\t'Liboria',\n\t'Meliah',\n\t'Meliyah',\n\t'Mio',\n\t'Xitllali',\n\t'Nare',\n\t'Oliviah',\n\t'Mayrani',\n\t'Sravya',\n\t'Valeska',\n\t'Riona',\n\t'Lashaundra',\n\t'Phebe',\n\t'Yeira',\n\t'Zarai',\n\t'Ayanah',\n\t'Kriti',\n\t'Kaileah',\n\t'Donata',\n\t'Jenavee',\n\t'Daphnee',\n\t'Gurneet',\n\t'Emmalie',\n\t'Rowrenia',\n\t'Haisley',\n\t'Harbor',\n\t'Arilyn',\n\t'Aubrii',\n\t'Avielle',\n\t'Avyn',\n\t'Bethenny',\n\t'Arienne',\n\t'Anyeli',\n\t'Brilyn',\n\t'Cataleyah',\n\t'Chisom',\n\t'Dalis',\n\t'Malaiya',\n\t'Meela',\n\t'Karsynn',\n\t'Kaselyn',\n\t'Kashlyn',\n\t'Amorette',\n\t'Lenita',\n\t'Adabelle',\n\t'Allisyn',\n\t'Alyzah',\n\t'Aaralynn',\n\t'Avyanna',\n\t'Aylinn',\n\t'Bexley',\n\t'Blakeleigh',\n\t'Caeli',\n\t'Chizaram',\n\t'Avriana',\n\t'Clarity',\n\t'Juanelle',\n\t'Jerelene',\n\t'Eluteria',\n\t'Lamerle',\n\t'Aletheia',\n\t'Abrie',\n\t'Adelie',\n\t'Elleigh',\n\t'Emmelyn',\n\t'Emsley',\n\t'Everlynn',\n\t'Galileah',\n\t'Derrica',\n\t'Keondria',\n\t'Keneshia',\n\t'Amberley',\n\t'Valkyrie',\n\t'Yazleemar',\n\t'Maybree',\n\t'Shloka',\n\t'Neah',\n\t'Oluwatomisin',\n\t'Saydi',\n\t'Jessalynn',\n\t'Katalaya',\n\t'Katniss',\n\t'Kendalynn',\n\t'Davionna',\n\t'Mercie',\n\t'Danett',\n\t'Deetya',\n\t'Dilynn',\n\t'Dunya',\n\t'Camyla',\n\t'Elliotte',\n\t'Ivee',\n\t'Jadie',\n\t'Kyleah',\n\t'Laelani',\n\t'Mileah',\n\t'Nalanie',\n\t'Nixie',\n\t'Oviya',\n\t'Lakecia',\n\t'Sharnae',\n\t'Abbagail',\n\t'Derica',\n\t'Truly',\n\t'Tvisha',\n\t'Vedika',\n\t'Xiclaly',\n\t'Syra',\n\t'Idamae',\n\t'Dashanti',\n\t'Neita',\n\t'Siona',\n\t'Jourdyn',\n\t'Analyn',\n\t'Shamiracle',\n\t'Daylene',\n\t'Kadeesha',\n\t'Malgorzata',\n\t'Dashay',\n\t'Else',\n\t'Pixie',\n\t'Myleah',\n\t'Myleen',\n\t'Nadiah',\n\t'Sadhana',\n\t'Samai',\n\t'Seraphine',\n\t'Sereen',\n\t'Sharanya',\n\t'Simar',\n\t'Mahlia',\n\t'Inika',\n\t'Jennavieve',\n\t'Genevy',\n\t'Harshita',\n\t'Hennessey',\n\t'Zari',\n\t'Jamiracle',\n\t'Loveta',\n\t'Coleta',\n\t'Adabella',\n\t'Alesana',\n\t'Brinleigh',\n\t'Azlyn',\n\t'Braelee',\n\t'Shaquila',\n\t'Shanyia',\n\t'Jamilia',\n\t'Corlis',\n\t'Dulcie',\n\t'Desha',\n\t'Timya',\n\t'Rakiya',\n\t'Tyliah',\n\t'Taura',\n\t'Terasha',\n\t'Gaynel',\n\t'Roylene',\n\t'Janecia',\n\t'Alonda',\n\t'Tyneisha',\n\t'Fleurette',\n\t'Mayleigh',\n\t'Meklit',\n\t'Sarenity',\n\t'Gulianna',\n\t'Itzayanna',\n\t'Ivyana',\n\t'Jazmynn',\n\t'Esmie',\n\t'Favor',\n\t'Kimbella',\n\t'Shanavia',\n\t'Yaritzel',\n\t'Daun',\n\t'Tykerria',\n\t'Antoria',\n\t'Shykemmia',\n\t'Remona',\n\t'Lucrezia',\n\t'Cicily',\n\t'Aradhya',\n\t'Esmae',\n\t'Evah',\n\t'Jhene',\n\t'Katalia',\n\t'Cyrine',\n\t'Delayza',\n\t'Eleonor',\n\t'Arohi',\n\t'Aseneth',\n\t'Avarose',\n\t'Caia',\n\t'Hulene',\n\t'Valera',\n\t'Nasaria',\n\t'Makesha',\n\t'Zera',\n\t'Aahna',\n\t'Aariyah',\n\t'Aashvi',\n\t'Adalene',\n\t'Annaliyah',\n\t'Aira',\n\t'Alaska',\n\t'Amila',\n\t'Amour',\n\t'Kaylinn',\n\t'Isidora',\n\t'Marija',\n\t'Suha',\n\t'Marigold',\n\t'Mayzie',\n\t'Liesel',\n\t'Darielle',\n\t'Sapphira',\n\t'Scotland',\n\t'Serah',\n\t'Srinika',\n\t'Novah',\n\t'Primrose',\n\t'Latresa',\n\t'Theia',\n\t'Alleen',\n\t'Agness',\n\t'Estanislada',\n\t'Ellouise',\n\t'Emilija',\n\t'Glynnis',\n\t'Paulene',\n\t'Wilna',\n\t'Maedell',\n\t'Lometa',\n\t'Cressie',\n\t'Allyne',\n\t'Calleen',\n\t'Joaquina',\n\t'Lashelle',\n\t'Modene',\n\t'Jonie',\n\t'Minta',\n\t'Milady',\n\t'Jearlene',\n\t'Rithika',\n\t'Simrat',\n\t'Vonzella',\n\t'Venna',\n\t'Pabla',\n\t'Benilde',\n\t'Eniya',\n\t'Shakendra',\n\t'Ailen',\n\t'Aina',\n\t'Marionna',\n\t'Millette',\n\t'Emiyah',\n\t'Kayloni',\n\t'Keerat',\n\t'Keeva',\n\t'Lailany',\n\t'Mishka',\n\t'Naevia',\n\t'Nathania',\n\t'Nyari',\n\t'Jayah',\n\t'Kaavya',\n\t'Frankee',\n\t'Anahita',\n\t'Anella',\n\t'Elizabella',\n\t'Damara',\n\t'Juaquina',\n\t'Gracia',\n\t'Rozalyn',\n\t'Ruhani',\n\t'Novalie',\n\t'Mialani',\n\t'Minka',\n\t'Nessa',\n\t'Sissi',\n\t'Sitara',\n\t'Jaynee',\n\t'Jeyla',\n\t'Gizzelle',\n\t'Maila',\n\t'Maizy',\n\t'Lamaya',\n\t'Katalea',\n\t'Khamila',\n\t'Shekita',\n\t'Chinita',\n\t'Anshika',\n\t'Aerabella',\n\t'Azelia',\n\t'Cici',\n\t'Daleyssa',\n\t'Divinity',\n\t'Fermina',\n\t'Murline',\n\t'Mattye',\n\t'Devra',\n\t'Jakya',\n\t'Santresa',\n\t'Larene',\n\t'Deola',\n\t'Liliann',\n\t'Lexxi',\n\t'Kamori',\n\t'Myonna',\n\t'Yitzel',\n\t'Lindalee',\n\t'Tira',\n\t'Mairyn',\n\t'Riyana',\n\t'Shaleen',\n\t'Rhyleigh',\n\t'Fleeta',\n\t'Gabrielly',\n\t'Deajah',\n\t'Yarielis',\n\t'Arelie',\n\t'Amore',\n\t'Sacoria',\n\t'Hedda',\n\t'Wanza',\n\t'Janyth',\n\t'Yaslin',\n\t'Brianah',\n\t'Anyelin',\n\t'Shayleigh',\n\t'Lace',\n\t'Kurstin',\n\t'Zakhia',\n\t'Charvi',\n\t'Raylie',\n\t'Nyellie',\n\t'Natalyn',\n\t'Libra',\n\t'Khianna',\n\t'Jolena',\n\t'Genevive',\n\t'Jadine',\n\t'Deniya',\n\t'Madysin',\n\t'Porchia',\n\t'Layleen',\n\t'Kemiya',\n\t'Donesha',\n\t'Jewelene',\n\t'Sakari',\n\t'Narely',\n\t'Maylyn',\n\t'Halina',\n\t'Nelli',\n\t'Myangel',\n\t'British',\n\t'Adore',\n\t'Alainah',\n\t'Shadonna',\n\t'Aminta',\n\t'Marolyn',\n\t'Jalea',\n\t'Breelynn',\n\t'Carah',\n\t'Sagrario',\n\t'Akyra',\n\t'Kailei',\n\t'Kenza',\n\t'Renette',\n\t'Joanann',\n\t'Solimar',\n\t'Semira',\n\t'Harneet',\n\t'Jahayra',\n\t'Evanny',\n\t'Gyzelle',\n\t'Nathalee',\n\t'Dalphine',\n\t'Mane',\n\t'Merelyn',\n\t'Kayliana',\n\t'Aubryn',\n\t'Brooklyne',\n\t'Kimari',\n\t'Dandra',\n\t'Cilia',\n\t'Laren',\n\t'Denetra',\n\t'Kandise',\n\t'Makynli',\n\t'Janan',\n\t'Rosalea',\n\t'Ludean',\n\t'Syndey',\n\t'Shaney',\n\t'Vannary',\n\t'Reynalda',\n\t'Rainee',\n\t'Trishia',\n\t'Kirbie',\n\t'Kristyl',\n\t'Lynzi',\n\t'Shardai',\n\t'Yaricza',\n\t'Tarina',\n\t'Lynley',\n\t'Maniah',\n\t'Arcilia',\n\t'Keaundra',\n\t'Karrigan',\n\t'Madeliene',\n\t'Lessley',\n\t'Laurynn',\n\t'Ragen',\n\t'Essance',\n\t'Celsey',\n\t'Caitlen',\n\t'Dulse',\n\t'Sulamita',\n\t'Evlyn',\n\t'Dorace',\n\t'Marciana',\n\t'Tenecia',\n\t'Natarsha',\n\t'Analiza',\n\t'Ladene',\n\t'Tatumn',\n\t'Maricsa',\n\t'Lysa',\n\t'Leydi',\n\t'Limayri',\n\t'Rebbeca',\n\t'Amreen',\n\t'Saina',\n\t'Remedy',\n\t'Rael',\n\t'Nami',\n\t'Nalini',\n\t'Naiyah',\n\t'Moxie',\n\t'Olina',\n\t'Whitni',\n\t'Dayannara',\n\t'Diara',\n\t'Arma',\n\t'Giorgia',\n\t'Evee',\n\t'Bricia',\n\t'Brizeyda',\n\t'Chihiro',\n\t'Ayram',\n\t'Ayushi',\n\t'Isolde',\n\t'Husna',\n\t'Khrystal',\n\t'Kriston',\n\t'Raylena',\n\t'Porschea',\n\t'Samanthia',\n\t'Mylinda',\n\t'Ginelle',\n\t'Coreena',\n\t'Aryel',\n\t'Mallary',\n\t'Maciel',\n\t'Kursten',\n\t'Leandrea',\n\t'Mackensie',\n\t'Camri',\n\t'Itzamara',\n\t'Aryiah',\n\t'Alayssa',\n\t'Andreah',\n\t'Anberlin',\n\t'Amrie',\n\t'Breah',\n\t'Ryane',\n\t'Tonna',\n\t'Valisa',\n\t'Adryanna',\n\t'Ajia',\n\t'Robynne',\n\t'Brystal',\n\t'Brylynn',\n\t'Kaleigha',\n\t'Danyka',\n\t'Dannica',\n\t'Caylen',\n\t'Jonier',\n\t'Ruthy',\n\t'Mada',\n\t'Vaida',\n\t'Yeila',\n\t'Zoelle',\n\t'Elzora',\n\t'Samreen',\n\t'Seylah',\n\t'Sayla',\n\t'Allina',\n\t'Stellarose',\n\t'Starlett',\n\t'Simrit',\n\t'Shina',\n\t'Bernestine',\n\t'Tranisha',\n\t'Tiffanyann',\n\t'Adamarys',\n\t'Tylyn',\n\t'Shahrzad',\n\t'Addisson',\n\t'Aeriana',\n\t'Alaiya',\n\t'Anni',\n\t'Ariely',\n\t'Anvika',\n\t'Aneya',\n\t'Bani',\n\t'Ayame',\n\t'Ayaka',\n\t'Aviella',\n\t'Alabama',\n\t'Adalyne',\n\t'Teresea',\n\t'Ishana',\n\t'Hargun',\n\t'Jasnoor',\n\t'Deby',\n\t'Dannelle',\n\t'Swetha',\n\t'Catherina',\n\t'Bridgitt',\n\t'Birgit',\n\t'Calisi',\n\t'Defne',\n\t'Delsa',\n\t'Demiyah',\n\t'Cataleah',\n\t'Icel',\n\t'Ixel',\n\t'Jazman',\n\t'Jessicamarie',\n\t'Desaree',\n\t'Chika',\n\t'Estephani',\n\t'Dilcia',\n\t'Dartha',\n\t'Lesieli',\n\t'Breyona',\n\t'Waynette',\n\t'Verma',\n\t'Calletana',\n\t'Cherisa',\n\t'Casara',\n\t'Jil',\n\t'Shella',\n\t'Renell',\n\t'Venise',\n\t'Loura',\n\t'Kaylia',\n\t'Leileen',\n\t'Jessel',\n\t'Janesa',\n\t'Kaelly',\n\t'Julina',\n\t'Joselinne',\n\t'Juna',\n\t'Hazelle',\n\t'Mauricia',\n\t'Octaviana',\n\t'Rumalda',\n\t'Kataleyah',\n\t'Kimela',\n\t'Mosella',\n\t'Delone',\n\t'Shemekia',\n\t'Balinda',\n\t'Hazell',\n\t'Deboraha',\n\t'Gizell',\n\t'Camilia',\n\t'Avalina',\n\t'Audreyana',\n\t'Baran',\n\t'Genesee',\n\t'Elyzabeth',\n\t'Eliya',\n\t'Kathyleen',\n\t'Deeksha',\n\t'Scherry',\n\t'Angelyne',\n\t'Amiliana',\n\t'Amaira',\n\t'Jeani',\n\t'Alysen',\n\t'Alania',\n\t'Adiana',\n\t'Chinyere',\n\t'Lamesha',\n\t'Keiley',\n\t'Lanea',\n\t'Rosely',\n\t'Surabhi',\n\t'Dyanne',\n\t'Mallika',\n\t'Tabbatha',\n\t'Shilpa',\n\t'Morgyn',\n\t'Narali',\n\t'Jenevie',\n\t'Lovette',\n\t'Nayleah',\n\t'Navi',\n\t'Meili',\n\t'Nazly',\n\t'Nethra',\n\t'Earlee',\n\t'Layloni',\n\t'Kiannah',\n\t'Lilyanah',\n\t'Liannah',\n\t'Jaylenn',\n\t'Jiayi',\n\t'Kattleya',\n\t'Kanna',\n\t'Jimin',\n\t'Kaleesi',\n\t'Kailia',\n\t'Itzy',\n\t'Itzela',\n\t'Jasminemarie',\n\t'Malynda',\n\t'Jeweline',\n\t'Eloiza',\n\t'Carolin',\n\t'Helma',\n\t'Arlyle',\n\t'Giannina',\n\t'Constancia',\n\t'Elyce',\n\t'Montoya',\n\t'Marline',\n\t'Krystale',\n\t'Maghan',\n\t'Laquitta',\n\t'Elishia',\n\t'Aliciana',\n\t'Maralee',\n\t'Brunetta',\n\t'Cybil',\n\t'Dannell',\n\t'Cherene',\n\t'Agueda',\n\t'Guillerma',\n\t'Haillie',\n\t'Bobbe',\n\t'Gesselle',\n\t'Esthefany',\n\t'Sian',\n\t'Ouita',\n\t'Sasheen',\n\t'Abigaile',\n\t'Demarie',\n\t'Edwena',\n\t'Aamiyah',\n\t'Breaunna',\n\t'Bryssa',\n\t'Catlyn',\n\t'Xaviera',\n\t'Sierria',\n\t'Skyelar',\n\t'Aujanae',\n\t'Rika',\n\t'Roshelle',\n\t'Roxsana',\n\t'Zonia',\n\t'Tifanie',\n\t'Thavy',\n\t'Teala',\n\t'Tanea',\n\t'Loukisha',\n\t'Melita',\n\t'Keiona',\n\t'Maryfer',\n\t'Delcenia',\n\t'Akila',\n\t'Gwenevere',\n\t'Obdulia',\n\t'Texana',\n\t'Licette',\n\t'Larina',\n\t'Lany',\n\t'Yailine',\n\t'Yomara',\n\t'Zavia',\n\t'Sydne',\n\t'Mariadelourdes',\n\t'Margeaux',\n\t'Daneille',\n\t'Doni',\n\t'Donalee',\n\t'Darilyn',\n\t'Jennfier',\n\t'Jeanny',\n\t'Haliegh',\n\t'Dymon',\n\t'Callee',\n\t'Cydni',\n\t'Daesha',\n\t'Tamila',\n\t'Tresha',\n\t'Mckennah',\n\t'Shouana',\n\t'Xcaret',\n\t'Yeneisy',\n\t'Yumalai',\n\t'Ziana',\n\t'Hanny',\n\t'Shanisha',\n\t'Nissi',\n\t'Mirabel',\n\t'Miarose',\n\t'Valerya',\n\t'Rosalin',\n\t'Saliha',\n\t'Samayah',\n\t'Smriti',\n\t'Jozette',\n\t'Gari',\n\t'Jeanell',\n\t'Dyann',\n\t'Vonna',\n\t'Velina',\n\t'Salli',\n\t'Nonie',\n\t'Olena',\n\t'Camela',\n\t'Eufracia',\n\t'Ethelyne',\n\t'Yuhan',\n\t'Silveria',\n\t'Silvestra',\n\t'Thressa',\n\t'Tiahna',\n\t'Vasti',\n\t'Calee',\n\t'Florentine',\n\t'Sherre',\n\t'Almira',\n\t'Zitlalli',\n\t'Vianne',\n\t'Yaribeth',\n\t'Yarelie',\n\t'Robbye',\n\t'Jasminne',\n\t'Sophiah',\n\t'Saryah',\n\t'Hermalinda',\n\t'Sinclaire',\n\t'Korissa',\n\t'Lanee',\n\t'Keeana',\n\t'Parlee',\n\t'Luceal',\n\t'Jetta',\n\t'Mairani',\n\t'Tameisha',\n\t'Haruna',\n\t'Chasiti',\n\t'Leighanne',\n\t'Anaisabel',\n\t'Aanchal',\n\t'Alesa',\n\t'Annisa',\n\t'Brigitta',\n\t'Elideth',\n\t'Chua',\n\t'Cherrish',\n\t'Aleece',\n\t'Maizee',\n\t'Navie',\n\t'Philomene',\n\t'Jilian',\n\t'Jesi',\n\t'Kortnie',\n\t'Beija',\n\t'Delissa',\n\t'Shiree',\n\t'Silbia',\n\t'Tamura',\n\t'Aerianna',\n\t'Abegail',\n\t'Braniya',\n\t'Calyn',\n\t'Carlynn',\n\t'Anjana',\n\t'Angelik',\n\t'Alyzabeth',\n\t'Amorie',\n\t'Joannamarie',\n\t'Kerissa',\n\t'Kennesha',\n\t'Laruen',\n\t'Korrina',\n\t'Felisitas',\n\t'Gilma',\n\t'Essica',\n\t'Gerarda',\n\t'Petronila',\n\t'Dorotea',\n\t'Maguadalupe',\n\t'Najla',\n\t'Loana',\n\t'Illyana',\n\t'Amunique',\n\t'Antwanette',\n\t'Krystan',\n\t'Shaniquia',\n\t'Shanequia',\n\t'Rainy',\n\t'Raynesha',\n\t'Shayleen',\n\t'Stephanee',\n\t'Sharaya',\n\t'Nikkole',\n\t'Cecille',\n\t'Christyne',\n\t'Auriel',\n\t'Franki',\n\t'Zelina',\n\t'Deshanae',\n\t'Deshawna',\n\t'Tyneshia',\n\t'Tyrisha',\n\t'Deangela',\n\t'Dynasia',\n\t'Maigan',\n\t'Jericka',\n\t'Jackalyn',\n\t'Kayln',\n\t'Ceslie',\n\t'Bethaney',\n\t'Samanvi',\n\t'Saidee',\n\t'Rosibel',\n\t'Spirit',\n\t'Srishti',\n\t'Varnika',\n\t'Vanshika',\n\t'Rosha',\n\t'Rheya',\n\t'Yoyo',\n\t'Veyda',\n\t'Weslyn',\n\t'Palak',\n\t'Sieanna',\n\t'Riannah',\n\t'Lovetta',\n\t'Lota',\n\t'Florice',\n\t'Hortence',\n\t'Zuley',\n\t'Zoejane',\n\t'Zemira',\n\t'Mineola',\n\t'Senona',\n\t'Concepsion',\n\t'Conrada',\n\t'Dardanella',\n\t'Rhina',\n\t'Rubicela',\n\t'Raissa',\n\t'Porchea',\n\t'Latiana',\n\t'Landy',\n\t'Monee',\n\t'Maritssa',\n\t'Marjani',\n\t'Meosha',\n\t'Cecilie',\n\t'Britanie',\n\t'Brandilyn',\n\t'Khrystina',\n\t'Atenas',\n\t'Kristeena',\n\t'Kristell',\n\t'Kristianne',\n\t'Angelicia',\n\t'Alexandera',\n\t'Jaimy',\n\t'Jeneffer',\n\t'Hayde',\n\t'Vickye',\n\t'Suzzanne',\n\t'Susi',\n\t'Sherrilyn',\n\t'Sanda',\n\t'Janeal',\n\t'Stephnie',\n\t'Luwana',\n\t'Shenae',\n\t'Yaris',\n\t'Marzell',\n\t'Lashane',\n\t'Liandra',\n\t'Keionna',\n\t'Korri',\n\t'Marlet',\n\t'Marytza',\n\t'Lorraina',\n\t'Deepika',\n\t'Devi',\n\t'Fion',\n\t'Darrah',\n\t'Dalisha',\n\t'Karessa',\n\t'Karrisa',\n\t'Kasara',\n\t'Ismar',\n\t'Jacquilyn',\n\t'Janica',\n\t'Jeannett',\n\t'Samanatha',\n\t'Samra',\n\t'Sayda',\n\t'Breklyn',\n\t'Ashika',\n\t'Bita',\n\t'Allysha',\n\t'Areil',\n\t'Arlenne',\n\t'Artelia',\n\t'Janicia',\n\t'Corinthia',\n\t'Angellica',\n\t'Maygen',\n\t'Maygan',\n\t'Odelle',\n\t'Wenonah',\n\t'Perfecta',\n\t'Anjelika',\n\t'Solmaira',\n\t'Fredonia',\n\t'Burgandy',\n\t'Chelcee',\n\t'Kellsey',\n\t'Lyann',\n\t'Jazmon',\n\t'Ardie',\n\t'Latunya',\n\t'Benetta',\n\t'Delphina',\n\t'Ortensia',\n\t'Obelia',\n\t'Lurene',\n\t'Refujia',\n\t'Noriko',\n\t'Ladelle',\n\t'Lella',\n\t'Shanie',\n\t'Shawndra',\n\t'Zell',\n\t'Zela',\n\t'Wenda',\n\t'Troylene',\n\t'Merrilyn',\n\t'Kapri',\n\t'Timesha',\n\t'Gwendlyn',\n\t'Jenean',\n\t'Lamona',\n\t'Ladana',\n\t'Cina',\n\t'Cybele',\n\t'Eugina',\n\t'Anjeanette',\n\t'Vana',\n\t'Jeneal',\n\t'Cherlene',\n\t'Railee',\n\t'Palin',\n\t'Yuliet',\n\t'Rechelle',\n\t'Sherisse',\n\t'Pollyanna',\n\t'Tiphani',\n\t'Tiffanee',\n\t'Vanisha',\n\t'Yurico',\n\t'Junko',\n\t'Shannell',\n\t'Shalise',\n\t'Kimberlina',\n\t'Kerra',\n\t'Shantee',\n\t'Emmelia',\n\t'Micala',\n\t'Lexxus',\n\t'Candiss',\n\t'Chauntel',\n\t'Alese',\n\t'Margit',\n\t'Any',\n\t'Ambur',\n\t'Chrysta',\n\t'Janese',\n\t'Jinny',\n\t'Zaydee',\n\t'Makisha',\n\t'Carola',\n\t'Marjan',\n\t'Samanth',\n\t'Shaquinta',\n\t'Polette',\n\t'Riane',\n\t'Nitasha',\n\t'Kasarah',\n\t'Jillianne',\n\t'Keidra',\n\t'Karrah',\n\t'Kaytie',\n\t'Sondi',\n\t'Swayzie',\n\t'Laporcha',\n\t'Bridgit',\n\t'Chanika',\n\t'Antoniette',\n\t'Jessicia',\n\t'Francies',\n\t'Kaizley',\n\t'Negin',\n\t'Mistica',\n\t'Lorenia',\n\t'Kalise',\n\t'Kynslie',\n\t'Dene',\n\t'Jizel',\n\t'Jinger',\n\t'Jayli',\n\t'Jariya',\n\t'Joelynn',\n\t'Haylin',\n\t'Isabellah',\n\t'Ciria',\n\t'Dealva',\n\t'Barbarita',\n\t'Prudencia',\n\t'Wanna',\n\t'Marieli',\n\t'Madisynn',\n\t'Madalyne',\n\t'Artisha',\n\t'Everlyn',\n\t'Cyerra',\n\t'Liezl',\n\t'Kabao',\n\t'Karmina',\n\t'Kashmir',\n\t'Nani',\n\t'Mithra',\n\t'Mishika',\n\t'Milynn',\n\t'Mehr',\n\t'Marybella',\n\t'Maisey',\n\t'Maddy',\n\t'Lyah',\n\t'Marnee',\n\t'Machele',\n\t'Ladona',\n\t'Lorilei',\n\t'Liara',\n\t'Alahni',\n\t'Analaya',\n\t'Amalya',\n\t'Alyannah',\n\t'Aayla',\n\t'Aarini',\n\t'Arliz',\n\t'Cyra',\n\t'Asenet',\n\t'Avy',\n\t'Avaree',\n\t'Ciela',\n\t'Evangelyn',\n\t'Kaidynce',\n\t'Isella',\n\t'Ilaria',\n\t'Kattaleya',\n\t'Laveah',\n\t'Lareen',\n\t'Lanah',\n\t'Deema',\n\t'Hannaley',\n\t'Fiora',\n\t'Eviana',\n\t'Ellieana',\n\t'Elisabetta',\n\t'Dejanira',\n\t'Manaia',\n\t'Malibu',\n\t'Charlsey',\n\t'Kaytee',\n\t'Kinberly',\n\t'Cinderella',\n\t'Miana',\n\t'Kimm',\n\t'Koni',\n\t'Eraina',\n\t'Dory',\n\t'Deette',\n\t'Nysa',\n\t'Nyima',\n\t'Nikitha',\n\t'Anasophia',\n\t'Alissandra',\n\t'Alisi',\n\t'Corynn',\n\t'Aubreyana',\n\t'Anjani',\n\t'Oliana',\n\t'Nura',\n\t'Nihira',\n\t'Loveda',\n\t'Gayathri',\n\t'Kleigh',\n\t'Ladaisha',\n\t'Ilette',\n\t'Jillene',\n\t'Jalina',\n\t'Izellah',\n\t'Tiaira',\n\t'Mickala',\n\t'Macarena',\n\t'Rubina',\n\t'Shadow',\n\t'Emillie',\n\t'Morine',\n\t'Novell',\n\t'Oletta',\n\t'Pura',\n\t'Winna',\n\t'Synia',\n\t'Shyloh',\n\t'Kaizlee',\n\t'Raley',\n\t'Merly',\n\t'Na',\n\t'Yenia',\n\t'Shayanne',\n\t'Raeana',\n\t'Tiauna',\n\t'Tanairy',\n\t'Georganna',\n\t'Mahsa',\n\t'Maiquel',\n\t'Korena',\n\t'Yamel',\n\t'Shamonica',\n\t'Romesha',\n\t'Terrisha',\n\t'Hannan',\n\t'Hillarie',\n\t'Feliza',\n\t'Courtny',\n\t'Lyndsee',\n\t'Katelan',\n\t'Lakedra',\n\t'Elisabel',\n\t'Cynthya',\n\t'Dannah',\n\t'Darienne',\n\t'Dejanique',\n\t'Madalin',\n\t'Makynzi',\n\t'Gwendolynn',\n\t'Alaine',\n\t'Bridney',\n\t'Kimorah',\n\t'Klee',\n\t'Kynedi',\n\t'Loreley',\n\t'Parthenia',\n\t'Aubryana',\n\t'Aryannah',\n\t'Edeline',\n\t'Elen',\n\t'Raguel',\n\t'Marizela',\n\t'Michella',\n\t'Haasini',\n\t'Tristine',\n\t'Elis',\n\t'Pattye',\n\t'Tanishia',\n\t'Jenel',\n\t'Jurea',\n\t'Laini',\n\t'Britania',\n\t'Christabelle',\n\t'Dafney',\n\t'Laterica',\n\t'Angelmarie',\n\t'Asuzena',\n\t'Aleea',\n\t'Teneka',\n\t'Yicel',\n\t'Malisha',\n\t'Prairie',\n\t'Makelle',\n\t'Shaelee',\n\t'Dafina',\n\t'Hisaye',\n\t'Adayah',\n\t'Alexsia',\n\t'Allysen',\n\t'Takako',\n\t'Thamara',\n\t'Trinitie',\n\t'Shaneen',\n\t'Sueellen',\n\t'Telma',\n\t'Meyah',\n\t'Rorie',\n\t'Preslea',\n\t'Elbia',\n\t'Ginna',\n\t'Marja',\n\t'Marites',\n\t'Neisha',\n\t'Shir',\n\t'Shastelyn',\n\t'Saraih',\n\t'Unity',\n\t'Makinna',\n\t'Franchelle',\n\t'Azadeh',\n\t'Charito',\n\t'Joli',\n\t'Amyrah',\n\t'Sharlee',\n\t'Jasey',\n\t'Kortlynn',\n\t'Kiari',\n\t'Kyria',\n\t'Eleina',\n\t'Elany',\n\t'Daleah',\n\t'Sumi',\n\t'Kileigh',\n\t'Lorianna',\n\t'Macady',\n\t'Naviah',\n\t'Mattilyn',\n\t'Raylyn',\n\t'Bridgitte',\n\t'Hasina',\n\t'Johnelle',\n\t'Gwendlyon',\n\t'Itxel',\n\t'Iyanah',\n\t'Jeidy',\n\t'Jaidynn',\n\t'Jaslynne',\n\t'Zoii',\n\t'Tensley',\n\t'Yolando',\n\t'Keyarah',\n\t'Keyri',\n\t'Katherinne',\n\t'Thersa',\n\t'Sinahi',\n\t'Secret',\n\t'Vivika',\n\t'Yobana',\n\t'Hailley',\n\t'Haliey',\n\t'Isys',\n\t'Deyla',\n\t'Kassidee',\n\t'Jalie',\n\t'Florestela',\n\t'Cyla',\n\t'Samyuktha',\n\t'Libni',\n\t'Laritza',\n\t'Breannah',\n\t'Breya',\n\t'Keelin',\n\t'Jarelly',\n\t'Jenyfer',\n\t'Julyanna',\n\t'Kaetlyn',\n\t'Mixtli',\n\t'Mykaila',\n\t'Nasia',\n\t'Judieth',\n\t'Misako',\n\t'Bre',\n\t'Shaley',\n\t'Gelila',\n\t'Aariana',\n\t'Laquetta',\n\t'Shizu',\n\t'Annay',\n\t'Annai',\n\t'Breeze',\n\t'Mahum',\n\t'Harsimran',\n\t'Helaina',\n\t'Alexza',\n\t'Tangelia',\n\t'Shellye',\n\t'Blondena',\n\t'Keva',\n\t'Suzzane',\n\t'Vallorie',\n\t'Absidy',\n\t'Alis',\n\t'Alexxia',\n\t'Allura',\n\t'Ariba',\n\t'Annete',\n\t'Anett',\n\t'Deyanara',\n\t'Ellise',\n\t'Majorie',\n\t'Hibah',\n\t'Chaselyn',\n\t'Hennesy',\n\t'Gayatri',\n\t'Kathelyn',\n\t'Caylah',\n\t'Athyna',\n\t'Arpita',\n\t'Ciclaly',\n\t'Emmamarie',\n\t'Virjinia',\n\t'Tyna',\n\t'Cyd',\n\t'Glennda',\n\t'Littie',\n\t'Orlean',\n\t'Derinda',\n\t'Hether',\n\t'Clata',\n\t'Pleshette',\n\t'Maricelda',\n\t'Charmin',\n\t'Matsuye',\n\t'Tamitha',\n\t'Armanda',\n\t'Sayaka',\n\t'Lacresia',\n\t'Demonica',\n\t'Skie',\n\t'Trynity',\n\t'Sereena',\n\t'Shefali',\n\t'Rewa',\n\t'Reshonda',\n\t'Yalanda',\n\t'Anissia',\n\t'Layni',\n\t'Paolina',\n\t'Manaal',\n\t'Mariali',\n\t'Merina',\n\t'Milenia',\n\t'Millenia',\n\t'Moncerrath',\n\t'Monzerrath',\n\t'Kaydie',\n\t'Adianna',\n\t'Toluwalase',\n\t'Trysta',\n\t'Ainsleigh',\n\t'Alianah',\n\t'Meuy',\n\t'Meloney',\n\t'Talea',\n\t'Sheetal',\n\t'Shalana',\n\t'Venesa',\n\t'Teana',\n\t'Kiki',\n\t'Imee',\n\t'Aubryanna',\n\t'Allyanna',\n\t'Ambrie',\n\t'Amory',\n\t'Aniyha',\n\t'Caelynn',\n\t'Reita',\n\t'Rylann',\n\t'Aijah',\n\t'Aaliyha',\n\t'Alezandra',\n\t'Yeraldine',\n\t'Forestine',\n\t'Sameeha',\n\t'Caeley',\n\t'Britzy',\n\t'Blessin',\n\t'Armilda',\n\t'Birda',\n\t'Lorrine',\n\t'Krisalyn',\n\t'Linell',\n\t'Maryl',\n\t'Karole',\n\t'Maryela',\n\t'Mckinzy',\n\t'Madailein',\n\t'Kendi',\n\t'Kayda',\n\t'Jenasis',\n\t'Madelis',\n\t'Jamyiah',\n\t'Gabryela',\n\t'Catie',\n\t'Genessa',\n\t'Jamelia',\n\t'Jenene',\n\t'Nicholl',\n\t'Saralyn',\n\t'Taylah',\n\t'Xandra',\n\t'Jezlyn',\n\t'Zakayla',\n\t'Jaira',\n\t'Veena',\n\t'Shaden',\n\t'Sahiti',\n\t'Sahian',\n\t'Shelsey',\n\t'Sreya',\n\t'Zianna',\n\t'Angeleah',\n\t'Camily',\n\t'Lesvia',\n\t'Sonda',\n\t'Franceska',\n\t'Cytlaly',\n\t'Ylonda',\n\t'Issis',\n\t'Moon',\n\t'Joei',\n\t'Mariposa',\n\t'Ramandeep',\n\t'Preeti',\n\t'Niobe',\n\t'Sherran',\n\t'Nichola',\n\t'Letrice',\n\t'Waneda',\n\t'Meka',\n\t'Takeshia',\n\t'Leaann',\n\t'Girlie',\n\t'Olar',\n\t'Pearlena',\n\t'Carlean',\n\t'Dhanya',\n\t'Chastelin',\n\t'Aryanah',\n\t'Brihana',\n\t'Bijou',\n\t'Haifa',\n\t'Genesiss',\n\t'Genavie',\n\t'Enna',\n\t'Jazzel',\n\t'Japleen',\n\t'Iana',\n\t'Rahel',\n\t'Rylyn',\n\t'Pragya',\n\t'Yosselyn',\n\t'Yarelin',\n\t'Ellasyn',\n\t'Charlaine',\n\t'Zayli',\n\t'Taide',\n\t'Jodean',\n\t'Emilynn',\n\t'Channon',\n\t'Carinne',\n\t'Anaira',\n\t'Amisadai',\n\t'Caraline',\n\t'Danella',\n\t'Debanhy',\n\t'Devanee',\n\t'Koneta',\n\t'Jenie',\n\t'Hollee',\n\t'Marelie',\n\t'Mahathi',\n\t'Madilynne',\n\t'Lylia',\n\t'Loreli',\n\t'Lolah',\n\t'Lexine',\n\t'Maylynn',\n\t'Clarinda',\n\t'Marlynn',\n\t'Netra',\n\t'Makaylin',\n\t'Naira',\n\t'Naleah',\n\t'Mishel',\n\t'Myli',\n\t'Charlotta',\n\t'Arlisa',\n\t'Kaylynne',\n\t'Kamillah',\n\t'Ksenia',\n\t'Briseidy',\n\t'Aysel',\n\t'Anaily',\n\t'Eulean',\n\t'Adilee',\n\t'Abri',\n\t'Aidynn',\n\t'Alisyn',\n\t'Alicen',\n\t'Marveline',\n\t'Lupie',\n\t'Mariabelen',\n\t'Makenah',\n\t'Kyliegh',\n\t'Foye',\n\t'Yajahira',\n\t'Trenda',\n\t'Tya',\n\t'Nattaly',\n\t'Netanya',\n\t'Supriya',\n\t'Teja',\n\t'Srija',\n\t'Sherra',\n\t'Janissa',\n\t'Mysha',\n\t'Essfa',\n\t'Alexandrya',\n\t'Abi',\n\t'Takhia',\n\t'Jaeli',\n\t'Jaelynne',\n\t'Dianey',\n\t'Denisa',\n\t'Aleli',\n\t'Akina',\n\t'Aayushi',\n\t'Adanna',\n\t'Aunika',\n\t'Ithzel',\n\t'Caricia',\n\t'Kallyn',\n\t'Karmin',\n\t'Kindall',\n\t'Gredmarie',\n\t'Peace',\n\t'Jennalee',\n\t'Yaindhi',\n\t'Arcola',\n\t'Trannie',\n\t'Lyza',\n\t'Mackynzie',\n\t'Peggye',\n\t'Zenab',\n\t'Megyn',\n\t'Navina',\n\t'Naileah',\n\t'Maddelyn',\n\t'Luxe',\n\t'Arkie',\n\t'Belvia',\n\t'Edilia',\n\t'Monda',\n\t'Ridhi',\n\t'Peyten',\n\t'Sorayah',\n\t'Syrena',\n\t'Amberle',\n\t'Johnita',\n\t'Jerrye',\n\t'Alfa',\n\t'Jonita',\n\t'Lakie',\n\t'Jenalee',\n\t'Minami',\n\t'Morena',\n\t'Elsbeth',\n\t'Sylia',\n\t'Eunique',\n\t'Ellisa',\n\t'Lanai',\n\t'Jesselyn',\n\t'Jolissa',\n\t'Julizza',\n\t'Laquitha',\n\t'Jobina',\n\t'Wyvonne',\n\t'Shalese',\n\t'Deshannon',\n\t'Almendra',\n\t'Alisandra',\n\t'Geraldene',\n\t'Abygale',\n\t'Katelyne',\n\t'Kennede',\n\t'Karisia',\n\t'Lindzy',\n\t'Keyhla',\n\t'Emilea',\n\t'Dacey',\n\t'Jalah',\n\t'Adrienna',\n\t'Aisa',\n\t'Alaisha',\n\t'Brithney',\n\t'Calynn',\n\t'Cassity',\n\t'Brendy',\n\t'Reagen',\n\t'Myrah',\n\t'Montserrath',\n\t'Pheobe',\n\t'Nyeli',\n\t'Jocell',\n\t'Serenidy',\n\t'Issabela',\n\t'Hanalei',\n\t'Laelah',\n\t'Emmylou',\n\t'Geraldy',\n\t'Ovetta',\n\t'Analena',\n\t'Allyna',\n\t'Aliyanah',\n\t'Magdalyn',\n\t'Suann',\n\t'Ronee',\n\t'Amey',\n\t'Chirstina',\n\t'Trude',\n\t'Jearldine',\n\t'Maeleigh',\n\t'Lizzy',\n\t'Liviana',\n\t'Eithel',\n\t'Meryem',\n\t'Yaneisy',\n\t'Shatika',\n\t'Zeniyah',\n\t'Xaylee',\n\t'Pennelope',\n\t'Xochilth',\n\t'Jullie',\n\t'Saki',\n\t'Shaiann',\n\t'Haille',\n\t'Dannya',\n\t'Kerie',\n\t'Chianti',\n\t'Leza',\n\t'Koreen',\n\t'Letricia',\n\t'Lamanda',\n\t'Kinza',\n\t'Marisella',\n\t'Joelyn',\n\t'Cinde',\n\t'Chyrl',\n\t'Cece',\n\t'Boni',\n\t'Felecity',\n\t'Faithe',\n\t'Delayna',\n\t'Diamon',\n\t'Daley',\n\t'Darah',\n\t'France',\n\t'Kolina',\n\t'Kieu',\n\t'Grizel',\n\t'Shaleigh',\n\t'Shaylea',\n\t'Anitza',\n\t'Carrolyn',\n\t'Olimpia',\n\t'Jeannene',\n\t'Victoriana',\n\t'Azara',\n\t'Avelynn',\n\t'Aveah',\n\t'Ariam',\n\t'Devanie',\n\t'Daleisa',\n\t'Karelly',\n\t'Karalynn',\n\t'Keyleen',\n\t'Kendallyn',\n\t'Graceyn',\n\t'Falynn',\n\t'Evoleht',\n\t'Everlie',\n\t'Emri',\n\t'Hartlee',\n\t'Eleena',\n\t'Jailee',\n\t'Insiya',\n\t'Analysia',\n\t'Chalee',\n\t'Amzie',\n\t'Amilya',\n\t'Celisa',\n\t'Airabella',\n\t'Laketha',\n\t'Kyoko',\n\t'Saria',\n\t'Neli',\n\t'Melonee',\n\t'Neidy',\n\t'Nyanza',\n\t'Aizlynn',\n\t'Arthurine',\n\t'Mikhaela',\n\t'Adalae',\n\t'Parveen',\n\t'Lotoya',\n\t'Evanjelina',\n\t'Deborra',\n\t'Lunna',\n\t'Makylah',\n\t'Mckinleigh',\n\t'Mayalen',\n\t'Ladasia',\n\t'Javia',\n\t'Evian',\n\t'Jaelee',\n\t'Oluwatamilore',\n\t'Payzlee',\n\t'Reiley',\n\t'Samarra',\n\t'Chyler',\n\t'Areona',\n\t'Vanesha',\n\t'Tomisha',\n\t'Betzaira',\n\t'Dalana',\n\t'Destenie',\n\t'Brennah',\n\t'Cassidie',\n\t'Deziray',\n\t'Dimond',\n\t'Braeleigh',\n\t'Aylee',\n\t'Anastyn',\n\t'Amillia',\n\t'Jailyne',\n\t'Jissell',\n\t'Jailenne',\n\t'Inioluwa',\n\t'Jensyn',\n\t'Allia',\n\t'Evolett',\n\t'Emmalynne',\n\t'Emberlee',\n\t'Emaline',\n\t'Ellayna',\n\t'Kollins',\n\t'Keyly',\n\t'Livi',\n\t'Judeen',\n\t'Eleah',\n\t'Vonceil',\n\t'Kaaliyah',\n\t'Girtie',\n\t'Gianelle',\n\t'Iniya',\n\t'Harlynn',\n\t'Greidy',\n\t'Shayli',\n\t'Belina',\n\t'Auri',\n\t'Avangeline',\n\t'Alizey',\n\t'Arlynn',\n\t'Anelise',\n\t'Aneli',\n\t'Delmira',\n\t'Vanassa',\n\t'Ceana',\n\t'Ambre',\n\t'Florita',\n\t'Balbina',\n\t'Clova',\n\t'Danice',\n\t'Aydee',\n\t'Carlena',\n\t'Benicia',\n\t'Soumya',\n\t'Lissandra',\n\t'Ling',\n\t'Liahna',\n\t'Leonna',\n\t'Leilana',\n\t'Reeya',\n\t'Krisinda',\n\t'Maleiah',\n\t'Maiyah',\n\t'Mailin',\n\t'Lucciana',\n\t'Naydeen',\n\t'Nailani',\n\t'Miette',\n\t'Yeva',\n\t'Suley',\n\t'Shravya',\n\t'Kyia',\n\t'Shree',\n\t'Cerise',\n\t'Katriana',\n\t'Jaskiran',\n\t'Mone',\n\t'Latijera',\n\t'Rosicela',\n\t'Sidnee',\n\t'Rosisela',\n\t'Troi',\n\t'Victorya',\n\t'Creasie',\n\t'Latorsha',\n\t'Erienne',\n\t'Jovonna',\n\t'Jessia',\n\t'Jeny',\n\t'Dejia',\n\t'Destynie',\n\t'Barbi',\n\t'Marlinda',\n\t'Shakeitha',\n\t'Mistelle',\n\t'Ziona',\n\t'Zarahi',\n\t'Xiadani',\n\t'Zyrah',\n\t'Zoriah',\n\t'Pamla',\n\t'Cinamon',\n\t'Bernardette',\n\t'Makensie',\n\t'Lexani',\n\t'Miyana',\n\t'Costella',\n\t'Cliffie',\n\t'Lashune',\n\t'Windie',\n\t'Rhondalyn',\n\t'Avonelle',\n\t'Marcine',\n\t'Berneda',\n\t'Rosabelle',\n\t'Huldah',\n\t'Emagene',\n\t'Clarabell',\n\t'Marceil',\n\t'Ula',\n\t'Renika',\n\t'Shaterica',\n\t'Labrittany',\n\t'Zelia',\n\t'Aidy',\n\t'Abeeha',\n\t'Maebelle',\n\t'Farzona',\n\t'Bryelle',\n\t'Aphrodite',\n\t'Diyora',\n\t'Zilphia',\n\t'Ercell',\n\t'Starlynn',\n\t'Renad',\n\t'Reham',\n\t'Marwah',\n\t'Raaina',\n\t'Mehreen',\n\t'Chermaine',\n\t'Ameliah',\n\t'Hajra',\n\t'Anamika',\n\t'Caoimhe',\n\t'Tasheka',\n\t'Cladie',\n\t'Claretta',\n\t'Ratzy',\n\t'Parizoda',\n\t'Tzurty',\n\t'Simrah',\n\t'Miamor',\n\t'Mala',\n\t'Yittel',\n\t'Ranata',\n\t'Clellie',\n\t'Dewana',\n\t'Kenyada',\n\t'Sennie',\n\t'Estie',\n\t'Oprah',\n\t'Chessie',\n\t'Rumaisa',\n\t'Rosmery',\n\t'Shenell',\n\t'Cosima',\n\t'Ellyanna',\n\t'Hebe',\n\t'Aamira',\n\t'Beily',\n\t'Areesha',\n\t'Amilah',\n\t'Mahdiya',\n\t'Ramata',\n\t'Naava',\n\t'Cannie',\n\t'Dorraine',\n\t'Verlee',\n\t'Anija',\n\t'Garnita',\n\t'Lorenda',\n\t'Mikia',\n\t'Marvella',\n\t'Sharma',\n\t'Pamula',\n\t'Anmarie',\n\t'Valicia',\n\t'Collene',\n\t'Ronetta',\n\t'Floris',\n\t'Andora',\n\t'Berdina',\n\t'Ivadell',\n\t'Lorain',\n\t'Kevinisha',\n\t'Corielle',\n\t'Rinda',\n\t'Jodelle',\n\t'Arta',\n\t'Kalima',\n\t'Kalifa',\n\t'Liat',\n\t'Dashawna',\n\t'Jahnae',\n\t'Eylin',\n\t'Tahmina',\n\t'Sherin',\n\t'Niambi',\n\t'Tonjua',\n\t'Hanifah',\n\t'Maham',\n\t'Sokhna',\n\t'Carliss',\n\t'Nimra',\n\t'Quianna',\n\t'Shadai',\n\t'Renella',\n\t'Eliska',\n\t'Alima',\n\t'Agata',\n\t'Adenike',\n\t'Charizma',\n\t'Shirlean',\n\t'Joycelin',\n\t'Cyanne',\n\t'Ambika',\n\t'Albana',\n\t'Noshin',\n\t'Merve',\n\t'Sanjida',\n\t'Khiabet',\n\t'Maudrey',\n\t'Manuella',\n\t'Linder',\n\t'Bisma',\n\t'Shataya',\n\t'Shandel',\n\t'Samanthamarie',\n\t'Liron',\n\t'Liann',\n\t'Merdis',\n\t'Daquana',\n\t'Chanee',\n\t'Ezora',\n\t'Janiqua',\n\t'Jamielyn',\n\t'Kyesha',\n\t'Eulalie',\n\t'Montressa',\n\t'Alzina',\n\t'Monez',\n\t'Casmira',\n\t'Eileene',\n\t'Ethelmae',\n\t'Veneta',\n\t'Madiha',\n\t'Akeema',\n\t'Daneisha',\n\t'Cecely',\n\t'Gwendola',\n\t'Javonna',\n\t'Teshia',\n\t'Yaniris',\n\t'Valbona',\n\t'Corita',\n\t'Deshanna',\n\t'Kameka',\n\t'Armina',\n\t'Georgian',\n\t'Shakeera',\n\t'Saudia',\n\t'Stacyann',\n\t'Shenique',\n\t'Ura',\n\t'Felicie',\n\t'Ezola',\n\t'Janeece',\n\t'Chavely',\n\t'Ashling',\n\t'Nakea',\n\t'Shiana',\n\t'Shadasia',\n\t'Petronella',\n\t'Virgin',\n\t'Gunhild',\n\t'Brianni',\n\t'Grainne',\n\t'Aneisha',\n\t'Chaniece',\n\t'Zalika',\n\t'Tynasia',\n\t'Tashauna',\n\t'Shazia',\n\t'Shatiqua',\n\t'Sharissa',\n\t'Shanyce',\n\t'Shandell',\n\t'Shakeyla',\n\t'Vergia',\n\t'Geraldyne',\n\t'Dorita',\n\t'Nathasha',\n\t'Samanthajo',\n\t'Amela',\n\t'Afnan',\n\t'Halimah',\n\t'Dayatra',\n\t'Shontrell',\n\t'Tziry',\n\t'Shanyah',\n\t'Shawntell',\n\t'Schwanda',\n\t'Magalene',\n\t'Si',\n\t'Ramisa',\n\t'Ioanna',\n\t'Imane',\n\t'Hadar',\n\t'Ettel',\n\t'Coumba',\n\t'Chumy',\n\t'Shiran',\n\t'Lianny',\n\t'Kimara',\n\t'Nicha',\n\t'Chestine',\n\t'Fatmata',\n\t'Chedva',\n\t'Shaima',\n\t'Shailyn',\n\t'Zarin',\n\t'Zahrah',\n\t'Wania',\n\t'Tsering',\n\t'Syrai',\n\t'Suriyah',\n\t'No',\n\t'Niylah',\n\t'Meerab',\n\t'Emanuela',\n\t'Draizy',\n\t'Giabella',\n\t'Jeily',\n\t'Sofya',\n\t'Shantrelle',\n\t'Analisse',\n\t'Ramatoulaye',\n\t'Raima',\n\t'Sumaiyah',\n\t'Stori',\n\t'Tremeka',\n\t'Beila',\n\t'Clodagh',\n\t'Lyniah',\n\t'Giavana',\n\t'Tikisha',\n\t'Kesia',\n\t'Shawan',\n\t'Mazelle',\n\t'Lear',\n\t'Rosilyn',\n\t'Jnaya',\n\t'Jahnia',\n\t'Shi',\n\t'Henya',\n\t'Jhoselyn',\n\t'Doha',\n\t'Dilara',\n\t'Adelisa',\n\t'Dedria',\n\t'Troylynn',\n\t'Basha',\n\t'Fatimata',\n\t'Ama',\n\t'Ashantee',\n\t'Chania',\n\t'Donzella',\n\t'Ya',\n\t'Fahmida',\n\t'Iysis',\n\t'Neviah',\n\t'Anastasiya',\n\t'Brandel',\n\t'Afra',\n\t'Lendora',\n\t'Zisel',\n\t'Dwanda',\n\t'Ciarah',\n\t'Brighid',\n\t'Rafia',\n\t'Keamber',\n\t'Virdie',\n\t'Girtrude',\n\t'Nakaya',\n\t'Donis',\n\t'Anslei',\n\t'Alyene',\n\t'Audell',\n\t'Nahriah',\n\t'Zakeria',\n\t'Zoria',\n\t'Nikeria',\n\t'Kynley',\n\t'Karaline',\n\t'Jacquita',\n\t'Shonteria',\n\t'Carlyon',\n\t'Tykira',\n\t'Nykerria',\n\t'Lema',\n\t'Destyne',\n\t'Kansas',\n\t'Aryonna',\n\t'Iyannah',\n\t'Jamayah',\n\t'Serenitee',\n\t'Jood',\n\t'Willean',\n\t'Makyah',\n\t'Kameria',\n\t'Shelagh',\n\t'Zarriah',\n\t'Avionna',\n\t'Arilynn',\n\t'Vira',\n\t'Lelar',\n\t'Miyonna',\n\t'Jaionna',\n\t'Nakiah',\n\t'Rubby',\n\t'Henrene',\n\t'Perlie',\n\t'Tanyah',\n\t'Luretha',\n\t'Fannye',\n\t'Arquilla',\n\t'Albirta',\n\t'Annakate',\n\t'Akeria',\n\t'Teola',\n\t'Darthy',\n\t'Amberleigh',\n\t'Floriene',\n\t'Alleyne',\n\t'Karra',\n\t'Shaneika',\n\t'Nekita',\n\t'Niketa',\n\t'Kiaraliz',\n\t'Anacarolina',\n\t'Sharonica',\n\t'Renota',\n\t'Shambrica',\n\t'Mylea',\n\t'Jalicia',\n\t'Shantavious',\n\t'Antania',\n\t'Derika',\n\t'Rashunda',\n\t'Shandrea',\n\t'Teneisha',\n\t'Wachovia',\n\t'Jalecia',\n\t'Leimomi',\n\t'Lasondra',\n\t'Tela',\n\t'Caleah',\n\t'Iwalani',\n\t'Jamyri',\n\t'Azyria',\n\t'Napua',\n\t'Lahela',\n\t'Lehuanani',\n\t'Lameka',\n\t'Davelyn',\n\t'Filippa',\n\t'Tywanna',\n\t'Toini',\n\t'Pota',\n\t'Berthe',\n\t'Aliesha',\n\t'Iolanda',\n\t'Seaira',\n\t'Kealohilani',\n\t'Leialoha',\n\t'Chastidy',\n\t'Taimane',\n\t'Taylorann',\n\t'Briunna',\n\t'Tyrielle',\n\t'Alohilani',\n\t'Jakala',\n\t'Lakendria',\n\t'Tiffinie',\n\t'Laprecious',\n\t'Kaylaann',\n\t'Marigny',\n\t'Roise',\n\t'Kaidance',\n\t'Niyla',\n\t'Mahari',\n\t'Zya',\n\t'Ruthia',\n\t'Timara',\n\t'Caniya',\n\t'Keirah',\n\t'Arieonna',\n\t'Alydia',\n\t'Alivea',\n\t'Ahmani',\n\t'Elynn',\n\t'Earnstine',\n\t'Ramiya',\n\t'Morrigan',\n\t'Masiyah',\n\t'Harmoney',\n\t'Pearley',\n\t'Jearlean',\n\t'Korrine',\n\t'Chyanna',\n\t'Catena',\n\t'Pacita',\n\t'Kalle',\n\t'Alzira',\n\t'Tashayla',\n\t'Tsugie',\n\t'Yachiyo',\n\t'Shellia',\n\t'Sueno',\n\t'Kazuyo',\n\t'Kikumi',\n\t'Shizuka',\n\t'Chiyono',\n\t'Shigeno',\n\t'Tatsue',\n\t'Fumiyo',\n\t'Misayo',\n\t'Momoyo',\n\t'Hanayo',\n\t'Misae',\n\t'Dalaney',\n\t'Dewanda',\n\t'Itsuko',\n\t'Nyamal',\n\t'Claris',\n\t'Virlee',\n\t'Lulabelle',\n\t'Valada',\n\t'Neleigh',\n\t'Rafelita',\n\t'Placida',\n\t'Dulcinea',\n\t'Pita',\n\t'Heer',\n\t'Beren',\n\t'Ramoncita',\n\t'Orlinda',\n\t'Florette',\n\t'Deluvina',\n\t'Lugarda',\n\t'Crucita',\n\t'Rafaelita',\n\t'Pablita',\n\t'Lamaria',\n\t'Terriana',\n\t'Terrianna',\n\t'Dariyah',\n\t'Carmie',\n\t'Clotine',\n\t'Antha',\n\t'Takyla',\n\t'Peachie',\n\t'Akirah',\n\t'Captola',\n\t'Sadeel',\n\t'Dosha',\n\t'Miquela',\n\t'Anilah',\n\t'Erielle',\n\t'Janiylah',\n\t'Aubriel',\n\t'Priti',\n\t'Purvi',\n\t'Shakeemah',\n\t'Anjail',\n\t'Shaheerah',\n\t'Amneris',\n\t'Melverine',\n\t'Twilla',\n\t'Kruti',\n\t'Jalee',\n\t'Shareefah',\n\t'Muslimah',\n\t'Tauheedah',\n\t'Anabela',\n\t'Yakima',\n\t'Lyllian',\n\t'Tanajah',\n\t'Sakiyah',\n\t'Eun',\n\t'Yashika',\n\t'Ji',\n\t'Demiana',\n\t'Mariaeduard',\n\t'Snigdha',\n\t'Dala',\n\t'Kum',\n\t'Myung',\n\t'Hadiyah',\n\t'Gopi',\n\t'Cresta',\n\t'In',\n\t'Davita',\n\t'Talayeh',\n\t'Tracyann',\n\t'Petula',\n\t'Nerida',\n\t'Jeaneen',\n\t'Ilissa',\n\t'Letta',\n\t'Kishia',\n\t'Gesenia',\n\t'Bethsaida',\n\t'Tanija',\n\t'Ivelise',\n\t'Marines',\n\t'Angenette',\n\t'Alanda',\n\t'Lauraann',\n\t'Darnetta',\n\t'Alisande',\n\t'Jeniya',\n\t'Patria',\n\t'Tieysha',\n\t'Tasheen',\n\t'Ife',\n\t'Loredana',\n\t'Amyjo',\n\t'Chane',\n\t'Nilka',\n\t'Sharema',\n\t'Grazia',\n\t'Renna',\n\t'Tahesha',\n\t'Tarita',\n\t'Jannis',\n\t'Geriann',\n\t'Areatha',\n\t'Rosangel',\n\t'Kemba',\n\t'Noni',\n\t'Margaretann',\n\t'Kimberleigh',\n\t'Latisa',\n\t'Kiriaki',\n\t'Bobbyjo',\n\t'Walida',\n\t'Lynanne',\n\t'Niyanna',\n\t'Daziah',\n\t'Kharma',\n\t'Pier',\n\t'Marymargaret',\n\t'Lorrain',\n\t'Ketty',\n\t'Helane',\n\t'Tarnisha',\n\t'Sherrice',\n\t'Swati',\n\t'Donnajean',\n\t'Tunya',\n\t'Annmargaret',\n\t'Raffaella',\n\t'Pina',\n\t'Deneene',\n\t'Lorriane',\n\t'Shenise',\n\t'Ziyonna',\n\t'Evagelia',\n\t'Chantae',\n\t'Tasheema',\n\t'Meaghen',\n\t'Shanikqua',\n\t'Lynnox',\n\t'Taiesha',\n\t'Sharima',\n\t'Shantai',\n\t'Shaena',\n\t'Jamine',\n\t'Rasheena',\n\t'Tashi',\n\t'Magdala',\n\t'Edia',\n\t'Lasheka',\n\t'Tiasha',\n\t'Quanita',\n\t'Jomayra',\n\t'Nairoby',\n\t'Danamarie',\n\t'Roena',\n\t'Zasha',\n\t'Shatema',\n\t'Orissa',\n\t'Elvire',\n\t'Louisiana',\n\t'Hoda',\n\t'Kashana',\n\t'Jaquanna',\n\t'Jacqulin',\n\t'Annamari',\n\t'Marquia',\n\t'Elmire',\n\t'Viney',\n\t'Sonna',\n\t'Yokasta',\n\t'Esma',\n\t'Rella',\n\t'Deloras',\n\t'Janill',\n\t'Samanthan',\n\t'Ketsia',\n\t'Chaunte',\n\t'Aderonke',\n\t'Sheindel',\n\t'Shameen',\n\t'Karema',\n\t'Amalin',\n\t'Glendaliz',\n\t'Finesse',\n\t'Talibah',\n\t'Lakima',\n\t'Geeta',\n\t'Suehay',\n\t'Dorice',\n\t'Aesha',\n\t'Lateasha',\n\t'Kimitra',\n\t'Omolola',\n\t'Bobbette',\n\t'Deliah',\n\t'Carianne',\n\t'Chanah',\n\t'Laquandra',\n\t'Laquanna',\n\t'Yanick',\n\t'Nathifa',\n\t'Nakima',\n\t'Gayl',\n\t'Shamaine',\n\t'Saquana',\n\t'Nixzaliz',\n\t'Chaye',\n\t'Maleka',\n\t'Latima',\n\t'Yamira',\n\t'Tashanna',\n\t'Kathiria',\n\t'Jameika',\n\t'Jamesetta',\n\t'Moniqua',\n\t'Yamaris',\n\t'Tasheba',\n\t'Virgina',\n\t'Aviance',\n\t'Calogera',\n\t'Candita',\n\t'Kinga',\n\t'Alissia',\n\t'Onnolee',\n\t'Johnda',\n\t'Sebastiana',\n\t'Michelena',\n\t'Tecla',\n\t'Mirriam',\n\t'Sydel',\n\t'Glema',\n\t'Tatiyanna',\n\t'Patrycia',\n\t'Fortuna',\n\t'Ebba',\n\t'Carmelia',\n\t'Liddie',\n\t'Genella',\n\t'Detta',\n\t'Malvery',\n\t'Evelene',\n\t'Loretto',\n\t'Nunziata',\n\t'Jenan',\n\t'Keshawna',\n\t'Kinisha',\n\t'Tikia',\n\t'Sueanne',\n\t'Cira',\n\t'Charda',\n\t'Midge',\n\t'Annina',\n\t'Delcina',\n\t'Barbette',\n\t'Danah',\n\t'Isolina',\n\t'Tanita',\n\t'Gracemarie',\n\t'Halleigh',\n\t'Julita',\n\t'Kaprice',\n\t'Dorothyann',\n\t'Binnie',\n\t'Bettyjean',\n\t'Frayda',\n\t'Tashiana',\n\t'Breshey',\n\t'Charnise',\n\t'Tashena',\n\t'Meribeth',\n\t'Sandralee',\n\t'Heena',\n\t'Walda',\n\t'Latika',\n\t'Rashaunda',\n\t'Linde',\n\t'Rosaleen',\n\t'Illona',\n\t'Clydette',\n\t'Benay',\n\t'Damonica',\n\t'Anajah',\n\t'Louelle',\n\t'Lunette',\n\t'Faduma',\n\t'Nadeige',\n\t'Meylin',\n\t'Elverna',\n\t'Etrulia',\n\t'Ellaree',\n\t'Rushie',\n\t'Jayona',\n\t'Mauri',\n\t'Radiah',\n\t'Runette',\n\t'Terrah',\n\t'Joia',\n\t'Ezma',\n\t'Glenys',\n\t'Ramla',\n\t'Shatasha',\n\t'Berma',\n\t'Chanteria',\n\t'Chantrell',\n\t'Elvi',\n\t'Sharnell',\n\t'Rether',\n\t'Keshana',\n\t'Ranesha',\n\t'Earther',\n\t'Zahirah',\n\t'Anye',\n\t'Khori',\n\t'Saniyyah',\n\t'Teniola',\n\t'Anniemae',\n\t'Oluwadamilola',\n\t'Aldene',\n\t'Amellia',\n\t'Junice',\n\t'Carolene',\n\t'Ireoluwa',\n\t'Nasra',\n\t'Vernease',\n\t'Delrose',\n\t'Marysue',\n\t'Mirlande',\n\t'Lashannon',\n\t'Taijah',\n\t'Markiesha',\n\t'Syanne',\n\t'Jahiya',\n\t'Vyonne',\n\t'Reniya',\n\t'Ryana',\n\t'Idonia',\n\t'Loette',\n\t'Etheleen',\n\t'Ariyon',\n\t'Jeneane',\n\t'Jamea',\n\t'Airyana',\n\t'Natesha',\n\t'Bonnell',\n\t'Savilla',\n\t'Daneshia',\n\t'Deneshia',\n\t'Alexzandrea',\n\t'Martharee',\n\t'Elfreda',\n\t'Danyla',\n\t'Retaj',\n\t'Childnotnamed',\n\t'Kariana',\n\t'Ladeja',\n\t'Johnesha',\n\t'Nariya',\n\t'Zamariah',\n\t'Shanyla',\n\t'Zykiria',\n\t'Micaella',\n\t'Angeliyah',\n\t'Camara',\n\t'Kenniyah',\n\t'Keyani',\n\t'Renie',\n\t'Aldena',\n\t'Paytyn',\n\t'Perma',\n\t'Annamary',\n\t'Roniyah',\n\t'Zeniya',\n\t'Capitola',\n\t'Jaiana',\n\t'Lakiya',\n\t'Reida',\n\t'Ahniya',\n\t'Elanor',\n\t'Dorothee',\n\t'Joud',\n\t'Ludmilla',\n\t'Traniyah',\n\t'Kjerstin',\n\t'Jeylin',\n\t'Teona',\n\t'Marypat',\n\t'Jacquelynne',\n\t'Harmonii',\n\t'Kenyah',\n\t'Anora',\n\t'Deniyah',\n\t'Tyleah',\n\t'Samora',\n\t'Almeter',\n\t'Floride',\n\t'Lether',\n\t'Aviah',\n\t'Livie',\n\t'Federica',\n\t'Khalani',\n\t'Dericka',\n\t'Ronisue',\n\t'Raziah',\n\t'Emaya',\n\t'Christyana',\n\t'Rasheka',\n\t'Jahira',\n\t'Jalana',\n\t'Lateria',\n\t'Baneen',\n\t'Davisha',\n\t'Joyanna',\n\t'Janelys',\n\t'Raneisha',\n\t'Israa',\n\t'Shauntavia',\n\t'Shericka',\n\t'Deloma',\n\t'Maryetta',\n\t'Jeannetta',\n\t'Tymber',\n\t'Charmon',\n\t'Lanise',\n\t'Charlisa',\n\t'Bloneva',\n\t'Andrena',\n\t'Katena',\n\t'Latorria',\n\t'Letoya',\n\t'Quovadis',\n\t'Lakeisa',\n\t'Sihaam',\n\t'Charo',\n\t'Annaclara',\n\t'Margretta',\n\t'Nataki',\n\t'Tyjae',\n\t'Bahja',\n\t'Shequila',\n\t'Quadira',\n\t'Toinette',\n\t'Sumeya',\n\t'Takita',\n\t'Sherlonda',\n\t'Daejah',\n\t'Zyanna',\n\t'Antonique',\n\t'Linnae',\n\t'Georgean',\n\t'Charlane',\n\t'Jakerria',\n\t'Nimo',\n\t'Saprina',\n\t'Detrice',\n\t'Nicolly',\n\t'Nayara',\n\t'Seandra',\n\t'Demetrica',\n\t'Kayton',\n\t'Jalayna',\n\t'Emanuelly',\n\t'Dondra',\n\t'Michaeleen',\n\t'Aquinnah',\n\t'Lakrisha',\n\t'Latoia',\n\t'Bernessia',\n\t'Jaydaliz',\n\t'Deona',\n\t'Donyelle',\n\t'Kearsten',\n\t'Tashira',\n\t'Kaisa',\n\t'Korrin',\n\t'Onelia',\n\t'Shawntia',\n\t'Faylene',\n\t'Nafeesah',\n\t'Synetta',\n\t'Robertine',\n\t'Krystn',\n\t'Nyjae',\n\t'Nijae',\n\t'Cieara',\n\t'Ellerie',\n\t'Thomasenia',\n\t'Tiki',\n\t'Lougenia',\n\t'Joeann',\n\t'Marlyss',\n\t'Saralee',\n\t'Dayona',\n\t'Alainna',\n\t'Gennell',\n\t'Berline',\n\t'Latoiya',\n\t'Eyvonne',\n\t'Cherline',\n\t'Tequesta',\n\t'Loann',\n\t'Kerstyn',\n\t'Najmo',\n\t'Shanitra',\n\t'Marnice',\n\t'Tamyah',\n\t'Ave',\n\t'Cierrah',\n\t'Deborahann',\n\t'Davette',\n\t'Kennidy',\n\t'Breelle',\n\t'Lundon',\n\t'Imoni',\n\t'Shamyah',\n\t'Lindia',\n\t'Caylyn',\n\t'Ghadeer',\n\t'Amirrah',\n\t'Arlayne',\n\t'Norrine',\n\t'Vondell',\n\t'Ruqaya',\n\t'Azariya',\n\t'Narice',\n\t'Glenadine',\n\t'Lallie',\n\t'Conola',\n\t'Airlie',\n\t'Lorelie',\n\t'Levis',\n\t'Sanyia',\n\t'Mckaela',\n\t'Arlina',\n\t'Dellar',\n\t'Zorianna',\n\t'Zanyiah',\n\t'Maleya',\n\t'Niyana',\n\t'Amonie',\n\t'Aryia',\n\t'Autie',\n\t'Keileigh',\n\t'Kyndel',\n\t'Saliyah',\n\t'Naziah',\n\t'Bernette',\n\t'Vona',\n\t'Venie',\n\t'Tyashia',\n\t'Khaliya',\n\t'Mckensie',\n\t'Kerigan',\n\t'Kaniah',\n\t'Eria',\n\t'Maziyah',\n\t'Kiasia',\n\t'Anice',\n\t'Dera',\n\t'Georgena',\n\t'Ezelle',\n\t'Eavan',\n\t'Marlyne',\n\t'Lovella',\n\t'Westonia',\n\t'Keniah',\n\t'Janiaya',\n\t'Mertice',\n\t'Marget',\n\t'Zyeria',\n\t'Marquerite',\n\t'Minha',\n\t'Redonna',\n\t'Deetta',\n\t'Aiyla',\n\t'Majel',\n\t'Elnor',\n\t'Deronda',\n\t'Viona',\n\t'Rosaleigh',\n\t'Virgiline',\n\t'Reeda',\n\t'Minnah',\n\t'Keerthi',\n\t'Kaleyah',\n\t'Myanna',\n\t'Remas',\n\t'Noralee',\n\t'Idabelle',\n\t'Albena',\n\t'Ellory',\n\t'Areej',\n\t'Zariel',\n\t'Laverle',\n\t'Hjordis',\n\t'Hilja',\n\t'Ragna',\n\t'Cordella',\n\t'Irean',\n\t'Ottilia',\n\t'Gerane',\n\t'Locklyn',\n\t'Equilla',\n\t'Dellie',\n\t'Aarvi',\n\t'Mardella',\n\t'Leighanna',\n\t'Theone',\n\t'Ordella',\n\t'Lidwina',\n\t'Alyda',\n\t'Arlyss',\n\t'Evangelita',\n\t'Hee',\n\t'Cherell',\n\t'Charelle',\n\t'Shealynn',\n\t'Anesha',\n\t'Jasman',\n\t'Stephie',\n\t'Ok',\n\t'Tacarra',\n\t'Sharnita',\n\t'Jessic',\n\t'Dulcey',\n\t'Natina',\n\t'Sharvae',\n\t'Nachelle',\n\t'Jillane',\n\t'Tarri',\n\t'Ajena',\n\t'Allexus',\n\t'Labrenda',\n\t'Pammy',\n\t'Shemeika',\n\t'Ysela',\n\t'Meghin',\n\t'Marketta',\n\t'Porshe',\n\t'Kayti',\n\t'Taylour',\n\t'Shavonte',\n\t'Aivah',\n\t'Khloi',\n\t'Jerzie',\n\t'Nikesha',\n\t'Cherron',\n\t'Coralynn',\n\t'Alvita',\n\t'Carlita',\n\t'Albany',\n\t'Deshawnda',\n\t'Lacole',\n\t'Lameeka',\n\t'Mashawn',\n\t'Kimyata',\n\t'Keenya',\n\t'Baya',\n\t'Kiva',\n\t'Samona',\n\t'Meggin',\n\t'Chanita',\n\t'Danissa',\n\t'Lileigh',\n\t'Addeline',\n\t'Shemeeka',\n\t'Aprille',\n\t'Donice',\n\t'Tannisha',\n\t'Angelette',\n\t'Lakeita',\n\t'Marcelyn',\n\t'Lesta',\n\t'Claudene',\n\t'Marney',\n\t'Tonyia',\n\t'Nellora',\n\t'Kimyetta',\n\t'Ameliana',\n\t'Electa',\n\t'Sherl',\n\t'Jeniece',\n\t'Jawana',\n\t'Errica',\n\t'Braya',\n\t'Titania',\n\t'Guydra',\n\t'Valeta',\n\t'Danetta',\n\t'Sharia',\n\t'Hawraa',\n\t'Danaja',\n\t'Makalynn',\n\t'Tayonna',\n\t'Kyrene',\n\t'Arieona',\n\t'Dallie',\n\t'Ruie',\n\t'Ophia',\n\t'Odella',\n\t'Vessie',\n\t'Offie',\n\t'Evadean',\n\t'Ample',\n\t'Aleecia',\n\t'Shakyla',\n\t'Makynna',\n\t'Lakyra',\n\t'Korryn',\n\t'Araina',\n\t'Semiyah',\n\t'Ndea',\n\t'Areonna',\n\t'Jasia',\n\t'Xavia',\n\t'Merikay',\n\t'Keshara',\n\t'Jennetta',\n\t'Vergene',\n\t'Wilodean',\n\t'Wyona',\n\t'Avonell',\n\t'Datha',\n\t'Ellar',\n\t'Morene',\n\t'Laverda',\n\t'Loetta',\n\t'Emmogene',\n\t'Arbadella',\n\t'Camaria',\n\t'Rochella',\n\t'Indiya',\n\t'Shayma',\n\t'Orneta',\n\t'Clotene',\n\t'Genoa',\n\t'Lanyah',\n\t'Oneda',\n\t'Glendola',\n\t'Rosala',\n\t'Zelphia',\n\t'Suda',\n\t'Jerrilynn',\n\t'Orlena',\n\t'Lorella',\n\t'Bernadean',\n\t'Novice',\n\t'Pheba',\n\t'Rukaya',\n\t'Gathel',\n\t'Meron',\n\t'Asianae',\n\t'Arriel',\n\t'Whisper',\n\t'Talesha',\n\t'Morgann',\n\t'Madissen',\n\t'Dajanay',\n\t'Karil',\n\t'Sherrita',\n\t'Chery',\n\t'Lezlee',\n\t'Daytona',\n\t'Raegen',\n\t'Dalal',\n\t'Majerle',\n\t'Lama',\n\t'Daijanae',\n\t'Celicia',\n\t'Cheril',\n\t'Cornesha',\n\t'Aniza',\n\t'Clytie',\n\t'Persis',\n\t'Aino',\n\t'Lawandra',\n\t'Deshonda',\n\t'Catrena',\n\t'Temekia',\n\t'Camella',\n\t'Arnetra',\n\t'Latoyna',\n\t'Tekisha',\n\t'Nalee',\n\t'Jennife',\n\t'Daphanie',\n\t'Shewanda',\n\t'Cheronda',\n\t'Latayna',\n\t'Almerinda',\n\t'Danene',\n\t'Jadwiga',\n\t'Ellora',\n\t'Tanga',\n\t'Tamekka',\n\t'Lashond',\n\t'Shinika',\n\t'Khyleigh',\n\t'Baelyn',\n\t'Clarene',\n\t'Monyette',\n\t'Lakisa',\n\t'Audreyanna',\n\t'Malayjah',\n\t'Keia',\n\t'Lajessica',\n\t'Marquite',\n\t'Odessia',\n\t'Marketia',\n\t'Malayshia',\n\t'Laconya',\n\t'Brayla',\n\t'Germani',\n\t'Luberdie',\n\t'Angla',\n\t'Cona',\n\t'Katrinia',\n\t'Shaletha',\n\t'Eutha',\n\t'Elmyra',\n\t'Cleva',\n\t'Elnore',\n\t'Vila',\n\t'Evone',\n\t'Margert',\n\t'Pairlee',\n\t'Bernelle',\n\t'Diannie',\n\t'Alinda',\n\t'Emerine',\n\t'Rogena',\n\t'Genette',\n\t'Jearline',\n\t'Estalee',\n\t'Bertina',\n\t'Cassand',\n\t'Kisa',\n\t'Veronic',\n\t'Idalina',\n\t'Walsie',\n\t'Gwendol',\n\t'Orvilla',\n\t'Latonga',\n\t'Elizabe',\n\t'Bernece',\n\t'Charlen',\n\t'Dola',\n\t'Alaija',\n\t'Martia',\n\t'Shanica',\n\t'Shariya',\n\t'Yuliya',\n\t'Atleigh',\n\t'Flannery',\n\t'Loeta',\n\t'Zakiah',\n\t'Alayia',\n\t'Glee',\n\t'Embree',\n\t'Kasidy',\n\t'Zacaria',\n\t'Derriona',\n\t'Jakyria',\n\t'Kiauna',\n\t'Garnelle',\n\t'Tyriana',\n\t'Juliya',\n\t'Maddisen',\n\t'Auna',\n\t'Jameisha',\n\t'Lurleen',\n\t'Kourtlyn',\n\t'Chelan',\n\t'Verlinda',\n\t'Sherria',\n\t'Alzada',\n\t'Ketara',\n\t'Anaka',\n\t'Breion',\n\t'Shadestiny',\n\t'Shanterica',\n\t'Tenia',\n\t'Keiosha',\n\t'Jamyriah',\n\t'Jamyrie',\n\t'Jalacia',\n\t'Ronita',\n\t'Maryln',\n\t'Earsie',\n\t'Kyri',\n\t'Markiyah',\n\t'Malajah',\n\t'Alandria',\n\t'Shaquitta',\n\t'Raymona',\n\t'Paeton',\n\t'Yaritzy',\n\t'Jonesha',\n\t'Anda',\n\t'Khadjah',\n\t'Amyree',\n\t'Vernestine',\n\t'Lavetta',\n\t'Jniya',\n\t'Shakiyah',\n\t'Aasia',\n\t'Roniya',\n\t'Keleigh',\n\t'Makalyn',\n\t'Kadasia',\n\t'Johneisha',\n\t'Jakaya',\n\t'Kinzey',\n\t'Wendelyn',\n\t'Darielys',\n\t'Wyteria',\n\t'Yarieliz',\n\t'Taysia',\n\t'Carmya',\n\t'Erionna',\n\t'Shameria',\n\t'Kearia',\n\t'Graycie',\n\t'Jurnie',\n\t'Calypso',\n\t'Finlee',\n\t'Fynlee',\n\t'Sophee',\n\t'Lorali',\n\t'Shacoria',\n\t'Kadeejah',\n\t'Lakira',\n\t'Kelsay',\n\t'Angelys',\n\t'Moeshia',\n\t'Keundra',\n\t'Mayara',\n\t'Josi',\n\t'Annaluiza',\n\t'Jacquese',\n\t'Jillaine',\n\t'Annajulia',\n\t'Nayeliz',\n\t'Maire',\n\t'Jamonica',\n\t'Jadalys',\n\t'Missie',\n\t'Machell',\n\t'Liisa',\n\t'Jalaine',\n\t'Odester',\n\t'Veria',\n\t'Virda',\n\t'Arleene',\n\t'Cigi',\n\t'Eloda',\n\t'Kacelyn',\n\t'Cidalia',\n\t'Vadie',\n\t'Wydell',\n\t'Donnita',\n\t'Lousie',\n\t'Oreatha',\n\t'Berdine',\n\t'Cielita',\n\t'Lilas',\n\t'Verneda',\n\t'Armelia',\n\t'Glender',\n\t'Elizbeth',\n\t'Vanella',\n\t'Florean',\n\t'Vyolet',\n\t'Albertia',\n\t'Albirda',\n\t'Sylva',\n\t'Lakresha',\n\t'Matha',\n\t'Nerine',\n\t'Dezzie',\n\t'Lodell',\n\t'Rosielee',\n\t'Julane',\n\t'Lodena',\n\t'Brookley',\n\t'Kynadi',\n\t'Krymson',\n\t'Etoile',\n\t'Meighan',\n\t'Izella',\n\t'Jakaria',\n\t'Jaleria',\n\t'Clister',\n\t'Alberdia',\n\t'Zykeriah',\n\t'Mileigh',\n\t'Isola',\n\t'Mamye',\n\t'Eller',\n\t'Kamoria',\n\t'Lakelynn',\n\t'Aslean',\n\t'Bular',\n\t'Emmaclaire',\n\t'Dasie',\n\t'Denotra',\n\t'Everlene',\n\t'Lynleigh',\n\t'Iantha',\n\t'Quinetta',\n\t'Lillion',\n\t'Sophronia',\n\t'Japonica',\n\t'Beauty',\n\t'Pearlina',\n\t'Evella',\n\t'Jatana',\n\t'Kechia',\n\t'Conswella',\n\t'Malissia',\n\t'Alexina',\n\t'Demeka',\n\t'Muguette',\n\t'Vaudine',\n\t'Aprill',\n\t'Villa',\n\t'Florece',\n\t'Tonjia',\n\t'Bethania',\n\t'Makinlee',\n\t'Latondra',\n\t'Audery',\n\t'Ericia',\n\t'Miyoshi',\n\t'Betti',\n\t'Harlym',\n\t'Novelle',\n\t'Liller',\n\t'Pinkey',\n\t'Narcille',\n\t'Lasheika',\n\t'Leonise',\n\t'Lydie',\n\t'Olla',\n\t'Rejeanne',\n\t'Athelene',\n\t'Eloyse',\n\t'Edolia',\n\t'Clotile',\n\t'Ethelrine',\n\t'Devonda',\n\t'Nakeshia',\n\t'Tomesha',\n\t'Orena',\n\t'Karlyne',\n\t'Enolia',\n\t'Faynell',\n\t'Margia',\n\t'Marvelene',\n\t'Justilia',\n\t'Iceola',\n\t'Shantina',\n\t'Shinita',\n\t'Loula',\n\t'Ireta',\n\t'Vanessia',\n\t'Ramonia',\n\t'Monita',\n\t'Shalva',\n\t'Ong',\n\t'Remonia',\n\t'Sheral',\n\t'Angelean',\n\t'Phyllistine',\n\t'Brenetta',\n\t'Madgeline',\n\t'Zyairah',\n\t'Anjolaoluwa',\n\t'Clotiel',\n\t'Eldine',\n\t'Tylia',\n\t'Ifeoluwa',\n\t'Florestine',\n\t'Althia',\n\t'Ravonda',\n\t'Tsion',\n\t'Zyaira',\n\t'Wylodene',\n\t'Janesha',\n\t'Vonciel',\n\t'Ruthey',\n\t'Khiana',\n\t'Kadesia',\n\t'Murdis',\n\t'Zhana',\n\t'Jillayne',\n\t'Quatisha',\n\t'Jaquasia',\n\t'Michaila',\n\t'Mashayla',\n\t'Travia',\n\t'Tyrika',\n\t'Aldah',\n\t'Makaiya',\n\t'Maridee',\n\t'Kyndell',\n\t'Nykira',\n\t'Mazell',\n\t'Luecile',\n\t'Quatasia',\n\t'Khala',\n\t'Sible',\n\t'Jakera',\n\t'Ovella',\n\t'Lealer',\n\t'Juleen',\n\t'Rinette',\n\t'Laykin',\n\t'Ozite',\n\t'Shaquanta',\n\t'Quanetta',\n\t'Shannyn',\n\t'Lacrystal',\n\t'Everline',\n\t'Editha',\n\t'Toneka',\n\t'Reinette',\n\t'Maclovia',\n\t'Ledia',\n\t'Shakeeka',\n\t'Shakeeta',\n\t'Taquanna',\n\t'Miyisha',\n\t'Patrecia',\n\t'Wylodean',\n\t'Solita',\n\t'Dalisa',\n\t'Jatoya',\n\t'Texanna',\n\t'Yvetta',\n\t'Lectoria',\n\t'Cyntrell',\n\t'Monyae',\n\t'Ibtisam',\n\t'Miski',\n\t'Renesha',\n\t'Maelle',\n\t'Azhar',\n\t'Zamzam',\n\t'Jamera',\n\t'Tyranika',\n\t'Ladan',\n\t'Ruweyda',\n\t'Jabrea',\n\t'Sherrica',\n\t'Clyda',\n\t'Treniece',\n\t'Fonnie',\n\t'Bedie',\n\t'Kewanda',\n\t'Mozel',\n\t'Tramika',\n\t'Quessie',\n\t'Tyshay',\n\t'Ladasha',\n\t'Kaarin',\n\t'Mazzie',\n\t'Genora',\n\t'Monie',\n\t'Muntas',\n\t'Hayat',\n\t'Jovanda',\n\t'Appolonia',\n\t'Cuma',\n\t'Briante',\n\t'Reneisha',\n\t'Zenovia',\n\t'Allysia',\n\t'Aliene',\n\t'Raini',\n\t'Tyja',\n\t'Iriel',\n\t'Deshante',\n\t'Shatira',\n\t'Demri',\n\t'Ajaysia',\n\t'Ireon',\n\t'Idil',\n\t'Nawaal',\n\t'Riham',\n\t'Nyeisha',\n\t'Jonique',\n\t'Keneisha',\n\t'Ravan',\n\t'Khadra',\n\t'Dawanna',\n\t'Gavriella',\n\t'Myrene',\n\t'Jasamine',\n\t'Brione',\n\t'Earlisha',\n\t'Dazia',\n\t'Jalesia',\n\t'Cabrina',\n\t'Marieme',\n\t'Gloristine',\n\t'Cattie',\n\t'Damilola',\n\t'Evora',\n\t'Almarie',\n\t'Vauda',\n\t'Tanzie',\n\t'Truby',\n\t'Tayona',\n\t'Francelia',\n\t'Brona',\n\t'Jannice',\n\t'Weltha',\n\t'Phylliss',\n\t'Vieva',\n\t'Danera',\n\t'Saratha',\n\t'Colinda',\n\t'Suzonne',\n\t'Shelene',\n\t'Shelda',\n\t'Annye',\n\t'Kaola',\n\t'Modine',\n\t'Velvie',\n\t'Vetra',\n\t'Tyrhonda',\n\t'Malissie',\n\t'Shemica',\n\t'Rockell',\n\t'Adgie',\n\t'Lachanda',\n\t'Kwanza',\n\t'Keyanta',\n\t'Hazeleen',\n\t'Yarnell',\n\t'Mettie',\n\t'Kissie',\n\t'Jawanna',\n\t'Ilham',\n\t'Enchantra',\n\t'Lucielle',\n\t'Salmo',\n\t'Sabrin',\n\t'Nicy',\n\t'Rubell',\n\t'Willet',\n\t'Ronata',\n\t'Semiko',\n\t'Idman',\n\t'Meoshia',\n\t'Maie',\n\t'Eulala',\n\t'Tiyonna',\n\t'Sabarin',\n\t'Merlie',\n\t'Oneka',\n\t'Khiya',\n\t'Geralene',\n\t'Hubbie',\n\t'Patches',\n\t'Robenia',\n\t'Carita',\n\t'Veleka',\n\t'Tamla',\n\t'Zondra',\n\t'Cheramie',\n\t'Nimco',\n\t'Chauntelle',\n\t'Calonia',\n\t'Mulki',\n\t'Clydia',\n\t'Glida',\n\t'Fartun',\n\t'Fardowsa',\n\t'Iyona',\n\t'Dwanna',\n\t'Angila',\n\t'Carletha',\n\t'Blakley',\n\t'Valecia',\n\t'Songa',\n\t'Shya',\n\t'Kamber',\n\t'Siah',\n\t'Sloka',\n\t'Sophiagrace',\n\t'Sophiamarie',\n\t'Setayesh',\n\t'Roselie',\n\t'Samhitha',\n\t'Savreen',\n\t'Zanayah',\n\t'Yilia',\n\t'Zareena',\n\t'Yeilin',\n\t'Ulyana',\n\t'Tylie',\n\t'Vaani',\n\t'Vasilisa',\n\t'Videl',\n\t'Xylia',\n\t'Rubylee',\n\t'Jessye',\n\t'Itasca',\n\t'Bonifacia',\n\t'Bennye',\n\t'Estellene',\n\t'Daycee',\n\t'Vung',\n\t'Babe',\n\t'Lucyle',\n\t'Laurencia',\n\t'Frankye',\n\t'Clariece',\n\t'Alsace',\n\t'Ernesteen',\n\t'Zuma',\n\t'Loleta',\n\t'Matiana',\n\t'Thyra',\n\t'Thekla',\n\t'Miladie',\n\t'Moselle',\n\t'Waldene',\n\t'Thula',\n\t'Ethelda',\n\t'Elbira',\n\t'Eddye',\n\t'Lafaye',\n\t'Beryle',\n\t'Beanna',\n\t'Basilisa',\n\t'Bernardina',\n\t'Vontressa',\n\t'Elner',\n\t'Gladine',\n\t'Saketha',\n\t'Nellene',\n\t'Margurette',\n\t'Levada',\n\t'Alcie',\n\t'Beuna',\n\t'Miaa',\n\t'Miia',\n\t'Miral',\n\t'Lunabella',\n\t'Manvi',\n\t'Nahlia',\n\t'Quetzal',\n\t'Preet',\n\t'Navreet',\n\t'Prajna',\n\t'Analayah',\n\t'Aalaya',\n\t'Aaleah',\n\t'Aaria',\n\t'Aby',\n\t'Adeena',\n\t'Adelaine',\n\t'Adhara',\n\t'Alekhya',\n\t'Avaline',\n\t'Avina',\n\t'Azaliah',\n\t'Azayla',\n\t'Anwita',\n\t'Arna',\n\t'Asmi',\n\t'Cutina',\n\t'Jaydalynn',\n\t'Jerusalem',\n\t'Hiyab',\n\t'Icey',\n\t'Jaanvi',\n\t'Khalessi',\n\t'Khiara',\n\t'Leelah',\n\t'Ketzaly',\n\t'Kaliyanei',\n\t'Karolynn',\n\t'Kaylonnie',\n\t'Harveen',\n\t'Danilynn',\n\t'Decklyn',\n\t'Deleyza',\n\t'Charm',\n\t'Calina',\n\t'Cathaleya',\n\t'Dailynn',\n\t'Corra',\n\t'Cyrene',\n\t'Eveleen',\n\t'Fia',\n\t'Galina',\n\t'Gohar',\n\t'Gursirat',\n\t'Harleyquinn',\n\t'Evalin',\n\t'Eevee',\n\t'Eira',\n\t'Elara',\n\t'Ellaina',\n\t'Ellarose',\n\t'Erabella',\n\t'Teofila',\n\t'Calamity',\n\t'Sherion',\n\t'Niang',\n\t'Oreta',\n\t'Leita',\n\t'Maedelle',\n\t'Othello',\n\t'Meshell',\n\t'Alfreida',\n\t'Detria',\n\t'Cloda',\n\t'Ermine',\n\t'Gertrudes',\n\t'Zudora',\n\t'Benigna',\n\t'Dolorez',\n\t'Narcissa',\n\t'Eduviges',\n\t'Dionisia',\n\t'Crisanta',\n\t'Adreena',\n\t'Aivy',\n\t'Sharanda',\n\t'Amma',\n\t'Danitra',\n\t'Lashuna',\n\t'Yasheka',\n\t'Sheronica',\n\t'Ameliya',\n\t'Cayetana',\n\t'Benancia',\n\t'Tiya',\n\t'Umaiza',\n\t'Vicktoria',\n\t'Vidushi',\n\t'Yaretzie',\n\t'Siennah',\n\t'Sofiah',\n\t'Stuti',\n\t'Taitum',\n\t'Yuli',\n\t'Zarya',\n\t'Zeriah',\n\t'Sadiee',\n\t'Rubee',\n\t'Ryenn',\n\t'Sayana',\n\t'Ezabella',\n\t'Galya',\n\t'Hayzel',\n\t'Evalette',\n\t'Eleanna',\n\t'Elize',\n\t'Elleana',\n\t'Hiya',\n\t'Jezabelle',\n\t'Jazzy',\n\t'Jeraldin',\n\t'Jocabed',\n\t'Kaloni',\n\t'Jazmeen',\n\t'Jasmarie',\n\t'Ilani',\n\t'Ilany',\n\t'Ariannie',\n\t'Angelinne',\n\t'Delaynie',\n\t'Calise',\n\t'Bethlehem',\n\t'Cateleya',\n\t'Paitynn',\n\t'Peytin',\n\t'Rainie',\n\t'Rhylin',\n\t'Rosaly',\n\t'Nomi',\n\t'Mirai',\n\t'Moksha',\n\t'Mylin',\n\t'Nazeli',\n\t'Nilani',\n\t'Marcelene',\n\t'Victorina',\n\t'Laiah',\n\t'Leeyah',\n\t'Miaisabella',\n\t'Ravleen',\n\t'Lazara',\n\t'Zuleidy',\n\t'Shraddha',\n\t'Simarpreet',\n\t'Rinoa',\n\t'Ridhima',\n\t'Ryla',\n\t'Ryleeann',\n\t'Ryli',\n\t'Sahori',\n\t'Smrithi',\n\t'Yeslin',\n\t'Yanessa',\n\t'Zeltzin',\n\t'Sonakshi',\n\t'Sophea',\n\t'Carlissa',\n\t'Bryttani',\n\t'Albesa',\n\t'Bonnye',\n\t'Daksha',\n\t'Terria',\n\t'Davinah',\n\t'Enalina',\n\t'Evolette',\n\t'Dhwani',\n\t'Eleora',\n\t'Leea',\n\t'Lexii',\n\t'Meilyn',\n\t'Nevah',\n\t'Noga',\n\t'Prabhleen',\n\t'Quinley',\n\t'Mursal',\n\t'Naiara',\n\t'Navah',\n\t'Izumi',\n\t'Janelli',\n\t'Jniyah',\n\t'Klaryssa',\n\t'Kritika',\n\t'Laksmi',\n\t'Lalani',\n\t'Joselle',\n\t'Kashish',\n\t'Kenyana',\n\t'Laquishia',\n\t'Deshonna',\n\t'Sentoria',\n\t'Ernestene',\n\t'Maxima',\n\t'Senovia',\n\t'Nestora',\n\t'Valta',\n\t'Casady',\n\t'Daphene',\n\t'Chonita',\n\t'Omelia',\n\t'Odena',\n\t'Melchora',\n\t'Quetzally',\n\t'Thera',\n\t'Gabina',\n\t'Donaciana',\n\t'Riddhima',\n\t'Lakessa',\n\t'Lakeeta',\n\t'Katasha',\n\t'Chaitra',\n\t'Chizara',\n\t'Aveyah',\n\t'Elah',\n\t'Eliannah',\n\t'Ellanore',\n\t'Emmalia',\n\t'Dalexa',\n\t'Delara',\n\t'Donatella',\n\t'Aubreanna',\n\t'Aberdeen',\n\t'Aerilyn',\n\t'Aleksia',\n\t'Annarose',\n\t'Anthea',\n\t'Aoi',\n\t'Amberrose',\n\t'Anaeli',\n\t'Lilou',\n\t'Lumen',\n\t'Manasvi',\n\t'Lillybeth',\n\t'Keylani',\n\t'Lenya',\n\t'Lidya',\n\t'Mulan',\n\t'Nirvi',\n\t'Ondine',\n\t'Meenakshi',\n\t'Mathea',\n\t'Melyna',\n\t'Io',\n\t'Izelle',\n\t'Jailia',\n\t'Eztli',\n\t'Gali',\n\t'Hade',\n\t'Hafsah',\n\t'Hannahgrace',\n\t'Kayleah',\n\t'Kayleeann',\n\t'Kemily',\n\t'Jeylah',\n\t'Jiaqi',\n\t'Sherrika',\n\t'Daffney',\n\t'Solstice',\n\t'Soriah',\n\t'Sumayya',\n\t'Saory',\n\t'Shaily',\n\t'Shanzay',\n\t'Sharvi',\n\t'Xylina',\n\t'Yeimy',\n\t'Yizel',\n\t'Zaidee',\n\t'Ziah',\n\t'Jesucita',\n\t'Madalena',\n\t'Vontresa',\n\t'Tangee',\n\t'Shekina',\n\t'Sista',\n\t'Norvis',\n\t'Winnell',\n\t'Yoshida',\n\t'Nikiya',\n\t'Vidala',\n\t'Shandria',\n\t'Rozelle',\n\t'Maragret',\n\t'Sixta',\n\t'Theta',\n\t'Wylma',\n\t'Jobita',\n\t'Gaudalupe',\n\t'Lurlean',\n\t'Oveta',\n\t'Heriberta',\n\t'Bacilia',\n\t'Senorina',\n\t'Denika',\n\t'Akeisha',\n\t'Tamecia',\n\t'Jera',\n\t'Crestina',\n\t'Shwanda',\n\t'Kelbie',\n\t'Sanayah',\n\t'Zaliah',\n\t'Nadezhda',\n\t'Maaliyah',\n\t'Mahaley',\n\t'Raziyah',\n\t'Saraiya',\n\t'Cyriah',\n\t'Chaniyah',\n\t'Emmarae',\n\t'Eleen',\n\t'Ashland',\n\t'Briniyah',\n\t'Ainhoa',\n\t'Aviyah',\n\t'Atarah',\n\t'Lutrelle',\n\t'Clevie',\n\t'Blossie',\n\t'Cola',\n\t'Para',\n\t'Verdelle',\n\t'Beddie',\n\t'Lilliemae',\n\t'Jurell',\n\t'Bertice',\n\t'Fozie',\n\t'Oppie',\n\t'Rozia',\n\t'Rozie',\n\t'Epsie',\n\t'Karman',\n\t'Estoria',\n\t'Dynesha',\n\t'Sarae',\n\t'Xolani',\n\t'Talyah',\n\t'Zanaria',\n\t'Zamiah',\n\t'Starkeisha',\n\t'Alys',\n\t'Izaria',\n\t'Cayenne',\n\t'Damiah',\n\t'Alwilda',\n\t'Leoda',\n\t'Yariah',\n\t'Tuleen',\n\t'Rhelda',\n\t'Carlesha',\n\t'Alfretta',\n\t'Orma',\n\t'Ornella',\n\t'Nazyia',\n\t'Samorah',\n\t'Keyonni',\n\t'Jeriyah',\n\t'Jazariyah',\n\t'Demaria',\n\t'Mikeyla',\n\t'Malania',\n\t'Miyanna',\n\t'Neriyah',\n\t'Naelle',\n\t'Lazariah',\n\t'Rea',\n\t'Annaya',\n\t'Aleanna',\n\t'Baylin',\n\t'Aela',\n\t'Emmilyn',\n\t'Anila',\n\t'Rodnesha',\n\t'Janeliz',\n\t'Kseniya',\n\t'Nyana',\n\t'Zemirah',\n\t'Somya',\n\t'Yanna',\n\t'Terryn',\n\t'Naika',\n\t'Laiyla',\n\t'Lyrica',\n\t'Loralie',\n\t'Lilya',\n\t'Wonnie',\n\t'Runelle',\n\t'Tynleigh',\n\t'Loralye',\n\t'Arynn',\n\t'Melvis',\n\t'Akiyah',\n\t'Matline',\n\t'Ellean',\n\t'Wylean',\n\t'Marfa',\n\t'Elliemae',\n\t'Nancey',\n\t'Waltina',\n\t'Ommie',\n\t'Lonia',\n\t'Reaver',\n\t'Virdell',\n\t'Rosabell',\n\t'Sarahgrace',\n\t'Faustine',\n\t'Euretha',\n\t'Sussie',\n\t'Rebie',\n\t'Oveline',\n\t'Reathel',\n\t'Algia',\n\t'Mylissa',\n\t'Rethel',\n\t'Nakyla',\n\t'Necia',\n\t'Deanie',\n\t'Beckey',\n\t'Yasmen',\n\t'Yukari',\n\t'Zamyra',\n\t'Roselinda',\n\t'Takeko',\n\t'Vicke',\n\t'Mckala',\n\t'Hanae',\n\t'Elley',\n\t'Ellyssa',\n\t'Geanna',\n\t'Geetika',\n\t'Elenoa',\n\t'Elane',\n\t'Deeya',\n\t'Deviny',\n\t'Genecis',\n\t'Jasminerose',\n\t'Ireri',\n\t'Hailei',\n\t'Hannya',\n\t'Harshini',\n\t'Holiday',\n\t'Arista',\n\t'Dannae',\n\t'Melayna',\n\t'Meleni',\n\t'Mystique',\n\t'Nathalya',\n\t'Natsumi',\n\t'Sharlize',\n\t'Shine',\n\t'Sindhu',\n\t'Starlyn',\n\t'Sarika',\n\t'Sarine',\n\t'Seleen',\n\t'Khalea',\n\t'Kirti',\n\t'Jocilyn',\n\t'Maille',\n\t'Mariaceleste',\n\t'Leelee',\n\t'Leidi',\n\t'Libertad',\n\t'Lizvet',\n\t'Kierstan',\n\t'Adja',\n\t'Debbye',\n\t'Dorenda',\n\t'Kiyono',\n\t'Katsuko',\n\t'Katsue',\n\t'Misue',\n\t'Umeno',\n\t'Rayvin',\n\t'Sachie',\n\t'Kinue',\n\t'Danajah',\n\t'Denay',\n\t'Tsuneko',\n\t'Tamae',\n\t'Saeko',\n\t'Tsutako',\n\t'Sumako',\n\t'Momoe',\n\t'Tomoko',\n\t'Asae',\n\t'Nautika',\n\t'Kourtnee',\n\t'Keauna',\n\t'Maydeen',\n\t'Chianne',\n\t'Macala',\n\t'Briaunna',\n\t'Ceirra',\n\t'Kimberlea',\n\t'Normalinda',\n\t'Milinda',\n\t'Jonetta',\n\t'Seleta',\n\t'Chryl',\n\t'Aaminah',\n\t'Mersades',\n\t'Mickenzie',\n\t'Tahlor',\n\t'Kimetha',\n\t'Hopie',\n\t'Guadulupe',\n\t'Blakelynn',\n\t'Orfelinda',\n\t'Aubre',\n\t'Ajayla',\n\t'Makenlee',\n\t'Journii',\n\t'Janayla',\n\t'Talulah',\n\t'Siddhi',\n\t'Shaira',\n\t'Yuridiana',\n\t'Yulitza',\n\t'Tulsi',\n\t'Yatana',\n\t'Jaleya',\n\t'Ayrianna',\n\t'Damaya',\n\t'Myana',\n\t'Lanyiah',\n\t'Kadince',\n\t'Aunna',\n\t'Avrielle',\n\t'Khyli',\n\t'Kariyah',\n\t'Bralynn',\n\t'Derrianna',\n\t'Maryella',\n\t'Charlynn',\n\t'Ilma',\n\t'Tresea',\n\t'Mersadies',\n\t'Macenzie',\n\t'Terriona',\n\t'Telia',\n\t'Tamryn',\n\t'Tahari',\n\t'Solyana',\n\t'Lyrical',\n\t'Akie',\n\t'Teruyo',\n\t'Shizuyo',\n\t'Tsuruyo',\n\t'Daviona',\n\t'Marshelia',\n\t'Connye',\n\t'Marka',\n\t'Adelmira',\n\t'Dorelia',\n\t'Nirel',\n\t'Oceanna',\n\t'Neeka',\n\t'Sherolyn',\n\t'Sheralyn',\n\t'Sharlet',\n\t'Milenka',\n\t'Astha',\n\t'Angeleena',\n\t'Anysia',\n\t'Apoorva',\n\t'Bryanah',\n\t'Carolyna',\n\t'Cecy',\n\t'Anadalay',\n\t'Akaylah',\n\t'Aika',\n\t'Aasha',\n\t'Ahniah',\n\t'Adelayda',\n\t'Kyaira',\n\t'Manmeet',\n\t'Linsy',\n\t'Malini',\n\t'Mairany',\n\t'Haeley',\n\t'Evelen',\n\t'Jezel',\n\t'Jinelle',\n\t'Joleena',\n\t'Hikari',\n\t'Inari',\n\t'Itcel',\n\t'Lokelani',\n\t'Keikilani',\n\t'Sherilynn',\n\t'Jamieann',\n\t'Lajuanna',\n\t'Roselind',\n\t'Rhetta',\n\t'Alysah',\n\t'Ameyalli',\n\t'Abigayl',\n\t'Aizza',\n\t'Alaiza',\n\t'Aslyn',\n\t'Anjalee',\n\t'Annaliza',\n\t'Antara',\n\t'Areen',\n\t'Carra',\n\t'Katieann',\n\t'Kimla',\n\t'Xan',\n\t'Mikiala',\n\t'Chrissa',\n\t'Belanna',\n\t'Ankitha',\n\t'Celestial',\n\t'Chiana',\n\t'Akhila',\n\t'Alique',\n\t'Alyssamae',\n\t'Betheny',\n\t'Stepheny',\n\t'Brittanyann',\n\t'Adonna',\n\t'Barbarella',\n\t'Shalamar',\n\t'Flecia',\n\t'Dlisa',\n\t'Anabelia',\n\t'Velen',\n\t'Xotchil',\n\t'Yairis',\n\t'Lytzy',\n\t'Faizah',\n\t'Eilleen',\n\t'Elona',\n\t'Esteffany',\n\t'Jesyka',\n\t'Jhovana',\n\t'Jisell',\n\t'Joclyn',\n\t'Teel',\n\t'Sundee',\n\t'Mechell',\n\t'Lisia',\n\t'Nandita',\n\t'Natalina',\n\t'Nattalie',\n\t'Rosaelena',\n\t'Siclali',\n\t'Skyllar',\n\t'Taeya',\n\t'Sadey',\n\t'Sadira',\n\t'Sanae',\n\t'Serenah',\n\t'Shamila',\n\t'Brizza',\n\t'Chalisa',\n\t'Shakeela',\n\t'Gordean',\n\t'Akane',\n\t'Akansha',\n\t'Angeni',\n\t'Annalina',\n\t'Anushree',\n\t'Allexa',\n\t'Katelynd',\n\t'Raenette',\n\t'Airiel',\n\t'Matina',\n\t'Teira',\n\t'Deatra',\n\t'Darolyn',\n\t'Hilliary',\n\t'Roanna',\n\t'Prissy',\n\t'Monya',\n\t'Armelinda',\n\t'Ginnie',\n\t'Darenda',\n\t'Leslea',\n\t'Marcedes',\n\t'Jeweliana',\n\t'Jewelissa',\n\t'Josselyne',\n\t'Lavanya',\n\t'Koryn',\n\t'Khushpreet',\n\t'Kierah',\n\t'Cyana',\n\t'Deeana',\n\t'Bibianna',\n\t'Bryannah',\n\t'Heidie',\n\t'Desteni',\n\t'Elleanna',\n\t'Sierah',\n\t'Sumedha',\n\t'Shantall',\n\t'Yarissa',\n\t'Yerania',\n\t'Tifanny',\n\t'Mehek',\n\t'Mirely',\n\t'Mitra',\n\t'Mar',\n\t'Rohini',\n\t'Prerana',\n\t'Naizeth',\n\t'Naydeli',\n\t'Melveen',\n\t'Moani',\n\t'Endora',\n\t'Jackquline',\n\t'Stefanny',\n\t'Tamanna',\n\t'Sofija',\n\t'Zitlalic',\n\t'Ymani',\n\t'Jumana',\n\t'Kailene',\n\t'Josephyne',\n\t'Leiya',\n\t'Letzy',\n\t'Litsy',\n\t'Lizbett',\n\t'Lizveth',\n\t'Jaiya',\n\t'Dreanna',\n\t'Celestia',\n\t'Electra',\n\t'Sevanna',\n\t'Sidnie',\n\t'Semone',\n\t'Sharra',\n\t'Sharlette',\n\t'Selinda',\n\t'Saumya',\n\t'Meilan',\n\t'Melea',\n\t'Maleeha',\n\t'Mitali',\n\t'Rheana',\n\t'Ruchi',\n\t'Oasis',\n\t'Preethi',\n\t'Aungelique',\n\t'Kristl',\n\t'Tashala',\n\t'Darcell',\n\t'Rolinda',\n\t'Toye',\n\t'Shirlyn',\n\t'Yvonda',\n\t'Tymia',\n\t'Oteka',\n\t'Ladora',\n\t'Deashia',\n\t'Janautica',\n\t'Sonnet',\n\t'Sucely',\n\t'Suriah',\n\t'Tallula',\n\t'Sanna',\n\t'Seniyah',\n\t'Seri',\n\t'Yexalen',\n\t'Yumiko',\n\t'Zayana',\n\t'Zohal',\n\t'Valerye',\n\t'Yarisbeth',\n\t'Vivyana',\n\t'Xela',\n\t'Brithanny',\n\t'Jasira',\n\t'Jenessy',\n\t'Jezebelle',\n\t'Leahna',\n\t'Leilanee',\n\t'Leily',\n\t'Kohana',\n\t'Dorsa',\n\t'Elanna',\n\t'Caralyn',\n\t'Erilyn',\n\t'Halyn',\n\t'Helayna',\n\t'Lionor',\n\t'Maela',\n\t'Masha',\n\t'Myley',\n\t'Malaak',\n\t'Malai',\n\t'Mariapaula',\n\t'Nathalye',\n\t'Remie',\n\t'Parnika',\n\t'Neveen',\n\t'Cherith',\n\t'Orvella',\n\t'Aurion',\n\t'Shonterria',\n\t'Natoria',\n\t'Shaterria',\n\t'Clo',\n\t'Donnia',\n\t'Cana',\n\t'Niaya',\n\t'Brelyn',\n\t'Aalliyah',\n\t'Shaaron',\n\t'Doylene',\n\t'Lowanda',\n\t'Henryetta',\n\t'Obera',\n\t'Marykathryn',\n\t'Dema',\n\t'Arcadia',\n\t'Lodema',\n\t'Aloni',\n\t'Analya',\n\t'Aashritha',\n\t'Ayani',\n\t'Audreena',\n\t'Audrena',\n\t'Ariahna',\n\t'Antonela',\n\t'Atzi',\n\t'Amunet',\n\t'Jaala',\n\t'Keambria',\n\t'Kanaya',\n\t'Emya',\n\t'Deijah',\n\t'Dayjah',\n\t'Tiye',\n\t'Nyja',\n\t'Markesia',\n\t'Valla',\n\t'Cesaria',\n\t'Eusevia',\n\t'Elpidia',\n\t'Jaquisha',\n\t'Romanita',\n\t'Shauntia',\n\t'Chasmine',\n\t'Deneisha',\n\t'Quatesha',\n\t'Nicosha',\n\t'Shandricka',\n\t'Shambria',\n\t'Shakerra',\n\t'Santrice',\n\t'Quinesha',\n\t'Shantika',\n\t'Roderica',\n\t'Whitnie',\n\t'Piedad',\n\t'Koleta',\n\t'Brazil',\n\t'Aamina',\n\t'Adaleen',\n\t'Adyline',\n\t'Bricola',\n\t'Analeigha',\n\t'Anara',\n\t'Ladawna',\n\t'Ruperta',\n\t'Deaundra',\n\t'Jaleisa',\n\t'Keria',\n\t'Sharaine',\n\t'Shanekqua',\n\t'Shanekia',\n\t'Kenyanna',\n\t'Jacoria',\n\t'Airianna',\n\t'Amana',\n\t'Amariz',\n\t'Ammi',\n\t'Miaya',\n\t'Aaniya',\n\t'Anaisha',\n\t'Bellina',\n\t'Annasofia',\n\t'Archita',\n\t'Arianie',\n\t'Shaquandra',\n\t'Shakeyra',\n\t'Tiandra',\n\t'Soveida',\n\t'Gonzala',\n\t'Gaylia',\n\t'Freddye',\n\t'Roxi',\n\t'Neya',\n\t'Nitika',\n\t'Noriah',\n\t'Raha',\n\t'Briah',\n\t'Syrah',\n\t'Talise',\n\t'Tarynn',\n\t'Tianah',\n\t'Solay',\n\t'Saraiah',\n\t'Sherlynn',\n\t'Leylany',\n\t'Lilu',\n\t'Maelie',\n\t'Lexxie',\n\t'Monzeratt',\n\t'Nari',\n\t'Naveyah',\n\t'Mianna',\n\t'Maylea',\n\t'Mery',\n\t'Marene',\n\t'Zeba',\n\t'Xymena',\n\t'Yaremi',\n\t'Yari',\n\t'Yulie',\n\t'Lile',\n\t'Dafnee',\n\t'Indra',\n\t'Itzelle',\n\t'Evangaline',\n\t'Evelett',\n\t'Evely',\n\t'Ghazal',\n\t'Arnisha',\n\t'Kassia',\n\t'Kayah',\n\t'Kalliyan',\n\t'Diannia',\n\t'Damyah',\n\t'Torianna',\n\t'Talasia',\n\t'Zakira',\n\t'Zyah',\n\t'Masiya',\n\t'Rhyanna',\n\t'Kemaya',\n\t'Jadasia',\n\t'Kanijah',\n\t'Henleigh',\n\t'Ciella',\n\t'Dayanne',\n\t'Ivannia',\n\t'Heydy',\n\t'Fergie',\n\t'Fianna',\n\t'Goretti',\n\t'Gwynneth',\n\t'Gyanna',\n\t'Haidi',\n\t'Christabella',\n\t'Angelinah',\n\t'Anina',\n\t'Annya',\n\t'Alejah',\n\t'Bradie',\n\t'Breanah',\n\t'Arihana',\n\t'Aryona',\n\t'Ashwika',\n\t'Aylet',\n\t'Ayleth',\n\t'Meleena',\n\t'Micel',\n\t'Misel',\n\t'Naiema',\n\t'Meiling',\n\t'Malaia',\n\t'Rehanna',\n\t'Raengel',\n\t'Padma',\n\t'Majestic',\n\t'Katelen',\n\t'Jenaveve',\n\t'Jennessy',\n\t'Jewelisa',\n\t'Joelie',\n\t'Lyliana',\n\t'Mahati',\n\t'Sherral',\n\t'Kamariah',\n\t'Larsen',\n\t'Khaniya',\n\t'Jakiah',\n\t'Darionna',\n\t'Bristal',\n\t'Ahlana',\n\t'Aireanna',\n\t'Alaila',\n\t'Jarethzy',\n\t'Orfalinda',\n\t'Nataliah',\n\t'Nayra',\n\t'Nishika',\n\t'Meeya',\n\t'Sanaia',\n\t'Sensi',\n\t'Percilla',\n\t'Pranathi',\n\t'Kathrynn',\n\t'Katriel',\n\t'Jordanna',\n\t'Jessilyn',\n\t'Jilliana',\n\t'Madeira',\n\t'Laia',\n\t'Leala',\n\t'Courtlynn',\n\t'Ahriana',\n\t'Aliena',\n\t'Adalay',\n\t'Nakyia',\n\t'Niema',\n\t'Leeasia',\n\t'Evenny',\n\t'Dorismar',\n\t'Dyanara',\n\t'Elonna',\n\t'Estreya',\n\t'Ashmita',\n\t'Anureet',\n\t'Angeliah',\n\t'Annaliz',\n\t'Dallanara',\n\t'Danaly',\n\t'Carely',\n\t'Sevilla',\n\t'Aleigh',\n\t'Allianna',\n\t'Alamar',\n\t'Jaiah',\n\t'Shellsea',\n\t'Sheylin',\n\t'Sonoma',\n\t'Hayla',\n\t'Yoali',\n\t'Yzabel',\n\t'Zeenat',\n\t'Zienna',\n\t'Shirlynn',\n\t'Shilynn',\n\t'Raphaella',\n\t'Makyia',\n\t'Inola',\n\t'Omaria',\n\t'Michiah',\n\t'Anareli',\n\t'Anacamila',\n\t'Anahis',\n\t'Anapaola',\n\t'Clowie',\n\t'Brizia',\n\t'Alexssa',\n\t'Ailanie',\n\t'Aileene',\n\t'Francille',\n\t'Jatoria',\n\t'Jaquitta',\n\t'Sybol',\n\t'Landra',\n\t'Danyela',\n\t'Cubia',\n\t'Arabela',\n\t'Adelfina',\n\t'Quaniya',\n\t'Paulyne',\n\t'Vanteen',\n\t'Treba',\n\t'Kaylena',\n\t'Kaelynne',\n\t'Kalanie',\n\t'Lezli',\n\t'Lithzy',\n\t'Lanessa',\n\t'Laylene',\n\t'Leilaney',\n\t'Emmajean',\n\t'Francella',\n\t'Eiliyah',\n\t'Jadey',\n\t'Jamilett',\n\t'Ingris',\n\t'Tayanna',\n\t'Skarlette',\n\t'Sady',\n\t'Senia',\n\t'Yakeline',\n\t'Yenna',\n\t'Yesmin',\n\t'Meily',\n\t'Mikeila',\n\t'Miu',\n\t'Rakel',\n\t'Niveah',\n\t'Nyemah',\n\t'Gorgeous',\n\t'Zaraya',\n\t'Lavaeh',\n\t'Meila',\n\t'Labella',\n\t'Lilyona',\n\t'Zykierra',\n\t'Orfa',\n\t'Seriyah',\n\t'Shivali',\n\t'Sibylla',\n\t'Sua',\n\t'Ulani',\n\t'Vianet',\n\t'Yanell',\n\t'Yolette',\n\t'Yudany',\n\t'Suheidy',\n\t'Sukhpreet',\n\t'Syanna',\n\t'Tatevik',\n\t'Tayde',\n\t'Sameria',\n\t'Mikiya',\n\t'Claramae',\n\t'Audine',\n\t'Francile',\n\t'Tynia',\n\t'Goddess',\n\t'Samoria',\n\t'Llana',\n\t'Oveda',\n\t'Amelya',\n\t'Auda',\n\t'Disaya',\n\t'Zanyah',\n\t'Samiyyah',\n\t'Jaianna',\n\t'Ruqayyah',\n\t'Nakira',\n\t'Shamirah',\n\t'Ta',\n\t'Giani',\n\t'Brya',\n\t'Cyani',\n\t'Ashiyah',\n\t'Kahli',\n\t'Beauton',\n\t'Kashay',\n\t'Sadiyah',\n\t'Mikaya',\n\t'Nasira',\n\t'Nasirah',\n\t'Ariauna',\n\t'Yasirah',\n\t'Skyelynn',\n\t'Naailah',\n\t'Nyelle',\n\t'Adessa',\n\t'Ayriana',\n\t'Mirielle',\n\t'Munirah',\n\t'Layani',\n\t'Haniyah',\n\t'Ovida',\n\t'Haniyyah',\n\t'Layonna',\n\t'Jazmarie',\n\t'Wicahpi',\n\t'Cante',\n\t'Zamyah',\n\t'Tanyiah',\n\t'Shalita',\n\t'Salley',\n\t'Jnya',\n\t'Santasia',\n\t'Shaneque',\n\t'Quantina',\n\t'Temeika',\n\t'Narvis',\n\t'Pearlee',\n\t'Nykesha',\n\t'Orrie',\n\t'Mozter',\n\t'Earthalee',\n\t'Rozena',\n\t'Anniebell',\n\t'Hannie',\n\t'Pretto',\n\t'Caro',\n\t'Everlina',\n\t'Arnetha',\n\t'Glenora',\n\t'Asalee',\n\t'Parniece',\n\t'Rubena',\n\t'Wilhemena',\n\t'Perline',\n\t'Elloree',\n\t'Clorine',\n\t'Richardean',\n\t'Rovena',\n\t'Arthuree',\n\t'Mikea',\n\t'Charnice',\n\t'Tylashia',\n\t'Rebacca',\n\t'Caretha',\n\t'Dynasti',\n\t'Marvie',\n\t'Hermenia',\n\t'Tekela',\n\t'Trenace',\n\t'Valetta',\n\t'Topaz',\n\t'Debara',\n\t'Jaquasha',\n\t'Markeria',\n\t'Alkeria',\n\t'Salwa',\n\t'Tatayana',\n\t'Dianelys',\n\t'Beyounce',\n\t'Drena',\n\t'Julysa',\n\t'Shuntel',\n\t'Antasia',\n\t'Alyze',\n\t'Marytheresa',\n\t'Raechelle',\n\t'Trevia',\n\t'Tomara',\n\t'Jermeka',\n\t'Curtisha',\n\t'Kebrina',\n\t'Kayte',\n\t'Shakeila',\n\t'Ronnesha',\n\t'Shavontae',\n\t'Taquila',\n\t'Shaquia',\n\t'Lynnann',\n\t'Markevia',\n\t'Terrilynn',\n\t'Carime',\n\t'Quaneshia',\n\t'Shaylen',\n\t'Corneisha',\n\t'Rodneshia',\n\t'Nateria',\n\t'Marycatherine',\n\t'Ashlyne',\n\t'Reyne',\n\t'Natia',\n\t'Taquisha',\n\t'Mikeshia',\n\t'Khadeja',\n\t'Lismary',\n\t'Prisca',\n\t'Antwonette',\n\t'Anesia',\n\t'Clotilda',\n\t'Willavene',\n\t'Lovey',\n\t'Aleda',\n\t'Karita',\n\t'Rakiyah',\n\t'Nyasiah',\n\t'Timaya',\n\t'Gabryelle',\n\t'Caniyah',\n\t'Ethelreda',\n\t'Aryelle',\n\t'Trianna',\n\t'Yesli',\n\t'Yareliz',\n\t'Tanyla',\n\t'Keyshia',\n\t'Makinsey',\n\t'Daily',\n\t'Caylynn',\n\t'Kalyse',\n\t'Sarabelle',\n\t'Araminta',\n\t'Magdelene',\n\t'Kristalyn',\n\t'Lianni',\n\t'Layana',\n\t'Haedyn',\n\t'Teyona',\n\t'Taziyah',\n\t'Ranijah',\n\t'Darneisha',\n\t'Jahzaria',\n\t'Palmyra',\n\t'Altheda',\n\t'Armanii',\n\t'Blodwyn',\n\t'Colletta',\n\t'Yelenis',\n\t'Yazlyn',\n\t'Leira',\n\t'Anaysia',\n\t'Anayiah',\n\t'Valia',\n\t'Bambina',\n\t'Burnetta',\n\t'Clarabel',\n\t'Philomenia',\n\t'Lorma',\n\t'Janeka',\n\t'Danaisha',\n\t'Cayci',\n\t'Jermia',\n\t'Idalys',\n\t'Sarajane',\n\t'Shakenya',\n\t'Kashanti',\n\t'Lanika',\n\t'Ceira',\n\t'Deshanti',\n\t'Adianez',\n\t'Alannis',\n\t'Lubov',\n\t'Aylana',\n\t'Nephtalie',\n\t'Harlean',\n\t'Shelvey',\n\t'Yalissa',\n\t'Asianna',\n\t'Jahnyah',\n\t'Jahliyah',\n\t'Ellissa',\n\t'Gabrianna',\n\t'Katonya',\n\t'Elsia',\n\t'Ketina',\n\t'Kateena',\n\t'Claudean',\n\t'Chenita',\n\t'Belkys',\n\t'Kerryn',\n\t'Teria',\n\t'Charron',\n\t'Charnissa',\n\t'Alura',\n\t'Bashirah',\n\t'Gerldine',\n\t'Katilynn',\n\t'Trellany',\n\t'Lacheryl',\n\t'Twalla',\n\t'Sharnise',\n\t'Yoland',\n\t'Shanai',\n\t'Ikia',\n\t'Aquilla',\n\t'Shalandra',\n\t'Nekesha',\n\t'Sonni',\n\t'Kutana',\n\t'Sharnay',\n\t'Timitra',\n\t'Shareena',\n\t'Tyeesha',\n\t'Natara',\n\t'Amatullah',\n\t'Nydirah',\n\t'Shahadah',\n\t'Inetha',\n\t'Clatie',\n\t'Ladye',\n\t'Makalia',\n\t'Sabriyah',\n\t'Graple',\n\t'Lorell',\n\t'Vercie',\n\t'Rayona',\n\t'Dayshia',\n\t'Nakirah',\n\t'Mcneva',\n\t'Bunia',\n\t'Brooxie',\n\t'Delcia',\n\t'Naje',\n\t'Eilish',\n\t'Lashara',\n\t'Crystall',\n\t'Shearon',\n\t'Kafi',\n\t'Kea',\n\t'Shantrel',\n\t'Jeanni',\n\t'Andreia',\n\t'Myrlande',\n\t'Jennifier',\n\t'Damika',\n\t'Carloyn',\n\t'Lashera',\n\t'Kamika',\n\t'Chrisann',\n\t'Lashavia',\n\t'Ivis',\n\t'Quinisha',\n\t'Yanelys',\n\t'Taralee',\n\t'Ibis',\n\t'Jazma',\n\t'Shakevia',\n\t'Deneane',\n\t'Kimala',\n\t'Casee',\n\t'Audreana',\n\t'Shahida',\n\t'Latangela',\n\t'Lashira',\n\t'Lashawndra',\n\t'Sherrina',\n\t'Shawntrell',\n\t'Latronda',\n\t'Meghaan',\n\t'Ayasha',\n\t'Raushanah',\n\t'Serrita',\n\t'Tennile',\n\t'Keyonda',\n\t'Idalmis',\n\t'Telicia',\n\t'Takeia',\n\t'Aristea',\n\t'Letesha',\n\t'Badia',\n\t'Nykea',\n\t'Bilan',\n\t'Ieva',\n\t'Kimmi',\n\t'Geniel',\n\t'Tamberly',\n\t'Tammee',\n\t'Sherma',\n\t'Emira',\n\t'Agena',\n\t'Carrin',\n\t'Ladean',\n\t'Caera',\n\t'Shatha',\n\t'Utahna',\n\t'Lujean',\n\t'Joylyn',\n\t'Kathren',\n\t'Kristiane',\n\t'Lenee',\n\t'Angi',\n\t'Vichelle',\n\t'Rochele',\n\t'Shonnie',\n\t'Anastasija',\n\t'Clea',\n\t'Myrlene',\n\t'Dniyah',\n\t'Tashanti',\n\t'Sireen',\n\t'Vincie',\n\t'Wreatha',\n\t'Josphine',\n\t'Casimera',\n\t'Hildagarde',\n\t'Margeret',\n\t'Grettell',\n\t'Greenley',\n\t'Gloriana',\n\t'Eyleen',\n\t'Evaleigh',\n\t'Davanee',\n\t'Corley',\n\t'Liliah',\n\t'Leanah',\n\t'Kynzlie',\n\t'Kynzleigh',\n\t'Kolette',\n\t'Lively',\n\t'Makenlie',\n\t'Lochlyn',\n\t'Kinslie',\n\t'Jleigh',\n\t'Jeslynn',\n\t'Jenisis',\n\t'Jenisha',\n\t'Kensli',\n\t'Addalie',\n\t'Demia',\n\t'Cele',\n\t'Aderinsola',\n\t'Auriella',\n\t'Blyss',\n\t'Cashlynn',\n\t'Callyn',\n\t'Allyzon',\n\t'Aleiya',\n\t'Alazne',\n\t'Alayzia',\n\t'Ailah',\n\t'Annora',\n\t'Analynn',\n\t'Leonilda',\n\t'Minnette',\n\t'Onolee',\n\t'Michaelina',\n\t'Rosemond',\n\t'Milica',\n\t'Ednamae',\n\t'Floribel',\n\t'Nur',\n\t'Ndia',\n\t'Thecla',\n\t'Immaculate',\n\t'Mayfred',\n\t'Selda',\n\t'Vincenzia',\n\t'Vitina',\n\t'Tammatha',\n\t'Joley',\n\t'Kelene',\n\t'Kriste',\n\t'Liese',\n\t'Mariaemilia',\n\t'Lasaundra',\n\t'Letica',\n\t'Karene',\n\t'Devera',\n\t'Denyce',\n\t'Dawnn',\n\t'Maryum',\n\t'Giovannina',\n\t'Roze',\n\t'Reygan',\n\t'Quinlyn',\n\t'Stassi',\n\t'Meelah',\n\t'Novaleigh',\n\t'Navey',\n\t'Mirakle',\n\t'Naiovy',\n\t'Munachiso',\n\t'Montzerrat',\n\t'Misk',\n\t'Mireyah',\n\t'Temiloluwa',\n\t'Zaiya',\n\t'Varshini',\n\t'Tiwatope',\n\t'Tinlee',\n\t'Geneve',\n\t'Kotryna',\n\t'Janila',\n\t'Janeah',\n\t'Mollye',\n\t'Dody',\n\t'Doreena',\n\t'Chelle',\n\t'Javaeh',\n\t'Dim',\n\t'Jamylah',\n\t'Kamyia',\n\t'Ramie',\n\t'Kandie',\n\t'Kitt',\n\t'Gaylyn',\n\t'Marji',\n\t'Laurena',\n\t'Lorre',\n\t'Ronelle',\n\t'Kresta',\n\t'Jonylah',\n\t'Kornelia',\n\t'Mindie',\n\t'Kendis',\n\t'Dorri',\n\t'Seaneen',\n\t'Lorilyn',\n\t'Lolly',\n\t'Pati',\n\t'Shalayne',\n\t'Dorise',\n\t'Joani',\n\t'Yailene',\n\t'Batool',\n\t'Cyntha',\n\t'Coni',\n\t'Kae',\n\t'Cynia',\n\t'Rhonna',\n\t'Lynnetta',\n\t'Terrisa',\n\t'Nishi',\n\t'Delise',\n\t'Ladena',\n\t'Bronwen',\n\t'Tere',\n\t'Tippi',\n\t'Peggi',\n\t'Portland',\n\t'Sherrin',\n\t'Tacy',\n\t'Terie',\n\t'Dore',\n\t'Daphane',\n\t'Juliene',\n\t'Kamile',\n\t'Janeil',\n\t'Megin',\n\t'Shenandoah',\n\t'Rashada',\n\t'Disa',\n\t'Elita',\n\t'Kelee',\n\t'Genee',\n\t'Taneya',\n\t'Storie',\n\t'Sheza',\n\t'Rielyn',\n\t'Venicia',\n\t'Zamyria',\n\t'Yisell',\n\t'Appollonia',\n\t'Meryle',\n\t'Frann',\n\t'Lucyann',\n\t'Clarivel',\n\t'Marguarite',\n\t'Nelsa',\n\t'Reanetta',\n\t'Roshaunda',\n\t'Channie',\n\t'Bathsheba',\n\t'Jannessa',\n\t'Jakaylah',\n\t'Jesalyn',\n\t'Ellyson',\n\t'Hally',\n\t'Haelyn',\n\t'Gabbie',\n\t'Emmerie',\n\t'Makailyn',\n\t'Maddi',\n\t'Lirio',\n\t'Lexee',\n\t'Matalyn',\n\t'Kenzee',\n\t'Kenlei',\n\t'Kaydi',\n\t'Kynlei',\n\t'Krissa',\n\t'Adalin',\n\t'Alayiah',\n\t'Ellice',\n\t'Caydee',\n\t'Annalysa',\n\t'Anisty',\n\t'Abeni',\n\t'Aliha',\n\t'Aerith',\n\t'Adrie',\n\t'Peggyann',\n\t'Pietrina',\n\t'Amberlie',\n\t'Dabria',\n\t'Cylee',\n\t'Amyriah',\n\t'Ambry',\n\t'Berkleigh',\n\t'Azula',\n\t'Zaryiah',\n\t'Zanyia',\n\t'Gerardine',\n\t'Joycelynn',\n\t'Jeslin',\n\t'Kenzli',\n\t'Keisi',\n\t'Kayelynn',\n\t'Jaselyn',\n\t'Mckinnley',\n\t'Maryse',\n\t'Peightyn',\n\t'Latausha',\n\t'Lety',\n\t'Tekia',\n\t'Arasely',\n\t'Arlynne',\n\t'Noell',\n\t'Patrcia',\n\t'Morning',\n\t'Meika',\n\t'Tanda',\n\t'Terasa',\n\t'Tika',\n\t'Roshon',\n\t'Marlaine',\n\t'Stephaie',\n\t'Franne',\n\t'Ewa',\n\t'Tomeca',\n\t'Chequita',\n\t'Dierdra',\n\t'Doriann',\n\t'Tammika',\n\t'Jeananne',\n\t'Cythia',\n\t'Laconda',\n\t'Catiria',\n\t'Migna',\n\t'Latiesha',\n\t'Sharin',\n\t'Tekesha',\n\t'Elga',\n\t'Barbarajean',\n\t'Ilena',\n\t'Evett',\n\t'Timiko',\n\t'Kachina',\n\t'Desere',\n\t'Galadriel',\n\t'Lynea',\n\t'Laurajean',\n\t'Rukiya',\n\t'Sakara',\n\t'Snezana',\n\t'Tashonda',\n\t'Orquidea',\n\t'Myshia',\n\t'Latrease',\n\t'Monquie',\n\t'Robina',\n\t'Vesna',\n\t'Faline',\n\t'Glori',\n\t'Jennel',\n\t'Keyatta',\n\t'Dimitria',\n\t'Uzma',\n\t'Lalia',\n\t'Krystiana',\n\t'Kaedynce',\n\t'Juany',\n\t'Kesley',\n\t'Kennedee',\n\t'Keeleigh',\n\t'Paiten',\n\t'Neelah',\n\t'Naylee',\n\t'Sairy',\n\t'Rocsi',\n\t'Mckenzey',\n\t'Modesty',\n\t'Abbiegail',\n\t'Jasalyn',\n\t'Genises',\n\t'Emmory',\n\t'Elisea',\n\t'Dlaney',\n\t'Haelee',\n\t'Jadence',\n\t'Audryana',\n\t'Carizma',\n\t'Josanne',\n\t'Nashira',\n\t'Meesha',\n\t'Taneil',\n\t'Sobeida',\n\t'Zakyra',\n\t'Syndee',\n\t'Zipora',\n\t'Amita',\n\t'Bridie',\n\t'Hilde',\n\t'Aspasia',\n\t'Yalexi',\n\t'Tenleigh',\n\t'Anjannette',\n\t'Zniyah',\n\t'Zayley',\n\t'Kyerra',\n\t'Lynnsey',\n\t'Dashae',\n\t'Jasha',\n\t'Anjenette',\n\t'Lelania',\n\t'Mija',\n\t'Lorrene',\n\t'Shanyn',\n\t'Shindana',\n\t'Shamra',\n\t'Dove',\n\t'Drina',\n\t'Caralee',\n\t'Charmian',\n\t'Katrine',\n\t'Lagina',\n\t'Jahna',\n\t'Nesita',\n\t'Teriana',\n\t'Dajae',\n\t'Kyiah',\n\t'Keslyn',\n\t'Kayelee',\n\t'Kamberlyn',\n\t'Raygen',\n\t'Orchid',\n\t'Maleigh',\n\t'Mairim',\n\t'Amily',\n\t'Ameli',\n\t'Alie',\n\t'Adelai',\n\t'Eniola',\n\t'Enaya',\n\t'Brealynn',\n\t'Blakleigh',\n\t'Ayelene',\n\t'Camrie',\n\t'Dianely',\n\t'Delayne',\n\t'Cortlyn',\n\t'Jaylei',\n\t'Jaycelynn',\n\t'Jaleigha',\n\t'Iviana',\n\t'Kaedance',\n\t'Jewelz',\n\t'Jillianna',\n\t'Faithlyn',\n\t'Isabeau',\n\t'Irany',\n\t'Galiana',\n\t'Makynzee',\n\t'Maebry',\n\t'Merit',\n\t'Mckinzee',\n\t'Kinzee',\n\t'Kendrah',\n\t'Laityn',\n\t'Amberlin',\n\t'Ahliyah',\n\t'Raphaela',\n\t'Ameri',\n\t'Brecklynn',\n\t'Cristabel',\n\t'Annalucia',\n\t'Avri',\n\t'Averly',\n\t'Shalia',\n\t'Sheilla',\n\t'Dejana',\n\t'Tonnette',\n\t'Tracia',\n\t'Trese',\n\t'Lalanya',\n\t'Kristiann',\n\t'Zunaira',\n\t'Zinachidi',\n\t'Xayla',\n\t'Zaybree',\n\t'Zanae',\n\t'Xoey',\n\t'Sirenity',\n\t'Renesme',\n\t'Raeley',\n\t'Preslyn',\n\t'Nyx',\n\t'Nyelli',\n\t'Rozalynn',\n\t'Safaa',\n\t'Abaigeal',\n\t'Perle',\n\t'Ersilia',\n\t'Ethlyn',\n\t'Dashanae',\n\t'Dajana',\n\t'Tahja',\n\t'Shavona',\n\t'Vernisha',\n\t'Sunya',\n\t'Zenorah',\n\t'Dorota',\n\t'Ramsha',\n\t'Nirali',\n\t'Najia',\n\t'Maryclaire',\n\t'Ismay',\n\t'Alfonsina',\n\t'Letizia',\n\t'Lotta',\n\t'Honore',\n\t'Jamille',\n\t'Kashe',\n\t'Bonnielee',\n\t'Lorelle',\n\t'Gloriajean',\n\t'Trenae',\n\t'Tonesha',\n\t'Maxene',\n\t'Aliz',\n\t'Annelyse',\n\t'Avagrace',\n\t'Adanelly',\n\t'Dariella',\n\t'Colbi',\n\t'Tema',\n\t'Marlea',\n\t'Elleen',\n\t'Veroncia',\n\t'Shelina',\n\t'Sundae',\n\t'Jericca',\n\t'Liduvina',\n\t'Jenney',\n\t'Pascha',\n\t'Roshell',\n\t'Marlies',\n\t'Marny',\n\t'Judithann',\n\t'Nancylee',\n\t'Freyda',\n\t'Joyceann',\n\t'Caroleann',\n\t'Desirie',\n\t'Christol',\n\t'Shulamith',\n\t'Marlise',\n\t'Rocquel',\n\t'Tamsen',\n\t'Sukari',\n\t'Tinna',\n\t'Magdelena',\n\t'Ruba',\n\t'Patra',\n\t'Erryn',\n\t'Buffi',\n\t'Chantil',\n\t'Kerensa',\n\t'Annastacia',\n\t'Zailee',\n\t'Lamika',\n\t'Kashlynn',\n\t'Jaedynn',\n\t'Kaly',\n\t'Paisyn',\n\t'Seraiah',\n\t'Mckenzye',\n\t'Nhyla',\n\t'Chandrika',\n\t'Dawana',\n\t'Elesha',\n\t'Caryle',\n\t'Karrin',\n\t'Valency',\n\t'Kianga',\n\t'Shawndee',\n\t'Tamasha',\n\t'Rhodora',\n\t'Shivangi',\n\t'Vermont',\n\t'Diasia',\n\t'Aniyyah',\n\t'Azhane',\n\t'Katleyn',\n\t'Tynetta',\n\t'Negan',\n\t'Marilyne',\n\t'Leronia',\n\t'Charmie',\n\t'Lateefa',\n\t'Hassanah',\n\t'Louvinia',\n\t'Shirly',\n\t'Sanjna',\n\t'Andelyn',\n\t'Jaima',\n\t'Aftyn',\n\t'Atira',\n\t'Weslie',\n\t'Tayzlee',\n\t'Rossi',\n\t'Nayvie',\n\t'Livvy',\n\t'Brinklee',\n\t'Drinda',\n\t'Nazirah',\n\t'Krithika',\n\t'Taisley',\n\t'Starlee',\n\t'Bijal',\n\t'Hiral',\n\t'Gwynn',\n\t'Orlene',\n\t'Maurene',\n\t'Sweta',\n\t'Naasia',\n\t'Luvinia',\n\t'Sayoko',\n\t'Geannie',\n\t'Rupal',\n\t'Zerlina',\n\t'Nobu',\n\t'Taeko',\n\t'Miye',\n\t'Carnation',\n\t'Joplin',\n\t'Yayeko',\n\t'Sakaye',\n\t'Ernell',\n\t'Tazuko',\n\t'Bayyinah',\n\t'Konstantina',\n\t'Danuta',\n\t'Cariann',\n\t'Charnette',\n\t'Michiye',\n\t'Tejal',\n\t'Shaheedah',\n\t'Zakkiyya',\n\t'Latoyah',\n\t'Audre',\n\t'Tayeko',\n\t'Qadriyyah',\n\t'Nikema',\n\t'Wadeeah',\n\t'Quanika',\n\t'Fareeda',\n\t'Ivelis',\n\t'Karigan',\n\t'Yayoi',\n\t'Tauni',\n\t'Shailee',\n\t'Ronnah',\n\t'Roseana',\n\t'Rosalita',\n\t'Orlidia',\n\t'Mckall',\n\t'Seattle',\n\t'Lauree',\n\t'Georgi',\n\t'Jacolyn',\n\t'Meichele',\n\t'Starlet',\n\t'Shandee',\n\t'Miquelle',\n\t'Cathe',\n\t'Nondas',\n\t'Roben',\n\t'Manette',\n\t'Monzelle',\n\t'Genieve',\n\t'Rumaysa',\n\t'Dariya',\n\t'Brynnleigh',\n\t'Vicci',\n\t'Sharli',\n\t'Chandi',\n\t'Guadelupe',\n\t'Jamilyn',\n\t'Willadene',\n\t'Centhia',\n\t'Cheryal',\n\t'Normalee',\n\t'Wilmajean',\n\t'Roanne',\n\t'Dyane',\n\t'Jinx',\n\t'Jorene',\n\t'Ceceilia',\n\t'Arikka',\n\t'Latanza',\n\t'Lacinda',\n\t'Rus',\n\t'Sangeeta',\n\t'Demita',\n\t'Jerene',\n\t'Marcellina',\n\t'Zani',\n\t'Izzabelle',\n\t'Graycee',\n\t'Sajada',\n\t'Quinlee',\n\t'Brooklee',\n\t'Shulamis',\n\t'Bunnie',\n\t'Michaelyn',\n\t'Dhruvi',\n\t'Sreeja',\n\t'Tzipa',\n\t'Doreene',\n\t'Bedelia',\n\t'Eutimia',\n\t'Tomacita',\n\t'Jerra',\n\t'Rosela',\n\t'Ignacita',\n\t'Conferina',\n\t'Andreita',\n\t'Lugardita',\n\t'Estefanita',\n\t'Suetta',\n\t'Debbe',\n\t'Amadita',\n\t'Mardel',\n\t'Mliss',\n\t'Korla',\n\t'Felipita',\n\t'Erminda',\n\t'Chrys',\n\t'Karthika',\n\t'Guilianna',\n\t'Chasya',\n\t'Bryndee',\n\t'Taeler',\n\t'Sinforosa',\n\t'Brinnley',\n\t'Aviya',\n\t'Jayma',\n\t'Zimal',\n\t'Vivia',\n\t'Arielis',\n\t'Arshiya',\n\t'Adiba',\n\t'Afreen',\n\t'Ajooni',\n\t'Alianny',\n\t'Fariza',\n\t'Breina',\n\t'Sila',\n\t'Aaima',\n\t'Amesha',\n\t'Antigone',\n\t'Kayse',\n\t'Aurelie',\n\t'Marianny',\n\t'Naba',\n\t'Salimata',\n\t'Retal',\n\t'Pema',\n\t'Pesha',\n\t'Reemas',\n\t'Emunah',\n\t'Farzeen',\n\t'Safina',\n\t'Sema',\n\t'Seynabou',\n\t'Roza',\n\t'Romaisa',\n\t'Yehudit',\n\t'Tzivi',\n\t'Tzivy',\n\t'Zahro',\n\t'Jeylen',\n\t'Klea',\n\t'Namirah',\n\t'Lamiah',\n\t'Mahjabeen',\n\t'Daielle',\n\t'Ogechi',\n\t'Laresha',\n\t'Laqueta',\n\t'Anayla',\n\t'Bashy',\n\t'Naeema',\n\t'Sarrinah',\n\t'Sevinch',\n\t'Frimmy',\n\t'Hibba',\n\t'Fajr',\n\t'Rayhona',\n\t'Rokia',\n\t'Wafa',\n\t'Britne',\n\t'Crystalann',\n\t'Reah',\n\t'Maggi',\n\t'Lenae',\n\t'Kambra',\n\t'Tabita',\n\t'Tamlyn',\n\t'Thuytien',\n\t'Titianna',\n\t'Trenisha',\n\t'Yuan',\n\t'Yarithza',\n\t'Yarixa',\n\t'Satin',\n\t'Elizeth',\n\t'Gabiela',\n\t'Jackline',\n\t'Janisa',\n\t'Graviela',\n\t'Gudalupe',\n\t'Hena',\n\t'Bryanda',\n\t'Avilene',\n\t'Ayerim',\n\t'Breiana',\n\t'Nicoleanne',\n\t'Merisa',\n\t'Relina',\n\t'Rebecah',\n\t'Rachyl',\n\t'Kasaundra',\n\t'Katryn',\n\t'Jeaneth',\n\t'Jenah',\n\t'Jocely',\n\t'Jorgina',\n\t'Lindsee',\n\t'Lizvette',\n\t'Oleen',\n\t'Waveline',\n\t'Laurabelle',\n\t'Charma',\n\t'Gleneva',\n\t'Yesika',\n\t'Felina',\n\t'Nguyet',\n\t'Krissie',\n\t'Silvina',\n\t'Stephanny',\n\t'Teera',\n\t'Kristol',\n\t'Karisha',\n\t'Lorisa',\n\t'Iracema',\n\t'Temesha',\n\t'Tamber',\n\t'Shelisa',\n\t'Roshana',\n\t'Rheannon',\n\t'Amala',\n\t'Anabelen',\n\t'Daizhane',\n\t'Darbie',\n\t'Dezaree',\n\t'Dezhane',\n\t'Carrina',\n\t'Chessa',\n\t'Christinejoy',\n\t'Aliea',\n\t'Adalhi',\n\t'Alexandrina',\n\t'Abrina',\n\t'Madaleine',\n\t'Maressa',\n\t'Marki',\n\t'Koryna',\n\t'Lilibet',\n\t'Mystic',\n\t'Neyra',\n\t'Ivonna',\n\t'Jenalyn',\n\t'Truc',\n\t'Berneta',\n\t'Quinci',\n\t'Rachelanne',\n\t'Raylina',\n\t'Nykole',\n\t'Stephaney',\n\t'Seleni',\n\t'Marvene',\n\t'Melizza',\n\t'Aimme',\n\t'Anaissa',\n\t'Anhelica',\n\t'Celyna',\n\t'Azalie',\n\t'Bereniz',\n\t'Meliss',\n\t'Leanza',\n\t'Lenina',\n\t'Karrina',\n\t'Kalynne',\n\t'Kanwal',\n\t'Kazzandra',\n\t'Mandalyn',\n\t'Limairy',\n\t'Lizzete',\n\t'Lyly',\n\t'Coua',\n\t'Icsel',\n\t'Izamary',\n\t'Lakindra',\n\t'Rosezella',\n\t'Wilhelmine',\n\t'Clela',\n\t'Marvelle',\n\t'Jenafer',\n\t'Katye',\n\t'Eliabeth',\n\t'Angelicamaria',\n\t'Adrieanna',\n\t'Caludia',\n\t'Caycee',\n\t'Chenay',\n\t'Cherika',\n\t'Arpine',\n\t'Kimberlyanne',\n\t'Jully',\n\t'Jyoti',\n\t'Mariha',\n\t'Meganelizabeth',\n\t'Melysa',\n\t'Lashanay',\n\t'Jericha',\n\t'Eliset',\n\t'Esmirna',\n\t'Clarie',\n\t'Conny',\n\t'Derrisha',\n\t'Frania',\n\t'Jeena',\n\t'Gresia',\n\t'Hlee',\n\t'Emanie',\n\t'Liany',\n\t'Aisatou',\n\t'Ashya',\n\t'Nefertari',\n\t'Nyanna',\n\t'Mariem',\n\t'Michellee',\n\t'Amenda',\n\t'Markella',\n\t'Kiyara',\n\t'Issamar',\n\t'Cecilee',\n\t'Rehana',\n\t'Nube',\n\t'Simy',\n\t'Laneshia',\n\t'Vasthi',\n\t'Treanna',\n\t'Tria',\n\t'Tuongvi',\n\t'Brany',\n\t'Niza',\n\t'Shandale',\n\t'Shanley',\n\t'Shastina',\n\t'Sheyna',\n\t'Ronniesha',\n\t'Rubit',\n\t'Ruvi',\n\t'Siobhain',\n\t'Shauntal',\n\t'Linzie',\n\t'Linzi',\n\t'Fatimatou',\n\t'Efrat',\n\t'Jasmely',\n\t'Kadidia',\n\t'Kamily',\n\t'Meirav',\n\t'Areebah',\n\t'Fatim',\n\t'Nuzhat',\n\t'Saribel',\n\t'Zorah',\n\t'Ting',\n\t'Laporscha',\n\t'Mieshia',\n\t'Vanecia',\n\t'Brittne',\n\t'Denetria',\n\t'Deamber',\n\t'Cymone',\n\t'Arieal',\n\t'Araly',\n\t'Shamieka',\n\t'Deshay',\n\t'Britainy',\n\t'Matraca',\n\t'Krystyne',\n\t'Kristela',\n\t'Kindell',\n\t'Ceyda',\n\t'Jahnasia',\n\t'Halimatou',\n\t'Graciana',\n\t'Haja',\n\t'Safiatou',\n\t'Su',\n\t'Zaineb',\n\t'Yianna',\n\t'Shilat',\n\t'Zanai',\n\t'Zeinabou',\n\t'Jalysa',\n\t'Garcia',\n\t'Jinna',\n\t'Brytni',\n\t'Crystalmarie',\n\t'Kyrstie',\n\t'Labrea',\n\t'Laurita',\n\t'Kathleena',\n\t'Salimatou',\n\t'Martisha',\n\t'Damisha',\n\t'Londin',\n\t'Toree',\n\t'Yadria',\n\t'Yaminah',\n\t'Nili',\n\t'Pella',\n\t'Menna',\n\t'Minah',\n\t'Porshay',\n\t'Rahwa',\n\t'Parissa',\n\t'Nury',\n\t'Sheeva',\n\t'Sendi',\n\t'Aroush',\n\t'Jerlyn',\n\t'Momina',\n\t'Nylia',\n\t'Mahreen',\n\t'Mattingly',\n\t'Emanuella',\n\t'Ceylin',\n\t'Biana',\n\t'Ishrat',\n\t'Genendy',\n\t'Hindel',\n\t'Chavi',\n\t'Freidy',\n\t'Rouguiatou',\n\t'Osnas',\n\t'Yagmur',\n\t'Yitel',\n\t'Hudy',\n\t'Jamielynn',\n\t'Valyncia',\n\t'Cheyla',\n\t'Assa',\n\t'Tasmia',\n\t'Yaslene',\n\t'Zaima',\n\t'Jenisse',\n\t'Juliannah',\n\t'Reveca',\n\t'Amra',\n\t'Anaria',\n\t'Arlenis',\n\t'Anastassia',\n\t'Anique',\n\t'Arilene',\n\t'Adileni',\n\t'Chelcy',\n\t'Chelesa',\n\t'Columba',\n\t'Corri',\n\t'Briane',\n\t'Carine',\n\t'Deziah',\n\t'Jojo',\n\t'Jaidalyn',\n\t'Cecelie',\n\t'Meagon',\n\t'Raysha',\n\t'Mylinh',\n\t'Madelena',\n\t'Saniyya',\n\t'Shama',\n\t'Shifa',\n\t'Nyala',\n\t'Lafaun',\n\t'Ronnetta',\n\t'Rondia',\n\t'Christe',\n\t'Tynnetta',\n\t'Ethyle',\n\t'Bobi',\n\t'Rayetta',\n\t'Wilmina',\n\t'Tangala',\n\t'Chloris',\n\t'Marvyl',\n\t'Larinda',\n\t'Narcedalia',\n\t'Tiaa',\n\t'Terressa',\n\t'Missi',\n\t'Ardythe',\n\t'Briget',\n\t'Julya',\n\t'Emilyanne',\n\t'Ayano',\n\t'Eliane',\n\t'Tatem',\n\t'Roselani',\n\t'Zareen',\n\t'Yaxeni',\n\t'Marleena',\n\t'Nicolemarie',\n\t'Patzy',\n\t'Morgana',\n\t'Mirca',\n\t'Mystica',\n\t'Rosaicela',\n\t'Rosaysela',\n\t'Serrena',\n\t'Shiori',\n\t'Yannely',\n\t'Threasa',\n\t'Zohra',\n\t'Lanitra',\n\t'Laquinthia',\n\t'Deshundra',\n\t'Mirasol',\n\t'Lladira',\n\t'Tejuana',\n\t'Michaelann',\n\t'Normajean',\n\t'Leasha',\n\t'Kajuana',\n\t'Xianna',\n\t'Yaquelyn',\n\t'Marcea',\n\t'Mohini',\n\t'Jaysha',\n\t'Saysha',\n\t'Makamae',\n\t'Lynnett',\n\t'Mistee',\n\t'Kaysee',\n\t'Lizel',\n\t'Kiora',\n\t'Kla',\n\t'Lanay',\n\t'Kainani',\n\t'Pomaikai',\n\t'Piilani',\n\t'Aulii',\n\t'Khristi',\n\t'Delfa',\n\t'Toka',\n\t'Satonya',\n\t'Jammi',\n\t'Iolani',\n\t'Hinaea',\n\t'Ilihia',\n\t'Kulia',\n\t'Darcus',\n\t'Raejean',\n\t'Brisamar',\n\t'Francessca',\n\t'Dhamar',\n\t'Lehiwa',\n\t'Ajane',\n\t'Alexsys',\n\t'Jema',\n\t'Imara',\n\t'Itzanami',\n\t'Ivori',\n\t'Tabby',\n\t'Charnell',\n\t'Vanessamarie',\n\t'Vibiana',\n\t'Kameisha',\n\t'Edica',\n\t'Shanetra',\n\t'Shametria',\n\t'Quinette',\n\t'Abreanna',\n\t'Corazon',\n\t'Correna',\n\t'Lilac',\n\t'Najwa',\n\t'Moranda',\n\t'Monik',\n\t'Deise',\n\t'Edid',\n\t'Karinne',\n\t'Ilsa',\n\t'Irazema',\n\t'Pegge',\n\t'Chenique',\n\t'Temisha',\n\t'Cristella',\n\t'Christle',\n\t'Falan',\n\t'Mekesha',\n\t'Jonquil',\n\t'Latarya',\n\t'Maretta',\n\t'Sonceria',\n\t'Latamara',\n\t'Ladina',\n\t'Rozann',\n\t'Suz',\n\t'Aleja',\n\t'Wray',\n\t'Indica',\n\t'Harkiran',\n\t'Gemini',\n\t'Erikah',\n\t'Fey',\n\t'Gudelia',\n\t'Komalpreet',\n\t'Anah',\n\t'Angelicamarie',\n\t'Cammi',\n\t'Dejane',\n\t'Dejanay',\n\t'Cilicia',\n\t'Merla',\n\t'Janann',\n\t'Maurita',\n\t'Aireana',\n\t'Shuronda',\n\t'Shunte',\n\t'Lacrisha',\n\t'Kwana',\n\t'Krisi',\n\t'Kaysi',\n\t'Latressa',\n\t'Tyronza',\n\t'Debralee',\n\t'Crissie',\n\t'Crissa',\n\t'Jameca',\n\t'Alicha',\n\t'Ketra',\n\t'Chrisie',\n\t'Delecia',\n\t'Rokisha',\n\t'Natoshia',\n\t'Shajuana',\n\t'Jenipher',\n\t'Jenefer',\n\t'Anjanae',\n\t'Azita',\n\t'Clairissa',\n\t'Brezhane',\n\t'Keera',\n\t'Siarah',\n\t'Smita',\n\t'Savonna',\n\t'Raquelin',\n\t'Lorren',\n\t'Omunique',\n\t'Molina',\n\t'Nixaliz',\n\t'Melitza',\n\t'Shylo',\n\t'Teniqua',\n\t'Charmine',\n\t'Deonne',\n\t'Kima',\n\t'Galit',\n\t'Ikesha',\n\t'Jamala',\n\t'Cherl',\n\t'Ageliki',\n\t'Ydania',\n\t'Kortlyn',\n\t'Lisvet',\n\t'Khya',\n\t'Kearstyn',\n\t'Seline',\n\t'Stormey',\n\t'Rehma',\n\t'Mckynna',\n\t'Brynnan',\n\t'Abiola',\n\t'Ambriel',\n\t'Akaysha',\n\t'Hailea',\n\t'Fryda',\n\t'Fedra',\n\t'Dacie',\n\t'Deissy',\n\t'Deyna',\n\t'Mayling',\n\t'Tessy',\n\t'Yaa',\n\t'Shameca',\n\t'Shivon',\n\t'Taesha',\n\t'Dinamarie',\n\t'Ifeoma',\n\t'Ashlye',\n\t'Patriciajo',\n\t'Danute',\n\t'Amalyn',\n\t'Nakeia',\n\t'Takima',\n\t'Shavonn',\n\t'Katira',\n\t'Lakema',\n\t'Jahaida',\n\t'Marshelle',\n\t'Angeliki',\n\t'Carrianne',\n\t'Carrieanne',\n\t'Tarika',\n\t'Sherece',\n\t'Kalimah',\n\t'Kinda',\n\t'Sadiga',\n\t'Paraskevi',\n\t'Ayianna',\n\t'Alezay',\n\t'Cadynce',\n\t'Haely',\n\t'Heavenleigh',\n\t'Dajanique',\n\t'Lasharn',\n\t'Drita',\n\t'Genene',\n\t'Gittle',\n\t'Carriann',\n\t'Emerita',\n\t'Jenniferann',\n\t'Kammie',\n\t'Bryony',\n\t'Rupinder',\n\t'Tenise',\n\t'Yazmyn',\n\t'Maricris',\n\t'Rhianon',\n\t'Nicolet',\n\t'Mui',\n\t'Nacy',\n\t'Naoko',\n\t'Gaila',\n\t'Charene',\n\t'Bas',\n\t'Geni',\n\t'Lorez',\n\t'Taneeka',\n\t'Tanikqua',\n\t'Tulani',\n\t'Sotiria',\n\t'Sheeba',\n\t'Katiuscia',\n\t'Eleftheria',\n\t'Ghislaine',\n\t'Jamiylah',\n\t'Omotayo',\n\t'Yuleidy',\n\t'Tylene',\n\t'Zanetta',\n\t'Yizza',\n\t'Ngan',\n\t'Natassha',\n\t'Sophear',\n\t'Starkisha',\n\t'Stehanie',\n\t'Jasie',\n\t'Aprile',\n\t'Billiejean',\n\t'Wilnelia',\n\t'Yaasmiyn',\n\t'Ednita',\n\t'Engracia',\n\t'Grisell',\n\t'Christinamarie',\n\t'Eftihia',\n\t'Jenniefer',\n\t'Chantee',\n\t'Afua',\n\t'Shamea',\n\t'Shamina',\n\t'Vickiana',\n\t'Sharoya',\n\t'Shateema',\n\t'Aubrea',\n\t'Alexcis',\n\t'Wallis',\n\t'Jalyne',\n\t'Harlea',\n\t'Carisia',\n\t'Cheynne',\n\t'Daylee',\n\t'Kyera',\n\t'Latayvia',\n\t'Raashida',\n\t'Saajida',\n\t'Nakema',\n\t'Annalyssa',\n\t'Chivonne',\n\t'Lyndie',\n\t'Sabrian',\n\t'Rahcel',\n\t'Hoai',\n\t'Krisann',\n\t'Jilliane',\n\t'Saide',\n\t'Matti',\n\t'Raigen',\n\t'Tenea',\n\t'Staphanie',\n\t'Zitlally',\n\t'Yudelca',\n\t'Raysa',\n\t'Monea',\n\t'Shanigua',\n\t'Shirah',\n\t'Chemise',\n\t'Jajaira',\n\t'Tunisha',\n\t'Yelissa',\n\t'Yudelka',\n\t'Taria',\n\t'Taralynn',\n\t'Condol',\n\t'Nikima',\n\t'Syrianna',\n\t'Anndrea',\n\t'Charae',\n\t'Ebelia',\n\t'Comfort',\n\t'Denishia',\n\t'Lanyia',\n\t'Lahna',\n\t'Iraima',\n\t'Josaline',\n\t'Onyinyechi',\n\t'Mykalah',\n\t'Shamyia',\n\t'Sarely',\n\t'Makaylie',\n\t'Madasyn',\n\t'Carron',\n\t'Shawnetta',\n\t'Dorca',\n\t'Subrena',\n\t'Romanda',\n\t'Sallyanne',\n\t'Ahniyah',\n\t'Annalissa',\n\t'Anikah',\n\t'Anet',\n\t'Emelee',\n\t'Branae',\n\t'Rosemaria',\n\t'Kimerly',\n\t'Lorra',\n\t'Breda',\n\t'Graceanne',\n\t'Kathyann',\n\t'Letetia',\n\t'Allaina',\n\t'Anaceli',\n\t'Brendalee',\n\t'Aidaly',\n\t'Arlana',\n\t'Trinetta',\n\t'Tennesha',\n\t'Talonda',\n\t'Sherrilynn',\n\t'Maloree',\n\t'Laiya',\n\t'Kynlea',\n\t'Ludwika',\n\t'Raeli',\n\t'Yadirah',\n\t'Yveth',\n\t'Sabrie',\n\t'Dannielynn',\n\t'Breely',\n\t'Jozlin',\n\t'Jewelyssa',\n\t'Keylie',\n\t'Jazzalyn',\n\t'Ijeoma',\n\t'Jaydie',\n\t'Irianna',\n\t'Ronya',\n\t'Lynee',\n\t'Myrian',\n\t'Cristalle',\n\t'Delinah',\n\t'Arnetia',\n\t'Guisela',\n\t'Orna',\n\t'Samehesha',\n\t'Scherrie',\n\t'Marylynne',\n\t'Judianne',\n\t'Tomasina',\n\t'Sanora',\n\t'Cheray',\n\t'Gordana',\n\t'Torina',\n\t'Yolandra',\n\t'Tyese',\n\t'Sharine',\n\t'Marea',\n\t'Areti',\n\t'Sharmila',\n\t'Charrise',\n\t'Cyndia',\n\t'Cinzia',\n\t'Gecenia',\n\t'Tarshia',\n\t'Luwanda',\n\t'Negar',\n\t'Sharah',\n\t'Sherah',\n\t'Sokha',\n\t'Marium',\n\t'Taslin',\n\t'Taleyah',\n\t'Parys',\n\t'Odeth',\n\t'Mirabai',\n\t'Myree',\n\t'Tyhesha',\n\t'Soyini',\n\t'Liria',\n\t'Jenille',\n\t'Marivic',\n\t'Mey',\n\t'Adrena',\n\t'Cristyn',\n\t'Jodette',\n\t'Ilea',\n\t'Jennett',\n\t'Latoi',\n\t'Charrisse',\n\t'Correne',\n\t'Reannon',\n\t'Shanah',\n\t'Shavaun',\n\t'Shelena',\n\t'Macrina',\n\t'Lashonna',\n\t'Tecia',\n\t'Zobeida',\n\t'Casilda',\n\t'Ketsy',\n\t'Lizza',\n\t'Lucesita',\n\t'Anelis',\n\t'Amori',\n\t'Atlantis',\n\t'Aslynn',\n\t'Kimbery',\n\t'Yolunda',\n\t'Pasqua',\n\t'Magalis',\n\t'Yanellie',\n\t'Tryniti',\n\t'Tniya',\n\t'Ziza',\n\t'Nadina',\n\t'Lloana',\n\t'Shoshannah',\n\t'Tamarie',\n\t'Ronique',\n\t'Keatyn',\n\t'Matison',\n\t'Micalah',\n\t'Nataya',\n\t'Mama',\n\t'Bailea',\n\t'Sidrah',\n\t'Jazzman',\n\t'Deanndra',\n\t'Shawniece',\n\t'Polett',\n\t'Rathana',\n\t'Timisha',\n\t'Tristina',\n\t'Vanezza',\n\t'Shiri',\n\t'Stephanieann',\n\t'Genessy',\n\t'Hema',\n\t'Huma',\n\t'Alessandria',\n\t'Yarisa',\n\t'Oyindamola',\n\t'Tianni',\n\t'Monasia',\n\t'Kely',\n\t'Khady',\n\t'Pegah',\n\t'Casarah',\n\t'Cassara',\n\t'Chalise',\n\t'Arti',\n\t'Natanya',\n\t'Masuma',\n\t'Shellyann',\n\t'Taje',\n\t'Saher',\n\t'Kelsye',\n\t'Odaly',\n\t'Talicia',\n\t'Mollee',\n\t'Tashea',\n\t'Shima',\n\t'Janaia',\n\t'Jenia',\n\t'Jharline',\n\t'Chabely',\n\t'Chalon',\n\t'Charnesha',\n\t'Christna',\n\t'Melika',\n\t'Melis',\n\t'Lesleyann',\n\t'Maleeka',\n\t'Krystalyn',\n\t'Krystalynn',\n\t'Marnisha',\n\t'Mariele',\n\t'Michelleann',\n\t'Melessa',\n\t'Diasy',\n\t'Dioselina',\n\t'Jenita',\n\t'Jaynae',\n\t'Jeanae',\n\t'Hripsime',\n\t'Janete',\n\t'Lanique',\n\t'Ashlon',\n\t'Aroosa',\n\t'Enisa',\n\t'Danaysha',\n\t'Briani',\n\t'Arjeta',\n\t'Sapir',\n\t'Naysha',\n\t'Kharisma',\n\t'Laterra',\n\t'Yannet',\n\t'Aruna',\n\t'Anaja',\n\t'Fahima',\n\t'Dasmine',\n\t'Amberlea',\n\t'Latiera',\n\t'Kimanh',\n\t'Mayuri',\n\t'Meshelle',\n\t'Morgane',\n\t'Nahal',\n\t'Mariacristina',\n\t'Marlisha',\n\t'Elaura',\n\t'Kacia',\n\t'Neesha',\n\t'Tila',\n\t'Waynisha',\n\t'Witney',\n\t'Niloofar',\n\t'Solina',\n\t'Soo',\n\t'Stphanie',\n\t'Shanesha',\n\t'Sharrell',\n\t'Nene',\n\t'Bleona',\n\t'Hudes',\n\t'Isatu',\n\t'Aylssa',\n\t'Camerina',\n\t'Arrielle',\n\t'Allycia',\n\t'Anacecilia',\n\t'Anairis',\n\t'Courney',\n\t'Dashanique',\n\t'Cedrina',\n\t'Celida',\n\t'Taaliyah',\n\t'Clarrissa',\n\t'Egla',\n\t'Duyen',\n\t'Kendle',\n\t'Janil',\n\t'Adeola',\n\t'Jazmene',\n\t'Leesha',\n\t'Lyzeth',\n\t'Madeley',\n\t'Khrystyna',\n\t'Charisa',\n\t'Crystelle',\n\t'Carinna',\n\t'Channy',\n\t'Flory',\n\t'Glenisha',\n\t'Sheida',\n\t'Naara',\n\t'Nassim',\n\t'Ngozi',\n\t'Nidya',\n\t'Marche',\n\t'Mariaesther',\n\t'Shaleena',\n\t'Kioni',\n\t'Nayab',\n\t'Nzinga',\n\t'Fizza',\n\t'Diavion',\n\t'Zanib',\n\t'Tionni',\n\t'Temitope',\n\t'Nasreen',\n\t'Melaysia',\n\t'Maame',\n\t'Sameen',\n\t'Azka',\n\t'Basma',\n\t'Virjean',\n\t'Jarmila',\n\t'Louren',\n\t'Mckenize',\n\t'Malyn',\n\t'Mercadies',\n\t'Vika',\n\t'Suong',\n\t'Mariadel',\n\t'Mariatheresa',\n\t'Marison',\n\t'Meleane',\n\t'Shabana',\n\t'Salote',\n\t'Raquell',\n\t'Rekha',\n\t'Sibel',\n\t'Shavaughn',\n\t'Shaquoia',\n\t'Shatera',\n\t'Fatina',\n\t'Jestina',\n\t'Latasia',\n\t'Geraldin',\n\t'Shirleymae',\n\t'Lubna',\n\t'Maxiel',\n\t'Naquasha',\n\t'Dalissa',\n\t'Chaniqua',\n\t'Chanele',\n\t'Jahlisa',\n\t'Faatimah',\n\t'Abagayle',\n\t'Adwoa',\n\t'Angeliqu',\n\t'Gelisa',\n\t'Bradi',\n\t'Shantice',\n\t'Sharece',\n\t'Nyiesha',\n\t'Yanill',\n\t'Yocasta',\n\t'Stepheni',\n\t'Suleika',\n\t'Takeema',\n\t'Kerrilyn',\n\t'Jamiyla',\n\t'Josephin',\n\t'Margarit',\n\t'Ilaisaane',\n\t'Jamilee',\n\t'Corvette',\n\t'Janitza',\n\t'Lexey',\n\t'Jazzmyne',\n\t'Kirstan',\n\t'Kattia',\n\t'Yatzary',\n\t'Pricsilla',\n\t'Gisette',\n\t'Panayiota',\n\t'Pinar',\n\t'Rasheida',\n\t'Tiffay',\n\t'Venisha',\n\t'Jennier',\n\t'Margulia',\n\t'Katima',\n\t'Anjoli',\n\t'Evelise',\n\t'Chetara',\n\t'Jaquelynn',\n\t'Pessie',\n\t'Quintessa',\n\t'Orit',\n\t'Nelissa',\n\t'Shekia',\n\t'Sherrise',\n\t'Abbye',\n\t'Imagine',\n\t'Britlyn',\n\t'Baley',\n\t'Tanequa',\n\t'Tanique',\n\t'Nocole',\n\t'Sokhom',\n\t'Krystelle',\n\t'Marqui',\n\t'Mariaangelica',\n\t'Raiven',\n\t'Nini',\n\t'Lesliee',\n\t'Crystalee',\n\t'Amadi',\n\t'Suzett',\n\t'Thelda',\n\t'Wladyslawa',\n\t'Shaqueen',\n\t'Shayra',\n\t'Domingue',\n\t'Garine',\n\t'Johnanna',\n\t'Karia',\n\t'Jany',\n\t'Ardele',\n\t'Bilma',\n\t'Lindita',\n\t'Lisbel',\n\t'Lyasia',\n\t'Kianie',\n\t'Saidah',\n\t'Niasha',\n\t'Chantele',\n\t'Brette',\n\t'Cydnie',\n\t'Chealsea',\n\t'Jaritsa',\n\t'Hanaa',\n\t'Jordain',\n\t'Kerria',\n\t'Shannara',\n\t'Shaquna',\n\t'Sultana',\n\t'Tajana',\n\t'Taquasha',\n\t'Queenasia',\n\t'Wandalee',\n\t'Mikalyn',\n\t'Jossette',\n\t'Jazsmine',\n\t'Keairra',\n\t'Arleny',\n\t'Selest',\n\t'Sabryn',\n\t'Jilliann',\n\t'Janin',\n\t'Kayliegh',\n\t'Alyss',\n\t'Asuka',\n\t'Chenin',\n\t'Eiliana',\n\t'Fahm',\n\t'Cyndle',\n\t'Daniesha',\n\t'Saranda',\n\t'Shany',\n\t'Veridiana',\n\t'Yanai',\n\t'Melanieann',\n\t'Mishell',\n\t'Mariadelosangel',\n\t'Rupa',\n\t'Orabelle',\n\t'Taquasia',\n\t'Tyquasia',\n\t'Cecillia',\n\t'Jeanet',\n\t'Lucely',\n\t'Kar',\n\t'Niaja',\n\t'Naquana',\n\t'Joanny',\n\t'Anjelique',\n\t'Aquasia',\n\t'Ardita',\n\t'Jatasia',\n\t'Donika',\n\t'Fantasha',\n\t'Dominiqua',\n\t'Elecia',\n\t'Deyra',\n\t'Erial',\n\t'Bayle',\n\t'Ninoska',\n\t'Jonee',\n\t'Jullisa',\n\t'Lavasia',\n\t'Laniqua',\n];\n\nexport const maxStringLength = 15;\n"
  },
  {
    "path": "drizzle-seed/src/datasets/jobsTitles.ts",
    "content": "/**\n * The original source for the job titles data was taken from https://www.kaggle.com/datasets/ravindrasinghrana/job-description-dataset\n */\nexport default [\n\t'Digital marketing specialist',\n\t'Web developer',\n\t'Operations manager',\n\t'Network engineer',\n\t'Event manager',\n\t'Software tester',\n\t'Teacher',\n\t'Ux/ui designer',\n\t'Wedding planner',\n\t'Qa analyst',\n\t'Litigation attorney',\n\t'Mechanical engineer',\n\t'Network administrator',\n\t'Account manager',\n\t'Brand manager',\n\t'Social worker',\n\t'Social media coordinator',\n\t'Email marketing specialist',\n\t'Hr generalist',\n\t'Legal assistant',\n\t'Nurse practitioner',\n\t'Account director',\n\t'Software engineer',\n\t'Purchasing agent',\n\t'Sales consultant',\n\t'Civil engineer',\n\t'Network security specialist',\n\t'Ui developer',\n\t'Financial planner',\n\t'Event planner',\n\t'Psychologist',\n\t'Electrical designer',\n\t'Data analyst',\n\t'Technical writer',\n\t'Tax consultant',\n\t'Account executive',\n\t'Systems administrator',\n\t'Database administrator',\n\t'Research analyst',\n\t'Data entry clerk',\n\t'Registered nurse',\n\t'Investment analyst',\n\t'Speech therapist',\n\t'Sales manager',\n\t'Landscape architect',\n\t'Key account manager',\n\t'Ux researcher',\n\t'Investment banker',\n\t'It support specialist',\n\t'Art director',\n\t'Software developer',\n\t'Project manager',\n\t'Customer service manager',\n\t'Procurement manager',\n\t'Substance abuse counselor',\n\t'Supply chain analyst',\n\t'Data engineer',\n\t'Accountant',\n\t'Sales representative',\n\t'Environmental consultant',\n\t'Electrical engineer',\n\t'Systems engineer',\n\t'Art teacher',\n\t'Human resources manager',\n\t'Inventory analyst',\n\t'Legal counsel',\n\t'Database developer',\n\t'Procurement specialist',\n\t'Systems analyst',\n\t'Copywriter',\n\t'Content writer',\n\t'Hr coordinator',\n\t'Business development manager',\n\t'Java developer',\n\t'Supply chain manager',\n\t'Event coordinator',\n\t'Family nurse practitioner',\n\t'Front-end engineer',\n\t'Customer success manager',\n\t'Procurement coordinator',\n\t'Urban planner',\n\t'Architectural designer',\n\t'Financial analyst',\n\t'Environmental engineer',\n\t'Back-end developer',\n\t'Structural engineer',\n\t'Market research analyst',\n\t'Customer service representative',\n\t'Customer support specialist',\n\t'Business analyst',\n\t'Social media manager',\n\t'Family lawyer',\n\t'Chemical analyst',\n\t'Network technician',\n\t'Interior designer',\n\t'Software architect',\n\t'Nurse manager',\n\t'Veterinarian',\n\t'Process engineer',\n\t'It manager',\n\t'Quality assurance analyst',\n\t'Pharmaceutical sales representative',\n\t'Office manager',\n\t'Architect',\n\t'Physician assistant',\n\t'Marketing director',\n\t'Front-end developer',\n\t'Research scientist',\n\t'Executive assistant',\n\t'Hr manager',\n\t'Marketing manager',\n\t'Public relations specialist',\n\t'Financial controller',\n\t'Investment advisor',\n\t'Aerospace engineer',\n\t'Marketing analyst',\n\t'Paralegal',\n\t'Landscape designer',\n\t'Web designer',\n\t'Occupational therapist',\n\t'Legal advisor',\n\t'Marketing coordinator',\n\t'Dental hygienist',\n\t'Sem specialist',\n\t'Seo specialist',\n\t'Pediatrician',\n\t'Qa engineer',\n\t'Data scientist',\n\t'Financial advisor',\n\t'Personal assistant',\n\t'Seo analyst',\n\t'Network analyst',\n\t'Mechanical designer',\n\t'Marketing specialist',\n\t'Graphic designer',\n\t'Finance manager',\n\t'Physical therapist',\n\t'Product designer',\n\t'Administrative assistant',\n\t'Brand ambassador',\n\t'Project coordinator',\n\t'Product manager',\n\t'It administrator',\n\t'Sales associate',\n\t'Chemical engineer',\n\t'Legal secretary',\n\t'Market analyst',\n];\n\nexport const maxStringLength = 35;\n"
  },
  {
    "path": "drizzle-seed/src/datasets/lastNames.ts",
    "content": "/**\n * The original source for last names data was taken from https://www.kaggle.com/datasets/fivethirtyeight/fivethirtyeight-most-common-name-dataset?resource=download&select=surnames.csv\n */\nexport default [\n\t'Smith',\n\t'Johnson',\n\t'Williams',\n\t'Brown',\n\t'Jones',\n\t'Miller',\n\t'Davis',\n\t'Garcia',\n\t'Rodriguez',\n\t'Wilson',\n\t'Martinez',\n\t'Anderson',\n\t'Taylor',\n\t'Thomas',\n\t'Hernandez',\n\t'Moore',\n\t'Martin',\n\t'Jackson',\n\t'Thompson',\n\t'White',\n\t'Lopez',\n\t'Lee',\n\t'Gonzalez',\n\t'Harris',\n\t'Clark',\n\t'Lewis',\n\t'Robinson',\n\t'Walker',\n\t'Perez',\n\t'Hall',\n\t'Young',\n\t'Allen',\n\t'Sanchez',\n\t'Wright',\n\t'King',\n\t'Scott',\n\t'Green',\n\t'Baker',\n\t'Adams',\n\t'Nelson',\n\t'Hill',\n\t'Ramirez',\n\t'Campbell',\n\t'Mitchell',\n\t'Roberts',\n\t'Carter',\n\t'Phillips',\n\t'Evans',\n\t'Turner',\n\t'Torres',\n\t'Parker',\n\t'Collins',\n\t'Edwards',\n\t'Stewart',\n\t'Flores',\n\t'Morris',\n\t'Nguyen',\n\t'Murphy',\n\t'Rivera',\n\t'Cook',\n\t'Rogers',\n\t'Morgan',\n\t'Peterson',\n\t'Cooper',\n\t'Reed',\n\t'Bailey',\n\t'Bell',\n\t'Gomez',\n\t'Kelly',\n\t'Howard',\n\t'Ward',\n\t'Cox',\n\t'Diaz',\n\t'Richardson',\n\t'Wood',\n\t'Watson',\n\t'Brooks',\n\t'Bennett',\n\t'Gray',\n\t'James',\n\t'Reyes',\n\t'Cruz',\n\t'Hughes',\n\t'Price',\n\t'Myers',\n\t'Long',\n\t'Foster',\n\t'Sanders',\n\t'Ross',\n\t'Morales',\n\t'Powell',\n\t'Sullivan',\n\t'Russell',\n\t'Ortiz',\n\t'Jenkins',\n\t'Gutierrez',\n\t'Perry',\n\t'Butler',\n\t'Barnes',\n\t'Fisher',\n\t'Henderson',\n\t'Coleman',\n\t'Simmons',\n\t'Patterson',\n\t'Jordan',\n\t'Reynolds',\n\t'Hamilton',\n\t'Graham',\n\t'Kim',\n\t'Gonzales',\n\t'Alexander',\n\t'Ramos',\n\t'Wallace',\n\t'Griffin',\n\t'West',\n\t'Cole',\n\t'Hayes',\n\t'Chavez',\n\t'Gibson',\n\t'Bryant',\n\t'Ellis',\n\t'Stevens',\n\t'Murray',\n\t'Ford',\n\t'Marshall',\n\t'Owens',\n\t'Mcdonald',\n\t'Harrison',\n\t'Ruiz',\n\t'Kennedy',\n\t'Wells',\n\t'Alvarez',\n\t'Woods',\n\t'Mendoza',\n\t'Castillo',\n\t'Olson',\n\t'Webb',\n\t'Washington',\n\t'Tucker',\n\t'Freeman',\n\t'Burns',\n\t'Henry',\n\t'Vasquez',\n\t'Snyder',\n\t'Simpson',\n\t'Crawford',\n\t'Jimenez',\n\t'Porter',\n\t'Mason',\n\t'Shaw',\n\t'Gordon',\n\t'Wagner',\n\t'Hunter',\n\t'Romero',\n\t'Hicks',\n\t'Dixon',\n\t'Hunt',\n\t'Palmer',\n\t'Robertson',\n\t'Black',\n\t'Holmes',\n\t'Stone',\n\t'Meyer',\n\t'Boyd',\n\t'Mills',\n\t'Warren',\n\t'Fox',\n\t'Rose',\n\t'Rice',\n\t'Moreno',\n\t'Schmidt',\n\t'Patel',\n\t'Ferguson',\n\t'Nichols',\n\t'Herrera',\n\t'Medina',\n\t'Ryan',\n\t'Fernandez',\n\t'Weaver',\n\t'Daniels',\n\t'Stephens',\n\t'Gardner',\n\t'Payne',\n\t'Kelley',\n\t'Dunn',\n\t'Pierce',\n\t'Arnold',\n\t'Tran',\n\t'Spencer',\n\t'Peters',\n\t'Hawkins',\n\t'Grant',\n\t'Hansen',\n\t'Castro',\n\t'Hoffman',\n\t'Hart',\n\t'Elliott',\n\t'Cunningham',\n\t'Knight',\n\t'Bradley',\n\t'Carroll',\n\t'Hudson',\n\t'Duncan',\n\t'Armstrong',\n\t'Berry',\n\t'Andrews',\n\t'Johnston',\n\t'Ray',\n\t'Lane',\n\t'Riley',\n\t'Carpenter',\n\t'Perkins',\n\t'Aguilar',\n\t'Silva',\n\t'Richards',\n\t'Willis',\n\t'Matthews',\n\t'Chapman',\n\t'Lawrence',\n\t'Garza',\n\t'Vargas',\n\t'Watkins',\n\t'Wheeler',\n\t'Larson',\n\t'Carlson',\n\t'Harper',\n\t'George',\n\t'Greene',\n\t'Burke',\n\t'Guzman',\n\t'Morrison',\n\t'Munoz',\n\t'Jacobs',\n\t'Obrien',\n\t'Lawson',\n\t'Franklin',\n\t'Lynch',\n\t'Bishop',\n\t'Carr',\n\t'Salazar',\n\t'Austin',\n\t'Mendez',\n\t'Gilbert',\n\t'Jensen',\n\t'Williamson',\n\t'Montgomery',\n\t'Harvey',\n\t'Oliver',\n\t'Howell',\n\t'Dean',\n\t'Hanson',\n\t'Weber',\n\t'Garrett',\n\t'Sims',\n\t'Burton',\n\t'Fuller',\n\t'Soto',\n\t'Mccoy',\n\t'Welch',\n\t'Chen',\n\t'Schultz',\n\t'Walters',\n\t'Reid',\n\t'Fields',\n\t'Walsh',\n\t'Little',\n\t'Fowler',\n\t'Bowman',\n\t'Davidson',\n\t'May',\n\t'Day',\n\t'Schneider',\n\t'Newman',\n\t'Brewer',\n\t'Lucas',\n\t'Holland',\n\t'Wong',\n\t'Banks',\n\t'Santos',\n\t'Curtis',\n\t'Pearson',\n\t'Delgado',\n\t'Valdez',\n\t'Pena',\n\t'Rios',\n\t'Douglas',\n\t'Sandoval',\n\t'Barrett',\n\t'Hopkins',\n\t'Keller',\n\t'Guerrero',\n\t'Stanley',\n\t'Bates',\n\t'Alvarado',\n\t'Beck',\n\t'Ortega',\n\t'Wade',\n\t'Estrada',\n\t'Contreras',\n\t'Barnett',\n\t'Caldwell',\n\t'Santiago',\n\t'Lambert',\n\t'Powers',\n\t'Chambers',\n\t'Nunez',\n\t'Craig',\n\t'Leonard',\n\t'Lowe',\n\t'Rhodes',\n\t'Byrd',\n\t'Gregory',\n\t'Shelton',\n\t'Frazier',\n\t'Becker',\n\t'Maldonado',\n\t'Fleming',\n\t'Vega',\n\t'Sutton',\n\t'Cohen',\n\t'Jennings',\n\t'Parks',\n\t'Mcdaniel',\n\t'Watts',\n\t'Barker',\n\t'Norris',\n\t'Vaughn',\n\t'Vazquez',\n\t'Holt',\n\t'Schwartz',\n\t'Steele',\n\t'Benson',\n\t'Neal',\n\t'Dominguez',\n\t'Horton',\n\t'Terry',\n\t'Wolfe',\n\t'Hale',\n\t'Lyons',\n\t'Graves',\n\t'Haynes',\n\t'Miles',\n\t'Park',\n\t'Warner',\n\t'Padilla',\n\t'Bush',\n\t'Thornton',\n\t'Mccarthy',\n\t'Mann',\n\t'Zimmerman',\n\t'Erickson',\n\t'Fletcher',\n\t'Mckinney',\n\t'Page',\n\t'Dawson',\n\t'Joseph',\n\t'Marquez',\n\t'Reeves',\n\t'Klein',\n\t'Espinoza',\n\t'Baldwin',\n\t'Moran',\n\t'Love',\n\t'Robbins',\n\t'Higgins',\n\t'Ball',\n\t'Cortez',\n\t'Le',\n\t'Griffith',\n\t'Bowen',\n\t'Sharp',\n\t'Cummings',\n\t'Ramsey',\n\t'Hardy',\n\t'Swanson',\n\t'Barber',\n\t'Acosta',\n\t'Luna',\n\t'Chandler',\n\t'Blair',\n\t'Daniel',\n\t'Cross',\n\t'Simon',\n\t'Dennis',\n\t'Oconnor',\n\t'Quinn',\n\t'Gross',\n\t'Navarro',\n\t'Moss',\n\t'Fitzgerald',\n\t'Doyle',\n\t'Mclaughlin',\n\t'Rojas',\n\t'Rodgers',\n\t'Stevenson',\n\t'Singh',\n\t'Yang',\n\t'Figueroa',\n\t'Harmon',\n\t'Newton',\n\t'Paul',\n\t'Manning',\n\t'Garner',\n\t'Mcgee',\n\t'Reese',\n\t'Francis',\n\t'Burgess',\n\t'Adkins',\n\t'Goodman',\n\t'Curry',\n\t'Brady',\n\t'Christensen',\n\t'Potter',\n\t'Walton',\n\t'Goodwin',\n\t'Mullins',\n\t'Molina',\n\t'Webster',\n\t'Fischer',\n\t'Campos',\n\t'Avila',\n\t'Sherman',\n\t'Todd',\n\t'Chang',\n\t'Blake',\n\t'Malone',\n\t'Wolf',\n\t'Hodges',\n\t'Juarez',\n\t'Gill',\n\t'Farmer',\n\t'Hines',\n\t'Gallagher',\n\t'Duran',\n\t'Hubbard',\n\t'Cannon',\n\t'Miranda',\n\t'Wang',\n\t'Saunders',\n\t'Tate',\n\t'Mack',\n\t'Hammond',\n\t'Carrillo',\n\t'Townsend',\n\t'Wise',\n\t'Ingram',\n\t'Barton',\n\t'Mejia',\n\t'Ayala',\n\t'Schroeder',\n\t'Hampton',\n\t'Rowe',\n\t'Parsons',\n\t'Frank',\n\t'Waters',\n\t'Strickland',\n\t'Osborne',\n\t'Maxwell',\n\t'Chan',\n\t'Deleon',\n\t'Norman',\n\t'Harrington',\n\t'Casey',\n\t'Patton',\n\t'Logan',\n\t'Bowers',\n\t'Mueller',\n\t'Glover',\n\t'Floyd',\n\t'Hartman',\n\t'Buchanan',\n\t'Cobb',\n\t'French',\n\t'Kramer',\n\t'Mccormick',\n\t'Clarke',\n\t'Tyler',\n\t'Gibbs',\n\t'Moody',\n\t'Conner',\n\t'Sparks',\n\t'Mcguire',\n\t'Leon',\n\t'Bauer',\n\t'Norton',\n\t'Pope',\n\t'Flynn',\n\t'Hogan',\n\t'Robles',\n\t'Salinas',\n\t'Yates',\n\t'Lindsey',\n\t'Lloyd',\n\t'Marsh',\n\t'Mcbride',\n\t'Owen',\n\t'Solis',\n\t'Pham',\n\t'Lang',\n\t'Pratt',\n\t'Lara',\n\t'Brock',\n\t'Ballard',\n\t'Trujillo',\n\t'Shaffer',\n\t'Drake',\n\t'Roman',\n\t'Aguirre',\n\t'Morton',\n\t'Stokes',\n\t'Lamb',\n\t'Pacheco',\n\t'Patrick',\n\t'Cochran',\n\t'Shepherd',\n\t'Cain',\n\t'Burnett',\n\t'Hess',\n\t'Li',\n\t'Cervantes',\n\t'Olsen',\n\t'Briggs',\n\t'Ochoa',\n\t'Cabrera',\n\t'Velasquez',\n\t'Montoya',\n\t'Roth',\n\t'Meyers',\n\t'Cardenas',\n\t'Fuentes',\n\t'Weiss',\n\t'Hoover',\n\t'Wilkins',\n\t'Nicholson',\n\t'Underwood',\n\t'Short',\n\t'Carson',\n\t'Morrow',\n\t'Colon',\n\t'Holloway',\n\t'Summers',\n\t'Bryan',\n\t'Petersen',\n\t'Mckenzie',\n\t'Serrano',\n\t'Wilcox',\n\t'Carey',\n\t'Clayton',\n\t'Poole',\n\t'Calderon',\n\t'Gallegos',\n\t'Greer',\n\t'Rivas',\n\t'Guerra',\n\t'Decker',\n\t'Collier',\n\t'Wall',\n\t'Whitaker',\n\t'Bass',\n\t'Flowers',\n\t'Davenport',\n\t'Conley',\n\t'Houston',\n\t'Huff',\n\t'Copeland',\n\t'Hood',\n\t'Monroe',\n\t'Massey',\n\t'Roberson',\n\t'Combs',\n\t'Franco',\n\t'Larsen',\n\t'Pittman',\n\t'Randall',\n\t'Skinner',\n\t'Wilkinson',\n\t'Kirby',\n\t'Cameron',\n\t'Bridges',\n\t'Anthony',\n\t'Richard',\n\t'Kirk',\n\t'Bruce',\n\t'Singleton',\n\t'Mathis',\n\t'Bradford',\n\t'Boone',\n\t'Abbott',\n\t'Charles',\n\t'Allison',\n\t'Sweeney',\n\t'Atkinson',\n\t'Horn',\n\t'Jefferson',\n\t'Rosales',\n\t'York',\n\t'Christian',\n\t'Phelps',\n\t'Farrell',\n\t'Castaneda',\n\t'Nash',\n\t'Dickerson',\n\t'Bond',\n\t'Wyatt',\n\t'Foley',\n\t'Chase',\n\t'Gates',\n\t'Vincent',\n\t'Mathews',\n\t'Hodge',\n\t'Garrison',\n\t'Trevino',\n\t'Villarreal',\n\t'Heath',\n\t'Dalton',\n\t'Valencia',\n\t'Callahan',\n\t'Hensley',\n\t'Atkins',\n\t'Huffman',\n\t'Roy',\n\t'Boyer',\n\t'Shields',\n\t'Lin',\n\t'Hancock',\n\t'Grimes',\n\t'Glenn',\n\t'Cline',\n\t'Delacruz',\n\t'Camacho',\n\t'Dillon',\n\t'Parrish',\n\t'Oneill',\n\t'Melton',\n\t'Booth',\n\t'Kane',\n\t'Berg',\n\t'Harrell',\n\t'Pitts',\n\t'Savage',\n\t'Wiggins',\n\t'Brennan',\n\t'Salas',\n\t'Marks',\n\t'Russo',\n\t'Sawyer',\n\t'Baxter',\n\t'Golden',\n\t'Hutchinson',\n\t'Liu',\n\t'Walter',\n\t'Mcdowell',\n\t'Wiley',\n\t'Rich',\n\t'Humphrey',\n\t'Johns',\n\t'Koch',\n\t'Suarez',\n\t'Hobbs',\n\t'Beard',\n\t'Gilmore',\n\t'Ibarra',\n\t'Keith',\n\t'Macias',\n\t'Khan',\n\t'Andrade',\n\t'Ware',\n\t'Stephenson',\n\t'Henson',\n\t'Wilkerson',\n\t'Dyer',\n\t'Mcclure',\n\t'Blackwell',\n\t'Mercado',\n\t'Tanner',\n\t'Eaton',\n\t'Clay',\n\t'Barron',\n\t'Beasley',\n\t'Oneal',\n\t'Preston',\n\t'Small',\n\t'Wu',\n\t'Zamora',\n\t'Macdonald',\n\t'Vance',\n\t'Snow',\n\t'Mcclain',\n\t'Stafford',\n\t'Orozco',\n\t'Barry',\n\t'English',\n\t'Shannon',\n\t'Kline',\n\t'Jacobson',\n\t'Woodard',\n\t'Huang',\n\t'Kemp',\n\t'Mosley',\n\t'Prince',\n\t'Merritt',\n\t'Hurst',\n\t'Villanueva',\n\t'Roach',\n\t'Nolan',\n\t'Lam',\n\t'Yoder',\n\t'Mccullough',\n\t'Lester',\n\t'Santana',\n\t'Valenzuela',\n\t'Winters',\n\t'Barrera',\n\t'Leach',\n\t'Orr',\n\t'Berger',\n\t'Mckee',\n\t'Strong',\n\t'Conway',\n\t'Stein',\n\t'Whitehead',\n\t'Bullock',\n\t'Escobar',\n\t'Knox',\n\t'Meadows',\n\t'Solomon',\n\t'Velez',\n\t'Odonnell',\n\t'Kerr',\n\t'Stout',\n\t'Blankenship',\n\t'Browning',\n\t'Kent',\n\t'Lozano',\n\t'Bartlett',\n\t'Pruitt',\n\t'Buck',\n\t'Barr',\n\t'Gaines',\n\t'Durham',\n\t'Gentry',\n\t'Mcintyre',\n\t'Sloan',\n\t'Rocha',\n\t'Melendez',\n\t'Herman',\n\t'Sexton',\n\t'Moon',\n\t'Hendricks',\n\t'Rangel',\n\t'Stark',\n\t'Lowery',\n\t'Hardin',\n\t'Hull',\n\t'Sellers',\n\t'Ellison',\n\t'Calhoun',\n\t'Gillespie',\n\t'Mora',\n\t'Knapp',\n\t'Mccall',\n\t'Morse',\n\t'Dorsey',\n\t'Weeks',\n\t'Nielsen',\n\t'Livingston',\n\t'Leblanc',\n\t'Mclean',\n\t'Bradshaw',\n\t'Glass',\n\t'Middleton',\n\t'Buckley',\n\t'Schaefer',\n\t'Frost',\n\t'Howe',\n\t'House',\n\t'Mcintosh',\n\t'Ho',\n\t'Pennington',\n\t'Reilly',\n\t'Hebert',\n\t'Mcfarland',\n\t'Hickman',\n\t'Noble',\n\t'Spears',\n\t'Conrad',\n\t'Arias',\n\t'Galvan',\n\t'Velazquez',\n\t'Huynh',\n\t'Frederick',\n\t'Randolph',\n\t'Cantu',\n\t'Fitzpatrick',\n\t'Mahoney',\n\t'Peck',\n\t'Villa',\n\t'Michael',\n\t'Donovan',\n\t'Mcconnell',\n\t'Walls',\n\t'Boyle',\n\t'Mayer',\n\t'Zuniga',\n\t'Giles',\n\t'Pineda',\n\t'Pace',\n\t'Hurley',\n\t'Mays',\n\t'Mcmillan',\n\t'Crosby',\n\t'Ayers',\n\t'Case',\n\t'Bentley',\n\t'Shepard',\n\t'Everett',\n\t'Pugh',\n\t'David',\n\t'Mcmahon',\n\t'Dunlap',\n\t'Bender',\n\t'Hahn',\n\t'Harding',\n\t'Acevedo',\n\t'Raymond',\n\t'Blackburn',\n\t'Duffy',\n\t'Landry',\n\t'Dougherty',\n\t'Bautista',\n\t'Shah',\n\t'Potts',\n\t'Arroyo',\n\t'Valentine',\n\t'Meza',\n\t'Gould',\n\t'Vaughan',\n\t'Fry',\n\t'Rush',\n\t'Avery',\n\t'Herring',\n\t'Dodson',\n\t'Clements',\n\t'Sampson',\n\t'Tapia',\n\t'Bean',\n\t'Lynn',\n\t'Crane',\n\t'Farley',\n\t'Cisneros',\n\t'Benton',\n\t'Ashley',\n\t'Mckay',\n\t'Finley',\n\t'Best',\n\t'Blevins',\n\t'Friedman',\n\t'Moses',\n\t'Sosa',\n\t'Blanchard',\n\t'Huber',\n\t'Frye',\n\t'Krueger',\n\t'Bernard',\n\t'Rosario',\n\t'Rubio',\n\t'Mullen',\n\t'Benjamin',\n\t'Haley',\n\t'Chung',\n\t'Moyer',\n\t'Choi',\n\t'Horne',\n\t'Yu',\n\t'Woodward',\n\t'Ali',\n\t'Nixon',\n\t'Hayden',\n\t'Rivers',\n\t'Estes',\n\t'Mccarty',\n\t'Richmond',\n\t'Stuart',\n\t'Maynard',\n\t'Brandt',\n\t'Oconnell',\n\t'Hanna',\n\t'Sanford',\n\t'Sheppard',\n\t'Church',\n\t'Burch',\n\t'Levy',\n\t'Rasmussen',\n\t'Coffey',\n\t'Ponce',\n\t'Faulkner',\n\t'Donaldson',\n\t'Schmitt',\n\t'Novak',\n\t'Costa',\n\t'Montes',\n\t'Booker',\n\t'Cordova',\n\t'Waller',\n\t'Arellano',\n\t'Maddox',\n\t'Mata',\n\t'Bonilla',\n\t'Stanton',\n\t'Compton',\n\t'Kaufman',\n\t'Dudley',\n\t'Mcpherson',\n\t'Beltran',\n\t'Dickson',\n\t'Mccann',\n\t'Villegas',\n\t'Proctor',\n\t'Hester',\n\t'Cantrell',\n\t'Daugherty',\n\t'Cherry',\n\t'Bray',\n\t'Davila',\n\t'Rowland',\n\t'Levine',\n\t'Madden',\n\t'Spence',\n\t'Good',\n\t'Irwin',\n\t'Werner',\n\t'Krause',\n\t'Petty',\n\t'Whitney',\n\t'Baird',\n\t'Hooper',\n\t'Pollard',\n\t'Zavala',\n\t'Jarvis',\n\t'Holden',\n\t'Haas',\n\t'Hendrix',\n\t'Mcgrath',\n\t'Bird',\n\t'Lucero',\n\t'Terrell',\n\t'Riggs',\n\t'Joyce',\n\t'Mercer',\n\t'Rollins',\n\t'Galloway',\n\t'Duke',\n\t'Odom',\n\t'Andersen',\n\t'Downs',\n\t'Hatfield',\n\t'Benitez',\n\t'Archer',\n\t'Huerta',\n\t'Travis',\n\t'Mcneil',\n\t'Hinton',\n\t'Zhang',\n\t'Hays',\n\t'Mayo',\n\t'Fritz',\n\t'Branch',\n\t'Mooney',\n\t'Ewing',\n\t'Ritter',\n\t'Esparza',\n\t'Frey',\n\t'Braun',\n\t'Gay',\n\t'Riddle',\n\t'Haney',\n\t'Kaiser',\n\t'Holder',\n\t'Chaney',\n\t'Mcknight',\n\t'Gamble',\n\t'Vang',\n\t'Cooley',\n\t'Carney',\n\t'Cowan',\n\t'Forbes',\n\t'Ferrell',\n\t'Davies',\n\t'Barajas',\n\t'Shea',\n\t'Osborn',\n\t'Bright',\n\t'Cuevas',\n\t'Bolton',\n\t'Murillo',\n\t'Lutz',\n\t'Duarte',\n\t'Kidd',\n\t'Key',\n\t'Cooke',\n\t'Goff',\n\t'Dejesus',\n\t'Marin',\n\t'Dotson',\n\t'Bonner',\n\t'Cotton',\n\t'Merrill',\n\t'Lindsay',\n\t'Lancaster',\n\t'Mcgowan',\n\t'Felix',\n\t'Salgado',\n\t'Slater',\n\t'Carver',\n\t'Guthrie',\n\t'Holman',\n\t'Fulton',\n\t'Snider',\n\t'Sears',\n\t'Witt',\n\t'Newell',\n\t'Byers',\n\t'Lehman',\n\t'Gorman',\n\t'Costello',\n\t'Donahue',\n\t'Delaney',\n\t'Albert',\n\t'Workman',\n\t'Rosas',\n\t'Springer',\n\t'Kinney',\n\t'Justice',\n\t'Odell',\n\t'Lake',\n\t'Donnelly',\n\t'Law',\n\t'Dailey',\n\t'Guevara',\n\t'Shoemaker',\n\t'Barlow',\n\t'Marino',\n\t'Winter',\n\t'Craft',\n\t'Katz',\n\t'Pickett',\n\t'Espinosa',\n\t'Maloney',\n\t'Daly',\n\t'Goldstein',\n\t'Crowley',\n\t'Vogel',\n\t'Kuhn',\n\t'Pearce',\n\t'Hartley',\n\t'Cleveland',\n\t'Palacios',\n\t'Mcfadden',\n\t'Britt',\n\t'Wooten',\n\t'Cortes',\n\t'Dillard',\n\t'Childers',\n\t'Alford',\n\t'Dodd',\n\t'Emerson',\n\t'Wilder',\n\t'Lange',\n\t'Goldberg',\n\t'Quintero',\n\t'Beach',\n\t'Enriquez',\n\t'Quintana',\n\t'Helms',\n\t'Mackey',\n\t'Finch',\n\t'Cramer',\n\t'Minor',\n\t'Flanagan',\n\t'Franks',\n\t'Corona',\n\t'Kendall',\n\t'Mccabe',\n\t'Hendrickson',\n\t'Moser',\n\t'Mcdermott',\n\t'Camp',\n\t'Mcleod',\n\t'Bernal',\n\t'Kaplan',\n\t'Medrano',\n\t'Lugo',\n\t'Tracy',\n\t'Bacon',\n\t'Crowe',\n\t'Richter',\n\t'Welsh',\n\t'Holley',\n\t'Ratliff',\n\t'Mayfield',\n\t'Talley',\n\t'Haines',\n\t'Dale',\n\t'Gibbons',\n\t'Hickey',\n\t'Byrne',\n\t'Kirkland',\n\t'Farris',\n\t'Correa',\n\t'Tillman',\n\t'Sweet',\n\t'Kessler',\n\t'England',\n\t'Hewitt',\n\t'Blanco',\n\t'Connolly',\n\t'Pate',\n\t'Elder',\n\t'Bruno',\n\t'Holcomb',\n\t'Hyde',\n\t'Mcallister',\n\t'Cash',\n\t'Christopher',\n\t'Whitfield',\n\t'Meeks',\n\t'Hatcher',\n\t'Fink',\n\t'Sutherland',\n\t'Noel',\n\t'Ritchie',\n\t'Rosa',\n\t'Leal',\n\t'Joyner',\n\t'Starr',\n\t'Morin',\n\t'Delarosa',\n\t'Connor',\n\t'Hilton',\n\t'Alston',\n\t'Gilliam',\n\t'Wynn',\n\t'Wills',\n\t'Jaramillo',\n\t'Oneil',\n\t'Nieves',\n\t'Britton',\n\t'Rankin',\n\t'Belcher',\n\t'Guy',\n\t'Chamberlain',\n\t'Tyson',\n\t'Puckett',\n\t'Downing',\n\t'Sharpe',\n\t'Boggs',\n\t'Truong',\n\t'Pierson',\n\t'Godfrey',\n\t'Mobley',\n\t'John',\n\t'Kern',\n\t'Dye',\n\t'Hollis',\n\t'Bravo',\n\t'Magana',\n\t'Rutherford',\n\t'Ng',\n\t'Tuttle',\n\t'Lim',\n\t'Romano',\n\t'Trejo',\n\t'Arthur',\n\t'Knowles',\n\t'Lyon',\n\t'Shirley',\n\t'Quinones',\n\t'Childs',\n\t'Dolan',\n\t'Head',\n\t'Reyna',\n\t'Saenz',\n\t'Hastings',\n\t'Kenney',\n\t'Cano',\n\t'Foreman',\n\t'Denton',\n\t'Villalobos',\n\t'Pryor',\n\t'Sargent',\n\t'Doherty',\n\t'Hopper',\n\t'Phan',\n\t'Womack',\n\t'Lockhart',\n\t'Ventura',\n\t'Dwyer',\n\t'Muller',\n\t'Galindo',\n\t'Grace',\n\t'Sorensen',\n\t'Courtney',\n\t'Parra',\n\t'Rodrigues',\n\t'Nicholas',\n\t'Ahmed',\n\t'Mcginnis',\n\t'Langley',\n\t'Madison',\n\t'Locke',\n\t'Jamison',\n\t'Nava',\n\t'Gustafson',\n\t'Sykes',\n\t'Dempsey',\n\t'Hamm',\n\t'Rodriquez',\n\t'Mcgill',\n\t'Xiong',\n\t'Esquivel',\n\t'Simms',\n\t'Kendrick',\n\t'Boyce',\n\t'Vigil',\n\t'Downey',\n\t'Mckenna',\n\t'Sierra',\n\t'Webber',\n\t'Kirkpatrick',\n\t'Dickinson',\n\t'Couch',\n\t'Burks',\n\t'Sheehan',\n\t'Slaughter',\n\t'Pike',\n\t'Whitley',\n\t'Magee',\n\t'Cheng',\n\t'Sinclair',\n\t'Cassidy',\n\t'Rutledge',\n\t'Burris',\n\t'Bowling',\n\t'Crabtree',\n\t'Mcnamara',\n\t'Avalos',\n\t'Vu',\n\t'Herron',\n\t'Broussard',\n\t'Abraham',\n\t'Garland',\n\t'Corbett',\n\t'Corbin',\n\t'Stinson',\n\t'Chin',\n\t'Burt',\n\t'Hutchins',\n\t'Woodruff',\n\t'Lau',\n\t'Brandon',\n\t'Singer',\n\t'Hatch',\n\t'Rossi',\n\t'Shafer',\n\t'Ott',\n\t'Goss',\n\t'Gregg',\n\t'Dewitt',\n\t'Tang',\n\t'Polk',\n\t'Worley',\n\t'Covington',\n\t'Saldana',\n\t'Heller',\n\t'Emery',\n\t'Swartz',\n\t'Cho',\n\t'Mccray',\n\t'Elmore',\n\t'Rosenberg',\n\t'Simons',\n\t'Clemons',\n\t'Beatty',\n\t'Harden',\n\t'Herbert',\n\t'Bland',\n\t'Rucker',\n\t'Manley',\n\t'Ziegler',\n\t'Grady',\n\t'Lott',\n\t'Rouse',\n\t'Gleason',\n\t'Mcclellan',\n\t'Abrams',\n\t'Vo',\n\t'Albright',\n\t'Meier',\n\t'Dunbar',\n\t'Ackerman',\n\t'Padgett',\n\t'Mayes',\n\t'Tipton',\n\t'Coffman',\n\t'Peralta',\n\t'Shapiro',\n\t'Roe',\n\t'Weston',\n\t'Plummer',\n\t'Helton',\n\t'Stern',\n\t'Fraser',\n\t'Stover',\n\t'Fish',\n\t'Schumacher',\n\t'Baca',\n\t'Curran',\n\t'Vinson',\n\t'Vera',\n\t'Clifton',\n\t'Ervin',\n\t'Eldridge',\n\t'Lowry',\n\t'Childress',\n\t'Becerra',\n\t'Gore',\n\t'Seymour',\n\t'Chu',\n\t'Field',\n\t'Akers',\n\t'Carrasco',\n\t'Bingham',\n\t'Sterling',\n\t'Greenwood',\n\t'Leslie',\n\t'Groves',\n\t'Manuel',\n\t'Swain',\n\t'Edmonds',\n\t'Muniz',\n\t'Thomson',\n\t'Crouch',\n\t'Walden',\n\t'Smart',\n\t'Tomlinson',\n\t'Alfaro',\n\t'Quick',\n\t'Goldman',\n\t'Mcelroy',\n\t'Yarbrough',\n\t'Funk',\n\t'Hong',\n\t'Portillo',\n\t'Lund',\n\t'Ngo',\n\t'Elkins',\n\t'Stroud',\n\t'Meredith',\n\t'Battle',\n\t'Mccauley',\n\t'Zapata',\n\t'Bloom',\n\t'Gee',\n\t'Givens',\n\t'Cardona',\n\t'Schafer',\n\t'Robison',\n\t'Gunter',\n\t'Griggs',\n\t'Tovar',\n\t'Teague',\n\t'Swift',\n\t'Bowden',\n\t'Schulz',\n\t'Blanton',\n\t'Buckner',\n\t'Whalen',\n\t'Pritchard',\n\t'Pierre',\n\t'Kang',\n\t'Metcalf',\n\t'Butts',\n\t'Kurtz',\n\t'Sanderson',\n\t'Tompkins',\n\t'Inman',\n\t'Crowder',\n\t'Dickey',\n\t'Hutchison',\n\t'Conklin',\n\t'Hoskins',\n\t'Holbrook',\n\t'Horner',\n\t'Neely',\n\t'Tatum',\n\t'Hollingsworth',\n\t'Draper',\n\t'Clement',\n\t'Lord',\n\t'Reece',\n\t'Feldman',\n\t'Kay',\n\t'Hagen',\n\t'Crews',\n\t'Bowles',\n\t'Post',\n\t'Jewell',\n\t'Daley',\n\t'Cordero',\n\t'Mckinley',\n\t'Velasco',\n\t'Masters',\n\t'Driscoll',\n\t'Burrell',\n\t'Valle',\n\t'Crow',\n\t'Devine',\n\t'Larkin',\n\t'Chappell',\n\t'Pollock',\n\t'Ly',\n\t'Kimball',\n\t'Schmitz',\n\t'Lu',\n\t'Rubin',\n\t'Self',\n\t'Barrios',\n\t'Pereira',\n\t'Phipps',\n\t'Mcmanus',\n\t'Nance',\n\t'Steiner',\n\t'Poe',\n\t'Crockett',\n\t'Jeffries',\n\t'Amos',\n\t'Nix',\n\t'Newsome',\n\t'Dooley',\n\t'Payton',\n\t'Rosen',\n\t'Swenson',\n\t'Connelly',\n\t'Tolbert',\n\t'Segura',\n\t'Esposito',\n\t'Coker',\n\t'Biggs',\n\t'Hinkle',\n\t'Thurman',\n\t'Drew',\n\t'Ivey',\n\t'Bullard',\n\t'Baez',\n\t'Neff',\n\t'Maher',\n\t'Stratton',\n\t'Egan',\n\t'Dubois',\n\t'Gallardo',\n\t'Blue',\n\t'Rainey',\n\t'Yeager',\n\t'Saucedo',\n\t'Ferreira',\n\t'Sprague',\n\t'Lacy',\n\t'Hurtado',\n\t'Heard',\n\t'Connell',\n\t'Stahl',\n\t'Aldridge',\n\t'Amaya',\n\t'Forrest',\n\t'Erwin',\n\t'Gunn',\n\t'Swan',\n\t'Butcher',\n\t'Rosado',\n\t'Godwin',\n\t'Hand',\n\t'Gabriel',\n\t'Otto',\n\t'Whaley',\n\t'Ludwig',\n\t'Clifford',\n\t'Grove',\n\t'Beaver',\n\t'Silver',\n\t'Dang',\n\t'Hammer',\n\t'Dick',\n\t'Boswell',\n\t'Mead',\n\t'Colvin',\n\t'Oleary',\n\t'Milligan',\n\t'Goins',\n\t'Ames',\n\t'Dodge',\n\t'Kaur',\n\t'Escobedo',\n\t'Arredondo',\n\t'Geiger',\n\t'Winkler',\n\t'Dunham',\n\t'Temple',\n\t'Babcock',\n\t'Billings',\n\t'Grimm',\n\t'Lilly',\n\t'Wesley',\n\t'Mcghee',\n\t'Siegel',\n\t'Painter',\n\t'Bower',\n\t'Purcell',\n\t'Block',\n\t'Aguilera',\n\t'Norwood',\n\t'Sheridan',\n\t'Cartwright',\n\t'Coates',\n\t'Davison',\n\t'Regan',\n\t'Ramey',\n\t'Koenig',\n\t'Kraft',\n\t'Bunch',\n\t'Engel',\n\t'Tan',\n\t'Winn',\n\t'Steward',\n\t'Link',\n\t'Vickers',\n\t'Bragg',\n\t'Piper',\n\t'Huggins',\n\t'Michel',\n\t'Healy',\n\t'Jacob',\n\t'Mcdonough',\n\t'Wolff',\n\t'Colbert',\n\t'Zepeda',\n\t'Hoang',\n\t'Dugan',\n\t'Meade',\n\t'Kilgore',\n\t'Guillen',\n\t'Do',\n\t'Hinojosa',\n\t'Goode',\n\t'Arrington',\n\t'Gary',\n\t'Snell',\n\t'Willard',\n\t'Renteria',\n\t'Chacon',\n\t'Gallo',\n\t'Hankins',\n\t'Montano',\n\t'Browne',\n\t'Peacock',\n\t'Ohara',\n\t'Cornell',\n\t'Sherwood',\n\t'Castellanos',\n\t'Thorpe',\n\t'Stiles',\n\t'Sadler',\n\t'Latham',\n\t'Redmond',\n\t'Greenberg',\n\t'Cote',\n\t'Waddell',\n\t'Dukes',\n\t'Diamond',\n\t'Bui',\n\t'Madrid',\n\t'Alonso',\n\t'Sheets',\n\t'Irvin',\n\t'Hurt',\n\t'Ferris',\n\t'Sewell',\n\t'Carlton',\n\t'Aragon',\n\t'Blackmon',\n\t'Hadley',\n\t'Hoyt',\n\t'Mcgraw',\n\t'Pagan',\n\t'Land',\n\t'Tidwell',\n\t'Lovell',\n\t'Miner',\n\t'Doss',\n\t'Dahl',\n\t'Delatorre',\n\t'Stanford',\n\t'Kauffman',\n\t'Vela',\n\t'Gagnon',\n\t'Winston',\n\t'Gomes',\n\t'Thacker',\n\t'Coronado',\n\t'Ash',\n\t'Jarrett',\n\t'Hager',\n\t'Samuels',\n\t'Metzger',\n\t'Raines',\n\t'Spivey',\n\t'Maurer',\n\t'Han',\n\t'Voss',\n\t'Henley',\n\t'Caballero',\n\t'Caruso',\n\t'Coulter',\n\t'North',\n\t'Finn',\n\t'Cahill',\n\t'Lanier',\n\t'Souza',\n\t'Mcwilliams',\n\t'Deal',\n\t'Urban',\n\t'Schaffer',\n\t'Houser',\n\t'Cummins',\n\t'Romo',\n\t'Crocker',\n\t'Bassett',\n\t'Kruse',\n\t'Bolden',\n\t'Ybarra',\n\t'Metz',\n\t'Root',\n\t'Mcmullen',\n\t'Hagan',\n\t'Crump',\n\t'Guidry',\n\t'Brantley',\n\t'Kearney',\n\t'Beal',\n\t'Toth',\n\t'Jorgensen',\n\t'Timmons',\n\t'Milton',\n\t'Tripp',\n\t'Hurd',\n\t'Sapp',\n\t'Whitman',\n\t'Messer',\n\t'Burgos',\n\t'Major',\n\t'Westbrook',\n\t'Castle',\n\t'Serna',\n\t'Carlisle',\n\t'Varela',\n\t'Cullen',\n\t'Wilhelm',\n\t'Bergeron',\n\t'Burger',\n\t'Posey',\n\t'Barnhart',\n\t'Hackett',\n\t'Madrigal',\n\t'Eubanks',\n\t'Sizemore',\n\t'Hilliard',\n\t'Hargrove',\n\t'Boucher',\n\t'Thomason',\n\t'Melvin',\n\t'Roper',\n\t'Barnard',\n\t'Fonseca',\n\t'Pedersen',\n\t'Quiroz',\n\t'Washburn',\n\t'Holliday',\n\t'Yee',\n\t'Rudolph',\n\t'Bermudez',\n\t'Coyle',\n\t'Gil',\n\t'Pina',\n\t'Goodrich',\n\t'Elias',\n\t'Lockwood',\n\t'Cabral',\n\t'Carranza',\n\t'Duvall',\n\t'Cornelius',\n\t'Mccollum',\n\t'Street',\n\t'Mcneal',\n\t'Connors',\n\t'Angel',\n\t'Paulson',\n\t'Hinson',\n\t'Keenan',\n\t'Sheldon',\n\t'Farr',\n\t'Eddy',\n\t'Samuel',\n\t'Ring',\n\t'Ledbetter',\n\t'Betts',\n\t'Fontenot',\n\t'Gifford',\n\t'Hannah',\n\t'Hanley',\n\t'Person',\n\t'Fountain',\n\t'Levin',\n\t'Stubbs',\n\t'Hightower',\n\t'Murdock',\n\t'Koehler',\n\t'Ma',\n\t'Engle',\n\t'Smiley',\n\t'Carmichael',\n\t'Sheffield',\n\t'Langston',\n\t'Mccracken',\n\t'Yost',\n\t'Trotter',\n\t'Story',\n\t'Starks',\n\t'Lujan',\n\t'Blount',\n\t'Cody',\n\t'Rushing',\n\t'Benoit',\n\t'Herndon',\n\t'Jacobsen',\n\t'Nieto',\n\t'Wiseman',\n\t'Layton',\n\t'Epps',\n\t'Shipley',\n\t'Leyva',\n\t'Reeder',\n\t'Brand',\n\t'Roland',\n\t'Fitch',\n\t'Rico',\n\t'Napier',\n\t'Cronin',\n\t'Mcqueen',\n\t'Paredes',\n\t'Trent',\n\t'Christiansen',\n\t'Spangler',\n\t'Pettit',\n\t'Langford',\n\t'Benavides',\n\t'Penn',\n\t'Paige',\n\t'Weir',\n\t'Dietz',\n\t'Prater',\n\t'Brewster',\n\t'Louis',\n\t'Diehl',\n\t'Pack',\n\t'Spaulding',\n\t'Ernst',\n\t'Aviles',\n\t'Nowak',\n\t'Olvera',\n\t'Rock',\n\t'Mansfield',\n\t'Aquino',\n\t'Ogden',\n\t'Stacy',\n\t'Rizzo',\n\t'Sylvester',\n\t'Gillis',\n\t'Sands',\n\t'Machado',\n\t'Lovett',\n\t'Duong',\n\t'Hyatt',\n\t'Landis',\n\t'Platt',\n\t'Bustamante',\n\t'Hedrick',\n\t'Pritchett',\n\t'Gaston',\n\t'Dobson',\n\t'Caudill',\n\t'Tackett',\n\t'Bateman',\n\t'Landers',\n\t'Carmona',\n\t'Gipson',\n\t'Uribe',\n\t'Mcneill',\n\t'Ledford',\n\t'Mims',\n\t'Abel',\n\t'Gold',\n\t'Smallwood',\n\t'Thorne',\n\t'Mchugh',\n\t'Dickens',\n\t'Leung',\n\t'Tobin',\n\t'Kowalski',\n\t'Medeiros',\n\t'Cope',\n\t'Quezada',\n\t'Kraus',\n\t'Overton',\n\t'Montalvo',\n\t'Staley',\n\t'Woody',\n\t'Hathaway',\n\t'Osorio',\n\t'Laird',\n\t'Dobbs',\n\t'Capps',\n\t'Putnam',\n\t'Lay',\n\t'Francisco',\n\t'Bernstein',\n\t'Adair',\n\t'Hutton',\n\t'Burkett',\n\t'Rhoades',\n\t'Yanez',\n\t'Richey',\n\t'Bledsoe',\n\t'Mccain',\n\t'Beyer',\n\t'Cates',\n\t'Roche',\n\t'Spicer',\n\t'Queen',\n\t'Doty',\n\t'Darling',\n\t'Darby',\n\t'Sumner',\n\t'Kincaid',\n\t'Hay',\n\t'Grossman',\n\t'Lacey',\n\t'Wilkes',\n\t'Humphries',\n\t'Paz',\n\t'Darnell',\n\t'Keys',\n\t'Kyle',\n\t'Lackey',\n\t'Vogt',\n\t'Locklear',\n\t'Kiser',\n\t'Presley',\n\t'Bryson',\n\t'Bergman',\n\t'Peoples',\n\t'Fair',\n\t'Mcclendon',\n\t'Corley',\n\t'Prado',\n\t'Christie',\n\t'Delong',\n\t'Skaggs',\n\t'Dill',\n\t'Shearer',\n\t'Judd',\n\t'Stapleton',\n\t'Flaherty',\n\t'Casillas',\n\t'Pinto',\n\t'Youngblood',\n\t'Haywood',\n\t'Toney',\n\t'Ricks',\n\t'Granados',\n\t'Crum',\n\t'Triplett',\n\t'Soriano',\n\t'Waite',\n\t'Hoff',\n\t'Anaya',\n\t'Crenshaw',\n\t'Jung',\n\t'Canales',\n\t'Cagle',\n\t'Denny',\n\t'Marcus',\n\t'Berman',\n\t'Munson',\n\t'Ocampo',\n\t'Bauman',\n\t'Corcoran',\n\t'Keen',\n\t'Zimmer',\n\t'Friend',\n\t'Ornelas',\n\t'Varner',\n\t'Pelletier',\n\t'Vernon',\n\t'Blum',\n\t'Albrecht',\n\t'Culver',\n\t'Schuster',\n\t'Cuellar',\n\t'Mccord',\n\t'Shultz',\n\t'Mcrae',\n\t'Moreland',\n\t'Calvert',\n\t'William',\n\t'Whittington',\n\t'Eckert',\n\t'Keene',\n\t'Mohr',\n\t'Hanks',\n\t'Kimble',\n\t'Cavanaugh',\n\t'Crowell',\n\t'Russ',\n\t'Feliciano',\n\t'Crain',\n\t'Busch',\n\t'Mccormack',\n\t'Drummond',\n\t'Omalley',\n\t'Aldrich',\n\t'Luke',\n\t'Greco',\n\t'Mott',\n\t'Oakes',\n\t'Mallory',\n\t'Mclain',\n\t'Burrows',\n\t'Otero',\n\t'Allred',\n\t'Eason',\n\t'Finney',\n\t'Weller',\n\t'Waldron',\n\t'Champion',\n\t'Jeffers',\n\t'Coon',\n\t'Rosenthal',\n\t'Huddleston',\n\t'Solano',\n\t'Hirsch',\n\t'Akins',\n\t'Olivares',\n\t'Song',\n\t'Sneed',\n\t'Benedict',\n\t'Bain',\n\t'Okeefe',\n\t'Hidalgo',\n\t'Matos',\n\t'Stallings',\n\t'Paris',\n\t'Gamez',\n\t'Kenny',\n\t'Quigley',\n\t'Marrero',\n\t'Fagan',\n\t'Dutton',\n\t'Pappas',\n\t'Atwood',\n\t'Mcgovern',\n\t'Bagley',\n\t'Read',\n\t'Lunsford',\n\t'Moseley',\n\t'Oakley',\n\t'Ashby',\n\t'Granger',\n\t'Shaver',\n\t'Hope',\n\t'Coe',\n\t'Burroughs',\n\t'Helm',\n\t'Neumann',\n\t'Ambrose',\n\t'Michaels',\n\t'Prescott',\n\t'Light',\n\t'Dumas',\n\t'Flood',\n\t'Stringer',\n\t'Currie',\n\t'Comer',\n\t'Fong',\n\t'Whitlock',\n\t'Lemus',\n\t'Hawley',\n\t'Ulrich',\n\t'Staples',\n\t'Boykin',\n\t'Knutson',\n\t'Grover',\n\t'Hobson',\n\t'Cormier',\n\t'Doran',\n\t'Thayer',\n\t'Woodson',\n\t'Whitt',\n\t'Hooker',\n\t'Kohler',\n\t'Vandyke',\n\t'Addison',\n\t'Schrader',\n\t'Haskins',\n\t'Whittaker',\n\t'Madsen',\n\t'Gauthier',\n\t'Burnette',\n\t'Keating',\n\t'Purvis',\n\t'Aleman',\n\t'Huston',\n\t'Pimentel',\n\t'Hamlin',\n\t'Gerber',\n\t'Hooks',\n\t'Schwab',\n\t'Honeycutt',\n\t'Schulte',\n\t'Alonzo',\n\t'Isaac',\n\t'Conroy',\n\t'Adler',\n\t'Eastman',\n\t'Cottrell',\n\t'Orourke',\n\t'Hawk',\n\t'Goldsmith',\n\t'Rader',\n\t'Crandall',\n\t'Reynoso',\n\t'Shook',\n\t'Abernathy',\n\t'Baer',\n\t'Olivas',\n\t'Grayson',\n\t'Bartley',\n\t'Henning',\n\t'Parr',\n\t'Duff',\n\t'Brunson',\n\t'Baum',\n\t'Ennis',\n\t'Laughlin',\n\t'Foote',\n\t'Valadez',\n\t'Adamson',\n\t'Begay',\n\t'Stovall',\n\t'Lincoln',\n\t'Cheung',\n\t'Malloy',\n\t'Rider',\n\t'Giordano',\n\t'Jansen',\n\t'Lopes',\n\t'Arnett',\n\t'Pendleton',\n\t'Gage',\n\t'Barragan',\n\t'Keyes',\n\t'Navarrete',\n\t'Amador',\n\t'Hoffmann',\n\t'Schilling',\n\t'Hawthorne',\n\t'Perdue',\n\t'Schreiber',\n\t'Arevalo',\n\t'Naylor',\n\t'Deluca',\n\t'Marcum',\n\t'Altman',\n\t'Mark',\n\t'Chadwick',\n\t'Doan',\n\t'Easley',\n\t'Ladd',\n\t'Woodall',\n\t'Betancourt',\n\t'Shin',\n\t'Maguire',\n\t'Bellamy',\n\t'Quintanilla',\n\t'Ham',\n\t'Sorenson',\n\t'Mattson',\n\t'Brenner',\n\t'Means',\n\t'Faust',\n\t'Calloway',\n\t'Ojeda',\n\t'Mcnally',\n\t'Dietrich',\n\t'Ransom',\n\t'Hare',\n\t'Felton',\n\t'Whiting',\n\t'Burkhart',\n\t'Clinton',\n\t'Schwarz',\n\t'Cleary',\n\t'Wetzel',\n\t'Reagan',\n\t'Stjohn',\n\t'Chow',\n\t'Hauser',\n\t'Dupree',\n\t'Brannon',\n\t'Lyles',\n\t'Prather',\n\t'Willoughby',\n\t'Sepulveda',\n\t'Nugent',\n\t'Pickens',\n\t'Mosher',\n\t'Joiner',\n\t'Stoner',\n\t'Dowling',\n\t'Trimble',\n\t'Valdes',\n\t'Cheek',\n\t'Scruggs',\n\t'Coy',\n\t'Tilley',\n\t'Barney',\n\t'Saylor',\n\t'Nagy',\n\t'Horvath',\n\t'Lai',\n\t'Corey',\n\t'Ruth',\n\t'Sauer',\n\t'Baron',\n\t'Thao',\n\t'Rowell',\n\t'Grubbs',\n\t'Schaeffer',\n\t'Hillman',\n\t'Sams',\n\t'Hogue',\n\t'Hutson',\n\t'Busby',\n\t'Nickerson',\n\t'Bruner',\n\t'Parham',\n\t'Rendon',\n\t'Anders',\n\t'Lombardo',\n\t'Iverson',\n\t'Kinsey',\n\t'Earl',\n\t'Borden',\n\t'Titus',\n\t'Jean',\n\t'Tellez',\n\t'Beavers',\n\t'Cornett',\n\t'Sotelo',\n\t'Kellogg',\n\t'Silverman',\n\t'Burnham',\n\t'Mcnair',\n\t'Jernigan',\n\t'Escamilla',\n\t'Barrow',\n\t'Coats',\n\t'London',\n\t'Redding',\n\t'Ruffin',\n\t'Yi',\n\t'Boudreaux',\n\t'Goodson',\n\t'Dowell',\n\t'Fenton',\n\t'Mock',\n\t'Dozier',\n\t'Bynum',\n\t'Gale',\n\t'Jolly',\n\t'Beckman',\n\t'Goddard',\n\t'Craven',\n\t'Whitmore',\n\t'Leary',\n\t'Mccloud',\n\t'Gamboa',\n\t'Kerns',\n\t'Brunner',\n\t'Negron',\n\t'Hough',\n\t'Cutler',\n\t'Ledesma',\n\t'Pyle',\n\t'Monahan',\n\t'Tabor',\n\t'Burk',\n\t'Leone',\n\t'Stauffer',\n\t'Hayward',\n\t'Driver',\n\t'Ruff',\n\t'Talbot',\n\t'Seals',\n\t'Boston',\n\t'Carbajal',\n\t'Fay',\n\t'Purdy',\n\t'Mcgregor',\n\t'Sun',\n\t'Orellana',\n\t'Gentile',\n\t'Mahan',\n\t'Brower',\n\t'Patino',\n\t'Thurston',\n\t'Shipman',\n\t'Torrez',\n\t'Aaron',\n\t'Weiner',\n\t'Call',\n\t'Wilburn',\n\t'Oliva',\n\t'Hairston',\n\t'Coley',\n\t'Hummel',\n\t'Arreola',\n\t'Watt',\n\t'Sharma',\n\t'Lentz',\n\t'Arce',\n\t'Power',\n\t'Longoria',\n\t'Wagoner',\n\t'Burr',\n\t'Hsu',\n\t'Tinsley',\n\t'Beebe',\n\t'Wray',\n\t'Nunn',\n\t'Prieto',\n\t'German',\n\t'Rowley',\n\t'Grubb',\n\t'Brito',\n\t'Royal',\n\t'Valentin',\n\t'Bartholomew',\n\t'Schuler',\n\t'Aranda',\n\t'Flint',\n\t'Hearn',\n\t'Venegas',\n\t'Unger',\n\t'Mattingly',\n\t'Boles',\n\t'Casas',\n\t'Barger',\n\t'Julian',\n\t'Dow',\n\t'Dobbins',\n\t'Vann',\n\t'Chester',\n\t'Strange',\n\t'Lemon',\n\t'Kahn',\n\t'Mckinnon',\n\t'Gannon',\n\t'Waggoner',\n\t'Conn',\n\t'Meek',\n\t'Cavazos',\n\t'Skelton',\n\t'Lo',\n\t'Kumar',\n\t'Toledo',\n\t'Lorenz',\n\t'Vallejo',\n\t'Starkey',\n\t'Kitchen',\n\t'Reaves',\n\t'Demarco',\n\t'Farrar',\n\t'Stearns',\n\t'Michaud',\n\t'Higginbotham',\n\t'Fernandes',\n\t'Isaacs',\n\t'Marion',\n\t'Guillory',\n\t'Priest',\n\t'Meehan',\n\t'Oliveira',\n\t'Palma',\n\t'Oswald',\n\t'Loomis',\n\t'Galvez',\n\t'Lind',\n\t'Mena',\n\t'Stclair',\n\t'Hinds',\n\t'Reardon',\n\t'Alley',\n\t'Barth',\n\t'Crook',\n\t'Bliss',\n\t'Nagel',\n\t'Banuelos',\n\t'Parish',\n\t'Harman',\n\t'Douglass',\n\t'Kearns',\n\t'Newcomb',\n\t'Mulligan',\n\t'Coughlin',\n\t'Way',\n\t'Fournier',\n\t'Lawler',\n\t'Kaminski',\n\t'Barbour',\n\t'Sousa',\n\t'Stump',\n\t'Alaniz',\n\t'Ireland',\n\t'Rudd',\n\t'Carnes',\n\t'Lundy',\n\t'Godinez',\n\t'Pulido',\n\t'Dennison',\n\t'Burdick',\n\t'Baumann',\n\t'Dove',\n\t'Stoddard',\n\t'Liang',\n\t'Dent',\n\t'Roark',\n\t'Mcmahan',\n\t'Bowser',\n\t'Parnell',\n\t'Mayberry',\n\t'Wakefield',\n\t'Arndt',\n\t'Ogle',\n\t'Worthington',\n\t'Durbin',\n\t'Escalante',\n\t'Pederson',\n\t'Weldon',\n\t'Vick',\n\t'Knott',\n\t'Ryder',\n\t'Zarate',\n\t'Irving',\n\t'Clemens',\n\t'Shelley',\n\t'Salter',\n\t'Jack',\n\t'Cloud',\n\t'Dasilva',\n\t'Muhammad',\n\t'Squires',\n\t'Rapp',\n\t'Dawkins',\n\t'Polanco',\n\t'Chatman',\n\t'Maier',\n\t'Yazzie',\n\t'Gruber',\n\t'Staton',\n\t'Blackman',\n\t'Mcdonnell',\n\t'Dykes',\n\t'Laws',\n\t'Whitten',\n\t'Pfeiffer',\n\t'Vidal',\n\t'Early',\n\t'Kelsey',\n\t'Baughman',\n\t'Dias',\n\t'Starnes',\n\t'Crespo',\n\t'Lombardi',\n\t'Kilpatrick',\n\t'Deaton',\n\t'Satterfield',\n\t'Wiles',\n\t'Weinstein',\n\t'Rowan',\n\t'Delossantos',\n\t'Hamby',\n\t'Estep',\n\t'Daigle',\n\t'Elam',\n\t'Creech',\n\t'Heck',\n\t'Chavis',\n\t'Echols',\n\t'Foss',\n\t'Trahan',\n\t'Strauss',\n\t'Vanhorn',\n\t'Winslow',\n\t'Rea',\n\t'Heaton',\n\t'Fairchild',\n\t'Minton',\n\t'Hitchcock',\n\t'Linton',\n\t'Handy',\n\t'Crouse',\n\t'Coles',\n\t'Upton',\n\t'Foy',\n\t'Herrington',\n\t'Mcclelland',\n\t'Hwang',\n\t'Rector',\n\t'Luther',\n\t'Kruger',\n\t'Salcedo',\n\t'Chance',\n\t'Gunderson',\n\t'Tharp',\n\t'Griffiths',\n\t'Graf',\n\t'Branham',\n\t'Humphreys',\n\t'Renner',\n\t'Lima',\n\t'Rooney',\n\t'Moya',\n\t'Almeida',\n\t'Gavin',\n\t'Coburn',\n\t'Ouellette',\n\t'Goetz',\n\t'Seay',\n\t'Parrott',\n\t'Harms',\n\t'Robb',\n\t'Storey',\n\t'Barbosa',\n\t'Barraza',\n\t'Loyd',\n\t'Merchant',\n\t'Donohue',\n\t'Carrier',\n\t'Diggs',\n\t'Chastain',\n\t'Sherrill',\n\t'Whipple',\n\t'Braswell',\n\t'Weathers',\n\t'Linder',\n\t'Chapa',\n\t'Bock',\n\t'Oh',\n\t'Lovelace',\n\t'Saavedra',\n\t'Ferrara',\n\t'Callaway',\n\t'Salmon',\n\t'Templeton',\n\t'Christy',\n\t'Harp',\n\t'Dowd',\n\t'Forrester',\n\t'Lawton',\n\t'Epstein',\n\t'Gant',\n\t'Tierney',\n\t'Seaman',\n\t'Corral',\n\t'Dowdy',\n\t'Zaragoza',\n\t'Morrissey',\n\t'Eller',\n\t'Chau',\n\t'Breen',\n\t'High',\n\t'Newberry',\n\t'Beam',\n\t'Yancey',\n\t'Jarrell',\n\t'Cerda',\n\t'Ellsworth',\n\t'Lofton',\n\t'Thibodeaux',\n\t'Pool',\n\t'Rinehart',\n\t'Arteaga',\n\t'Marlow',\n\t'Hacker',\n\t'Will',\n\t'Mackenzie',\n\t'Hook',\n\t'Gilliland',\n\t'Emmons',\n\t'Pickering',\n\t'Medley',\n\t'Willey',\n\t'Andrew',\n\t'Shell',\n\t'Randle',\n\t'Brinkley',\n\t'Pruett',\n\t'Tobias',\n\t'Edmondson',\n\t'Grier',\n\t'Saldivar',\n\t'Batista',\n\t'Askew',\n\t'Moeller',\n\t'Chavarria',\n\t'Augustine',\n\t'Troyer',\n\t'Layne',\n\t'Mcnulty',\n\t'Shank',\n\t'Desai',\n\t'Herrmann',\n\t'Hemphill',\n\t'Bearden',\n\t'Spear',\n\t'Keener',\n\t'Holguin',\n\t'Culp',\n\t'Braden',\n\t'Briscoe',\n\t'Bales',\n\t'Garvin',\n\t'Stockton',\n\t'Abreu',\n\t'Suggs',\n\t'Mccartney',\n\t'Ferrer',\n\t'Rhoads',\n\t'Ha',\n\t'Nevarez',\n\t'Singletary',\n\t'Chong',\n\t'Alcala',\n\t'Cheney',\n\t'Westfall',\n\t'Damico',\n\t'Snodgrass',\n\t'Devries',\n\t'Looney',\n\t'Hein',\n\t'Lyle',\n\t'Lockett',\n\t'Jacques',\n\t'Barkley',\n\t'Wahl',\n\t'Aponte',\n\t'Myrick',\n\t'Bolin',\n\t'Holm',\n\t'Slack',\n\t'Scherer',\n\t'Martino',\n\t'Bachman',\n\t'Ely',\n\t'Nesbitt',\n\t'Marroquin',\n\t'Bouchard',\n\t'Mast',\n\t'Jameson',\n\t'Hills',\n\t'Mireles',\n\t'Bueno',\n\t'Pease',\n\t'Vitale',\n\t'Alarcon',\n\t'Linares',\n\t'Schell',\n\t'Lipscomb',\n\t'Arriaga',\n\t'Bourgeois',\n\t'Markham',\n\t'Bonds',\n\t'Wisniewski',\n\t'Ivy',\n\t'Oldham',\n\t'Wendt',\n\t'Fallon',\n\t'Joy',\n\t'Stamper',\n\t'Babb',\n\t'Steinberg',\n\t'Asher',\n\t'Fuchs',\n\t'Blank',\n\t'Willett',\n\t'Heredia',\n\t'Croft',\n\t'Lytle',\n\t'Lance',\n\t'Lassiter',\n\t'Barrientos',\n\t'Condon',\n\t'Barfield',\n\t'Darden',\n\t'Araujo',\n\t'Noonan',\n\t'Guinn',\n\t'Burleson',\n\t'Belanger',\n\t'Main',\n\t'Traylor',\n\t'Messina',\n\t'Zeigler',\n\t'Danielson',\n\t'Millard',\n\t'Kenyon',\n\t'Radford',\n\t'Graff',\n\t'Beaty',\n\t'Baggett',\n\t'Salisbury',\n\t'Crisp',\n\t'Trout',\n\t'Lorenzo',\n\t'Parson',\n\t'Gann',\n\t'Garber',\n\t'Adcock',\n\t'Covarrubias',\n\t'Scales',\n\t'Acuna',\n\t'Thrasher',\n\t'Card',\n\t'Van',\n\t'Mabry',\n\t'Mohamed',\n\t'Montanez',\n\t'Stock',\n\t'Redd',\n\t'Willingham',\n\t'Redman',\n\t'Zambrano',\n\t'Gaffney',\n\t'Herr',\n\t'Schubert',\n\t'Devlin',\n\t'Pringle',\n\t'Houck',\n\t'Casper',\n\t'Rees',\n\t'Wing',\n\t'Ebert',\n\t'Jeter',\n\t'Cornejo',\n\t'Gillette',\n\t'Shockley',\n\t'Amato',\n\t'Girard',\n\t'Leggett',\n\t'Cheatham',\n\t'Bustos',\n\t'Epperson',\n\t'Dubose',\n\t'Seitz',\n\t'Frias',\n\t'East',\n\t'Schofield',\n\t'Steen',\n\t'Orlando',\n\t'Myles',\n\t'Caron',\n\t'Grey',\n\t'Denney',\n\t'Ontiveros',\n\t'Burden',\n\t'Jaeger',\n\t'Reich',\n\t'Witherspoon',\n\t'Najera',\n\t'Frantz',\n\t'Hammonds',\n\t'Xu',\n\t'Leavitt',\n\t'Gilchrist',\n\t'Adam',\n\t'Barone',\n\t'Forman',\n\t'Ceja',\n\t'Ragsdale',\n\t'Sisk',\n\t'Tubbs',\n\t'Elizondo',\n\t'Pressley',\n\t'Bollinger',\n\t'Linn',\n\t'Huntley',\n\t'Dewey',\n\t'Geary',\n\t'Carlos',\n\t'Ragland',\n\t'Mixon',\n\t'Mcarthur',\n\t'Baugh',\n\t'Tam',\n\t'Nobles',\n\t'Clevenger',\n\t'Lusk',\n\t'Foust',\n\t'Cooney',\n\t'Tamayo',\n\t'Robert',\n\t'Longo',\n\t'Overstreet',\n\t'Oglesby',\n\t'Mace',\n\t'Churchill',\n\t'Matson',\n\t'Hamrick',\n\t'Rockwell',\n\t'Trammell',\n\t'Wheatley',\n\t'Carrington',\n\t'Ferraro',\n\t'Ralston',\n\t'Clancy',\n\t'Mondragon',\n\t'Carl',\n\t'Hu',\n\t'Hopson',\n\t'Breaux',\n\t'Mccurdy',\n\t'Mares',\n\t'Mai',\n\t'Chisholm',\n\t'Matlock',\n\t'Aiken',\n\t'Cary',\n\t'Lemons',\n\t'Anguiano',\n\t'Herrick',\n\t'Crawley',\n\t'Montero',\n\t'Hassan',\n\t'Archuleta',\n\t'Farias',\n\t'Cotter',\n\t'Parris',\n\t'Felder',\n\t'Luu',\n\t'Pence',\n\t'Gilman',\n\t'Killian',\n\t'Naranjo',\n\t'Duggan',\n\t'Scarborough',\n\t'Swann',\n\t'Easter',\n\t'Ricketts',\n\t'France',\n\t'Bello',\n\t'Nadeau',\n\t'Still',\n\t'Rincon',\n\t'Cornwell',\n\t'Slade',\n\t'Fierro',\n\t'Mize',\n\t'Christianson',\n\t'Greenfield',\n\t'Mcafee',\n\t'Landrum',\n\t'Adame',\n\t'Dinh',\n\t'Lankford',\n\t'Lewandowski',\n\t'Rust',\n\t'Bundy',\n\t'Waterman',\n\t'Milner',\n\t'Mccrary',\n\t'Hite',\n\t'Curley',\n\t'Donald',\n\t'Duckworth',\n\t'Cecil',\n\t'Carrera',\n\t'Speer',\n\t'Birch',\n\t'Denson',\n\t'Beckwith',\n\t'Stack',\n\t'Durant',\n\t'Lantz',\n\t'Dorman',\n\t'Christman',\n\t'Spann',\n\t'Masterson',\n\t'Hostetler',\n\t'Kolb',\n\t'Brink',\n\t'Scanlon',\n\t'Nye',\n\t'Wylie',\n\t'Beverly',\n\t'Woo',\n\t'Spurlock',\n\t'Sommer',\n\t'Shelby',\n\t'Reinhardt',\n\t'Robledo',\n\t'Bertrand',\n\t'Ashton',\n\t'Cyr',\n\t'Edgar',\n\t'Doe',\n\t'Harkins',\n\t'Brubaker',\n\t'Stoll',\n\t'Dangelo',\n\t'Zhou',\n\t'Moulton',\n\t'Hannon',\n\t'Falk',\n\t'Rains',\n\t'Broughton',\n\t'Applegate',\n\t'Hudgins',\n\t'Slone',\n\t'Yoon',\n\t'Farnsworth',\n\t'Perales',\n\t'Reedy',\n\t'Milam',\n\t'Franz',\n\t'Ponder',\n\t'Ricci',\n\t'Fontaine',\n\t'Irizarry',\n\t'Puente',\n\t'New',\n\t'Selby',\n\t'Cazares',\n\t'Doughty',\n\t'Moffett',\n\t'Balderas',\n\t'Fine',\n\t'Smalley',\n\t'Carlin',\n\t'Trinh',\n\t'Dyson',\n\t'Galvin',\n\t'Valdivia',\n\t'Benner',\n\t'Low',\n\t'Turpin',\n\t'Lyman',\n\t'Billingsley',\n\t'Mcadams',\n\t'Cardwell',\n\t'Fraley',\n\t'Patten',\n\t'Holton',\n\t'Shanks',\n\t'Mcalister',\n\t'Canfield',\n\t'Sample',\n\t'Harley',\n\t'Cason',\n\t'Tomlin',\n\t'Ahmad',\n\t'Coyne',\n\t'Forte',\n\t'Riggins',\n\t'Littlejohn',\n\t'Forsythe',\n\t'Brinson',\n\t'Halverson',\n\t'Bach',\n\t'Stuckey',\n\t'Falcon',\n\t'Wenzel',\n\t'Talbert',\n\t'Champagne',\n\t'Mchenry',\n\t'Vest',\n\t'Shackelford',\n\t'Ordonez',\n\t'Collazo',\n\t'Boland',\n\t'Sisson',\n\t'Bigelow',\n\t'Wharton',\n\t'Hyman',\n\t'Brumfield',\n\t'Oates',\n\t'Mesa',\n\t'Morrell',\n\t'Beckett',\n\t'Reis',\n\t'Alves',\n\t'Chiu',\n\t'Larue',\n\t'Streeter',\n\t'Grogan',\n\t'Blakely',\n\t'Brothers',\n\t'Hatton',\n\t'Kimbrough',\n\t'Lauer',\n\t'Wallis',\n\t'Jett',\n\t'Pepper',\n\t'Hildebrand',\n\t'Rawls',\n\t'Mello',\n\t'Neville',\n\t'Bull',\n\t'Steffen',\n\t'Braxton',\n\t'Cowart',\n\t'Simpkins',\n\t'Mcneely',\n\t'Blalock',\n\t'Spain',\n\t'Shipp',\n\t'Lindquist',\n\t'Oreilly',\n\t'Butterfield',\n\t'Perrin',\n\t'Qualls',\n\t'Edge',\n\t'Havens',\n\t'Luong',\n\t'Switzer',\n\t'Troutman',\n\t'Fortner',\n\t'Tolliver',\n\t'Monk',\n\t'Poindexter',\n\t'Rupp',\n\t'Ferry',\n\t'Negrete',\n\t'Muse',\n\t'Gresham',\n\t'Beauchamp',\n\t'Schmid',\n\t'Barclay',\n\t'Chun',\n\t'Brice',\n\t'Faulk',\n\t'Watters',\n\t'Briones',\n\t'Guajardo',\n\t'Harwood',\n\t'Grissom',\n\t'Harlow',\n\t'Whelan',\n\t'Burdette',\n\t'Palumbo',\n\t'Paulsen',\n\t'Corrigan',\n\t'Garvey',\n\t'Levesque',\n\t'Dockery',\n\t'Delgadillo',\n\t'Gooch',\n\t'Cao',\n\t'Mullin',\n\t'Ridley',\n\t'Stanfield',\n\t'Noriega',\n\t'Dial',\n\t'Ceballos',\n\t'Nunes',\n\t'Newby',\n\t'Baumgartner',\n\t'Hussain',\n\t'Wyman',\n\t'Causey',\n\t'Gossett',\n\t'Ness',\n\t'Waugh',\n\t'Choate',\n\t'Carman',\n\t'Daily',\n\t'Kong',\n\t'Devore',\n\t'Irby',\n\t'Breeden',\n\t'Whatley',\n\t'Ellington',\n\t'Lamar',\n\t'Fultz',\n\t'Bair',\n\t'Zielinski',\n\t'Colby',\n\t'Houghton',\n\t'Grigsby',\n\t'Fortune',\n\t'Paxton',\n\t'Mcmillian',\n\t'Hammons',\n\t'Bronson',\n\t'Keck',\n\t'Wellman',\n\t'Ayres',\n\t'Whiteside',\n\t'Menard',\n\t'Roush',\n\t'Warden',\n\t'Espino',\n\t'Strand',\n\t'Haggerty',\n\t'Banda',\n\t'Krebs',\n\t'Fabian',\n\t'Bowie',\n\t'Branson',\n\t'Lenz',\n\t'Benavidez',\n\t'Keeler',\n\t'Newsom',\n\t'Ezell',\n\t'Jeffrey',\n\t'Pulliam',\n\t'Clary',\n\t'Byrnes',\n\t'Kopp',\n\t'Beers',\n\t'Smalls',\n\t'Sommers',\n\t'Gardiner',\n\t'Fennell',\n\t'Mancini',\n\t'Osullivan',\n\t'Sebastian',\n\t'Bruns',\n\t'Giron',\n\t'Parent',\n\t'Boyles',\n\t'Keefe',\n\t'Muir',\n\t'Wheat',\n\t'Vergara',\n\t'Shuler',\n\t'Pemberton',\n\t'South',\n\t'Brownlee',\n\t'Brockman',\n\t'Royer',\n\t'Fanning',\n\t'Herzog',\n\t'Morley',\n\t'Bethea',\n\t'Tong',\n\t'Needham',\n\t'Roque',\n\t'Mojica',\n\t'Bunn',\n\t'Francois',\n\t'Noe',\n\t'Kuntz',\n\t'Snowden',\n\t'Withers',\n\t'Harlan',\n\t'Seibert',\n\t'Limon',\n\t'Kiefer',\n\t'Bone',\n\t'Sell',\n\t'Allan',\n\t'Skidmore',\n\t'Wren',\n\t'Dunaway',\n\t'Finnegan',\n\t'Moe',\n\t'Wolford',\n\t'Seeley',\n\t'Kroll',\n\t'Lively',\n\t'Janssen',\n\t'Montague',\n\t'Rahman',\n\t'Boehm',\n\t'Nettles',\n\t'Dees',\n\t'Krieger',\n\t'Peek',\n\t'Hershberger',\n\t'Sage',\n\t'Custer',\n\t'Zheng',\n\t'Otoole',\n\t'Jaimes',\n\t'Elrod',\n\t'Somers',\n\t'Lira',\n\t'Nagle',\n\t'Grooms',\n\t'Soria',\n\t'Drury',\n\t'Keane',\n\t'Bostic',\n\t'Hartmann',\n\t'Pauley',\n\t'Murrell',\n\t'Manzo',\n\t'Morey',\n\t'Agee',\n\t'Hamel',\n\t'Tavares',\n\t'Dunning',\n\t'Mccloskey',\n\t'Plunkett',\n\t'Maples',\n\t'March',\n\t'Armenta',\n\t'Waldrop',\n\t'Espinal',\n\t'Fajardo',\n\t'Christenson',\n\t'Robins',\n\t'Bagwell',\n\t'Massie',\n\t'Leahy',\n\t'Urbina',\n\t'Medlin',\n\t'Zhu',\n\t'Pantoja',\n\t'Barbee',\n\t'Clawson',\n\t'Reiter',\n\t'Ko',\n\t'Crider',\n\t'Maxey',\n\t'Worrell',\n\t'Brackett',\n\t'Mclemore',\n\t'Younger',\n\t'Her',\n\t'Hardesty',\n\t'Danner',\n\t'Ragan',\n\t'Almanza',\n\t'Nielson',\n\t'Graber',\n\t'Mcintire',\n\t'Tirado',\n\t'Griswold',\n\t'Seifert',\n\t'Valles',\n\t'Laney',\n\t'Gupta',\n\t'Malik',\n\t'Libby',\n\t'Marvin',\n\t'Koontz',\n\t'Marr',\n\t'Kozlowski',\n\t'Lemke',\n\t'Brant',\n\t'Phelan',\n\t'Kemper',\n\t'Gooden',\n\t'Beaulieu',\n\t'Cardoza',\n\t'Healey',\n\t'Zhao',\n\t'Hardwick',\n\t'Kitchens',\n\t'Box',\n\t'Stepp',\n\t'Comstock',\n\t'Poston',\n\t'Sager',\n\t'Conti',\n\t'Borges',\n\t'Farrow',\n\t'Acker',\n\t'Glaser',\n\t'Antonio',\n\t'Lennon',\n\t'Gaither',\n\t'Freitas',\n\t'Alicea',\n\t'Mcmillen',\n\t'Chapin',\n\t'Ratcliff',\n\t'Lerma',\n\t'Severson',\n\t'Wilde',\n\t'Mortensen',\n\t'Winchester',\n\t'Flannery',\n\t'Villasenor',\n\t'Centeno',\n\t'Burkholder',\n\t'Horan',\n\t'Meador',\n\t'Ingle',\n\t'Roldan',\n\t'Estrella',\n\t'Pullen',\n\t'Newkirk',\n\t'Gaytan',\n\t'Lindberg',\n\t'Windham',\n\t'Gatlin',\n\t'Stoltzfus',\n\t'Behrens',\n\t'Cintron',\n\t'Broderick',\n\t'Solorzano',\n\t'Jaime',\n\t'Venable',\n\t'Culbertson',\n\t'Garay',\n\t'Caputo',\n\t'Grantham',\n\t'Hanlon',\n\t'Parry',\n\t'Crist',\n\t'Cosby',\n\t'Shore',\n\t'Everhart',\n\t'Dorn',\n\t'Turley',\n\t'Eng',\n\t'Valerio',\n\t'Rand',\n\t'Hiatt',\n\t'Mota',\n\t'Judge',\n\t'Kinder',\n\t'Colwell',\n\t'Ashworth',\n\t'Tejeda',\n\t'Sikes',\n\t'Oshea',\n\t'Westmoreland',\n\t'Faber',\n\t'Culpepper',\n\t'Logsdon',\n\t'Fugate',\n\t'Apodaca',\n\t'Lindley',\n\t'Samson',\n\t'Liles',\n\t'Mcclanahan',\n\t'Burge',\n\t'Vail',\n\t'Etheridge',\n\t'Boudreau',\n\t'Andres',\n\t'Noll',\n\t'Higgs',\n\t'Snead',\n\t'Layman',\n\t'Turk',\n\t'Nolen',\n\t'Wayne',\n\t'Betz',\n\t'Victor',\n\t'Lafferty',\n\t'Carbone',\n\t'Skipper',\n\t'Zeller',\n\t'Kasper',\n\t'Desantis',\n\t'Fogle',\n\t'Gandy',\n\t'Mendenhall',\n\t'Seward',\n\t'Schweitzer',\n\t'Gulley',\n\t'Stine',\n\t'Sowers',\n\t'Duenas',\n\t'Monson',\n\t'Brinkman',\n\t'Hubert',\n\t'Motley',\n\t'Pfeifer',\n\t'Weinberg',\n\t'Eggleston',\n\t'Isom',\n\t'Quinlan',\n\t'Gilley',\n\t'Jasso',\n\t'Loya',\n\t'Mull',\n\t'Reichert',\n\t'Wirth',\n\t'Reddy',\n\t'Hodgson',\n\t'Stowe',\n\t'Mccallum',\n\t'Ahrens',\n\t'Huey',\n\t'Mattox',\n\t'Dupont',\n\t'Aguayo',\n\t'Pak',\n\t'Tice',\n\t'Alba',\n\t'Colburn',\n\t'Currier',\n\t'Gaskins',\n\t'Harder',\n\t'Cohn',\n\t'Yoo',\n\t'Garnett',\n\t'Harter',\n\t'Wenger',\n\t'Charlton',\n\t'Littleton',\n\t'Minter',\n\t'Henriquez',\n\t'Cone',\n\t'Vines',\n\t'Kimmel',\n\t'Crooks',\n\t'Caraballo',\n\t'Searcy',\n\t'Peyton',\n\t'Renfro',\n\t'Groff',\n\t'Thorn',\n\t'Moua',\n\t'Jay',\n\t'Leigh',\n\t'Sanborn',\n\t'Wicker',\n\t'Martens',\n\t'Broome',\n\t'Abney',\n\t'Fisk',\n\t'Argueta',\n\t'Upchurch',\n\t'Alderman',\n\t'Tisdale',\n\t'Castellano',\n\t'Legg',\n\t'Wilbur',\n\t'Bills',\n\t'Dix',\n\t'Mauldin',\n\t'Isbell',\n\t'Mears',\n\t'Latimer',\n\t'Ashcraft',\n\t'Earley',\n\t'Tejada',\n\t'Partridge',\n\t'Anglin',\n\t'Caswell',\n\t'Easton',\n\t'Kirchner',\n\t'Mehta',\n\t'Lanham',\n\t'Blaylock',\n\t'Binder',\n\t'Catalano',\n\t'Handley',\n\t'Storm',\n\t'Albertson',\n\t'Free',\n\t'Tuck',\n\t'Keegan',\n\t'Moriarty',\n\t'Dexter',\n\t'Mancuso',\n\t'Allard',\n\t'Pino',\n\t'Chamberlin',\n\t'Moffitt',\n\t'Haag',\n\t'Schott',\n\t'Agnew',\n\t'Malcolm',\n\t'Hallman',\n\t'Heckman',\n\t'Karr',\n\t'Soares',\n\t'Alfonso',\n\t'Tom',\n\t'Wadsworth',\n\t'Schindler',\n\t'Garibay',\n\t'Kuykendall',\n\t'Penny',\n\t'Littlefield',\n\t'Mcnabb',\n\t'Sam',\n\t'Lea',\n\t'Berrios',\n\t'Murry',\n\t'Regalado',\n\t'Dehart',\n\t'Mohammed',\n\t'Counts',\n\t'Solorio',\n\t'Preciado',\n\t'Armendariz',\n\t'Martell',\n\t'Barksdale',\n\t'Frick',\n\t'Haller',\n\t'Broyles',\n\t'Doll',\n\t'Cable',\n\t'Delvalle',\n\t'Weems',\n\t'Kelleher',\n\t'Gagne',\n\t'Albers',\n\t'Kunz',\n\t'Hoy',\n\t'Hawes',\n\t'Guenther',\n\t'Johansen',\n\t'Chaffin',\n\t'Whitworth',\n\t'Wynne',\n\t'Mcmurray',\n\t'Luce',\n\t'Fiore',\n\t'Straub',\n\t'Majors',\n\t'Mcduffie',\n\t'Bohannon',\n\t'Rawlings',\n\t'Freed',\n\t'Sutter',\n\t'Lindstrom',\n\t'Buss',\n\t'Loera',\n\t'Hoyle',\n\t'Witte',\n\t'Tyree',\n\t'Luttrell',\n\t'Andrus',\n\t'Steed',\n\t'Thiel',\n\t'Cranford',\n\t'Fulmer',\n\t'Gable',\n\t'Porras',\n\t'Weis',\n\t'Maas',\n\t'Packard',\n\t'Noyes',\n\t'Kwon',\n\t'Knoll',\n\t'Marx',\n\t'Feeney',\n\t'Israel',\n\t'Bohn',\n\t'Cockrell',\n\t'Glick',\n\t'Cosgrove',\n\t'Keefer',\n\t'Mundy',\n\t'Batchelor',\n\t'Loveless',\n\t'Horowitz',\n\t'Haskell',\n\t'Kunkel',\n\t'Colson',\n\t'Hedges',\n\t'Staggs',\n\t'Swisher',\n\t'Lomeli',\n\t'Padron',\n\t'Cota',\n\t'Homan',\n\t'Musser',\n\t'Curtin',\n\t'Salerno',\n\t'Segovia',\n\t'Keeton',\n\t'Brandenburg',\n\t'Starling',\n\t'Tsai',\n\t'Mahon',\n\t'Klinger',\n\t'Paquette',\n\t'Haddad',\n\t'Mccune',\n\t'Mathew',\n\t'Shull',\n\t'Higdon',\n\t'Guest',\n\t'Shay',\n\t'Swafford',\n\t'Angulo',\n\t'Hackney',\n\t'Evers',\n\t'Sibley',\n\t'Woodworth',\n\t'Ostrander',\n\t'Mangum',\n\t'Smyth',\n\t'Quarles',\n\t'Mccarter',\n\t'Close',\n\t'Truitt',\n\t'Stpierre',\n\t'Mackay',\n\t'Bayer',\n\t'Timm',\n\t'Thatcher',\n\t'Bess',\n\t'Trinidad',\n\t'Jacoby',\n\t'Proffitt',\n\t'Concepcion',\n\t'Parkinson',\n\t'Carreon',\n\t'Ramon',\n\t'Monroy',\n\t'Leger',\n\t'Jauregui',\n\t'Glynn',\n\t'Taggart',\n\t'Neil',\n\t'Reddick',\n\t'Wiese',\n\t'Dover',\n\t'Wicks',\n\t'Hennessy',\n\t'Bittner',\n\t'Mcclung',\n\t'Mcwhorter',\n\t'Derrick',\n\t'Strom',\n\t'Beckham',\n\t'Kee',\n\t'Coombs',\n\t'Schrock',\n\t'Holtz',\n\t'Maki',\n\t'Willson',\n\t'Hulsey',\n\t'Whitson',\n\t'Haugen',\n\t'Lumpkin',\n\t'Scholl',\n\t'Gall',\n\t'Carvalho',\n\t'Kovach',\n\t'Vieira',\n\t'Millan',\n\t'Irvine',\n\t'Held',\n\t'Jolley',\n\t'Jasper',\n\t'Cadena',\n\t'Runyon',\n\t'Lomax',\n\t'Fahey',\n\t'Hoppe',\n\t'Bivens',\n\t'Ruggiero',\n\t'Hussey',\n\t'Ainsworth',\n\t'Hardman',\n\t'Ulloa',\n\t'Dugger',\n\t'Fitzsimmons',\n\t'Scroggins',\n\t'Sowell',\n\t'Toler',\n\t'Barba',\n\t'Biddle',\n\t'Rafferty',\n\t'Trapp',\n\t'Byler',\n\t'Brill',\n\t'Delagarza',\n\t'Thigpen',\n\t'Hiller',\n\t'Martins',\n\t'Jankowski',\n\t'Findley',\n\t'Hollins',\n\t'Stull',\n\t'Pollack',\n\t'Poirier',\n\t'Reno',\n\t'Bratton',\n\t'Jeffery',\n\t'Menendez',\n\t'Mcnutt',\n\t'Kohl',\n\t'Forster',\n\t'Clough',\n\t'Deloach',\n\t'Bader',\n\t'Hanes',\n\t'Sturm',\n\t'Tafoya',\n\t'Beall',\n\t'Coble',\n\t'Demers',\n\t'Kohn',\n\t'Santamaria',\n\t'Vaught',\n\t'Correia',\n\t'Mcgrew',\n\t'Sarmiento',\n\t'Roby',\n\t'Reinhart',\n\t'Rosenbaum',\n\t'Bernier',\n\t'Schiller',\n\t'Furman',\n\t'Grabowski',\n\t'Perryman',\n\t'Kidwell',\n\t'Sabo',\n\t'Saxton',\n\t'Noland',\n\t'Seaton',\n\t'Packer',\n\t'Seal',\n\t'Ruby',\n\t'Smoot',\n\t'Lavoie',\n\t'Putman',\n\t'Fairbanks',\n\t'Neill',\n\t'Florence',\n\t'Beattie',\n\t'Tarver',\n\t'Stephen',\n\t'Bolen',\n\t'Mccombs',\n\t'Freedman',\n\t'Barnhill',\n\t'Gaddis',\n\t'Goad',\n\t'Worden',\n\t'Canada',\n\t'Vickery',\n\t'Calvin',\n\t'Mcclintock',\n\t'Slocum',\n\t'Clausen',\n\t'Mccutcheon',\n\t'Ripley',\n\t'Razo',\n\t'Southard',\n\t'Bourne',\n\t'Aiello',\n\t'Knudsen',\n\t'Angeles',\n\t'Keeney',\n\t'Stacey',\n\t'Neeley',\n\t'Holly',\n\t'Gallant',\n\t'Eads',\n\t'Lafleur',\n\t'Fredrickson',\n\t'Popp',\n\t'Bobo',\n\t'Pardo',\n\t'Artis',\n\t'Lawless',\n\t'Shen',\n\t'Headley',\n\t'Pedraza',\n\t'Pickard',\n\t'Salvador',\n\t'Hofmann',\n\t'Davey',\n\t'Szymanski',\n\t'Dallas',\n\t'Erb',\n\t'Perea',\n\t'Alcantar',\n\t'Ashford',\n\t'Harry',\n\t'Crutchfield',\n\t'Goebel',\n\t'Ridgeway',\n\t'Mcvey',\n\t'Cordell',\n\t'Kovacs',\n\t'Florez',\n\t'Calkins',\n\t'Redden',\n\t'Ricker',\n\t'Salcido',\n\t'Farrington',\n\t'Reimer',\n\t'Mullis',\n\t'Mayhew',\n\t'Register',\n\t'Kaye',\n\t'Blocker',\n\t'Buford',\n\t'Munguia',\n\t'Cady',\n\t'Burley',\n\t'Sander',\n\t'Robinette',\n\t'Stubblefield',\n\t'Shuman',\n\t'Santillan',\n\t'Loy',\n\t'Deutsch',\n\t'Sales',\n\t'Langdon',\n\t'Mazur',\n\t'Clapp',\n\t'Teal',\n\t'Buffington',\n\t'Elliot',\n\t'Halstead',\n\t'Sturgeon',\n\t'Colley',\n\t'Koehn',\n\t'Bergstrom',\n\t'Dunne',\n\t'Pond',\n\t'Gantt',\n\t'Cousins',\n\t'Viera',\n\t'Wilks',\n\t'Haase',\n\t'Sweat',\n\t'Simonson',\n\t'Breedlove',\n\t'Munn',\n\t'Pitt',\n\t'Faircloth',\n\t'Peter',\n\t'Wheaton',\n\t'Howland',\n\t'Merriman',\n\t'Fusco',\n\t'Burney',\n\t'Bedford',\n\t'Baltazar',\n\t'Persaud',\n\t'Gerard',\n\t'Bourque',\n\t'Chao',\n\t'Slagle',\n\t'Kirsch',\n\t'Volk',\n\t'Heim',\n\t'Glasgow',\n\t'Borders',\n\t'Rauch',\n\t'Goforth',\n\t'Batson',\n\t'Basham',\n\t'Mount',\n\t'Peace',\n\t'Lazo',\n\t'Samples',\n\t'Amaro',\n\t'Slattery',\n\t'Ibrahim',\n\t'Weatherford',\n\t'Taft',\n\t'Santoro',\n\t'Aparicio',\n\t'Jiang',\n\t'Ritchey',\n\t'Goble',\n\t'Spring',\n\t'Strain',\n\t'Scully',\n\t'Villareal',\n\t'Toro',\n\t'Duval',\n\t'Jonas',\n\t'Neuman',\n\t'Wozniak',\n\t'Varney',\n\t'Dell',\n\t'Conover',\n\t'Landon',\n\t'Sigler',\n\t'Galbraith',\n\t'Boss',\n\t'Cepeda',\n\t'Back',\n\t'Mateo',\n\t'Peebles',\n\t'Arsenault',\n\t'Cathey',\n\t'Calabrese',\n\t'Dodds',\n\t'Gilbertson',\n\t'Hoke',\n\t'Greenlee',\n\t'Sauceda',\n\t'Vue',\n\t'Lehmann',\n\t'Zink',\n\t'Lapointe',\n\t'Laster',\n\t'Moy',\n\t'Ammons',\n\t'Llamas',\n\t'Foltz',\n\t'Fleck',\n\t'Chew',\n\t'Amaral',\n\t'Geer',\n\t'Su',\n\t'Carden',\n\t'Nunley',\n\t'Creel',\n\t'Clarkson',\n\t'Provost',\n\t'Covey',\n\t'Paine',\n\t'Wofford',\n\t'Frame',\n\t'Dube',\n\t'Grice',\n\t'Tully',\n\t'Molnar',\n\t'Luciano',\n\t'Bartels',\n\t'Winstead',\n\t'Canady',\n\t'Moreau',\n\t'Burnside',\n\t'Bratcher',\n\t'Infante',\n\t'Peterman',\n\t'Swope',\n\t'Freeland',\n\t'Vetter',\n\t'Lanning',\n\t'Marquis',\n\t'Schulze',\n\t'Thai',\n\t'Coppola',\n\t'Rayburn',\n\t'Conte',\n\t'Martz',\n\t'Showalter',\n\t'Quinonez',\n\t'Bandy',\n\t'Rao',\n\t'Bunting',\n\t'Belt',\n\t'Cruse',\n\t'Hamblin',\n\t'Himes',\n\t'Raney',\n\t'Merrell',\n\t'See',\n\t'Gough',\n\t'Maciel',\n\t'Wimberly',\n\t'Craddock',\n\t'Marquardt',\n\t'Wentz',\n\t'Meeker',\n\t'Sandberg',\n\t'Mosier',\n\t'Wasson',\n\t'Hundley',\n\t'Joe',\n\t'Shumaker',\n\t'Fortin',\n\t'Embry',\n\t'Olivarez',\n\t'Akin',\n\t'Seidel',\n\t'Coons',\n\t'Corrales',\n\t'Earle',\n\t'Matheny',\n\t'Kish',\n\t'Outlaw',\n\t'Lieberman',\n\t'Spalding',\n\t'Barnette',\n\t'Martel',\n\t'Hargis',\n\t'Kelso',\n\t'Merrick',\n\t'Fullerton',\n\t'Fries',\n\t'Doucette',\n\t'Clouse',\n\t'Prewitt',\n\t'Hawks',\n\t'Keaton',\n\t'Worthy',\n\t'Zook',\n\t'Montez',\n\t'Poore',\n\t'Autry',\n\t'Lemay',\n\t'Shifflett',\n\t'Forsyth',\n\t'Briseno',\n\t'Piazza',\n\t'Welker',\n\t'Tennant',\n\t'Heinz',\n\t'Haggard',\n\t'Leighton',\n\t'Brittain',\n\t'Begley',\n\t'Flanders',\n\t'Hermann',\n\t'Botello',\n\t'Mathias',\n\t'Hofer',\n\t'Hutto',\n\t'Godoy',\n\t'Cave',\n\t'Pagano',\n\t'Asbury',\n\t'Bowens',\n\t'Withrow',\n\t'Olivo',\n\t'Harbin',\n\t'Andre',\n\t'Sandlin',\n\t'Wertz',\n\t'Desimone',\n\t'Greiner',\n\t'Heinrich',\n\t'Whitcomb',\n\t'Dayton',\n\t'Petrie',\n\t'Hair',\n\t'Ketchum',\n\t'Shanahan',\n\t'Bianco',\n\t'Heil',\n\t'Cochrane',\n\t'Wegner',\n\t'Dagostino',\n\t'Couture',\n\t'Ling',\n\t'Wingate',\n\t'Arenas',\n\t'Keel',\n\t'Casteel',\n\t'Boothe',\n\t'Derosa',\n\t'Horst',\n\t'Rau',\n\t'Palermo',\n\t'Mccorkle',\n\t'Altamirano',\n\t'Nall',\n\t'Shumate',\n\t'Lightfoot',\n\t'Creamer',\n\t'Romeo',\n\t'Coffin',\n\t'Hutchings',\n\t'Jerome',\n\t'Hutcheson',\n\t'Damron',\n\t'Sorrell',\n\t'Nickel',\n\t'Sells',\n\t'Pinkerton',\n\t'Dao',\n\t'Dion',\n\t'Mcfarlane',\n\t'Ridenour',\n\t'Atwell',\n\t'Sturgill',\n\t'Schoen',\n\t'Partin',\n\t'Nemeth',\n\t'Almonte',\n\t'Pan',\n\t'Rickard',\n\t'Wentworth',\n\t'Sammons',\n\t'Sayre',\n\t'Southerland',\n\t'Parisi',\n\t'Ahn',\n\t'Carrion',\n\t'Testa',\n\t'Shorter',\n\t'Covert',\n\t'Gorham',\n\t'Alcantara',\n\t'Belton',\n\t'Bannister',\n\t'Sharkey',\n\t'Mccreary',\n\t'Pannell',\n\t'Scarbrough',\n\t'Keeling',\n\t'Gainey',\n\t'Mill',\n\t'Camarena',\n\t'Herbst',\n\t'Roller',\n\t'Wild',\n\t'Dellinger',\n\t'Lovejoy',\n\t'Manson',\n\t'Dupuis',\n\t'Clem',\n\t'Resendez',\n\t'Burkhardt',\n\t'Williford',\n\t'Mclendon',\n\t'Mazza',\n\t'Mccaffrey',\n\t'Lum',\n\t'Settle',\n\t'Hefner',\n\t'Dupre',\n\t'Louie',\n\t'Gunther',\n\t'Weimer',\n\t'Turnbull',\n\t'Bradbury',\n\t'Maness',\n\t'Urena',\n\t'Lor',\n\t'Sides',\n\t'Wick',\n\t'Monaco',\n\t'Gillen',\n\t'Ives',\n\t'Battaglia',\n\t'Ulmer',\n\t'Schreiner',\n\t'Caceres',\n\t'Sprouse',\n\t'Scoggins',\n\t'Ahern',\n\t'Tracey',\n\t'Terrazas',\n\t'Bracken',\n\t'Gurley',\n\t'Soliz',\n\t'Alcaraz',\n\t'Martines',\n\t'Weidner',\n\t'Criswell',\n\t'Wilbanks',\n\t'Hennessey',\n\t'Mendes',\n\t'Peak',\n\t'Ruelas',\n\t'Caudle',\n\t'Fuqua',\n\t'Jewett',\n\t'Chism',\n\t'Volpe',\n\t'Nino',\n\t'Logue',\n\t'Mcculloch',\n\t'Furr',\n\t'Kersey',\n\t'Shinn',\n\t'Yan',\n\t'Rausch',\n\t'Stinnett',\n\t'Mowery',\n\t'Rivero',\n\t'Weed',\n\t'Bertram',\n\t'Durand',\n\t'Gatewood',\n\t'Tilton',\n\t'Mahaffey',\n\t'Niles',\n\t'Mccue',\n\t'Vargo',\n\t'Holcombe',\n\t'Ralph',\n\t'Castleberry',\n\t'Snipes',\n\t'Wilt',\n\t'Vanmeter',\n\t'Nutter',\n\t'Mendiola',\n\t'Burchett',\n\t'Enos',\n\t'Jobe',\n\t'Kirkwood',\n\t'Pedroza',\n\t'Iglesias',\n\t'Leong',\n\t'Cromer',\n\t'Trice',\n\t'Magnuson',\n\t'Eagle',\n\t'Montenegro',\n\t'Troy',\n\t'Cato',\n\t'Edmond',\n\t'Hendrick',\n\t'Lebron',\n\t'Lathrop',\n\t'Budd',\n\t'Appel',\n\t'Knowlton',\n\t'Bianchi',\n\t'Camarillo',\n\t'Ginn',\n\t'Pulley',\n\t'True',\n\t'Gaddy',\n\t'Domingo',\n\t'Kingsley',\n\t'Loftus',\n\t'Denham',\n\t'Sifuentes',\n\t'Siler',\n\t'Hardison',\n\t'Kwan',\n\t'Pendergrass',\n\t'Frasier',\n\t'Hutchens',\n\t'Fort',\n\t'Montiel',\n\t'Fincher',\n\t'Eggers',\n\t'Moen',\n\t'Griffis',\n\t'Hauck',\n\t'Lister',\n\t'Lundberg',\n\t'Tanaka',\n\t'Cornish',\n\t'Whitlow',\n\t'Chou',\n\t'Griego',\n\t'Robson',\n\t'Prosser',\n\t'Ballinger',\n\t'Fogarty',\n\t'Allman',\n\t'Atchison',\n\t'Conaway',\n\t'Riddick',\n\t'Rupert',\n\t'Krug',\n\t'Pinkston',\n\t'Coggins',\n\t'Narvaez',\n\t'Earnest',\n\t'Fain',\n\t'Rash',\n\t'Olmstead',\n\t'Sherrod',\n\t'Beeler',\n\t'Spearman',\n\t'Poland',\n\t'Rousseau',\n\t'Hyland',\n\t'Rhea',\n\t'Son',\n\t'Redmon',\n\t'Wilke',\n\t'Valenti',\n\t'Paulino',\n\t'Geyer',\n\t'Blackwood',\n\t'Leclair',\n\t'Olguin',\n\t'Maestas',\n\t'Buckingham',\n\t'Blythe',\n\t'Samuelson',\n\t'Bounds',\n\t'Nakamura',\n\t'Batts',\n\t'Galarza',\n\t'Sisco',\n\t'Mcvay',\n\t'Hynes',\n\t'Mertz',\n\t'Tremblay',\n\t'Orosco',\n\t'Prentice',\n\t'Wilhite',\n\t'Seiler',\n\t'Archibald',\n\t'Wooldridge',\n\t'Winfield',\n\t'Oden',\n\t'Zelaya',\n\t'Chestnut',\n\t'Guardado',\n\t'Mccallister',\n\t'Canty',\n\t'Grasso',\n\t'Collett',\n\t'Hylton',\n\t'Easterling',\n\t'Deangelis',\n\t'Treadway',\n\t'Ferrari',\n\t'Ethridge',\n\t'Milburn',\n\t'Mercier',\n\t'Bickford',\n\t'Thibodeau',\n\t'Bolanos',\n\t'Fellows',\n\t'Hales',\n\t'Greathouse',\n\t'Buchholz',\n\t'Strunk',\n\t'Faison',\n\t'Purnell',\n\t'Clegg',\n\t'Steinmetz',\n\t'Wojcik',\n\t'Alcorn',\n\t'Ballesteros',\n\t'Basile',\n\t'Paez',\n\t'Armour',\n\t'Devito',\n\t'Tello',\n\t'Flick',\n\t'Yount',\n\t'Estevez',\n\t'Hitt',\n\t'Houle',\n\t'Cha',\n\t'Travers',\n\t'Cass',\n\t'Loper',\n\t'Getz',\n\t'Cade',\n\t'Gonsalves',\n\t'Lear',\n\t'Cromwell',\n\t'Stephan',\n\t'Ocasio',\n\t'Deluna',\n\t'Tolentino',\n\t'Picard',\n\t'Eaves',\n\t'Toscano',\n\t'Ault',\n\t'Osburn',\n\t'Ruvalcaba',\n\t'Szabo',\n\t'Kozak',\n\t'Bear',\n\t'Eck',\n\t'Deyoung',\n\t'Morehead',\n\t'Herrin',\n\t'Tillery',\n\t'Royster',\n\t'Kehoe',\n\t'Swank',\n\t'Yamamoto',\n\t'Schoonover',\n\t'Clanton',\n\t'Stutzman',\n\t'Swearingen',\n\t'Martinson',\n\t'Harrelson',\n\t'Leo',\n\t'Keyser',\n\t'Guyton',\n\t'Lucio',\n\t'Veal',\n\t'Vanwinkle',\n\t'Angelo',\n\t'Zamudio',\n\t'Haddock',\n\t'Quach',\n\t'Thomsen',\n\t'Curiel',\n\t'Badger',\n\t'Teel',\n\t'Hibbard',\n\t'Dvorak',\n\t'Ballew',\n\t'Falls',\n\t'Bostick',\n\t'Monaghan',\n\t'Segal',\n\t'Denning',\n\t'Bahr',\n\t'Serrato',\n\t'Toomey',\n\t'Lacroix',\n\t'Antoine',\n\t'Resendiz',\n\t'Sperry',\n\t'Rosser',\n\t'Bogan',\n\t'Gaspar',\n\t'Amin',\n\t'Schramm',\n\t'Lemaster',\n\t'Echevarria',\n\t'Lilley',\n\t'Poling',\n\t'Villagomez',\n\t'Conde',\n\t'Delrio',\n\t'Lerner',\n\t'Leroy',\n\t'Otis',\n\t'Durkin',\n\t'Lavender',\n\t'Schenk',\n\t'Ong',\n\t'Guess',\n\t'Alanis',\n\t'Jacobo',\n\t'Ramsay',\n\t'Henke',\n\t'Sledge',\n\t'Whited',\n\t'Frazer',\n\t'Fortier',\n\t'Macleod',\n\t'Pascual',\n\t'Casanova',\n\t'Olds',\n\t'Jenson',\n\t'Tijerina',\n\t'Flora',\n\t'Casto',\n\t'Rinaldi',\n\t'Blunt',\n\t'Fontana',\n\t'Minnick',\n\t'Larios',\n\t'Raynor',\n\t'Fung',\n\t'Marek',\n\t'Valladares',\n\t'Clemmons',\n\t'Gracia',\n\t'Rohrer',\n\t'Fryer',\n\t'Folsom',\n\t'Gearhart',\n\t'Sumpter',\n\t'Kraemer',\n\t'Aceves',\n\t'Pettigrew',\n\t'Mclaurin',\n\t'Southern',\n\t'Barrows',\n\t'Landeros',\n\t'Janes',\n\t'Deguzman',\n\t'Mcfall',\n\t'Fredericks',\n\t'Ashe',\n\t'Mauro',\n\t'Merino',\n\t'Windsor',\n\t'Taber',\n\t'Armijo',\n\t'Bricker',\n\t'Pitman',\n\t'Morrill',\n\t'Sanches',\n\t'Deboer',\n\t'Conlon',\n\t'Reuter',\n\t'Stegall',\n\t'Clemente',\n\t'Romine',\n\t'Dykstra',\n\t'Ehlers',\n\t'Tallman',\n\t'Lovato',\n\t'Brent',\n\t'Pearl',\n\t'Pyles',\n\t'Cloutier',\n\t'Mccurry',\n\t'Mckeever',\n\t'Graziano',\n\t'Heflin',\n\t'Garman',\n\t'Isaacson',\n\t'Mcreynolds',\n\t'Meister',\n\t'Stroup',\n\t'Everson',\n\t'Halsey',\n\t'Mcewen',\n\t'Sparkman',\n\t'Yager',\n\t'Bucher',\n\t'Berryman',\n\t'Derr',\n\t'Jester',\n\t'Mickelson',\n\t'Sayers',\n\t'Whiteman',\n\t'Riordan',\n\t'Mcinnis',\n\t'Jose',\n\t'Goolsby',\n\t'Stidham',\n\t'Donley',\n\t'Johnsen',\n\t'Stallworth',\n\t'Franke',\n\t'Silvers',\n\t'Reitz',\n\t'Nathan',\n\t'Brogan',\n\t'Cardoso',\n\t'Linville',\n\t'Baptiste',\n\t'Gorski',\n\t'Rey',\n\t'Hazen',\n\t'Damon',\n\t'Shores',\n\t'Boling',\n\t'Jablonski',\n\t'Lemieux',\n\t'Hecht',\n\t'Dong',\n\t'Langlois',\n\t'Burrow',\n\t'Hernandes',\n\t'Mcdevitt',\n\t'Pichardo',\n\t'Lew',\n\t'Stillwell',\n\t'Savoy',\n\t'Teixeira',\n\t'Matheson',\n\t'Hildreth',\n\t'Warfield',\n\t'Hogg',\n\t'Tiller',\n\t'Unruh',\n\t'Rudy',\n\t'Bristol',\n\t'Matias',\n\t'Buxton',\n\t'Ambriz',\n\t'Chiang',\n\t'Pomeroy',\n\t'Pogue',\n\t'Hammock',\n\t'Bethel',\n\t'Miguel',\n\t'Cassell',\n\t'Towns',\n\t'Bunker',\n\t'Mcmichael',\n\t'Kress',\n\t'Newland',\n\t'Whitehurst',\n\t'Fazio',\n\t'Batten',\n\t'Calvillo',\n\t'Wallen',\n\t'Lung',\n\t'Turney',\n\t'Sparrow',\n\t'Steadman',\n\t'Battles',\n\t'Berlin',\n\t'Lindgren',\n\t'Mckeon',\n\t'Luckett',\n\t'Spradlin',\n\t'Sherry',\n\t'Timmerman',\n\t'Utley',\n\t'Beale',\n\t'Driggers',\n\t'Hintz',\n\t'Pellegrino',\n\t'Hazel',\n\t'Grim',\n\t'Desmond',\n\t'Spellman',\n\t'Boren',\n\t'Staten',\n\t'Schlegel',\n\t'Maya',\n\t'Johnstone',\n\t'Harwell',\n\t'Pinson',\n\t'Barreto',\n\t'Spooner',\n\t'Candelaria',\n\t'Hammett',\n\t'Sessions',\n\t'Mckeown',\n\t'Mccool',\n\t'Gilson',\n\t'Knudson',\n\t'Irish',\n\t'Spruill',\n\t'Kling',\n\t'Gerlach',\n\t'Carnahan',\n\t'Markley',\n\t'Laporte',\n\t'Flanigan',\n\t'Spires',\n\t'Cushman',\n\t'Plante',\n\t'Schlosser',\n\t'Sachs',\n\t'Jamieson',\n\t'Hornsby',\n\t'Armstead',\n\t'Kremer',\n\t'Madera',\n\t'Thornburg',\n\t'Briley',\n\t'Garris',\n\t'Jorgenson',\n\t'Moorman',\n\t'Vuong',\n\t'Ard',\n\t'Irons',\n\t'Fiedler',\n\t'Jackman',\n\t'Kuehn',\n\t'Jenks',\n\t'Bristow',\n\t'Mosby',\n\t'Aldana',\n\t'Maclean',\n\t'Freund',\n\t'Creighton',\n\t'Smothers',\n\t'Melson',\n\t'Lundgren',\n\t'Donato',\n\t'Usher',\n\t'Thornhill',\n\t'Lowman',\n\t'Mariano',\n\t'Button',\n\t'Mcbee',\n\t'Cupp',\n\t'Wickham',\n\t'Destefano',\n\t'Nutt',\n\t'Rambo',\n\t'Voigt',\n\t'Talbott',\n\t'Saxon',\n\t'Cedillo',\n\t'Mattison',\n\t'Speed',\n\t'Reiss',\n\t'Nan',\n\t'Westphal',\n\t'Whittle',\n\t'Bernhardt',\n\t'Boatwright',\n\t'Bussey',\n\t'Rojo',\n\t'Eden',\n\t'Crites',\n\t'Place',\n\t'He',\n\t'Chaves',\n\t'Larose',\n\t'Thames',\n\t'Hoch',\n\t'Knotts',\n\t'Simone',\n\t'Binkley',\n\t'Koester',\n\t'Pettis',\n\t'Moye',\n\t'Napolitano',\n\t'Heffner',\n\t'Sasser',\n\t'Jessup',\n\t'Aguiar',\n\t'Ogrady',\n\t'Pippin',\n\t'Worth',\n\t'Shively',\n\t'Whitmire',\n\t'Rutter',\n\t'Cedeno',\n\t'Welborn',\n\t'Mcdougal',\n\t'Angell',\n\t'Sacco',\n\t'Hailey',\n\t'Neel',\n\t'Paniagua',\n\t'Pointer',\n\t'Rohde',\n\t'Holloman',\n\t'Strother',\n\t'Guffey',\n\t'Fenner',\n\t'Huntington',\n\t'Shane',\n\t'Yuen',\n\t'Gosnell',\n\t'Martini',\n\t'Loving',\n\t'Molloy',\n\t'Olmos',\n\t'Christ',\n\t'Oaks',\n\t'Ostrowski',\n\t'Badillo',\n\t'To',\n\t'Laplante',\n\t'Martindale',\n\t'Richie',\n\t'Pleasant',\n\t'Palomino',\n\t'Rodarte',\n\t'Stamps',\n\t'Peeples',\n\t'Ries',\n\t'Brownell',\n\t'Walz',\n\t'Arana',\n\t'Tenney',\n\t'Roddy',\n\t'Lindner',\n\t'Bolt',\n\t'Rigsby',\n\t'Matteson',\n\t'Fielder',\n\t'Randazzo',\n\t'Deanda',\n\t'Drayton',\n\t'Ridge',\n\t'Tarr',\n\t'Shade',\n\t'Upshaw',\n\t'Woodcock',\n\t'Miley',\n\t'Hargrave',\n\t'Langer',\n\t'Yun',\n\t'Wilkie',\n\t'Choe',\n\t'Ching',\n\t'Dugas',\n\t'Saul',\n\t'Corder',\n\t'Bobbitt',\n\t'Spurgeon',\n\t'Gladden',\n\t'Woodbury',\n\t'Tibbs',\n\t'Mcgarry',\n\t'Mcdaniels',\n\t'Weigel',\n\t'Bickel',\n\t'Michels',\n\t'Hughey',\n\t'Apple',\n\t'Bosley',\n\t'Nesmith',\n\t'Farber',\n\t'Ackley',\n\t'Goodin',\n\t'Almond',\n\t'Garrity',\n\t'Bettencourt',\n\t'Koss',\n\t'Falcone',\n\t'Lavigne',\n\t'Rainwater',\n\t'Nation',\n\t'Blodgett',\n\t'Dabney',\n\t'Mabe',\n\t'Trowbridge',\n\t'Lundquist',\n\t'Rosenberger',\n\t'Dombrowski',\n\t'Ferro',\n\t'Evangelista',\n\t'Bowlin',\n\t'Mckelvey',\n\t'Roderick',\n\t'Michalski',\n\t'Berkowitz',\n\t'Sato',\n\t'Mayorga',\n\t'Corwin',\n\t'Mckenney',\n\t'Salyer',\n\t'Walling',\n\t'Abell',\n\t'Palacio',\n\t'Lash',\n\t'Collado',\n\t'Gass',\n\t'Luis',\n\t'Cooksey',\n\t'Moll',\n\t'Miramontes',\n\t'Luster',\n\t'Shrader',\n\t'Toliver',\n\t'Hard',\n\t'Tu',\n\t'Sena',\n\t'Mckoy',\n\t'Wainwright',\n\t'Barela',\n\t'Keiser',\n\t'Hoag',\n\t'Backus',\n\t'Huskey',\n\t'Brannan',\n\t'Brumley',\n\t'Palm',\n\t'Boynton',\n\t'Krauss',\n\t'Steel',\n\t'Jurado',\n\t'Mulder',\n\t'Paterson',\n\t'Woolsey',\n\t'Smithson',\n\t'Joslin',\n\t'Richman',\n\t'Partida',\n\t'Grisham',\n\t'Wooden',\n\t'Gooding',\n\t'Fang',\n\t'Mcdade',\n\t'Spriggs',\n\t'Fishman',\n\t'Gabel',\n\t'Rutkowski',\n\t'Pride',\n\t'Beals',\n\t'Gaskin',\n\t'Friday',\n\t'Underhill',\n\t'Rodas',\n\t'Melo',\n\t'Sipes',\n\t'Zimmermann',\n\t'Mosqueda',\n\t'Haight',\n\t'Beeson',\n\t'Judy',\n\t'Bankston',\n\t'Pieper',\n\t'Siebert',\n\t'Horning',\n\t'Butt',\n\t'Bice',\n\t'Sills',\n\t'Philips',\n\t'Eisenberg',\n\t'Schumann',\n\t'Conger',\n\t'Bare',\n\t'Hume',\n\t'Nolasco',\n\t'Trainor',\n\t'Weatherly',\n\t'Huebner',\n\t'Bosch',\n\t'Gayle',\n\t'Kuhns',\n\t'Byron',\n\t'Glaze',\n\t'Poulin',\n\t'Enright',\n\t'Large',\n\t'Comeaux',\n\t'Rountree',\n\t'Tavarez',\n\t'Beardsley',\n\t'Rubino',\n\t'Fee',\n\t'Grider',\n\t'Bechtel',\n\t'Gaona',\n\t'Wallin',\n\t'Mashburn',\n\t'Dalrymple',\n\t'Gingerich',\n\t'Vaccaro',\n\t'Hass',\n\t'Manzano',\n\t'Tyner',\n\t'Loza',\n\t'Lowell',\n\t'Kaufmann',\n\t'Bischoff',\n\t'Doolittle',\n\t'Shivers',\n\t'Valente',\n\t'Bozeman',\n\t'Howes',\n\t'Felts',\n\t'Feller',\n\t'Justus',\n\t'Schnell',\n\t'Boettcher',\n\t'Ivory',\n\t'Thorson',\n\t'Corn',\n\t'Snook',\n\t'Heilman',\n\t'Baxley',\n\t'Hasty',\n\t'Wasserman',\n\t'Barringer',\n\t'Frankel',\n\t'Peltier',\n\t'Guarino',\n\t'Avina',\n\t'Sturdivant',\n\t'Lien',\n\t'Montemayor',\n\t'Giddens',\n\t'Valverde',\n\t'Burchfield',\n\t'Pang',\n\t'Holbert',\n\t'Rooks',\n\t'Erdman',\n\t'Mcmaster',\n\t'Iniguez',\n\t'Hartwell',\n\t'Menchaca',\n\t'Bordelon',\n\t'Farkas',\n\t'Chrisman',\n\t'Metzler',\n\t'Fredrick',\n\t'Porterfield',\n\t'Slayton',\n\t'Quesada',\n\t'Hembree',\n\t'Peel',\n\t'Woodley',\n\t'Mather',\n\t'Waltz',\n\t'Totten',\n\t'Forney',\n\t'Woolley',\n\t'Trombley',\n\t'Yarborough',\n\t'Javier',\n\t'Durr',\n\t'Macklin',\n\t'Macon',\n\t'Novotny',\n\t'Amundson',\n\t'Kidder',\n\t'Flagg',\n\t'Oxendine',\n\t'Arguello',\n\t'Marler',\n\t'Penrod',\n\t'Mallett',\n\t'Council',\n\t'Kinard',\n\t'Bremer',\n\t'Towne',\n\t'Harless',\n\t'Merkel',\n\t'Giese',\n\t'Fife',\n\t'Byars',\n\t'Grande',\n\t'Kuo',\n\t'Levi',\n\t'Darr',\n\t'Sanabria',\n\t'Pounds',\n\t'Roeder',\n\t'Keim',\n\t'Brush',\n\t'Dreyer',\n\t'Taveras',\n\t'Furlong',\n\t'Dorris',\n\t'Prior',\n\t'Musgrove',\n\t'Weiler',\n\t'Munro',\n\t'Leake',\n\t'Vollmer',\n\t'Musick',\n\t'Hetrick',\n\t'Perdomo',\n\t'Kester',\n\t'Lock',\n\t'Pine',\n\t'Baskin',\n\t'Bonham',\n\t'Heffernan',\n\t'Mandel',\n\t'Sarver',\n\t'Hamer',\n\t'Duckett',\n\t'Lozada',\n\t'Stocker',\n\t'Fulcher',\n\t'Damato',\n\t'Camargo',\n\t'Shephard',\n\t'Loftis',\n\t'Winfrey',\n\t'Rueda',\n\t'Ledezma',\n\t'Gottlieb',\n\t'Lamont',\n\t'Mackie',\n\t'Bowe',\n\t'Stockwell',\n\t'Groth',\n\t'Chavira',\n\t'Lohr',\n\t'Loftin',\n\t'Gilmer',\n\t'Cushing',\n\t'Brody',\n\t'Nowlin',\n\t'Holiday',\n\t'Shirk',\n\t'Archie',\n\t'Howerton',\n\t'Matthew',\n\t'Copley',\n\t'Marchese',\n\t'Echeverria',\n\t'Soper',\n\t'Cantwell',\n\t'Nelms',\n\t'Tuggle',\n\t'Dumont',\n\t'Bard',\n\t'Gower',\n\t'Mathes',\n\t'Yeung',\n\t'Buell',\n\t'Bastian',\n\t'Burd',\n\t'Broadway',\n\t'Peng',\n\t'Greenwell',\n\t'Vanover',\n\t'Correll',\n\t'Tindall',\n\t'Bill',\n\t'Mulcahy',\n\t'Dionne',\n\t'Rathbun',\n\t'Baeza',\n\t'Booher',\n\t'Fried',\n\t'Mcginley',\n\t'Lavin',\n\t'Atherton',\n\t'Donnell',\n\t'Bays',\n\t'Riedel',\n\t'Grenier',\n\t'Zachary',\n\t'Harold',\n\t'Styles',\n\t'Wisdom',\n\t'Raley',\n\t'Tamez',\n\t'Arena',\n\t'Morelli',\n\t'Hazelwood',\n\t'Somerville',\n\t'Lapp',\n\t'Rood',\n\t'Salem',\n\t'Pape',\n\t'Olivera',\n\t'Albritton',\n\t'Carvajal',\n\t'Zayas',\n\t'Myer',\n\t'Pohl',\n\t'Haynie',\n\t'Mariscal',\n\t'Wampler',\n\t'Rife',\n\t'Leeper',\n\t'Newhouse',\n\t'Rodney',\n\t'Vandenberg',\n\t'Spitzer',\n\t'Kingston',\n\t'Wessel',\n\t'Hartzell',\n\t'Durden',\n\t'Marques',\n\t'Born',\n\t'Scribner',\n\t'Rocco',\n\t'Germain',\n\t'Tinoco',\n\t'Valdovinos',\n\t'Musselman',\n\t'Vicente',\n\t'Parsley',\n\t'Crittenden',\n\t'Tibbetts',\n\t'Hulse',\n\t'Mccleary',\n\t'Barboza',\n\t'Velarde',\n\t'Brodie',\n\t'Beaudoin',\n\t'Moreira',\n\t'Maggard',\n\t'Jara',\n\t'Ferrante',\n\t'Overby',\n\t'Friesen',\n\t'Viola',\n\t'Nelsen',\n\t'Hash',\n\t'Doane',\n\t'Deese',\n\t'Messick',\n\t'Bay',\n\t'Anton',\n\t'Ingersoll',\n\t'Saucier',\n\t'Kwiatkowski',\n\t'Rawson',\n\t'Brophy',\n\t'Ladner',\n\t'Lehr',\n\t'Weil',\n\t'Yocum',\n\t'Brasher',\n\t'Denison',\n\t'Hutcherson',\n\t'Stowers',\n\t'Geller',\n\t'Fortenberry',\n\t'Stebbins',\n\t'Conyers',\n\t'Toole',\n\t'Stoker',\n\t'Roden',\n\t'Chitwood',\n\t'Beeman',\n\t'Fannin',\n\t'Strait',\n\t'Marlowe',\n\t'Greenwald',\n\t'Hann',\n\t'Stumpf',\n\t'Samaniego',\n\t'Colton',\n\t'Bogart',\n\t'Morel',\n\t'Montelongo',\n\t'Boylan',\n\t'Guido',\n\t'Wyrick',\n\t'Horsley',\n\t'Tenorio',\n\t'Sallee',\n\t'Morehouse',\n\t'Whyte',\n\t'Neilson',\n\t'Watanabe',\n\t'Magallanes',\n\t'Mudd',\n\t'Kieffer',\n\t'Brigham',\n\t'Dollar',\n\t'Huss',\n\t'Albanese',\n\t'Spiegel',\n\t'Hixson',\n\t'Rounds',\n\t'Orth',\n\t'Blanchette',\n\t'Vanderpool',\n\t'Pfaff',\n\t'Speck',\n\t'Shreve',\n\t'Sevilla',\n\t'Neri',\n\t'Rohr',\n\t'Ruble',\n\t'Vanpelt',\n\t'Rickman',\n\t'Caraway',\n\t'Berndt',\n\t'Mchale',\n\t'Ingalls',\n\t'Roybal',\n\t'Money',\n\t'Mcdougall',\n\t'Melancon',\n\t'Wellington',\n\t'Ingraham',\n\t'Ritz',\n\t'Lashley',\n\t'Marchand',\n\t'Schatz',\n\t'Heiser',\n\t'Eby',\n\t'Wimmer',\n\t'Orton',\n\t'Atchley',\n\t'Mumford',\n\t'Bahena',\n\t'Gammon',\n\t'Buehler',\n\t'Fike',\n\t'Plank',\n\t'Carrigan',\n\t'Kempf',\n\t'Cundiff',\n\t'So',\n\t'Sauls',\n\t'Mohler',\n\t'Grillo',\n\t'Prichard',\n\t'Pastor',\n\t'Prasad',\n\t'Babin',\n\t'Bontrager',\n\t'Weddle',\n\t'Alberts',\n\t'Theis',\n\t'Lemoine',\n\t'Hartnett',\n\t'Kingsbury',\n\t'Baran',\n\t'Birmingham',\n\t'Gault',\n\t'Thorp',\n\t'Wyant',\n\t'Obryan',\n\t'Santacruz',\n\t'Camara',\n\t'Whitehouse',\n\t'Evenson',\n\t'Halvorson',\n\t'Palmieri',\n\t'Hannan',\n\t'Dew',\n\t'Au',\n\t'Nolte',\n\t'Click',\n\t'Wooley',\n\t'Hung',\n\t'Eberhardt',\n\t'Rawlins',\n\t'Sadowski',\n\t'Sarabia',\n\t'Soule',\n\t'Millar',\n\t'Engstrom',\n\t'Cowles',\n\t'Runyan',\n\t'Mitchel',\n\t'Torrence',\n\t'Silverstein',\n\t'Hewett',\n\t'Pilgrim',\n\t'Yeh',\n\t'Rosenfeld',\n\t'Mulholland',\n\t'Hatley',\n\t'Fawcett',\n\t'Delrosario',\n\t'Chinn',\n\t'Bayless',\n\t'Dee',\n\t'Deane',\n\t'Arriola',\n\t'Duda',\n\t'Koster',\n\t'Rath',\n\t'Karl',\n\t'Weiland',\n\t'Lemmon',\n\t'Blaine',\n\t'Scofield',\n\t'Marston',\n\t'Gist',\n\t'Pinckney',\n\t'Moritz',\n\t'Mclellan',\n\t'Fulkerson',\n\t'Gaynor',\n\t'Pitre',\n\t'Warrick',\n\t'Cobbs',\n\t'Meacham',\n\t'Guerin',\n\t'Tedesco',\n\t'Passmore',\n\t'Northcutt',\n\t'Ison',\n\t'Cowell',\n\t'Ream',\n\t'Walther',\n\t'Meraz',\n\t'Tribble',\n\t'Bumgarner',\n\t'Gabbard',\n\t'Dawes',\n\t'Moncada',\n\t'Chilton',\n\t'Deweese',\n\t'Rigby',\n\t'Marte',\n\t'Baylor',\n\t'Valentino',\n\t'Shine',\n\t'August',\n\t'Billups',\n\t'Jarman',\n\t'Jacks',\n\t'Coffee',\n\t'Friedrich',\n\t'Marley',\n\t'Hasan',\n\t'Pennell',\n\t'Abercrombie',\n\t'Bazan',\n\t'Strickler',\n\t'Bruton',\n\t'Lamm',\n\t'Pender',\n\t'Wingfield',\n\t'Hoffer',\n\t'Zahn',\n\t'Chaplin',\n\t'Reinke',\n\t'Larosa',\n\t'Maupin',\n\t'Bunnell',\n\t'Hassell',\n\t'Guo',\n\t'Galan',\n\t'Paschal',\n\t'Browder',\n\t'Krantz',\n\t'Milne',\n\t'Pelayo',\n\t'Emanuel',\n\t'Mccluskey',\n\t'Edens',\n\t'Radtke',\n\t'Alger',\n\t'Duhon',\n\t'Probst',\n\t'Witmer',\n\t'Hoagland',\n\t'Saechao',\n\t'Pitcher',\n\t'Villalpando',\n\t'Carswell',\n\t'Roundtree',\n\t'Kuhlman',\n\t'Tait',\n\t'Shaughnessy',\n\t'Wei',\n\t'Cravens',\n\t'Sipe',\n\t'Islas',\n\t'Hollenbeck',\n\t'Lockard',\n\t'Perrone',\n\t'Tapp',\n\t'Santoyo',\n\t'Jaffe',\n\t'Klotz',\n\t'Gilpin',\n\t'Ehrlich',\n\t'Klug',\n\t'Stowell',\n\t'Ibanez',\n\t'Lazar',\n\t'Osman',\n\t'Larkins',\n\t'Donofrio',\n\t'Ericson',\n\t'Schenck',\n\t'Mouton',\n\t'Medlock',\n\t'Hubbell',\n\t'Bixler',\n\t'Nowicki',\n\t'Muro',\n\t'Homer',\n\t'Grijalva',\n\t'Ashmore',\n\t'Harbison',\n\t'Duffey',\n\t'Osgood',\n\t'Hardee',\n\t'Jain',\n\t'Wilber',\n\t'Bolling',\n\t'Lett',\n\t'Phillip',\n\t'Dipietro',\n\t'Lefebvre',\n\t'Batiste',\n\t'Mcswain',\n\t'Distefano',\n\t'Hack',\n\t'Strobel',\n\t'Kipp',\n\t'Doerr',\n\t'Radcliffe',\n\t'Cartagena',\n\t'Paradis',\n\t'Stilwell',\n\t'Mccrea',\n\t'Searles',\n\t'Frausto',\n\t'Hendershot',\n\t'Gosselin',\n\t'Islam',\n\t'Freese',\n\t'Stockman',\n\t'Burwell',\n\t'Vandiver',\n\t'Engler',\n\t'Geisler',\n\t'Barham',\n\t'Wiegand',\n\t'Goncalves',\n\t'Theriot',\n\t'Doucet',\n\t'Bridge',\n\t'Catron',\n\t'Blanks',\n\t'Rahn',\n\t'Schaub',\n\t'Hershey',\n\t'Strader',\n\t'Buckman',\n\t'Hartwig',\n\t'Campo',\n\t'Tsang',\n\t'Luck',\n\t'Bernardo',\n\t'Marker',\n\t'Pinkney',\n\t'Benefield',\n\t'Mcginty',\n\t'Bode',\n\t'Linden',\n\t'Manriquez',\n\t'Jaquez',\n\t'Bedard',\n\t'Flack',\n\t'Hesse',\n\t'Costanzo',\n\t'Boardman',\n\t'Carper',\n\t'Word',\n\t'Miracle',\n\t'Edmunds',\n\t'Bott',\n\t'Flemming',\n\t'Manns',\n\t'Kesler',\n\t'Piatt',\n\t'Tankersley',\n\t'Eberle',\n\t'Roney',\n\t'Belk',\n\t'Vansickle',\n\t'Varga',\n\t'Hillard',\n\t'Neubauer',\n\t'Quirk',\n\t'Chevalier',\n\t'Mintz',\n\t'Kocher',\n\t'Casarez',\n\t'Tinker',\n\t'Elmer',\n\t'Decarlo',\n\t'Cordes',\n\t'Berube',\n\t'Kimbrell',\n\t'Schick',\n\t'Papa',\n\t'Alderson',\n\t'Callaghan',\n\t'Renaud',\n\t'Pardue',\n\t'Krohn',\n\t'Bloomfield',\n\t'Coward',\n\t'Ligon',\n\t'Trask',\n\t'Wingo',\n\t'Book',\n\t'Crutcher',\n\t'Canter',\n\t'Teran',\n\t'Denman',\n\t'Stackhouse',\n\t'Chambliss',\n\t'Gourley',\n\t'Earls',\n\t'Frizzell',\n\t'Bergen',\n\t'Abdullah',\n\t'Sprinkle',\n\t'Fancher',\n\t'Urias',\n\t'Lavelle',\n\t'Baumgardner',\n\t'Kahler',\n\t'Baldridge',\n\t'Alejandro',\n\t'Plascencia',\n\t'Hix',\n\t'Rule',\n\t'Mix',\n\t'Petro',\n\t'Hadden',\n\t'Fore',\n\t'Humes',\n\t'Barnum',\n\t'Laing',\n\t'Maggio',\n\t'Sylvia',\n\t'Malinowski',\n\t'Fell',\n\t'Durst',\n\t'Plant',\n\t'Vaca',\n\t'Abarca',\n\t'Shirey',\n\t'Parton',\n\t'Ta',\n\t'Ramires',\n\t'Ochs',\n\t'Gaitan',\n\t'Ledoux',\n\t'Darrow',\n\t'Messenger',\n\t'Chalmers',\n\t'Schaller',\n\t'Derby',\n\t'Coakley',\n\t'Saleh',\n\t'Kirkman',\n\t'Orta',\n\t'Crabb',\n\t'Spinks',\n\t'Dinkins',\n\t'Harrigan',\n\t'Koller',\n\t'Dorr',\n\t'Carty',\n\t'Sturgis',\n\t'Shriver',\n\t'Macedo',\n\t'Feng',\n\t'Bentz',\n\t'Bedell',\n\t'Osuna',\n\t'Dibble',\n\t'Dejong',\n\t'Fender',\n\t'Parada',\n\t'Vanburen',\n\t'Chaffee',\n\t'Stott',\n\t'Sigmon',\n\t'Nicolas',\n\t'Salyers',\n\t'Magdaleno',\n\t'Deering',\n\t'Puentes',\n\t'Funderburk',\n\t'Jang',\n\t'Christopherson',\n\t'Sellars',\n\t'Marcotte',\n\t'Oster',\n\t'Liao',\n\t'Tudor',\n\t'Specht',\n\t'Chowdhury',\n\t'Landa',\n\t'Monge',\n\t'Brake',\n\t'Behnke',\n\t'Llewellyn',\n\t'Labelle',\n\t'Mangan',\n\t'Godsey',\n\t'Truax',\n\t'Lombard',\n\t'Thurmond',\n\t'Emerick',\n\t'Blume',\n\t'Mcginn',\n\t'Beer',\n\t'Marrs',\n\t'Zinn',\n\t'Rieger',\n\t'Dilley',\n\t'Thibault',\n\t'Witkowski',\n\t'Chi',\n\t'Fielding',\n\t'Tyrrell',\n\t'Peeler',\n\t'Northrup',\n\t'Augustin',\n\t'Toy',\n\t'Geist',\n\t'Schuman',\n\t'Fairley',\n\t'Duque',\n\t'Villatoro',\n\t'Dudek',\n\t'Sonnier',\n\t'Fritts',\n\t'Worsham',\n\t'Herold',\n\t'Mcgehee',\n\t'Caskey',\n\t'Boatright',\n\t'Lazaro',\n\t'Deck',\n\t'Palomo',\n\t'Cory',\n\t'Olivier',\n\t'Baines',\n\t'Fan',\n\t'Futrell',\n\t'Halpin',\n\t'Garrido',\n\t'Koonce',\n\t'Fogg',\n\t'Meneses',\n\t'Mulkey',\n\t'Restrepo',\n\t'Ducharme',\n\t'Slate',\n\t'Toussaint',\n\t'Sorrells',\n\t'Fitts',\n\t'Dickman',\n\t'Alfred',\n\t'Grimsley',\n\t'Settles',\n\t'Etienne',\n\t'Eggert',\n\t'Hague',\n\t'Caldera',\n\t'Hillis',\n\t'Hollander',\n\t'Haire',\n\t'Theriault',\n\t'Madigan',\n\t'Kiernan',\n\t'Parkhurst',\n\t'Lippert',\n\t'Jaynes',\n\t'Moniz',\n\t'Bost',\n\t'Bettis',\n\t'Sandy',\n\t'Kuhl',\n\t'Wilk',\n\t'Borrego',\n\t'Koon',\n\t'Penney',\n\t'Pizarro',\n\t'Stitt',\n\t'Koski',\n\t'Galicia',\n\t'Quiles',\n\t'Real',\n\t'Massa',\n\t'Crone',\n\t'Teeter',\n\t'Voorhees',\n\t'Hilbert',\n\t'Nabors',\n\t'Shupe',\n\t'Blood',\n\t'Mcauliffe',\n\t'Waits',\n\t'Blakley',\n\t'Stoltz',\n\t'Maes',\n\t'Munroe',\n\t'Rhoden',\n\t'Abeyta',\n\t'Milliken',\n\t'Harkness',\n\t'Almaraz',\n\t'Remington',\n\t'Raya',\n\t'Frierson',\n\t'Olszewski',\n\t'Quillen',\n\t'Westcott',\n\t'Fu',\n\t'Tolley',\n\t'Olive',\n\t'Mcclary',\n\t'Corbitt',\n\t'Lui',\n\t'Lachance',\n\t'Meagher',\n\t'Cowley',\n\t'Hudak',\n\t'Cress',\n\t'Mccrory',\n\t'Talavera',\n\t'Mclaren',\n\t'Laurent',\n\t'Bias',\n\t'Whetstone',\n\t'Hollister',\n\t'Quevedo',\n\t'Byerly',\n\t'Berryhill',\n\t'Folk',\n\t'Conners',\n\t'Kellum',\n\t'Haro',\n\t'Mallard',\n\t'Mccants',\n\t'Risner',\n\t'Barros',\n\t'Downes',\n\t'Mayers',\n\t'Loeffler',\n\t'Mink',\n\t'Hotchkiss',\n\t'Bartz',\n\t'Alt',\n\t'Hindman',\n\t'Bayne',\n\t'Bagby',\n\t'Colin',\n\t'Treadwell',\n\t'Hemingway',\n\t'Bane',\n\t'Heintz',\n\t'Fite',\n\t'Mccomb',\n\t'Carmody',\n\t'Kistler',\n\t'Olinger',\n\t'Vestal',\n\t'Byrum',\n\t'Seale',\n\t'Turnage',\n\t'Raber',\n\t'Prendergast',\n\t'Koons',\n\t'Nickell',\n\t'Benz',\n\t'Mcculley',\n\t'Lightner',\n\t'Hamill',\n\t'Castellon',\n\t'Chesser',\n\t'Moats',\n\t'Buie',\n\t'Svoboda',\n\t'Wold',\n\t'Macmillan',\n\t'Boring',\n\t'Terrill',\n\t'Loveland',\n\t'Gaskill',\n\t'Verdugo',\n\t'Yip',\n\t'Oviedo',\n\t'Hight',\n\t'Carmack',\n\t'Scheer',\n\t'Dreher',\n\t'Appleby',\n\t'Lally',\n\t'Kibler',\n\t'Marra',\n\t'Mcnamee',\n\t'Cooks',\n\t'Kavanaugh',\n\t'Carrico',\n\t'Alden',\n\t'Dillman',\n\t'Zamarripa',\n\t'Serra',\n\t'Gilligan',\n\t'Nester',\n\t'Sokol',\n\t'Latta',\n\t'Hanrahan',\n\t'Ballou',\n\t'Hollinger',\n\t'Lux',\n\t'Caton',\n\t'Hamann',\n\t'Sackett',\n\t'Leiva',\n\t'Emory',\n\t'Barden',\n\t'Houk',\n\t'Lees',\n\t'Deltoro',\n\t'Lowrey',\n\t'Mcevoy',\n\t'Hibbs',\n\t'Crossley',\n\t'Rego',\n\t'Melchor',\n\t'Tull',\n\t'Bramlett',\n\t'Hsieh',\n\t'Warwick',\n\t'Sayles',\n\t'Mapes',\n\t'Pabon',\n\t'Dearing',\n\t'Stamm',\n\t'Joshi',\n\t'Quan',\n\t'Larry',\n\t'Nordstrom',\n\t'Heisler',\n\t'Bigham',\n\t'Walston',\n\t'Solberg',\n\t'Bodnar',\n\t'Posada',\n\t'Mancilla',\n\t'Ovalle',\n\t'Harr',\n\t'Mccaskill',\n\t'Bromley',\n\t'Koerner',\n\t'Macpherson',\n\t'Trudeau',\n\t'Blais',\n\t'Kiley',\n\t'Lawlor',\n\t'Suter',\n\t'Rothman',\n\t'Oberg',\n\t'Seely',\n\t'Maxfield',\n\t'Truman',\n\t'Salvatore',\n\t'Fouts',\n\t'Goulet',\n\t'Munger',\n\t'Sikora',\n\t'Comeau',\n\t'Oliphant',\n\t'Baber',\n\t'Hensel',\n\t'Edelman',\n\t'Farina',\n\t'Albano',\n\t'Aycock',\n\t'Sung',\n\t'Deckard',\n\t'Steinke',\n\t'Silveira',\n\t'Servin',\n\t'Rex',\n\t'Franzen',\n\t'Hecker',\n\t'Gragg',\n\t'Mcgriff',\n\t'Ellingson',\n\t'Kerrigan',\n\t'An',\n\t'Bartel',\n\t'Priddy',\n\t'Hodson',\n\t'Tse',\n\t'Arbogast',\n\t'Arceneaux',\n\t'Leatherman',\n\t'Federico',\n\t'Pridgen',\n\t'Yim',\n\t'Kowalczyk',\n\t'Deberry',\n\t'Lejeune',\n\t'Elston',\n\t'Mielke',\n\t'Shelly',\n\t'Stambaugh',\n\t'Eagan',\n\t'Rivard',\n\t'Silvia',\n\t'Lawhorn',\n\t'Denis',\n\t'Hendry',\n\t'Wieland',\n\t'Levinson',\n\t'Marlin',\n\t'Gerdes',\n\t'Pfister',\n\t'Carder',\n\t'Pipkin',\n\t'Angle',\n\t'Hang',\n\t'Hagerty',\n\t'Rhinehart',\n\t'Gao',\n\t'Petit',\n\t'Mccraw',\n\t'Markle',\n\t'Lupo',\n\t'Busse',\n\t'Marble',\n\t'Bivins',\n\t'Storms',\n\t'Yuan',\n\t'Waldman',\n\t'Suh',\n\t'Wyckoff',\n\t'Stillman',\n\t'Piotrowski',\n\t'Abrego',\n\t'Gregoire',\n\t'Bogle',\n\t'Wortham',\n\t'Phung',\n\t'Brister',\n\t'Karnes',\n\t'Deming',\n\t'Ley',\n\t'Carrasquillo',\n\t'Curtiss',\n\t'Appleton',\n\t'Salley',\n\t'Borja',\n\t'Begum',\n\t'Phifer',\n\t'Shoup',\n\t'Cawley',\n\t'Deason',\n\t'Castanon',\n\t'Loucks',\n\t'Hagler',\n\t'Mcclinton',\n\t'Dulaney',\n\t'Hargett',\n\t'Mcardle',\n\t'Burcham',\n\t'Philpot',\n\t'Laroche',\n\t'Breland',\n\t'Hatten',\n\t'Karp',\n\t'Brummett',\n\t'Boatman',\n\t'Natale',\n\t'Pepe',\n\t'Mortimer',\n\t'Sink',\n\t'Voyles',\n\t'Reeve',\n\t'Honaker',\n\t'Loredo',\n\t'Ridgway',\n\t'Donner',\n\t'Lessard',\n\t'Dever',\n\t'Salomon',\n\t'Hickson',\n\t'Nicholls',\n\t'Bushey',\n\t'Osteen',\n\t'Reavis',\n\t'Rodman',\n\t'Barahona',\n\t'Knecht',\n\t'Hinman',\n\t'Faria',\n\t'Dana',\n\t'Bancroft',\n\t'Hatchett',\n\t'Hageman',\n\t'Klaus',\n\t'Castor',\n\t'Lampkin',\n\t'Dalessandro',\n\t'Riffle',\n\t'Korn',\n\t'Savoie',\n\t'Sandifer',\n\t'Mciver',\n\t'Magill',\n\t'Delafuente',\n\t'Widener',\n\t'Vermillion',\n\t'Dandrea',\n\t'Mader',\n\t'Woodman',\n\t'Milan',\n\t'Hollowell',\n\t'Schaaf',\n\t'Kao',\n\t'Nail',\n\t'Beaman',\n\t'Hawkes',\n\t'Mclane',\n\t'Marchant',\n\t'Scanlan',\n\t'Syed',\n\t'Peabody',\n\t'Uhl',\n\t'Schauer',\n\t'Azevedo',\n\t'Wolcott',\n\t'Mick',\n\t'Melgar',\n\t'Pilcher',\n\t'Burgin',\n\t'Weiser',\n\t'Daughtry',\n\t'Theisen',\n\t'Babbitt',\n\t'Petry',\n\t'Cotten',\n\t'Fick',\n\t'Eubank',\n\t'Tolson',\n\t'Judkins',\n\t'Cronk',\n\t'Wendel',\n\t'Monteiro',\n\t'Kissinger',\n\t'Banta',\n\t'Senn',\n\t'Fix',\n\t'Brehm',\n\t'Rittenhouse',\n\t'Banner',\n\t'Elwell',\n\t'Herd',\n\t'Araiza',\n\t'Hui',\n\t'Nowell',\n\t'Brett',\n\t'Hua',\n\t'Breeding',\n\t'Pawlowski',\n\t'Thompkins',\n\t'Bocanegra',\n\t'Bosworth',\n\t'Dutcher',\n\t'Cotto',\n\t'Beecher',\n\t'Callender',\n\t'Hamlett',\n\t'Benfield',\n\t'Claudio',\n\t'Reel',\n\t'Brookshire',\n\t'Helmick',\n\t'Ryals',\n\t'Winder',\n\t'Thom',\n\t'Robin',\n\t'Overman',\n\t'Furtado',\n\t'Dacosta',\n\t'Paddock',\n\t'Dancy',\n\t'Carpio',\n\t'Manzanares',\n\t'Zito',\n\t'Favela',\n\t'Beckley',\n\t'Adrian',\n\t'Flory',\n\t'Nestor',\n\t'Spell',\n\t'Speight',\n\t'Strawn',\n\t'Beckner',\n\t'Gause',\n\t'Berglund',\n\t'Ruppert',\n\t'Mincey',\n\t'Spinelli',\n\t'Suzuki',\n\t'Mizell',\n\t'Kirksey',\n\t'Bolduc',\n\t'Kilmer',\n\t'Wesson',\n\t'Brinker',\n\t'Urrutia',\n\t'Markey',\n\t'Brenneman',\n\t'Haupt',\n\t'Sievers',\n\t'Puga',\n\t'Halloran',\n\t'Birdsong',\n\t'Stancil',\n\t'Wiener',\n\t'Calvo',\n\t'Macy',\n\t'Cairns',\n\t'Kahl',\n\t'Vice',\n\t'Ordaz',\n\t'Grow',\n\t'Lafrance',\n\t'Dryden',\n\t'Studer',\n\t'Matney',\n\t'Edward',\n\t'Rackley',\n\t'Gurrola',\n\t'Demoss',\n\t'Woolard',\n\t'Oquinn',\n\t'Hambrick',\n\t'Christmas',\n\t'Robey',\n\t'Crayton',\n\t'Haber',\n\t'Arango',\n\t'Newcomer',\n\t'Groom',\n\t'Corson',\n\t'Harness',\n\t'Rossman',\n\t'Slaton',\n\t'Schutz',\n\t'Conant',\n\t'Tedder',\n\t'Sabin',\n\t'Lowder',\n\t'Womble',\n\t'Jin',\n\t'Monday',\n\t'Garmon',\n\t'Aronson',\n\t'Skeen',\n\t'Headrick',\n\t'Lefevre',\n\t'Whittemore',\n\t'Pelton',\n\t'Barner',\n\t'Hildebrandt',\n\t'Rick',\n\t'Helmer',\n\t'Grose',\n\t'Zak',\n\t'Schroder',\n\t'Mahler',\n\t'Keeley',\n\t'Flinn',\n\t'Jordon',\n\t'Ozuna',\n\t'Sand',\n\t'Henkel',\n\t'Turcotte',\n\t'Vining',\n\t'Bellinger',\n\t'Neese',\n\t'Hagerman',\n\t'Mcmillin',\n\t'Gaylord',\n\t'Harney',\n\t'Milano',\n\t'Carothers',\n\t'Depew',\n\t'Bucci',\n\t'Pirtle',\n\t'Hafner',\n\t'Dimas',\n\t'Howlett',\n\t'Reber',\n\t'Abram',\n\t'Davalos',\n\t'Zajac',\n\t'Pedro',\n\t'Goodall',\n\t'Kaylor',\n\t'Wrenn',\n\t'Gartner',\n\t'Kell',\n\t'Curl',\n\t'Leathers',\n\t'Spiller',\n\t'Beason',\n\t'Shattuck',\n\t'Brewington',\n\t'Pinon',\n\t'Nazario',\n\t'Wash',\n\t'Ruggles',\n\t'Matz',\n\t'Capers',\n\t'Dorsett',\n\t'Wilmoth',\n\t'Bracey',\n\t'Lenhart',\n\t'Devoe',\n\t'Choy',\n\t'Oswalt',\n\t'Capone',\n\t'Wayman',\n\t'Parikh',\n\t'Eastwood',\n\t'Cofield',\n\t'Rickert',\n\t'Mccandless',\n\t'Greenway',\n\t'Majewski',\n\t'Rigdon',\n\t'Armbruster',\n\t'Royce',\n\t'Sterner',\n\t'Swaim',\n\t'Flournoy',\n\t'Amezcua',\n\t'Delano',\n\t'Westerman',\n\t'Grau',\n\t'Claxton',\n\t'Veliz',\n\t'Haun',\n\t'Roscoe',\n\t'Mccafferty',\n\t'Ringer',\n\t'Volz',\n\t'Blessing',\n\t'Mcphail',\n\t'Thelen',\n\t'Gagliardi',\n\t'Scholz',\n\t'Genovese',\n\t'Boyette',\n\t'Squire',\n\t'Naughton',\n\t'Levitt',\n\t'Erskine',\n\t'Leffler',\n\t'Manchester',\n\t'Hallett',\n\t'Whitmer',\n\t'Gillett',\n\t'Groce',\n\t'Roos',\n\t'Bejarano',\n\t'Moskowitz',\n\t'Constantine',\n\t'Fidler',\n\t'Roll',\n\t'Schutte',\n\t'Ohare',\n\t'Warnock',\n\t'Wester',\n\t'Macgregor',\n\t'Golding',\n\t'Abner',\n\t'Burgett',\n\t'Bushnell',\n\t'Brazil',\n\t'Ascencio',\n\t'Hock',\n\t'Legrand',\n\t'Eversole',\n\t'Rome',\n\t'Radcliff',\n\t'Fuhrman',\n\t'Schmit',\n\t'Tew',\n\t'Caro',\n\t'Cowen',\n\t'Marriott',\n\t'Kephart',\n\t'Hartung',\n\t'Keil',\n\t'Benally',\n\t'Hazlett',\n\t'Avant',\n\t'Desrosiers',\n\t'Kwong',\n\t'Guyer',\n\t'Penner',\n\t'Avelar',\n\t'Cashman',\n\t'Stith',\n\t'Orona',\n\t'Rager',\n\t'Johanson',\n\t'Lanza',\n\t'Min',\n\t'Cool',\n\t'Heine',\n\t'Nissen',\n\t'Buenrostro',\n\t'Mcmullin',\n\t'Oropeza',\n\t'Hom',\n\t'Degroot',\n\t'Wescott',\n\t'Hulbert',\n\t'Shrum',\n\t'Muncy',\n\t'Littrell',\n\t'Forest',\n\t'Dyke',\n\t'Garces',\n\t'Cimino',\n\t'Gebhardt',\n\t'Hickerson',\n\t'Satterwhite',\n\t'Radke',\n\t'Luckey',\n\t'Coronel',\n\t'Pugliese',\n\t'Frazee',\n\t'Siddiqui',\n\t'Flatt',\n\t'Abbey',\n\t'Gerald',\n\t'Bodine',\n\t'Lora',\n\t'Youngs',\n\t'Catlett',\n\t'Alexis',\n\t'Luo',\n\t'Youmans',\n\t'Sherlock',\n\t'Kinser',\n\t'Wales',\n\t'Dinsmore',\n\t'Abramson',\n\t'Stricker',\n\t'Rumsey',\n\t'Showers',\n\t'Mickens',\n\t'Tallent',\n\t'Setzer',\n\t'Etter',\n\t'Allgood',\n\t'Pagel',\n\t'Jefferies',\n\t'Bissell',\n\t'Colombo',\n\t'Musgrave',\n\t'Kuehl',\n\t'Raab',\n\t'Kavanagh',\n\t'Beane',\n\t'Witcher',\n\t'Pattison',\n\t'Paulus',\n\t'Gong',\n\t'Mcgough',\n\t'Burkhalter',\n\t'Vanbuskirk',\n\t'Kite',\n\t'Sass',\n\t'Lalonde',\n\t'Gormley',\n\t'Baier',\n\t'Brauer',\n\t'Stricklin',\n\t'Napoli',\n\t'Brotherton',\n\t'Stansbury',\n\t'Loggins',\n\t'Sorrentino',\n\t'Poff',\n\t'Nieman',\n\t'Roebuck',\n\t'Reiner',\n\t'Hovey',\n\t'Walley',\n\t'Leech',\n\t'Gambino',\n\t'Hammack',\n\t'Burson',\n\t'Tatro',\n\t'Perrine',\n\t'Carley',\n\t'Stadler',\n\t'Nason',\n\t'Peckham',\n\t'Gervais',\n\t'Ables',\n\t'Turman',\n\t'Dore',\n\t'Peavy',\n\t'Addington',\n\t'Tobar',\n\t'Gilstrap',\n\t'Brumbaugh',\n\t'Gerhardt',\n\t'Slusher',\n\t'Nevins',\n\t'Garofalo',\n\t'Amick',\n\t'Barrick',\n\t'Race',\n\t'Daggett',\n\t'Manion',\n\t'Noah',\n\t'Kranz',\n\t'Runge',\n\t'Wysocki',\n\t'Gillum',\n\t'Verduzco',\n\t'Alvey',\n\t'Pettus',\n\t'Sim',\n\t'Cage',\n\t'Mckean',\n\t'Harrod',\n\t'Weatherspoon',\n\t'Takahashi',\n\t'Wingard',\n\t'Endres',\n\t'Skiles',\n\t'Wald',\n\t'Finger',\n\t'Reams',\n\t'Ussery',\n\t'Fricke',\n\t'Jaworski',\n\t'Cusick',\n\t'Stanek',\n\t'Shaner',\n\t'Massaro',\n\t'Ribeiro',\n\t'Eades',\n\t'Rue',\n\t'Scharf',\n\t'Standridge',\n\t'Wojciechowski',\n\t'Victoria',\n\t'Galbreath',\n\t'Lander',\n\t'Martinelli',\n\t'Raper',\n\t'Karas',\n\t'Tomas',\n\t'La',\n\t'Kizer',\n\t'Gastelum',\n\t'Delp',\n\t'Sansone',\n\t'Therrien',\n\t'Brookins',\n\t'Shi',\n\t'Hammel',\n\t'Polley',\n\t'Riddell',\n\t'Claiborne',\n\t'Lampe',\n\t'Benham',\n\t'Braddock',\n\t'Elwood',\n\t'Mcminn',\n\t'Amerson',\n\t'Leija',\n\t'Gambrell',\n\t'Nuno',\n\t'Mallon',\n\t'Gard',\n\t'Burford',\n\t'Halley',\n\t'Maley',\n\t'Eicher',\n\t'Caban',\n\t'Rubenstein',\n\t'Tighe',\n\t'Harbaugh',\n\t'Bergmann',\n\t'Runnels',\n\t'Carrizales',\n\t'Gustin',\n\t'Wight',\n\t'Dominick',\n\t'Cannady',\n\t'Brace',\n\t'Beauregard',\n\t'Weitzel',\n\t'Orcutt',\n\t'Abrahamson',\n\t'Jorge',\n\t'Mccown',\n\t'Harriman',\n\t'Nicol',\n\t'Gott',\n\t'Andino',\n\t'Tsosie',\n\t'Shumway',\n\t'Aucoin',\n\t'Bowes',\n\t'Hixon',\n\t'Broom',\n\t'Cate',\n\t'Desantiago',\n\t'Haug',\n\t'Pinedo',\n\t'Mowry',\n\t'Moyers',\n\t'Deangelo',\n\t'Mcshane',\n\t'Boley',\n\t'Tiffany',\n\t'Steger',\n\t'Woodford',\n\t'Whitford',\n\t'Collette',\n\t'Muth',\n\t'Mansour',\n\t'Schuh',\n\t'Fortney',\n\t'Khoury',\n\t'Livengood',\n\t'Haworth',\n\t'Rusk',\n\t'Mathieu',\n\t'Peppers',\n\t'Gehring',\n\t'Faris',\n\t'Diep',\n\t'Rae',\n\t'Hupp',\n\t'Escalera',\n\t'Gwin',\n\t'Engelhardt',\n\t'Bannon',\n\t'Menjivar',\n\t'Eberhart',\n\t'Kershaw',\n\t'Cottle',\n\t'Palomares',\n\t'Carrell',\n\t'Galaviz',\n\t'Willie',\n\t'Troxell',\n\t'Visser',\n\t'Xie',\n\t'Juan',\n\t'Spector',\n\t'Izzo',\n\t'Woodring',\n\t'Gilbreath',\n\t'Bey',\n\t'Giraldo',\n\t'Neary',\n\t'Ready',\n\t'Toland',\n\t'Benge',\n\t'Thrower',\n\t'Bemis',\n\t'Hostetter',\n\t'Dull',\n\t'Poulos',\n\t'Vanegas',\n\t'Abad',\n\t'Harker',\n\t'Mei',\n\t'Nigro',\n\t'Messner',\n\t'Peres',\n\t'Hardaway',\n\t'Crumpton',\n\t'Dingman',\n\t'Hipp',\n\t'Lemley',\n\t'Maloy',\n\t'Ye',\n\t'Neighbors',\n\t'Proulx',\n\t'Jamerson',\n\t'Finkelstein',\n\t'Payan',\n\t'Holler',\n\t'Simonds',\n\t'Toms',\n\t'Schulman',\n\t'Aguero',\n\t'Hinrichs',\n\t'Steffens',\n\t'Clapper',\n\t'Delao',\n\t'Knighton',\n\t'Jahn',\n\t'Mach',\n\t'Heal',\n\t'Detwiler',\n\t'Corso',\n\t'Toner',\n\t'Rook',\n\t'Brockway',\n\t'Coulson',\n\t'Delia',\n\t'Giddings',\n\t'Hermosillo',\n\t'Ballenger',\n\t'Persinger',\n\t'Delk',\n\t'Pedigo',\n\t'Burg',\n\t'Voelker',\n\t'Ecker',\n\t'Kile',\n\t'Propst',\n\t'Rascon',\n\t'Stultz',\n\t'Swindle',\n\t'Swindell',\n\t'Deaver',\n\t'Welty',\n\t'Sussman',\n\t'Southworth',\n\t'Child',\n\t'Coston',\n\t'Lei',\n\t'Spillman',\n\t'Hochstetler',\n\t'Veach',\n\t'Melcher',\n\t'Chipman',\n\t'Lebeau',\n\t'Summerville',\n\t'Peden',\n\t'Lizarraga',\n\t'Kingery',\n\t'Leos',\n\t'Fogel',\n\t'Eckman',\n\t'Burbank',\n\t'Castano',\n\t'Chartier',\n\t'Medellin',\n\t'Torrey',\n\t'Peake',\n\t'Swinney',\n\t'Aziz',\n\t'Reinert',\n\t'Borg',\n\t'Pires',\n\t'Brooke',\n\t'Forester',\n\t'Greaves',\n\t'Delapaz',\n\t'Hunnicutt',\n\t'Bierman',\n\t'Stringfellow',\n\t'Lavallee',\n\t'Farnham',\n\t'Gadson',\n\t'Gainer',\n\t'Kulp',\n\t'Liston',\n\t'Brooker',\n\t'Loudermilk',\n\t'Reza',\n\t'Henshaw',\n\t'Hinz',\n\t'Brammer',\n\t'Frisch',\n\t'Toombs',\n\t'Esquibel',\n\t'Feinberg',\n\t'Plaza',\n\t'Bly',\n\t'Encarnacion',\n\t'Cockerham',\n\t'Shealy',\n\t'Haile',\n\t'Nave',\n\t'Chenoweth',\n\t'Goto',\n\t'Ernest',\n\t'Staub',\n\t'Marty',\n\t'Huizar',\n\t'Lammers',\n\t'Mcavoy',\n\t'Dishman',\n\t'Giroux',\n\t'Dowdell',\n\t'Via',\n\t'Fenn',\n\t'Kain',\n\t'Breckenridge',\n\t'Egbert',\n\t'Steelman',\n\t'Gasper',\n\t'Riojas',\n\t'Parmer',\n\t'Creed',\n\t'Gillispie',\n\t'Edgerton',\n\t'Yen',\n\t'Calder',\n\t'Holmberg',\n\t'Kreider',\n\t'Landau',\n\t'Eley',\n\t'Lewallen',\n\t'Quimby',\n\t'Holladay',\n\t'Du',\n\t'Leland',\n\t'Hyder',\n\t'Omeara',\n\t'Acton',\n\t'Gaspard',\n\t'Kennard',\n\t'Renfroe',\n\t'Hayman',\n\t'Gladney',\n\t'Glidden',\n\t'Wilmot',\n\t'Pearsall',\n\t'Cahoon',\n\t'Hallock',\n\t'Grigg',\n\t'Boggess',\n\t'Lewin',\n\t'Doering',\n\t'Thach',\n\t'Mcatee',\n\t'Paulk',\n\t'Rusch',\n\t'Harrold',\n\t'Suttles',\n\t'Chiles',\n\t'Sawyers',\n\t'Roger',\n\t'Kwok',\n\t'Luevano',\n\t'Coelho',\n\t'Waldo',\n\t'Ewell',\n\t'Lagunas',\n\t'Rude',\n\t'Barrington',\n\t'Mccomas',\n\t'Whiteley',\n\t'Jeanbaptiste',\n\t'Darcy',\n\t'Lussier',\n\t'Kerley',\n\t'Fordham',\n\t'Moorehead',\n\t'Welton',\n\t'Nicely',\n\t'Constantino',\n\t'Townes',\n\t'Giglio',\n\t'Damian',\n\t'Mckibben',\n\t'Resnick',\n\t'Endicott',\n\t'Lindeman',\n\t'Killion',\n\t'Gwinn',\n\t'Beaumont',\n\t'Nord',\n\t'Miceli',\n\t'Fast',\n\t'Bidwell',\n\t'Sites',\n\t'Drum',\n\t'Maze',\n\t'Abshire',\n\t'Berner',\n\t'Rhyne',\n\t'Juliano',\n\t'Wortman',\n\t'Beggs',\n\t'Winchell',\n\t'Summerlin',\n\t'Thrash',\n\t'Biggers',\n\t'Buckles',\n\t'Barnwell',\n\t'Thomasson',\n\t'Wan',\n\t'Arneson',\n\t'Rodrigue',\n\t'Wroblewski',\n\t'Quiroga',\n\t'Fulk',\n\t'Dillingham',\n\t'Rone',\n\t'Mapp',\n\t'Sattler',\n\t'Letourneau',\n\t'Gaudet',\n\t'Mccaslin',\n\t'Gurule',\n\t'Huck',\n\t'Hudspeth',\n\t'Welter',\n\t'Wittman',\n\t'Hileman',\n\t'Ewald',\n\t'Yao',\n\t'Kindred',\n\t'Kato',\n\t'Nickels',\n\t'Tyndall',\n\t'Sanmiguel',\n\t'Mayle',\n\t'Alfano',\n\t'Eichelberger',\n\t'Bee',\n\t'Sheehy',\n\t'Rogan',\n\t'Philip',\n\t'Dilworth',\n\t'Midkiff',\n\t'Hudgens',\n\t'Killingsworth',\n\t'Russel',\n\t'Criss',\n\t'Liddell',\n\t'Eberly',\n\t'Khalil',\n\t'Lattimore',\n\t'Koval',\n\t'Maxson',\n\t'Schram',\n\t'Goodell',\n\t'Catlin',\n\t'Cofer',\n\t'Alva',\n\t'Sandler',\n\t'Kunkle',\n\t'Perron',\n\t'Bushman',\n\t'Edmonson',\n\t'Roa',\n\t'Nesbit',\n\t'Ahearn',\n\t'Garver',\n\t'Bible',\n\t'Barley',\n\t'Struble',\n\t'Oxford',\n\t'Wulf',\n\t'Marron',\n\t'Haught',\n\t'Bonnell',\n\t'Pigg',\n\t'Friel',\n\t'Almaguer',\n\t'Bowler',\n\t'Mitchem',\n\t'Fussell',\n\t'Lemos',\n\t'Savino',\n\t'Boisvert',\n\t'Torgerson',\n\t'Annis',\n\t'Dicks',\n\t'Ruhl',\n\t'Pepin',\n\t'Wildman',\n\t'Gendron',\n\t'Melanson',\n\t'Sherer',\n\t'Duty',\n\t'Cassel',\n\t'Croteau',\n\t'Rolon',\n\t'Staats',\n\t'Pass',\n\t'Larocca',\n\t'Sauter',\n\t'Sacks',\n\t'Boutwell',\n\t'Hunsaker',\n\t'Omara',\n\t'Mcbroom',\n\t'Lohman',\n\t'Treat',\n\t'Dufour',\n\t'Brashear',\n\t'Yepez',\n\t'Lao',\n\t'Telles',\n\t'Manis',\n\t'Mars',\n\t'Shilling',\n\t'Tingle',\n\t'Macaluso',\n\t'Rigney',\n\t'Clair',\n\t'Matsumoto',\n\t'Agosto',\n\t'Halbert',\n\t'Dabbs',\n\t'Eckstein',\n\t'Mercurio',\n\t'Berkley',\n\t'Wachter',\n\t'Langan',\n\t'Peach',\n\t'Carreno',\n\t'Lepore',\n\t'Howie',\n\t'Thaxton',\n\t'Arrowood',\n\t'Weinberger',\n\t'Eldred',\n\t'Hooten',\n\t'Raymer',\n\t'Feaster',\n\t'Bosco',\n\t'Cataldo',\n\t'Fears',\n\t'Eckhardt',\n\t'Mullinax',\n\t'Spratt',\n\t'Laboy',\n\t'Marsden',\n\t'Carlile',\n\t'Bustillos',\n\t'Crim',\n\t'Surratt',\n\t'Kurth',\n\t'Gaul',\n\t'Machuca',\n\t'Rolfe',\n\t'Lower',\n\t'Edmiston',\n\t'Millsap',\n\t'Dehaven',\n\t'Racine',\n\t'Coney',\n\t'Rinker',\n\t'Maddux',\n\t'Burmeister',\n\t'Fenwick',\n\t'Stocks',\n\t'Forde',\n\t'Pettway',\n\t'Balderrama',\n\t'Westover',\n\t'Bloch',\n\t'Burress',\n\t'Hunley',\n\t'Futch',\n\t'Chee',\n\t'Alvarenga',\n\t'Bostwick',\n\t'Cleaver',\n\t'Pelkey',\n\t'Bryce',\n\t'Pisano',\n\t'Qureshi',\n\t'Varghese',\n\t'Cunha',\n\t'Hellman',\n\t'Grass',\n\t'Luker',\n\t'Hazelton',\n\t'Cathcart',\n\t'Yamada',\n\t'Gallego',\n\t'Menke',\n\t'Yingling',\n\t'Merriweather',\n\t'Fleury',\n\t'Salmeron',\n\t'Metcalfe',\n\t'Brook',\n\t'Freitag',\n\t'Malek',\n\t'Obregon',\n\t'Blain',\n\t'Mellott',\n\t'Alam',\n\t'Bessette',\n\t'Moncrief',\n\t'Arvizu',\n\t'Botts',\n\t'Moorer',\n\t'Landreth',\n\t'Hulett',\n\t'Marinelli',\n\t'Falco',\n\t'Silvestri',\n\t'Gottschalk',\n\t'Thiele',\n\t'Kight',\n\t'Warrington',\n\t'Huckaby',\n\t'Ledet',\n\t'Charbonneau',\n\t'Crozier',\n\t'Mohan',\n\t'Stroh',\n\t'Bolinger',\n\t'Delvecchio',\n\t'Macfarlane',\n\t'Cribbs',\n\t'Mcloughlin',\n\t'Maynor',\n\t'Ming',\n\t'Digiovanni',\n\t'Truesdale',\n\t'Pfeffer',\n\t'Benn',\n\t'Chaparro',\n\t'Englert',\n\t'Spano',\n\t'Ogletree',\n\t'Yancy',\n\t'Swick',\n\t'Hallmark',\n\t'Mattern',\n\t'Tryon',\n\t'Plumb',\n\t'Martineau',\n\t'Man',\n\t'Grube',\n\t'Holst',\n\t'Nez',\n\t'Belden',\n\t'Aikens',\n\t'Litton',\n\t'Moorhead',\n\t'Dufresne',\n\t'Bonney',\n\t'Heyward',\n\t'Halliday',\n\t'Ito',\n\t'Crossman',\n\t'Gast',\n\t'Levan',\n\t'Wine',\n\t'Desouza',\n\t'Kornegay',\n\t'Nam',\n\t'Keough',\n\t'Stotts',\n\t'Dickenson',\n\t'Ousley',\n\t'Leduc',\n\t'Revels',\n\t'Dizon',\n\t'Arreguin',\n\t'Shockey',\n\t'Alegria',\n\t'Blades',\n\t'Ignacio',\n\t'Mellon',\n\t'Ebersole',\n\t'Sain',\n\t'Weissman',\n\t'Wargo',\n\t'Claypool',\n\t'Zorn',\n\t'Julien',\n\t'Hinshaw',\n\t'Alberto',\n\t'Garduno',\n\t'Kellar',\n\t'Rizo',\n\t'Labonte',\n\t'Humble',\n\t'Downer',\n\t'Lykins',\n\t'Tower',\n\t'Vanhouten',\n\t'Chairez',\n\t'Campa',\n\t'Blizzard',\n\t'Standley',\n\t'Reiser',\n\t'Whitener',\n\t'Menefee',\n\t'Nalley',\n\t'Lasher',\n\t'Strang',\n\t'Smock',\n\t'Moralez',\n\t'Kiel',\n\t'Moffatt',\n\t'Behm',\n\t'Hackworth',\n\t'Dirks',\n\t'Kratz',\n\t'Guillot',\n\t'Tittle',\n\t'Stlouis',\n\t'Seymore',\n\t'Searle',\n\t'Utter',\n\t'Wilborn',\n\t'Dortch',\n\t'Duron',\n\t'Cardinal',\n\t'Spikes',\n\t'Arambula',\n\t'Cutter',\n\t'Dibenedetto',\n\t'Botelho',\n\t'Bedwell',\n\t'Kilby',\n\t'Bottoms',\n\t'Cassady',\n\t'Rothwell',\n\t'Bilodeau',\n\t'Markowitz',\n\t'Baucom',\n\t'Valley',\n\t'Esqueda',\n\t'Depalma',\n\t'Laskowski',\n\t'Hopp',\n\t'Casale',\n\t'Perreault',\n\t'Shuster',\n\t'Wolter',\n\t'Raby',\n\t'Cyrus',\n\t'Tseng',\n\t'Georges',\n\t'Das',\n\t'Wilfong',\n\t'Schlueter',\n\t'Woolf',\n\t'Stickney',\n\t'Mcinerney',\n\t'Curcio',\n\t'Fowlkes',\n\t'Boldt',\n\t'Zander',\n\t'Shropshire',\n\t'Antonelli',\n\t'Froehlich',\n\t'Butterworth',\n\t'Stedman',\n\t'Broadnax',\n\t'Kroeger',\n\t'Kellner',\n\t'Monreal',\n\t'Armas',\n\t'Mcguinness',\n\t'Canterbury',\n\t'Weisman',\n\t'Hilburn',\n\t'Carruthers',\n\t'Pell',\n\t'Peele',\n\t'Devaney',\n\t'Owings',\n\t'Mar',\n\t'Liggett',\n\t'Breslin',\n\t'Soucy',\n\t'Aguila',\n\t'Weidman',\n\t'Mingo',\n\t'Tarango',\n\t'Winger',\n\t'Poteet',\n\t'Acree',\n\t'Mcnew',\n\t'Leatherwood',\n\t'Aubrey',\n\t'Waring',\n\t'Soler',\n\t'Roof',\n\t'Sunderland',\n\t'Blackford',\n\t'Rabe',\n\t'Hepler',\n\t'Leonardo',\n\t'Spina',\n\t'Smythe',\n\t'Alex',\n\t'Barta',\n\t'Bybee',\n\t'Campagna',\n\t'Pete',\n\t'Batchelder',\n\t'Gurney',\n\t'Wyche',\n\t'Schutt',\n\t'Rashid',\n\t'Almazan',\n\t'Pahl',\n\t'Perri',\n\t'Viramontes',\n\t'Cavender',\n\t'Snapp',\n\t'Newson',\n\t'Sandhu',\n\t'Fernando',\n\t'Stockdale',\n\t'Garfield',\n\t'Ealy',\n\t'Mcfarlin',\n\t'Bieber',\n\t'Callan',\n\t'Arruda',\n\t'Oquendo',\n\t'Levasseur',\n\t'Maple',\n\t'Kowal',\n\t'Kushner',\n\t'Naquin',\n\t'Shouse',\n\t'Mcquade',\n\t'Cai',\n\t'Smedley',\n\t'Gober',\n\t'Saiz',\n\t'Brunelle',\n\t'Arbuckle',\n\t'Landes',\n\t'Mak',\n\t'Korte',\n\t'Oxley',\n\t'Boger',\n\t'Mickey',\n\t'Lent',\n\t'Cureton',\n\t'Husted',\n\t'Eidson',\n\t'Boyett',\n\t'Kitts',\n\t'Shope',\n\t'Hance',\n\t'Jessen',\n\t'Litchfield',\n\t'Torre',\n\t'Cargill',\n\t'Herren',\n\t'Straight',\n\t'Merz',\n\t'Weese',\n\t'Sperling',\n\t'Lapierre',\n\t'Yung',\n\t'Doggett',\n\t'Cauley',\n\t'Hardeman',\n\t'Margolis',\n\t'Watford',\n\t'Seltzer',\n\t'Fullmer',\n\t'Timberlake',\n\t'Butz',\n\t'Duquette',\n\t'Olin',\n\t'Leverett',\n\t'Hartford',\n\t'Otte',\n\t'Beaton',\n\t'Grimaldi',\n\t'Marotta',\n\t'Carlsen',\n\t'Cullum',\n\t'Monte',\n\t'Haygood',\n\t'Middlebrooks',\n\t'Lazarus',\n\t'Shiver',\n\t'Ivie',\n\t'Niemi',\n\t'Lacombe',\n\t'Judson',\n\t'Ginsberg',\n\t'Firestone',\n\t'Izquierdo',\n\t'Deel',\n\t'Jacinto',\n\t'Towers',\n\t'Fritsch',\n\t'Albin',\n\t'Kaminsky',\n\t'Yin',\n\t'Wrobel',\n\t'Birdwell',\n\t'Krieg',\n\t'Danforth',\n\t'Florio',\n\t'Saito',\n\t'Clift',\n\t'Duck',\n\t'Matt',\n\t'Moxley',\n\t'Barbieri',\n\t'Klatt',\n\t'Saltzman',\n\t'Chesney',\n\t'Bojorquez',\n\t'Cosentino',\n\t'Lodge',\n\t'Converse',\n\t'Decastro',\n\t'Gerhart',\n\t'Music',\n\t'Danley',\n\t'Santangelo',\n\t'Bevins',\n\t'Coen',\n\t'Seibel',\n\t'Lindemann',\n\t'Dressler',\n\t'Newport',\n\t'Bedolla',\n\t'Lillie',\n\t'Rhone',\n\t'Penaloza',\n\t'Swart',\n\t'Niemeyer',\n\t'Pilkington',\n\t'Matta',\n\t'Hollifield',\n\t'Gillman',\n\t'Montana',\n\t'Maroney',\n\t'Stenger',\n\t'Loos',\n\t'Wert',\n\t'Brogdon',\n\t'Gandhi',\n\t'Bent',\n\t'Tabb',\n\t'Sikorski',\n\t'Hagedorn',\n\t'Hannigan',\n\t'Hoss',\n\t'Conlin',\n\t'Trott',\n\t'Fall',\n\t'Granado',\n\t'Bartell',\n\t'Rubalcava',\n\t'Neves',\n\t'Poynter',\n\t'Alton',\n\t'Paschall',\n\t'Waltman',\n\t'Parke',\n\t'Kittle',\n\t'Czarnecki',\n\t'Bloodworth',\n\t'Knorr',\n\t'Timms',\n\t'Derry',\n\t'Messier',\n\t'Saad',\n\t'Cozart',\n\t'Sutphin',\n\t'Puryear',\n\t'Gatto',\n\t'Whitacre',\n\t'Verdin',\n\t'Bloomer',\n\t'Brundage',\n\t'Brian',\n\t'Seger',\n\t'Clare',\n\t'Balch',\n\t'Tharpe',\n\t'Rayford',\n\t'Halter',\n\t'Barefoot',\n\t'Gonsalez',\n\t'Lomas',\n\t'Monzon',\n\t'Howarth',\n\t'Mccready',\n\t'Gudino',\n\t'Serafin',\n\t'Sanfilippo',\n\t'Minnich',\n\t'Eldredge',\n\t'Malave',\n\t'Greeley',\n\t'Sisneros',\n\t'Kangas',\n\t'Peery',\n\t'Lunn',\n\t'Lukas',\n\t'Bunce',\n\t'Riccio',\n\t'Thies',\n\t'Stivers',\n\t'Conard',\n\t'Mullaney',\n\t'Catalan',\n\t'Omar',\n\t'Theobald',\n\t'Jeffcoat',\n\t'Kucera',\n\t'Borkowski',\n\t'Coomer',\n\t'Mathison',\n\t'Croom',\n\t'Rushton',\n\t'Stites',\n\t'Pendley',\n\t'Till',\n\t'Oconner',\n\t'Forsberg',\n\t'Wages',\n\t'Fillmore',\n\t'Barcenas',\n\t'Gillard',\n\t'Leak',\n\t'Towle',\n\t'Esser',\n\t'Dunlop',\n\t'Quackenbush',\n\t'Archambault',\n\t'Buller',\n\t'Newlin',\n\t'Urquhart',\n\t'Shanley',\n\t'Mote',\n\t'Ippolito',\n\t'Rozier',\n\t'Reidy',\n\t'Gregor',\n\t'Swaney',\n\t'Bradfield',\n\t'Fudge',\n\t'More',\n\t'Tester',\n\t'Higley',\n\t'Dambrosio',\n\t'Bullington',\n\t'Highsmith',\n\t'Silas',\n\t'Felker',\n\t'Sawicki',\n\t'Beltz',\n\t'Albarran',\n\t'Aitken',\n\t'Findlay',\n\t'Looper',\n\t'Tooley',\n\t'Lasley',\n\t'Moynihan',\n\t'Ratcliffe',\n\t'Grizzle',\n\t'Souders',\n\t'Nussbaum',\n\t'Suber',\n\t'Macdougall',\n\t'Waddle',\n\t'Brawner',\n\t'Tucci',\n\t'Cosme',\n\t'Walk',\n\t'Gordy',\n\t'Tarrant',\n\t'Rosenblum',\n\t'Huth',\n\t'Bridgeman',\n\t'Hinkley',\n\t'Gehrke',\n\t'Boden',\n\t'Suazo',\n\t'Gambill',\n\t'Widner',\n\t'Chick',\n\t'Mccollough',\n\t'Hassler',\n\t'Odum',\n\t'Pawlak',\n\t'Prevost',\n\t'Slavin',\n\t'Fetters',\n\t'Beamon',\n\t'Renshaw',\n\t'Deng',\n\t'Plourde',\n\t'Holstein',\n\t'Rye',\n\t'Holliman',\n\t'Melville',\n\t'Messinger',\n\t'Turcios',\n\t'Garnica',\n\t'Feeley',\n\t'Mariani',\n\t'Otten',\n\t'Dorado',\n\t'Mortenson',\n\t'Meissner',\n\t'Scarlett',\n\t'Sweitzer',\n\t'Glisson',\n\t'Desjardins',\n\t'Penland',\n\t'Elledge',\n\t'Crumley',\n\t'Deen',\n\t'Shih',\n\t'Heuer',\n\t'Gloria',\n\t'Lail',\n\t'Mcandrew',\n\t'Mcnaughton',\n\t'Cortese',\n\t'Stgermain',\n\t'Hammon',\n\t'Leininger',\n\t'Flickinger',\n\t'Dement',\n\t'Bumgardner',\n\t'Tessier',\n\t'Fulford',\n\t'Cervantez',\n\t'Wisner',\n\t'Shulman',\n\t'Sabol',\n\t'Papp',\n\t'Strasser',\n\t'Sartin',\n\t'Rothstein',\n\t'Grote',\n\t'Beaudry',\n\t'Deville',\n\t'Roop',\n\t'Villar',\n\t'Bussell',\n\t'Bowyer',\n\t'Yoshida',\n\t'Hertz',\n\t'Countryman',\n\t'Hoey',\n\t'Roseberry',\n\t'Schock',\n\t'Boozer',\n\t'Mccowan',\n\t'Kirschner',\n\t'Lechner',\n\t'Winkelman',\n\t'Witham',\n\t'Thurber',\n\t'Depriest',\n\t'Chenault',\n\t'Moten',\n\t'Tillotson',\n\t'Guan',\n\t'Ketcham',\n\t'Jiles',\n\t'Grosso',\n\t'Nottingham',\n\t'Kellam',\n\t'Alejo',\n\t'Thoma',\n\t'Marchetti',\n\t'Holifield',\n\t'Fortson',\n\t'Leasure',\n\t'Mceachern',\n\t'Oceguera',\n\t'Carleton',\n\t'Weekley',\n\t'Kinsella',\n\t'Harvell',\n\t'Waldon',\n\t'Kean',\n\t'Chancellor',\n\t'Blosser',\n\t'Detweiler',\n\t'Presnell',\n\t'Beachy',\n\t'Lingle',\n\t'Plumley',\n\t'Knopp',\n\t'Gamache',\n\t'Atwater',\n\t'Caine',\n\t'Woodland',\n\t'Terwilliger',\n\t'Moller',\n\t'Cleland',\n\t'Cottingham',\n\t'Janke',\n\t'Willman',\n\t'Dann',\n\t'Mangrum',\n\t'Shuck',\n\t'Paden',\n\t'Adelman',\n\t'Brim',\n\t'Tullis',\n\t'Hertel',\n\t'Gallaher',\n\t'Leopold',\n\t'Donegan',\n\t'Popovich',\n\t'Gusman',\n\t'Chatham',\n\t'Schooley',\n\t'Pinder',\n\t'Heise',\n\t'Maines',\n\t'Nystrom',\n\t'Jahnke',\n\t'Poon',\n\t'Murphree',\n\t'Pelaez',\n\t'Risley',\n\t'Sohn',\n\t'Shim',\n\t'Armentrout',\n\t'Kastner',\n\t'Philpott',\n\t'Mao',\n\t'Pursley',\n\t'Mangold',\n\t'Mccourt',\n\t'Hollar',\n\t'Desmarais',\n\t'Debord',\n\t'Gullett',\n\t'Gaeta',\n\t'Bae',\n\t'Houlihan',\n\t'Gorton',\n\t'Steinman',\n\t'Santo',\n\t'Snelling',\n\t'Corpuz',\n\t'Look',\n\t'Scudder',\n\t'Treece',\n\t'Binns',\n\t'Sokolowski',\n\t'Harner',\n\t'Gallup',\n\t'Marti',\n\t'Teasley',\n\t'Markel',\n\t'Casiano',\n\t'Nicks',\n\t'Recinos',\n\t'Paradise',\n\t'Colman',\n\t'Orange',\n\t'Mele',\n\t'Medford',\n\t'Templin',\n\t'Zuber',\n\t'Mackin',\n\t'Brodsky',\n\t'Householder',\n\t'Wirtz',\n\t'Hackman',\n\t'Tippett',\n\t'Polson',\n\t'Colston',\n\t'Cerna',\n\t'Herald',\n\t'Shults',\n\t'Shubert',\n\t'Mertens',\n\t'Dave',\n\t'Duffield',\n\t'Vanness',\n\t'Mayne',\n\t'Driskell',\n\t'Percy',\n\t'Lauderdale',\n\t'Cipriano',\n\t'Theodore',\n\t'Colella',\n\t'Kiger',\n\t'Brownfield',\n\t'Stella',\n\t'Wideman',\n\t'Maye',\n\t'Chisolm',\n\t'Muldoon',\n\t'Fitzwater',\n\t'Harville',\n\t'Dixson',\n\t'Burkey',\n\t'Hartsfield',\n\t'Schade',\n\t'Brawley',\n\t'Pelfrey',\n\t'Tennyson',\n\t'Whitted',\n\t'Silvas',\n\t'Harbour',\n\t'Krupa',\n\t'Peraza',\n\t'Erdmann',\n\t'Halpern',\n\t'Finnerty',\n\t'Mackinnon',\n\t'Humbert',\n\t'Mccarley',\n\t'Doster',\n\t'Kugler',\n\t'Livesay',\n\t'Force',\n\t'Haberman',\n\t'Lamp',\n\t'Hector',\n\t'Charron',\n\t'Woosley',\n\t'Rein',\n\t'Ashburn',\n\t'Greenleaf',\n\t'Niemann',\n\t'Carillo',\n\t'Skelly',\n\t'Nunnally',\n\t'Renfrow',\n\t'Prickett',\n\t'Angus',\n\t'Bednar',\n\t'Nightingale',\n\t'Steinbach',\n\t'Warnick',\n\t'Jason',\n\t'Hans',\n\t'Lydon',\n\t'Rutland',\n\t'Alleman',\n\t'Hawn',\n\t'Malin',\n\t'Beech',\n\t'Auger',\n\t'Desilva',\n\t'Izaguirre',\n\t'Isham',\n\t'Mandujano',\n\t'Glasser',\n\t'Dimarco',\n\t'Berumen',\n\t'Nipper',\n\t'Pegram',\n\t'Sundberg',\n\t'Labbe',\n\t'Mcphee',\n\t'Crafton',\n\t'Agustin',\n\t'Cantor',\n\t'Beller',\n\t'Bang',\n\t'Lawyer',\n\t'Croy',\n\t'Kyles',\n\t'Winans',\n\t'Battista',\n\t'Jost',\n\t'Bakken',\n\t'Dandridge',\n\t'Mustafa',\n\t'Ice',\n\t'Eklund',\n\t'Montesdeoca',\n\t'Hermes',\n\t'Grimaldo',\n\t'Vannoy',\n\t'Grainger',\n\t'Lamas',\n\t'Tarantino',\n\t'Witter',\n\t'Worthen',\n\t'Basinger',\n\t'Cowden',\n\t'Hiles',\n\t'Mcanally',\n\t'Felipe',\n\t'Gallimore',\n\t'Kapp',\n\t'Makowski',\n\t'Copenhaver',\n\t'Ramer',\n\t'Gideon',\n\t'Bowker',\n\t'Wilkens',\n\t'Seeger',\n\t'Huntsman',\n\t'Palladino',\n\t'Jessee',\n\t'Kittrell',\n\t'Rolle',\n\t'Ciccone',\n\t'Kolar',\n\t'Brannen',\n\t'Bixby',\n\t'Pohlman',\n\t'Strachan',\n\t'Lesher',\n\t'Fleischer',\n\t'Umana',\n\t'Murphey',\n\t'Mcentire',\n\t'Rabon',\n\t'Mcauley',\n\t'Bunton',\n\t'Soileau',\n\t'Sheriff',\n\t'Borowski',\n\t'Mullens',\n\t'Larrabee',\n\t'Prouty',\n\t'Malley',\n\t'Sumrall',\n\t'Reisinger',\n\t'Surber',\n\t'Kasten',\n\t'Shoemake',\n\t'Yowell',\n\t'Bonin',\n\t'Bevan',\n\t'Bove',\n\t'Boe',\n\t'Hazard',\n\t'Slay',\n\t'Carraway',\n\t'Kaczmarek',\n\t'Armitage',\n\t'Lowther',\n\t'Sheaffer',\n\t'Farah',\n\t'Atencio',\n\t'Ung',\n\t'Kirkham',\n\t'Cavanagh',\n\t'Mccutchen',\n\t'Shoop',\n\t'Nickles',\n\t'Borchardt',\n\t'Durkee',\n\t'Maus',\n\t'Shedd',\n\t'Petrillo',\n\t'Brainard',\n\t'Eddings',\n\t'Fanelli',\n\t'Seo',\n\t'Heaney',\n\t'Drennan',\n\t'Mcgarvey',\n\t'Saddler',\n\t'Lucia',\n\t'Higa',\n\t'Gailey',\n\t'Groh',\n\t'Hinckley',\n\t'Griner',\n\t'Norfleet',\n\t'Caplan',\n\t'Rademacher',\n\t'Souder',\n\t'Autrey',\n\t'Eskridge',\n\t'Drumm',\n\t'Fiske',\n\t'Giffin',\n\t'Townley',\n\t'Derose',\n\t'Burrus',\n\t'Castrejon',\n\t'Emmert',\n\t'Cothran',\n\t'Hartsell',\n\t'Kilburn',\n\t'Riggle',\n\t'Trussell',\n\t'Mulvey',\n\t'Barto',\n\t'Crank',\n\t'Lovely',\n\t'Woodhouse',\n\t'Powe',\n\t'Pablo',\n\t'Zack',\n\t'Murchison',\n\t'Dicarlo',\n\t'Kessel',\n\t'Hagood',\n\t'Rost',\n\t'Edson',\n\t'Blakeney',\n\t'Fant',\n\t'Brodeur',\n\t'Jump',\n\t'Spry',\n\t'Laguna',\n\t'Lotz',\n\t'Bergquist',\n\t'Collard',\n\t'Mash',\n\t'Rideout',\n\t'Bilbrey',\n\t'Selman',\n\t'Fortunato',\n\t'Holzer',\n\t'Pifer',\n\t'Mcabee',\n\t'Talamantes',\n\t'Tollefson',\n\t'Pastore',\n\t'Crew',\n\t'Wilcher',\n\t'Kutz',\n\t'Stallard',\n\t'Ressler',\n\t'Fehr',\n\t'Piercy',\n\t'Lafond',\n\t'Digiacomo',\n\t'Schuck',\n\t'Winkle',\n\t'Graybill',\n\t'Plata',\n\t'Gribble',\n\t'Odle',\n\t'Fraga',\n\t'Bressler',\n\t'Moultrie',\n\t'Tung',\n\t'Charette',\n\t'Marvel',\n\t'Kerby',\n\t'Mori',\n\t'Hamman',\n\t'Favors',\n\t'Freeze',\n\t'Delisle',\n\t'Straw',\n\t'Dingle',\n\t'Elizalde',\n\t'Cabello',\n\t'Zalewski',\n\t'Funkhouser',\n\t'Abate',\n\t'Nero',\n\t'Holston',\n\t'Josey',\n\t'Schreck',\n\t'Shroyer',\n\t'Paquin',\n\t'Bing',\n\t'Chauvin',\n\t'Maria',\n\t'Melgoza',\n\t'Arms',\n\t'Caddell',\n\t'Pitchford',\n\t'Sternberg',\n\t'Rana',\n\t'Lovelady',\n\t'Strouse',\n\t'Macarthur',\n\t'Lechuga',\n\t'Wolfson',\n\t'Mcglynn',\n\t'Koo',\n\t'Stoops',\n\t'Tetreault',\n\t'Lepage',\n\t'Duren',\n\t'Hartz',\n\t'Kissel',\n\t'Gish',\n\t'Largent',\n\t'Henninger',\n\t'Janson',\n\t'Carrick',\n\t'Kenner',\n\t'Haack',\n\t'Diego',\n\t'Wacker',\n\t'Wardell',\n\t'Ballentine',\n\t'Smeltzer',\n\t'Bibb',\n\t'Winton',\n\t'Bibbs',\n\t'Reinhard',\n\t'Nilsen',\n\t'Edison',\n\t'Kalinowski',\n\t'June',\n\t'Hewlett',\n\t'Blaisdell',\n\t'Zeman',\n\t'Chon',\n\t'Board',\n\t'Nealy',\n\t'Moretti',\n\t'Wanner',\n\t'Bonnett',\n\t'Hardie',\n\t'Mains',\n\t'Cordeiro',\n\t'Karim',\n\t'Kautz',\n\t'Craver',\n\t'Colucci',\n\t'Congdon',\n\t'Mounts',\n\t'Kurz',\n\t'Eder',\n\t'Merryman',\n\t'Soles',\n\t'Dulin',\n\t'Lubin',\n\t'Mcgowen',\n\t'Hockenberry',\n\t'Work',\n\t'Mazzola',\n\t'Crandell',\n\t'Mcgrady',\n\t'Caruthers',\n\t'Govea',\n\t'Meng',\n\t'Fetter',\n\t'Trusty',\n\t'Weintraub',\n\t'Hurlburt',\n\t'Reiff',\n\t'Nowakowski',\n\t'Hoard',\n\t'Densmore',\n\t'Blumenthal',\n\t'Neale',\n\t'Schiff',\n\t'Raleigh',\n\t'Steiger',\n\t'Marmolejo',\n\t'Jessie',\n\t'Palafox',\n\t'Tutt',\n\t'Keister',\n\t'Core',\n\t'Im',\n\t'Wendell',\n\t'Bennet',\n\t'Canning',\n\t'Krull',\n\t'Patti',\n\t'Zucker',\n\t'Schlesinger',\n\t'Wiser',\n\t'Dunson',\n\t'Olmedo',\n\t'Hake',\n\t'Champlin',\n\t'Braley',\n\t'Wheelock',\n\t'Geier',\n\t'Janis',\n\t'Turek',\n\t'Grindstaff',\n\t'Schaffner',\n\t'Deas',\n\t'Sirois',\n\t'Polito',\n\t'Bergin',\n\t'Schall',\n\t'Vineyard',\n\t'Pellegrini',\n\t'Corrado',\n\t'Oleson',\n\t'List',\n\t'Dameron',\n\t'Parkin',\n\t'Flake',\n\t'Hollingshead',\n\t'Chancey',\n\t'Hufford',\n\t'Morell',\n\t'Kantor',\n\t'Chasteen',\n\t'Laborde',\n\t'Sessoms',\n\t'Hermanson',\n\t'Burnell',\n\t'Dewberry',\n\t'Tolman',\n\t'Glasscock',\n\t'Durfee',\n\t'Gilroy',\n\t'Wilkey',\n\t'Dungan',\n\t'Saravia',\n\t'Weigand',\n\t'Bigler',\n\t'Vancleave',\n\t'Burlingame',\n\t'Roseman',\n\t'Stiffler',\n\t'Gagliano',\n\t'Kates',\n\t'Awad',\n\t'Knepp',\n\t'Rondeau',\n\t'Bertsch',\n\t'Wolverton',\n\t'Walcott',\n\t'Poss',\n\t'Frisby',\n\t'Wexler',\n\t'Reinhold',\n\t'Krol',\n\t'Stuck',\n\t'Ricciardi',\n\t'Ardoin',\n\t'Michaelson',\n\t'Lillard',\n\t'Burciaga',\n\t'Birchfield',\n\t'Patch',\n\t'Silvey',\n\t'Simmonds',\n\t'Siu',\n\t'Press',\n\t'Deans',\n\t'Riegel',\n\t'Ismail',\n\t'Magallon',\n\t'Diller',\n\t'Hine',\n\t'Michalak',\n\t'Dones',\n\t'Deitz',\n\t'Gulledge',\n\t'Stroman',\n\t'Kobayashi',\n\t'Hafer',\n\t'Berk',\n\t'Landin',\n\t'Gilles',\n\t'Obryant',\n\t'Cheeks',\n\t'Gress',\n\t'Lutes',\n\t'Raphael',\n\t'Pizano',\n\t'Bachmann',\n\t'Cifuentes',\n\t'Earp',\n\t'Gilreath',\n\t'Peluso',\n\t'Hubbs',\n\t'Alvis',\n\t'Peer',\n\t'Dutra',\n\t'Stetson',\n\t'Constant',\n\t'Benford',\n\t'Sorto',\n\t'Cater',\n\t'Rosier',\n\t'Isenberg',\n\t'Shanklin',\n\t'Veloz',\n\t'Ramage',\n\t'Dunford',\n\t'Ku',\n\t'Hames',\n\t'Eddins',\n\t'Ruano',\n\t'Frink',\n\t'Flower',\n\t'Beadle',\n\t'Rochester',\n\t'Fontes',\n\t'Mefford',\n\t'Barwick',\n\t'Millen',\n\t'Stelly',\n\t'Cann',\n\t'Rayner',\n\t'Carruth',\n\t'Wendling',\n\t'Shutt',\n\t'Hazzard',\n\t'Maravilla',\n\t'Gregorio',\n\t'Pavlik',\n\t'Hudnall',\n\t'Aston',\n\t'Mcglothlin',\n\t'Weise',\n\t'Devereaux',\n\t'Belle',\n\t'Borst',\n\t'Burdett',\n\t'Frisbie',\n\t'Rummel',\n\t'Rentz',\n\t'Cobos',\n\t'Kimura',\n\t'Neu',\n\t'Winner',\n\t'Candelario',\n\t'Callis',\n\t'Basso',\n\t'Mckim',\n\t'Tai',\n\t'Eskew',\n\t'Lair',\n\t'Pye',\n\t'Knuth',\n\t'Scarberry',\n\t'Alter',\n\t'Mcgann',\n\t'Anson',\n\t'Drews',\n\t'Zuckerman',\n\t'Petrone',\n\t'Ludlow',\n\t'Bechtold',\n\t'Nair',\n\t'Rennie',\n\t'Rhine',\n\t'Fleetwood',\n\t'Sudduth',\n\t'Leftwich',\n\t'Hardiman',\n\t'Northrop',\n\t'Banker',\n\t'Killen',\n\t'Mastin',\n\t'Mcmurry',\n\t'Jasinski',\n\t'Taliaferro',\n\t'Mathers',\n\t'Sheikh',\n\t'Nuss',\n\t'Jesse',\n\t'Zabel',\n\t'Crotty',\n\t'Kamp',\n\t'Fleenor',\n\t'Halcomb',\n\t'Eady',\n\t'Vella',\n\t'Demars',\n\t'Ensley',\n\t'Delosreyes',\n\t'Zendejas',\n\t'Leeds',\n\t'Just',\n\t'Oday',\n\t'Dills',\n\t'Zeng',\n\t'Barriga',\n\t'Millican',\n\t'Cascio',\n\t'Eakin',\n\t'Argo',\n\t'Borland',\n\t'Cover',\n\t'Diorio',\n\t'Coria',\n\t'Lease',\n\t'Pinkham',\n\t'Reichard',\n\t'Guadalupe',\n\t'Hansel',\n\t'Bye',\n\t'Westerfield',\n\t'Gales',\n\t'Mickle',\n\t'Licata',\n\t'Cram',\n\t'Bracy',\n\t'Motta',\n\t'Imhoff',\n\t'Siegfried',\n\t'Merry',\n\t'Swiger',\n\t'Ton',\n\t'Hersey',\n\t'Marrone',\n\t'Ginter',\n\t'Miele',\n\t'Breton',\n\t'Scheffler',\n\t'Pray',\n\t'Stapp',\n\t'Bogard',\n\t'Towner',\n\t'Mcelhaney',\n\t'Bridgewater',\n\t'Waldner',\n\t'Quijano',\n\t'Galante',\n\t'Quesenberry',\n\t'Rourke',\n\t'Harshman',\n\t'Traver',\n\t'Alvares',\n\t'Mcgaha',\n\t'Nyberg',\n\t'Pharr',\n\t'Lerch',\n\t'Sok',\n\t'Rosson',\n\t'Wiggs',\n\t'Mcelveen',\n\t'Dimaggio',\n\t'Rettig',\n\t'Ahumada',\n\t'Hetzel',\n\t'Welling',\n\t'Chadwell',\n\t'Swink',\n\t'Mckinzie',\n\t'Kwak',\n\t'Chabot',\n\t'Tomaszewski',\n\t'Bonanno',\n\t'Lesko',\n\t'Teter',\n\t'Stalnaker',\n\t'Ober',\n\t'Hovis',\n\t'Hosey',\n\t'Chaudhry',\n\t'Fey',\n\t'Vital',\n\t'Earhart',\n\t'Heins',\n\t'Crowther',\n\t'Hanner',\n\t'Behr',\n\t'Billington',\n\t'Vogler',\n\t'Hersh',\n\t'Perlman',\n\t'Given',\n\t'Files',\n\t'Partain',\n\t'Coddington',\n\t'Jardine',\n\t'Grimmett',\n\t'Springs',\n\t'Macomber',\n\t'Horgan',\n\t'Arrieta',\n\t'Charley',\n\t'Josephson',\n\t'Tupper',\n\t'Provenzano',\n\t'Celaya',\n\t'Mcvicker',\n\t'Sigala',\n\t'Wimer',\n\t'Ayon',\n\t'Dossantos',\n\t'Norvell',\n\t'Lorenzen',\n\t'Pasquale',\n\t'Lambright',\n\t'Goings',\n\t'Defelice',\n\t'Wen',\n\t'Sigman',\n\t'Gaylor',\n\t'Rehm',\n\t'Carino',\n\t'Werth',\n\t'Forehand',\n\t'Hanke',\n\t'Lasalle',\n\t'Mitchum',\n\t'Priester',\n\t'Lefler',\n\t'Celis',\n\t'Lesser',\n\t'Fitz',\n\t'Wentzel',\n\t'Lavery',\n\t'Klassen',\n\t'Shiflett',\n\t'Hedden',\n\t'Henn',\n\t'Coursey',\n\t'Drain',\n\t'Delorenzo',\n\t'Haws',\n\t'Stansberry',\n\t'Trump',\n\t'Dantzler',\n\t'Chaidez',\n\t'Mcsweeney',\n\t'Griffen',\n\t'Trail',\n\t'Gandara',\n\t'Brunk',\n\t'Kennon',\n\t'Coss',\n\t'Blackmore',\n\t'Metts',\n\t'Gluck',\n\t'Blackshear',\n\t'Cogan',\n\t'Boney',\n\t'Encinas',\n\t'Adamski',\n\t'Roberge',\n\t'Schuette',\n\t'Valero',\n\t'Barroso',\n\t'Antunez',\n\t'Mohammad',\n\t'Housley',\n\t'Escoto',\n\t'Ullrich',\n\t'Helman',\n\t'Trost',\n\t'Lafave',\n\t'Faith',\n\t'Blaney',\n\t'Kershner',\n\t'Hoehn',\n\t'Roemer',\n\t'Isley',\n\t'Lipinski',\n\t'Claus',\n\t'Caulfield',\n\t'Paiz',\n\t'Leyba',\n\t'Robinett',\n\t'Lambeth',\n\t'Tarpley',\n\t'Essex',\n\t'Eilers',\n\t'Epley',\n\t'Murdoch',\n\t'Sandstrom',\n\t'Laux',\n\t'Domingue',\n\t'Grundy',\n\t'Bellows',\n\t'Spindler',\n\t'Boos',\n\t'Bhatt',\n\t'Tye',\n\t'Salamone',\n\t'Cirillo',\n\t'Troup',\n\t'Jemison',\n\t'Calzada',\n\t'Dowden',\n\t'Geraci',\n\t'Dunphy',\n\t'Sack',\n\t'Sloane',\n\t'Hathcock',\n\t'Yap',\n\t'Ronquillo',\n\t'Willette',\n\t'Partlow',\n\t'Dear',\n\t'Tunstall',\n\t'Kiss',\n\t'Huhn',\n\t'Seabolt',\n\t'Beene',\n\t'Sather',\n\t'Lockridge',\n\t'Despain',\n\t'Wines',\n\t'Mcalpine',\n\t'Wadley',\n\t'Dey',\n\t'Loring',\n\t'Meadors',\n\t'Buettner',\n\t'Lavalley',\n\t'Bugg',\n\t'Creek',\n\t'Millett',\n\t'Pumphrey',\n\t'Fregoso',\n\t'Merkle',\n\t'Sheffer',\n\t'Glassman',\n\t'Groover',\n\t'Sweatt',\n\t'Colunga',\n\t'Boykins',\n\t'Seng',\n\t'Stutz',\n\t'Brann',\n\t'Blakey',\n\t'Munos',\n\t'Geddes',\n\t'Avendano',\n\t'Molitor',\n\t'Diedrich',\n\t'Langham',\n\t'Kindle',\n\t'Lacour',\n\t'Buckler',\n\t'Corum',\n\t'Bakke',\n\t'Godin',\n\t'Kerner',\n\t'Tobey',\n\t'Kubiak',\n\t'Hoyer',\n\t'Hedge',\n\t'Priebe',\n\t'Callison',\n\t'Lahr',\n\t'Shears',\n\t'Snavely',\n\t'Blatt',\n\t'Mcpeak',\n\t'Tinney',\n\t'Sullins',\n\t'Bernhard',\n\t'Gibb',\n\t'Vaillancourt',\n\t'Paugh',\n\t'Funes',\n\t'Romans',\n\t'Maurice',\n\t'Lough',\n\t'Kerwin',\n\t'Sanger',\n\t'Vierra',\n\t'Markus',\n\t'Comfort',\n\t'Krall',\n\t'Spies',\n\t'Malcom',\n\t'Vizcarra',\n\t'Beamer',\n\t'Kellerman',\n\t'Mcroberts',\n\t'Waterhouse',\n\t'Stromberg',\n\t'Persons',\n\t'Whitesell',\n\t'Harty',\n\t'Rosenblatt',\n\t'Broadwater',\n\t'Clardy',\n\t'Shackleford',\n\t'Jacquez',\n\t'Brittingham',\n\t'Lindahl',\n\t'Feliz',\n\t'Danna',\n\t'Garwood',\n\t'Heron',\n\t'Southwick',\n\t'Dehoyos',\n\t'Cottrill',\n\t'Mellor',\n\t'Goldfarb',\n\t'Grieco',\n\t'Helgeson',\n\t'Vandusen',\n\t'Heinen',\n\t'Batt',\n\t'Ruch',\n\t'Garretson',\n\t'Pankey',\n\t'Caudillo',\n\t'Jakubowski',\n\t'Plowman',\n\t'Starcher',\n\t'Wessels',\n\t'Moose',\n\t'Rosner',\n\t'Louden',\n\t'Walczak',\n\t'Poulsen',\n\t'Mcchesney',\n\t'Karns',\n\t'Casares',\n\t'Cusack',\n\t'Cespedes',\n\t'Cornelison',\n\t'Crossland',\n\t'Hirst',\n\t'Mier',\n\t'Roberto',\n\t'Canchola',\n\t'Bosse',\n\t'Shetler',\n\t'Melendrez',\n\t'Giannini',\n\t'Six',\n\t'Traynor',\n\t'Knepper',\n\t'Lonergan',\n\t'Kessinger',\n\t'Hollon',\n\t'Weathersby',\n\t'Stouffer',\n\t'Gingrich',\n\t'Breault',\n\t'Pompa',\n\t'Vanhoose',\n\t'Burdine',\n\t'Lark',\n\t'Stiltner',\n\t'Wunderlich',\n\t'Yong',\n\t'Merrifield',\n\t'Willhite',\n\t'Geiser',\n\t'Lambrecht',\n\t'Keffer',\n\t'Carlo',\n\t'Germany',\n\t'Turgeon',\n\t'Dame',\n\t'Tristan',\n\t'Bova',\n\t'Doak',\n\t'Mannino',\n\t'Shotwell',\n\t'Bash',\n\t'Coots',\n\t'Feist',\n\t'Mahmood',\n\t'Schlabach',\n\t'Salzman',\n\t'Kass',\n\t'Bresnahan',\n\t'Stonge',\n\t'Tesch',\n\t'Grajeda',\n\t'Mccarron',\n\t'Mcelwee',\n\t'Spradling',\n\t'Mckown',\n\t'Colgan',\n\t'Piedra',\n\t'Collum',\n\t'Stoffel',\n\t'Won',\n\t'Gulick',\n\t'Devault',\n\t'Enders',\n\t'Yanes',\n\t'Lansing',\n\t'Ebner',\n\t'Deegan',\n\t'Boutin',\n\t'Fetzer',\n\t'Andresen',\n\t'Trigg',\n\t'Sale',\n\t'Polite',\n\t'Hummer',\n\t'Wille',\n\t'Bowerman',\n\t'Routh',\n\t'Iqbal',\n\t'Lakey',\n\t'Mcadoo',\n\t'Laflamme',\n\t'Boulware',\n\t'Guadarrama',\n\t'Campana',\n\t'Strayer',\n\t'Aho',\n\t'Emmett',\n\t'Wolters',\n\t'Bos',\n\t'Knighten',\n\t'Averill',\n\t'Bhakta',\n\t'Schumaker',\n\t'Stutts',\n\t'Mejias',\n\t'Byer',\n\t'Mahone',\n\t'Staab',\n\t'Riehl',\n\t'Briceno',\n\t'Zabala',\n\t'Lafountain',\n\t'Clemmer',\n\t'Mansell',\n\t'Rossetti',\n\t'Lafontaine',\n\t'Mager',\n\t'Adamo',\n\t'Bogue',\n\t'Northern',\n\t'Disney',\n\t'Masse',\n\t'Senter',\n\t'Yaeger',\n\t'Dahlberg',\n\t'Bisson',\n\t'Leitner',\n\t'Bolding',\n\t'Ormsby',\n\t'Berard',\n\t'Brazell',\n\t'Pickle',\n\t'Hord',\n\t'Mcguigan',\n\t'Glennon',\n\t'Aman',\n\t'Dearman',\n\t'Cauthen',\n\t'Rembert',\n\t'Delucia',\n\t'Enciso',\n\t'Slusser',\n\t'Kratzer',\n\t'Schoenfeld',\n\t'Gillam',\n\t'Rael',\n\t'Rhode',\n\t'Moton',\n\t'Eide',\n\t'Eliason',\n\t'Helfrich',\n\t'Bish',\n\t'Goodnight',\n\t'Campion',\n\t'Blow',\n\t'Gerken',\n\t'Goldenberg',\n\t'Mellinger',\n\t'Nations',\n\t'Maiden',\n\t'Anzalone',\n\t'Wagers',\n\t'Arguelles',\n\t'Christen',\n\t'Guth',\n\t'Stamey',\n\t'Bozarth',\n\t'Balogh',\n\t'Grammer',\n\t'Chafin',\n\t'Prine',\n\t'Freer',\n\t'Alder',\n\t'Latorre',\n\t'Zaleski',\n\t'Lindholm',\n\t'Belisle',\n\t'Zacharias',\n\t'Swinson',\n\t'Bazemore',\n\t'Glazer',\n\t'Acord',\n\t'Said',\n\t'Liggins',\n\t'Lueck',\n\t'Luedtke',\n\t'Blackstone',\n\t'Copper',\n\t'Riker',\n\t'Braud',\n\t'Demello',\n\t'Rode',\n\t'Haven',\n\t'Rhee',\n\t'Galligan',\n\t'Record',\n\t'Nilson',\n\t'Ansley',\n\t'Pera',\n\t'Gilliard',\n\t'Copp',\n\t'Haugh',\n\t'Dunigan',\n\t'Grinnell',\n\t'Garr',\n\t'Leonhardt',\n\t'Elswick',\n\t'Shahan',\n\t'Mike',\n\t'Boddie',\n\t'Casella',\n\t'Mauricio',\n\t'Millet',\n\t'Daye',\n\t'Claussen',\n\t'Pierrelouis',\n\t'Fleischman',\n\t'Embrey',\n\t'Durso',\n\t'Whisenant',\n\t'Rankins',\n\t'Lasky',\n\t'Askins',\n\t'Rupe',\n\t'Rochelle',\n\t'Burkes',\n\t'Kreger',\n\t'Mishler',\n\t'Heald',\n\t'Jager',\n\t'Player',\n\t'Linehan',\n\t'Horwitz',\n\t'Jacobi',\n\t'Maine',\n\t'Wiest',\n\t'Ostrom',\n\t'Sealy',\n\t'Jimerson',\n\t'Alverson',\n\t'Senior',\n\t'Hassett',\n\t'Colter',\n\t'Schleicher',\n\t'Marini',\n\t'Mcbrayer',\n\t'Arzola',\n\t'Sobel',\n\t'Frederickson',\n\t'Confer',\n\t'Tadlock',\n\t'Belmonte',\n\t'Lebrun',\n\t'Clyde',\n\t'Alleyne',\n\t'Lozoya',\n\t'Teller',\n\t'Husband',\n\t'Brigman',\n\t'Secrest',\n\t'Krajewski',\n\t'Neiman',\n\t'Trull',\n\t'Watterson',\n\t'Vanhook',\n\t'Sotomayor',\n\t'Woodrum',\n\t'Baskerville',\n\t'Finke',\n\t'Hohman',\n\t'Arp',\n\t'Hearne',\n\t'Mauk',\n\t'Danko',\n\t'Laurie',\n\t'Linderman',\n\t'Hutt',\n\t'Springfield',\n\t'Chmielewski',\n\t'Klimek',\n\t'Phinney',\n\t'Leboeuf',\n\t'Mcglone',\n\t'Holmquist',\n\t'Cogswell',\n\t'Nichol',\n\t'Klink',\n\t'Dunston',\n\t'Krawczyk',\n\t'Dart',\n\t'Woodside',\n\t'Smitherman',\n\t'Gasca',\n\t'Sala',\n\t'Foxworth',\n\t'Kammerer',\n\t'Auer',\n\t'Pegues',\n\t'Bukowski',\n\t'Koger',\n\t'Spitz',\n\t'Blomquist',\n\t'Creasy',\n\t'Bomar',\n\t'Holub',\n\t'Loney',\n\t'Garry',\n\t'Habib',\n\t'Chea',\n\t'Dupuy',\n\t'Seaver',\n\t'Sowards',\n\t'Julius',\n\t'Fulks',\n\t'Braithwaite',\n\t'Bretz',\n\t'Mccammon',\n\t'Sedillo',\n\t'Chiasson',\n\t'Oney',\n\t'Horstman',\n\t'Waites',\n\t'Mccusker',\n\t'Fenske',\n\t'Conwell',\n\t'Brokaw',\n\t'Cloyd',\n\t'Biles',\n\t'Aguinaga',\n\t'Astorga',\n\t'Demaio',\n\t'Liberty',\n\t'Kayser',\n\t'Ney',\n\t'Barthel',\n\t'Lennox',\n\t'Trautman',\n\t'Purser',\n\t'Pitzer',\n\t'Mattos',\n\t'Liss',\n\t'Clack',\n\t'Sias',\n\t'Bobb',\n\t'Stoller',\n\t'Robillard',\n\t'Almodovar',\n\t'Cribb',\n\t'Ebel',\n\t'Oyler',\n\t'Dail',\n\t'Ericksen',\n\t'Geis',\n\t'Everitt',\n\t'Cropper',\n\t'Meisner',\n\t'Skeens',\n\t'Frith',\n\t'Privett',\n\t'Braddy',\n\t'Bolick',\n\t'Severance',\n\t'Jeffreys',\n\t'Bethune',\n\t'Delcid',\n\t'Buzzard',\n\t'Broadbent',\n\t'Bono',\n\t'Addis',\n\t'Johannes',\n\t'Tims',\n\t'Castorena',\n\t'Simonsen',\n\t'Glidewell',\n\t'Mui',\n\t'Ogilvie',\n\t'Soukup',\n\t'Sunday',\n\t'Redwine',\n\t'Borton',\n\t'Schuyler',\n\t'Rudisill',\n\t'Beckford',\n\t'Pascua',\n\t'Garton',\n\t'Gilkey',\n\t'Applewhite',\n\t'Halterman',\n\t'Alsup',\n\t'Delreal',\n\t'Hubble',\n\t'Quijada',\n\t'Kropp',\n\t'Dunkle',\n\t'Lemire',\n\t'Lamontagne',\n\t'Dunkin',\n\t'Paulin',\n\t'Attaway',\n\t'Baugher',\n\t'Hornbeck',\n\t'Niehaus',\n\t'Nice',\n\t'Trimmer',\n\t'Canaday',\n\t'Maney',\n\t'Trexler',\n\t'Schmucker',\n\t'Edinger',\n\t'Massengill',\n\t'Rowlett',\n\t'Caviness',\n\t'Kam',\n\t'Chesnut',\n\t'Giardina',\n\t'Spaeth',\n\t'Gebhart',\n\t'Morano',\n\t'Salguero',\n\t'Buckland',\n\t'Reina',\n\t'Jumper',\n\t'Navas',\n\t'Thrift',\n\t'Spradley',\n\t'Bitner',\n\t'Ayer',\n\t'Harber',\n\t'Landaverde',\n\t'Mcmillion',\n\t'Naugle',\n\t'Dole',\n\t'Seagraves',\n\t'Smithers',\n\t'Frechette',\n\t'Weeden',\n\t'Caston',\n\t'Cavallaro',\n\t'Laureano',\n\t'Mandell',\n\t'Lowrance',\n\t'Baty',\n\t'Ronan',\n\t'Gigliotti',\n\t'Rossiter',\n\t'Mines',\n\t'Alatorre',\n\t'Markowski',\n\t'Berge',\n\t'Hatter',\n\t'Weakley',\n\t'Borrero',\n\t'Glazier',\n\t'Lavergne',\n\t'Sines',\n\t'Ingham',\n\t'Meltzer',\n\t'Rabinowitz',\n\t'Siciliano',\n\t'Canas',\n\t'Perna',\n\t'Struck',\n\t'Dare',\n\t'Nay',\n\t'Severino',\n\t'Mathewson',\n\t'Bouldin',\n\t'Topete',\n\t'Brunette',\n\t'Sin',\n\t'Hendren',\n\t'Brickey',\n\t'Ferrier',\n\t'Alessi',\n\t'Scheel',\n\t'Storer',\n\t'Matherne',\n\t'Mecham',\n\t'Spiker',\n\t'Hibbert',\n\t'Klingensmith',\n\t'Lefever',\n\t'Banning',\n\t'Bankhead',\n\t'Roan',\n\t'Brack',\n\t'Pascoe',\n\t'Davie',\n\t'Scheid',\n\t'Jim',\n\t'Tweedy',\n\t'Strahan',\n\t'Revis',\n\t'Fermin',\n\t'Obrian',\n\t'Motes',\n\t'Lobo',\n\t'Palmisano',\n\t'Faught',\n\t'Byington',\n\t'Garren',\n\t'Hungerford',\n\t'Vanzandt',\n\t'Gust',\n\t'Heater',\n\t'Klingler',\n\t'Delay',\n\t'Wear',\n\t'Hendley',\n\t'Threatt',\n\t'Gaughan',\n\t'Kunze',\n\t'Hessler',\n\t'Lindell',\n\t'Monteleone',\n\t'Palazzolo',\n\t'Shear',\n\t'Phares',\n\t'Cavalier',\n\t'Benning',\n\t'Urbanski',\n\t'Darrah',\n\t'Wager',\n\t'Mohn',\n\t'Vereen',\n\t'Beiler',\n\t'Hedlund',\n\t'Quade',\n\t'Wieczorek',\n\t'Cicero',\n\t'Hoekstra',\n\t'Scalf',\n\t'Ducote',\n\t'Havard',\n\t'Espiritu',\n\t'Beacham',\n\t'Bolger',\n\t'Schuller',\n\t'Sill',\n\t'Dice',\n\t'Lemmons',\n\t'Orlowski',\n\t'Lundeen',\n\t'Steck',\n\t'Stanfill',\n\t'Rakes',\n\t'Laine',\n\t'Haviland',\n\t'Durrett',\n\t'Naumann',\n\t'Donahoe',\n\t'Reif',\n\t'Franck',\n\t'Amoroso',\n\t'Belknap',\n\t'Tolle',\n\t'Perrotta',\n\t'Heyer',\n\t'Dougan',\n\t'Frakes',\n\t'Leath',\n\t'Poteat',\n\t'Violette',\n\t'Marine',\n\t'Zellner',\n\t'Granillo',\n\t'Fontanez',\n\t'Didonato',\n\t'Bradberry',\n\t'Morman',\n\t'Mentzer',\n\t'Lamoureux',\n\t'Sabatino',\n\t'Catania',\n\t'Wenner',\n\t'Pastrana',\n\t'Shenk',\n\t'Losey',\n\t'Hepburn',\n\t'Antonucci',\n\t'Egger',\n\t'Higbee',\n\t'Adames',\n\t'Reep',\n\t'Cavallo',\n\t'Bridwell',\n\t'Villalba',\n\t'Poor',\n\t'Peet',\n\t'Everette',\n\t'Arney',\n\t'Towery',\n\t'Sharon',\n\t'Trainer',\n\t'Marrow',\n\t'Cumming',\n\t'Rimmer',\n\t'Stanger',\n\t'Pinter',\n\t'Felt',\n\t'Parrett',\n\t'Garrard',\n\t'Benedetto',\n\t'Lingenfelter',\n\t'Resch',\n\t'Billy',\n\t'Mikesell',\n\t'Osterman',\n\t'Trueblood',\n\t'Redfern',\n\t'Calderone',\n\t'Placencia',\n\t'Wamsley',\n\t'Warr',\n\t'Varnado',\n\t'Harshbarger',\n\t'Topping',\n\t'Feltner',\n\t'Decosta',\n\t'Tart',\n\t'Blumberg',\n\t'Shaikh',\n\t'Culley',\n\t'Bork',\n\t'Thibeault',\n\t'Stolz',\n\t'Ramsdell',\n\t'Tedford',\n\t'Noto',\n\t'Poulson',\n\t'Daves',\n\t'Altieri',\n\t'Mendosa',\n\t'Kisner',\n\t'Grafton',\n\t'Remy',\n\t'Hartline',\n\t'Cripe',\n\t'Sher',\n\t'Mulvaney',\n\t'Ansari',\n\t'Hartfield',\n\t'Whitton',\n\t'Wathen',\n\t'Eisele',\n\t'Hinojos',\n\t'Backer',\n\t'Speaks',\n\t'Schuetz',\n\t'Novoa',\n\t'Marcos',\n\t'Mask',\n\t'Oboyle',\n\t'Kircher',\n\t'Stang',\n\t'Sibert',\n\t'Scala',\n\t'Zacarias',\n\t'Hendon',\n\t'Halvorsen',\n\t'Montalbano',\n\t'Zermeno',\n\t'Vancamp',\n\t'Grams',\n\t'Hornberger',\n\t'Binion',\n\t'Dewald',\n\t'Rives',\n\t'Sankey',\n\t'Kleinman',\n\t'Falconer',\n\t'Rumph',\n\t'Matus',\n\t'Swett',\n\t'Spinner',\n\t'Depasquale',\n\t'Gamino',\n\t'Olmsted',\n\t'Absher',\n\t'Culler',\n\t'Fryman',\n\t'Lampert',\n\t'Carlyle',\n\t'Terranova',\n\t'Dunagan',\n\t'Chouinard',\n\t'Wesolowski',\n\t'Hetherington',\n\t'Scalise',\n\t'Pendergast',\n\t'Marcano',\n\t'Joubert',\n\t'Scheller',\n\t'Whisenhunt',\n\t'Lenoir',\n\t'Mahar',\n\t'Vanlandingham',\n\t'Pecoraro',\n\t'You',\n\t'Natividad',\n\t'Daum',\n\t'Penick',\n\t'Eddington',\n\t'Deleo',\n\t'Soltis',\n\t'Santucci',\n\t'Costanza',\n\t'Hiner',\n\t'Farlow',\n\t'Hartsock',\n\t'Duprey',\n\t'Fann',\n\t'Safford',\n\t'Murtha',\n\t'Fessler',\n\t'Chien',\n\t'Paynter',\n\t'Devera',\n\t'Hoelscher',\n\t'Boltz',\n\t'Deacon',\n\t'Loo',\n\t'Enoch',\n\t'Dilorenzo',\n\t'Saville',\n\t'Mirza',\n\t'Takacs',\n\t'Drexler',\n\t'Lakin',\n\t'Geraghty',\n\t'Widmer',\n\t'Esteves',\n\t'Llanes',\n\t'Cerny',\n\t'Quist',\n\t'Hargraves',\n\t'Toma',\n\t'Tarter',\n\t'Chapple',\n\t'Alderete',\n\t'Michelson',\n\t'Clymer',\n\t'Batey',\n\t'Sealey',\n\t'Loughlin',\n\t'Preece',\n\t'Zurita',\n\t'Courville',\n\t'Desousa',\n\t'Shamblin',\n\t'Tingley',\n\t'Noles',\n\t'Misner',\n\t'Standifer',\n\t'Dinardo',\n\t'Dillow',\n\t'Bullis',\n\t'Carballo',\n\t'Everly',\n\t'Mulvihill',\n\t'Tincher',\n\t'Carle',\n\t'Lundin',\n\t'Birdsall',\n\t'Bainbridge',\n\t'Suttle',\n\t'Wightman',\n\t'Mower',\n\t'Mountain',\n\t'Bickham',\n\t'Durante',\n\t'Viveros',\n\t'Swinford',\n\t'Mcgruder',\n\t'Tapley',\n\t'Grable',\n\t'Gwynn',\n\t'Wiebe',\n\t'Stagg',\n\t'Dash',\n\t'Heitman',\n\t'Cluff',\n\t'Huertas',\n\t'Fortuna',\n\t'Lines',\n\t'Sly',\n\t'Halford',\n\t'Helsel',\n\t'Bicknell',\n\t'Blakeman',\n\t'Colangelo',\n\t'Olney',\n\t'Quinton',\n\t'Rothrock',\n\t'Renz',\n\t'Hone',\n\t'Prejean',\n\t'Oshiro',\n\t'Serio',\n\t'Latour',\n\t'Newbold',\n\t'Fitzhugh',\n\t'Songer',\n\t'Cardin',\n\t'Geter',\n\t'Barbera',\n\t'Abbas',\n\t'Caesar',\n\t'Blakeslee',\n\t'Camper',\n\t'Mcclurg',\n\t'Driskill',\n\t'Cancel',\n\t'Donelson',\n\t'Borrelli',\n\t'Donoghue',\n\t'Shoaf',\n\t'Tinajero',\n\t'Arzate',\n\t'Keesee',\n\t'Pasley',\n\t'Strode',\n\t'Morello',\n\t'Trantham',\n\t'Ackerson',\n\t'Jowers',\n\t'Brockington',\n\t'Barcia',\n\t'Lipp',\n\t'Dinger',\n\t'Ridings',\n\t'Canavan',\n\t'Rank',\n\t'Hagans',\n\t'Lampley',\n\t'Beckmann',\n\t'Bjork',\n\t'Raygoza',\n\t'Schirmer',\n\t'Longmire',\n\t'Schiavone',\n\t'Breuer',\n\t'Lore',\n\t'Stenson',\n\t'Koziol',\n\t'Channell',\n\t'Cale',\n\t'Trader',\n\t'Culberson',\n\t'Mundt',\n\t'Sickles',\n\t'Nemec',\n\t'Holl',\n\t'Stribling',\n\t'Berens',\n\t'Nauman',\n\t'Lehner',\n\t'Deem',\n\t'Castelli',\n\t'Billman',\n\t'Orndorff',\n\t'Gumm',\n\t'Davy',\n\t'Pelham',\n\t'Spotts',\n\t'Jurgens',\n\t'Sword',\n\t'Adorno',\n\t'Gorrell',\n\t'Boughton',\n\t'Bobadilla',\n\t'Mauer',\n\t'Moline',\n\t'Guay',\n\t'Holsinger',\n\t'Baranowski',\n\t'Gutierres',\n\t'Beveridge',\n\t'Marable',\n\t'Berkey',\n\t'Lamothe',\n\t'Spitler',\n\t'Carbaugh',\n\t'Hoopes',\n\t'Wilken',\n\t'Milford',\n\t'Bingaman',\n\t'Crippen',\n\t'Shock',\n\t'Yarnell',\n\t'Oman',\n\t'Wethington',\n\t'Kost',\n\t'Gaudette',\n\t'Spielman',\n\t'Foran',\n\t'Starke',\n\t'Eugene',\n\t'Birnbaum',\n\t'Navarrette',\n\t'Hussein',\n\t'Ranson',\n\t'Hedgepeth',\n\t'Doctor',\n\t'Higuera',\n\t'Brough',\n\t'Cookson',\n\t'Provencher',\n\t'Mendonca',\n\t'Gowen',\n\t'Summer',\n\t'Rutz',\n\t'Reader',\n\t'Doud',\n\t'Raven',\n\t'Toribio',\n\t'Peachey',\n\t'Gunning',\n\t'Bittle',\n\t'Vale',\n\t'Harnish',\n\t'Marano',\n\t'Aker',\n\t'Damore',\n\t'Utz',\n\t'Throckmorton',\n\t'Bulger',\n\t'Vanzant',\n\t'Pasillas',\n\t'Holmgren',\n\t'Corpus',\n\t'Longley',\n\t'Wetmore',\n\t'Carstens',\n\t'Line',\n\t'Percival',\n\t'Ayotte',\n\t'Batres',\n\t'Pipes',\n\t'Ludwick',\n\t'Alpert',\n\t'Pick',\n\t'Carlock',\n\t'Edmundson',\n\t'Feinstein',\n\t'Krouse',\n\t'Dahlgren',\n\t'Sasaki',\n\t'Lieb',\n\t'Londono',\n\t'Oloughlin',\n\t'Wardlaw',\n\t'Lineberry',\n\t'Castello',\n\t'Milstead',\n\t'Parmenter',\n\t'Riffe',\n\t'Pare',\n\t'Sitton',\n\t'Tarin',\n\t'Delcastillo',\n\t'Manor',\n\t'Calabro',\n\t'Elkin',\n\t'Grill',\n\t'Boaz',\n\t'Coco',\n\t'Chamblee',\n\t'Celestine',\n\t'Nick',\n\t'Stork',\n\t'Meekins',\n\t'Moise',\n\t'Devers',\n\t'Jun',\n\t'Kegley',\n\t'Brick',\n\t'Lobato',\n\t'Biggerstaff',\n\t'Kersten',\n\t'Jayne',\n\t'Nasser',\n\t'Southall',\n\t'Kempton',\n\t'Eaddy',\n\t'Paladino',\n\t'Berardi',\n\t'Pizzo',\n\t'Pulver',\n\t'Ohalloran',\n\t'Fromm',\n\t'Cranston',\n\t'Rowden',\n\t'Capobianco',\n\t'Kahle',\n\t'Thiessen',\n\t'Malott',\n\t'Houseman',\n\t'Maul',\n\t'Gallion',\n\t'Tressler',\n\t'Pauly',\n\t'Pellerin',\n\t'Sainz',\n\t'Firth',\n\t'Cryer',\n\t'Jeanlouis',\n\t'Mong',\n\t'Trawick',\n\t'Chronister',\n\t'Hayashi',\n\t'Posner',\n\t'Cueva',\n\t'Sherwin',\n\t'Lacasse',\n\t'Gorden',\n\t'Bohl',\n\t'Twigg',\n\t'Coan',\n\t'Hocker',\n\t'Goodale',\n\t'Urbano',\n\t'Loeb',\n\t'Perrault',\n\t'Frawley',\n\t'Carcamo',\n\t'Richburg',\n\t'Moffat',\n\t'Hennings',\n\t'Weyer',\n\t'Myatt',\n\t'Ullman',\n\t'Tunnell',\n\t'Hern',\n\t'Lopresti',\n\t'Sonnenberg',\n\t'Knisley',\n\t'Twomey',\n\t'Jaggers',\n\t'Tanksley',\n\t'Rachal',\n\t'Poppe',\n\t'Vos',\n\t'Kania',\n\t'Speakman',\n\t'Peirce',\n\t'Pound',\n\t'Romer',\n\t'Patty',\n\t'Millsaps',\n\t'Kyser',\n\t'Telford',\n\t'Hegarty',\n\t'Kellett',\n\t'Michaelis',\n\t'Halligan',\n\t'Maughan',\n\t'Herb',\n\t'Rainer',\n\t'Robichaud',\n\t'Fiscus',\n\t'Sickler',\n\t'Blom',\n\t'Lavine',\n\t'Medel',\n\t'Bolyard',\n\t'Secor',\n\t'Creekmore',\n\t'Magruder',\n\t'Haskin',\n\t'Laliberte',\n\t'Drago',\n\t'Bernabe',\n\t'Leader',\n\t'Cavin',\n\t'Lukens',\n\t'Vassallo',\n\t'Pletcher',\n\t'Fuson',\n\t'Hasson',\n\t'Huckabee',\n\t'Edington',\n\t'Eichler',\n\t'Hering',\n\t'Vong',\n\t'Mardis',\n\t'Gu',\n\t'Segarra',\n\t'Bilyeu',\n\t'Runion',\n\t'Fragoso',\n\t'Gama',\n\t'Dunton',\n\t'Frady',\n\t'Lewellen',\n\t'Crumpler',\n\t'Jeske',\n\t'Furlow',\n\t'Delapena',\n\t'Kale',\n\t'Massengale',\n\t'Hamlet',\n\t'Galli',\n\t'Esteban',\n\t'Greeson',\n\t'Shue',\n\t'Pollak',\n\t'Pinney',\n\t'Ruffner',\n\t'Maitland',\n\t'Steven',\n\t'Hockett',\n\t'Fraire',\n\t'Mulhern',\n\t'Elbert',\n\t'Hoggard',\n\t'Labarge',\n\t'Silcox',\n\t'Saez',\n\t'Sluder',\n\t'Stamp',\n\t'Darlington',\n\t'Mccarroll',\n\t'Pillow',\n\t'Palazzo',\n\t'Blaha',\n\t'Demaria',\n\t'Swanger',\n\t'Winningham',\n\t'Lippincott',\n\t'Dake',\n\t'Goldsberry',\n\t'Seidl',\n\t'Woolfolk',\n\t'Murawski',\n\t'Hobart',\n\t'Kimber',\n\t'Nilsson',\n\t'Stough',\n\t'Almendarez',\n\t'Nevels',\n\t'Fasano',\n\t'Salmons',\n\t'Denmark',\n\t'Lathan',\n\t'Mosely',\n\t'Stengel',\n\t'Mendieta',\n\t'Felice',\n\t'Drown',\n\t'Vidrine',\n\t'Callihan',\n\t'Polston',\n\t'Howze',\n\t'Eakins',\n\t'Leek',\n\t'Featherstone',\n\t'Lajoie',\n\t'Athey',\n\t'Asuncion',\n\t'Ashbaugh',\n\t'Orman',\n\t'Morrissette',\n\t'Peart',\n\t'Hamner',\n\t'Zell',\n\t'Dry',\n\t'Dieter',\n\t'Terrones',\n\t'Campuzano',\n\t'Reveles',\n\t'Bakker',\n\t'Banister',\n\t'Arceo',\n\t'Dhillon',\n\t'Normand',\n\t'Shavers',\n\t'Ginsburg',\n\t'Go',\n\t'Rubinstein',\n\t'Arens',\n\t'Clutter',\n\t'Jaques',\n\t'Traxler',\n\t'Hackler',\n\t'Cisco',\n\t'Starrett',\n\t'Ceron',\n\t'Gillenwater',\n\t'Ottinger',\n\t'Caster',\n\t'Blakemore',\n\t'Thorsen',\n\t'Molinar',\n\t'Baur',\n\t'Hower',\n\t'Haldeman',\n\t'Oliveri',\n\t'Mcalpin',\n\t'Standish',\n\t'Bengtson',\n\t'Strack',\n\t'Cordoba',\n\t'Blackstock',\n\t'Barna',\n\t'Schantz',\n\t'Hawkinson',\n\t'Breese',\n\t'Saba',\n\t'Camden',\n\t'Gwaltney',\n\t'Corliss',\n\t'Smit',\n\t'Cruise',\n\t'Mcneese',\n\t'Duggins',\n\t'Laub',\n\t'Burman',\n\t'Kenworthy',\n\t'Spohn',\n\t'Santini',\n\t'Nuttall',\n\t'Willison',\n\t'Stjean',\n\t'Shabazz',\n\t'Manes',\n\t'Gerry',\n\t'Mclamb',\n\t'Koepke',\n\t'Reeser',\n\t'Ogburn',\n\t'Wegener',\n\t'Risinger',\n\t'Carrero',\n\t'Livermore',\n\t'Brewton',\n\t'Harsh',\n\t'Utterback',\n\t'Lecompte',\n\t'Schnabel',\n\t'Ting',\n\t'Honea',\n\t'Stryker',\n\t'Foshee',\n\t'Baptista',\n\t'Gravely',\n\t'Courson',\n\t'Goyette',\n\t'Leitch',\n\t'Tasker',\n\t'Laurence',\n\t'Reneau',\n\t'Voight',\n\t'Tilson',\n\t'Range',\n\t'Hallam',\n\t'Dufrene',\n\t'Boice',\n\t'Shrewsbury',\n\t'Sturges',\n\t'Lenard',\n\t'Sistrunk',\n\t'Weitz',\n\t'Carnevale',\n\t'Hepner',\n\t'Wehner',\n\t'Callen',\n\t'Oshaughnessy',\n\t'Wingert',\n\t'Mouser',\n\t'Palmore',\n\t'Rugg',\n\t'Elia',\n\t'Alcazar',\n\t'Avitia',\n\t'Penton',\n\t'Brisco',\n\t'Ambrosio',\n\t'Wardlow',\n\t'Leaf',\n\t'Rowles',\n\t'Buggs',\n\t'Dittmer',\n\t'Schweizer',\n\t'Puleo',\n\t'Vaden',\n\t'Haughton',\n\t'Cardinale',\n\t'Seguin',\n\t'Ruddy',\n\t'Minard',\n\t'Stalker',\n\t'Bennington',\n\t'Hilt',\n\t'Works',\n\t'Broadus',\n\t'Engels',\n\t'Haddix',\n\t'Buster',\n\t'Recker',\n\t'Bopp',\n\t'Wilton',\n\t'Costantino',\n\t'Boots',\n\t'Falkner',\n\t'Tennison',\n\t'Mcgary',\n\t'Holz',\n\t'Lofgren',\n\t'Putney',\n\t'Christner',\n\t'Fruge',\n\t'Vassar',\n\t'Vankirk',\n\t'Spoon',\n\t'Pearlman',\n\t'Guertin',\n\t'Meece',\n\t'Sartain',\n\t'Petterson',\n\t'Primm',\n\t'Cardillo',\n\t'Dryer',\n\t'Hartshorn',\n\t'Dane',\n\t'Chaisson',\n\t'Espitia',\n\t'Creager',\n\t'Disalvo',\n\t'Janik',\n\t'Parente',\n\t'Paiva',\n\t'Slaven',\n\t'Tague',\n\t'Kujawa',\n\t'Gruver',\n\t'Foor',\n\t'Frampton',\n\t'Prokop',\n\t'Mettler',\n\t'Collis',\n\t'Lamkin',\n\t'Shuey',\n\t'Tepper',\n\t'Colyer',\n\t'Masi',\n\t'Trumble',\n\t'Guice',\n\t'Hurwitz',\n\t'Windle',\n\t'Mccully',\n\t'Cutting',\n\t'Stotler',\n\t'Grullon',\n\t'Wagstaff',\n\t'Morfin',\n\t'Dehaan',\n\t'Noon',\n\t'Flesher',\n\t'Ferri',\n\t'Covell',\n\t'Coll',\n\t'Lucy',\n\t'Albaugh',\n\t'Testerman',\n\t'Gordillo',\n\t'Jepson',\n\t'Brinkerhoff',\n\t'Calle',\n\t'Crowl',\n\t'Mcelwain',\n\t'Chumley',\n\t'Brockett',\n\t'Thoms',\n\t'Revell',\n\t'Garzon',\n\t'Polak',\n\t'Rothenberg',\n\t'Socha',\n\t'Vallejos',\n\t'Felty',\n\t'Peguero',\n\t'Ping',\n\t'Tso',\n\t'Charleston',\n\t'Fedor',\n\t'Haider',\n\t'Abe',\n\t'Enlow',\n\t'Fifer',\n\t'Bumpus',\n\t'Keele',\n\t'Mcdavid',\n\t'Panek',\n\t'Scholten',\n\t'Dyess',\n\t'Heatherly',\n\t'Donohoe',\n\t'Hoban',\n\t'Griffey',\n\t'Corry',\n\t'Mcclean',\n\t'Plyler',\n\t'Feathers',\n\t'Adkison',\n\t'Killeen',\n\t'Hoeft',\n\t'Myhre',\n\t'Fiorentino',\n\t'Mcbeth',\n\t'Erazo',\n\t'Madson',\n\t'Fulbright',\n\t'Wilds',\n\t'Petrucci',\n\t'Mcgaughey',\n\t'Monteith',\n\t'Murguia',\n\t'Hausman',\n\t'Zukowski',\n\t'Shute',\n\t'Brisson',\n\t'Lain',\n\t'Runkle',\n\t'Hickok',\n\t'Caffrey',\n\t'Million',\n\t'Elson',\n\t'Peay',\n\t'Haga',\n\t'Ancheta',\n\t'Cordle',\n\t'Blas',\n\t'Carmen',\n\t'Pettiford',\n\t'Dimartino',\n\t'Spahr',\n\t'Mozingo',\n\t'Backman',\n\t'Stgeorge',\n\t'Konrad',\n\t'Buhler',\n\t'Mcelrath',\n\t'Oliveros',\n\t'Edelstein',\n\t'Cadet',\n\t'Gilmartin',\n\t'Munday',\n\t'Roane',\n\t'Desalvo',\n\t'Lepe',\n\t'Symons',\n\t'Shearin',\n\t'Linkous',\n\t'Cheshire',\n\t'Klemm',\n\t'Beagle',\n\t'Pooler',\n\t'Dewalt',\n\t'Esch',\n\t'Finnell',\n\t'Sinnott',\n\t'Kepler',\n\t'Toups',\n\t'Riccardi',\n\t'Caylor',\n\t'Tillis',\n\t'Messmer',\n\t'Rothschild',\n\t'Boutte',\n\t'Zumwalt',\n\t'Bohrer',\n\t'Elgin',\n\t'Kinley',\n\t'Schechter',\n\t'Gowan',\n\t'Pyne',\n\t'Cousin',\n\t'Hunsinger',\n\t'Fishel',\n\t'Edenfield',\n\t'Nadler',\n\t'Warman',\n\t'Bruhn',\n\t'Swint',\n\t'Lizotte',\n\t'Nardone',\n\t'Troxel',\n\t'Grindle',\n\t'Labrie',\n\t'Tao',\n\t'Olea',\n\t'Schermerhorn',\n\t'Stier',\n\t'Hettinger',\n\t'Farthing',\n\t'Roux',\n\t'Max',\n\t'Amburgey',\n\t'Auerbach',\n\t'Janzen',\n\t'Ortez',\n\t'Alejandre',\n\t'Peiffer',\n\t'Molinaro',\n\t'Burleigh',\n\t'Benites',\n\t'Ringler',\n\t'Hou',\n\t'Haffner',\n\t'Nace',\n\t'Crosson',\n\t'Karcher',\n\t'Neufeld',\n\t'Bayles',\n\t'Riemer',\n\t'Amezquita',\n\t'Cadwell',\n\t'Petrosky',\n\t'Swallow',\n\t'Minnis',\n\t'Krupp',\n\t'Nardi',\n\t'Orsini',\n\t'Diez',\n\t'Updike',\n\t'Gasser',\n\t'Rogerson',\n\t'Speicher',\n\t'Dubay',\n\t'Hollaway',\n\t'Teets',\n\t'Keown',\n\t'Center',\n\t'Blanding',\n\t'Whisler',\n\t'Spurlin',\n\t'Collin',\n\t'Greenawalt',\n\t'Tomes',\n\t'Leister',\n\t'Chatfield',\n\t'Helwig',\n\t'Reimers',\n\t'Andress',\n\t'Norcross',\n\t'Melnick',\n\t'Yearwood',\n\t'Defazio',\n\t'Kubik',\n\t'Bhatia',\n\t'Uddin',\n\t'Belmont',\n\t'Haden',\n\t'Bench',\n\t'Chilson',\n\t'Pegg',\n\t'Cane',\n\t'Goehring',\n\t'Lino',\n\t'Tyus',\n\t'Furey',\n\t'Castleman',\n\t'Heywood',\n\t'Leedy',\n\t'Holleman',\n\t'Villeda',\n\t'Mcveigh',\n\t'Carreiro',\n\t'Hocking',\n\t'Azar',\n\t'Blough',\n\t'Lieu',\n\t'Marcial',\n\t'Coblentz',\n\t'Hossain',\n\t'Weisberg',\n\t'Gardea',\n\t'Hoyos',\n\t'Lipsey',\n\t'Reger',\n\t'Clouser',\n\t'Bewley',\n\t'Magness',\n\t'Goines',\n\t'Thome',\n\t'Odea',\n\t'Mannion',\n\t'Dansby',\n\t'Dipasquale',\n\t'Constable',\n\t'Truelove',\n\t'Hubler',\n\t'Ulibarri',\n\t'Wymer',\n\t'Cron',\n\t'Hugo',\n\t'Hilderbrand',\n\t'Milazzo',\n\t'Vasques',\n\t'Sproul',\n\t'Shuford',\n\t'Chavers',\n\t'Kral',\n\t'Vecchio',\n\t'Mehl',\n\t'Rymer',\n\t'Henriksen',\n\t'Taulbee',\n\t'Hagy',\n\t'Ammerman',\n\t'Kagan',\n\t'Galdamez',\n\t'Krick',\n\t'Owsley',\n\t'Mullikin',\n\t'Beery',\n\t'Eccles',\n\t'Kleinschmidt',\n\t'Kloss',\n\t'Oldenburg',\n\t'Ospina',\n\t'Harbert',\n\t'Andujar',\n\t'Florian',\n\t'Antone',\n\t'Mcmillon',\n\t'Ceniceros',\n\t'Rippy',\n\t'Adkisson',\n\t'Stange',\n\t'Balmer',\n\t'Mazurek',\n\t'Dahlke',\n\t'Girouard',\n\t'Nickelson',\n\t'Perera',\n\t'Tullos',\n\t'Cioffi',\n\t'Bogdan',\n\t'Olivieri',\n\t'Petree',\n\t'Speights',\n\t'Jantz',\n\t'Collings',\n\t'Zellers',\n\t'Yarber',\n\t'Lafollette',\n\t'Rink',\n\t'Currin',\n\t'Chua',\n\t'Hartle',\n\t'Larocque',\n\t'Cuthbertson',\n\t'Ehrhardt',\n\t'Mara',\n\t'Rieck',\n\t'Lumley',\n\t'Anderton',\n\t'Hennigan',\n\t'Fabrizio',\n\t'Hutter',\n\t'Bruning',\n\t'Korman',\n\t'Haring',\n\t'Monette',\n\t'Woodyard',\n\t'Goggins',\n\t'Balzer',\n\t'Philbrick',\n\t'Bruder',\n\t'Hansford',\n\t'Averett',\n\t'Teske',\n\t'Mauck',\n\t'Billiot',\n\t'Collie',\n\t'Caffey',\n\t'Manos',\n\t'Buchan',\n\t'Birk',\n\t'Abdallah',\n\t'Featherston',\n\t'Koh',\n\t'Valera',\n\t'Deyo',\n\t'Buono',\n\t'Aubin',\n\t'Doody',\n\t'Pigott',\n\t'Peloquin',\n\t'Maniscalco',\n\t'Eisenhauer',\n\t'Biller',\n\t'Farwell',\n\t'Hartzog',\n\t'Brazier',\n\t'Talton',\n\t'Mcdougald',\n\t'Midgett',\n\t'Strout',\n\t'Spiers',\n\t'Eiland',\n\t'Garth',\n\t'Sequeira',\n\t'Noyola',\n\t'Petri',\n\t'Goodyear',\n\t'Dineen',\n\t'Bernardi',\n\t'Berns',\n\t'Coolidge',\n\t'Dorfman',\n\t'Dittman',\n\t'Zeno',\n\t'Hauer',\n\t'Finlay',\n\t'Ziemba',\n\t'Spillane',\n\t'Kays',\n\t'Ekstrom',\n\t'Hile',\n\t'Mckinstry',\n\t'Lesley',\n\t'Courtright',\n\t'Kuhlmann',\n\t'Verma',\n\t'Cripps',\n\t'Wigley',\n\t'Nickens',\n\t'Petrick',\n\t'Delozier',\n\t'Hardcastle',\n\t'Yamaguchi',\n\t'Romig',\n\t'Venezia',\n\t'Reading',\n\t'Redford',\n\t'Heng',\n\t'Anselmo',\n\t'Getty',\n\t'Marten',\n\t'Badgett',\n\t'Eisner',\n\t'Holtzman',\n\t'Stell',\n\t'Hiser',\n\t'Dustin',\n\t'Bordeaux',\n\t'Debolt',\n\t'Trevizo',\n\t'Eckard',\n\t'Follett',\n\t'Lal',\n\t'Dark',\n\t'Buskirk',\n\t'Roca',\n\t'Todaro',\n\t'Campanella',\n\t'Lindsley',\n\t'Wickman',\n\t'Pritt',\n\t'Cutlip',\n\t'Pokorny',\n\t'Friedlander',\n\t'Saari',\n\t'Casias',\n\t'Macneil',\n\t'Clyburn',\n\t'Kravitz',\n\t'Edgington',\n\t'Portis',\n\t'Culbreth',\n\t'Cuff',\n\t'Brouillette',\n\t'Artz',\n\t'Trudell',\n\t'Pledger',\n\t'Markovich',\n\t'Pisani',\n\t'Faller',\n\t'Sergent',\n\t'Hail',\n\t'Stabile',\n\t'Wait',\n\t'Mcilwain',\n\t'Eriksen',\n\t'Nee',\n\t'Boll',\n\t'Catanzaro',\n\t'Giuliano',\n\t'Oldfield',\n\t'Banas',\n\t'Ickes',\n\t'Vachon',\n\t'Gleeson',\n\t'Bailes',\n\t'Biehl',\n\t'Woodham',\n\t'Troupe',\n\t'Mcgoldrick',\n\t'Cappello',\n\t'Kirkendall',\n\t'Baisden',\n\t'Joshua',\n\t'Nicoletti',\n\t'Roesch',\n\t'Deatherage',\n\t'Matter',\n\t'Sheth',\n\t'Tynes',\n\t'Shaheen',\n\t'Wilbert',\n\t'Toles',\n\t'Sanner',\n\t'Bury',\n\t'Boman',\n\t'Bose',\n\t'Millner',\n\t'Eisen',\n\t'Couto',\n\t'Ide',\n\t'Howells',\n\t'Jiminez',\n\t'Crampton',\n\t'Monti',\n\t'Jelinek',\n\t'Morford',\n\t'Yeomans',\n\t'Turnbow',\n\t'Rolland',\n\t'Scheetz',\n\t'Arends',\n\t'Repp',\n\t'Hohn',\n\t'Paton',\n\t'Govan',\n\t'Fabela',\n\t'Mroz',\n\t'Bourassa',\n\t'Rizzi',\n\t'Froelich',\n\t'Molinari',\n\t'Lunde',\n\t'Navarre',\n\t'Alexandre',\n\t'Dearborn',\n\t'Lakes',\n\t'Foxx',\n\t'Jerez',\n\t'Lamanna',\n\t'Talarico',\n\t'Butera',\n\t'Riner',\n\t'Gros',\n\t'Champ',\n\t'Phoenix',\n\t'Vandeventer',\n\t'Samora',\n\t'Behling',\n\t'Karpinski',\n\t'Hosier',\n\t'Tufts',\n\t'Hobby',\n\t'Rohrbach',\n\t'Youngman',\n\t'Yeary',\n\t'Paisley',\n\t'Ben',\n\t'Villalta',\n\t'Hempel',\n\t'Giblin',\n\t'Lunt',\n\t'Hagar',\n\t'Lapoint',\n\t'Singley',\n\t'Shows',\n\t'Kesterson',\n\t'Bollman',\n\t'Stansell',\n\t'Yon',\n\t'Gabaldon',\n\t'Simental',\n\t'Zastrow',\n\t'Enloe',\n\t'Sasso',\n\t'Harkey',\n\t'Sansom',\n\t'Twyman',\n\t'Haslam',\n\t'Sowa',\n\t'Hunsberger',\n\t'Norberg',\n\t'Hornback',\n\t'Hanshaw',\n\t'Axtell',\n\t'Hoge',\n\t'Gantz',\n\t'Mccullum',\n\t'Blazek',\n\t'Scher',\n\t'Carlucci',\n\t'Jeong',\n\t'Tillett',\n\t'Woolridge',\n\t'Carberry',\n\t'Reck',\n\t'Nevin',\n\t'Armes',\n\t'Sidhu',\n\t'Wiesner',\n\t'Auman',\n\t'Teeters',\n\t'Rigg',\n\t'Moloney',\n\t'Feld',\n\t'Lucier',\n\t'Cardone',\n\t'Kilian',\n\t'Conder',\n\t'Horta',\n\t'Murakami',\n\t'Schaff',\n\t'Dresser',\n\t'Spray',\n\t'Hott',\n\t'Capuano',\n\t'Englund',\n\t'Rothe',\n\t'Ferree',\n\t'Nolt',\n\t'Triana',\n\t'Sanjuan',\n\t'Oller',\n\t'Brathwaite',\n\t'Richert',\n\t'Holdren',\n\t'Goree',\n\t'Branstetter',\n\t'Schimmel',\n\t'Jessop',\n\t'Nellis',\n\t'Sevier',\n\t'Rabb',\n\t'Mcmorris',\n\t'Lindo',\n\t'Littles',\n\t'Polzin',\n\t'Ranieri',\n\t'Reale',\n\t'Sturtevant',\n\t'Arnone',\n\t'Zamorano',\n\t'Keever',\n\t'Clow',\n\t'Corr',\n\t'Blaser',\n\t'Sheetz',\n\t'Llanos',\n\t'Belew',\n\t'Rusnak',\n\t'Brandes',\n\t'Eichhorn',\n\t'Guida',\n\t'Pucci',\n\t'Streit',\n\t'Renn',\n\t'Partee',\n\t'Rappaport',\n\t'Rosso',\n\t'Defeo',\n\t'Greve',\n\t'Schoch',\n\t'Langevin',\n\t'Manna',\n\t'Towe',\n\t'Scoville',\n\t'Marco',\n\t'Gove',\n\t'Mckissick',\n\t'Dangerfield',\n\t'Mcwhirter',\n\t'Port',\n\t'Marrufo',\n\t'Nicosia',\n\t'Farren',\n\t'Kinsley',\n\t'Pearman',\n\t'Porch',\n\t'Mooneyham',\n\t'Buff',\n\t'Ruben',\n\t'Blanc',\n\t'Mellen',\n\t'Heiman',\n\t'Novack',\n\t'Heston',\n\t'Huie',\n\t'Justin',\n\t'Kincade',\n\t'Laverty',\n\t'Villavicencio',\n\t'Burkart',\n\t'Offutt',\n\t'Halliburton',\n\t'Polo',\n\t'Barbara',\n\t'Trammel',\n\t'Rosati',\n\t'Sakamoto',\n\t'Salo',\n\t'Heyman',\n\t'Rooker',\n\t'Sarno',\n\t'Leroux',\n\t'Virgen',\n\t'Collison',\n\t'Branum',\n\t'Mcmasters',\n\t'Divine',\n\t'Mcnatt',\n\t'Threadgill',\n\t'Desir',\n\t'Borchers',\n\t'Walkup',\n\t'Sy',\n\t'Greenbaum',\n\t'Vidales',\n\t'Mercedes',\n\t'Selph',\n\t'Bardwell',\n\t'Whorton',\n\t'Demartino',\n\t'Endsley',\n\t'Verner',\n\t'Hillier',\n\t'Mancha',\n\t'Ricard',\n\t'Postell',\n\t'Kummer',\n\t'Welsch',\n\t'Almanzar',\n\t'Brunet',\n\t'Deeds',\n\t'Romanowski',\n\t'Ocallaghan',\n\t'Cueto',\n\t'Terhune',\n\t'Truesdell',\n\t'Whisnant',\n\t'Lingo',\n\t'Aden',\n\t'Labrecque',\n\t'Braga',\n\t'Iles',\n\t'Garrick',\n\t'Knickerbocker',\n\t'Rasberry',\n\t'Hervey',\n\t'Schill',\n\t'Kiely',\n\t'Liddle',\n\t'Blakeley',\n\t'Marez',\n\t'Schoonmaker',\n\t'Swinton',\n\t'Fryar',\n\t'Exum',\n\t'Gouge',\n\t'Hoskinson',\n\t'Lupton',\n\t'Guild',\n\t'Davisson',\n\t'Chidester',\n\t'Gravitt',\n\t'Lenox',\n\t'Pyatt',\n\t'Moberg',\n\t'Overholt',\n\t'Whiddon',\n\t'Foti',\n\t'Lipps',\n\t'Shankle',\n\t'Xiao',\n\t'Balentine',\n\t'Cesar',\n\t'Barreras',\n\t'Schroer',\n\t'Ram',\n\t'Eames',\n\t'Gutman',\n\t'Pardee',\n\t'Damiano',\n\t'Houchin',\n\t'Porto',\n\t'Leclerc',\n\t'Mahaney',\n\t'Deardorff',\n\t'Garey',\n\t'Trotta',\n\t'Lachapelle',\n\t'Suiter',\n\t'Ewert',\n\t'Costner',\n\t'Bever',\n\t'Charpentier',\n\t'Milewski',\n\t'Coffelt',\n\t'Schorr',\n\t'Leis',\n\t'Dasher',\n\t'Cullins',\n\t'Eveland',\n\t'Hornung',\n\t'Swingle',\n\t'Eudy',\n\t'Motter',\n\t'Silk',\n\t'Gadd',\n\t'Sidwell',\n\t'Sandusky',\n\t'Auld',\n\t'Mazariegos',\n\t'Hirt',\n\t'Zane',\n\t'Rickett',\n\t'Ritenour',\n\t'Goin',\n\t'Dipaolo',\n\t'Wolfgang',\n\t'Inouye',\n\t'Branton',\n\t'Rakestraw',\n\t'Kimbro',\n\t'Craighead',\n\t'Sandefur',\n\t'Foerster',\n\t'Wipf',\n\t'Wilkin',\n\t'Shoffner',\n\t'Overcash',\n\t'Simonetti',\n\t'Toomer',\n\t'Albino',\n\t'Eshelman',\n\t'Rockwood',\n\t'Pineiro',\n\t'Reames',\n\t'Cray',\n\t'Wulff',\n\t'Heider',\n\t'Bath',\n\t'Colletti',\n\t'Fiala',\n\t'Greenstein',\n\t'Moles',\n\t'Bashaw',\n\t'Adamczyk',\n\t'Finkel',\n\t'Kistner',\n\t'Manzi',\n\t'Ferretti',\n\t'Demarest',\n\t'Ahlers',\n\t'Lack',\n\t'Wedel',\n\t'Kinzer',\n\t'Sechrist',\n\t'Stickler',\n\t'Easterday',\n\t'Mallette',\n\t'Loehr',\n\t'Gessner',\n\t'Croce',\n\t'Stanko',\n\t'Innes',\n\t'Farfan',\n\t'Heady',\n\t'Chambless',\n\t'Balbuena',\n\t'Decicco',\n\t'Winsor',\n\t'Pereyra',\n\t'Zoller',\n\t'Ingles',\n\t'Churchwell',\n\t'Westlake',\n\t'Villagran',\n\t'Soderberg',\n\t'Thill',\n\t'Timmer',\n\t'Mccaleb',\n\t'Mckernan',\n\t'Vandergriff',\n\t'Yoho',\n\t'Crispin',\n\t'Dorton',\n\t'Fults',\n\t'Borne',\n\t'Maxie',\n\t'Bloomquist',\n\t'Kung',\n\t'Budde',\n\t'Weinstock',\n\t'Honey',\n\t'Diener',\n\t'Horak',\n\t'Tsui',\n\t'Zirkle',\n\t'Plum',\n\t'Heitz',\n\t'Manrique',\n\t'Balcom',\n\t'Napper',\n\t'Boese',\n\t'Stefan',\n\t'Kime',\n\t'Gautreaux',\n\t'Leverette',\n\t'Lemaire',\n\t'Danford',\n\t'Hollman',\n\t'Kuzma',\n\t'Swinehart',\n\t'Merriam',\n\t'Novick',\n\t'Stankiewicz',\n\t'Parkes',\n\t'Englehart',\n\t'Polansky',\n\t'Leclaire',\n\t'Magner',\n\t'Masson',\n\t'Mass',\n\t'Coogan',\n\t'Jepsen',\n\t'Pittenger',\n\t'Bump',\n\t'Hain',\n\t'Burchell',\n\t'Chesley',\n\t'Cawthon',\n\t'Dance',\n\t'Piccolo',\n\t'Lucey',\n\t'Ordway',\n\t'Recio',\n\t'Ginther',\n\t'Hauge',\n\t'Lesperance',\n\t'Suhr',\n\t'Ding',\n\t'Ogg',\n\t'Skiba',\n\t'Scannell',\n\t'Gillies',\n\t'Brame',\n\t'Schipper',\n\t'Brune',\n\t'Stuber',\n\t'Pesce',\n\t'Stead',\n\t'Bushong',\n\t'Juneau',\n\t'Mccalla',\n\t'Feder',\n\t'Plaisance',\n\t'Tweed',\n\t'Hashimoto',\n\t'Mounce',\n\t'Diana',\n\t'Savala',\n\t'Vanek',\n\t'Lamson',\n\t'Dubin',\n\t'Killebrew',\n\t'Kan',\n\t'Nault',\n\t'Mulford',\n\t'Salamanca',\n\t'Linker',\n\t'Penrose',\n\t'Kowalewski',\n\t'Platz',\n\t'Kogan',\n\t'Martucci',\n\t'Gutowski',\n\t'Mattes',\n\t'Haigh',\n\t'Merida',\n\t'Ashman',\n\t'Batton',\n\t'Biondo',\n\t'Sweigart',\n\t'Sorg',\n\t'Barrier',\n\t'Gatling',\n\t'Geib',\n\t'Henrich',\n\t'Dabrowski',\n\t'Vara',\n\t'Weikel',\n\t'Jarosz',\n\t'Mummert',\n\t'Uriarte',\n\t'Fifield',\n\t'Locker',\n\t'Merlo',\n\t'Lasater',\n\t'Ripple',\n\t'Hopwood',\n\t'Sherrell',\n\t'Ruark',\n\t'Litz',\n\t'Kinkade',\n\t'Simkins',\n\t'Grandy',\n\t'Lemasters',\n\t'Wehr',\n\t'Jinks',\n\t'Alas',\n\t'Bale',\n\t'Stimpson',\n\t'Glickman',\n\t'Hage',\n\t'Seabrook',\n\t'Stirling',\n\t'Rozell',\n\t'Woodburn',\n\t'Braaten',\n\t'Sugg',\n\t'Linde',\n\t'Castille',\n\t'Grewal',\n\t'Blackwelder',\n\t'Hover',\n\t'Spurling',\n\t'Mckellar',\n\t'Muench',\n\t'Bovee',\n\t'Amado',\n\t'Yau',\n\t'Harger',\n\t'Lederer',\n\t'Seda',\n\t'Doney',\n\t'Kimes',\n\t'Western',\n\t'Foret',\n\t'Luera',\n\t'Warnke',\n\t'Bussard',\n\t'Cartier',\n\t'Andreasen',\n\t'Lagasse',\n\t'Topper',\n\t'Nyman',\n\t'Hallberg',\n\t'Whisman',\n\t'Cremeans',\n\t'Dewar',\n\t'Garrow',\n\t'Odaniel',\n\t'Stabler',\n\t'Bourg',\n\t'Appling',\n\t'Dahlstrom',\n\t'Fujimoto',\n\t'Prudhomme',\n\t'Gum',\n\t'Nau',\n\t'Hiers',\n\t'Rockett',\n\t'Sobczak',\n\t'Traub',\n\t'Bevis',\n\t'Tilghman',\n\t'Plasencia',\n\t'Sison',\n\t'Blau',\n\t'Abbate',\n\t'Sisler',\n\t'Rudder',\n\t'Trotman',\n\t'Brust',\n\t'Lederman',\n\t'Frahm',\n\t'Fredette',\n\t'Parise',\n\t'Urso',\n\t'Amann',\n\t'Kaul',\n\t'Woolery',\n\t'Thielen',\n\t'Symonds',\n\t'Marcy',\n\t'Wiltshire',\n\t'Sustaita',\n\t'Botkin',\n\t'Kernan',\n\t'Doolin',\n\t'Babineaux',\n\t'Greenspan',\n\t'Delacerda',\n\t'Kinnard',\n\t'Twitty',\n\t'Augustus',\n\t'Corriveau',\n\t'Stults',\n\t'Toman',\n\t'Sklar',\n\t'Leber',\n\t'Considine',\n\t'Ohearn',\n\t'Deforest',\n\t'Mcmann',\n\t'Farquhar',\n\t'Ferrel',\n\t'Bickley',\n\t'Manno',\n\t'Vreeland',\n\t'Berthiaume',\n\t'Mcentee',\n\t'Summerfield',\n\t'Woodrow',\n\t'Reynaga',\n\t'Soltero',\n\t'Tomko',\n\t'Jarboe',\n\t'Allmon',\n\t'Duplessis',\n\t'Sydnor',\n\t'Diallo',\n\t'Cogar',\n\t'Mandeville',\n\t'Shimizu',\n\t'Aubuchon',\n\t'Gabbert',\n\t'Ashlock',\n\t'Macri',\n\t'Weng',\n\t'Walser',\n\t'Teng',\n\t'Bailon',\n\t'Steeves',\n\t'Perillo',\n\t'Quattlebaum',\n\t'Knipp',\n\t'Delavega',\n\t'Kirtley',\n\t'Bramble',\n\t'Sublett',\n\t'Borchert',\n\t'Doria',\n\t'Session',\n\t'Merced',\n\t'Lundstrom',\n\t'Bluhm',\n\t'Cortinas',\n\t'Proper',\n\t'Sieber',\n\t'Mccay',\n\t'Wilford',\n\t'Asberry',\n\t'Muldrow',\n\t'Berning',\n\t'Hemenway',\n\t'Millman',\n\t'Ewers',\n\t'Timko',\n\t'Reding',\n\t'Sayer',\n\t'Pickel',\n\t'Cogburn',\n\t'Chappel',\n\t'Custodio',\n\t'Reichel',\n\t'Robeson',\n\t'Waid',\n\t'Wagler',\n\t'Sappington',\n\t'Bart',\n\t'Zazueta',\n\t'Najar',\n\t'Marko',\n\t'Nally',\n\t'States',\n\t'Bellard',\n\t'Marciano',\n\t'Killough',\n\t'Cosper',\n\t'Sangster',\n\t'Heinze',\n\t'Bortz',\n\t'Matamoros',\n\t'Nuckols',\n\t'Townsley',\n\t'Bak',\n\t'Ralls',\n\t'Ferrin',\n\t'Villela',\n\t'Siegrist',\n\t'Arora',\n\t'Collinsworth',\n\t'Masten',\n\t'Deer',\n\t'Balog',\n\t'Buchman',\n\t'Scaggs',\n\t'Holeman',\n\t'Lefkowitz',\n\t'Santora',\n\t'Funke',\n\t'Redfield',\n\t'Douthit',\n\t'Marciniak',\n\t'Twitchell',\n\t'Sheahan',\n\t'Dai',\n\t'Demuth',\n\t'Ganz',\n\t'Bruckner',\n\t'Wier',\n\t'Alamo',\n\t'Aultman',\n\t'Chubb',\n\t'Branco',\n\t'Courter',\n\t'Vivian',\n\t'Guin',\n\t'Witten',\n\t'Glen',\n\t'Hyer',\n\t'Crowson',\n\t'Arendt',\n\t'Cipolla',\n\t'Prochaska',\n\t'Schober',\n\t'Harte',\n\t'Arciniega',\n\t'Beier',\n\t'Middlebrook',\n\t'Dennard',\n\t'Vantassel',\n\t'Weekes',\n\t'Penley',\n\t'Lozier',\n\t'Lamberson',\n\t'Broomfield',\n\t'Nygaard',\n\t'Pascale',\n\t'Hyden',\n\t'Mundell',\n\t'Kamara',\n\t'Ehlert',\n\t'Mangus',\n\t'Bornstein',\n\t'Benedetti',\n\t'Erikson',\n\t'Quint',\n\t'Westman',\n\t'Basler',\n\t'Smoak',\n\t'Leavell',\n\t'Kerber',\n\t'Kopec',\n\t'Emrick',\n\t'Mattice',\n\t'Render',\n\t'Mccree',\n\t'Feldmann',\n\t'Cutright',\n\t'Randell',\n\t'Drucker',\n\t'Gilmour',\n\t'Marconi',\n\t'Stripling',\n\t'Mucha',\n\t'Shipe',\n\t'Chalk',\n\t'Martone',\n\t'Lema',\n\t'Ricardo',\n\t'Cobian',\n\t'Laufer',\n\t'Mistretta',\n\t'Shortt',\n\t'Menzel',\n\t'Wickline',\n\t'Oddo',\n\t'Chai',\n\t'Rabideau',\n\t'Stogner',\n\t'Mckie',\n\t'Luongo',\n\t'Trieu',\n\t'Breshears',\n\t'Sturdevant',\n\t'Abernethy',\n\t'Rohan',\n\t'Bonnette',\n\t'Steffes',\n\t'Straka',\n\t'Lawhon',\n\t'Shawver',\n\t'Guilford',\n\t'Wiltz',\n\t'Digregorio',\n\t'Warburton',\n\t'Fleshman',\n\t'Kerstetter',\n\t'Byram',\n\t'Obannon',\n\t'Dalessio',\n\t'Gatti',\n\t'Kalb',\n\t'Boris',\n\t'Graver',\n\t'Parkins',\n\t'Kollar',\n\t'Crothers',\n\t'Patin',\n\t'Cutshall',\n\t'Fern',\n\t'Derosier',\n\t'Goodrum',\n\t'Kaelin',\n\t'Baynes',\n\t'Beesley',\n\t'Macintyre',\n\t'Butters',\n\t'Kinsman',\n\t'Huffer',\n\t'Eslinger',\n\t'Prunty',\n\t'Boehmer',\n\t'Nusbaum',\n\t'Gouveia',\n\t'Mire',\n\t'Mccary',\n\t'Mikell',\n\t'Petrovich',\n\t'Melillo',\n\t'Kennelly',\n\t'Howley',\n\t'Merwin',\n\t'Cotner',\n\t'Kanter',\n\t'Sahagun',\n\t'Bodden',\n\t'Mcconville',\n\t'Leddy',\n\t'Auten',\n\t'Downie',\n\t'Armistead',\n\t'Goudy',\n\t'Gerhard',\n\t'Theiss',\n\t'Lauria',\n\t'Tuthill',\n\t'Ammon',\n\t'Ikeda',\n\t'Schultheis',\n\t'Zhong',\n\t'Pearcy',\n\t'Vass',\n\t'Essary',\n\t'Wendland',\n\t'Zehr',\n\t'Hartigan',\n\t'Ugalde',\n\t'Mossman',\n\t'Hartwick',\n\t'Joaquin',\n\t'Andreas',\n\t'Bartee',\n\t'Gajewski',\n\t'Gallaway',\n\t'Comerford',\n\t'Lieber',\n\t'Wireman',\n\t'Damm',\n\t'Yousif',\n\t'Kosinski',\n\t'Kelm',\n\t'Durrant',\n\t'Derouen',\n\t'Bonk',\n\t'Rubalcaba',\n\t'Opperman',\n\t'Decamp',\n\t'Fairfield',\n\t'Pauls',\n\t'Dicicco',\n\t'Northup',\n\t'Woerner',\n\t'Stegman',\n\t'Ritch',\n\t'Bedoya',\n\t'Jeanpierre',\n\t'Rioux',\n\t'Strohl',\n\t'Herrell',\n\t'Simonton',\n\t'Carriere',\n\t'Pridemore',\n\t'Karam',\n\t'Marple',\n\t'Topp',\n\t'Heiden',\n\t'Leibowitz',\n\t'Morabito',\n\t'Junker',\n\t'Calixto',\n\t'Hardt',\n\t'Silverio',\n\t'Swords',\n\t'Rickey',\n\t'Roussel',\n\t'Earles',\n\t'Bastien',\n\t'Defilippo',\n\t'Bigley',\n\t'Mosteller',\n\t'Issa',\n\t'Prout',\n\t'Grossi',\n\t'Bartos',\n\t'Lipman',\n\t'Colegrove',\n\t'Stpeter',\n\t'Vanfleet',\n\t'Fordyce',\n\t'Risher',\n\t'Royston',\n\t'Shoulders',\n\t'Mendel',\n\t'Statler',\n\t'Dantonio',\n\t'Inglis',\n\t'Fogleman',\n\t'Loveday',\n\t'Straus',\n\t'Luft',\n\t'Dam',\n\t'Chewning',\n\t'Winkel',\n\t'Bousquet',\n\t'Eckhart',\n\t'Dillinger',\n\t'Locascio',\n\t'Shellenberger',\n\t'Duerr',\n\t'Alcocer',\n\t'Licht',\n\t'Gingras',\n\t'Grassi',\n\t'Gately',\n\t'Padula',\n\t'Brien',\n\t'Nimmo',\n\t'Nell',\n\t'Bondurant',\n\t'Hughley',\n\t'Schalk',\n\t'Cabrales',\n\t'Heinemann',\n\t'Meunier',\n\t'Maddock',\n\t'Noone',\n\t'Brackin',\n\t'Dunnigan',\n\t'Sargeant',\n\t'Kinchen',\n\t'Veras',\n\t'Gile',\n\t'Bacchus',\n\t'Ang',\n\t'Cowgill',\n\t'Currey',\n\t'Garlick',\n\t'Manus',\n\t'Ballance',\n\t'Robitaille',\n\t'Begin',\n\t'Mijares',\n\t'Keogh',\n\t'Wicklund',\n\t'Mccurley',\n\t'Truett',\n\t'Pullin',\n\t'Alkire',\n\t'Loughran',\n\t'Mort',\n\t'Tatman',\n\t'Wanamaker',\n\t'Haralson',\n\t'Harrah',\n\t'Stucker',\n\t'Reda',\n\t'Pascal',\n\t'Holter',\n\t'Solares',\n\t'Bruck',\n\t'Mah',\n\t'Didomenico',\n\t'Korth',\n\t'Virgil',\n\t'Nishimura',\n\t'Vacca',\n\t'Stenberg',\n\t'Tomczak',\n\t'Sayler',\n\t'Chasse',\n\t'Blazer',\n\t'Sleeper',\n\t'Doiron',\n\t'Nunnery',\n\t'Ortman',\n\t'Maag',\n\t'Cali',\n\t'Ferrera',\n\t'Hotaling',\n\t'Festa',\n\t'Murr',\n\t'Sterrett',\n\t'Cuthbert',\n\t'Clayborn',\n\t'Pendergraft',\n\t'Yoakum',\n\t'Baily',\n\t'Overbey',\n\t'Warne',\n\t'Hokanson',\n\t'Tafolla',\n\t'Puglisi',\n\t'Wooster',\n\t'Nassar',\n\t'Lesniak',\n\t'Noack',\n\t'Beres',\n\t'Liberatore',\n\t'Guyette',\n\t'Duffin',\n\t'Ishmael',\n\t'Dolezal',\n\t'Larimer',\n\t'Musso',\n\t'Borman',\n\t'Deemer',\n\t'Hobgood',\n\t'Triggs',\n\t'Mau',\n\t'Wainscott',\n\t'Seth',\n\t'Hodnett',\n\t'Mckeehan',\n\t'Toon',\n\t'Evens',\n\t'Drost',\n\t'Roehl',\n\t'Trapani',\n\t'Bains',\n\t'Modica',\n\t'Arcos',\n\t'Knopf',\n\t'Salvo',\n\t'Garlock',\n\t'Lounsbury',\n\t'Hennen',\n\t'Drescher',\n\t'Morgenstern',\n\t'Studebaker',\n\t'Nordin',\n\t'Madore',\n\t'Joslyn',\n\t'Brousseau',\n\t'Addy',\n\t'Audette',\n\t'Santibanez',\n\t'Sauers',\n\t'Engelman',\n\t'Mauney',\n\t'Arechiga',\n\t'Eckel',\n\t'Jerry',\n\t'Pernell',\n\t'Sedlacek',\n\t'Mcnary',\n\t'Loewen',\n\t'Eyler',\n\t'Feather',\n\t'Mckinnie',\n\t'Bowersox',\n\t'Laclair',\n\t'Melby',\n\t'Thoman',\n\t'Hose',\n\t'Carmon',\n\t'Bartram',\n\t'Berggren',\n\t'Rogge',\n\t'Seto',\n\t'Court',\n\t'Deskins',\n\t'Barcus',\n\t'Putt',\n\t'Minick',\n\t'Durgin',\n\t'Hockman',\n\t'Keltner',\n\t'Legaspi',\n\t'Wallach',\n\t'Ranney',\n\t'Borger',\n\t'Wakeman',\n\t'Schoolcraft',\n\t'Souther',\n\t'Villani',\n\t'Sauder',\n\t'Chupp',\n\t'Slover',\n\t'Faul',\n\t'Degroat',\n\t'Hakim',\n\t'Brucker',\n\t'Moylan',\n\t'Castilleja',\n\t'Whetzel',\n\t'Eanes',\n\t'Brouwer',\n\t'Okelley',\n\t'Crimmins',\n\t'Bargas',\n\t'Jo',\n\t'Clover',\n\t'Adan',\n\t'Domingues',\n\t'Yelton',\n\t'Lobdell',\n\t'Mattis',\n\t'Escudero',\n\t'Pentecost',\n\t'Riser',\n\t'Lorentz',\n\t'Neace',\n\t'Caplinger',\n\t'Lipe',\n\t'Satterlee',\n\t'Labarbera',\n\t'Cullison',\n\t'Goggin',\n\t'Coke',\n\t'Keo',\n\t'Buckmaster',\n\t'Holtzclaw',\n\t'Lustig',\n\t'Ellinger',\n\t'Lollar',\n\t'Cork',\n\t'Mccrae',\n\t'Hilario',\n\t'Yawn',\n\t'Arnette',\n\t'Yuhas',\n\t'Wardle',\n\t'Pixley',\n\t'Leflore',\n\t'Fluker',\n\t'Krier',\n\t'Wind',\n\t'Ditto',\n\t'Rorie',\n\t'Ensminger',\n\t'Hunsucker',\n\t'Levenson',\n\t'Millington',\n\t'Gorsuch',\n\t'Willems',\n\t'Fredricks',\n\t'Agarwal',\n\t'Lariviere',\n\t'Don',\n\t'Chery',\n\t'Pfeil',\n\t'Wurtz',\n\t'Remillard',\n\t'Cozad',\n\t'Hodgkins',\n\t'Cohan',\n\t'Nurse',\n\t'Espana',\n\t'Giguere',\n\t'Hoskin',\n\t'Pettaway',\n\t'Keifer',\n\t'Yandell',\n\t'Frandsen',\n\t'Nawrocki',\n\t'Vila',\n\t'Pouliot',\n\t'Boulanger',\n\t'Pruden',\n\t'Strauch',\n\t'Lua',\n\t'Rohn',\n\t'Greig',\n\t'Lightsey',\n\t'Etheredge',\n\t'Hara',\n\t'Ensign',\n\t'Ruckman',\n\t'Senecal',\n\t'Sedgwick',\n\t'Maciejewski',\n\t'Morningstar',\n\t'Creswell',\n\t'Britten',\n\t'Godley',\n\t'Laubach',\n\t'Schwenk',\n\t'Hayhurst',\n\t'Cammarata',\n\t'Paxson',\n\t'Mcmurtry',\n\t'Marasco',\n\t'Weatherby',\n\t'Fales',\n\t'Fondren',\n\t'Deherrera',\n\t'Gaydos',\n\t'Defranco',\n\t'Bjorklund',\n\t'Silberman',\n\t'Maxon',\n\t'Rockey',\n\t'Brass',\n\t'Marcoux',\n\t'Marquette',\n\t'Marcello',\n\t'Veit',\n\t'Debose',\n\t'Cloninger',\n\t'Puccio',\n\t'Greenman',\n\t'Bross',\n\t'Lile',\n\t'Behan',\n\t'Plumlee',\n\t'Hampson',\n\t'Steverson',\n\t'Wininger',\n\t'Mcmullan',\n\t'Jude',\n\t'Sharif',\n\t'Rothermel',\n\t'Becher',\n\t'Keithley',\n\t'Gargano',\n\t'Morillo',\n\t'Dumond',\n\t'Johannsen',\n\t'Baney',\n\t'Lipton',\n\t'Railey',\n\t'Clowers',\n\t'Rotondo',\n\t'Simeone',\n\t'Hatt',\n\t'Schexnayder',\n\t'Snoddy',\n\t'Gelinas',\n\t'Mendelson',\n\t'Matherly',\n\t'Klock',\n\t'Clubb',\n\t'Dunkley',\n\t'Rosenzweig',\n\t'Chuang',\n\t'Gines',\n\t'Galasso',\n\t'Helland',\n\t'Rohrbaugh',\n\t'Avilez',\n\t'Czajkowski',\n\t'Olsson',\n\t'Lumsden',\n\t'Birt',\n\t'Ortego',\n\t'Acuff',\n\t'Yetter',\n\t'Tichenor',\n\t'Mork',\n\t'Skillman',\n\t'Row',\n\t'Lollis',\n\t'Wolk',\n\t'Demott',\n\t'Lazenby',\n\t'Bellew',\n\t'Brickner',\n\t'Ragusa',\n\t'Stice',\n\t'Herlihy',\n\t'Guillermo',\n\t'Estabrook',\n\t'Montijo',\n\t'Jenner',\n\t'Rayfield',\n\t'Donlon',\n\t'Greenhalgh',\n\t'Alberti',\n\t'Rix',\n\t'Holthaus',\n\t'Mistry',\n\t'Ruzicka',\n\t'Sievert',\n\t'Koopman',\n\t'Kalish',\n\t'Kehl',\n\t'Ponte',\n\t'Varnell',\n\t'Guss',\n\t'Kovac',\n\t'Hosmer',\n\t'Scrivner',\n\t'Tomblin',\n\t'Villafuerte',\n\t'Branscum',\n\t'Nitz',\n\t'Reider',\n\t'Gaunt',\n\t'Richerson',\n\t'Hemmer',\n\t'Vinyard',\n\t'Barrie',\n\t'Manalo',\n\t'Flynt',\n\t'Cadle',\n\t'Hau',\n\t'Uy',\n\t'Manfredi',\n\t'Deeter',\n\t'Resto',\n\t'Carnell',\n\t'Drane',\n\t'Cusumano',\n\t'Fein',\n\t'Schneck',\n\t'Stucky',\n\t'Heid',\n\t'Bruggeman',\n\t'Schweiger',\n\t'Vanetten',\n\t'Munsey',\n\t'Kiker',\n\t'Whittier',\n\t'Seeman',\n\t'Zerbe',\n\t'Hillyer',\n\t'Burkhead',\n\t'Gafford',\n\t'Gephart',\n\t'Braman',\n\t'Plott',\n\t'Henriques',\n\t'Coppock',\n\t'Mcandrews',\n\t'Valtierra',\n\t'Dileo',\n\t'Stiner',\n\t'Mikel',\n\t'Owensby',\n\t'Gupton',\n\t'Scurlock',\n\t'Gittens',\n\t'Degnan',\n\t'Guillaume',\n\t'Helmuth',\n\t'Nolin',\n\t'Mair',\n\t'Bergeson',\n\t'Paik',\n\t'Kinne',\n\t'Goodloe',\n\t'Nakagawa',\n\t'Raposo',\n\t'Defreitas',\n\t'Korb',\n\t'Hinkel',\n\t'Magers',\n\t'Althoff',\n\t'Rafael',\n\t'Akhtar',\n\t'Cashion',\n\t'Mcquillan',\n\t'Patricio',\n\t'Sweeny',\n\t'Meaux',\n\t'Tyre',\n\t'Demeo',\n\t'Trivedi',\n\t'Goodfellow',\n\t'Dunleavy',\n\t'Middaugh',\n\t'Barbato',\n\t'Pasco',\n\t'Harland',\n\t'Shorts',\n\t'Mowrey',\n\t'Dempster',\n\t'Knuckles',\n\t'Luebke',\n\t'Petrella',\n\t'Retana',\n\t'Licea',\n\t'Rundle',\n\t'Cape',\n\t'Lou',\n\t'Mcconkey',\n\t'Leeman',\n\t'Cabe',\n\t'Timothy',\n\t'Crochet',\n\t'Fulgham',\n\t'Glasco',\n\t'Backes',\n\t'Konopka',\n\t'Mcquaid',\n\t'Schley',\n\t'Abrahams',\n\t'Dahlin',\n\t'Iversen',\n\t'Chico',\n\t'Huffaker',\n\t'Modlin',\n\t'Laduke',\n\t'Marquart',\n\t'Motz',\n\t'Keech',\n\t'Louviere',\n\t'Como',\n\t'Fye',\n\t'Brightwell',\n\t'Yamashita',\n\t'Desrochers',\n\t'Richer',\n\t'Bourke',\n\t'Broadhead',\n\t'Pink',\n\t'Okamoto',\n\t'Chicas',\n\t'Vanatta',\n\t'Shick',\n\t'Furst',\n\t'Layfield',\n\t'Mcewan',\n\t'Baumgart',\n\t'Kappel',\n\t'Kucharski',\n\t'Quam',\n\t'Taub',\n\t'Houghtaling',\n\t'Sundquist',\n\t'Monks',\n\t'Wake',\n\t'Quiros',\n\t'Pursell',\n\t'Johansson',\n\t'Talkington',\n\t'Bast',\n\t'Stimson',\n\t'Hakes',\n\t'Loe',\n\t'Caggiano',\n\t'Schaper',\n\t'Chandra',\n\t'Tuma',\n\t'Arledge',\n\t'Romain',\n\t'Hornick',\n\t'Bridgman',\n\t'Livingstone',\n\t'Potvin',\n\t'Sparling',\n\t'Hause',\n\t'Trosclair',\n\t'Pless',\n\t'Szeto',\n\t'Clontz',\n\t'Lauber',\n\t'Detrick',\n\t'Dominique',\n\t'Mosser',\n\t'Degraff',\n\t'Liner',\n\t'Fleet',\n\t'Czerwinski',\n\t'Kopf',\n\t'Kovar',\n\t'Sheedy',\n\t'Zaremba',\n\t'Mina',\n\t'Sweeten',\n\t'Ou',\n\t'Musto',\n\t'Hennig',\n\t'Bangs',\n\t'Pasternak',\n\t'Berrier',\n\t'Smidt',\n\t'Brayton',\n\t'Claytor',\n\t'Ellerbe',\n\t'Reiman',\n\t'Larimore',\n\t'Ratzlaff',\n\t'Mudge',\n\t'Ni',\n\t'Spillers',\n\t'Cuomo',\n\t'Gerke',\n\t'Polizzi',\n\t'Harmer',\n\t'Apperson',\n\t'Regis',\n\t'Ugarte',\n\t'Paull',\n\t'Lagrange',\n\t'Dinwiddie',\n\t'Becton',\n\t'Gadsden',\n\t'Conforti',\n\t'Desoto',\n\t'Orme',\n\t'Filer',\n\t'Viers',\n\t'Lares',\n\t'Stair',\n\t'Hipps',\n\t'Kaneshiro',\n\t'Ladson',\n\t'Altizer',\n\t'Montejano',\n\t'Scalzo',\n\t'Sowder',\n\t'Ebeling',\n\t'Faucher',\n\t'Dicken',\n\t'Sartor',\n\t'Mcnerney',\n\t'Stage',\n\t'Mika',\n\t'Hice',\n\t'Grinstead',\n\t'Bartsch',\n\t'Mccumber',\n\t'Lenahan',\n\t'Liska',\n\t'Tietz',\n\t'Gauna',\n\t'Janda',\n\t'Bellis',\n\t'Shew',\n\t'Kelton',\n\t'Doby',\n\t'Golson',\n\t'Plaster',\n\t'Gonsales',\n\t'Krone',\n\t'Lape',\n\t'Lowrie',\n\t'Polly',\n\t'Gerardi',\n\t'Lamoreaux',\n\t'Bhatti',\n\t'Kimsey',\n\t'Buhl',\n\t'Arvin',\n\t'Gillian',\n\t'Benbow',\n\t'Roesler',\n\t'Stlaurent',\n\t'Canon',\n\t'Swihart',\n\t'Corea',\n\t'Petitt',\n\t'Spates',\n\t'Nappi',\n\t'Sebring',\n\t'Smelser',\n\t'Eckenrode',\n\t'Palos',\n\t'Disanto',\n\t'Tabares',\n\t'Okane',\n\t'Easterly',\n\t'Dendy',\n\t'Whigham',\n\t'Bednarz',\n\t'Wedge',\n\t'Edelen',\n\t'Stiff',\n\t'Borjas',\n\t'Obando',\n\t'Mcspadden',\n\t'Breed',\n\t'Dismuke',\n\t'Jarmon',\n\t'Serpa',\n\t'Lucky',\n\t'Cournoyer',\n\t'Hedberg',\n\t'Martine',\n\t'Michell',\n\t'Wittig',\n\t'Clodfelter',\n\t'Davids',\n\t'Gattis',\n\t'Kull',\n\t'Mascorro',\n\t'Schad',\n\t'Rine',\n\t'Bradburn',\n\t'Marie',\n\t'Czech',\n\t'Sunderman',\n\t'Wickersham',\n\t'Toohey',\n\t'Capozzi',\n\t'Poplin',\n\t'Markland',\n\t'Brosnan',\n\t'Fetterman',\n\t'Heiss',\n\t'Haglund',\n\t'Jourdan',\n\t'Turnipseed',\n\t'Tiernan',\n\t'Horrocks',\n\t'Barnhardt',\n\t'Sing',\n\t'Belford',\n\t'Baumgarten',\n\t'Klee',\n\t'Degeorge',\n\t'Caulder',\n\t'Gladstone',\n\t'Dancer',\n\t'Satchell',\n\t'Vento',\n\t'Larock',\n\t'Kimberly',\n\t'Hunn',\n\t'Harvin',\n\t'Krahn',\n\t'Ogorman',\n\t'Storch',\n\t'Coomes',\n\t'Bevilacqua',\n\t'Crotts',\n\t'Schillinger',\n\t'Morelock',\n\t'Hayworth',\n\t'Avis',\n\t'Cranmer',\n\t'Getchell',\n\t'Tena',\n\t'Buzzell',\n\t'Widman',\n\t'Barter',\n\t'Lafayette',\n\t'Asencio',\n\t'Embree',\n\t'Krell',\n\t'Siders',\n\t'Fuselier',\n\t'Whitby',\n\t'Elsner',\n\t'Pando',\n\t'Surface',\n\t'Rolf',\n\t'Highland',\n\t'Bufford',\n\t'Scheidt',\n\t'Defrancesco',\n\t'Fellers',\n\t'Carrol',\n\t'Germano',\n\t'Licon',\n\t'Hilty',\n\t'Ringo',\n\t'Dowler',\n\t'Glowacki',\n\t'Slabaugh',\n\t'Tomasello',\n\t'Messing',\n\t'Lavalle',\n\t'Milo',\n\t'Frerichs',\n\t'Plotkin',\n\t'Ziolkowski',\n\t'Gentle',\n\t'Knobloch',\n\t'Larochelle',\n\t'Duell',\n\t'Hurdle',\n\t'Speller',\n\t'Ceasar',\n\t'Vinci',\n\t'Mosquera',\n\t'Wyse',\n\t'Towler',\n\t'Ayoub',\n\t'Gullickson',\n\t'Spade',\n\t'Forshee',\n\t'Cliff',\n\t'Gholson',\n\t'Reichenbach',\n\t'Lockman',\n\t'Morones',\n\t'Storie',\n\t'Bissett',\n\t'Janney',\n\t'Durocher',\n\t'Fentress',\n\t'Troiano',\n\t'Boes',\n\t'Rouleau',\n\t'Rall',\n\t'Sultan',\n\t'Braggs',\n\t'Bethke',\n\t'Schacht',\n\t'Straley',\n\t'Mcfalls',\n\t'Fahy',\n\t'Winegar',\n\t'Gorecki',\n\t'Rudnick',\n\t'Wigginton',\n\t'Dedrick',\n\t'Sthilaire',\n\t'Lovette',\n\t'Hanneman',\n\t'Loch',\n\t'Moores',\n\t'Polen',\n\t'Anchondo',\n\t'Rosato',\n\t'Tindell',\n\t'Hunsicker',\n\t'Penna',\n\t'Privette',\n\t'Gayton',\n\t'Sliger',\n\t'Wink',\n\t'Brummer',\n\t'Crown',\n\t'Sommerville',\n\t'Mastrangelo',\n\t'Latimore',\n\t'Merlino',\n\t'Thoreson',\n\t'Kleiner',\n\t'Able',\n\t'Boose',\n\t'Loyola',\n\t'Jimenes',\n\t'Lapham',\n\t'Srinivasan',\n\t'Hammers',\n\t'Mo',\n\t'Evert',\n\t'Vanslyke',\n\t'Caywood',\n\t'Gremillion',\n\t'Rauscher',\n\t'Eckhoff',\n\t'Dearth',\n\t'Sinha',\n\t'Becerril',\n\t'Tuten',\n\t'Greenwalt',\n\t'Curlee',\n\t'Burgan',\n\t'Feagin',\n\t'Gallman',\n\t'Germann',\n\t'Swensen',\n\t'Vanallen',\n\t'Bissonnette',\n\t'Stoudt',\n\t'Handler',\n\t'Tanguay',\n\t'Lovins',\n\t'Smotherman',\n\t'Cutts',\n\t'Herod',\n\t'Maclin',\n\t'Arcuri',\n\t'Hackbarth',\n\t'Breazeale',\n\t'Rainville',\n\t'Crick',\n\t'Macintosh',\n\t'Bloss',\n\t'Fridley',\n\t'Stefanski',\n\t'Beauvais',\n\t'Koop',\n\t'Andes',\n\t'Blomberg',\n\t'Vallee',\n\t'Lanigan',\n\t'Blouin',\n\t'Rochon',\n\t'Dorazio',\n\t'Drouin',\n\t'Lamonica',\n\t'Wilbourn',\n\t'Spraggins',\n\t'Rieder',\n\t'Shugart',\n\t'Chacko',\n\t'Rutan',\n\t'Nutting',\n\t'Lawley',\n\t'Landy',\n\t'January',\n\t'Blowers',\n\t'Handel',\n\t'Doman',\n\t'Swiney',\n\t'Ettinger',\n\t'Jellison',\n\t'Veilleux',\n\t'Wiens',\n\t'Raimondi',\n\t'Spink',\n\t'Emond',\n\t'Yale',\n\t'Rachel',\n\t'Alldredge',\n\t'Lach',\n\t'Morlan',\n\t'Wayland',\n\t'Colquitt',\n\t'Gabrielson',\n\t'Mccarver',\n\t'Frances',\n\t'Granville',\n\t'Costigan',\n\t'Preuss',\n\t'Lentini',\n\t'Vansant',\n\t'Mosca',\n\t'Connally',\n\t'Frei',\n\t'Laplant',\n\t'Lago',\n\t'Leiter',\n\t'Trumbull',\n\t'Shaeffer',\n\t'Gongora',\n\t'Coady',\n\t'Fyffe',\n\t'Mance',\n\t'Worcester',\n\t'Zehner',\n\t'Bodie',\n\t'Burnes',\n\t'Pompey',\n\t'Teitelbaum',\n\t'Beaupre',\n\t'Visconti',\n\t'Mumma',\n\t'Markiewicz',\n\t'Piscitelli',\n\t'Moak',\n\t'Bourland',\n\t'Pennock',\n\t'Hannum',\n\t'Robichaux',\n\t'Folks',\n\t'Coppage',\n\t'Heffron',\n\t'Mullet',\n\t'Kimberlin',\n\t'Breneman',\n\t'Blandford',\n\t'Matthias',\n\t'Engebretson',\n\t'Roessler',\n\t'Allee',\n\t'Parkman',\n\t'Barge',\n\t'Ren',\n\t'Backstrom',\n\t'Bullen',\n\t'Lampman',\n\t'Loesch',\n\t'Echavarria',\n\t'Haman',\n\t'Cortina',\n\t'Elms',\n\t'Gordan',\n\t'Pabst',\n\t'Snelson',\n\t'Vanarsdale',\n\t'Pecora',\n\t'Rabago',\n\t'Enger',\n\t'Senger',\n\t'Dewees',\n\t'Semple',\n\t'Howey',\n\t'Westlund',\n\t'Daw',\n\t'Hagemann',\n\t'Mcpeek',\n\t'Vanderhoof',\n\t'Ohler',\n\t'Bohm',\n\t'Mazzone',\n\t'Arnott',\n\t'Bouton',\n\t'Fackler',\n\t'Giunta',\n\t'Stagner',\n\t'Tavera',\n\t'Poorman',\n\t'Buch',\n\t'Mangano',\n\t'Bonar',\n\t'Gerson',\n\t'Ranger',\n\t'Mccullar',\n\t'Wunder',\n\t'Bade',\n\t'Armand',\n\t'Chalfant',\n\t'Lichtenstein',\n\t'Turco',\n\t'Degraw',\n\t'Few',\n\t'Haigler',\n\t'Lis',\n\t'Bittinger',\n\t'Morrone',\n\t'Hodgdon',\n\t'Wittenberg',\n\t'Imes',\n\t'Dreiling',\n\t'Landwehr',\n\t'Maly',\n\t'Warlick',\n\t'Terpstra',\n\t'Bolte',\n\t'Stiller',\n\t'Stmartin',\n\t'Pankratz',\n\t'Albee',\n\t'Victory',\n\t'Lezama',\n\t'Brecht',\n\t'Monarrez',\n\t'Thurlow',\n\t'Laskey',\n\t'Bothwell',\n\t'Candler',\n\t'Esh',\n\t'Kalman',\n\t'Samano',\n\t'Yohe',\n\t'Regnier',\n\t'Leite',\n\t'Ballantyne',\n\t'Dan',\n\t'Fikes',\n\t'Cendejas',\n\t'Mikula',\n\t'Fairman',\n\t'Dragon',\n\t'Manzella',\n\t'Renninger',\n\t'Leaman',\n\t'Godbey',\n\t'Current',\n\t'Mirabal',\n\t'Boerner',\n\t'Depaz',\n\t'Birge',\n\t'Westberry',\n\t'Severin',\n\t'Weddington',\n\t'Longenecker',\n\t'Mccreery',\n\t'Lebel',\n\t'Nader',\n\t'Gan',\n\t'Auguste',\n\t'Colonna',\n\t'Paramo',\n\t'Minyard',\n\t'Duley',\n\t'Beil',\n\t'Salters',\n\t'Brindley',\n\t'Simmers',\n\t'Lumpkins',\n\t'Crisman',\n\t'Raulerson',\n\t'Lanz',\n\t'Deroche',\n\t'Kemmerer',\n\t'Bogner',\n\t'Mahn',\n\t'Willer',\n\t'Gunnels',\n\t'Warford',\n\t'Reason',\n\t'Scherr',\n\t'Digirolamo',\n\t'Hallowell',\n\t'Wilcoxson',\n\t'Gaillard',\n\t'Deshields',\n\t'Hively',\n\t'Sakai',\n\t'Creason',\n\t'Jaber',\n\t'Lapinski',\n\t'Bolivar',\n\t'Millwood',\n\t'Shumpert',\n\t'Fujii',\n\t'Plemmons',\n\t'Lamere',\n\t'Cleghorn',\n\t'Mccaw',\n\t'Seavey',\n\t'Zwick',\n\t'Hosler',\n\t'Lepley',\n\t'Marden',\n\t'Cornwall',\n\t'Gauger',\n\t'Hofmeister',\n\t'Bugarin',\n\t'Loose',\n\t'Guardiola',\n\t'Hertzog',\n\t'Bigger',\n\t'Heineman',\n\t'Retzlaff',\n\t'Rizzuto',\n\t'Flannigan',\n\t'Rathburn',\n\t'Moulder',\n\t'Town',\n\t'Gautier',\n\t'Hamid',\n\t'Torrance',\n\t'Walthall',\n\t'Windom',\n\t'Kleckner',\n\t'Kirwan',\n\t'Gasaway',\n\t'Pinkard',\n\t'Concannon',\n\t'Mcquiston',\n\t'Yow',\n\t'Eshleman',\n\t'Riggleman',\n\t'Foulk',\n\t'Bolles',\n\t'Craine',\n\t'Hinnant',\n\t'Gholston',\n\t'Lebo',\n\t'Torkelson',\n\t'Mancia',\n\t'Canale',\n\t'Celestin',\n\t'Neubert',\n\t'Schmaltz',\n\t'Highfill',\n\t'Fisch',\n\t'Matte',\n\t'Hoefer',\n\t'Flippin',\n\t'Mclin',\n\t'Mikkelson',\n\t'Gump',\n\t'Kilroy',\n\t'Ensor',\n\t'Klosterman',\n\t'Ruppel',\n\t'Steffey',\n\t'Sauve',\n\t'Cessna',\n\t'Apgar',\n\t'Jacobus',\n\t'Pettyjohn',\n\t'Northington',\n\t'Smithey',\n\t'Moro',\n\t'Dossett',\n\t'Mccroskey',\n\t'Yelverton',\n\t'Mascarenas',\n\t'Hebb',\n\t'Quinteros',\n\t'Giang',\n\t'Pontius',\n\t'Sipple',\n\t'Atkin',\n\t'Howington',\n\t'Hiebert',\n\t'Lingerfelt',\n\t'Schueler',\n\t'Sailer',\n\t'Smits',\n\t'Keeter',\n\t'Macrae',\n\t'Mease',\n\t'Shortridge',\n\t'Scates',\n\t'Amstutz',\n\t'Kuebler',\n\t'Cambron',\n\t'Eaker',\n\t'Finlayson',\n\t'Bookout',\n\t'Mullett',\n\t'Bank',\n\t'Schlenker',\n\t'Morlock',\n\t'Haskett',\n\t'Dade',\n\t'Gallucci',\n\t'Lahey',\n\t'Ryerson',\n\t'Crownover',\n\t'Banfield',\n\t'Mcclay',\n\t'Diggins',\n\t'Conerly',\n\t'Primus',\n\t'Syverson',\n\t'Prindle',\n\t'Blasingame',\n\t'Deford',\n\t'Garnes',\n\t'Hoisington',\n\t'Glasper',\n\t'Lorusso',\n\t'Hesson',\n\t'Youssef',\n\t'Threlkeld',\n\t'Talmadge',\n\t'Winfree',\n\t'Heacock',\n\t'Rawlinson',\n\t'Burse',\n\t'Diederich',\n\t'Niemiec',\n\t'Norby',\n\t'Bauder',\n\t'Scranton',\n\t'Prentiss',\n\t'Towles',\n\t'Henton',\n\t'Purifoy',\n\t'Pinzon',\n\t'Edler',\n\t'Ragin',\n\t'Albarado',\n\t'Cuadra',\n\t'Hoadley',\n\t'Devita',\n\t'Pavon',\n\t'Alday',\n\t'Goulding',\n\t'Millis',\n\t'Dalley',\n\t'Kolodziej',\n\t'Kropf',\n\t'Kuiper',\n\t'Crespin',\n\t'Xavier',\n\t'Sailor',\n\t'Lagrone',\n\t'Boehme',\n\t'Tidd',\n\t'Wilmore',\n\t'Ziemer',\n\t'Ropp',\n\t'Kettler',\n\t'Pilon',\n\t'Miron',\n\t'Salsbury',\n\t'Job',\n\t'Sensenig',\n\t'Cayton',\n\t'Nanney',\n\t'Rasch',\n\t'Silvestre',\n\t'Ladue',\n\t'Dampier',\n\t'Ackermann',\n\t'Friedel',\n\t'Kleiman',\n\t'Geronimo',\n\t'Ezzell',\n\t'Duclos',\n\t'Moor',\n\t'Neuhaus',\n\t'Lan',\n\t'Allender',\n\t'Tedeschi',\n\t'Langton',\n\t'Dawley',\n\t'Kearse',\n\t'Godina',\n\t'Guernsey',\n\t'Kober',\n\t'Bisbee',\n\t'Lamphere',\n\t'Kinman',\n\t'Wesner',\n\t'Malo',\n\t'Stroupe',\n\t'Millette',\n\t'Yeoman',\n\t'Baig',\n\t'Kirchoff',\n\t'Tsao',\n\t'Cristobal',\n\t'Mucci',\n\t'Pair',\n\t'Barefield',\n\t'Dewolf',\n\t'Fitzmaurice',\n\t'Mcaleer',\n\t'Natal',\n\t'Bara',\n\t'Macey',\n\t'Mclennan',\n\t'Fabre',\n\t'Vieyra',\n\t'Magno',\n\t'Eyre',\n\t'Chatterton',\n\t'Gilland',\n\t'Hurlbut',\n\t'Umberger',\n\t'Roloff',\n\t'Brambila',\n\t'Mazzeo',\n\t'Letson',\n\t'Norsworthy',\n\t'Bier',\n\t'Gioia',\n\t'Kapoor',\n\t'Marlatt',\n\t'Flippo',\n\t'Houde',\n\t'Baughn',\n\t'Blackledge',\n\t'Fly',\n\t'Dinkel',\n\t'Rathbone',\n\t'Bober',\n\t'Boydston',\n\t'Ferdinand',\n\t'Coletti',\n\t'Cuenca',\n\t'Deters',\n\t'Blagg',\n\t'Timmins',\n\t'Boyden',\n\t'Meads',\n\t'Narcisse',\n\t'Saelee',\n\t'Cosner',\n\t'Strawser',\n\t'Amico',\n\t'Dowdle',\n\t'Golub',\n\t'Silverberg',\n\t'Riles',\n\t'Balk',\n\t'Buhr',\n\t'Feltman',\n\t'Stickel',\n\t'Zapien',\n\t'Cargile',\n\t'Kulik',\n\t'Lazzaro',\n\t'Oberle',\n\t'Wickstrom',\n\t'Maeda',\n\t'Cockrum',\n\t'Boulton',\n\t'Sandford',\n\t'Culbert',\n\t'Dula',\n\t'Ament',\n\t'Chunn',\n\t'Owenby',\n\t'Wasilewski',\n\t'Wichman',\n\t'Oestreich',\n\t'Klos',\n\t'Orchard',\n\t'Hogge',\n\t'Presson',\n\t'Cordon',\n\t'Gans',\n\t'Leonardi',\n\t'Manjarrez',\n\t'Olander',\n\t'Drennen',\n\t'Wirt',\n\t'Tiger',\n\t'Dolce',\n\t'Hagstrom',\n\t'Hirsh',\n\t'Tally',\n\t'Crumbley',\n\t'Mcgreevy',\n\t'Amidon',\n\t'Olague',\n\t'Lint',\n\t'Poche',\n\t'Lipford',\n\t'Engen',\n\t'Mcelfresh',\n\t'Cuneo',\n\t'Krumm',\n\t'Haak',\n\t'Arocho',\n\t'Longworth',\n\t'Seamon',\n\t'Bronner',\n\t'Swartzentruber',\n\t'Chand',\n\t'Wilhoit',\n\t'Chapel',\n\t'Hitchens',\n\t'Brzezinski',\n\t'Heidenreich',\n\t'Ellenberger',\n\t'Gamblin',\n\t'Ormond',\n\t'Burchard',\n\t'Dibella',\n\t'Nicoll',\n\t'Simcox',\n\t'Strohm',\n\t'Dittmar',\n\t'Wycoff',\n\t'Grays',\n\t'Spero',\n\t'Vess',\n\t'Picone',\n\t'Greening',\n\t'Maynes',\n\t'Knauss',\n\t'Wojtowicz',\n\t'Chaput',\n\t'Soliman',\n\t'Ponton',\n\t'Carlino',\n\t'Kestner',\n\t'Kelch',\n\t'Dimauro',\n\t'Iorio',\n\t'Parenteau',\n\t'Pesina',\n\t'Clauson',\n\t'Stigall',\n\t'Keels',\n\t'Waldrep',\n\t'Wix',\n\t'Draeger',\n\t'Ertel',\n\t'Starner',\n\t'Charest',\n\t'Simoneaux',\n\t'Ivanov',\n\t'Thor',\n\t'Gravel',\n\t'Trottier',\n\t'Clendenin',\n\t'Kromer',\n\t'Benda',\n\t'Touchet',\n\t'Hornbuckle',\n\t'Avent',\n\t'Dombroski',\n\t'Friedland',\n\t'Radabaugh',\n\t'Vesely',\n\t'Wike',\n\t'Lax',\n\t'Messersmith',\n\t'Deoliveira',\n\t'Brey',\n\t'Cogdill',\n\t'Overturf',\n\t'Sova',\n\t'Pero',\n\t'Beaird',\n\t'Cevallos',\n\t'Defalco',\n\t'Taormina',\n\t'Thornberry',\n\t'Westervelt',\n\t'Macaulay',\n\t'Hajek',\n\t'Brugger',\n\t'Leff',\n\t'Ketterer',\n\t'Ono',\n\t'Mullenix',\n\t'Frison',\n\t'Gullo',\n\t'Calhoon',\n\t'Summey',\n\t'Hockaday',\n\t'Dimatteo',\n\t'Agan',\n\t'Patenaude',\n\t'Mary',\n\t'Tanis',\n\t'Obert',\n\t'Elton',\n\t'Randles',\n\t'Migliore',\n\t'Schmalz',\n\t'Vanvalkenburg',\n\t'Quinto',\n\t'Palmquist',\n\t'Hoops',\n\t'Naples',\n\t'Orear',\n\t'Eberhard',\n\t'Fitzgibbons',\n\t'Adkinson',\n\t'Gerace',\n\t'Elie',\n\t'Dressel',\n\t'Silber',\n\t'Otey',\n\t'Hsiao',\n\t'Kreutzer',\n\t'Tutor',\n\t'Roundy',\n\t'Haddox',\n\t'Bridgers',\n\t'Leto',\n\t'Daniell',\n\t'Pollitt',\n\t'Freda',\n\t'Mraz',\n\t'Engelbrecht',\n\t'Ariza',\n\t'Grand',\n\t'Pavone',\n\t'Everts',\n\t'Benes',\n\t'Reamer',\n\t'Faucett',\n\t'Eatmon',\n\t'Raymundo',\n\t'Zaman',\n\t'Devitt',\n\t'Master',\n\t'Carron',\n\t'Hoffner',\n\t'Sciortino',\n\t'Stringham',\n\t'Bookman',\n\t'Westberg',\n\t'Spahn',\n\t'Hise',\n\t'Waterbury',\n\t'Buckwalter',\n\t'Hug',\n\t'Overly',\n\t'Dingus',\n\t'Ince',\n\t'Haar',\n\t'Shain',\n\t'Heaps',\n\t'Oppenheimer',\n\t'Miyamoto',\n\t'Schreier',\n\t'Martello',\n\t'Atteberry',\n\t'Folger',\n\t'Macke',\n\t'Pal',\n\t'Lucchesi',\n\t'Osterhout',\n\t'Liriano',\n\t'Legge',\n\t'Barra',\n\t'Crumb',\n\t'Gwyn',\n\t'Forst',\n\t'Axelrod',\n\t'Samayoa',\n\t'Edgell',\n\t'Purkey',\n\t'Lannon',\n\t'Branam',\n\t'Yeo',\n\t'Hatmaker',\n\t'Borum',\n\t'Villagrana',\n\t'Lawing',\n\t'Bark',\n\t'Muirhead',\n\t'Eckles',\n\t'Weight',\n\t'Surles',\n\t'Cullinan',\n\t'Lagos',\n\t'Naber',\n\t'Sloat',\n\t'Foos',\n\t'Vine',\n\t'Milliner',\n\t'Reliford',\n\t'Dahlquist',\n\t'Gibney',\n\t'Moroney',\n\t'Stecker',\n\t'Bella',\n\t'Brickhouse',\n\t'Canela',\n\t'Kula',\n\t'Tartaglia',\n\t'Siewert',\n\t'Hitch',\n\t'Brickman',\n\t'Cheeseman',\n\t'Carollo',\n\t'Geissler',\n\t'Jiron',\n\t'Cossey',\n\t'Sroka',\n\t'Border',\n\t'Brownlow',\n\t'Ellenburg',\n\t'Cella',\n\t'Brinton',\n\t'Scurry',\n\t'Behrendt',\n\t'Carstensen',\n\t'Schendel',\n\t'Bodner',\n\t'Eddleman',\n\t'Stec',\n\t'Capasso',\n\t'Leu',\n\t'Kennett',\n\t'Ruane',\n\t'Critchfield',\n\t'Carbonell',\n\t'Mitcham',\n\t'Troncoso',\n\t'Mckeen',\n\t'Cammack',\n\t'Broach',\n\t'Culbreath',\n\t'Callejas',\n\t'Wurst',\n\t'Brookman',\n\t'Guerrier',\n\t'Seese',\n\t'Kitzmiller',\n\t'Graybeal',\n\t'Yardley',\n\t'Cheever',\n\t'Virgin',\n\t'Brimmer',\n\t'Swoboda',\n\t'Pandya',\n\t'Canton',\n\t'Magnus',\n\t'Draughn',\n\t'Dilts',\n\t'Tauber',\n\t'Vandegrift',\n\t'Rene',\n\t'Cousineau',\n\t'Joo',\n\t'Pimental',\n\t'Carpentier',\n\t'Eager',\n\t'Cumberland',\n\t'Eastridge',\n\t'Moberly',\n\t'Erhardt',\n\t'Meldrum',\n\t'Degennaro',\n\t'Desanto',\n\t'Manahan',\n\t'Gowdy',\n\t'Popham',\n\t'Mee',\n\t'Kinslow',\n\t'Harned',\n\t'Cartee',\n\t'Raiford',\n\t'Henrichs',\n\t'Maffei',\n\t'Seamans',\n\t'Heckel',\n\t'Toll',\n\t'Milian',\n\t'Mabrey',\n\t'Dall',\n\t'Lanford',\n\t'Carew',\n\t'Bascom',\n\t'Christofferson',\n\t'Hadfield',\n\t'Ferber',\n\t'Mestas',\n\t'Leith',\n\t'Abston',\n\t'Cuddy',\n\t'Svendsen',\n\t'Cowling',\n\t'Segars',\n\t'Nalls',\n\t'Hofstetter',\n\t'Badgley',\n\t'Mccaffery',\n\t'Burner',\n\t'Laymon',\n\t'Pinion',\n\t'Schooler',\n\t'Brun',\n\t'Aldaco',\n\t'Savarese',\n\t'Gravelle',\n\t'Belvin',\n\t'Brekke',\n\t'Dekker',\n\t'Ellefson',\n\t'Lurie',\n\t'Cassity',\n\t'Epperly',\n\t'Genova',\n\t'Dehn',\n\t'Fargo',\n\t'Vanderford',\n\t'Sine',\n\t'Horrell',\n\t'Napoleon',\n\t'Kamm',\n\t'Riel',\n\t'Gerena',\n\t'Check',\n\t'Devane',\n\t'Grissett',\n\t'Brendel',\n\t'Weyant',\n\t'Basurto',\n\t'Coppinger',\n\t'Grosse',\n\t'Saeed',\n\t'Lunceford',\n\t'Washam',\n\t'Benard',\n\t'Eastham',\n\t'Holleran',\n\t'Kiesel',\n\t'Risch',\n\t'Mccullen',\n\t'Vizcaino',\n\t'Fullen',\n\t'Westbrooks',\n\t'Babich',\n\t'Mauch',\n\t'Hensler',\n\t'Bryner',\n\t'Phillippi',\n\t'Santistevan',\n\t'Jalbert',\n\t'Vanorden',\n\t'Brantner',\n\t'Mcgrail',\n\t'Rustin',\n\t'Lebaron',\n\t'Genao',\n\t'Quast',\n\t'Hamburg',\n\t'Mensah',\n\t'Heckler',\n\t'Popa',\n\t'Mantooth',\n\t'Hargreaves',\n\t'Jury',\n\t'Seiber',\n\t'Calton',\n\t'Lafreniere',\n\t'Starbuck',\n\t'Gow',\n\t'Veazey',\n\t'Kneeland',\n\t'Woodberry',\n\t'Vallone',\n\t'Sutcliffe',\n\t'Loh',\n\t'Wiltse',\n\t'Choudhury',\n\t'Rollo',\n\t'Bjerke',\n\t'Huffstetler',\n\t'Ogren',\n\t'Legere',\n\t'Wilmer',\n\t'Conboy',\n\t'Pressler',\n\t'Hon',\n\t'Monger',\n\t'Devos',\n\t'Houtz',\n\t'Shurtleff',\n\t'Sedlak',\n\t'Carolan',\n\t'Luc',\n\t'Immel',\n\t'Guizar',\n\t'Kron',\n\t'Lusby',\n\t'Whitsett',\n\t'Pryce',\n\t'Mengel',\n\t'Youngberg',\n\t'Kluge',\n\t'Thrush',\n\t'Wilsey',\n\t'Santee',\n\t'Braham',\n\t'Palmeri',\n\t'Cousino',\n\t'Willits',\n\t'Gram',\n\t'Dearmond',\n\t'Fonville',\n\t'Sabatini',\n\t'Nehring',\n\t'Henne',\n\t'Prager',\n\t'Mederos',\n\t'Schuldt',\n\t'Weisz',\n\t'Mccart',\n\t'Warriner',\n\t'Bartelt',\n\t'Dimond',\n\t'Mccubbin',\n\t'Say',\n\t'Mickel',\n\t'Bracamonte',\n\t'Volkman',\n\t'Brindle',\n\t'Bitter',\n\t'Dickie',\n\t'Inge',\n\t'Brinegar',\n\t'Lerman',\n\t'Bohan',\n\t'Rondon',\n\t'Dilbeck',\n\t'Rumbaugh',\n\t'Simard',\n\t'Berke',\n\t'Ealey',\n\t'Knauer',\n\t'Michalek',\n\t'Smolinski',\n\t'Wurster',\n\t'Zullo',\n\t'Nott',\n\t'Claar',\n\t'Mayor',\n\t'Moir',\n\t'Hubbert',\n\t'Hankerson',\n\t'Mok',\n\t'Simko',\n\t'Mumm',\n\t'Sheely',\n\t'Abramowitz',\n\t'Pusateri',\n\t'Boomer',\n\t'Chappelle',\n\t'Demery',\n\t'Coniglio',\n\t'Asay',\n\t'Nova',\n\t'Biel',\n\t'Delancey',\n\t'Tocco',\n\t'Tant',\n\t'Melin',\n\t'Lacoste',\n\t'Derrico',\n\t'Stacks',\n\t'Watley',\n\t'Stoneking',\n\t'Westrick',\n\t'Pons',\n\t'Malm',\n\t'Parekh',\n\t'Loop',\n\t'Kitt',\n\t'Crisostomo',\n\t'Ecklund',\n\t'Tollison',\n\t'Dziedzic',\n\t'Pillsbury',\n\t'Baumer',\n\t'Matsuda',\n\t'Jeon',\n\t'Foye',\n\t'Peltz',\n\t'Candela',\n\t'Levey',\n\t'Organ',\n\t'Hathorn',\n\t'Galeano',\n\t'Nies',\n\t'Cabezas',\n\t'Barras',\n\t'Pier',\n\t'Truss',\n\t'Leist',\n\t'Lheureux',\n\t'Nakano',\n\t'Ladwig',\n\t'Grunwald',\n\t'Centers',\n\t'Sherrard',\n\t'Morais',\n\t'Juhl',\n\t'Ivers',\n\t'Dunfee',\n\t'Jolliff',\n\t'Breeze',\n\t'Tapper',\n\t'Goodridge',\n\t'Kelliher',\n\t'Finck',\n\t'Roose',\n\t'Gauvin',\n\t'Coil',\n\t'Pounders',\n\t'Lobb',\n\t'Stalcup',\n\t'Swanner',\n\t'Boivin',\n\t'Neer',\n\t'Laxton',\n\t'Pai',\n\t'Postma',\n\t'Janus',\n\t'Didier',\n\t'Engleman',\n\t'League',\n\t'Fray',\n\t'Aguillon',\n\t'Richins',\n\t'Tolar',\n\t'Criner',\n\t'Rowlands',\n\t'Verdi',\n\t'Utt',\n\t'Winders',\n\t'Turbeville',\n\t'Rada',\n\t'Mcnichols',\n\t'Boddy',\n\t'Binford',\n\t'Amey',\n\t'Schultze',\n\t'Sontag',\n\t'Saleem',\n\t'Przybylski',\n\t'Vanderlinden',\n\t'Vanfossen',\n\t'Longacre',\n\t'Heasley',\n\t'Southwell',\n\t'Decesare',\n\t'Munch',\n\t'Minix',\n\t'Hymes',\n\t'Klopp',\n\t'Militello',\n\t'Schuessler',\n\t'Velazco',\n\t'Jurek',\n\t'Claycomb',\n\t'Diemer',\n\t'Roser',\n\t'Huse',\n\t'Perkinson',\n\t'Musa',\n\t'Leavy',\n\t'Seidman',\n\t'Vroman',\n\t'Stalter',\n\t'Grieve',\n\t'Aron',\n\t'Purdie',\n\t'Dusek',\n\t'Rago',\n\t'Shepler',\n\t'Leopard',\n\t'Araya',\n\t'Rutt',\n\t'Voth',\n\t'Hittle',\n\t'Husain',\n\t'Gratton',\n\t'Seigler',\n\t'Coppedge',\n\t'Nicastro',\n\t'Fitzgibbon',\n\t'Sosebee',\n\t'Tank',\n\t'Troche',\n\t'Delph',\n\t'Ryland',\n\t'Mazzella',\n\t'Rai',\n\t'Strecker',\n\t'Epp',\n\t'Clower',\n\t'Porche',\n\t'Gelman',\n\t'Herrman',\n\t'Balser',\n\t'Tosh',\n\t'Bonn',\n\t'Cerrato',\n\t'Varley',\n\t'Dingess',\n\t'Goodspeed',\n\t'Boller',\n\t'Heimann',\n\t'Gottfried',\n\t'Super',\n\t'Falzone',\n\t'Bizzell',\n\t'Litwin',\n\t'Ji',\n\t'Rogowski',\n\t'Tindle',\n\t'Hoye',\n\t'Balfour',\n\t'Focht',\n\t'Manz',\n\t'Stender',\n\t'Sutterfield',\n\t'Bayes',\n\t'Mullings',\n\t'Dockter',\n\t'Figueiredo',\n\t'Kepner',\n\t'Posadas',\n\t'Nettleton',\n\t'Ruder',\n\t'Younce',\n\t'Flanary',\n\t'Scotti',\n\t'Bayliss',\n\t'Tandy',\n\t'Henrickson',\n\t'Volker',\n\t'Letts',\n\t'Joines',\n\t'Fewell',\n\t'Wherry',\n\t'Stelzer',\n\t'Stever',\n\t'Viator',\n\t'Catt',\n\t'Jeffords',\n\t'Guerriero',\n\t'Milby',\n\t'Jozwiak',\n\t'Slawson',\n\t'Portwood',\n\t'Billie',\n\t'Borunda',\n\t'Chinchilla',\n\t'Papadopoulos',\n\t'Lohse',\n\t'Mantz',\n\t'Gabriele',\n\t'Hosford',\n\t'Kohut',\n\t'Tardiff',\n\t'Puma',\n\t'Bodin',\n\t'Hodgins',\n\t'Boon',\n\t'Golightly',\n\t'Bogert',\n\t'Abdi',\n\t'Wigfall',\n\t'Fleischmann',\n\t'Nease',\n\t'Rayborn',\n\t'Zigler',\n\t'Reimann',\n\t'Malagon',\n\t'Puls',\n\t'Grogg',\n\t'Drinkwater',\n\t'Dacus',\n\t'Mcfee',\n\t'Domino',\n\t'Harjo',\n\t'Pascarella',\n\t'Spengler',\n\t'Copple',\n\t'Rollings',\n\t'Brew',\n\t'Brabham',\n\t'Nordquist',\n\t'Emig',\n\t'Riggio',\n\t'Sanson',\n\t'Gerardo',\n\t'Pereda',\n\t'Renken',\n\t'Stickley',\n\t'Milliron',\n\t'Rolling',\n\t'Hollie',\n\t'Biondi',\n\t'Fluharty',\n\t'Magyar',\n\t'Balsamo',\n\t'Imler',\n\t'Hanlin',\n\t'Dycus',\n\t'Kirkley',\n\t'Wimberley',\n\t'Finan',\n\t'Kulkarni',\n\t'Morreale',\n\t'Briner',\n\t'Pelzer',\n\t'Bouie',\n\t'Fenstermaker',\n\t'Gimenez',\n\t'Labella',\n\t'Scherrer',\n\t'Holzman',\n\t'Winer',\n\t'Wrigley',\n\t'Leighty',\n\t'Liptak',\n\t'Chamness',\n\t'Franko',\n\t'Arwood',\n\t'Tiner',\n\t'Schoenberger',\n\t'Gear',\n\t'Hereford',\n\t'Slezak',\n\t'Longfellow',\n\t'Cull',\n\t'Brashears',\n\t'Clear',\n\t'Zielke',\n\t'Arden',\n\t'Bonneau',\n\t'Muck',\n\t'Tarvin',\n\t'Beran',\n\t'Coulombe',\n\t'Toothman',\n\t'Ghosh',\n\t'Mcguirk',\n\t'Pinero',\n\t'Ruan',\n\t'Gartman',\n\t'Peed',\n\t'Cassano',\n\t'Forcier',\n\t'Haque',\n\t'Veatch',\n\t'Fodor',\n\t'Wetherington',\n\t'Barrette',\n\t'Bottorff',\n\t'Holmstrom',\n\t'Honda',\n\t'Kopecky',\n\t'Loaiza',\n\t'Castelan',\n\t'Haydon',\n\t'Lamotte',\n\t'Mutchler',\n\t'Mahmoud',\n\t'Gleaton',\n\t'Rebollar',\n\t'Moctezuma',\n\t'Tannehill',\n\t'Bernardino',\n\t'Walrath',\n\t'Adcox',\n\t'Heidt',\n\t'Rakowski',\n\t'Soza',\n\t'Limas',\n\t'Wysong',\n\t'Mannix',\n\t'Pattillo',\n\t'Corner',\n\t'Kuang',\n\t'Loflin',\n\t'Ledger',\n\t'Ivery',\n\t'Likens',\n\t'Mctaggart',\n\t'Hartin',\n\t'Prange',\n\t'Stenzel',\n\t'Shadle',\n\t'Karn',\n\t'Duplantis',\n\t'Garibaldi',\n\t'Batty',\n\t'Goulart',\n\t'Ranck',\n\t'Beekman',\n\t'Nicolosi',\n\t'Arizmendi',\n\t'Donoho',\n\t'Drewry',\n\t'Lenihan',\n\t'Spatz',\n\t'Wible',\n\t'Dimmick',\n\t'Stelter',\n\t'Seyler',\n\t'Stringfield',\n\t'Bonaparte',\n\t'Dematteo',\n\t'Petrey',\n\t'Bellino',\n\t'Cavaliere',\n\t'Thaler',\n\t'Heiner',\n\t'Lillis',\n\t'Hammes',\n\t'Rainbolt',\n\t'Hillyard',\n\t'Farnum',\n\t'Overmyer',\n\t'Replogle',\n\t'Sclafani',\n\t'Audet',\n\t'Santa',\n\t'Hollen',\n\t'Lineberger',\n\t'Bonnet',\n\t'Caples',\n\t'Dahlen',\n\t'Ruggieri',\n\t'Keppler',\n\t'Ryman',\n\t'Copas',\n\t'Lyda',\n\t'Pusey',\n\t'Bostrom',\n\t'Patnode',\n\t'Richeson',\n\t'Hamil',\n\t'Wyss',\n\t'Mcadam',\n\t'Dennett',\n\t'Lever',\n\t'Drinkard',\n\t'Ohl',\n\t'Restivo',\n\t'Vyas',\n\t'Moyle',\n\t'Blauvelt',\n\t'Gregson',\n\t'Scull',\n\t'Verret',\n\t'Stines',\n\t'Forsman',\n\t'Gehman',\n\t'Watrous',\n\t'Gunnell',\n\t'Choice',\n\t'Castaldo',\n\t'Pietrzak',\n\t'Goodsell',\n\t'Klima',\n\t'Stratman',\n\t'Foutz',\n\t'Massingill',\n\t'Huneycutt',\n\t'Zellmer',\n\t'Tefft',\n\t'Hamblen',\n\t'Baggs',\n\t'Mcgarity',\n\t'Alfieri',\n\t'Stetler',\n\t'Hershman',\n\t'Fuerst',\n\t'Granda',\n\t'Villafane',\n\t'Stocking',\n\t'Laguerre',\n\t'Salvato',\n\t'Mcniel',\n\t'Trim',\n\t'Goldston',\n\t'Tannenbaum',\n\t'Laforge',\n\t'Hawker',\n\t'Innis',\n\t'Rasheed',\n\t'Marbury',\n\t'Jules',\n\t'Harpster',\n\t'Hruska',\n\t'Mancillas',\n\t'Ruck',\n\t'Schloss',\n\t'Shy',\n\t'Leming',\n\t'Eich',\n\t'Allain',\n\t'Premo',\n\t'Goodner',\n\t'Karlin',\n\t'Natoli',\n\t'Sinn',\n\t'Althouse',\n\t'Bodiford',\n\t'Krishnan',\n\t'Snedeker',\n\t'Weigle',\n\t'Blohm',\n\t'Renwick',\n\t'Menzies',\n\t'Stonebraker',\n\t'Brunetti',\n\t'Crompton',\n\t'Hucks',\n\t'Maharaj',\n\t'Bangert',\n\t'Hepp',\n\t'Kammer',\n\t'Sutliff',\n\t'Doyon',\n\t'Hutsell',\n\t'Cumbie',\n\t'Dibiase',\n\t'Linke',\n\t'Sapienza',\n\t'Sprayberry',\n\t'Sundstrom',\n\t'Vanbeek',\n\t'Ewart',\n\t'Erlandson',\n\t'Knutsen',\n\t'Nicolai',\n\t'Oros',\n\t'Almquist',\n\t'Tedrow',\n\t'Diebold',\n\t'Bellman',\n\t'Sherrer',\n\t'Ehret',\n\t'Ota',\n\t'Seman',\n\t'Folse',\n\t'Amy',\n\t'Mcateer',\n\t'Steinhauer',\n\t'Vannatta',\n\t'Holle',\n\t'Carreras',\n\t'Anger',\n\t'Clinkscales',\n\t'Castiglione',\n\t'Zakrzewski',\n\t'Principe',\n\t'Artman',\n\t'Waiters',\n\t'Tarbox',\n\t'Sippel',\n\t'Belz',\n\t'Joachim',\n\t'Pipkins',\n\t'Peterkin',\n\t'Abalos',\n\t'Flock',\n\t'Brochu',\n\t'Tobler',\n\t'Mckinnis',\n\t'Gatson',\n\t'Cronan',\n\t'Manthey',\n\t'Oberholtzer',\n\t'Schiltz',\n\t'Skowronski',\n\t'Matute',\n\t'Castonguay',\n\t'Bechard',\n\t'Drees',\n\t'Carte',\n\t'Baysinger',\n\t'Kees',\n\t'Steve',\n\t'Ratchford',\n\t'Clopton',\n\t'Heimbach',\n\t'Selig',\n\t'Peavey',\n\t'Sidney',\n\t'Hilliker',\n\t'Oehler',\n\t'Essig',\n\t'Ownby',\n\t'Huling',\n\t'Aylward',\n\t'Matzke',\n\t'Mikkelsen',\n\t'Vandam',\n\t'Rodden',\n\t'Plunk',\n\t'Mcdonell',\n\t'Buechler',\n\t'Dahm',\n\t'Tarlton',\n\t'Funches',\n\t'Alvidrez',\n\t'Padua',\n\t'Pingel',\n\t'Cid',\n\t'Mcburney',\n\t'Brunton',\n\t'Dwight',\n\t'Bucio',\n\t'Schiffer',\n\t'Dyal',\n\t'Cyphers',\n\t'Gildea',\n\t'Wengerd',\n\t'Lappin',\n\t'Longwell',\n\t'Basil',\n\t'Acklin',\n\t'Cancino',\n\t'Kalina',\n\t'Tynan',\n\t'Raasch',\n\t'Fleener',\n\t'Dunmire',\n\t'Gent',\n\t'Cruickshank',\n\t'Baltimore',\n\t'Shum',\n\t'Vanpatten',\n\t'Costilla',\n\t'Grimshaw',\n\t'Loar',\n\t'Royse',\n\t'Amon',\n\t'Amendola',\n\t'Mcgonagle',\n\t'Alm',\n\t'Hausmann',\n\t'Heitzman',\n\t'Mailloux',\n\t'Brault',\n\t'Capra',\n\t'Levis',\n\t'Barillas',\n\t'Quandt',\n\t'Fedele',\n\t'Chittenden',\n\t'Cheesman',\n\t'Wildes',\n\t'Bolan',\n\t'Metoyer',\n\t'Ciccarelli',\n\t'Melara',\n\t'Gano',\n\t'Janowski',\n\t'Magoon',\n\t'Kuster',\n\t'Ofarrell',\n\t'Joplin',\n\t'Cannella',\n\t'Middendorf',\n\t'Putz',\n\t'Saephan',\n\t'Sieg',\n\t'Lainez',\n\t'Roten',\n\t'Buras',\n\t'Nock',\n\t'Manke',\n\t'Hymel',\n\t'Devaughn',\n\t'Braverman',\n\t'Fleisher',\n\t'Persson',\n\t'Sandidge',\n\t'Corsi',\n\t'Torok',\n\t'Steinhoff',\n\t'Corby',\n\t'Shorey',\n\t'Wooton',\n\t'Estell',\n\t'Bolander',\n\t'Vivar',\n\t'Cuesta',\n\t'Renick',\n\t'Isler',\n\t'Caprio',\n\t'Crissman',\n\t'Wann',\n\t'Matchett',\n\t'Calahan',\n\t'Escareno',\n\t'Liguori',\n\t'Helt',\n\t'Boner',\n\t'Luper',\n\t'Hoppes',\n\t'Ingold',\n\t'Gilleland',\n\t'Saathoff',\n\t'Szczepanski',\n\t'Yockey',\n\t'Veith',\n\t'Wasser',\n\t'Denniston',\n\t'Fretwell',\n\t'Goetsch',\n\t'Havel',\n\t'Banach',\n\t'Schaal',\n\t'Nisbet',\n\t'Depaul',\n\t'Escalona',\n\t'Gammons',\n\t'Schmelzer',\n\t'Wehrle',\n\t'Guglielmo',\n\t'Oberlander',\n\t'Wolski',\n\t'Dimick',\n\t'Rebello',\n\t'Braunstein',\n\t'Vanderveen',\n\t'Saini',\n\t'Meiners',\n\t'Metheny',\n\t'Schommer',\n\t'Kissell',\n\t'Burgoyne',\n\t'Walmsley',\n\t'Parmley',\n\t'Arthurs',\n\t'Worsley',\n\t'Hulme',\n\t'Campisi',\n\t'Parvin',\n\t'Ogawa',\n\t'Coder',\n\t'Gardener',\n\t'Taplin',\n\t'Nuzzo',\n\t'Linthicum',\n\t'Rosenstein',\n\t'Simoneau',\n\t'Preble',\n\t'Chae',\n\t'Nealon',\n\t'Stonecipher',\n\t'Medders',\n\t'Bencomo',\n\t'Durazo',\n\t'Scotto',\n\t'Klem',\n\t'Corman',\n\t'Byard',\n\t'Evan',\n\t'Dengler',\n\t'Kohls',\n\t'Seidler',\n\t'Clute',\n\t'Nebel',\n\t'Hohl',\n\t'Younker',\n\t'Parkerson',\n\t'Pullins',\n\t'Sweeting',\n\t'Wiersma',\n\t'Callanan',\n\t'Lisk',\n\t'Fassett',\n\t'Alloway',\n\t'Lafever',\n\t'Ollis',\n\t'Gracey',\n\t'Tune',\n\t'Ester',\n\t'Weingarten',\n\t'Swigart',\n\t'Frew',\n\t'Conkle',\n\t'Mendelsohn',\n\t'Belliveau',\n\t'Bacher',\n\t'Coto',\n\t'Ro',\n\t'Lipson',\n\t'Standard',\n\t'Hoerner',\n\t'Moldenhauer',\n\t'Trivette',\n\t'Colligan',\n\t'Cacho',\n\t'Emrich',\n\t'Condit',\n\t'Styer',\n\t'Paramore',\n\t'Cheramie',\n\t'Sprenger',\n\t'Kreps',\n\t'Curd',\n\t'Josephs',\n\t'Bruch',\n\t'Villano',\n\t'Banh',\n\t'Kennison',\n\t'Hilson',\n\t'Gathers',\n\t'Weinman',\n\t'Brickley',\n\t'Jetton',\n\t'Munford',\n\t'Charboneau',\n\t'Dittrich',\n\t'Boysen',\n\t'Newbury',\n\t'Hayner',\n\t'Pfau',\n\t'Wegman',\n\t'Eure',\n\t'Heinrichs',\n\t'Kresge',\n\t'Klepper',\n\t'Yohn',\n\t'Bergan',\n\t'Spells',\n\t'Reisman',\n\t'Schiffman',\n\t'Napoles',\n\t'Banegas',\n\t'Landman',\n\t'Hallenbeck',\n\t'Sever',\n\t'Hole',\n\t'Bown',\n\t'Barnaby',\n\t'Junior',\n\t'Deloatch',\n\t'Secrist',\n\t'Steigerwald',\n\t'Kallas',\n\t'Littell',\n\t'Clinger',\n\t'Rehman',\n\t'Cothern',\n\t'Class',\n\t'Sabino',\n\t'Mckain',\n\t'Werts',\n\t'Asmus',\n\t'Fierros',\n\t'Heffelfinger',\n\t'Henthorn',\n\t'Weirich',\n\t'Ashbrook',\n\t'Alber',\n\t'Calles',\n\t'Bragdon',\n\t'Gerow',\n\t'Hanger',\n\t'Machen',\n\t'Patt',\n\t'Harada',\n\t'Parmelee',\n\t'Decaro',\n\t'Sons',\n\t'Tindal',\n\t'Lubbers',\n\t'Ferland',\n\t'Bruni',\n\t'Boyes',\n\t'Danis',\n\t'Tigner',\n\t'Anzaldua',\n\t'Gaxiola',\n\t'Iacono',\n\t'Lizama',\n\t'Forbis',\n\t'Mcguffin',\n\t'Greenhill',\n\t'Baity',\n\t'Welcome',\n\t'Lauzon',\n\t'Nicodemus',\n\t'Rabin',\n\t'Teegarden',\n\t'Yunker',\n\t'Salim',\n\t'Dews',\n\t'Schueller',\n\t'Stogsdill',\n\t'Minch',\n\t'Ellett',\n\t'Villafana',\n\t'Shan',\n\t'Boler',\n\t'Kast',\n\t'Shrout',\n\t'Taff',\n\t'Willcox',\n\t'Kahan',\n\t'Gerth',\n\t'Sabella',\n\t'Procopio',\n\t'Vedder',\n\t'Heeter',\n\t'Banes',\n\t'Alaimo',\n\t'Raza',\n\t'Starkweather',\n\t'Mutter',\n\t'Manners',\n\t'Bohanan',\n\t'Virden',\n\t'Booze',\n\t'Wimbush',\n\t'Eickhoff',\n\t'Hankinson',\n\t'Swilley',\n\t'Killinger',\n\t'Labar',\n\t'Tallant',\n\t'Rosin',\n\t'Hillhouse',\n\t'Labarre',\n\t'Ryans',\n\t'Heintzelman',\n\t'Cottone',\n\t'Bickerstaff',\n\t'Westley',\n\t'Rotter',\n\t'Hey',\n\t'Dinapoli',\n\t'Lohmann',\n\t'Reetz',\n\t'Vences',\n\t'Mckiernan',\n\t'Thornsberry',\n\t'Hofman',\n\t'Murrieta',\n\t'Vanwormer',\n\t'Sen',\n\t'Pinheiro',\n\t'Jaco',\n\t'Maner',\n\t'Crosley',\n\t'Rogalski',\n\t'Hollandsworth',\n\t'Hinze',\n\t'Seawright',\n\t'Brosius',\n\t'Keehn',\n\t'Sweetman',\n\t'Vicknair',\n\t'Casler',\n\t'Hagopian',\n\t'Westhoff',\n\t'Lipari',\n\t'Poll',\n\t'Lintz',\n\t'Rosinski',\n\t'Henrie',\n\t'Crystal',\n\t'Wroten',\n\t'Perla',\n\t'Zawacki',\n\t'Mckillip',\n\t'Dorantes',\n\t'Wallick',\n\t'Hoots',\n\t'Witty',\n\t'Granata',\n\t'Janicki',\n\t'Petroff',\n\t'Emert',\n\t'Raskin',\n\t'Picou',\n\t'Caple',\n\t'Mcelyea',\n\t'Blackmer',\n\t'Busbee',\n\t'Pettengill',\n\t'Newberg',\n\t'Nickle',\n\t'Hedman',\n\t'Flavin',\n\t'Forgione',\n\t'Wachtel',\n\t'Meader',\n\t'Nale',\n\t'Westby',\n\t'Pulaski',\n\t'Schupp',\n\t'Troutt',\n\t'Fishburn',\n\t'Laprade',\n\t'Dealba',\n\t'Waymire',\n\t'Stiefel',\n\t'Carner',\n\t'Fallin',\n\t'Belin',\n\t'Anand',\n\t'Lesh',\n\t'Okada',\n\t'Whipkey',\n\t'Mang',\n\t'Harvill',\n\t'Caver',\n\t'Moskal',\n\t'Schaible',\n\t'Vandeusen',\n\t'Boyko',\n\t'Matteo',\n\t'Crisler',\n\t'Capehart',\n\t'Heide',\n\t'Holdsworth',\n\t'Mcdonagh',\n\t'Burlison',\n\t'Beshears',\n\t'Gills',\n\t'Cowger',\n\t'Gendreau',\n\t'Goering',\n\t'Hewes',\n\t'Whelchel',\n\t'Kier',\n\t'Tramel',\n\t'Mcsherry',\n\t'Morita',\n\t'Cissell',\n\t'Knaus',\n\t'Vangilder',\n\t'Karsten',\n\t'Linscott',\n\t'Ratner',\n\t'Catoe',\n\t'Scriven',\n\t'Gerstner',\n\t'Brobst',\n\t'Normandin',\n\t'Piasecki',\n\t'Tamura',\n\t'Balboa',\n\t'Nathanson',\n\t'Huizenga',\n\t'Renard',\n\t'Deshazo',\n\t'Ethier',\n\t'Fabiano',\n\t'Quisenberry',\n\t'Mcbryde',\n\t'Palencia',\n\t'Scaglione',\n\t'Friese',\n\t'Laughter',\n\t'Houchins',\n\t'Loman',\n\t'Garden',\n\t'Cromartie',\n\t'Borgman',\n\t'Hoffpauir',\n\t'Choquette',\n\t'Jarrard',\n\t'Fernald',\n\t'Barranco',\n\t'Levering',\n\t'Ansell',\n\t'Perl',\n\t'Caudell',\n\t'Ewen',\n\t'Ohanlon',\n\t'Swofford',\n\t'Reasoner',\n\t'Grout',\n\t'Rising',\n\t'Buttram',\n\t'Vandenheuvel',\n\t'Imel',\n\t'Rearick',\n\t'Harn',\n\t'Sorrels',\n\t'Biggins',\n\t'Renda',\n\t'Norden',\n\t'Matula',\n\t'Walch',\n\t'Broad',\n\t'Stokley',\n\t'Gully',\n\t'Barrientes',\n\t'Chilcote',\n\t'Freel',\n\t'Lage',\n\t'Farner',\n\t'Rubel',\n\t'Demko',\n\t'Shao',\n\t'Cupples',\n\t'Holderman',\n\t'Dunnam',\n\t'Hughs',\n\t'Foskey',\n\t'Darst',\n\t'Greenblatt',\n\t'Shiner',\n\t'Brasfield',\n\t'Simeon',\n\t'Maser',\n\t'Lacayo',\n\t'Priestley',\n\t'Pleasants',\n\t'Howse',\n\t'Iyer',\n\t'Perreira',\n\t'Baillargeon',\n\t'Revilla',\n\t'Yarger',\n\t'Gries',\n\t'Sheeley',\n\t'Prim',\n\t'Picazo',\n\t'Heinlein',\n\t'Merola',\n\t'Malhotra',\n\t'Wein',\n\t'Mchone',\n\t'Valliere',\n\t'Minner',\n\t'Blumer',\n\t'Hasse',\n\t'Kuester',\n\t'Landi',\n\t'Suits',\n\t'Primeaux',\n\t'Jarnagin',\n\t'Galle',\n\t'Greenlaw',\n\t'Qiu',\n\t'Lamarche',\n\t'Acheson',\n\t'Gothard',\n\t'Mendivil',\n\t'Bombard',\n\t'Mcquillen',\n\t'Munden',\n\t'Herzberg',\n\t'Ros',\n\t'Umstead',\n\t'Levins',\n\t'Pellegrin',\n\t'Castagna',\n\t'Alvord',\n\t'Huckins',\n\t'Wagnon',\n\t'Plemons',\n\t'Dolin',\n\t'Garica',\n\t'Lyttle',\n\t'Bazile',\n\t'Astudillo',\n\t'Gover',\n\t'Galati',\n\t'Seager',\n\t'Girardi',\n\t'Freels',\n\t'Bramblett',\n\t'Brancato',\n\t'Reppert',\n\t'Saetern',\n\t'Puig',\n\t'Prettyman',\n\t'Chagnon',\n\t'Heavner',\n\t'Schlichting',\n\t'Saladino',\n\t'Stall',\n\t'Loiselle',\n\t'Sedano',\n\t'Panos',\n\t'Heilig',\n\t'Ridgley',\n\t'Basilio',\n\t'Rapoza',\n\t'Furrow',\n\t'Oliveras',\n\t'Cordray',\n\t'Strausbaugh',\n\t'Culhane',\n\t'Iraheta',\n\t'Lamantia',\n\t'Shires',\n\t'Wilding',\n\t'Obanion',\n\t'Easterwood',\n\t'Hearns',\n\t'Manske',\n\t'Spiess',\n\t'Eckley',\n\t'Wootton',\n\t'Enochs',\n\t'Cheatwood',\n\t'Woodfin',\n\t'Akridge',\n\t'Mattocks',\n\t'Mcdougle',\n\t'Legette',\n\t'Neher',\n\t'Rhoton',\n\t'Vartanian',\n\t'Dunkel',\n\t'Wehmeyer',\n\t'Foutch',\n\t'Dille',\n\t'Halle',\n\t'Lowden',\n\t'Olesen',\n\t'Chace',\n\t'Hasbrouck',\n\t'Lesage',\n\t'Pappalardo',\n\t'Shinkle',\n\t'Ishii',\n\t'Peralez',\n\t'Gabler',\n\t'Fichter',\n\t'Mcnicholas',\n\t'Moshier',\n\t'Barbeau',\n\t'Bossert',\n\t'Trivett',\n\t'Bamford',\n\t'Lauterbach',\n\t'Gossman',\n\t'Epling',\n\t'Welk',\n\t'Daub',\n\t'Squier',\n\t'Dicus',\n\t'Siller',\n\t'Romaine',\n\t'Meriwether',\n\t'Bordner',\n\t'Baden',\n\t'Hagins',\n\t'Sica',\n\t'Mullane',\n\t'Jurgensen',\n\t'Tien',\n\t'Gertz',\n\t'Touchstone',\n\t'Bones',\n\t'Kimmons',\n\t'Prisco',\n\t'Kaser',\n\t'Drysdale',\n\t'Jelks',\n\t'Cerrone',\n\t'Wolfenbarger',\n\t'Deckert',\n\t'Ganley',\n\t'Fleeman',\n\t'Cubbage',\n\t'Woodie',\n\t'Schwan',\n\t'Siefert',\n\t'Rizvi',\n\t'Heier',\n\t'Khanna',\n\t'Leet',\n\t'Gratz',\n\t'Mullan',\n\t'Moorefield',\n\t'Fishback',\n\t'Whittenburg',\n\t'Casson',\n\t'Statham',\n\t'Red',\n\t'Coldiron',\n\t'Keplinger',\n\t'Reichman',\n\t'Brier',\n\t'Vavra',\n\t'Housman',\n\t'Kitson',\n\t'Fekete',\n\t'Rotella',\n\t'Onofre',\n\t'Orvis',\n\t'Beutler',\n\t'Cadwallader',\n\t'Gabor',\n\t'Emmanuel',\n\t'Moretz',\n\t'Suniga',\n\t'Mcmath',\n\t'Kinlaw',\n\t'Beringer',\n\t'Gaudreau',\n\t'Lirette',\n\t'Drye',\n\t'Oubre',\n\t'Gardella',\n\t'Reigle',\n\t'Zubia',\n\t'Mccardle',\n\t'Ambler',\n\t'Lucius',\n\t'Fizer',\n\t'Hilley',\n\t'Fischbach',\n\t'Borelli',\n\t'Gies',\n\t'Barks',\n\t'Sheard',\n\t'Hammontree',\n\t'Hogle',\n\t'Fagg',\n\t'Buitron',\n\t'Eiler',\n\t'Grandstaff',\n\t'Hank',\n\t'Wark',\n\t'Decoteau',\n\t'Depina',\n\t'Clabaugh',\n\t'Desiderio',\n\t'Kuchta',\n\t'Trang',\n\t'Abril',\n\t'Smathers',\n\t'Kaspar',\n\t'Melia',\n\t'Sandman',\n\t'Maltese',\n\t'Mccasland',\n\t'Rayl',\n\t'Meche',\n\t'Wiggin',\n\t'Saint',\n\t'Dorner',\n\t'Columbus',\n\t'Boatner',\n\t'Fresquez',\n\t'Sykora',\n\t'Shriner',\n\t'Drumheller',\n\t'Mahony',\n\t'Redinger',\n\t'Radloff',\n\t'Mitts',\n\t'Casperson',\n\t'Gammill',\n\t'Moraga',\n\t'Baratta',\n\t'Tow',\n\t'Ocon',\n\t'Cruce',\n\t'Bohannan',\n\t'Hurtt',\n\t'Mose',\n\t'Caines',\n\t'Heisey',\n\t'Pitcock',\n\t'Swiderski',\n\t'Shu',\n\t'Buda',\n\t'Whidden',\n\t'Busick',\n\t'Simas',\n\t'Croley',\n\t'Morrisey',\n\t'Saulsberry',\n\t'Crudup',\n\t'Bongiorno',\n\t'Beem',\n\t'Bunner',\n\t'Rosemond',\n\t'Freire',\n\t'Casado',\n\t'Merideth',\n\t'Selden',\n\t'Lamarre',\n\t'Fullwood',\n\t'Hartig',\n\t'Kerlin',\n\t'Lebowitz',\n\t'Kibbe',\n\t'Fannon',\n\t'Hotz',\n\t'Yerkes',\n\t'Re',\n\t'Waddington',\n\t'Akbar',\n\t'Baek',\n\t'Closson',\n\t'Miers',\n\t'Bonomo',\n\t'Wetherbee',\n\t'Taranto',\n\t'Henslee',\n\t'Bartle',\n\t'Hilger',\n\t'Asaro',\n\t'Mahr',\n\t'Strozier',\n\t'Agudelo',\n\t'Kulick',\n\t'Skoglund',\n\t'Yamasaki',\n\t'Schlemmer',\n\t'Hefley',\n\t'Waxman',\n\t'Radley',\n\t'Sanderlin',\n\t'Arispe',\n\t'Galang',\n\t'Morejon',\n\t'Stich',\n\t'Cesario',\n\t'Silvis',\n\t'Gurganus',\n\t'Shofner',\n\t'Funderburg',\n\t'Reddish',\n\t'Rybak',\n\t'Dingler',\n\t'Mankin',\n\t'Renna',\n\t'Alban',\n\t'Mckittrick',\n\t'Lippman',\n\t'Brenton',\n\t'Liebman',\n\t'Santillo',\n\t'Crigger',\n\t'Riney',\n\t'Mccraney',\n\t'Kluck',\n\t'Sosnowski',\n\t'Anspach',\n\t'Bourdon',\n\t'Modi',\n\t'Heer',\n\t'Mastroianni',\n\t'Musial',\n\t'Whiteaker',\n\t'Summa',\n\t'Herber',\n\t'Roselli',\n\t'Orris',\n\t'Bert',\n\t'Dedmon',\n\t'Kelson',\n\t'Paone',\n\t'Barstow',\n\t'Gerst',\n\t'Bettinger',\n\t'Castner',\n\t'Penman',\n\t'Broaddus',\n\t'Ohman',\n\t'Villalon',\n\t'Carwile',\n\t'Fluellen',\n\t'Ort',\n\t'Bommarito',\n\t'Shuff',\n\t'Cannata',\n\t'Westgate',\n\t'Bien',\n\t'Driggs',\n\t'Maisonet',\n\t'Costin',\n\t'Raine',\n\t'Banton',\n\t'Buterbaugh',\n\t'Katzman',\n\t'Coreas',\n\t'Rosalez',\n\t'Gose',\n\t'Robie',\n\t'Winburn',\n\t'Glancy',\n\t'Hild',\n\t'Strock',\n\t'Umanzor',\n\t'Hoglund',\n\t'Kesner',\n\t'Lynam',\n\t'Swayze',\n\t'Grizzard',\n\t'Fettig',\n\t'Macko',\n\t'Schrum',\n\t'Sours',\n\t'Yonker',\n\t'Ebanks',\n\t'Chiodo',\n\t'Meaney',\n\t'Paras',\n\t'Struthers',\n\t'Sicard',\n\t'Leveille',\n\t'Beckstead',\n\t'Calero',\n\t'Fuhrmann',\n\t'Lybarger',\n\t'Capo',\n\t'Adolph',\n\t'Raabe',\n\t'Gran',\n\t'Borel',\n\t'Ary',\n\t'Charland',\n\t'Huh',\n\t'Steinert',\n\t'Stemple',\n\t'Groat',\n\t'Zang',\n\t'Nath',\n\t'Ogara',\n\t'Pecina',\n\t'Simoes',\n\t'Breece',\n\t'Nascimento',\n\t'Usry',\n\t'Gain',\n\t'Brassfield',\n\t'Lochner',\n\t'Pietsch',\n\t'Wechsler',\n\t'Sum',\n\t'Teneyck',\n\t'Pelt',\n\t'Burnley',\n\t'Renzi',\n\t'Mujica',\n\t'Profitt',\n\t'Body',\n\t'Debusk',\n\t'Robidoux',\n\t'Pruneda',\n\t'Pomerantz',\n\t'Gonyea',\n\t'Crosier',\n\t'Currence',\n\t'Newborn',\n\t'Tolleson',\n\t'Conlan',\n\t'Dunsmore',\n\t'Tansey',\n\t'Clinard',\n\t'Staudt',\n\t'Oppenheim',\n\t'Gossard',\n\t'Osbourne',\n\t'Gilyard',\n\t'Lucido',\n\t'Tonkin',\n\t'Mitzel',\n\t'Sola',\n\t'Palombo',\n\t'Duane',\n\t'Mac',\n\t'Kerry',\n\t'Stills',\n\t'Viveiros',\n\t'Stallman',\n\t'Moos',\n\t'Follis',\n\t'Maris',\n\t'Hollier',\n\t'Gundlach',\n\t'Moler',\n\t'Schweigert',\n\t'Chartrand',\n\t'Finkle',\n\t'Meese',\n\t'Nigh',\n\t'Amundsen',\n\t'Brocato',\n\t'Dreier',\n\t'Glessner',\n\t'Weibel',\n\t'Fritch',\n\t'Retherford',\n\t'Rahim',\n\t'Markert',\n\t'Ronk',\n\t'Olmeda',\n\t'Gosney',\n\t'Keathley',\n\t'Luby',\n\t'Harrill',\n\t'Dinges',\n\t'Rocheleau',\n\t'Meisel',\n\t'Farrer',\n\t'Lute',\n\t'Apel',\n\t'Pincus',\n\t'Maida',\n\t'Jimmerson',\n\t'Baltz',\n\t'Cuccia',\n\t'Heenan',\n\t'Thieme',\n\t'Zoeller',\n\t'Larocco',\n\t'Abdalla',\n\t'Classen',\n\t'Hassinger',\n\t'Filler',\n\t'Pidgeon',\n\t'Hanford',\n\t'Espy',\n\t'Goodlett',\n\t'Jone',\n\t'Ruggeri',\n\t'Lisi',\n\t'Spada',\n\t'Gerrard',\n\t'Allbritton',\n\t'Brazelton',\n\t'Boggan',\n\t'Dufault',\n\t'Espejo',\n\t'Bodkin',\n\t'Penix',\n\t'Dockins',\n\t'Rascoe',\n\t'Swarthout',\n\t'Tritt',\n\t'Gouin',\n\t'Lamberth',\n\t'Bourn',\n\t'Barnhouse',\n\t'Guzzo',\n\t'Netherton',\n\t'Zamarron',\n\t'Rosenberry',\n\t'Dahms',\n\t'Anwar',\n\t'Whitesides',\n\t'Tidmore',\n\t'Longstreet',\n\t'Claunch',\n\t'Ehrhart',\n\t'Hullinger',\n\t'Xia',\n\t'Heideman',\n\t'Nicklas',\n\t'Prins',\n\t'Soni',\n\t'Dominquez',\n\t'Vogelsang',\n\t'Pew',\n\t'Chess',\n\t'Simmerman',\n\t'Brunell',\n\t'Matthes',\n\t'Kinnison',\n\t'Cansler',\n\t'Weekly',\n\t'Eger',\n\t'Garabedian',\n\t'Milliman',\n\t'Severns',\n\t'Magnusson',\n\t'Fossum',\n\t'Salamon',\n\t'Vandoren',\n\t'Gillingham',\n\t'Charney',\n\t'Nokes',\n\t'Lamon',\n\t'Irick',\n\t'Okeeffe',\n\t'Zou',\n\t'Kott',\n\t'Quillin',\n\t'Friar',\n\t'Drummer',\n\t'Catchings',\n\t'Hamada',\n\t'Scheck',\n\t'Setser',\n\t'Gobble',\n\t'Condra',\n\t'Bowley',\n\t'Deschamps',\n\t'Sylva',\n\t'Bartolome',\n\t'Warfel',\n\t'Veltri',\n\t'Speers',\n\t'Butner',\n\t'Delorme',\n\t'Giesler',\n\t'Sonntag',\n\t'Wetherell',\n\t'Ohagan',\n\t'Torbert',\n\t'Grandberry',\n\t'Ronning',\n\t'Howser',\n\t'Soden',\n\t'Rasco',\n\t'Clauss',\n\t'Beland',\n\t'Nicola',\n\t'Justiniano',\n\t'Varnum',\n\t'Fergus',\n\t'Lazcano',\n\t'Sartori',\n\t'Carnley',\n\t'Lucarelli',\n\t'Bergh',\n\t'Wellborn',\n\t'Bow',\n\t'Longshore',\n\t'Marcel',\n\t'Sumlin',\n\t'Atilano',\n\t'Dostal',\n\t'Westendorf',\n\t'Stiver',\n\t'Morency',\n\t'Herrod',\n\t'Bologna',\n\t'Valiente',\n\t'Weinert',\n\t'Gaertner',\n\t'Prock',\n\t'Spangenberg',\n\t'Tineo',\n\t'Cosio',\n\t'Maass',\n\t'Rist',\n\t'Oatman',\n\t'Waguespack',\n\t'Cardiel',\n\t'Grate',\n\t'Behrends',\n\t'Linger',\n\t'Pozo',\n\t'Scoggin',\n\t'Jenkinson',\n\t'Ake',\n\t'Redick',\n\t'Bonacci',\n\t'Rivet',\n\t'Declue',\n\t'Swing',\n\t'Chopra',\n\t'Leib',\n\t'Wallner',\n\t'Grimmer',\n\t'Wilmes',\n\t'Pirkle',\n\t'Stanhope',\n\t'Knop',\n\t'Culotta',\n\t'Dipaola',\n\t'Hipolito',\n\t'Gerling',\n\t'Sennett',\n\t'Fulghum',\n\t'Grothe',\n\t'Krout',\n\t'Onorato',\n\t'Donis',\n\t'Winbush',\n\t'Aoki',\n\t'Buscher',\n\t'Jarquin',\n\t'Lemanski',\n\t'Mcgrane',\n\t'Tardif',\n\t'Segundo',\n\t'Caba',\n\t'Sease',\n\t'Blinn',\n\t'Losee',\n\t'Kirschbaum',\n\t'Baskett',\n\t'Knights',\n\t'Goudeau',\n\t'Grondin',\n\t'Harting',\n\t'Szewczyk',\n\t'Wieder',\n\t'Conatser',\n\t'Romanelli',\n\t'Freshour',\n\t'Brizendine',\n\t'Rolen',\n\t'Guynn',\n\t'Laforest',\n\t'Doris',\n\t'Sandridge',\n\t'Dublin',\n\t'Blancas',\n\t'Duryea',\n\t'Naik',\n\t'Paradiso',\n\t'Scheele',\n\t'Westra',\n\t'Hassel',\n\t'Bertucci',\n\t'Fansler',\n\t'Flohr',\n\t'Solt',\n\t'Suess',\n\t'Keiper',\n\t'Downard',\n\t'Ivester',\n\t'Darley',\n\t'Seales',\n\t'Kolesar',\n\t'Overbeck',\n\t'Subramanian',\n\t'Panter',\n\t'Parshall',\n\t'Stannard',\n\t'Gravley',\n\t'Dhaliwal',\n\t'Shippy',\n\t'Dolphin',\n\t'Lepper',\n\t'Gorby',\n\t'Delmonte',\n\t'Piccirillo',\n\t'Besaw',\n\t'Alligood',\n\t'Rhymes',\n\t'Eisenman',\n\t'Deveau',\n\t'Tilden',\n\t'Girton',\n\t'Buser',\n\t'Rentschler',\n\t'Sopko',\n\t'Uriostegui',\n\t'Wasko',\n\t'Noffsinger',\n\t'Barkman',\n\t'Dyck',\n\t'Ferrero',\n\t'Kiehl',\n\t'Leffel',\n\t'Rybicki',\n\t'Hedstrom',\n\t'Bracamontes',\n\t'Zebrowski',\n\t'Blundell',\n\t'Brightman',\n\t'Hegwood',\n\t'Beecham',\n\t'Kolbe',\n\t'Bucy',\n\t'Bondi',\n\t'Borgen',\n\t'Gibbens',\n\t'Pullman',\n\t'Letcher',\n\t'Ferebee',\n\t'Kitterman',\n\t'Seefeldt',\n\t'Upham',\n\t'Thiede',\n\t'Bolster',\n\t'Bastin',\n\t'Bondy',\n\t'Mershon',\n\t'Nickson',\n\t'Drozd',\n\t'Schroyer',\n\t'Mcmenamin',\n\t'Reith',\n\t'Lovin',\n\t'San',\n\t'Henegar',\n\t'Haislip',\n\t'Barco',\n\t'Arter',\n\t'Malecki',\n\t'Teeple',\n\t'Walpole',\n\t'Feil',\n\t'Neitzel',\n\t'Ostler',\n\t'Parmar',\n\t'Vinton',\n\t'Jan',\n\t'Weldy',\n\t'Etherton',\n\t'Joya',\n\t'Saliba',\n\t'Schnur',\n\t'Belles',\n\t'Mcgeorge',\n\t'Olden',\n\t'Rarick',\n\t'Worrall',\n\t'Degen',\n\t'Froman',\n\t'Odowd',\n\t'Einhorn',\n\t'Fimbres',\n\t'Maresca',\n\t'Rocker',\n\t'Arend',\n\t'Biermann',\n\t'Guimond',\n\t'Mcgurk',\n\t'Goll',\n\t'Santilli',\n\t'Hadlock',\n\t'Teer',\n\t'Dillion',\n\t'Jorden',\n\t'Honore',\n\t'Bromberg',\n\t'Stoneman',\n\t'Blossom',\n\t'Guzik',\n\t'Stockstill',\n\t'Wax',\n\t'Anello',\n\t'Blasko',\n\t'Frese',\n\t'Berthold',\n\t'Morefield',\n\t'Baptist',\n\t'Legault',\n\t'Bouffard',\n\t'Bebout',\n\t'Darnall',\n\t'Buscemi',\n\t'Buentello',\n\t'Scroggs',\n\t'Gatton',\n\t'Turnquist',\n\t'Lucht',\n\t'Remick',\n\t'Godlewski',\n\t'Bradt',\n\t'Waldorf',\n\t'Zeringue',\n\t'Rowen',\n\t'Mowbray',\n\t'Parkey',\n\t'Engram',\n\t'Mazzarella',\n\t'Kirkbride',\n\t'Gridley',\n\t'Kaster',\n\t'Lorenzana',\n\t'Wareham',\n\t'Star',\n\t'Marshburn',\n\t'Everman',\n\t'Wolfram',\n\t'Zick',\n\t'Hyun',\n\t'Yerger',\n\t'Baham',\n\t'Gebhard',\n\t'Ruf',\n\t'Suchy',\n\t'Tieman',\n\t'Wenz',\n\t'Schiro',\n\t'Fout',\n\t'Abdo',\n\t'Hayter',\n\t'Cleaves',\n\t'Fritsche',\n\t'Meurer',\n\t'Riendeau',\n\t'Ventimiglia',\n\t'Cervera',\n\t'Mallow',\n\t'Allie',\n\t'Hanscom',\n\t'Viloria',\n\t'Dubon',\n\t'Leeson',\n\t'Ruffing',\n\t'Jonson',\n\t'Fenimore',\n\t'Gonzaga',\n\t'Schriver',\n\t'Traina',\n\t'Mecca',\n\t'Lantigua',\n\t'Baril',\n\t'Harford',\n\t'Bartow',\n\t'Asbell',\n\t'Rumley',\n\t'Brogden',\n\t'Derryberry',\n\t'Ketner',\n\t'Dakin',\n\t'Wass',\n\t'Fallis',\n\t'Wada',\n\t'Studdard',\n\t'Lecroy',\n\t'Fetty',\n\t'Nass',\n\t'Chute',\n\t'Parman',\n\t'Bevans',\n\t'Headen',\n\t'Hysell',\n\t'Merten',\n\t'Most',\n\t'Fuss',\n\t'Schrank',\n\t'Last',\n\t'Even',\n\t'Vaz',\n\t'Sifford',\n\t'Streets',\n\t'Claude',\n\t'Bronstein',\n\t'Sherburne',\n\t'Wadkins',\n\t'Gascon',\n\t'Seiter',\n\t'Steffan',\n\t'Cardozo',\n\t'Henricks',\n\t'Claflin',\n\t'Etzel',\n\t'Kulas',\n\t'Trinkle',\n\t'Ortegon',\n\t'Phaneuf',\n\t'Langworthy',\n\t'Barb',\n\t'Mazon',\n\t'Veney',\n\t'Redondo',\n\t'Tieu',\n\t'Laursen',\n\t'Nanez',\n\t'Votaw',\n\t'Walraven',\n\t'Abella',\n\t'Dsouza',\n\t'Bayley',\n\t'Townson',\n\t'Applebaum',\n\t'Mazzei',\n\t'Piche',\n\t'Rivenbark',\n\t'Urrea',\n\t'Dolph',\n\t'Bonifacio',\n\t'Shehan',\n\t'Glascock',\n\t'Verde',\n\t'Gadberry',\n\t'Trimm',\n\t'Dowe',\n\t'Khang',\n\t'Mulhall',\n\t'Selzer',\n\t'Raub',\n\t'Ore',\n\t'Copes',\n\t'Masuda',\n\t'Moscoso',\n\t'Zeitler',\n\t'Mollica',\n\t'Iler',\n\t'Leventhal',\n\t'Manders',\n\t'Prue',\n\t'Fergerson',\n\t'Brose',\n\t'Phu',\n\t'Debellis',\n\t'Haan',\n\t'Schoening',\n\t'Stager',\n\t'Demos',\n\t'Rumble',\n\t'Brunt',\n\t'Nivens',\n\t'Manigault',\n\t'Buendia',\n\t'Deschenes',\n\t'Wittmer',\n\t'Hamon',\n\t'Hentz',\n\t'Loud',\n\t'Oseguera',\n\t'Rayo',\n\t'Macfarland',\n\t'Mimms',\n\t'Grunewald',\n\t'Hartness',\n\t'Wynkoop',\n\t'Wallingford',\n\t'Juergens',\n\t'Meszaros',\n\t'Riehle',\n\t'Trego',\n\t'Neece',\n\t'Coggin',\n\t'Burrill',\n\t'Laurel',\n\t'Routt',\n\t'Rodger',\n\t'Krum',\n\t'Faulkenberry',\n\t'Labadie',\n\t'Hemming',\n\t'Fulp',\n\t'Jamal',\n\t'Deloney',\n\t'Fells',\n\t'Bohnert',\n\t'Kapadia',\n\t'Guill',\n\t'Coop',\n\t'Broadhurst',\n\t'Mccrimmon',\n\t'Bonfiglio',\n\t'Capetillo',\n\t'Chamorro',\n\t'Gargiulo',\n\t'Stoehr',\n\t'Schlecht',\n\t'Karlson',\n\t'Garten',\n\t'Remer',\n\t'Mebane',\n\t'Finnigan',\n\t'Bourdeau',\n\t'Espindola',\n\t'Shukla',\n\t'Petras',\n\t'Steinberger',\n\t'Casner',\n\t'Carico',\n\t'Seevers',\n\t'Westwood',\n\t'Hosea',\n\t'Mcphillips',\n\t'Nygren',\n\t'Wagaman',\n\t'Coghlan',\n\t'Sutherlin',\n\t'Sellman',\n\t'Bashore',\n\t'Mullican',\n\t'Stoneburner',\n\t'Montag',\n\t'Karst',\n\t'Murch',\n\t'Puffer',\n\t'Sabala',\n\t'Pauli',\n\t'Odonoghue',\n\t'Lassen',\n\t'Mattera',\n\t'Mcaninch',\n\t'Portugal',\n\t'Clingan',\n\t'Michener',\n\t'Munsell',\n\t'Streetman',\n\t'Harton',\n\t'Swarts',\n\t'Honig',\n\t'Jesus',\n\t'Rentas',\n\t'Trosper',\n\t'Coffield',\n\t'Burket',\n\t'Donaghy',\n\t'Byun',\n\t'Riess',\n\t'Mcqueary',\n\t'Stayton',\n\t'Ferron',\n\t'Wedding',\n\t'Tibbitts',\n\t'Frisbee',\n\t'Reinoso',\n\t'Lama',\n\t'Allyn',\n\t'Sheen',\n\t'Tyra',\n\t'Golder',\n\t'Veasey',\n\t'Schroth',\n\t'Kukla',\n\t'Narayan',\n\t'Vandemark',\n\t'Horace',\n\t'Kadlec',\n\t'Portnoy',\n\t'Reynosa',\n\t'Surprenant',\n\t'Savell',\n\t'Seagle',\n\t'Vandervort',\n\t'Eye',\n\t'Eccleston',\n\t'Blaise',\n\t'Glaspie',\n\t'Cressman',\n\t'Lahti',\n\t'Yocom',\n\t'Leppert',\n\t'Brendle',\n\t'Greenough',\n\t'Relyea',\n\t'Marinez',\n\t'Bouley',\n\t'Fincham',\n\t'Highley',\n\t'Goza',\n\t'Norrell',\n\t'Yusuf',\n\t'Ohm',\n\t'Thakkar',\n\t'Cosenza',\n\t'Efird',\n\t'Heger',\n\t'Dysart',\n\t'Mango',\n\t'Fitchett',\n\t'Kring',\n\t'Paolucci',\n\t'Menges',\n\t'Layden',\n\t'Mccleery',\n\t'Benko',\n\t'Sandor',\n\t'Blakney',\n\t'Zanders',\n\t'Gengler',\n\t'Fujita',\n\t'Huls',\n\t'Basquez',\n\t'Trepanier',\n\t'Spadaro',\n\t'Ankney',\n\t'Damiani',\n\t'Games',\n\t'Cherney',\n\t'Fitzsimons',\n\t'Dearmas',\n\t'Bonet',\n\t'Diem',\n\t'Shimp',\n\t'Agrawal',\n\t'Gaw',\n\t'Gahagan',\n\t'Fossett',\n\t'Kafka',\n\t'Dedios',\n\t'Coryell',\n\t'Bahe',\n\t'Wurm',\n\t'Wishart',\n\t'Dray',\n\t'Armer',\n\t'Khalid',\n\t'Gassaway',\n\t'Vawter',\n\t'Loew',\n\t'Coello',\n\t'Curren',\n\t'Gilder',\n\t'Letendre',\n\t'Sprecher',\n\t'Rexrode',\n\t'Minich',\n\t'Koepp',\n\t'Mulloy',\n\t'Bohman',\n\t'Gambrel',\n\t'Hackley',\n\t'Demasi',\n\t'Hoffert',\n\t'Kittredge',\n\t'Maltby',\n\t'Nyquist',\n\t'Schieber',\n\t'Kennell',\n\t'Calderwood',\n\t'Compean',\n\t'Romines',\n\t'Simonelli',\n\t'Pico',\n\t'Oda',\n\t'Holte',\n\t'Bate',\n\t'Learn',\n\t'Lowenstein',\n\t'Holtman',\n\t'Mingus',\n\t'Sessa',\n\t'Legendre',\n\t'Gerrish',\n\t'Schoenberg',\n\t'Liberman',\n\t'Mclachlan',\n\t'Higginson',\n\t'Vince',\n\t'Mallery',\n\t'Delamora',\n\t'Difranco',\n\t'Lein',\n\t'Haltom',\n\t'Dority',\n\t'Marcellus',\n\t'Heskett',\n\t'Harward',\n\t'Spinney',\n\t'Darwin',\n\t'Baylis',\n\t'Amodeo',\n\t'Schwandt',\n\t'Mcmorrow',\n\t'Foraker',\n\t'Fyfe',\n\t'Shingleton',\n\t'Blandon',\n\t'Waddy',\n\t'Ricca',\n\t'Scheffer',\n\t'Balliet',\n\t'Philipp',\n\t'Rish',\n\t'Hattaway',\n\t'Krejci',\n\t'Orduno',\n\t'Passarelli',\n\t'Skala',\n\t'Oram',\n\t'Raynes',\n\t'Hiett',\n\t'Tolan',\n\t'Kimbell',\n\t'Delara',\n\t'Farhat',\n\t'Kamps',\n\t'Mohney',\n\t'Escarcega',\n\t'Mell',\n\t'Mcquay',\n\t'Cannizzaro',\n\t'Deuel',\n\t'Losoya',\n\t'Goldin',\n\t'Zaidi',\n\t'Gillmore',\n\t'Buelow',\n\t'Maust',\n\t'Guerrera',\n\t'Bouck',\n\t'Bick',\n\t'Kelty',\n\t'Pines',\n\t'Braziel',\n\t'Bruening',\n\t'Frenzel',\n\t'Kenna',\n\t'Loria',\n\t'Koren',\n\t'Cornelio',\n\t'Poisson',\n\t'Raker',\n\t'Ptak',\n\t'Bohr',\n\t'Coury',\n\t'Failla',\n\t'Cipriani',\n\t'Delany',\n\t'Marmon',\n\t'Kinch',\n\t'Figgins',\n\t'Delfino',\n\t'Risser',\n\t'Hickox',\n\t'Fager',\n\t'Turpen',\n\t'Dalzell',\n\t'Falvey',\n\t'Leiker',\n\t'Mcgonigal',\n\t'Vaquera',\n\t'Weisser',\n\t'Viviano',\n\t'Shrock',\n\t'Minaya',\n\t'Chitty',\n\t'Costley',\n\t'Granberry',\n\t'Dimaria',\n\t'Roma',\n\t'Ortis',\n\t'Burnam',\n\t'Burruss',\n\t'Stoughton',\n\t'Cales',\n\t'Burrage',\n\t'Vanwagner',\n\t'Espada',\n\t'Mccuen',\n\t'Baize',\n\t'Pullum',\n\t'Gerrity',\n\t'Vicari',\n\t'Heuser',\n\t'Semler',\n\t'Fear',\n\t'Havener',\n\t'Kash',\n\t'Thibodaux',\n\t'Hadaway',\n\t'Smithwick',\n\t'Eisenhart',\n\t'Hodgin',\n\t'Cluck',\n\t'Godby',\n\t'Belli',\n\t'Demaree',\n\t'Beyers',\n\t'Jared',\n\t'Mall',\n\t'Defoe',\n\t'Chmura',\n\t'Hepworth',\n\t'Hintze',\n\t'Luk',\n\t'Vanriper',\n\t'Solari',\n\t'Atlas',\n\t'Outland',\n\t'Hanselman',\n\t'Scharff',\n\t'Rhein',\n\t'Milone',\n\t'Rochford',\n\t'Mynatt',\n\t'Lambdin',\n\t'Sandell',\n\t'Grounds',\n\t'Tabler',\n\t'Smartt',\n\t'Dejean',\n\t'Clayborne',\n\t'Vangorder',\n\t'Eastin',\n\t'Hiler',\n\t'Lisle',\n\t'Gramling',\n\t'Degarmo',\n\t'Malec',\n\t'Tinkham',\n\t'Vanauken',\n\t'Andrzejewski',\n\t'Rundell',\n\t'Happel',\n\t'Strine',\n\t'Koerber',\n\t'Haner',\n\t'Ashcroft',\n\t'Hille',\n\t'Cairo',\n\t'Upson',\n\t'Mooring',\n\t'Koury',\n\t'Vito',\n\t'Oberlin',\n\t'Christiano',\n\t'Redfearn',\n\t'Trower',\n\t'Hibbler',\n\t'Sumter',\n\t'Raftery',\n\t'Geise',\n\t'Wohl',\n\t'Gorney',\n\t'Peasley',\n\t'Heap',\n\t'Brazeal',\n\t'Mccleskey',\n\t'Yard',\n\t'Mcroy',\n\t'Amend',\n\t'Cutshaw',\n\t'Kazmierczak',\n\t'Strandberg',\n\t'Lasko',\n\t'Newlon',\n\t'File',\n\t'Bevill',\n\t'Silvera',\n\t'Arakaki',\n\t'Kelsch',\n\t'Ostendorf',\n\t'Cowie',\n\t'Hove',\n\t'Doles',\n\t'Bouvier',\n\t'Fecteau',\n\t'Hasegawa',\n\t'Paschke',\n\t'Taing',\n\t'Heldt',\n\t'Allaire',\n\t'Ochsner',\n\t'Giusti',\n\t'Reisner',\n\t'Swim',\n\t'Laidlaw',\n\t'Vanderbilt',\n\t'Atterberry',\n\t'Barthelemy',\n\t'Chalker',\n\t'Degregorio',\n\t'Mastro',\n\t'Patlan',\n\t'Gipe',\n\t'Roosa',\n\t'Filkins',\n\t'Styron',\n\t'Bryer',\n\t'Blackston',\n\t'Hagel',\n\t'Fralick',\n\t'Linhart',\n\t'Moura',\n\t'Pavia',\n\t'Pavao',\n\t'Furry',\n\t'Petrus',\n\t'Fairweather',\n\t'Blystone',\n\t'Co',\n\t'Divito',\n\t'Villicana',\n\t'Winch',\n\t'Tome',\n\t'Lanoue',\n\t'Biron',\n\t'Noell',\n\t'Mckeel',\n\t'Worthey',\n\t'Aten',\n\t'Eyer',\n\t'Zhen',\n\t'Tischler',\n\t'Luoma',\n\t'Opp',\n\t'Riggin',\n\t'Furness',\n\t'Wolbert',\n\t'Penning',\n\t'Draves',\n\t'Whitehill',\n\t'Dudgeon',\n\t'Kinkead',\n\t'Luca',\n\t'Rosell',\n\t'Macauley',\n\t'Goldner',\n\t'Ishikawa',\n\t'Kirchhoff',\n\t'Lamarca',\n\t'Miyashiro',\n\t'Weger',\n\t'Wuest',\n\t'Kreis',\n\t'Urbanek',\n\t'Palko',\n\t'Victorino',\n\t'Morado',\n\t'Burchette',\n\t'Holyfield',\n\t'Tulloch',\n\t'Twombly',\n\t'Munk',\n\t'Woolford',\n\t'Knisely',\n\t'Locher',\n\t'Eckart',\n\t'Rancourt',\n\t'Pyron',\n\t'Edney',\n\t'Besser',\n\t'Truex',\n\t'Monterroso',\n\t'Bruneau',\n\t'Province',\n\t'Permenter',\n\t'Nims',\n\t'Rollison',\n\t'Cabell',\n\t'Sylvain',\n\t'Salman',\n\t'Signorelli',\n\t'Vegas',\n\t'Maddy',\n\t'Bachelder',\n\t'Sevigny',\n\t'Stolte',\n\t'Chavarin',\n\t'Lukes',\n\t'Rather',\n\t'Gartland',\n\t'Kurek',\n\t'Nantz',\n\t'Savard',\n\t'Finegan',\n\t'No',\n\t'Chichester',\n\t'Newbill',\n\t'Mahnke',\n\t'Sax',\n\t'Sowinski',\n\t'Wendler',\n\t'Cadiz',\n\t'Male',\n\t'Mealey',\n\t'Brookes',\n\t'Enderle',\n\t'Valenta',\n\t'Tooker',\n\t'Whitbeck',\n\t'Threet',\n\t'Cavitt',\n\t'Murtagh',\n\t'Phalen',\n\t'Errico',\n\t'Merkley',\n\t'Ju',\n\t'Zachery',\n\t'Bramer',\n\t'Henline',\n\t'Noga',\n\t'Woelfel',\n\t'Deras',\n\t'Amen',\n\t'Aldape',\n\t'Bartling',\n\t'Claros',\n\t'Spurrier',\n\t'Ginder',\n\t'Fred',\n\t'Giberson',\n\t'Ryba',\n\t'Sommerfeld',\n\t'Dahle',\n\t'Endo',\n\t'Haddon',\n\t'Bowlby',\n\t'Wagener',\n\t'Ketter',\n\t'Balint',\n\t'Goheen',\n\t'Motsinger',\n\t'Celentano',\n\t'Drawdy',\n\t'Dennehy',\n\t'Mcelligott',\n\t'Nakamoto',\n\t'Deines',\n\t'Goldsby',\n\t'Drakeford',\n\t'Steffy',\n\t'Streich',\n\t'Villasana',\n\t'Cermak',\n\t'Prill',\n\t'Ellzey',\n\t'Gartrell',\n\t'Duffie',\n\t'Rother',\n\t'Buse',\n\t'Luz',\n\t'Groen',\n\t'Laviolette',\n\t'Roles',\n\t'Days',\n\t'Eash',\n\t'Haefner',\n\t'Font',\n\t'Mcree',\n\t'Bustillo',\n\t'Coughlan',\n\t'Bax',\n\t'Hoxie',\n\t'Barre',\n\t'Scaife',\n\t'Nowacki',\n\t'Reichardt',\n\t'Rogel',\n\t'Ivins',\n\t'Vanderburg',\n\t'Etchison',\n\t'Chesson',\n\t'Molden',\n\t'Giuliani',\n\t'Goodpaster',\n\t'Kriner',\n\t'Sturtz',\n\t'Tschida',\n\t'Henschel',\n\t'Asselin',\n\t'Kocsis',\n\t'Kroger',\n\t'Swayne',\n\t'Gallop',\n\t'Fraker',\n\t'Lauro',\n\t'Tuohy',\n\t'Scholes',\n\t'Croxton',\n\t'Fertig',\n\t'Gregerson',\n\t'Gundersen',\n\t'Lehrer',\n\t'Monsivais',\n\t'Pilla',\n\t'Weishaar',\n\t'Gutshall',\n\t'Winget',\n\t'Human',\n\t'Oberry',\n\t'Learned',\n\t'Marburger',\n\t'Teed',\n\t'Parrilla',\n\t'Due',\n\t'Hartzler',\n\t'Cieslak',\n\t'Feltz',\n\t'Geren',\n\t'Wile',\n\t'Waldrip',\n\t'Clore',\n\t'Stutler',\n\t'Feehan',\n\t'Lacher',\n\t'Felter',\n\t'Barakat',\n\t'Flippen',\n\t'Holsey',\n\t'Finkbeiner',\n\t'Istre',\n\t'Lengyel',\n\t'Lupercio',\n\t'Beegle',\n\t'Habel',\n\t'Hammill',\n\t'Kifer',\n\t'Buswell',\n\t'Deboard',\n\t'Guilliams',\n\t'Ahlstrom',\n\t'Beliveau',\n\t'Sasse',\n\t'Delker',\n\t'Letterman',\n\t'Avey',\n\t'Bohlen',\n\t'Piner',\n\t'Folmar',\n\t'Barile',\n\t'Komar',\n\t'Bonelli',\n\t'Lamay',\n\t'Cora',\n\t'Deere',\n\t'Sanon',\n\t'Deppe',\n\t'Emmerich',\n\t'Giannone',\n\t'Navarra',\n\t'Hudock',\n\t'Seaborn',\n\t'Burda',\n\t'Faz',\n\t'Stefani',\n\t'Beemer',\n\t'Vose',\n\t'Calandra',\n\t'Eno',\n\t'Figueredo',\n\t'Lauck',\n\t'Schwindt',\n\t'Dumais',\n\t'Hedger',\n\t'Capp',\n\t'Barreiro',\n\t'Buker',\n\t'Spruell',\n\t'Bertolini',\n\t'Hoar',\n\t'Tiemann',\n\t'Vandenbosch',\n\t'Winebrenner',\n\t'Maio',\n\t'Winship',\n\t'Brissette',\n\t'Hansell',\n\t'Elsey',\n\t'Hansard',\n\t'Gildersleeve',\n\t'Hambright',\n\t'Borba',\n\t'Konieczny',\n\t'Lundell',\n\t'Tiedemann',\n\t'Siegler',\n\t'Ying',\n\t'Mckinsey',\n\t'Olah',\n\t'Boersma',\n\t'Younkin',\n\t'Evanoff',\n\t'Nakashima',\n\t'Scalia',\n\t'Piro',\n\t'Colorado',\n\t'Felan',\n\t'Fuentez',\n\t'Blea',\n\t'Gowin',\n\t'Hanning',\n\t'Byrom',\n\t'Morant',\n\t'Bachand',\n\t'Mcsorley',\n\t'Peaslee',\n\t'Bardsley',\n\t'Stilson',\n\t'Severs',\n\t'Kincheloe',\n\t'Kyler',\n\t'Aurand',\n\t'Bento',\n\t'Hoeppner',\n\t'Mertes',\n\t'Pickrell',\n\t'Rustad',\n\t'Millikan',\n\t'Celestino',\n\t'Hovland',\n\t'Kurowski',\n\t'Zollinger',\n\t'Tallon',\n\t'Junkins',\n\t'Mizrahi',\n\t'Bomberger',\n\t'Farrand',\n\t'Curto',\n\t'Bona',\n\t'Donatelli',\n\t'Eppley',\n\t'Schurman',\n\t'Henao',\n\t'Tomberlin',\n\t'Provencio',\n\t'Speidel',\n\t'Cree',\n\t'Inskeep',\n\t'Yeates',\n\t'Hoggatt',\n\t'Hinkson',\n\t'Ficklin',\n\t'Mcnealy',\n\t'Cabanas',\n\t'Laycock',\n\t'Theroux',\n\t'Weymouth',\n\t'Mabie',\n\t'Hatchell',\n\t'Bohanon',\n\t'Bilger',\n\t'Nazarian',\n\t'Weist',\n\t'Depue',\n\t'Mangini',\n\t'Gelb',\n\t'Luman',\n\t'Blass',\n\t'Desroches',\n\t'Hearon',\n\t'Mcmiller',\n\t'Stoltenberg',\n\t'Parenti',\n\t'Daulton',\n\t'Smail',\n\t'Chisum',\n\t'Benefiel',\n\t'Tetrault',\n\t'Foland',\n\t'Reddington',\n\t'Mattei',\n\t'Custis',\n\t'Fransen',\n\t'Zylstra',\n\t'Salvaggio',\n\t'Factor',\n\t'Deshong',\n\t'Biederman',\n\t'Sirianni',\n\t'Steckler',\n\t'Thrall',\n\t'Dorsch',\n\t'Harpe',\n\t'Tell',\n\t'Galusha',\n\t'Guttman',\n\t'Raposa',\n\t'Jaros',\n\t'Lipka',\n\t'Shive',\n\t'Shand',\n\t'Brizuela',\n\t'Horvat',\n\t'Pisciotta',\n\t'Sorge',\n\t'Riebe',\n\t'Vanderlaan',\n\t'Isenhour',\n\t'Franson',\n\t'Goslin',\n\t'Amore',\n\t'Leachman',\n\t'Foulks',\n\t'Alamillo',\n\t'Scarpa',\n\t'Tickle',\n\t'Pettitt',\n\t'Orrell',\n\t'Fleckenstein',\n\t'Sapien',\n\t'Roye',\n\t'Mcmeans',\n\t'Sligh',\n\t'Landgraf',\n\t'Cecere',\n\t'Aune',\n\t'Ketron',\n\t'Welcher',\n\t'Tilford',\n\t'Maston',\n\t'Overall',\n\t'Fails',\n\t'Bah',\n\t'Ketterman',\n\t'Lindauer',\n\t'Saxe',\n\t'Majka',\n\t'Goodenough',\n\t'Panella',\n\t'Ramm',\n\t'Caley',\n\t'Christine',\n\t'Kinsler',\n\t'Pippen',\n\t'Murph',\n\t'Ammann',\n\t'Falkowski',\n\t'Madonna',\n\t'Seligman',\n\t'Rommel',\n\t'Lareau',\n\t'Melone',\n\t'Frasure',\n\t'Joyal',\n\t'Piekarski',\n\t'Porcelli',\n\t'Kennington',\n\t'Pica',\n\t'Ankrom',\n\t'Capron',\n\t'Chatmon',\n\t'Horrigan',\n\t'Morelos',\n\t'Noren',\n\t'Paolini',\n\t'Wildermuth',\n\t'Rossow',\n\t'Dorgan',\n\t'Pawlik',\n\t'Reiber',\n\t'Rothenberger',\n\t'Mcgonigle',\n\t'Oren',\n\t'Jeans',\n\t'Vivas',\n\t'Gerner',\n\t'Brzozowski',\n\t'Croyle',\n\t'Klick',\n\t'Vidaurri',\n\t'Wollman',\n\t'Brouillard',\n\t'Dejohn',\n\t'Meikle',\n\t'Grochowski',\n\t'Kaczor',\n\t'Philbin',\n\t'Sperber',\n\t'Vancil',\n\t'Zornes',\n\t'Strope',\n\t'Housel',\n\t'Minks',\n\t'Dike',\n\t'Jasmin',\n\t'Denicola',\n\t'Gokey',\n\t'Dominy',\n\t'Gillham',\n\t'Viray',\n\t'Herz',\n\t'Hursh',\n\t'Koeller',\n\t'Caicedo',\n\t'Near',\n\t'Harrel',\n\t'Veale',\n\t'Gustavson',\n\t'Lopiccolo',\n\t'Goldschmidt',\n\t'Loder',\n\t'Vannorman',\n\t'Maske',\n\t'Randel',\n\t'Pinner',\n\t'Buntin',\n\t'Roache',\n\t'Pinnock',\n\t'Dimaio',\n\t'Heckert',\n\t'Perrigo',\n\t'Schank',\n\t'Lisowski',\n\t'Brownstein',\n\t'Sharer',\n\t'Hambleton',\n\t'Maker',\n\t'Hursey',\n\t'Aguado',\n\t'Tian',\n\t'Rheaume',\n\t'Becraft',\n\t'Sowders',\n\t'Bratt',\n\t'Tebo',\n\t'Eid',\n\t'Reinecke',\n\t'Storck',\n\t'Pech',\n\t'Alspaugh',\n\t'Grell',\n\t'Purdue',\n\t'Jennette',\n\t'Pauling',\n\t'Wint',\n\t'Knupp',\n\t'Madewell',\n\t'Schwanke',\n\t'Tellier',\n\t'Washer',\n\t'Staff',\n\t'Keely',\n\t'Lisenby',\n\t'Walder',\n\t'Kennerly',\n\t'Ip',\n\t'Michalik',\n\t'Eichner',\n\t'Disbrow',\n\t'Bellomy',\n\t'Boesch',\n\t'Chirico',\n\t'Lietz',\n\t'Ploof',\n\t'Dyar',\n\t'Bai',\n\t'Lary',\n\t'Corbo',\n\t'Danaher',\n\t'Schiavo',\n\t'Giacalone',\n\t'Pentz',\n\t'Studley',\n\t'Doyal',\n\t'Edie',\n\t'Nathaniel',\n\t'Cambra',\n\t'Fenstermacher',\n\t'Garst',\n\t'Gaudio',\n\t'Zavaleta',\n\t'Castilla',\n\t'Griffeth',\n\t'Warthen',\n\t'Derringer',\n\t'Samsel',\n\t'Mattia',\n\t'Boelter',\n\t'Mathieson',\n\t'Estelle',\n\t'Frisk',\n\t'Hipple',\n\t'Garceau',\n\t'Ehrman',\n\t'Buchner',\n\t'Frailey',\n\t'Ganey',\n\t'Belser',\n\t'Leiby',\n\t'Schwind',\n\t'Hagberg',\n\t'Hooley',\n\t'Rafter',\n\t'Hasting',\n\t'Mcnab',\n\t'Piggott',\n\t'Millhouse',\n\t'Brescia',\n\t'Giancola',\n\t'Grob',\n\t'Uresti',\n\t'Tawney',\n\t'Huot',\n\t'Mizer',\n\t'Storrs',\n\t'Shobe',\n\t'Blade',\n\t'Baumbach',\n\t'Eppler',\n\t'Henningsen',\n\t'Kmetz',\n\t'Sepeda',\n\t'Pangburn',\n\t'Falgout',\n\t'Hurn',\n\t'Sholar',\n\t'Kendricks',\n\t'Brimhall',\n\t'Bucklin',\n\t'Hruby',\n\t'Hunziker',\n\t'Krenz',\n\t'Schwager',\n\t'Murley',\n\t'Crittendon',\n\t'Broady',\n\t'Kintz',\n\t'Entrekin',\n\t'Estey',\n\t'Sharrow',\n\t'Quarterman',\n\t'Gumbs',\n\t'Steely',\n\t'Machin',\n\t'Difiore',\n\t'Desch',\n\t'Wiedemann',\n\t'Tonn',\n\t'Villines',\n\t'Mcdole',\n\t'Bashir',\n\t'Beauford',\n\t'Crary',\n\t'Gallina',\n\t'Wolak',\n\t'Aburto',\n\t'Hasler',\n\t'Gullion',\n\t'Bracewell',\n\t'Rusher',\n\t'Sarvis',\n\t'Dargan',\n\t'Garbarino',\n\t'Pigeon',\n\t'Blasi',\n\t'Viens',\n\t'Reising',\n\t'Vosburgh',\n\t'Canipe',\n\t'Mcnett',\n\t'Bruss',\n\t'Shiflet',\n\t'Pinard',\n\t'Lattin',\n\t'Armbrust',\n\t'Peffer',\n\t'Shotts',\n\t'Arbaugh',\n\t'Hux',\n\t'First',\n\t'Bolds',\n\t'Ceaser',\n\t'Cephas',\n\t'Bormann',\n\t'Broadwell',\n\t'Qian',\n\t'Talamantez',\n\t'Vandermolen',\n\t'Maza',\n\t'Kinnear',\n\t'Bullins',\n\t'Arant',\n\t'Brodbeck',\n\t'Rolfes',\n\t'Wisneski',\n\t'Dague',\n\t'Dudas',\n\t'Greener',\n\t'Noguera',\n\t'Greeno',\n\t'Daddario',\n\t'Giambrone',\n\t'Menon',\n\t'Sherrick',\n\t'Spier',\n\t'Semon',\n\t'Fendley',\n\t'Crichton',\n\t'Moree',\n\t'Stratford',\n\t'Zobel',\n\t'Halladay',\n\t'Keesler',\n\t'Prewett',\n\t'Deavers',\n\t'Kamal',\n\t'Bottom',\n\t'Caves',\n\t'Harshaw',\n\t'Fretz',\n\t'Secord',\n\t'Seibold',\n\t'Pantaleon',\n\t'Greek',\n\t'Baumeister',\n\t'Kleven',\n\t'Kos',\n\t'Orban',\n\t'Papke',\n\t'Shatto',\n\t'Cui',\n\t'Boan',\n\t'Nevitt',\n\t'Hultgren',\n\t'Kreiser',\n\t'Veres',\n\t'Jent',\n\t'Merck',\n\t'Gibby',\n\t'Hosch',\n\t'Mallet',\n\t'Dock',\n\t'Dallman',\n\t'Loiacono',\n\t'Tetzlaff',\n\t'Arboleda',\n\t'Mclelland',\n\t'Willing',\n\t'Coonrod',\n\t'Cappiello',\n\t'Courtemanche',\n\t'Halperin',\n\t'Odegard',\n\t'Hornyak',\n\t'Stem',\n\t'Doner',\n\t'Saffold',\n\t'Hochman',\n\t'Ing',\n\t'Knudtson',\n\t'Laabs',\n\t'Selleck',\n\t'Bassler',\n\t'Kamin',\n\t'Hur',\n\t'Forward',\n\t'Finnie',\n\t'Blubaugh',\n\t'Hitz',\n\t'Litteral',\n\t'Mansur',\n\t'Rosenow',\n\t'Vermeulen',\n\t'Markarian',\n\t'Marceau',\n\t'Weisner',\n\t'Sharpless',\n\t'Cunniff',\n\t'Guilfoyle',\n\t'Lauver',\n\t'Lukasik',\n\t'Ripp',\n\t'Wierzbicki',\n\t'Wunsch',\n\t'Boothby',\n\t'Selfridge',\n\t'Mckey',\n\t'Vandermeer',\n\t'Vanhoy',\n\t'Edlund',\n\t'Eggen',\n\t'Bickett',\n\t'Hallum',\n\t'Brow',\n\t'Rhymer',\n\t'Buckalew',\n\t'Haughey',\n\t'Hentges',\n\t'Matthies',\n\t'Mccloy',\n\t'Simmon',\n\t'Concha',\n\t'Feingold',\n\t'Maglio',\n\t'Olaughlin',\n\t'Tassone',\n\t'Abbasi',\n\t'Oyola',\n\t'Mook',\n\t'Makin',\n\t'Carnegie',\n\t'Yue',\n\t'Sethi',\n\t'Duchene',\n\t'Mcnear',\n\t'Bartolo',\n\t'Hegedus',\n\t'Knoblauch',\n\t'Orner',\n\t'Hottinger',\n\t'Lovitt',\n\t'Harkless',\n\t'Anastasio',\n\t'Hohmann',\n\t'Mangione',\n\t'Dalby',\n\t'Urich',\n\t'Shuttleworth',\n\t'Guilbeau',\n\t'Bausch',\n\t'Demartini',\n\t'Difrancesco',\n\t'Schwalm',\n\t'Steere',\n\t'Guel',\n\t'Blanford',\n\t'Flax',\n\t'Fearon',\n\t'Severe',\n\t'Canto',\n\t'Krogh',\n\t'Meola',\n\t'Dykema',\n\t'Angelini',\n\t'Pooley',\n\t'Raff',\n\t'Rister',\n\t'Baehr',\n\t'Daubert',\n\t'Dechant',\n\t'Kliewer',\n\t'Hamdan',\n\t'Gaiser',\n\t'Lichty',\n\t'Pomerleau',\n\t'Uhler',\n\t'Membreno',\n\t'Printz',\n\t'Worman',\n\t'Thornley',\n\t'Burbridge',\n\t'Burdge',\n\t'Schnitzer',\n\t'Swanberg',\n\t'Steinkamp',\n\t'Heidel',\n\t'Karch',\n\t'Igo',\n\t'Mccausland',\n\t'Huskins',\n\t'Kuss',\n\t'Newbern',\n\t'Peete',\n\t'Godbolt',\n\t'Climer',\n\t'Neuenschwander',\n\t'Then',\n\t'Tietjen',\n\t'Trombetta',\n\t'Hawke',\n\t'Hazlewood',\n\t'Mayse',\n\t'Patillo',\n\t'Banos',\n\t'Kuck',\n\t'Lashbrook',\n\t'Sarkisian',\n\t'Goldberger',\n\t'Moravec',\n\t'Arey',\n\t'Crosswhite',\n\t'Elders',\n\t'Fricks',\n\t'Hercules',\n\t'Bester',\n\t'Erhart',\n\t'Kuper',\n\t'Sickels',\n\t'Mun',\n\t'Beddingfield',\n\t'Panetta',\n\t'Poplawski',\n\t'Lansford',\n\t'Negri',\n\t'Dawe',\n\t'Belair',\n\t'Lattimer',\n\t'Betty',\n\t'Raye',\n\t'Gobert',\n\t'Dragoo',\n\t'Horney',\n\t'Strawbridge',\n\t'Howery',\n\t'Bosarge',\n\t'Panzer',\n\t'Labrador',\n\t'Ransdell',\n\t'Trumbo',\n\t'Aubry',\n\t'Fenderson',\n\t'Fukuda',\n\t'Grosz',\n\t'Jacome',\n\t'Slick',\n\t'Kogut',\n\t'Haig',\n\t'Fouse',\n\t'Hufnagel',\n\t'Kehr',\n\t'Musselwhite',\n\t'Otwell',\n\t'Raddatz',\n\t'Oliverio',\n\t'Sluss',\n\t'Crossen',\n\t'Guidroz',\n\t'Mollett',\n\t'Sumler',\n\t'Chmiel',\n\t'Guinan',\n\t'Vita',\n\t'Wieser',\n\t'Ohlson',\n\t'Bubb',\n\t'Stennett',\n\t'Bugbee',\n\t'Minchew',\n\t'Grado',\n\t'Calcagno',\n\t'Losh',\n\t'Witzel',\n\t'Brandl',\n\t'Geoghegan',\n\t'Vanbrunt',\n\t'Smalling',\n\t'Carignan',\n\t'Schuelke',\n\t'Sienkiewicz',\n\t'Sollars',\n\t'Dames',\n\t'Malkin',\n\t'Rodriges',\n\t'Rozanski',\n\t'Tews',\n\t'Aust',\n\t'Bardin',\n\t'Voorhies',\n\t'Rines',\n\t'Courts',\n\t'Bannerman',\n\t'Martinsen',\n\t'Malick',\n\t'Collar',\n\t'Twilley',\n\t'Freiberg',\n\t'Latiolais',\n\t'Zehnder',\n\t'Mannon',\n\t'Becnel',\n\t'Cowans',\n\t'Arrigo',\n\t'Crago',\n\t'Curtsinger',\n\t'Gassman',\n\t'Marcelo',\n\t'Rosendahl',\n\t'Benito',\n\t'Cortright',\n\t'Carlon',\n\t'Kenton',\n\t'Hemminger',\n\t'Martinek',\n\t'Galeana',\n\t'Cobble',\n\t'Ruffino',\n\t'Wittrock',\n\t'Aberle',\n\t'Catanese',\n\t'Huezo',\n\t'Soules',\n\t'Ashraf',\n\t'Mera',\n\t'Gash',\n\t'Agnello',\n\t'Hauk',\n\t'Hayek',\n\t'Rahm',\n\t'Higham',\n\t'Kondo',\n\t'Almon',\n\t'Earwood',\n\t'Kriebel',\n\t'Philbrook',\n\t'Rimer',\n\t'Cuffee',\n\t'Wolfgram',\n\t'Wardwell',\n\t'Ridder',\n\t'Runner',\n\t'Houchens',\n\t'Vasser',\n\t'Charlesworth',\n\t'Dierks',\n\t'Molter',\n\t'Orosz',\n\t'Roudebush',\n\t'Coca',\n\t'Brost',\n\t'Lovern',\n\t'Brott',\n\t'Baudoin',\n\t'Prophet',\n\t'Bermea',\n\t'Ulm',\n\t'Bahl',\n\t'Ulery',\n\t'Caraveo',\n\t'Maez',\n\t'Corchado',\n\t'Baillie',\n\t'Colmenero',\n\t'Rebolledo',\n\t'Shevlin',\n\t'Mehaffey',\n\t'Hedin',\n\t'Pickell',\n\t'Spiro',\n\t'Coatney',\n\t'Gentner',\n\t'Fuhr',\n\t'Zeh',\n\t'Fuerte',\n\t'Knerr',\n\t'Nakata',\n\t'Voll',\n\t'Zach',\n\t'Gatica',\n\t'Rabalais',\n\t'Macek',\n\t'Petti',\n\t'Dickison',\n\t'Sheley',\n\t'Kinner',\n\t'Effinger',\n\t'Axelson',\n\t'Overbay',\n\t'Vancleve',\n\t'Speegle',\n\t'Muntz',\n\t'Sang',\n\t'Mcleroy',\n\t'Aleshire',\n\t'Holdridge',\n\t'Knouse',\n\t'Saling',\n\t'Zacher',\n\t'Zambrana',\n\t'Neblett',\n\t'Cichon',\n\t'Herdman',\n\t'Poli',\n\t'Schisler',\n\t'Antrim',\n\t'Babineau',\n\t'Coplin',\n\t'Straughn',\n\t'Watlington',\n\t'Burbach',\n\t'Campanelli',\n\t'Coletta',\n\t'Tennis',\n\t'Dymond',\n\t'Darosa',\n\t'Chard',\n\t'Delcampo',\n\t'Lyden',\n\t'Piland',\n\t'Eslick',\n\t'Beets',\n\t'Ransome',\n\t'Schuett',\n\t'Styers',\n\t'Fegley',\n\t'Corning',\n\t'Crume',\n\t'Villeneuve',\n\t'Schmeling',\n\t'Zeiger',\n\t'Blaker',\n\t'Ramsden',\n\t'Carol',\n\t'Roseboro',\n\t'Egner',\n\t'Filip',\n\t'Poitras',\n\t'Flanery',\n\t'Cothren',\n\t'Bridger',\n\t'Hoose',\n\t'Demas',\n\t'Kozel',\n\t'Marzano',\n\t'Penwell',\n\t'Rast',\n\t'Whicker',\n\t'Haslett',\n\t'Bibby',\n\t'Keese',\n\t'Montilla',\n\t'Sultana',\n\t'Resendes',\n\t'Vanscoy',\n\t'Dinan',\n\t'Bala',\n\t'Dirksen',\n\t'Ek',\n\t'Shimer',\n\t'Doshi',\n\t'Mayeux',\n\t'Streater',\n\t'Dattilo',\n\t'Marlar',\n\t'Senft',\n\t'Vanalstine',\n\t'Rehberg',\n\t'Vanderhoff',\n\t'Brenes',\n\t'Motto',\n\t'Sproles',\n\t'Toone',\n\t'Royall',\n\t'Beaudette',\n\t'Belding',\n\t'Berta',\n\t'Carmean',\n\t'Simonian',\n\t'Avera',\n\t'Martina',\n\t'Kind',\n\t'Buchheit',\n\t'Corrao',\n\t'Crumrine',\n\t'Wertman',\n\t'Lininger',\n\t'Pressman',\n\t'Slane',\n\t'Manges',\n\t'Theus',\n\t'Canizales',\n\t'Eugenio',\n\t'Ferrigno',\n\t'Ellard',\n\t'Stilley',\n\t'Crabbe',\n\t'Procter',\n\t'Baccus',\n\t'Hellmann',\n\t'Risk',\n\t'Schild',\n\t'Tostado',\n\t'Fessenden',\n\t'Glines',\n\t'Perone',\n\t'Carns',\n\t'Belote',\n\t'Deshotel',\n\t'Bottomley',\n\t'Delbosque',\n\t'Dubinsky',\n\t'Flinchum',\n\t'Berlanga',\n\t'Darland',\n\t'Daniele',\n\t'Jess',\n\t'Mungia',\n\t'Harlin',\n\t'Rocca',\n\t'Saltsman',\n\t'Trovato',\n\t'Dionisio',\n\t'Erbe',\n\t'Dauzat',\n\t'Laferriere',\n\t'Kear',\n\t'Brannigan',\n\t'Guard',\n\t'Roquemore',\n\t'Brehmer',\n\t'Kappes',\n\t'Kepley',\n\t'Labounty',\n\t'Sudol',\n\t'Walburn',\n\t'Bibeau',\n\t'Euler',\n\t'Brawn',\n\t'Pilot',\n\t'Bunger',\n\t'Earnhardt',\n\t'Fischetti',\n\t'Buitrago',\n\t'Calo',\n\t'Surette',\n\t'Martyn',\n\t'Tollett',\n\t'Tuller',\n\t'Noakes',\n\t'Marson',\n\t'Bongiovanni',\n\t'Novello',\n\t'Werling',\n\t'Wyland',\n\t'Palen',\n\t'Sigmund',\n\t'Salzer',\n\t'Abels',\n\t'Penson',\n\t'Cazarez',\n\t'Diblasi',\n\t'Jantzen',\n\t'Kittleson',\n\t'Hurlbert',\n\t'Shepardson',\n\t'Munz',\n\t'Bozek',\n\t'Woll',\n\t'Forth',\n\t'Colvard',\n\t'Baginski',\n\t'Beirne',\n\t'Lemmer',\n\t'Shover',\n\t'Lucci',\n\t'Hockensmith',\n\t'Mayhall',\n\t'Faucette',\n\t'Soloman',\n\t'Lembo',\n\t'Tarnowski',\n\t'Westerlund',\n\t'Gossage',\n\t'Bold',\n\t'Davi',\n\t'Crater',\n\t'Saia',\n\t'Spisak',\n\t'Zerr',\n\t'Penate',\n\t'Piel',\n\t'Raja',\n\t'Farney',\n\t'Cutrer',\n\t'Liverman',\n\t'Brar',\n\t'Nocera',\n\t'Coutu',\n\t'Rishel',\n\t'Spurr',\n\t'Kail',\n\t'Molino',\n\t'Favreau',\n\t'Mullinix',\n\t'Pospisil',\n\t'Rohloff',\n\t'Slavens',\n\t'Stumbo',\n\t'Ahl',\n\t'Hosking',\n\t'Speaker',\n\t'Tarkington',\n\t'Majeski',\n\t'Skoog',\n\t'Kirch',\n\t'Vannostrand',\n\t'Olmo',\n\t'Dorrell',\n\t'Newcombe',\n\t'Halls',\n\t'Riffel',\n\t'Luque',\n\t'Rolston',\n\t'Lokey',\n\t'Nicholes',\n\t'Gula',\n\t'Schrage',\n\t'Goshorn',\n\t'Woodell',\n\t'Ahmadi',\n\t'Austria',\n\t'Shaul',\n\t'Berwick',\n\t'Graczyk',\n\t'Lacourse',\n\t'Porcaro',\n\t'Rexroad',\n\t'Chrzanowski',\n\t'Abele',\n\t'Woodin',\n\t'Gillan',\n\t'Lone',\n\t'Orzechowski',\n\t'Fader',\n\t'Regina',\n\t'Ban',\n\t'Morriss',\n\t'Rickards',\n\t'Gannaway',\n\t'Tassin',\n\t'Accardi',\n\t'Engelke',\n\t'Kruk',\n\t'Mantilla',\n\t'Soderstrom',\n\t'Kriz',\n\t'Cantley',\n\t'Cangelosi',\n\t'Kalin',\n\t'Sobolewski',\n\t'Prinz',\n\t'Bessey',\n\t'Chittum',\n\t'Marcucci',\n\t'Annunziata',\n\t'Hegg',\n\t'Mishra',\n\t'Heppner',\n\t'Benningfield',\n\t'Rhoten',\n\t'Smolen',\n\t'Lewellyn',\n\t'Tall',\n\t'Comiskey',\n\t'Gobel',\n\t'Klump',\n\t'Stauber',\n\t'Tocci',\n\t'Gosser',\n\t'Tussey',\n\t'Summitt',\n\t'Ottman',\n\t'Vester',\n\t'Pasko',\n\t'Latshaw',\n\t'Kies',\n\t'Valderrama',\n\t'Leese',\n\t'Orduna',\n\t'Gilcrease',\n\t'Alli',\n\t'Berberich',\n\t'Delariva',\n\t'Harb',\n\t'Schmuck',\n\t'Spang',\n\t'Uecker',\n\t'Garfinkel',\n\t'Mcalexander',\n\t'Monty',\n\t'Leonetti',\n\t'Knipe',\n\t'Loudon',\n\t'Leisure',\n\t'Swearengin',\n\t'Tinnin',\n\t'Engelmann',\n\t'Noblitt',\n\t'Ruhland',\n\t'Shewmaker',\n\t'Smetana',\n\t'Vangundy',\n\t'Yzaguirre',\n\t'Nehls',\n\t'Sullens',\n\t'Mahurin',\n\t'Ferman',\n\t'Lenhardt',\n\t'Littman',\n\t'Udell',\n\t'Coutts',\n\t'Mcginness',\n\t'Nakayama',\n\t'Goguen',\n\t'Lass',\n\t'Tibbits',\n\t'Pafford',\n\t'Fett',\n\t'Ruis',\n\t'Trogdon',\n\t'Tarleton',\n\t'Isabell',\n\t'Paylor',\n\t'Grandison',\n\t'Bejar',\n\t'Highfield',\n\t'Peplinski',\n\t'Hammitt',\n\t'Mitton',\n\t'Dashiell',\n\t'Turrentine',\n\t'Rusin',\n\t'Sheeran',\n\t'Barrs',\n\t'Grund',\n\t'Kowalsky',\n\t'Mccaughey',\n\t'Orantes',\n\t'Oshields',\n\t'Tourville',\n\t'Szymczak',\n\t'Gagner',\n\t'Kemble',\n\t'Delangel',\n\t'Kaler',\n\t'Treanor',\n\t'Deems',\n\t'Ours',\n\t'Loss',\n\t'Remley',\n\t'Welles',\n\t'Bogardus',\n\t'Feher',\n\t'Grzybowski',\n\t'Meinert',\n\t'Mickelsen',\n\t'Opitz',\n\t'Osowski',\n\t'Paglia',\n\t'Srivastava',\n\t'Hirata',\n\t'Vandermark',\n\t'Maggi',\n\t'Gautreau',\n\t'Fonte',\n\t'Meck',\n\t'Mcquinn',\n\t'Criddle',\n\t'Hulin',\n\t'Fulmore',\n\t'Baldino',\n\t'Neugebauer',\n\t'Sletten',\n\t'Talcott',\n\t'Tessmer',\n\t'Vrooman',\n\t'Whitlatch',\n\t'Miano',\n\t'Arauz',\n\t'Lafon',\n\t'Cashin',\n\t'Carrow',\n\t'Feely',\n\t'Provo',\n\t'Botsford',\n\t'Chojnacki',\n\t'Pritts',\n\t'Duby',\n\t'Danos',\n\t'Mundo',\n\t'Strum',\n\t'Bealer',\n\t'Barmore',\n\t'Birkholz',\n\t'Hedgecock',\n\t'Vides',\n\t'Mcjunkin',\n\t'Paley',\n\t'Dennie',\n\t'Cosey',\n\t'Trombly',\n\t'Wagar',\n\t'Tope',\n\t'Venters',\n\t'Neptune',\n\t'Allshouse',\n\t'Kuczynski',\n\t'Beams',\n\t'Kilbourne',\n\t'Troxler',\n\t'Mcgahee',\n\t'Latson',\n\t'Miraglia',\n\t'Suda',\n\t'Prall',\n\t'Searls',\n\t'Tevis',\n\t'Vales',\n\t'Coberly',\n\t'Eichman',\n\t'Hiltz',\n\t'Mancera',\n\t'Mrozek',\n\t'Obermeyer',\n\t'Wiedeman',\n\t'Yoshimura',\n\t'Pascucci',\n\t'Denk',\n\t'Pita',\n\t'Abdul',\n\t'Schurr',\n\t'Huntoon',\n\t'Sund',\n\t'Blose',\n\t'Agostini',\n\t'Cogdell',\n\t'Hamburger',\n\t'Orwig',\n\t'Pelley',\n\t'Mcnelly',\n\t'Litten',\n\t'Osterberg',\n\t'Zepp',\n\t'Mathur',\n\t'Ardon',\n\t'Petre',\n\t'Schroeter',\n\t'Christoff',\n\t'Ridenhour',\n\t'Hibler',\n\t'Coachman',\n\t'Tadeo',\n\t'Vanderploeg',\n\t'Ference',\n\t'Connery',\n\t'Albro',\n\t'Bublitz',\n\t'Fagundes',\n\t'Purpura',\n\t'Deeb',\n\t'Melzer',\n\t'Haus',\n\t'Huffine',\n\t'Groner',\n\t'Laforce',\n\t'Burriss',\n\t'Longino',\n\t'Seldon',\n\t'Chicoine',\n\t'Neira',\n\t'Pintor',\n\t'Trager',\n\t'Garg',\n\t'Camilleri',\n\t'Limbaugh',\n\t'Marinello',\n\t'Sanz',\n\t'Hankey',\n\t'Aylor',\n\t'Homes',\n\t'Marro',\n\t'Stalder',\n\t'Creasey',\n\t'Blankinship',\n\t'Waldrup',\n\t'Aubert',\n\t'Quintanar',\n\t'Tarbell',\n\t'Mayton',\n\t'Baba',\n\t'Voltz',\n\t'Cuba',\n\t'Bracco',\n\t'Dimeo',\n\t'Cauble',\n\t'Rodela',\n\t'Sambrano',\n\t'Doten',\n\t'Jobes',\n\t'Laura',\n\t'Farrier',\n\t'Mixson',\n\t'Bassi',\n\t'Kroening',\n\t'Papineau',\n\t'Scheuerman',\n\t'Zertuche',\n\t'Cardella',\n\t'Taube',\n\t'Bazzi',\n\t'Sautter',\n\t'Tobon',\n\t'Venditti',\n\t'Nordman',\n\t'Loken',\n\t'Fortino',\n\t'Godbout',\n\t'Knaub',\n\t'Larabee',\n\t'Meserve',\n\t'Slama',\n\t'Junge',\n\t'Stamand',\n\t'Daigneault',\n\t'Fredericksen',\n\t'Loveall',\n\t'Clothier',\n\t'Kuehne',\n\t'Delahoussaye',\n\t'Bosquez',\n\t'Hildenbrand',\n\t'Muto',\n\t'Vanvliet',\n\t'Frederiksen',\n\t'Mero',\n\t'Rapier',\n\t'Feldt',\n\t'Mcpartland',\n\t'Stegner',\n\t'Veenstra',\n\t'Yeater',\n\t'Yeatts',\n\t'Rosenbloom',\n\t'Shepperd',\n\t'Marchbanks',\n\t'Tapscott',\n\t'Baynard',\n\t'Osby',\n\t'Cumberbatch',\n\t'Brassard',\n\t'Dahlman',\n\t'Doi',\n\t'Katona',\n\t'Niesen',\n\t'Slavik',\n\t'Macneill',\n\t'Marsala',\n\t'Fazekas',\n\t'Cudd',\n\t'Ocana',\n\t'Brimer',\n\t'Lachman',\n\t'Balla',\n\t'Shahid',\n\t'Gammage',\n\t'Canez',\n\t'Fickes',\n\t'Goldblatt',\n\t'Mcgeehan',\n\t'Westerberg',\n\t'Legler',\n\t'Stanberry',\n\t'Hillery',\n\t'Colosimo',\n\t'Florek',\n\t'Heckathorn',\n\t'Lenart',\n\t'Mcneilly',\n\t'Viles',\n\t'Davin',\n\t'Pierro',\n\t'Edman',\n\t'Patron',\n\t'Tipps',\n\t'Ardis',\n\t'Hassen',\n\t'Crase',\n\t'Gebert',\n\t'Predmore',\n\t'Entwistle',\n\t'Lourenco',\n\t'Snively',\n\t'Chivers',\n\t'Byas',\n\t'Edsall',\n\t'Sneddon',\n\t'Kloster',\n\t'Luedke',\n\t'Barcelo',\n\t'Corns',\n\t'Paula',\n\t'Tacker',\n\t'Marton',\n\t'Lyke',\n\t'Huitt',\n\t'Tinch',\n\t'Tagle',\n\t'Linnell',\n\t'Loden',\n\t'Witman',\n\t'Condrey',\n\t'Swindler',\n\t'Denby',\n\t'Mcdow',\n\t'Bennion',\n\t'Berkman',\n\t'Esguerra',\n\t'Kohli',\n\t'Leicht',\n\t'Platero',\n\t'Purtell',\n\t'Sarro',\n\t'Spera',\n\t'Wasielewski',\n\t'Nold',\n\t'Gander',\n\t'Coster',\n\t'Burn',\n\t'Sindelar',\n\t'Spivak',\n\t'Stangl',\n\t'Eakes',\n\t'Host',\n\t'Raybon',\n\t'Stickle',\n\t'Vitiello',\n\t'Borntrager',\n\t'Glorioso',\n\t'Winnie',\n\t'Blocher',\n\t'Che',\n\t'Godbold',\n\t'Blumenfeld',\n\t'Hallford',\n\t'Nuckolls',\n\t'Rasor',\n\t'Tardy',\n\t'Hayslett',\n\t'Kivett',\n\t'Pettry',\n\t'Klopfenstein',\n\t'Martelli',\n\t'Dunker',\n\t'Klass',\n\t'Denn',\n\t'Vessels',\n\t'Stukes',\n\t'Iannone',\n\t'Kovarik',\n\t'Perlmutter',\n\t'Som',\n\t'Kump',\n\t'Tack',\n\t'Warf',\n\t'Coffer',\n\t'Baas',\n\t'Balli',\n\t'Fleishman',\n\t'Lyall',\n\t'Meli',\n\t'Petrovic',\n\t'Sego',\n\t'Tignor',\n\t'Maule',\n\t'Stinchcomb',\n\t'Doxey',\n\t'Garbutt',\n\t'Drewes',\n\t'Prestridge',\n\t'Vivanco',\n\t'Weinmann',\n\t'Amrhein',\n\t'Schluter',\n\t'Cleek',\n\t'Rossignol',\n\t'Rezendes',\n\t'Marone',\n\t'Sloss',\n\t'Weary',\n\t'Leishman',\n\t'Searfoss',\n\t'Springman',\n\t'Wolfer',\n\t'Hires',\n\t'Mccampbell',\n\t'Casselman',\n\t'Frasca',\n\t'Lintner',\n\t'Preiss',\n\t'Neilsen',\n\t'Twiss',\n\t'Boughner',\n\t'Donnellan',\n\t'Rech',\n\t'Mccaulley',\n\t'Massenburg',\n\t'Dermody',\n\t'Neuberger',\n\t'Rifkin',\n\t'Ullom',\n\t'Marth',\n\t'Blacker',\n\t'Kase',\n\t'Garon',\n\t'Calaway',\n\t'Grange',\n\t'Yopp',\n\t'Service',\n\t'Blassingame',\n\t'Lockley',\n\t'Straughter',\n\t'Porath',\n\t'Situ',\n\t'Stansfield',\n\t'Eves',\n\t'Cianci',\n\t'Colindres',\n\t'Killam',\n\t'Luiz',\n\t'Stahlman',\n\t'Silvernail',\n\t'Moorhouse',\n\t'Langner',\n\t'Soucie',\n\t'Lucke',\n\t'Manly',\n\t'Huggard',\n\t'Higareda',\n\t'Matarazzo',\n\t'Jusino',\n\t'Winnett',\n\t'Matheney',\n\t'Bufkin',\n\t'Bilbo',\n\t'Levingston',\n\t'Auxier',\n\t'Guevarra',\n\t'Triolo',\n\t'Roder',\n\t'Clever',\n\t'Moodie',\n\t'Cabana',\n\t'Kiesling',\n\t'Lindblom',\n\t'Reuther',\n\t'Rubi',\n\t'Brinkmann',\n\t'Donati',\n\t'Cresswell',\n\t'Fortes',\n\t'Bayard',\n\t'Grayer',\n\t'Malveaux',\n\t'Hauger',\n\t'Hirschman',\n\t'Soroka',\n\t'Witek',\n\t'Pugsley',\n\t'Eoff',\n\t'Alewine',\n\t'Hastie',\n\t'Budzinski',\n\t'Burgard',\n\t'Hebel',\n\t'Kleist',\n\t'Lawhead',\n\t'Saporito',\n\t'Sugarman',\n\t'Sechler',\n\t'Cohoon',\n\t'Treadaway',\n\t'Silliman',\n\t'Horsey',\n\t'Chauhan',\n\t'Jovel',\n\t'Giorgio',\n\t'Waltrip',\n\t'Templeman',\n\t'Morning',\n\t'Fava',\n\t'Mcinturff',\n\t'Migliaccio',\n\t'Moncayo',\n\t'Pesek',\n\t'Olivero',\n\t'Devall',\n\t'Dauphin',\n\t'Banerjee',\n\t'Benway',\n\t'Bermejo',\n\t'Dacey',\n\t'Pilarski',\n\t'Pinnell',\n\t'Chia',\n\t'Pung',\n\t'Rahe',\n\t'Greenhaw',\n\t'Byrns',\n\t'Ancona',\n\t'Granato',\n\t'Luciani',\n\t'Shryock',\n\t'Sloop',\n\t'Murcia',\n\t'Croll',\n\t'Congleton',\n\t'Okelly',\n\t'Norville',\n\t'Flesch',\n\t'Murad',\n\t'Seddon',\n\t'Waybright',\n\t'Cremer',\n\t'Hagman',\n\t'Largo',\n\t'Solar',\n\t'Costales',\n\t'Gier',\n\t'Tober',\n\t'Reeb',\n\t'Lands',\n\t'Hoback',\n\t'Ingrassia',\n\t'Youngquist',\n\t'Tyrell',\n\t'Profit',\n\t'Collura',\n\t'Oldaker',\n\t'Vogl',\n\t'Spafford',\n\t'Laughman',\n\t'Goris',\n\t'Coghill',\n\t'Sweatman',\n\t'Rozelle',\n\t'Chatelain',\n\t'Fouch',\n\t'Legros',\n\t'Koza',\n\t'Vialpando',\n\t'Subia',\n\t'Danz',\n\t'Dosch',\n\t'Debruin',\n\t'Stefanik',\n\t'Gamber',\n\t'Saylors',\n\t'Cost',\n\t'Bernat',\n\t'Eastburn',\n\t'Getman',\n\t'Maillet',\n\t'Dogan',\n\t'Finklea',\n\t'Alongi',\n\t'Ballas',\n\t'Konkel',\n\t'Ryu',\n\t'Scoles',\n\t'Oles',\n\t'Algarin',\n\t'Seago',\n\t'Delaune',\n\t'Pettey',\n\t'Gettys',\n\t'Blanch',\n\t'Kea',\n\t'Cambridge',\n\t'Ciesielski',\n\t'Pribble',\n\t'Mayhugh',\n\t'Dery',\n\t'Allsup',\n\t'Hauptman',\n\t'Shoff',\n\t'Spath',\n\t'Lipsky',\n\t'Lakhani',\n\t'Lona',\n\t'Andrea',\n\t'Heist',\n\t'Herzig',\n\t'Insley',\n\t'Frasher',\n\t'Muise',\n\t'Kettle',\n\t'Catano',\n\t'Harkleroad',\n\t'Rominger',\n\t'Schreffler',\n\t'Bielecki',\n\t'Knarr',\n\t'Arvidson',\n\t'Harnden',\n\t'Galyon',\n\t'Rando',\n\t'Delima',\n\t'Constance',\n\t'Bosman',\n\t'Meinke',\n\t'Rosenquist',\n\t'Stickles',\n\t'Batz',\n\t'Eitel',\n\t'Kouba',\n\t'Marmol',\n\t'Rini',\n\t'Kinyon',\n\t'Munns',\n\t'Hilts',\n\t'Verrett',\n\t'Shead',\n\t'Staggers',\n\t'Naccarato',\n\t'Shupp',\n\t'Willeford',\n\t'Gayer',\n\t'Bran',\n\t'Krider',\n\t'Cue',\n\t'Dubiel',\n\t'Kawamoto',\n\t'Quayle',\n\t'Meckley',\n\t'Weingart',\n\t'Ivan',\n\t'Aller',\n\t'Pattee',\n\t'Pile',\n\t'Shinault',\n\t'Alzate',\n\t'Goudreau',\n\t'Weitzman',\n\t'Zurek',\n\t'Portman',\n\t'Tellis',\n\t'Achenbach',\n\t'Cranfill',\n\t'Scheib',\n\t'Rud',\n\t'Forgey',\n\t'Sardina',\n\t'Hayslip',\n\t'Fadden',\n\t'Ethington',\n\t'Jette',\n\t'Maberry',\n\t'Stecher',\n\t'Mcgahan',\n\t'Buffa',\n\t'Lehto',\n\t'Lesch',\n\t'Minier',\n\t'Niblett',\n\t'Behar',\n\t'Gochenour',\n\t'Thole',\n\t'Woodmansee',\n\t'Guse',\n\t'Breunig',\n\t'Deibert',\n\t'Levario',\n\t'Liming',\n\t'Oltman',\n\t'Vought',\n\t'Higby',\n\t'Lummus',\n\t'Casimir',\n\t'Grabow',\n\t'Helzer',\n\t'Madero',\n\t'Panico',\n\t'Ruud',\n\t'Beas',\n\t'Knebel',\n\t'Lorence',\n\t'Sizer',\n\t'Goodwill',\n\t'Darrell',\n\t'Dismukes',\n\t'Wimbish',\n\t'Kleine',\n\t'Prohaska',\n\t'Freeborn',\n\t'Caso',\n\t'Meis',\n\t'Bise',\n\t'Maxim',\n\t'Chumbley',\n\t'Eaglin',\n\t'Bergey',\n\t'Hillenbrand',\n\t'Pacifico',\n\t'Plath',\n\t'Rio',\n\t'Ristau',\n\t'Zych',\n\t'Whang',\n\t'Fister',\n\t'Forbush',\n\t'Lagarde',\n\t'Atha',\n\t'Hallinan',\n\t'Hesser',\n\t'Hoak',\n\t'Kohr',\n\t'Longnecker',\n\t'Nomura',\n\t'Raia',\n\t'Seybold',\n\t'Spagnola',\n\t'Majano',\n\t'Sanmartin',\n\t'Mangual',\n\t'Stanback',\n\t'Gangi',\n\t'Lauritzen',\n\t'Seeber',\n\t'Disla',\n\t'Frain',\n\t'Besse',\n\t'Makris',\n\t'Ducker',\n\t'Demps',\n\t'Laporta',\n\t'Pavey',\n\t'Reineke',\n\t'Najjar',\n\t'Mcclaskey',\n\t'Luff',\n\t'Vanderveer',\n\t'Mccoll',\n\t'Leamon',\n\t'Meinhardt',\n\t'Dinatale',\n\t'Laffoon',\n\t'Jenny',\n\t'Skipworth',\n\t'Folds',\n\t'Burstein',\n\t'Freas',\n\t'Lizardo',\n\t'Selle',\n\t'Vrabel',\n\t'Beranek',\n\t'Hakala',\n\t'Spataro',\n\t'Prahl',\n\t'Meas',\n\t'Haston',\n\t'Croker',\n\t'Carmouche',\n\t'Doolan',\n\t'Guerrieri',\n\t'Poulton',\n\t'Mauger',\n\t'Klose',\n\t'Husk',\n\t'Pharis',\n\t'Dipalma',\n\t'Hamaker',\n\t'Simek',\n\t'Strube',\n\t'Corl',\n\t'Bence',\n\t'Meigs',\n\t'Gillaspie',\n\t'Moring',\n\t'Eli',\n\t'Mccullers',\n\t'Erving',\n\t'Dopp',\n\t'Falbo',\n\t'Gensler',\n\t'Heroux',\n\t'Hertzler',\n\t'Muscarella',\n\t'Wittmann',\n\t'Willner',\n\t'Howton',\n\t'Brummitt',\n\t'Demar',\n\t'Hardrick',\n\t'Benavente',\n\t'Choo',\n\t'Tiscareno',\n\t'Bunge',\n\t'Helle',\n\t'Ogan',\n\t'Allbright',\n\t'Jervis',\n\t'Tompson',\n\t'Sheats',\n\t'Hebron',\n\t'Esters',\n\t'Fiorillo',\n\t'Narciso',\n\t'Slowik',\n\t'Kush',\n\t'Sole',\n\t'Bitting',\n\t'Bradham',\n\t'Goggans',\n\t'Rushin',\n\t'Huguley',\n\t'Kittelson',\n\t'Nadel',\n\t'Noggle',\n\t'Xue',\n\t'Alameda',\n\t'Hege',\n\t'Liberto',\n\t'Maron',\n\t'Aber',\n\t'Brodersen',\n\t'Clasen',\n\t'Couturier',\n\t'Godines',\n\t'Ozment',\n\t'Parga',\n\t'Rohm',\n\t'Voris',\n\t'Leaver',\n\t'Newhart',\n\t'Sabourin',\n\t'Kelling',\n\t'Repass',\n\t'Wigington',\n\t'Prioleau',\n\t'Antle',\n\t'Goucher',\n\t'Kreitzer',\n\t'Reuss',\n\t'Rosenfield',\n\t'Sliva',\n\t'Nolting',\n\t'Radel',\n\t'Quintal',\n\t'Lisa',\n\t'Temples',\n\t'Cavins',\n\t'Gazaway',\n\t'Hopewell',\n\t'Albury',\n\t'Broberg',\n\t'Khuu',\n\t'Zelinski',\n\t'Kurian',\n\t'Treacy',\n\t'Rake',\n\t'Tirrell',\n\t'Macdowell',\n\t'Smead',\n\t'Edgerly',\n\t'Fowles',\n\t'Yorke',\n\t'Goodwyn',\n\t'Sciacca',\n\t'Breitenbach',\n\t'Charity',\n\t'Greenidge',\n\t'Kendig',\n\t'Navarette',\n\t'Doremus',\n\t'Marcelino',\n\t'Ribera',\n\t'Luse',\n\t'Hasley',\n\t'Halton',\n\t'Jakes',\n\t'Balas',\n\t'Cheema',\n\t'Dettman',\n\t'Schachter',\n\t'Weisenberger',\n\t'Lehn',\n\t'Sailors',\n\t'Alcott',\n\t'Mancino',\n\t'Mineo',\n\t'Montz',\n\t'Stettler',\n\t'Brannock',\n\t'Shumake',\n\t'Blunk',\n\t'Feuerstein',\n\t'Mangino',\n\t'Bitzer',\n\t'Padden',\n\t'Wetter',\n\t'Blase',\n\t'Helvey',\n\t'Sabia',\n\t'Folden',\n\t'Wyllie',\n\t'Hoosier',\n\t'Gehringer',\n\t'Peifer',\n\t'Schneiderman',\n\t'Raj',\n\t'Gift',\n\t'Sue',\n\t'Wedgeworth',\n\t'Bischof',\n\t'Coviello',\n\t'Flor',\n\t'Barrentine',\n\t'Ells',\n\t'Dundas',\n\t'Baine',\n\t'Bouknight',\n\t'Koning',\n\t'Mallari',\n\t'Monje',\n\t'Wingler',\n\t'Stainbrook',\n\t'Mari',\n\t'Hemby',\n\t'Boateng',\n\t'Enfinger',\n\t'Esquer',\n\t'Salvatierra',\n\t'Tercero',\n\t'Porta',\n\t'Speth',\n\t'Plate',\n\t'Rockhold',\n\t'Hampshire',\n\t'Stipe',\n\t'Buescher',\n\t'Denault',\n\t'Fahnestock',\n\t'Vandehey',\n\t'Brouse',\n\t'Ciaccio',\n\t'Hund',\n\t'Wire',\n\t'Sherron',\n\t'Fairfax',\n\t'Owusu',\n\t'Cuervo',\n\t'Minjarez',\n\t'Zarco',\n\t'Vandyne',\n\t'Gedeon',\n\t'Kegler',\n\t'Ebron',\n\t'Murtaugh',\n\t'Pariseau',\n\t'Morvant',\n\t'Ellwood',\n\t'Beazley',\n\t'Farrelly',\n\t'Mccollom',\n\t'Alegre',\n\t'Dussault',\n\t'Goulette',\n\t'Hession',\n\t'Regier',\n\t'Speranza',\n\t'Spinella',\n\t'Maloof',\n\t'Nogueira',\n\t'Beaudin',\n\t'Sable',\n\t'Samford',\n\t'Marchan',\n\t'Rodriques',\n\t'Rhines',\n\t'Aldrete',\n\t'Creedon',\n\t'Laberge',\n\t'Sandel',\n\t'Spady',\n\t'Horsman',\n\t'Schimpf',\n\t'Sottile',\n\t'Than',\n\t'Ybanez',\n\t'Sagastume',\n\t'Vosburg',\n\t'Langlais',\n\t'Windley',\n\t'Bielski',\n\t'Meyerson',\n\t'Rizk',\n\t'Sparacino',\n\t'Winebarger',\n\t'Helsley',\n\t'Alward',\n\t'Wilker',\n\t'Clyne',\n\t'Bergren',\n\t'Gin',\n\t'Heberling',\n\t'Noh',\n\t'Rotz',\n\t'Laffey',\n\t'Zurawski',\n\t'Aliff',\n\t'Coover',\n\t'Steves',\n\t'Brain',\n\t'Greggs',\n\t'Burts',\n\t'Culwell',\n\t'Halbrook',\n\t'Marcantel',\n\t'Alsip',\n\t'Esslinger',\n\t'Kinnaird',\n\t'Rew',\n\t'Wimbley',\n\t'Dalal',\n\t'Litke',\n\t'Ostlund',\n\t'Petersheim',\n\t'Vezina',\n\t'Vickrey',\n\t'Vida',\n\t'Stachowiak',\n\t'Santizo',\n\t'Stow',\n\t'Hoel',\n\t'Parrino',\n\t'Elsberry',\n\t'Pharris',\n\t'Chiarello',\n\t'Konen',\n\t'Ogata',\n\t'Tousignant',\n\t'Turano',\n\t'Zoll',\n\t'Reser',\n\t'Ribble',\n\t'Dally',\n\t'Kersh',\n\t'Crivello',\n\t'Glantz',\n\t'Vanvleet',\n\t'Dy',\n\t'Woolwine',\n\t'Ager',\n\t'Romney',\n\t'Dedeaux',\n\t'Ringgold',\n\t'Mir',\n\t'Rexford',\n\t'Whitehair',\n\t'Wilczynski',\n\t'Kleinsasser',\n\t'Siemens',\n\t'Kindig',\n\t'Kemmer',\n\t'Fonda',\n\t'Litt',\n\t'Mcferrin',\n\t'Riche',\n\t'Beaudet',\n\t'Lasala',\n\t'Maglione',\n\t'Milani',\n\t'Moscato',\n\t'Pangilinan',\n\t'Haycraft',\n\t'Camilo',\n\t'Trafton',\n\t'Stroble',\n\t'Dollard',\n\t'Consiglio',\n\t'Kinnaman',\n\t'Mumaw',\n\t'Mustard',\n\t'Nees',\n\t'Rupprecht',\n\t'Gimbel',\n\t'Chamberland',\n\t'Lish',\n\t'Beedle',\n\t'Minder',\n\t'Broxton',\n\t'Cocco',\n\t'Vore',\n\t'Slough',\n\t'Pehrson',\n\t'Graney',\n\t'Reade',\n\t'Cozzi',\n\t'Mowrer',\n\t'Necaise',\n\t'Notaro',\n\t'Vanderwall',\n\t'Jeffs',\n\t'Lynd',\n\t'Perino',\n\t'Poyner',\n\t'Oscar',\n\t'Mihalik',\n\t'Coscia',\n\t'Zoellner',\n\t'Shippee',\n\t'Casimiro',\n\t'Phillippe',\n\t'Bartolotta',\n\t'Graciano',\n\t'Schnoor',\n\t'Aube',\n\t'Duguay',\n\t'Dickerman',\n\t'Santi',\n\t'Cude',\n\t'Haver',\n\t'Heidelberg',\n\t'Farquharson',\n\t'Bianchini',\n\t'Kasprzak',\n\t'Pizzi',\n\t'Urquiza',\n\t'Knee',\n\t'Lust',\n\t'Strayhorn',\n\t'Ader',\n\t'Canup',\n\t'Mira',\n\t'Saulnier',\n\t'Stalvey',\n\t'Takeuchi',\n\t'Updegraff',\n\t'Barletta',\n\t'Mikhail',\n\t'Abadie',\n\t'Cohee',\n\t'Sones',\n\t'Hird',\n\t'Mizelle',\n\t'Graddy',\n\t'Demay',\n\t'Escandon',\n\t'Kozar',\n\t'Lecuyer',\n\t'Tredway',\n\t'Danks',\n\t'Pry',\n\t'Mathena',\n\t'Gomer',\n\t'Moussa',\n\t'Journey',\n\t'Brison',\n\t'Denardo',\n\t'Digiorgio',\n\t'Worster',\n\t'Kottke',\n\t'Sayegh',\n\t'Aday',\n\t'Chain',\n\t'Digby',\n\t'Beeks',\n\t'Malpass',\n\t'Toft',\n\t'Fucci',\n\t'Stam',\n\t'Smoker',\n\t'Willms',\n\t'Bohner',\n\t'Sugar',\n\t'Tay',\n\t'Faye',\n\t'Melnik',\n\t'Pankow',\n\t'Stehle',\n\t'Vecchione',\n\t'Weatherwax',\n\t'Monterrosa',\n\t'Bodily',\n\t'Serino',\n\t'Jerkins',\n\t'Bosma',\n\t'Luczak',\n\t'Serafini',\n\t'Baze',\n\t'Hemmings',\n\t'Darrington',\n\t'Fraizer',\n\t'Henrikson',\n\t'Kok',\n\t'Larrison',\n\t'Mirabella',\n\t'Newhall',\n\t'Hollenbach',\n\t'Formica',\n\t'Haake',\n\t'Seim',\n\t'Zeledon',\n\t'Crabill',\n\t'Mensch',\n\t'Prevatt',\n\t'Riggan',\n\t'Gallien',\n\t'Erby',\n\t'Running',\n\t'Shisler',\n\t'Sidebottom',\n\t'Sladek',\n\t'Alejos',\n\t'Momin',\n\t'Bickers',\n\t'Smither',\n\t'Ahart',\n\t'Huseman',\n\t'Cantero',\n\t'Reiley',\n\t'Mcneeley',\n\t'Quill',\n\t'Binger',\n\t'Ellerbee',\n\t'Cearley',\n\t'Guilmette',\n\t'Helbig',\n\t'Nuzum',\n\t'Gravatt',\n\t'Turlington',\n\t'Deramus',\n\t'Casados',\n\t'Harrop',\n\t'Kardos',\n\t'Krehbiel',\n\t'Homa',\n\t'Agostino',\n\t'Candia',\n\t'Byerley',\n\t'Kincer',\n\t'Vitello',\n\t'Backhaus',\n\t'Burzynski',\n\t'Zaborowski',\n\t'Puebla',\n\t'Pedrick',\n\t'Hyson',\n\t'Mazyck',\n\t'Deno',\n\t'Yutzy',\n\t'Dubbs',\n\t'Shimek',\n\t'Saha',\n\t'Philipps',\n\t'Chretien',\n\t'Bramwell',\n\t'Mccalister',\n\t'Ebright',\n\t'Parkhill',\n\t'Rieke',\n\t'Karras',\n\t'Mcbain',\n\t'Gibbon',\n\t'Beckler',\n\t'Nordby',\n\t'Sipos',\n\t'Swider',\n\t'Treiber',\n\t'Weakland',\n\t'Zagorski',\n\t'Peavler',\n\t'Cirino',\n\t'Corzine',\n\t'Barbier',\n\t'Dolby',\n\t'Sheperd',\n\t'Vanderhorst',\n\t'Cornman',\n\t'Dippel',\n\t'Gramlich',\n\t'Hoffmeister',\n\t'Markwell',\n\t'Milks',\n\t'Schriner',\n\t'Cusimano',\n\t'Emberton',\n\t'Kimbler',\n\t'Merrow',\n\t'Huard',\n\t'Paulo',\n\t'Durrance',\n\t'Faherty',\n\t'Palmatier',\n\t'Rezac',\n\t'Speir',\n\t'Streicher',\n\t'Ackman',\n\t'Veitch',\n\t'Bedgood',\n\t'Pantano',\n\t'Raman',\n\t'Eusebio',\n\t'Coldwell',\n\t'Omer',\n\t'Swanigan',\n\t'Stepney',\n\t'Breiner',\n\t'Casebolt',\n\t'Deblasio',\n\t'Mascaro',\n\t'Maselli',\n\t'Overfield',\n\t'Enyart',\n\t'Litman',\n\t'Borer',\n\t'Dudash',\n\t'Mcniff',\n\t'Cherian',\n\t'Scearce',\n\t'Brakefield',\n\t'Hamed',\n\t'Cooperman',\n\t'Kinzel',\n\t'Mchargue',\n\t'Schiefelbein',\n\t'Varughese',\n\t'Brumm',\n\t'Novy',\n\t'Vicars',\n\t'Barratt',\n\t'Titsworth',\n\t'Mole',\n\t'Crisafulli',\n\t'Deitch',\n\t'Slager',\n\t'Tokarz',\n\t'Speelman',\n\t'Tunney',\n\t'Peal',\n\t'Chenevert',\n\t'Haggins',\n\t'Heitmann',\n\t'Scheuer',\n\t'Stuhr',\n\t'Zenner',\n\t'Wishon',\n\t'Arno',\n\t'Lauder',\n\t'Goertz',\n\t'Jew',\n\t'Knapik',\n\t'Lococo',\n\t'Murnane',\n\t'Pawloski',\n\t'Contino',\n\t'Holbrooks',\n\t'Carlstrom',\n\t'Heitkamp',\n\t'Muszynski',\n\t'Shelnutt',\n\t'Tortora',\n\t'Dietrick',\n\t'Kyzer',\n\t'Colt',\n\t'Propes',\n\t'Caffee',\n\t'Fankhauser',\n\t'Liotta',\n\t'Patil',\n\t'Broder',\n\t'Disher',\n\t'Telfer',\n\t'Lampkins',\n\t'Bartman',\n\t'Beauchemin',\n\t'Gatz',\n\t'Pedrosa',\n\t'Schuch',\n\t'Zorrilla',\n\t'Capote',\n\t'Vanderslice',\n\t'Boulden',\n\t'Kirkendoll',\n\t'Fausto',\n\t'Krom',\n\t'Ngai',\n\t'Sepe',\n\t'Domenech',\n\t'Dines',\n\t'Aschenbrenner',\n\t'Carias',\n\t'Inoue',\n\t'Montagna',\n\t'Pulsifer',\n\t'Rieman',\n\t'Seelye',\n\t'Yochum',\n\t'Defilippis',\n\t'Lacross',\n\t'Betances',\n\t'Jenne',\n\t'Rousey',\n\t'Brunswick',\n\t'Wadlington',\n\t'Brainerd',\n\t'Dauria',\n\t'Dinicola',\n\t'Fath',\n\t'Gemmell',\n\t'Rudman',\n\t'Urbaniak',\n\t'Fillion',\n\t'Brandel',\n\t'Devin',\n\t'Derrickson',\n\t'Jenkin',\n\t'Ebling',\n\t'Ferranti',\n\t'Lueders',\n\t'Alvear',\n\t'Gero',\n\t'Maury',\n\t'Estill',\n\t'Beadles',\n\t'Philyaw',\n\t'Tann',\n\t'Bednarski',\n\t'Nagata',\n\t'Partington',\n\t'Sobol',\n\t'Soohoo',\n\t'Welliver',\n\t'Yam',\n\t'Popejoy',\n\t'Berthelot',\n\t'Manwaring',\n\t'Cahn',\n\t'Layer',\n\t'Poarch',\n\t'Tee',\n\t'Arellanes',\n\t'Ehler',\n\t'Montalto',\n\t'Pavlick',\n\t'Rauh',\n\t'Mcnees',\n\t'Balke',\n\t'Alles',\n\t'Caperton',\n\t'Frier',\n\t'Thweatt',\n\t'Whitely',\n\t'Demby',\n\t'Kowalik',\n\t'Loffredo',\n\t'Solem',\n\t'Clampitt',\n\t'Dossey',\n\t'Fauver',\n\t'Toto',\n\t'Corlett',\n\t'Nickols',\n\t'Golston',\n\t'Graef',\n\t'Salsman',\n\t'Hartl',\n\t'Towell',\n\t'Lasseter',\n\t'Arata',\n\t'Diver',\n\t'Malan',\n\t'Lanter',\n\t'Justis',\n\t'Prime',\n\t'Ditzler',\n\t'Engelhart',\n\t'Plouffe',\n\t'Zaldivar',\n\t'Elser',\n\t'Witherow',\n\t'Mateer',\n\t'Rikard',\n\t'Dolson',\n\t'Mariner',\n\t'Amis',\n\t'Toby',\n\t'Evins',\n\t'Midgette',\n\t'Pinnix',\n\t'Blackard',\n\t'Huisman',\n\t'Lager',\n\t'Deloera',\n\t'Dutt',\n\t'Goodrow',\n\t'Morphis',\n\t'Quin',\n\t'Frankenfield',\n\t'Craycraft',\n\t'Mazer',\n\t'Meloy',\n\t'Lebouef',\n\t'Beresford',\n\t'Spiva',\n\t'Michie',\n\t'Jarreau',\n\t'Vallier',\n\t'Dunmore',\n\t'Cerra',\n\t'Ciulla',\n\t'Dauer',\n\t'Helling',\n\t'Jackowski',\n\t'Taboada',\n\t'Balistreri',\n\t'Blattner',\n\t'Cabot',\n\t'Lawver',\n\t'Cornette',\n\t'Arline',\n\t'Amsden',\n\t'Degner',\n\t'Ungar',\n\t'Birney',\n\t'Goldie',\n\t'Croston',\n\t'Wixon',\n\t'Alan',\n\t'Garneau',\n\t'Kolakowski',\n\t'Vitek',\n\t'Witherell',\n\t'Licari',\n\t'Badeaux',\n\t'Sammon',\n\t'Greenland',\n\t'Corlew',\n\t'Cashwell',\n\t'Aldinger',\n\t'Bilderback',\n\t'Kleeman',\n\t'Sisto',\n\t'Menz',\n\t'Bakos',\n\t'Ebbert',\n\t'Berliner',\n\t'Kin',\n\t'Cabaniss',\n\t'Ouzts',\n\t'Mccook',\n\t'Campfield',\n\t'Gulino',\n\t'Odriscoll',\n\t'Weyand',\n\t'Mcguckin',\n\t'Crean',\n\t'Boyington',\n\t'Bracero',\n\t'Carini',\n\t'Chawla',\n\t'Chaudhary',\n\t'Koehl',\n\t'Wahlstrom',\n\t'Francoeur',\n\t'Leveque',\n\t'Ledgerwood',\n\t'Paluch',\n\t'Wyble',\n\t'Latif',\n\t'Koen',\n\t'Eddie',\n\t'Mcgirt',\n\t'Boxley',\n\t'Exline',\n\t'Lujano',\n\t'Michalowski',\n\t'Rottman',\n\t'Throop',\n\t'Zech',\n\t'Baros',\n\t'Bohne',\n\t'Mule',\n\t'Monica',\n\t'Lasiter',\n\t'Alsop',\n\t'Pittard',\n\t'Whitefield',\n\t'Mccaskey',\n\t'Paek',\n\t'Reilley',\n\t'Wasik',\n\t'Bouma',\n\t'Garrigan',\n\t'Nett',\n\t'Mclarty',\n\t'Flemings',\n\t'Alcorta',\n\t'Spoor',\n\t'Mccranie',\n\t'Coverdale',\n\t'Guaman',\n\t'Jenness',\n\t'Knoop',\n\t'Scarpelli',\n\t'Schrecengost',\n\t'Toews',\n\t'Caughey',\n\t'Laska',\n\t'Helfer',\n\t'Bevers',\n\t'Forbus',\n\t'Mccrady',\n\t'Reasor',\n\t'Aggarwal',\n\t'Locicero',\n\t'Uber',\n\t'Vadnais',\n\t'Budnick',\n\t'Duhamel',\n\t'Stelling',\n\t'Kicklighter',\n\t'Basco',\n\t'Otts',\n\t'Tippins',\n\t'Bliven',\n\t'Gayheart',\n\t'Knauf',\n\t'Lalli',\n\t'Quigg',\n\t'Kingman',\n\t'Boros',\n\t'Henneman',\n\t'Lofland',\n\t'Pendarvis',\n\t'Keitt',\n\t'Gelfand',\n\t'Greaney',\n\t'Kindt',\n\t'Stimac',\n\t'Kirn',\n\t'Tokar',\n\t'Miura',\n\t'Wendorf',\n\t'Vigue',\n\t'Dorey',\n\t'Fegan',\n\t'Meares',\n\t'Thierry',\n\t'Ambrosino',\n\t'Coenen',\n\t'Kersting',\n\t'Leas',\n\t'Millward',\n\t'Petzold',\n\t'Morphew',\n\t'Filippone',\n\t'Stoffer',\n\t'Mani',\n\t'Clairmont',\n\t'Mccreight',\n\t'Cully',\n\t'Bissonette',\n\t'Kochan',\n\t'Linneman',\n\t'Parlier',\n\t'Bergner',\n\t'Sterns',\n\t'Steveson',\n\t'Clingerman',\n\t'Karg',\n\t'Medved',\n\t'Prakash',\n\t'Ulman',\n\t'Petroski',\n\t'Hagaman',\n\t'Huddle',\n\t'Auclair',\n\t'Shives',\n\t'Dunavant',\n\t'Glade',\n\t'Chauncey',\n\t'Pough',\n\t'Burgoon',\n\t'Pluta',\n\t'Couey',\n\t'Punch',\n\t'Colmenares',\n\t'Fosdick',\n\t'Henze',\n\t'Kaczynski',\n\t'Lomonaco',\n\t'Roepke',\n\t'Schenkel',\n\t'Schlatter',\n\t'Schoenherr',\n\t'Tripodi',\n\t'Zeiler',\n\t'Bunt',\n\t'Dolly',\n\t'Boyland',\n\t'Bickle',\n\t'Cincotta',\n\t'Crull',\n\t'Enfield',\n\t'Saltz',\n\t'Skelley',\n\t'Younts',\n\t'Bussiere',\n\t'Latona',\n\t'Sensabaugh',\n\t'Grosvenor',\n\t'Woolbright',\n\t'Shorty',\n\t'Brungardt',\n\t'Cardon',\n\t'Carlberg',\n\t'Clevinger',\n\t'Rucinski',\n\t'Vanhooser',\n\t'Westling',\n\t'Imperial',\n\t'Tyer',\n\t'Elzey',\n\t'Aslam',\n\t'Fesler',\n\t'Leiser',\n\t'Smitley',\n\t'Orgeron',\n\t'Scuderi',\n\t'Flatley',\n\t'Whiteford',\n\t'Tison',\n\t'Laurin',\n\t'Fortman',\n\t'Whitty',\n\t'Kirton',\n\t'Cassella',\n\t'Flom',\n\t'Seigel',\n\t'Cossette',\n\t'Bryden',\n\t'Gobin',\n\t'Hieb',\n\t'Marzullo',\n\t'Matuszak',\n\t'Rolph',\n\t'Spilman',\n\t'Vanvoorhis',\n\t'Sande',\n\t'Suydam',\n\t'Gledhill',\n\t'Krill',\n\t'Mackiewicz',\n\t'Templet',\n\t'Friedrichs',\n\t'Ruddell',\n\t'Kats',\n\t'Nourse',\n\t'Millender',\n\t'Wafer',\n\t'Fauntleroy',\n\t'Archibeque',\n\t'Maslowski',\n\t'Metzgar',\n\t'Pizana',\n\t'Mcguffey',\n\t'Estridge',\n\t'Vanalstyne',\n\t'Decuir',\n\t'Mcbean',\n\t'Hardnett',\n\t'Avilla',\n\t'Spadafora',\n\t'Weisel',\n\t'Kann',\n\t'Leyden',\n\t'Purdom',\n\t'Tappan',\n\t'Gunnells',\n\t'Slaten',\n\t'Hansley',\n\t'Chiappetta',\n\t'Rozek',\n\t'Tiede',\n\t'Winland',\n\t'Dubuque',\n\t'Heslin',\n\t'Bradway',\n\t'Eckels',\n\t'Saffell',\n\t'Germaine',\n\t'Apolinar',\n\t'Coloma',\n\t'Gawlik',\n\t'Chipps',\n\t'Hicklin',\n\t'Glanton',\n\t'Dalke',\n\t'Denlinger',\n\t'Kuipers',\n\t'Houpt',\n\t'Parcell',\n\t'Claeys',\n\t'Ferreri',\n\t'Greif',\n\t'Lucente',\n\t'Siems',\n\t'Yousef',\n\t'Llerena',\n\t'Rote',\n\t'Suero',\n\t'Malmberg',\n\t'Touchette',\n\t'Luton',\n\t'Wess',\n\t'Height',\n\t'Stampley',\n\t'Anastasi',\n\t'Bulman',\n\t'Deharo',\n\t'Laube',\n\t'Severt',\n\t'Midgley',\n\t'Colling',\n\t'Ell',\n\t'Burbage',\n\t'Commander',\n\t'Hubner',\n\t'Zurcher',\n\t'Arocha',\n\t'Nobile',\n\t'Tingler',\n\t'Ellman',\n\t'Lolley',\n\t'Pewitt',\n\t'Mcduff',\n\t'Hyler',\n\t'Goltz',\n\t'Kubota',\n\t'Lamberti',\n\t'Ohern',\n\t'Uhrig',\n\t'Dummer',\n\t'Keesling',\n\t'Litzinger',\n\t'Moriarity',\n\t'Servantes',\n\t'Rohe',\n\t'Stokely',\n\t'Weedon',\n\t'Pippins',\n\t'Dehner',\n\t'Krogman',\n\t'Luecke',\n\t'Rosete',\n\t'Zona',\n\t'Lowy',\n\t'Applebee',\n\t'Heather',\n\t'Cruikshank',\n\t'Linson',\n\t'Brandy',\n\t'Koser',\n\t'Ruel',\n\t'Ruppe',\n\t'Saeteurn',\n\t'Dewolfe',\n\t'Sawtelle',\n\t'Rudin',\n\t'Raver',\n\t'Bassham',\n\t'Yaw',\n\t'Segrest',\n\t'Belfiore',\n\t'Heeren',\n\t'Kotowski',\n\t'Luken',\n\t'Makela',\n\t'Ranallo',\n\t'Schug',\n\t'Seery',\n\t'Payson',\n\t'Caufield',\n\t'Lacefield',\n\t'Bratten',\n\t'Jr',\n\t'Buske',\n\t'Ternes',\n\t'Bivona',\n\t'Felber',\n\t'Rott',\n\t'Pitkin',\n\t'Pridmore',\n\t'Oyer',\n\t'Astle',\n\t'Jeppesen',\n\t'Shimabukuro',\n\t'Soltys',\n\t'Vieth',\n\t'Rasnick',\n\t'Calfee',\n\t'Brignac',\n\t'Lamy',\n\t'Facey',\n\t'Alper',\n\t'Borquez',\n\t'Cavalieri',\n\t'Niswonger',\n\t'Pajak',\n\t'Schwabe',\n\t'Ringel',\n\t'Abbe',\n\t'Fenley',\n\t'Churchman',\n\t'Haydel',\n\t'Stockard',\n\t'Adamek',\n\t'Ellerman',\n\t'Torpey',\n\t'Waldroup',\n\t'Hunte',\n\t'Bienaime',\n\t'Lazzara',\n\t'Nemitz',\n\t'Wingerter',\n\t'Boer',\n\t'Franken',\n\t'Lebow',\n\t'Manger',\n\t'Baisley',\n\t'Pane',\n\t'Gayden',\n\t'Bertelsen',\n\t'Curfman',\n\t'Leanos',\n\t'Nissley',\n\t'Odwyer',\n\t'Manzer',\n\t'Kollman',\n\t'Quon',\n\t'Holgate',\n\t'Cola',\n\t'Mckissack',\n\t'Cousar',\n\t'Bilski',\n\t'Boehler',\n\t'Kawamura',\n\t'April',\n\t'Mckelvy',\n\t'Lanni',\n\t'Roehm',\n\t'Salva',\n\t'Stackpole',\n\t'Stracener',\n\t'Masiello',\n\t'Barrus',\n\t'Tubb',\n\t'Brummel',\n\t'Devereux',\n\t'Foushee',\n\t'Corado',\n\t'Gladfelter',\n\t'Grewe',\n\t'Hodapp',\n\t'Swartwood',\n\t'Vacek',\n\t'Wrona',\n\t'Shaffner',\n\t'Ullah',\n\t'Heslop',\n\t'Mungo',\n\t'Haymon',\n\t'Behrend',\n\t'Falter',\n\t'Feola',\n\t'Gruner',\n\t'Picklesimer',\n\t'Riedl',\n\t'Stegeman',\n\t'Harpole',\n\t'Moyes',\n\t'Boulay',\n\t'Brighton',\n\t'Guise',\n\t'Laury',\n\t'Badilla',\n\t'Cypher',\n\t'Houdek',\n\t'Juhasz',\n\t'Klingbeil',\n\t'Pinales',\n\t'Fellman',\n\t'Daher',\n\t'Allmond',\n\t'Bal',\n\t'Crager',\n\t'Hillebrand',\n\t'Menezes',\n\t'Serpas',\n\t'Zager',\n\t'Alvardo',\n\t'Summerford',\n\t'Stillings',\n\t'Vandergrift',\n\t'Hanchett',\n\t'Minto',\n\t'Daughtery',\n\t'Gillon',\n\t'Rajan',\n\t'Vasko',\n\t'Wirick',\n\t'Woolever',\n\t'Caserta',\n\t'Welle',\n\t'Kimbrel',\n\t'Traywick',\n\t'Hands',\n\t'Spratley',\n\t'Iannuzzi',\n\t'Krikorian',\n\t'Runk',\n\t'Sood',\n\t'Riese',\n\t'Antunes',\n\t'Winsett',\n\t'Mans',\n\t'Capel',\n\t'Condron',\n\t'Nilles',\n\t'Petz',\n\t'Salemi',\n\t'Bainter',\n\t'Patchett',\n\t'Hirschfeld',\n\t'Murrin',\n\t'Lamey',\n\t'Mcglothin',\n\t'Hodo',\n\t'Hirth',\n\t'Kaltenbach',\n\t'Kensinger',\n\t'Leidy',\n\t'Shurtz',\n\t'Braatz',\n\t'Brafford',\n\t'Willet',\n\t'Clendening',\n\t'Basch',\n\t'Brockwell',\n\t'Oberman',\n\t'Palmateer',\n\t'Osornio',\n\t'Gehl',\n\t'Staker',\n\t'Mattila',\n\t'Dawn',\n\t'Cowherd',\n\t'Appleman',\n\t'Carbonaro',\n\t'Castruita',\n\t'Pilling',\n\t'Wenrich',\n\t'Christoffersen',\n\t'Hinzman',\n\t'Kaup',\n\t'Pettersen',\n\t'Jue',\n\t'Khalsa',\n\t'Mutz',\n\t'Remus',\n\t'Arch',\n\t'Shands',\n\t'Borek',\n\t'Buresh',\n\t'Egli',\n\t'Feldkamp',\n\t'Hampel',\n\t'Lichtenberg',\n\t'Morimoto',\n\t'Brasel',\n\t'Demelo',\n\t'Royalty',\n\t'Averitt',\n\t'Metivier',\n\t'Bradsher',\n\t'Avallone',\n\t'Demeter',\n\t'Masucci',\n\t'Musil',\n\t'Wichmann',\n\t'Broman',\n\t'Taunton',\n\t'Blewett',\n\t'Duhart',\n\t'Goo',\n\t'Hanus',\n\t'Mathai',\n\t'Shutts',\n\t'Taniguchi',\n\t'Vanleeuwen',\n\t'Delvillar',\n\t'Hane',\n\t'Givan',\n\t'Croskey',\n\t'Elamin',\n\t'Deffenbaugh',\n\t'Miklos',\n\t'Passalacqua',\n\t'Woessner',\n\t'Lapan',\n\t'Miah',\n\t'Coty',\n\t'Baksh',\n\t'Beehler',\n\t'Goel',\n\t'Wolfinger',\n\t'Goodhue',\n\t'Toal',\n\t'Mattoon',\n\t'Haq',\n\t'Nida',\n\t'Dant',\n\t'Varnadore',\n\t'Tippit',\n\t'Every',\n\t'Bohling',\n\t'Lichtenberger',\n\t'Louk',\n\t'Soderquist',\n\t'Werkheiser',\n\t'Willbanks',\n\t'Whitis',\n\t'Millikin',\n\t'Dietzel',\n\t'Frase',\n\t'Ishida',\n\t'Pilger',\n\t'Grajales',\n\t'Kole',\n\t'Roff',\n\t'Ballantine',\n\t'Basden',\n\t'Cadenas',\n\t'Caliendo',\n\t'Hotard',\n\t'Vidrio',\n\t'Lichtman',\n\t'Devinney',\n\t'Fugitt',\n\t'Proud',\n\t'Hults',\n\t'Galey',\n\t'Verna',\n\t'Newburn',\n\t'Lafortune',\n\t'Fobbs',\n\t'Azure',\n\t'Cheong',\n\t'Heft',\n\t'Aispuro',\n\t'Longstreth',\n\t'Lajeunesse',\n\t'Howle',\n\t'Galley',\n\t'Lovan',\n\t'Convery',\n\t'Malatesta',\n\t'Warnecke',\n\t'Glavin',\n\t'Reil',\n\t'Filson',\n\t'Poage',\n\t'Fountaine',\n\t'Nolley',\n\t'Raglin',\n\t'Backlund',\n\t'Doerfler',\n\t'Faunce',\n\t'Hooton',\n\t'Lightcap',\n\t'Stepanek',\n\t'Grosser',\n\t'Weld',\n\t'Filippi',\n\t'Youn',\n\t'Matis',\n\t'Harnett',\n\t'Ferrill',\n\t'Segers',\n\t'Ponds',\n\t'Cuyler',\n\t'Faile',\n\t'Flaugher',\n\t'Kuehner',\n\t'Giorgi',\n\t'Eckler',\n\t'Sergeant',\n\t'Twiggs',\n\t'Boeck',\n\t'Flach',\n\t'Iliff',\n\t'Mcmurtrey',\n\t'Mcnelis',\n\t'Steckel',\n\t'Rouillard',\n\t'Folkerts',\n\t'Mechling',\n\t'Whitcher',\n\t'Daws',\n\t'Joly',\n\t'Abt',\n\t'Eells',\n\t'Niccum',\n\t'Twining',\n\t'Grinder',\n\t'Melrose',\n\t'Yarbro',\n\t'Degenhardt',\n\t'Dimeglio',\n\t'Okamura',\n\t'Kriss',\n\t'Payette',\n\t'Chui',\n\t'Mowers',\n\t'Foose',\n\t'Kinzie',\n\t'Blick',\n\t'Rizer',\n\t'Alcock',\n\t'Sirmans',\n\t'Behrman',\n\t'Carsten',\n\t'Kopacz',\n\t'Randhawa',\n\t'Schwing',\n\t'Burkhard',\n\t'Cunanan',\n\t'Exley',\n\t'Balducci',\n\t'Leman',\n\t'Hyslop',\n\t'Burtch',\n\t'Hadnot',\n\t'Lanphear',\n\t'Finchum',\n\t'Voit',\n\t'Jock',\n\t'Wilhoite',\n\t'Officer',\n\t'Mayweather',\n\t'Ravenell',\n\t'Arehart',\n\t'Bonetti',\n\t'Cloer',\n\t'Galliher',\n\t'Niven',\n\t'Uyeda',\n\t'Coughenour',\n\t'Siddiqi',\n\t'Karimi',\n\t'Cupit',\n\t'Loupe',\n\t'Hammell',\n\t'Antley',\n\t'Ally',\n\t'Southers',\n\t'Haymond',\n\t'Hosley',\n\t'Broz',\n\t'Kinoshita',\n\t'Kohout',\n\t'Lipke',\n\t'Ostrow',\n\t'Teves',\n\t'Gaus',\n\t'Meiser',\n\t'Cravey',\n\t'Noss',\n\t'Drayer',\n\t'Crooms',\n\t'Carrano',\n\t'Mckechnie',\n\t'Uhrich',\n\t'Villalva',\n\t'Wilkening',\n\t'Benevides',\n\t'Kepple',\n\t'Pon',\n\t'Randol',\n\t'Leadbetter',\n\t'Russom',\n\t'Locklin',\n\t'Battiste',\n\t'Abundis',\n\t'Agosta',\n\t'Bartek',\n\t'Brillhart',\n\t'Hoffmaster',\n\t'Mehr',\n\t'Spanos',\n\t'Denker',\n\t'Kimberling',\n\t'Schon',\n\t'Felten',\n\t'Lightle',\n\t'Ramseur',\n\t'Branning',\n\t'Deblois',\n\t'Inocencio',\n\t'Maricle',\n\t'Nishimoto',\n\t'Oviatt',\n\t'Shunk',\n\t'Taddeo',\n\t'Villarruel',\n\t'Otterson',\n\t'Clune',\n\t'Seamster',\n\t'Dandy',\n\t'Cybulski',\n\t'Daza',\n\t'Eastep',\n\t'Faulhaber',\n\t'Friedberg',\n\t'Gentz',\n\t'Scola',\n\t'Sebesta',\n\t'Glinski',\n\t'Schoon',\n\t'Graeber',\n\t'Sinks',\n\t'Wee',\n\t'Summerall',\n\t'Deets',\n\t'Furnish',\n\t'Kelemen',\n\t'Maiorano',\n\t'Teachout',\n\t'Paquet',\n\t'Mcgahey',\n\t'Kill',\n\t'Horman',\n\t'Selders',\n\t'Cottman',\n\t'Delfin',\n\t'Fronk',\n\t'Seelig',\n\t'Visco',\n\t'Briles',\n\t'Castillon',\n\t'Suire',\n\t'Havey',\n\t'Arner',\n\t'Farver',\n\t'Marts',\n\t'Gean',\n\t'Hugh',\n\t'Stoney',\n\t'Townsel',\n\t'Sandquist',\n\t'Neidig',\n\t'Miser',\n\t'Leeth',\n\t'Hocutt',\n\t'Balcazar',\n\t'Caporale',\n\t'Guymon',\n\t'Horstmann',\n\t'Miedema',\n\t'Zickefoose',\n\t'Casterline',\n\t'Pfannenstiel',\n\t'Becht',\n\t'Myres',\n\t'Ried',\n\t'Vallery',\n\t'Bator',\n\t'Calise',\n\t'Cotterman',\n\t'Desautels',\n\t'Hinchey',\n\t'Kostka',\n\t'Orenstein',\n\t'Rosenau',\n\t'Skow',\n\t'Cuello',\n\t'Herder',\n\t'Cure',\n\t'Eadie',\n\t'Claggett',\n\t'Batie',\n\t'Kirwin',\n\t'Troia',\n\t'Sinnett',\n\t'Books',\n\t'Maize',\n\t'Tremble',\n\t'Sinkler',\n\t'Gallon',\n\t'Winkles',\n\t'Zion',\n\t'Walt',\n\t'Pearse',\n\t'Gathright',\n\t'Isakson',\n\t'Saeger',\n\t'Siegle',\n\t'Wittwer',\n\t'Modesto',\n\t'Bensen',\n\t'Royals',\n\t'Mccane',\n\t'Begaye',\n\t'Matuszewski',\n\t'Schrier',\n\t'Shimko',\n\t'Torchia',\n\t'Ausmus',\n\t'Casazza',\n\t'Mealer',\n\t'Yant',\n\t'Amar',\n\t'Callas',\n\t'Depaola',\n\t'Kintner',\n\t'Lech',\n\t'Marsico',\n\t'Boerger',\n\t'Rak',\n\t'Kellen',\n\t'Kennemer',\n\t'Carbo',\n\t'Rennick',\n\t'Brennen',\n\t'Dorrough',\n\t'Shealey',\n\t'Breyer',\n\t'Dilks',\n\t'Geske',\n\t'Hundt',\n\t'Occhipinti',\n\t'Strauser',\n\t'Schult',\n\t'Transue',\n\t'Holding',\n\t'Vanhorne',\n\t'Critchlow',\n\t'Steptoe',\n\t'Buerger',\n\t'Claassen',\n\t'Farinas',\n\t'Ruland',\n\t'Holsapple',\n\t'Mcclintic',\n\t'Bendel',\n\t'Muriel',\n\t'Mckeithan',\n\t'Shellman',\n\t'Balzano',\n\t'Bement',\n\t'Montesinos',\n\t'Ringle',\n\t'Sobotka',\n\t'Donahoo',\n\t'Dicker',\n\t'Harling',\n\t'Burkley',\n\t'Browner',\n\t'Iovino',\n\t'Kubala',\n\t'Labriola',\n\t'Morra',\n\t'Orloff',\n\t'Patchen',\n\t'Recchia',\n\t'Budge',\n\t'Glendenning',\n\t'Nethery',\n\t'Scholtz',\n\t'Aybar',\n\t'Buis',\n\t'Mattie',\n\t'Bonsall',\n\t'Conine',\n\t'Dettmer',\n\t'Gerding',\n\t'Plantz',\n\t'Vandorn',\n\t'Tremaine',\n\t'Ruddick',\n\t'Murrow',\n\t'Mceachin',\n\t'Bridgeforth',\n\t'Docherty',\n\t'Hultman',\n\t'Liechty',\n\t'Touchton',\n\t'Yokoyama',\n\t'Borth',\n\t'Daoud',\n\t'Mealy',\n\t'Hearst',\n\t'Stalling',\n\t'Drapeau',\n\t'Hellwig',\n\t'Longtin',\n\t'Rappa',\n\t'Tormey',\n\t'Vanantwerp',\n\t'Sabel',\n\t'Neagle',\n\t'Duet',\n\t'Liebert',\n\t'Lush',\n\t'Aly',\n\t'Behn',\n\t'Brereton',\n\t'Atienza',\n\t'Dubey',\n\t'Gennaro',\n\t'Miltenberger',\n\t'Nitschke',\n\t'Ragle',\n\t'Schumm',\n\t'Tangen',\n\t'Waibel',\n\t'Whitham',\n\t'Stallone',\n\t'Perritt',\n\t'Coody',\n\t'Hinch',\n\t'Depuy',\n\t'Dunkelberger',\n\t'Texeira',\n\t'Tomita',\n\t'Diers',\n\t'Elsasser',\n\t'Neve',\n\t'Clendenen',\n\t'Pettibone',\n\t'Dobyns',\n\t'Ciotti',\n\t'Dodrill',\n\t'Fridman',\n\t'Lepine',\n\t'Nygard',\n\t'Shreves',\n\t'Sollenberger',\n\t'Leinbach',\n\t'Diazdeleon',\n\t'Bourget',\n\t'Ramadan',\n\t'Allensworth',\n\t'Scarboro',\n\t'Prowell',\n\t'Ghee',\n\t'Edouard',\n\t'Duca',\n\t'Ziebell',\n\t'Kercher',\n\t'Greger',\n\t'Mas',\n\t'Shier',\n\t'Branca',\n\t'Melchior',\n\t'Cast',\n\t'Saner',\n\t'Beswick',\n\t'Carone',\n\t'Sobieski',\n\t'Zweifel',\n\t'Beahm',\n\t'Defrank',\n\t'Krebsbach',\n\t'Mericle',\n\t'Mcinnes',\n\t'Lown',\n\t'Brumback',\n\t'Clause',\n\t'Claborn',\n\t'Rollin',\n\t'Montford',\n\t'Beckles',\n\t'Grebe',\n\t'Groesbeck',\n\t'Guidi',\n\t'Mathisen',\n\t'Mukherjee',\n\t'Rotolo',\n\t'Seybert',\n\t'Odegaard',\n\t'Mackley',\n\t'Glatt',\n\t'Going',\n\t'Perks',\n\t'Sansbury',\n\t'Prude',\n\t'Bequette',\n\t'Difilippo',\n\t'Dodgen',\n\t'Terpening',\n\t'Vanepps',\n\t'Poncedeleon',\n\t'Qu',\n\t'Ullery',\n\t'Wisener',\n\t'Lok',\n\t'Lutton',\n\t'Bellah',\n\t'Kinsel',\n\t'Tone',\n\t'Carabajal',\n\t'Koll',\n\t'Shankar',\n\t'Edick',\n\t'Donathan',\n\t'Andree',\n\t'Perrino',\n\t'Moffit',\n\t'Gaddie',\n\t'Breidenbach',\n\t'Jespersen',\n\t'Larrick',\n\t'Mauriello',\n\t'Morgado',\n\t'Roh',\n\t'Svec',\n\t'Tebbe',\n\t'Thieman',\n\t'Cerezo',\n\t'Perkowski',\n\t'Colville',\n\t'Yarnall',\n\t'Chason',\n\t'Brach',\n\t'Meller',\n\t'Brayboy',\n\t'Salaam',\n\t'Keleher',\n\t'Kilbourn',\n\t'Lowenthal',\n\t'Rispoli',\n\t'Vanzee',\n\t'Vlahos',\n\t'Trojan',\n\t'Birdsell',\n\t'Defoor',\n\t'Mcclusky',\n\t'Barret',\n\t'Smoke',\n\t'Berkeley',\n\t'Cuadrado',\n\t'Galyean',\n\t'Gruen',\n\t'Gualtieri',\n\t'Kurland',\n\t'Sposato',\n\t'Stieber',\n\t'Weatherman',\n\t'Strausser',\n\t'Miera',\n\t'Edlin',\n\t'Gilford',\n\t'Mouzon',\n\t'Buczek',\n\t'Krapf',\n\t'Lucatero',\n\t'Amburn',\n\t'Peddicord',\n\t'Forero',\n\t'Domer',\n\t'Farish',\n\t'Segraves',\n\t'Sant',\n\t'Engles',\n\t'Douthitt',\n\t'Lall',\n\t'Wormley',\n\t'Geisel',\n\t'Hao',\n\t'Polhemus',\n\t'Slifer',\n\t'Mowen',\n\t'Markin',\n\t'Rape',\n\t'Bollin',\n\t'Bulloch',\n\t'Pouncey',\n\t'Rufus',\n\t'Goodlow',\n\t'Dammann',\n\t'Delgrosso',\n\t'Gadbois',\n\t'Leap',\n\t'Lorentzen',\n\t'Sprankle',\n\t'Stucki',\n\t'Vitela',\n\t'Walck',\n\t'Winkelmann',\n\t'Mund',\n\t'Bley',\n\t'Channel',\n\t'Griebel',\n\t'Nordberg',\n\t'Slinkard',\n\t'Orrick',\n\t'Crooker',\n\t'Groll',\n\t'Maradiaga',\n\t'Jolin',\n\t'Boni',\n\t'Prom',\n\t'Reder',\n\t'Easler',\n\t'Totty',\n\t'Arnaud',\n\t'Bohler',\n\t'Heikkila',\n\t'Kehler',\n\t'Klingenberg',\n\t'Matera',\n\t'Striegel',\n\t'Urzua',\n\t'Baldi',\n\t'Burling',\n\t'Osmond',\n\t'Rucks',\n\t'Diel',\n\t'Kassel',\n\t'Schewe',\n\t'Conkling',\n\t'Ricke',\n\t'Schack',\n\t'Shirah',\n\t'Brauner',\n\t'Carriker',\n\t'Mcduffy',\n\t'Bieker',\n\t'Credeur',\n\t'Fabry',\n\t'Holdeman',\n\t'Jeansonne',\n\t'Klett',\n\t'Kolstad',\n\t'Mustain',\n\t'Strub',\n\t'Ricketson',\n\t'Fairbairn',\n\t'Langel',\n\t'Fenster',\n\t'Slatton',\n\t'Ehrenberg',\n\t'Espinola',\n\t'Hannaford',\n\t'Hinderliter',\n\t'Siqueiros',\n\t'Ange',\n\t'Gillin',\n\t'Battin',\n\t'Belue',\n\t'Spigner',\n\t'Simien',\n\t'Gervasi',\n\t'Pallares',\n\t'Plotner',\n\t'Puri',\n\t'Swiatek',\n\t'Vanmatre',\n\t'Corp',\n\t'Devillier',\n\t'Bucholtz',\n\t'Bremner',\n\t'Jen',\n\t'Evanson',\n\t'Ghent',\n\t'Eastland',\n\t'Kappler',\n\t'Grahn',\n\t'Shadrick',\n\t'Kibby',\n\t'Chaires',\n\t'Kontos',\n\t'Petrov',\n\t'Pillai',\n\t'Chadbourne',\n\t'Sotolongo',\n\t'Allende',\n\t'Kells',\n\t'Hayford',\n\t'Hempstead',\n\t'Livers',\n\t'Farrior',\n\t'Authement',\n\t'Bitz',\n\t'Corkery',\n\t'Klawitter',\n\t'Mongold',\n\t'Somma',\n\t'Topham',\n\t'Defrancisco',\n\t'Noda',\n\t'Breon',\n\t'Thetford',\n\t'Rod',\n\t'Kisling',\n\t'Drouillard',\n\t'Dotts',\n\t'Gramajo',\n\t'Masek',\n\t'Volkert',\n\t'Vora',\n\t'Pietras',\n\t'Sheffler',\n\t'Shrestha',\n\t'Kono',\n\t'Panza',\n\t'Brunn',\n\t'Tatom',\n\t'Nasir',\n\t'Barris',\n\t'Bursey',\n\t'Elsea',\n\t'Kettner',\n\t'Martorana',\n\t'Lindow',\n\t'Chevez',\n\t'Pater',\n\t'Hennis',\n\t'Iman',\n\t'Stembridge',\n\t'Satcher',\n\t'Britz',\n\t'Hommel',\n\t'Llanas',\n\t'Pathak',\n\t'Schwartzman',\n\t'Janz',\n\t'Hickle',\n\t'Deakins',\n\t'Mantle',\n\t'Billing',\n\t'Veiga',\n\t'Darbonne',\n\t'Angelle',\n\t'Granderson',\n\t'Odoms',\n\t'Mondesir',\n\t'Ducksworth',\n\t'Anker',\n\t'Deneen',\n\t'Follmer',\n\t'Norred',\n\t'Whitecotton',\n\t'Halsted',\n\t'Schiele',\n\t'Reddin',\n\t'Pichon',\n\t'Eustice',\n\t'Finelli',\n\t'Kawasaki',\n\t'Kerekes',\n\t'Surrett',\n\t'Divers',\n\t'Kerney',\n\t'Bohlman',\n\t'Oberst',\n\t'Prough',\n\t'Tarwater',\n\t'Wangler',\n\t'Piceno',\n\t'Persico',\n\t'Lastra',\n\t'Fillman',\n\t'Barlett',\n\t'Cort',\n\t'Kuchar',\n\t'Plaisted',\n\t'Rufo',\n\t'Whitmarsh',\n\t'Fusaro',\n\t'Bajwa',\n\t'Belter',\n\t'Aldama',\n\t'Conlee',\n\t'Tweedie',\n\t'Greear',\n\t'Riviera',\n\t'Stormer',\n\t'Flannagan',\n\t'Heatley',\n\t'Feazell',\n\t'Bastidas',\n\t'Benninger',\n\t'Canseco',\n\t'Hanners',\n\t'Kreiner',\n\t'Pestana',\n\t'Simerly',\n\t'Such',\n\t'Tiedeman',\n\t'Weible',\n\t'Zawadzki',\n\t'Rayman',\n\t'Crose',\n\t'Sheeler',\n\t'Kirven',\n\t'Winford',\n\t'Mackall',\n\t'Balderson',\n\t'Calleja',\n\t'Klinefelter',\n\t'Lauffer',\n\t'Probert',\n\t'Melero',\n\t'Ravelo',\n\t'Degroff',\n\t'Pylant',\n\t'Ricco',\n\t'Varona',\n\t'Pickney',\n\t'Bachmeier',\n\t'Dulay',\n\t'Hanover',\n\t'Virgilio',\n\t'Spino',\n\t'Bohon',\n\t'Cantin',\n\t'Pettijohn',\n\t'Branigan',\n\t'Duhe',\n\t'Perine',\n\t'Thedford',\n\t'Shamburger',\n\t'Guarnieri',\n\t'Guptill',\n\t'Nyland',\n\t'Setliff',\n\t'Shreffler',\n\t'Viggiano',\n\t'Pries',\n\t'Sunde',\n\t'Bulmer',\n\t'Platts',\n\t'Jeremiah',\n\t'Fawley',\n\t'Jansson',\n\t'Rebelo',\n\t'Prochnow',\n\t'Waldeck',\n\t'Citron',\n\t'Roughton',\n\t'Ryckman',\n\t'Molano',\n\t'Cannaday',\n\t'Ned',\n\t'Beckerman',\n\t'Galaz',\n\t'Graziani',\n\t'Kawakami',\n\t'Limones',\n\t'Mousseau',\n\t'Riha',\n\t'Huser',\n\t'Casady',\n\t'Kirker',\n\t'Benish',\n\t'Tomczyk',\n\t'Hallahan',\n\t'Kue',\n\t'Siple',\n\t'Kandel',\n\t'Maring',\n\t'Bosak',\n\t'Gandolfo',\n\t'Reichart',\n\t'Robarge',\n\t'Shufelt',\n\t'Forry',\n\t'Richart',\n\t'Shireman',\n\t'Tozzi',\n\t'Trudel',\n\t'Tat',\n\t'Maday',\n\t'Faw',\n\t'Lawrie',\n\t'Mingle',\n\t'Yasin',\n\t'Cutrone',\n\t'Fairbrother',\n\t'Ficken',\n\t'Kluesner',\n\t'Lagana',\n\t'Schoenborn',\n\t'Greb',\n\t'Stromain',\n\t'Mcpeters',\n\t'Toepfer',\n\t'Wehrman',\n\t'Kozma',\n\t'Rohner',\n\t'Kittel',\n\t'Louderback',\n\t'Daughtrey',\n\t'Philippe',\n\t'Bargo',\n\t'Cullinane',\n\t'Fama',\n\t'Fredenburg',\n\t'Pedone',\n\t'Santillanes',\n\t'Zahner',\n\t'Zupan',\n\t'Dundon',\n\t'Gilfillan',\n\t'Grego',\n\t'Otter',\n\t'Jamil',\n\t'Beaubien',\n\t'Collingwood',\n\t'Quinney',\n\t'Botero',\n\t'Edstrom',\n\t'Flink',\n\t'Ortner',\n\t'Schmidtke',\n\t'Reichle',\n\t'Leder',\n\t'Pelosi',\n\t'Fiorito',\n\t'Berber',\n\t'Hislop',\n\t'Dunstan',\n\t'Favorite',\n\t'Wooding',\n\t'Gariepy',\n\t'Gottesman',\n\t'Guercio',\n\t'Konz',\n\t'Kothari',\n\t'Laguardia',\n\t'Lamphier',\n\t'Puetz',\n\t'Casagrande',\n\t'Quay',\n\t'Rieth',\n\t'Vowell',\n\t'Mcanulty',\n\t'Mian',\n\t'Lucus',\n\t'Alvizo',\n\t'Domanski',\n\t'Elling',\n\t'Maniaci',\n\t'Neumeyer',\n\t'Piraino',\n\t'Schroll',\n\t'Willsey',\n\t'Avellaneda',\n\t'Wilcoxen',\n\t'Murrey',\n\t'Bennette',\n\t'Boyajian',\n\t'Distler',\n\t'Lindamood',\n\t'Maclaren',\n\t'Onken',\n\t'Stefano',\n\t'Uselton',\n\t'Wilgus',\n\t'Rardin',\n\t'Boen',\n\t'Stillwagon',\n\t'Satter',\n\t'Allis',\n\t'Capell',\n\t'Nedd',\n\t'Arcand',\n\t'Breit',\n\t'Horwath',\n\t'Lakatos',\n\t'Roling',\n\t'Hessel',\n\t'Cusson',\n\t'Rockefeller',\n\t'Shiffer',\n\t'Briney',\n\t'Celeste',\n\t'Sayed',\n\t'Revelle',\n\t'Corker',\n\t'Baldonado',\n\t'Lokken',\n\t'Plymale',\n\t'Sugden',\n\t'Twist',\n\t'Parten',\n\t'Geil',\n\t'Sime',\n\t'Grisby',\n\t'Jeanty',\n\t'Baroni',\n\t'Ditullio',\n\t'Domenico',\n\t'Geiss',\n\t'Gemmill',\n\t'Leng',\n\t'Lewicki',\n\t'Weyandt',\n\t'Haycock',\n\t'Coonce',\n\t'Pillar',\n\t'Medcalf',\n\t'Sall',\n\t'Goldsborough',\n\t'Bergerson',\n\t'Daffron',\n\t'Hinchman',\n\t'Leibold',\n\t'Sarkissian',\n\t'Serratos',\n\t'Uhlig',\n\t'Wurth',\n\t'Ost',\n\t'Steinmann',\n\t'Saum',\n\t'Bullion',\n\t'Dejonge',\n\t'Assad',\n\t'Adelson',\n\t'Sholes',\n\t'Clermont',\n\t'Tabron',\n\t'Kilduff',\n\t'Millspaugh',\n\t'Partyka',\n\t'Santore',\n\t'Wensel',\n\t'Zima',\n\t'Raschke',\n\t'Simonis',\n\t'Tuell',\n\t'Obriant',\n\t'Lewter',\n\t'Nealey',\n\t'Baranski',\n\t'Bloomberg',\n\t'Franchi',\n\t'Klemme',\n\t'Raborn',\n\t'Wohlgemuth',\n\t'Basta',\n\t'Bernardini',\n\t'Canlas',\n\t'Yeargin',\n\t'Stingley',\n\t'Crosland',\n\t'Bob',\n\t'Ascher',\n\t'Dibona',\n\t'Farabaugh',\n\t'Kilcoyne',\n\t'Poblete',\n\t'Beato',\n\t'Teasdale',\n\t'Rossell',\n\t'Lawhorne',\n\t'Jama',\n\t'Behringer',\n\t'Hallstrom',\n\t'Kitzman',\n\t'Klenk',\n\t'Mctigue',\n\t'Onate',\n\t'Rodda',\n\t'Siegal',\n\t'Pepple',\n\t'Tash',\n\t'Gager',\n\t'Hing',\n\t'Yokley',\n\t'Epting',\n\t'Mangham',\n\t'Zackery',\n\t'Blackerby',\n\t'Canedo',\n\t'Glatz',\n\t'Hilker',\n\t'Hummell',\n\t'Mangels',\n\t'Gamel',\n\t'Gang',\n\t'Hooser',\n\t'Moates',\n\t'Mutch',\n\t'Lyerly',\n\t'Vesey',\n\t'Satterthwaite',\n\t'Calcote',\n\t'Saulsbury',\n\t'Averette',\n\t'Ates',\n\t'Rita',\n\t'Vicencio',\n\t'Wismer',\n\t'Mayoral',\n\t'Crader',\n\t'Levens',\n\t'Joel',\n\t'Haye',\n\t'Drager',\n\t'Eiden',\n\t'Escutia',\n\t'Inzunza',\n\t'Moroz',\n\t'Sepulvado',\n\t'Tomaselli',\n\t'Zartman',\n\t'Isaak',\n\t'Philippi',\n\t'Mcgeary',\n\t'Taha',\n\t'Buttler',\n\t'Crisci',\n\t'Kot',\n\t'Micek',\n\t'Mondello',\n\t'Petrarca',\n\t'Rossini',\n\t'Villalvazo',\n\t'Weedman',\n\t'Mitten',\n\t'Favre',\n\t'Varnes',\n\t'Betancur',\n\t'Bevington',\n\t'Bockman',\n\t'Feldstein',\n\t'Kujawski',\n\t'Siemer',\n\t'Soderlund',\n\t'Fricker',\n\t'Gerstein',\n\t'Kick',\n\t'Haff',\n\t'Brackman',\n\t'Hulen',\n\t'Nephew',\n\t'Birkett',\n\t'Gardenhire',\n\t'Garn',\n\t'Kellenberger',\n\t'Mogensen',\n\t'Murata',\n\t'Weisbrod',\n\t'Vilchis',\n\t'Meder',\n\t'Akey',\n\t'Mcmanis',\n\t'Delatte',\n\t'Guiles',\n\t'Turnbough',\n\t'Murrah',\n\t'Kilgo',\n\t'Marcelin',\n\t'Cecchini',\n\t'Chrysler',\n\t'Eick',\n\t'Fletes',\n\t'Luevanos',\n\t'Kurt',\n\t'Firman',\n\t'Hensen',\n\t'Champine',\n\t'Holford',\n\t'Appelbaum',\n\t'Ciampa',\n\t'Florentino',\n\t'Lorton',\n\t'Lubinski',\n\t'Moquin',\n\t'Welke',\n\t'Grinberg',\n\t'Bolstad',\n\t'Ade',\n\t'Outten',\n\t'Grear',\n\t'Haith',\n\t'Borntreger',\n\t'Steinhauser',\n\t'Facio',\n\t'Preslar',\n\t'Speirs',\n\t'Grasser',\n\t'Zuck',\n\t'Deslauriers',\n\t'Frates',\n\t'Mayville',\n\t'Suddeth',\n\t'Littlepage',\n\t'Aversa',\n\t'Chagolla',\n\t'Godshall',\n\t'Jordahl',\n\t'Oakland',\n\t'Monsen',\n\t'Rudolf',\n\t'Mccollister',\n\t'Mickles',\n\t'Flaig',\n\t'Friberg',\n\t'Grubaugh',\n\t'Sliwinski',\n\t'Stach',\n\t'Bechtol',\n\t'Pasch',\n\t'Keebler',\n\t'Fagin',\n\t'Mister',\n\t'Wynter',\n\t'Bednarek',\n\t'Blansett',\n\t'Crossett',\n\t'Kettering',\n\t'Lafata',\n\t'Raffa',\n\t'Roig',\n\t'Schopp',\n\t'Voegele',\n\t'Waldschmidt',\n\t'Clatterbuck',\n\t'Amer',\n\t'Kraut',\n\t'Furniss',\n\t'Edgecomb',\n\t'Aspinwall',\n\t'Buckelew',\n\t'Loranger',\n\t'Koppel',\n\t'Vernier',\n\t'Latino',\n\t'Hayton',\n\t'Girod',\n\t'Primrose',\n\t'Jetter',\n\t'Hyche',\n\t'Ottley',\n\t'Isidro',\n\t'Kort',\n\t'Mulroy',\n\t'Reznik',\n\t'Tozer',\n\t'Vanderheyden',\n\t'Kassab',\n\t'Paro',\n\t'Belen',\n\t'Vandever',\n\t'Harsch',\n\t'Rawley',\n\t'Gonder',\n\t'Delbridge',\n\t'Alumbaugh',\n\t'Basulto',\n\t'Hoehne',\n\t'Mccaig',\n\t'Qin',\n\t'Rasnake',\n\t'Tewksbury',\n\t'Ratajczak',\n\t'Reinbold',\n\t'Mcgillivray',\n\t'Nuccio',\n\t'Steinbeck',\n\t'Deland',\n\t'Callow',\n\t'Wootten',\n\t'Lytton',\n\t'Calix',\n\t'Stinger',\n\t'Slider',\n\t'Cadman',\n\t'Faulconer',\n\t'Higashi',\n\t'Lamping',\n\t'Sellner',\n\t'Walko',\n\t'Kilkenny',\n\t'Charter',\n\t'Gauntt',\n\t'Bronk',\n\t'Legare',\n\t'Hukill',\n\t'Kulikowski',\n\t'Kunde',\n\t'Michelsen',\n\t'Mottola',\n\t'Pasion',\n\t'Stimmel',\n\t'Deavila',\n\t'Lian',\n\t'Koga',\n\t'Kitchin',\n\t'Whitner',\n\t'Bucholz',\n\t'Kilbride',\n\t'Klumpp',\n\t'Osinski',\n\t'Petrich',\n\t'Saar',\n\t'Robards',\n\t'Flakes',\n\t'Accardo',\n\t'Gebauer',\n\t'Matyas',\n\t'Montesano',\n\t'Schiefer',\n\t'Zuehlke',\n\t'Swartout',\n\t'Gidley',\n\t'Burghardt',\n\t'Delcambre',\n\t'Jerman',\n\t'Laufenberg',\n\t'Paterno',\n\t'Piccione',\n\t'Wenning',\n\t'Wilhelmi',\n\t'Rathjen',\n\t'Bauch',\n\t'Hiott',\n\t'Bagnall',\n\t'Miskell',\n\t'Snellings',\n\t'Sally',\n\t'Bjornson',\n\t'Din',\n\t'Kroeker',\n\t'Mitra',\n\t'Saxena',\n\t'Hausler',\n\t'Scogin',\n\t'Jeronimo',\n\t'Holderfield',\n\t'Cruze',\n\t'Christina',\n\t'Beville',\n\t'Whitehorn',\n\t'Bembry',\n\t'Fludd',\n\t'Abboud',\n\t'Blomgren',\n\t'Friddle',\n\t'Jarvi',\n\t'Nastasi',\n\t'Tomich',\n\t'Peinado',\n\t'Rinaldo',\n\t'Proudfoot',\n\t'Down',\n\t'Lawry',\n\t'Noor',\n\t'Bachelor',\n\t'Mullenax',\n\t'Pocock',\n\t'Resler',\n\t'Sprunger',\n\t'Wiegel',\n\t'Wohlers',\n\t'Niedzwiecki',\n\t'Bourgoin',\n\t'Grist',\n\t'Nora',\n\t'Gude',\n\t'Mcgaughy',\n\t'Borror',\n\t'Bushee',\n\t'Crego',\n\t'Engberg',\n\t'Karle',\n\t'Raso',\n\t'Rayas',\n\t'Roehrig',\n\t'Villamil',\n\t'Croucher',\n\t'Candido',\n\t'Rockhill',\n\t'Dahn',\n\t'Philp',\n\t'Grasty',\n\t'Basnight',\n\t'Cacioppo',\n\t'Heavener',\n\t'Hoenig',\n\t'Janisch',\n\t'Labombard',\n\t'Sheng',\n\t'Wettstein',\n\t'Wymore',\n\t'Zuluaga',\n\t'Canova',\n\t'Maclennan',\n\t'Tuley',\n\t'Geddings',\n\t'Cayetano',\n\t'Bogar',\n\t'Malbrough',\n\t'Bradish',\n\t'Chiaramonte',\n\t'Eguia',\n\t'Loux',\n\t'Nemecek',\n\t'Ouimet',\n\t'Roxas',\n\t'Yoshioka',\n\t'Cossio',\n\t'Sleight',\n\t'Walla',\n\t'Younan',\n\t'Hee',\n\t'Bartlow',\n\t'Parchman',\n\t'Leaks',\n\t'Folz',\n\t'Knittel',\n\t'Lovvorn',\n\t'Melick',\n\t'Weingartner',\n\t'Eustace',\n\t'Robbs',\n\t'Jacquet',\n\t'Direnzo',\n\t'Domke',\n\t'Kestler',\n\t'Pavelka',\n\t'Pileggi',\n\t'Silvestro',\n\t'Leedom',\n\t'Kyte',\n\t'Espey',\n\t'Kincannon',\n\t'Robicheaux',\n\t'Lard',\n\t'Falkenstein',\n\t'Fino',\n\t'Kotz',\n\t'Lammert',\n\t'Markovic',\n\t'Mcwaters',\n\t'Shibata',\n\t'Garoutte',\n\t'Brum',\n\t'Hora',\n\t'Gundrum',\n\t'Leer',\n\t'Coller',\n\t'Delsignore',\n\t'Ebarb',\n\t'Heras',\n\t'Skolnick',\n\t'Sponseller',\n\t'Baltes',\n\t'Rabinovich',\n\t'Welden',\n\t'Papas',\n\t'Bingman',\n\t'Neto',\n\t'Burrough',\n\t'Ollie',\n\t'Deitrick',\n\t'Hermansen',\n\t'Datta',\n\t'Gebo',\n\t'Bulla',\n\t'Rippey',\n\t'Solon',\n\t'Draughon',\n\t'Sylvestre',\n\t'Outen',\n\t'Westfield',\n\t'Daoust',\n\t'Kuan',\n\t'Kubat',\n\t'Labuda',\n\t'Olejniczak',\n\t'Radomski',\n\t'Scheuermann',\n\t'Schunk',\n\t'Tuazon',\n\t'Wineland',\n\t'Gizzi',\n\t'Millay',\n\t'Hamp',\n\t'Murdaugh',\n\t'Hayles',\n\t'Plowden',\n\t'Lesure',\n\t'Artrip',\n\t'Kenneally',\n\t'Piehl',\n\t'Vandermeulen',\n\t'Camberos',\n\t'Hochberg',\n\t'Sinner',\n\t'Crass',\n\t'Gade',\n\t'Tedrick',\n\t'Nicholl',\n\t'Speece',\n\t'Chatterjee',\n\t'Gillihan',\n\t'Luzzi',\n\t'Obyrne',\n\t'Uchida',\n\t'Kidney',\n\t'Dorough',\n\t'Dangler',\n\t'Mcneel',\n\t'Ruley',\n\t'Mcloud',\n\t'Smarr',\n\t'Gayles',\n\t'Janiszewski',\n\t'Kubo',\n\t'Mckibbin',\n\t'Szatkowski',\n\t'Lehnert',\n\t'Mcilvain',\n\t'Mcclish',\n\t'Mcentyre',\n\t'Strawder',\n\t'Briere',\n\t'Headlee',\n\t'Leszczynski',\n\t'Mauser',\n\t'Rask',\n\t'Wisler',\n\t'Burba',\n\t'Shaulis',\n\t'Showman',\n\t'Proto',\n\t'Creasman',\n\t'Slye',\n\t'Dunwoody',\n\t'Ellingsworth',\n\t'Linebaugh',\n\t'Riva',\n\t'Um',\n\t'Muldowney',\n\t'Burlew',\n\t'Gettings',\n\t'Clingman',\n\t'Shield',\n\t'Trollinger',\n\t'Stiger',\n\t'Kellman',\n\t'Arviso',\n\t'Boettger',\n\t'Deak',\n\t'Deiter',\n\t'Hackenberg',\n\t'Langone',\n\t'Lichter',\n\t'Siano',\n\t'Wrinkle',\n\t'Dickert',\n\t'Boor',\n\t'Ludington',\n\t'Griffing',\n\t'Perin',\n\t'Woodby',\n\t'Quail',\n\t'Harriss',\n\t'Bilotta',\n\t'Chino',\n\t'Cocke',\n\t'Corbell',\n\t'Dearden',\n\t'Facundo',\n\t'Gaskell',\n\t'Grieser',\n\t'Houts',\n\t'Zuk',\n\t'Yamauchi',\n\t'Caouette',\n\t'Perham',\n\t'Hewson',\n\t'Keppel',\n\t'Artiaga',\n\t'Sa',\n\t'Ginger',\n\t'Goosby',\n\t'Bollig',\n\t'Grippo',\n\t'Hoffmeyer',\n\t'Klaas',\n\t'Rohlfing',\n\t'Stolp',\n\t'Vielma',\n\t'Gresh',\n\t'Mignone',\n\t'Parsell',\n\t'Sprout',\n\t'Hase',\n\t'Nadal',\n\t'Joye',\n\t'Butkus',\n\t'Donlan',\n\t'Fuhrer',\n\t'Grobe',\n\t'Haverkamp',\n\t'Janecek',\n\t'Pancoast',\n\t'Rathke',\n\t'Scheibe',\n\t'Schneller',\n\t'Scally',\n\t'Valeriano',\n\t'Fail',\n\t'Everage',\n\t'Murff',\n\t'Demayo',\n\t'Dieterich',\n\t'Kramp',\n\t'Macchia',\n\t'Ruyle',\n\t'Zuidema',\n\t'Tischer',\n\t'Palo',\n\t'Bahn',\n\t'Hartson',\n\t'Rosborough',\n\t'Hartke',\n\t'Hixenbaugh',\n\t'Matlack',\n\t'Hoefler',\n\t'Hsia',\n\t'Cech',\n\t'Donham',\n\t'Szafranski',\n\t'Jennison',\n\t'Emmer',\n\t'Christians',\n\t'Swigert',\n\t'Mclawhorn',\n\t'Costas',\n\t'Culligan',\n\t'Eisenstein',\n\t'Joos',\n\t'Villacorta',\n\t'Majerus',\n\t'Lukowski',\n\t'Byford',\n\t'Canepa',\n\t'Jeppson',\n\t'Larison',\n\t'Waechter',\n\t'Bleich',\n\t'Trigo',\n\t'Lill',\n\t'Mcisaac',\n\t'Oflaherty',\n\t'Dedman',\n\t'Lynes',\n\t'Everidge',\n\t'Armfield',\n\t'Cadieux',\n\t'Dembowski',\n\t'Flewelling',\n\t'Guadagno',\n\t'Lamendola',\n\t'Meidinger',\n\t'Muzzy',\n\t'Pacelli',\n\t'Pangle',\n\t'Denzer',\n\t'Sharman',\n\t'Venzor',\n\t'Shadwick',\n\t'Saine',\n\t'Lighty',\n\t'Twine',\n\t'Buehner',\n\t'Caruana',\n\t'Filipiak',\n\t'Fiori',\n\t'Kellison',\n\t'Odonovan',\n\t'Ragone',\n\t'Enyeart',\n\t'Coale',\n\t'Coombes',\n\t'Yarrington',\n\t'Leno',\n\t'Coad',\n\t'Well',\n\t'Labranche',\n\t'Banaszak',\n\t'Jovanovic',\n\t'Junk',\n\t'Kratochvil',\n\t'Marchi',\n\t'Mcnitt',\n\t'Monnin',\n\t'Portales',\n\t'Nazzaro',\n\t'Laramie',\n\t'Kohlman',\n\t'Pinette',\n\t'Craw',\n\t'Aldred',\n\t'Jolicoeur',\n\t'Nevers',\n\t'Boseman',\n\t'Apostol',\n\t'Barbaro',\n\t'Dirienzo',\n\t'Kimrey',\n\t'Knaack',\n\t'Marenco',\n\t'Meixner',\n\t'Placek',\n\t'Prigge',\n\t'Sablan',\n\t'Stoecker',\n\t'Ulrey',\n\t'Madonia',\n\t'Mariotti',\n\t'Hypes',\n\t'Teti',\n\t'Pothier',\n\t'Duer',\n\t'Reay',\n\t'Charlie',\n\t'Alix',\n\t'Cropp',\n\t'Wellons',\n\t'Haugland',\n\t'Malkowski',\n\t'Powley',\n\t'Query',\n\t'Stolle',\n\t'Twedt',\n\t'Grech',\n\t'Musson',\n\t'Larrimore',\n\t'Esper',\n\t'Suleiman',\n\t'Gillie',\n\t'Aaronson',\n\t'Brueggeman',\n\t'Kupfer',\n\t'Orf',\n\t'Pozzi',\n\t'Rayos',\n\t'Scheiner',\n\t'Schmoll',\n\t'Sirota',\n\t'Trickey',\n\t'Ahuja',\n\t'Halm',\n\t'Jaycox',\n\t'Carithers',\n\t'Bjorkman',\n\t'Klar',\n\t'Lembke',\n\t'Nordyke',\n\t'Primeau',\n\t'Wachs',\n\t'Wissinger',\n\t'Doonan',\n\t'Mikulski',\n\t'Murthy',\n\t'Raju',\n\t'Thrailkill',\n\t'Splawn',\n\t'Lockamy',\n\t'Brassell',\n\t'Mcshan',\n\t'Hawbaker',\n\t'Kracht',\n\t'Lahman',\n\t'Lauritsen',\n\t'Metzner',\n\t'Presser',\n\t'Rapoport',\n\t'Romani',\n\t'Wolken',\n\t'Bertone',\n\t'Bhat',\n\t'Lenzi',\n\t'Lefort',\n\t'Makar',\n\t'Melnyk',\n\t'Siguenza',\n\t'Ristow',\n\t'Piller',\n\t'Mcgaugh',\n\t'Lampton',\n\t'Delva',\n\t'Gethers',\n\t'Leday',\n\t'Bateson',\n\t'Beckstrom',\n\t'Bedsole',\n\t'Hauber',\n\t'Hodgkinson',\n\t'Croghan',\n\t'Glanz',\n\t'Gaver',\n\t'Pinkley',\n\t'Traynham',\n\t'Heffley',\n\t'Indelicato',\n\t'Lindblad',\n\t'Petrik',\n\t'Ptacek',\n\t'Capen',\n\t'Carrara',\n\t'Ortuno',\n\t'Lobue',\n\t'Corella',\n\t'Lybrand',\n\t'Myler',\n\t'Steer',\n\t'Mckamey',\n\t'Coman',\n\t'Auker',\n\t'Escue',\n\t'Knell',\n\t'Mahood',\n\t'Tillinghast',\n\t'Deremer',\n\t'Janak',\n\t'Naegele',\n\t'Patnaude',\n\t'Leahey',\n\t'Pupo',\n\t'Bouse',\n\t'Bradstreet',\n\t'Symes',\n\t'Callies',\n\t'Duncanson',\n\t'Blanche',\n\t'Span',\n\t'Shakir',\n\t'Finneran',\n\t'Lenker',\n\t'Mendola',\n\t'Navin',\n\t'Palka',\n\t'Spanier',\n\t'Stahler',\n\t'Vannatter',\n\t'Botta',\n\t'Gonser',\n\t'Edelson',\n\t'Brashier',\n\t'Golla',\n\t'Parramore',\n\t'Bigby',\n\t'El',\n\t'Habeck',\n\t'Kleinhans',\n\t'Knobel',\n\t'Pekar',\n\t'Remmers',\n\t'Dea',\n\t'Foo',\n\t'Plumer',\n\t'Combest',\n\t'Godbee',\n\t'Hilaire',\n\t'Lepak',\n\t'Sgro',\n\t'Vierling',\n\t'Harm',\n\t'Holtsclaw',\n\t'Gaetano',\n\t'Kindler',\n\t'Sabbagh',\n\t'Politte',\n\t'Amor',\n\t'Tilly',\n\t'Trone',\n\t'Callaham',\n\t'Roussell',\n\t'Asplund',\n\t'Cacciatore',\n\t'Dries',\n\t'Friedl',\n\t'Hartranft',\n\t'Kimmell',\n\t'Lengacher',\n\t'Scardino',\n\t'Werley',\n\t'Zappa',\n\t'Hust',\n\t'Seiden',\n\t'Bultman',\n\t'Withey',\n\t'Brandow',\n\t'Oler',\n\t'Ladouceur',\n\t'Celli',\n\t'Condie',\n\t'Egge',\n\t'Kleman',\n\t'Krafft',\n\t'Margulies',\n\t'Weier',\n\t'Mikels',\n\t'Pavel',\n\t'Sigel',\n\t'Foulke',\n\t'Kluttz',\n\t'Mcgown',\n\t'Acero',\n\t'Gering',\n\t'Knauff',\n\t'Ruesch',\n\t'Rydberg',\n\t'Shonk',\n\t'Weisgerber',\n\t'Wieber',\n\t'Zinser',\n\t'Lilienthal',\n\t'Crosbie',\n\t'Luckie',\n\t'Chenier',\n\t'Aceto',\n\t'Atnip',\n\t'Hisey',\n\t'Imhof',\n\t'Klocke',\n\t'Renderos',\n\t'Schaad',\n\t'Shoults',\n\t'Slevin',\n\t'Tenenbaum',\n\t'Vrana',\n\t'Dicesare',\n\t'Colarusso',\n\t'Killgore',\n\t'Courtois',\n\t'Tysinger',\n\t'Agard',\n\t'Brutus',\n\t'Woodfork',\n\t'Boeckman',\n\t'Breitenstein',\n\t'Downen',\n\t'Franzese',\n\t'Garbe',\n\t'Iannucci',\n\t'Kist',\n\t'Mccolgan',\n\t'Seib',\n\t'Sereno',\n\t'Varma',\n\t'Fought',\n\t'Barcomb',\n\t'Happ',\n\t'Yeaton',\n\t'Sharples',\n\t'Huson',\n\t'Askin',\n\t'Elliston',\n\t'Birks',\n\t'Allums',\n\t'Richarson',\n\t'Arterburn',\n\t'Auyeung',\n\t'Engman',\n\t'Segall',\n\t'Sjoberg',\n\t'Sturman',\n\t'Buys',\n\t'Basford',\n\t'Gaut',\n\t'Hollomon',\n\t'Antal',\n\t'Groseclose',\n\t'Motyka',\n\t'Reddell',\n\t'Ansel',\n\t'Fausett',\n\t'Girgis',\n\t'Brownson',\n\t'Pouncy',\n\t'Behler',\n\t'Ciesla',\n\t'Dewall',\n\t'Helmers',\n\t'Pizzuto',\n\t'Sao',\n\t'Hourigan',\n\t'Novelli',\n\t'Kuta',\n\t'Gau',\n\t'Verville',\n\t'Parkison',\n\t'Souter',\n\t'Whitelaw',\n\t'Vercher',\n\t'Coger',\n\t'Issac',\n\t'Cardamone',\n\t'Heneghan',\n\t'Herrero',\n\t'Plancarte',\n\t'Reach',\n\t'Sarinana',\n\t'Zweig',\n\t'Berkheimer',\n\t'Brosseau',\n\t'Angstadt',\n\t'Popoca',\n\t'Brode',\n\t'Presswood',\n\t'Hannibal',\n\t'Pigford',\n\t'Argento',\n\t'Dieringer',\n\t'Kinnett',\n\t'Maclachlan',\n\t'Perko',\n\t'Rosenkranz',\n\t'Kobus',\n\t'Merk',\n\t'Prevatte',\n\t'Kaya',\n\t'Didio',\n\t'Thong',\n\t'Cowin',\n\t'Tumlin',\n\t'Lopp',\n\t'Callier',\n\t'Sesay',\n\t'Beerman',\n\t'Creger',\n\t'Eyster',\n\t'Libbey',\n\t'Minear',\n\t'Pontious',\n\t'Stemen',\n\t'Strahl',\n\t'Trillo',\n\t'Dively',\n\t'Lackner',\n\t'Welte',\n\t'Likes',\n\t'Mazzoni',\n\t'Resh',\n\t'Oser',\n\t'Dilday',\n\t'Requena',\n\t'Bail',\n\t'Ellen',\n\t'Buchanon',\n\t'Almeda',\n\t'Dimino',\n\t'Griess',\n\t'Wetzler',\n\t'Kriegel',\n\t'Attanasio',\n\t'Reighard',\n\t'Alling',\n\t'Wiginton',\n\t'Penfield',\n\t'Barbe',\n\t'Alred',\n\t'Ridout',\n\t'Lucien',\n\t'Cerullo',\n\t'Esterline',\n\t'Garriott',\n\t'Hendershott',\n\t'Kaczmarczyk',\n\t'Pazos',\n\t'Racicot',\n\t'Kowaleski',\n\t'Lippold',\n\t'Bankert',\n\t'Emigh',\n\t'Cupps',\n\t'Jagger',\n\t'Leavens',\n\t'Lies',\n\t'Ater',\n\t'Bleau',\n\t'Pellot',\n\t'Crosslin',\n\t'Faulks',\n\t'Antwine',\n\t'Calixte',\n\t'Brod',\n\t'Hamad',\n\t'Junkin',\n\t'Koeppel',\n\t'Leifer',\n\t'Vannest',\n\t'Olcott',\n\t'Delange',\n\t'Hillen',\n\t'Merlin',\n\t'Gundy',\n\t'Hogans',\n\t'Arseneau',\n\t'Buzard',\n\t'Ewalt',\n\t'Persing',\n\t'Pursel',\n\t'Rohrs',\n\t'Sisemore',\n\t'Vilchez',\n\t'Bernath',\n\t'Rosenbalm',\n\t'Woolverton',\n\t'Gibbins',\n\t'Like',\n\t'Larsson',\n\t'Savidge',\n\t'Strohmeyer',\n\t'Trentham',\n\t'Wotring',\n\t'Boster',\n\t'Sewall',\n\t'Glore',\n\t'Burtis',\n\t'Marchman',\n\t'Fouche',\n\t'Okafor',\n\t'Khatri',\n\t'Lengel',\n\t'Pribyl',\n\t'Rodewald',\n\t'Cafaro',\n\t'Mattix',\n\t'Shingler',\n\t'Seawell',\n\t'Square',\n\t'Belnap',\n\t'Heidemann',\n\t'Kretz',\n\t'Nebeker',\n\t'Zemke',\n\t'Reiners',\n\t'Cassels',\n\t'Hout',\n\t'Favor',\n\t'Rattray',\n\t'Custard',\n\t'Bellucci',\n\t'Bucklew',\n\t'Casavant',\n\t'Davanzo',\n\t'Kleber',\n\t'Koeppen',\n\t'Kulpa',\n\t'Ledonne',\n\t'Scarano',\n\t'Schaar',\n\t'Staiger',\n\t'Trigueros',\n\t'Trobaugh',\n\t'Tufano',\n\t'Tschetter',\n\t'Labra',\n\t'Beverage',\n\t'Hulet',\n\t'Stairs',\n\t'Waggener',\n\t'Candy',\n\t'Kaba',\n\t'Feiner',\n\t'Ipock',\n\t'Nelligan',\n\t'Pottorff',\n\t'Beno',\n\t'Beausoleil',\n\t'Mayen',\n\t'Kalil',\n\t'Deller',\n\t'Cormack',\n\t'Hayne',\n\t'Below',\n\t'Bundick',\n\t'Avakian',\n\t'Desmet',\n\t'Dobler',\n\t'Dykeman',\n\t'Eckstrom',\n\t'Mahle',\n\t'Meers',\n\t'Bortner',\n\t'Kroon',\n\t'Lindenmuth',\n\t'Mcnichol',\n\t'Sechrest',\n\t'Abdulla',\n\t'Gaudin',\n\t'Lamers',\n\t'Luffman',\n\t'Marchione',\n\t'Paredez',\n\t'Polster',\n\t'Maresh',\n\t'Kristoff',\n\t'Rickel',\n\t'Frary',\n\t'Lorance',\n\t'Round',\n\t'Toye',\n\t'Claybrook',\n\t'Senegal',\n\t'Gayhart',\n\t'Mcmackin',\n\t'Sagan',\n\t'Sarkar',\n\t'Whistler',\n\t'Stutsman',\n\t'Alderfer',\n\t'Spainhour',\n\t'Karol',\n\t'Ke',\n\t'Mifflin',\n\t'Salah',\n\t'Alberty',\n\t'Hynson',\n\t'Beisel',\n\t'Castelo',\n\t'Dau',\n\t'Diliberto',\n\t'Dollins',\n\t'Fiorini',\n\t'Fritzler',\n\t'Hanan',\n\t'Hauschild',\n\t'Overholser',\n\t'Wrobleski',\n\t'Peil',\n\t'Bellon',\n\t'Buice',\n\t'Rolls',\n\t'Shack',\n\t'Arakelian',\n\t'Carpino',\n\t'Liou',\n\t'Lydick',\n\t'Supple',\n\t'Tammaro',\n\t'Walbridge',\n\t'Jandreau',\n\t'Riter',\n\t'Roeser',\n\t'Merson',\n\t'Bole',\n\t'Franey',\n\t'Berrett',\n\t'Carton',\n\t'Mcnish',\n\t'Earnhart',\n\t'Lehrman',\n\t'Lipski',\n\t'Mandelbaum',\n\t'Tanabe',\n\t'Mirabile',\n\t'Ocegueda',\n\t'Clementi',\n\t'Shake',\n\t'Buckle',\n\t'Rowsey',\n\t'Eifert',\n\t'Giesen',\n\t'Standiford',\n\t'Vallecillo',\n\t'Walworth',\n\t'Berkshire',\n\t'Feit',\n\t'Lande',\n\t'Fiddler',\n\t'Deputy',\n\t'Feemster',\n\t'Evelyn',\n\t'Bocchino',\n\t'Cozza',\n\t'Dirocco',\n\t'Kock',\n\t'Luisi',\n\t'Marcantonio',\n\t'Presti',\n\t'Rahimi',\n\t'Ridinger',\n\t'Sergi',\n\t'Viana',\n\t'Kabat',\n\t'Suriel',\n\t'Mester',\n\t'Bozman',\n\t'Huffines',\n\t'Linck',\n\t'Lodato',\n\t'Ownbey',\n\t'Pietz',\n\t'Rudnicki',\n\t'Schoener',\n\t'Schrag',\n\t'Spicher',\n\t'Sze',\n\t'Villella',\n\t'Steinle',\n\t'Seaberg',\n\t'Derks',\n\t'Mavis',\n\t'Luellen',\n\t'Garlington',\n\t'Nimmons',\n\t'Brevard',\n\t'Seabrooks',\n\t'Ahlquist',\n\t'Golembiewski',\n\t'Kochis',\n\t'Popov',\n\t'Poulter',\n\t'Redington',\n\t'Wingrove',\n\t'Krepps',\n\t'Viars',\n\t'Gallatin',\n\t'Gilham',\n\t'Jimison',\n\t'Glosson',\n\t'Campeau',\n\t'Goodhart',\n\t'Koth',\n\t'Lettieri',\n\t'Siragusa',\n\t'Sojka',\n\t'Tichy',\n\t'Viar',\n\t'Carrozza',\n\t'Chaffins',\n\t'Eagleson',\n\t'Prestwood',\n\t'Deshazer',\n\t'Ike',\n\t'Kubacki',\n\t'Minogue',\n\t'Sunseri',\n\t'Turnbaugh',\n\t'Heminger',\n\t'Delira',\n\t'Jani',\n\t'Platte',\n\t'Waterson',\n\t'Keeble',\n\t'Kiper',\n\t'Crigler',\n\t'Swaby',\n\t'Brisbin',\n\t'Galiano',\n\t'Negley',\n\t'Regal',\n\t'Stottlemyer',\n\t'Volkmann',\n\t'Herrold',\n\t'Cypert',\n\t'Markman',\n\t'Laman',\n\t'Williard',\n\t'Terrio',\n\t'Raulston',\n\t'Harrow',\n\t'Humiston',\n\t'Kantner',\n\t'Mcmonagle',\n\t'Polasek',\n\t'Ruocco',\n\t'Schelling',\n\t'Seip',\n\t'Woller',\n\t'Despres',\n\t'Melius',\n\t'Keiffer',\n\t'Voges',\n\t'Figg',\n\t'Judice',\n\t'Henery',\n\t'Dejarnette',\n\t'Prosper',\n\t'Duenez',\n\t'Frenette',\n\t'Jaimez',\n\t'Krist',\n\t'Kuch',\n\t'Schlachter',\n\t'Traeger',\n\t'Mrozinski',\n\t'Colberg',\n\t'Lade',\n\t'Been',\n\t'Revere',\n\t'Greely',\n\t'Belizaire',\n\t'Amberg',\n\t'Cerniglia',\n\t'Lattanzio',\n\t'Leitz',\n\t'Ocker',\n\t'Ratto',\n\t'Thornburgh',\n\t'Yule',\n\t'Hibner',\n\t'Puerto',\n\t'Shoultz',\n\t'Baley',\n\t'Linley',\n\t'Alfrey',\n\t'Bazaldua',\n\t'Deniz',\n\t'Lohnes',\n\t'Marder',\n\t'Pelland',\n\t'Urick',\n\t'Loberg',\n\t'Rempel',\n\t'Faux',\n\t'Tomkins',\n\t'Gail',\n\t'Mccardell',\n\t'Reuben',\n\t'Brabant',\n\t'Hutzler',\n\t'Liedtke',\n\t'Nowack',\n\t'Pittsley',\n\t'Pelc',\n\t'Darragh',\n\t'Pae',\n\t'Blanke',\n\t'Brinks',\n\t'Delap',\n\t'Brea',\n\t'Milsap',\n\t'Borneman',\n\t'Crofts',\n\t'Nakai',\n\t'Silguero',\n\t'Speciale',\n\t'Martindelcampo',\n\t'Vandenburg',\n\t'Wimsatt',\n\t'Harbor',\n\t'Mccorvey',\n\t'Bensinger',\n\t'Carhart',\n\t'Condo',\n\t'Lemen',\n\t'Malchow',\n\t'Vandewater',\n\t'Ventresca',\n\t'Morena',\n\t'Mendell',\n\t'Faustino',\n\t'Kleiber',\n\t'Alberson',\n\t'Lamonte',\n\t'Kiner',\n\t'Belgrave',\n\t'Blitz',\n\t'Dildine',\n\t'Gosch',\n\t'Grabill',\n\t'Klemp',\n\t'Larrea',\n\t'Pallas',\n\t'Leonhard',\n\t'Littler',\n\t'Dilling',\n\t'Weatherbee',\n\t'Robnett',\n\t'Lacount',\n\t'Brackins',\n\t'Counterman',\n\t'Divincenzo',\n\t'Dobrowolski',\n\t'Eppard',\n\t'Estepp',\n\t'Gahan',\n\t'Steininger',\n\t'Tancredi',\n\t'Wixom',\n\t'Combes',\n\t'Dena',\n\t'Warn',\n\t'Teems',\n\t'Askey',\n\t'Delmar',\n\t'Ogles',\n\t'Herriott',\n\t'Aguinaldo',\n\t'In',\n\t'Kinter',\n\t'Moul',\n\t'Santaniello',\n\t'Tringali',\n\t'Vanasse',\n\t'Vanwagoner',\n\t'Whitesel',\n\t'Vanderwal',\n\t'Friedmann',\n\t'Kalis',\n\t'Cayer',\n\t'Para',\n\t'Wander',\n\t'Cothron',\n\t'Betters',\n\t'Cloward',\n\t'Cusano',\n\t'Encinias',\n\t'Imai',\n\t'Lalone',\n\t'Saks',\n\t'Nosal',\n\t'Crossan',\n\t'Caverly',\n\t'Tewell',\n\t'Lowney',\n\t'Merle',\n\t'Meighan',\n\t'Labat',\n\t'Pou',\n\t'Linsey',\n\t'Gaviria',\n\t'Manthei',\n\t'Marquina',\n\t'Siegert',\n\t'Blondin',\n\t'Maskell',\n\t'Kimpel',\n\t'Cappel',\n\t'Tootle',\n\t'Folkes',\n\t'Mainor',\n\t'Offord',\n\t'Clagg',\n\t'Minshew',\n\t'Niebuhr',\n\t'Schanz',\n\t'Stotz',\n\t'Takeda',\n\t'Huelsman',\n\t'Madril',\n\t'Monico',\n\t'Stradley',\n\t'Thein',\n\t'Cannell',\n\t'Malson',\n\t'Ludden',\n\t'Couts',\n\t'Mishoe',\n\t'Dales',\n\t'Slemp',\n\t'Stueve',\n\t'Ziemann',\n\t'Fluke',\n\t'Vitali',\n\t'Monn',\n\t'Dooling',\n\t'Lambe',\n\t'Cail',\n\t'Louder',\n\t'Lotts',\n\t'Augusta',\n\t'Ando',\n\t'Depaolo',\n\t'Egolf',\n\t'Hibdon',\n\t'Marzan',\n\t'Mccawley',\n\t'Mcgivern',\n\t'Minjares',\n\t'Mullally',\n\t'Portner',\n\t'Vinciguerra',\n\t'Wolpert',\n\t'Yingst',\n\t'Checo',\n\t'Starck',\n\t'Ra',\n\t'Credle',\n\t'Baldauf',\n\t'Bamberger',\n\t'Besch',\n\t'Caulkins',\n\t'Huyck',\n\t'Portela',\n\t'Walberg',\n\t'Kutcher',\n\t'Hunger',\n\t'Trant',\n\t'Cumbee',\n\t'Cheadle',\n\t'Drewery',\n\t'Andrada',\n\t'Dollinger',\n\t'Dondero',\n\t'Salvati',\n\t'Sefton',\n\t'Siemers',\n\t'Sitz',\n\t'Smale',\n\t'Wenk',\n\t'Reschke',\n\t'Puglia',\n\t'Koob',\n\t'Overland',\n\t'Furrer',\n\t'Gohl',\n\t'Hegge',\n\t'Hentschel',\n\t'Huberty',\n\t'Krise',\n\t'Stasiak',\n\t'Tripoli',\n\t'Palomera',\n\t'Norling',\n\t'Smucker',\n\t'Hennes',\n\t'Metro',\n\t'Himmel',\n\t'Paolino',\n\t'Prato',\n\t'Wommack',\n\t'Mcpheeters',\n\t'Ronald',\n\t'Eppinger',\n\t'Cantey',\n\t'Appell',\n\t'Capellan',\n\t'Fielden',\n\t'Garfias',\n\t'Heit',\n\t'Janusz',\n\t'Pagliaro',\n\t'Pitz',\n\t'Winegardner',\n\t'Gregorich',\n\t'Schlager',\n\t'Selvidge',\n\t'Shultis',\n\t'Severn',\n\t'Buffum',\n\t'Crafts',\n\t'Antony',\n\t'Timpson',\n\t'Deveaux',\n\t'Maese',\n\t'Merlos',\n\t'Mojarro',\n\t'Policastro',\n\t'Tawil',\n\t'Flamm',\n\t'Aasen',\n\t'Lipkin',\n\t'Dyches',\n\t'Caulk',\n\t'Rampersad',\n\t'Pettie',\n\t'Hagwood',\n\t'Jedlicka',\n\t'Paoli',\n\t'Perkey',\n\t'Shaub',\n\t'Vires',\n\t'Glad',\n\t'Mandrell',\n\t'Angeli',\n\t'Antuna',\n\t'Bessler',\n\t'Cebula',\n\t'Heagy',\n\t'Mankowski',\n\t'Sitler',\n\t'Vanleuven',\n\t'Blanck',\n\t'Dannenberg',\n\t'Moren',\n\t'Hites',\n\t'Leckie',\n\t'Tham',\n\t'Dower',\n\t'Beans',\n\t'Alls',\n\t'Sipp',\n\t'Dygert',\n\t'Kubicek',\n\t'Matsumura',\n\t'Shiroma',\n\t'Smiddy',\n\t'Szilagyi',\n\t'Winkleman',\n\t'Zentz',\n\t'Niehoff',\n\t'Boedeker',\n\t'Dimmitt',\n\t'Trew',\n\t'Wilner',\n\t'Traughber',\n\t'Bardales',\n\t'Borbon',\n\t'Bramhall',\n\t'Crofoot',\n\t'Desilets',\n\t'Disch',\n\t'Kehrer',\n\t'Leffingwell',\n\t'Olalde',\n\t'Wawrzyniak',\n\t'Jagodzinski',\n\t'Schwerin',\n\t'Heiney',\n\t'Hirano',\n\t'Rueter',\n\t'Sarris',\n\t'Magnan',\n\t'Rigsbee',\n\t'Blay',\n\t'Edgeworth',\n\t'Hafford',\n\t'Legrande',\n\t'Netter',\n\t'Dulac',\n\t'Etherington',\n\t'Gaede',\n\t'Matranga',\n\t'Misch',\n\t'Gryder',\n\t'Kolman',\n\t'Reyer',\n\t'Landsman',\n\t'Huppert',\n\t'Steagall',\n\t'Heims',\n\t'Baldini',\n\t'Breithaupt',\n\t'Claypoole',\n\t'Feuer',\n\t'Heishman',\n\t'Pallotta',\n\t'Sponaugle',\n\t'Pershing',\n\t'Spaid',\n\t'Salt',\n\t'Giger',\n\t'Whetsel',\n\t'Balaban',\n\t'Baus',\n\t'Croke',\n\t'Heimer',\n\t'Milnes',\n\t'Onstott',\n\t'Wagman',\n\t'Magro',\n\t'Havlik',\n\t'Menge',\n\t'Talmage',\n\t'Aungst',\n\t'Dichiara',\n\t'Kuhr',\n\t'Milstein',\n\t'Sinatra',\n\t'Speiser',\n\t'Vise',\n\t'Panther',\n\t'Phair',\n\t'Commons',\n\t'Mincy',\n\t'Ashline',\n\t'Eagen',\n\t'Enns',\n\t'Epler',\n\t'Giltner',\n\t'Rexroat',\n\t'Schein',\n\t'Wellner',\n\t'Wickert',\n\t'Ardito',\n\t'Ihrig',\n\t'Schuerman',\n\t'Wentland',\n\t'Wohlford',\n\t'Stoy',\n\t'Kohan',\n\t'Ratley',\n\t'Hazell',\n\t'Coppin',\n\t'Blackshire',\n\t'Coolbaugh',\n\t'Essman',\n\t'Gandee',\n\t'Moccia',\n\t'Mullarkey',\n\t'Sugrue',\n\t'Woomer',\n\t'Arriaza',\n\t'Pipitone',\n\t'Heart',\n\t'Prothro',\n\t'Connaughton',\n\t'Covelli',\n\t'Lunger',\n\t'Mcilroy',\n\t'Morataya',\n\t'Swedberg',\n\t'Trembley',\n\t'Wiederhold',\n\t'Zappia',\n\t'Perret',\n\t'Glander',\n\t'Snedden',\n\t'Stonestreet',\n\t'Archey',\n\t'Arbour',\n\t'Cordaro',\n\t'Diskin',\n\t'Dumlao',\n\t'Fravel',\n\t'Spagnuolo',\n\t'Derossett',\n\t'Grigorian',\n\t'Mercadante',\n\t'Harcourt',\n\t'Norgaard',\n\t'Terhaar',\n\t'Touch',\n\t'Mccubbins',\n\t'Tadros',\n\t'Zabriskie',\n\t'Fontanilla',\n\t'Ruse',\n\t'Springsteen',\n\t'Getter',\n\t'Berrian',\n\t'Louissaint',\n\t'Cobbins',\n\t'Dorney',\n\t'Kugel',\n\t'Luth',\n\t'Poffenberger',\n\t'Sidoti',\n\t'Steinfeld',\n\t'Poley',\n\t'Dreger',\n\t'Ertl',\n\t'Capper',\n\t'Laswell',\n\t'Spragg',\n\t'Coltrane',\n\t'Winborne',\n\t'Langhorne',\n\t'Fambro',\n\t'Berkebile',\n\t'Bosserman',\n\t'Cygan',\n\t'Debonis',\n\t'Munsch',\n\t'Pflug',\n\t'Skowron',\n\t'Ediger',\n\t'Bosler',\n\t'Morden',\n\t'Virtue',\n\t'Orso',\n\t'Claire',\n\t'Damas',\n\t'Eichenlaub',\n\t'Gatchell',\n\t'Mikus',\n\t'Tjaden',\n\t'Tremper',\n\t'Tusing',\n\t'Longest',\n\t'Baires',\n\t'Dobos',\n\t'Deforge',\n\t'Kawa',\n\t'Hodder',\n\t'Thornell',\n\t'Mcgarrity',\n\t'Gotcher',\n\t'Judah',\n\t'Busey',\n\t'Perrier',\n\t'Hawthorn',\n\t'Captain',\n\t'Costlow',\n\t'Frohlich',\n\t'Gulla',\n\t'Hildebrant',\n\t'Hilgendorf',\n\t'Ramachandran',\n\t'Reaume',\n\t'Vollrath',\n\t'Lambertson',\n\t'Wyer',\n\t'Coit',\n\t'Dietsch',\n\t'Struve',\n\t'Vicario',\n\t'Ahlberg',\n\t'Warshaw',\n\t'Ryon',\n\t'Evatt',\n\t'Mobbs',\n\t'Gartin',\n\t'Kenley',\n\t'Marcell',\n\t'Bumpers',\n\t'Jans',\n\t'Karczewski',\n\t'Mazurkiewicz',\n\t'Nadolny',\n\t'Verrill',\n\t'Sitter',\n\t'Freyer',\n\t'Hindle',\n\t'Hergert',\n\t'Inda',\n\t'Magwood',\n\t'Basa',\n\t'Covello',\n\t'Pacini',\n\t'Ruoff',\n\t'Schenker',\n\t'Zwicker',\n\t'Popovic',\n\t'Augustyn',\n\t'Sutera',\n\t'Almy',\n\t'Keisler',\n\t'Vowels',\n\t'Lemond',\n\t'Abila',\n\t'Beardslee',\n\t'Benvenuto',\n\t'Deschaine',\n\t'Hodel',\n\t'Turbyfill',\n\t'Vejar',\n\t'Iddings',\n\t'Labrada',\n\t'Bowne',\n\t'Seel',\n\t'Stretch',\n\t'Haswell',\n\t'Rickerson',\n\t'Speas',\n\t'Southward',\n\t'Tony',\n\t'Burrier',\n\t'Casco',\n\t'Lorch',\n\t'Pietrowski',\n\t'Rabbitt',\n\t'Sefcik',\n\t'Trenary',\n\t'Trisler',\n\t'Zarazua',\n\t'Kube',\n\t'Riera',\n\t'Stmarie',\n\t'Starns',\n\t'Carmel',\n\t'Shire',\n\t'Britto',\n\t'Lacks',\n\t'Cifelli',\n\t'Dusenberry',\n\t'Lusher',\n\t'Mattioli',\n\t'Quiring',\n\t'Regner',\n\t'Shetty',\n\t'Stober',\n\t'Winemiller',\n\t'Zinke',\n\t'Heffington',\n\t'Santelli',\n\t'Figeroa',\n\t'Dishon',\n\t'Doble',\n\t'Canino',\n\t'Tahir',\n\t'Stamant',\n\t'Sharpton',\n\t'Sancho',\n\t'Linzy',\n\t'Ba',\n\t'Bonebrake',\n\t'Frenkel',\n\t'Irion',\n\t'Marines',\n\t'Lacava',\n\t'Drennon',\n\t'Fallen',\n\t'Whiten',\n\t'Bielawski',\n\t'Brasch',\n\t'Eichorn',\n\t'Gattuso',\n\t'Neis',\n\t'Tkach',\n\t'Usrey',\n\t'Walkowiak',\n\t'Dorame',\n\t'Orem',\n\t'Crombie',\n\t'Lowes',\n\t'Truscott',\n\t'Marlette',\n\t'Bushell',\n\t'Gosa',\n\t'Hillary',\n\t'Byfield',\n\t'Engdahl',\n\t'Ganser',\n\t'Hollars',\n\t'Lambros',\n\t'Matzen',\n\t'Moldovan',\n\t'Najarian',\n\t'Schoff',\n\t'Soo',\n\t'Spargo',\n\t'Wierenga',\n\t'Maysonet',\n\t'Dewan',\n\t'Bardo',\n\t'Figgs',\n\t'Bostian',\n\t'Graser',\n\t'Pecor',\n\t'Rodrigo',\n\t'Spilker',\n\t'Suen',\n\t'Nafziger',\n\t'Khouri',\n\t'Milling',\n\t'Benke',\n\t'Chapdelaine',\n\t'Darwish',\n\t'Merrigan',\n\t'Narayanan',\n\t'Neuner',\n\t'Wallman',\n\t'Caracciolo',\n\t'Uren',\n\t'Borge',\n\t'Garside',\n\t'Veasley',\n\t'Arquette',\n\t'Gastineau',\n\t'Helbling',\n\t'Maggiore',\n\t'Prell',\n\t'Vangelder',\n\t'Giaquinto',\n\t'Macha',\n\t'Jonsson',\n\t'Febus',\n\t'Lady',\n\t'Hughson',\n\t'Wickliffe',\n\t'Archila',\n\t'Bearce',\n\t'Harstad',\n\t'Krein',\n\t'Kulesza',\n\t'Levitan',\n\t'Nakasone',\n\t'Saraceno',\n\t'Stankus',\n\t'Shelden',\n\t'Hopping',\n\t'Diab',\n\t'Agar',\n\t'Mcpike',\n\t'Betterton',\n\t'Buzbee',\n\t'Dieguez',\n\t'Lins',\n\t'Phuong',\n\t'Pinegar',\n\t'Postel',\n\t'Beatrice',\n\t'Biddy',\n\t'Over',\n\t'Riding',\n\t'Rials',\n\t'Rance',\n\t'Simington',\n\t'Degraffenreid',\n\t'Sherard',\n\t'Clum',\n\t'Harkin',\n\t'Mallen',\n\t'Messerschmidt',\n\t'Patz',\n\t'Shatzer',\n\t'Stetz',\n\t'Beckert',\n\t'Worm',\n\t'Belmontes',\n\t'Narron',\n\t'Lyne',\n\t'Mckendrick',\n\t'Rester',\n\t'Archbold',\n\t'Whorley',\n\t'Monts',\n\t'Crapo',\n\t'Gribbin',\n\t'Lamborn',\n\t'Leverenz',\n\t'Mccarville',\n\t'Nishida',\n\t'Ryberg',\n\t'Smeal',\n\t'Piontek',\n\t'Routhier',\n\t'Willmon',\n\t'Proffit',\n\t'Sharrock',\n\t'Gasque',\n\t'Minott',\n\t'Corpening',\n\t'Capizzi',\n\t'Dubuc',\n\t'Gurevich',\n\t'Hohenstein',\n\t'Kotch',\n\t'Peper',\n\t'Rehbein',\n\t'Stortz',\n\t'Corvin',\n\t'Savant',\n\t'Ryle',\n\t'Madere',\n\t'Firmin',\n\t'Bitterman',\n\t'Bruso',\n\t'Guzzi',\n\t'Hefty',\n\t'Almada',\n\t'Mcninch',\n\t'Mangin',\n\t'On',\n\t'Hardage',\n\t'Garson',\n\t'Hisle',\n\t'Dease',\n\t'Critelli',\n\t'Digennaro',\n\t'Ehle',\n\t'Freestone',\n\t'Grieb',\n\t'Haubert',\n\t'Kelsay',\n\t'Loughman',\n\t'Neth',\n\t'Pen',\n\t'Ranta',\n\t'Sater',\n\t'Tomei',\n\t'Castiglia',\n\t'Kosek',\n\t'Zentner',\n\t'Nowland',\n\t'Klinedinst',\n\t'Karls',\n\t'Charon',\n\t'Cart',\n\t'Umphrey',\n\t'Laramore',\n\t'Mckenny',\n\t'Hamler',\n\t'Stoudemire',\n\t'Diercks',\n\t'Hodzic',\n\t'Huntzinger',\n\t'Runde',\n\t'Scavone',\n\t'Halbach',\n\t'Banales',\n\t'Thiry',\n\t'Waterfield',\n\t'Bebee',\n\t'Dass',\n\t'Caughman',\n\t'Admire',\n\t'Attebery',\n\t'Faubion',\n\t'Friess',\n\t'Goldsworthy',\n\t'Raburn',\n\t'Vantine',\n\t'Newswanger',\n\t'Manhart',\n\t'Grecco',\n\t'Meany',\n\t'Rumpf',\n\t'Dunlevy',\n\t'Franceschi',\n\t'Romanski',\n\t'Alwine',\n\t'Cahall',\n\t'Czaja',\n\t'Krawiec',\n\t'Mikolajczyk',\n\t'Neyman',\n\t'Perrotti',\n\t'Weideman',\n\t'Coppa',\n\t'Ingerson',\n\t'Avena',\n\t'Crunk',\n\t'Cadenhead',\n\t'Gittings',\n\t'Gloss',\n\t'Trowell',\n\t'Denard',\n\t'Funchess',\n\t'Kinnamon',\n\t'Mailhot',\n\t'Mollohan',\n\t'Polacek',\n\t'Pozos',\n\t'Rempe',\n\t'Schutter',\n\t'Shimkus',\n\t'Bedrosian',\n\t'Beede',\n\t'Conry',\n\t'Legan',\n\t'Pickford',\n\t'Chamblin',\n\t'Depinto',\n\t'Geibel',\n\t'Gilpatrick',\n\t'Hashmi',\n\t'Hermsen',\n\t'Petruzzi',\n\t'Robben',\n\t'Sorkin',\n\t'Gambardella',\n\t'Podgorski',\n\t'Langenfeld',\n\t'Yanke',\n\t'Zipperer',\n\t'Tillson',\n\t'Ariola',\n\t'Kelman',\n\t'Hert',\n\t'Fearn',\n\t'Goods',\n\t'Cervenka',\n\t'Kreft',\n\t'Kreidler',\n\t'Kuhar',\n\t'Leffew',\n\t'Maziarz',\n\t'Vollmar',\n\t'Zmuda',\n\t'Eisenhower',\n\t'Yelle',\n\t'Bhagat',\n\t'Kirst',\n\t'Gilkerson',\n\t'Kindel',\n\t'Argyle',\n\t'Bedingfield',\n\t'Manney',\n\t'Guion',\n\t'Rencher',\n\t'Plater',\n\t'Beitzel',\n\t'Camero',\n\t'Delaluz',\n\t'Fennelly',\n\t'Keenum',\n\t'Kingrey',\n\t'Mckillop',\n\t'Munyon',\n\t'Rorick',\n\t'Schrimsher',\n\t'Sohl',\n\t'Torbett',\n\t'Lynde',\n\t'Reiland',\n\t'Shepley',\n\t'Cudney',\n\t'Cather',\n\t'Abed',\n\t'Holen',\n\t'Jobson',\n\t'Husbands',\n\t'Marc',\n\t'Blatz',\n\t'Feucht',\n\t'Gunkel',\n\t'Margolin',\n\t'Messerly',\n\t'Womer',\n\t'Teston',\n\t'Ditch',\n\t'Marta',\n\t'Osier',\n\t'Awan',\n\t'Marcella',\n\t'Silvester',\n\t'Baugus',\n\t'Wilcoxon',\n\t'Nowling',\n\t'Torain',\n\t'Badalamenti',\n\t'Bartosh',\n\t'Czajka',\n\t'Savedra',\n\t'Shaker',\n\t'Shambaugh',\n\t'Stapley',\n\t'Goeke',\n\t'Schepers',\n\t'Tyo',\n\t'Rhodus',\n\t'Arencibia',\n\t'Kara',\n\t'Aitchison',\n\t'Parlin',\n\t'Benny',\n\t'Shakespeare',\n\t'Altomare',\n\t'Axe',\n\t'Bednarczyk',\n\t'Feasel',\n\t'Heikkinen',\n\t'Heyl',\n\t'Konecny',\n\t'Montalbo',\n\t'Semones',\n\t'Zuercher',\n\t'Dorrance',\n\t'Gehrig',\n\t'Kretzer',\n\t'Puchalski',\n\t'Asche',\n\t'Astacio',\n\t'Steers',\n\t'Jeanes',\n\t'Bamberg',\n\t'Matthis',\n\t'Maultsby',\n\t'Bunkley',\n\t'Afonso',\n\t'Danielsen',\n\t'Freier',\n\t'Graeff',\n\t'Gutknecht',\n\t'Jansky',\n\t'Lindenberg',\n\t'Macphee',\n\t'Pequeno',\n\t'Petrocelli',\n\t'Petrowski',\n\t'Prete',\n\t'Igoe',\n\t'Demonte',\n\t'Khatib',\n\t'Agin',\n\t'Siddall',\n\t'Mcdill',\n\t'Higginbottom',\n\t'Gallow',\n\t'Inniss',\n\t'Ballman',\n\t'Bieniek',\n\t'Casino',\n\t'Garringer',\n\t'Griese',\n\t'Heritage',\n\t'Zeitz',\n\t'Montanaro',\n\t'Qi',\n\t'Belcastro',\n\t'Brautigam',\n\t'Wakeland',\n\t'Keasler',\n\t'Oglesbee',\n\t'Saye',\n\t'Steppe',\n\t'Cichocki',\n\t'Melgarejo',\n\t'Primavera',\n\t'Rippe',\n\t'Sieger',\n\t'Stutes',\n\t'Tustin',\n\t'Vanloon',\n\t'Konkol',\n\t'Altmann',\n\t'Anderegg',\n\t'Bun',\n\t'Mcduffee',\n\t'Deo',\n\t'Persad',\n\t'Kindell',\n\t'Antillon',\n\t'Ast',\n\t'Kumm',\n\t'Lauricella',\n\t'Minkler',\n\t'Pilch',\n\t'Porreca',\n\t'Shoopman',\n\t'Skeels',\n\t'Chanthavong',\n\t'Hounshell',\n\t'Pitner',\n\t'Space',\n\t'Blackley',\n\t'Groomes',\n\t'Bleeker',\n\t'Duddy',\n\t'Inlow',\n\t'Knabe',\n\t'Lehmkuhl',\n\t'Salais',\n\t'Statz',\n\t'Sundin',\n\t'Woolston',\n\t'Hojnacki',\n\t'Drolet',\n\t'Gallivan',\n\t'Viner',\n\t'Hafley',\n\t'Hollan',\n\t'Phillis',\n\t'Montrose',\n\t'Colclough',\n\t'Coaxum',\n\t'Basel',\n\t'Campoverde',\n\t'Cirelli',\n\t'Delmonico',\n\t'Goh',\n\t'Goyal',\n\t'Hungate',\n\t'Lufkin',\n\t'Passaro',\n\t'Penta',\n\t'Quispe',\n\t'Ovalles',\n\t'Bulkley',\n\t'Show',\n\t'Purington',\n\t'Sockwell',\n\t'Mccluney',\n\t'Asato',\n\t'Buchta',\n\t'Cassara',\n\t'Cesena',\n\t'Empey',\n\t'Fass',\n\t'Gazda',\n\t'Giannetti',\n\t'Giuffre',\n\t'Jahns',\n\t'Jong',\n\t'Ruh',\n\t'Schmieder',\n\t'Sheerin',\n\t'Weinheimer',\n\t'Iwamoto',\n\t'Ouyang',\n\t'Uranga',\n\t'Ranalli',\n\t'Woolum',\n\t'Calabria',\n\t'Arrowsmith',\n\t'Cashen',\n\t'Vogan',\n\t'Giffen',\n\t'Sherk',\n\t'Denner',\n\t'Lanclos',\n\t'Whittlesey',\n\t'Dora',\n\t'Plain',\n\t'Bransford',\n\t'Bradwell',\n\t'Davitt',\n\t'Dehoff',\n\t'Lotito',\n\t'Roell',\n\t'Satterly',\n\t'Stahr',\n\t'Thiem',\n\t'Helberg',\n\t'Vause',\n\t'Willmore',\n\t'Seid',\n\t'Linebarger',\n\t'Geddis',\n\t'Bringhurst',\n\t'Damelio',\n\t'Fetterolf',\n\t'Galban',\n\t'Henkle',\n\t'Kamen',\n\t'Kaneko',\n\t'Kissane',\n\t'Rua',\n\t'Tehrani',\n\t'Tingey',\n\t'Lizardi',\n\t'Strick',\n\t'Halper',\n\t'Striker',\n\t'Amason',\n\t'Lesueur',\n\t'Tatem',\n\t'Bulluck',\n\t'Hobdy',\n\t'Flythe',\n\t'Brookover',\n\t'Fishbein',\n\t'Hartless',\n\t'Snelgrove',\n\t'Weikert',\n\t'Wissman',\n\t'Bourbeau',\n\t'Colclasure',\n\t'Sampley',\n\t'Shubin',\n\t'Rhoda',\n\t'Mcclane',\n\t'Meals',\n\t'Peets',\n\t'Anding',\n\t'Clewis',\n\t'Gaymon',\n\t'Bierly',\n\t'Brockmeyer',\n\t'Burnworth',\n\t'Dierking',\n\t'Patzer',\n\t'Seipel',\n\t'Shieh',\n\t'Pazmino',\n\t'Bailie',\n\t'Ducey',\n\t'Sessler',\n\t'Hornaday',\n\t'Andry',\n\t'Mowatt',\n\t'Charlot',\n\t'Buchholtz',\n\t'Gaulke',\n\t'Gondek',\n\t'Grossmann',\n\t'Hammerschmidt',\n\t'Heinle',\n\t'Huckabay',\n\t'Neathery',\n\t'Vanzile',\n\t'Vossler',\n\t'Schillaci',\n\t'Lem',\n\t'Paff',\n\t'Oja',\n\t'Broker',\n\t'Marlett',\n\t'Innocent',\n\t'Adsit',\n\t'Begg',\n\t'Kocian',\n\t'Maddalena',\n\t'Melamed',\n\t'Mikos',\n\t'Pio',\n\t'Poth',\n\t'Richwine',\n\t'Ruda',\n\t'Sackman',\n\t'Querry',\n\t'Padro',\n\t'Sober',\n\t'Ayscue',\n\t'Puff',\n\t'Hunton',\n\t'Woltz',\n\t'Alsobrook',\n\t'Baskins',\n\t'Daggs',\n\t'Brands',\n\t'Buechel',\n\t'Gonda',\n\t'Haberkorn',\n\t'Hartel',\n\t'Hazeltine',\n\t'Lantrip',\n\t'Leoni',\n\t'Licona',\n\t'Stanke',\n\t'Zwart',\n\t'Aplin',\n\t'Leatham',\n\t'Ace',\n\t'Ganter',\n\t'Bartolomeo',\n\t'Colgrove',\n\t'Halling',\n\t'Hesler',\n\t'Hainline',\n\t'Susi',\n\t'Kroner',\n\t'Sanden',\n\t'Rylander',\n\t'Basaldua',\n\t'Fujiwara',\n\t'Hengst',\n\t'Kapur',\n\t'Kienzle',\n\t'Miao',\n\t'Mutschler',\n\t'Orsi',\n\t'Pais',\n\t'Termini',\n\t'Yamane',\n\t'Zipp',\n\t'Wildey',\n\t'Bauerle',\n\t'Rehn',\n\t'Hipsher',\n\t'Staubin',\n\t'Esquilin',\n\t'Goley',\n\t'Buenaventura',\n\t'Frutos',\n\t'Gaugler',\n\t'Maclellan',\n\t'Mehring',\n\t'Stiers',\n\t'Gearheart',\n\t'Bong',\n\t'Maddocks',\n\t'Canary',\n\t'Urie',\n\t'Skillings',\n\t'Amir',\n\t'Bogus',\n\t'Oakman',\n\t'Barresi',\n\t'Cappelli',\n\t'Clausing',\n\t'Genest',\n\t'Grella',\n\t'Mulherin',\n\t'Roettger',\n\t'Corle',\n\t'Mantel',\n\t'Mody',\n\t'Delapp',\n\t'Dunnington',\n\t'Harvard',\n\t'Berquist',\n\t'Foglia',\n\t'Gilbride',\n\t'Krenek',\n\t'Gagnier',\n\t'Berney',\n\t'Bazzell',\n\t'Selvage',\n\t'Gullette',\n\t'Lavan',\n\t'Gunderman',\n\t'Holaday',\n\t'Horine',\n\t'Salata',\n\t'Slaybaugh',\n\t'Tobia',\n\t'Knick',\n\t'Tinkle',\n\t'Calcaterra',\n\t'Fauth',\n\t'Helmke',\n\t'Margiotta',\n\t'Mejorado',\n\t'Salomone',\n\t'Sevy',\n\t'Suri',\n\t'Vasconcellos',\n\t'Vetrano',\n\t'Flaten',\n\t'Sweetser',\n\t'Logston',\n\t'Varon',\n\t'Allsop',\n\t'Mickler',\n\t'Swails',\n\t'Conejo',\n\t'Derosia',\n\t'Hamre',\n\t'Hanvey',\n\t'Holscher',\n\t'Interiano',\n\t'Kleinberg',\n\t'Kravetz',\n\t'Reinking',\n\t'Schow',\n\t'Schur',\n\t'Vanbrocklin',\n\t'Yinger',\n\t'Zelenka',\n\t'Chagoya',\n\t'Sieben',\n\t'Devora',\n\t'Archambeau',\n\t'Burpee',\n\t'Shamp',\n\t'Stander',\n\t'Weaks',\n\t'Viney',\n\t'Halloway',\n\t'Artiga',\n\t'Clinkenbeard',\n\t'Kenison',\n\t'Loeza',\n\t'Schaap',\n\t'Simoni',\n\t'Frock',\n\t'Galea',\n\t'Graven',\n\t'Brookhart',\n\t'Gurr',\n\t'Mackintosh',\n\t'Arjona',\n\t'Busche',\n\t'Salvi',\n\t'Bedenbaugh',\n\t'Duan',\n\t'Clara',\n\t'Brundidge',\n\t'Akhter',\n\t'Amsler',\n\t'Bolz',\n\t'Bonura',\n\t'Brumbelow',\n\t'Droste',\n\t'Lohmeyer',\n\t'Lorah',\n\t'Louthan',\n\t'Botti',\n\t'Feigenbaum',\n\t'Thon',\n\t'Osbourn',\n\t'Peugh',\n\t'Viau',\n\t'Elsayed',\n\t'Hilyard',\n\t'Coram',\n\t'Alvin',\n\t'Milbourne',\n\t'Hickmon',\n\t'Basu',\n\t'Fasnacht',\n\t'Heathcock',\n\t'Matsui',\n\t'Oyama',\n\t'Stransky',\n\t'Blakesley',\n\t'Antes',\n\t'Flury',\n\t'Lacrosse',\n\t'Lull',\n\t'Clelland',\n\t'Rugh',\n\t'Hamelin',\n\t'Reta',\n\t'Barnet',\n\t'Ballow',\n\t'Pyburn',\n\t'Slayden',\n\t'Freshwater',\n\t'Fomby',\n\t'Bourquin',\n\t'Bowersock',\n\t'Calleros',\n\t'Dallmann',\n\t'Gootee',\n\t'Koelling',\n\t'Parfitt',\n\t'Pruss',\n\t'Tretter',\n\t'Bellini',\n\t'Gulden',\n\t'Pett',\n\t'Mcglasson',\n\t'Yerby',\n\t'Buth',\n\t'Curnow',\n\t'Goller',\n\t'Halderman',\n\t'Kulig',\n\t'Laue',\n\t'Roesner',\n\t'Samra',\n\t'Sorrow',\n\t'Vanbibber',\n\t'Mellin',\n\t'Villacis',\n\t'Hilborn',\n\t'Ditty',\n\t'Vasey',\n\t'Crall',\n\t'Sera',\n\t'Honeywell',\n\t'Blanchet',\n\t'Halim',\n\t'Nevius',\n\t'Ines',\n\t'Stuard',\n\t'Birr',\n\t'Curnutt',\n\t'Deibler',\n\t'Jaster',\n\t'Ouk',\n\t'Poppell',\n\t'Provence',\n\t'Rebman',\n\t'Schmick',\n\t'Terra',\n\t'Zea',\n\t'Hoven',\n\t'Loth',\n\t'Arreaga',\n\t'Cambre',\n\t'Roots',\n\t'Gains',\n\t'Jeancharles',\n\t'Cerritos',\n\t'Ihle',\n\t'Zambito',\n\t'Brueggemann',\n\t'Kluth',\n\t'Schwartzkopf',\n\t'Shott',\n\t'Mcglaughlin',\n\t'Decoster',\n\t'Northam',\n\t'Esau',\n\t'Fling',\n\t'Castile',\n\t'Milledge',\n\t'Desjarlais',\n\t'Laframboise',\n\t'Remigio',\n\t'Rudloff',\n\t'Utecht',\n\t'Enrique',\n\t'Wygant',\n\t'Fairbank',\n\t'Behl',\n\t'Meuse',\n\t'Pyke',\n\t'Fury',\n\t'Chowning',\n\t'Hyndman',\n\t'Donat',\n\t'Nuckles',\n\t'Cartledge',\n\t'Bilal',\n\t'Antonacci',\n\t'Huether',\n\t'Kha',\n\t'Mascia',\n\t'Rothberg',\n\t'Sieck',\n\t'Younes',\n\t'Sassaman',\n\t'Amparan',\n\t'Benesh',\n\t'Faraci',\n\t'Gaber',\n\t'Lehew',\n\t'Belzer',\n\t'Segoviano',\n\t'Teagle',\n\t'Burian',\n\t'Menne',\n\t'Niemeier',\n\t'Old',\n\t'Olenick',\n\t'Takemoto',\n\t'Tepe',\n\t'Test',\n\t'Zahler',\n\t'Matsuoka',\n\t'Hopf',\n\t'Misenheimer',\n\t'Mings',\n\t'Hullett',\n\t'Beutel',\n\t'Criscuolo',\n\t'Fedak',\n\t'Holtkamp',\n\t'Kretschmer',\n\t'Mongillo',\n\t'Mulrooney',\n\t'Panganiban',\n\t'Pollick',\n\t'Sgroi',\n\t'Shirkey',\n\t'Stodola',\n\t'Tozier',\n\t'Weidler',\n\t'Puskar',\n\t'Fiorello',\n\t'Stille',\n\t'Pomales',\n\t'Gladding',\n\t'Griffie',\n\t'Warmack',\n\t'Uzzell',\n\t'Stennis',\n\t'Buttrey',\n\t'Ekberg',\n\t'Harmsen',\n\t'Lieske',\n\t'Madriz',\n\t'Mohs',\n\t'Reininger',\n\t'Edgin',\n\t'Galla',\n\t'Chattin',\n\t'Frayer',\n\t'Brents',\n\t'Lasker',\n\t'Angelone',\n\t'Boulter',\n\t'Burritt',\n\t'Choudhry',\n\t'Claffey',\n\t'Elizarraras',\n\t'Gaumer',\n\t'Gawronski',\n\t'Henwood',\n\t'Lapine',\n\t'Bitar',\n\t'Himel',\n\t'Almand',\n\t'Brase',\n\t'Lala',\n\t'Salama',\n\t'Essick',\n\t'Longman',\n\t'Mone',\n\t'Reynard',\n\t'Brackney',\n\t'Cottam',\n\t'Donadio',\n\t'Geesey',\n\t'Laudenslager',\n\t'Mcgilvray',\n\t'Yano',\n\t'Bueche',\n\t'Irey',\n\t'Carneal',\n\t'Tinder',\n\t'Walke',\n\t'Baston',\n\t'Segar',\n\t'Brisbane',\n\t'Venson',\n\t'Arguijo',\n\t'Beitler',\n\t'Burek',\n\t'Burgener',\n\t'Collyer',\n\t'Donlin',\n\t'Duhaime',\n\t'Dworak',\n\t'Frech',\n\t'Kozik',\n\t'Montejo',\n\t'Nhan',\n\t'Quirarte',\n\t'Tram',\n\t'Deshpande',\n\t'Silverthorn',\n\t'Leard',\n\t'Sheller',\n\t'Alphin',\n\t'Boxer',\n\t'Shawn',\n\t'Pinnick',\n\t'Stigler',\n\t'Arpin',\n\t'Falkenberg',\n\t'Gerig',\n\t'Lemonds',\n\t'Salm',\n\t'Sarkis',\n\t'Paprocki',\n\t'Probasco',\n\t'Haithcock',\n\t'Carn',\n\t'Farrish',\n\t'Haliburton',\n\t'Copen',\n\t'Pieri',\n\t'Slaymaker',\n\t'Cardarelli',\n\t'Veneziano',\n\t'Melfi',\n\t'Solley',\n\t'Hymer',\n\t'Pleitez',\n\t'Hinsley',\n\t'Bruen',\n\t'Arita',\n\t'Dreisbach',\n\t'Fichtner',\n\t'Keckler',\n\t'Slaby',\n\t'Tanguma',\n\t'Wiberg',\n\t'Ferrucci',\n\t'Lick',\n\t'Maginnis',\n\t'Quaranta',\n\t'Bera',\n\t'Maybee',\n\t'Hennessee',\n\t'Kerrick',\n\t'Kabir',\n\t'Branscome',\n\t'Fullington',\n\t'Menser',\n\t'Brooking',\n\t'Patridge',\n\t'Gue',\n\t'Gowens',\n\t'Redus',\n\t'Ector',\n\t'Distasio',\n\t'Kissner',\n\t'Prada',\n\t'Sponsler',\n\t'Tempel',\n\t'Wedemeyer',\n\t'Degler',\n\t'Bodenhamer',\n\t'Sherbert',\n\t'Jefferis',\n\t'Belgarde',\n\t'Bevel',\n\t'Figaro',\n\t'Bertino',\n\t'Fabbri',\n\t'Kovacevic',\n\t'Kunst',\n\t'Leja',\n\t'Ruffo',\n\t'Stearman',\n\t'Trickett',\n\t'Zafar',\n\t'Valdivieso',\n\t'Curbelo',\n\t'Mabee',\n\t'Emma',\n\t'Arman',\n\t'Swasey',\n\t'Lyday',\n\t'Muff',\n\t'Rideaux',\n\t'Ahlgren',\n\t'Cobo',\n\t'Hanratty',\n\t'Litwiller',\n\t'Mallonee',\n\t'Glunt',\n\t'Moudy',\n\t'Hickam',\n\t'Mahmud',\n\t'Fate',\n\t'Hemsley',\n\t'Biery',\n\t'Buechner',\n\t'Fragale',\n\t'Hornbaker',\n\t'Lacorte',\n\t'Mateos',\n\t'Mickley',\n\t'Reusch',\n\t'Sabado',\n\t'Schnurr',\n\t'Gasior',\n\t'Konkle',\n\t'Okazaki',\n\t'Doubleday',\n\t'Couvillion',\n\t'Lupien',\n\t'Oder',\n\t'Ohair',\n\t'Win',\n\t'Quaintance',\n\t'Diltz',\n\t'Poythress',\n\t'Percell',\n\t'Weatherall',\n\t'Ainslie',\n\t'Brandner',\n\t'Byrge',\n\t'Cawood',\n\t'Heatwole',\n\t'Kerschner',\n\t'Looker',\n\t'Racz',\n\t'Skirvin',\n\t'Steitz',\n\t'Svenson',\n\t'Vermette',\n\t'Zupancic',\n\t'Monnier',\n\t'Scafidi',\n\t'Trousdale',\n\t'Bares',\n\t'Costantini',\n\t'Frees',\n\t'Kallio',\n\t'Methvin',\n\t'Prudencio',\n\t'Hayse',\n\t'Mahabir',\n\t'Wafford',\n\t'Borgmann',\n\t'Cogley',\n\t'Gigante',\n\t'Kurkowski',\n\t'Lavoy',\n\t'Wertheimer',\n\t'Wienke',\n\t'Goodling',\n\t'Danek',\n\t'Brinley',\n\t'Charlson',\n\t'Whitsell',\n\t'Lowen',\n\t'Minnix',\n\t'Lowers',\n\t'Palin',\n\t'Burgher',\n\t'Lorick',\n\t'Sobers',\n\t'Gavigan',\n\t'Italiano',\n\t'Liebl',\n\t'Prevette',\n\t'Wehunt',\n\t'Radin',\n\t'Guillotte',\n\t'Mode',\n\t'Halfacre',\n\t'Stjames',\n\t'Isabelle',\n\t'Meggs',\n\t'Burkard',\n\t'Giannotti',\n\t'Justo',\n\t'Kasprzyk',\n\t'Kuba',\n\t'Mino',\n\t'Morganti',\n\t'Schnelle',\n\t'Serfass',\n\t'Yacoub',\n\t'Thode',\n\t'Wykoff',\n\t'Macbeth',\n\t'Oxner',\n\t'Mayhue',\n\t'Saulter',\n\t'Budnik',\n\t'Gandarilla',\n\t'Michalec',\n\t'Eisel',\n\t'Newmark',\n\t'Placido',\n\t'Bellar',\n\t'Dollarhide',\n\t'Huett',\n\t'Copher',\n\t'Lacaze',\n\t'Dominic',\n\t'Bibler',\n\t'Boydstun',\n\t'Faas',\n\t'Grana',\n\t'Guardino',\n\t'Illig',\n\t'Luebbert',\n\t'Lyford',\n\t'Mcgettigan',\n\t'Repko',\n\t'Widmann',\n\t'Trevathan',\n\t'Ewan',\n\t'Mcray',\n\t'Footman',\n\t'Kerchner',\n\t'Leggio',\n\t'Bullinger',\n\t'Rushford',\n\t'Edel',\n\t'Leandro',\n\t'Burkman',\n\t'Grattan',\n\t'Tench',\n\t'Dartez',\n\t'Lemar',\n\t'Fane',\n\t'Zenon',\n\t'Sabb',\n\t'Blatchford',\n\t'Chilcoat',\n\t'Hahne',\n\t'Hanssen',\n\t'Mawhinney',\n\t'Pflueger',\n\t'Pol',\n\t'Vitelli',\n\t'Brierley',\n\t'Zundel',\n\t'Mcgillicuddy',\n\t'Adriano',\n\t'Mate',\n\t'Wilkison',\n\t'Ramnarine',\n\t'Peaks',\n\t'Bacote',\n\t'Barretto',\n\t'Benevento',\n\t'Gubler',\n\t'Koelsch',\n\t'Naas',\n\t'Patane',\n\t'Schnitzler',\n\t'Sprenkle',\n\t'Ulbrich',\n\t'Violante',\n\t'Rench',\n\t'Najarro',\n\t'Kristensen',\n\t'Poma',\n\t'Sara',\n\t'Jerrell',\n\t'Sarratt',\n\t'Mondy',\n\t'Antill',\n\t'Belleville',\n\t'Dworkin',\n\t'Holdaway',\n\t'Lenderman',\n\t'Murga',\n\t'Reiling',\n\t'Stasko',\n\t'Topel',\n\t'Verity',\n\t'Vinas',\n\t'Ziebarth',\n\t'Vanguilder',\n\t'Stoots',\n\t'Yantis',\n\t'Faries',\n\t'Tulley',\n\t'Baucum',\n\t'Fugett',\n\t'Harring',\n\t'Semien',\n\t'Dauphinais',\n\t'Furukawa',\n\t'Grilli',\n\t'Ohanian',\n\t'Ormiston',\n\t'Osegueda',\n\t'Wiegert',\n\t'Zier',\n\t'Chiesa',\n\t'Radecki',\n\t'Mongeon',\n\t'Stake',\n\t'Sweetland',\n\t'Shearon',\n\t'Lamore',\n\t'Mccuiston',\n\t'Minson',\n\t'Burditt',\n\t'Mcferren',\n\t'Covin',\n\t'Straker',\n\t'Elzy',\n\t'Althaus',\n\t'Anzures',\n\t'Glaeser',\n\t'Huseby',\n\t'Nitta',\n\t'Ribaudo',\n\t'Sobota',\n\t'Spieker',\n\t'Stefaniak',\n\t'Valois',\n\t'Vanwie',\n\t'Venturini',\n\t'Beltre',\n\t'Ewer',\n\t'Hartt',\n\t'Keaney',\n\t'Throne',\n\t'Edrington',\n\t'Inmon',\n\t'Isabel',\n\t'Brayman',\n\t'Devilbiss',\n\t'Krasner',\n\t'Malak',\n\t'Tito',\n\t'Vermeer',\n\t'Benigno',\n\t'Bosque',\n\t'Berridge',\n\t'Clines',\n\t'Brite',\n\t'Mcbeath',\n\t'Gleaves',\n\t'Koenen',\n\t'Kubicki',\n\t'Kudla',\n\t'Seiple',\n\t'Warkentin',\n\t'Choiniere',\n\t'Nassif',\n\t'Banko',\n\t'Muncie',\n\t'Garling',\n\t'Causby',\n\t'Mcgaw',\n\t'Burkeen',\n\t'Balan',\n\t'Georgia',\n\t'Hick',\n\t'Tumblin',\n\t'Badon',\n\t'Warrior',\n\t'Yearby',\n\t'Hiestand',\n\t'Hughart',\n\t'Proffer',\n\t'Sult',\n\t'Yepes',\n\t'Zachman',\n\t'Beddow',\n\t'Molyneux',\n\t'Camejo',\n\t'Stephany',\n\t'Cadogan',\n\t'Gosha',\n\t'Goodwine',\n\t'Harewood',\n\t'Burnsed',\n\t'Frappier',\n\t'Minardi',\n\t'Rieser',\n\t'Tabbert',\n\t'Marietta',\n\t'Butch',\n\t'Steil',\n\t'Canal',\n\t'Brundige',\n\t'Comas',\n\t'Hopkinson',\n\t'Shomo',\n\t'Kendle',\n\t'Bowsher',\n\t'Illingworth',\n\t'Kampa',\n\t'Manasco',\n\t'Mcdorman',\n\t'Theurer',\n\t'Widger',\n\t'Carbonneau',\n\t'Stachura',\n\t'Eriksson',\n\t'Trostle',\n\t'Foxworthy',\n\t'Lex',\n\t'Belman',\n\t'Isola',\n\t'Mckane',\n\t'Gearing',\n\t'Rimes',\n\t'Couillard',\n\t'Emanuele',\n\t'Pho',\n\t'Scimeca',\n\t'Skaar',\n\t'Vibbert',\n\t'Bilby',\n\t'Hink',\n\t'Gohn',\n\t'Nguy',\n\t'Perrett',\n\t'Bowland',\n\t'Comes',\n\t'Moffet',\n\t'Pauline',\n\t'Donalson',\n\t'Tilman',\n\t'Hansberry',\n\t'Acedo',\n\t'Camarda',\n\t'Devivo',\n\t'Eurich',\n\t'Jojola',\n\t'Railsback',\n\t'Rumfelt',\n\t'Stastny',\n\t'Strittmatter',\n\t'Houseknecht',\n\t'Rynearson',\n\t'Weinrich',\n\t'Kinghorn',\n\t'Astin',\n\t'Aguillard',\n\t'Hameed',\n\t'Drone',\n\t'Lonon',\n\t'Burgio',\n\t'Klimas',\n\t'Riegler',\n\t'Schiano',\n\t'Slonaker',\n\t'Deery',\n\t'Weissinger',\n\t'Cea',\n\t'Grenz',\n\t'Arent',\n\t'Sopher',\n\t'Jarratt',\n\t'Mitchener',\n\t'Conigliaro',\n\t'Dohm',\n\t'Feenstra',\n\t'Meiers',\n\t'Hetland',\n\t'Kinsinger',\n\t'Kmiec',\n\t'Teich',\n\t'Fukushima',\n\t'Kerins',\n\t'Cienfuegos',\n\t'Orlandi',\n\t'Bonser',\n\t'Okun',\n\t'Coate',\n\t'Rittenberry',\n\t'Mcclaine',\n\t'Dunklin',\n\t'Citizen',\n\t'Danzy',\n\t'Geers',\n\t'Georgeson',\n\t'Kikuchi',\n\t'Macinnis',\n\t'Malizia',\n\t'Mukai',\n\t'Plants',\n\t'Ehmann',\n\t'Haren',\n\t'Lachney',\n\t'Duchesne',\n\t'Collinson',\n\t'Connett',\n\t'Hostler',\n\t'Farnell',\n\t'Osler',\n\t'Triche',\n\t'Ballweg',\n\t'Bansal',\n\t'Galo',\n\t'Hollabaugh',\n\t'Hultquist',\n\t'Mcbrien',\n\t'Pelz',\n\t'Picciano',\n\t'Tashjian',\n\t'Thresher',\n\t'Uphoff',\n\t'Shawley',\n\t'Tomasek',\n\t'Aldaz',\n\t'Harig',\n\t'Kullman',\n\t'Vaness',\n\t'Isabella',\n\t'Munley',\n\t'Bissette',\n\t'Thackston',\n\t'Borgia',\n\t'Camire',\n\t'Charters',\n\t'Feiler',\n\t'Geisinger',\n\t'Racca',\n\t'Rasmusson',\n\t'Stonesifer',\n\t'Vidmar',\n\t'Arciga',\n\t'Bialek',\n\t'Baruch',\n\t'Kornfeld',\n\t'Harmeyer',\n\t'Picon',\n\t'Suppa',\n\t'Strate',\n\t'Hyre',\n\t'Verdon',\n\t'Reily',\n\t'Castell',\n\t'Foard',\n\t'Exner',\n\t'Furnari',\n\t'Guereca',\n\t'Hallgren',\n\t'Holsclaw',\n\t'Ketelsen',\n\t'Magnani',\n\t'Mehling',\n\t'Naser',\n\t'Seder',\n\t'Sparr',\n\t'Strnad',\n\t'Tatar',\n\t'Crecelius',\n\t'Knicely',\n\t'Vantassell',\n\t'Balsley',\n\t'Babbs',\n\t'Gowans',\n\t'Mcclam',\n\t'Batdorf',\n\t'Belsky',\n\t'Gull',\n\t'Letizia',\n\t'Ludlum',\n\t'Mascari',\n\t'Scheffel',\n\t'Spurgin',\n\t'Dignan',\n\t'Steffensen',\n\t'Freeberg',\n\t'Honan',\n\t'Hamric',\n\t'Woolman',\n\t'Valeri',\n\t'Saab',\n\t'Boyers',\n\t'Pardon',\n\t'Deasy',\n\t'Forshey',\n\t'Juntunen',\n\t'Kamel',\n\t'Macisaac',\n\t'Marinaro',\n\t'Milroy',\n\t'Parillo',\n\t'Rappold',\n\t'Schippers',\n\t'Smola',\n\t'Staniszewski',\n\t'Strasburg',\n\t'Epple',\n\t'Dewitte',\n\t'Hubley',\n\t'Queener',\n\t'Stoddart',\n\t'Briant',\n\t'Mcclurkin',\n\t'Binkowski',\n\t'Eberts',\n\t'Kilbane',\n\t'Kiraly',\n\t'Monsalve',\n\t'Othman',\n\t'Pasek',\n\t'Rinke',\n\t'Steinbrecher',\n\t'Trees',\n\t'Winther',\n\t'Boal',\n\t'Eber',\n\t'Funez',\n\t'Harryman',\n\t'Boyter',\n\t'Rill',\n\t'Jolliffe',\n\t'Dorian',\n\t'Demore',\n\t'Sebree',\n\t'Jeff',\n\t'Jolivette',\n\t'Elko',\n\t'Jividen',\n\t'Lenzen',\n\t'Marsee',\n\t'Milbrandt',\n\t'Orihuela',\n\t'Osterhoudt',\n\t'Parras',\n\t'Schnepp',\n\t'Tenaglia',\n\t'Thoren',\n\t'Diosdado',\n\t'Pingree',\n\t'Rutigliano',\n\t'Filbert',\n\t'Babel',\n\t'Stollings',\n\t'Hopes',\n\t'Bynes',\n\t'Brockmann',\n\t'Carta',\n\t'Deleeuw',\n\t'Demo',\n\t'Margeson',\n\t'Mckitrick',\n\t'Reyez',\n\t'Sidor',\n\t'Strehlow',\n\t'Timlin',\n\t'Wegrzyn',\n\t'Burgdorf',\n\t'Benzing',\n\t'Bonneville',\n\t'Clonts',\n\t'Camps',\n\t'Graydon',\n\t'Pasha',\n\t'Andreoli',\n\t'Cockerill',\n\t'Covino',\n\t'Hajjar',\n\t'Korpi',\n\t'Pohlmann',\n\t'Wente',\n\t'Wickwire',\n\t'Schaber',\n\t'Vonderhaar',\n\t'Manser',\n\t'Fitton',\n\t'Galindez',\n\t'Ares',\n\t'Longmore',\n\t'Buchert',\n\t'Delisi',\n\t'Gaulin',\n\t'Genco',\n\t'Helgerson',\n\t'Khawaja',\n\t'Radosevich',\n\t'Sannicolas',\n\t'Sterk',\n\t'Theberge',\n\t'Voiles',\n\t'Warchol',\n\t'Potthoff',\n\t'Runkel',\n\t'Stachowski',\n\t'Snay',\n\t'Share',\n\t'Conkey',\n\t'Pontes',\n\t'Mathies',\n\t'Brittian',\n\t'Allgeier',\n\t'Daughenbaugh',\n\t'Glock',\n\t'Meisinger',\n\t'Pantaleo',\n\t'Saitta',\n\t'Weick',\n\t'Burak',\n\t'Borda',\n\t'Rim',\n\t'Bunyard',\n\t'Neaves',\n\t'Mcilvaine',\n\t'Zee',\n\t'Buskey',\n\t'Roseborough',\n\t'Bellin',\n\t'Fasulo',\n\t'Grab',\n\t'Jia',\n\t'Knab',\n\t'Skalski',\n\t'Stensland',\n\t'Zajicek',\n\t'Echeverry',\n\t'Kolenda',\n\t'Cadden',\n\t'Delawder',\n\t'Propp',\n\t'Scheeler',\n\t'Clukey',\n\t'Loven',\n\t'Bogen',\n\t'Whittingham',\n\t'Barcelona',\n\t'Braasch',\n\t'Haubrich',\n\t'Kolberg',\n\t'Vendetti',\n\t'Sheesley',\n\t'Bartoli',\n\t'Knierim',\n\t'Amparo',\n\t'Lauth',\n\t'Rosero',\n\t'Burry',\n\t'Guynes',\n\t'Cumbo',\n\t'Pridgeon',\n\t'Aarons',\n\t'Alarid',\n\t'Arakawa',\n\t'Benzel',\n\t'Bywater',\n\t'Grosch',\n\t'Heth',\n\t'Logiudice',\n\t'Maisel',\n\t'Morquecho',\n\t'Wahlberg',\n\t'Teigen',\n\t'Bockelman',\n\t'Rehak',\n\t'Bitler',\n\t'Brion',\n\t'Niece',\n\t'Selvey',\n\t'Sudderth',\n\t'Ruddock',\n\t'Sandiford',\n\t'Aguas',\n\t'Folan',\n\t'Herwig',\n\t'Krupinski',\n\t'Mccarrick',\n\t'Mudgett',\n\t'Pancake',\n\t'Redner',\n\t'Wentzell',\n\t'Soliday',\n\t'Marschall',\n\t'Krakowski',\n\t'Rebholz',\n\t'Dold',\n\t'Giller',\n\t'Gassett',\n\t'Brazzell',\n\t'Bellow',\n\t'Tolen',\n\t'Gloster',\n\t'Gagliardo',\n\t'Harbuck',\n\t'Lorber',\n\t'Natarajan',\n\t'Sarna',\n\t'Schrack',\n\t'Vena',\n\t'Witzke',\n\t'Minassian',\n\t'Loi',\n\t'Rogue',\n\t'Trace',\n\t'Bomba',\n\t'Cozzens',\n\t'Evett',\n\t'Boze',\n\t'Petros',\n\t'Cotta',\n\t'Eisenmann',\n\t'Florea',\n\t'Hammersley',\n\t'Keohane',\n\t'Necessary',\n\t'Nodine',\n\t'Pekarek',\n\t'Sjogren',\n\t'Ruybal',\n\t'Arabie',\n\t'Huntsinger',\n\t'Eiseman',\n\t'Mehler',\n\t'Craner',\n\t'Vandine',\n\t'Gaffey',\n\t'Menna',\n\t'Royle',\n\t'Cordrey',\n\t'Gala',\n\t'Gauss',\n\t'Dacruz',\n\t'Cardell',\n\t'Devan',\n\t'Calmes',\n\t'Humber',\n\t'Stoute',\n\t'Balko',\n\t'Cera',\n\t'Griesbach',\n\t'Kissick',\n\t'Kloos',\n\t'Oertel',\n\t'Sedlock',\n\t'Stellato',\n\t'Tuite',\n\t'Bero',\n\t'Rinard',\n\t'Dambra',\n\t'Cinelli',\n\t'Tea',\n\t'Hicken',\n\t'Linch',\n\t'Dials',\n\t'Bennefield',\n\t'Hillsman',\n\t'Flemister',\n\t'Alvaro',\n\t'Goranson',\n\t'Henk',\n\t'Ryden',\n\t'Verhagen',\n\t'Wessling',\n\t'Willetts',\n\t'Neidlinger',\n\t'Pereida',\n\t'Lainhart',\n\t'Nemes',\n\t'Rudzinski',\n\t'Sward',\n\t'Rom',\n\t'Rosko',\n\t'Runions',\n\t'Henney',\n\t'Ridgely',\n\t'Tomson',\n\t'Arballo',\n\t'Bohorquez',\n\t'Brixey',\n\t'Durling',\n\t'Espina',\n\t'Esquivias',\n\t'Nungaray',\n\t'Ovando',\n\t'Zapf',\n\t'Pizza',\n\t'Arel',\n\t'Ballin',\n\t'Heathman',\n\t'Morison',\n\t'Troop',\n\t'Monfort',\n\t'Copland',\n\t'Harriott',\n\t'Mcwhite',\n\t'Amini',\n\t'Cirilo',\n\t'Gassner',\n\t'Gulbranson',\n\t'Kovatch',\n\t'Venne',\n\t'Terriquez',\n\t'Savin',\n\t'Amo',\n\t'Moris',\n\t'Crable',\n\t'Delaughter',\n\t'Greenhouse',\n\t'Eckardt',\n\t'Hendrixson',\n\t'Manansala',\n\t'Mongeau',\n\t'Panko',\n\t'Pichette',\n\t'Sliwa',\n\t'Tabak',\n\t'Determan',\n\t'Freeburg',\n\t'Portell',\n\t'Steller',\n\t'Buffkin',\n\t'Righter',\n\t'Mcguinn',\n\t'Corrie',\n\t'Tatham',\n\t'Smelley',\n\t'Terrel',\n\t'Selmon',\n\t'Blecha',\n\t'Eisler',\n\t'Engelking',\n\t'Goen',\n\t'Krey',\n\t'Mceldowney',\n\t'Plamondon',\n\t'Slovak',\n\t'Sorce',\n\t'Spagnolo',\n\t'Wambold',\n\t'Colborn',\n\t'Englander',\n\t'Monsour',\n\t'Pait',\n\t'Perricone',\n\t'Loveridge',\n\t'Cragg',\n\t'Dies',\n\t'Holsten',\n\t'Dagley',\n\t'Beverley',\n\t'Bayona',\n\t'Cam',\n\t'Chock',\n\t'Coppersmith',\n\t'Donath',\n\t'Guillemette',\n\t'Iannelli',\n\t'Potratz',\n\t'Selander',\n\t'Suk',\n\t'Waldvogel',\n\t'Olberding',\n\t'Giaimo',\n\t'Spoto',\n\t'Crocco',\n\t'Waskiewicz',\n\t'Krizan',\n\t'Vigo',\n\t'Boarman',\n\t'Ron',\n\t'Facer',\n\t'Garlow',\n\t'Filsaime',\n\t'Andersson',\n\t'Demski',\n\t'Derouin',\n\t'Diegel',\n\t'Feria',\n\t'Foth',\n\t'Hertzberg',\n\t'Jillson',\n\t'Kram',\n\t'Mammen',\n\t'Melhorn',\n\t'Monjaras',\n\t'Oslund',\n\t'Petrin',\n\t'Pinho',\n\t'Scheerer',\n\t'Shadden',\n\t'Sitzman',\n\t'Stumbaugh',\n\t'Wengert',\n\t'Gershon',\n\t'Mcelhinney',\n\t'Batterson',\n\t'Macqueen',\n\t'Janas',\n\t'Gladson',\n\t'Aull',\n\t'Wasinger',\n\t'Shemwell',\n\t'Seats',\n\t'Colas',\n\t'Allbee',\n\t'Fithian',\n\t'Fonner',\n\t'Gergen',\n\t'Lubrano',\n\t'Mannarino',\n\t'Piscopo',\n\t'Sydow',\n\t'Werle',\n\t'Aumiller',\n\t'Coplen',\n\t'Dardar',\n\t'Morrisette',\n\t'Mchaney',\n\t'Simes',\n\t'Gillison',\n\t'Emmel',\n\t'Klunk',\n\t'Luber',\n\t'Madeira',\n\t'Schlicht',\n\t'Tremain',\n\t'Cleaveland',\n\t'Boulet',\n\t'Golladay',\n\t'Enck',\n\t'Fera',\n\t'Hammar',\n\t'Hebner',\n\t'Ishee',\n\t'Nanni',\n\t'Palomar',\n\t'Pangborn',\n\t'Rogala',\n\t'Rushlow',\n\t'Wiedman',\n\t'Laber',\n\t'Schoenfelder',\n\t'Sonner',\n\t'Duffer',\n\t'Granier',\n\t'Sawin',\n\t'Dwiggins',\n\t'Jaso',\n\t'Popplewell',\n\t'Loren',\n\t'Ord',\n\t'Dearmon',\n\t'Hammen',\n\t'Misra',\n\t'Reindl',\n\t'Siordia',\n\t'Woodhead',\n\t'Yasuda',\n\t'Dockstader',\n\t'Kobs',\n\t'Tokarski',\n\t'Villers',\n\t'Mase',\n\t'Arrant',\n\t'Hedgpeth',\n\t'Eggleton',\n\t'Frederic',\n\t'Victorian',\n\t'Akerman',\n\t'Balazs',\n\t'Brandau',\n\t'Depietro',\n\t'Dillenbeck',\n\t'Goodnow',\n\t'Larner',\n\t'Mcmurtrie',\n\t'Salameh',\n\t'Swicegood',\n\t'Koshy',\n\t'Stdenis',\n\t'Deakin',\n\t'Izzi',\n\t'Teater',\n\t'Gramm',\n\t'Doig',\n\t'Blacklock',\n\t'Haymore',\n\t'Heggie',\n\t'Kirklin',\n\t'Kassa',\n\t'Ryles',\n\t'Tenner',\n\t'Ndiaye',\n\t'Burrola',\n\t'Faires',\n\t'Grega',\n\t'Krentz',\n\t'Needles',\n\t'Portz',\n\t'Ruedas',\n\t'Sitko',\n\t'Viernes',\n\t'Setter',\n\t'Tricarico',\n\t'Prest',\n\t'Olivar',\n\t'Whitsitt',\n\t'Labossiere',\n\t'Bellomo',\n\t'Burgeson',\n\t'Capriotti',\n\t'Drinnon',\n\t'Gulati',\n\t'Haffey',\n\t'Lasota',\n\t'Laughery',\n\t'Mees',\n\t'Melander',\n\t'Paoletti',\n\t'Petermann',\n\t'Zerby',\n\t'Burhans',\n\t'Lasseigne',\n\t'Vannote',\n\t'Wai',\n\t'Berson',\n\t'Gritton',\n\t'Searl',\n\t'Toller',\n\t'Brackeen',\n\t'Screws',\n\t'Hagens',\n\t'Billingslea',\n\t'Hyppolite',\n\t'Asmussen',\n\t'Bitton',\n\t'Diiorio',\n\t'Grigoryan',\n\t'Hauenstein',\n\t'Krukowski',\n\t'Mulcahey',\n\t'Perras',\n\t'Prak',\n\t'Reitzel',\n\t'Spackman',\n\t'Valenciano',\n\t'Wieck',\n\t'Yeagley',\n\t'Zanetti',\n\t'Goeller',\n\t'Azizi',\n\t'Grise',\n\t'Mogan',\n\t'Traverso',\n\t'Nangle',\n\t'Saladin',\n\t'Hardgrove',\n\t'Osei',\n\t'Fehrenbach',\n\t'Giesbrecht',\n\t'Halas',\n\t'Hetzler',\n\t'Orsak',\n\t'Salaz',\n\t'Surace',\n\t'Whipp',\n\t'Charlebois',\n\t'Stayer',\n\t'Stelmach',\n\t'Hitchings',\n\t'Senters',\n\t'Mcnaught',\n\t'Cordier',\n\t'Dawsey',\n\t'Barhorst',\n\t'Clauser',\n\t'Dibernardo',\n\t'Hawkey',\n\t'Hritz',\n\t'Patchin',\n\t'Raatz',\n\t'Seubert',\n\t'Slingerland',\n\t'Vanderwoude',\n\t'Aquilino',\n\t'Goertzen',\n\t'Navratil',\n\t'Mccuistion',\n\t'Vallin',\n\t'Moors',\n\t'Connely',\n\t'Fedrick',\n\t'Bontempo',\n\t'Dishong',\n\t'Felch',\n\t'Laino',\n\t'Minshall',\n\t'Montroy',\n\t'Plotts',\n\t'Radice',\n\t'Sachse',\n\t'Safran',\n\t'Schecter',\n\t'Traut',\n\t'Vasile',\n\t'Yadon',\n\t'Gorka',\n\t'Roelofs',\n\t'Suit',\n\t'Asbill',\n\t'Torrens',\n\t'Kimmey',\n\t'Ruger',\n\t'Vinzant',\n\t'Watkin',\n\t'Rawles',\n\t'Cubero',\n\t'Duch',\n\t'Endress',\n\t'Fangman',\n\t'Holben',\n\t'Holzapfel',\n\t'Karner',\n\t'Otteson',\n\t'Stangel',\n\t'Terrebonne',\n\t'Wagley',\n\t'Wisecup',\n\t'Bengston',\n\t'Leck',\n\t'Coalson',\n\t'Farooq',\n\t'Safi',\n\t'Smyers',\n\t'All',\n\t'Else',\n\t'Wason',\n\t'Nairn',\n\t'Panton',\n\t'Ahrendt',\n\t'Arvizo',\n\t'Klahn',\n\t'Robak',\n\t'Schier',\n\t'Start',\n\t'Tiano',\n\t'Kraatz',\n\t'Corzo',\n\t'Maranto',\n\t'Elm',\n\t'Eagles',\n\t'Acres',\n\t'Schoolfield',\n\t'Ancrum',\n\t'Ahner',\n\t'Augsburger',\n\t'Berna',\n\t'Danh',\n\t'Fruth',\n\t'Galluzzo',\n\t'Racette',\n\t'Selva',\n\t'Szekely',\n\t'Zirbel',\n\t'Hauff',\n\t'Markgraf',\n\t'Wonderly',\n\t'Rydell',\n\t'Julia',\n\t'Chris',\n\t'Simson',\n\t'Bridgeford',\n\t'Jeffress',\n\t'Brailsford',\n\t'Bluford',\n\t'Boser',\n\t'Fichera',\n\t'Meininger',\n\t'Meyerhoff',\n\t'Modzelewski',\n\t'Niese',\n\t'Pavlovich',\n\t'Radovich',\n\t'Ratz',\n\t'Frankowski',\n\t'Berti',\n\t'Geno',\n\t'Fares',\n\t'Marney',\n\t'Harwick',\n\t'Tata',\n\t'Bobby',\n\t'Dobbin',\n\t'Roosevelt',\n\t'Greenaway',\n\t'Janvier',\n\t'Oatis',\n\t'Beilke',\n\t'Brelsford',\n\t'Dowty',\n\t'Giudice',\n\t'Hetzer',\n\t'Imboden',\n\t'Irelan',\n\t'Nie',\n\t'Ramberg',\n\t'Rega',\n\t'Sproat',\n\t'Sytsma',\n\t'Unrein',\n\t'Davignon',\n\t'Ganoe',\n\t'Leinweber',\n\t'Mantell',\n\t'Troisi',\n\t'Sahr',\n\t'Esperanza',\n\t'Asper',\n\t'Lathem',\n\t'Eagleton',\n\t'Lamons',\n\t'Gaulden',\n\t'Bloodgood',\n\t'Cerone',\n\t'Claro',\n\t'Durfey',\n\t'Enamorado',\n\t'Herrada',\n\t'Maw',\n\t'Schlagel',\n\t'Signor',\n\t'Reisch',\n\t'Gruenwald',\n\t'Helbert',\n\t'Lorenzi',\n\t'Woodlief',\n\t'Huval',\n\t'Batman',\n\t'Meadow',\n\t'Croswell',\n\t'Bordonaro',\n\t'Earnshaw',\n\t'Freiburger',\n\t'Gunnoe',\n\t'Lamberton',\n\t'Martella',\n\t'Mischke',\n\t'Shelor',\n\t'Venuti',\n\t'Bilek',\n\t'Mcmains',\n\t'Balding',\n\t'Mestre',\n\t'Mcconnaughey',\n\t'Manso',\n\t'Decoste',\n\t'Egerton',\n\t'Alvino',\n\t'Arizpe',\n\t'Blaschke',\n\t'Foglesong',\n\t'Heyn',\n\t'Irigoyen',\n\t'Komorowski',\n\t'Lesinski',\n\t'Nghiem',\n\t'Rund',\n\t'Santiesteban',\n\t'Strahm',\n\t'Hendel',\n\t'Capes',\n\t'Carls',\n\t'Bon',\n\t'Sires',\n\t'Nichelson',\n\t'Brimm',\n\t'Aikins',\n\t'Berra',\n\t'Brazee',\n\t'Burkert',\n\t'Capalbo',\n\t'Criscione',\n\t'Feddersen',\n\t'Hofbauer',\n\t'Jacobowitz',\n\t'Mackowiak',\n\t'Mcenroe',\n\t'Philbeck',\n\t'Shimada',\n\t'Ticknor',\n\t'Wozny',\n\t'Biernacki',\n\t'Hirschi',\n\t'Polich',\n\t'Sokoloski',\n\t'Dolores',\n\t'Knoch',\n\t'Ge',\n\t'Groome',\n\t'Markell',\n\t'Fearing',\n\t'Mcclaren',\n\t'Hadsell',\n\t'Rumple',\n\t'Samudio',\n\t'Scardina',\n\t'Spinosa',\n\t'Abramov',\n\t'Siracusa',\n\t'Goren',\n\t'Rocchio',\n\t'Bibi',\n\t'Lamer',\n\t'Liddy',\n\t'Anna',\n\t'Coxe',\n\t'De',\n\t'Rodes',\n\t'Cheshier',\n\t'Coulon',\n\t'Closs',\n\t'Tigue',\n\t'Seville',\n\t'Hopkin',\n\t'Rodwell',\n\t'Bibbins',\n\t'Baldree',\n\t'Bawden',\n\t'Bishoff',\n\t'Costabile',\n\t'Dec',\n\t'Hillegass',\n\t'Infantino',\n\t'Mantia',\n\t'Mcamis',\n\t'Northcott',\n\t'Ruprecht',\n\t'Sanpedro',\n\t'Campione',\n\t'Muchow',\n\t'Ostby',\n\t'Mohl',\n\t'Pulice',\n\t'Vigna',\n\t'Thomann',\n\t'Lillibridge',\n\t'Manville',\n\t'Vives',\n\t'Bellanger',\n\t'Desormeaux',\n\t'Lovingood',\n\t'Stjulien',\n\t'Echeverri',\n\t'Florey',\n\t'Gieseke',\n\t'Maeder',\n\t'Marcinko',\n\t'Nuncio',\n\t'Quirino',\n\t'Versteeg',\n\t'Voelkel',\n\t'Wanless',\n\t'Morocho',\n\t'Monteagudo',\n\t'Aikin',\n\t'Bramley',\n\t'Bartleson',\n\t'Skeete',\n\t'Batra',\n\t'Dolloff',\n\t'Gehr',\n\t'Hellyer',\n\t'Hersch',\n\t'Hier',\n\t'Lannan',\n\t'Reffitt',\n\t'Carboni',\n\t'Schouten',\n\t'Burkle',\n\t'Riches',\n\t'Busa',\n\t'Rademaker',\n\t'Hult',\n\t'Synder',\n\t'Bossard',\n\t'Tunis',\n\t'Pamplin',\n\t'Oats',\n\t'Mcphaul',\n\t'Baik',\n\t'Kieser',\n\t'Pareja',\n\t'Raffaele',\n\t'Erhard',\n\t'Iwasaki',\n\t'Tonelli',\n\t'Mabey',\n\t'Debruyn',\n\t'Carrel',\n\t'Myron',\n\t'Arai',\n\t'Vallo',\n\t'Points',\n\t'Buteau',\n\t'Becknell',\n\t'Lue',\n\t'Antos',\n\t'Folkers',\n\t'Galletta',\n\t'Hissong',\n\t'Knoche',\n\t'Kundert',\n\t'Larussa',\n\t'Lobos',\n\t'Poitra',\n\t'Rinn',\n\t'Seamons',\n\t'Senko',\n\t'Villaverde',\n\t'Weatherholt',\n\t'Maliszewski',\n\t'Jurkowski',\n\t'Scism',\n\t'Hallas',\n\t'Collet',\n\t'Capello',\n\t'Lena',\n\t'Popper',\n\t'Aikman',\n\t'Blakes',\n\t'Cadigan',\n\t'Dupler',\n\t'Kazi',\n\t'Masri',\n\t'Matejka',\n\t'Mcgirr',\n\t'Pistone',\n\t'Prenger',\n\t'Ranes',\n\t'Thiemann',\n\t'Voeller',\n\t'Cockman',\n\t'Burtt',\n\t'Looby',\n\t'Bonnie',\n\t'Mcclenny',\n\t'Ridgell',\n\t'Nails',\n\t'Lesane',\n\t'Bertolino',\n\t'Doheny',\n\t'Fechter',\n\t'Holshouser',\n\t'Kierstead',\n\t'Krewson',\n\t'Lanahan',\n\t'Vig',\n\t'Wiswell',\n\t'Freytag',\n\t'Haselden',\n\t'Kuras',\n\t'Navar',\n\t'Raisor',\n\t'Finamore',\n\t'Kipper',\n\t'Morissette',\n\t'Laughton',\n\t'Awe',\n\t'Manier',\n\t'Cumby',\n\t'Cabada',\n\t'Hafen',\n\t'Kojima',\n\t'Massari',\n\t'Mctague',\n\t'Stehr',\n\t'Vandevelde',\n\t'Voong',\n\t'Wisely',\n\t'Girardin',\n\t'Bies',\n\t'Demaris',\n\t'Galles',\n\t'Goldstone',\n\t'Kai',\n\t'Cord',\n\t'Brigance',\n\t'Gomillion',\n\t'Drakes',\n\t'Bartkowiak',\n\t'Chica',\n\t'Draheim',\n\t'Honeyman',\n\t'Klapper',\n\t'Kniffen',\n\t'Knoblock',\n\t'Scherzer',\n\t'Tougas',\n\t'Toyama',\n\t'Urbach',\n\t'Walia',\n\t'Wattenbarger',\n\t'Marz',\n\t'Cesare',\n\t'Miro',\n\t'Kervin',\n\t'Godard',\n\t'Beiter',\n\t'Betcher',\n\t'Evarts',\n\t'Evensen',\n\t'Gaff',\n\t'Griffitts',\n\t'Grunden',\n\t'Hoffart',\n\t'Kroupa',\n\t'Maiers',\n\t'Mckendry',\n\t'Puett',\n\t'Shoe',\n\t'Stermer',\n\t'Wineinger',\n\t'Brocious',\n\t'Chudy',\n\t'Spofford',\n\t'Wessinger',\n\t'Weich',\n\t'Croff',\n\t'Ephraim',\n\t'Sallis',\n\t'Blasco',\n\t'Burningham',\n\t'Buschmann',\n\t'Forget',\n\t'Kulak',\n\t'Panozzo',\n\t'Pierpont',\n\t'Priolo',\n\t'Puhl',\n\t'Ruffolo',\n\t'Voisine',\n\t'Mancinelli',\n\t'Santacroce',\n\t'Vanvalkenburgh',\n\t'Veverka',\n\t'Desena',\n\t'Agner',\n\t'Boron',\n\t'Wheeling',\n\t'Plato',\n\t'Tonge',\n\t'Deibel',\n\t'Herriman',\n\t'Holroyd',\n\t'Huitron',\n\t'Hum',\n\t'Kreamer',\n\t'Lada',\n\t'Lucena',\n\t'Pao',\n\t'Planck',\n\t'Vanroekel',\n\t'Bodell',\n\t'Francia',\n\t'Anastasia',\n\t'Haxton',\n\t'Maile',\n\t'Warning',\n\t'Labeau',\n\t'Pujol',\n\t'Done',\n\t'Minney',\n\t'Hogsett',\n\t'Tayler',\n\t'Delancy',\n\t'Philson',\n\t'Allemand',\n\t'Buhrman',\n\t'Diefenbach',\n\t'Gawel',\n\t'Kovacic',\n\t'Kralik',\n\t'Lazor',\n\t'Mcnemar',\n\t'Warth',\n\t'Glanzer',\n\t'Keep',\n\t'Hochstein',\n\t'Febles',\n\t'Morneau',\n\t'Agostinelli',\n\t'Galeas',\n\t'Landen',\n\t'Lion',\n\t'Attwood',\n\t'Capshaw',\n\t'Willy',\n\t'Dekle',\n\t'Murrill',\n\t'Coby',\n\t'Falvo',\n\t'Kanagy',\n\t'Mihalko',\n\t'Schellenberg',\n\t'Sugimoto',\n\t'Lippard',\n\t'Sardo',\n\t'Suckow',\n\t'Demichele',\n\t'Kath',\n\t'Lappe',\n\t'Lego',\n\t'Schleifer',\n\t'Vold',\n\t'Kingsland',\n\t'Mitch',\n\t'Manlove',\n\t'Cuozzo',\n\t'Dauber',\n\t'Deininger',\n\t'Goldbach',\n\t'Halfmann',\n\t'Kazarian',\n\t'Marksberry',\n\t'Marzec',\n\t'Mcmurphy',\n\t'Oregan',\n\t'Paczkowski',\n\t'Pinsky',\n\t'Poynor',\n\t'Schertz',\n\t'Tetrick',\n\t'Umali',\n\t'Valenza',\n\t'Witherington',\n\t'Kesselring',\n\t'Nylund',\n\t'Cinnamon',\n\t'Rielly',\n\t'Surman',\n\t'Fowle',\n\t'Hains',\n\t'Sharlow',\n\t'Lones',\n\t'Durgan',\n\t'Savory',\n\t'Minger',\n\t'Okon',\n\t'Berends',\n\t'Binning',\n\t'Malina',\n\t'Loeser',\n\t'Marthaler',\n\t'Pacella',\n\t'Vasta',\n\t'Hinerman',\n\t'Goodchild',\n\t'Chuck',\n\t'Linney',\n\t'Beckworth',\n\t'Carrie',\n\t'Lovings',\n\t'Ginyard',\n\t'Bredeson',\n\t'Debiase',\n\t'Gorder',\n\t'Noce',\n\t'Redlin',\n\t'Schwinn',\n\t'Zins',\n\t'Burtner',\n\t'Kosakowski',\n\t'Erler',\n\t'Altom',\n\t'Husman',\n\t'Markos',\n\t'Thorman',\n\t'Fagen',\n\t'Voisin',\n\t'Gauldin',\n\t'Pressey',\n\t'Calbert',\n\t'Holness',\n\t'Alspach',\n\t'Broeker',\n\t'Danziger',\n\t'Klenke',\n\t'Popescu',\n\t'Schoenrock',\n\t'Schreckengost',\n\t'Syme',\n\t'Trick',\n\t'Plautz',\n\t'Beckel',\n\t'Dealmeida',\n\t'Winne',\n\t'Moron',\n\t'Seed',\n\t'Capozzoli',\n\t'Gawron',\n\t'Kobel',\n\t'Kouns',\n\t'Nunemaker',\n\t'Steinbacher',\n\t'Stookey',\n\t'Vidana',\n\t'Zoch',\n\t'Ohlinger',\n\t'Hudkins',\n\t'Ferren',\n\t'Gille',\n\t'Sheckler',\n\t'Kittell',\n\t'Roath',\n\t'Ziglar',\n\t'Brecher',\n\t'Coldren',\n\t'Degraaf',\n\t'Eddinger',\n\t'Joffe',\n\t'Luthy',\n\t'Metzinger',\n\t'Nayak',\n\t'Paule',\n\t'Prudente',\n\t'Wooddell',\n\t'Zuccaro',\n\t'Rineer',\n\t'Soos',\n\t'Manka',\n\t'Vandervoort',\n\t'Kitchell',\n\t'Casserly',\n\t'Watchman',\n\t'Poteete',\n\t'Dopson',\n\t'Mathurin',\n\t'Cataldi',\n\t'Crepeau',\n\t'Fackrell',\n\t'Goben',\n\t'Macinnes',\n\t'Scherf',\n\t'Shaddix',\n\t'Sorber',\n\t'Teichman',\n\t'Wydra',\n\t'Holzworth',\n\t'Baade',\n\t'Tinnell',\n\t'Tinkler',\n\t'Mauzy',\n\t'Alphonse',\n\t'Fullard',\n\t'Adger',\n\t'Akiyama',\n\t'Bloxham',\n\t'Coultas',\n\t'Esler',\n\t'Giebel',\n\t'Goswick',\n\t'Heikes',\n\t'Javed',\n\t'Linan',\n\t'Mooers',\n\t'Nemetz',\n\t'Pradhan',\n\t'Rainone',\n\t'Romito',\n\t'Treichel',\n\t'Vohs',\n\t'Grosskopf',\n\t'Weisinger',\n\t'Ruple',\n\t'Naff',\n\t'Meaders',\n\t'Lamarr',\n\t'Toppin',\n\t'Apicella',\n\t'Beecroft',\n\t'Boshears',\n\t'Breier',\n\t'Cuadros',\n\t'Umbarger',\n\t'Alioto',\n\t'Ravenscroft',\n\t'Vesper',\n\t'Oak',\n\t'Tigges',\n\t'Simmer',\n\t'Hanby',\n\t'Webre',\n\t'Lenk',\n\t'Mcelvain',\n\t'Boy',\n\t'Debarros',\n\t'Hickenbottom',\n\t'Quincy',\n\t'Billips',\n\t'Ollison',\n\t'Barbuto',\n\t'Clearwater',\n\t'Cronkhite',\n\t'Groleau',\n\t'Mehra',\n\t'Tessler',\n\t'Kegel',\n\t'Borenstein',\n\t'Newnam',\n\t'Crofton',\n\t'Phenix',\n\t'Dankert',\n\t'Hymas',\n\t'Lobel',\n\t'Marszalek',\n\t'Moceri',\n\t'Ottaviano',\n\t'Papazian',\n\t'Roedel',\n\t'Jochum',\n\t'Urquidez',\n\t'Lapin',\n\t'Garro',\n\t'Lamond',\n\t'Sessums',\n\t'Tooke',\n\t'Steadham',\n\t'Azam',\n\t'Bleier',\n\t'Buelna',\n\t'Bupp',\n\t'Burridge',\n\t'Derderian',\n\t'Derstine',\n\t'Halberg',\n\t'Katzer',\n\t'Meegan',\n\t'Ortmann',\n\t'Herschberger',\n\t'Sanroman',\n\t'Winiarski',\n\t'Alcon',\n\t'Picker',\n\t'Demille',\n\t'Huron',\n\t'Hankin',\n\t'Dahmen',\n\t'Fronczak',\n\t'Klingman',\n\t'Perugini',\n\t'Pettinato',\n\t'Powelson',\n\t'Saffer',\n\t'Schwenke',\n\t'Pals',\n\t'Estremera',\n\t'Sofia',\n\t'Arvelo',\n\t'Terrero',\n\t'Bankes',\n\t'Sais',\n\t'Netherland',\n\t'Odeh',\n\t'Sutphen',\n\t'Caddy',\n\t'Dorval',\n\t'Glaude',\n\t'Mcadory',\n\t'Eichinger',\n\t'Lesniewski',\n\t'Petito',\n\t'Pfohl',\n\t'Presler',\n\t'Rys',\n\t'Sano',\n\t'Willenborg',\n\t'Seppala',\n\t'Shibley',\n\t'Cajigas',\n\t'Gal',\n\t'Farag',\n\t'Pickles',\n\t'Rump',\n\t'Grills',\n\t'Mikes',\n\t'Adderley',\n\t'Altland',\n\t'Araki',\n\t'Beitz',\n\t'Brotzman',\n\t'Buonocore',\n\t'Fayard',\n\t'Gelber',\n\t'Jurewicz',\n\t'Lezcano',\n\t'Marsteller',\n\t'Minarik',\n\t'Opsahl',\n\t'Pranger',\n\t'Tiburcio',\n\t'Zollo',\n\t'Engh',\n\t'Henault',\n\t'Barrineau',\n\t'Pilkinton',\n\t'Pratte',\n\t'Niland',\n\t'Warda',\n\t'Southwood',\n\t'Clinch',\n\t'Halsell',\n\t'Mccaa',\n\t'Isreal',\n\t'Pinkett',\n\t'Asch',\n\t'Beauchesne',\n\t'Bruemmer',\n\t'Doebler',\n\t'Ehlinger',\n\t'Goelz',\n\t'Hashemi',\n\t'Karel',\n\t'Magiera',\n\t'Martorano',\n\t'Mooneyhan',\n\t'Cibrian',\n\t'Cavey',\n\t'Kosko',\n\t'Christo',\n\t'Cockrill',\n\t'Mansker',\n\t'Balls',\n\t'Degree',\n\t'Tiggs',\n\t'Alberico',\n\t'Clugston',\n\t'Elman',\n\t'Frueh',\n\t'Kampf',\n\t'Kochanski',\n\t'Leider',\n\t'Marsella',\n\t'Mckendree',\n\t'Moffa',\n\t'Quattrocchi',\n\t'Raval',\n\t'Snoke',\n\t'Akopyan',\n\t'Barrilleaux',\n\t'Cambria',\n\t'Kawaguchi',\n\t'Bonde',\n\t'Dawdy',\n\t'Willig',\n\t'Kazee',\n\t'Debow',\n\t'Beachum',\n\t'Vicks',\n\t'Aurelio',\n\t'Barocio',\n\t'Bonesteel',\n\t'Ezzo',\n\t'Gesell',\n\t'Krzeminski',\n\t'Madan',\n\t'Magda',\n\t'Manring',\n\t'Mcfaul',\n\t'Morera',\n\t'Purinton',\n\t'Retzer',\n\t'Schonfeld',\n\t'Staszak',\n\t'Stubbe',\n\t'Talerico',\n\t'Wikoff',\n\t'Zia',\n\t'Seyfried',\n\t'Diangelo',\n\t'Keach',\n\t'Shipton',\n\t'Shewmake',\n\t'Behrmann',\n\t'Hopps',\n\t'Paster',\n\t'Augenstein',\n\t'Castaldi',\n\t'Ferrufino',\n\t'Gregersen',\n\t'Hosseini',\n\t'Keniston',\n\t'Nadolski',\n\t'Ouimette',\n\t'Pellett',\n\t'Riebel',\n\t'Schwark',\n\t'Spelman',\n\t'Tesar',\n\t'Yahn',\n\t'Grossnickle',\n\t'Rosillo',\n\t'Dostie',\n\t'Noa',\n\t'Khalaf',\n\t'Cardosa',\n\t'Afzal',\n\t'Mercure',\n\t'Wheless',\n\t'Tailor',\n\t'Mcgarrah',\n\t'Miler',\n\t'Norfolk',\n\t'Crapps',\n\t'Dansereau',\n\t'Jenney',\n\t'Keast',\n\t'Lieser',\n\t'Mihm',\n\t'Porco',\n\t'Zelinsky',\n\t'Sleeth',\n\t'Mcelreath',\n\t'Hemann',\n\t'Capaldi',\n\t'Huggett',\n\t'Reagle',\n\t'Mayotte',\n\t'Liller',\n\t'Leen',\n\t'Demmer',\n\t'Tunison',\n\t'Woodbridge',\n\t'Haymes',\n\t'Cunning',\n\t'Blaze',\n\t'Eatman',\n\t'Ulysse',\n\t'Bagshaw',\n\t'Buczkowski',\n\t'Cardello',\n\t'Decola',\n\t'Diloreto',\n\t'Evola',\n\t'Glassburn',\n\t'Hazelbaker',\n\t'Holycross',\n\t'Minasian',\n\t'Regula',\n\t'Ruge',\n\t'Uhlman',\n\t'Lamprecht',\n\t'Shifflet',\n\t'Weikle',\n\t'Coupe',\n\t'Isherwood',\n\t'Dimon',\n\t'Pop',\n\t'Willhoite',\n\t'Bari',\n\t'Boise',\n\t'Doom',\n\t'Mccolley',\n\t'Bircher',\n\t'Wannamaker',\n\t'Eppes',\n\t'Pea',\n\t'Okeke',\n\t'Alpizar',\n\t'Arista',\n\t'Barbagallo',\n\t'Baumert',\n\t'Bhattacharya',\n\t'Gheen',\n\t'Hutchcraft',\n\t'Karlen',\n\t'Klier',\n\t'Ladnier',\n\t'Marrujo',\n\t'Reister',\n\t'Rorrer',\n\t'Tarpey',\n\t'Wisecarver',\n\t'Beydoun',\n\t'Fillinger',\n\t'Kemnitz',\n\t'Takata',\n\t'Leight',\n\t'Kross',\n\t'Junco',\n\t'Holmer',\n\t'Sando',\n\t'Biddix',\n\t'Dawood',\n\t'Frisco',\n\t'Flagler',\n\t'Arntz',\n\t'Bache',\n\t'Bundrick',\n\t'Glasson',\n\t'Los',\n\t'Scheiber',\n\t'Shellenbarger',\n\t'Steinmeyer',\n\t'Sura',\n\t'Tanski',\n\t'Teodoro',\n\t'Vanaken',\n\t'Jodoin',\n\t'Klinker',\n\t'Szydlowski',\n\t'Yamashiro',\n\t'Kutch',\n\t'Hoth',\n\t'Edwardson',\n\t'Gess',\n\t'Mohamad',\n\t'Goodine',\n\t'Carolina',\n\t'Blauser',\n\t'Emerich',\n\t'Flook',\n\t'Graul',\n\t'Gribben',\n\t'Herbold',\n\t'Kreutz',\n\t'Lavey',\n\t'Lukacs',\n\t'Maiorana',\n\t'Openshaw',\n\t'Plattner',\n\t'Sauro',\n\t'Schardt',\n\t'Tortorici',\n\t'Wendlandt',\n\t'Danowski',\n\t'Mcnellis',\n\t'Pinkowski',\n\t'Linz',\n\t'Virga',\n\t'Jardin',\n\t'Maclaughlin',\n\t'Rama',\n\t'Deline',\n\t'Kimbel',\n\t'Hagin',\n\t'Pottinger',\n\t'Detmer',\n\t'Ferrone',\n\t'Matthiesen',\n\t'Melchert',\n\t'Ruehl',\n\t'Takach',\n\t'Briese',\n\t'Elmendorf',\n\t'Valentini',\n\t'Hersom',\n\t'Bordeau',\n\t'Linsley',\n\t'Keatts',\n\t'Dina',\n\t'Boye',\n\t'Riviere',\n\t'Stodghill',\n\t'Madry',\n\t'Angelos',\n\t'Bou',\n\t'Ketterling',\n\t'Niemczyk',\n\t'Pardini',\n\t'Rippel',\n\t'Schieffer',\n\t'Schnee',\n\t'Shogren',\n\t'Sholl',\n\t'Ullmann',\n\t'Ure',\n\t'Curless',\n\t'Gonnella',\n\t'Tholen',\n\t'Valladolid',\n\t'Silbernagel',\n\t'Cohrs',\n\t'Shahin',\n\t'Beth',\n\t'Holmen',\n\t'Tippie',\n\t'Opie',\n\t'Sprowl',\n\t'Byam',\n\t'Bethany',\n\t'Saintil',\n\t'Auriemma',\n\t'Blust',\n\t'Dibello',\n\t'Digangi',\n\t'Farnam',\n\t'Farnan',\n\t'Linford',\n\t'Mcgroarty',\n\t'Meisenheimer',\n\t'Pagels',\n\t'Sauber',\n\t'Schwalbe',\n\t'Seemann',\n\t'Slivka',\n\t'Twardowski',\n\t'Wickey',\n\t'Zettler',\n\t'Zuchowski',\n\t'Feldhaus',\n\t'Baldock',\n\t'Cowman',\n\t'Carp',\n\t'Camera',\n\t'Balon',\n\t'Neveu',\n\t'Caminiti',\n\t'Carreira',\n\t'Gura',\n\t'Hershkowitz',\n\t'Killoran',\n\t'Narducci',\n\t'Reigel',\n\t'Saccone',\n\t'Tomasi',\n\t'Wieneke',\n\t'Sibrian',\n\t'Hashem',\n\t'Kellems',\n\t'Stouder',\n\t'Villamar',\n\t'Piette',\n\t'Wand',\n\t'Battey',\n\t'Staunton',\n\t'Bedore',\n\t'Hanel',\n\t'Jutras',\n\t'Kanner',\n\t'Mathiesen',\n\t'Northway',\n\t'Privitera',\n\t'Reichelt',\n\t'Zucco',\n\t'Roys',\n\t'Aderholt',\n\t'Lampson',\n\t'Olen',\n\t'Mcgarr',\n\t'Schools',\n\t'Leaphart',\n\t'Lykes',\n\t'Brightbill',\n\t'Koos',\n\t'Lahue',\n\t'Laplaca',\n\t'Naqvi',\n\t'Novo',\n\t'Puerta',\n\t'Siers',\n\t'Strutz',\n\t'Trimboli',\n\t'Waldie',\n\t'Goold',\n\t'Falke',\n\t'Corter',\n\t'Cartmell',\n\t'Brazel',\n\t'Farabee',\n\t'Majeed',\n\t'Hilden',\n\t'Kealoha',\n\t'Neider',\n\t'Parodi',\n\t'Rizza',\n\t'Rong',\n\t'Silberstein',\n\t'Snellgrove',\n\t'Trojanowski',\n\t'Warneke',\n\t'Wissler',\n\t'Yiu',\n\t'Grein',\n\t'Sak',\n\t'Daines',\n\t'Monzo',\n\t'Emmerson',\n\t'Lorraine',\n\t'Samaroo',\n\t'Edmund',\n\t'Cacace',\n\t'Dornan',\n\t'Eyman',\n\t'Hovanec',\n\t'Jeschke',\n\t'Limberg',\n\t'Maturo',\n\t'Pandey',\n\t'Somoza',\n\t'Streiff',\n\t'Wiemer',\n\t'Zablocki',\n\t'Crace',\n\t'Leinen',\n\t'Rucci',\n\t'Blyth',\n\t'Clemans',\n\t'Magid',\n\t'Ferrick',\n\t'Garriga',\n\t'Martir',\n\t'Tanton',\n\t'Hoon',\n\t'Echard',\n\t'Borrell',\n\t'Howden',\n\t'Gravett',\n\t'Lando',\n\t'Amacher',\n\t'Dalman',\n\t'Hollenbaugh',\n\t'Sigrist',\n\t'Tamashiro',\n\t'Therriault',\n\t'Villafranca',\n\t'Matthys',\n\t'Salois',\n\t'Sforza',\n\t'Swager',\n\t'Borah',\n\t'Sentell',\n\t'Besson',\n\t'Ghani',\n\t'Bilinski',\n\t'Holzinger',\n\t'Kus',\n\t'Lobianco',\n\t'Morawski',\n\t'Perz',\n\t'Sada',\n\t'Wollenberg',\n\t'Yusko',\n\t'Caughron',\n\t'Diffenderfer',\n\t'Slowinski',\n\t'Skiver',\n\t'Galland',\n\t'Hodes',\n\t'Boyne',\n\t'Towry',\n\t'Alers',\n\t'Hellums',\n\t'Certain',\n\t'Megginson',\n\t'Creer',\n\t'Coutee',\n\t'Strothers',\n\t'Stfleur',\n\t'Barga',\n\t'Bina',\n\t'Cellini',\n\t'Digiulio',\n\t'Douma',\n\t'Klement',\n\t'Mccambridge',\n\t'Parmeter',\n\t'Presto',\n\t'Salmi',\n\t'Seabaugh',\n\t'Barreda',\n\t'Nepomuceno',\n\t'Zent',\n\t'Yonce',\n\t'Loreto',\n\t'Honer',\n\t'Conquest',\n\t'Gathings',\n\t'Wims',\n\t'Upshur',\n\t'Aeschliman',\n\t'Casaus',\n\t'Dumke',\n\t'Earlywine',\n\t'Ferreyra',\n\t'Heyne',\n\t'Hudon',\n\t'Kuder',\n\t'Malia',\n\t'Brueckner',\n\t'Luchsinger',\n\t'Ornellas',\n\t'Ramseyer',\n\t'Weidemann',\n\t'Walbert',\n\t'Zola',\n\t'Linquist',\n\t'Storts',\n\t'Dente',\n\t'Lebleu',\n\t'Stockham',\n\t'Rollinson',\n\t'Auzenne',\n\t'Abebe',\n\t'Bartol',\n\t'Cozzolino',\n\t'Der',\n\t'Fata',\n\t'Gorr',\n\t'Janousek',\n\t'Moschella',\n\t'Riedy',\n\t'Dust',\n\t'Malmgren',\n\t'Puterbaugh',\n\t'Sacchetti',\n\t'Lascano',\n\t'Begnaud',\n\t'Duling',\n\t'Porteous',\n\t'Debnam',\n\t'Abron',\n\t'Delehanty',\n\t'Fazenbaker',\n\t'Flener',\n\t'Gora',\n\t'Herter',\n\t'Johann',\n\t'Keiter',\n\t'Lucca',\n\t'Passman',\n\t'Saindon',\n\t'Schoppe',\n\t'Skibinski',\n\t'Stueber',\n\t'Tegeler',\n\t'Jochim',\n\t'Buttner',\n\t'Crilly',\n\t'Swanton',\n\t'Muncey',\n\t'Negrin',\n\t'Thorburn',\n\t'Delpino',\n\t'Kinn',\n\t'Gaiter',\n\t'Obi',\n\t'Hohensee',\n\t'Rollman',\n\t'Scheff',\n\t'Shor',\n\t'Tumbleson',\n\t'Mccrum',\n\t'Knack',\n\t'Llano',\n\t'Saber',\n\t'Rosman',\n\t'Bankson',\n\t'Atkisson',\n\t'Kennel',\n\t'Cammon',\n\t'Bangura',\n\t'Cichy',\n\t'Gillikin',\n\t'Hiltner',\n\t'Lubben',\n\t'Mcqueeney',\n\t'Nasca',\n\t'Nordgren',\n\t'Ostermann',\n\t'Quito',\n\t'Sakowski',\n\t'Schut',\n\t'Stobaugh',\n\t'Alessio',\n\t'Gorelik',\n\t'Heinzman',\n\t'Westrich',\n\t'Nardella',\n\t'Cruzado',\n\t'Lansberry',\n\t'Dubreuil',\n\t'Nylander',\n\t'Rabel',\n\t'Moret',\n\t'Crout',\n\t'Ardrey',\n\t'Rolley',\n\t'Finks',\n\t'Cliett',\n\t'Caito',\n\t'Clingenpeel',\n\t'Delprete',\n\t'Dolen',\n\t'Heidrich',\n\t'Hinrichsen',\n\t'Jindra',\n\t'Madej',\n\t'Panzarella',\n\t'Sandin',\n\t'Seekins',\n\t'Shilts',\n\t'Sokoloff',\n\t'Maggart',\n\t'Pigman',\n\t'Travieso',\n\t'Denbow',\n\t'Dollison',\n\t'Gaye',\n\t'Binette',\n\t'Dutta',\n\t'Grandinetti',\n\t'Kitch',\n\t'Tangeman',\n\t'Finstad',\n\t'Rodkey',\n\t'Servis',\n\t'Tiwari',\n\t'Rodd',\n\t'Parfait',\n\t'Seck',\n\t'Delaurentis',\n\t'Dragan',\n\t'Fleig',\n\t'Giacobbe',\n\t'Hilligoss',\n\t'Kroh',\n\t'Lippe',\n\t'Maleski',\n\t'Perini',\n\t'Rutten',\n\t'Stauss',\n\t'Yoshikawa',\n\t'Dibattista',\n\t'Gilsdorf',\n\t'Riemenschneider',\n\t'Streck',\n\t'Gessler',\n\t'Springstead',\n\t'Zaki',\n\t'Lambie',\n\t'Barczak',\n\t'Ellerbrock',\n\t'Foresman',\n\t'Holstine',\n\t'Lemm',\n\t'Santillana',\n\t'Trautwein',\n\t'Unsworth',\n\t'Valderas',\n\t'Vaquero',\n\t'Vetsch',\n\t'Wadleigh',\n\t'Yonts',\n\t'Mcguiness',\n\t'Auvil',\n\t'Leeder',\n\t'Sprowls',\n\t'Cala',\n\t'Portalatin',\n\t'Casso',\n\t'Chirinos',\n\t'Less',\n\t'Baltzell',\n\t'Bo',\n\t'Whetsell',\n\t'Ledlow',\n\t'Fullbright',\n\t'Arnell',\n\t'Stainback',\n\t'Mcleish',\n\t'Lyn',\n\t'Bermeo',\n\t'Billet',\n\t'Craun',\n\t'Gladwell',\n\t'Goral',\n\t'Herbig',\n\t'Kluver',\n\t'Mermelstein',\n\t'Odette',\n\t'Poggi',\n\t'Schacher',\n\t'Thielman',\n\t'Cianciolo',\n\t'Ferrie',\n\t'Kapusta',\n\t'Kreager',\n\t'Messineo',\n\t'Rovira',\n\t'Stricklen',\n\t'Wansley',\n\t'Amell',\n\t'Baena',\n\t'Depaula',\n\t'Fickett',\n\t'Housewright',\n\t'Kreiger',\n\t'Legate',\n\t'Lutterman',\n\t'Men',\n\t'Pautz',\n\t'Swecker',\n\t'Tantillo',\n\t'Dudeck',\n\t'Bellas',\n\t'Marian',\n\t'Bienvenu',\n\t'Riden',\n\t'Hosein',\n\t'Couser',\n\t'Batterton',\n\t'Desantos',\n\t'Dieterle',\n\t'Drabek',\n\t'Grennan',\n\t'Greulich',\n\t'Ludlam',\n\t'Maltos',\n\t'Marcin',\n\t'Ostertag',\n\t'Rednour',\n\t'Tippetts',\n\t'Updyke',\n\t'Ormsbee',\n\t'Reutter',\n\t'Uyehara',\n\t'Musumeci',\n\t'Antonini',\n\t'Thistle',\n\t'Marcia',\n\t'Renne',\n\t'Jines',\n\t'Dorothy',\n\t'Menter',\n\t'Crosser',\n\t'Ditommaso',\n\t'Glueck',\n\t'Malta',\n\t'Mcgranahan',\n\t'Mensing',\n\t'Ostroff',\n\t'Rota',\n\t'Rothfuss',\n\t'Borcherding',\n\t'Haveman',\n\t'Swallows',\n\t'Heltzel',\n\t'Aloi',\n\t'Stipp',\n\t'Broda',\n\t'Darter',\n\t'Gressett',\n\t'Brasier',\n\t'Lana',\n\t'Crooke',\n\t'Seegers',\n\t'Sirmons',\n\t'Berberian',\n\t'Goers',\n\t'Losch',\n\t'Memon',\n\t'Paternoster',\n\t'Rierson',\n\t'Miyake',\n\t'Barndt',\n\t'Kirstein',\n\t'Azua',\n\t'Zeck',\n\t'Britain',\n\t'Lanman',\n\t'Gorges',\n\t'Clock',\n\t'Alman',\n\t'Callicutt',\n\t'Walford',\n\t'Searight',\n\t'Eakle',\n\t'Federici',\n\t'Hosack',\n\t'Jarecki',\n\t'Kauffmann',\n\t'Maras',\n\t'Nisley',\n\t'Sandahl',\n\t'Shidler',\n\t'Wnek',\n\t'Moneymaker',\n\t'Santander',\n\t'Schneeberger',\n\t'Luviano',\n\t'Gorin',\n\t'Negus',\n\t'Coulston',\n\t'Polin',\n\t'Winslett',\n\t'Anstett',\n\t'Cowsert',\n\t'Dipiazza',\n\t'Fitting',\n\t'Forslund',\n\t'Poquette',\n\t'Tibbets',\n\t'Tomasini',\n\t'Toor',\n\t'Starry',\n\t'Venema',\n\t'Cedano',\n\t'Carro',\n\t'Samons',\n\t'Matty',\n\t'Ellenwood',\n\t'Kilcrease',\n\t'Noblin',\n\t'Decatur',\n\t'Heckard',\n\t'Nard',\n\t'Beighley',\n\t'Delamater',\n\t'Eblen',\n\t'Heninger',\n\t'Kehn',\n\t'Rotunno',\n\t'Uppal',\n\t'Hynek',\n\t'Zenk',\n\t'Brasil',\n\t'Mu',\n\t'Julio',\n\t'Cassar',\n\t'Crisco',\n\t'Oriley',\n\t'Turton',\n\t'Goens',\n\t'Cargo',\n\t'Toure',\n\t'Breitbach',\n\t'Cahalan',\n\t'Chadha',\n\t'Kittinger',\n\t'Marnell',\n\t'Masias',\n\t'Matousek',\n\t'Mittal',\n\t'Nieblas',\n\t'Onan',\n\t'Purdum',\n\t'Tursi',\n\t'Esplin',\n\t'Etsitty',\n\t'Fratto',\n\t'Przybyla',\n\t'Cassin',\n\t'Nitti',\n\t'Arshad',\n\t'Sandoz',\n\t'Walzer',\n\t'Everton',\n\t'Russum',\n\t'Morland',\n\t'Fennel',\n\t'Viel',\n\t'Jarrells',\n\t'Vassell',\n\t'Frigo',\n\t'Kodama',\n\t'Naron',\n\t'Oelke',\n\t'Remaley',\n\t'Shean',\n\t'Cloonan',\n\t'Clayman',\n\t'Lasch',\n\t'Lepard',\n\t'Rewis',\n\t'Vankeuren',\n\t'Lightbody',\n\t'Houseworth',\n\t'Caison',\n\t'Denmon',\n\t'Rauls',\n\t'Sallie',\n\t'Humphery',\n\t'Showell',\n\t'Raysor',\n\t'Angotti',\n\t'Barbero',\n\t'Buxbaum',\n\t'Capella',\n\t'Horsch',\n\t'Kunselman',\n\t'Nishikawa',\n\t'Perotti',\n\t'Sprung',\n\t'Szucs',\n\t'Emch',\n\t'Kotula',\n\t'Mendizabal',\n\t'Yeaman',\n\t'Beste',\n\t'Kader',\n\t'Forker',\n\t'Wiggers',\n\t'Cotham',\n\t'Primo',\n\t'Fetterhoff',\n\t'Giarrusso',\n\t'Glosser',\n\t'Lumbreras',\n\t'Rosano',\n\t'Strohecker',\n\t'Wanek',\n\t'Waycaster',\n\t'Worthley',\n\t'Salasar',\n\t'Boulos',\n\t'Pulsipher',\n\t'Scheider',\n\t'Lorimer',\n\t'Alamilla',\n\t'Zapp',\n\t'Deis',\n\t'Tariq',\n\t'Kasey',\n\t'Famiglietti',\n\t'Flansburg',\n\t'Georgiou',\n\t'Groft',\n\t'Heistand',\n\t'Merker',\n\t'Stoeckel',\n\t'Tackitt',\n\t'Verbeck',\n\t'Weyers',\n\t'Wiltrout',\n\t'Brabec',\n\t'Caligiuri',\n\t'Dudzinski',\n\t'Grieger',\n\t'Benfer',\n\t'Pesta',\n\t'Wool',\n\t'Sunshine',\n\t'Oka',\n\t'Stamour',\n\t'Barrio',\n\t'Mathe',\n\t'Vanduyne',\n\t'Brager',\n\t'Mcphatter',\n\t'Ahluwalia',\n\t'Borys',\n\t'Dreibelbis',\n\t'Kalmbach',\n\t'Karwoski',\n\t'Moomaw',\n\t'Youngren',\n\t'Offerman',\n\t'Nine',\n\t'Symington',\n\t'Branan',\n\t'Turberville',\n\t'Heber',\n\t'Loughridge',\n\t'Vanderberg',\n\t'Mccannon',\n\t'Linda',\n\t'Dupee',\n\t'Cottom',\n\t'Mcphearson',\n\t'Razor',\n\t'Buchwald',\n\t'Fraze',\n\t'Grannis',\n\t'Krolikowski',\n\t'Lapidus',\n\t'Madruga',\n\t'Mcmartin',\n\t'Quinlivan',\n\t'Riaz',\n\t'Spittler',\n\t'Zahm',\n\t'Zender',\n\t'Eisman',\n\t'Hourihan',\n\t'Shirazi',\n\t'Herendeen',\n\t'Perdew',\n\t'Pendell',\n\t'Chernoff',\n\t'Lyell',\n\t'Clarey',\n\t'Macken',\n\t'Guthridge',\n\t'Redditt',\n\t'Bedi',\n\t'Debenedictis',\n\t'Distel',\n\t'Gapinski',\n\t'Iwanski',\n\t'Medici',\n\t'Schmutz',\n\t'Tuel',\n\t'Verburg',\n\t'Galgano',\n\t'Skogen',\n\t'Aymond',\n\t'Raymo',\n\t'Croney',\n\t'Carry',\n\t'Rhynes',\n\t'Lamour',\n\t'Shedrick',\n\t'Tookes',\n\t'Baltierra',\n\t'Leitzel',\n\t'Letchworth',\n\t'Montesino',\n\t'Preis',\n\t'Sanzone',\n\t'Shantz',\n\t'Teo',\n\t'Twohig',\n\t'Wajda',\n\t'Windisch',\n\t'Zinck',\n\t'Fiero',\n\t'Hornby',\n\t'Paget',\n\t'Serano',\n\t'Rodrick',\n\t'Lewison',\n\t'Dyas',\n\t'Delcarmen',\n\t'Garske',\n\t'Hontz',\n\t'Mcquown',\n\t'Melling',\n\t'Rolando',\n\t'Rosencrans',\n\t'Steichen',\n\t'Teeples',\n\t'Forseth',\n\t'Quijas',\n\t'Schraeder',\n\t'Vaidya',\n\t'Ventre',\n\t'Mountjoy',\n\t'Morr',\n\t'Leviner',\n\t'Paulette',\n\t'Dobie',\n\t'Brue',\n\t'Prier',\n\t'Biffle',\n\t'Neyland',\n\t'Valcourt',\n\t'Mckeithen',\n\t'Lemelle',\n\t'Alviar',\n\t'Auth',\n\t'Bahm',\n\t'Bierbaum',\n\t'Cazier',\n\t'Eschbach',\n\t'Etzler',\n\t'Nowlan',\n\t'Sahota',\n\t'Vanaman',\n\t'Zaugg',\n\t'Hogeland',\n\t'Choat',\n\t'Walmer',\n\t'Cepero',\n\t'Michal',\n\t'Foxwell',\n\t'Decoursey',\n\t'Molyneaux',\n\t'Peat',\n\t'Jeanfrancois',\n\t'Arevalos',\n\t'Bachert',\n\t'Beachler',\n\t'Berrones',\n\t'Clavijo',\n\t'Elsen',\n\t'Fuhs',\n\t'Hooven',\n\t'Johannessen',\n\t'Klausner',\n\t'Masso',\n\t'Puzio',\n\t'Sekula',\n\t'Smyser',\n\t'Stepanian',\n\t'Barg',\n\t'Trueman',\n\t'Constante',\n\t'Cubas',\n\t'Dowers',\n\t'Pratts',\n\t'Cockburn',\n\t'Counce',\n\t'Nappier',\n\t'Lindon',\n\t'Burrowes',\n\t'Cokley',\n\t'Tillmon',\n\t'Bao',\n\t'Inks',\n\t'Liberato',\n\t'Moehring',\n\t'Ryker',\n\t'Sar',\n\t'Swartzendruber',\n\t'Torgersen',\n\t'Treto',\n\t'Tungate',\n\t'Ricotta',\n\t'Weesner',\n\t'Willyard',\n\t'Callicoat',\n\t'Hoque',\n\t'Atkison',\n\t'Mcwherter',\n\t'Dubuisson',\n\t'Wanzer',\n\t'Stradford',\n\t'Abruzzo',\n\t'Amerman',\n\t'Bame',\n\t'Bantz',\n\t'Bleakley',\n\t'Galt',\n\t'Hoobler',\n\t'Jaquith',\n\t'Lessman',\n\t'Polinski',\n\t'Rasche',\n\t'Roeber',\n\t'Rubright',\n\t'Sarnowski',\n\t'Signore',\n\t'Solum',\n\t'Vankampen',\n\t'Vath',\n\t'Malmquist',\n\t'Mittelstadt',\n\t'Belyea',\n\t'Haverty',\n\t'Wickett',\n\t'Sansing',\n\t'Yeatman',\n\t'Brocker',\n\t'Wonders',\n\t'Both',\n\t'Rabun',\n\t'Rocke',\n\t'Meachum',\n\t'Blane',\n\t'Lapsley',\n\t'Biswas',\n\t'Derocher',\n\t'Haran',\n\t'Hehn',\n\t'Keshishian',\n\t'Kniffin',\n\t'Lacina',\n\t'Skolnik',\n\t'Spiewak',\n\t'Wileman',\n\t'Eble',\n\t'Kraynak',\n\t'Wiesen',\n\t'Micheli',\n\t'Scroggin',\n\t'Roch',\n\t'Denise',\n\t'Altenburg',\n\t'Hornstein',\n\t'Netto',\n\t'Opel',\n\t'Passey',\n\t'Roeske',\n\t'Schrantz',\n\t'Abrahamsen',\n\t'Powless',\n\t'Callais',\n\t'Desjardin',\n\t'Pirro',\n\t'Yonkers',\n\t'Macallister',\n\t'Dady',\n\t'Ruskin',\n\t'Escott',\n\t'Abbot',\n\t'Sankar',\n\t'Bolar',\n\t'Angelucci',\n\t'Biegel',\n\t'Cirone',\n\t'Damewood',\n\t'Flett',\n\t'Kronenberg',\n\t'Ky',\n\t'Nagler',\n\t'Perlstein',\n\t'Saperstein',\n\t'Tenbrink',\n\t'Vana',\n\t'Wnuk',\n\t'Bonnema',\n\t'Schoenecker',\n\t'Pichler',\n\t'Armendarez',\n\t'Oiler',\n\t'Rouch',\n\t'Boas',\n\t'Laracuente',\n\t'Milbourn',\n\t'Summy',\n\t'Counter',\n\t'Gracie',\n\t'Belfield',\n\t'Bynoe',\n\t'Jalloh',\n\t'Blazier',\n\t'Bochenek',\n\t'Broughman',\n\t'Chuong',\n\t'Cregger',\n\t'Estacio',\n\t'Kaleta',\n\t'Lanctot',\n\t'Mish',\n\t'Novosel',\n\t'Passero',\n\t'Ripplinger',\n\t'Vitt',\n\t'Walborn',\n\t'Friscia',\n\t'Memmott',\n\t'Tripi',\n\t'Weinhold',\n\t'Honn',\n\t'Gianni',\n\t'Poch',\n\t'Sagar',\n\t'Markum',\n\t'Primmer',\n\t'Belmore',\n\t'Rain',\n\t'Bevard',\n\t'Skyles',\n\t'Farland',\n\t'Mccleese',\n\t'Teachey',\n\t'Moulden',\n\t'Antolin',\n\t'Augello',\n\t'Borrayo',\n\t'Effler',\n\t'Hornak',\n\t'Hosman',\n\t'Leingang',\n\t'Limbach',\n\t'Oregel',\n\t'Ritzman',\n\t'Rochefort',\n\t'Schimke',\n\t'Stefanelli',\n\t'Vien',\n\t'Zurn',\n\t'Badolato',\n\t'Bieri',\n\t'Clarkin',\n\t'Folino',\n\t'Kelchner',\n\t'Pote',\n\t'Brahm',\n\t'Hoop',\n\t'Macbride',\n\t'Hunting',\n\t'Brule',\n\t'Wainright',\n\t'Rolison',\n\t'Bennie',\n\t'Banghart',\n\t'Bertke',\n\t'Bozzo',\n\t'Gadomski',\n\t'Granberg',\n\t'Kostecki',\n\t'Lemelin',\n\t'Levengood',\n\t'Puskas',\n\t'Swanstrom',\n\t'Willcutt',\n\t'Deitrich',\n\t'Grieves',\n\t'Ferran',\n\t'Boileau',\n\t'Kendra',\n\t'Trippe',\n\t'Mcconnel',\n\t'Cara',\n\t'Stephans',\n\t'Bachus',\n\t'Applin',\n\t'Utsey',\n\t'Auston',\n\t'Arras',\n\t'Bencosme',\n\t'Berntsen',\n\t'Decarolis',\n\t'Dettloff',\n\t'Duerksen',\n\t'Pavlovic',\n\t'Schwantes',\n\t'Sjostrom',\n\t'Sugiyama',\n\t'Sulak',\n\t'Virani',\n\t'Winberg',\n\t'Yoshimoto',\n\t'Comito',\n\t'Pandolfo',\n\t'Cathers',\n\t'Hardisty',\n\t'Collom',\n\t'Wain',\n\t'Worthing',\n\t'Leep',\n\t'Simo',\n\t'Boom',\n\t'Bald',\n\t'Applegarth',\n\t'Gilbreth',\n\t'Griest',\n\t'Jobin',\n\t'Matsuura',\n\t'Misko',\n\t'Scerbo',\n\t'Scheidler',\n\t'Sterba',\n\t'Tomaino',\n\t'Wixson',\n\t'Yadao',\n\t'Hietpas',\n\t'Gruss',\n\t'Fors',\n\t'Gosse',\n\t'Katt',\n\t'Virk',\n\t'Quebedeaux',\n\t'Barkey',\n\t'Salam',\n\t'Willford',\n\t'Tarry',\n\t'Chancy',\n\t'Beynon',\n\t'Eckes',\n\t'Eischen',\n\t'Felger',\n\t'Kimm',\n\t'Labate',\n\t'Mehan',\n\t'Netzer',\n\t'Strosnider',\n\t'Trezza',\n\t'Vial',\n\t'Waugaman',\n\t'Zieman',\n\t'Ankeny',\n\t'Digman',\n\t'Farino',\n\t'Faro',\n\t'Vasconcelos',\n\t'Nevill',\n\t'Rave',\n\t'Sabine',\n\t'Hagg',\n\t'Weightman',\n\t'Berton',\n\t'Fipps',\n\t'Knapper',\n\t'Camel',\n\t'Gilkes',\n\t'Aldous',\n\t'Delucca',\n\t'Dicke',\n\t'Evitts',\n\t'Hachey',\n\t'Rinck',\n\t'Treese',\n\t'Uher',\n\t'Victorio',\n\t'Vignola',\n\t'Willert',\n\t'Baun',\n\t'Wever',\n\t'Varn',\n\t'Yokum',\n\t'Dunk',\n\t'Maben',\n\t'Arzu',\n\t'Guider',\n\t'Bonhomme',\n\t'Majette',\n\t'Crislip',\n\t'Gresko',\n\t'Luppino',\n\t'Posch',\n\t'Potenza',\n\t'Rial',\n\t'Ruderman',\n\t'Shaff',\n\t'Balboni',\n\t'Solheim',\n\t'Mey',\n\t'Sittig',\n\t'Perman',\n\t'Sumners',\n\t'Deaner',\n\t'Keizer',\n\t'Reves',\n\t'Glanville',\n\t'Menzie',\n\t'Mccowen',\n\t'Steib',\n\t'Portee',\n\t'Azad',\n\t'Dallaire',\n\t'Denno',\n\t'Deptula',\n\t'Fischman',\n\t'Guilbault',\n\t'Imperato',\n\t'Koehne',\n\t'Menning',\n\t'Mirelez',\n\t'Stanislawski',\n\t'Streb',\n\t'Sumida',\n\t'Wolke',\n\t'Kerfoot',\n\t'Pirie',\n\t'Saracino',\n\t'Maslanka',\n\t'Slominski',\n\t'Nienaber',\n\t'Serena',\n\t'Kamper',\n\t'Matheis',\n\t'Westin',\n\t'Ishman',\n\t'Biagi',\n\t'Chiou',\n\t'Dieckmann',\n\t'Frieden',\n\t'Huestis',\n\t'Presutti',\n\t'Ribas',\n\t'Siedlecki',\n\t'Steege',\n\t'Uehara',\n\t'Petrosyan',\n\t'Siebold',\n\t'Turi',\n\t'Rady',\n\t'Vanorman',\n\t'Arif',\n\t'Hiland',\n\t'Naidu',\n\t'Clagett',\n\t'Ludy',\n\t'Bodley',\n\t'Avelino',\n\t'Citro',\n\t'Cuda',\n\t'Derbyshire',\n\t'Kruszewski',\n\t'Kupper',\n\t'Mahl',\n\t'Muratore',\n\t'Noecker',\n\t'Osmer',\n\t'Pasquariello',\n\t'Schlick',\n\t'Snover',\n\t'Strzelecki',\n\t'Studt',\n\t'Sunga',\n\t'Belmares',\n\t'Seifried',\n\t'Urioste',\n\t'Housh',\n\t'Babu',\n\t'Bures',\n\t'Augusto',\n\t'Faddis',\n\t'Pun',\n\t'Chopp',\n\t'Tullock',\n\t'Sea',\n\t'Boisseau',\n\t'Herbin',\n\t'Balcer',\n\t'Copus',\n\t'Eichenberger',\n\t'Enterline',\n\t'Gamarra',\n\t'Gursky',\n\t'Hovsepian',\n\t'Laffin',\n\t'Melena',\n\t'Rappe',\n\t'Soma',\n\t'Spira',\n\t'Spraker',\n\t'Teuscher',\n\t'Hochhalter',\n\t'Brenden',\n\t'Snee',\n\t'Polan',\n\t'Hataway',\n\t'Tirey',\n\t'Cobler',\n\t'Marren',\n\t'Ress',\n\t'Bennis',\n\t'Busha',\n\t'Galler',\n\t'Orea',\n\t'Nailor',\n\t'Magby',\n\t'Bridgett',\n\t'Island',\n\t'Camino',\n\t'Coderre',\n\t'Gangloff',\n\t'Gillilan',\n\t'Goergen',\n\t'Henthorne',\n\t'Heverly',\n\t'Loughry',\n\t'Records',\n\t'Schweikert',\n\t'Seeds',\n\t'Vanderwerf',\n\t'Westall',\n\t'Cristiano',\n\t'Biser',\n\t'Cartmill',\n\t'Greenly',\n\t'Kountz',\n\t'Craney',\n\t'Sheffey',\n\t'Gelin',\n\t'Gourdine',\n\t'Canham',\n\t'Edgmon',\n\t'Enz',\n\t'Feldpausch',\n\t'Hestand',\n\t'Kaus',\n\t'Kostelnik',\n\t'Ocanas',\n\t'Riggi',\n\t'Rohl',\n\t'Scheurer',\n\t'Sleeman',\n\t'Tosi',\n\t'Phegley',\n\t'Abelson',\n\t'Mclees',\n\t'Sinor',\n\t'Babson',\n\t'Whalley',\n\t'Manton',\n\t'Patteson',\n\t'Doyen',\n\t'Asad',\n\t'Thurmon',\n\t'Cassese',\n\t'Ditmore',\n\t'Duva',\n\t'Pilato',\n\t'Polaski',\n\t'Rzepka',\n\t'Sevin',\n\t'Sivak',\n\t'Speckman',\n\t'Stepien',\n\t'Switalski',\n\t'Valletta',\n\t'Knoth',\n\t'Niver',\n\t'Ciancio',\n\t'Giza',\n\t'Liebowitz',\n\t'Orengo',\n\t'Rothgeb',\n\t'Witz',\n\t'Airhart',\n\t'Gayman',\n\t'Belland',\n\t'Eury',\n\t'Randal',\n\t'Mcghie',\n\t'Briganti',\n\t'Hoopingarner',\n\t'Lugar',\n\t'Manfre',\n\t'Mongelli',\n\t'Squibb',\n\t'Vasil',\n\t'Cap',\n\t'Veillon',\n\t'Ege',\n\t'Spice',\n\t'Nevel',\n\t'Vanleer',\n\t'Petway',\n\t'Petitfrere',\n\t'Barcena',\n\t'Belville',\n\t'Brezina',\n\t'Ketcherside',\n\t'Knodel',\n\t'Krinsky',\n\t'Lundahl',\n\t'Mescher',\n\t'Pilat',\n\t'Sneller',\n\t'Staller',\n\t'Steinhaus',\n\t'Stensrud',\n\t'Szalay',\n\t'Tani',\n\t'Saviano',\n\t'Genna',\n\t'Emry',\n\t'Allin',\n\t'Harvel',\n\t'Harth',\n\t'Pay',\n\t'Harries',\n\t'Brannum',\n\t'Elijah',\n\t'Hoyte',\n\t'Bazinet',\n\t'Bhandari',\n\t'Brozek',\n\t'Cava',\n\t'Dalbey',\n\t'Delgiudice',\n\t'Klages',\n\t'Riffey',\n\t'Straube',\n\t'Zagar',\n\t'Zientek',\n\t'Dilger',\n\t'Hof',\n\t'Karwowski',\n\t'Rybarczyk',\n\t'Spiering',\n\t'Stamos',\n\t'Gangemi',\n\t'Olavarria',\n\t'Sardinas',\n\t'Magin',\n\t'Payano',\n\t'Deady',\n\t'Henricksen',\n\t'Kary',\n\t'Garnier',\n\t'Babic',\n\t'Behymer',\n\t'Billig',\n\t'Huegel',\n\t'Ishihara',\n\t'Mcglinchey',\n\t'Misuraca',\n\t'Petrosino',\n\t'Zizzo',\n\t'Reierson',\n\t'Wadman',\n\t'Brander',\n\t'Risko',\n\t'Basye',\n\t'Mcmakin',\n\t'Straughan',\n\t'Chesnutt',\n\t'Sima',\n\t'Ree',\n\t'Mankins',\n\t'Soberanis',\n\t'Greenup',\n\t'Commodore',\n\t'Carucci',\n\t'Defibaugh',\n\t'Finfrock',\n\t'Funston',\n\t'Grantz',\n\t'Guiney',\n\t'Ohrt',\n\t'Tinsman',\n\t'Godek',\n\t'Mcgrory',\n\t'Mikeska',\n\t'Kamer',\n\t'Lovas',\n\t'Kirshner',\n\t'Bevacqua',\n\t'Franqui',\n\t'Walts',\n\t'Doke',\n\t'Orsborn',\n\t'Tavernier',\n\t'Kibble',\n\t'Scipio',\n\t'Diop',\n\t'Antczak',\n\t'Bastida',\n\t'Callister',\n\t'Dusseau',\n\t'Ficarra',\n\t'Garcilazo',\n\t'Hughett',\n\t'Liebel',\n\t'Rodenbaugh',\n\t'Rosselli',\n\t'Teresi',\n\t'Bohnsack',\n\t'Steidl',\n\t'Vanderheiden',\n\t'Demma',\n\t'Dutson',\n\t'Mcmeekin',\n\t'Glassford',\n\t'Serrao',\n\t'Marriner',\n\t'Mcchristian',\n\t'Lias',\n\t'Blahnik',\n\t'Brunke',\n\t'Daleo',\n\t'Fullam',\n\t'Goetzinger',\n\t'Leva',\n\t'Rehder',\n\t'Ripperger',\n\t'Shindler',\n\t'Tussing',\n\t'Mayr',\n\t'Rozzi',\n\t'Bonsignore',\n\t'Te',\n\t'Graft',\n\t'Ok',\n\t'Clink',\n\t'Mccamey',\n\t'Goldring',\n\t'Tartt',\n\t'Fullilove',\n\t'Amodio',\n\t'Arkin',\n\t'Dettmann',\n\t'Ellingwood',\n\t'Figura',\n\t'Fritzinger',\n\t'Heilmann',\n\t'Hillstrom',\n\t'Marasigan',\n\t'Pavlov',\n\t'Totman',\n\t'Dokken',\n\t'Serpico',\n\t'Shumard',\n\t'Rathman',\n\t'Siegmund',\n\t'Woodhull',\n\t'Oregon',\n\t'Roselle',\n\t'Taul',\n\t'Maddix',\n\t'Nwosu',\n\t'Bavaro',\n\t'Carella',\n\t'Cowdrey',\n\t'Goodnough',\n\t'Koffler',\n\t'Mahajan',\n\t'Montalvan',\n\t'Morga',\n\t'Parrella',\n\t'Quiggle',\n\t'Rehrig',\n\t'Rotondi',\n\t'Tavenner',\n\t'Wigger',\n\t'Yax',\n\t'Bartko',\n\t'Netzel',\n\t'Zechman',\n\t'Socia',\n\t'Vea',\n\t'Wemple',\n\t'Matti',\n\t'Striplin',\n\t'Hollin',\n\t'Geddie',\n\t'Nolden',\n\t'Freeney',\n\t'Jeanjacques',\n\t'Bermudes',\n\t'Castrellon',\n\t'Catino',\n\t'Feeser',\n\t'Kreitz',\n\t'Maisano',\n\t'Melkonian',\n\t'Toste',\n\t'Vancura',\n\t'Bylsma',\n\t'Wiant',\n\t'Mcpheron',\n\t'Gere',\n\t'Geoffroy',\n\t'Fuston',\n\t'Petteway',\n\t'Barsky',\n\t'Bovard',\n\t'Buttars',\n\t'Christophersen',\n\t'Dudzik',\n\t'Ganger',\n\t'Hilgers',\n\t'Holzhauer',\n\t'Minervini',\n\t'Pong',\n\t'Rozycki',\n\t'Sulzer',\n\t'Tauscher',\n\t'Upright',\n\t'Verastegui',\n\t'Lobello',\n\t'Sandt',\n\t'Timbrook',\n\t'Yniguez',\n\t'Nuzzi',\n\t'Sakata',\n\t'Koran',\n\t'Veloso',\n\t'Cullers',\n\t'Culton',\n\t'Reynold',\n\t'Feagins',\n\t'Amaker',\n\t'Cafferty',\n\t'Coontz',\n\t'Iden',\n\t'Mazzotta',\n\t'Montanye',\n\t'Wandell',\n\t'Weiman',\n\t'Vik',\n\t'Staib',\n\t'Lasso',\n\t'Waynick',\n\t'Boniface',\n\t'Massingale',\n\t'Gainous',\n\t'Sharper',\n\t'Columbia',\n\t'Felkins',\n\t'Gatzke',\n\t'Heindel',\n\t'Ludeman',\n\t'Mcmunn',\n\t'Mogavero',\n\t'Ratti',\n\t'Rickabaugh',\n\t'Ripper',\n\t'Tessman',\n\t'Triano',\n\t'Vanderpol',\n\t'Langille',\n\t'Holten',\n\t'Steeley',\n\t'Solan',\n\t'Devaul',\n\t'Lindler',\n\t'Armor',\n\t'Fambrough',\n\t'Golliday',\n\t'Bognar',\n\t'Gamba',\n\t'Gettinger',\n\t'Hanzel',\n\t'Krumwiede',\n\t'Marcinkowski',\n\t'Nicolay',\n\t'Peppard',\n\t'Sisti',\n\t'Sundeen',\n\t'Senatore',\n\t'Diebel',\n\t'Demarais',\n\t'Letellier',\n\t'Goon',\n\t'Texidor',\n\t'Baughan',\n\t'Gunder',\n\t'Lalor',\n\t'Wigglesworth',\n\t'Aird',\n\t'Basey',\n\t'Afshar',\n\t'Anhalt',\n\t'Bondoc',\n\t'Bunten',\n\t'Daniello',\n\t'Kazmierski',\n\t'Marcott',\n\t'Petruska',\n\t'Trejos',\n\t'Droege',\n\t'Fukumoto',\n\t'Harju',\n\t'Hauf',\n\t'Yagi',\n\t'Mccallie',\n\t'Moulds',\n\t'Singleterry',\n\t'Ramkissoon',\n\t'Sanks',\n\t'Siggers',\n\t'Myrie',\n\t'Conteh',\n\t'Biss',\n\t'Brees',\n\t'Collopy',\n\t'Dashner',\n\t'Dehaas',\n\t'Delzer',\n\t'Fees',\n\t'Finocchiaro',\n\t'Forsgren',\n\t'Giampietro',\n\t'Levandowski',\n\t'Mallick',\n\t'Maudlin',\n\t'Micheletti',\n\t'Newhard',\n\t'Parmentier',\n\t'Pintado',\n\t'Pliego',\n\t'Radigan',\n\t'Selke',\n\t'Uptain',\n\t'Wigton',\n\t'Zabinski',\n\t'Becenti',\n\t'Guthmiller',\n\t'Malecha',\n\t'Eardley',\n\t'Muscat',\n\t'Ruhe',\n\t'Battersby',\n\t'Lamie',\n\t'Stan',\n\t'Dutch',\n\t'Duplechain',\n\t'Dildy',\n\t'Auch',\n\t'Baltzer',\n\t'Degaetano',\n\t'Mileski',\n\t'Parrillo',\n\t'Schoof',\n\t'Stires',\n\t'Villescas',\n\t'Knittle',\n\t'Degrave',\n\t'Deihl',\n\t'Moseman',\n\t'Prillaman',\n\t'Wakeley',\n\t'Jake',\n\t'Murden',\n\t'Shareef',\n\t'Yarbough',\n\t'Bothe',\n\t'Boutilier',\n\t'Breck',\n\t'Buschman',\n\t'Coccia',\n\t'Eberlein',\n\t'Harriger',\n\t'Neas',\n\t'Sullenger',\n\t'Walp',\n\t'Yaple',\n\t'Zinger',\n\t'Zufelt',\n\t'Marinaccio',\n\t'Viele',\n\t'Markee',\n\t'Melody',\n\t'Rooke',\n\t'Ales',\n\t'Mumphrey',\n\t'Bessinger',\n\t'Bialas',\n\t'Brugh',\n\t'Chum',\n\t'Diehm',\n\t'Frieze',\n\t'Hieber',\n\t'Malouf',\n\t'Maltz',\n\t'Mcmanaway',\n\t'Musante',\n\t'Pester',\n\t'Roda',\n\t'Snarr',\n\t'Tovey',\n\t'Buchmann',\n\t'Fluck',\n\t'Sadowsky',\n\t'Viteri',\n\t'Loewe',\n\t'Mullaly',\n\t'Lamboy',\n\t'Bouman',\n\t'Provencal',\n\t'Siddons',\n\t'Chelette',\n\t'Rachels',\n\t'Dynes',\n\t'Nobel',\n\t'Desselle',\n\t'Tillison',\n\t'Bajaj',\n\t'Bresee',\n\t'Hisel',\n\t'Mallo',\n\t'Meints',\n\t'Potocki',\n\t'Spore',\n\t'Steier',\n\t'Toothaker',\n\t'Wildt',\n\t'Darcangelo',\n\t'Karbowski',\n\t'Scaccia',\n\t'Lascola',\n\t'Duman',\n\t'Mccaul',\n\t'Rowton',\n\t'Setters',\n\t'Hendryx',\n\t'Belson',\n\t'Manny',\n\t'Winckler',\n\t'Longe',\n\t'Mclucas',\n\t'Lenon',\n\t'Linen',\n\t'Anstine',\n\t'Belkin',\n\t'Drozdowski',\n\t'Ender',\n\t'Ferra',\n\t'Lessig',\n\t'Marucci',\n\t'Nardo',\n\t'Nipp',\n\t'Passarella',\n\t'Roecker',\n\t'Siddique',\n\t'Stanczak',\n\t'Stavros',\n\t'Tomasetti',\n\t'Lagreca',\n\t'Seegmiller',\n\t'Keena',\n\t'Suddarth',\n\t'Wayt',\n\t'Matas',\n\t'Ryer',\n\t'Mortimore',\n\t'Durnell',\n\t'Pieters',\n\t'Slocumb',\n\t'Andaya',\n\t'Brymer',\n\t'Dufek',\n\t'Ekman',\n\t'Espericueta',\n\t'Feltes',\n\t'Hammann',\n\t'Heydt',\n\t'Inthavong',\n\t'Jagielski',\n\t'Nast',\n\t'Petrucelli',\n\t'Phippen',\n\t'Vanderzanden',\n\t'Whinery',\n\t'Zatarain',\n\t'Zelenak',\n\t'Aquilina',\n\t'Hougland',\n\t'Isais',\n\t'Canney',\n\t'Flath',\n\t'Ragon',\n\t'Len',\n\t'Violet',\n\t'Carra',\n\t'Everetts',\n\t'Lockey',\n\t'Dahmer',\n\t'Fuquay',\n\t'Alpers',\n\t'Borromeo',\n\t'Bringas',\n\t'Brumit',\n\t'Campanile',\n\t'Folts',\n\t'Hirai',\n\t'Kiessling',\n\t'Krogstad',\n\t'Ovitt',\n\t'Bhardwaj',\n\t'Hlavaty',\n\t'Monceaux',\n\t'Spatola',\n\t'Trunzo',\n\t'Girvin',\n\t'Shady',\n\t'Grimley',\n\t'Tagg',\n\t'Weddell',\n\t'Mcfadyen',\n\t'Reagin',\n\t'Philo',\n\t'Emily',\n\t'Codd',\n\t'Cherrington',\n\t'Skates',\n\t'Deary',\n\t'Ballester',\n\t'Barilla',\n\t'Cicchetti',\n\t'Dyche',\n\t'Goossen',\n\t'Graveline',\n\t'Hajduk',\n\t'Halliwell',\n\t'Kohnen',\n\t'Kupiec',\n\t'Machacek',\n\t'Manship',\n\t'Slinker',\n\t'Mallozzi',\n\t'Dotter',\n\t'Brazeau',\n\t'Manon',\n\t'Crofford',\n\t'Gauthreaux',\n\t'Petillo',\n\t'Bailor',\n\t'Ganesh',\n\t'Reaser',\n\t'Barren',\n\t'Adachi',\n\t'Aguiniga',\n\t'Cartrette',\n\t'Crady',\n\t'Hegland',\n\t'Isner',\n\t'Karasek',\n\t'Labrum',\n\t'Maroon',\n\t'Rullo',\n\t'Schull',\n\t'Stawicki',\n\t'Withee',\n\t'Penfold',\n\t'Foronda',\n\t'Claridge',\n\t'Coiner',\n\t'Guimaraes',\n\t'Mawyer',\n\t'Rivkin',\n\t'Kiggins',\n\t'Hackel',\n\t'Wey',\n\t'Fairhurst',\n\t'Albertini',\n\t'Gaal',\n\t'Flurry',\n\t'Patricia',\n\t'Savery',\n\t'Colen',\n\t'Cuthrell',\n\t'Maffett',\n\t'Dungey',\n\t'Luter',\n\t'Hurston',\n\t'Ahles',\n\t'Czapla',\n\t'Gallas',\n\t'Kotecki',\n\t'Lazzari',\n\t'Marcellino',\n\t'Valvo',\n\t'Vukovich',\n\t'Wisor',\n\t'Agler',\n\t'Wease',\n\t'Gallentine',\n\t'Christoph',\n\t'Poyer',\n\t'Norment',\n\t'Rhett',\n\t'Amabile',\n\t'Barish',\n\t'Heifner',\n\t'Kolarik',\n\t'Mcquarrie',\n\t'Morua',\n\t'Nahas',\n\t'Razzano',\n\t'Riegle',\n\t'Torralba',\n\t'Perfetti',\n\t'Stalzer',\n\t'Killman',\n\t'Lenning',\n\t'Wyler',\n\t'Soward',\n\t'Releford',\n\t'Battisti',\n\t'Bergum',\n\t'Catapano',\n\t'Doerner',\n\t'Ehlen',\n\t'Finken',\n\t'Genereux',\n\t'Hillegas',\n\t'Hopple',\n\t'Kaatz',\n\t'Lacson',\n\t'Macario',\n\t'Marzolf',\n\t'Muha',\n\t'Picha',\n\t'Springston',\n\t'Stooksbury',\n\t'Weide',\n\t'Glodowski',\n\t'Lueth',\n\t'Assaf',\n\t'Robuck',\n\t'Lamaster',\n\t'Foulkes',\n\t'Swopes',\n\t'Winkfield',\n\t'Aristizabal',\n\t'Aylesworth',\n\t'Bellotti',\n\t'Bittick',\n\t'Capistran',\n\t'Cizek',\n\t'Dinneen',\n\t'Ellender',\n\t'Friske',\n\t'Hoffa',\n\t'Klinge',\n\t'Kuklinski',\n\t'Luzier',\n\t'Martensen',\n\t'Rolin',\n\t'Shankles',\n\t'Siska',\n\t'Wiegman',\n\t'Winterbottom',\n\t'Crookston',\n\t'Gorospe',\n\t'Curci',\n\t'Lamberty',\n\t'Antonetti',\n\t'Sheer',\n\t'Durning',\n\t'Hootman',\n\t'Doub',\n\t'Klaiber',\n\t'Mayeaux',\n\t'Domingos',\n\t'Wheeless',\n\t'Vantrease',\n\t'Summerhill',\n\t'Agresta',\n\t'Annas',\n\t'Aquilar',\n\t'Crea',\n\t'Froese',\n\t'Medlen',\n\t'Peeters',\n\t'Rhudy',\n\t'Risse',\n\t'Schor',\n\t'Zimmerer',\n\t'Bombardier',\n\t'Halfhill',\n\t'Koppenhaver',\n\t'Kruckenberg',\n\t'Boccia',\n\t'Rella',\n\t'Carelli',\n\t'Overson',\n\t'Tamburro',\n\t'Rosamond',\n\t'Lie',\n\t'Mesquita',\n\t'Jennett',\n\t'Jewel',\n\t'Waye',\n\t'Bogucki',\n\t'Colpitts',\n\t'Galpin',\n\t'Hrdlicka',\n\t'Kading',\n\t'Kushnir',\n\t'Leano',\n\t'Liebig',\n\t'Mceuen',\n\t'Nestler',\n\t'Payer',\n\t'Santarelli',\n\t'Schrupp',\n\t'Schwarze',\n\t'Semrau',\n\t'Solanki',\n\t'Terzian',\n\t'Treloar',\n\t'Ureno',\n\t'Vohra',\n\t'Voshell',\n\t'Nakanishi',\n\t'Senese',\n\t'Dierker',\n\t'Quinley',\n\t'Monier',\n\t'Rounsaville',\n\t'Mcfaddin',\n\t'Defrance',\n\t'Joynes',\n\t'Levert',\n\t'Adragna',\n\t'Buczynski',\n\t'Cranor',\n\t'Englebert',\n\t'Furney',\n\t'Gorny',\n\t'Mockler',\n\t'Pavlicek',\n\t'Petrini',\n\t'Schadt',\n\t'Slagel',\n\t'Cumpston',\n\t'Priore',\n\t'Paonessa',\n\t'Carling',\n\t'Espaillat',\n\t'Hem',\n\t'Griffo',\n\t'Tomer',\n\t'Venn',\n\t'Giraud',\n\t'Becks',\n\t'Mungin',\n\t'Attard',\n\t'Brucato',\n\t'Dreyfus',\n\t'Droz',\n\t'Falck',\n\t'Firebaugh',\n\t'Fiser',\n\t'Hemmelgarn',\n\t'Hofacker',\n\t'Kreeger',\n\t'Rippee',\n\t'Ruehle',\n\t'Saputo',\n\t'Scovill',\n\t'Silbaugh',\n\t'Smolenski',\n\t'Spickler',\n\t'Swango',\n\t'Kaehler',\n\t'Mootz',\n\t'Noblett',\n\t'Zarcone',\n\t'Katzenberger',\n\t'Kita',\n\t'Brezinski',\n\t'Castles',\n\t'Padin',\n\t'Hinde',\n\t'Barretta',\n\t'Amiri',\n\t'Shelburne',\n\t'Mccoin',\n\t'Heaston',\n\t'Aldredge',\n\t'Milhouse',\n\t'Wilbon',\n\t'Cephus',\n\t'Barsness',\n\t'Belch',\n\t'Blatter',\n\t'Boyum',\n\t'Corvino',\n\t'Dagenais',\n\t'Doscher',\n\t'Elizarraraz',\n\t'Gierke',\n\t'Habegger',\n\t'Ketcher',\n\t'Kristiansen',\n\t'Oldroyd',\n\t'Sandage',\n\t'Tesoriero',\n\t'Unzueta',\n\t'Wollam',\n\t'Cefalu',\n\t'Achey',\n\t'Wegmann',\n\t'Lessner',\n\t'Bunk',\n\t'Mallin',\n\t'Polis',\n\t'Aronoff',\n\t'Portal',\n\t'Crock',\n\t'Escher',\n\t'Medler',\n\t'Pretty',\n\t'Younge',\n\t'Agbayani',\n\t'Brinkmeyer',\n\t'Castrillon',\n\t'Feick',\n\t'Gutmann',\n\t'Hagenbuch',\n\t'Hesseltine',\n\t'Houska',\n\t'Kimzey',\n\t'Kolasa',\n\t'Lentine',\n\t'Lobaugh',\n\t'Maimone',\n\t'Meshell',\n\t'Nardini',\n\t'Rosetti',\n\t'Siefker',\n\t'Sileo',\n\t'Silveria',\n\t'Argumedo',\n\t'Lesmeister',\n\t'Donnan',\n\t'Hermans',\n\t'Raggio',\n\t'Dupras',\n\t'Empson',\n\t'Bevier',\n\t'Tumey',\n\t'Donn',\n\t'Darville',\n\t'Douse',\n\t'Cheyne',\n\t'Dewing',\n\t'Jansma',\n\t'Mayeda',\n\t'Nield',\n\t'Obermiller',\n\t'Opfer',\n\t'Surma',\n\t'Tiffin',\n\t'Tirpak',\n\t'Wassel',\n\t'Blickenstaff',\n\t'Dorland',\n\t'Kulhanek',\n\t'Andras',\n\t'Estupinan',\n\t'Gonce',\n\t'Weast',\n\t'Souto',\n\t'Guirguis',\n\t'Glazebrook',\n\t'Dain',\n\t'Loyer',\n\t'Bensley',\n\t'Verge',\n\t'Tubman',\n\t'Onley',\n\t'Dais',\n\t'Barash',\n\t'Bullman',\n\t'Crispino',\n\t'Davino',\n\t'Isenhart',\n\t'Kneller',\n\t'Loschiavo',\n\t'Opper',\n\t'Pfleger',\n\t'Wahler',\n\t'Zelasko',\n\t'Havrilla',\n\t'Mintzer',\n\t'Devoll',\n\t'Giannelli',\n\t'Sees',\n\t'Barritt',\n\t'Mesta',\n\t'Sostre',\n\t'Rohman',\n\t'Padget',\n\t'Edds',\n\t'Slinger',\n\t'Borowicz',\n\t'Bregman',\n\t'Bubar',\n\t'Debartolo',\n\t'Desposito',\n\t'Grieshaber',\n\t'Ludtke',\n\t'Pagani',\n\t'Quiambao',\n\t'Schapiro',\n\t'Winward',\n\t'Bouska',\n\t'Olstad',\n\t'Rough',\n\t'Genz',\n\t'Husby',\n\t'Nealis',\n\t'Hyams',\n\t'Andrades',\n\t'Mcgibbon',\n\t'Edwin',\n\t'Buckhalter',\n\t'Baylon',\n\t'Fiene',\n\t'Fillingim',\n\t'Fiorenza',\n\t'Greenstreet',\n\t'Krager',\n\t'Laxson',\n\t'Noreen',\n\t'Roberds',\n\t'Rundquist',\n\t'Smelcer',\n\t'Tabone',\n\t'Train',\n\t'Zeoli',\n\t'Defries',\n\t'Kolp',\n\t'Maahs',\n\t'Mcnall',\n\t'Ehman',\n\t'Keeth',\n\t'Shackleton',\n\t'Hogarth',\n\t'Westbury',\n\t'Gulliver',\n\t'Oquin',\n\t'Holiman',\n\t'Saintlouis',\n\t'Vaughns',\n\t'Aichele',\n\t'Arbelaez',\n\t'Bathurst',\n\t'Bresler',\n\t'Cecena',\n\t'Drollinger',\n\t'Fellner',\n\t'Griesemer',\n\t'Harnois',\n\t'Hire',\n\t'Kraker',\n\t'Roylance',\n\t'Zaccaria',\n\t'Dinunzio',\n\t'Foisy',\n\t'Nordlund',\n\t'Peppler',\n\t'Kishbaugh',\n\t'Marcil',\n\t'Mcfarren',\n\t'Puello',\n\t'Supplee',\n\t'Boyea',\n\t'Depp',\n\t'Tift',\n\t'Wince',\n\t'Pam',\n\t'Ifill',\n\t'Brodt',\n\t'Caamano',\n\t'Gibler',\n\t'Litherland',\n\t'Miesner',\n\t'Pixler',\n\t'Schwimmer',\n\t'Suriano',\n\t'Abendroth',\n\t'Gillaspy',\n\t'Kumpf',\n\t'Schroepfer',\n\t'Boals',\n\t'Seneca',\n\t'Sasson',\n\t'Hindes',\n\t'Posten',\n\t'Lann',\n\t'Anctil',\n\t'Arebalo',\n\t'Beacom',\n\t'Boberg',\n\t'Coufal',\n\t'Didion',\n\t'Fromme',\n\t'Greenan',\n\t'Guerrette',\n\t'Hudec',\n\t'Kazmi',\n\t'Lucchese',\n\t'Mouw',\n\t'Savastano',\n\t'Schomer',\n\t'Shorb',\n\t'Storz',\n\t'Finazzo',\n\t'Knigge',\n\t'Pawlikowski',\n\t'Cercone',\n\t'Sutfin',\n\t'Valdespino',\n\t'Mccartin',\n\t'Yurko',\n\t'Treaster',\n\t'Peaden',\n\t'Russin',\n\t'Dibartolo',\n\t'Dona',\n\t'Skillern',\n\t'Brackens',\n\t'Amyx',\n\t'Bornemann',\n\t'Comtois',\n\t'Kaestner',\n\t'Kallenbach',\n\t'Krupka',\n\t'Lineback',\n\t'Lopata',\n\t'Mcclenahan',\n\t'Monteverde',\n\t'Otani',\n\t'Panchal',\n\t'Pawlicki',\n\t'Suman',\n\t'Vallance',\n\t'Zammit',\n\t'Liszewski',\n\t'Trunk',\n\t'Sharifi',\n\t'Lents',\n\t'Watkinson',\n\t'Willow',\n\t'Flaming',\n\t'Sol',\n\t'Dory',\n\t'Purchase',\n\t'Haris',\n\t'Bigsby',\n\t'Boonstra',\n\t'Emge',\n\t'Goodpasture',\n\t'Iwata',\n\t'Kau',\n\t'Syring',\n\t'Vlach',\n\t'Klaassen',\n\t'Vicuna',\n\t'Wasden',\n\t'Cattell',\n\t'Ridlon',\n\t'Fassler',\n\t'Scullion',\n\t'Hibbitts',\n\t'Mcgillis',\n\t'Pla',\n\t'Mustin',\n\t'Darty',\n\t'Minniefield',\n\t'Bloyd',\n\t'Calnan',\n\t'Casal',\n\t'Fickel',\n\t'Gamero',\n\t'Higuchi',\n\t'Huante',\n\t'Knies',\n\t'Letner',\n\t'Quang',\n\t'Teufel',\n\t'Topolski',\n\t'Tumminello',\n\t'Vanorder',\n\t'Slawinski',\n\t'Nyce',\n\t'Asmar',\n\t'Loudin',\n\t'Karen',\n\t'Budden',\n\t'Mothershed',\n\t'Fenelon',\n\t'Mccrorey',\n\t'Ashenfelter',\n\t'Auge',\n\t'Christison',\n\t'Cilley',\n\t'Corsetti',\n\t'Coxwell',\n\t'Critchley',\n\t'Griep',\n\t'Hausner',\n\t'Hiemstra',\n\t'Koprowski',\n\t'Kozicki',\n\t'Marling',\n\t'Marmo',\n\t'Noller',\n\t'Pich',\n\t'Recendez',\n\t'Renegar',\n\t'Rinne',\n\t'Zeis',\n\t'Buzzelli',\n\t'Lipham',\n\t'Schaner',\n\t'Kartchner',\n\t'Kealy',\n\t'Sinopoli',\n\t'Krishna',\n\t'Brinn',\n\t'Zachry',\n\t'Barbre',\n\t'Sharber',\n\t'Fritze',\n\t'Hanshew',\n\t'Lemere',\n\t'Maruyama',\n\t'Masker',\n\t'Melendy',\n\t'Pelto',\n\t'Rigo',\n\t'Rohling',\n\t'Scobee',\n\t'Sundell',\n\t'Tranter',\n\t'Vancuren',\n\t'Augustyniak',\n\t'Mehringer',\n\t'Sulkowski',\n\t'Gittins',\n\t'Twiford',\n\t'Dumm',\n\t'Jacklin',\n\t'Mcquaig',\n\t'Richison',\n\t'Jex',\n\t'Meritt',\n\t'Hegler',\n\t'Duboise',\n\t'Houze',\n\t'Akana',\n\t'Corsaro',\n\t'Delosangeles',\n\t'Guidice',\n\t'Maccallum',\n\t'Moes',\n\t'Steinhardt',\n\t'Stirewalt',\n\t'Wooters',\n\t'Schissler',\n\t'Sobeck',\n\t'Boyte',\n\t'Jilek',\n\t'Suder',\n\t'Kellis',\n\t'Blankenbaker',\n\t'Lank',\n\t'Mandigo',\n\t'Fremont',\n\t'Rideau',\n\t'Beidler',\n\t'Boda',\n\t'Gulotta',\n\t'Havelka',\n\t'Herberger',\n\t'Isenhower',\n\t'Lattanzi',\n\t'Pandolfi',\n\t'Shearman',\n\t'Wilmarth',\n\t'Dutkiewicz',\n\t'Mazzuca',\n\t'Tabarez',\n\t'Vermilyea',\n\t'Kray',\n\t'Vitti',\n\t'Packwood',\n\t'Paulos',\n\t'Howson',\n\t'Collman',\n\t'Ameen',\n\t'Berisha',\n\t'Capece',\n\t'Fantasia',\n\t'Galas',\n\t'Laszlo',\n\t'Luthi',\n\t'Maietta',\n\t'Mcconaghy',\n\t'Naab',\n\t'Nerio',\n\t'Pineau',\n\t'Rossbach',\n\t'Senne',\n\t'Unangst',\n\t'Kautzman',\n\t'Muhs',\n\t'Ripka',\n\t'Wehling',\n\t'Hoot',\n\t'Jee',\n\t'Megna',\n\t'Tirone',\n\t'Walle',\n\t'Brandi',\n\t'Lutter',\n\t'Mona',\n\t'Roley',\n\t'Mcfann',\n\t'Swader',\n\t'Cavett',\n\t'Delmore',\n\t'Walthour',\n\t'Goldson',\n\t'Biddinger',\n\t'Bjornstad',\n\t'Buesing',\n\t'Cerino',\n\t'Diede',\n\t'Hagle',\n\t'Hodgman',\n\t'Killmer',\n\t'Loa',\n\t'Matsunaga',\n\t'Micciche',\n\t'Newquist',\n\t'Poppen',\n\t'Shellhammer',\n\t'Tienda',\n\t'Tino',\n\t'Mihelich',\n\t'Garsia',\n\t'Orzel',\n\t'Ericsson',\n\t'Dose',\n\t'Kotter',\n\t'Amante',\n\t'Hanif',\n\t'Huckleberry',\n\t'Blandin',\n\t'Carvin',\n\t'Axton',\n\t'Delosrios',\n\t'Diekmann',\n\t'Failing',\n\t'Filipek',\n\t'Otting',\n\t'Rozman',\n\t'Sadeghi',\n\t'Slutsky',\n\t'Speake',\n\t'Szostak',\n\t'Tacy',\n\t'Kmiecik',\n\t'Macgillivray',\n\t'Yeakel',\n\t'Dykman',\n\t'Gorey',\n\t'Dowding',\n\t'Revel',\n\t'Geathers',\n\t'Cappa',\n\t'Davidoff',\n\t'Lukehart',\n\t'Mccutchan',\n\t'Neeb',\n\t'Nikolic',\n\t'Piorkowski',\n\t'Sandvig',\n\t'Schmidgall',\n\t'Stockbridge',\n\t'Thornock',\n\t'Valk',\n\t'Wiechmann',\n\t'Chait',\n\t'Gacek',\n\t'Schupbach',\n\t'Gemma',\n\t'Rus',\n\t'Barch',\n\t'Wyles',\n\t'Scrivener',\n\t'Salls',\n\t'Akram',\n\t'Mcclatchey',\n\t'Bromfield',\n\t'Burl',\n\t'Redwood',\n\t'Starkes',\n\t'Beaston',\n\t'Boggio',\n\t'Cantillo',\n\t'Cina',\n\t'Cryan',\n\t'Dubs',\n\t'Edmisten',\n\t'Fitzer',\n\t'Fugere',\n\t'Fundora',\n\t'Galvis',\n\t'Jafri',\n\t'Nalepa',\n\t'Peri',\n\t'Pippenger',\n\t'Rheault',\n\t'Rohrbacher',\n\t'Romberg',\n\t'Samek',\n\t'Stehlik',\n\t'Stepan',\n\t'Torrisi',\n\t'Wessner',\n\t'Zappala',\n\t'Bangerter',\n\t'Czerniak',\n\t'Mcshea',\n\t'Raczkowski',\n\t'Rohwer',\n\t'Spehar',\n\t'Lague',\n\t'Messman',\n\t'Angst',\n\t'Temme',\n\t'Tolles',\n\t'Lawn',\n\t'Ayars',\n\t'Austen',\n\t'Stansel',\n\t'Fairclough',\n\t'Tribbett',\n\t'Peevy',\n\t'Fraiser',\n\t'Caradine',\n\t'Fiegel',\n\t'Gignac',\n\t'Halpert',\n\t'Karels',\n\t'Knappenberger',\n\t'Prezioso',\n\t'Rohlfs',\n\t'Szot',\n\t'Varano',\n\t'Weinreich',\n\t'Butterbaugh',\n\t'Heying',\n\t'Vandewalle',\n\t'Yandle',\n\t'Thede',\n\t'Astor',\n\t'Blanchfield',\n\t'Hegeman',\n\t'Fels',\n\t'Miniard',\n\t'Lorio',\n\t'Muhammed',\n\t'Lazard',\n\t'Ehmke',\n\t'Hulst',\n\t'Imlay',\n\t'Kinzler',\n\t'Knaak',\n\t'Poehler',\n\t'Prusak',\n\t'Rakow',\n\t'Raupp',\n\t'Sucher',\n\t'Tanenbaum',\n\t'Burich',\n\t'Macmaster',\n\t'Shapley',\n\t'Thurgood',\n\t'Mires',\n\t'Gotay',\n\t'Attia',\n\t'Martis',\n\t'Greenley',\n\t'Fothergill',\n\t'Bonvillain',\n\t'Buffalo',\n\t'Dues',\n\t'Crute',\n\t'Cantone',\n\t'Dewit',\n\t'Dovel',\n\t'Klopfer',\n\t'Philhower',\n\t'Piatek',\n\t'Pion',\n\t'Rapaport',\n\t'Vanwert',\n\t'Wikstrom',\n\t'Graffeo',\n\t'Kissling',\n\t'Niday',\n\t'Soong',\n\t'Adami',\n\t'Hammersmith',\n\t'Keir',\n\t'Yo',\n\t'Grizzell',\n\t'Stclaire',\n\t'Swales',\n\t'Nole',\n\t'Pole',\n\t'Hartgrove',\n\t'Carrothers',\n\t'Carlone',\n\t'Ciano',\n\t'Finucane',\n\t'Fitterer',\n\t'Gellman',\n\t'Hakimi',\n\t'Janos',\n\t'Krings',\n\t'Malmstrom',\n\t'Markwardt',\n\t'Rodin',\n\t'Schau',\n\t'Scheible',\n\t'Orick',\n\t'Dine',\n\t'Tremmel',\n\t'Shon',\n\t'Wilms',\n\t'Bren',\n\t'Bertin',\n\t'Poster',\n\t'Jeng',\n\t'Stcharles',\n\t'Jenning',\n\t'Eutsey',\n\t'Fayne',\n\t'Gustave',\n\t'Mccargo',\n\t'Boruff',\n\t'Boschert',\n\t'Burmester',\n\t'Colello',\n\t'Conchas',\n\t'Devi',\n\t'Dishaw',\n\t'Funaro',\n\t'Gallen',\n\t'Hsueh',\n\t'Lanser',\n\t'Macaraeg',\n\t'Munster',\n\t'Petsch',\n\t'Routon',\n\t'Werkmeister',\n\t'Woznicki',\n\t'Boroff',\n\t'Cochenour',\n\t'Dibartolomeo',\n\t'Elzinga',\n\t'Heyen',\n\t'Lapaglia',\n\t'Schiel',\n\t'Rauda',\n\t'Woltman',\n\t'Carll',\n\t'Kanda',\n\t'Runnells',\n\t'Hazelett',\n\t'Arnwine',\n\t'Sherfield',\n\t'Borthwick',\n\t'Coyner',\n\t'Ensey',\n\t'Feinman',\n\t'Leyendecker',\n\t'Lickteig',\n\t'Lubeck',\n\t'Maccarone',\n\t'Minahan',\n\t'Plew',\n\t'Saur',\n\t'Schleich',\n\t'Sixtos',\n\t'Soller',\n\t'Valek',\n\t'Umland',\n\t'Swogger',\n\t'Iannacone',\n\t'Tomey',\n\t'Venuto',\n\t'Peru',\n\t'Adolf',\n\t'Lemme',\n\t'Bureau',\n\t'River',\n\t'Buffaloe',\n\t'Leacock',\n\t'Threat',\n\t'Boza',\n\t'Constancio',\n\t'Dandurand',\n\t'Hiscock',\n\t'Kaley',\n\t'Michaelsen',\n\t'Roberti',\n\t'Sicilia',\n\t'Sliker',\n\t'Sooter',\n\t'Steyer',\n\t'Tabora',\n\t'Vanderbeek',\n\t'Vanscyoc',\n\t'Piercey',\n\t'Sabater',\n\t'Bride',\n\t'Tippens',\n\t'Acquaviva',\n\t'Baublitz',\n\t'Mccanna',\n\t'Mckaig',\n\t'Merenda',\n\t'Obermeier',\n\t'Pechacek',\n\t'Pugmire',\n\t'Shaneyfelt',\n\t'Steuer',\n\t'Zeidler',\n\t'Bodenheimer',\n\t'Gaglio',\n\t'Maceachern',\n\t'Munsterman',\n\t'Rayle',\n\t'Wisnewski',\n\t'Baar',\n\t'Thi',\n\t'Foulds',\n\t'Rufino',\n\t'Chrisco',\n\t'Barrientez',\n\t'Lare',\n\t'Munnerlyn',\n\t'Pitter',\n\t'Koroma',\n\t'Caisse',\n\t'Espe',\n\t'Kerin',\n\t'Melchiorre',\n\t'Mentz',\n\t'Paasch',\n\t'Parrales',\n\t'Rhew',\n\t'Sigley',\n\t'Skiff',\n\t'Stockert',\n\t'Viglione',\n\t'Kraska',\n\t'Botto',\n\t'Ponzio',\n\t'Wolfley',\n\t'Wack',\n\t'Kilborn',\n\t'Dunnavant',\n\t'Pitney',\n\t'Dolman',\n\t'Biscoe',\n\t'Michelle',\n\t'Azcona',\n\t'Brasington',\n\t'Fazzino',\n\t'Hoefs',\n\t'Kohlmeyer',\n\t'Laser',\n\t'Morea',\n\t'Morrin',\n\t'Neuwirth',\n\t'Nicklaus',\n\t'Pennypacker',\n\t'Rueckert',\n\t'Schriefer',\n\t'Scovel',\n\t'Swyers',\n\t'Thebeau',\n\t'Mijangos',\n\t'Douville',\n\t'Tidball',\n\t'Smullen',\n\t'Lecount',\n\t'Pruiett',\n\t'Branche',\n\t'Arment',\n\t'Babiarz',\n\t'Char',\n\t'Granlund',\n\t'Hillock',\n\t'Kahrs',\n\t'Khong',\n\t'Lalley',\n\t'Laspina',\n\t'Pietila',\n\t'Ponciano',\n\t'Rosengren',\n\t'Slee',\n\t'Snowberger',\n\t'Weglarz',\n\t'Camarata',\n\t'Villalovos',\n\t'Buza',\n\t'Kenning',\n\t'Rohrig',\n\t'Sedor',\n\t'Perretta',\n\t'Hamberg',\n\t'Mongan',\n\t'Formby',\n\t'Portier',\n\t'Silcott',\n\t'Levell',\n\t'Barrantes',\n\t'Bellefeuille',\n\t'Beneke',\n\t'Bilbao',\n\t'Danahy',\n\t'Delahanty',\n\t'Deppen',\n\t'Dicostanzo',\n\t'Dudding',\n\t'Elmquist',\n\t'Handa',\n\t'Hatem',\n\t'Loverde',\n\t'Mesick',\n\t'Onofrio',\n\t'Ramesh',\n\t'Tiberio',\n\t'Trachtenberg',\n\t'Vanwagenen',\n\t'Cassada',\n\t'Pepitone',\n\t'Stillson',\n\t'Pfarr',\n\t'Radle',\n\t'Scallan',\n\t'Carlen',\n\t'Bermingham',\n\t'Sagers',\n\t'Llorens',\n\t'Turay',\n\t'Beamish',\n\t'Carlini',\n\t'Galipeau',\n\t'Heavey',\n\t'Kempker',\n\t'Masser',\n\t'Montellano',\n\t'Peine',\n\t'Pietro',\n\t'Plitt',\n\t'Pollman',\n\t'Rike',\n\t'Spees',\n\t'Vandervelde',\n\t'Vanwey',\n\t'Grundman',\n\t'Marinucci',\n\t'Molenda',\n\t'Shideler',\n\t'Turrubiartes',\n\t'Schaer',\n\t'Firkins',\n\t'Haid',\n\t'Parnes',\n\t'Pulse',\n\t'Masone',\n\t'Burpo',\n\t'Tharrington',\n\t'Winborn',\n\t'Petite',\n\t'Buttry',\n\t'Clason',\n\t'Eutsler',\n\t'Haberer',\n\t'Haft',\n\t'Kotler',\n\t'Meloche',\n\t'Raether',\n\t'Rengifo',\n\t'Roback',\n\t'Stangle',\n\t'Wilderman',\n\t'Chickering',\n\t'Gervacio',\n\t'Penaranda',\n\t'Schnieders',\n\t'Coyer',\n\t'Laramee',\n\t'Curts',\n\t'Bailiff',\n\t'Truby',\n\t'Molder',\n\t'Hedley',\n\t'Carbon',\n\t'Gudger',\n\t'Fontenette',\n\t'Askren',\n\t'Deshane',\n\t'Enriques',\n\t'Fake',\n\t'Jungers',\n\t'Krech',\n\t'Niemela',\n\t'Perfetto',\n\t'Ritt',\n\t'Soldano',\n\t'Stanish',\n\t'Strege',\n\t'Wichert',\n\t'Wolz',\n\t'Zimbelman',\n\t'Abplanalp',\n\t'Nikkel',\n\t'Oravec',\n\t'Coile',\n\t'Mizuno',\n\t'Fenlon',\n\t'Vanloo',\n\t'Callery',\n\t'Hortman',\n\t'Hashim',\n\t'Sorey',\n\t'Ajayi',\n\t'Alesi',\n\t'Alessandro',\n\t'Avants',\n\t'Bachtel',\n\t'Bonine',\n\t'Butkovich',\n\t'Cerros',\n\t'Colina',\n\t'Dayhoff',\n\t'Favata',\n\t'Haning',\n\t'Kamath',\n\t'Kosik',\n\t'Loughrey',\n\t'Mollo',\n\t'Nagi',\n\t'Nesler',\n\t'Nosek',\n\t'Ordoyne',\n\t'Politis',\n\t'Zwolinski',\n\t'Yaffe',\n\t'Sigal',\n\t'Burow',\n\t'Scarbro',\n\t'Buckel',\n\t'Broxson',\n\t'Goyer',\n\t'Goding',\n\t'Delee',\n\t'Jefferys',\n\t'Blissett',\n\t'Balian',\n\t'Brader',\n\t'Curreri',\n\t'Dickmann',\n\t'Eckerle',\n\t'Erives',\n\t'Fedewa',\n\t'Frisina',\n\t'Gropp',\n\t'Hinck',\n\t'Lamorte',\n\t'Litzenberger',\n\t'Proehl',\n\t'Struss',\n\t'Tamburello',\n\t'Digioia',\n\t'Galarneau',\n\t'Jurkiewicz',\n\t'Macnaughton',\n\t'Talsma',\n\t'Vlasak',\n\t'Weyrauch',\n\t'Yontz',\n\t'Kho',\n\t'Stgermaine',\n\t'Grauer',\n\t'Benware',\n\t'Rearden',\n\t'Molin',\n\t'Pendergrast',\n\t'Sivils',\n\t'Ellery',\n\t'Ikner',\n\t'Metayer',\n\t'Toran',\n\t'Seaberry',\n\t'Banderas',\n\t'Bannan',\n\t'Critzer',\n\t'Doescher',\n\t'Haakenson',\n\t'Hignite',\n\t'Hoeksema',\n\t'Inserra',\n\t'Korbel',\n\t'Kruzel',\n\t'Langen',\n\t'Mittelstaedt',\n\t'Popkin',\n\t'Schwarting',\n\t'Toral',\n\t'Ilagan',\n\t'Lamica',\n\t'Lierman',\n\t'Zimmerly',\n\t'Fosse',\n\t'Pagnotta',\n\t'Trenholm',\n\t'Clayson',\n\t'Cerutti',\n\t'Wollard',\n\t'Mcburnett',\n\t'Stallcup',\n\t'Magan',\n\t'Wonder',\n\t'Gillock',\n\t'Ellisor',\n\t'Clayburn',\n\t'Mabery',\n\t'Cariaga',\n\t'Crail',\n\t'Dieckman',\n\t'Joynt',\n\t'Kleinert',\n\t'Kutner',\n\t'Milla',\n\t'Nauta',\n\t'Rende',\n\t'Robare',\n\t'Santella',\n\t'Scianna',\n\t'Sevcik',\n\t'Smolik',\n\t'Staudinger',\n\t'Cedillos',\n\t'Shroff',\n\t'Ueda',\n\t'Yearout',\n\t'Zuno',\n\t'Pottle',\n\t'Klabunde',\n\t'Tusa',\n\t'Schomburg',\n\t'Alto',\n\t'Packett',\n\t'Muns',\n\t'Dante',\n\t'Jarnigan',\n\t'Londo',\n\t'Bigbee',\n\t'Isles',\n\t'Nembhard',\n\t'Appiah',\n\t'Hypolite',\n\t'Acebedo',\n\t'Arlt',\n\t'Champney',\n\t'Kawahara',\n\t'Lehan',\n\t'Pavlak',\n\t'Ritacco',\n\t'Seckinger',\n\t'Turvey',\n\t'Vanevery',\n\t'Wronski',\n\t'Bahnsen',\n\t'Clites',\n\t'Ellwanger',\n\t'Husak',\n\t'Lydic',\n\t'Zubiate',\n\t'Muehlbauer',\n\t'Neumeister',\n\t'Wellnitz',\n\t'Langstaff',\n\t'Gort',\n\t'Eve',\n\t'Stones',\n\t'Stanard',\n\t'Whichard',\n\t'Cheers',\n\t'Baldus',\n\t'Bertoni',\n\t'Chesebro',\n\t'Dino',\n\t'Dubray',\n\t'Icenhour',\n\t'Marquard',\n\t'Mette',\n\t'Potash',\n\t'Winterhalter',\n\t'Crupi',\n\t'Lascala',\n\t'Tauer',\n\t'Vandenburgh',\n\t'Mende',\n\t'Swarey',\n\t'Sarles',\n\t'Platter',\n\t'Dekeyser',\n\t'Jaye',\n\t'Pelle',\n\t'Caroll',\n\t'Rosette',\n\t'Shepperson',\n\t'Fooks',\n\t'Kennerson',\n\t'Bolser',\n\t'Chim',\n\t'Diefenderfer',\n\t'Frosch',\n\t'Holzwarth',\n\t'Kjos',\n\t'Langland',\n\t'Meland',\n\t'Stufflebeam',\n\t'Worland',\n\t'Barrales',\n\t'Chhay',\n\t'Corkern',\n\t'Creegan',\n\t'Golan',\n\t'Marceaux',\n\t'Matsuo',\n\t'Micallef',\n\t'Otsuka',\n\t'Rinella',\n\t'Creveling',\n\t'Krane',\n\t'Mcnay',\n\t'Detter',\n\t'Drexel',\n\t'Kibodeaux',\n\t'Shippey',\n\t'Medearis',\n\t'Samms',\n\t'Drzewiecki',\n\t'Fariss',\n\t'Glandon',\n\t'Heinecke',\n\t'Hendler',\n\t'Jungwirth',\n\t'Panepinto',\n\t'Rohleder',\n\t'Saragosa',\n\t'Stuller',\n\t'Wissel',\n\t'Atwal',\n\t'Tisch',\n\t'Esterly',\n\t'Mourad',\n\t'Brickell',\n\t'Bough',\n\t'Rubens',\n\t'Angevine',\n\t'Tolin',\n\t'Sago',\n\t'Apfel',\n\t'Ashdown',\n\t'Derusha',\n\t'Fiorino',\n\t'Koyama',\n\t'Matteucci',\n\t'Newbrough',\n\t'Seufert',\n\t'Stahley',\n\t'Tyburski',\n\t'Zaino',\n\t'Cdebaca',\n\t'Hormann',\n\t'Wangen',\n\t'Winterton',\n\t'Beagley',\n\t'Sowden',\n\t'Daul',\n\t'Errington',\n\t'Steber',\n\t'Emfinger',\n\t'Olan',\n\t'Fiveash',\n\t'Carriger',\n\t'Breakfield',\n\t'Ezekiel',\n\t'Wallington',\n\t'Hollimon',\n\t'Izzard',\n\t'Lyde',\n\t'Bellmore',\n\t'Benkert',\n\t'Bhargava',\n\t'Dacanay',\n\t'Dano',\n\t'Diprima',\n\t'Garlitz',\n\t'Hannemann',\n\t'Janiak',\n\t'Klann',\n\t'Kunce',\n\t'Malicki',\n\t'Mcgivney',\n\t'Nordeen',\n\t'Procell',\n\t'Rands',\n\t'Smeltz',\n\t'Sutch',\n\t'Wach',\n\t'Wentling',\n\t'Karapetyan',\n\t'Mcvicar',\n\t'Pennisi',\n\t'Perley',\n\t'Graner',\n\t'Hartney',\n\t'Shadley',\n\t'Pennebaker',\n\t'Cayce',\n\t'Marris',\n\t'Burges',\n\t'Odem',\n\t'Charvat',\n\t'Delgreco',\n\t'Diven',\n\t'Latu',\n\t'Mccallion',\n\t'Mcfeely',\n\t'Mon',\n\t'Nagai',\n\t'Obrecht',\n\t'Opdyke',\n\t'Pearlstein',\n\t'Pomroy',\n\t'Prothero',\n\t'Rado',\n\t'Roehr',\n\t'Seiffert',\n\t'Spake',\n\t'Stech',\n\t'Thakur',\n\t'Trzcinski',\n\t'Uvalle',\n\t'Vazques',\n\t'Anschutz',\n\t'Boecker',\n\t'Descoteaux',\n\t'Idol',\n\t'Stanzione',\n\t'Welp',\n\t'Schumer',\n\t'Ridner',\n\t'Kasner',\n\t'Auton',\n\t'Barca',\n\t'Ocheltree',\n\t'Biernat',\n\t'Mercuri',\n\t'Truslow',\n\t'Witters',\n\t'Mcelhannon',\n\t'Mccrackin',\n\t'Brabson',\n\t'Baumberger',\n\t'Double',\n\t'Garis',\n\t'Kasparian',\n\t'Kooistra',\n\t'Loser',\n\t'Mangone',\n\t'Massman',\n\t'Raimondo',\n\t'Sparacio',\n\t'Valli',\n\t'Viets',\n\t'Wessell',\n\t'Kieu',\n\t'Vonderheide',\n\t'Wojnar',\n\t'Furbee',\n\t'Heyden',\n\t'Lackie',\n\t'Ehrich',\n\t'Roupe',\n\t'Holy',\n\t'Care',\n\t'Isa',\n\t'Samad',\n\t'Rougeau',\n\t'Chavous',\n\t'Rattler',\n\t'Wedderburn',\n\t'President',\n\t'Blackham',\n\t'Bobak',\n\t'Crimi',\n\t'Durland',\n\t'Gargus',\n\t'Gitlin',\n\t'Levandoski',\n\t'Niu',\n\t'Piccirilli',\n\t'Sauvageau',\n\t'Schweers',\n\t'Talty',\n\t'Uthe',\n\t'Verga',\n\t'Warzecha',\n\t'Erisman',\n\t'Gallacher',\n\t'Shanholtz',\n\t'Fulgencio',\n\t'Migues',\n\t'Garin',\n\t'Heisel',\n\t'Stong',\n\t'Christiana',\n\t'Bonenfant',\n\t'Clancey',\n\t'Kindley',\n\t'Nill',\n\t'Mood',\n\t'Atterbury',\n\t'Tobe',\n\t'Eisenhardt',\n\t'Franceschini',\n\t'Heiland',\n\t'Kreuzer',\n\t'Lockaby',\n\t'Scarola',\n\t'Tessitore',\n\t'Warehime',\n\t'Kukowski',\n\t'Ruhlman',\n\t'Frymire',\n\t'Bartone',\n\t'Wrightson',\n\t'Langlinais',\n\t'Planas',\n\t'Darsey',\n\t'Darin',\n\t'Gammel',\n\t'Giroir',\n\t'Aspinall',\n\t'Hollywood',\n\t'Childres',\n\t'Copelin',\n\t'Teamer',\n\t'Okoro',\n\t'Abshier',\n\t'Arizaga',\n\t'Berenson',\n\t'Biegler',\n\t'Dugdale',\n\t'Erlich',\n\t'Gavino',\n\t'Haaland',\n\t'Lautenschlager',\n\t'Lilja',\n\t'Livingood',\n\t'Lockner',\n\t'Pyeatt',\n\t'Reist',\n\t'Rummell',\n\t'Schadler',\n\t'Snare',\n\t'Zawada',\n\t'Dumler',\n\t'Moncivais',\n\t'Sammarco',\n\t'Laraway',\n\t'Voorhis',\n\t'Detty',\n\t'Manko',\n\t'Zale',\n\t'Autin',\n\t'Quaid',\n\t'Denver',\n\t'Demario',\n\t'Nearing',\n\t'Amerine',\n\t'Bea',\n\t'Carraher',\n\t'Dierkes',\n\t'Dutko',\n\t'Hosek',\n\t'Kassner',\n\t'Meo',\n\t'Mesler',\n\t'Norquist',\n\t'Pacetti',\n\t'Pellerito',\n\t'Ryser',\n\t'Turnmire',\n\t'Caniglia',\n\t'Zollman',\n\t'Gerwig',\n\t'Denslow',\n\t'Stapler',\n\t'Majid',\n\t'Prestage',\n\t'Eargle',\n\t'Spight',\n\t'Argabright',\n\t'Borgeson',\n\t'Cipollone',\n\t'Dippold',\n\t'Korf',\n\t'Milhoan',\n\t'Pinelli',\n\t'Roblero',\n\t'Scolaro',\n\t'Sperl',\n\t'Svensson',\n\t'Bauguess',\n\t'Freimuth',\n\t'Luquin',\n\t'Barman',\n\t'Solivan',\n\t'Buel',\n\t'Birkeland',\n\t'Cafiero',\n\t'Degollado',\n\t'Demeyer',\n\t'Hoberg',\n\t'Homola',\n\t'Kadel',\n\t'Koslowski',\n\t'Lefrancois',\n\t'Macconnell',\n\t'Madill',\n\t'Nudelman',\n\t'Raucci',\n\t'Reidenbach',\n\t'Schermer',\n\t'Sergio',\n\t'Bucko',\n\t'Haegele',\n\t'Nibert',\n\t'Sidell',\n\t'Slape',\n\t'Hellard',\n\t'Russi',\n\t'Wilcock',\n\t'Verdejo',\n\t'Lessley',\n\t'Camille',\n\t'Topps',\n\t'Acampora',\n\t'Blacketer',\n\t'Clapham',\n\t'Efaw',\n\t'Louks',\n\t'Mersch',\n\t'Odden',\n\t'Schettler',\n\t'Schnarr',\n\t'Sieracki',\n\t'Skog',\n\t'Zobrist',\n\t'Corless',\n\t'Zunker',\n\t'Bega',\n\t'Victoriano',\n\t'Singler',\n\t'Keltz',\n\t'Valcarcel',\n\t'Curet',\n\t'Harvison',\n\t'Mccullah',\n\t'Cranfield',\n\t'Gardin',\n\t'Mewborn',\n\t'Bisel',\n\t'Carfagno',\n\t'Carli',\n\t'Chirino',\n\t'Fairless',\n\t'Gaboury',\n\t'Goetze',\n\t'Guitron',\n\t'Haut',\n\t'Krupski',\n\t'Lata',\n\t'Misiak',\n\t'Sawaya',\n\t'Schomaker',\n\t'Schulke',\n\t'Tin',\n\t'Dewhurst',\n\t'Krummel',\n\t'Hannahs',\n\t'Carlow',\n\t'Hemp',\n\t'Bowdoin',\n\t'Breda',\n\t'Chriss',\n\t'Kebede',\n\t'Binney',\n\t'Brasseaux',\n\t'Cunliffe',\n\t'Gantner',\n\t'Gillick',\n\t'Hottle',\n\t'Hren',\n\t'Irani',\n\t'Klitzke',\n\t'Luhrs',\n\t'Micale',\n\t'Oien',\n\t'Oppelt',\n\t'Rallo',\n\t'Ringwald',\n\t'Stonerock',\n\t'Strebel',\n\t'Tiberi',\n\t'Volner',\n\t'Whetstine',\n\t'Wrubel',\n\t'Brakebill',\n\t'Fechner',\n\t'Geurts',\n\t'Hoefling',\n\t'Misener',\n\t'Andros',\n\t'Dimock',\n\t'Rosendo',\n\t'Megill',\n\t'Gloyd',\n\t'Garney',\n\t'Andries',\n\t'Esco',\n\t'Rhames',\n\t'Draine',\n\t'Plair',\n\t'Jiggetts',\n\t'Atcheson',\n\t'Brienza',\n\t'Cerveny',\n\t'Depaoli',\n\t'Deroo',\n\t'Dorf',\n\t'Guidotti',\n\t'Heimlich',\n\t'Insalaco',\n\t'Kaczorowski',\n\t'Kinnunen',\n\t'Loureiro',\n\t'Lyster',\n\t'Pia',\n\t'Piccoli',\n\t'Quale',\n\t'Sadek',\n\t'Stenstrom',\n\t'Strause',\n\t'Tortorella',\n\t'Traweek',\n\t'Vanderwerff',\n\t'Varian',\n\t'Vink',\n\t'Waxler',\n\t'Wynia',\n\t'Annese',\n\t'Economou',\n\t'Whitsel',\n\t'Dougher',\n\t'Schnieder',\n\t'Cosman',\n\t'Farra',\n\t'Osmon',\n\t'Bardon',\n\t'Rampersaud',\n\t'Jane',\n\t'Kirts',\n\t'Chennault',\n\t'Thomison',\n\t'Graig',\n\t'Narine',\n\t'Gunner',\n\t'Aamodt',\n\t'Adinolfi',\n\t'Adolphson',\n\t'Aki',\n\t'Alderton',\n\t'Aloisio',\n\t'Bellavia',\n\t'Clutts',\n\t'Coughran',\n\t'Frasco',\n\t'Guinta',\n\t'Hatala',\n\t'Ibach',\n\t'Mecum',\n\t'Medero',\n\t'Neria',\n\t'Nery',\n\t'Pignataro',\n\t'Podesta',\n\t'Statzer',\n\t'Stombaugh',\n\t'Szczesny',\n\t'Kovaleski',\n\t'Ades',\n\t'Bauers',\n\t'Bern',\n\t'Horsfall',\n\t'Masood',\n\t'Cinque',\n\t'Stay',\n\t'Beare',\n\t'Donavan',\n\t'Ikerd',\n\t'Seney',\n\t'Layson',\n\t'Coler',\n\t'Tuft',\n\t'Tamplin',\n\t'Billinger',\n\t'Scrivens',\n\t'Bartolomei',\n\t'Baza',\n\t'Dimattia',\n\t'Dotterer',\n\t'Dushane',\n\t'Fulop',\n\t'Iacovelli',\n\t'Macnamara',\n\t'Mahlum',\n\t'Noteboom',\n\t'Rebstock',\n\t'Drechsler',\n\t'Itzkowitz',\n\t'Rigler',\n\t'Schrom',\n\t'Pirozzi',\n\t'Ferre',\n\t'Shiley',\n\t'Villanova',\n\t'Barona',\n\t'Farrel',\n\t'Shelman',\n\t'Nute',\n\t'Rowlette',\n\t'Tarrance',\n\t'Cadorette',\n\t'Christenberry',\n\t'Deocampo',\n\t'Farace',\n\t'Fesmire',\n\t'Kallman',\n\t'Koogler',\n\t'Pitsch',\n\t'Salce',\n\t'Schnepf',\n\t'Totaro',\n\t'Towey',\n\t'Urdiales',\n\t'Gotschall',\n\t'Brunett',\n\t'Dier',\n\t'Hainsworth',\n\t'Seabury',\n\t'Cornelious',\n\t'Altobelli',\n\t'Andreozzi',\n\t'Bohlmann',\n\t'Carranco',\n\t'Daubenspeck',\n\t'Delagrange',\n\t'Delo',\n\t'Faler',\n\t'Ficke',\n\t'Hellinger',\n\t'Hudman',\n\t'Ihde',\n\t'Landolfi',\n\t'Leiner',\n\t'Mosman',\n\t'Rang',\n\t'Tarbet',\n\t'Wineman',\n\t'Fehrman',\n\t'Guinto',\n\t'Icenogle',\n\t'Tomasik',\n\t'Looman',\n\t'Iriarte',\n\t'Denaro',\n\t'Montross',\n\t'Piersall',\n\t'Lauren',\n\t'Lablanc',\n\t'Kindrick',\n\t'Deriso',\n\t'Manker',\n\t'Maycock',\n\t'Cullens',\n\t'Frieson',\n\t'Clippinger',\n\t'Colavito',\n\t'Fassbender',\n\t'Fennessy',\n\t'Granada',\n\t'Gugliotta',\n\t'Guiliano',\n\t'Hirschberg',\n\t'Kerbs',\n\t'Kusch',\n\t'Limmer',\n\t'Malpica',\n\t'Mcaloon',\n\t'Morken',\n\t'Pytel',\n\t'Resnik',\n\t'Spangle',\n\t'Worstell',\n\t'Kerkhoff',\n\t'Kupka',\n\t'Stanczyk',\n\t'Storlie',\n\t'Thurow',\n\t'Caetano',\n\t'Ernandez',\n\t'Males',\n\t'Coopersmith',\n\t'Everest',\n\t'Leander',\n\t'Demeritt',\n\t'Thomes',\n\t'Codner',\n\t'Livsey',\n\t'Alcoser',\n\t'Arico',\n\t'Balestrieri',\n\t'Cavalli',\n\t'Florendo',\n\t'Gottshall',\n\t'Hinesley',\n\t'Lafuente',\n\t'Landess',\n\t'Ornstein',\n\t'Pettingill',\n\t'Romesburg',\n\t'Tokunaga',\n\t'Wiersema',\n\t'Janeway',\n\t'Pecha',\n\t'Steimel',\n\t'Sproule',\n\t'Sommerfield',\n\t'Mirsky',\n\t'Staines',\n\t'Pu',\n\t'Corbit',\n\t'Mcelmurry',\n\t'Wickes',\n\t'Yell',\n\t'Mordecai',\n\t'Aye',\n\t'Boldin',\n\t'China',\n\t'Fason',\n\t'Thibeaux',\n\t'Nesby',\n\t'Bergevin',\n\t'Besecker',\n\t'Dohrmann',\n\t'Fujioka',\n\t'Fyock',\n\t'Goralski',\n\t'Kirschenbaum',\n\t'Knipper',\n\t'Menor',\n\t'Mischler',\n\t'Nolder',\n\t'Odoherty',\n\t'Pickerill',\n\t'Poremba',\n\t'Swantek',\n\t'Difabio',\n\t'Kulka',\n\t'Servais',\n\t'Wickizer',\n\t'Melecio',\n\t'Zeek',\n\t'Fruit',\n\t'Agnes',\n\t'Bar',\n\t'Mccarrell',\n\t'Hopgood',\n\t'Califano',\n\t'Cratty',\n\t'Dishner',\n\t'Gabrielli',\n\t'Hamacher',\n\t'Hinote',\n\t'Jakob',\n\t'Klinkhammer',\n\t'Krasinski',\n\t'Krysiak',\n\t'Pardi',\n\t'Petrilli',\n\t'Razon',\n\t'Reifsnyder',\n\t'Reisig',\n\t'Reller',\n\t'Sassano',\n\t'Steinhart',\n\t'Wrede',\n\t'Zevallos',\n\t'Coombe',\n\t'Quesnel',\n\t'Rebuck',\n\t'Wantz',\n\t'Bendele',\n\t'Lacomb',\n\t'Hagge',\n\t'Donelan',\n\t'Kempe',\n\t'Po',\n\t'Varnadoe',\n\t'Constantin',\n\t'Deon',\n\t'Motte',\n\t'Beckum',\n\t'Parchment',\n\t'Meriweather',\n\t'Borucki',\n\t'Fatima',\n\t'Gerkin',\n\t'Guglielmi',\n\t'Hettich',\n\t'Hoerr',\n\t'Karlsson',\n\t'Kenealy',\n\t'Paolillo',\n\t'Pfenning',\n\t'Rueger',\n\t'Schildt',\n\t'Sem',\n\t'Vilches',\n\t'Dornbusch',\n\t'Erdahl',\n\t'Kleinhenz',\n\t'Moneypenny',\n\t'Tomasko',\n\t'Vandevender',\n\t'Cromley',\n\t'Tun',\n\t'Velasques',\n\t'Roble',\n\t'Burgo',\n\t'Waples',\n\t'Mabon',\n\t'Benincasa',\n\t'Buttermore',\n\t'Dalbec',\n\t'Eikenberry',\n\t'Fuehrer',\n\t'Hossler',\n\t'Lepp',\n\t'Opheim',\n\t'Sarsfield',\n\t'Strobl',\n\t'Strouth',\n\t'Tousley',\n\t'Wilczek',\n\t'Kleppe',\n\t'Muraoka',\n\t'Wiencek',\n\t'Pinckard',\n\t'Ahsan',\n\t'Welder',\n\t'Forton',\n\t'Lorden',\n\t'Stlawrence',\n\t'Marina',\n\t'Mcquire',\n\t'Randleman',\n\t'Pates',\n\t'Fluitt',\n\t'Scotland',\n\t'Clerk',\n\t'Townsell',\n\t'Arrasmith',\n\t'Baisch',\n\t'Berling',\n\t'Busler',\n\t'Curtice',\n\t'Ebinger',\n\t'Fleeger',\n\t'Geng',\n\t'Goettsch',\n\t'Henneberry',\n\t'Johannesen',\n\t'Mcilrath',\n\t'Perigo',\n\t'Phibbs',\n\t'Riske',\n\t'Scarcella',\n\t'Vandyken',\n\t'Barstad',\n\t'Dicamillo',\n\t'Ernsberger',\n\t'Guebara',\n\t'Peetz',\n\t'Newcome',\n\t'Alterman',\n\t'Weik',\n\t'Trier',\n\t'Yeats',\n\t'Hugg',\n\t'Crayne',\n\t'Ige',\n\t'Coach',\n\t'Archuletta',\n\t'Bodi',\n\t'Cadavid',\n\t'Ceccarelli',\n\t'Derksen',\n\t'Deutscher',\n\t'Genter',\n\t'Gogel',\n\t'Gorczyca',\n\t'Grohs',\n\t'Koplin',\n\t'Kozloski',\n\t'Lillo',\n\t'Oplinger',\n\t'Pulis',\n\t'Renk',\n\t'Repka',\n\t'Scavo',\n\t'Vitagliano',\n\t'Weinkauf',\n\t'Yellin',\n\t'Boehlke',\n\t'Montecalvo',\n\t'Castrillo',\n\t'Grenon',\n\t'Wellen',\n\t'Keelan',\n\t'Coville',\n\t'Rison',\n\t'Jourdain',\n\t'Chestnutt',\n\t'Sharpley',\n\t'Acharya',\n\t'Bartles',\n\t'Burruel',\n\t'Capelle',\n\t'Contos',\n\t'Friedrichsen',\n\t'Heaberlin',\n\t'Hermiz',\n\t'Iracheta',\n\t'Klutts',\n\t'Koziel',\n\t'Salto',\n\t'Scaturro',\n\t'Stasik',\n\t'Stitzel',\n\t'Wiseley',\n\t'Paccione',\n\t'Squyres',\n\t'Leverich',\n\t'Holderness',\n\t'Elvin',\n\t'Morand',\n\t'Lizana',\n\t'Woolen',\n\t'Amarante',\n\t'Arn',\n\t'Biedermann',\n\t'Daddio',\n\t'Davilla',\n\t'Forti',\n\t'Gripp',\n\t'Hanzlik',\n\t'Iannotti',\n\t'Larin',\n\t'Nakajima',\n\t'Novacek',\n\t'Pesch',\n\t'Regino',\n\t'Rosengarten',\n\t'Schleif',\n\t'Searing',\n\t'Sikkema',\n\t'Walstrom',\n\t'Guastella',\n\t'Hemstreet',\n\t'Rorabaugh',\n\t'Weisenburger',\n\t'Cannan',\n\t'Band',\n\t'Fowkes',\n\t'Bennetts',\n\t'Purviance',\n\t'Tippin',\n\t'Brossard',\n\t'Seigle',\n\t'Babyak',\n\t'Billiter',\n\t'Cartner',\n\t'Deetz',\n\t'Dorow',\n\t'Laur',\n\t'Leblond',\n\t'Lecomte',\n\t'Morando',\n\t'Reitman',\n\t'Sarria',\n\t'Scheu',\n\t'Timmermann',\n\t'Vaneck',\n\t'Vangorp',\n\t'Windhorst',\n\t'Kaeser',\n\t'Kosloski',\n\t'Cappuccio',\n\t'Knitter',\n\t'Evon',\n\t'Garbett',\n\t'Wickens',\n\t'Ruston',\n\t'Fregia',\n\t'Ashurst',\n\t'Ede',\n\t'Strider',\n\t'Reaux',\n\t'Castellani',\n\t'Debus',\n\t'Degracia',\n\t'Hineman',\n\t'Laning',\n\t'Litts',\n\t'Losito',\n\t'Massi',\n\t'Mazzara',\n\t'Schriber',\n\t'Seyfert',\n\t'Strength',\n\t'Treptow',\n\t'Yuhasz',\n\t'Kamrath',\n\t'Krigbaum',\n\t'Marrocco',\n\t'Wanta',\n\t'Yakubov',\n\t'Hy',\n\t'Sabedra',\n\t'Belling',\n\t'Deats',\n\t'Mahaffy',\n\t'Brodrick',\n\t'Mcneece',\n\t'Madding',\n\t'Mottley',\n\t'Asp',\n\t'Borgerding',\n\t'Conrady',\n\t'Dagenhart',\n\t'Defusco',\n\t'Duensing',\n\t'Ensz',\n\t'Fockler',\n\t'Gajda',\n\t'Masino',\n\t'Minster',\n\t'Naso',\n\t'Nifong',\n\t'Ohlsen',\n\t'Prairie',\n\t'Rosendale',\n\t'Rotman',\n\t'Salzano',\n\t'Samet',\n\t'Takagi',\n\t'Vandagriff',\n\t'Vespa',\n\t'Zaragosa',\n\t'Howdyshell',\n\t'Kilburg',\n\t'Mellado',\n\t'Mollet',\n\t'Varone',\n\t'Benne',\n\t'Dillehay',\n\t'Ruther',\n\t'Gullick',\n\t'Lasure',\n\t'Wilkenson',\n\t'Lawrance',\n\t'Amacker',\n\t'Wisher',\n\t'Pryer',\n\t'Torian',\n\t'Aragona',\n\t'Dains',\n\t'Darrigo',\n\t'Escajeda',\n\t'Fertitta',\n\t'Futral',\n\t'Kielty',\n\t'Kightlinger',\n\t'Lanuza',\n\t'Marich',\n\t'Mcenaney',\n\t'Mohrman',\n\t'Pressnell',\n\t'Prestia',\n\t'Scullin',\n\t'Seidner',\n\t'Steigerwalt',\n\t'Wassell',\n\t'Bonavita',\n\t'Bourgault',\n\t'Sentz',\n\t'Viswanathan',\n\t'Hanchey',\n\t'Volpi',\n\t'Wilensky',\n\t'Mathey',\n\t'Mages',\n\t'Raimo',\n\t'Cozine',\n\t'Sprow',\n\t'Petties',\n\t'Bracht',\n\t'Cayabyab',\n\t'Comp',\n\t'Flamenco',\n\t'Friederich',\n\t'Hori',\n\t'Husmann',\n\t'Isidoro',\n\t'Ketchem',\n\t'Krishnamurthy',\n\t'Kucinski',\n\t'Lalani',\n\t'Lamacchia',\n\t'Lecher',\n\t'Morante',\n\t'Schrieber',\n\t'Sciarra',\n\t'Vandamme',\n\t'Welz',\n\t'Bozich',\n\t'Cancilla',\n\t'Panduro',\n\t'Mcglade',\n\t'Wasmund',\n\t'Riso',\n\t'Moronta',\n\t'Kemple',\n\t'Rocks',\n\t'Sainsbury',\n\t'Solo',\n\t'Harnage',\n\t'Sturkie',\n\t'Hollingworth',\n\t'Denley',\n\t'Bumpass',\n\t'Lovick',\n\t'Bribiesca',\n\t'Dewilde',\n\t'Drohan',\n\t'Geringer',\n\t'Kokoszka',\n\t'Kronberg',\n\t'Lewinski',\n\t'Lunney',\n\t'Morehart',\n\t'Ty',\n\t'Vasseur',\n\t'Vona',\n\t'Wriston',\n\t'Casarrubias',\n\t'Copsey',\n\t'Rochette',\n\t'Macwilliams',\n\t'Natali',\n\t'Milanes',\n\t'Rux',\n\t'Woodcox',\n\t'Bernett',\n\t'Bronaugh',\n\t'Fulwood',\n\t'Bhalla',\n\t'Depalo',\n\t'Hench',\n\t'Huckeba',\n\t'Kasch',\n\t'Kisor',\n\t'Marinos',\n\t'Nakahara',\n\t'Parrent',\n\t'Rantz',\n\t'Schoenbeck',\n\t'Schwieterman',\n\t'Selk',\n\t'Swonger',\n\t'Walding',\n\t'Nunamaker',\n\t'Schuchardt',\n\t'Leverton',\n\t'Fiallo',\n\t'Viruet',\n\t'Fadel',\n\t'Robel',\n\t'Calley',\n\t'Renton',\n\t'Rack',\n\t'Brin',\n\t'Cocks',\n\t'Mcivor',\n\t'Bois',\n\t'Demary',\n\t'Bason',\n\t'Dowlen',\n\t'Prophete',\n\t'Collymore',\n\t'Beisner',\n\t'Briand',\n\t'Cumberledge',\n\t'Curro',\n\t'Cutcher',\n\t'Daponte',\n\t'Eckroth',\n\t'Edgemon',\n\t'Farinella',\n\t'Kobe',\n\t'Muilenburg',\n\t'Osiecki',\n\t'Cutsinger',\n\t'Biggar',\n\t'Maciver',\n\t'Quesinberry',\n\t'Rippetoe',\n\t'Baswell',\n\t'Caven',\n\t'Mimbs',\n\t'Hurlock',\n\t'Cham',\n\t'Cypress',\n\t'Emile',\n\t'Beitel',\n\t'Bellavance',\n\t'Casada',\n\t'Fandel',\n\t'Gillentine',\n\t'Gorelick',\n\t'Kassis',\n\t'Klim',\n\t'Kohnke',\n\t'Lutgen',\n\t'Nalbandian',\n\t'Schepis',\n\t'Troester',\n\t'Hartje',\n\t'Hippensteel',\n\t'Kiehn',\n\t'Kuenzi',\n\t'Greenburg',\n\t'Boroughs',\n\t'Catton',\n\t'Adney',\n\t'Olivencia',\n\t'Mcdermitt',\n\t'Ashwell',\n\t'Leazer',\n\t'Poag',\n\t'Prevo',\n\t'Porcher',\n\t'Hugley',\n\t'Salone',\n\t'Jupiter',\n\t'Bratz',\n\t'Ehresman',\n\t'Fauber',\n\t'Filippelli',\n\t'Kesling',\n\t'Kronk',\n\t'Mcelhiney',\n\t'Mcgreal',\n\t'Miyasato',\n\t'Moomey',\n\t'Nicolini',\n\t'Osberg',\n\t'Ostroski',\n\t'Sanzo',\n\t'Sybert',\n\t'Dimichele',\n\t'Gerrits',\n\t'Shatley',\n\t'Weider',\n\t'Faraj',\n\t'Paules',\n\t'Yarberry',\n\t'Lege',\n\t'Pembroke',\n\t'Clipper',\n\t'Filmore',\n\t'Crichlow',\n\t'Blaustein',\n\t'Boak',\n\t'Canzoneri',\n\t'Crescenzo',\n\t'Ebaugh',\n\t'Feig',\n\t'Jens',\n\t'Knoebel',\n\t'Mohammadi',\n\t'Montour',\n\t'Norgren',\n\t'Pasquini',\n\t'Prost',\n\t'Reh',\n\t'Rosal',\n\t'Thesing',\n\t'Titcomb',\n\t'Wolinski',\n\t'Zeitlin',\n\t'Depoy',\n\t'Guccione',\n\t'Ritsema',\n\t'Valent',\n\t'Drey',\n\t'Govoni',\n\t'Lonsdale',\n\t'Hultz',\n\t'Harvie',\n\t'Levison',\n\t'Colomb',\n\t'Dace',\n\t'Cleckley',\n\t'Godette',\n\t'Brentlinger',\n\t'Fetrow',\n\t'Giuffrida',\n\t'Kopka',\n\t'Kurtzman',\n\t'Panameno',\n\t'Pannone',\n\t'Parzych',\n\t'Seipp',\n\t'Stobbe',\n\t'Thulin',\n\t'Torosian',\n\t'Trani',\n\t'Zietlow',\n\t'Montufar',\n\t'Stohr',\n\t'Woloszyn',\n\t'Cimini',\n\t'Angles',\n\t'Nicasio',\n\t'Vi',\n\t'Em',\n\t'Couchman',\n\t'Hobbie',\n\t'Bluestein',\n\t'Phillipson',\n\t'Shiels',\n\t'Altice',\n\t'Williston',\n\t'Kone',\n\t'Tadesse',\n\t'Abbruzzese',\n\t'Badders',\n\t'Duxbury',\n\t'Egeland',\n\t'Freyre',\n\t'Haen',\n\t'Hineline',\n\t'Kniss',\n\t'Kothe',\n\t'Kyker',\n\t'Popelka',\n\t'Sanjose',\n\t'Slaugh',\n\t'Wecker',\n\t'Wiechman',\n\t'Bilello',\n\t'Keezer',\n\t'Knode',\n\t'Longhurst',\n\t'Wisser',\n\t'Cease',\n\t'Contrera',\n\t'Berroa',\n\t'Aguon',\n\t'Pott',\n\t'Blitch',\n\t'Suares',\n\t'Bein',\n\t'Acre',\n\t'Ailes',\n\t'Tutwiler',\n\t'Porte',\n\t'Ashwood',\n\t'Blackson',\n\t'Viverette',\n\t'Balthazar',\n\t'Kidane',\n\t'Allegretti',\n\t'Corbeil',\n\t'Crossno',\n\t'Cudworth',\n\t'Federspiel',\n\t'Hamstra',\n\t'Kibbey',\n\t'Lefevers',\n\t'Loomer',\n\t'Losada',\n\t'Medema',\n\t'Palmerin',\n\t'Peregoy',\n\t'Previte',\n\t'Riedinger',\n\t'Schlossberg',\n\t'Wilemon',\n\t'Lepkowski',\n\t'Mcdanel',\n\t'Commisso',\n\t'Baiza',\n\t'Fones',\n\t'Divis',\n\t'Diedrick',\n\t'Grave',\n\t'Bonkowski',\n\t'Cerami',\n\t'Drinkwine',\n\t'Hauke',\n\t'Heun',\n\t'Keilman',\n\t'Klemmer',\n\t'Mella',\n\t'Olarte',\n\t'Ryall',\n\t'Veltman',\n\t'Wlodarczyk',\n\t'Bashor',\n\t'Kubinski',\n\t'Vanacker',\n\t'Prouse',\n\t'Perrott',\n\t'Berrio',\n\t'Mccarney',\n\t'Seiders',\n\t'Jafari',\n\t'Louque',\n\t'Melder',\n\t'Grazier',\n\t'Gabay',\n\t'Hardway',\n\t'Sadiq',\n\t'Sully',\n\t'Durrell',\n\t'Barno',\n\t'Maybin',\n\t'Brazile',\n\t'Asante',\n\t'Awalt',\n\t'Badal',\n\t'Cucinotta',\n\t'Grenfell',\n\t'Hartis',\n\t'Herbster',\n\t'Hesch',\n\t'Klosowski',\n\t'Overfelt',\n\t'Pangelinan',\n\t'Pflum',\n\t'Rozema',\n\t'Spivack',\n\t'Vallez',\n\t'Vetere',\n\t'Villamor',\n\t'Wedekind',\n\t'Bobrowski',\n\t'Nguyenthi',\n\t'Nowaczyk',\n\t'Vis',\n\t'Pownall',\n\t'Susan',\n\t'Yanni',\n\t'Gest',\n\t'Balthrop',\n\t'Treasure',\n\t'Harston',\n\t'Frett',\n\t'Buttery',\n\t'Chiarelli',\n\t'Colledge',\n\t'Czaplicki',\n\t'Fahringer',\n\t'Fedder',\n\t'Gerstenberger',\n\t'Gretz',\n\t'Hallquist',\n\t'Hemme',\n\t'Kolling',\n\t'Krauth',\n\t'Liquori',\n\t'Podolsky',\n\t'Scheirer',\n\t'Sehgal',\n\t'Selinger',\n\t'Wintermute',\n\t'Chokshi',\n\t'Dimarzio',\n\t'Santoni',\n\t'Wetherby',\n\t'Flis',\n\t'Comley',\n\t'Boyt',\n\t'Farrah',\n\t'Mario',\n\t'Mcquilkin',\n\t'Tim',\n\t'Cusic',\n\t'Enge',\n\t'Millage',\n\t'Waheed',\n\t'Kenan',\n\t'Silmon',\n\t'Mcconico',\n\t'Bougher',\n\t'Braly',\n\t'Coriell',\n\t'Daignault',\n\t'Henschen',\n\t'Holsomback',\n\t'Johal',\n\t'Kellams',\n\t'Schaumburg',\n\t'Stockinger',\n\t'Urquidi',\n\t'Cabanillas',\n\t'Lindbloom',\n\t'Willinger',\n\t'Redpath',\n\t'Baller',\n\t'Juarbe',\n\t'Badia',\n\t'Elderkin',\n\t'Dessert',\n\t'Retter',\n\t'Mccollam',\n\t'Rivette',\n\t'Devins',\n\t'Hewell',\n\t'Penniman',\n\t'Arbuthnot',\n\t'Cotman',\n\t'Tezeno',\n\t'Albo',\n\t'Beezley',\n\t'Can',\n\t'Chesler',\n\t'Dehne',\n\t'Demchak',\n\t'Edberg',\n\t'Gotham',\n\t'Ingels',\n\t'Kaercher',\n\t'Kwiecinski',\n\t'Landolt',\n\t'Macdonnell',\n\t'Malicoat',\n\t'Meinen',\n\t'Niswander',\n\t'Pandit',\n\t'Pettet',\n\t'Pliska',\n\t'Ploch',\n\t'Ratigan',\n\t'Sampsel',\n\t'Sick',\n\t'Ciampi',\n\t'Mctighe',\n\t'Riester',\n\t'Salvucci',\n\t'Tornow',\n\t'Vencill',\n\t'Racey',\n\t'Haroldson',\n\t'Finder',\n\t'Dennen',\n\t'Stano',\n\t'Boys',\n\t'Camillo',\n\t'Woodfield',\n\t'Turrell',\n\t'Sami',\n\t'Annan',\n\t'Yeldell',\n\t'Madlock',\n\t'Manigo',\n\t'Arcila',\n\t'Bauza',\n\t'Bisceglia',\n\t'Crouthamel',\n\t'Debenedetto',\n\t'Delude',\n\t'Dorta',\n\t'Fairburn',\n\t'Garciagarcia',\n\t'Geeslin',\n\t'Kazanjian',\n\t'Loescher',\n\t'Mccarl',\n\t'Mulqueen',\n\t'Pultz',\n\t'Shutter',\n\t'Spacek',\n\t'Yamanaka',\n\t'Borkholder',\n\t'Halko',\n\t'Pieroni',\n\t'Proano',\n\t'Sarkisyan',\n\t'Riopelle',\n\t'Routson',\n\t'Fogelman',\n\t'Sou',\n\t'Tress',\n\t'Altemus',\n\t'Bosh',\n\t'Laroque',\n\t'Hueston',\n\t'Latin',\n\t'Taitt',\n\t'Lymon',\n\t'Chadd',\n\t'Challis',\n\t'Comella',\n\t'Drabik',\n\t'Entz',\n\t'Hagner',\n\t'Knobbe',\n\t'Luckenbill',\n\t'Macphail',\n\t'Mogg',\n\t'Paustian',\n\t'Rimel',\n\t'Schilke',\n\t'Folkman',\n\t'Lemery',\n\t'Quinby',\n\t'Cliburn',\n\t'Rowand',\n\t'Wambach',\n\t'Gammell',\n\t'Nobrega',\n\t'Hoggan',\n\t'Nightengale',\n\t'Alison',\n\t'Batte',\n\t'Borner',\n\t'Hudnell',\n\t'Casseus',\n\t'Boteler',\n\t'Cantos',\n\t'Contois',\n\t'Coventry',\n\t'Dezarn',\n\t'Eisenbarth',\n\t'Hegel',\n\t'Jahr',\n\t'Joss',\n\t'Lober',\n\t'Marcks',\n\t'Portilla',\n\t'Reinders',\n\t'Scouten',\n\t'Siri',\n\t'Sobocinski',\n\t'Tesh',\n\t'Veno',\n\t'Wheeldon',\n\t'Yankee',\n\t'Wanke',\n\t'Wollin',\n\t'Longobardi',\n\t'Mccarson',\n\t'Sampsell',\n\t'Harrer',\n\t'Bakewell',\n\t'Mcgalliard',\n\t'Truluck',\n\t'Bremmer',\n\t'Lois',\n\t'Goody',\n\t'Kassim',\n\t'Conniff',\n\t'Elenes',\n\t'Esker',\n\t'Groshong',\n\t'Hallisey',\n\t'Loree',\n\t'Marken',\n\t'Molle',\n\t'Muntean',\n\t'Ozaki',\n\t'Roen',\n\t'Rumer',\n\t'Shorr',\n\t'Tanzer',\n\t'Varady',\n\t'Hillmer',\n\t'Macari',\n\t'Schuld',\n\t'Swartzlander',\n\t'Tsuji',\n\t'Holahan',\n\t'Abee',\n\t'Rowse',\n\t'Pawley',\n\t'Samp',\n\t'Shad',\n\t'Wintz',\n\t'Rainford',\n\t'Cellucci',\n\t'Cumpton',\n\t'Dando',\n\t'Dress',\n\t'Funari',\n\t'Gouker',\n\t'Hemberger',\n\t'Latz',\n\t'Meckes',\n\t'Parrinello',\n\t'Picardi',\n\t'Pilz',\n\t'Pretzer',\n\t'Schriever',\n\t'Sodano',\n\t'Stetter',\n\t'Storti',\n\t'Tiu',\n\t'Zimmerle',\n\t'Dragone',\n\t'Engert',\n\t'Fullenkamp',\n\t'Rockafellow',\n\t'Siwek',\n\t'Zillmer',\n\t'Devol',\n\t'Milke',\n\t'Taira',\n\t'Richner',\n\t'Aros',\n\t'Mancil',\n\t'Yetman',\n\t'Hanney',\n\t'Kinion',\n\t'Ferrand',\n\t'Conyer',\n\t'Chahal',\n\t'Fulfer',\n\t'Gurski',\n\t'Horseman',\n\t'Liebe',\n\t'Nyhus',\n\t'Pernice',\n\t'Pesqueira',\n\t'Rieker',\n\t'Trautmann',\n\t'Yellowhair',\n\t'Schwanz',\n\t'Salinger',\n\t'Carvell',\n\t'Heymann',\n\t'Grad',\n\t'Pharo',\n\t'Pipher',\n\t'Magalhaes',\n\t'Kissee',\n\t'Winthrop',\n\t'Leid',\n\t'Sledd',\n\t'Bladen',\n\t'Rahaman',\n\t'Holdman',\n\t'Goldwire',\n\t'Lawal',\n\t'Sinkfield',\n\t'Bryk',\n\t'Butkiewicz',\n\t'Gagen',\n\t'Gettle',\n\t'Goede',\n\t'Hardenbrook',\n\t'Heinsohn',\n\t'Kovalcik',\n\t'Needleman',\n\t'Obeso',\n\t'Parziale',\n\t'Schaus',\n\t'Wadlow',\n\t'Haluska',\n\t'Stiteler',\n\t'Zaruba',\n\t'Tschirhart',\n\t'Biscardi',\n\t'Gopal',\n\t'Avella',\n\t'Ponto',\n\t'Levit',\n\t'Trevor',\n\t'Pimienta',\n\t'Plass',\n\t'Guthery',\n\t'Cordy',\n\t'Tuff',\n\t'Zellars',\n\t'Altier',\n\t'Berges',\n\t'Connick',\n\t'Deruyter',\n\t'Divita',\n\t'Frankovich',\n\t'Ingenito',\n\t'Kosman',\n\t'Lantis',\n\t'Lovering',\n\t'Sortino',\n\t'Waage',\n\t'Wildrick',\n\t'Barberio',\n\t'Domin',\n\t'Meisels',\n\t'Sender',\n\t'Giovanni',\n\t'Sanguinetti',\n\t'Beary',\n\t'Helmstetter',\n\t'Joens',\n\t'Beaven',\n\t'Kines',\n\t'Surrency',\n\t'Sheilds',\n\t'Chamber',\n\t'Albarez',\n\t'Ambrocio',\n\t'Arrellano',\n\t'Berrigan',\n\t'Bookwalter',\n\t'Caravella',\n\t'Higbie',\n\t'Lotter',\n\t'Lougee',\n\t'Manganiello',\n\t'Nobriga',\n\t'Roorda',\n\t'Serr',\n\t'Squillace',\n\t'Tejera',\n\t'Tipping',\n\t'Wohler',\n\t'Carreto',\n\t'Deignan',\n\t'Luebbers',\n\t'Engelhard',\n\t'Hollenback',\n\t'Baldo',\n\t'Gearin',\n\t'Bia',\n\t'Figueras',\n\t'Lule',\n\t'Libert',\n\t'Florida',\n\t'Wyne',\n\t'Mccright',\n\t'Jacko',\n\t'Cawthorne',\n\t'Rhue',\n\t'Betton',\n\t'Cisse',\n\t'Arth',\n\t'Bendickson',\n\t'Cangialosi',\n\t'Coltharp',\n\t'Cubias',\n\t'Czarnik',\n\t'Erpelding',\n\t'Erway',\n\t'Heister',\n\t'Mergen',\n\t'Murrietta',\n\t'Nachman',\n\t'Nusser',\n\t'Ostrem',\n\t'Pei',\n\t'Pescatore',\n\t'Reim',\n\t'Shaull',\n\t'Spranger',\n\t'Uphold',\n\t'Yslas',\n\t'Heinold',\n\t'Lindemuth',\n\t'Redeker',\n\t'Rochin',\n\t'Wisehart',\n\t'Carsey',\n\t'Nocella',\n\t'Combe',\n\t'Thacher',\n\t'Hammad',\n\t'Bene',\n\t'Yelvington',\n\t'Mccrone',\n\t'Driessen',\n\t'Saxby',\n\t'Maull',\n\t'Jeune',\n\t'Amorim',\n\t'Degrazia',\n\t'Doege',\n\t'Flinchbaugh',\n\t'Goodreau',\n\t'Hanisch',\n\t'Hoaglund',\n\t'Imamura',\n\t'Lafler',\n\t'Linne',\n\t'Profeta',\n\t'Reifschneider',\n\t'Santaana',\n\t'Scaffidi',\n\t'Shreeve',\n\t'Stadelman',\n\t'Dippolito',\n\t'Pizzuti',\n\t'Rodenberg',\n\t'Schartz',\n\t'Reiger',\n\t'Solie',\n\t'Willen',\n\t'Atallah',\n\t'Wyers',\n\t'Harpel',\n\t'Cleckler',\n\t'Fobes',\n\t'Sniffen',\n\t'Pedroso',\n\t'Samara',\n\t'Malcomb',\n\t'Penry',\n\t'Stearn',\n\t'Seller',\n\t'Abeita',\n\t'Bilotti',\n\t'Brosky',\n\t'Clewell',\n\t'Fraijo',\n\t'Gaskey',\n\t'Goodfriend',\n\t'Mesaros',\n\t'Musch',\n\t'Nulph',\n\t'Obarr',\n\t'Roat',\n\t'Sabato',\n\t'Sauerwein',\n\t'Schum',\n\t'Silsby',\n\t'Weyenberg',\n\t'Corrente',\n\t'Egloff',\n\t'Kohrs',\n\t'Sammartino',\n\t'Thoennes',\n\t'Carmer',\n\t'Madura',\n\t'Shang',\n\t'Faxon',\n\t'Monell',\n\t'Laden',\n\t'Yousuf',\n\t'Mcgauley',\n\t'Salmond',\n\t'Berhane',\n\t'Abood',\n\t'Bondar',\n\t'Buehrer',\n\t'Capelli',\n\t'Gersten',\n\t'Hambly',\n\t'Haymaker',\n\t'Kosar',\n\t'Lahaie',\n\t'Lecrone',\n\t'Lippy',\n\t'Pohle',\n\t'Shimmel',\n\t'Viall',\n\t'Yother',\n\t'Deviney',\n\t'Kosiba',\n\t'Wiederholt',\n\t'Sivley',\n\t'Wheelis',\n\t'Kanipe',\n\t'Braz',\n\t'Peacher',\n\t'Quadri',\n\t'Hancox',\n\t'Paye',\n\t'Curlin',\n\t'Broden',\n\t'Mckeller',\n\t'Baltodano',\n\t'Baquero',\n\t'Bolek',\n\t'Brede',\n\t'Bulson',\n\t'Christmann',\n\t'Cisler',\n\t'Delio',\n\t'Duffee',\n\t'Duzan',\n\t'Kuschel',\n\t'Mohon',\n\t'Nedrow',\n\t'Sengupta',\n\t'Timpe',\n\t'Veeder',\n\t'Zollner',\n\t'Zummo',\n\t'Hribar',\n\t'Laredo',\n\t'Mcdivitt',\n\t'Nazari',\n\t'Davern',\n\t'Heizer',\n\t'Orejel',\n\t'Haggett',\n\t'Flore',\n\t'Soley',\n\t'Bardell',\n\t'Comegys',\n\t'Bessent',\n\t'Shaheed',\n\t'Brugman',\n\t'Choudhary',\n\t'Fehl',\n\t'Fogt',\n\t'Heckmann',\n\t'Iacobucci',\n\t'Klaver',\n\t'Lumbert',\n\t'Mussman',\n\t'Pierotti',\n\t'Pihl',\n\t'Sandrock',\n\t'Scritchfield',\n\t'Siefken',\n\t'Stavropoulos',\n\t'Thomley',\n\t'Zenker',\n\t'Enke',\n\t'Knoke',\n\t'Rung',\n\t'Mikita',\n\t'Kunkler',\n\t'Deskin',\n\t'Egnor',\n\t'Vader',\n\t'Allers',\n\t'Pi',\n\t'Sproull',\n\t'Peller',\n\t'Kendell',\n\t'Jinkins',\n\t'Iglehart',\n\t'Brookens',\n\t'Darrough',\n\t'Winzer',\n\t'Amenta',\n\t'Aughenbaugh',\n\t'Barnick',\n\t'Conaty',\n\t'Eichmann',\n\t'Gilday',\n\t'Guhl',\n\t'Koskela',\n\t'Makuch',\n\t'Osoria',\n\t'Pujols',\n\t'Reinsch',\n\t'Reiswig',\n\t'Rosebrock',\n\t'Sahli',\n\t'Seitzinger',\n\t'Shermer',\n\t'Vasbinder',\n\t'Zanghi',\n\t'Flahive',\n\t'Mieczkowski',\n\t'Osmundson',\n\t'Willmann',\n\t'Agramonte',\n\t'Aven',\n\t'Vanderzee',\n\t'Fraher',\n\t'Kannan',\n\t'Shira',\n\t'Zetina',\n\t'Gilden',\n\t'Hingle',\n\t'Boutros',\n\t'Scutt',\n\t'Foree',\n\t'Gillins',\n\t'Screen',\n\t'Birden',\n\t'Guinyard',\n\t'Berreth',\n\t'Bertini',\n\t'Bousman',\n\t'Butchko',\n\t'Caras',\n\t'Donoso',\n\t'Gavilanes',\n\t'Karow',\n\t'Kouri',\n\t'Rediger',\n\t'Rininger',\n\t'Rosecrans',\n\t'Toops',\n\t'Vigliotti',\n\t'Cancio',\n\t'Karger',\n\t'Milholland',\n\t'Thielke',\n\t'Amster',\n\t'Rosch',\n\t'Elks',\n\t'Vasco',\n\t'Doshier',\n\t'Belasco',\n\t'Lean',\n\t'Dickason',\n\t'Suitt',\n\t'Tipler',\n\t'Obey',\n\t'Crear',\n\t'Redic',\n\t'Agredano',\n\t'Amarillas',\n\t'Arnesen',\n\t'Celedon',\n\t'Clapsaddle',\n\t'Coveney',\n\t'Demorest',\n\t'Gleich',\n\t'Guenthner',\n\t'Haverland',\n\t'Jaffee',\n\t'Kusek',\n\t'Manni',\n\t'Mysliwiec',\n\t'Nakama',\n\t'Ngan',\n\t'Ohmer',\n\t'Romanoff',\n\t'Salaiz',\n\t'Zeiders',\n\t'Bartholow',\n\t'Budke',\n\t'Centanni',\n\t'Koppelman',\n\t'Liberti',\n\t'Gatta',\n\t'Lovegrove',\n\t'Maggs',\n\t'Malay',\n\t'Blind',\n\t'Kerman',\n\t'Frans',\n\t'Rendleman',\n\t'Tyrone',\n\t'Ambers',\n\t'Rambert',\n\t'Killings',\n\t'Balicki',\n\t'Bohac',\n\t'Brisbois',\n\t'Cervone',\n\t'Curtner',\n\t'Ertle',\n\t'Fantozzi',\n\t'Feger',\n\t'Fineman',\n\t'Garate',\n\t'Goldy',\n\t'Gudmundson',\n\t'Harcrow',\n\t'Herdt',\n\t'Klapp',\n\t'Mirra',\n\t'Radu',\n\t'Saiki',\n\t'Unser',\n\t'Valko',\n\t'Verhoff',\n\t'Candelas',\n\t'Ireton',\n\t'Vanhuss',\n\t'Wierman',\n\t'Zawistowski',\n\t'Geiman',\n\t'Mess',\n\t'Full',\n\t'Fuertes',\n\t'Derickson',\n\t'Mccole',\n\t'Godden',\n\t'Mizzell',\n\t'Sane',\n\t'Shirer',\n\t'Fickling',\n\t'Marcelle',\n\t'Tramble',\n\t'Cappelletti',\n\t'Catterton',\n\t'Champeau',\n\t'Czyzewski',\n\t'Dirusso',\n\t'Herget',\n\t'Heupel',\n\t'Hinchliffe',\n\t'Levitsky',\n\t'Maheu',\n\t'Nakao',\n\t'Petsche',\n\t'Pilkenton',\n\t'Raska',\n\t'Rief',\n\t'Scheidegger',\n\t'Schmeltzer',\n\t'Sherlin',\n\t'Skarda',\n\t'Strassburg',\n\t'Sundaram',\n\t'Wuertz',\n\t'Bonanni',\n\t'Montante',\n\t'Ottesen',\n\t'Nading',\n\t'Bram',\n\t'Debell',\n\t'Sia',\n\t'Latch',\n\t'Largen',\n\t'Nack',\n\t'Smillie',\n\t'Debold',\n\t'Bruer',\n\t'Steedley',\n\t'Mckinny',\n\t'Radney',\n\t'Amadio',\n\t'Bearman',\n\t'Canny',\n\t'Cansino',\n\t'Cupo',\n\t'Ekstrand',\n\t'Forrer',\n\t'Imm',\n\t'Kawano',\n\t'Klingaman',\n\t'Kovacevich',\n\t'Lukasiewicz',\n\t'Mcdermid',\n\t'Michon',\n\t'Mincks',\n\t'Piano',\n\t'Ronayne',\n\t'Schaum',\n\t'Sciandra',\n\t'Villafan',\n\t'Wolin',\n\t'Schrager',\n\t'Strawderman',\n\t'Hable',\n\t'Skees',\n\t'Persky',\n\t'Defore',\n\t'Edmonston',\n\t'Base',\n\t'Barrell',\n\t'Cressey',\n\t'Husser',\n\t'Matin',\n\t'Mckennon',\n\t'Barak',\n\t'Buffone',\n\t'Clemence',\n\t'Delaguila',\n\t'Eberwein',\n\t'Eichholz',\n\t'Faraone',\n\t'Herington',\n\t'Kempa',\n\t'Kenefick',\n\t'Lahaye',\n\t'Larusso',\n\t'Osterloh',\n\t'Pfluger',\n\t'Pomponio',\n\t'Shiu',\n\t'Stokke',\n\t'Trembly',\n\t'Weck',\n\t'Alire',\n\t'Babayan',\n\t'Hustad',\n\t'Stumph',\n\t'Zwiebel',\n\t'Wicke',\n\t'Brauch',\n\t'Milos',\n\t'Haggart',\n\t'Mento',\n\t'Kennamer',\n\t'Thibeau',\n\t'Winge',\n\t'Lords',\n\t'Debaun',\n\t'Haw',\n\t'Mould',\n\t'Elison',\n\t'Etling',\n\t'Froemming',\n\t'Ghazarian',\n\t'Justesen',\n\t'Kawai',\n\t'Lensing',\n\t'Lindhorst',\n\t'Poveda',\n\t'Rabadan',\n\t'Vigeant',\n\t'Warnken',\n\t'Bermel',\n\t'Manry',\n\t'Suppes',\n\t'Stauder',\n\t'Dayley',\n\t'Lose',\n\t'Tappe',\n\t'Harle',\n\t'Mcquain',\n\t'Bettes',\n\t'Carline',\n\t'Cordner',\n\t'Habeeb',\n\t'Sisney',\n\t'Kyer',\n\t'Bruins',\n\t'Prosise',\n\t'Molton',\n\t'Blye',\n\t'Mccuin',\n\t'Babler',\n\t'Caiazzo',\n\t'Cereceres',\n\t'Ciaramitaro',\n\t'Corkran',\n\t'Crawshaw',\n\t'Degan',\n\t'Dunlavy',\n\t'Gronewold',\n\t'Hartner',\n\t'Kornacki',\n\t'Lapolla',\n\t'Mountz',\n\t'Mumpower',\n\t'Orefice',\n\t'Prats',\n\t'Repasky',\n\t'Schlee',\n\t'Sekhon',\n\t'Stanich',\n\t'Yilmaz',\n\t'Desisto',\n\t'Hanko',\n\t'Nichter',\n\t'Risenhoover',\n\t'Tomasso',\n\t'Blome',\n\t'Carda',\n\t'Ebrahimi',\n\t'Devor',\n\t'Pappa',\n\t'Caravello',\n\t'Lunday',\n\t'Slim',\n\t'Praytor',\n\t'Pickerel',\n\t'Wahab',\n\t'Breeland',\n\t'Flowe',\n\t'Brodnax',\n\t'Monds',\n\t'Sylla',\n\t'Bekele',\n\t'Mozee',\n\t'Beechy',\n\t'Birky',\n\t'Dellavalle',\n\t'Delmastro',\n\t'Dematteis',\n\t'Eckberg',\n\t'Eisenbraun',\n\t'Englehardt',\n\t'Fazzio',\n\t'Gedney',\n\t'Hana',\n\t'Keeran',\n\t'Lallier',\n\t'Martenson',\n\t'Mcelheny',\n\t'Paar',\n\t'Suski',\n\t'Vossen',\n\t'Westergaard',\n\t'Westermann',\n\t'Wiemann',\n\t'Golz',\n\t'Lofquist',\n\t'Pracht',\n\t'Tifft',\n\t'Ruhnke',\n\t'Schnider',\n\t'How',\n\t'Knaggs',\n\t'Bleck',\n\t'Whitelock',\n\t'Berringer',\n\t'Clepper',\n\t'Birkhead',\n\t'Pilson',\n\t'Inabinet',\n\t'Gentles',\n\t'Respress',\n\t'Crumble',\n\t'Bandera',\n\t'Bartunek',\n\t'Buerkle',\n\t'Dulong',\n\t'Eisinger',\n\t'Favero',\n\t'Giusto',\n\t'Guisinger',\n\t'Kiddy',\n\t'Krisher',\n\t'Lounsberry',\n\t'Morikawa',\n\t'Mowdy',\n\t'Penaflor',\n\t'Picariello',\n\t'Quirion',\n\t'Scali',\n\t'Scheibel',\n\t'Schlitt',\n\t'Sermeno',\n\t'Thalman',\n\t'Barraclough',\n\t'Boshart',\n\t'Glatfelter',\n\t'Hjelm',\n\t'Horlacher',\n\t'Muratalla',\n\t'Schepp',\n\t'Fogerty',\n\t'Mulero',\n\t'Manner',\n\t'Creecy',\n\t'Leftridge',\n\t'Ancira',\n\t'Anselmi',\n\t'Blew',\n\t'Coykendall',\n\t'Dembinski',\n\t'Emmerling',\n\t'Fawver',\n\t'Giard',\n\t'Heinzen',\n\t'Kasson',\n\t'Linam',\n\t'Lofaro',\n\t'Magnotta',\n\t'Pitzen',\n\t'Ripa',\n\t'Skowronek',\n\t'Sliter',\n\t'Stauch',\n\t'Szczepaniak',\n\t'Yerian',\n\t'Baccam',\n\t'Berres',\n\t'Helstrom',\n\t'Kocurek',\n\t'Kostelecky',\n\t'Corkins',\n\t'Fesperman',\n\t'Gibble',\n\t'Liranzo',\n\t'Karan',\n\t'Lavely',\n\t'Yorks',\n\t'Lisenbee',\n\t'Jerger',\n\t'Cockroft',\n\t'Brodhead',\n\t'Weathersbee',\n\t'Salih',\n\t'Pore',\n\t'Melbourne',\n\t'Code',\n\t'Scotton',\n\t'Addie',\n\t'Snipe',\n\t'Cuffie',\n\t'Haynesworth',\n\t'Borawski',\n\t'Borchard',\n\t'Cacciola',\n\t'Dedic',\n\t'Grzyb',\n\t'Hecox',\n\t'Horacek',\n\t'Nierman',\n\t'Nofziger',\n\t'Raup',\n\t'Rissler',\n\t'Segler',\n\t'Serviss',\n\t'Soon',\n\t'Tesmer',\n\t'Campanaro',\n\t'Curnutte',\n\t'Rabold',\n\t'Schreyer',\n\t'Siebenaler',\n\t'Zenteno',\n\t'Deveney',\n\t'Kuchera',\n\t'Ruden',\n\t'Skaff',\n\t'Sciulli',\n\t'Howeth',\n\t'Hanly',\n\t'Gola',\n\t'Forkner',\n\t'Rosene',\n\t'Beeker',\n\t'Mazo',\n\t'Lambson',\n\t'Younis',\n\t'Batch',\n\t'Ayo',\n\t'Ackles',\n\t'Hansbrough',\n\t'Terrance',\n\t'Bacani',\n\t'Cracraft',\n\t'Ebben',\n\t'Falzarano',\n\t'Ferreras',\n\t'Hovatter',\n\t'Jaskiewicz',\n\t'Killpack',\n\t'Kwasniewski',\n\t'Mahnken',\n\t'Natera',\n\t'Noboa',\n\t'Rapson',\n\t'Raybuck',\n\t'Shima',\n\t'Vahle',\n\t'Sheeks',\n\t'Laker',\n\t'Krok',\n\t'Debo',\n\t'Oberly',\n\t'Chelf',\n\t'Catala',\n\t'Airey',\n\t'Osten',\n\t'Golay',\n\t'Eliot',\n\t'Lebert',\n\t'Swaggerty',\n\t'Hue',\n\t'Seavers',\n\t'Bomer',\n\t'Bouyer',\n\t'Andazola',\n\t'Blancarte',\n\t'Brierly',\n\t'Centofanti',\n\t'Dalesandro',\n\t'Dickstein',\n\t'Kalas',\n\t'Langman',\n\t'Mouradian',\n\t'Okubo',\n\t'Overbaugh',\n\t'Popek',\n\t'Runnion',\n\t'Sannes',\n\t'Schamber',\n\t'Silfies',\n\t'Sinko',\n\t'Sit',\n\t'Cerrillo',\n\t'Gayler',\n\t'Kauth',\n\t'Culkin',\n\t'Peers',\n\t'Spidle',\n\t'Ballon',\n\t'Rasmus',\n\t'Queenan',\n\t'Reynaud',\n\t'Ambroise',\n\t'Mcclenton',\n\t'Adelmann',\n\t'Avellino',\n\t'Fickle',\n\t'Humm',\n\t'Hussong',\n\t'Iturralde',\n\t'Kritzer',\n\t'Lautzenheiser',\n\t'Linsky',\n\t'Malarkey',\n\t'Mallia',\n\t'Marban',\n\t'Mccance',\n\t'Nawaz',\n\t'Pallone',\n\t'Rindfleisch',\n\t'Schmall',\n\t'Sowle',\n\t'Stanco',\n\t'Whelpley',\n\t'Winning',\n\t'Kopczynski',\n\t'Pickup',\n\t'Tsou',\n\t'Phebus',\n\t'Munter',\n\t'Sisko',\n\t'Fico',\n\t'Mosco',\n\t'Rani',\n\t'Kon',\n\t'Baggott',\n\t'Brom',\n\t'Valerius',\n\t'Fines',\n\t'Megee',\n\t'Salsberry',\n\t'Sheff',\n\t'Mourning',\n\t'Archambeault',\n\t'Bhatnagar',\n\t'Budreau',\n\t'Dieffenbach',\n\t'Gildner',\n\t'Hevener',\n\t'Hippler',\n\t'Jonker',\n\t'Keef',\n\t'Kirlin',\n\t'Litvak',\n\t'Liz',\n\t'Mulhearn',\n\t'Popal',\n\t'Samaha',\n\t'Schwartzberg',\n\t'Sotello',\n\t'Weiskopf',\n\t'Neitzke',\n\t'Strelow',\n\t'Nitsch',\n\t'Lynne',\n\t'Olver',\n\t'Bange',\n\t'Boot',\n\t'Carmine',\n\t'Bellville',\n\t'Lafitte',\n\t'Condry',\n\t'Mccotter',\n\t'Spruiell',\n\t'Moman',\n\t'Legree',\n\t'Bongard',\n\t'Deiss',\n\t'Devoy',\n\t'Gusler',\n\t'Ianni',\n\t'Kolker',\n\t'Lagomarsino',\n\t'Leier',\n\t'Marbut',\n\t'Minsky',\n\t'Okumura',\n\t'Roza',\n\t'Siemon',\n\t'Vescio',\n\t'Wirkus',\n\t'Huizinga',\n\t'Lazalde',\n\t'Morici',\n\t'Ungaro',\n\t'Detamore',\n\t'Meer',\n\t'Erman',\n\t'Sherrow',\n\t'Laforte',\n\t'Pellman',\n\t'Bostock',\n\t'Lender',\n\t'Peagler',\n\t'Rhem',\n\t'Brisbon',\n\t'Angers',\n\t'Azbill',\n\t'Busto',\n\t'Coggeshall',\n\t'Cucci',\n\t'Defino',\n\t'Duey',\n\t'Fecht',\n\t'Grudzinski',\n\t'Guarneri',\n\t'Huesca',\n\t'Kolbeck',\n\t'Mennella',\n\t'Nishi',\n\t'Ohaver',\n\t'Porth',\n\t'Romanello',\n\t'Serrata',\n\t'Thoele',\n\t'Thornsbury',\n\t'Ulsh',\n\t'Vanderlinde',\n\t'Weninger',\n\t'Bonaventura',\n\t'Cura',\n\t'Filley',\n\t'Grabinski',\n\t'Kloc',\n\t'Kulinski',\n\t'Maruca',\n\t'Dantoni',\n\t'Grohman',\n\t'Starbird',\n\t'Rach',\n\t'Asman',\n\t'Mosso',\n\t'Slaney',\n\t'Kall',\n\t'Nevil',\n\t'Blann',\n\t'Frear',\n\t'Mosey',\n\t'Wrench',\n\t'Balkcom',\n\t'Liburd',\n\t'Yeboah',\n\t'Abbatiello',\n\t'Creviston',\n\t'Dunivan',\n\t'Durnin',\n\t'Eckerman',\n\t'Fennimore',\n\t'Gohlke',\n\t'Holtan',\n\t'Kochevar',\n\t'Kraushaar',\n\t'Landino',\n\t'Maack',\n\t'Montefusco',\n\t'Noguchi',\n\t'Norgard',\n\t'Olafson',\n\t'Paulick',\n\t'Petropoulos',\n\t'Principato',\n\t'Qazi',\n\t'Sammis',\n\t'Sida',\n\t'Sorum',\n\t'Vandal',\n\t'Vertrees',\n\t'Votta',\n\t'Wiesman',\n\t'Fleagle',\n\t'Panaro',\n\t'Stolarski',\n\t'Ogborn',\n\t'Petta',\n\t'Annett',\n\t'Campas',\n\t'Xing',\n\t'Lorey',\n\t'Restaino',\n\t'Forgue',\n\t'Rourk',\n\t'Modisette',\n\t'Aris',\n\t'Vandunk',\n\t'Dia',\n\t'Alverio',\n\t'Ancell',\n\t'Bieler',\n\t'Bouwman',\n\t'Campillo',\n\t'Cebreros',\n\t'Chant',\n\t'Cira',\n\t'Cragun',\n\t'Geppert',\n\t'Hemmert',\n\t'Kister',\n\t'Luger',\n\t'Ojala',\n\t'Pfeifle',\n\t'Piechocki',\n\t'Saldarriaga',\n\t'Skoda',\n\t'Vangorden',\n\t'Winberry',\n\t'Zeeb',\n\t'Gehm',\n\t'Oshima',\n\t'Tofte',\n\t'Tsoi',\n\t'Delman',\n\t'Harsha',\n\t'Finton',\n\t'Triola',\n\t'Bingle',\n\t'Delise',\n\t'Westergard',\n\t'Aul',\n\t'Celia',\n\t'Headings',\n\t'Mates',\n\t'Coste',\n\t'Venus',\n\t'Shearn',\n\t'Adell',\n\t'Minnifield',\n\t'Baxa',\n\t'Cieri',\n\t'Coppens',\n\t'Delahoz',\n\t'Fratus',\n\t'Gribbins',\n\t'Homann',\n\t'Ilg',\n\t'Majchrzak',\n\t'Mcclard',\n\t'Podolak',\n\t'Pollan',\n\t'Savio',\n\t'Schloemer',\n\t'Sesma',\n\t'Tilbury',\n\t'Torrico',\n\t'Vanduyn',\n\t'Eisert',\n\t'Levalley',\n\t'Silversmith',\n\t'Zanoni',\n\t'Grupe',\n\t'Marmolejos',\n\t'Marsch',\n\t'Martes',\n\t'Gorley',\n\t'Furbush',\n\t'Hughlett',\n\t'Stcyr',\n\t'Faustin',\n\t'Bushaw',\n\t'Cerbone',\n\t'Equihua',\n\t'Fiorella',\n\t'Ganzer',\n\t'Gugel',\n\t'Hladik',\n\t'Kalra',\n\t'Leuenberger',\n\t'Lusardi',\n\t'Nogales',\n\t'Schifano',\n\t'Swalley',\n\t'Tangney',\n\t'Zakarian',\n\t'Arenz',\n\t'Bottcher',\n\t'Gervasio',\n\t'Peschel',\n\t'Potteiger',\n\t'Teruya',\n\t'Tullier',\n\t'Lenhard',\n\t'Brusseau',\n\t'Streett',\n\t'Loan',\n\t'Fahmy',\n\t'Broadfoot',\n\t'Shugars',\n\t'Wilshire',\n\t'Mohabir',\n\t'Baye',\n\t'Sean',\n\t'Caruth',\n\t'Arroyos',\n\t'Campise',\n\t'Capparelli',\n\t'Desanti',\n\t'Dunsworth',\n\t'Fasching',\n\t'Heldman',\n\t'Keagle',\n\t'Kulesa',\n\t'Lawrenz',\n\t'Monhollen',\n\t'Niekamp',\n\t'Nucci',\n\t'Ostman',\n\t'Salzmann',\n\t'Schemmel',\n\t'Selin',\n\t'Stencel',\n\t'Zilka',\n\t'Friesner',\n\t'Onstad',\n\t'Poovey',\n\t'Squillante',\n\t'Tullo',\n\t'Uriegas',\n\t'Vigilante',\n\t'Lasswell',\n\t'Navedo',\n\t'Dunnagan',\n\t'Pevey',\n\t'Santino',\n\t'Waldren',\n\t'Leven',\n\t'Stinnette',\n\t'Eleazer',\n\t'Ragas',\n\t'Cockfield',\n\t'Lafontant',\n\t'Babinski',\n\t'Balash',\n\t'Hadler',\n\t'Kantz',\n\t'Latini',\n\t'Lavy',\n\t'Mally',\n\t'Maurin',\n\t'Mifsud',\n\t'Miguez',\n\t'Muma',\n\t'Needle',\n\t'Orrico',\n\t'Zalazar',\n\t'Chinen',\n\t'Coluccio',\n\t'Gibboney',\n\t'Knapke',\n\t'Moczygemba',\n\t'Leonguerrero',\n\t'Punzalan',\n\t'Lortz',\n\t'Rosel',\n\t'Mcclaran',\n\t'Weatherhead',\n\t'Mcgurn',\n\t'Sanville',\n\t'Goe',\n\t'Phang',\n\t'Briskey',\n\t'Bluitt',\n\t'Hapner',\n\t'Lamadrid',\n\t'Leuthold',\n\t'Litchford',\n\t'Scaduto',\n\t'Smoyer',\n\t'Stonehouse',\n\t'Streng',\n\t'Susman',\n\t'Swoyer',\n\t'Tempesta',\n\t'Tiedt',\n\t'Politi',\n\t'Ruotolo',\n\t'Schwendeman',\n\t'Siegenthaler',\n\t'Streff',\n\t'Strite',\n\t'Kroft',\n\t'Lewey',\n\t'Silbert',\n\t'Frie',\n\t'Bentson',\n\t'Coin',\n\t'Lupe',\n\t'Mousa',\n\t'Syler',\n\t'Fester',\n\t'Tenny',\n\t'Surgeon',\n\t'Blowe',\n\t'Metellus',\n\t'Borboa',\n\t'Danker',\n\t'Ferch',\n\t'Fritzsche',\n\t'Gudiel',\n\t'Kilmartin',\n\t'Nieland',\n\t'Soffer',\n\t'Yescas',\n\t'Chappelear',\n\t'Hincapie',\n\t'Landowski',\n\t'Barfoot',\n\t'Hesketh',\n\t'Mittelman',\n\t'Escorcia',\n\t'Meetze',\n\t'Coral',\n\t'Huddleson',\n\t'Hoo',\n\t'Googe',\n\t'Munir',\n\t'Reine',\n\t'Studstill',\n\t'Swims',\n\t'Ganaway',\n\t'Daise',\n\t'Blando',\n\t'Bream',\n\t'Cangemi',\n\t'Dicola',\n\t'Difalco',\n\t'Gleim',\n\t'Goerke',\n\t'Jauch',\n\t'Lashway',\n\t'Mckinlay',\n\t'Mura',\n\t'Polsky',\n\t'Roehrich',\n\t'Schwalbach',\n\t'Tegtmeier',\n\t'Theel',\n\t'Wuthrich',\n\t'Yabut',\n\t'Zara',\n\t'Ardizzone',\n\t'Blasius',\n\t'Deramo',\n\t'Heffern',\n\t'Rickels',\n\t'Wojtas',\n\t'Bue',\n\t'Garant',\n\t'Kitagawa',\n\t'Vorhees',\n\t'Randa',\n\t'Seider',\n\t'Bi',\n\t'Womac',\n\t'Santerre',\n\t'Mesmer',\n\t'Bailly',\n\t'Argue',\n\t'Spidell',\n\t'Manu',\n\t'General',\n\t'Exantus',\n\t'Neloms',\n\t'Piggee',\n\t'Agcaoili',\n\t'Ambrosini',\n\t'Balleza',\n\t'Bhavsar',\n\t'Brandstetter',\n\t'Cascone',\n\t'Deyton',\n\t'Fette',\n\t'Gershman',\n\t'Hanni',\n\t'Hitchner',\n\t'Manthe',\n\t'Marengo',\n\t'Ockerman',\n\t'Pergola',\n\t'Ratterree',\n\t'Shober',\n\t'Swezey',\n\t'Vadala',\n\t'Waszak',\n\t'Wishard',\n\t'Zhuang',\n\t'Bobst',\n\t'Filippini',\n\t'Giardino',\n\t'Johanning',\n\t'Kloepfer',\n\t'Dahan',\n\t'Rahmani',\n\t'Hett',\n\t'Sha',\n\t'Spaugh',\n\t'Darner',\n\t'Dagen',\n\t'Gaier',\n\t'Musco',\n\t'Holling',\n\t'Keahey',\n\t'Merricks',\n\t'Nur',\n\t'Andrick',\n\t'Demauro',\n\t'Haury',\n\t'Hsiung',\n\t'Kotarski',\n\t'Kriesel',\n\t'Leleux',\n\t'Nazar',\n\t'Oganesyan',\n\t'Polivka',\n\t'Sansoucie',\n\t'Serafino',\n\t'Stammer',\n\t'Tamm',\n\t'Wachowiak',\n\t'Zinda',\n\t'Goedde',\n\t'Pedregon',\n\t'Snader',\n\t'Witczak',\n\t'Kem',\n\t'Prabhu',\n\t'Purtle',\n\t'Nola',\n\t'Om',\n\t'Finster',\n\t'Bryans',\n\t'Mateus',\n\t'Bour',\n\t'Santy',\n\t'Mola',\n\t'Guile',\n\t'Denne',\n\t'Bol',\n\t'Mont',\n\t'Perro',\n\t'Haji',\n\t'Swinger',\n\t'Mitchelle',\n\t'Creary',\n\t'Leeks',\n\t'Barsotti',\n\t'Bolender',\n\t'Dohner',\n\t'Federman',\n\t'Lancour',\n\t'Lueken',\n\t'Pettinger',\n\t'Rathmann',\n\t'Schiess',\n\t'Schulenberg',\n\t'Troyan',\n\t'Dafoe',\n\t'Delahunt',\n\t'Domagala',\n\t'Ganske',\n\t'Grasmick',\n\t'Guinther',\n\t'Hlavac',\n\t'Klumb',\n\t'Susko',\n\t'Vanhandel',\n\t'Burget',\n\t'Thaker',\n\t'Winker',\n\t'Castellucci',\n\t'Guerette',\n\t'Garde',\n\t'Busher',\n\t'Usery',\n\t'Braker',\n\t'Blan',\n\t'Goar',\n\t'Loiseau',\n\t'Anderberg',\n\t'Bamber',\n\t'Biagini',\n\t'Dack',\n\t'Groeneveld',\n\t'Habig',\n\t'Howk',\n\t'Kutsch',\n\t'Mcgloin',\n\t'Nevares',\n\t'Piedrahita',\n\t'Puffenbarger',\n\t'Racer',\n\t'Stanaland',\n\t'Turck',\n\t'Vanvleck',\n\t'Velardi',\n\t'Verhoeven',\n\t'Wernick',\n\t'Wherley',\n\t'Zamzow',\n\t'Binegar',\n\t'Kaluza',\n\t'Kudrna',\n\t'Marbach',\n\t'Schwichtenberg',\n\t'Chay',\n\t'Lanthier',\n\t'Balling',\n\t'Parcher',\n\t'Venner',\n\t'Nolette',\n\t'Quant',\n\t'Grierson',\n\t'Quest',\n\t'Level',\n\t'Birkner',\n\t'Evancho',\n\t'Grinde',\n\t'Horiuchi',\n\t'Hoselton',\n\t'Kuk',\n\t'Maiello',\n\t'Matuska',\n\t'Melito',\n\t'Northey',\n\t'Pallante',\n\t'Porzio',\n\t'Rad',\n\t'Rizzolo',\n\t'Thull',\n\t'Urenda',\n\t'Dalfonso',\n\t'Harbold',\n\t'Kemerer',\n\t'Knapton',\n\t'Meeder',\n\t'Ruckle',\n\t'Segui',\n\t'Behne',\n\t'Bamburg',\n\t'Galen',\n\t'Hallen',\n\t'Herandez',\n\t'Chittick',\n\t'Deshon',\n\t'Verrier',\n\t'Sorel',\n\t'Neylon',\n\t'Thatch',\n\t'Bayly',\n\t'Beever',\n\t'Galka',\n\t'Gruhn',\n\t'Gsell',\n\t'Happe',\n\t'Hovan',\n\t'Marter',\n\t'Matarese',\n\t'Mellema',\n\t'Ollila',\n\t'Schempp',\n\t'Serda',\n\t'Skenandore',\n\t'Stemper',\n\t'Toupin',\n\t'Vandeven',\n\t'Yauger',\n\t'Koenigs',\n\t'Mullendore',\n\t'Ouellet',\n\t'Sullenberger',\n\t'Julson',\n\t'Pelot',\n\t'Clamp',\n\t'Berte',\n\t'Beese',\n\t'Matkin',\n\t'Erie',\n\t'Rosenburg',\n\t'Reap',\n\t'Stelle',\n\t'Rayon',\n\t'Hoit',\n\t'Hollyfield',\n\t'Kindall',\n\t'Agent',\n\t'Glascoe',\n\t'Holts',\n\t'Wynder',\n\t'Balderston',\n\t'Bernardy',\n\t'Blehm',\n\t'Casebeer',\n\t'Emler',\n\t'Farrugia',\n\t'Guzzardo',\n\t'Johnsrud',\n\t'Maffeo',\n\t'Mccartan',\n\t'Redburn',\n\t'Reesman',\n\t'Savas',\n\t'Shamoon',\n\t'Shown',\n\t'Spinale',\n\t'Tabaka',\n\t'Wedell',\n\t'Armato',\n\t'Bassford',\n\t'Bungard',\n\t'Faerber',\n\t'Freet',\n\t'Oesterle',\n\t'Vandeberg',\n\t'Bacha',\n\t'Stemm',\n\t'Edgett',\n\t'Karrick',\n\t'Girten',\n\t'Orgill',\n\t'Meridith',\n\t'Cullom',\n\t'Hennington',\n\t'Minns',\n\t'Appleberry',\n\t'Abare',\n\t'Annen',\n\t'Beierle',\n\t'Berish',\n\t'Cracchiolo',\n\t'Dilullo',\n\t'Kehm',\n\t'Kuhne',\n\t'Modglin',\n\t'Norland',\n\t'Petruzzelli',\n\t'Schabel',\n\t'Stauffacher',\n\t'Villena',\n\t'Wageman',\n\t'Willden',\n\t'Faiella',\n\t'Mangiaracina',\n\t'Petralia',\n\t'Witwer',\n\t'Tropp',\n\t'Bores',\n\t'Burkel',\n\t'Stanifer',\n\t'Teele',\n\t'Cornick',\n\t'Credit',\n\t'Dorvil',\n\t'Bonillas',\n\t'Callinan',\n\t'Colleran',\n\t'Finer',\n\t'Krach',\n\t'Lubas',\n\t'Lutman',\n\t'Marien',\n\t'Mccort',\n\t'Merica',\n\t'Mies',\n\t'Nicotra',\n\t'Novosad',\n\t'Priem',\n\t'Ramakrishnan',\n\t'Zolman',\n\t'Deitsch',\n\t'Georgi',\n\t'Haberstroh',\n\t'Kofoed',\n\t'Kreischer',\n\t'Nazareno',\n\t'Norkus',\n\t'Steimle',\n\t'Fellin',\n\t'Ghanem',\n\t'Kosch',\n\t'Pages',\n\t'Balthazor',\n\t'Corte',\n\t'Hoh',\n\t'Shrewsberry',\n\t'Beharry',\n\t'Waight',\n\t'Leconte',\n\t'Clowney',\n\t'Tesfaye',\n\t'Andis',\n\t'Brosch',\n\t'Bruckman',\n\t'Carducci',\n\t'Erbes',\n\t'Ferreiro',\n\t'Gatten',\n\t'Heggen',\n\t'Kackley',\n\t'Klamm',\n\t'Korff',\n\t'Lehane',\n\t'Mech',\n\t'Montanari',\n\t'Pousson',\n\t'Soderholm',\n\t'Strey',\n\t'Upp',\n\t'Wahlen',\n\t'Cedrone',\n\t'Steuber',\n\t'Vonfeldt',\n\t'Deridder',\n\t'Shams',\n\t'Barnas',\n\t'Bake',\n\t'Brownrigg',\n\t'Donohoo',\n\t'Mccorry',\n\t'Spruce',\n\t'Masden',\n\t'Porchia',\n\t'Fofana',\n\t'Bless',\n\t'Caler',\n\t'Calva',\n\t'Carnero',\n\t'Chakraborty',\n\t'Clenney',\n\t'Dockendorf',\n\t'Dziak',\n\t'Errickson',\n\t'Ewoldt',\n\t'Klippel',\n\t'Krass',\n\t'Luebbe',\n\t'Parlett',\n\t'Paternostro',\n\t'Peterka',\n\t'Petitti',\n\t'Puthoff',\n\t'Wessman',\n\t'Brossman',\n\t'Glotfelty',\n\t'Grabau',\n\t'Kortz',\n\t'Sienko',\n\t'Yonan',\n\t'Fakhoury',\n\t'Bunney',\n\t'Sillas',\n\t'Guerry',\n\t'Sedwick',\n\t'Okey',\n\t'Virgo',\n\t'Babers',\n\t'Casali',\n\t'Chiquito',\n\t'Correnti',\n\t'Doverspike',\n\t'Fryberger',\n\t'Golas',\n\t'Golob',\n\t'Hufstetler',\n\t'Inoa',\n\t'Lasser',\n\t'Nesheim',\n\t'Peveto',\n\t'Reckner',\n\t'Rydzewski',\n\t'Shartzer',\n\t'Smouse',\n\t'Tipple',\n\t'Wantland',\n\t'Wolfert',\n\t'Yordy',\n\t'Zuleta',\n\t'Heimerl',\n\t'Mccarren',\n\t'Cabeza',\n\t'Neice',\n\t'Kassem',\n\t'Hodgen',\n\t'Charrier',\n\t'Duggar',\n\t'Blacksmith',\n\t'Cush',\n\t'Trunnell',\n\t'Laventure',\n\t'Salahuddin',\n\t'Batalla',\n\t'Brahmbhatt',\n\t'Breslow',\n\t'Cua',\n\t'Deatley',\n\t'Digrazia',\n\t'Divirgilio',\n\t'Falin',\n\t'Freiberger',\n\t'Gladish',\n\t'Holyoak',\n\t'Lazos',\n\t'Loader',\n\t'Mcclafferty',\n\t'Meloni',\n\t'Muhr',\n\t'Salzwedel',\n\t'Schaab',\n\t'Shehadeh',\n\t'Suresh',\n\t'Verdusco',\n\t'Younglove',\n\t'Damman',\n\t'Fulco',\n\t'Neikirk',\n\t'Laver',\n\t'Biro',\n\t'Shill',\n\t'Labarr',\n\t'Kari',\n\t'Mcclory',\n\t'Torelli',\n\t'Knock',\n\t'Dormer',\n\t'Papin',\n\t'Stoneham',\n\t'Weathington',\n\t'Albus',\n\t'Andel',\n\t'Banville',\n\t'Cassens',\n\t'Chalifoux',\n\t'Dellaquila',\n\t'Depauw',\n\t'Deschene',\n\t'Genung',\n\t'Greider',\n\t'Luhman',\n\t'Mastropietro',\n\t'Mignogna',\n\t'Pisarski',\n\t'Terrien',\n\t'Thomure',\n\t'Tornabene',\n\t'Beheler',\n\t'Chimento',\n\t'Engelbert',\n\t'Gambone',\n\t'Goettl',\n\t'Jasperson',\n\t'Kovalenko',\n\t'Infinger',\n\t'Timbs',\n\t'Dasgupta',\n\t'Purdon',\n\t'Velie',\n\t'Eland',\n\t'Ankrum',\n\t'Narain',\n\t'Mcfarling',\n\t'Creagh',\n\t'Bunyan',\n\t'Rattigan',\n\t'Reddix',\n\t'Aumann',\n\t'Beilfuss',\n\t'Bogosian',\n\t'Bramel',\n\t'Burlingham',\n\t'Cruzan',\n\t'Demel',\n\t'Dorff',\n\t'Figley',\n\t'Friesz',\n\t'Huffstutler',\n\t'Mcdaris',\n\t'Meinecke',\n\t'Moench',\n\t'Newville',\n\t'Normile',\n\t'Pfund',\n\t'Pilar',\n\t'Seckman',\n\t'Szoke',\n\t'Zyla',\n\t'Freilich',\n\t'Hammerle',\n\t'Kopel',\n\t'Liskey',\n\t'Mesina',\n\t'Schlicher',\n\t'Dalen',\n\t'Bettin',\n\t'Malanga',\n\t'Dern',\n\t'Tuckey',\n\t'Warder',\n\t'Harren',\n\t'Siner',\n\t'Mahdi',\n\t'Ahmann',\n\t'Allor',\n\t'Claywell',\n\t'Corkill',\n\t'Follansbee',\n\t'Iseman',\n\t'Lawter',\n\t'Myslinski',\n\t'Sauser',\n\t'Tornatore',\n\t'Bhasin',\n\t'Governale',\n\t'Karstens',\n\t'Klocek',\n\t'Stempien',\n\t'Petrino',\n\t'Kohlmeier',\n\t'Igou',\n\t'Sari',\n\t'Mareno',\n\t'Bouche',\n\t'Romas',\n\t'Urey',\n\t'Sprott',\n\t'Ponzo',\n\t'Nevills',\n\t'Affolter',\n\t'Alleva',\n\t'Allgaier',\n\t'Azbell',\n\t'Branagan',\n\t'Fiebig',\n\t'Geremia',\n\t'Grabert',\n\t'Grahl',\n\t'Gruwell',\n\t'Koebel',\n\t'Krauter',\n\t'Kuhnert',\n\t'Kuperman',\n\t'Laverdiere',\n\t'Leuck',\n\t'Masella',\n\t'Mierzejewski',\n\t'Platek',\n\t'Samaan',\n\t'Selsor',\n\t'Vickroy',\n\t'Whitenack',\n\t'Zanella',\n\t'Cavagnaro',\n\t'Galioto',\n\t'Schoeneman',\n\t'Zanotti',\n\t'Bort',\n\t'Alpaugh',\n\t'Culverhouse',\n\t'Perona',\n\t'Wheelwright',\n\t'Amber',\n\t'Bradner',\n\t'Sedberry',\n\t'Goethe',\n\t'Swygert',\n\t'Nisbett',\n\t'Harts',\n\t'Pendelton',\n\t'Keita',\n\t'Addair',\n\t'Anania',\n\t'Armagost',\n\t'Brumett',\n\t'Butala',\n\t'Celmer',\n\t'Forquer',\n\t'Hagadorn',\n\t'Jalomo',\n\t'Koranda',\n\t'Lemmond',\n\t'Liske',\n\t'Mcglamery',\n\t'Ramiro',\n\t'Tickner',\n\t'Toso',\n\t'Tosti',\n\t'Beerbower',\n\t'Bichler',\n\t'Buege',\n\t'Cadotte',\n\t'Chiong',\n\t'Romberger',\n\t'Mandarino',\n\t'Deter',\n\t'Wallack',\n\t'Bligh',\n\t'Harer',\n\t'Terral',\n\t'Hobert',\n\t'Doren',\n\t'Affleck',\n\t'Marquess',\n\t'Lewton',\n\t'Covel',\n\t'Reff',\n\t'Gowins',\n\t'Claybrooks',\n\t'Artiles',\n\t'Brunelli',\n\t'Campusano',\n\t'Deshaies',\n\t'Elpers',\n\t'Fait',\n\t'Heathcote',\n\t'Katayama',\n\t'Landreneau',\n\t'Nardelli',\n\t'Padovano',\n\t'Pendry',\n\t'Santillano',\n\t'Ubaldo',\n\t'Wurz',\n\t'Bathke',\n\t'Fillers',\n\t'Reitano',\n\t'Patrone',\n\t'Mountford',\n\t'Farran',\n\t'Burdo',\n\t'Danish',\n\t'Windell',\n\t'Amrine',\n\t'Pilgreen',\n\t'Pross',\n\t'Bowery',\n\t'Girdner',\n\t'Stockley',\n\t'Chisom',\n\t'Bigos',\n\t'Cavallero',\n\t'Choma',\n\t'Chorba',\n\t'Doubek',\n\t'Eynon',\n\t'Fitzmorris',\n\t'Gergely',\n\t'Hilsabeck',\n\t'Hime',\n\t'Kafer',\n\t'Kilday',\n\t'Lairson',\n\t'Mccanless',\n\t'Meenan',\n\t'Mossburg',\n\t'Muscato',\n\t'Raap',\n\t'Ramp',\n\t'Reali',\n\t'Reinard',\n\t'Rivadeneira',\n\t'Schwenn',\n\t'Serbin',\n\t'Soeder',\n\t'Wagle',\n\t'Jablonowski',\n\t'Vanni',\n\t'Grapes',\n\t'Hilleary',\n\t'Mondor',\n\t'Natalie',\n\t'Seat',\n\t'Heming',\n\t'Waide',\n\t'Haverly',\n\t'Eva',\n\t'Marshman',\n\t'Mais',\n\t'Portlock',\n\t'Scoby',\n\t'Sharps',\n\t'Buday',\n\t'Bumbalough',\n\t'Burback',\n\t'Carano',\n\t'Eustis',\n\t'Flaim',\n\t'Fraticelli',\n\t'Grimme',\n\t'Heape',\n\t'Hoaglin',\n\t'Kreuser',\n\t'Odgers',\n\t'Pastorius',\n\t'Pavek',\n\t'Rogoff',\n\t'Skorupski',\n\t'Stene',\n\t'Tomasino',\n\t'Varble',\n\t'Vasek',\n\t'Woolums',\n\t'Arcaro',\n\t'Graley',\n\t'Larkey',\n\t'Ortlieb',\n\t'Piccone',\n\t'Verhey',\n\t'Inch',\n\t'Laroe',\n\t'Brockmeier',\n\t'Familia',\n\t'Soll',\n\t'Duplechin',\n\t'Blevens',\n\t'Gell',\n\t'Hipkins',\n\t'Kleinpeter',\n\t'Swindall',\n\t'Sabir',\n\t'Kinloch',\n\t'Muldrew',\n\t'Clausell',\n\t'Bouch',\n\t'Casciano',\n\t'Dewhirst',\n\t'Draney',\n\t'Fourman',\n\t'Fuente',\n\t'Ganci',\n\t'Gentzler',\n\t'Gerhold',\n\t'Ingoglia',\n\t'Jerabek',\n\t'Keisling',\n\t'Larivee',\n\t'Negro',\n\t'Pelchat',\n\t'Quilty',\n\t'Reinig',\n\t'Rubeck',\n\t'Rudick',\n\t'Rulli',\n\t'Spagnoli',\n\t'Wiltsie',\n\t'Vitolo',\n\t'Neuhauser',\n\t'Khurana',\n\t'Vint',\n\t'Kant',\n\t'Nead',\n\t'Deroy',\n\t'Ransford',\n\t'Stromer',\n\t'Buley',\n\t'Bloxom',\n\t'Rieves',\n\t'Bastos',\n\t'Deckman',\n\t'Duenes',\n\t'Hessling',\n\t'Kresse',\n\t'Langdale',\n\t'Penberthy',\n\t'Polyak',\n\t'Sagun',\n\t'Salehi',\n\t'Sas',\n\t'Soja',\n\t'Spieth',\n\t'Verhulst',\n\t'Walen',\n\t'Woodling',\n\t'Acierno',\n\t'Bergsma',\n\t'Biskup',\n\t'Buonomo',\n\t'Gores',\n\t'Koffman',\n\t'Redder',\n\t'Ishak',\n\t'Billow',\n\t'Ratledge',\n\t'Widder',\n\t'Margerum',\n\t'Bussing',\n\t'Caccamo',\n\t'Carozza',\n\t'Cwik',\n\t'Forner',\n\t'Goeden',\n\t'Greninger',\n\t'Hartenstein',\n\t'Hermida',\n\t'Krutz',\n\t'Kubes',\n\t'Kulow',\n\t'Lynott',\n\t'Mank',\n\t'Meinders',\n\t'Mikrut',\n\t'Moots',\n\t'Patek',\n\t'Pogorzelski',\n\t'Reinstein',\n\t'Ruiter',\n\t'Rupard',\n\t'Salvia',\n\t'Sissom',\n\t'Sligar',\n\t'Spendlove',\n\t'Vian',\n\t'Wissing',\n\t'Witucki',\n\t'Brossart',\n\t'Warhurst',\n\t'Staron',\n\t'Gilly',\n\t'Borck',\n\t'Mccarn',\n\t'Stanbery',\n\t'Aydelotte',\n\t'Etters',\n\t'Rho',\n\t'Menzer',\n\t'Knoble',\n\t'Luallen',\n\t'Meda',\n\t'Myre',\n\t'Nevils',\n\t'Seide',\n\t'Rouser',\n\t'Bernas',\n\t'Bressette',\n\t'Dohn',\n\t'Domina',\n\t'Filion',\n\t'Fossen',\n\t'Grunder',\n\t'Hofland',\n\t'Larranaga',\n\t'Launius',\n\t'Lento',\n\t'Mohrmann',\n\t'Papenfuss',\n\t'Polcyn',\n\t'Pollina',\n\t'Reinheimer',\n\t'Rueb',\n\t'Sacher',\n\t'Sauseda',\n\t'Whitwell',\n\t'Caspers',\n\t'Dejager',\n\t'Kastelic',\n\t'Kildow',\n\t'Sappenfield',\n\t'Schultes',\n\t'Tucciarone',\n\t'Gogan',\n\t'Sarti',\n\t'Percle',\n\t'Cagney',\n\t'Wasley',\n\t'Getts',\n\t'Sahm',\n\t'Brandle',\n\t'Osbon',\n\t'Febres',\n\t'Billett',\n\t'Pall',\n\t'Spearing',\n\t'Thursby',\n\t'Junious',\n\t'Allenbaugh',\n\t'Calamia',\n\t'Cregan',\n\t'Hostettler',\n\t'Leete',\n\t'Pirrone',\n\t'Ploeger',\n\t'Revak',\n\t'Sarlo',\n\t'Sayavong',\n\t'Schlichter',\n\t'Shonkwiler',\n\t'Soots',\n\t'Spak',\n\t'Thien',\n\t'Torgeson',\n\t'Urbanczyk',\n\t'Vredenburg',\n\t'Wormuth',\n\t'Yankovich',\n\t'Badertscher',\n\t'Holewinski',\n\t'Kalinoski',\n\t'Kwasny',\n\t'Neidert',\n\t'Remmel',\n\t'Uram',\n\t'Zettlemoyer',\n\t'Sanna',\n\t'Walthers',\n\t'Kinkaid',\n\t'Rummage',\n\t'Vane',\n\t'Morgen',\n\t'Stum',\n\t'Ainsley',\n\t'Mckelvie',\n\t'Barbin',\n\t'Shariff',\n\t'Blanchett',\n\t'Mayon',\n\t'Broadie',\n\t'Millien',\n\t'Azzarello',\n\t'Bocock',\n\t'Bohlander',\n\t'Brennecke',\n\t'Daman',\n\t'Dixit',\n\t'Goth',\n\t'Kocur',\n\t'Koslow',\n\t'Loncar',\n\t'Narez',\n\t'Oleksy',\n\t'Ouderkirk',\n\t'Rathe',\n\t'Sandmann',\n\t'Scarpino',\n\t'Siegman',\n\t'Soloway',\n\t'Tomeo',\n\t'Vantuyl',\n\t'Benesch',\n\t'Doornbos',\n\t'Gisler',\n\t'Nistler',\n\t'Pelzel',\n\t'Piecuch',\n\t'Schweiss',\n\t'Zieba',\n\t'Domangue',\n\t'Curti',\n\t'Iams',\n\t'Viger',\n\t'Sandefer',\n\t'Maybury',\n\t'Haneline',\n\t'Shappell',\n\t'Charlier',\n\t'Belardo',\n\t'Lynk',\n\t'Ocain',\n\t'Ismael',\n\t'Blacksher',\n\t'Lesesne',\n\t'Blash',\n\t'Fantroy',\n\t'Bucciarelli',\n\t'Deruiter',\n\t'Fetner',\n\t'Filla',\n\t'Frontera',\n\t'Furlan',\n\t'Goepfert',\n\t'Gorsline',\n\t'Gugino',\n\t'Kleis',\n\t'Kriger',\n\t'Lebarron',\n\t'Lesnick',\n\t'Losano',\n\t'Macquarrie',\n\t'Marczak',\n\t'Mazariego',\n\t'Moraes',\n\t'Murano',\n\t'Myint',\n\t'Philley',\n\t'Ruffalo',\n\t'Salyards',\n\t'Swab',\n\t'Trester',\n\t'Vlcek',\n\t'Abramo',\n\t'Kaczmarski',\n\t'Mastronardi',\n\t'Lafont',\n\t'Tomerlin',\n\t'Mchan',\n\t'Blanda',\n\t'Deandrade',\n\t'Klien',\n\t'Meno',\n\t'Maia',\n\t'Durall',\n\t'Lansdowne',\n\t'Cones',\n\t'Adley',\n\t'Taffe',\n\t'Ikard',\n\t'Sylve',\n\t'Bartok',\n\t'Farler',\n\t'Farnworth',\n\t'Gookin',\n\t'Guijarro',\n\t'Hazan',\n\t'Hosterman',\n\t'Klees',\n\t'Knust',\n\t'Leadingham',\n\t'Lefeber',\n\t'Maisch',\n\t'Muchmore',\n\t'Pini',\n\t'Polinsky',\n\t'Quakenbush',\n\t'Rought',\n\t'Ruta',\n\t'Tingen',\n\t'Urness',\n\t'Valade',\n\t'Wadle',\n\t'Hietala',\n\t'Hockenbury',\n\t'Ivanoff',\n\t'Mcevers',\n\t'Miyazaki',\n\t'Druckenmiller',\n\t'Neisler',\n\t'Vroom',\n\t'Berland',\n\t'Rizor',\n\t'Caris',\n\t'Jenison',\n\t'Folmer',\n\t'Si',\n\t'Pulling',\n\t'Houge',\n\t'Snuggs',\n\t'Enis',\n\t'Peeks',\n\t'Stacker',\n\t'Destin',\n\t'Ojo',\n\t'Barraco',\n\t'Childree',\n\t'Ciszewski',\n\t'Dicenzo',\n\t'Gowing',\n\t'Granquist',\n\t'Kapinos',\n\t'Khalili',\n\t'Kienitz',\n\t'Konrath',\n\t'Kosa',\n\t'Schilz',\n\t'Sealock',\n\t'Soucek',\n\t'Stefanko',\n\t'Trow',\n\t'Udy',\n\t'Fricano',\n\t'Hunnewell',\n\t'Sieler',\n\t'Stranahan',\n\t'Thammavongsa',\n\t'Zettel',\n\t'Cutrell',\n\t'Balter',\n\t'Clavel',\n\t'Thibert',\n\t'Ondo',\n\t'Senna',\n\t'Kun',\n\t'Maximo',\n\t'Wares',\n\t'Caldeira',\n\t'Furgerson',\n\t'Franklyn',\n\t'Christophe',\n\t'Bady',\n\t'Blanken',\n\t'Boike',\n\t'Cuen',\n\t'Davidian',\n\t'Glauser',\n\t'Gleave',\n\t'Guzy',\n\t'Halleck',\n\t'Kempfer',\n\t'Kenkel',\n\t'Kloth',\n\t'Knable',\n\t'Mcenery',\n\t'Pizzolato',\n\t'Schryver',\n\t'Seminara',\n\t'Shenoy',\n\t'Somera',\n\t'Stroop',\n\t'Weirick',\n\t'Yatsko',\n\t'Evanko',\n\t'Koegel',\n\t'Lastinger',\n\t'Schrenk',\n\t'Vitullo',\n\t'Holste',\n\t'Susa',\n\t'Pedley',\n\t'Cove',\n\t'Levett',\n\t'Gillyard',\n\t'Boeding',\n\t'Delpozo',\n\t'Denoyer',\n\t'Farese',\n\t'Floro',\n\t'Gavina',\n\t'Hargus',\n\t'Kisiel',\n\t'Konig',\n\t'Krotz',\n\t'Lundblad',\n\t'Masoner',\n\t'Mumper',\n\t'Nolf',\n\t'Sandgren',\n\t'Schussler',\n\t'Shallcross',\n\t'Singhal',\n\t'Standen',\n\t'Teta',\n\t'Vacanti',\n\t'Yokota',\n\t'Borski',\n\t'Filice',\n\t'Frankum',\n\t'Kleinsmith',\n\t'Plauche',\n\t'Spohr',\n\t'Goya',\n\t'Rosensteel',\n\t'Srey',\n\t'Touhey',\n\t'Launer',\n\t'Dome',\n\t'Mossey',\n\t'Mclay',\n\t'Sturgess',\n\t'Demond',\n\t'Buren',\n\t'Millin',\n\t'Riddles',\n\t'Arps',\n\t'Dugar',\n\t'Carradine',\n\t'Brasseur',\n\t'Burchill',\n\t'Champoux',\n\t'Chojnowski',\n\t'Cyphert',\n\t'Devincentis',\n\t'Donze',\n\t'Gaspari',\n\t'Harshberger',\n\t'Merchan',\n\t'Mulgrew',\n\t'Parma',\n\t'Pasqua',\n\t'Pierpoint',\n\t'Rozeboom',\n\t'Rumery',\n\t'Stahle',\n\t'Stierwalt',\n\t'Swander',\n\t'Tiegs',\n\t'Trabucco',\n\t'Withington',\n\t'Frericks',\n\t'Kilman',\n\t'Locastro',\n\t'Samonte',\n\t'Sanko',\n\t'Wisman',\n\t'Flecha',\n\t'Coplan',\n\t'Zafra',\n\t'Art',\n\t'Maxam',\n\t'Cavaness',\n\t'Willi',\n\t'Vanliew',\n\t'Fresh',\n\t'Bauserman',\n\t'Bergemann',\n\t'Buchler',\n\t'Curbow',\n\t'Dimascio',\n\t'Einstein',\n\t'Favila',\n\t'Galeno',\n\t'Granat',\n\t'Halteman',\n\t'Janczak',\n\t'Janicek',\n\t'Jundt',\n\t'Karren',\n\t'Modesitt',\n\t'Provance',\n\t'Reasons',\n\t'Riveron',\n\t'Salts',\n\t'Salvino',\n\t'Sawhney',\n\t'Shallenberger',\n\t'Sirk',\n\t'Tylka',\n\t'Baumler',\n\t'Mcmenamy',\n\t'Territo',\n\t'Thackeray',\n\t'Much',\n\t'Papageorge',\n\t'Rynders',\n\t'Bacigalupo',\n\t'Fulwider',\n\t'Hendricksen',\n\t'Lepre',\n\t'Mangel',\n\t'Dering',\n\t'Soda',\n\t'Bazar',\n\t'Dinning',\n\t'Portera',\n\t'Schatzman',\n\t'Kernodle',\n\t'Bashford',\n\t'Ferrebee',\n\t'Cortner',\n\t'Sanker',\n\t'Livings',\n\t'Jemmott',\n\t'Arzaga',\n\t'Cihak',\n\t'Cobarrubias',\n\t'Coey',\n\t'Coutinho',\n\t'Deneau',\n\t'Droll',\n\t'Hickel',\n\t'Hillmann',\n\t'Kitto',\n\t'Lefebre',\n\t'Lev',\n\t'Mato',\n\t'Mcomber',\n\t'Norlin',\n\t'Renstrom',\n\t'Rhyner',\n\t'Sacca',\n\t'Sangha',\n\t'Sutor',\n\t'Dwire',\n\t'Huyser',\n\t'Kressin',\n\t'Moilanen',\n\t'Picado',\n\t'Schmidlin',\n\t'Albor',\n\t'Zaldana',\n\t'Failor',\n\t'Dubberly',\n\t'Youse',\n\t'Mohiuddin',\n\t'Shiel',\n\t'Loran',\n\t'Hamme',\n\t'Castine',\n\t'Lanum',\n\t'Mcelderry',\n\t'Riggsbee',\n\t'Madkins',\n\t'Abts',\n\t'Bekker',\n\t'Boccio',\n\t'Florin',\n\t'Lienemann',\n\t'Madara',\n\t'Manganello',\n\t'Mcfetridge',\n\t'Medsker',\n\t'Minish',\n\t'Roberg',\n\t'Sajdak',\n\t'Schwall',\n\t'Sedivy',\n\t'Suto',\n\t'Wieberg',\n\t'Catherman',\n\t'Ficker',\n\t'Leckrone',\n\t'Lieder',\n\t'Rodak',\n\t'Tomek',\n\t'Everard',\n\t'Spong',\n\t'Glacken',\n\t'Polka',\n\t'Aley',\n\t'Farro',\n\t'Stanwood',\n\t'Petter',\n\t'Desrosier',\n\t'Kerl',\n\t'Goslee',\n\t'Burston',\n\t'Pennywell',\n\t'Birchard',\n\t'Federer',\n\t'Flicker',\n\t'Frangos',\n\t'Korhonen',\n\t'Kozikowski',\n\t'Kyger',\n\t'Mccoskey',\n\t'Standing',\n\t'Terada',\n\t'Trierweiler',\n\t'Trupiano',\n\t'Urbanowicz',\n\t'Viegas',\n\t'Ybarbo',\n\t'Brinlee',\n\t'Daddona',\n\t'Deisher',\n\t'Schwieger',\n\t'Farless',\n\t'Slaght',\n\t'Jarvie',\n\t'Hunkins',\n\t'Barrack',\n\t'Bisset',\n\t'Bruley',\n\t'Molen',\n\t'Milas',\n\t'Matts',\n\t'Wickware',\n\t'Timbers',\n\t'Minus',\n\t'Kennebrew',\n\t'Boorman',\n\t'Faughn',\n\t'Feight',\n\t'Githens',\n\t'Hazelrigg',\n\t'Hutzell',\n\t'Klang',\n\t'Kogler',\n\t'Lechtenberg',\n\t'Malachowski',\n\t'Orsburn',\n\t'Retz',\n\t'Saban',\n\t'Tak',\n\t'Underdahl',\n\t'Veldman',\n\t'Virnig',\n\t'Wanat',\n\t'Achord',\n\t'Drenth',\n\t'Heibel',\n\t'Hendee',\n\t'Raiche',\n\t'Saunier',\n\t'Wertheim',\n\t'Forand',\n\t'Stathis',\n\t'Raider',\n\t'Cassaro',\n\t'Cly',\n\t'Hagey',\n\t'Moad',\n\t'Rhody',\n\t'Fogler',\n\t'Hellen',\n\t'Sweezy',\n\t'Farid',\n\t'Suddreth',\n\t'Kenneth',\n\t'Pindell',\n\t'Corney',\n\t'Monsanto',\n\t'Laye',\n\t'Lingard',\n\t'Armwood',\n\t'Asif',\n\t'Axley',\n\t'Barkan',\n\t'Bittel',\n\t'Boesen',\n\t'Camilli',\n\t'Champa',\n\t'Dauenhauer',\n\t'Ehrmann',\n\t'Gangl',\n\t'Gatrell',\n\t'Gehret',\n\t'Hankel',\n\t'Kalbach',\n\t'Kessell',\n\t'Khatoon',\n\t'Lanese',\n\t'Manco',\n\t'Masteller',\n\t'Pruner',\n\t'Remmert',\n\t'Valasek',\n\t'Vater',\n\t'Yurick',\n\t'Zavalza',\n\t'Biesecker',\n\t'Frankenberg',\n\t'Hovorka',\n\t'Poissant',\n\t'Neises',\n\t'Moog',\n\t'Hadad',\n\t'Wittenburg',\n\t'Devere',\n\t'Hynds',\n\t'Sparkes',\n\t'Brailey',\n\t'Addo',\n\t'Accetta',\n\t'Altschuler',\n\t'Amescua',\n\t'Corredor',\n\t'Didonna',\n\t'Jencks',\n\t'Keady',\n\t'Keidel',\n\t'Mancebo',\n\t'Matusiak',\n\t'Rakoczy',\n\t'Reamy',\n\t'Sardella',\n\t'Slotnick',\n\t'Fotheringham',\n\t'Gettman',\n\t'Kunzler',\n\t'Manganaro',\n\t'Manygoats',\n\t'Huelskamp',\n\t'Newsham',\n\t'Kohen',\n\t'Cong',\n\t'Goulden',\n\t'Timmers',\n\t'Aderhold',\n\t'Shinall',\n\t'Cowser',\n\t'Uzzle',\n\t'Harps',\n\t'Balster',\n\t'Baringer',\n\t'Bechler',\n\t'Billick',\n\t'Chenard',\n\t'Ditta',\n\t'Fiallos',\n\t'Kampe',\n\t'Kretzschmar',\n\t'Manukyan',\n\t'Mcbreen',\n\t'Mcmanigal',\n\t'Miko',\n\t'Mol',\n\t'Orrego',\n\t'Penalosa',\n\t'Ronco',\n\t'Thum',\n\t'Tupa',\n\t'Vittitow',\n\t'Wierzba',\n\t'Gavitt',\n\t'Hampe',\n\t'Kowalkowski',\n\t'Neuroth',\n\t'Sterkel',\n\t'Herling',\n\t'Boldman',\n\t'Camus',\n\t'Drier',\n\t'Arcia',\n\t'Feagans',\n\t'Thompsen',\n\t'Maka',\n\t'Villalona',\n\t'Bonito',\n\t'Buist',\n\t'Dato',\n\t'Yankey',\n\t'Daluz',\n\t'Hollands',\n\t'Durio',\n\t'Bradly',\n\t'Daffin',\n\t'Chhabra',\n\t'Dettling',\n\t'Dolinger',\n\t'Flenniken',\n\t'Henrichsen',\n\t'Laduca',\n\t'Lashomb',\n\t'Leick',\n\t'Luchini',\n\t'Mcmanaman',\n\t'Minkoff',\n\t'Nobbe',\n\t'Oyster',\n\t'Quintela',\n\t'Robar',\n\t'Sakurai',\n\t'Solak',\n\t'Stolt',\n\t'Taddei',\n\t'Puopolo',\n\t'Schwarzkopf',\n\t'Stango',\n\t'Mcparland',\n\t'Schembri',\n\t'Standefer',\n\t'Dayan',\n\t'Sculley',\n\t'Bhuiyan',\n\t'Delauder',\n\t'Harrity',\n\t'Bree',\n\t'Haste',\n\t'Mcbay',\n\t'Garmany',\n\t'Maison',\n\t'Common',\n\t'Hanton',\n\t'Aigner',\n\t'Aliaga',\n\t'Boeve',\n\t'Cromie',\n\t'Demick',\n\t'Filipowicz',\n\t'Frickey',\n\t'Garrigus',\n\t'Heindl',\n\t'Hilmer',\n\t'Homeyer',\n\t'Lanterman',\n\t'Larch',\n\t'Masci',\n\t'Minami',\n\t'Palmiter',\n\t'Rufener',\n\t'Saal',\n\t'Sarmento',\n\t'Seewald',\n\t'Sestito',\n\t'Somarriba',\n\t'Sparano',\n\t'Vorce',\n\t'Wombles',\n\t'Zarr',\n\t'Antonson',\n\t'Bruzzese',\n\t'Chillemi',\n\t'Dannunzio',\n\t'Hogrefe',\n\t'Mastandrea',\n\t'Moynahan',\n\t'Wangerin',\n\t'Wedeking',\n\t'Ziobro',\n\t'Flegel',\n\t'Axsom',\n\t'Buzby',\n\t'Slowey',\n\t'Cuebas',\n\t'App',\n\t'Dar',\n\t'Robers',\n\t'Elting',\n\t'Demus',\n\t'Finkley',\n\t'Taborn',\n\t'Balogun',\n\t'Binstock',\n\t'Gebel',\n\t'Hinnenkamp',\n\t'Kosta',\n\t'Lamphear',\n\t'Linhares',\n\t'Luzader',\n\t'Mcconathy',\n\t'Motl',\n\t'Mroczkowski',\n\t'Reznicek',\n\t'Rieken',\n\t'Sadlowski',\n\t'Schlink',\n\t'Snuffer',\n\t'Tep',\n\t'Vaske',\n\t'Whisner',\n\t'Amesquita',\n\t'Demler',\n\t'Macdonell',\n\t'Rajala',\n\t'Sandate',\n\t'Kolk',\n\t'Bickerton',\n\t'Dugal',\n\t'Kirtland',\n\t'Neilan',\n\t'Doughman',\n\t'Crye',\n\t'Depena',\n\t'Quire',\n\t'Hafeez',\n\t'Rosse',\n\t'Devon',\n\t'Deboe',\n\t'Kitchings',\n\t'Blackett',\n\t'Acey',\n\t'Mcculler',\n\t'Obie',\n\t'Pleas',\n\t'Lurry',\n\t'Abid',\n\t'Bierlein',\n\t'Boisclair',\n\t'Cabanilla',\n\t'Celano',\n\t'Conrow',\n\t'Deeley',\n\t'Frankhouser',\n\t'Janowiak',\n\t'Jarchow',\n\t'Mcnicol',\n\t'Peixoto',\n\t'Pompeo',\n\t'Reitmeyer',\n\t'Scalera',\n\t'Schnorr',\n\t'Sideris',\n\t'Solesbee',\n\t'Stejskal',\n\t'Strole',\n\t'Tosto',\n\t'Wenke',\n\t'Dombek',\n\t'Gottschall',\n\t'Halbur',\n\t'Kuchler',\n\t'Kuyper',\n\t'Wruck',\n\t'Lorenc',\n\t'Search',\n\t'Chohan',\n\t'Monda',\n\t'Clowes',\n\t'Farson',\n\t'Rhoad',\n\t'Clavin',\n\t'Ramus',\n\t'Hayley',\n\t'Dolley',\n\t'Menton',\n\t'Dejarnett',\n\t'Challenger',\n\t'Branner',\n\t'Shed',\n\t'Dada',\n\t'Flewellen',\n\t'Volcy',\n\t'Allphin',\n\t'Barberena',\n\t'Bencivenga',\n\t'Bienkowski',\n\t'Bossi',\n\t'Corsini',\n\t'Dardis',\n\t'Falconi',\n\t'Fitzhenry',\n\t'Gaglione',\n\t'Handlin',\n\t'Kainz',\n\t'Lorge',\n\t'Nase',\n\t'Pavich',\n\t'Perelman',\n\t'Shanafelt',\n\t'Towsley',\n\t'Weill',\n\t'Zollars',\n\t'Appelt',\n\t'Cannizzo',\n\t'Carrubba',\n\t'Detar',\n\t'Dobrzynski',\n\t'Hashman',\n\t'Maassen',\n\t'Mccullagh',\n\t'Rettinger',\n\t'Roediger',\n\t'Rybolt',\n\t'Savoca',\n\t'Wortmann',\n\t'Boria',\n\t'Mairs',\n\t'Stream',\n\t'Larmore',\n\t'Sama',\n\t'Graden',\n\t'Hollinshead',\n\t'Mandy',\n\t'Gidney',\n\t'Demming',\n\t'Alexandra',\n\t'Caleb',\n\t'Abdullahi',\n\t'Cabal',\n\t'Dikeman',\n\t'Ellenbecker',\n\t'Fosnaugh',\n\t'Funck',\n\t'Heidorn',\n\t'Housden',\n\t'Ilic',\n\t'Illescas',\n\t'Kohlmann',\n\t'Lagman',\n\t'Larez',\n\t'Penafiel',\n\t'Pense',\n\t'Ragonese',\n\t'Reitan',\n\t'Shetterly',\n\t'Trapasso',\n\t'Zank',\n\t'Zecca',\n\t'Grisanti',\n\t'Hemker',\n\t'Mascolo',\n\t'Muhlenkamp',\n\t'Riemann',\n\t'Schindel',\n\t'Uncapher',\n\t'Zelman',\n\t'Koper',\n\t'Byrn',\n\t'Calzadilla',\n\t'Dilly',\n\t'Beiser',\n\t'Maller',\n\t'Bagg',\n\t'Winnick',\n\t'Sillman',\n\t'Bilton',\n\t'Esmond',\n\t'Sconyers',\n\t'Lemma',\n\t'Geralds',\n\t'Lazare',\n\t'Threats',\n\t'Accurso',\n\t'Boitnott',\n\t'Calcagni',\n\t'Chavera',\n\t'Corda',\n\t'Delisio',\n\t'Demont',\n\t'Eichel',\n\t'Faulds',\n\t'Ficek',\n\t'Gappa',\n\t'Graci',\n\t'Hammaker',\n\t'Heino',\n\t'Katcher',\n\t'Keslar',\n\t'Larsh',\n\t'Lashua',\n\t'Leising',\n\t'Magri',\n\t'Manbeck',\n\t'Mcwatters',\n\t'Mixer',\n\t'Moder',\n\t'Noori',\n\t'Pallo',\n\t'Pfingsten',\n\t'Plett',\n\t'Prehn',\n\t'Reyburn',\n\t'Savini',\n\t'Sebek',\n\t'Thang',\n\t'Lemberg',\n\t'Xiang',\n\t'Stiegler',\n\t'Groman',\n\t'Bowlen',\n\t'Grignon',\n\t'Morren',\n\t'Dini',\n\t'Mcaulay',\n\t'Ngu',\n\t'Bethell',\n\t'Warring',\n\t'Belyeu',\n\t'Ramcharan',\n\t'Mcjunkins',\n\t'Alms',\n\t'Ayub',\n\t'Brem',\n\t'Dresen',\n\t'Flori',\n\t'Geesaman',\n\t'Haugan',\n\t'Heppler',\n\t'Hermance',\n\t'Korinek',\n\t'Lograsso',\n\t'Madriaga',\n\t'Milbrath',\n\t'Radwan',\n\t'Riemersma',\n\t'Rivett',\n\t'Roggenbuck',\n\t'Stefanick',\n\t'Storment',\n\t'Ziegenfuss',\n\t'Blackhurst',\n\t'Daquila',\n\t'Maruska',\n\t'Rybka',\n\t'Schweer',\n\t'Tandon',\n\t'Hersman',\n\t'Galster',\n\t'Lemp',\n\t'Hantz',\n\t'Enderson',\n\t'Marchal',\n\t'Conly',\n\t'Bali',\n\t'Canaan',\n\t'Anstead',\n\t'Savary',\n\t'Andy',\n\t'Tisdell',\n\t'Livas',\n\t'Grinage',\n\t'Afanador',\n\t'Alviso',\n\t'Aracena',\n\t'Denio',\n\t'Dentremont',\n\t'Eldreth',\n\t'Gravois',\n\t'Huebsch',\n\t'Kalbfleisch',\n\t'Labree',\n\t'Mones',\n\t'Reitsma',\n\t'Schnapp',\n\t'Seek',\n\t'Shuping',\n\t'Tortorice',\n\t'Viscarra',\n\t'Wahlers',\n\t'Wittner',\n\t'Yake',\n\t'Zamani',\n\t'Carriveau',\n\t'Delage',\n\t'Gargan',\n\t'Goldade',\n\t'Golec',\n\t'Lapage',\n\t'Meinhart',\n\t'Mierzwa',\n\t'Riggenbach',\n\t'Schloesser',\n\t'Sedam',\n\t'Winkels',\n\t'Woldt',\n\t'Beckers',\n\t'Teach',\n\t'Feagan',\n\t'Booe',\n\t'Slates',\n\t'Bears',\n\t'Market',\n\t'Moone',\n\t'Verdun',\n\t'Ibe',\n\t'Jeudy',\n\t'Agudo',\n\t'Brisendine',\n\t'Casillo',\n\t'Chalupa',\n\t'Daversa',\n\t'Fissel',\n\t'Fleites',\n\t'Giarratano',\n\t'Glackin',\n\t'Granzow',\n\t'Hawver',\n\t'Hayashida',\n\t'Hovermale',\n\t'Huaman',\n\t'Jezek',\n\t'Lansdell',\n\t'Loughery',\n\t'Niedzielski',\n\t'Orellano',\n\t'Pebley',\n\t'Rojek',\n\t'Tomic',\n\t'Yellen',\n\t'Zerkle',\n\t'Boettner',\n\t'Decook',\n\t'Digilio',\n\t'Dinsdale',\n\t'Germer',\n\t'Kleve',\n\t'Marcinek',\n\t'Mendicino',\n\t'Pehl',\n\t'Revoir',\n\t'Osmun',\n\t'Bahner',\n\t'Shone',\n\t'Howald',\n\t'Kanode',\n\t'Amari',\n\t'Enix',\n\t'Levene',\n\t'Joffrion',\n\t'Lenis',\n\t'Carmicheal',\n\t'Njoku',\n\t'Coffel',\n\t'Ditter',\n\t'Grupp',\n\t'Kabel',\n\t'Kanzler',\n\t'Konop',\n\t'Lupi',\n\t'Mautz',\n\t'Mccahill',\n\t'Perella',\n\t'Perich',\n\t'Rion',\n\t'Ruvolo',\n\t'Torio',\n\t'Vipperman',\n\t'Bentivegna',\n\t'Formanek',\n\t'Smet',\n\t'Tarquinio',\n\t'Wesche',\n\t'Dearinger',\n\t'Makara',\n\t'Duba',\n\t'Iser',\n\t'Nicklow',\n\t'Wignall',\n\t'Wanger',\n\t'Goda',\n\t'Huckstep',\n\t'Basse',\n\t'Debruhl',\n\t'Hainey',\n\t'Damour',\n\t'Ebbs',\n\t'Armond',\n\t'Ewings',\n\t'Rease',\n\t'Okoye',\n\t'Arentz',\n\t'Baack',\n\t'Bellantoni',\n\t'Buckholz',\n\t'Cirigliano',\n\t'Colletta',\n\t'Dutka',\n\t'Everingham',\n\t'Gilardi',\n\t'Hudelson',\n\t'Klimczak',\n\t'Kneip',\n\t'Papaleo',\n\t'Peregrino',\n\t'Piechowski',\n\t'Prucha',\n\t'Ryburn',\n\t'Scholle',\n\t'Scholtes',\n\t'Socarras',\n\t'Wrightsman',\n\t'Yum',\n\t'Campau',\n\t'Dwinell',\n\t'Haupert',\n\t'Lotspeich',\n\t'Madar',\n\t'Casa',\n\t'Michals',\n\t'Rainier',\n\t'Tenpenny',\n\t'Lakeman',\n\t'Spadoni',\n\t'Cantrelle',\n\t'Mangal',\n\t'Chachere',\n\t'Swoope',\n\t'Carwell',\n\t'Voltaire',\n\t'Durrah',\n\t'Roulhac',\n\t'Aboytes',\n\t'Apuzzo',\n\t'Bielinski',\n\t'Bollenbacher',\n\t'Borjon',\n\t'Croak',\n\t'Dansie',\n\t'Espin',\n\t'Euceda',\n\t'Garone',\n\t'Garthwaite',\n\t'Hata',\n\t'Heu',\n\t'Hogenson',\n\t'Jahner',\n\t'Keesey',\n\t'Kotas',\n\t'Labrake',\n\t'Laitinen',\n\t'Laumann',\n\t'Miske',\n\t'Nickless',\n\t'Onishi',\n\t'Setty',\n\t'Shinnick',\n\t'Takayama',\n\t'Tassinari',\n\t'Tribe',\n\t'Bowdish',\n\t'Friesenhahn',\n\t'Hoffarth',\n\t'Wachowski',\n\t'Gudgel',\n\t'Gautney',\n\t'Matar',\n\t'Ellenberg',\n\t'Inghram',\n\t'Bevil',\n\t'Rasul',\n\t'Niblack',\n\t'Perkin',\n\t'Goring',\n\t'Potier',\n\t'Bachrach',\n\t'Bozza',\n\t'Budz',\n\t'Devens',\n\t'Ditzel',\n\t'Drahos',\n\t'Ducat',\n\t'Fahrner',\n\t'Friedline',\n\t'Geurin',\n\t'Goodenow',\n\t'Greenfeld',\n\t'Grunow',\n\t'Ingber',\n\t'Kashani',\n\t'Kochman',\n\t'Kozub',\n\t'Kukuk',\n\t'Leppo',\n\t'Liew',\n\t'Metheney',\n\t'Molony',\n\t'Montemurro',\n\t'Neiss',\n\t'Postlethwait',\n\t'Quaglia',\n\t'Ruszkowski',\n\t'Shertzer',\n\t'Titone',\n\t'Waldmann',\n\t'Wenninger',\n\t'Wheeland',\n\t'Zorich',\n\t'Mervine',\n\t'Weatherholtz',\n\t'Brotman',\n\t'Malenfant',\n\t'Nong',\n\t'Rogness',\n\t'Dibert',\n\t'Gallahan',\n\t'Gange',\n\t'Chilcott',\n\t'Axt',\n\t'Wiler',\n\t'Jacot',\n\t'Ory',\n\t'Abdon',\n\t'Fenter',\n\t'Bryars',\n\t'Ramroop',\n\t'Jacox',\n\t'Mainer',\n\t'Figures',\n\t'Alig',\n\t'Bires',\n\t'Cassata',\n\t'Cholewa',\n\t'Dispenza',\n\t'Eckmann',\n\t'Gauer',\n\t'Gloor',\n\t'Hattori',\n\t'Huster',\n\t'Kopplin',\n\t'Krugman',\n\t'Lancon',\n\t'Ledin',\n\t'Limb',\n\t'Marentes',\n\t'Minges',\n\t'Monacelli',\n\t'Monteon',\n\t'Naslund',\n\t'Nitsche',\n\t'Rapozo',\n\t'Rimkus',\n\t'Schwerdtfeger',\n\t'Vandenbos',\n\t'Balandran',\n\t'Biehn',\n\t'Briody',\n\t'Hackmann',\n\t'Kalka',\n\t'Keranen',\n\t'Lortie',\n\t'Mannella',\n\t'Shiffler',\n\t'Stempel',\n\t'Takaki',\n\t'Tomassi',\n\t'Reidel',\n\t'Ciprian',\n\t'Penza',\n\t'Vite',\n\t'Cormany',\n\t'Derousse',\n\t'Beus',\n\t'Shurley',\n\t'Courtwright',\n\t'Donna',\n\t'Karney',\n\t'Keats',\n\t'Harron',\n\t'Stjacques',\n\t'Regester',\n\t'Stoke',\n\t'Garron',\n\t'Sulaiman',\n\t'Fusilier',\n\t'Hence',\n\t'Altidor',\n\t'Rollerson',\n\t'Anfinson',\n\t'Badua',\n\t'Balmaceda',\n\t'Bringman',\n\t'Bystrom',\n\t'Goffinet',\n\t'Guindon',\n\t'Hilling',\n\t'Makepeace',\n\t'Mooradian',\n\t'Muzquiz',\n\t'Newcom',\n\t'Perrella',\n\t'Postlewait',\n\t'Raetz',\n\t'Riveros',\n\t'Saephanh',\n\t'Scharer',\n\t'Sheeder',\n\t'Sitar',\n\t'Umlauf',\n\t'Voegeli',\n\t'Yurkovich',\n\t'Chaudhari',\n\t'Chianese',\n\t'Clonch',\n\t'Gasparini',\n\t'Giambalvo',\n\t'Gindlesperger',\n\t'Rauen',\n\t'Riegert',\n\t'Collingsworth',\n\t'Stief',\n\t'Zeisler',\n\t'Kirsten',\n\t'Vessey',\n\t'Scherman',\n\t'Ledwith',\n\t'Goudie',\n\t'Ayre',\n\t'Salome',\n\t'Knoles',\n\t'Munyan',\n\t'Corbet',\n\t'Hagewood',\n\t'Humphry',\n\t'Bernardez',\n\t'Drummonds',\n\t'Lide',\n\t'Veals',\n\t'Andolina',\n\t'Anzaldo',\n\t'Aufiero',\n\t'Bakshi',\n\t'Berdan',\n\t'Birrell',\n\t'Colcord',\n\t'Dutro',\n\t'Eisenhour',\n\t'Falgoust',\n\t'Foertsch',\n\t'Forlenza',\n\t'Harroun',\n\t'Kurtenbach',\n\t'Livesey',\n\t'Luka',\n\t'Manseau',\n\t'Mcdaid',\n\t'Miska',\n\t'Overley',\n\t'Panzica',\n\t'Reish',\n\t'Riolo',\n\t'Roseland',\n\t'Shenberger',\n\t'Splinter',\n\t'Strupp',\n\t'Sturgell',\n\t'Swatzell',\n\t'Totherow',\n\t'Villarroel',\n\t'Wenig',\n\t'Zimny',\n\t'Brunetto',\n\t'Hiester',\n\t'Kasinger',\n\t'Laverde',\n\t'Mihalek',\n\t'Aquila',\n\t'Moreton',\n\t'Collums',\n\t'Ergle',\n\t'Keziah',\n\t'Bourbon',\n\t'Scaff',\n\t'Leamy',\n\t'Sublette',\n\t'Winkley',\n\t'Arlington',\n\t'Cuffe',\n\t'Guity',\n\t'Mcmickle',\n\t'Summerour',\n\t'Baggerly',\n\t'Biltz',\n\t'Calma',\n\t'Dephillips',\n\t'Graffam',\n\t'Holsopple',\n\t'Izumi',\n\t'Joerger',\n\t'Kesselman',\n\t'Kingdon',\n\t'Kinkel',\n\t'Knezevich',\n\t'Liebler',\n\t'Maceda',\n\t'Qualey',\n\t'Robeck',\n\t'Sciarrino',\n\t'Sooy',\n\t'Stahly',\n\t'Stieglitz',\n\t'Strike',\n\t'Unwin',\n\t'Urizar',\n\t'Volmer',\n\t'Winterstein',\n\t'Aronov',\n\t'Czyz',\n\t'Marrazzo',\n\t'Seagren',\n\t'Wiegmann',\n\t'Yearsley',\n\t'Brommer',\n\t'Sterne',\n\t'Armel',\n\t'Kryger',\n\t'Barten',\n\t'Bodwell',\n\t'Hollett',\n\t'Sharron',\n\t'Scobey',\n\t'Croson',\n\t'Gainor',\n\t'Axel',\n\t'Basore',\n\t'Bengel',\n\t'Chiem',\n\t'Desanctis',\n\t'Gillooly',\n\t'Groulx',\n\t'Hulings',\n\t'Koenigsberg',\n\t'Kuchinski',\n\t'Pagaduan',\n\t'Pataky',\n\t'Rietz',\n\t'Robello',\n\t'Schuchman',\n\t'Shek',\n\t'Brattain',\n\t'Gottwald',\n\t'Klapperich',\n\t'Kosky',\n\t'Ruegg',\n\t'Smid',\n\t'Taillon',\n\t'Klonowski',\n\t'Attar',\n\t'Mansoor',\n\t'Daus',\n\t'Falla',\n\t'Guyot',\n\t'Hasten',\n\t'Mcdowall',\n\t'Tugwell',\n\t'Remo',\n\t'Dishmon',\n\t'Leggette',\n\t'Sudler',\n\t'Prescod',\n\t'Benvenuti',\n\t'Bittenbender',\n\t'Burkland',\n\t'Crehan',\n\t'Donjuan',\n\t'Ewbank',\n\t'Fluegel',\n\t'Freiman',\n\t'Fuelling',\n\t'Grabner',\n\t'Gras',\n\t'Horr',\n\t'Jurich',\n\t'Kentner',\n\t'Laski',\n\t'Minero',\n\t'Olivos',\n\t'Porro',\n\t'Purves',\n\t'Smethers',\n\t'Spallone',\n\t'Stangler',\n\t'Gebbia',\n\t'Fowers',\n\t'Gaster',\n\t'Fero',\n\t'Gamon',\n\t'Wiss',\n\t'Strassner',\n\t'Cott',\n\t'Houp',\n\t'Fidel',\n\t'Parisien',\n\t'Daisy',\n\t'Calais',\n\t'Boers',\n\t'Bolle',\n\t'Caccavale',\n\t'Colantonio',\n\t'Columbo',\n\t'Goswami',\n\t'Hakanson',\n\t'Jelley',\n\t'Kahlon',\n\t'Lopezgarcia',\n\t'Marier',\n\t'Mesko',\n\t'Monter',\n\t'Mowell',\n\t'Piech',\n\t'Shortell',\n\t'Slechta',\n\t'Starman',\n\t'Tiemeyer',\n\t'Troutner',\n\t'Vandeveer',\n\t'Voorheis',\n\t'Woodhams',\n\t'Helget',\n\t'Kalk',\n\t'Kiester',\n\t'Lagace',\n\t'Obst',\n\t'Parrack',\n\t'Rennert',\n\t'Rodeheaver',\n\t'Schuermann',\n\t'Warmuth',\n\t'Wisnieski',\n\t'Yahnke',\n\t'Yurek',\n\t'Faver',\n\t'Belleau',\n\t'Moan',\n\t'Remsen',\n\t'Bonano',\n\t'Genson',\n\t'Genis',\n\t'Risen',\n\t'Franze',\n\t'Lauderback',\n\t'Ferns',\n\t'Cooler',\n\t'Mcwilliam',\n\t'Micheals',\n\t'Gotch',\n\t'Teat',\n\t'Bacus',\n\t'Banik',\n\t'Bernhart',\n\t'Doell',\n\t'Francese',\n\t'Gasbarro',\n\t'Gietzen',\n\t'Gossen',\n\t'Haberle',\n\t'Havlicek',\n\t'Henion',\n\t'Kevorkian',\n\t'Liem',\n\t'Loor',\n\t'Moede',\n\t'Mostafa',\n\t'Mottern',\n\t'Naito',\n\t'Nofsinger',\n\t'Omelia',\n\t'Pirog',\n\t'Pirone',\n\t'Plucinski',\n\t'Raghavan',\n\t'Robaina',\n\t'Seliga',\n\t'Stade',\n\t'Steinhilber',\n\t'Wedin',\n\t'Wieman',\n\t'Zemaitis',\n\t'Creps',\n\t'Gumina',\n\t'Inglett',\n\t'Jhaveri',\n\t'Kolasinski',\n\t'Salvesen',\n\t'Vallely',\n\t'Weseman',\n\t'Zysk',\n\t'Gourlay',\n\t'Zanger',\n\t'Delorey',\n\t'Sneider',\n\t'Tacey',\n\t'Valls',\n\t'Ossman',\n\t'Watton',\n\t'Breau',\n\t'Burell',\n\t'Villard',\n\t'Janice',\n\t'Honor',\n\t'Arterberry',\n\t'Sow',\n\t'Cucchiara',\n\t'Diemert',\n\t'Fluty',\n\t'Guadiana',\n\t'Ionescu',\n\t'Kearley',\n\t'Krzyzanowski',\n\t'Lavecchia',\n\t'Lundmark',\n\t'Melichar',\n\t'Mulkern',\n\t'Odonohue',\n\t'Payment',\n\t'Pinnow',\n\t'Popoff',\n\t'Prus',\n\t'Reinoehl',\n\t'Scarlata',\n\t'Schamp',\n\t'Schowalter',\n\t'Scinto',\n\t'Semmler',\n\t'Sheline',\n\t'Sigg',\n\t'Trauger',\n\t'Bleiler',\n\t'Carrino',\n\t'Hauth',\n\t'Kunsman',\n\t'Reicks',\n\t'Rotenberg',\n\t'Soltesz',\n\t'Wascher',\n\t'Mattina',\n\t'Tamblyn',\n\t'Bellanca',\n\t'Heward',\n\t'Seif',\n\t'Agha',\n\t'Gosling',\n\t'Defreese',\n\t'Lyvers',\n\t'Robley',\n\t'Hadi',\n\t'Ledyard',\n\t'Mitchner',\n\t'Berrien',\n\t'Clinkscale',\n\t'Affeldt',\n\t'Aung',\n\t'Azpeitia',\n\t'Boehnlein',\n\t'Cavan',\n\t'Ekdahl',\n\t'Ellyson',\n\t'Fahl',\n\t'Herrig',\n\t'Hulick',\n\t'Ihrke',\n\t'Kaeding',\n\t'Keagy',\n\t'Mehlman',\n\t'Minniear',\n\t'Paniccia',\n\t'Pleva',\n\t'Prestidge',\n\t'Pulford',\n\t'Quattrone',\n\t'Riquelme',\n\t'Rombach',\n\t'Sarwar',\n\t'Sivertsen',\n\t'Sprang',\n\t'Wardrop',\n\t'Anglemyer',\n\t'Bobek',\n\t'Scronce',\n\t'Snethen',\n\t'Stancliff',\n\t'Booton',\n\t'Pinal',\n\t'Weihe',\n\t'Bria',\n\t'Lopresto',\n\t'Awbrey',\n\t'Fogal',\n\t'Ning',\n\t'Hydrick',\n\t'Lumb',\n\t'Pommier',\n\t'Hendy',\n\t'Armon',\n\t'Spenser',\n\t'Beachem',\n\t'Decrescenzo',\n\t'Heaphy',\n\t'Kalata',\n\t'Kastl',\n\t'Kosel',\n\t'Kunert',\n\t'Laatsch',\n\t'Lanpher',\n\t'Malinski',\n\t'Mazzie',\n\t'Neuendorf',\n\t'Salloum',\n\t'Tays',\n\t'Yackel',\n\t'Calvario',\n\t'Feese',\n\t'Feldner',\n\t'Kness',\n\t'Kozuch',\n\t'Magat',\n\t'Pantalone',\n\t'Rilling',\n\t'Teska',\n\t'Fantauzzi',\n\t'Wartman',\n\t'Stansbery',\n\t'Sox',\n\t'Napp',\n\t'Schauf',\n\t'Cumings',\n\t'Coxon',\n\t'Labor',\n\t'Brash',\n\t'Egleston',\n\t'Quintin',\n\t'Oki',\n\t'Date',\n\t'Tuckett',\n\t'Devaux',\n\t'Hewins',\n\t'Abdelrahman',\n\t'Schumpert',\n\t'Dort',\n\t'Limbrick',\n\t'Linwood',\n\t'Delaine',\n\t'Liverpool',\n\t'Azimi',\n\t'Biever',\n\t'Craigo',\n\t'Eschete',\n\t'Fortini',\n\t'Francom',\n\t'Giacomini',\n\t'Girdler',\n\t'Halasz',\n\t'Hillin',\n\t'Inglese',\n\t'Isaza',\n\t'Lewman',\n\t'Ploetz',\n\t'Rampley',\n\t'Reifsteck',\n\t'Rossano',\n\t'Sanagustin',\n\t'Sotak',\n\t'Spainhower',\n\t'Stecklein',\n\t'Stolberg',\n\t'Teschner',\n\t'Thew',\n\t'Blaszczyk',\n\t'Caradonna',\n\t'Cillo',\n\t'Diluzio',\n\t'Hagemeyer',\n\t'Holstrom',\n\t'Jewkes',\n\t'Mcquaide',\n\t'Osterhaus',\n\t'Twaddle',\n\t'Wenck',\n\t'Yakel',\n\t'Zeiner',\n\t'Zulauf',\n\t'Mirabelli',\n\t'Gerold',\n\t'Sherr',\n\t'Ogando',\n\t'Achilles',\n\t'Woodlee',\n\t'Underdown',\n\t'Peirson',\n\t'Abdelaziz',\n\t'Bently',\n\t'Junes',\n\t'Furtick',\n\t'Muckle',\n\t'Freemon',\n\t'Jamar',\n\t'Scriber',\n\t'Michaux',\n\t'Cheatum',\n\t'Hollings',\n\t'Telfair',\n\t'Amadeo',\n\t'Bargar',\n\t'Berchtold',\n\t'Boomhower',\n\t'Camba',\n\t'Compo',\n\t'Dellavecchia',\n\t'Doring',\n\t'Doyel',\n\t'Geck',\n\t'Giovannini',\n\t'Herda',\n\t'Kopko',\n\t'Kuns',\n\t'Maciag',\n\t'Neenan',\n\t'Neglia',\n\t'Nienhuis',\n\t'Niznik',\n\t'Pieczynski',\n\t'Quintos',\n\t'Quirin',\n\t'Ravi',\n\t'Teaster',\n\t'Tipsword',\n\t'Troiani',\n\t'Consuegra',\n\t'Damaso',\n\t'Garavaglia',\n\t'Pischke',\n\t'Prowse',\n\t'Rumore',\n\t'Simcoe',\n\t'Slentz',\n\t'Sposito',\n\t'Sulser',\n\t'Weichel',\n\t'Sandobal',\n\t'Siver',\n\t'Vickerman',\n\t'Sham',\n\t'Gutridge',\n\t'Gracy',\n\t'Weatherington',\n\t'Benett',\n\t'Nottage',\n\t'Myricks',\n\t'Tukes',\n\t'Alcaide',\n\t'Curatolo',\n\t'Dalziel',\n\t'Fandrich',\n\t'Fisette',\n\t'Gianino',\n\t'Grether',\n\t'Hari',\n\t'Ichikawa',\n\t'Lantzy',\n\t'Monteforte',\n\t'Moskovitz',\n\t'Porritt',\n\t'Raz',\n\t'Rodenbeck',\n\t'Ryczek',\n\t'Strehle',\n\t'Vanduzer',\n\t'Voge',\n\t'Wiker',\n\t'Yanik',\n\t'Zangari',\n\t'Cahue',\n\t'Dellapenna',\n\t'Gohr',\n\t'Gurka',\n\t'Imburgia',\n\t'Langenberg',\n\t'Kivi',\n\t'Pikul',\n\t'Sexson',\n\t'Sharrer',\n\t'Aramburo',\n\t'Kadar',\n\t'Casasola',\n\t'Nina',\n\t'Borras',\n\t'Toledano',\n\t'Wykle',\n\t'Naeem',\n\t'Bailer',\n\t'Lalla',\n\t'Booty',\n\t'Turenne',\n\t'Merrit',\n\t'Duffus',\n\t'Hemmingway',\n\t'Asare',\n\t'Ahlborn',\n\t'Arroyave',\n\t'Brandenberger',\n\t'Carolus',\n\t'Coonan',\n\t'Dacunha',\n\t'Dost',\n\t'Filter',\n\t'Freudenberg',\n\t'Grabski',\n\t'Hengel',\n\t'Holohan',\n\t'Kohne',\n\t'Kollmann',\n\t'Levick',\n\t'Lupinacci',\n\t'Meservey',\n\t'Reisdorf',\n\t'Rodabaugh',\n\t'Shimon',\n\t'Soth',\n\t'Spall',\n\t'Tener',\n\t'Thier',\n\t'Welshans',\n\t'Chermak',\n\t'Ciolino',\n\t'Frantzen',\n\t'Grassman',\n\t'Okuda',\n\t'Passantino',\n\t'Schellinger',\n\t'Sneath',\n\t'Bolla',\n\t'Bobe',\n\t'Maves',\n\t'Matey',\n\t'Shafi',\n\t'Rothchild',\n\t'Ker',\n\t'Verrette',\n\t'Thorington',\n\t'Lathers',\n\t'Merriwether',\n\t'Bendall',\n\t'Bercier',\n\t'Botz',\n\t'Claybaugh',\n\t'Creson',\n\t'Dilone',\n\t'Gabehart',\n\t'Gencarelli',\n\t'Ghormley',\n\t'Hacking',\n\t'Haefele',\n\t'Haros',\n\t'Holderby',\n\t'Krotzer',\n\t'Nanda',\n\t'Oltmanns',\n\t'Orndoff',\n\t'Poniatowski',\n\t'Rosol',\n\t'Sheneman',\n\t'Shifrin',\n\t'Smay',\n\t'Swickard',\n\t'Thayne',\n\t'Tripathi',\n\t'Vonbehren',\n\t'Pummill',\n\t'Schnitker',\n\t'Steines',\n\t'Beechler',\n\t'Faron',\n\t'Villari',\n\t'Spickard',\n\t'Levings',\n\t'Polack',\n\t'Standre',\n\t'Castel',\n\t'Louise',\n\t'Janey',\n\t'Lindor',\n\t'Bulthuis',\n\t'Cantrall',\n\t'Cisnero',\n\t'Dangel',\n\t'Deborde',\n\t'Decena',\n\t'Grandon',\n\t'Gritz',\n\t'Heberlein',\n\t'Kestenbaum',\n\t'Kubitz',\n\t'Luers',\n\t'Naiman',\n\t'Ramaswamy',\n\t'Sek',\n\t'Slauson',\n\t'Walsworth',\n\t'Biehler',\n\t'Capano',\n\t'Casstevens',\n\t'Forgette',\n\t'Furnas',\n\t'Gilkison',\n\t'Janoski',\n\t'Jerde',\n\t'Mcclimans',\n\t'Rohlf',\n\t'Vliet',\n\t'Heeney',\n\t'Zapanta',\n\t'Lighthall',\n\t'Shallow',\n\t'Neils',\n\t'Raikes',\n\t'Clarkston',\n\t'Claud',\n\t'Guilbeaux',\n\t'Pennie',\n\t'Arizola',\n\t'Aud',\n\t'Checketts',\n\t'Corvera',\n\t'Easterbrook',\n\t'Gamm',\n\t'Grassel',\n\t'Guarin',\n\t'Hanf',\n\t'Hitsman',\n\t'Lackman',\n\t'Lubitz',\n\t'Lupian',\n\t'Olexa',\n\t'Omori',\n\t'Oscarson',\n\t'Picasso',\n\t'Plewa',\n\t'Schmahl',\n\t'Stolze',\n\t'Todisco',\n\t'Zarzycki',\n\t'Baluyot',\n\t'Cerrito',\n\t'Elenbaas',\n\t'Gavidia',\n\t'Heisner',\n\t'Karpowicz',\n\t'Neidhardt',\n\t'Silkwood',\n\t'Taras',\n\t'Dobias',\n\t'Widen',\n\t'Blandino',\n\t'Fanguy',\n\t'Probus',\n\t'Guilbert',\n\t'Shadowens',\n\t'Keepers',\n\t'Bruin',\n\t'Hitson',\n\t'Crymes',\n\t'Roston',\n\t'Beaubrun',\n\t'Arrambide',\n\t'Betti',\n\t'Brockhaus',\n\t'Bumanglag',\n\t'Cabreja',\n\t'Dicenso',\n\t'Hartlaub',\n\t'Hertlein',\n\t'Lapenna',\n\t'Rathje',\n\t'Rotert',\n\t'Salzberg',\n\t'Siniard',\n\t'Tomsic',\n\t'Wondra',\n\t'Zenger',\n\t'Norrod',\n\t'Opalka',\n\t'Osment',\n\t'Zhan',\n\t'Lemcke',\n\t'Meranda',\n\t'Joles',\n\t'Labay',\n\t'Monserrate',\n\t'Grime',\n\t'Martha',\n\t'Coltrain',\n\t'Vardaman',\n\t'Wragg',\n\t'Frater',\n\t'Offer',\n\t'Elcock',\n\t'Auble',\n\t'Bistline',\n\t'Chorney',\n\t'Colgate',\n\t'Dadamo',\n\t'Deol',\n\t'Discher',\n\t'Ertz',\n\t'Fletchall',\n\t'Galletti',\n\t'Geffre',\n\t'Grall',\n\t'Hoos',\n\t'Iezzi',\n\t'Kawecki',\n\t'Madamba',\n\t'Margolies',\n\t'Mccreedy',\n\t'Okimoto',\n\t'Oum',\n\t'Pangan',\n\t'Pasternack',\n\t'Plazola',\n\t'Prochazka',\n\t'Tewes',\n\t'Tramontana',\n\t'Yauch',\n\t'Zarling',\n\t'Zemanek',\n\t'Altshuler',\n\t'Bartkowski',\n\t'Cuoco',\n\t'Garcialopez',\n\t'Kauzlarich',\n\t'Shishido',\n\t'Zaun',\n\t'Hallin',\n\t'Starliper',\n\t'Belflower',\n\t'Kneece',\n\t'Genet',\n\t'Palmero',\n\t'Willmott',\n\t'Riek',\n\t'Belger',\n\t'Abbitt',\n\t'Statum',\n\t'Jacque',\n\t'Chisley',\n\t'Habersham',\n\t'Berardinelli',\n\t'Bodle',\n\t'Deshaw',\n\t'Ingalsbe',\n\t'Kirchgessner',\n\t'Kuna',\n\t'Pellow',\n\t'Pickler',\n\t'Pistole',\n\t'Rosenstock',\n\t'Salceda',\n\t'Sawatzky',\n\t'Schappell',\n\t'Scholer',\n\t'Shellabarger',\n\t'Spader',\n\t'Swadley',\n\t'Travelstead',\n\t'Varin',\n\t'Villwock',\n\t'Wiemers',\n\t'Bedoy',\n\t'Borowiak',\n\t'Celio',\n\t'Dornfeld',\n\t'Juhnke',\n\t'Livernois',\n\t'Sakaguchi',\n\t'Sandall',\n\t'Sivertson',\n\t'Whitcraft',\n\t'Anda',\n\t'Aprile',\n\t'Kritz',\n\t'Speier',\n\t'Karman',\n\t'Kise',\n\t'Madia',\n\t'Bodo',\n\t'Madole',\n\t'Harl',\n\t'Gach',\n\t'Stalls',\n\t'Holme',\n\t'Lomba',\n\t'Tutton',\n\t'Windon',\n\t'Bines',\n\t'Benoist',\n\t'Cirrincione',\n\t'Coday',\n\t'Delrosso',\n\t'Dlouhy',\n\t'Domenick',\n\t'Edelmann',\n\t'Goos',\n\t'Hamling',\n\t'Huda',\n\t'Hutzel',\n\t'Lanasa',\n\t'Loudenslager',\n\t'Lueras',\n\t'Magnussen',\n\t'Mcferran',\n\t'Nowinski',\n\t'Pikula',\n\t'Precht',\n\t'Quilici',\n\t'Robling',\n\t'Rusche',\n\t'Schettino',\n\t'Scibelli',\n\t'Soderman',\n\t'Spirito',\n\t'Teaford',\n\t'Updegrove',\n\t'Weygandt',\n\t'Zervos',\n\t'Brunker',\n\t'Demuro',\n\t'Eckenrod',\n\t'Emley',\n\t'Franek',\n\t'Frankenberger',\n\t'Longbrake',\n\t'Magallanez',\n\t'Stofko',\n\t'Zenz',\n\t'Galik',\n\t'Crevier',\n\t'Fina',\n\t'Harari',\n\t'Dudney',\n\t'Inga',\n\t'Sowles',\n\t'Folker',\n\t'Cressy',\n\t'Eckerson',\n\t'Gerringer',\n\t'Capito',\n\t'Huxtable',\n\t'Arcement',\n\t'Lansdown',\n\t'Amara',\n\t'Brazill',\n\t'Flye',\n\t'Currington',\n\t'Buffin',\n\t'Desta',\n\t'Cheuvront',\n\t'Fuoco',\n\t'Gerbino',\n\t'Hilyer',\n\t'Hogsed',\n\t'Kubis',\n\t'Lautner',\n\t'Loeber',\n\t'Meyn',\n\t'Mortell',\n\t'Nunziato',\n\t'Opdahl',\n\t'Panebianco',\n\t'Reffner',\n\t'Repsher',\n\t'Riccobono',\n\t'Wik',\n\t'Circle',\n\t'Hovde',\n\t'Keaveney',\n\t'Landsberg',\n\t'Pesavento',\n\t'Bedel',\n\t'Glas',\n\t'Thurn',\n\t'Jaffer',\n\t'Dantin',\n\t'Risi',\n\t'Many',\n\t'Egler',\n\t'Craghead',\n\t'Ann',\n\t'Turnbo',\n\t'Crumby',\n\t'Faciane',\n\t'Brummell',\n\t'Bujak',\n\t'Chaddock',\n\t'Cullop',\n\t'Eberling',\n\t'Ennen',\n\t'Frum',\n\t'Gassert',\n\t'Grothaus',\n\t'Hucke',\n\t'Lanphere',\n\t'Lozon',\n\t'Macadam',\n\t'Mezo',\n\t'Peretti',\n\t'Perlin',\n\t'Prestwich',\n\t'Redmann',\n\t'Ringley',\n\t'Rivenburg',\n\t'Sandow',\n\t'Spreitzer',\n\t'Stachnik',\n\t'Szczesniak',\n\t'Tworek',\n\t'Wogan',\n\t'Zygmunt',\n\t'Austad',\n\t'Chiappone',\n\t'Gelineau',\n\t'Lannom',\n\t'Livezey',\n\t'Monrroy',\n\t'Norem',\n\t'Oetting',\n\t'Ostberg',\n\t'Takeshita',\n\t'Gorsky',\n\t'Allcorn',\n\t'Pemble',\n\t'Josselyn',\n\t'Lanzo',\n\t'Hoare',\n\t'Ticer',\n\t'Netterville',\n\t'Lawes',\n\t'Lenton',\n\t'Garraway',\n\t'Cyprian',\n\t'Alferez',\n\t'Allocco',\n\t'Aslanian',\n\t'Brenna',\n\t'Carachure',\n\t'Devoss',\n\t'Dubas',\n\t'Garrabrant',\n\t'Gerloff',\n\t'Gerritsen',\n\t'Hobaugh',\n\t'Jasek',\n\t'Kulis',\n\t'Lenehan',\n\t'Lodes',\n\t'Mandich',\n\t'Manter',\n\t'Mcfatridge',\n\t'Mikolajczak',\n\t'Netz',\n\t'Perrelli',\n\t'Ribar',\n\t'Sekerak',\n\t'Shingledecker',\n\t'Talamante',\n\t'Taverna',\n\t'Thoresen',\n\t'Throneberry',\n\t'Vanacore',\n\t'Vieau',\n\t'Wermuth',\n\t'Zeidan',\n\t'Counihan',\n\t'Dircks',\n\t'Markovitz',\n\t'Panas',\n\t'Steffel',\n\t'Bergstedt',\n\t'Mohar',\n\t'Sonne',\n\t'Mitsch',\n\t'Aceituno',\n\t'Loker',\n\t'Treen',\n\t'Prunier',\n\t'Amberson',\n\t'Allington',\n\t'Artley',\n\t'Caffery',\n\t'Rhoney',\n\t'Nimmer',\n\t'Ledwell',\n\t'Barkus',\n\t'Fralin',\n\t'Locks',\n\t'Azzara',\n\t'Bartosik',\n\t'Bertelson',\n\t'Birman',\n\t'Brogna',\n\t'Cachola',\n\t'Dennington',\n\t'Enea',\n\t'Gallogly',\n\t'Grafe',\n\t'Jankowiak',\n\t'Kaas',\n\t'Karis',\n\t'Kostick',\n\t'Lentsch',\n\t'Locken',\n\t'Mathys',\n\t'Maxcy',\n\t'Monegro',\n\t'Olano',\n\t'Paske',\n\t'Raible',\n\t'Rowbotham',\n\t'Vanderbeck',\n\t'Vanosdol',\n\t'Wenzler',\n\t'Yglesias',\n\t'Eisenberger',\n\t'Grzelak',\n\t'Hamidi',\n\t'Hottel',\n\t'Markoff',\n\t'Santagata',\n\t'Seefeld',\n\t'Stachowicz',\n\t'Stiehl',\n\t'Staver',\n\t'Raad',\n\t'Sarber',\n\t'Rudge',\n\t'Connelley',\n\t'Danser',\n\t'Chumney',\n\t'Hind',\n\t'Desper',\n\t'Fergusson',\n\t'Ringwood',\n\t'Byles',\n\t'Alyea',\n\t'Benzinger',\n\t'Betzer',\n\t'Brix',\n\t'Chiarella',\n\t'Chiriboga',\n\t'Cicala',\n\t'Cohick',\n\t'Creeden',\n\t'Delligatti',\n\t'Garbacz',\n\t'Grossberg',\n\t'Habecker',\n\t'Inscoe',\n\t'Irias',\n\t'Karlsen',\n\t'Kilts',\n\t'Koetter',\n\t'Laflin',\n\t'Laperle',\n\t'Mizner',\n\t'Navia',\n\t'Nolet',\n\t'Procaccini',\n\t'Pula',\n\t'Scarfo',\n\t'Schmelz',\n\t'Taaffe',\n\t'Troth',\n\t'Vanlaningham',\n\t'Vosberg',\n\t'Whitchurch',\n\t'Benak',\n\t'Hanawalt',\n\t'Lindman',\n\t'Moschetti',\n\t'Rozas',\n\t'Sporleder',\n\t'Stopka',\n\t'Turowski',\n\t'Wahlgren',\n\t'Youngstrom',\n\t'Jabbour',\n\t'Myerson',\n\t'Perlow',\n\t'Cannone',\n\t'Kil',\n\t'Stiverson',\n\t'Cedar',\n\t'Sweeden',\n\t'Pourciau',\n\t'Salina',\n\t'Delmoral',\n\t'Balle',\n\t'Cohea',\n\t'Bute',\n\t'Rayne',\n\t'Cawthorn',\n\t'Conely',\n\t'Cartlidge',\n\t'Powel',\n\t'Nwankwo',\n\t'Centrella',\n\t'Delaura',\n\t'Deprey',\n\t'Dulude',\n\t'Garrod',\n\t'Gassen',\n\t'Greenberger',\n\t'Huneke',\n\t'Kunzman',\n\t'Laakso',\n\t'Oppermann',\n\t'Radich',\n\t'Rozen',\n\t'Schoffstall',\n\t'Swetnam',\n\t'Vitrano',\n\t'Wolber',\n\t'Amirault',\n\t'Przybysz',\n\t'Trzeciak',\n\t'Fontan',\n\t'Mathie',\n\t'Roswell',\n\t'Mcquitty',\n\t'Kye',\n\t'Lucious',\n\t'Chilcutt',\n\t'Difazio',\n\t'Diperna',\n\t'Gashi',\n\t'Goodstein',\n\t'Gruetzmacher',\n\t'Imus',\n\t'Krumholz',\n\t'Lanzetta',\n\t'Leaming',\n\t'Lehigh',\n\t'Lobosco',\n\t'Pardoe',\n\t'Pellicano',\n\t'Purtee',\n\t'Ramanathan',\n\t'Roszkowski',\n\t'Satre',\n\t'Steinborn',\n\t'Stinebaugh',\n\t'Thiesen',\n\t'Tierno',\n\t'Wrisley',\n\t'Yazdani',\n\t'Zwilling',\n\t'Berntson',\n\t'Gisclair',\n\t'Golliher',\n\t'Neumeier',\n\t'Stohl',\n\t'Swartley',\n\t'Wannemacher',\n\t'Wickard',\n\t'Duford',\n\t'Rosello',\n\t'Merfeld',\n\t'Arko',\n\t'Cotney',\n\t'Hai',\n\t'Milley',\n\t'Figueira',\n\t'Willes',\n\t'Helmes',\n\t'Abair',\n\t'Life',\n\t'Izard',\n\t'Duskin',\n\t'Moland',\n\t'Primer',\n\t'Hagos',\n\t'Anyanwu',\n\t'Balasubramanian',\n\t'Bluth',\n\t'Calk',\n\t'Chrzan',\n\t'Constanza',\n\t'Durney',\n\t'Ekholm',\n\t'Erny',\n\t'Ferrando',\n\t'Froberg',\n\t'Gonyer',\n\t'Guagliardo',\n\t'Hreha',\n\t'Kobza',\n\t'Kuruvilla',\n\t'Preziosi',\n\t'Ricciuti',\n\t'Rosiles',\n\t'Schiesser',\n\t'Schmoyer',\n\t'Slota',\n\t'Szeliga',\n\t'Verba',\n\t'Widjaja',\n\t'Wrzesinski',\n\t'Zufall',\n\t'Bumstead',\n\t'Dohrman',\n\t'Dommer',\n\t'Eisenmenger',\n\t'Glogowski',\n\t'Kaufhold',\n\t'Kuiken',\n\t'Ricklefs',\n\t'Sinyard',\n\t'Steenbergen',\n\t'Schweppe',\n\t'Chatwin',\n\t'Dingee',\n\t'Mittleman',\n\t'Menear',\n\t'Milot',\n\t'Riccardo',\n\t'Clemenson',\n\t'Mellow',\n\t'Gabe',\n\t'Rolla',\n\t'Vander',\n\t'Casselberry',\n\t'Hubbart',\n\t'Colvert',\n\t'Billingsly',\n\t'Burgman',\n\t'Cattaneo',\n\t'Duthie',\n\t'Hedtke',\n\t'Heidler',\n\t'Hertenstein',\n\t'Hudler',\n\t'Hustead',\n\t'Ibsen',\n\t'Krutsinger',\n\t'Mauceri',\n\t'Mersereau',\n\t'Morad',\n\t'Rentfro',\n\t'Rumrill',\n\t'Shedlock',\n\t'Sindt',\n\t'Soulier',\n\t'Squitieri',\n\t'Trageser',\n\t'Vatter',\n\t'Vollman',\n\t'Wagster',\n\t'Caselli',\n\t'Dibacco',\n\t'Gick',\n\t'Kachel',\n\t'Lukaszewski',\n\t'Minniti',\n\t'Neeld',\n\t'Zarrella',\n\t'Hedglin',\n\t'Jahan',\n\t'Nathe',\n\t'Starn',\n\t'Kana',\n\t'Bernet',\n\t'Rossa',\n\t'Barro',\n\t'Smylie',\n\t'Bowlds',\n\t'Mccalley',\n\t'Oniel',\n\t'Thaggard',\n\t'Cayson',\n\t'Sinegal',\n\t'Bergfeld',\n\t'Bickmore',\n\t'Boch',\n\t'Bushway',\n\t'Carneiro',\n\t'Cerio',\n\t'Colbath',\n\t'Eade',\n\t'Eavenson',\n\t'Epping',\n\t'Fredricksen',\n\t'Gramer',\n\t'Hassman',\n\t'Hinderer',\n\t'Kantrowitz',\n\t'Kaplowitz',\n\t'Kelner',\n\t'Lecates',\n\t'Lothrop',\n\t'Lupica',\n\t'Masterman',\n\t'Meeler',\n\t'Neumiller',\n\t'Newbauer',\n\t'Noyce',\n\t'Nulty',\n\t'Shanker',\n\t'Taheri',\n\t'Timblin',\n\t'Vitucci',\n\t'Zappone',\n\t'Femia',\n\t'Hejl',\n\t'Helmbrecht',\n\t'Kiesow',\n\t'Maschino',\n\t'Brougher',\n\t'Koff',\n\t'Reffett',\n\t'Langhoff',\n\t'Milman',\n\t'Sidener',\n\t'Levie',\n\t'Chaudry',\n\t'Rattan',\n\t'Finkler',\n\t'Bollen',\n\t'Booz',\n\t'Shipps',\n\t'Theall',\n\t'Scallion',\n\t'Furlough',\n\t'Landfair',\n\t'Albuquerque',\n\t'Beckstrand',\n\t'Colglazier',\n\t'Darcey',\n\t'Fahr',\n\t'Gabert',\n\t'Gertner',\n\t'Gettler',\n\t'Giovannetti',\n\t'Hulvey',\n\t'Juenger',\n\t'Kantola',\n\t'Kemmerling',\n\t'Leclere',\n\t'Liberati',\n\t'Lopezlopez',\n\t'Minerva',\n\t'Redlich',\n\t'Shoun',\n\t'Sickinger',\n\t'Vivier',\n\t'Yerdon',\n\t'Ziomek',\n\t'Dechert',\n\t'Delbene',\n\t'Galassi',\n\t'Rawdon',\n\t'Wesenberg',\n\t'Laurino',\n\t'Grosjean',\n\t'Levay',\n\t'Zike',\n\t'Stukey',\n\t'Loft',\n\t'Kool',\n\t'Hatchel',\n\t'Mainville',\n\t'Salis',\n\t'Greenslade',\n\t'Mantey',\n\t'Spratlin',\n\t'Fayette',\n\t'Marner',\n\t'Rolan',\n\t'Pain',\n\t'Colquhoun',\n\t'Brave',\n\t'Locust',\n\t'Sconiers',\n\t'Bahler',\n\t'Barrero',\n\t'Bartha',\n\t'Basnett',\n\t'Berghoff',\n\t'Bomgardner',\n\t'Brindisi',\n\t'Campoli',\n\t'Carawan',\n\t'Chhim',\n\t'Corro',\n\t'Crissey',\n\t'Deterding',\n\t'Dileonardo',\n\t'Dowis',\n\t'Hagemeier',\n\t'Heichel',\n\t'Kipfer',\n\t'Lemberger',\n\t'Maestri',\n\t'Mauri',\n\t'Nakatani',\n\t'Notestine',\n\t'Polakowski',\n\t'Schlobohm',\n\t'Segel',\n\t'Socci',\n\t'Stieg',\n\t'Thorstad',\n\t'Trausch',\n\t'Whitledge',\n\t'Wilkowski',\n\t'Barkdull',\n\t'Dubeau',\n\t'Ellingsen',\n\t'Hayduk',\n\t'Lauter',\n\t'Lizak',\n\t'Machamer',\n\t'Makarewicz',\n\t'Shuffield',\n\t'Heiserman',\n\t'Sandeen',\n\t'Plough',\n\t'Stemler',\n\t'Bossler',\n\t'Catalina',\n\t'Betley',\n\t'Bonello',\n\t'Pryde',\n\t'Nickey',\n\t'Schanck',\n\t'Single',\n\t'Mulberry',\n\t'Point',\n\t'Danson',\n\t'Flemmings',\n\t'Behnken',\n\t'Catone',\n\t'Cummiskey',\n\t'Currens',\n\t'Gersch',\n\t'Kitamura',\n\t'Meddaugh',\n\t'Montagne',\n\t'Nouri',\n\t'Olejnik',\n\t'Pintar',\n\t'Placke',\n\t'Quinter',\n\t'Rakers',\n\t'Stuteville',\n\t'Sullo',\n\t'Voelz',\n\t'Barabas',\n\t'Estock',\n\t'Hultberg',\n\t'Savitz',\n\t'Treml',\n\t'Vigneault',\n\t'Jezierski',\n\t'Zayed',\n\t'Dewell',\n\t'Yanko',\n\t'Moulin',\n\t'Whalin',\n\t'Elsworth',\n\t'Summit',\n\t'Esty',\n\t'Mahadeo',\n\t'Shular',\n\t'Amedee',\n\t'Bellerose',\n\t'Bendixen',\n\t'Briski',\n\t'Buysse',\n\t'Desa',\n\t'Dobry',\n\t'Dufner',\n\t'Fetterly',\n\t'Finau',\n\t'Gaudioso',\n\t'Giangrande',\n\t'Heuring',\n\t'Kitchel',\n\t'Latulippe',\n\t'Pombo',\n\t'Vancott',\n\t'Woofter',\n\t'Bojarski',\n\t'Cretella',\n\t'Heumann',\n\t'Limpert',\n\t'Mcneff',\n\t'Pluff',\n\t'Tumlinson',\n\t'Widick',\n\t'Yeargan',\n\t'Hanft',\n\t'Novinger',\n\t'Ruddle',\n\t'Wrye',\n\t'Felde',\n\t'Basic',\n\t'Babington',\n\t'Karson',\n\t'Forgy',\n\t'Rendall',\n\t'Icard',\n\t'Jann',\n\t'Ady',\n\t'Therrell',\n\t'Sroufe',\n\t'Maden',\n\t'Ganus',\n\t'Preddy',\n\t'Marberry',\n\t'Fonder',\n\t'Latty',\n\t'Leatherbury',\n\t'Mentor',\n\t'Brissett',\n\t'Mcglory',\n\t'Readus',\n\t'Akau',\n\t'Bellone',\n\t'Berendt',\n\t'Bok',\n\t'Broten',\n\t'Colosi',\n\t'Corio',\n\t'Gilani',\n\t'Huffmaster',\n\t'Kieler',\n\t'Leonor',\n\t'Lips',\n\t'Madron',\n\t'Missey',\n\t'Nabozny',\n\t'Panning',\n\t'Reinwald',\n\t'Ridener',\n\t'Silvio',\n\t'Soder',\n\t'Spieler',\n\t'Vaeth',\n\t'Vincenti',\n\t'Walczyk',\n\t'Washko',\n\t'Wiater',\n\t'Wilen',\n\t'Windish',\n\t'Consalvo',\n\t'Fioravanti',\n\t'Hinners',\n\t'Paduano',\n\t'Ranum',\n\t'Parlato',\n\t'Dweck',\n\t'Matern',\n\t'Cryder',\n\t'Rubert',\n\t'Furgason',\n\t'Virella',\n\t'Boylen',\n\t'Devenport',\n\t'Perrodin',\n\t'Hollingshed',\n\t'Pennix',\n\t'Bogdanski',\n\t'Carretero',\n\t'Cubillos',\n\t'Deponte',\n\t'Forrey',\n\t'Gatchalian',\n\t'Geisen',\n\t'Gombos',\n\t'Hartlage',\n\t'Huddy',\n\t'Kou',\n\t'Matsko',\n\t'Muffley',\n\t'Niazi',\n\t'Nodarse',\n\t'Pawelek',\n\t'Pyper',\n\t'Stahnke',\n\t'Udall',\n\t'Baldyga',\n\t'Chrostowski',\n\t'Frable',\n\t'Handshoe',\n\t'Helderman',\n\t'Lambing',\n\t'Marolf',\n\t'Maynez',\n\t'Bunde',\n\t'Coia',\n\t'Piersol',\n\t'Agne',\n\t'Manwarren',\n\t'Bolter',\n\t'Kirsh',\n\t'Limerick',\n\t'Degray',\n\t'Bossie',\n\t'Frizell',\n\t'Saulters',\n\t'Staple',\n\t'Raspberry',\n\t'Arvie',\n\t'Abler',\n\t'Caya',\n\t'Ceci',\n\t'Dado',\n\t'Dewoody',\n\t'Hartzel',\n\t'Haverstick',\n\t'Kagel',\n\t'Kinnan',\n\t'Krock',\n\t'Kubica',\n\t'Laun',\n\t'Leimbach',\n\t'Mecklenburg',\n\t'Messmore',\n\t'Milich',\n\t'Mor',\n\t'Nachreiner',\n\t'Novelo',\n\t'Poer',\n\t'Vaupel',\n\t'Wery',\n\t'Breisch',\n\t'Cashdollar',\n\t'Corbridge',\n\t'Craker',\n\t'Heiberger',\n\t'Landress',\n\t'Leichty',\n\t'Wiedmann',\n\t'Yankowski',\n\t'Rigel',\n\t'Eary',\n\t'Riggen',\n\t'Nazir',\n\t'Shambo',\n\t'Gingery',\n\t'Guyon',\n\t'Bogie',\n\t'Kar',\n\t'Manifold',\n\t'Lafavor',\n\t'Montas',\n\t'Yeadon',\n\t'Cutchin',\n\t'Burkins',\n\t'Achille',\n\t'Bulls',\n\t'Torry',\n\t'Bartkus',\n\t'Beshara',\n\t'Busalacchi',\n\t'Calkin',\n\t'Corkum',\n\t'Crilley',\n\t'Cuny',\n\t'Delgaudio',\n\t'Devenney',\n\t'Emanuelson',\n\t'Fiel',\n\t'Galanti',\n\t'Gravina',\n\t'Herzing',\n\t'Huckaba',\n\t'Jaquish',\n\t'Kellermann',\n\t'Ketola',\n\t'Klunder',\n\t'Kolinski',\n\t'Kosak',\n\t'Loscalzo',\n\t'Moehle',\n\t'Ressel',\n\t'Skora',\n\t'Steakley',\n\t'Traugott',\n\t'Volden',\n\t'Berrong',\n\t'Kehres',\n\t'Loeffelholz',\n\t'Mensinger',\n\t'Nudo',\n\t'Pargas',\n\t'Endy',\n\t'Corniel',\n\t'Azzam',\n\t'Soard',\n\t'Flud',\n\t'Shuffler',\n\t'Hiley',\n\t'Logwood',\n\t'Ducre',\n\t'Aikey',\n\t'Ardolino',\n\t'Bergstresser',\n\t'Cen',\n\t'Delpriore',\n\t'Divelbiss',\n\t'Fishkin',\n\t'Gaucin',\n\t'Hemmingsen',\n\t'Inscore',\n\t'Kathman',\n\t'Kempen',\n\t'Koble',\n\t'Maestre',\n\t'Mcmonigle',\n\t'Merendino',\n\t'Meske',\n\t'Pietrzyk',\n\t'Renfrew',\n\t'Shevchenko',\n\t'Wied',\n\t'Digeronimo',\n\t'Heberer',\n\t'Himmelberger',\n\t'Nordmeyer',\n\t'Pocius',\n\t'Sigurdson',\n\t'Simic',\n\t'Steury',\n\t'Kealey',\n\t'Sabat',\n\t'Verstraete',\n\t'Patchell',\n\t'Finigan',\n\t'Critz',\n\t'Janelle',\n\t'Cima',\n\t'Zachariah',\n\t'Lebon',\n\t'Kellough',\n\t'Whitehall',\n\t'Jaudon',\n\t'Civil',\n\t'Dokes',\n\t'Slappy',\n\t'Bernacki',\n\t'Castronovo',\n\t'Douty',\n\t'Formoso',\n\t'Handelman',\n\t'Hauswirth',\n\t'Janowicz',\n\t'Klostermann',\n\t'Lochridge',\n\t'Mcdiarmid',\n\t'Schmale',\n\t'Shaddox',\n\t'Sitzes',\n\t'Spaw',\n\t'Urbanik',\n\t'Voller',\n\t'Fujikawa',\n\t'Kimmet',\n\t'Klingel',\n\t'Stoffregen',\n\t'Thammavong',\n\t'Varelas',\n\t'Whobrey',\n\t'Mandella',\n\t'Montuori',\n\t'Safrit',\n\t'Turan',\n\t'Khokhar',\n\t'Sircy',\n\t'Sabio',\n\t'Fill',\n\t'Brandao',\n\t'Avans',\n\t'Mencer',\n\t'Sherley',\n\t'Mccadden',\n\t'Sydney',\n\t'Smack',\n\t'Lastrapes',\n\t'Rowser',\n\t'Moultry',\n\t'Faulcon',\n\t'Arnall',\n\t'Babiak',\n\t'Balsam',\n\t'Bezanson',\n\t'Bocook',\n\t'Bohall',\n\t'Celi',\n\t'Costillo',\n\t'Crom',\n\t'Crusan',\n\t'Dibari',\n\t'Donaho',\n\t'Followell',\n\t'Gaudino',\n\t'Gericke',\n\t'Gori',\n\t'Hurrell',\n\t'Jakubiak',\n\t'Kazemi',\n\t'Koslosky',\n\t'Massoud',\n\t'Niebla',\n\t'Noffke',\n\t'Panjwani',\n\t'Papandrea',\n\t'Patella',\n\t'Plambeck',\n\t'Plichta',\n\t'Prinkey',\n\t'Raptis',\n\t'Ruffini',\n\t'Shoen',\n\t'Temkin',\n\t'Thul',\n\t'Vandall',\n\t'Wyeth',\n\t'Zalenski',\n\t'Consoli',\n\t'Gumbert',\n\t'Milanowski',\n\t'Musolf',\n\t'Naeger',\n\t'Okonski',\n\t'Orrison',\n\t'Solache',\n\t'Verdone',\n\t'Woehler',\n\t'Yonke',\n\t'Risdon',\n\t'Orzech',\n\t'Bergland',\n\t'Collen',\n\t'Bloodsworth',\n\t'Furgeson',\n\t'Moch',\n\t'Callegari',\n\t'Alphonso',\n\t'Ozier',\n\t'Paulding',\n\t'Ringold',\n\t'Yarde',\n\t'Abbett',\n\t'Axford',\n\t'Capwell',\n\t'Datz',\n\t'Delillo',\n\t'Delisa',\n\t'Dicaprio',\n\t'Dimare',\n\t'Faughnan',\n\t'Fehrenbacher',\n\t'Gellert',\n\t'Ging',\n\t'Gladhill',\n\t'Goates',\n\t'Hammerstrom',\n\t'Hilbun',\n\t'Iodice',\n\t'Kadish',\n\t'Kilker',\n\t'Lurvey',\n\t'Maue',\n\t'Michna',\n\t'Parslow',\n\t'Pawelski',\n\t'Quenzer',\n\t'Raboin',\n\t'Sader',\n\t'Sawka',\n\t'Velis',\n\t'Wilczewski',\n\t'Willemsen',\n\t'Zebley',\n\t'Benscoter',\n\t'Denhartog',\n\t'Dolinsky',\n\t'Malacara',\n\t'Mccosh',\n\t'Modugno',\n\t'Tsay',\n\t'Vanvoorst',\n\t'Mincher',\n\t'Nickol',\n\t'Elster',\n\t'Kerce',\n\t'Brittan',\n\t'Quilter',\n\t'Spike',\n\t'Mcintee',\n\t'Boldon',\n\t'Balderama',\n\t'Cauffman',\n\t'Chovanec',\n\t'Difonzo',\n\t'Fagerstrom',\n\t'Galanis',\n\t'Jeziorski',\n\t'Krasowski',\n\t'Lansdale',\n\t'Laven',\n\t'Magallan',\n\t'Mahal',\n\t'Mehrer',\n\t'Naus',\n\t'Peltzer',\n\t'Petraitis',\n\t'Pritz',\n\t'Salway',\n\t'Savich',\n\t'Schmehl',\n\t'Teniente',\n\t'Tuccillo',\n\t'Wahlquist',\n\t'Wetz',\n\t'Brozovich',\n\t'Catalfamo',\n\t'Dioguardi',\n\t'Guzzetta',\n\t'Hanak',\n\t'Lipschutz',\n\t'Sholtis',\n\t'Bleecker',\n\t'Sattar',\n\t'Thivierge',\n\t'Camfield',\n\t'Heslep',\n\t'Tree',\n\t'Calvey',\n\t'Mcgowin',\n\t'Strickling',\n\t'Manderson',\n\t'Dieudonne',\n\t'Bonini',\n\t'Bruinsma',\n\t'Burgueno',\n\t'Cotugno',\n\t'Fukunaga',\n\t'Krog',\n\t'Lacerda',\n\t'Larrivee',\n\t'Lepera',\n\t'Pinilla',\n\t'Reichenberger',\n\t'Rovner',\n\t'Rubiano',\n\t'Saraiva',\n\t'Smolka',\n\t'Soboleski',\n\t'Tallmadge',\n\t'Wigand',\n\t'Wikle',\n\t'Bentsen',\n\t'Bierer',\n\t'Cohenour',\n\t'Dobberstein',\n\t'Holderbaum',\n\t'Polhamus',\n\t'Skousen',\n\t'Theiler',\n\t'Fornes',\n\t'Sisley',\n\t'Zingale',\n\t'Nimtz',\n\t'Prieur',\n\t'Mccaughan',\n\t'Fawaz',\n\t'Hobbins',\n\t'Killingbeck',\n\t'Roads',\n\t'Nicolson',\n\t'Mcculloh',\n\t'Verges',\n\t'Badley',\n\t'Shorten',\n\t'Litaker',\n\t'Laseter',\n\t'Stthomas',\n\t'Mcguffie',\n\t'Depass',\n\t'Flemons',\n\t'Ahola',\n\t'Armacost',\n\t'Bearse',\n\t'Downum',\n\t'Drechsel',\n\t'Farooqi',\n\t'Filosa',\n\t'Francesconi',\n\t'Kielbasa',\n\t'Latella',\n\t'Monarch',\n\t'Ozawa',\n\t'Papadakis',\n\t'Politano',\n\t'Poucher',\n\t'Roussin',\n\t'Safley',\n\t'Schwer',\n\t'Tesoro',\n\t'Tsan',\n\t'Wintersteen',\n\t'Zanni',\n\t'Barlage',\n\t'Brancheau',\n\t'Buening',\n\t'Dahlem',\n\t'Forni',\n\t'Gerety',\n\t'Gutekunst',\n\t'Leamer',\n\t'Liwanag',\n\t'Meech',\n\t'Wigal',\n\t'Bonta',\n\t'Cheetham',\n\t'Crespi',\n\t'Fahs',\n\t'Prow',\n\t'Postle',\n\t'Delacy',\n\t'Dufort',\n\t'Gallery',\n\t'Romey',\n\t'Aime',\n\t'Molock',\n\t'Dixion',\n\t'Carstarphen',\n\t'Appleyard',\n\t'Aylsworth',\n\t'Barberi',\n\t'Contini',\n\t'Cugini',\n\t'Eiben',\n\t'Faso',\n\t'Hartog',\n\t'Jelen',\n\t'Loayza',\n\t'Maugeri',\n\t'Mcgannon',\n\t'Osorno',\n\t'Paratore',\n\t'Sahagian',\n\t'Sarracino',\n\t'Scallon',\n\t'Sypniewski',\n\t'Teters',\n\t'Throgmorton',\n\t'Vogelpohl',\n\t'Walkowski',\n\t'Winchel',\n\t'Niedermeyer',\n\t'Jayroe',\n\t'Montello',\n\t'Neyer',\n\t'Milder',\n\t'Obar',\n\t'Stanis',\n\t'Pro',\n\t'Pin',\n\t'Fatheree',\n\t'Cotterell',\n\t'Reeds',\n\t'Comrie',\n\t'Zamor',\n\t'Gradney',\n\t'Poullard',\n\t'Betker',\n\t'Bondarenko',\n\t'Buchko',\n\t'Eischens',\n\t'Glavan',\n\t'Hannold',\n\t'Heafner',\n\t'Karaffa',\n\t'Krabbe',\n\t'Meinzer',\n\t'Olgin',\n\t'Raeder',\n\t'Sarff',\n\t'Senechal',\n\t'Sette',\n\t'Shovlin',\n\t'Slife',\n\t'Tallarico',\n\t'Trivino',\n\t'Wyszynski',\n\t'Audia',\n\t'Facemire',\n\t'Januszewski',\n\t'Klebba',\n\t'Kovacik',\n\t'Moroni',\n\t'Nieder',\n\t'Schorn',\n\t'Sundby',\n\t'Tehan',\n\t'Trias',\n\t'Kissler',\n\t'Margo',\n\t'Jefcoat',\n\t'Bulow',\n\t'Maire',\n\t'Vizcarrondo',\n\t'Ki',\n\t'Ayuso',\n\t'Mayhan',\n\t'Usman',\n\t'Blincoe',\n\t'Whidby',\n\t'Tinson',\n\t'Calarco',\n\t'Cena',\n\t'Ciccarello',\n\t'Cloe',\n\t'Consolo',\n\t'Davydov',\n\t'Decristofaro',\n\t'Delmundo',\n\t'Dubrow',\n\t'Ellinwood',\n\t'Gehling',\n\t'Halberstadt',\n\t'Hascall',\n\t'Hoeffner',\n\t'Huettl',\n\t'Iafrate',\n\t'Imig',\n\t'Khoo',\n\t'Krausz',\n\t'Kuether',\n\t'Kulla',\n\t'Marchesani',\n\t'Ormonde',\n\t'Platzer',\n\t'Preusser',\n\t'Rebel',\n\t'Reidhead',\n\t'Riehm',\n\t'Robertshaw',\n\t'Runco',\n\t'Sandino',\n\t'Spare',\n\t'Trefethen',\n\t'Tribby',\n\t'Yamazaki',\n\t'Ziesmer',\n\t'Calamari',\n\t'Deyoe',\n\t'Marullo',\n\t'Neidigh',\n\t'Salveson',\n\t'Senesac',\n\t'Ausburn',\n\t'Herner',\n\t'Seagrave',\n\t'Lormand',\n\t'Niblock',\n\t'Somes',\n\t'Naim',\n\t'Murren',\n\t'Callander',\n\t'Glassco',\n\t'Henri',\n\t'Jabbar',\n\t'Bordes',\n\t'Altemose',\n\t'Bagnell',\n\t'Belloso',\n\t'Beougher',\n\t'Birchall',\n\t'Cantara',\n\t'Demetriou',\n\t'Galford',\n\t'Hast',\n\t'Heiny',\n\t'Hieronymus',\n\t'Jehle',\n\t'Khachatryan',\n\t'Kristof',\n\t'Kubas',\n\t'Mano',\n\t'Munar',\n\t'Ogas',\n\t'Riccitelli',\n\t'Sidman',\n\t'Suchocki',\n\t'Tortorello',\n\t'Trombino',\n\t'Vullo',\n\t'Badura',\n\t'Clerkin',\n\t'Criollo',\n\t'Dashnaw',\n\t'Mednick',\n\t'Pickrel',\n\t'Mawson',\n\t'Hockey',\n\t'Alo',\n\t'Frankland',\n\t'Gaby',\n\t'Hoda',\n\t'Marchena',\n\t'Fawbush',\n\t'Cowing',\n\t'Aydelott',\n\t'Dieu',\n\t'Rise',\n\t'Morten',\n\t'Gunby',\n\t'Modeste',\n\t'Balcerzak',\n\t'Cutbirth',\n\t'Dejoseph',\n\t'Desaulniers',\n\t'Dimperio',\n\t'Dubord',\n\t'Gruszka',\n\t'Haske',\n\t'Hehr',\n\t'Kolander',\n\t'Kusiak',\n\t'Lampron',\n\t'Mapel',\n\t'Montie',\n\t'Mumme',\n\t'Naramore',\n\t'Raffel',\n\t'Ruter',\n\t'Sawa',\n\t'Sencion',\n\t'Somogyi',\n\t'Ventola',\n\t'Zabawa',\n\t'Alagna',\n\t'Burmaster',\n\t'Chirco',\n\t'Gjerde',\n\t'Hilgenberg',\n\t'Huntress',\n\t'Kochel',\n\t'Nist',\n\t'Schena',\n\t'Toolan',\n\t'Wurzer',\n\t'Masih',\n\t'Ritts',\n\t'Rousse',\n\t'Buckey',\n\t'Sausedo',\n\t'Dolle',\n\t'Bena',\n\t'Franca',\n\t'Commins',\n\t'Gago',\n\t'Pattie',\n\t'Brener',\n\t'Verley',\n\t'Griffy',\n\t'Heiskell',\n\t'Osley',\n\t'Babula',\n\t'Barbone',\n\t'Berzins',\n\t'Demirjian',\n\t'Dietze',\n\t'Haseltine',\n\t'Heinbaugh',\n\t'Henneke',\n\t'Korba',\n\t'Levitz',\n\t'Lorenzini',\n\t'Mansilla',\n\t'Peffley',\n\t'Poletti',\n\t'Portelli',\n\t'Rottinghaus',\n\t'Scifres',\n\t'Stadel',\n\t'Stettner',\n\t'Swauger',\n\t'Vanwart',\n\t'Vorhies',\n\t'Worst',\n\t'Yadav',\n\t'Yebra',\n\t'Kreiter',\n\t'Mroczek',\n\t'Pennella',\n\t'Stangelo',\n\t'Suchan',\n\t'Weiand',\n\t'Widhalm',\n\t'Wojcicki',\n\t'Gutzman',\n\t'Griffee',\n\t'Konicki',\n\t'Moorehouse',\n\t'Neighbor',\n\t'Butte',\n\t'Cooter',\n\t'Humpherys',\n\t'Morrish',\n\t'Stockhausen',\n\t'Slatter',\n\t'Cheely',\n\t'Yassin',\n\t'Bazil',\n\t'Mcsween',\n\t'Anastos',\n\t'Annunziato',\n\t'Bora',\n\t'Burkitt',\n\t'Cino',\n\t'Codding',\n\t'Criado',\n\t'Firestine',\n\t'Goecke',\n\t'Golda',\n\t'Holloran',\n\t'Homen',\n\t'Laubscher',\n\t'Memmer',\n\t'Navejar',\n\t'Peraino',\n\t'Petrizzo',\n\t'Pflieger',\n\t'Pint',\n\t'Porcello',\n\t'Raffety',\n\t'Riedesel',\n\t'Salado',\n\t'Scaletta',\n\t'Schuring',\n\t'Slaydon',\n\t'Solecki',\n\t'Spomer',\n\t'Waldridge',\n\t'Zawislak',\n\t'Bottone',\n\t'Helgesen',\n\t'Knippel',\n\t'Loutzenhiser',\n\t'Mallinson',\n\t'Malnar',\n\t'Pethtel',\n\t'Sissel',\n\t'Thorstenson',\n\t'Winokur',\n\t'Dittmann',\n\t'Fencl',\n\t'Kernen',\n\t'Gath',\n\t'Hiney',\n\t'Godman',\n\t'Hopton',\n\t'Tinley',\n\t'Wamble',\n\t'Greg',\n\t'Garrette',\n\t'Acoff',\n\t'Ausman',\n\t'Burggraf',\n\t'Colliver',\n\t'Dejulio',\n\t'Fedorchak',\n\t'Finocchio',\n\t'Grasse',\n\t'Harpold',\n\t'Hopman',\n\t'Kilzer',\n\t'Losasso',\n\t'Lovallo',\n\t'Neumayer',\n\t'Purohit',\n\t'Reddinger',\n\t'Scheper',\n\t'Valbuena',\n\t'Wenzl',\n\t'Eilerman',\n\t'Galbo',\n\t'Haydu',\n\t'Vipond',\n\t'Wesselman',\n\t'Yeagle',\n\t'Boutelle',\n\t'Odonnel',\n\t'Morocco',\n\t'Speak',\n\t'Ruckel',\n\t'Cornier',\n\t'Burbidge',\n\t'Esselman',\n\t'Daisey',\n\t'Juran',\n\t'Henard',\n\t'Trench',\n\t'Hurry',\n\t'Estis',\n\t'Allport',\n\t'Beedy',\n\t'Blower',\n\t'Bogacz',\n\t'Caldas',\n\t'Carriero',\n\t'Garand',\n\t'Gonterman',\n\t'Harbeck',\n\t'Husar',\n\t'Lizcano',\n\t'Lonardo',\n\t'Meneely',\n\t'Misiewicz',\n\t'Pagliuca',\n\t'Pember',\n\t'Rybacki',\n\t'Safar',\n\t'Seeberger',\n\t'Siharath',\n\t'Spoerl',\n\t'Tattersall',\n\t'Birchmeier',\n\t'Denunzio',\n\t'Dustman',\n\t'Franchini',\n\t'Gettel',\n\t'Goldrick',\n\t'Goodheart',\n\t'Keshishyan',\n\t'Mcgrogan',\n\t'Newingham',\n\t'Scheier',\n\t'Skorupa',\n\t'Utech',\n\t'Weidenbach',\n\t'Chaloupka',\n\t'Grater',\n\t'Libman',\n\t'Recore',\n\t'Savona',\n\t'Verbeke',\n\t'Lunetta',\n\t'Schlater',\n\t'Staffieri',\n\t'Troll',\n\t'Leyton',\n\t'Peto',\n\t'Trella',\n\t'Follin',\n\t'Morro',\n\t'Woodhall',\n\t'Krauser',\n\t'Salles',\n\t'Brunty',\n\t'Wadford',\n\t'Shaddock',\n\t'Minnie',\n\t'Mountcastle',\n\t'Butter',\n\t'Galentine',\n\t'Longsworth',\n\t'Edgecombe',\n\t'Babino',\n\t'Printup',\n\t'Humbles',\n\t'Vessel',\n\t'Relford',\n\t'Taite',\n\t'Aliberti',\n\t'Brostrom',\n\t'Budlong',\n\t'Bykowski',\n\t'Coursen',\n\t'Darga',\n\t'Doutt',\n\t'Gomberg',\n\t'Greaser',\n\t'Hilde',\n\t'Hirschy',\n\t'Mayorquin',\n\t'Mcartor',\n\t'Mechler',\n\t'Mein',\n\t'Montville',\n\t'Peskin',\n\t'Popiel',\n\t'Ricciardelli',\n\t'Terrana',\n\t'Urton',\n\t'Cardiff',\n\t'Foiles',\n\t'Humann',\n\t'Pokorney',\n\t'Seehafer',\n\t'Sporer',\n\t'Timme',\n\t'Tweten',\n\t'Widrick',\n\t'Harnack',\n\t'Chamlee',\n\t'Lafountaine',\n\t'Lowdermilk',\n\t'Akel',\n\t'Maulden',\n\t'Sloman',\n\t'Odonald',\n\t'Hitchman',\n\t'Pendergraph',\n\t'Klugh',\n\t'Mctier',\n\t'Stargell',\n\t'Hailu',\n\t'Kanu',\n\t'Abrahamian',\n\t'Ackerly',\n\t'Belongia',\n\t'Cudmore',\n\t'Jaskolski',\n\t'Kedzierski',\n\t'Licciardi',\n\t'Lowenberg',\n\t'Meitzler',\n\t'Metzer',\n\t'Mitcheltree',\n\t'Nishioka',\n\t'Pascuzzi',\n\t'Pelphrey',\n\t'Ramones',\n\t'Schuchard',\n\t'Smithee',\n\t'Bignell',\n\t'Blaszak',\n\t'Borello',\n\t'Fiacco',\n\t'Garrelts',\n\t'Guzowski',\n\t'Rychlik',\n\t'Siebers',\n\t'Speziale',\n\t'Zauner',\n\t'Corell',\n\t'Welt',\n\t'Koby',\n\t'Auletta',\n\t'Bursch',\n\t'Luckman',\n\t'Vanhoesen',\n\t'Russian',\n\t'Statton',\n\t'Yahya',\n\t'Boxx',\n\t'Haltiwanger',\n\t'Redhead',\n\t'Mcgregory',\n\t'Baccari',\n\t'Berrey',\n\t'Bogden',\n\t'Braniff',\n\t'Cafarelli',\n\t'Clavette',\n\t'Corallo',\n\t'Dealy',\n\t'Gilger',\n\t'Gitter',\n\t'Goldwasser',\n\t'Hillesheim',\n\t'Hulsizer',\n\t'Jankovic',\n\t'Limburg',\n\t'Lopera',\n\t'Mcaleese',\n\t'Mcclintick',\n\t'Montealegre',\n\t'Mosko',\n\t'Nogle',\n\t'Ordones',\n\t'Papesh',\n\t'Peragine',\n\t'Picco',\n\t'Podraza',\n\t'Ras',\n\t'Rezek',\n\t'Rork',\n\t'Schraufnagel',\n\t'Scipione',\n\t'Terlizzi',\n\t'Vanblarcom',\n\t'Yoshino',\n\t'Beaverson',\n\t'Behunin',\n\t'Isch',\n\t'Janiga',\n\t'Koeppe',\n\t'Laurich',\n\t'Vondrak',\n\t'Walkley',\n\t'Hottenstein',\n\t'Garms',\n\t'Macknight',\n\t'Seagroves',\n\t'Shehata',\n\t'Arons',\n\t'Liley',\n\t'Pressly',\n\t'Cowper',\n\t'Branon',\n\t'Abdella',\n\t'Milord',\n\t'Appenzeller',\n\t'Ardila',\n\t'Belgard',\n\t'Boop',\n\t'Burbano',\n\t'Capitano',\n\t'Carrig',\n\t'Conrey',\n\t'Donica',\n\t'Fineberg',\n\t'Gemberling',\n\t'Harrier',\n\t'Hufnagle',\n\t'Kitner',\n\t'Lessing',\n\t'Manoukian',\n\t'Menk',\n\t'Repetto',\n\t'Rhinesmith',\n\t'Stechschulte',\n\t'Yep',\n\t'Zuhlke',\n\t'Abundiz',\n\t'Buccellato',\n\t'Closser',\n\t'Gielow',\n\t'Nurmi',\n\t'Pelka',\n\t'Piscitello',\n\t'Shoaff',\n\t'Champlain',\n\t'Conran',\n\t'Leidig',\n\t'Carel',\n\t'Zahid',\n\t'Dimitri',\n\t'Sapia',\n\t'Labauve',\n\t'Khalifa',\n\t'Gonsoulin',\n\t'Parrot',\n\t'Propps',\n\t'Dunnaway',\n\t'Cayo',\n\t'Mccleod',\n\t'Bonifas',\n\t'Dirkes',\n\t'Farruggia',\n\t'Gut',\n\t'Heacox',\n\t'Herrejon',\n\t'Ipina',\n\t'Keatley',\n\t'Kowitz',\n\t'Kratky',\n\t'Langseth',\n\t'Nidiffer',\n\t'Plimpton',\n\t'Riesenberg',\n\t'Sulewski',\n\t'Tabar',\n\t'Takara',\n\t'Tomassetti',\n\t'Tweet',\n\t'Weltz',\n\t'Youtsey',\n\t'Franckowiak',\n\t'Geffert',\n\t'Glawe',\n\t'Hillestad',\n\t'Ladewig',\n\t'Luckow',\n\t'Radebaugh',\n\t'Ransbottom',\n\t'Stordahl',\n\t'Weimar',\n\t'Wiegers',\n\t'Jowett',\n\t'Tomb',\n\t'Waitt',\n\t'Beaudreau',\n\t'Notter',\n\t'Rijo',\n\t'Denike',\n\t'Mam',\n\t'Vent',\n\t'Gamage',\n\t'Carre',\n\t'Childrey',\n\t'Heaven',\n\t'Forge',\n\t'Beckom',\n\t'Collick',\n\t'Bovell',\n\t'Hardimon',\n\t'Shells',\n\t'Bolf',\n\t'Canete',\n\t'Cozby',\n\t'Dunlavey',\n\t'Febo',\n\t'Lamke',\n\t'Lant',\n\t'Larned',\n\t'Leiss',\n\t'Lofthouse',\n\t'Marohn',\n\t'Stradling',\n\t'Subramaniam',\n\t'Vitug',\n\t'Ziccardi',\n\t'Akamine',\n\t'Bellissimo',\n\t'Bottini',\n\t'Braund',\n\t'Cavasos',\n\t'Heltsley',\n\t'Landstrom',\n\t'Lisiecki',\n\t'Navejas',\n\t'Sobczyk',\n\t'Trela',\n\t'Yablonski',\n\t'Yocham',\n\t'Fier',\n\t'Laiche',\n\t'Zenor',\n\t'Grew',\n\t'Naval',\n\t'Garratt',\n\t'Sako',\n\t'Zollicoffer',\n\t'Momon',\n\t'Bensman',\n\t'Cirincione',\n\t'Dimitrov',\n\t'Domeier',\n\t'Gaska',\n\t'Gensel',\n\t'Gernert',\n\t'Groot',\n\t'Guarisco',\n\t'Llorente',\n\t'Ludemann',\n\t'Moisan',\n\t'Muzio',\n\t'Neiswender',\n\t'Ottaway',\n\t'Paslay',\n\t'Readinger',\n\t'Skok',\n\t'Spittle',\n\t'Sweany',\n\t'Tanzi',\n\t'Upadhyay',\n\t'Valone',\n\t'Varas',\n\t'Benecke',\n\t'Faulstich',\n\t'Hebda',\n\t'Jobst',\n\t'Schleis',\n\t'Shuart',\n\t'Treinen',\n\t'Fok',\n\t'Dentler',\n\t'Ginty',\n\t'Ronda',\n\t'Tess',\n\t'Scantlin',\n\t'Kham',\n\t'Murin',\n\t'Faubert',\n\t'Ocarroll',\n\t'Maranda',\n\t'Gadsby',\n\t'Mouse',\n\t'Lunden',\n\t'Asquith',\n\t'Batley',\n\t'Bazzle',\n\t'Hooke',\n\t'Macneal',\n\t'Desnoyers',\n\t'Verdier',\n\t'Biglow',\n\t'Leverson',\n\t'Becherer',\n\t'Cecilio',\n\t'Correale',\n\t'Ehinger',\n\t'Erney',\n\t'Fassnacht',\n\t'Humpal',\n\t'Korpela',\n\t'Kratt',\n\t'Kunes',\n\t'Lockyer',\n\t'Macho',\n\t'Manfredo',\n\t'Maturino',\n\t'Raineri',\n\t'Seiger',\n\t'Stant',\n\t'Tecson',\n\t'Tempest',\n\t'Traverse',\n\t'Vonk',\n\t'Wormington',\n\t'Yeske',\n\t'Erichsen',\n\t'Fiorelli',\n\t'Fouty',\n\t'Hodgkiss',\n\t'Lindenbaum',\n\t'Matusik',\n\t'Mazzocco',\n\t'Oldani',\n\t'Ronca',\n\t'Amero',\n\t'Ormand',\n\t'Cagley',\n\t'Teutsch',\n\t'Likins',\n\t'Blurton',\n\t'Lapier',\n\t'Rensch',\n\t'Howitt',\n\t'Kady',\n\t'Broce',\n\t'Gaba',\n\t'Summerson',\n\t'Faure',\n\t'Densley',\n\t'Matkins',\n\t'Boleware',\n\t'Rahming',\n\t'Degrate',\n\t'Broaden',\n\t'Barbian',\n\t'Brancaccio',\n\t'Dimiceli',\n\t'Doukas',\n\t'Fredell',\n\t'Fritchman',\n\t'Gahr',\n\t'Geerdes',\n\t'Heidrick',\n\t'Hernon',\n\t'Ipsen',\n\t'Koci',\n\t'Lato',\n\t'Lyng',\n\t'Montella',\n\t'Petraglia',\n\t'Redlinger',\n\t'Riedlinger',\n\t'Rodier',\n\t'Shenton',\n\t'Smigiel',\n\t'Spanbauer',\n\t'Swetland',\n\t'Sypolt',\n\t'Taubert',\n\t'Wallander',\n\t'Willers',\n\t'Ziller',\n\t'Bielak',\n\t'Careaga',\n\t'Droddy',\n\t'Girardot',\n\t'Kanouse',\n\t'Perusse',\n\t'Schwier',\n\t'Velo',\n\t'Westrum',\n\t'Bouza',\n\t'Calverley',\n\t'Shupert',\n\t'Simi',\n\t'Zieger',\n\t'Nicole',\n\t'Fergeson',\n\t'Guerrant',\n\t'Tongue',\n\t'Amison',\n\t'Darius',\n\t'Banasiak',\n\t'Cocca',\n\t'Dannemiller',\n\t'Frommer',\n\t'Guardia',\n\t'Herl',\n\t'Lippa',\n\t'Nappo',\n\t'Olaya',\n\t'Ozburn',\n\t'Patry',\n\t'Pontiff',\n\t'Rauth',\n\t'Reier',\n\t'Rolfs',\n\t'Sassone',\n\t'Servidio',\n\t'Shough',\n\t'Tencza',\n\t'Ernster',\n\t'Helminiak',\n\t'Mcmanamon',\n\t'Ottens',\n\t'Vinh',\n\t'Bula',\n\t'Elza',\n\t'Serres',\n\t'Holan',\n\t'Wetherill',\n\t'Balis',\n\t'Schexnider',\n\t'Harral',\n\t'Dulany',\n\t'Webley',\n\t'Addleman',\n\t'Antonopoulos',\n\t'Badman',\n\t'Czerwonka',\n\t'Deweerd',\n\t'Donaghey',\n\t'Duszynski',\n\t'Firkus',\n\t'Foell',\n\t'Goyne',\n\t'Hattabaugh',\n\t'Herbel',\n\t'Liebelt',\n\t'Lovera',\n\t'Quenneville',\n\t'Ramic',\n\t'Rissmiller',\n\t'Schlag',\n\t'Selover',\n\t'Seyer',\n\t'Stangeland',\n\t'Stutesman',\n\t'Suminski',\n\t'Sweger',\n\t'Tetlow',\n\t'Thornbury',\n\t'Votava',\n\t'Weberg',\n\t'Canniff',\n\t'Evetts',\n\t'Gutterman',\n\t'Kasparek',\n\t'Krenzer',\n\t'Luckenbaugh',\n\t'Mainwaring',\n\t'Vanderweide',\n\t'Balladares',\n\t'Riesterer',\n\t'Salmen',\n\t'Mirando',\n\t'Rockman',\n\t'Warnes',\n\t'Crispell',\n\t'Corban',\n\t'Chrystal',\n\t'Barlowe',\n\t'Perot',\n\t'Ka',\n\t'Stockett',\n\t'Montfort',\n\t'Reagor',\n\t'Coote',\n\t'Christon',\n\t'Dor',\n\t'Apt',\n\t'Bandel',\n\t'Bibbee',\n\t'Brunkhorst',\n\t'Dexheimer',\n\t'Disharoon',\n\t'Engelstad',\n\t'Glaza',\n\t'Locey',\n\t'Loughney',\n\t'Minotti',\n\t'Posa',\n\t'Renzulli',\n\t'Schlauch',\n\t'Shadix',\n\t'Sloboda',\n\t'Topor',\n\t'Vacha',\n\t'Cerulli',\n\t'Ciaravino',\n\t'Cisek',\n\t'Congrove',\n\t'Domzalski',\n\t'Fleitas',\n\t'Helfand',\n\t'Lehnen',\n\t'Moleski',\n\t'Walski',\n\t'Dazey',\n\t'Mckellips',\n\t'Kanne',\n\t'Deguire',\n\t'Macmurray',\n\t'Marcelli',\n\t'Creach',\n\t'Antrobus',\n\t'Hykes',\n\t'Barriere',\n\t'Avinger',\n\t'Handford',\n\t'Beaufort',\n\t'Abend',\n\t'Bozzi',\n\t'Burnsworth',\n\t'Crosthwaite',\n\t'Eilert',\n\t'Frigon',\n\t'Hanbury',\n\t'Hoilman',\n\t'Isaksen',\n\t'Juday',\n\t'Legarda',\n\t'Mcgourty',\n\t'Mittler',\n\t'Olkowski',\n\t'Pau',\n\t'Pescador',\n\t'Pinkerman',\n\t'Renno',\n\t'Rescigno',\n\t'Salsgiver',\n\t'Schlanger',\n\t'Sobek',\n\t'Stasi',\n\t'Talaga',\n\t'Tish',\n\t'Tropea',\n\t'Umphress',\n\t'Weisheit',\n\t'Bartolini',\n\t'Dassow',\n\t'Ferullo',\n\t'Fetherolf',\n\t'Kimery',\n\t'Kurihara',\n\t'Schneiter',\n\t'Sramek',\n\t'Swier',\n\t'Weinzierl',\n\t'Karrer',\n\t'Hurta',\n\t'Lodico',\n\t'Conkright',\n\t'Sandvik',\n\t'Pash',\n\t'Pinell',\n\t'Dougal',\n\t'Burnet',\n\t'Hoe',\n\t'Rann',\n\t'Curvin',\n\t'Route',\n\t'Outler',\n\t'Corprew',\n\t'Berhe',\n\t'Eleby',\n\t'Acoba',\n\t'Ante',\n\t'Baio',\n\t'Befort',\n\t'Brueck',\n\t'Chevere',\n\t'Ciani',\n\t'Farnes',\n\t'Hamar',\n\t'Hirschhorn',\n\t'Imbrogno',\n\t'Kegg',\n\t'Leever',\n\t'Mesker',\n\t'Nodal',\n\t'Olveda',\n\t'Paletta',\n\t'Pilant',\n\t'Rissman',\n\t'Sebold',\n\t'Siebel',\n\t'Smejkal',\n\t'Stai',\n\t'Vanderkolk',\n\t'Allday',\n\t'Canupp',\n\t'Dieck',\n\t'Hinders',\n\t'Karcz',\n\t'Shomaker',\n\t'Tuinstra',\n\t'Urquizo',\n\t'Wiltgen',\n\t'Withem',\n\t'Yanda',\n\t'Blizard',\n\t'Christenbury',\n\t'Helser',\n\t'Jing',\n\t'Stave',\n\t'Waddill',\n\t'Mairena',\n\t'Rebert',\n\t'Gara',\n\t'Shipes',\n\t'Hartsoe',\n\t'Bargeron',\n\t'Arne',\n\t'Ebrahim',\n\t'Basha',\n\t'Rozar',\n\t'Venter',\n\t'Mounger',\n\t'Marsalis',\n\t'Gildon',\n\t'Antkowiak',\n\t'Brus',\n\t'Cicalese',\n\t'Einspahr',\n\t'Faucheux',\n\t'Frix',\n\t'Gateley',\n\t'Hamberger',\n\t'Holdorf',\n\t'Hollibaugh',\n\t'Junod',\n\t'Keaveny',\n\t'Knechtel',\n\t'Kuffel',\n\t'Mcwhirt',\n\t'Navis',\n\t'Neave',\n\t'Rackers',\n\t'Romagnoli',\n\t'Shawhan',\n\t'Valvano',\n\t'Vina',\n\t'Wielgus',\n\t'Wojtaszek',\n\t'Bartnik',\n\t'Fiebelkorn',\n\t'Gertsch',\n\t'Morgenthaler',\n\t'Nambo',\n\t'Nemmers',\n\t'Nihart',\n\t'Nilges',\n\t'Pulgarin',\n\t'Recktenwald',\n\t'Vandenbrink',\n\t'Wion',\n\t'Cundy',\n\t'Burby',\n\t'Cu',\n\t'Vansciver',\n\t'Herne',\n\t'Doughtie',\n\t'Cowdery',\n\t'Woodle',\n\t'Lafosse',\n\t'Hodgens',\n\t'Mckune',\n\t'Car',\n\t'Callens',\n\t'Corsey',\n\t'Brimage',\n\t'Westry',\n\t'Arismendez',\n\t'Benenati',\n\t'Brine',\n\t'Brookbank',\n\t'Burfield',\n\t'Charnock',\n\t'Copado',\n\t'Demilio',\n\t'Elvira',\n\t'Fantini',\n\t'Ferko',\n\t'Flanagin',\n\t'Gotto',\n\t'Hartsough',\n\t'Heckart',\n\t'Herskowitz',\n\t'Hoene',\n\t'Ishibashi',\n\t'Kysar',\n\t'Leaverton',\n\t'Longfield',\n\t'Mischel',\n\t'Musleh',\n\t'Neyra',\n\t'Obeirne',\n\t'Ostrum',\n\t'Pedretti',\n\t'Pilkerton',\n\t'Plasse',\n\t'Reesor',\n\t'Roznowski',\n\t'Rusinko',\n\t'Sickle',\n\t'Spiteri',\n\t'Stash',\n\t'Syracuse',\n\t'Trachsel',\n\t'Weinand',\n\t'Gruenberg',\n\t'Gutkowski',\n\t'Morella',\n\t'Morneault',\n\t'Slivinski',\n\t'Blessinger',\n\t'Taketa',\n\t'Hussaini',\n\t'Obeid',\n\t'Seebeck',\n\t'Spayd',\n\t'Keasling',\n\t'Famularo',\n\t'Carne',\n\t'Lacosse',\n\t'Morino',\n\t'Gutzmer',\n\t'Spinola',\n\t'Deahl',\n\t'Crumm',\n\t'Folley',\n\t'Lennard',\n\t'Rowson',\n\t'Pickron',\n\t'Union',\n\t'Abraha',\n\t'Yohannes',\n\t'Whidbee',\n\t'Mccaster',\n\t'Batzel',\n\t'Borowy',\n\t'Disanti',\n\t'Druck',\n\t'Elsbury',\n\t'Eschmann',\n\t'Fehn',\n\t'Flesner',\n\t'Grawe',\n\t'Haapala',\n\t'Helvie',\n\t'Hudy',\n\t'Joswick',\n\t'Kilcullen',\n\t'Mabus',\n\t'Marzo',\n\t'Obradovich',\n\t'Oriordan',\n\t'Phy',\n\t'Scarff',\n\t'Schappert',\n\t'Scire',\n\t'Vandevander',\n\t'Weyland',\n\t'Anstey',\n\t'Feeback',\n\t'Komarek',\n\t'Kyllo',\n\t'Manivong',\n\t'Timberman',\n\t'Tinkey',\n\t'Zempel',\n\t'Haselhorst',\n\t'Herberg',\n\t'Laris',\n\t'Morter',\n\t'Fredman',\n\t'Reny',\n\t'Ferrall',\n\t'Silverthorne',\n\t'Shuttlesworth',\n\t'Stigers',\n\t'Koker',\n\t'Mollette',\n\t'Mansel',\n\t'Chrisp',\n\t'Glymph',\n\t'Preyer',\n\t'Worlds',\n\t'Arutyunyan',\n\t'Carrizosa',\n\t'Dambrosia',\n\t'Dantuono',\n\t'Delduca',\n\t'Florencio',\n\t'Garafola',\n\t'Habermehl',\n\t'Hanaway',\n\t'Harmes',\n\t'Heinonen',\n\t'Hellstrom',\n\t'Herzer',\n\t'Klahr',\n\t'Kobler',\n\t'Korner',\n\t'Lancia',\n\t'Leask',\n\t'Ledo',\n\t'Manzanarez',\n\t'Myung',\n\t'Prestigiacomo',\n\t'Serpe',\n\t'Tonche',\n\t'Ventrella',\n\t'Walrod',\n\t'Warga',\n\t'Wasmer',\n\t'Weins',\n\t'Zaccaro',\n\t'Bartus',\n\t'Fiumara',\n\t'Incorvaia',\n\t'Khatun',\n\t'Kisamore',\n\t'Riesen',\n\t'Santry',\n\t'Schmierer',\n\t'Talamo',\n\t'Zaccone',\n\t'Liddick',\n\t'Mcclune',\n\t'Hade',\n\t'Calcutt',\n\t'Gillet',\n\t'Husein',\n\t'Be',\n\t'Lavell',\n\t'Veley',\n\t'Buckholtz',\n\t'Naves',\n\t'Debrosse',\n\t'Palms',\n\t'Lacewell',\n\t'Tates',\n\t'Tekle',\n\t'Golphin',\n\t'Asleson',\n\t'Bartlebaugh',\n\t'Benter',\n\t'Bielefeld',\n\t'Cappetta',\n\t'Hanback',\n\t'Heeg',\n\t'Helf',\n\t'Hibberd',\n\t'Holsworth',\n\t'Kowalchuk',\n\t'Kruczek',\n\t'Lieurance',\n\t'Markwood',\n\t'Muckey',\n\t'Rasey',\n\t'Rautio',\n\t'Salek',\n\t'Schwaller',\n\t'Scibilia',\n\t'Speltz',\n\t'Stopper',\n\t'Struckman',\n\t'Surowiec',\n\t'Texter',\n\t'Venturi',\n\t'Wolfenden',\n\t'Zortman',\n\t'Dehler',\n\t'Gillogly',\n\t'Hoelzel',\n\t'Iida',\n\t'Paparella',\n\t'Petrea',\n\t'Pflaum',\n\t'Spampinato',\n\t'Spaur',\n\t'Umbaugh',\n\t'Cerney',\n\t'Athens',\n\t'Salvas',\n\t'Gardinier',\n\t'Ammar',\n\t'Arns',\n\t'Calvi',\n\t'Palazzola',\n\t'Starlin',\n\t'Quave',\n\t'Rhame',\n\t'Gulliford',\n\t'Nettle',\n\t'Picken',\n\t'Warde',\n\t'Pelissier',\n\t'Mcteer',\n\t'Freeny',\n\t'Tappin',\n\t'Bromell',\n\t'People',\n\t'Carthen',\n\t'Battenfield',\n\t'Bunte',\n\t'Estrin',\n\t'Fitzner',\n\t'Flattery',\n\t'Hlavacek',\n\t'Holecek',\n\t'Jorstad',\n\t'Jurczak',\n\t'Kraszewski',\n\t'Lencioni',\n\t'Mamula',\n\t'Mater',\n\t'Petrakis',\n\t'Safranek',\n\t'Santorelli',\n\t'Speyer',\n\t'Waterworth',\n\t'Worner',\n\t'Antonellis',\n\t'Codispoti',\n\t'Docken',\n\t'Economos',\n\t'Petrilla',\n\t'Puccinelli',\n\t'Rondinelli',\n\t'Leibel',\n\t'Santoya',\n\t'Hader',\n\t'Yeakley',\n\t'Dowse',\n\t'Hattan',\n\t'Lia',\n\t'Emel',\n\t'Corse',\n\t'Danes',\n\t'Rambin',\n\t'Dura',\n\t'Kyne',\n\t'Sanderford',\n\t'Mincer',\n\t'Rawl',\n\t'Staves',\n\t'Mccleave',\n\t'Faniel',\n\t'Abeln',\n\t'Asta',\n\t'Beymer',\n\t'Cresap',\n\t'Cryderman',\n\t'Gutwein',\n\t'Kaszuba',\n\t'Maland',\n\t'Marella',\n\t'Mcmannis',\n\t'Molenaar',\n\t'Olivarria',\n\t'Panfil',\n\t'Pieratt',\n\t'Ramthun',\n\t'Resurreccion',\n\t'Rosander',\n\t'Rostad',\n\t'Sallas',\n\t'Santone',\n\t'Schey',\n\t'Shasteen',\n\t'Spalla',\n\t'Sui',\n\t'Tannous',\n\t'Tarman',\n\t'Trayer',\n\t'Wolman',\n\t'Chausse',\n\t'Debacker',\n\t'Dozal',\n\t'Hach',\n\t'Klossner',\n\t'Kruchten',\n\t'Mahowald',\n\t'Rosenlund',\n\t'Steffenhagen',\n\t'Vanmaanen',\n\t'Wildasin',\n\t'Winiecki',\n\t'Dilauro',\n\t'Wygal',\n\t'Cadmus',\n\t'Smallman',\n\t'Sear',\n\t'Berch',\n\t'Nabor',\n\t'Bro',\n\t'Storr',\n\t'Goynes',\n\t'Chestang',\n\t'Alvillar',\n\t'Arya',\n\t'Aton',\n\t'Bors',\n\t'Brydon',\n\t'Castagno',\n\t'Catena',\n\t'Catterson',\n\t'Chhun',\n\t'Delrossi',\n\t'Garnsey',\n\t'Harbeson',\n\t'Holum',\n\t'Iglesia',\n\t'Kleen',\n\t'Lavallie',\n\t'Lossing',\n\t'Miyata',\n\t'Myszka',\n\t'Peth',\n\t'Pyka',\n\t'Radler',\n\t'Roggenkamp',\n\t'Sarra',\n\t'Schmeltz',\n\t'Schreifels',\n\t'Schrimpf',\n\t'Scrogham',\n\t'Sieminski',\n\t'Singson',\n\t'Stichter',\n\t'Vajda',\n\t'Vilardo',\n\t'Ziff',\n\t'Cegielski',\n\t'Fanara',\n\t'Mefferd',\n\t'Polanski',\n\t'Reining',\n\t'Roggow',\n\t'Sassi',\n\t'Wagenknecht',\n\t'Roadcap',\n\t'Tuman',\n\t'Demesa',\n\t'Surita',\n\t'Armando',\n\t'Macks',\n\t'Megan',\n\t'Angello',\n\t'Bosher',\n\t'Neugent',\n\t'Croslin',\n\t'Bumpas',\n\t'Gladman',\n\t'Demmons',\n\t'Mcnairy',\n\t'Sermons',\n\t'Okonkwo',\n\t'Alvira',\n\t'Barfuss',\n\t'Bersch',\n\t'Bustin',\n\t'Ciriello',\n\t'Cords',\n\t'Cuddeback',\n\t'Debono',\n\t'Delosh',\n\t'Haeger',\n\t'Ida',\n\t'Kneer',\n\t'Koppen',\n\t'Kottwitz',\n\t'Laib',\n\t'Matsushita',\n\t'Mckone',\n\t'Meester',\n\t'Ohashi',\n\t'Pickert',\n\t'Risso',\n\t'Vannice',\n\t'Vargason',\n\t'Vorpahl',\n\t'Gluth',\n\t'Goossens',\n\t'Kloeppel',\n\t'Krolczyk',\n\t'Lequire',\n\t'Nila',\n\t'Savoia',\n\t'Wassmer',\n\t'Bianca',\n\t'Rousselle',\n\t'Wittler',\n\t'Gillean',\n\t'Cervi',\n\t'Fremin',\n\t'Vanzanten',\n\t'Varvel',\n\t'Sween',\n\t'Peron',\n\t'Trudo',\n\t'Welford',\n\t'Scovil',\n\t'Beazer',\n\t'Cohill',\n\t'Estime',\n\t'Alcalde',\n\t'Bugay',\n\t'Bushard',\n\t'Dethloff',\n\t'Gahn',\n\t'Gronau',\n\t'Hogston',\n\t'Kleinfelter',\n\t'Ksiazek',\n\t'Lyness',\n\t'Marak',\n\t'Munafo',\n\t'Noorani',\n\t'Plonski',\n\t'Pontarelli',\n\t'Presas',\n\t'Ringenberg',\n\t'Sabillon',\n\t'Schaut',\n\t'Shankland',\n\t'Sheil',\n\t'Shugrue',\n\t'Soter',\n\t'Stankovich',\n\t'Arrants',\n\t'Boeckmann',\n\t'Boothroyd',\n\t'Dysinger',\n\t'Gersh',\n\t'Monnig',\n\t'Scheiderer',\n\t'Slifka',\n\t'Vilardi',\n\t'Podell',\n\t'Tarallo',\n\t'Goodroe',\n\t'Sardinha',\n\t'Blish',\n\t'Califf',\n\t'Dorion',\n\t'Dougall',\n\t'Hamza',\n\t'Boggus',\n\t'Mccan',\n\t'Branscomb',\n\t'Baatz',\n\t'Bendix',\n\t'Hartstein',\n\t'Hechler',\n\t'Komatsu',\n\t'Kooiman',\n\t'Loghry',\n\t'Lorson',\n\t'Mcgoff',\n\t'Moga',\n\t'Monsees',\n\t'Nigg',\n\t'Pacitti',\n\t'Shiffman',\n\t'Shoupe',\n\t'Snarski',\n\t'Vrba',\n\t'Wilmeth',\n\t'Yurchak',\n\t'Budney',\n\t'Estok',\n\t'Knipple',\n\t'Krzywicki',\n\t'Librizzi',\n\t'Obringer',\n\t'Poliquin',\n\t'Severtson',\n\t'Vecchiarelli',\n\t'Zelazny',\n\t'Eis',\n\t'Wildeman',\n\t'Gatt',\n\t'Gordin',\n\t'Dusenbury',\n\t'Prew',\n\t'Mander',\n\t'Tine',\n\t'Debarr',\n\t'Bann',\n\t'Mcguirt',\n\t'Vanloan',\n\t'Basdeo',\n\t'Kosh',\n\t'Bertha',\n\t'Mcglothen',\n\t'Youman',\n\t'Hallums',\n\t'Mcfield',\n\t'Asano',\n\t'Barbo',\n\t'Braver',\n\t'Bua',\n\t'Buetow',\n\t'Buttke',\n\t'Estela',\n\t'Kauk',\n\t'Kosmicki',\n\t'Kuecker',\n\t'Lahm',\n\t'Lienhard',\n\t'Lombera',\n\t'Menken',\n\t'Niederhauser',\n\t'Norcia',\n\t'Petrelli',\n\t'Phong',\n\t'Piontkowski',\n\t'Prihoda',\n\t'Raffo',\n\t'Sherpa',\n\t'Shinsky',\n\t'Skoczylas',\n\t'Sosinski',\n\t'Sua',\n\t'Sur',\n\t'Thorndike',\n\t'Trease',\n\t'Wessler',\n\t'Witting',\n\t'Ackroyd',\n\t'Bartnick',\n\t'Dziuba',\n\t'Lisko',\n\t'Muradyan',\n\t'Pistilli',\n\t'Riechers',\n\t'Saxman',\n\t'Rodi',\n\t'Venables',\n\t'Holway',\n\t'Vargus',\n\t'Oley',\n\t'Delmont',\n\t'Fuster',\n\t'Wyndham',\n\t'Whittenberg',\n\t'Chustz',\n\t'Swilling',\n\t'Moncure',\n\t'Housey',\n\t'Mckiver',\n\t'Shelvin',\n\t'Aslin',\n\t'Begeman',\n\t'Capek',\n\t'Christlieb',\n\t'Colasanti',\n\t'Daidone',\n\t'Detlefsen',\n\t'Elsass',\n\t'Faus',\n\t'Francke',\n\t'Hensarling',\n\t'Hollmann',\n\t'Isaacks',\n\t'Kocis',\n\t'Kofman',\n\t'Kwiatek',\n\t'Osterkamp',\n\t'Pickar',\n\t'Prellwitz',\n\t'Ramo',\n\t'Steenson',\n\t'Tomasulo',\n\t'Weinreb',\n\t'Wiard',\n\t'Ambs',\n\t'Baglio',\n\t'Frayre',\n\t'Hisaw',\n\t'Justman',\n\t'Morrical',\n\t'Sherfey',\n\t'Gera',\n\t'Ilgenfritz',\n\t'Silos',\n\t'Boge',\n\t'Darocha',\n\t'Hennon',\n\t'Hendriks',\n\t'Purrington',\n\t'Eunice',\n\t'Kirks',\n\t'Barbar',\n\t'Guichard',\n\t'Bonny',\n\t'Lobban',\n\t'Winrow',\n\t'Alavi',\n\t'Binner',\n\t'Canan',\n\t'Ciullo',\n\t'Cyran',\n\t'Doolen',\n\t'Enquist',\n\t'Fatzinger',\n\t'Forsell',\n\t'Harnisch',\n\t'Hirose',\n\t'Lunz',\n\t'Mcbrearty',\n\t'Mcgavin',\n\t'Minkin',\n\t'Ralphs',\n\t'Ruegsegger',\n\t'Shetter',\n\t'Slagter',\n\t'Tyminski',\n\t'Ubben',\n\t'Vanderschaaf',\n\t'Wigfield',\n\t'Zellman',\n\t'Bettenhausen',\n\t'Busker',\n\t'Jabs',\n\t'Mishkin',\n\t'Sturdy',\n\t'Vanstone',\n\t'Tierce',\n\t'Cormican',\n\t'Mazzucco',\n\t'Buenger',\n\t'Gallier',\n\t'Duma',\n\t'Rainbow',\n\t'Herlong',\n\t'Chriswell',\n\t'Litsey',\n\t'Wyke',\n\t'Kissoon',\n\t'Sesler',\n\t'Farve',\n\t'Lalanne',\n\t'Myhand',\n\t'Heggs',\n\t'Andujo',\n\t'Arcilla',\n\t'Bult',\n\t'Caponigro',\n\t'Commerford',\n\t'Ditmars',\n\t'Dressen',\n\t'Eggemeyer',\n\t'Forstner',\n\t'From',\n\t'Heldreth',\n\t'Hevia',\n\t'Leiphart',\n\t'Mastrocola',\n\t'Mcanelly',\n\t'Mccrillis',\n\t'Mellick',\n\t'Mogle',\n\t'Mummey',\n\t'Nishiyama',\n\t'Nordine',\n\t'Picinich',\n\t'Rafiq',\n\t'Savo',\n\t'Selvig',\n\t'Sestak',\n\t'Shafran',\n\t'Smithhart',\n\t'Soltani',\n\t'Stillion',\n\t'Szuch',\n\t'Tigert',\n\t'Trine',\n\t'Un',\n\t'Brest',\n\t'Callari',\n\t'Jaskowiak',\n\t'Maneval',\n\t'Sarchet',\n\t'Szuba',\n\t'Taubman',\n\t'Wandel',\n\t'Blok',\n\t'Pasquarello',\n\t'Sava',\n\t'Diekman',\n\t'Blight',\n\t'Lovgren',\n\t'Clemson',\n\t'Lince',\n\t'Kanady',\n\t'Whipps',\n\t'Coren',\n\t'Coye',\n\t'Patman',\n\t'Souffrant',\n\t'Bloodsaw',\n\t'Amano',\n\t'Cassaday',\n\t'Cutillo',\n\t'Dayrit',\n\t'Deringer',\n\t'Duwe',\n\t'Favazza',\n\t'Fennema',\n\t'Hackleman',\n\t'Harders',\n\t'Imperiale',\n\t'Kano',\n\t'Kingma',\n\t'Meuser',\n\t'Neiger',\n\t'Neitz',\n\t'Nied',\n\t'Prows',\n\t'Riss',\n\t'Rotundo',\n\t'Scheurich',\n\t'Stopa',\n\t'Tonks',\n\t'Veen',\n\t'Volante',\n\t'Maerz',\n\t'Nunnelley',\n\t'Sommerfeldt',\n\t'Spoonemore',\n\t'Wechter',\n\t'Wehrli',\n\t'Ackert',\n\t'Begun',\n\t'Dreyfuss',\n\t'Frezza',\n\t'Mako',\n\t'Nagao',\n\t'Lassetter',\n\t'Linse',\n\t'Raum',\n\t'Graca',\n\t'Enslow',\n\t'Bruff',\n\t'Hodgkin',\n\t'Coone',\n\t'Trippett',\n\t'Tippitt',\n\t'Sumerlin',\n\t'Carelock',\n\t'Whitelow',\n\t'Beightol',\n\t'Cappadona',\n\t'Carrizal',\n\t'Clendaniel',\n\t'Cresci',\n\t'Dietzman',\n\t'Figge',\n\t'Heyde',\n\t'Jarema',\n\t'Kyllonen',\n\t'Laminack',\n\t'Luddy',\n\t'Monical',\n\t'Mula',\n\t'Picotte',\n\t'Sandiego',\n\t'Seki',\n\t'Senner',\n\t'Starkman',\n\t'Stassi',\n\t'Stuckert',\n\t'Wiers',\n\t'Wieting',\n\t'Ziska',\n\t'Ardelean',\n\t'Hulslander',\n\t'Loewenstein',\n\t'Mearns',\n\t'Roese',\n\t'Sweaney',\n\t'Winick',\n\t'Zaring',\n\t'Farry',\n\t'Dulle',\n\t'Gunnerson',\n\t'Duden',\n\t'Arts',\n\t'Lame',\n\t'Mcquerry',\n\t'Smiles',\n\t'Pennick',\n\t'Adderly',\n\t'Becka',\n\t'Bluemel',\n\t'Bocek',\n\t'Bouwens',\n\t'Deren',\n\t'Dewitz',\n\t'Doland',\n\t'Ewton',\n\t'Funnell',\n\t'Gavel',\n\t'Haidar',\n\t'Kalkbrenner',\n\t'Kawashima',\n\t'Kueker',\n\t'Lutze',\n\t'Macareno',\n\t'Nenninger',\n\t'Schone',\n\t'Seever',\n\t'Sexauer',\n\t'Sibilia',\n\t'Sperrazza',\n\t'Vanderhoef',\n\t'Vanoss',\n\t'Werre',\n\t'Wotton',\n\t'Behney',\n\t'Bossart',\n\t'Ellithorpe',\n\t'Eyrich',\n\t'Fosco',\n\t'Fulginiti',\n\t'Grumbles',\n\t'Hoeger',\n\t'Kizziah',\n\t'Kloiber',\n\t'Kudo',\n\t'Majcher',\n\t'Stickels',\n\t'Stoler',\n\t'Umholtz',\n\t'Vasallo',\n\t'Wenker',\n\t'Wittmeyer',\n\t'Telesco',\n\t'Jha',\n\t'Maulding',\n\t'Campton',\n\t'Verble',\n\t'Mclure',\n\t'Bernardin',\n\t'Eison',\n\t'Coffie',\n\t'Ceesay',\n\t'Balakrishnan',\n\t'Barich',\n\t'Bigman',\n\t'Blumenstein',\n\t'Bonafede',\n\t'Cebulski',\n\t'Chesbro',\n\t'Cuaresma',\n\t'Demarino',\n\t'Derienzo',\n\t'Donmoyer',\n\t'Fairall',\n\t'Gelpi',\n\t'Giambra',\n\t'Hasselman',\n\t'Highlander',\n\t'Hunker',\n\t'Iyengar',\n\t'Kulaga',\n\t'Kuznicki',\n\t'Labus',\n\t'Limbert',\n\t'Molchan',\n\t'Neuharth',\n\t'Overgaard',\n\t'Paszkiewicz',\n\t'Plescia',\n\t'Redcay',\n\t'Ritzer',\n\t'Smirnov',\n\t'Valiquette',\n\t'Vannortwick',\n\t'Warstler',\n\t'Yantz',\n\t'Beardall',\n\t'Cimmino',\n\t'Crnkovich',\n\t'Konishi',\n\t'Kosowski',\n\t'Ragen',\n\t'Sebert',\n\t'Valla',\n\t'Venancio',\n\t'Maltez',\n\t'Skehan',\n\t'Abrantes',\n\t'Colfer',\n\t'Beman',\n\t'Wilhelmsen',\n\t'Wilking',\n\t'Rorer',\n\t'Shutes',\n\t'Albany',\n\t'Wearing',\n\t'Assefa',\n\t'Angeloni',\n\t'Bisher',\n\t'Blancett',\n\t'Briel',\n\t'Chiara',\n\t'Clearman',\n\t'Dengel',\n\t'Detert',\n\t'Fadely',\n\t'Flinders',\n\t'Garguilo',\n\t'Goes',\n\t'Hakimian',\n\t'Henehan',\n\t'Homewood',\n\t'Kalla',\n\t'Keirn',\n\t'Kerwood',\n\t'Laflam',\n\t'Lynskey',\n\t'Minhas',\n\t'Mow',\n\t'Olk',\n\t'Ostergaard',\n\t'Palecek',\n\t'Poirrier',\n\t'Raudenbush',\n\t'Schlottman',\n\t'Shatz',\n\t'Sieloff',\n\t'Stikeleather',\n\t'Swavely',\n\t'Tapanes',\n\t'Teehan',\n\t'Wendorff',\n\t'Wollner',\n\t'Bichsel',\n\t'Brandenburger',\n\t'Demattia',\n\t'Eggebrecht',\n\t'Koelzer',\n\t'Landrigan',\n\t'Morsch',\n\t'Pittinger',\n\t'Rewerts',\n\t'Schopf',\n\t'Tetro',\n\t'Westenberger',\n\t'Kieft',\n\t'Overy',\n\t'Cutrona',\n\t'Misa',\n\t'Erich',\n\t'Swapp',\n\t'Welchel',\n\t'Messa',\n\t'Ala',\n\t'Witbeck',\n\t'Mothershead',\n\t'Stofer',\n\t'Mcneice',\n\t'Ayling',\n\t'Zakaria',\n\t'Bu',\n\t'Rauf',\n\t'Richbourg',\n\t'Fristoe',\n\t'Dorch',\n\t'Mcclarin',\n\t'Privott',\n\t'Bonsu',\n\t'Ayson',\n\t'Bifulco',\n\t'Brungard',\n\t'Bub',\n\t'Budzynski',\n\t'Chizmar',\n\t'Coriz',\n\t'Corser',\n\t'Daughdrill',\n\t'Delre',\n\t'Elfers',\n\t'Fabrizi',\n\t'Gunawan',\n\t'Haecker',\n\t'Hammac',\n\t'Handwerk',\n\t'Larcom',\n\t'Liera',\n\t'Littlewood',\n\t'Luikart',\n\t'Pasquarella',\n\t'Radman',\n\t'Ranft',\n\t'Rigas',\n\t'Santin',\n\t'Sorbello',\n\t'Tayag',\n\t'Ureste',\n\t'Weidinger',\n\t'Yerena',\n\t'Aase',\n\t'Galyen',\n\t'Halferty',\n\t'Hindley',\n\t'Kunath',\n\t'Laprairie',\n\t'Oza',\n\t'Stohler',\n\t'Tokarczyk',\n\t'Yusupov',\n\t'Nogueras',\n\t'Jersey',\n\t'Eastes',\n\t'Agron',\n\t'Boso',\n\t'Kender',\n\t'Couse',\n\t'Moreta',\n\t'Larrow',\n\t'Degrace',\n\t'Sonier',\n\t'Tisdel',\n\t'Creque',\n\t'Esther',\n\t'Girtman',\n\t'Seraphin',\n\t'Wesby',\n\t'Kargbo',\n\t'Adjei',\n\t'Angeline',\n\t'Biby',\n\t'Brucks',\n\t'Bucaro',\n\t'Farman',\n\t'Gerdeman',\n\t'Hodsdon',\n\t'Hoying',\n\t'Kasperek',\n\t'Keinath',\n\t'Kidman',\n\t'Kleier',\n\t'Kuban',\n\t'Lacko',\n\t'Latourette',\n\t'Leffert',\n\t'Leonhart',\n\t'Mathern',\n\t'Ploss',\n\t'Poblano',\n\t'Raigoza',\n\t'Santor',\n\t'Schmitzer',\n\t'Sirico',\n\t'Skalsky',\n\t'Spreen',\n\t'Standlee',\n\t'Vonbargen',\n\t'Cederberg',\n\t'Cornforth',\n\t'Dercole',\n\t'Diblasio',\n\t'Fleer',\n\t'Fredlund',\n\t'Gehris',\n\t'Guck',\n\t'Lannen',\n\t'Lurz',\n\t'Mazzaferro',\n\t'Neukam',\n\t'Rookstool',\n\t'Scharrer',\n\t'Sevey',\n\t'Sicairos',\n\t'Skrocki',\n\t'Sneeringer',\n\t'Stefanowicz',\n\t'Zuleger',\n\t'Harmel',\n\t'Sendejo',\n\t'Bearer',\n\t'Shur',\n\t'Weers',\n\t'Norell',\n\t'Plotnick',\n\t'Cecchi',\n\t'Gandia',\n\t'Bastone',\n\t'Tole',\n\t'Tramell',\n\t'Willock',\n\t'Rhome',\n\t'Curington',\n\t'Rapley',\n\t'Hazley',\n\t'Todman',\n\t'Lathon',\n\t'Alperin',\n\t'Axtman',\n\t'Boeke',\n\t'Butson',\n\t'Cestaro',\n\t'Cosgriff',\n\t'Docter',\n\t'Eblin',\n\t'Filsinger',\n\t'Franzone',\n\t'Gareau',\n\t'Garfinkle',\n\t'Gatch',\n\t'Germosen',\n\t'Grzywacz',\n\t'Huesman',\n\t'Kasel',\n\t'Kazan',\n\t'Manalang',\n\t'Marando',\n\t'Marchio',\n\t'Massimino',\n\t'Mcneer',\n\t'Menger',\n\t'Milanese',\n\t'Monrreal',\n\t'Moretto',\n\t'Mulvany',\n\t'Petkus',\n\t'Rehling',\n\t'Rubbo',\n\t'Rudnik',\n\t'Settlemire',\n\t'Treon',\n\t'Yaklin',\n\t'Zittel',\n\t'Betzold',\n\t'Bohlin',\n\t'Churilla',\n\t'Conrath',\n\t'Ozbun',\n\t'Sciuto',\n\t'Stitz',\n\t'Sweigert',\n\t'Tamanaha',\n\t'Wallgren',\n\t'Eplin',\n\t'Ion',\n\t'Liford',\n\t'Orendorff',\n\t'Wootan',\n\t'Carmical',\n\t'Mince',\n\t'Stormes',\n\t'Lantry',\n\t'Sportsman',\n\t'Corron',\n\t'Padia',\n\t'Cunnington',\n\t'Pitta',\n\t'Ori',\n\t'Obara',\n\t'Gaultney',\n\t'Vanlue',\n\t'Emmitt',\n\t'Roddey',\n\t'Payen',\n\t'Elmi',\n\t'Culmer',\n\t'Mealing',\n\t'Allegra',\n\t'Bano',\n\t'Batterman',\n\t'Bickell',\n\t'Dager',\n\t'Drach',\n\t'Duchesneau',\n\t'Erdos',\n\t'Fedorko',\n\t'Fluhr',\n\t'Gassmann',\n\t'Gillig',\n\t'Goedert',\n\t'Golomb',\n\t'Hatler',\n\t'Jalali',\n\t'Joosten',\n\t'Koke',\n\t'Lausch',\n\t'Leisner',\n\t'Mallinger',\n\t'Marsolek',\n\t'Mashek',\n\t'Ognibene',\n\t'Oishi',\n\t'Outman',\n\t'Paganelli',\n\t'Passino',\n\t'Petrak',\n\t'Rosenwald',\n\t'Schroader',\n\t'Stehman',\n\t'Tenuta',\n\t'Todt',\n\t'Tritz',\n\t'Boerman',\n\t'Doeden',\n\t'Etcheverry',\n\t'Grissinger',\n\t'Gruenewald',\n\t'Lijewski',\n\t'Marcom',\n\t'Niebauer',\n\t'Rukavina',\n\t'Sakuma',\n\t'Woehrle',\n\t'Amores',\n\t'Krammes',\n\t'Shontz',\n\t'Bunning',\n\t'Widdowson',\n\t'Blankenburg',\n\t'Goans',\n\t'Longan',\n\t'Aboud',\n\t'Michelli',\n\t'Rivere',\n\t'Colla',\n\t'Lory',\n\t'Lougheed',\n\t'Wadel',\n\t'Chalkley',\n\t'Gaubert',\n\t'Goodlin',\n\t'Bommer',\n\t'Abbs',\n\t'Rashad',\n\t'Malachi',\n\t'Abrigo',\n\t'Akre',\n\t'Antolik',\n\t'Bachner',\n\t'Blegen',\n\t'Cona',\n\t'Diantonio',\n\t'Emde',\n\t'Enrico',\n\t'Follette',\n\t'Hagarty',\n\t'Hanser',\n\t'Hulsman',\n\t'Jelinski',\n\t'Kalisz',\n\t'Kolek',\n\t'Kough',\n\t'Ninneman',\n\t'Offield',\n\t'Perezgarcia',\n\t'Plude',\n\t'Printy',\n\t'Rosengrant',\n\t'Salminen',\n\t'Schamberger',\n\t'Teall',\n\t'Zipfel',\n\t'Bickler',\n\t'Casanas',\n\t'Holtzapple',\n\t'Sachdeva',\n\t'Scharnhorst',\n\t'Schnack',\n\t'Grode',\n\t'Strough',\n\t'Teare',\n\t'Korona',\n\t'Creelman',\n\t'Simper',\n\t'Marett',\n\t'Nadeem',\n\t'Pollet',\n\t'Eduardo',\n\t'Chipley',\n\t'Vanrossum',\n\t'Fabio',\n\t'Colona',\n\t'Whirley',\n\t'Hider',\n\t'Plaskett',\n\t'Trabue',\n\t'Gibert',\n\t'Cabiness',\n\t'Loyal',\n\t'Rayson',\n\t'Aloia',\n\t'Aukerman',\n\t'Broxterman',\n\t'Cada',\n\t'Catalanotto',\n\t'Condos',\n\t'Corriher',\n\t'Eliopoulos',\n\t'Furia',\n\t'Girolamo',\n\t'Haese',\n\t'Israelson',\n\t'Jaworowski',\n\t'Jirik',\n\t'Kalmar',\n\t'Leipold',\n\t'Lemmo',\n\t'Loja',\n\t'Loughmiller',\n\t'Matelski',\n\t'Mcrorie',\n\t'Moeckel',\n\t'Naill',\n\t'Raczka',\n\t'Rathgeber',\n\t'Shamoun',\n\t'Shannahan',\n\t'Simler',\n\t'Stamer',\n\t'Stonehocker',\n\t'Twersky',\n\t'Voeltz',\n\t'Willets',\n\t'Wolgamott',\n\t'Yamin',\n\t'Acri',\n\t'Dalgleish',\n\t'Ehrenreich',\n\t'Huish',\n\t'Huxley',\n\t'Pinkstaff',\n\t'Rincones',\n\t'Saric',\n\t'Shreiner',\n\t'Stitely',\n\t'Tippets',\n\t'Vanamburg',\n\t'Zbikowski',\n\t'Sharrett',\n\t'Suther',\n\t'Renta',\n\t'Balles',\n\t'Florentine',\n\t'Chrisley',\n\t'Offner',\n\t'Matheus',\n\t'Akens',\n\t'Dugue',\n\t'Rigaud',\n\t'Mohamud',\n\t'Magloire',\n\t'Stigger',\n\t'Andrist',\n\t'Chaudoin',\n\t'Clos',\n\t'Cragin',\n\t'Dinius',\n\t'Duignan',\n\t'Elk',\n\t'Frenz',\n\t'Frogge',\n\t'Giammarino',\n\t'Hackl',\n\t'Jaeckel',\n\t'Knieriem',\n\t'Lajara',\n\t'Lisak',\n\t'Luxton',\n\t'Merriott',\n\t'Montini',\n\t'Olender',\n\t'Orebaugh',\n\t'Orren',\n\t'Osika',\n\t'Sciascia',\n\t'Selvaggio',\n\t'Stoneback',\n\t'Sweis',\n\t'Torosyan',\n\t'Trupp',\n\t'Wardrip',\n\t'Wigle',\n\t'Beissel',\n\t'Brakke',\n\t'Carosella',\n\t'Dobek',\n\t'Eidem',\n\t'Homolka',\n\t'Kemery',\n\t'Kinderman',\n\t'Palla',\n\t'Puccini',\n\t'Szarek',\n\t'Vandehei',\n\t'Arca',\n\t'Jou',\n\t'Needs',\n\t'Habermann',\n\t'Hyle',\n\t'Jagoda',\n\t'Smigielski',\n\t'Guttierrez',\n\t'Awwad',\n\t'Maccormack',\n\t'Bassin',\n\t'Achee',\n\t'Demark',\n\t'Jardon',\n\t'Kelsoe',\n\t'Olear',\n\t'Comacho',\n\t'Rosetta',\n\t'Peddie',\n\t'Delsol',\n\t'Nwachukwu',\n\t'Bagdasarian',\n\t'Boehringer',\n\t'Bunke',\n\t'Burkhammer',\n\t'Delahoya',\n\t'Dietzen',\n\t'Ditmer',\n\t'Duchaine',\n\t'Felske',\n\t'Gumpert',\n\t'Hansson',\n\t'Hedeen',\n\t'Jalil',\n\t'Kalal',\n\t'Kanan',\n\t'Kaska',\n\t'Kaufer',\n\t'Knoff',\n\t'Kornblum',\n\t'Lanzi',\n\t'Obenchain',\n\t'Piatkowski',\n\t'Prugh',\n\t'Rima',\n\t'Shadduck',\n\t'Sodergren',\n\t'Spitzley',\n\t'Tauzin',\n\t'Weigelt',\n\t'Baldassarre',\n\t'Biglin',\n\t'Fuhriman',\n\t'Gaumond',\n\t'Ledvina',\n\t'Meckler',\n\t'Minteer',\n\t'Nesser',\n\t'Riederer',\n\t'Ruelle',\n\t'Turchi',\n\t'Alberg',\n\t'Vanderlip',\n\t'Halder',\n\t'Hop',\n\t'Larmon',\n\t'Bonfield',\n\t'Ketch',\n\t'Mannis',\n\t'Mcallen',\n\t'Alfonzo',\n\t'Sampey',\n\t'Guillet',\n\t'Madaris',\n\t'Lisby',\n\t'Crowner',\n\t'Frager',\n\t'Coar',\n\t'Crewe',\n\t'Levier',\n\t'Ligons',\n\t'Abello',\n\t'Brinsfield',\n\t'Buccieri',\n\t'Cantera',\n\t'Cieslinski',\n\t'Cragle',\n\t'Flater',\n\t'Grunert',\n\t'Higinbotham',\n\t'Janish',\n\t'Kuennen',\n\t'Lanners',\n\t'Lesiak',\n\t'Litvin',\n\t'Madueno',\n\t'Maffia',\n\t'Manetta',\n\t'Marschke',\n\t'Mourer',\n\t'Nordahl',\n\t'Nordan',\n\t'Pankowski',\n\t'Petron',\n\t'Qualley',\n\t'Recht',\n\t'Rosenbach',\n\t'Ruttenberg',\n\t'Saam',\n\t'Savarino',\n\t'Solana',\n\t'Stumpff',\n\t'Tsukamoto',\n\t'Vanlanen',\n\t'Wainer',\n\t'Kasza',\n\t'Kuehler',\n\t'Landgren',\n\t'Omahony',\n\t'Paullin',\n\t'Ramales',\n\t'Schmelzle',\n\t'Schnakenberg',\n\t'Touma',\n\t'Urgiles',\n\t'Vorndran',\n\t'Corne',\n\t'Higman',\n\t'Dutil',\n\t'Reef',\n\t'Racanelli',\n\t'Gladwin',\n\t'Jaspers',\n\t'Crutchley',\n\t'Homme',\n\t'Hughbanks',\n\t'Crismon',\n\t'Burdin',\n\t'Dise',\n\t'Enzor',\n\t'Hally',\n\t'Mccone',\n\t'Mckell',\n\t'Belo',\n\t'Moat',\n\t'Ijames',\n\t'Bussie',\n\t'Papillion',\n\t'Pratcher',\n\t'Baranek',\n\t'Bidlack',\n\t'Boyadjian',\n\t'Chern',\n\t'Conahan',\n\t'Dimuzio',\n\t'Erker',\n\t'Fregeau',\n\t'Gelsinger',\n\t'Gonzalo',\n\t'Heo',\n\t'Hoog',\n\t'Jovanovich',\n\t'Kaschak',\n\t'Kasik',\n\t'Katich',\n\t'Laible',\n\t'Mastel',\n\t'Muellner',\n\t'Pingleton',\n\t'Rexroth',\n\t'Schmitter',\n\t'Stick',\n\t'Strollo',\n\t'Traficante',\n\t'Veteto',\n\t'Wampole',\n\t'Winings',\n\t'Amalfitano',\n\t'Amiot',\n\t'Camaj',\n\t'Cuartas',\n\t'Drotar',\n\t'Eatherton',\n\t'Fioretti',\n\t'Fudala',\n\t'Gehrman',\n\t'Gittleman',\n\t'Heppe',\n\t'Maffucci',\n\t'Tammen',\n\t'Chovan',\n\t'Ginley',\n\t'Stipes',\n\t'Antigua',\n\t'Ironside',\n\t'Kuroda',\n\t'Lebar',\n\t'Laske',\n\t'Salay',\n\t'Gisi',\n\t'Mccormic',\n\t'Veron',\n\t'Robbin',\n\t'Morain',\n\t'Mayden',\n\t'Vanputten',\n\t'Triplet',\n\t'Ravenel',\n\t'Moragne',\n\t'Bowdry',\n\t'Agundez',\n\t'Allinson',\n\t'Bosko',\n\t'Buehrle',\n\t'Devey',\n\t'Gasiorowski',\n\t'Goettel',\n\t'Halleran',\n\t'Innocenti',\n\t'Orser',\n\t'Scarpati',\n\t'Scherff',\n\t'Schlott',\n\t'Skilling',\n\t'Speedy',\n\t'Staal',\n\t'Szafran',\n\t'Szczech',\n\t'Szczepanik',\n\t'Venturella',\n\t'Vert',\n\t'Vogelgesang',\n\t'Vollbrecht',\n\t'Wiehe',\n\t'Achterberg',\n\t'Fadness',\n\t'Groene',\n\t'Halbrooks',\n\t'Leavenworth',\n\t'Pruski',\n\t'Redifer',\n\t'Schmiesing',\n\t'Stanforth',\n\t'Stepanski',\n\t'Ziel',\n\t'Hefter',\n\t'Urman',\n\t'Muela',\n\t'Simpler',\n\t'Elick',\n\t'Shalabi',\n\t'Cooner',\n\t'Ferriera',\n\t'Templer',\n\t'Prashad',\n\t'Gorum',\n\t'Wheller',\n\t'Spratling',\n\t'Gutter',\n\t'Eke',\n\t'Rias',\n\t'Belcourt',\n\t'Bernards',\n\t'Camburn',\n\t'Cerqueira',\n\t'Conkel',\n\t'Deist',\n\t'Derobertis',\n\t'Desio',\n\t'Eimer',\n\t'Fayad',\n\t'Frommelt',\n\t'Guariglia',\n\t'Laba',\n\t'Labine',\n\t'Lanius',\n\t'Loconte',\n\t'Nop',\n\t'Omary',\n\t'Penninger',\n\t'Pentland',\n\t'Pinkus',\n\t'Richoux',\n\t'Sturrock',\n\t'Theil',\n\t'Vanvranken',\n\t'Bartoszek',\n\t'Bruski',\n\t'Engelken',\n\t'Kranich',\n\t'Mrazek',\n\t'Muralles',\n\t'Pienta',\n\t'Salido',\n\t'Sridhar',\n\t'Turkington',\n\t'Vellucci',\n\t'Verhage',\n\t'Derenzo',\n\t'Lucker',\n\t'Wands',\n\t'Parrow',\n\t'Branyon',\n\t'Houff',\n\t'Bossier',\n\t'Reels',\n\t'Rockmore',\n\t'Altmeyer',\n\t'Anacker',\n\t'Antoniou',\n\t'Berlinger',\n\t'Busser',\n\t'Caracci',\n\t'Caseres',\n\t'Corcino',\n\t'Demint',\n\t'Dhanani',\n\t'Erekson',\n\t'Farinacci',\n\t'Ganesan',\n\t'Gornick',\n\t'Gresser',\n\t'Kremers',\n\t'Kreuter',\n\t'Lesieur',\n\t'Linarez',\n\t'Mccrystal',\n\t'Morang',\n\t'Pucillo',\n\t'Spicuzza',\n\t'Tranchina',\n\t'Tullar',\n\t'Vantilburg',\n\t'Yeck',\n\t'Zandstra',\n\t'Zeleny',\n\t'Bearss',\n\t'Burgner',\n\t'Delich',\n\t'Fetsch',\n\t'Grom',\n\t'Kreisel',\n\t'Laprise',\n\t'Legarreta',\n\t'Musacchio',\n\t'Rembold',\n\t'Sjoblom',\n\t'Skalicky',\n\t'Sokolov',\n\t'Tuminello',\n\t'Vanskiver',\n\t'Zidek',\n\t'Severa',\n\t'Stables',\n\t'Guffy',\n\t'Lebeck',\n\t'Barradas',\n\t'Chanley',\n\t'Dayal',\n\t'Villafranco',\n\t'Droke',\n\t'Popwell',\n\t'Renier',\n\t'Bolten',\n\t'Mille',\n\t'Swagerty',\n\t'Grismore',\n\t'Brantly',\n\t'Divens',\n\t'Ottey',\n\t'Hagger',\n\t'Advincula',\n\t'Boschee',\n\t'Buckbee',\n\t'Carlan',\n\t'Casciato',\n\t'Cregar',\n\t'Fehring',\n\t'Ianniello',\n\t'Interrante',\n\t'Juedes',\n\t'Kosier',\n\t'Lizaola',\n\t'Lorenzetti',\n\t'Mccauslin',\n\t'Older',\n\t'Osuch',\n\t'Ramstad',\n\t'Sare',\n\t'Stavinoha',\n\t'Taborda',\n\t'Warmoth',\n\t'Weissmann',\n\t'Winograd',\n\t'Woeste',\n\t'Zywicki',\n\t'Blalack',\n\t'Chavoya',\n\t'Clickner',\n\t'Daigrepont',\n\t'Dissinger',\n\t'Kovalik',\n\t'Lemler',\n\t'Shortall',\n\t'Tucholski',\n\t'Vanmetre',\n\t'Zetino',\n\t'Niezgoda',\n\t'Recupero',\n\t'Booms',\n\t'Ramsburg',\n\t'Berka',\n\t'Mininger',\n\t'Tamer',\n\t'Baka',\n\t'Jago',\n\t'Bucks',\n\t'Laude',\n\t'Andrepont',\n\t'Gair',\n\t'Hayer',\n\t'Kitching',\n\t'Towson',\n\t'Slappey',\n\t'Syms',\n\t'Derico',\n\t'Badie',\n\t'Kenon',\n\t'Goffney',\n\t'Amigon',\n\t'Belsito',\n\t'Bergamo',\n\t'Caputi',\n\t'Delpilar',\n\t'Entsminger',\n\t'Gehres',\n\t'Geimer',\n\t'Hada',\n\t'Krolak',\n\t'Kruer',\n\t'Malaney',\n\t'Mancias',\n\t'Misiaszek',\n\t'Pring',\n\t'Salonga',\n\t'Schaefers',\n\t'Schmied',\n\t'Schwertfeger',\n\t'Scialabba',\n\t'Stemmer',\n\t'Stifter',\n\t'Suon',\n\t'Szczygiel',\n\t'Weisse',\n\t'Yackley',\n\t'Decasas',\n\t'Donado',\n\t'Drenning',\n\t'Eppich',\n\t'Kertesz',\n\t'Mihal',\n\t'Mochizuki',\n\t'Schiebel',\n\t'Schlageter',\n\t'Scruton',\n\t'Weckerly',\n\t'Wemhoff',\n\t'Wernette',\n\t'Zietz',\n\t'Iwanicki',\n\t'Ara',\n\t'Barson',\n\t'Resor',\n\t'Rampy',\n\t'Iskander',\n\t'Oharra',\n\t'Kope',\n\t'Soli',\n\t'Bodkins',\n\t'Bussa',\n\t'Maletta',\n\t'Clemen',\n\t'Vaneaton',\n\t'Berkel',\n\t'Salvage',\n\t'Gilchrest',\n\t'Whitter',\n\t'Bruster',\n\t'Mccowin',\n\t'Gullatt',\n\t'Cherubin',\n\t'Flamer',\n\t'Gueye',\n\t'Angerer',\n\t'Baray',\n\t'Barreca',\n\t'Bresson',\n\t'Brougham',\n\t'Buscaglia',\n\t'Candee',\n\t'Decelles',\n\t'Durflinger',\n\t'Dusenbery',\n\t'Enomoto',\n\t'Galliano',\n\t'Klooster',\n\t'Lowrimore',\n\t'Manda',\n\t'Morace',\n\t'Raisanen',\n\t'Ravenscraft',\n\t'Rutman',\n\t'Schmieg',\n\t'Schorsch',\n\t'Selim',\n\t'Stanchfield',\n\t'Stankowski',\n\t'Tolosa',\n\t'Uyeno',\n\t'Vancleef',\n\t'Kamdar',\n\t'Kazlauskas',\n\t'Kwasnik',\n\t'Pivonka',\n\t'Shrode',\n\t'Sellinger',\n\t'Deliz',\n\t'Longerbeam',\n\t'Schobert',\n\t'Shader',\n\t'Collister',\n\t'Curtright',\n\t'Franc',\n\t'Wakely',\n\t'Duree',\n\t'Laban',\n\t'Gascoigne',\n\t'Noy',\n\t'Hulon',\n\t'Michele',\n\t'Crowden',\n\t'Dolton',\n\t'Ryner',\n\t'Gene',\n\t'Tetterton',\n\t'Laffitte',\n\t'Laidler',\n\t'Hoston',\n\t'Akter',\n\t'Biebel',\n\t'Bohnenkamp',\n\t'Bottger',\n\t'Brecheisen',\n\t'Bumbarger',\n\t'Burgert',\n\t'Burtnett',\n\t'Coffing',\n\t'Corigliano',\n\t'Dault',\n\t'Dettinger',\n\t'Fenech',\n\t'Golaszewski',\n\t'Hernando',\n\t'Hoppel',\n\t'Kadrmas',\n\t'Khim',\n\t'Labrado',\n\t'Leh',\n\t'Michiels',\n\t'Milkovich',\n\t'Mosel',\n\t'Nestle',\n\t'Nunan',\n\t'Palomarez',\n\t'Peretz',\n\t'Perno',\n\t'Popowski',\n\t'Pottebaum',\n\t'Rallis',\n\t'Rase',\n\t'Rotramel',\n\t'Sokolik',\n\t'Sparlin',\n\t'Zipf',\n\t'Abruzzese',\n\t'Branin',\n\t'Cheslock',\n\t'Chimenti',\n\t'Czechowski',\n\t'Diveley',\n\t'Eisenbeis',\n\t'Eisenhut',\n\t'Friedt',\n\t'Gehlhausen',\n\t'Kamphaus',\n\t'Mctiernan',\n\t'Monnett',\n\t'Schue',\n\t'Steffensmeier',\n\t'Gens',\n\t'Schlotterbeck',\n\t'Ask',\n\t'Leser',\n\t'Renville',\n\t'Wisenbaker',\n\t'Kellow',\n\t'Mounsey',\n\t'Dupin',\n\t'Causer',\n\t'Yapp',\n\t'Stmary',\n\t'Bowditch',\n\t'Nickolson',\n\t'Molla',\n\t'Larke',\n\t'Kamau',\n\t'Cardinali',\n\t'Deely',\n\t'Deep',\n\t'Dietel',\n\t'Ferraris',\n\t'Fons',\n\t'Hahm',\n\t'Huy',\n\t'Imber',\n\t'Leichliter',\n\t'Longanecker',\n\t'Lordi',\n\t'Ludewig',\n\t'Maiolo',\n\t'Mckern',\n\t'Meyering',\n\t'Muhl',\n\t'Nylen',\n\t'Ohlendorf',\n\t'Palmgren',\n\t'Raffield',\n\t'Reusser',\n\t'Revette',\n\t'Ridolfi',\n\t'Rosemeyer',\n\t'Seber',\n\t'Silberberg',\n\t'Sitzmann',\n\t'Tayman',\n\t'Tygart',\n\t'Vertz',\n\t'Volkmer',\n\t'Bellemare',\n\t'Benanti',\n\t'Bialecki',\n\t'Biber',\n\t'Dipierro',\n\t'Dornbush',\n\t'Eichhorst',\n\t'Messana',\n\t'Neisen',\n\t'Ottoson',\n\t'Salmonson',\n\t'Turcott',\n\t'Vlachos',\n\t'Wojdyla',\n\t'Dagg',\n\t'Hernan',\n\t'Mannes',\n\t'Fent',\n\t'Tappen',\n\t'Hyers',\n\t'Gery',\n\t'Deam',\n\t'Channing',\n\t'Gesner',\n\t'Swaringen',\n\t'Lakins',\n\t'Cogbill',\n\t'Allsbrook',\n\t'Kennemore',\n\t'Sumrell',\n\t'Luma',\n\t'Rookard',\n\t'Shakoor',\n\t'Philbert',\n\t'Maragh',\n\t'Wordlaw',\n\t'Ofori',\n\t'Arseneault',\n\t'Arslanian',\n\t'Aydin',\n\t'Balthaser',\n\t'Bensch',\n\t'Boord',\n\t'Botting',\n\t'Brummet',\n\t'Cassiday',\n\t'Chubbuck',\n\t'Crance',\n\t'Dobis',\n\t'Dymek',\n\t'Kakar',\n\t'Kipnis',\n\t'Kooi',\n\t'Kovack',\n\t'Malzahn',\n\t'Melendes',\n\t'Micucci',\n\t'Miklas',\n\t'Molander',\n\t'Nungesser',\n\t'Razavi',\n\t'Reppond',\n\t'Reznick',\n\t'Rosten',\n\t'Schwegler',\n\t'Sielaff',\n\t'Sincavage',\n\t'Soave',\n\t'Socorro',\n\t'Tausch',\n\t'Tracz',\n\t'Vey',\n\t'Weltman',\n\t'Wittich',\n\t'Emswiler',\n\t'Etzkorn',\n\t'Kuchenbecker',\n\t'Lampi',\n\t'Pfahler',\n\t'Thronson',\n\t'Trefz',\n\t'Pont',\n\t'Hendrie',\n\t'Russon',\n\t'Coleson',\n\t'Gregori',\n\t'Herzfeld',\n\t'Tamas',\n\t'Oslin',\n\t'Warrell',\n\t'Basher',\n\t'Elizabeth',\n\t'Nickolas',\n\t'Prigmore',\n\t'Okray',\n\t'Cannedy',\n\t'Mercy',\n\t'Daigre',\n\t'Leggins',\n\t'Savannah',\n\t'Russaw',\n\t'Opoku',\n\t'Angier',\n\t'Behrle',\n\t'Budny',\n\t'Cislo',\n\t'Covalt',\n\t'Dershem',\n\t'Devincent',\n\t'Dhar',\n\t'Dombrosky',\n\t'Dragovich',\n\t'Drobny',\n\t'Fess',\n\t'Genthner',\n\t'Gierhart',\n\t'Hadzic',\n\t'Hehir',\n\t'Henle',\n\t'Heyd',\n\t'Hudlow',\n\t'Janko',\n\t'Kapral',\n\t'Kietzman',\n\t'Malburg',\n\t'Maret',\n\t'Mcever',\n\t'Sann',\n\t'Scheidel',\n\t'Schultheiss',\n\t'Sedita',\n\t'Sigl',\n\t'Starace',\n\t'Stoklosa',\n\t'Tainter',\n\t'Tamburrino',\n\t'Vankleeck',\n\t'Vannucci',\n\t'Wernecke',\n\t'Widmayer',\n\t'Agresti',\n\t'Boshell',\n\t'Dartt',\n\t'Dobkin',\n\t'Effertz',\n\t'Gaydosh',\n\t'Hocevar',\n\t'Kluger',\n\t'Mcguffee',\n\t'Pekala',\n\t'Tuchman',\n\t'Keylon',\n\t'Pletz',\n\t'Germond',\n\t'Keedy',\n\t'Meir',\n\t'Tromp',\n\t'Solly',\n\t'Baerga',\n\t'Jawad',\n\t'Chanda',\n\t'Scobie',\n\t'Snowball',\n\t'Pricer',\n\t'Graper',\n\t'Bally',\n\t'Mcfarlan',\n\t'Duncombe',\n\t'Mccory',\n\t'Costen',\n\t'Poplar',\n\t'Denkins',\n\t'Padmore',\n\t'Waithe',\n\t'Adduci',\n\t'Aldaba',\n\t'Berhow',\n\t'Cocuzza',\n\t'Dubroc',\n\t'Earnheart',\n\t'Eickholt',\n\t'Gutzwiller',\n\t'Heavin',\n\t'Himebaugh',\n\t'Jakubik',\n\t'Kiang',\n\t'Klusman',\n\t'Knueppel',\n\t'Neddo',\n\t'Oakey',\n\t'Rachlin',\n\t'Spegal',\n\t'Spizzirri',\n\t'Stavola',\n\t'Zika',\n\t'Beverlin',\n\t'Boehle',\n\t'Caltagirone',\n\t'Chernick',\n\t'Ciaccia',\n\t'Courchaine',\n\t'Covault',\n\t'Crihfield',\n\t'Fojtik',\n\t'Gronski',\n\t'Huwe',\n\t'Ostrovsky',\n\t'Quraishi',\n\t'Rauber',\n\t'Scalici',\n\t'Schuetze',\n\t'Advani',\n\t'Galer',\n\t'Rog',\n\t'Husson',\n\t'Karpen',\n\t'Ess',\n\t'Henman',\n\t'Slatten',\n\t'Bango',\n\t'Barkin',\n\t'Vessell',\n\t'Mayson',\n\t'Kittles',\n\t'Quince',\n\t'Beardmore',\n\t'Breceda',\n\t'Carmony',\n\t'Ciliberto',\n\t'Cotroneo',\n\t'Dimitroff',\n\t'Granahan',\n\t'Haacke',\n\t'Huska',\n\t'Jankiewicz',\n\t'Klipp',\n\t'Kostic',\n\t'Langarica',\n\t'Lanphier',\n\t'Maran',\n\t'Marmion',\n\t'Mclinden',\n\t'Mcpeake',\n\t'Minkel',\n\t'Nicolo',\n\t'Quihuis',\n\t'Siemsen',\n\t'Somero',\n\t'Spuhler',\n\t'Spychalski',\n\t'Stary',\n\t'Stitzer',\n\t'Stucke',\n\t'Tango',\n\t'Ticas',\n\t'Vivero',\n\t'Campen',\n\t'Fei',\n\t'Ganas',\n\t'Klipfel',\n\t'Vodicka',\n\t'Zajdel',\n\t'Ulin',\n\t'Bodey',\n\t'Moral',\n\t'Fellenz',\n\t'Charo',\n\t'Cliver',\n\t'Clasby',\n\t'Neeson',\n\t'Durell',\n\t'Hew',\n\t'Mcgray',\n\t'Breaker',\n\t'Haslem',\n\t'Verser',\n\t'Broner',\n\t'Mannings',\n\t'Darensbourg',\n\t'Petithomme',\n\t'Akbari',\n\t'Amdahl',\n\t'Boeger',\n\t'Bougie',\n\t'Buffo',\n\t'Cisar',\n\t'Deleonardis',\n\t'Diffee',\n\t'Dillen',\n\t'Dingley',\n\t'Dugo',\n\t'Fedora',\n\t'Habibi',\n\t'Hartland',\n\t'Hennelly',\n\t'Kachmar',\n\t'Louth',\n\t'Mughal',\n\t'Muska',\n\t'Narang',\n\t'Pontillo',\n\t'Roel',\n\t'Shehorn',\n\t'Smick',\n\t'Soliven',\n\t'Starzyk',\n\t'Swaminathan',\n\t'Teagarden',\n\t'Thune',\n\t'Vokes',\n\t'Volkov',\n\t'Weckesser',\n\t'Wigen',\n\t'Donaghue',\n\t'Ederer',\n\t'Glaus',\n\t'Gwozdz',\n\t'Kimler',\n\t'Kocak',\n\t'Lagerquist',\n\t'Pellecchia',\n\t'Ruminski',\n\t'Scholler',\n\t'Steurer',\n\t'Tlatelpa',\n\t'Zegarra',\n\t'Janssens',\n\t'Jass',\n\t'Ciriaco',\n\t'Kessner',\n\t'Georg',\n\t'Harre',\n\t'Brannam',\n\t'Beel',\n\t'Kaine',\n\t'Roher',\n\t'Evora',\n\t'Rittman',\n\t'Sion',\n\t'Millon',\n\t'Morre',\n\t'Bouler',\n\t'Seegars',\n\t'Jenifer',\n\t'Bernd',\n\t'Chahine',\n\t'Crisanto',\n\t'Desautel',\n\t'Dirosa',\n\t'Fehringer',\n\t'Fukui',\n\t'Hetz',\n\t'Hueber',\n\t'Ivanova',\n\t'Klecker',\n\t'Kulzer',\n\t'Machi',\n\t'Menn',\n\t'Mudry',\n\t'Niro',\n\t'Nyenhuis',\n\t'Pressel',\n\t'Prusinski',\n\t'Roske',\n\t'Shaefer',\n\t'Stear',\n\t'Stumpo',\n\t'Teas',\n\t'Tolsma',\n\t'Troha',\n\t'Vanveen',\n\t'Waltermire',\n\t'Zaretsky',\n\t'Zingg',\n\t'Arntson',\n\t'Dizdarevic',\n\t'Kassebaum',\n\t'Natzke',\n\t'Passanisi',\n\t'Rodebaugh',\n\t'Skonieczny',\n\t'Vanhoozer',\n\t'Wiechert',\n\t'Golonka',\n\t'Roycroft',\n\t'Robl',\n\t'Lisboa',\n\t'Brandis',\n\t'Symmes',\n\t'Nou',\n\t'Pawson',\n\t'Comins',\n\t'Ranker',\n\t'Silman',\n\t'Lonas',\n\t'Goldthwaite',\n\t'Aries',\n\t'Leckey',\n\t'Conolly',\n\t'Ezelle',\n\t'Degrasse',\n\t'Tarte',\n\t'Bonaventure',\n\t'Rambeau',\n\t'Alsobrooks',\n\t'Blumenberg',\n\t'Snape',\n\t'Delane',\n\t'Sarr',\n\t'Rankine',\n\t'Mcclarty',\n\t'Skipwith',\n\t'Mapps',\n\t'Poke',\n\t'Ahlman',\n\t'Brunkow',\n\t'Crissinger',\n\t'Critcher',\n\t'Cronce',\n\t'Earney',\n\t'Fischler',\n\t'Franta',\n\t'Haist',\n\t'Hirschfield',\n\t'Jacobe',\n\t'Karraker',\n\t'Kronenberger',\n\t'Layland',\n\t'Liscano',\n\t'Lohrman',\n\t'Luy',\n\t'Macik',\n\t'Makinen',\n\t'Mis',\n\t'Musarra',\n\t'Orbe',\n\t'Ortloff',\n\t'Potempa',\n\t'Presta',\n\t'Rebollo',\n\t'Rudden',\n\t'Schab',\n\t'Settlemyre',\n\t'Shaban',\n\t'Shiraishi',\n\t'Shrake',\n\t'Suba',\n\t'Tornquist',\n\t'Treglia',\n\t'Vanschaick',\n\t'Velten',\n\t'Waln',\n\t'Addeo',\n\t'Dacquisto',\n\t'Fenno',\n\t'Gilberg',\n\t'Halberstam',\n\t'Holck',\n\t'Landgrebe',\n\t'Lipa',\n\t'Luehrs',\n\t'Mkrtchyan',\n\t'Proscia',\n\t'Schucker',\n\t'Selner',\n\t'Sinisi',\n\t'Wandersee',\n\t'Weigold',\n\t'Winterrowd',\n\t'Stoutenburg',\n\t'Medinger',\n\t'Bittman',\n\t'Gerges',\n\t'Langelier',\n\t'Berdine',\n\t'Hartshorne',\n\t'Matters',\n\t'Lavere',\n\t'Delauter',\n\t'Caillouet',\n\t'Elford',\n\t'Derrington',\n\t'Mollison',\n\t'Erskin',\n\t'Doswell',\n\t'Loadholt',\n\t'Stepter',\n\t'Contee',\n\t'Adwell',\n\t'Banez',\n\t'Birchler',\n\t'Bodman',\n\t'Bransfield',\n\t'Butzer',\n\t'Cenci',\n\t'Fabro',\n\t'Fila',\n\t'Follman',\n\t'Geoffrion',\n\t'Hardegree',\n\t'Klindt',\n\t'Kuzniar',\n\t'Lapenta',\n\t'Lasorsa',\n\t'Lykens',\n\t'Madariaga',\n\t'Mcginnity',\n\t'Mezger',\n\t'Milleson',\n\t'Nisly',\n\t'Palau',\n\t'Salz',\n\t'Sholly',\n\t'Spartz',\n\t'Spevak',\n\t'Svehla',\n\t'Trafford',\n\t'Treu',\n\t'Winski',\n\t'Zervas',\n\t'Bautch',\n\t'Dybas',\n\t'Hillenburg',\n\t'Krahl',\n\t'Loretto',\n\t'Mcanany',\n\t'Meschke',\n\t'Panuco',\n\t'Pezzullo',\n\t'Pokorski',\n\t'Reinertson',\n\t'Spoden',\n\t'Steinbrenner',\n\t'Wedig',\n\t'Mom',\n\t'Furner',\n\t'Harpin',\n\t'Carlston',\n\t'Oo',\n\t'Betten',\n\t'Duro',\n\t'Veronica',\n\t'Klutz',\n\t'Coven',\n\t'Siles',\n\t'Carby',\n\t'Duvernay',\n\t'Gory',\n\t'Adamczak',\n\t'Adee',\n\t'Agius',\n\t'Bachicha',\n\t'Belka',\n\t'Bridenstine',\n\t'Cappella',\n\t'Chiao',\n\t'Georgiadis',\n\t'Hansmann',\n\t'Kettlewell',\n\t'Klemann',\n\t'Kracke',\n\t'Legacy',\n\t'Mateja',\n\t'Mcgarrigle',\n\t'Peitz',\n\t'Pergande',\n\t'Proia',\n\t'Reicher',\n\t'Rentfrow',\n\t'Rudkin',\n\t'Sahni',\n\t'Santopietro',\n\t'Sarin',\n\t'Schear',\n\t'Seckel',\n\t'Sopp',\n\t'Sorci',\n\t'Terbush',\n\t'Uplinger',\n\t'Vantol',\n\t'Zaro',\n\t'Cuppett',\n\t'Depetro',\n\t'Hofferber',\n\t'Kreifels',\n\t'Kuznetsov',\n\t'Matassa',\n\t'Mazanec',\n\t'Naegle',\n\t'Sphar',\n\t'Villaneda',\n\t'Wachholz',\n\t'Pastrano',\n\t'Pilotte',\n\t'Shedden',\n\t'Molt',\n\t'Dalia',\n\t'Bishara',\n\t'Dumoulin',\n\t'Dehnert',\n\t'Dilmore',\n\t'Termine',\n\t'Bracher',\n\t'Laplace',\n\t'Sherin',\n\t'Morine',\n\t'Garrott',\n\t'Banford',\n\t'Drumwright',\n\t'Linnen',\n\t'Belay',\n\t'Juste',\n\t'Moment',\n\t'Adamec',\n\t'Alessandrini',\n\t'Bolda',\n\t'Buonanno',\n\t'Corrow',\n\t'Couvillon',\n\t'Dahnke',\n\t'Durrani',\n\t'Errett',\n\t'Fingerhut',\n\t'Ittner',\n\t'Kandler',\n\t'Khosla',\n\t'Mascio',\n\t'Mesch',\n\t'Napolitan',\n\t'Packman',\n\t'Parady',\n\t'Saline',\n\t'Spatafore',\n\t'Squiers',\n\t'Stailey',\n\t'Stolar',\n\t'Strommen',\n\t'Vahey',\n\t'Vanbebber',\n\t'Wimpee',\n\t'Wolinsky',\n\t'Yambao',\n\t'Ciocca',\n\t'Fornwalt',\n\t'Giannattasio',\n\t'Herbers',\n\t'Korol',\n\t'Lindenberger',\n\t'Lysne',\n\t'Piacentini',\n\t'Vogeler',\n\t'Cassetta',\n\t'Hildebran',\n\t'Masoud',\n\t'Shiller',\n\t'Fisler',\n\t'Loll',\n\t'Wattles',\n\t'Carris',\n\t'Hippe',\n\t'Torregrossa',\n\t'Thain',\n\t'Enman',\n\t'Kanno',\n\t'Jeane',\n\t'Clendenning',\n\t'Halt',\n\t'Dorin',\n\t'Carnathan',\n\t'Bisch',\n\t'Simm',\n\t'Goatley',\n\t'July',\n\t'Oke',\n\t'Basley',\n\t'Dillahunt',\n\t'Times',\n\t'Mcglown',\n\t'Cohens',\n\t'Jeanphilippe',\n\t'Benshoof',\n\t'Bensing',\n\t'Bir',\n\t'Birnie',\n\t'Burklow',\n\t'Capili',\n\t'Cordts',\n\t'Falanga',\n\t'Farooqui',\n\t'Furber',\n\t'Godino',\n\t'Gollnick',\n\t'Harmening',\n\t'Hilpert',\n\t'Hrivnak',\n\t'Iribe',\n\t'Krienke',\n\t'Kuntzman',\n\t'Laslo',\n\t'Loso',\n\t'Omohundro',\n\t'Rabadi',\n\t'Reisenauer',\n\t'Rohrich',\n\t'Salak',\n\t'Schuckman',\n\t'Semmel',\n\t'Sendelbach',\n\t'Sidler',\n\t'Stegmann',\n\t'Sudbeck',\n\t'Tara',\n\t'Walcher',\n\t'Walkenhorst',\n\t'Wellbrock',\n\t'Capaldo',\n\t'Cotnoir',\n\t'Durrence',\n\t'Fralix',\n\t'Leibfried',\n\t'Schlarb',\n\t'Whitenight',\n\t'Grannan',\n\t'Mugford',\n\t'Filo',\n\t'Soh',\n\t'Deprez',\n\t'Semidey',\n\t'Vandivier',\n\t'Shawl',\n\t'Happy',\n\t'Gartley',\n\t'Jonathan',\n\t'Bouquet',\n\t'Warsaw',\n\t'Verne',\n\t'Furse',\n\t'Holms',\n\t'Bassette',\n\t'Fishburne',\n\t'Ambrosius',\n\t'Amrein',\n\t'Astorino',\n\t'Bedonie',\n\t'Bibee',\n\t'Brearley',\n\t'Chesher',\n\t'Colasurdo',\n\t'Deike',\n\t'Dimarino',\n\t'Felling',\n\t'Freid',\n\t'Gad',\n\t'Gambale',\n\t'Gieser',\n\t'Greff',\n\t'Halseth',\n\t'Hamor',\n\t'Hargens',\n\t'Hohenberger',\n\t'Hohler',\n\t'Illes',\n\t'Koscielniak',\n\t'Kotara',\n\t'Krygier',\n\t'Lopinto',\n\t'Mangas',\n\t'Mantione',\n\t'Mcendree',\n\t'Musich',\n\t'Nordling',\n\t'Panagopoulos',\n\t'Pollio',\n\t'Score',\n\t'Semaan',\n\t'Tortorelli',\n\t'Trabert',\n\t'Troung',\n\t'Vittorio',\n\t'Barkdoll',\n\t'Dombeck',\n\t'Ferriter',\n\t'Gancarz',\n\t'Gubbels',\n\t'Kertz',\n\t'Langenderfer',\n\t'Roppolo',\n\t'Siglin',\n\t'Trnka',\n\t'Vanderkooi',\n\t'Yaun',\n\t'Witkin',\n\t'Caryl',\n\t'Boies',\n\t'Carattini',\n\t'Hannes',\n\t'Harmison',\n\t'Mctavish',\n\t'Bille',\n\t'Sullivant',\n\t'Yeakey',\n\t'Respess',\n\t'Gooley',\n\t'Maura',\n\t'Jukes',\n\t'Oguin',\n\t'Demory',\n\t'Morson',\n\t'Hathorne',\n\t'Anklam',\n\t'Antaya',\n\t'Bentler',\n\t'Bettcher',\n\t'Bresette',\n\t'Broadrick',\n\t'Degante',\n\t'Demaray',\n\t'Dipinto',\n\t'Doberstein',\n\t'Dorminey',\n\t'Dorwart',\n\t'Gugliuzza',\n\t'Jesser',\n\t'Kjar',\n\t'Kujala',\n\t'Lemarr',\n\t'Lynds',\n\t'Novitsky',\n\t'Oropesa',\n\t'Scarpulla',\n\t'Schave',\n\t'Siravo',\n\t'Torma',\n\t'Uva',\n\t'Winkowski',\n\t'Boscia',\n\t'Buikema',\n\t'Byland',\n\t'Enneking',\n\t'Enstrom',\n\t'Gotsch',\n\t'Kulakowski',\n\t'Mattheis',\n\t'Niemuth',\n\t'Oberdorf',\n\t'Rabuck',\n\t'Shinners',\n\t'Struebing',\n\t'Dickes',\n\t'Hettrick',\n\t'Pille',\n\t'Vilar',\n\t'Blewitt',\n\t'Gutt',\n\t'Haseley',\n\t'Pennel',\n\t'Figuereo',\n\t'Lassalle',\n\t'Tannahill',\n\t'Teats',\n\t'Mumby',\n\t'Cheves',\n\t'Spark',\n\t'Ale',\n\t'Wally',\n\t'Lowndes',\n\t'Ballo',\n\t'Couper',\n\t'Alberta',\n\t'Puller',\n\t'Rochell',\n\t'Bachar',\n\t'Ballengee',\n\t'Bellizzi',\n\t'Boback',\n\t'Cammarano',\n\t'Dirr',\n\t'Findling',\n\t'Fruin',\n\t'Ghattas',\n\t'Kaliszewski',\n\t'Kammeyer',\n\t'Kwiecien',\n\t'Lamora',\n\t'Lehrke',\n\t'Macewen',\n\t'Nasta',\n\t'Neibert',\n\t'Ogaz',\n\t'Olesky',\n\t'Otano',\n\t'Prescher',\n\t'Romick',\n\t'Scibetta',\n\t'Slicker',\n\t'Ungerer',\n\t'Vanheel',\n\t'Wadas',\n\t'Weissert',\n\t'Armiger',\n\t'Brusca',\n\t'Christeson',\n\t'Crookshanks',\n\t'Demarinis',\n\t'Fahrney',\n\t'Heiple',\n\t'Howat',\n\t'Knoedler',\n\t'Kuske',\n\t'Leifheit',\n\t'Lukach',\n\t'Nauert',\n\t'Obremski',\n\t'Seidenberg',\n\t'Smigelski',\n\t'Visscher',\n\t'Wauneka',\n\t'Whitmoyer',\n\t'Wyand',\n\t'Ilardi',\n\t'Jackel',\n\t'Rackham',\n\t'Macgowan',\n\t'Braid',\n\t'Bringle',\n\t'Dirk',\n\t'Paci',\n\t'Wears',\n\t'Vanbergen',\n\t'Sidle',\n\t'Mellish',\n\t'Paino',\n\t'State',\n\t'Cargle',\n\t'Harcum',\n\t'Beyene',\n\t'Mwangi',\n\t'Anderle',\n\t'Cancienne',\n\t'Compeau',\n\t'Egle',\n\t'Farone',\n\t'Harke',\n\t'Hollopeter',\n\t'Jambor',\n\t'Jermyn',\n\t'Kadakia',\n\t'Kerker',\n\t'Langowski',\n\t'Lechman',\n\t'Nagengast',\n\t'Narvaiz',\n\t'Paola',\n\t'Partch',\n\t'Plucker',\n\t'Rawe',\n\t'Rohland',\n\t'Rosebrook',\n\t'Stanphill',\n\t'Stoltman',\n\t'Volkers',\n\t'Balingit',\n\t'Bausman',\n\t'Besler',\n\t'Dalto',\n\t'Edgren',\n\t'Hairfield',\n\t'Janek',\n\t'Kenoyer',\n\t'Koska',\n\t'Mihok',\n\t'Monjaraz',\n\t'Reisz',\n\t'Snedegar',\n\t'Vandezande',\n\t'Viscomi',\n\t'Kiene',\n\t'Dib',\n\t'Kuc',\n\t'Magley',\n\t'Swearingin',\n\t'Culliton',\n\t'Roome',\n\t'Fendrick',\n\t'Trindade',\n\t'Whaling',\n\t'Tarbutton',\n\t'Sider',\n\t'Swingler',\n\t'Lover',\n\t'Clarida',\n\t'Jocelyn',\n\t'Mervin',\n\t'Blaize',\n\t'Semper',\n\t'Bagsby',\n\t'Pree',\n\t'Dieujuste',\n\t'Anacleto',\n\t'Annable',\n\t'Bacci',\n\t'Bottari',\n\t'Cinco',\n\t'Delzell',\n\t'Dowless',\n\t'Drilling',\n\t'Egert',\n\t'Fanton',\n\t'Geerts',\n\t'Ghaffari',\n\t'Guggenheim',\n\t'Hankes',\n\t'Hediger',\n\t'Hornig',\n\t'Kauer',\n\t'Kossman',\n\t'Krasnow',\n\t'Lauman',\n\t'Lebsack',\n\t'Liendo',\n\t'Marhefka',\n\t'Noguez',\n\t'Oxman',\n\t'Pa',\n\t'Pella',\n\t'Pongratz',\n\t'Prisk',\n\t'Rajagopalan',\n\t'Rozo',\n\t'Vanvorst',\n\t'Wachob',\n\t'Avolio',\n\t'Banet',\n\t'Boissonneault',\n\t'Coglianese',\n\t'Crudele',\n\t'Dobratz',\n\t'Gerdts',\n\t'Koors',\n\t'Mazzanti',\n\t'Ozimek',\n\t'Vanhove',\n\t'Zern',\n\t'Kalama',\n\t'Mikelson',\n\t'Renehan',\n\t'Blecher',\n\t'Meath',\n\t'Bonus',\n\t'Wesch',\n\t'Kirkey',\n\t'Goldbeck',\n\t'Hun',\n\t'Morgans',\n\t'Strohman',\n\t'Lanagan',\n\t'Wyly',\n\t'Syers',\n\t'Berne',\n\t'Tondreau',\n\t'Witts',\n\t'Budhu',\n\t'Flott',\n\t'Alsbrooks',\n\t'Mabin',\n\t'Kingsberry',\n\t'Berend',\n\t'Brandeberry',\n\t'Carandang',\n\t'Ciavarella',\n\t'Foil',\n\t'Galano',\n\t'Garzia',\n\t'Golembeski',\n\t'Kossow',\n\t'Kren',\n\t'Lefave',\n\t'Macmahon',\n\t'Nilan',\n\t'Peregrina',\n\t'Pralle',\n\t'Sahakian',\n\t'Sarate',\n\t'Scalzi',\n\t'Soulliere',\n\t'Srock',\n\t'Stammen',\n\t'Sterry',\n\t'Tadych',\n\t'Trembath',\n\t'Watwood',\n\t'Wolske',\n\t'Woolson',\n\t'Aversano',\n\t'Chavana',\n\t'Digiuseppe',\n\t'Escano',\n\t'Harkrider',\n\t'Liebmann',\n\t'Soldan',\n\t'Swiatkowski',\n\t'Tomala',\n\t'Keay',\n\t'Lindstedt',\n\t'Maille',\n\t'Thurner',\n\t'Favia',\n\t'Guedes',\n\t'Simao',\n\t'Rambow',\n\t'Chriscoe',\n\t'Hiss',\n\t'Mcraney',\n\t'Barke',\n\t'Hobday',\n\t'Buri',\n\t'Sigle',\n\t'Bawa',\n\t'Lalande',\n\t'Bordon',\n\t'Friley',\n\t'Feild',\n\t'Arington',\n\t'Jons',\n\t'Funderburke',\n\t'Mccommons',\n\t'Troublefield',\n\t'Mable',\n\t'Hullum',\n\t'Wrice',\n\t'Cager',\n\t'Barse',\n\t'Braunschweig',\n\t'Dasch',\n\t'Fraioli',\n\t'Giefer',\n\t'Giovanniello',\n\t'Glahn',\n\t'Hatheway',\n\t'Holtrop',\n\t'Katsaros',\n\t'Koetting',\n\t'Malinoski',\n\t'Markov',\n\t'Mcclosky',\n\t'Mccormac',\n\t'Mertins',\n\t'Milito',\n\t'Mroczka',\n\t'Overdorf',\n\t'Palombi',\n\t'Peninger',\n\t'Provenza',\n\t'Quinnell',\n\t'Roady',\n\t'Ruthven',\n\t'Savitsky',\n\t'Shenefield',\n\t'Stapel',\n\t'Venkataraman',\n\t'Zachow',\n\t'Aaberg',\n\t'Bajorek',\n\t'Bankowski',\n\t'Barquero',\n\t'Delcamp',\n\t'Deshler',\n\t'Halili',\n\t'Hebenstreit',\n\t'Hirota',\n\t'Hladky',\n\t'Kliethermes',\n\t'Koestner',\n\t'Kroes',\n\t'Luepke',\n\t'Mckeough',\n\t'Mielcarek',\n\t'Nobis',\n\t'Olenik',\n\t'Plessinger',\n\t'Shillingburg',\n\t'Spadaccini',\n\t'Springborn',\n\t'Werden',\n\t'Willenbring',\n\t'Zyskowski',\n\t'Paucar',\n\t'Werst',\n\t'Wohlwend',\n\t'Nauss',\n\t'Alma',\n\t'Tebeau',\n\t'Paskett',\n\t'Spindle',\n\t'Twiddy',\n\t'Alomar',\n\t'Mi',\n\t'Billard',\n\t'Bails',\n\t'Channer',\n\t'Fripp',\n\t'Abreo',\n\t'Adamowicz',\n\t'Bocian',\n\t'Breden',\n\t'Breitkreutz',\n\t'Celona',\n\t'Chizek',\n\t'Chrestman',\n\t'Ciaramella',\n\t'Compher',\n\t'Crannell',\n\t'Dermer',\n\t'Duryee',\n\t'Feuerborn',\n\t'Garrels',\n\t'Gausman',\n\t'Grippi',\n\t'Guadamuz',\n\t'Hatlestad',\n\t'Heon',\n\t'Hokenson',\n\t'Kaden',\n\t'Kluever',\n\t'Lagares',\n\t'Mamone',\n\t'Mascola',\n\t'Matich',\n\t'Messimer',\n\t'Mezera',\n\t'Mongiello',\n\t'Moradi',\n\t'Nessler',\n\t'Nijjar',\n\t'Nin',\n\t'Pasquarelli',\n\t'Pawlowicz',\n\t'Petitto',\n\t'Petruccelli',\n\t'Pullano',\n\t'Rebar',\n\t'Romack',\n\t'Rosener',\n\t'Soland',\n\t'Solow',\n\t'Vandervelden',\n\t'Vazguez',\n\t'Vonruden',\n\t'Balmes',\n\t'Berninger',\n\t'Broecker',\n\t'Clogston',\n\t'Fontanella',\n\t'Gubbins',\n\t'Kampen',\n\t'Levenhagen',\n\t'Lyter',\n\t'Nagamine',\n\t'Regas',\n\t'Riecke',\n\t'Veltre',\n\t'Wojahn',\n\t'Angelino',\n\t'Mccomber',\n\t'Grisso',\n\t'Saran',\n\t'Pecore',\n\t'Sorter',\n\t'Encalada',\n\t'Robart',\n\t'Deerman',\n\t'Lori',\n\t'Mcnee',\n\t'Dagher',\n\t'Villars',\n\t'Chaplain',\n\t'Houtman',\n\t'Dingwall',\n\t'Akerson',\n\t'Donaway',\n\t'Dimmer',\n\t'Mittman',\n\t'Camm',\n\t'Kenedy',\n\t'Bilbro',\n\t'Brocks',\n\t'Mansaray',\n\t'Acebo',\n\t'Ahr',\n\t'Alayon',\n\t'Benyo',\n\t'Blatnik',\n\t'Degidio',\n\t'Dumire',\n\t'Elefante',\n\t'Gase',\n\t'Gilboy',\n\t'Gradillas',\n\t'Haverstock',\n\t'Heberle',\n\t'Hilmes',\n\t'Hjort',\n\t'Johnsey',\n\t'Lambiase',\n\t'Marland',\n\t'Mcevilly',\n\t'Mergenthaler',\n\t'Mini',\n\t'Noska',\n\t'Patrie',\n\t'Rohrback',\n\t'Seelbach',\n\t'Stopher',\n\t'Trzaska',\n\t'Vanessen',\n\t'Veillette',\n\t'Walizer',\n\t'Zapalac',\n\t'Andalon',\n\t'Beukema',\n\t'Cieslik',\n\t'Dukart',\n\t'Gerads',\n\t'Gilhooly',\n\t'Hinebaugh',\n\t'Jumonville',\n\t'Macchi',\n\t'Oldenkamp',\n\t'Plotz',\n\t'Robideau',\n\t'Streed',\n\t'Trochez',\n\t'Grames',\n\t'Beltram',\n\t'Fishbaugh',\n\t'Lais',\n\t'Ossa',\n\t'Wilden',\n\t'Erick',\n\t'Dosier',\n\t'Trust',\n\t'Swaine',\n\t'Darity',\n\t'Mccroy',\n\t'Yuille',\n\t'Cantave',\n\t'Barsanti',\n\t'Carbonara',\n\t'Cavanah',\n\t'Chrismer',\n\t'Cuestas',\n\t'Czaplewski',\n\t'Denes',\n\t'Dorio',\n\t'Geraldo',\n\t'Giebler',\n\t'Goewey',\n\t'Gorniak',\n\t'Grabe',\n\t'Guidera',\n\t'Hannig',\n\t'Herin',\n\t'Kadow',\n\t'Klauer',\n\t'Kleppinger',\n\t'Lerro',\n\t'Manoogian',\n\t'Mentzel',\n\t'Muramoto',\n\t'Ollinger',\n\t'Pacey',\n\t'Pufahl',\n\t'Quero',\n\t'Revuelta',\n\t'Rickles',\n\t'Rudie',\n\t'Ruggerio',\n\t'Salberg',\n\t'Schwoerer',\n\t'Stephani',\n\t'Stevick',\n\t'Strada',\n\t'Thorley',\n\t'Thrun',\n\t'Virts',\n\t'Wingett',\n\t'Balfe',\n\t'Branaman',\n\t'Brookshier',\n\t'Carlsson',\n\t'Chismar',\n\t'Habben',\n\t'Migdal',\n\t'Ozga',\n\t'Rivest',\n\t'Russman',\n\t'Schellhorn',\n\t'Staup',\n\t'Pietri',\n\t'Welby',\n\t'Cisney',\n\t'Hijazi',\n\t'Brines',\n\t'Calderin',\n\t'Mudrick',\n\t'Domine',\n\t'Parlow',\n\t'Ervine',\n\t'Banis',\n\t'Mathenia',\n\t'Carbin',\n\t'Rashed',\n\t'Mcgilvery',\n\t'Prichett',\n\t'Feimster',\n\t'Smoots',\n\t'Persley',\n\t'Desire',\n\t'Abadi',\n\t'Bercaw',\n\t'Bertz',\n\t'Bibian',\n\t'Brosious',\n\t'Brunken',\n\t'Calvano',\n\t'Chenette',\n\t'Chiusano',\n\t'Dendinger',\n\t'Diffley',\n\t'Eichenberg',\n\t'Gawne',\n\t'Gelardi',\n\t'Gottman',\n\t'Gulyas',\n\t'Hak',\n\t'Haydock',\n\t'Hettler',\n\t'Hinsch',\n\t'Kozlik',\n\t'Krebbs',\n\t'Krichbaum',\n\t'Loges',\n\t'Lyssy',\n\t'Mitnick',\n\t'Podolski',\n\t'Priego',\n\t'Radhakrishnan',\n\t'Reineck',\n\t'Ruggirello',\n\t'Samborski',\n\t'Schwalb',\n\t'Sitek',\n\t'Sprinkel',\n\t'Tkachuk',\n\t'Viscuso',\n\t'Working',\n\t'Zinner',\n\t'Anspaugh',\n\t'Anthes',\n\t'Bratsch',\n\t'Breining',\n\t'Cejka',\n\t'Delbuono',\n\t'Hugill',\n\t'Huyett',\n\t'Irlbeck',\n\t'Kilgus',\n\t'Langwell',\n\t'Margulis',\n\t'Meara',\n\t'Napierala',\n\t'Stanaway',\n\t'Worton',\n\t'Gaucher',\n\t'Bakeman',\n\t'Pasos',\n\t'Feazel',\n\t'Evitt',\n\t'Marrin',\n\t'Baskette',\n\t'Orne',\n\t'Ivens',\n\t'Burnstein',\n\t'Rodell',\n\t'Bowell',\n\t'Maraj',\n\t'Lango',\n\t'Boudoin',\n\t'Wider',\n\t'Walkins',\n\t'Raheem',\n\t'Talford',\n\t'Jeanmarie',\n\t'Drumgoole',\n\t'Arnot',\n\t'Bennick',\n\t'Buchinger',\n\t'Cleven',\n\t'Corsello',\n\t'Delucchi',\n\t'Dicocco',\n\t'Eachus',\n\t'Eilts',\n\t'Fandino',\n\t'Fyke',\n\t'Giammarco',\n\t'Gwartney',\n\t'Hawken',\n\t'Henkelman',\n\t'Jaggi',\n\t'Jurczyk',\n\t'Kamman',\n\t'Kattner',\n\t'Keator',\n\t'Klus',\n\t'Leidner',\n\t'Ligas',\n\t'Martus',\n\t'Maslow',\n\t'Piccinini',\n\t'Pysher',\n\t'Riga',\n\t'Siek',\n\t'Sizelove',\n\t'Vanostrand',\n\t'Vastine',\n\t'Viviani',\n\t'Youngerman',\n\t'Zahniser',\n\t'Brigante',\n\t'Burklund',\n\t'Cajina',\n\t'Coppolino',\n\t'Goytia',\n\t'Icenhower',\n\t'Ihnen',\n\t'Jablonsky',\n\t'Koepsell',\n\t'Mennenga',\n\t'Redenius',\n\t'Tengan',\n\t'Weishaupt',\n\t'Dorst',\n\t'Kief',\n\t'Busk',\n\t'Luba',\n\t'Quine',\n\t'Deshotels',\n\t'Roulston',\n\t'Diniz',\n\t'Chandley',\n\t'Saleeby',\n\t'Maro',\n\t'Faidley',\n\t'Burrous',\n\t'Ilyas',\n\t'Roster',\n\t'Clovis',\n\t'Bacot',\n\t'Pembleton',\n\t'Bellot',\n\t'Entzminger',\n\t'Ryce',\n\t'Posley',\n\t'Alvi',\n\t'Audino',\n\t'Bitters',\n\t'Boomershine',\n\t'Boyack',\n\t'Branda',\n\t'Bresnan',\n\t'Brusco',\n\t'Bunda',\n\t'Catanzarite',\n\t'Dohmen',\n\t'Elbaum',\n\t'Farago',\n\t'Ferrentino',\n\t'Gimpel',\n\t'Grzeskowiak',\n\t'Gutting',\n\t'Henandez',\n\t'Herbeck',\n\t'Hoben',\n\t'Hunnell',\n\t'Ibbotson',\n\t'Kida',\n\t'Kirchman',\n\t'Kubin',\n\t'Laplume',\n\t'Laskin',\n\t'Lefferts',\n\t'Leimer',\n\t'Locatelli',\n\t'Pitsenbarger',\n\t'Reum',\n\t'Rittgers',\n\t'Scadden',\n\t'Shammas',\n\t'Tatge',\n\t'Tiongson',\n\t'Wengler',\n\t'Wenrick',\n\t'Wortley',\n\t'Bretado',\n\t'Detloff',\n\t'Dlugosz',\n\t'Eisemann',\n\t'Embler',\n\t'Graffius',\n\t'Kienast',\n\t'Kucher',\n\t'Larew',\n\t'Lemmerman',\n\t'Maners',\n\t'Peckinpaugh',\n\t'Rupnow',\n\t'Schubring',\n\t'Staheli',\n\t'Stege',\n\t'Talwar',\n\t'Truszkowski',\n\t'Coda',\n\t'Comunale',\n\t'Holtry',\n\t'Newfield',\n\t'Blankley',\n\t'Devino',\n\t'Wahba',\n\t'Cathell',\n\t'Timson',\n\t'Setzler',\n\t'Shacklett',\n\t'Nicols',\n\t'Rocque',\n\t'Nest',\n\t'Freelove',\n\t'Neat',\n\t'Kina',\n\t'Caslin',\n\t'Creal',\n\t'Wyre',\n\t'Compere',\n\t'Brisker',\n\t'Givhan',\n\t'Menifee',\n\t'Hymon',\n\t'Boakye',\n\t'Aguillar',\n\t'Alpern',\n\t'Antico',\n\t'Attridge',\n\t'Bjorge',\n\t'Bordwell',\n\t'Brumbach',\n\t'Castronova',\n\t'Cowher',\n\t'Fakhouri',\n\t'Hanigan',\n\t'Heidecker',\n\t'Hosick',\n\t'Lorang',\n\t'Magadan',\n\t'Marovich',\n\t'Masur',\n\t'Nienow',\n\t'Passow',\n\t'Priola',\n\t'Prose',\n\t'Radillo',\n\t'Saracco',\n\t'Schlender',\n\t'Sellards',\n\t'Stirn',\n\t'Strathman',\n\t'Supan',\n\t'Taguchi',\n\t'Tufte',\n\t'Vanderleest',\n\t'Vanderpoel',\n\t'Vondra',\n\t'Wayment',\n\t'Wisinski',\n\t'Brodowski',\n\t'Cichowski',\n\t'Delarocha',\n\t'Demyan',\n\t'Dobies',\n\t'Hegner',\n\t'Karapetian',\n\t'Konieczka',\n\t'Lazarz',\n\t'Loughner',\n\t'Portanova',\n\t'Rosentreter',\n\t'Rothlisberger',\n\t'Schropp',\n\t'Trenkamp',\n\t'Flaharty',\n\t'Murfin',\n\t'Waner',\n\t'Baiz',\n\t'Dunegan',\n\t'Gillson',\n\t'Erne',\n\t'Mahin',\n\t'Hardgrave',\n\t'Felps',\n\t'Bevens',\n\t'Abdou',\n\t'Songy',\n\t'Boule',\n\t'Wisham',\n\t'Devonshire',\n\t'Havis',\n\t'Relf',\n\t'Pean',\n\t'Manago',\n\t'Brazzle',\n\t'Mckelvin',\n\t'Goulbourne',\n\t'Pinkins',\n\t'Yelder',\n\t'Akina',\n\t'Allerton',\n\t'Aminov',\n\t'Barsamian',\n\t'Biondolillo',\n\t'Bouchillon',\n\t'Bustle',\n\t'Dolney',\n\t'Dunkerley',\n\t'Farha',\n\t'Floor',\n\t'Gaustad',\n\t'Gilberti',\n\t'Helder',\n\t'Kolber',\n\t'Kuznia',\n\t'Longhi',\n\t'Mamaril',\n\t'Milhorn',\n\t'Mozo',\n\t'Norbury',\n\t'Okano',\n\t'Perkovich',\n\t'Rafanan',\n\t'Rulo',\n\t'Ruperto',\n\t'Scow',\n\t'Shadoan',\n\t'Smisek',\n\t'Steinfeldt',\n\t'Thobe',\n\t'Venturino',\n\t'Widell',\n\t'Broccoli',\n\t'Helmig',\n\t'Koegler',\n\t'Lewandoski',\n\t'Pequignot',\n\t'Radermacher',\n\t'Resetar',\n\t'Rostro',\n\t'Sebald',\n\t'Walgren',\n\t'Lottes',\n\t'Capraro',\n\t'Grine',\n\t'Gordner',\n\t'Crus',\n\t'Easom',\n\t'Bayle',\n\t'Barts',\n\t'Duguid',\n\t'Estel',\n\t'Peggs',\n\t'Cheaney',\n\t'Rossin',\n\t'Mackel',\n\t'Vassel',\n\t'Fils',\n\t'Senat',\n\t'Alarie',\n\t'Allar',\n\t'Brownlie',\n\t'Bumbaugh',\n\t'Caissie',\n\t'Cordone',\n\t'Critser',\n\t'Delconte',\n\t'Falzon',\n\t'Formosa',\n\t'Frerking',\n\t'Gadea',\n\t'Ganem',\n\t'Guzek',\n\t'Hauch',\n\t'Heese',\n\t'Hemmen',\n\t'Holzschuh',\n\t'Impson',\n\t'Jablon',\n\t'Kiedrowski',\n\t'Krob',\n\t'Kuhnle',\n\t'Laake',\n\t'Larouche',\n\t'Leaton',\n\t'Leyland',\n\t'Lorenson',\n\t'Macduff',\n\t'Maready',\n\t'Newberger',\n\t'Ohnstad',\n\t'Pinela',\n\t'Polino',\n\t'Postema',\n\t'Pyon',\n\t'Radziewicz',\n\t'Rathod',\n\t'Salopek',\n\t'Salvadore',\n\t'Sawchuk',\n\t'Trotto',\n\t'Vereb',\n\t'Auslander',\n\t'Beninati',\n\t'Blunck',\n\t'Decandia',\n\t'Deeney',\n\t'Escatel',\n\t'Foskett',\n\t'Hagmann',\n\t'Hussar',\n\t'Jakubek',\n\t'Kluender',\n\t'Mcelhinny',\n\t'Salatino',\n\t'Sangalang',\n\t'Schoenfeldt',\n\t'Stogdill',\n\t'Svitak',\n\t'Taravella',\n\t'Tezak',\n\t'Wieseler',\n\t'Komperda',\n\t'Reinitz',\n\t'Malis',\n\t'Duce',\n\t'Salib',\n\t'Keelin',\n\t'Labell',\n\t'Symmonds',\n\t'Gwynne',\n\t'Byus',\n\t'Burgy',\n\t'Delfosse',\n\t'Benskin',\n\t'Hedgepath',\n\t'Ursin',\n\t'Kinnebrew',\n\t'Tinnon',\n\t'Callum',\n\t'Allah',\n\t'Arduini',\n\t'Azucena',\n\t'Birkel',\n\t'Bowermaster',\n\t'Caires',\n\t'Chrobak',\n\t'Cottier',\n\t'Cropley',\n\t'Crotteau',\n\t'Dutan',\n\t'Ezernack',\n\t'Fabiani',\n\t'Fauser',\n\t'Feeny',\n\t'Ferdig',\n\t'Fliss',\n\t'Gallus',\n\t'Harlacher',\n\t'Hasselbach',\n\t'Honsinger',\n\t'Landberg',\n\t'Lohn',\n\t'Losinski',\n\t'Maung',\n\t'Melikian',\n\t'Nooney',\n\t'Oyervides',\n\t'Prum',\n\t'Riepe',\n\t'Seebach',\n\t'Sendejas',\n\t'Sprick',\n\t'Torino',\n\t'Weida',\n\t'Geschke',\n\t'Girgenti',\n\t'Klever',\n\t'Rathert',\n\t'Roszell',\n\t'Sarich',\n\t'Shimmin',\n\t'Trimpe',\n\t'Turrubiates',\n\t'Zelada',\n\t'Danzig',\n\t'Diamant',\n\t'Hannen',\n\t'Odland',\n\t'Puzzo',\n\t'Slyter',\n\t'Smaldone',\n\t'Ebey',\n\t'Beg',\n\t'Magel',\n\t'Tebbs',\n\t'Gali',\n\t'Winney',\n\t'Juba',\n\t'Stargel',\n\t'Waren',\n\t'Stann',\n\t'Ducasse',\n\t'Vaugh',\n\t'Lewers',\n\t'Stjuste',\n\t'Heckstall',\n\t'Bokhari',\n\t'Bonino',\n\t'Brummond',\n\t'Caterino',\n\t'Deatrick',\n\t'Decorte',\n\t'Demara',\n\t'Dubree',\n\t'Dulski',\n\t'Feck',\n\t'Foglio',\n\t'Heinzelman',\n\t'Jory',\n\t'Knoell',\n\t'Kronick',\n\t'Maclay',\n\t'Mastrogiovanni',\n\t'Reichling',\n\t'Rueff',\n\t'Sellitto',\n\t'Sensing',\n\t'Sheu',\n\t'Soberanes',\n\t'Stahlecker',\n\t'Wholey',\n\t'Yochim',\n\t'Zeiss',\n\t'Bojanowski',\n\t'Bonawitz',\n\t'Caporaso',\n\t'Dalesio',\n\t'Exposito',\n\t'Giovinazzo',\n\t'Palardy',\n\t'Rastogi',\n\t'Saenger',\n\t'Sirek',\n\t'Sonoda',\n\t'Sovereign',\n\t'Weimann',\n\t'Wirtanen',\n\t'Enerson',\n\t'Olliff',\n\t'Kallam',\n\t'Leggitt',\n\t'Goude',\n\t'Rampey',\n\t'Letsinger',\n\t'Walles',\n\t'Kater',\n\t'Betsill',\n\t'Creese',\n\t'Lisbon',\n\t'Abitz',\n\t'Bednarik',\n\t'Bendorf',\n\t'Berkovich',\n\t'Brevik',\n\t'Cassatt',\n\t'Ciarlo',\n\t'Cookman',\n\t'Cosma',\n\t'Defee',\n\t'Essner',\n\t'Fallas',\n\t'Holda',\n\t'Kemler',\n\t'Kovich',\n\t'Krimmel',\n\t'Landauer',\n\t'Meharg',\n\t'Moncus',\n\t'Nabi',\n\t'Redenbaugh',\n\t'Ruwe',\n\t'Scalisi',\n\t'Shughart',\n\t'Sloma',\n\t'Sovine',\n\t'Tomaso',\n\t'Trueba',\n\t'Urista',\n\t'Vanyo',\n\t'Wolanski',\n\t'Zettle',\n\t'Arvanitis',\n\t'Baeten',\n\t'Caponi',\n\t'Carrazco',\n\t'Galambos',\n\t'Hartsook',\n\t'Helseth',\n\t'Kobylarz',\n\t'Krugh',\n\t'Meckel',\n\t'Ohnemus',\n\t'Voytek',\n\t'Winegarden',\n\t'Zuba',\n\t'Piloto',\n\t'Shames',\n\t'Debella',\n\t'Keddy',\n\t'Perra',\n\t'Winks',\n\t'Hemrick',\n\t'Snowdon',\n\t'Cleere',\n\t'Leavey',\n\t'Courington',\n\t'Herson',\n\t'Nelon',\n\t'Bloise',\n\t'Mcphie',\n\t'Catledge',\n\t'Mcneary',\n\t'Hoffler',\n\t'Suell',\n\t'Coard',\n\t'Woolfork',\n\t'Biros',\n\t'Brouhard',\n\t'Dinovo',\n\t'Disano',\n\t'Emami',\n\t'Flegal',\n\t'Hardebeck',\n\t'Hobin',\n\t'Huttner',\n\t'Kloosterman',\n\t'Knutzen',\n\t'Kopinski',\n\t'Mailman',\n\t'Mankey',\n\t'Mccamish',\n\t'Mccorquodale',\n\t'Minichiello',\n\t'Miyasaki',\n\t'Osher',\n\t'Prutzman',\n\t'Sagen',\n\t'Shawgo',\n\t'Sokolow',\n\t'Southam',\n\t'Sulik',\n\t'Wiedel',\n\t'Wollschlager',\n\t'Cantalupo',\n\t'Cruser',\n\t'Denomme',\n\t'Dinardi',\n\t'Donahey',\n\t'Havlin',\n\t'Lasecki',\n\t'Margraf',\n\t'Mchaffie',\n\t'Mihaly',\n\t'Omlor',\n\t'Roope',\n\t'Schremp',\n\t'Vanhecke',\n\t'Washabaugh',\n\t'Zaunbrecher',\n\t'Joost',\n\t'Pensinger',\n\t'Kraner',\n\t'Mikles',\n\t'Delair',\n\t'Bukhari',\n\t'Earll',\n\t'Sans',\n\t'Gatliff',\n\t'Casteneda',\n\t'Shalom',\n\t'Fidalgo',\n\t'Leitao',\n\t'Degrange',\n\t'Fruits',\n\t'Kercheval',\n\t'Mew',\n\t'Chopin',\n\t'Seawood',\n\t'Agro',\n\t'Aliano',\n\t'Badour',\n\t'Betsch',\n\t'Buchbinder',\n\t'Cleavenger',\n\t'Collazos',\n\t'Cusmano',\n\t'Dienes',\n\t'Dittus',\n\t'Eggenberger',\n\t'Fierst',\n\t'Gingell',\n\t'Greever',\n\t'Grisales',\n\t'Hegstrom',\n\t'Justen',\n\t'Kalt',\n\t'Kirkhart',\n\t'Krage',\n\t'Kyzar',\n\t'Livolsi',\n\t'Neyhart',\n\t'Nunziata',\n\t'Orlich',\n\t'Parcel',\n\t'Peshlakai',\n\t'Schemm',\n\t'Segner',\n\t'Urieta',\n\t'Wolfman',\n\t'Coonradt',\n\t'Disilvestro',\n\t'Dobrowski',\n\t'Gramza',\n\t'Kotlyar',\n\t'Micka',\n\t'Miksch',\n\t'Mione',\n\t'Montone',\n\t'Palmerton',\n\t'Parrill',\n\t'Passafiume',\n\t'Rosoff',\n\t'Spaziani',\n\t'Venditto',\n\t'Wisch',\n\t'Fini',\n\t'Horky',\n\t'Perel',\n\t'Arzuaga',\n\t'Nasworthy',\n\t'Carland',\n\t'Elden',\n\t'Moises',\n\t'Maione',\n\t'Glace',\n\t'Laverdure',\n\t'Sieh',\n\t'Toulouse',\n\t'Hannam',\n\t'Cumber',\n\t'Rendell',\n\t'Hardey',\n\t'Maddison',\n\t'Brittle',\n\t'Helen',\n\t'Aina',\n\t'Allwood',\n\t'Fenty',\n\t'Herard',\n\t'Traore',\n\t'Ator',\n\t'Bedsaul',\n\t'Bickert',\n\t'Brendlinger',\n\t'Camuso',\n\t'Dutter',\n\t'Eastlick',\n\t'Fernholz',\n\t'Guza',\n\t'Heitzenrater',\n\t'Huo',\n\t'Isbill',\n\t'Katzenstein',\n\t'Keigley',\n\t'Kelnhofer',\n\t'Klarich',\n\t'Mangat',\n\t'Mathiason',\n\t'Murzyn',\n\t'Odenthal',\n\t'Pascarelli',\n\t'Passwaters',\n\t'Rotunda',\n\t'Schons',\n\t'Sein',\n\t'Sobon',\n\t'Stayner',\n\t'Tri',\n\t'Uhlir',\n\t'Viscusi',\n\t'Winstanley',\n\t'Xi',\n\t'Yodice',\n\t'Aerts',\n\t'Antosh',\n\t'Baldinger',\n\t'Brislin',\n\t'Christopoulos',\n\t'Faurot',\n\t'Fusselman',\n\t'Hamsher',\n\t'Henckel',\n\t'Macht',\n\t'Moellering',\n\t'Oclair',\n\t'Pavelko',\n\t'Poehlman',\n\t'Rajewski',\n\t'Richcreek',\n\t'Schmeichel',\n\t'Venkatesh',\n\t'Zemba',\n\t'Zuelke',\n\t'Dechellis',\n\t'Reddig',\n\t'Splain',\n\t'Claw',\n\t'Mottram',\n\t'Crise',\n\t'Villaflor',\n\t'Allocca',\n\t'Buttrum',\n\t'Cocking',\n\t'Mundie',\n\t'Tavis',\n\t'Saidi',\n\t'Latter',\n\t'Tuberville',\n\t'Spease',\n\t'Leatherberry',\n\t'Peatross',\n\t'Claridy',\n\t'Duerson',\n\t'Durley',\n\t'Mekonnen',\n\t'Thiam',\n\t'Aderman',\n\t'Al',\n\t'Andreu',\n\t'Beine',\n\t'Bowron',\n\t'Campi',\n\t'Chura',\n\t'Ciraulo',\n\t'Daywalt',\n\t'Fleek',\n\t'Friant',\n\t'Gahm',\n\t'Gongaware',\n\t'Grosh',\n\t'Heaslip',\n\t'Knape',\n\t'Kravets',\n\t'Kritikos',\n\t'Kumagai',\n\t'Kustra',\n\t'Madani',\n\t'Mich',\n\t'Norlander',\n\t'Paulhus',\n\t'Rabanal',\n\t'Saker',\n\t'Stupak',\n\t'Suchomel',\n\t'Vandenberghe',\n\t'Wehrenberg',\n\t'Zaccardi',\n\t'Davlin',\n\t'Dykhouse',\n\t'Grandfield',\n\t'Hullender',\n\t'Kallis',\n\t'Livshits',\n\t'Rihn',\n\t'Criger',\n\t'Michl',\n\t'Tutino',\n\t'Zulueta',\n\t'Cristo',\n\t'Meline',\n\t'Fetch',\n\t'Dung',\n\t'Shami',\n\t'Teale',\n\t'Cocker',\n\t'Eshbach',\n\t'Phagan',\n\t'Millea',\n\t'Tayloe',\n\t'Olivia',\n\t'Houchen',\n\t'Peddy',\n\t'Ferryman',\n\t'Boodram',\n\t'Maduro',\n\t'Fullman',\n\t'Landingham',\n\t'Pee',\n\t'Argenbright',\n\t'Aronowitz',\n\t'Baldenegro',\n\t'Barentine',\n\t'Bernasconi',\n\t'Bicking',\n\t'Bohle',\n\t'Camerer',\n\t'Dufford',\n\t'Ende',\n\t'Gessel',\n\t'Grauman',\n\t'Jaqua',\n\t'Kagawa',\n\t'Kalinski',\n\t'Kanz',\n\t'Klasen',\n\t'Koloski',\n\t'Kriete',\n\t'Litalien',\n\t'Maish',\n\t'Massar',\n\t'Muraski',\n\t'Pickelsimer',\n\t'Sagraves',\n\t'Servellon',\n\t'Shellito',\n\t'Shiveley',\n\t'Stanislaw',\n\t'Volland',\n\t'Biehle',\n\t'Cruey',\n\t'Eagar',\n\t'Ermis',\n\t'Goracke',\n\t'Mackert',\n\t'Malloch',\n\t'Merillat',\n\t'Rylee',\n\t'Schelin',\n\t'Tibbals',\n\t'Zandi',\n\t'Golde',\n\t'Steuart',\n\t'Jamie',\n\t'Lavis',\n\t'Bromwell',\n\t'Tregre',\n\t'Alkhatib',\n\t'Carvey',\n\t'Essa',\n\t'Wale',\n\t'Mccarey',\n\t'Brandley',\n\t'Hermon',\n\t'Stenhouse',\n\t'Oguinn',\n\t'Barclift',\n\t'Sylvan',\n\t'Smyre',\n\t'Ellerby',\n\t'Alemany',\n\t'Beyl',\n\t'Boven',\n\t'Bultema',\n\t'Buzan',\n\t'Cappo',\n\t'Cottongim',\n\t'Detore',\n\t'Dierolf',\n\t'Dueck',\n\t'Egelston',\n\t'Emard',\n\t'Eveleth',\n\t'Ferrini',\n\t'Fodera',\n\t'Hidy',\n\t'Kahley',\n\t'Karasik',\n\t'Klare',\n\t'Koudelka',\n\t'Lafleche',\n\t'Minturn',\n\t'Montemarano',\n\t'Plock',\n\t'Ratterman',\n\t'Reingold',\n\t'Rieber',\n\t'Schnackenberg',\n\t'Schrade',\n\t'Steffek',\n\t'Stehling',\n\t'Sticha',\n\t'Velaquez',\n\t'Weissberg',\n\t'Allnutt',\n\t'Barkhurst',\n\t'Bettendorf',\n\t'Canonico',\n\t'Deshmukh',\n\t'Dobosz',\n\t'Glab',\n\t'Kirkeby',\n\t'Menapace',\n\t'Parizek',\n\t'Pursifull',\n\t'Ragucci',\n\t'Raisch',\n\t'Schronce',\n\t'Tuason',\n\t'Duross',\n\t'Hainer',\n\t'Kinnick',\n\t'Rens',\n\t'Williamsen',\n\t'Hilke',\n\t'Hark',\n\t'Mellett',\n\t'Decarvalho',\n\t'Filyaw',\n\t'Sian',\n\t'Mccard',\n\t'Symon',\n\t'Grade',\n\t'Giboney',\n\t'Sadik',\n\t'Caul',\n\t'Gater',\n\t'Sulton',\n\t'Dungee',\n\t'Adriance',\n\t'Almas',\n\t'Andler',\n\t'Bellina',\n\t'Belshe',\n\t'Blouch',\n\t'Bradeen',\n\t'Brandwein',\n\t'Buechele',\n\t'Cristina',\n\t'Davidov',\n\t'Defiore',\n\t'Defrain',\n\t'Derasmo',\n\t'Dober',\n\t'Grosshans',\n\t'Hoek',\n\t'Hofstad',\n\t'Ingman',\n\t'Kille',\n\t'Langill',\n\t'Matic',\n\t'Niederer',\n\t'Novella',\n\t'Oelkers',\n\t'Percifield',\n\t'Phariss',\n\t'Pola',\n\t'Pompei',\n\t'Potthast',\n\t'Raden',\n\t'Radick',\n\t'Rendina',\n\t'Sicotte',\n\t'Sleep',\n\t'Wadhwa',\n\t'Buccheri',\n\t'Calogero',\n\t'Catrett',\n\t'Flemmer',\n\t'Mancinas',\n\t'Mcmichen',\n\t'Measel',\n\t'Pudlo',\n\t'Ruether',\n\t'Shusterman',\n\t'Stabley',\n\t'Teffeteller',\n\t'Waisanen',\n\t'Zappulla',\n\t'Symanski',\n\t'Mckenrick',\n\t'Moger',\n\t'Obispo',\n\t'Armenteros',\n\t'Roses',\n\t'Makki',\n\t'Faley',\n\t'Rumford',\n\t'Schonberg',\n\t'Hizer',\n\t'Blaydes',\n\t'Coor',\n\t'Mccalip',\n\t'Stancill',\n\t'Cal',\n\t'Murat',\n\t'Amie',\n\t'Placide',\n\t'Akpan',\n\t'Bembenek',\n\t'Bilyk',\n\t'Bizzarro',\n\t'Bugge',\n\t'Cunnane',\n\t'Degenhart',\n\t'Doehring',\n\t'Flammia',\n\t'Fritcher',\n\t'Godinho',\n\t'Gouger',\n\t'Heyboer',\n\t'Humenik',\n\t'Iannaccone',\n\t'Lacivita',\n\t'Lagunes',\n\t'Leitzke',\n\t'Luty',\n\t'Maute',\n\t'Micke',\n\t'Midura',\n\t'Nydam',\n\t'Rasp',\n\t'Rediker',\n\t'Requejo',\n\t'Roskos',\n\t'Ruckert',\n\t'Saldierna',\n\t'Salemme',\n\t'Tsuchiya',\n\t'Vallas',\n\t'Werder',\n\t'Arenivas',\n\t'Bartholomay',\n\t'Brozowski',\n\t'Dusza',\n\t'Frevert',\n\t'Giannopoulos',\n\t'Kormos',\n\t'Martos',\n\t'Mollenhauer',\n\t'Romanek',\n\t'Solinger',\n\t'Tomaro',\n\t'Zangara',\n\t'Buttrick',\n\t'Pardy',\n\t'Alvelo',\n\t'Breth',\n\t'Hemond',\n\t'Kayes',\n\t'Manne',\n\t'Grandchamp',\n\t'Gilbo',\n\t'Calame',\n\t'Clippard',\n\t'Gieger',\n\t'Penalver',\n\t'Ecton',\n\t'Totton',\n\t'Poyser',\n\t'Kettles',\n\t'Hosang',\n\t'Waker',\n\t'Maryland',\n\t'Girma',\n\t'Baribeau',\n\t'Boehnke',\n\t'Brunick',\n\t'Buhrow',\n\t'Cerreta',\n\t'Dascoli',\n\t'Eroh',\n\t'Fallert',\n\t'Fotopoulos',\n\t'Granholm',\n\t'Hebdon',\n\t'Hoelzer',\n\t'Hyser',\n\t'Lisanti',\n\t'Mastrianni',\n\t'Mewes',\n\t'Mulanax',\n\t'Nikolai',\n\t'Odekirk',\n\t'Ofallon',\n\t'Onnen',\n\t'Or',\n\t'Osso',\n\t'Ridpath',\n\t'Schara',\n\t'Schnipke',\n\t'Slayter',\n\t'Sodhi',\n\t'Steffler',\n\t'Stegemann',\n\t'Weisensel',\n\t'Bertling',\n\t'Dueitt',\n\t'Keehner',\n\t'Khaimov',\n\t'Kramlich',\n\t'Salkeld',\n\t'Ulbricht',\n\t'Vultaggio',\n\t'Dennin',\n\t'Mondo',\n\t'Kett',\n\t'Dom',\n\t'Kalan',\n\t'Yaney',\n\t'Nicley',\n\t'Carabello',\n\t'Ellegood',\n\t'Mcglocklin',\n\t'Figuero',\n\t'Pillard',\n\t'Wolfrey',\n\t'Leys',\n\t'Cobert',\n\t'Wahid',\n\t'Fede',\n\t'Ausbrooks',\n\t'Gums',\n\t'Gillion',\n\t'Mcgeachy',\n\t'Parran',\n\t'Likely',\n\t'Marbley',\n\t'Argote',\n\t'Bhullar',\n\t'Botros',\n\t'Brethauer',\n\t'Chell',\n\t'Conradi',\n\t'Covill',\n\t'Crays',\n\t'Crysler',\n\t'Handke',\n\t'Hanneken',\n\t'Hidrogo',\n\t'Hirayama',\n\t'Huebert',\n\t'Hurford',\n\t'Iskra',\n\t'Malczewski',\n\t'Menees',\n\t'Monforte',\n\t'Murdick',\n\t'Naclerio',\n\t'Nohr',\n\t'Pangallo',\n\t'Payeur',\n\t'Pozniak',\n\t'Rammel',\n\t'Schield',\n\t'Schrick',\n\t'Seifer',\n\t'Sperduto',\n\t'Stagliano',\n\t'Staubs',\n\t'Stromme',\n\t'Tourigny',\n\t'Traister',\n\t'Vandecar',\n\t'Wilhelms',\n\t'Wilinski',\n\t'Wittke',\n\t'Clougherty',\n\t'Crotwell',\n\t'Hannula',\n\t'Heavrin',\n\t'Heidinger',\n\t'Keehan',\n\t'Ortwein',\n\t'Palinkas',\n\t'Seivert',\n\t'Sloniker',\n\t'Yielding',\n\t'Lac',\n\t'Shove',\n\t'Venard',\n\t'Violett',\n\t'Foresta',\n\t'Gapp',\n\t'Dejongh',\n\t'Ambrosia',\n\t'Simkin',\n\t'Sastre',\n\t'Mcarthy',\n\t'Bering',\n\t'Sarah',\n\t'Hickling',\n\t'Sookdeo',\n\t'Val',\n\t'Colden',\n\t'Feltus',\n\t'Hailes',\n\t'Canizalez',\n\t'Cloke',\n\t'Connole',\n\t'Dancel',\n\t'Demmon',\n\t'Ehrler',\n\t'Fruchey',\n\t'Helinski',\n\t'Hepfer',\n\t'Katzen',\n\t'Kressler',\n\t'Lagrow',\n\t'Nethercutt',\n\t'Novitski',\n\t'Papale',\n\t'Pesola',\n\t'Petrosian',\n\t'Pies',\n\t'Prazak',\n\t'Preza',\n\t'Reiche',\n\t'Salle',\n\t'Savic',\n\t'Servello',\n\t'Sherbondy',\n\t'Solazzo',\n\t'Stabenow',\n\t'Walstad',\n\t'Yaden',\n\t'Zagal',\n\t'Zani',\n\t'Dimambro',\n\t'Engquist',\n\t'Fochtman',\n\t'Frasch',\n\t'Fuerstenberg',\n\t'Galus',\n\t'Gronowski',\n\t'Grossenbacher',\n\t'Hahs',\n\t'Iavarone',\n\t'Kerper',\n\t'Kravchenko',\n\t'Kwolek',\n\t'Lusignan',\n\t'Lybbert',\n\t'Maertens',\n\t'Mahany',\n\t'Medico',\n\t'Orrantia',\n\t'Reitmeier',\n\t'Sieve',\n\t'Sterbenz',\n\t'Tenpas',\n\t'Wischmeyer',\n\t'Zajkowski',\n\t'Cregg',\n\t'Shetley',\n\t'Tisher',\n\t'Coup',\n\t'Murdy',\n\t'Lysaght',\n\t'Sesco',\n\t'Koy',\n\t'Wakley',\n\t'Bertholf',\n\t'Swaner',\n\t'Stakes',\n\t'Gren',\n\t'Elahi',\n\t'Torney',\n\t'Gopaul',\n\t'Egland',\n\t'Gingles',\n\t'Aurich',\n\t'Biela',\n\t'Binz',\n\t'Blumenstock',\n\t'Boardwine',\n\t'Boehner',\n\t'Boening',\n\t'Crankshaw',\n\t'Decarli',\n\t'Fauble',\n\t'Georgopoulos',\n\t'Gieske',\n\t'Hasselbring',\n\t'Heeb',\n\t'Janosik',\n\t'Kalafut',\n\t'Karpf',\n\t'Kramm',\n\t'Lanyon',\n\t'Lewelling',\n\t'Lilla',\n\t'Marik',\n\t'Moyano',\n\t'Oppel',\n\t'Panagos',\n\t'Renovato',\n\t'Rohlman',\n\t'Rostron',\n\t'Todhunter',\n\t'Torello',\n\t'Umfleet',\n\t'Wien',\n\t'Youker',\n\t'Ytuarte',\n\t'Zavada',\n\t'Altvater',\n\t'Arnzen',\n\t'Blixt',\n\t'Elek',\n\t'Geiselman',\n\t'Hiltunen',\n\t'Jachim',\n\t'Kolenovic',\n\t'Kooyman',\n\t'Muecke',\n\t'Pierron',\n\t'Preisler',\n\t'Rogus',\n\t'Schoeller',\n\t'Solimine',\n\t'Speagle',\n\t'Courser',\n\t'Mascarenhas',\n\t'Dorer',\n\t'Scotten',\n\t'Goy',\n\t'Avers',\n\t'Blanca',\n\t'Choung',\n\t'Goleman',\n\t'Nanna',\n\t'Lave',\n\t'Seley',\n\t'Meggison',\n\t'Ripoll',\n\t'Mannan',\n\t'Bihm',\n\t'Tribbey',\n\t'Ports',\n\t'Asby',\n\t'Philibert',\n\t'Furby',\n\t'Keal',\n\t'Louallen',\n\t'Idris',\n\t'Artist',\n\t'Branford',\n\t'Sabree',\n\t'Ainley',\n\t'Amezola',\n\t'Andreason',\n\t'Athans',\n\t'Batiz',\n\t'Bostelman',\n\t'Bozic',\n\t'Butman',\n\t'Coiro',\n\t'Defina',\n\t'Garbo',\n\t'Gewirtz',\n\t'Hathcoat',\n\t'Heebner',\n\t'Helbing',\n\t'Kasler',\n\t'Kastler',\n\t'Kearby',\n\t'Krus',\n\t'Lezotte',\n\t'Lithgow',\n\t'Mealor',\n\t'Moltz',\n\t'Morcom',\n\t'Norbeck',\n\t'Novicki',\n\t'Osmani',\n\t'Posluszny',\n\t'Quiroa',\n\t'Rahal',\n\t'Roddenberry',\n\t'Rodino',\n\t'Sallade',\n\t'Saraceni',\n\t'Schmaus',\n\t'Stathopoulos',\n\t'Swatek',\n\t'Tupy',\n\t'Vonseggern',\n\t'Zens',\n\t'Ahonen',\n\t'Arrazola',\n\t'Avedisian',\n\t'Bachtell',\n\t'Bastarache',\n\t'Chavero',\n\t'Darienzo',\n\t'Giampa',\n\t'Gillott',\n\t'Hierholzer',\n\t'Kruckeberg',\n\t'Lafrenz',\n\t'Milkowski',\n\t'Missildine',\n\t'Passaretti',\n\t'Rogstad',\n\t'Saadeh',\n\t'Sielski',\n\t'Slavick',\n\t'Tieken',\n\t'Wittenmyer',\n\t'Yepiz',\n\t'Zimdars',\n\t'Rail',\n\t'Kook',\n\t'Jian',\n\t'Piet',\n\t'Sanjurjo',\n\t'Shampine',\n\t'Christel',\n\t'Hechavarria',\n\t'Blucher',\n\t'Crimm',\n\t'Lebreton',\n\t'Charbonnet',\n\t'Bolls',\n\t'Stroder',\n\t'Baise',\n\t'Mcnease',\n\t'Alen',\n\t'Priestly',\n\t'Mannie',\n\t'Doleman',\n\t'Areas',\n\t'Atayde',\n\t'Berent',\n\t'Bodmer',\n\t'Brodin',\n\t'Buntrock',\n\t'Eckrich',\n\t'Emberson',\n\t'Hilgert',\n\t'Hirn',\n\t'Holihan',\n\t'Hoshino',\n\t'Jeung',\n\t'Leece',\n\t'Leonardis',\n\t'Macera',\n\t'Mcferron',\n\t'Muster',\n\t'Naef',\n\t'Pecka',\n\t'Peloso',\n\t'Pensyl',\n\t'Reaney',\n\t'Reidinger',\n\t'Rockholt',\n\t'Tabrizi',\n\t'Trauth',\n\t'Trulock',\n\t'Tupou',\n\t'Asbridge',\n\t'Franzel',\n\t'Gesualdi',\n\t'Grimwood',\n\t'Hardinger',\n\t'Kondrat',\n\t'Koskinen',\n\t'Ludolph',\n\t'Marchesi',\n\t'Mehrtens',\n\t'Racioppi',\n\t'Sabey',\n\t'Stroebel',\n\t'Swendsen',\n\t'Vandewalker',\n\t'Korber',\n\t'Messler',\n\t'Mowat',\n\t'Kor',\n\t'Pua',\n\t'Sarazin',\n\t'Wayson',\n\t'Oland',\n\t'Bandi',\n\t'Fabel',\n\t'Frankl',\n\t'Rane',\n\t'Mozer',\n\t'Weaber',\n\t'Moustafa',\n\t'Robe',\n\t'Lindy',\n\t'Medaris',\n\t'Derden',\n\t'Benthall',\n\t'Ayler',\n\t'Osias',\n\t'Choyce',\n\t'Scantlebury',\n\t'Patmon',\n\t'Ahlgrim',\n\t'Boffa',\n\t'Brideau',\n\t'Bubeck',\n\t'Bubel',\n\t'Casio',\n\t'Casique',\n\t'Casten',\n\t'Colebank',\n\t'Demoura',\n\t'Devincenzo',\n\t'Elsesser',\n\t'Fauci',\n\t'Frentz',\n\t'Hemler',\n\t'Keitel',\n\t'Luan',\n\t'Luhn',\n\t'Luquette',\n\t'Mazurowski',\n\t'Mendibles',\n\t'Mickiewicz',\n\t'Minelli',\n\t'Mistler',\n\t'Nemer',\n\t'Nikolaus',\n\t'Offill',\n\t'Pezza',\n\t'Ruzich',\n\t'Skrzypek',\n\t'Swimmer',\n\t'Trucks',\n\t'Vaccarella',\n\t'Zeidman',\n\t'Brattin',\n\t'Deblock',\n\t'Dufrane',\n\t'Gural',\n\t'Hufstedler',\n\t'Kapuscinski',\n\t'Lyerla',\n\t'Musolino',\n\t'Neubecker',\n\t'Polus',\n\t'Protzman',\n\t'Retzloff',\n\t'Sachdev',\n\t'Sazama',\n\t'Shrider',\n\t'Tobolski',\n\t'Mcbane',\n\t'Clabo',\n\t'Fredrich',\n\t'Lace',\n\t'Bertran',\n\t'Kama',\n\t'Simonet',\n\t'Lippitt',\n\t'Thomlinson',\n\t'Vallot',\n\t'Dede',\n\t'Brimley',\n\t'Parler',\n\t'Standfield',\n\t'Goodie',\n\t'Isidore',\n\t'Philogene',\n\t'Abramczyk',\n\t'Andert',\n\t'Besancon',\n\t'Bieda',\n\t'Birkey',\n\t'Boquet',\n\t'Borak',\n\t'Bottino',\n\t'Breyfogle',\n\t'Crill',\n\t'Daffern',\n\t'Derrig',\n\t'Dimalanta',\n\t'Dresch',\n\t'Feulner',\n\t'Friede',\n\t'Furth',\n\t'Gamet',\n\t'Garramone',\n\t'Gaunce',\n\t'Gitto',\n\t'Guandique',\n\t'Hoxworth',\n\t'Hubers',\n\t'Ingwersen',\n\t'Junio',\n\t'Kassing',\n\t'Magrath',\n\t'Martelle',\n\t'Mcweeney',\n\t'Neris',\n\t'Nesheiwat',\n\t'Remlinger',\n\t'Rentmeester',\n\t'Schlein',\n\t'Schoneman',\n\t'Sterr',\n\t'Streib',\n\t'Szymanowski',\n\t'Trompeter',\n\t'Tullius',\n\t'Cherico',\n\t'Cremin',\n\t'Dominey',\n\t'Gotthardt',\n\t'Kowalke',\n\t'Onderdonk',\n\t'Pirrello',\n\t'Rumberger',\n\t'Schreur',\n\t'Westerhoff',\n\t'Maroni',\n\t'Dire',\n\t'Menta',\n\t'Hoeg',\n\t'Meise',\n\t'Standerfer',\n\t'Roam',\n\t'Tibbett',\n\t'Beevers',\n\t'Evrard',\n\t'Locklair',\n\t'Brester',\n\t'Sirmon',\n\t'Woodbeck',\n\t'Wires',\n\t'Durette',\n\t'Raul',\n\t'Stephanie',\n\t'Mcwain',\n\t'Skeeters',\n\t'Wilbourne',\n\t'Debroux',\n\t'Keyton',\n\t'Noris',\n\t'Fanta',\n\t'Goshen',\n\t'Kithcart',\n\t'Shepheard',\n\t'Sherod',\n\t'Buntyn',\n\t'Gissendanner',\n\t'Goodley',\n\t'Mckissic',\n\t'Bissinger',\n\t'Biswell',\n\t'Borruso',\n\t'Danese',\n\t'Eslava',\n\t'Gehle',\n\t'Gibeau',\n\t'Gionet',\n\t'Greth',\n\t'Gul',\n\t'Hambley',\n\t'Harshfield',\n\t'Helin',\n\t'Henken',\n\t'Hogland',\n\t'Hoxha',\n\t'Hurlbutt',\n\t'Kaminer',\n\t'Kien',\n\t'Kliebert',\n\t'Koivisto',\n\t'Kooken',\n\t'Laconte',\n\t'Lovo',\n\t'Manninen',\n\t'Maxham',\n\t'Mcleland',\n\t'Mclerran',\n\t'Milici',\n\t'Negrette',\n\t'Nicotera',\n\t'Nissan',\n\t'Philipson',\n\t'Pimenta',\n\t'Pinch',\n\t'Rietveld',\n\t'Seyller',\n\t'Shollenberger',\n\t'Sochacki',\n\t'Telleria',\n\t'Toda',\n\t'Unrue',\n\t'Vanbenschoten',\n\t'Versace',\n\t'Villada',\n\t'Watry',\n\t'Wirsing',\n\t'Zeimet',\n\t'Zynda',\n\t'Angelillo',\n\t'Fleissner',\n\t'Freehling',\n\t'Grewell',\n\t'Heick',\n\t'Kartes',\n\t'Kishi',\n\t'Kopke',\n\t'Laubenstein',\n\t'Leske',\n\t'Lohmeier',\n\t'Marotz',\n\t'Moccio',\n\t'Mullineaux',\n\t'Muzyka',\n\t'Ostermiller',\n\t'Penuelas',\n\t'Plagge',\n\t'Stolarz',\n\t'Wertenberger',\n\t'Sella',\n\t'Allinger',\n\t'Betzler',\n\t'Rosenkrantz',\n\t'Trimarchi',\n\t'Dionicio',\n\t'Frohman',\n\t'Landenberger',\n\t'Shillings',\n\t'Chill',\n\t'Leather',\n\t'Sonn',\n\t'Connel',\n\t'Fougere',\n\t'Alia',\n\t'Wisby',\n\t'Haisley',\n\t'Minion',\n\t'Mccathern',\n\t'Rozzell',\n\t'Armbrister',\n\t'Ryant',\n\t'Almeyda',\n\t'Bonjour',\n\t'Bordas',\n\t'Bozard',\n\t'Buccola',\n\t'Cihlar',\n\t'Dargis',\n\t'Faivre',\n\t'Fejes',\n\t'Grulke',\n\t'Harken',\n\t'Heimberger',\n\t'Hochmuth',\n\t'Keadle',\n\t'Kedrowski',\n\t'Kortman',\n\t'Krahenbuhl',\n\t'Krasniqi',\n\t'Kundrat',\n\t'Leistner',\n\t'Loguidice',\n\t'Mcauliff',\n\t'Mchatton',\n\t'Minella',\n\t'Muccio',\n\t'Normington',\n\t'Nuttle',\n\t'Orsino',\n\t'Reker',\n\t'Respicio',\n\t'Shein',\n\t'Teichert',\n\t'Varisco',\n\t'Accomando',\n\t'Amelio',\n\t'Burckhard',\n\t'Fleischhacker',\n\t'Hagglund',\n\t'Kessenich',\n\t'Langrehr',\n\t'Lauderbaugh',\n\t'Misquez',\n\t'Muneton',\n\t'Ourada',\n\t'Rulon',\n\t'Scholze',\n\t'Stellmach',\n\t'Sudano',\n\t'Thelander',\n\t'Yeckley',\n\t'Corsino',\n\t'Grage',\n\t'Isla',\n\t'Narramore',\n\t'Coolman',\n\t'Heatherington',\n\t'Newey',\n\t'Kunda',\n\t'Motts',\n\t'Tawfik',\n\t'Tindel',\n\t'Passon',\n\t'Sypher',\n\t'Conceicao',\n\t'Haraway',\n\t'Deamer',\n\t'Nored',\n\t'Mamo',\n\t'Mcgilberry',\n\t'Akerley',\n\t'Andreatta',\n\t'Aronhalt',\n\t'Barz',\n\t'Bebber',\n\t'Brubacher',\n\t'Cabriales',\n\t'Dyckman',\n\t'Ellers',\n\t'Finerty',\n\t'Hargan',\n\t'Haselton',\n\t'Hellmuth',\n\t'Hoffmeier',\n\t'Homrich',\n\t'Hrabak',\n\t'Intrieri',\n\t'Lebeda',\n\t'Lutzke',\n\t'Malka',\n\t'Mcglinn',\n\t'Nicklin',\n\t'Nusz',\n\t'Pennings',\n\t'Rebmann',\n\t'Rodocker',\n\t'Sacra',\n\t'Saksa',\n\t'Shehane',\n\t'Siever',\n\t'Snide',\n\t'Sotero',\n\t'Sponsel',\n\t'Therien',\n\t'Viti',\n\t'Wubben',\n\t'Zieske',\n\t'Billingham',\n\t'Bruschi',\n\t'Cullipher',\n\t'Eppolito',\n\t'Greuel',\n\t'Huq',\n\t'Matott',\n\t'Mohlman',\n\t'Monterroza',\n\t'Risberg',\n\t'Shvartsman',\n\t'Sigafoos',\n\t'Zehring',\n\t'Manuele',\n\t'Asghar',\n\t'Shelp',\n\t'Grieder',\n\t'Hippert',\n\t'Dani',\n\t'Beserra',\n\t'Kennan',\n\t'Scholfield',\n\t'Joh',\n\t'Swailes',\n\t'Pear',\n\t'Hell',\n\t'Kittler',\n\t'Pickeral',\n\t'Somerset',\n\t'Streat',\n\t'Tinner',\n\t'Landor',\n\t'Pretlow',\n\t'Tensley',\n\t'Abela',\n\t'Abramovich',\n\t'Acocella',\n\t'Avino',\n\t'Bacchi',\n\t'Bayliff',\n\t'Beganovic',\n\t'Belinsky',\n\t'Bilicki',\n\t'Borowiec',\n\t'Bucknam',\n\t'Calandro',\n\t'Ciszek',\n\t'Cooling',\n\t'Cundari',\n\t'Derk',\n\t'Ekern',\n\t'Engelson',\n\t'Fennessey',\n\t'Ferencz',\n\t'Filipkowski',\n\t'Frescas',\n\t'Frisinger',\n\t'Gegg',\n\t'Hanken',\n\t'Harbach',\n\t'Jipson',\n\t'Kasal',\n\t'Kinstler',\n\t'Langenbach',\n\t'Leccese',\n\t'Maalouf',\n\t'Mcinerny',\n\t'Mcpartlin',\n\t'Meth',\n\t'Mitzner',\n\t'Riano',\n\t'Saggese',\n\t'Schroff',\n\t'Skibicki',\n\t'Textor',\n\t'Vancampen',\n\t'Vukelich',\n\t'Wascom',\n\t'Workinger',\n\t'Xin',\n\t'Bronkema',\n\t'Gerstel',\n\t'Geving',\n\t'Gravlin',\n\t'Hannay',\n\t'Haughn',\n\t'Lippi',\n\t'Lonsway',\n\t'Paradowski',\n\t'Poust',\n\t'Thinnes',\n\t'Wassenaar',\n\t'Hemm',\n\t'Isip',\n\t'Pastorino',\n\t'Barkett',\n\t'Montalban',\n\t'Ballestero',\n\t'Floren',\n\t'Rossen',\n\t'Chuba',\n\t'Burrington',\n\t'Derman',\n\t'Wickland',\n\t'Dunman',\n\t'Beek',\n\t'Petitjean',\n\t'Michelin',\n\t'Chapell',\n\t'Pullam',\n\t'Adamcik',\n\t'Albarracin',\n\t'Batrez',\n\t'Berghuis',\n\t'Birkland',\n\t'Boulier',\n\t'Broderson',\n\t'Bruun',\n\t'Cicio',\n\t'Davidow',\n\t'Denova',\n\t'Dooner',\n\t'Espeland',\n\t'Fifita',\n\t'Guidone',\n\t'Hartnell',\n\t'Havranek',\n\t'Janca',\n\t'Klepac',\n\t'Langhorst',\n\t'Lippmann',\n\t'Merrihew',\n\t'Mondelli',\n\t'Monterosso',\n\t'Moster',\n\t'Noxon',\n\t'Poznanski',\n\t'Reents',\n\t'Samaras',\n\t'Silvius',\n\t'Srour',\n\t'Stasio',\n\t'Steffe',\n\t'Steimer',\n\t'Stracke',\n\t'Taney',\n\t'Theodorou',\n\t'Trickel',\n\t'Tunks',\n\t'Vavrek',\n\t'Whitfill',\n\t'Wohlfeil',\n\t'Zirkelbach',\n\t'Brissey',\n\t'Busboom',\n\t'Collignon',\n\t'Emling',\n\t'Fratzke',\n\t'Genrich',\n\t'Giglia',\n\t'Hayakawa',\n\t'Lupinski',\n\t'Pulvermacher',\n\t'Steinbrink',\n\t'Xayavong',\n\t'Yerkey',\n\t'Arlotta',\n\t'Calia',\n\t'Pfiffner',\n\t'Gostomski',\n\t'Declerck',\n\t'Demedeiros',\n\t'Dirickson',\n\t'Wo',\n\t'Hosie',\n\t'Chad',\n\t'Herbison',\n\t'Fleece',\n\t'Connon',\n\t'Dun',\n\t'Gaffin',\n\t'Plush',\n\t'Gravette',\n\t'Houseal',\n\t'Seaward',\n\t'Esson',\n\t'Mayhorn',\n\t'Surrell',\n\t'Horsford',\n\t'Mcduffey',\n\t'Huger',\n\t'Alexie',\n\t'Apsey',\n\t'Belke',\n\t'Bourcier',\n\t'Cardena',\n\t'Daun',\n\t'Dunworth',\n\t'Ehrsam',\n\t'Elizardo',\n\t'Elkhatib',\n\t'Emick',\n\t'Fernau',\n\t'Finnan',\n\t'Hitzeman',\n\t'Housand',\n\t'Kallstrom',\n\t'Katen',\n\t'Kerstein',\n\t'Kiracofe',\n\t'Klammer',\n\t'Largaespada',\n\t'Limoges',\n\t'Lodwick',\n\t'Lozito',\n\t'Madl',\n\t'Mauthe',\n\t'Mogel',\n\t'Newstrom',\n\t'Ninh',\n\t'Obrochta',\n\t'Opsal',\n\t'Ordiway',\n\t'Osentoski',\n\t'Paxman',\n\t'Plume',\n\t'Rickenbach',\n\t'Rinks',\n\t'Saltmarsh',\n\t'Scheuring',\n\t'Schwegel',\n\t'Skov',\n\t'Woodrome',\n\t'Zdanowicz',\n\t'Zera',\n\t'Basgall',\n\t'Bornhorst',\n\t'Clotfelter',\n\t'Coulthard',\n\t'Dresner',\n\t'Fischl',\n\t'Grahek',\n\t'Grefe',\n\t'Knightly',\n\t'Kuenzel',\n\t'Mccumbers',\n\t'Millstein',\n\t'Mulnix',\n\t'Weiher',\n\t'Yust',\n\t'Metter',\n\t'Polio',\n\t'Ayad',\n\t'Banke',\n\t'Lawlis',\n\t'Coba',\n\t'Twyford',\n\t'Burck',\n\t'Barthold',\n\t'Sames',\n\t'Jacquot',\n\t'Allsopp',\n\t'Mcglaun',\n\t'Hollinsworth',\n\t'Gillings',\n\t'Buchannon',\n\t'Bas',\n\t'Beaber',\n\t'Berto',\n\t'Bobrow',\n\t'Bochicchio',\n\t'Bohland',\n\t'Burghart',\n\t'Chaloux',\n\t'Costella',\n\t'Depace',\n\t'Dils',\n\t'Diviney',\n\t'Ehly',\n\t'Ermer',\n\t'Fussner',\n\t'Gunia',\n\t'Guterrez',\n\t'Holik',\n\t'Holster',\n\t'Kasperski',\n\t'Koscinski',\n\t'Lamoureaux',\n\t'Marotti',\n\t'Masullo',\n\t'Mcconahy',\n\t'Mehlhaff',\n\t'Mocarski',\n\t'Moosman',\n\t'Pavlich',\n\t'Pfisterer',\n\t'Ruacho',\n\t'Semrad',\n\t'Slemmer',\n\t'Stineman',\n\t'Toelle',\n\t'Vanderstelt',\n\t'Wagy',\n\t'Wuensch',\n\t'Wykes',\n\t'Zar',\n\t'Bouchie',\n\t'Friis',\n\t'Gehrt',\n\t'Hempfling',\n\t'Henkes',\n\t'Huggler',\n\t'Kelbaugh',\n\t'Petrenko',\n\t'Pfost',\n\t'Rubendall',\n\t'Shimel',\n\t'Stapf',\n\t'Sweeton',\n\t'Tsuda',\n\t'Vitanza',\n\t'Voytko',\n\t'Bibbo',\n\t'Hagee',\n\t'Majer',\n\t'Mangieri',\n\t'Pala',\n\t'Volle',\n\t'Cabassa',\n\t'Lipsett',\n\t'Macdougal',\n\t'Minar',\n\t'Eline',\n\t'Eskin',\n\t'Angeletti',\n\t'Lattner',\n\t'Kimple',\n\t'Marsan',\n\t'Tornes',\n\t'Moncur',\n\t'Sanderfer',\n\t'Crite',\n\t'Levels',\n\t'Valcin',\n\t'Motton',\n\t'Foggie',\n\t'Battistoni',\n\t'Bedient',\n\t'Bendt',\n\t'Bennison',\n\t'Bonnin',\n\t'Caridi',\n\t'Cedotal',\n\t'Choinski',\n\t'Cossin',\n\t'Devargas',\n\t'Deveny',\n\t'Dosher',\n\t'Dredge',\n\t'Fittro',\n\t'Gorgone',\n\t'Gourd',\n\t'Herra',\n\t'Holwerda',\n\t'Iannello',\n\t'Klintworth',\n\t'Kubena',\n\t'Leyvas',\n\t'Magowan',\n\t'Mendolia',\n\t'Nehme',\n\t'Pelikan',\n\t'Pfalzgraf',\n\t'Raith',\n\t'Reichenberg',\n\t'Reinertsen',\n\t'Sens',\n\t'Simer',\n\t'Spektor',\n\t'Sweda',\n\t'Wordell',\n\t'Blasing',\n\t'Dinoto',\n\t'Goblirsch',\n\t'Helming',\n\t'Hibshman',\n\t'Lamountain',\n\t'Latka',\n\t'Licausi',\n\t'Malerba',\n\t'Mentink',\n\t'Meskill',\n\t'Moening',\n\t'Montminy',\n\t'Ryno',\n\t'Sluka',\n\t'Solarz',\n\t'Swainston',\n\t'Tagliaferri',\n\t'Twichell',\n\t'Vertucci',\n\t'Voland',\n\t'Wolgast',\n\t'Bissen',\n\t'Duray',\n\t'Flaum',\n\t'Taves',\n\t'Caplin',\n\t'Hayat',\n\t'Pollett',\n\t'Baris',\n\t'Taher',\n\t'Anes',\n\t'Beza',\n\t'Pere',\n\t'Tipper',\n\t'Farrey',\n\t'Slott',\n\t'Sinquefield',\n\t'Bobbett',\n\t'Calico',\n\t'Eigner',\n\t'Gambrill',\n\t'Donigan',\n\t'Daney',\n\t'Natt',\n\t'Gettis',\n\t'Kincy',\n\t'Dolberry',\n\t'Curenton',\n\t'Elzie',\n\t'Beretta',\n\t'Carbine',\n\t'Carpenito',\n\t'Clarin',\n\t'Conrado',\n\t'Conradt',\n\t'Courteau',\n\t'Daft',\n\t'Debruler',\n\t'Delahunty',\n\t'Duerst',\n\t'Dzik',\n\t'Ellner',\n\t'Faeth',\n\t'Fournet',\n\t'Galinski',\n\t'Goldenstein',\n\t'Hanauer',\n\t'Higgason',\n\t'Hoeper',\n\t'Hollo',\n\t'Ildefonso',\n\t'Jocson',\n\t'Kasprowicz',\n\t'Kochanowski',\n\t'Labrosse',\n\t'Lazaroff',\n\t'Leino',\n\t'Levinsky',\n\t'Lopezhernandez',\n\t'Mckeague',\n\t'Otremba',\n\t'Paluzzi',\n\t'Pevehouse',\n\t'Polgar',\n\t'Raneri',\n\t'Rumler',\n\t'Sanantonio',\n\t'Schissel',\n\t'Senteno',\n\t'Sieling',\n\t'Smee',\n\t'Swiggum',\n\t'Tarnow',\n\t'Tavakoli',\n\t'Tholl',\n\t'Valdiviezo',\n\t'Willadsen',\n\t'Wilmouth',\n\t'Dudziak',\n\t'Eskenazi',\n\t'Garity',\n\t'Gravino',\n\t'Impastato',\n\t'Kuhner',\n\t'Mcclaflin',\n\t'Nein',\n\t'Precourt',\n\t'Rotenberry',\n\t'Sciara',\n\t'Arenson',\n\t'Coupland',\n\t'Sedler',\n\t'Pizer',\n\t'Him',\n\t'Combee',\n\t'Rhorer',\n\t'Gelles',\n\t'Baroody',\n\t'Basten',\n\t'Sprinkles',\n\t'Vanier',\n\t'Clementson',\n\t'Robberson',\n\t'Harten',\n\t'Kade',\n\t'Bhola',\n\t'Bahar',\n\t'Pellum',\n\t'Isadore',\n\t'Dixie',\n\t'Axline',\n\t'Backs',\n\t'Berdahl',\n\t'Billeter',\n\t'Bily',\n\t'Broerman',\n\t'Declercq',\n\t'Derleth',\n\t'Fanucchi',\n\t'Forkey',\n\t'Gallinger',\n\t'Gionfriddo',\n\t'Gretzinger',\n\t'Grima',\n\t'Helgren',\n\t'Hoelting',\n\t'Hundertmark',\n\t'Inscho',\n\t'Jernberg',\n\t'Kamiya',\n\t'Lekas',\n\t'Marchini',\n\t'Markuson',\n\t'Matsushima',\n\t'Meineke',\n\t'Mizrachi',\n\t'Moglia',\n\t'Nagele',\n\t'Naro',\n\t'Padillo',\n\t'Palleschi',\n\t'Palomba',\n\t'Purgason',\n\t'Qadri',\n\t'Recalde',\n\t'Rosiak',\n\t'Rumney',\n\t'Savitt',\n\t'Shibuya',\n\t'Szalkowski',\n\t'Wagg',\n\t'Wolsey',\n\t'Zumpano',\n\t'Benbrook',\n\t'Blasdel',\n\t'Carusone',\n\t'Karalis',\n\t'Koep',\n\t'Kohles',\n\t'Rumbo',\n\t'Siggins',\n\t'Unverzagt',\n\t'Eatherly',\n\t'Kapper',\n\t'Salser',\n\t'Wege',\n\t'Zinsmeister',\n\t'Alf',\n\t'Wish',\n\t'Falero',\n\t'Bur',\n\t'Imam',\n\t'Biven',\n\t'Merritts',\n\t'Kaigler',\n\t'Verdell',\n\t'Feggins',\n\t'Acerra',\n\t'Antenucci',\n\t'Benegas',\n\t'Bisesi',\n\t'Boshers',\n\t'Chap',\n\t'Clouatre',\n\t'Doxtater',\n\t'Dullea',\n\t'Eischeid',\n\t'Gundry',\n\t'Hinger',\n\t'Hodak',\n\t'Iseminger',\n\t'Juris',\n\t'Kirchen',\n\t'Knezevic',\n\t'Kobrin',\n\t'Krizek',\n\t'Leza',\n\t'Lusty',\n\t'Luttrull',\n\t'Mattke',\n\t'Mossbarger',\n\t'Narro',\n\t'Osland',\n\t'Ostwald',\n\t'Pepperman',\n\t'Pritzl',\n\t'Reasner',\n\t'Schimming',\n\t'Schulenburg',\n\t'Trefry',\n\t'Vigorito',\n\t'Bayardo',\n\t'Bieser',\n\t'Brinkmeier',\n\t'Camposano',\n\t'Cremeens',\n\t'Delgrande',\n\t'Demopoulos',\n\t'Deyarmin',\n\t'Grismer',\n\t'Jubb',\n\t'Kinker',\n\t'Lauf',\n\t'Mabile',\n\t'Muehl',\n\t'Orlick',\n\t'Pillado',\n\t'Pizzano',\n\t'Poppleton',\n\t'Quickel',\n\t'Stoneberg',\n\t'Szwed',\n\t'Zadrozny',\n\t'Ziemke',\n\t'Zupko',\n\t'Diesel',\n\t'Hornbrook',\n\t'Pillion',\n\t'Holaway',\n\t'Massad',\n\t'Rossmiller',\n\t'Parriott',\n\t'Toya',\n\t'Dross',\n\t'Burwick',\n\t'Kaman',\n\t'Bruna',\n\t'Milles',\n\t'Acrey',\n\t'Toogood',\n\t'Austell',\n\t'Chastang',\n\t'Jasmine',\n\t'Eckford',\n\t'Stiggers',\n\t'Saintvil',\n\t'Adeyemi',\n\t'Basto',\n\t'Bolon',\n\t'Brilliant',\n\t'Brockhoff',\n\t'Colao',\n\t'Emens',\n\t'Endler',\n\t'Fabris',\n\t'Falletta',\n\t'Felver',\n\t'Ferdon',\n\t'Golinski',\n\t'Gosdin',\n\t'Gronlund',\n\t'Guijosa',\n\t'Hainley',\n\t'Halama',\n\t'Heinicke',\n\t'Heldenbrand',\n\t'Helmkamp',\n\t'Hoctor',\n\t'Hoeck',\n\t'Kroboth',\n\t'Lamagna',\n\t'Lingg',\n\t'Locurto',\n\t'Marchewka',\n\t'Micco',\n\t'Mormino',\n\t'Newmeyer',\n\t'Ostrosky',\n\t'Redel',\n\t'Saccoccio',\n\t'Stavely',\n\t'Stidd',\n\t'Tonne',\n\t'Tonnesen',\n\t'Umbach',\n\t'Vardanyan',\n\t'Wank',\n\t'Wolven',\n\t'Cilento',\n\t'Delmonaco',\n\t'Denigris',\n\t'Gerbig',\n\t'Gradilla',\n\t'Grebner',\n\t'Landini',\n\t'Marohl',\n\t'Muenchow',\n\t'Niedermeier',\n\t'Nussbaumer',\n\t'Nycz',\n\t'Pizzino',\n\t'Schader',\n\t'Schuneman',\n\t'Takano',\n\t'Ureta',\n\t'Vanderloop',\n\t'Windholz',\n\t'Wombacher',\n\t'Woulfe',\n\t'Hamley',\n\t'Schickel',\n\t'Yuill',\n\t'Batta',\n\t'Galant',\n\t'Mofield',\n\t'Kint',\n\t'Barnell',\n\t'Ashmead',\n\t'Crossin',\n\t'Lasco',\n\t'Chasen',\n\t'Swire',\n\t'Gleghorn',\n\t'Bearfield',\n\t'Goodgame',\n\t'Daris',\n\t'Plump',\n\t'Derricott',\n\t'Burno',\n\t'Baylock',\n\t'Vanterpool',\n\t'Judon',\n\t'Mells',\n\t'Proby',\n\t'Bagan',\n\t'Batcheller',\n\t'Bjelland',\n\t'Boline',\n\t'Boullion',\n\t'Broomall',\n\t'Carcia',\n\t'Cassinelli',\n\t'Cerro',\n\t'Colantuono',\n\t'Dembeck',\n\t'Doto',\n\t'Eckersley',\n\t'Edell',\n\t'Ewy',\n\t'Goodness',\n\t'Huhta',\n\t'Kallen',\n\t'Keimig',\n\t'Kemppainen',\n\t'Koopmann',\n\t'Lacap',\n\t'Lehtinen',\n\t'Maciolek',\n\t'Marchuk',\n\t'Mcfate',\n\t'Mentel',\n\t'Minihan',\n\t'Mohsin',\n\t'Oppedisano',\n\t'Patriarca',\n\t'Raske',\n\t'Schueneman',\n\t'Shostak',\n\t'Sibal',\n\t'Spadafore',\n\t'Suitor',\n\t'Tavella',\n\t'Vy',\n\t'Wies',\n\t'Beadnell',\n\t'Bogusz',\n\t'Cleverly',\n\t'Dellorusso',\n\t'Dudenhoeffer',\n\t'Glendinning',\n\t'Glomb',\n\t'Heinkel',\n\t'Jiwani',\n\t'Lonigro',\n\t'Machala',\n\t'Marsicano',\n\t'Neuenfeldt',\n\t'Overlock',\n\t'Popko',\n\t'Russomanno',\n\t'Saxer',\n\t'Scicchitano',\n\t'Spiegelberg',\n\t'Spindel',\n\t'Timpone',\n\t'Vincelette',\n\t'Waidelich',\n\t'Wissink',\n\t'Woolstenhulme',\n\t'Danza',\n\t'Sleasman',\n\t'Frometa',\n\t'Savinon',\n\t'Higgerson',\n\t'Helmich',\n\t'Nahar',\n\t'Campus',\n\t'Hassey',\n\t'Mccorkel',\n\t'Tola',\n\t'Ferrington',\n\t'Nicolls',\n\t'Markes',\n\t'Edgley',\n\t'Dupriest',\n\t'Wah',\n\t'Mclester',\n\t'Scantling',\n\t'Goffe',\n\t'Battie',\n\t'Battershell',\n\t'Bearup',\n\t'Bisig',\n\t'Brouillet',\n\t'Canby',\n\t'Chaussee',\n\t'Colandrea',\n\t'Colocho',\n\t'Daube',\n\t'Dobransky',\n\t'Dolbow',\n\t'Dyk',\n\t'Elfrink',\n\t'Figel',\n\t'Hauter',\n\t'Henkels',\n\t'Keillor',\n\t'Kollasch',\n\t'Krabill',\n\t'Kubly',\n\t'Kvasnicka',\n\t'Leise',\n\t'Martirosyan',\n\t'Mihalic',\n\t'Montecinos',\n\t'Myren',\n\t'Okerlund',\n\t'Ozer',\n\t'Rajput',\n\t'Reihl',\n\t'Rimando',\n\t'Saffle',\n\t'Schmelter',\n\t'Tellado',\n\t'Wachsmuth',\n\t'Wussow',\n\t'Zylka',\n\t'Caiola',\n\t'Certo',\n\t'Disabatino',\n\t'Ehrke',\n\t'Lahmann',\n\t'Lamartina',\n\t'Manheim',\n\t'Mckevitt',\n\t'Nardozzi',\n\t'Neuzil',\n\t'Novotney',\n\t'Oldfather',\n\t'Sietsema',\n\t'Stemmler',\n\t'Stumm',\n\t'Ueno',\n\t'Weckwerth',\n\t'Berrocal',\n\t'Nolde',\n\t'Alava',\n\t'Revier',\n\t'Sester',\n\t'Saller',\n\t'Tonga',\n\t'Kala',\n\t'Reveron',\n\t'Homesley',\n\t'Pagett',\n\t'Blackie',\n\t'Raimer',\n\t'Fitt',\n\t'Kimbley',\n\t'Amory',\n\t'Cabler',\n\t'Juett',\n\t'Crate',\n\t'Burres',\n\t'Siddle',\n\t'Barnfield',\n\t'Bordenave',\n\t'Cubit',\n\t'Elem',\n\t'Hardmon',\n\t'Augspurger',\n\t'Barriger',\n\t'Bau',\n\t'Bloomingdale',\n\t'Busta',\n\t'Canoy',\n\t'Carapia',\n\t'Cavenaugh',\n\t'Conkin',\n\t'Coppernoll',\n\t'Daloia',\n\t'Debruyne',\n\t'Egly',\n\t'Esmail',\n\t'Estorga',\n\t'Gladu',\n\t'Gladue',\n\t'Harvath',\n\t'Hirschmann',\n\t'Juel',\n\t'Kappus',\n\t'Kopriva',\n\t'Krul',\n\t'Lavorgna',\n\t'Maginn',\n\t'Malphrus',\n\t'Mcilhenny',\n\t'Perazzo',\n\t'Peredo',\n\t'Pineo',\n\t'Rigoni',\n\t'Robleto',\n\t'Schoene',\n\t'Sevillano',\n\t'Stears',\n\t'Stoltzfoos',\n\t'Sutley',\n\t'Terracciano',\n\t'Villacres',\n\t'Yoak',\n\t'Brensinger',\n\t'Brodzinski',\n\t'Cordial',\n\t'Cornacchia',\n\t'Corralejo',\n\t'Demarchi',\n\t'Dziuk',\n\t'Hirzel',\n\t'Keirns',\n\t'Kocourek',\n\t'Kupec',\n\t'Nazaryan',\n\t'Oftedahl',\n\t'Pignatelli',\n\t'Pundt',\n\t'Repinski',\n\t'Ryther',\n\t'Sampedro',\n\t'Shemanski',\n\t'Siess',\n\t'Trettel',\n\t'Urquilla',\n\t'Vantil',\n\t'Vicens',\n\t'Dunahoo',\n\t'Safer',\n\t'Romaniello',\n\t'Tallo',\n\t'Cavell',\n\t'Cobern',\n\t'Yarrow',\n\t'Serge',\n\t'Adel',\n\t'Allum',\n\t'Pruit',\n\t'Wali',\n\t'Forson',\n\t'Bells',\n\t'Blyden',\n\t'Andreotti',\n\t'Bagnato',\n\t'Beauchaine',\n\t'Biedrzycki',\n\t'Brabo',\n\t'Brodman',\n\t'Bruyere',\n\t'Canizares',\n\t'Chio',\n\t'Coudriet',\n\t'Dara',\n\t'Dhawan',\n\t'Diclemente',\n\t'Doro',\n\t'Elvir',\n\t'Fivecoat',\n\t'Frate',\n\t'Furuya',\n\t'Greis',\n\t'Halbleib',\n\t'Heuerman',\n\t'Hoener',\n\t'Holberg',\n\t'Hoogendoorn',\n\t'Inclan',\n\t'Jokinen',\n\t'Kretchmer',\n\t'Lafromboise',\n\t'Mccomsey',\n\t'Mckiddy',\n\t'Pelky',\n\t'Plaia',\n\t'Ponti',\n\t'Reichl',\n\t'Schicker',\n\t'Sotto',\n\t'Staehle',\n\t'Thau',\n\t'Turchin',\n\t'Zill',\n\t'Aicher',\n\t'Arrigoni',\n\t'Bertagnolli',\n\t'Binetti',\n\t'Dahlheimer',\n\t'Delashmit',\n\t'Disque',\n\t'Hemmerling',\n\t'Hovater',\n\t'Kachur',\n\t'Massmann',\n\t'Schlup',\n\t'Turkovich',\n\t'Underberg',\n\t'Wambolt',\n\t'Vassey',\n\t'Larney',\n\t'Brisky',\n\t'Minas',\n\t'Kata',\n\t'Magar',\n\t'Arlen',\n\t'Corporan',\n\t'Westland',\n\t'Detherage',\n\t'Reen',\n\t'Morale',\n\t'Hoes',\n\t'Baynham',\n\t'Norrington',\n\t'Lartigue',\n\t'Hakeem',\n\t'Kendrix',\n\t'Cazeau',\n\t'Amadi',\n\t'Mczeal',\n\t'Alwin',\n\t'Barcellos',\n\t'Bastedo',\n\t'Bintz',\n\t'Brackenbury',\n\t'Brockel',\n\t'Bucek',\n\t'Cecala',\n\t'Dapper',\n\t'Dettore',\n\t'Dowdall',\n\t'Dralle',\n\t'Essenmacher',\n\t'Evaristo',\n\t'Fecher',\n\t'Feldmeier',\n\t'Fetherston',\n\t'Futterman',\n\t'Garlinghouse',\n\t'Germani',\n\t'Gotz',\n\t'Hoen',\n\t'Janikowski',\n\t'Kiess',\n\t'Lagerstrom',\n\t'Lozinski',\n\t'Magnone',\n\t'Markow',\n\t'Mayall',\n\t'Mehdi',\n\t'Mineau',\n\t'Morgenroth',\n\t'Nitzsche',\n\t'Nordell',\n\t'Pavlock',\n\t'Peruzzi',\n\t'Pettine',\n\t'Pinos',\n\t'Polidoro',\n\t'Rahl',\n\t'Rudis',\n\t'Ryback',\n\t'Santellan',\n\t'Scharfenberg',\n\t'Schnake',\n\t'Schwake',\n\t'Seeling',\n\t'Senk',\n\t'Siron',\n\t'Speich',\n\t'Summerhays',\n\t'Torno',\n\t'Vangieson',\n\t'Wiacek',\n\t'Begnoche',\n\t'Carrejo',\n\t'Chervenak',\n\t'Edminster',\n\t'Halonen',\n\t'Macumber',\n\t'Mazeika',\n\t'Mikami',\n\t'Minetti',\n\t'Mosbrucker',\n\t'Mundis',\n\t'Onder',\n\t'Prowant',\n\t'Pyo',\n\t'Sedlack',\n\t'Stanbro',\n\t'Woehl',\n\t'Wrage',\n\t'Carpentieri',\n\t'Guedry',\n\t'Hodde',\n\t'Waggy',\n\t'Weitman',\n\t'Handal',\n\t'Gosman',\n\t'Mckeone',\n\t'Oliveria',\n\t'Soutar',\n\t'Glance',\n\t'Surprise',\n\t'Milius',\n\t'Crammer',\n\t'Mclear',\n\t'Borris',\n\t'Malon',\n\t'Mane',\n\t'Arrick',\n\t'Brazzel',\n\t'Matthewson',\n\t'Philemon',\n\t'Selvy',\n\t'Lites',\n\t'Deadwyler',\n\t'Marzette',\n\t'Alipio',\n\t'Arancibia',\n\t'Arrona',\n\t'Basista',\n\t'Blethen',\n\t'Brull',\n\t'Colaianni',\n\t'Dreese',\n\t'Giammona',\n\t'Giovanetti',\n\t'Grandmaison',\n\t'Grondahl',\n\t'Gulli',\n\t'Hellenbrand',\n\t'Iturbe',\n\t'Koesters',\n\t'Kondracki',\n\t'Konitzer',\n\t'Kubic',\n\t'Lauerman',\n\t'Mcfadin',\n\t'Musquiz',\n\t'Papalia',\n\t'Porrazzo',\n\t'Prien',\n\t'Reichley',\n\t'Treichler',\n\t'Ursua',\n\t'Vanblaricom',\n\t'Wich',\n\t'Windler',\n\t'Wos',\n\t'Zampino',\n\t'Alexopoulos',\n\t'Bambrick',\n\t'Beabout',\n\t'Brechtel',\n\t'Buroker',\n\t'Dahler',\n\t'Everding',\n\t'Furno',\n\t'Gikas',\n\t'Gilkeson',\n\t'Hubka',\n\t'Konwinski',\n\t'Krisko',\n\t'Kuligowski',\n\t'Maltbie',\n\t'Molstad',\n\t'Nonnemacher',\n\t'Nowotny',\n\t'Odisho',\n\t'Remsburg',\n\t'Rollyson',\n\t'Siegmann',\n\t'Slaubaugh',\n\t'Wasco',\n\t'Carlyon',\n\t'Chanin',\n\t'Cominsky',\n\t'Karber',\n\t'Aynes',\n\t'Swamy',\n\t'Kolden',\n\t'Rochel',\n\t'Julin',\n\t'Demarcus',\n\t'Malena',\n\t'Morice',\n\t'Burst',\n\t'Sukhu',\n\t'Mccravy',\n\t'Rinehardt',\n\t'Veazie',\n\t'Isaiah',\n\t'Bradby',\n\t'Poellnitz',\n\t'Agyemang',\n\t'Agate',\n\t'Aschoff',\n\t'Beenken',\n\t'Bogenschutz',\n\t'Casamento',\n\t'Correira',\n\t'Ebers',\n\t'Ellertson',\n\t'Forcum',\n\t'Gortney',\n\t'Jarriel',\n\t'Jasmer',\n\t'Kennebeck',\n\t'Kimpton',\n\t'Lad',\n\t'Lasek',\n\t'Licavoli',\n\t'Lipper',\n\t'Luedecke',\n\t'Maqueda',\n\t'Matsen',\n\t'Mest',\n\t'Neang',\n\t'Neault',\n\t'Newlun',\n\t'Oetken',\n\t'Rodick',\n\t'Rollinger',\n\t'Sabins',\n\t'Schalow',\n\t'Sheils',\n\t'Spilde',\n\t'Virzi',\n\t'Watz',\n\t'Wehrly',\n\t'Boscarino',\n\t'Chavolla',\n\t'Dasaro',\n\t'Eisenbach',\n\t'Ignatowski',\n\t'Kievit',\n\t'Kuzminski',\n\t'Lickliter',\n\t'Moravek',\n\t'Pawling',\n\t'Prause',\n\t'Redler',\n\t'Wunschel',\n\t'Suchanek',\n\t'Eyring',\n\t'Loge',\n\t'Tout',\n\t'Fross',\n\t'Swiss',\n\t'Deforrest',\n\t'Umphlett',\n\t'Herran',\n\t'Matton',\n\t'Passe',\n\t'Ode',\n\t'Della',\n\t'Caillier',\n\t'Baten',\n\t'Chesterfield',\n\t'Odneal',\n\t'Azeez',\n\t'Salami',\n\t'Ramson',\n\t'Mcvea',\n\t'Pittmon',\n\t'Cheatom',\n\t'Dorsainvil',\n\t'Cheeseboro',\n\t'Lavalais',\n\t'Allegro',\n\t'Bressi',\n\t'Brocklehurst',\n\t'Cassarino',\n\t'Dario',\n\t'Gazzola',\n\t'Glinka',\n\t'Goffredo',\n\t'Halabi',\n\t'Kroeze',\n\t'Lenig',\n\t'Marciel',\n\t'Marcussen',\n\t'Massoni',\n\t'Mayernik',\n\t'Nawrot',\n\t'Palazzi',\n\t'Pfefferkorn',\n\t'Placeres',\n\t'Polimeni',\n\t'Recendiz',\n\t'Sawdey',\n\t'Seidell',\n\t'Suchecki',\n\t'Titzer',\n\t'Virag',\n\t'Vitulli',\n\t'Wiltfong',\n\t'Wolden',\n\t'Woolworth',\n\t'Yandow',\n\t'Zeiter',\n\t'Zogg',\n\t'Brosh',\n\t'Dunsmoor',\n\t'Gucciardo',\n\t'Gumz',\n\t'Luginbill',\n\t'Mathwig',\n\t'Pannullo',\n\t'Raitt',\n\t'Reutzel',\n\t'Sonnen',\n\t'Bahri',\n\t'Guiffre',\n\t'Hons',\n\t'Platner',\n\t'Balaguer',\n\t'Lapre',\n\t'Rabbani',\n\t'Talent',\n\t'Hoster',\n\t'Thal',\n\t'Apo',\n\t'Duggin',\n\t'Kirley',\n\t'Burnard',\n\t'Lourie',\n\t'Wilham',\n\t'Craton',\n\t'Griff',\n\t'Falwell',\n\t'Upperman',\n\t'Laverne',\n\t'Wi',\n\t'Foucher',\n\t'Sudberry',\n\t'Oriol',\n\t'Cowens',\n\t'Marshell',\n\t'Chargois',\n\t'Bordley',\n\t'Artale',\n\t'Boeker',\n\t'Cookston',\n\t'Dattilio',\n\t'Dewinter',\n\t'Ditton',\n\t'Droessler',\n\t'Dusch',\n\t'Eltringham',\n\t'Feige',\n\t'Giel',\n\t'Grigas',\n\t'Hannagan',\n\t'Haubner',\n\t'Henzler',\n\t'Kippes',\n\t'Kneebone',\n\t'Lozeau',\n\t'Mallek',\n\t'Mandato',\n\t'Mangiapane',\n\t'Matusek',\n\t'Newgard',\n\t'Notte',\n\t'Purdin',\n\t'Ramaker',\n\t'Reddoch',\n\t'Rensing',\n\t'Rohrman',\n\t'Romm',\n\t'Rudiger',\n\t'Torti',\n\t'Travaglini',\n\t'Uno',\n\t'Wojciak',\n\t'Yannuzzi',\n\t'Zeien',\n\t'Arpino',\n\t'Borgstrom',\n\t'Burkemper',\n\t'Cristino',\n\t'Detjen',\n\t'Gienger',\n\t'Glockner',\n\t'Grillot',\n\t'Jentz',\n\t'Kendzierski',\n\t'Klebe',\n\t'Knippenberg',\n\t'Kusler',\n\t'Olofson',\n\t'Orlov',\n\t'Rindt',\n\t'Stallbaumer',\n\t'Troost',\n\t'Turri',\n\t'Uzelac',\n\t'Weichert',\n\t'Sweazy',\n\t'Alcivar',\n\t'Canner',\n\t'Lottman',\n\t'Salame',\n\t'Berkes',\n\t'Pickren',\n\t'Ganson',\n\t'Odonell',\n\t'Geron',\n\t'Kasa',\n\t'Banbury',\n\t'Tinnel',\n\t'Umble',\n\t'Flow',\n\t'Kirt',\n\t'Rhule',\n\t'Diles',\n\t'Seeney',\n\t'Givans',\n\t'Mckethan',\n\t'Crusoe',\n\t'Darko',\n\t'Mucker',\n\t'Kizzee',\n\t'Daniely',\n\t'Nutall',\n\t'Angove',\n\t'Appelhans',\n\t'Balder',\n\t'Blatchley',\n\t'Botkins',\n\t'Brisk',\n\t'Burandt',\n\t'Clowdus',\n\t'Debauche',\n\t'Deily',\n\t'Group',\n\t'Hoecker',\n\t'Holsonback',\n\t'Humpert',\n\t'Jacquin',\n\t'Jurica',\n\t'Karnik',\n\t'Krontz',\n\t'Lapiana',\n\t'Lenzo',\n\t'Luscombe',\n\t'Madey',\n\t'Mirabito',\n\t'Neifert',\n\t'Pennino',\n\t'Piechota',\n\t'Pizzimenti',\n\t'Reeg',\n\t'Roarty',\n\t'Routzahn',\n\t'Salsedo',\n\t'Schuff',\n\t'Silveri',\n\t'Steckman',\n\t'Supak',\n\t'Swackhamer',\n\t'Trusler',\n\t'Vizzini',\n\t'Wences',\n\t'Whelton',\n\t'Zachar',\n\t'Albertsen',\n\t'Bischel',\n\t'Brigandi',\n\t'Campoy',\n\t'Castagnola',\n\t'Doenges',\n\t'Flessner',\n\t'Garbers',\n\t'Jezewski',\n\t'Kozlov',\n\t'Niedbalski',\n\t'Schillo',\n\t'Schoepke',\n\t'Schranz',\n\t'Trulson',\n\t'Vanwyhe',\n\t'Versluis',\n\t'Zavadil',\n\t'Brau',\n\t'Rudell',\n\t'Golen',\n\t'Meter',\n\t'Sherrin',\n\t'Tolly',\n\t'Mandala',\n\t'Calcano',\n\t'Lewing',\n\t'Sedeno',\n\t'Ramalho',\n\t'Haggar',\n\t'Borns',\n\t'Matherson',\n\t'Cobin',\n\t'Turnley',\n\t'Pone',\n\t'Tuner',\n\t'Crandle',\n\t'Sturkey',\n\t'Heggins',\n\t'Tisby',\n\t'Allbaugh',\n\t'Baars',\n\t'Bethard',\n\t'Brenizer',\n\t'Bussman',\n\t'Casebier',\n\t'Castanos',\n\t'Climaco',\n\t'Dux',\n\t'Farrens',\n\t'Frediani',\n\t'Gaccione',\n\t'Garciaperez',\n\t'Hoppa',\n\t'Juckett',\n\t'Klinkner',\n\t'Kooy',\n\t'Krinke',\n\t'Locy',\n\t'Lovecchio',\n\t'Lukin',\n\t'Machia',\n\t'Mand',\n\t'Maslin',\n\t'Mehrotra',\n\t'Nicolet',\n\t'Peyser',\n\t'Reckart',\n\t'Roanhorse',\n\t'Rokicki',\n\t'Sargis',\n\t'Sciullo',\n\t'Shevchuk',\n\t'Sindoni',\n\t'Slankard',\n\t'Sobiech',\n\t'Stoneberger',\n\t'Stys',\n\t'Tuzzolino',\n\t'Waligora',\n\t'Wiland',\n\t'Clabough',\n\t'Drawbaugh',\n\t'Figurski',\n\t'Gibeault',\n\t'Gojcaj',\n\t'Hartfiel',\n\t'Inbody',\n\t'Konarski',\n\t'Kruszka',\n\t'Letarte',\n\t'Lillich',\n\t'Mccandlish',\n\t'Mollenkopf',\n\t'Oltmann',\n\t'Pfenninger',\n\t'Ruediger',\n\t'Schaben',\n\t'Shauger',\n\t'Wilczak',\n\t'Wolanin',\n\t'Ziehm',\n\t'Bassinger',\n\t'Brannick',\n\t'Schlereth',\n\t'Capri',\n\t'Roscher',\n\t'Pasqual',\n\t'Lallo',\n\t'Sweney',\n\t'Rozario',\n\t'Hamblet',\n\t'Muckleroy',\n\t'Frankson',\n\t'Moure',\n\t'Shrieves',\n\t'Bosket',\n\t'Strowbridge',\n\t'Hawkin',\n\t'Cooperwood',\n\t'Agena',\n\t'Barrowman',\n\t'Belko',\n\t'Blasdell',\n\t'Brobeck',\n\t'Chieffo',\n\t'Cooperrider',\n\t'Dickard',\n\t'Erion',\n\t'Fradkin',\n\t'Hattery',\n\t'Hefferon',\n\t'Hofstra',\n\t'Hoiland',\n\t'Jirak',\n\t'Klugman',\n\t'Klundt',\n\t'Knope',\n\t'Lawniczak',\n\t'Luckenbach',\n\t'Manzione',\n\t'Mccombie',\n\t'Minden',\n\t'Mousel',\n\t'Ridling',\n\t'Rightmire',\n\t'Ritzel',\n\t'Santori',\n\t'Semmens',\n\t'Snyders',\n\t'Spargur',\n\t'Staszewski',\n\t'Swiech',\n\t'Tasso',\n\t'Veldhuizen',\n\t'Vuolo',\n\t'Wojnarowski',\n\t'Yoe',\n\t'Bachler',\n\t'Cimo',\n\t'Hippen',\n\t'Klimaszewski',\n\t'Kohlhepp',\n\t'Kovacich',\n\t'Kretsch',\n\t'Lacoursiere',\n\t'Lopezmartinez',\n\t'Marsiglia',\n\t'Metzker',\n\t'Murchie',\n\t'Paradee',\n\t'Pfefferle',\n\t'Rothert',\n\t'Skellenger',\n\t'Tourangeau',\n\t'Beumer',\n\t'Thunder',\n\t'Uden',\n\t'Broe',\n\t'Moxon',\n\t'Kassin',\n\t'Murton',\n\t'Hockley',\n\t'Vinet',\n\t'Suthers',\n\t'Bayman',\n\t'Cokeley',\n\t'Ailey',\n\t'Crossfield',\n\t'Desha',\n\t'Dowson',\n\t'Acheampong',\n\t'Boomsma',\n\t'Buer',\n\t'Caratachea',\n\t'Dascenzo',\n\t'Debes',\n\t'Degroote',\n\t'Dillie',\n\t'Dorsi',\n\t'Dorward',\n\t'Eyestone',\n\t'Geister',\n\t'Gonia',\n\t'Heiler',\n\t'Hin',\n\t'Hoheisel',\n\t'Horger',\n\t'Hulce',\n\t'Kainer',\n\t'Kerkman',\n\t'Kloehn',\n\t'Krempasky',\n\t'Kuehnel',\n\t'Leetch',\n\t'Lio',\n\t'Lohrey',\n\t'Lucchetti',\n\t'Machnik',\n\t'Majeske',\n\t'Martire',\n\t'Mores',\n\t'Oyen',\n\t'Pappert',\n\t'Platas',\n\t'Podany',\n\t'Prata',\n\t'Radoncic',\n\t'Sainato',\n\t'Salada',\n\t'Serota',\n\t'Tatsch',\n\t'Torbeck',\n\t'Vilhauer',\n\t'Waltner',\n\t'Wauters',\n\t'Welge',\n\t'Yoss',\n\t'Bigwood',\n\t'Brunsman',\n\t'Civitello',\n\t'Compston',\n\t'Cuccaro',\n\t'Denholm',\n\t'Emmick',\n\t'Gadzinski',\n\t'Goedken',\n\t'Graumann',\n\t'Hackert',\n\t'Hardacre',\n\t'Hehl',\n\t'Magliocco',\n\t'Marotto',\n\t'Ozanich',\n\t'Pidcock',\n\t'Schlangen',\n\t'Scoma',\n\t'Sobecki',\n\t'Spreng',\n\t'Thalmann',\n\t'Wolfrum',\n\t'Groninger',\n\t'Howatt',\n\t'Kindy',\n\t'Swor',\n\t'Ledden',\n\t'Voyer',\n\t'Colli',\n\t'Andrae',\n\t'Duchemin',\n\t'Boker',\n\t'Malter',\n\t'Snooks',\n\t'Morss',\n\t'Haylett',\n\t'Mitter',\n\t'Fairey',\n\t'Kenerson',\n\t'Albea',\n\t'Ellerson',\n\t'Alcindor',\n\t'Gadison',\n\t'Arabia',\n\t'Bundren',\n\t'Calica',\n\t'Cartaya',\n\t'Cielo',\n\t'Ebbers',\n\t'Entler',\n\t'Friedly',\n\t'Granja',\n\t'Landt',\n\t'Lorensen',\n\t'Michelini',\n\t'Oliveto',\n\t'Piela',\n\t'Reust',\n\t'Roussos',\n\t'Sanluis',\n\t'Seier',\n\t'Sobolik',\n\t'Stader',\n\t'Stetzer',\n\t'Tetley',\n\t'Zirbes',\n\t'Bridenbaugh',\n\t'Chinnici',\n\t'Crabbs',\n\t'Evilsizer',\n\t'Favaloro',\n\t'Haeberle',\n\t'Hopfensperger',\n\t'Kijowski',\n\t'Kingbird',\n\t'Leikam',\n\t'Montavon',\n\t'Petrossian',\n\t'Quizhpi',\n\t'Spoelstra',\n\t'Testani',\n\t'Plaut',\n\t'Windt',\n\t'Dubie',\n\t'Kozinski',\n\t'Sorell',\n\t'Nish',\n\t'Katon',\n\t'Soy',\n\t'Pelcher',\n\t'Sayres',\n\t'Waitman',\n\t'Relph',\n\t'Hearld',\n\t'Farewell',\n\t'Giordani',\n\t'Canida',\n\t'Martian',\n\t'Suliman',\n\t'Mckesson',\n\t'Randon',\n\t'Eastmond',\n\t'Willaims',\n\t'Collington',\n\t'Hardge',\n\t'Asevedo',\n\t'Beauchene',\n\t'Bebeau',\n\t'Bobick',\n\t'Bogacki',\n\t'Bolich',\n\t'Bonadonna',\n\t'Butsch',\n\t'Coltrin',\n\t'Corbello',\n\t'Dastrup',\n\t'Dunshee',\n\t'Firpo',\n\t'Foister',\n\t'Franssen',\n\t'Fredriksen',\n\t'Gfeller',\n\t'Glassner',\n\t'Johanns',\n\t'Korson',\n\t'Langsam',\n\t'Linstrom',\n\t'Longstaff',\n\t'Lukic',\n\t'Maler',\n\t'Marteney',\n\t'Milardo',\n\t'Rhatigan',\n\t'Ruetz',\n\t'Semel',\n\t'Senske',\n\t'Shatswell',\n\t'Simmering',\n\t'Tasch',\n\t'Vanskike',\n\t'Verano',\n\t'Viscardi',\n\t'Weidmann',\n\t'Doubet',\n\t'Farraj',\n\t'Fritter',\n\t'Griesinger',\n\t'Horkey',\n\t'Hornik',\n\t'Izatt',\n\t'Klayman',\n\t'Mantei',\n\t'Notz',\n\t'Oberholzer',\n\t'Petko',\n\t'Rueth',\n\t'Rygiel',\n\t'Tumolo',\n\t'Unterreiner',\n\t'Urgo',\n\t'Weisbecker',\n\t'Weniger',\n\t'Zarro',\n\t'Zunino',\n\t'Goldmann',\n\t'Verderber',\n\t'Glennie',\n\t'Shere',\n\t'Lamos',\n\t'Face',\n\t'Sparger',\n\t'Donnay',\n\t'Kage',\n\t'Leason',\n\t'Mcgue',\n\t'Brickle',\n\t'Mae',\n\t'Thomaston',\n\t'Dunnell',\n\t'Tillie',\n\t'Miggins',\n\t'Geffrard',\n\t'Aubel',\n\t'Backe',\n\t'Beaumier',\n\t'Bloor',\n\t'Brackbill',\n\t'Brandvold',\n\t'Bylund',\n\t'Carbary',\n\t'Catrambone',\n\t'Dapolito',\n\t'Dillenburg',\n\t'Elliff',\n\t'Fehnel',\n\t'Ferriss',\n\t'Gellner',\n\t'Graw',\n\t'Guilbeault',\n\t'Hautala',\n\t'Hollenberg',\n\t'Imparato',\n\t'Kaner',\n\t'Kley',\n\t'Lanzer',\n\t'Laterza',\n\t'Legner',\n\t'Lombardozzi',\n\t'Mcerlean',\n\t'Mcgilton',\n\t'Mohring',\n\t'Neeper',\n\t'Pollinger',\n\t'Pullara',\n\t'Sagona',\n\t'Scripter',\n\t'Skillen',\n\t'Streeper',\n\t'Tritch',\n\t'Vayda',\n\t'Verbeek',\n\t'Wenberg',\n\t'Youngers',\n\t'Bayus',\n\t'Cobaugh',\n\t'Dolak',\n\t'Forys',\n\t'Genther',\n\t'Jankovich',\n\t'Kneale',\n\t'Komp',\n\t'Kreher',\n\t'Kuwahara',\n\t'Mclouth',\n\t'Melland',\n\t'Molesky',\n\t'Neustadt',\n\t'Oesterling',\n\t'Quirke',\n\t'Roeper',\n\t'Stantz',\n\t'Vandenboom',\n\t'Venhuizen',\n\t'Westermeyer',\n\t'Embury',\n\t'Cozort',\n\t'Crispo',\n\t'Woollard',\n\t'Thiery',\n\t'Lecy',\n\t'Terris',\n\t'Stencil',\n\t'Yero',\n\t'Bollard',\n\t'Chander',\n\t'Shepp',\n\t'Younkins',\n\t'Jon',\n\t'Anselm',\n\t'Deveraux',\n\t'Better',\n\t'Birth',\n\t'Hoskie',\n\t'Kirtz',\n\t'Encalade',\n\t'Aprea',\n\t'Bernick',\n\t'Bialy',\n\t'Bolenbaugh',\n\t'Chinea',\n\t'Cwiklinski',\n\t'Dunavan',\n\t'Dunckel',\n\t'Essen',\n\t'Ferner',\n\t'Gallick',\n\t'Gruba',\n\t'Hauss',\n\t'Intriago',\n\t'Javaid',\n\t'Kaney',\n\t'Klemens',\n\t'Kuriakose',\n\t'Leyda',\n\t'Losurdo',\n\t'Mcelhone',\n\t'Methot',\n\t'Morioka',\n\t'Mundorf',\n\t'Nocito',\n\t'Nordmann',\n\t'Oommen',\n\t'Pfahl',\n\t'Piquette',\n\t'Prinsen',\n\t'Sacramento',\n\t'Shenker',\n\t'Skidgel',\n\t'Sobalvarro',\n\t'Soldo',\n\t'Synan',\n\t'Tostenson',\n\t'Trotti',\n\t'Vienneau',\n\t'Vigneau',\n\t'Waitkus',\n\t'Wiess',\n\t'Bartmess',\n\t'Comparan',\n\t'Dalonzo',\n\t'Dutrow',\n\t'Fleegle',\n\t'Fronek',\n\t'Handrich',\n\t'Hazelip',\n\t'Heinig',\n\t'Macapagal',\n\t'Masciarelli',\n\t'Pitstick',\n\t'Radakovich',\n\t'Ripberger',\n\t'Schwebel',\n\t'Slomski',\n\t'Stinchfield',\n\t'Zegers',\n\t'Zeiser',\n\t'Kimmer',\n\t'Rippon',\n\t'Satz',\n\t'Bosques',\n\t'Mcnickle',\n\t'Yarwood',\n\t'Babar',\n\t'Ghazi',\n\t'Mcquary',\n\t'Africa',\n\t'Sofer',\n\t'Marsland',\n\t'Curby',\n\t'Odor',\n\t'Gillem',\n\t'Selmer',\n\t'Delmas',\n\t'Lamison',\n\t'Lanes',\n\t'Shadd',\n\t'Goard',\n\t'Haylock',\n\t'Sermon',\n\t'Meachem',\n\t'Vernet',\n\t'Akiona',\n\t'Avitabile',\n\t'Berkson',\n\t'Bisono',\n\t'Busic',\n\t'Caroselli',\n\t'Corradi',\n\t'Delval',\n\t'Egley',\n\t'Elkind',\n\t'Everling',\n\t'Ferrario',\n\t'Frumkin',\n\t'Gelder',\n\t'Gironda',\n\t'Glasheen',\n\t'Goette',\n\t'Gotts',\n\t'Haub',\n\t'Herro',\n\t'Hudzik',\n\t'Hula',\n\t'Inboden',\n\t'Isensee',\n\t'Kiesewetter',\n\t'Koetje',\n\t'Laughridge',\n\t'Lovewell',\n\t'Meeuwsen',\n\t'Mokry',\n\t'Navarez',\n\t'Plake',\n\t'Quain',\n\t'Reppucci',\n\t'Sorn',\n\t'Tallerico',\n\t'Uselman',\n\t'Verrastro',\n\t'Wineberg',\n\t'Blazina',\n\t'Falardeau',\n\t'Garavito',\n\t'Gellerman',\n\t'Havins',\n\t'Kurdziel',\n\t'Liedel',\n\t'Lofstrom',\n\t'Pakula',\n\t'Presby',\n\t'Ringstad',\n\t'Rokosz',\n\t'Schuchart',\n\t'Seckler',\n\t'Verderame',\n\t'Veselka',\n\t'Asfour',\n\t'Delanoy',\n\t'Fromer',\n\t'Koba',\n\t'Kostrzewa',\n\t'Melle',\n\t'Merkey',\n\t'Scalese',\n\t'Oritz',\n\t'Kilgour',\n\t'Piker',\n\t'Janet',\n\t'Huge',\n\t'Hails',\n\t'Dobey',\n\t'Escoe',\n\t'Rasool',\n\t'Gilcrest',\n\t'Codrington',\n\t'Jeangilles',\n\t'Outley',\n\t'Bambach',\n\t'Beaulac',\n\t'Begue',\n\t'Bobeck',\n\t'Buccino',\n\t'Carrigg',\n\t'Cranney',\n\t'Denninger',\n\t'Dicioccio',\n\t'Eapen',\n\t'Fargnoli',\n\t'Fatica',\n\t'Fernicola',\n\t'Forse',\n\t'Freck',\n\t'Gardipee',\n\t'Gibas',\n\t'Goeman',\n\t'Guadian',\n\t'Hlad',\n\t'Jakab',\n\t'Kishimoto',\n\t'Krenn',\n\t'Lagesse',\n\t'Lhommedieu',\n\t'Lusch',\n\t'Mausolf',\n\t'Mazzocchi',\n\t'Mcdavitt',\n\t'Noseworthy',\n\t'Passante',\n\t'Placzek',\n\t'Quamme',\n\t'Ringgenberg',\n\t'Spiegelman',\n\t'Vinluan',\n\t'Wachsman',\n\t'Bacigalupi',\n\t'Baechle',\n\t'Baetz',\n\t'Barsch',\n\t'Colbaugh',\n\t'Devoto',\n\t'Dimercurio',\n\t'Dosanjh',\n\t'Dukeman',\n\t'Ferger',\n\t'Garinger',\n\t'Grelle',\n\t'Guyett',\n\t'Harpenau',\n\t'Hundal',\n\t'Kamerer',\n\t'Klomp',\n\t'Licklider',\n\t'Martinec',\n\t'Matzek',\n\t'Nixdorf',\n\t'Pankonin',\n\t'Pogosyan',\n\t'Schweickert',\n\t'Smethurst',\n\t'Stroope',\n\t'Zwack',\n\t'Tebbetts',\n\t'Stains',\n\t'Tosado',\n\t'Carles',\n\t'Rings',\n\t'Hebard',\n\t'Choplin',\n\t'Townshend',\n\t'Doorn',\n\t'Aja',\n\t'Picking',\n\t'Oneall',\n\t'Logie',\n\t'Aro',\n\t'Dua',\n\t'Heney',\n\t'Manard',\n\t'Atchinson',\n\t'Breech',\n\t'Brashers',\n\t'Addams',\n\t'Nooner',\n\t'Barsh',\n\t'Orum',\n\t'Dancey',\n\t'Bamba',\n\t'Kareem',\n\t'Theard',\n\t'Marseille',\n\t'Molette',\n\t'Getachew',\n\t'Saintfleur',\n\t'Frimpong',\n\t'Anglada',\n\t'Attardo',\n\t'Barreira',\n\t'Bleicher',\n\t'Bonecutter',\n\t'Bricco',\n\t'Compian',\n\t'Creppel',\n\t'Cuadras',\n\t'Cuccio',\n\t'Cutsforth',\n\t'Dinino',\n\t'Eskelson',\n\t'Freemyer',\n\t'Friedhoff',\n\t'Grandt',\n\t'Holzmann',\n\t'Hoverson',\n\t'Hurteau',\n\t'Iacona',\n\t'Jergens',\n\t'Kingham',\n\t'Leiterman',\n\t'Leugers',\n\t'Leyh',\n\t'Lotti',\n\t'Majkowski',\n\t'Mossberg',\n\t'Nuffer',\n\t'Oaxaca',\n\t'Pagenkopf',\n\t'Paille',\n\t'Petzoldt',\n\t'Rogalla',\n\t'Siddens',\n\t'Siddoway',\n\t'Spatafora',\n\t'Tufo',\n\t'Weismann',\n\t'Werntz',\n\t'Wilz',\n\t'Ammirati',\n\t'Benninghoff',\n\t'Escarsega',\n\t'Fessel',\n\t'Hurless',\n\t'Jastrzebski',\n\t'Klingerman',\n\t'Kurilla',\n\t'Kuzmin',\n\t'Meserole',\n\t'Politz',\n\t'Pollino',\n\t'Rettke',\n\t'Sinay',\n\t'Strebeck',\n\t'Strycharz',\n\t'Suhre',\n\t'Thumm',\n\t'Trybus',\n\t'Uhrin',\n\t'Weisberger',\n\t'Zeger',\n\t'Carringer',\n\t'Sitts',\n\t'Lungren',\n\t'Iiams',\n\t'Sudbury',\n\t'Surrette',\n\t'Chellis',\n\t'Yore',\n\t'Joice',\n\t'Foot',\n\t'Ausley',\n\t'Scioneaux',\n\t'Mcaffee',\n\t'Pinn',\n\t'Maina',\n\t'Dorce',\n\t'Agrusa',\n\t'Albornoz',\n\t'Arave',\n\t'Bacallao',\n\t'Bendavid',\n\t'Bochner',\n\t'Bortle',\n\t'Carragher',\n\t'Chalfin',\n\t'Courtade',\n\t'Dagle',\n\t'Debuhr',\n\t'Fowble',\n\t'Galinsky',\n\t'Hardigree',\n\t'Haulk',\n\t'Hendron',\n\t'Herringshaw',\n\t'Jayaraman',\n\t'Koestler',\n\t'Konicek',\n\t'Kutscher',\n\t'Lachowicz',\n\t'Lafauci',\n\t'Lansky',\n\t'Lazarski',\n\t'Lolli',\n\t'Ludvigsen',\n\t'Manternach',\n\t'Martorelli',\n\t'Mcquillin',\n\t'Mikaelian',\n\t'Northcraft',\n\t'Nyborg',\n\t'Palone',\n\t'Peckman',\n\t'Schwebach',\n\t'Simbeck',\n\t'Sittler',\n\t'Udovich',\n\t'Viesca',\n\t'Yazell',\n\t'Zimmers',\n\t'Bielen',\n\t'Cohron',\n\t'Dearcos',\n\t'Feezor',\n\t'Hilgart',\n\t'Karriker',\n\t'Klingberg',\n\t'Leisenring',\n\t'Napora',\n\t'Nedved',\n\t'Okeson',\n\t'Seratt',\n\t'Trautner',\n\t'Trimarco',\n\t'Turkel',\n\t'Bronder',\n\t'Itani',\n\t'Verona',\n\t'Blackbird',\n\t'Laque',\n\t'Karpel',\n\t'Louro',\n\t'Hamson',\n\t'Ashland',\n\t'Gruel',\n\t'Breer',\n\t'Wesely',\n\t'Bebo',\n\t'Conery',\n\t'Mccarry',\n\t'Cradic',\n\t'Aytes',\n\t'Dikes',\n\t'Soltau',\n\t'Debois',\n\t'Berko',\n\t'Callins',\n\t'Anastacio',\n\t'Balbi',\n\t'Bata',\n\t'Bechel',\n\t'Borsuk',\n\t'Chihuahua',\n\t'Cindric',\n\t'Denapoli',\n\t'Dotzler',\n\t'Dusing',\n\t'Dziekan',\n\t'Eifler',\n\t'Franchino',\n\t'Garritano',\n\t'Herrarte',\n\t'Jaskot',\n\t'Kettell',\n\t'Kingsford',\n\t'Marsters',\n\t'Oshel',\n\t'Overacker',\n\t'Pagliarulo',\n\t'Pannier',\n\t'Pyun',\n\t'Rardon',\n\t'Reville',\n\t'Rogozinski',\n\t'Scatena',\n\t'Schoeppner',\n\t'Senkbeil',\n\t'Silkey',\n\t'Takhar',\n\t'Whitebread',\n\t'Wiech',\n\t'Adelsberger',\n\t'Aslinger',\n\t'Bhattacharyya',\n\t'Brege',\n\t'Burright',\n\t'Cafarella',\n\t'Chlebowski',\n\t'Decaprio',\n\t'Dilello',\n\t'Dresher',\n\t'Finkbiner',\n\t'Gerlich',\n\t'Ignasiak',\n\t'Kataoka',\n\t'Kearl',\n\t'Pingitore',\n\t'Sellick',\n\t'Sinning',\n\t'Stojanovic',\n\t'Vanasten',\n\t'Vanluven',\n\t'Westerfeld',\n\t'Mahala',\n\t'Biancardi',\n\t'Velardo',\n\t'Payes',\n\t'Debello',\n\t'Kyes',\n\t'Reever',\n\t'Joung',\n\t'Coran',\n\t'Perrow',\n\t'Linzer',\n\t'Birchett',\n\t'Poles',\n\t'Cajuste',\n\t'Albergo',\n\t'Andal',\n\t'Belaire',\n\t'Borell',\n\t'Bruehl',\n\t'Celani',\n\t'Cerruti',\n\t'Crellin',\n\t'Delcarlo',\n\t'Dubach',\n\t'Elicker',\n\t'Fialkowski',\n\t'Ganim',\n\t'Gladieux',\n\t'Glendening',\n\t'Glomski',\n\t'Kalp',\n\t'Kavan',\n\t'Kawabata',\n\t'Kever',\n\t'Kisch',\n\t'Maiorino',\n\t'Masaki',\n\t'Mcgeough',\n\t'Miyoshi',\n\t'Nand',\n\t'Nitka',\n\t'Novakovich',\n\t'Penagos',\n\t'Pierini',\n\t'Rassi',\n\t'Rorke',\n\t'Rosenboom',\n\t'Rossmann',\n\t'Scarfone',\n\t'Scarsella',\n\t'Siedschlag',\n\t'Sobotta',\n\t'Studnicka',\n\t'Teeling',\n\t'Tegtmeyer',\n\t'Woznick',\n\t'Beske',\n\t'Dersch',\n\t'Deschepper',\n\t'Duffner',\n\t'Geroux',\n\t'Lindvall',\n\t'Linnemann',\n\t'Roethler',\n\t'Scanlin',\n\t'Schaecher',\n\t'Schmude',\n\t'Schwertner',\n\t'Shimamoto',\n\t'Stratmann',\n\t'Stufflebean',\n\t'Ulatowski',\n\t'Witkop',\n\t'Landrus',\n\t'Sahin',\n\t'Araque',\n\t'Massett',\n\t'Meanor',\n\t'Sebo',\n\t'Delic',\n\t'Bryand',\n\t'Frederico',\n\t'Portuondo',\n\t'Verry',\n\t'Browe',\n\t'Winecoff',\n\t'Gipp',\n\t'Khamis',\n\t'Ingrum',\n\t'Gilliand',\n\t'Poinsett',\n\t'Hagley',\n\t'Valliant',\n\t'Henly',\n\t'Bingley',\n\t'Romulus',\n\t'Moyd',\n\t'Abascal',\n\t'Adelstein',\n\t'Arabian',\n\t'Barcelos',\n\t'Barot',\n\t'Cabacungan',\n\t'Darco',\n\t'Dickmeyer',\n\t'Gindi',\n\t'Grone',\n\t'Haberland',\n\t'Hachem',\n\t'Humbarger',\n\t'Insco',\n\t'Kravchuk',\n\t'Mackowski',\n\t'Madrazo',\n\t'Malesky',\n\t'Markowicz',\n\t'Mcconnon',\n\t'Meiring',\n\t'Micalizzi',\n\t'Moeser',\n\t'Mortier',\n\t'Muegge',\n\t'Ollar',\n\t'Pamperin',\n\t'Pusch',\n\t'Remache',\n\t'Roginski',\n\t'Rothbauer',\n\t'Sellin',\n\t'Stachurski',\n\t'Stelmack',\n\t'Suprenant',\n\t'Totzke',\n\t'Uemura',\n\t'Vandercook',\n\t'Yott',\n\t'Zaher',\n\t'Autio',\n\t'Barnhard',\n\t'Brys',\n\t'Chisenhall',\n\t'Deiters',\n\t'Fetsko',\n\t'Finzel',\n\t'Gangwer',\n\t'Grygiel',\n\t'Heidelberger',\n\t'Kommer',\n\t'Latchford',\n\t'Liszka',\n\t'Mcconaha',\n\t'Miazga',\n\t'Nettesheim',\n\t'Oelschlager',\n\t'Rafuse',\n\t'Reichow',\n\t'Santosuosso',\n\t'Sebastiani',\n\t'Serratore',\n\t'Spenner',\n\t'Steffenson',\n\t'Strehl',\n\t'Tropeano',\n\t'Vanstraten',\n\t'Vegh',\n\t'Virrueta',\n\t'Wilhide',\n\t'Prey',\n\t'Ullmer',\n\t'Ferraz',\n\t'Mazor',\n\t'Vinje',\n\t'Mory',\n\t'Rody',\n\t'Dowen',\n\t'Bord',\n\t'Rajkumar',\n\t'Qadir',\n\t'Turbin',\n\t'Rorex',\n\t'Wilmott',\n\t'Grandpre',\n\t'Bucker',\n\t'Reasonover',\n\t'Holoman',\n\t'Mustapha',\n\t'Warsame',\n\t'Laday',\n\t'Whack',\n\t'Blahut',\n\t'Boxell',\n\t'Britnell',\n\t'Buehl',\n\t'Burri',\n\t'Cesaro',\n\t'Degrand',\n\t'Demetro',\n\t'Fadeley',\n\t'Fischel',\n\t'Florer',\n\t'Givler',\n\t'Gockley',\n\t'Iuliano',\n\t'Koral',\n\t'Kotlarz',\n\t'Kraai',\n\t'Kvamme',\n\t'Latchaw',\n\t'Lopeman',\n\t'Manocchio',\n\t'Martinezgarcia',\n\t'Minehart',\n\t'Narasimhan',\n\t'Nier',\n\t'Niziolek',\n\t'Oliff',\n\t'Piascik',\n\t'Pitera',\n\t'Pronovost',\n\t'Roseboom',\n\t'Rosevear',\n\t'Runkles',\n\t'Santmyer',\n\t'Skillin',\n\t'Stamas',\n\t'Storbeck',\n\t'Teicher',\n\t'Titterington',\n\t'Tomkinson',\n\t'Tzeng',\n\t'Vukovic',\n\t'Wescoat',\n\t'Algeo',\n\t'Aronow',\n\t'Balbach',\n\t'Brockbank',\n\t'Caloca',\n\t'Caughlin',\n\t'Devincenzi',\n\t'Doetsch',\n\t'Filby',\n\t'Godar',\n\t'Keeven',\n\t'Marchetta',\n\t'Quiram',\n\t'Rudeen',\n\t'Siemen',\n\t'Suderman',\n\t'Tacke',\n\t'Walby',\n\t'Fram',\n\t'Maccarthy',\n\t'Fana',\n\t'Kimberley',\n\t'Richens',\n\t'Doser',\n\t'Bigford',\n\t'Brazie',\n\t'Haroon',\n\t'Mcginniss',\n\t'Knipfer',\n\t'Seltz',\n\t'Laton',\n\t'Balow',\n\t'Cramp',\n\t'Edger',\n\t'Alonge',\n\t'Beagles',\n\t'Ken',\n\t'Peary',\n\t'Lifsey',\n\t'Acy',\n\t'Lightbourne',\n\t'Antwi',\n\t'Arntzen',\n\t'Bracknell',\n\t'Brewbaker',\n\t'Carville',\n\t'Cinquemani',\n\t'Corales',\n\t'Corgan',\n\t'Craze',\n\t'Dechristopher',\n\t'Eltzroth',\n\t'Fjelstad',\n\t'Forinash',\n\t'Gudenkauf',\n\t'Hapeman',\n\t'Hassing',\n\t'Hurm',\n\t'Jaurigue',\n\t'Kneisel',\n\t'Kulwicki',\n\t'Lookingbill',\n\t'Moist',\n\t'Naderi',\n\t'Nicoli',\n\t'Nicoson',\n\t'Olvey',\n\t'Remaly',\n\t'Stare',\n\t'Steinruck',\n\t'Switala',\n\t'Tada',\n\t'Toves',\n\t'Traber',\n\t'Tuohey',\n\t'Venti',\n\t'Vinal',\n\t'Wahle',\n\t'Yarosh',\n\t'Balinski',\n\t'Bauknecht',\n\t'Bernauer',\n\t'Bink',\n\t'Chudzik',\n\t'Coppess',\n\t'Corrick',\n\t'Gruener',\n\t'Kutter',\n\t'Malkiewicz',\n\t'Marking',\n\t'Mcgrain',\n\t'Melberg',\n\t'Ohmann',\n\t'Pellicane',\n\t'Regehr',\n\t'Schmoldt',\n\t'Schmuhl',\n\t'Starmer',\n\t'Stiens',\n\t'Whilden',\n\t'Yearick',\n\t'Desmith',\n\t'Habiger',\n\t'Papay',\n\t'Study',\n\t'Toot',\n\t'Franzoni',\n\t'Neuhoff',\n\t'Boreman',\n\t'Sayas',\n\t'Hinks',\n\t'Dax',\n\t'Sasnett',\n\t'Hannis',\n\t'Rotan',\n\t'Haze',\n\t'Jennifer',\n\t'Barganier',\n\t'Milson',\n\t'Kinnie',\n\t'Boyde',\n\t'Dyce',\n\t'Cuttino',\n\t'Neals',\n\t'Mccovery',\n\t'Abaya',\n\t'Balz',\n\t'Bezold',\n\t'Breighner',\n\t'Buttacavoli',\n\t'Cattani',\n\t'Detzel',\n\t'Douthat',\n\t'Dunay',\n\t'Eicholtz',\n\t'Eirich',\n\t'Felkner',\n\t'Friedenberg',\n\t'Haskew',\n\t'Henes',\n\t'Jamroz',\n\t'Kelter',\n\t'Kutzer',\n\t'Laughner',\n\t'Livoti',\n\t'Magistro',\n\t'Makinson',\n\t'Manwell',\n\t'Mckimmy',\n\t'Mcwethy',\n\t'Pacholski',\n\t'Pankau',\n\t'Poh',\n\t'Purewal',\n\t'Remedios',\n\t'Ringuette',\n\t'Rocchi',\n\t'Rojero',\n\t'Sabina',\n\t'Schiffner',\n\t'Sellen',\n\t'Setaro',\n\t'Soledad',\n\t'Stoermer',\n\t'Tal',\n\t'Vanwyk',\n\t'Waack',\n\t'Xenos',\n\t'Yoakam',\n\t'Zweber',\n\t'Apachito',\n\t'Belluomini',\n\t'Cancelliere',\n\t'Cervini',\n\t'Davidovich',\n\t'Deguia',\n\t'Doxtator',\n\t'Errera',\n\t'Eshbaugh',\n\t'Mandt',\n\t'Pautler',\n\t'Raczynski',\n\t'Roemmich',\n\t'Rosamilia',\n\t'Shelhamer',\n\t'Vandevoorde',\n\t'Vanengen',\n\t'Vindiola',\n\t'Weyman',\n\t'Dufur',\n\t'Reaver',\n\t'Bugh',\n\t'Starley',\n\t'Macmullen',\n\t'Mataya',\n\t'Bucknell',\n\t'Taitano',\n\t'Coole',\n\t'Huguet',\n\t'Top',\n\t'Rockford',\n\t'Carrithers',\n\t'Garrell',\n\t'Toppins',\n\t'Mayner',\n\t'Dantes',\n\t'Tones',\n\t'Dauphine',\n\t'Shillingford',\n\t'Massiah',\n\t'Angermeier',\n\t'Arrizon',\n\t'Azer',\n\t'Badami',\n\t'Beeck',\n\t'Buddenhagen',\n\t'Cheyney',\n\t'Danielski',\n\t'Delgiorno',\n\t'Enslin',\n\t'Erber',\n\t'Fluegge',\n\t'Fresco',\n\t'Frishman',\n\t'Geigle',\n\t'Gervase',\n\t'Giangregorio',\n\t'Glauber',\n\t'Hedding',\n\t'Janota',\n\t'Labore',\n\t'Ladley',\n\t'Levee',\n\t'Lipuma',\n\t'Lomanto',\n\t'Magos',\n\t'Mangen',\n\t'Miltner',\n\t'Mitschke',\n\t'Pingley',\n\t'Puertas',\n\t'Schwed',\n\t'Seminario',\n\t'Sinsel',\n\t'Sliney',\n\t'Spielmann',\n\t'Standage',\n\t'Waas',\n\t'Cooprider',\n\t'Delguercio',\n\t'Dockham',\n\t'Dohse',\n\t'Doubrava',\n\t'Emerine',\n\t'Frazzini',\n\t'Godown',\n\t'Heidbreder',\n\t'Ladow',\n\t'Lariccia',\n\t'Molzahn',\n\t'Opiela',\n\t'Ordorica',\n\t'Otterness',\n\t'Owczarzak',\n\t'Rafalski',\n\t'Smigel',\n\t'Urbas',\n\t'Andon',\n\t'Kota',\n\t'Ruzzo',\n\t'Pheasant',\n\t'Proch',\n\t'Sullinger',\n\t'Ezra',\n\t'Portes',\n\t'Mynhier',\n\t'Depree',\n\t'Slight',\n\t'Selley',\n\t'Daughety',\n\t'Shamel',\n\t'Glasby',\n\t'Casher',\n\t'Brisby',\n\t'Whittley',\n\t'Brye',\n\t'Mackins',\n\t'Allam',\n\t'Berwanger',\n\t'Borgmeyer',\n\t'Brumlow',\n\t'Cashmore',\n\t'Clementz',\n\t'Coopman',\n\t'Corti',\n\t'Danzer',\n\t'Deater',\n\t'Delprado',\n\t'Dibuono',\n\t'Dwan',\n\t'Edling',\n\t'Ekins',\n\t'Feighner',\n\t'Galica',\n\t'Gasparro',\n\t'Geisert',\n\t'Gilvin',\n\t'Glotzbach',\n\t'Goostree',\n\t'Hollenkamp',\n\t'Hronek',\n\t'Kamins',\n\t'Khun',\n\t'Klimowicz',\n\t'Langella',\n\t'Letz',\n\t'Lindh',\n\t'Lycan',\n\t'Magouirk',\n\t'Mcbryar',\n\t'Milonas',\n\t'Patalano',\n\t'Petrides',\n\t'Plocher',\n\t'Signer',\n\t'Sinagra',\n\t'Taibi',\n\t'Thissen',\n\t'Thueson',\n\t'Tietje',\n\t'Trebilcock',\n\t'Zelek',\n\t'Alavez',\n\t'Beyersdorf',\n\t'Ferraiolo',\n\t'Flodin',\n\t'Fulwiler',\n\t'Gieselman',\n\t'Heisinger',\n\t'Hutmacher',\n\t'Laraia',\n\t'Lempke',\n\t'Marchiano',\n\t'Mendia',\n\t'Milberger',\n\t'Murri',\n\t'Willhelm',\n\t'Yannone',\n\t'Diss',\n\t'Golab',\n\t'Meuth',\n\t'Strebe',\n\t'Berenguer',\n\t'Cunard',\n\t'Girvan',\n\t'Pacer',\n\t'Nate',\n\t'Weare',\n\t'Dile',\n\t'Donate',\n\t'Pamer',\n\t'Charlet',\n\t'Roades',\n\t'Krah',\n\t'Merton',\n\t'Debrito',\n\t'Montel',\n\t'Guimont',\n\t'Caire',\n\t'Olley',\n\t'Ausborn',\n\t'Ramdass',\n\t'Stores',\n\t'Hush',\n\t'Watler',\n\t'Robotham',\n\t'Stanislaus',\n\t'Bellevue',\n\t'Almeter',\n\t'Bartold',\n\t'Bathgate',\n\t'Bollier',\n\t'Boundy',\n\t'Bushart',\n\t'Buzek',\n\t'Cauthon',\n\t'Daudelin',\n\t'Delguidice',\n\t'Depaolis',\n\t'Dysert',\n\t'Forsee',\n\t'Goglia',\n\t'Gruenhagen',\n\t'Guilfoil',\n\t'Guldin',\n\t'Gurnee',\n\t'Henzel',\n\t'Jurney',\n\t'Kable',\n\t'Korenek',\n\t'Kussman',\n\t'Liese',\n\t'Mauss',\n\t'Mexicano',\n\t'Morini',\n\t'Oathout',\n\t'Paragas',\n\t'Phommachanh',\n\t'Pixton',\n\t'Pucciarelli',\n\t'Rabine',\n\t'Ramlow',\n\t'Ravert',\n\t'Redhouse',\n\t'Renault',\n\t'Rybinski',\n\t'Sahlin',\n\t'Scherger',\n\t'Schoeffler',\n\t'Smolinsky',\n\t'Stadnik',\n\t'Stallsmith',\n\t'Timoney',\n\t'Whiteeagle',\n\t'Woodsmall',\n\t'Zinter',\n\t'Bargmann',\n\t'Basich',\n\t'Bossio',\n\t'Coutant',\n\t'Curcuru',\n\t'Duitsman',\n\t'Hunkele',\n\t'Kingry',\n\t'Kotek',\n\t'Mancusi',\n\t'Orama',\n\t'Paszek',\n\t'Schrodt',\n\t'Schuknecht',\n\t'Torsiello',\n\t'Troise',\n\t'Wernimont',\n\t'Wipperfurth',\n\t'Wissner',\n\t'Zahradnik',\n\t'Deasis',\n\t'Pac',\n\t'Vowles',\n\t'Montesi',\n\t'Carie',\n\t'Name',\n\t'Broy',\n\t'Hillson',\n\t'Exton',\n\t'Skerritt',\n\t'Ude',\n\t'Allston',\n\t'Cliatt',\n\t'Chevis',\n\t'Poitier',\n\t'Barrasso',\n\t'Bartnicki',\n\t'Broski',\n\t'Cobleigh',\n\t'Crickenberger',\n\t'Cruces',\n\t'Cumba',\n\t'Diodato',\n\t'Dipietrantonio',\n\t'Eyerly',\n\t'Fedler',\n\t'Fetting',\n\t'Francavilla',\n\t'Frein',\n\t'Gasparyan',\n\t'Gingold',\n\t'Gunnarson',\n\t'Houy',\n\t'Huelsmann',\n\t'Jeppsen',\n\t'Labreck',\n\t'Lefton',\n\t'Maenza',\n\t'Mauritz',\n\t'Mingione',\n\t'Mullany',\n\t'Mussell',\n\t'Muston',\n\t'Paraiso',\n\t'Peelman',\n\t'Penuel',\n\t'Piccola',\n\t'Punt',\n\t'Ramella',\n\t'Rauser',\n\t'Reas',\n\t'Reino',\n\t'Schlack',\n\t'Sebastiano',\n\t'Sgambati',\n\t'Shackett',\n\t'Szpak',\n\t'Thalacker',\n\t'Theissen',\n\t'Tutko',\n\t'Astarita',\n\t'Blazejewski',\n\t'Dejaynes',\n\t'Djordjevic',\n\t'Eckenroth',\n\t'Estala',\n\t'Giacomo',\n\t'Glaub',\n\t'Golubski',\n\t'Guerreiro',\n\t'Housholder',\n\t'Kashuba',\n\t'Klute',\n\t'Lennartz',\n\t'Messamore',\n\t'Rovito',\n\t'Schreurs',\n\t'Starcevich',\n\t'Starkel',\n\t'Szczerba',\n\t'Thomassen',\n\t'Varkey',\n\t'Yorio',\n\t'Guba',\n\t'Unzicker',\n\t'Howry',\n\t'Bido',\n\t'Farella',\n\t'Frane',\n\t'Werry',\n\t'Cornia',\n\t'Postal',\n\t'Humphres',\n\t'Ran',\n\t'Macnair',\n\t'Duston',\n\t'Aveni',\n\t'Mcconn',\n\t'Sistare',\n\t'Wadell',\n\t'Naraine',\n\t'Mubarak',\n\t'Lonzo',\n\t'Shyne',\n\t'Tilmon',\n\t'Symonette',\n\t'Shinholster',\n\t'Oree',\n\t'Ogarro',\n\t'Quashie',\n\t'Almario',\n\t'Antonsen',\n\t'Armetta',\n\t'Avetisyan',\n\t'Bania',\n\t'Barricklow',\n\t'Bloemker',\n\t'Cannavo',\n\t'Dolliver',\n\t'Espenshade',\n\t'Falor',\n\t'Fukuhara',\n\t'Gemme',\n\t'Goldfinger',\n\t'Gonya',\n\t'Hamamoto',\n\t'Hindi',\n\t'Hiraldo',\n\t'Holquin',\n\t'Janco',\n\t'Janow',\n\t'Lemming',\n\t'Macchio',\n\t'Mago',\n\t'Mavity',\n\t'Mcnamer',\n\t'Mushrush',\n\t'Niskanen',\n\t'Ohms',\n\t'Pawluk',\n\t'Popple',\n\t'Poser',\n\t'Schiavi',\n\t'Stram',\n\t'Streight',\n\t'Stueck',\n\t'Vansandt',\n\t'Vivona',\n\t'Vongphakdy',\n\t'Zalar',\n\t'Zipper',\n\t'Altic',\n\t'Billmeyer',\n\t'Boghosian',\n\t'Bohlke',\n\t'Cisewski',\n\t'Gabrielsen',\n\t'Gianotti',\n\t'Heffler',\n\t'Holian',\n\t'Kannenberg',\n\t'Lenius',\n\t'Manuelito',\n\t'Mugavero',\n\t'Reinier',\n\t'Rekowski',\n\t'Sadlier',\n\t'Scialdone',\n\t'Stromquist',\n\t'Vittetoe',\n\t'Vorwald',\n\t'Widrig',\n\t'Audi',\n\t'Peral',\n\t'Devery',\n\t'Gato',\n\t'Sower',\n\t'Vanes',\n\t'Bonnes',\n\t'Hense',\n\t'Counsell',\n\t'Frankie',\n\t'Colford',\n\t'Wanser',\n\t'Mickels',\n\t'Briddell',\n\t'Washinton',\n\t'Antilla',\n\t'Baxendale',\n\t'Beining',\n\t'Belveal',\n\t'Boedecker',\n\t'Bottenfield',\n\t'Bufano',\n\t'Castellana',\n\t'Chaikin',\n\t'Cherne',\n\t'Costilow',\n\t'Dzialo',\n\t'Goeken',\n\t'Gombert',\n\t'Hammerman',\n\t'Hansman',\n\t'Hartling',\n\t'Kalani',\n\t'Klich',\n\t'Kolodziejski',\n\t'Kramar',\n\t'Lapinsky',\n\t'Latterell',\n\t'Lipsitz',\n\t'Loma',\n\t'Lukenbill',\n\t'Marxen',\n\t'Metallo',\n\t'Molner',\n\t'Niquette',\n\t'Ostrand',\n\t'Pelster',\n\t'Previti',\n\t'Rennaker',\n\t'Roering',\n\t'Roode',\n\t'Saltos',\n\t'Sangiovanni',\n\t'Schiraldi',\n\t'Schlafer',\n\t'Schwering',\n\t'Seedorf',\n\t'Sklenar',\n\t'Spinello',\n\t'Steinhorst',\n\t'Urueta',\n\t'Vonstein',\n\t'Bonczek',\n\t'Casalino',\n\t'Chiaro',\n\t'Doffing',\n\t'Downham',\n\t'Gillotti',\n\t'Hearl',\n\t'Karges',\n\t'Kunesh',\n\t'Langeland',\n\t'Maertz',\n\t'Mattinson',\n\t'Mignano',\n\t'Pasquinelli',\n\t'Petracca',\n\t'Pherigo',\n\t'Pikus',\n\t'Reichmuth',\n\t'Schwegman',\n\t'Schwerdt',\n\t'Seelman',\n\t'Winquist',\n\t'Wyka',\n\t'Yahr',\n\t'Bunkers',\n\t'Delnegro',\n\t'Norder',\n\t'Manas',\n\t'Polites',\n\t'Grape',\n\t'Jares',\n\t'Surges',\n\t'Asa',\n\t'Copeman',\n\t'Askar',\n\t'Goman',\n\t'Whitmyer',\n\t'Cohran',\n\t'Imbert',\n\t'Beaner',\n\t'Hugger',\n\t'Petion',\n\t'Lauture',\n\t'Andringa',\n\t'Athanas',\n\t'Butrick',\n\t'Caronna',\n\t'Dedominicis',\n\t'Eligio',\n\t'Fasick',\n\t'Hilinski',\n\t'Hinely',\n\t'Idler',\n\t'Janosko',\n\t'Kempner',\n\t'Klosinski',\n\t'Lapeyrouse',\n\t'Lindroth',\n\t'Marcon',\n\t'Meding',\n\t'Peppin',\n\t'Quizon',\n\t'Rectenwald',\n\t'Roessner',\n\t'Roets',\n\t'Schonberger',\n\t'Szostek',\n\t'Wassink',\n\t'Whan',\n\t'Yeakle',\n\t'Alguire',\n\t'Bielenberg',\n\t'Bisaillon',\n\t'Bonenberger',\n\t'Centola',\n\t'Colaizzi',\n\t'Deroos',\n\t'Eberlin',\n\t'Ehrig',\n\t'Ferenc',\n\t'Freiermuth',\n\t'Fruchter',\n\t'Garnto',\n\t'Huxford',\n\t'Knous',\n\t'Luttman',\n\t'Mulry',\n\t'Schirm',\n\t'Stankovic',\n\t'Authier',\n\t'Derise',\n\t'Doo',\n\t'Kessen',\n\t'Maline',\n\t'Porada',\n\t'Vasconez',\n\t'Haseman',\n\t'Tonner',\n\t'Woodroof',\n\t'Bedrossian',\n\t'Cranmore',\n\t'Dodaro',\n\t'Hommes',\n\t'Harmony',\n\t'Peno',\n\t'Mccommon',\n\t'Colver',\n\t'Olinde',\n\t'Oba',\n\t'Colone',\n\t'Warbington',\n\t'Monie',\n\t'Whitmill',\n\t'Moxey',\n\t'Canion',\n\t'Mcclenney',\n\t'Hallmon',\n\t'Austill',\n\t'Berni',\n\t'Boehning',\n\t'Bueso',\n\t'Cefalo',\n\t'Conneely',\n\t'Demicco',\n\t'Dieppa',\n\t'Duris',\n\t'Durnil',\n\t'Erxleben',\n\t'Hashimi',\n\t'Hedquist',\n\t'Koc',\n\t'Lamattina',\n\t'Lassman',\n\t'Ligman',\n\t'Lukins',\n\t'Mackler',\n\t'Manolis',\n\t'Mou',\n\t'Oblak',\n\t'Omahoney',\n\t'Paolo',\n\t'Pollok',\n\t'Priess',\n\t'Reeh',\n\t'Rempfer',\n\t'Rickerd',\n\t'Schoettle',\n\t'Serritella',\n\t'Steedman',\n\t'Suss',\n\t'Tanimoto',\n\t'Thaden',\n\t'Thelin',\n\t'Vanwingerden',\n\t'Wacha',\n\t'Weldin',\n\t'Youkhana',\n\t'Bazzano',\n\t'Behring',\n\t'Caliri',\n\t'Cocchi',\n\t'Croissant',\n\t'Dibbern',\n\t'Figiel',\n\t'Flygare',\n\t'Grieshop',\n\t'Iten',\n\t'Kaupp',\n\t'Linnane',\n\t'Plybon',\n\t'Rappleye',\n\t'Romanik',\n\t'Saefong',\n\t'Schetter',\n\t'Schryer',\n\t'Siwik',\n\t'Snitker',\n\t'Tomasic',\n\t'Wavra',\n\t'Auen',\n\t'Thone',\n\t'Marso',\n\t'Shadid',\n\t'Cake',\n\t'Louvier',\n\t'Macia',\n\t'Areola',\n\t'Kardell',\n\t'Strome',\n\t'Coogle',\n\t'Delis',\n\t'Pistorius',\n\t'Raybourn',\n\t'Sula',\n\t'Math',\n\t'Sanda',\n\t'Renaldo',\n\t'Pat',\n\t'Florance',\n\t'Brank',\n\t'Alice',\n\t'Rosebrough',\n\t'Quiett',\n\t'Henigan',\n\t'Mcclees',\n\t'Dase',\n\t'Bagot',\n\t'Kings',\n\t'Lanehart',\n\t'Barbary',\n\t'Stitts',\n\t'Aurora',\n\t'Baldoni',\n\t'Barkalow',\n\t'Bohnet',\n\t'Bosshart',\n\t'Decapua',\n\t'Denbo',\n\t'Deneault',\n\t'Dinse',\n\t'Dul',\n\t'Estle',\n\t'Filipski',\n\t'Fishell',\n\t'Fluckiger',\n\t'Glassberg',\n\t'Janick',\n\t'Juda',\n\t'Kibbee',\n\t'Kreisler',\n\t'Lawther',\n\t'Levangie',\n\t'Lichtenwalner',\n\t'Lucking',\n\t'Meiner',\n\t'Mileham',\n\t'Milz',\n\t'Reposa',\n\t'Rinehimer',\n\t'Rupley',\n\t'Sandez',\n\t'Schinke',\n\t'Sharpnack',\n\t'Sineath',\n\t'Tax',\n\t'Thumma',\n\t'Urda',\n\t'Widdison',\n\t'Bergdoll',\n\t'Bruhl',\n\t'Chesmore',\n\t'Delfavero',\n\t'Ferderer',\n\t'Haueter',\n\t'Hirshberg',\n\t'Hollobaugh',\n\t'Lalama',\n\t'Mckeag',\n\t'Mehlhoff',\n\t'Mirchandani',\n\t'Orwick',\n\t'Puskarich',\n\t'Schlotzhauer',\n\t'Stoiber',\n\t'Swetz',\n\t'Basara',\n\t'Magaw',\n\t'Amble',\n\t'Hawe',\n\t'Toren',\n\t'Parilla',\n\t'Gowell',\n\t'Selkirk',\n\t'Edris',\n\t'Ariel',\n\t'Kihara',\n\t'Dunkerson',\n\t'Halk',\n\t'Mooty',\n\t'Tippen',\n\t'Fullenwider',\n\t'Herford',\n\t'Salton',\n\t'Feider',\n\t'Buckhannon',\n\t'Mckneely',\n\t'Milon',\n\t'Whiters',\n\t'Barasch',\n\t'Baria',\n\t'Basques',\n\t'Beavin',\n\t'Borre',\n\t'Branz',\n\t'Broers',\n\t'Conca',\n\t'Cortopassi',\n\t'Courchesne',\n\t'Crisanti',\n\t'Cumpian',\n\t'Dagan',\n\t'Dekay',\n\t'Demartin',\n\t'Dewaard',\n\t'Dowland',\n\t'Duffell',\n\t'Ebersol',\n\t'Faiola',\n\t'Frontz',\n\t'Fryling',\n\t'Garczynski',\n\t'Hanway',\n\t'Huettner',\n\t'Janovsky',\n\t'Johndrow',\n\t'Kahana',\n\t'Kaniewski',\n\t'Kulish',\n\t'Lich',\n\t'Lincks',\n\t'Loppnow',\n\t'Macnab',\n\t'Mcconaughy',\n\t'Melroy',\n\t'Noviello',\n\t'Orn',\n\t'Pacas',\n\t'Peppel',\n\t'Polidori',\n\t'Radi',\n\t'Riesgo',\n\t'Romanoski',\n\t'Sagrero',\n\t'Schirripa',\n\t'Spack',\n\t'Sternhagen',\n\t'Tamburri',\n\t'Traczyk',\n\t'Uballe',\n\t'Vandruff',\n\t'Voght',\n\t'Weant',\n\t'Weinel',\n\t'Angerman',\n\t'Boultinghouse',\n\t'Dolinar',\n\t'Dripps',\n\t'Dubow',\n\t'Ehrhard',\n\t'Janvrin',\n\t'Lazear',\n\t'Liddiard',\n\t'Madayag',\n\t'Mirkin',\n\t'Monticello',\n\t'Mulka',\n\t'Oliger',\n\t'Pierceall',\n\t'Pittner',\n\t'Polkowski',\n\t'Prindiville',\n\t'Rasnic',\n\t'Tellefsen',\n\t'Uffelman',\n\t'Vandenbergh',\n\t'Weisenbach',\n\t'Wiedmeyer',\n\t'Wintle',\n\t'Wisz',\n\t'Yorba',\n\t'Holtmeyer',\n\t'Tabet',\n\t'Laham',\n\t'Barsoum',\n\t'Henner',\n\t'Idle',\n\t'Shaft',\n\t'Rennels',\n\t'Swarm',\n\t'Forgie',\n\t'Khaled',\n\t'Avon',\n\t'Hewey',\n\t'Grober',\n\t'Pipe',\n\t'Macfadden',\n\t'Keath',\n\t'Fergason',\n\t'Polland',\n\t'Brownley',\n\t'Haslip',\n\t'Crocket',\n\t'Tines',\n\t'Juniel',\n\t'Opara',\n\t'Bethley',\n\t'Ambuehl',\n\t'Bagheri',\n\t'Baquera',\n\t'Bertoli',\n\t'Bisek',\n\t'Borroto',\n\t'Botten',\n\t'Bovenzi',\n\t'Bruntz',\n\t'Buehring',\n\t'Canche',\n\t'Cicco',\n\t'Dambach',\n\t'Delellis',\n\t'Deniston',\n\t'Dirico',\n\t'Feagle',\n\t'Frayne',\n\t'Haagenson',\n\t'Janicke',\n\t'Kashyap',\n\t'Kastel',\n\t'Kruck',\n\t'Langi',\n\t'Lapka',\n\t'Marschner',\n\t'Megia',\n\t'Nesta',\n\t'Nevala',\n\t'Oblinger',\n\t'Picchi',\n\t'Rodeffer',\n\t'Salkin',\n\t'Scavuzzo',\n\t'Sladky',\n\t'Soyars',\n\t'Suchil',\n\t'Thielbar',\n\t'Timoteo',\n\t'Vanhise',\n\t'Varden',\n\t'Waldoch',\n\t'Watling',\n\t'Werk',\n\t'Becvar',\n\t'Betteridge',\n\t'Bolliger',\n\t'Bonifield',\n\t'Buchberger',\n\t'Caprara',\n\t'Castrogiovanni',\n\t'Fallaw',\n\t'Geeting',\n\t'Hiegel',\n\t'Hulgan',\n\t'Kokesh',\n\t'Lanting',\n\t'Mcphetridge',\n\t'Nuxoll',\n\t'Soun',\n\t'Strothman',\n\t'Triska',\n\t'Vensel',\n\t'Wesolek',\n\t'Wixted',\n\t'Wolgemuth',\n\t'Yedinak',\n\t'Anthis',\n\t'Manfred',\n\t'Agans',\n\t'Lafoe',\n\t'Mcginnes',\n\t'Folwell',\n\t'Galvao',\n\t'Carmo',\n\t'Valin',\n\t'Woon',\n\t'Degregory',\n\t'Evangelist',\n\t'Coast',\n\t'Strater',\n\t'Decou',\n\t'Pears',\n\t'Nellums',\n\t'Kynard',\n\t'Boursiquot',\n\t'Ruffins',\n\t'Akhavan',\n\t'Baloga',\n\t'Barany',\n\t'Buche',\n\t'Davoli',\n\t'Fennewald',\n\t'Figler',\n\t'Frede',\n\t'Gannett',\n\t'Ghannam',\n\t'Handlon',\n\t'Herridge',\n\t'Jakel',\n\t'Kamphuis',\n\t'Kattan',\n\t'Kemplin',\n\t'Klecka',\n\t'Korver',\n\t'Kozakiewicz',\n\t'Linenberger',\n\t'Lofaso',\n\t'Lorman',\n\t'Lueder',\n\t'Mcconahay',\n\t'Mcternan',\n\t'Mench',\n\t'Norenberg',\n\t'Oro',\n\t'Ostenson',\n\t'Pant',\n\t'Peardon',\n\t'Pertuit',\n\t'Ritzert',\n\t'Salvetti',\n\t'Sandner',\n\t'Sheek',\n\t'Sniegowski',\n\t'Sorbo',\n\t'Sperbeck',\n\t'Sump',\n\t'Supinski',\n\t'Sweetin',\n\t'Toenjes',\n\t'Velotta',\n\t'Venier',\n\t'Veracruz',\n\t'Wender',\n\t'Yamagata',\n\t'Arostegui',\n\t'Balestra',\n\t'Blumstein',\n\t'Carras',\n\t'Grauberger',\n\t'Howdeshell',\n\t'Murayama',\n\t'Nippert',\n\t'Notch',\n\t'Reisert',\n\t'Sebren',\n\t'Tetzloff',\n\t'Venneman',\n\t'Douds',\n\t'Lineman',\n\t'Powles',\n\t'Huet',\n\t'Matto',\n\t'Roes',\n\t'Dillin',\n\t'Lagan',\n\t'Bakes',\n\t'Yann',\n\t'Canterberry',\n\t'Milum',\n\t'Hinderman',\n\t'Linzey',\n\t'Ballen',\n\t'Ventress',\n\t'Prysock',\n\t'Bangle',\n\t'Blinder',\n\t'Bugaj',\n\t'Carlisi',\n\t'Dimario',\n\t'Dzikowski',\n\t'Gaetz',\n\t'Galves',\n\t'Ghazal',\n\t'Golebiewski',\n\t'Hadsall',\n\t'Hogberg',\n\t'Krammer',\n\t'Kreisher',\n\t'Lamia',\n\t'Luhmann',\n\t'Lupa',\n\t'Michelotti',\n\t'Nesci',\n\t'Paape',\n\t'Posthumus',\n\t'Reth',\n\t'Sassman',\n\t'Schlechter',\n\t'Schlie',\n\t'Schumacker',\n\t'Seliger',\n\t'Shanholtzer',\n\t'Strojny',\n\t'Taglieri',\n\t'Tibbles',\n\t'Tregoning',\n\t'Valine',\n\t'Zeiset',\n\t'Antu',\n\t'Bierwirth',\n\t'Birenbaum',\n\t'Boeder',\n\t'Dobkins',\n\t'Fenoglio',\n\t'Jentsch',\n\t'Marcinkiewicz',\n\t'Mruk',\n\t'Muhlbauer',\n\t'Namba',\n\t'Oettinger',\n\t'Rigor',\n\t'Rothweiler',\n\t'Schmader',\n\t'Schork',\n\t'Vandevoort',\n\t'Brenny',\n\t'Neels',\n\t'Fodge',\n\t'Que',\n\t'Dalpe',\n\t'Guerard',\n\t'Lammey',\n\t'Alfredo',\n\t'Corrin',\n\t'Quarry',\n\t'Reise',\n\t'Derrow',\n\t'Worrel',\n\t'Tennent',\n\t'Cassis',\n\t'Winson',\n\t'Cornet',\n\t'Garlin',\n\t'Saucer',\n\t'Ursery',\n\t'Saffo',\n\t'Battee',\n\t'Ackerley',\n\t'Ackland',\n\t'Allmendinger',\n\t'Altamura',\n\t'Anastas',\n\t'Artola',\n\t'Baldassari',\n\t'Bayron',\n\t'Bouwkamp',\n\t'Buonopane',\n\t'Chronis',\n\t'Coffaro',\n\t'Dech',\n\t'Delfierro',\n\t'Depaulo',\n\t'Digges',\n\t'Dowda',\n\t'Drab',\n\t'Feijoo',\n\t'Formato',\n\t'Friedli',\n\t'Hanahan',\n\t'Hegna',\n\t'Igarashi',\n\t'Kamai',\n\t'Kory',\n\t'Kuzel',\n\t'Lewkowicz',\n\t'Lumbra',\n\t'Mccreadie',\n\t'Meisch',\n\t'Montoro',\n\t'Pamintuan',\n\t'Petrow',\n\t'Pulcini',\n\t'Shewell',\n\t'Spitznagel',\n\t'Swedlund',\n\t'Terhorst',\n\t'Wilberg',\n\t'Willwerth',\n\t'Affinito',\n\t'Baune',\n\t'Beichner',\n\t'Boutell',\n\t'Challender',\n\t'Ellestad',\n\t'Gomm',\n\t'Hochstatter',\n\t'Jasko',\n\t'Kielar',\n\t'Kimmerle',\n\t'Kirshenbaum',\n\t'Kotila',\n\t'Lecker',\n\t'Manross',\n\t'Mcnevin',\n\t'Neuburger',\n\t'Verderosa',\n\t'Wiltsey',\n\t'Caminero',\n\t'Gianfrancesco',\n\t'Shiverdecker',\n\t'Amman',\n\t'Flavell',\n\t'Oconor',\n\t'Shure',\n\t'Hanagan',\n\t'Bokor',\n\t'Mashaw',\n\t'Ground',\n\t'Brittenham',\n\t'Pinera',\n\t'Smaltz',\n\t'Hold',\n\t'Gallamore',\n\t'Delon',\n\t'Hearing',\n\t'Rynes',\n\t'Cocklin',\n\t'Cassie',\n\t'Calligan',\n\t'Josue',\n\t'Congo',\n\t'Tennell',\n\t'Blyther',\n\t'Azarian',\n\t'Bauernfeind',\n\t'Beeghly',\n\t'Berget',\n\t'Brayfield',\n\t'Cerasoli',\n\t'Dedecker',\n\t'Gloeckner',\n\t'Herriges',\n\t'Hoganson',\n\t'Ivancic',\n\t'Jakeway',\n\t'Kayne',\n\t'Kitko',\n\t'Kohlbeck',\n\t'Krabbenhoft',\n\t'Kumari',\n\t'Lauri',\n\t'Leiber',\n\t'Minke',\n\t'Montecino',\n\t'Moutray',\n\t'Munshi',\n\t'Ohlin',\n\t'Portocarrero',\n\t'Rados',\n\t'Roedl',\n\t'Rossing',\n\t'Schake',\n\t'Simonin',\n\t'Staffa',\n\t'Stroschein',\n\t'Titman',\n\t'Treder',\n\t'Vonada',\n\t'Xenakis',\n\t'Aulds',\n\t'Benedick',\n\t'Boulais',\n\t'Butikofer',\n\t'Butorac',\n\t'Contento',\n\t'Goetting',\n\t'Goldammer',\n\t'Hopke',\n\t'Koppes',\n\t'Phetteplace',\n\t'Roehrs',\n\t'Schul',\n\t'Slabach',\n\t'Steinmiller',\n\t'Sucharski',\n\t'Vorwerk',\n\t'Wahlert',\n\t'Wheatcraft',\n\t'Abellera',\n\t'Jutte',\n\t'Baumgarner',\n\t'Tijerino',\n\t'Awadallah',\n\t'Horen',\n\t'Lina',\n\t'Stanbrough',\n\t'College',\n\t'Jarry',\n\t'Keas',\n\t'Mordan',\n\t'Ramnauth',\n\t'Rena',\n\t'Wa',\n\t'Petters',\n\t'Ramnath',\n\t'Hellams',\n\t'Mamon',\n\t'Cheese',\n\t'Meggett',\n\t'Anttila',\n\t'Beilman',\n\t'Binsfeld',\n\t'Brining',\n\t'Brubeck',\n\t'Carcione',\n\t'Chandran',\n\t'Chaudhuri',\n\t'Cogliano',\n\t'Dimaano',\n\t'Dols',\n\t'Doughten',\n\t'Ehrenfeld',\n\t'Elena',\n\t'Fausnaugh',\n\t'Fetz',\n\t'Fogelson',\n\t'Fraleigh',\n\t'Gaza',\n\t'Giesey',\n\t'Gockel',\n\t'Gougeon',\n\t'Granito',\n\t'Grassia',\n\t'Hauserman',\n\t'Idrovo',\n\t'Iwan',\n\t'Janning',\n\t'Kaffenberger',\n\t'Kichline',\n\t'Kimoto',\n\t'Kolodny',\n\t'Kortum',\n\t'Lafevers',\n\t'Lodi',\n\t'Longton',\n\t'Ludke',\n\t'Manganelli',\n\t'Mccuan',\n\t'Merryfield',\n\t'Mezquita',\n\t'Morandi',\n\t'Neibauer',\n\t'Oran',\n\t'Ozaeta',\n\t'Pacha',\n\t'Palese',\n\t'Perala',\n\t'Pisarcik',\n\t'Pobanz',\n\t'Pommer',\n\t'Pontrelli',\n\t'Prabhakar',\n\t'Rehmann',\n\t'Scheunemann',\n\t'Severini',\n\t'Skalla',\n\t'Srinivas',\n\t'Stadtmiller',\n\t'Trentman',\n\t'Trinka',\n\t'Tutterow',\n\t'Vari',\n\t'Wence',\n\t'Zeff',\n\t'Anagnos',\n\t'Arvayo',\n\t'Bihl',\n\t'Darbyshire',\n\t'Deeg',\n\t'Domagalski',\n\t'Estenson',\n\t'Finkenbinder',\n\t'Gaboriault',\n\t'Kastens',\n\t'Lacek',\n\t'Merkin',\n\t'Mersman',\n\t'Nicolaus',\n\t'Offerdahl',\n\t'Pallett',\n\t'Platten',\n\t'Quesnell',\n\t'Skene',\n\t'Sondag',\n\t'Wolfrom',\n\t'Mineer',\n\t'Sor',\n\t'Canard',\n\t'Mcmeen',\n\t'Tur',\n\t'Giner',\n\t'Mackrell',\n\t'Alic',\n\t'Sampath',\n\t'Baby',\n\t'Beales',\n\t'Kadri',\n\t'Minot',\n\t'Bienvenue',\n\t'Millirons',\n\t'Woodstock',\n\t'Landing',\n\t'Limehouse',\n\t'Andonian',\n\t'Armentor',\n\t'Asai',\n\t'Cutaia',\n\t'Darji',\n\t'Delsanto',\n\t'Deutch',\n\t'Droge',\n\t'Emme',\n\t'Flenner',\n\t'Gaida',\n\t'Gladd',\n\t'Guettler',\n\t'Guggisberg',\n\t'Guier',\n\t'Habenicht',\n\t'Heininger',\n\t'Helfman',\n\t'Hiscox',\n\t'Holtorf',\n\t'Hovious',\n\t'Juul',\n\t'Lacock',\n\t'Lepisto',\n\t'Malanowski',\n\t'Marineau',\n\t'Matza',\n\t'Meffert',\n\t'Nuon',\n\t'Oneto',\n\t'Padmanabhan',\n\t'Pantuso',\n\t'Pesci',\n\t'Rosenbluth',\n\t'Rubano',\n\t'Sedlar',\n\t'Sferrazza',\n\t'Sifuentez',\n\t'Simione',\n\t'Torossian',\n\t'Vaux',\n\t'Weilbacher',\n\t'Wiatrek',\n\t'Brzoska',\n\t'Caltabiano',\n\t'Csaszar',\n\t'Eyerman',\n\t'Geissinger',\n\t'Gioffre',\n\t'Grilliot',\n\t'Grotz',\n\t'Harrower',\n\t'Jaroszewski',\n\t'Jokerst',\n\t'Kamali',\n\t'Kampmann',\n\t'Klemz',\n\t'Koike',\n\t'Lista',\n\t'Mcconkie',\n\t'Mencia',\n\t'Missler',\n\t'Olshefski',\n\t'Omdahl',\n\t'Penunuri',\n\t'Scheckel',\n\t'Schreiter',\n\t'Swackhammer',\n\t'Taflinger',\n\t'Tegethoff',\n\t'Ummel',\n\t'Wetsel',\n\t'Wissmann',\n\t'Porr',\n\t'Ramser',\n\t'Russett',\n\t'Clucas',\n\t'Matlin',\n\t'Noblet',\n\t'Boyan',\n\t'Koman',\n\t'Lope',\n\t'Deman',\n\t'Latendresse',\n\t'Bound',\n\t'Rijos',\n\t'Bouillon',\n\t'Crunkleton',\n\t'Jayson',\n\t'Anne',\n\t'Staude',\n\t'Sturn',\n\t'Burdell',\n\t'Arther',\n\t'Yett',\n\t'Woolcock',\n\t'Clemon',\n\t'Saintjean',\n\t'Sainvil',\n\t'Coverson',\n\t'Barroga',\n\t'Benedicto',\n\t'Borin',\n\t'Budrow',\n\t'Cuddihy',\n\t'Forness',\n\t'Gohman',\n\t'Hepker',\n\t'Hilscher',\n\t'Holien',\n\t'Holstad',\n\t'Hopfer',\n\t'Hulburt',\n\t'Kalter',\n\t'Kuehnle',\n\t'Lachica',\n\t'Macioce',\n\t'Massimo',\n\t'Matsubara',\n\t'Meaker',\n\t'Mehmedovic',\n\t'Minckler',\n\t'Miralles',\n\t'Mostek',\n\t'Oshita',\n\t'Parthasarathy',\n\t'Roszak',\n\t'Rottenberg',\n\t'Rydman',\n\t'Shankman',\n\t'Sprong',\n\t'Stenerson',\n\t'Strubel',\n\t'Tavano',\n\t'Thornberg',\n\t'Trumpower',\n\t'Whittinghill',\n\t'Altenhofen',\n\t'Bartolucci',\n\t'Debski',\n\t'Dekoning',\n\t'Dottavio',\n\t'Emminger',\n\t'Hodkinson',\n\t'Hurtubise',\n\t'Lauridsen',\n\t'Leinberger',\n\t'Luskin',\n\t'Pask',\n\t'Rehfeld',\n\t'Spagna',\n\t'Szumski',\n\t'Szymborski',\n\t'Teem',\n\t'Tritschler',\n\t'Tschantz',\n\t'Tsutsui',\n\t'Vanecek',\n\t'Haddaway',\n\t'Colombe',\n\t'Mayol',\n\t'Shivley',\n\t'Maturin',\n\t'Babe',\n\t'Bovey',\n\t'Bathe',\n\t'Belliard',\n\t'Loner',\n\t'Arrow',\n\t'Billa',\n\t'Mcneish',\n\t'Kinton',\n\t'Scarber',\n\t'Donson',\n\t'Atherley',\n\t'Abdulaziz',\n\t'Age',\n\t'Carreker',\n\t'Tory',\n\t'Leduff',\n\t'Wattley',\n\t'Altergott',\n\t'Belitz',\n\t'Bidinger',\n\t'Blauch',\n\t'Cariker',\n\t'Condren',\n\t'Curiale',\n\t'Dronet',\n\t'Elstad',\n\t'Esquerra',\n\t'Fread',\n\t'Gilb',\n\t'Goga',\n\t'Gonyo',\n\t'Grudzien',\n\t'Hino',\n\t'Ishler',\n\t'Jacober',\n\t'Kilty',\n\t'Kuhrt',\n\t'Lairmore',\n\t'Lamba',\n\t'Lorek',\n\t'Lucich',\n\t'Marcou',\n\t'Mcgath',\n\t'Menze',\n\t'Mindel',\n\t'Nabb',\n\t'Ottosen',\n\t'Pann',\n\t'Ratkowski',\n\t'Saurer',\n\t'Sedore',\n\t'Shonka',\n\t'Soberano',\n\t'Sossamon',\n\t'Stdennis',\n\t'Stillinger',\n\t'Tager',\n\t'Tersigni',\n\t'Tissue',\n\t'Trampe',\n\t'Twite',\n\t'Whitling',\n\t'Wiebusch',\n\t'Abundez',\n\t'Bisping',\n\t'Candella',\n\t'Dahill',\n\t'Groebner',\n\t'Gulbrandsen',\n\t'Hasenauer',\n\t'Heesch',\n\t'Hipwell',\n\t'Kamrowski',\n\t'Keyworth',\n\t'Kleinschmit',\n\t'Legorreta',\n\t'Minium',\n\t'Mixter',\n\t'Neiswonger',\n\t'Purk',\n\t'Rinkenberger',\n\t'Rosenkrans',\n\t'Rozenberg',\n\t'Simenson',\n\t'Soltes',\n\t'Storino',\n\t'Viereck',\n\t'Schaafsma',\n\t'Craigie',\n\t'Amorin',\n\t'Latner',\n\t'Bowmer',\n\t'Nasby',\n\t'Bada',\n\t'Rami',\n\t'Mcglashan',\n\t'Reede',\n\t'Police',\n\t'Cobey',\n\t'Dahir',\n\t'Dirden',\n\t'Destine',\n\t'Akkerman',\n\t'Azzopardi',\n\t'Blankenhorn',\n\t'Bolio',\n\t'Brandhorst',\n\t'Buchter',\n\t'Canul',\n\t'Cocozza',\n\t'Collantes',\n\t'Cronic',\n\t'Cullifer',\n\t'Delpizzo',\n\t'Demoranville',\n\t'Dolder',\n\t'Dvorsky',\n\t'Eggett',\n\t'Elgersma',\n\t'Episcopo',\n\t'Esses',\n\t'Fehlman',\n\t'Gansen',\n\t'Garciamartinez',\n\t'Goldwater',\n\t'Gushue',\n\t'Hittner',\n\t'Igel',\n\t'Jupin',\n\t'Kostoff',\n\t'Kruschke',\n\t'Kuechler',\n\t'Labs',\n\t'Lacerte',\n\t'Lagle',\n\t'Leischner',\n\t'Linders',\n\t'Marulanda',\n\t'Meindl',\n\t'Melman',\n\t'Menden',\n\t'Orbach',\n\t'Patak',\n\t'Patras',\n\t'Petroni',\n\t'Rabenold',\n\t'Rapisarda',\n\t'Rodenburg',\n\t'Roelle',\n\t'Schar',\n\t'Scherbarth',\n\t'Simar',\n\t'Thoen',\n\t'Trana',\n\t'Tuch',\n\t'Turko',\n\t'Wamser',\n\t'Weinfeld',\n\t'Wirz',\n\t'Zatorski',\n\t'Zbinden',\n\t'Aksamit',\n\t'Asebedo',\n\t'Biello',\n\t'Bouchey',\n\t'Callejo',\n\t'Espanol',\n\t'Flathers',\n\t'Kunka',\n\t'Liaw',\n\t'Mckowen',\n\t'Mitrano',\n\t'Needler',\n\t'Och',\n\t'Paolella',\n\t'Patricelli',\n\t'Recine',\n\t'Rengel',\n\t'Spinler',\n\t'Wagenaar',\n\t'Winnicki',\n\t'Eichert',\n\t'Dabb',\n\t'Imrie',\n\t'Antoni',\n\t'Lardner',\n\t'Maund',\n\t'Schou',\n\t'Brittin',\n\t'Anthon',\n\t'Was',\n\t'Nevis',\n\t'Delamar',\n\t'Mcnorton',\n\t'Tankard',\n\t'Boardley',\n\t'Garcon',\n\t'Wimes',\n\t'Antell',\n\t'Belmarez',\n\t'Boff',\n\t'Boughan',\n\t'Cando',\n\t'Carrender',\n\t'Carrieri',\n\t'Charnley',\n\t'Cittadino',\n\t'Cwynar',\n\t'Deupree',\n\t'Doepke',\n\t'Fasone',\n\t'Fauteux',\n\t'Foody',\n\t'Fornal',\n\t'Fust',\n\t'Gasner',\n\t'Gloe',\n\t'Gorter',\n\t'Grumbine',\n\t'Hancher',\n\t'Hapke',\n\t'Heckendorn',\n\t'Heinlen',\n\t'Hilgeman',\n\t'Kahre',\n\t'Kakos',\n\t'Kops',\n\t'Lahn',\n\t'Leiferman',\n\t'Lothamer',\n\t'Mallis',\n\t'Napierkowski',\n\t'Orbin',\n\t'Panno',\n\t'Piacente',\n\t'Posas',\n\t'Ragasa',\n\t'Sonora',\n\t'Stupka',\n\t'Tio',\n\t'Valido',\n\t'Weyrick',\n\t'Argall',\n\t'Arrighi',\n\t'Bohlken',\n\t'Desrocher',\n\t'Distad',\n\t'Erkkila',\n\t'Gherardi',\n\t'Goughnour',\n\t'Koltz',\n\t'Koperski',\n\t'Lafalce',\n\t'Lucken',\n\t'Meleski',\n\t'Mortellaro',\n\t'Nagorski',\n\t'Pedrotti',\n\t'Pruyn',\n\t'Revard',\n\t'Saffran',\n\t'Schnoebelen',\n\t'Sermersheim',\n\t'Skroch',\n\t'Vandervliet',\n\t'Alwood',\n\t'Bosso',\n\t'Hor',\n\t'Licerio',\n\t'Septer',\n\t'Labo',\n\t'Lessa',\n\t'Ooley',\n\t'Gorgas',\n\t'Medal',\n\t'Coull',\n\t'Creely',\n\t'Bolland',\n\t'Ishaq',\n\t'Legore',\n\t'Alicia',\n\t'Fillingame',\n\t'Levers',\n\t'Flight',\n\t'Woodrick',\n\t'Berrie',\n\t'Buckels',\n\t'Pigue',\n\t'Crosse',\n\t'Speakes',\n\t'Wynes',\n\t'Mussa',\n\t'Highbaugh',\n\t'Venning',\n\t'Dupas',\n\t'Mccastle',\n\t'Andreoni',\n\t'Bakula',\n\t'Besemer',\n\t'Blier',\n\t'Braaksma',\n\t'Brocco',\n\t'Cajas',\n\t'Campano',\n\t'Crapser',\n\t'Dentinger',\n\t'Deziel',\n\t'Dragos',\n\t'Ekblad',\n\t'Gargis',\n\t'Gilberto',\n\t'Guadron',\n\t'Hollern',\n\t'Leibensperger',\n\t'Lindaman',\n\t'Lumadue',\n\t'Mault',\n\t'Mieses',\n\t'Nanninga',\n\t'Nudd',\n\t'Ouch',\n\t'Ramin',\n\t'Reggio',\n\t'Ruttan',\n\t'Saccomanno',\n\t'Scheaffer',\n\t'Sohm',\n\t'Spaniol',\n\t'Stenner',\n\t'Strieter',\n\t'Takashima',\n\t'Vaid',\n\t'Venzke',\n\t'Wallwork',\n\t'Zaffuto',\n\t'Zaucha',\n\t'Zemel',\n\t'Zinni',\n\t'Alltop',\n\t'Ciolek',\n\t'Empie',\n\t'Flitton',\n\t'Gullikson',\n\t'Hassebrock',\n\t'Kanitz',\n\t'Kirschenmann',\n\t'Krivanek',\n\t'Loseke',\n\t'Mckercher',\n\t'Melching',\n\t'Nham',\n\t'Ormerod',\n\t'Randlett',\n\t'Reifel',\n\t'Sawada',\n\t'Sofranko',\n\t'Stoia',\n\t'Umeda',\n\t'Eagon',\n\t'Hucker',\n\t'Kenniston',\n\t'Salus',\n\t'Ayyad',\n\t'Camey',\n\t'Dacy',\n\t'Joa',\n\t'Peerson',\n\t'Rossy',\n\t'Aure',\n\t'Keetch',\n\t'Sprigg',\n\t'Southgate',\n\t'Parden',\n\t'Andris',\n\t'Bossman',\n\t'Blondell',\n\t'Carmickle',\n\t'Pelly',\n\t'Mceachron',\n\t'Marry',\n\t'Burel',\n\t'Shark',\n\t'Flash',\n\t'Rickenbacker',\n\t'Foots',\n\t'Sillah',\n\t'Almgren',\n\t'Awtrey',\n\t'Berganza',\n\t'Boehne',\n\t'Bralley',\n\t'Brosnahan',\n\t'Caddick',\n\t'Chandonnet',\n\t'Cullimore',\n\t'Darroch',\n\t'Eimers',\n\t'Flam',\n\t'Howerter',\n\t'Jerzak',\n\t'Kabler',\n\t'Kirkes',\n\t'Kopper',\n\t'Krakow',\n\t'Linskey',\n\t'Lizzi',\n\t'Luria',\n\t'Marcrum',\n\t'Mathy',\n\t'Matulich',\n\t'Miskin',\n\t'Moghadam',\n\t'Nagarajan',\n\t'Packham',\n\t'Papania',\n\t'Paup',\n\t'Rippeon',\n\t'Rolli',\n\t'Rubey',\n\t'Scherzinger',\n\t'Scrima',\n\t'Sharar',\n\t'Shoberg',\n\t'Stupar',\n\t'Tendler',\n\t'Tobiason',\n\t'Vanvooren',\n\t'Zisa',\n\t'Bindel',\n\t'Flasch',\n\t'Graetz',\n\t'Heintzman',\n\t'Kosanke',\n\t'Longden',\n\t'Mahfouz',\n\t'Mormile',\n\t'Nannini',\n\t'Olaes',\n\t'Panik',\n\t'Putzier',\n\t'Radilla',\n\t'Schaedler',\n\t'Schoepf',\n\t'Sianez',\n\t'Taucher',\n\t'Wiebelhaus',\n\t'Banka',\n\t'Console',\n\t'Derego',\n\t'Vile',\n\t'Colgin',\n\t'Drage',\n\t'Josten',\n\t'Luckadoo',\n\t'Ryen',\n\t'Bako',\n\t'Ow',\n\t'Patient',\n\t'Elmes',\n\t'Mossa',\n\t'Colee',\n\t'Comber',\n\t'Tippy',\n\t'Perrell',\n\t'Axon',\n\t'Rickson',\n\t'Postlewaite',\n\t'Lafargue',\n\t'Guffin',\n\t'Cains',\n\t'Dewindt',\n\t'Cathy',\n\t'Tallie',\n\t'Ausby',\n\t'Alires',\n\t'Baz',\n\t'Bergeman',\n\t'Bodensteiner',\n\t'Borghi',\n\t'Dematos',\n\t'Denzler',\n\t'Dorko',\n\t'Duffett',\n\t'Dykas',\n\t'Emerton',\n\t'Fenger',\n\t'Fosberg',\n\t'Gwinner',\n\t'Kniess',\n\t'Lerew',\n\t'Lohner',\n\t'Lun',\n\t'Maita',\n\t'Mandler',\n\t'Marcoe',\n\t'Nikolov',\n\t'Paschen',\n\t'Paver',\n\t'Prosperi',\n\t'Rackliff',\n\t'Roever',\n\t'Ruberg',\n\t'Ruest',\n\t'Schnick',\n\t'Schuur',\n\t'Sowash',\n\t'Zanca',\n\t'Brecheen',\n\t'Brusky',\n\t'Chauca',\n\t'Debernardi',\n\t'Froio',\n\t'Gadway',\n\t'Karoly',\n\t'Kintzel',\n\t'Kneisley',\n\t'Kruser',\n\t'Lindfors',\n\t'Lwin',\n\t'Oursler',\n\t'Peruski',\n\t'Petteys',\n\t'Rottmann',\n\t'Schroeck',\n\t'Stenglein',\n\t'Vigen',\n\t'Wempe',\n\t'Zehren',\n\t'Wollen',\n\t'Dismore',\n\t'Santalucia',\n\t'Laza',\n\t'Pesnell',\n\t'Litle',\n\t'Markson',\n\t'Piercefield',\n\t'Jerrett',\n\t'Virginia',\n\t'Demonbreun',\n\t'Tugman',\n\t'Ramoutar',\n\t'Bazin',\n\t'Ola',\n\t'Alamin',\n\t'Adebayo',\n\t'Berkland',\n\t'Bernt',\n\t'Briguglio',\n\t'Bulnes',\n\t'Burack',\n\t'Cantoran',\n\t'Giardini',\n\t'Goetzke',\n\t'Graziosi',\n\t'Guberman',\n\t'Kamaka',\n\t'Karvonen',\n\t'Kitz',\n\t'Kopera',\n\t'Krempa',\n\t'Linkenhoker',\n\t'Mascioli',\n\t'Matlick',\n\t'Mcmahill',\n\t'Medaglia',\n\t'Mirarchi',\n\t'Mondry',\n\t'Muhlestein',\n\t'Murty',\n\t'Orender',\n\t'Pesantez',\n\t'Postiglione',\n\t'Reisen',\n\t'Riff',\n\t'Scarantino',\n\t'Seelinger',\n\t'Seher',\n\t'Sharum',\n\t'Sorice',\n\t'Staebler',\n\t'Tanney',\n\t'Tech',\n\t'Tramontano',\n\t'Trude',\n\t'Vasudevan',\n\t'Wareing',\n\t'Westerhold',\n\t'Wohlfarth',\n\t'Achorn',\n\t'Boesel',\n\t'Calabaza',\n\t'Dunkleberger',\n\t'Erck',\n\t'Fanger',\n\t'Felmlee',\n\t'Friebel',\n\t'Gabrys',\n\t'Godsil',\n\t'Goldhammer',\n\t'Gourneau',\n\t'Kaseman',\n\t'Keysor',\n\t'Mccargar',\n\t'Mittag',\n\t'Narum',\n\t'Schoeneck',\n\t'Stenquist',\n\t'Sunderlin',\n\t'Tarazon',\n\t'Tietze',\n\t'Wemmer',\n\t'Witthuhn',\n\t'Durango',\n\t'Simerson',\n\t'Beber',\n\t'Bjorn',\n\t'Neuville',\n\t'Preas',\n\t'Reitter',\n\t'Senf',\n\t'Mcclatchy',\n\t'Sanor',\n\t'Benney',\n\t'Sarrazin',\n\t'Woodliff',\n\t'Bramlet',\n\t'Cullin',\n\t'Wessells',\n\t'Higgens',\n\t'Rout',\n\t'Craigen',\n\t'Ackers',\n\t'Wickliff',\n\t'Hofler',\n\t'Pilgram',\n\t'Mcfayden',\n\t'Dillworth',\n\t'Robenson',\n\t'Mateen',\n\t'Ambrogio',\n\t'Aoun',\n\t'Aranas',\n\t'Balsiger',\n\t'Bonzo',\n\t'Busam',\n\t'Casassa',\n\t'Ciborowski',\n\t'Cotterill',\n\t'Cressler',\n\t'Cristales',\n\t'Crumpacker',\n\t'Daloisio',\n\t'Damasco',\n\t'Depolo',\n\t'Diguglielmo',\n\t'Dominik',\n\t'Esbenshade',\n\t'Fineran',\n\t'Formisano',\n\t'Gandolfi',\n\t'Geidel',\n\t'Gerwitz',\n\t'Grammatico',\n\t'Idleman',\n\t'Iwinski',\n\t'Kerth',\n\t'Lacouture',\n\t'Lafoy',\n\t'Lapid',\n\t'Lardizabal',\n\t'Lembcke',\n\t'Maga',\n\t'Mahrt',\n\t'Maniatis',\n\t'Martinezlopez',\n\t'Martinovich',\n\t'Milham',\n\t'Muscatello',\n\t'Perezperez',\n\t'Quiocho',\n\t'Rickner',\n\t'Sackrider',\n\t'Schwarm',\n\t'Schwebke',\n\t'Scollard',\n\t'Seader',\n\t'Shutters',\n\t'Skare',\n\t'Slothower',\n\t'Steeber',\n\t'Want',\n\t'Cherubini',\n\t'Coslett',\n\t'Degener',\n\t'Dulak',\n\t'Faull',\n\t'Freyman',\n\t'Gatchel',\n\t'Ginzburg',\n\t'Gronberg',\n\t'Landeck',\n\t'Lehenbauer',\n\t'Lubke',\n\t'Mcconaughey',\n\t'Mendonsa',\n\t'Minnehan',\n\t'Palaguachi',\n\t'Peedin',\n\t'Raithel',\n\t'Rezabek',\n\t'Rolfson',\n\t'Schuitema',\n\t'Sjodin',\n\t'Underkoffler',\n\t'Verrilli',\n\t'Yogi',\n\t'Zimpfer',\n\t'Zingaro',\n\t'Butrum',\n\t'Ritson',\n\t'Martinka',\n\t'Cashatt',\n\t'Kearn',\n\t'Sawtell',\n\t'Boyster',\n\t'Broyhill',\n\t'Cockerell',\n\t'Thane',\n\t'Resende',\n\t'Pealer',\n\t'Perrot',\n\t'Everhardt',\n\t'Breach',\n\t'Bry',\n\t'Juma',\n\t'Mclaine',\n\t'Paddy',\n\t'Hennesy',\n\t'Ledee',\n\t'Web',\n\t'Delone',\n\t'Louison',\n\t'Hamiel',\n\t'Tutson',\n\t'Bellingham',\n\t'Brenn',\n\t'Bussen',\n\t'Charrette',\n\t'Denenberg',\n\t'Depascale',\n\t'Derner',\n\t'Dondlinger',\n\t'Favro',\n\t'Frana',\n\t'Goeser',\n\t'Guerrini',\n\t'Hamideh',\n\t'Hetu',\n\t'Hnat',\n\t'Hollerbach',\n\t'Kenagy',\n\t'Kregel',\n\t'Lammi',\n\t'Laubacher',\n\t'Madarang',\n\t'Mangine',\n\t'Marut',\n\t'Mcmahen',\n\t'Memoli',\n\t'Milko',\n\t'Morash',\n\t'Mulvehill',\n\t'Nelles',\n\t'Perfecto',\n\t'Perkes',\n\t'Pesantes',\n\t'Peschke',\n\t'Polyakov',\n\t'Preheim',\n\t'Prust',\n\t'Reha',\n\t'Richardt',\n\t'Rockers',\n\t'Sartwell',\n\t'Schedler',\n\t'Scheler',\n\t'Skop',\n\t'Stefko',\n\t'Tatlock',\n\t'Tiley',\n\t'Waldecker',\n\t'Weinbaum',\n\t'Aguallo',\n\t'Benassi',\n\t'Bezio',\n\t'Bockover',\n\t'Dobesh',\n\t'Encina',\n\t'Eversman',\n\t'Haverfield',\n\t'Heigl',\n\t'Holzhauser',\n\t'Liebenow',\n\t'Mesenbrink',\n\t'Mittendorf',\n\t'Normoyle',\n\t'Pickart',\n\t'Rosselot',\n\t'Shigley',\n\t'Skufca',\n\t'Stroot',\n\t'Walth',\n\t'Wernert',\n\t'Lahood',\n\t'Ragain',\n\t'Stumpe',\n\t'Kolle',\n\t'Minerd',\n\t'Dickeson',\n\t'Koone',\n\t'Stoessel',\n\t'Kington',\n\t'Soe',\n\t'Wailes',\n\t'Monet',\n\t'Mccullars',\n\t'Huguenin',\n\t'Warnell',\n\t'Calip',\n\t'Sandles',\n\t'Fayson',\n\t'Balik',\n\t'Bauermeister',\n\t'Bianculli',\n\t'Bin',\n\t'Bring',\n\t'Busenbark',\n\t'Canevari',\n\t'Crile',\n\t'Dyment',\n\t'Egelhoff',\n\t'Elbe',\n\t'Estudillo',\n\t'Feigel',\n\t'Flammer',\n\t'Folta',\n\t'Ghuman',\n\t'Hefferan',\n\t'Hennick',\n\t'Hosner',\n\t'Kilner',\n\t'Liuzzi',\n\t'Maj',\n\t'Massing',\n\t'Nicolaisen',\n\t'Ohlrich',\n\t'Ozdemir',\n\t'Piccininni',\n\t'Prem',\n\t'Primiano',\n\t'Reek',\n\t'Riling',\n\t'Rohweder',\n\t'Rosasco',\n\t'Sandau',\n\t'Santarsiero',\n\t'Schuhmacher',\n\t'Stenseth',\n\t'Stilts',\n\t'Strohmeier',\n\t'Thorell',\n\t'Torr',\n\t'Vaswani',\n\t'Yono',\n\t'Amadon',\n\t'Ballowe',\n\t'Betke',\n\t'Borgwardt',\n\t'Decelle',\n\t'Dibiasio',\n\t'Fieldhouse',\n\t'Hegyi',\n\t'Heuberger',\n\t'Kreiling',\n\t'Montney',\n\t'Sammut',\n\t'Senseney',\n\t'Takenaka',\n\t'Tramonte',\n\t'Zalesky',\n\t'Zumstein',\n\t'Bents',\n\t'Vandersluis',\n\t'Wieringa',\n\t'Houlton',\n\t'Lippens',\n\t'Maino',\n\t'Keeny',\n\t'Bethards',\n\t'Guillette',\n\t'Lenn',\n\t'Minge',\n\t'Masley',\n\t'Christley',\n\t'Gabrielle',\n\t'Bruington',\n\t'Perren',\n\t'Ander',\n\t'Leeb',\n\t'Callicott',\n\t'Peaster',\n\t'Hardister',\n\t'Daughtridge',\n\t'Mclauchlin',\n\t'Culliver',\n\t'Missouri',\n\t'Aloisi',\n\t'Barua',\n\t'Bezek',\n\t'Broshears',\n\t'Busbin',\n\t'Cajamarca',\n\t'Dellarocco',\n\t'Dezeeuw',\n\t'Ferrelli',\n\t'Fieber',\n\t'Fredin',\n\t'Giovannoni',\n\t'Glasner',\n\t'Grenda',\n\t'Haberl',\n\t'Heimsoth',\n\t'Heinl',\n\t'Hellickson',\n\t'Hernandezlopez',\n\t'Huckeby',\n\t'Jungman',\n\t'Langhans',\n\t'Lingelbach',\n\t'Manera',\n\t'Maneri',\n\t'Marzella',\n\t'Mennen',\n\t'Molesworth',\n\t'Nagano',\n\t'Narula',\n\t'Niner',\n\t'Nordhoff',\n\t'Olazabal',\n\t'Perfect',\n\t'Plonka',\n\t'Pund',\n\t'Reincke',\n\t'Schimek',\n\t'Seegert',\n\t'Summar',\n\t'Tanori',\n\t'Trethewey',\n\t'Wehler',\n\t'Wirthlin',\n\t'Wolaver',\n\t'Zuver',\n\t'Bendure',\n\t'Bither',\n\t'Bungert',\n\t'Chaviano',\n\t'Derhammer',\n\t'Disbro',\n\t'Facchini',\n\t'Hoefle',\n\t'Hoepner',\n\t'Kimmes',\n\t'Korus',\n\t'Manfredonia',\n\t'Neuser',\n\t'Samarin',\n\t'Sanghera',\n\t'Sherburn',\n\t'Shiplett',\n\t'Steckelberg',\n\t'Faist',\n\t'Cardy',\n\t'Colan',\n\t'Goodbar',\n\t'Boro',\n\t'Moden',\n\t'Hardick',\n\t'Esteve',\n\t'Rawling',\n\t'Benet',\n\t'Nabers',\n\t'Atkerson',\n\t'Countess',\n\t'Thwaites',\n\t'Caroline',\n\t'Whisonant',\n\t'Alridge',\n\t'Pamphile',\n\t'Abdelnour',\n\t'Allebach',\n\t'Armenti',\n\t'Baudendistel',\n\t'Biers',\n\t'Bockrath',\n\t'Borgert',\n\t'Bovino',\n\t'Burgamy',\n\t'Cadiente',\n\t'Calabretta',\n\t'Cariveau',\n\t'Christoffel',\n\t'Daigler',\n\t'Dannels',\n\t'Darnold',\n\t'Decock',\n\t'Dominski',\n\t'Fest',\n\t'Forren',\n\t'Freise',\n\t'Galperin',\n\t'Hackbart',\n\t'Holtzer',\n\t'Idell',\n\t'Kapala',\n\t'Kohlenberg',\n\t'Kolton',\n\t'Lemburg',\n\t'Lievanos',\n\t'Maranan',\n\t'Marchitto',\n\t'Masini',\n\t'Mayabb',\n\t'Mccrossen',\n\t'Metrick',\n\t'Molinelli',\n\t'Oehlert',\n\t'Parlee',\n\t'Pizzini',\n\t'Polachek',\n\t'Salmans',\n\t'Selbe',\n\t'Sickman',\n\t'Stegmaier',\n\t'Sulek',\n\t'Thall',\n\t'Tiznado',\n\t'Tonini',\n\t'Trostel',\n\t'Warshawsky',\n\t'Aument',\n\t'Byrer',\n\t'Dechaine',\n\t'Fearnow',\n\t'Gallicchio',\n\t'Gertler',\n\t'Greubel',\n\t'Hironaka',\n\t'Kashner',\n\t'Kleffner',\n\t'Korthals',\n\t'Kundinger',\n\t'Lenger',\n\t'Lingafelter',\n\t'Luczynski',\n\t'Ostermeier',\n\t'Petrasek',\n\t'Righetti',\n\t'Tvedt',\n\t'Weindel',\n\t'Wurtzel',\n\t'Zumbro',\n\t'Wikel',\n\t'Burdi',\n\t'Ozturk',\n\t'Parmele',\n\t'Oteri',\n\t'Alexa',\n\t'Erven',\n\t'Keng',\n\t'Fare',\n\t'Sade',\n\t'Saw',\n\t'Jaquay',\n\t'Pillay',\n\t'Kearsley',\n\t'Kirkby',\n\t'Game',\n\t'Herst',\n\t'Vallie',\n\t'Bayon',\n\t'Whitler',\n\t'Pe',\n\t'Lockerman',\n\t'Cogle',\n\t'Rouzer',\n\t'Curling',\n\t'Mandley',\n\t'Kleckley',\n\t'Buckson',\n\t'Risby',\n\t'Averhart',\n\t'Almendariz',\n\t'Angelopoulos',\n\t'Brallier',\n\t'Decaire',\n\t'Deloria',\n\t'Derham',\n\t'Drudge',\n\t'Eckelberry',\n\t'Ehling',\n\t'Engebretsen',\n\t'Ercole',\n\t'Fiscal',\n\t'Gabino',\n\t'Gelvin',\n\t'Giannetto',\n\t'Godeaux',\n\t'Goshert',\n\t'Hedrich',\n\t'Ioannou',\n\t'Jungbluth',\n\t'Kia',\n\t'Krusemark',\n\t'Lader',\n\t'Lythgoe',\n\t'Malinak',\n\t'Mcinvale',\n\t'Melis',\n\t'Metsker',\n\t'Minasyan',\n\t'Nuhfer',\n\t'Omana',\n\t'Parco',\n\t'Pha',\n\t'Phanthavong',\n\t'Proa',\n\t'Sarli',\n\t'Schirtzinger',\n\t'Schlotter',\n\t'Sharrar',\n\t'Spielberg',\n\t'Stelzner',\n\t'Tschudy',\n\t'Utke',\n\t'Weipert',\n\t'Yera',\n\t'Berkemeier',\n\t'Bothun',\n\t'Dalporto',\n\t'Deschler',\n\t'Dragonetti',\n\t'Hasz',\n\t'Holtzinger',\n\t'Kallal',\n\t'Kesinger',\n\t'Kilfoyle',\n\t'Kobylinski',\n\t'Kramme',\n\t'Kreh',\n\t'Lindseth',\n\t'Plaugher',\n\t'Rehfeldt',\n\t'Repine',\n\t'Roudabush',\n\t'Swoveland',\n\t'Teper',\n\t'Tucek',\n\t'Wadding',\n\t'Wenzlick',\n\t'Ghobrial',\n\t'Golberg',\n\t'Soyka',\n\t'Matura',\n\t'Moras',\n\t'Natter',\n\t'Apps',\n\t'Imran',\n\t'Rossel',\n\t'Harne',\n\t'Les',\n\t'Silla',\n\t'Deblanc',\n\t'Rhinehardt',\n\t'Delaware',\n\t'Alkins',\n\t'Laidley',\n\t'Maree',\n\t'Cassells',\n\t'Abdulrahman',\n\t'Cange',\n\t'Devone',\n\t'Eustache',\n\t'Negash',\n\t'Tanks',\n\t'Sivels',\n\t'Cabbagestalk',\n\t'Ahlin',\n\t'Akard',\n\t'Barbaree',\n\t'Bielat',\n\t'Bressman',\n\t'Capurro',\n\t'Cortazar',\n\t'Dauphinee',\n\t'Dornak',\n\t'Eckl',\n\t'Eisenhuth',\n\t'Fazzini',\n\t'Fraim',\n\t'Glaab',\n\t'Glod',\n\t'Guedea',\n\t'Hearty',\n\t'Hinostroza',\n\t'Honold',\n\t'Jostes',\n\t'Korzeniewski',\n\t'Lobell',\n\t'Lopardo',\n\t'Middlekauff',\n\t'Monfils',\n\t'Oshana',\n\t'Schiappa',\n\t'Schubach',\n\t'Servantez',\n\t'Shaler',\n\t'Siverson',\n\t'Slimp',\n\t'Slovacek',\n\t'Staat',\n\t'Strassman',\n\t'Waffle',\n\t'Wuebker',\n\t'Beigel',\n\t'Berardo',\n\t'Berkery',\n\t'Bloyer',\n\t'Cronkright',\n\t'Cuautle',\n\t'Devenny',\n\t'Ghrist',\n\t'Gipple',\n\t'Gwilliam',\n\t'Hunzeker',\n\t'Ierardi',\n\t'Kathol',\n\t'Kienle',\n\t'Krack',\n\t'Loeper',\n\t'Minchey',\n\t'Pecht',\n\t'Schaberg',\n\t'Schollmeyer',\n\t'Siniscalchi',\n\t'Toback',\n\t'Tramp',\n\t'Vandaele',\n\t'Witzig',\n\t'Wivell',\n\t'Moros',\n\t'Saso',\n\t'Gares',\n\t'Heagle',\n\t'Murrillo',\n\t'Stankey',\n\t'Shamon',\n\t'Avram',\n\t'Achor',\n\t'Ovens',\n\t'Rames',\n\t'Perris',\n\t'Kernes',\n\t'Semmes',\n\t'Thaw',\n\t'Stevison',\n\t'Clemetson',\n\t'Belmar',\n\t'Guster',\n\t'Bascomb',\n\t'Adrien',\n\t'Jeanpaul',\n\t'Alabi',\n\t'Jallow',\n\t'Atamian',\n\t'Basque',\n\t'Bubier',\n\t'Casad',\n\t'Czekaj',\n\t'Dejoy',\n\t'Dulworth',\n\t'Fatula',\n\t'Favale',\n\t'Feutz',\n\t'Freundlich',\n\t'Frid',\n\t'Gagan',\n\t'Gaughran',\n\t'Guderian',\n\t'Hagemeister',\n\t'Haser',\n\t'Leibman',\n\t'Meddings',\n\t'Narlock',\n\t'Offenberger',\n\t'Pesa',\n\t'Poupard',\n\t'Raus',\n\t'Repetti',\n\t'Revello',\n\t'Robarts',\n\t'Rowin',\n\t'Saltarelli',\n\t'Sanghvi',\n\t'Schleyer',\n\t'Silba',\n\t'Steuck',\n\t'Stoffers',\n\t'Tangredi',\n\t'Taussig',\n\t'Tiso',\n\t'Wehmeier',\n\t'Zwiefelhofer',\n\t'Bartelson',\n\t'Brabender',\n\t'Cornfield',\n\t'Davtyan',\n\t'Delnero',\n\t'Frontino',\n\t'Gathman',\n\t'Graessle',\n\t'Hinchcliff',\n\t'Houdeshell',\n\t'Kapler',\n\t'Karabin',\n\t'Kerestes',\n\t'Lemmen',\n\t'Merkt',\n\t'Mitro',\n\t'Nahm',\n\t'Nancarrow',\n\t'Novakowski',\n\t'Parraz',\n\t'Revolorio',\n\t'Schamel',\n\t'Scowden',\n\t'Steever',\n\t'Suastegui',\n\t'Villarin',\n\t'Wuellner',\n\t'Dooly',\n\t'Erno',\n\t'Arbelo',\n\t'Groshek',\n\t'Boliver',\n\t'Gane',\n\t'Bees',\n\t'Dowds',\n\t'Newmann',\n\t'Kewley',\n\t'Stile',\n\t'Lobe',\n\t'Skeet',\n\t'Burgen',\n\t'Mckamie',\n\t'Hubanks',\n\t'Suleman',\n\t'Billey',\n\t'Efferson',\n\t'Mcleary',\n\t'Housen',\n\t'Shambley',\n\t'Fanfan',\n\t'Bacca',\n\t'Battaglini',\n\t'Bonfanti',\n\t'Bongers',\n\t'Butzin',\n\t'Caira',\n\t'Councilman',\n\t'Crounse',\n\t'Dadisman',\n\t'Donais',\n\t'Estabrooks',\n\t'Fornoff',\n\t'Froh',\n\t'Gaige',\n\t'Garofolo',\n\t'Grivas',\n\t'Jacuinde',\n\t'Kalmus',\n\t'Kientz',\n\t'Kostenko',\n\t'Kras',\n\t'Lagoy',\n\t'Larzelere',\n\t'Lizer',\n\t'Maric',\n\t'Mayette',\n\t'Mcfeeters',\n\t'Meadowcroft',\n\t'Newgent',\n\t'Parpart',\n\t'Pauwels',\n\t'Perriello',\n\t'Persichetti',\n\t'Proietti',\n\t'Siefring',\n\t'Simones',\n\t'Taliercio',\n\t'Thilges',\n\t'Thumann',\n\t'Thun',\n\t'Tuomi',\n\t'Uhde',\n\t'Umscheid',\n\t'Uran',\n\t'Velador',\n\t'Veltkamp',\n\t'Waddoups',\n\t'Yeley',\n\t'Bihn',\n\t'Bladow',\n\t'Boeh',\n\t'Chadderdon',\n\t'Ensing',\n\t'Fasbender',\n\t'Folkert',\n\t'Goellner',\n\t'Heitmeyer',\n\t'Iovine',\n\t'Klinke',\n\t'Nessel',\n\t'Perleberg',\n\t'Rajagopal',\n\t'Sackmann',\n\t'Sapio',\n\t'Schickling',\n\t'Schliep',\n\t'Siminski',\n\t'Sirrine',\n\t'Sporn',\n\t'Stockburger',\n\t'Tangonan',\n\t'Tarkowski',\n\t'Tartaglione',\n\t'Traum',\n\t'Vanoverbeke',\n\t'Weirauch',\n\t'Wellendorf',\n\t'Wonnacott',\n\t'Camplin',\n\t'Leth',\n\t'Meltz',\n\t'Cavero',\n\t'Florido',\n\t'Tremont',\n\t'Riviello',\n\t'Piotter',\n\t'Munce',\n\t'Trescott',\n\t'Eben',\n\t'Vaillant',\n\t'Furches',\n\t'Bazen',\n\t'Esse',\n\t'Losier',\n\t'Zahir',\n\t'Lazier',\n\t'Lightell',\n\t'Christal',\n\t'Behe',\n\t'Blayney',\n\t'Buchalter',\n\t'Demarsh',\n\t'Dhondt',\n\t'Diefendorf',\n\t'Dillavou',\n\t'Dombkowski',\n\t'Duchow',\n\t'Fettes',\n\t'Gallaga',\n\t'Gallet',\n\t'Haaf',\n\t'Hartinger',\n\t'Jech',\n\t'Klas',\n\t'Kostal',\n\t'Kubler',\n\t'Leisey',\n\t'Leisinger',\n\t'Marinas',\n\t'Mcpeck',\n\t'Miccio',\n\t'Mikkola',\n\t'Morath',\n\t'Olthoff',\n\t'Pacific',\n\t'Penado',\n\t'Petronio',\n\t'Pirani',\n\t'Pitones',\n\t'Pociask',\n\t'Ratay',\n\t'Riesberg',\n\t'Ruberto',\n\t'Sabet',\n\t'Sabic',\n\t'Simonich',\n\t'Skains',\n\t'Skarzynski',\n\t'Spreeman',\n\t'Steig',\n\t'Struckhoff',\n\t'Trolinger',\n\t'Uliano',\n\t'Vaquerano',\n\t'Zukas',\n\t'Zwahlen',\n\t'Amborn',\n\t'Amspacher',\n\t'Azzaro',\n\t'Bartoletti',\n\t'Berkstresser',\n\t'Buboltz',\n\t'Ekstein',\n\t'Fohl',\n\t'Heinzel',\n\t'Hellmer',\n\t'Kapfer',\n\t'Kurka',\n\t'Mccreless',\n\t'Miyahira',\n\t'Nebergall',\n\t'Orlosky',\n\t'Pajor',\n\t'Quartararo',\n\t'Rahilly',\n\t'Rzasa',\n\t'Sabas',\n\t'Slutz',\n\t'Speros',\n\t'Stumpp',\n\t'Tamburo',\n\t'Tesler',\n\t'Tonkovich',\n\t'Urbieta',\n\t'Vallandingham',\n\t'Youngdahl',\n\t'Juliana',\n\t'Rienstra',\n\t'Prideaux',\n\t'Coval',\n\t'Hausen',\n\t'Seith',\n\t'Ny',\n\t'Bian',\n\t'Gressman',\n\t'Yanick',\n\t'Mannina',\n\t'Nater',\n\t'Gurry',\n\t'Vaile',\n\t'Sortor',\n\t'Woodington',\n\t'Apollo',\n\t'Mozley',\n\t'Patience',\n\t'Hearron',\n\t'Milloy',\n\t'Huntsberry',\n\t'Polidore',\n\t'Ridges',\n\t'Bonton',\n\t'Mercadel',\n\t'Alikhan',\n\t'Antis',\n\t'Bartosiewicz',\n\t'Brems',\n\t'Clopper',\n\t'Colato',\n\t'Collver',\n\t'Daino',\n\t'Degrande',\n\t'Dellis',\n\t'Depner',\n\t'Disantis',\n\t'Dolecki',\n\t'Dollens',\n\t'Eliasen',\n\t'Fasig',\n\t'Favinger',\n\t'Furuta',\n\t'Gharibian',\n\t'Gombar',\n\t'Gordo',\n\t'Gornik',\n\t'Gulas',\n\t'Khoshaba',\n\t'Laurita',\n\t'Liby',\n\t'Linhardt',\n\t'Lookabaugh',\n\t'Lorincz',\n\t'Mautner',\n\t'Mcquigg',\n\t'Meine',\n\t'Melaragno',\n\t'Meroney',\n\t'Mikesh',\n\t'Miu',\n\t'Monasterio',\n\t'Navarete',\n\t'Orendain',\n\t'Puricelli',\n\t'Riede',\n\t'Rubis',\n\t'Sandness',\n\t'Schellhase',\n\t'Stehlin',\n\t'Sunder',\n\t'Teaney',\n\t'Terman',\n\t'Tith',\n\t'Totino',\n\t'Tudisco',\n\t'Urwin',\n\t'Vandrunen',\n\t'Vasicek',\n\t'Youtz',\n\t'Berwald',\n\t'Bilow',\n\t'Bubolz',\n\t'Cieslewicz',\n\t'Denbleyker',\n\t'Ensinger',\n\t'Gantenbein',\n\t'Gurnsey',\n\t'Herceg',\n\t'Kless',\n\t'Kollias',\n\t'Leppek',\n\t'Naeve',\n\t'Oncale',\n\t'Pastran',\n\t'Pinyan',\n\t'Porrata',\n\t'Pustejovsky',\n\t'Renko',\n\t'Scioli',\n\t'Sinkhorn',\n\t'Sporrer',\n\t'Tomkiewicz',\n\t'Weisbeck',\n\t'Gautam',\n\t'Gleed',\n\t'Shave',\n\t'Crotzer',\n\t'Demarr',\n\t'Reckard',\n\t'Coyt',\n\t'Norberto',\n\t'Ury',\n\t'Crispen',\n\t'Parcells',\n\t'Meiklejohn',\n\t'Risden',\n\t'Bracker',\n\t'Askari',\n\t'Hyneman',\n\t'Auberry',\n\t'Bruney',\n\t'Weakly',\n\t'Ysaguirre',\n\t'Calender',\n\t'Benison',\n\t'Nazaire',\n\t'Pondexter',\n\t'Fryson',\n\t'Aguino',\n\t'Antonino',\n\t'Babilonia',\n\t'Banfill',\n\t'Beger',\n\t'Berardino',\n\t'Bizub',\n\t'Contractor',\n\t'Convey',\n\t'Cossairt',\n\t'Cruzen',\n\t'Dible',\n\t'Dorning',\n\t'Ellena',\n\t'Fafard',\n\t'Fano',\n\t'Favaro',\n\t'Feeler',\n\t'Foulger',\n\t'Gulbrandson',\n\t'Heckaman',\n\t'Heimerman',\n\t'Herms',\n\t'Hotchkin',\n\t'Jinright',\n\t'Kisler',\n\t'Kontz',\n\t'Kryder',\n\t'Lopezperez',\n\t'Lumm',\n\t'Mcelravy',\n\t'Meditz',\n\t'Melucci',\n\t'Meras',\n\t'Miyahara',\n\t'Musella',\n\t'Nelis',\n\t'Nhem',\n\t'Olivan',\n\t'Popson',\n\t'Presgraves',\n\t'Reindel',\n\t'Riege',\n\t'Rivenburgh',\n\t'Sahl',\n\t'Selberg',\n\t'Tashiro',\n\t'Todorov',\n\t'Toutant',\n\t'Turski',\n\t'Vankuren',\n\t'Westrup',\n\t'Beeney',\n\t'Bickhart',\n\t'Borkenhagen',\n\t'Bukoski',\n\t'Citrin',\n\t'Civello',\n\t'Forstrom',\n\t'Froning',\n\t'Geiler',\n\t'Hargadon',\n\t'Hemric',\n\t'Jeffus',\n\t'Klingele',\n\t'Kooiker',\n\t'Lizalde',\n\t'Nardiello',\n\t'Pestka',\n\t'Pignato',\n\t'Pudwill',\n\t'Rabelo',\n\t'Remund',\n\t'Skluzacek',\n\t'Stegenga',\n\t'Steidle',\n\t'Stenz',\n\t'Terlecki',\n\t'Vanselow',\n\t'Waskey',\n\t'Azhar',\n\t'Wroe',\n\t'Tool',\n\t'Leibert',\n\t'Vary',\n\t'Scovell',\n\t'Derick',\n\t'Arrey',\n\t'Cavness',\n\t'Garley',\n\t'Sholtz',\n\t'Legard',\n\t'Heyliger',\n\t'Thorns',\n\t'Sowells',\n\t'Alemu',\n\t'Aragones',\n\t'Ayllon',\n\t'Baab',\n\t'Blankenbeckler',\n\t'Brengle',\n\t'Burick',\n\t'Deuser',\n\t'Disabato',\n\t'Doddridge',\n\t'Dolinski',\n\t'Economy',\n\t'Ems',\n\t'Hagenow',\n\t'Iwen',\n\t'Kiesler',\n\t'Lehrmann',\n\t'Loisel',\n\t'Mallicoat',\n\t'Mansouri',\n\t'Marse',\n\t'Mccartt',\n\t'Menninger',\n\t'Montee',\n\t'Nappa',\n\t'Ohanesian',\n\t'Podgurski',\n\t'Prosch',\n\t'Puder',\n\t'Ritthaler',\n\t'Rodelo',\n\t'Shipper',\n\t'Shorkey',\n\t'Sirna',\n\t'Smedberg',\n\t'Smink',\n\t'Strahle',\n\t'Troeger',\n\t'Twaddell',\n\t'Vandyk',\n\t'Wandrey',\n\t'Yaworski',\n\t'Zagami',\n\t'Duecker',\n\t'Finlinson',\n\t'Frysinger',\n\t'Grush',\n\t'Knackstedt',\n\t'Morozov',\n\t'Murgia',\n\t'Naffziger',\n\t'Ontko',\n\t'Piltz',\n\t'Roskelley',\n\t'Sonderman',\n\t'Garrand',\n\t'Kopack',\n\t'Theys',\n\t'Sanseverino',\n\t'Budai',\n\t'Selwyn',\n\t'Assante',\n\t'Nary',\n\t'Fildes',\n\t'Tano',\n\t'Hogen',\n\t'Gennett',\n\t'Melka',\n\t'Thorner',\n\t'Grandjean',\n\t'Dury',\n\t'Gerrald',\n\t'Quilling',\n\t'Mccallon',\n\t'Preister',\n\t'Kydd',\n\t'Cranshaw',\n\t'Folson',\n\t'Roker',\n\t'Dockett',\n\t'Stfort',\n\t'Haymer',\n\t'Njie',\n\t'Adamik',\n\t'Aredondo',\n\t'Bathrick',\n\t'Beldin',\n\t'Blackwater',\n\t'Branscom',\n\t'Cappucci',\n\t'Cartelli',\n\t'Carullo',\n\t'Cunneen',\n\t'Davee',\n\t'Deboy',\n\t'Defrates',\n\t'Esham',\n\t'Furio',\n\t'Garverick',\n\t'Gimlin',\n\t'Gosline',\n\t'Gromer',\n\t'Halbig',\n\t'Hasbrook',\n\t'Holgerson',\n\t'Hupfer',\n\t'Jochem',\n\t'Kihn',\n\t'Klotzbach',\n\t'Lantagne',\n\t'Leichter',\n\t'Lerette',\n\t'Lupu',\n\t'Machorro',\n\t'Mieles',\n\t'Mikulec',\n\t'Mirante',\n\t'Nasrallah',\n\t'Piccini',\n\t'Pinkhasov',\n\t'Poplaski',\n\t'Pottenger',\n\t'Rahrig',\n\t'Ranganathan',\n\t'Ravan',\n\t'Righi',\n\t'Rogacki',\n\t'Sadlon',\n\t'Salafia',\n\t'Schlitz',\n\t'Slayback',\n\t'Stetzel',\n\t'Tamargo',\n\t'Tenore',\n\t'Verkuilen',\n\t'Vuncannon',\n\t'Waggle',\n\t'Bacorn',\n\t'Boerema',\n\t'Cimorelli',\n\t'Ciresi',\n\t'Dethlefs',\n\t'Dimarzo',\n\t'Ficco',\n\t'Floresca',\n\t'Gnau',\n\t'Hefel',\n\t'Holbein',\n\t'Klepacki',\n\t'Konigsberg',\n\t'Lienau',\n\t'Malsam',\n\t'Meidl',\n\t'Nawabi',\n\t'Netzley',\n\t'Renbarger',\n\t'Rumbold',\n\t'Sarafian',\n\t'Sonnenfeld',\n\t'Tindol',\n\t'Trettin',\n\t'Tuckerman',\n\t'Vanderweele',\n\t'Weppler',\n\t'Westbay',\n\t'Zaveri',\n\t'Boran',\n\t'Deighan',\n\t'Rothery',\n\t'Yom',\n\t'Gatley',\n\t'Caldron',\n\t'Lucado',\n\t'Dromgoole',\n\t'Novell',\n\t'Sherriff',\n\t'Gerrick',\n\t'Balgobin',\n\t'Danger',\n\t'Sookram',\n\t'Daron',\n\t'Knibbs',\n\t'Faggart',\n\t'Beidleman',\n\t'Russey',\n\t'Lagrand',\n\t'Bluett',\n\t'Glaspy',\n\t'Baldon',\n\t'Trueheart',\n\t'Cradle',\n\t'Asfaw',\n\t'Ballinas',\n\t'Bogdon',\n\t'Brizzi',\n\t'Carrio',\n\t'Cherny',\n\t'Crogan',\n\t'Depierro',\n\t'Dhami',\n\t'Dresden',\n\t'Finnicum',\n\t'Geltz',\n\t'Granade',\n\t'Granieri',\n\t'Guia',\n\t'Hashagen',\n\t'Hollick',\n\t'Jicha',\n\t'Jollie',\n\t'Kathan',\n\t'Malara',\n\t'Manabat',\n\t'Mehall',\n\t'Midcap',\n\t'Mitre',\n\t'Newburg',\n\t'Parveen',\n\t'Pianka',\n\t'Plouff',\n\t'Posillico',\n\t'Ransier',\n\t'Reano',\n\t'Roskam',\n\t'Rufer',\n\t'Schnetzer',\n\t'Scorsone',\n\t'Sitterly',\n\t'Skilton',\n\t'Sohail',\n\t'Starin',\n\t'Stavish',\n\t'Tufaro',\n\t'Vano',\n\t'Vinsant',\n\t'Vlahakis',\n\t'Vondrasek',\n\t'Waldroop',\n\t'Wamboldt',\n\t'Achatz',\n\t'Bomkamp',\n\t'Fetzner',\n\t'Gemmer',\n\t'Haroutunian',\n\t'Hurtig',\n\t'Juncaj',\n\t'Kleban',\n\t'Knier',\n\t'Kopischke',\n\t'Kugelman',\n\t'Lacoss',\n\t'Meulemans',\n\t'Neyens',\n\t'Niccoli',\n\t'Oberhaus',\n\t'Penkala',\n\t'Podoll',\n\t'Roupp',\n\t'Scozzari',\n\t'Siverling',\n\t'Uhls',\n\t'Werber',\n\t'Grealish',\n\t'Montieth',\n\t'Haik',\n\t'Kuri',\n\t'Kanaan',\n\t'Prenatt',\n\t'Dingledine',\n\t'Mccamy',\n\t'Balin',\n\t'Droney',\n\t'Clyatt',\n\t'Ramone',\n\t'Anglen',\n\t'Mathus',\n\t'Bagent',\n\t'Lamarque',\n\t'Arscott',\n\t'Romes',\n\t'Speigner',\n\t'Latouche',\n\t'Tripplett',\n\t'Eversley',\n\t'Aquirre',\n\t'Bernales',\n\t'Bouthillier',\n\t'Cavendish',\n\t'Detienne',\n\t'Dewbre',\n\t'Dimuro',\n\t'Dosh',\n\t'Dunklee',\n\t'Duyck',\n\t'Emilio',\n\t'Ence',\n\t'Garofano',\n\t'Gellis',\n\t'Haertel',\n\t'Handyside',\n\t'Hornburg',\n\t'Jenniges',\n\t'Kallhoff',\n\t'Klontz',\n\t'Langsdorf',\n\t'Leabo',\n\t'Lorette',\n\t'Maracle',\n\t'Merta',\n\t'Muoio',\n\t'Nierenberg',\n\t'Oborn',\n\t'Osorto',\n\t'Ruscitti',\n\t'Santaella',\n\t'Spinnato',\n\t'Stentz',\n\t'Stocke',\n\t'Sundt',\n\t'Thorup',\n\t'Tresch',\n\t'Urdaneta',\n\t'Uttech',\n\t'Vosler',\n\t'Wieand',\n\t'Zacharia',\n\t'Zeleznik',\n\t'Zoucha',\n\t'Zuch',\n\t'Abrell',\n\t'Atiyeh',\n\t'Aydt',\n\t'Cleeton',\n\t'Crisan',\n\t'Cwikla',\n\t'Denz',\n\t'Diesing',\n\t'Emmi',\n\t'Fringer',\n\t'Gibbard',\n\t'Graunke',\n\t'Gschwind',\n\t'Hafele',\n\t'Hoogland',\n\t'Howsare',\n\t'Kesecker',\n\t'Kilgallon',\n\t'Kleyman',\n\t'Kufahl',\n\t'Laut',\n\t'Malstrom',\n\t'Michetti',\n\t'Nosbisch',\n\t'Rasner',\n\t'Rosekrans',\n\t'Schnebly',\n\t'Staebell',\n\t'Theilen',\n\t'Tieszen',\n\t'Mellone',\n\t'Burcher',\n\t'Feister',\n\t'Hoage',\n\t'Irmen',\n\t'Derwin',\n\t'Dien',\n\t'Markins',\n\t'Egnew',\n\t'Dunlow',\n\t'Brickel',\n\t'Curt',\n\t'Smyly',\n\t'Whedbee',\n\t'Larman',\n\t'Boisselle',\n\t'Jaquess',\n\t'Bowns',\n\t'Nile',\n\t'Boyson',\n\t'Phillipps',\n\t'Weech',\n\t'Pillars',\n\t'Cauldwell',\n\t'Wynns',\n\t'Toca',\n\t'Scorza',\n\t'Ramsaran',\n\t'Arkwright',\n\t'Gurganious',\n\t'Jubert',\n\t'Beed',\n\t'Kellem',\n\t'Gervin',\n\t'Yarn',\n\t'Bookhart',\n\t'Sullen',\n\t'Moncrieffe',\n\t'Eze',\n\t'Agyeman',\n\t'Aldea',\n\t'Amodei',\n\t'Attig',\n\t'Bergthold',\n\t'Blaskowski',\n\t'Blitzer',\n\t'Bowring',\n\t'Brenning',\n\t'Chappuis',\n\t'Cordasco',\n\t'Cosens',\n\t'Denoble',\n\t'Dochterman',\n\t'Domek',\n\t'Embleton',\n\t'Georgiades',\n\t'Gintz',\n\t'Grooters',\n\t'Hoell',\n\t'Honse',\n\t'Jagiello',\n\t'Jaskulski',\n\t'Kaluzny',\n\t'Keske',\n\t'Khiev',\n\t'Koeneman',\n\t'Majestic',\n\t'Mandile',\n\t'Marandola',\n\t'Mcinroy',\n\t'Nienhaus',\n\t'Peckenpaugh',\n\t'Raquel',\n\t'Rossler',\n\t'Rusconi',\n\t'Schaffert',\n\t'Schipani',\n\t'Sittner',\n\t'Sweezey',\n\t'Swenor',\n\t'Tagliaferro',\n\t'Tubby',\n\t'Ulep',\n\t'Vallette',\n\t'Westergren',\n\t'Yaros',\n\t'Yasui',\n\t'Anway',\n\t'Bannick',\n\t'Biasi',\n\t'Breitling',\n\t'Catarino',\n\t'Dunaj',\n\t'Giovanelli',\n\t'Hemmerich',\n\t'Iott',\n\t'Knotek',\n\t'Kraeger',\n\t'Laskaris',\n\t'Lomboy',\n\t'Oleski',\n\t'Reibel',\n\t'Rightmyer',\n\t'Salmela',\n\t'Salow',\n\t'Siebels',\n\t'Spielvogel',\n\t'Streitmatter',\n\t'Ucci',\n\t'Windmiller',\n\t'Wojtkiewicz',\n\t'Zirkel',\n\t'Markie',\n\t'Nedeau',\n\t'Froehle',\n\t'Jesson',\n\t'Regala',\n\t'Boody',\n\t'Hayen',\n\t'Ose',\n\t'Loewy',\n\t'Radliff',\n\t'Davia',\n\t'Sky',\n\t'Halker',\n\t'Alu',\n\t'Ey',\n\t'Badawi',\n\t'Yeargain',\n\t'Jeanette',\n\t'Doublin',\n\t'Nolton',\n\t'Streety',\n\t'Blueford',\n\t'Abeles',\n\t'Aldava',\n\t'Alsteen',\n\t'Altadonna',\n\t'Apa',\n\t'Behlke',\n\t'Bellisario',\n\t'Bienstock',\n\t'Brenan',\n\t'Capley',\n\t'Castoro',\n\t'Demir',\n\t'Evinger',\n\t'Gartside',\n\t'Gellatly',\n\t'Goldinger',\n\t'Grabel',\n\t'Henkin',\n\t'Herrle',\n\t'Honegger',\n\t'Kunin',\n\t'Larmer',\n\t'Lizano',\n\t'Lorino',\n\t'Malcomson',\n\t'Matesic',\n\t'Mathiasen',\n\t'Mccolm',\n\t'Meenach',\n\t'Mullady',\n\t'Neiderer',\n\t'Ogier',\n\t'Omura',\n\t'Plog',\n\t'Pomplun',\n\t'Procida',\n\t'Raisbeck',\n\t'Rastetter',\n\t'Reither',\n\t'Rettberg',\n\t'Roblee',\n\t'Rossitto',\n\t'Scahill',\n\t'Schmoker',\n\t'Segreto',\n\t'Shelstad',\n\t'Shwartz',\n\t'Sondgeroth',\n\t'Supnet',\n\t'Swartzbaugh',\n\t'Tkachenko',\n\t'Urbani',\n\t'Vanslooten',\n\t'Varricchio',\n\t'Villarino',\n\t'Whiston',\n\t'Wyffels',\n\t'Yehle',\n\t'Basinski',\n\t'Belvedere',\n\t'Bernabei',\n\t'Bolotin',\n\t'Bresett',\n\t'Dabkowski',\n\t'Dalsanto',\n\t'Gotwalt',\n\t'Hellberg',\n\t'Hunke',\n\t'Kroenke',\n\t'Leppla',\n\t'Luginbuhl',\n\t'Mimnaugh',\n\t'Mullenbach',\n\t'Nearhood',\n\t'Raser',\n\t'Resendis',\n\t'Seydel',\n\t'Sozio',\n\t'Stillions',\n\t'Stormont',\n\t'Strimple',\n\t'Toruno',\n\t'Trouten',\n\t'Tryba',\n\t'Vandalen',\n\t'Wilhelmy',\n\t'Orland',\n\t'Loui',\n\t'Morcos',\n\t'Radell',\n\t'Artus',\n\t'Truxillo',\n\t'Copelan',\n\t'Bress',\n\t'Unthank',\n\t'Sudlow',\n\t'Branden',\n\t'Rowzee',\n\t'Montreuil',\n\t'Sollers',\n\t'Umar',\n\t'Coulibaly',\n\t'Allegretto',\n\t'Andreen',\n\t'Bielicki',\n\t'Bustard',\n\t'Cardosi',\n\t'Carkhuff',\n\t'Cetina',\n\t'Clouthier',\n\t'Dolata',\n\t'Fiola',\n\t'Fjeld',\n\t'Gawthrop',\n\t'Glastetter',\n\t'Hamlyn',\n\t'Hanten',\n\t'Huerter',\n\t'Kreiss',\n\t'Lestrange',\n\t'Litzau',\n\t'Luberto',\n\t'Menconi',\n\t'Milosevic',\n\t'Munera',\n\t'Nachtigal',\n\t'Nethers',\n\t'Nicolaou',\n\t'Olund',\n\t'Paddack',\n\t'Pfiester',\n\t'Pilley',\n\t'Polendo',\n\t'Porcayo',\n\t'Preast',\n\t'Runquist',\n\t'Saccente',\n\t'Santoli',\n\t'Saragoza',\n\t'Selway',\n\t'Smestad',\n\t'Stebner',\n\t'Toben',\n\t'Trapnell',\n\t'Urschel',\n\t'Verno',\n\t'Vidovich',\n\t'Walterscheid',\n\t'Yoh',\n\t'Zmijewski',\n\t'Allwein',\n\t'Bessire',\n\t'Broering',\n\t'Budzik',\n\t'Denherder',\n\t'Goerner',\n\t'Goldbaum',\n\t'Grussing',\n\t'Huaracha',\n\t'Ippoliti',\n\t'Kanak',\n\t'Kaucher',\n\t'Kious',\n\t'Kirkner',\n\t'Kratzke',\n\t'Kubisiak',\n\t'Kueny',\n\t'Mazzilli',\n\t'Mazzo',\n\t'Mcclenathan',\n\t'Mehlberg',\n\t'Miotke',\n\t'Nihiser',\n\t'Olheiser',\n\t'Oravetz',\n\t'Radwanski',\n\t'Shinsato',\n\t'Vandekamp',\n\t'Zagata',\n\t'Abert',\n\t'Llera',\n\t'Thommen',\n\t'Wirkkala',\n\t'Brasuell',\n\t'Shawler',\n\t'Mourey',\n\t'Gavia',\n\t'Morgano',\n\t'Newill',\n\t'Rathel',\n\t'Wist',\n\t'Braner',\n\t'Soman',\n\t'Koskey',\n\t'Searson',\n\t'Brocksmith',\n\t'Peale',\n\t'Couzens',\n\t'Shall',\n\t'Anis',\n\t'Stanly',\n\t'Cauthorn',\n\t'Kinkle',\n\t'Laughinghouse',\n\t'Mellette',\n\t'Rox',\n\t'Demetrius',\n\t'Cullars',\n\t'Summons',\n\t'Banwart',\n\t'Bartl',\n\t'Bebb',\n\t'Bobier',\n\t'Bogdanoff',\n\t'Bollmann',\n\t'Borrowman',\n\t'Borseth',\n\t'Buttitta',\n\t'Canelo',\n\t'Cassedy',\n\t'Cata',\n\t'Crivelli',\n\t'Daane',\n\t'Dhingra',\n\t'Dipple',\n\t'Dovidio',\n\t'Duesler',\n\t'Eissler',\n\t'Ent',\n\t'Falotico',\n\t'Goodrick',\n\t'Goupil',\n\t'Huels',\n\t'Keithly',\n\t'Killilea',\n\t'Klausing',\n\t'Kludt',\n\t'Licitra',\n\t'Llerenas',\n\t'Merolla',\n\t'Oatley',\n\t'Osmanovic',\n\t'Poudrier',\n\t'Raben',\n\t'Realmuto',\n\t'Reczek',\n\t'Ricchio',\n\t'Rossner',\n\t'Rozak',\n\t'Sandora',\n\t'Schuenemann',\n\t'Seres',\n\t'Shoptaw',\n\t'Splitt',\n\t'Tonkinson',\n\t'Willardson',\n\t'Winterberg',\n\t'Zayac',\n\t'Bobzien',\n\t'Buhman',\n\t'Carotenuto',\n\t'Chynoweth',\n\t'Defenbaugh',\n\t'Dipiero',\n\t'Duve',\n\t'Goonan',\n\t'Gragert',\n\t'Hangartner',\n\t'Heemstra',\n\t'Hensch',\n\t'Hollatz',\n\t'Jakubowicz',\n\t'Kapaun',\n\t'Kiener',\n\t'Landesman',\n\t'Lenzini',\n\t'Longbottom',\n\t'Parde',\n\t'Pincock',\n\t'Schlicker',\n\t'Shankel',\n\t'Vidas',\n\t'Waisner',\n\t'Zilberman',\n\t'Allcock',\n\t'Durban',\n\t'Javid',\n\t'Shoda',\n\t'Edes',\n\t'Boxwell',\n\t'Dezern',\n\t'Rubley',\n\t'Angelica',\n\t'Jeannette',\n\t'Planer',\n\t'Pata',\n\t'Lothridge',\n\t'Lucks',\n\t'Bais',\n\t'Sandra',\n\t'Enwright',\n\t'Maxton',\n\t'Radway',\n\t'Hoof',\n\t'Morisset',\n\t'Danzey',\n\t'Ancar',\n\t'Mcwright',\n\t'Leggs',\n\t'Monestime',\n\t'Massaquoi',\n\t'Barkow',\n\t'Bastyr',\n\t'Bautz',\n\t'Behanna',\n\t'Bewick',\n\t'Bezdek',\n\t'Bielby',\n\t'Bretschneider',\n\t'Bugher',\n\t'Carchi',\n\t'Chapp',\n\t'Conser',\n\t'Crete',\n\t'Derflinger',\n\t'Elsbernd',\n\t'Freimark',\n\t'Gerwin',\n\t'Grunfeld',\n\t'Harpham',\n\t'Hoeschen',\n\t'Holmlund',\n\t'Horch',\n\t'Hulsebus',\n\t'Kassabian',\n\t'Konczal',\n\t'Korell',\n\t'Lacuesta',\n\t'Lantier',\n\t'Larowe',\n\t'Lietzke',\n\t'Lunny',\n\t'Masin',\n\t'Massicotte',\n\t'Michalsky',\n\t'Notarianni',\n\t'Pautsch',\n\t'Poppy',\n\t'Sukup',\n\t'Suleski',\n\t'Tafel',\n\t'Wanninger',\n\t'Zaffino',\n\t'Zody',\n\t'Arganbright',\n\t'Bohmer',\n\t'Cintora',\n\t'Connatser',\n\t'Dlugos',\n\t'Fariello',\n\t'Fedie',\n\t'Felicetti',\n\t'Garno',\n\t'Gottsch',\n\t'Gratzer',\n\t'Gubser',\n\t'Kappelman',\n\t'Kuechle',\n\t'Laningham',\n\t'Latsch',\n\t'Longie',\n\t'Luscher',\n\t'Lybeck',\n\t'Rhude',\n\t'Setterlund',\n\t'Sobh',\n\t'Sonneborn',\n\t'Villamizar',\n\t'Wolstenholme',\n\t'Zacek',\n\t'Leppanen',\n\t'Casdorph',\n\t'Pinsker',\n\t'Reutov',\n\t'Rede',\n\t'Sheck',\n\t'Bakley',\n\t'Radde',\n\t'Moher',\n\t'Khader',\n\t'Rossie',\n\t'Scriver',\n\t'Provine',\n\t'Debarge',\n\t'Darke',\n\t'Griswell',\n\t'Naji',\n\t'Frere',\n\t'Cheevers',\n\t'Schnyder',\n\t'Curb',\n\t'Luten',\n\t'Cashaw',\n\t'Agerton',\n\t'Barnier',\n\t'Bluestone',\n\t'Boward',\n\t'Boyar',\n\t'Briano',\n\t'Bryngelson',\n\t'Calef',\n\t'Caraher',\n\t'Castelluccio',\n\t'Conk',\n\t'Crewse',\n\t'Demarzo',\n\t'Deutschman',\n\t'Eckrote',\n\t'Edmister',\n\t'Ferg',\n\t'Ghan',\n\t'Giampaolo',\n\t'Goedecke',\n\t'Gonet',\n\t'Gradel',\n\t'Gregston',\n\t'Grzesiak',\n\t'Guallpa',\n\t'Hanline',\n\t'Hardyman',\n\t'Hogate',\n\t'Houg',\n\t'Justiss',\n\t'Kaps',\n\t'Klopf',\n\t'Kniskern',\n\t'Laneve',\n\t'Lenhoff',\n\t'Lojewski',\n\t'Melott',\n\t'Milillo',\n\t'Passage',\n\t'Pereyda',\n\t'Plack',\n\t'Poet',\n\t'Prospero',\n\t'Quadros',\n\t'Revelo',\n\t'Rogier',\n\t'Sanabia',\n\t'Tragesser',\n\t'Vanarsdall',\n\t'Vanausdal',\n\t'Verbrugge',\n\t'Wandler',\n\t'Zoss',\n\t'Balzarini',\n\t'Brotz',\n\t'Bulin',\n\t'Bumann',\n\t'Cancro',\n\t'Centner',\n\t'Deblasi',\n\t'Duesing',\n\t'Friedley',\n\t'Frieling',\n\t'Heinke',\n\t'Holzheimer',\n\t'Klinck',\n\t'Knouff',\n\t'Kuczek',\n\t'Leible',\n\t'Lerum',\n\t'Liddicoat',\n\t'Mikowski',\n\t'Nonaka',\n\t'Ohlman',\n\t'Picaso',\n\t'Plamann',\n\t'Porretta',\n\t'Prajapati',\n\t'Rancour',\n\t'Stepka',\n\t'Studzinski',\n\t'Vaysman',\n\t'Wallenstein',\n\t'Wunderlin',\n\t'Pattinson',\n\t'Siskind',\n\t'Sitzer',\n\t'Thuman',\n\t'Barella',\n\t'Brillon',\n\t'Arnholt',\n\t'Karge',\n\t'Dohman',\n\t'Morone',\n\t'Macie',\n\t'Aken',\n\t'Lye',\n\t'Student',\n\t'Westen',\n\t'Bonsell',\n\t'Komara',\n\t'Hafiz',\n\t'Stickland',\n\t'Morina',\n\t'Creekmur',\n\t'Hussien',\n\t'Walrond',\n\t'Louischarles',\n\t'Alkema',\n\t'Angert',\n\t'Arcidiacono',\n\t'Ashkar',\n\t'Bookbinder',\n\t'Bootz',\n\t'Cilia',\n\t'Devilla',\n\t'Difatta',\n\t'Enberg',\n\t'Enderby',\n\t'Forbess',\n\t'Frutiger',\n\t'Graefe',\n\t'Guenette',\n\t'Hauschildt',\n\t'Keirsey',\n\t'Kolka',\n\t'Kopelman',\n\t'Lewan',\n\t'Mcluckie',\n\t'Mia',\n\t'Moebius',\n\t'Oestreicher',\n\t'Oprea',\n\t'Ortolano',\n\t'Padovani',\n\t'Pensabene',\n\t'Phimmasone',\n\t'Pointon',\n\t'Punches',\n\t'Schertzer',\n\t'Seoane',\n\t'Skramstad',\n\t'Sorlie',\n\t'Syfert',\n\t'Tasca',\n\t'Townzen',\n\t'Wernli',\n\t'Wurzel',\n\t'Yazdi',\n\t'Devendorf',\n\t'Featherly',\n\t'Frush',\n\t'Heringer',\n\t'Iwai',\n\t'Kallenberger',\n\t'Kobashigawa',\n\t'Langbehn',\n\t'Livecchi',\n\t'Middlesworth',\n\t'Niess',\n\t'Osterlund',\n\t'Ruz',\n\t'Seiwert',\n\t'Vanwieren',\n\t'Wernet',\n\t'Grabbe',\n\t'Gaugh',\n\t'Mcclarren',\n\t'Raudales',\n\t'Urry',\n\t'Clere',\n\t'Lacer',\n\t'Mathia',\n\t'Mccrumb',\n\t'Cotrell',\n\t'Mannor',\n\t'Medine',\n\t'Tittsworth',\n\t'Hughston',\n\t'Buick',\n\t'Limes',\n\t'Hams',\n\t'Thagard',\n\t'Leavelle',\n];\n\nexport const maxStringLength = 15;\n"
  },
  {
    "path": "drizzle-seed/src/datasets/loremIpsumSentences.ts",
    "content": "/**\n * Data was generated, using https://www.lipsum.com/\n */\nexport default [\n\t'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',\n\t'Nam porta quis ex a blandit.',\n\t'Donec ullamcorper erat sed diam luctus, eu euismod nibh eleifend.',\n\t'Curabitur sit amet tortor vehicula lacus mollis efficitur eu feugiat tortor.',\n\t'Quisque in erat vitae nisl tristique blandit.',\n\t'Vivamus in lectus tellus.',\n\t'Donec quis neque sit amet diam elementum accumsan.',\n\t'Sed vitae sollicitudin tellus, sed rhoncus magna.',\n\t'Aliquam eu interdum purus, sed viverra lorem.',\n\t'Etiam eget viverra dui.',\n\t'Morbi vel risus dolor.',\n\t'Donec laoreet, ipsum sed vestibulum venenatis, ligula leo fermentum enim, in pharetra lorem massa volutpat metus.',\n\t'Aliquam egestas mi in urna blandit, quis viverra justo condimentum.',\n\t'Maecenas pulvinar quam sapien, sed euismod enim rhoncus quis.',\n\t'Maecenas at quam non elit varius rutrum.',\n\t'Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.',\n\t'Quisque et malesuada erat.',\n\t'Maecenas eleifend tellus eu luctus tempor.',\n\t'Cras at scelerisque massa, quis dapibus urna.',\n\t'Aliquam porttitor a risus quis luctus.',\n\t'Aenean mollis ex tempor ligula cursus, interdum porttitor nibh fringilla.',\n\t'Donec aliquet ac nulla nec scelerisque.',\n\t'Curabitur neque diam, posuere nec tortor a, posuere pretium odio.',\n\t'Nullam et vehicula ante.',\n\t'Etiam mattis, odio quis sodales maximus, nisl lectus sagittis ligula, quis ornare urna nibh ac est.',\n\t'Pellentesque eget finibus eros.',\n\t'Maecenas gravida risus vitae vestibulum facilisis.',\n\t'Sed rhoncus libero fringilla arcu viverra tempus.',\n\t'Suspendisse non lacus vitae urna viverra vehicula.',\n\t'Pellentesque eu elementum enim.',\n\t'Morbi aliquet nisl eu accumsan rhoncus.',\n\t'Ut fringilla dolor ut odio blandit, et dignissim lectus placerat.',\n\t'Aliquam vulputate mauris elit, in semper purus accumsan tempor.',\n\t'Sed at elit ut ligula bibendum tincidunt.',\n\t'Maecenas ut tristique ipsum, ac sollicitudin quam.',\n\t'Pellentesque ut ante quis tellus pellentesque tempus.',\n\t'Nulla suscipit ex eget ex cursus accumsan.',\n\t'Sed at purus sapien.',\n\t'Fusce feugiat ante ac massa aliquam, maximus bibendum arcu convallis.',\n\t'Interdum et malesuada fames ac ante ipsum primis in faucibus.',\n\t'Cras vitae dignissim leo, ac pretium est.',\n\t'Aliquam lectus lectus, varius in eros eget, tempus sollicitudin ex.',\n\t'Nunc gravida mi lectus, tincidunt ultrices sapien lobortis cursus.',\n\t'Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.',\n\t'Maecenas aliquam vulputate justo vel lacinia.',\n\t'Nam facilisis augue vitae dolor mattis, sit amet maximus orci molestie.',\n\t'Etiam et nibh id lorem viverra aliquet.',\n\t'Quisque et mauris et odio finibus ullamcorper id eget odio.',\n\t'Duis sit amet varius purus.',\n\t'In congue posuere libero, nec tincidunt dui suscipit ac.',\n\t'Vivamus suscipit risus vel massa commodo pulvinar vitae eu diam.',\n\t'Mauris porta non orci at dapibus.',\n\t'Sed ullamcorper, sem ac fringilla tristique, purus massa hendrerit turpis, at elementum massa nulla nec quam.',\n\t'Praesent sed felis vitae felis vestibulum hendrerit vel at ipsum.',\n\t'Nunc egestas, lectus feugiat consequat auctor, erat mauris pretium sapien, et consequat magna ex id purus.',\n\t'Maecenas nibh ex, bibendum at augue eget, pulvinar cursus libero.',\n\t'Quisque ultricies vestibulum neque, in sollicitudin felis euismod in.',\n\t'Maecenas viverra mauris sit amet neque vulputate, sed suscipit sapien laoreet.',\n\t'Sed vitae sapien maximus, faucibus enim a, placerat erat.',\n\t'Cras maximus ipsum nec dui fermentum, eu facilisis augue fringilla.',\n\t'Sed eget nibh ante.',\n\t'Praesent pellentesque sodales tellus non consectetur.',\n\t'Suspendisse pulvinar, massa id gravida facilisis, diam nulla molestie metus, et convallis purus elit quis sapien.',\n\t'Mauris fermentum nec metus id consectetur.',\n\t'Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.',\n\t'Nulla vel maximus nunc.',\n\t'Duis dolor orci, tempor nec odio at, gravida congue ex.',\n\t'Pellentesque faucibus, est et eleifend commodo, ipsum nunc lobortis felis, at aliquam erat leo eu massa.',\n\t'Morbi egestas vehicula lacus, in pharetra nulla dictum in.',\n\t'Ut facilisis, erat eu suscipit mollis, ipsum ex sagittis augue, sit amet vehicula neque nunc ut leo.',\n\t'Donec dapibus non odio non auctor.',\n\t'Donec vitae ipsum eget risus vulputate vestibulum.',\n\t'Cras vestibulum purus leo, in porttitor erat finibus quis.',\n\t'Vivamus tincidunt justo diam, placerat maximus orci congue ac.',\n\t'Curabitur pulvinar congue accumsan.',\n\t'Vivamus eget velit dictum, sagittis diam eu, elementum diam.',\n\t'Quisque pharetra pellentesque purus at tristique.',\n\t'Cras dignissim arcu massa, eu pellentesque eros tristique id.',\n\t'Proin efficitur turpis vel sem ultricies molestie.',\n\t'Curabitur rhoncus viverra nibh ut sollicitudin.',\n\t'Vestibulum ut magna dolor.',\n\t'Suspendisse placerat eleifend lorem, at aliquet enim lacinia ut.',\n\t'Integer at nisi eu ex viverra viverra.',\n\t'Morbi finibus bibendum volutpat.',\n\t'Donec facilisis sem id eros tempor vehicula.',\n\t'Phasellus a dolor in dolor finibus iaculis et at quam.',\n\t'Phasellus volutpat nulla eget mauris blandit pharetra ut sit amet augue.',\n\t'Phasellus leo urna, ornare ut mauris ultrices, posuere imperdiet dui.',\n\t'Morbi accumsan bibendum neque, sit amet eleifend nunc bibendum nec.',\n\t'Praesent dapibus tristique tempor.',\n\t'Duis dapibus nulla in lectus luctus, nec blandit sem tristique.',\n\t'In odio dolor, consectetur eget sapien egestas, viverra pharetra urna.',\n\t'Nam risus est, suscipit fermentum tincidunt id, vehicula vitae arcu.',\n\t'Aenean venenatis pretium condimentum.',\n\t'Mauris lobortis blandit dapibus.',\n\t'Phasellus aliquet efficitur condimentum.',\n\t'Nam pulvinar ullamcorper metus ac vehicula.',\n\t'Donec eget auctor tellus.',\n\t'Morbi quis diam ultrices, tristique lectus eu, vehicula dolor.',\n\t'Aenean malesuada lorem sed vestibulum rutrum.',\n\t'Praesent quis metus id quam facilisis blandit.',\n\t'Proin venenatis eleifend augue nec gravida.',\n\t'Nulla eget vehicula mauris, vel rutrum ligula.',\n\t'Ut interdum aliquam fermentum.',\n\t'Morbi elementum metus ut velit pellentesque lacinia.',\n\t'Suspendisse malesuada est sed varius rhoncus.',\n\t'Sed eu porta ex.',\n\t'Nullam dignissim egestas dapibus.',\n\t'Vestibulum a pharetra ipsum.',\n\t'Donec in interdum diam.',\n\t'Morbi viverra id sem quis mollis.',\n\t'In eget porta lorem.',\n\t'Aliquam tincidunt feugiat magna, vel finibus odio rutrum sit amet.',\n\t'Morbi faucibus metus at vehicula efficitur.',\n\t'Cras metus lectus, egestas lacinia leo vitae, lacinia dapibus quam.',\n\t'Morbi tincidunt ut velit sed hendrerit.',\n\t'Vivamus eleifend at leo porttitor blandit.',\n\t'Morbi egestas diam augue, vel condimentum odio pulvinar id.',\n\t'Morbi porta vulputate ante sed lacinia.',\n\t'Fusce massa est, varius et lacinia sit amet, dictum at turpis.',\n\t'Vestibulum viverra augue elit, eget tristique ipsum accumsan vitae.',\n\t'Sed sit amet ex sapien.',\n\t'Mauris dapibus tincidunt scelerisque.',\n\t'Aliquam nunc libero, vestibulum id facilisis in, sollicitudin vitae nulla.',\n\t'Aenean a nulla commodo, rutrum orci eget, pellentesque erat.',\n\t'Aenean ut sem felis.',\n\t'Donec sapien ante, ornare sit amet ornare id, mattis lobortis tellus.',\n\t'Nam ut placerat metus.',\n\t'Vivamus in cursus eros, sit amet scelerisque mauris.',\n\t'Integer tempus, justo vel aliquet aliquam, mi libero iaculis leo, placerat sollicitudin mauris ipsum faucibus justo.',\n\t'Cras at vehicula urna.',\n\t'Phasellus id nunc eu enim ultricies hendrerit.',\n\t'Nulla sodales sodales orci in placerat.',\n\t'Donec placerat, justo in imperdiet euismod, nulla metus pharetra nibh, nec auctor tortor mauris ac augue.',\n\t'Donec at elit non odio malesuada consequat non id velit.',\n\t'Morbi pellentesque eleifend iaculis.',\n\t'Aliquam ullamcorper lacinia vulputate.',\n\t'Nulla commodo risus et efficitur mollis.',\n\t'In venenatis consectetur metus, in iaculis ligula bibendum fermentum.',\n\t'Nullam ac finibus nisl.',\n\t'Aenean blandit sagittis justo, ut cursus tortor vehicula vel.',\n\t'Integer at pulvinar eros, sed dictum ex.',\n\t'Phasellus bibendum interdum porttitor.',\n\t'Fusce blandit egestas nisl, quis mattis elit commodo in.',\n\t'Donec in ex justo.',\n\t'Aenean elementum tristique eros, vel mattis tellus malesuada nec.',\n\t'Quisque euismod tincidunt erat.',\n\t'Proin turpis orci, vehicula vitae ipsum et, auctor ornare ex.',\n\t'Nunc efficitur nisl sit amet justo faucibus, eu bibendum diam pretium.',\n\t'Nullam consectetur finibus dui at malesuada.',\n\t'Ut elementum, ante vitae gravida feugiat, orci enim molestie libero, ut vehicula purus ipsum a eros.',\n\t'Ut mi neque, vestibulum nec nibh eu, imperdiet elementum ipsum.',\n\t'Donec cursus augue quis ex rutrum lacinia.',\n\t'Mauris purus mi, pellentesque at leo in, auctor ultrices massa.',\n\t'Maecenas finibus quam quis arcu mattis porttitor.',\n\t'Suspendisse ac urna ac odio aliquet congue.',\n\t'Integer suscipit, odio in ullamcorper ornare, diam nibh elementum eros, a aliquam lacus velit vel mauris.',\n\t'Quisque ut bibendum risus.',\n\t'Suspendisse bibendum augue pellentesque, dapibus leo ac, luctus purus.',\n\t'Phasellus interdum ipsum sit amet elit rhoncus varius.',\n\t'Pellentesque pharetra lorem et nibh aliquam, vel luctus elit sodales.',\n\t'Maecenas ornare cursus metus in efficitur.',\n\t'Phasellus laoreet ipsum nec erat mattis, vitae vulputate risus auctor.',\n\t'Maecenas augue magna, mattis elementum dapibus sed, vulputate venenatis ante.',\n\t'Fusce non lorem vitae velit molestie auctor.',\n\t'Etiam sodales, orci sed consequat luctus, ante urna hendrerit ipsum, at ultrices mauris neque in velit.',\n\t'Vestibulum a egestas ipsum.',\n\t'Donec sit amet laoreet mi.',\n\t'Quisque varius ligula dolor.',\n\t'Morbi sodales volutpat nulla, et ullamcorper lacus bibendum at.',\n\t'In mattis in dui quis facilisis.',\n\t'Cras pulvinar, massa eu rhoncus rhoncus, mi mi ultricies turpis, eu iaculis elit nulla et metus.',\n\t'Donec et neque suscipit, iaculis ipsum at, maximus eros.',\n\t'Quisque eu accumsan risus.',\n\t'Phasellus in consectetur nisl.',\n\t'Nullam interdum porttitor enim fermentum bibendum.',\n\t'Vestibulum consequat fermentum mollis.',\n\t'Quisque id velit sit amet magna posuere aliquam vel in nunc.',\n\t'Maecenas nisl lectus, sollicitudin eu auctor nec, cursus vel quam.',\n\t'Proin elementum efficitur velit vel vestibulum.',\n\t'Nunc non tincidunt ex.',\n\t'Fusce nec nisl eget nunc fringilla dignissim vel nec ex.',\n\t'Cras malesuada erat quis ligula lacinia consectetur.',\n\t'Aliquam semper elit ante, sed accumsan lacus molestie in.',\n\t'Vivamus porttitor enim eros, eu ultricies lectus pulvinar eget.',\n\t'Nullam consequat tincidunt ligula, eu luctus nisi congue id.',\n\t'Aenean lacinia lobortis ante, fermentum vulputate turpis eleifend faucibus.',\n\t'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Phasellus tempus libero non ipsum cursus rhoncus.',\n\t'Sed euismod molestie augue vitae fringilla.',\n\t'Pellentesque mi tortor, tempor quis condimentum quis, lobortis quis quam.',\n\t'Sed in vestibulum purus, in vestibulum neque.',\n\t'Etiam pellentesque ligula ligula, sit amet varius mi venenatis fringilla.',\n\t'Morbi vitae est ac diam convallis sagittis in facilisis ligula.',\n\t'Sed vel consequat diam.',\n\t'Nunc ac tempor felis.',\n\t'Aenean luctus tristique urna lacinia venenatis.',\n\t'Suspendisse vehicula auctor accumsan.',\n\t'Suspendisse ultrices rhoncus nisi a pellentesque.',\n\t'Sed sollicitudin id orci ut laoreet.',\n\t'Cras pulvinar lorem ut ipsum malesuada, sed euismod turpis placerat.',\n\t'Ut vitae massa quis augue posuere ultricies.',\n\t'In quis erat posuere, posuere dolor ac, tempus tortor.',\n\t'Aliquam aliquet nisl eu tortor mollis, id dictum nisi congue.',\n\t'Etiam pulvinar, ex a tincidunt bibendum, nisl elit venenatis lacus, nec dictum odio ligula non nulla.',\n\t'Etiam sit amet nunc vestibulum, pharetra diam ac, lacinia felis.',\n\t'Quisque volutpat laoreet lorem, sit amet porta justo ultrices aliquet.',\n\t'Praesent aliquet nisi elit, ut facilisis orci accumsan vitae.',\n\t'Quisque vehicula augue at leo varius, ac dictum tortor viverra.',\n\t'Proin eu bibendum diam.',\n\t'Aliquam blandit, erat et feugiat varius, erat mauris convallis ipsum, ut convallis massa erat vel neque.',\n\t'Sed commodo nec ipsum in maximus.',\n\t'Pellentesque ligula nisl, tincidunt volutpat convallis non, interdum quis felis.',\n\t'Nunc ultrices neque ut diam congue, non tristique metus tempor.',\n\t'Pellentesque sodales metus leo, at eleifend dui pretium at.',\n\t'Suspendisse sit amet metus at est viverra fermentum.',\n\t'Donec ac odio vitae urna blandit consectetur.',\n\t'Vivamus tincidunt cursus nunc in mollis.',\n\t'Nullam malesuada quis odio eu imperdiet.',\n\t'Integer convallis sapien vitae semper varius.',\n\t'Nullam malesuada tincidunt lacus elementum condimentum.',\n\t'Nam eget neque vitae leo convallis aliquam id eu quam.',\n\t'Quisque aliquet elementum lectus, vitae pharetra nisl facilisis at.',\n\t'Fusce ut velit porttitor, porta erat ac, vehicula odio.',\n\t'Sed tempor est at nulla mollis aliquet.',\n\t'Quisque luctus dolor eu placerat ultrices.',\n\t'Vivamus luctus ex non ante pretium venenatis.',\n\t'Ut non arcu vitae velit pellentesque accumsan eget id risus.',\n\t'Pellentesque accumsan elementum turpis, a aliquam dui sodales nec.',\n\t'Donec quis semper tortor, scelerisque venenatis velit.',\n\t'Morbi tempus lacus pretium risus rhoncus, tincidunt lacinia diam dapibus.',\n\t'Donec libero neque, aliquet non aliquet et, mollis at est.',\n\t'Fusce mauris tortor, molestie ut porttitor nec, euismod consequat metus.',\n\t'Maecenas in nunc blandit, sagittis orci sed, fringilla risus.',\n\t'Suspendisse vel vulputate velit.',\n\t'Nulla aliquam facilisis velit.',\n\t'Donec placerat porttitor sapien.',\n\t'Quisque non pharetra mi.',\n\t'Suspendisse mattis justo nec arcu efficitur, nec suscipit mi tempor.',\n\t'Sed et dui vitae nisi accumsan faucibus nec vel odio.',\n\t'Donec at lacus eget nisi ultricies efficitur.',\n\t'Aenean ultricies elit eget mi consectetur imperdiet.',\n\t'Ut lorem magna, ullamcorper sit amet dui quis, pulvinar cursus felis.',\n\t'Morbi ligula nibh, fermentum nec pellentesque eget, sodales in sapien.',\n\t'Sed eu vehicula mi.',\n\t'Vestibulum et erat erat.',\n\t'Maecenas eleifend ultricies erat eget vehicula.',\n\t'Donec varius lectus ut metus finibus pellentesque.',\n\t'Aliquam nec orci scelerisque, elementum odio non, aliquet ante.',\n\t'Nulla eget nisi ac magna aliquet efficitur vitae sed felis.',\n\t'Suspendisse purus erat, blandit eget leo quis, iaculis vestibulum sapien.',\n\t'Vivamus rutrum, leo ac suscipit tincidunt, ipsum sem volutpat purus, quis sodales augue lacus id mi.',\n\t'Aenean interdum ac turpis eu viverra.',\n\t'Suspendisse rhoncus rutrum augue.',\n\t'Ut dolor lectus, rutrum et metus et, volutpat sagittis urna.',\n\t'Donec blandit tortor sed pellentesque maximus.',\n\t'Phasellus molestie congue erat, ut euismod leo pulvinar nec.',\n\t'Nulla elementum vestibulum libero vehicula aliquet.',\n\t'Sed venenatis enim eu nisi laoreet, sit amet sagittis magna gravida.',\n\t'Suspendisse semper molestie ligula sit amet lobortis.',\n\t'Nulla urna eros, condimentum a odio id, aliquet scelerisque justo.',\n\t'Suspendisse sit amet orci ante.',\n\t'Sed congue sem sapien, ac ornare nibh porta efficitur.',\n\t'Nullam suscipit, lectus ac gravida ultrices, lectus neque viverra sem, sit amet eleifend purus felis vulputate odio.',\n\t'In velit lacus, facilisis quis nunc vitae, imperdiet bibendum mauris.',\n\t'Duis iaculis sodales turpis, vestibulum rutrum eros efficitur ac.',\n\t'Aenean interdum congue libero vel suscipit.',\n\t'Quisque pharetra semper lorem ac posuere.',\n\t'Mauris viverra neque pellentesque, semper augue id, placerat arcu.',\n\t'Mauris sit amet bibendum nisi, a laoreet ipsum.',\n\t'Proin tristique auctor massa convallis imperdiet.',\n\t'Curabitur congue sed neque vel imperdiet.',\n\t'Quisque egestas metus at diam feugiat, vestibulum ornare nulla venenatis.',\n\t'Donec non hendrerit urna.',\n\t'Curabitur id justo ex.',\n\t'Sed consectetur urna a purus egestas, a fringilla leo scelerisque.',\n\t'Morbi interdum massa sed ligula dapibus semper.',\n\t'Nam sit amet condimentum erat.',\n\t'Nam vel magna porta, ultrices nisl eu, lacinia lorem.',\n\t'Pellentesque accumsan, felis sit amet elementum tincidunt, risus arcu bibendum eros, vitae commodo justo orci vitae ex.',\n\t'Vestibulum eu fermentum lacus.',\n\t'Nulla quis pulvinar metus.',\n\t'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Curabitur malesuada non erat vitae dapibus.',\n\t'Donec sit amet facilisis ante, vitae tristique risus.',\n\t'Vestibulum maximus vehicula purus sed tincidunt.',\n\t'Fusce facilisis odio et fermentum dapibus.',\n\t'In hac habitasse platea dictumst.',\n\t'Etiam et viverra felis, in vulputate enim.',\n\t'Donec vel pulvinar elit.',\n\t'Mauris quis velit suscipit, accumsan libero eget, consectetur sapien.',\n\t'Maecenas vel placerat justo, sit amet eleifend sem.',\n\t'Pellentesque cursus felis enim, vitae convallis lectus finibus et.',\n\t'Aliquam eu dolor eros.',\n\t'Cras dictum, est quis porttitor semper, turpis lacus maximus eros, at luctus diam orci et elit.',\n\t'Nulla id augue tincidunt, sollicitudin mi vel, pellentesque mi.',\n\t'Vestibulum ultricies turpis a congue rutrum.',\n\t'Praesent sed dictum nunc.',\n\t'Donec finibus commodo ligula non tincidunt.',\n\t'Aliquam eget tellus velit.',\n\t'Proin tempor elit at nulla commodo molestie.',\n\t'Morbi ultricies sit amet tortor eu porttitor.',\n\t'Duis congue elit ac porttitor lobortis.',\n\t'Sed fringilla mi pretium lacinia finibus.',\n\t'Maecenas faucibus metus sed ipsum tristique, sed vulputate odio bibendum.',\n\t'Nulla facilisi.',\n\t'Nulla non dapibus nibh, id ultricies augue.',\n\t'Vestibulum vitae lorem neque.',\n\t'Maecenas non augue nibh.',\n\t'Suspendisse laoreet dapibus auctor.',\n\t'In sit amet lorem eget purus ultrices tincidunt ut at neque.',\n\t'Fusce congue, nunc sit amet lobortis pellentesque, sapien ex rutrum elit, vel gravida nulla velit sed dui.',\n\t'Cras nec hendrerit sapien, eu euismod elit.',\n\t'Maecenas lobortis egestas interdum.',\n\t'Nunc sagittis bibendum erat sit amet varius.',\n\t'Mauris varius nunc at odio facilisis facilisis.',\n\t'Sed maximus sit amet urna vitae aliquam.',\n\t'Donec vel ipsum sed sapien aliquet pharetra id vitae leo.',\n\t'Sed vitae diam elit.',\n\t'Nam tempor, risus nec gravida mollis, velit neque efficitur leo, sit amet porta purus magna euismod ipsum.',\n\t'Suspendisse potenti.',\n\t'Donec interdum vulputate lorem, vitae pellentesque sem mollis at.',\n\t'Vivamus vitae faucibus libero.',\n\t'Etiam laoreet semper accumsan.',\n\t'Morbi imperdiet, ex ut fringilla fermentum, sapien ipsum efficitur magna, a ultrices purus massa at nibh.',\n\t'Sed a dolor euismod, facilisis ex eget, efficitur est.',\n\t'Phasellus eleifend, felis quis convallis semper, dui magna accumsan leo, a mattis magna urna in ligula.',\n\t'Donec porta sollicitudin vestibulum.',\n\t'Nunc et nisl in ligula iaculis rutrum id consequat neque.',\n\t'Nunc sed purus quis felis aliquet accumsan.',\n\t'Aliquam congue placerat condimentum.',\n\t'Proin ultrices condimentum facilisis.',\n\t'Aenean in faucibus odio.',\n\t'Pellentesque enim ex, mattis non risus ut, euismod imperdiet lorem.',\n\t'Integer quis magna non risus luctus posuere.',\n\t'Vestibulum pellentesque suscipit arcu, id dignissim leo rhoncus nec.',\n\t'Praesent vitae sodales quam.',\n\t'Morbi viverra nibh quam, quis dapibus nibh consequat sed.',\n\t'Morbi sed risus sollicitudin, tincidunt augue vel, posuere orci.',\n\t'Nunc nisi nisi, varius ac commodo ac, placerat hendrerit nisi.',\n\t'Donec sapien magna, elementum eu mi vitae, laoreet euismod turpis.',\n\t'Cras eget pretium eros.',\n\t'Sed tincidunt ante id tortor porta, ac pellentesque erat suscipit.',\n\t'Fusce consequat nisi dolor, eget tincidunt tellus imperdiet at.',\n\t'Nullam scelerisque commodo eleifend.',\n\t'Mauris et nisl bibendum, varius sem at, sollicitudin libero.',\n\t'Quisque purus felis, tristique id ligula in, ullamcorper pellentesque felis.',\n\t'Phasellus et tortor ut sem rhoncus suscipit ac eget elit.',\n\t'Donec rhoncus ex finibus neque volutpat, ut placerat metus gravida.',\n\t'Suspendisse at sem id diam efficitur dapibus.',\n\t'Aliquam erat volutpat.',\n\t'Nunc ac nibh eget augue sodales ornare.',\n\t'Integer ultricies neque at felis aliquam, vel interdum felis mollis.',\n\t'Nulla iaculis libero velit, a consequat eros hendrerit venenatis.',\n\t'Etiam aliquet eros magna, ut ultricies metus feugiat vitae.',\n\t'Maecenas est orci, accumsan eu eleifend vitae, sollicitudin vitae metus.',\n\t'Sed aliquet, tellus sed euismod sodales, lectus leo imperdiet dui, eu luctus mauris turpis id turpis.',\n\t'Sed eget accumsan felis, viverra euismod nulla.',\n\t'Nullam convallis odio consectetur nisl tempus, sed dictum urna tempor.',\n\t'Proin scelerisque elit tortor, a ultricies odio ullamcorper vel.',\n\t'Etiam ultrices congue neque ac sollicitudin.',\n\t'Ut placerat consectetur sapien ut rhoncus.',\n\t'Ut aliquam quam nec ornare fermentum.',\n\t'Vivamus aliquet facilisis magna.',\n\t'Vestibulum dictum sed leo non cursus.',\n\t'Morbi egestas et augue fringilla bibendum.',\n\t'Etiam vel maximus tellus.',\n\t'Praesent et turpis justo.',\n\t'Morbi a hendrerit diam, cursus posuere lorem.',\n\t'In sed sem id eros dignissim tincidunt.',\n\t'Nullam porta varius risus at ullamcorper.',\n\t'Nam varius sodales dolor, dapibus rutrum ligula vulputate at.',\n\t'Nam ultricies sed ante eget convallis.',\n\t'Duis ultrices est ac orci auctor, et malesuada neque sodales.',\n\t'Aliquam venenatis sodales aliquam.',\n\t'Phasellus ut lectus id sapien dictum luctus a vitae nibh.',\n\t'Sed euismod varius malesuada.',\n\t'Ut faucibus ultricies posuere.',\n\t'Nunc vitae diam in mi pellentesque vehicula eu elementum lectus.',\n\t'Vivamus gravida felis eget ipsum consectetur tincidunt.',\n\t'Nullam nunc eros, blandit ut finibus sit amet, porta nec lectus.',\n\t'Vestibulum non orci neque.',\n\t'Praesent velit massa, pulvinar quis mauris sit amet, consequat tincidunt mauris.',\n\t'Quisque id cursus magna.',\n\t'Donec eros ante, placerat at efficitur in, placerat id turpis.',\n\t'Morbi non dui tortor.',\n\t'Quisque at turpis sodales, pharetra justo ut, accumsan est.',\n\t'Sed molestie dolor mi, ac feugiat elit blandit et.',\n\t'Nullam libero ex, rutrum ac ultrices vitae, tincidunt ut velit.',\n\t'Proin pharetra placerat eros, eget mattis risus semper at.',\n\t'In feugiat congue risus.',\n\t'Curabitur non odio ligula.',\n\t'Nulla sit amet ligula facilisis, venenatis ante eget, porttitor libero.',\n\t'In eu sodales sem.',\n\t'In iaculis ex eget nisi euismod, eget porta libero condimentum.',\n\t'Vivamus tristique faucibus nunc.',\n\t'Nam sit amet cursus erat.',\n\t'Suspendisse ligula velit, molestie ac nisl quis, cursus sodales nunc.',\n\t'Nunc vel semper odio, at scelerisque felis.',\n\t'Fusce egestas purus id enim accumsan ultrices.',\n\t'Curabitur porttitor justo urna, nec ultricies magna varius non.',\n\t'Nullam euismod, nunc varius efficitur viverra, sem justo scelerisque elit, a pretium ante sem id mi.',\n\t'Sed sagittis faucibus urna, eu sollicitudin magna.',\n\t'Nam pretium velit quis lectus viverra sodales.',\n\t'Cras lectus mi, accumsan non vulputate et, hendrerit ac libero.',\n\t'Integer nec faucibus risus.',\n\t'Vestibulum a finibus nulla.',\n\t'Quisque consequat nisi varius, laoreet justo et, elementum dui.',\n\t'Praesent cursus quam nec vestibulum porta.',\n\t'Nunc fermentum semper molestie.',\n\t'Cras fermentum, sem et lobortis iaculis, magna erat bibendum sapien, in sollicitudin erat metus in lectus.',\n\t'Nullam ligula est, tincidunt vitae consectetur vel, rutrum at erat.',\n\t'Etiam in rhoncus nisl, ut tempor ex.',\n\t'Phasellus mollis tempus urna, vel hendrerit felis aliquam sit amet.',\n\t'Aliquam eget mi tellus.',\n\t'Maecenas consectetur enim diam, a fringilla nunc suscipit egestas.',\n\t'Phasellus ac efficitur dolor.',\n\t'Nullam efficitur metus a risus sodales, quis vestibulum urna lacinia.',\n\t'Nam eu risus vulputate, commodo purus quis, ullamcorper nunc.',\n\t'Maecenas in urna tortor.',\n\t'Duis a purus volutpat ligula tristique suscipit.',\n\t'Sed id libero accumsan, finibus ipsum et, sagittis justo.',\n\t'Suspendisse malesuada lectus in ligula interdum condimentum.',\n\t'Fusce viverra ipsum lacus, et condimentum nisi tincidunt vitae.',\n\t'Ut pulvinar sodales nisl non dictum.',\n\t'Proin et efficitur tortor.',\n\t'Cras viverra lacinia dolor, a condimentum mauris rhoncus eu.',\n\t'Quisque non nunc lobortis, iaculis neque et, venenatis eros.',\n\t'Etiam posuere, risus quis feugiat gravida, velit nisi ornare enim, vitae dictum leo massa id orci.',\n\t'Sed sit amet ligula nisi.',\n\t'Cras et velit eget urna pulvinar dignissim.',\n\t'Phasellus feugiat enim eu dolor molestie, vitae molestie dui consectetur.',\n\t'Morbi scelerisque sapien et diam tincidunt volutpat.',\n\t'Praesent viverra lobortis tristique.',\n\t'Vestibulum placerat rutrum congue.',\n\t'Sed vel leo eu odio feugiat bibendum.',\n\t'Mauris lobortis ante tortor, ac mattis nunc consequat sit amet.',\n\t'Aenean sollicitudin faucibus purus, ut facilisis neque convallis quis.',\n\t'Aenean sit amet risus in libero eleifend pellentesque nec non lacus.',\n\t'Maecenas iaculis at ligula eget rutrum.',\n\t'Aliquam vitae tristique justo.',\n\t'Aliquam enim nibh, porta accumsan tortor at, condimentum feugiat tellus.',\n\t'Morbi dignissim egestas maximus.',\n\t'Sed dui risus, vulputate ac accumsan vel, rhoncus vitae nunc.',\n\t'Phasellus elementum ac enim a tincidunt.',\n\t'Curabitur vulputate enim ut leo suscipit rhoncus.',\n\t'Ut vitae dapibus dui.',\n\t'Proin sed nulla purus.',\n\t'Etiam a eros elementum, fringilla orci nec, cursus magna.',\n\t'Curabitur egestas ultricies risus, vitae ultrices dolor.',\n\t'Donec et tempus leo.',\n\t'Phasellus justo tellus, lacinia ut lorem sed, pretium hendrerit dolor.',\n\t'Mauris in mattis libero, sed pulvinar lorem.',\n\t'Cras quis auctor velit.',\n\t'Vestibulum vitae hendrerit tortor.',\n\t'Cras dictum ligula eget arcu malesuada suscipit ac sed arcu.',\n\t'Suspendisse vel enim sit amet metus eleifend venenatis.',\n\t'Quisque eget purus in lorem vulputate congue.',\n\t'Curabitur non enim vulputate, accumsan purus nec, suscipit lacus.',\n\t'Donec eros est, pretium blandit semper eu, dignissim vitae leo.',\n\t'Maecenas molestie erat ac magna finibus, quis sollicitudin dui euismod.',\n\t'Curabitur rutrum dolor ut nibh suscipit luctus.',\n\t'Fusce venenatis orci nulla, eget semper libero dictum sed.',\n\t'Sed id justo id est eleifend tristique.',\n\t'Phasellus eleifend eget lectus vitae luctus.',\n\t'Fusce vitae dolor id dui aliquam gravida ac id ex.',\n\t'Maecenas elementum, mi sed suscipit malesuada, magna ex laoreet lorem, lacinia pellentesque erat nisl quis augue.',\n\t'Ut egestas tincidunt tincidunt.',\n\t'Nullam consectetur magna id dictum varius.',\n\t'Pellentesque mattis, velit ac volutpat euismod, ipsum magna volutpat tellus, ac pharetra dolor erat vel felis.',\n\t'Nunc pretium, tortor blandit gravida pretium, neque nulla vehicula diam, eget aliquet turpis eros eu orci.',\n\t'Integer non arcu eget odio eleifend tempor quis eget elit.',\n\t'Ut molestie nulla ornare, congue nulla vel, eleifend tellus.',\n\t'Pellentesque ultrices diam ut risus convallis viverra.',\n\t'Integer ex erat, molestie in rhoncus ornare, rhoncus id ipsum.',\n\t'Fusce non nulla id augue molestie malesuada.',\n\t'Proin in ornare ligula.',\n\t'Fusce sit amet augue eget orci imperdiet consequat.',\n\t'Maecenas sodales est dui, vel feugiat orci aliquam a.',\n\t'Aenean pulvinar quam in nunc fringilla, et convallis turpis congue.',\n\t'Proin ex erat, vehicula tristique mi vehicula, finibus congue ex.',\n\t'Nunc ornare fermentum convallis.',\n\t'Quisque scelerisque orci non dignissim sodales.',\n\t'Donec eget facilisis enim.',\n\t'Maecenas at libero at urna vestibulum mattis.',\n\t'Curabitur fringilla ex purus, quis egestas tortor lacinia nec.',\n\t'Sed vel est consequat, sagittis lacus at, ullamcorper augue.',\n\t'Sed eget dui ac nisi hendrerit auctor.',\n\t'Nulla consectetur placerat magna, at mattis felis rutrum in.',\n\t'Nullam vitae risus viverra, faucibus lacus a, eleifend eros.',\n\t'Nullam tempus sit amet eros vitae semper.',\n\t'Nullam vestibulum sem sed purus congue, hendrerit porttitor leo maximus.',\n\t'Praesent fringilla aliquet efficitur.',\n\t'Aliquam quis metus at ante posuere gravida.',\n\t'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aliquam sapien dui, mollis sed hendrerit id, fermentum sed tortor.',\n\t'Ut eget velit a urna interdum volutpat.',\n\t'Maecenas rhoncus dui vitae tempus rhoncus.',\n\t'Phasellus eu molestie sem.',\n\t'Mauris quis aliquam lectus, nec vehicula dui.',\n\t'Aenean eget imperdiet odio.',\n\t'Vestibulum non ullamcorper lacus.',\n\t'Etiam eu augue eget massa tempus rutrum eu sit amet leo.',\n\t'Vestibulum nec nulla quis tellus lacinia scelerisque quis vitae felis.',\n\t'Donec convallis, elit sit amet viverra fermentum, libero eros auctor elit, a tincidunt erat eros vitae ligula.',\n\t'Cras ornare placerat ultrices.',\n\t'Mauris blandit, nunc eu viverra interdum, est odio bibendum urna, eget mattis purus nisl sollicitudin mauris.',\n\t'Cras ornare velit ac facilisis rhoncus.',\n\t'Donec lacus lectus, consectetur in fringilla ac, aliquet et nisl.',\n\t'Morbi sit amet nulla vitae arcu porttitor elementum ac vitae nulla.',\n\t'Duis sed tristique velit, non rutrum tellus.',\n\t'Cras et imperdiet nisl.',\n\t'Fusce id ipsum a dui volutpat volutpat.',\n\t'Nam eget augue et lectus placerat vehicula.',\n\t'In egestas condimentum mi, id efficitur nunc mattis sit amet.',\n\t'Nunc pulvinar tortor nec dolor vehicula, at porta elit porttitor.',\n\t'Praesent ac auctor erat.',\n\t'Donec eu faucibus eros, eu varius tortor.',\n\t'Sed eget sapien at est lacinia molestie eu in ligula.',\n\t'Duis mollis vehicula cursus.',\n\t'Duis finibus auctor pellentesque.',\n\t'Nullam sed urna diam.',\n\t'Nulla quis ipsum lacinia, placerat nisl et, dignissim est.',\n\t'Vivamus hendrerit, urna vel pulvinar maximus, elit turpis placerat dolor, quis sodales erat turpis sed lorem.',\n\t'Nulla dapibus porta odio, at porta ligula convallis a.',\n\t'Morbi rhoncus tempor libero, lobortis facilisis ligula convallis at.',\n\t'Etiam dapibus lacinia massa a finibus.',\n\t'Nam eget convallis mi.',\n\t'Integer posuere consectetur nisl eu ullamcorper.',\n\t'Cras et lorem sit amet dui venenatis pellentesque non laoreet quam.',\n\t'Sed eget fermentum diam, eget suscipit nulla.',\n\t'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aliquam luctus eros quis metus faucibus luctus.',\n\t'Suspendisse rutrum libero magna, eu porttitor purus pretium vel.',\n\t'Curabitur ultricies pellentesque dui sit amet volutpat.',\n\t'Fusce tincidunt vulputate elit et efficitur.',\n\t'Nunc tincidunt malesuada dignissim.',\n\t'Nullam ornare venenatis purus semper porta.',\n\t'Nullam nisl massa, porttitor non gravida id, bibendum at dui.',\n\t'Curabitur rhoncus at massa ac ultricies.',\n\t'Phasellus aliquet ex in quam placerat feugiat.',\n\t'Nullam placerat in quam vitae venenatis.',\n\t'Vivamus quis mi accumsan, egestas nunc ac, laoreet arcu.',\n\t'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed faucibus imperdiet tortor vitae dapibus.',\n\t'Morbi neque sapien, aliquam eget leo in, maximus feugiat eros.',\n\t'In interdum ipsum quis dictum posuere.',\n\t'Vestibulum pellentesque ullamcorper rutrum.',\n\t'Vivamus sed lacus imperdiet, vehicula augue id, aliquet magna.',\n\t'Donec mollis auctor consectetur.',\n\t'Proin ultrices orci tellus, in volutpat leo pellentesque id.',\n\t'Donec sapien mauris, sagittis iaculis iaculis non, iaculis at nunc.',\n\t'In dapibus leo ac elit gravida, in ornare tortor mattis.',\n\t'Nam ac auctor arcu, id semper ex.',\n\t'Sed vitae mauris sagittis, vestibulum sapien sed, consectetur tortor.',\n\t'Sed dapibus metus vitae condimentum sagittis.',\n\t'Integer purus leo, pretium id vulputate sit amet, tempus at quam.',\n\t'Donec egestas laoreet efficitur.',\n\t'Phasellus et ante vehicula, consectetur lacus ut, vehicula nunc.',\n\t'Vestibulum ultricies, ligula et consequat fermentum, nisi mauris imperdiet turpis, tincidunt mollis felis tellus sed quam.',\n\t'Praesent id arcu dui.',\n\t'Suspendisse suscipit, velit vel tempus ultricies, turpis magna facilisis lectus, et varius enim sem vel enim.',\n\t'Vivamus id elit turpis.',\n\t'Duis porta, nibh sit amet pharetra dapibus, massa neque elementum turpis, et porta ante ex at libero.',\n\t'In tempus, sem a pulvinar viverra, turpis nulla malesuada metus, vitae posuere augue odio at nunc.',\n\t'Donec lectus sem, cursus ut vestibulum vitae, facilisis ac mi.',\n\t'Maecenas bibendum nisl eu libero hendrerit, vel mollis lorem tristique.',\n\t'Nulla cursus cursus mauris.',\n\t'Vestibulum laoreet augue ac nunc pulvinar, vestibulum ullamcorper purus volutpat.',\n\t'Vivamus iaculis euismod accumsan.',\n\t'Vestibulum eu dui feugiat, consectetur libero id, consectetur arcu.',\n\t'Nam lobortis ut turpis ac convallis.',\n\t'Duis dapibus turpis nec aliquet porta.',\n\t'Suspendisse id gravida nunc.',\n\t'Nullam tristique risus et magna dictum bibendum.',\n\t'Morbi semper tellus id arcu dictum, vitae accumsan purus sollicitudin.',\n\t'Nunc id laoreet diam.',\n\t'Praesent congue, elit ac molestie pharetra, nulla orci viverra turpis, quis tristique dolor sem quis magna.',\n\t'Donec eu ligula mauris.',\n\t'Etiam nec pretium arcu, et vehicula leo.',\n\t'Pellentesque non libero eu justo aliquet dictum.',\n\t'Mauris vel aliquet nulla.',\n\t'Aliquam vitae pharetra purus.',\n\t'Morbi aliquam aliquet malesuada.',\n\t'Duis id luctus arcu.',\n\t'In rutrum mattis leo.',\n\t'Sed mattis augue sed nulla porta, sit amet efficitur libero aliquet.',\n\t'Vivamus quis dignissim nibh.',\n\t'Donec accumsan vitae nisl ac placerat.',\n\t'Maecenas in neque nunc.',\n\t'Donec placerat quis ex id egestas.',\n\t'Quisque aliquam ex vel convallis eleifend.',\n\t'Mauris sodales elementum risus, quis fermentum augue vulputate a.',\n\t'Suspendisse sollicitudin finibus tellus, vitae sollicitudin eros tincidunt et.',\n\t'Nulla ut ex in eros consectetur aliquam.',\n\t'Ut maximus nulla tellus, eget tincidunt nulla auctor a.',\n\t'Vivamus accumsan dictum felis, sit amet tempor sapien pulvinar at.',\n\t'Morbi interdum, justo in scelerisque varius, purus enim vulputate nisi, consectetur interdum odio lorem vel justo.',\n\t'Aenean vitae hendrerit tortor.',\n\t'Suspendisse maximus imperdiet mi eu pellentesque.',\n\t'Quisque ultrices ultrices tortor, eget tristique odio pretium nec.',\n\t'Fusce metus dui, ultrices vel bibendum non, elementum sit amet magna.',\n\t'Nullam euismod ligula non ligula pulvinar, eu elementum velit cursus.',\n\t'Donec neque quam, feugiat nec vehicula non, ultricies non ex.',\n\t'Vivamus felis dui, vulputate in sollicitudin id, blandit nec odio.',\n\t'Pellentesque risus elit, mattis a purus vitae, varius auctor eros.',\n\t'Donec non rhoncus magna.',\n\t'Vestibulum volutpat orci enim, sed cursus massa vehicula ut.',\n\t'Vestibulum in rhoncus mi.',\n\t'Fusce vitae pulvinar nunc.',\n\t'Nam sit amet urna et lacus auctor accumsan et malesuada mauris.',\n\t'Curabitur ac eleifend urna.',\n\t'Maecenas a justo sed augue consequat blandit nec sit amet lacus.',\n\t'Phasellus vehicula est diam, in pharetra turpis porta ut.',\n\t'Nunc arcu lorem, pretium vitae feugiat in, elementum ac purus.',\n\t'Phasellus eget mollis diam, eu lacinia mi.',\n\t'Aenean eget lectus nulla.',\n\t'Integer sapien nibh, blandit quis libero mattis, ultricies consequat nisl.',\n\t'Nunc ac sagittis ligula, vel varius ante.',\n\t'Proin ut turpis a erat viverra lobortis eu quis quam.',\n\t'Mauris eu augue vel nisl interdum accumsan.',\n\t'Ut ut euismod leo.',\n\t'Aliquam urna turpis, blandit nec suscipit non, convallis at ante.',\n\t'Nulla quis molestie erat, ut venenatis nunc.',\n\t'Fusce pellentesque sit amet felis eu mattis.',\n\t'Mauris felis elit, gravida at dapibus ut, cursus at ante.',\n\t'Praesent in lacus euismod, porta ipsum id, feugiat mauris.',\n\t'Maecenas in eros nec arcu aliquet hendrerit.',\n\t'Duis bibendum rutrum mi.',\n\t'Donec elementum, felis eu fringilla placerat, mi lacus molestie tortor, et varius libero justo in tortor.',\n\t'Integer rutrum at neque et luctus.',\n\t'Nullam faucibus tempus metus, vitae dignissim leo viverra a.',\n\t'Integer augue erat, aliquet id tortor a, convallis dignissim tellus.',\n\t'Morbi elementum mollis tellus, id interdum arcu sodales sit amet.',\n\t'Suspendisse a sapien quis nibh convallis laoreet eu eget sem.',\n\t'Aliquam blandit odio vel nulla rhoncus dapibus.',\n\t'Nullam mollis tristique ligula, in tristique mauris eleifend id.',\n\t'Pellentesque eget consequat nunc.',\n\t'Donec et orci hendrerit, lacinia nisl in, pretium ex.',\n\t'Quisque sit amet eleifend tortor.',\n\t'Proin viverra dui eget tortor faucibus hendrerit.',\n\t'Etiam pretium fringilla justo, quis ornare risus posuere quis.',\n\t'Sed commodo maximus mauris, eu vulputate metus consectetur eget.',\n\t'Maecenas in arcu porttitor, condimentum arcu at, pretium ante.',\n\t'Ut vel urna viverra diam gravida condimentum non at enim.',\n\t'In ligula orci, malesuada convallis est a, egestas auctor elit.',\n\t'Sed blandit sagittis ipsum, id tempus diam ornare at.',\n\t'Mauris volutpat faucibus magna ac sodales.',\n\t'Fusce eget arcu et nunc rhoncus egestas et vel metus.',\n\t'Vestibulum egestas euismod bibendum.',\n\t'Ut id ex cursus, congue nulla ac, finibus mi.',\n\t'Suspendisse vitae tempor arcu.',\n\t'Integer ultricies orci purus, non finibus nisi laoreet in.',\n\t'Vestibulum metus purus, sodales rutrum tincidunt pharetra, eleifend vel dui.',\n\t'Pellentesque convallis dolor sed consequat pretium.',\n\t'Fusce suscipit ex ante, ac accumsan quam eleifend non.',\n\t'Donec porta, neque eu cursus cursus, enim arcu consequat neque, cursus laoreet dolor nunc at sem.',\n\t'Praesent sit amet arcu eros.',\n\t'Donec congue tellus nec mi ullamcorper pretium.',\n\t'Duis aliquet, orci eu facilisis dapibus, mauris erat congue neque, in commodo diam libero maximus urna.',\n\t'Curabitur interdum et metus at ullamcorper.',\n\t'Nulla a dui purus.',\n\t'Proin sed dapibus risus.',\n\t'Nunc consectetur posuere maximus.',\n\t'In sodales sem nisl, ut varius est venenatis at.',\n\t'Vestibulum non consectetur lorem.',\n\t'Nunc id risus sapien.',\n\t'Sed tristique condimentum tortor, tincidunt vulputate turpis.',\n\t'Ut neque purus, molestie eu varius vitae, venenatis sit amet nulla.',\n\t'Quisque dapibus libero libero, sed blandit lectus blandit sed.',\n\t'Nulla congue urna quis metus molestie vehicula.',\n\t'Vivamus sed aliquet felis, volutpat dignissim metus.',\n\t'Duis id augue neque.',\n\t'Nullam placerat mollis malesuada.',\n\t'Aenean malesuada elit ac ante imperdiet posuere sed et nibh.',\n\t'Vivamus id interdum ligula.',\n\t'Nunc nisl tellus, aliquam nec tristique et, elementum non est.',\n\t'Praesent fermentum gravida dolor, eu viverra justo posuere id.',\n\t'Ut nec iaculis velit, quis pretium mi.',\n\t'Vivamus scelerisque dolor sit amet erat dapibus consectetur.',\n\t'Pellentesque dolor risus, maximus quis gravida non, viverra sit amet dui.',\n\t'Phasellus placerat lectus velit, id ultrices augue posuere id.',\n\t'In consequat aliquet justo, in ornare turpis tempus sed.',\n\t'Fusce condimentum rhoncus condimentum.',\n\t'Phasellus convallis, sem molestie scelerisque congue, est justo lobortis diam, id commodo ligula ipsum eu nibh.',\n\t'Etiam id dolor vehicula, vehicula orci vitae, elementum dolor.',\n\t'Proin sit amet massa et dui varius auctor at nec ex.',\n\t'Donec ultrices sem vel nisi fermentum vulputate.',\n\t'In viverra quam ante, sit amet efficitur est varius sed.',\n\t'Sed vestibulum, tortor sed tincidunt congue, eros turpis mollis ipsum, id dictum nibh ipsum et metus.',\n\t'Proin nec sem eros.',\n\t'Donec vulputate lacus nisl, nec consectetur nulla blandit ac.',\n\t'Nulla sapien ipsum, tristique a mi sed, iaculis accumsan sapien.',\n\t'Etiam vitae est quis purus rhoncus blandit.',\n\t'Proin suscipit nec tortor sit amet malesuada.',\n\t'Aenean felis odio, facilisis sit amet enim in, condimentum sollicitudin ante.',\n\t'Nullam porttitor vel nulla sit amet feugiat.',\n\t'Phasellus mi libero, vulputate eu magna at, molestie aliquet erat.',\n\t'Mauris eros lorem, malesuada nec ligula vitae, pellentesque consequat est.',\n\t'Donec sodales pellentesque mi vitae pulvinar.',\n\t'Morbi sapien nisi, commodo nec ultricies et, iaculis nec nisl.',\n\t'Vestibulum maximus luctus elit malesuada tincidunt.',\n\t'Duis eget varius orci, eget sagittis eros.',\n\t'Quisque eu eros nisl.',\n\t'Pellentesque eleifend aliquam metus, a finibus neque sodales eu.',\n\t'Sed tempus ligula sapien, eu scelerisque nisl porttitor gravida.',\n\t'Sed vitae lectus sit amet lectus ornare interdum.',\n\t'Aenean arcu diam, porta sit amet lorem eget, sagittis iaculis erat.',\n\t'Nulla pharetra, sem non auctor ultrices, ex metus dictum magna, at sollicitudin ex justo ut turpis.',\n\t'Sed aliquam luctus semper.',\n\t'Nullam vitae malesuada sapien, tempor scelerisque lorem.',\n\t'Integer congue lorem ligula, ac volutpat lorem sagittis id.',\n\t'Nam nec pretium elit.',\n\t'Quisque volutpat ex dui, a sagittis augue consequat tincidunt.',\n\t'Cras tristique felis arcu, at vestibulum enim scelerisque sollicitudin.',\n\t'Nunc est metus, semper vel magna et, tincidunt scelerisque felis.',\n\t'Morbi lacus nisl, porttitor ac justo non, ultricies fringilla tellus.',\n\t'Ut eu metus metus.',\n\t'Proin vehicula vestibulum sollicitudin.',\n\t'Sed iaculis sem non ante ultricies, at semper libero porttitor.',\n\t'Ut dapibus laoreet sem ac consectetur.',\n\t'Etiam hendrerit, odio sit amet iaculis semper, ligula sapien rhoncus lorem, sit amet cursus eros ante sed nunc.',\n\t'Etiam interdum pellentesque enim id dapibus.',\n\t'Fusce luctus orci tortor.',\n\t'Cras id bibendum risus.',\n\t'Nam pretium felis nec ante tincidunt interdum.',\n\t'Nam cursus nibh non justo pharetra tristique.',\n\t'Nam facilisis dapibus lacus sit amet volutpat.',\n\t'Morbi felis ex, semper sed tortor eu, finibus aliquet lacus.',\n\t'Integer a orci augue.',\n\t'Vivamus lobortis tellus sed est fringilla ornare.',\n\t'Mauris tempus ante tortor, ac feugiat dui viverra et.',\n\t'Vivamus risus leo, ultrices at eleifend vel, luctus non arcu.',\n\t'Nullam dictum purus commodo turpis maximus, a mollis nibh efficitur.',\n\t'Nullam elementum dapibus suscipit.',\n\t'Nullam blandit sem lacus, vel blandit eros fermentum et.',\n\t'Sed cursus fermentum augue sit amet rutrum.',\n\t'Maecenas posuere, ante sed tristique ultrices, nisl orci molestie metus, sed vehicula mauris odio quis neque.',\n\t'Aliquam quis elit enim.',\n\t'Aenean cursus, turpis vel rhoncus imperdiet, dolor est consectetur metus, nec egestas elit orci ac ex.',\n\t'Fusce convallis justo eget dui ultrices, nec venenatis felis venenatis.',\n\t'Praesent eleifend, arcu eget auctor venenatis, nibh mi aliquet ligula, ac sagittis risus mi sed est.',\n\t'Phasellus pharetra, leo sed elementum aliquam, nisl justo lacinia ante, eu vehicula justo diam a sem.',\n\t'Praesent ac convallis neque, a dictum ipsum.',\n\t'Quisque venenatis nulla porta nunc semper sollicitudin.',\n\t'Duis a lectus velit.',\n\t'Phasellus lobortis, arcu et feugiat imperdiet, magna ipsum vestibulum massa, eget ullamcorper libero eros sed justo.',\n\t'Vivamus eget augue a ligula ultrices condimentum.',\n\t'Maecenas at eros a eros dictum mollis.',\n\t'Sed pellentesque tempor purus rhoncus pulvinar.',\n\t'Vestibulum faucibus urna quis convallis rutrum.',\n\t'Donec ultricies tempor nunc, a facilisis velit elementum non.',\n\t'Sed in risus in ante eleifend congue sed non nisl.',\n\t'Vestibulum in ante quis libero rhoncus sollicitudin id in quam.',\n\t'Sed imperdiet dapibus purus.',\n\t'Sed blandit, enim a cursus scelerisque, ante purus ornare massa, in dictum lacus neque id quam.',\n\t'Suspendisse tincidunt consectetur eros ac imperdiet.',\n\t'Sed ac justo feugiat, convallis ligula eget, interdum erat.',\n\t'Integer fermentum id arcu quis blandit.',\n\t'Curabitur iaculis, mauris at efficitur condimentum, justo lectus ornare quam, a euismod enim dolor gravida sem.',\n\t'Vivamus eu diam et nisl tincidunt pretium.',\n\t'Nullam sodales pulvinar urna in ultricies.',\n\t'Phasellus in condimentum enim.',\n\t'Vivamus eu mollis lacus.',\n\t'Etiam id ante eget dolor vehicula porta.',\n\t'Etiam purus urna, bibendum sollicitudin viverra quis, tristique id felis.',\n\t'Morbi porttitor tortor eget lorem commodo, nec pharetra urna vestibulum.',\n\t'Integer id faucibus massa.',\n\t'Duis interdum, quam quis ornare vulputate, eros est sodales ligula, a tincidunt mauris turpis ac diam.',\n\t'Mauris dictum nisl a vulputate cursus.',\n\t'Nulla cursus accumsan nisi, sit amet vulputate sapien semper ac.',\n\t'Vestibulum malesuada sodales condimentum.',\n\t'Sed tincidunt iaculis interdum.',\n\t'Maecenas quis nulla arcu.',\n\t'Fusce lacus urna, vulputate eu fringilla ut, vulputate quis magna.',\n\t'Vivamus a commodo neque.',\n\t'Donec maximus erat libero, eget sagittis magna tincidunt ac.',\n\t'Proin at dui id orci ornare vestibulum.',\n\t'Ut porttitor eget urna non efficitur.',\n\t'Nullam ut ligula est.',\n\t'Vestibulum vulputate, nulla sit amet laoreet egestas, ex mauris mattis metus, ut bibendum elit diam nec felis.',\n\t'Duis tempus finibus lorem, sit amet consequat dolor porta eu.',\n\t'Phasellus vel fringilla orci.',\n\t'Curabitur nec elit pulvinar mi vestibulum accumsan id quis augue.',\n\t'Ut ante neque, malesuada sed lacinia id, faucibus eget dui.',\n\t'In dui nibh, dignissim sed nisi at, feugiat vestibulum odio.',\n\t'Nunc ac lacus eleifend, laoreet tellus sit amet, condimentum nulla.',\n\t'Sed ac elit a lacus fermentum auctor in ac mi.',\n\t'Donec a justo in tellus laoreet facilisis.',\n\t'Pellentesque a enim dui.',\n\t'Vivamus sit amet rhoncus neque.',\n\t'Vivamus risus leo, aliquet ut sollicitudin vel, blandit in risus.',\n\t'Pellentesque eget tincidunt urna.',\n\t'Duis iaculis suscipit diam a tempus.',\n\t'Etiam posuere eu est vel congue.',\n\t'Nunc vel accumsan justo.',\n\t'Sed pharetra arcu vitae mauris eleifend, eu fermentum elit fermentum.',\n\t'In suscipit quam neque, ut dapibus urna venenatis in.',\n\t'Vivamus ultrices consequat risus, ac vestibulum orci porta finibus.',\n\t'Fusce sem orci, egestas ut feugiat sit amet, molestie quis arcu.',\n\t'Fusce vel ex nec justo ullamcorper viverra sit amet sed justo.',\n\t'Nunc sit amet leo consequat, commodo mauris quis, euismod mi.',\n\t'Ut finibus sapien ut dictum maximus.',\n\t'Suspendisse sed dui urna.',\n\t'Ut mattis et ex sit amet sagittis.',\n\t'Nulla vitae condimentum metus.',\n\t'Fusce sodales nulla metus, lacinia tincidunt sapien lobortis tincidunt.',\n\t'Vestibulum dapibus urna diam, nec ultricies neque feugiat et.',\n\t'Vestibulum eget quam ac lectus fermentum sagittis eu sit amet massa.',\n\t'Suspendisse quis diam eget felis faucibus tempus.',\n\t'Nullam nec consectetur urna.',\n\t'Aenean pharetra ullamcorper nibh, in maximus dui molestie non.',\n\t'Mauris laoreet, ex id volutpat bibendum, magna purus sodales lacus, eu fringilla ante ex ac metus.',\n\t'Suspendisse ac sapien massa.',\n\t'Donec pellentesque, ipsum in mollis accumsan, nisi risus sodales nisl, sed malesuada enim nibh quis mi.',\n\t'Duis varius viverra lacus non ultricies.',\n\t'Vestibulum venenatis id odio eget gravida.',\n\t'Suspendisse at quam et justo sollicitudin ornare eget ut felis.',\n\t'Etiam rhoncus ornare nisl ac tincidunt.',\n\t'Etiam vitae maximus tellus.',\n\t'In nibh leo, mattis vel tellus id, facilisis imperdiet lacus.',\n\t'Mauris sagittis ut erat eget porta.',\n\t'Nam a lectus laoreet, consequat elit ac, porta magna.',\n\t'Aenean commodo suscipit lorem, quis iaculis risus interdum ut.',\n\t'In cursus ullamcorper quam vel imperdiet.',\n\t'Nullam id mattis lectus.',\n\t'Cras sagittis massa urna, vitae mollis elit tincidunt a.',\n\t'Aliquam commodo urna quis nunc elementum ultricies at interdum massa.',\n\t'Sed pharetra urna eros, eget aliquam sem interdum id.',\n\t'Integer vestibulum dolor eget urna suscipit ultricies.',\n\t'Nam facilisis velit non mi pulvinar, eu mattis massa interdum.',\n\t'Sed faucibus, velit id tempor maximus, magna odio sodales ligula, vitae efficitur massa nunc non odio.',\n\t'Integer mattis lorem vitae turpis molestie faucibus.',\n\t'Praesent sagittis, quam quis placerat viverra, orci eros interdum mauris, ac iaculis erat lectus vel augue.',\n\t'Donec dapibus leo leo, accumsan tincidunt augue aliquet et.',\n\t'Ut non erat sed odio gravida blandit.',\n\t'Praesent placerat ante nulla, a iaculis magna lobortis in.',\n\t'Nulla erat nisi, pharetra at luctus vitae, cursus eget neque.',\n\t'Vivamus diam ante, pulvinar elementum vestibulum ut, fringilla quis lacus.',\n\t'Pellentesque ultrices odio placerat sollicitudin tincidunt.',\n\t'Nunc accumsan nisl nunc, tempor egestas odio elementum a.',\n\t'Vestibulum ut leo euismod, hendrerit tortor sed, eleifend purus.',\n\t'Aenean venenatis viverra elementum.',\n\t'Vivamus eu mattis quam, sit amet iaculis mi.',\n\t'Proin ultricies, arcu et tempus blandit, neque tortor vehicula felis, quis mattis magna metus non velit.',\n\t'Mauris imperdiet eu quam nec efficitur.',\n\t'Nam sodales sem at nulla laoreet, a luctus odio viverra.',\n\t'Morbi non lectus semper, interdum lectus ac, elementum purus.',\n\t'Vestibulum efficitur faucibus volutpat.',\n\t'Aliquam pellentesque, ex id laoreet gravida, sapien orci sodales dolor, vitae pretium turpis dolor a metus.',\n\t'Nulla metus tellus, porttitor in placerat non, laoreet eget nunc.',\n\t'Maecenas euismod massa et viverra consectetur.',\n\t'Curabitur est sapien, commodo vel urna lacinia, accumsan viverra libero.',\n\t'Maecenas fringilla, odio vitae congue malesuada, elit mi rhoncus erat, at hendrerit metus magna et eros.',\n\t'Suspendisse efficitur cursus purus quis commodo.',\n\t'Duis egestas sem urna.',\n\t'Suspendisse consectetur posuere purus id dignissim.',\n\t'Aenean ut congue velit.',\n\t'Etiam suscipit, tellus non laoreet maximus, orci dolor faucibus velit, quis vulputate leo dui in lacus.',\n\t'Ut iaculis metus ante, sed sollicitudin sem consequat ut.',\n\t'Fusce semper mattis turpis, vel elementum leo ornare eget.',\n\t'Donec magna nulla, vulputate quis lacinia sit amet, tempor ac mauris.',\n\t'Aenean interdum purus ligula, ut porttitor arcu aliquam vitae.',\n\t'Morbi venenatis sem in velit venenatis rutrum.',\n\t'Nullam porta leo convallis, molestie massa non, sagittis metus.',\n\t'Nunc posuere pretium augue, eu condimentum augue sollicitudin sit amet.',\n\t'Pellentesque elementum ipsum nec tincidunt aliquam.',\n\t'Pellentesque massa enim, vehicula quis euismod non, lobortis eget magna.',\n\t'Mauris posuere risus non velit vestibulum pretium non non ipsum.',\n\t'Cras vel ornare turpis, vel feugiat purus.',\n\t'Quisque odio eros, porttitor nec vulputate vitae, sollicitudin pretium purus.',\n\t'Maecenas imperdiet lacus a urna finibus fringilla sit amet et felis.',\n\t'Aenean quis ipsum tempus, pellentesque nunc mattis, tristique diam.',\n\t'Vestibulum vitae nunc hendrerit, gravida sem eu, tempus risus.',\n\t'Donec condimentum bibendum ipsum, a hendrerit neque posuere nec.',\n\t'Donec a dolor a massa maximus efficitur.',\n\t'Praesent velit massa, tempus ac semper quis, scelerisque vitae ante.',\n\t'Aliquam purus urna, hendrerit vitae sagittis at, porta vel justo.',\n\t'Curabitur pellentesque consectetur lobortis.',\n\t'Vivamus scelerisque hendrerit venenatis.',\n\t'Integer tincidunt ut diam sed congue.',\n\t'Sed ut aliquam nisi.',\n\t'Nullam nec eros id nunc semper luctus.',\n\t'Aliquam maximus eleifend dui, nec blandit massa bibendum eget.',\n\t'Donec interdum placerat tincidunt.',\n\t'Quisque non nulla sapien.',\n\t'Etiam tincidunt eros eget elit bibendum gravida.',\n\t'Quisque fringilla facilisis tortor quis ullamcorper.',\n\t'Integer gravida justo in iaculis posuere.',\n\t'Praesent sed tincidunt sapien.',\n\t'Sed euismod vitae ex vel scelerisque.',\n\t'Aenean nisi felis, ornare et feugiat eget, sodales vitae odio.',\n\t'Aenean libero sapien, lacinia ac sapien ac, laoreet dignissim dui.',\n\t'Nunc nibh massa, convallis in augue et, efficitur mattis elit.',\n\t'Suspendisse id nisl luctus, sollicitudin justo non, luctus arcu.',\n\t'Aliquam a est massa.',\n\t'Pellentesque dignissim mattis arcu.',\n\t'Aliquam efficitur ante metus, ut pellentesque felis suscipit eu.',\n\t'Ut facilisis vestibulum arcu elementum dignissim.',\n\t'Cras non sapien mauris.',\n\t'Maecenas interdum libero eu libero luctus, sit amet efficitur leo porttitor.',\n\t'Duis ut mollis ex.',\n\t'Quisque mi eros, suscipit vitae tempus ut, condimentum sit amet est.',\n\t'Ut non posuere erat.',\n\t'Curabitur bibendum magna turpis, non tincidunt risus dictum at.',\n\t'Etiam tempus magna at odio auctor, ac euismod nibh pulvinar.',\n\t'Morbi dapibus et sapien in elementum.',\n\t'Ut finibus est odio, eu convallis nunc viverra id.',\n\t'Quisque rhoncus mollis est sit amet semper.',\n\t'Ut dapibus urna sed diam ornare, eu efficitur leo feugiat.',\n\t'Vestibulum vel felis et erat molestie volutpat.',\n\t'Maecenas molestie lorem eget quam porta, a venenatis felis accumsan.',\n\t'In id auctor risus.',\n\t'Phasellus at diam sed orci porttitor tempus.',\n\t'Nunc dapibus, massa id ornare condimentum, mi sem ullamcorper nunc, et auctor felis felis id sem.',\n\t'Suspendisse nec vehicula augue.',\n\t'Aliquam imperdiet sagittis justo at iaculis.',\n\t'Praesent vulputate tellus ornare malesuada faucibus.',\n\t'Sed sed tristique ante.',\n\t'Curabitur ac augue et leo fermentum commodo eu in nulla.',\n\t'Aliquam pellentesque risus velit, a consequat dolor vestibulum ac.',\n\t'Fusce in dolor porttitor arcu viverra gravida.',\n\t'Maecenas ex orci, pretium vitae dui eget, scelerisque dapibus arcu.',\n\t'Praesent efficitur efficitur imperdiet.',\n\t'Curabitur eget tortor finibus, elementum orci quis, viverra arcu.',\n\t'Aenean ac tincidunt lacus.',\n\t'Donec vel ultricies est.',\n\t'Mauris mollis nisi a efficitur scelerisque.',\n\t'Nam dictum lacinia odio at pharetra.',\n\t'Quisque ultricies arcu in venenatis rutrum.',\n\t'In odio ipsum, euismod in posuere eget, placerat et felis.',\n\t'Curabitur mi est, placerat quis egestas non, mollis sed urna.',\n\t'Praesent malesuada, dolor in fermentum faucibus, tellus velit accumsan ipsum, tincidunt luctus turpis nulla sed enim.',\n\t'Integer rhoncus, turpis id tincidunt pulvinar, metus orci cursus mi, nec feugiat lorem elit ut enim.',\n\t'Aliquam et felis vel elit porta cursus in sit amet diam.',\n\t'In a vehicula eros, eu ullamcorper turpis.',\n\t'Vivamus eleifend libero non nulla accumsan porttitor.',\n\t'Suspendisse vel neque ultrices, scelerisque lacus in, ornare massa.',\n\t'Duis dolor leo, ullamcorper vel lacinia eget, aliquam rhoncus risus.',\n\t'Vivamus dapibus ac elit sed imperdiet.',\n\t'Vestibulum eget auctor dui, at tempus dolor.',\n\t'Sed consequat placerat libero, et sodales sapien porttitor non.',\n\t'Aenean arcu diam, imperdiet sit amet purus a, ornare sodales metus.',\n\t'Integer accumsan ante sem, at facilisis ipsum egestas et.',\n\t'Nulla non orci dolor.',\n\t'Sed rhoncus facilisis condimentum.',\n\t'Nulla vitae maximus nisl.',\n\t'Praesent a rhoncus ante, a pharetra ante.',\n\t'Fusce volutpat eu risus nec eleifend.',\n\t'Suspendisse nibh leo, semper in egestas eget, placerat vel nulla.',\n\t'Ut malesuada condimentum eros, id dignissim nunc imperdiet ac.',\n\t'Praesent posuere tortor vitae augue convallis malesuada.',\n\t'Donec congue sem eu leo dignissim, at blandit felis blandit.',\n\t'In auctor, sapien quis hendrerit auctor, arcu tellus aliquam ante, quis vulputate purus metus eget mauris.',\n\t'Proin eget purus purus.',\n\t'Vestibulum pretium pharetra egestas.',\n\t'Proin vulputate augue non odio commodo, eu varius sem porta.',\n\t'Quisque porta massa quis finibus dignissim.',\n\t'Sed sit amet lectus sit amet elit porta rutrum.',\n\t'Nunc ornare vulputate tellus, eu rutrum turpis sagittis rutrum.',\n\t'Nam elit justo, laoreet a tortor et, tempus dapibus sapien.',\n\t'Sed velit augue, maximus et dignissim sed, mollis id mi.',\n\t'Integer eget libero consequat, placerat massa maximus, efficitur dui.',\n\t'Praesent quis ipsum a ex ultricies euismod a sit amet mi.',\n\t'Curabitur at accumsan urna.',\n\t'Cras pulvinar leo sit amet ligula suscipit mattis.',\n\t'Morbi dapibus facilisis euismod.',\n\t'Quisque efficitur venenatis eros ac elementum.',\n\t'Suspendisse imperdiet nunc non libero consectetur, eget blandit libero mattis.',\n\t'Vivamus tempor ullamcorper sapien vitae aliquam.',\n\t'In eget tempus ante.',\n\t'Vestibulum accumsan enim sed est eleifend, non commodo orci tristique.',\n\t'Nam pellentesque nisi a laoreet lobortis.',\n\t'Sed faucibus eros nec urna elementum, sed tincidunt est elementum.',\n\t'Suspendisse bibendum, velit nec tempus ullamcorper, urna elit auctor mauris, et tempus dui purus ut sapien.',\n\t'Aliquam posuere pulvinar lorem, ac vulputate neque congue eget.',\n\t'Vivamus sit amet elit id ante pellentesque rhoncus.',\n\t'Maecenas sagittis dui justo, id bibendum nulla egestas ac.',\n\t'Mauris placerat sapien urna, eget porta nisi molestie eu.',\n\t'Pellentesque metus arcu, gravida eget erat et, condimentum sodales quam.',\n\t'Ut finibus tortor ac dui vestibulum, et interdum elit fringilla.',\n\t'Aliquam a fringilla augue.',\n\t'Aenean placerat, enim nec dapibus viverra, arcu leo pharetra nibh, id pretium nisl purus et orci.',\n\t'Praesent felis odio, bibendum ut rutrum non, vehicula mollis tortor.',\n\t'Nam id vulputate magna.',\n\t'Vivamus ultrices purus vitae risus vehicula, et varius magna fringilla.',\n\t'Integer mollis, arcu in aliquet eleifend, augue felis suscipit augue, vitae consectetur sem elit non neque.',\n\t'Suspendisse dictum, lectus et sagittis dictum, turpis lorem ultrices odio, vitae tincidunt ex dolor vitae leo.',\n\t'Nulla aliquet risus ut augue finibus, ac egestas ante varius.',\n\t'In eget est a urna pulvinar bibendum quis eget dui.',\n\t'In sodales auctor imperdiet.',\n\t'Aenean et ipsum commodo, gravida erat vel, molestie nunc.',\n\t'Etiam maximus nibh finibus ex aliquet aliquam.',\n\t'Aliquam ultricies tellus lectus, ac suscipit tellus congue ac.',\n\t'Ut id ullamcorper urna.',\n\t'Aliquam ut faucibus nunc.',\n\t'Morbi vel elit dapibus, faucibus sem quis, feugiat lacus.',\n\t'Sed euismod diam mi, ac lacinia diam ornare sed.',\n\t'Duis dictum sodales turpis at feugiat.',\n\t'Donec id orci maximus, venenatis metus quis, tincidunt sapien.',\n\t'Etiam et justo non orci elementum bibendum ut sed elit.',\n\t'Donec imperdiet porta augue eget suscipit.',\n\t'Donec posuere dui eget quam faucibus hendrerit.',\n\t'Nunc non nibh mi.',\n\t'Nullam augue ex, tincidunt nec turpis pretium, porttitor tempor neque.',\n\t'Integer vel neque commodo, consectetur nulla a, blandit risus.',\n\t'Quisque maximus est condimentum hendrerit placerat.',\n\t'Morbi sagittis posuere feugiat.',\n\t'Mauris nec lacinia dolor, eu accumsan ante.',\n\t'Sed eu lorem auctor, gravida ligula vitae, auctor arcu.',\n\t'Curabitur porttitor et lacus nec tempor.',\n\t'Nulla sed posuere lorem, at facilisis quam.',\n\t'Sed ornare leo vitae ipsum condimentum, in ullamcorper magna rhoncus.',\n\t'Nullam quis augue tristique, scelerisque turpis sit amet, placerat tortor.',\n\t'Suspendisse aliquam magna a suscipit egestas.',\n\t'Fusce dictum consectetur mattis.',\n\t'Etiam commodo iaculis neque quis scelerisque.',\n\t'Nulla eu condimentum lectus, vitae tincidunt nisi.',\n\t'Vestibulum lacinia ac ligula quis fringilla.',\n\t'Pellentesque aliquam posuere nunc sed malesuada.',\n\t'Fusce a sem lobortis, egestas tortor eu, mollis sapien.',\n\t'Praesent malesuada consequat ante in hendrerit.',\n\t'Pellentesque lorem ligula, sodales quis suscipit at, venenatis in risus.',\n\t'Phasellus sapien nibh, tincidunt ut suscipit non, hendrerit id turpis.',\n\t'Maecenas ut lorem non risus efficitur tristique ac at arcu.',\n\t'Phasellus consequat urna ligula, a luctus justo cursus ac.',\n\t'Praesent et augue augue.',\n\t'Morbi accumsan neque id nisl malesuada, quis cursus sapien blandit.',\n\t'Phasellus ultrices dignissim neque a posuere.',\n\t'Mauris eu vehicula nunc.',\n\t'Sed egestas nisi dui, at lobortis dui condimentum vitae.',\n\t'Quisque sit amet dui eu massa molestie malesuada iaculis in nulla.',\n\t'Phasellus et molestie lacus.',\n\t'Pellentesque egestas iaculis tortor, ac tempus ante commodo non.',\n\t'Maecenas ullamcorper dictum tortor ut luctus.',\n\t'Curabitur id dui quis felis pharetra elementum vitae nec elit.',\n\t'Nunc dictum malesuada ante, in elementum nulla ornare ut.',\n\t'Vivamus luctus lacus id venenatis eleifend.',\n\t'Suspendisse a venenatis turpis.',\n\t'Sed suscipit feugiat massa sed molestie.',\n\t'Suspendisse vitae ornare quam.',\n\t'Vivamus tincidunt metus sed aliquet sodales.',\n\t'Ut quis massa a magna vulputate dictum in vitae ex.',\n\t'Phasellus nulla elit, volutpat eu tincidunt eu, fringilla interdum metus.',\n\t'Praesent dignissim felis nec est molestie, in commodo lectus tempor.',\n\t'Donec quis mi venenatis, suscipit nibh eget, euismod dui.',\n\t'Morbi enim elit, tempor at euismod quis, lacinia sit amet risus.',\n\t'Vestibulum vitae pharetra magna, non luctus mauris.',\n\t'Nullam vel luctus arcu, condimentum posuere libero.',\n\t'Ut ullamcorper, dolor ac interdum auctor, massa leo vehicula urna, sed interdum lacus magna in quam.',\n\t'Integer pretium pulvinar sem, eget vehicula sem egestas vel.',\n\t'Aenean malesuada odio eget fermentum facilisis.',\n\t'Suspendisse finibus, tortor sit amet porta ultricies, sapien dolor sodales metus, a commodo risus nulla vel justo.',\n\t'Integer nec justo at neque aliquam ultrices a quis libero.',\n\t'Ut sem ligula, facilisis ut turpis quis, convallis porta ex.',\n\t'Nam sed ullamcorper ipsum, ut tincidunt risus.',\n\t'Curabitur nisi nisl, finibus et maximus id, bibendum hendrerit risus.',\n\t'Suspendisse molestie laoreet quam, in lobortis ipsum sodales id.',\n\t'Integer et suscipit nisi.',\n\t'Mauris mattis porta malesuada.',\n\t'Vivamus interdum blandit dolor, vitae egestas turpis rutrum eget.',\n\t'In a est sit amet dolor tristique vehicula.',\n\t'Sed et vehicula magna, eget laoreet dui.',\n\t'In convallis sem in maximus luctus.',\n\t'Vestibulum vestibulum convallis diam, nec tristique nisl cursus vel.',\n\t'Suspendisse nec lorem eget ligula venenatis placerat et et massa.',\n\t'Vestibulum efficitur ac libero vel fermentum.',\n\t'Cras condimentum diam turpis, sit amet egestas neque hendrerit ac.',\n\t'Pellentesque mattis mollis dignissim.',\n\t'Donec eleifend magna ac pulvinar sagittis.',\n\t'Vestibulum accumsan vulputate odio et molestie.',\n\t'Vestibulum accumsan volutpat interdum.',\n\t'Fusce vestibulum feugiat odio bibendum bibendum.',\n\t'Mauris non blandit nibh, id mattis dolor.',\n\t'Nunc interdum ipsum quis sem scelerisque sagittis.',\n\t'Integer sit amet dapibus velit, sit amet facilisis sem.',\n\t'In hendrerit sapien vel nulla rutrum, at lobortis quam gravida.',\n\t'Etiam euismod est quis leo convallis, eu interdum risus viverra.',\n\t'Nam ullamcorper imperdiet erat, ut efficitur nunc molestie a.',\n\t'Sed eget tellus cursus, ullamcorper odio sit amet, semper est.',\n\t'Aliquam suscipit urna ex, quis sodales nisi dapibus non.',\n\t'Nulla quis leo non tellus sollicitudin suscipit.',\n\t'Fusce in aliquet nulla.',\n\t'Donec risus tellus, imperdiet sed vulputate ut, pulvinar malesuada quam.',\n\t'Morbi id ligula leo.',\n\t'Fusce varius mauris dui, vel placerat magna efficitur eget.',\n\t'Morbi vulputate et lectus a porta.',\n\t'Quisque porta tortor sapien, quis rhoncus libero maximus volutpat.',\n\t'Cras sodales ex nec tortor finibus, aliquet scelerisque sem pellentesque.',\n\t'Aliquam ornare sodales quam.',\n\t'Donec eleifend ornare velit, in mollis elit.',\n\t'Nunc bibendum venenatis dui, sit amet scelerisque ex blandit eget.',\n\t'In non lacus iaculis, dictum urna id, placerat lorem.',\n\t'Vestibulum quis sem imperdiet, pellentesque neque ac, varius justo.',\n\t'Phasellus porta, augue at mattis dignissim, erat tortor porttitor leo, eu pretium purus lectus quis diam.',\n\t'Nam scelerisque, turpis eget pharetra sollicitudin, erat lacus tincidunt odio, at condimentum augue eros nec lectus.',\n\t'Proin vestibulum, tortor non maximus sodales, quam nibh gravida risus, vitae porta ex nisi eget velit.',\n\t'Cras at orci eu tortor vulputate facilisis nec in ex.',\n\t'Donec a turpis pulvinar, gravida nisl ut, suscipit justo.',\n\t'Vestibulum pharetra, lacus eu sodales vestibulum, eros lectus ullamcorper odio, in vulputate dui leo a enim.',\n\t'Aenean at consectetur quam, in elementum ipsum.',\n\t'Vestibulum maximus aliquam leo, vitae accumsan felis hendrerit varius.',\n\t'Sed bibendum vestibulum nibh, scelerisque dictum ex feugiat et.',\n\t'Suspendisse placerat dolor quis aliquam maximus.',\n\t'Sed sed enim convallis, sodales nulla id, molestie nisi.',\n\t'Aliquam at iaculis ante.',\n\t'Cras blandit hendrerit accumsan.',\n\t'Vestibulum convallis nisi vel dui luctus, sit amet malesuada mi tincidunt.',\n\t'Nunc tempor eget massa porta dignissim.',\n\t'Proin ut congue neque, sit amet maximus felis.',\n\t'Mauris ultrices eleifend nunc.',\n\t'Maecenas maximus mauris ac sagittis volutpat.',\n\t'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Cras ac pulvinar diam.',\n\t'Donec mollis mi eu arcu convallis mattis.',\n\t'Donec ipsum lectus, placerat sed consectetur id, ultricies nec tortor.',\n\t'Cras tellus augue, faucibus et felis ut, vehicula pretium sem.',\n\t'Fusce sit amet cursus leo, nec cursus dui.',\n\t'Curabitur massa leo, varius ut consectetur in, sodales sit amet nisi.',\n\t'In faucibus nibh id massa porttitor, vitae sollicitudin metus pretium.',\n\t'Phasellus ultrices erat enim, vitae mollis justo tincidunt at.',\n\t'Donec accumsan commodo quam non iaculis.',\n\t'Pellentesque viverra et magna eget sollicitudin.',\n\t'Suspendisse at dui eu diam mattis congue sagittis in magna.',\n\t'Fusce fermentum commodo arcu sed consectetur.',\n\t'Fusce nec orci lacus.',\n\t'Aliquam eu mauris accumsan, ullamcorper massa eu, facilisis augue.',\n\t'Curabitur vel tincidunt felis, vitae faucibus nibh.',\n\t'Cras mattis dignissim viverra.',\n\t'Phasellus sed erat congue, maximus quam id, blandit lectus.',\n\t'Pellentesque a volutpat magna.',\n\t'Aenean tempus, tortor sit amet porttitor consectetur, ante libero pulvinar urna, at euismod purus erat a turpis.',\n\t'Vestibulum congue interdum laoreet.',\n\t'Morbi auctor sollicitudin lacus nec feugiat.',\n\t'Etiam et justo eget elit egestas bibendum eget varius nibh.',\n\t'Phasellus tempor ullamcorper tellus, fermentum lobortis velit luctus vel.',\n\t'In commodo ac ligula sit amet maximus.',\n\t'Duis consectetur nibh velit, vitae tristique urna mattis at.',\n\t'Cras vitae risus at metus finibus vestibulum.',\n\t'Ut sit amet suscipit mauris.',\n\t'Fusce euismod dolor non nibh consequat viverra.',\n\t'Duis viverra orci magna, vel volutpat turpis pretium vel.',\n\t'Integer ultricies tempus augue ut ultrices.',\n\t'Ut gravida ante venenatis commodo dapibus.',\n\t'Fusce tincidunt id nisl nec tincidunt.',\n\t'Phasellus sed diam bibendum, tincidunt felis ac, malesuada augue.',\n\t'In convallis mauris non turpis convallis auctor.',\n\t'Vivamus dolor tortor, suscipit at vulputate vitae, ullamcorper vitae ipsum.',\n\t'Sed dictum eros neque, sit amet cursus felis condimentum ac.',\n\t'Sed laoreet diam eu euismod tempus.',\n\t'Phasellus ultricies suscipit lacus, at faucibus est varius ac.',\n\t'Praesent aliquam tristique interdum.',\n\t'Quisque quis porttitor ipsum, sed pellentesque arcu.',\n\t'Ut convallis eros sed tellus euismod posuere.',\n\t'Proin eget dictum lacus.',\n\t'Mauris scelerisque ex ac faucibus maximus.',\n\t'Donec at leo sed libero iaculis gravida sed ac enim.',\n\t'Proin a consequat ligula.',\n\t'In euismod tempus velit vel condimentum.',\n\t'Proin viverra convallis ipsum sit amet accumsan.',\n\t'Ut mi nisl, consequat a neque eu, aliquam placerat quam.',\n\t'Duis tempus ullamcorper risus ut finibus.',\n\t'Duis ac enim eros.',\n\t'In blandit malesuada tellus, in bibendum massa condimentum in.',\n\t'Vivamus quis orci libero.',\n\t'Cras eu condimentum ipsum.',\n\t'Maecenas lacinia lobortis euismod.',\n\t'Nulla at imperdiet nibh, eget lacinia augue.',\n\t'Curabitur sit amet pulvinar ipsum.',\n\t'Praesent tincidunt velit in nunc congue dictum.',\n\t'Cras arcu arcu, elementum sit amet molestie non, pellentesque id orci.',\n\t'Vestibulum eleifend faucibus magna pellentesque imperdiet.',\n\t'Curabitur convallis non nunc nec consectetur.',\n\t'Integer at maximus tellus, ac pellentesque velit.',\n\t'Etiam nec elementum turpis, et blandit sapien.',\n\t'Mauris iaculis pulvinar ipsum, ac vulputate lacus maximus sit amet.',\n\t'Mauris quis turpis in orci ornare posuere at quis lorem.',\n\t'Etiam egestas aliquam rhoncus.',\n\t'Maecenas metus ex, lobortis malesuada rutrum viverra, pellentesque quis ligula.',\n\t'Pellentesque a nunc orci.',\n\t'Integer vitae elit sodales nisl aliquet luctus nec eu augue.',\n\t'Pellentesque feugiat eget urna eu molestie.',\n\t'Quisque dolor sem, gravida id nisl nec, sodales hendrerit sapien.',\n\t'Vivamus vehicula neque lacus.',\n\t'Duis non justo et nunc consequat sagittis non in eros.',\n\t'Morbi nulla diam, interdum et massa at, eleifend lobortis nibh.',\n\t'Nunc sollicitudin pharetra tincidunt.',\n\t'Pellentesque nulla diam, bibendum ac dictum a, facilisis gravida est.',\n\t'Fusce tempus turpis fringilla pellentesque pretium.',\n\t'Aenean ultricies sapien dolor, ullamcorper auctor libero interdum eu.',\n\t'Duis quis velit in urna laoreet imperdiet id ut sem.',\n\t'Phasellus fermentum odio at tempor scelerisque.',\n\t'Donec semper viverra ex, ut hendrerit ante tristique vel.',\n\t'Cras vel tempor massa.',\n\t'Sed lacinia viverra vestibulum.',\n\t'Suspendisse libero elit, porta at enim eu, iaculis consectetur lectus.',\n\t'Pellentesque aliquet lorem vehicula sapien sagittis, vel tristique augue venenatis.',\n\t'Nunc felis diam, iaculis vitae tortor at, rutrum efficitur orci.',\n\t'Pellentesque mi metus, luctus a tellus eget, eleifend elementum tortor.',\n\t'Praesent aliquet quam efficitur urna blandit lacinia.',\n\t'Pellentesque euismod sodales ultrices.',\n\t'Quisque non arcu ut arcu molestie dapibus.',\n\t'Aenean euismod lacus mi.',\n\t'Morbi sodales massa sed nisl luctus, eget posuere tortor vehicula.',\n\t'Etiam interdum convallis enim eu sagittis.',\n\t'Mauris sollicitudin nisi eget diam placerat, ac malesuada ligula vestibulum.',\n\t'Phasellus in vulputate elit.',\n\t'Phasellus porta consequat scelerisque.',\n\t'Ut tincidunt eget quam et faucibus.',\n\t'Integer mi elit, blandit at vehicula non, porta ut odio.',\n\t'Donec sollicitudin varius finibus.',\n\t'Nam a venenatis massa.',\n\t'Vivamus sit amet porta arcu.',\n\t'Maecenas dui nunc, venenatis ac sem ac, elementum molestie tellus.',\n\t'Aliquam scelerisque, velit ac venenatis vestibulum, nisi ante semper risus, in eleifend diam lorem ac ligula.',\n\t'Aliquam pulvinar dui porttitor magna sagittis volutpat.',\n\t'Sed posuere tortor a tellus tincidunt semper.',\n\t'Nulla rhoncus id nunc vitae condimentum.',\n\t'Donec efficitur faucibus ex eget varius.',\n\t'Cras fermentum vestibulum tellus eget iaculis.',\n\t'Vestibulum vestibulum nec purus eget semper.',\n\t'Sed commodo purus arcu, a consequat felis sollicitudin a.',\n\t'Suspendisse mollis lectus sed nulla dapibus gravida.',\n\t'Sed fermentum sem et nunc venenatis luctus.',\n\t'Phasellus dapibus est non magna iaculis, vel venenatis ex ornare.',\n\t'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec malesuada commodo nibh, id vulputate enim viverra at.',\n\t'Sed venenatis viverra mattis.',\n\t'Aliquam tincidunt dignissim sem, et sodales purus mollis id.',\n\t'Nam vitae pellentesque augue, a congue magna.',\n\t'Quisque vitae blandit nisi, sed vehicula magna.',\n\t'Aliquam id diam ac purus sagittis pharetra mattis eget ipsum.',\n\t'Praesent pulvinar gravida mi, a ornare velit cursus ac.',\n\t'Aliquam bibendum vulputate consequat.',\n\t'Nulla elit ante, ultrices quis eleifend eu, egestas quis ipsum.',\n\t'Aliquam non auctor nulla.',\n\t'Curabitur in condimentum ex.',\n\t'Mauris vestibulum ligula sit amet tortor porttitor iaculis.',\n\t'Ut sollicitudin sed nunc eu iaculis.',\n\t'Integer mattis egestas tellus, et volutpat ligula placerat non.',\n\t'Aliquam id sem interdum, scelerisque arcu in, tempus elit.',\n\t'Etiam tristique, mi et euismod dictum, leo augue posuere tellus, vitae malesuada libero dolor sed urna.',\n\t'Donec interdum dolor metus, ac euismod magna pulvinar in.',\n\t'Cras at nunc at nibh sollicitudin tristique.',\n\t'Nullam nec quam porta, rhoncus diam et, porta erat.',\n\t'Vestibulum ut vestibulum ante.',\n\t'Aliquam tincidunt blandit metus ac varius.',\n\t'Vivamus sollicitudin, quam a suscipit volutpat, leo eros commodo ex, sed sodales urna diam sed nulla.',\n\t'Sed a nibh ac felis efficitur luctus sit amet mollis leo.',\n\t'Vestibulum tempor urna quis erat accumsan hendrerit.',\n\t'Etiam euismod mauris non est iaculis dignissim.',\n\t'Nunc in dui ultrices, placerat tellus ut, sollicitudin magna.',\n\t'Aliquam efficitur nunc ac elit viverra laoreet.',\n\t'Pellentesque dui nisl, viverra vitae venenatis eu, ultricies vel risus.',\n\t'Integer volutpat quam non erat condimentum placerat.',\n\t'Maecenas molestie odio vel ultrices porta.',\n\t'Integer ullamcorper mollis elementum.',\n\t'Suspendisse mi sapien, mattis ut posuere vitae, vulputate a nisi.',\n\t'Nulla et ullamcorper odio.',\n\t'Mauris nec arcu massa.',\n\t'Aliquam quis eleifend ante.',\n\t'Nulla dignissim pulvinar hendrerit.',\n\t'Aenean lobortis tempus condimentum.',\n\t'Sed rhoncus metus quis mi ullamcorper tincidunt.',\n\t'Phasellus augue nisi, auctor quis posuere sed, mattis eu libero.',\n\t'Mauris pharetra ac libero at sodales.',\n\t'Cras efficitur enim ut tempor convallis.',\n\t'Donec lectus lorem, consectetur quis felis sed, vehicula suscipit massa.',\n\t'Vestibulum posuere viverra ultrices.',\n\t'Vivamus mollis cursus nibh sed fermentum.',\n\t'Vestibulum in varius ligula.',\n\t'Donec sit amet est scelerisque, sodales odio a, dictum ligula.',\n\t'Suspendisse consequat laoreet est, sit amet pulvinar elit sodales vitae.',\n\t'Nunc fermentum sodales eros, at vestibulum arcu vulputate ut.',\n\t'Integer faucibus aliquet eros.',\n\t'Suspendisse metus quam, placerat nec rutrum a, feugiat vel sapien.',\n\t'Donec malesuada, eros id blandit scelerisque, tellus libero ultricies leo, ac accumsan arcu metus eu nisl.',\n\t'Integer vitae arcu turpis.',\n\t'Sed eget congue orci, vel porta tellus.',\n\t'Integer ligula nisl, finibus eu sollicitudin ac, malesuada vitae nisi.',\n\t'Donec sit amet vulputate metus.',\n\t'Phasellus enim sem, varius ac vulputate ut, dapibus id tellus.',\n\t'Nam non malesuada metus.',\n\t'Nulla scelerisque magna ut est imperdiet, ac luctus sem sodales.',\n\t'In auctor neque enim, eu hendrerit eros fringilla nec.',\n\t'Duis quis purus rhoncus, malesuada enim vitae, bibendum nisl.',\n\t'Donec ut libero lacinia, tempus enim sed, volutpat metus.',\n\t'In commodo posuere nisi vitae faucibus.',\n\t'Maecenas felis odio, vehicula ac ullamcorper non, maximus id elit.',\n\t'Curabitur congue urna in mi venenatis euismod.',\n\t'Suspendisse hendrerit lacus ac risus tempor, non tristique urna venenatis.',\n\t'Suspendisse cursus urna ornare, varius risus sit amet, lobortis eros.',\n\t'Fusce consequat porttitor tortor in dignissim.',\n\t'Ut nulla magna, semper posuere ex quis, pharetra tempor quam.',\n\t'Morbi enim ligula, tincidunt id ligula ac, imperdiet pretium arcu.',\n\t'Maecenas quis risus malesuada nisl efficitur pretium.',\n\t'Integer at ante congue, luctus neque sed, dictum sem.',\n\t'Phasellus luctus diam nec risus porttitor posuere.',\n\t'Vestibulum ultrices tristique ex.',\n\t'Nulla id lacus erat.',\n\t'Vestibulum eu orci turpis.',\n\t'Ut feugiat auctor interdum.',\n\t'Donec at convallis dui.',\n\t'Phasellus placerat vitae dui eu tincidunt.',\n\t'Vestibulum metus lacus, fermentum id dignissim a, sagittis a nulla.',\n\t'In fermentum turpis in dui dignissim iaculis.',\n\t'Suspendisse vehicula ex vel imperdiet vestibulum.',\n\t'Suspendisse lobortis felis non augue lacinia ornare.',\n\t'Cras porta neque tellus, sed aliquet purus vulputate tincidunt.',\n\t'Nullam non purus tellus.',\n\t'Vivamus ex diam, condimentum ut ornare sit amet, venenatis pharetra turpis.',\n\t'Aliquam dui tortor, volutpat ut molestie eu, efficitur id nibh.',\n\t'Morbi vel ante et tellus rhoncus mattis id at sem.',\n\t'In vel tellus sapien.',\n\t'Aenean nec est finibus, iaculis orci a, molestie turpis.',\n\t'Proin ornare eget odio luctus sodales.',\n\t'Etiam hendrerit a nisl at pellentesque.',\n\t'Nunc blandit blandit mauris, eget blandit nisi luctus eget.',\n\t'Ut justo justo, imperdiet nec magna maximus, venenatis vestibulum leo.',\n\t'Cras a consequat quam.',\n\t'Vestibulum ac lectus ullamcorper, efficitur lacus quis, pulvinar est.',\n\t'Aenean nec odio elit.',\n\t'Nulla quis viverra odio, nec cursus erat.',\n\t'Vestibulum lobortis est nec sem dignissim, id luctus tortor congue.',\n\t'Morbi sollicitudin massa et justo aliquam volutpat.',\n\t'Aliquam bibendum tristique lacus sit amet mattis.',\n\t'Sed hendrerit lorem feugiat est feugiat ultricies.',\n\t'Cras dictum, turpis id imperdiet volutpat, nisl orci facilisis mi, in tincidunt arcu diam et dui.',\n\t'Mauris congue neque libero, vitae sagittis elit consectetur in.',\n\t'Cras commodo at sem et fermentum.',\n\t'Nullam consequat ligula in est pellentesque malesuada.',\n\t'In sit amet elit ac erat varius posuere scelerisque in lectus.',\n\t'Nunc ac odio vitae orci placerat mollis at in velit.',\n\t'Vivamus interdum nunc quis velit viverra consectetur.',\n\t'Nam sit amet semper arcu.',\n\t'Donec pellentesque feugiat lorem nec elementum.',\n\t'Quisque tincidunt maximus vehicula.',\n\t'Curabitur fermentum, ligula in sollicitudin tempus, odio libero euismod augue, vulputate pellentesque lorem nisi vehicula nulla.',\n\t'Aenean quis mauris et neque venenatis laoreet.',\n\t'Fusce id porta augue.',\n\t'Integer ac nunc vel enim ultrices consequat.',\n\t'Mauris magna purus, congue ut sapien in, molestie luctus nulla.',\n\t'Donec consequat, augue in tristique scelerisque, nisi sem tincidunt lorem, varius tempus est nunc in ipsum.',\n\t'Duis dictum ut est ac viverra.',\n\t'Aliquam id tincidunt ligula.',\n\t'Aliquam vitae tortor ut massa eleifend imperdiet sed et ipsum.',\n\t'Maecenas aliquet tellus ac nisl molestie, vel ullamcorper lacus vulputate.',\n\t'Mauris nec lacus sapien.',\n\t'Integer sagittis dolor sit amet velit mollis, quis sodales odio sollicitudin.',\n\t'Vivamus varius, libero a cursus imperdiet, lorem diam vestibulum risus, eget dictum lectus dolor eget eros.',\n\t'Nullam vitae orci varius, suscipit magna vitae, efficitur tellus.',\n\t'Praesent sagittis mi nec rutrum tempus.',\n\t'Aenean eu eros in erat gravida consectetur.',\n\t'Nulla lacinia vitae urna commodo ultricies.',\n\t'In interdum fermentum malesuada.',\n\t'Nullam placerat vel velit vel blandit.',\n\t'Praesent blandit tortor nec nisl viverra rutrum.',\n\t'Fusce ac euismod dui.',\n\t'Curabitur auctor quam dui, quis tristique ligula ornare et.',\n\t'Vivamus tellus diam, fringilla a congue quis, porta sit amet diam.',\n\t'Proin consectetur pulvinar malesuada.',\n\t'Duis tempor maximus libero non fringilla.',\n\t'Maecenas et elit leo.',\n\t'Fusce porttitor ex tortor, iaculis mollis sapien scelerisque eu.',\n\t'Etiam in dignissim tellus, nec egestas mauris.',\n\t'Aenean lacinia nec sapien quis suscipit.',\n\t'Ut id libero nec ligula laoreet rutrum.',\n\t'In id hendrerit nisl, sed luctus tortor.',\n\t'Morbi interdum augue justo, tincidunt suscipit sem lacinia vel.',\n\t'Aliquam a massa tortor.',\n\t'Sed eget libero id est pharetra laoreet.',\n\t'Morbi molestie, ex eu aliquet maximus, ante felis efficitur ligula, ac commodo justo augue quis velit.',\n\t'Integer lorem nulla, rhoncus a magna placerat, semper faucibus quam.',\n\t'Curabitur imperdiet aliquet diam nec scelerisque.',\n\t'Sed sed pellentesque risus.',\n\t'Sed tortor odio, vestibulum et augue a, maximus congue turpis.',\n\t'Donec pulvinar mi a enim rutrum, eu blandit neque molestie.',\n\t'Nullam tristique pulvinar sapien, ut consectetur velit mollis eu.',\n\t'Suspendisse vestibulum nisi leo, et ornare mi congue id.',\n\t'Integer urna nulla, molestie vitae arcu in, finibus aliquet felis.',\n\t'Maecenas laoreet venenatis felis, eget finibus urna pharetra sed.',\n\t'Pellentesque in turpis a nulla rutrum egestas vel in augue.',\n\t'Curabitur a lectus ac nulla porta vehicula.',\n\t'Cras quis euismod massa.',\n\t'Sed consequat arcu vitae gravida pellentesque.',\n\t'Donec rhoncus rhoncus imperdiet.',\n\t'Praesent pulvinar risus sed orci dignissim, sed tincidunt leo viverra.',\n\t'Aenean euismod maximus posuere.',\n\t'Quisque odio dolor, suscipit ut semper sed, molestie vel nulla.',\n\t'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Quisque auctor, leo at vulputate tempus, est nisi imperdiet arcu, nec dignissim nunc mauris eget enim.',\n\t'Aliquam at posuere mauris, ac dignissim nibh.',\n\t'Donec lacinia lobortis tempus.',\n\t'Sed blandit varius enim et sodales.',\n\t'Morbi pretium vulputate ipsum et congue.',\n\t'Quisque scelerisque justo eget ullamcorper vestibulum.',\n\t'Cras quis erat ut turpis dictum aliquam rutrum vel ligula.',\n\t'Sed ipsum elit, congue quis mi sit amet, semper porttitor magna.',\n\t'Nulla vel tellus condimentum, accumsan ex ac, gravida mauris.',\n\t'Donec cursus, nisi in vestibulum suscipit, magna tellus interdum tortor, a tincidunt mi turpis vitae libero.',\n\t'Etiam consectetur, odio ut iaculis convallis, ex nisl rhoncus enim, vitae placerat sem dui eu elit.',\n\t'Curabitur libero tellus, posuere nec fringilla sed, lobortis nec quam.',\n\t'Curabitur a augue ligula.',\n\t'Mauris pharetra eu ante non porta.',\n\t'Cras efficitur velit sem.',\n\t'Proin at dapibus arcu.',\n\t'Integer nec purus vitae lorem aliquam placerat.',\n\t'Integer sem risus, ultricies sit amet magna eget, viverra vehicula augue.',\n\t'Morbi blandit ligula vitae interdum euismod.',\n\t'Vestibulum egestas eleifend pulvinar.',\n\t'Ut euismod ex rutrum, viverra augue non, molestie libero.',\n\t'Proin fringilla, urna eu condimentum pharetra, dolor quam sollicitudin mi, vitae consequat sapien purus id magna.',\n\t'Phasellus pulvinar vel massa eu ullamcorper.',\n\t'Etiam nunc leo, vestibulum a tortor quis, laoreet gravida odio.',\n\t'Nullam tristique consequat lacus nec aliquam.',\n\t'Pellentesque aliquet augue facilisis felis pretium faucibus.',\n\t'Integer vitae ultrices diam, id lobortis ipsum.',\n\t'In at augue nibh.',\n\t'In non gravida ante.',\n\t'Aenean euismod eros augue.',\n\t'Nunc ac metus eget mauris bibendum cursus.',\n\t'Etiam et massa eu lacus molestie dignissim.',\n\t'Proin dictum ante non urna sollicitudin eleifend.',\n\t'Mauris convallis ultricies neque sit amet semper.',\n\t'Morbi venenatis euismod quam sed gravida.',\n\t'Nulla elementum orci at justo scelerisque, vel dapibus eros scelerisque.',\n\t'Integer accumsan augue posuere, suscipit odio vitae, tincidunt nisi.',\n\t'Quisque in orci malesuada, lobortis neque sit amet, pretium odio.',\n\t'Integer tempus eget sapien non sodales.',\n\t'Nunc ut dapibus justo.',\n\t'Quisque id nulla elit.',\n\t'Nam quis justo eget velit convallis facilisis.',\n\t'Quisque iaculis ex lectus, sit amet dictum neque pellentesque volutpat.',\n\t'Aenean quis tellus lacinia, gravida elit non, interdum quam.',\n\t'Donec interdum orci ut mauris molestie lacinia.',\n\t'Donec risus elit, mattis et viverra placerat, viverra et turpis.',\n\t'Morbi in sodales urna.',\n\t'Nam lorem ligula, tempus vitae sapien eget, vulputate fermentum purus.',\n\t'Aenean vulputate, nulla id euismod aliquet, leo ligula ornare tortor, sed tincidunt ante metus non felis.',\n\t'Cras volutpat, dolor consectetur luctus volutpat, mauris eros laoreet augue, at vehicula purus enim in tortor.',\n\t'Cras mi est, tincidunt in sapien nec, tempor cursus purus.',\n\t'Phasellus rutrum nibh a sagittis feugiat.',\n\t'Aenean sit amet tincidunt enim, at tincidunt justo.',\n\t'Pellentesque maximus nisi vitae nibh porttitor gravida.',\n\t'Aliquam ac sem mollis, pulvinar ligula id, rhoncus turpis.',\n\t'Ut placerat turpis ac finibus fringilla.',\n\t'Sed sit amet est eu tortor efficitur dignissim.',\n\t'Mauris iaculis, dolor et lobortis congue, augue massa scelerisque libero, in lobortis augue dolor et libero.',\n\t'Mauris pharetra finibus turpis, non maximus quam pellentesque sit amet.',\n\t'Praesent feugiat, ex eu aliquam tempor, sem nibh tempus est, eget tincidunt velit quam eget est.',\n\t'Donec imperdiet enim tellus, vel tincidunt felis accumsan rutrum.',\n\t'Ut ac sem sit amet sem posuere luctus at in enim.',\n\t'Nulla euismod, libero vel finibus lobortis, nulla libero porttitor tellus, a interdum odio quam nec nunc.',\n\t'Phasellus quis efficitur risus, ullamcorper condimentum nisl.',\n\t'Aliquam id neque a nunc vehicula euismod.',\n\t'In nec ultrices eros.',\n\t'Nunc sit amet purus neque.',\n\t'Pellentesque pharetra nisl augue, sed sollicitudin eros faucibus eget.',\n\t'Morbi sit amet lorem eget enim cursus vehicula.',\n\t'Etiam euismod ante in venenatis bibendum.',\n\t'Curabitur eu efficitur tortor.',\n\t'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nulla interdum nibh in vehicula tincidunt.',\n\t'Sed fringilla, magna non malesuada dignissim, quam enim mollis tellus, non faucibus purus tellus a ipsum.',\n\t'Ut placerat varius diam in vulputate.',\n\t'Mauris aliquet lectus id lacus iaculis, nec viverra ante porttitor.',\n\t'Maecenas finibus posuere risus.',\n\t'Suspendisse sit amet lectus quis nunc tincidunt bibendum eget in felis.',\n\t'In mattis dolor purus, id tempus nibh rutrum ut.',\n\t'Phasellus ornare diam ac elit laoreet, ac egestas ante maximus.',\n\t'In et lacus leo.',\n\t'Nam volutpat id nulla non dictum.',\n\t'Nunc blandit eu libero at consequat.',\n\t'In pretium lacus ac leo malesuada condimentum.',\n\t'Maecenas congue dictum ultricies.',\n\t'Sed id tincidunt ex.',\n\t'Praesent gravida lectus id ante facilisis, nec pharetra justo rutrum.',\n\t'Praesent cursus lobortis accumsan.',\n\t'Aenean sed lacus ac arcu blandit placerat.',\n\t'Quisque vitae ligula vitae elit congue dictum.',\n\t'Nulla condimentum fermentum nulla ac porta.',\n\t'Cras ornare diam vitae augue maximus, quis faucibus dui fermentum.',\n\t'Maecenas porttitor porttitor felis, sit amet facilisis diam sodales vitae.',\n\t'Aliquam dictum arcu tortor, et fringilla leo euismod vel.',\n\t'Phasellus diam mauris, feugiat aliquet fermentum in, porttitor et tortor.',\n\t'Maecenas ex justo, sagittis sed magna sed, efficitur venenatis felis.',\n\t'In placerat et nunc et malesuada.',\n\t'Aenean vehicula neque odio, vitae molestie mauris aliquet quis.',\n\t'Vestibulum gravida dolor vel velit semper rhoncus.',\n\t'Ut egestas sodales nulla quis rutrum.',\n\t'Integer quis nisi nec enim vestibulum convallis.',\n\t'Fusce eget nisi rutrum justo porttitor gravida nec nec ipsum.',\n\t'Nam blandit nec leo ut porttitor.',\n\t'Suspendisse a nunc sed ante fringilla fermentum consectetur vitae orci.',\n\t'Nunc bibendum arcu erat, eu ullamcorper est placerat ac.',\n\t'Sed facilisis, enim a tempor ullamcorper, metus nunc interdum lacus, id pellentesque mauris magna ut augue.',\n\t'Curabitur eu dignissim velit.',\n\t'Sed ut quam erat.',\n\t'Sed faucibus sapien felis, ac malesuada nunc cursus et.',\n\t'Sed vestibulum lacus nec sapien ultrices, at euismod tellus dignissim.',\n\t'Integer sagittis vulputate lectus, sed scelerisque tortor pulvinar id.',\n\t'Integer finibus venenatis massa, eget fringilla arcu placerat et.',\n\t'Proin blandit neque a quam blandit mollis.',\n\t'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Suspendisse potenti.',\n\t'Ut nec risus nisl.',\n\t'Vestibulum rhoncus pellentesque augue fringilla molestie.',\n\t'Praesent sodales eget sapien eu tristique.',\n\t'In nec purus leo.',\n\t'Vivamus vitae sem sed massa bibendum tempor eu id lectus.',\n\t'Ut id pulvinar nunc.',\n\t'Nam tempus dignissim lectus, ac pellentesque neque porttitor non.',\n\t'Suspendisse lobortis rhoncus dui, ac ullamcorper dolor dignissim sed.',\n\t'Vestibulum sollicitudin faucibus nisl a laoreet.',\n\t'Aenean consequat purus et lorem suscipit, sed efficitur magna facilisis.',\n\t'Mauris fermentum malesuada tortor et tempus.',\n\t'Maecenas interdum rutrum pretium.',\n\t'Morbi non neque eget lorem suscipit congue id eget quam.',\n\t'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Suspendisse malesuada purus nibh, volutpat facilisis lacus iaculis a.',\n\t'Aenean eu pharetra ligula.',\n\t'Nulla nec leo porta, sollicitudin nunc et, lacinia quam.',\n\t'Nunc placerat tristique pellentesque.',\n\t'Ut enim nisi, condimentum quis felis ut, vestibulum cursus mi.',\n\t'Vestibulum ut ipsum eros.',\n\t'Proin vehicula bibendum enim, vitae laoreet ante auctor vitae.',\n\t'Donec imperdiet vestibulum congue.',\n\t'Sed velit mi, dictum in commodo at, semper a neque.',\n\t'Aliquam lectus turpis, vulputate at nunc et, laoreet porttitor turpis.',\n\t'Nullam eu mauris eget augue tincidunt ornare.',\n\t'Pellentesque sit amet leo eu nibh placerat sagittis.',\n\t'Curabitur et finibus odio.',\n\t'Fusce tristique non tellus sed egestas.',\n\t'Donec metus nunc, consequat non lorem sit amet, vehicula venenatis nisl.',\n\t'Aenean sodales molestie posuere.',\n\t'Mauris ut sollicitudin orci.',\n\t'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc sit amet condimentum mauris, eu fermentum risus.',\n\t'Cras quis ante felis.',\n\t'Pellentesque id interdum neque.',\n\t'Phasellus erat tellus, tempus quis pulvinar volutpat, efficitur in odio.',\n\t'Maecenas a venenatis ex, at tempor libero.',\n\t'Pellentesque suscipit ipsum eget tincidunt faucibus.',\n\t'Aenean sollicitudin est odio, vitae vulputate ligula dapibus sit amet.',\n\t'Nam finibus arcu at dui blandit ornare.',\n\t'Integer id dapibus est, ut fringilla lorem.',\n\t'Aenean interdum quis dui nec pharetra.',\n\t'Maecenas non diam non elit fringilla tempor id sollicitudin purus.',\n\t'Nullam odio metus, aliquam eu dolor non, rutrum sodales mauris.',\n\t'Maecenas nibh sem, faucibus at turpis vitae, tristique vestibulum eros.',\n\t'Duis ac dolor eget augue luctus dignissim.',\n\t'Fusce eget libero hendrerit, placerat purus id, volutpat tellus.',\n\t'Fusce viverra, arcu ut molestie ultricies, dui tortor lacinia risus, eu auctor elit mauris eu orci.',\n\t'Praesent semper mi eu mi dignissim, imperdiet dictum urna tincidunt.',\n\t'Nulla in lorem id sapien rhoncus ultrices.',\n\t'Quisque imperdiet, tortor ac viverra blandit, massa sapien auctor tortor, at fermentum ex tortor sit amet sem.',\n\t'Fusce nisl libero, sollicitudin vel feugiat iaculis, consectetur ac diam.',\n\t'Aliquam velit arcu, faucibus id ornare a, pharetra et leo.',\n\t'Nullam eu fringilla felis.',\n\t'Donec dignissim risus facilisis bibendum tincidunt.',\n\t'Donec sed orci nunc.',\n\t'Fusce at metus lobortis, iaculis ante laoreet, aliquam nisi.',\n\t'Integer imperdiet ornare turpis, sed viverra felis mattis non.',\n\t'Nulla tincidunt purus sed fermentum volutpat.',\n\t'Phasellus eu dignissim massa, non consectetur lorem.',\n\t'Praesent venenatis, nulla nec ornare vulputate, velit ipsum lobortis nisl, sed consequat nibh turpis vel diam.',\n\t'Pellentesque pharetra odio lobortis, congue enim eu, sagittis velit.',\n\t'Mauris sed molestie tortor.',\n\t'Suspendisse consectetur nunc vel dolor aliquet, vel venenatis eros laoreet.',\n\t'Nullam malesuada nulla libero, dapibus pretium mi iaculis a.',\n\t'Donec placerat nibh leo, id tristique enim tincidunt sed.',\n\t'Nunc elementum, arcu nec ultrices convallis, urna turpis finibus velit, eu euismod nibh orci ac eros.',\n\t'Proin cursus pellentesque turpis, vel tempor lorem feugiat et.',\n\t'Duis finibus aliquet lacus, at accumsan tortor posuere nec.',\n\t'Aliquam id sem justo.',\n\t'Suspendisse eget dignissim eros.',\n\t'Suspendisse feugiat scelerisque ante id fermentum.',\n\t'Quisque pellentesque libero et sem pellentesque ultrices.',\n\t'Nunc dignissim magna interdum, feugiat odio sit amet, pharetra lacus.',\n\t'Duis in sapien aliquam, volutpat est sit amet, semper risus.',\n\t'Proin blandit enim at fermentum mattis.',\n\t'Proin pharetra, orci a semper porttitor, purus felis placerat lorem, nec mollis orci tellus sit amet elit.',\n\t'Duis sed convallis turpis, a pellentesque nibh.',\n\t'Proin et est vel nisl dictum aliquam et et sem.',\n\t'Donec sed augue laoreet, suscipit sem quis, consectetur est.',\n\t'Sed hendrerit arcu quis porttitor vestibulum.',\n\t'Pellentesque interdum lorem urna, et vestibulum enim pharetra et.',\n\t'Cras sed neque sit amet erat aliquam semper.',\n\t'Fusce sit amet eros lacus.',\n\t'Cras commodo, nibh et sodales vehicula, eros magna pellentesque orci, et laoreet lacus dolor nec enim.',\n\t'Donec et quam ultrices, porta justo tempor, auctor odio.',\n\t'Morbi eget iaculis nisi, ut finibus orci.',\n\t'Sed tellus lectus, consequat nec dapibus ac, interdum vitae lectus.',\n\t'Praesent accumsan vehicula lacus ut efficitur.',\n\t'Integer sit amet nisl non odio tincidunt sodales eu ut mauris.',\n\t'Duis euismod risus quis iaculis sodales.',\n\t'Pellentesque eleifend vel lorem sed iaculis.',\n\t'Duis a mollis ex.',\n\t'Nunc ullamcorper id felis non aliquam.',\n\t'Etiam ut posuere lacus.',\n\t'Duis quis elementum ligula.',\n\t'Aenean pulvinar elit a eleifend luctus.',\n\t'Vivamus accumsan tincidunt dui in pellentesque.',\n\t'Cras vulputate metus at suscipit vestibulum.',\n\t'Phasellus ultrices consequat lectus, ac tristique nunc mattis sit amet.',\n\t'Donec arcu diam, mollis ut euismod sit amet, tincidunt vel ipsum.',\n\t'Maecenas aliquet orci ac rutrum laoreet.',\n\t'Quisque maximus nisl sed sapien posuere pulvinar.',\n\t'Sed interdum, ante et laoreet iaculis, arcu ligula pretium mi, eget bibendum lorem urna sit amet odio.',\n\t'Praesent consequat nisl quis tellus mollis eleifend.',\n\t'Suspendisse facilisis sem vitae sapien rhoncus, ac dignissim nunc pharetra.',\n\t'Quisque id lacus ut neque vehicula pellentesque.',\n\t'Quisque scelerisque, risus sit amet condimentum consectetur, quam erat pretium tellus, ut tempor metus lectus suscipit risus.',\n\t'Vestibulum eu lectus eget nunc aliquet laoreet.',\n\t'Phasellus ornare neque auctor pulvinar pellentesque.',\n\t'Aliquam vitae dignissim mi, ac mattis nibh.',\n\t'Duis vitae porta velit, ac efficitur mauris.',\n\t'Sed id nisi nisl.',\n\t'Donec malesuada odio in posuere eleifend.',\n\t'Cras ut mi quis tortor mollis iaculis sed a dolor.',\n\t'Nunc a nisi vitae orci consectetur semper.',\n\t'Mauris tristique pharetra mattis.',\n\t'Sed iaculis fermentum mauris a tempus.',\n\t'Quisque cursus, mauris vel tristique molestie, massa libero suscipit orci, ut sodales lacus massa vel odio.',\n\t'Sed eu mi sapien.',\n\t'Sed tincidunt ullamcorper mauris nec lobortis.',\n\t'Suspendisse at est in diam elementum commodo.',\n\t'Ut felis lectus, hendrerit sit amet vulputate sit amet, cursus sit amet quam.',\n\t'Quisque porta arcu ac purus scelerisque, ac aliquam mi ornare.',\n\t'Sed ultricies vitae purus et convallis.',\n\t'Nunc ligula nisl, malesuada ut scelerisque ac, maximus quis odio.',\n\t'Duis nisi arcu, commodo ac purus ac, dignissim convallis arcu.',\n\t'Suspendisse eget scelerisque libero.',\n\t'Morbi dolor purus, vehicula id sem sed, condimentum viverra eros.',\n\t'Etiam bibendum commodo enim, ac vulputate ex consequat aliquet.',\n\t'Pellentesque porta nisl sit amet tortor dignissim, quis aliquet arcu consectetur.',\n\t'Integer et pretium lectus.',\n\t'Fusce efficitur posuere ipsum, ut convallis nisl sollicitudin ultrices.',\n\t'Sed suscipit elementum est, vitae laoreet tellus dignissim ultricies.',\n\t'Praesent viverra nisl ut odio posuere, tristique finibus nibh rhoncus.',\n\t'Aliquam consequat ornare orci ac ultrices.',\n\t'Vivamus vel lacinia velit.',\n\t'Vestibulum sit amet sapien sit amet velit tincidunt suscipit.',\n\t'Etiam ornare molestie aliquet.',\n\t'Sed gravida enim quis nunc interdum imperdiet.',\n\t'Proin cursus odio ac dolor blandit, quis sollicitudin ante rutrum.',\n];\n\nexport const maxStringLength = 190;\n"
  },
  {
    "path": "drizzle-seed/src/datasets/phonesInfo.ts",
    "content": "/**\n * The original source for the phones info data was taken from https://www.kaggle.com/datasets/leighplt/country-code?select=mobile_telephone_prefixes_by_country.csv\n *\n * Data format is: [\"country prefix, operator prefix, number length including operator prefix and excluding country prefix\"]\n */\nexport default [\n\t'93,70,9',\n\t'93,71,9',\n\t'93,72,9',\n\t'93,73,9',\n\t'93,74,9',\n\t'93,75,9',\n\t'93,76,9',\n\t'93,77,9',\n\t'93,78,9',\n\t'93,79,9',\n\t'355,66,9',\n\t'355,67,9',\n\t'355,68,9',\n\t'355,69,9',\n\t'213,5,9',\n\t'213,6,9',\n\t'213,7,9',\n\t'1,684,10',\n\t'1,264 772,10',\n\t'1,268 7,10',\n\t'374,55,6',\n\t'374,95,6',\n\t'374,41,6',\n\t'374,44,6',\n\t'374,77,6',\n\t'374,93,6',\n\t'374,94,6',\n\t'374,98,6',\n\t'374,91,6',\n\t'374,99,6',\n\t'374,43,6',\n\t'374,97,6',\n\t'61,4,9',\n\t'672,1,9',\n\t'43,650,10',\n\t'43,660,10',\n\t'43,664,10',\n\t'43,676,10',\n\t'43,680,10',\n\t'43,677,11',\n\t'43,681,11',\n\t'43,688,11',\n\t'43,699,11',\n\t'994,41,9',\n\t'994,50,9',\n\t'994,51,9',\n\t'994,55,9',\n\t'994,70,9',\n\t'994,77,9',\n\t'994,99,9',\n\t'1,242 35,10',\n\t'1,242 45,10',\n\t'1,242 55,10',\n\t'973,31,8',\n\t'973,322,8',\n\t'973,33,8',\n\t'973,340,8',\n\t'973,341,8',\n\t'973,343,8',\n\t'973,344,8',\n\t'973,345,8',\n\t'973,353,8',\n\t'973,355,8',\n\t'973,36,8',\n\t'973,377,8',\n\t'973,383,8',\n\t'973,384,8',\n\t'973,388,8',\n\t'973,39,8',\n\t'973,663,8',\n\t'973,666,8',\n\t'973,669,8',\n\t'880,13,10',\n\t'880,14,10',\n\t'880,15,10',\n\t'880,16,10',\n\t'880,17,10',\n\t'880,18,10',\n\t'880,19,10',\n\t'1,246,10',\n\t'32,456,9',\n\t'32,47,9',\n\t'32,48,9',\n\t'32,49,9',\n\t'501,6,7',\n\t'1,441,10',\n\t'387,60,8',\n\t'387,69,8',\n\t'387,62,8',\n\t'387,63,8',\n\t'387,64,8',\n\t'387,65,8',\n\t'387,66,8',\n\t'246,387,7',\n\t'1,284,10',\n\t'359,87,9',\n\t'359,88,9',\n\t'359,89,9',\n\t'359,988,9',\n\t'226,70,8',\n\t'226,71,8',\n\t'226,72,8',\n\t'226,74,8',\n\t'226,75,8',\n\t'226,77,8',\n\t'226,78,8',\n\t'226,79,8',\n\t'855,92,9',\n\t'855,12,9',\n\t'855,11,9',\n\t'855,77,9',\n\t'855,99,9',\n\t'1,345,10',\n\t'235,66,8',\n\t'235,63,8',\n\t'235,65,8',\n\t'235,99,8',\n\t'235,95,8',\n\t'235,93,8',\n\t'235,90,8',\n\t'235,77,8',\n\t'56,9,9',\n\t'86,13,11',\n\t'86,15,11',\n\t'86,18,11',\n\t'86,19,11',\n\t'57,30,10',\n\t'57,310,10',\n\t'57,311,10',\n\t'57,312,10',\n\t'57,313,10',\n\t'57,314,10',\n\t'57,315,10',\n\t'57,316,10',\n\t'57,317,10',\n\t'57,318,10',\n\t'57,319,10',\n\t'57,32,10',\n\t'682,5,5',\n\t'682,7,5',\n\t'506,6,8',\n\t'506,7,8',\n\t'506,8,8',\n\t'385,91,9',\n\t'385,92,9',\n\t'385,95,9',\n\t'385,97,9',\n\t'385,98,9',\n\t'385,99,9',\n\t'357,94,8',\n\t'357,95,8',\n\t'357,96,8',\n\t'357,97,8',\n\t'357,99,8',\n\t'420,601,9',\n\t'420,602,9',\n\t'420,603,9',\n\t'420,604,9',\n\t'420,605,9',\n\t'420,606,9',\n\t'420,607,9',\n\t'420,608,9',\n\t'420,702,9',\n\t'420,72,9',\n\t'420,73,9',\n\t'420,77,9',\n\t'420,790,9',\n\t'45,2,8',\n\t'45,30,8',\n\t'45,31,8',\n\t'45,40,8',\n\t'45,41,8',\n\t'45,42,8',\n\t'45,50,8',\n\t'45,51,8',\n\t'45,52,8',\n\t'45,53,8',\n\t'45,60,8',\n\t'45,61,8',\n\t'45,71,8',\n\t'45,81,8',\n\t'1,767 2,10',\n\t'1,809,10',\n\t'1,829,10',\n\t'1,849,10',\n\t'670,77,8',\n\t'670,78,8',\n\t'593,9,9',\n\t'20,10,10',\n\t'20,11,10',\n\t'20,12,10',\n\t'503,6,8',\n\t'503,7,8',\n\t'268,7,8',\n\t'500,5,5',\n\t'500,6,5',\n\t'298,21,5',\n\t'298,22,5',\n\t'298,23,5',\n\t'298,24,5',\n\t'298,25,5',\n\t'298,26,5',\n\t'298,27,5',\n\t'298,28,5',\n\t'298,29,5',\n\t'298,5,5',\n\t'298,71,5',\n\t'298,72,5',\n\t'298,73,5',\n\t'298,74,5',\n\t'298,75,5',\n\t'298,76,5',\n\t'298,77,5',\n\t'298,78,5',\n\t'298,79,5',\n\t'298,91,5',\n\t'298,92,5',\n\t'298,93,5',\n\t'298,94,5',\n\t'298,95,5',\n\t'298,96,5',\n\t'298,97,5',\n\t'298,98,5',\n\t'298,99,5',\n\t'691,92,7',\n\t'691,93,7',\n\t'691,95,7',\n\t'691,97,7',\n\t'358,457,10',\n\t'33,6,9',\n\t'33,700,9',\n\t'33,73,9',\n\t'33,74,9',\n\t'33,75,9',\n\t'33,76,9',\n\t'33,77,9',\n\t'33,78,9',\n\t'594,694,9',\n\t'241,2,7',\n\t'241,3,7',\n\t'241,4,7',\n\t'241,5,7',\n\t'241,6,7',\n\t'241,7,7',\n\t'995,544,9',\n\t'995,514,9',\n\t'995,551,9',\n\t'995,555,9',\n\t'995,557,9',\n\t'995,558,9',\n\t'995,568,9',\n\t'995,570,9',\n\t'995,571,9',\n\t'995,574,9',\n\t'995,577,9',\n\t'995,578,9',\n\t'995,579,9',\n\t'995,591,9',\n\t'995,592,9',\n\t'995,593,9',\n\t'995,595,9',\n\t'995,596,9',\n\t'995,597,9',\n\t'995,598,9',\n\t'995,599,9',\n\t'49,151,10',\n\t'49,152,10',\n\t'49,155,10',\n\t'49,157,10',\n\t'49,159,10',\n\t'49,162,10',\n\t'49,163,10',\n\t'49,170,10',\n\t'49,171,10',\n\t'49,172,10',\n\t'49,173,10',\n\t'49,174,10',\n\t'49,175,10',\n\t'49,176,10',\n\t'49,177,10',\n\t'49,178,10',\n\t'49,179,10',\n\t'233,20,9',\n\t'233,50,9',\n\t'233,23,9',\n\t'233,24,9',\n\t'233,54,9',\n\t'233,55,9',\n\t'233,59,9',\n\t'233,26,9',\n\t'233,56,9',\n\t'233,27,9',\n\t'233,57,9',\n\t'233,28,9',\n\t'30,690,10',\n\t'30,693,10',\n\t'30,694,10',\n\t'30,695,10',\n\t'30,697,10',\n\t'30,698,10',\n\t'30,699,10',\n\t'1,473 41,10',\n\t'1,671,10',\n\t'502,231,8',\n\t'502,2324,8',\n\t'502,2326,8',\n\t'502,2327,8',\n\t'502,2328,8',\n\t'502,2329,8',\n\t'502,2428,8',\n\t'502,2429,8',\n\t'502,30,8',\n\t'502,310,8',\n\t'502,311,8',\n\t'502,448,8',\n\t'502,449,8',\n\t'502,45,8',\n\t'502,46,8',\n\t'502,478,8',\n\t'502,479,8',\n\t'502,480,8',\n\t'502,481,8',\n\t'502,49,8',\n\t'502,5,8',\n\t'1,808,10',\n\t'504,3,8',\n\t'504,7,8',\n\t'504,8,8',\n\t'504,9,8',\n\t'36,20,9',\n\t'36,30,9',\n\t'36,31,9',\n\t'36,38,9',\n\t'36,50,9',\n\t'36,60,9',\n\t'36,70,9',\n\t'91,7,10',\n\t'91,8,10',\n\t'91,90,10',\n\t'91,91,10',\n\t'91,92,10',\n\t'91,93,10',\n\t'91,94,10',\n\t'91,95,10',\n\t'91,96,10',\n\t'91,97,10',\n\t'91,98,10',\n\t'91,99,10',\n\t'62,811,9',\n\t'62,813,11',\n\t'62,814,11',\n\t'62,815,10',\n\t'62,818,9',\n\t'62,819,10',\n\t'62,838,10',\n\t'62,852,11',\n\t'62,853,11',\n\t'62,855,10',\n\t'62,858,11',\n\t'62,859,11',\n\t'62,878,11',\n\t'62,896,10',\n\t'62,897,10',\n\t'62,898,10',\n\t'62,899,10',\n\t'98,91,10',\n\t'98,990,10',\n\t'353,8,9',\n\t'353,83,9',\n\t'353,85,9',\n\t'353,86,9',\n\t'353,87,9',\n\t'353,89,9',\n\t'972,50,9',\n\t'972,52,9',\n\t'972,53,9',\n\t'972,54,9',\n\t'972,556,9',\n\t'972,558,9',\n\t'972,559,9',\n\t'972,58,9',\n\t'39,310,10',\n\t'39,31100,10',\n\t'39,31101,10',\n\t'39,31105,10',\n\t'39,313,10',\n\t'39,319,10',\n\t'39,320,10',\n\t'39,324,10',\n\t'39,327,10',\n\t'39,328,10',\n\t'39,329,10',\n\t'39,331,10',\n\t'39,333,10',\n\t'39,334,10',\n\t'39,338,10',\n\t'39,339,10',\n\t'39,340,10',\n\t'39,342,10',\n\t'39,344,10',\n\t'39,345,10',\n\t'39,346,10',\n\t'39,347,10',\n\t'39,348,10',\n\t'39,349,10',\n\t'39,3505,10',\n\t'39,3510,10',\n\t'39,3512,10',\n\t'39,366,10',\n\t'39,370,10',\n\t'39,3710,10',\n\t'39,3711,10',\n\t'39,373,10',\n\t'39,377,10',\n\t'39,380,10',\n\t'39,385,10',\n\t'39,388,10',\n\t'39,389,10',\n\t'39,391,10',\n\t'39,392,10',\n\t'39,393,10',\n\t'1,876,10',\n\t'81,060,11',\n\t'81,070,11',\n\t'81,080,11',\n\t'81,090,11',\n\t'254,10,10',\n\t'254,11,10',\n\t'254,70,10',\n\t'254,71,10',\n\t'254,72,10',\n\t'254,73,10',\n\t'254,74,10',\n\t'254,75,10',\n\t'254,763,10',\n\t'254,77,10',\n\t'254,78,10',\n\t'686,63,8',\n\t'686,7,8',\n\t'383,44,8',\n\t'383,45,8',\n\t'383,49,8',\n\t'965,5,8',\n\t'965,6,8',\n\t'965,9,8',\n\t'371,2,8',\n\t'231,46,7',\n\t'231,47,7',\n\t'231,5,7',\n\t'231,64,7',\n\t'231,65,7',\n\t'231,7,8',\n\t'218,91,10',\n\t'218,92,10',\n\t'218,94,10',\n\t'370,6,8',\n\t'352,621,9',\n\t'352,628,9',\n\t'352,661,9',\n\t'352,668,9',\n\t'352,691,9',\n\t'352,698,9',\n\t'60,11,7',\n\t'60,12,7',\n\t'60,13,7',\n\t'60,14,7',\n\t'60,16,7',\n\t'60,17,7',\n\t'60,18,7',\n\t'60,19,7',\n\t'960,7,7',\n\t'960,9,7',\n\t'223,6,8',\n\t'223,7,8',\n\t'596,696,9',\n\t'230,57,8',\n\t'230,58,8',\n\t'230,59,8',\n\t'230,54,8',\n\t'52,1,10',\n\t'373,60,8',\n\t'373,65,8',\n\t'373,67,8',\n\t'373,68,8',\n\t'373,69,8',\n\t'373,78,8',\n\t'373,79,8',\n\t'976,70,8',\n\t'976,88,8',\n\t'976,89,8',\n\t'976,91,8',\n\t'976,93,8',\n\t'976,94,8',\n\t'976,95,8',\n\t'976,96,8',\n\t'976,98,8',\n\t'976,99,8',\n\t'382,60,8',\n\t'382,63,8',\n\t'382,66,8',\n\t'382,67,8',\n\t'382,68,8',\n\t'382,69,8',\n\t'1,664,10',\n\t'95,92,8',\n\t'95,925,10',\n\t'95,926,10',\n\t'95,943,9',\n\t'95,94,10',\n\t'95,944,9',\n\t'95,95,8',\n\t'95,96,8',\n\t'95,973,9',\n\t'95,991,9',\n\t'95,93,9',\n\t'95,996,10',\n\t'95,997,10',\n\t'95,977,10',\n\t'95,978,10',\n\t'95,979,10',\n\t'977,98,10',\n\t'31,6,9',\n\t'687,7,6',\n\t'687,8,6',\n\t'687,9,6',\n\t'64,22,9',\n\t'64,27,9',\n\t'505,8,8',\n\t'227,9,8',\n\t'234,804,8',\n\t'234,805,8',\n\t'234,803,8',\n\t'234,802,8',\n\t'234,809,8',\n\t'683,1,4',\n\t'683,3,4',\n\t'683,4,4',\n\t'672,38,6',\n\t'389,70,8',\n\t'389,71,8',\n\t'389,72,8',\n\t'389,74,8',\n\t'389,75,8',\n\t'389,76,8',\n\t'389,77,8',\n\t'389,78,8',\n\t'389,79,8',\n\t'90,533,7',\n\t'1,670,10',\n\t'47,4,8',\n\t'47,59,8',\n\t'47,9,8',\n\t'968,91,8',\n\t'92,30,10',\n\t'92,31,10',\n\t'92,32,10',\n\t'92,33,10',\n\t'92,34,10',\n\t'507,6,8',\n\t'595,9,9',\n\t'51,9,9',\n\t'63,973,10',\n\t'63,974,10',\n\t'63,905,10',\n\t'63,906,10',\n\t'63,977,10',\n\t'63,915,10',\n\t'63,916,10',\n\t'63,926,10',\n\t'63,927,10',\n\t'63,935,10',\n\t'63,936,10',\n\t'63,937,10',\n\t'63,996,10',\n\t'63,997,10',\n\t'63,917,10',\n\t'63,979,10',\n\t'63,920,10',\n\t'63,930,10',\n\t'63,938,10',\n\t'63,939,10',\n\t'63,907,10',\n\t'63,908,10',\n\t'63,909,10',\n\t'63,910,10',\n\t'63,912,10',\n\t'63,919,10',\n\t'63,921,10',\n\t'63,928,10',\n\t'63,929,10',\n\t'63,947,10',\n\t'63,948,10',\n\t'63,949,10',\n\t'63,989,10',\n\t'63,918,10',\n\t'63,999,10',\n\t'63,922,10',\n\t'63,923,10',\n\t'63,932,10',\n\t'63,933,10',\n\t'63,942,10',\n\t'63,943,10',\n\t'48,50,9',\n\t'48,45,9',\n\t'48,51,9',\n\t'48,53,9',\n\t'48,57,9',\n\t'48,60,9',\n\t'48,66,9',\n\t'48,69,9',\n\t'48,72,9',\n\t'48,73,9',\n\t'48,78,9',\n\t'48,79,9',\n\t'48,88,9',\n\t'351,91,9',\n\t'351,921,9',\n\t'351,922,9',\n\t'351,924,9',\n\t'351,925,9',\n\t'351,926,9',\n\t'351,927,9',\n\t'351,9290,9',\n\t'351,9291,9',\n\t'351,9292,9',\n\t'351,9293,9',\n\t'351,9294,9',\n\t'351,93,9',\n\t'351,96,9',\n\t'1,787,10',\n\t'1,939,10',\n\t'974,33,8',\n\t'974,55,8',\n\t'974,66,8',\n\t'974,77,8',\n\t'1,869,10',\n\t'1,758,10',\n\t'1,784,10',\n\t'685,77,5',\n\t'966,50,9',\n\t'966,51,9',\n\t'966,53,9',\n\t'966,54,9',\n\t'966,55,9',\n\t'966,56,9',\n\t'966,57,9',\n\t'966,58,9',\n\t'966,59,9',\n\t'381,60,9',\n\t'381,61,9',\n\t'381,62,9',\n\t'381,63,9',\n\t'381,64,9',\n\t'381,65,9',\n\t'381,66,9',\n\t'381,677,9',\n\t'381,68,9',\n\t'381,69,8',\n\t'65,8,8',\n\t'65,9,8',\n\t'1,721,10',\n\t'421,901,9',\n\t'421,902,9',\n\t'421,903,9',\n\t'421,904,9',\n\t'421,905,9',\n\t'421,906,9',\n\t'421,907,9',\n\t'421,908,9',\n\t'421,910,9',\n\t'421,911,9',\n\t'421,912,9',\n\t'421,914,9',\n\t'421,915,9',\n\t'421,916,9',\n\t'421,917,9',\n\t'421,918,9',\n\t'421,940,9',\n\t'421,944,9',\n\t'421,948,9',\n\t'421,949,9',\n\t'421,950,9',\n\t'421,951,9',\n\t'386,20,8',\n\t'386,21,8',\n\t'386,30,8',\n\t'386,31,8',\n\t'386,40,8',\n\t'386,41,8',\n\t'386,49,8',\n\t'386,50,8',\n\t'386,51,8',\n\t'386,60,8',\n\t'386,61,8',\n\t'386,64,8',\n\t'386,70,8',\n\t'386,71,8',\n\t'677,74,7',\n\t'677,75,7',\n\t'27,60,9',\n\t'27,710,9',\n\t'27,711,9',\n\t'27,712,9',\n\t'27,713,9',\n\t'27,714,9',\n\t'27,715,9',\n\t'27,716,9',\n\t'27,717,9',\n\t'27,718,9',\n\t'27,719,9',\n\t'27,72,9',\n\t'27,73,9',\n\t'27,74,9',\n\t'27,741,9',\n\t'27,76,9',\n\t'27,78,9',\n\t'27,79,9',\n\t'27,811,9',\n\t'27,812,9',\n\t'27,813,9',\n\t'27,814,9',\n\t'27,82,9',\n\t'27,83,9',\n\t'27,84,9',\n\t'34,6,9',\n\t'34,7,9',\n\t'94,70,7',\n\t'94,71,7',\n\t'94,72,7',\n\t'94,75,7',\n\t'94,76,7',\n\t'94,77,7',\n\t'94,78,7',\n\t'46,70,7',\n\t'46,71 0,10',\n\t'46,73 00,7',\n\t'46,73 01,7',\n\t'46,73 10,7',\n\t'46,73 11,7',\n\t'46,73 12,7',\n\t'46,73 13,7',\n\t'46,73 16,7',\n\t'46,73 170,7',\n\t'46,73 18,7',\n\t'46,73 19,7',\n\t'46,73 20,7',\n\t'46,73 23,7',\n\t'46,73 27,7',\n\t'46,73 28,7',\n\t'46,73 29,7',\n\t'46,73 3,7',\n\t'46,73 455,7',\n\t'46,73 456,7',\n\t'46,73 6,7',\n\t'46,73 85,7',\n\t'46,73 86,7',\n\t'46,73 87,7',\n\t'46,73 88,7',\n\t'46,73 89,7',\n\t'46,73 9,7',\n\t'41,74,9',\n\t'41,75,9',\n\t'41,76,9',\n\t'41,77,9',\n\t'41,78,9',\n\t'41,79,9',\n\t'963,93,9',\n\t'963,98,9',\n\t'963,99,9',\n\t'963,94,9',\n\t'963,95,9',\n\t'963,96,9',\n\t'886,9,9',\n\t'66,6,9',\n\t'66,8,9',\n\t'66,9,9',\n\t'228,90,8',\n\t'228,91,8',\n\t'228,92,8',\n\t'228,97,8',\n\t'228,98,8',\n\t'228,99,8',\n\t'1,868,10',\n\t'216,2,8',\n\t'216,3,8',\n\t'216,4,8',\n\t'216,5,8',\n\t'216,9,8',\n\t'90,50,11',\n\t'90,53,11',\n\t'90,54,11',\n\t'90,55,11',\n\t'1,649,10',\n\t'380,39,9',\n\t'380,50,9',\n\t'380,63,9',\n\t'380,66,9',\n\t'380,67,9',\n\t'380,68,9',\n\t'380,91,9',\n\t'380,92,9',\n\t'380,93,9',\n\t'380,94,9',\n\t'380,95,9',\n\t'380,96,9',\n\t'380,97,9',\n\t'380,98,9',\n\t'380,99,9',\n\t'971,50,9',\n\t'971,52,9',\n\t'971,54,9',\n\t'971,55,9',\n\t'971,56,9',\n\t'971,58,9',\n\t'44,71,10',\n\t'44,72,10',\n\t'44,73,10',\n\t'44,74,10',\n\t'44,75,10',\n\t'44,7624,10',\n\t'44,77,10',\n\t'44,78,10',\n\t'44,79,10',\n\t'598,91,8',\n\t'598,93,8',\n\t'598,94,8',\n\t'598,95,8',\n\t'598,96,8',\n\t'598,97,8',\n\t'598,98,8',\n\t'598,99,8',\n\t'39,06 698,10',\n\t'58,4,7',\n\t'58,412,7',\n\t'58,414,7',\n\t'58,416,7',\n\t'58,424,7',\n\t'58,426,7',\n\t'1,340,10',\n\t'967,7,9',\n\t'967,70,9',\n\t'967,71,9',\n\t'967,73,9',\n\t'967,77,9',\n];\n"
  },
  {
    "path": "drizzle-seed/src/datasets/states.ts",
    "content": "export default [\n\t'Alabama',\n\t'Alaska',\n\t'Arizona',\n\t'Arkansas',\n\t'California',\n\t'Colorado',\n\t'Connecticut',\n\t'Delaware',\n\t'Florida',\n\t'Georgia',\n\t'Hawaii',\n\t'Idaho',\n\t'Illinois',\n\t'Indiana',\n\t'Iowa',\n\t'Kansas',\n\t'Kentucky',\n\t'Louisiana',\n\t'Maine',\n\t'Maryland',\n\t'Massachusetts',\n\t'Michigan',\n\t'Minnesota',\n\t'Mississippi',\n\t'Missouri',\n\t'Montana',\n\t'Nebraska',\n\t'Nevada',\n\t'New Hampshire',\n\t'New Jersey',\n\t'New Mexico',\n\t'New York',\n\t'North Carolina',\n\t'North Dakota',\n\t'Ohio',\n\t'Oklahoma',\n\t'Oregon',\n\t'Pennsylvania',\n\t'Rhode Island',\n\t'South Carolina',\n\t'South Dakota',\n\t'Tennessee',\n\t'Texas',\n\t'Utah',\n\t'Vermont',\n\t'Virginia',\n\t'Washington',\n\t'West Virginia',\n\t'Wisconsin',\n\t'Wyoming',\n];\n\nexport const maxStringLength = 14;\n"
  },
  {
    "path": "drizzle-seed/src/datasets/streetSuffix.ts",
    "content": "/**\n * The original data was taken from the сopycat library: https://github.com/supabase-community/copycat/blob/main/src/locales/en/address/street_suffix.ts\n */\nexport default [\n\t'Alley',\n\t'Avenue',\n\t'Branch',\n\t'Bridge',\n\t'Brook',\n\t'Brooks',\n\t'Burg',\n\t'Burgs',\n\t'Bypass',\n\t'Camp',\n\t'Canyon',\n\t'Cape',\n\t'Causeway',\n\t'Center',\n\t'Centers',\n\t'Circle',\n\t'Circles',\n\t'Cliff',\n\t'Cliffs',\n\t'Club',\n\t'Common',\n\t'Corner',\n\t'Corners',\n\t'Course',\n\t'Court',\n\t'Courts',\n\t'Cove',\n\t'Coves',\n\t'Creek',\n\t'Crescent',\n\t'Crest',\n\t'Crossing',\n\t'Crossroad',\n\t'Curve',\n\t'Dale',\n\t'Dam',\n\t'Divide',\n\t'Drive',\n\t'Drives',\n\t'Estate',\n\t'Estates',\n\t'Expressway',\n\t'Extension',\n\t'Extensions',\n\t'Fall',\n\t'Falls',\n\t'Ferry',\n\t'Field',\n\t'Fields',\n\t'Flat',\n\t'Flats',\n\t'Ford',\n\t'Fords',\n\t'Forest',\n\t'Forge',\n\t'Forges',\n\t'Fork',\n\t'Forks',\n\t'Fort',\n\t'Freeway',\n\t'Garden',\n\t'Gardens',\n\t'Gateway',\n\t'Glen',\n\t'Glens',\n\t'Green',\n\t'Greens',\n\t'Grove',\n\t'Groves',\n\t'Harbor',\n\t'Harbors',\n\t'Haven',\n\t'Heights',\n\t'Highway',\n\t'Hill',\n\t'Hills',\n\t'Hollow',\n\t'Inlet',\n\t'Island',\n\t'Islands',\n\t'Isle',\n\t'Junction',\n\t'Junctions',\n\t'Key',\n\t'Keys',\n\t'Knoll',\n\t'Knolls',\n\t'Lake',\n\t'Lakes',\n\t'Land',\n\t'Landing',\n\t'Lane',\n\t'Light',\n\t'Lights',\n\t'Loaf',\n\t'Lock',\n\t'Locks',\n\t'Lodge',\n\t'Loop',\n\t'Mall',\n\t'Manor',\n\t'Manors',\n\t'Meadow',\n\t'Meadows',\n\t'Mews',\n\t'Mill',\n\t'Mills',\n\t'Mission',\n\t'Motorway',\n\t'Mount',\n\t'Mountain',\n\t'Mountains',\n\t'Neck',\n\t'Orchard',\n\t'Oval',\n\t'Overpass',\n\t'Park',\n\t'Parks',\n\t'Parkway',\n\t'Parkways',\n\t'Pass',\n\t'Passage',\n\t'Path',\n\t'Pike',\n\t'Pine',\n\t'Pines',\n\t'Place',\n\t'Plain',\n\t'Plains',\n\t'Plaza',\n\t'Point',\n\t'Points',\n\t'Port',\n\t'Ports',\n\t'Prairie',\n\t'Radial',\n\t'Ramp',\n\t'Ranch',\n\t'Rapid',\n\t'Rapids',\n\t'Rest',\n\t'Ridge',\n\t'Ridges',\n\t'River',\n\t'Road',\n\t'Roads',\n\t'Route',\n\t'Row',\n\t'Rue',\n\t'Run',\n\t'Shoal',\n\t'Shoals',\n\t'Shore',\n\t'Shores',\n\t'Skyway',\n\t'Spring',\n\t'Springs',\n\t'Spur',\n\t'Spurs',\n\t'Square',\n\t'Squares',\n\t'Station',\n\t'Stravenue',\n\t'Stream',\n\t'Street',\n\t'Streets',\n\t'Summit',\n\t'Terrace',\n\t'Throughway',\n\t'Trace',\n\t'Track',\n\t'Trafficway',\n\t'Trail',\n\t'Tunnel',\n\t'Turnpike',\n\t'Underpass',\n\t'Union',\n\t'Unions',\n\t'Valley',\n\t'Valleys',\n\t'Via',\n\t'Viaduct',\n\t'View',\n\t'Views',\n\t'Village',\n\t'Villages',\n\t'Ville',\n\t'Vista',\n\t'Walk',\n\t'Walks',\n\t'Wall',\n\t'Way',\n\t'Ways',\n\t'Well',\n\t'Wells',\n];\n\nexport const maxStringLength = 10;\n"
  },
  {
    "path": "drizzle-seed/src/index.ts",
    "content": "/* eslint-disable drizzle-internal/require-entity-kind */\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\tgetTableName,\n\tis,\n\tOne,\n\tRelations,\n\tsql,\n} from 'drizzle-orm';\n\nimport type { MySqlColumn, MySqlSchema } from 'drizzle-orm/mysql-core';\nimport { getTableConfig as getMysqlTableConfig, MySqlDatabase, MySqlTable } from 'drizzle-orm/mysql-core';\n\nimport type { PgArray, PgColumn, PgSchema } from 'drizzle-orm/pg-core';\nimport { getTableConfig as getPgTableConfig, PgDatabase, PgTable } from 'drizzle-orm/pg-core';\n\nimport type { SQLiteColumn } from 'drizzle-orm/sqlite-core';\nimport { BaseSQLiteDatabase, getTableConfig as getSqliteTableConfig, SQLiteTable } from 'drizzle-orm/sqlite-core';\n\nimport { generatorsFuncs, generatorsFuncsV2 } from './services/GeneratorFuncs.ts';\nimport type { AbstractGenerator } from './services/Generators.ts';\nimport { SeedService } from './services/SeedService.ts';\nimport type { DrizzleStudioObjectType, DrizzleStudioRelationType } from './types/drizzleStudio.ts';\nimport type { RefinementsType } from './types/seedService.ts';\nimport type { Column, Relation, RelationWithReferences, Table } from './types/tables.ts';\n\ntype InferCallbackType<\n\tDB extends\n\t\t| PgDatabase<any, any>\n\t\t| MySqlDatabase<any, any>\n\t\t| BaseSQLiteDatabase<any, any>,\n\tSCHEMA extends {\n\t\t[key: string]: PgTable | PgSchema | MySqlTable | MySqlSchema | SQLiteTable | Relations;\n\t},\n> = DB extends PgDatabase<any, any> ? SCHEMA extends {\n\t\t[key: string]:\n\t\t\t| PgTable\n\t\t\t| PgSchema\n\t\t\t| MySqlTable\n\t\t\t| MySqlSchema\n\t\t\t| SQLiteTable\n\t\t\t| Relations;\n\t} ? {\n\t\t\t// iterates through schema fields. example -> schema: {\"tableName\": PgTable}\n\t\t\t[\n\t\t\t\ttable in keyof SCHEMA as SCHEMA[table] extends PgTable ? table\n\t\t\t\t\t: never\n\t\t\t]?: {\n\t\t\t\tcount?: number;\n\t\t\t\tcolumns?: {\n\t\t\t\t\t// iterates through table fields. example -> table: {\"columnName\": PgColumn}\n\t\t\t\t\t[\n\t\t\t\t\t\tcolumn in keyof SCHEMA[table] as SCHEMA[table][column] extends PgColumn ? column\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t]?: AbstractGenerator<any>;\n\t\t\t\t};\n\t\t\t\twith?: {\n\t\t\t\t\t[\n\t\t\t\t\t\trefTable in keyof SCHEMA as SCHEMA[refTable] extends PgTable ? refTable\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t]?:\n\t\t\t\t\t\t| number\n\t\t\t\t\t\t| { weight: number; count: number | number[] }[];\n\t\t\t\t};\n\t\t\t};\n\t\t}\n\t: {}\n\t: DB extends MySqlDatabase<any, any> ? SCHEMA extends {\n\t\t\t[key: string]:\n\t\t\t\t| PgTable\n\t\t\t\t| PgSchema\n\t\t\t\t| MySqlTable\n\t\t\t\t| MySqlSchema\n\t\t\t\t| SQLiteTable\n\t\t\t\t| Relations;\n\t\t} ? {\n\t\t\t\t// iterates through schema fields. example -> schema: {\"tableName\": MySqlTable}\n\t\t\t\t[\n\t\t\t\t\ttable in keyof SCHEMA as SCHEMA[table] extends MySqlTable ? table\n\t\t\t\t\t\t: never\n\t\t\t\t]?: {\n\t\t\t\t\tcount?: number;\n\t\t\t\t\tcolumns?: {\n\t\t\t\t\t\t// iterates through table fields. example -> table: {\"columnName\": MySqlColumn}\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tcolumn in keyof SCHEMA[table] as SCHEMA[table][column] extends MySqlColumn ? column\n\t\t\t\t\t\t\t\t: never\n\t\t\t\t\t\t]?: AbstractGenerator<any>;\n\t\t\t\t\t};\n\t\t\t\t\twith?: {\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\trefTable in keyof SCHEMA as SCHEMA[refTable] extends MySqlTable ? refTable\n\t\t\t\t\t\t\t\t: never\n\t\t\t\t\t\t]?:\n\t\t\t\t\t\t\t| number\n\t\t\t\t\t\t\t| { weight: number; count: number | number[] }[];\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t}\n\t\t: {}\n\t: DB extends BaseSQLiteDatabase<any, any> ? SCHEMA extends {\n\t\t\t[key: string]:\n\t\t\t\t| PgTable\n\t\t\t\t| PgSchema\n\t\t\t\t| MySqlTable\n\t\t\t\t| MySqlSchema\n\t\t\t\t| SQLiteTable\n\t\t\t\t| Relations;\n\t\t} ? {\n\t\t\t\t// iterates through schema fields. example -> schema: {\"tableName\": SQLiteTable}\n\t\t\t\t[\n\t\t\t\t\ttable in keyof SCHEMA as SCHEMA[table] extends SQLiteTable ? table\n\t\t\t\t\t\t: never\n\t\t\t\t]?: {\n\t\t\t\t\tcount?: number;\n\t\t\t\t\tcolumns?: {\n\t\t\t\t\t\t// iterates through table fields. example -> table: {\"columnName\": SQLiteColumn}\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tcolumn in keyof SCHEMA[table] as SCHEMA[table][column] extends SQLiteColumn ? column\n\t\t\t\t\t\t\t\t: never\n\t\t\t\t\t\t]?: AbstractGenerator<any>;\n\t\t\t\t\t};\n\t\t\t\t\twith?: {\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\trefTable in keyof SCHEMA as SCHEMA[refTable] extends SQLiteTable ? refTable\n\t\t\t\t\t\t\t\t: never\n\t\t\t\t\t\t]?:\n\t\t\t\t\t\t\t| number\n\t\t\t\t\t\t\t| { weight: number; count: number | number[] }[];\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t}\n\t\t: {}\n\t: {};\n\nclass SeedPromise<\n\tDB extends\n\t\t| PgDatabase<any, any>\n\t\t| MySqlDatabase<any, any>\n\t\t| BaseSQLiteDatabase<any, any>,\n\tSCHEMA extends {\n\t\t[key: string]: PgTable | PgSchema | MySqlTable | MySqlSchema | SQLiteTable | Relations;\n\t},\n\tVERSION extends string | undefined,\n> implements Promise<void> {\n\tstatic readonly entityKind: string = 'SeedPromise';\n\n\t[Symbol.toStringTag] = 'SeedPromise';\n\n\tconstructor(\n\t\tprivate db: DB,\n\t\tprivate schema: SCHEMA,\n\t\tprivate options?: { count?: number; seed?: number; version?: VERSION },\n\t) {}\n\n\tthen<TResult1 = void, TResult2 = never>(\n\t\tonfulfilled?:\n\t\t\t| ((value: void) => TResult1 | PromiseLike<TResult1>)\n\t\t\t| null\n\t\t\t| undefined,\n\t\tonrejected?:\n\t\t\t| ((reason: any) => TResult2 | PromiseLike<TResult2>)\n\t\t\t| null\n\t\t\t| undefined,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn seedFunc(this.db, this.schema, this.options).then(\n\t\t\tonfulfilled,\n\t\t\tonrejected,\n\t\t);\n\t}\n\n\tcatch<TResult = never>(\n\t\tonrejected?:\n\t\t\t| ((reason: any) => TResult | PromiseLike<TResult>)\n\t\t\t| null\n\t\t\t| undefined,\n\t): Promise<void | TResult> {\n\t\treturn this.then(undefined, onrejected);\n\t}\n\n\tfinally(onfinally?: (() => void) | null | undefined): Promise<void> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonfinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonfinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n\n\tasync refine(\n\t\tcallback: (\n\t\t\tfuncs: FunctionsVersioning<VERSION>,\n\t\t) => InferCallbackType<DB, SCHEMA>,\n\t): Promise<void> {\n\t\tconst refinements = this.options?.version === undefined || this.options.version === '2'\n\t\t\t? callback(generatorsFuncsV2 as FunctionsVersioning<VERSION>) as RefinementsType\n\t\t\t: callback(generatorsFuncs as FunctionsVersioning<VERSION>) as RefinementsType;\n\n\t\tawait seedFunc(this.db, this.schema, this.options, refinements);\n\t}\n}\n\ntype FunctionsVersioning<VERSION extends string | undefined> = VERSION extends `1` ? typeof generatorsFuncs\n\t: VERSION extends `2` ? typeof generatorsFuncsV2\n\t: typeof generatorsFuncsV2;\n\nexport function getGeneratorsFunctions() {\n\treturn generatorsFuncs;\n}\n\nexport async function seedForDrizzleStudio(\n\t{ sqlDialect, drizzleStudioObject, drizzleStudioRelations, schemasRefinements, options }: {\n\t\tsqlDialect: 'postgresql' | 'mysql' | 'sqlite';\n\t\tdrizzleStudioObject: DrizzleStudioObjectType;\n\t\tdrizzleStudioRelations: DrizzleStudioRelationType[];\n\t\tschemasRefinements?: { [schemaName: string]: RefinementsType };\n\t\toptions?: { count?: number; seed?: number };\n\t},\n) {\n\tconst generatedSchemas: {\n\t\t[schemaName: string]: {\n\t\t\ttables: {\n\t\t\t\ttableName: string;\n\t\t\t\trows: {\n\t\t\t\t\t[columnName: string]: string | number | boolean | undefined;\n\t\t\t\t}[];\n\t\t\t}[];\n\t\t};\n\t} = {};\n\n\tlet tables: Table[], relations: Relation[], refinements: RefinementsType | undefined;\n\tdrizzleStudioRelations = drizzleStudioRelations.filter((rel) => rel.type === 'one');\n\tfor (const [schemaName, { tables: drizzleStudioTables }] of Object.entries(drizzleStudioObject)) {\n\t\ttables = [];\n\t\tfor (const [tableName, table] of Object.entries(drizzleStudioTables)) {\n\t\t\tconst drizzleStudioColumns = Object.values(table.columns);\n\t\t\tconst columns = drizzleStudioColumns.map((col) => ({\n\t\t\t\tname: col.name,\n\t\t\t\tdataType: 'string',\n\t\t\t\tcolumnType: col.type,\n\t\t\t\t// TODO: revise later\n\t\t\t\ttypeParams: {},\n\t\t\t\tdefault: col.default,\n\t\t\t\thasDefault: col.default === undefined ? false : true,\n\t\t\t\tisUnique: col.isUnique === undefined ? false : col.isUnique,\n\t\t\t\tnotNull: col.notNull,\n\t\t\t\tprimary: col.primaryKey,\n\t\t\t}));\n\t\t\ttables.push(\n\t\t\t\t{\n\t\t\t\t\tname: tableName,\n\t\t\t\t\tcolumns,\n\t\t\t\t\tprimaryKeys: drizzleStudioColumns.filter((col) => col.primaryKey === true).map((col) => col.name),\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\trelations = drizzleStudioRelations.filter((rel) => rel.schema === schemaName && rel.refSchema === schemaName);\n\t\tconst isCyclicRelations = relations.map(\n\t\t\t(reli) => {\n\t\t\t\tif (relations.some((relj) => reli.table === relj.refTable && reli.refTable === relj.table)) {\n\t\t\t\t\treturn { ...reli, isCyclic: true };\n\t\t\t\t}\n\t\t\t\treturn { ...reli, isCyclic: false };\n\t\t\t},\n\t\t);\n\n\t\trefinements = schemasRefinements !== undefined && schemasRefinements[schemaName] !== undefined\n\t\t\t? schemasRefinements[schemaName]\n\t\t\t: undefined;\n\n\t\tconst seedService = new SeedService();\n\n\t\tconst generatedTablesGenerators = seedService.generatePossibleGenerators(\n\t\t\tsqlDialect,\n\t\t\ttables,\n\t\t\tisCyclicRelations,\n\t\t\trefinements,\n\t\t\toptions,\n\t\t);\n\n\t\tconst generatedTables = await seedService.generateTablesValues(\n\t\t\tisCyclicRelations,\n\t\t\tgeneratedTablesGenerators,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\t{ ...options, preserveData: true, insertDataInDb: false },\n\t\t);\n\n\t\tgeneratedSchemas[schemaName] = { tables: generatedTables };\n\t}\n\n\treturn generatedSchemas;\n}\n\n/**\n * @param db - database you would like to seed.\n * @param schema - object that contains all your database tables you would like to seed.\n * @param options - object that contains properties `count` and `seed`:\n *\n *  `count` - number of rows you want to generate.\n *\n *  `seed` - a number that controls the state of generated data. (if the `seed` number is the same and nothing is changed in the seeding script, generated data will remain the same each time you seed database)\n *\n * @returns SeedPromise - a class object that has a refine method that is used to change generators for columns.\n *\n * @example\n * ```ts\n * // base seeding\n * await seed(db, schema);\n *\n * // seeding with count specified\n * await seed(db, schema, { count: 100000 });\n *\n * // seeding with count and seed specified\n * await seed(db, schema, { count: 100000, seed: 1 });\n *\n * //seeding using refine\n * await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n *   users: {\n *     columns: {\n *       name: funcs.firstName({ isUnique: true }),\n *       email: funcs.email(),\n *       phone: funcs.phoneNumber({ template: \"+380 99 ###-##-##\" }),\n *       password: funcs.string({ isUnique: true }),\n *     },\n *     count: 100000,\n *   },\n *   posts: {\n *     columns: {\n *       title: funcs.valuesFromArray({\n *         values: [\"Title1\", \"Title2\", \"Title3\", \"Title4\", \"Title5\"],\n *       }),\n *       content: funcs.loremIpsum({ sentencesCount: 3 }),\n *     },\n *   },\n * }));\n *\n * ```\n */\nexport function seed<\n\tDB extends\n\t\t| PgDatabase<any, any>\n\t\t| MySqlDatabase<any, any, any, any>\n\t\t| BaseSQLiteDatabase<any, any>,\n\tSCHEMA extends {\n\t\t[key: string]:\n\t\t\t| PgTable\n\t\t\t| PgSchema\n\t\t\t| MySqlTable\n\t\t\t| MySqlSchema\n\t\t\t| SQLiteTable\n\t\t\t| Relations\n\t\t\t| any;\n\t},\n\tVERSION extends '2' | '1' | undefined,\n>(db: DB, schema: SCHEMA, options?: { count?: number; seed?: number; version?: VERSION }) {\n\treturn new SeedPromise<typeof db, typeof schema, VERSION>(db, schema, options);\n}\n\nconst seedFunc = async (\n\tdb: PgDatabase<any, any> | MySqlDatabase<any, any> | BaseSQLiteDatabase<any, any>,\n\tschema: {\n\t\t[key: string]:\n\t\t\t| PgTable\n\t\t\t| PgSchema\n\t\t\t| MySqlTable\n\t\t\t| MySqlSchema\n\t\t\t| SQLiteTable\n\t\t\t| Relations\n\t\t\t| any;\n\t},\n\toptions: { count?: number; seed?: number; version?: string } = {},\n\trefinements?: RefinementsType,\n) => {\n\tlet version: number | undefined;\n\tif (options?.version !== undefined) {\n\t\tversion = Number(options?.version);\n\t}\n\n\tif (is(db, PgDatabase<any, any>)) {\n\t\tawait seedPostgres(db, schema, { ...options, version }, refinements);\n\t} else if (is(db, MySqlDatabase<any, any>)) {\n\t\tawait seedMySql(db, schema, { ...options, version }, refinements);\n\t} else if (is(db, BaseSQLiteDatabase<any, any>)) {\n\t\tawait seedSqlite(db, schema, { ...options, version }, refinements);\n\t} else {\n\t\tthrow new Error(\n\t\t\t'The drizzle-seed package currently supports only PostgreSQL, MySQL, and SQLite databases. Please ensure your database is one of these supported types',\n\t\t);\n\t}\n\n\treturn;\n};\n\n/**\n * deletes all data from specified tables\n *\n * @param db - database you would like to reset.\n * @param schema - object that contains all your database tables you would like to delete data from.\n *\n * `If db is a PgDatabase object`, we will execute sql query and delete data from your tables the following way:\n * ```sql\n * truncate tableName1, tableName2, ... cascade;\n * ```\n *\n * `If db is a MySqlDatabase object`, we will execute sql queries and delete data from your tables the following way:\n * ```sql\n * SET FOREIGN_KEY_CHECKS = 0;\n * truncate tableName1;\n * truncate tableName2;\n * .\n * .\n * .\n *\n * SET FOREIGN_KEY_CHECKS = 1;\n * ```\n *\n * `If db is a BaseSQLiteDatabase object`, we will execute sql queries and delete data from your tables the following way:\n * ```sql\n * PRAGMA foreign_keys = OFF;\n * delete from tableName1;\n * delete from tableName2;\n * .\n * .\n * .\n *\n * PRAGMA foreign_keys = ON;\n * ```\n *\n * @example\n * ```ts\n * await reset(db, schema);\n * ```\n */\nexport async function reset<\n\tDB extends\n\t\t| PgDatabase<any, any>\n\t\t| MySqlDatabase<any, any, any, any>\n\t\t| BaseSQLiteDatabase<any, any>,\n\tSCHEMA extends {\n\t\t[key: string]:\n\t\t\t| PgTable\n\t\t\t| PgSchema\n\t\t\t| MySqlTable\n\t\t\t| MySqlSchema\n\t\t\t| SQLiteTable\n\t\t\t| any;\n\t},\n>(db: DB, schema: SCHEMA) {\n\tif (is(db, PgDatabase<any, any>)) {\n\t\tconst { pgTables } = filterPgSchema(schema);\n\n\t\tif (Object.entries(pgTables).length > 0) {\n\t\t\tawait resetPostgres(db, pgTables);\n\t\t}\n\t} else if (is(db, MySqlDatabase<any, any>)) {\n\t\tconst { mysqlTables } = filterMysqlTables(schema);\n\n\t\tif (Object.entries(mysqlTables).length > 0) {\n\t\t\tawait resetMySql(db, mysqlTables);\n\t\t}\n\t} else if (is(db, BaseSQLiteDatabase<any, any>)) {\n\t\tconst { sqliteTables } = filterSqliteTables(schema);\n\n\t\tif (Object.entries(sqliteTables).length > 0) {\n\t\t\tawait resetSqlite(db, sqliteTables);\n\t\t}\n\t} else {\n\t\tthrow new Error(\n\t\t\t'The drizzle-seed package currently supports only PostgreSQL, MySQL, and SQLite databases. Please ensure your database is one of these supported types',\n\t\t);\n\t}\n}\n\n// Postgres-----------------------------------------------------------------------------------------------------------\nconst resetPostgres = async (\n\tdb: PgDatabase<any, any>,\n\tpgTables: { [key: string]: PgTable },\n) => {\n\tconst tablesToTruncate = Object.entries(pgTables).map(([_, table]) => {\n\t\tconst config = getPgTableConfig(table);\n\t\tconfig.schema = config.schema === undefined ? 'public' : config.schema;\n\n\t\treturn `\"${config.schema}\".\"${config.name}\"`;\n\t});\n\n\tawait db.execute(sql.raw(`truncate ${tablesToTruncate.join(',')} cascade;`));\n};\n\nconst filterPgSchema = (schema: {\n\t[key: string]:\n\t\t| PgTable\n\t\t| PgSchema\n\t\t| MySqlTable\n\t\t| MySqlSchema\n\t\t| SQLiteTable\n\t\t| Relations\n\t\t| any;\n}) => {\n\tconst pgSchema = Object.fromEntries(\n\t\tObject.entries(schema).filter((keyValue): keyValue is [string, PgTable | Relations] =>\n\t\t\tis(keyValue[1], PgTable) || is(keyValue[1], Relations)\n\t\t),\n\t);\n\n\tconst pgTables = Object.fromEntries(\n\t\tObject.entries(schema).filter((keyValue): keyValue is [string, PgTable] => is(keyValue[1], PgTable)),\n\t);\n\n\treturn { pgSchema, pgTables };\n};\n\nconst seedPostgres = async (\n\tdb: PgDatabase<any, any>,\n\tschema: {\n\t\t[key: string]:\n\t\t\t| PgTable\n\t\t\t| PgSchema\n\t\t\t| MySqlTable\n\t\t\t| MySqlSchema\n\t\t\t| SQLiteTable\n\t\t\t| Relations\n\t\t\t| any;\n\t},\n\toptions: { count?: number; seed?: number; version?: number } = {},\n\trefinements?: RefinementsType,\n) => {\n\tconst seedService = new SeedService();\n\n\tconst { pgSchema, pgTables } = filterPgSchema(schema);\n\n\tconst { tables, relations } = getPostgresInfo(pgSchema, pgTables);\n\tconst generatedTablesGenerators = seedService.generatePossibleGenerators(\n\t\t'postgresql',\n\t\ttables,\n\t\trelations,\n\t\trefinements,\n\t\toptions,\n\t);\n\n\tconst preserveCyclicTablesData = relations.some((rel) => rel.isCyclic === true);\n\n\tconst tablesValues = await seedService.generateTablesValues(\n\t\trelations,\n\t\tgeneratedTablesGenerators,\n\t\tdb,\n\t\tpgTables,\n\t\t{ ...options, preserveCyclicTablesData },\n\t);\n\n\tconst { filteredTablesGenerators, tablesUniqueNotNullColumn } = seedService.filterCyclicTables(\n\t\tgeneratedTablesGenerators,\n\t);\n\tconst updateDataInDb = filteredTablesGenerators.length === 0 ? false : true;\n\n\tawait seedService.generateTablesValues(\n\t\trelations,\n\t\tfilteredTablesGenerators,\n\t\tdb,\n\t\tpgTables,\n\t\t{ ...options, tablesValues, updateDataInDb, tablesUniqueNotNullColumn },\n\t);\n};\n\nconst getPostgresInfo = (\n\tpgSchema: { [key: string]: PgTable | Relations },\n\tpgTables: { [key: string]: PgTable },\n) => {\n\tlet tableConfig: ReturnType<typeof getPgTableConfig>;\n\tlet dbToTsColumnNamesMap: { [key: string]: string };\n\tconst dbToTsTableNamesMap: { [key: string]: string } = Object.fromEntries(\n\t\tObject.entries(pgTables).map(([key, value]) => [getTableName(value), key]),\n\t);\n\n\tconst tables: Table[] = [];\n\tconst relations: RelationWithReferences[] = [];\n\tconst dbToTsColumnNamesMapGlobal: {\n\t\t[tableName: string]: { [dbColumnName: string]: string };\n\t} = {};\n\tconst tableRelations: { [tableName: string]: RelationWithReferences[] } = {};\n\n\tconst getDbToTsColumnNamesMap = (table: PgTable) => {\n\t\tlet dbToTsColumnNamesMap: { [dbColName: string]: string } = {};\n\n\t\tconst tableName = getTableName(table);\n\t\tif (Object.hasOwn(dbToTsColumnNamesMapGlobal, tableName)) {\n\t\t\tdbToTsColumnNamesMap = dbToTsColumnNamesMapGlobal[tableName]!;\n\t\t\treturn dbToTsColumnNamesMap;\n\t\t}\n\n\t\tconst tableConfig = getPgTableConfig(table);\n\t\tfor (const [tsCol, col] of Object.entries(tableConfig.columns[0]!.table)) {\n\t\t\tdbToTsColumnNamesMap[col.name] = tsCol;\n\t\t}\n\t\tdbToTsColumnNamesMapGlobal[tableName] = dbToTsColumnNamesMap;\n\n\t\treturn dbToTsColumnNamesMap;\n\t};\n\n\tconst transformFromDrizzleRelation = (\n\t\tschema: Record<string, PgTable | Relations>,\n\t\tgetDbToTsColumnNamesMap: (table: PgTable) => {\n\t\t\t[dbColName: string]: string;\n\t\t},\n\t\ttableRelations: {\n\t\t\t[tableName: string]: RelationWithReferences[];\n\t\t},\n\t) => {\n\t\tconst schemaConfig = extractTablesRelationalConfig(schema, createTableRelationsHelpers);\n\t\tconst relations: RelationWithReferences[] = [];\n\t\tfor (const table of Object.values(schemaConfig.tables)) {\n\t\t\tif (table.relations === undefined) continue;\n\n\t\t\tfor (const drizzleRel of Object.values(table.relations)) {\n\t\t\t\tif (!is(drizzleRel, One)) continue;\n\n\t\t\t\tconst tableConfig = getPgTableConfig(drizzleRel.sourceTable as PgTable);\n\t\t\t\tconst tableDbSchema = tableConfig.schema ?? 'public';\n\t\t\t\tconst tableDbName = tableConfig.name;\n\t\t\t\tconst tableTsName = schemaConfig.tableNamesMap[`${tableDbSchema}.${tableDbName}`] ?? tableDbName;\n\n\t\t\t\tconst dbToTsColumnNamesMap = getDbToTsColumnNamesMap(drizzleRel.sourceTable);\n\t\t\t\tconst columns = drizzleRel.config?.fields.map((field) => dbToTsColumnNamesMap[field.name] as string)\n\t\t\t\t\t?? [];\n\n\t\t\t\tconst refTableConfig = getPgTableConfig(drizzleRel.referencedTable as PgTable);\n\t\t\t\tconst refTableDbSchema = refTableConfig.schema ?? 'public';\n\t\t\t\tconst refTableDbName = refTableConfig.name;\n\t\t\t\tconst refTableTsName = schemaConfig.tableNamesMap[`${refTableDbSchema}.${refTableDbName}`]\n\t\t\t\t\t?? refTableDbName;\n\n\t\t\t\tconst dbToTsColumnNamesMapForRefTable = getDbToTsColumnNamesMap(drizzleRel.referencedTable);\n\t\t\t\tconst refColumns = drizzleRel.config?.references.map((ref) =>\n\t\t\t\t\tdbToTsColumnNamesMapForRefTable[ref.name] as string\n\t\t\t\t)\n\t\t\t\t\t?? [];\n\n\t\t\t\tif (tableRelations[refTableTsName] === undefined) {\n\t\t\t\t\ttableRelations[refTableTsName] = [];\n\t\t\t\t}\n\n\t\t\t\tconst relation: RelationWithReferences = {\n\t\t\t\t\ttable: tableTsName,\n\t\t\t\t\tcolumns,\n\t\t\t\t\trefTable: refTableTsName,\n\t\t\t\t\trefColumns,\n\t\t\t\t\trefTableRels: tableRelations[refTableTsName],\n\t\t\t\t\ttype: 'one',\n\t\t\t\t};\n\n\t\t\t\t// do not add duplicate relation\n\t\t\t\tif (\n\t\t\t\t\ttableRelations[tableTsName]?.some((rel) =>\n\t\t\t\t\t\trel.table === relation.table\n\t\t\t\t\t\t&& rel.refTable === relation.refTable\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`You are providing a one-to-many relation between the '${relation.refTable}' and '${relation.table}' tables,\\n`\n\t\t\t\t\t\t\t+ `while the '${relation.table}' table object already has foreign key constraint in the schema referencing '${relation.refTable}' table.\\n`\n\t\t\t\t\t\t\t+ `In this case, the foreign key constraint will be used.\\n`,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\trelations.push(relation);\n\t\t\t\ttableRelations[tableTsName]!.push(relation);\n\t\t\t}\n\t\t}\n\t\treturn relations;\n\t};\n\n\tfor (const table of Object.values(pgTables)) {\n\t\ttableConfig = getPgTableConfig(table);\n\n\t\tdbToTsColumnNamesMap = {};\n\t\tfor (const [tsCol, col] of Object.entries(tableConfig.columns[0]!.table)) {\n\t\t\tdbToTsColumnNamesMap[col.name] = tsCol;\n\t\t}\n\n\t\t// might be empty list\n\t\tconst newRelations = tableConfig.foreignKeys.map((fk) => {\n\t\t\tconst table = dbToTsTableNamesMap[tableConfig.name] as string;\n\t\t\tconst refTable = dbToTsTableNamesMap[getTableName(fk.reference().foreignTable)] as string;\n\n\t\t\tconst dbToTsColumnNamesMapForRefTable = getDbToTsColumnNamesMap(\n\t\t\t\tfk.reference().foreignTable,\n\t\t\t);\n\n\t\t\tif (tableRelations[refTable] === undefined) {\n\t\t\t\ttableRelations[refTable] = [];\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttable,\n\t\t\t\tcolumns: fk\n\t\t\t\t\t.reference()\n\t\t\t\t\t.columns.map((col) => dbToTsColumnNamesMap[col.name] as string),\n\t\t\t\trefTable,\n\t\t\t\trefColumns: fk\n\t\t\t\t\t.reference()\n\t\t\t\t\t.foreignColumns.map(\n\t\t\t\t\t\t(fCol) => dbToTsColumnNamesMapForRefTable[fCol.name] as string,\n\t\t\t\t\t),\n\t\t\t\trefTableRels: tableRelations[refTable],\n\t\t\t};\n\t\t});\n\n\t\trelations.push(\n\t\t\t...newRelations,\n\t\t);\n\n\t\tif (tableRelations[dbToTsTableNamesMap[tableConfig.name] as string] === undefined) {\n\t\t\ttableRelations[dbToTsTableNamesMap[tableConfig.name] as string] = [];\n\t\t}\n\t\ttableRelations[dbToTsTableNamesMap[tableConfig.name] as string]!.push(...newRelations);\n\n\t\tconst getAllBaseColumns = (\n\t\t\tbaseColumn: PgArray<any, any>['baseColumn'] & { baseColumn?: PgArray<any, any>['baseColumn'] },\n\t\t): Column['baseColumn'] => {\n\t\t\tconst baseColumnResult: Column['baseColumn'] = {\n\t\t\t\tname: baseColumn.name,\n\t\t\t\tcolumnType: baseColumn.getSQLType(),\n\t\t\t\ttypeParams: getTypeParams(baseColumn.getSQLType()),\n\t\t\t\tdataType: baseColumn.dataType,\n\t\t\t\tsize: (baseColumn as PgArray<any, any>).size,\n\t\t\t\thasDefault: baseColumn.hasDefault,\n\t\t\t\tenumValues: baseColumn.enumValues,\n\t\t\t\tdefault: baseColumn.default,\n\t\t\t\tisUnique: baseColumn.isUnique,\n\t\t\t\tnotNull: baseColumn.notNull,\n\t\t\t\tprimary: baseColumn.primary,\n\t\t\t\tbaseColumn: baseColumn.baseColumn === undefined ? undefined : getAllBaseColumns(baseColumn.baseColumn),\n\t\t\t};\n\n\t\t\treturn baseColumnResult;\n\t\t};\n\n\t\tconst getTypeParams = (sqlType: string) => {\n\t\t\t// get type params\n\t\t\tconst typeParams: Column['typeParams'] = {};\n\n\t\t\t// handle dimensions\n\t\t\tif (sqlType.includes('[')) {\n\t\t\t\tconst match = sqlType.match(/\\[\\w*]/g);\n\t\t\t\tif (match) {\n\t\t\t\t\ttypeParams['dimensions'] = match.length;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tsqlType.startsWith('numeric')\n\t\t\t\t|| sqlType.startsWith('decimal')\n\t\t\t\t|| sqlType.startsWith('double precision')\n\t\t\t\t|| sqlType.startsWith('real')\n\t\t\t) {\n\t\t\t\tconst match = sqlType.match(/\\((\\d+), *(\\d+)\\)/);\n\t\t\t\tif (match) {\n\t\t\t\t\ttypeParams['precision'] = Number(match[1]);\n\t\t\t\t\ttypeParams['scale'] = Number(match[2]);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tsqlType.startsWith('varchar')\n\t\t\t\t|| sqlType.startsWith('bpchar')\n\t\t\t\t|| sqlType.startsWith('char')\n\t\t\t\t|| sqlType.startsWith('bit')\n\t\t\t\t|| sqlType.startsWith('time')\n\t\t\t\t|| sqlType.startsWith('timestamp')\n\t\t\t\t|| sqlType.startsWith('interval')\n\t\t\t) {\n\t\t\t\tconst match = sqlType.match(/\\((\\d+)\\)/);\n\t\t\t\tif (match) {\n\t\t\t\t\ttypeParams['length'] = Number(match[1]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn typeParams;\n\t\t};\n\n\t\t// console.log(tableConfig.columns);\n\t\ttables.push({\n\t\t\tname: dbToTsTableNamesMap[tableConfig.name] as string,\n\t\t\tcolumns: tableConfig.columns.map((column) => ({\n\t\t\t\tname: dbToTsColumnNamesMap[column.name] as string,\n\t\t\t\tcolumnType: column.getSQLType(),\n\t\t\t\ttypeParams: getTypeParams(column.getSQLType()),\n\t\t\t\tdataType: column.dataType,\n\t\t\t\tsize: (column as PgArray<any, any>).size,\n\t\t\t\thasDefault: column.hasDefault,\n\t\t\t\tdefault: column.default,\n\t\t\t\tenumValues: column.enumValues,\n\t\t\t\tisUnique: column.isUnique,\n\t\t\t\tnotNull: column.notNull,\n\t\t\t\tprimary: column.primary,\n\t\t\t\tgeneratedIdentityType: column.generatedIdentity?.type,\n\t\t\t\tbaseColumn: ((column as PgArray<any, any>).baseColumn === undefined)\n\t\t\t\t\t? undefined\n\t\t\t\t\t: getAllBaseColumns((column as PgArray<any, any>).baseColumn),\n\t\t\t})),\n\t\t\tprimaryKeys: tableConfig.columns\n\t\t\t\t.filter((column) => column.primary)\n\t\t\t\t.map((column) => dbToTsColumnNamesMap[column.name] as string),\n\t\t});\n\t}\n\n\tconst transformedDrizzleRelations = transformFromDrizzleRelation(pgSchema, getDbToTsColumnNamesMap, tableRelations);\n\trelations.push(\n\t\t...transformedDrizzleRelations,\n\t);\n\n\tconst isCyclicRelations = relations.map(\n\t\t(relI) => {\n\t\t\t// if (relations.some((relj) => relI.table === relj.refTable && relI.refTable === relj.table)) {\n\t\t\tconst tableRel = tableRelations[relI.table]!.find((relJ) => relJ.refTable === relI.refTable)!;\n\t\t\tif (isRelationCyclic(relI)) {\n\t\t\t\ttableRel['isCyclic'] = true;\n\t\t\t\treturn { ...relI, isCyclic: true };\n\t\t\t}\n\t\t\ttableRel['isCyclic'] = false;\n\t\t\treturn { ...relI, isCyclic: false };\n\t\t},\n\t);\n\n\treturn { tables, relations: isCyclicRelations, tableRelations };\n};\n\nconst isRelationCyclic = (\n\tstartRel: RelationWithReferences,\n) => {\n\t// self relation\n\tif (startRel.table === startRel.refTable) return false;\n\n\t// DFS\n\tconst targetTable = startRel.table;\n\tconst queue = [startRel];\n\tlet path: string[] = [];\n\twhile (queue.length !== 0) {\n\t\tconst currRel = queue.shift();\n\n\t\tif (path.includes(currRel!.table)) {\n\t\t\tconst idx = path.indexOf(currRel!.table);\n\t\t\tpath = path.slice(0, idx);\n\t\t}\n\t\tpath.push(currRel!.table);\n\n\t\tfor (const rel of currRel!.refTableRels) {\n\t\t\t// self relation\n\t\t\tif (rel.table === rel.refTable) continue;\n\n\t\t\tif (rel.refTable === targetTable) return true;\n\n\t\t\t// found cycle, but not the one we are looking for\n\t\t\tif (path.includes(rel.refTable)) continue;\n\t\t\tqueue.unshift(rel);\n\t\t}\n\t}\n\n\treturn false;\n};\n\n// MySql-----------------------------------------------------------------------------------------------------\nconst resetMySql = async (\n\tdb: MySqlDatabase<any, any>,\n\tschema: { [key: string]: MySqlTable },\n) => {\n\tconst tablesToTruncate = Object.entries(schema).map(([_tsTableName, table]) => {\n\t\tconst dbTableName = getTableName(table);\n\t\treturn dbTableName;\n\t});\n\n\tawait db.execute(sql.raw('SET FOREIGN_KEY_CHECKS = 0;'));\n\n\tfor (const tableName of tablesToTruncate) {\n\t\tconst sqlQuery = `truncate \\`${tableName}\\`;`;\n\t\tawait db.execute(sql.raw(sqlQuery));\n\t}\n\n\tawait db.execute(sql.raw('SET FOREIGN_KEY_CHECKS = 1;'));\n};\n\nconst filterMysqlTables = (schema: {\n\t[key: string]:\n\t\t| PgTable\n\t\t| PgSchema\n\t\t| MySqlTable\n\t\t| MySqlSchema\n\t\t| SQLiteTable\n\t\t| any;\n}) => {\n\tconst mysqlSchema = Object.fromEntries(\n\t\tObject.entries(schema).filter(\n\t\t\t(keyValue): keyValue is [string, MySqlTable | Relations] =>\n\t\t\t\tis(keyValue[1], MySqlTable) || is(keyValue[1], Relations),\n\t\t),\n\t);\n\n\tconst mysqlTables = Object.fromEntries(\n\t\tObject.entries(schema).filter(\n\t\t\t(keyValue): keyValue is [string, MySqlTable] => is(keyValue[1], MySqlTable),\n\t\t),\n\t);\n\n\treturn { mysqlSchema, mysqlTables };\n};\n\nconst seedMySql = async (\n\tdb: MySqlDatabase<any, any>,\n\tschema: {\n\t\t[key: string]:\n\t\t\t| PgTable\n\t\t\t| PgSchema\n\t\t\t| MySqlTable\n\t\t\t| MySqlSchema\n\t\t\t| SQLiteTable\n\t\t\t| Relations\n\t\t\t| any;\n\t},\n\toptions: { count?: number; seed?: number; version?: number } = {},\n\trefinements?: RefinementsType,\n) => {\n\tconst { mysqlSchema, mysqlTables } = filterMysqlTables(schema);\n\tconst { tables, relations } = getMySqlInfo(mysqlSchema, mysqlTables);\n\n\tconst seedService = new SeedService();\n\n\tconst generatedTablesGenerators = seedService.generatePossibleGenerators(\n\t\t'mysql',\n\t\ttables,\n\t\trelations,\n\t\trefinements,\n\t\toptions,\n\t);\n\n\tconst preserveCyclicTablesData = relations.some((rel) => rel.isCyclic === true);\n\n\tconst tablesValues = await seedService.generateTablesValues(\n\t\trelations,\n\t\tgeneratedTablesGenerators,\n\t\tdb,\n\t\tmysqlTables,\n\t\t{ ...options, preserveCyclicTablesData },\n\t);\n\n\tconst { filteredTablesGenerators, tablesUniqueNotNullColumn } = seedService.filterCyclicTables(\n\t\tgeneratedTablesGenerators,\n\t);\n\tconst updateDataInDb = filteredTablesGenerators.length === 0 ? false : true;\n\n\tawait seedService.generateTablesValues(\n\t\trelations,\n\t\tfilteredTablesGenerators,\n\t\tdb,\n\t\tmysqlTables,\n\t\t{ ...options, tablesValues, updateDataInDb, tablesUniqueNotNullColumn },\n\t);\n};\n\nconst getMySqlInfo = (\n\tmysqlSchema: { [key: string]: MySqlTable | Relations },\n\tmysqlTables: { [key: string]: MySqlTable },\n) => {\n\tlet tableConfig: ReturnType<typeof getMysqlTableConfig>;\n\tlet dbToTsColumnNamesMap: { [key: string]: string };\n\n\tconst dbToTsTableNamesMap: { [key: string]: string } = Object.fromEntries(\n\t\tObject.entries(mysqlTables).map(([key, value]) => [getTableName(value), key]),\n\t);\n\n\tconst tables: Table[] = [];\n\tconst relations: RelationWithReferences[] = [];\n\tconst dbToTsColumnNamesMapGlobal: {\n\t\t[tableName: string]: { [dbColumnName: string]: string };\n\t} = {};\n\tconst tableRelations: { [tableName: string]: RelationWithReferences[] } = {};\n\n\tconst getDbToTsColumnNamesMap = (table: MySqlTable) => {\n\t\tlet dbToTsColumnNamesMap: { [dbColName: string]: string } = {};\n\n\t\tconst tableName = getTableName(table);\n\t\tif (Object.hasOwn(dbToTsColumnNamesMapGlobal, tableName)) {\n\t\t\tdbToTsColumnNamesMap = dbToTsColumnNamesMapGlobal[tableName]!;\n\t\t\treturn dbToTsColumnNamesMap;\n\t\t}\n\n\t\tconst tableConfig = getMysqlTableConfig(table);\n\t\tfor (const [tsCol, col] of Object.entries(tableConfig.columns[0]!.table)) {\n\t\t\tdbToTsColumnNamesMap[col.name] = tsCol;\n\t\t}\n\t\tdbToTsColumnNamesMapGlobal[tableName] = dbToTsColumnNamesMap;\n\n\t\treturn dbToTsColumnNamesMap;\n\t};\n\n\tconst transformFromDrizzleRelation = (\n\t\tschema: Record<string, MySqlTable | Relations>,\n\t\tgetDbToTsColumnNamesMap: (table: MySqlTable) => {\n\t\t\t[dbColName: string]: string;\n\t\t},\n\t\ttableRelations: {\n\t\t\t[tableName: string]: RelationWithReferences[];\n\t\t},\n\t) => {\n\t\tconst schemaConfig = extractTablesRelationalConfig(schema, createTableRelationsHelpers);\n\t\tconst relations: RelationWithReferences[] = [];\n\t\tfor (const table of Object.values(schemaConfig.tables)) {\n\t\t\tif (table.relations === undefined) continue;\n\n\t\t\tfor (const drizzleRel of Object.values(table.relations)) {\n\t\t\t\tif (!is(drizzleRel, One)) continue;\n\n\t\t\t\tconst tableConfig = getMysqlTableConfig(drizzleRel.sourceTable as MySqlTable);\n\t\t\t\tconst tableDbSchema = tableConfig.schema ?? 'public';\n\t\t\t\tconst tableDbName = tableConfig.name;\n\t\t\t\tconst tableTsName = schemaConfig.tableNamesMap[`${tableDbSchema}.${tableDbName}`] ?? tableDbName;\n\n\t\t\t\tconst dbToTsColumnNamesMap = getDbToTsColumnNamesMap(drizzleRel.sourceTable as MySqlTable);\n\t\t\t\tconst columns = drizzleRel.config?.fields.map((field) => dbToTsColumnNamesMap[field.name] as string)\n\t\t\t\t\t?? [];\n\n\t\t\t\tconst refTableConfig = getMysqlTableConfig(drizzleRel.referencedTable as MySqlTable);\n\t\t\t\tconst refTableDbSchema = refTableConfig.schema ?? 'public';\n\t\t\t\tconst refTableDbName = refTableConfig.name;\n\t\t\t\tconst refTableTsName = schemaConfig.tableNamesMap[`${refTableDbSchema}.${refTableDbName}`]\n\t\t\t\t\t?? refTableDbName;\n\n\t\t\t\tconst dbToTsColumnNamesMapForRefTable = getDbToTsColumnNamesMap(drizzleRel.referencedTable as MySqlTable);\n\t\t\t\tconst refColumns = drizzleRel.config?.references.map((ref) =>\n\t\t\t\t\tdbToTsColumnNamesMapForRefTable[ref.name] as string\n\t\t\t\t)\n\t\t\t\t\t?? [];\n\n\t\t\t\tif (tableRelations[refTableTsName] === undefined) {\n\t\t\t\t\ttableRelations[refTableTsName] = [];\n\t\t\t\t}\n\n\t\t\t\tconst relation: RelationWithReferences = {\n\t\t\t\t\ttable: tableTsName,\n\t\t\t\t\tcolumns,\n\t\t\t\t\trefTable: refTableTsName,\n\t\t\t\t\trefColumns,\n\t\t\t\t\trefTableRels: tableRelations[refTableTsName],\n\t\t\t\t\ttype: 'one',\n\t\t\t\t};\n\n\t\t\t\t// do not add duplicate relation\n\t\t\t\tif (\n\t\t\t\t\ttableRelations[tableTsName]?.some((rel) =>\n\t\t\t\t\t\trel.table === relation.table\n\t\t\t\t\t\t&& rel.refTable === relation.refTable\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`You are providing a one-to-many relation between the '${relation.refTable}' and '${relation.table}' tables,\\n`\n\t\t\t\t\t\t\t+ `while the '${relation.table}' table object already has foreign key constraint in the schema referencing '${relation.refTable}' table.\\n`\n\t\t\t\t\t\t\t+ `In this case, the foreign key constraint will be used.\\n`,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\trelations.push(relation);\n\t\t\t\ttableRelations[tableTsName]!.push(relation);\n\t\t\t}\n\t\t}\n\t\treturn relations;\n\t};\n\n\tfor (const table of Object.values(mysqlTables)) {\n\t\ttableConfig = getMysqlTableConfig(table);\n\n\t\tdbToTsColumnNamesMap = {};\n\t\tfor (const [tsCol, col] of Object.entries(tableConfig.columns[0]!.table)) {\n\t\t\tdbToTsColumnNamesMap[col.name] = tsCol;\n\t\t}\n\n\t\tconst newRelations = tableConfig.foreignKeys.map((fk) => {\n\t\t\tconst table = dbToTsTableNamesMap[tableConfig.name] as string;\n\t\t\tconst refTable = dbToTsTableNamesMap[getTableName(fk.reference().foreignTable)] as string;\n\t\t\tconst dbToTsColumnNamesMapForRefTable = getDbToTsColumnNamesMap(\n\t\t\t\tfk.reference().foreignTable,\n\t\t\t);\n\n\t\t\tif (tableRelations[refTable] === undefined) {\n\t\t\t\ttableRelations[refTable] = [];\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttable,\n\t\t\t\tcolumns: fk\n\t\t\t\t\t.reference()\n\t\t\t\t\t.columns.map((col) => dbToTsColumnNamesMap[col.name] as string),\n\t\t\t\trefTable,\n\t\t\t\trefColumns: fk\n\t\t\t\t\t.reference()\n\t\t\t\t\t.foreignColumns.map(\n\t\t\t\t\t\t(fCol) => dbToTsColumnNamesMapForRefTable[fCol.name] as string,\n\t\t\t\t\t),\n\t\t\t\trefTableRels: tableRelations[refTable],\n\t\t\t};\n\t\t});\n\t\trelations.push(\n\t\t\t...newRelations,\n\t\t);\n\n\t\tif (tableRelations[dbToTsTableNamesMap[tableConfig.name] as string] === undefined) {\n\t\t\ttableRelations[dbToTsTableNamesMap[tableConfig.name] as string] = [];\n\t\t}\n\t\ttableRelations[dbToTsTableNamesMap[tableConfig.name] as string]!.push(...newRelations);\n\n\t\tconst getTypeParams = (sqlType: string) => {\n\t\t\t// get type params and set only type\n\t\t\tconst typeParams: Column['typeParams'] = {};\n\n\t\t\tif (\n\t\t\t\tsqlType.startsWith('decimal')\n\t\t\t\t|| sqlType.startsWith('real')\n\t\t\t\t|| sqlType.startsWith('double')\n\t\t\t\t|| sqlType.startsWith('float')\n\t\t\t) {\n\t\t\t\tconst match = sqlType.match(/\\((\\d+), *(\\d+)\\)/);\n\t\t\t\tif (match) {\n\t\t\t\t\ttypeParams['precision'] = Number(match[1]);\n\t\t\t\t\ttypeParams['scale'] = Number(match[2]);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tsqlType.startsWith('char')\n\t\t\t\t|| sqlType.startsWith('varchar')\n\t\t\t\t|| sqlType.startsWith('binary')\n\t\t\t\t|| sqlType.startsWith('varbinary')\n\t\t\t) {\n\t\t\t\tconst match = sqlType.match(/\\((\\d+)\\)/);\n\t\t\t\tif (match) {\n\t\t\t\t\ttypeParams['length'] = Number(match[1]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn typeParams;\n\t\t};\n\n\t\ttables.push({\n\t\t\tname: dbToTsTableNamesMap[tableConfig.name] as string,\n\t\t\tcolumns: tableConfig.columns.map((column) => ({\n\t\t\t\tname: dbToTsColumnNamesMap[column.name] as string,\n\t\t\t\tcolumnType: column.getSQLType(),\n\t\t\t\ttypeParams: getTypeParams(column.getSQLType()),\n\t\t\t\tdataType: column.dataType,\n\t\t\t\thasDefault: column.hasDefault,\n\t\t\t\tdefault: column.default,\n\t\t\t\tenumValues: column.enumValues,\n\t\t\t\tisUnique: column.isUnique,\n\t\t\t\tnotNull: column.notNull,\n\t\t\t\tprimary: column.primary,\n\t\t\t})),\n\t\t\tprimaryKeys: tableConfig.columns\n\t\t\t\t.filter((column) => column.primary)\n\t\t\t\t.map((column) => dbToTsColumnNamesMap[column.name] as string),\n\t\t});\n\t}\n\n\tconst transformedDrizzleRelations = transformFromDrizzleRelation(\n\t\tmysqlSchema,\n\t\tgetDbToTsColumnNamesMap,\n\t\ttableRelations,\n\t);\n\trelations.push(\n\t\t...transformedDrizzleRelations,\n\t);\n\n\tconst isCyclicRelations = relations.map(\n\t\t(relI) => {\n\t\t\tconst tableRel = tableRelations[relI.table]!.find((relJ) => relJ.refTable === relI.refTable)!;\n\t\t\tif (isRelationCyclic(relI)) {\n\t\t\t\ttableRel['isCyclic'] = true;\n\t\t\t\treturn { ...relI, isCyclic: true };\n\t\t\t}\n\t\t\ttableRel['isCyclic'] = false;\n\t\t\treturn { ...relI, isCyclic: false };\n\t\t},\n\t);\n\n\treturn { tables, relations: isCyclicRelations, tableRelations };\n};\n\n// Sqlite------------------------------------------------------------------------------------------------------------------------\nconst resetSqlite = async (\n\tdb: BaseSQLiteDatabase<any, any>,\n\tschema: { [key: string]: SQLiteTable },\n) => {\n\tconst tablesToTruncate = Object.entries(schema).map(([_tsTableName, table]) => {\n\t\tconst dbTableName = getTableName(table);\n\t\treturn dbTableName;\n\t});\n\n\tawait db.run(sql.raw('PRAGMA foreign_keys = OFF'));\n\n\tfor (const tableName of tablesToTruncate) {\n\t\tconst sqlQuery = `delete from \\`${tableName}\\`;`;\n\t\tawait db.run(sql.raw(sqlQuery));\n\t}\n\n\tawait db.run(sql.raw('PRAGMA foreign_keys = ON'));\n};\n\nconst filterSqliteTables = (schema: {\n\t[key: string]:\n\t\t| PgTable\n\t\t| PgSchema\n\t\t| MySqlTable\n\t\t| MySqlSchema\n\t\t| SQLiteTable\n\t\t| any;\n}) => {\n\tconst sqliteSchema = Object.fromEntries(\n\t\tObject.entries(schema).filter(\n\t\t\t(keyValue): keyValue is [string, SQLiteTable | Relations] =>\n\t\t\t\tis(keyValue[1], SQLiteTable) || is(keyValue[1], Relations),\n\t\t),\n\t);\n\n\tconst sqliteTables = Object.fromEntries(\n\t\tObject.entries(schema).filter(\n\t\t\t(keyValue): keyValue is [string, SQLiteTable] => is(keyValue[1], SQLiteTable),\n\t\t),\n\t);\n\n\treturn { sqliteSchema, sqliteTables };\n};\n\nconst seedSqlite = async (\n\tdb: BaseSQLiteDatabase<any, any>,\n\tschema: {\n\t\t[key: string]:\n\t\t\t| PgTable\n\t\t\t| PgSchema\n\t\t\t| MySqlTable\n\t\t\t| MySqlSchema\n\t\t\t| SQLiteTable\n\t\t\t| Relations\n\t\t\t| any;\n\t},\n\toptions: { count?: number; seed?: number; version?: number } = {},\n\trefinements?: RefinementsType,\n) => {\n\tconst { sqliteSchema, sqliteTables } = filterSqliteTables(schema);\n\n\tconst { tables, relations } = getSqliteInfo(sqliteSchema, sqliteTables);\n\n\tconst seedService = new SeedService();\n\n\tconst generatedTablesGenerators = seedService.generatePossibleGenerators(\n\t\t'sqlite',\n\t\ttables,\n\t\trelations,\n\t\trefinements,\n\t\toptions,\n\t);\n\n\tconst preserveCyclicTablesData = relations.some((rel) => rel.isCyclic === true);\n\n\tconst tablesValues = await seedService.generateTablesValues(\n\t\trelations,\n\t\tgeneratedTablesGenerators,\n\t\tdb,\n\t\tsqliteTables,\n\t\t{ ...options, preserveCyclicTablesData },\n\t);\n\n\tconst { filteredTablesGenerators, tablesUniqueNotNullColumn } = seedService.filterCyclicTables(\n\t\tgeneratedTablesGenerators,\n\t);\n\tconst updateDataInDb = filteredTablesGenerators.length === 0 ? false : true;\n\n\tawait seedService.generateTablesValues(\n\t\trelations,\n\t\tfilteredTablesGenerators,\n\t\tdb,\n\t\tsqliteTables,\n\t\t{ ...options, tablesValues, updateDataInDb, tablesUniqueNotNullColumn },\n\t);\n};\n\nconst getSqliteInfo = (\n\tsqliteSchema: { [key: string]: SQLiteTable | Relations },\n\tsqliteTables: { [key: string]: SQLiteTable },\n) => {\n\tlet tableConfig: ReturnType<typeof getSqliteTableConfig>;\n\tlet dbToTsColumnNamesMap: { [key: string]: string };\n\tconst dbToTsTableNamesMap: { [key: string]: string } = Object.fromEntries(\n\t\tObject.entries(sqliteTables).map(([key, value]) => [getTableName(value), key]),\n\t);\n\n\tconst tables: Table[] = [];\n\tconst relations: RelationWithReferences[] = [];\n\tconst dbToTsColumnNamesMapGlobal: {\n\t\t[tableName: string]: { [dbColumnName: string]: string };\n\t} = {};\n\tconst tableRelations: { [tableName: string]: RelationWithReferences[] } = {};\n\n\tconst getDbToTsColumnNamesMap = (table: SQLiteTable) => {\n\t\tlet dbToTsColumnNamesMap: { [dbColName: string]: string } = {};\n\n\t\tconst tableName = getTableName(table);\n\t\tif (Object.hasOwn(dbToTsColumnNamesMapGlobal, tableName)) {\n\t\t\tdbToTsColumnNamesMap = dbToTsColumnNamesMapGlobal[tableName]!;\n\t\t\treturn dbToTsColumnNamesMap;\n\t\t}\n\n\t\tconst tableConfig = getSqliteTableConfig(table);\n\t\tfor (const [tsCol, col] of Object.entries(tableConfig.columns[0]!.table)) {\n\t\t\tdbToTsColumnNamesMap[col.name] = tsCol;\n\t\t}\n\t\tdbToTsColumnNamesMapGlobal[tableName] = dbToTsColumnNamesMap;\n\n\t\treturn dbToTsColumnNamesMap;\n\t};\n\n\tconst transformFromDrizzleRelation = (\n\t\tschema: Record<string, SQLiteTable | Relations>,\n\t\tgetDbToTsColumnNamesMap: (table: SQLiteTable) => {\n\t\t\t[dbColName: string]: string;\n\t\t},\n\t\ttableRelations: {\n\t\t\t[tableName: string]: RelationWithReferences[];\n\t\t},\n\t) => {\n\t\tconst schemaConfig = extractTablesRelationalConfig(schema, createTableRelationsHelpers);\n\t\tconst relations: RelationWithReferences[] = [];\n\t\tfor (const table of Object.values(schemaConfig.tables)) {\n\t\t\tif (table.relations === undefined) continue;\n\n\t\t\tfor (const drizzleRel of Object.values(table.relations)) {\n\t\t\t\tif (!is(drizzleRel, One)) continue;\n\n\t\t\t\tconst tableConfig = getSqliteTableConfig(drizzleRel.sourceTable as SQLiteTable);\n\t\t\t\tconst tableDbName = tableConfig.name;\n\t\t\t\t// TODO: tableNamesMap: have {public.customer: 'customer'} structure in sqlite\n\t\t\t\tconst tableTsName = schemaConfig.tableNamesMap[`public.${tableDbName}`] ?? tableDbName;\n\n\t\t\t\tconst dbToTsColumnNamesMap = getDbToTsColumnNamesMap(drizzleRel.sourceTable as SQLiteTable);\n\t\t\t\tconst columns = drizzleRel.config?.fields.map((field) => dbToTsColumnNamesMap[field.name] as string)\n\t\t\t\t\t?? [];\n\n\t\t\t\tconst refTableConfig = getSqliteTableConfig(drizzleRel.referencedTable as SQLiteTable);\n\t\t\t\tconst refTableDbName = refTableConfig.name;\n\t\t\t\tconst refTableTsName = schemaConfig.tableNamesMap[`public.${refTableDbName}`]\n\t\t\t\t\t?? refTableDbName;\n\n\t\t\t\tconst dbToTsColumnNamesMapForRefTable = getDbToTsColumnNamesMap(drizzleRel.referencedTable as SQLiteTable);\n\t\t\t\tconst refColumns = drizzleRel.config?.references.map((ref) =>\n\t\t\t\t\tdbToTsColumnNamesMapForRefTable[ref.name] as string\n\t\t\t\t)\n\t\t\t\t\t?? [];\n\n\t\t\t\tif (tableRelations[refTableTsName] === undefined) {\n\t\t\t\t\ttableRelations[refTableTsName] = [];\n\t\t\t\t}\n\n\t\t\t\tconst relation: RelationWithReferences = {\n\t\t\t\t\ttable: tableTsName,\n\t\t\t\t\tcolumns,\n\t\t\t\t\trefTable: refTableTsName,\n\t\t\t\t\trefColumns,\n\t\t\t\t\trefTableRels: tableRelations[refTableTsName],\n\t\t\t\t\ttype: 'one',\n\t\t\t\t};\n\n\t\t\t\t// do not add duplicate relation\n\t\t\t\tif (\n\t\t\t\t\ttableRelations[tableTsName]?.some((rel) =>\n\t\t\t\t\t\trel.table === relation.table\n\t\t\t\t\t\t&& rel.refTable === relation.refTable\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`You are providing a one-to-many relation between the '${relation.refTable}' and '${relation.table}' tables,\\n`\n\t\t\t\t\t\t\t+ `while the '${relation.table}' table object already has foreign key constraint in the schema referencing '${relation.refTable}' table.\\n`\n\t\t\t\t\t\t\t+ `In this case, the foreign key constraint will be used.\\n`,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\trelations.push(relation);\n\t\t\t\ttableRelations[tableTsName]!.push(relation);\n\t\t\t}\n\t\t}\n\t\treturn relations;\n\t};\n\n\tfor (const table of Object.values(sqliteTables)) {\n\t\ttableConfig = getSqliteTableConfig(table);\n\n\t\tdbToTsColumnNamesMap = {};\n\t\tfor (const [tsCol, col] of Object.entries(tableConfig.columns[0]!.table)) {\n\t\t\tdbToTsColumnNamesMap[col.name] = tsCol;\n\t\t}\n\n\t\tconst newRelations = tableConfig.foreignKeys.map((fk) => {\n\t\t\tconst table = dbToTsTableNamesMap[tableConfig.name] as string;\n\t\t\tconst refTable = dbToTsTableNamesMap[getTableName(fk.reference().foreignTable)] as string;\n\t\t\tconst dbToTsColumnNamesMapForRefTable = getDbToTsColumnNamesMap(\n\t\t\t\tfk.reference().foreignTable,\n\t\t\t);\n\n\t\t\tif (tableRelations[refTable] === undefined) {\n\t\t\t\ttableRelations[refTable] = [];\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttable,\n\t\t\t\tcolumns: fk\n\t\t\t\t\t.reference()\n\t\t\t\t\t.columns.map((col) => dbToTsColumnNamesMap[col.name] as string),\n\t\t\t\trefTable,\n\t\t\t\trefColumns: fk\n\t\t\t\t\t.reference()\n\t\t\t\t\t.foreignColumns.map(\n\t\t\t\t\t\t(fCol) => dbToTsColumnNamesMapForRefTable[fCol.name] as string,\n\t\t\t\t\t),\n\t\t\t\trefTableRels: tableRelations[refTable],\n\t\t\t};\n\t\t});\n\n\t\trelations.push(\n\t\t\t...newRelations,\n\t\t);\n\n\t\tif (tableRelations[dbToTsTableNamesMap[tableConfig.name] as string] === undefined) {\n\t\t\ttableRelations[dbToTsTableNamesMap[tableConfig.name] as string] = [];\n\t\t}\n\t\ttableRelations[dbToTsTableNamesMap[tableConfig.name] as string]!.push(...newRelations);\n\n\t\tconst getTypeParams = (sqlType: string) => {\n\t\t\t// get type params and set only type\n\t\t\tconst typeParams: Column['typeParams'] = {};\n\n\t\t\tif (\n\t\t\t\tsqlType.startsWith('decimal')\n\t\t\t) {\n\t\t\t\tconst match = sqlType.match(/\\((\\d+), *(\\d+)\\)/);\n\t\t\t\tif (match) {\n\t\t\t\t\ttypeParams['precision'] = Number(match[1]);\n\t\t\t\t\ttypeParams['scale'] = Number(match[2]);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tsqlType.startsWith('char')\n\t\t\t\t|| sqlType.startsWith('varchar')\n\t\t\t\t|| sqlType.startsWith('text')\n\t\t\t) {\n\t\t\t\tconst match = sqlType.match(/\\((\\d+)\\)/);\n\t\t\t\tif (match) {\n\t\t\t\t\ttypeParams['length'] = Number(match[1]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn typeParams;\n\t\t};\n\n\t\ttables.push({\n\t\t\tname: dbToTsTableNamesMap[tableConfig.name] as string,\n\t\t\tcolumns: tableConfig.columns.map((column) => ({\n\t\t\t\tname: dbToTsColumnNamesMap[column.name] as string,\n\t\t\t\tcolumnType: column.getSQLType(),\n\t\t\t\ttypeParams: getTypeParams(column.getSQLType()),\n\t\t\t\tdataType: column.dataType,\n\t\t\t\thasDefault: column.hasDefault,\n\t\t\t\tdefault: column.default,\n\t\t\t\tenumValues: column.enumValues,\n\t\t\t\tisUnique: column.isUnique,\n\t\t\t\tnotNull: column.notNull,\n\t\t\t\tprimary: column.primary,\n\t\t\t})),\n\t\t\tprimaryKeys: tableConfig.columns\n\t\t\t\t.filter((column) => column.primary)\n\t\t\t\t.map((column) => dbToTsColumnNamesMap[column.name] as string),\n\t\t});\n\t}\n\n\tconst transformedDrizzleRelations = transformFromDrizzleRelation(\n\t\tsqliteSchema,\n\t\tgetDbToTsColumnNamesMap,\n\t\ttableRelations,\n\t);\n\trelations.push(\n\t\t...transformedDrizzleRelations,\n\t);\n\n\tconst isCyclicRelations = relations.map(\n\t\t(relI) => {\n\t\t\tconst tableRel = tableRelations[relI.table]!.find((relJ) => relJ.refTable === relI.refTable)!;\n\t\t\tif (isRelationCyclic(relI)) {\n\t\t\t\ttableRel['isCyclic'] = true;\n\t\t\t\treturn { ...relI, isCyclic: true };\n\t\t\t}\n\t\t\ttableRel['isCyclic'] = false;\n\t\t\treturn { ...relI, isCyclic: false };\n\t\t},\n\t);\n\n\treturn { tables, relations: isCyclicRelations, tableRelations };\n};\n\nexport { default as cities } from './datasets/cityNames.ts';\nexport { default as countries } from './datasets/countries.ts';\nexport { default as firstNames } from './datasets/firstNames.ts';\nexport { default as lastNames } from './datasets/lastNames.ts';\nexport { SeedService } from './services/SeedService.ts';\n"
  },
  {
    "path": "drizzle-seed/src/services/GeneratorFuncs.ts",
    "content": "import type { AbstractGenerator } from './Generators.ts';\nimport {\n\tGenerateArray,\n\tGenerateBoolean,\n\tGenerateCity,\n\tGenerateCompanyName,\n\tGenerateCountry,\n\tGenerateDate,\n\tGenerateDatetime,\n\tGenerateDefault,\n\tGenerateEmail,\n\tGenerateEnum,\n\tGenerateFirstName,\n\tGenerateFullName,\n\tGenerateInt,\n\tGenerateInterval,\n\tGenerateIntPrimaryKey,\n\tGenerateJobTitle,\n\tGenerateJson,\n\tGenerateLastName,\n\tGenerateLine,\n\tGenerateLoremIpsum,\n\tGenerateNumber,\n\tGeneratePhoneNumber,\n\tGeneratePoint,\n\tGeneratePostcode,\n\tGenerateSelfRelationsValuesFromArray,\n\tGenerateState,\n\tGenerateStreetAddress,\n\tGenerateString,\n\tGenerateTime,\n\tGenerateTimestamp,\n\tGenerateUniqueCity,\n\tGenerateUniqueCompanyName,\n\tGenerateUniqueCountry,\n\tGenerateUniqueFirstName,\n\tGenerateUniqueFullName,\n\tGenerateUniqueInt,\n\tGenerateUniqueInterval,\n\tGenerateUniqueLastName,\n\tGenerateUniqueLine,\n\tGenerateUniqueNumber,\n\tGenerateUniquePoint,\n\tGenerateUniquePostcode,\n\tGenerateUniqueStreetAddress,\n\tGenerateUniqueString,\n\tGenerateUUID,\n\tGenerateValuesFromArray,\n\tGenerateWeightedCount,\n\tGenerateYear,\n\tHollowGenerator,\n\tWeightedRandomGenerator,\n} from './Generators.ts';\nimport { GenerateStringV2, GenerateUniqueIntervalV2, GenerateUniqueStringV2 } from './versioning/v2.ts';\n\nfunction createGenerator<GeneratorType extends AbstractGenerator<T>, T>(\n\tgeneratorConstructor: new(params?: T) => GeneratorType,\n) {\n\treturn (\n\t\t...args: GeneratorType extends GenerateValuesFromArray | GenerateDefault | WeightedRandomGenerator ? [T]\n\t\t\t: ([] | [T])\n\t): GeneratorType => {\n\t\tlet params = args[0];\n\t\tif (params === undefined) params = {} as T;\n\t\treturn new generatorConstructor(params);\n\t};\n}\n\nexport const generatorsFuncs = {\n\t/**\n\t * generates same given value each time the generator is called.\n\t * @param defaultValue - value you want to generate\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *   posts: {\n\t *    columns: {\n\t *     content: funcs.default({ defaultValue: \"post content\" }),\n\t *    },\n\t *   },\n\t *  }));\n\t * ```\n\t */\n\tdefault: createGenerator(GenerateDefault),\n\n\t/**\n\t * generates values from given array\n\t * @param values - array of values you want to generate. can be array of weighted values.\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    posts: {\n\t *      columns: {\n\t *        title: funcs.valuesFromArray({\n\t *          values: [\"Title1\", \"Title2\", \"Title3\", \"Title4\", \"Title5\"],\n\t *          isUnique: true\n\t *        }),\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t * ```\n\t * weighted values example\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    posts: {\n\t *      columns: {\n\t *        title: funcs.valuesFromArray({\n\t *          values: [\n\t *            { weight: 0.35, values: [\"Title1\", \"Title2\"] },\n\t *            { weight: 0.5, values: [\"Title3\", \"Title4\"] },\n\t *            { weight: 0.15, values: [\"Title5\"] },\n\t *          ],\n\t *          isUnique: false\n\t *        }),\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t * ```\n\t */\n\tvaluesFromArray: createGenerator(GenerateValuesFromArray),\n\n\t/**\n\t * generates sequential integers starting with 1.\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    posts: {\n\t *      columns: {\n\t *        id: funcs.intPrimaryKey(),\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t * ```\n\t */\n\tintPrimaryKey: createGenerator(GenerateIntPrimaryKey),\n\n\t/**\n\t * generates numbers with floating point in given range.\n\t * @param minValue - lower border of range.\n\t * @param maxValue - upper border of range.\n\t * @param precision - precision of generated number:\n\t * precision equals 10 means that values will be accurate to one tenth (1.2, 34.6);\n\t * precision equals 100 means that values will be accurate to one hundredth (1.23, 34.67).\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    products: {\n\t *      columns: {\n\t *        unitPrice: funcs.number({ minValue: 10, maxValue: 120, precision: 100, isUnique: false }),\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t * ```\n\t */\n\tnumber: createGenerator(GenerateNumber),\n\t// uniqueNumber: createGenerator(GenerateUniqueNumber),\n\n\t/**\n\t * generates integers within given range.\n\t * @param minValue - lower border of range.\n\t * @param maxValue - upper border of range.\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    products: {\n\t *      columns: {\n\t *        unitsInStock: funcs.number({ minValue: 0, maxValue: 100, isUnique: false }),\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t * ```\n\t */\n\tint: createGenerator(GenerateInt),\n\t// uniqueInt: createGenerator(GenerateUniqueInt),\n\n\t/**\n\t * generates boolean values(true or false)\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        isAvailable: funcs.boolean()\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t * ```\n\t */\n\tboolean: createGenerator(GenerateBoolean),\n\n\t/**\n\t * generates date within given range.\n\t * @param minDate - lower border of range.\n\t * @param maxDate - upper border of range.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        birthDate: funcs.date({ minDate: \"1990-01-01\", maxDate: \"2010-12-31\" })\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t * ```\n\t */\n\tdate: createGenerator(GenerateDate),\n\n\t/**\n\t * generates time in 24 hours style.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        birthTime: funcs.time()\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t * ```\n\t */\n\ttime: createGenerator(GenerateTime),\n\n\t/**\n\t * generates timestamps.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    orders: {\n\t *      columns: {\n\t *        shippedDate: funcs.timestamp()\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t * ```\n\t */\n\ttimestamp: createGenerator(GenerateTimestamp),\n\n\t/**\n\t * generates datetime objects.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    orders: {\n\t *      columns: {\n\t *        shippedDate: funcs.datetime()\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t * ```\n\t */\n\tdatetime: createGenerator(GenerateDatetime),\n\n\t/**\n\t * generates years.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        birthYear: funcs.year()\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t * ```\n\t */\n\tyear: createGenerator(GenerateYear),\n\n\t/**\n\t * generates json objects with fixed structure.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * json structure can equal this:\n\t * ```\n\t * {\n\t *     email,\n\t *     name,\n\t *     isGraduated,\n\t *     hasJob,\n\t *     salary,\n\t *     startedWorking,\n\t *     visitedCountries,\n\t * }\n\t * ```\n\t * or this\n\t * ```\n\t * {\n\t *     email,\n\t *     name,\n\t *     isGraduated,\n\t *     hasJob,\n\t *     visitedCountries,\n\t * }\n\t * ```\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        metadata: funcs.json()\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tjson: createGenerator(GenerateJson),\n\t// jsonb: createGenerator(GenerateJsonb),\n\n\t/**\n\t * generates time intervals.\n\t *\n\t * interval example: \"1 years 12 days 5 minutes\"\n\t *\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t * @param fields - range of values you want to see in your intervals.\n\t * @example\n\t * ```ts\n\t * await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        timeSpentOnWebsite: funcs.interval()\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tinterval: createGenerator(GenerateInterval),\n\t// uniqueInterval: createGenerator(GenerateUniqueInterval),\n\n\t/**\n\t * generates random strings.\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t * await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        hashedPassword: funcs.string({isUnique: false})\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tstring: createGenerator(GenerateString),\n\t// uniqueString: createGenerator(GenerateUniqueString),\n\n\t/**\n\t * generates v4 UUID strings if arraySize is not specified, or v4 UUID 1D arrays if it is.\n\t *\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        uuid: funcs.uuid({\n\t *          arraySize: 4\n\t *        })\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tuuid: createGenerator(GenerateUUID),\n\n\t/**\n\t * generates person's first names.\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        firstName: funcs.firstName({isUnique: true})\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tfirstName: createGenerator(GenerateFirstName),\n\t// uniqueFirstName: createGenerator(GenerateUniqueName),\n\n\t/**\n\t * generates person's last names.\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        lastName: funcs.lastName({isUnique: false})\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tlastName: createGenerator(GenerateLastName),\n\t// uniqueLastName: createGenerator(GenerateUniqueSurname),\n\n\t/**\n\t * generates person's full names.\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        fullName: funcs.fullName({isUnique: true})\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tfullName: createGenerator(GenerateFullName),\n\t// uniqueFullName: createGenerator(GenerateUniqueFullName),\n\n\t/**\n\t * generates unique emails.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        email: funcs.email()\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\temail: createGenerator(GenerateEmail),\n\n\t/**\n\t * generates unique phone numbers.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @param template - phone number template, where all '#' symbols will be substituted with generated digits.\n\t * @param prefixes - array of any string you want to be your phone number prefixes.(not compatible with template property)\n\t * @param generatedDigitsNumbers - number of digits that will be added at the end of prefixes.(not compatible with template property)\n\t * @example\n\t * ```ts\n\t *  //generate phone number using template property\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        phoneNumber: funcs.phoneNumber({template: \"+(380) ###-####\"})\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t *  //generate phone number using prefixes and generatedDigitsNumbers properties\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        phoneNumber: funcs.phoneNumber({prefixes: [ \"+380 99\", \"+380 67\" ], generatedDigitsNumbers: 7})\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t *  //generate phone number using prefixes and generatedDigitsNumbers properties but with different generatedDigitsNumbers for prefixes\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        phoneNumber: funcs.phoneNumber({prefixes: [ \"+380 99\", \"+380 67\", \"+1\" ], generatedDigitsNumbers: [7, 7, 10]})\n\t *      },\n\t *    },\n\t *  }));\n\t *\n\t * ```\n\t */\n\tphoneNumber: createGenerator(GeneratePhoneNumber),\n\n\t/**\n\t * generates country's names.\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        country: funcs.country({isUnique: false})\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tcountry: createGenerator(GenerateCountry),\n\t// uniqueCountry: createGenerator(GenerateUniqueCountry),\n\n\t/**\n\t * generates city's names.\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        city: funcs.city({isUnique: false})\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tcity: createGenerator(GenerateCity),\n\t// uniqueCity: createGenerator(GenerateUniqueCityName),\n\n\t/**\n\t * generates street address.\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        streetAddress: funcs.streetAddress({isUnique: true})\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tstreetAddress: createGenerator(GenerateStreetAddress),\n\t// uniqueStreetAddress: createGenerator(GenerateUniqueStreetAddress),\n\n\t/**\n\t * generates job titles.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        jobTitle: funcs.jobTitle()\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tjobTitle: createGenerator(GenerateJobTitle),\n\n\t/**\n\t * generates postal codes.\n\t *\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        postcode: funcs.postcode({isUnique: true})\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tpostcode: createGenerator(GeneratePostcode),\n\t// uniquePostcoe: createGenerator(GenerateUniquePostcode),\n\n\t/**\n\t * generates states of America.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        state: funcs.state()\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tstate: createGenerator(GenerateState),\n\n\t/**\n\t * generates company's names.\n\t *\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    users: {\n\t *      columns: {\n\t *        company: funcs.companyName({isUnique: true})\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tcompanyName: createGenerator(GenerateCompanyName),\n\t// uniqueCompanyName: createGenerator(GenerateUniqueCompanyName),\n\n\t/**\n\t * generates 'lorem ipsum' text sentences.\n\t *\n\t * @param sentencesCount - number of sentences you want to generate as one generated value(string).\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    posts: {\n\t *      columns: {\n\t *        content: funcs.loremIpsum({sentencesCount: 2})\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tloremIpsum: createGenerator(GenerateLoremIpsum),\n\n\t/**\n\t * generates 2D points within specified ranges for x and y coordinates.\n\t *\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param minXValue - lower bound of range for x coordinate.\n\t * @param maxXValue - upper bound of range for x coordinate.\n\t * @param minYValue - lower bound of range for y coordinate.\n\t * @param maxYValue - upper bound of range for y coordinate.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    triangles: {\n\t *      columns: {\n\t *        pointCoords: funcs.point({\n\t *          isUnique: true,\n\t *          minXValue: -5, maxXValue:20,\n\t *          minYValue: 0, maxYValue: 30\n\t *        })\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tpoint: createGenerator(GeneratePoint),\n\t// uniquePoint: createGenerator(GenerateUniquePoint),\n\n\t/**\n\t * generates 2D lines within specified ranges for a, b and c parameters of line.\n\t *\n\t * ```\n\t * line equation: a*x + b*y + c = 0\n\t * ```\n\t *\n\t * @param isUnique - property that controls if generated values gonna be unique or not.\n\t * @param minAValue - lower bound of range for a parameter.\n\t * @param maxAValue - upper bound of range for x parameter.\n\t * @param minBValue - lower bound of range for y parameter.\n\t * @param maxBValue - upper bound of range for y parameter.\n\t * @param minCValue - lower bound of range for y parameter.\n\t * @param maxCValue - upper bound of range for y parameter.\n\t * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.)\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    lines: {\n\t *      columns: {\n\t *        lineParams: funcs.point({\n\t *          isUnique: true,\n\t *          minAValue: -5, maxAValue:20,\n\t *          minBValue: 0, maxBValue: 30,\n\t *          minCValue: 0, maxCValue: 10\n\t *        })\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tline: createGenerator(GenerateLine),\n\t// uniqueLine: createGenerator(GenerateUniqueLine),\n\n\t/**\n\t * gives you the opportunity to call different generators with different probabilities to generate values for one column.\n\t * @param params - array of generators with probabilities you would like to call them to generate values.\n\t *\n\t * @example\n\t * ```ts\n\t *  await seed(db, schema, { count: 1000 }).refine((funcs) => ({\n\t *    posts: {\n\t *      columns: {\n\t *        content: funcs.weightedRandom([\n\t *          {\n\t *            weight: 0.6,\n\t *            value: funcs.loremIpsum({ sentencesCount: 3 }),\n\t *          },\n\t *          {\n\t *            weight: 0.4,\n\t *            value: funcs.default({ defaultValue: \"TODO\" }),\n\t *          },\n\t *        ]),\n\t *      },\n\t *    },\n\t *  }));\n\t * ```\n\t */\n\tweightedRandom: createGenerator(WeightedRandomGenerator),\n};\n\n// so far, version changes don’t affect generator parameters.\nexport const generatorsFuncsV2 = {\n\t...generatorsFuncs,\n};\n\nexport const generatorsMap = {\n\tHollowGenerator: [\n\t\tHollowGenerator,\n\t],\n\tGenerateDefault: [\n\t\tGenerateDefault,\n\t],\n\tGenerateValuesFromArray: [\n\t\tGenerateValuesFromArray,\n\t],\n\tGenerateSelfRelationsValuesFromArray: [\n\t\tGenerateSelfRelationsValuesFromArray,\n\t],\n\tGenerateIntPrimaryKey: [\n\t\tGenerateIntPrimaryKey,\n\t],\n\tGenerateNumber: [\n\t\tGenerateNumber,\n\t],\n\tGenerateUniqueNumber: [\n\t\tGenerateUniqueNumber,\n\t],\n\tGenerateInt: [\n\t\tGenerateInt,\n\t],\n\tGenerateUniqueInt: [\n\t\tGenerateUniqueInt,\n\t],\n\tGenerateBoolean: [\n\t\tGenerateBoolean,\n\t],\n\tGenerateDate: [\n\t\tGenerateDate,\n\t],\n\tGenerateTime: [\n\t\tGenerateTime,\n\t],\n\tGenerateTimestamp: [\n\t\tGenerateTimestamp,\n\t],\n\tGenerateDatetime: [\n\t\tGenerateDatetime,\n\t],\n\tGenerateYear: [\n\t\tGenerateYear,\n\t],\n\tGenerateJson: [\n\t\tGenerateJson,\n\t],\n\tGenerateEnum: [\n\t\tGenerateEnum,\n\t],\n\tGenerateInterval: [\n\t\tGenerateInterval,\n\t],\n\tGenerateUniqueInterval: [\n\t\tGenerateUniqueInterval,\n\t\tGenerateUniqueIntervalV2,\n\t],\n\tGenerateString: [\n\t\tGenerateString,\n\t\tGenerateStringV2,\n\t],\n\tGenerateUniqueString: [\n\t\tGenerateUniqueString,\n\t\tGenerateUniqueStringV2,\n\t],\n\tGenerateUUID: [\n\t\tGenerateUUID,\n\t],\n\tGenerateFirstName: [\n\t\tGenerateFirstName,\n\t],\n\tGenerateUniqueFirstName: [\n\t\tGenerateUniqueFirstName,\n\t],\n\tGenerateLastName: [\n\t\tGenerateLastName,\n\t],\n\tGenerateUniqueLastName: [\n\t\tGenerateUniqueLastName,\n\t],\n\tGenerateFullName: [\n\t\tGenerateFullName,\n\t],\n\tGenerateUniqueFullName: [\n\t\tGenerateUniqueFullName,\n\t],\n\tGenerateEmail: [\n\t\tGenerateEmail,\n\t],\n\tGeneratePhoneNumber: [\n\t\tGeneratePhoneNumber,\n\t],\n\tGenerateCountry: [\n\t\tGenerateCountry,\n\t],\n\tGenerateUniqueCountry: [\n\t\tGenerateUniqueCountry,\n\t],\n\tGenerateCity: [\n\t\tGenerateCity,\n\t],\n\tGenerateUniqueCity: [\n\t\tGenerateUniqueCity,\n\t],\n\tGenerateStreetAddress: [\n\t\tGenerateStreetAddress,\n\t],\n\tGenerateUniqueStreetAddress: [\n\t\tGenerateUniqueStreetAddress,\n\t],\n\tGenerateJobTitle: [\n\t\tGenerateJobTitle,\n\t],\n\tGeneratePostcode: [\n\t\tGeneratePostcode,\n\t],\n\tGenerateUniquePostcode: [\n\t\tGenerateUniquePostcode,\n\t],\n\tGenerateState: [\n\t\tGenerateState,\n\t],\n\tGenerateCompanyName: [\n\t\tGenerateCompanyName,\n\t],\n\tGenerateUniqueCompanyName: [\n\t\tGenerateUniqueCompanyName,\n\t],\n\tGenerateLoremIpsum: [\n\t\tGenerateLoremIpsum,\n\t],\n\tGeneratePoint: [\n\t\tGeneratePoint,\n\t],\n\tGenerateUniquePoint: [\n\t\tGenerateUniquePoint,\n\t],\n\tGenerateLine: [\n\t\tGenerateLine,\n\t],\n\tGenerateUniqueLine: [\n\t\tGenerateUniqueLine,\n\t],\n\tWeightedRandomGenerator: [\n\t\tWeightedRandomGenerator,\n\t],\n\tGenerateArray: [\n\t\tGenerateArray,\n\t],\n\tGenerateWeightedCount: [\n\t\tGenerateWeightedCount,\n\t],\n} as const;\n"
  },
  {
    "path": "drizzle-seed/src/services/Generators.ts",
    "content": "/* eslint-disable drizzle-internal/require-entity-kind */\nimport prand from 'pure-rand';\nimport adjectives, { maxStringLength as maxAdjectiveLength } from '../datasets/adjectives.ts';\nimport cityNames, { maxStringLength as maxCityNameLength } from '../datasets/cityNames.ts';\nimport companyNameSuffixes, { maxStringLength as maxCompanyNameSuffixLength } from '../datasets/companyNameSuffixes.ts';\nimport countries, { maxStringLength as maxCountryLength } from '../datasets/countries.ts';\nimport emailDomains, { maxStringLength as maxEmailDomainLength } from '../datasets/emailDomains.ts';\nimport firstNames, { maxStringLength as maxFirstNameLength } from '../datasets/firstNames.ts';\nimport jobsTitles, { maxStringLength as maxJobTitleLength } from '../datasets/jobsTitles.ts';\nimport lastNames, { maxStringLength as maxLastNameLength } from '../datasets/lastNames.ts';\nimport loremIpsumSentences, { maxStringLength as maxLoremIpsumLength } from '../datasets/loremIpsumSentences.ts';\nimport phonesInfo from '../datasets/phonesInfo.ts';\nimport states, { maxStringLength as maxStateLength } from '../datasets/states.ts';\nimport streetSuffix, { maxStringLength as maxStreetSuffixLength } from '../datasets/streetSuffix.ts';\nimport { fastCartesianProduct, fillTemplate, getWeightedIndices, isObject } from './utils.ts';\n\nexport abstract class AbstractGenerator<T = {}> {\n\tstatic readonly entityKind: string = 'AbstractGenerator';\n\tstatic readonly version: number = 1;\n\n\tpublic isUnique = false;\n\tpublic notNull = false;\n\n\t// param for generators which have a unique version of themselves\n\tpublic uniqueVersionOfGen?: new(params: T) => AbstractGenerator<T>;\n\n\tpublic dataType?: string;\n\tpublic timeSpent?: number;\n\n\t//\n\tpublic arraySize?: number;\n\tpublic baseColumnDataType?: string;\n\n\t// param for text-like generators\n\tpublic stringLength?: number;\n\n\t// params for GenerateValuesFromArray\n\tpublic weightedCountSeed?: number | undefined;\n\tpublic maxRepeatedValuesCount?: number | { weight: number; count: number | number[] }[] | undefined;\n\n\tpublic params: T;\n\n\tconstructor(params?: T) {\n\t\tthis.params = params === undefined ? {} as T : params as T;\n\t}\n\n\tinit(params: { count: number | { weight: number; count: number | number[] }[]; seed: number }): void;\n\tinit() {\n\t\tthis.updateParams();\n\t}\n\n\tupdateParams() {\n\t\tif ((this.params as any).arraySize !== undefined) {\n\t\t\tthis.arraySize = (this.params as any).arraySize;\n\t\t}\n\n\t\tif ((this.params as any).isUnique !== undefined) {\n\t\t\tif ((this.params as any).isUnique === false && this.isUnique === true) {\n\t\t\t\tthrow new Error('specifying non unique generator to unique column.');\n\t\t\t}\n\n\t\t\tthis.isUnique = (this.params as any).isUnique;\n\t\t}\n\t}\n\n\tabstract generate(params: { i: number }): number | string | boolean | unknown | undefined | void;\n\n\tgetEntityKind(): string {\n\t\tconst constructor = this.constructor as typeof AbstractGenerator;\n\t\treturn constructor.entityKind;\n\t}\n\n\treplaceIfUnique() {\n\t\tthis.updateParams();\n\t\tif (\n\t\t\tthis.uniqueVersionOfGen !== undefined\n\t\t\t&& this.isUnique === true\n\t\t) {\n\t\t\tconst uniqueGen = new this.uniqueVersionOfGen({\n\t\t\t\t...this.params,\n\t\t\t});\n\n\t\t\tuniqueGen.isUnique = this.isUnique;\n\t\t\tuniqueGen.dataType = this.dataType;\n\n\t\t\treturn uniqueGen;\n\t\t}\n\t\treturn;\n\t}\n\n\treplaceIfArray() {\n\t\tthis.updateParams();\n\t\tif (!(this.getEntityKind() === 'GenerateArray') && this.arraySize !== undefined) {\n\t\t\tconst uniqueGen = this.replaceIfUnique();\n\t\t\tconst baseColumnGen = uniqueGen === undefined ? this : uniqueGen;\n\t\t\tbaseColumnGen.dataType = this.baseColumnDataType;\n\t\t\tconst arrayGen = new GenerateArray(\n\t\t\t\t{\n\t\t\t\t\tbaseColumnGen,\n\t\t\t\t\tsize: this.arraySize,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\treturn arrayGen;\n\t\t}\n\n\t\treturn;\n\t}\n}\n\n// Generators Classes -----------------------------------------------------------------------------------------------------------------------\nexport class GenerateArray extends AbstractGenerator<{ baseColumnGen: AbstractGenerator<any>; size?: number }> {\n\tstatic override readonly entityKind: string = 'GenerateArray';\n\tpublic override arraySize = 10;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\t\tthis.arraySize = this.params.size === undefined ? this.arraySize : this.params.size;\n\t\tthis.params.baseColumnGen.init({ count: count * this.arraySize, seed });\n\t}\n\n\tgenerate() {\n\t\tconst array = [];\n\t\tfor (let i = 0; i < this.arraySize; i++) {\n\t\t\tarray.push(this.params.baseColumnGen.generate({ i }));\n\t\t}\n\n\t\treturn array;\n\t}\n}\n\nexport class GenerateWeightedCount extends AbstractGenerator<{}> {\n\tstatic override readonly entityKind: string = 'GenerateWeightedCount';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tweightedIndices: number[];\n\t\tweightedCount: { weight: number; count: number | number[] }[];\n\t} | undefined;\n\n\toverride init({ seed, count }: { count: { weight: number; count: number | number[] }[]; seed: number }) {\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tconst weightedIndices = getWeightedIndices(count.map((val) => val.weight));\n\t\tthis.state = { rng, weightedIndices, weightedCount: count };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\t// logic for this generator\n\t\tlet idx: number;\n\t\tconst weightedCount = this.state.weightedCount;\n\n\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, this.state.weightedIndices.length - 1, this.state.rng);\n\t\tconst objIdx = this.state.weightedIndices[idx] as number;\n\n\t\tif (typeof weightedCount[objIdx]!.count === 'number') {\n\t\t\treturn weightedCount[objIdx]!.count as number;\n\t\t} else {\n\t\t\t// typeof weightedCount[objIdx]!.count === 'object' // number[]\n\t\t\tconst possCounts = weightedCount[objIdx]!.count as number[];\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, possCounts.length - 1, this.state.rng);\n\t\t\treturn possCounts[idx]!;\n\t\t}\n\t}\n}\n\nexport class HollowGenerator extends AbstractGenerator<{}> {\n\tstatic override readonly entityKind: string = 'HollowGenerator';\n\n\toverride init() {}\n\n\tgenerate() {}\n}\n\nexport class GenerateDefault extends AbstractGenerator<{\n\tdefaultValue: unknown;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateDefault';\n\n\tgenerate() {\n\t\treturn this.params.defaultValue;\n\t}\n}\n\nexport class GenerateValuesFromArray extends AbstractGenerator<\n\t{\n\t\tvalues:\n\t\t\t| (number | string | boolean | undefined)[]\n\t\t\t| { weight: number; values: (number | string | boolean | undefined)[] }[];\n\t\tisUnique?: boolean;\n\t\tarraySize?: number;\n\t}\n> {\n\tstatic override readonly entityKind: string = 'GenerateValuesFromArray';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tvalues:\n\t\t\t| (number | string | boolean | undefined)[]\n\t\t\t| { weight: number; values: (number | string | boolean | undefined)[] }[];\n\t\tgenIndicesObj: GenerateUniqueInt | undefined;\n\t\tgenIndicesObjList: GenerateUniqueInt[] | undefined;\n\t\tvaluesWeightedIndices: number[] | undefined;\n\t\tgenMaxRepeatedValuesCount: GenerateDefault | GenerateWeightedCount | undefined;\n\t} | undefined;\n\tpublic override timeSpent: number = 0;\n\n\tchecks({ count }: { count: number }) {\n\t\tconst { values } = this.params;\n\t\tconst { maxRepeatedValuesCount, notNull, isUnique } = this;\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('Values length equals zero.');\n\t\t}\n\n\t\tif (\n\t\t\tisObject(values[0])\n\t\t\t&& !(values as { weight: number; values: any[] }[]).every((val) => val.values.length !== 0)\n\t\t) {\n\t\t\tthrow new Error('One of weighted values length equals zero.');\n\t\t}\n\n\t\tif (\n\t\t\tmaxRepeatedValuesCount !== undefined && (\n\t\t\t\t(typeof maxRepeatedValuesCount === 'number' && maxRepeatedValuesCount <= 0)\n\t\t\t\t|| (typeof maxRepeatedValuesCount === 'object' && !maxRepeatedValuesCount\n\t\t\t\t\t.every((obj) =>\n\t\t\t\t\t\t(typeof obj.count) === 'number'\n\t\t\t\t\t\t\t? (obj.count as number) > 0\n\t\t\t\t\t\t\t: (obj.count as number[]).every((count) => count > 0)\n\t\t\t\t\t))\n\t\t\t)\n\t\t) {\n\t\t\tthrow new Error('maxRepeatedValuesCount should be greater than zero.');\n\t\t}\n\n\t\tlet allValuesCount = values.length;\n\t\tif (isObject(values[0])) {\n\t\t\tallValuesCount = (values as { values: any[] }[]).reduce((acc, currVal) => acc + currVal.values.length, 0);\n\t\t}\n\n\t\tif (\n\t\t\tnotNull === true\n\t\t\t&& maxRepeatedValuesCount !== undefined\n\t\t\t&& (\n\t\t\t\t(!isObject(values[0]) && typeof maxRepeatedValuesCount === 'number'\n\t\t\t\t\t&& maxRepeatedValuesCount * values.length < count)\n\t\t\t\t|| (isObject(values[0]) && typeof maxRepeatedValuesCount === 'number'\n\t\t\t\t\t&& maxRepeatedValuesCount * allValuesCount < count)\n\t\t\t)\n\t\t) {\n\t\t\tthrow new Error(\"Can't fill notNull column with null values.\");\n\t\t}\n\n\t\tif (\n\t\t\tisUnique === true && maxRepeatedValuesCount !== undefined && (\n\t\t\t\t(typeof maxRepeatedValuesCount === 'number' && maxRepeatedValuesCount > 1)\n\t\t\t\t|| (typeof maxRepeatedValuesCount === 'object' && !maxRepeatedValuesCount\n\t\t\t\t\t.every((obj) =>\n\t\t\t\t\t\t(typeof obj.count) === 'number'\n\t\t\t\t\t\t\t? obj.count === 1\n\t\t\t\t\t\t\t: (obj.count as number[]).every((count) => count === 1)\n\t\t\t\t\t))\n\t\t\t)\n\t\t) {\n\t\t\tthrow new Error(\"Can't be greater than 1 if column is unique.\");\n\t\t}\n\n\t\tif (\n\t\t\tisUnique === true && notNull === true && (\n\t\t\t\t(!isObject(values[0]) && values.length < count)\n\t\t\t\t|| (isObject(values[0]) && allValuesCount < count)\n\t\t\t)\n\t\t) {\n\t\t\t// console.log(maxRepeatedValuesCount, values.length, allValuesCount, count)\n\t\t\tthrow new Error('There are no enough values to fill unique column.');\n\t\t}\n\t}\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tthis.checks({ count });\n\n\t\tlet { maxRepeatedValuesCount } = this;\n\t\tconst { params, isUnique, notNull, weightedCountSeed } = this;\n\n\t\tconst values = params.values;\n\n\t\tlet valuesWeightedIndices;\n\t\tif (isObject(values[0])) {\n\t\t\tvaluesWeightedIndices = getWeightedIndices((values as { weight: number }[]).map((val) => val.weight));\n\t\t\tif (isUnique === true && notNull === true) {\n\t\t\t\tlet idx: number, valueIdx: number, rng = prand.xoroshiro128plus(seed);\n\t\t\t\tconst indicesCounter: { [key: number]: number } = {};\n\t\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\t\t[idx, rng] = prand.uniformIntDistribution(0, valuesWeightedIndices.length - 1, rng);\n\t\t\t\t\tvalueIdx = valuesWeightedIndices[idx]!;\n\t\t\t\t\tif (!Object.hasOwn(indicesCounter, valueIdx)) indicesCounter[valueIdx] = 0;\n\t\t\t\t\tindicesCounter[valueIdx]! += 1;\n\t\t\t\t}\n\n\t\t\t\tfor (const [idx, value] of values.entries()) {\n\t\t\t\t\tif ((value as { values: (number | string | boolean | undefined)[] }).values.length < indicesCounter[idx]!) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t'weighted values arrays is too small to generate values with specified probability for unique not null column.'\n\t\t\t\t\t\t\t\t+ `it's planned to generate: ${\n\t\t\t\t\t\t\t\t\tObject.entries(indicesCounter).map(([idx, count]) => {\n\t\t\t\t\t\t\t\t\t\treturn `${count} values with probability ${(values as { weight: number }[])[Number(idx)]?.weight}`;\n\t\t\t\t\t\t\t\t\t}).join(',')\n\t\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (isUnique === true && maxRepeatedValuesCount === undefined) {\n\t\t\tmaxRepeatedValuesCount = 1;\n\t\t}\n\t\tlet genMaxRepeatedValuesCount: GenerateDefault | GenerateWeightedCount | undefined;\n\t\tif (typeof maxRepeatedValuesCount === 'number') {\n\t\t\tgenMaxRepeatedValuesCount = new GenerateDefault({ defaultValue: maxRepeatedValuesCount });\n\t\t} else if (typeof maxRepeatedValuesCount === 'object') {\n\t\t\tgenMaxRepeatedValuesCount = new GenerateWeightedCount({});\n\t\t\t(genMaxRepeatedValuesCount as GenerateWeightedCount).init(\n\t\t\t\t{\n\t\t\t\t\tcount: maxRepeatedValuesCount,\n\t\t\t\t\tseed: weightedCountSeed === undefined ? seed : weightedCountSeed,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tlet genIndicesObj: GenerateUniqueInt | undefined;\n\t\tlet genIndicesObjList: GenerateUniqueInt[] | undefined;\n\n\t\tif (maxRepeatedValuesCount !== undefined) {\n\t\t\tif (!isObject(values[0])) {\n\t\t\t\tgenIndicesObj = new GenerateUniqueInt({ minValue: 0, maxValue: values.length - 1 });\n\t\t\t\tgenIndicesObj.genMaxRepeatedValuesCount = genMaxRepeatedValuesCount;\n\t\t\t\tgenIndicesObj.skipCheck = true;\n\t\t\t\tgenIndicesObj.init({ count, seed });\n\t\t\t} else if (isObject(values[0])) {\n\t\t\t\tgenIndicesObjList = [];\n\t\t\t\tfor (const obj of values as { weight: number; values: (number | string | boolean | undefined)[] }[]) {\n\t\t\t\t\tconst genIndicesObj = new GenerateUniqueInt({ minValue: 0, maxValue: obj.values.length - 1 });\n\t\t\t\t\tgenIndicesObj.genMaxRepeatedValuesCount = genMaxRepeatedValuesCount;\n\t\t\t\t\tgenIndicesObj.skipCheck = true;\n\t\t\t\t\tgenIndicesObj.init({ count, seed });\n\t\t\t\t\tgenIndicesObjList.push(genIndicesObj);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tthis.state = { rng, values, valuesWeightedIndices, genMaxRepeatedValuesCount, genIndicesObj, genIndicesObjList };\n\t}\n\n\tgenerate() {\n\t\tconst t0 = new Date();\n\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet idx: number,\n\t\t\tvalue: string | number | boolean | undefined;\n\t\tlet valueIdx: number;\n\n\t\tif (this.state.valuesWeightedIndices === undefined) {\n\t\t\tif (this.state.genIndicesObj === undefined) {\n\t\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, this.state.values.length - 1, this.state.rng);\n\t\t\t} else {\n\t\t\t\tidx = this.state.genIndicesObj.generate() as number;\n\t\t\t}\n\n\t\t\tvalue = (this.state.values as (number | string | boolean | undefined)[])[idx];\n\t\t} else {\n\t\t\t// weighted values\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t\t0,\n\t\t\t\tthis.state.valuesWeightedIndices.length - 1,\n\t\t\t\tthis.state.rng,\n\t\t\t);\n\t\t\tvalueIdx = this.state.valuesWeightedIndices[idx] as number;\n\t\t\tconst currValues =\n\t\t\t\t(this.state.values![valueIdx] as { weight: number; values: (number | string | boolean | undefined)[] }).values;\n\t\t\tif (this.state.genIndicesObjList === undefined) {\n\t\t\t\t// isUnique !== true\n\t\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, currValues.length - 1, this.state.rng);\n\t\t\t} else {\n\t\t\t\t// isUnique === true\n\t\t\t\tidx = this.state.genIndicesObjList[valueIdx]!.generate() as number;\n\t\t\t}\n\t\t\tvalue = currValues[idx];\n\t\t}\n\n\t\tthis.timeSpent += (Date.now() - t0.getTime()) / 1000;\n\t\treturn value;\n\t}\n}\n\nexport class GenerateSelfRelationsValuesFromArray extends AbstractGenerator<{ values: (number | string | boolean)[] }> {\n\tstatic override readonly entityKind: string = 'GenerateSelfRelationsValuesFromArray';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tfirstValuesCount: number;\n\t\tfirstValues: (string | number | boolean)[];\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tlet rng = prand.xoroshiro128plus(seed);\n\n\t\t// generate 15-40 % values with the same value as reference column\n\t\tlet percent = 30;\n\t\t[percent, rng] = prand.uniformIntDistribution(20, 40, rng);\n\t\tconst firstValuesCount = Math.floor((percent / 100) * count), firstValues: (string | number | boolean)[] = [];\n\n\t\tthis.state = { rng, firstValuesCount, firstValues };\n\t}\n\n\tgenerate({ i }: { i: number }) {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst { values } = this.params;\n\t\tlet idx: number;\n\n\t\tif (i < this.state.firstValuesCount) {\n\t\t\tthis.state.firstValues.push(values[i]!);\n\t\t\treturn values[i];\n\t\t} else {\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, this.state.firstValues.length - 1, this.state.rng);\n\t\t\treturn this.state.firstValues[idx];\n\t\t}\n\t}\n}\n\nexport class GenerateIntPrimaryKey extends AbstractGenerator<{}> {\n\tstatic override readonly entityKind: string = 'GenerateIntPrimaryKey';\n\n\tpublic maxValue?: number | bigint;\n\n\toverride init({ count }: { count: number; seed: number }) {\n\t\tif (this.maxValue !== undefined && count > this.maxValue) {\n\t\t\tthrow new Error('count exceeds max number for this column type.');\n\t\t}\n\t}\n\n\tgenerate({ i }: { i: number }) {\n\t\tif (this.dataType === 'bigint') {\n\t\t\treturn BigInt(i + 1);\n\t\t}\n\n\t\treturn i + 1;\n\t}\n}\n\nexport class GenerateNumber extends AbstractGenerator<\n\t{\n\t\tminValue?: number;\n\t\tmaxValue?: number;\n\t\tprecision?: number;\n\t\tisUnique?: boolean;\n\t\tarraySize?: number;\n\t}\n> {\n\tstatic override readonly entityKind: string = 'GenerateNumber';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tminValue: number;\n\t\tmaxValue: number;\n\t\tprecision: number;\n\t} | undefined;\n\toverride uniqueVersionOfGen = GenerateUniqueNumber;\n\n\toverride init({ count, seed }: { seed: number; count: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tlet { minValue, maxValue, precision } = this.params;\n\t\tif (precision === undefined) {\n\t\t\tprecision = 100;\n\t\t}\n\n\t\tif (maxValue === undefined) {\n\t\t\tmaxValue = precision * 1000;\n\t\t} else {\n\t\t\tmaxValue *= precision;\n\t\t}\n\n\t\tif (minValue === undefined) {\n\t\t\tminValue = -maxValue;\n\t\t} else {\n\t\t\tminValue *= precision;\n\t\t}\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tthis.state = { rng, minValue, maxValue, precision };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet value: number;\n\n\t\t[value, this.state.rng] = prand.uniformIntDistribution(this.state.minValue, this.state.maxValue, this.state.rng);\n\t\treturn value / this.state.precision;\n\t}\n}\n\nexport class GenerateUniqueNumber extends AbstractGenerator<\n\t{\n\t\tminValue?: number;\n\t\tmaxValue?: number;\n\t\tprecision?: number;\n\t\tisUnique?: boolean;\n\t}\n> {\n\tstatic override readonly entityKind: string = 'GenerateUniqueNumber';\n\n\tprivate state: {\n\t\tgenUniqueIntObj: GenerateUniqueInt;\n\t\tminValue: number;\n\t\tmaxValue: number;\n\t\tprecision: number;\n\t} | undefined;\n\tpublic override isUnique = true;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tlet { minValue, maxValue, precision } = this.params;\n\n\t\tif (precision === undefined) {\n\t\t\tprecision = 100;\n\t\t}\n\n\t\tif (maxValue === undefined) {\n\t\t\tmaxValue = count * precision;\n\t\t} else {\n\t\t\tmaxValue *= precision;\n\t\t}\n\n\t\tif (minValue === undefined) {\n\t\t\tminValue = -maxValue;\n\t\t} else {\n\t\t\tminValue *= precision;\n\t\t}\n\n\t\tconst genUniqueIntObj = new GenerateUniqueInt({ minValue, maxValue });\n\t\tgenUniqueIntObj.init({ count, seed });\n\n\t\tthis.state = { genUniqueIntObj, minValue, maxValue, precision };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst value = this.state.genUniqueIntObj.generate() as number / this.state.precision;\n\n\t\treturn value;\n\t}\n}\n\nexport class GenerateInt extends AbstractGenerator<{\n\tminValue?: number | bigint;\n\tmaxValue?: number | bigint;\n\tisUnique?: boolean;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateInt';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tminValue: number | bigint;\n\t\tmaxValue: number | bigint;\n\t} | undefined;\n\toverride uniqueVersionOfGen = GenerateUniqueInt;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tlet { minValue, maxValue } = this.params;\n\n\t\tif (maxValue === undefined) {\n\t\t\tmaxValue = 1000;\n\t\t}\n\n\t\tif (minValue === undefined) {\n\t\t\tminValue = -maxValue;\n\t\t}\n\n\t\tif (typeof minValue === 'number' && typeof maxValue === 'number') {\n\t\t\tminValue = minValue >= 0 ? Math.ceil(minValue) : Math.floor(minValue);\n\t\t\tmaxValue = maxValue >= 0 ? Math.floor(maxValue) : Math.ceil(maxValue);\n\t\t}\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tthis.state = { rng, minValue, maxValue };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet value: number | bigint;\n\t\tif (typeof this.state.minValue === 'bigint' && typeof this.state.maxValue === 'bigint') {\n\t\t\t[value, this.state.rng] = prand.uniformBigIntDistribution(\n\t\t\t\tthis.state.minValue,\n\t\t\t\tthis.state.maxValue,\n\t\t\t\tthis.state.rng,\n\t\t\t);\n\t\t} else {\n\t\t\t[value, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t\tthis.state.minValue as number,\n\t\t\t\tthis.state.maxValue as number,\n\t\t\t\tthis.state.rng,\n\t\t\t);\n\t\t}\n\n\t\tif (this.dataType === 'string') {\n\t\t\treturn String(value);\n\t\t}\n\n\t\tif (this.dataType === 'bigint') {\n\t\t\tvalue = BigInt(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport class GenerateUniqueInt extends AbstractGenerator<{\n\tminValue?: number | bigint;\n\tmaxValue?: number | bigint;\n\tisUnique?: boolean;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateUniqueInt';\n\n\tpublic genMaxRepeatedValuesCount: GenerateDefault | GenerateWeightedCount | undefined;\n\tpublic skipCheck?: boolean = false;\n\tpublic state: {\n\t\trng: prand.RandomGenerator;\n\t\tminValue: number | bigint;\n\t\tmaxValue: number | bigint;\n\t\tintervals: (number | bigint)[][];\n\t\tintegersCount: Map<number | bigint, number>;\n\t} | undefined;\n\tpublic override isUnique = true;\n\tpublic override timeSpent = 0;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tlet { minValue, maxValue } = this.params;\n\n\t\tif (maxValue === undefined) {\n\t\t\tmaxValue = count * 10;\n\t\t}\n\t\tif (minValue === undefined) {\n\t\t\tminValue = -maxValue;\n\t\t}\n\n\t\tconst intervals = [[minValue, maxValue]];\n\n\t\tconst integersCount = new Map();\n\n\t\tif (typeof minValue === 'bigint' && typeof maxValue === 'bigint') {\n\t\t\tif (this.skipCheck === false && maxValue - minValue + BigInt(1) < count) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'count exceeds max number of unique integers in given range(min, max), try to make range wider.',\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (typeof minValue === 'number' && typeof maxValue === 'number') {\n\t\t\tminValue = minValue >= 0 ? Math.ceil(minValue) : Math.floor(minValue);\n\t\t\tmaxValue = maxValue >= 0 ? Math.floor(maxValue) : Math.ceil(maxValue);\n\t\t\tif (this.skipCheck === false && maxValue - minValue + 1 < count) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'count exceeds max number of unique integers in given range(min, max), try to make range wider.',\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t'minValue and maxValue should be the same type.',\n\t\t\t);\n\t\t}\n\n\t\tthis.state = { rng, minValue, maxValue, intervals, integersCount };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet intervalIdx: number,\n\t\t\tnumb: number | bigint | undefined;\n\n\t\tconst intervalsToAdd: (number | bigint)[][] = [];\n\n\t\tif (this.state.intervals.length === 0) {\n\t\t\tif (this.skipCheck === false) {\n\t\t\t\tthrow new RangeError(\n\t\t\t\t\t'generateUniqueInt: count exceeds max number of unique integers in given range(min, max), try to increase range.',\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t[intervalIdx, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t0,\n\t\t\tthis.state.intervals.length - 1,\n\t\t\tthis.state.rng,\n\t\t);\n\n\t\tconst interval = this.state.intervals[intervalIdx] as (number | bigint)[];\n\t\tconst [currMinNumb, currMaxNumb] = [interval[0] as number | bigint, interval[1] as number | bigint];\n\n\t\tif (typeof currMinNumb === 'number' && typeof currMaxNumb === 'number') {\n\t\t\tnumb = this.generateNumber(currMinNumb, currMaxNumb, intervalsToAdd as number[][], intervalIdx);\n\t\t} else if (typeof currMinNumb === 'bigint' && typeof currMaxNumb === 'bigint') {\n\t\t\tnumb = this.generateBigint(\n\t\t\t\tcurrMinNumb as bigint,\n\t\t\t\tcurrMaxNumb as bigint,\n\t\t\t\tintervalsToAdd as bigint[][],\n\t\t\t\tintervalIdx,\n\t\t\t);\n\t\t}\n\n\t\tif (this.dataType === 'string') {\n\t\t\treturn String(numb);\n\t\t}\n\n\t\tif (this.dataType === 'bigint' && numb !== undefined) {\n\t\t\tnumb = BigInt(numb);\n\t\t}\n\t\treturn numb;\n\t}\n\n\tgenerateNumber(currMinNumb: number, currMaxNumb: number, intervalsToAdd: number[][], intervalIdx: number) {\n\t\tlet numb: number;\n\n\t\t[numb, this.state!.rng] = prand.uniformIntDistribution(currMinNumb, currMaxNumb, this.state!.rng);\n\n\t\tif (this.genMaxRepeatedValuesCount !== undefined) {\n\t\t\tif (this.state!.integersCount.get(numb) === undefined) {\n\t\t\t\tthis.state!.integersCount.set(numb, this.genMaxRepeatedValuesCount.generate() as number);\n\t\t\t}\n\t\t\tthis.state!.integersCount.set(numb, this.state!.integersCount.get(numb)! - 1);\n\t\t}\n\n\t\tif (this.state!.integersCount.get(numb) === undefined || this.state!.integersCount.get(numb) === 0) {\n\t\t\tif (numb === currMinNumb) {\n\t\t\t\tintervalsToAdd = numb + 1 <= currMaxNumb ? [[numb + 1, currMaxNumb]] : [];\n\t\t\t} else if (numb === currMaxNumb) {\n\t\t\t\tintervalsToAdd = [[currMinNumb, numb - 1]];\n\t\t\t} else {\n\t\t\t\tintervalsToAdd = [\n\t\t\t\t\t[currMinNumb, numb - 1],\n\t\t\t\t\t[numb + 1, currMaxNumb],\n\t\t\t\t];\n\t\t\t}\n\n\t\t\tconst t0 = new Date();\n\t\t\tthis.state!.intervals[intervalIdx] = this.state!.intervals[this.state!.intervals.length - 1]!;\n\t\t\tthis.state?.intervals.pop();\n\t\t\tthis.timeSpent += (Date.now() - t0.getTime()) / 1000;\n\t\t\tthis.state!.intervals.push(...intervalsToAdd);\n\t\t}\n\n\t\treturn numb;\n\t}\n\n\tgenerateBigint(currMinNumb: bigint, currMaxNumb: bigint, intervalsToAdd: bigint[][], intervalIdx: number) {\n\t\tlet numb: bigint;\n\t\t[numb, this.state!.rng] = prand.uniformBigIntDistribution(currMinNumb, currMaxNumb, this.state!.rng);\n\t\tif (this.genMaxRepeatedValuesCount !== undefined) {\n\t\t\tif (this.state!.integersCount.get(numb) === undefined) {\n\t\t\t\tthis.state!.integersCount.set(numb, this.genMaxRepeatedValuesCount.generate() as number);\n\t\t\t}\n\t\t\tthis.state!.integersCount.set(numb, this.state!.integersCount.get(numb)! - 1);\n\t\t}\n\n\t\tif (this.state!.integersCount.get(numb) === undefined || this.state!.integersCount.get(numb) === 0) {\n\t\t\tif (numb === currMinNumb) {\n\t\t\t\tintervalsToAdd = numb + BigInt(1) <= currMaxNumb ? [[numb + BigInt(1), currMaxNumb]] : [];\n\t\t\t} else if (numb === currMaxNumb) {\n\t\t\t\tintervalsToAdd = [[currMinNumb, numb - BigInt(1)]];\n\t\t\t} else {\n\t\t\t\tintervalsToAdd = [\n\t\t\t\t\t[currMinNumb, numb - BigInt(1)],\n\t\t\t\t\t[numb + BigInt(1), currMaxNumb],\n\t\t\t\t];\n\t\t\t}\n\n\t\t\tthis.state!.intervals[intervalIdx] = this.state!.intervals[this.state!.intervals.length - 1]!;\n\t\t\tthis.state?.intervals.pop();\n\t\t\tthis.state!.intervals.push(...intervalsToAdd);\n\t\t}\n\n\t\treturn numb;\n\t}\n}\n\nexport class GenerateBoolean extends AbstractGenerator<{ arraySize?: number }> {\n\tstatic override readonly entityKind: string = 'GenerateBoolean';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet value: number;\n\n\t\t[value, this.state.rng] = prand.uniformIntDistribution(0, 1, this.state.rng);\n\t\treturn value === 1;\n\t}\n}\n\nexport class GenerateDate extends AbstractGenerator<{\n\tminDate?: string | Date;\n\tmaxDate?: string | Date;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateDate';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tminDate: Date;\n\t\tmaxDate: Date;\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tlet { minDate, maxDate } = this.params;\n\n\t\tconst anchorDate = new Date('2024-05-08');\n\t\tconst deltaMilliseconds = 4 * 31536000000;\n\n\t\tif (typeof minDate === 'string') {\n\t\t\tminDate = new Date(minDate);\n\t\t}\n\n\t\tif (typeof maxDate === 'string') {\n\t\t\tmaxDate = new Date(maxDate);\n\t\t}\n\n\t\tif (minDate === undefined) {\n\t\t\tif (maxDate === undefined) {\n\t\t\t\tminDate = new Date(anchorDate.getTime() - deltaMilliseconds);\n\t\t\t\tmaxDate = new Date(anchorDate.getTime() + deltaMilliseconds);\n\t\t\t} else {\n\t\t\t\tminDate = new Date(maxDate.getTime() - (2 * deltaMilliseconds));\n\t\t\t}\n\t\t}\n\n\t\tif (maxDate === undefined) {\n\t\t\tmaxDate = new Date(minDate.getTime() + (2 * deltaMilliseconds));\n\t\t}\n\n\t\tthis.state = { rng, minDate, maxDate };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet milliseconds: number;\n\n\t\t[milliseconds, this.state.rng] = prand.uniformIntDistribution(\n\t\t\tthis.state.minDate.getTime(),\n\t\t\tthis.state.maxDate.getTime(),\n\t\t\tthis.state.rng,\n\t\t);\n\t\tconst date = new Date(milliseconds);\n\n\t\tif (this.dataType === 'string') {\n\t\t\treturn date.toISOString().replace(/T.+/, '');\n\t\t}\n\t\treturn date;\n\t}\n}\nexport class GenerateTime extends AbstractGenerator<{ arraySize?: number }> {\n\tstatic override readonly entityKind: string = 'GenerateTime';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst anchorDateTime = new Date('2024-05-08T12:00:00.000Z');\n\t\tconst oneDayInMilliseconds = 86400000;\n\n\t\tlet date = new Date();\n\t\tlet milliseconds: number;\n\n\t\t[milliseconds, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t-oneDayInMilliseconds,\n\t\t\toneDayInMilliseconds,\n\t\t\tthis.state.rng,\n\t\t);\n\t\tdate = new Date(date.setTime(anchorDateTime.getTime() + milliseconds));\n\n\t\treturn date.toISOString().replace(/(\\d{4}-\\d{2}-\\d{2}T)|(\\.\\d{3}Z)/g, '');\n\t}\n}\nexport class GenerateTimestampInt extends AbstractGenerator<{ unitOfTime?: 'seconds' | 'milliseconds' }> {\n\tstatic override readonly entityKind: string = 'GenerateTimestampInt';\n\n\tprivate state: {\n\t\tgenerateTimestampObj: GenerateTimestamp;\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tconst generateTimestampObj = new GenerateTimestamp({});\n\t\tgenerateTimestampObj.dataType = 'date';\n\t\tgenerateTimestampObj.init({ count, seed });\n\n\t\tthis.state = { generateTimestampObj };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst date = this.state.generateTimestampObj.generate() as Date;\n\n\t\tif (this.params.unitOfTime === 'seconds') {\n\t\t\treturn Math.floor(date.getTime() / 1000);\n\t\t} else if (this.params.unitOfTime === 'milliseconds') {\n\t\t\treturn date.getTime();\n\t\t} else {\n\t\t\t// this.params.unitOfTime === undefined\n\t\t\treturn Math.floor(date.getTime() / 1000);\n\t\t}\n\t}\n}\n\nexport class GenerateTimestamp extends AbstractGenerator<{ arraySize?: number }> {\n\tstatic override readonly entityKind: string = 'GenerateTimestamp';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst anchorTimestamp = new Date('2024-05-08');\n\t\tconst twoYearsInMilliseconds = 2 * 31536000000;\n\n\t\tlet date = new Date();\n\t\tlet milliseconds: number;\n\n\t\t[milliseconds, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t-twoYearsInMilliseconds,\n\t\t\ttwoYearsInMilliseconds,\n\t\t\tthis.state.rng,\n\t\t);\n\t\tdate = new Date(date.setTime(anchorTimestamp.getTime() + milliseconds));\n\n\t\tif (this.dataType === 'string') {\n\t\t\treturn date\n\t\t\t\t.toISOString()\n\t\t\t\t.replace('T', ' ')\n\t\t\t\t.replace(/\\.\\d{3}Z/, '');\n\t\t}\n\n\t\treturn date;\n\t}\n}\n\nexport class GenerateDatetime extends AbstractGenerator<{ arraySize?: number }> {\n\tstatic override readonly entityKind: string = 'GenerateDatetime';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst anchorDate = new Date('2024-05-08');\n\t\tconst twoYearsInMilliseconds = 2 * 31536000000;\n\n\t\tlet date = new Date();\n\t\tlet milliseconds: number;\n\n\t\t[milliseconds, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t-twoYearsInMilliseconds,\n\t\t\ttwoYearsInMilliseconds,\n\t\t\tthis.state.rng,\n\t\t);\n\t\tdate = new Date(date.setTime(anchorDate.getTime() + milliseconds));\n\n\t\tif (this.dataType === 'string') {\n\t\t\treturn date\n\t\t\t\t.toISOString()\n\t\t\t\t.replace('T', ' ')\n\t\t\t\t.replace(/\\.\\d{3}Z/, '');\n\t\t}\n\n\t\treturn date;\n\t}\n}\n\nexport class GenerateYear extends AbstractGenerator<{ arraySize?: number }> {\n\tstatic override readonly entityKind: string = 'GenerateYear';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst anchorDate = new Date('2024-05-08');\n\t\tconst tenYears = 10;\n\n\t\tlet date = new Date();\n\t\tlet years: number;\n\n\t\t[years, this.state.rng] = prand.uniformIntDistribution(-tenYears, tenYears, this.state.rng);\n\t\tdate = new Date(date.setFullYear(anchorDate.getFullYear() + years));\n\n\t\treturn date\n\t\t\t.toISOString()\n\t\t\t.replace(/(-\\d{2}-\\d{2}T)|(\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z)/g, '');\n\t}\n}\n\nexport class GenerateJson extends AbstractGenerator<{ arraySize?: number }> {\n\tstatic override readonly entityKind: string = 'GenerateJson';\n\n\tprivate state: {\n\t\temailGeneratorObj: GenerateEmail;\n\t\tnameGeneratorObj: GenerateFirstName;\n\t\tbooleanGeneratorObj: GenerateBoolean;\n\t\tsalaryGeneratorObj: GenerateInt;\n\t\tdateGeneratorObj: GenerateDate;\n\t\tvisitedCountriesNumberGeneratorObj: GenerateInt;\n\t\tseed: number;\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst emailGeneratorObj = new GenerateEmail({});\n\t\temailGeneratorObj.init({ count, seed });\n\n\t\tconst nameGeneratorObj = new GenerateFirstName({});\n\t\tnameGeneratorObj.init({ count, seed });\n\n\t\tconst booleanGeneratorObj = new GenerateBoolean({});\n\t\tbooleanGeneratorObj.init({\n\t\t\tcount,\n\t\t\tseed,\n\t\t});\n\n\t\tconst salaryGeneratorObj = new GenerateInt({ minValue: 200, maxValue: 4000 });\n\t\tsalaryGeneratorObj.init({\n\t\t\tcount,\n\t\t\tseed,\n\t\t\t...salaryGeneratorObj.params,\n\t\t});\n\n\t\tconst dateGeneratorObj = new GenerateDate({});\n\t\tdateGeneratorObj.dataType = 'string';\n\t\tdateGeneratorObj.init({ count, seed });\n\n\t\tconst visitedCountriesNumberGeneratorObj = new GenerateInt({ minValue: 0, maxValue: 4 });\n\t\tvisitedCountriesNumberGeneratorObj.init(\n\t\t\t{ count, seed, ...visitedCountriesNumberGeneratorObj.params },\n\t\t);\n\n\t\tthis.state = {\n\t\t\temailGeneratorObj,\n\t\t\tnameGeneratorObj,\n\t\t\tbooleanGeneratorObj,\n\t\t\tsalaryGeneratorObj,\n\t\t\tdateGeneratorObj,\n\t\t\tvisitedCountriesNumberGeneratorObj,\n\t\t\tseed,\n\t\t};\n\t}\n\n\tgenerate({ i }: { i: number }) {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst visitedCountries: string[] = [];\n\t\tconst email = this.state.emailGeneratorObj.generate();\n\t\tconst name = this.state.nameGeneratorObj.generate();\n\t\tconst isGraduated = this.state.booleanGeneratorObj.generate();\n\t\tconst hasJob = this.state.booleanGeneratorObj.generate();\n\t\tconst salary = this.state.salaryGeneratorObj.generate() as number;\n\t\tconst startedWorking = this.state.dateGeneratorObj.generate() as string;\n\t\tconst visitedCountriesNumber = this.state.visitedCountriesNumberGeneratorObj.generate() as number;\n\n\t\tconst uniqueCountriesGeneratorObj = new GenerateUniqueCountry({});\n\t\tuniqueCountriesGeneratorObj.init({\n\t\t\tcount: visitedCountriesNumber,\n\t\t\tseed: this.state.seed + i,\n\t\t});\n\t\tfor (let j = 0; j < visitedCountriesNumber; j++) {\n\t\t\tvisitedCountries.push(uniqueCountriesGeneratorObj.generate());\n\t\t}\n\n\t\tconst returnJson = hasJob\n\t\t\t? {\n\t\t\t\temail,\n\t\t\t\tname,\n\t\t\t\tisGraduated,\n\t\t\t\thasJob,\n\t\t\t\tsalary,\n\t\t\t\tstartedWorking,\n\t\t\t\tvisitedCountries,\n\t\t\t}\n\t\t\t: {\n\t\t\t\temail,\n\t\t\t\tname,\n\t\t\t\tisGraduated,\n\t\t\t\thasJob,\n\t\t\t\tvisitedCountries,\n\t\t\t};\n\n\t\tif (this.dataType === 'string') {\n\t\t\treturn JSON.stringify(returnJson);\n\t\t}\n\n\t\treturn returnJson;\n\t}\n}\n\nexport class GenerateEnum extends AbstractGenerator<{ enumValues: (string | number | boolean)[] }> {\n\tstatic override readonly entityKind: string = 'GenerateEnum';\n\n\tprivate state: {\n\t\tenumValuesGenerator: GenerateValuesFromArray;\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tconst { enumValues } = this.params;\n\t\tconst enumValuesGenerator = new GenerateValuesFromArray({ values: enumValues });\n\t\tenumValuesGenerator.init({ count, seed });\n\t\tthis.state = { enumValuesGenerator };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\t\t// logic for this generator\n\t\treturn this.state.enumValuesGenerator.generate();\n\t}\n}\n\nexport class GenerateInterval extends AbstractGenerator<{\n\tfields?:\n\t\t| 'year'\n\t\t| 'month'\n\t\t| 'day'\n\t\t| 'hour'\n\t\t| 'minute'\n\t\t| 'second'\n\t\t| 'year to month'\n\t\t| 'day to hour'\n\t\t| 'day to minute'\n\t\t| 'day to second'\n\t\t| 'hour to minute'\n\t\t| 'hour to second'\n\t\t| 'minute to second';\n\tisUnique?: boolean;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateInterval';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tfieldsToGenerate: string[];\n\t} | undefined;\n\toverride uniqueVersionOfGen: new(params: any) => AbstractGenerator<any> = GenerateUniqueInterval;\n\tprivate config: { [key: string]: { from: number; to: number } } = {\n\t\tyear: {\n\t\t\tfrom: 0,\n\t\t\tto: 5,\n\t\t},\n\t\tmonth: {\n\t\t\tfrom: 0,\n\t\t\tto: 12,\n\t\t},\n\t\tday: {\n\t\t\tfrom: 1,\n\t\t\tto: 29,\n\t\t},\n\t\thour: {\n\t\t\tfrom: 0,\n\t\t\tto: 24,\n\t\t},\n\t\tminute: {\n\t\t\tfrom: 0,\n\t\t\tto: 60,\n\t\t},\n\t\tsecond: {\n\t\t\tfrom: 0,\n\t\t\tto: 60,\n\t\t},\n\t};\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst allFields = ['year', 'month', 'day', 'hour', 'minute', 'second'];\n\t\tlet fieldsToGenerate: string[] = allFields;\n\n\t\tif (this.params.fields !== undefined && this.params.fields?.includes(' to ')) {\n\t\t\tconst tokens = this.params.fields.split(' to ');\n\t\t\tconst endIdx = allFields.indexOf(tokens[1]!);\n\t\t\tfieldsToGenerate = allFields.slice(0, endIdx + 1);\n\t\t} else if (this.params.fields !== undefined) {\n\t\t\tconst endIdx = allFields.indexOf(this.params.fields);\n\t\t\tfieldsToGenerate = allFields.slice(0, endIdx + 1);\n\t\t}\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tthis.state = { rng, fieldsToGenerate };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet interval = '', numb: number;\n\n\t\tfor (const field of this.state.fieldsToGenerate) {\n\t\t\tconst from = this.config[field]!.from, to = this.config[field]!.to;\n\t\t\t[numb, this.state.rng] = prand.uniformIntDistribution(from, to, this.state.rng);\n\t\t\tinterval += `${numb} ${field} `;\n\t\t}\n\n\t\treturn interval;\n\t}\n}\n\n// has a newer version\nexport class GenerateUniqueInterval extends AbstractGenerator<{\n\tfields?:\n\t\t| 'year'\n\t\t| 'month'\n\t\t| 'day'\n\t\t| 'hour'\n\t\t| 'minute'\n\t\t| 'second'\n\t\t| 'year to month'\n\t\t| 'day to hour'\n\t\t| 'day to minute'\n\t\t| 'day to second'\n\t\t| 'hour to minute'\n\t\t| 'hour to second'\n\t\t| 'minute to second';\n\tisUnique?: boolean;\n}> {\n\tstatic override readonly 'entityKind': string = 'GenerateUniqueInterval';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tfieldsToGenerate: string[];\n\t\tintervalSet: Set<string>;\n\t} | undefined;\n\tpublic override isUnique = true;\n\tprivate config: { [key: string]: { from: number; to: number } } = {\n\t\tyear: {\n\t\t\tfrom: 0,\n\t\t\tto: 5,\n\t\t},\n\t\tmonth: {\n\t\t\tfrom: 0,\n\t\t\tto: 12,\n\t\t},\n\t\tday: {\n\t\t\tfrom: 1,\n\t\t\tto: 29,\n\t\t},\n\t\thour: {\n\t\t\tfrom: 0,\n\t\t\tto: 24,\n\t\t},\n\t\tminute: {\n\t\t\tfrom: 0,\n\t\t\tto: 60,\n\t\t},\n\t\tsecond: {\n\t\t\tfrom: 0,\n\t\t\tto: 60,\n\t\t},\n\t};\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tconst allFields = ['year', 'month', 'day', 'hour', 'minute', 'second'];\n\t\tlet fieldsToGenerate: string[] = allFields;\n\n\t\tif (this.params.fields !== undefined && this.params.fields?.includes(' to ')) {\n\t\t\tconst tokens = this.params.fields.split(' to ');\n\t\t\tconst endIdx = allFields.indexOf(tokens[1]!);\n\t\t\tfieldsToGenerate = allFields.slice(0, endIdx + 1);\n\t\t} else if (this.params.fields !== undefined) {\n\t\t\tconst endIdx = allFields.indexOf(this.params.fields);\n\t\t\tfieldsToGenerate = allFields.slice(0, endIdx + 1);\n\t\t}\n\n\t\tlet maxUniqueIntervalsNumber = 1;\n\t\tfor (const field of fieldsToGenerate) {\n\t\t\tconst from = this.config[field]!.from, to = this.config[field]!.to;\n\t\t\tmaxUniqueIntervalsNumber *= from - to + 1;\n\t\t}\n\n\t\tif (count > maxUniqueIntervalsNumber) {\n\t\t\tthrow new RangeError(`count exceeds max number of unique intervals(${maxUniqueIntervalsNumber})`);\n\t\t}\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tconst intervalSet = new Set<string>();\n\t\tthis.state = { rng, fieldsToGenerate, intervalSet };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet interval, numb: number;\n\n\t\tfor (;;) {\n\t\t\tinterval = '';\n\n\t\t\tfor (const field of this.state.fieldsToGenerate) {\n\t\t\t\tconst from = this.config[field]!.from, to = this.config[field]!.to;\n\t\t\t\t[numb, this.state.rng] = prand.uniformIntDistribution(from, to, this.state.rng);\n\t\t\t\tinterval += `${numb} ${field} `;\n\t\t\t}\n\n\t\t\tif (!this.state.intervalSet.has(interval)) {\n\t\t\t\tthis.state.intervalSet.add(interval);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn interval;\n\t}\n}\n\n// has a newer version\nexport class GenerateString extends AbstractGenerator<{\n\tisUnique?: boolean;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateString';\n\n\tprivate state: { rng: prand.RandomGenerator } | undefined;\n\toverride uniqueVersionOfGen = GenerateUniqueString;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst minStringLength = 7;\n\t\tconst maxStringLength = 20;\n\t\tconst stringChars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\t\tlet idx: number,\n\t\t\tstrLength: number,\n\t\t\tcurrStr: string;\n\n\t\tcurrStr = '';\n\t\t[strLength, this.state.rng] = prand.uniformIntDistribution(\n\t\t\tminStringLength,\n\t\t\tmaxStringLength,\n\t\t\tthis.state.rng,\n\t\t);\n\t\tfor (let j = 0; j < strLength; j++) {\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t\t0,\n\t\t\t\tstringChars.length - 1,\n\t\t\t\tthis.state.rng,\n\t\t\t);\n\t\t\tcurrStr += stringChars[idx];\n\t\t}\n\t\treturn currStr;\n\t}\n}\n\n// has a newer version\nexport class GenerateUniqueString extends AbstractGenerator<{ isUnique?: boolean }> {\n\tstatic override readonly entityKind: string = 'GenerateUniqueString';\n\n\tprivate state: { rng: prand.RandomGenerator } | undefined;\n\tpublic override isUnique = true;\n\n\toverride init({ seed }: { seed: number }) {\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate({ i }: { i: number }) {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst minStringLength = 7;\n\t\tconst maxStringLength = 20;\n\t\tconst stringChars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\t\tlet idx: number,\n\t\t\tstrLength: number;\n\t\tlet currStr: string;\n\n\t\tcurrStr = '';\n\t\tconst uniqueStr = i.toString(16);\n\t\t[strLength, this.state.rng] = prand.uniformIntDistribution(\n\t\t\tminStringLength,\n\t\t\tmaxStringLength - uniqueStr.length,\n\t\t\tthis.state.rng,\n\t\t);\n\t\tfor (let j = 0; j < strLength - uniqueStr.length; j++) {\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t\t0,\n\t\t\t\tstringChars.length - 1,\n\t\t\t\tthis.state.rng,\n\t\t\t);\n\t\t\tcurrStr += stringChars[idx];\n\t\t}\n\n\t\treturn currStr.slice(0, 4) + uniqueStr + currStr.slice(4);\n\t}\n}\n\nexport class GenerateUUID extends AbstractGenerator<{\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateUUID';\n\n\tpublic override isUnique = true;\n\n\tprivate state: { rng: prand.RandomGenerator } | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\t\t// TODO generate uuid using string generator\n\t\tconst stringChars = '1234567890abcdef';\n\t\tlet idx: number,\n\t\t\tcurrStr: string;\n\t\tconst strLength = 36;\n\n\t\t// uuid v4\n\t\tconst uuidTemplate = '########-####-4###-####-############';\n\t\tcurrStr = '';\n\t\tfor (let i = 0; i < strLength; i++) {\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t\t0,\n\t\t\t\tstringChars.length - 1,\n\t\t\t\tthis.state.rng,\n\t\t\t);\n\n\t\t\tif (uuidTemplate[i] === '#') {\n\t\t\t\tcurrStr += stringChars[idx];\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcurrStr += uuidTemplate[i];\n\t\t}\n\t\treturn currStr;\n\t}\n}\n\nexport class GenerateFirstName extends AbstractGenerator<{\n\tisUnique?: boolean;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateFirstName';\n\n\toverride timeSpent: number = 0;\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\toverride uniqueVersionOfGen = GenerateUniqueFirstName;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tif (this.stringLength !== undefined && this.stringLength < maxFirstNameLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use first name generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxFirstNameLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\t// logic for this generator\n\t\t// names dataset contains about 30000 unique names.\n\t\tlet idx: number;\n\n\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, firstNames.length - 1, this.state.rng);\n\t\treturn firstNames[idx] as string;\n\t}\n}\n\nexport class GenerateUniqueFirstName extends AbstractGenerator<{\n\tisUnique?: boolean;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateUniqueFirstName';\n\n\tprivate state: {\n\t\tgenIndicesObj: GenerateUniqueInt;\n\t} | undefined;\n\tpublic override isUnique = true;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tif (count > firstNames.length) {\n\t\t\tthrow new Error('count exceeds max number of unique first names.');\n\t\t}\n\n\t\tif (this.stringLength !== undefined && this.stringLength < maxFirstNameLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use first name generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxFirstNameLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tconst genIndicesObj = new GenerateUniqueInt({ minValue: 0, maxValue: firstNames.length - 1 });\n\t\tgenIndicesObj.init({ count, seed });\n\n\t\tthis.state = { genIndicesObj };\n\t}\n\n\tgenerate() {\n\t\t// names dataset contains about 30000 unique names.\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst nameIdx = this.state.genIndicesObj.generate() as number;\n\t\tconst name = firstNames[nameIdx] as string;\n\n\t\treturn name;\n\t}\n}\n\nexport class GenerateLastName extends AbstractGenerator<{\n\tisUnique?: boolean;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateLastName';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\toverride uniqueVersionOfGen = GenerateUniqueLastName;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tif (this.stringLength !== undefined && this.stringLength < maxLastNameLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use last name generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxLastNameLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tthis.state = { rng };\n\t}\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet idx: number;\n\n\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, lastNames.length - 1, this.state.rng);\n\t\treturn lastNames[idx];\n\t}\n}\n\nexport class GenerateUniqueLastName extends AbstractGenerator<{ isUnique?: boolean }> {\n\tstatic override readonly entityKind: string = 'GenerateUniqueLastName';\n\n\tprivate state: {\n\t\tgenIndicesObj: GenerateUniqueInt;\n\t} | undefined;\n\tpublic override isUnique = true;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tif (count > lastNames.length) {\n\t\t\tthrow new Error('count exceeds max number of unique last names.');\n\t\t}\n\n\t\tif (this.stringLength !== undefined && this.stringLength < maxLastNameLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use last name generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxLastNameLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tconst genIndicesObj = new GenerateUniqueInt({ minValue: 0, maxValue: lastNames.length - 1 });\n\t\tgenIndicesObj.init({ count, seed });\n\n\t\tthis.state = { genIndicesObj };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst surnameIdx = this.state.genIndicesObj.generate() as number;\n\t\tconst surname = lastNames[surnameIdx] as string;\n\n\t\treturn surname;\n\t}\n}\n\nexport class GenerateFullName extends AbstractGenerator<{\n\tisUnique?: boolean;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateFullName';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\toverride uniqueVersionOfGen = GenerateUniqueFullName;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tif (this.stringLength !== undefined && this.stringLength < (maxFirstNameLength + maxLastNameLength + 1)) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use full name generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${\n\t\t\t\t\tmaxFirstNameLength + maxLastNameLength + 1\n\t\t\t\t}.`,\n\t\t\t);\n\t\t}\n\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet idx: number;\n\n\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, firstNames.length - 1, this.state.rng);\n\t\tconst name = firstNames[idx] as string;\n\n\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, lastNames.length - 1, this.state.rng);\n\t\tconst surname = lastNames[idx] as string;\n\n\t\tconst fullName = `${name} ${surname}`;\n\n\t\treturn fullName;\n\t}\n}\n\nexport class GenerateUniqueFullName extends AbstractGenerator<{\n\tisUnique?: boolean;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateUniqueFullName';\n\n\tprivate state: {\n\t\tfullnameSet: Set<string>;\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\tpublic override isUnique = true;\n\tpublic override timeSpent = 0;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tconst t0 = new Date();\n\n\t\tconst maxUniqueFullNamesNumber = firstNames.length * lastNames.length;\n\t\tif (count > maxUniqueFullNamesNumber) {\n\t\t\tthrow new RangeError(\n\t\t\t\t`count exceeds max number of unique full names(${maxUniqueFullNamesNumber}).`,\n\t\t\t);\n\t\t}\n\n\t\tif (this.stringLength !== undefined && this.stringLength < (maxFirstNameLength + maxLastNameLength + 1)) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use full name generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${\n\t\t\t\t\tmaxFirstNameLength + maxLastNameLength + 1\n\t\t\t\t}.`,\n\t\t\t);\n\t\t}\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tconst fullnameSet = new Set<string>();\n\n\t\tthis.state = { rng, fullnameSet };\n\t\tthis.timeSpent += (Date.now() - t0.getTime()) / 1000;\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet fullname: string, name: string, surname: string, idx: number;\n\n\t\tconst t0 = new Date();\n\t\tfor (;;) {\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, firstNames.length - 1, this.state.rng);\n\t\t\tname = firstNames[idx] as string;\n\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, lastNames.length - 1, this.state.rng);\n\t\t\tsurname = lastNames[idx] as string;\n\n\t\t\tfullname = `${name} ${surname}`;\n\n\t\t\tif (!this.state.fullnameSet.has(fullname)) {\n\t\t\t\tthis.state.fullnameSet.add(fullname);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.timeSpent += (Date.now() - t0.getTime()) / 1000;\n\t\treturn fullname;\n\t}\n}\n\nexport class GenerateEmail extends AbstractGenerator<{\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateEmail';\n\n\tprivate state: {\n\t\tgenIndicesObj: GenerateUniqueInt;\n\t\tarraysToGenerateFrom: string[][];\n\t} | undefined;\n\tpublic override timeSpent: number = 0;\n\tpublic override isUnique = true;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst domainsArray = emailDomains;\n\t\tconst adjectivesArray = adjectives;\n\t\tconst namesArray = firstNames;\n\n\t\tconst maxUniqueEmailsNumber = adjectivesArray.length * namesArray.length * domainsArray.length;\n\t\tif (count > maxUniqueEmailsNumber) {\n\t\t\tthrow new RangeError(\n\t\t\t\t`count exceeds max number of unique emails(${maxUniqueEmailsNumber}).`,\n\t\t\t);\n\t\t}\n\n\t\tconst maxEmailLength = maxAdjectiveLength + maxFirstNameLength + maxEmailDomainLength + 2;\n\t\tif (this.stringLength !== undefined && this.stringLength < maxEmailLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use email generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxEmailLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tconst arraysToGenerateFrom = [adjectivesArray, namesArray, domainsArray];\n\t\tconst genIndicesObj = new GenerateUniqueInt({\n\t\t\tminValue: 0,\n\t\t\tmaxValue: maxUniqueEmailsNumber - 1,\n\t\t});\n\t\tgenIndicesObj.init({ count, seed });\n\n\t\tthis.state = { genIndicesObj, arraysToGenerateFrom };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst t0 = new Date();\n\t\tconst emailIndex = this.state.genIndicesObj.generate() as number;\n\t\tthis.timeSpent += (Date.now() - t0.getTime()) / 1000;\n\t\tconst tokens = fastCartesianProduct(\n\t\t\tthis.state.arraysToGenerateFrom,\n\t\t\temailIndex,\n\t\t) as string[];\n\n\t\tconst [adjective, name, domain] = [tokens[0] as string, tokens[1] as string, tokens[2] as string];\n\n\t\tconst email = `${adjective}_${name.toLowerCase()}@${domain}`;\n\n\t\treturn email;\n\t}\n}\n\nexport class GeneratePhoneNumber extends AbstractGenerator<{\n\ttemplate?: string;\n\tprefixes?: string[];\n\tgeneratedDigitsNumbers?: number | number[];\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GeneratePhoneNumber';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tplaceholdersCount?: number;\n\t\tprefixesArray: string[];\n\t\tgeneratedDigitsNumbers: number[];\n\t\tgeneratorsMap: Map<string, GenerateUniqueInt>;\n\t\tphoneNumbersSet: Set<string>;\n\t} | undefined;\n\tpublic override isUnique = true;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tlet { generatedDigitsNumbers } = this.params;\n\t\tconst { prefixes, template } = this.params;\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tif (template !== undefined) {\n\t\t\tif (this.stringLength !== undefined && this.stringLength < template.length) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Length of phone number template is shorter than db column length restriction: ${this.stringLength}. \n\t\t\t\t\tSet the maximum string length to at least ${template.length}.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst iterArray = [...template.matchAll(/#/g)];\n\t\t\tconst placeholdersCount = iterArray.length;\n\n\t\t\tconst maxUniquePhoneNumbersCount = Math.pow(10, placeholdersCount);\n\t\t\tif (maxUniquePhoneNumbersCount < count) {\n\t\t\t\tthrow new RangeError(\n\t\t\t\t\t`count exceeds max number of unique phone numbers(${maxUniquePhoneNumbersCount}).`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst generatorsMap = new Map<string, GenerateUniqueInt>();\n\t\t\tconst genObj = new GenerateUniqueInt({ minValue: 0, maxValue: maxUniquePhoneNumbersCount - 1 });\n\t\t\tgenObj.init({\n\t\t\t\tcount,\n\t\t\t\tseed,\n\t\t\t});\n\n\t\t\tgeneratorsMap.set(\n\t\t\t\ttemplate,\n\t\t\t\tgenObj,\n\t\t\t);\n\n\t\t\tconst prefixesArray: string[] = [];\n\t\t\tconst generatedDigitsNumbers: number[] = [];\n\t\t\tconst phoneNumbersSet = new Set<string>();\n\n\t\t\tthis.state = { rng, placeholdersCount, generatorsMap, prefixesArray, generatedDigitsNumbers, phoneNumbersSet };\n\t\t\treturn;\n\t\t}\n\n\t\tlet prefixesArray: string[];\n\t\tif (prefixes === undefined || prefixes.length === 0) {\n\t\t\tprefixesArray = phonesInfo.map((phoneInfo) => phoneInfo.split(',').slice(0, -1).join(' '));\n\t\t\tgeneratedDigitsNumbers = phonesInfo.map((phoneInfo) => {\n\t\t\t\t// tokens = [\"380\",\"99\",\"9\"] =\n\t\t\t\t// = [\"country prefix\", \"operator prefix\", \"number length including operator prefix and excluding country prefix\"]\n\t\t\t\tconst tokens = phoneInfo.split(',');\n\t\t\t\tconst operatorPrefixLength = tokens[1]!.replaceAll(' ', '').length;\n\n\t\t\t\treturn Number(tokens[2]) - operatorPrefixLength;\n\t\t\t});\n\t\t} else {\n\t\t\tprefixesArray = prefixes;\n\t\t\tif (typeof generatedDigitsNumbers === 'number') {\n\t\t\t\tgeneratedDigitsNumbers = Array.from<number>({ length: prefixes.length }).fill(\n\t\t\t\t\tgeneratedDigitsNumbers,\n\t\t\t\t);\n\t\t\t} else if (\n\t\t\t\tgeneratedDigitsNumbers === undefined\n\t\t\t\t|| generatedDigitsNumbers.length === 0\n\t\t\t) {\n\t\t\t\tgeneratedDigitsNumbers = Array.from<number>({ length: prefixes.length }).fill(7);\n\t\t\t}\n\t\t}\n\n\t\tconst maxPrefixLength = Math.max(...prefixesArray.map((prefix) => prefix.length));\n\t\tconst maxGeneratedDigits = Math.max(...generatedDigitsNumbers);\n\n\t\tif (this.stringLength !== undefined && this.stringLength < (maxPrefixLength + maxGeneratedDigits)) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use phone number generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${\n\t\t\t\t\tmaxPrefixLength + maxGeneratedDigits\n\t\t\t\t}.`,\n\t\t\t);\n\t\t}\n\n\t\tif (new Set(prefixesArray).size !== prefixesArray.length) {\n\t\t\tthrow new Error('prefixes are not unique.');\n\t\t}\n\n\t\tconst maxUniquePhoneNumbersCount = generatedDigitsNumbers.reduce(\n\t\t\t(a, b) => a + Math.pow(10, b),\n\t\t\t0,\n\t\t);\n\t\tif (maxUniquePhoneNumbersCount < count) {\n\t\t\tthrow new RangeError(\n\t\t\t\t`count exceeds max number of unique phone numbers(${maxUniquePhoneNumbersCount}).`,\n\t\t\t);\n\t\t}\n\n\t\tconst generatorsMap = new Map<string, GenerateUniqueInt>();\n\t\tlet maxValue: number, prefix: string, generatedDigitsNumber: number;\n\t\tfor (const [i, element] of prefixesArray.entries()) {\n\t\t\tprefix = element as string;\n\t\t\tgeneratedDigitsNumber = generatedDigitsNumbers[i] as number;\n\t\t\tmaxValue = Math.pow(10, generatedDigitsNumber) - 1;\n\n\t\t\tif (!generatorsMap.has(prefix)) {\n\t\t\t\tconst genObj = new GenerateUniqueInt({ minValue: 0, maxValue });\n\t\t\t\tgenObj.init({\n\t\t\t\t\tcount: Math.min(count, maxValue + 1),\n\t\t\t\t\tseed,\n\t\t\t\t});\n\t\t\t\tgenObj.skipCheck = true;\n\t\t\t\tgeneratorsMap.set(\n\t\t\t\t\tprefix,\n\t\t\t\t\tgenObj,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst phoneNumbersSet = new Set<string>();\n\n\t\tthis.state = { rng, prefixesArray, generatedDigitsNumbers, generatorsMap, phoneNumbersSet };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet prefix: string, generatedDigitsNumber: number, numberBody: string, phoneNumber: string, idx: number;\n\n\t\tif (this.params.template === undefined) {\n\t\t\tfor (;;) {\n\t\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t\t\t0,\n\t\t\t\t\tthis.state.prefixesArray.length - 1,\n\t\t\t\t\tthis.state.rng,\n\t\t\t\t);\n\t\t\t\tprefix = this.state.prefixesArray[idx] as string;\n\t\t\t\tgeneratedDigitsNumber = this.state.generatedDigitsNumbers[idx] as number;\n\n\t\t\t\tnumberBody = String(this.state.generatorsMap.get(prefix)?.generate());\n\t\t\t\tif (numberBody === 'undefined') {\n\t\t\t\t\tthis.state.prefixesArray!.splice(idx, 1);\n\t\t\t\t\tthis.state.generatedDigitsNumbers.splice(idx, 1);\n\n\t\t\t\t\tthis.state.generatorsMap.delete(prefix);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (this.state.phoneNumbersSet.has(numberBody)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthis.state.phoneNumbersSet.add(numberBody);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst digitsNumberDiff = generatedDigitsNumber - numberBody.length;\n\t\t\tif (digitsNumberDiff > 0) {\n\t\t\t\tnumberBody = '0'.repeat(digitsNumberDiff) + numberBody;\n\t\t\t}\n\n\t\t\tphoneNumber = prefix + '' + numberBody;\n\n\t\t\treturn phoneNumber;\n\t\t} else {\n\t\t\tnumberBody = String(this.state.generatorsMap.get(this.params.template)?.generate());\n\t\t\tphoneNumber = fillTemplate({\n\t\t\t\ttemplate: this.params.template,\n\t\t\t\tvalues: [...numberBody],\n\t\t\t\tdefaultValue: '0',\n\t\t\t\tplaceholdersCount: this.state.placeholdersCount,\n\t\t\t});\n\n\t\t\treturn phoneNumber;\n\t\t}\n\t}\n}\n\nexport class GenerateCountry extends AbstractGenerator<{\n\tisUnique?: boolean;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateCountry';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\toverride uniqueVersionOfGen = GenerateUniqueCountry;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tif (this.stringLength !== undefined && this.stringLength < maxCountryLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use country generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxCountryLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet idx: number;\n\n\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, countries.length - 1, this.state.rng);\n\t\tconst country = countries[idx] as string;\n\n\t\treturn country;\n\t}\n}\n\nexport class GenerateUniqueCountry extends AbstractGenerator<{ isUnique?: boolean }> {\n\tstatic override readonly entityKind: string = 'GenerateUniqueCountry';\n\n\tprivate state: {\n\t\tgenIndicesObj: GenerateUniqueInt;\n\t} | undefined;\n\tpublic override isUnique = true;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tif (count > countries.length) {\n\t\t\tthrow new Error('count exceeds max number of unique countries.');\n\t\t}\n\n\t\tif (this.stringLength !== undefined && this.stringLength < maxCountryLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use country generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxCountryLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tconst genIndicesObj = new GenerateUniqueInt({ minValue: 0, maxValue: countries.length - 1 });\n\t\tgenIndicesObj.init({ count, seed });\n\n\t\tthis.state = { genIndicesObj };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst countryIdx = this.state.genIndicesObj.generate() as number;\n\t\tconst country = countries[countryIdx] as string;\n\n\t\treturn country;\n\t}\n}\n\nexport class GenerateJobTitle extends AbstractGenerator<{\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateJobTitle';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tif (this.stringLength !== undefined && this.stringLength < maxJobTitleLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use job title generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxJobTitleLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\t\tlet idx;\n\n\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, jobsTitles.length - 1, this.state.rng);\n\n\t\treturn jobsTitles[idx];\n\t}\n}\n\nexport class GenerateStreetAddress extends AbstractGenerator<{\n\tisUnique?: boolean;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateStreetAddress';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tpossStreetNames: string[][];\n\t} | undefined;\n\toverride uniqueVersionOfGen = GenerateUniqueStreetAddress;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tconst possStreetNames = [firstNames, lastNames];\n\n\t\tconst maxStreetAddressLength = 4 + Math.max(maxFirstNameLength, maxLastNameLength) + 1 + maxStreetSuffixLength;\n\t\tif (this.stringLength !== undefined && this.stringLength < maxStreetAddressLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use street address generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxStreetAddressLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tthis.state = { rng, possStreetNames };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet idx, streetBaseNameIdx, streetSuffixIdx, streetNumber;\n\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, this.state.possStreetNames.length - 1, this.state.rng);\n\n\t\t[streetBaseNameIdx, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t0,\n\t\t\tthis.state.possStreetNames[idx]!.length - 1,\n\t\t\tthis.state.rng,\n\t\t);\n\t\t[streetSuffixIdx, this.state.rng] = prand.uniformIntDistribution(0, streetSuffix.length - 1, this.state.rng);\n\t\tconst streetName = `${this.state.possStreetNames[idx]![streetBaseNameIdx]} ${streetSuffix[streetSuffixIdx]}`;\n\n\t\t[streetNumber, this.state.rng] = prand.uniformIntDistribution(1, 999, this.state.rng);\n\n\t\treturn `${streetNumber} ${streetName}`;\n\t}\n}\n\nexport class GenerateUniqueStreetAddress extends AbstractGenerator<{ isUnique?: boolean }> {\n\tstatic override readonly entityKind: string = 'GenerateUniqueStreetAddress';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tpossStreetNameObjs: {\n\t\t\tindicesGen: GenerateUniqueInt;\n\t\t\tmaxUniqueStreetNamesNumber: number;\n\t\t\tcount: number;\n\t\t\tarraysToChooseFrom: string[][];\n\t\t}[];\n\t} | undefined;\n\tpublic override isUnique = true;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tconst streetNumberStrs = Array.from({ length: 999 }, (_, i) => String(i + 1));\n\t\tconst maxUniqueStreetnamesNumber = streetNumberStrs.length * firstNames.length * streetSuffix.length\n\t\t\t+ streetNumberStrs.length * firstNames.length * streetSuffix.length;\n\n\t\tif (count > maxUniqueStreetnamesNumber) {\n\t\t\tthrow new RangeError(\n\t\t\t\t`count exceeds max number of unique street names(${maxUniqueStreetnamesNumber}).`,\n\t\t\t);\n\t\t}\n\n\t\tconst maxStreetAddressLength = 4 + Math.max(maxFirstNameLength, maxLastNameLength) + 1 + maxStreetSuffixLength;\n\t\tif (this.stringLength !== undefined && this.stringLength < maxStreetAddressLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use street address generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxStreetAddressLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\t// [\"1\", \"2\", ..., \"999\"]\n\n\t\tconst possStreetNameObjs = [\n\t\t\t{\n\t\t\t\tindicesGen: new GenerateUniqueInt({\n\t\t\t\t\tminValue: 0,\n\t\t\t\t\tmaxValue: streetNumberStrs.length * firstNames.length * streetSuffix.length - 1,\n\t\t\t\t}),\n\t\t\t\tmaxUniqueStreetNamesNumber: streetNumberStrs.length * firstNames.length * streetSuffix.length,\n\t\t\t\tcount: 0,\n\t\t\t\tarraysToChooseFrom: [streetNumberStrs, firstNames, streetSuffix],\n\t\t\t},\n\t\t\t{\n\t\t\t\tindicesGen: new GenerateUniqueInt({\n\t\t\t\t\tminValue: 0,\n\t\t\t\t\tmaxValue: streetNumberStrs.length * lastNames.length * streetSuffix.length - 1,\n\t\t\t\t}),\n\t\t\t\tmaxUniqueStreetNamesNumber: streetNumberStrs.length * firstNames.length * streetSuffix.length,\n\t\t\t\tcount: 0,\n\t\t\t\tarraysToChooseFrom: [streetNumberStrs, lastNames, streetSuffix],\n\t\t\t},\n\t\t];\n\n\t\tfor (const possStreetNameObj of possStreetNameObjs) {\n\t\t\tpossStreetNameObj.indicesGen.skipCheck = true;\n\t\t\tpossStreetNameObj.indicesGen.init({ count, seed });\n\t\t}\n\n\t\tthis.state = { rng, possStreetNameObjs };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet streetNameObjIdx;\n\t\t[streetNameObjIdx, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t0,\n\t\t\tthis.state.possStreetNameObjs.length - 1,\n\t\t\tthis.state.rng,\n\t\t);\n\t\tconst streetNameObj = this.state.possStreetNameObjs[streetNameObjIdx]!;\n\n\t\tconst idx = streetNameObj.indicesGen.generate() as number;\n\t\tconst values = fastCartesianProduct(streetNameObj.arraysToChooseFrom, idx) as string[];\n\n\t\tstreetNameObj.count += 1;\n\t\tif (streetNameObj.count === streetNameObj.maxUniqueStreetNamesNumber) {\n\t\t\tthis.state.possStreetNameObjs[streetNameObjIdx] = this.state\n\t\t\t\t.possStreetNameObjs.at(-1)!;\n\t\t\tthis.state.possStreetNameObjs.pop();\n\t\t}\n\n\t\tconst streetName = fillTemplate({ template: '# # #', values, placeholdersCount: 3 });\n\n\t\treturn streetName;\n\t}\n}\n\nexport class GenerateCity extends AbstractGenerator<{\n\tisUnique?: boolean;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateCity';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\toverride uniqueVersionOfGen = GenerateUniqueCity;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tif (this.stringLength !== undefined && this.stringLength < maxCityNameLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use city generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxCityNameLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet idx;\n\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, cityNames.length - 1, this.state.rng);\n\n\t\treturn cityNames[idx];\n\t}\n}\n\nexport class GenerateUniqueCity extends AbstractGenerator<{ isUnique?: boolean }> {\n\tstatic override readonly entityKind: string = 'GenerateUniqueCity';\n\n\tprivate state: {\n\t\tgenIndicesObj: GenerateUniqueInt;\n\t} | undefined;\n\tpublic override isUnique = true;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tif (count > cityNames.length) {\n\t\t\tthrow new Error('count exceeds max number of unique cities.');\n\t\t}\n\n\t\tif (this.stringLength !== undefined && this.stringLength < maxCityNameLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use city generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxCityNameLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tconst genIndicesObj = new GenerateUniqueInt({ minValue: 0, maxValue: cityNames.length - 1 });\n\t\tgenIndicesObj.init({ count, seed });\n\n\t\tthis.state = { genIndicesObj };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst cityIdx = this.state.genIndicesObj.generate() as number;\n\t\tconst city = cityNames[cityIdx] as string;\n\n\t\treturn city;\n\t}\n}\n\nexport class GeneratePostcode extends AbstractGenerator<{\n\tisUnique?: boolean;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GeneratePostcode';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\ttemplates: string[];\n\t} | undefined;\n\toverride uniqueVersionOfGen = GenerateUniquePostcode;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tconst templates = ['#####', '#####-####'];\n\n\t\tconst maxPostcodeLength = Math.max(...templates.map((template) => template.length));\n\t\tif (this.stringLength !== undefined && this.stringLength < maxPostcodeLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use postcode generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxPostcodeLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tthis.state = { rng, templates };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet idx: number, postcodeNumber: number;\n\n\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, this.state.templates.length - 1, this.state.rng);\n\t\tconst template = this.state.templates[idx]!;\n\n\t\tconst iterArray = [...template.matchAll(/#/g)];\n\t\tconst placeholdersCount = iterArray.length;\n\n\t\t[postcodeNumber, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t0,\n\t\t\tMath.pow(10, placeholdersCount) - 1,\n\t\t\tthis.state.rng,\n\t\t);\n\t\tconst postcode = fillTemplate({\n\t\t\ttemplate,\n\t\t\tplaceholdersCount,\n\t\t\tvalues: [...String(postcodeNumber)],\n\t\t\tdefaultValue: '0',\n\t\t});\n\n\t\treturn postcode;\n\t}\n}\n\nexport class GenerateUniquePostcode extends AbstractGenerator<{ isUnique?: boolean }> {\n\tstatic override readonly entityKind: string = 'GenerateUniquePostcode';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\ttemplates: {\n\t\t\ttemplate: string;\n\t\t\tindicesGen: GenerateUniqueInt;\n\t\t\tplaceholdersCount: number;\n\t\t\tcount: number;\n\t\t\tmaxUniquePostcodeNumber: number;\n\t\t}[];\n\t} | undefined;\n\tpublic override isUnique = true;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tconst maxUniquePostcodeNumber = Math.pow(10, 5) + Math.pow(10, 9);\n\t\tif (count > maxUniquePostcodeNumber) {\n\t\t\tthrow new RangeError(\n\t\t\t\t`count exceeds max number of unique postcodes(${maxUniquePostcodeNumber}).`,\n\t\t\t);\n\t\t}\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tconst templates = [\n\t\t\t{\n\t\t\t\ttemplate: '#####',\n\t\t\t\tindicesGen: new GenerateUniqueInt({ minValue: 0, maxValue: Math.pow(10, 5) - 1 }),\n\t\t\t\tplaceholdersCount: 5,\n\t\t\t\tcount: 0,\n\t\t\t\tmaxUniquePostcodeNumber: Math.pow(10, 5),\n\t\t\t},\n\t\t\t{\n\t\t\t\ttemplate: '#####-####',\n\t\t\t\tindicesGen: new GenerateUniqueInt({ minValue: 0, maxValue: Math.pow(10, 9) - 1 }),\n\t\t\t\tplaceholdersCount: 9,\n\t\t\t\tcount: 0,\n\t\t\t\tmaxUniquePostcodeNumber: Math.pow(10, 9),\n\t\t\t},\n\t\t];\n\n\t\tconst maxPostcodeLength = Math.max(...templates.map((template) => template.template.length));\n\t\tif (this.stringLength !== undefined && this.stringLength < maxPostcodeLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use postcode generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxPostcodeLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tfor (const templateObj of templates) {\n\t\t\ttemplateObj.indicesGen.skipCheck = true;\n\t\t\ttemplateObj.indicesGen.init({ count, seed });\n\t\t}\n\n\t\tthis.state = { rng, templates };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet idx: number;\n\n\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, this.state.templates.length - 1, this.state.rng);\n\t\tconst templateObj = this.state.templates[idx]!;\n\n\t\tconst postcodeNumber = templateObj.indicesGen.generate() as number;\n\n\t\ttemplateObj.count += 1;\n\t\tif (templateObj.count === templateObj.maxUniquePostcodeNumber) {\n\t\t\tthis.state.templates[idx] = this.state.templates.at(-1)!;\n\t\t\tthis.state.templates.pop();\n\t\t}\n\n\t\tconst postcode = fillTemplate({\n\t\t\ttemplate: templateObj.template,\n\t\t\tplaceholdersCount: templateObj.placeholdersCount,\n\t\t\tvalues: [...String(postcodeNumber)],\n\t\t\tdefaultValue: '0',\n\t\t});\n\n\t\treturn postcode;\n\t}\n}\n\nexport class GenerateState extends AbstractGenerator<{\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateState';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tif (this.stringLength !== undefined && this.stringLength < maxStateLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use state generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxStateLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet idx;\n\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, states.length - 1, this.state.rng);\n\n\t\treturn states[idx];\n\t}\n}\n\nexport class GenerateCompanyName extends AbstractGenerator<{\n\tisUnique?: boolean;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateCompanyName';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\ttemplates: { template: string; placeholdersCount: number }[];\n\t} | undefined;\n\toverride uniqueVersionOfGen = GenerateUniqueCompanyName;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tconst templates = [\n\t\t\t{ template: '#', placeholdersCount: 1 },\n\t\t\t{ template: '# - #', placeholdersCount: 2 },\n\t\t\t{ template: '# and #', placeholdersCount: 2 },\n\t\t\t{ template: '#, # and #', placeholdersCount: 3 },\n\t\t];\n\n\t\t// max( { template: '#', placeholdersCount: 1 }, { template: '#, # and #', placeholdersCount: 3 } )\n\t\tconst maxCompanyNameLength = Math.max(\n\t\t\tmaxLastNameLength + maxCompanyNameSuffixLength + 1,\n\t\t\t3 * maxLastNameLength + 7,\n\t\t);\n\t\tif (this.stringLength !== undefined && this.stringLength < maxCompanyNameLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use company name generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxCompanyNameLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tthis.state = { rng, templates };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet templateIdx, idx, lastName, companyNameSuffix, companyName;\n\t\t[templateIdx, this.state.rng] = prand.uniformIntDistribution(0, this.state.templates.length - 1, this.state.rng);\n\t\tconst templateObj = this.state.templates[templateIdx]!;\n\n\t\tif (templateObj.template === '#') {\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, lastNames.length - 1, this.state.rng);\n\t\t\tlastName = lastNames[idx];\n\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, companyNameSuffixes.length - 1, this.state.rng);\n\t\t\tcompanyNameSuffix = companyNameSuffixes[idx];\n\n\t\t\tcompanyName = `${lastName} ${companyNameSuffix}`;\n\t\t\treturn companyName;\n\t\t}\n\n\t\tconst values = [];\n\t\tfor (let i = 0; i < templateObj.placeholdersCount; i++) {\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, lastNames.length - 1, this.state.rng);\n\t\t\tvalues.push(lastNames[idx]!);\n\t\t}\n\n\t\tcompanyName = fillTemplate({\n\t\t\ttemplate: templateObj.template,\n\t\t\tvalues,\n\t\t\tplaceholdersCount: templateObj.placeholdersCount,\n\t\t});\n\t\treturn companyName;\n\t}\n}\n\nexport class GenerateUniqueCompanyName extends AbstractGenerator<{ isUnique?: boolean }> {\n\tstatic override readonly entityKind: string = 'GenerateUniqueCompanyName';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\ttemplates: {\n\t\t\ttemplate: string;\n\t\t\tplaceholdersCount: number;\n\t\t\tindicesGen: GenerateUniqueInt;\n\t\t\tmaxUniqueCompanyNameNumber: number;\n\t\t\tcount: number;\n\t\t\tarraysToChooseFrom: string[][];\n\t\t}[];\n\t} | undefined;\n\tpublic override isUnique = true;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tconst maxUniqueCompanyNameNumber = lastNames.length * companyNameSuffixes.length + Math.pow(lastNames.length, 2)\n\t\t\t+ Math.pow(lastNames.length, 2) + Math.pow(lastNames.length, 3);\n\t\tif (count > maxUniqueCompanyNameNumber) {\n\t\t\tthrow new RangeError(\n\t\t\t\t`count exceeds max number of unique company names(${maxUniqueCompanyNameNumber}).`,\n\t\t\t);\n\t\t}\n\n\t\t// max( { template: '#', placeholdersCount: 1 }, { template: '#, # and #', placeholdersCount: 3 } )\n\t\tconst maxCompanyNameLength = Math.max(\n\t\t\tmaxLastNameLength + maxCompanyNameSuffixLength + 1,\n\t\t\t3 * maxLastNameLength + 7,\n\t\t);\n\t\tif (this.stringLength !== undefined && this.stringLength < maxCompanyNameLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use company name generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxCompanyNameLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\t// when count reach maxUniqueCompanyNameNumber template will be deleted from array\n\t\tconst templates = [\n\t\t\t{\n\t\t\t\ttemplate: '# - #',\n\t\t\t\tplaceholdersCount: 1,\n\t\t\t\tindicesGen: new GenerateUniqueInt({ minValue: 0, maxValue: lastNames.length * companyNameSuffixes.length - 1 }),\n\t\t\t\tmaxUniqueCompanyNameNumber: lastNames.length * companyNameSuffixes.length,\n\t\t\t\tcount: 0,\n\t\t\t\tarraysToChooseFrom: [lastNames, companyNameSuffixes],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttemplate: '# - #',\n\t\t\t\tplaceholdersCount: 2,\n\t\t\t\tindicesGen: new GenerateUniqueInt({ minValue: 0, maxValue: Math.pow(lastNames.length, 2) - 1 }),\n\t\t\t\tmaxUniqueCompanyNameNumber: Math.pow(lastNames.length, 2),\n\t\t\t\tcount: 0,\n\t\t\t\tarraysToChooseFrom: [lastNames, lastNames],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttemplate: '# and #',\n\t\t\t\tplaceholdersCount: 2,\n\t\t\t\tindicesGen: new GenerateUniqueInt({ minValue: 0, maxValue: Math.pow(lastNames.length, 2) - 1 }),\n\t\t\t\tmaxUniqueCompanyNameNumber: Math.pow(lastNames.length, 2),\n\t\t\t\tcount: 0,\n\t\t\t\tarraysToChooseFrom: [lastNames, lastNames],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttemplate: '#, # and #',\n\t\t\t\tplaceholdersCount: 3,\n\t\t\t\tindicesGen: new GenerateUniqueInt({ minValue: 0, maxValue: Math.pow(lastNames.length, 3) - 1 }),\n\t\t\t\tmaxUniqueCompanyNameNumber: Math.pow(lastNames.length, 3),\n\t\t\t\tcount: 0,\n\t\t\t\tarraysToChooseFrom: [lastNames, lastNames, lastNames],\n\t\t\t},\n\t\t];\n\n\t\tfor (const templateObj of templates) {\n\t\t\ttemplateObj.indicesGen.skipCheck = true;\n\t\t\ttemplateObj.indicesGen.init({ count, seed });\n\t\t}\n\n\t\tthis.state = { rng, templates };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet templateIdx;\n\t\t[templateIdx, this.state.rng] = prand.uniformIntDistribution(0, this.state.templates.length - 1, this.state.rng);\n\t\tconst templateObj = this.state.templates[templateIdx]!;\n\n\t\tconst idx = templateObj.indicesGen.generate() as number;\n\t\tconst values = fastCartesianProduct(templateObj.arraysToChooseFrom, idx) as string[];\n\n\t\ttemplateObj.count += 1;\n\t\tif (templateObj.count === templateObj.maxUniqueCompanyNameNumber) {\n\t\t\tthis.state.templates[templateIdx] = this.state.templates.at(-1)!;\n\t\t\tthis.state.templates.pop();\n\t\t}\n\n\t\tconst companyName = fillTemplate({\n\t\t\ttemplate: templateObj.template,\n\t\t\tvalues,\n\t\t\tplaceholdersCount: templateObj.placeholdersCount,\n\t\t});\n\t\treturn companyName;\n\t}\n}\n\nexport class GenerateLoremIpsum extends AbstractGenerator<{\n\tsentencesCount?: number;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateLoremIpsum';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tif (this.params.sentencesCount === undefined) this.params.sentencesCount = 1;\n\n\t\tconst maxLoremIpsumSentencesLength = maxLoremIpsumLength * this.params.sentencesCount + this.params.sentencesCount\n\t\t\t- 1;\n\t\tif (this.stringLength !== undefined && this.stringLength < maxLoremIpsumSentencesLength) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't use lorem ipsum generator with a db column length restriction of ${this.stringLength}. Set the maximum string length to at least ${maxLoremIpsumSentencesLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tthis.state = { rng };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet idx, resultText: string = '';\n\t\tfor (let i = 0; i < this.params.sentencesCount!; i++) {\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, loremIpsumSentences.length - 1, this.state.rng);\n\t\t\tresultText += loremIpsumSentences[idx] + ' ';\n\t\t}\n\n\t\treturn resultText;\n\t}\n}\n\nexport class WeightedRandomGenerator extends AbstractGenerator<{ weight: number; value: AbstractGenerator<any> }[]> {\n\tstatic override readonly entityKind: string = 'WeightedRandomGenerator';\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tweightedIndices: number[];\n\t} | undefined;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tconst weights = this.params.map((weightedGen) => weightedGen.weight);\n\t\tconst weightedIndices = getWeightedIndices(weights);\n\n\t\tlet idx: number, valueIdx: number, tempRng = prand.xoroshiro128plus(seed);\n\t\tconst indicesCounter: { [key: number]: number } = {};\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\t[idx, tempRng] = prand.uniformIntDistribution(0, weightedIndices.length - 1, tempRng);\n\t\t\tvalueIdx = weightedIndices[idx]!;\n\t\t\tif (!Object.hasOwn(indicesCounter, valueIdx)) indicesCounter[valueIdx] = 0;\n\t\t\tindicesCounter[valueIdx]! += 1;\n\t\t}\n\n\t\tfor (const [idx, weightedGen] of this.params.entries()) {\n\t\t\tweightedGen.value.isUnique = this.isUnique;\n\t\t\tweightedGen.value.dataType = this.dataType;\n\t\t\tweightedGen.value.init({ count: indicesCounter[idx]!, seed });\n\n\t\t\tif (\n\t\t\t\tweightedGen.value.uniqueVersionOfGen !== undefined\n\t\t\t\t&& weightedGen.value.isUnique === true\n\t\t\t) {\n\t\t\t\tconst uniqueGen = new weightedGen.value.uniqueVersionOfGen({\n\t\t\t\t\t...weightedGen.value.params,\n\t\t\t\t});\n\t\t\t\tuniqueGen.init({\n\t\t\t\t\tcount: indicesCounter[idx]!,\n\t\t\t\t\tseed,\n\t\t\t\t});\n\t\t\t\tuniqueGen.isUnique = weightedGen.value.isUnique;\n\t\t\t\tuniqueGen.dataType = weightedGen.value.dataType;\n\n\t\t\t\tweightedGen.value = uniqueGen;\n\t\t\t}\n\t\t}\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tthis.state = { weightedIndices, rng };\n\t}\n\n\tgenerate({ i }: { i: number }) {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet idx: number;\n\t\t[idx, this.state.rng] = prand.uniformIntDistribution(0, this.state.weightedIndices.length - 1, this.state.rng);\n\t\tconst generatorIdx = this.state.weightedIndices[idx] as number;\n\t\tconst value = this.params[generatorIdx]!.value.generate({ i });\n\n\t\treturn value;\n\t}\n}\n\nexport class GeneratePoint extends AbstractGenerator<{\n\tisUnique?: boolean;\n\tminXValue?: number;\n\tmaxXValue?: number;\n\tminYValue?: number;\n\tmaxYValue?: number;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GeneratePoint';\n\n\tprivate state: {\n\t\txCoordinateGen: GenerateNumber;\n\t\tyCoordinateGen: GenerateNumber;\n\t} | undefined;\n\toverride uniqueVersionOfGen = GenerateUniquePoint;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst xCoordinateGen = new GenerateNumber({\n\t\t\tminValue: this.params.minXValue,\n\t\t\tmaxValue: this.params.maxXValue,\n\t\t\tprecision: 10,\n\t\t});\n\t\txCoordinateGen.init({ count, seed });\n\n\t\tconst yCoordinateGen = new GenerateNumber({\n\t\t\tminValue: this.params.minYValue,\n\t\t\tmaxValue: this.params.maxYValue,\n\t\t\tprecision: 10,\n\t\t});\n\t\tyCoordinateGen.init({ count, seed });\n\n\t\tthis.state = { xCoordinateGen, yCoordinateGen };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst x = this.state.xCoordinateGen.generate();\n\t\tconst y = this.state.yCoordinateGen.generate();\n\n\t\tif (this.dataType === 'json') {\n\t\t\treturn { x, y };\n\t\t} else if (this.dataType === 'string') {\n\t\t\treturn `[${x}, ${y}]`;\n\t\t} else {\n\t\t\t// if (this.dataType === \"array\")\n\t\t\treturn [x, y];\n\t\t}\n\t}\n}\n\nexport class GenerateUniquePoint extends AbstractGenerator<{\n\tminXValue?: number;\n\tmaxXValue?: number;\n\tminYValue?: number;\n\tmaxYValue?: number;\n\tisUnique?: boolean;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateUniquePoint';\n\n\tprivate state: {\n\t\txCoordinateGen: GenerateUniqueNumber;\n\t\tyCoordinateGen: GenerateUniqueNumber;\n\t} | undefined;\n\tpublic override isUnique = true;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tconst xCoordinateGen = new GenerateUniqueNumber({\n\t\t\tminValue: this.params.minXValue,\n\t\t\tmaxValue: this.params.maxXValue,\n\t\t\tprecision: 10,\n\t\t});\n\t\txCoordinateGen.init({ count, seed });\n\n\t\tconst yCoordinateGen = new GenerateUniqueNumber({\n\t\t\tminValue: this.params.minYValue,\n\t\t\tmaxValue: this.params.maxYValue,\n\t\t\tprecision: 10,\n\t\t});\n\t\tyCoordinateGen.init({ count, seed });\n\n\t\tthis.state = { xCoordinateGen, yCoordinateGen };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst x = this.state.xCoordinateGen.generate();\n\t\tconst y = this.state.yCoordinateGen.generate();\n\n\t\tif (this.dataType === 'json') {\n\t\t\treturn { x, y };\n\t\t} else if (this.dataType === 'string') {\n\t\t\treturn `[${x}, ${y}]`;\n\t\t} else {\n\t\t\t// if (this.dataType === \"array\")\n\t\t\treturn [x, y];\n\t\t}\n\t}\n}\n\nexport class GenerateLine extends AbstractGenerator<{\n\tisUnique?: boolean;\n\tminAValue?: number;\n\tmaxAValue?: number;\n\tminBValue?: number;\n\tmaxBValue?: number;\n\tminCValue?: number;\n\tmaxCValue?: number;\n\tarraySize?: number;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateLine';\n\n\tprivate state: {\n\t\taCoefficientGen: GenerateNumber;\n\t\tbCoefficientGen: GenerateNumber;\n\t\tcCoefficientGen: GenerateNumber;\n\t} | undefined;\n\toverride uniqueVersionOfGen = GenerateUniqueLine;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tconst aCoefficientGen = new GenerateNumber({\n\t\t\tminValue: this.params.minAValue,\n\t\t\tmaxValue: this.params.maxAValue,\n\t\t\tprecision: 10,\n\t\t});\n\t\taCoefficientGen.init({ count, seed });\n\n\t\tconst bCoefficientGen = new GenerateNumber({\n\t\t\tminValue: this.params.minBValue,\n\t\t\tmaxValue: this.params.maxBValue,\n\t\t\tprecision: 10,\n\t\t});\n\t\tbCoefficientGen.init({ count, seed });\n\n\t\tconst cCoefficientGen = new GenerateNumber({\n\t\t\tminValue: this.params.minCValue,\n\t\t\tmaxValue: this.params.maxCValue,\n\t\t\tprecision: 10,\n\t\t});\n\t\tcCoefficientGen.init({ count, seed });\n\n\t\tthis.state = { aCoefficientGen, bCoefficientGen, cCoefficientGen };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet b: number;\n\t\tconst a = this.state.aCoefficientGen.generate();\n\n\t\tb = this.state.bCoefficientGen.generate();\n\t\twhile (a === 0 && b === 0) {\n\t\t\tb = this.state.bCoefficientGen.generate();\n\t\t}\n\n\t\tconst c = this.state.cCoefficientGen.generate();\n\n\t\tif (this.dataType === 'json') {\n\t\t\treturn { a, b, c };\n\t\t} else if (this.dataType === 'string') {\n\t\t\treturn `[${a}, ${b}, ${c}]`;\n\t\t} else {\n\t\t\t// if (this.dataType === \"array\")\n\t\t\treturn [a, b, c];\n\t\t}\n\t}\n}\n\nexport class GenerateUniqueLine extends AbstractGenerator<{\n\tminAValue?: number;\n\tmaxAValue?: number;\n\tminBValue?: number;\n\tmaxBValue?: number;\n\tminCValue?: number;\n\tmaxCValue?: number;\n\tisUnique?: boolean;\n}> {\n\tstatic override readonly entityKind: string = 'GenerateUniqueLine';\n\n\tprivate state: {\n\t\taCoefficientGen: GenerateUniqueNumber;\n\t\tbCoefficientGen: GenerateUniqueNumber;\n\t\tcCoefficientGen: GenerateUniqueNumber;\n\t} | undefined;\n\tpublic override isUnique = true;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tconst aCoefficientGen = new GenerateUniqueNumber({\n\t\t\tminValue: this.params.minAValue,\n\t\t\tmaxValue: this.params.maxAValue,\n\t\t\tprecision: 10,\n\t\t});\n\t\taCoefficientGen.init({ count, seed });\n\n\t\tconst bCoefficientGen = new GenerateUniqueNumber({\n\t\t\tminValue: this.params.minBValue,\n\t\t\tmaxValue: this.params.maxBValue,\n\t\t\tprecision: 10,\n\t\t});\n\t\tbCoefficientGen.init({ count, seed });\n\n\t\tconst cCoefficientGen = new GenerateUniqueNumber({\n\t\t\tminValue: this.params.minCValue,\n\t\t\tmaxValue: this.params.maxCValue,\n\t\t\tprecision: 10,\n\t\t});\n\t\tcCoefficientGen.init({ count, seed });\n\n\t\tthis.state = { aCoefficientGen, bCoefficientGen, cCoefficientGen };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet b: number;\n\t\tconst a = this.state.aCoefficientGen.generate();\n\n\t\tb = this.state.bCoefficientGen.generate();\n\t\twhile (a === 0 && b === 0) {\n\t\t\tb = this.state.bCoefficientGen.generate();\n\t\t}\n\n\t\tconst c = this.state.cCoefficientGen.generate();\n\n\t\tif (this.dataType === 'json') {\n\t\t\treturn { a, b, c };\n\t\t} else if (this.dataType === 'string') {\n\t\t\treturn `[${a}, ${b}, ${c}]`;\n\t\t} else {\n\t\t\t// if (this.dataType === \"array\")\n\t\t\treturn [a, b, c];\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "drizzle-seed/src/services/SeedService.ts",
    "content": "/* eslint-disable drizzle-internal/require-entity-kind */\nimport { entityKind, eq, is } from 'drizzle-orm';\nimport type { MySqlTable, MySqlTableWithColumns } from 'drizzle-orm/mysql-core';\nimport { MySqlDatabase } from 'drizzle-orm/mysql-core';\nimport type { PgTable, PgTableWithColumns } from 'drizzle-orm/pg-core';\nimport { PgDatabase } from 'drizzle-orm/pg-core';\nimport type { SQLiteTable, SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core';\nimport { BaseSQLiteDatabase } from 'drizzle-orm/sqlite-core';\nimport type {\n\tGeneratePossibleGeneratorsColumnType,\n\tGeneratePossibleGeneratorsTableType,\n\tRefinementsType,\n\tTableGeneratorsType,\n} from '../types/seedService.ts';\nimport type { Column, Prettify, Relation, Table } from '../types/tables.ts';\nimport { generatorsMap } from './GeneratorFuncs.ts';\nimport type { AbstractGenerator, GenerateArray, GenerateInterval, GenerateWeightedCount } from './Generators.ts';\n\nimport { latestVersion } from './apiVersion.ts';\nimport { equalSets, generateHashFromString } from './utils.ts';\n\nexport class SeedService {\n\tstatic readonly entityKind: string = 'SeedService';\n\n\tprivate defaultCountForTable = 10;\n\tprivate postgresPgLiteMaxParametersNumber = 32740;\n\tprivate postgresMaxParametersNumber = 65535;\n\t// there is no max parameters number in mysql, so you can increase mysqlMaxParametersNumber if it's needed.\n\tprivate mysqlMaxParametersNumber = 100000;\n\t//  SQLITE_MAX_VARIABLE_NUMBER, which by default equals to 999 for SQLite versions prior to 3.32.0 (2020-05-22) or 32766 for SQLite versions after 3.32.0.\n\tprivate sqliteMaxParametersNumber = 32766;\n\tprivate version?: number;\n\n\tgeneratePossibleGenerators = (\n\t\tconnectionType: 'postgresql' | 'mysql' | 'sqlite',\n\t\ttables: Table[],\n\t\trelations: (Relation & { isCyclic: boolean })[],\n\t\trefinements?: RefinementsType,\n\t\toptions?: { count?: number; seed?: number; version?: number },\n\t) => {\n\t\tlet columnPossibleGenerator: Prettify<GeneratePossibleGeneratorsColumnType>;\n\t\tlet tablePossibleGenerators: Prettify<GeneratePossibleGeneratorsTableType>;\n\t\tconst customSeed = options?.seed === undefined ? 0 : options.seed;\n\t\tthis.version = options?.version === undefined ? latestVersion : options.version;\n\t\tif (Number.isNaN(this.version) || this.version < 1 || this.version > latestVersion) {\n\t\t\tthrow new Error(`Version should be in range [1, ${latestVersion}].`);\n\t\t}\n\n\t\t// sorting table in order which they will be filled up (tables with foreign keys case)\n\t\tconst { tablesInOutRelations } = this.getInfoFromRelations(relations);\n\t\tconst orderedTablesNames = this.getOrderedTablesList(tablesInOutRelations);\n\t\ttables = tables.sort((table1, table2) => {\n\t\t\tconst rel = relations.find((rel) => rel.table === table1.name && rel.refTable === table2.name);\n\n\t\t\tif (rel?.isCyclic === true) {\n\t\t\t\tconst reverseRel = relations.find((rel) => rel.table === table2.name && rel.refTable === table1.name);\n\t\t\t\treturn this.cyclicTablesCompare(table1, table2, rel, reverseRel);\n\t\t\t}\n\n\t\t\tconst table1Order = orderedTablesNames.indexOf(\n\t\t\t\t\ttable1.name,\n\t\t\t\t),\n\t\t\t\ttable2Order = orderedTablesNames.indexOf(\n\t\t\t\t\ttable2.name,\n\t\t\t\t);\n\t\t\treturn table1Order - table2Order;\n\t\t});\n\n\t\tconst tableNamesSet = new Set(tables.map((table) => table.name));\n\t\tconst tablesPossibleGenerators: Prettify<\n\t\t\t(typeof tablePossibleGenerators)[]\n\t\t> = tables.map((table) => ({\n\t\t\ttableName: table.name,\n\t\t\tcolumnsPossibleGenerators: [],\n\t\t\twithFromTable: {},\n\t\t}));\n\n\t\tfor (const [i, table] of tables.entries()) {\n\t\t\t// get foreignKey columns relations\n\t\t\tconst foreignKeyColumns: {\n\t\t\t\t[columnName: string]: { table: string; column: string };\n\t\t\t} = {};\n\n\t\t\tfor (\n\t\t\t\tconst rel of relations\n\t\t\t\t\t.filter((rel) => rel.table === table.name)\n\t\t\t) {\n\t\t\t\tfor (const [idx, col] of rel.columns.entries()) {\n\t\t\t\t\tforeignKeyColumns[col] = {\n\t\t\t\t\t\ttable: rel.refTable,\n\t\t\t\t\t\tcolumn: rel.refColumns[idx] as string,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (refinements !== undefined && refinements[table.name] !== undefined) {\n\t\t\t\tif (refinements[table.name]!.count !== undefined) {\n\t\t\t\t\ttablesPossibleGenerators[i]!.count = refinements[table.name]!.count;\n\t\t\t\t}\n\n\t\t\t\tif (refinements[table.name]!.with !== undefined) {\n\t\t\t\t\ttablesPossibleGenerators[i]!.count = refinements[table.name]!.count\n\t\t\t\t\t\t|| options?.count\n\t\t\t\t\t\t|| this.defaultCountForTable;\n\t\t\t\t\tlet idx: number;\n\t\t\t\t\tfor (\n\t\t\t\t\t\tconst fkTableName of Object.keys(\n\t\t\t\t\t\t\trefinements[table.name]!.with as {},\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (!tablesInOutRelations[table.name]?.dependantTableNames.has(fkTableName)) {\n\t\t\t\t\t\t\tconst reason = tablesInOutRelations[table.name]?.selfRelation === true\n\t\t\t\t\t\t\t\t? `\"${table.name}\" table has self reference`\n\t\t\t\t\t\t\t\t: `\"${fkTableName}\" table doesn't have a reference to \"${table.name}\" table or`\n\t\t\t\t\t\t\t\t\t+ `\\nyou didn't include your one-to-many relation in the seed function schema`;\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`${reason}.` + `\\nYou can't specify \"${fkTableName}\" as parameter in ${table.name}.with object.`\n\t\t\t\t\t\t\t\t\t+ `\\n\\nFor more details, check this: https://orm.drizzle.team/docs/guides/seeding-using-with-option`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tidx = tablesPossibleGenerators.findIndex(\n\t\t\t\t\t\t\t(table) => table.tableName === fkTableName,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (idx !== -1) {\n\t\t\t\t\t\t\tlet newTableWithCount: number,\n\t\t\t\t\t\t\t\tweightedCountSeed: number | undefined;\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttypeof refinements![table.name]!.with![fkTableName] === 'number'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tnewTableWithCount = (tablesPossibleGenerators[i]!.withCount\n\t\t\t\t\t\t\t\t\t|| tablesPossibleGenerators[i]!.count)!\n\t\t\t\t\t\t\t\t\t* (refinements[table.name]!.with![fkTableName] as number);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst weightedRepeatedValuesCount = refinements[table.name]!\n\t\t\t\t\t\t\t\t\t.with![fkTableName] as {\n\t\t\t\t\t\t\t\t\t\tweight: number;\n\t\t\t\t\t\t\t\t\t\tcount: number | number[];\n\t\t\t\t\t\t\t\t\t}[];\n\n\t\t\t\t\t\t\t\tweightedCountSeed = customSeed\n\t\t\t\t\t\t\t\t\t+ generateHashFromString(`${table.name}.${fkTableName}`);\n\n\t\t\t\t\t\t\t\tnewTableWithCount = this.getWeightedWithCount(\n\t\t\t\t\t\t\t\t\tweightedRepeatedValuesCount,\n\t\t\t\t\t\t\t\t\t(tablesPossibleGenerators[i]!.withCount\n\t\t\t\t\t\t\t\t\t\t|| tablesPossibleGenerators[i]!.count)!,\n\t\t\t\t\t\t\t\t\tweightedCountSeed,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttablesPossibleGenerators[idx]!.withCount === undefined\n\t\t\t\t\t\t\t\t|| newTableWithCount > tablesPossibleGenerators[idx]!.withCount!\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\ttablesPossibleGenerators[idx]!.withCount = newTableWithCount;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttablesPossibleGenerators[idx]!.withFromTable[table.name] = {\n\t\t\t\t\t\t\t\trepeatedValuesCount: refinements[table.name]!.with![fkTableName]!,\n\t\t\t\t\t\t\t\tweightedCountSeed,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttablePossibleGenerators = tablesPossibleGenerators[i]!;\n\t\t\tfor (const col of table.columns) {\n\t\t\t\t// col.myType = typeMap[col._type as keyof typeof typeMap];\n\t\t\t\tcolumnPossibleGenerator = {\n\t\t\t\t\tcolumnName: col.name,\n\t\t\t\t\tisUnique: col.isUnique,\n\t\t\t\t\tnotNull: col.notNull,\n\t\t\t\t\tprimary: col.primary,\n\t\t\t\t\tgeneratedIdentityType: col.generatedIdentityType,\n\t\t\t\t\tgenerator: undefined,\n\t\t\t\t\tisCyclic: false,\n\t\t\t\t\twasDefinedBefore: false,\n\t\t\t\t\twasRefined: false,\n\t\t\t\t};\n\n\t\t\t\tif (\n\t\t\t\t\trefinements !== undefined\n\t\t\t\t\t&& refinements[table.name] !== undefined\n\t\t\t\t\t&& refinements[table.name]!.columns !== undefined\n\t\t\t\t\t&& refinements[table.name]!.columns[col.name] !== undefined\n\t\t\t\t) {\n\t\t\t\t\tconst genObj = refinements[table.name]!.columns[col.name]!;\n\n\t\t\t\t\tif (col.columnType.match(/\\[\\w*]/g) !== null) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(col.baseColumn?.dataType === 'array' && col.baseColumn.columnType.match(/\\[\\w*]/g) !== null)\n\t\t\t\t\t\t\t// studio case\n\t\t\t\t\t\t\t|| (col.typeParams.dimensions !== undefined && col.typeParams.dimensions > 1)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthrow new Error(\"for now you can't specify generators for columns of dimension greater than 1.\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgenObj.baseColumnDataType = col.baseColumn?.dataType;\n\t\t\t\t\t}\n\n\t\t\t\t\tcolumnPossibleGenerator.generator = genObj;\n\t\t\t\t\tcolumnPossibleGenerator.wasRefined = true;\n\t\t\t\t} else if (Object.hasOwn(foreignKeyColumns, col.name)) {\n\t\t\t\t\t// TODO: I might need to assign repeatedValuesCount to column there instead of doing so in generateTablesValues\n\t\t\t\t\tconst cyclicRelation = relations.find((rel) =>\n\t\t\t\t\t\trel.table === table.name\n\t\t\t\t\t\t&& rel.isCyclic === true\n\t\t\t\t\t\t&& rel.columns.includes(col.name)\n\t\t\t\t\t);\n\n\t\t\t\t\tif (cyclicRelation !== undefined) {\n\t\t\t\t\t\tcolumnPossibleGenerator.isCyclic = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t(foreignKeyColumns[col.name]?.table === undefined || !tableNamesSet.has(foreignKeyColumns[col.name]!.table))\n\t\t\t\t\t\t&& col.notNull === true\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Column '${col.name}' has not null contraint,`\n\t\t\t\t\t\t\t\t+ `\\nand you didn't specify a table for foreign key on column '${col.name}' in '${table.name}' table.`\n\t\t\t\t\t\t\t\t+ `\\n\\nFor more details, check this: https://orm.drizzle.team/docs/guides/seeding-with-partially-exposed-tables#example-1`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst predicate = (\n\t\t\t\t\t\tcyclicRelation !== undefined\n\t\t\t\t\t\t|| (\n\t\t\t\t\t\t\tforeignKeyColumns[col.name]?.table === undefined\n\t\t\t\t\t\t\t|| !tableNamesSet.has(foreignKeyColumns[col.name]!.table)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t\t\t&& col.notNull === false;\n\n\t\t\t\t\tif (predicate === true) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(foreignKeyColumns[col.name]?.table === undefined\n\t\t\t\t\t\t\t\t|| !tableNamesSet.has(foreignKeyColumns[col.name]!.table)) && col.notNull === false\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t`Column '${col.name}' in '${table.name}' table will be filled with Null values`\n\t\t\t\t\t\t\t\t\t+ `\\nbecause you specified neither a table for foreign key on column '${col.name}'`\n\t\t\t\t\t\t\t\t\t+ `\\nnor a function for '${col.name}' column in refinements.`\n\t\t\t\t\t\t\t\t\t+ `\\n\\nFor more details, check this: https://orm.drizzle.team/docs/guides/seeding-with-partially-exposed-tables#example-2`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcolumnPossibleGenerator.generator = new generatorsMap.GenerateDefault[0]({ defaultValue: null });\n\t\t\t\t\t\tcolumnPossibleGenerator.wasDefinedBefore = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcolumnPossibleGenerator.generator = new generatorsMap.HollowGenerator[0]();\n\t\t\t\t\t}\n\t\t\t\t} // TODO: rewrite pickGeneratorFor... using new col properties: isUnique and notNull\n\t\t\t\telse if (connectionType === 'postgresql') {\n\t\t\t\t\tcolumnPossibleGenerator.generator = this.selectGeneratorForPostgresColumn(\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\tcol,\n\t\t\t\t\t);\n\t\t\t\t} else if (connectionType === 'mysql') {\n\t\t\t\t\tcolumnPossibleGenerator.generator = this.selectGeneratorForMysqlColumn(\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\tcol,\n\t\t\t\t\t);\n\t\t\t\t} else if (connectionType === 'sqlite') {\n\t\t\t\t\tcolumnPossibleGenerator.generator = this.selectGeneratorForSqlite(\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\tcol,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (columnPossibleGenerator.generator === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`column with type ${col.columnType} is not supported for now.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst arrayGen = columnPossibleGenerator.generator.replaceIfArray();\n\t\t\t\tif (arrayGen !== undefined) {\n\t\t\t\t\tcolumnPossibleGenerator.generator = arrayGen;\n\t\t\t\t}\n\n\t\t\t\tcolumnPossibleGenerator.generator.isUnique = col.isUnique;\n\t\t\t\tconst uniqueGen = columnPossibleGenerator.generator.replaceIfUnique();\n\t\t\t\tif (uniqueGen !== undefined) {\n\t\t\t\t\tcolumnPossibleGenerator.generator = uniqueGen;\n\t\t\t\t}\n\n\t\t\t\t// selecting version of generator\n\t\t\t\tcolumnPossibleGenerator.generator = this.selectVersionOfGenerator(columnPossibleGenerator.generator);\n\n\t\t\t\t// TODO: for now only GenerateValuesFromArray support notNull property\n\t\t\t\tcolumnPossibleGenerator.generator.notNull = col.notNull;\n\t\t\t\tcolumnPossibleGenerator.generator.dataType = col.dataType;\n\t\t\t\tcolumnPossibleGenerator.generator.stringLength = col.typeParams.length;\n\n\t\t\t\ttablePossibleGenerators.columnsPossibleGenerators.push(\n\t\t\t\t\tcolumnPossibleGenerator,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn tablesPossibleGenerators;\n\t};\n\n\tselectVersionOfGenerator = (generator: AbstractGenerator<any>) => {\n\t\tconst entityKind = generator.getEntityKind();\n\t\tif (entityKind === 'GenerateArray') {\n\t\t\tconst oldBaseColumnGen = (generator as GenerateArray).params.baseColumnGen;\n\n\t\t\tconst newBaseColumnGen = this.selectVersionOfGenerator(oldBaseColumnGen);\n\t\t\t// newGenerator.baseColumnDataType = oldGenerator.baseColumnDataType;\n\n\t\t\t(generator as GenerateArray).params.baseColumnGen = newBaseColumnGen;\n\t\t}\n\n\t\tconst possibleGeneratorConstructors = generatorsMap[entityKind as keyof typeof generatorsMap];\n\n\t\tconst possibleGeneratorConstructorsFiltered = possibleGeneratorConstructors?.filter((possGenCon) =>\n\t\t\tpossGenCon.version <= this.version! // sorting in ascending order by version\n\t\t).sort((a, b) => a.version - b.version);\n\t\tconst generatorConstructor = possibleGeneratorConstructorsFiltered?.at(-1) as\n\t\t\t| (new(params: any) => AbstractGenerator<any>)\n\t\t\t| undefined;\n\t\tif (generatorConstructor === undefined) {\n\t\t\tthrow new Error(`Can't select ${entityKind} generator for ${this.version} version.`);\n\t\t}\n\n\t\tconst newGenerator = new generatorConstructor(generator.params);\n\t\tnewGenerator.baseColumnDataType = generator.baseColumnDataType;\n\t\tnewGenerator.isUnique = generator.isUnique;\n\t\t// TODO: for now only GenerateValuesFromArray support notNull property\n\t\tnewGenerator.notNull = generator.notNull;\n\t\tnewGenerator.dataType = generator.dataType;\n\t\tnewGenerator.stringLength = generator.stringLength;\n\n\t\treturn newGenerator;\n\t};\n\n\tcyclicTablesCompare = (\n\t\ttable1: Table,\n\t\ttable2: Table,\n\t\trelation: Relation & { isCyclic: boolean },\n\t\treverseRelation: Relation & { isCyclic: boolean } | undefined,\n\t) => {\n\t\t// TODO: revise\n\t\tconst hasTable1NotNullColumns = relation.columns.some((colIName) =>\n\t\t\ttable1.columns.find((colJ) => colJ.name === colIName)?.notNull === true\n\t\t);\n\n\t\tif (reverseRelation !== undefined) {\n\t\t\tconst hasTable2NotNullColumns = reverseRelation.columns.some((colIName) =>\n\t\t\t\ttable2.columns.find((colJ) => colJ.name === colIName)?.notNull === true\n\t\t\t);\n\n\t\t\tif (hasTable1NotNullColumns && hasTable2NotNullColumns) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`The '${table1.name}' and '${table2.name}' tables have not null foreign keys. You can't seed cyclic tables with not null foreign key columns.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (hasTable1NotNullColumns) return 1;\n\t\t\telse if (hasTable2NotNullColumns) return -1;\n\t\t\treturn 0;\n\t\t}\n\n\t\tif (hasTable1NotNullColumns) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\n\t\t// if (hasTable1NotNullColumns) return 1;\n\t\t// else if (hasTable2NotNullColumns) return -1;\n\t};\n\n\tgetOrderedTablesList = (\n\t\ttablesInOutRelations: ReturnType<typeof this.getInfoFromRelations>['tablesInOutRelations'],\n\t): string[] => {\n\t\tconst leafTablesNames = Object.entries(tablesInOutRelations)\n\t\t\t.filter(\n\t\t\t\t(tableRel) =>\n\t\t\t\t\ttableRel[1].out === 0\n\t\t\t\t\t|| (tableRel[1].out !== 0\n\t\t\t\t\t\t&& tableRel[1].selfRelCount === tableRel[1].out),\n\t\t\t)\n\t\t\t.map((tableRel) => tableRel[0]);\n\n\t\tconst orderedTablesNames: string[] = [];\n\t\tlet parent: string, children: string[];\n\t\tfor (let i = 0; leafTablesNames.length !== 0; i++) {\n\t\t\tparent = leafTablesNames.shift() as string;\n\n\t\t\tif (orderedTablesNames.includes(parent)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (tablesInOutRelations[parent] === undefined) {\n\t\t\t\torderedTablesNames.push(parent);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (const orderedTableName of orderedTablesNames) {\n\t\t\t\ttablesInOutRelations[parent]!.requiredTableNames.delete(orderedTableName);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\ttablesInOutRelations[parent]!.requiredTableNames.size === 0\n\t\t\t\t|| equalSets(\n\t\t\t\t\ttablesInOutRelations[parent]!.requiredTableNames,\n\t\t\t\t\ttablesInOutRelations[parent]!.dependantTableNames,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\torderedTablesNames.push(parent);\n\t\t\t} else {\n\t\t\t\tleafTablesNames.push(...tablesInOutRelations[parent]!.requiredTableNames, parent);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tchildren = [...tablesInOutRelations[parent]!.dependantTableNames];\n\t\t\tleafTablesNames.push(...children);\n\t\t}\n\t\treturn orderedTablesNames;\n\t};\n\n\tgetInfoFromRelations = (relations: (Relation & { isCyclic: boolean })[]) => {\n\t\tconst tablesInOutRelations: {\n\t\t\t[tableName: string]: {\n\t\t\t\tout: number;\n\t\t\t\tin: number;\n\t\t\t\tselfRelation: boolean;\n\t\t\t\tselfRelCount: number;\n\t\t\t\trequiredTableNames: Set<string>;\n\t\t\t\tdependantTableNames: Set<string>;\n\t\t\t};\n\t\t} = {};\n\n\t\t// const cyclicRelations: { [cyclicTableName: string]: Relation & { isCyclic: boolean } } = {};\n\n\t\tfor (const rel of relations) {\n\t\t\t// if (rel.isCyclic) {\n\t\t\t// \tcyclicRelations[rel.table] = rel;\n\t\t\t// }\n\n\t\t\tif (tablesInOutRelations[rel.table] === undefined) {\n\t\t\t\ttablesInOutRelations[rel.table] = {\n\t\t\t\t\tout: 0,\n\t\t\t\t\tin: 0,\n\t\t\t\t\tselfRelation: false,\n\t\t\t\t\tselfRelCount: 0,\n\t\t\t\t\trequiredTableNames: new Set(),\n\t\t\t\t\tdependantTableNames: new Set(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\trel.refTable !== undefined\n\t\t\t\t&& tablesInOutRelations[rel.refTable] === undefined\n\t\t\t) {\n\t\t\t\ttablesInOutRelations[rel.refTable] = {\n\t\t\t\t\tout: 0,\n\t\t\t\t\tin: 0,\n\t\t\t\t\tselfRelation: false,\n\t\t\t\t\tselfRelCount: 0,\n\t\t\t\t\trequiredTableNames: new Set(),\n\t\t\t\t\tdependantTableNames: new Set(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (rel.refTable !== undefined) {\n\t\t\t\ttablesInOutRelations[rel.table]!.out += 1;\n\t\t\t\ttablesInOutRelations[rel.refTable]!.in += 1;\n\t\t\t}\n\n\t\t\tif (rel.refTable === rel.table) {\n\t\t\t\ttablesInOutRelations[rel.table]!.selfRelation = true;\n\t\t\t\ttablesInOutRelations[rel.table]!.selfRelCount = rel.columns.length;\n\t\t\t} else if (rel.refTable !== undefined) {\n\t\t\t\ttablesInOutRelations[rel.table]!.requiredTableNames.add(rel.refTable);\n\t\t\t\ttablesInOutRelations[rel.refTable]!.dependantTableNames.add(rel.table);\n\t\t\t}\n\t\t}\n\n\t\treturn { tablesInOutRelations };\n\t};\n\n\tgetWeightedWithCount = (\n\t\tweightedCount: { weight: number; count: number | number[] }[],\n\t\tcount: number,\n\t\tseed: number,\n\t) => {\n\t\tlet gen = new generatorsMap.GenerateWeightedCount[0]();\n\t\tgen = this.selectVersionOfGenerator(gen) as GenerateWeightedCount;\n\t\t// const gen = new GenerateWeightedCount({});\n\t\tgen.init({ count: weightedCount, seed });\n\t\tlet weightedWithCount = 0;\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tweightedWithCount += gen.generate();\n\t\t}\n\n\t\treturn weightedWithCount;\n\t};\n\n\t// TODO: revise serial part generators\n\tselectGeneratorForPostgresColumn = (\n\t\ttable: Table,\n\t\tcol: Column,\n\t) => {\n\t\tconst pickGenerator = (table: Table, col: Column) => {\n\t\t\t// ARRAY\n\t\t\tif (col.columnType.match(/\\[\\w*]/g) !== null && col.baseColumn !== undefined) {\n\t\t\t\tconst baseColumnGen = this.selectGeneratorForPostgresColumn(\n\t\t\t\t\ttable,\n\t\t\t\t\tcol.baseColumn!,\n\t\t\t\t) as AbstractGenerator;\n\t\t\t\tif (baseColumnGen === undefined) {\n\t\t\t\t\tthrow new Error(`column with type ${col.baseColumn!.columnType} is not supported for now.`);\n\t\t\t\t}\n\n\t\t\t\t// const getBaseColumnDataType = (baseColumn: Column) => {\n\t\t\t\t// \tif (baseColumn.baseColumn !== undefined) {\n\t\t\t\t// \t\treturn getBaseColumnDataType(baseColumn.baseColumn);\n\t\t\t\t// \t}\n\n\t\t\t\t// \treturn baseColumn.dataType;\n\t\t\t\t// };\n\t\t\t\t// const baseColumnDataType = getBaseColumnDataType(col.baseColumn);\n\n\t\t\t\tconst generator = new generatorsMap.GenerateArray[0]({ baseColumnGen, size: col.size });\n\t\t\t\t// generator.baseColumnDataType = baseColumnDataType;\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// ARRAY for studio\n\t\t\tif (col.columnType.match(/\\[\\w*]/g) !== null) {\n\t\t\t\t// remove dimensions from type\n\t\t\t\tconst baseColumnType = col.columnType.replace(/\\[\\w*]/g, '');\n\t\t\t\tconst baseColumn: Column = {\n\t\t\t\t\t...col,\n\t\t\t\t};\n\t\t\t\tbaseColumn.columnType = baseColumnType;\n\n\t\t\t\tconst baseColumnGen = this.selectGeneratorForPostgresColumn(table, baseColumn) as AbstractGenerator;\n\t\t\t\tif (baseColumnGen === undefined) {\n\t\t\t\t\tthrow new Error(`column with type ${col.baseColumn!.columnType} is not supported for now.`);\n\t\t\t\t}\n\n\t\t\t\tlet generator = new generatorsMap.GenerateArray[0]({ baseColumnGen });\n\n\t\t\t\tfor (let i = 0; i < col.typeParams.dimensions! - 1; i++) {\n\t\t\t\t\tgenerator = new generatorsMap.GenerateArray[0]({ baseColumnGen: generator });\n\t\t\t\t}\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// INT ------------------------------------------------------------------------------------------------------------\n\t\t\tif (\n\t\t\t\t(col.columnType.includes('serial')\n\t\t\t\t\t|| col.columnType === 'integer'\n\t\t\t\t\t|| col.columnType === 'smallint'\n\t\t\t\t\t|| col.columnType.includes('bigint'))\n\t\t\t\t&& table.primaryKeys.includes(col.name)\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateIntPrimaryKey[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tlet minValue: number | bigint | undefined;\n\t\t\tlet maxValue: number | bigint | undefined;\n\t\t\tif (col.columnType.includes('serial')) {\n\t\t\t\tminValue = 1;\n\t\t\t\tif (col.columnType === 'smallserial') {\n\t\t\t\t\t// 2^16 / 2 - 1, 2 bytes\n\t\t\t\t\tmaxValue = 32767;\n\t\t\t\t} else if (col.columnType === 'serial') {\n\t\t\t\t\t// 2^32 / 2 - 1, 4 bytes\n\t\t\t\t\tmaxValue = 2147483647;\n\t\t\t\t} else if (col.columnType === 'bigserial') {\n\t\t\t\t\t// 2^64 / 2 - 1, 8 bytes\n\t\t\t\t\tminValue = BigInt(1);\n\t\t\t\t\tmaxValue = BigInt('9223372036854775807');\n\t\t\t\t}\n\t\t\t} else if (col.columnType.includes('int')) {\n\t\t\t\tif (col.columnType === 'smallint') {\n\t\t\t\t\t// 2^16 / 2 - 1, 2 bytes\n\t\t\t\t\tminValue = -32768;\n\t\t\t\t\tmaxValue = 32767;\n\t\t\t\t} else if (col.columnType === 'integer') {\n\t\t\t\t\t// 2^32 / 2 - 1, 4 bytes\n\t\t\t\t\tminValue = -2147483648;\n\t\t\t\t\tmaxValue = 2147483647;\n\t\t\t\t} else if (col.columnType.includes('bigint')) {\n\t\t\t\t\tif (col.dataType === 'bigint') {\n\t\t\t\t\t\t// 2^64 / 2 - 1, 8 bytes\n\t\t\t\t\t\tminValue = BigInt('-9223372036854775808');\n\t\t\t\t\t\tmaxValue = BigInt('9223372036854775807');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// if (col.dataType === 'number')\n\t\t\t\t\t\t// if you’re expecting values above 2^31 but below 2^53\n\t\t\t\t\t\tminValue = -9007199254740991;\n\t\t\t\t\t\tmaxValue = 9007199254740991;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tcol.columnType.includes('int')\n\t\t\t\t&& !col.columnType.includes('interval')\n\t\t\t\t&& !col.columnType.includes('point')\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateInt[0]({\n\t\t\t\t\tminValue,\n\t\t\t\t\tmaxValue,\n\t\t\t\t});\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (col.columnType.includes('serial')) {\n\t\t\t\tconst generator = new generatorsMap.GenerateIntPrimaryKey[0]();\n\n\t\t\t\tgenerator.maxValue = maxValue;\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// NUMBER(real, double, decimal, numeric)\n\t\t\tif (\n\t\t\t\tcol.columnType.startsWith('real')\n\t\t\t\t|| col.columnType.startsWith('double precision')\n\t\t\t\t|| col.columnType.startsWith('decimal')\n\t\t\t\t|| col.columnType.startsWith('numeric')\n\t\t\t) {\n\t\t\t\tif (col.typeParams.precision !== undefined) {\n\t\t\t\t\tconst precision = col.typeParams.precision;\n\t\t\t\t\tconst scale = col.typeParams.scale === undefined ? 0 : col.typeParams.scale;\n\n\t\t\t\t\tconst maxAbsoluteValue = Math.pow(10, precision - scale) - Math.pow(10, -scale);\n\t\t\t\t\tconst generator = new generatorsMap.GenerateNumber[0]({\n\t\t\t\t\t\tminValue: -maxAbsoluteValue,\n\t\t\t\t\t\tmaxValue: maxAbsoluteValue,\n\t\t\t\t\t\tprecision: Math.pow(10, scale),\n\t\t\t\t\t});\n\t\t\t\t\treturn generator;\n\t\t\t\t}\n\t\t\t\tconst generator = new generatorsMap.GenerateNumber[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// STRING\n\t\t\tif (\n\t\t\t\t(col.columnType === 'text'\n\t\t\t\t\t|| col.columnType.startsWith('varchar')\n\t\t\t\t\t|| col.columnType.startsWith('char'))\n\t\t\t\t&& table.primaryKeys.includes(col.name)\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateUniqueString[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(col.columnType === 'text'\n\t\t\t\t\t|| col.columnType.startsWith('varchar')\n\t\t\t\t\t|| col.columnType.startsWith('char'))\n\t\t\t\t&& col.name.toLowerCase().includes('name')\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateFirstName[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(col.columnType === 'text'\n\t\t\t\t\t|| col.columnType.startsWith('varchar')\n\t\t\t\t\t|| col.columnType.startsWith('char'))\n\t\t\t\t&& col.name.toLowerCase().includes('email')\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateEmail[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tcol.columnType === 'text'\n\t\t\t\t|| col.columnType.startsWith('varchar')\n\t\t\t\t|| col.columnType.startsWith('char')\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateString[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// UUID\n\t\t\tif (col.columnType === 'uuid') {\n\t\t\t\tconst generator = new generatorsMap.GenerateUUID[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// BOOLEAN\n\t\t\tif (col.columnType === 'boolean') {\n\t\t\t\tconst generator = new generatorsMap.GenerateBoolean[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// DATE, TIME, TIMESTAMP\n\t\t\tif (col.columnType.includes('date')) {\n\t\t\t\tconst generator = new generatorsMap.GenerateDate[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (col.columnType === 'time') {\n\t\t\t\tconst generator = new generatorsMap.GenerateTime[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (col.columnType.includes('timestamp')) {\n\t\t\t\tconst generator = new generatorsMap.GenerateTimestamp[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// JSON, JSONB\n\t\t\tif (col.columnType === 'json' || col.columnType === 'jsonb') {\n\t\t\t\tconst generator = new generatorsMap.GenerateJson[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// if (col.columnType === \"jsonb\") {\n\t\t\t//   const generator = new GenerateJsonb({});\n\t\t\t//   return generator;\n\t\t\t// }\n\n\t\t\t// ENUM\n\t\t\tif (col.enumValues !== undefined) {\n\t\t\t\tconst generator = new generatorsMap.GenerateEnum[0]({\n\t\t\t\t\tenumValues: col.enumValues,\n\t\t\t\t});\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// INTERVAL\n\t\t\tif (col.columnType.startsWith('interval')) {\n\t\t\t\tif (col.columnType === 'interval') {\n\t\t\t\t\tconst generator = new generatorsMap.GenerateInterval[0]();\n\n\t\t\t\t\treturn generator;\n\t\t\t\t}\n\n\t\t\t\tconst fields = col.columnType.replace('interval ', '') as GenerateInterval['params']['fields'];\n\t\t\t\tconst generator = new generatorsMap.GenerateInterval[0]({ fields });\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// POINT, LINE\n\t\t\tif (col.columnType.includes('point')) {\n\t\t\t\tconst generator = new generatorsMap.GeneratePoint[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (col.columnType.includes('line')) {\n\t\t\t\tconst generator = new generatorsMap.GenerateLine[0]();\n\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (col.hasDefault && col.default !== undefined) {\n\t\t\t\tconst generator = new generatorsMap.GenerateDefault[0]({\n\t\t\t\t\tdefaultValue: col.default,\n\t\t\t\t});\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\treturn;\n\t\t};\n\n\t\tconst generator = pickGenerator(table, col);\n\t\tif (generator !== undefined) {\n\t\t\tgenerator.isUnique = col.isUnique;\n\t\t\tgenerator.dataType = col.dataType;\n\t\t\tgenerator.stringLength = col.typeParams.length;\n\t\t}\n\n\t\treturn generator;\n\t};\n\n\tselectGeneratorForMysqlColumn = (\n\t\ttable: Table,\n\t\tcol: Column,\n\t) => {\n\t\tconst pickGenerator = (table: Table, col: Column) => {\n\t\t\t// INT ------------------------------------------------------------------------------------------------------------\n\t\t\tif (\n\t\t\t\t(col.columnType.includes('serial') || col.columnType.includes('int'))\n\t\t\t\t&& table.primaryKeys.includes(col.name)\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateIntPrimaryKey[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tlet minValue: number | bigint | undefined;\n\t\t\tlet maxValue: number | bigint | undefined;\n\t\t\tif (col.columnType === 'serial') {\n\t\t\t\t// 2^64 % 2 - 1, 8 bytes\n\t\t\t\tminValue = BigInt(0);\n\t\t\t\tmaxValue = BigInt('9223372036854775807');\n\t\t\t} else if (col.columnType.includes('int')) {\n\t\t\t\tif (col.columnType === 'tinyint') {\n\t\t\t\t\t// 2^8 / 2 - 1, 1 bytes\n\t\t\t\t\tminValue = -128;\n\t\t\t\t\tmaxValue = 127;\n\t\t\t\t} else if (col.columnType === 'smallint') {\n\t\t\t\t\t// 2^16 / 2 - 1, 2 bytes\n\t\t\t\t\tminValue = -32768;\n\t\t\t\t\tmaxValue = 32767;\n\t\t\t\t} else if (col.columnType === 'mediumint') {\n\t\t\t\t\t// 2^16 / 2 - 1, 2 bytes\n\t\t\t\t\tminValue = -8388608;\n\t\t\t\t\tmaxValue = 8388607;\n\t\t\t\t} else if (col.columnType === 'int') {\n\t\t\t\t\t// 2^32 / 2 - 1, 4 bytes\n\t\t\t\t\tminValue = -2147483648;\n\t\t\t\t\tmaxValue = 2147483647;\n\t\t\t\t} else if (col.columnType === 'bigint') {\n\t\t\t\t\t// 2^64 / 2 - 1, 8 bytes\n\t\t\t\t\tminValue = BigInt('-9223372036854775808');\n\t\t\t\t\tmaxValue = BigInt('9223372036854775807');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (col.columnType.includes('int')) {\n\t\t\t\tconst generator = new generatorsMap.GenerateInt[0]({\n\t\t\t\t\tminValue,\n\t\t\t\t\tmaxValue,\n\t\t\t\t});\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (col.columnType.includes('serial')) {\n\t\t\t\tconst generator = new generatorsMap.GenerateIntPrimaryKey[0]();\n\t\t\t\tgenerator.maxValue = maxValue;\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// NUMBER(real, double, decimal, float)\n\t\t\tif (\n\t\t\t\tcol.columnType.startsWith('real')\n\t\t\t\t|| col.columnType.startsWith('double')\n\t\t\t\t|| col.columnType.startsWith('decimal')\n\t\t\t\t|| col.columnType.startsWith('float')\n\t\t\t\t|| col.columnType.startsWith('numeric')\n\t\t\t) {\n\t\t\t\tif (col.typeParams.precision !== undefined) {\n\t\t\t\t\tconst precision = col.typeParams.precision;\n\t\t\t\t\tconst scale = col.typeParams.scale === undefined ? 0 : col.typeParams.scale;\n\n\t\t\t\t\tconst maxAbsoluteValue = Math.pow(10, precision - scale) - Math.pow(10, -scale);\n\t\t\t\t\tconst generator = new generatorsMap.GenerateNumber[0]({\n\t\t\t\t\t\tminValue: -maxAbsoluteValue,\n\t\t\t\t\t\tmaxValue: maxAbsoluteValue,\n\t\t\t\t\t\tprecision: Math.pow(10, scale),\n\t\t\t\t\t});\n\t\t\t\t\treturn generator;\n\t\t\t\t}\n\n\t\t\t\tconst generator = new generatorsMap.GenerateNumber[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// STRING\n\t\t\tif (\n\t\t\t\t(col.columnType === 'text'\n\t\t\t\t\t|| col.columnType === 'blob'\n\t\t\t\t\t|| col.columnType.startsWith('char')\n\t\t\t\t\t|| col.columnType.startsWith('varchar')\n\t\t\t\t\t|| col.columnType.startsWith('binary')\n\t\t\t\t\t|| col.columnType.startsWith('varbinary'))\n\t\t\t\t&& table.primaryKeys.includes(col.name)\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateUniqueString[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(col.columnType === 'text'\n\t\t\t\t\t|| col.columnType === 'blob'\n\t\t\t\t\t|| col.columnType.startsWith('char')\n\t\t\t\t\t|| col.columnType.startsWith('varchar')\n\t\t\t\t\t|| col.columnType.startsWith('binary')\n\t\t\t\t\t|| col.columnType.startsWith('varbinary'))\n\t\t\t\t&& col.name.toLowerCase().includes('name')\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateFirstName[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(col.columnType === 'text'\n\t\t\t\t\t|| col.columnType === 'blob'\n\t\t\t\t\t|| col.columnType.startsWith('char')\n\t\t\t\t\t|| col.columnType.startsWith('varchar')\n\t\t\t\t\t|| col.columnType.startsWith('binary')\n\t\t\t\t\t|| col.columnType.startsWith('varbinary'))\n\t\t\t\t&& col.name.toLowerCase().includes('email')\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateEmail[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tcol.columnType === 'text'\n\t\t\t\t|| col.columnType === 'blob'\n\t\t\t\t|| col.columnType.startsWith('char')\n\t\t\t\t|| col.columnType.startsWith('varchar')\n\t\t\t\t|| col.columnType.startsWith('binary')\n\t\t\t\t|| col.columnType.startsWith('varbinary')\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateString[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// BOOLEAN\n\t\t\tif (col.columnType === 'boolean') {\n\t\t\t\tconst generator = new generatorsMap.GenerateBoolean[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// DATE, TIME, TIMESTAMP, DATETIME, YEAR\n\t\t\tif (col.columnType.includes('datetime')) {\n\t\t\t\tconst generator = new generatorsMap.GenerateDatetime[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (col.columnType.includes('date')) {\n\t\t\t\tconst generator = new generatorsMap.GenerateDate[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (col.columnType === 'time') {\n\t\t\t\tconst generator = new generatorsMap.GenerateTime[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (col.columnType.includes('timestamp')) {\n\t\t\t\tconst generator = new generatorsMap.GenerateTimestamp[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (col.columnType === 'year') {\n\t\t\t\tconst generator = new generatorsMap.GenerateYear[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// JSON\n\t\t\tif (col.columnType === 'json') {\n\t\t\t\tconst generator = new generatorsMap.GenerateJson[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// ENUM\n\t\t\tif (col.enumValues !== undefined) {\n\t\t\t\tconst generator = new generatorsMap.GenerateEnum[0]({\n\t\t\t\t\tenumValues: col.enumValues,\n\t\t\t\t});\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (col.hasDefault && col.default !== undefined) {\n\t\t\t\tconst generator = new generatorsMap.GenerateDefault[0]({\n\t\t\t\t\tdefaultValue: col.default,\n\t\t\t\t});\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\treturn;\n\t\t};\n\n\t\tconst generator = pickGenerator(table, col);\n\n\t\treturn generator;\n\t};\n\n\tselectGeneratorForSqlite = (\n\t\ttable: Table,\n\t\tcol: Column,\n\t) => {\n\t\tconst pickGenerator = (table: Table, col: Column) => {\n\t\t\t// int section ---------------------------------------------------------------------------------------\n\t\t\tif (\n\t\t\t\t(col.columnType === 'integer' || col.columnType === 'numeric')\n\t\t\t\t&& table.primaryKeys.includes(col.name)\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateIntPrimaryKey[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (col.columnType === 'integer' && col.dataType === 'boolean') {\n\t\t\t\tconst generator = new generatorsMap.GenerateBoolean[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif ((col.columnType === 'integer' && col.dataType === 'date')) {\n\t\t\t\tconst generator = new generatorsMap.GenerateTimestamp[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tcol.columnType === 'integer'\n\t\t\t\t|| (col.dataType === 'bigint' && col.columnType === 'blob')\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateInt[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// number section ------------------------------------------------------------------------------------\n\t\t\tif (col.columnType.startsWith('real') || col.columnType.startsWith('numeric')) {\n\t\t\t\tif (col.typeParams.precision !== undefined) {\n\t\t\t\t\tconst precision = col.typeParams.precision;\n\t\t\t\t\tconst scale = col.typeParams.scale === undefined ? 0 : col.typeParams.scale;\n\n\t\t\t\t\tconst maxAbsoluteValue = Math.pow(10, precision - scale) - Math.pow(10, -scale);\n\t\t\t\t\tconst generator = new generatorsMap.GenerateNumber[0]({\n\t\t\t\t\t\tminValue: -maxAbsoluteValue,\n\t\t\t\t\t\tmaxValue: maxAbsoluteValue,\n\t\t\t\t\t\tprecision: Math.pow(10, scale),\n\t\t\t\t\t});\n\t\t\t\t\treturn generator;\n\t\t\t\t}\n\n\t\t\t\tconst generator = new generatorsMap.GenerateNumber[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\t// string section ------------------------------------------------------------------------------------\n\t\t\tif (\n\t\t\t\t(col.columnType.startsWith('text')\n\t\t\t\t\t|| col.columnType.startsWith('numeric')\n\t\t\t\t\t|| col.columnType.startsWith('blob'))\n\t\t\t\t&& table.primaryKeys.includes(col.name)\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateUniqueString[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(col.columnType.startsWith('text')\n\t\t\t\t\t|| col.columnType.startsWith('numeric')\n\t\t\t\t\t|| col.columnType.startsWith('blob'))\n\t\t\t\t&& col.name.toLowerCase().includes('name')\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateFirstName[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(col.columnType.startsWith('text')\n\t\t\t\t\t|| col.columnType.startsWith('numeric')\n\t\t\t\t\t|| col.columnType.startsWith('blob'))\n\t\t\t\t&& col.name.toLowerCase().includes('email')\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateEmail[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tcol.columnType.startsWith('text')\n\t\t\t\t|| col.columnType.startsWith('numeric')\n\t\t\t\t|| col.columnType.startsWith('blob')\n\t\t\t\t|| col.columnType.startsWith('blobbuffer')\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateString[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(col.columnType.startsWith('text') && col.dataType === 'json')\n\t\t\t\t|| (col.columnType.startsWith('blob') && col.dataType === 'json')\n\t\t\t) {\n\t\t\t\tconst generator = new generatorsMap.GenerateJson[0]();\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\tif (col.hasDefault && col.default !== undefined) {\n\t\t\t\tconst generator = new generatorsMap.GenerateDefault[0]({\n\t\t\t\t\tdefaultValue: col.default,\n\t\t\t\t});\n\t\t\t\treturn generator;\n\t\t\t}\n\n\t\t\treturn;\n\t\t};\n\n\t\tconst generator = pickGenerator(table, col);\n\n\t\treturn generator;\n\t};\n\n\tfilterCyclicTables = (tablesGenerators: ReturnType<typeof this.generatePossibleGenerators>) => {\n\t\tconst filteredTablesGenerators = tablesGenerators.filter((tableGen) =>\n\t\t\ttableGen.columnsPossibleGenerators.some((columnGen) =>\n\t\t\t\tcolumnGen.isCyclic === true && columnGen.wasDefinedBefore === true\n\t\t\t)\n\t\t);\n\n\t\tconst tablesUniqueNotNullColumn: { [tableName: string]: { uniqueNotNullColName: string } } = {};\n\n\t\tfor (const [idx, tableGen] of filteredTablesGenerators.entries()) {\n\t\t\tconst uniqueNotNullColName = filteredTablesGenerators[idx]!.columnsPossibleGenerators.find((colGen) =>\n\t\t\t\tcolGen.primary === true\n\t\t\t\t|| (colGen.isUnique === true\n\t\t\t\t\t&& colGen.notNull === true)\n\t\t\t)?.columnName;\n\t\t\tif (uniqueNotNullColName === undefined) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Table '${tableGen.tableName}' does not have primary or (unique and notNull) column. Can't seed table with cyclic relation.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\ttablesUniqueNotNullColumn[tableGen.tableName] = { uniqueNotNullColName };\n\n\t\t\tfilteredTablesGenerators[idx]!.columnsPossibleGenerators = tableGen.columnsPossibleGenerators.filter((colGen) =>\n\t\t\t\t(colGen.isCyclic === true && colGen.wasDefinedBefore === true) || colGen.columnName === uniqueNotNullColName\n\t\t\t).map((colGen) => {\n\t\t\t\tconst newColGen = { ...colGen };\n\t\t\t\tnewColGen.wasDefinedBefore = false;\n\t\t\t\treturn newColGen;\n\t\t\t});\n\t\t}\n\n\t\treturn { filteredTablesGenerators, tablesUniqueNotNullColumn };\n\t};\n\n\tgenerateTablesValues = async (\n\t\trelations: (Relation & { isCyclic: boolean })[],\n\t\ttablesGenerators: ReturnType<typeof this.generatePossibleGenerators>,\n\t\tdb?:\n\t\t\t| PgDatabase<any>\n\t\t\t| MySqlDatabase<any, any>\n\t\t\t| BaseSQLiteDatabase<any, any>,\n\t\tschema?: { [key: string]: PgTable | MySqlTable | SQLiteTable },\n\t\toptions?: {\n\t\t\tcount?: number;\n\t\t\tseed?: number;\n\t\t\tpreserveData?: boolean;\n\t\t\tpreserveCyclicTablesData?: boolean;\n\t\t\tinsertDataInDb?: boolean;\n\t\t\tupdateDataInDb?: boolean;\n\t\t\ttablesValues?: {\n\t\t\t\ttableName: string;\n\t\t\t\trows: {\n\t\t\t\t\t[columnName: string]: string | number | boolean | undefined;\n\t\t\t\t}[];\n\t\t\t}[];\n\t\t\ttablesUniqueNotNullColumn?: { [tableName: string]: { uniqueNotNullColName: string } };\n\t\t},\n\t) => {\n\t\tconst customSeed = options?.seed === undefined ? 0 : options.seed;\n\t\tlet tableCount: number | undefined;\n\t\tlet columnsGenerators: Prettify<GeneratePossibleGeneratorsColumnType>[];\n\t\tlet tableGenerators: Prettify<TableGeneratorsType>;\n\n\t\tlet tableValues: {\n\t\t\t[columnName: string]: string | number | boolean | undefined;\n\t\t}[];\n\n\t\tlet tablesValues: {\n\t\t\ttableName: string;\n\t\t\trows: typeof tableValues;\n\t\t}[] = options?.tablesValues === undefined ? [] : options.tablesValues;\n\n\t\tlet pRNGSeed: number;\n\t\tlet filteredRelations: typeof relations;\n\n\t\tlet preserveData: boolean, insertDataInDb: boolean = true, updateDataInDb: boolean = false;\n\t\tif (options?.preserveData !== undefined) preserveData = options.preserveData;\n\t\tif (options?.insertDataInDb !== undefined) insertDataInDb = options.insertDataInDb;\n\t\tif (options?.updateDataInDb !== undefined) updateDataInDb = options.updateDataInDb;\n\t\tif (updateDataInDb === true) insertDataInDb = false;\n\n\t\t// TODO: now I'm generating tablesInOutRelations twice, first time in generatePossibleGenerators and second time here. maybe should generate it once instead.\n\t\tconst { tablesInOutRelations } = this.getInfoFromRelations(relations);\n\t\tfor (const table of tablesGenerators) {\n\t\t\ttableCount = table.count === undefined ? options?.count || this.defaultCountForTable : table.count;\n\n\t\t\ttableGenerators = {};\n\t\t\tcolumnsGenerators = table.columnsPossibleGenerators;\n\n\t\t\tfilteredRelations = relations.filter(\n\t\t\t\t(rel) => rel.table === table.tableName,\n\t\t\t);\n\n\t\t\t// adding pRNG seed to column\n\t\t\tfor (const col of columnsGenerators) {\n\t\t\t\tconst columnRelations = filteredRelations.filter((rel) => rel.columns.includes(col.columnName));\n\t\t\t\tpRNGSeed = (columnRelations.length !== 0\n\t\t\t\t\t\t&& columnRelations[0]!.columns.length >= 2)\n\t\t\t\t\t? (customSeed + generateHashFromString(\n\t\t\t\t\t\t`${columnRelations[0]!.table}.${columnRelations[0]!.columns.join('_')}`,\n\t\t\t\t\t))\n\t\t\t\t\t: (customSeed + generateHashFromString(`${table.tableName}.${col.columnName}`));\n\n\t\t\t\ttableGenerators[col.columnName] = {\n\t\t\t\t\tpRNGSeed,\n\t\t\t\t\t...col,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// get values to generate columns with foreign key\n\n\t\t\t// if table posts contains foreign key to table users, then rel.table === 'posts' and rel.refTable === 'users', because table posts has reference to table users.\n\t\t\tif (filteredRelations.length !== 0) {\n\t\t\t\tfor (const rel of filteredRelations) {\n\t\t\t\t\tif (\n\t\t\t\t\t\ttable.withFromTable[rel.refTable] !== undefined\n\t\t\t\t\t\t&& table.withCount !== undefined\n\t\t\t\t\t) {\n\t\t\t\t\t\ttableCount = table.withCount;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (let colIdx = 0; colIdx < rel.columns.length; colIdx++) {\n\t\t\t\t\t\tlet refColumnValues: (string | number | boolean)[];\n\t\t\t\t\t\tlet hasSelfRelation: boolean = false;\n\t\t\t\t\t\tlet repeatedValuesCount:\n\t\t\t\t\t\t\t\t| number\n\t\t\t\t\t\t\t\t| { weight: number; count: number | number[] }[]\n\t\t\t\t\t\t\t\t| undefined,\n\t\t\t\t\t\t\tweightedCountSeed: number | undefined;\n\t\t\t\t\t\tlet genObj: AbstractGenerator<any> | undefined;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\trel.table === rel.refTable\n\t\t\t\t\t\t\t&& tableGenerators[rel.columns[colIdx]!]?.wasRefined === false\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst refColName = rel.refColumns[colIdx] as string;\n\t\t\t\t\t\t\tpRNGSeed = generateHashFromString(\n\t\t\t\t\t\t\t\t`${table.tableName}.${refColName}`,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tconst refColumnGenerator: typeof tableGenerators = {};\n\t\t\t\t\t\t\trefColumnGenerator[refColName] = {\n\t\t\t\t\t\t\t\t...tableGenerators[refColName]!,\n\t\t\t\t\t\t\t\tpRNGSeed,\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\trefColumnValues = (await this.generateColumnsValuesByGenerators({\n\t\t\t\t\t\t\t\ttableGenerators: refColumnGenerator,\n\t\t\t\t\t\t\t\tcount: tableCount,\n\t\t\t\t\t\t\t\tpreserveData: true,\n\t\t\t\t\t\t\t\tinsertDataInDb: false,\n\t\t\t\t\t\t\t}))!.map((rows) => rows[refColName]) as (string | number | boolean)[];\n\n\t\t\t\t\t\t\thasSelfRelation = true;\n\t\t\t\t\t\t\tgenObj = new generatorsMap.GenerateSelfRelationsValuesFromArray[0]({\n\t\t\t\t\t\t\t\tvalues: refColumnValues,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tgenObj = this.selectVersionOfGenerator(genObj);\n\t\t\t\t\t\t\t// genObj = new GenerateSelfRelationsValuesFromArray({\n\t\t\t\t\t\t\t// \tvalues: refColumnValues,\n\t\t\t\t\t\t\t// });\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttableGenerators[rel.columns[colIdx]!]?.wasDefinedBefore === false\n\t\t\t\t\t\t\t&& tableGenerators[rel.columns[colIdx]!]?.wasRefined === false\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\trefColumnValues = tablesValues\n\t\t\t\t\t\t\t\t.find((val) => val.tableName === rel.refTable)!\n\t\t\t\t\t\t\t\t.rows!.map((row) => row[rel.refColumns[colIdx]!]!);\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttable.withFromTable[rel.refTable] !== undefined\n\t\t\t\t\t\t\t\t&& table.withFromTable[rel.refTable]!.repeatedValuesCount\n\t\t\t\t\t\t\t\t\t!== undefined\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\trepeatedValuesCount = table.withFromTable[rel.refTable]!.repeatedValuesCount;\n\t\t\t\t\t\t\t\tweightedCountSeed = table.withFromTable[rel.refTable]!.weightedCountSeed;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// TODO: revise maybe need to select version of generator here too\n\t\t\t\t\t\t\tgenObj = new generatorsMap.GenerateValuesFromArray[0]({ values: refColumnValues });\n\t\t\t\t\t\t\tgenObj.notNull = tableGenerators[rel.columns[colIdx]!]!.notNull;\n\t\t\t\t\t\t\tgenObj.weightedCountSeed = weightedCountSeed;\n\t\t\t\t\t\t\tgenObj.maxRepeatedValuesCount = repeatedValuesCount;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (genObj !== undefined) {\n\t\t\t\t\t\t\ttableGenerators[rel.columns[colIdx]!]!.generator = genObj;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttableGenerators[rel.columns[colIdx]!] = {\n\t\t\t\t\t\t\t...tableGenerators[rel.columns[colIdx]!]!,\n\t\t\t\t\t\t\thasSelfRelation,\n\t\t\t\t\t\t\thasRelation: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpreserveData = (\n\t\t\t\t\toptions?.preserveData === undefined\n\t\t\t\t\t&& tablesInOutRelations[table.tableName]?.in === 0\n\t\t\t\t)\n\t\t\t\t? false\n\t\t\t\t: true;\n\n\t\t\tpreserveData = preserveData || (options?.preserveCyclicTablesData === true\n\t\t\t\t&& table.columnsPossibleGenerators.some((colGen) => colGen.isCyclic === true));\n\n\t\t\ttableValues = await this.generateColumnsValuesByGenerators({\n\t\t\t\ttableGenerators,\n\t\t\t\tdb,\n\t\t\t\tschema,\n\t\t\t\ttableName: table.tableName,\n\t\t\t\tcount: tableCount,\n\t\t\t\tpreserveData,\n\t\t\t\tinsertDataInDb,\n\t\t\t\tupdateDataInDb,\n\t\t\t\tuniqueNotNullColName: options?.tablesUniqueNotNullColumn === undefined\n\t\t\t\t\t? undefined\n\t\t\t\t\t: options?.tablesUniqueNotNullColumn[table.tableName]?.uniqueNotNullColName,\n\t\t\t});\n\n\t\t\tif (preserveData === true) {\n\t\t\t\ttablesValues.push({\n\t\t\t\t\ttableName: table.tableName,\n\t\t\t\t\trows: tableValues,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// removing \"link\" from table that was required to generate current table\n\t\t\tif (tablesInOutRelations[table.tableName] !== undefined) {\n\t\t\t\tfor (const tableName of tablesInOutRelations[table.tableName]!.requiredTableNames) {\n\t\t\t\t\ttablesInOutRelations[tableName]!.in -= 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (preserveData === false) {\n\t\t\t\ttablesValues = tablesValues.filter(\n\t\t\t\t\t(table) =>\n\t\t\t\t\t\ttablesInOutRelations[table.tableName] !== undefined && tablesInOutRelations[table.tableName]!.in > 0,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn tablesValues;\n\t};\n\n\tgenerateColumnsValuesByGenerators = async ({\n\t\ttableGenerators,\n\t\tdb,\n\t\tschema,\n\t\ttableName,\n\t\tcount,\n\t\tpreserveData = true,\n\t\tinsertDataInDb = true,\n\t\tupdateDataInDb = false,\n\t\tuniqueNotNullColName,\n\t\tbatchSize = 10000,\n\t}: {\n\t\ttableGenerators: Prettify<TableGeneratorsType>;\n\t\tdb?:\n\t\t\t| PgDatabase<any>\n\t\t\t| MySqlDatabase<any, any>\n\t\t\t| BaseSQLiteDatabase<any, any>;\n\t\tschema?: { [key: string]: PgTable | MySqlTable | SQLiteTable };\n\t\ttableName?: string;\n\t\tcount?: number;\n\t\tpreserveData?: boolean;\n\t\tinsertDataInDb?: boolean;\n\t\tupdateDataInDb?: boolean;\n\t\tuniqueNotNullColName?: string;\n\t\tbatchSize?: number;\n\t}) => {\n\t\tif (count === undefined) {\n\t\t\tcount = this.defaultCountForTable;\n\t\t}\n\n\t\tif (updateDataInDb === true) {\n\t\t\tbatchSize = 1;\n\t\t}\n\n\t\tlet columnGenerator: (typeof tableGenerators)[string];\n\t\tconst columnsGenerators: {\n\t\t\t[columnName: string]: AbstractGenerator<any>;\n\t\t} = {};\n\t\tlet generatedValues: { [columnName: string]: number | string | boolean | undefined }[] = [];\n\n\t\tlet columnsNumber = 0;\n\t\tlet override = false;\n\t\tfor (const columnName of Object.keys(tableGenerators)) {\n\t\t\tcolumnsNumber += 1;\n\t\t\tcolumnGenerator = tableGenerators[columnName]!;\n\t\t\toverride = tableGenerators[columnName]?.generatedIdentityType === 'always' ? true : override;\n\n\t\t\tcolumnsGenerators[columnName] = columnGenerator.generator!;\n\t\t\tcolumnsGenerators[columnName]!.init({\n\t\t\t\tcount,\n\t\t\t\tseed: columnGenerator.pRNGSeed,\n\t\t\t});\n\n\t\t\t// const arrayGen = columnsGenerators[columnName]!.replaceIfArray({ count, seed: columnGenerator.pRNGSeed });\n\t\t\t// if (arrayGen !== undefined) {\n\t\t\t// \tcolumnsGenerators[columnName] = arrayGen;\n\t\t\t// }\n\n\t\t\t// const uniqueGen = columnsGenerators[columnName]!.replaceIfUnique({ count, seed: columnGenerator.pRNGSeed });\n\t\t\t// if (uniqueGen !== undefined) {\n\t\t\t// \tcolumnsGenerators[columnName] = uniqueGen;\n\t\t\t// }\n\t\t}\n\t\tlet maxParametersNumber: number;\n\t\tif (is(db, PgDatabase<any>)) {\n\t\t\t// @ts-ignore\n\t\t\tmaxParametersNumber = db.constructor[entityKind] === 'PgliteDatabase'\n\t\t\t\t? this.postgresPgLiteMaxParametersNumber\n\t\t\t\t: this.postgresMaxParametersNumber;\n\t\t} else if (is(db, MySqlDatabase<any, any>)) {\n\t\t\tmaxParametersNumber = this.mysqlMaxParametersNumber;\n\t\t} else {\n\t\t\t// is(db, BaseSQLiteDatabase<any, any>)\n\t\t\tmaxParametersNumber = this.sqliteMaxParametersNumber;\n\t\t}\n\t\tconst maxBatchSize = Math.floor(maxParametersNumber / columnsNumber);\n\t\tbatchSize = batchSize > maxBatchSize ? maxBatchSize : batchSize;\n\n\t\tif (\n\t\t\t(insertDataInDb === true || updateDataInDb === true)\n\t\t\t&& (db === undefined || schema === undefined || tableName === undefined)\n\t\t) {\n\t\t\tthrow new Error('db or schema or tableName is undefined.');\n\t\t}\n\n\t\tlet row: { [columnName: string]: string | number | boolean },\n\t\t\tgeneratedValue,\n\t\t\ti: number;\n\n\t\tfor (i = 0; i < count; i++) {\n\t\t\trow = {};\n\t\t\tgeneratedValues.push(row);\n\n\t\t\tfor (const columnName of Object.keys(columnsGenerators)) {\n\t\t\t\t// generatedValue = columnsGenerators[columnName].next().value as\n\t\t\t\t//   | string\n\t\t\t\t//   | number\n\t\t\t\t//   | boolean;\n\t\t\t\tgeneratedValue = columnsGenerators[columnName]!.generate({ i }) as\n\t\t\t\t\t| string\n\t\t\t\t\t| number\n\t\t\t\t\t| boolean;\n\t\t\t\trow[columnName as keyof typeof row] = generatedValue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(insertDataInDb === true || updateDataInDb === true)\n\t\t\t\t&& ((i + 1) % batchSize === 0 || i === count - 1)\n\t\t\t) {\n\t\t\t\tif (preserveData === false) {\n\t\t\t\t\tif (insertDataInDb === true) {\n\t\t\t\t\t\tawait this.insertInDb({\n\t\t\t\t\t\t\tgeneratedValues,\n\t\t\t\t\t\t\tdb: db as\n\t\t\t\t\t\t\t\t| PgDatabase<any, any>\n\t\t\t\t\t\t\t\t| MySqlDatabase<any, any>\n\t\t\t\t\t\t\t\t| BaseSQLiteDatabase<any, any>,\n\t\t\t\t\t\t\tschema: schema as {\n\t\t\t\t\t\t\t\t[key: string]: PgTable | MySqlTable | SQLiteTable;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttableName: tableName as string,\n\t\t\t\t\t\t\toverride,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (updateDataInDb === true) {\n\t\t\t\t\t\tawait this.updateDb({\n\t\t\t\t\t\t\tgeneratedValues,\n\t\t\t\t\t\t\tdb: db as\n\t\t\t\t\t\t\t\t| PgDatabase<any, any>\n\t\t\t\t\t\t\t\t| MySqlDatabase<any, any>\n\t\t\t\t\t\t\t\t| BaseSQLiteDatabase<any, any>,\n\t\t\t\t\t\t\tschema: schema as {\n\t\t\t\t\t\t\t\t[key: string]: PgTable | MySqlTable | SQLiteTable;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttableName: tableName as string,\n\t\t\t\t\t\t\tuniqueNotNullColName: uniqueNotNullColName as string,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tgeneratedValues = [];\n\t\t\t\t} else {\n\t\t\t\t\tconst batchCount = Math.floor(i / batchSize);\n\n\t\t\t\t\tif (insertDataInDb === true) {\n\t\t\t\t\t\tawait this.insertInDb({\n\t\t\t\t\t\t\tgeneratedValues: generatedValues.slice(\n\t\t\t\t\t\t\t\tbatchSize * batchCount,\n\t\t\t\t\t\t\t\tbatchSize * (batchCount + 1),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tdb: db as\n\t\t\t\t\t\t\t\t| PgDatabase<any, any>\n\t\t\t\t\t\t\t\t| MySqlDatabase<any, any>\n\t\t\t\t\t\t\t\t| BaseSQLiteDatabase<any, any>,\n\t\t\t\t\t\t\tschema: schema as {\n\t\t\t\t\t\t\t\t[key: string]: PgTable | MySqlTable | SQLiteTable;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttableName: tableName as string,\n\t\t\t\t\t\t\toverride,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (updateDataInDb === true) {\n\t\t\t\t\t\tawait this.updateDb({\n\t\t\t\t\t\t\tgeneratedValues: generatedValues.slice(\n\t\t\t\t\t\t\t\tbatchSize * batchCount,\n\t\t\t\t\t\t\t\tbatchSize * (batchCount + 1),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tdb: db as\n\t\t\t\t\t\t\t\t| PgDatabase<any, any>\n\t\t\t\t\t\t\t\t| MySqlDatabase<any, any>\n\t\t\t\t\t\t\t\t| BaseSQLiteDatabase<any, any>,\n\t\t\t\t\t\t\tschema: schema as {\n\t\t\t\t\t\t\t\t[key: string]: PgTable | MySqlTable | SQLiteTable;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttableName: tableName as string,\n\t\t\t\t\t\t\tuniqueNotNullColName: uniqueNotNullColName as string,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn preserveData === true ? generatedValues : [];\n\t};\n\n\tinsertInDb = async ({\n\t\tgeneratedValues,\n\t\tdb,\n\t\tschema,\n\t\ttableName,\n\t\toverride,\n\t}: {\n\t\tgeneratedValues: {\n\t\t\t[columnName: string]: number | string | boolean | undefined;\n\t\t}[];\n\t\tdb:\n\t\t\t| PgDatabase<any, any>\n\t\t\t| MySqlDatabase<any, any>\n\t\t\t| BaseSQLiteDatabase<any, any>;\n\t\tschema: {\n\t\t\t[key: string]: PgTable | MySqlTable | SQLiteTable;\n\t\t};\n\t\ttableName: string;\n\t\toverride: boolean;\n\t}) => {\n\t\tif (is(db, PgDatabase<any>)) {\n\t\t\tconst query = db.insert((schema as { [key: string]: PgTable })[tableName]!);\n\t\t\tif (override === true) {\n\t\t\t\treturn await query.overridingSystemValue().values(generatedValues);\n\t\t\t}\n\t\t\tawait query.values(generatedValues);\n\t\t} else if (is(db, MySqlDatabase<any, any>)) {\n\t\t\tawait db\n\t\t\t\t.insert((schema as { [key: string]: MySqlTable })[tableName]!)\n\t\t\t\t.values(generatedValues);\n\t\t} else if (is(db, BaseSQLiteDatabase<any, any>)) {\n\t\t\tawait db\n\t\t\t\t.insert((schema as { [key: string]: SQLiteTable })[tableName]!)\n\t\t\t\t.values(generatedValues);\n\t\t}\n\t};\n\n\tupdateDb = async ({\n\t\tgeneratedValues,\n\t\tdb,\n\t\tschema,\n\t\ttableName,\n\t\tuniqueNotNullColName,\n\t}: {\n\t\tgeneratedValues: {\n\t\t\t[columnName: string]: number | string | boolean | undefined;\n\t\t}[];\n\t\tdb:\n\t\t\t| PgDatabase<any, any>\n\t\t\t| MySqlDatabase<any, any>\n\t\t\t| BaseSQLiteDatabase<any, any>;\n\t\tschema: {\n\t\t\t[key: string]: PgTable | MySqlTable | SQLiteTable;\n\t\t};\n\t\ttableName: string;\n\t\tuniqueNotNullColName: string;\n\t}) => {\n\t\tif (is(db, PgDatabase<any>)) {\n\t\t\tconst table = (schema as { [key: string]: PgTableWithColumns<any> })[tableName]!;\n\t\t\tconst uniqueNotNullCol = table[uniqueNotNullColName];\n\t\t\tawait db.update(table).set(generatedValues[0]!).where(\n\t\t\t\teq(uniqueNotNullCol, generatedValues[0]![uniqueNotNullColName]),\n\t\t\t);\n\t\t} else if (is(db, MySqlDatabase<any, any>)) {\n\t\t\tconst table = (schema as { [key: string]: MySqlTableWithColumns<any> })[tableName]!;\n\t\t\tawait db.update(table).set(generatedValues[0]!).where(\n\t\t\t\teq(table[uniqueNotNullColName], generatedValues[0]![uniqueNotNullColName]),\n\t\t\t);\n\t\t} else if (is(db, BaseSQLiteDatabase<any, any>)) {\n\t\t\tconst table = (schema as { [key: string]: SQLiteTableWithColumns<any> })[tableName]!;\n\t\t\tawait db.update(table).set(generatedValues[0]!).where(\n\t\t\t\teq(table[uniqueNotNullColName], generatedValues[0]![uniqueNotNullColName]),\n\t\t\t);\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "drizzle-seed/src/services/apiVersion.ts",
    "content": "export const latestVersion = 2;\n"
  },
  {
    "path": "drizzle-seed/src/services/utils.ts",
    "content": "export const fastCartesianProduct = (sets: (number | string | boolean | object)[][], index: number) => {\n\tconst resultList = [];\n\tlet currSet: (typeof sets)[number];\n\tlet element: (typeof sets)[number][number];\n\n\tfor (let i = sets.length - 1; i >= 0; i--) {\n\t\tcurrSet = sets[i]!;\n\t\telement = currSet[index % currSet.length]!;\n\t\tresultList.unshift(element);\n\t\tindex = Math.floor(index / currSet.length);\n\t}\n\n\treturn resultList;\n};\n\nconst sumArray = (weights: number[]) => {\n\tconst scale = 1e10;\n\tconst scaledSum = weights.reduce((acc, currVal) => acc + Math.round(currVal * scale), 0);\n\treturn scaledSum / scale;\n};\n\n/**\n * @param weights positive number in range [0, 1], that represents probabilities to choose index of array. Example: weights = [0.2, 0.8]\n * @param [accuracy=100] approximate number of elements in returning array\n * @returns Example: with weights = [0.2, 0.8] and accuracy = 10 returning array of indices gonna equal this: [0, 0, 1, 1, 1, 1, 1, 1, 1, 1]\n */\nexport const getWeightedIndices = (weights: number[], accuracy = 100) => {\n\tconst weightsSum = sumArray(weights);\n\tif (weightsSum !== 1) {\n\t\tthrow new Error(\n\t\t\t`The weights for the Weighted Random feature must add up to exactly 1. Please review your weights to ensure they total 1 before proceeding`,\n\t\t);\n\t}\n\n\t// const accuracy = 100;\n\tconst weightedIndices: number[] = [];\n\tfor (const [index, weight] of weights.entries()) {\n\t\tconst ticketsNumb = Math.floor(weight * accuracy);\n\t\tweightedIndices.push(...Array.from<number>({ length: ticketsNumb }).fill(index));\n\t}\n\n\treturn weightedIndices;\n};\n\nexport const generateHashFromString = (s: string) => {\n\tlet hash = 0;\n\t// p and m are prime numbers\n\tconst p = 53;\n\tconst m = 28871271685163;\n\n\tfor (let i = 0; i < s.length; i++) {\n\t\thash += ((s.codePointAt(i) || 0) * Math.pow(p, i)) % m;\n\t}\n\n\treturn hash;\n};\n\n/**\n * @param param0.template example: \"#####\" or \"#####-####\"\n * @param param0.values example: [\"3\", \"2\", \"h\"]\n * @param param0.defaultValue example: \"0\"\n * @returns\n */\nexport const fillTemplate = ({ template, placeholdersCount, values, defaultValue = ' ' }: {\n\ttemplate: string;\n\tplaceholdersCount?: number;\n\tvalues: string[];\n\tdefaultValue?: string;\n}) => {\n\tif (placeholdersCount === undefined) {\n\t\tconst iterArray = [...template.matchAll(/#/g)];\n\t\tplaceholdersCount = iterArray.length;\n\t}\n\n\tconst diff = placeholdersCount - values.length;\n\tif (diff > 0) {\n\t\tvalues.unshift(...Array.from<string>({ length: diff }).fill(defaultValue));\n\t}\n\n\tlet resultStr = '', valueIdx = 0;\n\tfor (const si of template) {\n\t\tif (si === '#') {\n\t\t\tresultStr += values[valueIdx];\n\t\t\tvalueIdx += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tresultStr += si;\n\t}\n\n\treturn resultStr;\n};\n\n// is variable is object-like.\n// Example:\n// isObject({f: 4}) === true;\n// isObject([1,2,3]) === false;\n// isObject(new Set()) === false;\nexport const isObject = (value: any) => {\n\tif (value !== null && value !== undefined && value.constructor === Object) return true;\n\treturn false;\n};\n\nexport const equalSets = (set1: Set<any>, set2: Set<any>) => {\n\treturn set1.size === set2.size && [...set1].every((si) => set2.has(si));\n};\n"
  },
  {
    "path": "drizzle-seed/src/services/versioning/v2.ts",
    "content": "/* eslint-disable drizzle-internal/require-entity-kind */\nimport prand from 'pure-rand';\nimport { AbstractGenerator } from '../Generators.ts';\n\nexport class GenerateUniqueIntervalV2 extends AbstractGenerator<{\n\tfields?:\n\t\t| 'year'\n\t\t| 'month'\n\t\t| 'day'\n\t\t| 'hour'\n\t\t| 'minute'\n\t\t| 'second'\n\t\t| 'year to month'\n\t\t| 'day to hour'\n\t\t| 'day to minute'\n\t\t| 'day to second'\n\t\t| 'hour to minute'\n\t\t| 'hour to second'\n\t\t| 'minute to second';\n\tisUnique?: boolean;\n}> {\n\tstatic override readonly 'entityKind': string = 'GenerateUniqueInterval';\n\tstatic override readonly version: number = 2;\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tfieldsToGenerate: string[];\n\t\tintervalSet: Set<string>;\n\t} | undefined;\n\tpublic override isUnique = true;\n\tprivate config: { [key: string]: { from: number; to: number } } = {\n\t\tyear: {\n\t\t\tfrom: 0,\n\t\t\tto: 5,\n\t\t},\n\t\tmonth: {\n\t\t\tfrom: 0,\n\t\t\tto: 11,\n\t\t},\n\t\tday: {\n\t\t\tfrom: 0,\n\t\t\tto: 29,\n\t\t},\n\t\thour: {\n\t\t\tfrom: 0,\n\t\t\tto: 23,\n\t\t},\n\t\tminute: {\n\t\t\tfrom: 0,\n\t\t\tto: 59,\n\t\t},\n\t\tsecond: {\n\t\t\tfrom: 0,\n\t\t\tto: 59,\n\t\t},\n\t};\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tconst allFields = ['year', 'month', 'day', 'hour', 'minute', 'second'];\n\t\tlet fieldsToGenerate: string[] = allFields;\n\n\t\tif (this.params.fields !== undefined && this.params.fields?.includes(' to ')) {\n\t\t\tconst tokens = this.params.fields.split(' to ');\n\t\t\tconst endIdx = allFields.indexOf(tokens[1]!);\n\t\t\tfieldsToGenerate = allFields.slice(0, endIdx + 1);\n\t\t} else if (this.params.fields !== undefined) {\n\t\t\tconst endIdx = allFields.indexOf(this.params.fields);\n\t\t\tfieldsToGenerate = allFields.slice(0, endIdx + 1);\n\t\t}\n\n\t\tlet maxUniqueIntervalsNumber = 1;\n\t\tfor (const field of fieldsToGenerate) {\n\t\t\tconst from = this.config[field]!.from, to = this.config[field]!.to;\n\t\t\tmaxUniqueIntervalsNumber *= from - to + 1;\n\t\t}\n\n\t\tif (count > maxUniqueIntervalsNumber) {\n\t\t\tthrow new RangeError(`count exceeds max number of unique intervals(${maxUniqueIntervalsNumber})`);\n\t\t}\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tconst intervalSet = new Set<string>();\n\t\tthis.state = { rng, fieldsToGenerate, intervalSet };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tlet interval, numb: number;\n\n\t\tfor (;;) {\n\t\t\tinterval = '';\n\n\t\t\tfor (const field of this.state.fieldsToGenerate) {\n\t\t\t\tconst from = this.config[field]!.from, to = this.config[field]!.to;\n\t\t\t\t[numb, this.state.rng] = prand.uniformIntDistribution(from, to, this.state.rng);\n\t\t\t\tinterval += `${numb} ${field} `;\n\t\t\t}\n\n\t\t\tif (!this.state.intervalSet.has(interval)) {\n\t\t\t\tthis.state.intervalSet.add(interval);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn interval;\n\t}\n}\n\nexport class GenerateStringV2 extends AbstractGenerator<{\n\tisUnique?: boolean;\n\tarraySize?: number;\n}> {\n\tstatic override readonly 'entityKind': string = 'GenerateString';\n\tstatic override readonly version: number = 2;\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tminStringLength: number;\n\t\tmaxStringLength: number;\n\t} | undefined;\n\toverride uniqueVersionOfGen = GenerateUniqueStringV2;\n\n\toverride init({ count, seed }: { count: number; seed: number }) {\n\t\tsuper.init({ count, seed });\n\n\t\tlet minStringLength = 7;\n\t\tlet maxStringLength = 20;\n\t\tif (this.stringLength !== undefined) {\n\t\t\tmaxStringLength = this.stringLength;\n\t\t\tif (maxStringLength === 1) minStringLength = maxStringLength;\n\t\t\tif (maxStringLength < minStringLength) minStringLength = 1;\n\t\t}\n\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\t\tthis.state = { rng, minStringLength, maxStringLength };\n\t}\n\n\tgenerate() {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst minStringLength = this.state.minStringLength,\n\t\t\tmaxStringLength = this.state.maxStringLength;\n\t\tconst stringChars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\t\tlet idx: number,\n\t\t\tstrLength: number,\n\t\t\tcurrStr: string;\n\n\t\tcurrStr = '';\n\t\t[strLength, this.state.rng] = prand.uniformIntDistribution(\n\t\t\tminStringLength,\n\t\t\tmaxStringLength,\n\t\t\tthis.state.rng,\n\t\t);\n\t\tfor (let j = 0; j < strLength; j++) {\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t\t0,\n\t\t\t\tstringChars.length - 1,\n\t\t\t\tthis.state.rng,\n\t\t\t);\n\t\t\tcurrStr += stringChars[idx];\n\t\t}\n\t\treturn currStr;\n\t}\n}\n\nexport class GenerateUniqueStringV2 extends AbstractGenerator<{ isUnique?: boolean }> {\n\tstatic override readonly 'entityKind': string = 'GenerateUniqueString';\n\tstatic override readonly version: number = 2;\n\n\tprivate state: {\n\t\trng: prand.RandomGenerator;\n\t\tminStringLength: number;\n\t\tmaxStringLength: number;\n\t} | undefined;\n\tpublic override isUnique = true;\n\n\toverride init({ seed, count }: { seed: number; count: number }) {\n\t\tconst rng = prand.xoroshiro128plus(seed);\n\n\t\tlet minStringLength = 7;\n\t\tlet maxStringLength = 20;\n\t\t// TODO: revise later\n\t\tif (this.stringLength !== undefined) {\n\t\t\tmaxStringLength = this.stringLength;\n\t\t\tif (maxStringLength === 1 || maxStringLength < minStringLength) minStringLength = maxStringLength;\n\t\t}\n\n\t\tif (maxStringLength < count.toString(16).length) {\n\t\t\tthrow new Error(\n\t\t\t\t`You can't generate ${count} unique strings, with a maximum string length of ${maxStringLength}.`,\n\t\t\t);\n\t\t}\n\n\t\tthis.state = { rng, minStringLength, maxStringLength };\n\t}\n\n\tgenerate({ i }: { i: number }) {\n\t\tif (this.state === undefined) {\n\t\t\tthrow new Error('state is not defined.');\n\t\t}\n\n\t\tconst minStringLength = this.state.minStringLength,\n\t\t\tmaxStringLength = this.state.maxStringLength;\n\t\tconst stringChars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\t\tlet idx: number,\n\t\t\tstrLength: number;\n\t\tlet currStr: string;\n\n\t\tcurrStr = '';\n\t\tconst uniqueStr = i.toString(16);\n\t\t[strLength, this.state.rng] = prand.uniformIntDistribution(\n\t\t\tminStringLength,\n\t\t\tmaxStringLength - uniqueStr.length,\n\t\t\tthis.state.rng,\n\t\t);\n\t\tfor (let j = 0; j < strLength - uniqueStr.length; j++) {\n\t\t\t[idx, this.state.rng] = prand.uniformIntDistribution(\n\t\t\t\t0,\n\t\t\t\tstringChars.length - 1,\n\t\t\t\tthis.state.rng,\n\t\t\t);\n\t\t\tcurrStr += stringChars[idx];\n\t\t}\n\n\t\treturn uniqueStr + currStr;\n\t}\n}\n"
  },
  {
    "path": "drizzle-seed/src/types/drizzleStudio.ts",
    "content": "export type DbPrimaryKey = {\n\tname: string;\n\tcolumns: string[];\n};\n\nexport type DbForeignKey = {\n\tname: string;\n\ttableFrom: string;\n\tcolumnsFrom: string[];\n\tschemaFrom: string;\n\tschemaTo: string;\n\ttableTo: string;\n\tcolumnsTo: string[];\n\tonUpdate?: string;\n\tonDelete?: string;\n};\n\nexport type DbColumn = {\n\tname: string;\n\ttype: string;\n\tprimaryKey: boolean;\n\tnotNull: boolean;\n\tdefault?: any;\n\tisUnique?: any;\n\tautoIncrement?: boolean;\n\tuniqueName?: string;\n\tnullsNotDistinct?: boolean;\n\tonUpdate?: boolean;\n};\n\nexport type DbTable = {\n\tname: string;\n\ttype: 'table';\n\tdatabase?: string;\n\tschema: string;\n\tcolumns: Record<string, DbColumn>;\n\tindexes: Record<string, any>;\n\tforeignKeys: Record<string, DbForeignKey>;\n\tcompositePrimaryKeys: Record<string, DbPrimaryKey>;\n\tuniqueConstraints: Record<string, any>;\n};\n\nexport type DbView = Omit<DbTable, 'type'> & {\n\ttype: 'view' | 'mat_view';\n};\n\nexport type DbSchema = {\n\tdatabase?: string;\n\ttables: Record<string, DbTable>;\n\tviews: Record<string, DbView>;\n\tenums: Record<string, [string, ...string[]]>;\n};\n\nexport type DrizzleStudioObjectType = { [schemaName: string]: DbSchema };\n\nexport type DrizzleStudioRelationType = {\n\tname: string;\n\ttype: 'one' | 'many';\n\ttable: string;\n\tschema: string;\n\tcolumns: string[];\n\trefTable: string;\n\trefSchema: string;\n\trefColumns: string[];\n};\n"
  },
  {
    "path": "drizzle-seed/src/types/seedService.ts",
    "content": "import type { AbstractGenerator } from '../services/Generators.ts';\nimport type { Prettify } from './tables.ts';\n\nexport type TableGeneratorsType = {\n\t[columnName: string]: Prettify<\n\t\t{\n\t\t\thasSelfRelation?: boolean | undefined;\n\t\t\thasRelation?: boolean | undefined;\n\t\t\tpRNGSeed: number;\n\t\t} & GeneratePossibleGeneratorsColumnType\n\t>;\n};\n\nexport type GeneratePossibleGeneratorsColumnType = {\n\tcolumnName: string;\n\tgenerator: AbstractGenerator<any> | undefined;\n\tisUnique: boolean;\n\tnotNull: boolean;\n\tprimary: boolean;\n\tgeneratedIdentityType?: 'always' | 'byDefault' | undefined;\n\twasRefined: boolean;\n\twasDefinedBefore: boolean;\n\tisCyclic: boolean;\n};\n\nexport type GeneratePossibleGeneratorsTableType = Prettify<{\n\ttableName: string;\n\tcount?: number;\n\twithCount?: number;\n\twithFromTable: {\n\t\t[withFromTableName: string]: {\n\t\t\trepeatedValuesCount:\n\t\t\t\t| number\n\t\t\t\t| { weight: number; count: number | number[] }[];\n\t\t\tweightedCountSeed?: number;\n\t\t};\n\t};\n\t// repeatedValuesCount?: number,\n\t// withFromTableName?: string,\n\tcolumnsPossibleGenerators: GeneratePossibleGeneratorsColumnType[];\n}>;\n\nexport type RefinementsType = Prettify<{\n\t[tableName: string]: {\n\t\tcount?: number;\n\t\tcolumns: { [columnName: string]: AbstractGenerator<{}> };\n\t\twith?: { [tableName: string]: number | { weight: number; count: number | number[] }[] };\n\t};\n}>;\n"
  },
  {
    "path": "drizzle-seed/src/types/tables.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport type Column = {\n\tname: string;\n\tdataType: string;\n\tcolumnType: string;\n\ttypeParams: {\n\t\tprecision?: number;\n\t\tscale?: number;\n\t\tlength?: number;\n\t\tdimensions?: number;\n\t};\n\tsize?: number;\n\tdefault?: any;\n\thasDefault: boolean;\n\tenumValues?: string[];\n\tisUnique: boolean;\n\tnotNull: boolean;\n\tprimary: boolean;\n\tgeneratedIdentityType?: 'always' | 'byDefault' | undefined;\n\tbaseColumn?: Omit<Column, 'generatedIdentityType'>;\n};\n\nexport type Table = {\n\tname: string;\n\tcolumns: Column[];\n\tprimaryKeys: string[];\n};\n\nexport type Relation = {\n\t// name: string;\n\ttype?: 'one' | 'many';\n\ttable: string;\n\t// schema: string;\n\tcolumns: string[];\n\trefTable: string;\n\t// refSchema: string;\n\trefColumns: string[];\n};\n\nexport type RelationWithReferences = Relation & { isCyclic?: boolean; refTableRels: RelationWithReferences[] };\n\nexport type Prettify<T> =\n\t& {\n\t\t[K in keyof T]: T[K];\n\t}\n\t& {};\n"
  },
  {
    "path": "drizzle-seed/tests/benchmarks/generatorsBenchmark.ts",
    "content": "import lastNames from '../../src/datasets/lastNames.ts';\nimport {\n\tGenerateBoolean,\n\tGenerateCity,\n\tGenerateCompanyName,\n\tGenerateCountry,\n\tGenerateDate,\n\tGenerateDatetime,\n\tGenerateDefault,\n\tGenerateEmail,\n\tGenerateFirstName,\n\tGenerateFullName,\n\tGenerateInt,\n\tGenerateInterval,\n\tGenerateIntPrimaryKey,\n\tGenerateJobTitle,\n\tGenerateJson,\n\tGenerateLastName,\n\tGenerateLine,\n\tGenerateLoremIpsum,\n\tGenerateNumber,\n\tGeneratePhoneNumber,\n\tGeneratePoint,\n\tGeneratePostcode,\n\tGenerateState,\n\tGenerateStreetAddress,\n\tGenerateString,\n\tGenerateTime,\n\tGenerateTimestamp,\n\tGenerateUniqueCompanyName,\n\tGenerateUniqueFullName,\n\tGenerateUniqueInt,\n\tGenerateUniqueInterval,\n\tGenerateUniqueLine,\n\tGenerateUniqueNumber,\n\tGenerateUniquePoint,\n\tGenerateUniquePostcode,\n\tGenerateUniqueStreetAddress,\n\tGenerateUniqueString,\n\tGenerateValuesFromArray,\n\tGenerateYear,\n\tWeightedRandomGenerator,\n} from '../../src/services/Generators.ts';\n\nconst benchmark = ({ generatorName, generator, count = 100000, seed = 1 }: {\n\tgeneratorName: string;\n\tgenerator: (typeof generatorsFuncs)[keyof typeof generatorsFuncs];\n\tcount?: number;\n\tseed?: number;\n}) => {\n\tgenerator.init({ count, seed });\n\n\tlet timeSpentToInit = 0, timeSpent = 0;\n\tconst t0 = new Date();\n\n\tgenerator.init({ count, seed });\n\ttimeSpentToInit += (Date.now() - t0.getTime()) / 1000;\n\n\tfor (let i = 0; i < count; i++) {\n\t\tconst val = generator.generate({ i });\n\t\tif (val === undefined) {\n\t\t\tconsole.log(val, `in ${generatorName} generator.`);\n\t\t}\n\t}\n\n\ttimeSpent += (Date.now() - t0.getTime()) / 1000;\n\tconsole.log(`${generatorName} spent ${timeSpentToInit} to init and spent ${timeSpent} to generate ${count} rows.`);\n\tconsole.log(\n\t\t'time spent in particular code part:',\n\t\tgenerator.timeSpent,\n\t\t';',\n\t\tgenerator.timeSpent === undefined ? generator.timeSpent : (generator.timeSpent / timeSpent),\n\t\t'percent of all time',\n\t);\n\tconsole.log('\\n');\n};\n\nconst generatorsFuncs = {\n\tdefault: new GenerateDefault({ defaultValue: 'defaultValue' }),\n\tvaluesFromArray: new GenerateValuesFromArray({ values: lastNames }),\n\tintPrimaryKey: new GenerateIntPrimaryKey({}),\n\tnumber: new GenerateNumber({}),\n\tuniqueNumber: new GenerateUniqueNumber({}),\n\tint: new GenerateInt({}),\n\tuniqueInt: new GenerateUniqueInt({}),\n\tboolean: new GenerateBoolean({}),\n\tdate: new GenerateDate({}),\n\ttime: new GenerateTime({}),\n\ttimestamp: new GenerateTimestamp({}),\n\tdatetime: new GenerateDatetime({}),\n\tyear: new GenerateYear({}),\n\tjson: new GenerateJson({}),\n\tjsonb: new GenerateJson({}),\n\tinterval: new GenerateInterval({}),\n\tuniqueInterval: new GenerateUniqueInterval({}),\n\tstring: new GenerateString({}),\n\tuniqueString: new GenerateUniqueString({}),\n\tfirstName: new GenerateFirstName({}),\n\t// uniqueFirstName: new GenerateUniqueName({}),\n\tlastName: new GenerateLastName({}),\n\t// uniqueLastName: new GenerateUniqueSurname({}),\n\tfullName: new GenerateFullName({}),\n\tuniqueFullName: new GenerateUniqueFullName({}),\n\temail: new GenerateEmail({}),\n\tphoneNumber: new GeneratePhoneNumber({ template: '+380 ## ## ### ##' }),\n\tcountry: new GenerateCountry({}),\n\t// uniqueCountry: new GenerateUniqueCountry({}),\n\tcity: new GenerateCity({}),\n\t// uniqueCity: new GenerateUniqueCity({}),\n\tstreetAddress: new GenerateStreetAddress({}),\n\tuniqueStreetAddress: new GenerateUniqueStreetAddress({}),\n\tjobTitle: new GenerateJobTitle({}),\n\tpostcode: new GeneratePostcode({}),\n\tuniquePostcode: new GenerateUniquePostcode({}),\n\tstate: new GenerateState({}),\n\tcompanyName: new GenerateCompanyName({}),\n\tuniqueCompanyName: new GenerateUniqueCompanyName({}),\n\tloremIpsum: new GenerateLoremIpsum({}),\n\tpoint: new GeneratePoint({}),\n\tuniquePoint: new GenerateUniquePoint({}),\n\tline: new GenerateLine({}),\n\tuniqueLine: new GenerateUniqueLine({}),\n\tweightedRandom: new WeightedRandomGenerator([\n\t\t{ weight: 0.8, value: new GenerateUniqueInt({ minValue: 0, maxValue: 90000 }) },\n\t\t{ weight: 0.2, value: new GenerateDefault({ defaultValue: Number.NaN }) },\n\t]),\n};\n\nfor (const [generatorName, generator] of Object.entries(generatorsFuncs)) {\n\tbenchmark({ generatorName, generator, count: 100000, seed: 1 });\n}\n"
  },
  {
    "path": "drizzle-seed/tests/mysql/allDataTypesTest/mysqlSchema.ts",
    "content": "import {\n\tbigint,\n\tbinary,\n\tboolean,\n\tchar,\n\tdate,\n\tdatetime,\n\tdecimal,\n\tdouble,\n\tfloat,\n\tint,\n\tjson,\n\tmediumint,\n\tmysqlEnum,\n\tmysqlTable,\n\treal,\n\tserial,\n\tsmallint,\n\ttext,\n\ttime,\n\ttimestamp,\n\ttinyint,\n\tvarbinary,\n\tvarchar,\n\tyear,\n} from 'drizzle-orm/mysql-core';\n\nexport const allDataTypes = mysqlTable('all_data_types', {\n\tint: int('integer'),\n\ttinyint: tinyint('tinyint'),\n\tsmallint: smallint('smallint'),\n\tmediumint: mediumint('mediumint'),\n\tbiginteger: bigint('bigint', { mode: 'bigint' }),\n\tbigintNumber: bigint('bigint_number', { mode: 'number' }),\n\treal: real('real'),\n\tdecimal: decimal('decimal'),\n\tdouble: double('double'),\n\tfloat: float('float'),\n\tserial: serial('serial'),\n\tbinary: binary('binary', { length: 255 }),\n\tvarbinary: varbinary('varbinary', { length: 256 }),\n\tchar: char('char', { length: 255 }),\n\tvarchar: varchar('varchar', { length: 256 }),\n\ttext: text('text'),\n\tboolean: boolean('boolean'),\n\tdateString: date('date_string', { mode: 'string' }),\n\tdate: date('date', { mode: 'date' }),\n\tdatetime: datetime('datetime', { mode: 'date' }),\n\tdatetimeString: datetime('datetimeString', { mode: 'string' }),\n\ttime: time('time'),\n\tyear: year('year'),\n\ttimestampDate: timestamp('timestamp_date', { mode: 'date' }),\n\ttimestampString: timestamp('timestamp_string', { mode: 'string' }),\n\tjson: json('json'),\n\tmysqlEnum: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n"
  },
  {
    "path": "drizzle-seed/tests/mysql/allDataTypesTest/mysql_all_data_types.test.ts",
    "content": "import Docker from 'dockerode';\nimport { sql } from 'drizzle-orm';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport getPort from 'get-port';\nimport type { Connection } from 'mysql2/promise';\nimport { createConnection } from 'mysql2/promise';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, expect, test } from 'vitest';\nimport { seed } from '../../../src/index.ts';\nimport * as schema from './mysqlSchema.ts';\n\nlet mysqlContainer: Docker.Container;\nlet client: Connection | undefined;\nlet db: MySql2Database;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'mysql:8';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tmysqlContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait mysqlContainer.start();\n\n\treturn `mysql://root:mysql@127.0.0.1:${port}/drizzle`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = await createDockerDB();\n\n\tconst sleep = 1000;\n\tlet timeLeft = 40000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tconst client = await createConnection(connectionString);\n\t\t\tawait client.connect();\n\t\t\tdb = drizzle(client);\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to MySQL');\n\t\tawait client?.end().catch(console.error);\n\t\tawait mysqlContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`all_data_types\\` (\n\t\t\t\t\\`integer\\` int,\n\t\t\t\t\\`tinyint\\` tinyint,\n\t\t\t\t\\`smallint\\` smallint,\n\t\t\t\t\\`mediumint\\` mediumint,\n\t\t\t\t\\`bigint\\` bigint,\n\t\t\t\t\\`bigint_number\\` bigint,\n\t\t\t\t\\`real\\` real,\n\t\t\t\t\\`decimal\\` decimal,\n\t\t\t\t\\`double\\` double,\n\t\t\t\t\\`float\\` float,\n\t\t\t\t\\`serial\\` serial AUTO_INCREMENT,\n\t\t\t\t\\`binary\\` binary(255),\n\t\t\t\t\\`varbinary\\` varbinary(256),\n\t\t\t\t\\`char\\` char(255),\n\t\t\t\t\\`varchar\\` varchar(256),\n\t\t\t\t\\`text\\` text,\n\t\t\t\t\\`boolean\\` boolean,\n\t\t\t\t\\`date_string\\` date,\n\t\t\t\t\\`date\\` date,\n\t\t\t\t\\`datetime\\` datetime,\n\t\t\t\t\\`datetimeString\\` datetime,\n\t\t\t\t\\`time\\` time,\n\t\t\t\t\\`year\\` year,\n\t\t\t\t\\`timestamp_date\\` timestamp,\n\t\t\t\t\\`timestamp_string\\` timestamp,\n\t\t\t\t\\`json\\` json,\n\t\t\t\t\\`popularity\\` enum('unknown','known','popular')\n\t\t\t);\n\t\t`,\n\t);\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait mysqlContainer?.stop().catch(console.error);\n});\n\ntest('basic seed test', async () => {\n\tawait seed(db, schema, { count: 10000 });\n\n\tconst allDataTypes = await db.select().from(schema.allDataTypes);\n\n\t// every value in each 10 rows does not equal undefined.\n\tconst predicate = allDataTypes.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\n\texpect(predicate).toBe(true);\n});\n"
  },
  {
    "path": "drizzle-seed/tests/mysql/cyclicTables/cyclicTables.test.ts",
    "content": "import Docker from 'dockerode';\nimport { sql } from 'drizzle-orm';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport getPort from 'get-port';\nimport type { Connection } from 'mysql2/promise';\nimport { createConnection } from 'mysql2/promise';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, afterEach, beforeAll, expect, test } from 'vitest';\nimport { reset, seed } from '../../../src/index.ts';\nimport * as schema from './mysqlSchema.ts';\n\nlet mysqlContainer: Docker.Container;\nlet client: Connection;\nlet db: MySql2Database;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'mysql:8';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tmysqlContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait mysqlContainer.start();\n\n\treturn `mysql://root:mysql@127.0.0.1:${port}/drizzle`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = await createDockerDB();\n\n\tconst sleep = 1000;\n\tlet timeLeft = 40000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = await createConnection(connectionString);\n\t\t\tawait client.connect();\n\t\t\tdb = drizzle(client);\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to MySQL');\n\t\tawait client?.end().catch(console.error);\n\t\tawait mysqlContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table model\n\t\t\t(\n\t\t\t    id             int          not null\n\t\t\t        primary key,\n\t\t\t    name           varchar(256) not null,\n\t\t\t    defaultImageId int          null\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table model_image\n\t\t\t(\n\t\t\t    id      int          not null\n\t\t\t        primary key,\n\t\t\t    url     varchar(256) not null,\n\t\t\t    caption varchar(256) null,\n\t\t\t    modelId int          not null,\n\t\t\t    constraint model_image_modelId_model_id_fk\n\t\t\t        foreign key (modelId) references model (id)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\talter table model\n\t\t\t add constraint model_defaultImageId_model_image_id_fk\n\t\t\t     foreign key (defaultImageId) references model_image (id);\n\t\t`,\n\t);\n\n\t// 3 tables case\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table model1\n\t\t\t(\n\t\t\t    id             int          not null\n\t\t\t        primary key,\n\t\t\t    name           varchar(256) not null,\n\t\t\t    userId         int          null,\n\t\t\t    defaultImageId int          null\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table model_image1\n\t\t\t(\n\t\t\t    id      int          not null\n\t\t\t        primary key,\n\t\t\t    url     varchar(256) not null,\n\t\t\t    caption varchar(256) null,\n\t\t\t    modelId int          not null,\n\t\t\t    constraint model_image1_modelId_model1_id_fk\n\t\t\t        foreign key (modelId) references model1 (id)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table user\n\t\t\t(\n\t\t\t    id        int  not null\n\t\t\t        primary key,\n\t\t\t    name      text null,\n\t\t\t    invitedBy int  null,\n\t\t\t    imageId   int  not null,\n\t\t\t    constraint user_imageId_model_image1_id_fk\n\t\t\t        foreign key (imageId) references model_image1 (id),\n\t\t\t    constraint user_invitedBy_user_id_fk\n\t\t\t        foreign key (invitedBy) references user (id)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\talter table model1\n\t\t\t add constraint model1_userId_user_id_fk\n\t\t\t     foreign key (userId) references user (id);\n\t\t`,\n\t);\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait mysqlContainer?.stop().catch(console.error);\n});\n\nafterEach(async () => {\n\tawait reset(db, schema);\n});\n\ntest('2 cyclic tables test', async () => {\n\tawait seed(db, {\n\t\tmodelTable: schema.modelTable,\n\t\tmodelImageTable: schema.modelImageTable,\n\t});\n\n\tconst modelTable = await db.select().from(schema.modelTable);\n\tconst modelImageTable = await db.select().from(schema.modelImageTable);\n\n\texpect(modelTable.length).toBe(10);\n\tlet predicate = modelTable.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\texpect(modelImageTable.length).toBe(10);\n\tpredicate = modelImageTable.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('3 cyclic tables test', async () => {\n\tawait seed(db, {\n\t\tmodelTable1: schema.modelTable1,\n\t\tmodelImageTable1: schema.modelImageTable1,\n\t\tuser: schema.user,\n\t});\n\n\tconst modelTable1 = await db.select().from(schema.modelTable1);\n\tconst modelImageTable1 = await db.select().from(schema.modelImageTable1);\n\tconst user = await db.select().from(schema.user);\n\n\texpect(modelTable1.length).toBe(10);\n\tlet predicate = modelTable1.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\texpect(modelImageTable1.length).toBe(10);\n\tpredicate = modelImageTable1.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\texpect(user.length).toBe(10);\n\tpredicate = user.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n"
  },
  {
    "path": "drizzle-seed/tests/mysql/cyclicTables/mysqlSchema.ts",
    "content": "import { relations } from 'drizzle-orm';\nimport type { AnyMySqlColumn } from 'drizzle-orm/mysql-core';\nimport { int, mysqlTable, serial, text, varchar } from 'drizzle-orm/mysql-core';\n\n// MODEL\nexport const modelTable = mysqlTable(\n\t'model',\n\t{\n\t\tid: serial().primaryKey(),\n\t\tname: varchar({ length: 256 }).notNull(),\n\t\tdefaultImageId: int().references(() => modelImageTable.id),\n\t},\n);\n\nexport const modelRelations = relations(modelTable, ({ one, many }) => ({\n\timages: many(modelImageTable),\n\tdefaultImage: one(modelImageTable, {\n\t\tfields: [modelTable.defaultImageId],\n\t\treferences: [modelImageTable.id],\n\t}),\n}));\n\n// MODEL IMAGE\nexport const modelImageTable = mysqlTable(\n\t'model_image',\n\t{\n\t\tid: serial().primaryKey(),\n\t\turl: varchar({ length: 256 }).notNull(),\n\t\tcaption: varchar({ length: 256 }),\n\t\tmodelId: int()\n\t\t\t.notNull()\n\t\t\t.references((): AnyMySqlColumn => modelTable.id),\n\t},\n);\n\nexport const modelImageRelations = relations(modelImageTable, ({ one }) => ({\n\tmodel: one(modelTable, {\n\t\tfields: [modelImageTable.modelId],\n\t\treferences: [modelTable.id],\n\t}),\n}));\n\n// 3 tables case\nexport const modelTable1 = mysqlTable(\n\t'model1',\n\t{\n\t\tid: serial().primaryKey(),\n\t\tname: varchar({ length: 256 }).notNull(),\n\t\tuserId: int()\n\t\t\t.references(() => user.id),\n\t\tdefaultImageId: int(),\n\t},\n);\n\nexport const modelImageTable1 = mysqlTable(\n\t'model_image1',\n\t{\n\t\tid: serial().primaryKey(),\n\t\turl: varchar({ length: 256 }).notNull(),\n\t\tcaption: varchar({ length: 256 }),\n\t\tmodelId: int().notNull()\n\t\t\t.references((): AnyMySqlColumn => modelTable1.id),\n\t},\n);\n\nexport const user = mysqlTable(\n\t'user',\n\t{\n\t\tid: serial().primaryKey(),\n\t\tname: text(),\n\t\tinvitedBy: int().references((): AnyMySqlColumn => user.id),\n\t\timageId: int()\n\t\t\t.notNull()\n\t\t\t.references((): AnyMySqlColumn => modelImageTable1.id),\n\t},\n);\n"
  },
  {
    "path": "drizzle-seed/tests/mysql/generatorsTest/generators.test.ts",
    "content": "import Docker from 'dockerode';\nimport { sql } from 'drizzle-orm';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport getPort from 'get-port';\nimport type { Connection } from 'mysql2/promise';\nimport { createConnection } from 'mysql2/promise';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, expect, test } from 'vitest';\nimport { seed } from '../../../src/index.ts';\nimport * as schema from './mysqlSchema.ts';\n\nlet mysqlContainer: Docker.Container;\nlet client: Connection;\nlet db: MySql2Database;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'mysql:8';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tmysqlContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait mysqlContainer.start();\n\n\treturn `mysql://root:mysql@127.0.0.1:${port}/drizzle`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = await createDockerDB();\n\n\tconst sleep = 1000;\n\tlet timeLeft = 40000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = await createConnection(connectionString);\n\t\t\tawait client.connect();\n\t\t\tdb = drizzle(client);\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to MySQL');\n\t\tawait client?.end().catch(console.error);\n\t\tawait mysqlContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`datetime_table\\` (\n\t\t\t\t\\`datetime\\` datetime\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`year_table\\` (\n\t\t\t\t\\`year\\` year\n\t\t\t);\n\t\t`,\n\t);\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait mysqlContainer?.stop().catch(console.error);\n});\n\nconst count = 10000;\n\ntest('datetime generator test', async () => {\n\tawait seed(db, { datetimeTable: schema.datetimeTable }).refine((funcs) => ({\n\t\tdatetimeTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tdatetime: funcs.datetime(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.datetimeTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('year generator test', async () => {\n\tawait seed(db, { yearTable: schema.yearTable }).refine((funcs) => ({\n\t\tyearTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tyear: funcs.year(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.yearTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n"
  },
  {
    "path": "drizzle-seed/tests/mysql/generatorsTest/mysqlSchema.ts",
    "content": "import { datetime, mysqlTable, year } from 'drizzle-orm/mysql-core';\n\nexport const datetimeTable = mysqlTable('datetime_table', {\n\tdatetime: datetime('datetime'),\n});\n\nexport const yearTable = mysqlTable('year_table', {\n\tyear: year('year'),\n});\n"
  },
  {
    "path": "drizzle-seed/tests/mysql/mysql.test.ts",
    "content": "import Docker from 'dockerode';\nimport { relations, sql } from 'drizzle-orm';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport getPort from 'get-port';\nimport type { Connection } from 'mysql2/promise';\nimport { createConnection } from 'mysql2/promise';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, afterEach, beforeAll, expect, test, vi } from 'vitest';\nimport { reset, seed } from '../../src/index.ts';\nimport * as schema from './mysqlSchema.ts';\n\nlet mysqlContainer: Docker.Container;\nlet client: Connection;\nlet db: MySql2Database;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'mysql:8';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tmysqlContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait mysqlContainer.start();\n\n\treturn `mysql://root:mysql@127.0.0.1:${port}/drizzle`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = await createDockerDB();\n\n\tconst sleep = 1000;\n\tlet timeLeft = 40000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = await createConnection(connectionString);\n\t\t\tawait client.connect();\n\t\t\tdb = drizzle(client);\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to MySQL');\n\t\tawait client?.end().catch(console.error);\n\t\tawait mysqlContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`customer\\` (\n\t\t\t\t\\`id\\` varchar(256) NOT NULL,\n\t\t\t\t\\`company_name\\` text NOT NULL,\n\t\t\t\t\\`contact_name\\` text NOT NULL,\n\t\t\t\t\\`contact_title\\` text NOT NULL,\n\t\t\t\t\\`address\\` text NOT NULL,\n\t\t\t\t\\`city\\` text NOT NULL,\n\t\t\t\t\\`postal_code\\` text,\n\t\t\t\t\\`region\\` text,\n\t\t\t\t\\`country\\` text NOT NULL,\n\t\t\t\t\\`phone\\` text NOT NULL,\n\t\t\t\t\\`fax\\` text,\n\t\t\t\tCONSTRAINT \\`customer_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`order_detail\\` (\n\t\t\t\t\\`unit_price\\` float NOT NULL,\n\t\t\t\t\\`quantity\\` int NOT NULL,\n\t\t\t\t\\`discount\\` float NOT NULL,\n\t\t\t\t\\`order_id\\` int NOT NULL,\n\t\t\t\t\\`product_id\\` int NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`employee\\` (\n\t\t\t\t\\`id\\` int NOT NULL,\n\t\t\t\t\\`last_name\\` text NOT NULL,\n\t\t\t\t\\`first_name\\` text,\n\t\t\t\t\\`title\\` text NOT NULL,\n\t\t\t\t\\`title_of_courtesy\\` text NOT NULL,\n\t\t\t\t\\`birth_date\\` timestamp NOT NULL,\n\t\t\t\t\\`hire_date\\` timestamp NOT NULL,\n\t\t\t\t\\`address\\` text NOT NULL,\n\t\t\t\t\\`city\\` text NOT NULL,\n\t\t\t\t\\`postal_code\\` text NOT NULL,\n\t\t\t\t\\`country\\` text NOT NULL,\n\t\t\t\t\\`home_phone\\` text NOT NULL,\n\t\t\t\t\\`extension\\` int NOT NULL,\n\t\t\t\t\\`notes\\` text NOT NULL,\n\t\t\t\t\\`reports_to\\` int,\n\t\t\t\t\\`photo_path\\` text,\n\t\t\t\tCONSTRAINT \\`employee_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`order\\` (\n\t\t\t\t\\`id\\` int NOT NULL,\n\t\t\t\t\\`order_date\\` timestamp NOT NULL,\n\t\t\t\t\\`required_date\\` timestamp NOT NULL,\n\t\t\t\t\\`shipped_date\\` timestamp,\n\t\t\t\t\\`ship_via\\` int NOT NULL,\n\t\t\t\t\\`freight\\` float NOT NULL,\n\t\t\t\t\\`ship_name\\` text NOT NULL,\n\t\t\t\t\\`ship_city\\` text NOT NULL,\n\t\t\t\t\\`ship_region\\` text,\n\t\t\t\t\\`ship_postal_code\\` text,\n\t\t\t\t\\`ship_country\\` text NOT NULL,\n\t\t\t\t\\`customer_id\\` varchar(256) NOT NULL,\n\t\t\t\t\\`employee_id\\` int NOT NULL,\n\t\t\t\tCONSTRAINT \\`order_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`product\\` (\n\t\t\t\t\\`id\\` int NOT NULL,\n\t\t\t\t\\`name\\` text NOT NULL,\n\t\t\t\t\\`quantity_per_unit\\` text NOT NULL,\n\t\t\t\t\\`unit_price\\` float NOT NULL,\n\t\t\t\t\\`units_in_stock\\` int NOT NULL,\n\t\t\t\t\\`units_on_order\\` int NOT NULL,\n\t\t\t\t\\`reorder_level\\` int NOT NULL,\n\t\t\t\t\\`discontinued\\` int NOT NULL,\n\t\t\t\t\\`supplier_id\\` int NOT NULL,\n\t\t\t\tCONSTRAINT \\`product_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`supplier\\` (\n\t\t\t\t\\`id\\` int NOT NULL,\n\t\t\t\t\\`company_name\\` text NOT NULL,\n\t\t\t\t\\`contact_name\\` text NOT NULL,\n\t\t\t\t\\`contact_title\\` text NOT NULL,\n\t\t\t\t\\`address\\` text NOT NULL,\n\t\t\t\t\\`city\\` text NOT NULL,\n\t\t\t\t\\`region\\` text,\n\t\t\t\t\\`postal_code\\` text NOT NULL,\n\t\t\t\t\\`country\\` text NOT NULL,\n\t\t\t\t\\`phone\\` text NOT NULL,\n\t\t\t\tCONSTRAINT \\`supplier_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`users\\` (\n\t\t\t\t\\`id\\` int,\n\t\t\t\t\\`name\\` text,\n\t\t\t\t\\`invitedBy\\` int,\n\t\t\t\tCONSTRAINT \\`users_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`posts\\` (\n\t\t\t\t\\`id\\` int,\n\t\t\t\t\\`name\\` text,\n\t\t\t\t\\`content\\` text,\n\t\t\t\t\\`userId\\` int,\n\t\t\t\tCONSTRAINT \\`posts_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`order_detail\\` ADD CONSTRAINT \\`order_detail_order_id_order_id_fk\\` FOREIGN KEY (\\`order_id\\`) REFERENCES \\`order\\`(\\`id\\`) ON DELETE cascade ON UPDATE no action;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`order_detail\\` ADD CONSTRAINT \\`order_detail_product_id_product_id_fk\\` FOREIGN KEY (\\`product_id\\`) REFERENCES \\`product\\`(\\`id\\`) ON DELETE cascade ON UPDATE no action;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`employee\\` ADD CONSTRAINT \\`employee_reports_to_employee_id_fk\\` FOREIGN KEY (\\`reports_to\\`) REFERENCES \\`employee\\`(\\`id\\`) ON DELETE no action ON UPDATE no action;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`order\\` ADD CONSTRAINT \\`order_customer_id_customer_id_fk\\` FOREIGN KEY (\\`customer_id\\`) REFERENCES \\`customer\\`(\\`id\\`) ON DELETE cascade ON UPDATE no action;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`order\\` ADD CONSTRAINT \\`order_employee_id_employee_id_fk\\` FOREIGN KEY (\\`employee_id\\`) REFERENCES \\`employee\\`(\\`id\\`) ON DELETE cascade ON UPDATE no action;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`product\\` ADD CONSTRAINT \\`product_supplier_id_supplier_id_fk\\` FOREIGN KEY (\\`supplier_id\\`) REFERENCES \\`supplier\\`(\\`id\\`) ON DELETE cascade ON UPDATE no action;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`users\\` ADD CONSTRAINT \\`users_invitedBy_users_id_fk\\` FOREIGN KEY (\\`invitedBy\\`) REFERENCES \\`users\\`(\\`id\\`) ON DELETE cascade ON UPDATE no action;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`posts\\` ADD CONSTRAINT \\`posts_userId_users_id_fk\\` FOREIGN KEY (\\`userId\\`) REFERENCES \\`users\\`(\\`id\\`) ON DELETE cascade ON UPDATE no action;\n\t\t`,\n\t);\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait mysqlContainer?.stop().catch(console.error);\n});\n\nafterEach(async () => {\n\tawait reset(db, schema);\n});\n\ntest('basic seed test', async () => {\n\tawait seed(db, schema);\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(10);\n\texpect(details.length).toBe(10);\n\texpect(employees.length).toBe(10);\n\texpect(orders.length).toBe(10);\n\texpect(products.length).toBe(10);\n\texpect(suppliers.length).toBe(10);\n});\n\ntest('seed with options.count:11 test', async () => {\n\tawait seed(db, schema, { count: 11 });\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(11);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(11);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('redefine(refine) customers count', async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 12,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(12);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(11);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('redefine(refine) all tables count', async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 12,\n\t\t},\n\t\tdetails: {\n\t\t\tcount: 13,\n\t\t},\n\t\temployees: {\n\t\t\tcount: 14,\n\t\t},\n\t\torders: {\n\t\t\tcount: 15,\n\t\t},\n\t\tproducts: {\n\t\t\tcount: 16,\n\t\t},\n\t\tsuppliers: {\n\t\t\tcount: 17,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(12);\n\texpect(details.length).toBe(13);\n\texpect(employees.length).toBe(14);\n\texpect(orders.length).toBe(15);\n\texpect(products.length).toBe(16);\n\texpect(suppliers.length).toBe(17);\n});\n\ntest(\"redefine(refine) orders count using 'with' in customers\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 13,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest(\"sequential using of 'with'\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 12,\n\t\t\twith: {\n\t\t\t\tdetails: 3,\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(24);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('overlapping a foreign key constraint with a one-to-many relation', async () => {\n\tconst postsRelation = relations(schema.posts, ({ one }) => ({\n\t\tuser: one(schema.users, { fields: [schema.posts.userId], references: [schema.users.id] }),\n\t}));\n\n\tconst consoleMock = vi.spyOn(console, 'warn').mockImplementation(() => {});\n\n\tawait reset(db, { users: schema.users, posts: schema.posts, postsRelation });\n\tawait seed(db, { users: schema.users, posts: schema.posts, postsRelation });\n\t// expecting to get a warning\n\texpect(consoleMock).toBeCalled();\n\texpect(consoleMock).toBeCalledWith(expect.stringMatching(/^You are providing a one-to-many relation.+/));\n\n\tconst users = await db.select().from(schema.users);\n\tconst posts = await db.select().from(schema.posts);\n\n\texpect(users.length).toBe(10);\n\tlet predicate = users.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\texpect(posts.length).toBe(10);\n\tpredicate = posts.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n"
  },
  {
    "path": "drizzle-seed/tests/mysql/mysqlSchema.ts",
    "content": "import type { AnyMySqlColumn } from 'drizzle-orm/mysql-core';\nimport { float, int, mysqlTable, text, timestamp, varchar } from 'drizzle-orm/mysql-core';\n\nexport const customers = mysqlTable('customer', {\n\tid: varchar('id', { length: 256 }).primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tpostalCode: text('postal_code'),\n\tregion: text('region'),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n\tfax: text('fax'),\n});\n\nexport const employees = mysqlTable(\n\t'employee',\n\t{\n\t\tid: int('id').primaryKey(),\n\t\tlastName: text('last_name').notNull(),\n\t\tfirstName: text('first_name'),\n\t\ttitle: text('title').notNull(),\n\t\ttitleOfCourtesy: text('title_of_courtesy').notNull(),\n\t\tbirthDate: timestamp('birth_date').notNull(),\n\t\thireDate: timestamp('hire_date').notNull(),\n\t\taddress: text('address').notNull(),\n\t\tcity: text('city').notNull(),\n\t\tpostalCode: text('postal_code').notNull(),\n\t\tcountry: text('country').notNull(),\n\t\thomePhone: text('home_phone').notNull(),\n\t\textension: int('extension').notNull(),\n\t\tnotes: text('notes').notNull(),\n\t\treportsTo: int('reports_to').references((): AnyMySqlColumn => employees.id),\n\t\tphotoPath: text('photo_path'),\n\t},\n);\n\nexport const orders = mysqlTable('order', {\n\tid: int('id').primaryKey(),\n\torderDate: timestamp('order_date').notNull(),\n\trequiredDate: timestamp('required_date').notNull(),\n\tshippedDate: timestamp('shipped_date'),\n\tshipVia: int('ship_via').notNull(),\n\tfreight: float('freight').notNull(),\n\tshipName: text('ship_name').notNull(),\n\tshipCity: text('ship_city').notNull(),\n\tshipRegion: text('ship_region'),\n\tshipPostalCode: text('ship_postal_code'),\n\tshipCountry: text('ship_country').notNull(),\n\n\tcustomerId: varchar('customer_id', { length: 256 })\n\t\t.notNull()\n\t\t.references(() => customers.id, { onDelete: 'cascade' }),\n\n\temployeeId: int('employee_id')\n\t\t.notNull()\n\t\t.references(() => employees.id, { onDelete: 'cascade' }),\n});\n\nexport const suppliers = mysqlTable('supplier', {\n\tid: int('id').primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tregion: text('region'),\n\tpostalCode: text('postal_code').notNull(),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n});\n\nexport const products = mysqlTable('product', {\n\tid: int('id').primaryKey(),\n\tname: text('name').notNull(),\n\tquantityPerUnit: text('quantity_per_unit').notNull(),\n\tunitPrice: float('unit_price').notNull(),\n\tunitsInStock: int('units_in_stock').notNull(),\n\tunitsOnOrder: int('units_on_order').notNull(),\n\treorderLevel: int('reorder_level').notNull(),\n\tdiscontinued: int('discontinued').notNull(),\n\n\tsupplierId: int('supplier_id')\n\t\t.notNull()\n\t\t.references(() => suppliers.id, { onDelete: 'cascade' }),\n});\n\nexport const details = mysqlTable('order_detail', {\n\tunitPrice: float('unit_price').notNull(),\n\tquantity: int('quantity').notNull(),\n\tdiscount: float('discount').notNull(),\n\n\torderId: int('order_id')\n\t\t.notNull()\n\t\t.references(() => orders.id, { onDelete: 'cascade' }),\n\n\tproductId: int('product_id')\n\t\t.notNull()\n\t\t.references(() => products.id, { onDelete: 'cascade' }),\n});\n\nexport const users = mysqlTable(\n\t'users',\n\t{\n\t\tid: int().primaryKey(),\n\t\tname: text(),\n\t\tinvitedBy: int().references((): AnyMySqlColumn => users.id),\n\t},\n);\n\nexport const posts = mysqlTable(\n\t'posts',\n\t{\n\t\tid: int().primaryKey(),\n\t\tname: text(),\n\t\tcontent: text(),\n\t\tuserId: int().references(() => users.id),\n\t},\n);\n"
  },
  {
    "path": "drizzle-seed/tests/mysql/softRelationsTest/mysqlSchema.ts",
    "content": "import { relations } from 'drizzle-orm';\nimport { float, int, mysqlTable, text, timestamp, varchar } from 'drizzle-orm/mysql-core';\n\nexport const customers = mysqlTable('customer', {\n\tid: varchar('id', { length: 256 }).primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tpostalCode: text('postal_code'),\n\tregion: text('region'),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n\tfax: text('fax'),\n});\n\nexport const employees = mysqlTable(\n\t'employee',\n\t{\n\t\tid: int('id').primaryKey(),\n\t\tlastName: text('last_name').notNull(),\n\t\tfirstName: text('first_name'),\n\t\ttitle: text('title').notNull(),\n\t\ttitleOfCourtesy: text('title_of_courtesy').notNull(),\n\t\tbirthDate: timestamp('birth_date').notNull(),\n\t\thireDate: timestamp('hire_date').notNull(),\n\t\taddress: text('address').notNull(),\n\t\tcity: text('city').notNull(),\n\t\tpostalCode: text('postal_code').notNull(),\n\t\tcountry: text('country').notNull(),\n\t\thomePhone: text('home_phone').notNull(),\n\t\textension: int('extension').notNull(),\n\t\tnotes: text('notes').notNull(),\n\t\treportsTo: int('reports_to'),\n\t\tphotoPath: text('photo_path'),\n\t},\n);\n\nexport const employeesRelations = relations(employees, ({ one }) => ({\n\temployee: one(employees, {\n\t\tfields: [employees.reportsTo],\n\t\treferences: [employees.id],\n\t}),\n}));\n\nexport const orders = mysqlTable('order', {\n\tid: int('id').primaryKey(),\n\torderDate: timestamp('order_date').notNull(),\n\trequiredDate: timestamp('required_date').notNull(),\n\tshippedDate: timestamp('shipped_date'),\n\tshipVia: int('ship_via').notNull(),\n\tfreight: float('freight').notNull(),\n\tshipName: text('ship_name').notNull(),\n\tshipCity: text('ship_city').notNull(),\n\tshipRegion: text('ship_region'),\n\tshipPostalCode: text('ship_postal_code'),\n\tshipCountry: text('ship_country').notNull(),\n\n\tcustomerId: varchar('customer_id', { length: 256 }).notNull(),\n\n\temployeeId: int('employee_id').notNull(),\n});\n\nexport const ordersRelations = relations(orders, ({ one }) => ({\n\tcustomer: one(customers, {\n\t\tfields: [orders.customerId],\n\t\treferences: [customers.id],\n\t}),\n\temployee: one(employees, {\n\t\tfields: [orders.employeeId],\n\t\treferences: [employees.id],\n\t}),\n}));\n\nexport const suppliers = mysqlTable('supplier', {\n\tid: int('id').primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tregion: text('region'),\n\tpostalCode: text('postal_code').notNull(),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n});\n\nexport const products = mysqlTable('product', {\n\tid: int('id').primaryKey(),\n\tname: text('name').notNull(),\n\tquantityPerUnit: text('quantity_per_unit').notNull(),\n\tunitPrice: float('unit_price').notNull(),\n\tunitsInStock: int('units_in_stock').notNull(),\n\tunitsOnOrder: int('units_on_order').notNull(),\n\treorderLevel: int('reorder_level').notNull(),\n\tdiscontinued: int('discontinued').notNull(),\n\n\tsupplierId: int('supplier_id').notNull(),\n});\n\nexport const productsRelations = relations(products, ({ one }) => ({\n\tsupplier: one(suppliers, {\n\t\tfields: [products.supplierId],\n\t\treferences: [suppliers.id],\n\t}),\n}));\n\nexport const details = mysqlTable('order_detail', {\n\tunitPrice: float('unit_price').notNull(),\n\tquantity: int('quantity').notNull(),\n\tdiscount: float('discount').notNull(),\n\n\torderId: int('order_id').notNull(),\n\n\tproductId: int('product_id').notNull(),\n});\n\nexport const detailsRelations = relations(details, ({ one }) => ({\n\torder: one(orders, {\n\t\tfields: [details.orderId],\n\t\treferences: [orders.id],\n\t}),\n\tproduct: one(products, {\n\t\tfields: [details.productId],\n\t\treferences: [products.id],\n\t}),\n}));\n"
  },
  {
    "path": "drizzle-seed/tests/mysql/softRelationsTest/softRelations.test.ts",
    "content": "import Docker from 'dockerode';\nimport { sql } from 'drizzle-orm';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport getPort from 'get-port';\nimport type { Connection } from 'mysql2/promise';\nimport { createConnection } from 'mysql2/promise';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, afterEach, beforeAll, expect, test } from 'vitest';\nimport { reset, seed } from '../../../src/index.ts';\nimport * as schema from './mysqlSchema.ts';\n\nlet mysqlContainer: Docker.Container;\nlet client: Connection;\nlet db: MySql2Database;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'mysql:8';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tmysqlContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait mysqlContainer.start();\n\n\treturn `mysql://root:mysql@127.0.0.1:${port}/drizzle`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = await createDockerDB();\n\n\tconst sleep = 1000;\n\tlet timeLeft = 40000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = await createConnection(connectionString);\n\t\t\tawait client.connect();\n\t\t\tdb = drizzle(client);\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to MySQL');\n\t\tawait client?.end().catch(console.error);\n\t\tawait mysqlContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`customer\\` (\n\t\t\t\t\\`id\\` varchar(256) NOT NULL,\n\t\t\t\t\\`company_name\\` text NOT NULL,\n\t\t\t\t\\`contact_name\\` text NOT NULL,\n\t\t\t\t\\`contact_title\\` text NOT NULL,\n\t\t\t\t\\`address\\` text NOT NULL,\n\t\t\t\t\\`city\\` text NOT NULL,\n\t\t\t\t\\`postal_code\\` text,\n\t\t\t\t\\`region\\` text,\n\t\t\t\t\\`country\\` text NOT NULL,\n\t\t\t\t\\`phone\\` text NOT NULL,\n\t\t\t\t\\`fax\\` text,\n\t\t\t\tCONSTRAINT \\`customer_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`order_detail\\` (\n\t\t\t\t\\`unit_price\\` float NOT NULL,\n\t\t\t\t\\`quantity\\` int NOT NULL,\n\t\t\t\t\\`discount\\` float NOT NULL,\n\t\t\t\t\\`order_id\\` int NOT NULL,\n\t\t\t\t\\`product_id\\` int NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`employee\\` (\n\t\t\t\t\\`id\\` int NOT NULL,\n\t\t\t\t\\`last_name\\` text NOT NULL,\n\t\t\t\t\\`first_name\\` text,\n\t\t\t\t\\`title\\` text NOT NULL,\n\t\t\t\t\\`title_of_courtesy\\` text NOT NULL,\n\t\t\t\t\\`birth_date\\` timestamp NOT NULL,\n\t\t\t\t\\`hire_date\\` timestamp NOT NULL,\n\t\t\t\t\\`address\\` text NOT NULL,\n\t\t\t\t\\`city\\` text NOT NULL,\n\t\t\t\t\\`postal_code\\` text NOT NULL,\n\t\t\t\t\\`country\\` text NOT NULL,\n\t\t\t\t\\`home_phone\\` text NOT NULL,\n\t\t\t\t\\`extension\\` int NOT NULL,\n\t\t\t\t\\`notes\\` text NOT NULL,\n\t\t\t\t\\`reports_to\\` int,\n\t\t\t\t\\`photo_path\\` text,\n\t\t\t\tCONSTRAINT \\`employee_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`order\\` (\n\t\t\t\t\\`id\\` int NOT NULL,\n\t\t\t\t\\`order_date\\` timestamp NOT NULL,\n\t\t\t\t\\`required_date\\` timestamp NOT NULL,\n\t\t\t\t\\`shipped_date\\` timestamp,\n\t\t\t\t\\`ship_via\\` int NOT NULL,\n\t\t\t\t\\`freight\\` float NOT NULL,\n\t\t\t\t\\`ship_name\\` text NOT NULL,\n\t\t\t\t\\`ship_city\\` text NOT NULL,\n\t\t\t\t\\`ship_region\\` text,\n\t\t\t\t\\`ship_postal_code\\` text,\n\t\t\t\t\\`ship_country\\` text NOT NULL,\n\t\t\t\t\\`customer_id\\` varchar(256) NOT NULL,\n\t\t\t\t\\`employee_id\\` int NOT NULL,\n\t\t\t\tCONSTRAINT \\`order_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`product\\` (\n\t\t\t\t\\`id\\` int NOT NULL,\n\t\t\t\t\\`name\\` text NOT NULL,\n\t\t\t\t\\`quantity_per_unit\\` text NOT NULL,\n\t\t\t\t\\`unit_price\\` float NOT NULL,\n\t\t\t\t\\`units_in_stock\\` int NOT NULL,\n\t\t\t\t\\`units_on_order\\` int NOT NULL,\n\t\t\t\t\\`reorder_level\\` int NOT NULL,\n\t\t\t\t\\`discontinued\\` int NOT NULL,\n\t\t\t\t\\`supplier_id\\` int NOT NULL,\n\t\t\t\tCONSTRAINT \\`product_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`supplier\\` (\n\t\t\t\t\\`id\\` int NOT NULL,\n\t\t\t\t\\`company_name\\` text NOT NULL,\n\t\t\t\t\\`contact_name\\` text NOT NULL,\n\t\t\t\t\\`contact_title\\` text NOT NULL,\n\t\t\t\t\\`address\\` text NOT NULL,\n\t\t\t\t\\`city\\` text NOT NULL,\n\t\t\t\t\\`region\\` text,\n\t\t\t\t\\`postal_code\\` text NOT NULL,\n\t\t\t\t\\`country\\` text NOT NULL,\n\t\t\t\t\\`phone\\` text NOT NULL,\n\t\t\t\tCONSTRAINT \\`supplier_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait mysqlContainer?.stop().catch(console.error);\n});\n\nafterEach(async () => {\n\tawait reset(db, schema);\n});\n\nconst checkSoftRelations = (\n\tcustomers: (typeof schema.customers.$inferSelect)[],\n\tdetails: (typeof schema.details.$inferSelect)[],\n\temployees: (typeof schema.employees.$inferSelect)[],\n\torders: (typeof schema.orders.$inferSelect)[],\n\tproducts: (typeof schema.products.$inferSelect)[],\n\tsuppliers: (typeof schema.suppliers.$inferSelect)[],\n) => {\n\t// employees soft relations check\n\tconst employeeIds = new Set(employees.map((employee) => employee.id));\n\tconst employeesPredicate = employees.every((employee) =>\n\t\temployee.reportsTo !== null && employeeIds.has(employee.reportsTo)\n\t);\n\texpect(employeesPredicate).toBe(true);\n\n\t// orders soft relations check\n\tconst customerIds = new Set(customers.map((customer) => customer.id));\n\tconst ordersPredicate1 = orders.every((order) => order.customerId !== null && customerIds.has(order.customerId));\n\texpect(ordersPredicate1).toBe(true);\n\n\tconst ordersPredicate2 = orders.every((order) => order.employeeId !== null && employeeIds.has(order.employeeId));\n\texpect(ordersPredicate2).toBe(true);\n\n\t// product soft relations check\n\tconst supplierIds = new Set(suppliers.map((supplier) => supplier.id));\n\tconst productsPredicate = products.every((product) =>\n\t\tproduct.supplierId !== null && supplierIds.has(product.supplierId)\n\t);\n\texpect(productsPredicate).toBe(true);\n\n\t// details soft relations check\n\tconst orderIds = new Set(orders.map((order) => order.id));\n\tconst detailsPredicate1 = details.every((detail) => detail.orderId !== null && orderIds.has(detail.orderId));\n\texpect(detailsPredicate1).toBe(true);\n\n\tconst productIds = new Set(products.map((product) => product.id));\n\tconst detailsPredicate2 = details.every((detail) => detail.productId !== null && productIds.has(detail.productId));\n\texpect(detailsPredicate2).toBe(true);\n};\n\ntest('basic seed, soft relations test', async () => {\n\tawait seed(db, schema);\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(10);\n\texpect(details.length).toBe(10);\n\texpect(employees.length).toBe(10);\n\texpect(orders.length).toBe(10);\n\texpect(products.length).toBe(10);\n\texpect(suppliers.length).toBe(10);\n\n\tcheckSoftRelations(customers, details, employees, orders, products, suppliers);\n});\n\ntest(\"redefine(refine) orders count using 'with' in customers, soft relations test\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 13,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n\n\tcheckSoftRelations(customers, details, employees, orders, products, suppliers);\n});\n\ntest(\"sequential using of 'with', soft relations test\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 12,\n\t\t\twith: {\n\t\t\t\tdetails: 3,\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(24);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n\n\tcheckSoftRelations(customers, details, employees, orders, products, suppliers);\n});\n"
  },
  {
    "path": "drizzle-seed/tests/northwind/mysqlSchema.ts",
    "content": "import type { AnyMySqlColumn } from 'drizzle-orm/mysql-core';\nimport { float, int, mysqlTable, text, timestamp, varchar } from 'drizzle-orm/mysql-core';\n\nexport const customers = mysqlTable('customer', {\n\tid: varchar('id', { length: 256 }).primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tpostalCode: text('postal_code'),\n\tregion: text('region'),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n\tfax: text('fax'),\n});\n\nexport const employees = mysqlTable(\n\t'employee',\n\t{\n\t\tid: int('id').primaryKey(),\n\t\tlastName: text('last_name').notNull(),\n\t\tfirstName: text('first_name'),\n\t\ttitle: text('title').notNull(),\n\t\ttitleOfCourtesy: text('title_of_courtesy').notNull(),\n\t\tbirthDate: timestamp('birth_date').notNull(),\n\t\thireDate: timestamp('hire_date').notNull(),\n\t\taddress: text('address').notNull(),\n\t\tcity: text('city').notNull(),\n\t\tpostalCode: text('postal_code').notNull(),\n\t\tcountry: text('country').notNull(),\n\t\thomePhone: text('home_phone').notNull(),\n\t\textension: int('extension').notNull(),\n\t\tnotes: text('notes').notNull(),\n\t\treportsTo: int('reports_to').references((): AnyMySqlColumn => employees.id),\n\t\tphotoPath: text('photo_path'),\n\t},\n);\n\nexport const orders = mysqlTable('order', {\n\tid: int('id').primaryKey(),\n\torderDate: timestamp('order_date').notNull(),\n\trequiredDate: timestamp('required_date').notNull(),\n\tshippedDate: timestamp('shipped_date'),\n\tshipVia: int('ship_via').notNull(),\n\tfreight: float('freight').notNull(),\n\tshipName: text('ship_name').notNull(),\n\tshipCity: text('ship_city').notNull(),\n\tshipRegion: text('ship_region'),\n\tshipPostalCode: text('ship_postal_code'),\n\tshipCountry: text('ship_country').notNull(),\n\n\tcustomerId: varchar('customer_id', { length: 256 })\n\t\t.notNull()\n\t\t.references(() => customers.id, { onDelete: 'cascade' }),\n\n\temployeeId: int('employee_id')\n\t\t.notNull()\n\t\t.references(() => employees.id, { onDelete: 'cascade' }),\n});\n\nexport const suppliers = mysqlTable('supplier', {\n\tid: int('id').primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tregion: text('region'),\n\tpostalCode: text('postal_code').notNull(),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n});\n\nexport const products = mysqlTable('product', {\n\tid: int('id').primaryKey(),\n\tname: text('name').notNull(),\n\tquantityPerUnit: text('quantity_per_unit').notNull(),\n\tunitPrice: float('unit_price').notNull(),\n\tunitsInStock: int('units_in_stock').notNull(),\n\tunitsOnOrder: int('units_on_order').notNull(),\n\treorderLevel: int('reorder_level').notNull(),\n\tdiscontinued: int('discontinued').notNull(),\n\n\tsupplierId: int('supplier_id')\n\t\t.notNull()\n\t\t.references(() => suppliers.id, { onDelete: 'cascade' }),\n});\n\nexport const details = mysqlTable('order_detail', {\n\tunitPrice: float('unit_price').notNull(),\n\tquantity: int('quantity').notNull(),\n\tdiscount: float('discount').notNull(),\n\n\torderId: int('order_id')\n\t\t.notNull()\n\t\t.references(() => orders.id, { onDelete: 'cascade' }),\n\n\tproductId: int('product_id')\n\t\t.notNull()\n\t\t.references(() => products.id, { onDelete: 'cascade' }),\n});\n"
  },
  {
    "path": "drizzle-seed/tests/northwind/mysqlTest.ts",
    "content": "import 'dotenv/config';\nimport path from 'path';\n\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport { migrate } from 'drizzle-orm/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\nimport * as schema from './mysqlSchema.ts';\n\nimport { seed } from '../../src/index.ts';\n\nconst { Mysql_HOST, Mysql_PORT, Mysql_DATABASE, Mysql_USER, Mysql_PASSWORD } = process.env;\n\nconst mysqlPool = mysql.createPool({\n\thost: Mysql_HOST,\n\tport: Number(Mysql_PORT) || 3306,\n\tdatabase: Mysql_DATABASE,\n\tuser: Mysql_USER,\n\tpassword: Mysql_PASSWORD,\n\t// ssl: { rejectUnauthorized: false }\n});\n\nconst db = drizzle(mysqlPool);\n\nconsole.log('database connection was established successfully.');\n\n(async () => {\n\tawait migrate(db, { migrationsFolder: path.join(__dirname, '../../../mysqlMigrations') });\n\tconsole.log('database was migrated.');\n\n\t// await seed(db, schema, { count: 100000, seed: 1 });\n\n\tconst titlesOfCourtesy = ['Ms.', 'Mrs.', 'Dr.'];\n\tconst unitsOnOrders = [0, 10, 20, 30, 50, 60, 70, 80, 100];\n\tconst reorderLevels = [0, 5, 10, 15, 20, 25, 30];\n\tconst quantityPerUnit = [\n\t\t'100 - 100 g pieces',\n\t\t'100 - 250 g bags',\n\t\t'10 - 200 g glasses',\n\t\t'10 - 4 oz boxes',\n\t\t'10 - 500 g pkgs.',\n\t\t'10 - 500 g pkgs.',\n\t\t'10 boxes x 12 pieces',\n\t\t'10 boxes x 20 bags',\n\t\t'10 boxes x 8 pieces',\n\t\t'10 kg pkg.',\n\t\t'10 pkgs.',\n\t\t'12 - 100 g bars',\n\t\t'12 - 100 g pkgs',\n\t\t'12 - 12 oz cans',\n\t\t'12 - 1 lb pkgs.',\n\t\t'12 - 200 ml jars',\n\t\t'12 - 250 g pkgs.',\n\t\t'12 - 355 ml cans',\n\t\t'12 - 500 g pkgs.',\n\t\t'750 cc per bottle',\n\t\t'5 kg pkg.',\n\t\t'50 bags x 30 sausgs.',\n\t\t'500 ml',\n\t\t'500 g',\n\t\t'48 pieces',\n\t\t'48 - 6 oz jars',\n\t\t'4 - 450 g glasses',\n\t\t'36 boxes',\n\t\t'32 - 8 oz bottles',\n\t\t'32 - 500 g boxes',\n\t];\n\tconst discounts = [0.05, 0.15, 0.2, 0.25];\n\n\tawait seed(db, schema).refine((funcs) => ({\n\t\tcustomers: {\n\t\t\tcount: 10000,\n\t\t\tcolumns: {\n\t\t\t\tcompanyName: funcs.companyName({}),\n\t\t\t\tcontactName: funcs.fullName({}),\n\t\t\t\tcontactTitle: funcs.jobTitle({}),\n\t\t\t\taddress: funcs.streetAddress({}),\n\t\t\t\tcity: funcs.city({}),\n\t\t\t\tpostalCode: funcs.postcode({}),\n\t\t\t\tregion: funcs.state({}),\n\t\t\t\tcountry: funcs.country({}),\n\t\t\t\tphone: funcs.phoneNumber({ template: '(###) ###-####' }),\n\t\t\t\tfax: funcs.phoneNumber({ template: '(###) ###-####' }),\n\t\t\t},\n\t\t},\n\t\temployees: {\n\t\t\tcount: 200,\n\t\t\tcolumns: {\n\t\t\t\tfirstName: funcs.firstName({}),\n\t\t\t\tlastName: funcs.lastName({}),\n\t\t\t\ttitle: funcs.jobTitle({}),\n\t\t\t\ttitleOfCourtesy: funcs.valuesFromArray({ values: titlesOfCourtesy }),\n\t\t\t\tbirthDate: funcs.date({ minDate: '1990-01-01', maxDate: '2010-12-31' }),\n\t\t\t\thireDate: funcs.date({ minDate: '2010-12-31', maxDate: '2024-08-26' }),\n\t\t\t\taddress: funcs.streetAddress({}),\n\t\t\t\tcity: funcs.city({}),\n\t\t\t\tpostalCode: funcs.postcode({}),\n\t\t\t\tcountry: funcs.country({}),\n\t\t\t\thomePhone: funcs.phoneNumber({ template: '(###) ###-####' }),\n\t\t\t\textension: funcs.int({ minValue: 428, maxValue: 5467 }),\n\t\t\t\tnotes: funcs.loremIpsum({}),\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 50000,\n\t\t\tcolumns: {\n\t\t\t\tshipVia: funcs.int({ minValue: 1, maxValue: 3 }),\n\t\t\t\tfreight: funcs.number({ minValue: 0, maxValue: 1000, precision: 100 }),\n\t\t\t\tshipName: funcs.streetAddress({}),\n\t\t\t\tshipCity: funcs.city({}),\n\t\t\t\tshipRegion: funcs.state({}),\n\t\t\t\tshipPostalCode: funcs.postcode({}),\n\t\t\t\tshipCountry: funcs.country({}),\n\t\t\t},\n\t\t\twith: {\n\t\t\t\tdetails: [\n\t\t\t\t\t{ weight: 0.6, count: [1, 2, 3, 4] },\n\t\t\t\t\t{ weight: 0.2, count: [5, 6, 7, 8, 9, 10] },\n\t\t\t\t\t{ weight: 0.15, count: [11, 12, 13, 14, 15, 16, 17] },\n\t\t\t\t\t{ weight: 0.05, count: [18, 19, 20, 21, 22, 23, 24, 25] },\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tsuppliers: {\n\t\t\tcount: 1000,\n\t\t\tcolumns: {\n\t\t\t\tcompanyName: funcs.companyName({}),\n\t\t\t\tcontactName: funcs.fullName({}),\n\t\t\t\tcontactTitle: funcs.jobTitle({}),\n\t\t\t\taddress: funcs.streetAddress({}),\n\t\t\t\tcity: funcs.city({}),\n\t\t\t\tpostalCode: funcs.postcode({}),\n\t\t\t\tregion: funcs.state({}),\n\t\t\t\tcountry: funcs.country({}),\n\t\t\t\tphone: funcs.phoneNumber({ template: '(###) ###-####' }),\n\t\t\t},\n\t\t},\n\t\tproducts: {\n\t\t\tcount: 5000,\n\t\t\tcolumns: {\n\t\t\t\tname: funcs.companyName({}),\n\t\t\t\tquantityPerUnit: funcs.valuesFromArray({ values: quantityPerUnit }),\n\t\t\t\tunitPrice: funcs.weightedRandom(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tweight: 0.5,\n\t\t\t\t\t\t\tvalue: funcs.int({ minValue: 3, maxValue: 300 }),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tweight: 0.5,\n\t\t\t\t\t\t\tvalue: funcs.number({ minValue: 3, maxValue: 300, precision: 100 }),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\tunitsInStock: funcs.int({ minValue: 0, maxValue: 125 }),\n\t\t\t\tunitsOnOrder: funcs.valuesFromArray({ values: unitsOnOrders }),\n\t\t\t\treorderLevel: funcs.valuesFromArray({ values: reorderLevels }),\n\t\t\t\tdiscontinued: funcs.int({ minValue: 0, maxValue: 1 }),\n\t\t\t},\n\t\t},\n\t\tdetails: {\n\t\t\tcolumns: {\n\t\t\t\tunitPrice: funcs.number({ minValue: 10, maxValue: 130 }),\n\t\t\t\tquantity: funcs.int({ minValue: 1, maxValue: 130 }),\n\t\t\t\tdiscount: funcs.weightedRandom(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ weight: 0.5, value: funcs.valuesFromArray({ values: discounts }) },\n\t\t\t\t\t\t{ weight: 0.5, value: funcs.default({ defaultValue: 0 }) },\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t},\n\t\t},\n\t}));\n\n\tawait mysqlPool.end();\n})().then();\n"
  },
  {
    "path": "drizzle-seed/tests/northwind/pgSchema.ts",
    "content": "import type { AnyPgColumn } from 'drizzle-orm/pg-core';\nimport { integer, numeric, pgSchema, text, timestamp, varchar } from 'drizzle-orm/pg-core';\n\nexport const schema = pgSchema('seeder_lib_pg');\n\nexport const customers = schema.table('customer', {\n\tid: varchar('id', { length: 256 }).primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tpostalCode: text('postal_code'),\n\tregion: text('region'),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n\tfax: text('fax'),\n});\n\nexport const employees = schema.table('employee', {\n\tid: integer('id').primaryKey(),\n\tlastName: text('last_name').notNull(),\n\tfirstName: text('first_name'),\n\ttitle: text('title').notNull(),\n\ttitleOfCourtesy: text('title_of_courtesy').notNull(),\n\tbirthDate: timestamp('birth_date').notNull(),\n\thireDate: timestamp('hire_date').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tpostalCode: text('postal_code').notNull(),\n\tcountry: text('country').notNull(),\n\thomePhone: text('home_phone').notNull(),\n\textension: integer('extension').notNull(),\n\tnotes: text('notes').notNull(),\n\treportsTo: integer('reports_to').references((): AnyPgColumn => employees.id),\n\tphotoPath: text('photo_path'),\n});\n\nexport const orders = schema.table('order', {\n\tid: integer('id').primaryKey(),\n\torderDate: timestamp('order_date').notNull(),\n\trequiredDate: timestamp('required_date').notNull(),\n\tshippedDate: timestamp('shipped_date'),\n\tshipVia: integer('ship_via').notNull(),\n\tfreight: numeric('freight').notNull(),\n\tshipName: text('ship_name').notNull(),\n\tshipCity: text('ship_city').notNull(),\n\tshipRegion: text('ship_region'),\n\tshipPostalCode: text('ship_postal_code'),\n\tshipCountry: text('ship_country').notNull(),\n\n\tcustomerId: text('customer_id')\n\t\t.notNull()\n\t\t.references(() => customers.id, { onDelete: 'cascade' }),\n\n\temployeeId: integer('employee_id')\n\t\t.notNull()\n\t\t.references(() => employees.id, { onDelete: 'cascade' }),\n});\n\nexport const suppliers = schema.table(\n\t'supplier',\n\t{\n\t\tid: integer('id').primaryKey(),\n\t\tcompanyName: text('company_name').notNull(),\n\t\tcontactName: text('contact_name').notNull(),\n\t\tcontactTitle: text('contact_title').notNull(),\n\t\taddress: text('address').notNull(),\n\t\tcity: text('city').notNull(),\n\t\tregion: text('region'),\n\t\tpostalCode: text('postal_code').notNull(),\n\t\tcountry: text('country').notNull(),\n\t\tphone: text('phone').notNull(),\n\t},\n);\n\nexport const products = schema.table('product', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tquantityPerUnit: text('quantity_per_unit').notNull(),\n\tunitPrice: numeric('unit_price').notNull(),\n\tunitsInStock: integer('units_in_stock').notNull(),\n\tunitsOnOrder: integer('units_on_order').notNull(),\n\treorderLevel: integer('reorder_level').notNull(),\n\tdiscontinued: integer('discontinued').notNull(),\n\n\tsupplierId: integer('supplier_id')\n\t\t.notNull()\n\t\t.references(() => suppliers.id, { onDelete: 'cascade' }),\n});\n\nexport const details = schema.table('order_detail', {\n\tunitPrice: numeric('unit_price').notNull(),\n\tquantity: integer('quantity').notNull(),\n\tdiscount: numeric('discount').notNull(),\n\n\torderId: integer('order_id')\n\t\t.notNull()\n\t\t.references(() => orders.id, { onDelete: 'cascade' }),\n\n\tproductId: integer('product_id')\n\t\t.notNull()\n\t\t.references(() => products.id, { onDelete: 'cascade' }),\n});\n"
  },
  {
    "path": "drizzle-seed/tests/northwind/pgTest.ts",
    "content": "import 'dotenv/config';\nimport path from 'path';\n\nimport { drizzle } from 'drizzle-orm/node-postgres';\nimport { migrate } from 'drizzle-orm/node-postgres/migrator';\nimport { Pool as PgPool } from 'pg';\n\nimport { seed } from '../../src/index.ts';\nimport * as schema from './pgSchema.ts';\n\nconst { PG_HOST, PG_PORT, PG_DATABASE, PG_USER, PG_PASSWORD } = process.env;\n\nconst pgPool = new PgPool({\n\thost: PG_HOST,\n\tport: Number(PG_PORT) || 5432,\n\tdatabase: PG_DATABASE,\n\tuser: PG_USER,\n\tpassword: PG_PASSWORD,\n\t// ssl: true\n});\n\nconst db = drizzle(pgPool);\n\nconsole.log('database connection was established successfully.');\n\n(async () => {\n\tawait migrate(db, { migrationsFolder: path.join(__dirname, '../../../pgMigrations') });\n\tconsole.log('database was migrated.');\n\n\t// await seed(db, schema, { count: 100000, seed: 1 });\n\n\tconst titlesOfCourtesy = ['Ms.', 'Mrs.', 'Dr.'];\n\tconst unitsOnOrders = [0, 10, 20, 30, 50, 60, 70, 80, 100];\n\tconst reorderLevels = [0, 5, 10, 15, 20, 25, 30];\n\tconst quantityPerUnit = [\n\t\t'100 - 100 g pieces',\n\t\t'100 - 250 g bags',\n\t\t'10 - 200 g glasses',\n\t\t'10 - 4 oz boxes',\n\t\t'10 - 500 g pkgs.',\n\t\t'10 - 500 g pkgs.',\n\t\t'10 boxes x 12 pieces',\n\t\t'10 boxes x 20 bags',\n\t\t'10 boxes x 8 pieces',\n\t\t'10 kg pkg.',\n\t\t'10 pkgs.',\n\t\t'12 - 100 g bars',\n\t\t'12 - 100 g pkgs',\n\t\t'12 - 12 oz cans',\n\t\t'12 - 1 lb pkgs.',\n\t\t'12 - 200 ml jars',\n\t\t'12 - 250 g pkgs.',\n\t\t'12 - 355 ml cans',\n\t\t'12 - 500 g pkgs.',\n\t\t'750 cc per bottle',\n\t\t'5 kg pkg.',\n\t\t'50 bags x 30 sausgs.',\n\t\t'500 ml',\n\t\t'500 g',\n\t\t'48 pieces',\n\t\t'48 - 6 oz jars',\n\t\t'4 - 450 g glasses',\n\t\t'36 boxes',\n\t\t'32 - 8 oz bottles',\n\t\t'32 - 500 g boxes',\n\t];\n\tconst discounts = [0.05, 0.15, 0.2, 0.25];\n\n\tawait seed(db, schema).refine((funcs) => ({\n\t\tcustomers: {\n\t\t\tcount: 10000,\n\t\t\tcolumns: {\n\t\t\t\tcompanyName: funcs.companyName({}),\n\t\t\t\tcontactName: funcs.fullName({}),\n\t\t\t\tcontactTitle: funcs.jobTitle({}),\n\t\t\t\taddress: funcs.streetAddress({}),\n\t\t\t\tcity: funcs.city({}),\n\t\t\t\tpostalCode: funcs.postcode({}),\n\t\t\t\tregion: funcs.state({}),\n\t\t\t\tcountry: funcs.country({}),\n\t\t\t\tphone: funcs.phoneNumber({ template: '(###) ###-####' }),\n\t\t\t\tfax: funcs.phoneNumber({ template: '(###) ###-####' }),\n\t\t\t},\n\t\t},\n\t\temployees: {\n\t\t\tcount: 200,\n\t\t\tcolumns: {\n\t\t\t\tfirstName: funcs.firstName({}),\n\t\t\t\tlastName: funcs.lastName({}),\n\t\t\t\ttitle: funcs.jobTitle({}),\n\t\t\t\ttitleOfCourtesy: funcs.valuesFromArray({ values: titlesOfCourtesy }),\n\t\t\t\tbirthDate: funcs.date({ minDate: '1990-01-01', maxDate: '2010-12-31' }),\n\t\t\t\thireDate: funcs.date({ minDate: '2010-12-31', maxDate: '2024-08-26' }),\n\t\t\t\taddress: funcs.streetAddress({}),\n\t\t\t\tcity: funcs.city({}),\n\t\t\t\tpostalCode: funcs.postcode({}),\n\t\t\t\tcountry: funcs.country({}),\n\t\t\t\thomePhone: funcs.phoneNumber({ template: '(###) ###-####' }),\n\t\t\t\textension: funcs.int({ minValue: 428, maxValue: 5467 }),\n\t\t\t\tnotes: funcs.loremIpsum({}),\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 50000,\n\t\t\tcolumns: {\n\t\t\t\tshipVia: funcs.int({ minValue: 1, maxValue: 3 }),\n\t\t\t\tfreight: funcs.number({ minValue: 0, maxValue: 1000, precision: 100 }),\n\t\t\t\tshipName: funcs.streetAddress({}),\n\t\t\t\tshipCity: funcs.city({}),\n\t\t\t\tshipRegion: funcs.state({}),\n\t\t\t\tshipPostalCode: funcs.postcode({}),\n\t\t\t\tshipCountry: funcs.country({}),\n\t\t\t},\n\t\t\twith: {\n\t\t\t\tdetails: [\n\t\t\t\t\t{ weight: 0.6, count: [1, 2, 3, 4] },\n\t\t\t\t\t{ weight: 0.2, count: [5, 6, 7, 8, 9, 10] },\n\t\t\t\t\t{ weight: 0.15, count: [11, 12, 13, 14, 15, 16, 17] },\n\t\t\t\t\t{ weight: 0.05, count: [18, 19, 20, 21, 22, 23, 24, 25] },\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tsuppliers: {\n\t\t\tcount: 1000,\n\t\t\tcolumns: {\n\t\t\t\tcompanyName: funcs.companyName({}),\n\t\t\t\tcontactName: funcs.fullName({}),\n\t\t\t\tcontactTitle: funcs.jobTitle({}),\n\t\t\t\taddress: funcs.streetAddress({}),\n\t\t\t\tcity: funcs.city({}),\n\t\t\t\tpostalCode: funcs.postcode({}),\n\t\t\t\tregion: funcs.state({}),\n\t\t\t\tcountry: funcs.country({}),\n\t\t\t\tphone: funcs.phoneNumber({ template: '(###) ###-####' }),\n\t\t\t},\n\t\t},\n\t\tproducts: {\n\t\t\tcount: 5000,\n\t\t\tcolumns: {\n\t\t\t\tname: funcs.companyName({}),\n\t\t\t\tquantityPerUnit: funcs.valuesFromArray({ values: quantityPerUnit }),\n\t\t\t\tunitPrice: funcs.weightedRandom(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tweight: 0.5,\n\t\t\t\t\t\t\tvalue: funcs.int({ minValue: 3, maxValue: 300 }),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tweight: 0.5,\n\t\t\t\t\t\t\tvalue: funcs.number({ minValue: 3, maxValue: 300, precision: 100 }),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\tunitsInStock: funcs.int({ minValue: 0, maxValue: 125 }),\n\t\t\t\tunitsOnOrder: funcs.valuesFromArray({ values: unitsOnOrders }),\n\t\t\t\treorderLevel: funcs.valuesFromArray({ values: reorderLevels }),\n\t\t\t\tdiscontinued: funcs.int({ minValue: 0, maxValue: 1 }),\n\t\t\t},\n\t\t},\n\t\tdetails: {\n\t\t\tcolumns: {\n\t\t\t\tunitPrice: funcs.number({ minValue: 10, maxValue: 130 }),\n\t\t\t\tquantity: funcs.int({ minValue: 1, maxValue: 130 }),\n\t\t\t\tdiscount: funcs.weightedRandom(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ weight: 0.5, value: funcs.valuesFromArray({ values: discounts }) },\n\t\t\t\t\t\t{ weight: 0.5, value: funcs.default({ defaultValue: 0 }) },\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t},\n\t\t},\n\t}));\n\n\tawait pgPool.end();\n})().then();\n"
  },
  {
    "path": "drizzle-seed/tests/northwind/sqliteSchema.ts",
    "content": "import { foreignKey, integer, numeric, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const customers = sqliteTable('customer', {\n\tid: text('id').primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tpostalCode: text('postal_code'),\n\tregion: text('region'),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n\tfax: text('fax'),\n});\n\nexport const employees = sqliteTable(\n\t'employee',\n\t{\n\t\tid: integer('id').primaryKey(),\n\t\tlastName: text('last_name').notNull(),\n\t\tfirstName: text('first_name'),\n\t\ttitle: text('title').notNull(),\n\t\ttitleOfCourtesy: text('title_of_courtesy').notNull(),\n\t\tbirthDate: integer('birth_date', { mode: 'timestamp' }).notNull(),\n\t\thireDate: integer('hire_date', { mode: 'timestamp' }).notNull(),\n\t\taddress: text('address').notNull(),\n\t\tcity: text('city').notNull(),\n\t\tpostalCode: text('postal_code').notNull(),\n\t\tcountry: text('country').notNull(),\n\t\thomePhone: text('home_phone').notNull(),\n\t\textension: integer('extension').notNull(),\n\t\tnotes: text('notes').notNull(),\n\t\treportsTo: integer('reports_to'),\n\t\tphotoPath: text('photo_path'),\n\t},\n\t(table) => ({\n\t\treportsToFk: foreignKey(() => ({\n\t\t\tcolumns: [table.reportsTo],\n\t\t\tforeignColumns: [table.id],\n\t\t})),\n\t}),\n);\n\nexport const orders = sqliteTable('order', {\n\tid: integer('id').primaryKey(),\n\torderDate: integer('order_date', { mode: 'timestamp' }).notNull(),\n\trequiredDate: integer('required_date', { mode: 'timestamp' }).notNull(),\n\tshippedDate: integer('shipped_date', { mode: 'timestamp' }),\n\tshipVia: integer('ship_via').notNull(),\n\tfreight: numeric('freight').notNull(),\n\tshipName: text('ship_name').notNull(),\n\tshipCity: text('ship_city').notNull(),\n\tshipRegion: text('ship_region'),\n\tshipPostalCode: text('ship_postal_code'),\n\tshipCountry: text('ship_country').notNull(),\n\n\tcustomerId: text('customer_id')\n\t\t.notNull()\n\t\t.references(() => customers.id, { onDelete: 'cascade' }),\n\n\temployeeId: integer('employee_id')\n\t\t.notNull()\n\t\t.references(() => employees.id, { onDelete: 'cascade' }),\n});\n\nexport const suppliers = sqliteTable('supplier', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tregion: text('region'),\n\tpostalCode: text('postal_code').notNull(),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n});\n\nexport const products = sqliteTable('product', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tquantityPerUnit: text('quantity_per_unit').notNull(),\n\tunitPrice: numeric('unit_price').notNull(),\n\tunitsInStock: integer('units_in_stock').notNull(),\n\tunitsOnOrder: integer('units_on_order').notNull(),\n\treorderLevel: integer('reorder_level').notNull(),\n\tdiscontinued: integer('discontinued').notNull(),\n\n\tsupplierId: integer('supplier_id')\n\t\t.notNull()\n\t\t.references(() => suppliers.id, { onDelete: 'cascade' }),\n});\n\nexport const details = sqliteTable('order_detail', {\n\tunitPrice: numeric('unit_price').notNull(),\n\tquantity: integer('quantity').notNull(),\n\tdiscount: numeric('discount').notNull(),\n\n\torderId: integer('order_id')\n\t\t.notNull()\n\t\t.references(() => orders.id, { onDelete: 'cascade' }),\n\n\tproductId: integer('product_id')\n\t\t.notNull()\n\t\t.references(() => products.id, { onDelete: 'cascade' }),\n});\n"
  },
  {
    "path": "drizzle-seed/tests/northwind/sqliteTest.ts",
    "content": "import 'dotenv/config';\nimport path from 'path';\n\nimport betterSqlite3 from 'better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { migrate } from 'drizzle-orm/better-sqlite3/migrator';\n\nimport { seed } from '../../src/index.ts';\nimport * as schema from './sqliteSchema.ts';\n\nconst { Sqlite_PATH } = process.env;\nconst sqliteDb = betterSqlite3(Sqlite_PATH);\nconst db = drizzle(sqliteDb);\n\nconsole.log('database connection was established successfully.');\n\n(async () => {\n\tmigrate(db, { migrationsFolder: path.join(__dirname, '../../../sqliteMigrations') });\n\tconsole.log('database was migrated.');\n\n\tconst titlesOfCourtesy = ['Ms.', 'Mrs.', 'Dr.'];\n\tconst unitsOnOrders = [0, 10, 20, 30, 50, 60, 70, 80, 100];\n\tconst reorderLevels = [0, 5, 10, 15, 20, 25, 30];\n\tconst quantityPerUnit = [\n\t\t'100 - 100 g pieces',\n\t\t'100 - 250 g bags',\n\t\t'10 - 200 g glasses',\n\t\t'10 - 4 oz boxes',\n\t\t'10 - 500 g pkgs.',\n\t\t'10 - 500 g pkgs.',\n\t\t'10 boxes x 12 pieces',\n\t\t'10 boxes x 20 bags',\n\t\t'10 boxes x 8 pieces',\n\t\t'10 kg pkg.',\n\t\t'10 pkgs.',\n\t\t'12 - 100 g bars',\n\t\t'12 - 100 g pkgs',\n\t\t'12 - 12 oz cans',\n\t\t'12 - 1 lb pkgs.',\n\t\t'12 - 200 ml jars',\n\t\t'12 - 250 g pkgs.',\n\t\t'12 - 355 ml cans',\n\t\t'12 - 500 g pkgs.',\n\t\t'750 cc per bottle',\n\t\t'5 kg pkg.',\n\t\t'50 bags x 30 sausgs.',\n\t\t'500 ml',\n\t\t'500 g',\n\t\t'48 pieces',\n\t\t'48 - 6 oz jars',\n\t\t'4 - 450 g glasses',\n\t\t'36 boxes',\n\t\t'32 - 8 oz bottles',\n\t\t'32 - 500 g boxes',\n\t];\n\tconst discounts = [0.05, 0.15, 0.2, 0.25];\n\n\tawait seed(db, schema).refine((funcs) => ({\n\t\tcustomers: {\n\t\t\tcount: 10000,\n\t\t\tcolumns: {\n\t\t\t\tcompanyName: funcs.companyName({}),\n\t\t\t\tcontactName: funcs.fullName({}),\n\t\t\t\tcontactTitle: funcs.jobTitle({}),\n\t\t\t\taddress: funcs.streetAddress({}),\n\t\t\t\tcity: funcs.city({}),\n\t\t\t\tpostalCode: funcs.postcode({}),\n\t\t\t\tregion: funcs.state({}),\n\t\t\t\tcountry: funcs.country({}),\n\t\t\t\tphone: funcs.phoneNumber({ template: '(###) ###-####' }),\n\t\t\t\tfax: funcs.phoneNumber({ template: '(###) ###-####' }),\n\t\t\t},\n\t\t},\n\t\temployees: {\n\t\t\tcount: 200,\n\t\t\tcolumns: {\n\t\t\t\tfirstName: funcs.firstName({}),\n\t\t\t\tlastName: funcs.lastName({}),\n\t\t\t\ttitle: funcs.jobTitle({}),\n\t\t\t\ttitleOfCourtesy: funcs.valuesFromArray({ values: titlesOfCourtesy }),\n\t\t\t\tbirthDate: funcs.date({ minDate: '1990-01-01', maxDate: '2010-12-31' }),\n\t\t\t\thireDate: funcs.date({ minDate: '2010-12-31', maxDate: '2024-08-26' }),\n\t\t\t\taddress: funcs.streetAddress({}),\n\t\t\t\tcity: funcs.city({}),\n\t\t\t\tpostalCode: funcs.postcode({}),\n\t\t\t\tcountry: funcs.country({}),\n\t\t\t\thomePhone: funcs.phoneNumber({ template: '(###) ###-####' }),\n\t\t\t\textension: funcs.int({ minValue: 428, maxValue: 5467 }),\n\t\t\t\tnotes: funcs.loremIpsum({}),\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 50000,\n\t\t\tcolumns: {\n\t\t\t\tshipVia: funcs.int({ minValue: 1, maxValue: 3 }),\n\t\t\t\tfreight: funcs.number({ minValue: 0, maxValue: 1000, precision: 100 }),\n\t\t\t\tshipName: funcs.streetAddress({}),\n\t\t\t\tshipCity: funcs.city({}),\n\t\t\t\tshipRegion: funcs.state({}),\n\t\t\t\tshipPostalCode: funcs.postcode({}),\n\t\t\t\tshipCountry: funcs.country({}),\n\t\t\t},\n\t\t\twith: {\n\t\t\t\tdetails: [\n\t\t\t\t\t{ weight: 0.6, count: [1, 2, 3, 4] },\n\t\t\t\t\t{ weight: 0.2, count: [5, 6, 7, 8, 9, 10] },\n\t\t\t\t\t{ weight: 0.15, count: [11, 12, 13, 14, 15, 16, 17] },\n\t\t\t\t\t{ weight: 0.05, count: [18, 19, 20, 21, 22, 23, 24, 25] },\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tsuppliers: {\n\t\t\tcount: 1000,\n\t\t\tcolumns: {\n\t\t\t\tcompanyName: funcs.companyName({}),\n\t\t\t\tcontactName: funcs.fullName({}),\n\t\t\t\tcontactTitle: funcs.jobTitle({}),\n\t\t\t\taddress: funcs.streetAddress({}),\n\t\t\t\tcity: funcs.city({}),\n\t\t\t\tpostalCode: funcs.postcode({}),\n\t\t\t\tregion: funcs.state({}),\n\t\t\t\tcountry: funcs.country({}),\n\t\t\t\tphone: funcs.phoneNumber({ template: '(###) ###-####' }),\n\t\t\t},\n\t\t},\n\t\tproducts: {\n\t\t\tcount: 5000,\n\t\t\tcolumns: {\n\t\t\t\tname: funcs.companyName({}),\n\t\t\t\tquantityPerUnit: funcs.valuesFromArray({ values: quantityPerUnit }),\n\t\t\t\tunitPrice: funcs.weightedRandom(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tweight: 0.5,\n\t\t\t\t\t\t\tvalue: funcs.int({ minValue: 3, maxValue: 300 }),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tweight: 0.5,\n\t\t\t\t\t\t\tvalue: funcs.number({ minValue: 3, maxValue: 300, precision: 100 }),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\tunitsInStock: funcs.int({ minValue: 0, maxValue: 125 }),\n\t\t\t\tunitsOnOrder: funcs.valuesFromArray({ values: unitsOnOrders }),\n\t\t\t\treorderLevel: funcs.valuesFromArray({ values: reorderLevels }),\n\t\t\t\tdiscontinued: funcs.int({ minValue: 0, maxValue: 1 }),\n\t\t\t},\n\t\t},\n\t\tdetails: {\n\t\t\tcolumns: {\n\t\t\t\tunitPrice: funcs.number({ minValue: 10, maxValue: 130 }),\n\t\t\t\tquantity: funcs.int({ minValue: 1, maxValue: 130 }),\n\t\t\t\tdiscount: funcs.weightedRandom(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ weight: 0.5, value: funcs.valuesFromArray({ values: discounts }) },\n\t\t\t\t\t\t{ weight: 0.5, value: funcs.default({ defaultValue: 0 }) },\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t},\n\t\t},\n\t}));\n})().then();\n"
  },
  {
    "path": "drizzle-seed/tests/pg/allDataTypesTest/pgSchema.ts",
    "content": "import {\n\tbigint,\n\tbigserial,\n\tboolean,\n\tchar,\n\tdate,\n\tdecimal,\n\tdoublePrecision,\n\tinteger,\n\tinterval,\n\tjson,\n\tjsonb,\n\tline,\n\tnumeric,\n\tpgEnum,\n\tpgSchema,\n\tpoint,\n\treal,\n\tserial,\n\tsmallint,\n\tsmallserial,\n\ttext,\n\ttime,\n\ttimestamp,\n\tuuid,\n\tvarchar,\n} from 'drizzle-orm/pg-core';\n\nexport const schema = pgSchema('seeder_lib_pg');\n\nexport const moodEnum = pgEnum('mood_enum', ['sad', 'ok', 'happy']);\n\nexport const allDataTypes = schema.table('all_data_types', {\n\tinteger: integer('integer'),\n\tsmallint: smallint('smallint'),\n\tbiginteger: bigint('bigint', { mode: 'bigint' }),\n\tbigintNumber: bigint('bigint_number', { mode: 'number' }),\n\tserial: serial('serial'),\n\tsmallserial: smallserial('smallserial'),\n\tbigserial: bigserial('bigserial', { mode: 'bigint' }),\n\tbigserialNumber: bigserial('bigserial_number', { mode: 'number' }),\n\tboolean: boolean('boolean'),\n\ttext: text('text'),\n\tvarchar: varchar('varchar', { length: 256 }),\n\tchar: char('char', { length: 256 }),\n\tnumeric: numeric('numeric'),\n\tdecimal: decimal('decimal'),\n\treal: real('real'),\n\tdoublePrecision: doublePrecision('double_precision'),\n\tjson: json('json'),\n\tjsonb: jsonb('jsonb'),\n\ttime: time('time'),\n\ttimestampDate: timestamp('timestamp_date', { mode: 'date' }),\n\ttimestampString: timestamp('timestamp_string', { mode: 'string' }),\n\tdateString: date('date_string', { mode: 'string' }),\n\tdate: date('date', { mode: 'date' }),\n\tinterval: interval('interval'),\n\tpoint: point('point', { mode: 'xy' }),\n\tpointTuple: point('point_tuple', { mode: 'tuple' }),\n\tline: line('line', { mode: 'abc' }),\n\tlineTuple: line('line_tuple', { mode: 'tuple' }),\n\tmoodEnum: moodEnum('mood_enum'),\n\tuuid: uuid('uuid'),\n});\n\nexport const allArrayDataTypes = schema.table('all_array_data_types', {\n\tintegerArray: integer('integer_array').array(),\n\tsmallintArray: smallint('smallint_array').array(),\n\tbigintegerArray: bigint('bigint_array', { mode: 'bigint' }).array(),\n\tbigintNumberArray: bigint('bigint_number_array', { mode: 'number' }).array(),\n\tbooleanArray: boolean('boolean_array').array(),\n\ttextArray: text('text_array').array(),\n\tvarcharArray: varchar('varchar_array', { length: 256 }).array(),\n\tcharArray: char('char_array', { length: 256 }).array(),\n\tnumericArray: numeric('numeric_array').array(),\n\tdecimalArray: decimal('decimal_array').array(),\n\trealArray: real('real_array').array(),\n\tdoublePrecisionArray: doublePrecision('double_precision_array').array(),\n\tjsonArray: json('json_array').array(),\n\tjsonbArray: jsonb('jsonb_array').array(),\n\ttimeArray: time('time_array').array(),\n\ttimestampDateArray: timestamp('timestamp_date_array', { mode: 'date' }).array(),\n\ttimestampStringArray: timestamp('timestamp_string_array', { mode: 'string' }).array(),\n\tdateStringArray: date('date_string_array', { mode: 'string' }).array(),\n\tdateArray: date('date_array', { mode: 'date' }).array(),\n\tintervalArray: interval('interval_array').array(),\n\tpointArray: point('point_array', { mode: 'xy' }).array(),\n\tpointTupleArray: point('point_tuple_array', { mode: 'tuple' }).array(),\n\tlineArray: line('line_array', { mode: 'abc' }).array(),\n\tlineTupleArray: line('line_tuple_array', { mode: 'tuple' }).array(),\n\tmoodEnumArray: moodEnum('mood_enum_array').array(),\n});\n\nexport const ndArrays = schema.table('nd_arrays', {\n\tinteger1DArray: integer('integer_1d_array').array(3),\n\tinteger2DArray: integer('integer_2d_array').array(3).array(4),\n\tinteger3DArray: integer('integer_3d_array').array(3).array(4).array(5),\n\tinteger4DArray: integer('integer_4d_array').array(3).array(4).array(5).array(6),\n});\n\nexport const intervals = schema.table('intervals', {\n\tintervalYear: interval({ fields: 'year' }),\n\tintervalYearToMonth: interval({ fields: 'year to month' }),\n\tintervalMonth: interval({ fields: 'month' }),\n\tintervalDay: interval({ fields: 'day' }),\n\tintervalDayToHour: interval({ fields: 'day to hour' }),\n\tintervalDayToMinute: interval({ fields: 'day to minute' }),\n\tintervalDayToSecond: interval({ fields: 'day to second' }),\n\tintervalHour: interval({ fields: 'hour' }),\n\tintervalHourToMinute: interval({ fields: 'hour to minute' }),\n\tintervalHourToSecond: interval({ fields: 'hour to second' }),\n\tintervalMinute: interval({ fields: 'minute' }),\n\tintervalMinuteToSecond: interval({ fields: 'minute to second' }),\n\tintervalSecond: interval({ fields: 'second' }),\n});\n"
  },
  {
    "path": "drizzle-seed/tests/pg/allDataTypesTest/pg_all_data_types.test.ts",
    "content": "import { PGlite } from '@electric-sql/pglite';\nimport { sql } from 'drizzle-orm';\nimport type { PgliteDatabase } from 'drizzle-orm/pglite';\nimport { drizzle } from 'drizzle-orm/pglite';\nimport { afterAll, beforeAll, expect, test } from 'vitest';\nimport { seed } from '../../../src/index.ts';\nimport * as schema from './pgSchema.ts';\n\nlet client: PGlite;\nlet db: PgliteDatabase;\n\nbeforeAll(async () => {\n\tclient = new PGlite();\n\n\tdb = drizzle(client);\n\n\tawait db.execute(sql`CREATE SCHEMA if not exists \"seeder_lib_pg\";`);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t CREATE TYPE \"seeder_lib_pg\".\"mood_enum\" AS ENUM('sad', 'ok', 'happy');\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"all_data_types\" (\n\t\t\t\t\"integer\" integer,\n\t\t\t\t\"smallint\" smallint,\n\t\t\t\t\"bigint\" bigint,\n\t\t\t\t\"bigint_number\" bigint,\n\t\t\t\t\"serial\" serial,\n\t\t\t\t\"smallserial\" smallserial,\n\t\t\t\t\"bigserial\" bigserial,\n\t\t\t\t\"bigserial_number\" bigserial,\n\t\t\t\t\"boolean\" boolean,\n\t\t\t\t\"text\" text,\n\t\t\t\t\"varchar\" varchar(256),\n\t\t\t\t\"char\" char(256),\n\t\t\t\t\"numeric\" numeric,\n\t\t\t\t\"decimal\" numeric,\n\t\t\t\t\"real\" real,\n\t\t\t\t\"double_precision\" double precision,\n\t\t\t\t\"json\" json,\n\t\t\t\t\"jsonb\" jsonb,\n\t\t\t\t\"time\" time,\n\t\t\t\t\"timestamp_date\" timestamp,\n\t\t\t\t\"timestamp_string\" timestamp,\n\t\t\t\t\"date_string\" date,\n\t\t\t\t\"date\" date,\n\t\t\t\t\"interval\" interval,\n\t\t\t\t\"point\" \"point\",\n\t\t\t\t\"point_tuple\" \"point\",\n\t\t\t\t\"line\" \"line\",\n\t\t\t\t\"line_tuple\" \"line\",\n\t\t\t\t\"mood_enum\" \"seeder_lib_pg\".\"mood_enum\",\n\t\t\t\t\"uuid\" \"uuid\"\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"all_array_data_types\" (\n\t\t\t\t\"integer_array\" integer[],\n\t\t\t\t\"smallint_array\" smallint[],\n\t\t\t\t\"bigint_array\" bigint[],\n\t\t\t\t\"bigint_number_array\" bigint[],\n\t\t\t\t\"boolean_array\" boolean[],\n\t\t\t\t\"text_array\" text[],\n\t\t\t\t\"varchar_array\" varchar(256)[],\n\t\t\t\t\"char_array\" char(256)[],\n\t\t\t\t\"numeric_array\" numeric[],\n\t\t\t\t\"decimal_array\" numeric[],\n\t\t\t\t\"real_array\" real[],\n\t\t\t\t\"double_precision_array\" double precision[],\n\t\t\t\t\"json_array\" json[],\n\t\t\t\t\"jsonb_array\" jsonb[],\n\t\t\t\t\"time_array\" time[],\n\t\t\t\t\"timestamp_date_array\" timestamp[],\n\t\t\t\t\"timestamp_string_array\" timestamp[],\n\t\t\t\t\"date_string_array\" date[],\n\t\t\t\t\"date_array\" date[],\n\t\t\t\t\"interval_array\" interval[],\n\t\t\t\t\"point_array\" \"point\"[],\n\t\t\t\t\"point_tuple_array\" \"point\"[],\n\t\t\t\t\"line_array\" \"line\"[],\n\t\t\t\t\"line_tuple_array\" \"line\"[],\n\t\t\t\t\"mood_enum_array\" \"seeder_lib_pg\".\"mood_enum\"[]\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"nd_arrays\" (\n\t\t\t\t\"integer_1d_array\" integer[3],\n\t\t\t\t\"integer_2d_array\" integer[3][4],\n\t\t\t\t\"integer_3d_array\" integer[3][4][5],\n\t\t\t\t\"integer_4d_array\" integer[3][4][5][6]\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"intervals\" (\n\t\t\t\t\"intervalYear\" interval year,\n\t\t\t\t\"intervalYearToMonth\" interval year to month,\n\t\t\t\t\"intervalMonth\" interval month,\n\t\t\t\t\"intervalDay\" interval day,\n\t\t\t\t\"intervalDayToHour\" interval day to hour,\n\t\t\t\t\"intervalDayToMinute\" interval day to minute,\n\t\t\t\t\"intervalDayToSecond\" interval day to second,\n\t\t\t\t\"intervalHour\" interval hour,\n\t\t\t\t\"intervalHourToMinute\" interval hour to minute,\n\t\t\t\t\"intervalHourToSecond\" interval hour to second,\n\t\t\t\t\"intervalMinute\" interval minute,\n\t\t\t\t\"intervalMinuteToSecond\" interval minute to second,\n\t\t\t\t\"intervalSecond\" interval second\n\t\t\t);\n\t\t`,\n\t);\n});\n\nafterAll(async () => {\n\tawait client.close();\n});\n\ntest('all data types test', async () => {\n\tawait seed(db, { allDataTypes: schema.allDataTypes }, { count: 10000 });\n\n\tconst allDataTypes = await db.select().from(schema.allDataTypes);\n\t// every value in each rows does not equal undefined.\n\tconst predicate = allDataTypes.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\n\texpect(predicate).toBe(true);\n});\n\ntest('all array data types test', async () => {\n\tawait seed(db, { allArrayDataTypes: schema.allArrayDataTypes }, { count: 1000 });\n\n\tconst allArrayDataTypes = await db.select().from(schema.allArrayDataTypes);\n\t// every value in each rows does not equal undefined.\n\tconst predicate = allArrayDataTypes.every((row) =>\n\t\tObject.values(row).every((val) => val !== undefined && val !== null && val.length === 10)\n\t);\n\n\texpect(predicate).toBe(true);\n});\n\ntest('nd arrays', async () => {\n\tawait seed(db, { ndArrays: schema.ndArrays }, { count: 1000 });\n\n\tconst ndArrays = await db.select().from(schema.ndArrays);\n\t// every value in each rows does not equal undefined.\n\tconst predicate0 = ndArrays.every((row) =>\n\t\tObject.values(row).every((val) => val !== undefined && val !== null && val.length !== 0)\n\t);\n\tlet predicate1 = true, predicate2 = true, predicate3 = true, predicate4 = true;\n\n\tfor (const row of ndArrays) {\n\t\tpredicate1 = predicate1 && (row.integer1DArray?.length === 3);\n\n\t\tpredicate2 = predicate2 && (row.integer2DArray?.length === 4) && (row.integer2DArray[0]?.length === 3);\n\n\t\tpredicate3 = predicate3 && (row.integer3DArray?.length === 5) && (row.integer3DArray[0]?.length === 4)\n\t\t\t&& (row.integer3DArray[0][0]?.length === 3);\n\n\t\tpredicate4 = predicate4 && (row.integer4DArray?.length === 6) && (row.integer4DArray[0]?.length === 5)\n\t\t\t&& (row.integer4DArray[0][0]?.length === 4) && (row.integer4DArray[0][0][0]?.length === 3);\n\t}\n\n\texpect(predicate0 && predicate1 && predicate2 && predicate3 && predicate4).toBe(true);\n});\n\ntest('intervals test', async () => {\n\tawait seed(db, { intervals: schema.intervals }, { count: 1000 });\n\n\tconst intervals = await db.select().from(schema.intervals);\n\t// every value in each rows does not equal undefined.\n\tconst predicate = intervals.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\n\texpect(predicate).toBe(true);\n});\n"
  },
  {
    "path": "drizzle-seed/tests/pg/cyclicTables/cyclicTables.test.ts",
    "content": "import { PGlite } from '@electric-sql/pglite';\nimport { sql } from 'drizzle-orm';\nimport type { PgliteDatabase } from 'drizzle-orm/pglite';\nimport { drizzle } from 'drizzle-orm/pglite';\nimport { afterAll, afterEach, beforeAll, expect, test } from 'vitest';\nimport { reset, seed } from '../../../src/index.ts';\nimport * as schema from './pgSchema.ts';\n\nlet client: PGlite;\nlet db: PgliteDatabase;\n\nbeforeAll(async () => {\n\tclient = new PGlite();\n\n\tdb = drizzle(client);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table model_image\n\t\t\t(\n\t\t\t    id        serial\n\t\t\t        primary key,\n\t\t\t    url       varchar not null,\n\t\t\t    caption   varchar,\n\t\t\t    \"modelId\" integer not null\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table model\n\t\t\t      (\n\t\t\t          id               serial\n\t\t\t              primary key,\n\t\t\t          name             varchar not null,\n\t\t\t          \"defaultImageId\" integer\n\t\t\t              constraint \"model_defaultImageId_model_image_id_fk\"\n\t\t\t                  references model_image\n\t\t\t      );\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\talter table model_image\n\t\t\t\t\t\t    add constraint \"model_image_modelId_model_id_fk\"\n\t\t\t\t\t\t        foreign key (\"modelId\") references model;\n\t\t`,\n\t);\n\n\t// 3 tables case\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table model_image1\n\t\t\t(\n\t\t\t    id        serial\n\t\t\t        primary key,\n\t\t\t    url       varchar not null,\n\t\t\t    caption   varchar,\n\t\t\t    \"modelId\" integer not null\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table \"user\"\n\t\t\t(\n\t\t\t    id          serial\n\t\t\t        primary key,\n\t\t\t    name        text,\n\t\t\t    \"invitedBy\" integer\n\t\t\t        constraint \"user_invitedBy_user_id_fk\"\n\t\t\t            references \"user\",\n\t\t\t    \"imageId\"   integer not null\n\t\t\t        constraint \"user_imageId_model_image1_id_fk\"\n\t\t\t            references model_image1\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table model1\n\t\t\t(\n\t\t\t    id               serial\n\t\t\t        primary key,\n\t\t\t    name             varchar not null,\n\t\t\t    \"userId\"         integer\n\t\t\t        constraint \"model1_userId_user_id_fk\"\n\t\t\t            references \"user\",\n\t\t\t    \"defaultImageId\" integer\n\t\t\t        constraint \"model1_defaultImageId_model_image1_id_fk\"\n\t\t\t            references model_image1\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\talter table model_image1\n\t\t\t add constraint \"model_image1_modelId_model1_id_fk\"\n\t\t\t     foreign key (\"modelId\") references model1;\n\t\t`,\n\t);\n});\n\nafterEach(async () => {\n\tawait reset(db, schema);\n});\n\nafterAll(async () => {\n\tawait client.close();\n});\n\ntest('2 cyclic tables test', async () => {\n\tawait seed(db, {\n\t\tmodelTable: schema.modelTable,\n\t\tmodelImageTable: schema.modelImageTable,\n\t});\n\n\tconst modelTable = await db.select().from(schema.modelTable);\n\tconst modelImageTable = await db.select().from(schema.modelImageTable);\n\n\texpect(modelTable.length).toBe(10);\n\tlet predicate = modelTable.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\texpect(modelImageTable.length).toBe(10);\n\tpredicate = modelImageTable.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('3 cyclic tables test', async () => {\n\tawait seed(db, {\n\t\tmodelTable1: schema.modelTable1,\n\t\tmodelImageTable1: schema.modelImageTable1,\n\t\tuser: schema.user,\n\t});\n\n\tconst modelTable1 = await db.select().from(schema.modelTable1);\n\tconst modelImageTable1 = await db.select().from(schema.modelImageTable1);\n\tconst user = await db.select().from(schema.user);\n\n\texpect(modelTable1.length).toBe(10);\n\tlet predicate = modelTable1.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\texpect(modelImageTable1.length).toBe(10);\n\tpredicate = modelImageTable1.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\texpect(user.length).toBe(10);\n\tpredicate = user.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n"
  },
  {
    "path": "drizzle-seed/tests/pg/cyclicTables/pgSchema.ts",
    "content": "import { relations } from 'drizzle-orm';\nimport type { AnyPgColumn } from 'drizzle-orm/pg-core';\nimport { foreignKey, integer, pgTable, serial, text, varchar } from 'drizzle-orm/pg-core';\n\n// MODEL\nexport const modelTable = pgTable(\n\t'model',\n\t{\n\t\tid: serial().primaryKey(),\n\t\tname: varchar().notNull(),\n\t\tdefaultImageId: integer(),\n\t},\n\t(t) => [\n\t\tforeignKey({\n\t\t\tcolumns: [t.defaultImageId],\n\t\t\tforeignColumns: [modelImageTable.id],\n\t\t}),\n\t],\n);\n\nexport const modelRelations = relations(modelTable, ({ one, many }) => ({\n\timages: many(modelImageTable),\n\tdefaultImage: one(modelImageTable, {\n\t\tfields: [modelTable.defaultImageId],\n\t\treferences: [modelImageTable.id],\n\t}),\n}));\n\n// MODEL IMAGE\nexport const modelImageTable = pgTable(\n\t'model_image',\n\t{\n\t\tid: serial().primaryKey(),\n\t\turl: varchar().notNull(),\n\t\tcaption: varchar(),\n\t\tmodelId: integer()\n\t\t\t.notNull()\n\t\t\t.references((): AnyPgColumn => modelTable.id),\n\t},\n);\n\nexport const modelImageRelations = relations(modelImageTable, ({ one }) => ({\n\tmodel: one(modelTable, {\n\t\tfields: [modelImageTable.modelId],\n\t\treferences: [modelTable.id],\n\t}),\n}));\n\n// 3 tables case\nexport const modelTable1 = pgTable(\n\t'model1',\n\t{\n\t\tid: serial().primaryKey(),\n\t\tname: varchar().notNull(),\n\t\tuserId: integer()\n\t\t\t.references(() => user.id),\n\t\tdefaultImageId: integer(),\n\t},\n\t(t) => [\n\t\tforeignKey({\n\t\t\tcolumns: [t.defaultImageId],\n\t\t\tforeignColumns: [modelImageTable1.id],\n\t\t}),\n\t],\n);\n\nexport const modelImageTable1 = pgTable(\n\t'model_image1',\n\t{\n\t\tid: serial().primaryKey(),\n\t\turl: varchar().notNull(),\n\t\tcaption: varchar(),\n\t\tmodelId: integer().notNull()\n\t\t\t.references((): AnyPgColumn => modelTable1.id),\n\t},\n);\n\nexport const user = pgTable(\n\t'user',\n\t{\n\t\tid: serial().primaryKey(),\n\t\tname: text(),\n\t\tinvitedBy: integer().references((): AnyPgColumn => user.id),\n\t\timageId: integer()\n\t\t\t.notNull()\n\t\t\t.references((): AnyPgColumn => modelImageTable1.id),\n\t},\n);\n"
  },
  {
    "path": "drizzle-seed/tests/pg/generatorsTest/generators.test.ts",
    "content": "import { afterAll, beforeAll, expect, test } from 'vitest';\n\nimport { PGlite } from '@electric-sql/pglite';\nimport type { PgliteDatabase } from 'drizzle-orm/pglite';\nimport { drizzle } from 'drizzle-orm/pglite';\n\nimport { reset, seed } from '../../../src/index.ts';\nimport * as schema from './pgSchema.ts';\n\nimport { sql } from 'drizzle-orm';\nimport cities from '../../../src/datasets/cityNames.ts';\nimport countries from '../../../src/datasets/countries.ts';\nimport firstNames from '../../../src/datasets/firstNames.ts';\nimport lastNames from '../../../src/datasets/lastNames.ts';\n\nlet client: PGlite;\nlet db: PgliteDatabase;\n\nbeforeAll(async () => {\n\tclient = new PGlite();\n\n\tdb = drizzle(client);\n\n\tawait db.execute(sql`CREATE SCHEMA \"seeder_lib_pg\";`);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t CREATE TYPE \"seeder_lib_pg\".\"enum\" AS ENUM('sad', 'ok', 'happy');\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;  \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"default_table\" (\n\t\t\t\t\"default_string\" text\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"default_array_table\" (\n\t\t\t\t\"default_string\" text[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"boolean_table\" (\n\t\t\t\t\"boolean\" boolean\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"boolean_array_table\" (\n\t\t\t\t\"boolean\" boolean[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"city_table\" (\n\t\t\t\t\"city\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"city_unique_table\" (\n\t\t\t\t\"city_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"city_unique_table_city_unique_unique\" UNIQUE(\"city_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"city_array_table\" (\n\t\t\t\t\"city\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"company_name_table\" (\n\t\t\t\t\"company_name\" text\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"company_name_unique_table\" (\n\t\t\t\t\"company_name_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"company_name_unique_table_company_name_unique_unique\" UNIQUE(\"company_name_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"company_name_array_table\" (\n\t\t\t\t\"company_name\" text[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"country_table\" (\n\t\t\t\t\"country\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"country_unique_table\" (\n\t\t\t\t\"country_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"country_unique_table_country_unique_unique\" UNIQUE(\"country_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"country_array_table\" (\n\t\t\t\t\"country\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"date_table\" (\n\t\t\t\t\"date\" date\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"date_array_table\" (\n\t\t\t\t\"date\" date[],\n\t\t\t\t\"date_string\" date[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"email_table\" (\n\t\t\t\t\"email\" varchar(256),\n\t\t\t\tCONSTRAINT \"email_table_email_unique\" UNIQUE(\"email\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"email_array_table\" (\n\t\t\t\t\"email\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"enum_table\" (\n\t\t\t\t\"mood_enum\" \"seeder_lib_pg\".\"enum\"\n\t\t\t);  \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"first_name_table\" (\n\t\t\t\t\"first_name\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"first_name_unique_table\" (\n\t\t\t\t\"first_name_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"first_name_unique_table_first_name_unique_unique\" UNIQUE(\"first_name_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"first_name_array_table\" (\n\t\t\t\t\"first_name\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"full_name__table\" (\n\t\t\t\t\"full_name_\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"full_name_unique_table\" (\n\t\t\t\t\"full_name_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"full_name_unique_table_full_name_unique_unique\" UNIQUE(\"full_name_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"full_name_array_table\" (\n\t\t\t\t\"full_name\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"int_primary_key_table\" (\n\t\t\t\t\"int_primary_key\" integer,\n\t\t\t\tCONSTRAINT \"int_primary_key_table_int_primary_key_unique\" UNIQUE(\"int_primary_key\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"int_table\" (\n\t\t\t\t\"int\" integer\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"int_unique_table\" (\n\t\t\t\t\"int_unique\" integer,\n\t\t\t\tCONSTRAINT \"int_unique_table_int_unique_unique\" UNIQUE(\"int_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"int_array_table\" (\n\t\t\t\t\"int\" integer[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"interval_table\" (\n\t\t\t\t\"interval\" interval\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"interval_unique_table\" (\n\t\t\t\t\"interval_unique\" interval,\n\t\t\t\tCONSTRAINT \"interval_unique_table_interval_unique_unique\" UNIQUE(\"interval_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"interval_array_table\" (\n\t\t\t\t\"interval\" interval[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"job_Title_table\" (\n\t\t\t\t\"job_title\" text\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"job_title_array_table\" (\n\t\t\t\t\"job_title\" text[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"json_table\" (\n\t\t\t\t\"json\" json\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"json_array_table\" (\n\t\t\t\t\"json\" json[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"last_name_table\" (\n\t\t\t\t\"last_name\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"last_name_unique_table\" (\n\t\t\t\t\"last_name_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"last_name_unique_table_last_name_unique_unique\" UNIQUE(\"last_name_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"last_name_array_table\" (\n\t\t\t\t\"last_name\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"line_table\" (\n\t\t\t\t\"line\" \"line\"\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"line_array_table\" (\n\t\t\t\t\"line\" \"line\"[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"lorem_ipsum_table\" (\n\t\t\t\t\"lorem_ipsum\" text\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"lorem_ipsum_array_table\" (\n\t\t\t\t\"lorem_ipsum\" text[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"number_table\" (\n\t\t\t\t\"number\" real\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"number_unique_table\" (\n\t\t\t\t\"number_unique\" real,\n\t\t\t\tCONSTRAINT \"number_unique_table_number_unique_unique\" UNIQUE(\"number_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"number_array_table\" (\n\t\t\t\t\"number\" real[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"phone_number_table\" (\n\t\t\t\t\"phoneNumber\" varchar(256),\n\t\t\t\t\"phone_number_template\" varchar(256),\n\t\t\t\t\"phone_number_prefixes\" varchar(256),\n\t\t\t\tCONSTRAINT \"phone_number_table_phoneNumber_unique\" UNIQUE(\"phoneNumber\"),\n\t\t\t\tCONSTRAINT \"phone_number_table_phone_number_template_unique\" UNIQUE(\"phone_number_template\"),\n\t\t\t\tCONSTRAINT \"phone_number_table_phone_number_prefixes_unique\" UNIQUE(\"phone_number_prefixes\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"phone_number_array_table\" (\n\t\t\t\t\"phoneNumber\" varchar(256)[],\n\t\t\t\t\"phone_number_template\" varchar(256)[],\n\t\t\t\t\"phone_number_prefixes\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"point_table\" (\n\t\t\t\t\"point\" \"point\"\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"point_array_table\" (\n\t\t\t\t\"point\" \"point\"[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"postcode_table\" (\n\t\t\t\t\"postcode\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"postcode_unique_table\" (\n\t\t\t\t\"postcode_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"postcode_unique_table_postcode_unique_unique\" UNIQUE(\"postcode_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"postcode_array_table\" (\n\t\t\t\t\"postcode\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"state_table\" (\n\t\t\t\t\"state\" text\n\t\t\t);   \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"state_array_table\" (\n\t\t\t\t\"state\" text[]\n\t\t\t);   \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"street_address_table\" (\n\t\t\t\t\"street_address\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"street_address_unique_table\" (\n\t\t\t\t\"street_address_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"street_address_unique_table_street_address_unique_unique\" UNIQUE(\"street_address_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"street_address_array_table\" (\n\t\t\t\t\"street_address\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"string_table\" (\n\t\t\t\t\"string\" text\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"string_unique_table\" (\n\t\t\t\t\"string_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"string_unique_table_string_unique_unique\" UNIQUE(\"string_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"string_array_table\" (\n\t\t\t\t\"string\" text[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"time_table\" (\n\t\t\t\t\"time\" time\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"time_array_table\" (\n\t\t\t\t\"time\" time[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"timestamp_table\" (\n\t\t\t\t\"timestamp\" timestamp\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"timestamp_array_table\" (\n\t\t\t\t\"timestamp\" timestamp[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"values_from_array_table\" (\n\t\t\t\t\"values_from_array_not_null\" varchar(256) NOT NULL,\n\t\t\t\t\"values_from_array_weighted_not_null\" varchar(256) NOT NULL\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"values_from_array_unique_table\" (\n\t\t\t\t\"values_from_array\" varchar(256),\n\t\t\t\t\"values_from_array_not_null\" varchar(256) NOT NULL,\n\t\t\t\t\"values_from_array_weighted\" varchar(256),\n\t\t\t\t\"values_from_array_weighted_not_null\" varchar(256) NOT NULL,\n\t\t\t\tCONSTRAINT \"values_from_array_unique_table_values_from_array_unique\" UNIQUE(\"values_from_array\"),\n\t\t\t\tCONSTRAINT \"values_from_array_unique_table_values_from_array_not_null_unique\" UNIQUE(\"values_from_array_not_null\"),\n\t\t\t\tCONSTRAINT \"values_from_array_unique_table_values_from_array_weighted_unique\" UNIQUE(\"values_from_array_weighted\"),\n\t\t\t\tCONSTRAINT \"values_from_array_unique_table_values_from_array_weighted_not_null_unique\" UNIQUE(\"values_from_array_weighted_not_null\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"values_from_array_array_table\" (\n\t\t\t\t\"values_from_array\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"weighted_random_table\" (\n\t\t\t\t\"weighted_random\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"weighted_random_with_unique_gens_table\" (\n\t\t\t\t\"weighted_random_with_unique_gens\" varchar(256),\n\t\t\t\tCONSTRAINT \"weighted_random_with_unique_gens_table_weighted_random_with_unique_gens_unique\" UNIQUE(\"weighted_random_with_unique_gens\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"uuid_table\" (\n\t\t\t\t\"uuid\" uuid\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"uuid_array_table\" (\n\t\t\t\t\"uuid\" uuid[]\n\t\t\t);    \n\t\t`,\n\t);\n});\n\nafterAll(async () => {\n\tawait client.close();\n});\n\nconst count = 1000;\n\ntest('enum generator test', async () => {\n\tawait seed(db, { enumTable: schema.enumTable }).refine(() => ({\n\t\tenumTable: {\n\t\t\tcount,\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.enumTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('default generator test', async () => {\n\tawait seed(db, { defaultTable: schema.defaultTable }).refine((funcs) => ({\n\t\tdefaultTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tdefaultString: funcs.default({ defaultValue: 'default string' }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.defaultTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('default array generator test', async () => {\n\tawait seed(db, { defaultTable: schema.defaultArrayTable }).refine((funcs) => ({\n\t\tdefaultTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tdefaultString: funcs.default({ defaultValue: 'default string', arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.defaultArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('valuesFromArray generator test', async () => {\n\tawait seed(db, { valuesFromArrayTable: schema.valuesFromArrayTable }).refine((funcs) => ({\n\t\tvaluesFromArrayTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tvaluesFromArrayNotNull: funcs.valuesFromArray({ values: lastNames }),\n\t\t\t\tvaluesFromArrayWeightedNotNull: funcs.valuesFromArray({\n\t\t\t\t\tvalues: [\n\t\t\t\t\t\t{ values: lastNames, weight: 0.3 },\n\t\t\t\t\t\t{ values: firstNames, weight: 0.7 },\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.valuesFromArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('valuesFromArray unique generator test', async () => {\n\t// valuesFromArrayUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { valuesFromArrayUniqueTable: schema.valuesFromArrayUniqueTable }, { seed: 1 }).refine((funcs) => ({\n\t\tvaluesFromArrayUniqueTable: {\n\t\t\tcount: 49998,\n\t\t\tcolumns: {\n\t\t\t\tvaluesFromArray: funcs.valuesFromArray({ values: lastNames.slice(0, 20), isUnique: true }),\n\t\t\t\tvaluesFromArrayNotNull: funcs.valuesFromArray({ values: lastNames, isUnique: true }),\n\t\t\t\tvaluesFromArrayWeighted: funcs.valuesFromArray({\n\t\t\t\t\tvalues: [\n\t\t\t\t\t\t{ values: lastNames.slice(0, 20000), weight: 0.3 },\n\t\t\t\t\t\t{ values: lastNames.slice(20000), weight: 0.7 },\n\t\t\t\t\t],\n\t\t\t\t\tisUnique: true,\n\t\t\t\t}),\n\t\t\t\tvaluesFromArrayWeightedNotNull: funcs.valuesFromArray({\n\t\t\t\t\tvalues: [\n\t\t\t\t\t\t{ values: lastNames.slice(0, 14920), weight: 0.3 },\n\t\t\t\t\t\t{ values: lastNames.slice(14920), weight: 0.7 },\n\t\t\t\t\t],\n\t\t\t\t\tisUnique: true,\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.valuesFromArrayUniqueTable);\n\t// console.log(valuesFromArrayUniqueTableData);\n\tconst predicate = data.length !== 0 && data.every((row) =>\n\t\trow['valuesFromArrayWeightedNotNull'] !== null\n\t\t&& row['valuesFromArrayNotNull'] !== null\n\t);\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { valuesFromArrayUniqueTable: schema.valuesFromArrayUniqueTable }).refine((funcs) => ({\n\t\t\tvaluesFromArrayUniqueTable: {\n\t\t\t\tcount: 49998,\n\t\t\t\tcolumns: {\n\t\t\t\t\tvaluesFromArrayWeightedNotNull: funcs.valuesFromArray({\n\t\t\t\t\t\tvalues: [\n\t\t\t\t\t\t\t{ values: lastNames.slice(0, 20000), weight: 0.3 },\n\t\t\t\t\t\t\t{ values: lastNames.slice(20000), weight: 0.7 },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tisUnique: true,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow(\n\t\t/^weighted values arrays is too small to generate values with specified probability for unique not null column\\..+/,\n\t);\n\n\tawait expect(\n\t\tseed(db, { valuesFromArrayUniqueTable: schema.valuesFromArrayUniqueTable }).refine((funcs) => ({\n\t\t\tvaluesFromArrayUniqueTable: {\n\t\t\t\tcount: 49998,\n\t\t\t\tcolumns: {\n\t\t\t\t\tvaluesFromArrayNotNull: funcs.valuesFromArray({\n\t\t\t\t\t\tvalues: lastNames.slice(20),\n\t\t\t\t\t\tisUnique: true,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('There are no enough values to fill unique column.');\n\n\tawait expect(\n\t\tseed(db, { valuesFromArrayUniqueTable: schema.valuesFromArrayUniqueTable }, { seed: 1 }).refine((funcs) => ({\n\t\t\tvaluesFromArrayUniqueTable: {\n\t\t\t\tcount: 49999,\n\t\t\t\tcolumns: {\n\t\t\t\t\tvaluesFromArrayNotNull: funcs.valuesFromArray({\n\t\t\t\t\t\tvalues: lastNames,\n\t\t\t\t\t\tisUnique: true,\n\t\t\t\t\t}),\n\t\t\t\t\tvaluesFromArrayWeightedNotNull: funcs.valuesFromArray({\n\t\t\t\t\t\tvalues: [\n\t\t\t\t\t\t\t{ values: lastNames.slice(0, 14854), weight: 0.3 },\n\t\t\t\t\t\t\t{ values: lastNames.slice(14854), weight: 0.7 },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tisUnique: true,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('There are no enough values to fill unique column.');\n});\n\ntest('valuesFromArray array generator test', async () => {\n\tawait seed(db, { valuesFromArrayTable: schema.valuesFromArrayArrayTable }).refine((funcs) => ({\n\t\tvaluesFromArrayTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tvaluesFromArray: funcs.valuesFromArray({ values: lastNames, arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.valuesFromArrayArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('intPrimaryKey generator test', async () => {\n\tawait seed(db, { intPrimaryKeyTable: schema.intPrimaryKeyTable }).refine((funcs) => ({\n\t\tintPrimaryKeyTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tintPrimaryKey: funcs.intPrimaryKey(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intPrimaryKeyTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('number generator test', async () => {\n\tawait seed(db, { numberTable: schema.numberTable }).refine((funcs) => ({\n\t\tnumberTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tnumber: funcs.number(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.numberTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('number unique generator test', async () => {\n\t// numberUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { numberUniqueTable: schema.numberUniqueTable }).refine((funcs) => ({\n\t\tnumberUniqueTable: {\n\t\t\tcount: 20070,\n\t\t\tcolumns: {\n\t\t\t\tnumberUnique: funcs.number({ isUnique: true, minValue: -100.23, maxValue: 100.46 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.numberUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) =>\n\t\t\tObject.values(row).every((val) => val !== undefined && val !== null && val >= -100.23 && val <= 100.46)\n\t\t);\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { numberUniqueTable: schema.numberUniqueTable }).refine((funcs) => ({\n\t\t\tnumberUniqueTable: {\n\t\t\t\tcount: 20071,\n\t\t\t\tcolumns: {\n\t\t\t\t\tnumberUnique: funcs.number({ isUnique: true, minValue: -100.23, maxValue: 100.46 }),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique integers in given range(min, max), try to make range wider.');\n});\n\ntest('number array generator test', async () => {\n\tawait seed(db, { numberTable: schema.numberArrayTable }).refine((funcs) => ({\n\t\tnumberTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tnumber: funcs.number({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.numberArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('int generator test', async () => {\n\tawait seed(db, { intTable: schema.intTable }).refine((funcs) => ({\n\t\tintTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tint: funcs.int(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('int unique generator test', async () => {\n\t// intUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { intUniqueTable: schema.intUniqueTable }).refine((funcs) => ({\n\t\tintUniqueTable: {\n\t\t\tcount: 201,\n\t\t\tcolumns: {\n\t\t\t\tintUnique: funcs.int({ isUnique: true, minValue: -100, maxValue: 100 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { intUniqueTable: schema.intUniqueTable }).refine((funcs) => ({\n\t\t\tintUniqueTable: {\n\t\t\t\tcount: 202,\n\t\t\t\tcolumns: {\n\t\t\t\t\tintUnique: funcs.int({ isUnique: true, minValue: -100, maxValue: 100 }),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique integers in given range(min, max), try to make range wider.');\n});\n\ntest('int array generator test', async () => {\n\tawait seed(db, { intTable: schema.intArrayTable }).refine((funcs) => ({\n\t\tintTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tint: funcs.int({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('boolean generator test', async () => {\n\tawait seed(db, { booleanTable: schema.booleanTable }).refine((funcs) => ({\n\t\tbooleanTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tboolean: funcs.boolean(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.booleanTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('boolean array generator test', async () => {\n\tawait seed(db, { booleanTable: schema.booleanArrayTable }).refine((funcs) => ({\n\t\tbooleanTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tboolean: funcs.boolean({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.booleanArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('date generator test', async () => {\n\tawait seed(db, { dateTable: schema.dateTable }).refine((funcs) => ({\n\t\tdateTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tdate: funcs.date(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.dateTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('date array generator test', async () => {\n\tawait seed(db, { dateTable: schema.dateArrayTable }).refine((funcs) => ({\n\t\tdateTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tdate: funcs.date({ arraySize: 3 }),\n\t\t\t\tdateString: funcs.date({ arraySize: 4 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.dateArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) =>\n\t\t\tObject.values(row).every((val) => val !== undefined && val !== null && [3, 4].includes(val.length))\n\t\t);\n\texpect(predicate).toBe(true);\n});\n\ntest('time generator test', async () => {\n\tawait seed(db, { timeTable: schema.timeTable }).refine((funcs) => ({\n\t\ttimeTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\ttime: funcs.time(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.timeTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('time array generator test', async () => {\n\tawait seed(db, { timeTable: schema.timeArrayTable }).refine((funcs) => ({\n\t\ttimeTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\ttime: funcs.time({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.timeArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('timestamp generator test', async () => {\n\tawait seed(db, { timestampTable: schema.timestampTable }).refine((funcs) => ({\n\t\ttimestampTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\ttimestamp: funcs.timestamp(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.timestampTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('timestamp array generator test', async () => {\n\tawait seed(db, { timestampTable: schema.timestampArrayTable }).refine((funcs) => ({\n\t\ttimestampTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\ttimestamp: funcs.timestamp({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.timestampArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('json generator test', async () => {\n\tawait seed(db, { jsonTable: schema.jsonTable }).refine((funcs) => ({\n\t\tjsonTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tjson: funcs.json(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.jsonTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('json array generator test', async () => {\n\tawait seed(db, { jsonTable: schema.jsonArrayTable }).refine((funcs) => ({\n\t\tjsonTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tjson: funcs.json({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.jsonArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('interval generator test', async () => {\n\tawait seed(db, { intervalTable: schema.intervalTable }).refine((funcs) => ({\n\t\tintervalTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tinterval: funcs.interval(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intervalTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('interval unique generator test', async () => {\n\t// intervalUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { intervalUniqueTable: schema.intervalUniqueTable }).refine((funcs) => ({\n\t\tintervalUniqueTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tintervalUnique: funcs.interval({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intervalUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('interval array generator test', async () => {\n\tawait seed(db, { intervalTable: schema.intervalArrayTable }).refine((funcs) => ({\n\t\tintervalTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tinterval: funcs.interval({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intervalArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('string generator test', async () => {\n\tawait seed(db, { stringTable: schema.stringTable }).refine((funcs) => ({\n\t\tstringTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstring: funcs.string(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.stringTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('string unique generator test', async () => {\n\tawait seed(db, { stringUniqueTable: schema.stringUniqueTable }).refine((funcs) => ({\n\t\tstringUniqueTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstringUnique: funcs.string({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.stringUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('string array generator test', async () => {\n\tawait seed(db, { stringTable: schema.stringArrayTable }).refine((funcs) => ({\n\t\tstringTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstring: funcs.string({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.stringArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('email generator test', async () => {\n\tawait seed(db, { emailTable: schema.emailTable }).refine((funcs) => ({\n\t\temailTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\temail: funcs.email(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.emailTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('email array generator test', async () => {\n\tawait seed(db, { emailTable: schema.emailArrayTable }).refine((funcs) => ({\n\t\temailTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\temail: funcs.email({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.emailArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('firstName generator test', async () => {\n\tawait seed(db, { firstNameTable: schema.firstNameTable }).refine((funcs) => ({\n\t\tfirstNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tfirstName: funcs.firstName(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.firstNameTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('firstName unique generator test', async () => {\n\t// firstNameUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { firstNameUniqueTable: schema.firstNameUniqueTable }).refine((funcs) => ({\n\t\tfirstNameUniqueTable: {\n\t\t\tcount: 30274,\n\t\t\tcolumns: {\n\t\t\t\tfirstNameUnique: funcs.firstName({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.firstNameUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { firstNameUniqueTable: schema.firstNameUniqueTable }, { count: 30275 }).refine((funcs) => ({\n\t\t\tfirstNameUniqueTable: {\n\t\t\t\tcount: 30275,\n\t\t\t\tcolumns: {\n\t\t\t\t\tfirstNameUnique: funcs.firstName({ isUnique: true }),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique first names.');\n});\n\ntest('firstName array generator test', async () => {\n\tawait seed(db, { firstNameTable: schema.firstNameArrayTable }).refine((funcs) => ({\n\t\tfirstNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tfirstName: funcs.firstName({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.firstNameArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('lastName generator test', async () => {\n\tawait seed(db, { lastNameTable: schema.lastNameTable }).refine((funcs) => ({\n\t\tlastNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tlastName: funcs.lastName(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.lastNameTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('lastName unique generator test', async () => {\n\t// lastNameUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { lastNameUniqueTable: schema.lastNameUniqueTable }).refine((funcs) => ({\n\t\tlastNameUniqueTable: {\n\t\t\tcount: 49998,\n\t\t\tcolumns: {\n\t\t\t\tlastNameUnique: funcs.lastName({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.lastNameUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { lastNameUniqueTable: schema.lastNameUniqueTable }).refine((funcs) => ({\n\t\t\tlastNameUniqueTable: {\n\t\t\t\tcount: 49999,\n\t\t\t\tcolumns: {\n\t\t\t\t\tlastNameUnique: funcs.lastName({ isUnique: true }),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique last names.');\n});\n\ntest('lastName array generator test', async () => {\n\tawait seed(db, { lastNameTable: schema.lastNameArrayTable }).refine((funcs) => ({\n\t\tlastNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tlastName: funcs.lastName({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.lastNameArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('fullName generator test', async () => {\n\tawait seed(db, { fullNameTable: schema.fullNameTable }).refine((funcs) => ({\n\t\tfullNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tfullName: funcs.fullName(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.fullNameTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('fullName unique generator test', async () => {\n\t// fullNameUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { fullNameUniqueTable: schema.fullNameUniqueTable }).refine((funcs) => ({\n\t\tfullNameUniqueTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tfullNameUnique: funcs.fullName({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.fullNameUniqueTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('fullName array generator test', async () => {\n\tawait seed(db, { fullNameTable: schema.fullNameArrayTable }).refine((funcs) => ({\n\t\tfullNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tfullName: funcs.fullName({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.fullNameArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('country generator test', async () => {\n\tawait seed(db, { countryTable: schema.countryTable }).refine((funcs) => ({\n\t\tcountryTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcountry: funcs.country(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.countryTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('country unique generator test', async () => {\n\t// countryUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { countryUniqueTable: schema.countryUniqueTable }).refine((funcs) => ({\n\t\tcountryUniqueTable: {\n\t\t\tcount: countries.length,\n\t\t\tcolumns: {\n\t\t\t\tcountryUnique: funcs.country({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.countryUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { countryUniqueTable: schema.countryUniqueTable }).refine((funcs) => ({\n\t\t\tcountryUniqueTable: {\n\t\t\t\tcount: countries.length + 1,\n\t\t\t\tcolumns: {\n\t\t\t\t\tcountryUnique: funcs.country({ isUnique: true }),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique countries.');\n});\n\ntest('country array generator test', async () => {\n\tawait seed(db, { countryTable: schema.countryArrayTable }).refine((funcs) => ({\n\t\tcountryTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcountry: funcs.country({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.countryArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('city generator test', async () => {\n\tawait seed(db, { cityTable: schema.cityTable }).refine((funcs) => ({\n\t\tcityTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcity: funcs.city(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.cityTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('city unique generator test', async () => {\n\t// cityUniqueTable-----------------------------------------------------------------------------------\n\tawait reset(db, { cityUniqueTable: schema.cityUniqueTable });\n\tawait seed(db, { cityUniqueTable: schema.cityUniqueTable }).refine((funcs) => ({\n\t\tcityUniqueTable: {\n\t\t\tcount: cities.length,\n\t\t\tcolumns: {\n\t\t\t\tcityUnique: funcs.city({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.cityUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { cityUniqueTable: schema.cityUniqueTable }).refine((funcs) => ({\n\t\t\tcityUniqueTable: {\n\t\t\t\tcount: cities.length + 1,\n\t\t\t\tcolumns: {\n\t\t\t\t\tcityUnique: funcs.city({ isUnique: true }),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique cities.');\n});\n\ntest('city array generator test', async () => {\n\tawait seed(db, { cityTable: schema.cityArrayTable }).refine((funcs) => ({\n\t\tcityTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcity: funcs.city({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.cityArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('streetAddress generator test', async () => {\n\tawait seed(db, { streetAddressTable: schema.streetAddressTable }).refine((funcs) => ({\n\t\tstreetAddressTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstreetAddress: funcs.streetAddress(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.streetAddressTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('streetAddress unique generator test', async () => {\n\tawait seed(db, { streetAddressUniqueTable: schema.streetAddressUniqueTable }).refine((funcs) => ({\n\t\tstreetAddressUniqueTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstreetAddressUnique: funcs.streetAddress({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.streetAddressUniqueTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('streetAddress array generator test', async () => {\n\tawait seed(db, { streetAddressTable: schema.streetAddressArrayTable }).refine((funcs) => ({\n\t\tstreetAddressTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstreetAddress: funcs.streetAddress({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.streetAddressArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('jobTitle generator test', async () => {\n\tawait seed(db, { jobTitleTable: schema.jobTitleTable }).refine((funcs) => ({\n\t\tjobTitleTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tjobTitle: funcs.jobTitle(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.jobTitleTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('jobTitle array generator test', async () => {\n\tawait seed(db, { jobTitleTable: schema.jobTitleArrayTable }).refine((funcs) => ({\n\t\tjobTitleTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tjobTitle: funcs.jobTitle({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.jobTitleArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('postcode generator test', async () => {\n\tawait seed(db, { postcodeTable: schema.postcodeTable }).refine((funcs) => ({\n\t\tpostcodeTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tpostcode: funcs.postcode(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.postcodeTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('postcode unique generator test', async () => {\n\tawait seed(db, { postcodeUniqueTable: schema.postcodeUniqueTable }).refine((funcs) => ({\n\t\tpostcodeUniqueTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tpostcodeUnique: funcs.postcode({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.postcodeUniqueTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('postcode array generator test', async () => {\n\tawait seed(db, { postcodeTable: schema.postcodeArrayTable }).refine((funcs) => ({\n\t\tpostcodeTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tpostcode: funcs.postcode({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.postcodeArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('state generator test', async () => {\n\tawait seed(db, { stateTable: schema.stateTable }).refine((funcs) => ({\n\t\tstateTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstate: funcs.state(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.stateTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('state array generator test', async () => {\n\tawait seed(db, { stateTable: schema.stateArrayTable }).refine((funcs) => ({\n\t\tstateTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstate: funcs.state({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.stateArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('companyName generator test', async () => {\n\tawait seed(db, { companyNameTable: schema.companyNameTable }).refine((funcs) => ({\n\t\tcompanyNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcompanyName: funcs.companyName(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.companyNameTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('companyName unique generator test', async () => {\n\tawait seed(db, { companyNameUniqueTable: schema.companyNameUniqueTable }).refine((funcs) => ({\n\t\tcompanyNameUniqueTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcompanyNameUnique: funcs.companyName({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.companyNameUniqueTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('companyName array generator test', async () => {\n\tawait seed(db, { companyNameTable: schema.companyNameArrayTable }).refine((funcs) => ({\n\t\tcompanyNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcompanyName: funcs.companyName({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.companyNameArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('loremIpsum generator test', async () => {\n\tawait seed(db, { loremIpsumTable: schema.loremIpsumTable }).refine((funcs) => ({\n\t\tloremIpsumTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tloremIpsum: funcs.loremIpsum(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.loremIpsumTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('loremIpsum array generator test', async () => {\n\tawait seed(db, { loremIpsumTable: schema.loremIpsumArrayTable }).refine((funcs) => ({\n\t\tloremIpsumTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tloremIpsum: funcs.loremIpsum({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.loremIpsumArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('point generator test', async () => {\n\tawait seed(db, { pointTable: schema.pointTable }).refine((funcs) => ({\n\t\tpointTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tpoint: funcs.point(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.pointTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('point unique generator test', async () => {\n\tawait reset(db, { pointTable: schema.pointTable });\n\tawait seed(db, { pointTable: schema.pointTable }).refine((funcs) => ({\n\t\tpointTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tpoint: funcs.point({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.pointTable);\n\t// every value in each row does not equal undefined.\n\tlet predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\t// using Set because PGlite does not support unique point\n\tconst pointStrsSet = new Set<string>(data.map((row) => row.point!.map(String).join(',')));\n\tpredicate = pointStrsSet.size === data.length;\n\texpect(predicate).toBe(true);\n});\n\ntest('point array generator test', async () => {\n\tawait seed(db, { pointTable: schema.pointArrayTable }).refine((funcs) => ({\n\t\tpointTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tpoint: funcs.point({ arraySize: 2 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.pointArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 2));\n\texpect(predicate).toBe(true);\n});\n\ntest('line generator test', async () => {\n\tawait seed(db, { lineTable: schema.lineTable }).refine((funcs) => ({\n\t\tlineTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tline: funcs.line(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.lineTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('line unique generator test', async () => {\n\tawait reset(db, { lineTable: schema.lineTable });\n\tawait seed(db, { lineTable: schema.lineTable }).refine((funcs) => ({\n\t\tlineTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tline: funcs.line({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.lineTable);\n\t// every value in each row does not equal undefined.\n\tlet predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\t// using Set because PGlite does not support unique point\n\tconst lineStrsSet = new Set<string>(data.map((row) => row.line!.map(String).join(',')));\n\tpredicate = lineStrsSet.size === data.length;\n\texpect(predicate).toBe(true);\n});\n\ntest('line array generator test', async () => {\n\tawait seed(db, { lineTable: schema.lineArrayTable }).refine((funcs) => ({\n\t\tlineTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tline: funcs.line({ arraySize: 2 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.lineArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 2));\n\texpect(predicate).toBe(true);\n});\n\ntest('phoneNumber generator test', async () => {\n\tawait seed(db, { phoneNumberTable: schema.phoneNumberTable }).refine((funcs) => ({\n\t\tphoneNumberTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tphoneNumber: funcs.phoneNumber(),\n\t\t\t\tphoneNumberPrefixes: funcs.phoneNumber({\n\t\t\t\t\tprefixes: ['+380 99', '+380 67', '+1'],\n\t\t\t\t\tgeneratedDigitsNumbers: [7, 7, 10],\n\t\t\t\t}),\n\t\t\t\tphoneNumberTemplate: funcs.phoneNumber({ template: '+380 ## ## ### ##' }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.phoneNumberTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('phoneNumber array generator test', async () => {\n\tawait seed(db, { phoneNumberTable: schema.phoneNumberArrayTable }).refine((funcs) => ({\n\t\tphoneNumberTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tphoneNumber: funcs.phoneNumber({ arraySize: 3 }),\n\t\t\t\tphoneNumberPrefixes: funcs.phoneNumber({\n\t\t\t\t\tprefixes: ['+380 99', '+380 67', '+1'],\n\t\t\t\t\tgeneratedDigitsNumbers: [7, 7, 10],\n\t\t\t\t\tarraySize: 4,\n\t\t\t\t}),\n\t\t\t\tphoneNumberTemplate: funcs.phoneNumber({\n\t\t\t\t\ttemplate: '+380 ## ## ### ##',\n\t\t\t\t\tarraySize: 5,\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.phoneNumberArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) =>\n\t\t\tObject.values(row).every((val) => val !== undefined && val !== null && [3, 4, 5].includes(val.length))\n\t\t);\n\texpect(predicate).toBe(true);\n});\n\ntest('weightedRandom generator test', async () => {\n\tawait seed(db, { weightedRandomTable: schema.weightedRandomTable }).refine((funcs) => ({\n\t\tweightedRandomTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tweightedRandom: funcs.weightedRandom([\n\t\t\t\t\t{ value: funcs.default({ defaultValue: 'default value' }), weight: 0.3 },\n\t\t\t\t\t{ value: funcs.loremIpsum(), weight: 0.7 },\n\t\t\t\t]),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.weightedRandomTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('weightedRandom with unique gens generator test', async () => {\n\tawait seed(db, { weightedRandomWithUniqueGensTable: schema.weightedRandomWithUniqueGensTable }).refine((funcs) => ({\n\t\tweightedRandomWithUniqueGensTable: {\n\t\t\tcount: 10000,\n\t\t\tcolumns: {\n\t\t\t\tweightedRandomWithUniqueGens: funcs.weightedRandom([\n\t\t\t\t\t{ weight: 0.3, value: funcs.email() },\n\t\t\t\t\t{ weight: 0.7, value: funcs.firstName({ isUnique: true }) },\n\t\t\t\t]),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.weightedRandomWithUniqueGensTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { weightedRandomWithUniqueGensTable: schema.weightedRandomWithUniqueGensTable }).refine((funcs) => ({\n\t\t\tweightedRandomWithUniqueGensTable: {\n\t\t\t\tcount: 40000,\n\t\t\t\tcolumns: {\n\t\t\t\t\tweightedRandomWithUniqueGens: funcs.weightedRandom([\n\t\t\t\t\t\t{ weight: 0.1, value: funcs.email() },\n\t\t\t\t\t\t{ weight: 0.9, value: funcs.firstName({ isUnique: true }) },\n\t\t\t\t\t]),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique first names.');\n\n\tawait expect(\n\t\tseed(db, { weightedRandomWithUniqueGensTable: schema.weightedRandomWithUniqueGensTable }).refine((funcs) => ({\n\t\t\tweightedRandomWithUniqueGensTable: {\n\t\t\t\tcount: 10000,\n\t\t\t\tcolumns: {\n\t\t\t\t\tweightedRandomWithUniqueGens: funcs.weightedRandom([\n\t\t\t\t\t\t{ weight: 0.2, value: funcs.email() },\n\t\t\t\t\t\t{ weight: 0.9, value: funcs.firstName({ isUnique: true }) },\n\t\t\t\t\t]),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow(\n\t\t'The weights for the Weighted Random feature must add up to exactly 1. Please review your weights to ensure they total 1 before proceeding',\n\t);\n});\n\ntest('uuid generator test', async () => {\n\tawait reset(db, { uuidTable: schema.uuidTable });\n\tawait seed(db, { uuidTable: schema.uuidTable }).refine((funcs) => ({\n\t\tuuidTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tuuid: funcs.uuid(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.uuidTable);\n\t// every value in each row does not equal undefined.\n\tlet predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\tconst uuidStrsSet = new Set<string>(data.map((row) => row.uuid!));\n\tpredicate = uuidStrsSet.size === data.length;\n\texpect(predicate).toBe(true);\n});\n\ntest('uuid array generator test', async () => {\n\tawait reset(db, { uuidArrayTable: schema.uuidArrayTable });\n\tawait seed(db, { uuidArrayTable: schema.uuidArrayTable }).refine((funcs) => ({\n\t\tuuidArrayTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tuuid: funcs.uuid({ arraySize: 4 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.uuidArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n"
  },
  {
    "path": "drizzle-seed/tests/pg/generatorsTest/pgSchema.ts",
    "content": "import {\n\tboolean,\n\tdate,\n\tinteger,\n\tinterval,\n\tjson,\n\tline,\n\tpgSchema,\n\tpoint,\n\treal,\n\ttext,\n\ttime,\n\ttimestamp,\n\tuuid,\n\tvarchar,\n} from 'drizzle-orm/pg-core';\n\nexport const schema = pgSchema('seeder_lib_pg');\n\nexport const moodEnum = schema.enum('enum', ['sad', 'ok', 'happy']);\n\nexport const enumTable = schema.table('enum_table', {\n\tmood: moodEnum('mood_enum'),\n});\n\nexport const defaultTable = schema.table('default_table', {\n\tdefaultString: text('default_string'),\n});\n\nexport const defaultArrayTable = schema.table('default_array_table', {\n\tdefaultString: text('default_string').array(),\n});\n\nexport const valuesFromArrayTable = schema.table('values_from_array_table', {\n\tvaluesFromArrayNotNull: varchar('values_from_array_not_null', { length: 256 }).notNull(),\n\tvaluesFromArrayWeightedNotNull: varchar('values_from_array_weighted_not_null', { length: 256 }).notNull(),\n});\n\nexport const valuesFromArrayUniqueTable = schema.table('values_from_array_unique_table', {\n\tvaluesFromArray: varchar('values_from_array', { length: 256 }).unique(),\n\tvaluesFromArrayNotNull: varchar('values_from_array_not_null', { length: 256 }).unique().notNull(),\n\tvaluesFromArrayWeighted: varchar('values_from_array_weighted', { length: 256 }).unique(),\n\tvaluesFromArrayWeightedNotNull: varchar('values_from_array_weighted_not_null', { length: 256 }).unique().notNull(),\n});\n\nexport const valuesFromArrayArrayTable = schema.table('values_from_array_array_table', {\n\tvaluesFromArray: varchar('values_from_array', { length: 256 }).array(),\n});\n\nexport const intPrimaryKeyTable = schema.table('int_primary_key_table', {\n\tintPrimaryKey: integer('int_primary_key').unique(),\n});\n\nexport const numberTable = schema.table('number_table', {\n\tnumber: real('number'),\n});\n\nexport const numberUniqueTable = schema.table('number_unique_table', {\n\tnumberUnique: real('number_unique').unique(),\n});\n\nexport const numberArrayTable = schema.table('number_array_table', {\n\tnumber: real('number').array(),\n});\n\nexport const intTable = schema.table('int_table', {\n\tint: integer('int'),\n});\n\nexport const intUniqueTable = schema.table('int_unique_table', {\n\tintUnique: integer('int_unique').unique(),\n});\n\nexport const intArrayTable = schema.table('int_array_table', {\n\tint: integer('int').array(),\n});\n\nexport const booleanTable = schema.table('boolean_table', {\n\tboolean: boolean('boolean'),\n});\n\nexport const booleanArrayTable = schema.table('boolean_array_table', {\n\tboolean: boolean('boolean').array(),\n});\n\nexport const dateTable = schema.table('date_table', {\n\tdate: date('date'),\n});\n\n// TODO: add tests for data type with different modes\nexport const dateArrayTable = schema.table('date_array_table', {\n\tdate: date('date', { mode: 'date' }).array(),\n\tdateString: date('date_string', { mode: 'string' }).array(),\n});\n\nexport const timeTable = schema.table('time_table', {\n\ttime: time('time'),\n});\n\nexport const timeArrayTable = schema.table('time_array_table', {\n\ttime: time('time').array(),\n});\n\nexport const timestampTable = schema.table('timestamp_table', {\n\ttimestamp: timestamp('timestamp'),\n});\n\nexport const timestampArrayTable = schema.table('timestamp_array_table', {\n\ttimestamp: timestamp('timestamp').array(),\n});\n\nexport const jsonTable = schema.table('json_table', {\n\tjson: json('json'),\n});\n\nexport const jsonArrayTable = schema.table('json_array_table', {\n\tjson: json('json').array(),\n});\n\nexport const intervalTable = schema.table('interval_table', {\n\tinterval: interval('interval'),\n});\n\nexport const intervalUniqueTable = schema.table('interval_unique_table', {\n\tintervalUnique: interval('interval_unique').unique(),\n});\n\nexport const intervalArrayTable = schema.table('interval_array_table', {\n\tinterval: interval('interval').array(),\n});\n\nexport const stringTable = schema.table('string_table', {\n\tstring: text('string'),\n});\n\nexport const stringUniqueTable = schema.table('string_unique_table', {\n\tstringUnique: varchar('string_unique', { length: 256 }).unique(),\n});\n\nexport const stringArrayTable = schema.table('string_array_table', {\n\tstring: text('string').array(),\n});\n\nexport const emailTable = schema.table('email_table', {\n\temail: varchar('email', { length: 256 }).unique(),\n});\n\nexport const emailArrayTable = schema.table('email_array_table', {\n\temail: varchar('email', { length: 256 }).array(),\n});\n\nexport const firstNameTable = schema.table('first_name_table', {\n\tfirstName: varchar('first_name', { length: 256 }),\n});\n\nexport const firstNameUniqueTable = schema.table('first_name_unique_table', {\n\tfirstNameUnique: varchar('first_name_unique', { length: 256 }).unique(),\n});\n\nexport const firstNameArrayTable = schema.table('first_name_array_table', {\n\tfirstName: varchar('first_name', { length: 256 }).array(),\n});\n\nexport const lastNameTable = schema.table('last_name_table', {\n\tlastName: varchar('last_name', { length: 256 }),\n});\n\nexport const lastNameUniqueTable = schema.table('last_name_unique_table', {\n\tlastNameUnique: varchar('last_name_unique', { length: 256 }).unique(),\n});\n\nexport const lastNameArrayTable = schema.table('last_name_array_table', {\n\tlastName: varchar('last_name', { length: 256 }).array(),\n});\n\nexport const fullNameTable = schema.table('full_name__table', {\n\tfullName: varchar('full_name_', { length: 256 }),\n});\n\nexport const fullNameUniqueTable = schema.table('full_name_unique_table', {\n\tfullNameUnique: varchar('full_name_unique', { length: 256 }).unique(),\n});\n\nexport const fullNameArrayTable = schema.table('full_name_array_table', {\n\tfullName: varchar('full_name', { length: 256 }).array(),\n});\n\nexport const countryTable = schema.table('country_table', {\n\tcountry: varchar('country', { length: 256 }),\n});\n\nexport const countryUniqueTable = schema.table('country_unique_table', {\n\tcountryUnique: varchar('country_unique', { length: 256 }).unique(),\n});\n\nexport const countryArrayTable = schema.table('country_array_table', {\n\tcountry: varchar('country', { length: 256 }).array(),\n});\n\nexport const cityTable = schema.table('city_table', {\n\tcity: varchar('city', { length: 256 }),\n});\n\nexport const cityUniqueTable = schema.table('city_unique_table', {\n\tcityUnique: varchar('city_unique', { length: 256 }).unique(),\n});\n\nexport const cityArrayTable = schema.table('city_array_table', {\n\tcity: varchar('city', { length: 256 }).array(),\n});\n\nexport const streetAddressTable = schema.table('street_address_table', {\n\tstreetAddress: varchar('street_address', { length: 256 }),\n});\n\nexport const streetAddressUniqueTable = schema.table('street_address_unique_table', {\n\tstreetAddressUnique: varchar('street_address_unique', { length: 256 }).unique(),\n});\n\nexport const streetAddressArrayTable = schema.table('street_address_array_table', {\n\tstreetAddress: varchar('street_address', { length: 256 }).array(),\n});\n\nexport const jobTitleTable = schema.table('job_Title_table', {\n\tjobTitle: text('job_title'),\n});\n\nexport const jobTitleArrayTable = schema.table('job_title_array_table', {\n\tjobTitle: text('job_title').array(),\n});\n\nexport const postcodeTable = schema.table('postcode_table', {\n\tpostcode: varchar('postcode', { length: 256 }),\n});\n\nexport const postcodeUniqueTable = schema.table('postcode_unique_table', {\n\tpostcodeUnique: varchar('postcode_unique', { length: 256 }).unique(),\n});\n\nexport const postcodeArrayTable = schema.table('postcode_array_table', {\n\tpostcode: varchar('postcode', { length: 256 }).array(),\n});\n\nexport const stateTable = schema.table('state_table', {\n\tstate: text('state'),\n});\n\nexport const stateArrayTable = schema.table('state_array_table', {\n\tstate: text('state').array(),\n});\n\nexport const companyNameTable = schema.table('company_name_table', {\n\tcompanyName: text('company_name'),\n});\n\nexport const companyNameUniqueTable = schema.table('company_name_unique_table', {\n\tcompanyNameUnique: varchar('company_name_unique', { length: 256 }).unique(),\n});\n\nexport const companyNameArrayTable = schema.table('company_name_array_table', {\n\tcompanyName: text('company_name').array(),\n});\n\nexport const loremIpsumTable = schema.table('lorem_ipsum_table', {\n\tloremIpsum: text('lorem_ipsum'),\n});\n\nexport const loremIpsumArrayTable = schema.table('lorem_ipsum_array_table', {\n\tloremIpsum: text('lorem_ipsum').array(),\n});\n\nexport const pointTable = schema.table('point_table', {\n\tpoint: point('point'),\n});\n\nexport const pointArrayTable = schema.table('point_array_table', {\n\tpoint: point('point').array(),\n});\n\nexport const lineTable = schema.table('line_table', {\n\tline: line('line'),\n});\n\nexport const lineArrayTable = schema.table('line_array_table', {\n\tline: line('line').array(),\n});\n\n// export const pointUniqueTable = schema.table(\"point_unique_table\", {\n//     pointUnique: point(\"point_unique\").unique(),\n// });\n\n// export const lineUniqueTable = schema.table(\"line_unique_table\", {\n//     lineUnique: line(\"line_unique\").unique(),\n// });\n\nexport const phoneNumberTable = schema.table('phone_number_table', {\n\tphoneNumber: varchar('phoneNumber', { length: 256 }).unique(),\n\tphoneNumberTemplate: varchar('phone_number_template', { length: 256 }).unique(),\n\tphoneNumberPrefixes: varchar('phone_number_prefixes', { length: 256 }).unique(),\n});\n\nexport const phoneNumberArrayTable = schema.table('phone_number_array_table', {\n\tphoneNumber: varchar('phoneNumber', { length: 256 }).array(),\n\tphoneNumberTemplate: varchar('phone_number_template', { length: 256 }).array(),\n\tphoneNumberPrefixes: varchar('phone_number_prefixes', { length: 256 }).array(),\n});\n\nexport const weightedRandomTable = schema.table('weighted_random_table', {\n\tweightedRandom: varchar('weighted_random', { length: 256 }),\n});\n\nexport const weightedRandomWithUniqueGensTable = schema.table('weighted_random_with_unique_gens_table', {\n\tweightedRandomWithUniqueGens: varchar('weighted_random_with_unique_gens', { length: 256 }).unique(),\n});\n\nexport const uuidTable = schema.table('uuid_table', {\n\tuuid: uuid('uuid'),\n});\n\nexport const uuidArrayTable = schema.table('uuid_array_table', {\n\tuuid: uuid('uuid').array(),\n});\n"
  },
  {
    "path": "drizzle-seed/tests/pg/pg.test.ts",
    "content": "import { PGlite } from '@electric-sql/pglite';\nimport { relations, sql } from 'drizzle-orm';\nimport type { PgliteDatabase } from 'drizzle-orm/pglite';\nimport { drizzle } from 'drizzle-orm/pglite';\nimport { afterAll, afterEach, beforeAll, expect, test, vi } from 'vitest';\nimport { reset, seed } from '../../src/index.ts';\nimport * as schema from './pgSchema.ts';\n\nlet client: PGlite;\nlet db: PgliteDatabase;\n\nbeforeAll(async () => {\n\tclient = new PGlite();\n\n\tdb = drizzle(client);\n\n\tawait db.execute(sql`CREATE SCHEMA \"seeder_lib_pg\";`);\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"customer\" (\n\t\t\t\t\"id\" varchar(256) PRIMARY KEY NOT NULL,\n\t\t\t\t\"company_name\" text NOT NULL,\n\t\t\t\t\"contact_name\" text NOT NULL,\n\t\t\t\t\"contact_title\" text NOT NULL,\n\t\t\t\t\"address\" text NOT NULL,\n\t\t\t\t\"city\" text NOT NULL,\n\t\t\t\t\"postal_code\" text,\n\t\t\t\t\"region\" text,\n\t\t\t\t\"country\" text NOT NULL,\n\t\t\t\t\"phone\" text NOT NULL,\n\t\t\t\t\"fax\" text\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"order_detail\" (\n\t\t\t\t\"unit_price\" numeric NOT NULL,\n\t\t\t\t\"quantity\" integer NOT NULL,\n\t\t\t\t\"discount\" numeric NOT NULL,\n\t\t\t\t\"order_id\" integer NOT NULL,\n\t\t\t\t\"product_id\" integer NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"employee\" (\n\t\t\t\t\"id\" integer PRIMARY KEY NOT NULL,\n\t\t\t\t\"last_name\" text NOT NULL,\n\t\t\t\t\"first_name\" text,\n\t\t\t\t\"title\" text NOT NULL,\n\t\t\t\t\"title_of_courtesy\" text NOT NULL,\n\t\t\t\t\"birth_date\" timestamp NOT NULL,\n\t\t\t\t\"hire_date\" timestamp NOT NULL,\n\t\t\t\t\"address\" text NOT NULL,\n\t\t\t\t\"city\" text NOT NULL,\n\t\t\t\t\"postal_code\" text NOT NULL,\n\t\t\t\t\"country\" text NOT NULL,\n\t\t\t\t\"home_phone\" text NOT NULL,\n\t\t\t\t\"extension\" integer NOT NULL,\n\t\t\t\t\"notes\" text NOT NULL,\n\t\t\t\t\"reports_to\" integer,\n\t\t\t\t\"photo_path\" text\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"order\" (\n\t\t\t\t\"id\" integer PRIMARY KEY NOT NULL,\n\t\t\t\t\"order_date\" timestamp NOT NULL,\n\t\t\t\t\"required_date\" timestamp NOT NULL,\n\t\t\t\t\"shipped_date\" timestamp,\n\t\t\t\t\"ship_via\" integer NOT NULL,\n\t\t\t\t\"freight\" numeric NOT NULL,\n\t\t\t\t\"ship_name\" text NOT NULL,\n\t\t\t\t\"ship_city\" text NOT NULL,\n\t\t\t\t\"ship_region\" text,\n\t\t\t\t\"ship_postal_code\" text,\n\t\t\t\t\"ship_country\" text NOT NULL,\n\t\t\t\t\"customer_id\" text NOT NULL,\n\t\t\t\t\"employee_id\" integer NOT NULL\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"product\" (\n\t\t\t\t\"id\" integer PRIMARY KEY NOT NULL,\n\t\t\t\t\"name\" text NOT NULL,\n\t\t\t\t\"quantity_per_unit\" text NOT NULL,\n\t\t\t\t\"unit_price\" numeric NOT NULL,\n\t\t\t\t\"units_in_stock\" integer NOT NULL,\n\t\t\t\t\"units_on_order\" integer NOT NULL,\n\t\t\t\t\"reorder_level\" integer NOT NULL,\n\t\t\t\t\"discontinued\" integer NOT NULL,\n\t\t\t\t\"supplier_id\" integer NOT NULL\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"supplier\" (\n\t\t\t\t\"id\" integer PRIMARY KEY NOT NULL,\n\t\t\t\t\"company_name\" text NOT NULL,\n\t\t\t\t\"contact_name\" text NOT NULL,\n\t\t\t\t\"contact_title\" text NOT NULL,\n\t\t\t\t\"address\" text NOT NULL,\n\t\t\t\t\"city\" text NOT NULL,\n\t\t\t\t\"region\" text,\n\t\t\t\t\"postal_code\" text NOT NULL,\n\t\t\t\t\"country\" text NOT NULL,\n\t\t\t\t\"phone\" text NOT NULL\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t ALTER TABLE \"seeder_lib_pg\".\"order_detail\" ADD CONSTRAINT \"order_detail_order_id_order_id_fk\" FOREIGN KEY (\"order_id\") REFERENCES \"seeder_lib_pg\".\"order\"(\"id\") ON DELETE cascade ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t ALTER TABLE \"seeder_lib_pg\".\"order_detail\" ADD CONSTRAINT \"order_detail_product_id_product_id_fk\" FOREIGN KEY (\"product_id\") REFERENCES \"seeder_lib_pg\".\"product\"(\"id\") ON DELETE cascade ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t ALTER TABLE \"seeder_lib_pg\".\"employee\" ADD CONSTRAINT \"employee_reports_to_employee_id_fk\" FOREIGN KEY (\"reports_to\") REFERENCES \"seeder_lib_pg\".\"employee\"(\"id\") ON DELETE no action ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t ALTER TABLE \"seeder_lib_pg\".\"order\" ADD CONSTRAINT \"order_customer_id_customer_id_fk\" FOREIGN KEY (\"customer_id\") REFERENCES \"seeder_lib_pg\".\"customer\"(\"id\") ON DELETE cascade ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t ALTER TABLE \"seeder_lib_pg\".\"order\" ADD CONSTRAINT \"order_employee_id_employee_id_fk\" FOREIGN KEY (\"employee_id\") REFERENCES \"seeder_lib_pg\".\"employee\"(\"id\") ON DELETE cascade ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t ALTER TABLE \"seeder_lib_pg\".\"product\" ADD CONSTRAINT \"product_supplier_id_supplier_id_fk\" FOREIGN KEY (\"supplier_id\") REFERENCES \"seeder_lib_pg\".\"supplier\"(\"id\") ON DELETE cascade ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"identity_columns_table\" (\n\t\t\t\t\"id\" integer generated always as identity,\n\t\t\t\t\"id1\" integer generated by default as identity,\n\t\t\t\t\"name\" text\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table \"seeder_lib_pg\".\"users\"\n\t\t\t(\n\t\t\t    id          serial\n\t\t\t        primary key,\n\t\t\t    name        text,\n\t\t\t    \"invitedBy\" integer\n\t\t\t        constraint \"users_invitedBy_user_id_fk\"\n\t\t\t            references \"seeder_lib_pg\".\"users\"\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table \"seeder_lib_pg\".\"posts\"\n\t\t\t(\n\t\t\t    id          serial\n\t\t\t        primary key,\n\t\t\t    name        text,\n\t\t\t\tcontent     text,\n\t\t\t    \"userId\" integer\n\t\t\t        constraint \"users_userId_user_id_fk\"\n\t\t\t            references \"seeder_lib_pg\".\"users\"\n\t\t\t);\n\t\t`,\n\t);\n});\n\nafterEach(async () => {\n\tawait reset(db, schema);\n});\n\nafterAll(async () => {\n\tawait client.close();\n});\n\ntest('basic seed test', async () => {\n\tawait seed(db, schema);\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(10);\n\texpect(details.length).toBe(10);\n\texpect(employees.length).toBe(10);\n\texpect(orders.length).toBe(10);\n\texpect(products.length).toBe(10);\n\texpect(suppliers.length).toBe(10);\n});\n\ntest('seed with options.count:11 test', async () => {\n\tawait seed(db, schema, { count: 11 });\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(11);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(11);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('redefine(refine) customers count', async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 12,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(12);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(11);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('redefine(refine) all tables count', async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 12,\n\t\t},\n\t\tdetails: {\n\t\t\tcount: 13,\n\t\t},\n\t\temployees: {\n\t\t\tcount: 14,\n\t\t},\n\t\torders: {\n\t\t\tcount: 15,\n\t\t},\n\t\tproducts: {\n\t\t\tcount: 16,\n\t\t},\n\t\tsuppliers: {\n\t\t\tcount: 17,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(12);\n\texpect(details.length).toBe(13);\n\texpect(employees.length).toBe(14);\n\texpect(orders.length).toBe(15);\n\texpect(products.length).toBe(16);\n\texpect(suppliers.length).toBe(17);\n});\n\ntest(\"redefine(refine) orders count using 'with' in customers\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 13,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest(\"sequential using of 'with'\", async () => {\n\tconst currSchema = {\n\t\tcustomers: schema.customers,\n\t\tdetails: schema.details,\n\t\temployees: schema.employees,\n\t\torders: schema.orders,\n\t\tproducts: schema.products,\n\t\tsuppliers: schema.suppliers,\n\t};\n\tawait seed(db, currSchema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 12,\n\t\t\twith: {\n\t\t\t\tdetails: 3,\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(24);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('seeding with identity columns', async () => {\n\tawait seed(db, { identityColumnsTable: schema.identityColumnsTable });\n\n\tconst result = await db.select().from(schema.identityColumnsTable);\n\n\texpect(result.length).toBe(10);\n});\n\ntest('seeding with self relation', async () => {\n\tawait seed(db, { users: schema.users });\n\n\tconst result = await db.select().from(schema.users);\n\n\texpect(result.length).toBe(10);\n\tconst predicate = result.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('overlapping a foreign key constraint with a one-to-many relation', async () => {\n\tconst postsRelation = relations(schema.posts, ({ one }) => ({\n\t\tuser: one(schema.users, { fields: [schema.posts.userId], references: [schema.users.id] }),\n\t}));\n\n\tconst consoleMock = vi.spyOn(console, 'warn').mockImplementation(() => {});\n\n\tawait reset(db, { users: schema.users, posts: schema.posts, postsRelation });\n\tawait seed(db, { users: schema.users, posts: schema.posts, postsRelation });\n\t// expecting to get a warning\n\texpect(consoleMock).toBeCalled();\n\texpect(consoleMock).toBeCalledWith(expect.stringMatching(/^You are providing a one-to-many relation.+/));\n\n\tconst users = await db.select().from(schema.users);\n\tconst posts = await db.select().from(schema.posts);\n\n\texpect(users.length).toBe(10);\n\tlet predicate = users.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\texpect(posts.length).toBe(10);\n\tpredicate = posts.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n"
  },
  {
    "path": "drizzle-seed/tests/pg/pgSchema.ts",
    "content": "import type { AnyPgColumn } from 'drizzle-orm/pg-core';\nimport { integer, numeric, pgSchema, serial, text, timestamp, varchar } from 'drizzle-orm/pg-core';\n\nexport const schema = pgSchema('seeder_lib_pg');\n\nexport const customers = schema.table('customer', {\n\tid: varchar('id', { length: 256 }).primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tpostalCode: text('postal_code'),\n\tregion: text('region'),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n\tfax: text('fax'),\n});\n\nexport const employees = schema.table(\n\t'employee',\n\t{\n\t\tid: integer('id').primaryKey(),\n\t\tlastName: text('last_name').notNull(),\n\t\tfirstName: text('first_name'),\n\t\ttitle: text('title').notNull(),\n\t\ttitleOfCourtesy: text('title_of_courtesy').notNull(),\n\t\tbirthDate: timestamp('birth_date').notNull(),\n\t\thireDate: timestamp('hire_date').notNull(),\n\t\taddress: text('address').notNull(),\n\t\tcity: text('city').notNull(),\n\t\tpostalCode: text('postal_code').notNull(),\n\t\tcountry: text('country').notNull(),\n\t\thomePhone: text('home_phone').notNull(),\n\t\textension: integer('extension').notNull(),\n\t\tnotes: text('notes').notNull(),\n\t\treportsTo: integer('reports_to').references((): AnyPgColumn => employees.id),\n\t\tphotoPath: text('photo_path'),\n\t},\n);\n\nexport const orders = schema.table('order', {\n\tid: integer('id').primaryKey(),\n\torderDate: timestamp('order_date').notNull(),\n\trequiredDate: timestamp('required_date').notNull(),\n\tshippedDate: timestamp('shipped_date'),\n\tshipVia: integer('ship_via').notNull(),\n\tfreight: numeric('freight').notNull(),\n\tshipName: text('ship_name').notNull(),\n\tshipCity: text('ship_city').notNull(),\n\tshipRegion: text('ship_region'),\n\tshipPostalCode: text('ship_postal_code'),\n\tshipCountry: text('ship_country').notNull(),\n\n\tcustomerId: text('customer_id')\n\t\t.notNull()\n\t\t.references(() => customers.id, { onDelete: 'cascade' }),\n\n\temployeeId: integer('employee_id')\n\t\t.notNull()\n\t\t.references(() => employees.id, { onDelete: 'cascade' }),\n});\n\nexport const suppliers = schema.table('supplier', {\n\tid: integer('id').primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tregion: text('region'),\n\tpostalCode: text('postal_code').notNull(),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n});\n\nexport const products = schema.table('product', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tquantityPerUnit: text('quantity_per_unit').notNull(),\n\tunitPrice: numeric('unit_price').notNull(),\n\tunitsInStock: integer('units_in_stock').notNull(),\n\tunitsOnOrder: integer('units_on_order').notNull(),\n\treorderLevel: integer('reorder_level').notNull(),\n\tdiscontinued: integer('discontinued').notNull(),\n\n\tsupplierId: integer('supplier_id')\n\t\t.notNull()\n\t\t.references(() => suppliers.id, { onDelete: 'cascade' }),\n});\n\nexport const details = schema.table('order_detail', {\n\tunitPrice: numeric('unit_price').notNull(),\n\tquantity: integer('quantity').notNull(),\n\tdiscount: numeric('discount').notNull(),\n\n\torderId: integer('order_id')\n\t\t.notNull()\n\t\t.references(() => orders.id, { onDelete: 'cascade' }),\n\n\tproductId: integer('product_id')\n\t\t.notNull()\n\t\t.references(() => products.id, { onDelete: 'cascade' }),\n});\n\nexport const identityColumnsTable = schema.table('identity_columns_table', {\n\tid: integer().generatedAlwaysAsIdentity(),\n\tid1: integer().generatedByDefaultAsIdentity(),\n\tname: text(),\n});\n\nexport const users = schema.table(\n\t'users',\n\t{\n\t\tid: serial().primaryKey(),\n\t\tname: text(),\n\t\tinvitedBy: integer().references((): AnyPgColumn => users.id),\n\t},\n);\n\nexport const posts = schema.table(\n\t'posts',\n\t{\n\t\tid: serial().primaryKey(),\n\t\tname: text(),\n\t\tcontent: text(),\n\t\tuserId: integer().references(() => users.id),\n\t},\n);\n"
  },
  {
    "path": "drizzle-seed/tests/pg/softRelationsTest/pgSchema.ts",
    "content": "import { relations } from 'drizzle-orm';\nimport { integer, numeric, pgSchema, text, timestamp, varchar } from 'drizzle-orm/pg-core';\n\nexport const schema = pgSchema('seeder_lib_pg');\n\nexport const customers = schema.table('customer', {\n\tid: varchar('id', { length: 256 }).primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tpostalCode: text('postal_code'),\n\tregion: text('region'),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n\tfax: text('fax'),\n});\n\nexport const employees = schema.table(\n\t'employee',\n\t{\n\t\tid: integer('id').primaryKey(),\n\t\tlastName: text('last_name').notNull(),\n\t\tfirstName: text('first_name'),\n\t\ttitle: text('title').notNull(),\n\t\ttitleOfCourtesy: text('title_of_courtesy').notNull(),\n\t\tbirthDate: timestamp('birth_date').notNull(),\n\t\thireDate: timestamp('hire_date').notNull(),\n\t\taddress: text('address').notNull(),\n\t\tcity: text('city').notNull(),\n\t\tpostalCode: text('postal_code').notNull(),\n\t\tcountry: text('country').notNull(),\n\t\thomePhone: text('home_phone').notNull(),\n\t\textension: integer('extension').notNull(),\n\t\tnotes: text('notes').notNull(),\n\t\treportsTo: integer('reports_to'),\n\t\tphotoPath: text('photo_path'),\n\t},\n);\n\nexport const employeesRelations = relations(employees, ({ one }) => ({\n\temployee: one(employees, {\n\t\tfields: [employees.reportsTo],\n\t\treferences: [employees.id],\n\t}),\n}));\n\nexport const orders = schema.table('order', {\n\tid: integer('id').primaryKey(),\n\torderDate: timestamp('order_date').notNull(),\n\trequiredDate: timestamp('required_date').notNull(),\n\tshippedDate: timestamp('shipped_date'),\n\tshipVia: integer('ship_via').notNull(),\n\tfreight: numeric('freight').notNull(),\n\tshipName: text('ship_name').notNull(),\n\tshipCity: text('ship_city').notNull(),\n\tshipRegion: text('ship_region'),\n\tshipPostalCode: text('ship_postal_code'),\n\tshipCountry: text('ship_country').notNull(),\n\n\tcustomerId: text('customer_id').notNull(),\n\n\temployeeId: integer('employee_id').notNull(),\n});\n\nexport const ordersRelations = relations(orders, ({ one }) => ({\n\tcustomer: one(customers, {\n\t\tfields: [orders.customerId],\n\t\treferences: [customers.id],\n\t}),\n\temployee: one(employees, {\n\t\tfields: [orders.employeeId],\n\t\treferences: [employees.id],\n\t}),\n}));\n\nexport const suppliers = schema.table('supplier', {\n\tid: integer('id').primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tregion: text('region'),\n\tpostalCode: text('postal_code').notNull(),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n});\n\nexport const products = schema.table('product', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tquantityPerUnit: text('quantity_per_unit').notNull(),\n\tunitPrice: numeric('unit_price').notNull(),\n\tunitsInStock: integer('units_in_stock').notNull(),\n\tunitsOnOrder: integer('units_on_order').notNull(),\n\treorderLevel: integer('reorder_level').notNull(),\n\tdiscontinued: integer('discontinued').notNull(),\n\n\tsupplierId: integer('supplier_id').notNull(),\n});\n\nexport const productsRelations = relations(products, ({ one }) => ({\n\tsupplier: one(suppliers, {\n\t\tfields: [products.supplierId],\n\t\treferences: [suppliers.id],\n\t}),\n}));\n\nexport const details = schema.table('order_detail', {\n\tunitPrice: numeric('unit_price').notNull(),\n\tquantity: integer('quantity').notNull(),\n\tdiscount: numeric('discount').notNull(),\n\n\torderId: integer('order_id').notNull(),\n\n\tproductId: integer('product_id').notNull(),\n});\n\nexport const detailsRelations = relations(details, ({ one }) => ({\n\torder: one(orders, {\n\t\tfields: [details.orderId],\n\t\treferences: [orders.id],\n\t}),\n\tproduct: one(products, {\n\t\tfields: [details.productId],\n\t\treferences: [products.id],\n\t}),\n}));\n"
  },
  {
    "path": "drizzle-seed/tests/pg/softRelationsTest/softRelations.test.ts",
    "content": "import { PGlite } from '@electric-sql/pglite';\nimport { sql } from 'drizzle-orm';\nimport type { PgliteDatabase } from 'drizzle-orm/pglite';\nimport { drizzle } from 'drizzle-orm/pglite';\nimport { afterAll, afterEach, beforeAll, expect, test } from 'vitest';\nimport { reset, seed } from '../../../src/index.ts';\nimport * as schema from './pgSchema.ts';\n\nlet client: PGlite;\nlet db: PgliteDatabase;\n\nbeforeAll(async () => {\n\tclient = new PGlite();\n\n\tdb = drizzle(client);\n\n\tawait db.execute(sql`CREATE SCHEMA \"seeder_lib_pg\";`);\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"customer\" (\n\t\t\t\t\"id\" varchar(256) PRIMARY KEY NOT NULL,\n\t\t\t\t\"company_name\" text NOT NULL,\n\t\t\t\t\"contact_name\" text NOT NULL,\n\t\t\t\t\"contact_title\" text NOT NULL,\n\t\t\t\t\"address\" text NOT NULL,\n\t\t\t\t\"city\" text NOT NULL,\n\t\t\t\t\"postal_code\" text,\n\t\t\t\t\"region\" text,\n\t\t\t\t\"country\" text NOT NULL,\n\t\t\t\t\"phone\" text NOT NULL,\n\t\t\t\t\"fax\" text\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"order_detail\" (\n\t\t\t\t\"unit_price\" numeric NOT NULL,\n\t\t\t\t\"quantity\" integer NOT NULL,\n\t\t\t\t\"discount\" numeric NOT NULL,\n\t\t\t\t\"order_id\" integer NOT NULL,\n\t\t\t\t\"product_id\" integer NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"employee\" (\n\t\t\t\t\"id\" integer PRIMARY KEY NOT NULL,\n\t\t\t\t\"last_name\" text NOT NULL,\n\t\t\t\t\"first_name\" text,\n\t\t\t\t\"title\" text NOT NULL,\n\t\t\t\t\"title_of_courtesy\" text NOT NULL,\n\t\t\t\t\"birth_date\" timestamp NOT NULL,\n\t\t\t\t\"hire_date\" timestamp NOT NULL,\n\t\t\t\t\"address\" text NOT NULL,\n\t\t\t\t\"city\" text NOT NULL,\n\t\t\t\t\"postal_code\" text NOT NULL,\n\t\t\t\t\"country\" text NOT NULL,\n\t\t\t\t\"home_phone\" text NOT NULL,\n\t\t\t\t\"extension\" integer NOT NULL,\n\t\t\t\t\"notes\" text NOT NULL,\n\t\t\t\t\"reports_to\" integer,\n\t\t\t\t\"photo_path\" text\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"order\" (\n\t\t\t\t\"id\" integer PRIMARY KEY NOT NULL,\n\t\t\t\t\"order_date\" timestamp NOT NULL,\n\t\t\t\t\"required_date\" timestamp NOT NULL,\n\t\t\t\t\"shipped_date\" timestamp,\n\t\t\t\t\"ship_via\" integer NOT NULL,\n\t\t\t\t\"freight\" numeric NOT NULL,\n\t\t\t\t\"ship_name\" text NOT NULL,\n\t\t\t\t\"ship_city\" text NOT NULL,\n\t\t\t\t\"ship_region\" text,\n\t\t\t\t\"ship_postal_code\" text,\n\t\t\t\t\"ship_country\" text NOT NULL,\n\t\t\t\t\"customer_id\" text NOT NULL,\n\t\t\t\t\"employee_id\" integer NOT NULL\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"product\" (\n\t\t\t\t\"id\" integer PRIMARY KEY NOT NULL,\n\t\t\t\t\"name\" text NOT NULL,\n\t\t\t\t\"quantity_per_unit\" text NOT NULL,\n\t\t\t\t\"unit_price\" numeric NOT NULL,\n\t\t\t\t\"units_in_stock\" integer NOT NULL,\n\t\t\t\t\"units_on_order\" integer NOT NULL,\n\t\t\t\t\"reorder_level\" integer NOT NULL,\n\t\t\t\t\"discontinued\" integer NOT NULL,\n\t\t\t\t\"supplier_id\" integer NOT NULL\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"supplier\" (\n\t\t\t\t\"id\" integer PRIMARY KEY NOT NULL,\n\t\t\t\t\"company_name\" text NOT NULL,\n\t\t\t\t\"contact_name\" text NOT NULL,\n\t\t\t\t\"contact_title\" text NOT NULL,\n\t\t\t\t\"address\" text NOT NULL,\n\t\t\t\t\"city\" text NOT NULL,\n\t\t\t\t\"region\" text,\n\t\t\t\t\"postal_code\" text NOT NULL,\n\t\t\t\t\"country\" text NOT NULL,\n\t\t\t\t\"phone\" text NOT NULL\n\t\t\t);    \n\t\t`,\n\t);\n});\n\nafterEach(async () => {\n\tawait reset(db, schema);\n});\n\nafterAll(async () => {\n\tawait client.close();\n});\n\nconst checkSoftRelations = (\n\tcustomers: (typeof schema.customers.$inferSelect)[],\n\tdetails: (typeof schema.details.$inferSelect)[],\n\temployees: (typeof schema.employees.$inferSelect)[],\n\torders: (typeof schema.orders.$inferSelect)[],\n\tproducts: (typeof schema.products.$inferSelect)[],\n\tsuppliers: (typeof schema.suppliers.$inferSelect)[],\n) => {\n\t// employees soft relations check\n\tconst employeeIds = new Set(employees.map((employee) => employee.id));\n\tconst employeesPredicate = employees.every((employee) =>\n\t\temployee.reportsTo !== null && employeeIds.has(employee.reportsTo)\n\t);\n\texpect(employeesPredicate).toBe(true);\n\n\t// orders soft relations check\n\tconst customerIds = new Set(customers.map((customer) => customer.id));\n\tconst ordersPredicate1 = orders.every((order) => order.customerId !== null && customerIds.has(order.customerId));\n\texpect(ordersPredicate1).toBe(true);\n\n\tconst ordersPredicate2 = orders.every((order) => order.employeeId !== null && employeeIds.has(order.employeeId));\n\texpect(ordersPredicate2).toBe(true);\n\n\t// product soft relations check\n\tconst supplierIds = new Set(suppliers.map((supplier) => supplier.id));\n\tconst productsPredicate = products.every((product) =>\n\t\tproduct.supplierId !== null && supplierIds.has(product.supplierId)\n\t);\n\texpect(productsPredicate).toBe(true);\n\n\t// details soft relations check\n\tconst orderIds = new Set(orders.map((order) => order.id));\n\tconst detailsPredicate1 = details.every((detail) => detail.orderId !== null && orderIds.has(detail.orderId));\n\texpect(detailsPredicate1).toBe(true);\n\n\tconst productIds = new Set(products.map((product) => product.id));\n\tconst detailsPredicate2 = details.every((detail) => detail.productId !== null && productIds.has(detail.productId));\n\texpect(detailsPredicate2).toBe(true);\n};\n\ntest('basic seed, soft relations test', async () => {\n\tawait seed(db, schema);\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(10);\n\texpect(details.length).toBe(10);\n\texpect(employees.length).toBe(10);\n\texpect(orders.length).toBe(10);\n\texpect(products.length).toBe(10);\n\texpect(suppliers.length).toBe(10);\n\n\tcheckSoftRelations(customers, details, employees, orders, products, suppliers);\n});\n\ntest(\"redefine(refine) orders count using 'with' in customers, soft relations test\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 13,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n\n\tcheckSoftRelations(customers, details, employees, orders, products, suppliers);\n});\n\ntest(\"sequential using of 'with', soft relations test\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 12,\n\t\t\twith: {\n\t\t\t\tdetails: 3,\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(24);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n\n\tcheckSoftRelations(customers, details, employees, orders, products, suppliers);\n});\n"
  },
  {
    "path": "drizzle-seed/tests/sqlite/allDataTypesTest/sqliteSchema.ts",
    "content": "import { blob, integer, numeric, real, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const allDataTypes = sqliteTable('all_data_types', {\n\tintegerNumber: integer('integer_number', { mode: 'number' }),\n\tintegerBoolean: integer('integer_boolean', { mode: 'boolean' }),\n\tintegerTimestamp: integer('integer_timestamp', { mode: 'timestamp' }),\n\tintegerTimestampms: integer('integer_timestampms', { mode: 'timestamp_ms' }),\n\treal: real('real'),\n\ttext: text('text', { mode: 'text' }),\n\ttextJson: text('text_json', { mode: 'json' }),\n\tblobBigint: blob('blob_bigint', { mode: 'bigint' }),\n\tblobBuffer: blob('blob_buffer', { mode: 'buffer' }),\n\tblobJson: blob('blob_json', { mode: 'json' }),\n\tnumeric: numeric('numeric'),\n});\n"
  },
  {
    "path": "drizzle-seed/tests/sqlite/allDataTypesTest/sqlite_all_data_types.test.ts",
    "content": "import BetterSqlite3 from 'better-sqlite3';\nimport { sql } from 'drizzle-orm';\nimport type { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { afterAll, beforeAll, expect, test } from 'vitest';\nimport { seed } from '../../../src/index.ts';\nimport * as schema from './sqliteSchema.ts';\n\nlet client: BetterSqlite3.Database;\nlet db: BetterSQLite3Database;\n\nbeforeAll(async () => {\n\tclient = new BetterSqlite3(':memory:');\n\n\tdb = drizzle(client);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`all_data_types\\` (\n\t\\`integer_number\\` integer,\n\t\\`integer_boolean\\` integer,\n\t\\`integer_timestamp\\` integer,\n\t\\`integer_timestampms\\` integer,\n\t\\`real\\` real,\n\t\\`text\\` text,\n\t\\`text_json\\` text,\n\t\\`blob_bigint\\` blob,\n\t\\`blob_buffer\\` blob,\n\t\\`blob_json\\` blob,\n\t\\`numeric\\` numeric\n);\n\n    `),\n\t);\n});\n\nafterAll(async () => {\n\tclient.close();\n});\n\ntest('basic seed test', async () => {\n\t// migrate(db, { migrationsFolder: path.join(__dirname, \"sqliteMigrations\") });\n\n\tawait seed(db, schema, { count: 10000 });\n\n\tconst allDataTypes = await db.select().from(schema.allDataTypes);\n\t// every value in each 10 rows does not equal undefined.\n\tconst predicate = allDataTypes.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\n\texpect(predicate).toBe(true);\n\n\tclient.close();\n});\n"
  },
  {
    "path": "drizzle-seed/tests/sqlite/cyclicTables/cyclicTables.test.ts",
    "content": "import BetterSqlite3 from 'better-sqlite3';\nimport { sql } from 'drizzle-orm';\nimport type { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { afterAll, afterEach, beforeAll, expect, test } from 'vitest';\nimport { reset, seed } from '../../../src/index.ts';\nimport * as schema from './sqliteSchema.ts';\n\nlet client: BetterSqlite3.Database;\nlet db: BetterSQLite3Database;\n\nbeforeAll(async () => {\n\tclient = new BetterSqlite3(':memory:');\n\n\tdb = drizzle(client);\n\n\tdb.run(\n\t\tsql`\n\t\t\tcreate table model\n\t\t\t(\n\t\t\t    id             integer not null\n\t\t\t        primary key,\n\t\t\t    name           text    not null,\n\t\t\t    defaultImageId integer,\n\t\t\t\tforeign key (defaultImageId) references model_image\n\t\t\t);\n\t\t`,\n\t);\n\n\tdb.run(\n\t\tsql`\n\t\t\tcreate table model_image\n\t\t\t(\n\t\t\t    id      integer not null\n\t\t\t        primary key,\n\t\t\t    url     text    not null,\n\t\t\t    caption text,\n\t\t\t    modelId integer not null\n\t\t\t        references model\n\t\t\t);\n\t\t`,\n\t);\n\n\t// 3 tables case\n\tdb.run(\n\t\tsql`\n\t\t\tcreate table model1\n\t\t\t(\n\t\t\t    id             integer not null\n\t\t\t        primary key,\n\t\t\t    name           text    not null,\n\t\t\t    userId         integer,\n\t\t\t    defaultImageId integer,\n\t\t\t\tforeign key (defaultImageId) references model_image1,\n\t\t\t\tforeign key (userId) references user\n\t\t\t);\n\t\t`,\n\t);\n\n\tdb.run(\n\t\tsql`\n\t\t\tcreate table model_image1\n\t\t\t(\n\t\t\t    id      integer not null\n\t\t\t        primary key,\n\t\t\t    url     text    not null,\n\t\t\t    caption text,\n\t\t\t    modelId integer not null\n\t\t\t        references model1\n\t\t\t);\n\t\t`,\n\t);\n\n\tdb.run(\n\t\tsql`\n\t\t\tcreate table user\n\t\t\t(\n\t\t\t    id        integer not null\n\t\t\t        primary key,\n\t\t\t    name      text,\n\t\t\t    invitedBy integer\n\t\t\t        references user,\n\t\t\t    imageId   integer not null\n\t\t\t        references model_image1\n\t\t\t);\n\t\t`,\n\t);\n});\n\nafterEach(async () => {\n\tawait reset(db, schema);\n});\n\nafterAll(async () => {\n\tclient.close();\n});\n\ntest('2 cyclic tables test', async () => {\n\tawait seed(db, {\n\t\tmodelTable: schema.modelTable,\n\t\tmodelImageTable: schema.modelImageTable,\n\t});\n\n\tconst modelTable = await db.select().from(schema.modelTable);\n\tconst modelImageTable = await db.select().from(schema.modelImageTable);\n\n\texpect(modelTable.length).toBe(10);\n\tlet predicate = modelTable.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\texpect(modelImageTable.length).toBe(10);\n\tpredicate = modelImageTable.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('3 cyclic tables test', async () => {\n\tawait seed(db, {\n\t\tmodelTable1: schema.modelTable1,\n\t\tmodelImageTable1: schema.modelImageTable1,\n\t\tuser: schema.user,\n\t});\n\n\tconst modelTable1 = await db.select().from(schema.modelTable1);\n\tconst modelImageTable1 = await db.select().from(schema.modelImageTable1);\n\tconst user = await db.select().from(schema.user);\n\n\texpect(modelTable1.length).toBe(10);\n\tlet predicate = modelTable1.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\texpect(modelImageTable1.length).toBe(10);\n\tpredicate = modelImageTable1.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\texpect(user.length).toBe(10);\n\tpredicate = user.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n"
  },
  {
    "path": "drizzle-seed/tests/sqlite/cyclicTables/sqliteSchema.ts",
    "content": "import { relations } from 'drizzle-orm';\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport type { AnySQLiteColumn } from 'drizzle-orm/sqlite-core';\n\n// MODEL\nexport const modelTable = sqliteTable(\n\t'model',\n\t{\n\t\tid: integer().primaryKey(),\n\t\tname: text().notNull(),\n\t\tdefaultImageId: integer().references(() => modelImageTable.id),\n\t},\n);\n\nexport const modelRelations = relations(modelTable, ({ one, many }) => ({\n\timages: many(modelImageTable),\n\tdefaultImage: one(modelImageTable, {\n\t\tfields: [modelTable.defaultImageId],\n\t\treferences: [modelImageTable.id],\n\t}),\n}));\n\n// MODEL IMAGE\nexport const modelImageTable = sqliteTable(\n\t'model_image',\n\t{\n\t\tid: integer().primaryKey(),\n\t\turl: text().notNull(),\n\t\tcaption: text(),\n\t\tmodelId: integer()\n\t\t\t.notNull()\n\t\t\t.references((): AnySQLiteColumn => modelTable.id),\n\t},\n);\n\nexport const modelImageRelations = relations(modelImageTable, ({ one }) => ({\n\tmodel: one(modelTable, {\n\t\tfields: [modelImageTable.modelId],\n\t\treferences: [modelTable.id],\n\t}),\n}));\n\n// 3 tables case\nexport const modelTable1 = sqliteTable(\n\t'model1',\n\t{\n\t\tid: integer().primaryKey(),\n\t\tname: text().notNull(),\n\t\tuserId: integer()\n\t\t\t.references(() => user.id),\n\t\tdefaultImageId: integer().references(() => modelImageTable1.id),\n\t},\n);\n\nexport const modelImageTable1 = sqliteTable(\n\t'model_image1',\n\t{\n\t\tid: integer().primaryKey(),\n\t\turl: text().notNull(),\n\t\tcaption: text(),\n\t\tmodelId: integer().notNull()\n\t\t\t.references((): AnySQLiteColumn => modelTable1.id),\n\t},\n);\n\nexport const user = sqliteTable(\n\t'user',\n\t{\n\t\tid: integer().primaryKey(),\n\t\tname: text(),\n\t\tinvitedBy: integer().references((): AnySQLiteColumn => user.id),\n\t\timageId: integer()\n\t\t\t.notNull()\n\t\t\t.references((): AnySQLiteColumn => modelImageTable1.id),\n\t},\n);\n"
  },
  {
    "path": "drizzle-seed/tests/sqlite/softRelationsTest/softRelations.test.ts",
    "content": "import BetterSqlite3 from 'better-sqlite3';\nimport { sql } from 'drizzle-orm';\nimport type { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { afterAll, afterEach, beforeAll, expect, test } from 'vitest';\nimport { reset, seed } from '../../../src/index.ts';\nimport * as schema from './sqliteSchema.ts';\n\nlet client: BetterSqlite3.Database;\nlet db: BetterSQLite3Database;\n\nbeforeAll(async () => {\n\tclient = new BetterSqlite3(':memory:');\n\n\tdb = drizzle(client);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`customer\\` (\n\t\\`id\\` text PRIMARY KEY NOT NULL,\n\t\\`company_name\\` text NOT NULL,\n\t\\`contact_name\\` text NOT NULL,\n\t\\`contact_title\\` text NOT NULL,\n\t\\`address\\` text NOT NULL,\n\t\\`city\\` text NOT NULL,\n\t\\`postal_code\\` text,\n\t\\`region\\` text,\n\t\\`country\\` text NOT NULL,\n\t\\`phone\\` text NOT NULL,\n\t\\`fax\\` text\n);\n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`order_detail\\` (\n\t\\`unit_price\\` numeric NOT NULL,\n\t\\`quantity\\` integer NOT NULL,\n\t\\`discount\\` numeric NOT NULL,\n\t\\`order_id\\` integer NOT NULL,\n\t\\`product_id\\` integer NOT NULL\n);\n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`employee\\` (\n\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\t\\`last_name\\` text NOT NULL,\n\t\\`first_name\\` text,\n\t\\`title\\` text NOT NULL,\n\t\\`title_of_courtesy\\` text NOT NULL,\n\t\\`birth_date\\` integer NOT NULL,\n\t\\`hire_date\\` integer NOT NULL,\n\t\\`address\\` text NOT NULL,\n\t\\`city\\` text NOT NULL,\n\t\\`postal_code\\` text NOT NULL,\n\t\\`country\\` text NOT NULL,\n\t\\`home_phone\\` text NOT NULL,\n\t\\`extension\\` integer NOT NULL,\n\t\\`notes\\` text NOT NULL,\n\t\\`reports_to\\` integer,\n\t\\`photo_path\\` text\n);        \n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`order\\` (\n\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\t\\`order_date\\` integer NOT NULL,\n\t\\`required_date\\` integer NOT NULL,\n\t\\`shipped_date\\` integer,\n\t\\`ship_via\\` integer NOT NULL,\n\t\\`freight\\` numeric NOT NULL,\n\t\\`ship_name\\` text NOT NULL,\n\t\\`ship_city\\` text NOT NULL,\n\t\\`ship_region\\` text,\n\t\\`ship_postal_code\\` text,\n\t\\`ship_country\\` text NOT NULL,\n\t\\`customer_id\\` text NOT NULL,\n\t\\`employee_id\\` integer NOT NULL\n);        \n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`product\\` (\n\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\\`name\\` text NOT NULL,\n\t\\`quantity_per_unit\\` text NOT NULL,\n\t\\`unit_price\\` numeric NOT NULL,\n\t\\`units_in_stock\\` integer NOT NULL,\n\t\\`units_on_order\\` integer NOT NULL,\n\t\\`reorder_level\\` integer NOT NULL,\n\t\\`discontinued\\` integer NOT NULL,\n\t\\`supplier_id\\` integer NOT NULL\n);        \n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`supplier\\` (\n\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\\`company_name\\` text NOT NULL,\n\t\\`contact_name\\` text NOT NULL,\n\t\\`contact_title\\` text NOT NULL,\n\t\\`address\\` text NOT NULL,\n\t\\`city\\` text NOT NULL,\n\t\\`region\\` text,\n\t\\`postal_code\\` text NOT NULL,\n\t\\`country\\` text NOT NULL,\n\t\\`phone\\` text NOT NULL\n);        \n    `),\n\t);\n});\n\nafterAll(async () => {\n\tclient.close();\n});\n\nafterEach(async () => {\n\tawait reset(db, schema);\n});\n\nconst checkSoftRelations = (\n\tcustomers: (typeof schema.customers.$inferSelect)[],\n\tdetails: (typeof schema.details.$inferSelect)[],\n\temployees: (typeof schema.employees.$inferSelect)[],\n\torders: (typeof schema.orders.$inferSelect)[],\n\tproducts: (typeof schema.products.$inferSelect)[],\n\tsuppliers: (typeof schema.suppliers.$inferSelect)[],\n) => {\n\t// employees soft relations check\n\tconst employeeIds = new Set(employees.map((employee) => employee.id));\n\tconst employeesPredicate = employees.every((employee) =>\n\t\temployee.reportsTo !== null && employeeIds.has(employee.reportsTo)\n\t);\n\texpect(employeesPredicate).toBe(true);\n\n\t// orders soft relations check\n\tconst customerIds = new Set(customers.map((customer) => customer.id));\n\tconst ordersPredicate1 = orders.every((order) => order.customerId !== null && customerIds.has(order.customerId));\n\texpect(ordersPredicate1).toBe(true);\n\n\tconst ordersPredicate2 = orders.every((order) => order.employeeId !== null && employeeIds.has(order.employeeId));\n\texpect(ordersPredicate2).toBe(true);\n\n\t// product soft relations check\n\tconst supplierIds = new Set(suppliers.map((supplier) => supplier.id));\n\tconst productsPredicate = products.every((product) =>\n\t\tproduct.supplierId !== null && supplierIds.has(product.supplierId)\n\t);\n\texpect(productsPredicate).toBe(true);\n\n\t// details soft relations check\n\tconst orderIds = new Set(orders.map((order) => order.id));\n\tconst detailsPredicate1 = details.every((detail) => detail.orderId !== null && orderIds.has(detail.orderId));\n\texpect(detailsPredicate1).toBe(true);\n\n\tconst productIds = new Set(products.map((product) => product.id));\n\tconst detailsPredicate2 = details.every((detail) => detail.productId !== null && productIds.has(detail.productId));\n\texpect(detailsPredicate2).toBe(true);\n};\n\ntest('basic seed, soft relations test', async () => {\n\tawait seed(db, schema);\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(10);\n\texpect(details.length).toBe(10);\n\texpect(employees.length).toBe(10);\n\texpect(orders.length).toBe(10);\n\texpect(products.length).toBe(10);\n\texpect(suppliers.length).toBe(10);\n\n\tcheckSoftRelations(customers, details, employees, orders, products, suppliers);\n});\n\ntest(\"redefine(refine) orders count using 'with' in customers, soft relations test\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 13,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n\n\tcheckSoftRelations(customers, details, employees, orders, products, suppliers);\n});\n\ntest(\"sequential using of 'with', soft relations test\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 12,\n\t\t\twith: {\n\t\t\t\tdetails: 3,\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(24);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n\n\tcheckSoftRelations(customers, details, employees, orders, products, suppliers);\n});\n"
  },
  {
    "path": "drizzle-seed/tests/sqlite/softRelationsTest/sqliteSchema.ts",
    "content": "import { relations } from 'drizzle-orm';\nimport { integer, numeric, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const customers = sqliteTable('customer', {\n\tid: text('id').primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tpostalCode: text('postal_code'),\n\tregion: text('region'),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n\tfax: text('fax'),\n});\n\nexport const employees = sqliteTable(\n\t'employee',\n\t{\n\t\tid: integer('id').primaryKey(),\n\t\tlastName: text('last_name').notNull(),\n\t\tfirstName: text('first_name'),\n\t\ttitle: text('title').notNull(),\n\t\ttitleOfCourtesy: text('title_of_courtesy').notNull(),\n\t\tbirthDate: integer('birth_date', { mode: 'timestamp' }).notNull(),\n\t\thireDate: integer('hire_date', { mode: 'timestamp' }).notNull(),\n\t\taddress: text('address').notNull(),\n\t\tcity: text('city').notNull(),\n\t\tpostalCode: text('postal_code').notNull(),\n\t\tcountry: text('country').notNull(),\n\t\thomePhone: text('home_phone').notNull(),\n\t\textension: integer('extension').notNull(),\n\t\tnotes: text('notes').notNull(),\n\t\treportsTo: integer('reports_to'),\n\t\tphotoPath: text('photo_path'),\n\t},\n);\n\nexport const employeesRelations = relations(employees, ({ one }) => ({\n\temployee: one(employees, {\n\t\tfields: [employees.reportsTo],\n\t\treferences: [employees.id],\n\t}),\n}));\n\nexport const orders = sqliteTable('order', {\n\tid: integer('id').primaryKey(),\n\torderDate: integer('order_date', { mode: 'timestamp' }).notNull(),\n\trequiredDate: integer('required_date', { mode: 'timestamp' }).notNull(),\n\tshippedDate: integer('shipped_date', { mode: 'timestamp' }),\n\tshipVia: integer('ship_via').notNull(),\n\tfreight: numeric('freight').notNull(),\n\tshipName: text('ship_name').notNull(),\n\tshipCity: text('ship_city').notNull(),\n\tshipRegion: text('ship_region'),\n\tshipPostalCode: text('ship_postal_code'),\n\tshipCountry: text('ship_country').notNull(),\n\n\tcustomerId: text('customer_id').notNull(),\n\n\temployeeId: integer('employee_id').notNull(),\n});\n\nexport const ordersRelations = relations(orders, ({ one }) => ({\n\tcustomer: one(customers, {\n\t\tfields: [orders.customerId],\n\t\treferences: [customers.id],\n\t}),\n\temployee: one(employees, {\n\t\tfields: [orders.employeeId],\n\t\treferences: [employees.id],\n\t}),\n}));\n\nexport const suppliers = sqliteTable('supplier', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tregion: text('region'),\n\tpostalCode: text('postal_code').notNull(),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n});\n\nexport const products = sqliteTable('product', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tquantityPerUnit: text('quantity_per_unit').notNull(),\n\tunitPrice: numeric('unit_price').notNull(),\n\tunitsInStock: integer('units_in_stock').notNull(),\n\tunitsOnOrder: integer('units_on_order').notNull(),\n\treorderLevel: integer('reorder_level').notNull(),\n\tdiscontinued: integer('discontinued').notNull(),\n\n\tsupplierId: integer('supplier_id').notNull(),\n});\n\nexport const productsRelations = relations(products, ({ one }) => ({\n\tsupplier: one(suppliers, {\n\t\tfields: [products.supplierId],\n\t\treferences: [suppliers.id],\n\t}),\n}));\n\nexport const details = sqliteTable('order_detail', {\n\tunitPrice: numeric('unit_price').notNull(),\n\tquantity: integer('quantity').notNull(),\n\tdiscount: numeric('discount').notNull(),\n\n\torderId: integer('order_id').notNull(),\n\n\tproductId: integer('product_id').notNull(),\n});\n\nexport const detailsRelations = relations(details, ({ one }) => ({\n\torder: one(orders, {\n\t\tfields: [details.orderId],\n\t\treferences: [orders.id],\n\t}),\n\tproduct: one(products, {\n\t\tfields: [details.productId],\n\t\treferences: [products.id],\n\t}),\n}));\n"
  },
  {
    "path": "drizzle-seed/tests/sqlite/sqlite.test.ts",
    "content": "import BetterSqlite3 from 'better-sqlite3';\nimport { relations, sql } from 'drizzle-orm';\nimport type { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { afterAll, afterEach, beforeAll, expect, test, vi } from 'vitest';\nimport { reset, seed } from '../../src/index.ts';\nimport * as schema from './sqliteSchema.ts';\n\nlet client: BetterSqlite3.Database;\nlet db: BetterSQLite3Database;\n\nbeforeAll(async () => {\n\tclient = new BetterSqlite3(':memory:');\n\n\tdb = drizzle(client);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`customer\\` (\n\t\\`id\\` text PRIMARY KEY NOT NULL,\n\t\\`company_name\\` text NOT NULL,\n\t\\`contact_name\\` text NOT NULL,\n\t\\`contact_title\\` text NOT NULL,\n\t\\`address\\` text NOT NULL,\n\t\\`city\\` text NOT NULL,\n\t\\`postal_code\\` text,\n\t\\`region\\` text,\n\t\\`country\\` text NOT NULL,\n\t\\`phone\\` text NOT NULL,\n\t\\`fax\\` text\n);\n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`order_detail\\` (\n\t\\`unit_price\\` numeric NOT NULL,\n\t\\`quantity\\` integer NOT NULL,\n\t\\`discount\\` numeric NOT NULL,\n\t\\`order_id\\` integer NOT NULL,\n\t\\`product_id\\` integer NOT NULL,\n\tFOREIGN KEY (\\`order_id\\`) REFERENCES \\`order\\`(\\`id\\`) ON UPDATE no action ON DELETE cascade,\n\tFOREIGN KEY (\\`product_id\\`) REFERENCES \\`product\\`(\\`id\\`) ON UPDATE no action ON DELETE cascade\n);\n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`employee\\` (\n\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\t\\`last_name\\` text NOT NULL,\n\t\\`first_name\\` text,\n\t\\`title\\` text NOT NULL,\n\t\\`title_of_courtesy\\` text NOT NULL,\n\t\\`birth_date\\` integer NOT NULL,\n\t\\`hire_date\\` integer NOT NULL,\n\t\\`address\\` text NOT NULL,\n\t\\`city\\` text NOT NULL,\n\t\\`postal_code\\` text NOT NULL,\n\t\\`country\\` text NOT NULL,\n\t\\`home_phone\\` text NOT NULL,\n\t\\`extension\\` integer NOT NULL,\n\t\\`notes\\` text NOT NULL,\n\t\\`reports_to\\` integer,\n\t\\`photo_path\\` text,\n\tFOREIGN KEY (\\`reports_to\\`) REFERENCES \\`employee\\`(\\`id\\`) ON UPDATE no action ON DELETE no action\n);        \n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`order\\` (\n\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\t\\`order_date\\` integer NOT NULL,\n\t\\`required_date\\` integer NOT NULL,\n\t\\`shipped_date\\` integer,\n\t\\`ship_via\\` integer NOT NULL,\n\t\\`freight\\` numeric NOT NULL,\n\t\\`ship_name\\` text NOT NULL,\n\t\\`ship_city\\` text NOT NULL,\n\t\\`ship_region\\` text,\n\t\\`ship_postal_code\\` text,\n\t\\`ship_country\\` text NOT NULL,\n\t\\`customer_id\\` text NOT NULL,\n\t\\`employee_id\\` integer NOT NULL,\n\tFOREIGN KEY (\\`customer_id\\`) REFERENCES \\`customer\\`(\\`id\\`) ON UPDATE no action ON DELETE cascade,\n\tFOREIGN KEY (\\`employee_id\\`) REFERENCES \\`employee\\`(\\`id\\`) ON UPDATE no action ON DELETE cascade\n);        \n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`product\\` (\n\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\\`name\\` text NOT NULL,\n\t\\`quantity_per_unit\\` text NOT NULL,\n\t\\`unit_price\\` numeric NOT NULL,\n\t\\`units_in_stock\\` integer NOT NULL,\n\t\\`units_on_order\\` integer NOT NULL,\n\t\\`reorder_level\\` integer NOT NULL,\n\t\\`discontinued\\` integer NOT NULL,\n\t\\`supplier_id\\` integer NOT NULL,\n\tFOREIGN KEY (\\`supplier_id\\`) REFERENCES \\`supplier\\`(\\`id\\`) ON UPDATE no action ON DELETE cascade\n);        \n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`supplier\\` (\n\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\\`company_name\\` text NOT NULL,\n\t\\`contact_name\\` text NOT NULL,\n\t\\`contact_title\\` text NOT NULL,\n\t\\`address\\` text NOT NULL,\n\t\\`city\\` text NOT NULL,\n\t\\`region\\` text,\n\t\\`postal_code\\` text NOT NULL,\n\t\\`country\\` text NOT NULL,\n\t\\`phone\\` text NOT NULL\n);        \n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`users\\` (\n\t\\`id\\` integer PRIMARY KEY,\n\t\\`name\\` text,\n\t\\`invitedBy\\` integer,\n\tFOREIGN KEY (\\`invitedBy\\`) REFERENCES \\`users\\`(\\`id\\`) ON UPDATE no action ON DELETE cascade\n);        \n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`posts\\` (\n\t\\`id\\` integer PRIMARY KEY,\n\t\\`name\\` text,\n\t\\`content\\` text,\n\t\\`userId\\` integer,\n\tFOREIGN KEY (\\`userId\\`) REFERENCES \\`users\\`(\\`id\\`) ON UPDATE no action ON DELETE cascade\n);        \n    `),\n\t);\n});\n\nafterAll(async () => {\n\tclient.close();\n});\n\nafterEach(async () => {\n\tawait reset(db, schema);\n});\n\ntest('basic seed test', async () => {\n\tawait seed(db, schema);\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(10);\n\texpect(details.length).toBe(10);\n\texpect(employees.length).toBe(10);\n\texpect(orders.length).toBe(10);\n\texpect(products.length).toBe(10);\n\texpect(suppliers.length).toBe(10);\n});\n\ntest('seed with options.count:11 test', async () => {\n\tawait seed(db, schema, { count: 11 });\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(11);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(11);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('redefine(refine) customers count', async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 12,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(12);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(11);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('redefine(refine) all tables count', async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 12,\n\t\t},\n\t\tdetails: {\n\t\t\tcount: 13,\n\t\t},\n\t\temployees: {\n\t\t\tcount: 14,\n\t\t},\n\t\torders: {\n\t\t\tcount: 15,\n\t\t},\n\t\tproducts: {\n\t\t\tcount: 16,\n\t\t},\n\t\tsuppliers: {\n\t\t\tcount: 17,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(12);\n\texpect(details.length).toBe(13);\n\texpect(employees.length).toBe(14);\n\texpect(orders.length).toBe(15);\n\texpect(products.length).toBe(16);\n\texpect(suppliers.length).toBe(17);\n});\n\ntest(\"redefine(refine) orders count using 'with' in customers\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 13,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest(\"sequential using of 'with'\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 12,\n\t\t\twith: {\n\t\t\t\tdetails: 3,\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(24);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('overlapping a foreign key constraint with a one-to-many relation', async () => {\n\tconst postsRelation = relations(schema.posts, ({ one }) => ({\n\t\tuser: one(schema.users, { fields: [schema.posts.userId], references: [schema.users.id] }),\n\t}));\n\n\tconst consoleMock = vi.spyOn(console, 'warn').mockImplementation(() => {});\n\n\tawait reset(db, { users: schema.users, posts: schema.posts, postsRelation });\n\tawait seed(db, { users: schema.users, posts: schema.posts, postsRelation });\n\t// expecting to get a warning\n\texpect(consoleMock).toBeCalled();\n\texpect(consoleMock).toBeCalledWith(expect.stringMatching(/^You are providing a one-to-many relation.+/));\n\n\tconst users = await db.select().from(schema.users);\n\tconst posts = await db.select().from(schema.posts);\n\n\texpect(users.length).toBe(10);\n\tlet predicate = users.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\texpect(posts.length).toBe(10);\n\tpredicate = posts.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n"
  },
  {
    "path": "drizzle-seed/tests/sqlite/sqliteSchema.ts",
    "content": "import { foreignKey, integer, numeric, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const customers = sqliteTable('customer', {\n\tid: text('id').primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tpostalCode: text('postal_code'),\n\tregion: text('region'),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n\tfax: text('fax'),\n});\n\nexport const employees = sqliteTable(\n\t'employee',\n\t{\n\t\tid: integer('id').primaryKey(),\n\t\tlastName: text('last_name').notNull(),\n\t\tfirstName: text('first_name'),\n\t\ttitle: text('title').notNull(),\n\t\ttitleOfCourtesy: text('title_of_courtesy').notNull(),\n\t\tbirthDate: integer('birth_date', { mode: 'timestamp' }).notNull(),\n\t\thireDate: integer('hire_date', { mode: 'timestamp' }).notNull(),\n\t\taddress: text('address').notNull(),\n\t\tcity: text('city').notNull(),\n\t\tpostalCode: text('postal_code').notNull(),\n\t\tcountry: text('country').notNull(),\n\t\thomePhone: text('home_phone').notNull(),\n\t\textension: integer('extension').notNull(),\n\t\tnotes: text('notes').notNull(),\n\t\treportsTo: integer('reports_to'),\n\t\tphotoPath: text('photo_path'),\n\t},\n\t(table) => ({\n\t\treportsToFk: foreignKey(() => ({\n\t\t\tcolumns: [table.reportsTo],\n\t\t\tforeignColumns: [table.id],\n\t\t})),\n\t}),\n);\n\nexport const orders = sqliteTable('order', {\n\tid: integer('id').primaryKey(),\n\torderDate: integer('order_date', { mode: 'timestamp' }).notNull(),\n\trequiredDate: integer('required_date', { mode: 'timestamp' }).notNull(),\n\tshippedDate: integer('shipped_date', { mode: 'timestamp' }),\n\tshipVia: integer('ship_via').notNull(),\n\tfreight: numeric('freight').notNull(),\n\tshipName: text('ship_name').notNull(),\n\tshipCity: text('ship_city').notNull(),\n\tshipRegion: text('ship_region'),\n\tshipPostalCode: text('ship_postal_code'),\n\tshipCountry: text('ship_country').notNull(),\n\n\tcustomerId: text('customer_id')\n\t\t.notNull()\n\t\t.references(() => customers.id, { onDelete: 'cascade' }),\n\n\temployeeId: integer('employee_id')\n\t\t.notNull()\n\t\t.references(() => employees.id, { onDelete: 'cascade' }),\n});\n\nexport const suppliers = sqliteTable('supplier', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tregion: text('region'),\n\tpostalCode: text('postal_code').notNull(),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n});\n\nexport const products = sqliteTable('product', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tquantityPerUnit: text('quantity_per_unit').notNull(),\n\tunitPrice: numeric('unit_price').notNull(),\n\tunitsInStock: integer('units_in_stock').notNull(),\n\tunitsOnOrder: integer('units_on_order').notNull(),\n\treorderLevel: integer('reorder_level').notNull(),\n\tdiscontinued: integer('discontinued').notNull(),\n\n\tsupplierId: integer('supplier_id')\n\t\t.notNull()\n\t\t.references(() => suppliers.id, { onDelete: 'cascade' }),\n});\n\nexport const details = sqliteTable('order_detail', {\n\tunitPrice: numeric('unit_price').notNull(),\n\tquantity: integer('quantity').notNull(),\n\tdiscount: numeric('discount').notNull(),\n\n\torderId: integer('order_id')\n\t\t.notNull()\n\t\t.references(() => orders.id, { onDelete: 'cascade' }),\n\n\tproductId: integer('product_id')\n\t\t.notNull()\n\t\t.references(() => products.id, { onDelete: 'cascade' }),\n});\n\nexport const users = sqliteTable(\n\t'users',\n\t{\n\t\tid: integer().primaryKey(),\n\t\tname: text(),\n\t\tinvitedBy: integer(),\n\t},\n\t(table) => ({\n\t\treportsToFk: foreignKey(() => ({\n\t\t\tcolumns: [table.invitedBy],\n\t\t\tforeignColumns: [table.id],\n\t\t})),\n\t}),\n);\n\nexport const posts = sqliteTable(\n\t'posts',\n\t{\n\t\tid: integer().primaryKey(),\n\t\tname: text(),\n\t\tcontent: text(),\n\t\tuserId: integer().references(() => users.id),\n\t},\n);\n"
  },
  {
    "path": "drizzle-seed/tsconfig.build.json",
    "content": "{\n\t\"extends\": \"./tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"rootDir\": \"src\"\n\t},\n\t\"include\": [\"src\"]\n}\n"
  },
  {
    "path": "drizzle-seed/tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t\"isolatedModules\": true,\n\t\t\"composite\": false,\n\t\t\"target\": \"esnext\",\n\t\t\"module\": \"esnext\",\n\t\t\"moduleResolution\": \"bundler\",\n\t\t\"lib\": [\"es2020\", \"es2018\", \"es2017\", \"es7\", \"es6\", \"es5\", \"es2022\"],\n\t\t\"declarationMap\": false,\n\t\t\"sourceMap\": true,\n\t\t\"allowJs\": true,\n\t\t\"incremental\": false,\n\t\t\"stripInternal\": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */\n\t\t\"allowSyntheticDefaultImports\": true, /* Allow 'import x from y' when a module doesn't have a default export. */\n\t\t\"esModuleInterop\": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */\n\t\t\"forceConsistentCasingInFileNames\": true, /* Ensure that casing is correct in imports. */\n\t\t\"strict\": true, /* Enable all strict type-checking options. */\n\t\t\"noImplicitAny\": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */\n\t\t\"strictNullChecks\": true, /* When type checking, take into account 'null' and 'undefined'. */\n\t\t\"strictFunctionTypes\": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */\n\t\t\"strictBindCallApply\": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */\n\t\t\"strictPropertyInitialization\": true, /* Check for class properties that are declared but not set in the constructor. */\n\t\t\"noImplicitThis\": true, /* Enable error reporting when 'this' is given the type 'any'. */\n\t\t\"useUnknownInCatchVariables\": true, /* Default catch clause variables as 'unknown' instead of 'any'. */\n\t\t\"alwaysStrict\": true, /* Ensure 'use strict' is always emitted. */\n\t\t\"exactOptionalPropertyTypes\": false, /* Interpret optional property types as written, rather than adding 'undefined'. */\n\t\t\"noImplicitReturns\": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */\n\t\t\"noFallthroughCasesInSwitch\": true, /* Enable error reporting for fallthrough cases in switch statements. */\n\t\t\"noUncheckedIndexedAccess\": true, /* Add 'undefined' to a type when accessed using an index. */\n\t\t\"noImplicitOverride\": true, /* Ensure overriding members in derived classes are marked with an override modifier. */\n\t\t\"noPropertyAccessFromIndexSignature\": true, /* Enforces using indexed accessors for keys declared using an indexed type. */\n\t\t\"allowUnusedLabels\": false, /* Disable error reporting for unused labels. */\n\t\t\"allowUnreachableCode\": false, /* Disable error reporting for unreachable code. */\n\t\t\"skipLibCheck\": true, /* Skip type checking all .d.ts files. */\n\t\t\"noErrorTruncation\": true, /* Disable truncating types in error messages. */\n\t\t\"checkJs\": true,\n\t\t\"noEmit\": true,\n\t\t\"allowImportingTsExtensions\": true,\n\t\t\"outDir\": \"dist\",\n\t\t\"baseUrl\": \".\",\n\t\t\"declaration\": true,\n\t\t\"paths\": {\n\t\t\t\"~/*\": [\"src/*\"]\n\t\t}\n\t},\n\t\"exclude\": [\"**/dist\", \"src/dev\"],\n\t\"include\": [\"src\", \"*.ts\", \"tests\"]\n}\n"
  },
  {
    "path": "drizzle-seed/type-tests/mysql.ts",
    "content": "import type { MySqlColumn } from 'drizzle-orm/mysql-core';\nimport { int, mysqlTable, text } from 'drizzle-orm/mysql-core';\nimport { drizzle as mysql2Drizzle } from 'drizzle-orm/mysql2';\nimport { reset, seed } from '../src/index.ts';\n\nconst mysqlUsers = mysqlTable('users', {\n\tid: int().primaryKey().autoincrement(),\n\tname: text(),\n\tinviteId: int('invite_id').references((): MySqlColumn => mysqlUsers.id),\n});\n\n{\n\tconst db = mysql2Drizzle('');\n\n\tawait seed(db, { users: mysqlUsers });\n\tawait reset(db, { users: mysqlUsers });\n}\n"
  },
  {
    "path": "drizzle-seed/type-tests/pg.ts",
    "content": "import { drizzle as nodePostgresDrizzle } from 'drizzle-orm/node-postgres';\nimport type { PgColumn } from 'drizzle-orm/pg-core';\nimport { integer, pgTable, text } from 'drizzle-orm/pg-core';\nimport { drizzle as pgliteDrizzle } from 'drizzle-orm/pglite';\nimport { drizzle as postgresJsDrizzle } from 'drizzle-orm/postgres-js';\nimport { reset, seed } from '../src/index.ts';\n\nconst pgUsers = pgTable('users', {\n\tid: integer().primaryKey().generatedAlwaysAsIdentity(),\n\tname: text(),\n\tinviteId: integer('invite_id').references((): PgColumn => pgUsers.id),\n});\n\n{\n\tconst db0 = nodePostgresDrizzle('', { schema: { users: pgUsers } });\n\n\tawait seed(db0, { users: pgUsers });\n\tawait reset(db0, { users: pgUsers });\n\n\tconst db1 = nodePostgresDrizzle('');\n\n\tawait seed(db1, { users: pgUsers });\n\tawait reset(db1, { users: pgUsers });\n}\n\n{\n\tconst db0 = pgliteDrizzle('', { schema: { users: pgUsers } });\n\n\tawait seed(db0, { users: pgUsers });\n\tawait reset(db0, { users: pgUsers });\n\n\tconst db1 = pgliteDrizzle('');\n\n\tawait seed(db1, { users: pgUsers });\n\tawait reset(db1, { users: pgUsers });\n}\n\n{\n\tconst db0 = postgresJsDrizzle('', { schema: { users: pgUsers } });\n\n\tawait seed(db0, { users: pgUsers });\n\tawait reset(db0, { users: pgUsers });\n\n\tconst db1 = postgresJsDrizzle('');\n\n\tawait seed(db1, { users: pgUsers });\n\tawait reset(db1, { users: pgUsers });\n}\n"
  },
  {
    "path": "drizzle-seed/type-tests/sqlite.ts",
    "content": "import { drizzle as betterSqlite3Drizzle } from 'drizzle-orm/better-sqlite3';\nimport type { SQLiteColumn } from 'drizzle-orm/sqlite-core';\nimport { int, sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport { reset, seed } from '../src/index.ts';\n\nconst mysqlUsers = sqliteTable('users', {\n\tid: int().primaryKey(),\n\tname: text(),\n\tinviteId: int('invite_id').references((): SQLiteColumn => mysqlUsers.id),\n});\n\n{\n\tconst db = betterSqlite3Drizzle('');\n\n\tawait seed(db, { users: mysqlUsers });\n\tawait reset(db, { users: mysqlUsers });\n}\n"
  },
  {
    "path": "drizzle-seed/type-tests/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.build.json\",\n\t\"compilerOptions\": {\n\t\t\"composite\": false,\n\t\t\"noEmit\": true,\n\t\t\"rootDir\": \"..\",\n\t\t\"outDir\": \"./.cache\"\n\t},\n\t\"include\": [\".\", \"../src\"],\n\t\"exclude\": [\"**/playground\"]\n}\n"
  },
  {
    "path": "drizzle-seed/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n\ttest: {\n\t\tinclude: [\n\t\t\t'./tests/pg/**/*.test.ts',\n\t\t\t'./tests/mysql/**/*.test.ts',\n\t\t\t'./tests/sqlite/**/*.test.ts',\n\t\t],\n\t\texclude: [],\n\t\ttypecheck: {\n\t\t\ttsconfig: 'tsconfig.json',\n\t\t},\n\t\ttestTimeout: 100000,\n\t\thookTimeout: 100000,\n\t\tisolate: true,\n\t\tpoolOptions: {\n\t\t\tthreads: {\n\t\t\t\tsingleThread: true,\n\t\t\t},\n\t\t},\n\t\tmaxWorkers: 1,\n\t\tfileParallelism: false,\n\t},\n});\n"
  },
  {
    "path": "drizzle-typebox/README.md",
    "content": "`drizzle-typebox` is a plugin for [Drizzle ORM](https://github.com/drizzle-team/drizzle-orm) that allows you to generate [@sinclair/typebox](https://github.com/sinclairzx81/typebox) schemas from Drizzle ORM schemas.\n\n**Features**\n\n- Create a select schema for tables, views and enums.\n- Create insert and update schemas for tables.\n- Supports all dialects: PostgreSQL, MySQL and SQLite.\n\n# Usage\n\n```ts\nimport { pgEnum, pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-typebox';\nimport { Type } from '@sinclair/typebox';\nimport { Value } from '@sinclair/typebox/value';\n\nconst users = pgTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n\trole: text('role', { enum: ['admin', 'user'] }).notNull(),\n\tcreatedAt: timestamp('created_at').notNull().defaultNow(),\n});\n\n// Schema for inserting a user - can be used to validate API requests\nconst insertUserSchema = createInsertSchema(users);\n\n// Schema for updating a user - can be used to validate API requests\nconst updateUserSchema = createUpdateSchema(users);\n\n// Schema for selecting a user - can be used to validate API responses\nconst selectUserSchema = createSelectSchema(users);\n\n// Overriding the fields\nconst insertUserSchema = createInsertSchema(users, {\n\trole: Type.String(),\n});\n\n// Refining the fields - useful if you want to change the fields before they become nullable/optional in the final schema\nconst insertUserSchema = createInsertSchema(users, {\n\tid: (schema) => Type.Number({ ...schema, minimum: 0 }),\n\trole: Type.String(),\n});\n\n// Usage\n\nconst isUserValid: boolean = Value.Check(insertUserSchema, {\n\tname: 'John Doe',\n\temail: 'johndoe@test.com',\n\trole: 'admin',\n});\n```\n"
  },
  {
    "path": "drizzle-typebox/package.json",
    "content": "{\n\t\"name\": \"drizzle-typebox\",\n\t\"version\": \"0.3.3\",\n\t\"description\": \"Generate Typebox schemas from Drizzle ORM schemas\",\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"build\": \"tsx scripts/build.ts\",\n\t\t\"b\": \"pnpm build\",\n\t\t\"test:types\": \"cd tests && tsc\",\n\t\t\"pack\": \"(cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz\",\n\t\t\"publish\": \"npm publish package.tgz\",\n\t\t\"test\": \"vitest run\"\n\t},\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./index.d.mts\",\n\t\t\t\t\"default\": \"./index.mjs\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./index.d.cjs\",\n\t\t\t\t\"default\": \"./index.cjs\"\n\t\t\t},\n\t\t\t\"types\": \"./index.d.ts\",\n\t\t\t\"default\": \"./index.mjs\"\n\t\t}\n\t},\n\t\"main\": \"./index.cjs\",\n\t\"module\": \"./index.mjs\",\n\t\"types\": \"./index.d.ts\",\n\t\"publishConfig\": {\n\t\t\"provenance\": true\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git+https://github.com/drizzle-team/drizzle-orm.git\"\n\t},\n\t\"keywords\": [\n\t\t\"typebox\",\n\t\t\"validate\",\n\t\t\"validation\",\n\t\t\"schema\",\n\t\t\"drizzle\",\n\t\t\"orm\",\n\t\t\"pg\",\n\t\t\"mysql\",\n\t\t\"postgresql\",\n\t\t\"postgres\",\n\t\t\"sqlite\",\n\t\t\"database\",\n\t\t\"sql\",\n\t\t\"typescript\",\n\t\t\"ts\"\n\t],\n\t\"author\": \"Drizzle Team\",\n\t\"license\": \"Apache-2.0\",\n\t\"peerDependencies\": {\n\t\t\"@sinclair/typebox\": \">=0.34.8\",\n\t\t\"drizzle-orm\": \">=0.36.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@rollup/plugin-typescript\": \"^11.1.0\",\n\t\t\"@sinclair/typebox\": \"^0.34.8\",\n\t\t\"@types/node\": \"^18.15.10\",\n\t\t\"cpy\": \"^10.1.0\",\n\t\t\"drizzle-orm\": \"link:../drizzle-orm/dist\",\n\t\t\"json-rules-engine\": \"^7.3.1\",\n\t\t\"rimraf\": \"^5.0.0\",\n\t\t\"rollup\": \"^3.29.5\",\n\t\t\"vite-tsconfig-paths\": \"^4.3.2\",\n\t\t\"vitest\": \"^3.1.3\",\n\t\t\"zx\": \"^7.2.2\"\n\t}\n}\n"
  },
  {
    "path": "drizzle-typebox/rollup.config.ts",
    "content": "import typescript from '@rollup/plugin-typescript';\nimport { defineConfig } from 'rollup';\n\nexport default defineConfig([\n\t{\n\t\tinput: 'src/index.ts',\n\t\toutput: [\n\t\t\t{\n\t\t\t\tformat: 'esm',\n\t\t\t\tdir: 'dist',\n\t\t\t\tentryFileNames: '[name].mjs',\n\t\t\t\tchunkFileNames: '[name]-[hash].mjs',\n\t\t\t\tsourcemap: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tformat: 'cjs',\n\t\t\t\tdir: 'dist',\n\t\t\t\tentryFileNames: '[name].cjs',\n\t\t\t\tchunkFileNames: '[name]-[hash].cjs',\n\t\t\t\tsourcemap: true,\n\t\t\t},\n\t\t],\n\t\texternal: [\n\t\t\t/^drizzle-orm\\/?/,\n\t\t\t'@sinclair/typebox',\n\t\t],\n\t\tplugins: [\n\t\t\ttypescript({\n\t\t\t\ttsconfig: 'tsconfig.build.json',\n\t\t\t}),\n\t\t],\n\t},\n]);\n"
  },
  {
    "path": "drizzle-typebox/scripts/build.ts",
    "content": "#!/usr/bin/env -S pnpm tsx\nimport 'zx/globals';\nimport cpy from 'cpy';\n\nawait fs.remove('dist');\nawait $`rollup --config rollup.config.ts --configPlugin typescript`;\nawait $`resolve-tspaths`;\nawait fs.copy('README.md', 'dist/README.md');\nawait cpy('dist/**/*.d.ts', 'dist', {\n\trename: (basename) => basename.replace(/\\.d\\.ts$/, '.d.mts'),\n});\nawait cpy('dist/**/*.d.ts', 'dist', {\n\trename: (basename) => basename.replace(/\\.d\\.ts$/, '.d.cts'),\n});\nawait fs.copy('package.json', 'dist/package.json');\nawait $`scripts/fix-imports.ts`;\n"
  },
  {
    "path": "drizzle-typebox/scripts/fix-imports.ts",
    "content": "#!/usr/bin/env -S pnpm tsx\nimport 'zx/globals';\n\nimport path from 'node:path';\nimport { parse, print, visit } from 'recast';\nimport parser from 'recast/parsers/typescript';\n\nfunction resolvePathAlias(importPath: string, file: string) {\n\tif (importPath.startsWith('~/')) {\n\t\tconst relativePath = path.relative(path.dirname(file), path.resolve('dist.new', importPath.slice(2)));\n\t\timportPath = relativePath.startsWith('.') ? relativePath : './' + relativePath;\n\t}\n\n\treturn importPath;\n}\n\nfunction fixImportPath(importPath: string, file: string, ext: string) {\n\timportPath = resolvePathAlias(importPath, file);\n\n\tif (!/\\..*\\.(js|ts)$/.test(importPath)) {\n\t\treturn importPath;\n\t}\n\n\treturn importPath.replace(/\\.(js|ts)$/, ext);\n}\n\nconst cjsFiles = await glob('dist/**/*.{cjs,d.cts}');\n\nawait Promise.all(cjsFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitCallExpression(path) {\n\t\t\tif (path.value.callee.type === 'Identifier' && path.value.callee.name === 'require') {\n\t\t\t\tpath.value.arguments[0].value = fixImportPath(path.value.arguments[0].value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = resolvePathAlias(path.value.argument.value, file);\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n\nlet esmFiles = await glob('dist/**/*.{js,d.ts}');\n\nawait Promise.all(esmFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = fixImportPath(path.value.argument.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.js');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n\nesmFiles = await glob('dist/**/*.{mjs,d.mts}');\n\nawait Promise.all(esmFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.mjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.mjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.mjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = fixImportPath(path.value.argument.value, file, '.mjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.mjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n"
  },
  {
    "path": "drizzle-typebox/src/column.ts",
    "content": "import { Kind, Type as t, TypeRegistry } from '@sinclair/typebox';\nimport type { StringOptions, TSchema, Type as typebox } from '@sinclair/typebox';\nimport type { Column, ColumnBaseConfig } from 'drizzle-orm';\nimport type {\n\tMySqlBigInt53,\n\tMySqlChar,\n\tMySqlDouble,\n\tMySqlFloat,\n\tMySqlInt,\n\tMySqlMediumInt,\n\tMySqlReal,\n\tMySqlSerial,\n\tMySqlSmallInt,\n\tMySqlText,\n\tMySqlTinyInt,\n\tMySqlVarChar,\n\tMySqlYear,\n} from 'drizzle-orm/mysql-core';\nimport type {\n\tPgArray,\n\tPgBigInt53,\n\tPgBigSerial53,\n\tPgBinaryVector,\n\tPgChar,\n\tPgDoublePrecision,\n\tPgGeometry,\n\tPgGeometryObject,\n\tPgHalfVector,\n\tPgInteger,\n\tPgLineABC,\n\tPgLineTuple,\n\tPgPointObject,\n\tPgPointTuple,\n\tPgReal,\n\tPgSerial,\n\tPgSmallInt,\n\tPgSmallSerial,\n\tPgUUID,\n\tPgVarchar,\n\tPgVector,\n} from 'drizzle-orm/pg-core';\nimport type {\n\tSingleStoreBigInt53,\n\tSingleStoreChar,\n\tSingleStoreDouble,\n\tSingleStoreFloat,\n\tSingleStoreInt,\n\tSingleStoreMediumInt,\n\tSingleStoreReal,\n\tSingleStoreSerial,\n\tSingleStoreSmallInt,\n\tSingleStoreText,\n\tSingleStoreTinyInt,\n\tSingleStoreVarChar,\n\tSingleStoreYear,\n} from 'drizzle-orm/singlestore-core';\nimport type { SQLiteInteger, SQLiteReal, SQLiteText } from 'drizzle-orm/sqlite-core';\nimport { CONSTANTS } from './constants.ts';\nimport { isColumnType, isWithEnum } from './utils.ts';\nimport type { BufferSchema, JsonSchema } from './utils.ts';\n\nexport const literalSchema = t.Union([t.String(), t.Number(), t.Boolean(), t.Null()]);\nexport const jsonSchema: JsonSchema = t.Union([literalSchema, t.Array(t.Any()), t.Record(t.String(), t.Any())]) as any;\nTypeRegistry.Set('Buffer', (_, value) => value instanceof Buffer); // eslint-disable-line no-instanceof/no-instanceof\nexport const bufferSchema: BufferSchema = { [Kind]: 'Buffer', type: 'buffer' } as any;\n\nexport function mapEnumValues(values: string[]) {\n\treturn Object.fromEntries(values.map((value) => [value, value]));\n}\n\nexport function columnToSchema(column: Column, t: typeof typebox): TSchema {\n\tlet schema!: TSchema;\n\n\tif (isWithEnum(column)) {\n\t\tschema = column.enumValues.length ? t.Enum(mapEnumValues(column.enumValues)) : t.String();\n\t}\n\n\tif (!schema) {\n\t\t// Handle specific types\n\t\tif (isColumnType<PgGeometry<any> | PgPointTuple<any>>(column, ['PgGeometry', 'PgPointTuple'])) {\n\t\t\tschema = t.Tuple([t.Number(), t.Number()]);\n\t\t} else if (\n\t\t\tisColumnType<PgPointObject<any> | PgGeometryObject<any>>(column, ['PgGeometryObject', 'PgPointObject'])\n\t\t) {\n\t\t\tschema = t.Object({ x: t.Number(), y: t.Number() });\n\t\t} else if (isColumnType<PgHalfVector<any> | PgVector<any>>(column, ['PgHalfVector', 'PgVector'])) {\n\t\t\tschema = t.Array(\n\t\t\t\tt.Number(),\n\t\t\t\tcolumn.dimensions\n\t\t\t\t\t? {\n\t\t\t\t\t\tminItems: column.dimensions,\n\t\t\t\t\t\tmaxItems: column.dimensions,\n\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t} else if (isColumnType<PgLineTuple<any>>(column, ['PgLine'])) {\n\t\t\tschema = t.Tuple([t.Number(), t.Number(), t.Number()]);\n\t\t} else if (isColumnType<PgLineABC<any>>(column, ['PgLineABC'])) {\n\t\t\tschema = t.Object({\n\t\t\t\ta: t.Number(),\n\t\t\t\tb: t.Number(),\n\t\t\t\tc: t.Number(),\n\t\t\t});\n\t\t} // Handle other types\n\t\telse if (isColumnType<PgArray<any, any>>(column, ['PgArray'])) {\n\t\t\tschema = t.Array(\n\t\t\t\tcolumnToSchema(column.baseColumn, t),\n\t\t\t\tcolumn.size\n\t\t\t\t\t? {\n\t\t\t\t\t\tminItems: column.size,\n\t\t\t\t\t\tmaxItems: column.size,\n\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t} else if (column.dataType === 'array') {\n\t\t\tschema = t.Array(t.Any());\n\t\t} else if (column.dataType === 'number') {\n\t\t\tschema = numberColumnToSchema(column, t);\n\t\t} else if (column.dataType === 'bigint') {\n\t\t\tschema = bigintColumnToSchema(column, t);\n\t\t} else if (column.dataType === 'boolean') {\n\t\t\tschema = t.Boolean();\n\t\t} else if (column.dataType === 'date') {\n\t\t\tschema = t.Date();\n\t\t} else if (column.dataType === 'string') {\n\t\t\tschema = stringColumnToSchema(column, t);\n\t\t} else if (column.dataType === 'json') {\n\t\t\tschema = jsonSchema;\n\t\t} else if (column.dataType === 'custom') {\n\t\t\tschema = t.Any();\n\t\t} else if (column.dataType === 'buffer') {\n\t\t\tschema = bufferSchema;\n\t\t}\n\t}\n\n\tif (!schema) {\n\t\tschema = t.Any();\n\t}\n\n\treturn schema;\n}\n\nfunction numberColumnToSchema(column: Column, t: typeof typebox): TSchema {\n\tlet unsigned = column.getSQLType().includes('unsigned');\n\tlet min!: number;\n\tlet max!: number;\n\tlet integer = false;\n\n\tif (isColumnType<MySqlTinyInt<any> | SingleStoreTinyInt<any>>(column, ['MySqlTinyInt', 'SingleStoreTinyInt'])) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT8_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT8_UNSIGNED_MAX : CONSTANTS.INT8_MAX;\n\t\tinteger = true;\n\t} else if (\n\t\tisColumnType<PgSmallInt<any> | PgSmallSerial<any> | MySqlSmallInt<any> | SingleStoreSmallInt<any>>(column, [\n\t\t\t'PgSmallInt',\n\t\t\t'PgSmallSerial',\n\t\t\t'MySqlSmallInt',\n\t\t\t'SingleStoreSmallInt',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT16_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT16_UNSIGNED_MAX : CONSTANTS.INT16_MAX;\n\t\tinteger = true;\n\t} else if (\n\t\tisColumnType<\n\t\t\tPgReal<any> | MySqlFloat<any> | MySqlMediumInt<any> | SingleStoreFloat<any> | SingleStoreMediumInt<any>\n\t\t>(column, [\n\t\t\t'PgReal',\n\t\t\t'MySqlFloat',\n\t\t\t'MySqlMediumInt',\n\t\t\t'SingleStoreFloat',\n\t\t\t'SingleStoreMediumInt',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT24_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT24_UNSIGNED_MAX : CONSTANTS.INT24_MAX;\n\t\tinteger = isColumnType(column, ['MySqlMediumInt', 'SingleStoreMediumInt']);\n\t} else if (\n\t\tisColumnType<PgInteger<any> | PgSerial<any> | MySqlInt<any> | SingleStoreInt<any>>(column, [\n\t\t\t'PgInteger',\n\t\t\t'PgSerial',\n\t\t\t'MySqlInt',\n\t\t\t'SingleStoreInt',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT32_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT32_UNSIGNED_MAX : CONSTANTS.INT32_MAX;\n\t\tinteger = true;\n\t} else if (\n\t\tisColumnType<\n\t\t\t| PgDoublePrecision<any>\n\t\t\t| MySqlReal<any>\n\t\t\t| MySqlDouble<any>\n\t\t\t| SingleStoreReal<any>\n\t\t\t| SingleStoreDouble<any>\n\t\t\t| SQLiteReal<any>\n\t\t>(column, [\n\t\t\t'PgDoublePrecision',\n\t\t\t'MySqlReal',\n\t\t\t'MySqlDouble',\n\t\t\t'SingleStoreReal',\n\t\t\t'SingleStoreDouble',\n\t\t\t'SQLiteReal',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT48_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT48_UNSIGNED_MAX : CONSTANTS.INT48_MAX;\n\t} else if (\n\t\tisColumnType<\n\t\t\t| PgBigInt53<any>\n\t\t\t| PgBigSerial53<any>\n\t\t\t| MySqlBigInt53<any>\n\t\t\t| MySqlSerial<any>\n\t\t\t| SingleStoreBigInt53<any>\n\t\t\t| SingleStoreSerial<any>\n\t\t\t| SQLiteInteger<any>\n\t\t>(\n\t\t\tcolumn,\n\t\t\t[\n\t\t\t\t'PgBigInt53',\n\t\t\t\t'PgBigSerial53',\n\t\t\t\t'MySqlBigInt53',\n\t\t\t\t'MySqlSerial',\n\t\t\t\t'SingleStoreBigInt53',\n\t\t\t\t'SingleStoreSerial',\n\t\t\t\t'SQLiteInteger',\n\t\t\t],\n\t\t)\n\t) {\n\t\tunsigned = unsigned || isColumnType(column, ['MySqlSerial', 'SingleStoreSerial']);\n\t\tmin = unsigned ? 0 : Number.MIN_SAFE_INTEGER;\n\t\tmax = Number.MAX_SAFE_INTEGER;\n\t\tinteger = true;\n\t} else if (isColumnType<MySqlYear<any> | SingleStoreYear<any>>(column, ['MySqlYear', 'SingleStoreYear'])) {\n\t\tmin = 1901;\n\t\tmax = 2155;\n\t\tinteger = true;\n\t} else {\n\t\tmin = Number.MIN_SAFE_INTEGER;\n\t\tmax = Number.MAX_SAFE_INTEGER;\n\t}\n\n\tconst key = integer ? 'Integer' : 'Number';\n\treturn t[key]({\n\t\tminimum: min,\n\t\tmaximum: max,\n\t});\n}\n\nfunction bigintColumnToSchema(column: Column, t: typeof typebox): TSchema {\n\tconst unsigned = column.getSQLType().includes('unsigned');\n\tconst min = unsigned ? 0n : CONSTANTS.INT64_MIN;\n\tconst max = unsigned ? CONSTANTS.INT64_UNSIGNED_MAX : CONSTANTS.INT64_MAX;\n\n\treturn t.BigInt({\n\t\tminimum: min,\n\t\tmaximum: max,\n\t});\n}\n\nfunction stringColumnToSchema(column: Column, t: typeof typebox): TSchema {\n\tif (isColumnType<PgUUID<ColumnBaseConfig<'string', 'PgUUID'>>>(column, ['PgUUID'])) {\n\t\treturn t.String({ format: 'uuid' });\n\t} else if (\n\t\tisColumnType<PgBinaryVector<ColumnBaseConfig<'string', 'PgBinaryVector'> & { dimensions: number }>>(column, [\n\t\t\t'PgBinaryVector',\n\t\t])\n\t) {\n\t\treturn t.RegExp(/^[01]+$/, column.dimensions ? { maxLength: column.dimensions } : undefined);\n\t}\n\n\tlet max: number | undefined;\n\tlet fixed = false;\n\n\tif (isColumnType<PgVarchar<any> | SQLiteText<any>>(column, ['PgVarchar', 'SQLiteText'])) {\n\t\tmax = column.length;\n\t} else if (\n\t\tisColumnType<MySqlVarChar<any> | SingleStoreVarChar<any>>(column, ['MySqlVarChar', 'SingleStoreVarChar'])\n\t) {\n\t\tmax = column.length ?? CONSTANTS.INT16_UNSIGNED_MAX;\n\t} else if (isColumnType<MySqlText<any> | SingleStoreText<any>>(column, ['MySqlText', 'SingleStoreText'])) {\n\t\tif (column.textType === 'longtext') {\n\t\t\tmax = CONSTANTS.INT32_UNSIGNED_MAX;\n\t\t} else if (column.textType === 'mediumtext') {\n\t\t\tmax = CONSTANTS.INT24_UNSIGNED_MAX;\n\t\t} else if (column.textType === 'text') {\n\t\t\tmax = CONSTANTS.INT16_UNSIGNED_MAX;\n\t\t} else {\n\t\t\tmax = CONSTANTS.INT8_UNSIGNED_MAX;\n\t\t}\n\t}\n\n\tif (\n\t\tisColumnType<PgChar<any> | MySqlChar<any> | SingleStoreChar<any>>(column, [\n\t\t\t'PgChar',\n\t\t\t'MySqlChar',\n\t\t\t'SingleStoreChar',\n\t\t])\n\t) {\n\t\tmax = column.length;\n\t\tfixed = true;\n\t}\n\n\tconst options: Partial<StringOptions> = {};\n\n\tif (max !== undefined && fixed) {\n\t\toptions.minLength = max;\n\t\toptions.maxLength = max;\n\t} else if (max !== undefined) {\n\t\toptions.maxLength = max;\n\t}\n\n\treturn t.String(Object.keys(options).length > 0 ? options : undefined);\n}\n"
  },
  {
    "path": "drizzle-typebox/src/column.types.ts",
    "content": "import type * as t from '@sinclair/typebox';\nimport type { Assume, Column } from 'drizzle-orm';\nimport type { BufferSchema, IsEnumDefined, IsNever, JsonSchema } from './utils.ts';\n\ntype HasBaseColumn<TColumn> = TColumn extends { _: { baseColumn: Column | undefined } }\n\t? IsNever<TColumn['_']['baseColumn']> extends false ? true\n\t: false\n\t: false;\n\nexport type EnumValuesToEnum<TEnumValues extends [string, ...string[]]> = { [K in TEnumValues[number]]: K };\n\nexport interface GenericSchema<T> extends t.TSchema {\n\tstatic: T;\n}\n\nexport type GetTypeboxType<\n\tTColumn extends Column,\n> = TColumn['_']['columnType'] extends\n\t| 'MySqlTinyInt'\n\t| 'SingleStoreTinyInt'\n\t| 'PgSmallInt'\n\t| 'PgSmallSerial'\n\t| 'MySqlSmallInt'\n\t| 'MySqlMediumInt'\n\t| 'SingleStoreSmallInt'\n\t| 'SingleStoreMediumInt'\n\t| 'PgInteger'\n\t| 'PgSerial'\n\t| 'MySqlInt'\n\t| 'SingleStoreInt'\n\t| 'PgBigInt53'\n\t| 'PgBigSerial53'\n\t| 'MySqlBigInt53'\n\t| 'MySqlSerial'\n\t| 'SingleStoreBigInt53'\n\t| 'SingleStoreSerial'\n\t| 'SQLiteInteger'\n\t| 'MySqlYear'\n\t| 'SingleStoreYear' ? t.TInteger\n\t: TColumn['_']['columnType'] extends 'PgBinaryVector' ? t.TRegExp\n\t: HasBaseColumn<TColumn> extends true ? t.TArray<\n\t\t\tGetTypeboxType<Assume<TColumn['_']['baseColumn'], Column>>\n\t\t>\n\t: IsEnumDefined<TColumn['_']['enumValues']> extends true\n\t\t? t.TEnum<{ [K in Assume<TColumn['_']['enumValues'], string[]>[number]]: K }>\n\t: TColumn['_']['columnType'] extends 'PgGeometry' | 'PgPointTuple' ? t.TTuple<[t.TNumber, t.TNumber]>\n\t: TColumn['_']['columnType'] extends 'PgLine' ? t.TTuple<[t.TNumber, t.TNumber, t.TNumber]>\n\t: TColumn['_']['data'] extends Date ? t.TDate\n\t: TColumn['_']['data'] extends Buffer ? BufferSchema\n\t: TColumn['_']['dataType'] extends 'array'\n\t\t? t.TArray<GetTypeboxPrimitiveType<Assume<TColumn['_']['data'], any[]>[number]>>\n\t: TColumn['_']['data'] extends Record<string, any>\n\t\t? TColumn['_']['columnType'] extends\n\t\t\t'PgJson' | 'PgJsonb' | 'MySqlJson' | 'SingleStoreJson' | 'SQLiteTextJson' | 'SQLiteBlobJson'\n\t\t\t? GenericSchema<TColumn['_']['data']>\n\t\t: t.TObject<{ [K in keyof TColumn['_']['data']]: GetTypeboxPrimitiveType<TColumn['_']['data'][K]> }>\n\t: TColumn['_']['dataType'] extends 'json' ? JsonSchema\n\t: GetTypeboxPrimitiveType<TColumn['_']['data']>;\n\ntype GetTypeboxPrimitiveType<TData> = TData extends number ? t.TNumber\n\t: TData extends bigint ? t.TBigInt\n\t: TData extends boolean ? t.TBoolean\n\t: TData extends string ? t.TString\n\t: t.TAny;\n\ntype HandleSelectColumn<\n\tTSchema extends t.TSchema,\n\tTColumn extends Column,\n> = TColumn['_']['notNull'] extends true ? TSchema\n\t: t.Union<[TSchema, t.TNull]>;\n\ntype HandleInsertColumn<\n\tTSchema extends t.TSchema,\n\tTColumn extends Column,\n> = TColumn['_']['notNull'] extends true ? TColumn['_']['hasDefault'] extends true ? t.TOptional<TSchema>\n\t: TSchema\n\t: t.TOptional<t.Union<[TSchema, t.TNull]>>;\n\ntype HandleUpdateColumn<\n\tTSchema extends t.TSchema,\n\tTColumn extends Column,\n> = TColumn['_']['notNull'] extends true ? t.TOptional<TSchema>\n\t: t.TOptional<t.Union<[TSchema, t.TNull]>>;\n\nexport type HandleColumn<\n\tTType extends 'select' | 'insert' | 'update',\n\tTColumn extends Column,\n> = TType extends 'select' ? HandleSelectColumn<GetTypeboxType<TColumn>, TColumn>\n\t: TType extends 'insert' ? HandleInsertColumn<GetTypeboxType<TColumn>, TColumn>\n\t: TType extends 'update' ? HandleUpdateColumn<GetTypeboxType<TColumn>, TColumn>\n\t: GetTypeboxType<TColumn>;\n"
  },
  {
    "path": "drizzle-typebox/src/constants.ts",
    "content": "export const CONSTANTS = {\n\tINT8_MIN: -128,\n\tINT8_MAX: 127,\n\tINT8_UNSIGNED_MAX: 255,\n\tINT16_MIN: -32768,\n\tINT16_MAX: 32767,\n\tINT16_UNSIGNED_MAX: 65535,\n\tINT24_MIN: -8388608,\n\tINT24_MAX: 8388607,\n\tINT24_UNSIGNED_MAX: 16777215,\n\tINT32_MIN: -2147483648,\n\tINT32_MAX: 2147483647,\n\tINT32_UNSIGNED_MAX: 4294967295,\n\tINT48_MIN: -140737488355328,\n\tINT48_MAX: 140737488355327,\n\tINT48_UNSIGNED_MAX: 281474976710655,\n\tINT64_MIN: -9223372036854775808n,\n\tINT64_MAX: 9223372036854775807n,\n\tINT64_UNSIGNED_MAX: 18446744073709551615n,\n};\n"
  },
  {
    "path": "drizzle-typebox/src/index.ts",
    "content": "export { bufferSchema, jsonSchema, literalSchema } from './column.ts';\nexport * from './column.types.ts';\nexport * from './schema.ts';\nexport * from './schema.types.internal.ts';\nexport * from './schema.types.ts';\nexport * from './utils.ts';\n"
  },
  {
    "path": "drizzle-typebox/src/schema.ts",
    "content": "import { Type as t } from '@sinclair/typebox';\nimport type { TSchema } from '@sinclair/typebox';\nimport { Column, getTableColumns, getViewSelectedFields, is, isTable, isView, SQL } from 'drizzle-orm';\nimport type { Table, View } from 'drizzle-orm';\nimport type { PgEnum } from 'drizzle-orm/pg-core';\nimport { columnToSchema, mapEnumValues } from './column.ts';\nimport type { Conditions } from './schema.types.internal.ts';\nimport type {\n\tCreateInsertSchema,\n\tCreateSchemaFactoryOptions,\n\tCreateSelectSchema,\n\tCreateUpdateSchema,\n} from './schema.types.ts';\nimport { isPgEnum } from './utils.ts';\n\nexport function getColumns(tableLike: Table | View) {\n\treturn isTable(tableLike) ? getTableColumns(tableLike) : getViewSelectedFields(tableLike);\n}\n\nexport function handleColumns(\n\tcolumns: Record<string, any>,\n\trefinements: Record<string, any>,\n\tconditions: Conditions,\n\tfactory?: CreateSchemaFactoryOptions,\n): TSchema {\n\tconst columnSchemas: Record<string, TSchema> = {};\n\n\tfor (const [key, selected] of Object.entries(columns)) {\n\t\tif (!is(selected, Column) && !is(selected, SQL) && !is(selected, SQL.Aliased) && typeof selected === 'object') {\n\t\t\tconst columns = isTable(selected) || isView(selected) ? getColumns(selected) : selected;\n\t\t\tcolumnSchemas[key] = handleColumns(columns, refinements[key] ?? {}, conditions, factory);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst refinement = refinements[key];\n\t\tif (refinement !== undefined && typeof refinement !== 'function') {\n\t\t\tcolumnSchemas[key] = refinement;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst column = is(selected, Column) ? selected : undefined;\n\t\tconst schema = column ? columnToSchema(column, factory?.typeboxInstance ?? t) : t.Any();\n\t\tconst refined = typeof refinement === 'function' ? refinement(schema) : schema;\n\n\t\tif (conditions.never(column)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tcolumnSchemas[key] = refined;\n\t\t}\n\n\t\tif (column) {\n\t\t\tif (conditions.nullable(column)) {\n\t\t\t\tcolumnSchemas[key] = t.Union([columnSchemas[key]!, t.Null()]);\n\t\t\t}\n\n\t\t\tif (conditions.optional(column)) {\n\t\t\t\tcolumnSchemas[key] = t.Optional(columnSchemas[key]!);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn t.Object(columnSchemas) as any;\n}\n\nexport function handleEnum(enum_: PgEnum<any>, factory?: CreateSchemaFactoryOptions) {\n\tconst typebox: typeof t = factory?.typeboxInstance ?? t;\n\treturn typebox.Enum(mapEnumValues(enum_.enumValues));\n}\n\nconst selectConditions: Conditions = {\n\tnever: () => false,\n\toptional: () => false,\n\tnullable: (column) => !column.notNull,\n};\n\nconst insertConditions: Conditions = {\n\tnever: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',\n\toptional: (column) => !column.notNull || (column.notNull && column.hasDefault),\n\tnullable: (column) => !column.notNull,\n};\n\nconst updateConditions: Conditions = {\n\tnever: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',\n\toptional: () => true,\n\tnullable: (column) => !column.notNull,\n};\n\nexport const createSelectSchema: CreateSelectSchema = (\n\tentity: Table | View | PgEnum<[string, ...string[]]>,\n\trefine?: Record<string, any>,\n) => {\n\tif (isPgEnum(entity)) {\n\t\treturn handleEnum(entity);\n\t}\n\tconst columns = getColumns(entity);\n\treturn handleColumns(columns, refine ?? {}, selectConditions) as any;\n};\n\nexport const createInsertSchema: CreateInsertSchema = (\n\tentity: Table,\n\trefine?: Record<string, any>,\n) => {\n\tconst columns = getColumns(entity);\n\treturn handleColumns(columns, refine ?? {}, insertConditions) as any;\n};\n\nexport const createUpdateSchema: CreateUpdateSchema = (\n\tentity: Table,\n\trefine?: Record<string, any>,\n) => {\n\tconst columns = getColumns(entity);\n\treturn handleColumns(columns, refine ?? {}, updateConditions) as any;\n};\n\nexport function createSchemaFactory(options?: CreateSchemaFactoryOptions) {\n\tconst createSelectSchema: CreateSelectSchema = (\n\t\tentity: Table | View | PgEnum<[string, ...string[]]>,\n\t\trefine?: Record<string, any>,\n\t) => {\n\t\tif (isPgEnum(entity)) {\n\t\t\treturn handleEnum(entity, options);\n\t\t}\n\t\tconst columns = getColumns(entity);\n\t\treturn handleColumns(columns, refine ?? {}, selectConditions, options) as any;\n\t};\n\n\tconst createInsertSchema: CreateInsertSchema = (\n\t\tentity: Table,\n\t\trefine?: Record<string, any>,\n\t) => {\n\t\tconst columns = getColumns(entity);\n\t\treturn handleColumns(columns, refine ?? {}, insertConditions, options) as any;\n\t};\n\n\tconst createUpdateSchema: CreateUpdateSchema = (\n\t\tentity: Table,\n\t\trefine?: Record<string, any>,\n\t) => {\n\t\tconst columns = getColumns(entity);\n\t\treturn handleColumns(columns, refine ?? {}, updateConditions, options) as any;\n\t};\n\n\treturn { createSelectSchema, createInsertSchema, createUpdateSchema };\n}\n"
  },
  {
    "path": "drizzle-typebox/src/schema.types.internal.ts",
    "content": "import type * as t from '@sinclair/typebox';\nimport type { Assume, Column, DrizzleTypeError, SelectedFieldsFlat, Simplify, Table, View } from 'drizzle-orm';\nimport type { GetTypeboxType, HandleColumn } from './column.types.ts';\nimport type { ColumnIsGeneratedAlwaysAs, GetSelection } from './utils.ts';\n\nexport interface Conditions {\n\tnever: (column?: Column) => boolean;\n\toptional: (column: Column) => boolean;\n\tnullable: (column: Column) => boolean;\n}\n\ntype BuildRefineField<T> = T extends t.TSchema ? ((schema: T) => t.TSchema) | t.TSchema : never;\n\nexport type BuildRefine<\n\tTColumns extends Record<string, any>,\n> = {\n\t[K in keyof TColumns as TColumns[K] extends Column | SelectedFieldsFlat<Column> | Table | View ? K : never]?:\n\t\tTColumns[K] extends Column ? BuildRefineField<GetTypeboxType<TColumns[K]>>\n\t\t\t: BuildRefine<GetSelection<TColumns[K]>>;\n};\n\ntype HandleRefinement<\n\tTType extends 'select' | 'insert' | 'update',\n\tTRefinement,\n\tTColumn extends Column,\n> = TRefinement extends (schema: any) => t.TSchema ? (TColumn['_']['notNull'] extends true ? ReturnType<TRefinement>\n\t\t: t.TUnion<[ReturnType<TRefinement>, t.TNull]>) extends infer TSchema\n\t\t? TType extends 'update' ? t.TOptional<Assume<TSchema, t.TSchema>> : TSchema\n\t: t.TSchema\n\t: TRefinement;\n\ntype IsRefinementDefined<\n\tTRefinements extends Record<string | symbol | number, any> | undefined,\n\tTKey extends string | symbol | number,\n> = TRefinements extends object ? TRefinements[TKey] extends t.TSchema | ((schema: any) => any) ? true\n\t: false\n\t: false;\n\nexport type BuildSchema<\n\tTType extends 'select' | 'insert' | 'update',\n\tTColumns extends Record<string, any>,\n\tTRefinements extends Record<string, any> | undefined,\n> = t.TObject<\n\tSimplify<\n\t\t{\n\t\t\t[K in keyof TColumns as ColumnIsGeneratedAlwaysAs<TColumns[K]> extends true ? never : K]: TColumns[K] extends\n\t\t\t\tinfer TColumn extends Column\n\t\t\t\t? IsRefinementDefined<TRefinements, K> extends true\n\t\t\t\t\t? Assume<HandleRefinement<TType, TRefinements[K & keyof TRefinements], TColumn>, t.TSchema>\n\t\t\t\t: HandleColumn<TType, TColumn>\n\t\t\t\t: TColumns[K] extends infer TObject extends SelectedFieldsFlat<Column> | Table | View ? BuildSchema<\n\t\t\t\t\t\tTType,\n\t\t\t\t\t\tGetSelection<TObject>,\n\t\t\t\t\t\tTRefinements extends object ? TRefinements[K & keyof TRefinements] : undefined\n\t\t\t\t\t>\n\t\t\t\t: t.TAny;\n\t\t}\n\t>\n>;\n\nexport type NoUnknownKeys<\n\tTRefinement extends Record<string, any>,\n\tTCompare extends Record<string, any>,\n> = {\n\t[K in keyof TRefinement]: K extends keyof TCompare ? TRefinement[K] extends t.TSchema ? TRefinement[K]\n\t\t: TRefinement[K] extends Record<string, t.TSchema> ? NoUnknownKeys<TRefinement[K], TCompare[K]>\n\t\t: TRefinement[K]\n\t\t: DrizzleTypeError<`Found unknown key in refinement: \"${K & string}\"`>;\n};\n"
  },
  {
    "path": "drizzle-typebox/src/schema.types.ts",
    "content": "import type * as t from '@sinclair/typebox';\nimport type { Table, View } from 'drizzle-orm';\nimport type { PgEnum } from 'drizzle-orm/pg-core';\nimport type { EnumValuesToEnum } from './column.types.ts';\nimport type { BuildRefine, BuildSchema, NoUnknownKeys } from './schema.types.internal.ts';\n\nexport interface CreateSelectSchema {\n\t<TTable extends Table>(table: TTable): BuildSchema<'select', TTable['_']['columns'], undefined>;\n\t<\n\t\tTTable extends Table,\n\t\tTRefine extends BuildRefine<TTable['_']['columns']>,\n\t>(\n\t\ttable: TTable,\n\t\trefine?: NoUnknownKeys<TRefine, TTable['$inferSelect']>,\n\t): BuildSchema<'select', TTable['_']['columns'], TRefine>;\n\n\t<TView extends View>(view: TView): BuildSchema<'select', TView['_']['selectedFields'], undefined>;\n\t<\n\t\tTView extends View,\n\t\tTRefine extends BuildRefine<TView['_']['selectedFields']>,\n\t>(\n\t\tview: TView,\n\t\trefine: NoUnknownKeys<TRefine, TView['$inferSelect']>,\n\t): BuildSchema<'select', TView['_']['selectedFields'], TRefine>;\n\n\t<TEnum extends PgEnum<any>>(enum_: TEnum): t.TEnum<EnumValuesToEnum<TEnum['enumValues']>>;\n}\n\nexport interface CreateInsertSchema {\n\t<TTable extends Table>(table: TTable): BuildSchema<'insert', TTable['_']['columns'], undefined>;\n\t<\n\t\tTTable extends Table,\n\t\tTRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>>,\n\t>(\n\t\ttable: TTable,\n\t\trefine?: NoUnknownKeys<TRefine, TTable['$inferInsert']>,\n\t): BuildSchema<'insert', TTable['_']['columns'], TRefine>;\n}\n\nexport interface CreateUpdateSchema {\n\t<TTable extends Table>(table: TTable): BuildSchema<'update', TTable['_']['columns'], undefined>;\n\t<\n\t\tTTable extends Table,\n\t\tTRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>>,\n\t>(\n\t\ttable: TTable,\n\t\trefine?: TRefine,\n\t): BuildSchema<'update', TTable['_']['columns'], TRefine>;\n}\n\nexport interface CreateSchemaFactoryOptions {\n\ttypeboxInstance?: any;\n}\n"
  },
  {
    "path": "drizzle-typebox/src/utils.ts",
    "content": "import type { Kind, Static, TSchema } from '@sinclair/typebox';\nimport type { Column, SelectedFieldsFlat, Table, View } from 'drizzle-orm';\nimport type { PgEnum } from 'drizzle-orm/pg-core';\nimport type { literalSchema } from './column.ts';\n\nexport function isColumnType<T extends Column>(column: Column, columnTypes: string[]): column is T {\n\treturn columnTypes.includes(column.columnType);\n}\n\nexport function isWithEnum(column: Column): column is typeof column & { enumValues: [string, ...string[]] } {\n\treturn 'enumValues' in column && Array.isArray(column.enumValues) && column.enumValues.length > 0;\n}\n\nexport const isPgEnum: (entity: any) => entity is PgEnum<[string, ...string[]]> = isWithEnum as any;\n\ntype Literal = Static<typeof literalSchema>;\nexport type Json = Literal | { [key: string]: any } | any[];\nexport interface JsonSchema extends TSchema {\n\t[Kind]: 'Union';\n\tstatic: Json;\n\tanyOf: Json;\n}\nexport interface BufferSchema extends TSchema {\n\t[Kind]: 'Buffer';\n\tstatic: Buffer;\n\ttype: 'buffer';\n}\n\nexport type IsNever<T> = [T] extends [never] ? true : false;\n\nexport type IsEnumDefined<TEnum extends string[] | undefined> = [string, ...string[]] extends TEnum ? false\n\t: undefined extends TEnum ? false\n\t: true;\n\nexport type ColumnIsGeneratedAlwaysAs<TColumn> = TColumn extends Column\n\t? TColumn['_']['identity'] extends 'always' ? true\n\t: TColumn['_']['generated'] extends { type: 'byDefault' } | undefined ? false\n\t: true\n\t: false;\n\nexport type GetSelection<T extends SelectedFieldsFlat<Column> | Table | View> = T extends Table ? T['_']['columns']\n\t: T extends View ? T['_']['selectedFields']\n\t: T;\n"
  },
  {
    "path": "drizzle-typebox/tests/mysql.test.ts",
    "content": "import { type Static, Type as t } from '@sinclair/typebox';\nimport { type Equal, sql } from 'drizzle-orm';\nimport { customType, int, json, mysqlSchema, mysqlTable, mysqlView, serial, text } from 'drizzle-orm/mysql-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport { test } from 'vitest';\nimport { jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSelectSchema, createUpdateSchema, type GenericSchema } from '../src';\nimport { Expect, expectSchemaShape } from './utils.ts';\n\nconst intSchema = t.Integer({\n\tminimum: CONSTANTS.INT32_MIN,\n\tmaximum: CONSTANTS.INT32_MAX,\n});\nconst serialNumberModeSchema = t.Integer({\n\tminimum: 0,\n\tmaximum: Number.MAX_SAFE_INTEGER,\n});\nconst textSchema = t.String({ maxLength: CONSTANTS.INT16_UNSIGNED_MAX });\n\ntest('table - select', (tc) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table in schema - select', (tc) => {\n\tconst schema = mysqlSchema('test');\n\tconst table = schema.table('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (tc) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = t.Object({\n\t\tid: t.Optional(serialNumberModeSchema),\n\t\tname: textSchema,\n\t\tage: t.Optional(t.Union([intSchema, t.Null()])),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (tc) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = t.Object({\n\t\tid: t.Optional(serialNumberModeSchema),\n\t\tname: t.Optional(textSchema),\n\t\tage: t.Optional(t.Union([intSchema, t.Null()])),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view qb - select', (tc) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = mysqlView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = t.Object({ id: serialNumberModeSchema, age: t.Any() });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view columns - select', (tc) => {\n\tconst view = mysqlView('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = t.Object({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view with nested fields - select', (tc) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = mysqlView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tid: table.id,\n\t\t\tnested: {\n\t\t\t\tname: table.name,\n\t\t\t\tage: sql``.as('age'),\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = t.Object({\n\t\tid: serialNumberModeSchema,\n\t\tnested: t.Object({ name: textSchema, age: t.Any() }),\n\t\ttable: t.Object({ id: serialNumberModeSchema, name: textSchema }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - select', (tc) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({\n\t\tc1: t.Union([intSchema, t.Null()]),\n\t\tc2: intSchema,\n\t\tc3: t.Union([intSchema, t.Null()]),\n\t\tc4: intSchema,\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (tc) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc2: intSchema,\n\t\tc3: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc4: t.Optional(intSchema),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - update', (tc) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc2: t.Optional(intSchema),\n\t\tc3: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc4: t.Optional(intSchema),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (tc) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Union([intSchema, t.Null()]),\n\t\tc2: t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (tc) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = t.String({ minLength: 1, maxLength: 100 });\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Union([intSchema, t.Null()]),\n\t\tc2: t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (tc) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc2: t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (tc) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc2: t.Optional(t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 })),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine view - select', (tc) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int(),\n\t\tc3: int(),\n\t\tc4: int(),\n\t\tc5: int(),\n\t\tc6: int(),\n\t});\n\tconst view = mysqlView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tc1: table.c1,\n\t\t\tc2: table.c2,\n\t\t\tc3: table.c3,\n\t\t\tnested: {\n\t\t\t\tc4: table.c4,\n\t\t\t\tc5: table.c5,\n\t\t\t\tc6: table.c6,\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tnested: {\n\t\t\tc5: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\t\tc6: t.Integer({ minimum: 1, maximum: 10 }),\n\t\t},\n\t\ttable: {\n\t\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\t},\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Union([intSchema, t.Null()]),\n\t\tc2: t.Union([t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }), t.Null()]),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tnested: t.Object({\n\t\t\tc4: t.Union([intSchema, t.Null()]),\n\t\t\tc5: t.Union([t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }), t.Null()]),\n\t\t\tc6: t.Integer({ minimum: 1, maximum: 10 }),\n\t\t}),\n\t\ttable: t.Object({\n\t\t\tc1: t.Union([intSchema, t.Null()]),\n\t\t\tc2: t.Union([t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }), t.Null()]),\n\t\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\t\tc4: t.Union([intSchema, t.Null()]),\n\t\t\tc5: t.Union([intSchema, t.Null()]),\n\t\t\tc6: t.Union([intSchema, t.Null()]),\n\t\t}),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('all data types', (tc) => {\n\tconst table = mysqlTable('test', ({\n\t\tbigint,\n\t\tbinary,\n\t\tboolean,\n\t\tchar,\n\t\tdate,\n\t\tdatetime,\n\t\tdecimal,\n\t\tdouble,\n\t\tfloat,\n\t\tint,\n\t\tjson,\n\t\tmediumint,\n\t\tmysqlEnum,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\ttext,\n\t\ttime,\n\t\ttimestamp,\n\t\ttinyint,\n\t\tvarchar,\n\t\tvarbinary,\n\t\tyear,\n\t\tlongtext,\n\t\tmediumtext,\n\t\ttinytext,\n\t}) => ({\n\t\tbigint1: bigint({ mode: 'number' }).notNull(),\n\t\tbigint2: bigint({ mode: 'bigint' }).notNull(),\n\t\tbigint3: bigint({ unsigned: true, mode: 'number' }).notNull(),\n\t\tbigint4: bigint({ unsigned: true, mode: 'bigint' }).notNull(),\n\t\tbinary: binary({ length: 10 }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\tchar1: char({ length: 10 }).notNull(),\n\t\tchar2: char({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tdate1: date({ mode: 'date' }).notNull(),\n\t\tdate2: date({ mode: 'string' }).notNull(),\n\t\tdatetime1: datetime({ mode: 'date' }).notNull(),\n\t\tdatetime2: datetime({ mode: 'string' }).notNull(),\n\t\tdecimal1: decimal().notNull(),\n\t\tdecimal2: decimal({ unsigned: true }).notNull(),\n\t\tdouble1: double().notNull(),\n\t\tdouble2: double({ unsigned: true }).notNull(),\n\t\tfloat1: float().notNull(),\n\t\tfloat2: float({ unsigned: true }).notNull(),\n\t\tint1: int().notNull(),\n\t\tint2: int({ unsigned: true }).notNull(),\n\t\tjson: json().notNull(),\n\t\tmediumint1: mediumint().notNull(),\n\t\tmediumint2: mediumint({ unsigned: true }).notNull(),\n\t\tenum: mysqlEnum('enum', ['a', 'b', 'c']).notNull(),\n\t\treal: real().notNull(),\n\t\tserial: serial().notNull(),\n\t\tsmallint1: smallint().notNull(),\n\t\tsmallint2: smallint({ unsigned: true }).notNull(),\n\t\ttext1: text().notNull(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttime: time().notNull(),\n\t\ttimestamp1: timestamp({ mode: 'date' }).notNull(),\n\t\ttimestamp2: timestamp({ mode: 'string' }).notNull(),\n\t\ttinyint1: tinyint().notNull(),\n\t\ttinyint2: tinyint({ unsigned: true }).notNull(),\n\t\tvarchar1: varchar({ length: 10 }).notNull(),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tvarbinary: varbinary({ length: 10 }).notNull(),\n\t\tyear: year().notNull(),\n\t\tlongtext1: longtext().notNull(),\n\t\tlongtext2: longtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\tmediumtext1: mediumtext().notNull(),\n\t\tmediumtext2: mediumtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttinytext1: tinytext().notNull(),\n\t\ttinytext2: tinytext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({\n\t\tbigint1: t.Integer({ minimum: Number.MIN_SAFE_INTEGER, maximum: Number.MAX_SAFE_INTEGER }),\n\t\tbigint2: t.BigInt({ minimum: CONSTANTS.INT64_MIN, maximum: CONSTANTS.INT64_MAX }),\n\t\tbigint3: t.Integer({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER }),\n\t\tbigint4: t.BigInt({ minimum: 0n, maximum: CONSTANTS.INT64_UNSIGNED_MAX }),\n\t\tbinary: t.String(),\n\t\tboolean: t.Boolean(),\n\t\tchar1: t.String({ minLength: 10, maxLength: 10 }),\n\t\tchar2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tdate1: t.Date(),\n\t\tdate2: t.String(),\n\t\tdatetime1: t.Date(),\n\t\tdatetime2: t.String(),\n\t\tdecimal1: t.String(),\n\t\tdecimal2: t.String(),\n\t\tdouble1: t.Number({ minimum: CONSTANTS.INT48_MIN, maximum: CONSTANTS.INT48_MAX }),\n\t\tdouble2: t.Number({ minimum: 0, maximum: CONSTANTS.INT48_UNSIGNED_MAX }),\n\t\tfloat1: t.Number({ minimum: CONSTANTS.INT24_MIN, maximum: CONSTANTS.INT24_MAX }),\n\t\tfloat2: t.Number({ minimum: 0, maximum: CONSTANTS.INT24_UNSIGNED_MAX }),\n\t\tint1: t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: CONSTANTS.INT32_MAX }),\n\t\tint2: t.Integer({ minimum: 0, maximum: CONSTANTS.INT32_UNSIGNED_MAX }),\n\t\tjson: jsonSchema,\n\t\tmediumint1: t.Integer({ minimum: CONSTANTS.INT24_MIN, maximum: CONSTANTS.INT24_MAX }),\n\t\tmediumint2: t.Integer({ minimum: 0, maximum: CONSTANTS.INT24_UNSIGNED_MAX }),\n\t\tenum: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\treal: t.Number({ minimum: CONSTANTS.INT48_MIN, maximum: CONSTANTS.INT48_MAX }),\n\t\tserial: t.Integer({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER }),\n\t\tsmallint1: t.Integer({ minimum: CONSTANTS.INT16_MIN, maximum: CONSTANTS.INT16_MAX }),\n\t\tsmallint2: t.Integer({ minimum: 0, maximum: CONSTANTS.INT16_UNSIGNED_MAX }),\n\t\ttext1: t.String({ maxLength: CONSTANTS.INT16_UNSIGNED_MAX }),\n\t\ttext2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\ttime: t.String(),\n\t\ttimestamp1: t.Date(),\n\t\ttimestamp2: t.String(),\n\t\ttinyint1: t.Integer({ minimum: CONSTANTS.INT8_MIN, maximum: CONSTANTS.INT8_MAX }),\n\t\ttinyint2: t.Integer({ minimum: 0, maximum: CONSTANTS.INT8_UNSIGNED_MAX }),\n\t\tvarchar1: t.String({ maxLength: 10 }),\n\t\tvarchar2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tvarbinary: t.String(),\n\t\tyear: t.Integer({ minimum: 1901, maximum: 2155 }),\n\t\tlongtext1: t.String({ maxLength: CONSTANTS.INT32_UNSIGNED_MAX }),\n\t\tlongtext2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tmediumtext1: t.String({ maxLength: CONSTANTS.INT24_UNSIGNED_MAX }),\n\t\tmediumtext2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\ttinytext1: t.String({ maxLength: CONSTANTS.INT8_UNSIGNED_MAX }),\n\t\ttinytext2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: GenericSchema<TopLevelCondition> = t.Any() as any;\n\tconst table = mysqlTable('test', {\n\t\tjson: json().$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({\n\t\tjson: t.Union([TopLevelCondition, t.Null()]),\n\t});\n\tExpect<Equal<Static<typeof result>, Static<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = mysqlTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: t.String() });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = mysqlTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: t.String() });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = mysqlTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: t.String() });\n}\n\n/* Disallow unknown keys in view qb - select */ {\n\tconst table = mysqlTable('test', { id: int() });\n\tconst view = mysqlView('test').as((qb) => qb.select().from(table));\n\tconst nestedSelect = mysqlView('test').as((qb) => qb.select({ table }).from(table));\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: t.String() });\n\t// @ts-expect-error\n\tcreateSelectSchema(nestedSelect, { table: { unknown: t.String() } });\n}\n\n/* Disallow unknown keys in view columns - select */ {\n\tconst view = mysqlView('test', { id: int() }).as(sql``);\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: t.String() });\n}\n"
  },
  {
    "path": "drizzle-typebox/tests/pg.test.ts",
    "content": "import { type Static, Type as t } from '@sinclair/typebox';\nimport { type Equal, sql } from 'drizzle-orm';\nimport {\n\tcustomType,\n\tinteger,\n\tjson,\n\tjsonb,\n\tpgEnum,\n\tpgMaterializedView,\n\tpgSchema,\n\tpgTable,\n\tpgView,\n\tserial,\n\ttext,\n} from 'drizzle-orm/pg-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport { test } from 'vitest';\nimport { jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSelectSchema, createUpdateSchema, type GenericSchema } from '../src';\nimport { Expect, expectEnumValues, expectSchemaShape } from './utils.ts';\n\nconst integerSchema = t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: CONSTANTS.INT32_MAX });\nconst textSchema = t.String();\n\ntest('table - select', (tc) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table in schema - select', (tc) => {\n\tconst schema = pgSchema('test');\n\tconst table = schema.table('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (tc) => {\n\tconst table = pgTable('test', {\n\t\tid: integer().generatedAlwaysAsIdentity().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: integer(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = t.Object({ name: textSchema, age: t.Optional(t.Union([integerSchema, t.Null()])) });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (tc) => {\n\tconst table = pgTable('test', {\n\t\tid: integer().generatedAlwaysAsIdentity().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: integer(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = t.Object({\n\t\tname: t.Optional(textSchema),\n\t\tage: t.Optional(t.Union([integerSchema, t.Null()])),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view qb - select', (tc) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = pgView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = t.Object({ id: integerSchema, age: t.Any() });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view columns - select', (tc) => {\n\tconst view = pgView('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = t.Object({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('materialized view qb - select', (tc) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = pgMaterializedView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = t.Object({ id: integerSchema, age: t.Any() });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('materialized view columns - select', (tc) => {\n\tconst view = pgView('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = t.Object({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view with nested fields - select', (tc) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = pgMaterializedView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tid: table.id,\n\t\t\tnested: {\n\t\t\t\tname: table.name,\n\t\t\t\tage: sql``.as('age'),\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = t.Object({\n\t\tid: integerSchema,\n\t\tnested: t.Object({ name: textSchema, age: t.Any() }),\n\t\ttable: t.Object({ id: integerSchema, name: textSchema }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('enum - select', (tc) => {\n\tconst enum_ = pgEnum('test', ['a', 'b', 'c']);\n\n\tconst result = createSelectSchema(enum_);\n\tconst expected = t.Enum({ a: 'a', b: 'b', c: 'c' });\n\texpectEnumValues(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - select', (tc) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().default(1),\n\t\tc4: integer().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({\n\t\tc1: t.Union([integerSchema, t.Null()]),\n\t\tc2: integerSchema,\n\t\tc3: t.Union([integerSchema, t.Null()]),\n\t\tc4: integerSchema,\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (tc) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().default(1),\n\t\tc4: integer().notNull().default(1),\n\t\tc5: integer().generatedAlwaysAs(1),\n\t\tc6: integer().generatedAlwaysAsIdentity(),\n\t\tc7: integer().generatedByDefaultAsIdentity(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([integerSchema, t.Null()])),\n\t\tc2: integerSchema,\n\t\tc3: t.Optional(t.Union([integerSchema, t.Null()])),\n\t\tc4: t.Optional(integerSchema),\n\t\tc7: t.Optional(integerSchema),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n});\n\ntest('nullability - update', (tc) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().default(1),\n\t\tc4: integer().notNull().default(1),\n\t\tc5: integer().generatedAlwaysAs(1),\n\t\tc6: integer().generatedAlwaysAsIdentity(),\n\t\tc7: integer().generatedByDefaultAsIdentity(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([integerSchema, t.Null()])),\n\t\tc2: t.Optional(integerSchema),\n\t\tc3: t.Optional(t.Union([integerSchema, t.Null()])),\n\t\tc4: t.Optional(integerSchema),\n\t\tc7: t.Optional(integerSchema),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (tc) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Union([integerSchema, t.Null()]),\n\t\tc2: t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (tc) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = t.String({ minLength: 1, maxLength: 100 });\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Union([integerSchema, t.Null()]),\n\t\tc2: t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (tc) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t\tc4: integer().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([integerSchema, t.Null()])),\n\t\tc2: t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (tc) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t\tc4: integer().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([integerSchema, t.Null()])),\n\t\tc2: t.Optional(t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 })),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine view - select', (tc) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer(),\n\t\tc3: integer(),\n\t\tc4: integer(),\n\t\tc5: integer(),\n\t\tc6: integer(),\n\t});\n\tconst view = pgView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tc1: table.c1,\n\t\t\tc2: table.c2,\n\t\t\tc3: table.c3,\n\t\t\tnested: {\n\t\t\t\tc4: table.c4,\n\t\t\t\tc5: table.c5,\n\t\t\t\tc6: table.c6,\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tnested: {\n\t\t\tc5: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\t\tc6: t.Integer({ minimum: 1, maximum: 10 }),\n\t\t},\n\t\ttable: {\n\t\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\t},\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Union([integerSchema, t.Null()]),\n\t\tc2: t.Union([t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }), t.Null()]),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tnested: t.Object({\n\t\t\tc4: t.Union([integerSchema, t.Null()]),\n\t\t\tc5: t.Union([t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }), t.Null()]),\n\t\t\tc6: t.Integer({ minimum: 1, maximum: 10 }),\n\t\t}),\n\t\ttable: t.Object({\n\t\t\tc1: t.Union([integerSchema, t.Null()]),\n\t\t\tc2: t.Union([t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }), t.Null()]),\n\t\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\t\tc4: t.Union([integerSchema, t.Null()]),\n\t\t\tc5: t.Union([integerSchema, t.Null()]),\n\t\t\tc6: t.Union([integerSchema, t.Null()]),\n\t\t}),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('all data types', (tc) => {\n\tconst table = pgTable('test', ({\n\t\tbigint,\n\t\tbigserial,\n\t\tbit,\n\t\tboolean,\n\t\tdate,\n\t\tchar,\n\t\tcidr,\n\t\tdoublePrecision,\n\t\tgeometry,\n\t\thalfvec,\n\t\tinet,\n\t\tinteger,\n\t\tinterval,\n\t\tjson,\n\t\tjsonb,\n\t\tline,\n\t\tmacaddr,\n\t\tmacaddr8,\n\t\tnumeric,\n\t\tpoint,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\tsmallserial,\n\t\ttext,\n\t\tsparsevec,\n\t\ttime,\n\t\ttimestamp,\n\t\tuuid,\n\t\tvarchar,\n\t\tvector,\n\t}) => ({\n\t\tbigint1: bigint({ mode: 'number' }).notNull(),\n\t\tbigint2: bigint({ mode: 'bigint' }).notNull(),\n\t\tbigserial1: bigserial({ mode: 'number' }).notNull(),\n\t\tbigserial2: bigserial({ mode: 'bigint' }).notNull(),\n\t\tbit: bit({ dimensions: 5 }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\tdate1: date({ mode: 'date' }).notNull(),\n\t\tdate2: date({ mode: 'string' }).notNull(),\n\t\tchar1: char({ length: 10 }).notNull(),\n\t\tchar2: char({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tcidr: cidr().notNull(),\n\t\tdoublePrecision: doublePrecision().notNull(),\n\t\tgeometry1: geometry({ type: 'point', mode: 'tuple' }).notNull(),\n\t\tgeometry2: geometry({ type: 'point', mode: 'xy' }).notNull(),\n\t\thalfvec: halfvec({ dimensions: 3 }).notNull(),\n\t\tinet: inet().notNull(),\n\t\tinteger: integer().notNull(),\n\t\tinterval: interval().notNull(),\n\t\tjson: json().notNull(),\n\t\tjsonb: jsonb().notNull(),\n\t\tline1: line({ mode: 'abc' }).notNull(),\n\t\tline2: line({ mode: 'tuple' }).notNull(),\n\t\tmacaddr: macaddr().notNull(),\n\t\tmacaddr8: macaddr8().notNull(),\n\t\tnumeric: numeric().notNull(),\n\t\tpoint1: point({ mode: 'xy' }).notNull(),\n\t\tpoint2: point({ mode: 'tuple' }).notNull(),\n\t\treal: real().notNull(),\n\t\tserial: serial().notNull(),\n\t\tsmallint: smallint().notNull(),\n\t\tsmallserial: smallserial().notNull(),\n\t\ttext1: text().notNull(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\tsparsevec: sparsevec({ dimensions: 3 }).notNull(),\n\t\ttime: time().notNull(),\n\t\ttimestamp1: timestamp({ mode: 'date' }).notNull(),\n\t\ttimestamp2: timestamp({ mode: 'string' }).notNull(),\n\t\tuuid: uuid().notNull(),\n\t\tvarchar1: varchar({ length: 10 }).notNull(),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tvector: vector({ dimensions: 3 }).notNull(),\n\t\tarray1: integer().array().notNull(),\n\t\tarray2: integer().array().array(2).notNull(),\n\t\tarray3: varchar({ length: 10 }).array().array(2).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({\n\t\tbigint1: t.Integer({ minimum: Number.MIN_SAFE_INTEGER, maximum: Number.MAX_SAFE_INTEGER }),\n\t\tbigint2: t.BigInt({ minimum: CONSTANTS.INT64_MIN, maximum: CONSTANTS.INT64_MAX }),\n\t\tbigserial1: t.Integer({ minimum: Number.MIN_SAFE_INTEGER, maximum: Number.MAX_SAFE_INTEGER }),\n\t\tbigserial2: t.BigInt({ minimum: CONSTANTS.INT64_MIN, maximum: CONSTANTS.INT64_MAX }),\n\t\tbit: t.RegExp(/^[01]+$/, { maxLength: 5 }),\n\t\tboolean: t.Boolean(),\n\t\tdate1: t.Date(),\n\t\tdate2: t.String(),\n\t\tchar1: t.String({ minLength: 10, maxLength: 10 }),\n\t\tchar2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tcidr: t.String(),\n\t\tdoublePrecision: t.Number({ minimum: CONSTANTS.INT48_MIN, maximum: CONSTANTS.INT48_MAX }),\n\t\tgeometry1: t.Tuple([t.Number(), t.Number()]),\n\t\tgeometry2: t.Object({ x: t.Number(), y: t.Number() }),\n\t\thalfvec: t.Array(t.Number(), { minItems: 3, maxItems: 3 }),\n\t\tinet: t.String(),\n\t\tinteger: t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: CONSTANTS.INT32_MAX }),\n\t\tinterval: t.String(),\n\t\tjson: jsonSchema,\n\t\tjsonb: jsonSchema,\n\t\tline1: t.Object({ a: t.Number(), b: t.Number(), c: t.Number() }),\n\t\tline2: t.Tuple([t.Number(), t.Number(), t.Number()]),\n\t\tmacaddr: t.String(),\n\t\tmacaddr8: t.String(),\n\t\tnumeric: t.String(),\n\t\tpoint1: t.Object({ x: t.Number(), y: t.Number() }),\n\t\tpoint2: t.Tuple([t.Number(), t.Number()]),\n\t\treal: t.Number({ minimum: CONSTANTS.INT24_MIN, maximum: CONSTANTS.INT24_MAX }),\n\t\tserial: t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: CONSTANTS.INT32_MAX }),\n\t\tsmallint: t.Integer({ minimum: CONSTANTS.INT16_MIN, maximum: CONSTANTS.INT16_MAX }),\n\t\tsmallserial: t.Integer({ minimum: CONSTANTS.INT16_MIN, maximum: CONSTANTS.INT16_MAX }),\n\t\ttext1: t.String(),\n\t\ttext2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tsparsevec: t.String(),\n\t\ttime: t.String(),\n\t\ttimestamp1: t.Date(),\n\t\ttimestamp2: t.String(),\n\t\tuuid: t.String({ format: 'uuid' }),\n\t\tvarchar1: t.String({ maxLength: 10 }),\n\t\tvarchar2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tvector: t.Array(t.Number(), { minItems: 3, maxItems: 3 }),\n\t\tarray1: t.Array(integerSchema),\n\t\tarray2: t.Array(t.Array(integerSchema), { minItems: 2, maxItems: 2 }),\n\t\tarray3: t.Array(t.Array(t.String({ maxLength: 10 })), { minItems: 2, maxItems: 2 }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: GenericSchema<TopLevelCondition> = t.Any() as any;\n\tconst table = pgTable('test', {\n\t\tjson: json().$type<TopLevelCondition>().notNull(),\n\t\tjsonb: jsonb().$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({\n\t\tjson: TopLevelCondition,\n\t\tjsonb: t.Union([TopLevelCondition, t.Null()]),\n\t});\n\tExpect<Equal<Static<typeof result>, Static<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = pgTable('test', { id: integer() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: t.String() });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = pgTable('test', { id: integer() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: t.String() });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = pgTable('test', { id: integer() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: t.String() });\n}\n\n/* Disallow unknown keys in view qb - select */ {\n\tconst table = pgTable('test', { id: integer() });\n\tconst view = pgView('test').as((qb) => qb.select().from(table));\n\tconst mView = pgMaterializedView('test').as((qb) => qb.select().from(table));\n\tconst nestedSelect = pgView('test').as((qb) => qb.select({ table }).from(table));\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: t.String() });\n\t// @ts-expect-error\n\tcreateSelectSchema(mView, { unknown: t.String() });\n\t// @ts-expect-error\n\tcreateSelectSchema(nestedSelect, { table: { unknown: t.String() } });\n}\n\n/* Disallow unknown keys in view columns - select */ {\n\tconst view = pgView('test', { id: integer() }).as(sql``);\n\tconst mView = pgView('test', { id: integer() }).as(sql``);\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: t.String() });\n\t// @ts-expect-error\n\tcreateSelectSchema(mView, { unknown: t.String() });\n}\n"
  },
  {
    "path": "drizzle-typebox/tests/singlestore.test.ts",
    "content": "import { type Static, Type as t } from '@sinclair/typebox';\nimport { type Equal } from 'drizzle-orm';\nimport { customType, int, json, serial, singlestoreSchema, singlestoreTable, text } from 'drizzle-orm/singlestore-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport { test } from 'vitest';\nimport { jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSelectSchema, createUpdateSchema, type GenericSchema } from '../src';\nimport { Expect, expectSchemaShape } from './utils.ts';\n\nconst intSchema = t.Integer({\n\tminimum: CONSTANTS.INT32_MIN,\n\tmaximum: CONSTANTS.INT32_MAX,\n});\nconst serialNumberModeSchema = t.Integer({\n\tminimum: 0,\n\tmaximum: Number.MAX_SAFE_INTEGER,\n});\nconst textSchema = t.String({ maxLength: CONSTANTS.INT16_UNSIGNED_MAX });\n\ntest('table - select', (tc) => {\n\tconst table = singlestoreTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table in schema - select', (tc) => {\n\tconst schema = singlestoreSchema('test');\n\tconst table = schema.table('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (tc) => {\n\tconst table = singlestoreTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = t.Object({\n\t\tid: t.Optional(serialNumberModeSchema),\n\t\tname: textSchema,\n\t\tage: t.Optional(t.Union([intSchema, t.Null()])),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (tc) => {\n\tconst table = singlestoreTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = t.Object({\n\t\tid: t.Optional(serialNumberModeSchema),\n\t\tname: t.Optional(textSchema),\n\t\tage: t.Optional(t.Union([intSchema, t.Null()])),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n// TODO: SingleStore doesn't support views yet. Add these tests when they're added\n\n// test('view qb - select', (tc) => {\n// \tconst table = singlestoreTable('test', {\n// \t\tid: serial().primaryKey(),\n// \t\tname: text().notNull(),\n// \t});\n// \tconst view = mysqlView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n// \tconst result = createSelectSchema(view);\n// \tconst expected = t.Object({ id: serialNumberModeSchema, age: t.Any() });\n// \texpectSchemaShape(tc, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\n// test('view columns - select', (tc) => {\n// \tconst view = mysqlView('test', {\n// \t\tid: serial().primaryKey(),\n// \t\tname: text().notNull(),\n// \t}).as(sql``);\n\n// \tconst result = createSelectSchema(view);\n// \tconst expected = t.Object({ id: serialNumberModeSchema, name: textSchema });\n// \texpectSchemaShape(tc, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\n// test('view with nested fields - select', (tc) => {\n// \tconst table = singlestoreTable('test', {\n// \t\tid: serial().primaryKey(),\n// \t\tname: text().notNull(),\n// \t});\n// \tconst view = mysqlView('test').as((qb) =>\n// \t\tqb.select({\n// \t\t\tid: table.id,\n// \t\t\tnested: {\n// \t\t\t\tname: table.name,\n// \t\t\t\tage: sql``.as('age'),\n// \t\t\t},\n// \t\t\ttable,\n// \t\t}).from(table)\n// \t);\n\n// \tconst result = createSelectSchema(view);\n// \tconst expected = t.Object({\n// \t\tid: serialNumberModeSchema,\n// \t\tnested: t.Object({ name: textSchema, age: t.Any() }),\n// \t\ttable: t.Object({ id: serialNumberModeSchema, name: textSchema }),\n// \t});\n// \texpectSchemaShape(tc, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\ntest('nullability - select', (tc) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({\n\t\tc1: t.Union([intSchema, t.Null()]),\n\t\tc2: intSchema,\n\t\tc3: t.Union([intSchema, t.Null()]),\n\t\tc4: intSchema,\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (tc) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc2: intSchema,\n\t\tc3: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc4: t.Optional(intSchema),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - update', (tc) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc2: t.Optional(intSchema),\n\t\tc3: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc4: t.Optional(intSchema),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (tc) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Union([intSchema, t.Null()]),\n\t\tc2: t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (tc) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = t.String({ minLength: 1, maxLength: 100 });\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Union([intSchema, t.Null()]),\n\t\tc2: t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (tc) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc2: t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (tc) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc2: t.Optional(t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 })),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n// test('refine view - select', (tc) => {\n// \tconst table = singlestoreTable('test', {\n// \t\tc1: int(),\n// \t\tc2: int(),\n// \t\tc3: int(),\n// \t\tc4: int(),\n// \t\tc5: int(),\n// \t\tc6: int(),\n// \t});\n// \tconst view = mysqlView('test').as((qb) =>\n// \t\tqb.select({\n// \t\t\tc1: table.c1,\n// \t\t\tc2: table.c2,\n// \t\t\tc3: table.c3,\n// \t\t\tnested: {\n// \t\t\t\tc4: table.c4,\n// \t\t\t\tc5: table.c5,\n// \t\t\t\tc6: table.c6,\n// \t\t\t},\n// \t\t\ttable,\n// \t\t}).from(table)\n// \t);\n\n// \tconst result = createSelectSchema(view, {\n// \t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n// \t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n// \t\tnested: {\n// \t\t\tc5: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n// \t\t\tc6: t.Integer({ minimum: 1, maximum: 10 }),\n// \t\t},\n// \t\ttable: {\n// \t\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n// \t\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n// \t\t},\n// \t});\n// \tconst expected = t.Object({\n// \t\tc1: t.Union([intSchema, t.Null()]),\n// \t\tc2: t.Union([t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }), t.Null()]),\n// \t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n// \t\tnested: t.Object({\n// \t\t\tc4: t.Union([intSchema, t.Null()]),\n// \t\t\tc5: t.Union([t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }), t.Null()]),\n// \t\t\tc6: t.Integer({ minimum: 1, maximum: 10 }),\n// \t\t}),\n// \t\ttable: t.Object({\n// \t\t\tc1: t.Union([intSchema, t.Null()]),\n// \t\t\tc2: t.Union([t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: 1000 }), t.Null()]),\n// \t\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n// \t\t\tc4: t.Union([intSchema, t.Null()]),\n// \t\t\tc5: t.Union([intSchema, t.Null()]),\n// \t\t\tc6: t.Union([intSchema, t.Null()]),\n// \t\t}),\n// \t});\n// \texpectSchemaShape(tc, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\ntest('all data types', (tc) => {\n\tconst table = singlestoreTable('test', ({\n\t\tbigint,\n\t\tbinary,\n\t\tboolean,\n\t\tchar,\n\t\tdate,\n\t\tdatetime,\n\t\tdecimal,\n\t\tdouble,\n\t\tfloat,\n\t\tint,\n\t\tjson,\n\t\tmediumint,\n\t\tsinglestoreEnum,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\ttext,\n\t\ttime,\n\t\ttimestamp,\n\t\ttinyint,\n\t\tvarchar,\n\t\tvarbinary,\n\t\tyear,\n\t\tlongtext,\n\t\tmediumtext,\n\t\ttinytext,\n\t}) => ({\n\t\tbigint1: bigint({ mode: 'number' }).notNull(),\n\t\tbigint2: bigint({ mode: 'bigint' }).notNull(),\n\t\tbigint3: bigint({ unsigned: true, mode: 'number' }).notNull(),\n\t\tbigint4: bigint({ unsigned: true, mode: 'bigint' }).notNull(),\n\t\tbinary: binary({ length: 10 }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\tchar1: char({ length: 10 }).notNull(),\n\t\tchar2: char({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tdate1: date({ mode: 'date' }).notNull(),\n\t\tdate2: date({ mode: 'string' }).notNull(),\n\t\tdatetime1: datetime({ mode: 'date' }).notNull(),\n\t\tdatetime2: datetime({ mode: 'string' }).notNull(),\n\t\tdecimal1: decimal().notNull(),\n\t\tdecimal2: decimal({ unsigned: true }).notNull(),\n\t\tdouble1: double().notNull(),\n\t\tdouble2: double({ unsigned: true }).notNull(),\n\t\tfloat1: float().notNull(),\n\t\tfloat2: float({ unsigned: true }).notNull(),\n\t\tint1: int().notNull(),\n\t\tint2: int({ unsigned: true }).notNull(),\n\t\tjson: json().notNull(),\n\t\tmediumint1: mediumint().notNull(),\n\t\tmediumint2: mediumint({ unsigned: true }).notNull(),\n\t\tenum: singlestoreEnum('enum', ['a', 'b', 'c']).notNull(),\n\t\treal: real().notNull(),\n\t\tserial: serial().notNull(),\n\t\tsmallint1: smallint().notNull(),\n\t\tsmallint2: smallint({ unsigned: true }).notNull(),\n\t\ttext1: text().notNull(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttime: time().notNull(),\n\t\ttimestamp1: timestamp({ mode: 'date' }).notNull(),\n\t\ttimestamp2: timestamp({ mode: 'string' }).notNull(),\n\t\ttinyint1: tinyint().notNull(),\n\t\ttinyint2: tinyint({ unsigned: true }).notNull(),\n\t\tvarchar1: varchar({ length: 10 }).notNull(),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tvarbinary: varbinary({ length: 10 }).notNull(),\n\t\tyear: year().notNull(),\n\t\tlongtext1: longtext().notNull(),\n\t\tlongtext2: longtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\tmediumtext1: mediumtext().notNull(),\n\t\tmediumtext2: mediumtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttinytext1: tinytext().notNull(),\n\t\ttinytext2: tinytext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({\n\t\tbigint1: t.Integer({ minimum: Number.MIN_SAFE_INTEGER, maximum: Number.MAX_SAFE_INTEGER }),\n\t\tbigint2: t.BigInt({ minimum: CONSTANTS.INT64_MIN, maximum: CONSTANTS.INT64_MAX }),\n\t\tbigint3: t.Integer({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER }),\n\t\tbigint4: t.BigInt({ minimum: 0n, maximum: CONSTANTS.INT64_UNSIGNED_MAX }),\n\t\tbinary: t.String(),\n\t\tboolean: t.Boolean(),\n\t\tchar1: t.String({ minLength: 10, maxLength: 10 }),\n\t\tchar2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tdate1: t.Date(),\n\t\tdate2: t.String(),\n\t\tdatetime1: t.Date(),\n\t\tdatetime2: t.String(),\n\t\tdecimal1: t.String(),\n\t\tdecimal2: t.String(),\n\t\tdouble1: t.Number({ minimum: CONSTANTS.INT48_MIN, maximum: CONSTANTS.INT48_MAX }),\n\t\tdouble2: t.Number({ minimum: 0, maximum: CONSTANTS.INT48_UNSIGNED_MAX }),\n\t\tfloat1: t.Number({ minimum: CONSTANTS.INT24_MIN, maximum: CONSTANTS.INT24_MAX }),\n\t\tfloat2: t.Number({ minimum: 0, maximum: CONSTANTS.INT24_UNSIGNED_MAX }),\n\t\tint1: t.Integer({ minimum: CONSTANTS.INT32_MIN, maximum: CONSTANTS.INT32_MAX }),\n\t\tint2: t.Integer({ minimum: 0, maximum: CONSTANTS.INT32_UNSIGNED_MAX }),\n\t\tjson: jsonSchema,\n\t\tmediumint1: t.Integer({ minimum: CONSTANTS.INT24_MIN, maximum: CONSTANTS.INT24_MAX }),\n\t\tmediumint2: t.Integer({ minimum: 0, maximum: CONSTANTS.INT24_UNSIGNED_MAX }),\n\t\tenum: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\treal: t.Number({ minimum: CONSTANTS.INT48_MIN, maximum: CONSTANTS.INT48_MAX }),\n\t\tserial: t.Integer({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER }),\n\t\tsmallint1: t.Integer({ minimum: CONSTANTS.INT16_MIN, maximum: CONSTANTS.INT16_MAX }),\n\t\tsmallint2: t.Integer({ minimum: 0, maximum: CONSTANTS.INT16_UNSIGNED_MAX }),\n\t\ttext1: t.String({ maxLength: CONSTANTS.INT16_UNSIGNED_MAX }),\n\t\ttext2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\ttime: t.String(),\n\t\ttimestamp1: t.Date(),\n\t\ttimestamp2: t.String(),\n\t\ttinyint1: t.Integer({ minimum: CONSTANTS.INT8_MIN, maximum: CONSTANTS.INT8_MAX }),\n\t\ttinyint2: t.Integer({ minimum: 0, maximum: CONSTANTS.INT8_UNSIGNED_MAX }),\n\t\tvarchar1: t.String({ maxLength: 10 }),\n\t\tvarchar2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tvarbinary: t.String(),\n\t\tyear: t.Integer({ minimum: 1901, maximum: 2155 }),\n\t\tlongtext1: t.String({ maxLength: CONSTANTS.INT32_UNSIGNED_MAX }),\n\t\tlongtext2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tmediumtext1: t.String({ maxLength: CONSTANTS.INT24_UNSIGNED_MAX }),\n\t\tmediumtext2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\ttinytext1: t.String({ maxLength: CONSTANTS.INT8_UNSIGNED_MAX }),\n\t\ttinytext2: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: GenericSchema<TopLevelCondition> = t.Any() as any;\n\tconst table = singlestoreTable('test', {\n\t\tjson: json().$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({\n\t\tjson: t.Union([TopLevelCondition, t.Null()]),\n\t});\n\tExpect<Equal<Static<typeof result>, Static<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = singlestoreTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: t.String() });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = singlestoreTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: t.String() });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = singlestoreTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: t.String() });\n}\n\n// /* Disallow unknown keys in view qb - select */ {\n// \tconst table = singlestoreTable('test', { id: int() });\n// \tconst view = mysqlView('test').as((qb) => qb.select().from(table));\n// \tconst nestedSelect = mysqlView('test').as((qb) => qb.select({ table }).from(table));\n// \t// @ts-expect-error\n// \tcreateSelectSchema(view, { unknown: t.String() });\n// \t// @ts-expect-error\n// \tcreateSelectSchema(nestedSelect, { table: { unknown: t.String() } });\n// }\n\n// /* Disallow unknown keys in view columns - select */ {\n// \tconst view = mysqlView('test', { id: int() }).as(sql``);\n// \t// @ts-expect-error\n// \tcreateSelectSchema(view, { unknown: t.String() });\n// }\n"
  },
  {
    "path": "drizzle-typebox/tests/sqlite.test.ts",
    "content": "import { type Static, Type as t } from '@sinclair/typebox';\nimport { type Equal, sql } from 'drizzle-orm';\nimport { blob, customType, int, sqliteTable, sqliteView, text } from 'drizzle-orm/sqlite-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport { test } from 'vitest';\nimport { bufferSchema, jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSelectSchema, createUpdateSchema, type GenericSchema } from '../src';\nimport { Expect, expectSchemaShape } from './utils.ts';\n\nconst intSchema = t.Integer({ minimum: Number.MIN_SAFE_INTEGER, maximum: Number.MAX_SAFE_INTEGER });\nconst textSchema = t.String();\n\ntest('table - select', (tc) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({ id: intSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (tc) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = t.Object({\n\t\tid: t.Optional(intSchema),\n\t\tname: textSchema,\n\t\tage: t.Optional(t.Union([intSchema, t.Null()])),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (tc) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = t.Object({\n\t\tid: t.Optional(intSchema),\n\t\tname: t.Optional(textSchema),\n\t\tage: t.Optional(t.Union([intSchema, t.Null()])),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view qb - select', (tc) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t});\n\tconst view = sqliteView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = t.Object({ id: intSchema, age: t.Any() });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view columns - select', (tc) => {\n\tconst view = sqliteView('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = t.Object({ id: intSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view with nested fields - select', (tc) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t});\n\tconst view = sqliteView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tid: table.id,\n\t\t\tnested: {\n\t\t\t\tname: table.name,\n\t\t\t\tage: sql``.as('age'),\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = t.Object({\n\t\tid: intSchema,\n\t\tnested: t.Object({ name: textSchema, age: t.Any() }),\n\t\ttable: t.Object({ id: intSchema, name: textSchema }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - select', (tc) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({\n\t\tc1: t.Union([intSchema, t.Null()]),\n\t\tc2: intSchema,\n\t\tc3: t.Union([intSchema, t.Null()]),\n\t\tc4: intSchema,\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (tc) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc2: intSchema,\n\t\tc3: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc4: t.Optional(intSchema),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - update', (tc) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc2: t.Optional(intSchema),\n\t\tc3: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc4: t.Optional(intSchema),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (tc) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Union([intSchema, t.Null()]),\n\t\tc2: t.Integer({ minimum: Number.MIN_SAFE_INTEGER, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (tc) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = t.String({ minLength: 1, maxLength: 100 });\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Union([intSchema, t.Null()]),\n\t\tc2: t.Integer({ minimum: Number.MIN_SAFE_INTEGER, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (tc) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc2: t.Integer({ minimum: Number.MIN_SAFE_INTEGER, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (tc) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Optional(t.Union([intSchema, t.Null()])),\n\t\tc2: t.Optional(t.Integer({ minimum: Number.MIN_SAFE_INTEGER, maximum: 1000 })),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine view - select', (tc) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int(),\n\t\tc3: int(),\n\t\tc4: int(),\n\t\tc5: int(),\n\t\tc6: int(),\n\t});\n\tconst view = sqliteView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tc1: table.c1,\n\t\t\tc2: table.c2,\n\t\t\tc3: table.c3,\n\t\t\tnested: {\n\t\t\t\tc4: table.c4,\n\t\t\t\tc5: table.c5,\n\t\t\t\tc6: table.c6,\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view, {\n\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tnested: {\n\t\t\tc5: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\t\tc6: t.Integer({ minimum: 1, maximum: 10 }),\n\t\t},\n\t\ttable: {\n\t\t\tc2: (schema) => t.Integer({ minimum: schema.minimum, maximum: 1000 }),\n\t\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\t},\n\t});\n\tconst expected = t.Object({\n\t\tc1: t.Union([intSchema, t.Null()]),\n\t\tc2: t.Union([t.Integer({ minimum: Number.MIN_SAFE_INTEGER, maximum: 1000 }), t.Null()]),\n\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\tnested: t.Object({\n\t\t\tc4: t.Union([intSchema, t.Null()]),\n\t\t\tc5: t.Union([t.Integer({ minimum: Number.MIN_SAFE_INTEGER, maximum: 1000 }), t.Null()]),\n\t\t\tc6: t.Integer({ minimum: 1, maximum: 10 }),\n\t\t}),\n\t\ttable: t.Object({\n\t\t\tc1: t.Union([intSchema, t.Null()]),\n\t\t\tc2: t.Union([t.Integer({ minimum: Number.MIN_SAFE_INTEGER, maximum: 1000 }), t.Null()]),\n\t\t\tc3: t.Integer({ minimum: 1, maximum: 10 }),\n\t\t\tc4: t.Union([intSchema, t.Null()]),\n\t\t\tc5: t.Union([intSchema, t.Null()]),\n\t\t\tc6: t.Union([intSchema, t.Null()]),\n\t\t}),\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('all data types', (tc) => {\n\tconst table = sqliteTable('test', ({\n\t\tblob,\n\t\tinteger,\n\t\tnumeric,\n\t\treal,\n\t\ttext,\n\t}) => ({\n\t\tblob1: blob({ mode: 'buffer' }).notNull(),\n\t\tblob2: blob({ mode: 'bigint' }).notNull(),\n\t\tblob3: blob({ mode: 'json' }).notNull(),\n\t\tinteger1: integer({ mode: 'number' }).notNull(),\n\t\tinteger2: integer({ mode: 'boolean' }).notNull(),\n\t\tinteger3: integer({ mode: 'timestamp' }).notNull(),\n\t\tinteger4: integer({ mode: 'timestamp_ms' }).notNull(),\n\t\tnumeric: numeric().notNull(),\n\t\treal: real().notNull(),\n\t\ttext1: text({ mode: 'text' }).notNull(),\n\t\ttext2: text({ mode: 'text', length: 10 }).notNull(),\n\t\ttext3: text({ mode: 'text', enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttext4: text({ mode: 'json' }).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({\n\t\tblob1: bufferSchema,\n\t\tblob2: t.BigInt({ minimum: CONSTANTS.INT64_MIN, maximum: CONSTANTS.INT64_MAX }),\n\t\tblob3: jsonSchema,\n\t\tinteger1: t.Integer({ minimum: Number.MIN_SAFE_INTEGER, maximum: Number.MAX_SAFE_INTEGER }),\n\t\tinteger2: t.Boolean(),\n\t\tinteger3: t.Date(),\n\t\tinteger4: t.Date(),\n\t\tnumeric: t.String(),\n\t\treal: t.Number({ minimum: CONSTANTS.INT48_MIN, maximum: CONSTANTS.INT48_MAX }),\n\t\ttext1: t.String(),\n\t\ttext2: t.String({ maxLength: 10 }),\n\t\ttext3: t.Enum({ a: 'a', b: 'b', c: 'c' }),\n\t\ttext4: jsonSchema,\n\t});\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: GenericSchema<TopLevelCondition> = t.Any() as any;\n\tconst table = sqliteTable('test', {\n\t\tjson1: text({ mode: 'json' }).$type<TopLevelCondition>().notNull(),\n\t\tjson2: blob({ mode: 'json' }).$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = t.Object({\n\t\tjson1: TopLevelCondition,\n\t\tjson2: t.Union([TopLevelCondition, t.Null()]),\n\t});\n\tExpect<Equal<Static<typeof result>, Static<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = sqliteTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: t.String() });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = sqliteTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: t.String() });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = sqliteTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: t.String() });\n}\n\n/* Disallow unknown keys in view qb - select */ {\n\tconst table = sqliteTable('test', { id: int() });\n\tconst view = sqliteView('test').as((qb) => qb.select().from(table));\n\tconst nestedSelect = sqliteView('test').as((qb) => qb.select({ table }).from(table));\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: t.String() });\n\t// @ts-expect-error\n\tcreateSelectSchema(nestedSelect, { table: { unknown: t.String() } });\n}\n\n/* Disallow unknown keys in view columns - select */ {\n\tconst view = sqliteView('test', { id: int() }).as(sql``);\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: t.String() });\n}\n"
  },
  {
    "path": "drizzle-typebox/tests/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"module\": \"esnext\",\n\t\t\"target\": \"esnext\",\n\t\t\"noEmit\": true,\n\t\t\"rootDir\": \"..\",\n\t\t\"outDir\": \"./.cache\"\n\t},\n\t\"include\": [\".\", \"../src\"]\n}\n"
  },
  {
    "path": "drizzle-typebox/tests/utils.ts",
    "content": "import type * as t from '@sinclair/typebox';\nimport { expect, type TaskContext } from 'vitest';\n\nfunction removeKeysFromObject(obj: Record<string, any>, keys: string[]) {\n\tfor (const key of keys) {\n\t\tdelete obj[key];\n\t}\n\treturn obj;\n}\n\nexport function expectSchemaShape<T extends t.TObject>(t: TaskContext, expected: T) {\n\treturn {\n\t\tfrom(actual: T) {\n\t\t\texpect(Object.keys(actual.properties)).toStrictEqual(Object.keys(expected.properties));\n\t\t\tconst keys = ['$id', '$schema', 'title', 'description', 'default', 'examples', 'readOnly', 'writeOnly'];\n\n\t\t\tfor (const key of Object.keys(actual.properties)) {\n\t\t\t\texpect(removeKeysFromObject(actual.properties[key]!, keys)).toStrictEqual(\n\t\t\t\t\tremoveKeysFromObject(expected.properties[key]!, keys),\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function expectEnumValues<T extends t.TEnum<any>>(t: TaskContext, expected: T) {\n\treturn {\n\t\tfrom(actual: T) {\n\t\t\texpect(actual.anyOf).toStrictEqual(expected.anyOf);\n\t\t},\n\t};\n}\n\nexport function Expect<_ extends true>() {}\n"
  },
  {
    "path": "drizzle-typebox/tsconfig.build.json",
    "content": "{\n\t\"extends\": \"./tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"rootDir\": \"src\"\n\t},\n\t\"include\": [\"src\"]\n}\n"
  },
  {
    "path": "drizzle-typebox/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"outDir\": \"dist\",\n\t\t\"baseUrl\": \".\",\n\t\t\"declaration\": true,\n\t\t\"noEmit\": true,\n\t\t\"paths\": {\n\t\t\t\"~/*\": [\"src/*\"]\n\t\t}\n\t},\n\t\"include\": [\"src\", \"*.ts\"]\n}\n"
  },
  {
    "path": "drizzle-typebox/vitest.config.ts",
    "content": "import tsconfigPaths from 'vite-tsconfig-paths';\nimport { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n\ttest: {\n\t\tinclude: [\n\t\t\t'tests/**/*.test.ts',\n\t\t],\n\t\texclude: [\n\t\t\t'tests/bun/**/*',\n\t\t],\n\t\ttypecheck: {\n\t\t\ttsconfig: 'tsconfig.json',\n\t\t},\n\t\ttestTimeout: 100000,\n\t\thookTimeout: 100000,\n\t\tisolate: false,\n\t\tpoolOptions: {\n\t\t\tthreads: {\n\t\t\t\tsingleThread: true,\n\t\t\t},\n\t\t},\n\t},\n\tplugins: [tsconfigPaths()],\n});\n"
  },
  {
    "path": "drizzle-valibot/README.md",
    "content": "`drizzle-valibot` is a plugin for [Drizzle ORM](https://github.com/drizzle-team/drizzle-orm) that allows you to generate [valibot](https://valibot.dev/) schemas from Drizzle ORM schemas.\n\n**Features**\n\n- Create a select schema for tables, views and enums.\n- Create insert and update schemas for tables.\n- Supports all dialects: PostgreSQL, MySQL and SQLite.\n\n# Usage\n\n```ts\nimport { pgEnum, pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-valibot';\nimport { string, parse, number, pipe } from 'valibot';\n\nconst users = pgTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n\trole: text('role', { enum: ['admin', 'user'] }).notNull(),\n\tcreatedAt: timestamp('created_at').notNull().defaultNow(),\n});\n\n// Schema for inserting a user - can be used to validate API requests\nconst insertUserSchema = createInsertSchema(users);\n\n// Schema for updating a user - can be used to validate API requests\nconst updateUserSchema = createUpdateSchema(users);\n\n// Schema for selecting a user - can be used to validate API responses\nconst selectUserSchema = createSelectSchema(users);\n\n// Overriding the fields\nconst insertUserSchema = createInsertSchema(users, {\n\trole: string(),\n});\n\n// Refining the fields - useful if you want to change the fields before they become nullable/optional in the final schema\nconst insertUserSchema = createInsertSchema(users, {\n\tid: (schema) => pipe([schema, minValue(0)]),\n\trole: string(),\n});\n\n// Usage\n\nconst isUserValid = parse(insertUserSchema, {\n\tname: 'John Doe',\n\temail: 'johndoe@test.com',\n\trole: 'admin',\n});\n```\n"
  },
  {
    "path": "drizzle-valibot/package.json",
    "content": "{\n\t\"name\": \"drizzle-valibot\",\n\t\"version\": \"0.4.2\",\n\t\"description\": \"Generate valibot schemas from Drizzle ORM schemas\",\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"build\": \"tsx scripts/build.ts\",\n\t\t\"b\": \"pnpm build\",\n\t\t\"test:types\": \"cd tests && tsc\",\n\t\t\"pack\": \"(cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz\",\n\t\t\"publish\": \"npm publish package.tgz\",\n\t\t\"test\": \"vitest run\"\n\t},\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./index.d.mts\",\n\t\t\t\t\"default\": \"./index.mjs\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./index.d.cjs\",\n\t\t\t\t\"default\": \"./index.cjs\"\n\t\t\t},\n\t\t\t\"types\": \"./index.d.ts\",\n\t\t\t\"default\": \"./index.mjs\"\n\t\t}\n\t},\n\t\"main\": \"./index.cjs\",\n\t\"module\": \"./index.mjs\",\n\t\"types\": \"./index.d.ts\",\n\t\"publishConfig\": {\n\t\t\"provenance\": true\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git+https://github.com/drizzle-team/drizzle-orm.git\"\n\t},\n\t\"keywords\": [\n\t\t\"valibot\",\n\t\t\"validate\",\n\t\t\"validation\",\n\t\t\"schema\",\n\t\t\"drizzle\",\n\t\t\"orm\",\n\t\t\"pg\",\n\t\t\"mysql\",\n\t\t\"postgresql\",\n\t\t\"postgres\",\n\t\t\"sqlite\",\n\t\t\"database\",\n\t\t\"sql\",\n\t\t\"typescript\",\n\t\t\"ts\"\n\t],\n\t\"author\": \"Drizzle Team\",\n\t\"license\": \"Apache-2.0\",\n\t\"peerDependencies\": {\n\t\t\"drizzle-orm\": \">=0.36.0\",\n\t\t\"valibot\": \">=1.0.0-beta.7\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@rollup/plugin-typescript\": \"^11.1.0\",\n\t\t\"@types/node\": \"^18.15.10\",\n\t\t\"cpy\": \"^10.1.0\",\n\t\t\"drizzle-orm\": \"link:../drizzle-orm/dist\",\n\t\t\"json-rules-engine\": \"^7.3.1\",\n\t\t\"rimraf\": \"^5.0.0\",\n\t\t\"rollup\": \"^3.29.5\",\n\t\t\"valibot\": \"1.0.0-beta.7\",\n\t\t\"vite-tsconfig-paths\": \"^4.3.2\",\n\t\t\"vitest\": \"^3.1.3\",\n\t\t\"zx\": \"^7.2.2\"\n\t}\n}\n"
  },
  {
    "path": "drizzle-valibot/rollup.config.ts",
    "content": "import typescript from '@rollup/plugin-typescript';\nimport { defineConfig } from 'rollup';\n\nexport default defineConfig([\n\t{\n\t\tinput: 'src/index.ts',\n\t\toutput: [\n\t\t\t{\n\t\t\t\tformat: 'esm',\n\t\t\t\tdir: 'dist',\n\t\t\t\tentryFileNames: '[name].mjs',\n\t\t\t\tchunkFileNames: '[name]-[hash].mjs',\n\t\t\t\tsourcemap: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tformat: 'cjs',\n\t\t\t\tdir: 'dist',\n\t\t\t\tentryFileNames: '[name].cjs',\n\t\t\t\tchunkFileNames: '[name]-[hash].cjs',\n\t\t\t\tsourcemap: true,\n\t\t\t},\n\t\t],\n\t\texternal: [\n\t\t\t/^drizzle-orm\\/?/,\n\t\t\t'valibot',\n\t\t],\n\t\tplugins: [\n\t\t\ttypescript({\n\t\t\t\ttsconfig: 'tsconfig.build.json',\n\t\t\t}),\n\t\t],\n\t},\n]);\n"
  },
  {
    "path": "drizzle-valibot/scripts/build.ts",
    "content": "#!/usr/bin/env -S pnpm tsx\nimport 'zx/globals';\nimport cpy from 'cpy';\n\nawait fs.remove('dist');\nawait $`rollup --config rollup.config.ts --configPlugin typescript`;\nawait $`resolve-tspaths`;\nawait fs.copy('README.md', 'dist/README.md');\nawait cpy('dist/**/*.d.ts', 'dist', {\n\trename: (basename) => basename.replace(/\\.d\\.ts$/, '.d.mts'),\n});\nawait cpy('dist/**/*.d.ts', 'dist', {\n\trename: (basename) => basename.replace(/\\.d\\.ts$/, '.d.cts'),\n});\nawait fs.copy('package.json', 'dist/package.json');\nawait $`scripts/fix-imports.ts`;\n"
  },
  {
    "path": "drizzle-valibot/scripts/fix-imports.ts",
    "content": "#!/usr/bin/env -S pnpm tsx\nimport 'zx/globals';\n\nimport path from 'node:path';\nimport { parse, print, visit } from 'recast';\nimport parser from 'recast/parsers/typescript';\n\nfunction resolvePathAlias(importPath: string, file: string) {\n\tif (importPath.startsWith('~/')) {\n\t\tconst relativePath = path.relative(path.dirname(file), path.resolve('dist.new', importPath.slice(2)));\n\t\timportPath = relativePath.startsWith('.') ? relativePath : './' + relativePath;\n\t}\n\n\treturn importPath;\n}\n\nfunction fixImportPath(importPath: string, file: string, ext: string) {\n\timportPath = resolvePathAlias(importPath, file);\n\n\tif (!/\\..*\\.(js|ts)$/.test(importPath)) {\n\t\treturn importPath;\n\t}\n\n\treturn importPath.replace(/\\.(js|ts)$/, ext);\n}\n\nconst cjsFiles = await glob('dist/**/*.{cjs,d.cts}');\n\nawait Promise.all(cjsFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitCallExpression(path) {\n\t\t\tif (path.value.callee.type === 'Identifier' && path.value.callee.name === 'require') {\n\t\t\t\tpath.value.arguments[0].value = fixImportPath(path.value.arguments[0].value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = resolvePathAlias(path.value.argument.value, file);\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n\nlet esmFiles = await glob('dist/**/*.{js,d.ts}');\n\nawait Promise.all(esmFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = fixImportPath(path.value.argument.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.js');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n\nesmFiles = await glob('dist/**/*.{mjs,d.mts}');\n\nawait Promise.all(esmFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.mjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.mjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.mjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = fixImportPath(path.value.argument.value, file, '.mjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.mjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n"
  },
  {
    "path": "drizzle-valibot/src/column.ts",
    "content": "import type { Column, ColumnBaseConfig } from 'drizzle-orm';\nimport type {\n\tMySqlBigInt53,\n\tMySqlChar,\n\tMySqlDouble,\n\tMySqlFloat,\n\tMySqlInt,\n\tMySqlMediumInt,\n\tMySqlReal,\n\tMySqlSerial,\n\tMySqlSmallInt,\n\tMySqlText,\n\tMySqlTinyInt,\n\tMySqlVarChar,\n\tMySqlYear,\n} from 'drizzle-orm/mysql-core';\nimport type {\n\tPgArray,\n\tPgBigInt53,\n\tPgBigSerial53,\n\tPgBinaryVector,\n\tPgChar,\n\tPgDoublePrecision,\n\tPgGeometry,\n\tPgGeometryObject,\n\tPgHalfVector,\n\tPgInteger,\n\tPgLineABC,\n\tPgLineTuple,\n\tPgPointObject,\n\tPgPointTuple,\n\tPgReal,\n\tPgSerial,\n\tPgSmallInt,\n\tPgSmallSerial,\n\tPgUUID,\n\tPgVarchar,\n\tPgVector,\n} from 'drizzle-orm/pg-core';\nimport type {\n\tSingleStoreBigInt53,\n\tSingleStoreChar,\n\tSingleStoreDouble,\n\tSingleStoreFloat,\n\tSingleStoreInt,\n\tSingleStoreMediumInt,\n\tSingleStoreReal,\n\tSingleStoreSerial,\n\tSingleStoreSmallInt,\n\tSingleStoreText,\n\tSingleStoreTinyInt,\n\tSingleStoreVarChar,\n\tSingleStoreYear,\n} from 'drizzle-orm/singlestore-core';\nimport type { SQLiteInteger, SQLiteReal, SQLiteText } from 'drizzle-orm/sqlite-core';\nimport * as v from 'valibot';\nimport { CONSTANTS } from './constants.ts';\nimport { isColumnType, isWithEnum } from './utils.ts';\nimport type { Json } from './utils.ts';\n\nexport const literalSchema = v.union([v.string(), v.number(), v.boolean(), v.null()]);\nexport const jsonSchema: v.GenericSchema<Json> = v.union([\n\tliteralSchema,\n\tv.array(v.any()),\n\tv.record(v.string(), v.any()),\n]);\nexport const bufferSchema: v.GenericSchema<Buffer> = v.custom<Buffer>((v) => v instanceof Buffer); // eslint-disable-line no-instanceof/no-instanceof\n\nexport function mapEnumValues(values: string[]) {\n\treturn Object.fromEntries(values.map((value) => [value, value]));\n}\n\nexport function columnToSchema(column: Column): v.GenericSchema {\n\tlet schema!: v.GenericSchema;\n\n\tif (isWithEnum(column)) {\n\t\tschema = column.enumValues.length ? v.enum(mapEnumValues(column.enumValues)) : v.string();\n\t}\n\n\tif (!schema) {\n\t\t// Handle specific types\n\t\tif (isColumnType<PgGeometry<any> | PgPointTuple<any>>(column, ['PgGeometry', 'PgPointTuple'])) {\n\t\t\tschema = v.tuple([v.number(), v.number()]);\n\t\t} else if (\n\t\t\tisColumnType<PgPointObject<any> | PgGeometryObject<any>>(column, ['PgGeometryObject', 'PgPointObject'])\n\t\t) {\n\t\t\tschema = v.object({ x: v.number(), y: v.number() });\n\t\t} else if (isColumnType<PgHalfVector<any> | PgVector<any>>(column, ['PgHalfVector', 'PgVector'])) {\n\t\t\tschema = v.array(v.number());\n\t\t\tschema = column.dimensions ? v.pipe(schema as v.ArraySchema<any, any>, v.length(column.dimensions)) : schema;\n\t\t} else if (isColumnType<PgLineTuple<any>>(column, ['PgLine'])) {\n\t\t\tschema = v.tuple([v.number(), v.number(), v.number()]);\n\t\t\tv.array(v.array(v.number()));\n\t\t} else if (isColumnType<PgLineABC<any>>(column, ['PgLineABC'])) {\n\t\t\tschema = v.object({ a: v.number(), b: v.number(), c: v.number() });\n\t\t} // Handle other types\n\t\telse if (isColumnType<PgArray<any, any>>(column, ['PgArray'])) {\n\t\t\tschema = v.array(columnToSchema(column.baseColumn));\n\t\t\tschema = column.size ? v.pipe(schema as v.ArraySchema<any, any>, v.length(column.size)) : schema;\n\t\t} else if (column.dataType === 'array') {\n\t\t\tschema = v.array(v.any());\n\t\t} else if (column.dataType === 'number') {\n\t\t\tschema = numberColumnToSchema(column);\n\t\t} else if (column.dataType === 'bigint') {\n\t\t\tschema = bigintColumnToSchema(column);\n\t\t} else if (column.dataType === 'boolean') {\n\t\t\tschema = v.boolean();\n\t\t} else if (column.dataType === 'date') {\n\t\t\tschema = v.date();\n\t\t} else if (column.dataType === 'string') {\n\t\t\tschema = stringColumnToSchema(column);\n\t\t} else if (column.dataType === 'json') {\n\t\t\tschema = jsonSchema;\n\t\t} else if (column.dataType === 'custom') {\n\t\t\tschema = v.any();\n\t\t} else if (column.dataType === 'buffer') {\n\t\t\tschema = bufferSchema;\n\t\t}\n\t}\n\n\tif (!schema) {\n\t\tschema = v.any();\n\t}\n\n\treturn schema;\n}\n\nfunction numberColumnToSchema(column: Column): v.GenericSchema {\n\tlet unsigned = column.getSQLType().includes('unsigned');\n\tlet min!: number;\n\tlet max!: number;\n\tlet integer = false;\n\n\tif (isColumnType<MySqlTinyInt<any> | SingleStoreTinyInt<any>>(column, ['MySqlTinyInt', 'SingleStoreTinyInt'])) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT8_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT8_UNSIGNED_MAX : CONSTANTS.INT8_MAX;\n\t\tinteger = true;\n\t} else if (\n\t\tisColumnType<PgSmallInt<any> | PgSmallSerial<any> | MySqlSmallInt<any> | SingleStoreSmallInt<any>>(column, [\n\t\t\t'PgSmallInt',\n\t\t\t'PgSmallSerial',\n\t\t\t'MySqlSmallInt',\n\t\t\t'SingleStoreSmallInt',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT16_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT16_UNSIGNED_MAX : CONSTANTS.INT16_MAX;\n\t\tinteger = true;\n\t} else if (\n\t\tisColumnType<\n\t\t\tPgReal<any> | MySqlFloat<any> | MySqlMediumInt<any> | SingleStoreFloat<any> | SingleStoreMediumInt<any>\n\t\t>(column, [\n\t\t\t'PgReal',\n\t\t\t'MySqlFloat',\n\t\t\t'MySqlMediumInt',\n\t\t\t'SingleStoreFloat',\n\t\t\t'SingleStoreMediumInt',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT24_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT24_UNSIGNED_MAX : CONSTANTS.INT24_MAX;\n\t\tinteger = isColumnType(column, ['MySqlMediumInt', 'SingleStoreMediumInt']);\n\t} else if (\n\t\tisColumnType<PgInteger<any> | PgSerial<any> | MySqlInt<any> | SingleStoreInt<any>>(column, [\n\t\t\t'PgInteger',\n\t\t\t'PgSerial',\n\t\t\t'MySqlInt',\n\t\t\t'SingleStoreInt',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT32_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT32_UNSIGNED_MAX : CONSTANTS.INT32_MAX;\n\t\tinteger = true;\n\t} else if (\n\t\tisColumnType<\n\t\t\t| PgDoublePrecision<any>\n\t\t\t| MySqlReal<any>\n\t\t\t| MySqlDouble<any>\n\t\t\t| SingleStoreReal<any>\n\t\t\t| SingleStoreDouble<any>\n\t\t\t| SQLiteReal<any>\n\t\t>(column, [\n\t\t\t'PgDoublePrecision',\n\t\t\t'MySqlReal',\n\t\t\t'MySqlDouble',\n\t\t\t'SingleStoreReal',\n\t\t\t'SingleStoreDouble',\n\t\t\t'SQLiteReal',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT48_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT48_UNSIGNED_MAX : CONSTANTS.INT48_MAX;\n\t} else if (\n\t\tisColumnType<\n\t\t\t| PgBigInt53<any>\n\t\t\t| PgBigSerial53<any>\n\t\t\t| MySqlBigInt53<any>\n\t\t\t| MySqlSerial<any>\n\t\t\t| SingleStoreBigInt53<any>\n\t\t\t| SingleStoreSerial<any>\n\t\t\t| SQLiteInteger<any>\n\t\t>(\n\t\t\tcolumn,\n\t\t\t[\n\t\t\t\t'PgBigInt53',\n\t\t\t\t'PgBigSerial53',\n\t\t\t\t'MySqlBigInt53',\n\t\t\t\t'MySqlSerial',\n\t\t\t\t'SingleStoreBigInt53',\n\t\t\t\t'SingleStoreSerial',\n\t\t\t\t'SQLiteInteger',\n\t\t\t],\n\t\t)\n\t) {\n\t\tunsigned = unsigned || isColumnType(column, ['MySqlSerial', 'SingleStoreSerial']);\n\t\tmin = unsigned ? 0 : Number.MIN_SAFE_INTEGER;\n\t\tmax = Number.MAX_SAFE_INTEGER;\n\t\tinteger = true;\n\t} else if (isColumnType<MySqlYear<any> | SingleStoreYear<any>>(column, ['MySqlYear', 'SingleStoreYear'])) {\n\t\tmin = 1901;\n\t\tmax = 2155;\n\t\tinteger = true;\n\t} else {\n\t\tmin = Number.MIN_SAFE_INTEGER;\n\t\tmax = Number.MAX_SAFE_INTEGER;\n\t}\n\n\tconst actions: any[] = [v.minValue(min), v.maxValue(max)];\n\tif (integer) {\n\t\tactions.push(v.integer());\n\t}\n\treturn v.pipe(v.number(), ...actions);\n}\n\nfunction bigintColumnToSchema(column: Column): v.GenericSchema {\n\tconst unsigned = column.getSQLType().includes('unsigned');\n\tconst min = unsigned ? 0n : CONSTANTS.INT64_MIN;\n\tconst max = unsigned ? CONSTANTS.INT64_UNSIGNED_MAX : CONSTANTS.INT64_MAX;\n\n\treturn v.pipe(v.bigint(), v.minValue(min), v.maxValue(max));\n}\n\nfunction stringColumnToSchema(column: Column): v.GenericSchema {\n\tif (isColumnType<PgUUID<ColumnBaseConfig<'string', 'PgUUID'>>>(column, ['PgUUID'])) {\n\t\treturn v.pipe(v.string(), v.uuid());\n\t}\n\n\tlet max: number | undefined;\n\tlet regex: RegExp | undefined;\n\tlet fixed = false;\n\n\tif (isColumnType<PgVarchar<any> | SQLiteText<any>>(column, ['PgVarchar', 'SQLiteText'])) {\n\t\tmax = column.length;\n\t} else if (\n\t\tisColumnType<MySqlVarChar<any> | SingleStoreVarChar<any>>(column, ['MySqlVarChar', 'SingleStoreVarChar'])\n\t) {\n\t\tmax = column.length ?? CONSTANTS.INT16_UNSIGNED_MAX;\n\t} else if (isColumnType<MySqlText<any> | SingleStoreText<any>>(column, ['MySqlText', 'SingleStoreText'])) {\n\t\tif (column.textType === 'longtext') {\n\t\t\tmax = CONSTANTS.INT32_UNSIGNED_MAX;\n\t\t} else if (column.textType === 'mediumtext') {\n\t\t\tmax = CONSTANTS.INT24_UNSIGNED_MAX;\n\t\t} else if (column.textType === 'text') {\n\t\t\tmax = CONSTANTS.INT16_UNSIGNED_MAX;\n\t\t} else {\n\t\t\tmax = CONSTANTS.INT8_UNSIGNED_MAX;\n\t\t}\n\t}\n\n\tif (\n\t\tisColumnType<PgChar<any> | MySqlChar<any> | SingleStoreChar<any>>(column, [\n\t\t\t'PgChar',\n\t\t\t'MySqlChar',\n\t\t\t'SingleStoreChar',\n\t\t])\n\t) {\n\t\tmax = column.length;\n\t\tfixed = true;\n\t}\n\n\tif (isColumnType<PgBinaryVector<any>>(column, ['PgBinaryVector'])) {\n\t\tregex = /^[01]+$/;\n\t\tmax = column.dimensions;\n\t}\n\n\tconst actions: any[] = [];\n\tif (regex) {\n\t\tactions.push(v.regex(regex));\n\t}\n\tif (max && fixed) {\n\t\tactions.push(v.length(max));\n\t} else if (max) {\n\t\tactions.push(v.maxLength(max));\n\t}\n\treturn actions.length > 0 ? v.pipe(v.string(), ...actions) : v.string();\n}\n"
  },
  {
    "path": "drizzle-valibot/src/column.types.ts",
    "content": "import type { Assume, Column } from 'drizzle-orm';\nimport type * as v from 'valibot';\nimport type { ColumnIsGeneratedAlwaysAs, IsEnumDefined, IsNever, Json, RemoveNeverElements } from './utils.ts';\n\nexport type HasBaseColumn<TColumn> = TColumn extends { _: { baseColumn: Column | undefined } }\n\t? IsNever<TColumn['_']['baseColumn']> extends false ? true\n\t: false\n\t: false;\n\nexport type EnumValuesToEnum<TEnumValues extends [string, ...string[]]> = { readonly [K in TEnumValues[number]]: K };\n\nexport type ExtractAdditionalProperties<TColumn extends Column> = {\n\tmax: TColumn['_']['columnType'] extends 'PgVarchar' | 'SQLiteText' | 'PgChar' | 'MySqlChar' | 'SingleStoreChar'\n\t\t? Assume<TColumn['_'], { length: number | undefined }>['length']\n\t\t: TColumn['_']['columnType'] extends 'MySqlText' | 'MySqlVarChar' | 'SingleStoreText' | 'SingleStoreVarChar'\n\t\t\t? number\n\t\t: TColumn['_']['columnType'] extends 'PgBinaryVector' | 'PgHalfVector' | 'PgVector'\n\t\t\t? Assume<TColumn['_'], { dimensions: number }>['dimensions']\n\t\t: TColumn['_']['columnType'] extends 'PgArray' ? Assume<TColumn['_'], { size: number | undefined }>['size']\n\t\t: undefined;\n\tfixedLength: TColumn['_']['columnType'] extends\n\t\t'PgChar' | 'PgHalfVector' | 'PgVector' | 'PgArray' | 'MySqlChar' | 'SingleStoreChar' ? true\n\t\t: false;\n};\n\ntype GetLengthAction<T extends Record<string, any>, TType extends string | ArrayLike<unknown>> =\n\tT['fixedLength'] extends true ? v.LengthAction<TType, number, undefined>\n\t\t: v.MaxLengthAction<TType, number, undefined>;\n\ntype GetArraySchema<T extends Column> = v.ArraySchema<\n\tGetValibotType<\n\t\tT['_']['data'],\n\t\tT['_']['dataType'],\n\t\tT['_']['columnType'],\n\t\tT['_']['enumValues'],\n\t\tHasBaseColumn<T> extends true ? Assume<T['_']['baseColumn'], Column> : undefined,\n\t\tExtractAdditionalProperties<T>\n\t>,\n\tundefined\n>;\n\nexport type GetValibotType<\n\tTData,\n\tTDataType extends string,\n\tTColumnType extends string,\n\tTEnumValues extends string[] | undefined,\n\tTBaseColumn extends Column | undefined,\n\tTAdditionalProperties extends Record<string, any>,\n> = TColumnType extends 'PgHalfVector' | 'PgVector' ? TAdditionalProperties['max'] extends number ? v.SchemaWithPipe<\n\t\t\t[v.ArraySchema<v.NumberSchema<undefined>, undefined>, GetLengthAction<TAdditionalProperties, number[]>]\n\t\t>\n\t: v.ArraySchema<v.NumberSchema<undefined>, undefined>\n\t: TColumnType extends 'PgUUID' ? v.SchemaWithPipe<[v.StringSchema<undefined>, v.UuidAction<string, undefined>]>\n\t: TColumnType extends 'PgBinaryVector' ? v.SchemaWithPipe<\n\t\t\tRemoveNeverElements<[\n\t\t\t\tv.StringSchema<undefined>,\n\t\t\t\tv.RegexAction<string, undefined>,\n\t\t\t\tTAdditionalProperties['max'] extends number ? GetLengthAction<TAdditionalProperties, string> : never,\n\t\t\t]>\n\t\t>\n\t: TBaseColumn extends Column ? TAdditionalProperties['max'] extends number ? v.SchemaWithPipe<\n\t\t\t\t[\n\t\t\t\t\tGetArraySchema<Assume<TBaseColumn, Column>>,\n\t\t\t\t\tGetLengthAction<TAdditionalProperties, Assume<TBaseColumn, Column>['_']['data'][]>,\n\t\t\t\t]\n\t\t\t>\n\t\t: GetArraySchema<Assume<TBaseColumn, Column>>\n\t: IsEnumDefined<TEnumValues> extends true\n\t\t? v.EnumSchema<{ readonly [K in Assume<TEnumValues, [string, ...string[]]>[number]]: K }, undefined>\n\t: TColumnType extends 'PgGeometry' | 'PgPointTuple'\n\t\t? v.TupleSchema<[v.NumberSchema<undefined>, v.NumberSchema<undefined>], undefined>\n\t: TColumnType extends 'PgLine'\n\t\t? v.TupleSchema<[v.NumberSchema<undefined>, v.NumberSchema<undefined>, v.NumberSchema<undefined>], undefined>\n\t: TData extends Date ? v.DateSchema<undefined>\n\t: TData extends Buffer ? v.GenericSchema<Buffer>\n\t: TDataType extends 'array' ? v.ArraySchema<\n\t\t\tGetValibotPrimitiveType<Assume<TData, any[]>[number], '', { noPipe: true }>,\n\t\t\tundefined\n\t\t>\n\t: TData extends Record<string, any>\n\t\t? TColumnType extends 'PgJson' | 'PgJsonb' | 'MySqlJson' | 'SingleStoreJson' | 'SQLiteTextJson' | 'SQLiteBlobJson'\n\t\t\t? v.GenericSchema<TData>\n\t\t: v.ObjectSchema<\n\t\t\t{ readonly [K in keyof TData]: GetValibotPrimitiveType<TData[K], '', { noPipe: true }> },\n\t\t\tundefined\n\t\t>\n\t: TDataType extends 'json' ? v.GenericSchema<Json>\n\t: GetValibotPrimitiveType<TData, TColumnType, TAdditionalProperties>;\n\ntype GetValibotPrimitiveType<TData, TColumnType, TAdditionalProperties extends Record<string, any>> = TData extends\n\tnumber ? TAdditionalProperties['noPipe'] extends true ? v.NumberSchema<undefined> : v.SchemaWithPipe<\n\t\tRemoveNeverElements<[\n\t\t\tv.NumberSchema<undefined>,\n\t\t\tv.MinValueAction<number, number, undefined>,\n\t\t\tv.MaxValueAction<number, number, undefined>,\n\t\t\tTColumnType extends\n\t\t\t\t| 'MySqlTinyInt'\n\t\t\t\t| 'SingleStoreTinyInt'\n\t\t\t\t| 'PgSmallInt'\n\t\t\t\t| 'PgSmallSerial'\n\t\t\t\t| 'MySqlSmallInt'\n\t\t\t\t| 'MySqlMediumInt'\n\t\t\t\t| 'SingleStoreSmallInt'\n\t\t\t\t| 'SingleStoreMediumInt'\n\t\t\t\t| 'PgInteger'\n\t\t\t\t| 'PgSerial'\n\t\t\t\t| 'MySqlInt'\n\t\t\t\t| 'SingleStoreInt'\n\t\t\t\t| 'PgBigInt53'\n\t\t\t\t| 'PgBigSerial53'\n\t\t\t\t| 'MySqlBigInt53'\n\t\t\t\t| 'MySqlSerial'\n\t\t\t\t| 'SingleStoreBigInt53'\n\t\t\t\t| 'SingleStoreSerial'\n\t\t\t\t| 'SQLiteInteger'\n\t\t\t\t| 'MySqlYear'\n\t\t\t\t| 'SingleStoreYear' ? v.IntegerAction<number, undefined>\n\t\t\t\t: never,\n\t\t]>\n\t>\n\t: TData extends bigint ? TAdditionalProperties['noPipe'] extends true ? v.BigintSchema<undefined> : v.SchemaWithPipe<[\n\t\t\tv.BigintSchema<undefined>,\n\t\t\tv.MinValueAction<bigint, bigint, undefined>,\n\t\t\tv.MaxValueAction<bigint, bigint, undefined>,\n\t\t]>\n\t: TData extends boolean ? v.BooleanSchema<undefined>\n\t: TData extends string\n\t\t? TAdditionalProperties['max'] extends number\n\t\t\t? v.SchemaWithPipe<[v.StringSchema<undefined>, GetLengthAction<TAdditionalProperties, string>]>\n\t\t: v.StringSchema<undefined>\n\t: v.AnySchema;\n\ntype HandleSelectColumn<\n\tTSchema extends v.GenericSchema,\n\tTColumn extends Column,\n> = TColumn['_']['notNull'] extends true ? TSchema\n\t: v.NullableSchema<TSchema, undefined>;\n\ntype HandleInsertColumn<\n\tTSchema extends v.GenericSchema,\n\tTColumn extends Column,\n> = TColumn['_']['notNull'] extends true\n\t? TColumn['_']['hasDefault'] extends true ? v.OptionalSchema<TSchema, undefined>\n\t: TSchema\n\t: v.OptionalSchema<v.NullableSchema<TSchema, undefined>, undefined>;\n\ntype HandleUpdateColumn<\n\tTSchema extends v.GenericSchema,\n\tTColumn extends Column,\n> = TColumn['_']['notNull'] extends true ? v.OptionalSchema<TSchema, undefined>\n\t: v.OptionalSchema<v.NullableSchema<TSchema, undefined>, undefined>;\n\nexport type HandleColumn<\n\tTType extends 'select' | 'insert' | 'update',\n\tTColumn extends Column,\n> = GetValibotType<\n\tTColumn['_']['data'],\n\tTColumn['_']['dataType'],\n\tTColumn['_']['columnType'],\n\tTColumn['_']['enumValues'],\n\tHasBaseColumn<TColumn> extends true ? Assume<TColumn['_']['baseColumn'], Column> : undefined,\n\tExtractAdditionalProperties<TColumn>\n> extends infer TSchema extends v.GenericSchema ? TSchema extends v.AnySchema ? v.AnySchema\n\t: TType extends 'select' ? HandleSelectColumn<TSchema, TColumn>\n\t: TType extends 'insert' ? HandleInsertColumn<TSchema, TColumn>\n\t: TType extends 'update' ? HandleUpdateColumn<TSchema, TColumn>\n\t: TSchema\n\t: v.AnySchema;\n"
  },
  {
    "path": "drizzle-valibot/src/constants.ts",
    "content": "export const CONSTANTS = {\n\tINT8_MIN: -128,\n\tINT8_MAX: 127,\n\tINT8_UNSIGNED_MAX: 255,\n\tINT16_MIN: -32768,\n\tINT16_MAX: 32767,\n\tINT16_UNSIGNED_MAX: 65535,\n\tINT24_MIN: -8388608,\n\tINT24_MAX: 8388607,\n\tINT24_UNSIGNED_MAX: 16777215,\n\tINT32_MIN: -2147483648,\n\tINT32_MAX: 2147483647,\n\tINT32_UNSIGNED_MAX: 4294967295,\n\tINT48_MIN: -140737488355328,\n\tINT48_MAX: 140737488355327,\n\tINT48_UNSIGNED_MAX: 281474976710655,\n\tINT64_MIN: -9223372036854775808n,\n\tINT64_MAX: 9223372036854775807n,\n\tINT64_UNSIGNED_MAX: 18446744073709551615n,\n};\n"
  },
  {
    "path": "drizzle-valibot/src/index.ts",
    "content": "export { bufferSchema, jsonSchema, literalSchema } from './column.ts';\nexport * from './column.types.ts';\nexport * from './schema.ts';\nexport * from './schema.types.internal.ts';\nexport * from './schema.types.ts';\nexport * from './utils.ts';\n"
  },
  {
    "path": "drizzle-valibot/src/schema.ts",
    "content": "import { Column, getTableColumns, getViewSelectedFields, is, isTable, isView, SQL } from 'drizzle-orm';\nimport type { Table, View } from 'drizzle-orm';\nimport type { PgEnum } from 'drizzle-orm/pg-core';\nimport * as v from 'valibot';\nimport { columnToSchema, mapEnumValues } from './column.ts';\nimport type { Conditions } from './schema.types.internal.ts';\nimport type { CreateInsertSchema, CreateSelectSchema, CreateUpdateSchema } from './schema.types.ts';\nimport { isPgEnum } from './utils.ts';\n\nfunction getColumns(tableLike: Table | View) {\n\treturn isTable(tableLike) ? getTableColumns(tableLike) : getViewSelectedFields(tableLike);\n}\n\nfunction handleColumns(\n\tcolumns: Record<string, any>,\n\trefinements: Record<string, any>,\n\tconditions: Conditions,\n): v.GenericSchema {\n\tconst columnSchemas: Record<string, v.GenericSchema> = {};\n\n\tfor (const [key, selected] of Object.entries(columns)) {\n\t\tif (!is(selected, Column) && !is(selected, SQL) && !is(selected, SQL.Aliased) && typeof selected === 'object') {\n\t\t\tconst columns = isTable(selected) || isView(selected) ? getColumns(selected) : selected;\n\t\t\tcolumnSchemas[key] = handleColumns(columns, refinements[key] ?? {}, conditions);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst refinement = refinements[key];\n\t\tif (refinement !== undefined && typeof refinement !== 'function') {\n\t\t\tcolumnSchemas[key] = refinement;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst column = is(selected, Column) ? selected : undefined;\n\t\tconst schema = column ? columnToSchema(column) : v.any();\n\t\tconst refined = typeof refinement === 'function' ? refinement(schema) : schema;\n\n\t\tif (conditions.never(column)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tcolumnSchemas[key] = refined;\n\t\t}\n\n\t\tif (column) {\n\t\t\tif (conditions.nullable(column)) {\n\t\t\t\tcolumnSchemas[key] = v.nullable(columnSchemas[key]!);\n\t\t\t}\n\n\t\t\tif (conditions.optional(column)) {\n\t\t\t\tcolumnSchemas[key] = v.optional(columnSchemas[key]!);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn v.object(columnSchemas) as any;\n}\n\nexport const createSelectSchema: CreateSelectSchema = (\n\tentity: Table | View | PgEnum<[string, ...string[]]>,\n\trefine?: Record<string, any>,\n) => {\n\tif (isPgEnum(entity)) {\n\t\treturn v.enum(mapEnumValues(entity.enumValues));\n\t}\n\tconst columns = getColumns(entity);\n\treturn handleColumns(columns, refine ?? {}, {\n\t\tnever: () => false,\n\t\toptional: () => false,\n\t\tnullable: (column) => !column.notNull,\n\t}) as any;\n};\n\nexport const createInsertSchema: CreateInsertSchema = (\n\tentity: Table,\n\trefine?: Record<string, any>,\n) => {\n\tconst columns = getColumns(entity);\n\treturn handleColumns(columns, refine ?? {}, {\n\t\tnever: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',\n\t\toptional: (column) => !column.notNull || (column.notNull && column.hasDefault),\n\t\tnullable: (column) => !column.notNull,\n\t}) as any;\n};\n\nexport const createUpdateSchema: CreateUpdateSchema = (\n\tentity: Table,\n\trefine?: Record<string, any>,\n) => {\n\tconst columns = getColumns(entity);\n\treturn handleColumns(columns, refine ?? {}, {\n\t\tnever: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',\n\t\toptional: () => true,\n\t\tnullable: (column) => !column.notNull,\n\t}) as any;\n};\n"
  },
  {
    "path": "drizzle-valibot/src/schema.types.internal.ts",
    "content": "import type { Assume, Column, DrizzleTypeError, SelectedFieldsFlat, Simplify, Table, View } from 'drizzle-orm';\nimport type * as v from 'valibot';\nimport type { ExtractAdditionalProperties, GetValibotType, HandleColumn, HasBaseColumn } from './column.types.ts';\nimport type { ColumnIsGeneratedAlwaysAs, GetSelection } from './utils.ts';\n\nexport interface Conditions {\n\tnever: (column?: Column) => boolean;\n\toptional: (column: Column) => boolean;\n\tnullable: (column: Column) => boolean;\n}\n\ntype BuildRefineField<T> = T extends v.GenericSchema ? ((schema: T) => v.GenericSchema) | v.GenericSchema : never;\n\nexport type BuildRefine<\n\tTColumns extends Record<string, any>,\n> = {\n\t[K in keyof TColumns as TColumns[K] extends Column | SelectedFieldsFlat<Column> | Table | View ? K : never]?:\n\t\tTColumns[K] extends Column ? BuildRefineField<\n\t\t\t\tGetValibotType<\n\t\t\t\t\tTColumns[K]['_']['data'],\n\t\t\t\t\tTColumns[K]['_']['dataType'],\n\t\t\t\t\tTColumns[K]['_']['columnType'],\n\t\t\t\t\tTColumns[K]['_']['enumValues'],\n\t\t\t\t\tHasBaseColumn<TColumns[K]> extends true ? Assume<TColumns[K]['_']['baseColumn'], Column> : undefined,\n\t\t\t\t\tExtractAdditionalProperties<TColumns[K]>\n\t\t\t\t>\n\t\t\t>\n\t\t\t: BuildRefine<GetSelection<TColumns[K]>>;\n};\n\ntype HandleRefinement<\n\tTType extends 'select' | 'insert' | 'update',\n\tTRefinement,\n\tTColumn extends Column,\n> = TRefinement extends (schema: any) => v.GenericSchema ? (\n\t\tTColumn['_']['notNull'] extends true ? ReturnType<TRefinement>\n\t\t\t: v.NullableSchema<ReturnType<TRefinement>, undefined>\n\t) extends infer TSchema ? TType extends 'update' ? v.OptionalSchema<Assume<TSchema, v.GenericSchema>, undefined>\n\t\t: TSchema\n\t: v.AnySchema\n\t: TRefinement;\n\ntype IsRefinementDefined<\n\tTRefinements extends Record<string | symbol | number, any> | undefined,\n\tTKey extends string | symbol | number,\n> = TRefinements extends object ? TRefinements[TKey] extends v.GenericSchema | ((schema: any) => any) ? true\n\t: false\n\t: false;\n\nexport type BuildSchema<\n\tTType extends 'select' | 'insert' | 'update',\n\tTColumns extends Record<string, any>,\n\tTRefinements extends Record<string, any> | undefined,\n> = v.ObjectSchema<\n\tSimplify<\n\t\t{\n\t\t\treadonly [K in keyof TColumns as ColumnIsGeneratedAlwaysAs<TColumns[K]> extends true ? never : K]:\n\t\t\t\tTColumns[K] extends infer TColumn extends Column\n\t\t\t\t\t? IsRefinementDefined<TRefinements, Assume<K, string>> extends true\n\t\t\t\t\t\t? Assume<HandleRefinement<TType, TRefinements[K & keyof TRefinements], TColumn>, v.GenericSchema>\n\t\t\t\t\t: HandleColumn<TType, TColumn>\n\t\t\t\t\t: TColumns[K] extends infer TObject extends SelectedFieldsFlat<Column> | Table | View ? BuildSchema<\n\t\t\t\t\t\t\tTType,\n\t\t\t\t\t\t\tGetSelection<TObject>,\n\t\t\t\t\t\t\tTRefinements extends object ? TRefinements[K & keyof TRefinements] : undefined\n\t\t\t\t\t\t>\n\t\t\t\t\t: v.AnySchema;\n\t\t}\n\t>,\n\tundefined\n>;\n\nexport type NoUnknownKeys<\n\tTRefinement extends Record<string, any>,\n\tTCompare extends Record<string, any>,\n> = {\n\t[K in keyof TRefinement]: K extends keyof TCompare\n\t\t? TRefinement[K] extends Record<string, v.GenericSchema> ? NoUnknownKeys<TRefinement[K], TCompare[K]>\n\t\t: TRefinement[K]\n\t\t: DrizzleTypeError<`Found unknown key in refinement: \"${K & string}\"`>;\n};\n"
  },
  {
    "path": "drizzle-valibot/src/schema.types.ts",
    "content": "import type { Table, View } from 'drizzle-orm';\nimport type { PgEnum } from 'drizzle-orm/pg-core';\nimport type * as v from 'valibot';\nimport type { EnumValuesToEnum } from './column.types.ts';\nimport type { BuildRefine, BuildSchema, NoUnknownKeys } from './schema.types.internal.ts';\n\nexport interface CreateSelectSchema {\n\t<TTable extends Table>(table: TTable): BuildSchema<'select', TTable['_']['columns'], undefined>;\n\t<\n\t\tTTable extends Table,\n\t\tTRefine extends BuildRefine<TTable['_']['columns']>,\n\t>(\n\t\ttable: TTable,\n\t\trefine?: NoUnknownKeys<TRefine, TTable['$inferSelect']>,\n\t): BuildSchema<'select', TTable['_']['columns'], TRefine>;\n\n\t<TView extends View>(view: TView): BuildSchema<'select', TView['_']['selectedFields'], undefined>;\n\t<\n\t\tTView extends View,\n\t\tTRefine extends BuildRefine<TView['_']['selectedFields']>,\n\t>(\n\t\tview: TView,\n\t\trefine: NoUnknownKeys<TRefine, TView['$inferSelect']>,\n\t): BuildSchema<'select', TView['_']['selectedFields'], TRefine>;\n\n\t<TEnum extends PgEnum<any>>(enum_: TEnum): v.EnumSchema<EnumValuesToEnum<TEnum['enumValues']>, undefined>;\n}\n\nexport interface CreateInsertSchema {\n\t<TTable extends Table>(table: TTable): BuildSchema<'insert', TTable['_']['columns'], undefined>;\n\t<\n\t\tTTable extends Table,\n\t\tTRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>>,\n\t>(\n\t\ttable: TTable,\n\t\trefine?: NoUnknownKeys<TRefine, TTable['$inferInsert']>,\n\t): BuildSchema<'insert', TTable['_']['columns'], TRefine>;\n}\n\nexport interface CreateUpdateSchema {\n\t<TTable extends Table>(table: TTable): BuildSchema<'update', TTable['_']['columns'], undefined>;\n\t<\n\t\tTTable extends Table,\n\t\tTRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>>,\n\t>(\n\t\ttable: TTable,\n\t\trefine?: TRefine,\n\t): BuildSchema<'update', TTable['_']['columns'], TRefine>;\n}\n"
  },
  {
    "path": "drizzle-valibot/src/utils.ts",
    "content": "import type { Column, SelectedFieldsFlat, Table, View } from 'drizzle-orm';\nimport type { PgEnum } from 'drizzle-orm/pg-core';\nimport type * as v from 'valibot';\nimport type { literalSchema } from './column.ts';\n\nexport function isColumnType<T extends Column>(column: Column, columnTypes: string[]): column is T {\n\treturn columnTypes.includes(column.columnType);\n}\n\nexport function isWithEnum(column: Column): column is typeof column & { enumValues: [string, ...string[]] } {\n\treturn 'enumValues' in column && Array.isArray(column.enumValues) && column.enumValues.length > 0;\n}\n\nexport const isPgEnum: (entity: any) => entity is PgEnum<[string, ...string[]]> = isWithEnum as any;\n\ntype Literal = v.InferOutput<typeof literalSchema>;\nexport type Json = Literal | { [key: string]: any } | any[];\n\nexport type IsNever<T> = [T] extends [never] ? true : false;\n\nexport type IsEnumDefined<TEnum extends string[] | undefined> = [string, ...string[]] extends TEnum ? false\n\t: undefined extends TEnum ? false\n\t: true;\n\nexport type ColumnIsGeneratedAlwaysAs<TColumn> = TColumn extends Column\n\t? TColumn['_']['identity'] extends 'always' ? true\n\t: TColumn['_']['generated'] extends { type: 'byDefault' } | undefined ? false\n\t: true\n\t: false;\n\nexport type RemoveNever<T> = {\n\t[K in keyof T as T[K] extends never ? never : K]: T[K];\n};\n\nexport type RemoveNeverElements<T extends any[]> = T extends [infer First, ...infer Rest]\n\t? IsNever<First> extends true ? RemoveNeverElements<Rest>\n\t: [First, ...RemoveNeverElements<Rest>]\n\t: [];\n\nexport type GetSelection<T extends SelectedFieldsFlat<Column> | Table | View> = T extends Table ? T['_']['columns']\n\t: T extends View ? T['_']['selectedFields']\n\t: T;\n"
  },
  {
    "path": "drizzle-valibot/tests/mysql.test.ts",
    "content": "import { type Equal, sql } from 'drizzle-orm';\nimport { customType, int, json, mysqlSchema, mysqlTable, mysqlView, serial, text } from 'drizzle-orm/mysql-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport * as v from 'valibot';\nimport { test } from 'vitest';\nimport { jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSelectSchema, createUpdateSchema } from '../src';\nimport { Expect, expectSchemaShape } from './utils.ts';\n\nconst intSchema = v.pipe(\n\tv.number(),\n\tv.minValue(CONSTANTS.INT32_MIN as number),\n\tv.maxValue(CONSTANTS.INT32_MAX as number),\n\tv.integer(),\n);\nconst serialNumberModeSchema = v.pipe(\n\tv.number(),\n\tv.minValue(0 as number),\n\tv.maxValue(Number.MAX_SAFE_INTEGER as number),\n\tv.integer(),\n);\nconst textSchema = v.pipe(v.string(), v.maxLength(CONSTANTS.INT16_UNSIGNED_MAX as number));\n\ntest('table - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table in schema - select', (tc) => {\n\tconst schema = mysqlSchema('test');\n\tconst table = schema.table('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = v.object({\n\t\tid: v.optional(serialNumberModeSchema),\n\t\tname: textSchema,\n\t\tage: v.optional(v.nullable(intSchema)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = v.object({\n\t\tid: v.optional(serialNumberModeSchema),\n\t\tname: v.optional(textSchema),\n\t\tage: v.optional(v.nullable(intSchema)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view qb - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = mysqlView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = v.object({ id: serialNumberModeSchema, age: v.any() });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view columns - select', (t) => {\n\tconst view = mysqlView('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = v.object({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view with nested fields - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = mysqlView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tid: table.id,\n\t\t\tnested: {\n\t\t\t\tname: table.name,\n\t\t\t\tage: sql``.as('age'),\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = v.object({\n\t\tid: serialNumberModeSchema,\n\t\tnested: v.object({ name: textSchema, age: v.any() }),\n\t\ttable: v.object({ id: serialNumberModeSchema, name: textSchema }),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({\n\t\tc1: v.nullable(intSchema),\n\t\tc2: intSchema,\n\t\tc3: v.nullable(intSchema),\n\t\tc4: intSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(intSchema)),\n\t\tc2: intSchema,\n\t\tc3: v.optional(v.nullable(intSchema)),\n\t\tc4: v.optional(intSchema),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - update', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(intSchema)),\n\t\tc2: v.optional(intSchema),\n\t\tc3: v.optional(v.nullable(intSchema)),\n\t\tc4: v.optional(intSchema),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\tconst expected = v.object({\n\t\tc1: v.nullable(intSchema),\n\t\tc2: v.pipe(intSchema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (t) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = v.pipe(v.string(), v.minLength(1), v.maxLength(100));\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = v.object({\n\t\tc1: v.nullable(intSchema),\n\t\tc2: v.pipe(intSchema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(intSchema)),\n\t\tc2: v.pipe(intSchema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(intSchema)),\n\t\tc2: v.optional(v.pipe(intSchema, v.maxValue(1000))),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine view - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int(),\n\t\tc3: int(),\n\t\tc4: int(),\n\t\tc5: int(),\n\t\tc6: int(),\n\t});\n\tconst view = mysqlView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tc1: table.c1,\n\t\t\tc2: table.c2,\n\t\t\tc3: table.c3,\n\t\t\tnested: {\n\t\t\t\tc4: table.c4,\n\t\t\t\tc5: table.c5,\n\t\t\t\tc6: table.c6,\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tnested: {\n\t\t\tc5: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\t\tc6: v.pipe(v.string(), v.transform(Number)),\n\t\t},\n\t\ttable: {\n\t\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\t},\n\t});\n\tconst expected = v.object({\n\t\tc1: v.nullable(intSchema),\n\t\tc2: v.nullable(v.pipe(intSchema, v.maxValue(1000))),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tnested: v.object({\n\t\t\tc4: v.nullable(intSchema),\n\t\t\tc5: v.nullable(v.pipe(intSchema, v.maxValue(1000))),\n\t\t\tc6: v.pipe(v.string(), v.transform(Number)),\n\t\t}),\n\t\ttable: v.object({\n\t\t\tc1: v.nullable(intSchema),\n\t\t\tc2: v.nullable(v.pipe(intSchema, v.maxValue(1000))),\n\t\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\t\tc4: v.nullable(intSchema),\n\t\t\tc5: v.nullable(intSchema),\n\t\t\tc6: v.nullable(intSchema),\n\t\t}),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('all data types', (t) => {\n\tconst table = mysqlTable('test', ({\n\t\tbigint,\n\t\tbinary,\n\t\tboolean,\n\t\tchar,\n\t\tdate,\n\t\tdatetime,\n\t\tdecimal,\n\t\tdouble,\n\t\tfloat,\n\t\tint,\n\t\tjson,\n\t\tmediumint,\n\t\tmysqlEnum,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\ttext,\n\t\ttime,\n\t\ttimestamp,\n\t\ttinyint,\n\t\tvarchar,\n\t\tvarbinary,\n\t\tyear,\n\t\tlongtext,\n\t\tmediumtext,\n\t\ttinytext,\n\t}) => ({\n\t\tbigint1: bigint({ mode: 'number' }).notNull(),\n\t\tbigint2: bigint({ mode: 'bigint' }).notNull(),\n\t\tbigint3: bigint({ unsigned: true, mode: 'number' }).notNull(),\n\t\tbigint4: bigint({ unsigned: true, mode: 'bigint' }).notNull(),\n\t\tbinary: binary({ length: 10 }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\tchar1: char({ length: 10 }).notNull(),\n\t\tchar2: char({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tdate1: date({ mode: 'date' }).notNull(),\n\t\tdate2: date({ mode: 'string' }).notNull(),\n\t\tdatetime1: datetime({ mode: 'date' }).notNull(),\n\t\tdatetime2: datetime({ mode: 'string' }).notNull(),\n\t\tdecimal1: decimal().notNull(),\n\t\tdecimal2: decimal({ unsigned: true }).notNull(),\n\t\tdouble1: double().notNull(),\n\t\tdouble2: double({ unsigned: true }).notNull(),\n\t\tfloat1: float().notNull(),\n\t\tfloat2: float({ unsigned: true }).notNull(),\n\t\tint1: int().notNull(),\n\t\tint2: int({ unsigned: true }).notNull(),\n\t\tjson: json().notNull(),\n\t\tmediumint1: mediumint().notNull(),\n\t\tmediumint2: mediumint({ unsigned: true }).notNull(),\n\t\tenum: mysqlEnum('enum', ['a', 'b', 'c']).notNull(),\n\t\treal: real().notNull(),\n\t\tserial: serial().notNull(),\n\t\tsmallint1: smallint().notNull(),\n\t\tsmallint2: smallint({ unsigned: true }).notNull(),\n\t\ttext1: text().notNull(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttime: time().notNull(),\n\t\ttimestamp1: timestamp({ mode: 'date' }).notNull(),\n\t\ttimestamp2: timestamp({ mode: 'string' }).notNull(),\n\t\ttinyint1: tinyint().notNull(),\n\t\ttinyint2: tinyint({ unsigned: true }).notNull(),\n\t\tvarchar1: varchar({ length: 10 }).notNull(),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tvarbinary: varbinary({ length: 10 }).notNull(),\n\t\tyear: year().notNull(),\n\t\tlongtext1: longtext().notNull(),\n\t\tlongtext2: longtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\tmediumtext1: mediumtext().notNull(),\n\t\tmediumtext2: mediumtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttinytext1: tinytext().notNull(),\n\t\ttinytext2: tinytext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({\n\t\tbigint1: v.pipe(v.number(), v.minValue(Number.MIN_SAFE_INTEGER), v.maxValue(Number.MAX_SAFE_INTEGER), v.integer()),\n\t\tbigint2: v.pipe(v.bigint(), v.minValue(CONSTANTS.INT64_MIN), v.maxValue(CONSTANTS.INT64_MAX)),\n\t\tbigint3: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(Number.MAX_SAFE_INTEGER), v.integer()),\n\t\tbigint4: v.pipe(v.bigint(), v.minValue(0n as bigint), v.maxValue(CONSTANTS.INT64_UNSIGNED_MAX)),\n\t\tbinary: v.string(),\n\t\tboolean: v.boolean(),\n\t\tchar1: v.pipe(v.string(), v.length(10 as number)),\n\t\tchar2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tdate1: v.date(),\n\t\tdate2: v.string(),\n\t\tdatetime1: v.date(),\n\t\tdatetime2: v.string(),\n\t\tdecimal1: v.string(),\n\t\tdecimal2: v.string(),\n\t\tdouble1: v.pipe(v.number(), v.minValue(CONSTANTS.INT48_MIN), v.maxValue(CONSTANTS.INT48_MAX)),\n\t\tdouble2: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(CONSTANTS.INT48_UNSIGNED_MAX)),\n\t\tfloat1: v.pipe(v.number(), v.minValue(CONSTANTS.INT24_MIN), v.maxValue(CONSTANTS.INT24_MAX)),\n\t\tfloat2: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(CONSTANTS.INT24_UNSIGNED_MAX)),\n\t\tint1: v.pipe(v.number(), v.minValue(CONSTANTS.INT32_MIN), v.maxValue(CONSTANTS.INT32_MAX), v.integer()),\n\t\tint2: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(CONSTANTS.INT32_UNSIGNED_MAX), v.integer()),\n\t\tjson: jsonSchema,\n\t\tmediumint1: v.pipe(v.number(), v.minValue(CONSTANTS.INT24_MIN), v.maxValue(CONSTANTS.INT24_MAX), v.integer()),\n\t\tmediumint2: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(CONSTANTS.INT24_UNSIGNED_MAX), v.integer()),\n\t\tenum: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\treal: v.pipe(v.number(), v.minValue(CONSTANTS.INT48_MIN), v.maxValue(CONSTANTS.INT48_MAX)),\n\t\tserial: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(Number.MAX_SAFE_INTEGER), v.integer()),\n\t\tsmallint1: v.pipe(v.number(), v.minValue(CONSTANTS.INT16_MIN), v.maxValue(CONSTANTS.INT16_MAX), v.integer()),\n\t\tsmallint2: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(CONSTANTS.INT16_UNSIGNED_MAX), v.integer()),\n\t\ttext1: v.pipe(v.string(), v.maxLength(CONSTANTS.INT16_UNSIGNED_MAX)),\n\t\ttext2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\ttime: v.string(),\n\t\ttimestamp1: v.date(),\n\t\ttimestamp2: v.string(),\n\t\ttinyint1: v.pipe(v.number(), v.minValue(CONSTANTS.INT8_MIN), v.maxValue(CONSTANTS.INT8_MAX), v.integer()),\n\t\ttinyint2: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(CONSTANTS.INT8_UNSIGNED_MAX), v.integer()),\n\t\tvarchar1: v.pipe(v.string(), v.maxLength(10 as number)),\n\t\tvarchar2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tvarbinary: v.string(),\n\t\tyear: v.pipe(v.number(), v.minValue(1901 as number), v.maxValue(2155 as number), v.integer()),\n\t\tlongtext1: v.pipe(v.string(), v.maxLength(CONSTANTS.INT32_UNSIGNED_MAX)),\n\t\tlongtext2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tmediumtext1: v.pipe(v.string(), v.maxLength(CONSTANTS.INT24_UNSIGNED_MAX)),\n\t\tmediumtext2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\ttinytext1: v.pipe(v.string(), v.maxLength(CONSTANTS.INT8_UNSIGNED_MAX)),\n\t\ttinytext2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: v.GenericSchema<TopLevelCondition> = v.custom<TopLevelCondition>(() => true);\n\tconst table = mysqlTable('test', {\n\t\tjson: json().$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({\n\t\tjson: v.nullable(TopLevelCondition),\n\t});\n\tExpect<Equal<v.InferOutput<typeof result>, v.InferOutput<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = mysqlTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: v.string() });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = mysqlTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: v.string() });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = mysqlTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: v.string() });\n}\n\n/* Disallow unknown keys in view qb - select */ {\n\tconst table = mysqlTable('test', { id: int() });\n\tconst view = mysqlView('test').as((qb) => qb.select().from(table));\n\tconst nestedSelect = mysqlView('test').as((qb) => qb.select({ table }).from(table));\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: v.string() });\n\t// @ts-expect-error\n\tcreateSelectSchema(nestedSelect, { table: { unknown: v.string() } });\n}\n\n/* Disallow unknown keys in view columns - select */ {\n\tconst view = mysqlView('test', { id: int() }).as(sql``);\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: v.string() });\n}\n"
  },
  {
    "path": "drizzle-valibot/tests/pg.test.ts",
    "content": "import { type Equal, sql } from 'drizzle-orm';\nimport {\n\tcustomType,\n\tinteger,\n\tjson,\n\tjsonb,\n\tpgEnum,\n\tpgMaterializedView,\n\tpgSchema,\n\tpgTable,\n\tpgView,\n\tserial,\n\ttext,\n} from 'drizzle-orm/pg-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport * as v from 'valibot';\nimport { test } from 'vitest';\nimport { jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSelectSchema, createUpdateSchema } from '../src';\nimport { Expect, expectEnumValues, expectSchemaShape } from './utils.ts';\n\nconst integerSchema = v.pipe(v.number(), v.minValue(CONSTANTS.INT32_MIN), v.maxValue(CONSTANTS.INT32_MAX), v.integer());\nconst textSchema = v.string();\n\ntest('table - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table in schema - select', (tc) => {\n\tconst schema = pgSchema('test');\n\tconst table = schema.table('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: integer().generatedAlwaysAsIdentity().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: integer(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = v.object({ name: textSchema, age: v.optional(v.nullable(integerSchema)) });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: integer().generatedAlwaysAsIdentity().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: integer(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = v.object({\n\t\tname: v.optional(textSchema),\n\t\tage: v.optional(v.nullable(integerSchema)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view qb - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = pgView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = v.object({ id: integerSchema, age: v.any() });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view columns - select', (t) => {\n\tconst view = pgView('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = v.object({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('materialized view qb - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = pgMaterializedView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = v.object({ id: integerSchema, age: v.any() });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('materialized view columns - select', (t) => {\n\tconst view = pgView('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = v.object({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view with nested fields - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = pgMaterializedView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tid: table.id,\n\t\t\tnested: {\n\t\t\t\tname: table.name,\n\t\t\t\tage: sql``.as('age'),\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = v.object({\n\t\tid: integerSchema,\n\t\tnested: v.object({ name: textSchema, age: v.any() }),\n\t\ttable: v.object({ id: integerSchema, name: textSchema }),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('enum - select', (t) => {\n\tconst enum_ = pgEnum('test', ['a', 'b', 'c']);\n\n\tconst result = createSelectSchema(enum_);\n\tconst expected = v.enum({ a: 'a', b: 'b', c: 'c' });\n\texpectEnumValues(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().default(1),\n\t\tc4: integer().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({\n\t\tc1: v.nullable(integerSchema),\n\t\tc2: integerSchema,\n\t\tc3: v.nullable(integerSchema),\n\t\tc4: integerSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().default(1),\n\t\tc4: integer().notNull().default(1),\n\t\tc5: integer().generatedAlwaysAs(1),\n\t\tc6: integer().generatedAlwaysAsIdentity(),\n\t\tc7: integer().generatedByDefaultAsIdentity(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(integerSchema)),\n\t\tc2: integerSchema,\n\t\tc3: v.optional(v.nullable(integerSchema)),\n\t\tc4: v.optional(integerSchema),\n\t\tc7: v.optional(integerSchema),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n});\n\ntest('nullability - update', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().default(1),\n\t\tc4: integer().notNull().default(1),\n\t\tc5: integer().generatedAlwaysAs(1),\n\t\tc6: integer().generatedAlwaysAsIdentity(),\n\t\tc7: integer().generatedByDefaultAsIdentity(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(integerSchema)),\n\t\tc2: v.optional(integerSchema),\n\t\tc3: v.optional(v.nullable(integerSchema)),\n\t\tc4: v.optional(integerSchema),\n\t\tc7: v.optional(integerSchema),\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\tconst expected = v.object({\n\t\tc1: v.nullable(integerSchema),\n\t\tc2: v.pipe(integerSchema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (t) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = v.pipe(v.string(), v.minLength(1), v.maxLength(100));\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = v.object({\n\t\tc1: v.nullable(integerSchema),\n\t\tc2: v.pipe(integerSchema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t\tc4: integer().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(integerSchema)),\n\t\tc2: v.pipe(integerSchema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t\tc4: integer().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(integerSchema)),\n\t\tc2: v.optional(v.pipe(integerSchema, v.maxValue(1000))),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine view - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer(),\n\t\tc3: integer(),\n\t\tc4: integer(),\n\t\tc5: integer(),\n\t\tc6: integer(),\n\t});\n\tconst view = pgView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tc1: table.c1,\n\t\t\tc2: table.c2,\n\t\t\tc3: table.c3,\n\t\t\tnested: {\n\t\t\t\tc4: table.c4,\n\t\t\t\tc5: table.c5,\n\t\t\t\tc6: table.c6,\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tnested: {\n\t\t\tc5: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\t\tc6: v.pipe(v.string(), v.transform(Number)),\n\t\t},\n\t\ttable: {\n\t\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\t},\n\t});\n\tconst expected = v.object({\n\t\tc1: v.nullable(integerSchema),\n\t\tc2: v.nullable(v.pipe(integerSchema, v.maxValue(1000))),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tnested: v.object({\n\t\t\tc4: v.nullable(integerSchema),\n\t\t\tc5: v.nullable(v.pipe(integerSchema, v.maxValue(1000))),\n\t\t\tc6: v.pipe(v.string(), v.transform(Number)),\n\t\t}),\n\t\ttable: v.object({\n\t\t\tc1: v.nullable(integerSchema),\n\t\t\tc2: v.nullable(v.pipe(integerSchema, v.maxValue(1000))),\n\t\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\t\tc4: v.nullable(integerSchema),\n\t\t\tc5: v.nullable(integerSchema),\n\t\t\tc6: v.nullable(integerSchema),\n\t\t}),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('all data types', (t) => {\n\tconst table = pgTable('test', ({\n\t\tbigint,\n\t\tbigserial,\n\t\tbit,\n\t\tboolean,\n\t\tdate,\n\t\tchar,\n\t\tcidr,\n\t\tdoublePrecision,\n\t\tgeometry,\n\t\thalfvec,\n\t\tinet,\n\t\tinteger,\n\t\tinterval,\n\t\tjson,\n\t\tjsonb,\n\t\tline,\n\t\tmacaddr,\n\t\tmacaddr8,\n\t\tnumeric,\n\t\tpoint,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\tsmallserial,\n\t\ttext,\n\t\tsparsevec,\n\t\ttime,\n\t\ttimestamp,\n\t\tuuid,\n\t\tvarchar,\n\t\tvector,\n\t}) => ({\n\t\tbigint1: bigint({ mode: 'number' }).notNull(),\n\t\tbigint2: bigint({ mode: 'bigint' }).notNull(),\n\t\tbigserial1: bigserial({ mode: 'number' }).notNull(),\n\t\tbigserial2: bigserial({ mode: 'bigint' }).notNull(),\n\t\tbit: bit({ dimensions: 5 }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\tdate1: date({ mode: 'date' }).notNull(),\n\t\tdate2: date({ mode: 'string' }).notNull(),\n\t\tchar1: char({ length: 10 }).notNull(),\n\t\tchar2: char({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tcidr: cidr().notNull(),\n\t\tdoublePrecision: doublePrecision().notNull(),\n\t\tgeometry1: geometry({ type: 'point', mode: 'tuple' }).notNull(),\n\t\tgeometry2: geometry({ type: 'point', mode: 'xy' }).notNull(),\n\t\thalfvec: halfvec({ dimensions: 3 }).notNull(),\n\t\tinet: inet().notNull(),\n\t\tinteger: integer().notNull(),\n\t\tinterval: interval().notNull(),\n\t\tjson: json().notNull(),\n\t\tjsonb: jsonb().notNull(),\n\t\tline1: line({ mode: 'abc' }).notNull(),\n\t\tline2: line({ mode: 'tuple' }).notNull(),\n\t\tmacaddr: macaddr().notNull(),\n\t\tmacaddr8: macaddr8().notNull(),\n\t\tnumeric: numeric().notNull(),\n\t\tpoint1: point({ mode: 'xy' }).notNull(),\n\t\tpoint2: point({ mode: 'tuple' }).notNull(),\n\t\treal: real().notNull(),\n\t\tserial: serial().notNull(),\n\t\tsmallint: smallint().notNull(),\n\t\tsmallserial: smallserial().notNull(),\n\t\ttext1: text().notNull(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\tsparsevec: sparsevec({ dimensions: 3 }).notNull(),\n\t\ttime: time().notNull(),\n\t\ttimestamp1: timestamp({ mode: 'date' }).notNull(),\n\t\ttimestamp2: timestamp({ mode: 'string' }).notNull(),\n\t\tuuid: uuid().notNull(),\n\t\tvarchar1: varchar({ length: 10 }).notNull(),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tvector: vector({ dimensions: 3 }).notNull(),\n\t\tarray1: integer().array().notNull(),\n\t\tarray2: integer().array().array(2).notNull(),\n\t\tarray3: varchar({ length: 10 }).array().array(2).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({\n\t\tbigint1: v.pipe(v.number(), v.minValue(Number.MIN_SAFE_INTEGER), v.maxValue(Number.MAX_SAFE_INTEGER), v.integer()),\n\t\tbigint2: v.pipe(v.bigint(), v.minValue(CONSTANTS.INT64_MIN), v.maxValue(CONSTANTS.INT64_MAX)),\n\t\tbigserial1: v.pipe(\n\t\t\tv.number(),\n\t\t\tv.minValue(Number.MIN_SAFE_INTEGER),\n\t\t\tv.maxValue(Number.MAX_SAFE_INTEGER),\n\t\t\tv.integer(),\n\t\t),\n\t\tbigserial2: v.pipe(v.bigint(), v.minValue(CONSTANTS.INT64_MIN), v.maxValue(CONSTANTS.INT64_MAX)),\n\t\tbit: v.pipe(v.string(), v.regex(/^[01]+$/), v.maxLength(5 as number)),\n\t\tboolean: v.boolean(),\n\t\tdate1: v.date(),\n\t\tdate2: v.string(),\n\t\tchar1: v.pipe(v.string(), v.length(10 as number)),\n\t\tchar2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tcidr: v.string(),\n\t\tdoublePrecision: v.pipe(v.number(), v.minValue(CONSTANTS.INT48_MIN), v.maxValue(CONSTANTS.INT48_MAX)),\n\t\tgeometry1: v.tuple([v.number(), v.number()]),\n\t\tgeometry2: v.object({ x: v.number(), y: v.number() }),\n\t\thalfvec: v.pipe(v.array(v.number()), v.length(3 as number)),\n\t\tinet: v.string(),\n\t\tinteger: v.pipe(v.number(), v.minValue(CONSTANTS.INT32_MIN), v.maxValue(CONSTANTS.INT32_MAX), v.integer()),\n\t\tinterval: v.string(),\n\t\tjson: jsonSchema,\n\t\tjsonb: jsonSchema,\n\t\tline1: v.object({ a: v.number(), b: v.number(), c: v.number() }),\n\t\tline2: v.tuple([v.number(), v.number(), v.number()]),\n\t\tmacaddr: v.string(),\n\t\tmacaddr8: v.string(),\n\t\tnumeric: v.string(),\n\t\tpoint1: v.object({ x: v.number(), y: v.number() }),\n\t\tpoint2: v.tuple([v.number(), v.number()]),\n\t\treal: v.pipe(v.number(), v.minValue(CONSTANTS.INT24_MIN), v.maxValue(CONSTANTS.INT24_MAX)),\n\t\tserial: v.pipe(v.number(), v.minValue(CONSTANTS.INT32_MIN), v.maxValue(CONSTANTS.INT32_MAX), v.integer()),\n\t\tsmallint: v.pipe(v.number(), v.minValue(CONSTANTS.INT16_MIN), v.maxValue(CONSTANTS.INT16_MAX), v.integer()),\n\t\tsmallserial: v.pipe(v.number(), v.minValue(CONSTANTS.INT16_MIN), v.maxValue(CONSTANTS.INT16_MAX), v.integer()),\n\t\ttext1: v.string(),\n\t\ttext2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tsparsevec: v.string(),\n\t\ttime: v.string(),\n\t\ttimestamp1: v.date(),\n\t\ttimestamp2: v.string(),\n\t\tuuid: v.pipe(v.string(), v.uuid()),\n\t\tvarchar1: v.pipe(v.string(), v.maxLength(10 as number)),\n\t\tvarchar2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tvector: v.pipe(v.array(v.number()), v.length(3 as number)),\n\t\tarray1: v.array(integerSchema),\n\t\tarray2: v.pipe(v.array(v.array(integerSchema)), v.length(2 as number)),\n\t\tarray3: v.pipe(v.array(v.array(v.pipe(v.string(), v.maxLength(10 as number)))), v.length(2 as number)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: v.GenericSchema<TopLevelCondition> = v.custom<TopLevelCondition>(() => true);\n\tconst table = pgTable('test', {\n\t\tjson: json().$type<TopLevelCondition>().notNull(),\n\t\tjsonb: jsonb().$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({\n\t\tjson: TopLevelCondition,\n\t\tjsonb: v.nullable(TopLevelCondition),\n\t});\n\tExpect<Equal<v.InferOutput<typeof result>, v.InferOutput<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = pgTable('test', { id: integer() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: v.string() });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = pgTable('test', { id: integer() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: v.string() });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = pgTable('test', { id: integer() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: v.string() });\n}\n\n/* Disallow unknown keys in view qb - select */ {\n\tconst table = pgTable('test', { id: integer() });\n\tconst view = pgView('test').as((qb) => qb.select().from(table));\n\tconst mView = pgMaterializedView('test').as((qb) => qb.select().from(table));\n\tconst nestedSelect = pgView('test').as((qb) => qb.select({ table }).from(table));\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: v.string() });\n\t// @ts-expect-error\n\tcreateSelectSchema(mView, { unknown: v.string() });\n\t// @ts-expect-error\n\tcreateSelectSchema(nestedSelect, { table: { unknown: v.string() } });\n}\n\n/* Disallow unknown keys in view columns - select */ {\n\tconst view = pgView('test', { id: integer() }).as(sql``);\n\tconst mView = pgView('test', { id: integer() }).as(sql``);\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: v.string() });\n\t// @ts-expect-error\n\tcreateSelectSchema(mView, { unknown: v.string() });\n}\n"
  },
  {
    "path": "drizzle-valibot/tests/singlestore.test.ts",
    "content": "import { type Equal } from 'drizzle-orm';\nimport { customType, int, json, serial, singlestoreSchema, singlestoreTable, text } from 'drizzle-orm/singlestore-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport * as v from 'valibot';\nimport { test } from 'vitest';\nimport { jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSelectSchema, createUpdateSchema } from '../src';\nimport { Expect, expectSchemaShape } from './utils.ts';\n\nconst intSchema = v.pipe(\n\tv.number(),\n\tv.minValue(CONSTANTS.INT32_MIN as number),\n\tv.maxValue(CONSTANTS.INT32_MAX as number),\n\tv.integer(),\n);\nconst serialNumberModeSchema = v.pipe(\n\tv.number(),\n\tv.minValue(0 as number),\n\tv.maxValue(Number.MAX_SAFE_INTEGER as number),\n\tv.integer(),\n);\nconst textSchema = v.pipe(v.string(), v.maxLength(CONSTANTS.INT16_UNSIGNED_MAX as number));\n\ntest('table - select', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table in schema - select', (tc) => {\n\tconst schema = singlestoreSchema('test');\n\tconst table = schema.table('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = v.object({\n\t\tid: v.optional(serialNumberModeSchema),\n\t\tname: textSchema,\n\t\tage: v.optional(v.nullable(intSchema)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = v.object({\n\t\tid: v.optional(serialNumberModeSchema),\n\t\tname: v.optional(textSchema),\n\t\tage: v.optional(v.nullable(intSchema)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n// TODO: SingleStore doesn't support views yet. Add these tests when they're added\n\n// test('view qb - select', (t) => {\n// \tconst table = singlestoreTable('test', {\n// \t\tid: serial().primaryKey(),\n// \t\tname: text().notNull(),\n// \t});\n// \tconst view = mysqlView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n// \tconst result = createSelectSchema(view);\n// \tconst expected = v.object({ id: serialNumberModeSchema, age: v.any() });\n// \texpectSchemaShape(t, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\n// test('view columns - select', (t) => {\n// \tconst view = mysqlView('test', {\n// \t\tid: serial().primaryKey(),\n// \t\tname: text().notNull(),\n// \t}).as(sql``);\n\n// \tconst result = createSelectSchema(view);\n// \tconst expected = v.object({ id: serialNumberModeSchema, name: textSchema });\n// \texpectSchemaShape(t, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\n// test('view with nested fields - select', (t) => {\n// \tconst table = singlestoreTable('test', {\n// \t\tid: serial().primaryKey(),\n// \t\tname: text().notNull(),\n// \t});\n// \tconst view = mysqlView('test').as((qb) =>\n// \t\tqb.select({\n// \t\t\tid: table.id,\n// \t\t\tnested: {\n// \t\t\t\tname: table.name,\n// \t\t\t\tage: sql``.as('age'),\n// \t\t\t},\n// \t\t\ttable,\n// \t\t}).from(table)\n// \t);\n\n// \tconst result = createSelectSchema(view);\n// \tconst expected = v.object({\n// \t\tid: serialNumberModeSchema,\n// \t\tnested: v.object({ name: textSchema, age: v.any() }),\n// \t\ttable: v.object({ id: serialNumberModeSchema, name: textSchema }),\n// \t});\n// \texpectSchemaShape(t, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\ntest('nullability - select', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({\n\t\tc1: v.nullable(intSchema),\n\t\tc2: intSchema,\n\t\tc3: v.nullable(intSchema),\n\t\tc4: intSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(intSchema)),\n\t\tc2: intSchema,\n\t\tc3: v.optional(v.nullable(intSchema)),\n\t\tc4: v.optional(intSchema),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - update', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(intSchema)),\n\t\tc2: v.optional(intSchema),\n\t\tc3: v.optional(v.nullable(intSchema)),\n\t\tc4: v.optional(intSchema),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\tconst expected = v.object({\n\t\tc1: v.nullable(intSchema),\n\t\tc2: v.pipe(intSchema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (t) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = v.pipe(v.string(), v.minLength(1), v.maxLength(100));\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = v.object({\n\t\tc1: v.nullable(intSchema),\n\t\tc2: v.pipe(intSchema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(intSchema)),\n\t\tc2: v.pipe(intSchema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(intSchema)),\n\t\tc2: v.optional(v.pipe(intSchema, v.maxValue(1000))),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n// test('refine view - select', (t) => {\n// \tconst table = singlestoreTable('test', {\n// \t\tc1: int(),\n// \t\tc2: int(),\n// \t\tc3: int(),\n// \t\tc4: int(),\n// \t\tc5: int(),\n// \t\tc6: int(),\n// \t});\n// \tconst view = mysqlView('test').as((qb) =>\n// \t\tqb.select({\n// \t\t\tc1: table.c1,\n// \t\t\tc2: table.c2,\n// \t\t\tc3: table.c3,\n// \t\t\tnested: {\n// \t\t\t\tc4: table.c4,\n// \t\t\t\tc5: table.c5,\n// \t\t\t\tc6: table.c6,\n// \t\t\t},\n// \t\t\ttable,\n// \t\t}).from(table)\n// \t);\n\n// \tconst result = createSelectSchema(view, {\n// \t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n// \t\tc3: v.pipe(v.string(), v.transform(Number)),\n// \t\tnested: {\n// \t\t\tc5: (schema) => v.pipe(schema, v.maxValue(1000)),\n// \t\t\tc6: v.pipe(v.string(), v.transform(Number)),\n// \t\t},\n// \t\ttable: {\n// \t\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n// \t\t\tc3: v.pipe(v.string(), v.transform(Number)),\n// \t\t},\n// \t});\n// \tconst expected = v.object({\n// \t\tc1: v.nullable(intSchema),\n// \t\tc2: v.nullable(v.pipe(intSchema, v.maxValue(1000))),\n// \t\tc3: v.pipe(v.string(), v.transform(Number)),\n// \t\tnested: v.object({\n// \t\t\tc4: v.nullable(intSchema),\n// \t\t\tc5: v.nullable(v.pipe(intSchema, v.maxValue(1000))),\n// \t\t\tc6: v.pipe(v.string(), v.transform(Number)),\n// \t\t}),\n// \t\ttable: v.object({\n// \t\t\tc1: v.nullable(intSchema),\n// \t\t\tc2: v.nullable(v.pipe(intSchema, v.maxValue(1000))),\n// \t\t\tc3: v.pipe(v.string(), v.transform(Number)),\n// \t\t\tc4: v.nullable(intSchema),\n// \t\t\tc5: v.nullable(intSchema),\n// \t\t\tc6: v.nullable(intSchema),\n// \t\t}),\n// \t});\n// \texpectSchemaShape(t, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\ntest('all data types', (t) => {\n\tconst table = singlestoreTable('test', ({\n\t\tbigint,\n\t\tbinary,\n\t\tboolean,\n\t\tchar,\n\t\tdate,\n\t\tdatetime,\n\t\tdecimal,\n\t\tdouble,\n\t\tfloat,\n\t\tint,\n\t\tjson,\n\t\tmediumint,\n\t\tsinglestoreEnum,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\ttext,\n\t\ttime,\n\t\ttimestamp,\n\t\ttinyint,\n\t\tvarchar,\n\t\tvarbinary,\n\t\tyear,\n\t\tlongtext,\n\t\tmediumtext,\n\t\ttinytext,\n\t}) => ({\n\t\tbigint1: bigint({ mode: 'number' }).notNull(),\n\t\tbigint2: bigint({ mode: 'bigint' }).notNull(),\n\t\tbigint3: bigint({ unsigned: true, mode: 'number' }).notNull(),\n\t\tbigint4: bigint({ unsigned: true, mode: 'bigint' }).notNull(),\n\t\tbinary: binary({ length: 10 }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\tchar1: char({ length: 10 }).notNull(),\n\t\tchar2: char({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tdate1: date({ mode: 'date' }).notNull(),\n\t\tdate2: date({ mode: 'string' }).notNull(),\n\t\tdatetime1: datetime({ mode: 'date' }).notNull(),\n\t\tdatetime2: datetime({ mode: 'string' }).notNull(),\n\t\tdecimal1: decimal().notNull(),\n\t\tdecimal2: decimal({ unsigned: true }).notNull(),\n\t\tdouble1: double().notNull(),\n\t\tdouble2: double({ unsigned: true }).notNull(),\n\t\tfloat1: float().notNull(),\n\t\tfloat2: float({ unsigned: true }).notNull(),\n\t\tint1: int().notNull(),\n\t\tint2: int({ unsigned: true }).notNull(),\n\t\tjson: json().notNull(),\n\t\tmediumint1: mediumint().notNull(),\n\t\tmediumint2: mediumint({ unsigned: true }).notNull(),\n\t\tenum: singlestoreEnum('enum', ['a', 'b', 'c']).notNull(),\n\t\treal: real().notNull(),\n\t\tserial: serial().notNull(),\n\t\tsmallint1: smallint().notNull(),\n\t\tsmallint2: smallint({ unsigned: true }).notNull(),\n\t\ttext1: text().notNull(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttime: time().notNull(),\n\t\ttimestamp1: timestamp({ mode: 'date' }).notNull(),\n\t\ttimestamp2: timestamp({ mode: 'string' }).notNull(),\n\t\ttinyint1: tinyint().notNull(),\n\t\ttinyint2: tinyint({ unsigned: true }).notNull(),\n\t\tvarchar1: varchar({ length: 10 }).notNull(),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tvarbinary: varbinary({ length: 10 }).notNull(),\n\t\tyear: year().notNull(),\n\t\tlongtext1: longtext().notNull(),\n\t\tlongtext2: longtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\tmediumtext1: mediumtext().notNull(),\n\t\tmediumtext2: mediumtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttinytext1: tinytext().notNull(),\n\t\ttinytext2: tinytext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({\n\t\tbigint1: v.pipe(v.number(), v.minValue(Number.MIN_SAFE_INTEGER), v.maxValue(Number.MAX_SAFE_INTEGER), v.integer()),\n\t\tbigint2: v.pipe(v.bigint(), v.minValue(CONSTANTS.INT64_MIN), v.maxValue(CONSTANTS.INT64_MAX)),\n\t\tbigint3: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(Number.MAX_SAFE_INTEGER), v.integer()),\n\t\tbigint4: v.pipe(v.bigint(), v.minValue(0n as bigint), v.maxValue(CONSTANTS.INT64_UNSIGNED_MAX)),\n\t\tbinary: v.string(),\n\t\tboolean: v.boolean(),\n\t\tchar1: v.pipe(v.string(), v.length(10 as number)),\n\t\tchar2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tdate1: v.date(),\n\t\tdate2: v.string(),\n\t\tdatetime1: v.date(),\n\t\tdatetime2: v.string(),\n\t\tdecimal1: v.string(),\n\t\tdecimal2: v.string(),\n\t\tdouble1: v.pipe(v.number(), v.minValue(CONSTANTS.INT48_MIN), v.maxValue(CONSTANTS.INT48_MAX)),\n\t\tdouble2: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(CONSTANTS.INT48_UNSIGNED_MAX)),\n\t\tfloat1: v.pipe(v.number(), v.minValue(CONSTANTS.INT24_MIN), v.maxValue(CONSTANTS.INT24_MAX)),\n\t\tfloat2: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(CONSTANTS.INT24_UNSIGNED_MAX)),\n\t\tint1: v.pipe(v.number(), v.minValue(CONSTANTS.INT32_MIN), v.maxValue(CONSTANTS.INT32_MAX), v.integer()),\n\t\tint2: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(CONSTANTS.INT32_UNSIGNED_MAX), v.integer()),\n\t\tjson: jsonSchema,\n\t\tmediumint1: v.pipe(v.number(), v.minValue(CONSTANTS.INT24_MIN), v.maxValue(CONSTANTS.INT24_MAX), v.integer()),\n\t\tmediumint2: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(CONSTANTS.INT24_UNSIGNED_MAX), v.integer()),\n\t\tenum: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\treal: v.pipe(v.number(), v.minValue(CONSTANTS.INT48_MIN), v.maxValue(CONSTANTS.INT48_MAX)),\n\t\tserial: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(Number.MAX_SAFE_INTEGER), v.integer()),\n\t\tsmallint1: v.pipe(v.number(), v.minValue(CONSTANTS.INT16_MIN), v.maxValue(CONSTANTS.INT16_MAX), v.integer()),\n\t\tsmallint2: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(CONSTANTS.INT16_UNSIGNED_MAX), v.integer()),\n\t\ttext1: v.pipe(v.string(), v.maxLength(CONSTANTS.INT16_UNSIGNED_MAX)),\n\t\ttext2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\ttime: v.string(),\n\t\ttimestamp1: v.date(),\n\t\ttimestamp2: v.string(),\n\t\ttinyint1: v.pipe(v.number(), v.minValue(CONSTANTS.INT8_MIN), v.maxValue(CONSTANTS.INT8_MAX), v.integer()),\n\t\ttinyint2: v.pipe(v.number(), v.minValue(0 as number), v.maxValue(CONSTANTS.INT8_UNSIGNED_MAX), v.integer()),\n\t\tvarchar1: v.pipe(v.string(), v.maxLength(10 as number)),\n\t\tvarchar2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tvarbinary: v.string(),\n\t\tyear: v.pipe(v.number(), v.minValue(1901 as number), v.maxValue(2155 as number), v.integer()),\n\t\tlongtext1: v.pipe(v.string(), v.maxLength(CONSTANTS.INT32_UNSIGNED_MAX)),\n\t\tlongtext2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\tmediumtext1: v.pipe(v.string(), v.maxLength(CONSTANTS.INT24_UNSIGNED_MAX)),\n\t\tmediumtext2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\ttinytext1: v.pipe(v.string(), v.maxLength(CONSTANTS.INT8_UNSIGNED_MAX)),\n\t\ttinytext2: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: v.GenericSchema<TopLevelCondition> = v.custom<TopLevelCondition>(() => true);\n\tconst table = singlestoreTable('test', {\n\t\tjson: json().$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({\n\t\tjson: v.nullable(TopLevelCondition),\n\t});\n\tExpect<Equal<v.InferOutput<typeof result>, v.InferOutput<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = singlestoreTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: v.string() });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = singlestoreTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: v.string() });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = singlestoreTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: v.string() });\n}\n\n// /* Disallow unknown keys in view qb - select */ {\n// \tconst table = singlestoreTable('test', { id: int() });\n// \tconst view = mysqlView('test').as((qb) => qb.select().from(table));\n// \tconst nestedSelect = mysqlView('test').as((qb) => qb.select({ table }).from(table));\n// \t// @ts-expect-error\n// \tcreateSelectSchema(view, { unknown: v.string() });\n// \t// @ts-expect-error\n// \tcreateSelectSchema(nestedSelect, { table: { unknown: v.string() } });\n// }\n\n// /* Disallow unknown keys in view columns - select */ {\n// \tconst view = mysqlView('test', { id: int() }).as(sql``);\n// \t// @ts-expect-error\n// \tcreateSelectSchema(view, { unknown: v.string() });\n// }\n"
  },
  {
    "path": "drizzle-valibot/tests/sqlite.test.ts",
    "content": "import { type Equal, sql } from 'drizzle-orm';\nimport { blob, customType, int, sqliteTable, sqliteView, text } from 'drizzle-orm/sqlite-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport * as v from 'valibot';\nimport { test } from 'vitest';\nimport { bufferSchema, jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSelectSchema, createUpdateSchema } from '../src';\nimport { Expect, expectSchemaShape } from './utils.ts';\n\nconst intSchema = v.pipe(\n\tv.number(),\n\tv.minValue(Number.MIN_SAFE_INTEGER),\n\tv.maxValue(Number.MAX_SAFE_INTEGER),\n\tv.integer(),\n);\nconst textSchema = v.string();\n\ntest('table - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({ id: intSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = v.object({ id: v.optional(intSchema), name: textSchema, age: v.optional(v.nullable(intSchema)) });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = v.object({\n\t\tid: v.optional(intSchema),\n\t\tname: v.optional(textSchema),\n\t\tage: v.optional(v.nullable(intSchema)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view qb - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t});\n\tconst view = sqliteView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = v.object({ id: intSchema, age: v.any() });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view columns - select', (t) => {\n\tconst view = sqliteView('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = v.object({ id: intSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view with nested fields - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t});\n\tconst view = sqliteView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tid: table.id,\n\t\t\tnested: {\n\t\t\t\tname: table.name,\n\t\t\t\tage: sql``.as('age'),\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = v.object({\n\t\tid: intSchema,\n\t\tnested: v.object({ name: textSchema, age: v.any() }),\n\t\ttable: v.object({ id: intSchema, name: textSchema }),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({\n\t\tc1: v.nullable(intSchema),\n\t\tc2: intSchema,\n\t\tc3: v.nullable(intSchema),\n\t\tc4: intSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(intSchema)),\n\t\tc2: intSchema,\n\t\tc3: v.optional(v.nullable(intSchema)),\n\t\tc4: v.optional(intSchema),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - update', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(intSchema)),\n\t\tc2: v.optional(intSchema),\n\t\tc3: v.optional(v.nullable(intSchema)),\n\t\tc4: v.optional(intSchema),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\tconst expected = v.object({\n\t\tc1: v.nullable(intSchema),\n\t\tc2: v.pipe(intSchema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (t) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = v.pipe(v.string(), v.minLength(1), v.maxLength(100));\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = v.object({\n\t\tc1: v.nullable(intSchema),\n\t\tc2: v.pipe(intSchema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(intSchema)),\n\t\tc2: v.pipe(intSchema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\tconst expected = v.object({\n\t\tc1: v.optional(v.nullable(intSchema)),\n\t\tc2: v.optional(v.pipe(intSchema, v.maxValue(1000))),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine view - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int(),\n\t\tc3: int(),\n\t\tc4: int(),\n\t\tc5: int(),\n\t\tc6: int(),\n\t});\n\tconst view = sqliteView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tc1: table.c1,\n\t\t\tc2: table.c2,\n\t\t\tc3: table.c3,\n\t\t\tnested: {\n\t\t\t\tc4: table.c4,\n\t\t\t\tc5: table.c5,\n\t\t\t\tc6: table.c6,\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view, {\n\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tnested: {\n\t\t\tc5: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\t\tc6: v.pipe(v.string(), v.transform(Number)),\n\t\t},\n\t\ttable: {\n\t\t\tc2: (schema) => v.pipe(schema, v.maxValue(1000)),\n\t\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\t},\n\t});\n\tconst expected = v.object({\n\t\tc1: v.nullable(intSchema),\n\t\tc2: v.nullable(v.pipe(intSchema, v.maxValue(1000))),\n\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\tnested: v.object({\n\t\t\tc4: v.nullable(intSchema),\n\t\t\tc5: v.nullable(v.pipe(intSchema, v.maxValue(1000))),\n\t\t\tc6: v.pipe(v.string(), v.transform(Number)),\n\t\t}),\n\t\ttable: v.object({\n\t\t\tc1: v.nullable(intSchema),\n\t\t\tc2: v.nullable(v.pipe(intSchema, v.maxValue(1000))),\n\t\t\tc3: v.pipe(v.string(), v.transform(Number)),\n\t\t\tc4: v.nullable(intSchema),\n\t\t\tc5: v.nullable(intSchema),\n\t\t\tc6: v.nullable(intSchema),\n\t\t}),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('all data types', (t) => {\n\tconst table = sqliteTable('test', ({\n\t\tblob,\n\t\tinteger,\n\t\tnumeric,\n\t\treal,\n\t\ttext,\n\t}) => ({\n\t\tblob1: blob({ mode: 'buffer' }).notNull(),\n\t\tblob2: blob({ mode: 'bigint' }).notNull(),\n\t\tblob3: blob({ mode: 'json' }).notNull(),\n\t\tinteger1: integer({ mode: 'number' }).notNull(),\n\t\tinteger2: integer({ mode: 'boolean' }).notNull(),\n\t\tinteger3: integer({ mode: 'timestamp' }).notNull(),\n\t\tinteger4: integer({ mode: 'timestamp_ms' }).notNull(),\n\t\tnumeric: numeric().notNull(),\n\t\treal: real().notNull(),\n\t\ttext1: text({ mode: 'text' }).notNull(),\n\t\ttext2: text({ mode: 'text', length: 10 }).notNull(),\n\t\ttext3: text({ mode: 'text', enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttext4: text({ mode: 'json' }).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({\n\t\tblob1: bufferSchema,\n\t\tblob2: v.pipe(v.bigint(), v.minValue(CONSTANTS.INT64_MIN), v.maxValue(CONSTANTS.INT64_MAX)),\n\t\tblob3: jsonSchema,\n\t\tinteger1: v.pipe(v.number(), v.minValue(Number.MIN_SAFE_INTEGER), v.maxValue(Number.MAX_SAFE_INTEGER), v.integer()),\n\t\tinteger2: v.boolean(),\n\t\tinteger3: v.date(),\n\t\tinteger4: v.date(),\n\t\tnumeric: v.string(),\n\t\treal: v.pipe(v.number(), v.minValue(CONSTANTS.INT48_MIN), v.maxValue(CONSTANTS.INT48_MAX)),\n\t\ttext1: v.string(),\n\t\ttext2: v.pipe(v.string(), v.maxLength(10 as number)),\n\t\ttext3: v.enum({ a: 'a', b: 'b', c: 'c' }),\n\t\ttext4: jsonSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: v.GenericSchema<TopLevelCondition> = v.custom<TopLevelCondition>(() => true);\n\tconst table = sqliteTable('test', {\n\t\tjson1: text({ mode: 'json' }).$type<TopLevelCondition>().notNull(),\n\t\tjson2: blob({ mode: 'json' }).$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = v.object({\n\t\tjson1: TopLevelCondition,\n\t\tjson2: v.nullable(TopLevelCondition),\n\t});\n\tExpect<Equal<v.InferOutput<typeof result>, v.InferOutput<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = sqliteTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: v.string() });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = sqliteTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: v.string() });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = sqliteTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: v.string() });\n}\n\n/* Disallow unknown keys in view qb - select */ {\n\tconst table = sqliteTable('test', { id: int() });\n\tconst view = sqliteView('test').as((qb) => qb.select().from(table));\n\tconst nestedSelect = sqliteView('test').as((qb) => qb.select({ table }).from(table));\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: v.string() });\n\t// @ts-expect-error\n\tcreateSelectSchema(nestedSelect, { table: { unknown: v.string() } });\n}\n\n/* Disallow unknown keys in view columns - select */ {\n\tconst view = sqliteView('test', { id: int() }).as(sql``);\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: v.string() });\n}\n"
  },
  {
    "path": "drizzle-valibot/tests/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"module\": \"esnext\",\n\t\t\"target\": \"esnext\",\n\t\t\"noEmit\": true,\n\t\t\"rootDir\": \"..\",\n\t\t\"outDir\": \"./.cache\"\n\t},\n\t\"include\": [\".\", \"../src\"]\n}\n"
  },
  {
    "path": "drizzle-valibot/tests/utils.ts",
    "content": "import type * as v from 'valibot';\nimport { expect, type TaskContext } from 'vitest';\n\nfunction onlySpecifiedKeys(obj: Record<string, any>, keys: string[]) {\n\treturn Object.fromEntries(Object.entries(obj).filter(([key]) => keys.includes(key)));\n}\n\nexport function expectSchemaShape<T extends v.ObjectSchema<v.ObjectEntries, undefined>>(t: TaskContext, expected: T) {\n\treturn {\n\t\tfrom(actual: T) {\n\t\t\texpect(Object.keys(actual.entries)).toStrictEqual(Object.keys(expected.entries));\n\n\t\t\tfor (const key of Object.keys(actual.entries)) {\n\t\t\t\tconst actualEntry = actual.entries[key] as any;\n\t\t\t\tconst expectedEntry = expected.entries[key] as any;\n\t\t\t\tconst keys = ['kind', 'type', 'expects', 'async', 'message'];\n\t\t\t\tactualEntry.pipe ??= [];\n\t\t\t\texpectedEntry.pipe ??= [];\n\n\t\t\t\texpect(onlySpecifiedKeys(actualEntry, keys)).toStrictEqual(onlySpecifiedKeys(expectedEntry, keys));\n\t\t\t\texpect(actualEntry.pipe.length).toStrictEqual(expectedEntry.pipe.length);\n\n\t\t\t\tfor (let i = 0; i < actualEntry.pipe.length; i++) {\n\t\t\t\t\tconst actualPipeElement = actualEntry.pipe[i];\n\t\t\t\t\tconst expectedPipeElement = expectedEntry.pipe[i];\n\t\t\t\t\texpect(onlySpecifiedKeys(actualPipeElement, keys)).toStrictEqual(\n\t\t\t\t\t\tonlySpecifiedKeys(expectedPipeElement, keys),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function expectEnumValues<T extends v.EnumSchema<any, undefined>>(t: TaskContext, expected: T) {\n\treturn {\n\t\tfrom(actual: T) {\n\t\t\texpect(actual.enum).toStrictEqual(expected.enum);\n\t\t},\n\t};\n}\n\nexport function Expect<_ extends true>() {}\n"
  },
  {
    "path": "drizzle-valibot/tsconfig.build.json",
    "content": "{\n\t\"extends\": \"./tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"rootDir\": \"src\"\n\t},\n\t\"include\": [\"src\"]\n}\n"
  },
  {
    "path": "drizzle-valibot/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"outDir\": \"dist\",\n\t\t\"baseUrl\": \".\",\n\t\t\"declaration\": true,\n\t\t\"noEmit\": true,\n\t\t\"paths\": {\n\t\t\t\"~/*\": [\"src/*\"]\n\t\t}\n\t},\n\t\"include\": [\"src\", \"*.ts\"]\n}\n"
  },
  {
    "path": "drizzle-valibot/vitest.config.ts",
    "content": "import tsconfigPaths from 'vite-tsconfig-paths';\nimport { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n\ttest: {\n\t\tinclude: [\n\t\t\t'tests/**/*.test.ts',\n\t\t],\n\t\texclude: [\n\t\t\t'tests/bun/**/*',\n\t\t],\n\t\ttypecheck: {\n\t\t\ttsconfig: 'tsconfig.json',\n\t\t},\n\t\ttestTimeout: 100000,\n\t\thookTimeout: 100000,\n\t\tisolate: false,\n\t\tpoolOptions: {\n\t\t\tthreads: {\n\t\t\t\tsingleThread: true,\n\t\t\t},\n\t\t},\n\t},\n\tplugins: [tsconfigPaths()],\n});\n"
  },
  {
    "path": "drizzle-zod/README.md",
    "content": "<div align='center'>\n<h1>drizzle-zod <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-zod?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-zod'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-zod'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-zod'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\n`drizzle-zod` is a plugin for [Drizzle ORM](https://github.com/drizzle-team/drizzle-orm) that allows you to generate [Zod](https://zod.dev/) schemas from Drizzle ORM schemas.\n\n**Features**\n\n- Create a select schema for tables, views and enums.\n- Create insert and update schemas for tables.\n- Supports all dialects: PostgreSQL, MySQL and SQLite.\n\n# Usage\n\n```ts\nimport { pgEnum, pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod';\nimport { z } from 'zod';\n\nconst users = pgTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n  role: text('role', { enum: ['admin', 'user'] }).notNull(),\n  createdAt: timestamp('created_at').notNull().defaultNow(),\n});\n\n// Schema for inserting a user - can be used to validate API requests\nconst insertUserSchema = createInsertSchema(users);\n\n// Schema for updating a user - can be used to validate API requests\nconst updateUserSchema = createUpdateSchema(users);\n\n// Schema for selecting a user - can be used to validate API responses\nconst selectUserSchema = createSelectSchema(users);\n\n// Overriding the fields\nconst insertUserSchema = createInsertSchema(users, {\n  role: z.string(),\n});\n\n// Refining the fields - useful if you want to change the fields before they become nullable/optional in the final schema\nconst insertUserSchema = createInsertSchema(users, {\n  id: (schema) => schema.positive(),\n  email: (schema) => schema.email(),\n  role: z.string(),\n});\n\n// Usage\n\nconst user = insertUserSchema.parse({\n  name: 'John Doe',\n  email: 'johndoe@test.com',\n  role: 'admin',\n});\n\n// Zod schema type is also inferred from the table schema, so you have full type safety\nconst requestSchema = insertUserSchema.pick({ name: true, email: true });\n```\n"
  },
  {
    "path": "drizzle-zod/package.json",
    "content": "{\n\t\"name\": \"drizzle-zod\",\n\t\"version\": \"0.8.3\",\n\t\"description\": \"Generate Zod schemas from Drizzle ORM schemas\",\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"build\": \"tsx scripts/build.ts\",\n\t\t\"b\": \"pnpm build\",\n\t\t\"test:types\": \"cd tests && tsc\",\n\t\t\"pack\": \"(cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz\",\n\t\t\"publish\": \"npm publish package.tgz\",\n\t\t\"test\": \"vitest run\"\n\t},\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./index.d.mts\",\n\t\t\t\t\"default\": \"./index.mjs\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./index.d.cjs\",\n\t\t\t\t\"default\": \"./index.cjs\"\n\t\t\t},\n\t\t\t\"types\": \"./index.d.ts\",\n\t\t\t\"default\": \"./index.mjs\"\n\t\t}\n\t},\n\t\"main\": \"./index.cjs\",\n\t\"module\": \"./index.mjs\",\n\t\"types\": \"./index.d.ts\",\n\t\"publishConfig\": {\n\t\t\"provenance\": true\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git+https://github.com/drizzle-team/drizzle-orm.git\"\n\t},\n\t\"ava\": {\n\t\t\"files\": [\n\t\t\t\"tests/**/*.test.ts\",\n\t\t\t\"!tests/bun/**/*\"\n\t\t],\n\t\t\"extensions\": {\n\t\t\t\"ts\": \"module\"\n\t\t}\n\t},\n\t\"keywords\": [\n\t\t\"zod\",\n\t\t\"validate\",\n\t\t\"validation\",\n\t\t\"schema\",\n\t\t\"drizzle\",\n\t\t\"orm\",\n\t\t\"pg\",\n\t\t\"mysql\",\n\t\t\"postgresql\",\n\t\t\"postgres\",\n\t\t\"sqlite\",\n\t\t\"database\",\n\t\t\"sql\",\n\t\t\"typescript\",\n\t\t\"ts\"\n\t],\n\t\"author\": \"Drizzle Team\",\n\t\"license\": \"Apache-2.0\",\n\t\"peerDependencies\": {\n\t\t\"drizzle-orm\": \">=0.36.0\",\n\t\t\"zod\": \"^3.25.0 || ^4.0.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@rollup/plugin-typescript\": \"^11.1.0\",\n\t\t\"@types/node\": \"^18.15.10\",\n\t\t\"cpy\": \"^10.1.0\",\n\t\t\"drizzle-orm\": \"link:../drizzle-orm/dist\",\n\t\t\"json-rules-engine\": \"^7.3.1\",\n\t\t\"rimraf\": \"^5.0.0\",\n\t\t\"rollup\": \"^3.29.5\",\n\t\t\"vite-tsconfig-paths\": \"^4.3.2\",\n\t\t\"vitest\": \"^3.1.3\",\n\t\t\"zod\": \"3.25.1\",\n\t\t\"zx\": \"^7.2.2\"\n\t}\n}\n"
  },
  {
    "path": "drizzle-zod/rollup.config.ts",
    "content": "import typescript from '@rollup/plugin-typescript';\nimport { defineConfig } from 'rollup';\n\nexport default defineConfig([\n\t{\n\t\tinput: 'src/index.ts',\n\t\toutput: [\n\t\t\t{\n\t\t\t\tformat: 'esm',\n\t\t\t\tdir: 'dist',\n\t\t\t\tentryFileNames: '[name].mjs',\n\t\t\t\tchunkFileNames: '[name]-[hash].mjs',\n\t\t\t\tsourcemap: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tformat: 'cjs',\n\t\t\t\tdir: 'dist',\n\t\t\t\tentryFileNames: '[name].cjs',\n\t\t\t\tchunkFileNames: '[name]-[hash].cjs',\n\t\t\t\tsourcemap: true,\n\t\t\t},\n\t\t],\n\t\texternal: [\n\t\t\t/^drizzle-orm\\/?/,\n\t\t\t'zod',\n\t\t],\n\t\tplugins: [\n\t\t\ttypescript({\n\t\t\t\ttsconfig: 'tsconfig.build.json',\n\t\t\t}),\n\t\t],\n\t},\n]);\n"
  },
  {
    "path": "drizzle-zod/scripts/build.ts",
    "content": "#!/usr/bin/env -S pnpm tsx\nimport 'zx/globals';\nimport cpy from 'cpy';\n\nawait fs.remove('dist');\nawait $`rollup --config rollup.config.ts --configPlugin typescript`;\nawait $`resolve-tspaths`;\nawait fs.copy('README.md', 'dist/README.md');\nawait cpy('dist/**/*.d.ts', 'dist', {\n\trename: (basename) => basename.replace(/\\.d\\.ts$/, '.d.mts'),\n});\nawait cpy('dist/**/*.d.ts', 'dist', {\n\trename: (basename) => basename.replace(/\\.d\\.ts$/, '.d.cts'),\n});\nawait fs.copy('package.json', 'dist/package.json');\nawait $`scripts/fix-imports.ts`;\n"
  },
  {
    "path": "drizzle-zod/scripts/fix-imports.ts",
    "content": "#!/usr/bin/env -S pnpm tsx\nimport 'zx/globals';\n\nimport path from 'node:path';\nimport { parse, print, visit } from 'recast';\nimport parser from 'recast/parsers/typescript';\n\nfunction resolvePathAlias(importPath: string, file: string) {\n\tif (importPath.startsWith('~/')) {\n\t\tconst relativePath = path.relative(path.dirname(file), path.resolve('dist.new', importPath.slice(2)));\n\t\timportPath = relativePath.startsWith('.') ? relativePath : './' + relativePath;\n\t}\n\n\treturn importPath;\n}\n\nfunction fixImportPath(importPath: string, file: string, ext: string) {\n\timportPath = resolvePathAlias(importPath, file);\n\n\tif (!/\\..*\\.(js|ts)$/.test(importPath)) {\n\t\treturn importPath;\n\t}\n\n\treturn importPath.replace(/\\.(js|ts)$/, ext);\n}\n\nconst cjsFiles = await glob('dist/**/*.{cjs,d.cts}');\n\nawait Promise.all(cjsFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitCallExpression(path) {\n\t\t\tif (path.value.callee.type === 'Identifier' && path.value.callee.name === 'require') {\n\t\t\t\tpath.value.arguments[0].value = fixImportPath(path.value.arguments[0].value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = resolvePathAlias(path.value.argument.value, file);\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.cjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n\nlet esmFiles = await glob('dist/**/*.{js,d.ts}');\n\nawait Promise.all(esmFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.js');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = fixImportPath(path.value.argument.value, file, '.js');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.js');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n\nesmFiles = await glob('dist/**/*.{mjs,d.mts}');\n\nawait Promise.all(esmFiles.map(async (file) => {\n\tconst code = parse(await fs.readFile(file, 'utf8'), { parser });\n\n\tvisit(code, {\n\t\tvisitImportDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.mjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportAllDeclaration(path) {\n\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.mjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitExportNamedDeclaration(path) {\n\t\t\tif (path.value.source) {\n\t\t\t\tpath.value.source.value = fixImportPath(path.value.source.value, file, '.mjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitTSImportType(path) {\n\t\t\tpath.value.argument.value = fixImportPath(path.value.argument.value, file, '.mjs');\n\t\t\tthis.traverse(path);\n\t\t},\n\t\tvisitAwaitExpression(path) {\n\t\t\tif (print(path.value).code.startsWith(`await import(\"./`)) {\n\t\t\t\tpath.value.argument.arguments[0].value = fixImportPath(path.value.argument.arguments[0].value, file, '.mjs');\n\t\t\t}\n\t\t\tthis.traverse(path);\n\t\t},\n\t});\n\n\tawait fs.writeFile(file, print(code).code);\n}));\n"
  },
  {
    "path": "drizzle-zod/src/column.ts",
    "content": "import type { Column, ColumnBaseConfig } from 'drizzle-orm';\nimport type {\n\tMySqlBigInt53,\n\tMySqlChar,\n\tMySqlDouble,\n\tMySqlFloat,\n\tMySqlInt,\n\tMySqlMediumInt,\n\tMySqlReal,\n\tMySqlSerial,\n\tMySqlSmallInt,\n\tMySqlText,\n\tMySqlTinyInt,\n\tMySqlVarChar,\n\tMySqlYear,\n} from 'drizzle-orm/mysql-core';\nimport type {\n\tPgArray,\n\tPgBigInt53,\n\tPgBigSerial53,\n\tPgBinaryVector,\n\tPgChar,\n\tPgDoublePrecision,\n\tPgGeometry,\n\tPgGeometryObject,\n\tPgHalfVector,\n\tPgInteger,\n\tPgLineABC,\n\tPgLineTuple,\n\tPgPointObject,\n\tPgPointTuple,\n\tPgReal,\n\tPgSerial,\n\tPgSmallInt,\n\tPgSmallSerial,\n\tPgUUID,\n\tPgVarchar,\n\tPgVector,\n} from 'drizzle-orm/pg-core';\nimport type {\n\tSingleStoreBigInt53,\n\tSingleStoreChar,\n\tSingleStoreDouble,\n\tSingleStoreFloat,\n\tSingleStoreInt,\n\tSingleStoreMediumInt,\n\tSingleStoreReal,\n\tSingleStoreSerial,\n\tSingleStoreSmallInt,\n\tSingleStoreText,\n\tSingleStoreTinyInt,\n\tSingleStoreVarChar,\n\tSingleStoreYear,\n} from 'drizzle-orm/singlestore-core';\nimport type { SQLiteInteger, SQLiteReal, SQLiteText } from 'drizzle-orm/sqlite-core';\nimport { z as zod } from 'zod/v4';\nimport { CONSTANTS } from './constants.ts';\nimport type { CreateSchemaFactoryOptions } from './schema.types.ts';\nimport { isColumnType, isWithEnum } from './utils.ts';\nimport type { Json } from './utils.ts';\n\nexport const literalSchema = zod.union([zod.string(), zod.number(), zod.boolean(), zod.null()]);\nexport const jsonSchema: zod.ZodType<Json> = zod.union([\n\tliteralSchema,\n\tzod.record(zod.string(), zod.any()),\n\tzod.array(zod.any()),\n]);\nexport const bufferSchema: zod.ZodType<Buffer> = zod.custom<Buffer>((v) => v instanceof Buffer); // eslint-disable-line no-instanceof/no-instanceof\n\nexport function columnToSchema(\n\tcolumn: Column,\n\tfactory:\n\t\t| CreateSchemaFactoryOptions<\n\t\t\tPartial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined\n\t\t>\n\t\t| undefined,\n): zod.ZodType {\n\tconst z: typeof zod = factory?.zodInstance ?? zod;\n\tconst coerce = factory?.coerce ?? {};\n\tlet schema!: zod.ZodType;\n\n\tif (isWithEnum(column)) {\n\t\tschema = column.enumValues.length ? z.enum(column.enumValues) : z.string();\n\t}\n\n\tif (!schema) {\n\t\t// Handle specific types\n\t\tif (isColumnType<PgGeometry<any> | PgPointTuple<any>>(column, ['PgGeometry', 'PgPointTuple'])) {\n\t\t\tschema = z.tuple([z.number(), z.number()]);\n\t\t} else if (\n\t\t\tisColumnType<PgPointObject<any> | PgGeometryObject<any>>(column, ['PgGeometryObject', 'PgPointObject'])\n\t\t) {\n\t\t\tschema = z.object({ x: z.number(), y: z.number() });\n\t\t} else if (isColumnType<PgHalfVector<any> | PgVector<any>>(column, ['PgHalfVector', 'PgVector'])) {\n\t\t\tschema = z.array(z.number());\n\t\t\tschema = column.dimensions ? (schema as zod.ZodArray<any>).length(column.dimensions) : schema;\n\t\t} else if (isColumnType<PgLineTuple<any>>(column, ['PgLine'])) {\n\t\t\tschema = z.tuple([z.number(), z.number(), z.number()]);\n\t\t} else if (isColumnType<PgLineABC<any>>(column, ['PgLineABC'])) {\n\t\t\tschema = z.object({\n\t\t\t\ta: z.number(),\n\t\t\t\tb: z.number(),\n\t\t\t\tc: z.number(),\n\t\t\t});\n\t\t} // Handle other types\n\t\telse if (isColumnType<PgArray<any, any>>(column, ['PgArray'])) {\n\t\t\tschema = z.array(columnToSchema(column.baseColumn, factory));\n\t\t\tschema = column.size ? (schema as zod.ZodArray<any>).length(column.size) : schema;\n\t\t} else if (column.dataType === 'array') {\n\t\t\tschema = z.array(z.any());\n\t\t} else if (column.dataType === 'number') {\n\t\t\tschema = numberColumnToSchema(column, z, coerce);\n\t\t} else if (column.dataType === 'bigint') {\n\t\t\tschema = bigintColumnToSchema(column, z, coerce);\n\t\t} else if (column.dataType === 'boolean') {\n\t\t\tschema = coerce === true || coerce.boolean ? z.coerce.boolean() : z.boolean();\n\t\t} else if (column.dataType === 'date') {\n\t\t\tschema = coerce === true || coerce.date ? z.coerce.date() : z.date();\n\t\t} else if (column.dataType === 'string') {\n\t\t\tschema = stringColumnToSchema(column, z, coerce);\n\t\t} else if (column.dataType === 'json') {\n\t\t\tschema = jsonSchema;\n\t\t} else if (column.dataType === 'custom') {\n\t\t\tschema = z.any();\n\t\t} else if (column.dataType === 'buffer') {\n\t\t\tschema = bufferSchema;\n\t\t}\n\t}\n\n\tif (!schema) {\n\t\tschema = z.any();\n\t}\n\n\treturn schema;\n}\n\nfunction numberColumnToSchema(\n\tcolumn: Column,\n\tz: typeof zod,\n\tcoerce: CreateSchemaFactoryOptions<\n\t\tPartial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined\n\t>['coerce'],\n): zod.ZodType {\n\tlet unsigned = column.getSQLType().includes('unsigned');\n\tlet min!: number;\n\tlet max!: number;\n\tlet integer = false;\n\n\tif (isColumnType<MySqlTinyInt<any> | SingleStoreTinyInt<any>>(column, ['MySqlTinyInt', 'SingleStoreTinyInt'])) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT8_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT8_UNSIGNED_MAX : CONSTANTS.INT8_MAX;\n\t\tinteger = true;\n\t} else if (\n\t\tisColumnType<PgSmallInt<any> | PgSmallSerial<any> | MySqlSmallInt<any> | SingleStoreSmallInt<any>>(column, [\n\t\t\t'PgSmallInt',\n\t\t\t'PgSmallSerial',\n\t\t\t'MySqlSmallInt',\n\t\t\t'SingleStoreSmallInt',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT16_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT16_UNSIGNED_MAX : CONSTANTS.INT16_MAX;\n\t\tinteger = true;\n\t} else if (\n\t\tisColumnType<\n\t\t\tPgReal<any> | MySqlFloat<any> | MySqlMediumInt<any> | SingleStoreMediumInt<any> | SingleStoreFloat<any>\n\t\t>(column, [\n\t\t\t'PgReal',\n\t\t\t'MySqlFloat',\n\t\t\t'MySqlMediumInt',\n\t\t\t'SingleStoreMediumInt',\n\t\t\t'SingleStoreFloat',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT24_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT24_UNSIGNED_MAX : CONSTANTS.INT24_MAX;\n\t\tinteger = isColumnType(column, ['MySqlMediumInt', 'SingleStoreMediumInt']);\n\t} else if (\n\t\tisColumnType<PgInteger<any> | PgSerial<any> | MySqlInt<any> | SingleStoreInt<any>>(column, [\n\t\t\t'PgInteger',\n\t\t\t'PgSerial',\n\t\t\t'MySqlInt',\n\t\t\t'SingleStoreInt',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT32_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT32_UNSIGNED_MAX : CONSTANTS.INT32_MAX;\n\t\tinteger = true;\n\t} else if (\n\t\tisColumnType<\n\t\t\t| PgDoublePrecision<any>\n\t\t\t| MySqlReal<any>\n\t\t\t| MySqlDouble<any>\n\t\t\t| SingleStoreReal<any>\n\t\t\t| SingleStoreDouble<any>\n\t\t\t| SQLiteReal<any>\n\t\t>(column, [\n\t\t\t'PgDoublePrecision',\n\t\t\t'MySqlReal',\n\t\t\t'MySqlDouble',\n\t\t\t'SingleStoreReal',\n\t\t\t'SingleStoreDouble',\n\t\t\t'SQLiteReal',\n\t\t])\n\t) {\n\t\tmin = unsigned ? 0 : CONSTANTS.INT48_MIN;\n\t\tmax = unsigned ? CONSTANTS.INT48_UNSIGNED_MAX : CONSTANTS.INT48_MAX;\n\t} else if (\n\t\tisColumnType<\n\t\t\t| PgBigInt53<any>\n\t\t\t| PgBigSerial53<any>\n\t\t\t| MySqlBigInt53<any>\n\t\t\t| MySqlSerial<any>\n\t\t\t| SingleStoreBigInt53<any>\n\t\t\t| SingleStoreSerial<any>\n\t\t\t| SQLiteInteger<any>\n\t\t>(\n\t\t\tcolumn,\n\t\t\t[\n\t\t\t\t'PgBigInt53',\n\t\t\t\t'PgBigSerial53',\n\t\t\t\t'MySqlBigInt53',\n\t\t\t\t'MySqlSerial',\n\t\t\t\t'SingleStoreBigInt53',\n\t\t\t\t'SingleStoreSerial',\n\t\t\t\t'SQLiteInteger',\n\t\t\t],\n\t\t)\n\t) {\n\t\tunsigned = unsigned || isColumnType(column, ['MySqlSerial', 'SingleStoreSerial']);\n\t\tmin = unsigned ? 0 : Number.MIN_SAFE_INTEGER;\n\t\tmax = Number.MAX_SAFE_INTEGER;\n\t\tinteger = true;\n\t} else if (isColumnType<MySqlYear<any> | SingleStoreYear<any>>(column, ['MySqlYear', 'SingleStoreYear'])) {\n\t\tmin = 1901;\n\t\tmax = 2155;\n\t\tinteger = true;\n\t} else {\n\t\tmin = Number.MIN_SAFE_INTEGER;\n\t\tmax = Number.MAX_SAFE_INTEGER;\n\t}\n\n\tlet schema = coerce === true || coerce?.number\n\t\t? integer ? z.coerce.number() : z.coerce.number().int()\n\t\t: integer\n\t\t? z.int()\n\t\t: z.number();\n\tschema = schema.gte(min).lte(max);\n\treturn schema;\n}\n\nfunction bigintColumnToSchema(\n\tcolumn: Column,\n\tz: typeof zod,\n\tcoerce: CreateSchemaFactoryOptions<\n\t\tPartial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined\n\t>['coerce'],\n): zod.ZodType {\n\tconst unsigned = column.getSQLType().includes('unsigned');\n\tconst min = unsigned ? 0n : CONSTANTS.INT64_MIN;\n\tconst max = unsigned ? CONSTANTS.INT64_UNSIGNED_MAX : CONSTANTS.INT64_MAX;\n\n\tconst schema = coerce === true || coerce?.bigint ? z.coerce.bigint() : z.bigint();\n\treturn schema.gte(min).lte(max);\n}\n\nfunction stringColumnToSchema(\n\tcolumn: Column,\n\tz: typeof zod,\n\tcoerce: CreateSchemaFactoryOptions<\n\t\tPartial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined\n\t>['coerce'],\n): zod.ZodType {\n\tif (isColumnType<PgUUID<ColumnBaseConfig<'string', 'PgUUID'>>>(column, ['PgUUID'])) {\n\t\treturn z.uuid();\n\t}\n\n\tlet max: number | undefined;\n\tlet regex: RegExp | undefined;\n\tlet fixed = false;\n\n\tif (isColumnType<PgVarchar<any> | SQLiteText<any>>(column, ['PgVarchar', 'SQLiteText'])) {\n\t\tmax = column.length;\n\t} else if (\n\t\tisColumnType<MySqlVarChar<any> | SingleStoreVarChar<any>>(column, ['MySqlVarChar', 'SingleStoreVarChar'])\n\t) {\n\t\tmax = column.length ?? CONSTANTS.INT16_UNSIGNED_MAX;\n\t} else if (isColumnType<MySqlText<any> | SingleStoreText<any>>(column, ['MySqlText', 'SingleStoreText'])) {\n\t\tif (column.textType === 'longtext') {\n\t\t\tmax = CONSTANTS.INT32_UNSIGNED_MAX;\n\t\t} else if (column.textType === 'mediumtext') {\n\t\t\tmax = CONSTANTS.INT24_UNSIGNED_MAX;\n\t\t} else if (column.textType === 'text') {\n\t\t\tmax = CONSTANTS.INT16_UNSIGNED_MAX;\n\t\t} else {\n\t\t\tmax = CONSTANTS.INT8_UNSIGNED_MAX;\n\t\t}\n\t}\n\n\tif (\n\t\tisColumnType<PgChar<any> | MySqlChar<any> | SingleStoreChar<any>>(column, [\n\t\t\t'PgChar',\n\t\t\t'MySqlChar',\n\t\t\t'SingleStoreChar',\n\t\t])\n\t) {\n\t\tmax = column.length;\n\t\tfixed = true;\n\t}\n\n\tif (isColumnType<PgBinaryVector<any>>(column, ['PgBinaryVector'])) {\n\t\tregex = /^[01]+$/;\n\t\tmax = column.dimensions;\n\t}\n\n\tlet schema = coerce === true || coerce?.string ? z.coerce.string() : z.string();\n\tschema = regex ? schema.regex(regex) : schema;\n\treturn max && fixed ? schema.length(max) : max ? schema.max(max) : schema;\n}\n"
  },
  {
    "path": "drizzle-zod/src/column.types.ts",
    "content": "import type { Assume, Column } from 'drizzle-orm';\nimport type { z } from 'zod/v4';\nimport type { IsEnumDefined, IsNever, Json } from './utils.ts';\n\ntype HasBaseColumn<TColumn> = TColumn extends { _: { baseColumn: Column | undefined } }\n\t? IsNever<TColumn['_']['baseColumn']> extends false ? true\n\t: false\n\t: false;\n\nexport type GetZodType<\n\tTColumn extends Column,\n\tTCoerce extends Partial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined,\n> = HasBaseColumn<TColumn> extends true ? z.ZodArray<\n\t\tGetZodType<Assume<TColumn['_']['baseColumn'], Column>, TCoerce>\n\t>\n\t: TColumn['_']['columnType'] extends 'PgUUID' ? z.ZodUUID\n\t: IsEnumDefined<TColumn['_']['enumValues']> extends true\n\t\t? z.ZodEnum<{ [K in Assume<TColumn['_']['enumValues'], [string, ...string[]]>[number]]: K }>\n\t: TColumn['_']['columnType'] extends 'PgGeometry' | 'PgPointTuple' ? z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>\n\t: TColumn['_']['columnType'] extends 'PgLine' ? z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>\n\t: TColumn['_']['data'] extends Date ? CanCoerce<TCoerce, 'date'> extends true ? z.coerce.ZodCoercedDate : z.ZodDate\n\t: TColumn['_']['data'] extends Buffer ? z.ZodType<Buffer>\n\t: TColumn['_']['dataType'] extends 'array'\n\t\t? z.ZodArray<GetZodPrimitiveType<Assume<TColumn['_']['data'], any[]>[number], '', TCoerce>>\n\t: TColumn['_']['data'] extends Record<string, any>\n\t\t? TColumn['_']['columnType'] extends\n\t\t\t'PgJson' | 'PgJsonb' | 'MySqlJson' | 'SingleStoreJson' | 'SQLiteTextJson' | 'SQLiteBlobJson'\n\t\t\t? z.ZodType<TColumn['_']['data'], TColumn['_']['data']>\n\t\t: z.ZodObject<\n\t\t\t{ [K in keyof TColumn['_']['data']]: GetZodPrimitiveType<TColumn['_']['data'][K], '', TCoerce> },\n\t\t\t{ out: {}; in: {} }\n\t\t>\n\t: TColumn['_']['dataType'] extends 'json' ? z.ZodType<Json>\n\t: GetZodPrimitiveType<TColumn['_']['data'], TColumn['_']['columnType'], TCoerce>;\n\ntype CanCoerce<\n\tTCoerce extends Partial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined,\n\tTTo extends 'bigint' | 'boolean' | 'date' | 'number' | 'string',\n> = TCoerce extends true ? true\n\t: TCoerce extends Record<string, any> ? TCoerce[TTo] extends true ? true\n\t\t: false\n\t: false;\n\ntype GetZodPrimitiveType<\n\tTData,\n\tTColumnType,\n\tTCoerce extends Partial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined,\n> = TColumnType extends\n\t| 'MySqlTinyInt'\n\t| 'SingleStoreTinyInt'\n\t| 'PgSmallInt'\n\t| 'PgSmallSerial'\n\t| 'MySqlSmallInt'\n\t| 'MySqlMediumInt'\n\t| 'SingleStoreSmallInt'\n\t| 'SingleStoreMediumInt'\n\t| 'PgInteger'\n\t| 'PgSerial'\n\t| 'MySqlInt'\n\t| 'SingleStoreInt'\n\t| 'PgBigInt53'\n\t| 'PgBigSerial53'\n\t| 'MySqlBigInt53'\n\t| 'MySqlSerial'\n\t| 'SingleStoreBigInt53'\n\t| 'SingleStoreSerial'\n\t| 'SQLiteInteger'\n\t| 'MySqlYear'\n\t| 'SingleStoreYear' ? CanCoerce<TCoerce, 'number'> extends true ? z.coerce.ZodCoercedNumber : z.ZodInt\n\t: TData extends number ? CanCoerce<TCoerce, 'number'> extends true ? z.coerce.ZodCoercedNumber : z.ZodNumber\n\t: TData extends bigint ? CanCoerce<TCoerce, 'bigint'> extends true ? z.coerce.ZodCoercedBigInt : z.ZodBigInt\n\t: TData extends boolean ? CanCoerce<TCoerce, 'boolean'> extends true ? z.coerce.ZodCoercedBoolean : z.ZodBoolean\n\t: TData extends string ? CanCoerce<TCoerce, 'string'> extends true ? z.coerce.ZodCoercedString : z.ZodString\n\t: z.ZodType;\n\ntype HandleSelectColumn<\n\tTSchema extends z.ZodType,\n\tTColumn extends Column,\n> = TColumn['_']['notNull'] extends true ? TSchema\n\t: z.ZodNullable<TSchema>;\n\ntype HandleInsertColumn<\n\tTSchema extends z.ZodType,\n\tTColumn extends Column,\n> = TColumn['_']['notNull'] extends true ? TColumn['_']['hasDefault'] extends true ? z.ZodOptional<TSchema>\n\t: TSchema\n\t: z.ZodOptional<z.ZodNullable<TSchema>>;\n\ntype HandleUpdateColumn<\n\tTSchema extends z.ZodType,\n\tTColumn extends Column,\n> = TColumn['_']['notNull'] extends true ? z.ZodOptional<TSchema>\n\t: z.ZodOptional<z.ZodNullable<TSchema>>;\n\nexport type HandleColumn<\n\tTType extends 'select' | 'insert' | 'update',\n\tTColumn extends Column,\n\tTCoerce extends Partial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined,\n> = TType extends 'select' ? HandleSelectColumn<GetZodType<TColumn, TCoerce>, TColumn>\n\t: TType extends 'insert' ? HandleInsertColumn<GetZodType<TColumn, TCoerce>, TColumn>\n\t: TType extends 'update' ? HandleUpdateColumn<GetZodType<TColumn, TCoerce>, TColumn>\n\t: GetZodType<TColumn, TCoerce>;\n"
  },
  {
    "path": "drizzle-zod/src/constants.ts",
    "content": "export const CONSTANTS = {\n\tINT8_MIN: -128,\n\tINT8_MAX: 127,\n\tINT8_UNSIGNED_MAX: 255,\n\tINT16_MIN: -32768,\n\tINT16_MAX: 32767,\n\tINT16_UNSIGNED_MAX: 65535,\n\tINT24_MIN: -8388608,\n\tINT24_MAX: 8388607,\n\tINT24_UNSIGNED_MAX: 16777215,\n\tINT32_MIN: -2147483648,\n\tINT32_MAX: 2147483647,\n\tINT32_UNSIGNED_MAX: 4294967295,\n\tINT48_MIN: -140737488355328,\n\tINT48_MAX: 140737488355327,\n\tINT48_UNSIGNED_MAX: 281474976710655,\n\tINT64_MIN: -9223372036854775808n,\n\tINT64_MAX: 9223372036854775807n,\n\tINT64_UNSIGNED_MAX: 18446744073709551615n,\n};\n"
  },
  {
    "path": "drizzle-zod/src/index.ts",
    "content": "export { bufferSchema, jsonSchema, literalSchema } from './column.ts';\nexport * from './column.types.ts';\nexport * from './schema.ts';\nexport * from './schema.types.internal.ts';\nexport * from './schema.types.ts';\nexport * from './utils.ts';\n"
  },
  {
    "path": "drizzle-zod/src/schema.ts",
    "content": "import { Column, getTableColumns, getViewSelectedFields, is, isTable, isView, SQL } from 'drizzle-orm';\nimport type { Table, View } from 'drizzle-orm';\nimport type { PgEnum } from 'drizzle-orm/pg-core';\nimport { z } from 'zod/v4';\nimport { columnToSchema } from './column.ts';\nimport type { Conditions } from './schema.types.internal.ts';\nimport type {\n\tCreateInsertSchema,\n\tCreateSchemaFactoryOptions,\n\tCreateSelectSchema,\n\tCreateUpdateSchema,\n} from './schema.types.ts';\nimport { isPgEnum } from './utils.ts';\n\nfunction getColumns(tableLike: Table | View) {\n\treturn isTable(tableLike) ? getTableColumns(tableLike) : getViewSelectedFields(tableLike);\n}\n\nfunction handleColumns(\n\tcolumns: Record<string, any>,\n\trefinements: Record<string, any>,\n\tconditions: Conditions,\n\tfactory?: CreateSchemaFactoryOptions<\n\t\tPartial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined\n\t>,\n): z.ZodType {\n\tconst columnSchemas: Record<string, z.ZodType> = {};\n\n\tfor (const [key, selected] of Object.entries(columns)) {\n\t\tif (!is(selected, Column) && !is(selected, SQL) && !is(selected, SQL.Aliased) && typeof selected === 'object') {\n\t\t\tconst columns = isTable(selected) || isView(selected) ? getColumns(selected) : selected;\n\t\t\tcolumnSchemas[key] = handleColumns(columns, refinements[key] ?? {}, conditions, factory);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst refinement = refinements[key];\n\t\tif (refinement !== undefined && typeof refinement !== 'function') {\n\t\t\tcolumnSchemas[key] = refinement;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst column = is(selected, Column) ? selected : undefined;\n\t\tconst schema = column ? columnToSchema(column, factory) : z.any();\n\t\tconst refined = typeof refinement === 'function' ? refinement(schema) : schema;\n\n\t\tif (conditions.never(column)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tcolumnSchemas[key] = refined;\n\t\t}\n\n\t\tif (column) {\n\t\t\tif (conditions.nullable(column)) {\n\t\t\t\tcolumnSchemas[key] = columnSchemas[key]!.nullable();\n\t\t\t}\n\n\t\t\tif (conditions.optional(column)) {\n\t\t\t\tcolumnSchemas[key] = columnSchemas[key]!.optional();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn z.object(columnSchemas) as any;\n}\n\nfunction handleEnum(\n\tenum_: PgEnum<any>,\n\tfactory?: CreateSchemaFactoryOptions<\n\t\tPartial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined\n\t>,\n) {\n\tconst zod: typeof z = factory?.zodInstance ?? z;\n\treturn zod.enum(enum_.enumValues);\n}\n\nconst selectConditions: Conditions = {\n\tnever: () => false,\n\toptional: () => false,\n\tnullable: (column) => !column.notNull,\n};\n\nconst insertConditions: Conditions = {\n\tnever: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',\n\toptional: (column) => !column.notNull || (column.notNull && column.hasDefault),\n\tnullable: (column) => !column.notNull,\n};\n\nconst updateConditions: Conditions = {\n\tnever: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',\n\toptional: () => true,\n\tnullable: (column) => !column.notNull,\n};\n\nexport const createSelectSchema: CreateSelectSchema<undefined> = (\n\tentity: Table | View | PgEnum<[string, ...string[]]>,\n\trefine?: Record<string, any>,\n) => {\n\tif (isPgEnum(entity)) {\n\t\treturn handleEnum(entity);\n\t}\n\tconst columns = getColumns(entity);\n\treturn handleColumns(columns, refine ?? {}, selectConditions) as any;\n};\n\nexport const createInsertSchema: CreateInsertSchema<undefined> = (\n\tentity: Table,\n\trefine?: Record<string, any>,\n) => {\n\tconst columns = getColumns(entity);\n\treturn handleColumns(columns, refine ?? {}, insertConditions) as any;\n};\n\nexport const createUpdateSchema: CreateUpdateSchema<undefined> = (\n\tentity: Table,\n\trefine?: Record<string, any>,\n) => {\n\tconst columns = getColumns(entity);\n\treturn handleColumns(columns, refine ?? {}, updateConditions) as any;\n};\n\nexport function createSchemaFactory<\n\tTCoerce extends Partial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined,\n>(options?: CreateSchemaFactoryOptions<TCoerce>) {\n\tconst createSelectSchema: CreateSelectSchema<TCoerce> = (\n\t\tentity: Table | View | PgEnum<[string, ...string[]]>,\n\t\trefine?: Record<string, any>,\n\t) => {\n\t\tif (isPgEnum(entity)) {\n\t\t\treturn handleEnum(entity, options);\n\t\t}\n\t\tconst columns = getColumns(entity);\n\t\treturn handleColumns(columns, refine ?? {}, selectConditions, options) as any;\n\t};\n\n\tconst createInsertSchema: CreateInsertSchema<TCoerce> = (\n\t\tentity: Table,\n\t\trefine?: Record<string, any>,\n\t) => {\n\t\tconst columns = getColumns(entity);\n\t\treturn handleColumns(columns, refine ?? {}, insertConditions, options) as any;\n\t};\n\n\tconst createUpdateSchema: CreateUpdateSchema<TCoerce> = (\n\t\tentity: Table,\n\t\trefine?: Record<string, any>,\n\t) => {\n\t\tconst columns = getColumns(entity);\n\t\treturn handleColumns(columns, refine ?? {}, updateConditions, options) as any;\n\t};\n\n\treturn { createSelectSchema, createInsertSchema, createUpdateSchema };\n}\n"
  },
  {
    "path": "drizzle-zod/src/schema.types.internal.ts",
    "content": "import type { Assume, Column, DrizzleTypeError, SelectedFieldsFlat, Simplify, Table, View } from 'drizzle-orm';\nimport type { z } from 'zod/v4';\nimport type { GetZodType, HandleColumn } from './column.types.ts';\nimport type { ColumnIsGeneratedAlwaysAs, GetSelection } from './utils.ts';\n\nexport interface Conditions {\n\tnever: (column?: Column) => boolean;\n\toptional: (column: Column) => boolean;\n\tnullable: (column: Column) => boolean;\n}\n\ntype BuildRefineField<T> = T extends z.ZodType ? ((schema: T) => z.ZodType) | z.ZodType : never;\n\nexport type BuildRefine<\n\tTColumns extends Record<string, any>,\n\tTCoerce extends Partial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined,\n> = {\n\t[K in keyof TColumns as TColumns[K] extends Column | SelectedFieldsFlat<Column> | Table | View ? K : never]?:\n\t\tTColumns[K] extends Column ? BuildRefineField<GetZodType<TColumns[K], TCoerce>>\n\t\t\t: BuildRefine<GetSelection<TColumns[K]>, TCoerce>;\n};\n\ntype HandleRefinement<\n\tTType extends 'select' | 'insert' | 'update',\n\tTRefinement,\n\tTColumn extends Column,\n> = TRefinement extends (schema: any) => z.ZodType ? (TColumn['_']['notNull'] extends true ? ReturnType<TRefinement>\n\t\t: z.ZodNullable<ReturnType<TRefinement>>) extends infer TSchema extends z.ZodType\n\t\t? TType extends 'update' ? z.ZodOptional<TSchema> : TSchema\n\t: z.ZodType\n\t: TRefinement;\n\ntype IsRefinementDefined<\n\tTRefinements extends Record<string | symbol | number, any> | undefined,\n\tTKey extends string | symbol | number,\n> = TRefinements extends object ? TRefinements[TKey] extends z.ZodType | ((schema: any) => any) ? true\n\t: false\n\t: false;\n\nexport type BuildSchema<\n\tTType extends 'select' | 'insert' | 'update',\n\tTColumns extends Record<string, any>,\n\tTRefinements extends Record<string, any> | undefined,\n\tTCoerce extends Partial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined,\n> = z.ZodObject<\n\tSimplify<\n\t\t{\n\t\t\t[\n\t\t\t\tK in keyof TColumns as ColumnIsGeneratedAlwaysAs<TColumns[K]> extends true ? TType extends 'select' ? K\n\t\t\t\t\t: never\n\t\t\t\t\t: K\n\t\t\t]: TColumns[K] extends infer TColumn extends Column\n\t\t\t\t? IsRefinementDefined<TRefinements, K> extends true\n\t\t\t\t\t? Assume<HandleRefinement<TType, TRefinements[K & keyof TRefinements], TColumn>, z.ZodType>\n\t\t\t\t: HandleColumn<TType, TColumn, TCoerce>\n\t\t\t\t: TColumns[K] extends infer TObject extends SelectedFieldsFlat<Column> | Table | View ? BuildSchema<\n\t\t\t\t\t\tTType,\n\t\t\t\t\t\tGetSelection<TObject>,\n\t\t\t\t\t\tTRefinements extends object ? TRefinements[K & keyof TRefinements] : undefined,\n\t\t\t\t\t\tTCoerce\n\t\t\t\t\t>\n\t\t\t\t: z.ZodAny;\n\t\t}\n\t>,\n\t{ out: {}; in: {} }\n>;\n\nexport type NoUnknownKeys<\n\tTRefinement extends Record<string, any>,\n\tTCompare extends Record<string, any>,\n> = {\n\t[K in keyof TRefinement]: K extends keyof TCompare\n\t\t? TRefinement[K] extends Record<string, z.ZodType> ? NoUnknownKeys<TRefinement[K], TCompare[K]>\n\t\t: TRefinement[K]\n\t\t: DrizzleTypeError<`Found unknown key in refinement: \"${K & string}\"`>;\n};\n"
  },
  {
    "path": "drizzle-zod/src/schema.types.ts",
    "content": "import type { Table, View } from 'drizzle-orm';\nimport type { PgEnum } from 'drizzle-orm/pg-core';\nimport type { z } from 'zod/v4';\nimport type { BuildRefine, BuildSchema, NoUnknownKeys } from './schema.types.internal.ts';\n\nexport interface CreateSelectSchema<\n\tTCoerce extends Partial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined,\n> {\n\t<TTable extends Table>(table: TTable): BuildSchema<'select', TTable['_']['columns'], undefined, TCoerce>;\n\t<\n\t\tTTable extends Table,\n\t\tTRefine extends BuildRefine<TTable['_']['columns'], TCoerce>,\n\t>(\n\t\ttable: TTable,\n\t\trefine?: NoUnknownKeys<TRefine, TTable['$inferSelect']>,\n\t): BuildSchema<'select', TTable['_']['columns'], TRefine, TCoerce>;\n\n\t<TView extends View>(view: TView): BuildSchema<'select', TView['_']['selectedFields'], undefined, TCoerce>;\n\t<\n\t\tTView extends View,\n\t\tTRefine extends BuildRefine<TView['_']['selectedFields'], TCoerce>,\n\t>(\n\t\tview: TView,\n\t\trefine: NoUnknownKeys<TRefine, TView['$inferSelect']>,\n\t): BuildSchema<'select', TView['_']['selectedFields'], TRefine, TCoerce>;\n\n\t<TEnum extends PgEnum<any>>(enum_: TEnum): z.ZodEnum<{ [K in TEnum['enumValues'][number]]: K }>;\n}\n\nexport interface CreateInsertSchema<\n\tTCoerce extends Partial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined,\n> {\n\t<TTable extends Table>(table: TTable): BuildSchema<'insert', TTable['_']['columns'], undefined, TCoerce>;\n\t<\n\t\tTTable extends Table,\n\t\tTRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>, TCoerce>,\n\t>(\n\t\ttable: TTable,\n\t\trefine?: NoUnknownKeys<TRefine, TTable['$inferInsert']>,\n\t): BuildSchema<'insert', TTable['_']['columns'], TRefine, TCoerce>;\n}\n\nexport interface CreateUpdateSchema<\n\tTCoerce extends Partial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined,\n> {\n\t<TTable extends Table>(table: TTable): BuildSchema<'update', TTable['_']['columns'], undefined, TCoerce>;\n\t<\n\t\tTTable extends Table,\n\t\tTRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>, TCoerce>,\n\t>(\n\t\ttable: TTable,\n\t\trefine?: TRefine,\n\t): BuildSchema<'update', TTable['_']['columns'], TRefine, TCoerce>;\n}\n\nexport interface CreateSchemaFactoryOptions<\n\tTCoerce extends Partial<Record<'bigint' | 'boolean' | 'date' | 'number' | 'string', true>> | true | undefined,\n> {\n\tzodInstance?: any;\n\tcoerce?: TCoerce;\n}\n"
  },
  {
    "path": "drizzle-zod/src/utils.ts",
    "content": "import type { Column, SelectedFieldsFlat, Table, View } from 'drizzle-orm';\nimport type { PgEnum } from 'drizzle-orm/pg-core';\nimport type { z } from 'zod/v4';\nimport type { literalSchema } from './column.ts';\n\nexport function isColumnType<T extends Column>(column: Column, columnTypes: string[]): column is T {\n\treturn columnTypes.includes(column.columnType);\n}\n\nexport function isWithEnum(column: Column): column is typeof column & { enumValues: [string, ...string[]] } {\n\treturn 'enumValues' in column && Array.isArray(column.enumValues) && column.enumValues.length > 0;\n}\n\nexport const isPgEnum: (entity: any) => entity is PgEnum<[string, ...string[]]> = isWithEnum as any;\n\ntype Literal = z.infer<typeof literalSchema>;\nexport type Json = Literal | { [key: string]: any } | any[];\n\nexport type IsNever<T> = [T] extends [never] ? true : false;\n\nexport type IsEnumDefined<TEnum extends string[] | undefined> = [string, ...string[]] extends TEnum ? false\n\t: undefined extends TEnum ? false\n\t: true;\n\nexport type ColumnIsGeneratedAlwaysAs<TColumn> = TColumn extends Column\n\t? TColumn['_']['identity'] extends 'always' ? true\n\t: TColumn['_']['generated'] extends { type: 'byDefault' } | undefined ? false\n\t: true\n\t: false;\n\nexport type GetSelection<T extends SelectedFieldsFlat<Column> | Table | View> = T extends Table ? T['_']['columns']\n\t: T extends View ? T['_']['selectedFields']\n\t: T;\n"
  },
  {
    "path": "drizzle-zod/tests/mysql.test.ts",
    "content": "import { type Equal, sql } from 'drizzle-orm';\nimport { customType, int, json, mysqlSchema, mysqlTable, mysqlView, serial, text } from 'drizzle-orm/mysql-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport { test } from 'vitest';\nimport { z } from 'zod/v4';\nimport { jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSchemaFactory, createSelectSchema, createUpdateSchema } from '../src';\nimport { Expect, expectSchemaShape } from './utils.ts';\n\nconst intSchema = z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX);\nconst serialNumberModeSchema = z.int().gte(0).lte(Number.MAX_SAFE_INTEGER);\nconst textSchema = z.string().max(CONSTANTS.INT16_UNSIGNED_MAX);\n\ntest('table - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tgenerated: int().generatedAlwaysAs(1).notNull(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({ id: serialNumberModeSchema, generated: intSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table in schema - select', (tc) => {\n\tconst schema = mysqlSchema('test');\n\tconst table = schema.table('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = z.object({\n\t\tid: serialNumberModeSchema.optional(),\n\t\tname: textSchema,\n\t\tage: intSchema.nullable().optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = z.object({\n\t\tid: serialNumberModeSchema.optional(),\n\t\tname: textSchema.optional(),\n\t\tage: intSchema.nullable().optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view qb - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = mysqlView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = z.object({ id: serialNumberModeSchema, age: z.any() });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view columns - select', (t) => {\n\tconst view = mysqlView('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = z.object({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view with nested fields - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = mysqlView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tid: table.id,\n\t\t\tnested: {\n\t\t\t\tname: table.name,\n\t\t\t\tage: sql``.as('age'),\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = z.object({\n\t\tid: serialNumberModeSchema,\n\t\tnested: z.object({ name: textSchema, age: z.any() }),\n\t\ttable: z.object({ id: serialNumberModeSchema, name: textSchema }),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable(),\n\t\tc2: intSchema,\n\t\tc3: intSchema.nullable(),\n\t\tc4: intSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable().optional(),\n\t\tc2: intSchema,\n\t\tc3: intSchema.nullable().optional(),\n\t\tc4: intSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - update', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable().optional(),\n\t\tc2: intSchema.optional(),\n\t\tc3: intSchema.nullable().optional(),\n\t\tc4: intSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable(),\n\t\tc2: intSchema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (t) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = z.string().min(1).max(100);\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable(),\n\t\tc2: intSchema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable().optional(),\n\t\tc2: intSchema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable().optional(),\n\t\tc2: intSchema.lte(1000).optional(),\n\t\tc3: z.string().transform(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine view - select', (t) => {\n\tconst table = mysqlTable('test', {\n\t\tc1: int(),\n\t\tc2: int(),\n\t\tc3: int(),\n\t\tc4: int(),\n\t\tc5: int(),\n\t\tc6: int(),\n\t});\n\tconst view = mysqlView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tc1: table.c1,\n\t\t\tc2: table.c2,\n\t\t\tc3: table.c3,\n\t\t\tnested: {\n\t\t\t\tc4: table.c4,\n\t\t\t\tc5: table.c5,\n\t\t\t\tc6: table.c6,\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t\tnested: {\n\t\t\tc5: (schema) => schema.lte(1000),\n\t\t\tc6: z.string().transform(Number),\n\t\t},\n\t\ttable: {\n\t\t\tc2: (schema) => schema.lte(1000),\n\t\t\tc3: z.string().transform(Number),\n\t\t},\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable(),\n\t\tc2: intSchema.lte(1000).nullable(),\n\t\tc3: z.string().transform(Number),\n\t\tnested: z.object({\n\t\t\tc4: intSchema.nullable(),\n\t\t\tc5: intSchema.lte(1000).nullable(),\n\t\t\tc6: z.string().transform(Number),\n\t\t}),\n\t\ttable: z.object({\n\t\t\tc1: intSchema.nullable(),\n\t\t\tc2: intSchema.lte(1000).nullable(),\n\t\t\tc3: z.string().transform(Number),\n\t\t\tc4: intSchema.nullable(),\n\t\t\tc5: intSchema.nullable(),\n\t\t\tc6: intSchema.nullable(),\n\t\t}),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('all data types', (t) => {\n\tconst table = mysqlTable('test', ({\n\t\tbigint,\n\t\tbinary,\n\t\tboolean,\n\t\tchar,\n\t\tdate,\n\t\tdatetime,\n\t\tdecimal,\n\t\tdouble,\n\t\tfloat,\n\t\tint,\n\t\tjson,\n\t\tmediumint,\n\t\tmysqlEnum,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\ttext,\n\t\ttime,\n\t\ttimestamp,\n\t\ttinyint,\n\t\tvarchar,\n\t\tvarbinary,\n\t\tyear,\n\t\tlongtext,\n\t\tmediumtext,\n\t\ttinytext,\n\t}) => ({\n\t\tbigint1: bigint({ mode: 'number' }).notNull(),\n\t\tbigint2: bigint({ mode: 'bigint' }).notNull(),\n\t\tbigint3: bigint({ unsigned: true, mode: 'number' }).notNull(),\n\t\tbigint4: bigint({ unsigned: true, mode: 'bigint' }).notNull(),\n\t\tbinary: binary({ length: 10 }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\tchar1: char({ length: 10 }).notNull(),\n\t\tchar2: char({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tdate1: date({ mode: 'date' }).notNull(),\n\t\tdate2: date({ mode: 'string' }).notNull(),\n\t\tdatetime1: datetime({ mode: 'date' }).notNull(),\n\t\tdatetime2: datetime({ mode: 'string' }).notNull(),\n\t\tdecimal1: decimal().notNull(),\n\t\tdecimal2: decimal({ unsigned: true }).notNull(),\n\t\tdouble1: double().notNull(),\n\t\tdouble2: double({ unsigned: true }).notNull(),\n\t\tfloat1: float().notNull(),\n\t\tfloat2: float({ unsigned: true }).notNull(),\n\t\tint1: int().notNull(),\n\t\tint2: int({ unsigned: true }).notNull(),\n\t\tjson: json().notNull(),\n\t\tmediumint1: mediumint().notNull(),\n\t\tmediumint2: mediumint({ unsigned: true }).notNull(),\n\t\tenum: mysqlEnum('enum', ['a', 'b', 'c']).notNull(),\n\t\treal: real().notNull(),\n\t\tserial: serial().notNull(),\n\t\tsmallint1: smallint().notNull(),\n\t\tsmallint2: smallint({ unsigned: true }).notNull(),\n\t\ttext1: text().notNull(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttime: time().notNull(),\n\t\ttimestamp1: timestamp({ mode: 'date' }).notNull(),\n\t\ttimestamp2: timestamp({ mode: 'string' }).notNull(),\n\t\ttinyint1: tinyint().notNull(),\n\t\ttinyint2: tinyint({ unsigned: true }).notNull(),\n\t\tvarchar1: varchar({ length: 10 }).notNull(),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tvarbinary: varbinary({ length: 10 }).notNull(),\n\t\tyear: year().notNull(),\n\t\tlongtext1: longtext().notNull(),\n\t\tlongtext2: longtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\tmediumtext1: mediumtext().notNull(),\n\t\tmediumtext2: mediumtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttinytext1: tinytext().notNull(),\n\t\ttinytext2: tinytext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tbigint1: z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER),\n\t\tbigint2: z.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX),\n\t\tbigint3: z.int().gte(0).lte(Number.MAX_SAFE_INTEGER),\n\t\tbigint4: z.bigint().gte(0n).lte(CONSTANTS.INT64_UNSIGNED_MAX),\n\t\tbinary: z.string(),\n\t\tboolean: z.boolean(),\n\t\tchar1: z.string().length(10),\n\t\tchar2: z.enum(['a', 'b', 'c']),\n\t\tdate1: z.date(),\n\t\tdate2: z.string(),\n\t\tdatetime1: z.date(),\n\t\tdatetime2: z.string(),\n\t\tdecimal1: z.string(),\n\t\tdecimal2: z.string(),\n\t\tdouble1: z.number().gte(CONSTANTS.INT48_MIN).lte(CONSTANTS.INT48_MAX),\n\t\tdouble2: z.number().gte(0).lte(CONSTANTS.INT48_UNSIGNED_MAX),\n\t\tfloat1: z.number().gte(CONSTANTS.INT24_MIN).lte(CONSTANTS.INT24_MAX),\n\t\tfloat2: z.number().gte(0).lte(CONSTANTS.INT24_UNSIGNED_MAX),\n\t\tint1: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX),\n\t\tint2: z.int().gte(0).lte(CONSTANTS.INT32_UNSIGNED_MAX),\n\t\tjson: jsonSchema,\n\t\tmediumint1: z.int().gte(CONSTANTS.INT24_MIN).lte(CONSTANTS.INT24_MAX),\n\t\tmediumint2: z.int().gte(0).lte(CONSTANTS.INT24_UNSIGNED_MAX),\n\t\tenum: z.enum(['a', 'b', 'c']),\n\t\treal: z.number().gte(CONSTANTS.INT48_MIN).lte(CONSTANTS.INT48_MAX),\n\t\tserial: z.int().gte(0).lte(Number.MAX_SAFE_INTEGER),\n\t\tsmallint1: z.int().gte(CONSTANTS.INT16_MIN).lte(CONSTANTS.INT16_MAX),\n\t\tsmallint2: z.int().gte(0).lte(CONSTANTS.INT16_UNSIGNED_MAX),\n\t\ttext1: z.string().max(CONSTANTS.INT16_UNSIGNED_MAX),\n\t\ttext2: z.enum(['a', 'b', 'c']),\n\t\ttime: z.string(),\n\t\ttimestamp1: z.date(),\n\t\ttimestamp2: z.string(),\n\t\ttinyint1: z.int().gte(CONSTANTS.INT8_MIN).lte(CONSTANTS.INT8_MAX),\n\t\ttinyint2: z.int().gte(0).lte(CONSTANTS.INT8_UNSIGNED_MAX),\n\t\tvarchar1: z.string().max(10),\n\t\tvarchar2: z.enum(['a', 'b', 'c']),\n\t\tvarbinary: z.string(),\n\t\tyear: z.int().gte(1901).lte(2155),\n\t\tlongtext1: z.string().max(CONSTANTS.INT32_UNSIGNED_MAX),\n\t\tlongtext2: z.enum(['a', 'b', 'c']),\n\t\tmediumtext1: z.string().max(CONSTANTS.INT24_UNSIGNED_MAX),\n\t\tmediumtext2: z.enum(['a', 'b', 'c']),\n\t\ttinytext1: z.string().max(CONSTANTS.INT8_UNSIGNED_MAX),\n\t\ttinytext2: z.enum(['a', 'b', 'c']),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('type coercion - all', (t) => {\n\tconst table = mysqlTable('test', ({\n\t\tbigint,\n\t\tboolean,\n\t\ttimestamp,\n\t\tint,\n\t\ttext,\n\t}) => ({\n\t\tbigint: bigint({ mode: 'bigint' }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\ttimestamp: timestamp().notNull(),\n\t\tint: int().notNull(),\n\t\ttext: text().notNull(),\n\t}));\n\n\tconst { createSelectSchema } = createSchemaFactory({\n\t\tcoerce: true,\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tbigint: z.coerce.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX),\n\t\tboolean: z.coerce.boolean(),\n\t\ttimestamp: z.coerce.date(),\n\t\tint: z.coerce.number().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX).int(),\n\t\ttext: z.coerce.string().max(CONSTANTS.INT16_UNSIGNED_MAX),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('type coercion - mixed', (t) => {\n\tconst table = mysqlTable('test', ({\n\t\ttimestamp,\n\t\tint,\n\t}) => ({\n\t\ttimestamp: timestamp().notNull(),\n\t\tint: int().notNull(),\n\t}));\n\n\tconst { createSelectSchema } = createSchemaFactory({\n\t\tcoerce: {\n\t\t\tdate: true,\n\t\t},\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\ttimestamp: z.coerce.date(),\n\t\tint: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: z.ZodType<TopLevelCondition> = z.custom<TopLevelCondition>().superRefine(() => {});\n\tconst table = mysqlTable('test', {\n\t\tjson: json().$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tjson: z.nullable(TopLevelCondition),\n\t});\n\tExpect<Equal<z.infer<typeof result>, z.infer<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = mysqlTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: z.string() });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = mysqlTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: z.string() });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = mysqlTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: z.string() });\n}\n\n/* Disallow unknown keys in view qb - select */ {\n\tconst table = mysqlTable('test', { id: int() });\n\tconst view = mysqlView('test').as((qb) => qb.select().from(table));\n\tconst nestedSelect = mysqlView('test').as((qb) => qb.select({ table }).from(table));\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: z.string() });\n\t// @ts-expect-error\n\tcreateSelectSchema(nestedSelect, { table: { unknown: z.string() } });\n}\n\n/* Disallow unknown keys in view columns - select */ {\n\tconst view = mysqlView('test', { id: int() }).as(sql``);\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: z.string() });\n}\n"
  },
  {
    "path": "drizzle-zod/tests/pg.test.ts",
    "content": "import { type Equal, sql } from 'drizzle-orm';\nimport {\n\tcustomType,\n\tinteger,\n\tjson,\n\tjsonb,\n\tpgEnum,\n\tpgMaterializedView,\n\tpgSchema,\n\tpgTable,\n\tpgView,\n\tserial,\n\ttext,\n} from 'drizzle-orm/pg-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport { test } from 'vitest';\nimport { z } from 'zod/v4';\nimport { jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSchemaFactory, createSelectSchema, createUpdateSchema } from '../src';\nimport { Expect, expectEnumValues, expectSchemaShape } from './utils.ts';\n\nconst integerSchema = z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX);\nconst textSchema = z.string();\n\ntest('table - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: integer().primaryKey(),\n\t\tgenerated: integer().generatedAlwaysAsIdentity(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({ id: integerSchema, generated: integerSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table in schema - select', (tc) => {\n\tconst schema = pgSchema('test');\n\tconst table = schema.table('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: integer().generatedAlwaysAsIdentity().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: integer(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = z.object({ name: textSchema, age: integerSchema.nullable().optional() });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: integer().generatedAlwaysAsIdentity().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: integer(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = z.object({\n\t\tname: textSchema.optional(),\n\t\tage: integerSchema.nullable().optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view qb - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = pgView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = z.object({ id: integerSchema, age: z.any() });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view columns - select', (t) => {\n\tconst view = pgView('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = z.object({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('materialized view qb - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = pgMaterializedView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = z.object({ id: integerSchema, age: z.any() });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('materialized view columns - select', (t) => {\n\tconst view = pgView('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = z.object({ id: integerSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view with nested fields - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\tconst view = pgMaterializedView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tid: table.id,\n\t\t\tnested: {\n\t\t\t\tname: table.name,\n\t\t\t\tage: sql``.as('age'),\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = z.object({\n\t\tid: integerSchema,\n\t\tnested: z.object({ name: textSchema, age: z.any() }),\n\t\ttable: z.object({ id: integerSchema, name: textSchema }),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('enum - select', (t) => {\n\tconst enum_ = pgEnum('test', ['a', 'b', 'c']);\n\n\tconst result = createSelectSchema(enum_);\n\tconst expected = z.enum(['a', 'b', 'c']);\n\texpectEnumValues(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().default(1),\n\t\tc4: integer().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tc1: integerSchema.nullable(),\n\t\tc2: integerSchema,\n\t\tc3: integerSchema.nullable(),\n\t\tc4: integerSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().default(1),\n\t\tc4: integer().notNull().default(1),\n\t\tc5: integer().generatedAlwaysAs(1),\n\t\tc6: integer().generatedAlwaysAsIdentity(),\n\t\tc7: integer().generatedByDefaultAsIdentity(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = z.object({\n\t\tc1: integerSchema.nullable().optional(),\n\t\tc2: integerSchema,\n\t\tc3: integerSchema.nullable().optional(),\n\t\tc4: integerSchema.optional(),\n\t\tc7: integerSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n});\n\ntest('nullability - update', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().default(1),\n\t\tc4: integer().notNull().default(1),\n\t\tc5: integer().generatedAlwaysAs(1),\n\t\tc6: integer().generatedAlwaysAsIdentity(),\n\t\tc7: integer().generatedByDefaultAsIdentity(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = z.object({\n\t\tc1: integerSchema.nullable().optional(),\n\t\tc2: integerSchema.optional(),\n\t\tc3: integerSchema.nullable().optional(),\n\t\tc4: integerSchema.optional(),\n\t\tc7: integerSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\tconst expected = z.object({\n\t\tc1: integerSchema.nullable(),\n\t\tc2: integerSchema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (t) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = z.string().min(1).max(100);\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = z.object({\n\t\tc1: integerSchema.nullable(),\n\t\tc2: integerSchema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t\tc4: integer().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\tconst expected = z.object({\n\t\tc1: integerSchema.nullable().optional(),\n\t\tc2: integerSchema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer().notNull(),\n\t\tc3: integer().notNull(),\n\t\tc4: integer().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\tconst expected = z.object({\n\t\tc1: integerSchema.nullable().optional(),\n\t\tc2: integerSchema.lte(1000).optional(),\n\t\tc3: z.string().transform(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine view - select', (t) => {\n\tconst table = pgTable('test', {\n\t\tc1: integer(),\n\t\tc2: integer(),\n\t\tc3: integer(),\n\t\tc4: integer(),\n\t\tc5: integer(),\n\t\tc6: integer(),\n\t});\n\tconst view = pgView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tc1: table.c1,\n\t\t\tc2: table.c2,\n\t\t\tc3: table.c3,\n\t\t\tnested: {\n\t\t\t\tc4: table.c4,\n\t\t\t\tc5: table.c5,\n\t\t\t\tc6: table.c6,\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t\tnested: {\n\t\t\tc5: (schema) => schema.lte(1000),\n\t\t\tc6: z.string().transform(Number),\n\t\t},\n\t\ttable: {\n\t\t\tc2: (schema) => schema.lte(1000),\n\t\t\tc3: z.string().transform(Number),\n\t\t},\n\t});\n\tconst expected = z.object({\n\t\tc1: integerSchema.nullable(),\n\t\tc2: integerSchema.lte(1000).nullable(),\n\t\tc3: z.string().transform(Number),\n\t\tnested: z.object({\n\t\t\tc4: integerSchema.nullable(),\n\t\t\tc5: integerSchema.lte(1000).nullable(),\n\t\t\tc6: z.string().transform(Number),\n\t\t}),\n\t\ttable: z.object({\n\t\t\tc1: integerSchema.nullable(),\n\t\t\tc2: integerSchema.lte(1000).nullable(),\n\t\t\tc3: z.string().transform(Number),\n\t\t\tc4: integerSchema.nullable(),\n\t\t\tc5: integerSchema.nullable(),\n\t\t\tc6: integerSchema.nullable(),\n\t\t}),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('all data types', (t) => {\n\tconst table = pgTable('test', ({\n\t\tbigint,\n\t\tbigserial,\n\t\tbit,\n\t\tboolean,\n\t\tdate,\n\t\tchar,\n\t\tcidr,\n\t\tdoublePrecision,\n\t\tgeometry,\n\t\thalfvec,\n\t\tinet,\n\t\tinteger,\n\t\tinterval,\n\t\tjson,\n\t\tjsonb,\n\t\tline,\n\t\tmacaddr,\n\t\tmacaddr8,\n\t\tnumeric,\n\t\tpoint,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\tsmallserial,\n\t\ttext,\n\t\tsparsevec,\n\t\ttime,\n\t\ttimestamp,\n\t\tuuid,\n\t\tvarchar,\n\t\tvector,\n\t}) => ({\n\t\tbigint1: bigint({ mode: 'number' }).notNull(),\n\t\tbigint2: bigint({ mode: 'bigint' }).notNull(),\n\t\tbigserial1: bigserial({ mode: 'number' }).notNull(),\n\t\tbigserial2: bigserial({ mode: 'bigint' }).notNull(),\n\t\tbit: bit({ dimensions: 5 }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\tdate1: date({ mode: 'date' }).notNull(),\n\t\tdate2: date({ mode: 'string' }).notNull(),\n\t\tchar1: char({ length: 10 }).notNull(),\n\t\tchar2: char({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tcidr: cidr().notNull(),\n\t\tdoublePrecision: doublePrecision().notNull(),\n\t\tgeometry1: geometry({ type: 'point', mode: 'tuple' }).notNull(),\n\t\tgeometry2: geometry({ type: 'point', mode: 'xy' }).notNull(),\n\t\thalfvec: halfvec({ dimensions: 3 }).notNull(),\n\t\tinet: inet().notNull(),\n\t\tinteger: integer().notNull(),\n\t\tinterval: interval().notNull(),\n\t\tjson: json().notNull(),\n\t\tjsonb: jsonb().notNull(),\n\t\tline1: line({ mode: 'abc' }).notNull(),\n\t\tline2: line({ mode: 'tuple' }).notNull(),\n\t\tmacaddr: macaddr().notNull(),\n\t\tmacaddr8: macaddr8().notNull(),\n\t\tnumeric: numeric().notNull(),\n\t\tpoint1: point({ mode: 'xy' }).notNull(),\n\t\tpoint2: point({ mode: 'tuple' }).notNull(),\n\t\treal: real().notNull(),\n\t\tserial: serial().notNull(),\n\t\tsmallint: smallint().notNull(),\n\t\tsmallserial: smallserial().notNull(),\n\t\ttext1: text().notNull(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\tsparsevec: sparsevec({ dimensions: 3 }).notNull(),\n\t\ttime: time().notNull(),\n\t\ttimestamp1: timestamp({ mode: 'date' }).notNull(),\n\t\ttimestamp2: timestamp({ mode: 'string' }).notNull(),\n\t\tuuid: uuid().notNull(),\n\t\tvarchar1: varchar({ length: 10 }).notNull(),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tvector: vector({ dimensions: 3 }).notNull(),\n\t\tarray1: integer().array().notNull(),\n\t\tarray2: integer().array().array(2).notNull(),\n\t\tarray3: varchar({ length: 10 }).array().array(2).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tbigint1: z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER),\n\t\tbigint2: z.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX),\n\t\tbigserial1: z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER),\n\t\tbigserial2: z.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX),\n\t\tbit: z.string().regex(/^[01]+$/).max(5),\n\t\tboolean: z.boolean(),\n\t\tdate1: z.date(),\n\t\tdate2: z.string(),\n\t\tchar1: z.string().length(10),\n\t\tchar2: z.enum(['a', 'b', 'c']),\n\t\tcidr: z.string(),\n\t\tdoublePrecision: z.number().gte(CONSTANTS.INT48_MIN).lte(CONSTANTS.INT48_MAX),\n\t\tgeometry1: z.tuple([z.number(), z.number()]),\n\t\tgeometry2: z.object({ x: z.number(), y: z.number() }),\n\t\thalfvec: z.array(z.number()).length(3),\n\t\tinet: z.string(),\n\t\tinteger: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX),\n\t\tinterval: z.string(),\n\t\tjson: jsonSchema,\n\t\tjsonb: jsonSchema,\n\t\tline1: z.object({ a: z.number(), b: z.number(), c: z.number() }),\n\t\tline2: z.tuple([z.number(), z.number(), z.number()]),\n\t\tmacaddr: z.string(),\n\t\tmacaddr8: z.string(),\n\t\tnumeric: z.string(),\n\t\tpoint1: z.object({ x: z.number(), y: z.number() }),\n\t\tpoint2: z.tuple([z.number(), z.number()]),\n\t\treal: z.number().gte(CONSTANTS.INT24_MIN).lte(CONSTANTS.INT24_MAX),\n\t\tserial: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX),\n\t\tsmallint: z.int().gte(CONSTANTS.INT16_MIN).lte(CONSTANTS.INT16_MAX),\n\t\tsmallserial: z.int().gte(CONSTANTS.INT16_MIN).lte(CONSTANTS.INT16_MAX),\n\t\ttext1: z.string(),\n\t\ttext2: z.enum(['a', 'b', 'c']),\n\t\tsparsevec: z.string(),\n\t\ttime: z.string(),\n\t\ttimestamp1: z.date(),\n\t\ttimestamp2: z.string(),\n\t\tuuid: z.uuid(),\n\t\tvarchar1: z.string().max(10),\n\t\tvarchar2: z.enum(['a', 'b', 'c']),\n\t\tvector: z.array(z.number()).length(3),\n\t\tarray1: z.array(integerSchema),\n\t\tarray2: z.array(z.array(integerSchema).length(2)),\n\t\tarray3: z.array(z.array(z.string().max(10)).length(2)),\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('type coercion - all', (t) => {\n\tconst table = pgTable('test', ({\n\t\tbigint,\n\t\tboolean,\n\t\ttimestamp,\n\t\tinteger,\n\t\ttext,\n\t}) => ({\n\t\tbigint: bigint({ mode: 'bigint' }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\ttimestamp: timestamp().notNull(),\n\t\tinteger: integer().notNull(),\n\t\ttext: text().notNull(),\n\t}));\n\n\tconst { createSelectSchema } = createSchemaFactory({\n\t\tcoerce: true,\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tbigint: z.coerce.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX),\n\t\tboolean: z.coerce.boolean(),\n\t\ttimestamp: z.coerce.date(),\n\t\tinteger: z.coerce.number().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX).int(),\n\t\ttext: z.coerce.string(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('type coercion - mixed', (t) => {\n\tconst table = pgTable('test', ({\n\t\ttimestamp,\n\t\tinteger,\n\t}) => ({\n\t\ttimestamp: timestamp().notNull(),\n\t\tinteger: integer().notNull(),\n\t}));\n\n\tconst { createSelectSchema } = createSchemaFactory({\n\t\tcoerce: {\n\t\t\tdate: true,\n\t\t},\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\ttimestamp: z.coerce.date(),\n\t\tinteger: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: z.ZodType<TopLevelCondition> = z.custom<TopLevelCondition>().superRefine(() => {});\n\tconst table = pgTable('test', {\n\t\tjson: json().$type<TopLevelCondition>().notNull(),\n\t\tjsonb: jsonb().$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tjson: TopLevelCondition,\n\t\tjsonb: z.nullable(TopLevelCondition),\n\t});\n\tExpect<Equal<z.infer<typeof result>, z.infer<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = pgTable('test', { id: integer() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: z.string() });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = pgTable('test', { id: integer() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: z.string() });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = pgTable('test', { id: integer() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: z.string() });\n}\n\n/* Disallow unknown keys in view qb - select */ {\n\tconst table = pgTable('test', { id: integer() });\n\tconst view = pgView('test').as((qb) => qb.select().from(table));\n\tconst mView = pgMaterializedView('test').as((qb) => qb.select().from(table));\n\tconst nestedSelect = pgView('test').as((qb) => qb.select({ table }).from(table));\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: z.string() });\n\t// @ts-expect-error\n\tcreateSelectSchema(mView, { unknown: z.string() });\n\t// @ts-expect-error\n\tcreateSelectSchema(nestedSelect, { table: { unknown: z.string() } });\n}\n\n/* Disallow unknown keys in view columns - select */ {\n\tconst view = pgView('test', { id: integer() }).as(sql``);\n\tconst mView = pgView('test', { id: integer() }).as(sql``);\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: z.string() });\n\t// @ts-expect-error\n\tcreateSelectSchema(mView, { unknown: z.string() });\n}\n"
  },
  {
    "path": "drizzle-zod/tests/singlestore.test.ts",
    "content": "import type { Equal } from 'drizzle-orm';\nimport { customType, int, json, serial, singlestoreSchema, singlestoreTable, text } from 'drizzle-orm/singlestore-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport { test } from 'vitest';\nimport { z } from 'zod/v4';\nimport { jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSchemaFactory, createSelectSchema, createUpdateSchema } from '../src';\nimport { Expect, expectSchemaShape } from './utils.ts';\n\nconst intSchema = z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX);\nconst serialNumberModeSchema = z.int().gte(0).lte(Number.MAX_SAFE_INTEGER);\nconst textSchema = z.string().max(CONSTANTS.INT16_UNSIGNED_MAX);\n\ntest('table - select', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tgenerated: int().generatedAlwaysAs(1).notNull(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({ id: serialNumberModeSchema, generated: intSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table in schema - select', (tc) => {\n\tconst schema = singlestoreSchema('test');\n\tconst table = schema.table('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({ id: serialNumberModeSchema, name: textSchema });\n\texpectSchemaShape(tc, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = z.object({\n\t\tid: serialNumberModeSchema.optional(),\n\t\tname: textSchema,\n\t\tage: intSchema.nullable().optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tid: serial().primaryKey(),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = z.object({\n\t\tid: serialNumberModeSchema.optional(),\n\t\tname: textSchema.optional(),\n\t\tage: intSchema.nullable().optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n// TODO: SingleStore doesn't support views yet. Add these tests when they're added\n\n// test('view qb - select', (t) => {\n// \tconst table = singlestoreTable('test', {\n// \t\tid: serial().primaryKey(),\n// \t\tname: text().notNull(),\n// \t});\n// \tconst view = mysqlView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n// \tconst result = createSelectSchema(view);\n// \tconst expected = z.object({ id: serialNumberModeSchema, age: z.any() });\n// \texpectSchemaShape(t, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\n// test('view columns - select', (t) => {\n// \tconst view = mysqlView('test', {\n// \t\tid: serial().primaryKey(),\n// \t\tname: text().notNull(),\n// \t}).as(sql``);\n\n// \tconst result = createSelectSchema(view);\n// \tconst expected = z.object({ id: serialNumberModeSchema, name: textSchema });\n// \texpectSchemaShape(t, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\n// test('view with nested fields - select', (t) => {\n// \tconst table = singlestoreTable('test', {\n// \t\tid: serial().primaryKey(),\n// \t\tname: text().notNull(),\n// \t});\n// \tconst view = mysqlView('test').as((qb) =>\n// \t\tqb.select({\n// \t\t\tid: table.id,\n// \t\t\tnested: {\n// \t\t\t\tname: table.name,\n// \t\t\t\tage: sql``.as('age'),\n// \t\t\t},\n// \t\t\ttable,\n// \t\t}).from(table)\n// \t);\n\n// \tconst result = createSelectSchema(view);\n// \tconst expected = z.object({\n// \t\tid: serialNumberModeSchema,\n// \t\tnested: z.object({ name: textSchema, age: z.any() }),\n// \t\ttable: z.object({ id: serialNumberModeSchema, name: textSchema }),\n// \t});\n// \texpectSchemaShape(t, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\ntest('nullability - select', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable(),\n\t\tc2: intSchema,\n\t\tc3: intSchema.nullable(),\n\t\tc4: intSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable().optional(),\n\t\tc2: intSchema,\n\t\tc3: intSchema.nullable().optional(),\n\t\tc4: intSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - update', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable().optional(),\n\t\tc2: intSchema.optional(),\n\t\tc3: intSchema.nullable().optional(),\n\t\tc4: intSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable(),\n\t\tc2: intSchema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (t) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = z.string().min(1).max(100);\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable(),\n\t\tc2: intSchema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable().optional(),\n\t\tc2: intSchema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (t) => {\n\tconst table = singlestoreTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable().optional(),\n\t\tc2: intSchema.lte(1000).optional(),\n\t\tc3: z.string().transform(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n// test('refine view - select', (t) => {\n// \tconst table = singlestoreTable('test', {\n// \t\tc1: int(),\n// \t\tc2: int(),\n// \t\tc3: int(),\n// \t\tc4: int(),\n// \t\tc5: int(),\n// \t\tc6: int(),\n// \t});\n// \tconst view = mysqlView('test').as((qb) =>\n// \t\tqb.select({\n// \t\t\tc1: table.c1,\n// \t\t\tc2: table.c2,\n// \t\t\tc3: table.c3,\n// \t\t\tnested: {\n// \t\t\t\tc4: table.c4,\n// \t\t\t\tc5: table.c5,\n// \t\t\t\tc6: table.c6,\n// \t\t\t},\n// \t\t\ttable,\n// \t\t}).from(table)\n// \t);\n\n// \tconst result = createSelectSchema(view, {\n// \t\tc2: (schema) => schema.lte(1000),\n// \t\tc3: z.string().transform(Number),\n// \t\tnested: {\n// \t\t\tc5: (schema) => schema.lte(1000),\n// \t\t\tc6: z.string().transform(Number),\n// \t\t},\n// \t\ttable: {\n// \t\t\tc2: (schema) => schema.lte(1000),\n// \t\t\tc3: z.string().transform(Number),\n// \t\t},\n// \t});\n// \tconst expected = z.object({\n// \t\tc1: intSchema.nullable(),\n// \t\tc2: intSchema.lte(1000).nullable(),\n// \t\tc3: z.string().transform(Number),\n// \t\tnested: z.object({\n// \t\t\tc4: intSchema.nullable(),\n// \t\t\tc5: intSchema.lte(1000).nullable(),\n// \t\t\tc6: z.string().transform(Number),\n// \t\t}),\n// \t\ttable: z.object({\n// \t\t\tc1: intSchema.nullable(),\n// \t\t\tc2: intSchema.lte(1000).nullable(),\n// \t\t\tc3: z.string().transform(Number),\n// \t\t\tc4: intSchema.nullable(),\n// \t\t\tc5: intSchema.nullable(),\n// \t\t\tc6: intSchema.nullable(),\n// \t\t}),\n// \t});\n// \texpectSchemaShape(t, expected).from(result);\n// \tExpect<Equal<typeof result, typeof expected>>();\n// });\n\ntest('all data types', (t) => {\n\tconst table = singlestoreTable('test', ({\n\t\tbigint,\n\t\tbinary,\n\t\tboolean,\n\t\tchar,\n\t\tdate,\n\t\tdatetime,\n\t\tdecimal,\n\t\tdouble,\n\t\tfloat,\n\t\tint,\n\t\tjson,\n\t\tmediumint,\n\t\tsinglestoreEnum,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\ttext,\n\t\ttime,\n\t\ttimestamp,\n\t\ttinyint,\n\t\tvarchar,\n\t\tvarbinary,\n\t\tyear,\n\t\tlongtext,\n\t\tmediumtext,\n\t\ttinytext,\n\t}) => ({\n\t\tbigint1: bigint({ mode: 'number' }).notNull(),\n\t\tbigint2: bigint({ mode: 'bigint' }).notNull(),\n\t\tbigint3: bigint({ unsigned: true, mode: 'number' }).notNull(),\n\t\tbigint4: bigint({ unsigned: true, mode: 'bigint' }).notNull(),\n\t\tbinary: binary({ length: 10 }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\tchar1: char({ length: 10 }).notNull(),\n\t\tchar2: char({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tdate1: date({ mode: 'date' }).notNull(),\n\t\tdate2: date({ mode: 'string' }).notNull(),\n\t\tdatetime1: datetime({ mode: 'date' }).notNull(),\n\t\tdatetime2: datetime({ mode: 'string' }).notNull(),\n\t\tdecimal1: decimal().notNull(),\n\t\tdecimal2: decimal({ unsigned: true }).notNull(),\n\t\tdouble1: double().notNull(),\n\t\tdouble2: double({ unsigned: true }).notNull(),\n\t\tfloat1: float().notNull(),\n\t\tfloat2: float({ unsigned: true }).notNull(),\n\t\tint1: int().notNull(),\n\t\tint2: int({ unsigned: true }).notNull(),\n\t\tjson: json().notNull(),\n\t\tmediumint1: mediumint().notNull(),\n\t\tmediumint2: mediumint({ unsigned: true }).notNull(),\n\t\tenum: singlestoreEnum('enum', ['a', 'b', 'c']).notNull(),\n\t\treal: real().notNull(),\n\t\tserial: serial().notNull(),\n\t\tsmallint1: smallint().notNull(),\n\t\tsmallint2: smallint({ unsigned: true }).notNull(),\n\t\ttext1: text().notNull(),\n\t\ttext2: text({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttime: time().notNull(),\n\t\ttimestamp1: timestamp({ mode: 'date' }).notNull(),\n\t\ttimestamp2: timestamp({ mode: 'string' }).notNull(),\n\t\ttinyint1: tinyint().notNull(),\n\t\ttinyint2: tinyint({ unsigned: true }).notNull(),\n\t\tvarchar1: varchar({ length: 10 }).notNull(),\n\t\tvarchar2: varchar({ length: 1, enum: ['a', 'b', 'c'] }).notNull(),\n\t\tvarbinary: varbinary({ length: 10 }).notNull(),\n\t\tyear: year().notNull(),\n\t\tlongtext1: longtext().notNull(),\n\t\tlongtext2: longtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\tmediumtext1: mediumtext().notNull(),\n\t\tmediumtext2: mediumtext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttinytext1: tinytext().notNull(),\n\t\ttinytext2: tinytext({ enum: ['a', 'b', 'c'] }).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tbigint1: z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER),\n\t\tbigint2: z.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX),\n\t\tbigint3: z.int().gte(0).lte(Number.MAX_SAFE_INTEGER),\n\t\tbigint4: z.bigint().gte(0n).lte(CONSTANTS.INT64_UNSIGNED_MAX),\n\t\tbinary: z.string(),\n\t\tboolean: z.boolean(),\n\t\tchar1: z.string().length(10),\n\t\tchar2: z.enum(['a', 'b', 'c']),\n\t\tdate1: z.date(),\n\t\tdate2: z.string(),\n\t\tdatetime1: z.date(),\n\t\tdatetime2: z.string(),\n\t\tdecimal1: z.string(),\n\t\tdecimal2: z.string(),\n\t\tdouble1: z.number().gte(CONSTANTS.INT48_MIN).lte(CONSTANTS.INT48_MAX),\n\t\tdouble2: z.number().gte(0).lte(CONSTANTS.INT48_UNSIGNED_MAX),\n\t\tfloat1: z.number().gte(CONSTANTS.INT24_MIN).lte(CONSTANTS.INT24_MAX),\n\t\tfloat2: z.number().gte(0).lte(CONSTANTS.INT24_UNSIGNED_MAX),\n\t\tint1: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX),\n\t\tint2: z.int().gte(0).lte(CONSTANTS.INT32_UNSIGNED_MAX),\n\t\tjson: jsonSchema,\n\t\tmediumint1: z.int().gte(CONSTANTS.INT24_MIN).lte(CONSTANTS.INT24_MAX),\n\t\tmediumint2: z.int().gte(0).lte(CONSTANTS.INT24_UNSIGNED_MAX),\n\t\tenum: z.enum(['a', 'b', 'c']),\n\t\treal: z.number().gte(CONSTANTS.INT48_MIN).lte(CONSTANTS.INT48_MAX),\n\t\tserial: z.int().gte(0).lte(Number.MAX_SAFE_INTEGER),\n\t\tsmallint1: z.int().gte(CONSTANTS.INT16_MIN).lte(CONSTANTS.INT16_MAX),\n\t\tsmallint2: z.int().gte(0).lte(CONSTANTS.INT16_UNSIGNED_MAX),\n\t\ttext1: z.string().max(CONSTANTS.INT16_UNSIGNED_MAX),\n\t\ttext2: z.enum(['a', 'b', 'c']),\n\t\ttime: z.string(),\n\t\ttimestamp1: z.date(),\n\t\ttimestamp2: z.string(),\n\t\ttinyint1: z.int().gte(CONSTANTS.INT8_MIN).lte(CONSTANTS.INT8_MAX),\n\t\ttinyint2: z.int().gte(0).lte(CONSTANTS.INT8_UNSIGNED_MAX),\n\t\tvarchar1: z.string().max(10),\n\t\tvarchar2: z.enum(['a', 'b', 'c']),\n\t\tvarbinary: z.string(),\n\t\tyear: z.int().gte(1901).lte(2155),\n\t\tlongtext1: z.string().max(CONSTANTS.INT32_UNSIGNED_MAX),\n\t\tlongtext2: z.enum(['a', 'b', 'c']),\n\t\tmediumtext1: z.string().max(CONSTANTS.INT24_UNSIGNED_MAX),\n\t\tmediumtext2: z.enum(['a', 'b', 'c']),\n\t\ttinytext1: z.string().max(CONSTANTS.INT8_UNSIGNED_MAX),\n\t\ttinytext2: z.enum(['a', 'b', 'c']),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('type coercion - all', (t) => {\n\tconst table = singlestoreTable('test', ({\n\t\tbigint,\n\t\tboolean,\n\t\ttimestamp,\n\t\tint,\n\t\ttext,\n\t}) => ({\n\t\tbigint: bigint({ mode: 'bigint' }).notNull(),\n\t\tboolean: boolean().notNull(),\n\t\ttimestamp: timestamp().notNull(),\n\t\tint: int().notNull(),\n\t\ttext: text().notNull(),\n\t}));\n\n\tconst { createSelectSchema } = createSchemaFactory({\n\t\tcoerce: true,\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tbigint: z.coerce.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX),\n\t\tboolean: z.coerce.boolean(),\n\t\ttimestamp: z.coerce.date(),\n\t\tint: z.coerce.number().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX).int(),\n\t\ttext: z.coerce.string().max(CONSTANTS.INT16_UNSIGNED_MAX),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('type coercion - mixed', (t) => {\n\tconst table = singlestoreTable('test', ({\n\t\ttimestamp,\n\t\tint,\n\t}) => ({\n\t\ttimestamp: timestamp().notNull(),\n\t\tint: int().notNull(),\n\t}));\n\n\tconst { createSelectSchema } = createSchemaFactory({\n\t\tcoerce: {\n\t\t\tdate: true,\n\t\t},\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\ttimestamp: z.coerce.date(),\n\t\tint: z.int().gte(CONSTANTS.INT32_MIN).lte(CONSTANTS.INT32_MAX),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: z.ZodType<TopLevelCondition> = z.custom<TopLevelCondition>().superRefine(() => {});\n\tconst table = singlestoreTable('test', {\n\t\tjson: json().$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tjson: z.nullable(TopLevelCondition),\n\t});\n\tExpect<Equal<z.infer<typeof result>, z.infer<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = singlestoreTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: z.string() });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = singlestoreTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: z.string() });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = singlestoreTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: z.string() });\n}\n\n// /* Disallow unknown keys in view qb - select */ {\n// \tconst table = singlestoreTable('test', { id: int() });\n// \tconst view = mysqlView('test').as((qb) => qb.select().from(table));\n// \tconst nestedSelect = mysqlView('test').as((qb) => qb.select({ table }).from(table));\n// \t// @ts-expect-error\n// \tcreateSelectSchema(view, { unknown: z.string() });\n// \t// @ts-expect-error\n// \tcreateSelectSchema(nestedSelect, { table: { unknown: z.string() } });\n// }\n\n// /* Disallow unknown keys in view columns - select */ {\n// \tconst view = mysqlView('test', { id: int() }).as(sql``);\n// \t// @ts-expect-error\n// \tcreateSelectSchema(view, { unknown: z.string() });\n// }\n"
  },
  {
    "path": "drizzle-zod/tests/sqlite.test.ts",
    "content": "import { type Equal, sql } from 'drizzle-orm';\nimport { blob, customType, int, sqliteTable, sqliteView, text } from 'drizzle-orm/sqlite-core';\nimport type { TopLevelCondition } from 'json-rules-engine';\nimport { test } from 'vitest';\nimport { z } from 'zod/v4';\nimport { bufferSchema, jsonSchema } from '~/column.ts';\nimport { CONSTANTS } from '~/constants.ts';\nimport { createInsertSchema, createSchemaFactory, createSelectSchema, createUpdateSchema } from '../src';\nimport { Expect, expectSchemaShape } from './utils.ts';\n\nconst intSchema = z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER);\nconst textSchema = z.string();\n\ntest('table - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tgenerated: int().generatedAlwaysAs(1).notNull(),\n\t\tname: text().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({ id: intSchema, generated: intSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - insert', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = z.object({ id: intSchema.optional(), name: textSchema, age: intSchema.nullable().optional() });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('table - update', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t\tage: int(),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = z.object({\n\t\tid: intSchema.optional(),\n\t\tname: textSchema.optional(),\n\t\tage: intSchema.nullable().optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view qb - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t});\n\tconst view = sqliteView('test').as((qb) => qb.select({ id: table.id, age: sql``.as('age') }).from(table));\n\n\tconst result = createSelectSchema(view);\n\tconst expected = z.object({ id: intSchema, age: z.any() });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view columns - select', (t) => {\n\tconst view = sqliteView('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t}).as(sql``);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = z.object({ id: intSchema, name: textSchema });\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('view with nested fields - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tid: int().primaryKey({ autoIncrement: true }),\n\t\tname: text().notNull(),\n\t});\n\tconst view = sqliteView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tid: table.id,\n\t\t\tnested: {\n\t\t\t\tname: table.name,\n\t\t\t\tage: sql``.as('age'),\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view);\n\tconst expected = z.object({\n\t\tid: intSchema,\n\t\tnested: z.object({ name: textSchema, age: z.any() }),\n\t\ttable: z.object({ id: intSchema, name: textSchema }),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t});\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable(),\n\t\tc2: intSchema,\n\t\tc3: intSchema.nullable(),\n\t\tc4: intSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - insert', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table);\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable().optional(),\n\t\tc2: intSchema,\n\t\tc3: intSchema.nullable().optional(),\n\t\tc4: intSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('nullability - update', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().default(1),\n\t\tc4: int().notNull().default(1),\n\t\tc5: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table);\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable().optional(),\n\t\tc2: intSchema.optional(),\n\t\tc3: intSchema.nullable().optional(),\n\t\tc4: intSchema.optional(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t});\n\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable(),\n\t\tc2: intSchema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - select with custom data type', (t) => {\n\tconst customText = customType({ dataType: () => 'text' });\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: customText(),\n\t});\n\n\tconst customTextSchema = z.string().min(1).max(100);\n\tconst result = createSelectSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t\tc4: customTextSchema,\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable(),\n\t\tc2: intSchema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t\tc4: customTextSchema,\n\t});\n\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - insert', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createInsertSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable().optional(),\n\t\tc2: intSchema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine table - update', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int().notNull(),\n\t\tc3: int().notNull(),\n\t\tc4: int().generatedAlwaysAs(1),\n\t});\n\n\tconst result = createUpdateSchema(table, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable().optional(),\n\t\tc2: intSchema.lte(1000).optional(),\n\t\tc3: z.string().transform(Number),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('refine view - select', (t) => {\n\tconst table = sqliteTable('test', {\n\t\tc1: int(),\n\t\tc2: int(),\n\t\tc3: int(),\n\t\tc4: int(),\n\t\tc5: int(),\n\t\tc6: int(),\n\t});\n\tconst view = sqliteView('test').as((qb) =>\n\t\tqb.select({\n\t\t\tc1: table.c1,\n\t\t\tc2: table.c2,\n\t\t\tc3: table.c3,\n\t\t\tnested: {\n\t\t\t\tc4: table.c4,\n\t\t\t\tc5: table.c5,\n\t\t\t\tc6: table.c6,\n\t\t\t},\n\t\t\ttable,\n\t\t}).from(table)\n\t);\n\n\tconst result = createSelectSchema(view, {\n\t\tc2: (schema) => schema.lte(1000),\n\t\tc3: z.string().transform(Number),\n\t\tnested: {\n\t\t\tc5: (schema) => schema.lte(1000),\n\t\t\tc6: z.string().transform(Number),\n\t\t},\n\t\ttable: {\n\t\t\tc2: (schema) => schema.lte(1000),\n\t\t\tc3: z.string().transform(Number),\n\t\t},\n\t});\n\tconst expected = z.object({\n\t\tc1: intSchema.nullable(),\n\t\tc2: intSchema.lte(1000).nullable(),\n\t\tc3: z.string().transform(Number),\n\t\tnested: z.object({\n\t\t\tc4: intSchema.nullable(),\n\t\t\tc5: intSchema.lte(1000).nullable(),\n\t\t\tc6: z.string().transform(Number),\n\t\t}),\n\t\ttable: z.object({\n\t\t\tc1: intSchema.nullable(),\n\t\t\tc2: intSchema.lte(1000).nullable(),\n\t\t\tc3: z.string().transform(Number),\n\t\t\tc4: intSchema.nullable(),\n\t\t\tc5: intSchema.nullable(),\n\t\t\tc6: intSchema.nullable(),\n\t\t}),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('all data types', (t) => {\n\tconst table = sqliteTable('test', ({\n\t\tblob,\n\t\tinteger,\n\t\tnumeric,\n\t\treal,\n\t\ttext,\n\t}) => ({\n\t\tblob1: blob({ mode: 'buffer' }).notNull(),\n\t\tblob2: blob({ mode: 'bigint' }).notNull(),\n\t\tblob3: blob({ mode: 'json' }).notNull(),\n\t\tinteger1: integer({ mode: 'number' }).notNull(),\n\t\tinteger2: integer({ mode: 'boolean' }).notNull(),\n\t\tinteger3: integer({ mode: 'timestamp' }).notNull(),\n\t\tinteger4: integer({ mode: 'timestamp_ms' }).notNull(),\n\t\tnumeric: numeric().notNull(),\n\t\treal: real().notNull(),\n\t\ttext1: text({ mode: 'text' }).notNull(),\n\t\ttext2: text({ mode: 'text', length: 10 }).notNull(),\n\t\ttext3: text({ mode: 'text', enum: ['a', 'b', 'c'] }).notNull(),\n\t\ttext4: text({ mode: 'json' }).notNull(),\n\t}));\n\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tblob1: bufferSchema,\n\t\tblob2: z.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX),\n\t\tblob3: jsonSchema,\n\t\tinteger1: z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER),\n\t\tinteger2: z.boolean(),\n\t\tinteger3: z.date(),\n\t\tinteger4: z.date(),\n\t\tnumeric: z.string(),\n\t\treal: z.number().gte(CONSTANTS.INT48_MIN).lte(CONSTANTS.INT48_MAX),\n\t\ttext1: z.string(),\n\t\ttext2: z.string().max(10),\n\t\ttext3: z.enum(['a', 'b', 'c']),\n\t\ttext4: jsonSchema,\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('type coercion - all', (t) => {\n\tconst table = sqliteTable('test', ({\n\t\tblob,\n\t\tinteger,\n\t\ttext,\n\t}) => ({\n\t\tblob: blob({ mode: 'bigint' }).notNull(),\n\t\tinteger1: integer({ mode: 'boolean' }).notNull(),\n\t\tinteger2: integer({ mode: 'timestamp' }).notNull(),\n\t\tinteger3: integer().notNull(),\n\t\ttext: text().notNull(),\n\t}));\n\n\tconst { createSelectSchema } = createSchemaFactory({\n\t\tcoerce: true,\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tblob: z.coerce.bigint().gte(CONSTANTS.INT64_MIN).lte(CONSTANTS.INT64_MAX),\n\t\tinteger1: z.coerce.boolean(),\n\t\tinteger2: z.coerce.date(),\n\t\tinteger3: z.coerce.number().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER).int(),\n\t\ttext: z.coerce.string(),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\ntest('type coercion - mixed', (t) => {\n\tconst table = sqliteTable('test', ({\n\t\tinteger,\n\t}) => ({\n\t\tinteger1: integer({ mode: 'timestamp' }).notNull(),\n\t\tinteger2: integer().notNull(),\n\t}));\n\n\tconst { createSelectSchema } = createSchemaFactory({\n\t\tcoerce: {\n\t\t\tdate: true,\n\t\t},\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tinteger1: z.coerce.date(),\n\t\tinteger2: z.int().gte(Number.MIN_SAFE_INTEGER).lte(Number.MAX_SAFE_INTEGER),\n\t});\n\texpectSchemaShape(t, expected).from(result);\n\tExpect<Equal<typeof result, typeof expected>>();\n});\n\n/* Infinitely recursive type */ {\n\tconst TopLevelCondition: z.ZodType<TopLevelCondition> = z.custom<TopLevelCondition>().superRefine(() => {});\n\tconst table = sqliteTable('test', {\n\t\tjson1: text({ mode: 'json' }).$type<TopLevelCondition>().notNull(),\n\t\tjson2: blob({ mode: 'json' }).$type<TopLevelCondition>(),\n\t});\n\tconst result = createSelectSchema(table);\n\tconst expected = z.object({\n\t\tjson1: TopLevelCondition,\n\t\tjson2: z.nullable(TopLevelCondition),\n\t});\n\tExpect<Equal<z.infer<typeof result>, z.infer<typeof expected>>>();\n}\n\n/* Disallow unknown keys in table refinement - select */ {\n\tconst table = sqliteTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateSelectSchema(table, { unknown: z.string() });\n}\n\n/* Disallow unknown keys in table refinement - insert */ {\n\tconst table = sqliteTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateInsertSchema(table, { unknown: z.string() });\n}\n\n/* Disallow unknown keys in table refinement - update */ {\n\tconst table = sqliteTable('test', { id: int() });\n\t// @ts-expect-error\n\tcreateUpdateSchema(table, { unknown: z.string() });\n}\n\n/* Disallow unknown keys in view qb - select */ {\n\tconst table = sqliteTable('test', { id: int() });\n\tconst view = sqliteView('test').as((qb) => qb.select().from(table));\n\tconst nestedSelect = sqliteView('test').as((qb) => qb.select({ table }).from(table));\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: z.string() });\n\t// @ts-expect-error\n\tcreateSelectSchema(nestedSelect, { table: { unknown: z.string() } });\n}\n\n/* Disallow unknown keys in view columns - select */ {\n\tconst view = sqliteView('test', { id: int() }).as(sql``);\n\t// @ts-expect-error\n\tcreateSelectSchema(view, { unknown: z.string() });\n}\n"
  },
  {
    "path": "drizzle-zod/tests/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"module\": \"esnext\",\n\t\t\"target\": \"esnext\",\n\t\t\"noEmit\": true,\n\t\t\"rootDir\": \"..\",\n\t\t\"outDir\": \"./.cache\"\n\t},\n\t\"include\": [\".\", \"../src\"]\n}\n"
  },
  {
    "path": "drizzle-zod/tests/utils.ts",
    "content": "import { expect, type TaskContext } from 'vitest';\nimport type { z } from 'zod/v4';\n\nexport function expectSchemaShape<T extends z.ZodObject<z.ZodRawShape>>(t: TaskContext, expected: T) {\n\treturn {\n\t\tfrom(actual: T) {\n\t\t\texpect(Object.keys(actual.shape)).toStrictEqual(Object.keys(expected.shape));\n\t\t\tfor (const key in Object.keys(actual.shape)) {\n\t\t\t\texpect(actual.shape[key]?._zod.def).toStrictEqual(expected.shape[key]?._zod.def);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function expectEnumValues<T extends z.ZodEnum<any>>(t: TaskContext, expected: T) {\n\treturn {\n\t\tfrom(actual: T) {\n\t\t\texpect(actual.def).toStrictEqual(expected.def);\n\t\t},\n\t};\n}\n\nexport function Expect<_ extends true>() {}\n"
  },
  {
    "path": "drizzle-zod/tsconfig.build.json",
    "content": "{\n\t\"extends\": \"./tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"rootDir\": \"src\",\n\t\t\"stripInternal\": true\n\t},\n\t\"include\": [\"src\"]\n}\n"
  },
  {
    "path": "drizzle-zod/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"outDir\": \"dist\",\n\t\t\"baseUrl\": \".\",\n\t\t\"declaration\": true,\n\t\t\"noEmit\": true,\n\t\t\"paths\": {\n\t\t\t\"~/*\": [\"src/*\"]\n\t\t}\n\t},\n\t\"include\": [\"src\", \"*.ts\"]\n}\n"
  },
  {
    "path": "drizzle-zod/vitest.config.ts",
    "content": "import tsconfigPaths from 'vite-tsconfig-paths';\nimport { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n\ttest: {\n\t\tinclude: [\n\t\t\t'tests/**/*.test.ts',\n\t\t],\n\t\texclude: [\n\t\t\t'tests/bun/**/*',\n\t\t],\n\t\ttypecheck: {\n\t\t\ttsconfig: 'tsconfig.json',\n\t\t},\n\t\ttestTimeout: 100000,\n\t\thookTimeout: 100000,\n\t\tisolate: false,\n\t\tpoolOptions: {\n\t\t\tthreads: {\n\t\t\t\tsingleThread: true,\n\t\t\t},\n\t\t},\n\t},\n\tplugins: [tsconfigPaths()],\n});\n"
  },
  {
    "path": "eslint/eslint-plugin-drizzle-internal/index.js",
    "content": "// @ts-nocheck\nconst { ESLintUtils } = require('@typescript-eslint/experimental-utils');\nconst ts = require('typescript');\n\nmodule.exports = {\n\trules: {\n\t\t'require-entity-kind': ESLintUtils.RuleCreator((name) => name)({\n\t\t\tmeta: {\n\t\t\t\ttype: 'problem',\n\t\t\t\tdocs: {\n\t\t\t\t\tdescription: 'Enforce the usage of a static readonly [entityKind] property on Drizzle classes',\n\t\t\t\t\trecommended: 'error',\n\t\t\t\t},\n\t\t\t\tmessages: {\n\t\t\t\t\tmissingEntityKind:\n\t\t\t\t\t\t\"Class '{{name}}' doesn't have a static readonly [entityKind] property defined with a string value.\",\n\t\t\t\t},\n\t\t\t\tschema: [],\n\t\t\t\tfixable: 'code',\n\t\t\t},\n\t\t\tdefaultOptions: [],\n\t\t\tcreate(context) {\n\t\t\t\tconst parserServices = ESLintUtils.getParserServices(context);\n\t\t\t\tconst checker = parserServices.program.getTypeChecker();\n\n\t\t\t\treturn {\n\t\t\t\t\tClassDeclaration(node) {\n\t\t\t\t\t\tconst tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);\n\t\t\t\t\t\tconst className = tsNode.name\n\t\t\t\t\t\t\t? tsNode.name.text\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tts.SyntaxKind.PropertyDeclaration;\n\n\t\t\t\t\t\tfor (const prop of tsNode.members) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tprop.kind\n\t\t\t\t\t\t\t\t\t=== ts.SyntaxKind.PropertyDeclaration\n\t\t\t\t\t\t\t\t&& prop.modifiers?.some(\n\t\t\t\t\t\t\t\t\t(m) => m.kind === ts.SyntaxKind.StaticKeyword,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t&& prop.modifiers?.some(\n\t\t\t\t\t\t\t\t\t(m) =>\n\t\t\t\t\t\t\t\t\t\tm.kind\n\t\t\t\t\t\t\t\t\t\t\t=== ts.SyntaxKind.ReadonlyKeyword,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t&& ts.isComputedPropertyName(prop.name)\n\t\t\t\t\t\t\t\t&& ts.isIdentifier(prop.name.expression)\n\t\t\t\t\t\t\t\t&& prop.name.expression.escapedText\n\t\t\t\t\t\t\t\t\t=== 'entityKind'\n\t\t\t\t\t\t\t\t&& checker\n\t\t\t\t\t\t\t\t\t.getTypeAtLocation(prop.initializer)\n\t\t\t\t\t\t\t\t\t.isStringLiteral()\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontext.report({\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\tmessageId: 'missingEntityKind',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tname: className,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfix(fixer) {\n\t\t\t\t\t\t\t\tconst classBodyOpeningCurlyToken = context\n\t\t\t\t\t\t\t\t\t.getSourceCode()\n\t\t\t\t\t\t\t\t\t.getFirstToken(node.body);\n\t\t\t\t\t\t\t\tconst insertionPoint = classBodyOpeningCurlyToken.range[1];\n\t\t\t\t\t\t\t\treturn fixer.insertTextAfterRange(\n\t\t\t\t\t\t\t\t\t[insertionPoint, insertionPoint],\n\t\t\t\t\t\t\t\t\t`\\n\\tstatic readonly [entityKind]: string = '${className}';\\n`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t}),\n\t},\n};\n"
  },
  {
    "path": "eslint-plugin-drizzle/.gitignore",
    "content": "node_modules\ndist\ntsconfig.tsbuildinfo\n"
  },
  {
    "path": "eslint-plugin-drizzle/package.json",
    "content": "{\n\t\"name\": \"eslint-plugin-drizzle\",\n\t\"version\": \"0.2.3\",\n\t\"description\": \"Eslint plugin for drizzle users to avoid common pitfalls\",\n\t\"main\": \"src/index.js\",\n\t\"scripts\": {\n\t\t\"test\": \"vitest run\",\n\t\t\"build\": \"tsc -b && pnpm cpy readme.md dist/\",\n\t\t\"pack\": \"(cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz\",\n\t\t\"publish\": \"npm publish package.tgz\"\n\t},\n\t\"keywords\": [\n\t\t\"eslint\",\n\t\t\"eslintplugin\",\n\t\t\"eslint-plugin\",\n\t\t\"drizzle\"\n\t],\n\t\"author\": \"Drizzle Team\",\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git+https://github.com/drizzle-team/drizzle-orm/tree/main/eslint-plugin-drizzle.git\"\n\t},\n\t\"license\": \"Apache-2.0\",\n\t\"devDependencies\": {\n\t\t\"@types/node\": \"^20.10.1\",\n\t\t\"@typescript-eslint/parser\": \"^6.10.0\",\n\t\t\"@typescript-eslint/rule-tester\": \"^6.10.0\",\n\t\t\"@typescript-eslint/utils\": \"^6.10.0\",\n\t\t\"cpy-cli\": \"^5.0.0\",\n\t\t\"eslint\": \"^8.53.0\",\n\t\t\"typescript\": \"^5.2.2\",\n\t\t\"vitest\": \"^3.1.3\"\n\t},\n\t\"peerDependencies\": {\n\t\t\"eslint\": \">=8.0.0\"\n\t}\n}\n"
  },
  {
    "path": "eslint-plugin-drizzle/readme.md",
    "content": "# eslint-plugin-drizzle\n\nFor cases where it's impossible to perform type checks for specific scenarios, or where it's possible but error messages would be challenging to understand, we've decided to create an ESLint package with recommended rules. This package aims to assist developers in handling crucial scenarios during development\n\n> Big thanks to @Angelelz for initiating the development of this package and transferring it to the Drizzle Team's npm\n\n## Install\n\n```sh\n[ npm | yarn | pnpm | bun ] install eslint eslint-plugin-drizzle\n```\n\nYou can install those packages for typescript support in your IDE\n\n```sh\n[ npm | yarn | pnpm | bun ] install @typescript-eslint/eslint-plugin @typescript-eslint/parser\n```\n\n## Usage\n\nCreate a `.eslintrc.yml` file, add `drizzle` to the `plugins`, and specify the rules you want to use. You can find a list of all existing rules below\n\n```yml\nroot: true\nparser: '@typescript-eslint/parser'\nparserOptions:\n  project: './tsconfig.json'\nplugins:\n  - drizzle\nrules:\n  'drizzle/enforce-delete-with-where': \"error\"\n  'drizzle/enforce-update-with-where': \"error\"\n```\n\n### All config\n\nThis plugin exports an [`all` config](src/configs/all.js) that makes use of all rules (except for deprecated ones).\n\n```yml\nroot: true\nextends:\n  - \"plugin:drizzle/all\"\nparser: '@typescript-eslint/parser'\nparserOptions:\n  project: './tsconfig.json'\nplugins:\n  - drizzle\n```\n\nAt the moment, `all` is equivalent to `recommended`\n\n```yml\nroot: true\nextends:\n  - \"plugin:drizzle/recommended\"\nparser: '@typescript-eslint/parser'\nparserOptions:\n  project: './tsconfig.json'\nplugins:\n  - drizzle\n```\n\n## Rules\n\n**enforce-delete-with-where**: Enforce using `delete` with the`.where()` clause in the `.delete()` statement. Most of the time, you don't need to delete all rows in the table and require some kind of `WHERE` statements.\n\nOptionally, you can define a `drizzleObjectName` in the plugin options that accept a `string` or `string[]`. This is useful when you have objects or classes with a delete method that's not from Drizzle. Such a `delete` method will trigger the ESLint rule. To avoid that, you can define the name of the Drizzle object that you use in your codebase (like db) so that the rule would only trigger if the delete method comes from this object:\n\nExample, config 1:\n\n```json\n\"rules\": {\n  \"drizzle/enforce-delete-with-where\": [\"error\"]\n}\n```\n\n```ts\nclass MyClass {\n  public delete() {\n    return {}\n  }\n}\n\nconst myClassObj = new MyClass();\n\n// ---> Will be triggered by ESLint Rule\nmyClassObj.delete()\n\nconst db = drizzle(...)\n// ---> Will be triggered by ESLint Rule\ndb.delete()\n```\n\nExample, config 2:\n\n```json\n\"rules\": {\n  \"drizzle/enforce-delete-with-where\": [\"error\", { \"drizzleObjectName\": [\"db\"] }],\n}\n```\n\n```ts\nclass MyClass {\n  public delete() {\n    return {}\n  }\n}\n\nconst myClassObj = new MyClass();\n\n// ---> Will NOT be triggered by ESLint Rule\nmyClassObj.delete()\n\nconst db = drizzle(...)\n// ---> Will be triggered by ESLint Rule\ndb.delete()\n```\n\n**enforce-update-with-where**: Enforce using `update` with the`.where()` clause in the `.update()` statement. Most of the time, you don't need to update all rows in the table and require some kind of `WHERE` statements.\n\nOptionally, you can define a `drizzleObjectName` in the plugin options that accept a `string` or `string[]`. This is useful when you have objects or classes with a delete method that's not from Drizzle. Such as `update` method will trigger the ESLint rule. To avoid that, you can define the name of the Drizzle object that you use in your codebase (like db) so that the rule would only trigger if the delete method comes from this object:\n\nExample, config 1:\n\n```json\n\"rules\": {\n  \"drizzle/enforce-update-with-where\": [\"error\"]\n}\n```\n\n```ts\nclass MyClass {\n  public update() {\n    return {}\n  }\n}\n\nconst myClassObj = new MyClass();\n\n// ---> Will be triggered by ESLint Rule\nmyClassObj.update()\n\nconst db = drizzle(...)\n// ---> Will be triggered by ESLint Rule\ndb.update()\n```\n\nExample, config 2:\n\n```json\n\"rules\": {\n  \"drizzle/enforce-update-with-where\": [\"error\", { \"drizzleObjectName\": [\"db\"] }],\n}\n```\n\n```ts\nclass MyClass {\n  public update() {\n    return {}\n  }\n}\n\nconst myClassObj = new MyClass();\n\n// ---> Will NOT be triggered by ESLint Rule\nmyClassObj.update()\n\nconst db = drizzle(...)\n// ---> Will be triggered by ESLint Rule\ndb.update()\n```\n"
  },
  {
    "path": "eslint-plugin-drizzle/src/configs/all.ts",
    "content": "export default {\n\tenv: {\n\t\tes2024: true,\n\t},\n\tparserOptions: {\n\t\tecmaVersion: 'latest',\n\t\tsourceType: 'module',\n\t},\n\tplugins: ['drizzle'],\n\trules: {\n\t\t'drizzle/enforce-delete-with-where': 'error',\n\t\t'drizzle/enforce-update-with-where': 'error',\n\t},\n};\n"
  },
  {
    "path": "eslint-plugin-drizzle/src/configs/recommended.ts",
    "content": "export default {\n\tenv: {\n\t\tes2024: true,\n\t},\n\tparserOptions: {\n\t\tecmaVersion: 'latest',\n\t\tsourceType: 'module',\n\t},\n\tplugins: ['drizzle'],\n\trules: {\n\t\t'drizzle/enforce-delete-with-where': 'error',\n\t\t'drizzle/enforce-update-with-where': 'error',\n\t},\n};\n"
  },
  {
    "path": "eslint-plugin-drizzle/src/enforce-delete-with-where.ts",
    "content": "import { ESLintUtils } from '@typescript-eslint/utils';\nimport { resolveMemberExpressionPath } from './utils/ast';\nimport { isDrizzleObj, type Options } from './utils/options';\n\nconst createRule = ESLintUtils.RuleCreator(() => 'https://github.com/drizzle-team/eslint-plugin-drizzle');\n\ntype MessageIds = 'enforceDeleteWithWhere';\n\nlet lastNodeName: string = '';\n\nconst deleteRule = createRule<Options, MessageIds>({\n\tdefaultOptions: [{ drizzleObjectName: [] }],\n\tname: 'enforce-delete-with-where',\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Enforce that `delete` method is used with `where` to avoid deleting all the rows in a table.',\n\t\t},\n\t\tfixable: 'code',\n\t\tmessages: {\n\t\t\tenforceDeleteWithWhere:\n\t\t\t\t\"Without `.where(...)` you will delete all the rows in a table. If you didn't want to do it, please use `{{ drizzleObjName }}.delete(...).where(...)` instead. Otherwise you can ignore this rule here\",\n\t\t},\n\t\tschema: [{\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tdrizzleObjectName: {\n\t\t\t\t\ttype: ['string', 'array'],\n\t\t\t\t},\n\t\t\t},\n\t\t\tadditionalProperties: false,\n\t\t}],\n\t},\n\tcreate(context, options) {\n\t\treturn {\n\t\t\tMemberExpression: (node) => {\n\t\t\t\tif (node.property.type === 'Identifier') {\n\t\t\t\t\tif (node.property.name === 'delete' && lastNodeName !== 'where' && isDrizzleObj(node, options)) {\n\t\t\t\t\t\tcontext.report({\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\tmessageId: 'enforceDeleteWithWhere',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tdrizzleObjName: resolveMemberExpressionPath(node),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tlastNodeName = node.property.name;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t},\n\t\t};\n\t},\n});\n\nexport default deleteRule;\n"
  },
  {
    "path": "eslint-plugin-drizzle/src/enforce-update-with-where.ts",
    "content": "import { ESLintUtils } from '@typescript-eslint/utils';\nimport { resolveMemberExpressionPath } from './utils/ast';\nimport { isDrizzleObj, type Options } from './utils/options';\n\nconst createRule = ESLintUtils.RuleCreator(() => 'https://github.com/drizzle-team/eslint-plugin-drizzle');\ntype MessageIds = 'enforceUpdateWithWhere';\n\nlet lastNodeName: string = '';\n\nconst updateRule = createRule<Options, MessageIds>({\n\tdefaultOptions: [{ drizzleObjectName: [] }],\n\tname: 'enforce-update-with-where',\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Enforce that `update` method is used with `where` to avoid deleting all the rows in a table.',\n\t\t},\n\t\tfixable: 'code',\n\t\tmessages: {\n\t\t\tenforceUpdateWithWhere:\n\t\t\t\t\"Without `.where(...)` you will update all the rows in a table. If you didn't want to do it, please use `{{ drizzleObjName }}.update(...).set(...).where(...)` instead. Otherwise you can ignore this rule here\",\n\t\t},\n\t\tschema: [{\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tdrizzleObjectName: {\n\t\t\t\t\ttype: ['string', 'array'],\n\t\t\t\t},\n\t\t\t},\n\t\t\tadditionalProperties: false,\n\t\t}],\n\t},\n\tcreate(context, options) {\n\t\treturn {\n\t\t\tMemberExpression: (node) => {\n\t\t\t\tif (node.property.type === 'Identifier') {\n\t\t\t\t\tif (\n\t\t\t\t\t\tlastNodeName !== 'where'\n\t\t\t\t\t\t&& node.property.name === 'set'\n\t\t\t\t\t\t&& node.object.type === 'CallExpression'\n\t\t\t\t\t\t&& node.object.callee.type === 'MemberExpression'\n\t\t\t\t\t\t&& node.object.callee.property.type === 'Identifier'\n\t\t\t\t\t\t&& node.object.callee.property.name === 'update'\n\t\t\t\t\t\t&& isDrizzleObj(node.object.callee, options)\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontext.report({\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\tmessageId: 'enforceUpdateWithWhere',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tdrizzleObjName: resolveMemberExpressionPath(node.object.callee),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tlastNodeName = node.property.name;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t},\n\t\t};\n\t},\n});\n\nexport default updateRule;\n"
  },
  {
    "path": "eslint-plugin-drizzle/src/index.ts",
    "content": "import type { TSESLint } from '@typescript-eslint/utils';\nimport { name, version } from '../package.json';\nimport all from './configs/all';\nimport recommended from './configs/recommended';\nimport deleteRule from './enforce-delete-with-where';\nimport updateRule from './enforce-update-with-where';\nimport type { Options } from './utils/options';\n\nexport const rules = {\n\t'enforce-delete-with-where': deleteRule,\n\t'enforce-update-with-where': updateRule,\n} satisfies Record<string, TSESLint.RuleModule<string, Options>>;\n\nexport const configs = { all, recommended };\n\nexport const meta = { name, version };\n"
  },
  {
    "path": "eslint-plugin-drizzle/src/utils/ast.ts",
    "content": "import type { TSESTree } from '@typescript-eslint/utils';\n\nexport const resolveMemberExpressionPath = (node: TSESTree.MemberExpression) => {\n\tlet objectExpression = node.object;\n\tlet fullName = '';\n\n\tconst addToFullName = (name: string) => {\n\t\tconst prefix = fullName ? '.' : '';\n\t\tfullName = `${name}${prefix}${fullName}`;\n\t};\n\n\twhile (objectExpression) {\n\t\tif (objectExpression.type === 'MemberExpression') {\n\t\t\tif (objectExpression.property.type === 'Identifier') {\n\t\t\t\taddToFullName(objectExpression.property.name);\n\t\t\t}\n\t\t\tobjectExpression = objectExpression.object;\n\t\t} else if (objectExpression.type === 'CallExpression' && objectExpression.callee.type === 'Identifier') {\n\t\t\taddToFullName(`${objectExpression.callee.name}(...)`);\n\t\t\tbreak;\n\t\t} else if (objectExpression.type === 'CallExpression' && objectExpression.callee.type === 'MemberExpression') {\n\t\t\tif (objectExpression.callee.property.type === 'Identifier') {\n\t\t\t\taddToFullName(`${objectExpression.callee.property.name}(...)`);\n\t\t\t}\n\t\t\tobjectExpression = objectExpression.callee.object;\n\t\t} else if (objectExpression.type === 'Identifier') {\n\t\t\taddToFullName(objectExpression.name);\n\t\t\tbreak;\n\t\t} else if (objectExpression.type === 'ThisExpression') {\n\t\t\taddToFullName('this');\n\t\t\tbreak;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn fullName;\n};\n"
  },
  {
    "path": "eslint-plugin-drizzle/src/utils/options.ts",
    "content": "import type { TSESTree } from '@typescript-eslint/utils';\n\nexport type Options = readonly [{\n\tdrizzleObjectName: string[] | string;\n}];\n\nconst isDrizzleObjName = (name: string, drizzleObjectName: string[] | string) => {\n\tif (typeof drizzleObjectName === 'string') {\n\t\treturn name === drizzleObjectName;\n\t}\n\n\tif (Array.isArray(drizzleObjectName)) {\n\t\tif (drizzleObjectName.length === 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn drizzleObjectName.includes(name);\n\t}\n\n\treturn false;\n};\n\nexport const isDrizzleObj = (\n\tnode: TSESTree.MemberExpression,\n\toptions: Options,\n) => {\n\tconst drizzleObjectName = options[0].drizzleObjectName;\n\n\tif (node.object.type === 'Identifier') {\n\t\treturn isDrizzleObjName(node.object.name, drizzleObjectName);\n\t} else if (node.object.type === 'MemberExpression' && node.object.property.type === 'Identifier') {\n\t\treturn isDrizzleObjName(node.object.property.name, drizzleObjectName);\n\t} else if (node.object.type === 'CallExpression') {\n\t\tif (node.object.callee.type === 'Identifier') {\n\t\t\treturn isDrizzleObjName(node.object.callee.name, drizzleObjectName);\n\t\t} else if (node.object.callee.type === 'MemberExpression' && node.object.callee.property.type === 'Identifier') {\n\t\t\treturn isDrizzleObjName(node.object.callee.property.name, drizzleObjectName);\n\t\t}\n\t}\n\n\treturn false;\n};\n"
  },
  {
    "path": "eslint-plugin-drizzle/tests/delete.test.ts",
    "content": "// @ts-ignore\nimport { RuleTester } from '@typescript-eslint/rule-tester';\n\nimport myRule from '../src/enforce-delete-with-where';\n\nconst parserResolver = require.resolve('@typescript-eslint/parser');\n\nconst ruleTester = new RuleTester({\n\tparser: parserResolver,\n});\n\nruleTester.run('enforce delete with where (default options)', myRule, {\n\tvalid: [\n\t\t'const a = db.delete({}).where({});',\n\t\t'delete db.something',\n\t\t`dataSource\n      .delete()\n      .where()`,\n\t\t`this.database.delete({}).where()`,\n\t],\n\tinvalid: [\n\t\t{\n\t\t\tcode: 'db.delete({})',\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'db' } }],\n\t\t},\n\t\t{\n\t\t\tcode: 'this.dataSource.db.delete({})',\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'this.dataSource.db' } }],\n\t\t},\n\t\t{\n\t\t\tcode: 'const a = await db.delete({})',\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'db' } }],\n\t\t},\n\t\t{\n\t\t\tcode: 'const a = db.delete({})',\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'db' } }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = database\n        .delete({})`,\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'database' } }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase().delete({})`,\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).delete({})`,\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).delete({})`,\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.dataSource.getDatabase(arg1, arg2).delete({})`,\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'this.dataSource.getDatabase(...)' } }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().getDatabase(arg1, arg2).delete({})`,\n\t\t\terrors: [{\n\t\t\t\tmessageId: 'enforceDeleteWithWhere',\n\t\t\t\tdata: { drizzleObjName: 'this.getDataSource(...).getDatabase(...)' },\n\t\t\t}],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().db.delete({})`,\n\t\t\terrors: [{\n\t\t\t\tmessageId: 'enforceDeleteWithWhere',\n\t\t\t\tdata: { drizzleObjName: 'this.getDataSource(...).db' },\n\t\t\t}],\n\t\t},\n\t],\n});\n\nruleTester.run('enforce delete with where (string option)', myRule, {\n\tvalid: [\n\t\t{ code: 'const a = db.delete({}).where({});', options: [{ drizzleObjectName: 'db' }] },\n\t\t{ code: 'const a = this.database.db.delete({}).where({});', options: [{ drizzleObjectName: 'db' }] },\n\t\t{ code: 'const a = something.delete({})', options: [{ drizzleObjectName: 'db' }] },\n\t\t{ code: 'delete db.something', options: [{ drizzleObjectName: 'db' }] },\n\t\t{\n\t\t\tcode: `dataSource\n      .delete()\n      .where()`,\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = database\n        .delete({})`,\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).delete({})`,\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.database.getDatabase().delete({})`,\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().getDatabase(arg1, arg2).delete({})`,\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().db.delete({})`,\n\t\t\toptions: [{ drizzleObjectName: 'getDataSource' }],\n\t\t},\n\t],\n\tinvalid: [\n\t\t{\n\t\t\tcode: 'db.delete({})',\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'db' } }],\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: 'this.database.db.delete({})',\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'this.database.db' } }],\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: 'const a = await db.delete({})',\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'db' } }],\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: 'const a = db.delete({})',\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'db' } }],\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase().delete({})`,\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: 'getDatabase' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).delete({})`,\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: 'getDatabase' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).delete({})`,\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: 'getDatabase' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.dataSource.getDatabase(arg1, arg2).delete({})`,\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'this.dataSource.getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: 'getDatabase' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().getDatabase(arg1, arg2).delete({})`,\n\t\t\terrors: [{\n\t\t\t\tmessageId: 'enforceDeleteWithWhere',\n\t\t\t\tdata: { drizzleObjName: 'this.getDataSource(...).getDatabase(...)' },\n\t\t\t}],\n\t\t\toptions: [{ drizzleObjectName: 'getDatabase' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().db.delete({})`,\n\t\t\terrors: [{\n\t\t\t\tmessageId: 'enforceDeleteWithWhere',\n\t\t\t\tdata: { drizzleObjName: 'this.getDataSource(...).db' },\n\t\t\t}],\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t],\n});\n\nruleTester.run('enforce delete with where (array option)', myRule, {\n\tvalid: [\n\t\t{ code: 'const a = db.delete({}).where({});', options: [{ drizzleObjectName: ['db'] }] },\n\t\t{\n\t\t\tcode: 'const a = this.database.dataSource.delete({}).where({});',\n\t\t\toptions: [{ drizzleObjectName: ['db', 'dataSource'] }],\n\t\t},\n\t\t{ code: 'delete db.something', options: [{ drizzleObjectName: ['db'] }] },\n\t\t{\n\t\t\tcode: `dataSource\n      .delete()\n      .where()`,\n\t\t\toptions: [{ drizzleObjectName: ['db', 'dataSource'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = database\n        .delete({})`,\n\t\t\toptions: [{ drizzleObjectName: ['db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).delete({})`,\n\t\t\toptions: [{ drizzleObjectName: ['db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.database.getDatabase().delete({})`,\n\t\t\toptions: [{ drizzleObjectName: ['db', 'database'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().getDatabase(arg1, arg2).delete({})`,\n\t\t\toptions: [{ drizzleObjectName: ['db', 'getDataSource'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().db.delete({})`,\n\t\t\toptions: [{ drizzleObjectName: ['getDataSource'] }],\n\t\t},\n\t],\n\tinvalid: [\n\t\t{\n\t\t\tcode: 'db.delete({})',\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'db' } }],\n\t\t\toptions: [{ drizzleObjectName: ['db', 'anotherName'] }],\n\t\t},\n\t\t{\n\t\t\tcode: 'this.dataSource.db.delete({})',\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'this.dataSource.db' } }],\n\t\t\toptions: [{ drizzleObjectName: ['db', 'anotherName'] }],\n\t\t},\n\t\t{\n\t\t\tcode: 'dataSource.delete({})',\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'dataSource' } }],\n\t\t\toptions: [{ drizzleObjectName: ['db', 'dataSource'] }],\n\t\t},\n\t\t{\n\t\t\tcode: 'const a = await db.delete({})',\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'db' } }],\n\t\t\toptions: [{ drizzleObjectName: ['db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: 'const a = db.delete({})',\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'db' } }],\n\t\t\toptions: [{ drizzleObjectName: ['db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase().delete({})`,\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: ['getDatabase', 'db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).delete({})`,\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: ['getDatabase', 'db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).delete({})`,\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: ['getDatabase', 'db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.dataSource.getDatabase(arg1, arg2).delete({})`,\n\t\t\terrors: [{ messageId: 'enforceDeleteWithWhere', data: { drizzleObjName: 'this.dataSource.getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: ['getDatabase', 'dataSource'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().getDatabase(arg1, arg2).delete({})`,\n\t\t\terrors: [{\n\t\t\t\tmessageId: 'enforceDeleteWithWhere',\n\t\t\t\tdata: { drizzleObjName: 'this.getDataSource(...).getDatabase(...)' },\n\t\t\t}],\n\t\t\toptions: [{ drizzleObjectName: ['getDatabase'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().db.delete({})`,\n\t\t\terrors: [{\n\t\t\t\tmessageId: 'enforceDeleteWithWhere',\n\t\t\t\tdata: { drizzleObjName: 'this.getDataSource(...).db' },\n\t\t\t}],\n\t\t\toptions: [{ drizzleObjectName: ['db'] }],\n\t\t},\n\t],\n});\n"
  },
  {
    "path": "eslint-plugin-drizzle/tests/update.test.ts",
    "content": "// @ts-ignore\nimport { RuleTester } from '@typescript-eslint/rule-tester';\n\nimport myRule from '../src/enforce-update-with-where';\n\nconst parserResolver = require.resolve('@typescript-eslint/parser');\n\nconst ruleTester = new RuleTester({\n\tparser: parserResolver,\n});\n\nruleTester.run('enforce update with where (default options)', myRule, {\n\tvalid: [\n\t\t'const a = db.update({}).set().where({});',\n\t\t'const a = db.update();',\n\t\t'update()',\n\t\t`db\n      .update()\n      .set()\n      .where()`,\n\t\t`dataSource\n      .update()\n      .set()\n      .where()`,\n\t\t`this\n      .dataSource\n      .update()\n      .set()\n      .where()`,\n\t],\n\tinvalid: [\n\t\t{\n\t\t\tcode: 'db.update({}).set()',\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t},\n\t\t{\n\t\t\tcode: 'this.database.db.update({}).set()',\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t},\n\t\t{\n\t\t\tcode: 'const a = await db.update({}).set()',\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t},\n\t\t{\n\t\t\tcode: 'const a = db.update({}).set',\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = database\n        .update({})\n        .set()`,\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase().update({}).set()`,\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).update({}).set()`,\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).update({}).set()`,\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.dataSource.getDatabase(arg1, arg2).update({}).set()`,\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere', data: { drizzleObjName: 'this.dataSource.getDatabase(...)' } }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().getDatabase(arg1, arg2).update({}).set()`,\n\t\t\terrors: [{\n\t\t\t\tmessageId: 'enforceUpdateWithWhere',\n\t\t\t\tdata: { drizzleObjName: 'this.getDataSource(...).getDatabase(...)' },\n\t\t\t}],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().db.update({}).set()`,\n\t\t\terrors: [{\n\t\t\t\tmessageId: 'enforceUpdateWithWhere',\n\t\t\t\tdata: { drizzleObjName: 'this.getDataSource(...).db' },\n\t\t\t}],\n\t\t},\n\t],\n});\n\nruleTester.run('enforce update with where (string option)', myRule, {\n\tvalid: [\n\t\t{ code: 'const a = db.update({}).set().where({});', options: [{ drizzleObjectName: 'db' }] },\n\t\t{ code: 'const a = this.database.db.update({}).set().where({});', options: [{ drizzleObjectName: 'db' }] },\n\t\t{ code: 'update.db.update()', options: [{ drizzleObjectName: 'db' }] },\n\t\t{\n\t\t\tcode: `dataSource\n      .update()\n      .set()`,\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = database\n        .update({})`,\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).update({}).set()`,\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.database.getDatabase().update({}).set()`,\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().getDatabase(arg1, arg2).update({}).set()`,\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().db.update({}).set()`,\n\t\t\toptions: [{ drizzleObjectName: 'getDataSource' }],\n\t\t},\n\t],\n\tinvalid: [\n\t\t{\n\t\t\tcode: 'db.update({}).set({})',\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: 'this.dataSource.db.update({}).set({})',\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: 'const a = await db.update({}).set()',\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: 'const a = db.update({}).set()',\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase().update({}).set()`,\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: 'getDatabase' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).update({}).set()`,\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: 'getDatabase' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).update({}).set()`,\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: 'getDatabase' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.dataSource.getDatabase(arg1, arg2).update({}).set()`,\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere', data: { drizzleObjName: 'this.dataSource.getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: 'getDatabase' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().getDatabase(arg1, arg2).update({}).set()`,\n\t\t\terrors: [{\n\t\t\t\tmessageId: 'enforceUpdateWithWhere',\n\t\t\t\tdata: { drizzleObjName: 'this.getDataSource(...).getDatabase(...)' },\n\t\t\t}],\n\t\t\toptions: [{ drizzleObjectName: 'getDatabase' }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().db.update({}).set()`,\n\t\t\terrors: [{\n\t\t\t\tmessageId: 'enforceUpdateWithWhere',\n\t\t\t\tdata: { drizzleObjName: 'this.getDataSource(...).db' },\n\t\t\t}],\n\t\t\toptions: [{ drizzleObjectName: 'db' }],\n\t\t},\n\t],\n});\n\nruleTester.run('enforce update with where (array option)', myRule, {\n\tvalid: [\n\t\t{ code: 'const a = db.update({}).set().where({});', options: [{ drizzleObjectName: ['db'] }] },\n\t\t{ code: 'const a = this.dataSource.db.update({}).set().where({});', options: [{ drizzleObjectName: ['db'] }] },\n\t\t{ code: 'update.db.something', options: [{ drizzleObjectName: ['db'] }] },\n\t\t{\n\t\t\tcode: `dataSource\n      .update()\n      .set()\n      .where()`,\n\t\t\toptions: [{ drizzleObjectName: ['db', 'dataSource'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = database\n        .update({})`,\n\t\t\toptions: [{ drizzleObjectName: ['db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).update({}).set()`,\n\t\t\toptions: [{ drizzleObjectName: ['db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.database.getDatabase().update({}).set()`,\n\t\t\toptions: [{ drizzleObjectName: ['db', 'database'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().getDatabase(arg1, arg2).update({}).set()`,\n\t\t\toptions: [{ drizzleObjectName: ['db', 'getDataSource'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().db.update({}).set()`,\n\t\t\toptions: [{ drizzleObjectName: ['getDataSource'] }],\n\t\t},\n\t],\n\tinvalid: [\n\t\t{\n\t\t\tcode: 'db.update({}).set()',\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t\toptions: [{ drizzleObjectName: ['db', 'anotherName'] }],\n\t\t},\n\t\t{\n\t\t\tcode: 'this.dataSource.db.update({}).set()',\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t\toptions: [{ drizzleObjectName: ['db', 'anotherName'] }],\n\t\t},\n\t\t{\n\t\t\tcode: 'dataSource.update({}).set({})',\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t\toptions: [{ drizzleObjectName: ['db', 'dataSource'] }],\n\t\t},\n\t\t{\n\t\t\tcode: 'const a = await db.update({}).set()',\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t\toptions: [{ drizzleObjectName: ['db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: 'const a = db.update({}).set()',\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere' }],\n\t\t\toptions: [{ drizzleObjectName: ['db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase().update({}).set()`,\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: ['getDatabase', 'db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).update({}).set()`,\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: ['getDatabase', 'db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = getDatabase(arg1, arg2).update({}).set()`,\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere', data: { drizzleObjName: 'getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: ['getDatabase', 'db'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.dataSource.getDatabase(arg1, arg2).update({}).set()`,\n\t\t\terrors: [{ messageId: 'enforceUpdateWithWhere', data: { drizzleObjName: 'this.dataSource.getDatabase(...)' } }],\n\t\t\toptions: [{ drizzleObjectName: ['getDatabase', 'dataSource'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().getDatabase(arg1, arg2).update({}).set()`,\n\t\t\terrors: [{\n\t\t\t\tmessageId: 'enforceUpdateWithWhere',\n\t\t\t\tdata: { drizzleObjName: 'this.getDataSource(...).getDatabase(...)' },\n\t\t\t}],\n\t\t\toptions: [{ drizzleObjectName: ['getDatabase'] }],\n\t\t},\n\t\t{\n\t\t\tcode: `const a = this.getDataSource().db.update({}).set()`,\n\t\t\terrors: [{\n\t\t\t\tmessageId: 'enforceUpdateWithWhere',\n\t\t\t\tdata: { drizzleObjName: 'this.getDataSource(...).db' },\n\t\t\t}],\n\t\t\toptions: [{ drizzleObjectName: ['db'] }],\n\t\t},\n\t],\n});\n"
  },
  {
    "path": "eslint-plugin-drizzle/tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t\"strict\": true,\n\t\t\"noUnusedLocals\": true,\n\t\t\"noUnusedParameters\": true,\n\t\t\"noImplicitReturns\": true,\n\t\t\"noFallthroughCasesInSwitch\": true,\n\t\t\"moduleResolution\": \"nodenext\",\n\t\t\"esModuleInterop\": true,\n\t\t\"forceConsistentCasingInFileNames\": true,\n\t\t\"allowJs\": true,\n\t\t\"resolveJsonModule\": true,\n\t\t\"lib\": [\n\t\t\t\"esnext\"\n\t\t],\n\t\t\"composite\": false,\n\t\t\"incremental\": false,\n\t\t\"skipLibCheck\": true,\n\t\t\"outDir\": \"dist\",\n\t\t\"module\": \"nodenext\",\n\t\t\"target\": \"es6\",\n\t\t\"exactOptionalPropertyTypes\": true,\n\t\t\"noUncheckedIndexedAccess\": true\n\t},\n\t\"include\": [\n\t\t\"src/**/*.ts\",\n\t\t\"package.json\"\n\t]\n}\n"
  },
  {
    "path": "eslint-plugin-drizzle/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n\ttest: {\n\t\tglobals: true,\n\t\texclude: ['**/dist/**'],\n\t},\n});\n"
  },
  {
    "path": "integration-tests/.gitignore",
    "content": ".env\n*.db\ntrace\ntests/imports/imports.cjs\ntests/imports/imports.mjs\n.sst\n"
  },
  {
    "path": "integration-tests/.xata/migrations/.ledger",
    "content": "\n"
  },
  {
    "path": "integration-tests/.xata/version/compatibility.json",
    "content": "{\n\t\"@xata.io/cli\": { \"latest\": \"0.15.10\", \"compatibility\": [{ \"range\": \">=0.0.0\" }] },\n\t\"@xata.io/client\": { \"latest\": \"0.29.3\", \"compatibility\": [{ \"range\": \">=0.0.0\" }] }\n}\n"
  },
  {
    "path": "integration-tests/.xatarc",
    "content": "{\n  \"databaseURL\": \"https://Andrii-Sherman-s-workspace-2r5ujp.us-east-1.xata.sh/db/integration-tests\",\n  \"codegen\": {\n    \"output\": \"tests/xata/xata.ts\"\n  }\n}"
  },
  {
    "path": "integration-tests/docker-neon.yml",
    "content": "services:\n  postgres:\n      image: 'postgres:latest'\n      environment:\n        POSTGRES_USER: postgres\n        POSTGRES_PASSWORD: postgres\n        POSTGRES_DB: postgres\n      ports:\n      - '5432:5441'\n      healthcheck:\n        test: ['CMD-SHELL', 'pg_isready -U postgres']\n        interval: 10s\n        timeout: 5s\n        retries: 5\n  neon-proxy:\n    image: ghcr.io/timowilhelm/local-neon-http-proxy:main\n    environment:\n      - PG_CONNECTION_STRING=postgres://postgres:postgres@postgres:5432/postgres\n    ports:\n      - '4444:4444'\n    depends_on:\n      postgres:\n        condition: service_healthy\n  pg_proxy:\n      image: ghcr.io/neondatabase/wsproxy:latest\n      environment:\n        APPEND_PORT: 'postgres:5432'\n        ALLOW_ADDR_REGEX: '.*'\n        LOG_TRAFFIC: 'true'\n      ports:\n      - '5446:80'\n      depends_on:\n      - postgres\n"
  },
  {
    "path": "integration-tests/drizzle2/mysql/0000_nostalgic_carnage.sql",
    "content": "CREATE TABLE `cities_migration` (\n\t`id` int,\n\t`fullname_name` text,\n\t`state` text\n);\n--> statement-breakpoint\nCREATE TABLE `users_migration` (\n\t`id` int PRIMARY KEY NOT NULL,\n\t`full_name` text,\n\t`phone` int,\n\t`invited_by` int,\n\t`city_id` int,\n\t`date` timestamp DEFAULT (now())\n);\n--> statement-breakpoint\nCREATE TABLE `users12` (\n\t`id` serial AUTO_INCREMENT PRIMARY KEY NOT NULL,\n\t`name` text NOT NULL,\n\t`email` text NOT NULL\n);"
  },
  {
    "path": "integration-tests/drizzle2/mysql/meta/0000_snapshot.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"mysql\",\n  \"id\": \"8e8c8378-0496-40f6-88e3-98aab8282b1f\",\n  \"prevId\": \"00000000-0000-0000-0000-000000000000\",\n  \"tables\": {\n    \"cities_migration\": {\n      \"name\": \"cities_migration\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"int\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"fullname_name\": {\n          \"name\": \"fullname_name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"state\": {\n          \"name\": \"state\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    },\n    \"users_migration\": {\n      \"name\": \"users_migration\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"int\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"full_name\": {\n          \"name\": \"full_name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"phone\": {\n          \"name\": \"phone\",\n          \"type\": \"int\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"invited_by\": {\n          \"name\": \"invited_by\",\n          \"type\": \"int\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"city_id\": {\n          \"name\": \"city_id\",\n          \"type\": \"int\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"date\": {\n          \"name\": \"date\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false,\n          \"default\": \"(now())\"\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    },\n    \"users12\": {\n      \"name\": \"users12\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"serial\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": true\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {\n        \"my_unique_index\": {\n          \"name\": \"my_unique_index\",\n          \"columns\": [\n            \"name\"\n          ],\n          \"isUnique\": true,\n          \"using\": \"btree\"\n        }\n      },\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    }\n  },\n  \"schemas\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  }\n}"
  },
  {
    "path": "integration-tests/drizzle2/mysql/meta/_journal.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"mysql\",\n  \"entries\": [\n    {\n      \"idx\": 0,\n      \"version\": \"5\",\n      \"when\": 1680270921944,\n      \"tag\": \"0000_nostalgic_carnage\",\n      \"breakpoints\": true\n    }\n  ]\n}"
  },
  {
    "path": "integration-tests/drizzle2/mysql-proxy/first/0000_nostalgic_carnage.sql",
    "content": "CREATE TABLE `userstest` (\n\t`id` serial PRIMARY KEY,\n\t`name` text NOT NULL,\n\t`verified` boolean NOT NULL DEFAULT false, \n\t`jsonb` json,\n\t`created_at` timestamp NOT NULL DEFAULT now()\n);"
  },
  {
    "path": "integration-tests/drizzle2/mysql-proxy/first/meta/0000_snapshot.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"mysql\",\n  \"id\": \"8e8c8378-0496-40f6-88e3-98aab8282b1f\",\n  \"prevId\": \"00000000-0000-0000-0000-000000000000\",\n  \"tables\": {\n    \"userstest\": {\n      \"name\": \"userstest\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"serial\",\n          \"primaryKey\": true,\n          \"notNull\": false,\n          \"autoincrement\": true\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"verified\": {\n          \"name\": \"verified\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false,\n          \"autoincrement\": false\n        },\n        \"jsonb\": {\n          \"name\": \"jsonb\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"created_at\": {\n          \"name\": \"created_at\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"now()\",\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    }\n  },\n  \"schemas\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  }\n}\n"
  },
  {
    "path": "integration-tests/drizzle2/mysql-proxy/first/meta/_journal.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"mysql\",\n  \"entries\": [\n    {\n      \"idx\": 0,\n      \"version\": \"5\",\n      \"when\": 1680270921944,\n      \"tag\": \"0000_nostalgic_carnage\",\n      \"breakpoints\": true\n    }\n  ]\n}"
  },
  {
    "path": "integration-tests/drizzle2/mysql-proxy/second/0000_nostalgic_carnage.sql",
    "content": "CREATE TABLE `userstest` (\n\t`id` serial PRIMARY KEY,\n\t`name` text NOT NULL,\n\t`verified` boolean NOT NULL DEFAULT false, \n\t`jsonb` json,\n\t`created_at` timestamp NOT NULL DEFAULT now()\n);"
  },
  {
    "path": "integration-tests/drizzle2/mysql-proxy/second/0001_test.sql",
    "content": "CREATE TABLE `users12` (\n\t`id` serial AUTO_INCREMENT PRIMARY KEY NOT NULL,\n\t`name` text NOT NULL,\n\t`email` text NOT NULL\n);"
  },
  {
    "path": "integration-tests/drizzle2/mysql-proxy/second/meta/0000_snapshot.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"mysql\",\n  \"id\": \"8e8c8378-0496-40f6-88e3-98aab8282b1f\",\n  \"prevId\": \"00000000-0000-0000-0000-000000000000\",\n  \"tables\": {\n    \"userstest\": {\n      \"name\": \"userstest\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"serial\",\n          \"primaryKey\": true,\n          \"notNull\": false,\n          \"autoincrement\": true\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"verified\": {\n          \"name\": \"verified\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false,\n          \"autoincrement\": false\n        },\n        \"jsonb\": {\n          \"name\": \"jsonb\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"created_at\": {\n          \"name\": \"created_at\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"now()\",\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    }\n  },\n  \"schemas\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  }\n}\n"
  },
  {
    "path": "integration-tests/drizzle2/mysql-proxy/second/meta/0001_snapshot.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"mysql\",\n  \"id\": \"47362df0-c353-4bd1-8107-fcc36f0e61bd\",\n  \"prevId\": \"8e8c8378-0496-40f6-88e3-98aab8282b1f\",\n  \"tables\": {\n    \"userstest\": {\n      \"name\": \"userstest\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"serial\",\n          \"primaryKey\": true,\n          \"notNull\": false,\n          \"autoincrement\": true\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"verified\": {\n          \"name\": \"verified\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false,\n          \"autoincrement\": false\n        },\n        \"jsonb\": {\n          \"name\": \"jsonb\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"created_at\": {\n          \"name\": \"created_at\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"now()\",\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    },\n    \"users12\": {\n      \"name\": \"users12\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"serial\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": true\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {\n        \"my_unique_index\": {\n          \"name\": \"my_unique_index\",\n          \"columns\": [\"name\"],\n          \"isUnique\": true,\n          \"using\": \"btree\"\n        }\n      },\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    }\n  },\n  \"schemas\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  }\n}\n"
  },
  {
    "path": "integration-tests/drizzle2/mysql-proxy/second/meta/_journal.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"mysql\",\n  \"entries\": [\n    {\n      \"idx\": 0,\n      \"version\": \"5\",\n      \"when\": 1680270921944,\n      \"tag\": \"0000_nostalgic_carnage\",\n      \"breakpoints\": true\n    },\n    {\n      \"idx\": 1,\n      \"version\": \"5\",\n      \"when\": 1680270921945,\n      \"tag\": \"0001_test\",\n      \"breakpoints\": true\n    }\n  ]\n}"
  },
  {
    "path": "integration-tests/drizzle2/pg/0000_puzzling_flatman.sql",
    "content": "CREATE TABLE IF NOT EXISTS \"all_columns\" (\n\t\"smallint\" smallint,\n\t\"smallint_def\" smallint DEFAULT 10,\n\t\"integer\" integer,\n\t\"integer_def\" integer DEFAULT 10,\n\t\"numeric\" numeric,\n\t\"numeric3\" numeric,\n\t\"numeric4\" numeric(7, 7),\n\t\"numeridef\" numeric DEFAULT '100',\n\t\"bigint\" bigint,\n\t\"bigintdef\" bigint DEFAULT 100,\n\t\"boolean\" boolean,\n\t\"boolean_def\" boolean DEFAULT true,\n\t\"text\" text,\n\t\"textdef\" text DEFAULT 'text',\n\t\"varchar\" varchar,\n\t\"varchardef\" varchar DEFAULT 'text',\n\t\"serial\" serial NOT NULL,\n\t\"bigserial\" bigserial NOT NULL,\n\t\"decimal\" numeric(100, 2),\n\t\"decimaldef\" numeric(100, 2) DEFAULT '100.0',\n\t\"doublePrecision\" double precision,\n\t\"doublePrecisiondef\" double precision DEFAULT 100,\n\t\"real\" real,\n\t\"realdef\" real DEFAULT 100,\n\t\"time2\" time(6) with time zone,\n\t\"timedefnow\" time DEFAULT now(),\n\t\"timestamp\" timestamp,\n\t\"timestamp2\" timestamp (6) with time zone,\n\t\"timestamp3\" timestamp with time zone,\n\t\"timestamp4\" timestamp (4),\n\t\"timestampdef\" timestamp DEFAULT now(),\n\t\"date\" date,\n\t\"datedef\" date DEFAULT now(),\n\t\"interval\" interval,\n\t\"intervaldef\" interval DEFAULT '10 days'\n);"
  },
  {
    "path": "integration-tests/drizzle2/pg/0001_test.sql",
    "content": "CREATE TABLE IF NOT EXISTS \"users12\" (\n\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\"name\" text NOT NULL,\n\t\"email\" text NOT NULL\n);"
  },
  {
    "path": "integration-tests/drizzle2/pg/meta/0000_snapshot.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"pg\",\n  \"id\": \"cb1644bb-c5da-465a-8d70-f63d81e34514\",\n  \"prevId\": \"00000000-0000-0000-0000-000000000000\",\n  \"tables\": {\n    \"all_columns\": {\n      \"name\": \"all_columns\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"smallint\": {\n          \"name\": \"smallint\",\n          \"type\": \"smallint\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"smallint_def\": {\n          \"name\": \"smallint_def\",\n          \"type\": \"smallint\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": 10\n        },\n        \"integer\": {\n          \"name\": \"integer\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"integer_def\": {\n          \"name\": \"integer_def\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": 10\n        },\n        \"numeric\": {\n          \"name\": \"numeric\",\n          \"type\": \"numeric\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"numeric3\": {\n          \"name\": \"numeric3\",\n          \"type\": \"numeric\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"numeric4\": {\n          \"name\": \"numeric4\",\n          \"type\": \"numeric(7, 7)\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"numeridef\": {\n          \"name\": \"numeridef\",\n          \"type\": \"numeric\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": \"'100'\"\n        },\n        \"bigint\": {\n          \"name\": \"bigint\",\n          \"type\": \"bigint\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"bigintdef\": {\n          \"name\": \"bigintdef\",\n          \"type\": \"bigint\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": 100\n        },\n        \"boolean\": {\n          \"name\": \"boolean\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"boolean_def\": {\n          \"name\": \"boolean_def\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": true\n        },\n        \"text\": {\n          \"name\": \"text\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"textdef\": {\n          \"name\": \"textdef\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": \"'text'\"\n        },\n        \"varchar\": {\n          \"name\": \"varchar\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"varchardef\": {\n          \"name\": \"varchardef\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": \"'text'\"\n        },\n        \"serial\": {\n          \"name\": \"serial\",\n          \"type\": \"serial\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"bigserial\": {\n          \"name\": \"bigserial\",\n          \"type\": \"bigserial\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"decimal\": {\n          \"name\": \"decimal\",\n          \"type\": \"numeric(100, 2)\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"decimaldef\": {\n          \"name\": \"decimaldef\",\n          \"type\": \"numeric(100, 2)\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": \"'100.0'\"\n        },\n        \"doublePrecision\": {\n          \"name\": \"doublePrecision\",\n          \"type\": \"double precision\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"doublePrecisiondef\": {\n          \"name\": \"doublePrecisiondef\",\n          \"type\": \"double precision\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": 100\n        },\n        \"real\": {\n          \"name\": \"real\",\n          \"type\": \"real\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"realdef\": {\n          \"name\": \"realdef\",\n          \"type\": \"real\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": 100\n        },\n        \"time2\": {\n          \"name\": \"time2\",\n          \"type\": \"time(6) with time zone\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"timedefnow\": {\n          \"name\": \"timedefnow\",\n          \"type\": \"time\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": \"now()\"\n        },\n        \"timestamp\": {\n          \"name\": \"timestamp\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"timestamp2\": {\n          \"name\": \"timestamp2\",\n          \"type\": \"timestamp (6) with time zone\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"timestamp3\": {\n          \"name\": \"timestamp3\",\n          \"type\": \"timestamp with time zone\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"timestamp4\": {\n          \"name\": \"timestamp4\",\n          \"type\": \"timestamp (4)\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"timestampdef\": {\n          \"name\": \"timestampdef\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": \"now()\"\n        },\n        \"date\": {\n          \"name\": \"date\",\n          \"type\": \"date\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"datedef\": {\n          \"name\": \"datedef\",\n          \"type\": \"date\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": \"now()\"\n        },\n        \"interval\": {\n          \"name\": \"interval\",\n          \"type\": \"interval\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"intervaldef\": {\n          \"name\": \"intervaldef\",\n          \"type\": \"interval\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"default\": \"'10 days'\"\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    },\n    \"users12\": {\n      \"name\": \"users12\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"serial\",\n          \"primaryKey\": true,\n          \"notNull\": true\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    }\n  },\n  \"enums\": {},\n  \"schemas\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  }\n}"
  },
  {
    "path": "integration-tests/drizzle2/pg/meta/_journal.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"pg\",\n  \"entries\": [\n    {\n      \"idx\": 0,\n      \"version\": \"5\",\n      \"when\": 1680271923328,\n      \"tag\": \"0000_puzzling_flatman\",\n      \"breakpoints\": true\n    },\n    {\n      \"idx\": 1,\n      \"version\": \"5\",\n      \"when\": 1680271923329,\n      \"tag\": \"0001_test\",\n      \"breakpoints\": true\n    }\n  ]\n}"
  },
  {
    "path": "integration-tests/drizzle2/pg-proxy/first/0000_puzzling_flatman.sql",
    "content": "CREATE TABLE \"users\" (\n\tid serial PRIMARY KEY,\n\tname text NOT NULL,\n\tverified boolean NOT NULL DEFAULT false, \n\tjsonb jsonb,\n\tcreated_at timestamptz NOT NULL DEFAULT now()\n);"
  },
  {
    "path": "integration-tests/drizzle2/pg-proxy/first/meta/0000_snapshot.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"pg\",\n  \"id\": \"cb1644bb-c5da-465a-8d70-f63d81e34514\",\n  \"prevId\": \"00000000-0000-0000-0000-000000000000\",\n  \"tables\": {\n    \"users\": {\n      \"name\": \"users\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"serial\",\n          \"primaryKey\": true,\n          \"notNull\": false\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"verified\": {\n          \"name\": \"verified\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false\n        },\n        \"jsonb\": {\n          \"name\": \"jsonb\",\n          \"type\": \"jsonb\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"created_at\": {\n          \"name\": \"created_at\",\n          \"type\": \"timestamptz\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"now()\"\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    }\n  },\n  \"enums\": {},\n  \"schemas\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  }\n}\n"
  },
  {
    "path": "integration-tests/drizzle2/pg-proxy/first/meta/_journal.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"pg\",\n  \"entries\": [\n    {\n      \"idx\": 0,\n      \"version\": \"5\",\n      \"when\": 1680271923328,\n      \"tag\": \"0000_puzzling_flatman\",\n      \"breakpoints\": true\n    }\n  ]\n}"
  },
  {
    "path": "integration-tests/drizzle2/pg-proxy/second/0000_puzzling_flatman.sql",
    "content": "CREATE TABLE \"users\" (\n\tid serial PRIMARY KEY,\n\tname text NOT NULL,\n\tverified boolean NOT NULL DEFAULT false, \n\tjsonb jsonb,\n\tcreated_at timestamptz NOT NULL DEFAULT now()\n);"
  },
  {
    "path": "integration-tests/drizzle2/pg-proxy/second/0001_test.sql",
    "content": "CREATE TABLE \"users12\" (\n\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\"name\" text NOT NULL,\n\t\"email\" text NOT NULL\n);"
  },
  {
    "path": "integration-tests/drizzle2/pg-proxy/second/meta/0000_snapshot.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"pg\",\n  \"id\": \"cb1644bb-c5da-465a-8d70-f63d81e34514\",\n  \"prevId\": \"00000000-0000-0000-0000-000000000000\",\n  \"tables\": {\n    \"users\": {\n      \"name\": \"users\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"serial\",\n          \"primaryKey\": true,\n          \"notNull\": false\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"verified\": {\n          \"name\": \"verified\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false\n        },\n        \"jsonb\": {\n          \"name\": \"jsonb\",\n          \"type\": \"jsonb\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"created_at\": {\n          \"name\": \"created_at\",\n          \"type\": \"timestamptz\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"now()\"\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    }\n  },\n  \"enums\": {},\n  \"schemas\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  }\n}\n"
  },
  {
    "path": "integration-tests/drizzle2/pg-proxy/second/meta/0001_snapshot.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"pg\",\n  \"id\": \"f2a88b25-f2da-4973-879e-60b57f24e7b9\",\n  \"prevId\": \"cb1644bb-c5da-465a-8d70-f63d81e34514\",\n  \"tables\": {\n    \"users\": {\n      \"name\": \"users\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"serial\",\n          \"primaryKey\": true,\n          \"notNull\": false\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"verified\": {\n          \"name\": \"verified\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false\n        },\n        \"jsonb\": {\n          \"name\": \"jsonb\",\n          \"type\": \"jsonb\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"created_at\": {\n          \"name\": \"created_at\",\n          \"type\": \"timestamptz\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"now()\"\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    }\n  },\n  \"enums\": {},\n  \"schemas\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  }\n}\n"
  },
  {
    "path": "integration-tests/drizzle2/pg-proxy/second/meta/_journal.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"pg\",\n  \"entries\": [\n    {\n      \"idx\": 0,\n      \"version\": \"5\",\n      \"when\": 1680271923328,\n      \"tag\": \"0000_puzzling_flatman\",\n      \"breakpoints\": true\n    },\n    {\n      \"idx\": 1,\n      \"version\": \"5\",\n      \"when\": 1680271923329,\n      \"tag\": \"0001_test\",\n      \"breakpoints\": true\n    }\n  ]\n}"
  },
  {
    "path": "integration-tests/drizzle2/planetscale/0000_nostalgic_carnage.sql",
    "content": "CREATE TABLE `drizzle_tests_cities_migration` (\n\t`id` int,\n\t`fullname_name` text,\n\t`state` text\n);\n--> statement-breakpoint\nCREATE TABLE `drizzle_tests_users_migration` (\n\t`id` int PRIMARY KEY NOT NULL,\n\t`full_name` text,\n\t`phone` int,\n\t`invited_by` int,\n\t`city_id` int,\n\t`date` timestamp DEFAULT (now())\n);\n--> statement-breakpoint\nCREATE TABLE `drizzle_tests_users12` (\n\t`id` serial AUTO_INCREMENT PRIMARY KEY NOT NULL,\n\t`name` text NOT NULL,\n\t`email` text NOT NULL\n);\n"
  },
  {
    "path": "integration-tests/drizzle2/planetscale/meta/0000_snapshot.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"mysql\",\n  \"id\": \"8e8c8378-0496-40f6-88e3-98aab8282b1f\",\n  \"prevId\": \"00000000-0000-0000-0000-000000000000\",\n  \"tables\": {\n    \"drizzle_tests_cities_migration\": {\n      \"name\": \"drizzle_tests_cities_migration\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"int\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"fullname_name\": {\n          \"name\": \"fullname_name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"state\": {\n          \"name\": \"state\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    },\n    \"drizzle_tests_users_migration\": {\n      \"name\": \"drizzle_tests_users_migration\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"int\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"full_name\": {\n          \"name\": \"full_name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"phone\": {\n          \"name\": \"phone\",\n          \"type\": \"int\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"invited_by\": {\n          \"name\": \"invited_by\",\n          \"type\": \"int\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"city_id\": {\n          \"name\": \"city_id\",\n          \"type\": \"int\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"date\": {\n          \"name\": \"date\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false,\n          \"default\": \"(now())\"\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    },\n    \"drizzle_tests_users12\": {\n      \"name\": \"drizzle_tests_users12\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"serial\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": true\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {\n        \"my_unique_index\": {\n          \"name\": \"my_unique_index\",\n          \"columns\": [\n            \"name\"\n          ],\n          \"isUnique\": true,\n          \"using\": \"btree\"\n        }\n      },\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    }\n  },\n  \"schemas\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  }\n}\n"
  },
  {
    "path": "integration-tests/drizzle2/planetscale/meta/_journal.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"mysql\",\n  \"entries\": [\n    {\n      \"idx\": 0,\n      \"version\": \"5\",\n      \"when\": 1680270921944,\n      \"tag\": \"0000_nostalgic_carnage\",\n      \"breakpoints\": true\n    }\n  ]\n}"
  },
  {
    "path": "integration-tests/drizzle2/singlestore/0000_nostalgic_carnage.sql",
    "content": "CREATE TABLE `cities_migration` (\n\t`id` int,\n\t`fullname_name` text,\n\t`state` text\n);\n--> statement-breakpoint\nCREATE TABLE `users_migration` (\n\t`id` int PRIMARY KEY NOT NULL,\n\t`full_name` text,\n\t`phone` int,\n\t`invited_by` int,\n\t`city_id` int,\n\t`date` timestamp DEFAULT now()\n);\n--> statement-breakpoint\nCREATE TABLE `users12` (\n\t`id` serial AUTO_INCREMENT PRIMARY KEY NOT NULL,\n\t`name` text NOT NULL,\n\t`email` text NOT NULL\n);\n"
  },
  {
    "path": "integration-tests/drizzle2/singlestore/meta/0000_snapshot.json",
    "content": "{\n  \"version\": \"1\",\n  \"dialect\": \"singlestore\",\n  \"id\": \"8e8c8378-0496-40f6-88e3-98aab8282b1f\",\n  \"prevId\": \"00000000-0000-0000-0000-000000000000\",\n  \"tables\": {\n    \"cities_migration\": {\n      \"name\": \"cities_migration\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"int\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"fullname_name\": {\n          \"name\": \"fullname_name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"state\": {\n          \"name\": \"state\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    },\n    \"users_migration\": {\n      \"name\": \"users_migration\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"int\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"full_name\": {\n          \"name\": \"full_name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"phone\": {\n          \"name\": \"phone\",\n          \"type\": \"int\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"invited_by\": {\n          \"name\": \"invited_by\",\n          \"type\": \"int\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"city_id\": {\n          \"name\": \"city_id\",\n          \"type\": \"int\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"date\": {\n          \"name\": \"date\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false,\n          \"default\": \"now()\"\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    },\n    \"users12\": {\n      \"name\": \"users12\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"serial\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": true\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {\n        \"my_unique_index\": {\n          \"name\": \"my_unique_index\",\n          \"columns\": [\n            \"name\"\n          ],\n          \"isUnique\": true,\n          \"using\": \"btree\"\n        }\n      },\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    }\n  },\n  \"schemas\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  }\n}\n"
  },
  {
    "path": "integration-tests/drizzle2/singlestore/meta/_journal.json",
    "content": "{\n  \"version\": \"1\",\n  \"dialect\": \"singlestore\",\n  \"entries\": [\n    {\n      \"idx\": 0,\n      \"version\": \"1\",\n      \"when\": 1680270921944,\n      \"tag\": \"0000_nostalgic_carnage\",\n      \"breakpoints\": true\n    }\n  ]\n}\n"
  },
  {
    "path": "integration-tests/drizzle2/sqlite/0000_fancy_bug.sql",
    "content": "CREATE TABLE another_users (\n\t`id` integer PRIMARY KEY NOT NULL,\n\t`name` text NOT NULL,\n\t`email` text NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE users12 (\n\t`id` integer PRIMARY KEY NOT NULL,\n\t`name` text NOT NULL,\n\t`email` text NOT NULL\n);\n"
  },
  {
    "path": "integration-tests/drizzle2/sqlite/meta/0000_snapshot.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"sqlite\",\n  \"id\": \"b6793a90-b553-4a5d-9d2f-b48e56ef2a2a\",\n  \"prevId\": \"00000000-0000-0000-0000-000000000000\",\n  \"tables\": {\n    \"cities\": {\n      \"name\": \"cities\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"fullname_name\": {\n          \"name\": \"fullname_name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"state\": {\n          \"name\": \"state\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {\n        \"cities_id_fullname_name_pk\": {\n          \"columns\": [\n            \"id\",\n            \"fullname_name\"\n          ]\n        }\n      }\n    },\n    \"test_get\": {\n      \"name\": \"test_get\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"integer\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"full_name\": {\n          \"name\": \"full_name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {}\n    },\n    \"users\": {\n      \"name\": \"users\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"integer\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"full_name\": {\n          \"name\": \"full_name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"phone\": {\n          \"name\": \"phone\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"invited_by\": {\n          \"name\": \"invited_by\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"city_id\": {\n          \"name\": \"city_id\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"users_city_id_cities_id_fk\": {\n          \"name\": \"users_city_id_cities_id_fk\",\n          \"tableFrom\": \"users\",\n          \"tableTo\": \"cities\",\n          \"columnsFrom\": [\n            \"city_id\"\n          ],\n          \"columnsTo\": [\n            \"id\"\n          ]\n        }\n      },\n      \"compositePrimaryKeys\": {}\n    }\n  },\n  \"enums\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  }\n}"
  },
  {
    "path": "integration-tests/drizzle2/sqlite/meta/_journal.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"sqlite\",\n  \"entries\": [\n    {\n      \"idx\": 0,\n      \"version\": \"5\",\n      \"when\": 1680202256473,\n      \"tag\": \"0000_fancy_bug\",\n      \"breakpoints\": true\n    }\n  ]\n}"
  },
  {
    "path": "integration-tests/js-tests/driver-init/commonjs/better-sqlite3.test.cjs",
    "content": "require('dotenv/config');\nconst Database = require('better-sqlite3');\nconst { drizzle } = require('drizzle-orm/better-sqlite3');\nconst { sqlite: schema } = require('./schema.cjs');\nimport { describe, expect } from 'vitest';\n\ndescribe('better-sqlite3', async (it) => {\n\tit('drizzle()', async () => {\n\t\tconst db = drizzle();\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(':memory:');\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(':memory:', {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: ':memory:',\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\tsource: ':memory:',\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: {}, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Database(':memory:');\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Database(':memory:');\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Database(':memory:');\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/commonjs/libsql.test.cjs",
    "content": "require('dotenv/config');\nconst { createClient } = require('@libsql/client');\nconst { drizzle } = require('drizzle-orm/libsql');\nconst { sqlite: schema } = require('./schema.cjs');\nimport { describe, expect } from 'vitest';\n\ndescribe('libsql', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(':memory:');\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(':memory:', {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: ':memory:',\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\turl: ':memory:',\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = createClient({\n\t\t\turl: ':memory:',\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = createClient({\n\t\t\turl: ':memory:',\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = createClient({\n\t\t\turl: ':memory:',\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/commonjs/mysql2.test.cjs",
    "content": "require('dotenv/config');\nconst { drizzle } = require('drizzle-orm/mysql2');\nconst { createPool, createConnection, Connection } = require('mysql2');\nconst { mysql: schema } = require('./schema.cjs');\nimport { describe, expect } from 'vitest';\n\nif (!process.env['MYSQL_CONNECTION_STRING']) {\n\tthrow new Error('MYSQL_CONNECTION_STRING is not defined');\n}\n\ndescribe('mysql2', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['MYSQL_CONNECTION_STRING'],\n\t\t);\n\n\t\tawait db.$client.execute(`SELECT 1`);\n\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['MYSQL_CONNECTION_STRING'],\n\t\t\t{\n\t\t\t\tschema,\n\t\t\t\tmode: 'default',\n\t\t\t},\n\t\t);\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['MYSQL_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t\tmode: 'default',\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t\tmode: 'default',\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = createPool({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = createPool({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t\tmode: 'default',\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = createPool({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t\tmode: 'default',\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n});\n\ndescribe('mysql2:connection', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst client = createConnection({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client.getConnection).toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = createConnection({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t\tmode: 'default',\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = createConnection({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t\tmode: 'default',\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/commonjs/neon-http.test.cjs",
    "content": "require('dotenv/config');\nconst { neon: pg } = require('@neondatabase/serverless');\nconst { drizzle } = require('drizzle-orm/neon-http');\nconst { pg: schema } = require('./schema.cjs');\nimport { describe, expect } from 'vitest';\n\nif (!process.env['NEON_CONNECTION_STRING']) {\n\tthrow new Error('NEON_CONNECTION_STRING is not defined');\n}\n\ndescribe('neon-http', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t);\n\n\t\tawait db.$client('SELECT 1;');\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t\t{\n\t\t\t\tschema,\n\t\t\t},\n\t\t);\n\n\t\tawait db.$client('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['NEON_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = pg(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t);\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client('SELECT 1;');\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = pg(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t);\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = pg(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t);\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/commonjs/neon-ws.test.cjs",
    "content": "require('dotenv/config');\nconst { neonConfig, Pool, Client } = require('@neondatabase/serverless');\nconst { drizzle } = require('drizzle-orm/neon-serverless');\nconst { pg: schema } = require('./schema.cjs');\nconst ws = require('ws');\nimport { describe, expect } from 'vitest';\n\nneonConfig.webSocketConstructor = ws;\n\nif (!process.env['NEON_CONNECTION_STRING']) {\n\tthrow new Error('NEON_CONNECTION_STRING is not defined');\n}\n\ndescribe('neon-ws', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t);\n\n\t\tawait db.$client.query('SELECT 1;');\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t\t{\n\t\t\t\tschema,\n\t\t\t},\n\t\t);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['NEON_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Pool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Pool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Pool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n});\n\ndescribe('neon-ws:Client', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Client({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Client({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Client({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t});\n});\n\ndescribe('neon-ws:PoolClient', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst pool = new Pool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\tclient.release();\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst pool = new Pool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\tclient.release();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst pool = new Pool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\tclient.release();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/commonjs/node-pg.test.cjs",
    "content": "require('dotenv/config');\nconst { drizzle } = require('drizzle-orm/node-postgres');\nconst pg = require('pg');\nconst { pg: schema } = require('./schema.cjs');\nimport { describe, expect } from 'vitest';\n\nconst Pool = pg.Pool;\nconst Client = pg.Client;\n\nif (!process.env['PG_CONNECTION_STRING']) {\n\tthrow new Error('PG_CONNECTION_STRING is not defined');\n}\n\ndescribe('node-pg', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(process.env['PG_CONNECTION_STRING']);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(process.env['PG_CONNECTION_STRING'], {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['PG_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n\ndescribe('node-pg:Client', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Client({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Client({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Client({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n\ndescribe('node-pg:PoolClient', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst pool = new Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\t\tclient.release();\n\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst pool = new Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\t\tclient.release();\n\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst pool = new Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\t\tclient.release();\n\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/commonjs/pglite.test.cjs",
    "content": "require('dotenv/config');\nconst { drizzle } = require('drizzle-orm/pglite');\nconst { pg: schema } = require('./schema.cjs');\nconst { PGlite: Database } = require('@electric-sql/pglite');\nimport { describe, expect } from 'vitest';\n\ndescribe('pglite', async (it) => {\n\tit('drizzle()', async () => {\n\t\tconst db = drizzle();\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle('memory://');\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle('memory://', {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: {}, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Database('memory://');\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Database('memory://');\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Database('memory://');\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/commonjs/planetscale.test.cjs",
    "content": "require('dotenv/config');\nconst { Client } = require('@planetscale/database');\nconst { drizzle } = require('drizzle-orm/planetscale-serverless');\nconst { mysql: schema } = require('./schema.cjs');\nimport { describe, expect } from 'vitest';\n\nif (!process.env['PLANETSCALE_CONNECTION_STRING']) {\n\tthrow new Error('PLANETSCALE_CONNECTION_STRING is not defined');\n}\n\ndescribe('planetscale', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t\t{\n\t\t\t\tschema,\n\t\t\t},\n\t\t);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\turl: process.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Client({\n\t\t\turl: process.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Client({\n\t\t\turl: process.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Client({\n\t\t\turl: process.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/commonjs/postgres-js.test.cjs",
    "content": "require('dotenv/config');\nconst { drizzle } = require('drizzle-orm/postgres-js');\nconst pg = require('postgres');\nconst { pg: schema } = require('./schema.cjs');\nimport { describe, expect } from 'vitest';\n\nif (!process.env['PG_CONNECTION_STRING']) {\n\tthrow new Error('PG_CONNECTION_STRING is not defined');\n}\n\ndescribe('postgres-js', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(process.env['PG_CONNECTION_STRING']);\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(process.env['PG_CONNECTION_STRING'], {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['PG_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\turl: process.env['PG_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = pg(process.env['PG_CONNECTION_STRING']);\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = pg(process.env['PG_CONNECTION_STRING']);\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = pg(process.env['PG_CONNECTION_STRING']);\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/commonjs/schema.cjs",
    "content": "const { int: mysqlInt, mysqlTable } = require('drizzle-orm/mysql-core');\nconst { integer: pgInt, pgTable } = require('drizzle-orm/pg-core');\nconst { integer: sqliteInt, sqliteTable } = require('drizzle-orm/sqlite-core');\n\nmodule.exports.sqlite = {\n\tUser: sqliteTable('test', {\n\t\tid: sqliteInt('id').primaryKey().notNull(),\n\t}),\n};\n\nmodule.exports.pg = {\n\tUser: pgTable('test', {\n\t\tid: pgInt('id').primaryKey().notNull(),\n\t}),\n};\n\nmodule.exports.mysql = {\n\tUser: mysqlTable('test', {\n\t\tid: mysqlInt('id').primaryKey().notNull(),\n\t}),\n};\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/commonjs/tidb.test.cjs",
    "content": "require('dotenv/config');\nconst { connect } = require('@tidbcloud/serverless');\nconst { drizzle } = require('drizzle-orm/tidb-serverless');\nconst { mysql: schema } = require('./schema.cjs');\nimport { describe, expect } from 'vitest';\n\nif (!process.env['TIDB_CONNECTION_STRING']) {\n\tthrow new Error('TIDB_CONNECTION_STRING is not defined');\n}\n\ndescribe('tidb', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['TIDB_CONNECTION_STRING'],\n\t\t);\n\n\t\tawait db.$client.execute(`SELECT 1`);\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['TIDB_CONNECTION_STRING'],\n\t\t\t{\n\t\t\t\tschema,\n\t\t\t},\n\t\t);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['TIDB_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\turl: process.env['TIDB_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = connect({\n\t\t\turl: process.env['TIDB_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = connect({\n\t\t\turl: process.env['TIDB_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = connect({\n\t\t\turl: process.env['TIDB_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/commonjs/vercel.test.cjs",
    "content": "require('dotenv/config');\nconst vc = require('@vercel/postgres');\nconst { drizzle } = require('drizzle-orm/vercel-postgres');\nconst { pg: schema } = require('./schema.cjs');\nimport { describe, expect } from 'vitest';\nconst { sql, createClient, createPool } = vc;\n\nconst Pool = vc.VercelPool;\nconst Client = vc.VercelClient;\n\nif (!process.env['VERCEL_CONNECTION_STRING']) {\n\tthrow new Error('VERCEL_CONNECTION_STRING is not defined');\n}\n\n// Used for non-pooled connection\nif (!process.env['NEON_CONNECTION_STRING']) {\n\tthrow new Error('NEON_CONNECTION_STRING is not defined');\n}\nprocess.env['POSTGRES_URL'] = process.env['VERCEL_CONNECTION_STRING'];\n\ndescribe('vercel:sql', async (it) => {\n\tit('drizzle()', async () => {\n\t\tconst db = drizzle();\n\n\t\tawait sql.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeTypeOf('function');\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst db = drizzle(sql);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeTypeOf('function');\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst db = drizzle(sql, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeTypeOf('function');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tclient: sql,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeTypeOf('function');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeTypeOf('function');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n\ndescribe('vercel:Pool', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst client = createPool({\n\t\t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = createPool({\n\t\t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = createPool({\n\t\t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient: client,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n\ndescribe('vercel:Client', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst client = createClient({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = createClient({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = createClient({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient: client,\n\t\t\tschema,\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n\ndescribe('vercel:PoolClient', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst pool = createPool({\n\t\t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\t\tclient.release();\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst pool = createPool({\n\t\t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\t\tclient.release();\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst pool = createPool({\n\t\t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\n\t\tconst db = drizzle({\n\t\t\tclient: client,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\t\tclient.release();\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/module/better-sqlite3.test.mjs",
    "content": "import 'dotenv/config';\nimport Database from 'better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { describe, expect } from 'vitest';\nimport { sqlite as schema } from './schema.mjs';\n\ndescribe('better-sqlite3', async (it) => {\n\tit('drizzle()', async () => {\n\t\tconst db = drizzle();\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(':memory:');\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(':memory:', {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: ':memory:',\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\tsource: ':memory:',\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: {}, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Database(':memory:');\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Database(':memory:');\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Database(':memory:');\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/module/libsql.test.mjs",
    "content": "import 'dotenv/config';\nimport { createClient } from '@libsql/client';\nimport { drizzle } from 'drizzle-orm/libsql';\nimport { describe, expect } from 'vitest';\nimport { sqlite as schema } from './schema.mjs';\n\ndescribe('libsql', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(':memory:');\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(':memory:', {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: ':memory:',\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\turl: ':memory:',\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = createClient({\n\t\t\turl: ':memory:',\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = createClient({\n\t\t\turl: ':memory:',\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = createClient({\n\t\t\turl: ':memory:',\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/module/mysql2.test.mjs",
    "content": "import 'dotenv/config';\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport { Connection, createConnection, createPool } from 'mysql2';\nimport { describe, expect } from 'vitest';\nimport { mysql as schema } from './schema.mjs';\n\nif (!process.env['MYSQL_CONNECTION_STRING']) {\n\tthrow new Error('MYSQL_CONNECTION_STRING is not defined');\n}\n\ndescribe('mysql2', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['MYSQL_CONNECTION_STRING'],\n\t\t);\n\n\t\tawait db.$client.execute(`SELECT 1`);\n\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['MYSQL_CONNECTION_STRING'],\n\t\t\t{\n\t\t\t\tschema,\n\t\t\t\tmode: 'default',\n\t\t\t},\n\t\t);\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['MYSQL_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t\tmode: 'default',\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t\tmode: 'default',\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = createPool({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = createPool({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t\tmode: 'default',\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = createPool({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t\tmode: 'default',\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).not.toStrictEqual(undefined);\n\t});\n});\n\ndescribe('mysql2:connection', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst client = createConnection({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client.getConnection).toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = createConnection({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t\tmode: 'default',\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = createConnection({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t\tmode: 'default',\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client.getConnection).toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/module/neon-http.test.mjs",
    "content": "import 'dotenv/config';\nimport { neon as pg } from '@neondatabase/serverless';\nimport { drizzle } from 'drizzle-orm/neon-http';\nimport { describe, expect } from 'vitest';\nimport { pg as schema } from './schema.mjs';\n\nif (!process.env['NEON_CONNECTION_STRING']) {\n\tthrow new Error('NEON_CONNECTION_STRING is not defined');\n}\n\ndescribe('neon-http', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t);\n\n\t\tawait db.$client('SELECT 1;');\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t\t{\n\t\t\t\tschema,\n\t\t\t},\n\t\t);\n\n\t\tawait db.$client('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['NEON_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = pg(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t);\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client('SELECT 1;');\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = pg(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t);\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = pg(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t);\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/module/neon-ws.test.mjs",
    "content": "import 'dotenv/config';\nimport { Client, neonConfig, Pool } from '@neondatabase/serverless';\nimport { drizzle } from 'drizzle-orm/neon-serverless';\nimport { describe, expect } from 'vitest';\nimport ws from 'ws';\nimport { pg as schema } from './schema.mjs';\n\nneonConfig.webSocketConstructor = ws;\n\nif (!process.env['NEON_CONNECTION_STRING']) {\n\tthrow new Error('NEON_CONNECTION_STRING is not defined');\n}\n\ndescribe('neon-ws', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t);\n\n\t\tawait db.$client.query('SELECT 1;');\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['NEON_CONNECTION_STRING'],\n\t\t\t{\n\t\t\t\tschema,\n\t\t\t},\n\t\t);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['NEON_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Pool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Pool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Pool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n});\n\ndescribe('neon-ws:Client', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Client({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Client({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Client({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t});\n});\n\ndescribe('neon-ws:PoolClient', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst pool = new Pool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\tclient.release();\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst pool = new Pool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\tclient.release();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst pool = new Pool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\tclient.release();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/module/node-pg.test.mjs",
    "content": "import 'dotenv/config';\nimport { drizzle } from 'drizzle-orm/node-postgres';\nimport pg from 'pg';\nimport { describe, expect } from 'vitest';\nimport { pg as schema } from './schema.mjs';\n\nconst Pool = pg.Pool;\nconst Client = pg.Client;\n\nif (!process.env['PG_CONNECTION_STRING']) {\n\tthrow new Error('PG_CONNECTION_STRING is not defined');\n}\n\ndescribe('node-pg', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(process.env['PG_CONNECTION_STRING']);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(process.env['PG_CONNECTION_STRING'], {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['PG_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n\ndescribe('node-pg:Client', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Client({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Client({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Client({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n\ndescribe('node-pg:PoolClient', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst pool = new Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\t\tclient.release();\n\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst pool = new Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\t\tclient.release();\n\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst pool = new Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\t\tclient.release();\n\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/module/pglite.test.mjs",
    "content": "import 'dotenv/config';\nimport { PGlite as Database } from '@electric-sql/pglite';\nimport { drizzle } from 'drizzle-orm/pglite';\nimport { describe, expect } from 'vitest';\nimport { pg as schema } from './schema.mjs';\n\ndescribe('pglite', async (it) => {\n\tit('drizzle()', async () => {\n\t\tconst db = drizzle();\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle('memory://');\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle('memory://', {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: {}, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Database('memory://');\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Database('memory://');\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Database('memory://');\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.exec('SELECT 1;');\n\t\tawait db.$client.close();\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/module/planetscale.test.mjs",
    "content": "import 'dotenv/config';\nimport { Client } from '@planetscale/database';\nimport { drizzle } from 'drizzle-orm/planetscale-serverless';\nimport { describe, expect } from 'vitest';\nimport { mysql as schema } from './schema.mjs';\n\nif (!process.env['PLANETSCALE_CONNECTION_STRING']) {\n\tthrow new Error('PLANETSCALE_CONNECTION_STRING is not defined');\n}\n\ndescribe('planetscale', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t\t{\n\t\t\t\tschema,\n\t\t\t},\n\t\t);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\turl: process.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = new Client({\n\t\t\turl: process.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = new Client({\n\t\t\turl: process.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = new Client({\n\t\t\turl: process.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/module/postgres-js.test.mjs",
    "content": "import 'dotenv/config';\nimport { drizzle } from 'drizzle-orm/postgres-js';\nimport pg from 'postgres';\nimport { describe, expect } from 'vitest';\nimport { pg as schema } from './schema.mjs';\n\nif (!process.env['PG_CONNECTION_STRING']) {\n\tthrow new Error('PG_CONNECTION_STRING is not defined');\n}\n\ndescribe('postgres-js', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(process.env['PG_CONNECTION_STRING']);\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(process.env['PG_CONNECTION_STRING'], {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['PG_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\turl: process.env['PG_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = pg(process.env['PG_CONNECTION_STRING']);\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = pg(process.env['PG_CONNECTION_STRING']);\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = pg(process.env['PG_CONNECTION_STRING']);\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.unsafe('SELECT 1;');\n\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/module/schema.mjs",
    "content": "import { int as mysqlInt, mysqlTable } from 'drizzle-orm/mysql-core';\nimport { integer as pgInt, pgTable } from 'drizzle-orm/pg-core';\nimport { integer as sqliteInt, sqliteTable } from 'drizzle-orm/sqlite-core';\n\nexport const sqlite = {\n\tUser: sqliteTable('test', {\n\t\tid: sqliteInt('id').primaryKey().notNull(),\n\t}),\n};\n\nexport const pg = {\n\tUser: pgTable('test', {\n\t\tid: pgInt('id').primaryKey().notNull(),\n\t}),\n};\n\nexport const mysql = {\n\tUser: mysqlTable('test', {\n\t\tid: mysqlInt('id').primaryKey().notNull(),\n\t}),\n};\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/module/tidb.test.mjs",
    "content": "import 'dotenv/config';\nimport { connect } from '@tidbcloud/serverless';\nimport { drizzle } from 'drizzle-orm/tidb-serverless';\nimport { describe, expect } from 'vitest';\nimport { mysql as schema } from './schema.mjs';\n\nif (!process.env['TIDB_CONNECTION_STRING']) {\n\tthrow new Error('TIDB_CONNECTION_STRING is not defined');\n}\n\ndescribe('tidb', async (it) => {\n\tit('drizzle(string)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['TIDB_CONNECTION_STRING'],\n\t\t);\n\n\t\tawait db.$client.execute(`SELECT 1`);\n\t});\n\n\tit('drizzle(string, config)', async () => {\n\t\tconst db = drizzle(\n\t\t\tprocess.env['TIDB_CONNECTION_STRING'],\n\t\t\t{\n\t\t\t\tschema,\n\t\t\t},\n\t\t);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: string, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: process.env['TIDB_CONNECTION_STRING'],\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({connection: params, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tconnection: {\n\t\t\t\turl: process.env['TIDB_CONNECTION_STRING'],\n\t\t\t},\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst client = connect({\n\t\t\turl: process.env['TIDB_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.execute('SELECT 1;');\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = connect({\n\t\t\turl: process.env['TIDB_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = connect({\n\t\t\turl: process.env['TIDB_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.execute('SELECT 1;');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/js-tests/driver-init/module/vercel.test.mjs",
    "content": "import 'dotenv/config';\nimport { createClient, createPool, sql, VercelClient, VercelPool } from '@vercel/postgres';\nimport { drizzle } from 'drizzle-orm/vercel-postgres';\nimport { describe, expect } from 'vitest';\nimport { pg as schema } from './schema.mjs';\n\nconst Pool = VercelPool;\nconst Client = VercelClient;\n\nif (!process.env['VERCEL_CONNECTION_STRING']) {\n\tthrow new Error('VERCEL_CONNECTION_STRING is not defined');\n}\n\n// Used for non-pooled connection\nif (!process.env['NEON_CONNECTION_STRING']) {\n\tthrow new Error('NEON_CONNECTION_STRING is not defined');\n}\n\nprocess.env['POSTGRES_URL'] = process.env['VERCEL_CONNECTION_STRING'];\n\ndescribe('vercel:sql', async (it) => {\n\tit('drizzle()', async () => {\n\t\tconst db = drizzle();\n\n\t\tawait sql.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeTypeOf('function');\n\t});\n\n\tit('drizzle(client)', async () => {\n\t\tconst db = drizzle(sql);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeTypeOf('function');\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst db = drizzle(sql, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeTypeOf('function');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tclient: sql,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeTypeOf('function');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({...config})', async () => {\n\t\tconst db = drizzle({\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).toBeTypeOf('function');\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n\ndescribe('vercel:Pool', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst client = createPool({\n\t\t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = createPool({\n\t\t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = createPool({\n\t\t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient: client,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).toBeInstanceOf(Pool);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n\ndescribe('vercel:Client', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst client = createClient({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client);\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst client = createClient({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst client = createClient({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING'],\n\t\t});\n\t\tconst db = drizzle({\n\t\t\tclient: client,\n\t\t\tschema,\n\t\t});\n\n\t\tawait client.connect();\n\n\t\tawait db.$client.query('SELECT 1;');\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n\ndescribe('vercel:PoolClient', async (it) => {\n\tit('drizzle(client)', async () => {\n\t\tconst pool = createPool({\n\t\t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\n\t\tconst db = drizzle(client);\n\n\t\tawait db.$client.query('SELECT 1;');\n\t\tclient.release();\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t});\n\n\tit('drizzle(client, config)', async () => {\n\t\tconst pool = createPool({\n\t\t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\n\t\tconst db = drizzle(client, {\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\t\tclient.release();\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n\n\tit('drizzle({client, ...config})', async () => {\n\t\tconst pool = createPool({\n\t\t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t\t});\n\t\tconst client = await pool.connect();\n\n\t\tconst db = drizzle({\n\t\t\tclient: client,\n\t\t\tschema,\n\t\t});\n\n\t\tawait db.$client.query('SELECT 1;');\n\t\tclient.release();\n\n\t\texpect(db.$client).not.toBeTypeOf('function');\n\t\texpect(db.$client).not.toBeInstanceOf(Pool);\n\t\texpect(db.$client).toBeInstanceOf(Client);\n\t\texpect(db.query.User).not.toStrictEqual(undefined);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/package.json",
    "content": "{\n\t\"name\": \"integration-tests\",\n\t\"version\": \"1.0.0\",\n\t\"description\": \"\",\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"test:types\": \"tsc && cd type-tests/join-nodenext && tsc\",\n\t\t\"test\": \"pnpm test:vitest\",\n\t\t\"test:vitest\": \"vitest run --pass-with-no-tests\",\n\t\t\"test:esm\": \"node tests/imports.test.mjs && node tests/imports.test.cjs\",\n\t\t\"test:data-api\": \"sst shell vitest run tests/pg/awsdatapi.test.ts\"\n\t},\n\t\"keywords\": [],\n\t\"author\": \"Drizzle Team\",\n\t\"license\": \"Apache-2.0\",\n\t\"private\": true,\n\t\"devDependencies\": {\n\t\t\"@cloudflare/workers-types\": \"^4.20241004.0\",\n\t\t\"@libsql/client\": \"^0.10.0\",\n\t\t\"@neondatabase/serverless\": \"0.10.0\",\n\t\t\"@originjs/vite-plugin-commonjs\": \"^1.0.3\",\n\t\t\"@paralleldrive/cuid2\": \"^2.2.2\",\n\t\t\"@types/async-retry\": \"^1.4.8\",\n\t\t\"@types/better-sqlite3\": \"^7.6.4\",\n\t\t\"@types/dockerode\": \"^3.3.18\",\n\t\t\"@types/node\": \"^20.2.5\",\n\t\t\"@types/pg\": \"^8.10.1\",\n\t\t\"@types/sql.js\": \"^1.4.4\",\n\t\t\"@types/uuid\": \"^9.0.1\",\n\t\t\"@types/ws\": \"^8.5.10\",\n\t\t\"@upstash/redis\": \"^1.34.3\",\n\t\t\"@vitest/ui\": \"^1.6.0\",\n\t\t\"ava\": \"^5.3.0\",\n\t\t\"cross-env\": \"^7.0.3\",\n\t\t\"keyv\": \"^5.2.3\",\n\t\t\"import-in-the-middle\": \"^1.13.1\",\n\t\t\"ts-node\": \"^10.9.2\",\n\t\t\"tsx\": \"^4.14.0\",\n\t\t\"vite-tsconfig-paths\": \"^4.3.2\",\n\t\t\"zx\": \"^8.3.2\"\n\t},\n\t\"dependencies\": {\n\t\t\"@aws-sdk/client-rds-data\": \"^3.549.0\",\n\t\t\"@aws-sdk/credential-providers\": \"^3.549.0\",\n\t\t\"@electric-sql/pglite\": \"0.2.12\",\n\t\t\"@libsql/client\": \"^0.10.0\",\n\t\t\"@miniflare/d1\": \"^2.14.4\",\n\t\t\"@miniflare/shared\": \"^2.14.4\",\n\t\t\"@planetscale/database\": \"^1.16.0\",\n\t\t\"@prisma/client\": \"5.14.0\",\n\t\t\"@tidbcloud/serverless\": \"^0.1.1\",\n\t\t\"@typescript/analyze-trace\": \"^0.10.0\",\n\t\t\"@vercel/postgres\": \"^0.8.0\",\n\t\t\"@xata.io/client\": \"^0.29.3\",\n\t\t\"async-retry\": \"^1.3.3\",\n\t\t\"better-sqlite3\": \"11.9.1\",\n\t\t\"dockerode\": \"^4.0.6\",\n\t\t\"dotenv\": \"^16.1.4\",\n\t\t\"drizzle-prisma-generator\": \"^0.1.2\",\n\t\t\"drizzle-seed\": \"workspace:../drizzle-seed/dist\",\n\t\t\"drizzle-typebox\": \"workspace:../drizzle-typebox/dist\",\n\t\t\"drizzle-valibot\": \"workspace:../drizzle-valibot/dist\",\n\t\t\"drizzle-zod\": \"workspace:../drizzle-zod/dist\",\n\t\t\"gel\": \"^2.0.0\",\n\t\t\"get-port\": \"^7.0.0\",\n\t\t\"mysql2\": \"^3.14.1\",\n\t\t\"pg\": \"^8.11.0\",\n\t\t\"postgres\": \"^3.3.5\",\n\t\t\"prisma\": \"5.14.0\",\n\t\t\"source-map-support\": \"^0.5.21\",\n\t\t\"sql.js\": \"^1.8.0\",\n\t\t\"sqlite3\": \"^5.1.4\",\n\t\t\"sst\": \"^3.14.24\",\n\t\t\"uuid\": \"^9.0.0\",\n\t\t\"uvu\": \"^0.5.6\",\n\t\t\"vitest\": \"^3.1.3\",\n\t\t\"ws\": \"^8.18.2\",\n\t\t\"zod\": \"^3.20.2\"\n\t}\n}\n"
  },
  {
    "path": "integration-tests/sst-env.d.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/triple-slash-reference\n/// <reference path=\"./.sst/types.generated.ts\" />\n"
  },
  {
    "path": "integration-tests/sst.config.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/triple-slash-reference\n/// <reference path=\"./.sst/platform/config.d.ts\" />\n\nexport default $config({\n\tapp(_input) {\n\t\treturn {\n\t\t\tname: 'awsdataapi',\n\t\t\tremoval: 'remove',\n\t\t\thome: 'aws',\n\t\t};\n\t},\n\tasync run() {\n\t\tnew sst.aws.Postgres('Postgres', {\n\t\t\tscaling: {\n\t\t\t\tmin: '0.5 ACU',\n\t\t\t\tmax: '1 ACU',\n\t\t\t},\n\t\t});\n\t},\n});\n"
  },
  {
    "path": "integration-tests/tests/awsdatapi.alltypes.test.ts",
    "content": "/* eslint-disable unicorn/no-empty-file */\n// import 'dotenv/config';\n\n// import { RDSDataClient } from '@aws-sdk/client-rds-data';\n// import { fromIni } from '@aws-sdk/credential-providers';\n// import type { TestFn } from 'ava';\n// import anyTest from 'ava';\n// import * as dotenv from 'dotenv';\n// import { name, sql } from 'drizzle-orm';\n// import type { AwsDataApiPgDatabase } from 'drizzle-orm/aws-data-api/pg';\n// import { drizzle } from 'drizzle-orm/aws-data-api/pg';\n// import {\n// \tbigint,\n// \tbigserial,\n// \tboolean,\n// \tdate,\n// \tdecimal,\n// \tdoublePrecision,\n// \tinteger,\n// \tjson,\n// \tjsonb,\n// \tnumeric,\n// \tpgEnum,\n// \tpgTable,\n// \treal,\n// \tserial,\n// \tsmallint,\n// \ttext,\n// \ttime,\n// \ttimestamp,\n// \tvarchar,\n// } from 'drizzle-orm/pg-core';\n\n// dotenv.config();\n\n// export const allColumns = pgTable('all_columns', {\n// \tsm: smallint('smallint'),\n// \tsmdef: smallint('smallint_def').default(10),\n// \tint: integer('integer'),\n// \tintdef: integer('integer_def').default(10),\n// \tnumeric: numeric('numeric'),\n// \tnumeric2: numeric('numeric2', { precision: 5 }),\n// \tnumeric3: numeric('numeric3', { scale: 2 }),\n// \tnumeric4: numeric('numeric4', { precision: 5, scale: 2 }),\n// \tnumericdef: numeric('numeridef').default('100'),\n// \tbigint: bigint('bigint', { mode: 'number' }),\n// \tbigintdef: bigint('bigintdef', { mode: 'number' }).default(100),\n// \tbool: boolean('boolean'),\n// \tbooldef: boolean('boolean_def').default(true),\n// \ttext: text('text'),\n// \ttextdef: text('textdef').default('text'),\n// \tvarchar: varchar('varchar'),\n// \tvarchardef: varchar('varchardef').default('text'),\n// \tserial: serial('serial'),\n// \tbigserial: bigserial('bigserial', { mode: 'number' }),\n// \tdecimal: decimal('decimal', { precision: 100, scale: 2 }),\n// \tdecimaldef: decimal('decimaldef', { precision: 100, scale: 2 }).default('100.0'),\n// \tdoublePrecision: doublePrecision('doublePrecision'),\n// \tdoublePrecisiondef: doublePrecision('doublePrecisiondef').default(100),\n// \treal: real('real'),\n// \trealdef: real('realdef').default(100),\n// \tjson: json('json').$type<{ attr: string }>(),\n// \tjsondef: json('jsondef').$type<{ attr: string }>().default({ attr: 'value' }),\n// \tjsonb: jsonb('jsonb').$type<{ attr: string }>(),\n// \tjsonbdef: jsonb('jsonbdef').$type<{ attr: string }>().default({ attr: 'value' }),\n// \ttime: time('time'),\n// \ttime2: time('time2', { precision: 6, withTimezone: true }),\n// \ttimedefnow: time('timedefnow').defaultNow(),\n// \ttimestamp: timestamp('timestamp'),\n// \ttimestamp2: timestamp('timestamp2', { precision: 6, withTimezone: true }),\n// \ttimestamp3: timestamp('timestamp3', { withTimezone: true }),\n// \ttimestamp4: timestamp('timestamp4', { precision: 4 }),\n// \ttimestampdef: timestamp('timestampdef').defaultNow(),\n// \tdate: date('date', { mode: 'date' }),\n// \tdatedef: date('datedef').defaultNow(),\n// });\n\n// interface Context {\n// \tdb: AwsDataApiPgDatabase;\n// \trow: typeof allColumns.$inferSelect;\n// }\n\n// const test = anyTest as TestFn<Context>;\n\n// test.before(async (t) => {\n// \tconst ctx = t.context;\n// \tconst database = process.env['AWS_DATA_API_DB']!;\n// \tconst secretArn = process.env['AWS_DATA_API_SECRET_ARN']!;\n// \tconst resourceArn = process.env['AWS_DATA_API_RESOURCE_ARN']!;\n\n// \tconst rdsClient = new RDSDataClient({\n// \t\tcredentials: fromIni({ profile: process.env['AWS_TEST_PROFILE'] }),\n// \t\tregion: 'us-east-1',\n// \t});\n\n// \tctx.db = drizzle(rdsClient, {\n// \t\tdatabase,\n// \t\tsecretArn,\n// \t\tresourceArn,\n// \t\t// logger: new DefaultLogger(),\n// \t});\n\n// \tawait ctx.db.execute(sql`\n// \t\tCREATE TABLE IF NOT EXISTS \"all_columns\" (\n// \t\t\t\"smallint\" smallint,\n// \t\t\t\"smallint_def\" smallint DEFAULT 10,\n// \t\t\t\"integer\" integer,\n// \t\t\t\"integer_def\" integer DEFAULT 10,\n// \t\t\t\"numeric\" numeric,\n// \t\t\t\"numeric2\" numeric(5),\n// \t\t\t\"numeric3\" numeric,\n// \t\t\t\"numeric4\" numeric(5, 2),\n// \t\t\t\"numeridef\" numeric DEFAULT '100',\n// \t\t\t\"bigint\" bigint,\n// \t\t\t\"bigintdef\" bigint DEFAULT 100,\n// \t\t\t\"boolean\" boolean,\n// \t\t\t\"boolean_def\" boolean DEFAULT true,\n// \t\t\t\"text\" text,\n// \t\t\t\"textdef\" text DEFAULT 'text',\n// \t\t\t\"varchar\" varchar,\n// \t\t\t\"varchardef\" varchar DEFAULT 'text',\n// \t\t\t\"serial\" serial,\n// \t\t\t\"bigserial\" bigserial,\n// \t\t\t\"decimal\" numeric(100, 2),\n// \t\t\t\"decimaldef\" numeric(100, 2) DEFAULT '100.0',\n// \t\t\t\"doublePrecision\" double precision,\n// \t\t\t\"doublePrecisiondef\" double precision DEFAULT 100,\n// \t\t\t\"real\" real,\n// \t\t\t\"realdef\" real DEFAULT 100,\n// \t\t\t\"json\" json,\n// \t\t\t\"jsondef\" json DEFAULT '{\"attr\":\"value\"}'::json,\n// \t\t\t\"jsonb\" jsonb,\n// \t\t\t\"jsonbdef\" jsonb DEFAULT '{\"attr\":\"value\"}'::jsonb,\n// \t\t\t\"time\" time,\n// \t\t\t\"time2\" time,\n// \t\t\t\"timedefnow\" time DEFAULT now(),\n// \t\t\t\"timestamp\" timestamp,\n// \t\t\t\"timestamp2\" timestamp (6) with time zone,\n// \t\t\t\"timestamp3\" timestamp with time zone,\n// \t\t\t\"timestamp4\" timestamp (4),\n// \t\t\t\"timestampdef\" timestamp DEFAULT now(),\n// \t\t\t\"date\" date,\n// \t\t\t\"datedef\" date DEFAULT now()\n// \t\t)\n// \t`);\n\n// \tconst now = new Date();\n\n// \tawait ctx.db.insert(allColumns).values({\n// \t\tsm: 12,\n// \t\tint: 22,\n// \t\tnumeric: '1.1',\n// \t\tnumeric2: '123.45',\n// \t\tnumeric3: '123.45',\n// \t\tnumeric4: '123.45',\n// \t\tbigint: 1578,\n// \t\tbool: true,\n// \t\ttext: 'inserted_text',\n// \t\tvarchar: 'inserted_varchar',\n// \t\tserial: 44,\n// \t\tbigserial: 63473487,\n// \t\tdecimal: '100.1',\n// \t\tdoublePrecision: 7384.34,\n// \t\treal: 73849.11,\n// \t\tjson: { attr: 'hellohello' },\n// \t\tjsonb: { attr: 'hellohello' },\n// \t\ttime: '11:12:00',\n// \t\ttime2: '11:12:00',\n// \t\ttimestamp: now,\n// \t\ttimestamp2: now,\n// \t\ttimestamp3: now,\n// \t\ttimestamp4: now,\n// \t\tdate: now,\n// \t\t// interval: '10 days'\n// \t});\n\n// \tconst resultRows = await ctx.db.select().from(allColumns);\n// \tt.is(resultRows.length, 1);\n\n// \tconst row = resultRows[0]!;\n// \tctx.row = row;\n// });\n\n// test.serial('[small] serial type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.sm === 'number');\n// \tt.is(row.sm, 12);\n// });\n\n// test.serial('[small serial] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.sm === 'number');\n// \tt.is(row.smdef, 10);\n// });\n\n// test.serial('[int] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.int === 'number');\n// \tt.is(row.int, 22);\n// });\n\n// test.serial('[int] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.intdef === 'number');\n// \tt.is(row.intdef, 10);\n// });\n\n// test.serial('[numeric] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.int === 'number');\n// \tt.is(row.int, 22);\n// });\n\n// test.serial('[numeric(precision)] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.int === 'number');\n// \tt.is(row.int, 22);\n// });\n\n// test.serial('[numeric(scale)] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.int === 'number');\n// \tt.is(row.int, 22);\n// });\n\n// test.serial('[numeric(precision, scale)] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.int === 'number');\n// \tt.is(row.int, 22);\n// });\n\n// test.serial('[numeric] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.int === 'number');\n// \tt.is(row.int, 22);\n// });\n\n// test.serial('[bigint] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.bigint === 'number');\n// \tt.is(row.bigint, 1578);\n// });\n\n// test.serial('[bigint] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.bigintdef === 'number');\n// \tt.is(row.bigintdef, 100);\n// });\n\n// test.serial('[boolean] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.bool === 'boolean');\n// \tt.is(row.bool, true);\n// });\n\n// test.serial('[boolean] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.booldef === 'boolean');\n// \tt.is(row.booldef, true);\n// });\n\n// test.serial('[text] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.text === 'string');\n// \tt.is(row.text, 'inserted_text');\n// });\n\n// test.serial('[text] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.textdef === 'string');\n// \tt.is(row.textdef, 'text');\n// });\n\n// test.serial('[varchar] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.varchar === 'string');\n// \tt.is(row.varchar, 'inserted_varchar');\n// });\n\n// test.serial('[varchar] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.varchardef === 'string');\n// \tt.is(row.varchardef, 'text');\n// });\n\n// test.serial('[serial] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.serial === 'number');\n// \tt.is(row.serial, 44);\n// });\n\n// test.serial('[bigserial] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.bigserial === 'number');\n// \tt.is(row.bigserial, 63473487);\n// });\n\n// test.serial('[decimal] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.decimal === 'string');\n// \tt.is(row.decimal, '100.10');\n// });\n\n// test.serial('[decimal] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.decimaldef === 'string');\n// \tt.is(row.decimaldef, '100.00');\n// });\n\n// test.serial('[double precision] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.doublePrecision === 'number');\n// \tt.is(row.doublePrecision, 7384.34);\n// });\n\n// test.serial('[double precision] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.doublePrecisiondef === 'number');\n// \tt.is(row.doublePrecisiondef, 100);\n// });\n\n// test.serial('[real] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.real === 'number');\n// \tt.is(row.real, 73849.11);\n// });\n\n// test.serial('[real] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.realdef === 'number');\n// \tt.is(row.realdef, 100);\n// });\n\n// test.serial('[json] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.json?.attr === 'string');\n// \tt.deepEqual(row.json, { attr: 'hellohello' });\n// });\n\n// test.serial('[json] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.jsondef?.attr === 'string');\n// \tt.deepEqual(row.jsondef, { attr: 'value' });\n// });\n\n// test.serial('[jsonb] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.jsonb?.attr === 'string');\n// \tt.deepEqual(row.jsonb, { attr: 'hellohello' });\n// });\n\n// test.serial('[jsonb] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.jsonbdef?.attr === 'string');\n// \tt.deepEqual(row.jsonbdef, { attr: 'value' });\n// });\n\n// test.serial('[time] type', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(typeof row.time === 'string');\n// \tt.assert(typeof row.time2 === 'string');\n// \tt.assert(typeof row.timedefnow === 'string');\n// });\n\n// test.serial('[timestamp] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(row.timestamp instanceof Date); // eslint-disable-line no-instanceof/no-instanceof\n// \tt.assert(row.timestamp2 instanceof Date); // eslint-disable-line no-instanceof/no-instanceof\n// \tt.assert(row.timestamp3 instanceof Date); // eslint-disable-line no-instanceof/no-instanceof\n// \tt.assert(row.timestamp4 instanceof Date); // eslint-disable-line no-instanceof/no-instanceof\n// \tt.assert(row.timestampdef instanceof Date); // eslint-disable-line no-instanceof/no-instanceof\n// });\n\n// test.serial('[date] type with default', async (t) => {\n// \tconst { row } = t.context;\n\n// \tt.assert(row.date instanceof Date); // eslint-disable-line no-instanceof/no-instanceof\n// \tt.assert(typeof row.datedef === 'string');\n// });\n\n// test.serial('select from enum', async (t) => {\n// \tconst { db } = t.context;\n\n// \tconst muscleEnum = pgEnum('muscle', [\n// \t\t'abdominals',\n// \t\t'hamstrings',\n// \t\t'adductors',\n// \t\t'quadriceps',\n// \t\t'biceps',\n// \t\t'shoulders',\n// \t\t'chest',\n// \t\t'middle_back',\n// \t\t'calves',\n// \t\t'glutes',\n// \t\t'lower_back',\n// \t\t'lats',\n// \t\t'triceps',\n// \t\t'traps',\n// \t\t'forearms',\n// \t\t'neck',\n// \t\t'abductors',\n// \t]);\n\n// \tconst forceEnum = pgEnum('force', ['isometric', 'isotonic', 'isokinetic']);\n\n// \tconst levelEnum = pgEnum('level', ['beginner', 'intermediate', 'advanced']);\n\n// \tconst mechanicEnum = pgEnum('mechanic', ['compound', 'isolation']);\n\n// \tconst equipmentEnum = pgEnum('equipment', ['barbell', 'dumbbell', 'bodyweight', 'machine', 'cable', 'kettlebell']);\n\n// \tconst categoryEnum = pgEnum('category', ['upper_body', 'lower_body', 'full_body']);\n\n// \tconst exercises = pgTable('exercises', {\n// \t\tid: serial('id').primaryKey(),\n// \t\tname: varchar('name').notNull(),\n// \t\tforce: forceEnum('force'),\n// \t\tlevel: levelEnum('level'),\n// \t\tmechanic: mechanicEnum('mechanic'),\n// \t\tequipment: equipmentEnum('equipment'),\n// \t\tinstructions: text('instructions'),\n// \t\tcategory: categoryEnum('category'),\n// \t\tprimaryMuscles: muscleEnum('primary_muscles').array(),\n// \t\tsecondaryMuscles: muscleEnum('secondary_muscles').array(),\n// \t\tcreatedAt: timestamp('created_at').notNull().default(sql`now()`),\n// \t\tupdatedAt: timestamp('updated_at').notNull().default(sql`now()`),\n// \t});\n\n// \tawait db.execute(sql`drop table if exists ${exercises}`);\n// \tawait db.execute(sql`drop type if exists ${name(muscleEnum.enumName)}`);\n// \tawait db.execute(sql`drop type if exists ${name(forceEnum.enumName)}`);\n// \tawait db.execute(sql`drop type if exists ${name(levelEnum.enumName)}`);\n// \tawait db.execute(sql`drop type if exists ${name(mechanicEnum.enumName)}`);\n// \tawait db.execute(sql`drop type if exists ${name(equipmentEnum.enumName)}`);\n// \tawait db.execute(sql`drop type if exists ${name(categoryEnum.enumName)}`);\n\n// \tawait db.execute(\n// \t\tsql`create type ${\n// \t\t\tname(muscleEnum.enumName)\n// \t\t} as enum ('abdominals', 'hamstrings', 'adductors', 'quadriceps', 'biceps', 'shoulders', 'chest', 'middle_back', 'calves', 'glutes', 'lower_back', 'lats', 'triceps', 'traps', 'forearms', 'neck', 'abductors')`,\n// \t);\n// \tawait db.execute(sql`create type ${name(forceEnum.enumName)} as enum ('isometric', 'isotonic', 'isokinetic')`);\n// \tawait db.execute(sql`create type ${name(levelEnum.enumName)} as enum ('beginner', 'intermediate', 'advanced')`);\n// \tawait db.execute(sql`create type ${name(mechanicEnum.enumName)} as enum ('compound', 'isolation')`);\n// \tawait db.execute(\n// \t\tsql`create type ${\n// \t\t\tname(equipmentEnum.enumName)\n// \t\t} as enum ('barbell', 'dumbbell', 'bodyweight', 'machine', 'cable', 'kettlebell')`,\n// \t);\n// \tawait db.execute(sql`create type ${name(categoryEnum.enumName)} as enum ('upper_body', 'lower_body', 'full_body')`);\n// \tawait db.execute(sql`\n// \t\tcreate table ${exercises} (\n// \t\t\tid serial primary key,\n// \t\t\tname varchar not null,\n// \t\t\tforce force,\n// \t\t\tlevel level,\n// \t\t\tmechanic mechanic,\n// \t\t\tequipment equipment,\n// \t\t\tinstructions text,\n// \t\t\tcategory category,\n// \t\t\tprimary_muscles muscle[],\n// \t\t\tsecondary_muscles muscle[],\n// \t\t\tcreated_at timestamp not null default now(),\n// \t\t\tupdated_at timestamp not null default now()\n// \t\t)\n// \t`);\n\n// \tawait db.insert(exercises).values({\n// \t\tname: 'Bench Press',\n// \t\tforce: 'isotonic',\n// \t\tlevel: 'beginner',\n// \t\tmechanic: 'compound',\n// \t\tequipment: 'barbell',\n// \t\tinstructions:\n// \t\t\t'Lie on your back on a flat bench. Grasp the barbell with an overhand grip, slightly wider than shoulder width. Unrack the barbell and hold it over you with your arms locked. Lower the barbell to your chest. Press the barbell back to the starting position.',\n// \t\tcategory: 'upper_body',\n// \t\tprimaryMuscles: ['chest', 'triceps'],\n// \t\tsecondaryMuscles: ['shoulders', 'traps'],\n// \t});\n\n// \tconst result = await db.select().from(exercises);\n\n// \tt.deepEqual(result, [\n// \t\t{\n// \t\t\tid: 1,\n// \t\t\tname: 'Bench Press',\n// \t\t\tforce: 'isotonic',\n// \t\t\tlevel: 'beginner',\n// \t\t\tmechanic: 'compound',\n// \t\t\tequipment: 'barbell',\n// \t\t\tinstructions:\n// \t\t\t\t'Lie on your back on a flat bench. Grasp the barbell with an overhand grip, slightly wider than shoulder width. Unrack the barbell and hold it over you with your arms locked. Lower the barbell to your chest. Press the barbell back to the starting position.',\n// \t\t\tcategory: 'upper_body',\n// \t\t\tprimaryMuscles: ['chest', 'triceps'],\n// \t\t\tsecondaryMuscles: ['shoulders', 'traps'],\n// \t\t\tcreatedAt: result[0]!.createdAt,\n// \t\t\tupdatedAt: result[0]!.updatedAt,\n// \t\t},\n// \t]);\n\n// \tawait db.execute(sql`drop table ${exercises}`);\n// \tawait db.execute(sql`drop type ${name(muscleEnum.enumName)}`);\n// \tawait db.execute(sql`drop type ${name(forceEnum.enumName)}`);\n// \tawait db.execute(sql`drop type ${name(levelEnum.enumName)}`);\n// \tawait db.execute(sql`drop type ${name(mechanicEnum.enumName)}`);\n// \tawait db.execute(sql`drop type ${name(equipmentEnum.enumName)}`);\n// \tawait db.execute(sql`drop type ${name(categoryEnum.enumName)}`);\n// });\n\n// test.after.always(async (t) => {\n// \tconst ctx = t.context;\n\n// \tawait ctx.db.execute(sql`drop table \"all_columns\"`);\n// });\n"
  },
  {
    "path": "integration-tests/tests/bun/bun-sql.test.ts",
    "content": "import retry from 'async-retry';\nimport { SQL as BunSQL } from 'bun';\nimport { afterAll, afterEach, beforeAll, beforeEach, expect, test } from 'bun:test';\nimport type Docker from 'dockerode';\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nimport {\n\tand,\n\tarrayContained,\n\tarrayContains,\n\tarrayOverlaps,\n\tasc,\n\tavg,\n\tavgDistinct,\n\tcount,\n\tcountDistinct,\n\teq,\n\tEqual,\n\texists,\n\tgetTableColumns,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tis,\n\tlt,\n\tmax,\n\tmin,\n\tnotInArray,\n\tor,\n\tSQL,\n\tsql,\n\tSQLWrapper,\n\tsum,\n\tsumDistinct,\n\tTransactionRollbackError,\n} from 'drizzle-orm';\nimport type { BunSQLDatabase } from 'drizzle-orm/bun-sql';\nimport { drizzle } from 'drizzle-orm/bun-sql';\nimport { authenticatedRole, crudPolicy } from 'drizzle-orm/neon';\nimport { usersSync } from 'drizzle-orm/neon/neon-auth';\nimport type { PgColumn, PgDatabase, PgQueryResultHKT } from 'drizzle-orm/pg-core';\nimport {\n\talias,\n\tbigint,\n\tbigserial,\n\tboolean,\n\tchar,\n\tcidr,\n\tdate,\n\tdoublePrecision,\n\texcept,\n\texceptAll,\n\tforeignKey,\n\tgetMaterializedViewConfig,\n\tgetTableConfig,\n\tgetViewConfig,\n\tindex,\n\tinet,\n\tinteger,\n\tintersect,\n\tintersectAll,\n\tinterval,\n\tjson,\n\tjsonb,\n\tline,\n\tmacaddr,\n\tmacaddr8,\n\tnumeric,\n\tPgDialect,\n\tpgEnum,\n\tpgMaterializedView,\n\tPgPolicy,\n\tpgPolicy,\n\tpgSchema,\n\tpgTable,\n\tpgTableCreator,\n\tpgView,\n\tpoint,\n\tprimaryKey,\n\treal,\n\tserial,\n\tsmallint,\n\tsmallserial,\n\ttext,\n\ttime,\n\ttimestamp,\n\tunion,\n\tunionAll,\n\tunique,\n\tuniqueKeyName,\n\tuuid,\n\tuuid as pgUuid,\n\tvarchar,\n} from 'drizzle-orm/pg-core';\nimport { Expect } from '~/utils';\n\nexport const usersTable = pgTable('users', {\n\tid: serial('id' as string).primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: jsonb('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n});\n\nconst usersOnUpdate = pgTable('users_on_update', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tupdateCounter: integer('update_counter').default(sql`1`).$onUpdateFn(() => sql`update_counter + 1`),\n\tupdatedAt: timestamp('updated_at', { mode: 'date', precision: 3 }).$onUpdate(() => new Date()),\n\talwaysNull: text('always_null').$type<string | null>().$onUpdate(() => null),\n});\n\nconst citiesTable = pgTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tstate: char('state', { length: 2 }),\n});\n\nconst cities2Table = pgTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nconst users2Table = pgTable('users2', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: integer('city_id').references(() => citiesTable.id),\n});\n\nconst coursesTable = pgTable('courses', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcategoryId: integer('category_id').references(() => courseCategoriesTable.id),\n});\n\nconst courseCategoriesTable = pgTable('course_categories', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nconst orders = pgTable('orders', {\n\tid: serial('id').primaryKey(),\n\tregion: text('region').notNull(),\n\tproduct: text('product').notNull().$default(() => 'random_string'),\n\tamount: integer('amount').notNull(),\n\tquantity: integer('quantity').notNull(),\n});\n\nconst network = pgTable('network_table', {\n\tinet: inet('inet').notNull(),\n\tcidr: cidr('cidr').notNull(),\n\tmacaddr: macaddr('macaddr').notNull(),\n\tmacaddr8: macaddr8('macaddr8').notNull(),\n});\n\nconst salEmp = pgTable('sal_emp', {\n\tname: text('name'),\n\tpayByQuarter: integer('pay_by_quarter').array(),\n\tschedule: text('schedule').array().array(),\n});\n\nconst _tictactoe = pgTable('tictactoe', {\n\tsquares: integer('squares').array(3).array(3),\n});\n\nexport const usersMigratorTable = pgTable('users12', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n});\n\n// To test aggregate functions\nconst aggregateTable = pgTable('aggregate_table', {\n\tid: serial('id').notNull(),\n\tname: text('name').notNull(),\n\ta: integer('a'),\n\tb: integer('b'),\n\tc: integer('c'),\n\tnullOnly: integer('null_only'),\n});\n\n// To test another schema and multischema\nexport const mySchema = pgSchema('mySchema');\n\nexport const usersMySchemaTable = mySchema.table('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: jsonb('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n});\n\nconst citiesMySchemaTable = mySchema.table('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tstate: char('state', { length: 2 }),\n});\n\nconst users2MySchemaTable = mySchema.table('users2', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: integer('city_id').references(() => citiesTable.id),\n});\n\nconst jsonTestTable = pgTable('jsontest', {\n\tid: serial('id').primaryKey(),\n\tjson: json('json').$type<{ string: string; number: number }>(),\n\tjsonb: jsonb('jsonb').$type<{ string: string; number: number }>(),\n});\n\nconst en = pgEnum('en', ['enVal1', 'enVal2']);\n\nconst allTypesTable = pgTable('all_types', {\n\tserial: serial('serial'),\n\tbigserial53: bigserial('bigserial53', {\n\t\tmode: 'number',\n\t}),\n\tbigserial64: bigserial('bigserial64', {\n\t\tmode: 'bigint',\n\t}),\n\tint: integer('int'),\n\tbigint53: bigint('bigint53', {\n\t\tmode: 'number',\n\t}),\n\tbigint64: bigint('bigint64', {\n\t\tmode: 'bigint',\n\t}),\n\tbool: boolean('bool'),\n\tchar: char('char'),\n\tcidr: cidr('cidr'),\n\tdate: date('date', {\n\t\tmode: 'date',\n\t}),\n\tdateStr: date('date_str', {\n\t\tmode: 'string',\n\t}),\n\tdouble: doublePrecision('double'),\n\tenum: en('enum'),\n\tinet: inet('inet'),\n\tinterval: interval('interval'),\n\tjson: json('json'),\n\tjsonb: jsonb('jsonb'),\n\tline: line('line', {\n\t\tmode: 'abc',\n\t}),\n\tlineTuple: line('line_tuple', {\n\t\tmode: 'tuple',\n\t}),\n\tmacaddr: macaddr('macaddr'),\n\tmacaddr8: macaddr8('macaddr8'),\n\tnumeric: numeric('numeric'),\n\tnumericNum: numeric('numeric_num', {\n\t\tmode: 'number',\n\t}),\n\tnumericBig: numeric('numeric_big', {\n\t\tmode: 'bigint',\n\t}),\n\tpoint: point('point', {\n\t\tmode: 'xy',\n\t}),\n\tpointTuple: point('point_tuple', {\n\t\tmode: 'tuple',\n\t}),\n\treal: real('real'),\n\tsmallint: smallint('smallint'),\n\tsmallserial: smallserial('smallserial'),\n\ttext: text('text'),\n\ttime: time('time'),\n\ttimestamp: timestamp('timestamp', {\n\t\tmode: 'date',\n\t}),\n\ttimestampTz: timestamp('timestamp_tz', {\n\t\tmode: 'date',\n\t\twithTimezone: true,\n\t}),\n\ttimestampStr: timestamp('timestamp_str', {\n\t\tmode: 'string',\n\t}),\n\ttimestampTzStr: timestamp('timestamp_tz_str', {\n\t\tmode: 'string',\n\t\twithTimezone: true,\n\t}),\n\tuuid: uuid('uuid'),\n\tvarchar: varchar('varchar'),\n\tarrint: integer('arrint').array(),\n\tarrbigint53: bigint('arrbigint53', {\n\t\tmode: 'number',\n\t}).array(),\n\tarrbigint64: bigint('arrbigint64', {\n\t\tmode: 'bigint',\n\t}).array(),\n\tarrbool: boolean('arrbool').array(),\n\tarrchar: char('arrchar').array(),\n\tarrcidr: cidr('arrcidr').array(),\n\tarrdate: date('arrdate', {\n\t\tmode: 'date',\n\t}).array(),\n\tarrdateStr: date('arrdate_str', {\n\t\tmode: 'string',\n\t}).array(),\n\tarrdouble: doublePrecision('arrdouble').array(),\n\tarrenum: en('arrenum').array(),\n\tarrinet: inet('arrinet').array(),\n\tarrinterval: interval('arrinterval').array(),\n\tarrjson: json('arrjson').array(),\n\tarrjsonb: jsonb('arrjsonb').array(),\n\tarrline: line('arrline', {\n\t\tmode: 'abc',\n\t}).array(),\n\tarrlineTuple: line('arrline_tuple', {\n\t\tmode: 'tuple',\n\t}).array(),\n\tarrmacaddr: macaddr('arrmacaddr').array(),\n\tarrmacaddr8: macaddr8('arrmacaddr8').array(),\n\tarrnumeric: numeric('arrnumeric').array(),\n\tarrnumericNum: numeric('arrnumeric_num', {\n\t\tmode: 'number',\n\t}).array(),\n\tarrnumericBig: numeric('arrnumeric_big', {\n\t\tmode: 'bigint',\n\t}).array(),\n\tarrpoint: point('arrpoint', {\n\t\tmode: 'xy',\n\t}).array(),\n\tarrpointTuple: point('arrpoint_tuple', {\n\t\tmode: 'tuple',\n\t}).array(),\n\tarrreal: real('arrreal').array(),\n\tarrsmallint: smallint('arrsmallint').array(),\n\tarrtext: text('arrtext').array(),\n\tarrtime: time('arrtime').array(),\n\tarrtimestamp: timestamp('arrtimestamp', {\n\t\tmode: 'date',\n\t}).array(),\n\tarrtimestampTz: timestamp('arrtimestamp_tz', {\n\t\tmode: 'date',\n\t\twithTimezone: true,\n\t}).array(),\n\tarrtimestampStr: timestamp('arrtimestamp_str', {\n\t\tmode: 'string',\n\t}).array(),\n\tarrtimestampTzStr: timestamp('arrtimestamp_tz_str', {\n\t\tmode: 'string',\n\t\twithTimezone: true,\n\t}).array(),\n\tarruuid: uuid('arruuid').array(),\n\tarrvarchar: varchar('arrvarchar').array(),\n});\n\nlet pgContainer: Docker.Container | undefined;\n\nafterAll(async () => {\n\tawait pgContainer?.stop().catch(console.error);\n});\n\nlet db: BunSQLDatabase;\nlet client: BunSQL;\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['PG_CONNECTION_STRING'];\n\tclient = await retry(async () => {\n\t\t// @ts-expect-error\n\t\tconst connClient = new BunSQL(connectionString, { max: 1 });\n\t\tawait connClient.unsafe(`select 1`);\n\t\treturn connClient;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.end();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: false });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n});\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop schema if exists public cascade`);\n\tawait db.execute(sql`drop schema if exists ${mySchema} cascade`);\n\tawait db.execute(sql`create schema public`);\n\tawait db.execute(sql`create schema if not exists custom_migrations`);\n\tawait db.execute(sql`create schema ${mySchema}`);\n\t// public users\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified boolean not null default false,\n\t\t\t\tjsonb jsonb,\n\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t)\n\t\t`,\n\t);\n\t// public cities\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table cities (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tstate char(2)\n\t\t\t)\n\t\t`,\n\t);\n\t// public users2\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users2 (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tcity_id integer references cities(id)\n\t\t\t)\n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table course_categories (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null\n\t\t\t)\n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table courses (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tcategory_id integer references course_categories(id)\n\t\t\t)\n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table orders (\n\t\t\t\tid serial primary key,\n\t\t\t\tregion text not null,\n\t\t\t\tproduct text not null,\n\t\t\t\tamount integer not null,\n\t\t\t\tquantity integer not null\n\t\t\t)\n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table network_table (\n\t\t\t\tinet inet not null,\n\t\t\t\tcidr cidr not null,\n\t\t\t\tmacaddr macaddr not null,\n\t\t\t\tmacaddr8 macaddr8 not null\n\t\t\t)\n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table sal_emp (\n\t\t\t\tname text not null,\n\t\t\t\tpay_by_quarter integer[] not null,\n\t\t\t\tschedule text[][] not null\n\t\t\t)\n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table tictactoe (\n\t\t\t\tsquares integer[3][3] not null\n\t\t\t)\n\t\t`,\n\t);\n\t// // mySchema users\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${usersMySchemaTable} (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified boolean not null default false,\n\t\t\t\tjsonb jsonb,\n\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t)\n\t\t`,\n\t);\n\t// mySchema cities\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${citiesMySchemaTable} (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tstate char(2)\n\t\t\t)\n\t\t`,\n\t);\n\t// mySchema users2\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${users2MySchemaTable} (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tcity_id integer references \"mySchema\".cities(id)\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table jsontest (\n\t\t\t\tid serial primary key,\n\t\t\t\tjson json,\n\t\t\t\tjsonb jsonb\n\t\t\t)\n\t\t`,\n\t);\n});\n\nafterEach(async () => {\n\tawait db.execute(sql`drop schema if exists custom_migrations cascade`);\n});\n\nasync function setupSetOperationTest(db: PgDatabase<PgQueryResultHKT>) {\n\tawait db.execute(sql`drop table if exists users2`);\n\tawait db.execute(sql`drop table if exists cities`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table cities (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null\n\t\t\t)\n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users2 (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tcity_id integer references cities(id)\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.insert(cities2Table).values([\n\t\t{ id: 1, name: 'New York' },\n\t\t{ id: 2, name: 'London' },\n\t\t{ id: 3, name: 'Tampa' },\n\t]);\n\n\tawait db.insert(users2Table).values([\n\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t{ id: 2, name: 'Jane', cityId: 2 },\n\t\t{ id: 3, name: 'Jack', cityId: 3 },\n\t\t{ id: 4, name: 'Peter', cityId: 3 },\n\t\t{ id: 5, name: 'Ben', cityId: 2 },\n\t\t{ id: 6, name: 'Jill', cityId: 1 },\n\t\t{ id: 7, name: 'Mary', cityId: 2 },\n\t\t{ id: 8, name: 'Sally', cityId: 1 },\n\t]);\n}\n\nasync function setupAggregateFunctionsTest(db: PgDatabase<PgQueryResultHKT>) {\n\tawait db.execute(sql`drop table if exists \"aggregate_table\"`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table \"aggregate_table\" (\n\t\t\t\t\"id\" serial not null,\n\t\t\t\t\"name\" text not null,\n\t\t\t\t\"a\" integer,\n\t\t\t\t\"b\" integer,\n\t\t\t\t\"c\" integer,\n\t\t\t\t\"null_only\" integer\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.insert(aggregateTable).values([\n\t\t{ name: 'value 1', a: 5, b: 10, c: 20 },\n\t\t{ name: 'value 1', a: 5, b: 20, c: 30 },\n\t\t{ name: 'value 2', a: 10, b: 50, c: 60 },\n\t\t{ name: 'value 3', a: 20, b: 20, c: null },\n\t\t{ name: 'value 4', a: null, b: 90, c: 120 },\n\t\t{ name: 'value 5', a: 80, b: 10, c: null },\n\t\t{ name: 'value 6', a: null, b: null, c: 150 },\n\t]);\n}\n\ntest('table configs: unique third param', async () => {\n\tconst cities1Table = pgTable('cities1', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tstate: char('state', { length: 2 }),\n\t}, (t) => ({\n\t\tf: unique('custom_name').on(t.name, t.state).nullsNotDistinct(),\n\t\tf1: unique('custom_name1').on(t.name, t.state),\n\t}));\n\n\tconst tableConfig = getTableConfig(cities1Table);\n\n\texpect(tableConfig.uniqueConstraints).toHaveLength(2);\n\n\texpect(tableConfig.uniqueConstraints[0]?.name).toBe('custom_name');\n\texpect(tableConfig.uniqueConstraints[0]?.nullsNotDistinct).toBe(true);\n\texpect(tableConfig.uniqueConstraints[0]?.columns.map((t) => t.name)).toEqual(['name', 'state']);\n\n\texpect(tableConfig.uniqueConstraints[1]?.name).toBe('custom_name1');\n\texpect(tableConfig.uniqueConstraints[1]?.nullsNotDistinct).toBe(false);\n\texpect(tableConfig.uniqueConstraints[1]?.columns.map((t) => t.name)).toEqual(['name', 'state']);\n});\n\ntest('table configs: unique in column', async () => {\n\tconst cities1Table = pgTable('cities1', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull().unique(),\n\t\tstate: char('state', { length: 2 }).unique('custom'),\n\t\tfield: char('field', { length: 2 }).unique('custom_field', { nulls: 'not distinct' }),\n\t});\n\n\tconst tableConfig = getTableConfig(cities1Table);\n\n\tconst columnName = tableConfig.columns.find((it) => it.name === 'name');\n\n\texpect(columnName?.uniqueName).toBe(uniqueKeyName(cities1Table, [columnName!.name]));\n\texpect(columnName?.isUnique).toBe(true);\n\n\tconst columnState = tableConfig.columns.find((it) => it.name === 'state');\n\texpect(columnState?.uniqueName).toBe('custom');\n\texpect(columnState?.isUnique).toBe(true);\n\n\tconst columnField = tableConfig.columns.find((it) => it.name === 'field');\n\texpect(columnField?.uniqueName).toBe('custom_field');\n\texpect(columnField?.isUnique).toBe(true);\n\texpect(columnField?.uniqueType).toBe('not distinct');\n});\n\ntest('table config: foreign keys name', async () => {\n\tconst table = pgTable('cities', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tstate: text('state'),\n\t}, (t) => ({\n\t\tf: foreignKey({ foreignColumns: [t.id], columns: [t.id], name: 'custom_fk' }),\n\t}));\n\n\tconst tableConfig = getTableConfig(table);\n\n\texpect(tableConfig.foreignKeys).toHaveLength(1);\n\texpect(tableConfig.foreignKeys[0]!.getName()).toBe('custom_fk');\n});\n\ntest('table config: primary keys name', async () => {\n\tconst table = pgTable('cities', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tstate: text('state'),\n\t}, (t) => ({\n\t\tf: primaryKey({ columns: [t.id, t.name], name: 'custom_pk' }),\n\t}));\n\n\tconst tableConfig = getTableConfig(table);\n\n\texpect(tableConfig.primaryKeys).toHaveLength(1);\n\texpect(tableConfig.primaryKeys[0]!.getName()).toBe('custom_pk');\n});\n\ntest('select all fields', async () => {\n\tconst now = Date.now();\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(result[0]!.createdAt.getTime() - now)).toBeLessThan(100);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('select sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.select({\n\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t})\n\t\t.from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('select typed sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\n\tconst users = await db.select({\n\t\tname: sql<string>`upper(${usersTable.name})`,\n\t}).from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('select with empty array in inArray', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\tconst result = await db\n\t\t.select({\n\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t})\n\t\t.from(usersTable)\n\t\t.where(inArray(usersTable.id, []));\n\n\texpect(result).toEqual([]);\n});\n\ntest('select with empty array in notInArray', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\tconst result = await db\n\t\t.select({\n\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t})\n\t\t.from(usersTable)\n\t\t.where(notInArray(usersTable.id, []));\n\n\texpect(result).toEqual([{ name: 'JOHN' }, { name: 'JANE' }, { name: 'JANE' }]);\n});\n\ntest('$default function', async () => {\n\tconst insertedOrder = await db.insert(orders).values({ id: 1, region: 'Ukraine', amount: 1, quantity: 1 })\n\t\t.returning();\n\tconst selectedOrder = await db.select().from(orders);\n\n\texpect(insertedOrder).toEqual([{\n\t\tid: 1,\n\t\tamount: 1,\n\t\tquantity: 1,\n\t\tregion: 'Ukraine',\n\t\tproduct: 'random_string',\n\t}]);\n\n\texpect(selectedOrder).toEqual([{\n\t\tid: 1,\n\t\tamount: 1,\n\t\tquantity: 1,\n\t\tregion: 'Ukraine',\n\t\tproduct: 'random_string',\n\t}]);\n});\n\ntest('select distinct', async () => {\n\tconst usersDistinctTable = pgTable('users_distinct', {\n\t\tid: integer('id').notNull(),\n\t\tname: text('name').notNull(),\n\t\tage: integer('age').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${usersDistinctTable}`);\n\tawait db.execute(sql`create table ${usersDistinctTable} (id integer, name text, age integer)`);\n\n\tawait db.insert(usersDistinctTable).values([\n\t\t{ id: 1, name: 'John', age: 24 },\n\t\t{ id: 1, name: 'John', age: 24 },\n\t\t{ id: 2, name: 'John', age: 25 },\n\t\t{ id: 1, name: 'Jane', age: 24 },\n\t\t{ id: 1, name: 'Jane', age: 26 },\n\t]);\n\tconst users1 = await db.selectDistinct().from(usersDistinctTable).orderBy(\n\t\tusersDistinctTable.id,\n\t\tusersDistinctTable.name,\n\t);\n\tconst users2 = await db.selectDistinctOn([usersDistinctTable.id]).from(usersDistinctTable).orderBy(\n\t\tusersDistinctTable.id,\n\t);\n\tconst users3 = await db.selectDistinctOn([usersDistinctTable.name], { name: usersDistinctTable.name }).from(\n\t\tusersDistinctTable,\n\t).orderBy(usersDistinctTable.name);\n\tconst users4 = await db.selectDistinctOn([usersDistinctTable.id, usersDistinctTable.age]).from(\n\t\tusersDistinctTable,\n\t).orderBy(usersDistinctTable.id, usersDistinctTable.age);\n\n\tawait db.execute(sql`drop table ${usersDistinctTable}`);\n\n\texpect(users1).toEqual([\n\t\t{ id: 1, name: 'Jane', age: 24 },\n\t\t{ id: 1, name: 'Jane', age: 26 },\n\t\t{ id: 1, name: 'John', age: 24 },\n\t\t{ id: 2, name: 'John', age: 25 },\n\t]);\n\n\texpect(users2).toHaveLength(2);\n\texpect(users2[0]?.id).toBe(1);\n\texpect(users2[1]?.id).toBe(2);\n\n\texpect(users3).toHaveLength(2);\n\texpect(users3[0]?.name).toBe('Jane');\n\texpect(users3[1]?.name).toBe('John');\n\n\texpect(users4).toEqual([\n\t\t{ id: 1, name: 'John', age: 24 },\n\t\t{ id: 1, name: 'Jane', age: 26 },\n\t\t{ id: 2, name: 'John', age: 25 },\n\t]);\n});\n\ntest('insert returning sql', async () => {\n\tconst users = await db\n\t\t.insert(usersTable)\n\t\t.values({ name: 'John' })\n\t\t.returning({\n\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t});\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('delete returning sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.delete(usersTable)\n\t\t.where(eq(usersTable.name, 'John'))\n\t\t.returning({\n\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t});\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('update returning sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.update(usersTable)\n\t\t.set({ name: 'Jane' })\n\t\t.where(eq(usersTable.name, 'John'))\n\t\t.returning({\n\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t});\n\n\texpect(users).toEqual([{ name: 'JANE' }]);\n});\n\ntest('update with returning all fields', async () => {\n\tconst now = Date.now();\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.update(usersTable)\n\t\t.set({ name: 'Jane' })\n\t\t.where(eq(usersTable.name, 'John'))\n\t\t.returning();\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(100);\n\texpect(users).toEqual([\n\t\t{ id: 1, name: 'Jane', verified: false, jsonb: null, createdAt: users[0]!.createdAt },\n\t]);\n});\n\ntest('update with returning partial', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.update(usersTable)\n\t\t.set({ name: 'Jane' })\n\t\t.where(eq(usersTable.name, 'John'))\n\t\t.returning({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t});\n\n\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n});\n\ntest('delete with returning all fields', async () => {\n\tconst now = Date.now();\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning();\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(100);\n\texpect(users).toEqual([\n\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: users[0]!.createdAt },\n\t]);\n});\n\ntest('delete with returning partial', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t});\n\n\texpect(users).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert + select', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt },\n\t]);\n\n\tawait db.insert(usersTable).values({ name: 'Jane' });\n\tconst result2 = await db.select().from(usersTable);\n\texpect(result2).toEqual([\n\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result2[0]!.createdAt },\n\t\t{ id: 2, name: 'Jane', verified: false, jsonb: null, createdAt: result2[1]!.createdAt },\n\t]);\n});\n\ntest('json insert', async () => {\n\tawait db.insert(usersTable).values({ name: 'John', jsonb: ['foo', 'bar'] });\n\tconst result = await db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t\tjsonb: usersTable.jsonb,\n\t\t})\n\t\t.from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', jsonb: ['foo', 'bar'] }]);\n});\n\ntest('char insert', async () => {\n\tawait db.insert(citiesTable).values({ name: 'Austin', state: 'TX' });\n\tconst result = await db\n\t\t.select({ id: citiesTable.id, name: citiesTable.name, state: citiesTable.state })\n\t\t.from(citiesTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'Austin', state: 'TX' }]);\n});\n\ntest('char update', async () => {\n\tawait db.insert(citiesTable).values({ name: 'Austin', state: 'TX' });\n\tawait db.update(citiesTable).set({ name: 'Atlanta', state: 'GA' }).where(eq(citiesTable.id, 1));\n\tconst result = await db\n\t\t.select({ id: citiesTable.id, name: citiesTable.name, state: citiesTable.state })\n\t\t.from(citiesTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'Atlanta', state: 'GA' }]);\n});\n\ntest('char delete', async () => {\n\tawait db.insert(citiesTable).values({ name: 'Austin', state: 'TX' });\n\tawait db.delete(citiesTable).where(eq(citiesTable.state, 'TX'));\n\tconst result = await db\n\t\t.select({ id: citiesTable.id, name: citiesTable.name, state: citiesTable.state })\n\t\t.from(citiesTable);\n\n\texpect(result).toEqual([]);\n});\n\ntest('insert with overridden default values', async () => {\n\tawait db.insert(usersTable).values({ name: 'John', verified: true });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', verified: true, jsonb: null, createdAt: result[0]!.createdAt },\n\t]);\n});\n\ntest('insert many', async () => {\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values([\n\t\t\t{ name: 'John' },\n\t\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t\t{ name: 'Jane' },\n\t\t\t{ name: 'Austin', verified: true },\n\t\t]);\n\tconst result = await db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t\tjsonb: usersTable.jsonb,\n\t\t\tverified: usersTable.verified,\n\t\t})\n\t\t.from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t]);\n});\n\ntest('insert many with returning', async () => {\n\tconst result = await db\n\t\t.insert(usersTable)\n\t\t.values([\n\t\t\t{ name: 'John' },\n\t\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t\t{ name: 'Jane' },\n\t\t\t{ name: 'Austin', verified: true },\n\t\t])\n\t\t.returning({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t\tjsonb: usersTable.jsonb,\n\t\t\tverified: usersTable.verified,\n\t\t});\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t]);\n});\n\ntest('select with group by as field', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db\n\t\t.select({ name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.groupBy(usersTable.name);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('select with exists', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst user = alias(usersTable, 'user');\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable).where(\n\t\texists(\n\t\t\tdb.select({ one: sql`1` }).from(user).where(and(eq(usersTable.name, 'John'), eq(user.id, usersTable.id))),\n\t\t),\n\t);\n\n\texpect(result).toEqual([{ name: 'John' }]);\n});\n\ntest('select with group by as sql', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db\n\t\t.select({ name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('select with group by as sql + column', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db\n\t\t.select({ name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`, usersTable.id);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('select with group by as column + sql', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db\n\t\t.select({ name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('select with group by complex query', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db\n\t\t.select({ name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t.orderBy(asc(usersTable.name))\n\t\t.limit(1);\n\n\texpect(result).toEqual([{ name: 'Jane' }]);\n});\n\ntest('build query', async () => {\n\tconst query = db\n\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.groupBy(usersTable.id, usersTable.name)\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\", \"users\".\"name\"',\n\t\tparams: [],\n\t});\n});\n\ntest('insert sql', async () => {\n\tawait db.insert(usersTable).values({ name: sql`${'John'}` });\n\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('partial join with alias', async () => {\n\tconst customerAlias = alias(usersTable, 'customer');\n\n\tawait db.insert(usersTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select({\n\t\t\tuser: {\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t},\n\t\t\tcustomer: {\n\t\t\t\tid: customerAlias.id,\n\t\t\t\tname: customerAlias.name,\n\t\t\t},\n\t\t})\n\t\t.from(usersTable)\n\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t.where(eq(usersTable.id, 10));\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tuser: { id: 10, name: 'Ivan' },\n\t\t\tcustomer: { id: 11, name: 'Hans' },\n\t\t},\n\t]);\n});\n\ntest('full join with alias', async () => {\n\tconst pgTable = pgTableCreator((name) => `prefixed_${name}`);\n\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\tconst customers = alias(users, 'customer');\n\n\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select()\n\t\t.from(users)\n\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t.where(eq(users.id, 10));\n\n\texpect(result).toEqual([{\n\t\tusers: {\n\t\t\tid: 10,\n\t\t\tname: 'Ivan',\n\t\t},\n\t\tcustomer: {\n\t\t\tid: 11,\n\t\t\tname: 'Hans',\n\t\t},\n\t}]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('select from alias', async () => {\n\tconst pgTable = pgTableCreator((name) => `prefixed_${name}`);\n\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\tconst user = alias(users, 'user');\n\tconst customers = alias(users, 'customer');\n\n\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select()\n\t\t.from(user)\n\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t.where(eq(user.id, 10));\n\n\texpect(result).toEqual([{\n\t\tuser: {\n\t\t\tid: 10,\n\t\t\tname: 'Ivan',\n\t\t},\n\t\tcustomer: {\n\t\t\tid: 11,\n\t\t\tname: 'Hans',\n\t\t},\n\t}]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('insert with spaces', async () => {\n\tawait db.insert(usersTable).values({ name: sql`'Jo   h     n'` });\n\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n});\n\ntest('prepared statement', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst statement = db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t})\n\t\t.from(usersTable)\n\t\t.prepare('statement1');\n\tconst result = await statement.execute();\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert: placeholders on columns with encoder', async () => {\n\tconst statement = db.insert(usersTable).values({\n\t\tname: 'John',\n\t\tjsonb: sql.placeholder('jsonb'),\n\t}).prepare('encoder_statement');\n\n\tawait statement.execute({ jsonb: ['foo', 'bar'] });\n\n\tconst result = await db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tjsonb: usersTable.jsonb,\n\t\t})\n\t\t.from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, jsonb: ['foo', 'bar'] },\n\t]);\n});\n\ntest('prepared statement reuse', async () => {\n\tconst stmt = db\n\t\t.insert(usersTable)\n\t\t.values({\n\t\t\tverified: true,\n\t\t\tname: sql.placeholder('name'),\n\t\t})\n\t\t.prepare('stmt2');\n\n\tfor (let i = 0; i < 10; i++) {\n\t\tawait stmt.execute({ name: `John ${i}` });\n\t}\n\n\tconst result = await db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t\tverified: usersTable.verified,\n\t\t})\n\t\t.from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John 0', verified: true },\n\t\t{ id: 2, name: 'John 1', verified: true },\n\t\t{ id: 3, name: 'John 2', verified: true },\n\t\t{ id: 4, name: 'John 3', verified: true },\n\t\t{ id: 5, name: 'John 4', verified: true },\n\t\t{ id: 6, name: 'John 5', verified: true },\n\t\t{ id: 7, name: 'John 6', verified: true },\n\t\t{ id: 8, name: 'John 7', verified: true },\n\t\t{ id: 9, name: 'John 8', verified: true },\n\t\t{ id: 10, name: 'John 9', verified: true },\n\t]);\n});\n\ntest('prepared statement with placeholder in .where', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst stmt = db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t})\n\t\t.from(usersTable)\n\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t.prepare('stmt3');\n\tconst result = await stmt.execute({ id: 1 });\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('prepared statement with placeholder in .limit', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst stmt = db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t})\n\t\t.from(usersTable)\n\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t.limit(sql.placeholder('limit'))\n\t\t.prepare('stmt_limit');\n\n\tconst result = await stmt.execute({ id: 1, limit: 1 });\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\texpect(result).toHaveLength(1);\n});\n\ntest('prepared statement with placeholder in .offset', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]);\n\tconst stmt = db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t})\n\t\t.from(usersTable)\n\t\t.offset(sql.placeholder('offset'))\n\t\t.prepare('stmt_offset');\n\n\tconst result = await stmt.execute({ offset: 1 });\n\n\texpect(result).toEqual([{ id: 2, name: 'John1' }]);\n});\n\ntest('prepared statement built using $dynamic', async () => {\n\tfunction withLimitOffset(qb: any) {\n\t\treturn qb.limit(sql.placeholder('limit')).offset(sql.placeholder('offset'));\n\t}\n\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]);\n\tconst stmt = db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t})\n\t\t.from(usersTable)\n\t\t.$dynamic();\n\twithLimitOffset(stmt).prepare('stmt_limit');\n\n\tconst result = await stmt.execute({ limit: 1, offset: 1 });\n\n\texpect(result).toEqual([{ id: 2, name: 'John1' }]);\n\texpect(result).toHaveLength(1);\n});\n\n// TODO change tests to new structure\ntest('Query check: Insert all defaults in 1 row', async () => {\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').default('Dan'),\n\t\tstate: text('state'),\n\t});\n\n\tconst query = db\n\t\t.insert(users)\n\t\t.values({})\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql: 'insert into \"users\" (\"id\", \"name\", \"state\") values (default, default, default)',\n\t\tparams: [],\n\t});\n});\n\ntest('Query check: Insert all defaults in multiple rows', async () => {\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').default('Dan'),\n\t\tstate: text('state').default('UA'),\n\t});\n\n\tconst query = db\n\t\t.insert(users)\n\t\t.values([{}, {}])\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql: 'insert into \"users\" (\"id\", \"name\", \"state\") values (default, default, default), (default, default, default)',\n\t\tparams: [],\n\t});\n});\n\ntest('Insert all defaults in 1 row', async () => {\n\tconst users = pgTable('empty_insert_single', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').default('Dan'),\n\t\tstate: text('state'),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial primary key, name text default 'Dan', state text)`,\n\t);\n\n\tawait db.insert(users).values({});\n\n\tconst res = await db.select().from(users);\n\n\texpect(res).toEqual([{ id: 1, name: 'Dan', state: null }]);\n});\n\ntest('Insert all defaults in multiple rows', async () => {\n\tconst users = pgTable('empty_insert_multiple', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').default('Dan'),\n\t\tstate: text('state'),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial primary key, name text default 'Dan', state text)`,\n\t);\n\n\tawait db.insert(users).values([{}, {}]);\n\n\tconst res = await db.select().from(users);\n\n\texpect(res).toEqual([{ id: 1, name: 'Dan', state: null }, { id: 2, name: 'Dan', state: null }]);\n});\n\ntest('build query insert with onConflict do update', async () => {\n\tconst query = db\n\t\t.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoUpdate({ target: usersTable.id, set: { name: 'John1' } })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\") do update set \"name\" = $3',\n\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t});\n});\n\ntest('build query insert with onConflict do update / multiple columns', async () => {\n\tconst query = db\n\t\t.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoUpdate({ target: [usersTable.id, usersTable.name], set: { name: 'John1' } })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\",\"name\") do update set \"name\" = $3',\n\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t});\n});\n\ntest('build query insert with onConflict do nothing', async () => {\n\tconst query = db\n\t\t.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoNothing()\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict do nothing',\n\t\tparams: ['John', '[\"foo\",\"bar\"]'],\n\t});\n});\n\ntest('build query insert with onConflict do nothing + target', async () => {\n\tconst query = db\n\t\t.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoNothing({ target: usersTable.id })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\") do nothing',\n\t\tparams: ['John', '[\"foo\",\"bar\"]'],\n\t});\n});\n\ntest('insert with onConflict do update', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' })\n\t\t.onConflictDoUpdate({ target: usersTable.id, set: { name: 'John1' } });\n\n\tconst res = await db\n\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.where(eq(usersTable.id, 1));\n\n\texpect(res).toEqual([{ id: 1, name: 'John1' }]);\n});\n\ntest('insert with onConflict do nothing', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\n\tawait db.insert(usersTable).values({ id: 1, name: 'John' }).onConflictDoNothing();\n\n\tconst res = await db\n\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.where(eq(usersTable.id, 1));\n\n\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert with onConflict do nothing + target', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' })\n\t\t.onConflictDoNothing({ target: usersTable.id });\n\n\tconst res = await db\n\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.where(eq(usersTable.id, 1));\n\n\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('left join (flat object fields)', async () => {\n\tconst { id: cityId } = await db\n\t\t.insert(citiesTable)\n\t\t.values([{ name: 'Paris' }, { name: 'London' }])\n\t\t.returning({ id: citiesTable.id })\n\t\t.then((rows) => rows[0]!);\n\n\tawait db.insert(users2Table).values([{ name: 'John', cityId }, { name: 'Jane' }]);\n\n\tconst res = await db\n\t\t.select({\n\t\t\tuserId: users2Table.id,\n\t\t\tuserName: users2Table.name,\n\t\t\tcityId: citiesTable.id,\n\t\t\tcityName: citiesTable.name,\n\t\t})\n\t\t.from(users2Table)\n\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id));\n\n\texpect(res).toEqual([\n\t\t{ userId: 1, userName: 'John', cityId, cityName: 'Paris' },\n\t\t{ userId: 2, userName: 'Jane', cityId: null, cityName: null },\n\t]);\n});\n\ntest('left join (grouped fields)', async () => {\n\tconst { id: cityId } = await db\n\t\t.insert(citiesTable)\n\t\t.values([{ name: 'Paris' }, { name: 'London' }])\n\t\t.returning({ id: citiesTable.id })\n\t\t.then((rows) => rows[0]!);\n\n\tawait db.insert(users2Table).values([{ name: 'John', cityId }, { name: 'Jane' }]);\n\n\tconst res = await db\n\t\t.select({\n\t\t\tid: users2Table.id,\n\t\t\tuser: {\n\t\t\t\tname: users2Table.name,\n\t\t\t\tnameUpper: sql<string>`upper(${users2Table.name})`,\n\t\t\t},\n\t\t\tcity: {\n\t\t\t\tid: citiesTable.id,\n\t\t\t\tname: citiesTable.name,\n\t\t\t\tnameUpper: sql<string>`upper(${citiesTable.name})`,\n\t\t\t},\n\t\t})\n\t\t.from(users2Table)\n\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id));\n\n\texpect(res).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\tuser: { name: 'John', nameUpper: 'JOHN' },\n\t\t\tcity: { id: cityId, name: 'Paris', nameUpper: 'PARIS' },\n\t\t},\n\t\t{\n\t\t\tid: 2,\n\t\t\tuser: { name: 'Jane', nameUpper: 'JANE' },\n\t\t\tcity: null,\n\t\t},\n\t]);\n});\n\ntest('left join (all fields)', async () => {\n\tconst { id: cityId } = await db\n\t\t.insert(citiesTable)\n\t\t.values([{ name: 'Paris' }, { name: 'London' }])\n\t\t.returning({ id: citiesTable.id })\n\t\t.then((rows) => rows[0]!);\n\n\tawait db.insert(users2Table).values([{ name: 'John', cityId }, { name: 'Jane' }]);\n\n\tconst res = await db\n\t\t.select()\n\t\t.from(users2Table)\n\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id));\n\n\texpect(res).toEqual([\n\t\t{\n\t\t\tusers2: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tcityId,\n\t\t\t},\n\t\t\tcities: {\n\t\t\t\tid: cityId,\n\t\t\t\tname: 'Paris',\n\t\t\t\tstate: null,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tusers2: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Jane',\n\t\t\t\tcityId: null,\n\t\t\t},\n\t\t\tcities: null,\n\t\t},\n\t]);\n});\n\ntest('join subquery', async () => {\n\tawait db\n\t\t.insert(courseCategoriesTable)\n\t\t.values([\n\t\t\t{ name: 'Category 1' },\n\t\t\t{ name: 'Category 2' },\n\t\t\t{ name: 'Category 3' },\n\t\t\t{ name: 'Category 4' },\n\t\t]);\n\n\tawait db\n\t\t.insert(coursesTable)\n\t\t.values([\n\t\t\t{ name: 'Development', categoryId: 2 },\n\t\t\t{ name: 'IT & Software', categoryId: 3 },\n\t\t\t{ name: 'Marketing', categoryId: 4 },\n\t\t\t{ name: 'Design', categoryId: 1 },\n\t\t]);\n\n\tconst sq2 = db\n\t\t.select({\n\t\t\tcategoryId: courseCategoriesTable.id,\n\t\t\tcategory: courseCategoriesTable.name,\n\t\t\ttotal: sql<number>`count(${courseCategoriesTable.id})`,\n\t\t})\n\t\t.from(courseCategoriesTable)\n\t\t.groupBy(courseCategoriesTable.id, courseCategoriesTable.name)\n\t\t.as('sq2');\n\n\tconst res = await db\n\t\t.select({\n\t\t\tcourseName: coursesTable.name,\n\t\t\tcategoryId: sq2.categoryId,\n\t\t})\n\t\t.from(coursesTable)\n\t\t.leftJoin(sq2, eq(coursesTable.categoryId, sq2.categoryId))\n\t\t.orderBy(coursesTable.name);\n\n\texpect(res).toEqual([\n\t\t{ courseName: 'Design', categoryId: 1 },\n\t\t{ courseName: 'Development', categoryId: 2 },\n\t\t{ courseName: 'IT & Software', categoryId: 3 },\n\t\t{ courseName: 'Marketing', categoryId: 4 },\n\t]);\n});\n\ntest('with ... select', async () => {\n\tawait db.insert(orders).values([\n\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t]);\n\n\tconst regionalSales = db\n\t\t.$with('regional_sales')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.groupBy(orders.region),\n\t\t);\n\n\tconst topRegions = db\n\t\t.$with('top_regions')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: regionalSales.region,\n\t\t\t\t})\n\t\t\t\t.from(regionalSales)\n\t\t\t\t.where(\n\t\t\t\t\tgt(\n\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\tdb.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t);\n\n\tconst result1 = await db\n\t\t.with(regionalSales, topRegions)\n\t\t.select({\n\t\t\tregion: orders.region,\n\t\t\tproduct: orders.product,\n\t\t\tproductUnits: sql<number>`sum(${orders.quantity})::int`,\n\t\t\tproductSales: sql<number>`sum(${orders.amount})::int`,\n\t\t})\n\t\t.from(orders)\n\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t.groupBy(orders.region, orders.product)\n\t\t.orderBy(orders.region, orders.product);\n\tconst result2 = await db\n\t\t.with(regionalSales, topRegions)\n\t\t.selectDistinct({\n\t\t\tregion: orders.region,\n\t\t\tproduct: orders.product,\n\t\t\tproductUnits: sql<number>`sum(${orders.quantity})::int`,\n\t\t\tproductSales: sql<number>`sum(${orders.amount})::int`,\n\t\t})\n\t\t.from(orders)\n\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t.groupBy(orders.region, orders.product)\n\t\t.orderBy(orders.region, orders.product);\n\tconst result3 = await db\n\t\t.with(regionalSales, topRegions)\n\t\t.selectDistinctOn([orders.region], {\n\t\t\tregion: orders.region,\n\t\t\tproductUnits: sql<number>`sum(${orders.quantity})::int`,\n\t\t\tproductSales: sql<number>`sum(${orders.amount})::int`,\n\t\t})\n\t\t.from(orders)\n\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t.groupBy(orders.region)\n\t\t.orderBy(orders.region);\n\n\texpect(result1).toEqual([\n\t\t{\n\t\t\tregion: 'Europe',\n\t\t\tproduct: 'A',\n\t\t\tproductUnits: 3,\n\t\t\tproductSales: 30,\n\t\t},\n\t\t{\n\t\t\tregion: 'Europe',\n\t\t\tproduct: 'B',\n\t\t\tproductUnits: 5,\n\t\t\tproductSales: 50,\n\t\t},\n\t\t{\n\t\t\tregion: 'US',\n\t\t\tproduct: 'A',\n\t\t\tproductUnits: 7,\n\t\t\tproductSales: 70,\n\t\t},\n\t\t{\n\t\t\tregion: 'US',\n\t\t\tproduct: 'B',\n\t\t\tproductUnits: 9,\n\t\t\tproductSales: 90,\n\t\t},\n\t]);\n\texpect(result2).toEqual(result1);\n\texpect(result3).toEqual([\n\t\t{\n\t\t\tregion: 'Europe',\n\t\t\tproductUnits: 8,\n\t\t\tproductSales: 80,\n\t\t},\n\t\t{\n\t\t\tregion: 'US',\n\t\t\tproductUnits: 16,\n\t\t\tproductSales: 160,\n\t\t},\n\t]);\n});\n\ntest('with ... update', async () => {\n\tconst products = pgTable('products', {\n\t\tid: serial('id').primaryKey(),\n\t\tprice: numeric('price').notNull(),\n\t\tcheap: boolean('cheap').notNull().default(false),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${products}`);\n\tawait db.execute(sql`\n\t\tcreate table ${products} (\n\t\t\tid serial primary key,\n\t\t\tprice numeric not null,\n\t\t\tcheap boolean not null default false\n\t\t)\n\t`);\n\n\tawait db.insert(products).values([\n\t\t{ price: '10.99' },\n\t\t{ price: '25.85' },\n\t\t{ price: '32.99' },\n\t\t{ price: '2.50' },\n\t\t{ price: '4.59' },\n\t]);\n\n\tconst averagePrice = db\n\t\t.$with('average_price')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tvalue: sql`avg(${products.price})`.as('value'),\n\t\t\t\t})\n\t\t\t\t.from(products),\n\t\t);\n\n\tconst result = await db\n\t\t.with(averagePrice)\n\t\t.update(products)\n\t\t.set({\n\t\t\tcheap: true,\n\t\t})\n\t\t.where(lt(products.price, sql`(select * from ${averagePrice})`))\n\t\t.returning({\n\t\t\tid: products.id,\n\t\t});\n\n\texpect(result).toEqual([\n\t\t{ id: 1 },\n\t\t{ id: 4 },\n\t\t{ id: 5 },\n\t]);\n});\n\ntest('with ... insert', async () => {\n\tconst users = pgTable('users', {\n\t\tusername: text('username').notNull(),\n\t\tadmin: boolean('admin').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (username text not null, admin boolean not null default false)`);\n\n\tconst userCount = db\n\t\t.$with('user_count')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tvalue: sql`count(*)`.as('value'),\n\t\t\t\t})\n\t\t\t\t.from(users),\n\t\t);\n\n\tconst result = await db\n\t\t.with(userCount)\n\t\t.insert(users)\n\t\t.values([\n\t\t\t{ username: 'user1', admin: sql`((select * from ${userCount}) = 0)` },\n\t\t])\n\t\t.returning({\n\t\t\tadmin: users.admin,\n\t\t});\n\n\texpect(result).toEqual([{ admin: true }]);\n});\n\ntest('with ... delete', async () => {\n\tawait db.insert(orders).values([\n\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t]);\n\n\tconst averageAmount = db\n\t\t.$with('average_amount')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tvalue: sql`avg(${orders.amount})`.as('value'),\n\t\t\t\t})\n\t\t\t\t.from(orders),\n\t\t);\n\n\tconst result = await db\n\t\t.with(averageAmount)\n\t\t.delete(orders)\n\t\t.where(gt(orders.amount, sql`(select * from ${averageAmount})`))\n\t\t.returning({\n\t\t\tid: orders.id,\n\t\t});\n\n\texpect(result).toEqual([\n\t\t{ id: 6 },\n\t\t{ id: 7 },\n\t\t{ id: 8 },\n\t]);\n});\n\ntest('select from subquery sql', async () => {\n\tawait db.insert(users2Table).values([{ name: 'John' }, { name: 'Jane' }]);\n\n\tconst sq = db\n\t\t.select({ name: sql<string>`${users2Table.name} || ' modified'`.as('name') })\n\t\t.from(users2Table)\n\t\t.as('sq');\n\n\tconst res = await db.select({ name: sq.name }).from(sq);\n\n\texpect(res).toEqual([{ name: 'John modified' }, { name: 'Jane modified' }]);\n});\n\ntest('select a field without joining its table', () => {\n\texpect(() => db.select({ name: users2Table.name }).from(usersTable).prepare('query')).toThrowError();\n});\n\ntest('select all fields from subquery without alias', () => {\n\tconst sq = db.$with('sq').as(db.select({ name: sql<string>`upper(${users2Table.name})` }).from(users2Table));\n\n\texpect(() => db.select().from(sq).prepare('query')).toThrowError();\n});\n\ntest('select count()', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }]);\n\n\tconst res = await db.select({ count: sql`count(*)` }).from(usersTable);\n\n\texpect(res).toEqual([{ count: '2' }]);\n});\n\ntest('select count w/ custom mapper', async () => {\n\tfunction count(value: PgColumn | SQLWrapper): SQL<number>;\n\tfunction count(value: PgColumn | SQLWrapper, alias: string): SQL.Aliased<number>;\n\tfunction count(value: PgColumn | SQLWrapper, alias?: string): SQL<number> | SQL.Aliased<number> {\n\t\tconst result = sql`count(${value})`.mapWith(Number);\n\t\tif (!alias) {\n\t\t\treturn result;\n\t\t}\n\t\treturn result.as(alias);\n\t}\n\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }]);\n\n\tconst res = await db.select({ count: count(sql`*`) }).from(usersTable);\n\n\texpect(res).toEqual([{ count: 2 }]);\n});\n\ntest('network types', async () => {\n\tconst value: typeof network.$inferSelect = {\n\t\tinet: '127.0.0.1',\n\t\tcidr: '192.168.100.128/25',\n\t\tmacaddr: '08:00:2b:01:02:03',\n\t\tmacaddr8: '08:00:2b:01:02:03:04:05',\n\t};\n\n\tawait db.insert(network).values(value);\n\n\tconst res = await db.select().from(network);\n\n\texpect(res).toEqual([value]);\n});\n\ntest.skip('array types', async () => {\n\tconst values: typeof salEmp.$inferSelect[] = [\n\t\t{\n\t\t\tname: 'John',\n\t\t\tpayByQuarter: [10000, 10000, 10000, 10000],\n\t\t\tschedule: [['meeting', 'lunch'], ['training', 'presentation']],\n\t\t},\n\t\t{\n\t\t\tname: 'Carol',\n\t\t\tpayByQuarter: [20000, 25000, 25000, 25000],\n\t\t\tschedule: [['breakfast', 'consulting'], ['meeting', 'lunch']],\n\t\t},\n\t];\n\n\tawait db.insert(salEmp).values(values);\n\n\tconst res = await db.select().from(salEmp);\n\n\texpect(res).toEqual(values);\n});\n\ntest('select for ...', () => {\n\t{\n\t\tconst query = db\n\t\t\t.select()\n\t\t\t.from(users2Table)\n\t\t\t.for('update')\n\t\t\t.toSQL();\n\n\t\texpect(query.sql).toMatch(/ for update$/);\n\t}\n\n\t{\n\t\tconst query = db\n\t\t\t.select()\n\t\t\t.from(users2Table)\n\t\t\t.for('update', { of: [users2Table, coursesTable] })\n\t\t\t.toSQL();\n\n\t\texpect(query.sql).toMatch(/ for update of \"users2\", \"courses\"$/);\n\t}\n\n\t{\n\t\tconst query = db\n\t\t\t.select()\n\t\t\t.from(users2Table)\n\t\t\t.for('no key update', { of: users2Table })\n\t\t\t.toSQL();\n\n\t\texpect(query.sql).toMatch(/for no key update of \"users2\"$/);\n\t}\n\n\t{\n\t\tconst query = db\n\t\t\t.select()\n\t\t\t.from(users2Table)\n\t\t\t.for('no key update', { of: users2Table, skipLocked: true })\n\t\t\t.toSQL();\n\n\t\texpect(query.sql).toMatch(/ for no key update of \"users2\" skip locked$/);\n\t}\n\n\t{\n\t\tconst query = db\n\t\t\t.select()\n\t\t\t.from(users2Table)\n\t\t\t.for('share', { of: users2Table, noWait: true })\n\t\t\t.toSQL();\n\n\t\texpect(query.sql).toMatch(/for share of \"users2\" nowait$/);\n\t}\n});\n\ntest('having', async () => {\n\tawait db.insert(citiesTable).values([{ name: 'London' }, { name: 'Paris' }, { name: 'New York' }]);\n\n\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane', cityId: 1 }, {\n\t\tname: 'Jack',\n\t\tcityId: 2,\n\t}]);\n\n\tconst result = await db\n\t\t.select({\n\t\t\tid: citiesTable.id,\n\t\t\tname: sql<string>`upper(${citiesTable.name})`.as('upper_name'),\n\t\t\tusersCount: sql<number>`count(${users2Table.id})::int`.as('users_count'),\n\t\t})\n\t\t.from(citiesTable)\n\t\t.leftJoin(users2Table, eq(users2Table.cityId, citiesTable.id))\n\t\t.where(({ name }) => sql`length(${name}) >= 3`)\n\t\t.groupBy(citiesTable.id)\n\t\t.having(({ usersCount }) => sql`${usersCount} > 0`)\n\t\t.orderBy(({ name }) => name);\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\tname: 'LONDON',\n\t\t\tusersCount: 2,\n\t\t},\n\t\t{\n\t\t\tid: 2,\n\t\t\tname: 'PARIS',\n\t\t\tusersCount: 1,\n\t\t},\n\t]);\n});\n\ntest('view', async () => {\n\tconst newYorkers1 = pgView('new_yorkers')\n\t\t.as((qb) => qb.select().from(users2Table).where(eq(users2Table.cityId, 1)));\n\n\tconst newYorkers2 = pgView('new_yorkers', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: integer('city_id').notNull(),\n\t}).as(sql`select * from ${users2Table} where ${eq(users2Table.cityId, 1)}`);\n\n\tconst newYorkers3 = pgView('new_yorkers', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: integer('city_id').notNull(),\n\t}).existing();\n\n\tawait db.execute(sql`create view ${newYorkers1} as ${getViewConfig(newYorkers1).query}`);\n\n\tawait db.insert(citiesTable).values([{ name: 'New York' }, { name: 'Paris' }]);\n\n\tawait db.insert(users2Table).values([\n\t\t{ name: 'John', cityId: 1 },\n\t\t{ name: 'Jane', cityId: 1 },\n\t\t{ name: 'Jack', cityId: 2 },\n\t]);\n\n\t{\n\t\tconst result = await db.select().from(newYorkers1);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select().from(newYorkers2);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select().from(newYorkers3);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1);\n\t\texpect(result).toEqual([\n\t\t\t{ name: 'John' },\n\t\t\t{ name: 'Jane' },\n\t\t]);\n\t}\n\n\tawait db.execute(sql`drop view ${newYorkers1}`);\n});\n\n// NEXT\ntest('materialized view', async () => {\n\tconst newYorkers1 = pgMaterializedView('new_yorkers')\n\t\t.as((qb) => qb.select().from(users2Table).where(eq(users2Table.cityId, 1)));\n\n\tconst newYorkers2 = pgMaterializedView('new_yorkers', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: integer('city_id').notNull(),\n\t}).as(sql`select * from ${users2Table} where ${eq(users2Table.cityId, 1)}`);\n\n\tconst newYorkers3 = pgMaterializedView('new_yorkers', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: integer('city_id').notNull(),\n\t}).existing();\n\n\tawait db.execute(sql`create materialized view ${newYorkers1} as ${getMaterializedViewConfig(newYorkers1).query}`);\n\n\tawait db.insert(citiesTable).values([{ name: 'New York' }, { name: 'Paris' }]);\n\n\tawait db.insert(users2Table).values([\n\t\t{ name: 'John', cityId: 1 },\n\t\t{ name: 'Jane', cityId: 1 },\n\t\t{ name: 'Jack', cityId: 2 },\n\t]);\n\n\t{\n\t\tconst result = await db.select().from(newYorkers1);\n\t\texpect(result).toEqual([]);\n\t}\n\n\tawait db.refreshMaterializedView(newYorkers1);\n\n\t{\n\t\tconst result = await db.select().from(newYorkers1);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select().from(newYorkers2);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select().from(newYorkers3);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1);\n\t\texpect(result).toEqual([\n\t\t\t{ name: 'John' },\n\t\t\t{ name: 'Jane' },\n\t\t]);\n\t}\n\n\tawait db.execute(sql`drop materialized view ${newYorkers1}`);\n});\n\ntest('select from existing view', async () => {\n\tconst schema = pgSchema('test_schema');\n\n\tconst newYorkers = schema.view('new_yorkers', {\n\t\tid: integer('id').notNull(),\n\t}).existing();\n\n\tawait db.execute(sql`drop schema if exists ${schema} cascade`);\n\tawait db.execute(sql`create schema ${schema}`);\n\tawait db.execute(sql`create view ${newYorkers} as select id from ${usersTable}`);\n\n\tawait db.insert(usersTable).values({ id: 100, name: 'John' });\n\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t}).from(usersTable).innerJoin(newYorkers, eq(newYorkers.id, usersTable.id));\n\n\texpect(result).toEqual([{ id: 100 }]);\n});\n\n// TODO: copy to SQLite and MySQL, add to docs\ntest('select from raw sql', async () => {\n\tconst result = await db.select({\n\t\tid: sql<number>`id`,\n\t\tname: sql<string>`name`,\n\t}).from(sql`(select 1 as id, 'John' as name) as users`);\n\n\tExpect<Equal<{ id: number; name: string }[], typeof result>>;\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John' },\n\t]);\n});\n\ntest('select from raw sql with joins', async () => {\n\tconst result = await db\n\t\t.select({\n\t\t\tid: sql<number>`users.id`,\n\t\t\tname: sql<string>`users.name`,\n\t\t\tuserCity: sql<string>`users.city`,\n\t\t\tcityName: sql<string>`cities.name`,\n\t\t})\n\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, sql`cities.id = users.id`);\n\n\tExpect<Equal<{ id: number; name: string; userCity: string; cityName: string }[], typeof result>>;\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', userCity: 'New York', cityName: 'Paris' },\n\t]);\n});\n\ntest('join on aliased sql from select', async () => {\n\tconst result = await db\n\t\t.select({\n\t\t\tuserId: sql<number>`users.id`.as('userId'),\n\t\t\tname: sql<string>`users.name`,\n\t\t\tuserCity: sql<string>`users.city`,\n\t\t\tcityId: sql<number>`cities.id`.as('cityId'),\n\t\t\tcityName: sql<string>`cities.name`,\n\t\t})\n\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, (cols) => eq(cols.cityId, cols.userId));\n\n\tExpect<\n\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t>;\n\n\texpect(result).toEqual([\n\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t]);\n});\n\ntest('join on aliased sql from with clause', async () => {\n\tconst users = db.$with('users').as(\n\t\tdb.select({\n\t\t\tid: sql<number>`id`.as('userId'),\n\t\t\tname: sql<string>`name`.as('userName'),\n\t\t\tcity: sql<string>`city`.as('city'),\n\t\t}).from(\n\t\t\tsql`(select 1 as id, 'John' as name, 'New York' as city) as users`,\n\t\t),\n\t);\n\n\tconst cities = db.$with('cities').as(\n\t\tdb.select({\n\t\t\tid: sql<number>`id`.as('cityId'),\n\t\t\tname: sql<string>`name`.as('cityName'),\n\t\t}).from(\n\t\t\tsql`(select 1 as id, 'Paris' as name) as cities`,\n\t\t),\n\t);\n\n\tconst result = await db\n\t\t.with(users, cities)\n\t\t.select({\n\t\t\tuserId: users.id,\n\t\t\tname: users.name,\n\t\t\tuserCity: users.city,\n\t\t\tcityId: cities.id,\n\t\t\tcityName: cities.name,\n\t\t})\n\t\t.from(users)\n\t\t.leftJoin(cities, (cols) => eq(cols.cityId, cols.userId));\n\n\tExpect<\n\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t>;\n\n\texpect(result).toEqual([\n\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t]);\n});\n\ntest('prefixed table', async () => {\n\tconst pgTable = pgTableCreator((name) => `myprefix_${name}`);\n\n\tconst users = pgTable('test_prefixed_table_with_unique_name', {\n\t\tid: integer('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table myprefix_test_prefixed_table_with_unique_name (id integer not null primary key, name text not null)`,\n\t);\n\n\tawait db.insert(users).values({ id: 1, name: 'John' });\n\n\tconst result = await db.select().from(users);\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('select from enum', async () => {\n\tconst muscleEnum = pgEnum('muscle', [\n\t\t'abdominals',\n\t\t'hamstrings',\n\t\t'adductors',\n\t\t'quadriceps',\n\t\t'biceps',\n\t\t'shoulders',\n\t\t'chest',\n\t\t'middle_back',\n\t\t'calves',\n\t\t'glutes',\n\t\t'lower_back',\n\t\t'lats',\n\t\t'triceps',\n\t\t'traps',\n\t\t'forearms',\n\t\t'neck',\n\t\t'abductors',\n\t]);\n\n\tconst forceEnum = pgEnum('force', ['isometric', 'isotonic', 'isokinetic']);\n\n\tconst levelEnum = pgEnum('level', ['beginner', 'intermediate', 'advanced']);\n\n\tconst mechanicEnum = pgEnum('mechanic', ['compound', 'isolation']);\n\n\tconst equipmentEnum = pgEnum('equipment', [\n\t\t'barbell',\n\t\t'dumbbell',\n\t\t'bodyweight',\n\t\t'machine',\n\t\t'cable',\n\t\t'kettlebell',\n\t]);\n\n\tconst categoryEnum = pgEnum('category', ['upper_body', 'lower_body', 'full_body']);\n\n\tconst exercises = pgTable('exercises', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: varchar('name').notNull(),\n\t\tforce: forceEnum('force'),\n\t\tlevel: levelEnum('level'),\n\t\tmechanic: mechanicEnum('mechanic'),\n\t\tequipment: equipmentEnum('equipment'),\n\t\tinstructions: text('instructions'),\n\t\tcategory: categoryEnum('category'),\n\t\tprimaryMuscles: muscleEnum('primary_muscles').array(),\n\t\tsecondaryMuscles: muscleEnum('secondary_muscles').array(),\n\t\tcreatedAt: timestamp('created_at').notNull().default(sql`now()`),\n\t\tupdatedAt: timestamp('updated_at').notNull().default(sql`now()`),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${exercises}`);\n\tawait db.execute(sql`drop type if exists ${sql.identifier(muscleEnum.enumName)}`);\n\tawait db.execute(sql`drop type if exists ${sql.identifier(forceEnum.enumName)}`);\n\tawait db.execute(sql`drop type if exists ${sql.identifier(levelEnum.enumName)}`);\n\tawait db.execute(sql`drop type if exists ${sql.identifier(mechanicEnum.enumName)}`);\n\tawait db.execute(sql`drop type if exists ${sql.identifier(equipmentEnum.enumName)}`);\n\tawait db.execute(sql`drop type if exists ${sql.identifier(categoryEnum.enumName)}`);\n\n\tawait db.execute(\n\t\tsql`create type ${\n\t\t\tsql.identifier(muscleEnum.enumName)\n\t\t} as enum ('abdominals', 'hamstrings', 'adductors', 'quadriceps', 'biceps', 'shoulders', 'chest', 'middle_back', 'calves', 'glutes', 'lower_back', 'lats', 'triceps', 'traps', 'forearms', 'neck', 'abductors')`,\n\t);\n\tawait db.execute(\n\t\tsql`create type ${sql.identifier(forceEnum.enumName)} as enum ('isometric', 'isotonic', 'isokinetic')`,\n\t);\n\tawait db.execute(\n\t\tsql`create type ${sql.identifier(levelEnum.enumName)} as enum ('beginner', 'intermediate', 'advanced')`,\n\t);\n\tawait db.execute(sql`create type ${sql.identifier(mechanicEnum.enumName)} as enum ('compound', 'isolation')`);\n\tawait db.execute(\n\t\tsql`create type ${\n\t\t\tsql.identifier(equipmentEnum.enumName)\n\t\t} as enum ('barbell', 'dumbbell', 'bodyweight', 'machine', 'cable', 'kettlebell')`,\n\t);\n\tawait db.execute(\n\t\tsql`create type ${sql.identifier(categoryEnum.enumName)} as enum ('upper_body', 'lower_body', 'full_body')`,\n\t);\n\tawait db.execute(sql`\n\t\tcreate table ${exercises} (\n\t\t\tid serial primary key,\n\t\t\tname varchar not null,\n\t\t\tforce force,\n\t\t\tlevel level,\n\t\t\tmechanic mechanic,\n\t\t\tequipment equipment,\n\t\t\tinstructions text,\n\t\t\tcategory category,\n\t\t\tprimary_muscles muscle[],\n\t\t\tsecondary_muscles muscle[],\n\t\t\tcreated_at timestamp not null default now(),\n\t\t\tupdated_at timestamp not null default now()\n\t\t)\n\t`);\n\n\tawait db.insert(exercises).values({\n\t\tname: 'Bench Press',\n\t\tforce: 'isotonic',\n\t\tlevel: 'beginner',\n\t\tmechanic: 'compound',\n\t\tequipment: 'barbell',\n\t\tinstructions:\n\t\t\t'Lie on your back on a flat bench. Grasp the barbell with an overhand grip, slightly wider than shoulder width. Unrack the barbell and hold it over you with your arms locked. Lower the barbell to your chest. Press the barbell back to the starting position.',\n\t\tcategory: 'upper_body',\n\t\tprimaryMuscles: ['chest', 'triceps'],\n\t\tsecondaryMuscles: ['shoulders', 'traps'],\n\t});\n\n\tconst result = await db.select().from(exercises);\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\tname: 'Bench Press',\n\t\t\tforce: 'isotonic',\n\t\t\tlevel: 'beginner',\n\t\t\tmechanic: 'compound',\n\t\t\tequipment: 'barbell',\n\t\t\tinstructions:\n\t\t\t\t'Lie on your back on a flat bench. Grasp the barbell with an overhand grip, slightly wider than shoulder width. Unrack the barbell and hold it over you with your arms locked. Lower the barbell to your chest. Press the barbell back to the starting position.',\n\t\t\tcategory: 'upper_body',\n\t\t\tprimaryMuscles: ['chest', 'triceps'],\n\t\t\tsecondaryMuscles: ['shoulders', 'traps'],\n\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t\tupdatedAt: result[0]!.updatedAt,\n\t\t},\n\t]);\n\n\tawait db.execute(sql`drop table ${exercises}`);\n\tawait db.execute(sql`drop type ${sql.identifier(muscleEnum.enumName)}`);\n\tawait db.execute(sql`drop type ${sql.identifier(forceEnum.enumName)}`);\n\tawait db.execute(sql`drop type ${sql.identifier(levelEnum.enumName)}`);\n\tawait db.execute(sql`drop type ${sql.identifier(mechanicEnum.enumName)}`);\n\tawait db.execute(sql`drop type ${sql.identifier(equipmentEnum.enumName)}`);\n\tawait db.execute(sql`drop type ${sql.identifier(categoryEnum.enumName)}`);\n});\n\ntest.skip('all date and time columns', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\tdateString: date('date_string', { mode: 'string' }).notNull(),\n\t\ttime: time('time', { precision: 3 }).notNull(),\n\t\tdatetime: timestamp('datetime').notNull(),\n\t\tdatetimeWTZ: timestamp('datetime_wtz', { withTimezone: true }).notNull(),\n\t\tdatetimeString: timestamp('datetime_string', { mode: 'string' }).notNull(),\n\t\tdatetimeFullPrecision: timestamp('datetime_full_precision', { precision: 6, mode: 'string' }).notNull(),\n\t\tdatetimeWTZString: timestamp('datetime_wtz_string', { withTimezone: true, mode: 'string' }).notNull(),\n\t\tinterval: interval('interval').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\tdate_string date not null,\n\t\t\t\t\ttime time(3) not null,\n\t\t\t\t\tdatetime timestamp not null,\n\t\t\t\t\tdatetime_wtz timestamp with time zone not null,\n\t\t\t\t\tdatetime_string timestamp not null,\n\t\t\t\t\tdatetime_full_precision timestamp(6) not null,\n\t\t\t\t\tdatetime_wtz_string timestamp with time zone not null,\n\t\t\t\t\tinterval interval not null\n\t\t\t)\n\t`);\n\n\tconst someDatetime = new Date('2022-01-01T00:00:00.123Z');\n\tconst fullPrecision = '2022-01-01T00:00:00.123456Z';\n\tconst someTime = '23:23:12.432';\n\n\tawait db.insert(table).values({\n\t\tdateString: '2022-01-01',\n\t\ttime: someTime,\n\t\tdatetime: someDatetime,\n\t\tdatetimeWTZ: someDatetime,\n\t\tdatetimeString: '2022-01-01T00:00:00.123Z',\n\t\tdatetimeFullPrecision: fullPrecision,\n\t\tdatetimeWTZString: '2022-01-01T00:00:00.123Z',\n\t\tinterval: '1 day',\n\t});\n\n\tconst result = await db.select().from(table);\n\n\tExpect<\n\t\tEqual<{\n\t\t\tid: number;\n\t\t\tdateString: string;\n\t\t\ttime: string;\n\t\t\tdatetime: Date;\n\t\t\tdatetimeWTZ: Date;\n\t\t\tdatetimeString: string;\n\t\t\tdatetimeFullPrecision: string;\n\t\t\tdatetimeWTZString: string;\n\t\t\tinterval: string;\n\t\t}[], typeof result>\n\t>;\n\n\tExpect<\n\t\tEqual<{\n\t\t\tdateString: string;\n\t\t\ttime: string;\n\t\t\tdatetime: Date;\n\t\t\tdatetimeWTZ: Date;\n\t\t\tdatetimeString: string;\n\t\t\tdatetimeFullPrecision: string;\n\t\t\tdatetimeWTZString: string;\n\t\t\tinterval: string;\n\t\t\tid?: number | undefined;\n\t\t}, typeof table.$inferInsert>\n\t>;\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\tdateString: '2022-01-01',\n\t\t\ttime: someTime,\n\t\t\tdatetime: someDatetime,\n\t\t\tdatetimeWTZ: someDatetime,\n\t\t\tdatetimeString: '2022-01-01 00:00:00.123',\n\t\t\tdatetimeFullPrecision: fullPrecision.replace('T', ' ').replace('Z', ''),\n\t\t\tdatetimeWTZString: '2022-01-01 00:00:00.123+00',\n\t\t\tinterval: '1 day',\n\t\t},\n\t]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns with timezone second case mode date', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', withTimezone: true, precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst insertedDate = new Date();\n\n\t// 1. Insert date as new date\n\tawait db.insert(table).values([\n\t\t{ timestamp: insertedDate },\n\t]);\n\n\t// 2, Select as date and check that timezones are the same\n\t// There is no way to check timezone in Date object, as it is always represented internally in UTC\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: insertedDate }]);\n\n\t// 3. Compare both dates\n\texpect(insertedDate.getTime()).toBe(result[0]!.timestamp.getTime());\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns with timezone third case mode date', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', withTimezone: true, precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst insertedDate = new Date('2022-01-01 20:00:00.123-04'); // used different time zones, internally is still UTC\n\tconst insertedDate2 = new Date('2022-01-02 04:00:00.123+04'); // They are both the same date in different time zones\n\n\t// 1. Insert date as new dates with different time zones\n\tawait db.insert(table).values([\n\t\t{ timestamp: insertedDate },\n\t\t{ timestamp: insertedDate2 },\n\t]);\n\n\t// 2, Select and compare both dates\n\tconst result = await db.select().from(table);\n\n\texpect(result[0]?.timestamp.getTime()).toBe(result[1]!.timestamp.getTime());\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('orderBy with aliased column', () => {\n\tconst query = db.select({\n\t\ttest: sql`something`.as('test'),\n\t}).from(users2Table).orderBy((fields) => fields.test).toSQL();\n\n\texpect(query.sql).toBe('select something as \"test\" from \"users2\" order by \"test\"');\n});\n\ntest('timestamp timezone', async () => {\n\tconst usersTableWithAndWithoutTimezone = pgTable('users_test_with_and_without_timezone', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n\t\tupdatedAt: timestamp('updated_at', { withTimezone: false }).notNull().defaultNow(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${usersTableWithAndWithoutTimezone}`);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users_test_with_and_without_timezone (\n\t\t\t\tid serial not null primary key,\n\t\t\t\tname text not null,\n\t\t\t\tcreated_at timestamptz not null default now(),\n\t\t\t\tupdated_at timestamp not null default now()\n\t\t\t)\n\t\t`,\n\t);\n\n\tconst date = new Date(Date.parse('2020-01-01T00:00:00+04:00'));\n\n\tawait db.insert(usersTableWithAndWithoutTimezone).values({ name: 'With default times' });\n\tawait db.insert(usersTableWithAndWithoutTimezone).values({\n\t\tname: 'Without default times',\n\t\tcreatedAt: date,\n\t\tupdatedAt: date,\n\t});\n\tconst users = await db.select().from(usersTableWithAndWithoutTimezone);\n\n\t// check that the timestamps are set correctly for default times\n\texpect(Math.abs(users[0]!.updatedAt.getTime() - Date.now())).toBeLessThan(2000);\n\texpect(Math.abs(users[0]!.createdAt.getTime() - Date.now())).toBeLessThan(2000);\n\n\t// check that the timestamps are set correctly for non default times\n\texpect(Math.abs(users[1]!.updatedAt.getTime() - date.getTime())).toBeLessThan(2000);\n\texpect(Math.abs(users[1]!.createdAt.getTime() - date.getTime())).toBeLessThan(2000);\n});\n\ntest('transaction', async () => {\n\tconst users = pgTable('users_transactions', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: integer('balance').notNull(),\n\t});\n\tconst products = pgTable('products_transactions', {\n\t\tid: serial('id').primaryKey(),\n\t\tprice: integer('price').notNull(),\n\t\tstock: integer('stock').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`drop table if exists ${products}`);\n\n\tawait db.execute(sql`create table users_transactions (id serial not null primary key, balance integer not null)`);\n\tawait db.execute(\n\t\tsql`create table products_transactions (id serial not null primary key, price integer not null, stock integer not null)`,\n\t);\n\n\tconst user = await db.insert(users).values({ balance: 100 }).returning().then((rows) => rows[0]!);\n\tconst product = await db.insert(products).values({ price: 10, stock: 10 }).returning().then((rows) => rows[0]!);\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.update(users).set({ balance: user.balance - product.price }).where(eq(users.id, user.id));\n\t\tawait tx.update(products).set({ stock: product.stock - 1 }).where(eq(products.id, product.id));\n\t});\n\n\tconst result = await db.select().from(users);\n\n\texpect(result).toEqual([{ id: 1, balance: 90 }]);\n\n\tawait db.execute(sql`drop table ${users}`);\n\tawait db.execute(sql`drop table ${products}`);\n});\n\ntest('transaction rollback', async () => {\n\tconst users = pgTable('users_transactions_rollback', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: integer('balance').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table users_transactions_rollback (id serial not null primary key, balance integer not null)`,\n\t);\n\n\tawait expect((async () => {\n\t\tawait db.transaction(async (tx) => {\n\t\t\tawait tx.insert(users).values({ balance: 100 });\n\t\t\ttx.rollback();\n\t\t});\n\t})()).rejects.toThrowError(TransactionRollbackError);\n\n\tconst result = await db.select().from(users);\n\n\texpect(result).toEqual([]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('nested transaction', async () => {\n\tconst users = pgTable('users_nested_transactions', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: integer('balance').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table users_nested_transactions (id serial not null primary key, balance integer not null)`,\n\t);\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.insert(users).values({ balance: 100 });\n\n\t\tawait tx.transaction(async (tx) => {\n\t\t\tawait tx.update(users).set({ balance: 200 });\n\t\t});\n\t});\n\n\tconst result = await db.select().from(users);\n\n\texpect(result).toEqual([{ id: 1, balance: 200 }]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('nested transaction rollback', async () => {\n\tconst users = pgTable('users_nested_transactions_rollback', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: integer('balance').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table users_nested_transactions_rollback (id serial not null primary key, balance integer not null)`,\n\t);\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.insert(users).values({ balance: 100 });\n\n\t\tawait expect((async () => {\n\t\t\tawait tx.transaction(async (tx) => {\n\t\t\t\tawait tx.update(users).set({ balance: 200 });\n\t\t\t\ttx.rollback();\n\t\t\t});\n\t\t})()).rejects.toThrowError(TransactionRollbackError);\n\t});\n\n\tconst result = await db.select().from(users);\n\n\texpect(result).toEqual([{ id: 1, balance: 100 }]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('join subquery with join', async () => {\n\tconst internalStaff = pgTable('internal_staff', {\n\t\tuserId: integer('user_id').notNull(),\n\t});\n\n\tconst customUser = pgTable('custom_user', {\n\t\tid: integer('id').notNull(),\n\t});\n\n\tconst ticket = pgTable('ticket', {\n\t\tstaffId: integer('staff_id').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${internalStaff}`);\n\tawait db.execute(sql`drop table if exists ${customUser}`);\n\tawait db.execute(sql`drop table if exists ${ticket}`);\n\n\tawait db.execute(sql`create table internal_staff (user_id integer not null)`);\n\tawait db.execute(sql`create table custom_user (id integer not null)`);\n\tawait db.execute(sql`create table ticket (staff_id integer not null)`);\n\n\tawait db.insert(internalStaff).values({ userId: 1 });\n\tawait db.insert(customUser).values({ id: 1 });\n\tawait db.insert(ticket).values({ staffId: 1 });\n\n\tconst subq = db\n\t\t.select()\n\t\t.from(internalStaff)\n\t\t.leftJoin(customUser, eq(internalStaff.userId, customUser.id))\n\t\t.as('internal_staff');\n\n\tconst mainQuery = await db\n\t\t.select()\n\t\t.from(ticket)\n\t\t.leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId));\n\n\texpect(mainQuery).toEqual([{\n\t\tticket: { staffId: 1 },\n\t\tinternal_staff: {\n\t\t\tinternal_staff: { userId: 1 },\n\t\t\tcustom_user: { id: 1 },\n\t\t},\n\t}]);\n\n\tawait db.execute(sql`drop table ${internalStaff}`);\n\tawait db.execute(sql`drop table ${customUser}`);\n\tawait db.execute(sql`drop table ${ticket}`);\n});\n\ntest('subquery with view', async () => {\n\tconst users = pgTable('users_subquery_view', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: integer('city_id').notNull(),\n\t});\n\n\tconst newYorkers = pgView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`drop view if exists ${newYorkers}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t);\n\tawait db.execute(sql`create view ${newYorkers} as select * from ${users} where city_id = 1`);\n\n\tawait db.insert(users).values([\n\t\t{ name: 'John', cityId: 1 },\n\t\t{ name: 'Jane', cityId: 2 },\n\t\t{ name: 'Jack', cityId: 1 },\n\t\t{ name: 'Jill', cityId: 2 },\n\t]);\n\n\tconst sq = db.$with('sq').as(db.select().from(newYorkers));\n\tconst result = await db.with(sq).select().from(sq);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t{ id: 3, name: 'Jack', cityId: 1 },\n\t]);\n\n\tawait db.execute(sql`drop view ${newYorkers}`);\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('join view as subquery', async () => {\n\tconst users = pgTable('users_join_view', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: integer('city_id').notNull(),\n\t});\n\n\tconst newYorkers = pgView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`drop view if exists ${newYorkers}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t);\n\tawait db.execute(sql`create view ${newYorkers} as select * from ${users} where city_id = 1`);\n\n\tawait db.insert(users).values([\n\t\t{ name: 'John', cityId: 1 },\n\t\t{ name: 'Jane', cityId: 2 },\n\t\t{ name: 'Jack', cityId: 1 },\n\t\t{ name: 'Jill', cityId: 2 },\n\t]);\n\n\tconst sq = db.select().from(newYorkers).as('new_yorkers_sq');\n\n\tconst result = await db.select().from(users).leftJoin(sq, eq(users.id, sq.id));\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tusers_join_view: { id: 1, name: 'John', cityId: 1 },\n\t\t\tnew_yorkers_sq: { id: 1, name: 'John', cityId: 1 },\n\t\t},\n\t\t{\n\t\t\tusers_join_view: { id: 2, name: 'Jane', cityId: 2 },\n\t\t\tnew_yorkers_sq: null,\n\t\t},\n\t\t{\n\t\t\tusers_join_view: { id: 3, name: 'Jack', cityId: 1 },\n\t\t\tnew_yorkers_sq: { id: 3, name: 'Jack', cityId: 1 },\n\t\t},\n\t\t{\n\t\t\tusers_join_view: { id: 4, name: 'Jill', cityId: 2 },\n\t\t\tnew_yorkers_sq: null,\n\t\t},\n\t]);\n\n\tawait db.execute(sql`drop view ${newYorkers}`);\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('table selection with single table', async () => {\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: integer('city_id').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t);\n\n\tawait db.insert(users).values({ name: 'John', cityId: 1 });\n\n\tconst result = await db.select({ users }).from(users);\n\n\texpect(result).toEqual([{ users: { id: 1, name: 'John', cityId: 1 } }]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('set null to jsonb field', async () => {\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tjsonb: jsonb('jsonb'),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, jsonb jsonb)`,\n\t);\n\n\tconst result = await db.insert(users).values({ jsonb: null }).returning();\n\n\texpect(result).toEqual([{ id: 1, jsonb: null }]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest.skip('insert undefined', async () => {\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name'),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text)`,\n\t);\n\n\tawait expect((async () => {\n\t\tawait db.insert(users).values({ name: undefined });\n\t})()).resolves.not.toThrowError();\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('update undefined', async () => {\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name'),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text)`,\n\t);\n\n\tawait expect((async () => {\n\t\tawait db.update(users).set({ name: undefined });\n\t})()).rejects.toThrowError();\n\tawait expect((async () => {\n\t\tdb.update(users).set({ name: undefined });\n\t})()).rejects.toThrowError();\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('array operators', async () => {\n\tconst posts = pgTable('posts', {\n\t\tid: serial('id').primaryKey(),\n\t\ttags: text('tags').array(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${posts}`);\n\n\tawait db.execute(\n\t\tsql`create table ${posts} (id serial primary key, tags text[])`,\n\t);\n\n\tawait db.insert(posts).values([{\n\t\ttags: ['ORM'],\n\t}, {\n\t\ttags: ['Typescript'],\n\t}, {\n\t\ttags: ['Typescript', 'ORM'],\n\t}, {\n\t\ttags: ['Typescript', 'Frontend', 'React'],\n\t}, {\n\t\ttags: ['Typescript', 'ORM', 'Database', 'Postgres'],\n\t}, {\n\t\ttags: ['Java', 'Spring', 'OOP'],\n\t}]);\n\n\tconst contains = await db.select({ id: posts.id }).from(posts)\n\t\t.where(arrayContains(posts.tags, ['Typescript', 'ORM']));\n\tconst contained = await db.select({ id: posts.id }).from(posts)\n\t\t.where(arrayContained(posts.tags, ['Typescript', 'ORM']));\n\tconst overlaps = await db.select({ id: posts.id }).from(posts)\n\t\t.where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']));\n\tconst withSubQuery = await db.select({ id: posts.id }).from(posts)\n\t\t.where(arrayContains(\n\t\t\tposts.tags,\n\t\t\tdb.select({ tags: posts.tags }).from(posts).where(eq(posts.id, 1)),\n\t\t));\n\n\texpect(contains).toEqual([{ id: 3 }, { id: 5 }]);\n\texpect(contained).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }]);\n\texpect(overlaps).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }]);\n\texpect(withSubQuery).toEqual([{ id: 1 }, { id: 3 }, { id: 5 }]);\n});\n\ntest('set operations (union) from query builder with subquery', async () => {\n\tawait setupSetOperationTest(db);\n\n\tconst sq = db\n\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t.from(users2Table).as('sq');\n\n\tconst result = await db\n\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t.from(cities2Table).union(\n\t\t\tdb.select().from(sq),\n\t\t).orderBy(asc(sql`name`)).limit(2).offset(1);\n\n\texpect(result).toHaveLength(2);\n\n\texpect(result).toEqual([\n\t\t{ id: 3, name: 'Jack' },\n\t\t{ id: 2, name: 'Jane' },\n\t]);\n\n\tawait expect((async () => {\n\t\tdb\n\t\t\t.select({ id: cities2Table.id, name: citiesTable.name, name2: users2Table.name })\n\t\t\t.from(cities2Table).union(\n\t\t\t\t// @ts-expect-error\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table),\n\t\t\t).orderBy(asc(sql`name`));\n\t})()).rejects.toThrowError();\n});\n\ntest('set operations (union) as function', async () => {\n\tawait setupSetOperationTest(db);\n\n\tconst result = await union(\n\t\tdb\n\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t).orderBy(asc(sql`name`)).limit(1).offset(1);\n\n\texpect(result).toHaveLength(1);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'New York' },\n\t]);\n\n\tawait expect((async () => {\n\t\tunion(\n\t\t\tdb\n\t\t\t\t.select({ name: citiesTable.name, id: cities2Table.id })\n\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t).orderBy(asc(sql`name`));\n\t})()).rejects.toThrowError();\n});\n\ntest('set operations (union all) from query builder', async () => {\n\tawait setupSetOperationTest(db);\n\n\tconst result = await db\n\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t.from(cities2Table).limit(2).unionAll(\n\t\t\tdb\n\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).limit(2),\n\t\t).orderBy(asc(sql`id`));\n\n\texpect(result).toHaveLength(4);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'New York' },\n\t\t{ id: 1, name: 'New York' },\n\t\t{ id: 2, name: 'London' },\n\t\t{ id: 2, name: 'London' },\n\t]);\n\n\tawait expect((async () => {\n\t\tdb\n\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t.from(cities2Table).limit(2).unionAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: citiesTable.name, id: cities2Table.id })\n\t\t\t\t\t.from(cities2Table).limit(2),\n\t\t\t).orderBy(asc(sql`id`));\n\t})()).rejects.toThrowError();\n});\n\ntest('set operations (union all) as function', async () => {\n\tawait setupSetOperationTest(db);\n\n\tconst result = await unionAll(\n\t\tdb\n\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t);\n\n\texpect(result).toHaveLength(3);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'New York' },\n\t\t{ id: 1, name: 'John' },\n\t\t{ id: 1, name: 'John' },\n\t]);\n\n\tawait expect((async () => {\n\t\tunionAll(\n\t\t\tdb\n\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\tdb\n\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t);\n\t})()).rejects.toThrowError();\n});\n\ntest('set operations (intersect) from query builder', async () => {\n\tawait setupSetOperationTest(db);\n\n\tconst result = await db\n\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t.from(cities2Table).intersect(\n\t\t\tdb\n\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).where(gt(citiesTable.id, 1)),\n\t\t).orderBy(asc(sql`name`));\n\n\texpect(result).toHaveLength(2);\n\n\texpect(result).toEqual([\n\t\t{ id: 2, name: 'London' },\n\t\t{ id: 3, name: 'Tampa' },\n\t]);\n\n\tawait expect((async () => {\n\t\tdb\n\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t.from(cities2Table).intersect(\n\t\t\t\t// @ts-expect-error\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name, id2: cities2Table.id })\n\t\t\t\t\t.from(cities2Table).where(gt(citiesTable.id, 1)),\n\t\t\t).orderBy(asc(sql`name`));\n\t})()).rejects.toThrowError();\n});\n\ntest('set operations (intersect) as function', async () => {\n\tawait setupSetOperationTest(db);\n\n\tconst result = await intersect(\n\t\tdb\n\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t);\n\n\texpect(result).toHaveLength(0);\n\n\texpect(result).toEqual([]);\n\n\tawait expect((async () => {\n\t\tintersect(\n\t\t\tdb\n\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\tdb\n\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t);\n\t})()).rejects.toThrowError();\n});\n\ntest('set operations (intersect all) from query builder', async () => {\n\tawait setupSetOperationTest(db);\n\n\tconst result = await db\n\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t.from(cities2Table).limit(2).intersectAll(\n\t\t\tdb\n\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).limit(2),\n\t\t).orderBy(asc(sql`id`));\n\n\texpect(result).toHaveLength(2);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'New York' },\n\t\t{ id: 2, name: 'London' },\n\t]);\n\n\tawait expect((async () => {\n\t\tdb\n\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t.from(cities2Table).limit(2).intersectAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t.from(cities2Table).limit(2),\n\t\t\t).orderBy(asc(sql`id`));\n\t})()).rejects.toThrowError();\n});\n\ntest('set operations (intersect all) as function', async () => {\n\tawait setupSetOperationTest(db);\n\n\tconst result = await intersectAll(\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t);\n\n\texpect(result).toHaveLength(1);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John' },\n\t]);\n\n\tawait expect((async () => {\n\t\tintersectAll(\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\tdb\n\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t);\n\t})()).rejects.toThrowError();\n});\n\ntest('set operations (except) from query builder', async () => {\n\tawait setupSetOperationTest(db);\n\n\tconst result = await db\n\t\t.select()\n\t\t.from(cities2Table).except(\n\t\t\tdb\n\t\t\t\t.select()\n\t\t\t\t.from(cities2Table).where(gt(citiesTable.id, 1)),\n\t\t);\n\n\texpect(result).toHaveLength(1);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'New York' },\n\t]);\n\n\tawait expect((async () => {\n\t\tdb\n\t\t\t.select()\n\t\t\t.from(cities2Table).except(\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t.from(cities2Table).where(gt(citiesTable.id, 1)),\n\t\t\t);\n\t})()).rejects.toThrowError();\n});\n\ntest('set operations (except) as function', async () => {\n\tawait setupSetOperationTest(db);\n\n\tconst result = await except(\n\t\tdb\n\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t.from(cities2Table),\n\t\tdb\n\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t).orderBy(asc(sql`id`));\n\n\texpect(result).toHaveLength(2);\n\n\texpect(result).toEqual([\n\t\t{ id: 2, name: 'London' },\n\t\t{ id: 3, name: 'Tampa' },\n\t]);\n\n\tawait expect((async () => {\n\t\texcept(\n\t\t\tdb\n\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t.from(cities2Table),\n\t\t\tdb\n\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t).orderBy(asc(sql`id`));\n\t})()).rejects.toThrowError();\n});\n\ntest('set operations (except all) from query builder', async () => {\n\tawait setupSetOperationTest(db);\n\n\tconst result = await db\n\t\t.select()\n\t\t.from(cities2Table).exceptAll(\n\t\t\tdb\n\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t).orderBy(asc(sql`id`));\n\n\texpect(result).toHaveLength(2);\n\n\texpect(result).toEqual([\n\t\t{ id: 2, name: 'London' },\n\t\t{ id: 3, name: 'Tampa' },\n\t]);\n\n\tawait expect((async () => {\n\t\tdb\n\t\t\t.select({ name: cities2Table.name, id: cities2Table.id })\n\t\t\t.from(cities2Table).exceptAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\t).orderBy(asc(sql`id`));\n\t})()).rejects.toThrowError();\n});\n\ntest('set operations (except all) as function', async () => {\n\tawait setupSetOperationTest(db);\n\n\tconst result = await exceptAll(\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table),\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table).where(gt(users2Table.id, 7)),\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t).orderBy(asc(sql`id`)).limit(5).offset(2);\n\n\texpect(result).toHaveLength(4);\n\n\texpect(result).toEqual([\n\t\t{ id: 4, name: 'Peter' },\n\t\t{ id: 5, name: 'Ben' },\n\t\t{ id: 6, name: 'Jill' },\n\t\t{ id: 7, name: 'Mary' },\n\t]);\n\n\tawait expect((async () => {\n\t\texceptAll(\n\t\t\tdb\n\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t.from(users2Table),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(gt(users2Table.id, 7)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t).orderBy(asc(sql`id`));\n\t})()).rejects.toThrowError();\n});\n\ntest('set operations (mixed) from query builder with subquery', async () => {\n\tawait setupSetOperationTest(db);\n\tconst sq = db\n\t\t.select()\n\t\t.from(cities2Table).where(gt(citiesTable.id, 1)).as('sq');\n\n\tconst result = await db\n\t\t.select()\n\t\t.from(cities2Table).except(\n\t\t\t({ unionAll }) =>\n\t\t\t\tunionAll(\n\t\t\t\t\tdb.select().from(sq),\n\t\t\t\t\tdb.select().from(cities2Table).where(eq(citiesTable.id, 2)),\n\t\t\t\t),\n\t\t);\n\n\texpect(result).toHaveLength(1);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'New York' },\n\t]);\n\n\tawait expect((async () => {\n\t\tdb\n\t\t\t.select()\n\t\t\t.from(cities2Table).except(\n\t\t\t\t({ unionAll }) =>\n\t\t\t\t\tunionAll(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: cities2Table.name, id: cities2Table.id })\n\t\t\t\t\t\t\t.from(cities2Table).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t\tdb.select().from(cities2Table).where(eq(citiesTable.id, 2)),\n\t\t\t\t\t),\n\t\t\t);\n\t})()).rejects.toThrowError();\n});\n\ntest('set operations (mixed all) as function', async () => {\n\tawait setupSetOperationTest(db);\n\n\tconst result = await union(\n\t\tdb\n\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\texcept(\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(gte(users2Table.id, 5)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id, 7)),\n\t\t),\n\t\tdb\n\t\t\t.select().from(cities2Table).where(gt(citiesTable.id, 1)),\n\t).orderBy(asc(sql`id`));\n\n\texpect(result).toHaveLength(6);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John' },\n\t\t{ id: 2, name: 'London' },\n\t\t{ id: 3, name: 'Tampa' },\n\t\t{ id: 5, name: 'Ben' },\n\t\t{ id: 6, name: 'Jill' },\n\t\t{ id: 8, name: 'Sally' },\n\t]);\n\n\tawait expect((async () => {\n\t\tunion(\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\texcept(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(gte(users2Table.id, 5)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 7)),\n\t\t\t),\n\t\t\tdb\n\t\t\t\t.select().from(cities2Table).where(gt(citiesTable.id, 1)),\n\t\t).orderBy(asc(sql`id`));\n\t})()).rejects.toThrowError();\n});\n\ntest('aggregate function: count', async () => {\n\tconst table = aggregateTable;\n\tawait setupAggregateFunctionsTest(db);\n\n\tconst result1 = await db.select({ value: count() }).from(table);\n\tconst result2 = await db.select({ value: count(table.a) }).from(table);\n\tconst result3 = await db.select({ value: countDistinct(table.name) }).from(table);\n\n\texpect(result1[0]?.value).toBe(7);\n\texpect(result2[0]?.value).toBe(5);\n\texpect(result3[0]?.value).toBe(6);\n});\n\ntest('aggregate function: avg', async () => {\n\tconst table = aggregateTable;\n\tawait setupAggregateFunctionsTest(db);\n\n\tconst result1 = await db.select({ value: avg(table.b) }).from(table);\n\tconst result2 = await db.select({ value: avg(table.nullOnly) }).from(table);\n\tconst result3 = await db.select({ value: avgDistinct(table.b) }).from(table);\n\n\texpect(result1[0]?.value).toBe('33.3333333333333333');\n\texpect(result2[0]?.value).toBeNull();\n\texpect(result3[0]?.value).toBe('42.5000000000000000');\n});\n\ntest('aggregate function: sum', async () => {\n\tconst table = aggregateTable;\n\tawait setupAggregateFunctionsTest(db);\n\n\tconst result1 = await db.select({ value: sum(table.b) }).from(table);\n\tconst result2 = await db.select({ value: sum(table.nullOnly) }).from(table);\n\tconst result3 = await db.select({ value: sumDistinct(table.b) }).from(table);\n\n\texpect(result1[0]?.value).toBe('200');\n\texpect(result2[0]?.value).toBeNull();\n\texpect(result3[0]?.value).toBe('170');\n});\n\ntest('aggregate function: max', async () => {\n\tconst table = aggregateTable;\n\tawait setupAggregateFunctionsTest(db);\n\n\tconst result1 = await db.select({ value: max(table.b) }).from(table);\n\tconst result2 = await db.select({ value: max(table.nullOnly) }).from(table);\n\n\texpect(result1[0]?.value).toBe(90);\n\texpect(result2[0]?.value).toBeNull();\n});\n\ntest('aggregate function: min', async () => {\n\tconst table = aggregateTable;\n\tawait setupAggregateFunctionsTest(db);\n\n\tconst result1 = await db.select({ value: min(table.b) }).from(table);\n\tconst result2 = await db.select({ value: min(table.nullOnly) }).from(table);\n\n\texpect(result1[0]?.value).toBe(10);\n\texpect(result2[0]?.value).toBeNull();\n});\n\ntest.skip('array mapping and parsing', async () => {\n\tconst arrays = pgTable('arrays_tests', {\n\t\tid: serial('id').primaryKey(),\n\t\ttags: text('tags').array(),\n\t\tnested: text('nested').array().array(),\n\t\tnumbers: integer('numbers').notNull().array(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${arrays}`);\n\tawait db.execute(sql`\n\t\t create table ${arrays} (\n\t\t id serial primary key,\n\t\t tags text[],\n\t\t nested text[][],\n\t\t numbers integer[]\n\t\t)\n\t`);\n\n\tawait db.insert(arrays).values({\n\t\ttags: ['', 'b', 'c'],\n\t\tnested: [['1', ''], ['3', '\\\\a']],\n\t\tnumbers: [1, 2, 3],\n\t});\n\n\tconst result = await db.select().from(arrays);\n\n\texpect(result).toEqual([{\n\t\tid: 1,\n\t\ttags: ['', 'b', 'c'],\n\t\tnested: [['1', ''], ['3', '\\\\a']],\n\t\tnumbers: [1, 2, 3],\n\t}]);\n\n\tawait db.execute(sql`drop table ${arrays}`);\n});\n\ntest('test $onUpdateFn and $onUpdate works as $default', async () => {\n\tawait db.execute(sql`drop table if exists ${usersOnUpdate}`);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${usersOnUpdate} (\n\t\t\tid serial primary key,\n\t\t\tname text not null,\n\t\t\tupdate_counter integer default 1 not null,\n\t\t\tupdated_at timestamp(3),\n\t\t\talways_null text\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.insert(usersOnUpdate).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Jack' },\n\t\t{ name: 'Jill' },\n\t]);\n\n\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\n\tawait db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\tconst response = await db.select({ ...rest }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\texpect(response).toEqual([\n\t\t{ name: 'John', id: 1, updateCounter: 1, alwaysNull: null },\n\t\t{ name: 'Jane', id: 2, updateCounter: 1, alwaysNull: null },\n\t\t{ name: 'Jack', id: 3, updateCounter: 1, alwaysNull: null },\n\t\t{ name: 'Jill', id: 4, updateCounter: 1, alwaysNull: null },\n\t]);\n});\n\ntest('test $onUpdateFn and $onUpdate works updating', async () => {\n\tawait db.execute(sql`drop table if exists ${usersOnUpdate}`);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${usersOnUpdate} (\n\t\t\tid serial primary key,\n\t\t\tname text not null,\n\t\t\tupdate_counter integer default 1,\n\t\t\tupdated_at timestamp(3),\n\t\t\talways_null text\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.insert(usersOnUpdate).values([\n\t\t{ name: 'John', alwaysNull: 'this will be null after updating' },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Jack' },\n\t\t{ name: 'Jill' },\n\t]);\n\n\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\tawait db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\tawait db.update(usersOnUpdate).set({ name: 'Angel' }).where(eq(usersOnUpdate.id, 1));\n\tawait db.update(usersOnUpdate).set({ updateCounter: null }).where(eq(usersOnUpdate.id, 2));\n\n\tconst justDates = await db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\tconst response = await db.select({ ...rest }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\texpect(response).toEqual([\n\t\t{ name: 'Angel', id: 1, updateCounter: 2, alwaysNull: null },\n\t\t{ name: 'Jane', id: 2, updateCounter: null, alwaysNull: null },\n\t\t{ name: 'Jack', id: 3, updateCounter: 1, alwaysNull: null },\n\t\t{ name: 'Jill', id: 4, updateCounter: 1, alwaysNull: null },\n\t]);\n\tconst msDelay = 15000;\n\n\t// expect(initial[0]?.updatedAt?.valueOf()).not.toBe(justDates[0]?.updatedAt?.valueOf());\n\n\tfor (const eachUser of justDates) {\n\t\texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t}\n});\n\ntest('test if method with sql operators', async () => {\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tage: integer('age').notNull(),\n\t\tcity: text('city').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${users} (\n\t\tid serial primary key,\n\t\tname text not null,\n\t\tage integer not null,\n\t\tcity text not null\n\t\t)\n\t`);\n\n\tawait db.insert(users).values([\n\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t]);\n\n\tconst condition1 = true;\n\n\tconst [result1] = await db.select().from(users).where(eq(users.id, 1).if(condition1));\n\n\texpect(result1).toEqual({ id: 1, name: 'John', age: 20, city: 'New York' });\n\n\tconst condition2 = 1;\n\n\tconst [result2] = await db.select().from(users).where(sql`${users.id} = 1`.if(condition2));\n\n\texpect(result2).toEqual({ id: 1, name: 'John', age: 20, city: 'New York' });\n\n\tconst condition3 = 'non-empty string';\n\n\tconst result3 = await db.select().from(users).where(\n\t\tor(eq(users.id, 1).if(condition3), eq(users.id, 2).if(condition3)),\n\t);\n\n\texpect(result3).toEqual([{ id: 1, name: 'John', age: 20, city: 'New York' }, {\n\t\tid: 2,\n\t\tname: 'Alice',\n\t\tage: 21,\n\t\tcity: 'New York',\n\t}]);\n\n\tconst condtition4 = false;\n\n\tconst result4 = await db.select().from(users).where(eq(users.id, 1).if(condtition4));\n\n\texpect(result4).toEqual([\n\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t]);\n\n\tconst condition5 = undefined;\n\n\tconst result5 = await db.select().from(users).where(sql`${users.id} = 1`.if(condition5));\n\n\texpect(result5).toEqual([\n\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t]);\n\n\tconst condition6 = null;\n\n\tconst result6 = await db.select().from(users).where(\n\t\tor(eq(users.id, 1).if(condition6), eq(users.id, 2).if(condition6)),\n\t);\n\n\texpect(result6).toEqual([\n\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t]);\n\n\tconst condition7 = {\n\t\tterm1: 0,\n\t\tterm2: 1,\n\t};\n\n\tconst result7 = await db.select().from(users).where(\n\t\tand(gt(users.age, 20).if(condition7.term1), eq(users.city, 'New York').if(condition7.term2)),\n\t);\n\n\texpect(result7).toEqual([\n\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t]);\n\n\tconst condition8 = {\n\t\tterm1: '',\n\t\tterm2: 'non-empty string',\n\t};\n\n\tconst result8 = await db.select().from(users).where(\n\t\tor(lt(users.age, 21).if(condition8.term1), eq(users.city, 'London').if(condition8.term2)),\n\t);\n\n\texpect(result8).toEqual([\n\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t]);\n\n\tconst condition9 = {\n\t\tterm1: 1,\n\t\tterm2: true,\n\t};\n\n\tconst result9 = await db.select().from(users).where(\n\t\tand(\n\t\t\tinArray(users.city, ['New York', 'London']).if(condition9.term1),\n\t\t\tilike(users.name, 'a%').if(condition9.term2),\n\t\t),\n\t);\n\n\texpect(result9).toEqual([\n\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t]);\n\n\tconst condition10 = {\n\t\tterm1: 4,\n\t\tterm2: 19,\n\t};\n\n\tconst result10 = await db.select().from(users).where(\n\t\tand(\n\t\t\tsql`length(${users.name}) <= ${condition10.term1}`.if(condition10.term1),\n\t\t\tgt(users.age, condition10.term2).if(condition10.term2 > 20),\n\t\t),\n\t);\n\n\texpect(result10).toEqual([\n\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t]);\n\n\tconst condition11 = true;\n\n\tconst result11 = await db.select().from(users).where(\n\t\tor(eq(users.city, 'New York'), gte(users.age, 22))!.if(condition11),\n\t);\n\n\texpect(result11).toEqual([\n\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t]);\n\n\tconst condition12 = false;\n\n\tconst result12 = await db.select().from(users).where(\n\t\tand(eq(users.city, 'London'), gte(users.age, 23))!.if(condition12),\n\t);\n\n\texpect(result12).toEqual([\n\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t]);\n\n\tconst condition13 = true;\n\n\tconst result13 = await db.select().from(users).where(sql`(city = 'New York' or age >= 22)`.if(condition13));\n\n\texpect(result13).toEqual([\n\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t]);\n\n\tconst condition14 = false;\n\n\tconst result14 = await db.select().from(users).where(sql`(city = 'London' and age >= 23)`.if(condition14));\n\n\texpect(result14).toEqual([\n\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\n// MySchema tests\ntest('mySchema :: select all fields', async () => {\n\tconst now = Date.now();\n\n\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\tconst result = await db.select().from(usersMySchemaTable);\n\n\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(result[0]!.createdAt.getTime() - now)).toBeLessThan(100);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('mySchema :: select sql', async () => {\n\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql`upper(${usersMySchemaTable.name})`,\n\t}).from(usersMySchemaTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('mySchema :: select typed sql', async () => {\n\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql<string>`upper(${usersMySchemaTable.name})`,\n\t}).from(usersMySchemaTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('mySchema :: select distinct', async () => {\n\tconst usersDistinctTable = pgTable('users_distinct', {\n\t\tid: integer('id').notNull(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${usersDistinctTable}`);\n\tawait db.execute(sql`create table ${usersDistinctTable} (id integer, name text)`);\n\n\tawait db.insert(usersDistinctTable).values([\n\t\t{ id: 1, name: 'John' },\n\t\t{ id: 1, name: 'John' },\n\t\t{ id: 2, name: 'John' },\n\t\t{ id: 1, name: 'Jane' },\n\t]);\n\tconst users1 = await db.selectDistinct().from(usersDistinctTable).orderBy(\n\t\tusersDistinctTable.id,\n\t\tusersDistinctTable.name,\n\t);\n\tconst users2 = await db.selectDistinctOn([usersDistinctTable.id]).from(usersDistinctTable).orderBy(\n\t\tusersDistinctTable.id,\n\t);\n\tconst users3 = await db.selectDistinctOn([usersDistinctTable.name], { name: usersDistinctTable.name }).from(\n\t\tusersDistinctTable,\n\t).orderBy(usersDistinctTable.name);\n\n\tawait db.execute(sql`drop table ${usersDistinctTable}`);\n\n\texpect(users1).toEqual([{ id: 1, name: 'Jane' }, { id: 1, name: 'John' }, { id: 2, name: 'John' }]);\n\n\texpect(users2).toHaveLength(2);\n\texpect(users2[0]?.id).toBe(1);\n\texpect(users2[1]?.id).toBe(2);\n\n\texpect(users3).toHaveLength(2);\n\texpect(users3[0]?.name).toBe('Jane');\n\texpect(users3[1]?.name).toBe('John');\n});\n\ntest('mySchema :: insert returning sql', async () => {\n\tconst users = await db.insert(usersMySchemaTable).values({ name: 'John' }).returning({\n\t\tname: sql`upper(${usersMySchemaTable.name})`,\n\t});\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('mySchema :: delete returning sql', async () => {\n\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\tconst users = await db.delete(usersMySchemaTable).where(eq(usersMySchemaTable.name, 'John')).returning({\n\t\tname: sql`upper(${usersMySchemaTable.name})`,\n\t});\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('mySchema :: update with returning partial', async () => {\n\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\tconst users = await db.update(usersMySchemaTable).set({ name: 'Jane' }).where(eq(usersMySchemaTable.name, 'John'))\n\t\t.returning({\n\t\t\tid: usersMySchemaTable.id,\n\t\t\tname: usersMySchemaTable.name,\n\t\t});\n\n\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n});\n\ntest('mySchema :: delete with returning all fields', async () => {\n\tconst now = Date.now();\n\n\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\tconst users = await db.delete(usersMySchemaTable).where(eq(usersMySchemaTable.name, 'John')).returning();\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(100);\n\texpect(users).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: users[0]!.createdAt }]);\n});\n\ntest('mySchema :: insert + select', async () => {\n\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\tconst result = await db.select().from(usersMySchemaTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\n\tawait db.insert(usersMySchemaTable).values({ name: 'Jane' });\n\tconst result2 = await db.select().from(usersMySchemaTable);\n\texpect(result2).toEqual([\n\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result2[0]!.createdAt },\n\t\t{ id: 2, name: 'Jane', verified: false, jsonb: null, createdAt: result2[1]!.createdAt },\n\t]);\n});\n\ntest('mySchema :: insert with overridden default values', async () => {\n\tawait db.insert(usersMySchemaTable).values({ name: 'John', verified: true });\n\tconst result = await db.select().from(usersMySchemaTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: true, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('mySchema :: insert many', async () => {\n\tawait db.insert(usersMySchemaTable).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Austin', verified: true },\n\t]);\n\tconst result = await db.select({\n\t\tid: usersMySchemaTable.id,\n\t\tname: usersMySchemaTable.name,\n\t\tjsonb: usersMySchemaTable.jsonb,\n\t\tverified: usersMySchemaTable.verified,\n\t}).from(usersMySchemaTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t]);\n});\n\ntest('mySchema :: select with group by as field', async () => {\n\tawait db.insert(usersMySchemaTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersMySchemaTable.name }).from(usersMySchemaTable)\n\t\t.groupBy(usersMySchemaTable.name);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('mySchema :: select with group by as column + sql', async () => {\n\tawait db.insert(usersMySchemaTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersMySchemaTable.name }).from(usersMySchemaTable)\n\t\t.groupBy(usersMySchemaTable.id, sql`${usersMySchemaTable.name}`);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('mySchema :: build query', async () => {\n\tconst query = db.select({ id: usersMySchemaTable.id, name: usersMySchemaTable.name }).from(usersMySchemaTable)\n\t\t.groupBy(usersMySchemaTable.id, usersMySchemaTable.name)\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql: 'select \"id\", \"name\" from \"mySchema\".\"users\" group by \"mySchema\".\"users\".\"id\", \"mySchema\".\"users\".\"name\"',\n\t\tparams: [],\n\t});\n});\n\ntest('mySchema :: partial join with alias', async () => {\n\tconst customerAlias = alias(usersMySchemaTable, 'customer');\n\n\tawait db.insert(usersMySchemaTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select({\n\t\t\tuser: {\n\t\t\t\tid: usersMySchemaTable.id,\n\t\t\t\tname: usersMySchemaTable.name,\n\t\t\t},\n\t\t\tcustomer: {\n\t\t\t\tid: customerAlias.id,\n\t\t\t\tname: customerAlias.name,\n\t\t\t},\n\t\t}).from(usersMySchemaTable)\n\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t.where(eq(usersMySchemaTable.id, 10));\n\n\texpect(result).toEqual([{\n\t\tuser: { id: 10, name: 'Ivan' },\n\t\tcustomer: { id: 11, name: 'Hans' },\n\t}]);\n});\n\ntest('mySchema :: insert with spaces', async () => {\n\tawait db.insert(usersMySchemaTable).values({ name: sql`'Jo   h     n'` });\n\tconst result = await db.select({ id: usersMySchemaTable.id, name: usersMySchemaTable.name }).from(\n\t\tusersMySchemaTable,\n\t);\n\n\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n});\n\ntest('mySchema :: prepared statement with placeholder in .limit', async () => {\n\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\tconst stmt = db\n\t\t.select({\n\t\t\tid: usersMySchemaTable.id,\n\t\t\tname: usersMySchemaTable.name,\n\t\t})\n\t\t.from(usersMySchemaTable)\n\t\t.where(eq(usersMySchemaTable.id, sql.placeholder('id')))\n\t\t.limit(sql.placeholder('limit'))\n\t\t.prepare('mySchema_stmt_limit');\n\n\tconst result = await stmt.execute({ id: 1, limit: 1 });\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\texpect(result).toHaveLength(1);\n});\n\ntest('mySchema :: build query insert with onConflict do update / multiple columns', async () => {\n\tconst query = db.insert(usersMySchemaTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoUpdate({ target: [usersMySchemaTable.id, usersMySchemaTable.name], set: { name: 'John1' } })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"mySchema\".\"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\",\"name\") do update set \"name\" = $3',\n\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t});\n});\n\ntest('mySchema :: build query insert with onConflict do nothing + target', async () => {\n\tconst query = db.insert(usersMySchemaTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoNothing({ target: usersMySchemaTable.id })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"mySchema\".\"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\") do nothing',\n\t\tparams: ['John', '[\"foo\",\"bar\"]'],\n\t});\n});\n\ntest('mySchema :: select from tables with same name from different schema using alias', async () => {\n\tawait db.insert(usersMySchemaTable).values({ id: 10, name: 'Ivan' });\n\tawait db.insert(usersTable).values({ id: 11, name: 'Hans' });\n\n\tconst customerAlias = alias(usersTable, 'customer');\n\n\tconst result = await db\n\t\t.select().from(usersMySchemaTable)\n\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t.where(eq(customerAlias.id, 11));\n\n\texpect(result).toEqual([{\n\t\tusers: {\n\t\t\tid: 10,\n\t\t\tname: 'Ivan',\n\t\t\tverified: false,\n\t\t\tjsonb: null,\n\t\t\tcreatedAt: result[0]!.users.createdAt,\n\t\t},\n\t\tcustomer: {\n\t\t\tid: 11,\n\t\t\tname: 'Hans',\n\t\t\tverified: false,\n\t\t\tjsonb: null,\n\t\t\tcreatedAt: result[0]!.customer!.createdAt,\n\t\t},\n\t}]);\n});\n\ntest('mySchema :: view', async () => {\n\tconst newYorkers1 = mySchema.view('new_yorkers')\n\t\t.as((qb) => qb.select().from(users2MySchemaTable).where(eq(users2MySchemaTable.cityId, 1)));\n\n\tconst newYorkers2 = mySchema.view('new_yorkers', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: integer('city_id').notNull(),\n\t}).as(sql`select * from ${users2MySchemaTable} where ${eq(users2MySchemaTable.cityId, 1)}`);\n\n\tconst newYorkers3 = mySchema.view('new_yorkers', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: integer('city_id').notNull(),\n\t}).existing();\n\n\tawait db.execute(sql`create view ${newYorkers1} as ${getViewConfig(newYorkers1).query}`);\n\n\tawait db.insert(citiesMySchemaTable).values([{ name: 'New York' }, { name: 'Paris' }]);\n\n\tawait db.insert(users2MySchemaTable).values([\n\t\t{ name: 'John', cityId: 1 },\n\t\t{ name: 'Jane', cityId: 1 },\n\t\t{ name: 'Jack', cityId: 2 },\n\t]);\n\n\t{\n\t\tconst result = await db.select().from(newYorkers1);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select().from(newYorkers2);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select().from(newYorkers3);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1);\n\t\texpect(result).toEqual([\n\t\t\t{ name: 'John' },\n\t\t\t{ name: 'Jane' },\n\t\t]);\n\t}\n\n\tawait db.execute(sql`drop view ${newYorkers1}`);\n});\n\ntest('mySchema :: materialized view', async () => {\n\tconst newYorkers1 = mySchema.materializedView('new_yorkers')\n\t\t.as((qb) => qb.select().from(users2MySchemaTable).where(eq(users2MySchemaTable.cityId, 1)));\n\n\tconst newYorkers2 = mySchema.materializedView('new_yorkers', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: integer('city_id').notNull(),\n\t}).as(sql`select * from ${users2MySchemaTable} where ${eq(users2MySchemaTable.cityId, 1)}`);\n\n\tconst newYorkers3 = mySchema.materializedView('new_yorkers', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: integer('city_id').notNull(),\n\t}).existing();\n\n\tawait db.execute(sql`create materialized view ${newYorkers1} as ${getMaterializedViewConfig(newYorkers1).query}`);\n\n\tawait db.insert(citiesMySchemaTable).values([{ name: 'New York' }, { name: 'Paris' }]);\n\n\tawait db.insert(users2MySchemaTable).values([\n\t\t{ name: 'John', cityId: 1 },\n\t\t{ name: 'Jane', cityId: 1 },\n\t\t{ name: 'Jack', cityId: 2 },\n\t]);\n\n\t{\n\t\tconst result = await db.select().from(newYorkers1);\n\t\texpect(result).toEqual([]);\n\t}\n\n\tawait db.refreshMaterializedView(newYorkers1);\n\n\t{\n\t\tconst result = await db.select().from(newYorkers1);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select().from(newYorkers2);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select().from(newYorkers3);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1);\n\t\texpect(result).toEqual([\n\t\t\t{ name: 'John' },\n\t\t\t{ name: 'Jane' },\n\t\t]);\n\t}\n\n\tawait db.execute(sql`drop materialized view ${newYorkers1}`);\n});\n\ntest('limit 0', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.select()\n\t\t.from(usersTable)\n\t\t.limit(0);\n\n\texpect(users).toEqual([]);\n});\n\ntest('limit -1', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.select()\n\t\t.from(usersTable)\n\t\t.limit(-1);\n\n\texpect(users.length).toBeGreaterThan(0);\n});\n\ntest('Object keys as column names', async () => {\n\t// Tests the following:\n\t// Column with required config\n\t// Column with optional config without providing a value\n\t// Column with optional config providing a value\n\t// Column without config\n\tconst users = pgTable('users', {\n\t\tid: bigserial({ mode: 'number' }).primaryKey(),\n\t\tfirstName: varchar(),\n\t\tlastName: varchar({ length: 50 }),\n\t\tadmin: boolean(),\n\t});\n\n\tawait db.execute(sql`drop table if exists users`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users (\n\t\t\t\t\"id\" bigserial primary key,\n\t\t\t\t\"firstName\" varchar,\n\t\t\t\t\"lastName\" varchar(50),\n\t\t\t\t\"admin\" boolean\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.insert(users).values([\n\t\t{ firstName: 'John', lastName: 'Doe', admin: true },\n\t\t{ firstName: 'Jane', lastName: 'Smith', admin: false },\n\t]);\n\tconst result = await db\n\t\t.select({ id: users.id, firstName: users.firstName, lastName: users.lastName })\n\t\t.from(users)\n\t\t.where(eq(users.admin, true));\n\n\texpect(result).toEqual([\n\t\t{ id: 1, firstName: 'John', lastName: 'Doe' },\n\t]);\n\n\tawait db.execute(sql`drop table users`);\n});\n\ntest.skip('proper json and jsonb handling', async () => {\n\tconst jsonTable = pgTable('json_table', {\n\t\tjson: json('json').$type<{ name: string; age: number }>(),\n\t\tjsonb: jsonb('jsonb').$type<{ name: string; age: number }>(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${jsonTable}`);\n\n\tawait db.execute(sql`create table ${jsonTable} (json json, jsonb jsonb)`);\n\n\tawait db.insert(jsonTable).values({ json: { name: 'Tom', age: 75 }, jsonb: { name: 'Pete', age: 23 } });\n\n\tconst result = await db.select().from(jsonTable);\n\n\tconst justNames = await db.select({\n\t\tname1: sql<string>`${jsonTable.json}->>'name'`.as('name1'),\n\t\tname2: sql<string>`${jsonTable.jsonb}->>'name'`.as('name2'),\n\t}).from(jsonTable);\n\n\texpect(result).toStrictEqual([\n\t\t{\n\t\t\tjson: { name: 'Tom', age: 75 },\n\t\t\tjsonb: { name: 'Pete', age: 23 },\n\t\t},\n\t]);\n\n\texpect(justNames).toStrictEqual([\n\t\t{\n\t\t\tname1: 'Tom',\n\t\t\tname2: 'Pete',\n\t\t},\n\t]);\n});\n\ntest.todo('set json/jsonb fields with objects and retrieve with the ->> operator', async () => {\n\tconst obj = { string: 'test', number: 123 };\n\tconst { string: testString, number: testNumber } = obj;\n\n\tawait db.insert(jsonTestTable).values({\n\t\tjson: obj,\n\t\tjsonb: obj,\n\t});\n\n\tconst result = await db.select({\n\t\tjsonStringField: sql<string>`${jsonTestTable.json}->>'string'`,\n\t\tjsonNumberField: sql<string>`${jsonTestTable.json}->>'number'`,\n\t\tjsonbStringField: sql<string>`${jsonTestTable.jsonb}->>'string'`,\n\t\tjsonbNumberField: sql<string>`${jsonTestTable.jsonb}->>'number'`,\n\t}).from(jsonTestTable);\n\n\texpect(result).toStrictEqual([{\n\t\tjsonStringField: testString,\n\t\tjsonNumberField: String(testNumber),\n\t\tjsonbStringField: testString,\n\t\tjsonbNumberField: String(testNumber),\n\t}]);\n});\n\ntest.todo('set json/jsonb fields with strings and retrieve with the ->> operator', async () => {\n\tconst obj = { string: 'test', number: 123 };\n\tconst { string: testString, number: testNumber } = obj;\n\n\tawait db.insert(jsonTestTable).values({\n\t\tjson: sql`${JSON.stringify(obj)}`,\n\t\tjsonb: sql`${JSON.stringify(obj)}`,\n\t});\n\n\tconst result = await db.select({\n\t\tjsonStringField: sql<string>`${jsonTestTable.json}->>'string'`,\n\t\tjsonNumberField: sql<string>`${jsonTestTable.json}->>'number'`,\n\t\tjsonbStringField: sql<string>`${jsonTestTable.jsonb}->>'string'`,\n\t\tjsonbNumberField: sql<string>`${jsonTestTable.jsonb}->>'number'`,\n\t}).from(jsonTestTable);\n\n\texpect(result).toStrictEqual([{\n\t\tjsonStringField: testString,\n\t\tjsonNumberField: String(testNumber),\n\t\tjsonbStringField: testString,\n\t\tjsonbNumberField: String(testNumber),\n\t}]);\n});\n\ntest.todo('set json/jsonb fields with objects and retrieve with the -> operator', async () => {\n\tconst obj = { string: 'test', number: 123 };\n\tconst { string: testString, number: testNumber } = obj;\n\n\tawait db.insert(jsonTestTable).values({\n\t\tjson: obj,\n\t\tjsonb: obj,\n\t});\n\n\tconst result = await db.select({\n\t\tjsonStringField: sql<string>`${jsonTestTable.json}->'string'`,\n\t\tjsonNumberField: sql<number>`${jsonTestTable.json}->'number'`,\n\t\tjsonbStringField: sql<string>`${jsonTestTable.jsonb}->'string'`,\n\t\tjsonbNumberField: sql<number>`${jsonTestTable.jsonb}->'number'`,\n\t}).from(jsonTestTable);\n\n\texpect(result).toStrictEqual([{\n\t\tjsonStringField: testString,\n\t\tjsonNumberField: testNumber,\n\t\tjsonbStringField: testString,\n\t\tjsonbNumberField: testNumber,\n\t}]);\n});\n\ntest.todo('set json/jsonb fields with strings and retrieve with the -> operator', async () => {\n\tconst obj = { string: 'test', number: 123 };\n\tconst { string: testString, number: testNumber } = obj;\n\n\tawait db.insert(jsonTestTable).values({\n\t\tjson: sql`${JSON.stringify(obj)}`,\n\t\tjsonb: sql`${JSON.stringify(obj)}`,\n\t});\n\n\tconst result = await db.select({\n\t\tjsonStringField: sql<string>`${jsonTestTable.json}->'string'`,\n\t\tjsonNumberField: sql<number>`${jsonTestTable.json}->'number'`,\n\t\tjsonbStringField: sql<string>`${jsonTestTable.jsonb}->'string'`,\n\t\tjsonbNumberField: sql<number>`${jsonTestTable.jsonb}->'number'`,\n\t}).from(jsonTestTable);\n\n\texpect(result).toStrictEqual([{\n\t\tjsonStringField: testString,\n\t\tjsonNumberField: testNumber,\n\t\tjsonbStringField: testString,\n\t\tjsonbNumberField: testNumber,\n\t}]);\n});\n\ntest('update ... from', async () => {\n\tawait db.insert(cities2Table).values([\n\t\t{ name: 'New York City' },\n\t\t{ name: 'Seattle' },\n\t]);\n\tawait db.insert(users2Table).values([\n\t\t{ name: 'John', cityId: 1 },\n\t\t{ name: 'Jane', cityId: 2 },\n\t]);\n\n\tconst result = await db\n\t\t.update(users2Table)\n\t\t.set({\n\t\t\tcityId: cities2Table.id,\n\t\t})\n\t\t.from(cities2Table)\n\t\t.where(and(eq(cities2Table.name, 'Seattle'), eq(users2Table.name, 'John')))\n\t\t.returning();\n\n\texpect(result).toStrictEqual([{\n\t\tid: 1,\n\t\tname: 'John',\n\t\tcityId: 2,\n\t\tcities: {\n\t\t\tid: 2,\n\t\t\tname: 'Seattle',\n\t\t},\n\t}]);\n});\n\ntest('update ... from with alias', async () => {\n\tawait db.insert(cities2Table).values([\n\t\t{ name: 'New York City' },\n\t\t{ name: 'Seattle' },\n\t]);\n\tawait db.insert(users2Table).values([\n\t\t{ name: 'John', cityId: 1 },\n\t\t{ name: 'Jane', cityId: 2 },\n\t]);\n\n\tconst users = alias(users2Table, 'u');\n\tconst cities = alias(cities2Table, 'c');\n\tconst result = await db\n\t\t.update(users)\n\t\t.set({\n\t\t\tcityId: cities.id,\n\t\t})\n\t\t.from(cities)\n\t\t.where(and(eq(cities.name, 'Seattle'), eq(users.name, 'John')))\n\t\t.returning();\n\n\texpect(result).toStrictEqual([{\n\t\tid: 1,\n\t\tname: 'John',\n\t\tcityId: 2,\n\t\tc: {\n\t\t\tid: 2,\n\t\t\tname: 'Seattle',\n\t\t},\n\t}]);\n});\n\ntest('update ... from with join', async () => {\n\tconst states = pgTable('states', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\tconst cities = pgTable('cities', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tstateId: integer('state_id').references(() => states.id),\n\t});\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: integer('city_id').notNull().references(() => cities.id),\n\t});\n\n\tawait db.execute(sql`drop table if exists \"states\" cascade`);\n\tawait db.execute(sql`drop table if exists \"cities\" cascade`);\n\tawait db.execute(sql`drop table if exists \"users\" cascade`);\n\tawait db.execute(sql`\n\t\tcreate table \"states\" (\n\t\t\t\"id\" serial primary key,\n\t\t\t\"name\" text not null\n\t\t)\n\t`);\n\tawait db.execute(sql`\n\t\tcreate table \"cities\" (\n\t\t\t\"id\" serial primary key,\n\t\t\t\"name\" text not null,\n\t\t\t\"state_id\" integer references \"states\"(\"id\")\n\t\t)\n\t`);\n\tawait db.execute(sql`\n\t\tcreate table \"users\" (\n\t\t\t\"id\" serial primary key,\n\t\t\t\"name\" text not null,\n\t\t\t\"city_id\" integer not null references \"cities\"(\"id\")\n\t\t)\n\t`);\n\n\tawait db.insert(states).values([\n\t\t{ name: 'New York' },\n\t\t{ name: 'Washington' },\n\t]);\n\tawait db.insert(cities).values([\n\t\t{ name: 'New York City', stateId: 1 },\n\t\t{ name: 'Seattle', stateId: 2 },\n\t\t{ name: 'London' },\n\t]);\n\tawait db.insert(users).values([\n\t\t{ name: 'John', cityId: 1 },\n\t\t{ name: 'Jane', cityId: 2 },\n\t\t{ name: 'Jack', cityId: 3 },\n\t]);\n\n\tconst result1 = await db\n\t\t.update(users)\n\t\t.set({\n\t\t\tcityId: cities.id,\n\t\t})\n\t\t.from(cities)\n\t\t.leftJoin(states, eq(cities.stateId, states.id))\n\t\t.where(and(eq(cities.name, 'Seattle'), eq(users.name, 'John')))\n\t\t.returning();\n\tconst result2 = await db\n\t\t.update(users)\n\t\t.set({\n\t\t\tcityId: cities.id,\n\t\t})\n\t\t.from(cities)\n\t\t.leftJoin(states, eq(cities.stateId, states.id))\n\t\t.where(and(eq(cities.name, 'London'), eq(users.name, 'Jack')))\n\t\t.returning();\n\n\texpect(result1).toStrictEqual([{\n\t\tid: 1,\n\t\tname: 'John',\n\t\tcityId: 2,\n\t\tcities: {\n\t\t\tid: 2,\n\t\t\tname: 'Seattle',\n\t\t\tstateId: 2,\n\t\t},\n\t\tstates: {\n\t\t\tid: 2,\n\t\t\tname: 'Washington',\n\t\t},\n\t}]);\n\texpect(result2).toStrictEqual([{\n\t\tid: 3,\n\t\tname: 'Jack',\n\t\tcityId: 3,\n\t\tcities: {\n\t\t\tid: 3,\n\t\t\tname: 'London',\n\t\t\tstateId: null,\n\t\t},\n\t\tstates: null,\n\t}]);\n});\n\ntest('insert into ... select', async () => {\n\tconst notifications = pgTable('notifications', {\n\t\tid: serial('id').primaryKey(),\n\t\tsentAt: timestamp('sent_at').notNull().defaultNow(),\n\t\tmessage: text('message').notNull(),\n\t});\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\tconst userNotications = pgTable('user_notifications', {\n\t\tuserId: integer('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),\n\t\tnotificationId: integer('notification_id').notNull().references(() => notifications.id, {\n\t\t\tonDelete: 'cascade',\n\t\t}),\n\t}, (t) => ({\n\t\tpk: primaryKey({ columns: [t.userId, t.notificationId] }),\n\t}));\n\n\tawait db.execute(sql`drop table if exists notifications`);\n\tawait db.execute(sql`drop table if exists users`);\n\tawait db.execute(sql`drop table if exists user_notifications`);\n\tawait db.execute(sql`\n\t\tcreate table notifications (\n\t\t\tid serial primary key,\n\t\t\tsent_at timestamp not null default now(),\n\t\t\tmessage text not null\n\t\t)\n\t`);\n\tawait db.execute(sql`\n\t\tcreate table users (\n\t\t\tid serial primary key,\n\t\t\tname text not null\n\t\t)\n\t`);\n\tawait db.execute(sql`\n\t\tcreate table user_notifications (\n\t\t\tuser_id int references users(id) on delete cascade,\n\t\t\tnotification_id int references notifications(id) on delete cascade,\n\t\t\tprimary key (user_id, notification_id)\n\t\t)\n\t`);\n\n\tconst newNotification = await db\n\t\t.insert(notifications)\n\t\t.values({ message: 'You are one of the 3 lucky winners!' })\n\t\t.returning({ id: notifications.id })\n\t\t.then((result) => result[0]);\n\tawait db.insert(users).values([\n\t\t{ name: 'Alice' },\n\t\t{ name: 'Bob' },\n\t\t{ name: 'Charlie' },\n\t\t{ name: 'David' },\n\t\t{ name: 'Eve' },\n\t]);\n\n\tconst sentNotifications = await db\n\t\t.insert(userNotications)\n\t\t.select(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users.id,\n\t\t\t\t\tnotificationId: sql`${newNotification!.id}`.as('notification_id'),\n\t\t\t\t})\n\t\t\t\t.from(users)\n\t\t\t\t.where(inArray(users.name, ['Alice', 'Charlie', 'Eve']))\n\t\t\t\t.orderBy(asc(users.id)),\n\t\t)\n\t\t.returning();\n\n\texpect(sentNotifications).toStrictEqual([\n\t\t{ userId: 1, notificationId: newNotification!.id },\n\t\t{ userId: 3, notificationId: newNotification!.id },\n\t\t{ userId: 5, notificationId: newNotification!.id },\n\t]);\n});\n\ntest('insert into ... select with keys in different order', async () => {\n\tconst users1 = pgTable('users1', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\tconst users2 = pgTable('users2', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists users1`);\n\tawait db.execute(sql`drop table if exists users2`);\n\tawait db.execute(sql`\n\t\tcreate table users1 (\n\t\t\tid serial primary key,\n\t\t\tname text not null\n\t\t)\n\t`);\n\tawait db.execute(sql`\n\t\tcreate table users2 (\n\t\t\tid serial primary key,\n\t\t\tname text not null\n\t\t)\n\t`);\n\n\texpect(\n\t\t() =>\n\t\t\tdb\n\t\t\t\t.insert(users1)\n\t\t\t\t.select(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tname: users2.name,\n\t\t\t\t\t\t\tid: users2.id,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(users2),\n\t\t\t\t),\n\t).toThrowError();\n});\n\ntest('policy', () => {\n\t{\n\t\tconst policy = pgPolicy('test policy');\n\n\t\texpect(is(policy, PgPolicy)).toBe(true);\n\t\texpect(policy.name).toBe('test policy');\n\t}\n\n\t{\n\t\tconst policy = pgPolicy('test policy', {\n\t\t\tas: 'permissive',\n\t\t\tfor: 'all',\n\t\t\tto: 'public',\n\t\t\tusing: sql`1=1`,\n\t\t\twithCheck: sql`1=1`,\n\t\t});\n\n\t\texpect(is(policy, PgPolicy)).toBe(true);\n\t\texpect(policy.name).toBe('test policy');\n\t\texpect(policy.as).toBe('permissive');\n\t\texpect(policy.for).toBe('all');\n\t\texpect(policy.to).toBe('public');\n\t\tconst dialect = new PgDialect();\n\t\texpect(is(policy.using, SQL)).toBe(true);\n\t\texpect(dialect.sqlToQuery(policy.using!).sql).toBe('1=1');\n\t\texpect(is(policy.withCheck, SQL)).toBe(true);\n\t\texpect(dialect.sqlToQuery(policy.withCheck!).sql).toBe('1=1');\n\t}\n\n\t{\n\t\tconst policy = pgPolicy('test policy', {\n\t\t\tto: 'custom value',\n\t\t});\n\n\t\texpect(policy.to).toBe('custom value');\n\t}\n\n\t{\n\t\tconst p1 = pgPolicy('test policy');\n\t\tconst p2 = pgPolicy('test policy 2', {\n\t\t\tas: 'permissive',\n\t\t\tfor: 'all',\n\t\t\tto: 'public',\n\t\t\tusing: sql`1=1`,\n\t\t\twithCheck: sql`1=1`,\n\t\t});\n\t\tconst table = pgTable('table_with_policy', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t}, () => ({\n\t\t\tp1,\n\t\t\tp2,\n\t\t}));\n\t\tconst config = getTableConfig(table);\n\t\texpect(config.policies).toHaveLength(2);\n\t\texpect(config.policies[0]).toBe(p1);\n\t\texpect(config.policies[1]).toBe(p2);\n\t}\n});\n\ntest('neon: policy', () => {\n\t{\n\t\tconst policy = crudPolicy({\n\t\t\tread: true,\n\t\t\tmodify: true,\n\t\t\trole: authenticatedRole,\n\t\t});\n\n\t\tfor (const it of Object.values(policy)) {\n\t\t\texpect(is(it, PgPolicy)).toBe(true);\n\t\t\texpect(it?.to).toStrictEqual(authenticatedRole);\n\t\t\tit?.using ? expect(it.using).toStrictEqual(sql`true`) : '';\n\t\t\tit?.withCheck ? expect(it.withCheck).toStrictEqual(sql`true`) : '';\n\t\t}\n\t}\n\n\t{\n\t\tconst table = pgTable('name', {\n\t\t\tid: integer('id'),\n\t\t}, (t) => [\n\t\t\tindex('name').on(t.id),\n\t\t\tcrudPolicy({\n\t\t\t\tread: true,\n\t\t\t\tmodify: true,\n\t\t\t\trole: authenticatedRole,\n\t\t\t}),\n\t\t\tprimaryKey({ columns: [t.id], name: 'custom' }),\n\t\t]);\n\n\t\tconst { policies, indexes, primaryKeys } = getTableConfig(table);\n\n\t\texpect(policies.length).toBe(4);\n\t\texpect(indexes.length).toBe(1);\n\t\texpect(primaryKeys.length).toBe(1);\n\n\t\texpect(policies[0]?.name === 'crud-custom-policy-modify');\n\t\texpect(policies[1]?.name === 'crud-custom-policy-read');\n\t}\n});\n\ntest('neon: neon_auth', () => {\n\tconst usersSyncTable = usersSync;\n\n\tconst { columns, schema, name } = getTableConfig(usersSyncTable);\n\n\texpect(name).toBe('users_sync');\n\texpect(schema).toBe('neon_auth');\n\texpect(columns).toHaveLength(7);\n});\n\ntest('Enable RLS function', () => {\n\tconst usersWithRLS = pgTable('users', {\n\t\tid: integer(),\n\t}).enableRLS();\n\n\tconst config1 = getTableConfig(usersWithRLS);\n\n\tconst usersNoRLS = pgTable('users', {\n\t\tid: integer(),\n\t});\n\n\tconst config2 = getTableConfig(usersNoRLS);\n\n\texpect(config1.enableRLS).toBeTruthy();\n\texpect(config2.enableRLS).toBeFalsy();\n});\n\ntest('$count separate', async () => {\n\tconst countTestTable = pgTable('count_test', {\n\t\tid: integer('id').notNull(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\tawait db.insert(countTestTable).values([\n\t\t{ id: 1, name: 'First' },\n\t\t{ id: 2, name: 'Second' },\n\t\t{ id: 3, name: 'Third' },\n\t\t{ id: 4, name: 'Fourth' },\n\t]);\n\n\tconst count = await db.$count(countTestTable);\n\n\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\texpect(count).toStrictEqual(4);\n});\n\ntest('$count embedded', async () => {\n\tconst countTestTable = pgTable('count_test', {\n\t\tid: integer('id').notNull(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\tawait db.insert(countTestTable).values([\n\t\t{ id: 1, name: 'First' },\n\t\t{ id: 2, name: 'Second' },\n\t\t{ id: 3, name: 'Third' },\n\t\t{ id: 4, name: 'Fourth' },\n\t]);\n\n\tconst count = await db.select({\n\t\tcount: db.$count(countTestTable),\n\t}).from(countTestTable);\n\n\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\texpect(count).toStrictEqual([\n\t\t{ count: 4 },\n\t\t{ count: 4 },\n\t\t{ count: 4 },\n\t\t{ count: 4 },\n\t]);\n});\n\ntest('$count separate reuse', async () => {\n\tconst countTestTable = pgTable('count_test', {\n\t\tid: integer('id').notNull(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\tawait db.insert(countTestTable).values([\n\t\t{ id: 1, name: 'First' },\n\t\t{ id: 2, name: 'Second' },\n\t\t{ id: 3, name: 'Third' },\n\t\t{ id: 4, name: 'Fourth' },\n\t]);\n\n\tconst count = db.$count(countTestTable);\n\n\tconst count1 = await count;\n\n\tawait db.insert(countTestTable).values({ id: 5, name: 'fifth' });\n\n\tconst count2 = await count;\n\n\tawait db.insert(countTestTable).values({ id: 6, name: 'sixth' });\n\n\tconst count3 = await count;\n\n\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\texpect(count1).toStrictEqual(4);\n\texpect(count2).toStrictEqual(5);\n\texpect(count3).toStrictEqual(6);\n});\n\ntest('$count embedded reuse', async () => {\n\tconst countTestTable = pgTable('count_test', {\n\t\tid: integer('id').notNull(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\tawait db.insert(countTestTable).values([\n\t\t{ id: 1, name: 'First' },\n\t\t{ id: 2, name: 'Second' },\n\t\t{ id: 3, name: 'Third' },\n\t\t{ id: 4, name: 'Fourth' },\n\t]);\n\n\tconst count = db.select({\n\t\tcount: db.$count(countTestTable),\n\t}).from(countTestTable);\n\n\tconst count1 = await count;\n\n\tawait db.insert(countTestTable).values({ id: 5, name: 'fifth' });\n\n\tconst count2 = await count;\n\n\tawait db.insert(countTestTable).values({ id: 6, name: 'sixth' });\n\n\tconst count3 = await count;\n\n\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\texpect(count1).toStrictEqual([\n\t\t{ count: 4 },\n\t\t{ count: 4 },\n\t\t{ count: 4 },\n\t\t{ count: 4 },\n\t]);\n\texpect(count2).toStrictEqual([\n\t\t{ count: 5 },\n\t\t{ count: 5 },\n\t\t{ count: 5 },\n\t\t{ count: 5 },\n\t\t{ count: 5 },\n\t]);\n\texpect(count3).toStrictEqual([\n\t\t{ count: 6 },\n\t\t{ count: 6 },\n\t\t{ count: 6 },\n\t\t{ count: 6 },\n\t\t{ count: 6 },\n\t\t{ count: 6 },\n\t]);\n});\n\ntest('$count separate with filters', async () => {\n\tconst countTestTable = pgTable('count_test', {\n\t\tid: integer('id').notNull(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\tawait db.insert(countTestTable).values([\n\t\t{ id: 1, name: 'First' },\n\t\t{ id: 2, name: 'Second' },\n\t\t{ id: 3, name: 'Third' },\n\t\t{ id: 4, name: 'Fourth' },\n\t]);\n\n\tconst count = await db.$count(countTestTable, gt(countTestTable.id, 1));\n\n\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\texpect(count).toStrictEqual(3);\n});\n\ntest('$count embedded with filters', async () => {\n\tconst countTestTable = pgTable('count_test', {\n\t\tid: integer('id').notNull(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\tawait db.insert(countTestTable).values([\n\t\t{ id: 1, name: 'First' },\n\t\t{ id: 2, name: 'Second' },\n\t\t{ id: 3, name: 'Third' },\n\t\t{ id: 4, name: 'Fourth' },\n\t]);\n\n\tconst count = await db.select({\n\t\tcount: db.$count(countTestTable, gt(countTestTable.id, 1)),\n\t}).from(countTestTable);\n\n\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\texpect(count).toStrictEqual([\n\t\t{ count: 3 },\n\t\t{ count: 3 },\n\t\t{ count: 3 },\n\t\t{ count: 3 },\n\t]);\n});\n\ntest('insert multiple rows into table with generated identity column', async () => {\n\tconst identityColumnsTable = pgTable('identity_columns_table', {\n\t\tid: integer('id').generatedAlwaysAsIdentity(),\n\t\tid1: integer('id1').generatedByDefaultAsIdentity(),\n\t\tname: text('name').notNull(),\n\t});\n\n\t// not passing identity columns\n\tawait db.execute(sql`drop table if exists ${identityColumnsTable}`);\n\tawait db.execute(\n\t\tsql`create table ${identityColumnsTable} (\"id\" integer generated always as identity, \"id1\" integer generated by default as identity, \"name\" text)`,\n\t);\n\n\tlet result = await db.insert(identityColumnsTable).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Bob' },\n\t]).returning();\n\n\texpect(result).toEqual([\n\t\t{ id: 1, id1: 1, name: 'John' },\n\t\t{ id: 2, id1: 2, name: 'Jane' },\n\t\t{ id: 3, id1: 3, name: 'Bob' },\n\t]);\n\n\t// passing generated by default as identity column\n\tawait db.execute(sql`drop table if exists ${identityColumnsTable}`);\n\tawait db.execute(\n\t\tsql`create table ${identityColumnsTable} (\"id\" integer generated always as identity, \"id1\" integer generated by default as identity, \"name\" text)`,\n\t);\n\n\tresult = await db.insert(identityColumnsTable).values([\n\t\t{ name: 'John', id1: 3 },\n\t\t{ name: 'Jane', id1: 5 },\n\t\t{ name: 'Bob', id1: 5 },\n\t]).returning();\n\n\texpect(result).toEqual([\n\t\t{ id: 1, id1: 3, name: 'John' },\n\t\t{ id: 2, id1: 5, name: 'Jane' },\n\t\t{ id: 3, id1: 5, name: 'Bob' },\n\t]);\n\n\t// passing all identity columns\n\tawait db.execute(sql`drop table if exists ${identityColumnsTable}`);\n\tawait db.execute(\n\t\tsql`create table ${identityColumnsTable} (\"id\" integer generated always as identity, \"id1\" integer generated by default as identity, \"name\" text)`,\n\t);\n\n\tresult = await db.insert(identityColumnsTable).overridingSystemValue().values([\n\t\t{ name: 'John', id: 2, id1: 3 },\n\t\t{ name: 'Jane', id: 4, id1: 5 },\n\t\t{ name: 'Bob', id: 4, id1: 5 },\n\t]).returning();\n\n\texpect(result).toEqual([\n\t\t{ id: 2, id1: 3, name: 'John' },\n\t\t{ id: 4, id1: 5, name: 'Jane' },\n\t\t{ id: 4, id1: 5, name: 'Bob' },\n\t]);\n});\n\ntest('insert as cte', async () => {\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial not null primary key, name text not null)`);\n\n\tconst sq1 = db.$with('sq').as(\n\t\tdb.insert(users).values({ name: 'John' }).returning(),\n\t);\n\tconst result1 = await db.with(sq1).select().from(sq1);\n\tconst result2 = await db.with(sq1).select({ id: sq1.id }).from(sq1);\n\n\tconst sq2 = db.$with('sq').as(\n\t\tdb.insert(users).values({ name: 'Jane' }).returning({ id: users.id, name: users.name }),\n\t);\n\tconst result3 = await db.with(sq2).select().from(sq2);\n\tconst result4 = await db.with(sq2).select({ name: sq2.name }).from(sq2);\n\n\texpect(result1).toEqual([{ id: 1, name: 'John' }]);\n\texpect(result2).toEqual([{ id: 2 }]);\n\texpect(result3).toEqual([{ id: 3, name: 'Jane' }]);\n\texpect(result4).toEqual([{ name: 'Jane' }]);\n});\n\ntest('update as cte', async () => {\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tage: integer('age').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text not null, age integer not null)`,\n\t);\n\n\tawait db.insert(users).values([\n\t\t{ name: 'John', age: 30 },\n\t\t{ name: 'Jane', age: 30 },\n\t]);\n\n\tconst sq1 = db.$with('sq').as(\n\t\tdb.update(users).set({ age: 25 }).where(eq(users.name, 'John')).returning(),\n\t);\n\tconst result1 = await db.with(sq1).select().from(sq1);\n\tawait db.update(users).set({ age: 30 });\n\tconst result2 = await db.with(sq1).select({ age: sq1.age }).from(sq1);\n\n\tconst sq2 = db.$with('sq').as(\n\t\tdb.update(users).set({ age: 20 }).where(eq(users.name, 'Jane')).returning({ name: users.name, age: users.age }),\n\t);\n\tconst result3 = await db.with(sq2).select().from(sq2);\n\tawait db.update(users).set({ age: 30 });\n\tconst result4 = await db.with(sq2).select({ age: sq2.age }).from(sq2);\n\n\texpect(result1).toEqual([{ id: 1, name: 'John', age: 25 }]);\n\texpect(result2).toEqual([{ age: 25 }]);\n\texpect(result3).toEqual([{ name: 'Jane', age: 20 }]);\n\texpect(result4).toEqual([{ age: 20 }]);\n});\n\ntest('delete as cte', async () => {\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial not null primary key, name text not null)`);\n\n\tawait db.insert(users).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Jane' },\n\t]);\n\n\tconst sq1 = db.$with('sq').as(\n\t\tdb.delete(users).where(eq(users.name, 'John')).returning(),\n\t);\n\tconst result1 = await db.with(sq1).select().from(sq1);\n\tawait db.insert(users).values({ name: 'John' });\n\tconst result2 = await db.with(sq1).select({ name: sq1.name }).from(sq1);\n\n\tconst sq2 = db.$with('sq').as(\n\t\tdb.delete(users).where(eq(users.name, 'Jane')).returning({ id: users.id, name: users.name }),\n\t);\n\tconst result3 = await db.with(sq2).select().from(sq2);\n\tawait db.insert(users).values({ name: 'Jane' });\n\tconst result4 = await db.with(sq2).select({ name: sq2.name }).from(sq2);\n\n\texpect(result1).toEqual([{ id: 1, name: 'John' }]);\n\texpect(result2).toEqual([{ name: 'John' }]);\n\texpect(result3).toEqual([{ id: 2, name: 'Jane' }]);\n\texpect(result4).toEqual([{ name: 'Jane' }]);\n});\n\ntest('sql operator as cte', async () => {\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial not null primary key, name text not null)`);\n\tawait db.insert(users).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Jane' },\n\t]);\n\n\tconst sq1 = db.$with('sq', {\n\t\tuserId: users.id,\n\t\tdata: {\n\t\t\tname: users.name,\n\t\t},\n\t}).as(sql`select * from ${users} where ${users.name} = 'John'`);\n\tconst result1 = await db.with(sq1).select().from(sq1);\n\n\tconst sq2 = db.$with('sq', {\n\t\tuserId: users.id,\n\t\tdata: {\n\t\t\tname: users.name,\n\t\t},\n\t}).as(() => sql`select * from ${users} where ${users.name} = 'Jane'`);\n\tconst result2 = await db.with(sq2).select().from(sq1);\n\n\texpect(result1).toEqual([{ userId: 1, data: { name: 'John' } }]);\n\texpect(result2).toEqual([{ userId: 2, data: { name: 'Jane' } }]);\n});\n\ntest('all types', async () => {\n\tawait db.execute(sql`CREATE TYPE \"public\".\"en\" AS ENUM('enVal1', 'enVal2');`);\n\tawait db.execute(sql`\n\t\t\t\tCREATE TABLE \"all_types\" (\n\t\t\t\t\t\"serial\" serial NOT NULL,\n\t\t\t\t\t\"bigserial53\" bigserial NOT NULL,\n\t\t\t\t\t\"bigserial64\" bigserial,\n\t\t\t\t\t\"int\" integer,\n\t\t\t\t\t\"bigint53\" bigint,\n\t\t\t\t\t\"bigint64\" bigint,\n\t\t\t\t\t\"bool\" boolean,\n\t\t\t\t\t\"char\" char,\n\t\t\t\t\t\"cidr\" \"cidr\",\n\t\t\t\t\t\"date\" date,\n\t\t\t\t\t\"date_str\" date,\n\t\t\t\t\t\"double\" double precision,\n\t\t\t\t\t\"enum\" \"en\",\n\t\t\t\t\t\"inet\" \"inet\",\n\t\t\t\t\t\"interval\" interval,\n\t\t\t\t\t\"json\" json,\n\t\t\t\t\t\"jsonb\" jsonb,\n\t\t\t\t\t\"line\" \"line\",\n\t\t\t\t\t\"line_tuple\" \"line\",\n\t\t\t\t\t\"macaddr\" \"macaddr\",\n\t\t\t\t\t\"macaddr8\" \"macaddr8\",\n\t\t\t\t\t\"numeric\" numeric,\n\t\t\t\t\t\"numeric_num\" numeric,\n\t\t\t\t\t\"numeric_big\" numeric,\n\t\t\t\t\t\"point\" \"point\",\n\t\t\t\t\t\"point_tuple\" \"point\",\n\t\t\t\t\t\"real\" real,\n\t\t\t\t\t\"smallint\" smallint,\n\t\t\t\t\t\"smallserial\" \"smallserial\" NOT NULL,\n\t\t\t\t\t\"text\" text,\n\t\t\t\t\t\"time\" time,\n\t\t\t\t\t\"timestamp\" timestamp,\n\t\t\t\t\t\"timestamp_tz\" timestamp with time zone,\n\t\t\t\t\t\"timestamp_str\" timestamp,\n\t\t\t\t\t\"timestamp_tz_str\" timestamp with time zone,\n\t\t\t\t\t\"uuid\" uuid,\n\t\t\t\t\t\"varchar\" varchar,\n\t\t\t\t\t\"arrint\" integer[],\n\t\t\t\t\t\"arrbigint53\" bigint[],\n\t\t\t\t\t\"arrbigint64\" bigint[],\n\t\t\t\t\t\"arrbool\" boolean[],\n\t\t\t\t\t\"arrchar\" char[],\n\t\t\t\t\t\"arrcidr\" \"cidr\"[],\n\t\t\t\t\t\"arrdate\" date[],\n\t\t\t\t\t\"arrdate_str\" date[],\n\t\t\t\t\t\"arrdouble\" double precision[],\n\t\t\t\t\t\"arrenum\" \"en\"[],\n\t\t\t\t\t\"arrinet\" \"inet\"[],\n\t\t\t\t\t\"arrinterval\" interval[],\n\t\t\t\t\t\"arrjson\" json[],\n\t\t\t\t\t\"arrjsonb\" jsonb[],\n\t\t\t\t\t\"arrline\" \"line\"[],\n\t\t\t\t\t\"arrline_tuple\" \"line\"[],\n\t\t\t\t\t\"arrmacaddr\" \"macaddr\"[],\n\t\t\t\t\t\"arrmacaddr8\" \"macaddr8\"[],\n\t\t\t\t\t\"arrnumeric\" numeric[],\n\t\t\t\t\t\"arrnumeric_num\" numeric[],\n\t\t\t\t\t\"arrnumeric_big\" numeric[],\n\t\t\t\t\t\"arrpoint\" \"point\"[],\n\t\t\t\t\t\"arrpoint_tuple\" \"point\"[],\n\t\t\t\t\t\"arrreal\" real[],\n\t\t\t\t\t\"arrsmallint\" smallint[],\n\t\t\t\t\t\"arrtext\" text[],\n\t\t\t\t\t\"arrtime\" time[],\n\t\t\t\t\t\"arrtimestamp\" timestamp[],\n\t\t\t\t\t\"arrtimestamp_tz\" timestamp with time zone[],\n\t\t\t\t\t\"arrtimestamp_str\" timestamp[],\n\t\t\t\t\t\"arrtimestamp_tz_str\" timestamp with time zone[],\n\t\t\t\t\t\"arruuid\" uuid[],\n\t\t\t\t\t\"arrvarchar\" varchar[]\n\t\t\t\t);\n\t\t\t`);\n\n\tawait db.insert(allTypesTable).values({\n\t\tserial: 1,\n\t\tsmallserial: 15,\n\t\tbigint53: 9007199254740991,\n\t\tbigint64: 5044565289845416380n,\n\t\tbigserial53: 9007199254740991,\n\t\tbigserial64: 5044565289845416380n,\n\t\tbool: true,\n\t\tchar: 'c',\n\t\tcidr: '2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128',\n\t\tinet: '192.168.0.1/24',\n\t\tmacaddr: '08:00:2b:01:02:03',\n\t\tmacaddr8: '08:00:2b:01:02:03:04:05',\n\t\tdate: new Date(1741743161623),\n\t\tdateStr: new Date(1741743161623).toISOString(),\n\t\tdouble: 15.35325689124218,\n\t\tenum: 'enVal1',\n\t\tint: 621,\n\t\tinterval: '2 months ago',\n\t\tjson: {\n\t\t\tstr: 'strval',\n\t\t\tarr: ['str', 10],\n\t\t},\n\t\tjsonb: {\n\t\t\tstr: 'strvalb',\n\t\t\tarr: ['strb', 11],\n\t\t},\n\t\tline: {\n\t\t\ta: 1,\n\t\t\tb: 2,\n\t\t\tc: 3,\n\t\t},\n\t\tlineTuple: [1, 2, 3],\n\t\tnumeric: '475452353476',\n\t\tnumericNum: 9007199254740991,\n\t\tnumericBig: 5044565289845416380n,\n\t\tpoint: {\n\t\t\tx: 24.5,\n\t\t\ty: 49.6,\n\t\t},\n\t\tpointTuple: [57.2, 94.3],\n\t\treal: 1.048596,\n\t\tsmallint: 10,\n\t\ttext: 'TEXT STRING',\n\t\ttime: '13:59:28',\n\t\ttimestamp: new Date(1741743161623),\n\t\ttimestampTz: new Date(1741743161623),\n\t\ttimestampStr: new Date(1741743161623).toISOString(),\n\t\ttimestampTzStr: new Date(1741743161623).toISOString(),\n\t\tuuid: 'b77c9eef-8e28-4654-88a1-7221b46d2a1c',\n\t\tvarchar: 'C4-',\n\t\tarrbigint53: [9007199254740991],\n\t\tarrbigint64: [5044565289845416380n],\n\t\tarrbool: [true],\n\t\tarrchar: ['c'],\n\t\tarrcidr: ['2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128'],\n\t\tarrinet: ['192.168.0.1/24'],\n\t\tarrmacaddr: ['08:00:2b:01:02:03'],\n\t\tarrmacaddr8: ['08:00:2b:01:02:03:04:05'],\n\t\tarrdate: [new Date(1741743161623)],\n\t\tarrdateStr: [new Date(1741743161623).toISOString()],\n\t\tarrdouble: [15.35325689124218],\n\t\tarrenum: ['enVal1'],\n\t\tarrint: [621],\n\t\tarrinterval: ['2 months ago'],\n\t\tarrjson: [{\n\t\t\tstr: 'strval',\n\t\t\tarr: ['str', 10],\n\t\t}],\n\t\tarrjsonb: [{\n\t\t\tstr: 'strvalb',\n\t\t\tarr: ['strb', 11],\n\t\t}],\n\t\tarrline: [{\n\t\t\ta: 1,\n\t\t\tb: 2,\n\t\t\tc: 3,\n\t\t}],\n\t\tarrlineTuple: [[1, 2, 3]],\n\t\tarrnumeric: ['475452353476'],\n\t\tarrnumericNum: [9007199254740991],\n\t\tarrnumericBig: [5044565289845416380n],\n\t\tarrpoint: [{\n\t\t\tx: 24.5,\n\t\t\ty: 49.6,\n\t\t}],\n\t\tarrpointTuple: [[57.2, 94.3]],\n\t\tarrreal: [1.048596],\n\t\tarrsmallint: [10],\n\t\tarrtext: ['TEXT STRING'],\n\t\tarrtime: ['13:59:28'],\n\t\tarrtimestamp: [new Date(1741743161623)],\n\t\tarrtimestampTz: [new Date(1741743161623)],\n\t\tarrtimestampStr: [new Date(1741743161623).toISOString()],\n\t\tarrtimestampTzStr: [new Date(1741743161623).toISOString()],\n\t\tarruuid: ['b77c9eef-8e28-4654-88a1-7221b46d2a1c'],\n\t\tarrvarchar: ['C4-'],\n\t});\n\n\tconst rawRes = await db.select().from(allTypesTable);\n\n\ttype ExpectedType = {\n\t\tserial: number;\n\t\tbigserial53: number;\n\t\tbigserial64: bigint;\n\t\tint: number | null;\n\t\tbigint53: number | null;\n\t\tbigint64: bigint | null;\n\t\tbool: boolean | null;\n\t\tchar: string | null;\n\t\tcidr: string | null;\n\t\tdate: Date | null;\n\t\tdateStr: string | null;\n\t\tdouble: number | null;\n\t\tenum: 'enVal1' | 'enVal2' | null;\n\t\tinet: string | null;\n\t\tinterval: string | null;\n\t\tjson: unknown;\n\t\tjsonb: unknown;\n\t\tline: {\n\t\t\ta: number;\n\t\t\tb: number;\n\t\t\tc: number;\n\t\t} | null;\n\t\tlineTuple: [number, number, number] | null;\n\t\tmacaddr: string | null;\n\t\tmacaddr8: string | null;\n\t\tnumeric: string | null;\n\t\tnumericNum: number | null;\n\t\tnumericBig: bigint | null;\n\t\tpoint: {\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t} | null;\n\t\tpointTuple: [number, number] | null;\n\t\treal: number | null;\n\t\tsmallint: number | null;\n\t\tsmallserial: number;\n\t\ttext: string | null;\n\t\ttime: string | null;\n\t\ttimestamp: Date | null;\n\t\ttimestampTz: Date | null;\n\t\ttimestampStr: string | null;\n\t\ttimestampTzStr: string | null;\n\t\tuuid: string | null;\n\t\tvarchar: string | null;\n\t\tarrint: number[] | null;\n\t\tarrbigint53: number[] | null;\n\t\tarrbigint64: bigint[] | null;\n\t\tarrbool: boolean[] | null;\n\t\tarrchar: string[] | null;\n\t\tarrcidr: string[] | null;\n\t\tarrdate: Date[] | null;\n\t\tarrdateStr: string[] | null;\n\t\tarrdouble: number[] | null;\n\t\tarrenum: ('enVal1' | 'enVal2')[] | null;\n\t\tarrinet: string[] | null;\n\t\tarrinterval: string[] | null;\n\t\tarrjson: unknown[] | null;\n\t\tarrjsonb: unknown[] | null;\n\t\tarrline: {\n\t\t\ta: number;\n\t\t\tb: number;\n\t\t\tc: number;\n\t\t}[] | null;\n\t\tarrlineTuple: [number, number, number][] | null;\n\t\tarrmacaddr: string[] | null;\n\t\tarrmacaddr8: string[] | null;\n\t\tarrnumeric: string[] | null;\n\t\tarrnumericNum: number[] | null;\n\t\tarrnumericBig: bigint[] | null;\n\t\tarrpoint: { x: number; y: number }[] | null;\n\t\tarrpointTuple: [number, number][] | null;\n\t\tarrreal: number[] | null;\n\t\tarrsmallint: number[] | null;\n\t\tarrtext: string[] | null;\n\t\tarrtime: string[] | null;\n\t\tarrtimestamp: Date[] | null;\n\t\tarrtimestampTz: Date[] | null;\n\t\tarrtimestampStr: string[] | null;\n\t\tarrtimestampTzStr: string[] | null;\n\t\tarruuid: string[] | null;\n\t\tarrvarchar: string[] | null;\n\t}[];\n\n\tconst expectedRes: ExpectedType = [\n\t\t{\n\t\t\tserial: 1,\n\t\t\tbigserial53: 9007199254740991,\n\t\t\tbigserial64: 5044565289845416380n,\n\t\t\tint: 621,\n\t\t\tbigint53: 9007199254740991,\n\t\t\tbigint64: 5044565289845416380n,\n\t\t\tbool: true,\n\t\t\tchar: 'c',\n\t\t\tcidr: '2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128',\n\t\t\tdate: new Date('2025-03-12T00:00:00.000Z'),\n\t\t\tdateStr: '2025-03-12',\n\t\t\tdouble: 15.35325689124218,\n\t\t\tenum: 'enVal1',\n\t\t\tinet: '192.168.0.1/24',\n\t\t\tinterval: '-2 mons',\n\t\t\tjson: { str: 'strval', arr: ['str', 10] },\n\t\t\tjsonb: { arr: ['strb', 11], str: 'strvalb' },\n\t\t\tline: { a: 1, b: 2, c: 3 },\n\t\t\tlineTuple: [1, 2, 3],\n\t\t\tmacaddr: '08:00:2b:01:02:03',\n\t\t\tmacaddr8: '08:00:2b:01:02:03:04:05',\n\t\t\tnumeric: '475452353476',\n\t\t\tnumericNum: 9007199254740991,\n\t\t\tnumericBig: 5044565289845416380n,\n\t\t\tpoint: { x: 24.5, y: 49.6 },\n\t\t\tpointTuple: [57.2, 94.3],\n\t\t\treal: 1.048596,\n\t\t\tsmallint: 10,\n\t\t\tsmallserial: 15,\n\t\t\ttext: 'TEXT STRING',\n\t\t\ttime: '13:59:28',\n\t\t\ttimestamp: new Date('2025-03-12T01:32:41.623Z'),\n\t\t\ttimestampTz: new Date('2025-03-12T01:32:41.623Z'),\n\t\t\ttimestampStr: '2025-03-12 01:32:41.623',\n\t\t\ttimestampTzStr: '2025-03-12 01:32:41.623+00',\n\t\t\tuuid: 'b77c9eef-8e28-4654-88a1-7221b46d2a1c',\n\t\t\tvarchar: 'C4-',\n\t\t\tarrint: [621],\n\t\t\tarrbigint53: [9007199254740991],\n\t\t\tarrbigint64: [5044565289845416380n],\n\t\t\tarrbool: [true],\n\t\t\tarrchar: ['c'],\n\t\t\tarrcidr: ['2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128'],\n\t\t\tarrdate: [new Date('2025-03-12T00:00:00.000Z')],\n\t\t\tarrdateStr: ['2025-03-12'],\n\t\t\tarrdouble: [15.35325689124218],\n\t\t\tarrenum: ['enVal1'],\n\t\t\tarrinet: ['192.168.0.1/24'],\n\t\t\tarrinterval: ['-2 mons'],\n\t\t\tarrjson: [{ str: 'strval', arr: ['str', 10] }],\n\t\t\tarrjsonb: [{ arr: ['strb', 11], str: 'strvalb' }],\n\t\t\tarrline: [{ a: 1, b: 2, c: 3 }],\n\t\t\tarrlineTuple: [[1, 2, 3]],\n\t\t\tarrmacaddr: ['08:00:2b:01:02:03'],\n\t\t\tarrmacaddr8: ['08:00:2b:01:02:03:04:05'],\n\t\t\tarrnumeric: ['475452353476'],\n\t\t\tarrnumericNum: [9007199254740991],\n\t\t\tarrnumericBig: [5044565289845416380n],\n\t\t\tarrpoint: [{ x: 24.5, y: 49.6 }],\n\t\t\tarrpointTuple: [[57.2, 94.3]],\n\t\t\tarrreal: [1.048596],\n\t\t\tarrsmallint: [10],\n\t\t\tarrtext: ['TEXT STRING'],\n\t\t\tarrtime: ['13:59:28'],\n\t\t\tarrtimestamp: [new Date('2025-03-12T01:32:41.623Z')],\n\t\t\tarrtimestampTz: [new Date('2025-03-12T01:32:41.623Z')],\n\t\t\tarrtimestampStr: ['2025-03-12 01:32:41.623'],\n\t\t\tarrtimestampTzStr: ['2025-03-12 01:32:41.623+00'],\n\t\t\tarruuid: ['b77c9eef-8e28-4654-88a1-7221b46d2a1c'],\n\t\t\tarrvarchar: ['C4-'],\n\t\t},\n\t];\n\n\tExpect<Equal<typeof rawRes, ExpectedType>>;\n\texpect(rawRes).toStrictEqual(expectedRes);\n});\n"
  },
  {
    "path": "integration-tests/tests/bun/sqlite-nw.test.ts",
    "content": "/// <reference types=\"bun-types\" />\nimport { Database } from 'bun:sqlite';\nimport { DefaultLogger, sql } from 'drizzle-orm';\nimport type { BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite';\nimport { drizzle } from 'drizzle-orm/bun-sqlite';\nimport { integer, real, sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport { suite } from 'uvu';\n\nconst order = sqliteTable('Order', {\n\tid: integer('Id'),\n\tcustomerId: text('CustomerId'),\n\temployeeId: integer('EmployeeId'),\n\torderDate: text('OrderDate'),\n\trequiredDate: text('RequiredDate'),\n\tshippedDate: text('ShippedDate'),\n\tshipVia: integer('ShipVia'),\n\tfreight: real('Freight'),\n\tshipName: text('ShipName'),\n\tshipAddress: text('ShipAddress'),\n\tshipCity: text('ShipCity'),\n\tshipRegion: text('ShipRegion'),\n\tshipPostalCode: text('ShipPostalCode'),\n\tshipCountry: text('ShipCountry'),\n});\n\ninterface Context {\n\tdb: BunSQLiteDatabase;\n}\n\nconst test = suite<Context>('sqlite-bun');\n\ntest.before((ctx) => {\n\ttry {\n\t\tconst dbPath = process.env['SQLITE_DB_PATH'] ?? ':memory:';\n\n\t\tconst client = new Database(dbPath);\n\t\tctx.db = drizzle(client, { logger: new DefaultLogger() });\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n// test.before.each((ctx) => {\n// \ttry {\n// \t\tconst { db } = ctx;\n\n// \t\tdb.run(sql`drop table if exists ${usersTable}`);\n// \t\tdb.run(sql`\n// \t\tcreate table ${usersTable} (\n// \t\t\tid integer primary key,\n// \t\t\tname text not null,\n// \t\t\tverified integer not null default 0,\n// \t\t\tjson blob,\n// \t\t\tcreated_at text not null default (strftime('%s', 'now'))\n// \t\t)`);\n// \t} catch (e) {\n// \t\tconsole.error(e);\n// \t}\n// });\n\ntest('select', (ctx) => {\n\tconst { db } = ctx;\n\n\t// TODO: convert to normalniy test\n\tconsole.log(db.select().from(order).where(sql`\"Order\".\"ShipCountry\" = \"Germany\"`).all()[0]);\n\tconsole.log(db.select().from(order).where(sql`\"Order\".\"ShipCountry\" = ${'Germany'}`).prepare().all()[0]);\n});\n\ntest.run();\n\n// test.serial('select partial', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst result = db.select({ name: usersTable.name }).from(usersTable).execute();\n\n// \tt.deepEqual(result, [{ name: 'John' }]);\n// });\n\n// test.serial('insert with auto increment', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values(\n// \t\t{ name: 'John' },\n// \t\t{ name: 'Jane' },\n// \t\t{ name: 'George' },\n// \t\t{ name: 'Austin' },\n// \t).execute();\n// \tconst result = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).execute();\n\n// \tt.deepEqual(result, [\n// \t\t{ id: 1, name: 'John' },\n// \t\t{ id: 2, name: 'Jane' },\n// \t\t{ id: 3, name: 'George' },\n// \t\t{ id: 4, name: 'Austin' },\n// \t]);\n// });\n\n// test.serial('insert with default values', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst result = db.select({\n// \t\tid: usersTable.id,\n// \t\tname: usersTable.name,\n// \t\tverified: usersTable.verified,\n// \t}).from(usersTable).execute();\n\n// \tt.deepEqual(result, [{ id: 1, name: 'John', verified: 0 }]);\n// });\n\n// test.serial('insert with overridden default values', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John', verified: 1 }).execute();\n// \tconst result = db.select({\n// \t\tid: usersTable.id,\n// \t\tname: usersTable.name,\n// \t\tverified: usersTable.verified,\n// \t}).from(usersTable).execute();\n\n// \tt.deepEqual(result, [{ id: 1, name: 'John', verified: 1 }]);\n// });\n\n// test.serial('update with returning all fields', (t) => {\n// \tconst { db } = t.context;\n\n// \tconst now = Date.now();\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst users = db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning().execute();\n\n// \tt.assert(users[0]!.createdAt instanceof Date);\n// \tt.assert(Math.abs(users[0]!.createdAt.getTime() - now) < 100);\n// \tt.deepEqual(users, [{ id: 1, name: 'Jane', verified: 0, json: null, createdAt: users[0]!.createdAt }]);\n// });\n\n// test.serial('update with returning partial', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst users = db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning({\n// \t\tid: usersTable.id,\n// \t\tname: usersTable.name,\n// \t}).execute();\n\n// \tt.deepEqual(users, [{ id: 1, name: 'Jane' }]);\n// });\n\n// test.serial('delete with returning all fields', (t) => {\n// \tconst { db } = t.context;\n\n// \tconst now = Date.now();\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst users = db.delete(usersTable).where(eq(usersTable.name, 'John')).returning().execute();\n\n// \tt.assert(users[0]!.createdAt instanceof Date);\n// \tt.assert(Math.abs(users[0]!.createdAt.getTime() - now) < 100);\n// \tt.deepEqual(users, [{ id: 1, name: 'John', verified: 0, json: null, createdAt: users[0]!.createdAt }]);\n// });\n\n// test.serial('delete with returning partial', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst users = db.delete(usersTable).where(eq(usersTable.name, 'John')).returning({\n// \t\tid: usersTable.id,\n// \t\tname: usersTable.name,\n// \t}).execute();\n\n// \tt.deepEqual(users, [{ id: 1, name: 'John' }]);\n// });\n\n// test.serial('insert + select', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst result = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).execute();\n\n// \tt.deepEqual(result, [{ id: 1, name: 'John' }]);\n\n// \tdb.insert(usersTable).values({ name: 'Jane' }).execute();\n// \tconst result2 = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).execute();\n\n// \tt.deepEqual(result2, [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]);\n// });\n\n// test.serial('json insert', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John', json: ['foo', 'bar'] }).execute();\n// \tconst result = db.select({\n// \t\tid: usersTable.id,\n// \t\tname: usersTable.name,\n// \t\tjson: usersTable.json,\n// \t}).from(usersTable).execute();\n\n// \tt.deepEqual(result, [{ id: 1, name: 'John', json: ['foo', 'bar'] }]);\n// });\n\n// test.serial('insert many', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values(\n// \t\t{ name: 'John' },\n// \t\t{ name: 'Bruce', json: ['foo', 'bar'] },\n// \t\t{ name: 'Jane' },\n// \t\t{ name: 'Austin', verified: 1 },\n// \t).execute();\n// \tconst result = db.select({\n// \t\tid: usersTable.id,\n// \t\tname: usersTable.name,\n// \t\tjson: usersTable.json,\n// \t\tverified: usersTable.verified,\n// \t}).from(usersTable).execute();\n\n// \tt.deepEqual(result, [\n// \t\t{ id: 1, name: 'John', json: null, verified: 0 },\n// \t\t{ id: 2, name: 'Bruce', json: ['foo', 'bar'], verified: 0 },\n// \t\t{ id: 3, name: 'Jane', json: null, verified: 0 },\n// \t\t{ id: 4, name: 'Austin', json: null, verified: 1 },\n// \t]);\n// });\n\n// test.serial('insert many with returning', (t) => {\n// \tconst { db } = t.context;\n\n// \tconst result = db.insert(usersTable).values(\n// \t\t{ name: 'John' },\n// \t\t{ name: 'Bruce', json: ['foo', 'bar'] },\n// \t\t{ name: 'Jane' },\n// \t\t{ name: 'Austin', verified: 1 },\n// \t)\n// \t\t.returning({\n// \t\t\tid: usersTable.id,\n// \t\t\tname: usersTable.name,\n// \t\t\tjson: usersTable.json,\n// \t\t\tverified: usersTable.verified,\n// \t\t})\n// \t\t.execute();\n\n// \tt.deepEqual(result, [\n// \t\t{ id: 1, name: 'John', json: null, verified: 0 },\n// \t\t{ id: 2, name: 'Bruce', json: ['foo', 'bar'], verified: 0 },\n// \t\t{ id: 3, name: 'Jane', json: null, verified: 0 },\n// \t\t{ id: 4, name: 'Austin', json: null, verified: 1 },\n// \t]);\n// });\n\n// test.serial('join with alias', (t) => {\n// \tconst { db } = t.context;\n// \tconst customerAlias = alias(usersTable, 'customer');\n\n// \tdb.insert(usersTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]).execute();\n// \tconst result = db\n// \t\t.select().from(usersTable)\n// \t\t.fields({ id: usersTable.id, name: usersTable.name })\n// \t\t.leftJoin(customerAlias, eq(customerAlias.id, 11), { id: customerAlias.id, name: customerAlias.name })\n// \t\t.where(eq(usersTable.id, 10))\n// \t\t.execute();\n\n// \tt.deepEqual(result, [{\n// \t\tusers: { id: 10, name: 'Ivan' },\n// \t\tcustomer: { id: 11, name: 'Hans' },\n// \t}]);\n// });\n\n// test('insert with spaces', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: sql`'Jo   h     n'` }).execute();\n// \tconst result = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).execute();\n\n// \tt.deepEqual(result, [{ id: 1, name: 'Jo   h     n' }]);\n// });\n\n// test.after.always((t) => {\n// \tconst ctx = t.context;\n// \tctx.client?.close();\n// });\n"
  },
  {
    "path": "integration-tests/tests/bun/sqlite.test.ts",
    "content": "import { Database } from 'bun:sqlite';\nimport { beforeAll, beforeEach, expect, test } from 'bun:test';\nimport { sql } from 'drizzle-orm';\nimport type { BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite';\nimport { drizzle } from 'drizzle-orm/bun-sqlite';\nimport { blob, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nconst usersTable = sqliteTable('users', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: integer('verified').notNull().default(0),\n\tjson: blob('json', { mode: 'json' }).$type<string[]>(),\n\tbigInt: blob('big_int', { mode: 'bigint' }),\n\tcreatedAt: integer('created_at', { mode: 'timestamp_ms' }).notNull().default(sql`strftime('%s', 'now')`),\n});\n\nlet db: BunSQLiteDatabase;\n\nbeforeAll(async () => {\n\ttry {\n\t\tconst dbPath = process.env['SQLITE_DB_PATH'] ?? ':memory:';\n\n\t\tconst client = new Database(dbPath);\n\t\tdb = drizzle(client);\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\nbeforeEach(async () => {\n\ttry {\n\t\tdb.run(sql`drop table if exists ${usersTable}`);\n\t\tdb.run(sql`\n\t\t\tcreate table ${usersTable} (\n\t\t\t\tid integer primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified integer not null default 0,\n\t\t\t\tjson blob,\n\t\t\t\tbig_int blob,\n\t\t\t\tcreated_at integer not null default (strftime('%s', 'now'))\n\t\t\t)\n\t\t`);\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\ntest.skip('select large integer', () => {\n\tconst a = 1667476703000;\n\tconst res = db.all<{ a: number }>(sql`select ${sql.raw(String(a))} as a`);\n\tconst result = res[0]!;\n\texpect(result.a).toEqual(a);\n});\n\ntest('select all fields', () => {\n\tconst now = Date.now();\n\n\tdb.insert(usersTable).values({ name: 'John' }).run();\n\tconst result = db.select().from(usersTable).all()[0]!;\n\n\texpect(result.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(result.createdAt.getTime() - now)).toBeLessThan(100);\n\texpect(result).toEqual({ id: 1, name: 'John', verified: 0, json: null, createdAt: result.createdAt, bigInt: null });\n});\n\ntest('select bigint', () => {\n\tdb.insert(usersTable).values({ name: 'John', bigInt: BigInt(100) }).run();\n\tconst result = db.select({ bigInt: usersTable.bigInt }).from(usersTable).all()[0]!;\n\n\texpect(result).toEqual({ bigInt: BigInt(100) });\n});\n\n// test.serial('select partial', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst result = db.select({ name: usersTable.name }).from(usersTable).execute();\n\n// \tt.deepEqual(result, [{ name: 'John' }]);\n// });\n\n// test.serial('insert with auto increment', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values(\n// \t\t{ name: 'John' },\n// \t\t{ name: 'Jane' },\n// \t\t{ name: 'George' },\n// \t\t{ name: 'Austin' },\n// \t).execute();\n// \tconst result = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).execute();\n\n// \tt.deepEqual(result, [\n// \t\t{ id: 1, name: 'John' },\n// \t\t{ id: 2, name: 'Jane' },\n// \t\t{ id: 3, name: 'George' },\n// \t\t{ id: 4, name: 'Austin' },\n// \t]);\n// });\n\n// test.serial('insert with default values', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst result = db.select({\n// \t\tid: usersTable.id,\n// \t\tname: usersTable.name,\n// \t\tverified: usersTable.verified,\n// \t}).from(usersTable).execute();\n\n// \tt.deepEqual(result, [{ id: 1, name: 'John', verified: 0 }]);\n// });\n\n// test.serial('insert with overridden default values', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John', verified: 1 }).execute();\n// \tconst result = db.select({\n// \t\tid: usersTable.id,\n// \t\tname: usersTable.name,\n// \t\tverified: usersTable.verified,\n// \t}).from(usersTable).execute();\n\n// \tt.deepEqual(result, [{ id: 1, name: 'John', verified: 1 }]);\n// });\n\n// test.serial('update with returning all fields', (t) => {\n// \tconst { db } = t.context;\n\n// \tconst now = Date.now();\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst users = db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning().execute();\n\n// \tt.assert(users[0]!.createdAt instanceof Date);\n// \tt.assert(Math.abs(users[0]!.createdAt.getTime() - now) < 100);\n// \tt.deepEqual(users, [{ id: 1, name: 'Jane', verified: 0, json: null, createdAt: users[0]!.createdAt }]);\n// });\n\n// test.serial('update with returning partial', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst users = db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning({\n// \t\tid: usersTable.id,\n// \t\tname: usersTable.name,\n// \t}).execute();\n\n// \tt.deepEqual(users, [{ id: 1, name: 'Jane' }]);\n// });\n\n// test.serial('delete with returning all fields', (t) => {\n// \tconst { db } = t.context;\n\n// \tconst now = Date.now();\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst users = db.delete(usersTable).where(eq(usersTable.name, 'John')).returning().execute();\n\n// \tt.assert(users[0]!.createdAt instanceof Date);\n// \tt.assert(Math.abs(users[0]!.createdAt.getTime() - now) < 100);\n// \tt.deepEqual(users, [{ id: 1, name: 'John', verified: 0, json: null, createdAt: users[0]!.createdAt }]);\n// });\n\n// test.serial('delete with returning partial', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst users = db.delete(usersTable).where(eq(usersTable.name, 'John')).returning({\n// \t\tid: usersTable.id,\n// \t\tname: usersTable.name,\n// \t}).execute();\n\n// \tt.deepEqual(users, [{ id: 1, name: 'John' }]);\n// });\n\n// test.serial('insert + select', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John' }).execute();\n// \tconst result = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).execute();\n\n// \tt.deepEqual(result, [{ id: 1, name: 'John' }]);\n\n// \tdb.insert(usersTable).values({ name: 'Jane' }).execute();\n// \tconst result2 = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).execute();\n\n// \tt.deepEqual(result2, [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]);\n// });\n\n// test.serial('json insert', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: 'John', json: ['foo', 'bar'] }).execute();\n// \tconst result = db.select({\n// \t\tid: usersTable.id,\n// \t\tname: usersTable.name,\n// \t\tjson: usersTable.json,\n// \t}).from(usersTable).execute();\n\n// \tt.deepEqual(result, [{ id: 1, name: 'John', json: ['foo', 'bar'] }]);\n// });\n\n// test.serial('insert many', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values(\n// \t\t{ name: 'John' },\n// \t\t{ name: 'Bruce', json: ['foo', 'bar'] },\n// \t\t{ name: 'Jane' },\n// \t\t{ name: 'Austin', verified: 1 },\n// \t).execute();\n// \tconst result = db.select({\n// \t\tid: usersTable.id,\n// \t\tname: usersTable.name,\n// \t\tjson: usersTable.json,\n// \t\tverified: usersTable.verified,\n// \t}).from(usersTable).execute();\n\n// \tt.deepEqual(result, [\n// \t\t{ id: 1, name: 'John', json: null, verified: 0 },\n// \t\t{ id: 2, name: 'Bruce', json: ['foo', 'bar'], verified: 0 },\n// \t\t{ id: 3, name: 'Jane', json: null, verified: 0 },\n// \t\t{ id: 4, name: 'Austin', json: null, verified: 1 },\n// \t]);\n// });\n\n// test.serial('insert many with returning', (t) => {\n// \tconst { db } = t.context;\n\n// \tconst result = db.insert(usersTable).values(\n// \t\t{ name: 'John' },\n// \t\t{ name: 'Bruce', json: ['foo', 'bar'] },\n// \t\t{ name: 'Jane' },\n// \t\t{ name: 'Austin', verified: 1 },\n// \t)\n// \t\t.returning({\n// \t\t\tid: usersTable.id,\n// \t\t\tname: usersTable.name,\n// \t\t\tjson: usersTable.json,\n// \t\t\tverified: usersTable.verified,\n// \t\t})\n// \t\t.execute();\n\n// \tt.deepEqual(result, [\n// \t\t{ id: 1, name: 'John', json: null, verified: 0 },\n// \t\t{ id: 2, name: 'Bruce', json: ['foo', 'bar'], verified: 0 },\n// \t\t{ id: 3, name: 'Jane', json: null, verified: 0 },\n// \t\t{ id: 4, name: 'Austin', json: null, verified: 1 },\n// \t]);\n// });\n\n// test.serial('join with alias', (t) => {\n// \tconst { db } = t.context;\n// \tconst customerAlias = alias(usersTable, 'customer');\n\n// \tdb.insert(usersTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]).execute();\n// \tconst result = db\n// \t\t.select().from(usersTable)\n// \t\t.fields({ id: usersTable.id, name: usersTable.name })\n// \t\t.leftJoin(customerAlias, eq(customerAlias.id, 11), { id: customerAlias.id, name: customerAlias.name })\n// \t\t.where(eq(usersTable.id, 10))\n// \t\t.execute();\n\n// \tt.deepEqual(result, [{\n// \t\tusers: { id: 10, name: 'Ivan' },\n// \t\tcustomer: { id: 11, name: 'Hans' },\n// \t}]);\n// });\n\n// test('insert with spaces', (t) => {\n// \tconst { db } = t.context;\n\n// \tdb.insert(usersTable).values({ name: sql`'Jo   h     n'` }).execute();\n// \tconst result = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).execute();\n\n// \tt.deepEqual(result, [{ id: 1, name: 'Jo   h     n' }]);\n// });\n\n// test.after.always((t) => {\n// \tconst ctx = t.context;\n// \tctx.client?.close();\n// });\n"
  },
  {
    "path": "integration-tests/tests/common.ts",
    "content": "import { beforeEach } from 'vitest';\n\nexport function skipTests(names: string[]) {\n\tbeforeEach((ctx) => {\n\t\tif (ctx.task.suite?.name === 'common' && names.includes(ctx.task.name)) {\n\t\t\tctx.skip();\n\t\t}\n\t});\n}\n"
  },
  {
    "path": "integration-tests/tests/extensions/postgis/pg.test.ts",
    "content": "import Docker from 'dockerode';\nimport { sql } from 'drizzle-orm';\nimport type { NodePgDatabase } from 'drizzle-orm/node-postgres';\nimport { drizzle } from 'drizzle-orm/node-postgres';\nimport { bigserial, geometry, line, pgTable, point } from 'drizzle-orm/pg-core';\nimport getPort from 'get-port';\nimport pg from 'pg';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\n\nconst { Client } = pg;\n\nconst ENABLE_LOGGING = false;\n\nlet pgContainer: Docker.Container;\nlet docker: Docker;\nlet client: pg.Client;\nlet db: NodePgDatabase;\n\nasync function createDockerDB(): Promise<string> {\n\tconst inDocker = (docker = new Docker());\n\tconst port = await getPort({ port: 5432 });\n\tconst image = 'postgis/postgis:16-3.4';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tinDocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tpgContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['POSTGRES_PASSWORD=postgres', 'POSTGRES_USER=postgres', 'POSTGRES_DB=postgres'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5432/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait pgContainer.start();\n\n\treturn `postgres://postgres:postgres@localhost:${port}/postgres`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['PG_POSTGIS_CONNECTION_STRING'] ?? (await createDockerDB());\n\n\tconst sleep = 1000;\n\tlet timeLeft = 20000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = new Client(connectionString);\n\t\t\tawait client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to Postgres');\n\t\tawait client?.end().catch(console.error);\n\t\tawait pgContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\n\tawait db.execute(sql`CREATE EXTENSION IF NOT EXISTS postgis;`);\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait pgContainer?.stop().catch(console.error);\n});\n\nconst items = pgTable('items', {\n\tid: bigserial('id', { mode: 'number' }).primaryKey(),\n\tpoint: point('point'),\n\tpointObj: point('point_xy', { mode: 'xy' }),\n\tline: line('line'),\n\tlineObj: line('line_abc', { mode: 'abc' }),\n\tgeo: geometry('geo', { type: 'point' }),\n\tgeoObj: geometry('geo_obj', { type: 'point', mode: 'xy' }),\n\tgeoSrid: geometry('geo_options', { type: 'point', mode: 'xy', srid: 4000 }),\n});\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop table if exists items cascade`);\n\tawait db.execute(sql`\n\t\tCREATE TABLE items (\n\t\t          id bigserial PRIMARY KEY, \n\t\t          \"point\" point,\n\t\t          \"point_xy\" point,\n\t\t          \"line\" line,\n\t\t          \"line_abc\" line,\n\t\t\t\t  \"geo\" geometry(point),\n\t\t\t\t  \"geo_obj\" geometry(point),\n\t\t\t\t  \"geo_options\" geometry(point,4000)\n\t\t      );\n\t`);\n});\n\ntest('insert + select', async () => {\n\tconst insertedValues = await db.insert(items).values([{\n\t\tpoint: [1, 2],\n\t\tpointObj: { x: 1, y: 2 },\n\t\tline: [1, 2, 3],\n\t\tlineObj: { a: 1, b: 2, c: 3 },\n\t\tgeo: [1, 2],\n\t\tgeoObj: { x: 1, y: 2 },\n\t\tgeoSrid: { x: 1, y: 2 },\n\t}]).returning();\n\n\tconst response = await db.select().from(items);\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tpoint: [1, 2],\n\t\tpointObj: { x: 1, y: 2 },\n\t\tline: [1, 2, 3],\n\t\tlineObj: { a: 1, b: 2, c: 3 },\n\t\tgeo: [1, 2],\n\t\tgeoObj: { x: 1, y: 2 },\n\t\tgeoSrid: { x: 1, y: 2 },\n\t}]);\n\n\texpect(response).toStrictEqual([{\n\t\tid: 1,\n\t\tpoint: [1, 2],\n\t\tpointObj: { x: 1, y: 2 },\n\t\tline: [1, 2, 3],\n\t\tlineObj: { a: 1, b: 2, c: 3 },\n\t\tgeo: [1, 2],\n\t\tgeoObj: { x: 1, y: 2 },\n\t\tgeoSrid: { x: 1, y: 2 },\n\t}]);\n});\n"
  },
  {
    "path": "integration-tests/tests/extensions/postgis/postgres.test.ts",
    "content": "import Docker from 'dockerode';\nimport { sql } from 'drizzle-orm';\nimport { bigserial, geometry, line, pgTable, point } from 'drizzle-orm/pg-core';\nimport { drizzle, type PostgresJsDatabase } from 'drizzle-orm/postgres-js';\nimport getPort from 'get-port';\nimport postgres, { type Sql } from 'postgres';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\n\nconst ENABLE_LOGGING = false;\n\nlet pgContainer: Docker.Container;\nlet docker: Docker;\nlet client: Sql;\nlet db: PostgresJsDatabase;\n\nasync function createDockerDB(): Promise<string> {\n\tconst inDocker = (docker = new Docker());\n\tconst port = await getPort({ port: 5432 });\n\tconst image = 'postgis/postgis:16-3.4';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tinDocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tpgContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['POSTGRES_PASSWORD=postgres', 'POSTGRES_USER=postgres', 'POSTGRES_DB=postgres'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5432/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait pgContainer.start();\n\n\treturn `postgres://postgres:postgres@localhost:${port}/postgres`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['PG_POSTGIS_CONNECTION_STRING'] ?? (await createDockerDB());\n\n\tconst sleep = 1000;\n\tlet timeLeft = 20000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = postgres(connectionString, {\n\t\t\t\tmax: 1,\n\t\t\t\tonnotice: () => {\n\t\t\t\t\t// disable notices\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait client`select 1`;\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to Postgres');\n\t\tawait client?.end().catch(console.error);\n\t\tawait pgContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\n\tawait db.execute(sql`CREATE EXTENSION IF NOT EXISTS postgis;`);\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait pgContainer?.stop().catch(console.error);\n});\n\nconst items = pgTable('items', {\n\tid: bigserial('id', { mode: 'number' }).primaryKey(),\n\tpoint: point('point'),\n\tpointObj: point('point_xy', { mode: 'xy' }),\n\tline: line('line'),\n\tlineObj: line('line_abc', { mode: 'abc' }),\n\tgeo: geometry('geo', { type: 'point' }),\n\tgeoObj: geometry('geo_obj', { type: 'point', mode: 'xy' }),\n\tgeoSrid: geometry('geo_options', { type: 'point', mode: 'xy', srid: 4000 }),\n});\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop table if exists items cascade`);\n\tawait db.execute(sql`\n\t\tCREATE TABLE items (\n\t\t          id bigserial PRIMARY KEY, \n\t\t          \"point\" point,\n\t\t          \"point_xy\" point,\n\t\t          \"line\" line,\n\t\t          \"line_abc\" line,\n\t\t\t\t  \"geo\" geometry(point),\n\t\t\t\t  \"geo_obj\" geometry(point),\n\t\t\t\t  \"geo_options\" geometry(point,4000)\n\t\t      );\n\t`);\n});\n\ntest('insert + select', async () => {\n\tconst insertedValues = await db.insert(items).values([{\n\t\tpoint: [1, 2],\n\t\tpointObj: { x: 1, y: 2 },\n\t\tline: [1, 2, 3],\n\t\tlineObj: { a: 1, b: 2, c: 3 },\n\t\tgeo: [1, 2],\n\t\tgeoObj: { x: 1, y: 2 },\n\t\tgeoSrid: { x: 1, y: 2 },\n\t}]).returning();\n\n\tconst response = await db.select().from(items);\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tpoint: [1, 2],\n\t\tpointObj: { x: 1, y: 2 },\n\t\tline: [1, 2, 3],\n\t\tlineObj: { a: 1, b: 2, c: 3 },\n\t\tgeo: [1, 2],\n\t\tgeoObj: { x: 1, y: 2 },\n\t\tgeoSrid: { x: 1, y: 2 },\n\t}]);\n\n\texpect(response).toStrictEqual([{\n\t\tid: 1,\n\t\tpoint: [1, 2],\n\t\tpointObj: { x: 1, y: 2 },\n\t\tline: [1, 2, 3],\n\t\tlineObj: { a: 1, b: 2, c: 3 },\n\t\tgeo: [1, 2],\n\t\tgeoObj: { x: 1, y: 2 },\n\t\tgeoSrid: { x: 1, y: 2 },\n\t}]);\n});\n"
  },
  {
    "path": "integration-tests/tests/extensions/vectors/pg.test.ts",
    "content": "import Docker from 'dockerode';\nimport { eq, hammingDistance, jaccardDistance, l2Distance, not, sql } from 'drizzle-orm';\nimport type { NodePgDatabase } from 'drizzle-orm/node-postgres';\nimport { drizzle } from 'drizzle-orm/node-postgres';\nimport { bigserial, bit, halfvec, pgTable, sparsevec, vector } from 'drizzle-orm/pg-core';\nimport getPort from 'get-port';\nimport pg from 'pg';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\n\nconst { Client } = pg;\n\nconst ENABLE_LOGGING = false;\n\nlet pgContainer: Docker.Container;\nlet docker: Docker;\nlet client: pg.Client;\nlet db: NodePgDatabase;\n\nasync function createDockerDB(): Promise<string> {\n\tconst inDocker = (docker = new Docker());\n\tconst port = await getPort({ port: 5432 });\n\tconst image = 'pgvector/pgvector:pg16';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tinDocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tpgContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['POSTGRES_PASSWORD=postgres', 'POSTGRES_USER=postgres', 'POSTGRES_DB=postgres'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5432/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait pgContainer.start();\n\n\treturn `postgres://postgres:postgres@localhost:${port}/postgres`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['PG_VECTOR_CONNECTION_STRING'] ?? (await createDockerDB());\n\n\tconst sleep = 250;\n\tlet timeLeft = 5000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = new Client(connectionString);\n\t\t\tawait client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to Postgres');\n\t\tawait client?.end().catch(console.error);\n\t\tawait pgContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\n\tawait db.execute(sql`CREATE EXTENSION IF NOT EXISTS vector;`);\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait pgContainer?.stop().catch(console.error);\n});\n\nconst items = pgTable('items', {\n\tid: bigserial('id', { mode: 'number' }).primaryKey(),\n\tvector: vector('vector', { dimensions: 3 }),\n\tbit: bit('bit', { dimensions: 3 }),\n\thalfvec: halfvec('halfvec', { dimensions: 3 }),\n\tsparsevec: sparsevec('sparsevec', { dimensions: 5 }),\n});\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop table if exists items cascade`);\n\tawait db.execute(sql`\n\t\tCREATE TABLE items (\n\t\t          id bigserial PRIMARY KEY, \n\t\t          \"vector\" vector(3),\n\t\t          \"bit\" bit(3),\n\t\t          \"halfvec\" halfvec(3),\n\t\t          \"sparsevec\" sparsevec(5) \n\t\t      );\n\t`);\n});\n\ntest('insert + partial select', async () => {\n\tconst insertedValues = await db.insert(items).values([{\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]).returning();\n\n\tconst query = db.select({ distance: l2Distance(items.vector, [3, 1, 2]) }).from(items);\n\n\texpect(query.toSQL()).toStrictEqual({ sql: 'select \"vector\" <-> $1 from \"items\"', params: ['[3,1,2]'] });\n\n\tconst response = await query;\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\texpect(response).toStrictEqual([{ distance: 0 }]);\n});\n\n// SELECT * FROM items WHERE embedding <-> '[3,1,2]' < 5;\ntest('insert + complex where', async () => {\n\tconst insertedValues = await db.insert(items).values([{\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]).returning();\n\n\tconst query = db.select().from(items)\n\t\t.where(sql`${l2Distance(items.vector, [3, 1, 2])} < ${5}`)\n\t\t.limit(5);\n\n\texpect(query.toSQL()).toStrictEqual({\n\t\tsql:\n\t\t\t'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" where \"items\".\"vector\" <-> $1 < $2 limit $3',\n\t\tparams: ['[3,1,2]', 5, 5],\n\t});\n\tconst res = await query;\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\texpect(res).toStrictEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\tvector: [3, 1, 2],\n\t\t\tbit: '000',\n\t\t\thalfvec: [1, 2, 3],\n\t\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t\t},\n\t]);\n});\n\n// SELECT * FROM items WHERE id != 1 ORDER BY embedding <-> (SELECT embedding FROM items WHERE id = 1) LIMIT 5;\ntest('insert + order by subquery', async () => {\n\tconst insertedValues = await db.insert(items).values([{\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}, {\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]).returning();\n\n\tconst subquery = db.select({ vector: items.vector }).from(items).where(eq(items.id, 1));\n\n\tconst query = db.select().from(items)\n\t\t.where(not(eq(items.id, 1)))\n\t\t.orderBy(l2Distance(items.vector, subquery))\n\t\t.limit(5);\n\n\texpect(query.toSQL()).toStrictEqual({\n\t\tsql:\n\t\t\t'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" where not \"items\".\"id\" = $1 order by \"items\".\"vector\" <-> (select \"vector\" from \"items\" where \"items\".\"id\" = $2) limit $3',\n\t\tparams: [1, 1, 5],\n\t});\n\tconst res = await query;\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}, {\n\t\tid: 2,\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\texpect(res).toStrictEqual([\n\t\t{\n\t\t\tid: 2,\n\t\t\tvector: [3, 1, 2],\n\t\t\tbit: '000',\n\t\t\thalfvec: [1, 2, 3],\n\t\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t\t},\n\t]);\n});\n\ntest('insert + select order by jaccard distance', async () => {\n\tconst insertedValues = await db.insert(items).values({\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}).returning();\n\n\tconst bitQuery = db.select().from(items).orderBy(jaccardDistance(items.bit, '101')).limit(5);\n\n\texpect(bitQuery.toSQL()).toStrictEqual({\n\t\tparams: [\n\t\t\t'101',\n\t\t\t5,\n\t\t],\n\t\tsql: 'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" order by \"items\".\"bit\" <%> $1 limit $2',\n\t});\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\tconst response = await bitQuery;\n\n\texpect(response).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n});\n\ntest('insert + select order by hamming distance', async () => {\n\tconst insertedValues = await db.insert(items).values({\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}).returning();\n\n\tconst bitQuery = db.select().from(items).orderBy(hammingDistance(items.bit, '101')).limit(5);\n\n\texpect(bitQuery.toSQL()).toStrictEqual({\n\t\tparams: [\n\t\t\t'101',\n\t\t\t5,\n\t\t],\n\t\tsql: 'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" order by \"items\".\"bit\" <~> $1 limit $2',\n\t});\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\tconst response = await bitQuery;\n\n\texpect(response).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n});\n\ntest('insert + select order by l2 distance', async () => {\n\tconst insertedValues = await db.insert(items).values({\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}).returning();\n\n\tconst queryVector = db.select().from(items).orderBy(l2Distance(items.vector, [3, 1, 2])).limit(5);\n\tconst queryHalfvec = db.select().from(items).orderBy(l2Distance(items.halfvec, [3, 1, 2])).limit(5);\n\tconst querySparsevec = db.select().from(items).orderBy(l2Distance(items.sparsevec, '{1:3,3:1,5:2}/5')).limit(5);\n\n\texpect(queryVector.toSQL()).toStrictEqual({\n\t\tparams: [\n\t\t\t'[3,1,2]',\n\t\t\t5,\n\t\t],\n\t\tsql: 'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" order by \"items\".\"vector\" <-> $1 limit $2',\n\t});\n\n\texpect(queryHalfvec.toSQL()).toStrictEqual({\n\t\tparams: [\n\t\t\t'[3,1,2]',\n\t\t\t5,\n\t\t],\n\t\tsql: 'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" order by \"items\".\"halfvec\" <-> $1 limit $2',\n\t});\n\n\texpect(querySparsevec.toSQL()).toStrictEqual({\n\t\tparams: [\n\t\t\t'{1:3,3:1,5:2}/5',\n\t\t\t5,\n\t\t],\n\t\tsql:\n\t\t\t'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" order by \"items\".\"sparsevec\" <-> $1 limit $2',\n\t});\n\n\tconst vectorRes = await queryVector;\n\tconst halfvecRes = await queryHalfvec;\n\tconst sparsevecRes = await querySparsevec;\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\tconst expectedResponse = [{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}];\n\n\texpect(vectorRes).toStrictEqual(expectedResponse);\n\texpect(halfvecRes).toStrictEqual(expectedResponse);\n\texpect(sparsevecRes).toStrictEqual(expectedResponse);\n});\n\ntest('select + insert all vectors', async () => {\n\tconst insertedValues = await db.insert(items).values({\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}).returning();\n\n\tconst response = await db.select().from(items);\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\texpect(response).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n});\n"
  },
  {
    "path": "integration-tests/tests/extensions/vectors/postgres.test.ts",
    "content": "import Docker from 'dockerode';\nimport { eq, hammingDistance, jaccardDistance, l2Distance, not, sql } from 'drizzle-orm';\nimport { bigserial, bit, halfvec, pgTable, sparsevec, vector } from 'drizzle-orm/pg-core';\nimport { drizzle, type PostgresJsDatabase } from 'drizzle-orm/postgres-js';\nimport getPort from 'get-port';\nimport postgres, { type Sql } from 'postgres';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\n\nconst ENABLE_LOGGING = false;\n\nlet pgContainer: Docker.Container;\nlet docker: Docker;\nlet client: Sql;\nlet db: PostgresJsDatabase;\n\nasync function createDockerDB(): Promise<string> {\n\tconst inDocker = (docker = new Docker());\n\tconst port = await getPort({ port: 5432 });\n\tconst image = 'pgvector/pgvector:pg16';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tinDocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tpgContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['POSTGRES_PASSWORD=postgres', 'POSTGRES_USER=postgres', 'POSTGRES_DB=postgres'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5432/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait pgContainer.start();\n\n\treturn `postgres://postgres:postgres@localhost:${port}/postgres`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['PG_VECTOR_CONNECTION_STRING'] ?? (await createDockerDB());\n\n\tconst sleep = 250;\n\tlet timeLeft = 5000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = postgres(connectionString, {\n\t\t\t\tmax: 1,\n\t\t\t\tonnotice: () => {\n\t\t\t\t\t// disable notices\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait client`select 1`;\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to Postgres');\n\t\tawait client?.end().catch(console.error);\n\t\tawait pgContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\n\tawait db.execute(sql`CREATE EXTENSION IF NOT EXISTS vector;`);\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait pgContainer?.stop().catch(console.error);\n});\n\nconst items = pgTable('items', {\n\tid: bigserial('id', { mode: 'number' }).primaryKey(),\n\tvector: vector('vector', { dimensions: 3 }),\n\tbit: bit('bit', { dimensions: 3 }),\n\thalfvec: halfvec('halfvec', { dimensions: 3 }),\n\tsparsevec: sparsevec('sparsevec', { dimensions: 5 }),\n});\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop table if exists items cascade`);\n\tawait db.execute(sql`\n\t\tCREATE TABLE items (\n\t\t          id bigserial PRIMARY KEY, \n\t\t          \"vector\" vector(3),\n\t\t          \"bit\" bit(3),\n\t\t          \"halfvec\" halfvec(3),\n\t\t          \"sparsevec\" sparsevec(5) \n\t\t      );\n\t`);\n});\n\ntest('insert + partial select', async () => {\n\tconst insertedValues = await db.insert(items).values([{\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]).returning();\n\n\tconst query = db.select({ distance: l2Distance(items.vector, [3, 1, 2]) }).from(items);\n\n\texpect(query.toSQL()).toStrictEqual({ sql: 'select \"vector\" <-> $1 from \"items\"', params: ['[3,1,2]'] });\n\n\tconst response = await query;\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\texpect(response).toStrictEqual([{ distance: 0 }]);\n});\n\n// SELECT * FROM items WHERE embedding <-> '[3,1,2]' < 5;\ntest('insert + complex where', async () => {\n\tconst insertedValues = await db.insert(items).values([{\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]).returning();\n\n\tconst query = db.select().from(items)\n\t\t.where(sql`${l2Distance(items.vector, [3, 1, 2])} < ${5}`)\n\t\t.limit(5);\n\n\texpect(query.toSQL()).toStrictEqual({\n\t\tsql:\n\t\t\t'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" where \"items\".\"vector\" <-> $1 < $2 limit $3',\n\t\tparams: ['[3,1,2]', 5, 5],\n\t});\n\tconst res = await query;\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\texpect(res).toStrictEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\tvector: [3, 1, 2],\n\t\t\tbit: '000',\n\t\t\thalfvec: [1, 2, 3],\n\t\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t\t},\n\t]);\n});\n\n// SELECT * FROM items WHERE id != 1 ORDER BY embedding <-> (SELECT embedding FROM items WHERE id = 1) LIMIT 5;\ntest('insert + order by subquery', async () => {\n\tconst insertedValues = await db.insert(items).values([{\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}, {\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]).returning();\n\n\tconst subquery = db.select({ vector: items.vector }).from(items).where(eq(items.id, 1));\n\n\tconst query = db.select().from(items)\n\t\t.where(not(eq(items.id, 1)))\n\t\t.orderBy(l2Distance(items.vector, subquery))\n\t\t.limit(5);\n\n\texpect(query.toSQL()).toStrictEqual({\n\t\tsql:\n\t\t\t'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" where not \"items\".\"id\" = $1 order by \"items\".\"vector\" <-> (select \"vector\" from \"items\" where \"items\".\"id\" = $2) limit $3',\n\t\tparams: [1, 1, 5],\n\t});\n\tconst res = await query;\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}, {\n\t\tid: 2,\n\t\tvector: [3, 1, 2],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\texpect(res).toStrictEqual([\n\t\t{\n\t\t\tid: 2,\n\t\t\tvector: [3, 1, 2],\n\t\t\tbit: '000',\n\t\t\thalfvec: [1, 2, 3],\n\t\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t\t},\n\t]);\n});\n\ntest('insert + select order by jaccard distance', async () => {\n\tconst insertedValues = await db.insert(items).values({\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}).returning();\n\n\tconst bitQuery = db.select().from(items).orderBy(jaccardDistance(items.bit, '101')).limit(5);\n\n\texpect(bitQuery.toSQL()).toStrictEqual({\n\t\tparams: [\n\t\t\t'101',\n\t\t\t5,\n\t\t],\n\t\tsql: 'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" order by \"items\".\"bit\" <%> $1 limit $2',\n\t});\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\tconst response = await bitQuery;\n\n\texpect(response).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n});\n\ntest('insert + select order by hamming distance', async () => {\n\tconst insertedValues = await db.insert(items).values({\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}).returning();\n\n\tconst bitQuery = db.select().from(items).orderBy(hammingDistance(items.bit, '101')).limit(5);\n\n\texpect(bitQuery.toSQL()).toStrictEqual({\n\t\tparams: [\n\t\t\t'101',\n\t\t\t5,\n\t\t],\n\t\tsql: 'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" order by \"items\".\"bit\" <~> $1 limit $2',\n\t});\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\tconst response = await bitQuery;\n\n\texpect(response).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n});\n\ntest('insert + select order by l2 distance', async () => {\n\tconst insertedValues = await db.insert(items).values({\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}).returning();\n\n\tconst queryVector = db.select().from(items).orderBy(l2Distance(items.vector, [3, 1, 2])).limit(5);\n\tconst queryHalfvec = db.select().from(items).orderBy(l2Distance(items.halfvec, [3, 1, 2])).limit(5);\n\tconst querySparsevec = db.select().from(items).orderBy(l2Distance(items.sparsevec, '{1:3,3:1,5:2}/5')).limit(5);\n\n\texpect(queryVector.toSQL()).toStrictEqual({\n\t\tparams: [\n\t\t\t'[3,1,2]',\n\t\t\t5,\n\t\t],\n\t\tsql: 'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" order by \"items\".\"vector\" <-> $1 limit $2',\n\t});\n\n\texpect(queryHalfvec.toSQL()).toStrictEqual({\n\t\tparams: [\n\t\t\t'[3,1,2]',\n\t\t\t5,\n\t\t],\n\t\tsql: 'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" order by \"items\".\"halfvec\" <-> $1 limit $2',\n\t});\n\n\texpect(querySparsevec.toSQL()).toStrictEqual({\n\t\tparams: [\n\t\t\t'{1:3,3:1,5:2}/5',\n\t\t\t5,\n\t\t],\n\t\tsql:\n\t\t\t'select \"id\", \"vector\", \"bit\", \"halfvec\", \"sparsevec\" from \"items\" order by \"items\".\"sparsevec\" <-> $1 limit $2',\n\t});\n\n\tconst vectorRes = await queryVector;\n\tconst halfvecRes = await queryHalfvec;\n\tconst sparsevecRes = await querySparsevec;\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\tconst expectedResponse = [{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}];\n\n\texpect(vectorRes).toStrictEqual(expectedResponse);\n\texpect(halfvecRes).toStrictEqual(expectedResponse);\n\texpect(sparsevecRes).toStrictEqual(expectedResponse);\n});\n\ntest('select + insert all vectors', async () => {\n\tconst insertedValues = await db.insert(items).values({\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}).returning();\n\n\tconst response = await db.select().from(items);\n\n\texpect(insertedValues).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n\n\texpect(response).toStrictEqual([{\n\t\tid: 1,\n\t\tvector: [1, 2, 3],\n\t\tbit: '000',\n\t\thalfvec: [1, 2, 3],\n\t\tsparsevec: '{1:1,3:2,5:3}/5',\n\t}]);\n});\n"
  },
  {
    "path": "integration-tests/tests/gel/cache.ts",
    "content": "import { getTableName, is, Table } from 'drizzle-orm';\nimport type { MutationOption } from 'drizzle-orm/cache/core';\nimport { Cache } from 'drizzle-orm/cache/core';\nimport type { CacheConfig } from 'drizzle-orm/cache/core/types';\nimport Keyv from 'keyv';\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nexport class TestGlobalCache extends Cache {\n\tprivate globalTtl: number = 1000;\n\tprivate usedTablesPerKey: Record<string, string[]> = {};\n\n\tconstructor(private kv: Keyv = new Keyv()) {\n\t\tsuper();\n\t}\n\n\toverride strategy(): 'explicit' | 'all' {\n\t\treturn 'all';\n\t}\n\toverride async get(key: string, _tables: string[], _isTag: boolean): Promise<any[] | undefined> {\n\t\tconst res = await this.kv.get(key) ?? undefined;\n\t\treturn res;\n\t}\n\toverride async put(\n\t\tkey: string,\n\t\tresponse: any,\n\t\ttables: string[],\n\t\tisTag: boolean,\n\t\tconfig?: CacheConfig,\n\t): Promise<void> {\n\t\tawait this.kv.set(key, response, config ? config.ex : this.globalTtl);\n\t\tfor (const table of tables) {\n\t\t\tconst keys = this.usedTablesPerKey[table];\n\t\t\tif (keys === undefined) {\n\t\t\t\tthis.usedTablesPerKey[table] = [key];\n\t\t\t} else {\n\t\t\t\tkeys.push(key);\n\t\t\t}\n\t\t}\n\t}\n\toverride async onMutate(params: MutationOption): Promise<void> {\n\t\tconst tagsArray = params.tags ? Array.isArray(params.tags) ? params.tags : [params.tags] : [];\n\t\tconst tablesArray = params.tables ? Array.isArray(params.tables) ? params.tables : [params.tables] : [];\n\n\t\tconst keysToDelete = new Set<string>();\n\n\t\tfor (const table of tablesArray) {\n\t\t\tconst tableName = is(table, Table) ? getTableName(table) : table as string;\n\t\t\tconst keys = this.usedTablesPerKey[tableName] ?? [];\n\t\t\tfor (const key of keys) keysToDelete.add(key);\n\t\t}\n\n\t\tif (keysToDelete.size > 0 || tagsArray.length > 0) {\n\t\t\tfor (const tag of tagsArray) {\n\t\t\t\tawait this.kv.delete(tag);\n\t\t\t}\n\n\t\t\tfor (const key of keysToDelete) {\n\t\t\t\tawait this.kv.delete(key);\n\t\t\t\tfor (const table of tablesArray) {\n\t\t\t\t\tconst tableName = is(table, Table) ? getTableName(table) : table as string;\n\t\t\t\t\tthis.usedTablesPerKey[tableName] = [];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nexport class TestCache extends TestGlobalCache {\n\toverride strategy(): 'explicit' | 'all' {\n\t\treturn 'explicit';\n\t}\n}\n"
  },
  {
    "path": "integration-tests/tests/gel/createInstance.ts",
    "content": "import Docker from 'dockerode';\nimport getPort from 'get-port';\nimport { v4 as uuidV4 } from 'uuid';\nimport 'zx/globals';\n\nexport async function createDockerDB(): Promise<{ connectionString: string; container: Docker.Container }> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 5656 });\n\tconst image = 'geldata/gel:6';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tconst gelContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: [\n\t\t\t'GEL_CLIENT_SECURITY=insecure_dev_mode',\n\t\t\t'GEL_SERVER_SECURITY=insecure_dev_mode',\n\t\t\t'GEL_CLIENT_TLS_SECURITY=no_host_verification',\n\t\t\t'GEL_SERVER_PASSWORD=password',\n\t\t],\n\t\tname: `drizzle-integration-tests-${uuidV4()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5656/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait gelContainer.start();\n\n\treturn { connectionString: `gel://admin:password@localhost:${port}/main`, container: gelContainer };\n}\n"
  },
  {
    "path": "integration-tests/tests/gel/gel-custom.test.ts",
    "content": "import retry from 'async-retry';\nimport type Docker from 'dockerode';\nimport { asc, eq, sql } from 'drizzle-orm';\nimport { drizzle, type GelJsDatabase } from 'drizzle-orm/gel';\nimport { alias, customType, gelTable, gelTableCreator } from 'drizzle-orm/gel-core';\nimport * as gel from 'gel';\nimport { afterAll, afterEach, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { createDockerDB } from './createInstance';\nimport 'zx/globals';\n\n$.quiet = true;\n\nconst ENABLE_LOGGING = false;\n\nlet db: GelJsDatabase;\nlet client: gel.Client;\nlet container: Docker.Container | undefined;\n\nlet dsn: string;\nconst tlsSecurity = '--tls-security=insecure';\n\nfunction sleep(ms: number) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['GEL_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['GEL_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr, container: contrainerObj } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t\tcontainer = contrainerObj;\n\t}\n\tawait sleep(15 * 1000);\n\tclient = await retry(async () => {\n\t\tclient = gel.createClient({ dsn: connectionString, tlsSecurity: 'insecure' });\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.close();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\n\tdsn = connectionString;\n\tawait $`gel query \"CREATE TYPE default::users_custom {\n\t\tcreate property id1: int16 {\n\t\t\tcreate constraint exclusive;\n\t\t};\n\t\tcreate required property name: str;\n\t\tcreate property verified: bool {\n\t\t  SET default := false;\n\t\t};\n\t\tcreate property json: json;\n\t};\" ${tlsSecurity} --dsn=${dsn}`;\n\n\tawait $`gel query \"CREATE TYPE default::prefixed_users_custom {\n\t\tcreate property id1: int16 {\n\t\t\tcreate constraint exclusive;\n\t\t};\n\t\tcreate required property name: str;\n};\" ${tlsSecurity} --dsn=${dsn}`;\n});\n\nafterAll(async () => {\n\tawait $`gel query \"DROP TYPE default::users_custom;\" ${tlsSecurity} --dsn=${dsn}`;\n\tawait $`gel query \"DROP TYPE default::prefixed_users_custom;\" ${tlsSecurity} --dsn=${dsn}`;\n\n\tawait client?.close();\n\tawait container?.stop().catch(console.error);\n});\n\nbeforeEach((ctx) => {\n\tctx.gel = {\n\t\tdb,\n\t};\n});\n\nafterEach(async () => {\n\tawait $`gel query \"DELETE default::users_custom;\" ${tlsSecurity} --dsn=${dsn}`;\n\tawait $`gel query \"DELETE default::prefixed_users_custom;\" ${tlsSecurity} --dsn=${dsn}`;\n});\n\nconst customInteger = customType<{ data: number; notNull: false; default: false }>({\n\tdataType() {\n\t\treturn 'integer';\n\t},\n});\n\nconst customText = customType<{ data: string }>({\n\tdataType() {\n\t\treturn 'text';\n\t},\n});\n\nconst customBoolean = customType<{ data: boolean }>({\n\tdataType() {\n\t\treturn 'boolean';\n\t},\n});\n\nconst customJson = <TData>(name: string) =>\n\tcustomType<{ data: TData; driverData: string }>({\n\t\tdataType() {\n\t\t\treturn 'json';\n\t\t},\n\t})(name);\n\nconst usersTable = gelTable('users_custom', {\n\tid1: customInteger('id1'),\n\tname: customText('name').notNull(),\n\tverified: customBoolean('verified').notNull().default(false),\n\tjson: customJson<string[]>('json'),\n});\n\ntest('select all fields', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result).toEqual([{ id1: 1, name: 'John', verified: false, json: null }]);\n});\n\ntest('select sql', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql`upper(${usersTable.name})`,\n\t}).from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('select typed sql', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql<string>`upper(${usersTable.name})`,\n\t}).from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('insert returning sql', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tconst users = await db.insert(usersTable).values({ id1: 1, name: 'John' }).returning({\n\t\tname: sql`upper(${usersTable.name})`,\n\t});\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('delete returning sql', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning({\n\t\tname: sql`upper(${usersTable.name})`,\n\t});\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('update returning sql', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning({\n\t\tname: sql`upper(${usersTable.name})`,\n\t});\n\n\texpect(users).toEqual([{ name: 'JANE' }]);\n});\n\ntest('update with returning all fields', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning();\n\n\texpect(users).toEqual([{ id1: 1, name: 'Jane', verified: false, json: null }]);\n});\n\ntest('update with returning partial', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning({\n\t\tid1: usersTable.id1,\n\t\tname: usersTable.name,\n\t});\n\n\texpect(users).toEqual([{ id1: 1, name: 'Jane' }]);\n});\n\ntest('delete with returning all fields', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning();\n\n\texpect(users).toEqual([{ id1: 1, name: 'John', verified: false, json: null }]);\n});\n\ntest('delete with returning partial', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning({\n\t\tid1: usersTable.id1,\n\t\tname: usersTable.name,\n\t});\n\n\texpect(users).toEqual([{ id1: 1, name: 'John' }]);\n});\n\ntest('insert + select', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\texpect(result).toEqual([{ id1: 1, name: 'John', verified: false, json: null }]);\n\n\tawait db.insert(usersTable).values({ id1: 2, name: 'Jane' });\n\tconst result2 = await db.select().from(usersTable);\n\texpect(result2).toEqual([\n\t\t{ id1: 1, name: 'John', verified: false, json: null },\n\t\t{ id1: 2, name: 'Jane', verified: false, json: null },\n\t]);\n});\n\ntest('insert with overridden default values', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John', verified: true });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result).toEqual([{ id1: 1, name: 'John', verified: true, json: null }]);\n});\n\ntest('insert many', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id1: 1, name: 'John' },\n\t\t{ id1: 2, name: 'Bruce', json: ['foo', 'bar'] },\n\t\t{ id1: 3, name: 'Jane' },\n\t\t{ id1: 4, name: 'Austin', verified: true },\n\t]);\n\tconst result = await db.select({\n\t\tid: usersTable.id1,\n\t\tname: usersTable.name,\n\t\tjson: usersTable.json,\n\t\tverified: usersTable.verified,\n\t}).from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', json: null, verified: false },\n\t\t{ id: 2, name: 'Bruce', json: ['foo', 'bar'], verified: false },\n\t\t{ id: 3, name: 'Jane', json: null, verified: false },\n\t\t{ id: 4, name: 'Austin', json: null, verified: true },\n\t]);\n});\n\ntest('insert many with returning', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tconst result = await db.insert(usersTable).values([\n\t\t{ id1: 1, name: 'John' },\n\t\t{ id1: 2, name: 'Bruce', json: ['foo', 'bar'] },\n\t\t{ id1: 3, name: 'Jane' },\n\t\t{ id1: 4, name: 'Austin', verified: true },\n\t])\n\t\t.returning({\n\t\t\tid: usersTable.id1,\n\t\t\tname: usersTable.name,\n\t\t\tjson: usersTable.json,\n\t\t\tverified: usersTable.verified,\n\t\t});\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', json: null, verified: false },\n\t\t{ id: 2, name: 'Bruce', json: ['foo', 'bar'], verified: false },\n\t\t{ id: 3, name: 'Jane', json: null, verified: false },\n\t\t{ id: 4, name: 'Austin', json: null, verified: true },\n\t]);\n});\n\ntest('select with group by as field', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values([{ id1: 1, name: 'John' }, { id1: 2, name: 'Jane' }, { id1: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.name);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('select with group by as sql', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values([{ id1: 1, name: 'John' }, { id1: 2, name: 'Jane' }, { id1: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('select with group by as sql + column', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values([{ id1: 1, name: 'John' }, { id1: 2, name: 'Jane' }, { id1: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`, usersTable.id1);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }, { name: 'Jane' }]);\n});\n\ntest('select with group by as column + sql', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values([{ id1: 1, name: 'John' }, { id1: 2, name: 'Jane' }, { id1: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id1, sql`${usersTable.name}`);\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n});\n\ntest('select with group by complex query', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values([{ id1: 1, name: 'John' }, { id1: 2, name: 'Jane' }, { id1: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id1, sql`${usersTable.name}`)\n\t\t.orderBy(asc(usersTable.name))\n\t\t.limit(1);\n\n\texpect(result).toEqual([{ name: 'Jane' }]);\n});\n\ntest('build query', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tconst query = db.select({ id: usersTable.id1, name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id1, usersTable.name)\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'select \"users_custom\".\"id1\", \"users_custom\".\"name\" from \"users_custom\" group by \"users_custom\".\"id1\", \"users_custom\".\"name\"',\n\t\tparams: [],\n\t});\n});\n\ntest('insert sql', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: sql`${'John'}` });\n\tconst result = await db.select({ id: usersTable.id1, name: usersTable.name }).from(usersTable);\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('partial join with alias', async (ctx) => {\n\tconst { db } = ctx.gel;\n\tconst customerAlias = alias(usersTable, 'customer');\n\n\tawait db.insert(usersTable).values([{ id1: 10, name: 'Ivan' }, { id1: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select({\n\t\t\tuser: {\n\t\t\t\tid: usersTable.id1,\n\t\t\t\tname: usersTable.name,\n\t\t\t},\n\t\t\tcustomer: {\n\t\t\t\tid: customerAlias.id1,\n\t\t\t\tname: customerAlias.name,\n\t\t\t},\n\t\t}).from(usersTable)\n\t\t.leftJoin(customerAlias, eq(customerAlias.id1, 11))\n\t\t.where(eq(usersTable.id1, 10));\n\n\texpect(result).toEqual([{\n\t\tuser: { id: 10, name: 'Ivan' },\n\t\tcustomer: { id: 11, name: 'Hans' },\n\t}]);\n});\n\ntest('full join with alias', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tconst gelTable = gelTableCreator((name) => `prefixed_${name}`);\n\n\tconst users = gelTable('users_custom', {\n\t\tid1: customInteger('id1'),\n\t\tname: customText('name').notNull(),\n\t});\n\n\tconst customers = alias(users, 'customer');\n\n\tawait db.insert(users).values([{ id1: 10, name: 'Ivan' }, { id1: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select().from(users)\n\t\t.leftJoin(customers, eq(customers.id1, 11))\n\t\t.where(eq(users.id1, 10));\n\n\texpect(result).toEqual([{\n\t\tusers_custom: {\n\t\t\tid1: 10,\n\t\t\tname: 'Ivan',\n\t\t},\n\t\tcustomer: {\n\t\t\tid1: 11,\n\t\t\tname: 'Hans',\n\t\t},\n\t}]);\n});\n\ntest('insert with spaces', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: sql`'Jo   h     n'` });\n\tconst result = await db.select({ id: usersTable.id1, name: usersTable.name }).from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n});\n\ntest('prepared statement', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\tconst statement = db.select({\n\t\tid: usersTable.id1,\n\t\tname: usersTable.name,\n\t}).from(usersTable)\n\t\t.prepare('statement1');\n\tconst result = await statement.execute();\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('prepared statement reuse', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tconst stmt = db.insert(usersTable).values({\n\t\tid1: sql.placeholder('id1'),\n\t\tverified: true,\n\t\tname: sql.placeholder('name'),\n\t}).prepare('stmt2');\n\n\tfor (let i = 1; i < 11; i++) {\n\t\tawait stmt.execute({ id1: i, name: `John ${i}` });\n\t}\n\n\tconst result = await db.select({\n\t\tid1: usersTable.id1,\n\t\tname: usersTable.name,\n\t\tverified: usersTable.verified,\n\t}).from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id1: 1, name: 'John 1', verified: true },\n\t\t{ id1: 2, name: 'John 2', verified: true },\n\t\t{ id1: 3, name: 'John 3', verified: true },\n\t\t{ id1: 4, name: 'John 4', verified: true },\n\t\t{ id1: 5, name: 'John 5', verified: true },\n\t\t{ id1: 6, name: 'John 6', verified: true },\n\t\t{ id1: 7, name: 'John 7', verified: true },\n\t\t{ id1: 8, name: 'John 8', verified: true },\n\t\t{ id1: 9, name: 'John 9', verified: true },\n\t\t{ id1: 10, name: 'John 10', verified: true },\n\t]);\n});\n\ntest('prepared statement with placeholder in .where', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\tconst stmt = db.select({\n\t\tid: usersTable.id1,\n\t\tname: usersTable.name,\n\t}).from(usersTable)\n\t\t.where(eq(usersTable.id1, sql.placeholder('id')))\n\t\t.prepare('stmt3');\n\tconst result = await stmt.execute({ id: 1 });\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('prepared statement with placeholder in .limit', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\tconst stmt = db\n\t\t.select({\n\t\t\tid: usersTable.id1,\n\t\t\tname: usersTable.name,\n\t\t})\n\t\t.from(usersTable)\n\t\t.where(eq(usersTable.id1, sql.placeholder('id')))\n\t\t.limit(sql.placeholder('limit'))\n\t\t.prepare('stmt_limit');\n\n\tconst result = await stmt.execute({ id: 1, limit: 1 });\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\texpect(result).toHaveLength(1);\n});\n\ntest('prepared statement with placeholder in .offset', async (ctx) => {\n\tconst { db } = ctx.gel;\n\n\tawait db.insert(usersTable).values([{ id1: 1, name: 'John' }, { id1: 2, name: 'John1' }]);\n\tconst stmt = db\n\t\t.select({\n\t\t\tid: usersTable.id1,\n\t\t\tname: usersTable.name,\n\t\t})\n\t\t.from(usersTable)\n\t\t.offset(sql.placeholder('offset'))\n\t\t.prepare('stmt_offset');\n\n\tconst result = await stmt.execute({ offset: 1 });\n\n\texpect(result).toEqual([{ id: 2, name: 'John1' }]);\n});\n\ntest('insert via db.execute + select via db.execute', async () => {\n\tawait db.execute(sql`insert into ${usersTable} (${sql.identifier(usersTable.name.name)}) values (${'John'})`);\n\n\tconst result = await db.execute<{ id1: number; name: string }>(sql`select id1, name from \"users_custom\"`);\n\texpect(result).toEqual([{ id1: null, name: 'John' }]);\n});\n\ntest('insert via db.execute + returning', async () => {\n\tconst inserted = await db.execute<{ id: number; name: string }>(\n\t\tsql`insert into ${usersTable} (${\n\t\t\tsql.identifier(usersTable.name.name)\n\t\t}) values (${'John'}) returning ${usersTable.id1}, ${usersTable.name}`,\n\t);\n\texpect(inserted).toEqual([{ id1: null, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async () => {\n\tconst inserted = await db.execute<Pick<typeof usersTable.$inferSelect, 'id1' | 'name'>>(\n\t\tdb.insert(usersTable).values({ id1: 1, name: 'John' }).returning({ id: usersTable.id1, name: usersTable.name }),\n\t);\n\texpect(inserted).toEqual([{ id1: 1, name: 'John' }]);\n});\n\n// TODO on conflict does not work\n// test.todo('build query insert with onConflict do update', async (ctx) => {\n// \tconst { db } = ctx.gel;\n\n// \tconst query = db.insert(usersTable)\n// \t\t.values({ id1: 1, name: 'John', jsonb: ['foo', 'bar'] })\n// \t\t.onConflictDoUpdate({ target: usersTable.id1, set: { name: 'John1' } })\n// \t\t.toSQL();\n\n// \texpect(query).toEqual({\n// \t\tsql:\n// \t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\") do update set \"name\" = $3',\n// \t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n// \t});\n// });\n\n// // TODO on conflict does not work\n// test.todo('build query insert with onConflict do update / multiple columns', async (ctx) => {\n// \tconst { db } = ctx.gel;\n\n// \tconst query = db.insert(usersTable)\n// \t\t.values({ id1: 1, name: 'John', jsonb: ['foo', 'bar'] })\n// \t\t.onConflictDoUpdate({ target: [usersTable.id1, usersTable.name], set: { name: 'John1' } })\n// \t\t.toSQL();\n\n// \texpect(query).toEqual({\n// \t\tsql:\n// \t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\",\"name\") do update set \"name\" = $3',\n// \t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n// \t});\n// });\n\n// // TODO on conflict does not work\n// test.todo('build query insert with onConflict do nothing', async (ctx) => {\n// \tconst { db } = ctx.gel;\n\n// \tconst query = db.insert(usersTable)\n// \t\t.values({ id1: 1, name: 'John' })\n// \t\t.onConflictDoNothing()\n// \t\t.toSQL();\n\n// \texpect(query).toEqual({\n// \t\tsql: 'insert into \"users\" (\"id1\", \"name\", \"verified\") values ($1, $2, default) on conflict do nothing',\n// \t\tparams: [1, 'John'],\n// \t});\n// });\n\n// // TODO on conflict does not work\n// test.todo('build query insert with onConflict do nothing + target', async (ctx) => {\n// \tconst { db } = ctx.gel;\n\n// \tconst query = db.insert(usersTable)\n// \t\t.values({ id1: 1, name: 'John' })\n// \t\t.onConflictDoNothing({ target: usersTable.id1 })\n// \t\t.toSQL();\n\n// \texpect(query).toEqual({\n// \t\tsql: 'insert into \"users\" (\"id1\", \"name\", \"verified\") values ($1, $2, default) on conflict (\"id1\") do nothing',\n// \t\tparams: [1, 'John'],\n// \t});\n// });\n\n// // TODO on conflict does not work\n// test.todo('insert with onConflict do update', async (ctx) => {\n// \tconst { db } = ctx.gel;\n\n// \tawait db.insert(usersTable)\n// \t\t.values({ id1: 1, name: 'John' });\n\n// \tawait db.insert(usersTable)\n// \t\t.values({ id1: 1, name: 'John' })\n// \t\t.onConflictDoUpdate({ target: usersTable.id1, set: { name: 'John1' } });\n\n// \tconst res = await db.select({ id: usersTable.id1, name: usersTable.name }).from(usersTable).where(\n// \t\teq(usersTable.id1, 1),\n// \t);\n\n// \texpect(res).toEqual([{ id: 1, name: 'John1' }]);\n// });\n\n// // TODO on conflict does not work\n// test.todo('insert with onConflict do nothing', async (ctx) => {\n// \tconst { db } = ctx.gel;\n\n// \tawait db.insert(usersTable)\n// \t\t.values({ id1: 1, name: 'John' });\n\n// \tawait db.insert(usersTable)\n// \t\t.values({ id1: 1, name: 'John' })\n// \t\t.onConflictDoNothing();\n\n// \tconst res = await db.select({ id: usersTable.id1, name: usersTable.name }).from(usersTable).where(\n// \t\teq(usersTable.id1, 1),\n// \t);\n\n// \texpect(res).toEqual([{ id: 1, name: 'John' }]);\n// });\n\n// // TODO on conflict does not work\n// test.todo('insert with onConflict do nothing + target', async (ctx) => {\n// \tconst { db } = ctx.gel;\n\n// \tawait db.insert(usersTable)\n// \t\t.values({ id1: 1, name: 'John' });\n\n// \tawait db.insert(usersTable)\n// \t\t.values({ id1: 1, name: 'John' })\n// \t\t.onConflictDoNothing({ target: usersTable.id1 });\n\n// \tconst res = await db.select({ id: usersTable.id1, name: usersTable.name }).from(usersTable).where(\n// \t\teq(usersTable.id1, 1),\n// \t);\n\n// \texpect(res).toEqual([{ id: 1, name: 'John' }]);\n// });\n"
  },
  {
    "path": "integration-tests/tests/gel/gel-ext.test.ts",
    "content": "import retry from 'async-retry';\nimport type Docker from 'dockerode';\nimport { relations, sql } from 'drizzle-orm';\nimport { drizzle, type GelJsDatabase } from 'drizzle-orm/gel';\nimport { foreignKey, gelSchema, gelTable, text, timestamptz, uniqueIndex, uuid } from 'drizzle-orm/gel-core';\nimport createClient, { type Client } from 'gel';\nimport { afterAll, afterEach, beforeAll, describe, expect, test } from 'vitest';\nimport 'zx/globals';\nimport { createDockerDB } from './createInstance';\n\n$.quiet = true;\n\nconst ENABLE_LOGGING = false;\n\nexport const extauth = gelSchema('ext::auth');\n\nexport const identityInExtauth = extauth.table('Identity', {\n\tid: uuid().default(sql`uuid_generate_v4()`).primaryKey().notNull(),\n\tcreatedAt: timestamptz('created_at').default(sql`(clock_timestamp())`).notNull(),\n\tissuer: text().notNull(),\n\tmodifiedAt: timestamptz('modified_at').notNull(),\n\tsubject: text().notNull(),\n}, (table) => [\n\tuniqueIndex('6bc2dd19-bce4-5810-bb1b-7007afe97a11;schemaconstr').using(\n\t\t'btree',\n\t\ttable.id.asc().nullsLast().op('uuid_ops'),\n\t),\n]);\n\nexport const user = gelTable('User', {\n\tid: uuid().default(sql`uuid_generate_v4()`).primaryKey().notNull(),\n\temail: text().notNull(),\n\tidentityId: uuid('identity_id').notNull(),\n\tusername: text().notNull(),\n}, (table) => [\n\tuniqueIndex('d504514c-26a7-11f0-b836-81aa188c0abe;schemaconstr').using(\n\t\t'btree',\n\t\ttable.id.asc().nullsLast().op('uuid_ops'),\n\t),\n\tforeignKey({\n\t\tcolumns: [table.identityId],\n\t\tforeignColumns: [identityInExtauth.id],\n\t\tname: 'User_fk_identity',\n\t}),\n]);\n\nexport const userRelations = relations(user, ({ one }) => ({\n\tidentity: one(identityInExtauth, { references: [identityInExtauth.id], fields: [user.identityId] }),\n}));\n\nconst schema = { user, identityInExtauth, userRelations };\n\nlet client: Client;\nlet db: GelJsDatabase<typeof schema>;\nconst tlsSecurity: string = 'insecure';\nlet dsn: string;\nlet container: Docker.Container | undefined;\n\nfunction sleep(ms: number) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['GEL_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['GEL_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr, container: contrainerObj } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t\tcontainer = contrainerObj;\n\t}\n\tawait sleep(15 * 1000);\n\tclient = await retry(() => {\n\t\tclient = createClient({ dsn: connectionString, tlsSecurity: 'insecure' });\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.close();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING, schema: { user, identityInExtauth, userRelations } });\n\n\tdsn = connectionString;\n});\n\nafterAll(async () => {\n\tawait client?.close().catch(console.error);\n\tawait container?.stop().catch(console.error);\n});\n\ndescribe('extensions tests group', async () => {\n\tbeforeAll(async () => {\n\t\tawait $`gel query 'CREATE EXTENSION pgcrypto VERSION \"1.3\";\n  CREATE EXTENSION auth VERSION \"1.0\";\n  CREATE TYPE default::User {\n      CREATE REQUIRED LINK identity: ext::auth::Identity;\n      CREATE REQUIRED PROPERTY email: std::str;\n      CREATE REQUIRED PROPERTY username: std::str;\n  };\n  CREATE GLOBAL default::current_user := (std::assert_single((SELECT\n      default::User {\n          id,\n          username,\n          email\n      }\n  FILTER\n      (.identity = GLOBAL ext::auth::ClientTokenIdentity)\n  )));' --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t});\n\n\tafterEach(async () => {\n\t\tawait $`gel query \"DELETE default::User;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t});\n\n\ttest('check that you can query from ext::auth schema in gel', async () => {\n\t\tconst [response] = await db.insert(identityInExtauth).values({\n\t\t\tissuer: 'issuer',\n\t\t\tsubject: 'subject',\n\t\t\tmodifiedAt: new Date(),\n\t\t}).returning();\n\t\tawait db.insert(user).values({ identityId: response!.id, username: 'username', email: 'email' });\n\n\t\tconst userResponse = await db.select().from(user);\n\t\tconst authResponse = await db.select().from(identityInExtauth);\n\t\tconst relationsResponse = await db.query.user.findMany({\n\t\t\tcolumns: {\n\t\t\t\tid: false,\n\t\t\t\tidentityId: false,\n\t\t\t},\n\t\t\twith: {\n\t\t\t\tidentity: {\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tid: false,\n\t\t\t\t\t\tmodifiedAt: false,\n\t\t\t\t\t\tcreatedAt: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(relationsResponse).toStrictEqual([{\n\t\t\temail: 'email',\n\t\t\tidentity: { issuer: 'issuer', subject: 'subject' },\n\t\t\tusername: 'username',\n\t\t}]);\n\t\texpect(userResponse.length).toBe(1);\n\t\texpect(authResponse.length).toBe(1);\n\n\t\texpect(userResponse[0]!.username).toBe('username');\n\t\texpect(userResponse[0]!.email).toBe('email');\n\n\t\texpect(authResponse[0]!.issuer).toBe('issuer');\n\t\texpect(authResponse[0]!.subject).toBe('subject');\n\t});\n});\n"
  },
  {
    "path": "integration-tests/tests/gel/gel.test.ts",
    "content": "import retry from 'async-retry';\nimport type Docker from 'dockerode';\nimport {\n\tand,\n\tarrayContained,\n\tarrayContains,\n\tarrayOverlaps,\n\tasc,\n\tavg,\n\tavgDistinct,\n\tcount,\n\tcountDistinct,\n\teq,\n\ttype Equal,\n\texists,\n\tgetTableColumns,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tis,\n\tlike,\n\tlt,\n\tmax,\n\tmin,\n\tnot,\n\tnotInArray,\n\tor,\n\tSQL,\n\tsql,\n\ttype SQLWrapper,\n\tsum,\n\tsumDistinct,\n} from 'drizzle-orm';\nimport { drizzle, type GelJsDatabase } from 'drizzle-orm/gel';\nimport type { GelColumn } from 'drizzle-orm/gel-core';\nimport {\n\talias,\n\tboolean,\n\tdateDuration,\n\tdecimal,\n\tduration,\n\texcept,\n\texceptAll,\n\tforeignKey,\n\tGelDialect,\n\tGelPolicy,\n\tgelPolicy,\n\tgelSchema,\n\tgelTable,\n\tgelTableCreator,\n\tgetTableConfig,\n\tinteger,\n\tintersect,\n\tintersectAll,\n\tjson,\n\tlocalDate,\n\tlocalTime,\n\tprimaryKey,\n\trelDuration,\n\ttext,\n\ttimestamp,\n\ttimestamptz,\n\tunion,\n\tunionAll,\n\tunique,\n\tuniqueKeyName,\n\tuuid as gelUuid,\n} from 'drizzle-orm/gel-core';\nimport createClient, {\n\ttype Client,\n\tDateDuration,\n\tDuration,\n\tLocalDate,\n\tLocalDateTime,\n\tLocalTime,\n\tRelativeDuration,\n} from 'gel';\nimport { v4 as uuidV4 } from 'uuid';\nimport { afterAll, afterEach, beforeAll, beforeEach, describe, expect, expectTypeOf, test, vi } from 'vitest';\nimport { Expect } from '~/utils';\nimport 'zx/globals';\nimport { TestCache, TestGlobalCache } from './cache';\nimport { createDockerDB } from './createInstance';\n\n$.quiet = true;\n\nconst ENABLE_LOGGING = false;\n\nlet client: Client;\nlet db: GelJsDatabase;\nlet dbGlobalCached: GelJsDatabase;\nlet cachedDb: GelJsDatabase;\nconst tlsSecurity: string = 'insecure';\nlet dsn: string;\nlet container: Docker.Container | undefined;\n\nfunction sleep(ms: number) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\ndeclare module 'vitest' {\n\tinterface TestContext {\n\t\tgel: {\n\t\t\tdb: GelJsDatabase;\n\t\t};\n\t\tcachedGel: {\n\t\t\tdb: GelJsDatabase;\n\t\t\tdbGlobalCached: GelJsDatabase;\n\t\t};\n\t}\n}\n\nconst usersTable = gelTable('users', {\n\tid1: integer('id1').notNull(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjson: json('json').$type<string[]>(),\n\tcreatedAt: timestamptz('created_at').notNull().defaultNow(),\n});\n\nconst postsTable = gelTable('posts', {\n\tid: integer().primaryKey(),\n\tdescription: text().notNull(),\n\tuserId: integer('city_id').references(() => usersTable.id1),\n});\n\nconst usersOnUpdate = gelTable('users_on_update', {\n\tid1: integer('id1').notNull(),\n\tname: text('name').notNull(),\n\tupdateCounter: integer('update_counter')\n\t\t.default(sql`1`)\n\t\t.$onUpdateFn(() => sql`update_counter + 1`),\n\tupdatedAt: timestamptz('updated_at').$onUpdate(() => new Date()),\n\talwaysNull: text('always_null')\n\t\t.$type<string | null>()\n\t\t.$onUpdate(() => null),\n});\n\nconst citiesTable = gelTable('cities', {\n\tid1: integer('id1').notNull(),\n\tname: text('name').notNull(),\n\tstate: text('state'),\n});\n\nconst cities2Table = gelTable('cities', {\n\tid1: integer('id1').notNull(),\n\tname: text('name').notNull(),\n});\n\nconst users2Table = gelTable('some_new_users', {\n\tid1: integer('id1').notNull(),\n\tname: text('name').notNull(),\n\tcityId: integer('cityId'),\n});\n\nconst users3Table = gelTable('users3', {\n\tid1: integer('id1'),\n\tname: text('name').notNull(),\n});\n\nconst coursesTable = gelTable('courses', {\n\tid1: integer('id1').notNull(),\n\tname: text('name').notNull(),\n\tcategoryId: integer('categoryId').references(() => courseCategoriesTable.id1),\n});\n\nconst courseCategoriesTable = gelTable('course_categories', {\n\tid1: integer('id1').notNull(),\n\tname: text('name').notNull(),\n});\n\nconst orders = gelTable('orders', {\n\tid1: integer('id1'),\n\tregion: text('region').notNull(),\n\tproduct: text('product')\n\t\t.notNull()\n\t\t.$default(() => 'random_string'),\n\tamount: integer('amount').notNull(),\n\tquantity: integer('quantity').notNull(),\n});\n\nconst salEmp = gelTable('sal_emp', {\n\tname: text('name'),\n\tpayByQuarter: integer('pay_by_quarter').array(),\n});\n\nconst jsonTestTable = gelTable('jsontest', {\n\tid1: integer('id1').primaryKey(),\n\tjson: json('json').$type<{ string: string; number: number }>(),\n});\n\n// To test aggregate functions\nconst aggregateTable = gelTable('aggregate_table', {\n\tid1: integer('id1').notNull(),\n\tname: text('name').notNull(),\n\ta: integer('a'),\n\tb: integer('b'),\n\tc: integer('c'),\n\tnullOnly: integer('nullOnly'),\n});\n\n// To test another schema and multischema\nconst mySchema = gelSchema('mySchema');\n\nconst usersMySchemaTable = mySchema.table('users', {\n\tid1: integer('id1').notNull(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjson: json('json').$type<string[]>(),\n\tcreatedAt: timestamptz('created_at').notNull().defaultNow(),\n});\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['GEL_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['GEL_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr, container: contrainerObj } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t\tcontainer = contrainerObj;\n\t}\n\tawait sleep(15 * 1000);\n\tclient = await retry(() => {\n\t\tclient = createClient({ dsn: connectionString, tlsSecurity: 'insecure' });\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.close();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(client, {\n\t\tlogger: ENABLE_LOGGING,\n\t\tcache: new TestCache(),\n\t});\n\tdbGlobalCached = drizzle(client, {\n\t\tlogger: ENABLE_LOGGING,\n\t\tcache: new TestGlobalCache(),\n\t});\n\n\tdsn = connectionString;\n});\n\nafterAll(async () => {\n\tawait client?.close().catch(console.error);\n\tawait container?.stop().catch(console.error);\n});\n\nbeforeEach((ctx) => {\n\tctx.gel = {\n\t\tdb,\n\t};\n\tctx.cachedGel = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ndescribe('some', async () => {\n\tbeforeEach(async (ctx) => {\n\t\tawait ctx.cachedGel.db.$cache?.invalidate({ tables: 'users' });\n\t\tawait ctx.cachedGel.dbGlobalCached.$cache?.invalidate({ tables: 'users' });\n\t});\n\tbeforeAll(async () => {\n\t\tawait $`gel query \"CREATE TYPE default::users {\n            create property id1: int16 {\n                create constraint exclusive;\n            };\n            create required property name: str;\n      create required property verified: bool {\n          SET default := false;\n      };\n      create PROPERTY json: json;\n      create required property  created_at: datetime {\n          SET default := datetime_of_statement();\n      };\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::users_with_cities {\n    create property id1: int16 {\n        create constraint exclusive;\n    };\n    create required property name: str;\n    create required property cityId: int32;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::users_with_undefined {\n        create property id1: int16 {\n            create constraint exclusive;\n        };\n        create property name: str;\n        };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::users_insert_select {\n            create property id1: int16 {\n                create constraint exclusive;\n            };\n            create property name: str;\n            };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE MODULE mySchema;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE mySchema::users {\n            create property id1: int16;\n            create required property name: str;\n      create required property verified: bool {\n          SET default := false;\n      };\n      create PROPERTY json: json;\n      create required property  created_at: datetime {\n          SET default := datetime_of_statement();\n      };\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::orders {\n    CREATE PROPERTY id1 -> int16;\n    CREATE REQUIRED PROPERTY region -> str;\n    CREATE REQUIRED PROPERTY product -> str;\n    CREATE REQUIRED PROPERTY amount -> int64;\n    CREATE REQUIRED PROPERTY quantity -> int64;\n    };\n    \" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::users_distinct {\n    create required property id1 -> int16;\n    create required property name -> str;\n    create required property age -> int16;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::users3 {\n    create property id1 -> int16;\n    create required property name -> str;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::cities {\n    create required property id1 -> int16;\n    create required property name -> str;\n    create property state -> str;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::courses {\n    create required property id1 -> int16;\n    create required property name -> str;\n    create property categoryId -> int16;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::course_categories {\n    create required property id1 -> int16;\n    create required property name -> str;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::jsontest {\n    create property id1 -> int16;\n    create required property json -> json;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::sal_emp {\n    create property name -> str;\n    create property pay_by_quarter -> array<int16>;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::some_new_users {\n    create required property id1 -> int16;\n    create required property name -> str;\n    create property cityId -> int32;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::aggregate_table {\n    create property id1: int16;\n    create required property name: str;\n    create property a: int16;\n    create property b: int16;\n    create property c: int16;\n    create PROPERTY nullOnly: int16;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::prefixed_users {\n    CREATE PROPERTY id1 -> int16;\n    CREATE REQUIRED PROPERTY name -> str;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::empty_insert_single {\n    CREATE PROPERTY id1 -> int16;\n    CREATE REQUIRED PROPERTY name -> str {\n    SET default := 'Dan';\n    };\n    CREATE PROPERTY state -> str;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::empty_insert_multiple {\n    CREATE PROPERTY id1 -> int16;\n    CREATE REQUIRED PROPERTY name -> str {\n    SET default := 'Dan';\n    };\n    CREATE PROPERTY state -> str;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::products {\n    CREATE PROPERTY id1 -> int16;\n    CREATE REQUIRED PROPERTY price -> decimal;\n    CREATE REQUIRED PROPERTY cheap -> bool {\n    SET default := false\n    };\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::myprefix_test_prefixed_table_with_unique_name {\n    create property id1 -> int16;\n    create required property name -> str;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::metric_entry {\n    create required property id1 -> uuid;\n    create required property createdAt -> datetime;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::users_transactions {\n    create required property id1 -> int16;\n    create required property balance -> int16;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::products_transactions {\n    create required property id1 -> int16;\n    create required property price -> int16;\n    create required property stock -> int16;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::users_transactions_rollback {\n    create required property id1 -> int16;\n    create required property balance -> int16;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::users_nested_transactions {\n    create required property id1 -> int16;\n    create required property balance -> int16;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::internal_staff {\n    create required property userId -> int16;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::custom_user {\n    create required property id1 -> int16;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::ticket {\n    create required property staffId -> int16;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::posts {\n    create required property id1 -> int16;\n    create property tags -> array<str>;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE dates_column {\n    create property datetimeColumn -> datetime;\n    create property local_datetimeColumn -> cal::local_datetime;\n    create property local_dateColumn -> cal::local_date;\n    create property local_timeColumn -> cal::local_time;\n    \n    create property durationColumn -> duration;\n    create property relative_durationColumn -> cal::relative_duration;\n    create property dateDurationColumn -> cal::date_duration;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE users_with_insert {\n    create required property username -> str;\n    create required property admin -> bool;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE users_test_with_and_without_timezone {\n    create required property username -> str;\n    create required property admin -> bool;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::arrays_tests {\n    create property id1: int16 {\n        create constraint exclusive;\n    };\n    create property tags: array<str>;\n    create required property numbers: array<int32>;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::users_on_update {\n    create required property id1 -> int16;\n    create required property name -> str;\n    create property update_counter -> int16 {\n        SET default := 1\n    };\n    create property always_null -> str;\n    create property updated_at -> datetime;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::json_table {\n    create PROPERTY json: json;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::notifications {\n    create required property id1 -> int16;\n     create required property  sentAt: datetime {\n          SET default := datetime_of_statement();\n      };\n    create property message -> str;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"CREATE TYPE default::user_notifications {\n    create required property userId -> int16;\n    create required property notificationId -> int16;\n    create property categoryId -> int16;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::users1 {\n    create required property id1: int16;\n    create required property name: str;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"CREATE TYPE default::users2 {\n    create required property id1: int16;\n    create required property name: str;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::count_test {\n    create required property id1: int16;\n    create required property name: str;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::users_with_names {\n    create required property id1: int16;\n    create required property firstName: str;\n    create required property lastName: str;\n    create required property admin: bool;\n    };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::users_with_age {\n        create required property id1: int16;\n        create required property name: str;\n        create required property age: int32;\n        create required property city: str;\n        };\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\n\t\tawait $`gel query \"CREATE TYPE default::users_on_update_sql {\n\t\t\tcreate required property id1: int16;\n\t\t\tcreate required property name: str;\n\t\t\tcreate required property updated_at: datetime;\n\t\t};\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t});\n\n\tafterEach(async () => {\n\t\tawait $`gel query \"DELETE default::users;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DELETE default::prefixed_users;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DELETE default::some_new_users;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DELETE default::orders;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DELETE default::cities;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DELETE default::users_on_update;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DELETE default::aggregate_table;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DELETE mySchema::users;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DELETE default::count_test;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DELETE default::users1;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DELETE default::users2;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DELETE default::jsontest;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DELETE default::users_on_update_sql;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t});\n\n\tafterAll(async () => {\n\t\tawait $`gel query \"DROP TYPE default::users\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::users_with_cities\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::users_with_undefined \" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::users_insert_select\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE mySchema::users\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::orders\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::users_distinct\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::users3\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::cities\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::courses\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::course_categories\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::jsontest\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::sal_emp\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::some_new_users\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::aggregate_table\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::prefixed_users\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::empty_insert_single\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::empty_insert_multiple\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::products\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::myprefix_test_prefixed_table_with_unique_name\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::metric_entry\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::users_transactions\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::products_transactions\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::users_transactions_rollback\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::users_nested_transactions\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::internal_staff\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::custom_user\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::ticket\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::posts\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE dates_column\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE users_with_insert\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE users_test_with_and_without_timezone\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::arrays_tests\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::users_on_update\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::json_table\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::notifications\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::user_notifications\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::users1\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::users2\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::count_test\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::users_with_names\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP MODULE mySchema;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE users_with_age;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t\tawait $`gel query \"DROP TYPE default::users_on_update_sql;\" --tls-security=${tlsSecurity} --dsn=${dsn}`;\n\t});\n\n\tasync function setupSetOperationTest(db: GelJsDatabase) {\n\t\tawait db.insert(cities2Table).values([\n\t\t\t{ id1: 1, name: 'New York' },\n\t\t\t{ id1: 2, name: 'London' },\n\t\t\t{ id1: 3, name: 'Tampa' },\n\t\t]);\n\n\t\tawait db.insert(users2Table).values([\n\t\t\t{ id1: 1, name: 'John', cityId: 1 },\n\t\t\t{ id1: 2, name: 'Jane', cityId: 2 },\n\t\t\t{ id1: 3, name: 'Jack', cityId: 3 },\n\t\t\t{ id1: 4, name: 'Peter', cityId: 3 },\n\t\t\t{ id1: 5, name: 'Ben', cityId: 2 },\n\t\t\t{ id1: 6, name: 'Jill', cityId: 1 },\n\t\t\t{ id1: 7, name: 'Mary', cityId: 2 },\n\t\t\t{ id1: 8, name: 'Sally', cityId: 1 },\n\t\t]);\n\t}\n\n\tasync function setupAggregateFunctionsTest(db: GelJsDatabase) {\n\t\tawait db.insert(aggregateTable).values([\n\t\t\t{ id1: 1, name: 'value 1', a: 5, b: 10, c: 20 },\n\t\t\t{ id1: 2, name: 'value 1', a: 5, b: 20, c: 30 },\n\t\t\t{ id1: 3, name: 'value 2', a: 10, b: 50, c: 60 },\n\t\t\t{ id1: 4, name: 'value 3', a: 20, b: 20, c: null },\n\t\t\t{ id1: 5, name: 'value 4', a: null, b: 90, c: 120 },\n\t\t\t{ id1: 6, name: 'value 5', a: 80, b: 10, c: null },\n\t\t\t{ id1: 7, name: 'value 6', a: null, b: null, c: 150 },\n\t\t]);\n\t}\n\n\ttest('table configs: unique third param', async () => {\n\t\tconst cities1Table = gelTable(\n\t\t\t'cities1',\n\t\t\t{\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstate: text('state'),\n\t\t\t},\n\t\t\t(t) => ({\n\t\t\t\tf: unique('custom_name').on(t.name, t.state).nullsNotDistinct(),\n\t\t\t\tf1: unique('custom_name1').on(t.name, t.state),\n\t\t\t}),\n\t\t);\n\n\t\tconst tableConfig = getTableConfig(cities1Table);\n\n\t\texpect(tableConfig.uniqueConstraints).toHaveLength(2);\n\n\t\texpect(tableConfig.uniqueConstraints[0]?.name).toBe('custom_name');\n\t\texpect(tableConfig.uniqueConstraints[0]?.nullsNotDistinct).toBe(true);\n\t\texpect(tableConfig.uniqueConstraints[0]?.columns.map((t) => t.name)).toEqual(['name', 'state']);\n\n\t\texpect(tableConfig.uniqueConstraints[1]?.name).toBe('custom_name1');\n\t\texpect(tableConfig.uniqueConstraints[1]?.nullsNotDistinct).toBe(false);\n\t\texpect(tableConfig.uniqueConstraints[1]?.columns.map((t) => t.name)).toEqual(['name', 'state']);\n\t});\n\n\ttest('table configs: unique in column', async () => {\n\t\tconst cities1Table = gelTable('cities1', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tname: text('name').notNull().unique(),\n\t\t\tstate: text('state').unique('custom'),\n\t\t\tfield: text('field').unique('custom_field', { nulls: 'not distinct' }),\n\t\t});\n\n\t\tconst tableConfig = getTableConfig(cities1Table);\n\n\t\tconst columnName = tableConfig.columns.find((it) => it.name === 'name');\n\n\t\texpect(columnName?.uniqueName).toBe(uniqueKeyName(cities1Table, [columnName!.name]));\n\t\texpect(columnName?.isUnique).toBe(true);\n\n\t\tconst columnState = tableConfig.columns.find((it) => it.name === 'state');\n\t\texpect(columnState?.uniqueName).toBe('custom');\n\t\texpect(columnState?.isUnique).toBe(true);\n\n\t\tconst columnField = tableConfig.columns.find((it) => it.name === 'field');\n\t\texpect(columnField?.uniqueName).toBe('custom_field');\n\t\texpect(columnField?.isUnique).toBe(true);\n\t\texpect(columnField?.uniqueType).toBe('not distinct');\n\t});\n\n\ttest('table config: foreign keys name', async () => {\n\t\tconst table = gelTable(\n\t\t\t'cities',\n\t\t\t{\n\t\t\t\tid1: integer('id1').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstate: text('state'),\n\t\t\t},\n\t\t\t(t) => ({\n\t\t\t\tf: foreignKey({ foreignColumns: [t.id1], columns: [t.id1], name: 'custom_fk' }),\n\t\t\t}),\n\t\t);\n\n\t\tconst tableConfig = getTableConfig(table);\n\n\t\texpect(tableConfig.foreignKeys).toHaveLength(1);\n\t\texpect(tableConfig.foreignKeys[0]!.getName()).toBe('custom_fk');\n\t});\n\n\ttest('table config: primary keys name', async () => {\n\t\tconst table = gelTable(\n\t\t\t'cities',\n\t\t\t{\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstate: text('state'),\n\t\t\t},\n\t\t\t(t) => ({\n\t\t\t\tf: primaryKey({ columns: [t.id, t.name], name: 'custom_pk' }),\n\t\t\t}),\n\t\t);\n\n\t\tconst tableConfig = getTableConfig(table);\n\n\t\texpect(tableConfig.primaryKeys).toHaveLength(1);\n\t\texpect(tableConfig.primaryKeys[0]!.getName()).toBe('custom_pk');\n\t});\n\n\ttest('select all fields', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst now = Date.now();\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\n\t\tconst result = await db.select().from(usersTable);\n\n\t\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t\t// TODO 100 ms\n\t\texpect(Math.abs(result[0]!.createdAt.getTime() - now)).toBeLessThan(500);\n\t\texpect(result.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{\n\t\t\t\tid: undefined,\n\t\t\t\tid1: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tverified: false,\n\t\t\t\tjson: null,\n\t\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('select sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\t\tconst users = await db\n\t\t\t.select({\n\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t})\n\t\t\t.from(usersTable);\n\n\t\texpect(users.map((it) => ({ ...it, id: undefined }))).toStrictEqual([{ id: undefined, name: 'JOHN' }]);\n\t});\n\n\ttest('select typed sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\n\t\tconst users = await db\n\t\t\t.select({\n\t\t\t\tname: sql<string>`upper(${usersTable.name})`,\n\t\t\t})\n\t\t\t.from(usersTable);\n\n\t\texpect(users.map((it) => ({ ...it, id: undefined }))).toEqual([{ name: 'JOHN' }]);\n\t});\n\n\ttest('select with empty array in inArray', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Jane',\n\t\t\t},\n\t\t]);\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t})\n\t\t\t.from(usersTable)\n\t\t\t.where(inArray(usersTable.id1, []));\n\n\t\texpect(result.map((it) => ({ ...it, id: undefined }))).toEqual([]);\n\t});\n\n\ttest('select with empty array in notInArray', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Jane',\n\t\t\t},\n\t\t]);\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t})\n\t\t\t.from(usersTable)\n\t\t\t.where(notInArray(usersTable.id1, []));\n\n\t\texpect(result.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{ name: 'JOHN' },\n\t\t\t{ name: 'JANE' },\n\t\t\t{\n\t\t\t\tname: 'JANE',\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('$default function', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst insertedOrder = await db.insert(orders).values({ id1: 1, region: 'Ukraine', amount: 1, quantity: 1 })\n\t\t\t.returning();\n\t\tconst selectedOrder = await db.select().from(orders);\n\n\t\texpect(insertedOrder.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{\n\t\t\t\tid: undefined,\n\t\t\t\tamount: 1,\n\t\t\t\tid1: 1,\n\t\t\t\tquantity: 1,\n\t\t\t\tregion: 'Ukraine',\n\t\t\t\tproduct: 'random_string',\n\t\t\t},\n\t\t]);\n\n\t\texpect(selectedOrder.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{\n\t\t\t\tid: undefined,\n\t\t\t\tid1: 1,\n\t\t\t\tamount: 1,\n\t\t\t\tquantity: 1,\n\t\t\t\tregion: 'Ukraine',\n\t\t\t\tproduct: 'random_string',\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('select distinct', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst usersDistinctTable = gelTable('users_distinct', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t\tage: integer('age').notNull(),\n\t\t});\n\n\t\tawait db.insert(usersDistinctTable).values([\n\t\t\t{ id1: 1, name: 'John', age: 24 },\n\t\t\t{ id1: 1, name: 'John', age: 24 },\n\t\t\t{ id1: 2, name: 'John', age: 25 },\n\t\t\t{ id1: 1, name: 'Jane', age: 24 },\n\t\t\t{ id1: 1, name: 'Jane', age: 26 },\n\t\t]);\n\n\t\tconst users1 = await db.selectDistinct().from(usersDistinctTable).orderBy(\n\t\t\tusersDistinctTable.id1,\n\t\t\tusersDistinctTable.name,\n\t\t);\n\n\t\tconst users2 = await db.selectDistinctOn([usersDistinctTable.id1]).from(usersDistinctTable).orderBy(\n\t\t\tusersDistinctTable.id1,\n\t\t);\n\n\t\tconst users3 = await db.selectDistinctOn([usersDistinctTable.name], { name: usersDistinctTable.name }).from(\n\t\t\tusersDistinctTable,\n\t\t).orderBy(usersDistinctTable.name);\n\n\t\tconst users4 = await db.selectDistinctOn([usersDistinctTable.id1, usersDistinctTable.age]).from(\n\t\t\tusersDistinctTable,\n\t\t).orderBy(usersDistinctTable.id1, usersDistinctTable.age);\n\n\t\texpect(users1).toEqual([\n\t\t\t{ id1: 1, name: 'Jane', age: 24 },\n\t\t\t{ id1: 1, name: 'Jane', age: 26 },\n\t\t\t{ id1: 1, name: 'John', age: 24 },\n\t\t\t{ id1: 2, name: 'John', age: 25 },\n\t\t]);\n\n\t\texpect(users2).toHaveLength(2);\n\t\texpect(users2[0]?.id1).toBe(1);\n\t\texpect(users2[1]?.id1).toBe(2);\n\n\t\texpect(users3).toHaveLength(2);\n\t\texpect(users3[0]?.name).toBe('Jane');\n\t\texpect(users3[1]?.name).toBe('John');\n\n\t\texpect(users4).toEqual([\n\t\t\t{ id1: 1, name: 'John', age: 24 },\n\t\t\t{ id1: 1, name: 'Jane', age: 26 },\n\t\t\t{ id1: 2, name: 'John', age: 25 },\n\t\t]);\n\t});\n\n\ttest('insert returning sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = await db\n\t\t\t.insert(usersTable)\n\t\t\t.values({ id1: 1, name: 'John' })\n\t\t\t.returning({\n\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t});\n\n\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t});\n\n\ttest('delete returning sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\t\tconst users = await db\n\t\t\t.delete(usersTable)\n\t\t\t.where(eq(usersTable.name, 'John'))\n\t\t\t.returning({\n\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t});\n\n\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t});\n\n\ttest('update returning sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\t\tconst users = await db\n\t\t\t.update(usersTable)\n\t\t\t.set({ name: 'Jane' })\n\t\t\t.where(eq(usersTable.name, 'John'))\n\t\t\t.returning({\n\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t});\n\n\t\texpect(users).toEqual([{ name: 'JANE' }]);\n\t});\n\n\ttest('update with returning all fields', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst now = Date.now();\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\t\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning();\n\n\t\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(500);\n\t\texpect(users).toEqual([\n\t\t\t{\n\t\t\t\tid1: 1,\n\t\t\t\tname: 'Jane',\n\t\t\t\tverified: false,\n\t\t\t\tjson: null,\n\t\t\t\tcreatedAt: users[0]!.createdAt,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('update with returning partial', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\t\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning({\n\t\t\tid1: usersTable.id1,\n\t\t\tname: usersTable.name,\n\t\t});\n\n\t\texpect(users).toEqual([{ id1: 1, name: 'Jane' }]);\n\t});\n\n\ttest('delete with returning all fields', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst now = Date.now();\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\t\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning();\n\n\t\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(500);\n\t\texpect(users.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{\n\t\t\t\tname: 'John',\n\t\t\t\tid1: 1,\n\t\t\t\tid: undefined,\n\t\t\t\tverified: false,\n\t\t\t\tjson: null,\n\t\t\t\tcreatedAt: users[0]!.createdAt,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('delete with returning partial', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\t\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning({\n\t\t\tid1: usersTable.id1,\n\t\t\tname: usersTable.name,\n\t\t});\n\n\t\texpect(users.map((it) => ({ ...it, id: undefined }))).toEqual([{ id1: 1, name: 'John' }]);\n\t});\n\n\ttest('insert + select', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\t\tconst result = await db.select().from(usersTable);\n\t\texpect(result).toEqual([\n\t\t\t{\n\t\t\t\tname: 'John',\n\t\t\t\tid1: 1,\n\t\t\t\tverified: false,\n\t\t\t\tjson: null,\n\t\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t\t},\n\t\t]);\n\n\t\tawait db.insert(usersTable).values({ id1: 2, name: 'Jane' });\n\t\tconst result2 = await db.select().from(usersTable);\n\t\texpect(result2).toEqual([\n\t\t\t{ id1: 1, name: 'John', verified: false, json: null, createdAt: result2[0]!.createdAt },\n\t\t\t{ id1: 2, name: 'Jane', verified: false, json: null, createdAt: result2[1]!.createdAt },\n\t\t]);\n\t});\n\n\ttest('json insert', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John', json: ['foo', 'bar'] });\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tid1: usersTable.id1,\n\t\t\t\tname: usersTable.name,\n\t\t\t\tjson: usersTable.json,\n\t\t\t})\n\t\t\t.from(usersTable);\n\n\t\texpect(result).toEqual([\n\t\t\t{\n\t\t\t\tid1: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tjson: ['foo', 'bar'],\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('insert with overridden default values', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John', verified: true });\n\t\tconst result = await db.select().from(usersTable);\n\n\t\texpect(result).toEqual([\n\t\t\t{\n\t\t\t\tid1: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tverified: true,\n\t\t\t\tjson: null,\n\t\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('insert many', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Bruce', json: ['foo', 'bar'], verified: true },\n\t\t\t{ id1: 3, name: 'Jane' },\n\t\t\t{ id1: 4, name: 'Austin', verified: true },\n\t\t]);\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tname: usersTable.name,\n\t\t\t\tjson: usersTable.json,\n\t\t\t\tverified: usersTable.verified,\n\t\t\t})\n\t\t\t.from(usersTable);\n\n\t\texpect(result).toEqual([\n\t\t\t{ name: 'John', json: null, verified: false },\n\t\t\t{ name: 'Bruce', json: ['foo', 'bar'], verified: true },\n\t\t\t{ name: 'Jane', json: null, verified: false },\n\t\t\t{ name: 'Austin', json: null, verified: true },\n\t\t]);\n\t});\n\n\ttest('insert many with returning', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst result = await db\n\t\t\t.insert(usersTable)\n\t\t\t.values([\n\t\t\t\t{ id1: 1, name: 'John' },\n\t\t\t\t{ id1: 2, name: 'Bruce', json: ['foo', 'bar'] },\n\t\t\t\t{ id1: 3, name: 'Jane' },\n\t\t\t\t{\n\t\t\t\t\tid1: 4,\n\t\t\t\t\tname: 'Austin',\n\t\t\t\t\tverified: true,\n\t\t\t\t},\n\t\t\t])\n\t\t\t.returning({\n\t\t\t\tname: usersTable.name,\n\t\t\t\tjson: usersTable.json,\n\t\t\t\tverified: usersTable.verified,\n\t\t\t});\n\n\t\texpect(result).toEqual([\n\t\t\t{ name: 'John', json: null, verified: false },\n\t\t\t{ name: 'Bruce', json: ['foo', 'bar'], verified: false },\n\t\t\t{ name: 'Jane', json: null, verified: false },\n\t\t\t{ name: 'Austin', json: null, verified: true },\n\t\t]);\n\t});\n\n\ttest('select with group by as field', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Jane',\n\t\t\t},\n\t\t]);\n\n\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable).groupBy(usersTable.name);\n\n\t\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n\t});\n\n\ttest('select with exists', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Jane',\n\t\t\t},\n\t\t]);\n\n\t\tconst user = alias(usersTable, 'user');\n\t\tconst result = await db\n\t\t\t.select({ name: usersTable.name })\n\t\t\t.from(usersTable)\n\t\t\t.where(\n\t\t\t\texists(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ one: sql`1` })\n\t\t\t\t\t\t.from(user)\n\t\t\t\t\t\t.where(and(eq(usersTable.name, 'John'), eq(user.id1, usersTable.id1))),\n\t\t\t\t),\n\t\t\t);\n\n\t\texpect(result).toEqual([{ name: 'John' }]);\n\t});\n\n\ttest('select with group by as sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Jane',\n\t\t\t},\n\t\t]);\n\n\t\tconst result = await db\n\t\t\t.select({ name: usersTable.name })\n\t\t\t.from(usersTable)\n\t\t\t.groupBy(sql`${usersTable.name}`);\n\n\t\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n\t});\n\n\ttest.skip('select with group by as sql + column', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Jane',\n\t\t\t},\n\t\t]);\n\n\t\tconst result = await db\n\t\t\t.select({ name: usersTable.name })\n\t\t\t.from(usersTable)\n\t\t\t.groupBy(sql`${usersTable.name}`, usersTable.id1);\n\n\t\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }, { name: 'Jane' }]);\n\t});\n\n\ttest('select with group by as column + sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Jane',\n\t\t\t},\n\t\t]);\n\n\t\tconst result = await db\n\t\t\t.select({ name: usersTable.name })\n\t\t\t.from(usersTable)\n\t\t\t.groupBy(usersTable.id1, sql`${usersTable.name}`);\n\n\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t});\n\n\ttest('select with group by complex query', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Jane',\n\t\t\t},\n\t\t]);\n\n\t\tconst result = await db\n\t\t\t.select({ name: usersTable.name })\n\t\t\t.from(usersTable)\n\t\t\t.groupBy(usersTable.id1, sql`${usersTable.name}`)\n\t\t\t.orderBy(asc(usersTable.name))\n\t\t\t.limit(1);\n\n\t\texpect(result).toEqual([{ name: 'Jane' }]);\n\t});\n\n\ttest('build query', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst query = db.select({ id: usersTable.id1, name: usersTable.name }).from(usersTable).groupBy(\n\t\t\tusersTable.id1,\n\t\t\tusersTable.name,\n\t\t).toSQL();\n\n\t\texpect(query).toEqual({\n\t\t\tsql: 'select \"users\".\"id1\", \"users\".\"name\" from \"users\" group by \"users\".\"id1\", \"users\".\"name\"',\n\t\t\tparams: [],\n\t\t});\n\t});\n\n\ttest('insert sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: sql`${'John'}` });\n\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable);\n\t\texpect(result).toEqual([{ name: 'John' }]);\n\t});\n\n\ttest('partial join with alias', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\t\tconst customerAlias = alias(usersTable, 'customer');\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 10, name: 'Ivan' },\n\t\t\t{ id1: 11, name: 'Hans' },\n\t\t]);\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tuser: {\n\t\t\t\t\tid1: usersTable.id1,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid1: customerAlias.id1,\n\t\t\t\t\tname: customerAlias.name,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.from(usersTable)\n\t\t\t.leftJoin(customerAlias, eq(customerAlias.id1, 11))\n\t\t\t.where(eq(usersTable.id1, 10));\n\n\t\texpect(result).toEqual([\n\t\t\t{\n\t\t\t\tuser: { id1: 10, name: 'Ivan' },\n\t\t\t\tcustomer: { id1: 11, name: 'Hans' },\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('full join with alias', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst gelTable = gelTableCreator((name) => `prefixed_${name}`);\n\n\t\tconst users = gelTable('users', {\n\t\t\tid1: integer('id1').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\tconst customers = alias(users, 'customer');\n\n\t\tawait db.insert(users).values([\n\t\t\t{ id1: 10, name: 'Ivan' },\n\t\t\t{ id1: 11, name: 'Hans' },\n\t\t]);\n\t\tconst result = await db.select().from(users).leftJoin(customers, eq(customers.id1, 11)).where(\n\t\t\teq(users.id1, 10),\n\t\t);\n\n\t\texpect(result).toEqual([\n\t\t\t{\n\t\t\t\tusers: {\n\t\t\t\t\tid1: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid1: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('select from alias', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst gelTable = gelTableCreator((name) => `prefixed_${name}`);\n\n\t\tconst users = gelTable('users', {\n\t\t\tid1: integer('id1'),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\tconst user = alias(users, 'user');\n\t\tconst customers = alias(users, 'customer');\n\n\t\tawait db.insert(users).values([\n\t\t\t{ id1: 10, name: 'Ivan' },\n\t\t\t{ id1: 11, name: 'Hans' },\n\t\t]);\n\t\tconst result = await db.select().from(user).leftJoin(customers, eq(customers.id1, 11)).where(eq(user.id1, 10));\n\n\t\texpect(result).toEqual([\n\t\t\t{\n\t\t\t\tuser: {\n\t\t\t\t\tid1: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid1: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('insert with spaces', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: sql`'Jo   h     n'` });\n\t\tconst result = await db.select({ id1: usersTable.id1, name: usersTable.name }).from(usersTable);\n\n\t\texpect(result).toEqual([{ id1: 1, name: 'Jo   h     n' }]);\n\t});\n\n\ttest('prepared statement', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\t\tconst statement = db\n\t\t\t.select({\n\t\t\t\tname: usersTable.name,\n\t\t\t})\n\t\t\t.from(usersTable)\n\t\t\t.prepare('statement1');\n\t\tconst result = await statement.execute();\n\n\t\texpect(result).toEqual([{ name: 'John' }]);\n\t});\n\n\ttest('insert: placeholders on columns with encoder', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst statement = db\n\t\t\t.insert(usersTable)\n\t\t\t.values({\n\t\t\t\tid1: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tjson: sql.placeholder('json'),\n\t\t\t})\n\t\t\t.prepare('encoder_statement');\n\n\t\tawait statement.execute({ json: ['foo', 'bar'] });\n\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tjson: usersTable.json,\n\t\t\t})\n\t\t\t.from(usersTable);\n\n\t\texpect(result).toEqual([{ json: ['foo', 'bar'] }]);\n\t});\n\n\ttest('prepared statement reuse', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst stmt = db\n\t\t\t.insert(usersTable)\n\t\t\t.values({\n\t\t\t\tid1: sql.placeholder('id1'),\n\t\t\t\tverified: true,\n\t\t\t\tname: sql.placeholder('name'),\n\t\t\t})\n\t\t\t.prepare('stmt2');\n\n\t\tfor (let i = 1; i < 11; i++) {\n\t\t\tawait stmt.execute({ id1: i, name: `John ${i}` });\n\t\t}\n\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tname: usersTable.name,\n\t\t\t\tverified: usersTable.verified,\n\t\t\t})\n\t\t\t.from(usersTable);\n\n\t\texpect(result).toEqual([\n\t\t\t{ name: 'John 1', verified: true },\n\t\t\t{ name: 'John 2', verified: true },\n\t\t\t{ name: 'John 3', verified: true },\n\t\t\t{ name: 'John 4', verified: true },\n\t\t\t{ name: 'John 5', verified: true },\n\t\t\t{ name: 'John 6', verified: true },\n\t\t\t{ name: 'John 7', verified: true },\n\t\t\t{ name: 'John 8', verified: true },\n\t\t\t{ name: 'John 9', verified: true },\n\t\t\t{ name: 'John 10', verified: true },\n\t\t]);\n\t});\n\n\ttest('prepared statement with placeholder in .where', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\t\tconst stmt = db\n\t\t\t.select({\n\t\t\t\tid1: usersTable.id1,\n\t\t\t\tname: usersTable.name,\n\t\t\t})\n\t\t\t.from(usersTable)\n\t\t\t.where(eq(usersTable.id1, sql.placeholder('id1')))\n\t\t\t.prepare('stmt3');\n\t\tconst result = await stmt.execute({ id1: 1 });\n\n\t\texpect(result).toEqual([{ id1: 1, name: 'John' }]);\n\t});\n\n\ttest('prepared statement with placeholder in .limit', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\t\tconst stmt = db\n\t\t\t.select({\n\t\t\t\tid1: usersTable.id1,\n\t\t\t\tname: usersTable.name,\n\t\t\t})\n\t\t\t.from(usersTable)\n\t\t\t.where(eq(usersTable.id1, sql.placeholder('id1')))\n\t\t\t.limit(sql.placeholder('limit'))\n\t\t\t.prepare('stmt_limit');\n\n\t\tconst result = await stmt.execute({ id1: 1, limit: 1 });\n\n\t\texpect(result).toEqual([{ id1: 1, name: 'John' }]);\n\t\texpect(result).toHaveLength(1);\n\t});\n\n\ttest('prepared statement with placeholder in .offset', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'John1' },\n\t\t]);\n\t\tconst stmt = db\n\t\t\t.select({\n\t\t\t\tid1: usersTable.id1,\n\t\t\t\tname: usersTable.name,\n\t\t\t})\n\t\t\t.from(usersTable)\n\t\t\t.offset(sql.placeholder('offset'))\n\t\t\t.prepare('stmt_offset');\n\n\t\tconst result = await stmt.execute({ offset: 1 });\n\n\t\texpect(result).toEqual([{ id1: 2, name: 'John1' }]);\n\t});\n\n\ttest('prepared statement built using $dynamic', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tfunction withLimitOffset(qb: any) {\n\t\t\treturn qb.limit(sql.placeholder('limit')).offset(sql.placeholder('offset'));\n\t\t}\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'John1' },\n\t\t]);\n\t\tconst stmt = db\n\t\t\t.select({\n\t\t\t\tid1: usersTable.id1,\n\t\t\t\tname: usersTable.name,\n\t\t\t})\n\t\t\t.from(usersTable)\n\t\t\t.$dynamic();\n\t\twithLimitOffset(stmt).prepare('stmt_limit');\n\n\t\tconst result = await stmt.execute({ limit: 1, offset: 1 });\n\n\t\texpect(result).toEqual([{ id1: 2, name: 'John1' }]);\n\t\texpect(result).toHaveLength(1);\n\t});\n\n\ttest('Query check: Insert all defaults in 1 row', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = gelTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tname: text('name').default('Dan'),\n\t\t\tstate: text('state'),\n\t\t});\n\n\t\tconst query = db.insert(users).values({}).toSQL();\n\n\t\texpect(query).toEqual({\n\t\t\tsql: 'insert into \"users\" (\"id\", \"name\", \"state\") values (default, default, default)',\n\t\t\tparams: [],\n\t\t});\n\t});\n\n\ttest('Query check: Insert all defaults in multiple rows', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = gelTable('users', {\n\t\t\tid: integer('id'),\n\t\t\tname: text('name').default('Dan'),\n\t\t\tstate: text('state').default('UA'),\n\t\t});\n\n\t\tconst query = db.insert(users).values([{}, {}]).toSQL();\n\n\t\texpect(query).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"users\" (\"id\", \"name\", \"state\") values (default, default, default), (default, default, default)',\n\t\t\tparams: [],\n\t\t});\n\t});\n\n\ttest('Insert all defaults in 1 row', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = gelTable('empty_insert_single', {\n\t\t\tid1: integer('id1'),\n\t\t\tname: text('name').default('Dan'),\n\t\t\tstate: text('state'),\n\t\t});\n\n\t\tawait db.insert(users).values({});\n\n\t\tconst res = await db.select().from(users);\n\n\t\texpect(res).toEqual([{ id1: null, name: 'Dan', state: null }]);\n\t});\n\n\ttest('Insert all defaults in multiple rows', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = gelTable('empty_insert_multiple', {\n\t\t\tid: integer('id'),\n\t\t\tname: text('name').default('Dan'),\n\t\t\tstate: text('state'),\n\t\t});\n\n\t\tawait db.insert(users).values([{}, {}]);\n\n\t\tconst res = await db.select().from(users);\n\n\t\texpect(res.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{ id: undefined, name: 'Dan', state: null },\n\t\t\t{ id: undefined, name: 'Dan', state: null },\n\t\t]);\n\t});\n\n\t// TODO not supported in gel\n\ttest.todo('build query insert with onConflict do update', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst query = db\n\t\t\t.insert(usersTable)\n\t\t\t.values({ id1: 1, name: 'John', json: ['foo', 'bar'] })\n\t\t\t// .onConflictDoUpdate({ target: usersTable.id1, set: { name: 'John1' } })\n\t\t\t.toSQL();\n\n\t\texpect(query).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"users\" (\"id1\", \"name\", \"verified\", \"json\", \"created_at\") values ($1, $2, default, $3, default) on conflict (\"id1\") do update set \"name\" = $4',\n\t\t\tparams: [1, 'John', ['foo', 'bar'], 'John1'],\n\t\t});\n\t});\n\n\t// TODO on conflict not supported in gel\n\ttest.todo('build query insert with onConflict do update / multiple columns', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst query = db\n\t\t\t.insert(usersTable)\n\t\t\t.values({ id1: 1, name: 'John', json: ['foo', 'bar'] })\n\t\t\t// .onConflictDoUpdate({ target: [usersTable.id1, usersTable.name], set: { name: 'John1' } })\n\t\t\t.toSQL();\n\n\t\texpect(query).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"users\" (\"id1\", \"name\", \"verified\", \"json\", \"created_at\") values ($1, $2, default, $3, default) on conflict (\"id1\",\"name\") do update set \"name\" = $4',\n\t\t\tparams: [1, 'John', ['foo', 'bar'], 'John1'],\n\t\t});\n\t});\n\n\t// TODO on conflict not supported in gel\n\ttest.todo('build query insert with onConflict do nothing', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst query = db\n\t\t\t.insert(usersTable)\n\t\t\t.values({ id1: 1, name: 'John', json: ['foo', 'bar'] })\n\t\t\t// .onConflictDoNothing()\n\t\t\t.toSQL();\n\n\t\texpect(query).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"users\" (\"id1\", \"name\", \"verified\", \"json\", \"created_at\") values ($1, $2, default, 32, default) on conflict do nothing',\n\t\t\tparams: [1, 'John', ['foo', 'bar']],\n\t\t});\n\t});\n\n\t// TODO on conflict not supported\n\ttest.todo('build query insert with onConflict do nothing + target', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst query = db\n\t\t\t.insert(usersTable)\n\t\t\t.values({ id1: 1, name: 'John', json: ['foo', 'bar'] })\n\t\t\t// .onConflictDoNothing({ target: usersTable.id1 })\n\t\t\t.toSQL();\n\n\t\texpect(query).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"users\" (\"id1\", \"name\", \"verified\", \"json\", \"created_at\") values ($1, $2, default, $3, default) on conflict (\"id1\") do nothing',\n\t\t\tparams: [1, 'John', ['foo', 'bar']],\n\t\t});\n\t});\n\n\t// TODO on conflict not supported in gel\n\ttest.todo('insert with onConflict do update', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\n\t\tawait db\n\t\t\t.insert(usersTable)\n\t\t\t.values({ id1: 1, name: 'John' });\n\t\t// .onConflictDoUpdate({ target: usersTable.id1, set: { name: 'John1' } });\n\n\t\tconst res = await db.select({ id1: usersTable.id1, name: usersTable.name }).from(usersTable).where(\n\t\t\teq(usersTable.id1, 1),\n\t\t);\n\n\t\texpect(res).toEqual([{ id1: 1, name: 'John1' }]);\n\t});\n\n\t// TODO on conflict does not supported\n\ttest.todo('insert with onConflict do nothing', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\n\t\t// await db.insert(usersTable).values({ id1: 1, name: 'John' }).onConflictDoNothing();\n\n\t\tconst res = await db.select({ id1: usersTable.id1, name: usersTable.name }).from(usersTable).where(\n\t\t\teq(usersTable.id1, 1),\n\t\t);\n\n\t\texpect(res).toEqual([{ id1: 1, name: 'John' }]);\n\t});\n\n\t// TODO on conflict does not supported\n\ttest.todo('insert with onConflict do nothing + target', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\n\t\t// await db.insert(usersTable).values({ id1: 1, name: 'John' }).onConflictDoNothing({\n\t\t// target: usersTable.id1,\n\t\t// });\n\n\t\tconst res = await db.select({ id1: usersTable.id1, name: usersTable.name }).from(usersTable).where(\n\t\t\teq(usersTable.id1, 1),\n\t\t);\n\n\t\texpect(res).toEqual([{ id1: 1, name: 'John' }]);\n\t});\n\n\ttest('left join (flat object fields)', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst { id1: cityId } = await db\n\t\t\t.insert(citiesTable)\n\t\t\t.values([\n\t\t\t\t{ id1: 1, name: 'Paris', state: 'Unknown' },\n\t\t\t\t{ id1: 2, name: 'London', state: 'Unknown' },\n\t\t\t])\n\t\t\t.returning({ id1: citiesTable.id1 })\n\t\t\t.then((rows) => rows[0]!);\n\n\t\tawait db.insert(users2Table).values([\n\t\t\t{ id1: 1, name: 'John', cityId },\n\t\t\t{ id1: 2, name: 'Jane', cityId },\n\t\t]);\n\n\t\tconst res = await db\n\t\t\t.select({\n\t\t\t\tuserId: users2Table.id1,\n\t\t\t\tuserName: users2Table.name,\n\t\t\t\tcityId: citiesTable.id1,\n\t\t\t\tcityName: citiesTable.name,\n\t\t\t})\n\t\t\t.from(users2Table)\n\t\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id1));\n\n\t\texpect(res).toEqual([\n\t\t\t{ userId: 1, userName: 'John', cityId, cityName: 'Paris' },\n\t\t\t{ userId: 2, userName: 'Jane', cityId, cityName: 'Paris' },\n\t\t]);\n\t});\n\n\ttest('left join (grouped fields)', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst { id1: cityId } = await db\n\t\t\t.insert(citiesTable)\n\t\t\t.values([\n\t\t\t\t{ id1: 1, name: 'Paris' },\n\t\t\t\t{ id1: 2, name: 'London' },\n\t\t\t])\n\t\t\t.returning({ id1: citiesTable.id1 })\n\t\t\t.then((rows) => rows[0]!);\n\n\t\tawait db.insert(users2Table).values([\n\t\t\t{ id1: 1, name: 'John', cityId },\n\t\t\t{ id1: 2, name: 'Jane', cityId },\n\t\t]);\n\n\t\tconst res = await db\n\t\t\t.select({\n\t\t\t\tid: users2Table.id1,\n\t\t\t\tuser: {\n\t\t\t\t\tname: users2Table.name,\n\t\t\t\t\tnameUpper: sql<string>`upper(${users2Table.name})`,\n\t\t\t\t},\n\t\t\t\tcity: {\n\t\t\t\t\tid: citiesTable.id1,\n\t\t\t\t\tname: citiesTable.name,\n\t\t\t\t\tnameUpper: sql<string>`upper(${citiesTable.name})`,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.from(users2Table)\n\t\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id1));\n\n\t\texpect(res).toEqual([\n\t\t\t{\n\t\t\t\tid: 1,\n\t\t\t\tuser: { name: 'John', nameUpper: 'JOHN' },\n\t\t\t\tcity: { id: cityId, name: 'Paris', nameUpper: 'PARIS' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 2,\n\t\t\t\tuser: { name: 'Jane', nameUpper: 'JANE' },\n\t\t\t\tcity: { id: cityId, name: 'Paris', nameUpper: 'PARIS' },\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('left join (all fields)', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst { id1: cityId } = await db\n\t\t\t.insert(citiesTable)\n\t\t\t.values([\n\t\t\t\t{ id1: 1, name: 'Paris' },\n\t\t\t\t{ id1: 2, name: 'London' },\n\t\t\t])\n\t\t\t.returning({ id1: citiesTable.id1 })\n\t\t\t.then((rows) => rows[0]!);\n\n\t\tawait db.insert(users2Table).values([\n\t\t\t{ id1: 1, name: 'John', cityId },\n\t\t\t{ id1: 2, name: 'Jane', cityId },\n\t\t]);\n\n\t\tconst res = await db.select().from(users2Table).leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id1));\n\n\t\texpect(res).toEqual([\n\t\t\t{\n\t\t\t\tsome_new_users: {\n\t\t\t\t\tid1: 1,\n\t\t\t\t\tname: 'John',\n\t\t\t\t\tcityId,\n\t\t\t\t},\n\t\t\t\tcities: {\n\t\t\t\t\tid1: cityId,\n\t\t\t\t\tname: 'Paris',\n\t\t\t\t\tstate: null,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tsome_new_users: {\n\t\t\t\t\tid1: 2,\n\t\t\t\t\tname: 'Jane',\n\t\t\t\t\tcityId,\n\t\t\t\t},\n\t\t\t\tcities: {\n\t\t\t\t\tid1: cityId,\n\t\t\t\t\tname: 'Paris',\n\t\t\t\t\tstate: null,\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('select from a many subquery', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(citiesTable)\n\t\t\t.values([{ id1: 1, name: 'Paris' }, { id1: 2, name: 'London' }]);\n\n\t\tawait db.insert(users2Table).values([\n\t\t\t{ id1: 1, name: 'John', cityId: 1 },\n\t\t\t{ id1: 2, name: 'Jane', cityId: 2 },\n\t\t\t{ id1: 3, name: 'Jack', cityId: 2 },\n\t\t]);\n\n\t\tconst res = await db.select({\n\t\t\tpopulation: db.select({ count: count().as('count') }).from(users2Table).where(\n\t\t\t\teq(users2Table.cityId, citiesTable.id1),\n\t\t\t).as(\n\t\t\t\t'population',\n\t\t\t),\n\t\t\tname: citiesTable.name,\n\t\t}).from(citiesTable);\n\n\t\texpectTypeOf(res).toEqualTypeOf<{\n\t\t\tpopulation: number;\n\t\t\tname: string;\n\t\t}[]>();\n\n\t\texpect(res).toStrictEqual([{\n\t\t\tpopulation: 1,\n\t\t\tname: 'Paris',\n\t\t}, {\n\t\t\tpopulation: 2,\n\t\t\tname: 'London',\n\t\t}]);\n\t});\n\n\ttest('select from a one subquery', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(citiesTable)\n\t\t\t.values([{ id1: 1, name: 'Paris' }, { id1: 2, name: 'London' }]);\n\n\t\tawait db.insert(users2Table).values([\n\t\t\t{ id1: 1, name: 'John', cityId: 1 },\n\t\t\t{ id1: 2, name: 'Jane', cityId: 2 },\n\t\t\t{ id1: 3, name: 'Jack', cityId: 2 },\n\t\t]);\n\n\t\tconst res = await db.select({\n\t\t\tcityName: db.select({ name: citiesTable.name }).from(citiesTable).where(eq(users2Table.cityId, citiesTable.id1))\n\t\t\t\t.as(\n\t\t\t\t\t'cityName',\n\t\t\t\t),\n\t\t\tname: users2Table.name,\n\t\t}).from(users2Table);\n\n\t\texpectTypeOf(res).toEqualTypeOf<{\n\t\t\tcityName: string;\n\t\t\tname: string;\n\t\t}[]>();\n\n\t\texpect(res).toStrictEqual([{\n\t\t\tcityName: 'Paris',\n\t\t\tname: 'John',\n\t\t}, {\n\t\t\tcityName: 'London',\n\t\t\tname: 'Jane',\n\t\t}, {\n\t\t\tcityName: 'London',\n\t\t\tname: 'Jack',\n\t\t}]);\n\t});\n\n\ttest('join subquery', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(courseCategoriesTable).values([\n\t\t\t{ id1: 1, name: 'Category 1' },\n\t\t\t{ id1: 2, name: 'Category 2' },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Category 3',\n\t\t\t},\n\t\t\t{ id1: 4, name: 'Category 4' },\n\t\t]);\n\n\t\tawait db.insert(coursesTable).values([\n\t\t\t{ id1: 1, name: 'Development', categoryId: 2 },\n\t\t\t{ id1: 2, name: 'IT & Software', categoryId: 3 },\n\t\t\t{ id1: 3, name: 'Marketing', categoryId: 4 },\n\t\t\t{ id1: 4, name: 'Design', categoryId: 1 },\n\t\t]);\n\n\t\tconst sq2 = db\n\t\t\t.select({\n\t\t\t\tcategoryId: courseCategoriesTable.id1,\n\t\t\t\tcategory: courseCategoriesTable.name,\n\t\t\t\ttotal: sql<number>`count(${courseCategoriesTable.id1})`,\n\t\t\t})\n\t\t\t.from(courseCategoriesTable)\n\t\t\t.groupBy(courseCategoriesTable.id1, courseCategoriesTable.name)\n\t\t\t.as('sq2');\n\n\t\tconst res = await db\n\t\t\t.select({\n\t\t\t\tcourseName: coursesTable.name,\n\t\t\t\tcategoryId: sq2.categoryId,\n\t\t\t})\n\t\t\t.from(coursesTable)\n\t\t\t.leftJoin(sq2, eq(coursesTable.categoryId, sq2.categoryId))\n\t\t\t.orderBy(coursesTable.name);\n\n\t\texpect(res).toEqual([\n\t\t\t{ courseName: 'Design', categoryId: 1 },\n\t\t\t{ courseName: 'Development', categoryId: 2 },\n\t\t\t{ courseName: 'IT & Software', categoryId: 3 },\n\t\t\t{ courseName: 'Marketing', categoryId: 4 },\n\t\t]);\n\t});\n\n\ttest('with ... select', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(orders).values([\n\t\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t\t]);\n\n\t\tconst regionalSales = db.$with('regional_sales').as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.groupBy(orders.region),\n\t\t);\n\n\t\tconst topRegions = db.$with('top_regions').as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: regionalSales.region,\n\t\t\t\t})\n\t\t\t\t.from(regionalSales)\n\t\t\t\t.where(\n\t\t\t\t\tgt(\n\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\tdb.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t);\n\n\t\tconst result1 = await db\n\t\t\t.with(regionalSales, topRegions)\n\t\t\t.select({\n\t\t\t\tregion: orders.region,\n\t\t\t\tproduct: orders.product,\n\t\t\t\tproductUnits: sql<number>`sum(${orders.quantity})::int`,\n\t\t\t\tproductSales: sql<number>`sum(${orders.amount})::int`,\n\t\t\t})\n\t\t\t.from(orders)\n\t\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t\t.groupBy(orders.region, orders.product)\n\t\t\t.orderBy(orders.region, orders.product);\n\t\tconst result2 = await db\n\t\t\t.with(regionalSales, topRegions)\n\t\t\t.selectDistinct({\n\t\t\t\tregion: orders.region,\n\t\t\t\tproduct: orders.product,\n\t\t\t\tproductUnits: sql<number>`sum(${orders.quantity})::int`,\n\t\t\t\tproductSales: sql<number>`sum(${orders.amount})::int`,\n\t\t\t})\n\t\t\t.from(orders)\n\t\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t\t.groupBy(orders.region, orders.product)\n\t\t\t.orderBy(orders.region, orders.product);\n\t\tconst result3 = await db\n\t\t\t.with(regionalSales, topRegions)\n\t\t\t.selectDistinctOn([orders.region], {\n\t\t\t\tregion: orders.region,\n\t\t\t\tproductUnits: sql<number>`sum(${orders.quantity})::int`,\n\t\t\t\tproductSales: sql<number>`sum(${orders.amount})::int`,\n\t\t\t})\n\t\t\t.from(orders)\n\t\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t\t.groupBy(orders.region)\n\t\t\t.orderBy(orders.region);\n\n\t\texpect(result1).toEqual([\n\t\t\t{\n\t\t\t\tregion: 'Europe',\n\t\t\t\tproduct: 'A',\n\t\t\t\tproductUnits: 3,\n\t\t\t\tproductSales: 30,\n\t\t\t},\n\t\t\t{\n\t\t\t\tregion: 'Europe',\n\t\t\t\tproduct: 'B',\n\t\t\t\tproductUnits: 5,\n\t\t\t\tproductSales: 50,\n\t\t\t},\n\t\t\t{\n\t\t\t\tregion: 'US',\n\t\t\t\tproduct: 'A',\n\t\t\t\tproductUnits: 7,\n\t\t\t\tproductSales: 70,\n\t\t\t},\n\t\t\t{\n\t\t\t\tregion: 'US',\n\t\t\t\tproduct: 'B',\n\t\t\t\tproductUnits: 9,\n\t\t\t\tproductSales: 90,\n\t\t\t},\n\t\t]);\n\t\texpect(result2).toEqual(result1);\n\t\texpect(result3).toEqual([\n\t\t\t{\n\t\t\t\tregion: 'Europe',\n\t\t\t\tproductUnits: 8,\n\t\t\t\tproductSales: 80,\n\t\t\t},\n\t\t\t{\n\t\t\t\tregion: 'US',\n\t\t\t\tproductUnits: 16,\n\t\t\t\tproductSales: 160,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('with ... update', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst products = gelTable('products', {\n\t\t\tid1: integer('id1'),\n\t\t\tprice: decimal('price').notNull(),\n\t\t\tcheap: boolean('cheap').notNull().default(false),\n\t\t});\n\n\t\tawait db.insert(products).values([\n\t\t\t{ id1: 1, price: '10.99' },\n\t\t\t{ id1: 2, price: '25.85' },\n\t\t\t{ id1: 3, price: '32.99' },\n\t\t\t{ id1: 4, price: '2.50' },\n\t\t\t{ id1: 5, price: '4.59' },\n\t\t]);\n\n\t\tconst averagePrice = db.$with('average_price').as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tvalue: sql`avg(${products.price})`.as('value'),\n\t\t\t\t})\n\t\t\t\t.from(products),\n\t\t);\n\n\t\tconst result = await db\n\t\t\t.with(averagePrice)\n\t\t\t.update(products)\n\t\t\t.set({\n\t\t\t\tcheap: true,\n\t\t\t})\n\t\t\t.where(lt(products.price, sql`(select * from ${averagePrice})`))\n\t\t\t.returning({\n\t\t\t\tid1: products.id1,\n\t\t\t});\n\n\t\texpect(result).toEqual([{ id1: 1 }, { id1: 4 }, { id1: 5 }]);\n\t});\n\n\ttest('with ... insert', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = gelTable('users_with_insert', {\n\t\t\tusername: text('username').notNull(),\n\t\t\tadmin: boolean('admin').notNull(),\n\t\t});\n\n\t\tconst userCount = db.$with('user_count').as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tvalue: sql`count(*)`.as('value'),\n\t\t\t\t})\n\t\t\t\t.from(users),\n\t\t);\n\n\t\tconst result = await db\n\t\t\t.with(userCount)\n\t\t\t.insert(users)\n\t\t\t.values([{ username: 'user1', admin: sql`((select * from ${userCount}) = 0)` }])\n\t\t\t.returning({\n\t\t\t\tadmin: users.admin,\n\t\t\t});\n\n\t\texpect(result).toEqual([{ admin: true }]);\n\t});\n\n\ttest('with ... delete', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(orders).values([\n\t\t\t{ id1: 1, region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t\t{ id1: 2, region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t\t{ id1: 3, region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t\t{ id1: 4, region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t\t{ id1: 5, region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t\t{ id1: 6, region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t\t{ id1: 7, region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t\t{ id1: 8, region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t\t]);\n\n\t\tconst averageAmount = db.$with('average_amount').as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tvalue: sql`avg(${orders.amount})`.as('value'),\n\t\t\t\t})\n\t\t\t\t.from(orders),\n\t\t);\n\n\t\tconst result = await db\n\t\t\t.with(averageAmount)\n\t\t\t.delete(orders)\n\t\t\t.where(gt(orders.amount, sql`(select * from ${averageAmount})`))\n\t\t\t.returning({\n\t\t\t\tid1: orders.id1,\n\t\t\t});\n\n\t\texpect(result).toEqual([{ id1: 6 }, { id1: 7 }, { id1: 8 }]);\n\t});\n\n\ttest('select from subquery sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(users3Table).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t]);\n\n\t\tconst sq = db\n\t\t\t.select({ name: sql<string>`${users3Table.name} || ' modified'`.as('name') })\n\t\t\t.from(users3Table)\n\t\t\t.as('sq');\n\n\t\tconst res = await db.select({ name: sq.name }).from(sq);\n\n\t\texpect(res).toEqual([{ name: 'John modified' }, { name: 'Jane modified' }]);\n\t});\n\n\ttest('select a field without joining its table', (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\texpect(() => db.select({ name: users3Table.name }).from(usersTable).prepare('query')).toThrowError();\n\t});\n\n\ttest('select all fields from subquery without alias', (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst sq = db.$with('sq').as(db.select({ name: sql<string>`upper(${users3Table.name})` }).from(users3Table));\n\n\t\texpect(() => db.select().from(sq).prepare('query')).toThrowError();\n\t});\n\n\ttest('select count()', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t]);\n\n\t\tconst res = await db.select({ count: sql`count(*)` }).from(usersTable);\n\n\t\texpect(res).toEqual([{ count: 2 }]);\n\t});\n\n\ttest('select count w/ custom mapper', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tfunction count(value: GelColumn | SQLWrapper): SQL<number>;\n\t\tfunction count(value: GelColumn | SQLWrapper, alias: string): SQL.Aliased<number>;\n\t\tfunction count(value: GelColumn | SQLWrapper, alias?: string): SQL<number> | SQL.Aliased<number> {\n\t\t\tconst result = sql`count(${value})`.mapWith(Number);\n\t\t\tif (!alias) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn result.as(alias);\n\t\t}\n\n\t\tawait db.insert(usersTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t]);\n\n\t\tconst res = await db.select({ count: count(sql`*`) }).from(usersTable);\n\n\t\texpect(res).toEqual([{ count: 2 }]);\n\t});\n\n\ttest('array types', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst values: (typeof salEmp.$inferSelect)[] = [\n\t\t\t{\n\t\t\t\tname: 'John',\n\t\t\t\tpayByQuarter: [10000, 10000, 10000, 10000],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Carol',\n\t\t\t\tpayByQuarter: [20000, 25000, 25000, 25000],\n\t\t\t},\n\t\t];\n\n\t\tawait db.insert(salEmp).values(values);\n\n\t\tconst res = await db.select().from(salEmp);\n\n\t\texpect(res.map((it) => ({ ...it, id: undefined }))).toEqual(values);\n\t});\n\n\ttest('select for ...', (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\t{\n\t\t\tconst query = db.select().from(users3Table).for('update').toSQL();\n\n\t\t\texpect(query.sql).toMatch(/ for update$/);\n\t\t}\n\n\t\t{\n\t\t\tconst query = db\n\t\t\t\t.select()\n\t\t\t\t.from(users2Table)\n\t\t\t\t.for('update', { of: [users3Table, coursesTable] })\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query.sql).toMatch(/ for update of \"users3\", \"courses\"$/);\n\t\t}\n\n\t\t{\n\t\t\tconst query = db.select().from(users3Table).for('no key update', { of: users3Table }).toSQL();\n\n\t\t\texpect(query.sql).toMatch(/for no key update of \"users3\"$/);\n\t\t}\n\n\t\t{\n\t\t\tconst query = db.select().from(users3Table).for('no key update', { of: users3Table, skipLocked: true })\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query.sql).toMatch(/ for no key update of \"users3\" skip locked$/);\n\t\t}\n\n\t\t{\n\t\t\tconst query = db.select().from(users3Table).for('share', { of: users3Table, noWait: true }).toSQL();\n\n\t\t\texpect(query.sql).toMatch(/for share of \"users3\" nowait$/);\n\t\t}\n\t});\n\n\t// TODO\n\t// column \"rel~1.0e3b7152-d977-11ef-a173-530b4c6088b1\" must appear in the GROUP BY\n\ttest.todo('having', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(citiesTable).values([\n\t\t\t{ id1: 1, name: 'London' },\n\t\t\t{ id1: 2, name: 'Paris' },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'New York',\n\t\t\t},\n\t\t]);\n\n\t\tawait db.insert(users2Table).values([\n\t\t\t{ id1: 1, name: 'John', cityId: 1 },\n\t\t\t{ id1: 2, name: 'Jane', cityId: 1 },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Jack',\n\t\t\t\tcityId: 2,\n\t\t\t},\n\t\t]);\n\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tid1: citiesTable.id1,\n\t\t\t\tname: sql<string>`upper(${citiesTable.name})`.as('upper_name'),\n\t\t\t\tusersCount: sql<number>`count(${users2Table.id1})::int`.as('users_count'),\n\t\t\t})\n\t\t\t.from(citiesTable)\n\t\t\t.leftJoin(users2Table, eq(users2Table.cityId, citiesTable.id1))\n\t\t\t.where(({ name }) => sql`length(${name}) >= 3`)\n\t\t\t.groupBy(citiesTable.id1)\n\t\t\t.having(({ usersCount }) => sql`${usersCount} > 0`)\n\t\t\t.orderBy(({ name }) => name);\n\n\t\texpect(result).toEqual([\n\t\t\t{\n\t\t\t\tid1: 1,\n\t\t\t\tname: 'LONDON',\n\t\t\t\tusersCount: 2,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid1: 2,\n\t\t\t\tname: 'PARIS',\n\t\t\t\tusersCount: 1,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('select from raw sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tid: sql<number>`id`,\n\t\t\t\tname: sql<string>`name`,\n\t\t\t})\n\t\t\t.from(sql`(select 1 as id, 'John' as name) as users`);\n\n\t\tExpect<Equal<{ id: number; name: string }[], typeof result>>;\n\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t});\n\n\ttest('select from raw sql with joins', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tid: sql<number>`users.id`,\n\t\t\t\tname: sql<string>`users.name`,\n\t\t\t\tuserCity: sql<string>`users.city`,\n\t\t\t\tcityName: sql<string>`cities.name`,\n\t\t\t})\n\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, sql`cities.id = users.id`);\n\n\t\tExpect<Equal<{ id: number; name: string; userCity: string; cityName: string }[], typeof result>>;\n\n\t\texpect(result).toEqual([{ id: 1, name: 'John', userCity: 'New York', cityName: 'Paris' }]);\n\t});\n\n\ttest('join on aliased sql from select', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tuserId: sql<number>`users.id`.as('userId'),\n\t\t\t\tname: sql<string>`users.name`,\n\t\t\t\tuserCity: sql<string>`users.city`,\n\t\t\t\tcityId: sql<number>`cities.id`.as('cityId'),\n\t\t\t\tcityName: sql<string>`cities.name`,\n\t\t\t})\n\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, (cols) => eq(cols.cityId, cols.userId));\n\n\t\tExpect<\n\t\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t\t>;\n\n\t\texpect(result).toEqual([{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' }]);\n\t});\n\n\ttest('join on aliased sql from with clause', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = db.$with('users').as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tid: sql<number>`id`.as('userId'),\n\t\t\t\t\tname: sql<string>`name`.as('userName'),\n\t\t\t\t\tcity: sql<string>`city`.as('city'),\n\t\t\t\t})\n\t\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`),\n\t\t);\n\n\t\tconst cities = db.$with('cities').as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tid: sql<number>`id`.as('cityId'),\n\t\t\t\t\tname: sql<string>`name`.as('cityName'),\n\t\t\t\t})\n\t\t\t\t.from(sql`(select 1 as id, 'Paris' as name) as cities`),\n\t\t);\n\n\t\tconst result = await db\n\t\t\t.with(users, cities)\n\t\t\t.select({\n\t\t\t\tuserId: users.id,\n\t\t\t\tname: users.name,\n\t\t\t\tuserCity: users.city,\n\t\t\t\tcityId: cities.id,\n\t\t\t\tcityName: cities.name,\n\t\t\t})\n\t\t\t.from(users)\n\t\t\t.leftJoin(cities, (cols) => eq(cols.cityId, cols.userId));\n\n\t\tExpect<\n\t\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t\t>;\n\n\t\texpect(result).toEqual([{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' }]);\n\t});\n\n\ttest('prefixed table', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst gelTable = gelTableCreator((name) => `myprefix_${name}`);\n\n\t\tconst users = gelTable('test_prefixed_table_with_unique_name', {\n\t\t\tid1: integer('id1').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\tawait db.insert(users).values({ id1: 1, name: 'John' });\n\n\t\tconst result = await db.select().from(users);\n\n\t\texpect(result.map((it) => ({ ...it, id: undefined }))).toEqual([{ id1: 1, name: 'John' }]);\n\t});\n\n\ttest('all date and time columns', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst table = gelTable('dates_column', {\n\t\t\tdatetimeColumn: timestamptz().notNull(),\n\t\t\tlocal_datetimeColumn: timestamp().notNull(),\n\t\t\tlocal_dateColumn: localDate().notNull(),\n\t\t\tlocal_timeColumn: localTime().notNull(),\n\n\t\t\tdurationColumn: duration().notNull(),\n\t\t\trelative_durationColumn: relDuration().notNull(),\n\t\t\tdateDurationColumn: dateDuration().notNull(),\n\t\t});\n\n\t\tawait db.insert(table).values({\n\t\t\tdatetimeColumn: new Date('2022-01-01T00:00:00.123Z'),\n\t\t\tlocal_datetimeColumn: new LocalDateTime(2014, 2, 1, 4, 1, 6, 2, 0, 0),\n\t\t\tlocal_dateColumn: new LocalDate(2013, 2, 1),\n\t\t\tlocal_timeColumn: new LocalTime(12, 42, 2, 3, 1, 0),\n\t\t\tdurationColumn: new Duration(0, 0, 0, 0, 12, 3, 0, 0, 1, 3),\n\t\t\trelative_durationColumn: new RelativeDuration(2014, 2, 1, 4, 1, 6, 2, 0, 0),\n\t\t\tdateDurationColumn: new DateDuration(2032, 2, 1, 5),\n\t\t});\n\n\t\tconst result = await db.select().from(table);\n\n\t\tExpect<\n\t\t\tEqual<\n\t\t\t\t{\n\t\t\t\t\tdatetimeColumn: Date;\n\t\t\t\t\tlocal_datetimeColumn: LocalDateTime;\n\t\t\t\t\tlocal_dateColumn: LocalDate;\n\t\t\t\t\tlocal_timeColumn: LocalTime;\n\t\t\t\t\tdurationColumn: Duration;\n\t\t\t\t\trelative_durationColumn: RelativeDuration;\n\t\t\t\t\tdateDurationColumn: DateDuration;\n\t\t\t\t}[],\n\t\t\t\ttypeof result\n\t\t\t>\n\t\t>;\n\n\t\tExpect<\n\t\t\tEqual<\n\t\t\t\t{\n\t\t\t\t\tdatetimeColumn: Date;\n\t\t\t\t\tlocal_datetimeColumn: LocalDateTime;\n\t\t\t\t\tlocal_dateColumn: LocalDate;\n\t\t\t\t\tlocal_timeColumn: LocalTime;\n\t\t\t\t\tdurationColumn: Duration;\n\t\t\t\t\trelative_durationColumn: RelativeDuration;\n\t\t\t\t\tdateDurationColumn: DateDuration;\n\t\t\t\t},\n\t\t\t\ttypeof table.$inferInsert\n\t\t\t>\n\t\t>;\n\t});\n\n\ttest('orderBy with aliased column', (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst query = db\n\t\t\t.select({\n\t\t\t\ttest: sql`something`.as('test'),\n\t\t\t})\n\t\t\t.from(users3Table)\n\t\t\t.orderBy((fields) => fields.test)\n\t\t\t.toSQL();\n\n\t\texpect(query.sql).toBe('select something as \"test\" from \"users3\" order by \"test\"');\n\t});\n\n\ttest('select from sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst metricEntry = gelTable('metric_entry', {\n\t\t\tid1: gelUuid('id1').notNull(),\n\t\t\tcreatedAt: timestamptz('created_at').notNull(),\n\t\t});\n\n\t\tconst metricId = uuidV4();\n\n\t\tconst intervals = db.$with('intervals').as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tstartTime: sql<string>`(date'2023-03-01'+ x * '1 day'::interval)`.as('start_time'),\n\t\t\t\t\tendTime: sql<string>`(date'2023-03-01'+ (x+1) *'1 day'::interval)`.as('end_time'),\n\t\t\t\t})\n\t\t\t\t.from(sql`generate_series(0, 29, 1) as t(x)`),\n\t\t);\n\n\t\tconst func = () =>\n\t\t\tdb\n\t\t\t\t.with(intervals)\n\t\t\t\t.select({\n\t\t\t\t\tstartTime: intervals.startTime,\n\t\t\t\t\tendTime: intervals.endTime,\n\t\t\t\t\tcount: sql<number>`count(${metricEntry})`,\n\t\t\t\t})\n\t\t\t\t.from(metricEntry)\n\t\t\t\t.rightJoin(\n\t\t\t\t\tintervals,\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(metricEntry.id1, metricId),\n\t\t\t\t\t\tgte(metricEntry.createdAt, intervals.startTime),\n\t\t\t\t\t\tlt(metricEntry.createdAt, intervals.endTime),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.groupBy(intervals.startTime, intervals.endTime)\n\t\t\t\t.orderBy(asc(intervals.startTime));\n\n\t\tawait expect(\n\t\t\t(async () => {\n\t\t\t\tfunc();\n\t\t\t})(),\n\t\t).resolves.not.toThrowError();\n\t});\n\n\ttest('transaction', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = gelTable('users_transactions', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tbalance: integer('balance').notNull(),\n\t\t});\n\t\tconst products = gelTable('products_transactions', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tprice: integer('price').notNull(),\n\t\t\tstock: integer('stock').notNull(),\n\t\t});\n\n\t\tconst user = await db\n\t\t\t.insert(users)\n\t\t\t.values({ id1: 1, balance: 100 })\n\t\t\t.returning()\n\t\t\t.then((rows) => rows[0]!);\n\t\tconst product = await db\n\t\t\t.insert(products)\n\t\t\t.values({ id1: 1, price: 10, stock: 10 })\n\t\t\t.returning()\n\t\t\t.then((rows) => rows[0]!);\n\n\t\tawait db.transaction(async (tx) => {\n\t\t\tawait tx\n\t\t\t\t.update(users)\n\t\t\t\t.set({ balance: user.balance - product.price })\n\t\t\t\t.where(eq(users.id1, user.id1));\n\t\t\tawait tx\n\t\t\t\t.update(products)\n\t\t\t\t.set({ stock: product.stock - 1 })\n\t\t\t\t.where(eq(products.id1, product.id1));\n\t\t});\n\n\t\tconst result = await db.select().from(users);\n\n\t\texpect(result).toEqual([{ id1: 1, balance: 90 }]);\n\t});\n\n\ttest('transaction rollback', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = gelTable('users_transactions_rollback', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tbalance: integer('balance').notNull(),\n\t\t});\n\n\t\tawait expect(\n\t\t\t(async () => {\n\t\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\t\tawait tx.insert(users).values({ id1: 1, balance: 100 });\n\t\t\t\t\ttx.rollback();\n\t\t\t\t});\n\t\t\t})(),\n\t\t).rejects.toThrowError(Error);\n\n\t\tconst result = await db.select().from(users);\n\n\t\texpect(result).toEqual([]);\n\t});\n\n\ttest('join subquery with join', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst internalStaff = gelTable('internal_staff', {\n\t\t\tuserId: integer('userId').notNull(),\n\t\t});\n\n\t\tconst customUser = gelTable('custom_user', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t});\n\n\t\tconst ticket = gelTable('ticket', {\n\t\t\tstaffId: integer('staffId').notNull(),\n\t\t});\n\n\t\tawait db.insert(internalStaff).values({ userId: 1 });\n\t\tawait db.insert(customUser).values({ id1: 1 });\n\t\tawait db.insert(ticket).values({ staffId: 1 });\n\n\t\tconst subq = db.select().from(internalStaff).leftJoin(customUser, eq(internalStaff.userId, customUser.id1)).as(\n\t\t\t'internal_staff',\n\t\t);\n\n\t\tconst mainQuery = await db.select().from(ticket).leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId));\n\n\t\texpect(mainQuery).toEqual([\n\t\t\t{\n\t\t\t\tticket: { staffId: 1 },\n\t\t\t\tinternal_staff: {\n\t\t\t\t\tinternal_staff: { userId: 1 },\n\t\t\t\t\tcustom_user: { id1: 1 },\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('table selection with single table', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = gelTable('users_with_cities', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t\tcityId: integer('cityId').notNull(),\n\t\t});\n\n\t\tawait db.insert(users).values({ id1: 1, name: 'John', cityId: 1 });\n\n\t\tconst result = await db.select({ users }).from(users);\n\n\t\texpect(result).toEqual([{ users: { id1: 1, name: 'John', cityId: 1 } }]);\n\t});\n\n\ttest('set null to json field', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst result = await db.insert(usersTable).values({ id1: 1, name: 'Alex', json: null }).returning();\n\n\t\texpect(result.map((it) => ({ ...it, verified: undefined, createdAt: undefined }))).toEqual([\n\t\t\t{\n\t\t\t\tid1: 1,\n\t\t\t\tname: 'Alex',\n\t\t\t\tjson: null,\n\t\t\t\tverified: undefined,\n\t\t\t\tcreatedAt: undefined,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('insert undefined', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = gelTable('users_with_undefined', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name'),\n\t\t});\n\n\t\tawait expect(\n\t\t\t(async () => {\n\t\t\t\tawait db.insert(users).values({ id1: 1, name: undefined });\n\t\t\t})(),\n\t\t).resolves.not.toThrowError();\n\t});\n\n\ttest('update undefined', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = gelTable('users', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name'),\n\t\t});\n\n\t\tawait expect(\n\t\t\t(async () => {\n\t\t\t\tawait db.update(users).set({ name: undefined });\n\t\t\t})(),\n\t\t).rejects.toThrowError();\n\t\tawait expect(\n\t\t\t(async () => {\n\t\t\t\tdb.update(users).set({ name: undefined });\n\t\t\t})(),\n\t\t).rejects.toThrowError();\n\t});\n\n\ttest('array operators', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst posts = gelTable('posts', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\ttags: text('tags').array(),\n\t\t});\n\n\t\tawait db.insert(posts).values([\n\t\t\t{\n\t\t\t\tid1: 1,\n\t\t\t\ttags: ['ORM'],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid1: 2,\n\t\t\t\ttags: ['Typescript'],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\ttags: ['Typescript', 'ORM'],\n\t\t\t},\n\t\t\t{ id1: 4, tags: ['Typescript', 'Frontend', 'React'] },\n\t\t\t{\n\t\t\t\tid1: 5,\n\t\t\t\ttags: ['Typescript', 'ORM', 'Database', 'Postgres'],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid1: 6,\n\t\t\t\ttags: ['Java', 'Spring', 'OOP'],\n\t\t\t},\n\t\t]);\n\n\t\tconst contains = await db\n\t\t\t.select({ id1: posts.id1 })\n\t\t\t.from(posts)\n\t\t\t.where(arrayContains(posts.tags, ['Typescript', 'ORM']));\n\t\tconst contained = await db\n\t\t\t.select({ id1: posts.id1 })\n\t\t\t.from(posts)\n\t\t\t.where(arrayContained(posts.tags, ['Typescript', 'ORM']));\n\t\tconst overlaps = await db\n\t\t\t.select({ id1: posts.id1 })\n\t\t\t.from(posts)\n\t\t\t.where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']));\n\t\tconst withSubQuery = await db\n\t\t\t.select({ id1: posts.id1 })\n\t\t\t.from(posts)\n\t\t\t.where(arrayContains(posts.tags, db.select({ tags: posts.tags }).from(posts).where(eq(posts.id1, 1))));\n\n\t\texpect(contains).toEqual([{ id1: 3 }, { id1: 5 }]);\n\t\texpect(contained).toEqual([{ id1: 1 }, { id1: 2 }, { id1: 3 }]);\n\t\texpect(overlaps).toEqual([{ id1: 1 }, { id1: 2 }, { id1: 3 }, { id1: 4 }, { id1: 5 }]);\n\t\texpect(withSubQuery).toEqual([{ id1: 1 }, { id1: 3 }, { id1: 5 }]);\n\t});\n\n\ttest('set operations (union) from query builder with subquery', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\n\t\tconst sq = db\n\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t.from(users2Table).as('sq');\n\n\t\tconst result = await db\n\t\t\t.select({ id: cities2Table.id1, name: citiesTable.name })\n\t\t\t.from(cities2Table).union(\n\t\t\t\tdb.select().from(sq),\n\t\t\t).orderBy(asc(sql`name`)).limit(2).offset(1);\n\n\t\texpect(result).toHaveLength(2);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id: 3, name: 'Jack' },\n\t\t\t{ id: 2, name: 'Jane' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\tdb\n\t\t\t\t.select({ id: cities2Table.id1, name: citiesTable.name, name2: users2Table.name })\n\t\t\t\t.from(cities2Table).union(\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table),\n\t\t\t\t).orderBy(asc(sql`name`));\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('set operations (union) as function', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\n\t\tconst result = await union(\n\t\t\tdb\n\t\t\t\t.select({ id: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).where(eq(citiesTable.id1, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t).orderBy(asc(sql`name`)).limit(1).offset(1);\n\n\t\texpect(result).toHaveLength(1);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'New York' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\tunion(\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: citiesTable.name, id: cities2Table.id1 })\n\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id1, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\t).orderBy(asc(sql`name`));\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('set operations (union all) from query builder', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\n\t\tconst result = await db\n\t\t\t.select({ id1: cities2Table.id1, name: citiesTable.name })\n\t\t\t.from(cities2Table).limit(2).unionAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id1: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).limit(2),\n\t\t\t).orderBy(asc(sql`id1`));\n\n\t\texpect(result).toHaveLength(4);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id1: 1, name: 'New York' },\n\t\t\t{ id1: 1, name: 'New York' },\n\t\t\t{ id1: 2, name: 'London' },\n\t\t\t{ id1: 2, name: 'London' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\tdb\n\t\t\t\t.select({ id1: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).limit(2).unionAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: citiesTable.name, id1: cities2Table.id1 })\n\t\t\t\t\t\t.from(cities2Table).limit(2),\n\t\t\t\t).orderBy(asc(sql`id1`));\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('set operations (union all) as function', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\n\t\tconst result = await unionAll(\n\t\t\tdb\n\t\t\t\t.select({ id: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).where(eq(citiesTable.id1, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t);\n\n\t\texpect(result).toHaveLength(3);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'New York' },\n\t\t\t{ id: 1, name: 'John' },\n\t\t\t{ id: 1, name: 'John' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\tunionAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id1, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id1 })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\t);\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('set operations (intersect) from query builder', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\n\t\tconst result = await db\n\t\t\t.select({ id: cities2Table.id1, name: citiesTable.name })\n\t\t\t.from(cities2Table).intersect(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).where(gt(citiesTable.id1, 1)),\n\t\t\t).orderBy(asc(sql`name`));\n\n\t\texpect(result).toHaveLength(2);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id: 2, name: 'London' },\n\t\t\t{ id: 3, name: 'Tampa' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\tdb\n\t\t\t\t.select({ id: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).intersect(\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: cities2Table.id1, name: citiesTable.name, id2: cities2Table.id1 })\n\t\t\t\t\t\t.from(cities2Table).where(gt(citiesTable.id1, 1)),\n\t\t\t\t).orderBy(asc(sql`name`));\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('set operations (intersect) as function', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\n\t\tconst result = await intersect(\n\t\t\tdb\n\t\t\t\t.select({ id: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).where(eq(citiesTable.id1, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t);\n\n\t\texpect(result).toHaveLength(0);\n\n\t\texpect(result).toEqual([]);\n\n\t\tawait expect((async () => {\n\t\t\tintersect(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id1, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id1 })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\t);\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('set operations (intersect all) from query builder', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\n\t\tconst result = await db\n\t\t\t.select({ id1: cities2Table.id1, name: citiesTable.name })\n\t\t\t.from(cities2Table).limit(2).intersectAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id1: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).limit(2),\n\t\t\t).orderBy(asc(sql`id1`));\n\n\t\texpect(result).toHaveLength(2);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id1: 1, name: 'New York' },\n\t\t\t{ id1: 2, name: 'London' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\tdb\n\t\t\t\t.select({ id: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).limit(2).intersectAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id1 })\n\t\t\t\t\t\t.from(cities2Table).limit(2),\n\t\t\t\t).orderBy(asc(sql`id`));\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('set operations (intersect all) as function', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\n\t\tconst result = await intersectAll(\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t);\n\n\t\texpect(result).toHaveLength(1);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\tintersectAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id1 })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\t);\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('set operations (except) from query builder', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\n\t\tconst result = await db\n\t\t\t.select()\n\t\t\t.from(cities2Table).except(\n\t\t\t\tdb\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(cities2Table).where(gt(citiesTable.id1, 1)),\n\t\t\t);\n\n\t\texpect(result).toHaveLength(1);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id1: 1, name: 'New York' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\tdb\n\t\t\t\t.select()\n\t\t\t\t.from(cities2Table).except(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id1: users2Table.id1 })\n\t\t\t\t\t\t.from(cities2Table).where(gt(citiesTable.id1, 1)),\n\t\t\t\t);\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('set operations (except) as function', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\n\t\tconst result = await except(\n\t\t\tdb\n\t\t\t\t.select({ id1: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t.from(cities2Table),\n\t\t\tdb\n\t\t\t\t.select({ id1: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).where(eq(citiesTable.id1, 1)),\n\t\t\tdb\n\t\t\t\t.select({ id1: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t).orderBy(asc(sql`id1`));\n\n\t\texpect(result).toHaveLength(2);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id1: 2, name: 'London' },\n\t\t\t{ id1: 3, name: 'Tampa' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\texcept(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id1: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table),\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: users2Table.name, id1: users2Table.id1 })\n\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id1, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id1: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\t).orderBy(asc(sql`id1`));\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('set operations (except all) from query builder', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\n\t\tconst result = await db\n\t\t\t.select()\n\t\t\t.from(cities2Table).exceptAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id1: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id1, 1)),\n\t\t\t).orderBy(asc(sql`id1`));\n\n\t\texpect(result).toHaveLength(2);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id1: 2, name: 'London' },\n\t\t\t{ id1: 3, name: 'Tampa' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\tdb\n\t\t\t\t.select({ name: cities2Table.name, id1: cities2Table.id1 })\n\t\t\t\t.from(cities2Table).exceptAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id1: cities2Table.id1, name: citiesTable.name })\n\t\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id1, 1)),\n\t\t\t\t).orderBy(asc(sql`id1`));\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('set operations (except all) as function', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\n\t\tconst result = await exceptAll(\n\t\t\tdb\n\t\t\t\t.select({ id1: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table),\n\t\t\tdb\n\t\t\t\t.select({ id1: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(gt(users2Table.id1, 7)),\n\t\t\tdb\n\t\t\t\t.select({ id1: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t).orderBy(asc(sql`id1`)).limit(5).offset(2);\n\n\t\texpect(result).toHaveLength(4);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id1: 4, name: 'Peter' },\n\t\t\t{ id1: 5, name: 'Ben' },\n\t\t\t{ id1: 6, name: 'Jill' },\n\t\t\t{ id1: 7, name: 'Mary' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\texceptAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id1 })\n\t\t\t\t\t.from(users2Table),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(gt(users2Table.id1, 7)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\t).orderBy(asc(sql`id`));\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('set operations (mixed) from query builder with subquery', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\t\tconst sq = db\n\t\t\t.select()\n\t\t\t.from(cities2Table).where(gt(citiesTable.id1, 1)).as('sq');\n\n\t\tconst result = await db\n\t\t\t.select()\n\t\t\t.from(cities2Table).except(\n\t\t\t\t({ unionAll }) =>\n\t\t\t\t\tunionAll(\n\t\t\t\t\t\tdb.select().from(sq),\n\t\t\t\t\t\tdb.select().from(cities2Table).where(eq(citiesTable.id1, 2)),\n\t\t\t\t\t),\n\t\t\t);\n\n\t\texpect(result).toHaveLength(1);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id1: 1, name: 'New York' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\tdb\n\t\t\t\t.select()\n\t\t\t\t.from(cities2Table).except(\n\t\t\t\t\t({ unionAll }) =>\n\t\t\t\t\t\tunionAll(\n\t\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t\t.select({ name: cities2Table.name, id1: cities2Table.id1 })\n\t\t\t\t\t\t\t\t.from(cities2Table).where(gt(citiesTable.id1, 1)),\n\t\t\t\t\t\t\tdb.select().from(cities2Table).where(eq(citiesTable.id1, 2)),\n\t\t\t\t\t\t),\n\t\t\t\t);\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('set operations (mixed all) as function', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait setupSetOperationTest(db);\n\n\t\tconst result = await union(\n\t\t\tdb\n\t\t\t\t.select({ id1: users2Table.id1, name: users2Table.name })\n\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\texcept(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id1: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(gte(users2Table.id1, 5)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id1: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 7)),\n\t\t\t),\n\t\t\tdb\n\t\t\t\t.select().from(cities2Table).where(gt(citiesTable.id1, 1)),\n\t\t).orderBy(asc(sql`id1`));\n\n\t\texpect(result).toHaveLength(6);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'London' },\n\t\t\t{ id1: 3, name: 'Tampa' },\n\t\t\t{ id1: 5, name: 'Ben' },\n\t\t\t{ id1: 6, name: 'Jill' },\n\t\t\t{ id1: 8, name: 'Sally' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\tunion(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id1: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 1)),\n\t\t\t\texcept(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id1: users2Table.id1, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(gte(users2Table.id1, 5)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id1: users2Table.id1 })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id1, 7)),\n\t\t\t\t),\n\t\t\t\tdb\n\t\t\t\t\t.select().from(cities2Table).where(gt(citiesTable.id1, 1)),\n\t\t\t).orderBy(asc(sql`id`));\n\t\t})()).rejects.toThrowError();\n\t});\n\ttest('aggregate function: count', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\t\tconst table = aggregateTable;\n\t\tawait setupAggregateFunctionsTest(db);\n\n\t\tconst result1 = await db.select({ value: count() }).from(table);\n\t\tconst result2 = await db.select({ value: count(table.a) }).from(table);\n\t\tconst result3 = await db.select({ value: countDistinct(table.name) }).from(table);\n\n\t\texpect(result1[0]?.value).toBe(7);\n\t\texpect(result2[0]?.value).toBe(5);\n\t\texpect(result3[0]?.value).toBe(6);\n\t});\n\n\ttest('aggregate function: avg', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\t\tconst table = aggregateTable;\n\t\tawait setupAggregateFunctionsTest(db);\n\n\t\tconst result1 = await db.select({ value: avg(table.b) }).from(table);\n\t\tconst result2 = await db.select({ value: avg(table.nullOnly) }).from(table);\n\t\tconst result3 = await db.select({ value: avgDistinct(table.b) }).from(table);\n\n\t\texpect(result1[0]?.value).toBe('33.3333333333333333');\n\t\texpect(result2[0]?.value).toBeNull();\n\t\texpect(result3[0]?.value).toBe('42.5000000000000000');\n\t});\n\n\ttest('aggregate function: sum', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\t\tconst table = aggregateTable;\n\t\tawait setupAggregateFunctionsTest(db);\n\n\t\tconst result1 = await db.select({ value: sum(table.b) }).from(table);\n\t\tconst result2 = await db.select({ value: sum(table.nullOnly) }).from(table);\n\t\tconst result3 = await db.select({ value: sumDistinct(table.b) }).from(table);\n\n\t\texpect(result1[0]?.value).toBe('200');\n\t\texpect(result2[0]?.value).toBeNull();\n\t\texpect(result3[0]?.value).toBe('170');\n\t});\n\n\ttest('aggregate function: max', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\t\tconst table = aggregateTable;\n\t\tawait setupAggregateFunctionsTest(db);\n\n\t\tconst result1 = await db.select({ value: max(table.b) }).from(table);\n\t\tconst result2 = await db.select({ value: max(table.nullOnly) }).from(table);\n\n\t\texpect(result1[0]?.value).toBe(90);\n\t\texpect(result2[0]?.value).toBeNull();\n\t});\n\n\ttest('aggregate function: min', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\t\tconst table = aggregateTable;\n\t\tawait setupAggregateFunctionsTest(db);\n\n\t\tconst result1 = await db.select({ value: min(table.b) }).from(table);\n\t\tconst result2 = await db.select({ value: min(table.nullOnly) }).from(table);\n\n\t\texpect(result1[0]?.value).toBe(10);\n\t\texpect(result2[0]?.value).toBeNull();\n\t});\n\n\ttest('array mapping and parsing', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst arrays = gelTable('arrays_tests', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\ttags: text('tags').array(),\n\t\t\tnumbers: integer('numbers').notNull().array(),\n\t\t});\n\n\t\tawait db.insert(arrays).values({\n\t\t\tid1: 1,\n\t\t\ttags: ['', 'b', 'c'],\n\t\t\tnumbers: [1, 2, 3],\n\t\t});\n\n\t\tconst result = await db.select().from(arrays);\n\n\t\texpect(result).toEqual([\n\t\t\t{\n\t\t\t\tid1: 1,\n\t\t\t\ttags: ['', 'b', 'c'],\n\t\t\t\tnumbers: [1, 2, 3],\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('test $onUpdateFn and $onUpdate works as $default', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersOnUpdate).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Jack',\n\t\t\t},\n\t\t\t{ id1: 4, name: 'Jill' },\n\t\t]);\n\n\t\t// const { updatedAt, ..._ } = getTableColumns(usersOnUpdate);\n\n\t\t// const justDates = await db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id1));\n\n\t\tconst response = await db.select(getTableColumns(usersOnUpdate)).from(usersOnUpdate).orderBy(\n\t\t\tasc(usersOnUpdate.id1),\n\t\t);\n\n\t\texpect(response.map((it) => ({ ...it, updatedAt: undefined }))).toEqual([\n\t\t\t{ name: 'John', id1: 1, updateCounter: 1, alwaysNull: null, updatedAt: undefined },\n\t\t\t{ name: 'Jane', id1: 2, updateCounter: 1, alwaysNull: null, updatedAt: undefined },\n\t\t\t{ name: 'Jack', id1: 3, updateCounter: 1, alwaysNull: null, updatedAt: undefined },\n\t\t\t{ name: 'Jill', id1: 4, updateCounter: 1, alwaysNull: null, updatedAt: undefined },\n\t\t]);\n\n\t\t// const msDelay = 250;\n\n\t\t// for (const eachUser of justDates) {\n\t\t// \texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t\t// }\n\t});\n\n\ttest('test $onUpdateFn and $onUpdate works updating', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersOnUpdate).values([\n\t\t\t{ id1: 1, name: 'John', alwaysNull: 'this will be null after updating' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t\t{ id1: 3, name: 'Jack' },\n\t\t\t{ id1: 4, name: 'Jill' },\n\t\t]);\n\n\t\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\t\tawait db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id1));\n\n\t\tawait db.update(usersOnUpdate).set({ name: 'Angel' }).where(eq(usersOnUpdate.id1, 1));\n\t\tawait db.update(usersOnUpdate).set({ updateCounter: null }).where(eq(usersOnUpdate.id1, 2));\n\n\t\t// const justDates = await db.select({ updatedAt: usersOnUpdate.updatedAt }).from(usersOnUpdate).orderBy(\n\t\t// \tasc(usersOnUpdate.id1),\n\t\t// );\n\n\t\tconst response = await db.select({ ...rest }).from(usersOnUpdate).orderBy(\n\t\t\tasc(usersOnUpdate.id1),\n\t\t);\n\n\t\texpect(response).toEqual([\n\t\t\t{ name: 'Angel', id1: 1, updateCounter: 2, alwaysNull: null },\n\t\t\t{ name: 'Jane', id1: 2, updateCounter: null, alwaysNull: null },\n\t\t\t{ name: 'Jack', id1: 3, updateCounter: 1, alwaysNull: null },\n\t\t\t{ name: 'Jill', id1: 4, updateCounter: 1, alwaysNull: null },\n\t\t]);\n\t\t// const msDelay = 500;\n\n\t\t// for (const eachUser of justDates) {\n\t\t// \texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t\t// }\n\t});\n\n\ttest('test if method with sql operators', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = gelTable('users_with_age', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t\tage: integer('age').notNull(),\n\t\t\tcity: text('city').notNull(),\n\t\t});\n\n\t\tawait db.insert(users).values([\n\t\t\t{ id1: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t{ id1: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t{ id1: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t{ id1: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t]);\n\n\t\tconst condition1 = true;\n\n\t\tconst [result1] = await db.select().from(users).where(eq(users.id1, 1).if(condition1));\n\n\t\texpect({ ...result1, id: undefined }).toEqual({\n\t\t\tid1: 1,\n\t\t\tname: 'John',\n\t\t\tage: 20,\n\t\t\tcity: 'New York',\n\t\t});\n\n\t\tconst condition2 = 1;\n\n\t\tconst [result2] = await db\n\t\t\t.select()\n\t\t\t.from(users)\n\t\t\t.where(sql`${users.id1} = 1`.if(condition2));\n\n\t\texpect({ ...result2, id: undefined }).toEqual({ id1: 1, name: 'John', age: 20, city: 'New York' });\n\n\t\tconst condition3 = 'non-empty string';\n\n\t\tconst result3 = await db\n\t\t\t.select()\n\t\t\t.from(users)\n\t\t\t.where(or(eq(users.id1, 1).if(condition3), eq(users.id1, 2).if(condition3)));\n\n\t\texpect(result3.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{ id1: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t{\n\t\t\t\tid1: 2,\n\t\t\t\tname: 'Alice',\n\t\t\t\tage: 21,\n\t\t\t\tcity: 'New York',\n\t\t\t},\n\t\t]);\n\n\t\tconst condtition4 = false;\n\n\t\tconst result4 = await db.select().from(users).where(eq(users.id1, 1).if(condtition4));\n\n\t\texpect(result4.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{ id1: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t{ id1: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t{ id1: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t{ id1: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t]);\n\n\t\tconst condition5 = undefined;\n\n\t\tconst result5 = await db\n\t\t\t.select()\n\t\t\t.from(users)\n\t\t\t.where(sql`${users.id1} = 1`.if(condition5));\n\n\t\texpect(result5.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{ id1: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t{ id1: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t{ id1: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t{ id1: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t]);\n\n\t\tconst condition6 = null;\n\n\t\tconst result6 = await db\n\t\t\t.select()\n\t\t\t.from(users)\n\t\t\t.where(or(eq(users.id1, 1).if(condition6), eq(users.id1, 2).if(condition6)));\n\n\t\texpect(result6.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{ id1: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t{ id1: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t{ id1: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t{ id1: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t]);\n\n\t\tconst condition7 = {\n\t\t\tterm1: 0,\n\t\t\tterm2: 1,\n\t\t};\n\n\t\tconst result7 = await db\n\t\t\t.select()\n\t\t\t.from(users)\n\t\t\t.where(and(gt(users.age, 20).if(condition7.term1), eq(users.city, 'New York').if(condition7.term2)));\n\n\t\texpect(result7.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{ id1: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t{ id1: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t]);\n\n\t\tconst condition8 = {\n\t\t\tterm1: '',\n\t\t\tterm2: 'non-empty string',\n\t\t};\n\n\t\tconst result8 = await db\n\t\t\t.select()\n\t\t\t.from(users)\n\t\t\t.where(or(lt(users.age, 21).if(condition8.term1), eq(users.city, 'London').if(condition8.term2)));\n\n\t\texpect(result8.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{ id1: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t{ id1: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t]);\n\n\t\tconst condition9 = {\n\t\t\tterm1: 1,\n\t\t\tterm2: true,\n\t\t};\n\n\t\tconst result9 = await db\n\t\t\t.select()\n\t\t\t.from(users)\n\t\t\t.where(\n\t\t\t\tand(\n\t\t\t\t\tinArray(users.city, ['New York', 'London']).if(condition9.term1),\n\t\t\t\t\tilike(users.name, 'a%').if(condition9.term2),\n\t\t\t\t),\n\t\t\t);\n\n\t\texpect(result9.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{\n\t\t\t\tid1: 2,\n\t\t\t\tname: 'Alice',\n\t\t\t\tage: 21,\n\t\t\t\tcity: 'New York',\n\t\t\t},\n\t\t]);\n\n\t\tconst condition10 = {\n\t\t\tterm1: 4,\n\t\t\tterm2: 19,\n\t\t};\n\n\t\tconst result10 = await db\n\t\t\t.select()\n\t\t\t.from(users)\n\t\t\t.where(\n\t\t\t\tand(\n\t\t\t\t\tsql`length(${users.name}) <= ${condition10.term1}`.if(condition10.term1),\n\t\t\t\t\tgt(users.age, condition10.term2).if(condition10.term2 > 20),\n\t\t\t\t),\n\t\t\t);\n\n\t\texpect(result10.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{ id1: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t{ id1: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t{ id1: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t]);\n\n\t\tconst condition11 = true;\n\n\t\tconst result11 = await db\n\t\t\t.select()\n\t\t\t.from(users)\n\t\t\t.where(or(eq(users.city, 'New York'), gte(users.age, 22))!.if(condition11));\n\n\t\texpect(result11.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{ id1: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t{ id1: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t{ id1: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t{ id1: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t]);\n\n\t\tconst condition12 = false;\n\n\t\tconst result12 = await db\n\t\t\t.select()\n\t\t\t.from(users)\n\t\t\t.where(and(eq(users.city, 'London'), gte(users.age, 23))!.if(condition12));\n\n\t\texpect(result12.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{ id1: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t{ id1: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t{ id1: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t{ id1: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t]);\n\n\t\tconst condition13 = true;\n\n\t\tconst result13 = await db\n\t\t\t.select()\n\t\t\t.from(users)\n\t\t\t.where(sql`(city = 'New York' or age >= 22)`.if(condition13));\n\n\t\texpect(result13.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{ id1: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t{ id1: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t{ id1: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t{ id1: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t]);\n\n\t\tconst condition14 = false;\n\n\t\tconst result14 = await db\n\t\t\t.select()\n\t\t\t.from(users)\n\t\t\t.where(sql`(city = 'London' and age >= 23)`.if(condition14));\n\n\t\texpect(result14.map((it) => ({ ...it, id: undefined }))).toEqual([\n\t\t\t{ id1: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t{ id1: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t{ id1: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t{ id1: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t]);\n\t});\n\n\t// MySchema tests\n\ttest('mySchema :: select all fields', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst now = Date.now();\n\n\t\tawait db.insert(usersMySchemaTable).values({ id1: 1, name: 'John' });\n\t\tconst result = await db.select().from(usersMySchemaTable);\n\n\t\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t\texpect(Math.abs(result[0]!.createdAt.getTime() - now)).toBeLessThan(500);\n\t\texpect(result).toEqual([\n\t\t\t{\n\t\t\t\tid1: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tverified: false,\n\t\t\t\tjson: null,\n\t\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('mySchema :: select sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersMySchemaTable).values({ id1: 1, name: 'John' });\n\t\tconst users = await db\n\t\t\t.select({\n\t\t\t\tname: sql`upper(${usersMySchemaTable.name})`,\n\t\t\t})\n\t\t\t.from(usersMySchemaTable);\n\n\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t});\n\n\ttest('mySchema :: select typed sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersMySchemaTable).values({ id1: 1, name: 'John' });\n\t\tconst users = await db\n\t\t\t.select({\n\t\t\t\tname: sql<string>`upper(${usersMySchemaTable.name})`,\n\t\t\t})\n\t\t\t.from(usersMySchemaTable);\n\n\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t});\n\n\ttest('mySchema :: select distinct', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersMySchemaTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'John' },\n\t\t\t{ id1: 1, name: 'Jane' },\n\t\t]);\n\t\tconst users1 = await db.selectDistinct().from(usersMySchemaTable).orderBy(\n\t\t\tusersMySchemaTable.id1,\n\t\t\tusersMySchemaTable.name,\n\t\t);\n\t\tconst users2 = await db.selectDistinctOn([usersMySchemaTable.id1]).from(usersMySchemaTable).orderBy(\n\t\t\tusersMySchemaTable.id1,\n\t\t);\n\t\tconst users3 = await db.selectDistinctOn([usersMySchemaTable.name], { name: usersMySchemaTable.name }).from(\n\t\t\tusersMySchemaTable,\n\t\t).orderBy(usersMySchemaTable.name);\n\n\t\texpect(users1.map((it) => ({ ...it, id: undefined, createdAt: undefined }))).toEqual([\n\t\t\t{ id1: 1, name: 'Jane', id: undefined, verified: false, json: null, createdAt: undefined },\n\t\t\t{ id1: 1, name: 'John', id: undefined, verified: false, json: null, createdAt: undefined },\n\t\t\t{ id1: 2, name: 'John', id: undefined, verified: false, json: null, createdAt: undefined },\n\t\t]);\n\n\t\texpect(users2).toHaveLength(2);\n\t\texpect(users2[0]?.id1).toBe(1);\n\t\texpect(users2[1]?.id1).toBe(2);\n\n\t\texpect(users3).toHaveLength(2);\n\t\texpect(users3[0]?.name).toBe('Jane');\n\t\texpect(users3[1]?.name).toBe('John');\n\t});\n\n\ttest('mySchema :: insert returning sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = await db\n\t\t\t.insert(usersMySchemaTable)\n\t\t\t.values({ id1: 1, name: 'John' })\n\t\t\t.returning({\n\t\t\t\tname: sql`upper(${usersMySchemaTable.name})`,\n\t\t\t});\n\n\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t});\n\n\ttest('mySchema :: delete returning sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersMySchemaTable).values({ id1: 1, name: 'John' });\n\t\tconst users = await db\n\t\t\t.delete(usersMySchemaTable)\n\t\t\t.where(eq(usersMySchemaTable.name, 'John'))\n\t\t\t.returning({\n\t\t\t\tname: sql`upper(${usersMySchemaTable.name})`,\n\t\t\t});\n\n\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t});\n\n\ttest('mySchema :: update with returning partial', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersMySchemaTable).values({ id1: 1, name: 'John' });\n\t\tconst users = await db.update(usersMySchemaTable).set({ name: 'Jane' }).where(\n\t\t\teq(usersMySchemaTable.name, 'John'),\n\t\t)\n\t\t\t.returning({\n\t\t\t\tid1: usersMySchemaTable.id1,\n\t\t\t\tname: usersMySchemaTable.name,\n\t\t\t});\n\n\t\texpect(users).toEqual([{ id1: 1, name: 'Jane' }]);\n\t});\n\n\ttest('mySchema :: delete with returning all fields', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst now = Date.now();\n\n\t\tawait db.insert(usersMySchemaTable).values({ id1: 1, name: 'John' });\n\t\tconst users = await db.delete(usersMySchemaTable).where(eq(usersMySchemaTable.name, 'John')).returning();\n\n\t\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(500);\n\t\texpect(users).toEqual([\n\t\t\t{\n\t\t\t\tid1: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tverified: false,\n\t\t\t\tjson: null,\n\t\t\t\tcreatedAt: users[0]!.createdAt,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('mySchema :: insert + select', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersMySchemaTable).values({ id1: 1, name: 'John' });\n\t\tconst result = await db.select().from(usersMySchemaTable);\n\t\texpect(result).toEqual([\n\t\t\t{\n\t\t\t\tid1: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tverified: false,\n\t\t\t\tjson: null,\n\t\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t\t},\n\t\t]);\n\n\t\tawait db.insert(usersMySchemaTable).values({ id1: 2, name: 'Jane' });\n\t\tconst result2 = await db.select().from(usersMySchemaTable);\n\t\texpect(result2).toEqual([\n\t\t\t{ id1: 1, name: 'John', verified: false, json: null, createdAt: result2[0]!.createdAt },\n\t\t\t{ id1: 2, name: 'Jane', verified: false, json: null, createdAt: result2[1]!.createdAt },\n\t\t]);\n\t});\n\n\ttest('mySchema :: insert with overridden default values', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersMySchemaTable).values({ id1: 1, name: 'John', verified: true });\n\t\tconst result = await db.select().from(usersMySchemaTable);\n\n\t\texpect(result).toEqual([\n\t\t\t{\n\t\t\t\tid1: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tverified: true,\n\t\t\t\tjson: null,\n\t\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('mySchema :: insert many', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersMySchemaTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{\n\t\t\t\tid1: 2,\n\t\t\t\tname: 'Bruce',\n\t\t\t\tjson: ['foo', 'bar'],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Jane',\n\t\t\t},\n\t\t\t{ id1: 4, name: 'Austin', verified: true },\n\t\t]);\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tid1: usersMySchemaTable.id1,\n\t\t\t\tname: usersMySchemaTable.name,\n\t\t\t\tjson: usersMySchemaTable.json,\n\t\t\t\tverified: usersMySchemaTable.verified,\n\t\t\t})\n\t\t\t.from(usersMySchemaTable);\n\n\t\texpect(result).toEqual([\n\t\t\t{ id1: 1, name: 'John', json: null, verified: false },\n\t\t\t{ id1: 2, name: 'Bruce', json: ['foo', 'bar'], verified: false },\n\t\t\t{ id1: 3, name: 'Jane', json: null, verified: false },\n\t\t\t{ id1: 4, name: 'Austin', json: null, verified: true },\n\t\t]);\n\t});\n\n\ttest('mySchema :: select with group by as field', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersMySchemaTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Jane',\n\t\t\t},\n\t\t]);\n\n\t\tconst result = await db.select({ name: usersMySchemaTable.name }).from(usersMySchemaTable).groupBy(\n\t\t\tusersMySchemaTable.name,\n\t\t);\n\n\t\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n\t});\n\n\ttest('mySchema :: select with group by as column + sql', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersMySchemaTable).values([\n\t\t\t{ id1: 1, name: 'John' },\n\t\t\t{ id1: 2, name: 'Jane' },\n\t\t\t{\n\t\t\t\tid1: 3,\n\t\t\t\tname: 'Jane',\n\t\t\t},\n\t\t]);\n\n\t\tconst result = await db\n\t\t\t.select({ name: usersMySchemaTable.name })\n\t\t\t.from(usersMySchemaTable)\n\t\t\t.groupBy(usersMySchemaTable.id1, sql`${usersMySchemaTable.name}`);\n\n\t\texpect(result.sort((a, b) => a.name.localeCompare(b.name))).toEqual([\n\t\t\t{ name: 'Jane' },\n\t\t\t{ name: 'Jane' },\n\t\t\t{\n\t\t\t\tname: 'John',\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('mySchema :: build query', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst query = db.select({ id1: usersMySchemaTable.id1, name: usersMySchemaTable.name }).from(usersMySchemaTable)\n\t\t\t.groupBy(usersMySchemaTable.id1, usersMySchemaTable.name).toSQL();\n\n\t\texpect(query).toEqual({\n\t\t\tsql:\n\t\t\t\t'select \"mySchema\".\"users\".\"id1\", \"mySchema\".\"users\".\"name\" from \"mySchema\".\"users\" group by \"mySchema\".\"users\".\"id1\", \"mySchema\".\"users\".\"name\"',\n\t\t\tparams: [],\n\t\t});\n\t});\n\n\ttest('mySchema :: partial join with alias', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\t\tconst customerAlias = alias(usersMySchemaTable, 'customer');\n\n\t\tawait db.insert(usersMySchemaTable).values([\n\t\t\t{ id1: 10, name: 'Ivan' },\n\t\t\t{ id1: 11, name: 'Hans' },\n\t\t]);\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tuser: {\n\t\t\t\t\tid1: usersMySchemaTable.id1,\n\t\t\t\t\tname: usersMySchemaTable.name,\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid1: customerAlias.id1,\n\t\t\t\t\tname: customerAlias.name,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.from(usersMySchemaTable)\n\t\t\t.leftJoin(customerAlias, eq(customerAlias.id1, 11))\n\t\t\t.where(eq(usersMySchemaTable.id1, 10));\n\n\t\texpect(result).toEqual([\n\t\t\t{\n\t\t\t\tuser: { id1: 10, name: 'Ivan' },\n\t\t\t\tcustomer: { id1: 11, name: 'Hans' },\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('mySchema :: insert with spaces', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersMySchemaTable).values({ id1: 1, name: sql`'Jo   h     n'` });\n\t\tconst result = await db.select({ id1: usersMySchemaTable.id1, name: usersMySchemaTable.name }).from(\n\t\t\tusersMySchemaTable,\n\t\t);\n\n\t\texpect(result).toEqual([{ id1: 1, name: 'Jo   h     n' }]);\n\t});\n\n\ttest('mySchema :: prepared statement with placeholder in .limit', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersMySchemaTable).values({ id1: 1, name: 'John' });\n\t\tconst stmt = db\n\t\t\t.select({\n\t\t\t\tid1: usersMySchemaTable.id1,\n\t\t\t\tname: usersMySchemaTable.name,\n\t\t\t})\n\t\t\t.from(usersMySchemaTable)\n\t\t\t.where(eq(usersMySchemaTable.id1, sql.placeholder('id1')))\n\t\t\t.limit(sql.placeholder('limit'))\n\t\t\t.prepare('mySchema_stmt_limit');\n\n\t\tconst result = await stmt.execute({ id1: 1, limit: 1 });\n\n\t\texpect(result.map((it) => ({ ...it, id: undefined }))).toEqual([{ id1: 1, name: 'John' }]);\n\t\texpect(result).toHaveLength(1);\n\t});\n\n\t// TODO on conflict does not supported in gel\n\ttest.todo('mySchema :: build query insert with onConflict do update / multiple columns', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst query = db\n\t\t\t.insert(usersMySchemaTable)\n\t\t\t.values({ id1: 1, name: 'John', json: ['foo', 'bar'] })\n\t\t\t// .onConflictDoUpdate({ target: [usersMySchemaTable.id1, usersMySchemaTable.name], set: { name: 'John1' } })\n\t\t\t.toSQL();\n\n\t\texpect(query).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"mySchema\".\"users\" (\"id1\", \"name\", \"verified\", \"json\", \"created_at\") values ($1, $2, default, $3, default) on conflict (\"id1\",\"name\") do update set \"name\" = $4',\n\t\t\tparams: [1, 'John', ['foo', 'bar'], 'John1'],\n\t\t});\n\t});\n\n\t// TODO on conflict not supported in gel\n\ttest.todo('mySchema :: build query insert with onConflict do nothing + target', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst query = db\n\t\t\t.insert(usersMySchemaTable)\n\t\t\t.values({ id1: 1, name: 'John', json: ['foo', 'bar'] })\n\t\t\t// .onConflictDoNothing({ target: usersMySchemaTable.id1 })\n\t\t\t.toSQL();\n\n\t\texpect(query).toEqual({\n\t\t\tsql:\n\t\t\t\t'insert into \"mySchema\".\"users\" (\"id1\", \"name\", \"verified\", \"json\", \"created_at\") values ($1, $2, default, $3, default) on conflict (\"id1\") do nothing',\n\t\t\tparams: [1, 'John', ['foo', 'bar']],\n\t\t});\n\t});\n\n\ttest('mySchema :: select from tables with same name from different schema using alias', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersMySchemaTable).values({ id1: 10, name: 'Ivan' });\n\t\tawait db.insert(usersTable).values({ id1: 11, name: 'Hans' });\n\n\t\tconst customerAlias = alias(usersTable, 'customer');\n\n\t\tconst result = await db.select().from(usersMySchemaTable).leftJoin(customerAlias, eq(customerAlias.id1, 11))\n\t\t\t.where(eq(customerAlias.id1, 11));\n\n\t\texpect(result).toEqual([\n\t\t\t{\n\t\t\t\tusers: {\n\t\t\t\t\tid1: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t\tverified: false,\n\t\t\t\t\tjson: null,\n\t\t\t\t\tcreatedAt: result[0]!.users.createdAt,\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid1: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t\tverified: false,\n\t\t\t\t\tjson: null,\n\t\t\t\t\tcreatedAt: result[0]!.customer!.createdAt,\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('limit 0', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\t\tconst users = await db.select().from(usersTable).limit(0);\n\n\t\texpect(users).toEqual([]);\n\t});\n\n\ttest('limit -1', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(usersTable).values({ id1: 2, name: 'John' });\n\t\tconst users = await db.select().from(usersTable).limit(-1);\n\n\t\texpect(users.length).toBeGreaterThan(0);\n\t});\n\n\ttest('Object keys as column names', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\t// Tests the following:\n\t\t// Column with required config\n\t\t// Column with optional config without providing a value\n\t\t// Column with optional config providing a value\n\t\t// Column without config\n\t\tconst users = gelTable('users_with_names', {\n\t\t\tid1: integer().notNull(),\n\t\t\tfirstName: text(),\n\t\t\tlastName: text(),\n\t\t\tadmin: boolean(),\n\t\t});\n\n\t\tawait db.insert(users).values([\n\t\t\t{ id1: 1, firstName: 'John', lastName: 'Doe', admin: true },\n\t\t\t{ id1: 2, firstName: 'Jane', lastName: 'Smith', admin: false },\n\t\t]);\n\t\tconst result = await db.select({ id1: users.id1, firstName: users.firstName, lastName: users.lastName }).from(\n\t\t\tusers,\n\t\t).where(eq(users.admin, true));\n\n\t\texpect(result).toEqual([{ id1: 1, firstName: 'John', lastName: 'Doe' }]);\n\t});\n\n\ttest('proper json handling', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst jsonTable = gelTable('json_table', {\n\t\t\tjson: json('json').$type<{ name: string; age: number }>(),\n\t\t});\n\n\t\tawait db.insert(jsonTable).values({ json: { name: 'Tom', age: 75 } });\n\n\t\tconst result = await db.select().from(jsonTable);\n\n\t\tconst justNames = await db\n\t\t\t.select({\n\t\t\t\tname1: sql<string>`${jsonTable.json}->>'name'`.as('name1'),\n\t\t\t\tname2: sql<string>`${jsonTable.json}->>'name'`.as('name2'),\n\t\t\t})\n\t\t\t.from(jsonTable);\n\n\t\texpect(result).toStrictEqual([\n\t\t\t{\n\t\t\t\tjson: { name: 'Tom', age: 75 },\n\t\t\t},\n\t\t]);\n\n\t\texpect(justNames).toStrictEqual([\n\t\t\t{\n\t\t\t\tname1: 'Tom',\n\t\t\t\tname2: 'Tom',\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('set json fields with objects and retrieve with the ->> operator', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst obj = { string: 'test', number: 123 };\n\t\tconst { string: testString, number: testNumber } = obj;\n\n\t\tawait db.insert(jsonTestTable).values({\n\t\t\tid1: 1,\n\t\t\tjson: obj,\n\t\t});\n\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tjsonStringField: sql<string>`${jsonTestTable.json}->>'string'`,\n\t\t\t\tjsonNumberField: sql<string>`${jsonTestTable.json}->>'number'`,\n\t\t\t})\n\t\t\t.from(jsonTestTable);\n\n\t\texpect(result).toStrictEqual([\n\t\t\t{\n\t\t\t\tjsonStringField: testString,\n\t\t\t\tjsonNumberField: String(testNumber),\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('set json fields with objects and retrieve with the -> operator', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst obj = { string: 'test', number: 123 };\n\t\tconst { string: testString, number: testNumber } = obj;\n\n\t\tawait db.insert(jsonTestTable).values({ id1: 1, json: obj });\n\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tjsonStringField: sql<string>`${jsonTestTable.json}->'string'`,\n\t\t\t\tjsonNumberField: sql<number>`${jsonTestTable.json}->'number'`,\n\t\t\t})\n\t\t\t.from(jsonTestTable);\n\n\t\texpect(result).toStrictEqual([\n\t\t\t{\n\t\t\t\tjsonStringField: testString,\n\t\t\t\tjsonNumberField: testNumber,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('set json fields with strings and retrieve with the -> operator', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst obj = { string: 'test', number: 123 };\n\t\tconst { string: testString, number: testNumber } = obj;\n\n\t\tawait db.insert(jsonTestTable).values({\n\t\t\tid1: 1,\n\t\t\tjson: sql`${obj}`,\n\t\t});\n\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tjsonStringField: sql<string>`${jsonTestTable.json}->'string'`,\n\t\t\t\tjsonNumberField: sql<number>`${jsonTestTable.json}->'number'`,\n\t\t\t})\n\t\t\t.from(jsonTestTable);\n\n\t\texpect(result).toStrictEqual([\n\t\t\t{\n\t\t\t\tjsonStringField: testString,\n\t\t\t\tjsonNumberField: testNumber,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('cross join', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db\n\t\t\t.insert(usersTable)\n\t\t\t.values([\n\t\t\t\t{ id1: 1, name: 'John' },\n\t\t\t\t{ id1: 2, name: 'Jane' },\n\t\t\t]);\n\n\t\tawait db\n\t\t\t.insert(citiesTable)\n\t\t\t.values([\n\t\t\t\t{ id1: 1, name: 'Seattle' },\n\t\t\t\t{ id1: 2, name: 'New York City' },\n\t\t\t]);\n\n\t\tconst result = await db\n\t\t\t.select({\n\t\t\t\tuser: usersTable.name,\n\t\t\t\tcity: citiesTable.name,\n\t\t\t})\n\t\t\t.from(usersTable)\n\t\t\t.crossJoin(citiesTable)\n\t\t\t.orderBy(usersTable.name, citiesTable.name);\n\n\t\texpect(result).toStrictEqual([\n\t\t\t{ city: 'New York City', user: 'Jane' },\n\t\t\t{ city: 'Seattle', user: 'Jane' },\n\t\t\t{ city: 'New York City', user: 'John' },\n\t\t\t{ city: 'Seattle', user: 'John' },\n\t\t]);\n\t});\n\n\ttest('left join (lateral)', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db\n\t\t\t.insert(citiesTable)\n\t\t\t.values([{ id1: 1, name: 'Paris' }, { id1: 2, name: 'London' }])\n\t\t\t.returning({ id: citiesTable.id1 });\n\n\t\tawait db.insert(users2Table).values([{ id1: 1, name: 'John', cityId: 1 }, { id1: 2, name: 'Jane' }]);\n\n\t\tconst sq = db\n\t\t\t.select({\n\t\t\t\tuserId: users2Table.id1,\n\t\t\t\tuserName: users2Table.name,\n\t\t\t\tcityId: users2Table.cityId,\n\t\t\t})\n\t\t\t.from(users2Table)\n\t\t\t.where(eq(users2Table.cityId, citiesTable.id1))\n\t\t\t.as('sq');\n\n\t\tconst res = await db\n\t\t\t.select({\n\t\t\t\tcityId: citiesTable.id1,\n\t\t\t\tcityName: citiesTable.name,\n\t\t\t\tuserId: sq.userId,\n\t\t\t\tuserName: sq.userName,\n\t\t\t})\n\t\t\t.from(citiesTable)\n\t\t\t.leftJoinLateral(sq, sql`true`);\n\n\t\texpect(res).toStrictEqual([\n\t\t\t{ cityId: 1, cityName: 'Paris', userId: 1, userName: 'John' },\n\t\t\t{ cityId: 2, cityName: 'London', userId: null, userName: null },\n\t\t]);\n\t});\n\n\ttest('inner join (lateral)', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db\n\t\t\t.insert(citiesTable)\n\t\t\t.values([{ id1: 1, name: 'Paris' }, { id1: 2, name: 'London' }])\n\t\t\t.returning({ id: citiesTable.id1 });\n\n\t\tawait db.insert(users2Table).values([{ id1: 1, name: 'John', cityId: 1 }, { id1: 2, name: 'Jane' }]);\n\n\t\tconst sq = db\n\t\t\t.select({\n\t\t\t\tuserId: users2Table.id1,\n\t\t\t\tuserName: users2Table.name,\n\t\t\t\tcityId: users2Table.cityId,\n\t\t\t})\n\t\t\t.from(users2Table)\n\t\t\t.where(eq(users2Table.cityId, citiesTable.id1))\n\t\t\t.as('sq');\n\n\t\tconst res = await db\n\t\t\t.select({\n\t\t\t\tcityId: citiesTable.id1,\n\t\t\t\tcityName: citiesTable.name,\n\t\t\t\tuserId: sq.userId,\n\t\t\t\tuserName: sq.userName,\n\t\t\t})\n\t\t\t.from(citiesTable)\n\t\t\t.innerJoinLateral(sq, sql`true`);\n\n\t\texpect(res).toStrictEqual([\n\t\t\t{ cityId: 1, cityName: 'Paris', userId: 1, userName: 'John' },\n\t\t]);\n\t});\n\n\ttest('cross join (lateral)', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db\n\t\t\t.insert(citiesTable)\n\t\t\t.values([{ id1: 1, name: 'Paris' }, { id1: 2, name: 'London' }, { id1: 3, name: 'Berlin' }]);\n\n\t\tawait db.insert(users2Table).values([{ id1: 1, name: 'John', cityId: 1 }, { id1: 2, name: 'Jane' }, {\n\t\t\tid1: 3,\n\t\t\tname: 'Patrick',\n\t\t\tcityId: 2,\n\t\t}]);\n\n\t\tconst sq = db\n\t\t\t.select({\n\t\t\t\tuserId: users2Table.id1,\n\t\t\t\tuserName: users2Table.name,\n\t\t\t\tcityId: users2Table.cityId,\n\t\t\t})\n\t\t\t.from(users2Table)\n\t\t\t.where(not(like(citiesTable.name, 'L%')))\n\t\t\t.as('sq');\n\n\t\tconst res = await db\n\t\t\t.select({\n\t\t\t\tcityId: citiesTable.id1,\n\t\t\t\tcityName: citiesTable.name,\n\t\t\t\tuserId: sq.userId,\n\t\t\t\tuserName: sq.userName,\n\t\t\t})\n\t\t\t.from(citiesTable)\n\t\t\t.crossJoinLateral(sq)\n\t\t\t.orderBy(citiesTable.id1, sq.userId);\n\n\t\texpect(res).toStrictEqual([\n\t\t\t{\n\t\t\t\tcityId: 1,\n\t\t\t\tcityName: 'Paris',\n\t\t\t\tuserId: 1,\n\t\t\t\tuserName: 'John',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcityId: 1,\n\t\t\t\tcityName: 'Paris',\n\t\t\t\tuserId: 2,\n\t\t\t\tuserName: 'Jane',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcityId: 1,\n\t\t\t\tcityName: 'Paris',\n\t\t\t\tuserId: 3,\n\t\t\t\tuserName: 'Patrick',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcityId: 3,\n\t\t\t\tcityName: 'Berlin',\n\t\t\t\tuserId: 1,\n\t\t\t\tuserName: 'John',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcityId: 3,\n\t\t\t\tcityName: 'Berlin',\n\t\t\t\tuserId: 2,\n\t\t\t\tuserName: 'Jane',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcityId: 3,\n\t\t\t\tcityName: 'Berlin',\n\t\t\t\tuserId: 3,\n\t\t\t\tuserName: 'Patrick',\n\t\t\t},\n\t\t]);\n\t});\n\n\t// TODO not supported yet\n\ttest.todo('update ... from', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(cities2Table).values([\n\t\t\t{ id1: 1, name: 'New York City' },\n\t\t\t{ id1: 2, name: 'Seattle' },\n\t\t]);\n\t\tawait db.insert(users2Table).values([\n\t\t\t{ id1: 1, name: 'John', cityId: 1 },\n\t\t\t{ id1: 2, name: 'Jane', cityId: 2 },\n\t\t]);\n\t\tconst result = await db\n\t\t\t.update(users2Table)\n\t\t\t.set({\n\t\t\t\tcityId: cities2Table.id1,\n\t\t\t})\n\t\t\t.from(cities2Table)\n\t\t\t.where(and(eq(cities2Table.name, 'Seattle'), eq(users2Table.name, 'John')))\n\t\t\t.returning();\n\n\t\texpect(result).toStrictEqual([\n\t\t\t{\n\t\t\t\tid1: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tcityId: 2,\n\t\t\t\tcities: {\n\t\t\t\t\tid1: 2,\n\t\t\t\t\tname: 'Seattle',\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\t// TODO not supported yet\n\ttest.todo('update ... from with alias', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tawait db.insert(cities2Table).values([\n\t\t\t{ id1: 1, name: 'New York City' },\n\t\t\t{ id1: 2, name: 'Seattle' },\n\t\t]);\n\t\tawait db.insert(users2Table).values([\n\t\t\t{ id1: 1, name: 'John', cityId: 1 },\n\t\t\t{ id1: 2, name: 'Jane', cityId: 2 },\n\t\t]);\n\n\t\tconst users = alias(users2Table, 'u');\n\t\tconst cities = alias(cities2Table, 'c');\n\t\tconst result = await db\n\t\t\t.update(users)\n\t\t\t.set({\n\t\t\t\tcityId: cities.id1,\n\t\t\t})\n\t\t\t.from(cities)\n\t\t\t.where(and(eq(cities.name, 'Seattle'), eq(users.name, 'John')))\n\t\t\t.returning();\n\n\t\texpect(result).toStrictEqual([\n\t\t\t{\n\t\t\t\tid1: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tcityId: 2,\n\t\t\t\tc: {\n\t\t\t\t\tid1: 2,\n\t\t\t\t\tname: 'Seattle',\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\t// TODO not supported yet\n\t// test.todo('update ... from with join', async (ctx) => {\n\t// \tconst { db } = ctx.gel;\n\n\t// \tconst states = gelTable('states', {\n\t// \t\tid1: integer('id1').primaryKey(),\n\t// \t\tname: text('name').notNull(),\n\t// \t});\n\t// \tconst cities = gelTable('cities', {\n\t// \t\tid1: integer('id1').primaryKey(),\n\t// \t\tname: text('name').notNull(),\n\t// \t\tstateId: integer('state_id').references(() => states.id1),\n\t// \t});\n\t// \tconst users = gelTable('users', {\n\t// \t\tid1: integer('id1').primaryKey(),\n\t// \t\tname: text('name').notNull(),\n\t// \t\tcityId: integer('city_id')\n\t// \t\t\t.notNull()\n\t// \t\t\t.references(() => cities.id1),\n\t// \t});\n\n\t// \tawait db.execute(sql`drop table if exists \"states\" cascade`);\n\t// \tawait db.execute(sql`drop table if exists \"cities\" cascade`);\n\t// \tawait db.execute(sql`drop table if exists \"users\" cascade`);\n\t// \tawait db.execute(sql`\n\t//             create table \"states\" (\n\t//                 \"id\" serial primary key,\n\t//                 \"name\" text not null\n\t//             )\n\t//         `);\n\t// \tawait db.execute(sql`\n\t//             create table \"cities\" (\n\t//                 \"id\" serial primary key,\n\t//                 \"name\" text not null,\n\t//                 \"state_id\" integer references \"states\"(\"id\")\n\t//             )\n\t//         `);\n\t// \tawait db.execute(sql`\n\t//             create table \"users\" (\n\t//                 \"id\" serial primary key,\n\t//                 \"name\" text not null,\n\t//                 \"city_id\" integer not null references \"cities\"(\"id\")\n\t//             )\n\t//         `);\n\n\t// \tawait db.insert(states).values([{ id1: 1, name: 'New York' }, { id1: 2, name: 'Washington' }]);\n\t// \tawait db.insert(cities).values([\n\t// \t\t{ id1: 1, name: 'New York City', stateId: 1 },\n\t// \t\t{ id1: 2, name: 'Seattle', stateId: 2 },\n\t// \t\t{\n\t// \t\t\tid1: 2,\n\t// \t\t\tname: 'London',\n\t// \t\t},\n\t// \t]);\n\t// \tawait db.insert(users).values([\n\t// \t\t{ id1: 1, name: 'John', cityId: 1 },\n\t// \t\t{ id1: 2, name: 'Jane', cityId: 2 },\n\t// \t\t{ id1: 3, name: 'Jack', cityId: 3 },\n\t// \t]);\n\n\t// \tconst result1 = await db\n\t// \t\t.update(users)\n\t// \t\t.set({\n\t// \t\t\tcityId: cities.id1,\n\t// \t\t})\n\t// \t\t.from(cities)\n\t// \t\t.leftJoin(states, eq(cities.stateId, states.id1))\n\t// \t\t.where(and(eq(cities.name, 'Seattle'), eq(users.name, 'John')))\n\t// \t\t.returning();\n\t// \tconst result2 = await db\n\t// \t\t.update(users)\n\t// \t\t.set({\n\t// \t\t\tcityId: cities.id1,\n\t// \t\t})\n\t// \t\t.from(cities)\n\t// \t\t.leftJoin(states, eq(cities.stateId, states.id1))\n\t// \t\t.where(and(eq(cities.name, 'London'), eq(users.name, 'Jack')))\n\t// \t\t.returning();\n\n\t// \texpect(result1).toStrictEqual([\n\t// \t\t{\n\t// \t\t\tid: 1,\n\t// \t\t\tname: 'John',\n\t// \t\t\tcityId: 2,\n\t// \t\t\tcities: {\n\t// \t\t\t\tid: 2,\n\t// \t\t\t\tname: 'Seattle',\n\t// \t\t\t\tstateId: 2,\n\t// \t\t\t},\n\t// \t\t\tstates: {\n\t// \t\t\t\tid: 2,\n\t// \t\t\t\tname: 'Washington',\n\t// \t\t\t},\n\t// \t\t},\n\t// \t]);\n\t// \texpect(result2).toStrictEqual([\n\t// \t\t{\n\t// \t\t\tid: 3,\n\t// \t\t\tname: 'Jack',\n\t// \t\t\tcityId: 3,\n\t// \t\t\tcities: {\n\t// \t\t\t\tid: 3,\n\t// \t\t\t\tname: 'London',\n\t// \t\t\t\tstateId: null,\n\t// \t\t\t},\n\t// \t\t\tstates: null,\n\t// \t\t},\n\t// \t]);\n\t// });\n\n\ttest('insert into ... select', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst notifications = gelTable('notifications', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tsentAt: timestamp('sentAt').notNull().defaultNow(),\n\t\t\tmessage: text('message').notNull(),\n\t\t});\n\t\tconst users = gelTable('users_insert_select', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\t\tconst userNotications = gelTable('user_notifications', {\n\t\t\tuserId: integer('userId').notNull(),\n\t\t\tnotificationId: integer('notificationId').notNull(),\n\t\t});\n\n\t\tconst newNotification = await db\n\t\t\t.insert(notifications)\n\t\t\t.values({ id1: 1, message: 'You are one of the 3 lucky winners!' })\n\t\t\t.returning({ id1: notifications.id1 })\n\t\t\t.then((result) => result[0]);\n\t\tawait db.insert(users).values([\n\t\t\t{ id1: 1, name: 'Alice' },\n\t\t\t{ id1: 2, name: 'Bob' },\n\t\t\t{ id1: 3, name: 'Charlie' },\n\t\t\t{\n\t\t\t\tid1: 4,\n\t\t\t\tname: 'David',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid1: 5,\n\t\t\t\tname: 'Eve',\n\t\t\t},\n\t\t]);\n\n\t\tconst sentNotifications = await db\n\t\t\t.insert(userNotications)\n\t\t\t.select(\n\t\t\t\tdb\n\t\t\t\t\t.select({\n\t\t\t\t\t\tuserId: users.id1,\n\t\t\t\t\t\tnotificationId: sql`${newNotification!.id1}`.as('notification_id'),\n\t\t\t\t\t})\n\t\t\t\t\t.from(users)\n\t\t\t\t\t.where(inArray(users.name, ['Alice', 'Charlie', 'Eve']))\n\t\t\t\t\t.orderBy(asc(users.id1)),\n\t\t\t)\n\t\t\t.returning();\n\n\t\texpect(sentNotifications).toStrictEqual([\n\t\t\t{ userId: 1, notificationId: newNotification!.id1 },\n\t\t\t{ userId: 3, notificationId: newNotification!.id1 },\n\t\t\t{ userId: 5, notificationId: newNotification!.id1 },\n\t\t]);\n\t});\n\n\ttest('insert into ... select with keys in different order', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users1 = gelTable('users1', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\t\tconst users2 = gelTable('users2', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\texpect(() =>\n\t\t\tdb.insert(users1).select(\n\t\t\t\tdb\n\t\t\t\t\t.select({\n\t\t\t\t\t\tname: users2.name,\n\t\t\t\t\t\tid1: users2.id1,\n\t\t\t\t\t})\n\t\t\t\t\t.from(users2),\n\t\t\t)\n\t\t).toThrowError();\n\t});\n\n\ttest('policy', () => {\n\t\t{\n\t\t\tconst policy = gelPolicy('test policy');\n\n\t\t\texpect(is(policy, GelPolicy)).toBe(true);\n\t\t\texpect(policy.name).toBe('test policy');\n\t\t}\n\n\t\t{\n\t\t\tconst policy = gelPolicy('test policy', {\n\t\t\t\tas: 'permissive',\n\t\t\t\tfor: 'all',\n\t\t\t\tto: 'public',\n\t\t\t\tusing: sql`1=1`,\n\t\t\t\twithCheck: sql`1=1`,\n\t\t\t});\n\n\t\t\texpect(is(policy, GelPolicy)).toBe(true);\n\t\t\texpect(policy.name).toBe('test policy');\n\t\t\texpect(policy.as).toBe('permissive');\n\t\t\texpect(policy.for).toBe('all');\n\t\t\texpect(policy.to).toBe('public');\n\t\t\tconst dialect = new GelDialect();\n\t\t\texpect(is(policy.using, SQL)).toBe(true);\n\t\t\texpect(dialect.sqlToQuery(policy.using!).sql).toBe('1=1');\n\t\t\texpect(is(policy.withCheck, SQL)).toBe(true);\n\t\t\texpect(dialect.sqlToQuery(policy.withCheck!).sql).toBe('1=1');\n\t\t}\n\n\t\t{\n\t\t\tconst policy = gelPolicy('test policy', {\n\t\t\t\tto: 'custom value',\n\t\t\t});\n\n\t\t\texpect(policy.to).toBe('custom value');\n\t\t}\n\n\t\t{\n\t\t\tconst p1 = gelPolicy('test policy');\n\t\t\tconst p2 = gelPolicy('test policy 2', {\n\t\t\t\tas: 'permissive',\n\t\t\t\tfor: 'all',\n\t\t\t\tto: 'public',\n\t\t\t\tusing: sql`1=1`,\n\t\t\t\twithCheck: sql`1=1`,\n\t\t\t});\n\t\t\tconst table = gelTable(\n\t\t\t\t'table_with_policy',\n\t\t\t\t{\n\t\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\t\tname: text('name').notNull(),\n\t\t\t\t},\n\t\t\t\t() => ({\n\t\t\t\t\tp1,\n\t\t\t\t\tp2,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst config = getTableConfig(table);\n\t\t\texpect(config.policies).toHaveLength(2);\n\t\t\texpect(config.policies[0]).toBe(p1);\n\t\t\texpect(config.policies[1]).toBe(p2);\n\t\t}\n\t});\n\n\ttest('Enable RLS function', () => {\n\t\tconst usersWithRLS = gelTable('users', {\n\t\t\tid: integer(),\n\t\t}).enableRLS();\n\n\t\tconst config1 = getTableConfig(usersWithRLS);\n\n\t\tconst usersNoRLS = gelTable('users', {\n\t\t\tid: integer(),\n\t\t});\n\n\t\tconst config2 = getTableConfig(usersNoRLS);\n\n\t\texpect(config1.enableRLS).toBeTruthy();\n\t\texpect(config2.enableRLS).toBeFalsy();\n\t});\n\n\ttest('test $onUpdateFn and $onUpdate works with sql value', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst users = gelTable('users_on_update_sql', {\n\t\t\tid: integer('id1').notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t\tupdatedAt: timestamptz('updated_at').notNull().$onUpdate(() => sql`now()`),\n\t\t});\n\n\t\tconst insertResp = await db.insert(users).values({\n\t\t\tid: 1,\n\t\t\tname: 'John',\n\t\t}).returning({\n\t\t\tupdatedAt: users.updatedAt,\n\t\t});\n\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\n\t\tconst now = Date.now();\n\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\t\tconst updateResp = await db.update(users).set({\n\t\t\tname: 'John',\n\t\t}).returning({\n\t\t\tupdatedAt: users.updatedAt,\n\t\t});\n\n\t\texpect(new Date(insertResp[0]?.updatedAt.toISOString() ?? 0).getTime()).lessThan(now);\n\t\texpect(new Date(updateResp[0]?.updatedAt.toISOString() ?? 0).getTime()).greaterThan(now);\n\t});\n\n\ttest('$count separate', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst countTestTable = gelTable('count_test', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\tawait db.insert(countTestTable).values([\n\t\t\t{ id1: 1, name: 'First' },\n\t\t\t{ id1: 2, name: 'Second' },\n\t\t\t{ id1: 3, name: 'Third' },\n\t\t\t{ id1: 4, name: 'Fourth' },\n\t\t]);\n\n\t\tconst count = await db.$count(countTestTable);\n\n\t\texpect(count).toStrictEqual(4);\n\t});\n\n\ttest('$count embedded', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst countTestTable = gelTable('count_test', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\tawait db.insert(countTestTable).values([\n\t\t\t{ id1: 1, name: 'First' },\n\t\t\t{ id1: 2, name: 'Second' },\n\t\t\t{ id1: 3, name: 'Third' },\n\t\t\t{ id1: 4, name: 'Fourth' },\n\t\t]);\n\n\t\tconst count = await db\n\t\t\t.select({\n\t\t\t\tcount: db.$count(countTestTable),\n\t\t\t})\n\t\t\t.from(countTestTable);\n\n\t\texpect(count).toStrictEqual([{ count: 4 }, { count: 4 }, { count: 4 }, { count: 4 }]);\n\t});\n\n\ttest('$count separate reuse', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst countTestTable = gelTable('count_test', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\tawait db.insert(countTestTable).values([\n\t\t\t{ id1: 1, name: 'First' },\n\t\t\t{ id1: 2, name: 'Second' },\n\t\t\t{ id1: 3, name: 'Third' },\n\t\t\t{ id1: 4, name: 'Fourth' },\n\t\t]);\n\n\t\tconst count = db.$count(countTestTable);\n\n\t\tconst count1 = await count;\n\n\t\tawait db.insert(countTestTable).values({ id1: 5, name: 'fifth' });\n\n\t\tconst count2 = await count;\n\n\t\tawait db.insert(countTestTable).values({ id1: 6, name: 'sixth' });\n\n\t\tconst count3 = await count;\n\n\t\texpect(count1).toStrictEqual(4);\n\t\texpect(count2).toStrictEqual(5);\n\t\texpect(count3).toStrictEqual(6);\n\t});\n\n\ttest('$count embedded reuse', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst countTestTable = gelTable('count_test', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\tawait db.insert(countTestTable).values([\n\t\t\t{ id1: 1, name: 'First' },\n\t\t\t{ id1: 2, name: 'Second' },\n\t\t\t{ id1: 3, name: 'Third' },\n\t\t\t{ id1: 4, name: 'Fourth' },\n\t\t]);\n\n\t\tconst count = db\n\t\t\t.select({\n\t\t\t\tcount: db.$count(countTestTable),\n\t\t\t})\n\t\t\t.from(countTestTable);\n\n\t\tconst count1 = await count;\n\n\t\tawait db.insert(countTestTable).values({ id1: 5, name: 'fifth' });\n\n\t\tconst count2 = await count;\n\n\t\tawait db.insert(countTestTable).values({ id1: 6, name: 'sixth' });\n\n\t\tconst count3 = await count;\n\n\t\texpect(count1).toStrictEqual([{ count: 4 }, { count: 4 }, { count: 4 }, { count: 4 }]);\n\t\texpect(count2).toStrictEqual([{ count: 5 }, { count: 5 }, { count: 5 }, { count: 5 }, { count: 5 }]);\n\t\texpect(count3).toStrictEqual([\n\t\t\t{ count: 6 },\n\t\t\t{ count: 6 },\n\t\t\t{ count: 6 },\n\t\t\t{ count: 6 },\n\t\t\t{ count: 6 },\n\t\t\t{\n\t\t\t\tcount: 6,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest('$count separate with filters', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst countTestTable = gelTable('count_test', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\tawait db.insert(countTestTable).values([\n\t\t\t{ id1: 1, name: 'First' },\n\t\t\t{ id1: 2, name: 'Second' },\n\t\t\t{ id1: 3, name: 'Third' },\n\t\t\t{ id1: 4, name: 'Fourth' },\n\t\t]);\n\n\t\tconst count = await db.$count(countTestTable, gt(countTestTable.id1, 1));\n\n\t\texpect(count).toStrictEqual(3);\n\t});\n\n\ttest('$count embedded with filters', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst countTestTable = gelTable('count_test', {\n\t\t\tid1: integer('id1').notNull(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\tawait db.insert(countTestTable).values([\n\t\t\t{ id1: 1, name: 'First' },\n\t\t\t{ id1: 2, name: 'Second' },\n\t\t\t{ id1: 3, name: 'Third' },\n\t\t\t{ id1: 4, name: 'Fourth' },\n\t\t]);\n\n\t\tconst count = await db\n\t\t\t.select({\n\t\t\t\tcount: db.$count(countTestTable, gt(countTestTable.id1, 1)),\n\t\t\t})\n\t\t\t.from(countTestTable);\n\n\t\texpect(count).toStrictEqual([{ count: 3 }, { count: 3 }, { count: 3 }, { count: 3 }]);\n\t});\n\n\t// TODO\n\ttest.todo('insert multiple rows into table with generated identity column', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\n\t\tconst identityColumnsTable = gelTable('identity_columns_table', {\n\t\t\tid: integer('id').generatedAlwaysAsIdentity(),\n\t\t\tid1: integer('id1').generatedByDefaultAsIdentity(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\t// not passing identity columns\n\t\tawait db.execute(sql`drop table if exists ${identityColumnsTable}`);\n\t\tawait db.execute(\n\t\t\tsql`create table ${identityColumnsTable} (\"id\" integer generated always as identity, \"id1\" integer generated by default as identity, \"name\" text)`,\n\t\t);\n\n\t\tlet result = await db\n\t\t\t.insert(identityColumnsTable)\n\t\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Bob' }])\n\t\t\t.returning();\n\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, id1: 1, name: 'John' },\n\t\t\t{ id: 2, id1: 2, name: 'Jane' },\n\t\t\t{ id: 3, id1: 3, name: 'Bob' },\n\t\t]);\n\n\t\t// passing generated by default as identity column\n\t\tawait db.execute(sql`drop table if exists ${identityColumnsTable}`);\n\t\tawait db.execute(\n\t\t\tsql`create table ${identityColumnsTable} (\"id\" integer generated always as identity, \"id1\" integer generated by default as identity, \"name\" text)`,\n\t\t);\n\n\t\tresult = await db\n\t\t\t.insert(identityColumnsTable)\n\t\t\t.values([\n\t\t\t\t{ name: 'John', id1: 3 },\n\t\t\t\t{ name: 'Jane', id1: 5 },\n\t\t\t\t{ name: 'Bob', id1: 5 },\n\t\t\t])\n\t\t\t.returning();\n\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, id1: 3, name: 'John' },\n\t\t\t{ id: 2, id1: 5, name: 'Jane' },\n\t\t\t{ id: 3, id1: 5, name: 'Bob' },\n\t\t]);\n\n\t\t// passing all identity columns\n\t\tawait db.execute(sql`drop table if exists ${identityColumnsTable}`);\n\t\tawait db.execute(\n\t\t\tsql`create table ${identityColumnsTable} (\"id\" integer generated always as identity, \"id1\" integer generated by default as identity, \"name\" text)`,\n\t\t);\n\n\t\tresult = await db\n\t\t\t.insert(identityColumnsTable)\n\t\t\t.overridingSystemValue()\n\t\t\t.values([\n\t\t\t\t{ name: 'John', id: 2, id1: 3 },\n\t\t\t\t{ name: 'Jane', id: 4, id1: 5 },\n\t\t\t\t{ name: 'Bob', id: 4, id1: 5 },\n\t\t\t])\n\t\t\t.returning();\n\n\t\texpect(result).toEqual([\n\t\t\t{ id: 2, id1: 3, name: 'John' },\n\t\t\t{ id: 4, id1: 5, name: 'Jane' },\n\t\t\t{ id: 4, id1: 5, name: 'Bob' },\n\t\t]);\n\t});\n\n\ttest('insert via db.execute + select via db.execute', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\t\tawait db.execute(\n\t\t\tsql`insert into ${usersTable} (${sql.identifier(usersTable.id1.name)},${\n\t\t\t\tsql.identifier(usersTable.name.name)\n\t\t\t}) values (1, ${'John'})`,\n\t\t);\n\n\t\tconst result = await db.execute<{ id1: number; name: string }>(\n\t\t\tsql`select id1, name from \"users\"`,\n\t\t);\n\t\texpect(result).toEqual([{ id1: 1, name: 'John' }]);\n\t});\n\n\ttest('insert via db.execute + returning', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\t\tconst inserted = await db.execute<{ id1: number; name: string }>(\n\t\t\tsql`insert into ${usersTable} (${\n\t\t\t\tsql.identifier(\n\t\t\t\t\tusersTable.id1.name,\n\t\t\t\t)\n\t\t\t}, ${\n\t\t\t\tsql.identifier(\n\t\t\t\t\tusersTable.name.name,\n\t\t\t\t)\n\t\t\t}) values (1, ${'John'}) returning ${usersTable.id1}, ${usersTable.name}`,\n\t\t);\n\t\texpect(inserted).toEqual([{ id1: 1, name: 'John' }]);\n\t});\n\n\ttest('insert via db.execute w/ query builder', async (ctx) => {\n\t\tconst { db } = ctx.gel;\n\t\tconst inserted = await db.execute<Pick<typeof usersTable.$inferSelect, 'id1' | 'name'>>(\n\t\t\tdb\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ id1: 1, name: 'John' })\n\t\t\t\t.returning({ id1: usersTable.id1, name: usersTable.name }),\n\t\t);\n\t\texpect(inserted).toEqual([{ id1: 1, name: 'John' }]);\n\t});\n\n\ttest('test force invalidate', async (ctx) => {\n\t\tconst { db } = ctx.cachedGel;\n\n\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'invalidate');\n\t\tawait db.$cache?.invalidate({ tables: 'users' });\n\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t});\n\n\ttest('default global config - no cache should be hit', async (ctx) => {\n\t\tconst { db } = ctx.cachedGel;\n\n\t\t// @ts-expect-error\n\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t// @ts-expect-error\n\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t// @ts-expect-error\n\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\tawait db.select().from(usersTable);\n\n\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t});\n\n\ttest('default global config + enable cache on select: get, put', async (ctx) => {\n\t\tconst { db } = ctx.cachedGel;\n\n\t\t// @ts-expect-error\n\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t// @ts-expect-error\n\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t// @ts-expect-error\n\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\tawait db.select().from(usersTable).$withCache();\n\n\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t});\n\n\ttest('default global config + enable cache on select + write: get, put, onMutate', async (ctx) => {\n\t\tconst { db } = ctx.cachedGel;\n\n\t\t// @ts-expect-error\n\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t// @ts-expect-error\n\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t// @ts-expect-error\n\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\tawait db.select().from(usersTable).$withCache({ config: { ex: 1 } });\n\n\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\tspyPut.mockClear();\n\t\tspyGet.mockClear();\n\t\tspyInvalidate.mockClear();\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\n\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t});\n\n\ttest('default global config + enable cache on select + disable invalidate: get, put', async (ctx) => {\n\t\tconst { db } = ctx.cachedGel;\n\n\t\t// @ts-expect-error\n\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t// @ts-expect-error\n\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t// @ts-expect-error\n\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\tawait db.select().from(usersTable).$withCache({ tag: 'custom', autoInvalidate: false, config: { ex: 1 } });\n\n\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\n\t\t// invalidate force\n\t\tawait db.$cache?.invalidate({ tags: ['custom'] });\n\t});\n\n\ttest('global: true + disable cache', async (ctx) => {\n\t\tconst { dbGlobalCached: db } = ctx.cachedGel;\n\n\t\t// @ts-expect-error\n\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t// @ts-expect-error\n\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t// @ts-expect-error\n\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\tawait db.select().from(usersTable).$withCache(false);\n\n\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t});\n\n\ttest('global: true - cache should be hit', async (ctx) => {\n\t\tconst { dbGlobalCached: db } = ctx.cachedGel;\n\n\t\t// @ts-expect-error\n\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t// @ts-expect-error\n\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t// @ts-expect-error\n\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\tawait db.select().from(usersTable);\n\n\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t});\n\n\ttest('global: true - cache: false on select - no cache hit', async (ctx) => {\n\t\tconst { dbGlobalCached: db } = ctx.cachedGel;\n\n\t\t// @ts-expect-error\n\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t// @ts-expect-error\n\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t// @ts-expect-error\n\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\tawait db.select().from(usersTable).$withCache(false);\n\n\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t});\n\n\ttest('global: true - disable invalidate - cache hit + no invalidate', async (ctx) => {\n\t\tconst { dbGlobalCached: db } = ctx.cachedGel;\n\n\t\t// @ts-expect-error\n\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t// @ts-expect-error\n\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t// @ts-expect-error\n\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\tawait db.select().from(usersTable).$withCache({ autoInvalidate: false });\n\n\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\tspyPut.mockClear();\n\t\tspyGet.mockClear();\n\t\tspyInvalidate.mockClear();\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\n\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t});\n\n\ttest('global: true - with custom tag', async (ctx) => {\n\t\tconst { dbGlobalCached: db } = ctx.cachedGel;\n\n\t\t// @ts-expect-error\n\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t// @ts-expect-error\n\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t// @ts-expect-error\n\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\tawait db.select().from(usersTable).$withCache({ tag: 'custom', autoInvalidate: false });\n\n\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\tawait db.insert(usersTable).values({ id1: 1, name: 'John' });\n\n\t\t// invalidate force\n\t\tawait db.$cache?.invalidate({ tags: ['custom'] });\n\t});\n\n\t// check select used tables\n\ttest('check simple select used tables', (ctx) => {\n\t\tconst { db } = ctx.cachedGel;\n\n\t\t// @ts-expect-error\n\t\texpect(db.select().from(usersTable).getUsedTables()).toStrictEqual(['users']);\n\t\t// @ts-expect-error\n\t\texpect(db.select().from(sql`${usersTable}`).getUsedTables()).toStrictEqual(['users']);\n\t});\n\t// check select+join used tables\n\ttest('select+join', (ctx) => {\n\t\tconst { db } = ctx.cachedGel;\n\n\t\t// @ts-expect-error\n\t\texpect(db.select().from(usersTable).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).getUsedTables())\n\t\t\t.toStrictEqual(['users', 'posts']);\n\t\texpect(\n\t\t\t// @ts-expect-error\n\t\t\tdb.select().from(sql`${usersTable}`).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).getUsedTables(),\n\t\t).toStrictEqual(['users', 'posts']);\n\t});\n\t// check select+2join used tables\n\ttest('select+2joins', (ctx) => {\n\t\tconst { db } = ctx.cachedGel;\n\n\t\texpect(\n\t\t\tdb.select().from(usersTable).leftJoin(\n\t\t\t\tpostsTable,\n\t\t\t\teq(usersTable.id1, postsTable.userId),\n\t\t\t).leftJoin(\n\t\t\t\talias(postsTable, 'post2'),\n\t\t\t\teq(usersTable.id1, postsTable.userId),\n\t\t\t)\n\t\t\t\t// @ts-expect-error\n\t\t\t\t.getUsedTables(),\n\t\t)\n\t\t\t.toStrictEqual(['users', 'posts']);\n\t\texpect(\n\t\t\tdb.select().from(sql`${usersTable}`).leftJoin(postsTable, eq(usersTable.id1, postsTable.userId)).leftJoin(\n\t\t\t\talias(postsTable, 'post2'),\n\t\t\t\teq(usersTable.id1, postsTable.userId),\n\t\t\t\t// @ts-expect-error\n\t\t\t).getUsedTables(),\n\t\t).toStrictEqual(['users', 'posts']);\n\t});\n\t// select subquery used tables\n\ttest('select+join', (ctx) => {\n\t\tconst { db } = ctx.cachedGel;\n\n\t\tconst sq = db.select().from(usersTable).where(eq(usersTable.id1, 42)).as('sq');\n\n\t\t// @ts-expect-error\n\t\texpect(db.select().from(sq).getUsedTables()).toStrictEqual(['users']);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/tests/imports/index.test.ts",
    "content": "import { afterAll, expect, it } from 'vitest';\nimport 'zx/globals';\nimport * as fs from 'fs';\nimport path from 'path';\n\n$.verbose = false;\n\nconst IMPORTS_FOLDER = 'tests/imports/files';\n\nconst folderPath = '../drizzle-orm/dist/package.json';\nconst pj = JSON.parse(fs.readFileSync(folderPath, 'utf8'));\n\nif (!fs.existsSync(IMPORTS_FOLDER)) {\n\tfs.mkdirSync(IMPORTS_FOLDER);\n}\n\nit('dynamic imports check for CommonJS', async () => {\n\tconst promises: ProcessPromise[] = [];\n\tfor (const [i, key] of Object.keys(pj['exports']).entries()) {\n\t\tconst o1 = path.join('drizzle-orm', key);\n\t\tif (\n\t\t\to1.startsWith('drizzle-orm/bun-sqlite') || o1.startsWith('drizzle-orm/pglite')\n\t\t\t|| o1.startsWith('drizzle-orm/expo-sqlite') || o1.startsWith('drizzle-orm/libsql/wasm')\n\t\t\t|| o1.startsWith('drizzle-orm/bun-sql')\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tfs.writeFileSync(`${IMPORTS_FOLDER}/imports_${i}.cjs`, 'requ');\n\t\tfs.appendFileSync(`${IMPORTS_FOLDER}/imports_${i}.cjs`, 'ire(\"' + o1 + '\");\\n', {});\n\n\t\t// fs.writeFileSync(`${IMPORTS_FOLDER}/imports_${i}.mjs`, 'imp');\n\t\t// fs.appendFileSync(`${IMPORTS_FOLDER}/imports_${i}.mjs`, 'ort \"' + o1 + '\"\\n', {});\n\n\t\tpromises.push(\n\t\t\t$`node ${IMPORTS_FOLDER}/imports_${i}.cjs`.nothrow(),\n\t\t\t// $`node ${IMPORTS_FOLDER}/imports_${i}.mjs`.nothrow(),\n\t\t);\n\t}\n\tconst results = await Promise.all(promises);\n\n\tfor (const result of results) {\n\t\texpect(result.exitCode, result.message).toBe(0);\n\t}\n});\n\nit('dynamic imports check for ESM', async () => {\n\tconst promises: ProcessPromise[] = [];\n\tfor (const [i, key] of Object.keys(pj['exports']).entries()) {\n\t\tconst o1 = path.join('drizzle-orm', key);\n\t\tif (\n\t\t\to1.startsWith('drizzle-orm/bun-sqlite') || o1.startsWith('drizzle-orm/expo-sqlite')\n\t\t\t|| o1.startsWith('drizzle-orm/bun-sql')\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tfs.writeFileSync(`${IMPORTS_FOLDER}/imports_${i}.mjs`, 'imp');\n\t\tfs.appendFileSync(`${IMPORTS_FOLDER}/imports_${i}.mjs`, 'ort \"' + o1 + '\"\\n', {});\n\t\tpromises.push(\n\t\t\t$`node ${IMPORTS_FOLDER}/imports_${i}.mjs`.nothrow(),\n\t\t\t$`node --import import-in-the-middle/hook.mjs ${IMPORTS_FOLDER}/imports_${i}.mjs`.nothrow(),\n\t\t);\n\t}\n\n\tconst results = await Promise.all(promises);\n\n\tfor (const result of results) {\n\t\texpect(result.exitCode, result.message).toBe(0);\n\t}\n});\n\nafterAll(() => {\n\tfs.rmdirSync(IMPORTS_FOLDER, { recursive: true });\n});\n"
  },
  {
    "path": "integration-tests/tests/mysql/mysql-common-cache.ts",
    "content": "import { eq, getTableName, is, sql, Table } from 'drizzle-orm';\nimport type { MutationOption } from 'drizzle-orm/cache/core';\nimport { Cache } from 'drizzle-orm/cache/core';\nimport type { CacheConfig } from 'drizzle-orm/cache/core/types';\nimport type { MySqlDatabase } from 'drizzle-orm/mysql-core';\nimport { alias, boolean, int, json, mysqlTable, serial, text, timestamp } from 'drizzle-orm/mysql-core';\nimport Keyv from 'keyv';\nimport { beforeEach, describe, expect, test, vi } from 'vitest';\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nexport class TestGlobalCache extends Cache {\n\tprivate globalTtl: number = 1000;\n\tprivate usedTablesPerKey: Record<string, string[]> = {};\n\n\tconstructor(private kv: Keyv = new Keyv()) {\n\t\tsuper();\n\t}\n\n\toverride strategy(): 'explicit' | 'all' {\n\t\treturn 'all';\n\t}\n\toverride async get(key: string, _tables: string[], _isTag: boolean): Promise<any[] | undefined> {\n\t\tconst res = await this.kv.get(key) ?? undefined;\n\t\treturn res;\n\t}\n\toverride async put(\n\t\tkey: string,\n\t\tresponse: any,\n\t\ttables: string[],\n\t\tisTag: boolean,\n\t\tconfig?: CacheConfig,\n\t): Promise<void> {\n\t\tawait this.kv.set(key, response, config ? config.ex : this.globalTtl);\n\t\tfor (const table of tables) {\n\t\t\tconst keys = this.usedTablesPerKey[table];\n\t\t\tif (keys === undefined) {\n\t\t\t\tthis.usedTablesPerKey[table] = [key];\n\t\t\t} else {\n\t\t\t\tkeys.push(key);\n\t\t\t}\n\t\t}\n\t}\n\toverride async onMutate(params: MutationOption): Promise<void> {\n\t\tconst tagsArray = params.tags ? Array.isArray(params.tags) ? params.tags : [params.tags] : [];\n\t\tconst tablesArray = params.tables ? Array.isArray(params.tables) ? params.tables : [params.tables] : [];\n\n\t\tconst keysToDelete = new Set<string>();\n\n\t\tfor (const table of tablesArray) {\n\t\t\tconst tableName = is(table, Table) ? getTableName(table) : table as string;\n\t\t\tconst keys = this.usedTablesPerKey[tableName] ?? [];\n\t\t\tfor (const key of keys) keysToDelete.add(key);\n\t\t}\n\n\t\tif (keysToDelete.size > 0 || tagsArray.length > 0) {\n\t\t\tfor (const tag of tagsArray) {\n\t\t\t\tawait this.kv.delete(tag);\n\t\t\t}\n\n\t\t\tfor (const key of keysToDelete) {\n\t\t\t\tawait this.kv.delete(key);\n\t\t\t\tfor (const table of tablesArray) {\n\t\t\t\t\tconst tableName = is(table, Table) ? getTableName(table) : table as string;\n\t\t\t\t\tthis.usedTablesPerKey[tableName] = [];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nexport class TestCache extends TestGlobalCache {\n\toverride strategy(): 'explicit' | 'all' {\n\t\treturn 'explicit';\n\t}\n}\n\ndeclare module 'vitest' {\n\tinterface TestContext {\n\t\tcachedMySQL: {\n\t\t\tdb: MySqlDatabase<any, any>;\n\t\t\tdbGlobalCached: MySqlDatabase<any, any>;\n\t\t};\n\t}\n}\n\nconst usersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\nconst postsTable = mysqlTable('posts', {\n\tid: serial().primaryKey(),\n\tdescription: text().notNull(),\n\tuserId: int('city_id').references(() => usersTable.id),\n});\n\nexport function tests() {\n\tdescribe('common_cache', () => {\n\t\tbeforeEach(async (ctx) => {\n\t\t\tconst { db, dbGlobalCached } = ctx.cachedMySQL;\n\t\t\tawait db.execute(sql`drop table if exists users`);\n\t\t\tawait db.execute(sql`drop table if exists posts`);\n\t\t\tawait db.$cache?.invalidate({ tables: 'users' });\n\t\t\tawait dbGlobalCached.$cache?.invalidate({ tables: 'users' });\n\t\t\t// public users\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tverified boolean not null default false,\n\t\t\t\t\t\tjsonb json,\n\t\t\t\t\t\tcreated_at timestamp not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table posts (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tdescription text not null,\n\t\t\t\t\t\tuser_id int\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t});\n\n\t\ttest('test force invalidate', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedMySQL;\n\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'invalidate');\n\t\t\tawait db.$cache?.invalidate({ tables: 'users' });\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t\t});\n\n\t\ttest('default global config - no cache should be hit', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedMySQL;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('default global config + enable cache on select: get, put', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedMySQL;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache();\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('default global config + enable cache on select + write: get, put, onMutate', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedMySQL;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ config: { ex: 1 } });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tspyPut.mockClear();\n\t\t\tspyGet.mockClear();\n\t\t\tspyInvalidate.mockClear();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t\t});\n\n\t\ttest('default global config + enable cache on select + disable invalidate: get, put', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedMySQL;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ tag: 'custom', autoInvalidate: false, config: { ex: 1 } });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\t// invalidate force\n\t\t\tawait db.$cache?.invalidate({ tags: ['custom'] });\n\t\t});\n\n\t\ttest('global: true + disable cache', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedMySQL;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache(false);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('global: true - cache should be hit', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedMySQL;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('global: true - cache: false on select - no cache hit', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedMySQL;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache(false);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('global: true - disable invalidate - cache hit + no invalidate', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedMySQL;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ autoInvalidate: false });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tspyPut.mockClear();\n\t\t\tspyGet.mockClear();\n\t\t\tspyInvalidate.mockClear();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t\t});\n\n\t\ttest('global: true - with custom tag', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedMySQL;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ tag: 'custom', autoInvalidate: false });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\t// invalidate force\n\t\t\tawait db.$cache?.invalidate({ tags: ['custom'] });\n\t\t});\n\n\t\t// check select used tables\n\t\ttest('check simple select used tables', (ctx) => {\n\t\t\tconst { db } = ctx.cachedMySQL;\n\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(usersTable).getUsedTables()).toStrictEqual(['users']);\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(sql`${usersTable}`).getUsedTables()).toStrictEqual(['users']);\n\t\t});\n\t\t// check select+join used tables\n\t\ttest('select+join', (ctx) => {\n\t\t\tconst { db } = ctx.cachedMySQL;\n\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(usersTable).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).getUsedTables())\n\t\t\t\t.toStrictEqual(['users', 'posts']);\n\t\t\texpect(\n\t\t\t\t// @ts-expect-error\n\t\t\t\tdb.select().from(sql`${usersTable}`).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).getUsedTables(),\n\t\t\t).toStrictEqual(['users', 'posts']);\n\t\t});\n\t\t// check select+2join used tables\n\t\ttest('select+2joins', (ctx) => {\n\t\t\tconst { db } = ctx.cachedMySQL;\n\n\t\t\texpect(\n\t\t\t\tdb.select().from(usersTable).leftJoin(\n\t\t\t\t\tpostsTable,\n\t\t\t\t\teq(usersTable.id, postsTable.userId),\n\t\t\t\t).leftJoin(\n\t\t\t\t\talias(postsTable, 'post2'),\n\t\t\t\t\teq(usersTable.id, postsTable.userId),\n\t\t\t\t)\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t.getUsedTables(),\n\t\t\t)\n\t\t\t\t.toStrictEqual(['users', 'posts']);\n\t\t\texpect(\n\t\t\t\tdb.select().from(sql`${usersTable}`).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).leftJoin(\n\t\t\t\t\talias(postsTable, 'post2'),\n\t\t\t\t\teq(usersTable.id, postsTable.userId),\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t).getUsedTables(),\n\t\t\t).toStrictEqual(['users', 'posts']);\n\t\t});\n\t\t// select subquery used tables\n\t\ttest('select+join', (ctx) => {\n\t\t\tconst { db } = ctx.cachedMySQL;\n\n\t\t\tconst sq = db.select().from(usersTable).where(eq(usersTable.id, 42)).as('sq');\n\t\t\tdb.select().from(sq);\n\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(sq).getUsedTables()).toStrictEqual(['users']);\n\t\t});\n\t});\n}\n"
  },
  {
    "path": "integration-tests/tests/mysql/mysql-common.ts",
    "content": "/* eslint-disable @typescript-eslint/no-unused-vars */\nimport 'dotenv/config';\nimport Docker from 'dockerode';\nimport {\n\tand,\n\tasc,\n\tavg,\n\tavgDistinct,\n\tcount,\n\tcountDistinct,\n\teq,\n\texists,\n\tgetTableColumns,\n\tgt,\n\tgte,\n\tinArray,\n\tlike,\n\tlt,\n\tmax,\n\tmin,\n\tName,\n\tnot,\n\tnotInArray,\n\tsql,\n\tsum,\n\tsumDistinct,\n\tTransactionRollbackError,\n} from 'drizzle-orm';\nimport type { MySqlDatabase } from 'drizzle-orm/mysql-core';\nimport {\n\talias,\n\tbigint,\n\tbinary,\n\tboolean,\n\tchar,\n\tdate,\n\tdatetime,\n\tdecimal,\n\tdouble,\n\texcept,\n\texceptAll,\n\tfloat,\n\tforeignKey,\n\tgetTableConfig,\n\tgetViewConfig,\n\tindex,\n\tint,\n\tintersect,\n\tintersectAll,\n\tjson,\n\tmediumint,\n\tmysqlEnum,\n\tmysqlSchema,\n\tmysqlTable,\n\tmysqlTableCreator,\n\tmysqlView,\n\tprimaryKey,\n\treal,\n\tserial,\n\tsmallint,\n\ttext,\n\ttime,\n\ttimestamp,\n\ttinyint,\n\tunion,\n\tunionAll,\n\tunique,\n\tuniqueIndex,\n\tuniqueKeyName,\n\tvarbinary,\n\tvarchar,\n\tyear,\n} from 'drizzle-orm/mysql-core';\nimport type { MySqlRemoteDatabase } from 'drizzle-orm/mysql-proxy';\nimport { migrate } from 'drizzle-orm/mysql2/migrator';\nimport getPort from 'get-port';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeEach, describe, expect, expectTypeOf, test } from 'vitest';\nimport { Expect, toLocalDate } from '~/utils.ts';\nimport type { Equal } from '~/utils.ts';\n\ntype TestMySQLDB = MySqlDatabase<any, any>;\n\ndeclare module 'vitest' {\n\tinterface TestContext {\n\t\tmysql: {\n\t\t\tdb: TestMySQLDB;\n\t\t};\n\t\tmysqlProxy: {\n\t\t\tdb: MySqlRemoteDatabase;\n\t\t};\n\t}\n}\n\nconst ENABLE_LOGGING = false;\n\nconst allTypesTable = mysqlTable('all_types', {\n\tserial: serial('serial'),\n\tbigint53: bigint('bigint53', {\n\t\tmode: 'number',\n\t}),\n\tbigint64: bigint('bigint64', {\n\t\tmode: 'bigint',\n\t}),\n\tbinary: binary('binary'),\n\tboolean: boolean('boolean'),\n\tchar: char('char'),\n\tdate: date('date', {\n\t\tmode: 'date',\n\t}),\n\tdateStr: date('date_str', {\n\t\tmode: 'string',\n\t}),\n\tdatetime: datetime('datetime', {\n\t\tmode: 'date',\n\t}),\n\tdatetimeStr: datetime('datetime_str', {\n\t\tmode: 'string',\n\t}),\n\tdecimal: decimal('decimal'),\n\tdecimalNum: decimal('decimal_num', {\n\t\tscale: 30,\n\t\tmode: 'number',\n\t}),\n\tdecimalBig: decimal('decimal_big', {\n\t\tscale: 30,\n\t\tmode: 'bigint',\n\t}),\n\tdouble: double('double'),\n\tfloat: float('float'),\n\tint: int('int'),\n\tjson: json('json'),\n\tmedInt: mediumint('med_int'),\n\tsmallInt: smallint('small_int'),\n\treal: real('real'),\n\ttext: text('text'),\n\ttime: time('time'),\n\ttimestamp: timestamp('timestamp', {\n\t\tmode: 'date',\n\t}),\n\ttimestampStr: timestamp('timestamp_str', {\n\t\tmode: 'string',\n\t}),\n\ttinyInt: tinyint('tiny_int'),\n\tvarbin: varbinary('varbin', {\n\t\tlength: 16,\n\t}),\n\tvarchar: varchar('varchar', {\n\t\tlength: 255,\n\t}),\n\tyear: year('year'),\n\tenum: mysqlEnum('enum', ['enV1', 'enV2']),\n});\n\nconst usersTable = mysqlTable('userstest', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\nconst users2Table = mysqlTable('users2', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: int('city_id').references(() => citiesTable.id),\n});\n\nconst citiesTable = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nconst usersOnUpdate = mysqlTable('users_on_update', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tupdateCounter: int('update_counter').default(sql`1`).$onUpdateFn(() => sql`update_counter + 1`),\n\tupdatedAt: datetime('updated_at', { mode: 'date', fsp: 3 }).$onUpdate(() => new Date()),\n\tuppercaseName: text('uppercase_name').$onUpdateFn(() => sql`upper(name)`),\n\talwaysNull: text('always_null').$type<string | null>().$onUpdateFn(() => null), // need to add $type because $onUpdate add a default value\n});\n\nconst datesTable = mysqlTable('datestable', {\n\tdate: date('date'),\n\tdateAsString: date('date_as_string', { mode: 'string' }),\n\ttime: time('time', { fsp: 1 }),\n\tdatetime: datetime('datetime', { fsp: 2 }),\n\tdatetimeAsString: datetime('datetime_as_string', { fsp: 2, mode: 'string' }),\n\ttimestamp: timestamp('timestamp', { fsp: 3 }),\n\ttimestampAsString: timestamp('timestamp_as_string', { fsp: 3, mode: 'string' }),\n\tyear: year('year'),\n});\n\nconst coursesTable = mysqlTable('courses', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcategoryId: int('category_id').references(() => courseCategoriesTable.id),\n});\n\nconst courseCategoriesTable = mysqlTable('course_categories', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nconst orders = mysqlTable('orders', {\n\tid: serial('id').primaryKey(),\n\tregion: text('region').notNull(),\n\tproduct: text('product').notNull().$default(() => 'random_string'),\n\tamount: int('amount').notNull(),\n\tquantity: int('quantity').notNull(),\n});\n\nconst usersMigratorTable = mysqlTable('users12', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => {\n\treturn {\n\t\tname: uniqueIndex('').on(table.name).using('btree'),\n\t};\n});\n\n// To test aggregate functions\nconst aggregateTable = mysqlTable('aggregate_table', {\n\tid: serial('id').notNull(),\n\tname: text('name').notNull(),\n\ta: int('a'),\n\tb: int('b'),\n\tc: int('c'),\n\tnullOnly: int('null_only'),\n});\n\n// To test another schema and multischema\nconst mySchema = mysqlSchema(`mySchema`);\n\nconst usersMySchemaTable = mySchema.table('userstest', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\nconst users2MySchemaTable = mySchema.table('users2', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: int('city_id').references(() => citiesTable.id),\n});\n\nconst citiesMySchemaTable = mySchema.table('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nlet mysqlContainer: Docker.Container;\nexport async function createDockerDB(): Promise<{ connectionString: string; container: Docker.Container }> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'mysql:8';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tmysqlContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait mysqlContainer.start();\n\tawait new Promise((resolve) => setTimeout(resolve, 4000));\n\n\treturn { connectionString: `mysql://root:mysql@127.0.0.1:${port}/drizzle`, container: mysqlContainer };\n}\n\nafterAll(async () => {\n\tawait mysqlContainer?.stop().catch(console.error);\n});\n\nexport function tests(driver?: string) {\n\tdescribe('common', () => {\n\t\t// afterAll(async () => {\n\t\t// \tawait mysqlContainer?.stop().catch(console.error);\n\t\t// });\n\n\t\tbeforeEach(async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`drop table if exists userstest`);\n\t\t\tawait db.execute(sql`drop table if exists users2`);\n\t\t\tawait db.execute(sql`drop table if exists cities`);\n\t\t\tawait db.execute(sql`drop table if exists \\`all_types\\``);\n\n\t\t\tif (driver !== 'planetscale') {\n\t\t\t\tawait db.execute(sql`drop schema if exists \\`mySchema\\``);\n\t\t\t\tawait db.execute(sql`create schema if not exists \\`mySchema\\``);\n\t\t\t}\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table userstest (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tverified boolean not null default false,\n\t\t\t\t\t\tjsonb json,\n\t\t\t\t\t\tcreated_at timestamp not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users2 (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tcity_id int references cities(id)\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table cities (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tif (driver !== 'planetscale') {\n\t\t\t\t// mySchema\n\t\t\t\tawait db.execute(\n\t\t\t\t\tsql`\n\t\t\t\t\t\tcreate table \\`mySchema\\`.\\`userstest\\` (\n\t\t\t\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\t\t\t\\`verified\\` boolean not null default false,\n\t\t\t\t\t\t\t\\`jsonb\\` json,\n\t\t\t\t\t\t\t\\`created_at\\` timestamp not null default now()\n\t\t\t\t\t\t)\n\t\t\t\t\t`,\n\t\t\t\t);\n\n\t\t\t\tawait db.execute(\n\t\t\t\t\tsql`\n\t\t\t\t\t\tcreate table \\`mySchema\\`.\\`cities\\` (\n\t\t\t\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\t\t\t\\`name\\` text not null\n\t\t\t\t\t\t)\n\t\t\t\t\t`,\n\t\t\t\t);\n\n\t\t\t\tawait db.execute(\n\t\t\t\t\tsql`\n\t\t\t\t\t\tcreate table \\`mySchema\\`.\\`users2\\` (\n\t\t\t\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\t\t\t\\`city_id\\` int references \\`mySchema\\`.\\`cities\\`(\\`id\\`)\n\t\t\t\t\t\t)\n\t\t\t\t\t`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tasync function setupReturningFunctionsTest(db: MySqlDatabase<any, any>) {\n\t\t\tawait db.execute(sql`drop table if exists \\`users_default_fn\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`users_default_fn\\` (\n\t\t\t\t\t\t\\`id\\` varchar(256) primary key,\n\t\t\t\t\t\t\\`name\\` text not null\n\t\t\t\t\t);\n\t\t\t\t`,\n\t\t\t);\n\t\t}\n\n\t\tasync function setupSetOperationTest(db: TestMySQLDB) {\n\t\t\tawait db.execute(sql`drop table if exists \\`users2\\``);\n\t\t\tawait db.execute(sql`drop table if exists \\`cities\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`users2\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`name\\` text not null,\n\t\t\t\t\t    \\`city_id\\` int references \\`cities\\`(\\`id\\`)\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`cities\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`name\\` text not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(citiesTable).values([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t{ id: 2, name: 'Jane', cityId: 2 },\n\t\t\t\t{ id: 3, name: 'Jack', cityId: 3 },\n\t\t\t\t{ id: 4, name: 'Peter', cityId: 3 },\n\t\t\t\t{ id: 5, name: 'Ben', cityId: 2 },\n\t\t\t\t{ id: 6, name: 'Jill', cityId: 1 },\n\t\t\t\t{ id: 7, name: 'Mary', cityId: 2 },\n\t\t\t\t{ id: 8, name: 'Sally', cityId: 1 },\n\t\t\t]);\n\t\t}\n\n\t\tasync function setupAggregateFunctionsTest(db: TestMySQLDB) {\n\t\t\tawait db.execute(sql`drop table if exists \\`aggregate_table\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`aggregate_table\\` (\n\t\t\t\t\t    \\`id\\` integer primary key auto_increment not null,\n\t\t\t\t\t    \\`name\\` text not null,\n\t\t\t\t\t    \\`a\\` integer,\n\t\t\t\t\t    \\`b\\` integer,\n\t\t\t\t\t    \\`c\\` integer,\n\t\t\t\t\t    \\`null_only\\` integer\n\t\t\t\t\t);\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.insert(aggregateTable).values([\n\t\t\t\t{ name: 'value 1', a: 5, b: 10, c: 20 },\n\t\t\t\t{ name: 'value 1', a: 5, b: 20, c: 30 },\n\t\t\t\t{ name: 'value 2', a: 10, b: 50, c: 60 },\n\t\t\t\t{ name: 'value 3', a: 20, b: 20, c: null },\n\t\t\t\t{ name: 'value 4', a: null, b: 90, c: 120 },\n\t\t\t\t{ name: 'value 5', a: 80, b: 10, c: null },\n\t\t\t\t{ name: 'value 6', a: null, b: null, c: 150 },\n\t\t\t]);\n\t\t}\n\n\t\ttest('table config: unsigned ints', async () => {\n\t\t\tconst unsignedInts = mysqlTable('cities1', {\n\t\t\t\tbigint: bigint('bigint', { mode: 'number', unsigned: true }),\n\t\t\t\tint: int('int', { unsigned: true }),\n\t\t\t\tsmallint: smallint('smallint', { unsigned: true }),\n\t\t\t\tmediumint: mediumint('mediumint', { unsigned: true }),\n\t\t\t\ttinyint: tinyint('tinyint', { unsigned: true }),\n\t\t\t});\n\n\t\t\tconst tableConfig = getTableConfig(unsignedInts);\n\n\t\t\tconst bigintColumn = tableConfig.columns.find((c) => c.name === 'bigint')!;\n\t\t\tconst intColumn = tableConfig.columns.find((c) => c.name === 'int')!;\n\t\t\tconst smallintColumn = tableConfig.columns.find((c) => c.name === 'smallint')!;\n\t\t\tconst mediumintColumn = tableConfig.columns.find((c) => c.name === 'mediumint')!;\n\t\t\tconst tinyintColumn = tableConfig.columns.find((c) => c.name === 'tinyint')!;\n\n\t\t\texpect(bigintColumn.getSQLType()).toBe('bigint unsigned');\n\t\t\texpect(intColumn.getSQLType()).toBe('int unsigned');\n\t\t\texpect(smallintColumn.getSQLType()).toBe('smallint unsigned');\n\t\t\texpect(mediumintColumn.getSQLType()).toBe('mediumint unsigned');\n\t\t\texpect(tinyintColumn.getSQLType()).toBe('tinyint unsigned');\n\t\t});\n\n\t\ttest('table config: signed ints', async () => {\n\t\t\tconst unsignedInts = mysqlTable('cities1', {\n\t\t\t\tbigint: bigint('bigint', { mode: 'number' }),\n\t\t\t\tint: int('int'),\n\t\t\t\tsmallint: smallint('smallint'),\n\t\t\t\tmediumint: mediumint('mediumint'),\n\t\t\t\ttinyint: tinyint('tinyint'),\n\t\t\t});\n\n\t\t\tconst tableConfig = getTableConfig(unsignedInts);\n\n\t\t\tconst bigintColumn = tableConfig.columns.find((c) => c.name === 'bigint')!;\n\t\t\tconst intColumn = tableConfig.columns.find((c) => c.name === 'int')!;\n\t\t\tconst smallintColumn = tableConfig.columns.find((c) => c.name === 'smallint')!;\n\t\t\tconst mediumintColumn = tableConfig.columns.find((c) => c.name === 'mediumint')!;\n\t\t\tconst tinyintColumn = tableConfig.columns.find((c) => c.name === 'tinyint')!;\n\n\t\t\texpect(bigintColumn.getSQLType()).toBe('bigint');\n\t\t\texpect(intColumn.getSQLType()).toBe('int');\n\t\t\texpect(smallintColumn.getSQLType()).toBe('smallint');\n\t\t\texpect(mediumintColumn.getSQLType()).toBe('mediumint');\n\t\t\texpect(tinyintColumn.getSQLType()).toBe('tinyint');\n\t\t});\n\n\t\ttest('table config: foreign keys name', async () => {\n\t\t\tconst table = mysqlTable('cities', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstate: text('state'),\n\t\t\t}, (t) => ({\n\t\t\t\tf: foreignKey({ foreignColumns: [t.id], columns: [t.id], name: 'custom_fk' }),\n\t\t\t}));\n\n\t\t\tconst tableConfig = getTableConfig(table);\n\n\t\t\texpect(tableConfig.foreignKeys).toHaveLength(1);\n\t\t\texpect(tableConfig.foreignKeys[0]!.getName()).toBe('custom_fk');\n\t\t});\n\n\t\ttest('table config: primary keys name', async () => {\n\t\t\tconst table = mysqlTable('cities', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstate: text('state'),\n\t\t\t}, (t) => ({\n\t\t\t\tf: primaryKey({ columns: [t.id, t.name], name: 'custom_pk' }),\n\t\t\t}));\n\n\t\t\tconst tableConfig = getTableConfig(table);\n\n\t\t\texpect(tableConfig.primaryKeys).toHaveLength(1);\n\t\t\texpect(tableConfig.primaryKeys[0]!.getName()).toBe('custom_pk');\n\t\t});\n\n\t\ttest('table configs: unique third param', async () => {\n\t\t\tconst cities1Table = mysqlTable('cities1', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstate: text('state'),\n\t\t\t}, (t) => ({\n\t\t\t\tf: unique('custom_name').on(t.name, t.state),\n\t\t\t\tf1: unique('custom_name1').on(t.name, t.state),\n\t\t\t}));\n\n\t\t\tconst tableConfig = getTableConfig(cities1Table);\n\n\t\t\texpect(tableConfig.uniqueConstraints).toHaveLength(2);\n\n\t\t\texpect(tableConfig.uniqueConstraints[0]?.name).toBe('custom_name');\n\t\t\texpect(tableConfig.uniqueConstraints[0]?.columns.map((t) => t.name)).toEqual(['name', 'state']);\n\n\t\t\texpect(tableConfig.uniqueConstraints[1]?.name).toBe('custom_name1');\n\t\t\texpect(tableConfig.uniqueConstraints[1]?.columns.map((t) => t.name)).toEqual(['name', 'state']);\n\t\t});\n\n\t\ttest('table configs: unique in column', async () => {\n\t\t\tconst cities1Table = mysqlTable('cities1', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull().unique(),\n\t\t\t\tstate: text('state').unique('custom'),\n\t\t\t\tfield: text('field').unique('custom_field'),\n\t\t\t});\n\n\t\t\tconst tableConfig = getTableConfig(cities1Table);\n\n\t\t\tconst columnName = tableConfig.columns.find((it) => it.name === 'name');\n\t\t\texpect(columnName?.uniqueName).toBe(uniqueKeyName(cities1Table, [columnName!.name]));\n\t\t\texpect(columnName?.isUnique).toBeTruthy();\n\n\t\t\tconst columnState = tableConfig.columns.find((it) => it.name === 'state');\n\t\t\texpect(columnState?.uniqueName).toBe('custom');\n\t\t\texpect(columnState?.isUnique).toBeTruthy();\n\n\t\t\tconst columnField = tableConfig.columns.find((it) => it.name === 'field');\n\t\t\texpect(columnField?.uniqueName).toBe('custom_field');\n\t\t\texpect(columnField?.isUnique).toBeTruthy();\n\t\t});\n\n\t\ttest('select all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst result = await db.select().from(usersTable);\n\n\t\t\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\t// not timezone based timestamp, thats why it should not work here\n\t\t\t// t.assert(Math.abs(result[0]!.createdAt.getTime() - now) < 2000);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('select sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db.select({\n\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t}).from(usersTable);\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('select typed sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db.select({\n\t\t\t\tname: sql<string>`upper(${usersTable.name})`,\n\t\t\t}).from(usersTable);\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('select with empty array in inArray', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(inArray(usersTable.id, []));\n\n\t\t\texpect(result).toEqual([]);\n\t\t});\n\n\t\ttest('select with empty array in notInArray', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(notInArray(usersTable.id, []));\n\n\t\t\texpect(result).toEqual([{ name: 'JOHN' }, { name: 'JANE' }, { name: 'JANE' }]);\n\t\t});\n\n\t\ttest('select distinct', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst usersDistinctTable = mysqlTable('users_distinct', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${usersDistinctTable}`);\n\t\t\tawait db.execute(sql`create table ${usersDistinctTable} (id int, name text)`);\n\n\t\t\tawait db.insert(usersDistinctTable).values([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'John' },\n\t\t\t\t{ id: 1, name: 'Jane' },\n\t\t\t]);\n\t\t\tconst users = await db.selectDistinct().from(usersDistinctTable).orderBy(\n\t\t\t\tusersDistinctTable.id,\n\t\t\t\tusersDistinctTable.name,\n\t\t\t);\n\n\t\t\tawait db.execute(sql`drop table ${usersDistinctTable}`);\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane' }, { id: 1, name: 'John' }, { id: 2, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst [result, _] = await db.insert(usersTable).values({ name: 'John' });\n\n\t\t\texpect(result.insertId).toBe(1);\n\t\t});\n\n\t\ttest('delete returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\t\t\texpect(users[0].affectedRows).toBe(1);\n\t\t});\n\n\t\ttest('update returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\t\t\texpect(users[0].changedRows).toBe(1);\n\t\t});\n\n\t\ttest('update with returning all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst updatedUsers = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\t\t\tconst users = await db.select().from(usersTable).where(eq(usersTable.id, 1));\n\n\t\t\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\t\t\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\t// not timezone based timestamp, thats why it should not work here\n\t\t\t// t.assert(Math.abs(users[0]!.createdAt.getTime() - now) < 2000);\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane', verified: false, jsonb: null, createdAt: users[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('update with returning partial', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst updatedUsers = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\t\t\tconst users = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\t\t\teq(usersTable.id, 1),\n\t\t\t);\n\n\t\t\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n\t\t});\n\n\t\ttest('delete with returning all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst deletedUser = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\t\t\texpect(deletedUser[0].affectedRows).toBe(1);\n\t\t});\n\n\t\ttest('delete with returning partial', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst deletedUser = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\t\t\texpect(deletedUser[0].affectedRows).toBe(1);\n\t\t});\n\n\t\ttest('insert + select', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst result = await db.select().from(usersTable);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\n\t\t\tawait db.insert(usersTable).values({ name: 'Jane' });\n\t\t\tconst result2 = await db.select().from(usersTable);\n\t\t\texpect(result2).toEqual([\n\t\t\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result2[0]!.createdAt },\n\t\t\t\t{ id: 2, name: 'Jane', verified: false, jsonb: null, createdAt: result2[1]!.createdAt },\n\t\t\t]);\n\t\t});\n\n\t\ttest('json insert', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John', jsonb: ['foo', 'bar'] });\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t\tjsonb: usersTable.jsonb,\n\t\t\t}).from(usersTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', jsonb: ['foo', 'bar'] }]);\n\t\t});\n\n\t\ttest('insert with overridden default values', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John', verified: true });\n\t\t\tconst result = await db.select().from(usersTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: true, jsonb: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('insert many', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Austin', verified: true },\n\t\t\t]);\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t\tjsonb: usersTable.jsonb,\n\t\t\t\tverified: usersTable.verified,\n\t\t\t}).from(usersTable);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t\t\t]);\n\t\t});\n\n\t\ttest('insert many with returning', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst result = await db.insert(usersTable).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Austin', verified: true },\n\t\t\t]);\n\n\t\t\texpect(result[0].affectedRows).toBe(4);\n\t\t});\n\n\t\ttest('select with group by as field', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(usersTable.name);\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('select with exists', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst user = alias(usersTable, 'user');\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable).where(\n\t\t\t\texists(\n\t\t\t\t\tdb.select({ one: sql`1` }).from(user).where(and(eq(usersTable.name, 'John'), eq(user.id, usersTable.id))),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\texpect(result).toEqual([{ name: 'John' }]);\n\t\t});\n\n\t\ttest('select with group by as sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(sql`${usersTable.name}`);\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('$default function', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`orders\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`orders\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`region\\` text not null,\n\t\t\t\t\t    \\`product\\` text not null,\n\t\t\t\t\t    \\`amount\\` int not null,\n\t\t\t\t\t    \\`quantity\\` int not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(orders).values({ id: 1, region: 'Ukraine', amount: 1, quantity: 1 });\n\t\t\tconst selectedOrder = await db.select().from(orders);\n\n\t\t\texpect(selectedOrder).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t\tamount: 1,\n\t\t\t\tquantity: 1,\n\t\t\t\tregion: 'Ukraine',\n\t\t\t\tproduct: 'random_string',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('$default with empty array', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`s_orders\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`s_orders\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`region\\` text default ('Ukraine'),\n\t\t\t\t\t    \\`product\\` text not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tconst users = mysqlTable('s_orders', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tregion: text('region').default('Ukraine'),\n\t\t\t\tproduct: text('product').$defaultFn(() => 'random_string'),\n\t\t\t});\n\n\t\t\tawait db.insert(users).values({});\n\t\t\tconst selectedOrder = await db.select().from(users);\n\n\t\t\texpect(selectedOrder).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t\tregion: 'Ukraine',\n\t\t\t\tproduct: 'random_string',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('select with group by as sql + column', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(sql`${usersTable.name}`, usersTable.id);\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('select with group by as column + sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, sql`${usersTable.name}`);\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('select with group by complex query', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t\t\t.orderBy(asc(usersTable.name))\n\t\t\t\t.limit(1);\n\n\t\t\texpect(result).toEqual([{ name: 'Jane' }]);\n\t\t});\n\n\t\ttest('build query', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst query = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, usersTable.name)\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql: `select \\`id\\`, \\`name\\` from \\`userstest\\` group by \\`userstest\\`.\\`id\\`, \\`userstest\\`.\\`name\\``,\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t});\n\n\t\ttest('Query check: Insert all defaults in 1 row', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tconst query = db\n\t\t\t\t.insert(users)\n\t\t\t\t.values({})\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql: 'insert into `users` (`id`, `name`, `state`) values (default, default, default)',\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t});\n\n\t\ttest('Query check: Insert all defaults in multiple rows', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state').default('UA'),\n\t\t\t});\n\n\t\t\tconst query = db\n\t\t\t\t.insert(users)\n\t\t\t\t.values([{}, {}])\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql:\n\t\t\t\t\t'insert into `users` (`id`, `name`, `state`) values (default, default, default), (default, default, default)',\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t});\n\n\t\ttest('Insert all defaults in 1 row', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('empty_insert_single', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial primary key, name text default ('Dan'), state text)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values({});\n\n\t\t\tconst res = await db.select().from(users);\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'Dan', state: null }]);\n\t\t});\n\n\t\ttest('Insert all defaults in multiple rows', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('empty_insert_multiple', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial primary key, name text default ('Dan'), state text)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values([{}, {}]);\n\n\t\t\tconst res = await db.select().from(users);\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'Dan', state: null }, { id: 2, name: 'Dan', state: null }]);\n\t\t});\n\n\t\ttest('build query insert with onDuplicate', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst query = db.insert(usersTable)\n\t\t\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t\t\t.onDuplicateKeyUpdate({ set: { name: 'John1' } })\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql:\n\t\t\t\t\t'insert into `userstest` (`id`, `name`, `verified`, `jsonb`, `created_at`) values (default, ?, default, ?, default) on duplicate key update `name` = ?',\n\t\t\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t\t\t});\n\t\t});\n\n\t\ttest('insert with onDuplicate', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable)\n\t\t\t\t.values({ name: 'John' });\n\n\t\t\tawait db.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John' })\n\t\t\t\t.onDuplicateKeyUpdate({ set: { name: 'John1' } });\n\n\t\t\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\t\t\teq(usersTable.id, 1),\n\t\t\t);\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John1' }]);\n\t\t});\n\n\t\ttest('insert conflict', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable)\n\t\t\t\t.values({ name: 'John' });\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb.insert(usersTable).values({ id: 1, name: 'John1' });\n\t\t\t})()).resolves.not.toThrowError();\n\t\t});\n\n\t\ttest('insert conflict with ignore', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable)\n\t\t\t\t.values({ name: 'John' });\n\n\t\t\tawait db.insert(usersTable)\n\t\t\t\t.ignore()\n\t\t\t\t.values({ id: 1, name: 'John1' });\n\n\t\t\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\t\t\teq(usersTable.id, 1),\n\t\t\t);\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: sql`${'John'}` });\n\t\t\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('partial join with alias', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tconst customerAlias = alias(usersTable, 'customer');\n\n\t\t\tawait db.insert(usersTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\t\tname: usersTable.name,\n\t\t\t\t\t},\n\t\t\t\t\tcustomer: {\n\t\t\t\t\t\tid: customerAlias.id,\n\t\t\t\t\t\tname: customerAlias.name,\n\t\t\t\t\t},\n\t\t\t\t}).from(usersTable)\n\t\t\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t\t\t.where(eq(usersTable.id, 10));\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tuser: { id: 10, name: 'Ivan' },\n\t\t\t\tcustomer: { id: 11, name: 'Hans' },\n\t\t\t}]);\n\t\t});\n\n\t\ttest('full join with alias', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst mysqlTable = mysqlTableCreator((name) => `prefixed_${name}`);\n\n\t\t\tconst users = mysqlTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\t\t\tconst customers = alias(users, 'customer');\n\n\t\t\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select().from(users)\n\t\t\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t\t\t.where(eq(users.id, 10));\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tusers: {\n\t\t\t\t\tid: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t},\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('select from alias', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst mysqlTable = mysqlTableCreator((name) => `prefixed_${name}`);\n\n\t\t\tconst users = mysqlTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\t\t\tconst user = alias(users, 'user');\n\t\t\tconst customers = alias(users, 'customer');\n\n\t\t\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(user)\n\t\t\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t\t\t.where(eq(user.id, 10));\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tuser: {\n\t\t\t\t\tid: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t},\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('insert with spaces', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: sql`'Jo   h     n'` });\n\t\t\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n\t\t});\n\n\t\ttest('prepared statement', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst statement = db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t}).from(usersTable)\n\t\t\t\t.prepare();\n\t\t\tconst result = await statement.execute();\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert: placeholders on columns with encoder', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst date = new Date('2024-08-07T15:30:00Z');\n\n\t\t\tconst statement = db.insert(usersTable).values({\n\t\t\t\tname: 'John',\n\t\t\t\tcreatedAt: sql.placeholder('createdAt'),\n\t\t\t}).prepare();\n\n\t\t\tawait statement.execute({ createdAt: date });\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tcreatedAt: usersTable.createdAt,\n\t\t\t\t})\n\t\t\t\t.from(usersTable);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, createdAt: date },\n\t\t\t]);\n\t\t});\n\n\t\ttest('prepared statement reuse', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst stmt = db.insert(usersTable).values({\n\t\t\t\tverified: true,\n\t\t\t\tname: sql.placeholder('name'),\n\t\t\t}).prepare();\n\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tawait stmt.execute({ name: `John ${i}` });\n\t\t\t}\n\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t\tverified: usersTable.verified,\n\t\t\t}).from(usersTable);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John 0', verified: true },\n\t\t\t\t{ id: 2, name: 'John 1', verified: true },\n\t\t\t\t{ id: 3, name: 'John 2', verified: true },\n\t\t\t\t{ id: 4, name: 'John 3', verified: true },\n\t\t\t\t{ id: 5, name: 'John 4', verified: true },\n\t\t\t\t{ id: 6, name: 'John 5', verified: true },\n\t\t\t\t{ id: 7, name: 'John 6', verified: true },\n\t\t\t\t{ id: 8, name: 'John 7', verified: true },\n\t\t\t\t{ id: 9, name: 'John 8', verified: true },\n\t\t\t\t{ id: 10, name: 'John 9', verified: true },\n\t\t\t]);\n\t\t});\n\n\t\ttest('prepared statement with placeholder in .where', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst stmt = db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t}).from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t\t\t.prepare();\n\t\t\tconst result = await stmt.execute({ id: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('prepared statement with placeholder in .limit', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst stmt = db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t\t\t.limit(sql.placeholder('limit'))\n\t\t\t\t.prepare();\n\n\t\t\tconst result = await stmt.execute({ id: 1, limit: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t\texpect(result).toHaveLength(1);\n\t\t});\n\n\t\ttest('prepared statement with placeholder in .offset', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]);\n\t\t\tconst stmt = db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.limit(sql.placeholder('limit'))\n\t\t\t\t.offset(sql.placeholder('offset'))\n\t\t\t\t.prepare();\n\n\t\t\tconst result = await stmt.execute({ limit: 1, offset: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 2, name: 'John1' }]);\n\t\t});\n\n\t\ttest('prepared statement built using $dynamic', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tfunction withLimitOffset(qb: any) {\n\t\t\t\treturn qb.limit(sql.placeholder('limit')).offset(sql.placeholder('offset'));\n\t\t\t}\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]);\n\t\t\tconst stmt = db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.$dynamic();\n\t\t\twithLimitOffset(stmt).prepare('stmt_limit');\n\n\t\t\tconst result = await stmt.execute({ limit: 1, offset: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 2, name: 'John1' }]);\n\t\t\texpect(result).toHaveLength(1);\n\t\t});\n\n\t\ttest('migrator', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`drop table if exists cities_migration`);\n\t\t\tawait db.execute(sql`drop table if exists users_migration`);\n\t\t\tawait db.execute(sql`drop table if exists users12`);\n\t\t\tawait db.execute(sql`drop table if exists __drizzle_migrations`);\n\n\t\t\tawait migrate(db, { migrationsFolder: './drizzle2/mysql' });\n\n\t\t\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\t\t\tconst result = await db.select().from(usersMigratorTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\t\t\tawait db.execute(sql`drop table cities_migration`);\n\t\t\tawait db.execute(sql`drop table users_migration`);\n\t\t\tawait db.execute(sql`drop table users12`);\n\t\t\tawait db.execute(sql`drop table __drizzle_migrations`);\n\t\t});\n\n\t\ttest('insert via db.execute + select via db.execute', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`insert into ${usersTable} (${new Name(usersTable.name.name)}) values (${'John'})`);\n\n\t\t\tconst result = await db.execute<{ id: number; name: string }>(sql`select id, name from ${usersTable}`);\n\t\t\texpect(result[0]).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert via db.execute w/ query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst inserted = await db.execute(\n\t\t\t\tdb.insert(usersTable).values({ name: 'John' }),\n\t\t\t);\n\t\t\texpect(inserted[0].affectedRows).toBe(1);\n\t\t});\n\n\t\ttest('insert + select all possible dates', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`datestable\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`datestable\\` (\n\t\t\t\t\t    \\`date\\` date,\n\t\t\t\t\t    \\`date_as_string\\` date,\n\t\t\t\t\t    \\`time\\` time,\n\t\t\t\t\t    \\`datetime\\` datetime,\n\t\t\t\t\t    \\`datetime_as_string\\` datetime,\n\t\t\t\t\t    \\`timestamp\\` timestamp(3),\n\t\t\t\t\t    \\`timestamp_as_string\\` timestamp(3),\n\t\t\t\t\t    \\`year\\` year\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tconst date = new Date('2022-11-11');\n\t\t\tconst dateWithMilliseconds = new Date('2022-11-11 12:12:12.123');\n\n\t\t\tawait db.insert(datesTable).values({\n\t\t\t\tdate: date,\n\t\t\t\tdateAsString: '2022-11-11',\n\t\t\t\ttime: '12:12:12',\n\t\t\t\tdatetime: date,\n\t\t\t\tyear: 22,\n\t\t\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t\t\t\ttimestamp: dateWithMilliseconds,\n\t\t\t\ttimestampAsString: '2022-11-11 12:12:12.123',\n\t\t\t});\n\n\t\t\tconst res = await db.select().from(datesTable);\n\n\t\t\texpect(res[0]?.date).toBeInstanceOf(Date);\n\t\t\texpect(res[0]?.datetime).toBeInstanceOf(Date);\n\t\t\texpect(typeof res[0]?.dateAsString).toBe('string');\n\t\t\texpect(typeof res[0]?.datetimeAsString).toBe('string');\n\n\t\t\texpect(res).toEqual([{\n\t\t\t\tdate: toLocalDate(new Date('2022-11-11')),\n\t\t\t\tdateAsString: '2022-11-11',\n\t\t\t\ttime: '12:12:12',\n\t\t\t\tdatetime: new Date('2022-11-11'),\n\t\t\t\tyear: 2022,\n\t\t\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t\t\t\ttimestamp: new Date('2022-11-11 12:12:12.123'),\n\t\t\t\ttimestampAsString: '2022-11-11 12:12:12.123',\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table if exists \\`datestable\\``);\n\t\t});\n\n\t\tconst tableWithEnums = mysqlTable('enums_test_case', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tenum1: mysqlEnum('enum1', ['a', 'b', 'c']).notNull(),\n\t\t\tenum2: mysqlEnum('enum2', ['a', 'b', 'c']).default('a'),\n\t\t\tenum3: mysqlEnum('enum3', ['a', 'b', 'c']).notNull().default('b'),\n\t\t});\n\n\t\ttest('Mysql enum as ts enum', async (ctx) => {\n\t\t\tenum Test {\n\t\t\t\ta = 'a',\n\t\t\t\tb = 'b',\n\t\t\t\tc = 'c',\n\t\t\t}\n\n\t\t\tconst tableWithTsEnums = mysqlTable('enums_test_case', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tenum1: mysqlEnum('enum1', Test).notNull(),\n\t\t\t\tenum2: mysqlEnum('enum2', Test).default(Test.a),\n\t\t\t\tenum3: mysqlEnum('enum3', Test).notNull().default(Test.b),\n\t\t\t});\n\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`enums_test_case\\``);\n\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table \\`enums_test_case\\` (\n\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t    \\`enum1\\` ENUM('a', 'b', 'c') not null,\n\t\t\t\t    \\`enum2\\` ENUM('a', 'b', 'c') default 'a',\n\t\t\t\t    \\`enum3\\` ENUM('a', 'b', 'c') not null default 'b'\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.insert(tableWithTsEnums).values([\n\t\t\t\t{ id: 1, enum1: Test.a, enum2: Test.b, enum3: Test.c },\n\t\t\t\t{ id: 2, enum1: Test.a, enum3: Test.c },\n\t\t\t\t{ id: 3, enum1: Test.a },\n\t\t\t]);\n\n\t\t\tconst res = await db.select().from(tableWithTsEnums);\n\n\t\t\tawait db.execute(sql`drop table \\`enums_test_case\\``);\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{ id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n\t\t\t\t{ id: 2, enum1: 'a', enum2: 'a', enum3: 'c' },\n\t\t\t\t{ id: 3, enum1: 'a', enum2: 'a', enum3: 'b' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('Mysql enum test case #1', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`enums_test_case\\``);\n\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table \\`enums_test_case\\` (\n\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t    \\`enum1\\` ENUM('a', 'b', 'c') not null,\n\t\t\t\t    \\`enum2\\` ENUM('a', 'b', 'c') default 'a',\n\t\t\t\t    \\`enum3\\` ENUM('a', 'b', 'c') not null default 'b'\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.insert(tableWithEnums).values([\n\t\t\t\t{ id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n\t\t\t\t{ id: 2, enum1: 'a', enum3: 'c' },\n\t\t\t\t{ id: 3, enum1: 'a' },\n\t\t\t]);\n\n\t\t\tconst res = await db.select().from(tableWithEnums);\n\n\t\t\tawait db.execute(sql`drop table \\`enums_test_case\\``);\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{ id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n\t\t\t\t{ id: 2, enum1: 'a', enum2: 'a', enum3: 'c' },\n\t\t\t\t{ id: 3, enum1: 'a', enum2: 'a', enum3: 'b' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('left join (flat object fields)', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }]);\n\n\t\t\tconst res = await db.select({\n\t\t\t\tuserId: users2Table.id,\n\t\t\t\tuserName: users2Table.name,\n\t\t\t\tcityId: citiesTable.id,\n\t\t\t\tcityName: citiesTable.name,\n\t\t\t}).from(users2Table)\n\t\t\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id));\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{ userId: 1, userName: 'John', cityId: 1, cityName: 'Paris' },\n\t\t\t\t{ userId: 2, userName: 'Jane', cityId: null, cityName: null },\n\t\t\t]);\n\t\t});\n\n\t\ttest('left join (grouped fields)', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }]);\n\n\t\t\tconst res = await db.select({\n\t\t\t\tid: users2Table.id,\n\t\t\t\tuser: {\n\t\t\t\t\tname: users2Table.name,\n\t\t\t\t\tnameUpper: sql<string>`upper(${users2Table.name})`,\n\t\t\t\t},\n\t\t\t\tcity: {\n\t\t\t\t\tid: citiesTable.id,\n\t\t\t\t\tname: citiesTable.name,\n\t\t\t\t\tnameUpper: sql<string>`upper(${citiesTable.name})`,\n\t\t\t\t},\n\t\t\t}).from(users2Table)\n\t\t\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id));\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tuser: { name: 'John', nameUpper: 'JOHN' },\n\t\t\t\t\tcity: { id: 1, name: 'Paris', nameUpper: 'PARIS' },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tuser: { name: 'Jane', nameUpper: 'JANE' },\n\t\t\t\t\tcity: null,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('left join (all fields)', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }]);\n\n\t\t\tconst res = await db.select().from(users2Table)\n\t\t\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id));\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{\n\t\t\t\t\tusers2: {\n\t\t\t\t\t\tid: 1,\n\t\t\t\t\t\tname: 'John',\n\t\t\t\t\t\tcityId: 1,\n\t\t\t\t\t},\n\t\t\t\t\tcities: {\n\t\t\t\t\t\tid: 1,\n\t\t\t\t\t\tname: 'Paris',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers2: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Jane',\n\t\t\t\t\t\tcityId: null,\n\t\t\t\t\t},\n\t\t\t\t\tcities: null,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('select from a many subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst res = await db.select({\n\t\t\t\tpopulation: db.select({ count: count().as('count') }).from(users2Table).where(\n\t\t\t\t\teq(users2Table.cityId, citiesTable.id),\n\t\t\t\t).as(\n\t\t\t\t\t'population',\n\t\t\t\t),\n\t\t\t\tname: citiesTable.name,\n\t\t\t}).from(citiesTable);\n\n\t\t\texpectTypeOf(res).toEqualTypeOf<\n\t\t\t\t{\n\t\t\t\t\tpopulation: number;\n\t\t\t\t\tname: string;\n\t\t\t\t}[]\n\t\t\t>();\n\n\t\t\texpect(res).toStrictEqual([{\n\t\t\t\tpopulation: 1,\n\t\t\t\tname: 'Paris',\n\t\t\t}, {\n\t\t\t\tpopulation: 2,\n\t\t\t\tname: 'London',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('select from a one subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst res = await db.select({\n\t\t\t\tcityName: db.select({ name: citiesTable.name }).from(citiesTable).where(eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t\t.as(\n\t\t\t\t\t\t'cityName',\n\t\t\t\t\t),\n\t\t\t\tname: users2Table.name,\n\t\t\t}).from(users2Table);\n\n\t\t\texpectTypeOf(res).toEqualTypeOf<\n\t\t\t\t{\n\t\t\t\t\tcityName: string;\n\t\t\t\t\tname: string;\n\t\t\t\t}[]\n\t\t\t>();\n\n\t\t\texpect(res).toStrictEqual([{\n\t\t\t\tcityName: 'Paris',\n\t\t\t\tname: 'John',\n\t\t\t}, {\n\t\t\t\tcityName: 'London',\n\t\t\t\tname: 'Jane',\n\t\t\t}, {\n\t\t\t\tcityName: 'London',\n\t\t\t\tname: 'Jack',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('join subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`courses\\``);\n\t\t\tawait db.execute(sql`drop table if exists \\`course_categories\\``);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`course_categories\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`name\\` text not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`courses\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`name\\` text not null,\n\t\t\t\t\t    \\`category_id\\` int references \\`course_categories\\`(\\`id\\`)\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(courseCategoriesTable).values([\n\t\t\t\t{ name: 'Category 1' },\n\t\t\t\t{ name: 'Category 2' },\n\t\t\t\t{ name: 'Category 3' },\n\t\t\t\t{ name: 'Category 4' },\n\t\t\t]);\n\n\t\t\tawait db.insert(coursesTable).values([\n\t\t\t\t{ name: 'Development', categoryId: 2 },\n\t\t\t\t{ name: 'IT & Software', categoryId: 3 },\n\t\t\t\t{ name: 'Marketing', categoryId: 4 },\n\t\t\t\t{ name: 'Design', categoryId: 1 },\n\t\t\t]);\n\n\t\t\tconst sq2 = db\n\t\t\t\t.select({\n\t\t\t\t\tcategoryId: courseCategoriesTable.id,\n\t\t\t\t\tcategory: courseCategoriesTable.name,\n\t\t\t\t\ttotal: sql<number>`count(${courseCategoriesTable.id})`,\n\t\t\t\t})\n\t\t\t\t.from(courseCategoriesTable)\n\t\t\t\t.groupBy(courseCategoriesTable.id, courseCategoriesTable.name)\n\t\t\t\t.as('sq2');\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tcourseName: coursesTable.name,\n\t\t\t\t\tcategoryId: sq2.categoryId,\n\t\t\t\t})\n\t\t\t\t.from(coursesTable)\n\t\t\t\t.leftJoin(sq2, eq(coursesTable.categoryId, sq2.categoryId))\n\t\t\t\t.orderBy(coursesTable.name);\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{ courseName: 'Design', categoryId: 1 },\n\t\t\t\t{ courseName: 'Development', categoryId: 2 },\n\t\t\t\t{ courseName: 'IT & Software', categoryId: 3 },\n\t\t\t\t{ courseName: 'Marketing', categoryId: 4 },\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop table if exists \\`courses\\``);\n\t\t\tawait db.execute(sql`drop table if exists \\`course_categories\\``);\n\t\t});\n\n\t\ttest('with ... select', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`orders\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`orders\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`region\\` text not null,\n\t\t\t\t\t    \\`product\\` text not null,\n\t\t\t\t\t    \\`amount\\` int not null,\n\t\t\t\t\t    \\`quantity\\` int not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(orders).values([\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t\t\t]);\n\n\t\t\tconst regionalSales = db\n\t\t\t\t.$with('regional_sales')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tregion: orders.region,\n\t\t\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(orders)\n\t\t\t\t\t\t.groupBy(orders.region),\n\t\t\t\t);\n\n\t\t\tconst topRegions = db\n\t\t\t\t.$with('top_regions')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tregion: regionalSales.region,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(regionalSales)\n\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\tgt(\n\t\t\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\t\t\tdb.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\tconst result = await db\n\t\t\t\t.with(regionalSales, topRegions)\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\tproduct: orders.product,\n\t\t\t\t\tproductUnits: sql<number>`cast(sum(${orders.quantity}) as unsigned)`,\n\t\t\t\t\tproductSales: sql<number>`cast(sum(${orders.amount}) as unsigned)`,\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t\t\t.groupBy(orders.region, orders.product)\n\t\t\t\t.orderBy(orders.region, orders.product);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tregion: 'Europe',\n\t\t\t\t\tproduct: 'A',\n\t\t\t\t\tproductUnits: 3,\n\t\t\t\t\tproductSales: 30,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'Europe',\n\t\t\t\t\tproduct: 'B',\n\t\t\t\t\tproductUnits: 5,\n\t\t\t\t\tproductSales: 50,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'US',\n\t\t\t\t\tproduct: 'A',\n\t\t\t\t\tproductUnits: 7,\n\t\t\t\t\tproductSales: 70,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'US',\n\t\t\t\t\tproduct: 'B',\n\t\t\t\t\tproductUnits: 9,\n\t\t\t\t\tproductSales: 90,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('with ... update', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst products = mysqlTable('products', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tprice: decimal('price', {\n\t\t\t\t\tprecision: 15,\n\t\t\t\t\tscale: 2,\n\t\t\t\t}).notNull(),\n\t\t\t\tcheap: boolean('cheap').notNull().default(false),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${products}`);\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table ${products} (\n\t\t\t\t    id serial primary key,\n\t\t\t\t    price decimal(15, 2) not null,\n\t\t\t\t    cheap boolean not null default false\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.insert(products).values([\n\t\t\t\t{ price: '10.99' },\n\t\t\t\t{ price: '25.85' },\n\t\t\t\t{ price: '32.99' },\n\t\t\t\t{ price: '2.50' },\n\t\t\t\t{ price: '4.59' },\n\t\t\t]);\n\n\t\t\tconst averagePrice = db\n\t\t\t\t.$with('average_price')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tvalue: sql`avg(${products.price})`.as('value'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(products),\n\t\t\t\t);\n\n\t\t\tawait db\n\t\t\t\t.with(averagePrice)\n\t\t\t\t.update(products)\n\t\t\t\t.set({\n\t\t\t\t\tcheap: true,\n\t\t\t\t})\n\t\t\t\t.where(lt(products.price, sql`(select * from ${averagePrice})`));\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: products.id,\n\t\t\t\t})\n\t\t\t\t.from(products)\n\t\t\t\t.where(eq(products.cheap, true));\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1 },\n\t\t\t\t{ id: 4 },\n\t\t\t\t{ id: 5 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('with ... delete', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`orders\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`orders\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`region\\` text not null,\n\t\t\t\t\t    \\`product\\` text not null,\n\t\t\t\t\t    \\`amount\\` int not null,\n\t\t\t\t\t    \\`quantity\\` int not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(orders).values([\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t\t\t]);\n\n\t\t\tconst averageAmount = db\n\t\t\t\t.$with('average_amount')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tvalue: sql`avg(${orders.amount})`.as('value'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(orders),\n\t\t\t\t);\n\n\t\t\tawait db\n\t\t\t\t.with(averageAmount)\n\t\t\t\t.delete(orders)\n\t\t\t\t.where(gt(orders.amount, sql`(select * from ${averageAmount})`));\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: orders.id,\n\t\t\t\t})\n\t\t\t\t.from(orders);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1 },\n\t\t\t\t{ id: 2 },\n\t\t\t\t{ id: 3 },\n\t\t\t\t{ id: 4 },\n\t\t\t\t{ id: 5 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('select from subquery sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John' }, { name: 'Jane' }]);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({ name: sql<string>`concat(${users2Table.name}, \" modified\")`.as('name') })\n\t\t\t\t.from(users2Table)\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = await db.select({ name: sq.name }).from(sq);\n\n\t\t\texpect(res).toEqual([{ name: 'John modified' }, { name: 'Jane modified' }]);\n\t\t});\n\n\t\ttest('select a field without joining its table', (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\texpect(() => db.select({ name: users2Table.name }).from(usersTable).prepare()).toThrowError();\n\t\t});\n\n\t\ttest('select all fields from subquery without alias', (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst sq = db.$with('sq').as(db.select({ name: sql<string>`upper(${users2Table.name})` }).from(users2Table));\n\n\t\t\texpect(() => db.select().from(sq).prepare()).toThrowError();\n\t\t});\n\n\t\ttest('select count()', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }]);\n\n\t\t\tconst res = await db.select({ count: sql`count(*)` }).from(usersTable);\n\n\t\t\texpect(res).toEqual([{ count: 2 }]);\n\t\t});\n\n\t\ttest('select for ...', (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\t{\n\t\t\t\tconst query = db.select().from(users2Table).for('update').toSQL();\n\t\t\t\texpect(query.sql).toMatch(/ for update$/);\n\t\t\t}\n\t\t\t{\n\t\t\t\tconst query = db.select().from(users2Table).for('share', { skipLocked: true }).toSQL();\n\t\t\t\texpect(query.sql).toMatch(/ for share skip locked$/);\n\t\t\t}\n\t\t\t{\n\t\t\t\tconst query = db.select().from(users2Table).for('update', { noWait: true }).toSQL();\n\t\t\t\texpect(query.sql).toMatch(/ for update nowait$/);\n\t\t\t}\n\t\t});\n\n\t\ttest('having', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(citiesTable).values([{ name: 'London' }, { name: 'Paris' }, { name: 'New York' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane', cityId: 1 }, {\n\t\t\t\tname: 'Jack',\n\t\t\t\tcityId: 2,\n\t\t\t}]);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: citiesTable.id,\n\t\t\t\t\tname: sql<string>`upper(${citiesTable.name})`.as('upper_name'),\n\t\t\t\t\tusersCount: sql<number>`count(${users2Table.id})`.as('users_count'),\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.leftJoin(users2Table, eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.where(({ name }) => sql`length(${name}) >= 3`)\n\t\t\t\t.groupBy(citiesTable.id)\n\t\t\t\t.having(({ usersCount }) => sql`${usersCount} > 0`)\n\t\t\t\t.orderBy(({ name }) => name);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tname: 'LONDON',\n\t\t\t\t\tusersCount: 2,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'PARIS',\n\t\t\t\t\tusersCount: 1,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('view', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst newYorkers1 = mysqlView('new_yorkers')\n\t\t\t\t.as((qb) => qb.select().from(users2Table).where(eq(users2Table.cityId, 1)));\n\n\t\t\tconst newYorkers2 = mysqlView('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: int('city_id').notNull(),\n\t\t\t}).as(sql`select * from ${users2Table} where ${eq(users2Table.cityId, 1)}`);\n\n\t\t\tconst newYorkers3 = mysqlView('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: int('city_id').notNull(),\n\t\t\t}).existing();\n\n\t\t\tawait db.execute(sql`create view new_yorkers as ${getViewConfig(newYorkers1).query}`);\n\n\t\t\tawait db.insert(citiesTable).values([{ name: 'New York' }, { name: 'Paris' }]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 1 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers1);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers2);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers3);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\tawait db.execute(sql`drop view ${newYorkers1}`);\n\t\t});\n\n\t\ttest('select from raw sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst result = await db.select({\n\t\t\t\tid: sql<number>`id`,\n\t\t\t\tname: sql<string>`name`,\n\t\t\t}).from(sql`(select 1 as id, 'John' as name) as users`);\n\n\t\t\tExpect<Equal<{ id: number; name: string }[], typeof result>>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('select from raw sql with joins', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: sql<number>`users.id`,\n\t\t\t\t\tname: sql<string>`users.name`,\n\t\t\t\t\tuserCity: sql<string>`users.city`,\n\t\t\t\t\tcityName: sql<string>`cities.name`,\n\t\t\t\t})\n\t\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, sql`cities.id = users.id`);\n\n\t\t\tExpect<Equal<{ id: number; name: string; userCity: string; cityName: string }[], typeof result>>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', userCity: 'New York', cityName: 'Paris' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('join on aliased sql from select', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: sql<number>`users.id`.as('userId'),\n\t\t\t\t\tname: sql<string>`users.name`,\n\t\t\t\t\tuserCity: sql<string>`users.city`,\n\t\t\t\t\tcityId: sql<number>`cities.id`.as('cityId'),\n\t\t\t\t\tcityName: sql<string>`cities.name`,\n\t\t\t\t})\n\t\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, (cols) => eq(cols.cityId, cols.userId));\n\n\t\t\tExpect<\n\t\t\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t\t\t>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('join on aliased sql from with clause', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = db.$with('users').as(\n\t\t\t\tdb.select({\n\t\t\t\t\tid: sql<number>`id`.as('userId'),\n\t\t\t\t\tname: sql<string>`name`.as('userName'),\n\t\t\t\t\tcity: sql<string>`city`.as('city'),\n\t\t\t\t}).from(\n\t\t\t\t\tsql`(select 1 as id, 'John' as name, 'New York' as city) as users`,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst cities = db.$with('cities').as(\n\t\t\t\tdb.select({\n\t\t\t\t\tid: sql<number>`id`.as('cityId'),\n\t\t\t\t\tname: sql<string>`name`.as('cityName'),\n\t\t\t\t}).from(\n\t\t\t\t\tsql`(select 1 as id, 'Paris' as name) as cities`,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst result = await db\n\t\t\t\t.with(users, cities)\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users.id,\n\t\t\t\t\tname: users.name,\n\t\t\t\t\tuserCity: users.city,\n\t\t\t\t\tcityId: cities.id,\n\t\t\t\t\tcityName: cities.name,\n\t\t\t\t})\n\t\t\t\t.from(users)\n\t\t\t\t.leftJoin(cities, (cols) => eq(cols.cityId, cols.userId));\n\n\t\t\tExpect<\n\t\t\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t\t\t>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('prefixed table', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst mysqlTable = mysqlTableCreator((name) => `myprefix_${name}`);\n\n\t\t\tconst users = mysqlTable('test_prefixed_table_with_unique_name', {\n\t\t\t\tid: int('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table myprefix_test_prefixed_table_with_unique_name (id int not null primary key, name text not null)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values({ id: 1, name: 'John' });\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('orderBy with aliased column', (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst query = db.select({\n\t\t\t\ttest: sql`something`.as('test'),\n\t\t\t}).from(users2Table).orderBy((fields) => fields.test).toSQL();\n\n\t\t\texpect(query.sql).toBe('select something as `test` from `users2` order by `test`');\n\t\t});\n\n\t\ttest('timestamp timezone', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst date = new Date(Date.parse('2020-01-01T12:34:56+07:00'));\n\n\t\t\tawait db.insert(usersTable).values({ name: 'With default times' });\n\t\t\tawait db.insert(usersTable).values({\n\t\t\t\tname: 'Without default times',\n\t\t\t\tcreatedAt: date,\n\t\t\t});\n\t\t\tconst users = await db.select().from(usersTable);\n\n\t\t\t// check that the timestamps are set correctly for default times\n\t\t\texpect(Math.abs(users[0]!.createdAt.getTime() - Date.now())).toBeLessThan(2000);\n\n\t\t\t// check that the timestamps are set correctly for non default times\n\t\t\texpect(Math.abs(users[1]!.createdAt.getTime() - date.getTime())).toBeLessThan(2000);\n\t\t});\n\n\t\ttest('transaction', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users_transactions', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tbalance: int('balance').notNull(),\n\t\t\t});\n\t\t\tconst products = mysqlTable('products_transactions', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tprice: int('price').notNull(),\n\t\t\t\tstock: int('stock').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`drop table if exists ${products}`);\n\n\t\t\tawait db.execute(sql`create table users_transactions (id serial not null primary key, balance int not null)`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table products_transactions (id serial not null primary key, price int not null, stock int not null)`,\n\t\t\t);\n\n\t\t\tconst [{ insertId: userId }] = await db.insert(users).values({ balance: 100 });\n\t\t\tconst user = await db.select().from(users).where(eq(users.id, userId)).then((rows) => rows[0]!);\n\t\t\tconst [{ insertId: productId }] = await db.insert(products).values({ price: 10, stock: 10 });\n\t\t\tconst product = await db.select().from(products).where(eq(products.id, productId)).then((rows) => rows[0]!);\n\n\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\tawait tx.update(users).set({ balance: user.balance - product.price }).where(eq(users.id, user.id));\n\t\t\t\tawait tx.update(products).set({ stock: product.stock - 1 }).where(eq(products.id, product.id));\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([{ id: 1, balance: 90 }]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t\tawait db.execute(sql`drop table ${products}`);\n\t\t});\n\n\t\ttest('transaction with options (set isolationLevel)', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users_transactions', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tbalance: int('balance').notNull(),\n\t\t\t});\n\t\t\tconst products = mysqlTable('products_transactions', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tprice: int('price').notNull(),\n\t\t\t\tstock: int('stock').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`drop table if exists ${products}`);\n\n\t\t\tawait db.execute(sql`create table users_transactions (id serial not null primary key, balance int not null)`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table products_transactions (id serial not null primary key, price int not null, stock int not null)`,\n\t\t\t);\n\n\t\t\tconst [{ insertId: userId }] = await db.insert(users).values({ balance: 100 });\n\t\t\tconst user = await db.select().from(users).where(eq(users.id, userId)).then((rows) => rows[0]!);\n\t\t\tconst [{ insertId: productId }] = await db.insert(products).values({ price: 10, stock: 10 });\n\t\t\tconst product = await db.select().from(products).where(eq(products.id, productId)).then((rows) => rows[0]!);\n\n\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\tawait tx.update(users).set({ balance: user.balance - product.price }).where(eq(users.id, user.id));\n\t\t\t\tawait tx.update(products).set({ stock: product.stock - 1 }).where(eq(products.id, product.id));\n\t\t\t}, { isolationLevel: 'serializable' });\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([{ id: 1, balance: 90 }]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t\tawait db.execute(sql`drop table ${products}`);\n\t\t});\n\n\t\ttest('transaction rollback', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users_transactions_rollback', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tbalance: int('balance').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table users_transactions_rollback (id serial not null primary key, balance int not null)`,\n\t\t\t);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\t\tawait tx.insert(users).values({ balance: 100 });\n\t\t\t\t\ttx.rollback();\n\t\t\t\t});\n\t\t\t})()).rejects.toThrowError(TransactionRollbackError);\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('nested transaction', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users_nested_transactions', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tbalance: int('balance').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table users_nested_transactions (id serial not null primary key, balance int not null)`,\n\t\t\t);\n\n\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\tawait tx.insert(users).values({ balance: 100 });\n\n\t\t\t\tawait tx.transaction(async (tx) => {\n\t\t\t\t\tawait tx.update(users).set({ balance: 200 });\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([{ id: 1, balance: 200 }]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('nested transaction rollback', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users_nested_transactions_rollback', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tbalance: int('balance').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table users_nested_transactions_rollback (id serial not null primary key, balance int not null)`,\n\t\t\t);\n\n\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\tawait tx.insert(users).values({ balance: 100 });\n\n\t\t\t\tawait expect((async () => {\n\t\t\t\t\tawait tx.transaction(async (tx) => {\n\t\t\t\t\t\tawait tx.update(users).set({ balance: 200 });\n\t\t\t\t\t\ttx.rollback();\n\t\t\t\t\t});\n\t\t\t\t})()).rejects.toThrowError(TransactionRollbackError);\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([{ id: 1, balance: 100 }]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('join subquery with join', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst internalStaff = mysqlTable('internal_staff', {\n\t\t\t\tuserId: int('user_id').notNull(),\n\t\t\t});\n\n\t\t\tconst customUser = mysqlTable('custom_user', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t});\n\n\t\t\tconst ticket = mysqlTable('ticket', {\n\t\t\t\tstaffId: int('staff_id').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${internalStaff}`);\n\t\t\tawait db.execute(sql`drop table if exists ${customUser}`);\n\t\t\tawait db.execute(sql`drop table if exists ${ticket}`);\n\n\t\t\tawait db.execute(sql`create table internal_staff (user_id integer not null)`);\n\t\t\tawait db.execute(sql`create table custom_user (id integer not null)`);\n\t\t\tawait db.execute(sql`create table ticket (staff_id integer not null)`);\n\n\t\t\tawait db.insert(internalStaff).values({ userId: 1 });\n\t\t\tawait db.insert(customUser).values({ id: 1 });\n\t\t\tawait db.insert(ticket).values({ staffId: 1 });\n\n\t\t\tconst subq = db\n\t\t\t\t.select()\n\t\t\t\t.from(internalStaff)\n\t\t\t\t.leftJoin(customUser, eq(internalStaff.userId, customUser.id))\n\t\t\t\t.as('internal_staff');\n\n\t\t\tconst mainQuery = await db\n\t\t\t\t.select()\n\t\t\t\t.from(ticket)\n\t\t\t\t.leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId));\n\n\t\t\texpect(mainQuery).toEqual([{\n\t\t\t\tticket: { staffId: 1 },\n\t\t\t\tinternal_staff: {\n\t\t\t\t\tinternal_staff: { userId: 1 },\n\t\t\t\t\tcustom_user: { id: 1 },\n\t\t\t\t},\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table ${internalStaff}`);\n\t\t\tawait db.execute(sql`drop table ${customUser}`);\n\t\t\tawait db.execute(sql`drop table ${ticket}`);\n\t\t});\n\n\t\ttest('subquery with view', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users_subquery_view', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: int('city_id').notNull(),\n\t\t\t});\n\n\t\t\tconst newYorkers = mysqlView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`drop view if exists ${newYorkers}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t\t\t);\n\t\t\tawait db.execute(sql`create view ${newYorkers} as select * from ${users} where city_id = 1`);\n\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 1 },\n\t\t\t\t{ name: 'Jill', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst sq = db.$with('sq').as(db.select().from(newYorkers));\n\t\t\tconst result = await db.with(sq).select().from(sq);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t{ id: 3, name: 'Jack', cityId: 1 },\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop view ${newYorkers}`);\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('join view as subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users_join_view', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: int('city_id').notNull(),\n\t\t\t});\n\n\t\t\tconst newYorkers = mysqlView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`drop view if exists ${newYorkers}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t\t\t);\n\t\t\tawait db.execute(sql`create view ${newYorkers} as select * from ${users} where city_id = 1`);\n\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 1 },\n\t\t\t\t{ name: 'Jill', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst sq = db.select().from(newYorkers).as('new_yorkers_sq');\n\n\t\t\tconst result = await db.select().from(users).leftJoin(sq, eq(users.id, sq.id));\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\tnew_yorkers_sq: { id: 1, name: 'John', cityId: 1 },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 2, name: 'Jane', cityId: 2 },\n\t\t\t\t\tnew_yorkers_sq: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 3, name: 'Jack', cityId: 1 },\n\t\t\t\t\tnew_yorkers_sq: { id: 3, name: 'Jack', cityId: 1 },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 4, name: 'Jill', cityId: 2 },\n\t\t\t\t\tnew_yorkers_sq: null,\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop view ${newYorkers}`);\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('select iterator', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users_iterator', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial not null primary key)`);\n\n\t\t\tawait db.insert(users).values([{}, {}, {}]);\n\n\t\t\tconst iter = db.select().from(users).iterator();\n\n\t\t\tconst result: typeof users.$inferSelect[] = [];\n\n\t\t\tfor await (const row of iter) {\n\t\t\t\tresult.push(row);\n\t\t\t}\n\n\t\t\texpect(result).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }]);\n\t\t});\n\n\t\ttest('select iterator w/ prepared statement', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users_iterator', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial not null primary key)`);\n\n\t\t\tawait db.insert(users).values([{}, {}, {}]);\n\n\t\t\tconst prepared = db.select().from(users).prepare();\n\t\t\tconst iter = prepared.iterator();\n\t\t\tconst result: typeof users.$inferSelect[] = [];\n\n\t\t\tfor await (const row of iter) {\n\t\t\t\tresult.push(row);\n\t\t\t}\n\n\t\t\texpect(result).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }]);\n\t\t});\n\n\t\ttest('insert undefined', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text)`,\n\t\t\t);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.insert(users).values({ name: undefined });\n\t\t\t})()).resolves.not.toThrowError();\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('update undefined', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text)`,\n\t\t\t);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.update(users).set({ name: undefined });\n\t\t\t})()).rejects.toThrowError();\n\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.update(users).set({ id: 1, name: undefined });\n\t\t\t})()).resolves.not.toThrowError();\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('utc config for datetime', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`datestable\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`datestable\\` (\n\t\t\t\t\t    \\`datetime_utc\\` datetime(3),\n\t\t\t\t\t    \\`datetime\\` datetime(3),\n\t\t\t\t\t    \\`datetime_as_string\\` datetime\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tconst datesTable = mysqlTable('datestable', {\n\t\t\t\tdatetimeUTC: datetime('datetime_utc', { fsp: 3, mode: 'date' }),\n\t\t\t\tdatetime: datetime('datetime', { fsp: 3 }),\n\t\t\t\tdatetimeAsString: datetime('datetime_as_string', { mode: 'string' }),\n\t\t\t});\n\n\t\t\tconst dateObj = new Date('2022-11-11');\n\t\t\tconst dateUtc = new Date('2022-11-11T12:12:12.122Z');\n\n\t\t\tawait db.insert(datesTable).values({\n\t\t\t\tdatetimeUTC: dateUtc,\n\t\t\t\tdatetime: dateObj,\n\t\t\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t\t\t});\n\n\t\t\tconst res = await db.select().from(datesTable);\n\n\t\t\tconst [rawSelect] = await db.execute(sql`select \\`datetime_utc\\` from \\`datestable\\``);\n\t\t\tconst selectedRow = (rawSelect as unknown as [{ datetime_utc: string }])[0];\n\n\t\t\texpect(selectedRow.datetime_utc).toBe('2022-11-11 12:12:12.122');\n\t\t\texpect(new Date(selectedRow.datetime_utc.replace(' ', 'T') + 'Z')).toEqual(dateUtc);\n\n\t\t\texpect(res[0]?.datetime).toBeInstanceOf(Date);\n\t\t\texpect(res[0]?.datetimeUTC).toBeInstanceOf(Date);\n\t\t\texpect(typeof res[0]?.datetimeAsString).toBe('string');\n\n\t\t\texpect(res).toEqual([{\n\t\t\t\tdatetimeUTC: dateUtc,\n\t\t\t\tdatetime: new Date('2022-11-11'),\n\t\t\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table if exists \\`datestable\\``);\n\t\t});\n\n\t\ttest('set operations (union) from query builder with subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\t\t\tconst sq = db\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).as('sq');\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t.from(citiesTable).union(\n\t\t\t\t\tdb.select().from(sq),\n\t\t\t\t).limit(8);\n\n\t\t\texpect(result).toHaveLength(8);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'Jane' },\n\t\t\t\t{ id: 3, name: 'Jack' },\n\t\t\t\t{ id: 4, name: 'Peter' },\n\t\t\t\t{ id: 5, name: 'Ben' },\n\t\t\t]);\n\n\t\t\t// union should throw if selected fields are not in the same order\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).union(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t\t.from(users2Table),\n\t\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (union) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await union(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t);\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tunion(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (union all) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t.from(citiesTable).limit(2).unionAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).limit(2),\n\t\t\t\t).orderBy(asc(sql`id`)).limit(3);\n\n\t\t\texpect(result).toHaveLength(3);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).limit(2).unionAll(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t\t.from(citiesTable).limit(2),\n\t\t\t\t\t).orderBy(asc(sql`id`));\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (union all) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await unionAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).limit(1);\n\n\t\t\texpect(result).toHaveLength(1);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tunionAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).limit(1);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (intersect) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t.from(citiesTable).intersect(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t);\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t.from(citiesTable).intersect(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (intersect) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await intersect(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).limit(1);\n\n\t\t\texpect(result).toHaveLength(0);\n\n\t\t\texpect(result).toEqual([]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tintersect(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).limit(1);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (intersect all) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t.from(citiesTable).limit(2).intersectAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).limit(2),\n\t\t\t\t).orderBy(asc(sql`id`));\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).limit(2).intersectAll(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t\t.from(citiesTable).limit(2),\n\t\t\t\t\t).orderBy(asc(sql`id`));\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (intersect all) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await intersectAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t);\n\n\t\t\texpect(result).toHaveLength(1);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tintersectAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (except) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(citiesTable).except(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select()\n\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t);\n\n\t\t\texpect(result).toHaveLength(1);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('set operations (except) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await except(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).limit(3);\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\texcept(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t.from(citiesTable),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).limit(3);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (except all) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(citiesTable).exceptAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t).orderBy(asc(sql`id`));\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(citiesTable).exceptAll(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\t).orderBy(asc(sql`id`));\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (except all) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await exceptAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(gt(users2Table.id, 7)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).limit(6).orderBy(asc(sql.identifier('id')));\n\n\t\t\texpect(result).toHaveLength(6);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 2, name: 'Jane' },\n\t\t\t\t{ id: 3, name: 'Jack' },\n\t\t\t\t{ id: 4, name: 'Peter' },\n\t\t\t\t{ id: 5, name: 'Ben' },\n\t\t\t\t{ id: 6, name: 'Jill' },\n\t\t\t\t{ id: 7, name: 'Mary' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\texceptAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(gt(users2Table.id, 7)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).limit(6);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (mixed) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(citiesTable).except(\n\t\t\t\t\t({ unionAll }) =>\n\t\t\t\t\t\tunionAll(\n\t\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t\t.select()\n\t\t\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t\t\tdb.select().from(citiesTable).where(eq(citiesTable.id, 2)),\n\t\t\t\t\t\t).orderBy(asc(citiesTable.id)).limit(1).offset(1),\n\t\t\t\t);\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(citiesTable).except(\n\t\t\t\t\t\t({ unionAll }) =>\n\t\t\t\t\t\t\tunionAll(\n\t\t\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t\t\t\tdb.select().from(citiesTable).where(eq(citiesTable.id, 2)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (mixed all) as function with subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst sq = except(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(gte(users2Table.id, 5)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 7)),\n\t\t\t).orderBy(asc(sql.identifier('id'))).as('sq');\n\n\t\t\tconst result = await union(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb.select().from(sq).limit(1),\n\t\t\t\tdb\n\t\t\t\t\t.select().from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t);\n\n\t\t\texpect(result).toHaveLength(4);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 5, name: 'Ben' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tunion(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\texcept(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t\t.from(users2Table).where(gte(users2Table.id, 5)),\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 7)),\n\t\t\t\t\t).limit(1),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select().from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('aggregate function: count', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: count() }).from(table);\n\t\t\tconst result2 = await db.select({ value: count(table.a) }).from(table);\n\t\t\tconst result3 = await db.select({ value: countDistinct(table.name) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe(7);\n\t\t\texpect(result2[0]?.value).toBe(5);\n\t\t\texpect(result3[0]?.value).toBe(6);\n\t\t});\n\n\t\ttest('aggregate function: avg', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: avg(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: avg(table.nullOnly) }).from(table);\n\t\t\tconst result3 = await db.select({ value: avgDistinct(table.b) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe('33.3333');\n\t\t\texpect(result2[0]?.value).toBe(null);\n\t\t\texpect(result3[0]?.value).toBe('42.5000');\n\t\t});\n\n\t\ttest('aggregate function: sum', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: sum(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: sum(table.nullOnly) }).from(table);\n\t\t\tconst result3 = await db.select({ value: sumDistinct(table.b) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe('200');\n\t\t\texpect(result2[0]?.value).toBe(null);\n\t\t\texpect(result3[0]?.value).toBe('170');\n\t\t});\n\n\t\ttest('aggregate function: max', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: max(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: max(table.nullOnly) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe(90);\n\t\t\texpect(result2[0]?.value).toBe(null);\n\t\t});\n\n\t\ttest('aggregate function: min', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: min(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: min(table.nullOnly) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe(10);\n\t\t\texpect(result2[0]?.value).toBe(null);\n\t\t});\n\n\t\ttest('test $onUpdateFn and $onUpdate works as $default', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`drop table if exists ${usersOnUpdate}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${usersOnUpdate} (\n\t\t\t\t\tid serial not null primary key,\n\t\t\t\t\tname text not null,\n\t\t\t\t\tupdate_counter integer default 1 not null,\n\t\t\t\t\tupdated_at datetime(3),\n\t\t\t\t\tuppercase_name text,\n\t\t\t\t\talways_null text\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(usersOnUpdate).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Jack' },\n\t\t\t\t{ name: 'Jill' },\n\t\t\t]);\n\t\t\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\n\t\t\tconst justDates = await db.select({ updatedAt }).from(usersOnUpdate);\n\n\t\t\tconst response = await db.select({ ...rest }).from(usersOnUpdate);\n\n\t\t\texpect(response).toEqual([\n\t\t\t\t{ name: 'John', id: 1, updateCounter: 1, uppercaseName: 'JOHN', alwaysNull: null },\n\t\t\t\t{ name: 'Jane', id: 2, updateCounter: 1, uppercaseName: 'JANE', alwaysNull: null },\n\t\t\t\t{ name: 'Jack', id: 3, updateCounter: 1, uppercaseName: 'JACK', alwaysNull: null },\n\t\t\t\t{ name: 'Jill', id: 4, updateCounter: 1, uppercaseName: 'JILL', alwaysNull: null },\n\t\t\t]);\n\t\t\tconst msDelay = 750;\n\n\t\t\tfor (const eachUser of justDates) {\n\t\t\t\texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t\t\t}\n\t\t});\n\n\t\ttest('test $onUpdateFn and $onUpdate works updating', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`drop table if exists ${usersOnUpdate}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${usersOnUpdate} (\n\t\t\t\t\tid serial not null primary key,\n\t\t\t\t\tname text not null,\n\t\t\t\t\tupdate_counter integer default 1 not null,\n\t\t\t\t\tupdated_at datetime(3),\n\t\t\t\t\tuppercase_name text,\n\t\t\t\t\talways_null text\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(usersOnUpdate).values([\n\t\t\t\t{ name: 'John', alwaysNull: 'this will will be null after updating' },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Jack' },\n\t\t\t\t{ name: 'Jill' },\n\t\t\t]);\n\t\t\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\t\t\tconst initial = await db.select({ updatedAt }).from(usersOnUpdate);\n\n\t\t\tawait db.update(usersOnUpdate).set({ name: 'Angel', uppercaseName: null }).where(eq(usersOnUpdate.id, 1));\n\n\t\t\tconst justDates = await db.select({ updatedAt }).from(usersOnUpdate);\n\n\t\t\tconst response = await db.select({ ...rest }).from(usersOnUpdate);\n\n\t\t\texpect(response).toEqual([\n\t\t\t\t{ name: 'Angel', id: 1, updateCounter: 2, uppercaseName: null, alwaysNull: null },\n\t\t\t\t{ name: 'Jane', id: 2, updateCounter: 1, uppercaseName: 'JANE', alwaysNull: null },\n\t\t\t\t{ name: 'Jack', id: 3, updateCounter: 1, uppercaseName: 'JACK', alwaysNull: null },\n\t\t\t\t{ name: 'Jill', id: 4, updateCounter: 1, uppercaseName: 'JILL', alwaysNull: null },\n\t\t\t]);\n\t\t\tconst msDelay = 750;\n\n\t\t\texpect(initial[0]?.updatedAt?.valueOf()).not.toBe(justDates[0]?.updatedAt?.valueOf());\n\n\t\t\tfor (const eachUser of justDates) {\n\t\t\t\texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t\t\t}\n\t\t});\n\n\t\t// mySchema tests\n\t\ttest('mySchema :: select all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst result = await db.select().from(usersMySchemaTable);\n\n\t\t\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\t// not timezone based timestamp, thats why it should not work here\n\t\t\t// t.assert(Math.abs(result[0]!.createdAt.getTime() - now) < 2000);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('mySchema :: select sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst users = await db.select({\n\t\t\t\tname: sql`upper(${usersMySchemaTable.name})`,\n\t\t\t}).from(usersMySchemaTable);\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('mySchema :: select typed sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst users = await db.select({\n\t\t\t\tname: sql<string>`upper(${usersMySchemaTable.name})`,\n\t\t\t}).from(usersMySchemaTable);\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('mySchema :: select distinct', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst usersDistinctTable = mysqlTable('users_distinct', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${usersDistinctTable}`);\n\t\t\tawait db.execute(sql`create table ${usersDistinctTable} (id int, name text)`);\n\n\t\t\tawait db.insert(usersDistinctTable).values([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'John' },\n\t\t\t\t{ id: 1, name: 'Jane' },\n\t\t\t]);\n\t\t\tconst users = await db.selectDistinct().from(usersDistinctTable).orderBy(\n\t\t\t\tusersDistinctTable.id,\n\t\t\t\tusersDistinctTable.name,\n\t\t\t);\n\n\t\t\tawait db.execute(sql`drop table ${usersDistinctTable}`);\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane' }, { id: 1, name: 'John' }, { id: 2, name: 'John' }]);\n\t\t});\n\n\t\ttest('mySchema :: insert returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tconst [result, _] = await db.insert(usersMySchemaTable).values({ name: 'John' });\n\n\t\t\texpect(result.insertId).toBe(1);\n\t\t});\n\n\t\ttest('mySchema :: delete returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst users = await db.delete(usersMySchemaTable).where(eq(usersMySchemaTable.name, 'John'));\n\n\t\t\texpect(users[0].affectedRows).toBe(1);\n\t\t});\n\n\t\ttest('mySchema :: update with returning partial', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst updatedUsers = await db.update(usersMySchemaTable).set({ name: 'Jane' }).where(\n\t\t\t\teq(usersMySchemaTable.name, 'John'),\n\t\t\t);\n\n\t\t\tconst users = await db.select({ id: usersMySchemaTable.id, name: usersMySchemaTable.name }).from(\n\t\t\t\tusersMySchemaTable,\n\t\t\t)\n\t\t\t\t.where(\n\t\t\t\t\teq(usersMySchemaTable.id, 1),\n\t\t\t\t);\n\n\t\t\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n\t\t});\n\n\t\ttest('mySchema :: delete with returning all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst deletedUser = await db.delete(usersMySchemaTable).where(eq(usersMySchemaTable.name, 'John'));\n\n\t\t\texpect(deletedUser[0].affectedRows).toBe(1);\n\t\t});\n\n\t\ttest('mySchema :: insert + select', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst result = await db.select().from(usersMySchemaTable);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'Jane' });\n\t\t\tconst result2 = await db.select().from(usersMySchemaTable);\n\t\t\texpect(result2).toEqual([\n\t\t\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result2[0]!.createdAt },\n\t\t\t\t{ id: 2, name: 'Jane', verified: false, jsonb: null, createdAt: result2[1]!.createdAt },\n\t\t\t]);\n\t\t});\n\n\t\ttest('mySchema :: insert with overridden default values', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John', verified: true });\n\t\t\tconst result = await db.select().from(usersMySchemaTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: true, jsonb: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('mySchema :: insert many', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Austin', verified: true },\n\t\t\t]);\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersMySchemaTable.id,\n\t\t\t\tname: usersMySchemaTable.name,\n\t\t\t\tjsonb: usersMySchemaTable.jsonb,\n\t\t\t\tverified: usersMySchemaTable.verified,\n\t\t\t}).from(usersMySchemaTable);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t\t\t]);\n\t\t});\n\n\t\ttest('mySchema :: select with group by as field', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersMySchemaTable.name }).from(usersMySchemaTable)\n\t\t\t\t.groupBy(usersMySchemaTable.name);\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('mySchema :: select with group by as column + sql', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersMySchemaTable.name }).from(usersMySchemaTable)\n\t\t\t\t.groupBy(usersMySchemaTable.id, sql`${usersMySchemaTable.name}`);\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('mySchema :: build query', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst query = db.select({ id: usersMySchemaTable.id, name: usersMySchemaTable.name }).from(usersMySchemaTable)\n\t\t\t\t.groupBy(usersMySchemaTable.id, usersMySchemaTable.name)\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql:\n\t\t\t\t\t`select \\`id\\`, \\`name\\` from \\`mySchema\\`.\\`userstest\\` group by \\`mySchema\\`.\\`userstest\\`.\\`id\\`, \\`mySchema\\`.\\`userstest\\`.\\`name\\``,\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t});\n\n\t\ttest('mySchema :: insert with spaces', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: sql`'Jo   h     n'` });\n\t\t\tconst result = await db.select({ id: usersMySchemaTable.id, name: usersMySchemaTable.name }).from(\n\t\t\t\tusersMySchemaTable,\n\t\t\t);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n\t\t});\n\n\t\ttest('mySchema :: prepared statement with placeholder in .where', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst stmt = db.select({\n\t\t\t\tid: usersMySchemaTable.id,\n\t\t\t\tname: usersMySchemaTable.name,\n\t\t\t}).from(usersMySchemaTable)\n\t\t\t\t.where(eq(usersMySchemaTable.id, sql.placeholder('id')))\n\t\t\t\t.prepare();\n\t\t\tconst result = await stmt.execute({ id: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('mySchema :: select from tables with same name from different schema using alias', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.execute(sql`drop table if exists \\`userstest\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`userstest\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`name\\` text not null,\n\t\t\t\t\t    \\`verified\\` boolean not null default false,\n\t\t\t\t\t    \\`jsonb\\` json,\n\t\t\t\t\t    \\`created_at\\` timestamp not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ id: 10, name: 'Ivan' });\n\t\t\tawait db.insert(usersTable).values({ id: 11, name: 'Hans' });\n\n\t\t\tconst customerAlias = alias(usersTable, 'customer');\n\n\t\t\tconst result = await db\n\t\t\t\t.select().from(usersMySchemaTable)\n\t\t\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t\t\t.where(eq(usersMySchemaTable.id, 10));\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tuserstest: {\n\t\t\t\t\tid: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t\tverified: false,\n\t\t\t\t\tjsonb: null,\n\t\t\t\t\tcreatedAt: result[0]!.userstest.createdAt,\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t\tverified: false,\n\t\t\t\t\tjsonb: null,\n\t\t\t\t\tcreatedAt: result[0]!.customer!.createdAt,\n\t\t\t\t},\n\t\t\t}]);\n\t\t});\n\n\t\ttest('insert $returningId: serial as id', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst result = await db.insert(usersTable).values({ name: 'John' }).$returningId();\n\n\t\t\texpectTypeOf(result).toEqualTypeOf<{\n\t\t\t\tid: number;\n\t\t\t}[]>();\n\n\t\t\texpect(result).toStrictEqual([{ id: 1 }]);\n\t\t});\n\n\t\ttest('insert $returningId: serial as id, not first column', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst usersTableDefNotFirstColumn = mysqlTable('users2', {\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t});\n\n\t\t\tconst result = await db.insert(usersTableDefNotFirstColumn).values({ name: 'John' }).$returningId();\n\n\t\t\texpectTypeOf(result).toEqualTypeOf<{\n\t\t\t\tid: number;\n\t\t\t}[]>();\n\n\t\t\texpect(result).toStrictEqual([{ id: 1 }]);\n\t\t});\n\n\t\ttest('insert $returningId: serial as id, batch insert', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst result = await db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]).$returningId();\n\n\t\t\texpectTypeOf(result).toEqualTypeOf<{\n\t\t\t\tid: number;\n\t\t\t}[]>();\n\n\t\t\texpect(result).toStrictEqual([{ id: 1 }, { id: 2 }]);\n\t\t});\n\n\t\ttest('insert $returningId: $default as primary key', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst uniqueKeys = ['ao865jf3mcmkfkk8o5ri495z', 'dyqs529eom0iczo2efxzbcut'];\n\t\t\tlet iterator = 0;\n\n\t\t\tconst usersTableDefFn = mysqlTable('users_default_fn', {\n\t\t\t\tcustomId: varchar('id', { length: 256 }).primaryKey().$defaultFn(() => {\n\t\t\t\t\tconst value = uniqueKeys[iterator]!;\n\t\t\t\t\titerator++;\n\t\t\t\t\treturn value;\n\t\t\t\t}),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait setupReturningFunctionsTest(db);\n\n\t\t\tconst result = await db.insert(usersTableDefFn).values([{ name: 'John' }, { name: 'John1' }])\n\t\t\t\t//    ^?\n\t\t\t\t.$returningId();\n\n\t\t\texpectTypeOf(result).toEqualTypeOf<{\n\t\t\t\tcustomId: string;\n\t\t\t}[]>();\n\n\t\t\texpect(result).toStrictEqual([{ customId: 'ao865jf3mcmkfkk8o5ri495z' }, {\n\t\t\t\tcustomId: 'dyqs529eom0iczo2efxzbcut',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('insert $returningId: $default as primary key with value', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst uniqueKeys = ['ao865jf3mcmkfkk8o5ri495z', 'dyqs529eom0iczo2efxzbcut'];\n\t\t\tlet iterator = 0;\n\n\t\t\tconst usersTableDefFn = mysqlTable('users_default_fn', {\n\t\t\t\tcustomId: varchar('id', { length: 256 }).primaryKey().$defaultFn(() => {\n\t\t\t\t\tconst value = uniqueKeys[iterator]!;\n\t\t\t\t\titerator++;\n\t\t\t\t\treturn value;\n\t\t\t\t}),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait setupReturningFunctionsTest(db);\n\n\t\t\tconst result = await db.insert(usersTableDefFn).values([{ name: 'John', customId: 'test' }, { name: 'John1' }])\n\t\t\t\t//    ^?\n\t\t\t\t.$returningId();\n\n\t\t\texpectTypeOf(result).toEqualTypeOf<{\n\t\t\t\tcustomId: string;\n\t\t\t}[]>();\n\n\t\t\texpect(result).toStrictEqual([{ customId: 'test' }, { customId: 'ao865jf3mcmkfkk8o5ri495z' }]);\n\t\t});\n\n\t\ttest('mySchema :: view', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst newYorkers1 = mySchema.view('new_yorkers')\n\t\t\t\t.as((qb) => qb.select().from(users2MySchemaTable).where(eq(users2MySchemaTable.cityId, 1)));\n\n\t\t\tconst newYorkers2 = mySchema.view('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: int('city_id').notNull(),\n\t\t\t}).as(sql`select * from ${users2MySchemaTable} where ${eq(users2MySchemaTable.cityId, 1)}`);\n\n\t\t\tconst newYorkers3 = mySchema.view('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: int('city_id').notNull(),\n\t\t\t}).existing();\n\n\t\t\tawait db.execute(sql`create view ${newYorkers1} as ${getViewConfig(newYorkers1).query}`);\n\n\t\t\tawait db.insert(citiesMySchemaTable).values([{ name: 'New York' }, { name: 'Paris' }]);\n\n\t\t\tawait db.insert(users2MySchemaTable).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 1 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers1);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers2);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers3);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\tawait db.execute(sql`drop view ${newYorkers1}`);\n\t\t});\n\n\t\ttest('test $onUpdateFn and $onUpdate works with sql value', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst users = mysqlTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tupdatedAt: timestamp('updated_at', {\n\t\t\t\t\tfsp: 6,\n\t\t\t\t})\n\t\t\t\t\t.notNull()\n\t\t\t\t\t.$onUpdate(() => sql`current_timestamp`),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${users} (\n\t\t\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\t\t\\`updated_at\\` timestamp not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values({\n\t\t\t\tname: 'John',\n\t\t\t});\n\t\t\tconst insertResp = await db.select({ updatedAt: users.updatedAt }).from(users);\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\n\t\t\tconst now = Date.now();\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\t\t\tawait db.update(users).set({\n\t\t\t\tname: 'John',\n\t\t\t});\n\t\t\tconst updateResp = await db.select({ updatedAt: users.updatedAt }).from(users);\n\n\t\t\texpect(insertResp[0]?.updatedAt.getTime() ?? 0).lessThan(now);\n\t\t\texpect(updateResp[0]?.updatedAt.getTime() ?? 0).greaterThan(now);\n\t\t});\n\n\t\ttest('$count separate', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst countTestTable = mysqlTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await db.$count(countTestTable);\n\n\t\t\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).toStrictEqual(4);\n\t\t});\n\n\t\ttest('$count embedded', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst countTestTable = mysqlTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await db.select({\n\t\t\t\tcount: db.$count(countTestTable),\n\t\t\t}).from(countTestTable);\n\n\t\t\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).toStrictEqual([\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('$count separate reuse', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst countTestTable = mysqlTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = db.$count(countTestTable);\n\n\t\t\tconst count1 = await count;\n\n\t\t\tawait db.insert(countTestTable).values({ id: 5, name: 'fifth' });\n\n\t\t\tconst count2 = await count;\n\n\t\t\tawait db.insert(countTestTable).values({ id: 6, name: 'sixth' });\n\n\t\t\tconst count3 = await count;\n\n\t\t\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count1).toStrictEqual(4);\n\t\t\texpect(count2).toStrictEqual(5);\n\t\t\texpect(count3).toStrictEqual(6);\n\t\t});\n\n\t\ttest('$count embedded reuse', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst countTestTable = mysqlTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = db.select({\n\t\t\t\tcount: db.$count(countTestTable),\n\t\t\t}).from(countTestTable);\n\n\t\t\tconst count1 = await count;\n\n\t\t\tawait db.insert(countTestTable).values({ id: 5, name: 'fifth' });\n\n\t\t\tconst count2 = await count;\n\n\t\t\tawait db.insert(countTestTable).values({ id: 6, name: 'sixth' });\n\n\t\t\tconst count3 = await count;\n\n\t\t\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count1).toStrictEqual([\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t]);\n\t\t\texpect(count2).toStrictEqual([\n\t\t\t\t{ count: 5 },\n\t\t\t\t{ count: 5 },\n\t\t\t\t{ count: 5 },\n\t\t\t\t{ count: 5 },\n\t\t\t\t{ count: 5 },\n\t\t\t]);\n\t\t\texpect(count3).toStrictEqual([\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('$count separate with filters', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst countTestTable = mysqlTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await db.$count(countTestTable, gt(countTestTable.id, 1));\n\n\t\t\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).toStrictEqual(3);\n\t\t});\n\n\t\ttest('$count embedded with filters', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst countTestTable = mysqlTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await db.select({\n\t\t\t\tcount: db.$count(countTestTable, gt(countTestTable.id, 1)),\n\t\t\t}).from(countTestTable);\n\n\t\t\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).toStrictEqual([\n\t\t\t\t{ count: 3 },\n\t\t\t\t{ count: 3 },\n\t\t\t\t{ count: 3 },\n\t\t\t\t{ count: 3 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('limit 0', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db\n\t\t\t\t.select()\n\t\t\t\t.from(usersTable)\n\t\t\t\t.limit(0);\n\n\t\t\texpect(users).toEqual([]);\n\t\t});\n\n\t\ttest('limit -1', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db\n\t\t\t\t.select()\n\t\t\t\t.from(usersTable)\n\t\t\t\t.limit(-1);\n\n\t\t\texpect(users.length).toBeGreaterThan(0);\n\t\t});\n\n\t\ttest('define constraints as array', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst table = mysqlTable('name', {\n\t\t\t\tid: int(),\n\t\t\t}, (t) => [\n\t\t\t\tindex('name').on(t.id),\n\t\t\t\tprimaryKey({ columns: [t.id], name: 'custom' }),\n\t\t\t]);\n\n\t\t\tconst { indexes, primaryKeys } = getTableConfig(table);\n\n\t\t\texpect(indexes.length).toBe(1);\n\t\t\texpect(primaryKeys.length).toBe(1);\n\t\t});\n\n\t\ttest('define constraints as array inside third param', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tconst table = mysqlTable('name', {\n\t\t\t\tid: int(),\n\t\t\t}, (t) => [\n\t\t\t\t[index('name').on(t.id), primaryKey({ columns: [t.id], name: 'custom' })],\n\t\t\t]);\n\n\t\t\tconst { indexes, primaryKeys } = getTableConfig(table);\n\n\t\t\texpect(indexes.length).toBe(1);\n\t\t\texpect(primaryKeys.length).toBe(1);\n\t\t});\n\n\t\ttest('update with limit and order by', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values([\n\t\t\t\t{ name: 'Barry', verified: false },\n\t\t\t\t{ name: 'Alan', verified: false },\n\t\t\t\t{ name: 'Carl', verified: false },\n\t\t\t]);\n\n\t\t\tawait db.update(usersTable).set({ verified: true }).limit(2).orderBy(asc(usersTable.name));\n\n\t\t\tconst result = await db.select({ name: usersTable.name, verified: usersTable.verified }).from(usersTable).orderBy(\n\t\t\t\tasc(usersTable.name),\n\t\t\t);\n\t\t\texpect(result).toStrictEqual([\n\t\t\t\t{ name: 'Alan', verified: true },\n\t\t\t\t{ name: 'Barry', verified: true },\n\t\t\t\t{ name: 'Carl', verified: false },\n\t\t\t]);\n\t\t});\n\n\t\ttest('delete with limit and order by', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.insert(usersTable).values([\n\t\t\t\t{ name: 'Barry', verified: false },\n\t\t\t\t{ name: 'Alan', verified: false },\n\t\t\t\t{ name: 'Carl', verified: false },\n\t\t\t]);\n\n\t\t\tawait db.delete(usersTable).where(eq(usersTable.verified, false)).limit(1).orderBy(asc(usersTable.name));\n\n\t\t\tconst result = await db.select({ name: usersTable.name, verified: usersTable.verified }).from(usersTable).orderBy(\n\t\t\t\tasc(usersTable.name),\n\t\t\t);\n\t\t\texpect(result).toStrictEqual([\n\t\t\t\t{ name: 'Barry', verified: false },\n\t\t\t\t{ name: 'Carl', verified: false },\n\t\t\t]);\n\t\t});\n\n\t\ttest('Object keys as column names', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\t// Tests the following:\n\t\t\t// Column with required config\n\t\t\t// Column with optional config without providing a value\n\t\t\t// Column with optional config providing a value\n\t\t\t// Column without config\n\t\t\tconst users = mysqlTable('users', {\n\t\t\t\tid: bigint({ mode: 'number' }).autoincrement().primaryKey(),\n\t\t\t\tcreatedAt: timestamp(),\n\t\t\t\tupdatedAt: timestamp({ fsp: 3 }),\n\t\t\t\tadmin: boolean(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists users`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users (\n\t\t\t\t\t\t\\`id\\` bigint auto_increment primary key,\n\t\t\t\t\t\t\\`createdAt\\` timestamp,\n\t\t\t\t\t\t\\`updatedAt\\` timestamp(3),\n\t\t\t\t\t\t\\`admin\\` boolean\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ createdAt: sql`now() - interval 30 day`, updatedAt: sql`now() - interval 1 day`, admin: true },\n\t\t\t\t{ createdAt: sql`now() - interval 1 day`, updatedAt: sql`now() - interval 30 day`, admin: true },\n\t\t\t\t{ createdAt: sql`now() - interval 1 day`, updatedAt: sql`now() - interval 1 day`, admin: false },\n\t\t\t]);\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: users.id, admin: users.admin })\n\t\t\t\t.from(users)\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\tgt(users.createdAt, sql`now() - interval 7 day`),\n\t\t\t\t\t\tgt(users.updatedAt, sql`now() - interval 7 day`),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 3, admin: false },\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop table users`);\n\t\t});\n\n\t\ttest('cross join', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t]);\n\n\t\t\tawait db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'Seattle' },\n\t\t\t\t\t{ name: 'New York City' },\n\t\t\t\t]);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tuser: usersTable.name,\n\t\t\t\t\tcity: citiesTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.crossJoin(citiesTable)\n\t\t\t\t.orderBy(usersTable.name, citiesTable.name);\n\n\t\t\texpect(result).toStrictEqual([\n\t\t\t\t{ city: 'New York City', user: 'Jane' },\n\t\t\t\t{ city: 'Seattle', user: 'Jane' },\n\t\t\t\t{ city: 'New York City', user: 'John' },\n\t\t\t\t{ city: 'Seattle', user: 'John' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('left join (lateral)', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }]);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users2Table.id,\n\t\t\t\t\tuserName: users2Table.name,\n\t\t\t\t\tcityId: users2Table.cityId,\n\t\t\t\t})\n\t\t\t\t.from(users2Table)\n\t\t\t\t.where(eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tcityId: citiesTable.id,\n\t\t\t\t\tcityName: citiesTable.name,\n\t\t\t\t\tuserId: sq.userId,\n\t\t\t\t\tuserName: sq.userName,\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.leftJoinLateral(sq, sql`true`);\n\n\t\t\texpect(res).toStrictEqual([\n\t\t\t\t{ cityId: 1, cityName: 'Paris', userId: 1, userName: 'John' },\n\t\t\t\t{ cityId: 2, cityName: 'London', userId: null, userName: null },\n\t\t\t]);\n\t\t});\n\n\t\ttest('inner join (lateral)', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }]);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users2Table.id,\n\t\t\t\t\tuserName: users2Table.name,\n\t\t\t\t\tcityId: users2Table.cityId,\n\t\t\t\t})\n\t\t\t\t.from(users2Table)\n\t\t\t\t.where(eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tcityId: citiesTable.id,\n\t\t\t\t\tcityName: citiesTable.name,\n\t\t\t\t\tuserId: sq.userId,\n\t\t\t\t\tuserName: sq.userName,\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.innerJoinLateral(sq, sql`true`);\n\n\t\t\texpect(res).toStrictEqual([\n\t\t\t\t{ cityId: 1, cityName: 'Paris', userId: 1, userName: 'John' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('cross join (lateral)', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }, { id: 3, name: 'Berlin' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }, {\n\t\t\t\tname: 'Patrick',\n\t\t\t\tcityId: 2,\n\t\t\t}]);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users2Table.id,\n\t\t\t\t\tuserName: users2Table.name,\n\t\t\t\t\tcityId: users2Table.cityId,\n\t\t\t\t})\n\t\t\t\t.from(users2Table)\n\t\t\t\t.where(not(like(citiesTable.name, 'L%')))\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tcityId: citiesTable.id,\n\t\t\t\t\tcityName: citiesTable.name,\n\t\t\t\t\tuserId: sq.userId,\n\t\t\t\t\tuserName: sq.userName,\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.crossJoinLateral(sq)\n\t\t\t\t.orderBy(citiesTable.id, sq.userId);\n\n\t\t\texpect(res).toStrictEqual([\n\t\t\t\t{\n\t\t\t\t\tcityId: 1,\n\t\t\t\t\tcityName: 'Paris',\n\t\t\t\t\tuserId: 1,\n\t\t\t\t\tuserName: 'John',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcityId: 1,\n\t\t\t\t\tcityName: 'Paris',\n\t\t\t\t\tuserId: 2,\n\t\t\t\t\tuserName: 'Jane',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcityId: 1,\n\t\t\t\t\tcityName: 'Paris',\n\t\t\t\t\tuserId: 3,\n\t\t\t\t\tuserName: 'Patrick',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcityId: 3,\n\t\t\t\t\tcityName: 'Berlin',\n\t\t\t\t\tuserId: 1,\n\t\t\t\t\tuserName: 'John',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcityId: 3,\n\t\t\t\t\tcityName: 'Berlin',\n\t\t\t\t\tuserId: 2,\n\t\t\t\t\tuserName: 'Jane',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcityId: 3,\n\t\t\t\t\tcityName: 'Berlin',\n\t\t\t\t\tuserId: 3,\n\t\t\t\t\tuserName: 'Patrick',\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('all types', async (ctx) => {\n\t\t\tconst { db } = ctx.mysql;\n\n\t\t\tawait db.execute(sql`\n\t\t\t\tCREATE TABLE \\`all_types\\` (\n\t\t\t\t\t\t\\`serial\\` serial AUTO_INCREMENT,\n\t\t\t\t\t\t\\`bigint53\\` bigint,\n\t\t\t\t\t\t\\`bigint64\\` bigint,\n\t\t\t\t\t\t\\`binary\\` binary,\n\t\t\t\t\t\t\\`boolean\\` boolean,\n\t\t\t\t\t\t\\`char\\` char,\n\t\t\t\t\t\t\\`date\\` date,\n\t\t\t\t\t\t\\`date_str\\` date,\n\t\t\t\t\t\t\\`datetime\\` datetime,\n\t\t\t\t\t\t\\`datetime_str\\` datetime,\n\t\t\t\t\t\t\\`decimal\\` decimal,\n\t\t\t\t\t\t\\`decimal_num\\` decimal(30),\n\t\t\t\t\t\t\\`decimal_big\\` decimal(30),\n\t\t\t\t\t\t\\`double\\` double,\n\t\t\t\t\t\t\\`float\\` float,\n\t\t\t\t\t\t\\`int\\` int,\n\t\t\t\t\t\t\\`json\\` json,\n\t\t\t\t\t\t\\`med_int\\` mediumint,\n\t\t\t\t\t\t\\`small_int\\` smallint,\n\t\t\t\t\t\t\\`real\\` real,\n\t\t\t\t\t\t\\`text\\` text,\n\t\t\t\t\t\t\\`time\\` time,\n\t\t\t\t\t\t\\`timestamp\\` timestamp,\n\t\t\t\t\t\t\\`timestamp_str\\` timestamp,\n\t\t\t\t\t\t\\`tiny_int\\` tinyint,\n\t\t\t\t\t\t\\`varbin\\` varbinary(16),\n\t\t\t\t\t\t\\`varchar\\` varchar(255),\n\t\t\t\t\t\t\\`year\\` year,\n\t\t\t\t\t\t\\`enum\\` enum('enV1','enV2')\n\t\t\t\t\t);\n\t\t\t`);\n\n\t\t\tawait db.insert(allTypesTable).values({\n\t\t\t\tserial: 1,\n\t\t\t\tbigint53: 9007199254740991,\n\t\t\t\tbigint64: 5044565289845416380n,\n\t\t\t\tbinary: '1',\n\t\t\t\tboolean: true,\n\t\t\t\tchar: 'c',\n\t\t\t\tdate: new Date(1741743161623),\n\t\t\t\tdateStr: new Date(1741743161623).toISOString().slice(0, 19).replace('T', ' '),\n\t\t\t\tdatetime: new Date(1741743161623),\n\t\t\t\tdatetimeStr: new Date(1741743161623).toISOString().slice(0, 19).replace('T', ' '),\n\t\t\t\tdecimal: '47521',\n\t\t\t\tdecimalNum: 9007199254740991,\n\t\t\t\tdecimalBig: 5044565289845416380n,\n\t\t\t\tdouble: 15.35325689124218,\n\t\t\t\tenum: 'enV1',\n\t\t\t\tfloat: 1.048596,\n\t\t\t\treal: 1.048596,\n\t\t\t\ttext: 'C4-',\n\t\t\t\tint: 621,\n\t\t\t\tjson: {\n\t\t\t\t\tstr: 'strval',\n\t\t\t\t\tarr: ['str', 10],\n\t\t\t\t},\n\t\t\t\tmedInt: 560,\n\t\t\t\tsmallInt: 14,\n\t\t\t\ttime: '04:13:22',\n\t\t\t\ttimestamp: new Date(1741743161623),\n\t\t\t\ttimestampStr: new Date(1741743161623).toISOString().slice(0, 19).replace('T', ' '),\n\t\t\t\ttinyInt: 7,\n\t\t\t\tvarbin: '1010110101001101',\n\t\t\t\tvarchar: 'VCHAR',\n\t\t\t\tyear: 2025,\n\t\t\t});\n\n\t\t\tconst rawRes = await db.select().from(allTypesTable);\n\n\t\t\ttype ExpectedType = {\n\t\t\t\tserial: number;\n\t\t\t\tbigint53: number | null;\n\t\t\t\tbigint64: bigint | null;\n\t\t\t\tbinary: string | null;\n\t\t\t\tboolean: boolean | null;\n\t\t\t\tchar: string | null;\n\t\t\t\tdate: Date | null;\n\t\t\t\tdateStr: string | null;\n\t\t\t\tdatetime: Date | null;\n\t\t\t\tdatetimeStr: string | null;\n\t\t\t\tdecimal: string | null;\n\t\t\t\tdecimalNum: number | null;\n\t\t\t\tdecimalBig: bigint | null;\n\t\t\t\tdouble: number | null;\n\t\t\t\tfloat: number | null;\n\t\t\t\tint: number | null;\n\t\t\t\tjson: unknown;\n\t\t\t\tmedInt: number | null;\n\t\t\t\tsmallInt: number | null;\n\t\t\t\treal: number | null;\n\t\t\t\ttext: string | null;\n\t\t\t\ttime: string | null;\n\t\t\t\ttimestamp: Date | null;\n\t\t\t\ttimestampStr: string | null;\n\t\t\t\ttinyInt: number | null;\n\t\t\t\tvarbin: string | null;\n\t\t\t\tvarchar: string | null;\n\t\t\t\tyear: number | null;\n\t\t\t\tenum: 'enV1' | 'enV2' | null;\n\t\t\t}[];\n\n\t\t\tconst expectedRes: ExpectedType = [\n\t\t\t\t{\n\t\t\t\t\tserial: 1,\n\t\t\t\t\tbigint53: 9007199254740991,\n\t\t\t\t\tbigint64: 5044565289845416380n,\n\t\t\t\t\tbinary: '1',\n\t\t\t\t\tboolean: true,\n\t\t\t\t\tchar: 'c',\n\t\t\t\t\tdate: new Date('2025-03-12T00:00:00.000Z'),\n\t\t\t\t\tdateStr: '2025-03-12',\n\t\t\t\t\tdatetime: new Date('2025-03-12T01:32:42.000Z'),\n\t\t\t\t\tdatetimeStr: '2025-03-12 01:32:41',\n\t\t\t\t\tdecimal: '47521',\n\t\t\t\t\tdecimalNum: 9007199254740991,\n\t\t\t\t\tdecimalBig: 5044565289845416380n,\n\t\t\t\t\tdouble: 15.35325689124218,\n\t\t\t\t\tfloat: 1.0486,\n\t\t\t\t\tint: 621,\n\t\t\t\t\tjson: { arr: ['str', 10], str: 'strval' },\n\t\t\t\t\tmedInt: 560,\n\t\t\t\t\tsmallInt: 14,\n\t\t\t\t\treal: 1.048596,\n\t\t\t\t\ttext: 'C4-',\n\t\t\t\t\ttime: '04:13:22',\n\t\t\t\t\ttimestamp: new Date('2025-03-12T01:32:42.000Z'),\n\t\t\t\t\ttimestampStr: '2025-03-12 01:32:41',\n\t\t\t\t\ttinyInt: 7,\n\t\t\t\t\tvarbin: '1010110101001101',\n\t\t\t\t\tvarchar: 'VCHAR',\n\t\t\t\t\tyear: 2025,\n\t\t\t\t\tenum: 'enV1',\n\t\t\t\t},\n\t\t\t];\n\n\t\t\texpectTypeOf(rawRes).toEqualTypeOf<ExpectedType>();\n\t\t\texpect(rawRes).toStrictEqual(expectedRes);\n\t\t});\n\t});\n\n\ttest('insert into ... select', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst notifications = mysqlTable('notifications', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tsentAt: timestamp('sent_at').notNull().defaultNow(),\n\t\t\tmessage: text('message').notNull(),\n\t\t});\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\t\tconst userNotications = mysqlTable('user_notifications', {\n\t\t\tuserId: int('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),\n\t\t\tnotificationId: int('notification_id').notNull().references(() => notifications.id, { onDelete: 'cascade' }),\n\t\t}, (t) => ({\n\t\t\tpk: primaryKey({ columns: [t.userId, t.notificationId] }),\n\t\t}));\n\n\t\tawait db.execute(sql`drop table if exists ${notifications}`);\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`drop table if exists ${userNotications}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${notifications} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`sent_at\\` timestamp not null default now(),\n\t\t\t\t\\`message\\` text not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${userNotications} (\n\t\t\t\t\\`user_id\\` int references users(id) on delete cascade,\n\t\t\t\t\\`notification_id\\` int references notifications(id) on delete cascade,\n\t\t\t\tprimary key (user_id, notification_id)\n\t\t\t)\n\t\t`);\n\n\t\tawait db\n\t\t\t.insert(notifications)\n\t\t\t.values({ message: 'You are one of the 3 lucky winners!' });\n\t\tconst newNotification = await db\n\t\t\t.select({ id: notifications.id })\n\t\t\t.from(notifications)\n\t\t\t.then((result) => result[0]);\n\n\t\tawait db.insert(users).values([\n\t\t\t{ name: 'Alice' },\n\t\t\t{ name: 'Bob' },\n\t\t\t{ name: 'Charlie' },\n\t\t\t{ name: 'David' },\n\t\t\t{ name: 'Eve' },\n\t\t]);\n\n\t\tawait db\n\t\t\t.insert(userNotications)\n\t\t\t.select(\n\t\t\t\tdb\n\t\t\t\t\t.select({\n\t\t\t\t\t\tuserId: users.id,\n\t\t\t\t\t\tnotificationId: sql`(${newNotification!.id})`.as('notification_id'),\n\t\t\t\t\t})\n\t\t\t\t\t.from(users)\n\t\t\t\t\t.where(inArray(users.name, ['Alice', 'Charlie', 'Eve']))\n\t\t\t\t\t.orderBy(asc(users.id)),\n\t\t\t);\n\t\tconst sentNotifications = await db.select().from(userNotications);\n\n\t\texpect(sentNotifications).toStrictEqual([\n\t\t\t{ userId: 1, notificationId: newNotification!.id },\n\t\t\t{ userId: 3, notificationId: newNotification!.id },\n\t\t\t{ userId: 5, notificationId: newNotification!.id },\n\t\t]);\n\t});\n\n\ttest('insert into ... select with keys in different order', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users1 = mysqlTable('users1', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\t\tconst users2 = mysqlTable('users2', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\tawait db.execute(sql`drop table if exists ${users1}`);\n\t\tawait db.execute(sql`drop table if exists ${users2}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users1} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users2} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null\n\t\t\t)\n\t\t`);\n\n\t\texpect(\n\t\t\t() =>\n\t\t\t\tdb\n\t\t\t\t\t.insert(users1)\n\t\t\t\t\t.select(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\t\tname: users2.name,\n\t\t\t\t\t\t\t\tid: users2.id,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.from(users2),\n\t\t\t\t\t),\n\t\t).toThrowError();\n\t});\n\n\ttest('MySqlTable :: select with `use index` hint', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t}, () => [usersTableNameIndex]);\n\t\tconst usersTableNameIndex = index('users_name_index').on(users.name);\n\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index users_name_index ON users(name)`);\n\n\t\tawait db.insert(users).values([\n\t\t\t{ name: 'Alice' },\n\t\t\t{ name: 'Bob' },\n\t\t\t{ name: 'Charlie' },\n\t\t\t{ name: 'David' },\n\t\t\t{ name: 'Eve' },\n\t\t]);\n\n\t\tconst result = await db.select()\n\t\t\t.from(users, {\n\t\t\t\tuseIndex: [usersTableNameIndex],\n\t\t\t})\n\t\t\t.where(eq(users.name, 'David'));\n\n\t\texpect(result).toHaveLength(1);\n\t\texpect(result).toEqual([{ id: 4, name: 'David' }]);\n\t});\n\n\ttest('MySqlTable :: select with `use index` hint on 1 index', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t}, () => [usersTableNameIndex]);\n\t\tconst usersTableNameIndex = index('users_name_index').on(users.name);\n\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index users_name_index ON users(name)`);\n\n\t\tconst query = db.select()\n\t\t\t.from(users, {\n\t\t\t\tuseIndex: usersTableNameIndex,\n\t\t\t})\n\t\t\t.where(eq(users.name, 'David'))\n\t\t\t.toSQL();\n\n\t\texpect(query.sql).to.include('USE INDEX (users_name_index)');\n\t});\n\n\ttest('MySqlTable :: select with `use index` hint on multiple indexes', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t\tage: int('age').notNull(),\n\t\t}, () => [usersTableNameIndex, usersTableAgeIndex]);\n\t\tconst usersTableNameIndex = index('users_name_index').on(users.name);\n\t\tconst usersTableAgeIndex = index('users_age_index').on(users.age);\n\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null,\n\t\t\t\t\\`age\\` int not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index users_name_index ON users(name)`);\n\t\tawait db.execute(sql`create index users_age_index ON users(age)`);\n\n\t\tconst query = db.select()\n\t\t\t.from(users, {\n\t\t\t\tuseIndex: [usersTableNameIndex, usersTableAgeIndex],\n\t\t\t})\n\t\t\t.where(eq(users.name, 'David'))\n\t\t\t.toSQL();\n\n\t\texpect(query.sql).to.include('USE INDEX (users_name_index, users_age_index)');\n\t});\n\n\ttest('MySqlTable :: select with `use index` hint on not existed index', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t}, () => [usersTableNameIndex]);\n\t\tconst usersTableNameIndex = index('users_name_index').on(users.name);\n\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index users_name_index ON users(name)`);\n\n\t\tawait db.insert(users).values([\n\t\t\t{ name: 'Alice' },\n\t\t\t{ name: 'Bob' },\n\t\t\t{ name: 'Charlie' },\n\t\t\t{ name: 'David' },\n\t\t\t{ name: 'Eve' },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\treturn await db.select()\n\t\t\t\t.from(users, {\n\t\t\t\t\tuseIndex: ['some_other_index'],\n\t\t\t\t})\n\t\t\t\t.where(eq(users.name, 'David'));\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('MySqlTable :: select with `use index` + `force index` incompatible hints', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t\tage: int('age').notNull(),\n\t\t}, () => [usersTableNameIndex, usersTableAgeIndex]);\n\t\tconst usersTableNameIndex = index('users_name_index').on(users.name);\n\t\tconst usersTableAgeIndex = index('users_age_index').on(users.age);\n\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null,\n\t\t\t\t\\`age\\` int not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index users_name_index ON users(name)`);\n\t\tawait db.execute(sql`create index users_age_index ON users(age)`);\n\n\t\tawait db.insert(users).values([\n\t\t\t{ name: 'Alice', age: 18 },\n\t\t\t{ name: 'Bob', age: 19 },\n\t\t\t{ name: 'Charlie', age: 20 },\n\t\t\t{ name: 'David', age: 21 },\n\t\t\t{ name: 'Eve', age: 22 },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\treturn await db.select()\n\t\t\t\t.from(users, {\n\t\t\t\t\tuseIndex: [usersTableNameIndex],\n\t\t\t\t\tforceIndex: [usersTableAgeIndex],\n\t\t\t\t})\n\t\t\t\t.where(eq(users.name, 'David'));\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('MySqlTable :: select with join `use index` hint', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t});\n\n\t\tconst posts = mysqlTable('posts', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\ttext: varchar('text', { length: 100 }).notNull(),\n\t\t\tuserId: int('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),\n\t\t}, () => [postsTableUserIdIndex]);\n\t\tconst postsTableUserIdIndex = index('posts_user_id_index').on(posts.userId);\n\n\t\tawait db.execute(sql`drop table if exists ${posts}`);\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${posts} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`text\\` varchar(100) not null,\n\t\t\t\t\\`user_id\\` int not null references users(id) on delete cascade\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index posts_user_id_index ON posts(user_id)`);\n\n\t\tawait db.insert(users).values([\n\t\t\t{ name: 'Alice' },\n\t\t\t{ name: 'Bob' },\n\t\t\t{ name: 'Charlie' },\n\t\t\t{ name: 'David' },\n\t\t\t{ name: 'Eve' },\n\t\t]);\n\n\t\tawait db.insert(posts).values([\n\t\t\t{ text: 'Alice post', userId: 1 },\n\t\t\t{ text: 'Bob post', userId: 2 },\n\t\t\t{ text: 'Charlie post', userId: 3 },\n\t\t\t{ text: 'David post', userId: 4 },\n\t\t\t{ text: 'Eve post', userId: 5 },\n\t\t]);\n\n\t\tconst result = await db.select({\n\t\t\tuserId: users.id,\n\t\t\tname: users.name,\n\t\t\tpostId: posts.id,\n\t\t\ttext: posts.text,\n\t\t})\n\t\t\t.from(users)\n\t\t\t.leftJoin(posts, eq(users.id, posts.userId), {\n\t\t\t\tuseIndex: [postsTableUserIdIndex],\n\t\t\t})\n\t\t\t.where(and(\n\t\t\t\teq(users.name, 'David'),\n\t\t\t\teq(posts.text, 'David post'),\n\t\t\t));\n\n\t\texpect(result).toHaveLength(1);\n\t\texpect(result).toEqual([{ userId: 4, name: 'David', postId: 4, text: 'David post' }]);\n\t});\n\n\ttest('MySqlTable :: select with join `use index` hint on 1 index', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t});\n\n\t\tconst posts = mysqlTable('posts', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\ttext: varchar('text', { length: 100 }).notNull(),\n\t\t\tuserId: int('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),\n\t\t}, () => [postsTableUserIdIndex]);\n\t\tconst postsTableUserIdIndex = index('posts_user_id_index').on(posts.userId);\n\n\t\tawait db.execute(sql`drop table if exists ${posts}`);\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${posts} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`text\\` varchar(100) not null,\n\t\t\t\t\\`user_id\\` int not null references users(id) on delete cascade\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index posts_user_id_index ON posts(user_id)`);\n\n\t\tconst query = db.select({\n\t\t\tuserId: users.id,\n\t\t\tname: users.name,\n\t\t\tpostId: posts.id,\n\t\t\ttext: posts.text,\n\t\t})\n\t\t\t.from(users)\n\t\t\t.leftJoin(posts, eq(users.id, posts.userId), {\n\t\t\t\tuseIndex: postsTableUserIdIndex,\n\t\t\t})\n\t\t\t.where(and(\n\t\t\t\teq(users.name, 'David'),\n\t\t\t\teq(posts.text, 'David post'),\n\t\t\t)).toSQL();\n\n\t\texpect(query.sql).to.include('USE INDEX (posts_user_id_index)');\n\t});\n\n\ttest('MySqlTable :: select with cross join `use index` hint', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t});\n\n\t\tconst posts = mysqlTable('posts', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\ttext: varchar('text', { length: 100 }).notNull(),\n\t\t\tuserId: int('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),\n\t\t}, () => [postsTableUserIdIndex]);\n\t\tconst postsTableUserIdIndex = index('posts_user_id_index').on(posts.userId);\n\n\t\tawait db.execute(sql`drop table if exists ${posts}`);\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${posts} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`text\\` varchar(100) not null,\n\t\t\t\t\\`user_id\\` int not null references users(id) on delete cascade\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index posts_user_id_index ON posts(user_id)`);\n\n\t\tawait db.insert(users).values([\n\t\t\t{ id: 1, name: 'Alice' },\n\t\t\t{ id: 2, name: 'Bob' },\n\t\t]);\n\n\t\tawait db.insert(posts).values([\n\t\t\t{ id: 1, text: 'Alice post', userId: 1 },\n\t\t\t{ id: 2, text: 'Bob post', userId: 2 },\n\t\t]);\n\n\t\tconst result = await db.select()\n\t\t\t.from(users)\n\t\t\t.crossJoin(posts, {\n\t\t\t\tuseIndex: [postsTableUserIdIndex],\n\t\t\t})\n\t\t\t.orderBy(users.id, posts.id);\n\n\t\texpect(result).toStrictEqual([{\n\t\t\tusers: { id: 1, name: 'Alice' },\n\t\t\tposts: { id: 1, text: 'Alice post', userId: 1 },\n\t\t}, {\n\t\t\tusers: { id: 1, name: 'Alice' },\n\t\t\tposts: { id: 2, text: 'Bob post', userId: 2 },\n\t\t}, {\n\t\t\tusers: { id: 2, name: 'Bob' },\n\t\t\tposts: { id: 1, text: 'Alice post', userId: 1 },\n\t\t}, {\n\t\t\tusers: { id: 2, name: 'Bob' },\n\t\t\tposts: { id: 2, text: 'Bob post', userId: 2 },\n\t\t}]);\n\t});\n\n\ttest('MySqlTable :: select with cross join `use index` hint on 1 index', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t});\n\n\t\tconst posts = mysqlTable('posts', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\ttext: varchar('text', { length: 100 }).notNull(),\n\t\t\tuserId: int('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),\n\t\t}, () => [postsTableUserIdIndex]);\n\t\tconst postsTableUserIdIndex = index('posts_user_id_index').on(posts.userId);\n\n\t\tawait db.execute(sql`drop table if exists ${posts}`);\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${posts} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`text\\` varchar(100) not null,\n\t\t\t\t\\`user_id\\` int not null references users(id) on delete cascade\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index posts_user_id_index ON posts(user_id)`);\n\n\t\tconst query = db.select({\n\t\t\tuserId: users.id,\n\t\t\tname: users.name,\n\t\t\tpostId: posts.id,\n\t\t\ttext: posts.text,\n\t\t})\n\t\t\t.from(users)\n\t\t\t.crossJoin(posts, {\n\t\t\t\tuseIndex: postsTableUserIdIndex,\n\t\t\t})\n\t\t\t.where(and(\n\t\t\t\teq(users.name, 'David'),\n\t\t\t\teq(posts.text, 'David post'),\n\t\t\t)).toSQL();\n\n\t\texpect(query.sql).to.include('USE INDEX (posts_user_id_index)');\n\t});\n\n\ttest('MySqlTable :: select with join `use index` hint on multiple indexes', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t});\n\n\t\tconst posts = mysqlTable('posts', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\ttext: varchar('text', { length: 100 }).notNull(),\n\t\t\tuserId: int('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),\n\t\t}, () => [postsTableUserIdIndex, postsTableTextIndex]);\n\t\tconst postsTableUserIdIndex = index('posts_user_id_index').on(posts.userId);\n\t\tconst postsTableTextIndex = index('posts_text_index').on(posts.text);\n\n\t\tawait db.execute(sql`drop table if exists ${posts}`);\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${posts} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`text\\` varchar(100) not null,\n\t\t\t\t\\`user_id\\` int not null references users(id) on delete cascade\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index posts_user_id_index ON posts(user_id)`);\n\t\tawait db.execute(sql`create index posts_text_index ON posts(text)`);\n\n\t\tconst query = db.select({\n\t\t\tuserId: users.id,\n\t\t\tname: users.name,\n\t\t\tpostId: posts.id,\n\t\t\ttext: posts.text,\n\t\t})\n\t\t\t.from(users)\n\t\t\t.leftJoin(posts, eq(users.id, posts.userId), {\n\t\t\t\tuseIndex: [postsTableUserIdIndex, postsTableTextIndex],\n\t\t\t})\n\t\t\t.where(and(\n\t\t\t\teq(users.name, 'David'),\n\t\t\t\teq(posts.text, 'David post'),\n\t\t\t)).toSQL();\n\n\t\texpect(query.sql).to.include('USE INDEX (posts_user_id_index, posts_text_index)');\n\t});\n\n\ttest('MySqlTable :: select with join `use index` hint on not existed index', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t});\n\n\t\tconst posts = mysqlTable('posts', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\ttext: varchar('text', { length: 100 }).notNull(),\n\t\t\tuserId: int('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),\n\t\t}, () => [postsTableUserIdIndex]);\n\t\tconst postsTableUserIdIndex = index('posts_user_id_index').on(posts.userId);\n\n\t\tawait db.execute(sql`drop table if exists ${posts}`);\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${posts} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`text\\` varchar(100) not null,\n\t\t\t\t\\`user_id\\` int not null references users(id) on delete cascade\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index posts_user_id_index ON posts(user_id)`);\n\n\t\tawait db.insert(users).values([\n\t\t\t{ name: 'Alice' },\n\t\t\t{ name: 'Bob' },\n\t\t\t{ name: 'Charlie' },\n\t\t\t{ name: 'David' },\n\t\t\t{ name: 'Eve' },\n\t\t]);\n\n\t\tawait db.insert(posts).values([\n\t\t\t{ text: 'Alice post', userId: 1 },\n\t\t\t{ text: 'Bob post', userId: 2 },\n\t\t\t{ text: 'Charlie post', userId: 3 },\n\t\t\t{ text: 'David post', userId: 4 },\n\t\t\t{ text: 'Eve post', userId: 5 },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\treturn await db.select({\n\t\t\t\tuserId: users.id,\n\t\t\t\tname: users.name,\n\t\t\t\tpostId: posts.id,\n\t\t\t\ttext: posts.text,\n\t\t\t})\n\t\t\t\t.from(users)\n\t\t\t\t.leftJoin(posts, eq(users.id, posts.userId), {\n\t\t\t\t\tuseIndex: ['some_other_index'],\n\t\t\t\t})\n\t\t\t\t.where(and(\n\t\t\t\t\teq(users.name, 'David'),\n\t\t\t\t\teq(posts.text, 'David post'),\n\t\t\t\t));\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('MySqlTable :: select with join `use index` + `force index` incompatible hints', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t});\n\n\t\tconst posts = mysqlTable('posts', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\ttext: varchar('text', { length: 100 }).notNull(),\n\t\t\tuserId: int('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),\n\t\t}, () => [postsTableUserIdIndex, postsTableTextIndex]);\n\t\tconst postsTableUserIdIndex = index('posts_user_id_index').on(posts.userId);\n\t\tconst postsTableTextIndex = index('posts_text_index').on(posts.text);\n\n\t\tawait db.execute(sql`drop table if exists ${posts}`);\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${posts} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`text\\` varchar(100) not null,\n\t\t\t\t\\`user_id\\` int not null references users(id) on delete cascade\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index posts_user_id_index ON posts(user_id)`);\n\t\tawait db.execute(sql`create index posts_text_index ON posts(text)`);\n\n\t\tawait db.insert(users).values([\n\t\t\t{ name: 'Alice' },\n\t\t\t{ name: 'Bob' },\n\t\t\t{ name: 'Charlie' },\n\t\t\t{ name: 'David' },\n\t\t\t{ name: 'Eve' },\n\t\t]);\n\n\t\tawait db.insert(posts).values([\n\t\t\t{ text: 'Alice post', userId: 1 },\n\t\t\t{ text: 'Bob post', userId: 2 },\n\t\t\t{ text: 'Charlie post', userId: 3 },\n\t\t\t{ text: 'David post', userId: 4 },\n\t\t\t{ text: 'Eve post', userId: 5 },\n\t\t]);\n\n\t\tawait expect((async () => {\n\t\t\treturn await db.select({\n\t\t\t\tuserId: users.id,\n\t\t\t\tname: users.name,\n\t\t\t\tpostId: posts.id,\n\t\t\t\ttext: posts.text,\n\t\t\t})\n\t\t\t\t.from(users)\n\t\t\t\t.leftJoin(posts, eq(users.id, posts.userId), {\n\t\t\t\t\tuseIndex: [postsTableUserIdIndex],\n\t\t\t\t\tforceIndex: [postsTableTextIndex],\n\t\t\t\t})\n\t\t\t\t.where(and(\n\t\t\t\t\teq(users.name, 'David'),\n\t\t\t\t\teq(posts.text, 'David post'),\n\t\t\t\t));\n\t\t})()).rejects.toThrowError();\n\t});\n\n\ttest('MySqlTable :: select with Subquery join `use index`', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t});\n\n\t\tconst posts = mysqlTable('posts', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\ttext: varchar('text', { length: 100 }).notNull(),\n\t\t\tuserId: int('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),\n\t\t}, () => [postsTableUserIdIndex]);\n\t\tconst postsTableUserIdIndex = index('posts_user_id_index').on(posts.userId);\n\n\t\tawait db.execute(sql`drop table if exists ${posts}`);\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${posts} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`text\\` varchar(100) not null,\n\t\t\t\t\\`user_id\\` int not null references users(id) on delete cascade\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index posts_user_id_index ON posts(user_id)`);\n\n\t\tawait db.insert(users).values([\n\t\t\t{ name: 'Alice' },\n\t\t\t{ name: 'Bob' },\n\t\t\t{ name: 'Charlie' },\n\t\t\t{ name: 'David' },\n\t\t\t{ name: 'Eve' },\n\t\t]);\n\n\t\tawait db.insert(posts).values([\n\t\t\t{ text: 'Alice post', userId: 1 },\n\t\t\t{ text: 'Bob post', userId: 2 },\n\t\t\t{ text: 'Charlie post', userId: 3 },\n\t\t\t{ text: 'David post', userId: 4 },\n\t\t\t{ text: 'Eve post', userId: 5 },\n\t\t]);\n\n\t\tconst sq = db.select().from(posts, { useIndex: [postsTableUserIdIndex] }).where(eq(posts.userId, 1)).as('sq');\n\n\t\tconst result = await db.select({\n\t\t\tuserId: users.id,\n\t\t\tname: users.name,\n\t\t\tpostId: sq.id,\n\t\t\ttext: sq.text,\n\t\t})\n\t\t\t.from(users)\n\t\t\t.leftJoin(sq, eq(users.id, sq.userId))\n\t\t\t.where(eq(users.name, 'Alice'));\n\n\t\texpect(result).toHaveLength(1);\n\t\texpect(result).toEqual([{ userId: 1, name: 'Alice', postId: 1, text: 'Alice post' }]);\n\t});\n\n\ttest('MySqlTable :: select with Subquery join with `use index` in join', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t});\n\n\t\tconst posts = mysqlTable('posts', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\ttext: varchar('text', { length: 100 }).notNull(),\n\t\t\tuserId: int('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),\n\t\t}, () => [postsTableUserIdIndex]);\n\t\tconst postsTableUserIdIndex = index('posts_user_id_index').on(posts.userId);\n\n\t\tawait db.execute(sql`drop table if exists ${posts}`);\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${posts} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`text\\` varchar(100) not null,\n\t\t\t\t\\`user_id\\` int not null references users(id) on delete cascade\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index posts_user_id_index ON posts(user_id)`);\n\n\t\tconst sq = db.select().from(posts).where(eq(posts.userId, 1)).as('sq');\n\n\t\tconst query = db.select({\n\t\t\tuserId: users.id,\n\t\t\tname: users.name,\n\t\t\tpostId: sq.id,\n\t\t\ttext: sq.text,\n\t\t})\n\t\t\t.from(users)\n\t\t\t// @ts-expect-error\n\t\t\t.leftJoin(sq, eq(users.id, sq.userId, { useIndex: [postsTableUserIdIndex] }))\n\t\t\t.where(eq(users.name, 'Alice'))\n\t\t\t.toSQL();\n\n\t\texpect(query.sql).not.include('USE INDEX');\n\t});\n\n\ttest('View :: select with `use index` hint', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t}, () => [usersTableNameIndex]);\n\n\t\tconst usersTableNameIndex = index('users_name_index').on(users.name);\n\n\t\tconst usersView = mysqlView('users_view').as((qb) => qb.select().from(users));\n\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index users_name_index ON users(name)`);\n\t\tawait db.execute(sql`create view ${usersView} as select * from ${users}`);\n\n\t\t// @ts-expect-error\n\t\tconst query = db.select().from(usersView, {\n\t\t\tuseIndex: [usersTableNameIndex],\n\t\t}).toSQL();\n\n\t\texpect(query.sql).not.include('USE INDEX');\n\n\t\tawait db.execute(sql`drop view ${usersView}`);\n\t});\n\n\ttest('Subquery :: select with `use index` hint', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: varchar('name', { length: 100 }).notNull(),\n\t\t}, () => [usersTableNameIndex]);\n\t\tconst usersTableNameIndex = index('users_name_index').on(users.name);\n\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`\n\t\t\tcreate table ${users} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` varchar(100) not null\n\t\t\t)\n\t\t`);\n\t\tawait db.execute(sql`create index users_name_index ON users(name)`);\n\n\t\tconst sq = db.select().from(users).as('sq');\n\n\t\t// @ts-expect-error\n\t\tconst query = db.select().from(sq, {\n\t\t\tuseIndex: [usersTableNameIndex],\n\t\t}).toSQL();\n\n\t\texpect(query.sql).not.include('USE INDEX');\n\t});\n\n\ttest('sql operator as cte', async (ctx) => {\n\t\tconst { db } = ctx.mysql;\n\n\t\tconst users = mysqlTable('users', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\tawait db.execute(sql`create table ${users} (id serial not null primary key, name text not null)`);\n\t\tawait db.insert(users).values([\n\t\t\t{ name: 'John' },\n\t\t\t{ name: 'Jane' },\n\t\t]);\n\n\t\tconst sq1 = db.$with('sq', {\n\t\t\tuserId: users.id,\n\t\t\tdata: {\n\t\t\t\tname: users.name,\n\t\t\t},\n\t\t}).as(sql`select * from ${users} where ${users.name} = 'John'`);\n\t\tconst result1 = await db.with(sq1).select().from(sq1);\n\n\t\tconst sq2 = db.$with('sq', {\n\t\t\tuserId: users.id,\n\t\t\tdata: {\n\t\t\t\tname: users.name,\n\t\t\t},\n\t\t}).as(() => sql`select * from ${users} where ${users.name} = 'Jane'`);\n\t\tconst result2 = await db.with(sq2).select().from(sq1);\n\n\t\texpect(result1).toEqual([{ userId: 1, data: { name: 'John' } }]);\n\t\texpect(result2).toEqual([{ userId: 2, data: { name: 'Jane' } }]);\n\t});\n}\n"
  },
  {
    "path": "integration-tests/tests/mysql/mysql-custom.test.ts",
    "content": "import retry from 'async-retry';\nimport type Docker from 'dockerode';\nimport { asc, eq, Name, sql } from 'drizzle-orm';\nimport {\n\talias,\n\tbinary,\n\tcustomType,\n\tdate,\n\tdatetime,\n\tmysqlEnum,\n\tmysqlTable,\n\tmysqlTableCreator,\n\tserial,\n\ttext,\n\ttime,\n\tvarchar,\n\tyear,\n} from 'drizzle-orm/mysql-core';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport { migrate } from 'drizzle-orm/mysql2/migrator';\nimport * as mysql from 'mysql2/promise';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { toLocalDate } from '~/utils';\nimport { createDockerDB } from './mysql-common';\n\nconst ENABLE_LOGGING = false;\n\nlet db: MySql2Database;\nlet client: mysql.Connection;\nlet container: Docker.Container | undefined;\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['MYSQL_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['MYSQL_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr, container: contrainerObj } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t\tcontainer = contrainerObj;\n\t}\n\tclient = await retry(async () => {\n\t\tclient = await mysql.createConnection(connectionString);\n\t\tawait client.connect();\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.end();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n\tawait container?.stop().catch(console.error);\n});\n\nbeforeEach((ctx) => {\n\tctx.mysql = {\n\t\tdb,\n\t};\n});\n\nconst customSerial = customType<{ data: number; notNull: true; default: true }>({\n\tdataType() {\n\t\treturn 'serial';\n\t},\n});\n\nconst customText = customType<{ data: string }>({\n\tdataType() {\n\t\treturn 'text';\n\t},\n});\n\nconst customBoolean = customType<{ data: boolean }>({\n\tdataType() {\n\t\treturn 'boolean';\n\t},\n\tfromDriver(value) {\n\t\tif (typeof value === 'boolean') {\n\t\t\treturn value;\n\t\t}\n\t\treturn value === 1;\n\t},\n});\n\nconst customJson = <TData>(name: string) =>\n\tcustomType<{ data: TData; driverData: string }>({\n\t\tdataType() {\n\t\t\treturn 'json';\n\t\t},\n\t\ttoDriver(value: TData): string {\n\t\t\treturn JSON.stringify(value);\n\t\t},\n\t})(name);\n\nconst customTimestamp = customType<\n\t{ data: Date; driverData: string; config: { fsp: number } }\n>({\n\tdataType(config) {\n\t\tconst precision = config?.fsp === undefined ? '' : ` (${config.fsp})`;\n\t\treturn `timestamp${precision}`;\n\t},\n\tfromDriver(value: string): Date {\n\t\treturn new Date(value);\n\t},\n});\n\nconst customBinary = customType<{ data: string; driverData: Buffer; config: { length: number } }>({\n\tdataType(config) {\n\t\treturn config?.length === undefined\n\t\t\t? `binary`\n\t\t\t: `binary(${config.length})`;\n\t},\n\n\ttoDriver(value) {\n\t\treturn sql`UNHEX(${value})`;\n\t},\n\n\tfromDriver(value) {\n\t\treturn value.toString('hex');\n\t},\n});\n\nconst usersTable = mysqlTable('userstest', {\n\tid: customSerial('id').primaryKey(),\n\tname: customText('name').notNull(),\n\tverified: customBoolean('verified').notNull().default(false),\n\tjsonb: customJson<string[]>('jsonb'),\n\tcreatedAt: customTimestamp('created_at', { fsp: 2 }).notNull().default(sql`now()`),\n});\n\nconst datesTable = mysqlTable('datestable', {\n\tdate: date('date'),\n\tdateAsString: date('date_as_string', { mode: 'string' }),\n\ttime: time('time', { fsp: 1 }),\n\tdatetime: datetime('datetime', { fsp: 2 }),\n\tdatetimeAsString: datetime('datetime_as_string', { fsp: 2, mode: 'string' }),\n\tyear: year('year'),\n});\n\nexport const testTable = mysqlTable('test_table', {\n\tid: customBinary('id', { length: 16 }).primaryKey(),\n\tsqlId: binary('sql_id', { length: 16 }),\n\trawId: varchar('raw_id', { length: 64 }),\n});\n\nconst usersMigratorTable = mysqlTable('users12', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n});\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop table if exists \\`userstest\\``);\n\tawait db.execute(sql`drop table if exists \\`datestable\\``);\n\tawait db.execute(sql`drop table if exists \\`test_table\\``);\n\t// await ctx.db.execute(sql`create schema public`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table \\`userstest\\` (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`verified\\` boolean not null default false,\n\t\t\t\t\\`jsonb\\` json,\n\t\t\t\t\\`created_at\\` timestamp not null default now()\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table \\`datestable\\` (\n\t\t\t\t\\`date\\` date,\n\t\t\t\t\\`date_as_string\\` date,\n\t\t\t\t\\`time\\` time,\n\t\t\t\t\\`datetime\\` datetime,\n\t\t\t\t\\`datetime_as_string\\` datetime,\n\t\t\t\t\\`year\\` year\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table \\`test_table\\` (\n\t\t\t\t\\`id\\` binary(16) primary key,\n\t\t\t\t\\`sql_id\\` binary(16),\n\t\t\t\t\\`raw_id\\` varchar(64)\n\t\t\t)\n\t\t`,\n\t);\n});\n\ntest('select all fields', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t// not timezone based timestamp, thats why it should not work here\n\t// t.assert(Math.abs(result[0]!.createdAt.getTime() - now) < 2000);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('select sql', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql`upper(${usersTable.name})`,\n\t}).from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('select typed sql', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql<string>`upper(${usersTable.name})`,\n\t}).from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('insert returning sql', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tconst [result, _] = await db.insert(usersTable).values({ name: 'John' });\n\n\texpect(result.insertId).toBe(1);\n});\n\ntest('delete returning sql', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\texpect(users[0].affectedRows).toBe(1);\n});\n\ntest('update returning sql', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\texpect(users[0].changedRows).toBe(1);\n});\n\ntest('update with returning all fields', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst updatedUsers = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\tconst users = await db.select().from(usersTable).where(eq(usersTable.id, 1));\n\n\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t// not timezone based timestamp, thats why it should not work here\n\t// t.assert(Math.abs(users[0]!.createdAt.getTime() - now) < 2000);\n\texpect(users).toEqual([{ id: 1, name: 'Jane', verified: false, jsonb: null, createdAt: users[0]!.createdAt }]);\n});\n\ntest('update with returning partial', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst updatedUsers = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\tconst users = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n});\n\ntest('delete with returning all fields', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst deletedUser = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\texpect(deletedUser[0].affectedRows).toBe(1);\n});\n\ntest('delete with returning partial', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst deletedUser = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\texpect(deletedUser[0].affectedRows).toBe(1);\n});\n\ntest('insert + select', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\n\tawait db.insert(usersTable).values({ name: 'Jane' });\n\tconst result2 = await db.select().from(usersTable);\n\texpect(result2).toEqual([\n\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result2[0]!.createdAt },\n\t\t{ id: 2, name: 'Jane', verified: false, jsonb: null, createdAt: result2[1]!.createdAt },\n\t]);\n});\n\ntest('json insert', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John', jsonb: ['foo', 'bar'] });\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tjsonb: usersTable.jsonb,\n\t}).from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', jsonb: ['foo', 'bar'] }]);\n});\n\ntest('insert with overridden default values', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John', verified: true });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: true, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('insert many', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Austin', verified: true },\n\t]);\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tjsonb: usersTable.jsonb,\n\t\tverified: usersTable.verified,\n\t}).from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t]);\n});\n\ntest('insert many with returning', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tconst result = await db.insert(usersTable).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Austin', verified: true },\n\t]);\n\n\texpect(result[0].affectedRows).toBe(4);\n});\n\ntest('select with group by as field', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.name);\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n});\n\ntest('select with group by as sql', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`);\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n});\n\ntest('select with group by as sql + column', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`, usersTable.id);\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n});\n\ntest('select with group by as column + sql', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`);\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n});\n\ntest('select with group by complex query', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t.orderBy(asc(usersTable.name))\n\t\t.limit(1);\n\n\texpect(result).toEqual([{ name: 'Jane' }]);\n});\n\ntest('build query', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tconst query = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, usersTable.name)\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql: `select \\`id\\`, \\`name\\` from \\`userstest\\` group by \\`userstest\\`.\\`id\\`, \\`userstest\\`.\\`name\\``,\n\t\tparams: [],\n\t});\n});\n\ntest('build query insert with onDuplicate', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tconst query = db.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onDuplicateKeyUpdate({ set: { name: 'John1' } })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into `userstest` (`id`, `name`, `verified`, `jsonb`, `created_at`) values (default, ?, default, ?, default) on duplicate key update `name` = ?',\n\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t});\n});\n\ntest('insert with onDuplicate', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable)\n\t\t.values({ name: 'John' });\n\n\tawait db.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' })\n\t\t.onDuplicateKeyUpdate({ set: { name: 'John1' } });\n\n\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(res).toEqual([{ id: 1, name: 'John1' }]);\n});\n\ntest('insert conflict', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable)\n\t\t.values({ name: 'John' });\n\n\tawait expect((async () => {\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John1' });\n\t})()).resolves.not.toThrowError();\n});\n\ntest('insert conflict with ignore', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable)\n\t\t.values({ name: 'John' });\n\n\tawait db.insert(usersTable)\n\t\t.ignore()\n\t\t.values({ id: 1, name: 'John1' });\n\n\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert sql', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: sql`${'John'}` });\n\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('partial join with alias', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\tconst customerAlias = alias(usersTable, 'customer');\n\n\tawait db.insert(usersTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select({\n\t\t\tuser: {\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t},\n\t\t\tcustomer: {\n\t\t\t\tid: customerAlias.id,\n\t\t\t\tname: customerAlias.name,\n\t\t\t},\n\t\t}).from(usersTable)\n\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t.where(eq(usersTable.id, 10));\n\n\texpect(result).toEqual([{\n\t\tuser: { id: 10, name: 'Ivan' },\n\t\tcustomer: { id: 11, name: 'Hans' },\n\t}]);\n});\n\ntest('full join with alias', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tconst mysqlTable = mysqlTableCreator((name) => `prefixed_${name}`);\n\n\tconst users = mysqlTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\tconst customers = alias(users, 'customer');\n\n\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select().from(users)\n\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t.where(eq(users.id, 10));\n\n\texpect(result).toEqual([{\n\t\tusers: {\n\t\t\tid: 10,\n\t\t\tname: 'Ivan',\n\t\t},\n\t\tcustomer: {\n\t\t\tid: 11,\n\t\t\tname: 'Hans',\n\t\t},\n\t}]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('select from alias', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tconst mysqlTable = mysqlTableCreator((name) => `prefixed_${name}`);\n\n\tconst users = mysqlTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\tconst user = alias(users, 'user');\n\tconst customers = alias(users, 'customer');\n\n\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select()\n\t\t.from(user)\n\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t.where(eq(user.id, 10));\n\n\texpect(result).toEqual([{\n\t\tuser: {\n\t\t\tid: 10,\n\t\t\tname: 'Ivan',\n\t\t},\n\t\tcustomer: {\n\t\t\tid: 11,\n\t\t\tname: 'Hans',\n\t\t},\n\t}]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('insert with spaces', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: sql`'Jo   h     n'` });\n\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n});\n\ntest('prepared statement', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst statement = db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t}).from(usersTable)\n\t\t.prepare();\n\tconst result = await statement.execute();\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('prepared statement reuse', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tconst stmt = db.insert(usersTable).values({\n\t\tverified: true,\n\t\tname: sql.placeholder('name'),\n\t}).prepare();\n\n\tfor (let i = 0; i < 10; i++) {\n\t\tawait stmt.execute({ name: `John ${i}` });\n\t}\n\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tverified: usersTable.verified,\n\t}).from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John 0', verified: true },\n\t\t{ id: 2, name: 'John 1', verified: true },\n\t\t{ id: 3, name: 'John 2', verified: true },\n\t\t{ id: 4, name: 'John 3', verified: true },\n\t\t{ id: 5, name: 'John 4', verified: true },\n\t\t{ id: 6, name: 'John 5', verified: true },\n\t\t{ id: 7, name: 'John 6', verified: true },\n\t\t{ id: 8, name: 'John 7', verified: true },\n\t\t{ id: 9, name: 'John 8', verified: true },\n\t\t{ id: 10, name: 'John 9', verified: true },\n\t]);\n});\n\ntest('prepared statement with placeholder in .where', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst stmt = db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t}).from(usersTable)\n\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t.prepare();\n\tconst result = await stmt.execute({ id: 1 });\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('migrator', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.execute(sql`drop table if exists cities_migration`);\n\tawait db.execute(sql`drop table if exists users_migration`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists __drizzle_migrations`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/mysql' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table cities_migration`);\n\tawait db.execute(sql`drop table users_migration`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table __drizzle_migrations`);\n});\n\ntest('insert via db.execute + select via db.execute', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.execute(sql`insert into ${usersTable} (${new Name(usersTable.name.name)}) values (${'John'})`);\n\n\tconst result = await db.execute<{ id: number; name: string }>(sql`select id, name from ${usersTable}`);\n\texpect(result[0]).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tconst inserted = await db.execute(\n\t\tdb.insert(usersTable).values({ name: 'John' }),\n\t);\n\texpect(inserted[0].affectedRows).toBe(1);\n});\n\ntest('insert + select all possible dates', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tconst date = new Date('2022-11-11');\n\n\tawait db.insert(datesTable).values({\n\t\tdate: date,\n\t\tdateAsString: '2022-11-11',\n\t\ttime: '12:12:12',\n\t\tdatetime: date,\n\t\tyear: 22,\n\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t});\n\n\tconst res = await db.select().from(datesTable);\n\n\texpect(res[0]?.date).toBeInstanceOf(Date);\n\texpect(res[0]?.datetime).toBeInstanceOf(Date);\n\texpect(res[0]?.dateAsString).toBeTypeOf('string');\n\texpect(res[0]?.datetimeAsString).toBeTypeOf('string');\n\n\texpect(res).toEqual([{\n\t\tdate: toLocalDate(new Date('2022-11-11')),\n\t\tdateAsString: '2022-11-11',\n\t\ttime: '12:12:12',\n\t\tdatetime: new Date('2022-11-11'),\n\t\tyear: 2022,\n\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t}]);\n});\n\nconst tableWithEnums = mysqlTable('enums_test_case', {\n\tid: serial('id').primaryKey(),\n\tenum1: mysqlEnum('enum1', ['a', 'b', 'c']).notNull(),\n\tenum2: mysqlEnum('enum2', ['a', 'b', 'c']).default('a'),\n\tenum3: mysqlEnum('enum3', ['a', 'b', 'c']).notNull().default('b'),\n});\n\ntest('Mysql enum test case #1', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tawait db.execute(sql`drop table if exists \\`enums_test_case\\``);\n\n\tawait db.execute(sql`\n\t\tcreate table \\`enums_test_case\\` (\n\t\t\t\\`id\\` serial primary key,\n\t\t\t\\`enum1\\` ENUM('a', 'b', 'c') not null,\n\t\t\t\\`enum2\\` ENUM('a', 'b', 'c') default 'a',\n\t\t\t\\`enum3\\` ENUM('a', 'b', 'c') not null default 'b'\n\t\t)\n\t`);\n\n\tawait db.insert(tableWithEnums).values([\n\t\t{ id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n\t\t{ id: 2, enum1: 'a', enum3: 'c' },\n\t\t{ id: 3, enum1: 'a' },\n\t]);\n\n\tconst res = await db.select().from(tableWithEnums);\n\n\tawait db.execute(sql`drop table \\`enums_test_case\\``);\n\n\texpect(res).toEqual([\n\t\t{ id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n\t\t{ id: 2, enum1: 'a', enum2: 'a', enum3: 'c' },\n\t\t{ id: 3, enum1: 'a', enum2: 'a', enum3: 'b' },\n\t]);\n});\n\ntest('custom binary', async (ctx) => {\n\tconst { db } = ctx.mysql;\n\n\tconst id = uuid().replace(/-/g, '');\n\tawait db.insert(testTable).values({\n\t\tid,\n\t\tsqlId: sql`UNHEX(${id})`,\n\t\trawId: id,\n\t});\n\n\tconst res = await db.select().from(testTable);\n\n\texpect(res).toEqual([{\n\t\tid,\n\t\tsqlId: Buffer.from(id, 'hex').toString(),\n\t\trawId: id,\n\t}]);\n});\n"
  },
  {
    "path": "integration-tests/tests/mysql/mysql-planetscale.test.ts",
    "content": "import { Client } from '@planetscale/database';\nimport type { PlanetScaleDatabase } from 'drizzle-orm/planetscale-serverless';\nimport { drizzle } from 'drizzle-orm/planetscale-serverless';\nimport { beforeAll, beforeEach } from 'vitest';\nimport { skipTests } from '~/common';\nimport { tests } from './mysql-common';\nimport { TestCache, TestGlobalCache, tests as cacheTests } from './mysql-common-cache';\n\nconst ENABLE_LOGGING = false;\n\nlet db: PlanetScaleDatabase;\nlet dbGlobalCached: PlanetScaleDatabase;\nlet cachedDb: PlanetScaleDatabase;\n\nbeforeAll(async () => {\n\tconst client = new Client({ url: process.env['PLANETSCALE_CONNECTION_STRING']! });\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestCache() });\n\tdbGlobalCached = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestGlobalCache() });\n});\n\nbeforeEach((ctx) => {\n\tctx.mysql = {\n\t\tdb,\n\t};\n\tctx.cachedMySQL = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\nskipTests([\n\t'mySchema :: view',\n\t'mySchema :: select from tables with same name from different schema using alias',\n\t'mySchema :: prepared statement with placeholder in .where',\n\t'mySchema :: insert with spaces',\n\t'mySchema :: select with group by as column + sql',\n\t'mySchema :: select with group by as field',\n\t'mySchema :: insert many',\n\t'mySchema :: insert with overridden default values',\n\t'mySchema :: insert + select',\n\t'mySchema :: delete with returning all fields',\n\t'mySchema :: update with returning partial',\n\t'mySchema :: delete returning sql',\n\t'mySchema :: insert returning sql',\n\t'mySchema :: select typed sql',\n\t'mySchema :: select sql',\n\t'mySchema :: select all fields',\n\t'test $onUpdateFn and $onUpdate works updating',\n\t'test $onUpdateFn and $onUpdate works as $default',\n\t'set operations (mixed all) as function with subquery',\n\t'set operations (mixed) from query builder',\n\t'set operations (except all) as function',\n\t'set operations (except all) from query builder',\n\t'set operations (except) as function',\n\t'set operations (except) from query builder',\n\t'set operations (intersect all) as function',\n\t'set operations (intersect all) from query builder',\n\t'set operations (intersect) as function',\n\t'set operations (intersect) from query builder',\n\t'select iterator w/ prepared statement',\n\t'select iterator',\n\t'subquery with view',\n\t'join on aliased sql from with clause',\n\t'with ... delete',\n\t'with ... update',\n\t'with ... select',\n\n\t// to redefine in this file\n\t'utc config for datetime',\n\t'transaction',\n\t'transaction with options (set isolationLevel)',\n\t'having',\n\t'select count()',\n\t'insert via db.execute w/ query builder',\n\t'insert via db.execute + select via db.execute',\n\t'insert many with returning',\n\t'delete with returning partial',\n\t'delete with returning all fields',\n\t'update with returning partial',\n\t'update with returning all fields',\n\t'update returning sql',\n\t'delete returning sql',\n\t'insert returning sql',\n]);\n\ntests('planetscale');\ncacheTests();\n"
  },
  {
    "path": "integration-tests/tests/mysql/mysql-prefixed.test.ts",
    "content": "import retry from 'async-retry';\nimport type Docker from 'dockerode';\nimport type { Equal } from 'drizzle-orm';\nimport { asc, eq, getTableName, gt, inArray, Name, sql, TransactionRollbackError } from 'drizzle-orm';\nimport {\n\talias,\n\tboolean,\n\tdate,\n\tdatetime,\n\tgetViewConfig,\n\tint,\n\tjson,\n\tmysqlEnum,\n\tmysqlTable as mysqlTableRaw,\n\tmysqlTableCreator,\n\tmysqlView,\n\tserial,\n\ttext,\n\ttime,\n\ttimestamp,\n\tuniqueIndex,\n\tyear,\n} from 'drizzle-orm/mysql-core';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport { migrate } from 'drizzle-orm/mysql2/migrator';\nimport * as mysql from 'mysql2/promise';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { Expect, toLocalDate } from '~/utils';\nimport { createDockerDB } from './mysql-common';\n\nconst ENABLE_LOGGING = false;\n\nlet db: MySql2Database;\nlet client: mysql.Connection;\nlet container: Docker.Container | undefined;\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['MYSQL_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['MYSQL_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr, container: contrainerObj } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t\tcontainer = contrainerObj;\n\t}\n\tclient = await retry(async () => {\n\t\tclient = await mysql.createConnection(connectionString);\n\t\tawait client.connect();\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.end();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n\tawait container?.stop().catch(console.error);\n});\n\nconst tablePrefix = 'drizzle_tests_';\n\nconst mysqlTable = mysqlTableCreator((name) => `${tablePrefix}${name}`);\nconst usersTable = mysqlTable('userstest', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\nconst users2Table = mysqlTable('users2', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: int('city_id').references(() => citiesTable.id),\n});\n\nconst citiesTable = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop table if exists ${usersTable}`);\n\tawait db.execute(sql`drop table if exists ${users2Table}`);\n\tawait db.execute(sql`drop table if exists ${citiesTable}`);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${usersTable} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`verified\\` boolean not null default false,\n\t\t\t\t\\`jsonb\\` json,\n\t\t\t\t\\`created_at\\` timestamp not null default now()\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${users2Table} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`city_id\\` int references ${citiesTable}(\\`id\\`)\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${citiesTable} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null\n\t\t\t)\n\t\t`,\n\t);\n});\n\ntest('select all fields', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t// not timezone based timestamp, thats why it should not work here\n\t// t.assert(Math.abs(result[0]!.createdAt.getTime() - now) < 2000);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('select sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql`upper(${usersTable.name})`,\n\t}).from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('select typed sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql<string>`upper(${usersTable.name})`,\n\t}).from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('select distinct', async () => {\n\tconst usersDistinctTable = mysqlTable('users_distinct', {\n\t\tid: int('id').notNull(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${usersDistinctTable}`);\n\tawait db.execute(sql`create table ${usersDistinctTable} (id int, name text)`);\n\n\tawait db.insert(usersDistinctTable).values([\n\t\t{ id: 1, name: 'John' },\n\t\t{ id: 1, name: 'John' },\n\t\t{ id: 2, name: 'John' },\n\t\t{ id: 1, name: 'Jane' },\n\t]);\n\tconst users = await db.selectDistinct().from(usersDistinctTable).orderBy(\n\t\tusersDistinctTable.id,\n\t\tusersDistinctTable.name,\n\t);\n\n\tawait db.execute(sql`drop table ${usersDistinctTable}`);\n\n\texpect(users).toEqual([{ id: 1, name: 'Jane' }, { id: 1, name: 'John' }, { id: 2, name: 'John' }]);\n});\n\ntest('insert returning sql', async () => {\n\tconst [result, _] = await db.insert(usersTable).values({ name: 'John' });\n\n\texpect(result.insertId).toBe(1);\n});\n\ntest('delete returning sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\texpect(users[0].affectedRows).toBe(1);\n});\n\ntest('update returning sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\texpect(users[0].changedRows).toBe(1);\n});\n\ntest('update with returning all fields', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst updatedUsers = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\tconst users = await db.select().from(usersTable).where(eq(usersTable.id, 1));\n\n\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t// not timezone based timestamp, thats why it should not work here\n\t// t.assert(Math.abs(users[0]!.createdAt.getTime() - now) < 2000);\n\texpect(users).toEqual([{ id: 1, name: 'Jane', verified: false, jsonb: null, createdAt: users[0]!.createdAt }]);\n});\n\ntest('update with returning partial', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst updatedUsers = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\tconst users = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n});\n\ntest('delete with returning all fields', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst deletedUser = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\texpect(deletedUser[0].affectedRows).toBe(1);\n});\n\ntest('delete with returning partial', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst deletedUser = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\texpect(deletedUser[0].affectedRows).toBe(1);\n});\n\ntest('insert + select', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\n\tawait db.insert(usersTable).values({ name: 'Jane' });\n\tconst result2 = await db.select().from(usersTable);\n\texpect(result2).toEqual([\n\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result2[0]!.createdAt },\n\t\t{ id: 2, name: 'Jane', verified: false, jsonb: null, createdAt: result2[1]!.createdAt },\n\t]);\n});\n\ntest('json insert', async () => {\n\tawait db.insert(usersTable).values({ name: 'John', jsonb: ['foo', 'bar'] });\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tjsonb: usersTable.jsonb,\n\t}).from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', jsonb: ['foo', 'bar'] }]);\n});\n\ntest('insert with overridden default values', async () => {\n\tawait db.insert(usersTable).values({ name: 'John', verified: true });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: true, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('insert many', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Austin', verified: true },\n\t]);\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tjsonb: usersTable.jsonb,\n\t\tverified: usersTable.verified,\n\t}).from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t]);\n});\n\ntest('insert many with returning', async () => {\n\tconst result = await db.insert(usersTable).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Austin', verified: true },\n\t]);\n\n\texpect(result[0].affectedRows).toBe(4);\n});\n\ntest('select with group by as field', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.name);\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n});\n\ntest('select with group by as sql', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`);\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n});\n\ntest('select with group by as sql + column', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`, usersTable.id);\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n});\n\ntest('select with group by as column + sql', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`);\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n});\n\ntest('select with group by complex query', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t.orderBy(asc(usersTable.name))\n\t\t.limit(1);\n\n\texpect(result).toEqual([{ name: 'Jane' }]);\n});\n\ntest('build query', async () => {\n\tconst query = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, usersTable.name)\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql: `select \\`id\\`, \\`name\\` from \\`${getTableName(usersTable)}\\` group by \\`${\n\t\t\tgetTableName(usersTable)\n\t\t}\\`.\\`id\\`, \\`${getTableName(usersTable)}\\`.\\`name\\``,\n\t\tparams: [],\n\t});\n});\n\ntest('build query insert with onDuplicate', async () => {\n\tconst query = db.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onDuplicateKeyUpdate({ set: { name: 'John1' } })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql: `insert into \\`${\n\t\t\tgetTableName(usersTable)\n\t\t}\\` (\\`id\\`, \\`name\\`, \\`verified\\`, \\`jsonb\\`, \\`created_at\\`) values (default, ?, default, ?, default) on duplicate key update \\`name\\` = ?`,\n\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t});\n});\n\ntest('insert with onDuplicate', async () => {\n\tawait db.insert(usersTable)\n\t\t.values({ name: 'John' });\n\n\tawait db.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' })\n\t\t.onDuplicateKeyUpdate({ set: { name: 'John1' } });\n\n\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(res).toEqual([{ id: 1, name: 'John1' }]);\n});\n\ntest('insert conflict', async () => {\n\tawait db.insert(usersTable)\n\t\t.values({ name: 'John' });\n\n\tawait expect((async () => {\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John1' });\n\t})()).resolves.not.toThrowError();\n});\n\ntest('insert conflict with ignore', async () => {\n\tawait db.insert(usersTable)\n\t\t.values({ name: 'John' });\n\n\tawait db.insert(usersTable)\n\t\t.ignore()\n\t\t.values({ id: 1, name: 'John1' });\n\n\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert sql', async () => {\n\tawait db.insert(usersTable).values({ name: sql`${'John'}` });\n\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('partial join with alias', async () => {\n\tconst customerAlias = alias(usersTable, 'customer');\n\n\tawait db.insert(usersTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select({\n\t\t\tuser: {\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t},\n\t\t\tcustomer: {\n\t\t\t\tid: customerAlias.id,\n\t\t\t\tname: customerAlias.name,\n\t\t\t},\n\t\t}).from(usersTable)\n\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t.where(eq(usersTable.id, 10));\n\n\texpect(result).toEqual([{\n\t\tuser: { id: 10, name: 'Ivan' },\n\t\tcustomer: { id: 11, name: 'Hans' },\n\t}]);\n});\n\ntest('full join with alias', async () => {\n\tconst mysqlTable = mysqlTableCreator((name) => `prefixed_${name}`);\n\n\tconst users = mysqlTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\tconst customers = alias(users, 'customer');\n\n\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select().from(users)\n\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t.where(eq(users.id, 10));\n\n\texpect(result).toEqual([{\n\t\tusers: {\n\t\t\tid: 10,\n\t\t\tname: 'Ivan',\n\t\t},\n\t\tcustomer: {\n\t\t\tid: 11,\n\t\t\tname: 'Hans',\n\t\t},\n\t}]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('select from alias', async () => {\n\tconst mysqlTable = mysqlTableCreator((name) => `prefixed_${name}`);\n\n\tconst users = mysqlTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\tconst user = alias(users, 'user');\n\tconst customers = alias(users, 'customer');\n\n\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select()\n\t\t.from(user)\n\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t.where(eq(user.id, 10));\n\n\texpect(result).toEqual([{\n\t\tuser: {\n\t\t\tid: 10,\n\t\t\tname: 'Ivan',\n\t\t},\n\t\tcustomer: {\n\t\t\tid: 11,\n\t\t\tname: 'Hans',\n\t\t},\n\t}]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('insert with spaces', async () => {\n\tawait db.insert(usersTable).values({ name: sql`'Jo   h     n'` });\n\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n});\n\ntest('prepared statement', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst statement = db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t}).from(usersTable)\n\t\t.prepare();\n\tconst result = await statement.execute();\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('prepared statement reuse', async () => {\n\tconst stmt = db.insert(usersTable).values({\n\t\tverified: true,\n\t\tname: sql.placeholder('name'),\n\t}).prepare();\n\n\tfor (let i = 0; i < 10; i++) {\n\t\tawait stmt.execute({ name: `John ${i}` });\n\t}\n\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tverified: usersTable.verified,\n\t}).from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John 0', verified: true },\n\t\t{ id: 2, name: 'John 1', verified: true },\n\t\t{ id: 3, name: 'John 2', verified: true },\n\t\t{ id: 4, name: 'John 3', verified: true },\n\t\t{ id: 5, name: 'John 4', verified: true },\n\t\t{ id: 6, name: 'John 5', verified: true },\n\t\t{ id: 7, name: 'John 6', verified: true },\n\t\t{ id: 8, name: 'John 7', verified: true },\n\t\t{ id: 9, name: 'John 8', verified: true },\n\t\t{ id: 10, name: 'John 9', verified: true },\n\t]);\n});\n\ntest('prepared statement with placeholder in .where', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst stmt = db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t}).from(usersTable)\n\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t.prepare();\n\tconst result = await stmt.execute({ id: 1 });\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('migrator', async () => {\n\tconst usersMigratorTable = mysqlTableRaw('users12', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\temail: text('email').notNull(),\n\t}, (table) => {\n\t\treturn {\n\t\t\tname: uniqueIndex('').on(table.name).using('btree'),\n\t\t};\n\t});\n\n\tawait db.execute(sql.raw(`drop table if exists cities_migration`));\n\tawait db.execute(sql.raw(`drop table if exists users_migration`));\n\tawait db.execute(sql.raw(`drop table if exists users12`));\n\tawait db.execute(sql.raw(`drop table if exists __drizzle_migrations`));\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/mysql' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql.raw(`drop table cities_migration`));\n\tawait db.execute(sql.raw(`drop table users_migration`));\n\tawait db.execute(sql.raw(`drop table users12`));\n\tawait db.execute(sql.raw(`drop table __drizzle_migrations`));\n});\n\ntest('insert via db.execute + select via db.execute', async () => {\n\tawait db.execute(sql`insert into ${usersTable} (${new Name(usersTable.name.name)}) values (${'John'})`);\n\n\tconst result = await db.execute<{ id: number; name: string }>(sql`select id, name from ${usersTable}`);\n\texpect(result[0]).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async () => {\n\tconst inserted = await db.execute(\n\t\tdb.insert(usersTable).values({ name: 'John' }),\n\t);\n\texpect(inserted[0].affectedRows).toBe(1);\n});\n\ntest('insert + select all possible dates', async () => {\n\tconst datesTable = mysqlTable('datestable', {\n\t\tdate: date('date'),\n\t\tdateAsString: date('date_as_string', { mode: 'string' }),\n\t\ttime: time('time', { fsp: 1 }),\n\t\tdatetime: datetime('datetime', { fsp: 2 }),\n\t\tdatetimeAsString: datetime('datetime_as_string', { fsp: 2, mode: 'string' }),\n\t\tyear: year('year'),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${datesTable}`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${datesTable} (\n\t\t\t\t\\`date\\` date,\n\t\t\t\t\\`date_as_string\\` date,\n\t\t\t\t\\`time\\` time,\n\t\t\t\t\\`datetime\\` datetime,\n\t\t\t\t\\`datetime_as_string\\` datetime,\n\t\t\t\t\\`year\\` year\n\t\t\t)\n\t\t`,\n\t);\n\n\tconst d = new Date('2022-11-11');\n\n\tawait db.insert(datesTable).values({\n\t\tdate: d,\n\t\tdateAsString: '2022-11-11',\n\t\ttime: '12:12:12',\n\t\tdatetime: d,\n\t\tyear: 22,\n\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t});\n\n\tconst res = await db.select().from(datesTable);\n\n\texpect(res[0]?.date).toBeInstanceOf(Date);\n\texpect(res[0]?.datetime).toBeInstanceOf(Date);\n\texpect(typeof res[0]?.dateAsString).toBe('string');\n\texpect(typeof res[0]?.datetimeAsString).toBe('string');\n\n\texpect(res).toEqual([{\n\t\tdate: toLocalDate(new Date('2022-11-11')),\n\t\tdateAsString: '2022-11-11',\n\t\ttime: '12:12:12',\n\t\tdatetime: new Date('2022-11-11'),\n\t\tyear: 2022,\n\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t}]);\n\n\tawait db.execute(sql`drop table ${datesTable}`);\n});\n\ntest('Mysql enum test case #1', async () => {\n\tconst tableWithEnums = mysqlTable('enums_test_case', {\n\t\tid: serial('id').primaryKey(),\n\t\tenum1: mysqlEnum('enum1', ['a', 'b', 'c']).notNull(),\n\t\tenum2: mysqlEnum('enum2', ['a', 'b', 'c']).default('a'),\n\t\tenum3: mysqlEnum('enum3', ['a', 'b', 'c']).notNull().default('b'),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${tableWithEnums}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${tableWithEnums} (\n\t\t\t\\`id\\` serial primary key,\n\t\t\t\\`enum1\\` ENUM('a', 'b', 'c') not null,\n\t\t\t\\`enum2\\` ENUM('a', 'b', 'c') default 'a',\n\t\t\t\\`enum3\\` ENUM('a', 'b', 'c') not null default 'b'\n\t\t)\n\t`);\n\n\tawait db.insert(tableWithEnums).values([\n\t\t{ id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n\t\t{ id: 2, enum1: 'a', enum3: 'c' },\n\t\t{ id: 3, enum1: 'a' },\n\t]);\n\n\tconst res = await db.select().from(tableWithEnums);\n\n\tawait db.execute(sql`drop table ${tableWithEnums}`);\n\n\texpect(res).toEqual([\n\t\t{ id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n\t\t{ id: 2, enum1: 'a', enum2: 'a', enum3: 'c' },\n\t\t{ id: 3, enum1: 'a', enum2: 'a', enum3: 'b' },\n\t]);\n});\n\ntest('left join (flat object fields)', async () => {\n\tawait db.insert(citiesTable)\n\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }]);\n\n\tconst res = await db.select({\n\t\tuserId: users2Table.id,\n\t\tuserName: users2Table.name,\n\t\tcityId: citiesTable.id,\n\t\tcityName: citiesTable.name,\n\t}).from(users2Table)\n\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id));\n\n\texpect(res).toEqual([\n\t\t{ userId: 1, userName: 'John', cityId: 1, cityName: 'Paris' },\n\t\t{ userId: 2, userName: 'Jane', cityId: null, cityName: null },\n\t]);\n});\n\ntest('left join (grouped fields)', async () => {\n\tawait db.insert(citiesTable)\n\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }]);\n\n\tconst res = await db.select({\n\t\tid: users2Table.id,\n\t\tuser: {\n\t\t\tname: users2Table.name,\n\t\t\tnameUpper: sql<string>`upper(${users2Table.name})`,\n\t\t},\n\t\tcity: {\n\t\t\tid: citiesTable.id,\n\t\t\tname: citiesTable.name,\n\t\t\tnameUpper: sql<string>`upper(${citiesTable.name})`,\n\t\t},\n\t}).from(users2Table)\n\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id));\n\n\texpect(res).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\tuser: { name: 'John', nameUpper: 'JOHN' },\n\t\t\tcity: { id: 1, name: 'Paris', nameUpper: 'PARIS' },\n\t\t},\n\t\t{\n\t\t\tid: 2,\n\t\t\tuser: { name: 'Jane', nameUpper: 'JANE' },\n\t\t\tcity: null,\n\t\t},\n\t]);\n});\n\ntest('left join (all fields)', async () => {\n\tawait db.insert(citiesTable)\n\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }]);\n\n\tconst res = await db.select().from(users2Table)\n\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id));\n\n\texpect(res).toEqual([\n\t\t{\n\t\t\tusers2: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tcityId: 1,\n\t\t\t},\n\t\t\tcities: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Paris',\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tusers2: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Jane',\n\t\t\t\tcityId: null,\n\t\t\t},\n\t\t\tcities: null,\n\t\t},\n\t]);\n});\n\ntest('join subquery', async () => {\n\tconst coursesTable = mysqlTable('courses', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcategoryId: int('category_id').references(() => courseCategoriesTable.id),\n\t});\n\n\tconst courseCategoriesTable = mysqlTable('course_categories', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${coursesTable}`);\n\tawait db.execute(sql`drop table if exists ${courseCategoriesTable}`);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${courseCategoriesTable} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${coursesTable} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`category_id\\` int references ${courseCategoriesTable}(\\`id\\`)\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.insert(courseCategoriesTable).values([\n\t\t{ name: 'Category 1' },\n\t\t{ name: 'Category 2' },\n\t\t{ name: 'Category 3' },\n\t\t{ name: 'Category 4' },\n\t]);\n\n\tawait db.insert(coursesTable).values([\n\t\t{ name: 'Development', categoryId: 2 },\n\t\t{ name: 'IT & Software', categoryId: 3 },\n\t\t{ name: 'Marketing', categoryId: 4 },\n\t\t{ name: 'Design', categoryId: 1 },\n\t]);\n\n\tconst sq2 = db\n\t\t.select({\n\t\t\tcategoryId: courseCategoriesTable.id,\n\t\t\tcategory: courseCategoriesTable.name,\n\t\t\ttotal: sql<number>`count(${courseCategoriesTable.id})`,\n\t\t})\n\t\t.from(courseCategoriesTable)\n\t\t.groupBy(courseCategoriesTable.id, courseCategoriesTable.name)\n\t\t.as('sq2');\n\n\tconst res = await db\n\t\t.select({\n\t\t\tcourseName: coursesTable.name,\n\t\t\tcategoryId: sq2.categoryId,\n\t\t})\n\t\t.from(coursesTable)\n\t\t.leftJoin(sq2, eq(coursesTable.categoryId, sq2.categoryId))\n\t\t.orderBy(coursesTable.name);\n\n\tawait db.execute(sql`drop table ${coursesTable}`);\n\tawait db.execute(sql`drop table ${courseCategoriesTable}`);\n\n\texpect(res).toEqual([\n\t\t{ courseName: 'Design', categoryId: 1 },\n\t\t{ courseName: 'Development', categoryId: 2 },\n\t\t{ courseName: 'IT & Software', categoryId: 3 },\n\t\t{ courseName: 'Marketing', categoryId: 4 },\n\t]);\n});\n\ntest('with ... select', async () => {\n\tconst orders = mysqlTable('orders', {\n\t\tid: serial('id').primaryKey(),\n\t\tregion: text('region').notNull(),\n\t\tproduct: text('product').notNull(),\n\t\tamount: int('amount').notNull(),\n\t\tquantity: int('quantity').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${orders}`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${orders} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`region\\` text not null,\n\t\t\t\t\\`product\\` text not null,\n\t\t\t\t\\`amount\\` int not null,\n\t\t\t\t\\`quantity\\` int not null\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.insert(orders).values([\n\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t]);\n\n\tconst regionalSales = db\n\t\t.$with('regional_sales')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.groupBy(orders.region),\n\t\t);\n\n\tconst topRegions = db\n\t\t.$with('top_regions')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: regionalSales.region,\n\t\t\t\t})\n\t\t\t\t.from(regionalSales)\n\t\t\t\t.where(\n\t\t\t\t\tgt(\n\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\tdb.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t);\n\n\tconst result = await db\n\t\t.with(regionalSales, topRegions)\n\t\t.select({\n\t\t\tregion: orders.region,\n\t\t\tproduct: orders.product,\n\t\t\tproductUnits: sql<number>`cast(sum(${orders.quantity}) as unsigned)`,\n\t\t\tproductSales: sql<number>`cast(sum(${orders.amount}) as unsigned)`,\n\t\t})\n\t\t.from(orders)\n\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t.groupBy(orders.region, orders.product)\n\t\t.orderBy(orders.region, orders.product);\n\n\tawait db.execute(sql`drop table ${orders}`);\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tregion: 'Europe',\n\t\t\tproduct: 'A',\n\t\t\tproductUnits: 3,\n\t\t\tproductSales: 30,\n\t\t},\n\t\t{\n\t\t\tregion: 'Europe',\n\t\t\tproduct: 'B',\n\t\t\tproductUnits: 5,\n\t\t\tproductSales: 50,\n\t\t},\n\t\t{\n\t\t\tregion: 'US',\n\t\t\tproduct: 'A',\n\t\t\tproductUnits: 7,\n\t\t\tproductSales: 70,\n\t\t},\n\t\t{\n\t\t\tregion: 'US',\n\t\t\tproduct: 'B',\n\t\t\tproductUnits: 9,\n\t\t\tproductSales: 90,\n\t\t},\n\t]);\n});\n\ntest('select from subquery sql', async () => {\n\tawait db.insert(users2Table).values([{ name: 'John' }, { name: 'Jane' }]);\n\n\tconst sq = db\n\t\t.select({ name: sql<string>`concat(${users2Table.name}, \" modified\")`.as('name') })\n\t\t.from(users2Table)\n\t\t.as('sq');\n\n\tconst res = await db.select({ name: sq.name }).from(sq);\n\n\texpect(res).toEqual([{ name: 'John modified' }, { name: 'Jane modified' }]);\n});\n\ntest('select a field without joining its table', () => {\n\texpect(() => db.select({ name: users2Table.name }).from(usersTable).prepare()).toThrowError();\n});\n\ntest('select all fields from subquery without alias', () => {\n\tconst sq = db.$with('sq').as(db.select({ name: sql<string>`upper(${users2Table.name})` }).from(users2Table));\n\n\texpect(() => db.select().from(sq).prepare()).toThrowError();\n});\n\ntest('select count()', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }]);\n\n\tconst res = await db.select({ count: sql`count(*)` }).from(usersTable);\n\n\texpect(res).toEqual([{ count: 2 }]);\n});\n\ntest('select for ...', () => {\n\t{\n\t\tconst query = db.select().from(users2Table).for('update').toSQL();\n\t\texpect(query.sql).toMatch(/ for update$/);\n\t}\n\t{\n\t\tconst query = db.select().from(users2Table).for('share', { skipLocked: true }).toSQL();\n\t\texpect(query.sql).toMatch(/ for share skip locked$/);\n\t}\n\t{\n\t\tconst query = db.select().from(users2Table).for('update', { noWait: true }).toSQL();\n\t\texpect(query.sql).toMatch(/ for update nowait$/);\n\t}\n});\n\ntest('having', async () => {\n\tawait db.insert(citiesTable).values([{ name: 'London' }, { name: 'Paris' }, { name: 'New York' }]);\n\n\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane', cityId: 1 }, {\n\t\tname: 'Jack',\n\t\tcityId: 2,\n\t}]);\n\n\tconst result = await db\n\t\t.select({\n\t\t\tid: citiesTable.id,\n\t\t\tname: sql<string>`upper(${citiesTable.name})`.as('upper_name'),\n\t\t\tusersCount: sql<number>`count(${users2Table.id})`.as('users_count'),\n\t\t})\n\t\t.from(citiesTable)\n\t\t.leftJoin(users2Table, eq(users2Table.cityId, citiesTable.id))\n\t\t.where(({ name }) => sql`length(${name}) >= 3`)\n\t\t.groupBy(citiesTable.id)\n\t\t.having(({ usersCount }) => sql`${usersCount} > 0`)\n\t\t.orderBy(({ name }) => name);\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\tname: 'LONDON',\n\t\t\tusersCount: 2,\n\t\t},\n\t\t{\n\t\t\tid: 2,\n\t\t\tname: 'PARIS',\n\t\t\tusersCount: 1,\n\t\t},\n\t]);\n});\n\ntest('view', async () => {\n\tconst newYorkers1 = mysqlView('new_yorkers')\n\t\t.as((qb) => qb.select().from(users2Table).where(eq(users2Table.cityId, 1)));\n\n\tconst newYorkers2 = mysqlView('new_yorkers', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: int('city_id').notNull(),\n\t}).as(sql`select * from ${users2Table} where ${eq(users2Table.cityId, 1)}`);\n\n\tconst newYorkers3 = mysqlView('new_yorkers', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: int('city_id').notNull(),\n\t}).existing();\n\n\tawait db.execute(sql`create view new_yorkers as ${getViewConfig(newYorkers1).query}`);\n\n\tawait db.insert(citiesTable).values([{ name: 'New York' }, { name: 'Paris' }]);\n\n\tawait db.insert(users2Table).values([\n\t\t{ name: 'John', cityId: 1 },\n\t\t{ name: 'Jane', cityId: 1 },\n\t\t{ name: 'Jack', cityId: 2 },\n\t]);\n\n\t{\n\t\tconst result = await db.select().from(newYorkers1);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select().from(newYorkers2);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select().from(newYorkers3);\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1);\n\t\texpect(result).toEqual([\n\t\t\t{ name: 'John' },\n\t\t\t{ name: 'Jane' },\n\t\t]);\n\t}\n\n\tawait db.execute(sql`drop view ${newYorkers1}`);\n});\n\ntest('select from raw sql', async () => {\n\tconst result = await db.select({\n\t\tid: sql<number>`id`,\n\t\tname: sql<string>`name`,\n\t}).from(sql`(select 1 as id, 'John' as name) as users`);\n\n\tExpect<Equal<{ id: number; name: string }[], typeof result>>;\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John' },\n\t]);\n});\n\ntest('select from raw sql with joins', async () => {\n\tconst result = await db\n\t\t.select({\n\t\t\tid: sql<number>`users.id`,\n\t\t\tname: sql<string>`users.name`,\n\t\t\tuserCity: sql<string>`users.city`,\n\t\t\tcityName: sql<string>`cities.name`,\n\t\t})\n\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, sql`cities.id = users.id`);\n\n\tExpect<Equal<{ id: number; name: string; userCity: string; cityName: string }[], typeof result>>;\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', userCity: 'New York', cityName: 'Paris' },\n\t]);\n});\n\ntest('join on aliased sql from select', async () => {\n\tconst result = await db\n\t\t.select({\n\t\t\tuserId: sql<number>`users.id`.as('userId'),\n\t\t\tname: sql<string>`users.name`,\n\t\t\tuserCity: sql<string>`users.city`,\n\t\t\tcityId: sql<number>`cities.id`.as('cityId'),\n\t\t\tcityName: sql<string>`cities.name`,\n\t\t})\n\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, (cols) => eq(cols.cityId, cols.userId));\n\n\tExpect<Equal<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>>;\n\n\texpect(result).toEqual([\n\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t]);\n});\n\ntest('join on aliased sql from with clause', async () => {\n\tconst users = db.$with('users').as(\n\t\tdb.select({\n\t\t\tid: sql<number>`id`.as('userId'),\n\t\t\tname: sql<string>`name`.as('userName'),\n\t\t\tcity: sql<string>`city`.as('city'),\n\t\t}).from(\n\t\t\tsql`(select 1 as id, 'John' as name, 'New York' as city) as users`,\n\t\t),\n\t);\n\n\tconst cities = db.$with('cities').as(\n\t\tdb.select({\n\t\t\tid: sql<number>`id`.as('cityId'),\n\t\t\tname: sql<string>`name`.as('cityName'),\n\t\t}).from(\n\t\t\tsql`(select 1 as id, 'Paris' as name) as cities`,\n\t\t),\n\t);\n\n\tconst result = await db\n\t\t.with(users, cities)\n\t\t.select({\n\t\t\tuserId: users.id,\n\t\t\tname: users.name,\n\t\t\tuserCity: users.city,\n\t\t\tcityId: cities.id,\n\t\t\tcityName: cities.name,\n\t\t})\n\t\t.from(users)\n\t\t.leftJoin(cities, (cols) => eq(cols.cityId, cols.userId));\n\n\tExpect<Equal<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>>;\n\n\texpect(result).toEqual([\n\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t]);\n});\n\ntest('prefixed table', async () => {\n\tconst mysqlTable = mysqlTableCreator((name) => `myprefix_${name}`);\n\n\tconst users = mysqlTable('test_prefixed_table_with_unique_name', {\n\t\tid: int('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table myprefix_test_prefixed_table_with_unique_name (id int not null primary key, name text not null)`,\n\t);\n\n\tawait db.insert(users).values({ id: 1, name: 'John' });\n\n\tconst result = await db.select().from(users);\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('orderBy with aliased column', () => {\n\tconst query = db.select({\n\t\ttest: sql`something`.as('test'),\n\t}).from(users2Table).orderBy((fields) => fields.test).toSQL();\n\n\texpect(query.sql).toBe(`select something as \\`test\\` from \\`${getTableName(users2Table)}\\` order by \\`test\\``);\n});\n\ntest('timestamp timezone', async () => {\n\tconst date = new Date(Date.parse('2020-01-01T12:34:56+07:00'));\n\n\tawait db.insert(usersTable).values({ name: 'With default times' });\n\tawait db.insert(usersTable).values({\n\t\tname: 'Without default times',\n\t\tcreatedAt: date,\n\t});\n\tconst users = await db.select().from(usersTable);\n\n\t// check that the timestamps are set correctly for default times\n\texpect(Math.abs(users[0]!.createdAt.getTime() - Date.now())).toBeLessThan(2000);\n\n\t// check that the timestamps are set correctly for non default times\n\texpect(Math.abs(users[1]!.createdAt.getTime() - date.getTime())).toBeLessThan(2000);\n});\n\ntest('transaction', async () => {\n\tconst users = mysqlTable('users_transactions', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: int('balance').notNull(),\n\t});\n\tconst products = mysqlTable('products_transactions', {\n\t\tid: serial('id').primaryKey(),\n\t\tprice: int('price').notNull(),\n\t\tstock: int('stock').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`drop table if exists ${products}`);\n\n\tawait db.execute(sql`create table ${users} (id serial not null primary key, balance int not null)`);\n\tawait db.execute(\n\t\tsql`create table ${products} (id serial not null primary key, price int not null, stock int not null)`,\n\t);\n\n\tconst [{ insertId: userId }] = await db.insert(users).values({ balance: 100 });\n\tconst user = await db.select().from(users).where(eq(users.id, userId)).then((rows) => rows[0]!);\n\tconst [{ insertId: productId }] = await db.insert(products).values({ price: 10, stock: 10 });\n\tconst product = await db.select().from(products).where(eq(products.id, productId)).then((rows) => rows[0]!);\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.update(users).set({ balance: user.balance - product.price }).where(eq(users.id, user.id));\n\t\tawait tx.update(products).set({ stock: product.stock - 1 }).where(eq(products.id, product.id));\n\t});\n\n\tconst result = await db.select().from(users);\n\n\tawait db.execute(sql`drop table ${users}`);\n\tawait db.execute(sql`drop table ${products}`);\n\n\texpect(result).toEqual([{ id: 1, balance: 90 }]);\n});\n\ntest('transaction rollback', async () => {\n\tconst users = mysqlTable('users_transactions_rollback', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: int('balance').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, balance int not null)`,\n\t);\n\n\tawait expect((async () => {\n\t\tawait db.transaction(async (tx) => {\n\t\t\tawait tx.insert(users).values({ balance: 100 });\n\t\t\ttx.rollback();\n\t\t});\n\t})()).rejects.toThrowError(TransactionRollbackError);\n\n\tconst result = await db.select().from(users);\n\n\tawait db.execute(sql`drop table ${users}`);\n\n\texpect(result).toEqual([]);\n});\n\ntest('nested transaction', async () => {\n\tconst users = mysqlTable('users_nested_transactions', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: int('balance').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, balance int not null)`,\n\t);\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.insert(users).values({ balance: 100 });\n\n\t\tawait tx.transaction(async (tx) => {\n\t\t\tawait tx.update(users).set({ balance: 200 });\n\t\t});\n\t});\n\n\tconst result = await db.select().from(users);\n\n\tawait db.execute(sql`drop table ${users}`);\n\n\texpect(result).toEqual([{ id: 1, balance: 200 }]);\n});\n\ntest('nested transaction rollback', async () => {\n\tconst users = mysqlTable('users_nested_transactions_rollback', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: int('balance').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, balance int not null)`,\n\t);\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.insert(users).values({ balance: 100 });\n\n\t\tawait expect((async () => {\n\t\t\tawait tx.transaction(async (tx) => {\n\t\t\t\tawait tx.update(users).set({ balance: 200 });\n\t\t\t\ttx.rollback();\n\t\t\t});\n\t\t})()).rejects.toThrowError(TransactionRollbackError);\n\t});\n\n\tconst result = await db.select().from(users);\n\n\tawait db.execute(sql`drop table ${users}`);\n\n\texpect(result).toEqual([{ id: 1, balance: 100 }]);\n});\n\ntest('join subquery with join', async () => {\n\tconst internalStaff = mysqlTable('internal_staff', {\n\t\tuserId: int('user_id').notNull(),\n\t});\n\n\tconst customUser = mysqlTable('custom_user', {\n\t\tid: int('id').notNull(),\n\t});\n\n\tconst ticket = mysqlTable('ticket', {\n\t\tstaffId: int('staff_id').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${internalStaff}`);\n\tawait db.execute(sql`drop table if exists ${customUser}`);\n\tawait db.execute(sql`drop table if exists ${ticket}`);\n\n\tawait db.execute(sql`create table ${internalStaff} (user_id integer not null)`);\n\tawait db.execute(sql`create table ${customUser} (id integer not null)`);\n\tawait db.execute(sql`create table ${ticket} (staff_id integer not null)`);\n\n\tawait db.insert(internalStaff).values({ userId: 1 });\n\tawait db.insert(customUser).values({ id: 1 });\n\tawait db.insert(ticket).values({ staffId: 1 });\n\n\tconst subq = db\n\t\t.select()\n\t\t.from(internalStaff)\n\t\t.leftJoin(customUser, eq(internalStaff.userId, customUser.id))\n\t\t.as('internal_staff');\n\n\tconst mainQuery = await db\n\t\t.select()\n\t\t.from(ticket)\n\t\t.leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId));\n\n\tawait db.execute(sql`drop table ${internalStaff}`);\n\tawait db.execute(sql`drop table ${customUser}`);\n\tawait db.execute(sql`drop table ${ticket}`);\n\n\texpect(mainQuery).toEqual([{\n\t\tticket: { staffId: 1 },\n\t\tinternal_staff: {\n\t\t\tinternal_staff: { userId: 1 },\n\t\t\tcustom_user: { id: 1 },\n\t\t},\n\t}]);\n});\n\ntest('subquery with view', async () => {\n\tconst users = mysqlTable('users_subquery_view', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: int('city_id').notNull(),\n\t});\n\n\tconst newYorkers = mysqlView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`drop view if exists ${newYorkers}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t);\n\tawait db.execute(sql`create view ${newYorkers} as select * from ${users} where city_id = 1`);\n\n\tawait db.insert(users).values([\n\t\t{ name: 'John', cityId: 1 },\n\t\t{ name: 'Jane', cityId: 2 },\n\t\t{ name: 'Jack', cityId: 1 },\n\t\t{ name: 'Jill', cityId: 2 },\n\t]);\n\n\tconst sq = db.$with('sq').as(db.select().from(newYorkers));\n\tconst result = await db.with(sq).select().from(sq);\n\n\tawait db.execute(sql`drop view ${newYorkers}`);\n\tawait db.execute(sql`drop table ${users}`);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t{ id: 3, name: 'Jack', cityId: 1 },\n\t]);\n});\n\ntest('join view as subquery', async () => {\n\tconst users = mysqlTable('users_join_view', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: int('city_id').notNull(),\n\t});\n\n\tconst newYorkers = mysqlView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`drop view if exists ${newYorkers}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t);\n\tawait db.execute(sql`create view ${newYorkers} as select * from ${users} where city_id = 1`);\n\n\tawait db.insert(users).values([\n\t\t{ name: 'John', cityId: 1 },\n\t\t{ name: 'Jane', cityId: 2 },\n\t\t{ name: 'Jack', cityId: 1 },\n\t\t{ name: 'Jill', cityId: 2 },\n\t]);\n\n\tconst sq = db.select().from(newYorkers).as('new_yorkers_sq');\n\n\tconst result = await db.select().from(users).leftJoin(sq, eq(users.id, sq.id));\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tusers_join_view: { id: 1, name: 'John', cityId: 1 },\n\t\t\tnew_yorkers_sq: { id: 1, name: 'John', cityId: 1 },\n\t\t},\n\t\t{\n\t\t\tusers_join_view: { id: 2, name: 'Jane', cityId: 2 },\n\t\t\tnew_yorkers_sq: null,\n\t\t},\n\t\t{\n\t\t\tusers_join_view: { id: 3, name: 'Jack', cityId: 1 },\n\t\t\tnew_yorkers_sq: { id: 3, name: 'Jack', cityId: 1 },\n\t\t},\n\t\t{\n\t\t\tusers_join_view: { id: 4, name: 'Jill', cityId: 2 },\n\t\t\tnew_yorkers_sq: null,\n\t\t},\n\t]);\n\n\tawait db.execute(sql`drop view ${newYorkers}`);\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('select iterator', async () => {\n\tconst users = mysqlTable('users_iterator', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial not null primary key)`);\n\n\tawait db.insert(users).values([{}, {}, {}]);\n\n\tconst iter = db.select().from(users).iterator();\n\n\tconst result: typeof users.$inferSelect[] = [];\n\n\tfor await (const row of iter) {\n\t\tresult.push(row);\n\t}\n\n\texpect(result).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }]);\n});\n\ntest('select iterator w/ prepared statement', async () => {\n\tconst users = mysqlTable('users_iterator', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial not null primary key)`);\n\n\tawait db.insert(users).values([{}, {}, {}]);\n\n\tconst prepared = db.select().from(users).prepare();\n\tconst iter = prepared.iterator();\n\tconst result: typeof users.$inferSelect[] = [];\n\n\tfor await (const row of iter) {\n\t\tresult.push(row);\n\t}\n\n\texpect(result).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }]);\n});\n\ntest('insert undefined', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name'),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text)`,\n\t);\n\n\tawait expect((async () => {\n\t\tawait db.insert(users).values({ name: undefined });\n\t})()).resolves.not.toThrowError();\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('update undefined', async () => {\n\tconst users = mysqlTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name'),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text)`,\n\t);\n\n\tawait expect((async () => {\n\t\tawait db.update(users).set({ name: undefined });\n\t})()).rejects.toThrowError();\n\n\tawait expect((async () => {\n\t\tawait db.update(users).set({ id: 1, name: undefined });\n\t})()).resolves.not.toThrowError();\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n"
  },
  {
    "path": "integration-tests/tests/mysql/mysql-proxy.test.ts",
    "content": "import retry from 'async-retry';\nimport type { MySqlRemoteDatabase } from 'drizzle-orm/mysql-proxy';\nimport { drizzle as proxyDrizzle } from 'drizzle-orm/mysql-proxy';\nimport * as mysql from 'mysql2/promise';\nimport { afterAll, beforeAll, beforeEach } from 'vitest';\nimport { skipTests } from '~/common';\nimport { createDockerDB, tests } from './mysql-common';\n\nconst ENABLE_LOGGING = false;\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nclass ServerSimulator {\n\tconstructor(private db: mysql.Connection) {}\n\n\tasync query(sql: string, params: any[], method: 'all' | 'execute') {\n\t\tif (method === 'all') {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db.query({\n\t\t\t\t\tsql,\n\t\t\t\t\tvalues: params,\n\t\t\t\t\trowsAsArray: true,\n\t\t\t\t\ttypeCast: function(field: any, next: any) {\n\t\t\t\t\t\tif (field.type === 'TIMESTAMP' || field.type === 'DATETIME' || field.type === 'DATE') {\n\t\t\t\t\t\t\treturn field.string();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn next();\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn { data: result[0] as any };\n\t\t\t} catch (e: any) {\n\t\t\t\treturn { error: e };\n\t\t\t}\n\t\t} else if (method === 'execute') {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db.query({\n\t\t\t\t\tsql,\n\t\t\t\t\tvalues: params,\n\t\t\t\t\ttypeCast: function(field: any, next: any) {\n\t\t\t\t\t\tif (field.type === 'TIMESTAMP' || field.type === 'DATETIME' || field.type === 'DATE') {\n\t\t\t\t\t\t\treturn field.string();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn next();\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn { data: result as any };\n\t\t\t} catch (e: any) {\n\t\t\t\treturn { error: e };\n\t\t\t}\n\t\t} else {\n\t\t\treturn { error: 'Unknown method value' };\n\t\t}\n\t}\n\n\tasync migrations(queries: string[]) {\n\t\tawait this.db.query('START TRANSACTION');\n\t\ttry {\n\t\t\tfor (const query of queries) {\n\t\t\t\tawait this.db.query(query);\n\t\t\t}\n\t\t\tawait this.db.query('COMMIT');\n\t\t} catch (e) {\n\t\t\tawait this.db.query('ROLLBACK');\n\t\t\tthrow e;\n\t\t}\n\n\t\treturn {};\n\t}\n}\n\nlet db: MySqlRemoteDatabase;\nlet client: mysql.Connection;\nlet serverSimulator: ServerSimulator;\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['MYSQL_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['MYSQL_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t}\n\tclient = await retry(async () => {\n\t\tclient = await mysql.createConnection({\n\t\t\turi: connectionString,\n\t\t\tsupportBigNumbers: true,\n\t\t});\n\t\tawait client.connect();\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.end();\n\t\t},\n\t});\n\tserverSimulator = new ServerSimulator(client);\n\tdb = proxyDrizzle(async (sql, params, method) => {\n\t\ttry {\n\t\t\tconst response = await serverSimulator.query(sql, params, method);\n\n\t\t\tif (response.error !== undefined) {\n\t\t\t\tthrow response.error;\n\t\t\t}\n\n\t\t\treturn { rows: response.data };\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error from mysql proxy server:', e.message);\n\t\t\tthrow e;\n\t\t}\n\t}, { logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n});\n\nbeforeEach((ctx) => {\n\tctx.mysql = {\n\t\tdb,\n\t};\n});\n\nskipTests([\n\t'select iterator w/ prepared statement',\n\t'select iterator',\n\t'nested transaction rollback',\n\t'nested transaction',\n\t'transaction rollback',\n\t'transaction',\n\t'transaction with options (set isolationLevel)',\n\t'migrator',\n]);\n\ntests();\n"
  },
  {
    "path": "integration-tests/tests/mysql/mysql.test.ts",
    "content": "import retry from 'async-retry';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport * as mysql from 'mysql2/promise';\nimport { afterAll, beforeAll, beforeEach } from 'vitest';\nimport { createDockerDB, tests } from './mysql-common';\nimport { TestCache, TestGlobalCache, tests as cacheTests } from './mysql-common-cache';\n\nconst ENABLE_LOGGING = false;\n\nlet db: MySql2Database;\nlet dbGlobalCached: MySql2Database;\nlet cachedDb: MySql2Database;\nlet client: mysql.Connection;\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['MYSQL_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['MYSQL_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t}\n\tclient = await retry(async () => {\n\t\tclient = await mysql.createConnection({\n\t\t\turi: connectionString!,\n\t\t\tsupportBigNumbers: true,\n\t\t});\n\t\tawait client.connect();\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.end();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestCache() });\n\tdbGlobalCached = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestGlobalCache() });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n});\n\nbeforeEach((ctx) => {\n\tctx.mysql = {\n\t\tdb,\n\t};\n\tctx.cachedMySQL = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ncacheTests();\ntests();\n"
  },
  {
    "path": "integration-tests/tests/mysql/tidb-serverless.test.ts",
    "content": "import 'dotenv/config';\n\nimport { connect } from '@tidbcloud/serverless';\nimport type { TiDBServerlessDatabase } from 'drizzle-orm/tidb-serverless';\nimport { drizzle } from 'drizzle-orm/tidb-serverless';\nimport { beforeAll, beforeEach } from 'vitest';\nimport { skipTests } from '~/common.ts';\nimport { tests } from './mysql-common.ts';\n\nconst ENABLE_LOGGING = false;\n\nlet db: TiDBServerlessDatabase;\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['TIDB_CONNECTION_STRING'];\n\tif (!connectionString) {\n\t\tthrow new Error('TIDB_CONNECTION_STRING is not set');\n\t}\n\n\tconst client = connect({ url: connectionString });\n\tdb = drizzle(client!, { logger: ENABLE_LOGGING });\n});\n\nbeforeEach((ctx) => {\n\tctx.mysql = {\n\t\tdb,\n\t};\n});\n\nskipTests([\n\t'mySchema :: select with group by as field',\n\t'mySchema :: delete with returning all fields',\n\t'mySchema :: update with returning partial',\n\t'mySchema :: delete returning sql',\n\t'mySchema :: insert returning sql',\n\t'test $onUpdateFn and $onUpdate works updating',\n\t'set operations (mixed all) as function with subquery',\n\t'set operations (union) from query builder with subquery',\n\t'join on aliased sql from with clause',\n\t'join on aliased sql from select',\n\t'select from raw sql with joins',\n\t'select from raw sql',\n\t'having',\n\t'select count()',\n\t'with ... select',\n\t'insert via db.execute w/ query builder',\n\t'insert via db.execute + select via db.execute',\n\t'select with group by as sql',\n\t'select with group by as field',\n\t'insert many with returning',\n\t'delete with returning partial',\n\t'delete with returning all fields',\n\t'update with returning partial',\n\t'update with returning all fields',\n\t'update returning sql',\n\t'delete returning sql',\n\t'insert returning sql',\n\n\t// not supported\n\t'set operations (except all) as function',\n\t'set operations (except all) from query builder',\n\t'set operations (intersect all) as function',\n\t'set operations (intersect all) from query builder',\n\t'set operations (union all) as function',\n\t'tc config for datetime',\n\t'select iterator w/ prepared statement',\n\t'select iterator',\n\t'transaction',\n\t'transaction with options (set isolationLevel)',\n\t'Insert all defaults in multiple rows',\n\t'Insert all defaults in 1 row',\n\t'$default with empty array',\n\t'utc config for datetime',\n]);\n\ntests();\n"
  },
  {
    "path": "integration-tests/tests/mysql-returning.test.ts",
    "content": "import 'dotenv/config';\n\nimport type { TestFn } from 'ava';\nimport anyTest from 'ava';\nimport Docker from 'dockerode';\nimport { DefaultLogger, sql } from 'drizzle-orm';\nimport { boolean, json, mysqlTable, serial, text, timestamp, varchar } from 'drizzle-orm/mysql-core';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport getPort from 'get-port';\nimport * as mysql from 'mysql2/promise';\nimport { v4 as uuid } from 'uuid';\n\nconst ENABLE_LOGGING = false;\n\nconst usersTable = mysqlTable('userstest', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\ninterface Context {\n\tdocker: Docker;\n\tmysqlContainer: Docker.Container;\n\tdb: MySql2Database;\n\tclient: mysql.Connection;\n}\n\nconst test = anyTest as TestFn<Context>;\n\nasync function createDockerDB(ctx: Context): Promise<string> {\n\tconst docker = (ctx.docker = new Docker());\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'mysql:8';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tctx.mysqlContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait ctx.mysqlContainer.start();\n\n\treturn `mysql://root:mysql@127.0.0.1:${port}/drizzle`;\n}\n\ntest.before(async (t) => {\n\tconst ctx = t.context;\n\tconst connectionString = process.env['MYSQL_CONNECTION_STRING'] ?? await createDockerDB(ctx);\n\n\tconst sleep = 1000;\n\tlet timeLeft = 20000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tctx.client = await mysql.createConnection(connectionString);\n\t\t\tawait ctx.client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to MySQL');\n\t\tawait ctx.client?.end().catch(console.error);\n\t\tawait ctx.mysqlContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\tctx.db = drizzle(ctx.client, { logger: ENABLE_LOGGING ? new DefaultLogger() : undefined });\n});\n\ntest.after.always(async (t) => {\n\tconst ctx = t.context;\n\tawait ctx.client?.end().catch(console.error);\n\tawait ctx.mysqlContainer?.stop().catch(console.error);\n});\n\ntest.beforeEach(async (t) => {\n\tconst ctx = t.context;\n\tawait ctx.db.execute(sql`drop table if exists \\`userstest\\``);\n\tawait ctx.db.execute(sql`drop table if exists \\`users2\\``);\n\tawait ctx.db.execute(sql`drop table if exists \\`cities\\``);\n\n\tawait ctx.db.execute(\n\t\tsql`\n\t\t\tcreate table \\`userstest\\` (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`verified\\` boolean not null default false,\n\t\t\t\t\\`jsonb\\` json,\n\t\t\t\t\\`created_at\\` timestamp not null default now()\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait ctx.db.execute(\n\t\tsql`\n\t\t\tcreate table \\`users2\\` (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`city_id\\` int references \\`cities\\`(\\`id\\`)\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait ctx.db.execute(\n\t\tsql`\n\t\t\tcreate table \\`cities\\` (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null\n\t\t\t)\n\t\t`,\n\t);\n});\n\nasync function setupReturningFunctionsTest(db: MySql2Database) {\n\tawait db.execute(sql`drop table if exists \\`users_default_fn\\``);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table \\`users_default_fn\\` (\n\t\t\t\t\\`id\\` varchar(256) primary key,\n\t\t\t\t\\`name\\` text not null\n\t\t\t);\n\t\t`,\n\t);\n}\n\ntest.serial('insert $returningId: serail as id', async (t) => {\n\tconst { db } = t.context;\n\n\tconst result = await db.insert(usersTable).values({ name: 'John' }).$returningId();\n\t//    ^?\n\tt.deepEqual(result, [{ id: 1 }]);\n});\n\ntest.serial('insert $returningId: serail as id, batch insert', async (t) => {\n\tconst { db } = t.context;\n\n\tconst result = await db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]).$returningId();\n\t//    ^?\n\tt.deepEqual(result, [{ id: 1 }, { id: 2 }]);\n});\n\ntest.serial('insert $returningId: $default as primary key', async (t) => {\n\tconst { db } = t.context;\n\n\tconst uniqueKeys = ['ao865jf3mcmkfkk8o5ri495z', 'dyqs529eom0iczo2efxzbcut'];\n\tlet iterator = 0;\n\n\tconst usersTableDefFn = mysqlTable('users_default_fn', {\n\t\tcustomId: varchar('id', { length: 256 }).primaryKey().$defaultFn(() => {\n\t\t\tconst value = uniqueKeys[iterator]!;\n\t\t\titerator++;\n\t\t\treturn value;\n\t\t}),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait setupReturningFunctionsTest(db);\n\n\tconst result = await db.insert(usersTableDefFn).values([{ name: 'John' }, { name: 'John1' }])\n\t\t//    ^?\n\t\t.$returningId();\n\tt.deepEqual(result, [{ customId: 'ao865jf3mcmkfkk8o5ri495z' }, { customId: 'dyqs529eom0iczo2efxzbcut' }]);\n});\n\ntest.serial('insert $returningId: $default as primary key with value', async (t) => {\n\tconst { db } = t.context;\n\n\tconst uniqueKeys = ['ao865jf3mcmkfkk8o5ri495z', 'dyqs529eom0iczo2efxzbcut'];\n\tlet iterator = 0;\n\n\tconst usersTableDefFn = mysqlTable('users_default_fn', {\n\t\tcustomId: varchar('id', { length: 256 }).primaryKey().$defaultFn(() => {\n\t\t\tconst value = uniqueKeys[iterator]!;\n\t\t\titerator++;\n\t\t\treturn value;\n\t\t}),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait setupReturningFunctionsTest(db);\n\n\tconst result = await db.insert(usersTableDefFn).values([{ name: 'John', customId: 'test' }, { name: 'John1' }])\n\t\t//    ^?\n\t\t.$returningId();\n\tt.deepEqual(result, [{ customId: 'test' }, { customId: 'ao865jf3mcmkfkk8o5ri495z' }]);\n});\n"
  },
  {
    "path": "integration-tests/tests/pg/awsdatapi.test.ts",
    "content": "import 'dotenv/config';\n\nimport { RDSDataClient } from '@aws-sdk/client-rds-data';\nimport * as dotenv from 'dotenv';\nimport { asc, eq, inArray, notInArray, relations, sql, TransactionRollbackError } from 'drizzle-orm';\nimport type { AwsDataApiPgDatabase } from 'drizzle-orm/aws-data-api/pg';\nimport { drizzle } from 'drizzle-orm/aws-data-api/pg';\nimport { migrate } from 'drizzle-orm/aws-data-api/pg/migrator';\nimport {\n\talias,\n\tboolean,\n\tdate,\n\tinteger,\n\tjsonb,\n\tpgTable,\n\tpgTableCreator,\n\tserial,\n\ttext,\n\ttime,\n\ttimestamp,\n\tuuid,\n} from 'drizzle-orm/pg-core';\nimport { Resource } from 'sst';\nimport { afterAll, beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\n\nimport type { Equal } from '../utils.ts';\nimport { Expect, randomString } from '../utils.ts';\n\ndotenv.config();\n\nconst ENABLE_LOGGING = false;\n\nconst usersTable = pgTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: jsonb('jsonb').$type<string[]>(),\n\tbestTexts: text('best_texts')\n\t\t.array()\n\t\t.default(sql`'{}'`)\n\t\t.notNull(),\n\tcreatedAt: timestamp('created_at', { withTimezone: true })\n\t\t.notNull()\n\t\t.defaultNow(),\n});\n\nconst usersMigratorTable = pgTable('users12', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n});\n\nconst todo = pgTable('todo', {\n\tid: uuid('id').primaryKey(),\n\ttitle: text('title').notNull(),\n\tdescription: text('description'),\n});\n\nconst todoRelations = relations(todo, (ctx) => ({\n\tuser: ctx.many(todoUser),\n}));\n\nconst user = pgTable('user', {\n\tid: uuid('id').primaryKey(),\n\temail: text('email').notNull(),\n});\n\nconst userRelations = relations(user, (ctx) => ({\n\ttodos: ctx.many(todoUser),\n}));\n\nconst todoUser = pgTable('todo_user', {\n\ttodoId: uuid('todo_id').references(() => todo.id),\n\tuserId: uuid('user_id').references(() => user.id),\n});\n\nconst todoToGroupRelations = relations(todoUser, (ctx) => ({\n\ttodo: ctx.one(todo, {\n\t\tfields: [todoUser.todoId],\n\t\treferences: [todo.id],\n\t}),\n\tuser: ctx.one(user, {\n\t\tfields: [todoUser.userId],\n\t\treferences: [user.id],\n\t}),\n}));\n\nconst schema = {\n\ttodo,\n\ttodoRelations,\n\tuser,\n\tuserRelations,\n\ttodoUser,\n\ttodoToGroupRelations,\n};\n\nlet db: AwsDataApiPgDatabase<typeof schema>;\n\nbeforeAll(async () => {\n\tconst rdsClient = new RDSDataClient();\n\n\tdb = drizzle(rdsClient, {\n\t\t// @ts-ignore\n\t\tdatabase: Resource.Postgres.database,\n\t\t// @ts-ignore\n\t\tsecretArn: Resource.Postgres.secretArn,\n\t\t// @ts-ignore\n\t\tresourceArn: Resource.Postgres.clusterArn,\n\t\tlogger: ENABLE_LOGGING,\n\t\tschema,\n\t});\n});\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop schema public cascade`);\n\tawait db.execute(sql`create schema public`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified boolean not null default false, \n\t\t\t\tjsonb jsonb,\n\t\t\t\tbest_texts text[] not null default '{}',\n\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table todo (\n\t\t\t\tid uuid primary key,\n\t\t\t\ttitle text not null,\n\t\t\t\tdescription text\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table \"user\" (\n\t\t\t\tid uuid primary key,\n\t\t\t\temail text not null\n\t\t\t)\n\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table todo_user (\n\t\t\t\ttodo_id uuid references todo(id),\n\t\t\t\tuser_id uuid references \"user\"(id)\n\t\t\t)\n\t\t`,\n\t);\n});\n\ntest('select all fields', async () => {\n\tconst insertResult = await db.insert(usersTable).values({ name: 'John' });\n\n\texpect(insertResult.numberOfRecordsUpdated).toBe(1);\n\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t// t.assert(Math.abs(result[0]!.createdAt.getTime() - now) < 100);\n\texpect(result).toEqual([\n\t\t{\n\t\t\tbestTexts: [],\n\t\t\tid: 1,\n\t\t\tname: 'John',\n\t\t\tverified: false,\n\t\t\tjsonb: null,\n\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t},\n\t]);\n});\n\ntest('select sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.select({\n\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t})\n\t\t.from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('select with empty array in inArray', async () => {\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\tconst users = await db\n\t\t.select({\n\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t})\n\t\t.from(usersTable)\n\t\t.where(inArray(usersTable.id, []));\n\n\texpect(users).toEqual([]);\n});\n\ntest('select with empty array in notInArray', async () => {\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\tconst result = await db\n\t\t.select({\n\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t})\n\t\t.from(usersTable)\n\t\t.where(notInArray(usersTable.id, []));\n\n\texpect(result).toEqual([\n\t\t{ name: 'JOHN' },\n\t\t{ name: 'JANE' },\n\t\t{ name: 'JANE' },\n\t]);\n});\n\ntest('select typed sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.select({\n\t\t\tname: sql<string>`upper(${usersTable.name})`,\n\t\t})\n\t\t.from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('select distinct', async () => {\n\tconst usersDistinctTable = pgTable('users_distinct', {\n\t\tid: integer('id').notNull(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${usersDistinctTable}`);\n\tawait db.execute(\n\t\tsql`create table ${usersDistinctTable} (id integer, name text)`,\n\t);\n\n\tawait db.insert(usersDistinctTable).values([\n\t\t{ id: 1, name: 'John' },\n\t\t{ id: 1, name: 'John' },\n\t\t{ id: 2, name: 'John' },\n\t\t{ id: 1, name: 'Jane' },\n\t]);\n\tconst users1 = await db\n\t\t.selectDistinct()\n\t\t.from(usersDistinctTable)\n\t\t.orderBy(usersDistinctTable.id, usersDistinctTable.name);\n\tconst users2 = await db\n\t\t.selectDistinctOn([usersDistinctTable.id])\n\t\t.from(usersDistinctTable)\n\t\t.orderBy(usersDistinctTable.id);\n\tconst users3 = await db\n\t\t.selectDistinctOn([usersDistinctTable.name], {\n\t\t\tname: usersDistinctTable.name,\n\t\t})\n\t\t.from(usersDistinctTable)\n\t\t.orderBy(usersDistinctTable.name);\n\n\tawait db.execute(sql`drop table ${usersDistinctTable}`);\n\n\texpect(users1).toEqual([\n\t\t{ id: 1, name: 'Jane' },\n\t\t{ id: 1, name: 'John' },\n\t\t{ id: 2, name: 'John' },\n\t]);\n\n\texpect(users2.length).toEqual(2);\n\texpect(users2[0]?.id).toEqual(1);\n\texpect(users2[1]?.id).toEqual(2);\n\n\texpect(users3.length).toEqual(2);\n\texpect(users3[0]?.name).toEqual('Jane');\n\texpect(users3[1]?.name).toEqual('John');\n});\n\ntest('insert returning sql', async () => {\n\tconst users = await db\n\t\t.insert(usersTable)\n\t\t.values({ name: 'John' })\n\t\t.returning({\n\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t});\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('delete returning sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.delete(usersTable)\n\t\t.where(eq(usersTable.name, 'John'))\n\t\t.returning({\n\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t});\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('update returning sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.update(usersTable)\n\t\t.set({ name: 'Jane' })\n\t\t.where(eq(usersTable.name, 'John'))\n\t\t.returning({\n\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t});\n\n\texpect(users).toEqual([{ name: 'JANE' }]);\n});\n\ntest('update with returning all fields', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.update(usersTable)\n\t\t.set({ name: 'Jane' })\n\t\t.where(eq(usersTable.name, 'John'))\n\t\t.returning();\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t// t.assert(Math.abs(users[0]!.createdAt.getTime() - now) < 100);\n\texpect(users).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\tbestTexts: [],\n\t\t\tname: 'Jane',\n\t\t\tverified: false,\n\t\t\tjsonb: null,\n\t\t\tcreatedAt: users[0]!.createdAt,\n\t\t},\n\t]);\n});\n\ntest('update with returning partial', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.update(usersTable)\n\t\t.set({ name: 'Jane' })\n\t\t.where(eq(usersTable.name, 'John'))\n\t\t.returning({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t});\n\n\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n});\n\ntest('delete with returning all fields', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.delete(usersTable)\n\t\t.where(eq(usersTable.name, 'John'))\n\t\t.returning();\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t// t.assert(Math.abs(users[0]!.createdAt.getTime() - now) < 100);\n\texpect(users).toEqual([\n\t\t{\n\t\t\tbestTexts: [],\n\t\t\tid: 1,\n\t\t\tname: 'John',\n\t\t\tverified: false,\n\t\t\tjsonb: null,\n\t\t\tcreatedAt: users[0]!.createdAt,\n\t\t},\n\t]);\n});\n\ntest('delete with returning partial', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.delete(usersTable)\n\t\t.where(eq(usersTable.name, 'John'))\n\t\t.returning({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t});\n\n\texpect(users).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert + select', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\texpect(result).toEqual([\n\t\t{\n\t\t\tbestTexts: [],\n\t\t\tid: 1,\n\t\t\tname: 'John',\n\t\t\tverified: false,\n\t\t\tjsonb: null,\n\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t},\n\t]);\n\n\tawait db.insert(usersTable).values({ name: 'Jane' });\n\tconst result2 = await db.select().from(usersTable);\n\texpect(result2).toEqual([\n\t\t{\n\t\t\tbestTexts: [],\n\t\t\tid: 1,\n\t\t\tname: 'John',\n\t\t\tverified: false,\n\t\t\tjsonb: null,\n\t\t\tcreatedAt: result2[0]!.createdAt,\n\t\t},\n\t\t{\n\t\t\tbestTexts: [],\n\t\t\tid: 2,\n\t\t\tname: 'Jane',\n\t\t\tverified: false,\n\t\t\tjsonb: null,\n\t\t\tcreatedAt: result2[1]!.createdAt,\n\t\t},\n\t]);\n});\n\ntest('json insert', async () => {\n\tawait db.insert(usersTable).values({ name: 'John', jsonb: ['foo', 'bar'] });\n\tconst result = await db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t\tjsonb: usersTable.jsonb,\n\t\t})\n\t\t.from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', jsonb: ['foo', 'bar'] }]);\n});\n\ntest('insert with overridden default values', async () => {\n\tawait db.insert(usersTable).values({ name: 'John', verified: true });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tbestTexts: [],\n\t\t\tid: 1,\n\t\t\tname: 'John',\n\t\t\tverified: true,\n\t\t\tjsonb: null,\n\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t},\n\t]);\n});\n\ntest('insert many', async () => {\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values([\n\t\t\t{ name: 'John' },\n\t\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t\t{ name: 'Jane' },\n\t\t\t{ name: 'Austin', verified: true },\n\t\t]);\n\tconst result = await db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t\tjsonb: usersTable.jsonb,\n\t\t\tverified: usersTable.verified,\n\t\t})\n\t\t.from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t]);\n});\n\ntest('insert many with returning', async () => {\n\tconst result = await db\n\t\t.insert(usersTable)\n\t\t.values([\n\t\t\t{ name: 'John' },\n\t\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t\t{ name: 'Jane' },\n\t\t\t{ name: 'Austin', verified: true },\n\t\t])\n\t\t.returning({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t\tjsonb: usersTable.jsonb,\n\t\t\tverified: usersTable.verified,\n\t\t});\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t]);\n});\n\ntest('select with group by as field', async () => {\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db\n\t\t.select({ name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.groupBy(usersTable.name);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('select with group by as sql', async () => {\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db\n\t\t.select({ name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('select with group by as sql + column', async () => {\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db\n\t\t.select({ name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`, usersTable.id);\n\n\texpect(result).toEqual([\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'John' },\n\t]);\n});\n\ntest('select with group by as column + sql', async () => {\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db\n\t\t.select({ name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`);\n\n\texpect(result).toEqual([\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'John' },\n\t]);\n});\n\ntest('select with group by complex query', async () => {\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db\n\t\t.select({ name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t.orderBy(asc(usersTable.name))\n\t\t.limit(1);\n\n\texpect(result).toEqual([{ name: 'Jane' }]);\n});\n\ntest('build query', async () => {\n\tconst query = db\n\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.groupBy(usersTable.id, usersTable.name)\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\", \"users\".\"name\"',\n\t\tparams: [],\n\t\t// typings: []\n\t});\n});\n\ntest('insert sql', async () => {\n\tawait db.insert(usersTable).values({ name: sql`${'John'}` });\n\tconst result = await db\n\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t.from(usersTable);\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('partial join with alias', async () => {\n\tconst customerAlias = alias(usersTable, 'customer');\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 10, name: 'Ivan' },\n\t\t{ id: 11, name: 'Hans' },\n\t]);\n\tconst result = await db\n\t\t.select({\n\t\t\tuser: {\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t},\n\t\t\tcustomer: {\n\t\t\t\tid: customerAlias.id,\n\t\t\t\tname: customerAlias.name,\n\t\t\t},\n\t\t})\n\t\t.from(usersTable)\n\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t.where(eq(usersTable.id, 10));\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tuser: { id: 10, name: 'Ivan' },\n\t\t\tcustomer: { id: 11, name: 'Hans' },\n\t\t},\n\t]);\n});\n\ntest('full join with alias', async () => {\n\tconst customerAlias = alias(usersTable, 'customer');\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 10, name: 'Ivan' },\n\t\t{ id: 11, name: 'Hans' },\n\t]);\n\n\tconst result = await db\n\t\t.select()\n\t\t.from(usersTable)\n\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t.where(eq(usersTable.id, 10));\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tusers: {\n\t\t\t\tid: 10,\n\t\t\t\tbestTexts: [],\n\t\t\t\tname: 'Ivan',\n\t\t\t\tverified: false,\n\t\t\t\tjsonb: null,\n\t\t\t\tcreatedAt: result[0]!.users.createdAt,\n\t\t\t},\n\t\t\tcustomer: {\n\t\t\t\tbestTexts: [],\n\t\t\t\tid: 11,\n\t\t\t\tname: 'Hans',\n\t\t\t\tverified: false,\n\t\t\t\tjsonb: null,\n\t\t\t\tcreatedAt: result[0]!.customer!.createdAt,\n\t\t\t},\n\t\t},\n\t]);\n});\n\ntest('select from alias', async () => {\n\tconst pgTable = pgTableCreator((name) => `prefixed_${name}`);\n\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial primary key, name text not null)`,\n\t);\n\n\tconst user = alias(users, 'user');\n\tconst customers = alias(users, 'customer');\n\n\tawait db.insert(users).values([\n\t\t{ id: 10, name: 'Ivan' },\n\t\t{ id: 11, name: 'Hans' },\n\t]);\n\tconst result = await db\n\t\t.select()\n\t\t.from(user)\n\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t.where(eq(user.id, 10));\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tuser: {\n\t\t\t\tid: 10,\n\t\t\t\tname: 'Ivan',\n\t\t\t},\n\t\t\tcustomer: {\n\t\t\t\tid: 11,\n\t\t\t\tname: 'Hans',\n\t\t\t},\n\t\t},\n\t]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('insert with spaces', async () => {\n\tawait db.insert(usersTable).values({ name: sql`'Jo   h     n'` });\n\tconst result = await db\n\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t.from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n});\n\ntest('prepared statement', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst statement = db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t})\n\t\t.from(usersTable)\n\t\t.prepare('statement1');\n\tconst result = await statement.execute();\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('prepared statement reuse', async () => {\n\tconst stmt = db\n\t\t.insert(usersTable)\n\t\t.values({\n\t\t\tverified: true,\n\t\t\tname: sql.placeholder('name'),\n\t\t})\n\t\t.prepare('stmt2');\n\n\tfor (let i = 0; i < 10; i++) {\n\t\tawait stmt.execute({ name: `John ${i}` });\n\t}\n\n\tconst result = await db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t\tverified: usersTable.verified,\n\t\t})\n\t\t.from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John 0', verified: true },\n\t\t{ id: 2, name: 'John 1', verified: true },\n\t\t{ id: 3, name: 'John 2', verified: true },\n\t\t{ id: 4, name: 'John 3', verified: true },\n\t\t{ id: 5, name: 'John 4', verified: true },\n\t\t{ id: 6, name: 'John 5', verified: true },\n\t\t{ id: 7, name: 'John 6', verified: true },\n\t\t{ id: 8, name: 'John 7', verified: true },\n\t\t{ id: 9, name: 'John 8', verified: true },\n\t\t{ id: 10, name: 'John 9', verified: true },\n\t]);\n});\n\ntest('prepared statement with placeholder in .where', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst stmt = db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t})\n\t\t.from(usersTable)\n\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t.prepare('stmt3');\n\tconst result = await stmt.execute({ id: 1 });\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('migrator : default migration strategy', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom schema', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, {\n\t\tmigrationsFolder: './drizzle2/pg',\n\t\tmigrationsSchema: 'custom_migrations',\n\t});\n\n\t// test if the custom migrations table was created\n\tconst { rows } = await db.execute(\n\t\tsql`select * from custom_migrations.\"__drizzle_migrations\";`,\n\t);\n\texpect(rows).toBeTruthy();\n\texpect(rows!.length).toBeGreaterThan(0);\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(\n\t\tsql`drop table custom_migrations.\"__drizzle_migrations\"`,\n\t);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, {\n\t\tmigrationsFolder: './drizzle2/pg',\n\t\tmigrationsTable: customTable,\n\t});\n\n\t// test if the custom migrations table was created\n\tconst { rows } = await db.execute(\n\t\tsql`select * from \"drizzle\".${sql.identifier(customTable)};`,\n\t);\n\texpect(rows).toBeTruthy();\n\texpect(rows!.length).toBeGreaterThan(0);\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".${sql.identifier(customTable)}`);\n});\n\ntest('migrator : migrate with custom table and custom schema', async () => {\n\tconst customTable = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, {\n\t\tmigrationsFolder: './drizzle2/pg',\n\t\tmigrationsTable: customTable,\n\t\tmigrationsSchema: 'custom_migrations',\n\t});\n\n\t// test if the custom migrations table was created\n\tconst { rows } = await db.execute(\n\t\tsql`select * from custom_migrations.${\n\t\t\tsql.identifier(\n\t\t\t\tcustomTable,\n\t\t\t)\n\t\t};`,\n\t);\n\texpect(rows).toBeTruthy();\n\texpect(rows!.length).toBeGreaterThan(0);\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(\n\t\tsql`drop table custom_migrations.${\n\t\t\tsql.identifier(\n\t\t\t\tcustomTable,\n\t\t\t)\n\t\t}`,\n\t);\n});\n\ntest('insert via db.execute + select via db.execute', async () => {\n\tawait db.execute(\n\t\tsql`insert into ${usersTable} (${\n\t\t\tsql.identifier(\n\t\t\t\tusersTable.name.name,\n\t\t\t)\n\t\t}) values (${'John'})`,\n\t);\n\n\tconst result = await db.execute<{ id: number; name: string }>(\n\t\tsql`select id, name from \"users\"`,\n\t);\n\texpectTypeOf(result.rows).toEqualTypeOf<{ id: number; name: string }[]>();\n\texpect(result.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute + returning', async () => {\n\tconst inserted = await db.execute(\n\t\tsql`insert into ${usersTable} (${\n\t\t\tsql.identifier(\n\t\t\t\tusersTable.name.name,\n\t\t\t)\n\t\t}) values (${'John'}) returning ${usersTable.id}, ${usersTable.name}`,\n\t);\n\texpect(inserted.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async () => {\n\tconst inserted = await db.execute(\n\t\tdb\n\t\t\t.insert(usersTable)\n\t\t\t.values({ name: 'John' })\n\t\t\t.returning({ id: usersTable.id, name: usersTable.name }),\n\t);\n\texpect(inserted.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('build query insert with onConflict do update', async () => {\n\tconst query = db\n\t\t.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoUpdate({ target: usersTable.id, set: { name: 'John1' } })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"best_texts\", \"created_at\") values (default, :1, default, :2, default, default) on conflict (\"id\") do update set \"name\" = :3',\n\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t\t// typings: ['none', 'json', 'none']\n\t});\n});\n\ntest('build query insert with onConflict do update / multiple columns', async () => {\n\tconst query = db\n\t\t.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoUpdate({\n\t\t\ttarget: [usersTable.id, usersTable.name],\n\t\t\tset: { name: 'John1' },\n\t\t})\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"best_texts\", \"created_at\") values (default, :1, default, :2, default, default) on conflict (\"id\",\"name\") do update set \"name\" = :3',\n\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t\t// typings: ['none', 'json', 'none']\n\t});\n});\n\ntest('build query insert with onConflict do nothing', async () => {\n\tconst query = db\n\t\t.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoNothing()\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"best_texts\", \"created_at\") values (default, :1, default, :2, default, default) on conflict do nothing',\n\t\tparams: ['John', '[\"foo\",\"bar\"]'],\n\t\t// typings: ['none', 'json']\n\t});\n});\n\ntest('build query insert with onConflict do nothing + target', async () => {\n\tconst query = db\n\t\t.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoNothing({ target: usersTable.id })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"best_texts\", \"created_at\") values (default, :1, default, :2, default, default) on conflict (\"id\") do nothing',\n\t\tparams: ['John', '[\"foo\",\"bar\"]'],\n\t\t// typings: ['none', 'json']\n\t});\n});\n\ntest('insert with onConflict do update', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' })\n\t\t.onConflictDoUpdate({ target: usersTable.id, set: { name: 'John1' } });\n\n\tconst res = await db\n\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.where(eq(usersTable.id, 1));\n\n\texpect(res).toEqual([{ id: 1, name: 'John1' }]);\n});\n\ntest('insert with onConflict do nothing', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' })\n\t\t.onConflictDoNothing();\n\n\tconst res = await db\n\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.where(eq(usersTable.id, 1));\n\n\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert with onConflict do nothing + target', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\n\tawait db\n\t\t.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' })\n\t\t.onConflictDoNothing({ target: usersTable.id });\n\n\tconst res = await db\n\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t.from(usersTable)\n\t\t.where(eq(usersTable.id, 1));\n\n\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('transaction', async () => {\n\tconst users = pgTable('users_transactions', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: integer('balance').notNull(),\n\t});\n\tconst products = pgTable('products_transactions', {\n\t\tid: serial('id').primaryKey(),\n\t\tprice: integer('price').notNull(),\n\t\tstock: integer('stock').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`drop table if exists ${products}`);\n\n\tawait db.execute(\n\t\tsql`create table users_transactions (id serial not null primary key, balance integer not null)`,\n\t);\n\tawait db.execute(\n\t\tsql`create table products_transactions (id serial not null primary key, price integer not null, stock integer not null)`,\n\t);\n\n\tconst user = await db\n\t\t.insert(users)\n\t\t.values({ balance: 100 })\n\t\t.returning()\n\t\t.then((rows) => rows[0]!);\n\tconst product = await db\n\t\t.insert(products)\n\t\t.values({ price: 10, stock: 10 })\n\t\t.returning()\n\t\t.then((rows) => rows[0]!);\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx\n\t\t\t.update(users)\n\t\t\t.set({ balance: user.balance - product.price })\n\t\t\t.where(eq(users.id, user.id));\n\t\tawait tx\n\t\t\t.update(products)\n\t\t\t.set({ stock: product.stock - 1 })\n\t\t\t.where(eq(products.id, product.id));\n\t});\n\n\tconst result = await db.select().from(users);\n\n\texpect(result).toEqual([{ id: 1, balance: 90 }]);\n\n\tawait db.execute(sql`drop table ${users}`);\n\tawait db.execute(sql`drop table ${products}`);\n});\n\ntest('transaction rollback', async () => {\n\tconst users = pgTable('users_transactions_rollback', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: integer('balance').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table users_transactions_rollback (id serial not null primary key, balance integer not null)`,\n\t);\n\n\tawait expect(\n\t\tdb.transaction(async (tx) => {\n\t\t\tawait tx.insert(users).values({ balance: 100 });\n\t\t\ttx.rollback();\n\t\t}),\n\t).rejects.toThrowError(TransactionRollbackError);\n\n\tconst result = await db.select().from(users);\n\n\texpect(result).toEqual([]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('nested transaction', async () => {\n\tconst users = pgTable('users_nested_transactions', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: integer('balance').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table users_nested_transactions (id serial not null primary key, balance integer not null)`,\n\t);\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.insert(users).values({ balance: 100 });\n\n\t\tawait tx.transaction(async (tx) => {\n\t\t\tawait tx.update(users).set({ balance: 200 });\n\t\t});\n\t});\n\n\tconst result = await db.select().from(users);\n\n\texpect(result).toEqual([{ id: 1, balance: 200 }]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('nested transaction rollback', async () => {\n\tconst users = pgTable('users_nested_transactions_rollback', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: integer('balance').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table users_nested_transactions_rollback (id serial not null primary key, balance integer not null)`,\n\t);\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.insert(users).values({ balance: 100 });\n\n\t\tawait expect(\n\t\t\ttx.transaction(async (tx2) => {\n\t\t\t\tawait tx2.update(users).set({ balance: 200 });\n\t\t\t\ttx2.rollback();\n\t\t\t}),\n\t\t).rejects.toThrowError(TransactionRollbackError);\n\t});\n\n\tconst result = await db.select().from(users);\n\n\texpect(result).toEqual([{ id: 1, balance: 100 }]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('select from raw sql', async () => {\n\tconst result = await db.execute(sql`select 1 as id, 'John' as name`);\n\n\texpect(result.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('select from raw sql with mapped values', async () => {\n\tconst result = await db\n\t\t.select({\n\t\t\tid: sql<number>`id`,\n\t\t\tname: sql<string>`name`,\n\t\t})\n\t\t.from(sql`(select 1 as id, 'John' as name) as users`);\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert with array values works', async () => {\n\tconst bestTexts = ['text1', 'text2', 'text3'];\n\tconst [insertResult] = await db\n\t\t.insert(usersTable)\n\t\t.values({\n\t\t\tname: 'John',\n\t\t\tbestTexts,\n\t\t})\n\t\t.returning();\n\n\texpect(insertResult?.bestTexts).toEqual(bestTexts);\n});\n\ntest('update with array values works', async () => {\n\tconst [newUser] = await db\n\t\t.insert(usersTable)\n\t\t.values({ name: 'John' })\n\t\t.returning();\n\n\tconst bestTexts = ['text4', 'text5', 'text6'];\n\tconst [insertResult] = await db\n\t\t.update(usersTable)\n\t\t.set({\n\t\t\tbestTexts,\n\t\t})\n\t\t.where(eq(usersTable.id, newUser!.id))\n\t\t.returning();\n\n\texpect(insertResult?.bestTexts).toEqual(bestTexts);\n});\n\ntest('insert with array values works', async () => {\n\tconst bestTexts = ['text1', 'text2', 'text3'];\n\tconst [insertResult] = await db\n\t\t.insert(usersTable)\n\t\t.values({\n\t\t\tname: 'John',\n\t\t\tbestTexts,\n\t\t})\n\t\t.returning();\n\n\texpect(insertResult?.bestTexts).toEqual(bestTexts);\n});\n\ntest('update with array values works', async () => {\n\tconst [newUser] = await db\n\t\t.insert(usersTable)\n\t\t.values({ name: 'John' })\n\t\t.returning();\n\n\tconst bestTexts = ['text4', 'text5', 'text6'];\n\tconst [insertResult] = await db\n\t\t.update(usersTable)\n\t\t.set({\n\t\t\tbestTexts,\n\t\t})\n\t\t.where(eq(usersTable.id, newUser!.id))\n\t\t.returning();\n\n\texpect(insertResult?.bestTexts).toEqual(bestTexts);\n});\n\ntest('insert with array values works', async () => {\n\tconst bestTexts = ['text1', 'text2', 'text3'];\n\tconst [insertResult] = await db\n\t\t.insert(usersTable)\n\t\t.values({\n\t\t\tname: 'John',\n\t\t\tbestTexts,\n\t\t})\n\t\t.returning();\n\n\texpect(insertResult?.bestTexts).toEqual(bestTexts);\n});\n\ntest('update with array values works', async () => {\n\tconst [newUser] = await db\n\t\t.insert(usersTable)\n\t\t.values({ name: 'John' })\n\t\t.returning();\n\n\tconst bestTexts = ['text4', 'text5', 'text6'];\n\tconst [insertResult] = await db\n\t\t.update(usersTable)\n\t\t.set({\n\t\t\tbestTexts,\n\t\t})\n\t\t.where(eq(usersTable.id, newUser!.id))\n\t\t.returning();\n\n\texpect(insertResult?.bestTexts).toEqual(bestTexts);\n});\n\ntest('all date and time columns', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\tdateString: date('date_string', { mode: 'string' }).notNull(),\n\t\ttime: time('time', { precision: 3 }).notNull(),\n\t\tdatetime: timestamp('datetime').notNull(),\n\t\t// datetimeWTZ: timestamp('datetime_wtz', { withTimezone: true }).notNull(),\n\t\tdatetimeString: timestamp('datetime_string', { mode: 'string' }).notNull(),\n\t\tdatetimeFullPrecision: timestamp('datetime_full_precision', {\n\t\t\tprecision: 6,\n\t\t\tmode: 'string',\n\t\t}).notNull(),\n\t\t// datetimeWTZString: timestamp('datetime_wtz_string', { withTimezone: true, mode: 'string' }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\tdate_string date not null,\n\t\t\t\t\ttime time(3) not null,\n\t\t\t\t\tdatetime timestamp not null,\n\t\t\t\t\t-- datetime_wtz timestamp with time zone not null,\n\t\t\t\t\tdatetime_string timestamp not null,\n\t\t\t\t\tdatetime_full_precision timestamp(6) not null\n\t\t\t\t\t-- datetime_wtz_string timestamp with time zone not null\n\t\t\t)\n\t`);\n\n\tconst someDatetime = new Date('2022-01-01T00:00:00.123Z');\n\tconst fullPrecision = '2022-01-01T00:00:00.123456';\n\tconst someTime = '23:23:12.432';\n\n\tawait db.insert(table).values({\n\t\tdateString: '2022-01-01',\n\t\ttime: someTime,\n\t\tdatetime: someDatetime,\n\t\t// datetimeWTZ: someDatetime,\n\t\tdatetimeString: '2022-01-01T00:00:00.123Z',\n\t\tdatetimeFullPrecision: fullPrecision,\n\t\t// datetimeWTZString: '2022-01-01T00:00:00.123Z',\n\t});\n\n\tconst result = await db.select().from(table);\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tdateString: string;\n\t\t\t\ttime: string;\n\t\t\t\tdatetime: Date;\n\t\t\t\t// datetimeWTZ: Date;\n\t\t\t\tdatetimeString: string;\n\t\t\t\tdatetimeFullPrecision: string;\n\t\t\t\t// datetimeWTZString: string;\n\t\t\t}[],\n\t\t\ttypeof result\n\t\t>\n\t>;\n\n\tExpect<\n\t\tEqual<\n\t\t\t{\n\t\t\t\tdateString: string;\n\t\t\t\ttime: string;\n\t\t\t\tdatetime: Date;\n\t\t\t\t// datetimeWTZ: Date;\n\t\t\t\tdatetimeString: string;\n\t\t\t\tdatetimeFullPrecision: string;\n\t\t\t\t// datetimeWTZString: string;\n\t\t\t\tid?: number | undefined;\n\t\t\t},\n\t\t\ttypeof table.$inferInsert\n\t\t>\n\t>;\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\tdateString: '2022-01-01',\n\t\t\ttime: someTime,\n\t\t\tdatetime: someDatetime,\n\t\t\t// datetimeWTZ: someDatetime,\n\t\t\tdatetimeString: '2022-01-01 00:00:00.123',\n\t\t\tdatetimeFullPrecision: fullPrecision.replace('T', ' ').replace('Z', ''),\n\t\t\t// datetimeWTZString: '2022-01-01 00:00:00.123+00',\n\t\t},\n\t]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest.skip('all date and time columns with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', {\n\t\t\tmode: 'string',\n\t\t\twithTimezone: true,\n\t\t\tprecision: 6,\n\t\t}).notNull(),\n\t\ttimestampAsDate: timestamp('timestamp_date', {\n\t\t\twithTimezone: true,\n\t\t\tprecision: 3,\n\t\t}).notNull(),\n\t\ttimestampTimeZones: timestamp('timestamp_date_2', {\n\t\t\twithTimezone: true,\n\t\t\tprecision: 3,\n\t\t}).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null,\n\t\t\t\t\ttimestamp_date timestamp(3) with time zone not null,\n\t\t\t\t\ttimestamp_date_2 timestamp(3) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\tconst timestampDate = new Date();\n\tconst timestampDateWTZ = new Date('2022-01-01 00:00:00.123 +0500');\n\n\tconst timestampString2 = '2022-01-01 00:00:00.123456-0400';\n\tconst timestampDate2 = new Date();\n\tconst timestampDateWTZ2 = new Date('2022-01-01 00:00:00.123 +0200');\n\n\tawait db.insert(table).values([\n\t\t{\n\t\t\ttimestamp: timestampString,\n\t\t\ttimestampAsDate: timestampDate,\n\t\t\ttimestampTimeZones: timestampDateWTZ,\n\t\t},\n\t\t{\n\t\t\ttimestamp: timestampString2,\n\t\t\ttimestampAsDate: timestampDate2,\n\t\t\ttimestampTimeZones: timestampDateWTZ2,\n\t\t},\n\t]);\n\n\tconst result = await db.select().from(table);\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t\ttimestamp_date: string;\n\t\ttimestamp_date_2: string;\n\t}>(sql`select * from ${table}`);\n\n\t// Whatever you put in, you get back when you're using the date mode\n\t// But when using the string mode, postgres returns a string transformed into UTC\n\texpect(result).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\ttimestamp: '2022-01-01 02:00:00.123456+00',\n\t\t\ttimestampAsDate: timestampDate,\n\t\t\ttimestampTimeZones: timestampDateWTZ,\n\t\t},\n\t\t{\n\t\t\tid: 2,\n\t\t\ttimestamp: '2022-01-01 04:00:00.123456+00',\n\t\t\ttimestampAsDate: timestampDate2,\n\t\t\ttimestampTimeZones: timestampDateWTZ2,\n\t\t},\n\t]);\n\n\texpect(result2.rows).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\ttimestamp_string: '2022-01-01 02:00:00.123456+00',\n\t\t\ttimestamp_date: timestampDate.toISOString().replace('T', ' ').replace('Z', '') + '+00',\n\t\t\ttimestamp_date_2: timestampDateWTZ.toISOString().replace('T', ' ').replace('Z', '')\n\t\t\t\t+ '+00',\n\t\t},\n\t\t{\n\t\t\tid: 2,\n\t\t\ttimestamp_string: '2022-01-01 04:00:00.123456+00',\n\t\t\ttimestamp_date: timestampDate2.toISOString().replace('T', ' ').replace('Z', '') + '+00',\n\t\t\ttimestamp_date_2: timestampDateWTZ2.toISOString().replace('T', ' ').replace('Z', '')\n\t\t\t\t+ '+00',\n\t\t},\n\t]);\n\n\texpect(result[0]?.timestampTimeZones.getTime()).toEqual(\n\t\tnew Date((result2.rows?.[0] as any).timestamp_date_2 as any).getTime(),\n\t);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestampString: timestamp('timestamp_string', {\n\t\t\tmode: 'string',\n\t\t\tprecision: 6,\n\t\t}).notNull(),\n\t\ttimestampString2: timestamp('timestamp_string2', {\n\t\t\tprecision: 3,\n\t\t\tmode: 'string',\n\t\t}).notNull(),\n\t\ttimestampDate: timestamp('timestamp_date', { precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null,\n\t\t\t\t\ttimestamp_string2 timestamp(3) not null,\n\t\t\t\t\ttimestamp_date timestamp(3) not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456';\n\t// const timestampString2 = '2022-01-02 00:00:00.123 -0300';\n\tconst timestampString2 = '2022-01-02 00:00:00.123';\n\tconst timestampDate = new Date('2022-01-01 00:00:00.123Z');\n\n\tconst timestampString_2 = '2022-01-01 00:00:00.123456';\n\t// const timestampString2_2 = '2022-01-01 00:00:00.123 -0300';\n\tconst timestampString2_2 = '2022-01-01 00:00:00.123';\n\t// const timestampDate2 = new Date('2022-01-01 00:00:00.123 +0200');\n\tconst timestampDate2 = new Date('2022-01-01 00:00:00.123');\n\n\tawait db.insert(table).values([\n\t\t{ timestampString, timestampString2, timestampDate },\n\t\t{\n\t\t\ttimestampString: timestampString_2,\n\t\t\ttimestampString2: timestampString2_2,\n\t\t\ttimestampDate: timestampDate2,\n\t\t},\n\t]);\n\n\tconst result = await db.select().from(table);\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t\ttimestamp_string2: string;\n\t\ttimestamp_date: string;\n\t}>(sql`select * from ${table}`);\n\n\t// Whatever you put in, you get back when you're using the date mode\n\t// But when using the string mode, postgres returns a string transformed into UTC\n\texpect(result).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\ttimestampString: timestampString,\n\t\t\ttimestampString2: '2022-01-02 00:00:00.123',\n\t\t\ttimestampDate: timestampDate,\n\t\t},\n\t\t{\n\t\t\tid: 2,\n\t\t\ttimestampString: timestampString_2,\n\t\t\ttimestampString2: '2022-01-01 00:00:00.123',\n\t\t\ttimestampDate: timestampDate2,\n\t\t},\n\t]);\n\n\texpect(result2.rows).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\ttimestamp_string: timestampString,\n\t\t\ttimestamp_string2: '2022-01-02 00:00:00.123',\n\t\t\ttimestamp_date: timestampDate\n\t\t\t\t.toISOString()\n\t\t\t\t.replace('T', ' ')\n\t\t\t\t.replace('Z', ''),\n\t\t},\n\t\t{\n\t\t\tid: 2,\n\t\t\ttimestamp_string: timestampString_2,\n\t\t\ttimestamp_string2: '2022-01-01 00:00:00.123',\n\t\t\ttimestamp_date: timestampDate2\n\t\t\t\t.toISOString()\n\t\t\t\t.replace('T', ' ')\n\t\t\t\t.replace('Z', ''),\n\t\t},\n\t]);\n\n\texpect((result2.rows?.[0] as any).timestamp_string).toEqual(\n\t\t'2022-01-01 00:00:00.123456',\n\t);\n\t// need to add the 'Z', otherwise javascript assumes it's in local time\n\texpect(\n\t\tnew Date(((result2.rows?.[0] as any).timestamp_date + 'Z') as any).getTime(),\n\t).toEqual(timestampDate.getTime());\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('Typehints mix for RQB', async () => {\n\tconst uuid = 'd997d46d-5769-4c78-9a35-93acadbe6076';\n\n\tconst res = await db.query.user.findMany({\n\t\twhere: eq(user.id, uuid),\n\t\twith: {\n\t\t\ttodos: {\n\t\t\t\twith: {\n\t\t\t\t\ttodo: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpect(res).toStrictEqual([]);\n});\n\ntest('Typehints mix for findFirst', async () => {\n\tconst uuid = 'd997d46d-5769-4c78-9a35-93acadbe6076';\n\n\tawait db.insert(user).values({ id: uuid, email: 'd' });\n\n\tconst res = await db.query.user.findFirst({\n\t\twhere: eq(user.id, uuid),\n\t});\n\n\texpect(res).toStrictEqual({ id: 'd997d46d-5769-4c78-9a35-93acadbe6076', email: 'd' });\n});\n\nafterAll(async () => {\n\tawait db.execute(sql`drop table if exists \"users\"`);\n\tawait db.execute(sql`drop table if exists \"todo_user\"`);\n\tawait db.execute(sql`drop table if exists \"user\"`);\n\tawait db.execute(sql`drop table if exists \"todo\"`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n});\n"
  },
  {
    "path": "integration-tests/tests/pg/neon-http-batch.test.ts",
    "content": "import { neon, type NeonQueryFunction } from '@neondatabase/serverless';\nimport { drizzle, type NeonHttpDatabase } from 'drizzle-orm/neon-http';\nimport { beforeAll, beforeEach, expect, test } from 'vitest';\nimport {\n\tcommentLikesConfig,\n\tcommentsConfig,\n\tcommentsTable,\n\tgroupsConfig,\n\tgroupsTable,\n\tpostsConfig,\n\tpostsTable,\n\tusersConfig,\n\tusersTable,\n\tusersToGroupsConfig,\n\tusersToGroupsTable,\n} from './neon-http-batch';\nimport { TestCache, TestGlobalCache } from './pg-common-cache';\n\nconst ENABLE_LOGGING = false;\n\nexport const schema = {\n\tusersTable,\n\tpostsTable,\n\tcommentsTable,\n\tusersToGroupsTable,\n\tgroupsTable,\n\tcommentLikesConfig,\n\tcommentsConfig,\n\tpostsConfig,\n\tusersToGroupsConfig,\n\tgroupsConfig,\n\tusersConfig,\n};\n\nlet db: NeonHttpDatabase<typeof schema>;\nlet client: NeonQueryFunction<false, true>;\nlet dbGlobalCached: NeonHttpDatabase;\nlet cachedDb: NeonHttpDatabase;\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['NEON_HTTP_CONNECTION_STRING'];\n\tif (!connectionString) {\n\t\tthrow new Error('NEON_HTTP_CONNECTION_STRING is not defined');\n\t}\n\tclient = neon(connectionString);\n\tdb = drizzle(client, { schema, logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(client, {\n\t\tlogger: ENABLE_LOGGING,\n\t\tcache: new TestCache(),\n\t});\n\tdbGlobalCached = drizzle(client, {\n\t\tlogger: ENABLE_LOGGING,\n\t\tcache: new TestGlobalCache(),\n\t});\n});\n\nbeforeEach((ctx) => {\n\tctx.neonPg = {\n\t\tdb,\n\t};\n\tctx.cachedPg = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ntest('skip', async () => {\n\texpect(1).toBe(1);\n});\n"
  },
  {
    "path": "integration-tests/tests/pg/neon-http-batch.ts",
    "content": "import Docker from 'dockerode';\nimport type { InferSelectModel } from 'drizzle-orm';\nimport { eq, relations, sql } from 'drizzle-orm';\nimport type { NeonHttpQueryResult } from 'drizzle-orm/neon-http';\nimport { integer, pgTable, primaryKey, serial, text, timestamp } from 'drizzle-orm/pg-core';\nimport type { AnyPgColumn } from 'drizzle-orm/pg-core';\nimport getPort from 'get-port';\nimport { v4 as uuidV4 } from 'uuid';\nimport { afterAll, beforeEach, describe, expect, expectTypeOf, test } from 'vitest';\n\nexport const usersTable = pgTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: integer('verified').notNull().default(0),\n\tinvitedBy: integer('invited_by').references((): AnyPgColumn => usersTable.id),\n});\nexport const usersConfig = relations(usersTable, ({ one, many }) => ({\n\tinvitee: one(usersTable, {\n\t\tfields: [usersTable.invitedBy],\n\t\treferences: [usersTable.id],\n\t}),\n\tusersToGroups: many(usersToGroupsTable),\n\tposts: many(postsTable),\n}));\n\nexport const groupsTable = pgTable('groups', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tdescription: text('description'),\n});\nexport const groupsConfig = relations(groupsTable, ({ many }) => ({\n\tusersToGroups: many(usersToGroupsTable),\n}));\n\nexport const usersToGroupsTable = pgTable(\n\t'users_to_groups',\n\t{\n\t\tid: serial('id'),\n\t\tuserId: integer('user_id').notNull().references(() => usersTable.id),\n\t\tgroupId: integer('group_id').notNull().references(() => groupsTable.id),\n\t},\n\t(t) => ({\n\t\tpk: primaryKey({ columns: [t.userId, t.groupId] }),\n\t}),\n);\nexport const usersToGroupsConfig = relations(usersToGroupsTable, ({ one }) => ({\n\tgroup: one(groupsTable, {\n\t\tfields: [usersToGroupsTable.groupId],\n\t\treferences: [groupsTable.id],\n\t}),\n\tuser: one(usersTable, {\n\t\tfields: [usersToGroupsTable.userId],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n\nexport const postsTable = pgTable('posts', {\n\tid: serial('id').primaryKey(),\n\tcontent: text('content').notNull(),\n\townerId: integer('owner_id').references(() => usersTable.id),\n\tcreatedAt: timestamp('created_at').notNull().defaultNow(),\n});\nexport const postsConfig = relations(postsTable, ({ one, many }) => ({\n\tauthor: one(usersTable, {\n\t\tfields: [postsTable.ownerId],\n\t\treferences: [usersTable.id],\n\t}),\n\tcomments: many(commentsTable),\n}));\n\nexport const commentsTable = pgTable('comments', {\n\tid: serial('id').primaryKey(),\n\tcontent: text('content').notNull(),\n\tcreator: integer('creator').references(() => usersTable.id),\n\tpostId: integer('post_id').references(() => postsTable.id),\n\tcreatedAt: timestamp('created_at').notNull().defaultNow(),\n});\nexport const commentsConfig = relations(commentsTable, ({ one, many }) => ({\n\tpost: one(postsTable, {\n\t\tfields: [commentsTable.postId],\n\t\treferences: [postsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentsTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n\tlikes: many(commentLikesTable),\n}));\n\nexport const commentLikesTable = pgTable('comment_likes', {\n\tid: serial('id').primaryKey(),\n\tcreator: integer('creator').references(() => usersTable.id),\n\tcommentId: integer('comment_id').references(() => commentsTable.id),\n\tcreatedAt: timestamp('created_at').notNull().defaultNow(),\n});\nexport const commentLikesConfig = relations(commentLikesTable, ({ one }) => ({\n\tcomment: one(commentsTable, {\n\t\tfields: [commentLikesTable.commentId],\n\t\treferences: [commentsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentLikesTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n\nlet pgContainer: Docker.Container;\nexport async function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 5432 });\n\tconst image = 'postgres:14';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tpgContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['POSTGRES_PASSWORD=postgres', 'POSTGRES_USER=postgres', 'POSTGRES_DB=postgres'],\n\t\tname: `drizzle-integration-tests-${uuidV4()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5432/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait pgContainer.start();\n\n\treturn `postgres://postgres:postgres@localhost:${port}/postgres`;\n}\n\nafterAll(async () => {\n\tawait pgContainer?.stop().catch(console.error);\n});\n\nexport function tests() {\n\tdescribe('common', () => {\n\t\tbeforeEach(async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\t\t\tawait db.execute(sql`drop schema if exists public cascade`);\n\t\t\tawait db.execute(sql`drop schema if exists mySchema cascade`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users (\n\t\t\t\t\t    id serial primary key,\n\t\t\t\t\t    name text not null,\n\t\t\t\t\t    verified int not null default 0,\n\t\t\t\t\t    invited_by int references users(id)\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table groups (\n\t\t\t\t\t    id serial primary key,\n\t\t\t\t\t    name text not null,\n\t\t\t\t\t    description text\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users_to_groups (\n\t\t\t\t\t    id serial,\n\t\t\t\t\t    user_id int not null references users(id),\n\t\t\t\t\t    group_id int not null references groups(id),\n\t\t\t\t\t    primary key (user_id, group_id)\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table posts (\n\t\t\t\t\t    id serial primary key,\n\t\t\t\t\t    content text not null,\n\t\t\t\t\t    owner_id int references users(id),\n\t\t\t\t\t    created_at timestamp not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table comments (\n\t\t\t\t\t    id serial primary key,\n\t\t\t\t\t    content text not null,\n\t\t\t\t\t    creator int references users(id),\n\t\t\t\t\t    post_id int references posts(id),\n\t\t\t\t\t    created_at timestamp not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table comment_likes (\n\t\t\t\t\t    id serial primary key,\n\t\t\t\t\t    creator int references users(id),\n\t\t\t\t\t    comment_id int references comments(id),\n\t\t\t\t\t    created_at timestamp not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t});\n\n\t\ttest('batch api example', async (ctx) => {\n\t\t\tconst { db } = ctx.neonPg;\n\n\t\t\tconst batchResponse = await db.batch([\n\t\t\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tinvitedBy: usersTable.invitedBy,\n\t\t\t\t}),\n\t\t\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\t\t\tdb.select().from(usersTable),\n\t\t\t]);\n\n\t\t\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t}[],\n\t\t\t\tNeonHttpQueryResult<never>,\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t}[],\n\t\t\t]>();\n\n\t\t\texpect(batchResponse.length).eq(3);\n\n\t\t\texpect(batchResponse[0]).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t\tinvitedBy: null,\n\t\t\t}]);\n\n\t\t\texpect(batchResponse[1]).toMatchObject({ rows: [], rowCount: 1 });\n\n\t\t\texpect(batchResponse[2]).toEqual([\n\t\t\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t\t\t]);\n\t\t});\n\n\t\t// batch api only relational many\n\t\ttest('insert + findMany', async (ctx) => {\n\t\t\tconst { db } = ctx.neonPg;\n\n\t\t\tconst batchResponse = await db.batch([\n\t\t\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\t\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\t\t\tdb.query.usersTable.findMany({}),\n\t\t\t]);\n\n\t\t\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t}[],\n\t\t\t\tNeonHttpQueryResult<never>,\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t}[],\n\t\t\t]>();\n\n\t\t\texpect(batchResponse.length).eq(3);\n\n\t\t\texpect(batchResponse[0]).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t}]);\n\n\t\t\texpect(batchResponse[1]).toMatchObject({ rows: [], rowCount: 1 });\n\n\t\t\texpect(batchResponse[2]).toEqual([\n\t\t\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t\t\t]);\n\t\t});\n\n\t\t// batch api relational many + one\n\t\ttest('insert + findMany + findFirst', async (ctx) => {\n\t\t\tconst { db } = ctx.neonPg;\n\n\t\t\tconst batchResponse = await db.batch([\n\t\t\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\t\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\t\t\tdb.query.usersTable.findMany({}),\n\t\t\t\tdb.query.usersTable.findFirst({}),\n\t\t\t]);\n\n\t\t\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t}[],\n\t\t\t\tNeonHttpQueryResult<never>,\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t}[],\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | undefined,\n\t\t\t]>();\n\n\t\t\texpect(batchResponse.length).eq(4);\n\n\t\t\texpect(batchResponse[0]).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t}]);\n\n\t\t\texpect(batchResponse[1]).toMatchObject({ rows: [], rowCount: 1 });\n\n\t\t\texpect(batchResponse[2]).toEqual([\n\t\t\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t\t\t]);\n\n\t\t\texpect(batchResponse[3]).toEqual(\n\t\t\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t\t);\n\t\t});\n\n\t\ttest('insert + db.execute', async (ctx) => {\n\t\t\tconst { db } = ctx.neonPg;\n\n\t\t\tconst batchResponse = await db.batch([\n\t\t\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\t\t\tdb.execute(sql`insert into users (id, name) values (2, 'Dan')`),\n\t\t\t]);\n\n\t\t\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t}[],\n\t\t\t\tNeonHttpQueryResult<Record<string, unknown>>,\n\t\t\t]>();\n\n\t\t\texpect(batchResponse.length).eq(2);\n\n\t\t\texpect(batchResponse[0]).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t}]);\n\n\t\t\texpect(batchResponse[1]).toMatchObject({ rowAsArray: false, rows: [], rowCount: 1 });\n\t\t});\n\n\t\t// batch api combined rqb + raw call\n\t\ttest('insert + findManyWith + db.all', async (ctx) => {\n\t\t\tconst { db } = ctx.neonPg;\n\n\t\t\tconst batchResponse = await db.batch([\n\t\t\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\t\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\t\t\tdb.query.usersTable.findMany({}),\n\t\t\t\tdb.execute<typeof usersTable.$inferSelect>(sql`select * from users`),\n\t\t\t]);\n\n\t\t\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t}[],\n\t\t\t\tNeonHttpQueryResult<never>,\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t}[],\n\t\t\t\tNeonHttpQueryResult<{\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t}>,\n\t\t\t]>();\n\n\t\t\texpect(batchResponse.length).eq(4);\n\n\t\t\texpect(batchResponse[0]).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t}]);\n\n\t\t\texpect(batchResponse[1]).toMatchObject({ rowAsArray: true, rows: [], rowCount: 1 });\n\n\t\t\texpect(batchResponse[2]).toEqual([\n\t\t\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t\t\t]);\n\n\t\t\texpect(batchResponse[3]).toMatchObject({\n\t\t\t\trows: [\n\t\t\t\t\t{ id: 1, name: 'John', verified: 0, invited_by: null },\n\t\t\t\t\t{ id: 2, name: 'Dan', verified: 0, invited_by: null },\n\t\t\t\t],\n\t\t\t});\n\t\t});\n\n\t\t// batch api for insert + update + select\n\t\ttest('insert + update + select + select partial', async (ctx) => {\n\t\t\tconst { db } = ctx.neonPg;\n\n\t\t\tconst batchResponse = await db.batch([\n\t\t\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\t\t\tdb.update(usersTable).set({ name: 'Dan' }).where(eq(usersTable.id, 1)),\n\t\t\t\tdb.query.usersTable.findMany({}),\n\t\t\t\tdb.select().from(usersTable).where(eq(usersTable.id, 1)),\n\t\t\t\tdb.select({ id: usersTable.id, invitedBy: usersTable.invitedBy }).from(usersTable),\n\t\t\t]);\n\n\t\t\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t}[],\n\t\t\t\tNeonHttpQueryResult<never>,\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t}[],\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t}[],\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t}[],\n\t\t\t]>();\n\n\t\t\texpect(batchResponse.length).eq(5);\n\n\t\t\texpect(batchResponse[0]).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t}]);\n\n\t\t\texpect(batchResponse[1]).toMatchObject({ rows: [], rowCount: 1 });\n\n\t\t\texpect(batchResponse[2]).toEqual([\n\t\t\t\t{ id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\t\t]);\n\n\t\t\texpect(batchResponse[3]).toEqual([\n\t\t\t\t{ id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\t\t]);\n\n\t\t\texpect(batchResponse[4]).toEqual([\n\t\t\t\t{ id: 1, invitedBy: null },\n\t\t\t]);\n\t\t});\n\n\t\t// batch api for insert + delete + select\n\t\ttest('insert + delete + select + select partial', async (ctx) => {\n\t\t\tconst { db } = ctx.neonPg;\n\n\t\t\tconst batchResponse = await db.batch([\n\t\t\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\t\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\t\t\tdb.delete(usersTable).where(eq(usersTable.id, 1)).returning({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tinvitedBy: usersTable.invitedBy,\n\t\t\t\t}),\n\t\t\t\tdb.query.usersTable.findFirst({\n\t\t\t\t\tcolumns: {\n\t\t\t\t\t\tid: true,\n\t\t\t\t\t\tinvitedBy: true,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t]);\n\n\t\t\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t}[],\n\t\t\t\tNeonHttpQueryResult<never>,\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t}[],\n\t\t\t\t{\n\t\t\t\t\tid: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | undefined,\n\t\t\t]>();\n\n\t\t\texpect(batchResponse.length).eq(4);\n\n\t\t\texpect(batchResponse[0]).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t}]);\n\n\t\t\texpect(batchResponse[1]).toMatchObject({ rows: [], rowCount: 1 });\n\n\t\t\texpect(batchResponse[2]).toEqual([\n\t\t\t\t{ id: 1, invitedBy: null },\n\t\t\t]);\n\n\t\t\texpect(batchResponse[3]).toEqual(\n\t\t\t\t{ id: 2, invitedBy: null },\n\t\t\t);\n\t\t});\n\n\t\ttest('select raw', async (ctx) => {\n\t\t\tconst { db } = ctx.neonPg;\n\n\t\t\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Dan' }]);\n\t\t\tconst batchResponse = await db.batch([\n\t\t\t\tdb.execute<InferSelectModel<typeof usersTable, { dbColumnNames: true }>>(sql`select * from users`),\n\t\t\t\tdb.execute<InferSelectModel<typeof usersTable, { dbColumnNames: true }>>(sql`select * from users where id = 1`),\n\t\t\t]);\n\n\t\t\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t\t\tNeonHttpQueryResult<{\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvited_by: number | null;\n\t\t\t\t}>,\n\t\t\t\tNeonHttpQueryResult<{\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvited_by: number | null;\n\t\t\t\t}>,\n\t\t\t]>();\n\n\t\t\texpect(batchResponse.length).eq(2);\n\n\t\t\texpect(batchResponse[0]).toMatchObject({\n\t\t\t\trows: [\n\t\t\t\t\t{ id: 1, name: 'John', verified: 0, invited_by: null },\n\t\t\t\t\t{ id: 2, name: 'Dan', verified: 0, invited_by: null },\n\t\t\t\t],\n\t\t\t});\n\n\t\t\texpect(batchResponse[1]).toMatchObject({\n\t\t\t\trows: [\n\t\t\t\t\t{ id: 1, name: 'John', verified: 0, invited_by: null },\n\t\t\t\t],\n\t\t\t});\n\t\t});\n\t});\n}\n"
  },
  {
    "path": "integration-tests/tests/pg/neon-http.test.ts",
    "content": "import { neon, neonConfig, type NeonQueryFunction } from '@neondatabase/serverless';\nimport { eq, sql } from 'drizzle-orm';\nimport { drizzle, type NeonHttpDatabase } from 'drizzle-orm/neon-http';\nimport { migrate } from 'drizzle-orm/neon-http/migrator';\nimport { pgMaterializedView, pgTable, serial, timestamp } from 'drizzle-orm/pg-core';\nimport { beforeAll, beforeEach, describe, expect, test, vi } from 'vitest';\nimport { skipTests } from '~/common';\nimport { randomString } from '~/utils';\nimport { tests, usersMigratorTable, usersTable } from './pg-common';\nimport { TestCache, TestGlobalCache, tests as cacheTests } from './pg-common-cache';\n\nconst ENABLE_LOGGING = false;\n\nlet db: NeonHttpDatabase;\nlet dbGlobalCached: NeonHttpDatabase;\nlet cachedDb: NeonHttpDatabase;\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['NEON_HTTP_CONNECTION_STRING'];\n\tif (!connectionString) {\n\t\tthrow new Error('NEON_CONNECTION_STRING is not defined');\n\t}\n\n\tneonConfig.fetchEndpoint = (host) => {\n\t\tconst [protocol, port] = host === 'db.localtest.me' ? ['http', 4444] : ['https', 443];\n\t\treturn `${protocol}://${host}:${port}/sql`;\n\t};\n\tconst client = neon(connectionString);\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(client, {\n\t\tlogger: ENABLE_LOGGING,\n\t\tcache: new TestCache(),\n\t});\n\tdbGlobalCached = drizzle(client, {\n\t\tlogger: ENABLE_LOGGING,\n\t\tcache: new TestGlobalCache(),\n\t});\n});\n\nbeforeEach((ctx) => {\n\tctx.pg = {\n\t\tdb,\n\t};\n\tctx.cachedPg = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ntest('migrator : default migration strategy', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom schema', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg', migrationsSchema: 'custom_migrations' });\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(sql`select * from custom_migrations.\"__drizzle_migrations\";`);\n\texpect(rowCount && rowCount > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table custom_migrations.\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg', migrationsTable: customTable });\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(sql`select * from \"drizzle\".${sql.identifier(customTable)};`);\n\texpect(rowCount && rowCount > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".${sql.identifier(customTable)}`);\n});\n\ntest('migrator : migrate with custom table and custom schema', async () => {\n\tconst customTable = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, {\n\t\tmigrationsFolder: './drizzle2/pg',\n\t\tmigrationsTable: customTable,\n\t\tmigrationsSchema: 'custom_migrations',\n\t});\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(\n\t\tsql`select * from custom_migrations.${sql.identifier(customTable)};`,\n\t);\n\texpect(rowCount && rowCount > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table custom_migrations.${sql.identifier(customTable)}`);\n});\n\ntest('all date and time columns without timezone first case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format without timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01 02:00:00.123456' },\n\t]);\n\n\t// 2, Select in string format and check that values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456' }]);\n\n\t// 3. Select as raw query and check that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone second case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01T02:00:00.123456-02' },\n\t]);\n\n\t// 2, Select as raw query and check that values are the same\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone third case mode date', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) not null\n\t\t\t)\n\t`);\n\n\tconst insertedDate = new Date('2022-01-01 20:00:00.123+04');\n\n\t// 1. Insert date as new date\n\tawait db.insert(table).values([\n\t\t{ timestamp: insertedDate },\n\t]);\n\n\t// 2, Select as raw query as string\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3. Compare both dates using orm mapping - Need to add 'Z' to tell JS that it is UTC\n\texpect(new Date(result.rows[0]!.timestamp_string + 'Z').getTime()).toBe(insertedDate.getTime());\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode date for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', withTimezone: true, precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = new Date('2022-01-01 00:00:00.456-0200');\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: timestampString }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone in UTC timezone', async () => {\n\t// get current timezone from db\n\tconst timezone = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to UTC\n\tawait db.execute(sql`set time zone 'UTC'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone.rows[0]!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest.skip('test mode string for timestamp with timezone in different timezone', async () => {\n\t// get current timezone from db\n\tconst timezone = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to HST (UTC - 10)\n\tawait db.execute(sql`set time zone 'HST'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-1000';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 00:00:00.123456-10' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 00:00:00.123456+00' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone.rows[0]!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\nskipTests([\n\t'migrator : default migration strategy',\n\t'migrator : migrate with custom schema',\n\t'migrator : migrate with custom table',\n\t'migrator : migrate with custom table and custom schema',\n\t'insert via db.execute + select via db.execute',\n\t'insert via db.execute + returning',\n\t'insert via db.execute w/ query builder',\n\t'all date and time columns without timezone first case mode string',\n\t'all date and time columns without timezone third case mode date',\n\t'test mode string for timestamp with timezone',\n\t'test mode date for timestamp with timezone',\n\t'test mode string for timestamp with timezone in UTC timezone',\n\t'nested transaction rollback',\n\t'transaction rollback',\n\t'nested transaction',\n\t'transaction',\n\t'timestamp timezone',\n\t'test $onUpdateFn and $onUpdate works as $default',\n]);\ntests();\ncacheTests();\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop schema if exists public cascade`);\n\tawait db.execute(sql`create schema public`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified boolean not null default false,\n\t\t\t\tjsonb jsonb,\n\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t)\n\t\t`,\n\t);\n});\n\ntest('insert via db.execute + select via db.execute', async () => {\n\tawait db.execute(\n\t\tsql`insert into ${usersTable} (${sql.identifier(usersTable.name.name)}) values (${'John'})`,\n\t);\n\n\tconst result = await db.execute<{ id: number; name: string }>(\n\t\tsql`select id, name from \"users\"`,\n\t);\n\texpect(result.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute + returning', async () => {\n\tconst inserted = await db.execute<{ id: number; name: string }>(\n\t\tsql`insert into ${usersTable} (${\n\t\t\tsql.identifier(\n\t\t\t\tusersTable.name.name,\n\t\t\t)\n\t\t}) values (${'John'}) returning ${usersTable.id}, ${usersTable.name}`,\n\t);\n\texpect(inserted.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async () => {\n\tconst inserted = await db.execute<Pick<typeof usersTable.$inferSelect, 'id' | 'name'>>(\n\t\tdb\n\t\t\t.insert(usersTable)\n\t\t\t.values({ name: 'John' })\n\t\t\t.returning({ id: usersTable.id, name: usersTable.name }),\n\t);\n\texpect(inserted.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ndescribe('$withAuth tests', (it) => {\n\tconst client = vi.fn();\n\tconst db = drizzle({\n\t\tclient: client as any as NeonQueryFunction<any, any>,\n\t\tschema: {\n\t\t\tusersTable,\n\t\t},\n\t});\n\n\tit('$count', async () => {\n\t\tawait db.$withAuth('$count').$count(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]).toStrictEqual({ arrayMode: false, fullResults: true, authToken: '$count' });\n\t});\n\n\tit('delete', async () => {\n\t\tawait db.$withAuth('delete').delete(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]).toStrictEqual({ arrayMode: false, fullResults: true, authToken: 'delete' });\n\t});\n\n\tit('select', async () => {\n\t\tawait db.$withAuth('select').select().from(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]).toStrictEqual({ arrayMode: true, fullResults: true, authToken: 'select' });\n\t});\n\n\tit('selectDistinct', async () => {\n\t\tawait db.$withAuth('selectDistinct').selectDistinct().from(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]).toStrictEqual({\n\t\t\tarrayMode: true,\n\t\t\tfullResults: true,\n\t\t\tauthToken: 'selectDistinct',\n\t\t});\n\t});\n\n\tit('selectDistinctOn', async () => {\n\t\tawait db.$withAuth('selectDistinctOn').selectDistinctOn([usersTable.name]).from(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]).toStrictEqual({\n\t\t\tarrayMode: true,\n\t\t\tfullResults: true,\n\t\t\tauthToken: 'selectDistinctOn',\n\t\t});\n\t});\n\n\tit('update', async () => {\n\t\tawait db.$withAuth('update').update(usersTable).set({\n\t\t\tname: 'CHANGED',\n\t\t}).where(eq(usersTable.name, 'TARGET')).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]).toStrictEqual({ arrayMode: false, fullResults: true, authToken: 'update' });\n\t});\n\n\tit('insert', async () => {\n\t\tawait db.$withAuth('insert').insert(usersTable).values({\n\t\t\tname: 'WITHAUTHUSER',\n\t\t}).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]).toStrictEqual({ arrayMode: false, fullResults: true, authToken: 'insert' });\n\t});\n\n\tit('with', async () => {\n\t\tawait db.$withAuth('with').with(db.$with('WITH').as((qb) => qb.select().from(usersTable))).select().from(usersTable)\n\t\t\t.catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]).toStrictEqual({ arrayMode: true, fullResults: true, authToken: 'with' });\n\t});\n\n\tit('rqb', async () => {\n\t\tawait db.$withAuth('rqb').query.usersTable.findFirst().catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]).toStrictEqual({ arrayMode: true, fullResults: true, authToken: 'rqb' });\n\t});\n\n\tit('exec', async () => {\n\t\tawait db.$withAuth('exec').execute(`SELECT 1`).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]).toStrictEqual({ arrayMode: false, fullResults: true, authToken: 'exec' });\n\t});\n\n\tit('prepared', async () => {\n\t\tconst prep = db.$withAuth('prepared').select().from(usersTable).prepare('withAuthPrepared');\n\n\t\tawait prep.execute().catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]).toStrictEqual({ arrayMode: true, fullResults: true, authToken: 'prepared' });\n\t});\n\n\tit('refreshMaterializedView', async () => {\n\t\tconst johns = pgMaterializedView('johns')\n\t\t\t.as((qb) => qb.select().from(usersTable).where(eq(usersTable.name, 'John')));\n\n\t\tawait db.$withAuth('refreshMaterializedView').refreshMaterializedView(johns);\n\n\t\texpect(client.mock.lastCall?.[2]).toStrictEqual({\n\t\t\tarrayMode: false,\n\t\t\tfullResults: true,\n\t\t\tauthToken: 'refreshMaterializedView',\n\t\t});\n\t});\n});\n\ndescribe('$withAuth callback tests', (it) => {\n\tconst client = vi.fn();\n\tconst db = drizzle({\n\t\tclient: client as any as NeonQueryFunction<any, any>,\n\t\tschema: {\n\t\t\tusersTable,\n\t\t},\n\t});\n\tconst auth = (token: string) => () => token;\n\n\tit('$count', async () => {\n\t\tawait db.$withAuth(auth('$count')).$count(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toStrictEqual('$count');\n\t});\n\n\tit('delete', async () => {\n\t\tawait db.$withAuth(auth('delete')).delete(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toStrictEqual('delete');\n\t});\n\n\tit('select', async () => {\n\t\tawait db.$withAuth(auth('select')).select().from(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toStrictEqual('select');\n\t});\n\n\tit('selectDistinct', async () => {\n\t\tawait db.$withAuth(auth('selectDistinct')).selectDistinct().from(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toStrictEqual('selectDistinct');\n\t});\n\n\tit('selectDistinctOn', async () => {\n\t\tawait db.$withAuth(auth('selectDistinctOn')).selectDistinctOn([usersTable.name]).from(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toStrictEqual('selectDistinctOn');\n\t});\n\n\tit('update', async () => {\n\t\tawait db.$withAuth(auth('update')).update(usersTable).set({\n\t\t\tname: 'CHANGED',\n\t\t}).where(eq(usersTable.name, 'TARGET')).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toStrictEqual('update');\n\t});\n\n\tit('insert', async () => {\n\t\tawait db.$withAuth(auth('insert')).insert(usersTable).values({\n\t\t\tname: 'WITHAUTHUSER',\n\t\t}).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toStrictEqual('insert');\n\t});\n\n\tit('with', async () => {\n\t\tawait db.$withAuth(auth('with')).with(db.$with('WITH').as((qb) => qb.select().from(usersTable))).select().from(\n\t\t\tusersTable,\n\t\t)\n\t\t\t.catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toStrictEqual('with');\n\t});\n\n\tit('rqb', async () => {\n\t\tawait db.$withAuth(auth('rqb')).query.usersTable.findFirst().catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toStrictEqual('rqb');\n\t});\n\n\tit('exec', async () => {\n\t\tawait db.$withAuth(auth('exec')).execute(`SELECT 1`).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toStrictEqual('exec');\n\t});\n\n\tit('prepared', async () => {\n\t\tconst prep = db.$withAuth(auth('prepared')).select().from(usersTable).prepare('withAuthPrepared');\n\n\t\tawait prep.execute().catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toStrictEqual('prepared');\n\t});\n\n\tit('refreshMaterializedView', async () => {\n\t\tconst johns = pgMaterializedView('johns')\n\t\t\t.as((qb) => qb.select().from(usersTable).where(eq(usersTable.name, 'John')));\n\n\t\tawait db.$withAuth(auth('refreshMaterializedView')).refreshMaterializedView(johns);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toStrictEqual('refreshMaterializedView');\n\t});\n});\n\ndescribe('$withAuth async callback tests', (it) => {\n\tconst client = vi.fn();\n\tconst db = drizzle({\n\t\tclient: client as any as NeonQueryFunction<any, any>,\n\t\tschema: {\n\t\t\tusersTable,\n\t\t},\n\t});\n\tconst auth = (token: string) => async () => token;\n\n\tit('$count', async () => {\n\t\tawait db.$withAuth(auth('$count')).$count(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toBeInstanceOf(Promise);\n\t\texpect(await client.mock.lastCall?.[2]['authToken']()).toStrictEqual('$count');\n\t});\n\n\tit('delete', async () => {\n\t\tawait db.$withAuth(auth('delete')).delete(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toBeInstanceOf(Promise);\n\t\texpect(await client.mock.lastCall?.[2]['authToken']()).toStrictEqual('delete');\n\t});\n\n\tit('select', async () => {\n\t\tawait db.$withAuth(auth('select')).select().from(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toBeInstanceOf(Promise);\n\t\texpect(await client.mock.lastCall?.[2]['authToken']()).toStrictEqual('select');\n\t});\n\n\tit('selectDistinct', async () => {\n\t\tawait db.$withAuth(auth('selectDistinct')).selectDistinct().from(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toBeInstanceOf(Promise);\n\t\texpect(await client.mock.lastCall?.[2]['authToken']()).toStrictEqual('selectDistinct');\n\t});\n\n\tit('selectDistinctOn', async () => {\n\t\tawait db.$withAuth(auth('selectDistinctOn')).selectDistinctOn([usersTable.name]).from(usersTable).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toBeInstanceOf(Promise);\n\t\texpect(await client.mock.lastCall?.[2]['authToken']()).toStrictEqual('selectDistinctOn');\n\t});\n\n\tit('update', async () => {\n\t\tawait db.$withAuth(auth('update')).update(usersTable).set({\n\t\t\tname: 'CHANGED',\n\t\t}).where(eq(usersTable.name, 'TARGET')).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toBeInstanceOf(Promise);\n\t\texpect(await client.mock.lastCall?.[2]['authToken']()).toStrictEqual('update');\n\t});\n\n\tit('insert', async () => {\n\t\tawait db.$withAuth(auth('insert')).insert(usersTable).values({\n\t\t\tname: 'WITHAUTHUSER',\n\t\t}).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toBeInstanceOf(Promise);\n\t\texpect(await client.mock.lastCall?.[2]['authToken']()).toStrictEqual('insert');\n\t});\n\n\tit('with', async () => {\n\t\tawait db.$withAuth(auth('with')).with(db.$with('WITH').as((qb) => qb.select().from(usersTable))).select().from(\n\t\t\tusersTable,\n\t\t)\n\t\t\t.catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toBeInstanceOf(Promise);\n\t\texpect(await client.mock.lastCall?.[2]['authToken']()).toStrictEqual('with');\n\t});\n\n\tit('rqb', async () => {\n\t\tawait db.$withAuth(auth('rqb')).query.usersTable.findFirst().catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toBeInstanceOf(Promise);\n\t\texpect(await client.mock.lastCall?.[2]['authToken']()).toStrictEqual('rqb');\n\t});\n\n\tit('exec', async () => {\n\t\tawait db.$withAuth(auth('exec')).execute(`SELECT 1`).catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toBeInstanceOf(Promise);\n\t\texpect(await client.mock.lastCall?.[2]['authToken']()).toStrictEqual('exec');\n\t});\n\n\tit('prepared', async () => {\n\t\tconst prep = db.$withAuth(auth('prepared')).select().from(usersTable).prepare('withAuthPrepared');\n\n\t\tawait prep.execute().catch(() => null);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toBeInstanceOf(Promise);\n\t\texpect(await client.mock.lastCall?.[2]['authToken']()).toStrictEqual('prepared');\n\t});\n\n\tit('refreshMaterializedView', async () => {\n\t\tconst johns = pgMaterializedView('johns')\n\t\t\t.as((qb) => qb.select().from(usersTable).where(eq(usersTable.name, 'John')));\n\n\t\tawait db.$withAuth(auth('refreshMaterializedView')).refreshMaterializedView(johns);\n\n\t\texpect(client.mock.lastCall?.[2]['authToken']()).toBeInstanceOf(Promise);\n\t\texpect(await client.mock.lastCall?.[2]['authToken']()).toStrictEqual('refreshMaterializedView');\n\t});\n});\n"
  },
  {
    "path": "integration-tests/tests/pg/neon-serverless.test.ts",
    "content": "import { neonConfig, Pool } from '@neondatabase/serverless';\nimport { eq, sql } from 'drizzle-orm';\nimport { drizzle, type NeonDatabase } from 'drizzle-orm/neon-serverless';\nimport { migrate } from 'drizzle-orm/neon-serverless/migrator';\nimport { pgTable, serial, timestamp } from 'drizzle-orm/pg-core';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport ws from 'ws';\nimport { skipTests } from '~/common';\nimport { randomString } from '~/utils';\nimport { mySchema, tests, usersMigratorTable, usersMySchemaTable, usersTable } from './pg-common';\nimport { TestCache, TestGlobalCache, tests as cacheTests } from './pg-common-cache';\n\nconst ENABLE_LOGGING = false;\n\nlet db: NeonDatabase;\nlet dbGlobalCached: NeonDatabase;\nlet cachedDb: NeonDatabase;\nlet client: Pool;\n\nneonConfig.wsProxy = (host) => `${host}:5446/v1`;\nneonConfig.useSecureWebSocket = false;\nneonConfig.pipelineTLS = false;\nneonConfig.pipelineConnect = false;\nneonConfig.webSocketConstructor = ws;\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['NEON_SERVERLESS_CONNECTION_STRING'];\n\tif (!connectionString) {\n\t\tthrow new Error('NEON_SERVERLESS_CONNECTION_STRING is not defined');\n\t}\n\n\tclient = new Pool({ connectionString });\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(client, {\n\t\tlogger: ENABLE_LOGGING,\n\t\tcache: new TestCache(),\n\t});\n\tdbGlobalCached = drizzle(client, {\n\t\tlogger: ENABLE_LOGGING,\n\t\tcache: new TestGlobalCache(),\n\t});\n});\n\nafterAll(async () => {\n\tawait client?.end();\n});\n\nbeforeEach((ctx) => {\n\tctx.pg = {\n\t\tdb,\n\t};\n\tctx.cachedPg = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ntest('migrator : default migration strategy', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom schema', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg', migrationsSchema: 'custom_migrations' });\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(sql`select * from custom_migrations.\"__drizzle_migrations\";`);\n\texpect(rowCount && rowCount > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table custom_migrations.\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg', migrationsTable: customTable });\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(sql`select * from \"drizzle\".${sql.identifier(customTable)};`);\n\texpect(rowCount && rowCount > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".${sql.identifier(customTable)}`);\n});\n\ntest('migrator : migrate with custom table and custom schema', async () => {\n\tconst customTable = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, {\n\t\tmigrationsFolder: './drizzle2/pg',\n\t\tmigrationsTable: customTable,\n\t\tmigrationsSchema: 'custom_migrations',\n\t});\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(\n\t\tsql`select * from custom_migrations.${sql.identifier(customTable)};`,\n\t);\n\texpect(rowCount && rowCount > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table custom_migrations.${sql.identifier(customTable)}`);\n});\n\ntest('all date and time columns without timezone first case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format without timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01 02:00:00.123456' },\n\t]);\n\n\t// 2, Select in string format and check that values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456' }]);\n\n\t// 3. Select as raw query and check that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone second case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01T02:00:00.123456-02' },\n\t]);\n\n\t// 2, Select as raw query and check that values are the same\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone third case mode date', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) not null\n\t\t\t)\n\t`);\n\n\tconst insertedDate = new Date('2022-01-01 20:00:00.123+04');\n\n\t// 1. Insert date as new date\n\tawait db.insert(table).values([\n\t\t{ timestamp: insertedDate },\n\t]);\n\n\t// 2, Select as raw query as string\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3. Compare both dates using orm mapping - Need to add 'Z' to tell JS that it is UTC\n\texpect(new Date(result.rows[0]!.timestamp_string + 'Z').getTime()).toBe(insertedDate.getTime());\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode date for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', withTimezone: true, precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = new Date('2022-01-01 00:00:00.456-0200');\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: timestampString }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone in UTC timezone', async () => {\n\t// get current timezone from db\n\tconst timezone = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to UTC\n\tawait db.execute(sql`set time zone 'UTC'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone.rows[0]!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest.skip('test mode string for timestamp with timezone in different timezone', async () => {\n\t// get current timezone from db\n\tconst timezone = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to HST (UTC - 10)\n\tawait db.execute(sql`set time zone 'HST'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-1000';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 00:00:00.123456-10' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 00:00:00.123456+00' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone.rows[0]!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('select all fields', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst now = Date.now();\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(result[0]!.createdAt.getTime() - now)).toBeLessThan(3000);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('update with returning all fields', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst now = Date.now();\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db\n\t\t.update(usersTable)\n\t\t.set({ name: 'Jane' })\n\t\t.where(eq(usersTable.name, 'John'))\n\t\t.returning();\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(3000);\n\texpect(users).toEqual([\n\t\t{ id: 1, name: 'Jane', verified: false, jsonb: null, createdAt: users[0]!.createdAt },\n\t]);\n});\n\ntest('delete with returning all fields', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst now = Date.now();\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning();\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(3000);\n\texpect(users).toEqual([\n\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: users[0]!.createdAt },\n\t]);\n});\n\ntest('mySchema :: select all fields', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst now = Date.now();\n\n\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\tconst result = await db.select().from(usersMySchemaTable);\n\n\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(result[0]!.createdAt.getTime() - now)).toBeLessThan(3000);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('mySchema :: delete with returning all fields', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst now = Date.now();\n\n\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\tconst users = await db.delete(usersMySchemaTable).where(eq(usersMySchemaTable.name, 'John')).returning();\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(3000);\n\texpect(users).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: users[0]!.createdAt }]);\n});\n\nskipTests([\n\t'migrator : default migration strategy',\n\t'migrator : migrate with custom schema',\n\t'migrator : migrate with custom table',\n\t'migrator : migrate with custom table and custom schema',\n\t'insert via db.execute + select via db.execute',\n\t'insert via db.execute + returning',\n\t'insert via db.execute w/ query builder',\n\t'all date and time columns without timezone first case mode string',\n\t'all date and time columns without timezone third case mode date',\n\t'test mode string for timestamp with timezone',\n\t'test mode date for timestamp with timezone',\n\t'test mode string for timestamp with timezone in UTC timezone',\n\t'nested transaction rollback',\n\t'transaction rollback',\n\t'nested transaction',\n\t'transaction',\n\t'timestamp timezone',\n\t'test $onUpdateFn and $onUpdate works as $default',\n\t'select all fields',\n\t'update with returning all fields',\n\t'delete with returning all fields',\n\t'mySchema :: select all fields',\n\t'mySchema :: delete with returning all fields',\n]);\ntests();\ncacheTests();\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop schema if exists public cascade`);\n\tawait db.execute(sql`drop schema if exists ${mySchema} cascade`);\n\n\tawait db.execute(sql`create schema public`);\n\tawait db.execute(sql`create schema ${mySchema}`);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified boolean not null default false, \n\t\t\t\tjsonb jsonb,\n\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${usersMySchemaTable} (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified boolean not null default false,\n\t\t\t\tjsonb jsonb,\n\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t)\n\t\t`,\n\t);\n});\n\ntest('insert via db.execute + select via db.execute', async () => {\n\tawait db.execute(\n\t\tsql`insert into ${usersTable} (${sql.identifier(usersTable.name.name)}) values (${'John'})`,\n\t);\n\n\tconst result = await db.execute<{ id: number; name: string }>(\n\t\tsql`select id, name from \"users\"`,\n\t);\n\texpect(result.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute + returning', async () => {\n\tconst inserted = await db.execute<{ id: number; name: string }>(\n\t\tsql`insert into ${usersTable} (${\n\t\t\tsql.identifier(\n\t\t\t\tusersTable.name.name,\n\t\t\t)\n\t\t}) values (${'John'}) returning ${usersTable.id}, ${usersTable.name}`,\n\t);\n\texpect(inserted.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async () => {\n\tconst inserted = await db.execute<Pick<typeof usersTable.$inferSelect, 'id' | 'name'>>(\n\t\tdb\n\t\t\t.insert(usersTable)\n\t\t\t.values({ name: 'John' })\n\t\t\t.returning({ id: usersTable.id, name: usersTable.name }),\n\t);\n\texpect(inserted.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n"
  },
  {
    "path": "integration-tests/tests/pg/node-postgres.test.ts",
    "content": "import retry from 'async-retry';\nimport { sql } from 'drizzle-orm';\nimport type { NodePgDatabase } from 'drizzle-orm/node-postgres';\nimport { drizzle } from 'drizzle-orm/node-postgres';\nimport { migrate } from 'drizzle-orm/node-postgres/migrator';\nimport { pgTable, serial, timestamp } from 'drizzle-orm/pg-core';\nimport { Client } from 'pg';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { randomString } from '~/utils';\nimport { createDockerDB, tests, usersMigratorTable, usersTable } from './pg-common';\nimport { TestCache, TestGlobalCache, tests as cacheTests } from './pg-common-cache';\n\nconst ENABLE_LOGGING = false;\n\nlet db: NodePgDatabase;\nlet client: Client;\nlet dbGlobalCached: NodePgDatabase;\nlet cachedDb: NodePgDatabase;\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['PG_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['PG_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t}\n\tclient = await retry(async () => {\n\t\tclient = new Client(connectionString);\n\t\tawait client.connect();\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.end();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestCache() });\n\tdbGlobalCached = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestGlobalCache() });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n});\n\nbeforeEach((ctx) => {\n\tctx.pg = {\n\t\tdb,\n\t};\n\tctx.cachedPg = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ntest('migrator : default migration strategy', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom schema', async () => {\n\tconst customSchema = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg', migrationsSchema: customSchema });\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(sql`select * from ${sql.identifier(customSchema)}.\"__drizzle_migrations\";`);\n\texpect(rowCount && rowCount > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table ${sql.identifier(customSchema)}.\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg', migrationsTable: customTable });\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(sql`select * from \"drizzle\".${sql.identifier(customTable)};`);\n\texpect(rowCount && rowCount > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".${sql.identifier(customTable)}`);\n});\n\ntest('migrator : migrate with custom table and custom schema', async () => {\n\tconst customTable = randomString();\n\tconst customSchema = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, {\n\t\tmigrationsFolder: './drizzle2/pg',\n\t\tmigrationsTable: customTable,\n\t\tmigrationsSchema: customSchema,\n\t});\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(\n\t\tsql`select * from ${sql.identifier(customSchema)}.${sql.identifier(customTable)};`,\n\t);\n\texpect(rowCount && rowCount > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table ${sql.identifier(customSchema)}.${sql.identifier(customTable)}`);\n});\n\ntest('all date and time columns without timezone first case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format without timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01 02:00:00.123456' },\n\t]);\n\n\t// 2, Select in string format and check that values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456' }]);\n\n\t// 3. Select as raw query and check that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone second case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01T02:00:00.123456-02' },\n\t]);\n\n\t// 2, Select as raw query and check that values are the same\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone third case mode date', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) not null\n\t\t\t)\n\t`);\n\n\tconst insertedDate = new Date('2022-01-01 20:00:00.123+04');\n\n\t// 1. Insert date as new date\n\tawait db.insert(table).values([\n\t\t{ timestamp: insertedDate },\n\t]);\n\n\t// 2, Select as raw query as string\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3. Compare both dates using orm mapping - Need to add 'Z' to tell JS that it is UTC\n\texpect(new Date(result.rows[0]!.timestamp_string + 'Z').getTime()).toBe(insertedDate.getTime());\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode date for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', withTimezone: true, precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = new Date('2022-01-01 00:00:00.456-0200');\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: timestampString }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone in UTC timezone', async () => {\n\t// get current timezone from db\n\tconst timezone = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to UTC\n\tawait db.execute(sql`set time zone 'UTC'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone.rows[0]!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone in different timezone', async () => {\n\t// get current timezone from db\n\tconst timezone = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to HST (UTC - 10)\n\tawait db.execute(sql`set time zone '-10'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-1000';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 00:00:00.123456-10' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 00:00:00.123456-10' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone.rows[0]!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\nskipTests([\n\t'migrator : default migration strategy',\n\t'migrator : migrate with custom schema',\n\t'migrator : migrate with custom table',\n\t'migrator : migrate with custom table and custom schema',\n\t'insert via db.execute + select via db.execute',\n\t'insert via db.execute + returning',\n\t'insert via db.execute w/ query builder',\n\t'all date and time columns without timezone first case mode string',\n\t'all date and time columns without timezone third case mode date',\n\t'test mode string for timestamp with timezone',\n\t'test mode date for timestamp with timezone',\n\t'test mode string for timestamp with timezone in UTC timezone',\n\t'test mode string for timestamp with timezone in different timezone',\n]);\ntests();\ncacheTests();\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop schema if exists public cascade`);\n\tawait db.execute(sql`create schema public`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified boolean not null default false, \n\t\t\t\tjsonb jsonb,\n\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t)\n\t\t`,\n\t);\n});\n\ntest('insert via db.execute + select via db.execute', async () => {\n\tawait db.execute(\n\t\tsql`insert into ${usersTable} (${sql.identifier(usersTable.name.name)}) values (${'John'})`,\n\t);\n\n\tconst result = await db.execute<{ id: number; name: string }>(\n\t\tsql`select id, name from \"users\"`,\n\t);\n\texpect(result.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute + returning', async () => {\n\tconst inserted = await db.execute<{ id: number; name: string }>(\n\t\tsql`insert into ${usersTable} (${\n\t\t\tsql.identifier(\n\t\t\t\tusersTable.name.name,\n\t\t\t)\n\t\t}) values (${'John'}) returning ${usersTable.id}, ${usersTable.name}`,\n\t);\n\texpect(inserted.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async () => {\n\tconst inserted = await db.execute<Pick<typeof usersTable.$inferSelect, 'id' | 'name'>>(\n\t\tdb\n\t\t\t.insert(usersTable)\n\t\t\t.values({ name: 'John' })\n\t\t\t.returning({ id: usersTable.id, name: usersTable.name }),\n\t);\n\texpect(inserted.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n"
  },
  {
    "path": "integration-tests/tests/pg/pg-common-cache.ts",
    "content": "import type Docker from 'dockerode';\nimport { eq, getTableName, is, sql, Table } from 'drizzle-orm';\nimport type { MutationOption } from 'drizzle-orm/cache/core';\nimport { Cache } from 'drizzle-orm/cache/core';\nimport type { CacheConfig } from 'drizzle-orm/cache/core/types';\nimport type { PgDatabase, PgQueryResultHKT } from 'drizzle-orm/pg-core';\nimport { alias, boolean, integer, jsonb, pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';\nimport Keyv from 'keyv';\nimport { afterAll, beforeEach, describe, expect, test, vi } from 'vitest';\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nexport class TestGlobalCache extends Cache {\n\tprivate globalTtl: number = 1000;\n\tprivate usedTablesPerKey: Record<string, string[]> = {};\n\n\tconstructor(private kv: Keyv = new Keyv()) {\n\t\tsuper();\n\t}\n\n\toverride strategy(): 'explicit' | 'all' {\n\t\treturn 'all';\n\t}\n\toverride async get(key: string, _tables: string[], _isTag: boolean): Promise<any[] | undefined> {\n\t\tconst res = await this.kv.get(key) ?? undefined;\n\t\treturn res;\n\t}\n\toverride async put(\n\t\tkey: string,\n\t\tresponse: any,\n\t\ttables: string[],\n\t\tisTag: boolean,\n\t\tconfig?: CacheConfig,\n\t): Promise<void> {\n\t\tawait this.kv.set(key, response, config ? config.ex : this.globalTtl);\n\t\tfor (const table of tables) {\n\t\t\tconst keys = this.usedTablesPerKey[table];\n\t\t\tif (keys === undefined) {\n\t\t\t\tthis.usedTablesPerKey[table] = [key];\n\t\t\t} else {\n\t\t\t\tkeys.push(key);\n\t\t\t}\n\t\t}\n\t}\n\toverride async onMutate(params: MutationOption): Promise<void> {\n\t\tconst tagsArray = params.tags ? Array.isArray(params.tags) ? params.tags : [params.tags] : [];\n\t\tconst tablesArray = params.tables ? Array.isArray(params.tables) ? params.tables : [params.tables] : [];\n\n\t\tconst keysToDelete = new Set<string>();\n\n\t\tfor (const table of tablesArray) {\n\t\t\tconst tableName = is(table, Table) ? getTableName(table) : table as string;\n\t\t\tconst keys = this.usedTablesPerKey[tableName] ?? [];\n\t\t\tfor (const key of keys) keysToDelete.add(key);\n\t\t}\n\n\t\tif (keysToDelete.size > 0 || tagsArray.length > 0) {\n\t\t\tfor (const tag of tagsArray) {\n\t\t\t\tawait this.kv.delete(tag);\n\t\t\t}\n\n\t\t\tfor (const key of keysToDelete) {\n\t\t\t\tawait this.kv.delete(key);\n\t\t\t\tfor (const table of tablesArray) {\n\t\t\t\t\tconst tableName = is(table, Table) ? getTableName(table) : table as string;\n\t\t\t\t\tthis.usedTablesPerKey[tableName] = [];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nexport class TestCache extends TestGlobalCache {\n\toverride strategy(): 'explicit' | 'all' {\n\t\treturn 'explicit';\n\t}\n}\n\ndeclare module 'vitest' {\n\tinterface TestContext {\n\t\tcachedPg: {\n\t\t\tdb: PgDatabase<PgQueryResultHKT>;\n\t\t\tdbGlobalCached: PgDatabase<PgQueryResultHKT>;\n\t\t};\n\t}\n}\n\nconst usersTable = pgTable('users', {\n\tid: serial().primaryKey(),\n\tname: text().notNull(),\n\tverified: boolean().notNull().default(false),\n\tjsonb: jsonb().$type<string[]>(),\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n});\n\nconst postsTable = pgTable('posts', {\n\tid: serial().primaryKey(),\n\tdescription: text().notNull(),\n\tuserId: integer('city_id').references(() => usersTable.id),\n});\n\nlet pgContainer: Docker.Container;\n\nafterAll(async () => {\n\tawait pgContainer?.stop().catch(console.error);\n});\n\nexport function tests() {\n\tdescribe('common', () => {\n\t\tbeforeEach(async (ctx) => {\n\t\t\tconst { db, dbGlobalCached } = ctx.cachedPg;\n\t\t\tawait db.execute(sql`drop schema if exists public cascade`);\n\t\t\tawait db.$cache?.invalidate({ tables: 'users' });\n\t\t\tawait dbGlobalCached.$cache?.invalidate({ tables: 'users' });\n\t\t\tawait db.execute(sql`create schema public`);\n\t\t\t// public users\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tverified boolean not null default false,\n\t\t\t\t\t\tjsonb jsonb,\n\t\t\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t});\n\n\t\ttest('test force invalidate', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedPg;\n\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'invalidate');\n\t\t\tawait db.$cache?.invalidate({ tables: 'users' });\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t\t});\n\n\t\ttest('default global config - no cache should be hit', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedPg;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('default global config + enable cache on select: get, put', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedPg;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache();\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('default global config + enable cache on select + write: get, put, onMutate', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedPg;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ config: { ex: 1 } });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tspyPut.mockClear();\n\t\t\tspyGet.mockClear();\n\t\t\tspyInvalidate.mockClear();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t\t});\n\n\t\ttest('default global config + enable cache on select + disable invalidate: get, put', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedPg;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ tag: 'custom', autoInvalidate: false, config: { ex: 1 } });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\t// invalidate force\n\t\t\tawait db.$cache?.invalidate({ tags: ['custom'] });\n\t\t});\n\n\t\ttest('global: true + disable cache', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedPg;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache(false);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('global: true - cache should be hit', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedPg;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('global: true - cache: false on select - no cache hit', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedPg;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache(false);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('global: true - disable invalidate - cache hit + no invalidate', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedPg;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ autoInvalidate: false });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tspyPut.mockClear();\n\t\t\tspyGet.mockClear();\n\t\t\tspyInvalidate.mockClear();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t\t});\n\n\t\ttest('global: true - with custom tag', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedPg;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ tag: 'custom', autoInvalidate: false });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\t// invalidate force\n\t\t\tawait db.$cache?.invalidate({ tags: ['custom'] });\n\t\t});\n\n\t\ttest('global: true - with custom tag + with autoinvalidate', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedPg;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ tag: 'custom' });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\n\t\t\t// invalidate force\n\t\t\tawait db.$cache?.invalidate({ tags: ['custom'] });\n\t\t});\n\n\t\t// check select used tables\n\t\ttest('check simple select used tables', (ctx) => {\n\t\t\tconst { db } = ctx.cachedPg;\n\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(usersTable).getUsedTables()).toStrictEqual(['users']);\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(sql`${usersTable}`).getUsedTables()).toStrictEqual(['users']);\n\t\t});\n\t\t// check select+join used tables\n\t\ttest('select+join', (ctx) => {\n\t\t\tconst { db } = ctx.cachedPg;\n\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(usersTable).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).getUsedTables())\n\t\t\t\t.toStrictEqual(['users', 'posts']);\n\t\t\texpect(\n\t\t\t\t// @ts-expect-error\n\t\t\t\tdb.select().from(sql`${usersTable}`).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).getUsedTables(),\n\t\t\t).toStrictEqual(['users', 'posts']);\n\t\t});\n\t\t// check select+2join used tables\n\t\ttest('select+2joins', (ctx) => {\n\t\t\tconst { db } = ctx.cachedPg;\n\n\t\t\texpect(\n\t\t\t\tdb.select().from(usersTable).leftJoin(\n\t\t\t\t\tpostsTable,\n\t\t\t\t\teq(usersTable.id, postsTable.userId),\n\t\t\t\t).leftJoin(\n\t\t\t\t\talias(postsTable, 'post2'),\n\t\t\t\t\teq(usersTable.id, postsTable.userId),\n\t\t\t\t)\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t.getUsedTables(),\n\t\t\t)\n\t\t\t\t.toStrictEqual(['users', 'posts']);\n\t\t\texpect(\n\t\t\t\tdb.select().from(sql`${usersTable}`).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).leftJoin(\n\t\t\t\t\talias(postsTable, 'post2'),\n\t\t\t\t\teq(usersTable.id, postsTable.userId),\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t).getUsedTables(),\n\t\t\t).toStrictEqual(['users', 'posts']);\n\t\t});\n\t\t// select subquery used tables\n\t\ttest('select+join', (ctx) => {\n\t\t\tconst { db } = ctx.cachedPg;\n\n\t\t\tconst sq = db.select().from(usersTable).where(eq(usersTable.id, 42)).as('sq');\n\t\t\tdb.select().from(sq);\n\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(sq).getUsedTables()).toStrictEqual(['users']);\n\t\t});\n\t});\n}\n"
  },
  {
    "path": "integration-tests/tests/pg/pg-common.ts",
    "content": "import Docker from 'dockerode';\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nimport {\n\tand,\n\tarrayContained,\n\tarrayContains,\n\tarrayOverlaps,\n\tasc,\n\tavg,\n\tavgDistinct,\n\tcount,\n\tcountDistinct,\n\teq,\n\tEqual,\n\texists,\n\tgetTableColumns,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tis,\n\tlike,\n\tlt,\n\tmax,\n\tmin,\n\tnot,\n\tnotInArray,\n\tor,\n\tSQL,\n\tsql,\n\tSQLWrapper,\n\tsum,\n\tsumDistinct,\n\tTransactionRollbackError,\n} from 'drizzle-orm';\nimport { authenticatedRole, crudPolicy, usersSync } from 'drizzle-orm/neon';\nimport type { NeonHttpDatabase } from 'drizzle-orm/neon-http';\nimport type { PgColumn, PgDatabase, PgQueryResultHKT } from 'drizzle-orm/pg-core';\nimport {\n\talias,\n\tbigint,\n\tbigserial,\n\tboolean,\n\tchar,\n\tcidr,\n\tdate,\n\tdoublePrecision,\n\texcept,\n\texceptAll,\n\tforeignKey,\n\tgetMaterializedViewConfig,\n\tgetTableConfig,\n\tgetViewConfig,\n\tindex,\n\tinet,\n\tinteger,\n\tintersect,\n\tintersectAll,\n\tinterval,\n\tjson,\n\tjsonb,\n\tline,\n\tmacaddr,\n\tmacaddr8,\n\tnumeric,\n\tPgDialect,\n\tpgEnum,\n\tpgMaterializedView,\n\tPgPolicy,\n\tpgPolicy,\n\tpgSchema,\n\tpgTable,\n\tpgTableCreator,\n\tpgView,\n\tpoint,\n\tprimaryKey,\n\treal,\n\tserial,\n\tsmallint,\n\tsmallserial,\n\ttext,\n\ttime,\n\ttimestamp,\n\tunion,\n\tunionAll,\n\tunique,\n\tuniqueKeyName,\n\tuuid,\n\tuuid as pgUuid,\n\tvarchar,\n} from 'drizzle-orm/pg-core';\nimport getPort from 'get-port';\nimport { v4 as uuidV4 } from 'uuid';\nimport { afterAll, afterEach, beforeEach, describe, expect, expectTypeOf, test } from 'vitest';\nimport { Expect } from '~/utils';\nimport type { schema } from './neon-http-batch.test';\n// eslint-disable-next-line @typescript-eslint/no-import-type-side-effects\n// import { type NodePgDatabase } from 'drizzle-orm/node-postgres';\n\ndeclare module 'vitest' {\n\tinterface TestContext {\n\t\tpg: {\n\t\t\tdb: PgDatabase<PgQueryResultHKT>;\n\t\t};\n\t\tneonPg: {\n\t\t\tdb: NeonHttpDatabase<typeof schema>;\n\t\t};\n\t}\n}\n\nconst en = pgEnum('en', ['enVal1', 'enVal2']);\n\nconst allTypesTable = pgTable('all_types', {\n\tserial: serial('serial'),\n\tbigserial53: bigserial('bigserial53', {\n\t\tmode: 'number',\n\t}),\n\tbigserial64: bigserial('bigserial64', {\n\t\tmode: 'bigint',\n\t}),\n\tint: integer('int'),\n\tbigint53: bigint('bigint53', {\n\t\tmode: 'number',\n\t}),\n\tbigint64: bigint('bigint64', {\n\t\tmode: 'bigint',\n\t}),\n\tbool: boolean('bool'),\n\tchar: char('char'),\n\tcidr: cidr('cidr'),\n\tdate: date('date', {\n\t\tmode: 'date',\n\t}),\n\tdateStr: date('date_str', {\n\t\tmode: 'string',\n\t}),\n\tdouble: doublePrecision('double'),\n\tenum: en('enum'),\n\tinet: inet('inet'),\n\tinterval: interval('interval'),\n\tjson: json('json'),\n\tjsonb: jsonb('jsonb'),\n\tline: line('line', {\n\t\tmode: 'abc',\n\t}),\n\tlineTuple: line('line_tuple', {\n\t\tmode: 'tuple',\n\t}),\n\tmacaddr: macaddr('macaddr'),\n\tmacaddr8: macaddr8('macaddr8'),\n\tnumeric: numeric('numeric'),\n\tnumericNum: numeric('numeric_num', {\n\t\tmode: 'number',\n\t}),\n\tnumericBig: numeric('numeric_big', {\n\t\tmode: 'bigint',\n\t}),\n\tpoint: point('point', {\n\t\tmode: 'xy',\n\t}),\n\tpointTuple: point('point_tuple', {\n\t\tmode: 'tuple',\n\t}),\n\treal: real('real'),\n\tsmallint: smallint('smallint'),\n\tsmallserial: smallserial('smallserial'),\n\ttext: text('text'),\n\ttime: time('time'),\n\ttimestamp: timestamp('timestamp', {\n\t\tmode: 'date',\n\t}),\n\ttimestampTz: timestamp('timestamp_tz', {\n\t\tmode: 'date',\n\t\twithTimezone: true,\n\t}),\n\ttimestampStr: timestamp('timestamp_str', {\n\t\tmode: 'string',\n\t}),\n\ttimestampTzStr: timestamp('timestamp_tz_str', {\n\t\tmode: 'string',\n\t\twithTimezone: true,\n\t}),\n\tuuid: uuid('uuid'),\n\tvarchar: varchar('varchar'),\n\tarrint: integer('arrint').array(),\n\tarrbigint53: bigint('arrbigint53', {\n\t\tmode: 'number',\n\t}).array(),\n\tarrbigint64: bigint('arrbigint64', {\n\t\tmode: 'bigint',\n\t}).array(),\n\tarrbool: boolean('arrbool').array(),\n\tarrchar: char('arrchar').array(),\n\tarrcidr: cidr('arrcidr').array(),\n\tarrdate: date('arrdate', {\n\t\tmode: 'date',\n\t}).array(),\n\tarrdateStr: date('arrdate_str', {\n\t\tmode: 'string',\n\t}).array(),\n\tarrdouble: doublePrecision('arrdouble').array(),\n\tarrenum: en('arrenum').array(),\n\tarrinet: inet('arrinet').array(),\n\tarrinterval: interval('arrinterval').array(),\n\tarrjson: json('arrjson').array(),\n\tarrjsonb: jsonb('arrjsonb').array(),\n\tarrline: line('arrline', {\n\t\tmode: 'abc',\n\t}).array(),\n\tarrlineTuple: line('arrline_tuple', {\n\t\tmode: 'tuple',\n\t}).array(),\n\tarrmacaddr: macaddr('arrmacaddr').array(),\n\tarrmacaddr8: macaddr8('arrmacaddr8').array(),\n\tarrnumeric: numeric('arrnumeric').array(),\n\tarrnumericNum: numeric('arrnumeric_num', {\n\t\tmode: 'number',\n\t}).array(),\n\tarrnumericBig: numeric('arrnumeric_big', {\n\t\tmode: 'bigint',\n\t}).array(),\n\tarrpoint: point('arrpoint', {\n\t\tmode: 'xy',\n\t}).array(),\n\tarrpointTuple: point('arrpoint_tuple', {\n\t\tmode: 'tuple',\n\t}).array(),\n\tarrreal: real('arrreal').array(),\n\tarrsmallint: smallint('arrsmallint').array(),\n\tarrtext: text('arrtext').array(),\n\tarrtime: time('arrtime').array(),\n\tarrtimestamp: timestamp('arrtimestamp', {\n\t\tmode: 'date',\n\t}).array(),\n\tarrtimestampTz: timestamp('arrtimestamp_tz', {\n\t\tmode: 'date',\n\t\twithTimezone: true,\n\t}).array(),\n\tarrtimestampStr: timestamp('arrtimestamp_str', {\n\t\tmode: 'string',\n\t}).array(),\n\tarrtimestampTzStr: timestamp('arrtimestamp_tz_str', {\n\t\tmode: 'string',\n\t\twithTimezone: true,\n\t}).array(),\n\tarruuid: uuid('arruuid').array(),\n\tarrvarchar: varchar('arrvarchar').array(),\n});\n\nexport const usersTable = pgTable('users', {\n\tid: serial('id' as string).primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: jsonb('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n});\n\nconst usersOnUpdate = pgTable('users_on_update', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tupdateCounter: integer('update_counter').default(sql`1`).$onUpdateFn(() => sql`update_counter + 1`),\n\tupdatedAt: timestamp('updated_at', { mode: 'date', precision: 3 }).$onUpdate(() => new Date()),\n\talwaysNull: text('always_null').$type<string | null>().$onUpdate(() => null),\n\t// uppercaseName: text('uppercase_name').$onUpdateFn(() => sql`upper(name)`), looks like this is not supported in pg\n});\n\nconst citiesTable = pgTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tstate: char('state', { length: 2 }),\n});\n\nconst cities2Table = pgTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nconst users2Table = pgTable('users2', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: integer('city_id').references(() => citiesTable.id),\n});\n\nconst coursesTable = pgTable('courses', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcategoryId: integer('category_id').references(() => courseCategoriesTable.id),\n});\n\nconst courseCategoriesTable = pgTable('course_categories', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nconst orders = pgTable('orders', {\n\tid: serial('id').primaryKey(),\n\tregion: text('region').notNull(),\n\tproduct: text('product').notNull().$default(() => 'random_string'),\n\tamount: integer('amount').notNull(),\n\tquantity: integer('quantity').notNull(),\n});\n\nconst network = pgTable('network_table', {\n\tinet: inet('inet').notNull(),\n\tcidr: cidr('cidr').notNull(),\n\tmacaddr: macaddr('macaddr').notNull(),\n\tmacaddr8: macaddr8('macaddr8').notNull(),\n});\n\nconst salEmp = pgTable('sal_emp', {\n\tname: text('name'),\n\tpayByQuarter: integer('pay_by_quarter').array(),\n\tschedule: text('schedule').array().array(),\n});\n\nconst _tictactoe = pgTable('tictactoe', {\n\tsquares: integer('squares').array(3).array(3),\n});\n\nexport const usersMigratorTable = pgTable('users12', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n});\n\n// To test aggregate functions\nconst aggregateTable = pgTable('aggregate_table', {\n\tid: serial('id').notNull(),\n\tname: text('name').notNull(),\n\ta: integer('a'),\n\tb: integer('b'),\n\tc: integer('c'),\n\tnullOnly: integer('null_only'),\n});\n\n// To test another schema and multischema\nexport const mySchema = pgSchema('mySchema');\n\nexport const usersMySchemaTable = mySchema.table('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: jsonb('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n});\n\nconst citiesMySchemaTable = mySchema.table('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tstate: char('state', { length: 2 }),\n});\n\nconst users2MySchemaTable = mySchema.table('users2', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: integer('city_id').references(() => citiesTable.id),\n});\n\nconst jsonTestTable = pgTable('jsontest', {\n\tid: serial('id').primaryKey(),\n\tjson: json('json').$type<{ string: string; number: number }>(),\n\tjsonb: jsonb('jsonb').$type<{ string: string; number: number }>(),\n});\n\nlet pgContainer: Docker.Container;\n\nexport async function createDockerDB(): Promise<{ connectionString: string; container: Docker.Container }> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 5432 });\n\tconst image = 'postgres:14';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tpgContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['POSTGRES_PASSWORD=postgres', 'POSTGRES_USER=postgres', 'POSTGRES_DB=postgres'],\n\t\tname: `drizzle-integration-tests-${uuidV4()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5432/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait pgContainer.start();\n\n\treturn { connectionString: `postgres://postgres:postgres@localhost:${port}/postgres`, container: pgContainer };\n}\n\nafterAll(async () => {\n\tawait pgContainer?.stop().catch(console.error);\n});\n\nexport function tests() {\n\tdescribe('common', () => {\n\t\tbeforeEach(async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\t\t\tawait db.execute(sql`drop schema if exists public cascade`);\n\t\t\tawait db.execute(sql`drop schema if exists ${mySchema} cascade`);\n\t\t\tawait db.execute(sql`create schema public`);\n\t\t\tawait db.execute(sql`create schema if not exists custom_migrations`);\n\t\t\tawait db.execute(sql`create schema ${mySchema}`);\n\t\t\t// public users\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tverified boolean not null default false,\n\t\t\t\t\t\tjsonb jsonb,\n\t\t\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\t// public cities\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table cities (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tstate char(2)\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\t// public users2\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users2 (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tcity_id integer references cities(id)\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table course_categories (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table courses (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tcategory_id integer references course_categories(id)\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table orders (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tregion text not null,\n\t\t\t\t\t\tproduct text not null,\n\t\t\t\t\t\tamount integer not null,\n\t\t\t\t\t\tquantity integer not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table network_table (\n\t\t\t\t\t\tinet inet not null,\n\t\t\t\t\t\tcidr cidr not null,\n\t\t\t\t\t\tmacaddr macaddr not null,\n\t\t\t\t\t\tmacaddr8 macaddr8 not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table sal_emp (\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tpay_by_quarter integer[] not null,\n\t\t\t\t\t\tschedule text[][] not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table tictactoe (\n\t\t\t\t\t\tsquares integer[3][3] not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\t// // mySchema users\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${usersMySchemaTable} (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tverified boolean not null default false,\n\t\t\t\t\t\tjsonb jsonb,\n\t\t\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\t// mySchema cities\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${citiesMySchemaTable} (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tstate char(2)\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\t// mySchema users2\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${users2MySchemaTable} (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tcity_id integer references \"mySchema\".cities(id)\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table jsontest (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tjson json,\n\t\t\t\t\t\tjsonb jsonb\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t});\n\n\t\tafterEach(async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\t\t\tawait db.execute(sql`drop schema if exists custom_migrations cascade`);\n\t\t});\n\n\t\tasync function setupSetOperationTest(db: PgDatabase<PgQueryResultHKT>) {\n\t\t\tawait db.execute(sql`drop table if exists users2`);\n\t\t\tawait db.execute(sql`drop table if exists cities`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table cities (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users2 (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tcity_id integer references cities(id)\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(cities2Table).values([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t{ id: 2, name: 'Jane', cityId: 2 },\n\t\t\t\t{ id: 3, name: 'Jack', cityId: 3 },\n\t\t\t\t{ id: 4, name: 'Peter', cityId: 3 },\n\t\t\t\t{ id: 5, name: 'Ben', cityId: 2 },\n\t\t\t\t{ id: 6, name: 'Jill', cityId: 1 },\n\t\t\t\t{ id: 7, name: 'Mary', cityId: 2 },\n\t\t\t\t{ id: 8, name: 'Sally', cityId: 1 },\n\t\t\t]);\n\t\t}\n\n\t\tasync function setupAggregateFunctionsTest(db: PgDatabase<PgQueryResultHKT>) {\n\t\t\tawait db.execute(sql`drop table if exists \"aggregate_table\"`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \"aggregate_table\" (\n\t\t\t\t\t\t\"id\" serial not null,\n\t\t\t\t\t\t\"name\" text not null,\n\t\t\t\t\t\t\"a\" integer,\n\t\t\t\t\t\t\"b\" integer,\n\t\t\t\t\t\t\"c\" integer,\n\t\t\t\t\t\t\"null_only\" integer\n\t\t\t\t\t);\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.insert(aggregateTable).values([\n\t\t\t\t{ name: 'value 1', a: 5, b: 10, c: 20 },\n\t\t\t\t{ name: 'value 1', a: 5, b: 20, c: 30 },\n\t\t\t\t{ name: 'value 2', a: 10, b: 50, c: 60 },\n\t\t\t\t{ name: 'value 3', a: 20, b: 20, c: null },\n\t\t\t\t{ name: 'value 4', a: null, b: 90, c: 120 },\n\t\t\t\t{ name: 'value 5', a: 80, b: 10, c: null },\n\t\t\t\t{ name: 'value 6', a: null, b: null, c: 150 },\n\t\t\t]);\n\t\t}\n\n\t\ttest('table configs: unique third param', async () => {\n\t\t\tconst cities1Table = pgTable('cities1', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstate: char('state', { length: 2 }),\n\t\t\t}, (t) => ({\n\t\t\t\tf: unique('custom_name').on(t.name, t.state).nullsNotDistinct(),\n\t\t\t\tf1: unique('custom_name1').on(t.name, t.state),\n\t\t\t}));\n\n\t\t\tconst tableConfig = getTableConfig(cities1Table);\n\n\t\t\texpect(tableConfig.uniqueConstraints).toHaveLength(2);\n\n\t\t\texpect(tableConfig.uniqueConstraints[0]?.name).toBe('custom_name');\n\t\t\texpect(tableConfig.uniqueConstraints[0]?.nullsNotDistinct).toBe(true);\n\t\t\texpect(tableConfig.uniqueConstraints[0]?.columns.map((t) => t.name)).toEqual(['name', 'state']);\n\n\t\t\texpect(tableConfig.uniqueConstraints[1]?.name).toBe('custom_name1');\n\t\t\texpect(tableConfig.uniqueConstraints[1]?.nullsNotDistinct).toBe(false);\n\t\t\texpect(tableConfig.uniqueConstraints[1]?.columns.map((t) => t.name)).toEqual(['name', 'state']);\n\t\t});\n\n\t\ttest('table configs: unique in column', async () => {\n\t\t\tconst cities1Table = pgTable('cities1', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull().unique(),\n\t\t\t\tstate: char('state', { length: 2 }).unique('custom'),\n\t\t\t\tfield: char('field', { length: 2 }).unique('custom_field', { nulls: 'not distinct' }),\n\t\t\t});\n\n\t\t\tconst tableConfig = getTableConfig(cities1Table);\n\n\t\t\tconst columnName = tableConfig.columns.find((it) => it.name === 'name');\n\n\t\t\texpect(columnName?.uniqueName).toBe(uniqueKeyName(cities1Table, [columnName!.name]));\n\t\t\texpect(columnName?.isUnique).toBe(true);\n\n\t\t\tconst columnState = tableConfig.columns.find((it) => it.name === 'state');\n\t\t\texpect(columnState?.uniqueName).toBe('custom');\n\t\t\texpect(columnState?.isUnique).toBe(true);\n\n\t\t\tconst columnField = tableConfig.columns.find((it) => it.name === 'field');\n\t\t\texpect(columnField?.uniqueName).toBe('custom_field');\n\t\t\texpect(columnField?.isUnique).toBe(true);\n\t\t\texpect(columnField?.uniqueType).toBe('not distinct');\n\t\t});\n\n\t\ttest('table config: foreign keys name', async () => {\n\t\t\tconst table = pgTable('cities', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstate: text('state'),\n\t\t\t}, (t) => ({\n\t\t\t\tf: foreignKey({ foreignColumns: [t.id], columns: [t.id], name: 'custom_fk' }),\n\t\t\t}));\n\n\t\t\tconst tableConfig = getTableConfig(table);\n\n\t\t\texpect(tableConfig.foreignKeys).toHaveLength(1);\n\t\t\texpect(tableConfig.foreignKeys[0]!.getName()).toBe('custom_fk');\n\t\t});\n\n\t\ttest('table config: primary keys name', async () => {\n\t\t\tconst table = pgTable('cities', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstate: text('state'),\n\t\t\t}, (t) => ({\n\t\t\t\tf: primaryKey({ columns: [t.id, t.name], name: 'custom_pk' }),\n\t\t\t}));\n\n\t\t\tconst tableConfig = getTableConfig(table);\n\n\t\t\texpect(tableConfig.primaryKeys).toHaveLength(1);\n\t\t\texpect(tableConfig.primaryKeys[0]!.getName()).toBe('custom_pk');\n\t\t});\n\n\t\ttest('select all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst now = Date.now();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst result = await db.select().from(usersTable);\n\n\t\t\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\texpect(Math.abs(result[0]!.createdAt.getTime() - now)).toBeLessThan(300);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('select sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db\n\t\t\t\t.select({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.from(usersTable);\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('select typed sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\tconst users = await db.select({\n\t\t\t\tname: sql<string>`upper(${usersTable.name})`,\n\t\t\t}).from(usersTable);\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('select with empty array in inArray', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(inArray(usersTable.id, []));\n\n\t\t\texpect(result).toEqual([]);\n\t\t});\n\n\t\ttest('select with empty array in notInArray', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(notInArray(usersTable.id, []));\n\n\t\t\texpect(result).toEqual([{ name: 'JOHN' }, { name: 'JANE' }, { name: 'JANE' }]);\n\t\t});\n\n\t\ttest('$default function', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst insertedOrder = await db.insert(orders).values({ id: 1, region: 'Ukraine', amount: 1, quantity: 1 })\n\t\t\t\t.returning();\n\t\t\tconst selectedOrder = await db.select().from(orders);\n\n\t\t\texpect(insertedOrder).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t\tamount: 1,\n\t\t\t\tquantity: 1,\n\t\t\t\tregion: 'Ukraine',\n\t\t\t\tproduct: 'random_string',\n\t\t\t}]);\n\n\t\t\texpect(selectedOrder).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t\tamount: 1,\n\t\t\t\tquantity: 1,\n\t\t\t\tregion: 'Ukraine',\n\t\t\t\tproduct: 'random_string',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('select distinct', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst usersDistinctTable = pgTable('users_distinct', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tage: integer('age').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${usersDistinctTable}`);\n\t\t\tawait db.execute(sql`create table ${usersDistinctTable} (id integer, name text, age integer)`);\n\n\t\t\tawait db.insert(usersDistinctTable).values([\n\t\t\t\t{ id: 1, name: 'John', age: 24 },\n\t\t\t\t{ id: 1, name: 'John', age: 24 },\n\t\t\t\t{ id: 2, name: 'John', age: 25 },\n\t\t\t\t{ id: 1, name: 'Jane', age: 24 },\n\t\t\t\t{ id: 1, name: 'Jane', age: 26 },\n\t\t\t]);\n\t\t\tconst users1 = await db.selectDistinct().from(usersDistinctTable).orderBy(\n\t\t\t\tusersDistinctTable.id,\n\t\t\t\tusersDistinctTable.name,\n\t\t\t);\n\t\t\tconst users2 = await db.selectDistinctOn([usersDistinctTable.id]).from(usersDistinctTable).orderBy(\n\t\t\t\tusersDistinctTable.id,\n\t\t\t);\n\t\t\tconst users3 = await db.selectDistinctOn([usersDistinctTable.name], { name: usersDistinctTable.name }).from(\n\t\t\t\tusersDistinctTable,\n\t\t\t).orderBy(usersDistinctTable.name);\n\t\t\tconst users4 = await db.selectDistinctOn([usersDistinctTable.id, usersDistinctTable.age]).from(\n\t\t\t\tusersDistinctTable,\n\t\t\t).orderBy(usersDistinctTable.id, usersDistinctTable.age);\n\n\t\t\tawait db.execute(sql`drop table ${usersDistinctTable}`);\n\n\t\t\texpect(users1).toEqual([\n\t\t\t\t{ id: 1, name: 'Jane', age: 24 },\n\t\t\t\t{ id: 1, name: 'Jane', age: 26 },\n\t\t\t\t{ id: 1, name: 'John', age: 24 },\n\t\t\t\t{ id: 2, name: 'John', age: 25 },\n\t\t\t]);\n\n\t\t\texpect(users2).toHaveLength(2);\n\t\t\texpect(users2[0]?.id).toBe(1);\n\t\t\texpect(users2[1]?.id).toBe(2);\n\n\t\t\texpect(users3).toHaveLength(2);\n\t\t\texpect(users3[0]?.name).toBe('Jane');\n\t\t\texpect(users3[1]?.name).toBe('John');\n\n\t\t\texpect(users4).toEqual([\n\t\t\t\t{ id: 1, name: 'John', age: 24 },\n\t\t\t\t{ id: 1, name: 'Jane', age: 26 },\n\t\t\t\t{ id: 2, name: 'John', age: 25 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('insert returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = await db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ name: 'John' })\n\t\t\t\t.returning({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t});\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('delete returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db\n\t\t\t\t.delete(usersTable)\n\t\t\t\t.where(eq(usersTable.name, 'John'))\n\t\t\t\t.returning({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t});\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('update returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db\n\t\t\t\t.update(usersTable)\n\t\t\t\t.set({ name: 'Jane' })\n\t\t\t\t.where(eq(usersTable.name, 'John'))\n\t\t\t\t.returning({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t});\n\n\t\t\texpect(users).toEqual([{ name: 'JANE' }]);\n\t\t});\n\n\t\ttest('update with returning all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst now = Date.now();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db\n\t\t\t\t.update(usersTable)\n\t\t\t\t.set({ name: 'Jane' })\n\t\t\t\t.where(eq(usersTable.name, 'John'))\n\t\t\t\t.returning();\n\n\t\t\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(300);\n\t\t\texpect(users).toEqual([\n\t\t\t\t{ id: 1, name: 'Jane', verified: false, jsonb: null, createdAt: users[0]!.createdAt },\n\t\t\t]);\n\t\t});\n\n\t\ttest('update with returning partial', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db\n\t\t\t\t.update(usersTable)\n\t\t\t\t.set({ name: 'Jane' })\n\t\t\t\t.where(eq(usersTable.name, 'John'))\n\t\t\t\t.returning({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t});\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n\t\t});\n\n\t\ttest('delete with returning all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst now = Date.now();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning();\n\n\t\t\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(300);\n\t\t\texpect(users).toEqual([\n\t\t\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: users[0]!.createdAt },\n\t\t\t]);\n\t\t});\n\n\t\ttest('delete with returning partial', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t});\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert + select', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst result = await db.select().from(usersTable);\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt },\n\t\t\t]);\n\n\t\t\tawait db.insert(usersTable).values({ name: 'Jane' });\n\t\t\tconst result2 = await db.select().from(usersTable);\n\t\t\texpect(result2).toEqual([\n\t\t\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result2[0]!.createdAt },\n\t\t\t\t{ id: 2, name: 'Jane', verified: false, jsonb: null, createdAt: result2[1]!.createdAt },\n\t\t\t]);\n\t\t});\n\n\t\ttest('json insert', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John', jsonb: ['foo', 'bar'] });\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t\tjsonb: usersTable.jsonb,\n\t\t\t\t})\n\t\t\t\t.from(usersTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', jsonb: ['foo', 'bar'] }]);\n\t\t});\n\n\t\ttest('char insert', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(citiesTable).values({ name: 'Austin', state: 'TX' });\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name, state: citiesTable.state })\n\t\t\t\t.from(citiesTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'Austin', state: 'TX' }]);\n\t\t});\n\n\t\ttest('char update', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(citiesTable).values({ name: 'Austin', state: 'TX' });\n\t\t\tawait db.update(citiesTable).set({ name: 'Atlanta', state: 'GA' }).where(eq(citiesTable.id, 1));\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name, state: citiesTable.state })\n\t\t\t\t.from(citiesTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'Atlanta', state: 'GA' }]);\n\t\t});\n\n\t\ttest('char delete', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(citiesTable).values({ name: 'Austin', state: 'TX' });\n\t\t\tawait db.delete(citiesTable).where(eq(citiesTable.state, 'TX'));\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name, state: citiesTable.state })\n\t\t\t\t.from(citiesTable);\n\n\t\t\texpect(result).toEqual([]);\n\t\t});\n\n\t\ttest('insert with overridden default values', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John', verified: true });\n\t\t\tconst result = await db.select().from(usersTable);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', verified: true, jsonb: null, createdAt: result[0]!.createdAt },\n\t\t\t]);\n\t\t});\n\n\t\ttest('insert many', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t\t{ name: 'Austin', verified: true },\n\t\t\t\t]);\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t\tjsonb: usersTable.jsonb,\n\t\t\t\t\tverified: usersTable.verified,\n\t\t\t\t})\n\t\t\t\t.from(usersTable);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t\t\t]);\n\t\t});\n\n\t\ttest('insert many with returning', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst result = await db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t\t{ name: 'Austin', verified: true },\n\t\t\t\t])\n\t\t\t\t.returning({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t\tjsonb: usersTable.jsonb,\n\t\t\t\t\tverified: usersTable.verified,\n\t\t\t\t});\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t\t\t]);\n\t\t});\n\n\t\ttest('select with group by as field', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.groupBy(usersTable.name);\n\n\t\t\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n\t\t});\n\n\t\ttest('select with exists', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst user = alias(usersTable, 'user');\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable).where(\n\t\t\t\texists(\n\t\t\t\t\tdb.select({ one: sql`1` }).from(user).where(and(eq(usersTable.name, 'John'), eq(user.id, usersTable.id))),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\texpect(result).toEqual([{ name: 'John' }]);\n\t\t});\n\n\t\ttest('select with group by as sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.groupBy(sql`${usersTable.name}`);\n\n\t\t\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n\t\t});\n\n\t\ttest('select with group by as sql + column', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.groupBy(sql`${usersTable.name}`, usersTable.id);\n\n\t\t\texpect(result).toEqual([{ name: 'Jane' }, { name: 'Jane' }, { name: 'John' }]);\n\t\t});\n\n\t\ttest('select with group by as column + sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, sql`${usersTable.name}`);\n\n\t\t\texpect(result).toEqual([{ name: 'Jane' }, { name: 'Jane' }, { name: 'John' }]);\n\t\t});\n\n\t\ttest('select with group by complex query', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t\t\t.orderBy(asc(usersTable.name))\n\t\t\t\t.limit(1);\n\n\t\t\texpect(result).toEqual([{ name: 'Jane' }]);\n\t\t});\n\n\t\ttest('build query', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst query = db\n\t\t\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, usersTable.name)\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\", \"users\".\"name\"',\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t});\n\n\t\ttest('insert sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: sql`${'John'}` });\n\t\t\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('partial join with alias', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\t\t\tconst customerAlias = alias(usersTable, 'customer');\n\n\t\t\tawait db.insert(usersTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\t\tname: usersTable.name,\n\t\t\t\t\t},\n\t\t\t\t\tcustomer: {\n\t\t\t\t\t\tid: customerAlias.id,\n\t\t\t\t\t\tname: customerAlias.name,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t\t\t.where(eq(usersTable.id, 10));\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tuser: { id: 10, name: 'Ivan' },\n\t\t\t\t\tcustomer: { id: 11, name: 'Hans' },\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('full join with alias', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst pgTable = pgTableCreator((name) => `prefixed_${name}`);\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\t\t\tconst customers = alias(users, 'customer');\n\n\t\t\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(users)\n\t\t\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t\t\t.where(eq(users.id, 10));\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tusers: {\n\t\t\t\t\tid: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t},\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('select from alias', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst pgTable = pgTableCreator((name) => `prefixed_${name}`);\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\t\t\tconst user = alias(users, 'user');\n\t\t\tconst customers = alias(users, 'customer');\n\n\t\t\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(user)\n\t\t\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t\t\t.where(eq(user.id, 10));\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tuser: {\n\t\t\t\t\tid: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t},\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('insert with spaces', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: sql`'Jo   h     n'` });\n\t\t\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n\t\t});\n\n\t\ttest('prepared statement', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst statement = db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.prepare('statement1');\n\t\t\tconst result = await statement.execute();\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert: placeholders on columns with encoder', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst statement = db.insert(usersTable).values({\n\t\t\t\tname: 'John',\n\t\t\t\tjsonb: sql.placeholder('jsonb'),\n\t\t\t}).prepare('encoder_statement');\n\n\t\t\tawait statement.execute({ jsonb: ['foo', 'bar'] });\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tjsonb: usersTable.jsonb,\n\t\t\t\t})\n\t\t\t\t.from(usersTable);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, jsonb: ['foo', 'bar'] },\n\t\t\t]);\n\t\t});\n\n\t\ttest('prepared statement reuse', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst stmt = db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({\n\t\t\t\t\tverified: true,\n\t\t\t\t\tname: sql.placeholder('name'),\n\t\t\t\t})\n\t\t\t\t.prepare('stmt2');\n\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tawait stmt.execute({ name: `John ${i}` });\n\t\t\t}\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t\tverified: usersTable.verified,\n\t\t\t\t})\n\t\t\t\t.from(usersTable);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John 0', verified: true },\n\t\t\t\t{ id: 2, name: 'John 1', verified: true },\n\t\t\t\t{ id: 3, name: 'John 2', verified: true },\n\t\t\t\t{ id: 4, name: 'John 3', verified: true },\n\t\t\t\t{ id: 5, name: 'John 4', verified: true },\n\t\t\t\t{ id: 6, name: 'John 5', verified: true },\n\t\t\t\t{ id: 7, name: 'John 6', verified: true },\n\t\t\t\t{ id: 8, name: 'John 7', verified: true },\n\t\t\t\t{ id: 9, name: 'John 8', verified: true },\n\t\t\t\t{ id: 10, name: 'John 9', verified: true },\n\t\t\t]);\n\t\t});\n\n\t\ttest('prepared statement with placeholder in .where', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst stmt = db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t\t\t.prepare('stmt3');\n\t\t\tconst result = await stmt.execute({ id: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('prepared statement with placeholder in .limit', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst stmt = db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t\t\t.limit(sql.placeholder('limit'))\n\t\t\t\t.prepare('stmt_limit');\n\n\t\t\tconst result = await stmt.execute({ id: 1, limit: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t\texpect(result).toHaveLength(1);\n\t\t});\n\n\t\ttest('prepared statement with placeholder in .offset', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]);\n\t\t\tconst stmt = db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.offset(sql.placeholder('offset'))\n\t\t\t\t.prepare('stmt_offset');\n\n\t\t\tconst result = await stmt.execute({ offset: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 2, name: 'John1' }]);\n\t\t});\n\n\t\ttest('prepared statement built using $dynamic', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tfunction withLimitOffset(qb: any) {\n\t\t\t\treturn qb.limit(sql.placeholder('limit')).offset(sql.placeholder('offset'));\n\t\t\t}\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]);\n\t\t\tconst stmt = db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.$dynamic();\n\t\t\twithLimitOffset(stmt).prepare('stmt_limit');\n\n\t\t\tconst result = await stmt.execute({ limit: 1, offset: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 2, name: 'John1' }]);\n\t\t\texpect(result).toHaveLength(1);\n\t\t});\n\n\t\t// TODO change tests to new structure\n\t\ttest('Query check: Insert all defaults in 1 row', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tconst query = db\n\t\t\t\t.insert(users)\n\t\t\t\t.values({})\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql: 'insert into \"users\" (\"id\", \"name\", \"state\") values (default, default, default)',\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t});\n\n\t\ttest('Query check: Insert all defaults in multiple rows', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state').default('UA'),\n\t\t\t});\n\n\t\t\tconst query = db\n\t\t\t\t.insert(users)\n\t\t\t\t.values([{}, {}])\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql:\n\t\t\t\t\t'insert into \"users\" (\"id\", \"name\", \"state\") values (default, default, default), (default, default, default)',\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t});\n\n\t\ttest('Insert all defaults in 1 row', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('empty_insert_single', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial primary key, name text default 'Dan', state text)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values({});\n\n\t\t\tconst res = await db.select().from(users);\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'Dan', state: null }]);\n\t\t});\n\n\t\ttest('Insert all defaults in multiple rows', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('empty_insert_multiple', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial primary key, name text default 'Dan', state text)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values([{}, {}]);\n\n\t\t\tconst res = await db.select().from(users);\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'Dan', state: null }, { id: 2, name: 'Dan', state: null }]);\n\t\t});\n\n\t\ttest('build query insert with onConflict do update', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst query = db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t\t\t.onConflictDoUpdate({ target: usersTable.id, set: { name: 'John1' } })\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql:\n\t\t\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\") do update set \"name\" = $3',\n\t\t\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t\t\t});\n\t\t});\n\n\t\ttest('build query insert with onConflict do update / multiple columns', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst query = db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t\t\t.onConflictDoUpdate({ target: [usersTable.id, usersTable.name], set: { name: 'John1' } })\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql:\n\t\t\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\",\"name\") do update set \"name\" = $3',\n\t\t\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t\t\t});\n\t\t});\n\n\t\ttest('build query insert with onConflict do nothing', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst query = db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t\t\t.onConflictDoNothing()\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql:\n\t\t\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict do nothing',\n\t\t\t\tparams: ['John', '[\"foo\",\"bar\"]'],\n\t\t\t});\n\t\t});\n\n\t\ttest('build query insert with onConflict do nothing + target', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst query = db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t\t\t.onConflictDoNothing({ target: usersTable.id })\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql:\n\t\t\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\") do nothing',\n\t\t\t\tparams: ['John', '[\"foo\",\"bar\"]'],\n\t\t\t});\n\t\t});\n\n\t\ttest('insert with onConflict do update', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\tawait db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John' })\n\t\t\t\t.onConflictDoUpdate({ target: usersTable.id, set: { name: 'John1' } });\n\n\t\t\tconst res = await db\n\t\t\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, 1));\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John1' }]);\n\t\t});\n\n\t\ttest('insert with onConflict do nothing', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: 'John' }).onConflictDoNothing();\n\n\t\t\tconst res = await db\n\t\t\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, 1));\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert with onConflict do nothing + target', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\tawait db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John' })\n\t\t\t\t.onConflictDoNothing({ target: usersTable.id });\n\n\t\t\tconst res = await db\n\t\t\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, 1));\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('left join (flat object fields)', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst { id: cityId } = await db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }])\n\t\t\t\t.returning({ id: citiesTable.id })\n\t\t\t\t.then((rows) => rows[0]!);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId }, { name: 'Jane' }]);\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users2Table.id,\n\t\t\t\t\tuserName: users2Table.name,\n\t\t\t\t\tcityId: citiesTable.id,\n\t\t\t\t\tcityName: citiesTable.name,\n\t\t\t\t})\n\t\t\t\t.from(users2Table)\n\t\t\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id));\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{ userId: 1, userName: 'John', cityId, cityName: 'Paris' },\n\t\t\t\t{ userId: 2, userName: 'Jane', cityId: null, cityName: null },\n\t\t\t]);\n\t\t});\n\n\t\ttest('left join (grouped fields)', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst { id: cityId } = await db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }])\n\t\t\t\t.returning({ id: citiesTable.id })\n\t\t\t\t.then((rows) => rows[0]!);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId }, { name: 'Jane' }]);\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: users2Table.id,\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tname: users2Table.name,\n\t\t\t\t\t\tnameUpper: sql<string>`upper(${users2Table.name})`,\n\t\t\t\t\t},\n\t\t\t\t\tcity: {\n\t\t\t\t\t\tid: citiesTable.id,\n\t\t\t\t\t\tname: citiesTable.name,\n\t\t\t\t\t\tnameUpper: sql<string>`upper(${citiesTable.name})`,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t.from(users2Table)\n\t\t\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id));\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tuser: { name: 'John', nameUpper: 'JOHN' },\n\t\t\t\t\tcity: { id: cityId, name: 'Paris', nameUpper: 'PARIS' },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tuser: { name: 'Jane', nameUpper: 'JANE' },\n\t\t\t\t\tcity: null,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('left join (all fields)', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst { id: cityId } = await db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }])\n\t\t\t\t.returning({ id: citiesTable.id })\n\t\t\t\t.then((rows) => rows[0]!);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId }, { name: 'Jane' }]);\n\n\t\t\tconst res = await db\n\t\t\t\t.select()\n\t\t\t\t.from(users2Table)\n\t\t\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id));\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{\n\t\t\t\t\tusers2: {\n\t\t\t\t\t\tid: 1,\n\t\t\t\t\t\tname: 'John',\n\t\t\t\t\t\tcityId,\n\t\t\t\t\t},\n\t\t\t\t\tcities: {\n\t\t\t\t\t\tid: cityId,\n\t\t\t\t\t\tname: 'Paris',\n\t\t\t\t\t\tstate: null,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers2: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Jane',\n\t\t\t\t\t\tcityId: null,\n\t\t\t\t\t},\n\t\t\t\t\tcities: null,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('select from a many subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst res = await db.select({\n\t\t\t\tpopulation: db.select({ count: count().as('count') }).from(users2Table).where(\n\t\t\t\t\teq(users2Table.cityId, citiesTable.id),\n\t\t\t\t).as(\n\t\t\t\t\t'population',\n\t\t\t\t),\n\t\t\t\tname: citiesTable.name,\n\t\t\t}).from(citiesTable);\n\n\t\t\texpectTypeOf(res).toEqualTypeOf<{\n\t\t\t\tpopulation: number;\n\t\t\t\tname: string;\n\t\t\t}[]>();\n\n\t\t\texpect(res).toStrictEqual([{\n\t\t\t\tpopulation: 1,\n\t\t\t\tname: 'Paris',\n\t\t\t}, {\n\t\t\t\tpopulation: 2,\n\t\t\t\tname: 'London',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('select from a one subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst res = await db.select({\n\t\t\t\tcityName: db.select({ name: citiesTable.name }).from(citiesTable).where(eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t\t.as(\n\t\t\t\t\t\t'cityName',\n\t\t\t\t\t),\n\t\t\t\tname: users2Table.name,\n\t\t\t}).from(users2Table);\n\n\t\t\texpectTypeOf(res).toEqualTypeOf<{\n\t\t\t\tcityName: string;\n\t\t\t\tname: string;\n\t\t\t}[]>();\n\n\t\t\texpect(res).toStrictEqual([{\n\t\t\t\tcityName: 'Paris',\n\t\t\t\tname: 'John',\n\t\t\t}, {\n\t\t\t\tcityName: 'London',\n\t\t\t\tname: 'Jane',\n\t\t\t}, {\n\t\t\t\tcityName: 'London',\n\t\t\t\tname: 'Jack',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('join subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db\n\t\t\t\t.insert(courseCategoriesTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'Category 1' },\n\t\t\t\t\t{ name: 'Category 2' },\n\t\t\t\t\t{ name: 'Category 3' },\n\t\t\t\t\t{ name: 'Category 4' },\n\t\t\t\t]);\n\n\t\t\tawait db\n\t\t\t\t.insert(coursesTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'Development', categoryId: 2 },\n\t\t\t\t\t{ name: 'IT & Software', categoryId: 3 },\n\t\t\t\t\t{ name: 'Marketing', categoryId: 4 },\n\t\t\t\t\t{ name: 'Design', categoryId: 1 },\n\t\t\t\t]);\n\n\t\t\tconst sq2 = db\n\t\t\t\t.select({\n\t\t\t\t\tcategoryId: courseCategoriesTable.id,\n\t\t\t\t\tcategory: courseCategoriesTable.name,\n\t\t\t\t\ttotal: sql<number>`count(${courseCategoriesTable.id})`,\n\t\t\t\t})\n\t\t\t\t.from(courseCategoriesTable)\n\t\t\t\t.groupBy(courseCategoriesTable.id, courseCategoriesTable.name)\n\t\t\t\t.as('sq2');\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tcourseName: coursesTable.name,\n\t\t\t\t\tcategoryId: sq2.categoryId,\n\t\t\t\t})\n\t\t\t\t.from(coursesTable)\n\t\t\t\t.leftJoin(sq2, eq(coursesTable.categoryId, sq2.categoryId))\n\t\t\t\t.orderBy(coursesTable.name);\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{ courseName: 'Design', categoryId: 1 },\n\t\t\t\t{ courseName: 'Development', categoryId: 2 },\n\t\t\t\t{ courseName: 'IT & Software', categoryId: 3 },\n\t\t\t\t{ courseName: 'Marketing', categoryId: 4 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('with ... select', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(orders).values([\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t\t\t]);\n\n\t\t\tconst regionalSales = db\n\t\t\t\t.$with('regional_sales')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tregion: orders.region,\n\t\t\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(orders)\n\t\t\t\t\t\t.groupBy(orders.region),\n\t\t\t\t);\n\n\t\t\tconst topRegions = db\n\t\t\t\t.$with('top_regions')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tregion: regionalSales.region,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(regionalSales)\n\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\tgt(\n\t\t\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\t\t\tdb.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\tconst result1 = await db\n\t\t\t\t.with(regionalSales, topRegions)\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\tproduct: orders.product,\n\t\t\t\t\tproductUnits: sql<number>`sum(${orders.quantity})::int`,\n\t\t\t\t\tproductSales: sql<number>`sum(${orders.amount})::int`,\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t\t\t.groupBy(orders.region, orders.product)\n\t\t\t\t.orderBy(orders.region, orders.product);\n\t\t\tconst result2 = await db\n\t\t\t\t.with(regionalSales, topRegions)\n\t\t\t\t.selectDistinct({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\tproduct: orders.product,\n\t\t\t\t\tproductUnits: sql<number>`sum(${orders.quantity})::int`,\n\t\t\t\t\tproductSales: sql<number>`sum(${orders.amount})::int`,\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t\t\t.groupBy(orders.region, orders.product)\n\t\t\t\t.orderBy(orders.region, orders.product);\n\t\t\tconst result3 = await db\n\t\t\t\t.with(regionalSales, topRegions)\n\t\t\t\t.selectDistinctOn([orders.region], {\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\tproductUnits: sql<number>`sum(${orders.quantity})::int`,\n\t\t\t\t\tproductSales: sql<number>`sum(${orders.amount})::int`,\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t\t\t.groupBy(orders.region)\n\t\t\t\t.orderBy(orders.region);\n\n\t\t\texpect(result1).toEqual([\n\t\t\t\t{\n\t\t\t\t\tregion: 'Europe',\n\t\t\t\t\tproduct: 'A',\n\t\t\t\t\tproductUnits: 3,\n\t\t\t\t\tproductSales: 30,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'Europe',\n\t\t\t\t\tproduct: 'B',\n\t\t\t\t\tproductUnits: 5,\n\t\t\t\t\tproductSales: 50,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'US',\n\t\t\t\t\tproduct: 'A',\n\t\t\t\t\tproductUnits: 7,\n\t\t\t\t\tproductSales: 70,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'US',\n\t\t\t\t\tproduct: 'B',\n\t\t\t\t\tproductUnits: 9,\n\t\t\t\t\tproductSales: 90,\n\t\t\t\t},\n\t\t\t]);\n\t\t\texpect(result2).toEqual(result1);\n\t\t\texpect(result3).toEqual([\n\t\t\t\t{\n\t\t\t\t\tregion: 'Europe',\n\t\t\t\t\tproductUnits: 8,\n\t\t\t\t\tproductSales: 80,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'US',\n\t\t\t\t\tproductUnits: 16,\n\t\t\t\t\tproductSales: 160,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('with ... update', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst products = pgTable('products', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tprice: numeric('price').notNull(),\n\t\t\t\tcheap: boolean('cheap').notNull().default(false),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${products}`);\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table ${products} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\tprice numeric not null,\n\t\t\t\t\tcheap boolean not null default false\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.insert(products).values([\n\t\t\t\t{ price: '10.99' },\n\t\t\t\t{ price: '25.85' },\n\t\t\t\t{ price: '32.99' },\n\t\t\t\t{ price: '2.50' },\n\t\t\t\t{ price: '4.59' },\n\t\t\t]);\n\n\t\t\tconst averagePrice = db\n\t\t\t\t.$with('average_price')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tvalue: sql`avg(${products.price})`.as('value'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(products),\n\t\t\t\t);\n\n\t\t\tconst result = await db\n\t\t\t\t.with(averagePrice)\n\t\t\t\t.update(products)\n\t\t\t\t.set({\n\t\t\t\t\tcheap: true,\n\t\t\t\t})\n\t\t\t\t.where(lt(products.price, sql`(select * from ${averagePrice})`))\n\t\t\t\t.returning({\n\t\t\t\t\tid: products.id,\n\t\t\t\t});\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1 },\n\t\t\t\t{ id: 4 },\n\t\t\t\t{ id: 5 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('with ... insert', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tusername: text('username').notNull(),\n\t\t\t\tadmin: boolean('admin').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (username text not null, admin boolean not null default false)`);\n\n\t\t\tconst userCount = db\n\t\t\t\t.$with('user_count')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tvalue: sql`count(*)`.as('value'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(users),\n\t\t\t\t);\n\n\t\t\tconst result = await db\n\t\t\t\t.with(userCount)\n\t\t\t\t.insert(users)\n\t\t\t\t.values([\n\t\t\t\t\t{ username: 'user1', admin: sql`((select * from ${userCount}) = 0)` },\n\t\t\t\t])\n\t\t\t\t.returning({\n\t\t\t\t\tadmin: users.admin,\n\t\t\t\t});\n\n\t\t\texpect(result).toEqual([{ admin: true }]);\n\t\t});\n\n\t\ttest('with ... delete', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(orders).values([\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t\t\t]);\n\n\t\t\tconst averageAmount = db\n\t\t\t\t.$with('average_amount')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tvalue: sql`avg(${orders.amount})`.as('value'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(orders),\n\t\t\t\t);\n\n\t\t\tconst result = await db\n\t\t\t\t.with(averageAmount)\n\t\t\t\t.delete(orders)\n\t\t\t\t.where(gt(orders.amount, sql`(select * from ${averageAmount})`))\n\t\t\t\t.returning({\n\t\t\t\t\tid: orders.id,\n\t\t\t\t});\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 6 },\n\t\t\t\t{ id: 7 },\n\t\t\t\t{ id: 8 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('select from subquery sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John' }, { name: 'Jane' }]);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({ name: sql<string>`${users2Table.name} || ' modified'`.as('name') })\n\t\t\t\t.from(users2Table)\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = await db.select({ name: sq.name }).from(sq);\n\n\t\t\texpect(res).toEqual([{ name: 'John modified' }, { name: 'Jane modified' }]);\n\t\t});\n\n\t\ttest('select a field without joining its table', (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\texpect(() => db.select({ name: users2Table.name }).from(usersTable).prepare('query')).toThrowError();\n\t\t});\n\n\t\ttest('select all fields from subquery without alias', (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst sq = db.$with('sq').as(db.select({ name: sql<string>`upper(${users2Table.name})` }).from(users2Table));\n\n\t\t\texpect(() => db.select().from(sq).prepare('query')).toThrowError();\n\t\t});\n\n\t\ttest('select count()', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }]);\n\n\t\t\tconst res = await db.select({ count: sql`count(*)` }).from(usersTable);\n\n\t\t\texpect(res).toEqual([{ count: '2' }]);\n\t\t});\n\n\t\ttest('select count w/ custom mapper', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tfunction count(value: PgColumn | SQLWrapper): SQL<number>;\n\t\t\tfunction count(value: PgColumn | SQLWrapper, alias: string): SQL.Aliased<number>;\n\t\t\tfunction count(value: PgColumn | SQLWrapper, alias?: string): SQL<number> | SQL.Aliased<number> {\n\t\t\t\tconst result = sql`count(${value})`.mapWith(Number);\n\t\t\t\tif (!alias) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\treturn result.as(alias);\n\t\t\t}\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }]);\n\n\t\t\tconst res = await db.select({ count: count(sql`*`) }).from(usersTable);\n\n\t\t\texpect(res).toEqual([{ count: 2 }]);\n\t\t});\n\n\t\ttest('network types', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst value: typeof network.$inferSelect = {\n\t\t\t\tinet: '127.0.0.1',\n\t\t\t\tcidr: '192.168.100.128/25',\n\t\t\t\tmacaddr: '08:00:2b:01:02:03',\n\t\t\t\tmacaddr8: '08:00:2b:01:02:03:04:05',\n\t\t\t};\n\n\t\t\tawait db.insert(network).values(value);\n\n\t\t\tconst res = await db.select().from(network);\n\n\t\t\texpect(res).toEqual([value]);\n\t\t});\n\n\t\ttest('array types', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst values: typeof salEmp.$inferSelect[] = [\n\t\t\t\t{\n\t\t\t\t\tname: 'John',\n\t\t\t\t\tpayByQuarter: [10000, 10000, 10000, 10000],\n\t\t\t\t\tschedule: [['meeting', 'lunch'], ['training', 'presentation']],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'Carol',\n\t\t\t\t\tpayByQuarter: [20000, 25000, 25000, 25000],\n\t\t\t\t\tschedule: [['breakfast', 'consulting'], ['meeting', 'lunch']],\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tawait db.insert(salEmp).values(values);\n\n\t\t\tconst res = await db.select().from(salEmp);\n\n\t\t\texpect(res).toEqual(values);\n\t\t});\n\n\t\ttest('select for ...', (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\t{\n\t\t\t\tconst query = db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(users2Table)\n\t\t\t\t\t.for('update')\n\t\t\t\t\t.toSQL();\n\n\t\t\t\texpect(query.sql).toMatch(/ for update$/);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst query = db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(users2Table)\n\t\t\t\t\t.for('update', { of: [users2Table, coursesTable] })\n\t\t\t\t\t.toSQL();\n\n\t\t\t\texpect(query.sql).toMatch(/ for update of \"users2\", \"courses\"$/);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst query = db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(users2Table)\n\t\t\t\t\t.for('no key update', { of: users2Table })\n\t\t\t\t\t.toSQL();\n\n\t\t\t\texpect(query.sql).toMatch(/for no key update of \"users2\"$/);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst query = db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(users2Table)\n\t\t\t\t\t.for('no key update', { of: users2Table, skipLocked: true })\n\t\t\t\t\t.toSQL();\n\n\t\t\t\texpect(query.sql).toMatch(/ for no key update of \"users2\" skip locked$/);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst query = db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(users2Table)\n\t\t\t\t\t.for('share', { of: users2Table, noWait: true })\n\t\t\t\t\t.toSQL();\n\n\t\t\t\texpect(query.sql).toMatch(/for share of \"users2\" nowait$/);\n\t\t\t}\n\t\t});\n\n\t\ttest('having', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(citiesTable).values([{ name: 'London' }, { name: 'Paris' }, { name: 'New York' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane', cityId: 1 }, {\n\t\t\t\tname: 'Jack',\n\t\t\t\tcityId: 2,\n\t\t\t}]);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: citiesTable.id,\n\t\t\t\t\tname: sql<string>`upper(${citiesTable.name})`.as('upper_name'),\n\t\t\t\t\tusersCount: sql<number>`count(${users2Table.id})::int`.as('users_count'),\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.leftJoin(users2Table, eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.where(({ name }) => sql`length(${name}) >= 3`)\n\t\t\t\t.groupBy(citiesTable.id)\n\t\t\t\t.having(({ usersCount }) => sql`${usersCount} > 0`)\n\t\t\t\t.orderBy(({ name }) => name);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tname: 'LONDON',\n\t\t\t\t\tusersCount: 2,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'PARIS',\n\t\t\t\t\tusersCount: 1,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('view', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst newYorkers1 = pgView('new_yorkers')\n\t\t\t\t.as((qb) => qb.select().from(users2Table).where(eq(users2Table.cityId, 1)));\n\n\t\t\tconst newYorkers2 = pgView('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t}).as(sql`select * from ${users2Table} where ${eq(users2Table.cityId, 1)}`);\n\n\t\t\tconst newYorkers3 = pgView('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t}).existing();\n\n\t\t\tawait db.execute(sql`create view ${newYorkers1} as ${getViewConfig(newYorkers1).query}`);\n\n\t\t\tawait db.insert(citiesTable).values([{ name: 'New York' }, { name: 'Paris' }]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 1 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers1);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers2);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers3);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\tawait db.execute(sql`drop view ${newYorkers1}`);\n\t\t});\n\n\t\t// NEXT\n\t\ttest('materialized view', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst newYorkers1 = pgMaterializedView('new_yorkers')\n\t\t\t\t.as((qb) => qb.select().from(users2Table).where(eq(users2Table.cityId, 1)));\n\n\t\t\tconst newYorkers2 = pgMaterializedView('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t}).as(sql`select * from ${users2Table} where ${eq(users2Table.cityId, 1)}`);\n\n\t\t\tconst newYorkers3 = pgMaterializedView('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t}).existing();\n\n\t\t\tawait db.execute(sql`create materialized view ${newYorkers1} as ${getMaterializedViewConfig(newYorkers1).query}`);\n\n\t\t\tawait db.insert(citiesTable).values([{ name: 'New York' }, { name: 'Paris' }]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 1 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers1);\n\t\t\t\texpect(result).toEqual([]);\n\t\t\t}\n\n\t\t\tawait db.refreshMaterializedView(newYorkers1);\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers1);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers2);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers3);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\tawait db.execute(sql`drop materialized view ${newYorkers1}`);\n\t\t});\n\n\t\ttest('select from existing view', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst schema = pgSchema('test_schema');\n\n\t\t\tconst newYorkers = schema.view('new_yorkers', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t}).existing();\n\n\t\t\tawait db.execute(sql`drop schema if exists ${schema} cascade`);\n\t\t\tawait db.execute(sql`create schema ${schema}`);\n\t\t\tawait db.execute(sql`create view ${newYorkers} as select id from ${usersTable}`);\n\n\t\t\tawait db.insert(usersTable).values({ id: 100, name: 'John' });\n\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t}).from(usersTable).innerJoin(newYorkers, eq(newYorkers.id, usersTable.id));\n\n\t\t\texpect(result).toEqual([{ id: 100 }]);\n\t\t});\n\n\t\t// TODO: copy to SQLite and MySQL, add to docs\n\t\ttest('select from raw sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst result = await db.select({\n\t\t\t\tid: sql<number>`id`,\n\t\t\t\tname: sql<string>`name`,\n\t\t\t}).from(sql`(select 1 as id, 'John' as name) as users`);\n\n\t\t\tExpect<Equal<{ id: number; name: string }[], typeof result>>;\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('select from raw sql with joins', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: sql<number>`users.id`,\n\t\t\t\t\tname: sql<string>`users.name`,\n\t\t\t\t\tuserCity: sql<string>`users.city`,\n\t\t\t\t\tcityName: sql<string>`cities.name`,\n\t\t\t\t})\n\t\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, sql`cities.id = users.id`);\n\n\t\t\tExpect<Equal<{ id: number; name: string; userCity: string; cityName: string }[], typeof result>>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', userCity: 'New York', cityName: 'Paris' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('join on aliased sql from select', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: sql<number>`users.id`.as('userId'),\n\t\t\t\t\tname: sql<string>`users.name`,\n\t\t\t\t\tuserCity: sql<string>`users.city`,\n\t\t\t\t\tcityId: sql<number>`cities.id`.as('cityId'),\n\t\t\t\t\tcityName: sql<string>`cities.name`,\n\t\t\t\t})\n\t\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, (cols) => eq(cols.cityId, cols.userId));\n\n\t\t\tExpect<\n\t\t\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t\t\t>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('join on aliased sql from with clause', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = db.$with('users').as(\n\t\t\t\tdb.select({\n\t\t\t\t\tid: sql<number>`id`.as('userId'),\n\t\t\t\t\tname: sql<string>`name`.as('userName'),\n\t\t\t\t\tcity: sql<string>`city`.as('city'),\n\t\t\t\t}).from(\n\t\t\t\t\tsql`(select 1 as id, 'John' as name, 'New York' as city) as users`,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst cities = db.$with('cities').as(\n\t\t\t\tdb.select({\n\t\t\t\t\tid: sql<number>`id`.as('cityId'),\n\t\t\t\t\tname: sql<string>`name`.as('cityName'),\n\t\t\t\t}).from(\n\t\t\t\t\tsql`(select 1 as id, 'Paris' as name) as cities`,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst result = await db\n\t\t\t\t.with(users, cities)\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users.id,\n\t\t\t\t\tname: users.name,\n\t\t\t\t\tuserCity: users.city,\n\t\t\t\t\tcityId: cities.id,\n\t\t\t\t\tcityName: cities.name,\n\t\t\t\t})\n\t\t\t\t.from(users)\n\t\t\t\t.leftJoin(cities, (cols) => eq(cols.cityId, cols.userId));\n\n\t\t\tExpect<\n\t\t\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t\t\t>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('prefixed table', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst pgTable = pgTableCreator((name) => `myprefix_${name}`);\n\n\t\t\tconst users = pgTable('test_prefixed_table_with_unique_name', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table myprefix_test_prefixed_table_with_unique_name (id integer not null primary key, name text not null)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values({ id: 1, name: 'John' });\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('select from enum as ts enum', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tenum Muscle {\n\t\t\t\tabdominals = 'abdominals',\n\t\t\t\thamstrings = 'hamstrings',\n\t\t\t\tadductors = 'adductors',\n\t\t\t\tquadriceps = 'quadriceps',\n\t\t\t\tbiceps = 'biceps',\n\t\t\t\tshoulders = 'shoulders',\n\t\t\t\tchest = 'chest',\n\t\t\t\tmiddle_back = 'middle_back',\n\t\t\t\tcalves = 'calves',\n\t\t\t\tglutes = 'glutes',\n\t\t\t\tlower_back = 'lower_back',\n\t\t\t\tlats = 'lats',\n\t\t\t\ttriceps = 'triceps',\n\t\t\t\ttraps = 'traps',\n\t\t\t\tforearms = 'forearms',\n\t\t\t\tneck = 'neck',\n\t\t\t\tabductors = 'abductors',\n\t\t\t}\n\n\t\t\tenum Force {\n\t\t\t\tisometric = 'isometric',\n\t\t\t\tisotonic = 'isotonic',\n\t\t\t\tisokinetic = 'isokinetic',\n\t\t\t}\n\n\t\t\tenum Level {\n\t\t\t\tbeginner = 'beginner',\n\t\t\t\tintermediate = 'intermediate',\n\t\t\t\tadvanced = 'advanced',\n\t\t\t}\n\n\t\t\tenum Mechanic {\n\t\t\t\tcompound = 'compound',\n\t\t\t\tisolation = 'isolation',\n\t\t\t}\n\n\t\t\tenum Equipment {\n\t\t\t\tbarbell = 'barbell',\n\t\t\t\tdumbbell = 'dumbbell',\n\t\t\t\tbodyweight = 'bodyweight',\n\t\t\t\tmachine = 'machine',\n\t\t\t\tcable = 'cable',\n\t\t\t\tkettlebell = 'kettlebell',\n\t\t\t}\n\n\t\t\tenum Category {\n\t\t\t\tupper_body = 'upper_body',\n\t\t\t\tlower_body = 'lower_body',\n\t\t\t\tfull_body = 'full_body',\n\t\t\t}\n\n\t\t\tconst muscleEnum = pgEnum('muscle', Muscle);\n\n\t\t\tconst forceEnum = pgEnum('force', Force);\n\n\t\t\tconst levelEnum = pgEnum('level', Level);\n\n\t\t\tconst mechanicEnum = pgEnum('mechanic', Mechanic);\n\n\t\t\tconst equipmentEnum = pgEnum('equipment', Equipment);\n\n\t\t\tconst categoryEnum = pgEnum('category', Category);\n\n\t\t\tconst exercises = pgTable('exercises', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: varchar('name').notNull(),\n\t\t\t\tforce: forceEnum('force'),\n\t\t\t\tlevel: levelEnum('level'),\n\t\t\t\tmechanic: mechanicEnum('mechanic'),\n\t\t\t\tequipment: equipmentEnum('equipment'),\n\t\t\t\tinstructions: text('instructions'),\n\t\t\t\tcategory: categoryEnum('category'),\n\t\t\t\tprimaryMuscles: muscleEnum('primary_muscles').array(),\n\t\t\t\tsecondaryMuscles: muscleEnum('secondary_muscles').array(),\n\t\t\t\tcreatedAt: timestamp('created_at').notNull().default(sql`now()`),\n\t\t\t\tupdatedAt: timestamp('updated_at').notNull().default(sql`now()`),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${exercises}`);\n\t\t\tawait db.execute(sql`drop type if exists ${sql.identifier(muscleEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type if exists ${sql.identifier(forceEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type if exists ${sql.identifier(levelEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type if exists ${sql.identifier(mechanicEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type if exists ${sql.identifier(equipmentEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type if exists ${sql.identifier(categoryEnum.enumName)}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create type ${\n\t\t\t\t\tsql.identifier(muscleEnum.enumName)\n\t\t\t\t} as enum ('abdominals', 'hamstrings', 'adductors', 'quadriceps', 'biceps', 'shoulders', 'chest', 'middle_back', 'calves', 'glutes', 'lower_back', 'lats', 'triceps', 'traps', 'forearms', 'neck', 'abductors')`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create type ${sql.identifier(forceEnum.enumName)} as enum ('isometric', 'isotonic', 'isokinetic')`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create type ${sql.identifier(levelEnum.enumName)} as enum ('beginner', 'intermediate', 'advanced')`,\n\t\t\t);\n\t\t\tawait db.execute(sql`create type ${sql.identifier(mechanicEnum.enumName)} as enum ('compound', 'isolation')`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create type ${\n\t\t\t\t\tsql.identifier(equipmentEnum.enumName)\n\t\t\t\t} as enum ('barbell', 'dumbbell', 'bodyweight', 'machine', 'cable', 'kettlebell')`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create type ${sql.identifier(categoryEnum.enumName)} as enum ('upper_body', 'lower_body', 'full_body')`,\n\t\t\t);\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table ${exercises} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\tname varchar not null,\n\t\t\t\t\tforce force,\n\t\t\t\t\tlevel level,\n\t\t\t\t\tmechanic mechanic,\n\t\t\t\t\tequipment equipment,\n\t\t\t\t\tinstructions text,\n\t\t\t\t\tcategory category,\n\t\t\t\t\tprimary_muscles muscle[],\n\t\t\t\t\tsecondary_muscles muscle[],\n\t\t\t\t\tcreated_at timestamp not null default now(),\n\t\t\t\t\tupdated_at timestamp not null default now()\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.insert(exercises).values({\n\t\t\t\tname: 'Bench Press',\n\t\t\t\tforce: Force.isotonic,\n\t\t\t\tlevel: Level.beginner,\n\t\t\t\tmechanic: Mechanic.compound,\n\t\t\t\tequipment: Equipment.barbell,\n\t\t\t\tinstructions:\n\t\t\t\t\t'Lie on your back on a flat bench. Grasp the barbell with an overhand grip, slightly wider than shoulder width. Unrack the barbell and hold it over you with your arms locked. Lower the barbell to your chest. Press the barbell back to the starting position.',\n\t\t\t\tcategory: Category.upper_body,\n\t\t\t\tprimaryMuscles: [Muscle.chest, Muscle.triceps],\n\t\t\t\tsecondaryMuscles: [Muscle.shoulders, Muscle.traps],\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(exercises);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tname: 'Bench Press',\n\t\t\t\t\tforce: 'isotonic',\n\t\t\t\t\tlevel: 'beginner',\n\t\t\t\t\tmechanic: 'compound',\n\t\t\t\t\tequipment: 'barbell',\n\t\t\t\t\tinstructions:\n\t\t\t\t\t\t'Lie on your back on a flat bench. Grasp the barbell with an overhand grip, slightly wider than shoulder width. Unrack the barbell and hold it over you with your arms locked. Lower the barbell to your chest. Press the barbell back to the starting position.',\n\t\t\t\t\tcategory: 'upper_body',\n\t\t\t\t\tprimaryMuscles: ['chest', 'triceps'],\n\t\t\t\t\tsecondaryMuscles: ['shoulders', 'traps'],\n\t\t\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t\t\t\tupdatedAt: result[0]!.updatedAt,\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop table ${exercises}`);\n\t\t\tawait db.execute(sql`drop type ${sql.identifier(muscleEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type ${sql.identifier(forceEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type ${sql.identifier(levelEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type ${sql.identifier(mechanicEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type ${sql.identifier(equipmentEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type ${sql.identifier(categoryEnum.enumName)}`);\n\t\t});\n\n\t\ttest('select from enum', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst muscleEnum = pgEnum('muscle', [\n\t\t\t\t'abdominals',\n\t\t\t\t'hamstrings',\n\t\t\t\t'adductors',\n\t\t\t\t'quadriceps',\n\t\t\t\t'biceps',\n\t\t\t\t'shoulders',\n\t\t\t\t'chest',\n\t\t\t\t'middle_back',\n\t\t\t\t'calves',\n\t\t\t\t'glutes',\n\t\t\t\t'lower_back',\n\t\t\t\t'lats',\n\t\t\t\t'triceps',\n\t\t\t\t'traps',\n\t\t\t\t'forearms',\n\t\t\t\t'neck',\n\t\t\t\t'abductors',\n\t\t\t]);\n\n\t\t\tconst forceEnum = pgEnum('force', ['isometric', 'isotonic', 'isokinetic']);\n\n\t\t\tconst levelEnum = pgEnum('level', ['beginner', 'intermediate', 'advanced']);\n\n\t\t\tconst mechanicEnum = pgEnum('mechanic', ['compound', 'isolation']);\n\n\t\t\tconst equipmentEnum = pgEnum('equipment', [\n\t\t\t\t'barbell',\n\t\t\t\t'dumbbell',\n\t\t\t\t'bodyweight',\n\t\t\t\t'machine',\n\t\t\t\t'cable',\n\t\t\t\t'kettlebell',\n\t\t\t]);\n\n\t\t\tconst categoryEnum = pgEnum('category', ['upper_body', 'lower_body', 'full_body']);\n\n\t\t\tconst exercises = pgTable('exercises', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: varchar('name').notNull(),\n\t\t\t\tforce: forceEnum('force'),\n\t\t\t\tlevel: levelEnum('level'),\n\t\t\t\tmechanic: mechanicEnum('mechanic'),\n\t\t\t\tequipment: equipmentEnum('equipment'),\n\t\t\t\tinstructions: text('instructions'),\n\t\t\t\tcategory: categoryEnum('category'),\n\t\t\t\tprimaryMuscles: muscleEnum('primary_muscles').array(),\n\t\t\t\tsecondaryMuscles: muscleEnum('secondary_muscles').array(),\n\t\t\t\tcreatedAt: timestamp('created_at').notNull().default(sql`now()`),\n\t\t\t\tupdatedAt: timestamp('updated_at').notNull().default(sql`now()`),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${exercises}`);\n\t\t\tawait db.execute(sql`drop type if exists ${sql.identifier(muscleEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type if exists ${sql.identifier(forceEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type if exists ${sql.identifier(levelEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type if exists ${sql.identifier(mechanicEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type if exists ${sql.identifier(equipmentEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type if exists ${sql.identifier(categoryEnum.enumName)}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create type ${\n\t\t\t\t\tsql.identifier(muscleEnum.enumName)\n\t\t\t\t} as enum ('abdominals', 'hamstrings', 'adductors', 'quadriceps', 'biceps', 'shoulders', 'chest', 'middle_back', 'calves', 'glutes', 'lower_back', 'lats', 'triceps', 'traps', 'forearms', 'neck', 'abductors')`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create type ${sql.identifier(forceEnum.enumName)} as enum ('isometric', 'isotonic', 'isokinetic')`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create type ${sql.identifier(levelEnum.enumName)} as enum ('beginner', 'intermediate', 'advanced')`,\n\t\t\t);\n\t\t\tawait db.execute(sql`create type ${sql.identifier(mechanicEnum.enumName)} as enum ('compound', 'isolation')`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create type ${\n\t\t\t\t\tsql.identifier(equipmentEnum.enumName)\n\t\t\t\t} as enum ('barbell', 'dumbbell', 'bodyweight', 'machine', 'cable', 'kettlebell')`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create type ${sql.identifier(categoryEnum.enumName)} as enum ('upper_body', 'lower_body', 'full_body')`,\n\t\t\t);\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table ${exercises} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\tname varchar not null,\n\t\t\t\t\tforce force,\n\t\t\t\t\tlevel level,\n\t\t\t\t\tmechanic mechanic,\n\t\t\t\t\tequipment equipment,\n\t\t\t\t\tinstructions text,\n\t\t\t\t\tcategory category,\n\t\t\t\t\tprimary_muscles muscle[],\n\t\t\t\t\tsecondary_muscles muscle[],\n\t\t\t\t\tcreated_at timestamp not null default now(),\n\t\t\t\t\tupdated_at timestamp not null default now()\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.insert(exercises).values({\n\t\t\t\tname: 'Bench Press',\n\t\t\t\tforce: 'isotonic',\n\t\t\t\tlevel: 'beginner',\n\t\t\t\tmechanic: 'compound',\n\t\t\t\tequipment: 'barbell',\n\t\t\t\tinstructions:\n\t\t\t\t\t'Lie on your back on a flat bench. Grasp the barbell with an overhand grip, slightly wider than shoulder width. Unrack the barbell and hold it over you with your arms locked. Lower the barbell to your chest. Press the barbell back to the starting position.',\n\t\t\t\tcategory: 'upper_body',\n\t\t\t\tprimaryMuscles: ['chest', 'triceps'],\n\t\t\t\tsecondaryMuscles: ['shoulders', 'traps'],\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(exercises);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tname: 'Bench Press',\n\t\t\t\t\tforce: 'isotonic',\n\t\t\t\t\tlevel: 'beginner',\n\t\t\t\t\tmechanic: 'compound',\n\t\t\t\t\tequipment: 'barbell',\n\t\t\t\t\tinstructions:\n\t\t\t\t\t\t'Lie on your back on a flat bench. Grasp the barbell with an overhand grip, slightly wider than shoulder width. Unrack the barbell and hold it over you with your arms locked. Lower the barbell to your chest. Press the barbell back to the starting position.',\n\t\t\t\t\tcategory: 'upper_body',\n\t\t\t\t\tprimaryMuscles: ['chest', 'triceps'],\n\t\t\t\t\tsecondaryMuscles: ['shoulders', 'traps'],\n\t\t\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t\t\t\tupdatedAt: result[0]!.updatedAt,\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop table ${exercises}`);\n\t\t\tawait db.execute(sql`drop type ${sql.identifier(muscleEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type ${sql.identifier(forceEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type ${sql.identifier(levelEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type ${sql.identifier(mechanicEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type ${sql.identifier(equipmentEnum.enumName)}`);\n\t\t\tawait db.execute(sql`drop type ${sql.identifier(categoryEnum.enumName)}`);\n\t\t});\n\n\t\ttest('all date and time columns', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst table = pgTable('all_columns', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tdateString: date('date_string', { mode: 'string' }).notNull(),\n\t\t\t\ttime: time('time', { precision: 3 }).notNull(),\n\t\t\t\tdatetime: timestamp('datetime').notNull(),\n\t\t\t\tdatetimeWTZ: timestamp('datetime_wtz', { withTimezone: true }).notNull(),\n\t\t\t\tdatetimeString: timestamp('datetime_string', { mode: 'string' }).notNull(),\n\t\t\t\tdatetimeFullPrecision: timestamp('datetime_full_precision', { precision: 6, mode: 'string' }).notNull(),\n\t\t\t\tdatetimeWTZString: timestamp('datetime_wtz_string', { withTimezone: true, mode: 'string' }).notNull(),\n\t\t\t\tinterval: interval('interval').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${table}`);\n\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table ${table} (\n\t\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\t\tdate_string date not null,\n\t\t\t\t\t\t\ttime time(3) not null,\n\t\t\t\t\t\t\tdatetime timestamp not null,\n\t\t\t\t\t\t\tdatetime_wtz timestamp with time zone not null,\n\t\t\t\t\t\t\tdatetime_string timestamp not null,\n\t\t\t\t\t\t\tdatetime_full_precision timestamp(6) not null,\n\t\t\t\t\t\t\tdatetime_wtz_string timestamp with time zone not null,\n\t\t\t\t\t\t\tinterval interval not null\n\t\t\t\t\t)\n\t\t\t`);\n\n\t\t\tconst someDatetime = new Date('2022-01-01T00:00:00.123Z');\n\t\t\tconst fullPrecision = '2022-01-01T00:00:00.123456Z';\n\t\t\tconst someTime = '23:23:12.432';\n\n\t\t\tawait db.insert(table).values({\n\t\t\t\tdateString: '2022-01-01',\n\t\t\t\ttime: someTime,\n\t\t\t\tdatetime: someDatetime,\n\t\t\t\tdatetimeWTZ: someDatetime,\n\t\t\t\tdatetimeString: '2022-01-01T00:00:00.123Z',\n\t\t\t\tdatetimeFullPrecision: fullPrecision,\n\t\t\t\tdatetimeWTZString: '2022-01-01T00:00:00.123Z',\n\t\t\t\tinterval: '1 day',\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(table);\n\n\t\t\tExpect<\n\t\t\t\tEqual<{\n\t\t\t\t\tid: number;\n\t\t\t\t\tdateString: string;\n\t\t\t\t\ttime: string;\n\t\t\t\t\tdatetime: Date;\n\t\t\t\t\tdatetimeWTZ: Date;\n\t\t\t\t\tdatetimeString: string;\n\t\t\t\t\tdatetimeFullPrecision: string;\n\t\t\t\t\tdatetimeWTZString: string;\n\t\t\t\t\tinterval: string;\n\t\t\t\t}[], typeof result>\n\t\t\t>;\n\n\t\t\tExpect<\n\t\t\t\tEqual<{\n\t\t\t\t\tdateString: string;\n\t\t\t\t\ttime: string;\n\t\t\t\t\tdatetime: Date;\n\t\t\t\t\tdatetimeWTZ: Date;\n\t\t\t\t\tdatetimeString: string;\n\t\t\t\t\tdatetimeFullPrecision: string;\n\t\t\t\t\tdatetimeWTZString: string;\n\t\t\t\t\tinterval: string;\n\t\t\t\t\tid?: number | undefined;\n\t\t\t\t}, typeof table.$inferInsert>\n\t\t\t>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tdateString: '2022-01-01',\n\t\t\t\t\ttime: someTime,\n\t\t\t\t\tdatetime: someDatetime,\n\t\t\t\t\tdatetimeWTZ: someDatetime,\n\t\t\t\t\tdatetimeString: '2022-01-01 00:00:00.123',\n\t\t\t\t\tdatetimeFullPrecision: fullPrecision.replace('T', ' ').replace('Z', ''),\n\t\t\t\t\tdatetimeWTZString: '2022-01-01 00:00:00.123+00',\n\t\t\t\t\tinterval: '1 day',\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop table if exists ${table}`);\n\t\t});\n\n\t\ttest('all date and time columns with timezone second case mode date', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst table = pgTable('all_columns', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', withTimezone: true, precision: 3 }).notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${table}`);\n\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table ${table} (\n\t\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\t\ttimestamp_string timestamp(3) with time zone not null\n\t\t\t\t\t)\n\t\t\t`);\n\n\t\t\tconst insertedDate = new Date();\n\n\t\t\t// 1. Insert date as new date\n\t\t\tawait db.insert(table).values([\n\t\t\t\t{ timestamp: insertedDate },\n\t\t\t]);\n\n\t\t\t// 2, Select as date and check that timezones are the same\n\t\t\t// There is no way to check timezone in Date object, as it is always represented internally in UTC\n\t\t\tconst result = await db.select().from(table);\n\n\t\t\texpect(result).toEqual([{ id: 1, timestamp: insertedDate }]);\n\n\t\t\t// 3. Compare both dates\n\t\t\texpect(insertedDate.getTime()).toBe(result[0]?.timestamp.getTime());\n\n\t\t\tawait db.execute(sql`drop table if exists ${table}`);\n\t\t});\n\n\t\ttest('all date and time columns with timezone third case mode date', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst table = pgTable('all_columns', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', withTimezone: true, precision: 3 }).notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${table}`);\n\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table ${table} (\n\t\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\t\ttimestamp_string timestamp(3) with time zone not null\n\t\t\t\t\t)\n\t\t\t`);\n\n\t\t\tconst insertedDate = new Date('2022-01-01 20:00:00.123-04'); // used different time zones, internally is still UTC\n\t\t\tconst insertedDate2 = new Date('2022-01-02 04:00:00.123+04'); // They are both the same date in different time zones\n\n\t\t\t// 1. Insert date as new dates with different time zones\n\t\t\tawait db.insert(table).values([\n\t\t\t\t{ timestamp: insertedDate },\n\t\t\t\t{ timestamp: insertedDate2 },\n\t\t\t]);\n\n\t\t\t// 2, Select and compare both dates\n\t\t\tconst result = await db.select().from(table);\n\n\t\t\texpect(result[0]?.timestamp.getTime()).toBe(result[1]?.timestamp.getTime());\n\n\t\t\tawait db.execute(sql`drop table if exists ${table}`);\n\t\t});\n\n\t\ttest('orderBy with aliased column', (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst query = db.select({\n\t\t\t\ttest: sql`something`.as('test'),\n\t\t\t}).from(users2Table).orderBy((fields) => fields.test).toSQL();\n\n\t\t\texpect(query.sql).toBe('select something as \"test\" from \"users2\" order by \"test\"');\n\t\t});\n\n\t\ttest('select from sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst metricEntry = pgTable('metric_entry', {\n\t\t\t\tid: pgUuid('id').notNull(),\n\t\t\t\tcreatedAt: timestamp('created_at').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${metricEntry}`);\n\t\t\tawait db.execute(sql`create table ${metricEntry} (id uuid not null, created_at timestamp not null)`);\n\n\t\t\tconst metricId = uuidV4();\n\n\t\t\tconst intervals = db.$with('intervals').as(\n\t\t\t\tdb\n\t\t\t\t\t.select({\n\t\t\t\t\t\tstartTime: sql<string>`(date'2023-03-01'+ x * '1 day'::interval)`.as('start_time'),\n\t\t\t\t\t\tendTime: sql<string>`(date'2023-03-01'+ (x+1) *'1 day'::interval)`.as('end_time'),\n\t\t\t\t\t})\n\t\t\t\t\t.from(sql`generate_series(0, 29, 1) as t(x)`),\n\t\t\t);\n\n\t\t\tconst func = () =>\n\t\t\t\tdb\n\t\t\t\t\t.with(intervals)\n\t\t\t\t\t.select({\n\t\t\t\t\t\tstartTime: intervals.startTime,\n\t\t\t\t\t\tendTime: intervals.endTime,\n\t\t\t\t\t\tcount: sql<number>`count(${metricEntry})`,\n\t\t\t\t\t})\n\t\t\t\t\t.from(metricEntry)\n\t\t\t\t\t.rightJoin(\n\t\t\t\t\t\tintervals,\n\t\t\t\t\t\tand(\n\t\t\t\t\t\t\teq(metricEntry.id, metricId),\n\t\t\t\t\t\t\tgte(metricEntry.createdAt, intervals.startTime),\n\t\t\t\t\t\t\tlt(metricEntry.createdAt, intervals.endTime),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\t.groupBy(intervals.startTime, intervals.endTime)\n\t\t\t\t\t.orderBy(asc(intervals.startTime));\n\n\t\t\tawait expect((async () => {\n\t\t\t\tfunc();\n\t\t\t})()).resolves.not.toThrowError();\n\t\t});\n\n\t\ttest('timestamp timezone', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst usersTableWithAndWithoutTimezone = pgTable('users_test_with_and_without_timezone', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n\t\t\t\tupdatedAt: timestamp('updated_at', { withTimezone: false }).notNull().defaultNow(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${usersTableWithAndWithoutTimezone}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users_test_with_and_without_timezone (\n\t\t\t\t\t\tid serial not null primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tcreated_at timestamptz not null default now(),\n\t\t\t\t\t\tupdated_at timestamp not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tconst date = new Date(Date.parse('2020-01-01T00:00:00+04:00'));\n\n\t\t\tawait db.insert(usersTableWithAndWithoutTimezone).values({ name: 'With default times' });\n\t\t\tawait db.insert(usersTableWithAndWithoutTimezone).values({\n\t\t\t\tname: 'Without default times',\n\t\t\t\tcreatedAt: date,\n\t\t\t\tupdatedAt: date,\n\t\t\t});\n\t\t\tconst users = await db.select().from(usersTableWithAndWithoutTimezone);\n\n\t\t\t// check that the timestamps are set correctly for default times\n\t\t\texpect(Math.abs(users[0]!.updatedAt.getTime() - Date.now())).toBeLessThan(2000);\n\t\t\texpect(Math.abs(users[0]!.createdAt.getTime() - Date.now())).toBeLessThan(2000);\n\n\t\t\t// check that the timestamps are set correctly for non default times\n\t\t\texpect(Math.abs(users[1]!.updatedAt.getTime() - date.getTime())).toBeLessThan(2000);\n\t\t\texpect(Math.abs(users[1]!.createdAt.getTime() - date.getTime())).toBeLessThan(2000);\n\t\t});\n\n\t\ttest('transaction', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users_transactions', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tbalance: integer('balance').notNull(),\n\t\t\t});\n\t\t\tconst products = pgTable('products_transactions', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tprice: integer('price').notNull(),\n\t\t\t\tstock: integer('stock').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`drop table if exists ${products}`);\n\n\t\t\tawait db.execute(sql`create table users_transactions (id serial not null primary key, balance integer not null)`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table products_transactions (id serial not null primary key, price integer not null, stock integer not null)`,\n\t\t\t);\n\n\t\t\tconst user = await db.insert(users).values({ balance: 100 }).returning().then((rows) => rows[0]!);\n\t\t\tconst product = await db.insert(products).values({ price: 10, stock: 10 }).returning().then((rows) => rows[0]!);\n\n\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\tawait tx.update(users).set({ balance: user.balance - product.price }).where(eq(users.id, user.id));\n\t\t\t\tawait tx.update(products).set({ stock: product.stock - 1 }).where(eq(products.id, product.id));\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([{ id: 1, balance: 90 }]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t\tawait db.execute(sql`drop table ${products}`);\n\t\t});\n\n\t\ttest('transaction rollback', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users_transactions_rollback', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tbalance: integer('balance').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table users_transactions_rollback (id serial not null primary key, balance integer not null)`,\n\t\t\t);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\t\tawait tx.insert(users).values({ balance: 100 });\n\t\t\t\t\ttx.rollback();\n\t\t\t\t});\n\t\t\t})()).rejects.toThrowError(TransactionRollbackError);\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('nested transaction', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users_nested_transactions', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tbalance: integer('balance').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table users_nested_transactions (id serial not null primary key, balance integer not null)`,\n\t\t\t);\n\n\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\tawait tx.insert(users).values({ balance: 100 });\n\n\t\t\t\tawait tx.transaction(async (tx) => {\n\t\t\t\t\tawait tx.update(users).set({ balance: 200 });\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([{ id: 1, balance: 200 }]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('nested transaction rollback', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users_nested_transactions_rollback', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tbalance: integer('balance').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table users_nested_transactions_rollback (id serial not null primary key, balance integer not null)`,\n\t\t\t);\n\n\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\tawait tx.insert(users).values({ balance: 100 });\n\n\t\t\t\tawait expect((async () => {\n\t\t\t\t\tawait tx.transaction(async (tx) => {\n\t\t\t\t\t\tawait tx.update(users).set({ balance: 200 });\n\t\t\t\t\t\ttx.rollback();\n\t\t\t\t\t});\n\t\t\t\t})()).rejects.toThrowError(TransactionRollbackError);\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([{ id: 1, balance: 100 }]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('join subquery with join', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst internalStaff = pgTable('internal_staff', {\n\t\t\t\tuserId: integer('user_id').notNull(),\n\t\t\t});\n\n\t\t\tconst customUser = pgTable('custom_user', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t});\n\n\t\t\tconst ticket = pgTable('ticket', {\n\t\t\t\tstaffId: integer('staff_id').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${internalStaff}`);\n\t\t\tawait db.execute(sql`drop table if exists ${customUser}`);\n\t\t\tawait db.execute(sql`drop table if exists ${ticket}`);\n\n\t\t\tawait db.execute(sql`create table internal_staff (user_id integer not null)`);\n\t\t\tawait db.execute(sql`create table custom_user (id integer not null)`);\n\t\t\tawait db.execute(sql`create table ticket (staff_id integer not null)`);\n\n\t\t\tawait db.insert(internalStaff).values({ userId: 1 });\n\t\t\tawait db.insert(customUser).values({ id: 1 });\n\t\t\tawait db.insert(ticket).values({ staffId: 1 });\n\n\t\t\tconst subq = db\n\t\t\t\t.select()\n\t\t\t\t.from(internalStaff)\n\t\t\t\t.leftJoin(customUser, eq(internalStaff.userId, customUser.id))\n\t\t\t\t.as('internal_staff');\n\n\t\t\tconst mainQuery = await db\n\t\t\t\t.select()\n\t\t\t\t.from(ticket)\n\t\t\t\t.leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId));\n\n\t\t\texpect(mainQuery).toEqual([{\n\t\t\t\tticket: { staffId: 1 },\n\t\t\t\tinternal_staff: {\n\t\t\t\t\tinternal_staff: { userId: 1 },\n\t\t\t\t\tcustom_user: { id: 1 },\n\t\t\t\t},\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table ${internalStaff}`);\n\t\t\tawait db.execute(sql`drop table ${customUser}`);\n\t\t\tawait db.execute(sql`drop table ${ticket}`);\n\t\t});\n\n\t\ttest('subquery with view', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users_subquery_view', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t});\n\n\t\t\tconst newYorkers = pgView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`drop view if exists ${newYorkers}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t\t\t);\n\t\t\tawait db.execute(sql`create view ${newYorkers} as select * from ${users} where city_id = 1`);\n\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 1 },\n\t\t\t\t{ name: 'Jill', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst sq = db.$with('sq').as(db.select().from(newYorkers));\n\t\t\tconst result = await db.with(sq).select().from(sq);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t{ id: 3, name: 'Jack', cityId: 1 },\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop view ${newYorkers}`);\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('join view as subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users_join_view', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t});\n\n\t\t\tconst newYorkers = pgView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`drop view if exists ${newYorkers}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t\t\t);\n\t\t\tawait db.execute(sql`create view ${newYorkers} as select * from ${users} where city_id = 1`);\n\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 1 },\n\t\t\t\t{ name: 'Jill', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst sq = db.select().from(newYorkers).as('new_yorkers_sq');\n\n\t\t\tconst result = await db.select().from(users).leftJoin(sq, eq(users.id, sq.id));\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\tnew_yorkers_sq: { id: 1, name: 'John', cityId: 1 },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 2, name: 'Jane', cityId: 2 },\n\t\t\t\t\tnew_yorkers_sq: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 3, name: 'Jack', cityId: 1 },\n\t\t\t\t\tnew_yorkers_sq: { id: 3, name: 'Jack', cityId: 1 },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 4, name: 'Jill', cityId: 2 },\n\t\t\t\t\tnew_yorkers_sq: null,\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop view ${newYorkers}`);\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('table selection with single table', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values({ name: 'John', cityId: 1 });\n\n\t\t\tconst result = await db.select({ users }).from(users);\n\n\t\t\texpect(result).toEqual([{ users: { id: 1, name: 'John', cityId: 1 } }]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('set null to jsonb field', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tjsonb: jsonb('jsonb'),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, jsonb jsonb)`,\n\t\t\t);\n\n\t\t\tconst result = await db.insert(users).values({ jsonb: null }).returning();\n\n\t\t\texpect(result).toEqual([{ id: 1, jsonb: null }]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('insert undefined', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text)`,\n\t\t\t);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.insert(users).values({ name: undefined });\n\t\t\t})()).resolves.not.toThrowError();\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('update undefined', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text)`,\n\t\t\t);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.update(users).set({ name: undefined });\n\t\t\t})()).rejects.toThrowError();\n\t\t\tawait expect((async () => {\n\t\t\t\tdb.update(users).set({ name: undefined });\n\t\t\t})()).rejects.toThrowError();\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('array operators', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst posts = pgTable('posts', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\ttags: text('tags').array(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${posts}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${posts} (id serial primary key, tags text[])`,\n\t\t\t);\n\n\t\t\tawait db.insert(posts).values([{\n\t\t\t\ttags: ['ORM'],\n\t\t\t}, {\n\t\t\t\ttags: ['Typescript'],\n\t\t\t}, {\n\t\t\t\ttags: ['Typescript', 'ORM'],\n\t\t\t}, {\n\t\t\t\ttags: ['Typescript', 'Frontend', 'React'],\n\t\t\t}, {\n\t\t\t\ttags: ['Typescript', 'ORM', 'Database', 'Postgres'],\n\t\t\t}, {\n\t\t\t\ttags: ['Java', 'Spring', 'OOP'],\n\t\t\t}]);\n\n\t\t\tconst contains = await db.select({ id: posts.id }).from(posts)\n\t\t\t\t.where(arrayContains(posts.tags, ['Typescript', 'ORM']));\n\t\t\tconst contained = await db.select({ id: posts.id }).from(posts)\n\t\t\t\t.where(arrayContained(posts.tags, ['Typescript', 'ORM']));\n\t\t\tconst overlaps = await db.select({ id: posts.id }).from(posts)\n\t\t\t\t.where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']));\n\t\t\tconst withSubQuery = await db.select({ id: posts.id }).from(posts)\n\t\t\t\t.where(arrayContains(\n\t\t\t\t\tposts.tags,\n\t\t\t\t\tdb.select({ tags: posts.tags }).from(posts).where(eq(posts.id, 1)),\n\t\t\t\t));\n\n\t\t\texpect(contains).toEqual([{ id: 3 }, { id: 5 }]);\n\t\t\texpect(contained).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }]);\n\t\t\texpect(overlaps).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }]);\n\t\t\texpect(withSubQuery).toEqual([{ id: 1 }, { id: 3 }, { id: 5 }]);\n\t\t});\n\n\t\ttest('set operations (union) from query builder with subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t.from(users2Table).as('sq');\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).union(\n\t\t\t\t\tdb.select().from(sq),\n\t\t\t\t).orderBy(asc(sql`name`)).limit(2).offset(1);\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 3, name: 'Jack' },\n\t\t\t\t{ id: 2, name: 'Jane' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name, name2: users2Table.name })\n\t\t\t\t\t.from(cities2Table).union(\n\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t\t.from(users2Table),\n\t\t\t\t\t).orderBy(asc(sql`name`));\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (union) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await union(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).orderBy(asc(sql`name`)).limit(1).offset(1);\n\n\t\t\texpect(result).toHaveLength(1);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tunion(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: citiesTable.name, id: cities2Table.id })\n\t\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).orderBy(asc(sql`name`));\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (union all) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).limit(2).unionAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(cities2Table).limit(2),\n\t\t\t\t).orderBy(asc(sql`id`));\n\n\t\t\texpect(result).toHaveLength(4);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).limit(2).unionAll(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: citiesTable.name, id: cities2Table.id })\n\t\t\t\t\t\t\t.from(cities2Table).limit(2),\n\t\t\t\t\t).orderBy(asc(sql`id`));\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (union all) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await unionAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t);\n\n\t\t\texpect(result).toHaveLength(3);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tunionAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (intersect) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).intersect(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(cities2Table).where(gt(citiesTable.id, 1)),\n\t\t\t\t).orderBy(asc(sql`name`));\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).intersect(\n\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name, id2: cities2Table.id })\n\t\t\t\t\t\t\t.from(cities2Table).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t).orderBy(asc(sql`name`));\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (intersect) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await intersect(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t);\n\n\t\t\texpect(result).toHaveLength(0);\n\n\t\t\texpect(result).toEqual([]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tintersect(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (intersect all) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t.from(cities2Table).limit(2).intersectAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(cities2Table).limit(2),\n\t\t\t\t).orderBy(asc(sql`id`));\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).limit(2).intersectAll(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t\t.from(cities2Table).limit(2),\n\t\t\t\t\t).orderBy(asc(sql`id`));\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (intersect all) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await intersectAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t);\n\n\t\t\texpect(result).toHaveLength(1);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tintersectAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (except) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(cities2Table).except(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select()\n\t\t\t\t\t\t.from(cities2Table).where(gt(citiesTable.id, 1)),\n\t\t\t\t);\n\n\t\t\texpect(result).toHaveLength(1);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(cities2Table).except(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t\t.from(cities2Table).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (except) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await except(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).orderBy(asc(sql`id`));\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\texcept(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(cities2Table),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).orderBy(asc(sql`id`));\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (except all) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(cities2Table).exceptAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\t\t).orderBy(asc(sql`id`));\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: cities2Table.name, id: cities2Table.id })\n\t\t\t\t\t.from(cities2Table).exceptAll(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ id: cities2Table.id, name: citiesTable.name })\n\t\t\t\t\t\t\t.from(cities2Table).where(eq(citiesTable.id, 1)),\n\t\t\t\t\t).orderBy(asc(sql`id`));\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (except all) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await exceptAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(gt(users2Table.id, 7)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).orderBy(asc(sql`id`)).limit(5).offset(2);\n\n\t\t\texpect(result).toHaveLength(4);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 4, name: 'Peter' },\n\t\t\t\t{ id: 5, name: 'Ben' },\n\t\t\t\t{ id: 6, name: 'Jill' },\n\t\t\t\t{ id: 7, name: 'Mary' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\texceptAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(gt(users2Table.id, 7)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).orderBy(asc(sql`id`));\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (mixed) from query builder with subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\t\t\tconst sq = db\n\t\t\t\t.select()\n\t\t\t\t.from(cities2Table).where(gt(citiesTable.id, 1)).as('sq');\n\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(cities2Table).except(\n\t\t\t\t\t({ unionAll }) =>\n\t\t\t\t\t\tunionAll(\n\t\t\t\t\t\t\tdb.select().from(sq),\n\t\t\t\t\t\t\tdb.select().from(cities2Table).where(eq(citiesTable.id, 2)),\n\t\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\texpect(result).toHaveLength(1);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(cities2Table).except(\n\t\t\t\t\t\t({ unionAll }) =>\n\t\t\t\t\t\t\tunionAll(\n\t\t\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t\t\t.select({ name: cities2Table.name, id: cities2Table.id })\n\t\t\t\t\t\t\t\t\t.from(cities2Table).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t\t\t\tdb.select().from(cities2Table).where(eq(citiesTable.id, 2)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (mixed all) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await union(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\texcept(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(gte(users2Table.id, 5)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 7)),\n\t\t\t\t),\n\t\t\t\tdb\n\t\t\t\t\t.select().from(cities2Table).where(gt(citiesTable.id, 1)),\n\t\t\t).orderBy(asc(sql`id`));\n\n\t\t\texpect(result).toHaveLength(6);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t\t{ id: 5, name: 'Ben' },\n\t\t\t\t{ id: 6, name: 'Jill' },\n\t\t\t\t{ id: 8, name: 'Sally' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tunion(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\texcept(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t\t.from(users2Table).where(gte(users2Table.id, 5)),\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 7)),\n\t\t\t\t\t),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select().from(cities2Table).where(gt(citiesTable.id, 1)),\n\t\t\t\t).orderBy(asc(sql`id`));\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('aggregate function: count', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: count() }).from(table);\n\t\t\tconst result2 = await db.select({ value: count(table.a) }).from(table);\n\t\t\tconst result3 = await db.select({ value: countDistinct(table.name) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe(7);\n\t\t\texpect(result2[0]?.value).toBe(5);\n\t\t\texpect(result3[0]?.value).toBe(6);\n\t\t});\n\n\t\ttest('aggregate function: avg', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: avg(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: avg(table.nullOnly) }).from(table);\n\t\t\tconst result3 = await db.select({ value: avgDistinct(table.b) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe('33.3333333333333333');\n\t\t\texpect(result2[0]?.value).toBeNull();\n\t\t\texpect(result3[0]?.value).toBe('42.5000000000000000');\n\t\t});\n\n\t\ttest('aggregate function: sum', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: sum(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: sum(table.nullOnly) }).from(table);\n\t\t\tconst result3 = await db.select({ value: sumDistinct(table.b) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe('200');\n\t\t\texpect(result2[0]?.value).toBeNull();\n\t\t\texpect(result3[0]?.value).toBe('170');\n\t\t});\n\n\t\ttest('aggregate function: max', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: max(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: max(table.nullOnly) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe(90);\n\t\t\texpect(result2[0]?.value).toBeNull();\n\t\t});\n\n\t\ttest('aggregate function: min', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: min(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: min(table.nullOnly) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe(10);\n\t\t\texpect(result2[0]?.value).toBeNull();\n\t\t});\n\n\t\ttest('array mapping and parsing', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst arrays = pgTable('arrays_tests', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\ttags: text('tags').array(),\n\t\t\t\tnested: text('nested').array().array(),\n\t\t\t\tnumbers: integer('numbers').notNull().array(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${arrays}`);\n\t\t\tawait db.execute(sql`\n\t\t\t\t create table ${arrays} (\n\t\t\t\t id serial primary key,\n\t\t\t\t tags text[],\n\t\t\t\t nested text[][],\n\t\t\t\t numbers integer[]\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.insert(arrays).values({\n\t\t\t\ttags: ['', 'b', 'c'],\n\t\t\t\tnested: [['1', ''], ['3', '\\\\a']],\n\t\t\t\tnumbers: [1, 2, 3],\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(arrays);\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t\ttags: ['', 'b', 'c'],\n\t\t\t\tnested: [['1', ''], ['3', '\\\\a']],\n\t\t\t\tnumbers: [1, 2, 3],\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table ${arrays}`);\n\t\t});\n\n\t\ttest('test $onUpdateFn and $onUpdate works as $default', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.execute(sql`drop table if exists ${usersOnUpdate}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${usersOnUpdate} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\tname text not null,\n\t\t\t\t\tupdate_counter integer default 1 not null,\n\t\t\t\t\tupdated_at timestamp(3),\n\t\t\t\t\talways_null text\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(usersOnUpdate).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Jack' },\n\t\t\t\t{ name: 'Jill' },\n\t\t\t]);\n\n\t\t\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\n\t\t\tconst justDates = await db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\t\t\tconst response = await db.select({ ...rest }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\t\t\texpect(response).toEqual([\n\t\t\t\t{ name: 'John', id: 1, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jane', id: 2, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jack', id: 3, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jill', id: 4, updateCounter: 1, alwaysNull: null },\n\t\t\t]);\n\t\t\tconst msDelay = 250;\n\n\t\t\tfor (const eachUser of justDates) {\n\t\t\t\texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t\t\t}\n\t\t});\n\n\t\ttest('test $onUpdateFn and $onUpdate works updating', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.execute(sql`drop table if exists ${usersOnUpdate}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${usersOnUpdate} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\tname text not null,\n\t\t\t\t\tupdate_counter integer default 1,\n\t\t\t\t\tupdated_at timestamp(3),\n\t\t\t\t\talways_null text\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(usersOnUpdate).values([\n\t\t\t\t{ name: 'John', alwaysNull: 'this will be null after updating' },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Jack' },\n\t\t\t\t{ name: 'Jill' },\n\t\t\t]);\n\n\t\t\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\t\t\tawait db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\t\t\tawait db.update(usersOnUpdate).set({ name: 'Angel' }).where(eq(usersOnUpdate.id, 1));\n\t\t\tawait db.update(usersOnUpdate).set({ updateCounter: null }).where(eq(usersOnUpdate.id, 2));\n\n\t\t\tconst justDates = await db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\t\t\tconst response = await db.select({ ...rest }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\t\t\texpect(response).toEqual([\n\t\t\t\t{ name: 'Angel', id: 1, updateCounter: 2, alwaysNull: null },\n\t\t\t\t{ name: 'Jane', id: 2, updateCounter: null, alwaysNull: null },\n\t\t\t\t{ name: 'Jack', id: 3, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jill', id: 4, updateCounter: 1, alwaysNull: null },\n\t\t\t]);\n\t\t\tconst msDelay = 15000;\n\n\t\t\t// expect(initial[0]?.updatedAt?.valueOf()).not.toBe(justDates[0]?.updatedAt?.valueOf());\n\n\t\t\tfor (const eachUser of justDates) {\n\t\t\t\texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t\t\t}\n\t\t});\n\n\t\ttest('test if method with sql operators', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tage: integer('age').notNull(),\n\t\t\t\tcity: text('city').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table ${users} (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tage integer not null,\n\t\t\t\tcity text not null\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t\t]);\n\n\t\t\tconst condition1 = true;\n\n\t\t\tconst [result1] = await db.select().from(users).where(eq(users.id, 1).if(condition1));\n\n\t\t\texpect(result1).toEqual({ id: 1, name: 'John', age: 20, city: 'New York' });\n\n\t\t\tconst condition2 = 1;\n\n\t\t\tconst [result2] = await db.select().from(users).where(sql`${users.id} = 1`.if(condition2));\n\n\t\t\texpect(result2).toEqual({ id: 1, name: 'John', age: 20, city: 'New York' });\n\n\t\t\tconst condition3 = 'non-empty string';\n\n\t\t\tconst result3 = await db.select().from(users).where(\n\t\t\t\tor(eq(users.id, 1).if(condition3), eq(users.id, 2).if(condition3)),\n\t\t\t);\n\n\t\t\texpect(result3).toEqual([{ id: 1, name: 'John', age: 20, city: 'New York' }, {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Alice',\n\t\t\t\tage: 21,\n\t\t\t\tcity: 'New York',\n\t\t\t}]);\n\n\t\t\tconst condtition4 = false;\n\n\t\t\tconst result4 = await db.select().from(users).where(eq(users.id, 1).if(condtition4));\n\n\t\t\texpect(result4).toEqual([\n\t\t\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t\t]);\n\n\t\t\tconst condition5 = undefined;\n\n\t\t\tconst result5 = await db.select().from(users).where(sql`${users.id} = 1`.if(condition5));\n\n\t\t\texpect(result5).toEqual([\n\t\t\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t\t]);\n\n\t\t\tconst condition6 = null;\n\n\t\t\tconst result6 = await db.select().from(users).where(\n\t\t\t\tor(eq(users.id, 1).if(condition6), eq(users.id, 2).if(condition6)),\n\t\t\t);\n\n\t\t\texpect(result6).toEqual([\n\t\t\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t\t]);\n\n\t\t\tconst condition7 = {\n\t\t\t\tterm1: 0,\n\t\t\t\tterm2: 1,\n\t\t\t};\n\n\t\t\tconst result7 = await db.select().from(users).where(\n\t\t\t\tand(gt(users.age, 20).if(condition7.term1), eq(users.city, 'New York').if(condition7.term2)),\n\t\t\t);\n\n\t\t\texpect(result7).toEqual([\n\t\t\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t]);\n\n\t\t\tconst condition8 = {\n\t\t\t\tterm1: '',\n\t\t\t\tterm2: 'non-empty string',\n\t\t\t};\n\n\t\t\tconst result8 = await db.select().from(users).where(\n\t\t\t\tor(lt(users.age, 21).if(condition8.term1), eq(users.city, 'London').if(condition8.term2)),\n\t\t\t);\n\n\t\t\texpect(result8).toEqual([\n\t\t\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t\t]);\n\n\t\t\tconst condition9 = {\n\t\t\t\tterm1: 1,\n\t\t\t\tterm2: true,\n\t\t\t};\n\n\t\t\tconst result9 = await db.select().from(users).where(\n\t\t\t\tand(\n\t\t\t\t\tinArray(users.city, ['New York', 'London']).if(condition9.term1),\n\t\t\t\t\tilike(users.name, 'a%').if(condition9.term2),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\texpect(result9).toEqual([\n\t\t\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t]);\n\n\t\t\tconst condition10 = {\n\t\t\t\tterm1: 4,\n\t\t\t\tterm2: 19,\n\t\t\t};\n\n\t\t\tconst result10 = await db.select().from(users).where(\n\t\t\t\tand(\n\t\t\t\t\tsql`length(${users.name}) <= ${condition10.term1}`.if(condition10.term1),\n\t\t\t\t\tgt(users.age, condition10.term2).if(condition10.term2 > 20),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\texpect(result10).toEqual([\n\t\t\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t\t]);\n\n\t\t\tconst condition11 = true;\n\n\t\t\tconst result11 = await db.select().from(users).where(\n\t\t\t\tor(eq(users.city, 'New York'), gte(users.age, 22))!.if(condition11),\n\t\t\t);\n\n\t\t\texpect(result11).toEqual([\n\t\t\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t\t]);\n\n\t\t\tconst condition12 = false;\n\n\t\t\tconst result12 = await db.select().from(users).where(\n\t\t\t\tand(eq(users.city, 'London'), gte(users.age, 23))!.if(condition12),\n\t\t\t);\n\n\t\t\texpect(result12).toEqual([\n\t\t\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t\t]);\n\n\t\t\tconst condition13 = true;\n\n\t\t\tconst result13 = await db.select().from(users).where(sql`(city = 'New York' or age >= 22)`.if(condition13));\n\n\t\t\texpect(result13).toEqual([\n\t\t\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t\t]);\n\n\t\t\tconst condition14 = false;\n\n\t\t\tconst result14 = await db.select().from(users).where(sql`(city = 'London' and age >= 23)`.if(condition14));\n\n\t\t\texpect(result14).toEqual([\n\t\t\t\t{ id: 1, name: 'John', age: 20, city: 'New York' },\n\t\t\t\t{ id: 2, name: 'Alice', age: 21, city: 'New York' },\n\t\t\t\t{ id: 3, name: 'Nick', age: 22, city: 'London' },\n\t\t\t\t{ id: 4, name: 'Lina', age: 23, city: 'London' },\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\t// MySchema tests\n\t\ttest('mySchema :: select all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst now = Date.now();\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst result = await db.select().from(usersMySchemaTable);\n\n\t\t\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\texpect(Math.abs(result[0]!.createdAt.getTime() - now)).toBeLessThan(300);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('mySchema :: select sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst users = await db.select({\n\t\t\t\tname: sql`upper(${usersMySchemaTable.name})`,\n\t\t\t}).from(usersMySchemaTable);\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('mySchema :: select typed sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst users = await db.select({\n\t\t\t\tname: sql<string>`upper(${usersMySchemaTable.name})`,\n\t\t\t}).from(usersMySchemaTable);\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('mySchema :: select distinct', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst usersDistinctTable = pgTable('users_distinct', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${usersDistinctTable}`);\n\t\t\tawait db.execute(sql`create table ${usersDistinctTable} (id integer, name text)`);\n\n\t\t\tawait db.insert(usersDistinctTable).values([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'John' },\n\t\t\t\t{ id: 1, name: 'Jane' },\n\t\t\t]);\n\t\t\tconst users1 = await db.selectDistinct().from(usersDistinctTable).orderBy(\n\t\t\t\tusersDistinctTable.id,\n\t\t\t\tusersDistinctTable.name,\n\t\t\t);\n\t\t\tconst users2 = await db.selectDistinctOn([usersDistinctTable.id]).from(usersDistinctTable).orderBy(\n\t\t\t\tusersDistinctTable.id,\n\t\t\t);\n\t\t\tconst users3 = await db.selectDistinctOn([usersDistinctTable.name], { name: usersDistinctTable.name }).from(\n\t\t\t\tusersDistinctTable,\n\t\t\t).orderBy(usersDistinctTable.name);\n\n\t\t\tawait db.execute(sql`drop table ${usersDistinctTable}`);\n\n\t\t\texpect(users1).toEqual([{ id: 1, name: 'Jane' }, { id: 1, name: 'John' }, { id: 2, name: 'John' }]);\n\n\t\t\texpect(users2).toHaveLength(2);\n\t\t\texpect(users2[0]?.id).toBe(1);\n\t\t\texpect(users2[1]?.id).toBe(2);\n\n\t\t\texpect(users3).toHaveLength(2);\n\t\t\texpect(users3[0]?.name).toBe('Jane');\n\t\t\texpect(users3[1]?.name).toBe('John');\n\t\t});\n\n\t\ttest('mySchema :: insert returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = await db.insert(usersMySchemaTable).values({ name: 'John' }).returning({\n\t\t\t\tname: sql`upper(${usersMySchemaTable.name})`,\n\t\t\t});\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('mySchema :: delete returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst users = await db.delete(usersMySchemaTable).where(eq(usersMySchemaTable.name, 'John')).returning({\n\t\t\t\tname: sql`upper(${usersMySchemaTable.name})`,\n\t\t\t});\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('mySchema :: update with returning partial', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst users = await db.update(usersMySchemaTable).set({ name: 'Jane' }).where(eq(usersMySchemaTable.name, 'John'))\n\t\t\t\t.returning({\n\t\t\t\t\tid: usersMySchemaTable.id,\n\t\t\t\t\tname: usersMySchemaTable.name,\n\t\t\t\t});\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n\t\t});\n\n\t\ttest('mySchema :: delete with returning all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst now = Date.now();\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst users = await db.delete(usersMySchemaTable).where(eq(usersMySchemaTable.name, 'John')).returning();\n\n\t\t\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(300);\n\t\t\texpect(users).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: users[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('mySchema :: insert + select', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst result = await db.select().from(usersMySchemaTable);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'Jane' });\n\t\t\tconst result2 = await db.select().from(usersMySchemaTable);\n\t\t\texpect(result2).toEqual([\n\t\t\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result2[0]!.createdAt },\n\t\t\t\t{ id: 2, name: 'Jane', verified: false, jsonb: null, createdAt: result2[1]!.createdAt },\n\t\t\t]);\n\t\t});\n\n\t\ttest('mySchema :: insert with overridden default values', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John', verified: true });\n\t\t\tconst result = await db.select().from(usersMySchemaTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: true, jsonb: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('mySchema :: insert many', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersMySchemaTable).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Austin', verified: true },\n\t\t\t]);\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersMySchemaTable.id,\n\t\t\t\tname: usersMySchemaTable.name,\n\t\t\t\tjsonb: usersMySchemaTable.jsonb,\n\t\t\t\tverified: usersMySchemaTable.verified,\n\t\t\t}).from(usersMySchemaTable);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t\t\t]);\n\t\t});\n\n\t\ttest('mySchema :: select with group by as field', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersMySchemaTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersMySchemaTable.name }).from(usersMySchemaTable)\n\t\t\t\t.groupBy(usersMySchemaTable.name);\n\n\t\t\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n\t\t});\n\n\t\ttest('mySchema :: select with group by as column + sql', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersMySchemaTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersMySchemaTable.name }).from(usersMySchemaTable)\n\t\t\t\t.groupBy(usersMySchemaTable.id, sql`${usersMySchemaTable.name}`);\n\n\t\t\texpect(result).toEqual([{ name: 'Jane' }, { name: 'Jane' }, { name: 'John' }]);\n\t\t});\n\n\t\ttest('mySchema :: build query', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst query = db.select({ id: usersMySchemaTable.id, name: usersMySchemaTable.name }).from(usersMySchemaTable)\n\t\t\t\t.groupBy(usersMySchemaTable.id, usersMySchemaTable.name)\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql: 'select \"id\", \"name\" from \"mySchema\".\"users\" group by \"mySchema\".\"users\".\"id\", \"mySchema\".\"users\".\"name\"',\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t});\n\n\t\ttest('mySchema :: partial join with alias', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\t\t\tconst customerAlias = alias(usersMySchemaTable, 'customer');\n\n\t\t\tawait db.insert(usersMySchemaTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tid: usersMySchemaTable.id,\n\t\t\t\t\t\tname: usersMySchemaTable.name,\n\t\t\t\t\t},\n\t\t\t\t\tcustomer: {\n\t\t\t\t\t\tid: customerAlias.id,\n\t\t\t\t\t\tname: customerAlias.name,\n\t\t\t\t\t},\n\t\t\t\t}).from(usersMySchemaTable)\n\t\t\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t\t\t.where(eq(usersMySchemaTable.id, 10));\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tuser: { id: 10, name: 'Ivan' },\n\t\t\t\tcustomer: { id: 11, name: 'Hans' },\n\t\t\t}]);\n\t\t});\n\n\t\ttest('mySchema :: insert with spaces', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: sql`'Jo   h     n'` });\n\t\t\tconst result = await db.select({ id: usersMySchemaTable.id, name: usersMySchemaTable.name }).from(\n\t\t\t\tusersMySchemaTable,\n\t\t\t);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n\t\t});\n\n\t\ttest('mySchema :: prepared statement with placeholder in .limit', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst stmt = db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersMySchemaTable.id,\n\t\t\t\t\tname: usersMySchemaTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersMySchemaTable)\n\t\t\t\t.where(eq(usersMySchemaTable.id, sql.placeholder('id')))\n\t\t\t\t.limit(sql.placeholder('limit'))\n\t\t\t\t.prepare('mySchema_stmt_limit');\n\n\t\t\tconst result = await stmt.execute({ id: 1, limit: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t\texpect(result).toHaveLength(1);\n\t\t});\n\n\t\ttest('mySchema :: build query insert with onConflict do update / multiple columns', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst query = db.insert(usersMySchemaTable)\n\t\t\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t\t\t.onConflictDoUpdate({ target: [usersMySchemaTable.id, usersMySchemaTable.name], set: { name: 'John1' } })\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql:\n\t\t\t\t\t'insert into \"mySchema\".\"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\",\"name\") do update set \"name\" = $3',\n\t\t\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t\t\t});\n\t\t});\n\n\t\ttest('mySchema :: build query insert with onConflict do nothing + target', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst query = db.insert(usersMySchemaTable)\n\t\t\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t\t\t.onConflictDoNothing({ target: usersMySchemaTable.id })\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql:\n\t\t\t\t\t'insert into \"mySchema\".\"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\") do nothing',\n\t\t\t\tparams: ['John', '[\"foo\",\"bar\"]'],\n\t\t\t});\n\t\t});\n\n\t\ttest('mySchema :: select from tables with same name from different schema using alias', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ id: 10, name: 'Ivan' });\n\t\t\tawait db.insert(usersTable).values({ id: 11, name: 'Hans' });\n\n\t\t\tconst customerAlias = alias(usersTable, 'customer');\n\n\t\t\tconst result = await db\n\t\t\t\t.select().from(usersMySchemaTable)\n\t\t\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t\t\t.where(eq(customerAlias.id, 11));\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tusers: {\n\t\t\t\t\tid: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t\tverified: false,\n\t\t\t\t\tjsonb: null,\n\t\t\t\t\tcreatedAt: result[0]!.users.createdAt,\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t\tverified: false,\n\t\t\t\t\tjsonb: null,\n\t\t\t\t\tcreatedAt: result[0]!.customer!.createdAt,\n\t\t\t\t},\n\t\t\t}]);\n\t\t});\n\n\t\ttest('mySchema :: view', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst newYorkers1 = mySchema.view('new_yorkers')\n\t\t\t\t.as((qb) => qb.select().from(users2MySchemaTable).where(eq(users2MySchemaTable.cityId, 1)));\n\n\t\t\tconst newYorkers2 = mySchema.view('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t}).as(sql`select * from ${users2MySchemaTable} where ${eq(users2MySchemaTable.cityId, 1)}`);\n\n\t\t\tconst newYorkers3 = mySchema.view('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t}).existing();\n\n\t\t\tawait db.execute(sql`create view ${newYorkers1} as ${getViewConfig(newYorkers1).query}`);\n\n\t\t\tawait db.insert(citiesMySchemaTable).values([{ name: 'New York' }, { name: 'Paris' }]);\n\n\t\t\tawait db.insert(users2MySchemaTable).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 1 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers1);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers2);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers3);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\tawait db.execute(sql`drop view ${newYorkers1}`);\n\t\t});\n\n\t\ttest('mySchema :: materialized view', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst newYorkers1 = mySchema.materializedView('new_yorkers')\n\t\t\t\t.as((qb) => qb.select().from(users2MySchemaTable).where(eq(users2MySchemaTable.cityId, 1)));\n\n\t\t\tconst newYorkers2 = mySchema.materializedView('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t}).as(sql`select * from ${users2MySchemaTable} where ${eq(users2MySchemaTable.cityId, 1)}`);\n\n\t\t\tconst newYorkers3 = mySchema.materializedView('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t}).existing();\n\n\t\t\tawait db.execute(sql`create materialized view ${newYorkers1} as ${getMaterializedViewConfig(newYorkers1).query}`);\n\n\t\t\tawait db.insert(citiesMySchemaTable).values([{ name: 'New York' }, { name: 'Paris' }]);\n\n\t\t\tawait db.insert(users2MySchemaTable).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 1 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers1);\n\t\t\t\texpect(result).toEqual([]);\n\t\t\t}\n\n\t\t\tawait db.refreshMaterializedView(newYorkers1);\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers1);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers2);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers3);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1);\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\tawait db.execute(sql`drop materialized view ${newYorkers1}`);\n\t\t});\n\n\t\ttest('limit 0', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db\n\t\t\t\t.select()\n\t\t\t\t.from(usersTable)\n\t\t\t\t.limit(0);\n\n\t\t\texpect(users).toEqual([]);\n\t\t});\n\n\t\ttest('limit -1', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db\n\t\t\t\t.select()\n\t\t\t\t.from(usersTable)\n\t\t\t\t.limit(-1);\n\n\t\t\texpect(users.length).toBeGreaterThan(0);\n\t\t});\n\n\t\ttest('Object keys as column names', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\t// Tests the following:\n\t\t\t// Column with required config\n\t\t\t// Column with optional config without providing a value\n\t\t\t// Column with optional config providing a value\n\t\t\t// Column without config\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: bigserial({ mode: 'number' }).primaryKey(),\n\t\t\t\tfirstName: varchar(),\n\t\t\t\tlastName: varchar({ length: 50 }),\n\t\t\t\tadmin: boolean(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists users`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users (\n\t\t\t\t\t\t\"id\" bigserial primary key,\n\t\t\t\t\t\t\"firstName\" varchar,\n\t\t\t\t\t\t\"lastName\" varchar(50),\n\t\t\t\t\t\t\"admin\" boolean\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ firstName: 'John', lastName: 'Doe', admin: true },\n\t\t\t\t{ firstName: 'Jane', lastName: 'Smith', admin: false },\n\t\t\t]);\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: users.id, firstName: users.firstName, lastName: users.lastName })\n\t\t\t\t.from(users)\n\t\t\t\t.where(eq(users.admin, true));\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, firstName: 'John', lastName: 'Doe' },\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop table users`);\n\t\t});\n\n\t\ttest('proper json and jsonb handling', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst jsonTable = pgTable('json_table', {\n\t\t\t\tjson: json('json').$type<{ name: string; age: number }>(),\n\t\t\t\tjsonb: jsonb('jsonb').$type<{ name: string; age: number }>(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${jsonTable}`);\n\n\t\t\tawait db.execute(sql`create table ${jsonTable} (json json, jsonb jsonb)`);\n\n\t\t\tawait db.insert(jsonTable).values({ json: { name: 'Tom', age: 75 }, jsonb: { name: 'Pete', age: 23 } });\n\n\t\t\tconst result = await db.select().from(jsonTable);\n\n\t\t\tconst justNames = await db.select({\n\t\t\t\tname1: sql<string>`${jsonTable.json}->>'name'`.as('name1'),\n\t\t\t\tname2: sql<string>`${jsonTable.jsonb}->>'name'`.as('name2'),\n\t\t\t}).from(jsonTable);\n\n\t\t\texpect(result).toStrictEqual([\n\t\t\t\t{\n\t\t\t\t\tjson: { name: 'Tom', age: 75 },\n\t\t\t\t\tjsonb: { name: 'Pete', age: 23 },\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\texpect(justNames).toStrictEqual([\n\t\t\t\t{\n\t\t\t\t\tname1: 'Tom',\n\t\t\t\t\tname2: 'Pete',\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('set json/jsonb fields with objects and retrieve with the ->> operator', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst obj = { string: 'test', number: 123 };\n\t\t\tconst { string: testString, number: testNumber } = obj;\n\n\t\t\tawait db.insert(jsonTestTable).values({\n\t\t\t\tjson: obj,\n\t\t\t\tjsonb: obj,\n\t\t\t});\n\n\t\t\tconst result = await db.select({\n\t\t\t\tjsonStringField: sql<string>`${jsonTestTable.json}->>'string'`,\n\t\t\t\tjsonNumberField: sql<string>`${jsonTestTable.json}->>'number'`,\n\t\t\t\tjsonbStringField: sql<string>`${jsonTestTable.jsonb}->>'string'`,\n\t\t\t\tjsonbNumberField: sql<string>`${jsonTestTable.jsonb}->>'number'`,\n\t\t\t}).from(jsonTestTable);\n\n\t\t\texpect(result).toStrictEqual([{\n\t\t\t\tjsonStringField: testString,\n\t\t\t\tjsonNumberField: String(testNumber),\n\t\t\t\tjsonbStringField: testString,\n\t\t\t\tjsonbNumberField: String(testNumber),\n\t\t\t}]);\n\t\t});\n\n\t\ttest('set json/jsonb fields with strings and retrieve with the ->> operator', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst obj = { string: 'test', number: 123 };\n\t\t\tconst { string: testString, number: testNumber } = obj;\n\n\t\t\tawait db.insert(jsonTestTable).values({\n\t\t\t\tjson: sql`${JSON.stringify(obj)}`,\n\t\t\t\tjsonb: sql`${JSON.stringify(obj)}`,\n\t\t\t});\n\n\t\t\tconst result = await db.select({\n\t\t\t\tjsonStringField: sql<string>`${jsonTestTable.json}->>'string'`,\n\t\t\t\tjsonNumberField: sql<string>`${jsonTestTable.json}->>'number'`,\n\t\t\t\tjsonbStringField: sql<string>`${jsonTestTable.jsonb}->>'string'`,\n\t\t\t\tjsonbNumberField: sql<string>`${jsonTestTable.jsonb}->>'number'`,\n\t\t\t}).from(jsonTestTable);\n\n\t\t\texpect(result).toStrictEqual([{\n\t\t\t\tjsonStringField: testString,\n\t\t\t\tjsonNumberField: String(testNumber),\n\t\t\t\tjsonbStringField: testString,\n\t\t\t\tjsonbNumberField: String(testNumber),\n\t\t\t}]);\n\t\t});\n\n\t\ttest('set json/jsonb fields with objects and retrieve with the -> operator', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst obj = { string: 'test', number: 123 };\n\t\t\tconst { string: testString, number: testNumber } = obj;\n\n\t\t\tawait db.insert(jsonTestTable).values({\n\t\t\t\tjson: obj,\n\t\t\t\tjsonb: obj,\n\t\t\t});\n\n\t\t\tconst result = await db.select({\n\t\t\t\tjsonStringField: sql<string>`${jsonTestTable.json}->'string'`,\n\t\t\t\tjsonNumberField: sql<number>`${jsonTestTable.json}->'number'`,\n\t\t\t\tjsonbStringField: sql<string>`${jsonTestTable.jsonb}->'string'`,\n\t\t\t\tjsonbNumberField: sql<number>`${jsonTestTable.jsonb}->'number'`,\n\t\t\t}).from(jsonTestTable);\n\n\t\t\texpect(result).toStrictEqual([{\n\t\t\t\tjsonStringField: testString,\n\t\t\t\tjsonNumberField: testNumber,\n\t\t\t\tjsonbStringField: testString,\n\t\t\t\tjsonbNumberField: testNumber,\n\t\t\t}]);\n\t\t});\n\n\t\ttest('set json/jsonb fields with strings and retrieve with the -> operator', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst obj = { string: 'test', number: 123 };\n\t\t\tconst { string: testString, number: testNumber } = obj;\n\n\t\t\tawait db.insert(jsonTestTable).values({\n\t\t\t\tjson: sql`${JSON.stringify(obj)}`,\n\t\t\t\tjsonb: sql`${JSON.stringify(obj)}`,\n\t\t\t});\n\n\t\t\tconst result = await db.select({\n\t\t\t\tjsonStringField: sql<string>`${jsonTestTable.json}->'string'`,\n\t\t\t\tjsonNumberField: sql<number>`${jsonTestTable.json}->'number'`,\n\t\t\t\tjsonbStringField: sql<string>`${jsonTestTable.jsonb}->'string'`,\n\t\t\t\tjsonbNumberField: sql<number>`${jsonTestTable.jsonb}->'number'`,\n\t\t\t}).from(jsonTestTable);\n\n\t\t\texpect(result).toStrictEqual([{\n\t\t\t\tjsonStringField: testString,\n\t\t\t\tjsonNumberField: testNumber,\n\t\t\t\tjsonbStringField: testString,\n\t\t\t\tjsonbNumberField: testNumber,\n\t\t\t}]);\n\t\t});\n\n\t\ttest('update ... from', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(cities2Table).values([\n\t\t\t\t{ name: 'New York City' },\n\t\t\t\t{ name: 'Seattle' },\n\t\t\t]);\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst result = await db\n\t\t\t\t.update(users2Table)\n\t\t\t\t.set({\n\t\t\t\t\tcityId: cities2Table.id,\n\t\t\t\t})\n\t\t\t\t.from(cities2Table)\n\t\t\t\t.where(and(eq(cities2Table.name, 'Seattle'), eq(users2Table.name, 'John')))\n\t\t\t\t.returning();\n\n\t\t\texpect(result).toStrictEqual([{\n\t\t\t\tid: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tcityId: 2,\n\t\t\t\tcities: {\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'Seattle',\n\t\t\t\t},\n\t\t\t}]);\n\t\t});\n\n\t\ttest('update ... from with alias', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.insert(cities2Table).values([\n\t\t\t\t{ name: 'New York City' },\n\t\t\t\t{ name: 'Seattle' },\n\t\t\t]);\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst users = alias(users2Table, 'u');\n\t\t\tconst cities = alias(cities2Table, 'c');\n\t\t\tconst result = await db\n\t\t\t\t.update(users)\n\t\t\t\t.set({\n\t\t\t\t\tcityId: cities.id,\n\t\t\t\t})\n\t\t\t\t.from(cities)\n\t\t\t\t.where(and(eq(cities.name, 'Seattle'), eq(users.name, 'John')))\n\t\t\t\t.returning();\n\n\t\t\texpect(result).toStrictEqual([{\n\t\t\t\tid: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tcityId: 2,\n\t\t\t\tc: {\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'Seattle',\n\t\t\t\t},\n\t\t\t}]);\n\t\t});\n\n\t\ttest('update ... from with join', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst states = pgTable('states', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\t\t\tconst cities = pgTable('cities', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstateId: integer('state_id').references(() => states.id),\n\t\t\t});\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull().references(() => cities.id),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists \"states\" cascade`);\n\t\t\tawait db.execute(sql`drop table if exists \"cities\" cascade`);\n\t\t\tawait db.execute(sql`drop table if exists \"users\" cascade`);\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table \"states\" (\n\t\t\t\t\t\"id\" serial primary key,\n\t\t\t\t\t\"name\" text not null\n\t\t\t\t)\n\t\t\t`);\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table \"cities\" (\n\t\t\t\t\t\"id\" serial primary key,\n\t\t\t\t\t\"name\" text not null,\n\t\t\t\t\t\"state_id\" integer references \"states\"(\"id\")\n\t\t\t\t)\n\t\t\t`);\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table \"users\" (\n\t\t\t\t\t\"id\" serial primary key,\n\t\t\t\t\t\"name\" text not null,\n\t\t\t\t\t\"city_id\" integer not null references \"cities\"(\"id\")\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.insert(states).values([\n\t\t\t\t{ name: 'New York' },\n\t\t\t\t{ name: 'Washington' },\n\t\t\t]);\n\t\t\tawait db.insert(cities).values([\n\t\t\t\t{ name: 'New York City', stateId: 1 },\n\t\t\t\t{ name: 'Seattle', stateId: 2 },\n\t\t\t\t{ name: 'London' },\n\t\t\t]);\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 3 },\n\t\t\t]);\n\n\t\t\tconst result1 = await db\n\t\t\t\t.update(users)\n\t\t\t\t.set({\n\t\t\t\t\tcityId: cities.id,\n\t\t\t\t})\n\t\t\t\t.from(cities)\n\t\t\t\t.leftJoin(states, eq(cities.stateId, states.id))\n\t\t\t\t.where(and(eq(cities.name, 'Seattle'), eq(users.name, 'John')))\n\t\t\t\t.returning();\n\t\t\tconst result2 = await db\n\t\t\t\t.update(users)\n\t\t\t\t.set({\n\t\t\t\t\tcityId: cities.id,\n\t\t\t\t})\n\t\t\t\t.from(cities)\n\t\t\t\t.leftJoin(states, eq(cities.stateId, states.id))\n\t\t\t\t.where(and(eq(cities.name, 'London'), eq(users.name, 'Jack')))\n\t\t\t\t.returning();\n\n\t\t\texpect(result1).toStrictEqual([{\n\t\t\t\tid: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tcityId: 2,\n\t\t\t\tcities: {\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'Seattle',\n\t\t\t\t\tstateId: 2,\n\t\t\t\t},\n\t\t\t\tstates: {\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'Washington',\n\t\t\t\t},\n\t\t\t}]);\n\t\t\texpect(result2).toStrictEqual([{\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Jack',\n\t\t\t\tcityId: 3,\n\t\t\t\tcities: {\n\t\t\t\t\tid: 3,\n\t\t\t\t\tname: 'London',\n\t\t\t\t\tstateId: null,\n\t\t\t\t},\n\t\t\t\tstates: null,\n\t\t\t}]);\n\t\t});\n\n\t\ttest('insert into ... select', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst notifications = pgTable('notifications', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tsentAt: timestamp('sent_at').notNull().defaultNow(),\n\t\t\t\tmessage: text('message').notNull(),\n\t\t\t});\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\t\t\tconst userNotications = pgTable('user_notifications', {\n\t\t\t\tuserId: integer('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),\n\t\t\t\tnotificationId: integer('notification_id').notNull().references(() => notifications.id, {\n\t\t\t\t\tonDelete: 'cascade',\n\t\t\t\t}),\n\t\t\t}, (t) => ({\n\t\t\t\tpk: primaryKey({ columns: [t.userId, t.notificationId] }),\n\t\t\t}));\n\n\t\t\tawait db.execute(sql`drop table if exists notifications`);\n\t\t\tawait db.execute(sql`drop table if exists users`);\n\t\t\tawait db.execute(sql`drop table if exists user_notifications`);\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table notifications (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\tsent_at timestamp not null default now(),\n\t\t\t\t\tmessage text not null\n\t\t\t\t)\n\t\t\t`);\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table users (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\tname text not null\n\t\t\t\t)\n\t\t\t`);\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table user_notifications (\n\t\t\t\t\tuser_id int references users(id) on delete cascade,\n\t\t\t\t\tnotification_id int references notifications(id) on delete cascade,\n\t\t\t\t\tprimary key (user_id, notification_id)\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tconst newNotification = await db\n\t\t\t\t.insert(notifications)\n\t\t\t\t.values({ message: 'You are one of the 3 lucky winners!' })\n\t\t\t\t.returning({ id: notifications.id })\n\t\t\t\t.then((result) => result[0]);\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ name: 'Alice' },\n\t\t\t\t{ name: 'Bob' },\n\t\t\t\t{ name: 'Charlie' },\n\t\t\t\t{ name: 'David' },\n\t\t\t\t{ name: 'Eve' },\n\t\t\t]);\n\n\t\t\tconst sentNotifications = await db\n\t\t\t\t.insert(userNotications)\n\t\t\t\t.select(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tuserId: users.id,\n\t\t\t\t\t\t\tnotificationId: sql`${newNotification!.id}`.as('notification_id'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(users)\n\t\t\t\t\t\t.where(inArray(users.name, ['Alice', 'Charlie', 'Eve']))\n\t\t\t\t\t\t.orderBy(asc(users.id)),\n\t\t\t\t)\n\t\t\t\t.returning();\n\n\t\t\texpect(sentNotifications).toStrictEqual([\n\t\t\t\t{ userId: 1, notificationId: newNotification!.id },\n\t\t\t\t{ userId: 3, notificationId: newNotification!.id },\n\t\t\t\t{ userId: 5, notificationId: newNotification!.id },\n\t\t\t]);\n\t\t});\n\n\t\ttest('insert into ... select with keys in different order', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users1 = pgTable('users1', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\t\t\tconst users2 = pgTable('users2', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists users1`);\n\t\t\tawait db.execute(sql`drop table if exists users2`);\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table users1 (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\tname text not null\n\t\t\t\t)\n\t\t\t`);\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table users2 (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\tname text not null\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\texpect(\n\t\t\t\t() =>\n\t\t\t\t\tdb\n\t\t\t\t\t\t.insert(users1)\n\t\t\t\t\t\t.select(\n\t\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\t\t\tname: users2.name,\n\t\t\t\t\t\t\t\t\tid: users2.id,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.from(users2),\n\t\t\t\t\t\t),\n\t\t\t).toThrowError();\n\t\t});\n\n\t\ttest('policy', () => {\n\t\t\t{\n\t\t\t\tconst policy = pgPolicy('test policy');\n\n\t\t\t\texpect(is(policy, PgPolicy)).toBe(true);\n\t\t\t\texpect(policy.name).toBe('test policy');\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst policy = pgPolicy('test policy', {\n\t\t\t\t\tas: 'permissive',\n\t\t\t\t\tfor: 'all',\n\t\t\t\t\tto: 'public',\n\t\t\t\t\tusing: sql`1=1`,\n\t\t\t\t\twithCheck: sql`1=1`,\n\t\t\t\t});\n\n\t\t\t\texpect(is(policy, PgPolicy)).toBe(true);\n\t\t\t\texpect(policy.name).toBe('test policy');\n\t\t\t\texpect(policy.as).toBe('permissive');\n\t\t\t\texpect(policy.for).toBe('all');\n\t\t\t\texpect(policy.to).toBe('public');\n\t\t\t\tconst dialect = new PgDialect();\n\t\t\t\texpect(is(policy.using, SQL)).toBe(true);\n\t\t\t\texpect(dialect.sqlToQuery(policy.using!).sql).toBe('1=1');\n\t\t\t\texpect(is(policy.withCheck, SQL)).toBe(true);\n\t\t\t\texpect(dialect.sqlToQuery(policy.withCheck!).sql).toBe('1=1');\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst policy = pgPolicy('test policy', {\n\t\t\t\t\tto: 'custom value',\n\t\t\t\t});\n\n\t\t\t\texpect(policy.to).toBe('custom value');\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst p1 = pgPolicy('test policy');\n\t\t\t\tconst p2 = pgPolicy('test policy 2', {\n\t\t\t\t\tas: 'permissive',\n\t\t\t\t\tfor: 'all',\n\t\t\t\t\tto: 'public',\n\t\t\t\t\tusing: sql`1=1`,\n\t\t\t\t\twithCheck: sql`1=1`,\n\t\t\t\t});\n\t\t\t\tconst table = pgTable('table_with_policy', {\n\t\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\t\tname: text('name').notNull(),\n\t\t\t\t}, () => ({\n\t\t\t\t\tp1,\n\t\t\t\t\tp2,\n\t\t\t\t}));\n\t\t\t\tconst config = getTableConfig(table);\n\t\t\t\texpect(config.policies).toHaveLength(2);\n\t\t\t\texpect(config.policies[0]).toBe(p1);\n\t\t\t\texpect(config.policies[1]).toBe(p2);\n\t\t\t}\n\t\t});\n\n\t\ttest('neon: policy', () => {\n\t\t\t{\n\t\t\t\tconst policy = crudPolicy({\n\t\t\t\t\tread: true,\n\t\t\t\t\tmodify: true,\n\t\t\t\t\trole: authenticatedRole,\n\t\t\t\t});\n\n\t\t\t\tfor (const it of Object.values(policy)) {\n\t\t\t\t\texpect(is(it, PgPolicy)).toBe(true);\n\t\t\t\t\texpect(it?.to).toStrictEqual(authenticatedRole);\n\t\t\t\t\tit?.using ? expect(it.using).toStrictEqual(sql`true`) : '';\n\t\t\t\t\tit?.withCheck ? expect(it.withCheck).toStrictEqual(sql`true`) : '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst table = pgTable('name', {\n\t\t\t\t\tid: integer('id'),\n\t\t\t\t}, (t) => [\n\t\t\t\t\tindex('name').on(t.id),\n\t\t\t\t\tcrudPolicy({\n\t\t\t\t\t\tread: true,\n\t\t\t\t\t\tmodify: true,\n\t\t\t\t\t\trole: authenticatedRole,\n\t\t\t\t\t}),\n\t\t\t\t\tprimaryKey({ columns: [t.id], name: 'custom' }),\n\t\t\t\t]);\n\n\t\t\t\tconst { policies, indexes, primaryKeys } = getTableConfig(table);\n\n\t\t\t\texpect(policies.length).toBe(4);\n\t\t\t\texpect(indexes.length).toBe(1);\n\t\t\t\texpect(primaryKeys.length).toBe(1);\n\n\t\t\t\texpect(policies[0]?.name === 'crud-custom-policy-modify');\n\t\t\t\texpect(policies[1]?.name === 'crud-custom-policy-read');\n\t\t\t}\n\t\t});\n\n\t\ttest('neon: neon_auth', () => {\n\t\t\tconst usersSyncTable = usersSync;\n\n\t\t\tconst { columns, schema, name } = getTableConfig(usersSyncTable);\n\n\t\t\texpect(name).toBe('users_sync');\n\t\t\texpect(schema).toBe('neon_auth');\n\t\t\texpect(columns).toHaveLength(7);\n\t\t});\n\n\t\ttest('Enable RLS function', () => {\n\t\t\tconst usersWithRLS = pgTable('users', {\n\t\t\t\tid: integer(),\n\t\t\t}).enableRLS();\n\n\t\t\tconst config1 = getTableConfig(usersWithRLS);\n\n\t\t\tconst usersNoRLS = pgTable('users', {\n\t\t\t\tid: integer(),\n\t\t\t});\n\n\t\t\tconst config2 = getTableConfig(usersNoRLS);\n\n\t\t\texpect(config1.enableRLS).toBeTruthy();\n\t\t\texpect(config2.enableRLS).toBeFalsy();\n\t\t});\n\n\t\ttest('test $onUpdateFn and $onUpdate works with sql value', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users_on_update', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tupdatedAt: timestamp('updated_at', { mode: 'date' }).notNull().$onUpdate(() => sql`now()`),\n\t\t\t});\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${users} (\n\t\t\t\t\t\t\"id\" serial primary key,\n\t\t\t\t\t\t\"name\" text not null,\n\t\t\t\t\t\t\"updated_at\" timestamp(3)\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tconst insertResp = await db.insert(users).values({\n\t\t\t\tname: 'John',\n\t\t\t}).returning({\n\t\t\t\tupdatedAt: users.updatedAt,\n\t\t\t});\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\n\t\t\tconst now = Date.now();\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\t\t\tconst updateResp = await db.update(users).set({\n\t\t\t\tname: 'John',\n\t\t\t}).returning({\n\t\t\t\tupdatedAt: users.updatedAt,\n\t\t\t});\n\n\t\t\texpect(insertResp[0]?.updatedAt.getTime() ?? 0).lessThan(now);\n\t\t\texpect(updateResp[0]?.updatedAt.getTime() ?? 0).greaterThan(now);\n\t\t});\n\n\t\ttest('$count separate', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst countTestTable = pgTable('count_test', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await db.$count(countTestTable);\n\n\t\t\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).toStrictEqual(4);\n\t\t});\n\n\t\ttest('$count embedded', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst countTestTable = pgTable('count_test', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await db.select({\n\t\t\t\tcount: db.$count(countTestTable),\n\t\t\t}).from(countTestTable);\n\n\t\t\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).toStrictEqual([\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('$count separate reuse', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst countTestTable = pgTable('count_test', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = db.$count(countTestTable);\n\n\t\t\tconst count1 = await count;\n\n\t\t\tawait db.insert(countTestTable).values({ id: 5, name: 'fifth' });\n\n\t\t\tconst count2 = await count;\n\n\t\t\tawait db.insert(countTestTable).values({ id: 6, name: 'sixth' });\n\n\t\t\tconst count3 = await count;\n\n\t\t\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count1).toStrictEqual(4);\n\t\t\texpect(count2).toStrictEqual(5);\n\t\t\texpect(count3).toStrictEqual(6);\n\t\t});\n\n\t\ttest('$count embedded reuse', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst countTestTable = pgTable('count_test', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = db.select({\n\t\t\t\tcount: db.$count(countTestTable),\n\t\t\t}).from(countTestTable);\n\n\t\t\tconst count1 = await count;\n\n\t\t\tawait db.insert(countTestTable).values({ id: 5, name: 'fifth' });\n\n\t\t\tconst count2 = await count;\n\n\t\t\tawait db.insert(countTestTable).values({ id: 6, name: 'sixth' });\n\n\t\t\tconst count3 = await count;\n\n\t\t\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count1).toStrictEqual([\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t]);\n\t\t\texpect(count2).toStrictEqual([\n\t\t\t\t{ count: 5 },\n\t\t\t\t{ count: 5 },\n\t\t\t\t{ count: 5 },\n\t\t\t\t{ count: 5 },\n\t\t\t\t{ count: 5 },\n\t\t\t]);\n\t\t\texpect(count3).toStrictEqual([\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('$count separate with filters', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst countTestTable = pgTable('count_test', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await db.$count(countTestTable, gt(countTestTable.id, 1));\n\n\t\t\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).toStrictEqual(3);\n\t\t});\n\n\t\ttest('$count embedded with filters', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst countTestTable = pgTable('count_test', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.execute(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await db.select({\n\t\t\t\tcount: db.$count(countTestTable, gt(countTestTable.id, 1)),\n\t\t\t}).from(countTestTable);\n\n\t\t\tawait db.execute(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).toStrictEqual([\n\t\t\t\t{ count: 3 },\n\t\t\t\t{ count: 3 },\n\t\t\t\t{ count: 3 },\n\t\t\t\t{ count: 3 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('insert multiple rows into table with generated identity column', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst identityColumnsTable = pgTable('identity_columns_table', {\n\t\t\t\tid: integer('id').generatedAlwaysAsIdentity(),\n\t\t\t\tid1: integer('id1').generatedByDefaultAsIdentity(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\t// not passing identity columns\n\t\t\tawait db.execute(sql`drop table if exists ${identityColumnsTable}`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${identityColumnsTable} (\"id\" integer generated always as identity, \"id1\" integer generated by default as identity, \"name\" text)`,\n\t\t\t);\n\n\t\t\tlet result = await db.insert(identityColumnsTable).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Bob' },\n\t\t\t]).returning();\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, id1: 1, name: 'John' },\n\t\t\t\t{ id: 2, id1: 2, name: 'Jane' },\n\t\t\t\t{ id: 3, id1: 3, name: 'Bob' },\n\t\t\t]);\n\n\t\t\t// passing generated by default as identity column\n\t\t\tawait db.execute(sql`drop table if exists ${identityColumnsTable}`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${identityColumnsTable} (\"id\" integer generated always as identity, \"id1\" integer generated by default as identity, \"name\" text)`,\n\t\t\t);\n\n\t\t\tresult = await db.insert(identityColumnsTable).values([\n\t\t\t\t{ name: 'John', id1: 3 },\n\t\t\t\t{ name: 'Jane', id1: 5 },\n\t\t\t\t{ name: 'Bob', id1: 5 },\n\t\t\t]).returning();\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, id1: 3, name: 'John' },\n\t\t\t\t{ id: 2, id1: 5, name: 'Jane' },\n\t\t\t\t{ id: 3, id1: 5, name: 'Bob' },\n\t\t\t]);\n\n\t\t\t// passing all identity columns\n\t\t\tawait db.execute(sql`drop table if exists ${identityColumnsTable}`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${identityColumnsTable} (\"id\" integer generated always as identity, \"id1\" integer generated by default as identity, \"name\" text)`,\n\t\t\t);\n\n\t\t\tresult = await db.insert(identityColumnsTable).overridingSystemValue().values([\n\t\t\t\t{ name: 'John', id: 2, id1: 3 },\n\t\t\t\t{ name: 'Jane', id: 4, id1: 5 },\n\t\t\t\t{ name: 'Bob', id: 4, id1: 5 },\n\t\t\t]).returning();\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 2, id1: 3, name: 'John' },\n\t\t\t\t{ id: 4, id1: 5, name: 'Jane' },\n\t\t\t\t{ id: 4, id1: 5, name: 'Bob' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('insert as cte', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial not null primary key, name text not null)`);\n\n\t\t\tconst sq1 = db.$with('sq').as(\n\t\t\t\tdb.insert(users).values({ name: 'John' }).returning(),\n\t\t\t);\n\t\t\tconst result1 = await db.with(sq1).select().from(sq1);\n\t\t\tconst result2 = await db.with(sq1).select({ id: sq1.id }).from(sq1);\n\n\t\t\tconst sq2 = db.$with('sq').as(\n\t\t\t\tdb.insert(users).values({ name: 'Jane' }).returning({ id: users.id, name: users.name }),\n\t\t\t);\n\t\t\tconst result3 = await db.with(sq2).select().from(sq2);\n\t\t\tconst result4 = await db.with(sq2).select({ name: sq2.name }).from(sq2);\n\n\t\t\texpect(result1).toEqual([{ id: 1, name: 'John' }]);\n\t\t\texpect(result2).toEqual([{ id: 2 }]);\n\t\t\texpect(result3).toEqual([{ id: 3, name: 'Jane' }]);\n\t\t\texpect(result4).toEqual([{ name: 'Jane' }]);\n\t\t});\n\n\t\ttest('update as cte', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tage: integer('age').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text not null, age integer not null)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ name: 'John', age: 30 },\n\t\t\t\t{ name: 'Jane', age: 30 },\n\t\t\t]);\n\n\t\t\tconst sq1 = db.$with('sq').as(\n\t\t\t\tdb.update(users).set({ age: 25 }).where(eq(users.name, 'John')).returning(),\n\t\t\t);\n\t\t\tconst result1 = await db.with(sq1).select().from(sq1);\n\t\t\tawait db.update(users).set({ age: 30 });\n\t\t\tconst result2 = await db.with(sq1).select({ age: sq1.age }).from(sq1);\n\n\t\t\tconst sq2 = db.$with('sq').as(\n\t\t\t\tdb.update(users).set({ age: 20 }).where(eq(users.name, 'Jane')).returning({ name: users.name, age: users.age }),\n\t\t\t);\n\t\t\tconst result3 = await db.with(sq2).select().from(sq2);\n\t\t\tawait db.update(users).set({ age: 30 });\n\t\t\tconst result4 = await db.with(sq2).select({ age: sq2.age }).from(sq2);\n\n\t\t\texpect(result1).toEqual([{ id: 1, name: 'John', age: 25 }]);\n\t\t\texpect(result2).toEqual([{ age: 25 }]);\n\t\t\texpect(result3).toEqual([{ name: 'Jane', age: 20 }]);\n\t\t\texpect(result4).toEqual([{ age: 20 }]);\n\t\t});\n\n\t\ttest('delete as cte', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial not null primary key, name text not null)`);\n\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t]);\n\n\t\t\tconst sq1 = db.$with('sq').as(\n\t\t\t\tdb.delete(users).where(eq(users.name, 'John')).returning(),\n\t\t\t);\n\t\t\tconst result1 = await db.with(sq1).select().from(sq1);\n\t\t\tawait db.insert(users).values({ name: 'John' });\n\t\t\tconst result2 = await db.with(sq1).select({ name: sq1.name }).from(sq1);\n\n\t\t\tconst sq2 = db.$with('sq').as(\n\t\t\t\tdb.delete(users).where(eq(users.name, 'Jane')).returning({ id: users.id, name: users.name }),\n\t\t\t);\n\t\t\tconst result3 = await db.with(sq2).select().from(sq2);\n\t\t\tawait db.insert(users).values({ name: 'Jane' });\n\t\t\tconst result4 = await db.with(sq2).select({ name: sq2.name }).from(sq2);\n\n\t\t\texpect(result1).toEqual([{ id: 1, name: 'John' }]);\n\t\t\texpect(result2).toEqual([{ name: 'John' }]);\n\t\t\texpect(result3).toEqual([{ id: 2, name: 'Jane' }]);\n\t\t\texpect(result4).toEqual([{ name: 'Jane' }]);\n\t\t});\n\n\t\ttest('sql operator as cte', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tconst users = pgTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial not null primary key, name text not null)`);\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t]);\n\n\t\t\tconst sq1 = db.$with('sq', {\n\t\t\t\tuserId: users.id,\n\t\t\t\tdata: {\n\t\t\t\t\tname: users.name,\n\t\t\t\t},\n\t\t\t}).as(sql`select * from ${users} where ${users.name} = 'John'`);\n\t\t\tconst result1 = await db.with(sq1).select().from(sq1);\n\n\t\t\tconst sq2 = db.$with('sq', {\n\t\t\t\tuserId: users.id,\n\t\t\t\tdata: {\n\t\t\t\t\tname: users.name,\n\t\t\t\t},\n\t\t\t}).as(() => sql`select * from ${users} where ${users.name} = 'Jane'`);\n\t\t\tconst result2 = await db.with(sq2).select().from(sq1);\n\n\t\t\texpect(result1).toEqual([{ userId: 1, data: { name: 'John' } }]);\n\t\t\texpect(result2).toEqual([{ userId: 2, data: { name: 'Jane' } }]);\n\t\t});\n\n\t\ttest('cross join', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t]);\n\n\t\t\tawait db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'Seattle' },\n\t\t\t\t\t{ name: 'New York City' },\n\t\t\t\t]);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tuser: usersTable.name,\n\t\t\t\t\tcity: citiesTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.crossJoin(citiesTable)\n\t\t\t\t.orderBy(usersTable.name, citiesTable.name);\n\n\t\t\texpect(result).toStrictEqual([\n\t\t\t\t{ city: 'New York City', user: 'Jane' },\n\t\t\t\t{ city: 'Seattle', user: 'Jane' },\n\t\t\t\t{ city: 'New York City', user: 'John' },\n\t\t\t\t{ city: 'Seattle', user: 'John' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('left join (lateral)', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }]);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users2Table.id,\n\t\t\t\t\tuserName: users2Table.name,\n\t\t\t\t\tcityId: users2Table.cityId,\n\t\t\t\t})\n\t\t\t\t.from(users2Table)\n\t\t\t\t.where(eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tcityId: citiesTable.id,\n\t\t\t\t\tcityName: citiesTable.name,\n\t\t\t\t\tuserId: sq.userId,\n\t\t\t\t\tuserName: sq.userName,\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.leftJoinLateral(sq, sql`true`);\n\n\t\t\texpect(res).toStrictEqual([\n\t\t\t\t{ cityId: 1, cityName: 'Paris', userId: 1, userName: 'John' },\n\t\t\t\t{ cityId: 2, cityName: 'London', userId: null, userName: null },\n\t\t\t]);\n\t\t});\n\n\t\ttest('inner join (lateral)', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }]);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users2Table.id,\n\t\t\t\t\tuserName: users2Table.name,\n\t\t\t\t\tcityId: users2Table.cityId,\n\t\t\t\t})\n\t\t\t\t.from(users2Table)\n\t\t\t\t.where(eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tcityId: citiesTable.id,\n\t\t\t\t\tcityName: citiesTable.name,\n\t\t\t\t\tuserId: sq.userId,\n\t\t\t\t\tuserName: sq.userName,\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.innerJoinLateral(sq, sql`true`);\n\n\t\t\texpect(res).toStrictEqual([\n\t\t\t\t{ cityId: 1, cityName: 'Paris', userId: 1, userName: 'John' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('cross join (lateral)', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }, { id: 3, name: 'Berlin' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }, {\n\t\t\t\tname: 'Patrick',\n\t\t\t\tcityId: 2,\n\t\t\t}]);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users2Table.id,\n\t\t\t\t\tuserName: users2Table.name,\n\t\t\t\t\tcityId: users2Table.cityId,\n\t\t\t\t})\n\t\t\t\t.from(users2Table)\n\t\t\t\t.where(not(like(citiesTable.name, 'L%')))\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tcityId: citiesTable.id,\n\t\t\t\t\tcityName: citiesTable.name,\n\t\t\t\t\tuserId: sq.userId,\n\t\t\t\t\tuserName: sq.userName,\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.crossJoinLateral(sq)\n\t\t\t\t.orderBy(citiesTable.id, sq.userId);\n\n\t\t\texpect(res).toStrictEqual([\n\t\t\t\t{\n\t\t\t\t\tcityId: 1,\n\t\t\t\t\tcityName: 'Paris',\n\t\t\t\t\tuserId: 1,\n\t\t\t\t\tuserName: 'John',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcityId: 1,\n\t\t\t\t\tcityName: 'Paris',\n\t\t\t\t\tuserId: 2,\n\t\t\t\t\tuserName: 'Jane',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcityId: 1,\n\t\t\t\t\tcityName: 'Paris',\n\t\t\t\t\tuserId: 3,\n\t\t\t\t\tuserName: 'Patrick',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcityId: 3,\n\t\t\t\t\tcityName: 'Berlin',\n\t\t\t\t\tuserId: 1,\n\t\t\t\t\tuserName: 'John',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcityId: 3,\n\t\t\t\t\tcityName: 'Berlin',\n\t\t\t\t\tuserId: 2,\n\t\t\t\t\tuserName: 'Jane',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcityId: 3,\n\t\t\t\t\tcityName: 'Berlin',\n\t\t\t\t\tuserId: 3,\n\t\t\t\t\tuserName: 'Patrick',\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('all types', async (ctx) => {\n\t\t\tconst { db } = ctx.pg;\n\n\t\t\tawait db.execute(sql`CREATE TYPE \"public\".\"en\" AS ENUM('enVal1', 'enVal2');`);\n\t\t\tawait db.execute(sql`\n\t\t\t\tCREATE TABLE \"all_types\" (\n\t\t\t\t\t\"serial\" serial NOT NULL,\n\t\t\t\t\t\"bigserial53\" bigserial NOT NULL,\n\t\t\t\t\t\"bigserial64\" bigserial,\n\t\t\t\t\t\"int\" integer,\n\t\t\t\t\t\"bigint53\" bigint,\n\t\t\t\t\t\"bigint64\" bigint,\n\t\t\t\t\t\"bool\" boolean,\n\t\t\t\t\t\"char\" char,\n\t\t\t\t\t\"cidr\" \"cidr\",\n\t\t\t\t\t\"date\" date,\n\t\t\t\t\t\"date_str\" date,\n\t\t\t\t\t\"double\" double precision,\n\t\t\t\t\t\"enum\" \"en\",\n\t\t\t\t\t\"inet\" \"inet\",\n\t\t\t\t\t\"interval\" interval,\n\t\t\t\t\t\"json\" json,\n\t\t\t\t\t\"jsonb\" jsonb,\n\t\t\t\t\t\"line\" \"line\",\n\t\t\t\t\t\"line_tuple\" \"line\",\n\t\t\t\t\t\"macaddr\" \"macaddr\",\n\t\t\t\t\t\"macaddr8\" \"macaddr8\",\n\t\t\t\t\t\"numeric\" numeric,\n\t\t\t\t\t\"numeric_num\" numeric,\n\t\t\t\t\t\"numeric_big\" numeric,\n\t\t\t\t\t\"point\" \"point\",\n\t\t\t\t\t\"point_tuple\" \"point\",\n\t\t\t\t\t\"real\" real,\n\t\t\t\t\t\"smallint\" smallint,\n\t\t\t\t\t\"smallserial\" \"smallserial\" NOT NULL,\n\t\t\t\t\t\"text\" text,\n\t\t\t\t\t\"time\" time,\n\t\t\t\t\t\"timestamp\" timestamp,\n\t\t\t\t\t\"timestamp_tz\" timestamp with time zone,\n\t\t\t\t\t\"timestamp_str\" timestamp,\n\t\t\t\t\t\"timestamp_tz_str\" timestamp with time zone,\n\t\t\t\t\t\"uuid\" uuid,\n\t\t\t\t\t\"varchar\" varchar,\n\t\t\t\t\t\"arrint\" integer[],\n\t\t\t\t\t\"arrbigint53\" bigint[],\n\t\t\t\t\t\"arrbigint64\" bigint[],\n\t\t\t\t\t\"arrbool\" boolean[],\n\t\t\t\t\t\"arrchar\" char[],\n\t\t\t\t\t\"arrcidr\" \"cidr\"[],\n\t\t\t\t\t\"arrdate\" date[],\n\t\t\t\t\t\"arrdate_str\" date[],\n\t\t\t\t\t\"arrdouble\" double precision[],\n\t\t\t\t\t\"arrenum\" \"en\"[],\n\t\t\t\t\t\"arrinet\" \"inet\"[],\n\t\t\t\t\t\"arrinterval\" interval[],\n\t\t\t\t\t\"arrjson\" json[],\n\t\t\t\t\t\"arrjsonb\" jsonb[],\n\t\t\t\t\t\"arrline\" \"line\"[],\n\t\t\t\t\t\"arrline_tuple\" \"line\"[],\n\t\t\t\t\t\"arrmacaddr\" \"macaddr\"[],\n\t\t\t\t\t\"arrmacaddr8\" \"macaddr8\"[],\n\t\t\t\t\t\"arrnumeric\" numeric[],\n\t\t\t\t\t\"arrnumeric_num\" numeric[],\n\t\t\t\t\t\"arrnumeric_big\" numeric[],\n\t\t\t\t\t\"arrpoint\" \"point\"[],\n\t\t\t\t\t\"arrpoint_tuple\" \"point\"[],\n\t\t\t\t\t\"arrreal\" real[],\n\t\t\t\t\t\"arrsmallint\" smallint[],\n\t\t\t\t\t\"arrtext\" text[],\n\t\t\t\t\t\"arrtime\" time[],\n\t\t\t\t\t\"arrtimestamp\" timestamp[],\n\t\t\t\t\t\"arrtimestamp_tz\" timestamp with time zone[],\n\t\t\t\t\t\"arrtimestamp_str\" timestamp[],\n\t\t\t\t\t\"arrtimestamp_tz_str\" timestamp with time zone[],\n\t\t\t\t\t\"arruuid\" uuid[],\n\t\t\t\t\t\"arrvarchar\" varchar[]\n\t\t\t\t);\n\t\t\t`);\n\n\t\t\tawait db.insert(allTypesTable).values({\n\t\t\t\tserial: 1,\n\t\t\t\tsmallserial: 15,\n\t\t\t\tbigint53: 9007199254740991,\n\t\t\t\tbigint64: 5044565289845416380n,\n\t\t\t\tbigserial53: 9007199254740991,\n\t\t\t\tbigserial64: 5044565289845416380n,\n\t\t\t\tbool: true,\n\t\t\t\tchar: 'c',\n\t\t\t\tcidr: '2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128',\n\t\t\t\tinet: '192.168.0.1/24',\n\t\t\t\tmacaddr: '08:00:2b:01:02:03',\n\t\t\t\tmacaddr8: '08:00:2b:01:02:03:04:05',\n\t\t\t\tdate: new Date(1741743161623),\n\t\t\t\tdateStr: new Date(1741743161623).toISOString(),\n\t\t\t\tdouble: 15.35325689124218,\n\t\t\t\tenum: 'enVal1',\n\t\t\t\tint: 621,\n\t\t\t\tinterval: '2 months ago',\n\t\t\t\tjson: {\n\t\t\t\t\tstr: 'strval',\n\t\t\t\t\tarr: ['str', 10],\n\t\t\t\t},\n\t\t\t\tjsonb: {\n\t\t\t\t\tstr: 'strvalb',\n\t\t\t\t\tarr: ['strb', 11],\n\t\t\t\t},\n\t\t\t\tline: {\n\t\t\t\t\ta: 1,\n\t\t\t\t\tb: 2,\n\t\t\t\t\tc: 3,\n\t\t\t\t},\n\t\t\t\tlineTuple: [1, 2, 3],\n\t\t\t\tnumeric: '475452353476',\n\t\t\t\tnumericNum: 9007199254740991,\n\t\t\t\tnumericBig: 5044565289845416380n,\n\t\t\t\tpoint: {\n\t\t\t\t\tx: 24.5,\n\t\t\t\t\ty: 49.6,\n\t\t\t\t},\n\t\t\t\tpointTuple: [57.2, 94.3],\n\t\t\t\treal: 1.048596,\n\t\t\t\tsmallint: 10,\n\t\t\t\ttext: 'TEXT STRING',\n\t\t\t\ttime: '13:59:28',\n\t\t\t\ttimestamp: new Date(1741743161623),\n\t\t\t\ttimestampTz: new Date(1741743161623),\n\t\t\t\ttimestampStr: new Date(1741743161623).toISOString(),\n\t\t\t\ttimestampTzStr: new Date(1741743161623).toISOString(),\n\t\t\t\tuuid: 'b77c9eef-8e28-4654-88a1-7221b46d2a1c',\n\t\t\t\tvarchar: 'C4-',\n\t\t\t\tarrbigint53: [9007199254740991],\n\t\t\t\tarrbigint64: [5044565289845416380n],\n\t\t\t\tarrbool: [true],\n\t\t\t\tarrchar: ['c'],\n\t\t\t\tarrcidr: ['2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128'],\n\t\t\t\tarrinet: ['192.168.0.1/24'],\n\t\t\t\tarrmacaddr: ['08:00:2b:01:02:03'],\n\t\t\t\tarrmacaddr8: ['08:00:2b:01:02:03:04:05'],\n\t\t\t\tarrdate: [new Date(1741743161623)],\n\t\t\t\tarrdateStr: [new Date(1741743161623).toISOString()],\n\t\t\t\tarrdouble: [15.35325689124218],\n\t\t\t\tarrenum: ['enVal1'],\n\t\t\t\tarrint: [621],\n\t\t\t\tarrinterval: ['2 months ago'],\n\t\t\t\tarrjson: [{\n\t\t\t\t\tstr: 'strval',\n\t\t\t\t\tarr: ['str', 10],\n\t\t\t\t}],\n\t\t\t\tarrjsonb: [{\n\t\t\t\t\tstr: 'strvalb',\n\t\t\t\t\tarr: ['strb', 11],\n\t\t\t\t}],\n\t\t\t\tarrline: [{\n\t\t\t\t\ta: 1,\n\t\t\t\t\tb: 2,\n\t\t\t\t\tc: 3,\n\t\t\t\t}],\n\t\t\t\tarrlineTuple: [[1, 2, 3]],\n\t\t\t\tarrnumeric: ['475452353476'],\n\t\t\t\tarrnumericNum: [9007199254740991],\n\t\t\t\tarrnumericBig: [5044565289845416380n],\n\t\t\t\tarrpoint: [{\n\t\t\t\t\tx: 24.5,\n\t\t\t\t\ty: 49.6,\n\t\t\t\t}],\n\t\t\t\tarrpointTuple: [[57.2, 94.3]],\n\t\t\t\tarrreal: [1.048596],\n\t\t\t\tarrsmallint: [10],\n\t\t\t\tarrtext: ['TEXT STRING'],\n\t\t\t\tarrtime: ['13:59:28'],\n\t\t\t\tarrtimestamp: [new Date(1741743161623)],\n\t\t\t\tarrtimestampTz: [new Date(1741743161623)],\n\t\t\t\tarrtimestampStr: [new Date(1741743161623).toISOString()],\n\t\t\t\tarrtimestampTzStr: [new Date(1741743161623).toISOString()],\n\t\t\t\tarruuid: ['b77c9eef-8e28-4654-88a1-7221b46d2a1c'],\n\t\t\t\tarrvarchar: ['C4-'],\n\t\t\t});\n\n\t\t\tconst rawRes = await db.select().from(allTypesTable);\n\n\t\t\ttype ExpectedType = {\n\t\t\t\tserial: number;\n\t\t\t\tbigserial53: number;\n\t\t\t\tbigserial64: bigint;\n\t\t\t\tint: number | null;\n\t\t\t\tbigint53: number | null;\n\t\t\t\tbigint64: bigint | null;\n\t\t\t\tbool: boolean | null;\n\t\t\t\tchar: string | null;\n\t\t\t\tcidr: string | null;\n\t\t\t\tdate: Date | null;\n\t\t\t\tdateStr: string | null;\n\t\t\t\tdouble: number | null;\n\t\t\t\tenum: 'enVal1' | 'enVal2' | null;\n\t\t\t\tinet: string | null;\n\t\t\t\tinterval: string | null;\n\t\t\t\tjson: unknown;\n\t\t\t\tjsonb: unknown;\n\t\t\t\tline: {\n\t\t\t\t\ta: number;\n\t\t\t\t\tb: number;\n\t\t\t\t\tc: number;\n\t\t\t\t} | null;\n\t\t\t\tlineTuple: [number, number, number] | null;\n\t\t\t\tmacaddr: string | null;\n\t\t\t\tmacaddr8: string | null;\n\t\t\t\tnumeric: string | null;\n\t\t\t\tnumericNum: number | null;\n\t\t\t\tnumericBig: bigint | null;\n\t\t\t\tpoint: {\n\t\t\t\t\tx: number;\n\t\t\t\t\ty: number;\n\t\t\t\t} | null;\n\t\t\t\tpointTuple: [number, number] | null;\n\t\t\t\treal: number | null;\n\t\t\t\tsmallint: number | null;\n\t\t\t\tsmallserial: number;\n\t\t\t\ttext: string | null;\n\t\t\t\ttime: string | null;\n\t\t\t\ttimestamp: Date | null;\n\t\t\t\ttimestampTz: Date | null;\n\t\t\t\ttimestampStr: string | null;\n\t\t\t\ttimestampTzStr: string | null;\n\t\t\t\tuuid: string | null;\n\t\t\t\tvarchar: string | null;\n\t\t\t\tarrint: number[] | null;\n\t\t\t\tarrbigint53: number[] | null;\n\t\t\t\tarrbigint64: bigint[] | null;\n\t\t\t\tarrbool: boolean[] | null;\n\t\t\t\tarrchar: string[] | null;\n\t\t\t\tarrcidr: string[] | null;\n\t\t\t\tarrdate: Date[] | null;\n\t\t\t\tarrdateStr: string[] | null;\n\t\t\t\tarrdouble: number[] | null;\n\t\t\t\tarrenum: ('enVal1' | 'enVal2')[] | null;\n\t\t\t\tarrinet: string[] | null;\n\t\t\t\tarrinterval: string[] | null;\n\t\t\t\tarrjson: unknown[] | null;\n\t\t\t\tarrjsonb: unknown[] | null;\n\t\t\t\tarrline: {\n\t\t\t\t\ta: number;\n\t\t\t\t\tb: number;\n\t\t\t\t\tc: number;\n\t\t\t\t}[] | null;\n\t\t\t\tarrlineTuple: [number, number, number][] | null;\n\t\t\t\tarrmacaddr: string[] | null;\n\t\t\t\tarrmacaddr8: string[] | null;\n\t\t\t\tarrnumeric: string[] | null;\n\t\t\t\tarrnumericNum: number[] | null;\n\t\t\t\tarrnumericBig: bigint[] | null;\n\t\t\t\tarrpoint: { x: number; y: number }[] | null;\n\t\t\t\tarrpointTuple: [number, number][] | null;\n\t\t\t\tarrreal: number[] | null;\n\t\t\t\tarrsmallint: number[] | null;\n\t\t\t\tarrtext: string[] | null;\n\t\t\t\tarrtime: string[] | null;\n\t\t\t\tarrtimestamp: Date[] | null;\n\t\t\t\tarrtimestampTz: Date[] | null;\n\t\t\t\tarrtimestampStr: string[] | null;\n\t\t\t\tarrtimestampTzStr: string[] | null;\n\t\t\t\tarruuid: string[] | null;\n\t\t\t\tarrvarchar: string[] | null;\n\t\t\t}[];\n\n\t\t\tconst expectedRes: ExpectedType = [\n\t\t\t\t{\n\t\t\t\t\tserial: 1,\n\t\t\t\t\tbigserial53: 9007199254740991,\n\t\t\t\t\tbigserial64: 5044565289845416380n,\n\t\t\t\t\tint: 621,\n\t\t\t\t\tbigint53: 9007199254740991,\n\t\t\t\t\tbigint64: 5044565289845416380n,\n\t\t\t\t\tbool: true,\n\t\t\t\t\tchar: 'c',\n\t\t\t\t\tcidr: '2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128',\n\t\t\t\t\tdate: new Date('2025-03-12T00:00:00.000Z'),\n\t\t\t\t\tdateStr: '2025-03-12',\n\t\t\t\t\tdouble: 15.35325689124218,\n\t\t\t\t\tenum: 'enVal1',\n\t\t\t\t\tinet: '192.168.0.1/24',\n\t\t\t\t\tinterval: '-2 mons',\n\t\t\t\t\tjson: { str: 'strval', arr: ['str', 10] },\n\t\t\t\t\tjsonb: { arr: ['strb', 11], str: 'strvalb' },\n\t\t\t\t\tline: { a: 1, b: 2, c: 3 },\n\t\t\t\t\tlineTuple: [1, 2, 3],\n\t\t\t\t\tmacaddr: '08:00:2b:01:02:03',\n\t\t\t\t\tmacaddr8: '08:00:2b:01:02:03:04:05',\n\t\t\t\t\tnumeric: '475452353476',\n\t\t\t\t\tnumericNum: 9007199254740991,\n\t\t\t\t\tnumericBig: 5044565289845416380n,\n\t\t\t\t\tpoint: { x: 24.5, y: 49.6 },\n\t\t\t\t\tpointTuple: [57.2, 94.3],\n\t\t\t\t\treal: 1.048596,\n\t\t\t\t\tsmallint: 10,\n\t\t\t\t\tsmallserial: 15,\n\t\t\t\t\ttext: 'TEXT STRING',\n\t\t\t\t\ttime: '13:59:28',\n\t\t\t\t\ttimestamp: new Date('2025-03-12T01:32:41.623Z'),\n\t\t\t\t\ttimestampTz: new Date('2025-03-12T01:32:41.623Z'),\n\t\t\t\t\ttimestampStr: '2025-03-12 01:32:41.623',\n\t\t\t\t\ttimestampTzStr: '2025-03-12 01:32:41.623+00',\n\t\t\t\t\tuuid: 'b77c9eef-8e28-4654-88a1-7221b46d2a1c',\n\t\t\t\t\tvarchar: 'C4-',\n\t\t\t\t\tarrint: [621],\n\t\t\t\t\tarrbigint53: [9007199254740991],\n\t\t\t\t\tarrbigint64: [5044565289845416380n],\n\t\t\t\t\tarrbool: [true],\n\t\t\t\t\tarrchar: ['c'],\n\t\t\t\t\tarrcidr: ['2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128'],\n\t\t\t\t\tarrdate: [new Date('2025-03-12T00:00:00.000Z')],\n\t\t\t\t\tarrdateStr: ['2025-03-12'],\n\t\t\t\t\tarrdouble: [15.35325689124218],\n\t\t\t\t\tarrenum: ['enVal1'],\n\t\t\t\t\tarrinet: ['192.168.0.1/24'],\n\t\t\t\t\tarrinterval: ['-2 mons'],\n\t\t\t\t\tarrjson: [{ str: 'strval', arr: ['str', 10] }],\n\t\t\t\t\tarrjsonb: [{ arr: ['strb', 11], str: 'strvalb' }],\n\t\t\t\t\tarrline: [{ a: 1, b: 2, c: 3 }],\n\t\t\t\t\tarrlineTuple: [[1, 2, 3]],\n\t\t\t\t\tarrmacaddr: ['08:00:2b:01:02:03'],\n\t\t\t\t\tarrmacaddr8: ['08:00:2b:01:02:03:04:05'],\n\t\t\t\t\tarrnumeric: ['475452353476'],\n\t\t\t\t\tarrnumericNum: [9007199254740991],\n\t\t\t\t\tarrnumericBig: [5044565289845416380n],\n\t\t\t\t\tarrpoint: [{ x: 24.5, y: 49.6 }],\n\t\t\t\t\tarrpointTuple: [[57.2, 94.3]],\n\t\t\t\t\tarrreal: [1.048596],\n\t\t\t\t\tarrsmallint: [10],\n\t\t\t\t\tarrtext: ['TEXT STRING'],\n\t\t\t\t\tarrtime: ['13:59:28'],\n\t\t\t\t\tarrtimestamp: [new Date('2025-03-12T01:32:41.623Z')],\n\t\t\t\t\tarrtimestampTz: [new Date('2025-03-12T01:32:41.623Z')],\n\t\t\t\t\tarrtimestampStr: ['2025-03-12 01:32:41.623'],\n\t\t\t\t\tarrtimestampTzStr: ['2025-03-12 01:32:41.623+00'],\n\t\t\t\t\tarruuid: ['b77c9eef-8e28-4654-88a1-7221b46d2a1c'],\n\t\t\t\t\tarrvarchar: ['C4-'],\n\t\t\t\t},\n\t\t\t];\n\n\t\t\texpectTypeOf(rawRes).toEqualTypeOf<ExpectedType>();\n\t\t\texpect(rawRes).toStrictEqual(expectedRes);\n\t\t});\n\t});\n}\n"
  },
  {
    "path": "integration-tests/tests/pg/pg-custom.test.ts",
    "content": "import retry from 'async-retry';\nimport type Docker from 'dockerode';\nimport { asc, eq, sql } from 'drizzle-orm';\nimport type { NodePgDatabase } from 'drizzle-orm/node-postgres';\nimport { drizzle } from 'drizzle-orm/node-postgres';\nimport { migrate } from 'drizzle-orm/node-postgres/migrator';\nimport { alias, customType, pgTable, pgTableCreator, serial, text } from 'drizzle-orm/pg-core';\nimport { Client } from 'pg';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { randomString } from '~/utils';\nimport { createDockerDB } from './pg-common';\n\nconst ENABLE_LOGGING = false;\n\nlet db: NodePgDatabase;\nlet client: Client;\nlet container: Docker.Container | undefined;\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['PG_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['PG_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr, container: contrainerObj } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t\tcontainer = contrainerObj;\n\t}\n\tclient = await retry(async () => {\n\t\tclient = new Client(connectionString);\n\t\tawait client.connect();\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.end();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n\tawait container?.stop().catch(console.error);\n});\n\nbeforeEach((ctx) => {\n\tctx.pg = {\n\t\tdb,\n\t};\n});\n\nconst customSerial = customType<{ data: number; notNull: true; default: true }>({\n\tdataType() {\n\t\treturn 'serial';\n\t},\n});\n\nconst customText = customType<{ data: string }>({\n\tdataType() {\n\t\treturn 'text';\n\t},\n});\n\nconst customBoolean = customType<{ data: boolean }>({\n\tdataType() {\n\t\treturn 'boolean';\n\t},\n});\n\nconst customJsonb = <TData>(name: string) =>\n\tcustomType<{ data: TData; driverData: string }>({\n\t\tdataType() {\n\t\t\treturn 'jsonb';\n\t\t},\n\t\ttoDriver(value: TData): string {\n\t\t\treturn JSON.stringify(value);\n\t\t},\n\t})(name);\n\nconst customTimestamp = customType<\n\t{ data: Date; driverData: string; config: { withTimezone: boolean; precision?: number } }\n>({\n\tdataType(config) {\n\t\tconst precision = config?.precision === undefined ? '' : ` (${config.precision})`;\n\t\treturn `timestamp${precision}${config?.withTimezone ? ' with time zone' : ''}`;\n\t},\n\tfromDriver(value: string): Date {\n\t\treturn new Date(value);\n\t},\n});\n\nconst usersTable = pgTable('users', {\n\tid: customSerial('id').primaryKey(),\n\tname: customText('name').notNull(),\n\tverified: customBoolean('verified').notNull().default(false),\n\tjsonb: customJsonb<string[]>('jsonb'),\n\tcreatedAt: customTimestamp('created_at', { withTimezone: true }).notNull().default(sql`now()`),\n});\n\nconst usersMigratorTable = pgTable('users12', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n});\n\nbeforeEach(async (ctx) => {\n\tconst { db } = ctx.pg;\n\tawait db.execute(sql`drop schema if exists public cascade`);\n\tawait db.execute(sql`create schema public`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified boolean not null default false, \n\t\t\t\tjsonb jsonb,\n\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t)\n\t\t`,\n\t);\n});\n\ntest('select all fields', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst now = Date.now();\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(result[0]!.createdAt.getTime() - now)).toBeLessThan(100);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('select sql', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql`upper(${usersTable.name})`,\n\t}).from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('select typed sql', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql<string>`upper(${usersTable.name})`,\n\t}).from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('insert returning sql', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst users = await db.insert(usersTable).values({ name: 'John' }).returning({\n\t\tname: sql`upper(${usersTable.name})`,\n\t});\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('delete returning sql', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning({\n\t\tname: sql`upper(${usersTable.name})`,\n\t});\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('update returning sql', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning({\n\t\tname: sql`upper(${usersTable.name})`,\n\t});\n\n\texpect(users).toEqual([{ name: 'JANE' }]);\n});\n\ntest('update with returning all fields', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst now = Date.now();\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning();\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(100);\n\texpect(users).toEqual([{ id: 1, name: 'Jane', verified: false, jsonb: null, createdAt: users[0]!.createdAt }]);\n});\n\ntest('update with returning partial', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t});\n\n\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n});\n\ntest('delete with returning all fields', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst now = Date.now();\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning();\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(100);\n\texpect(users).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: users[0]!.createdAt }]);\n});\n\ntest('delete with returning partial', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t});\n\n\texpect(users).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert + select', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\n\tawait db.insert(usersTable).values({ name: 'Jane' });\n\tconst result2 = await db.select().from(usersTable);\n\texpect(result2).toEqual([\n\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result2[0]!.createdAt },\n\t\t{ id: 2, name: 'Jane', verified: false, jsonb: null, createdAt: result2[1]!.createdAt },\n\t]);\n});\n\ntest('json insert', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: 'John', jsonb: ['foo', 'bar'] });\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tjsonb: usersTable.jsonb,\n\t}).from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', jsonb: ['foo', 'bar'] }]);\n});\n\ntest('insert with overridden default values', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: 'John', verified: true });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: true, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('insert many', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Austin', verified: true },\n\t]);\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tjsonb: usersTable.jsonb,\n\t\tverified: usersTable.verified,\n\t}).from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t]);\n});\n\ntest('insert many with returning', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst result = await db.insert(usersTable).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Austin', verified: true },\n\t])\n\t\t.returning({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t\tjsonb: usersTable.jsonb,\n\t\t\tverified: usersTable.verified,\n\t\t});\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t]);\n});\n\ntest('select with group by as field', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.name);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('select with group by as sql', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('select with group by as sql + column', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`, usersTable.id);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('select with group by as column + sql', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`);\n\n\texpect(result).toEqual([{ name: 'Jane' }, { name: 'Jane' }, { name: 'John' }]);\n});\n\ntest('select with group by complex query', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t.orderBy(asc(usersTable.name))\n\t\t.limit(1);\n\n\texpect(result).toEqual([{ name: 'Jane' }]);\n});\n\ntest('build query', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst query = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, usersTable.name)\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\", \"users\".\"name\"',\n\t\tparams: [],\n\t});\n});\n\ntest('insert sql', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: sql`${'John'}` });\n\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('partial join with alias', async (ctx) => {\n\tconst { db } = ctx.pg;\n\tconst customerAlias = alias(usersTable, 'customer');\n\n\tawait db.insert(usersTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select({\n\t\t\tuser: {\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t},\n\t\t\tcustomer: {\n\t\t\t\tid: customerAlias.id,\n\t\t\t\tname: customerAlias.name,\n\t\t\t},\n\t\t}).from(usersTable)\n\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t.where(eq(usersTable.id, 10));\n\n\texpect(result).toEqual([{\n\t\tuser: { id: 10, name: 'Ivan' },\n\t\tcustomer: { id: 11, name: 'Hans' },\n\t}]);\n});\n\ntest('full join with alias', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst pgTable = pgTableCreator((name) => `prefixed_${name}`);\n\n\tconst users = pgTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\tconst customers = alias(users, 'customer');\n\n\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select().from(users)\n\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t.where(eq(users.id, 10));\n\n\texpect(result).toEqual([{\n\t\tusers: {\n\t\t\tid: 10,\n\t\t\tname: 'Ivan',\n\t\t},\n\t\tcustomer: {\n\t\t\tid: 11,\n\t\t\tname: 'Hans',\n\t\t},\n\t}]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('insert with spaces', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: sql`'Jo   h     n'` });\n\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n});\n\ntest('prepared statement', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst statement = db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t}).from(usersTable)\n\t\t.prepare('statement1');\n\tconst result = await statement.execute();\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('prepared statement reuse', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst stmt = db.insert(usersTable).values({\n\t\tverified: true,\n\t\tname: sql.placeholder('name'),\n\t}).prepare('stmt2');\n\n\tfor (let i = 0; i < 10; i++) {\n\t\tawait stmt.execute({ name: `John ${i}` });\n\t}\n\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tverified: usersTable.verified,\n\t}).from(usersTable);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John 0', verified: true },\n\t\t{ id: 2, name: 'John 1', verified: true },\n\t\t{ id: 3, name: 'John 2', verified: true },\n\t\t{ id: 4, name: 'John 3', verified: true },\n\t\t{ id: 5, name: 'John 4', verified: true },\n\t\t{ id: 6, name: 'John 5', verified: true },\n\t\t{ id: 7, name: 'John 6', verified: true },\n\t\t{ id: 8, name: 'John 7', verified: true },\n\t\t{ id: 9, name: 'John 8', verified: true },\n\t\t{ id: 10, name: 'John 9', verified: true },\n\t]);\n});\n\ntest('prepared statement with placeholder in .where', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst stmt = db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t}).from(usersTable)\n\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t.prepare('stmt3');\n\tconst result = await stmt.execute({ id: 1 });\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('prepared statement with placeholder in .limit', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst stmt = db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t})\n\t\t.from(usersTable)\n\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t.limit(sql.placeholder('limit'))\n\t\t.prepare('stmt_limit');\n\n\tconst result = await stmt.execute({ id: 1, limit: 1 });\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\texpect(result).toHaveLength(1);\n});\n\ntest('prepared statement with placeholder in .offset', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]);\n\tconst stmt = db\n\t\t.select({\n\t\t\tid: usersTable.id,\n\t\t\tname: usersTable.name,\n\t\t})\n\t\t.from(usersTable)\n\t\t.offset(sql.placeholder('offset'))\n\t\t.prepare('stmt_offset');\n\n\tconst result = await stmt.execute({ offset: 1 });\n\n\texpect(result).toEqual([{ id: 2, name: 'John1' }]);\n});\n\ntest('migrator : default migration strategy', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom schema', async () => {\n\tconst customSchema = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg', migrationsSchema: customSchema });\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(sql`select * from ${sql.identifier(customSchema)}.\"__drizzle_migrations\";`);\n\texpect(rowCount! > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table ${sql.identifier(customSchema)}.\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg', migrationsTable: customTable });\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(sql`select * from \"drizzle\".${sql.identifier(customTable)};`);\n\texpect(rowCount! > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".${sql.identifier(customTable)}`);\n});\n\ntest('migrator : migrate with custom table and custom schema', async () => {\n\tconst customTable = randomString();\n\tconst customSchema = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, {\n\t\tmigrationsFolder: './drizzle2/pg',\n\t\tmigrationsTable: customTable,\n\t\tmigrationsSchema: customSchema,\n\t});\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(\n\t\tsql`select * from ${sql.identifier(customSchema)}.${sql.identifier(customTable)};`,\n\t);\n\texpect(rowCount! > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table ${sql.identifier(customSchema)}.${sql.identifier(customTable)}`);\n});\n\ntest('insert via db.execute + select via db.execute', async () => {\n\tawait db.execute(sql`insert into ${usersTable} (${sql.identifier(usersTable.name.name)}) values (${'John'})`);\n\n\tconst result = await db.execute<{ id: number; name: string }>(sql`select id, name from \"users\"`);\n\texpect(result.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute + returning', async () => {\n\tconst inserted = await db.execute<{ id: number; name: string }>(\n\t\tsql`insert into ${usersTable} (${\n\t\t\tsql.identifier(usersTable.name.name)\n\t\t}) values (${'John'}) returning ${usersTable.id}, ${usersTable.name}`,\n\t);\n\texpect(inserted.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async () => {\n\tconst inserted = await db.execute<Pick<typeof usersTable.$inferSelect, 'id' | 'name'>>(\n\t\tdb.insert(usersTable).values({ name: 'John' }).returning({ id: usersTable.id, name: usersTable.name }),\n\t);\n\texpect(inserted.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('build query insert with onConflict do update', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst query = db.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoUpdate({ target: usersTable.id, set: { name: 'John1' } })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\") do update set \"name\" = $3',\n\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t});\n});\n\ntest('build query insert with onConflict do update / multiple columns', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst query = db.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoUpdate({ target: [usersTable.id, usersTable.name], set: { name: 'John1' } })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\",\"name\") do update set \"name\" = $3',\n\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t});\n});\n\ntest('build query insert with onConflict do nothing', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst query = db.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoNothing()\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict do nothing',\n\t\tparams: ['John', '[\"foo\",\"bar\"]'],\n\t});\n});\n\ntest('build query insert with onConflict do nothing + target', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tconst query = db.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onConflictDoNothing({ target: usersTable.id })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into \"users\" (\"id\", \"name\", \"verified\", \"jsonb\", \"created_at\") values (default, $1, default, $2, default) on conflict (\"id\") do nothing',\n\t\tparams: ['John', '[\"foo\",\"bar\"]'],\n\t});\n});\n\ntest('insert with onConflict do update', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable)\n\t\t.values({ name: 'John' });\n\n\tawait db.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' })\n\t\t.onConflictDoUpdate({ target: usersTable.id, set: { name: 'John1' } });\n\n\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(res).toEqual([{ id: 1, name: 'John1' }]);\n});\n\ntest('insert with onConflict do nothing', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable)\n\t\t.values({ name: 'John' });\n\n\tawait db.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' })\n\t\t.onConflictDoNothing();\n\n\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert with onConflict do nothing + target', async (ctx) => {\n\tconst { db } = ctx.pg;\n\n\tawait db.insert(usersTable)\n\t\t.values({ name: 'John' });\n\n\tawait db.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' })\n\t\t.onConflictDoNothing({ target: usersTable.id });\n\n\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n});\n"
  },
  {
    "path": "integration-tests/tests/pg/pg-proxy.test.ts",
    "content": "import retry from 'async-retry';\nimport { sql } from 'drizzle-orm';\nimport { pgTable, serial, timestamp } from 'drizzle-orm/pg-core';\nimport type { PgRemoteDatabase } from 'drizzle-orm/pg-proxy';\nimport { drizzle as proxyDrizzle } from 'drizzle-orm/pg-proxy';\nimport { migrate } from 'drizzle-orm/pg-proxy/migrator';\nimport * as pg from 'pg';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { createDockerDB, tests, usersMigratorTable, usersTable } from './pg-common';\nimport { TestCache, TestGlobalCache, tests as cacheTests } from './pg-common-cache';\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nclass ServerSimulator {\n\tconstructor(private db: pg.Client) {\n\t\tconst { types } = pg;\n\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMPTZ, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMP, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.DATE, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.INTERVAL, (val) => val);\n\t\ttypes.setTypeParser(1231, (val) => val);\n\t\ttypes.setTypeParser(1115, (val) => val);\n\t\ttypes.setTypeParser(1185, (val) => val);\n\t\ttypes.setTypeParser(1187, (val) => val);\n\t\ttypes.setTypeParser(1182, (val) => val);\n\t}\n\n\tasync query(sql: string, params: any[], method: 'all' | 'execute') {\n\t\tif (method === 'all') {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db.query({\n\t\t\t\t\ttext: sql,\n\t\t\t\t\tvalues: params,\n\t\t\t\t\trowMode: 'array',\n\t\t\t\t});\n\n\t\t\t\treturn { data: result.rows as any };\n\t\t\t} catch (e: any) {\n\t\t\t\treturn { error: e };\n\t\t\t}\n\t\t} else if (method === 'execute') {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db.query({\n\t\t\t\t\ttext: sql,\n\t\t\t\t\tvalues: params,\n\t\t\t\t});\n\n\t\t\t\treturn { data: result.rows as any };\n\t\t\t} catch (e: any) {\n\t\t\t\treturn { error: e };\n\t\t\t}\n\t\t} else {\n\t\t\treturn { error: 'Unknown method value' };\n\t\t}\n\t}\n\n\tasync migrations(queries: string[]) {\n\t\tawait this.db.query('BEGIN');\n\t\ttry {\n\t\t\tfor (const query of queries) {\n\t\t\t\tawait this.db.query(query);\n\t\t\t}\n\t\t\tawait this.db.query('COMMIT');\n\t\t} catch (e) {\n\t\t\tawait this.db.query('ROLLBACK');\n\t\t\tthrow e;\n\t\t}\n\n\t\treturn {};\n\t}\n}\n\nconst ENABLE_LOGGING = false;\n\nlet db: PgRemoteDatabase;\nlet dbGlobalCached: PgRemoteDatabase;\nlet cachedDb: PgRemoteDatabase;\nlet client: pg.Client;\nlet serverSimulator: ServerSimulator;\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['PG_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['PG_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t}\n\tclient = await retry(async () => {\n\t\tclient = new pg.Client(connectionString);\n\t\tawait client.connect();\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.end();\n\t\t},\n\t});\n\tserverSimulator = new ServerSimulator(client);\n\tconst proxyHandler = async (sql: string, params: any[], method: any) => {\n\t\ttry {\n\t\t\tconst response = await serverSimulator.query(sql, params, method);\n\n\t\t\tif (response.error !== undefined) {\n\t\t\t\tthrow response.error;\n\t\t\t}\n\n\t\t\treturn { rows: response.data };\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error from pg proxy server:', e.message);\n\t\t\tthrow e;\n\t\t}\n\t};\n\tdb = proxyDrizzle(proxyHandler, {\n\t\tlogger: ENABLE_LOGGING,\n\t});\n\n\tcachedDb = proxyDrizzle(proxyHandler, { logger: ENABLE_LOGGING, cache: new TestCache() });\n\tdbGlobalCached = proxyDrizzle(proxyHandler, { logger: ENABLE_LOGGING, cache: new TestGlobalCache() });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n});\n\nbeforeEach((ctx) => {\n\tctx.pg = {\n\t\tdb,\n\t};\n\tctx.cachedPg = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ntest('migrator : default migration strategy', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\t// './drizzle2/pg-proxy/first' ??\n\tawait migrate(db, async (queries) => {\n\t\ttry {\n\t\t\tawait serverSimulator.migrations(queries);\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t\tthrow new Error('Proxy server cannot run migrations');\n\t\t}\n\t}, { migrationsFolder: './drizzle2/pg' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".\"__drizzle_migrations\"`);\n});\n\ntest('all date and time columns without timezone first case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format without timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01 02:00:00.123456' },\n\t]);\n\n\t// 2, Select in string format and check that values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456' }]);\n\n\t// 3. Select as raw query and check that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result2).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone second case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01T02:00:00.123456-02' },\n\t]);\n\n\t// 2, Select as raw query and check that values are the same\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone third case mode date', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) not null\n\t\t\t)\n\t`);\n\n\tconst insertedDate = new Date('2022-01-01 20:00:00.123+04');\n\n\t// 1. Insert date as new date\n\tawait db.insert(table).values([\n\t\t{ timestamp: insertedDate },\n\t]);\n\n\t// 2, Select as raw query as string\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3. Compare both dates using orm mapping - Need to add 'Z' to tell JS that it is UTC\n\texpect(new Date(result[0]!.timestamp_string + 'Z').getTime()).toBe(insertedDate.getTime());\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode date for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', withTimezone: true, precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = new Date('2022-01-01 00:00:00.456-0200');\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: timestampString }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone in UTC timezone', async () => {\n\t// get current timezone from db\n\tconst timezone = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to UTC\n\tawait db.execute(sql`set time zone 'UTC'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone[0]!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone in different timezone', async () => {\n\t// get current timezone from db\n\tconst timezone = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to HST (UTC - 10)\n\tawait db.execute(sql`set time zone '-10'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-1000';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 00:00:00.123456-10' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result2).toEqual([{ id: 1, timestamp_string: '2022-01-01 00:00:00.123456-10' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone[0]!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\nskipTests([\n\t'migrator : default migration strategy',\n\t'migrator : migrate with custom schema',\n\t'migrator : migrate with custom table',\n\t'migrator : migrate with custom table and custom schema',\n\t'insert via db.execute + select via db.execute',\n\t'insert via db.execute + returning',\n\t'insert via db.execute w/ query builder',\n\t'all date and time columns without timezone first case mode string',\n\t'all date and time columns without timezone third case mode date',\n\t'test mode string for timestamp with timezone',\n\t'test mode date for timestamp with timezone',\n\t'test mode string for timestamp with timezone in UTC timezone',\n\t'test mode string for timestamp with timezone in different timezone',\n\t'transaction',\n\t'transaction rollback',\n\t'nested transaction',\n\t'nested transaction rollback',\n\t'test $onUpdateFn and $onUpdate works updating',\n]);\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop schema if exists public cascade`);\n\tawait db.execute(sql`create schema public`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified boolean not null default false, \n\t\t\t\tjsonb jsonb,\n\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t)\n\t\t`,\n\t);\n});\n\ntest('insert via db.execute + select via db.execute', async () => {\n\tawait db.execute(\n\t\tsql`insert into ${usersTable} (${sql.identifier(usersTable.name.name)}) values (${'John'})`,\n\t);\n\n\tconst result = await db.execute<{ id: number; name: string }>(\n\t\tsql`select id, name from \"users\"`,\n\t);\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute + returning', async () => {\n\tconst inserted = await db.execute<{ id: number; name: string }>(\n\t\tsql`insert into ${usersTable} (${\n\t\t\tsql.identifier(\n\t\t\t\tusersTable.name.name,\n\t\t\t)\n\t\t}) values (${'John'}) returning ${usersTable.id}, ${usersTable.name}`,\n\t);\n\texpect(inserted).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async () => {\n\tconst inserted = await db.execute<Pick<typeof usersTable.$inferSelect, 'id' | 'name'>>(\n\t\tdb\n\t\t\t.insert(usersTable)\n\t\t\t.values({ name: 'John' })\n\t\t\t.returning({ id: usersTable.id, name: usersTable.name }),\n\t);\n\texpect(inserted).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntests();\ncacheTests();\n"
  },
  {
    "path": "integration-tests/tests/pg/pglite.test.ts",
    "content": "import { PGlite } from '@electric-sql/pglite';\nimport { Name, sql } from 'drizzle-orm';\nimport { drizzle, type PgliteDatabase } from 'drizzle-orm/pglite';\nimport { migrate } from 'drizzle-orm/pglite/migrator';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { tests, usersMigratorTable, usersTable } from './pg-common';\nimport { TestCache, TestGlobalCache, tests as cacheTests } from './pg-common-cache';\n\nconst ENABLE_LOGGING = false;\n\nlet db: PgliteDatabase;\nlet dbGlobalCached: PgliteDatabase;\nlet cachedDb: PgliteDatabase;\nlet client: PGlite;\n\nbeforeAll(async () => {\n\tclient = new PGlite();\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(client, {\n\t\tlogger: ENABLE_LOGGING,\n\t\tcache: new TestCache(),\n\t});\n\tdbGlobalCached = drizzle(client, {\n\t\tlogger: ENABLE_LOGGING,\n\t\tcache: new TestGlobalCache(),\n\t});\n});\n\nafterAll(async () => {\n\tawait client?.close();\n});\n\nbeforeEach((ctx) => {\n\tctx.pg = {\n\t\tdb,\n\t};\n\tctx.cachedPg = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ntest('migrator : default migration strategy', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(\n\t\tsql`drop table if exists users12`,\n\t);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".\"__drizzle_migrations\"`);\n});\n\ntest('insert via db.execute + select via db.execute', async () => {\n\tawait db.execute(sql`insert into ${usersTable} (${new Name(usersTable.name.name)}) values (${'John'})`);\n\n\tconst result = await db.execute<{ id: number; name: string }>(sql`select id, name from \"users\"`);\n\texpect(Array.prototype.slice.call(result.rows)).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute + returning', async () => {\n\tconst result = await db.execute<{ id: number; name: string }>(\n\t\tsql`insert into ${usersTable} (${new Name(\n\t\t\tusersTable.name.name,\n\t\t)}) values (${'John'}) returning ${usersTable.id}, ${usersTable.name}`,\n\t);\n\texpect(Array.prototype.slice.call(result.rows)).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async () => {\n\tconst result = await db.execute<Pick<typeof usersTable.$inferSelect, 'id' | 'name'>>(\n\t\tdb.insert(usersTable).values({ name: 'John' }).returning({ id: usersTable.id, name: usersTable.name }),\n\t);\n\texpect(Array.prototype.slice.call(result.rows)).toEqual([{ id: 1, name: 'John' }]);\n});\n\nskipTests([\n\t'migrator : default migration strategy',\n\t'migrator : migrate with custom schema',\n\t'migrator : migrate with custom table',\n\t'migrator : migrate with custom table and custom schema',\n\t'insert via db.execute + select via db.execute',\n\t'insert via db.execute + returning',\n\t'insert via db.execute w/ query builder',\n\t'all date and time columns without timezone first case mode string',\n\t'all date and time columns without timezone third case mode date',\n\t'test mode string for timestamp with timezone',\n\t'test mode date for timestamp with timezone',\n\t'test mode string for timestamp with timezone in UTC timezone',\n\t'test mode string for timestamp with timezone in different timezone',\n\t'view',\n\t'materialized view',\n\t'subquery with view',\n\t'mySchema :: materialized view',\n\t'select count()',\n\t// not working in 0.2.12\n\t'select with group by as sql + column',\n\t'select with group by as column + sql',\n\t'mySchema :: select with group by as column + sql',\n]);\n\ntests();\ncacheTests();\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop schema if exists public cascade`);\n\tawait db.execute(sql`create schema public`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified boolean not null default false,\n\t\t\t\tjsonb jsonb,\n\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t)\n\t\t`,\n\t);\n});\n"
  },
  {
    "path": "integration-tests/tests/pg/postgres-js.test.ts",
    "content": "import retry from 'async-retry';\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\nimport { drizzle } from 'drizzle-orm/postgres-js';\nimport postgres, { type Sql } from 'postgres';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\n\nimport { Name, sql } from 'drizzle-orm';\nimport { pgTable, serial, timestamp } from 'drizzle-orm/pg-core';\nimport { migrate } from 'drizzle-orm/postgres-js/migrator';\nimport { skipTests } from '~/common';\nimport { randomString } from '~/utils';\nimport { createDockerDB, tests, usersMigratorTable, usersTable } from './pg-common';\nimport { TestCache, TestGlobalCache, tests as cacheTests } from './pg-common-cache';\n\nconst ENABLE_LOGGING = false;\n\nlet db: PostgresJsDatabase;\nlet dbGlobalCached: PostgresJsDatabase;\nlet cachedDb: PostgresJsDatabase;\nlet client: Sql;\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['PG_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['PG_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t}\n\tclient = await retry(async () => {\n\t\tclient = postgres(connectionString, {\n\t\t\tmax: 1,\n\t\t\tonnotice: () => {\n\t\t\t\t// disable notices\n\t\t\t},\n\t\t});\n\t\tawait client`select 1`;\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.end();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestCache() });\n\tdbGlobalCached = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestGlobalCache() });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n});\n\nbeforeEach((ctx) => {\n\tctx.pg = {\n\t\tdb,\n\t};\n\tctx.cachedPg = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ntest('migrator : default migration strategy', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom schema', async () => {\n\tconst customSchema = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg', migrationsSchema: customSchema });\n\n\t// test if the custom migrations table was created\n\tconst { count } = await db.execute(sql`select * from ${sql.identifier(customSchema)}.\"__drizzle_migrations\";`);\n\texpect(count > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table ${sql.identifier(customSchema)}.\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg', migrationsTable: customTable });\n\n\t// test if the custom migrations table was created\n\tconst { count } = await db.execute(sql`select * from \"drizzle\".${sql.identifier(customTable)};`);\n\texpect(count > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".${sql.identifier(customTable)}`);\n});\n\ntest('migrator : migrate with custom table and custom schema', async () => {\n\tconst customTable = randomString();\n\tconst customSchema = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, {\n\t\tmigrationsFolder: './drizzle2/pg',\n\t\tmigrationsTable: customTable,\n\t\tmigrationsSchema: customSchema,\n\t});\n\n\t// test if the custom migrations table was created\n\tconst { count } = await db.execute(\n\t\tsql`select * from ${sql.identifier(customSchema)}.${sql.identifier(customTable)};`,\n\t);\n\texpect(count > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table ${sql.identifier(customSchema)}.${sql.identifier(customTable)}`);\n});\n\ntest('all date and time columns without timezone first case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format without timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01 02:00:00.123456' },\n\t]);\n\n\t// 2, Select in string format and check that values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456' }]);\n\n\t// 3. Select as raw query and check that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect([...result2]).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone second case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01T02:00:00.123456-02' },\n\t]);\n\n\t// 2, Select as raw query and check that values are the same\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect([...result]).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone third case mode date', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) not null\n\t\t\t)\n\t`);\n\n\tconst insertedDate = new Date('2022-01-01 20:00:00.123+04');\n\n\t// 1. Insert date as new date\n\tawait db.insert(table).values([\n\t\t{ timestamp: insertedDate },\n\t]);\n\n\t// 2, Select as raw query as string\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3. Compare both dates using orm mapping - Need to add 'Z' to tell JS that it is UTC\n\texpect(new Date(result[0]!.timestamp_string + 'Z').getTime()).toBe(insertedDate.getTime());\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect([...result2]).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode date for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', withTimezone: true, precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = new Date('2022-01-01 00:00:00.456-0200');\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: timestampString }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect([...result2]).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone in UTC timezone', async () => {\n\t// get current timezone from db\n\tconst [timezone] = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to UTC\n\tawait db.execute(sql`set time zone 'UTC'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect([...result2]).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone in different timezone', async () => {\n\t// get current timezone from db\n\tconst [timezone] = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to HST (UTC - 10)\n\tawait db.execute(sql`set time zone '-10'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-1000';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 00:00:00.123456-10' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect([...result2]).toEqual([{ id: 1, timestamp_string: '2022-01-01 00:00:00.123456-10' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\nskipTests([\n\t'migrator : default migration strategy',\n\t'migrator : migrate with custom schema',\n\t'migrator : migrate with custom table',\n\t'migrator : migrate with custom table and custom schema',\n\t'insert via db.execute + select via db.execute',\n\t'insert via db.execute + returning',\n\t'insert via db.execute w/ query builder',\n\t'all date and time columns without timezone first case mode string',\n\t'all date and time columns without timezone third case mode date',\n\t'test mode string for timestamp with timezone',\n\t'test mode date for timestamp with timezone',\n\t'test mode string for timestamp with timezone in UTC timezone',\n\t'test mode string for timestamp with timezone in different timezone',\n]);\n\ntests();\ncacheTests();\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop schema if exists public cascade`);\n\tawait db.execute(sql`create schema public`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified boolean not null default false, \n\t\t\t\tjsonb jsonb,\n\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t)\n\t\t`,\n\t);\n});\n\ntest('insert via db.execute + select via db.execute', async () => {\n\tawait db.execute(sql`insert into ${usersTable} (${new Name(usersTable.name.name)}) values (${'John'})`);\n\n\tconst result = await db.execute<{ id: number; name: string }>(sql`select id, name from \"users\"`);\n\texpect(Array.prototype.slice.call(result)).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute + returning', async () => {\n\tconst result = await db.execute<{ id: number; name: string }>(\n\t\tsql`insert into ${usersTable} (${new Name(\n\t\t\tusersTable.name.name,\n\t\t)}) values (${'John'}) returning ${usersTable.id}, ${usersTable.name}`,\n\t);\n\texpect(Array.prototype.slice.call(result)).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async () => {\n\tconst result = await db.execute<Pick<typeof usersTable.$inferSelect, 'id' | 'name'>>(\n\t\tdb.insert(usersTable).values({ name: 'John' }).returning({ id: usersTable.id, name: usersTable.name }),\n\t);\n\texpect(Array.prototype.slice.call(result)).toEqual([{ id: 1, name: 'John' }]);\n});\n"
  },
  {
    "path": "integration-tests/tests/pg/rls/rls.definition.test.ts",
    "content": "import { crudPolicy } from 'drizzle-orm/neon';\nimport { getTableConfig, integer, pgPolicy, pgRole, pgTable } from 'drizzle-orm/pg-core';\nimport { test } from 'vitest';\n\ntest.skip('getTableConfig: policies', async () => {\n\tconst schema = pgTable('hhh', {\n\t\tid: integer(),\n\t}, () => [\n\t\tpgPolicy('name'),\n\t\tcrudPolicy({ role: pgRole('users'), read: true, modify: true }),\n\t]);\n\n\tconst tc = getTableConfig(schema);\n\n\tconsole.log(tc.policies);\n});\n"
  },
  {
    "path": "integration-tests/tests/pg/vercel-pg.test.ts",
    "content": "import { createClient, type VercelClient } from '@vercel/postgres';\nimport { sql } from 'drizzle-orm';\nimport { pgTable, serial, timestamp } from 'drizzle-orm/pg-core';\nimport { drizzle, type VercelPgDatabase } from 'drizzle-orm/vercel-postgres';\nimport { migrate } from 'drizzle-orm/vercel-postgres/migrator';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { randomString } from '~/utils';\nimport { createDockerDB, tests, tests as cacheTests, usersMigratorTable, usersTable } from './pg-common';\nimport { TestCache, TestGlobalCache } from './pg-common-cache';\n\nconst ENABLE_LOGGING = false;\n\nlet db: VercelPgDatabase;\nlet dbGlobalCached: VercelPgDatabase;\nlet cachedDb: VercelPgDatabase;\nlet client: VercelClient;\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['PG_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['PG_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t}\n\n\tconst sleep = 250;\n\tlet timeLeft = 5000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = createClient({ connectionString });\n\t\t\tawait client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.log(connectionString);\n\t\tconsole.error('Cannot connect to Postgres');\n\t\tawait client?.end().catch(console.error);\n\t\t// await pgContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestCache() });\n\tdbGlobalCached = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestGlobalCache() });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n});\n\nbeforeEach((ctx) => {\n\tctx.pg = {\n\t\tdb,\n\t};\n\tctx.cachedPg = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ntest('migrator : default migration strategy', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom schema', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg', migrationsSchema: 'custom_migrations' });\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(sql`select * from custom_migrations.\"__drizzle_migrations\";`);\n\texpect(rowCount && rowCount > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table custom_migrations.\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg', migrationsTable: customTable });\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(sql`select * from \"drizzle\".${sql.identifier(customTable)};`);\n\texpect(rowCount && rowCount > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".${sql.identifier(customTable)}`);\n});\n\ntest('migrator : migrate with custom table and custom schema', async () => {\n\tconst customTable = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, {\n\t\tmigrationsFolder: './drizzle2/pg',\n\t\tmigrationsTable: customTable,\n\t\tmigrationsSchema: 'custom_migrations',\n\t});\n\n\t// test if the custom migrations table was created\n\tconst { rowCount } = await db.execute(\n\t\tsql`select * from custom_migrations.${sql.identifier(customTable)};`,\n\t);\n\texpect(rowCount && rowCount > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table custom_migrations.${sql.identifier(customTable)}`);\n});\n\ntest('all date and time columns without timezone first case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format without timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01 02:00:00.123456' },\n\t]);\n\n\t// 2, Select in string format and check that values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456' }]);\n\n\t// 3. Select as raw query and check that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone second case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01T02:00:00.123456-02' },\n\t]);\n\n\t// 2, Select as raw query and check that values are the same\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone third case mode date', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) not null\n\t\t\t)\n\t`);\n\n\tconst insertedDate = new Date('2022-01-01 20:00:00.123+04');\n\n\t// 1. Insert date as new date\n\tawait db.insert(table).values([\n\t\t{ timestamp: insertedDate },\n\t]);\n\n\t// 2, Select as raw query as string\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3. Compare both dates using orm mapping - Need to add 'Z' to tell JS that it is UTC\n\texpect(new Date(result.rows[0]!.timestamp_string + 'Z').getTime()).toBe(insertedDate.getTime());\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode date for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', withTimezone: true, precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = new Date('2022-01-01 00:00:00.456-0200');\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: timestampString }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone in UTC timezone', async () => {\n\t// get current timezone from db\n\tconst timezone = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to UTC\n\tawait db.execute(sql`set time zone 'UTC'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone.rows[0]!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone in different timezone', async () => {\n\t// get current timezone from db\n\tconst timezone = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to HST (UTC - 10)\n\tawait db.execute(sql`set time zone 'HST'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-1000';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 00:00:00.123456-10' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result2.rows).toEqual([{ id: 1, timestamp_string: '2022-01-01 00:00:00.123456-10' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone.rows[0]!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\nskipTests([\n\t'migrator : default migration strategy',\n\t'migrator : migrate with custom schema',\n\t'migrator : migrate with custom table',\n\t'migrator : migrate with custom table and custom schema',\n\t'insert via db.execute + select via db.execute',\n\t'insert via db.execute + returning',\n\t'insert via db.execute w/ query builder',\n\t'all date and time columns without timezone first case mode string',\n\t'all date and time columns without timezone third case mode date',\n\t'test mode string for timestamp with timezone',\n\t'test mode date for timestamp with timezone',\n\t'test mode string for timestamp with timezone in UTC timezone',\n\t'test mode string for timestamp with timezone in different timezone',\n\t'build query insert with onConflict do nothing + target', //\n\t'select from tables with same name from different schema using alias', //\n]);\ntests();\ncacheTests();\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop schema if exists public cascade`);\n\tawait db.execute(sql`create schema public`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified boolean not null default false, \n\t\t\t\tjsonb jsonb,\n\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t)\n\t\t`,\n\t);\n});\n\ntest('insert via db.execute + select via db.execute', async () => {\n\tawait db.execute(\n\t\tsql`insert into ${usersTable} (${sql.identifier(usersTable.name.name)}) values (${'John'})`,\n\t);\n\n\tconst result = await db.execute<{ id: number; name: string }>(\n\t\tsql`select id, name from \"users\"`,\n\t);\n\texpect(result.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute + returning', async () => {\n\tconst inserted = await db.execute<{ id: number; name: string }>(\n\t\tsql`insert into ${usersTable} (${\n\t\t\tsql.identifier(\n\t\t\t\tusersTable.name.name,\n\t\t\t)\n\t\t}) values (${'John'}) returning ${usersTable.id}, ${usersTable.name}`,\n\t);\n\texpect(inserted.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async () => {\n\tconst inserted = await db.execute<Pick<typeof usersTable.$inferSelect, 'id' | 'name'>>(\n\t\tdb\n\t\t\t.insert(usersTable)\n\t\t\t.values({ name: 'John' })\n\t\t\t.returning({ id: usersTable.id, name: usersTable.name }),\n\t);\n\texpect(inserted.rows).toEqual([{ id: 1, name: 'John' }]);\n});\n"
  },
  {
    "path": "integration-tests/tests/pg/xata-http.test.ts",
    "content": "import retry from 'async-retry';\nimport { sql } from 'drizzle-orm';\nimport { pgTable, serial, timestamp } from 'drizzle-orm/pg-core';\nimport { drizzle } from 'drizzle-orm/xata-http';\nimport type { XataHttpClient, XataHttpDatabase } from 'drizzle-orm/xata-http';\nimport { migrate } from 'drizzle-orm/xata-http/migrator';\nimport { beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { randomString } from '~/utils';\nimport { getXataClient } from '../xata/xata.ts';\nimport { tests, tests as cacheTests, usersMigratorTable, usersTable } from './pg-common';\nimport { TestCache, TestGlobalCache } from './pg-common-cache.ts';\n\nconst ENABLE_LOGGING = false;\n\nlet db: XataHttpDatabase;\nlet dbGlobalCached: XataHttpDatabase;\nlet cachedDb: XataHttpDatabase;\nlet client: XataHttpClient;\n\nbeforeAll(async () => {\n\tconst apiKey = process.env['XATA_API_KEY'];\n\tif (!apiKey) {\n\t\tthrow new Error('XATA_API_KEY is not defined');\n\t}\n\n\tclient = await retry(async () => {\n\t\tclient = getXataClient();\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestCache() });\n\tdbGlobalCached = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestGlobalCache() });\n});\n\nbeforeEach((ctx) => {\n\tctx.pg = {\n\t\tdb,\n\t};\n\tctx.cachedPg = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ntest('migrator : default migration strategy', async () => {\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".\"__drizzle_migrations\"`);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.execute(sql`drop table if exists all_columns`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists \"drizzle\".\"__drizzle_migrations\"`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/pg', migrationsTable: customTable });\n\n\t// test if the custom migrations table was created\n\tconst { records } = await db.execute(sql`select * from \"drizzle\".${sql.identifier(customTable)};`);\n\texpect(records && records.length > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table all_columns`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table \"drizzle\".${sql.identifier(customTable)}`);\n});\n\ntest('all date and time columns without timezone first case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format without timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01 02:00:00.123456' },\n\t]);\n\n\t// 2, Select in string format and check that values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456' }]);\n\n\t// 3. Select as raw query and check that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result2.records).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone second case mode string', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) not null\n\t\t\t)\n\t`);\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: '2022-01-01T02:00:00.123456-02' },\n\t]);\n\n\t// 2, Select as raw query and check that values are the same\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result.records).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('all date and time columns without timezone third case mode date', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) not null\n\t\t\t)\n\t`);\n\n\tconst insertedDate = new Date('2022-01-01 20:00:00.123+04');\n\n\t// 1. Insert date as new date\n\tawait db.insert(table).values([\n\t\t{ timestamp: insertedDate },\n\t]);\n\n\t// 2, Select as raw query as string\n\tconst result = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3. Compare both dates using orm mapping - Need to add 'Z' to tell JS that it is UTC\n\texpect(new Date(result.records[0]!.timestamp_string + 'Z').getTime()).toBe(insertedDate.getTime());\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.records).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode date for timestamp with timezone', async () => {\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'date', withTimezone: true, precision: 3 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(3) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = new Date('2022-01-01 00:00:00.456-0200');\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: timestampString }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.records).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.456+00' }]);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone in UTC timezone', async () => {\n\t// get current timezone from db\n\tconst timezone = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to UTC\n\tawait db.execute(sql`set time zone 'UTC'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-0200';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\t// 2.1 Notice that postgres will return the date in UTC, but it is exactly the same\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 02:00:00.123456+00' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\t// 3.1 Notice that postgres will return the date in UTC, but it is exactlt the same\n\texpect(result2.records).toEqual([{ id: 1, timestamp_string: '2022-01-01 02:00:00.123456+00' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone.records[0]!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\ntest('test mode string for timestamp with timezone in different timezone', async () => {\n\t// get current timezone from db\n\tconst timezone = await db.execute<{ TimeZone: string }>(sql`show timezone`);\n\n\t// set timezone to HST (UTC - 10)\n\tawait db.execute(sql`set time zone 'HST'`);\n\n\tconst table = pgTable('all_columns', {\n\t\tid: serial('id').primaryKey(),\n\t\ttimestamp: timestamp('timestamp_string', { mode: 'string', withTimezone: true, precision: 6 }).notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${table} (\n\t\t\t\t\tid serial primary key,\n\t\t\t\t\ttimestamp_string timestamp(6) with time zone not null\n\t\t\t)\n\t`);\n\n\tconst timestampString = '2022-01-01 00:00:00.123456-1000';\n\n\t// 1. Insert date in string format with timezone in it\n\tawait db.insert(table).values([\n\t\t{ timestamp: timestampString },\n\t]);\n\n\t// 2. Select date in string format and check that the values are the same\n\tconst result = await db.select().from(table);\n\n\texpect(result).toEqual([{ id: 1, timestamp: '2022-01-01 00:00:00.123456-10' }]);\n\n\t// 3. Select as raw query and checke that values are the same\n\tconst result2 = await db.execute<{\n\t\tid: number;\n\t\ttimestamp_string: string;\n\t}>(sql`select * from ${table}`);\n\n\texpect(result2.records).toEqual([{ id: 1, timestamp_string: '2022-01-01 00:00:00.123456-10' }]);\n\n\tawait db.execute(sql`set time zone '${sql.raw(timezone.records[0]!.TimeZone)}'`);\n\n\tawait db.execute(sql`drop table if exists ${table}`);\n});\n\nskipTests([\n\t'migrator : default migration strategy',\n\t'migrator : migrate with custom schema',\n\t'migrator : migrate with custom table',\n\t'migrator : migrate with custom table and custom schema',\n\t'insert via db.execute + select via db.execute',\n\t'insert via db.execute + returning',\n\t'insert via db.execute w/ query builder',\n\t'all date and time columns without timezone first case mode string',\n\t'all date and time columns without timezone third case mode date',\n\t'test mode string for timestamp with timezone',\n\t'test mode date for timestamp with timezone',\n\t'test mode string for timestamp with timezone in UTC timezone',\n\t'test mode string for timestamp with timezone in different timezone',\n\t'view',\n\t'materialized view',\n\t'select from enum',\n\t'subquery with view',\n]);\ntests();\ncacheTests();\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop schema if exists public cascade`);\n\tawait db.execute(sql`create schema public`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table users (\n\t\t\t\tid serial primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified boolean not null default false, \n\t\t\t\tjsonb jsonb,\n\t\t\t\tcreated_at timestamptz not null default now()\n\t\t\t)\n\t\t`,\n\t);\n});\n\ntest('insert via db.execute + select via db.execute', async () => {\n\tawait db.execute(\n\t\tsql`insert into ${usersTable} (${sql.identifier(usersTable.name.name)}) values (${'John'})`,\n\t);\n\n\tconst result = await db.execute<{ id: number; name: string }>(\n\t\tsql`select id, name from \"users\"`,\n\t);\n\texpect(result.records).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute + returning', async () => {\n\tconst inserted = await db.execute<{ id: number; name: string }>(\n\t\tsql`insert into ${usersTable} (${\n\t\t\tsql.identifier(\n\t\t\t\tusersTable.name.name,\n\t\t\t)\n\t\t}) values (${'John'}) returning ${usersTable.id}, ${usersTable.name}`,\n\t);\n\texpect(inserted.records).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async () => {\n\tconst inserted = await db.execute<Pick<typeof usersTable.$inferSelect, 'id' | 'name'>>(\n\t\tdb\n\t\t\t.insert(usersTable)\n\t\t\t.values({ name: 'John' })\n\t\t\t.returning({ id: usersTable.id, name: usersTable.name }),\n\t);\n\texpect(inserted.records).toEqual([{ id: 1, name: 'John' }]);\n});\n"
  },
  {
    "path": "integration-tests/tests/relational/bettersqlite.test.ts",
    "content": "import 'dotenv/config';\nimport Database from 'better-sqlite3';\nimport { desc, DrizzleError, eq, gt, gte, or, placeholder, sql, TransactionRollbackError } from 'drizzle-orm';\nimport { type BetterSQLite3Database, drizzle } from 'drizzle-orm/better-sqlite3';\nimport { beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\nimport * as schema from './sqlite.schema.ts';\n\nconst { usersTable, postsTable, commentsTable, usersToGroupsTable, groupsTable } = schema;\n\nconst ENABLE_LOGGING = false;\n\n/*\n\tTest cases:\n\t- querying nested relation without PK with additional fields\n*/\n\nlet db: BetterSQLite3Database<typeof schema>;\n\nbeforeAll(() => {\n\tconst dbPath = process.env['SQLITE_DB_PATH'] ?? ':memory:';\n\n\tdb = drizzle(new Database(dbPath), { schema, logger: ENABLE_LOGGING });\n});\n\nbeforeEach(() => {\n\tdb.run(sql`drop table if exists \\`groups\\``);\n\tdb.run(sql`drop table if exists \\`users\\``);\n\tdb.run(sql`drop table if exists \\`users_to_groups\\``);\n\tdb.run(sql`drop table if exists \\`posts\\``);\n\tdb.run(sql`drop table if exists \\`comments\\``);\n\tdb.run(sql`drop table if exists \\`comment_likes\\``);\n\n\tdb.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`users\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`name\\` text NOT NULL,\n\t\t\t    \\`verified\\` integer DEFAULT 0 NOT NULL,\n\t\t\t    \\`invited_by\\` integer\n\t\t\t);\n\t\t`,\n\t);\n\tdb.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`groups\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`name\\` text NOT NULL,\n\t\t\t    \\`description\\` text\n\t\t\t);\n\t\t`,\n\t);\n\tdb.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`users_to_groups\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`user_id\\` integer NOT NULL,\n\t\t\t    \\`group_id\\` integer NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tdb.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`posts\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`content\\` text NOT NULL,\n\t\t\t    \\`owner_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tdb.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`comments\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`content\\` text NOT NULL,\n\t\t\t    \\`creator\\` integer,\n\t\t\t    \\`post_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tdb.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`comment_likes\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`creator\\` integer,\n\t\t\t    \\`comment_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n});\n\n/*\n\t[Find Many] One relation users+posts\n*/\n\ntest('[Find Many] Get users with posts', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts and users', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tlowerName: 'dan',\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.2',\n\t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n\t\t}, { id: 3, ownerId: 1, content: 'Post1.3', createdAt: usersWithPosts[0]?.posts[2]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlowerName: 'andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 5,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlowerName: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields + limits', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + orderBy', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: expect.anything(),\n\t});\n\n\texpect(usersWithPosts[0]!.posts).toEqual([\n\t\t{ id: 7, ownerId: 3, content: '7', createdAt: expect.any(Date) },\n\t\t{ id: 6, ownerId: 3, content: '6', createdAt: expect.any(Date) },\n\t]);\n\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: expect.anything(),\n\t});\n\n\texpect(usersWithPosts[1]!.posts).toEqual([\n\t\t{ id: 5, ownerId: 2, content: '5', createdAt: expect.any(Date) },\n\t\t{ id: 4, ownerId: 2, content: '4', createdAt: expect.any(Date) },\n\t]);\n\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: expect.anything(),\n\t});\n\n\texpect(usersWithPosts[2]!.posts).toEqual([\n\t\t{ id: 3, ownerId: 1, content: '3', createdAt: expect.any(Date) },\n\t\t{ id: 2, ownerId: 1, content: '2', createdAt: expect.any(Date) },\n\t\t{ id: 1, ownerId: 1, content: '1', createdAt: expect.any(Date) },\n\t]);\n});\n\ntest('[Find Many] Get users with posts + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial. Did not select posts id, but used it in where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(true + false)', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tposts: {\n\t\t\tid: number;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(false)', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in transaction', () => {\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\tdb.transaction((tx) => {\n\t\ttx.insert(usersTable).values([\n\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t{ id: 3, name: 'Alex' },\n\t\t]).run();\n\n\t\ttx.insert(postsTable).values([\n\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t]).run();\n\n\t\tusersWithPosts = tx.query.usersTable.findMany({\n\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t},\n\t\t\t},\n\t\t}).sync();\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in rollbacked transaction', () => {\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\texpect(() =>\n\t\tdb.transaction((tx) => {\n\t\t\ttx.insert(usersTable).values([\n\t\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t\t{ id: 3, name: 'Alex' },\n\t\t\t]).run();\n\n\t\t\ttx.insert(postsTable).values([\n\t\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t\t]).run();\n\n\t\t\ttx.rollback();\n\n\t\t\tusersWithPosts = tx.query.usersTable.findMany({\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\twith: {\n\t\t\t\t\tposts: {\n\t\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}).sync();\n\t\t})\n\t).toThrow(TransactionRollbackError);\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(0);\n});\n\n// select only custom\ntest('[Find Many] Get only custom fields', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 1, content: 'Post1.2' },\n\t\t{ id: 3, ownerId: 1, content: 'Post1.3' },\n\t\t{ id: 4, ownerId: 2, content: 'Post2' },\n\t\t{ id: 5, ownerId: 2, content: 'Post2.1' },\n\t\t{ id: 6, ownerId: 3, content: 'Post3' },\n\t\t{ id: 7, ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts[0]?.lowerName).toEqual('dan');\n\texpect(usersWithPosts[1]?.lowerName).toEqual('andrew');\n\texpect(usersWithPosts[2]?.lowerName).toEqual('alex');\n\n\texpect(usersWithPosts[0]?.posts).toContainEqual({\n\t\tlowerName: 'post1',\n\t});\n\n\texpect(usersWithPosts[0]?.posts).toContainEqual({\n\t\tlowerName: 'post1.2',\n\t});\n\n\texpect(usersWithPosts[0]?.posts).toContainEqual({\n\t\tlowerName: 'post1.3',\n\t});\n\n\texpect(usersWithPosts[1]?.posts).toContainEqual({\n\t\tlowerName: 'post2',\n\t});\n\n\texpect(usersWithPosts[1]?.posts).toContainEqual({\n\t\tlowerName: 'post2.1',\n\t});\n\n\texpect(usersWithPosts[2]?.posts).toContainEqual({\n\t\tlowerName: 'post3',\n\t});\n\n\texpect(usersWithPosts[2]?.posts).toContainEqual({\n\t\tlowerName: 'post3.1',\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + limit', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + orderBy', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// select only custom find one\ntest('[Find One] Get only custom fields', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(3);\n\n\texpect(usersWithPosts?.lowerName).toEqual('dan');\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tlowerName: 'post1',\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tlowerName: 'post1.2',\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tlowerName: 'post1.3',\n\t});\n});\n\ntest('[Find One] Get only custom fields + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + limit', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + orderBy', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// columns {}\ntest('[Find Many] Get select {}', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\texpect(() =>\n\t\tdb.query.usersTable.findMany({\n\t\t\tcolumns: {},\n\t\t}).sync()\n\t).toThrow(DrizzleError);\n});\n\n// columns {}\ntest('[Find One] Get select {}', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\texpect(() =>\n\t\tdb.query.usersTable.findFirst({\n\t\t\tcolumns: {},\n\t\t}).sync()\n\t).toThrow(DrizzleError);\n});\n\n// deep select {}\ntest('[Find Many] Get deep select {}', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\texpect(() =>\n\t\tdb.query.usersTable.findMany({\n\t\t\tcolumns: {},\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\tcolumns: {},\n\t\t\t\t},\n\t\t\t},\n\t\t}).sync()\n\t).toThrow(DrizzleError);\n});\n\n// deep select {}\ntest('[Find One] Get deep select {}', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\texpect(() =>\n\t\tdb.query.usersTable.findFirst({\n\t\t\tcolumns: {},\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\tcolumns: {},\n\t\t\t\t},\n\t\t\t},\n\t\t}).sync()\n\t).toThrow(DrizzleError);\n});\n\n/*\n\tPrepared statements for users+posts\n*/\ntest('[Find Many] Get users with posts + prepared limit', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('limit'),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = prepared.execute({ limit: 1 }).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared limit + offset', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1 }).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, placeholder('id'))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = prepared.execute({ id: 1 }).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared + limit + offset + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twhere: (({ id }, { eq, or }) => or(eq(id, placeholder('id')), eq(id, 3))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, placeholder('pid'))),\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1, id: 2, pid: 6 }).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\t[Find One] One relation users+posts\n*/\n\ntest('[Find One] Get users with posts', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + limit posts', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts no results found', () => {\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts).toBeUndefined();\n});\n\ntest('[Find One] Get users with posts + limit posts and users', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(3);\n\n\texpect(usersWithPosts?.lowerName).toEqual('dan');\n\texpect(usersWithPosts?.id).toEqual(1);\n\texpect(usersWithPosts?.verified).toEqual(0);\n\texpect(usersWithPosts?.invitedBy).toEqual(null);\n\texpect(usersWithPosts?.name).toEqual('Dan');\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tid: 1,\n\t\townerId: 1,\n\t\tcontent: 'Post1',\n\t\tcreatedAt: usersWithPosts?.posts[0]?.createdAt,\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tid: 2,\n\t\townerId: 1,\n\t\tcontent: 'Post1.2',\n\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tid: 3,\n\t\townerId: 1,\n\t\tcontent: 'Post1.3',\n\t\tcreatedAt: usersWithPosts?.posts[2]?.createdAt,\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields + limits', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest.skip('[Find One] Get users with posts + orderBy', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.id)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: '7',\n\t\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial. Did not select posts id, but used it in where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(true + false)', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(false)', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t}).sync();\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\tOne relation users+users. Self referencing\n*/\n\ntest('Get user with invitee', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: 0, invitedBy: null },\n\t});\n});\n\ntest('Get user + limit with invitee', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew', invitedBy: 1 },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t\tlimit: 2,\n\t}).sync();\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: 0, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: 0, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields + limits', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(3);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: 0, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + order by', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[3]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: 0, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: 0, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where + partial', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial.  Did not select users id, but used it in where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(true+false)', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t\tverified: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(false)', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tname: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, verified: 0, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, verified: 0, invitedBy: null },\n\t});\n});\n\n/*\n\tTwo first-level relations users+users and users+posts\n*/\n\ntest('Get user with invitee and posts', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: true,\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: 0, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + limits + custom fields in each', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_invitee_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_content') }),\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: 0, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + custom fields in each', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\tresponse[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tresponse[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tresponse[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(2);\n\texpect(response[1]?.posts.length).eq(2);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.1',\n\t\t\tlower: 'post1.1',\n\t\t\tcreatedAt: response[0]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 4,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tlower: 'post2.1',\n\t\t\tcreatedAt: response[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: 0, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 6,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tlower: 'post3.1',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: 0, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\n// TODO Check order\ntest.skip('Get user with invitee and posts + orderBy', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\torderBy: (posts, { desc }) => [desc(posts.id)],\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(4);\n\n\texpect(response[3]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(2);\n\n\texpect(response[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 1, content: 'Post1.1', createdAt: response[3]?.posts[0]?.createdAt }, {\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2.1', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 3,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: 0, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 2), eq(users.id, 3))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 2)),\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(2);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 3)),\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(1);\n\n\texpect(response[0]?.invitee).not.toBeNull();\n\texpect(response[0]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + custom', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: 0, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + partial + custom', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; content: string }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan' },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew' },\n\t\tposts: [],\n\t});\n});\n\n/*\n\tOne two-level relation users+posts+comments\n*/\n\ntest('Get user with posts and posts with comments', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tdb.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcomments: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tcontent: string;\n\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t\tcreator: number | null;\n\t\t\t\t\tpostId: number | null;\n\t\t\t\t}[];\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\t// expect(response[2]).toEqual({\n\t// \tid: 3,\n\t// \tname: 'Alex',\n\t// \tverified: 0,\n\t// \tinvitedBy: null,\n\t// \tposts: [{\n\t// \t\tid: 3,\n\t// \t\townerId: 3,\n\t// \t\tcontent: 'Post3',\n\t// \t\tcreatedAt: response[2]?.posts[0]?.createdAt,\n\t// \t\tcomments: [\n\t// \t\t\t{\n\t// \t\t\t\tid: ,\n\t// \t\t\t\tcontent: 'Comment3',\n\t// \t\t\t\tcreator: 3,\n\t// \t\t\t\tpostId: 3,\n\t// \t\t\t\tcreatedAt: response[2]?.posts[0]?.comments[0]?.createdAt,\n\t// \t\t\t},\n\t// \t\t],\n\t// \t}],\n\t// });\n});\n\n// Get user with limit posts and limit comments\n\n// Get user with custom field + post + comment with custom field\n\n// Get user with limit + posts orderBy + comment orderBy\n\n// Get user with where + posts where + comment where\n\n// Get user with where + posts partial where + comment where\n\n// Get user with where + posts partial where + comment partial(false) where\n\n// Get user with where partial(false) + posts partial where partial(false) + comment partial(false+true) where\n\n// Get user with where + posts partial where + comment where. Didn't select field from where in posts\n\n// Get user with where + posts partial where + comment where. Didn't select field from where for all\n\n// Get with limit+offset in each\n\n/*\n\tOne two-level + One first-level relation users+posts+comments and users+users\n*/\n\n/*\n\tOne three-level relation users+posts+comments+comment_owner\n*/\n\ntest('Get user with posts and posts with comments and comments with owner', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tdb.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tcomments: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcreator: number | null;\n\t\t\t\tpostId: number | null;\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: 0,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: 0,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n});\n\ntest('Get user with posts and posts with comments and comments with owner where exists', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tdb.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\twhere: (table, { exists, eq }) => exists(db.select({ one: sql`1` }).from(usersTable).where(eq(sql`1`, table.id))),\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tcomments: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcreator: number | null;\n\t\t\t\tpostId: number | null;\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).eq(1);\n\texpect(response[0]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: 0,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n});\n\n/*\n\tOne three-level relation + 1 first-level relatioon\n\t1. users+posts+comments+comment_owner\n\t2. users+users\n*/\n\n/*\n\tOne four-level relation users+posts+comments+coment_likes\n*/\n\n/*\n\t[Find Many] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find Many] Get users with groups', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: expect.arrayContaining([{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}]),\n\t});\n});\n\ntest('[Find Many] Get groups with users', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.groupsTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.groupsTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.groupsTable.findMany({\n\t\tlimit: 1,\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(0);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.groupsTable.findMany({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(2);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + orderBy', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy + limit', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\n/*\n\t[Find One] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find One] Get users with groups', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find One] Get groups with users + where', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + orderBy', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.groupsTable.findFirst({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy + limit', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get groups with users + orderBy + limit', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get users with groups + custom', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.usersTable.findMany({\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: {\n\t\t\t\t\t\textras: {\n\t\t\t\t\t\t\tlower: sql<string>`lower(${groupsTable.name})`.as('lower_name'),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\tresponse[0]?.usersToGroups.sort((a, b) => (a.group.id > b.group.id) ? 1 : -1);\n\tresponse[1]?.usersToGroups.sort((a, b) => (a.group.id > b.group.id) ? 1 : -1);\n\tresponse[2]?.usersToGroups.sort((a, b) => (a.group.id > b.group.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tlower: 'group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tlower: 'group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tlower: 'group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tlower: 'group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get groups with users + custom', () => {\n\tdb.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tdb.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tdb.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = db.query.groupsTable.findMany({\n\t\textras: (table, { sql }) => ({\n\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t}),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: {\n\t\t\t\t\t\textras: (table, { sql }) => ({\n\t\t\t\t\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}).sync();\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tlower: 'group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tlower: 'dan',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tlower: 'group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tlower: 'andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tlower: 'group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('async api', async () => {\n\tawait db.insert(usersTable).values([{ id: 1, name: 'Dan' }]);\n\tconst users = await db.query.usersTable.findMany();\n\texpect(users).toEqual([{ id: 1, name: 'Dan', verified: 0, invitedBy: null }]);\n});\n\ntest('async api - sync()', () => {\n\tdb.insert(usersTable).values([{ id: 1, name: 'Dan' }]).run();\n\tconst users = db.query.usersTable.findMany().sync();\n\texpect(users).toEqual([{ id: 1, name: 'Dan', verified: 0, invitedBy: null }]);\n});\n\ntest('async api - prepare', async () => {\n\tconst insertStmt = db.insert(usersTable).values([{ id: 1, name: 'Dan' }]).prepare();\n\tawait insertStmt.execute();\n\tconst queryStmt = db.query.usersTable.findMany().prepare();\n\tconst users = await queryStmt.execute();\n\texpect(users).toEqual([{ id: 1, name: 'Dan', verified: 0, invitedBy: null }]);\n});\n\ntest('async api - sync() + prepare', () => {\n\tconst insertStmt = db.insert(usersTable).values([{ id: 1, name: 'Dan' }]).prepare();\n\tinsertStmt.execute().sync();\n\tconst queryStmt = db.query.usersTable.findMany().prepare();\n\tconst users = queryStmt.execute().sync();\n\texpect(users).toEqual([{ id: 1, name: 'Dan', verified: 0, invitedBy: null }]);\n});\n\ntest('.toSQL()', () => {\n\tconst query = db.query.usersTable.findFirst().toSQL();\n\n\texpect(query).toHaveProperty('sql', expect.any(String));\n\texpect(query).toHaveProperty('params', expect.any(Array));\n});\n\n// + custom + where + orderby\n\n// + custom + where + orderby + limit\n\n// + partial\n\n// + partial(false)\n\n// + partial + orderBy + where (all not selected)\n\n/*\n\tOne four-level relation users+posts+comments+coment_likes\n\t+ users+users_to_groups+groups\n*/\n\n/*\n\tReally hard case\n\t1. users+posts+comments+coment_likes\n\t2. users+users_to_groups+groups\n\t3. users+users\n*/\n"
  },
  {
    "path": "integration-tests/tests/relational/db.ts",
    "content": "import 'dotenv/config';\nimport Database from 'better-sqlite3';\nimport { sql } from 'drizzle-orm';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport util from 'node:util';\nimport * as schema from './tables.ts';\n\nasync function main() {\n\tconst bdb = new Database(process.env['SQLITE_DB_PATH']!);\n\tconst db = drizzle(bdb, { schema, logger: true });\n\n\tconst result = db.query.users.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tauthorId: true,\n\t\t\t\t},\n\t\t\t\twith: {\n\t\t\t\t\tcomments: true,\n\t\t\t\t},\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${schema.posts.title})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\tconsole.log(util.inspect(result, false, null, true));\n\tbdb.close();\n}\n\nmain();\n"
  },
  {
    "path": "integration-tests/tests/relational/issues-schemas/duplicates/mysql/mysql.duplicates.test.ts",
    "content": "import 'dotenv/config';\nimport Docker from 'dockerode';\nimport { sql } from 'drizzle-orm';\nimport { drizzle, type MySql2Database } from 'drizzle-orm/mysql2';\nimport getPort from 'get-port';\nimport * as mysql from 'mysql2/promise';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\nimport * as schema from './mysql.duplicates.ts';\n\nconst ENABLE_LOGGING = false;\n\n/*\n\tTest cases:\n\t- querying nested relation without PK with additional fields\n*/\n\nlet mysqlContainer: Docker.Container;\nlet db: MySql2Database<typeof schema>;\nlet client: mysql.Connection;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'mysql:8';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tmysqlContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait mysqlContainer.start();\n\n\treturn `mysql://root:mysql@127.0.0.1:${port}/drizzle`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['MYSQL_CONNECTION_STRING'] ?? await createDockerDB();\n\n\tconst sleep = 1000;\n\tlet timeLeft = 30000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = await mysql.createConnection(connectionString);\n\t\t\tawait client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to MySQL');\n\t\tawait client?.end().catch(console.error);\n\t\tawait mysqlContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\tdb = drizzle(client, { schema, logger: ENABLE_LOGGING, mode: 'default' });\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait mysqlContainer?.stop().catch(console.error);\n});\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop table if exists \\`members\\``);\n\tawait db.execute(sql`drop table if exists \\`artist_to_member\\``);\n\tawait db.execute(sql`drop table if exists \\`artists\\``);\n\tawait db.execute(sql`drop table if exists \\`albums\\``);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \\`members\\` (\n\t\t\t    \\`id\\` serial AUTO_INCREMENT PRIMARY KEY NOT NULL,\n\t\t\t    \\`created_at\\` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\t\t\t    \\`updated_at\\` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\t\t\t    \\`name_en\\` varchar(50) NOT NULL,\n\t\t\t    \\`name_kr\\` varchar(50) NOT NULL,\n\t\t\t    \\`stage_name_en\\` varchar(50) NOT NULL,\n\t\t\t    \\`stage_name_kr\\` varchar(50) NOT NULL,\n\t\t\t    \\`image\\` varchar(255) NOT NULL,\n\t\t\t    \\`instagram\\` varchar(255) NOT NULL);\n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \\`artist_to_member\\` (\n\t\t\t    \\`id\\` serial AUTO_INCREMENT PRIMARY KEY NOT NULL,\n\t\t\t    \\`member_id\\` int NOT NULL,\n\t\t\t    \\`artist_id\\` int NOT NULL);\n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \\`artists\\` (\n\t\t\t    \\`id\\` serial AUTO_INCREMENT PRIMARY KEY NOT NULL,\n\t\t\t    \\`created_at\\` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\t\t\t    \\`updated_at\\` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\t\t\t    \\`name_en\\` varchar(50) NOT NULL,\n\t\t\t    \\`name_kr\\` varchar(50) NOT NULL,\n\t\t\t    \\`debut\\` date NOT NULL,\n\t\t\t    \\`company_id\\` int NOT NULL,\n\t\t\t    \\`is_group\\` boolean NOT NULL DEFAULT true,\n\t\t\t    \\`image\\` varchar(255) NOT NULL,\n\t\t\t    \\`twitter\\` varchar(255) NOT NULL,\n\t\t\t    \\`instagram\\` varchar(255) NOT NULL,\n\t\t\t    \\`youtube\\` varchar(255) NOT NULL,\n\t\t\t    \\`website\\` varchar(255) NOT NULL,\n\t\t\t    \\`spotify_id\\` varchar(32));\n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \\`albums\\` (\n\t\t\t    \\`id\\` serial AUTO_INCREMENT PRIMARY KEY NOT NULL,\n\t\t\t    \\`created_at\\` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\t\t\t    \\`updated_at\\` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\t\t\t    \\`artist_id\\` int NOT NULL,\n\t\t\t    \\`name\\` varchar(50) NOT NULL,\n\t\t\t    \\`region\\` enum('en','kr','jp','other') NOT NULL,\n\t\t\t    \\`release_date\\` date NOT NULL,\n\t\t\t    \\`image\\` varchar(255) NOT NULL,\n\t\t\t    \\`spotify_id\\` varchar(32));\n\t\t`,\n\t);\n});\n\ntest('Simple case from GH', async () => {\n\tawait db.insert(schema.artists).values([\n\t\t{\n\t\t\tid: 1,\n\t\t\tnameEn: 'Dan',\n\t\t\tnameKr: '',\n\t\t\tdebut: new Date(),\n\t\t\tcompanyId: 1,\n\t\t\timage: '',\n\t\t\ttwitter: '',\n\t\t\tinstagram: '',\n\t\t\tyoutube: '',\n\t\t\twebsite: '',\n\t\t},\n\t\t{\n\t\t\tid: 2,\n\t\t\tnameEn: 'Andrew',\n\t\t\tnameKr: '',\n\t\t\tdebut: new Date(),\n\t\t\tcompanyId: 1,\n\t\t\timage: '',\n\t\t\ttwitter: '',\n\t\t\tinstagram: '',\n\t\t\tyoutube: '',\n\t\t\twebsite: '',\n\t\t},\n\t\t{\n\t\t\tid: 3,\n\t\t\tnameEn: 'Alex',\n\t\t\tnameKr: '',\n\t\t\tdebut: new Date(),\n\t\t\tcompanyId: 1,\n\t\t\timage: '',\n\t\t\ttwitter: '',\n\t\t\tinstagram: '',\n\t\t\tyoutube: '',\n\t\t\twebsite: '',\n\t\t},\n\t]);\n\n\tawait db.insert(schema.albums).values([\n\t\t{ id: 1, artistId: 1, name: 'Album1', region: 'en', releaseDate: new Date(), image: '' },\n\t\t{ id: 2, artistId: 2, name: 'Album2', region: 'en', releaseDate: new Date(), image: '' },\n\t\t{ id: 3, artistId: 3, name: 'Album3', region: 'en', releaseDate: new Date(), image: '' },\n\t]);\n\n\tawait db.insert(schema.members).values([\n\t\t{ id: 1, nameEn: 'MemberA', nameKr: '', stageNameEn: '', stageNameKr: '', image: '', instagram: '' },\n\t\t{ id: 2, nameEn: 'MemberB', nameKr: '', stageNameEn: '', stageNameKr: '', image: '', instagram: '' },\n\t\t{ id: 3, nameEn: 'MemberC', nameKr: '', stageNameEn: '', stageNameKr: '', image: '', instagram: '' },\n\t]);\n\n\tawait db.insert(schema.artistsToMembers).values([\n\t\t{ memberId: 1, artistId: 1 },\n\t\t{ memberId: 2, artistId: 1 },\n\t\t{ memberId: 2, artistId: 2 },\n\t\t{ memberId: 3, artistId: 3 },\n\t]);\n\n\tconst response = await db.query.artists.findFirst({\n\t\twhere: (artists, { eq }) => eq(artists.id, 1),\n\t\twith: {\n\t\t\talbums: true,\n\t\t\tmembers: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tmember: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tcreatedAt: Date;\n\t\t\tupdatedAt: Date;\n\t\t\tnameEn: string;\n\t\t\tnameKr: string;\n\t\t\tdebut: Date;\n\t\t\tcompanyId: number;\n\t\t\tisGroup: boolean;\n\t\t\timage: string;\n\t\t\ttwitter: string;\n\t\t\tinstagram: string;\n\t\t\tyoutube: string;\n\t\t\twebsite: string;\n\t\t\tspotifyId: string | null;\n\t\t\tmembers: {\n\t\t\t\tmember: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t\tupdatedAt: Date;\n\t\t\t\t\tnameEn: string;\n\t\t\t\t\tnameKr: string;\n\t\t\t\t\timage: string;\n\t\t\t\t\tinstagram: string;\n\t\t\t\t\tstageNameEn: string;\n\t\t\t\t\tstageNameKr: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t\talbums: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tupdatedAt: Date;\n\t\t\t\timage: string;\n\t\t\t\tspotifyId: string | null;\n\t\t\t\tartistId: number;\n\t\t\t\tregion: 'en' | 'kr' | 'jp' | 'other';\n\t\t\t\treleaseDate: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.members.length).eq(2);\n\texpect(response?.albums.length).eq(1);\n\n\texpect(response?.albums[0]).toEqual({\n\t\tid: 1,\n\t\tcreatedAt: response?.albums[0]?.createdAt,\n\t\tupdatedAt: response?.albums[0]?.updatedAt,\n\t\tartistId: 1,\n\t\tname: 'Album1',\n\t\tregion: 'en',\n\t\treleaseDate: response?.albums[0]?.releaseDate,\n\t\timage: '',\n\t\tspotifyId: null,\n\t});\n});\n"
  },
  {
    "path": "integration-tests/tests/relational/issues-schemas/duplicates/mysql/mysql.duplicates.ts",
    "content": "import { relations, sql } from 'drizzle-orm';\nimport { boolean, date, index, int, mysqlEnum, mysqlTable, serial, timestamp, varchar } from 'drizzle-orm/mysql-core';\n\nexport const artists = mysqlTable(\n\t'artists',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\tcreatedAt: timestamp('created_at')\n\t\t\t.notNull()\n\t\t\t.default(sql`CURRENT_TIMESTAMP`),\n\t\tupdatedAt: timestamp('updated_at')\n\t\t\t.notNull()\n\t\t\t.default(sql`CURRENT_TIMESTAMP`),\n\t\tnameEn: varchar('name_en', { length: 50 }).notNull(),\n\t\tnameKr: varchar('name_kr', { length: 50 }).notNull(),\n\t\tdebut: date('debut').notNull(),\n\t\tcompanyId: int('company_id').notNull(),\n\t\tisGroup: boolean('is_group').notNull().default(true),\n\t\timage: varchar('image', { length: 255 }).notNull(),\n\t\ttwitter: varchar('twitter', { length: 255 }).notNull(),\n\t\tinstagram: varchar('instagram', { length: 255 }).notNull(),\n\t\tyoutube: varchar('youtube', { length: 255 }).notNull(),\n\t\twebsite: varchar('website', { length: 255 }).notNull(),\n\t\tspotifyId: varchar('spotify_id', { length: 32 }),\n\t},\n\t(table) => ({\n\t\tnameEnIndex: index('artists__name_en__idx').on(table.nameEn),\n\t}),\n);\n\nexport const members = mysqlTable('members', {\n\tid: serial('id').primaryKey(),\n\tcreatedAt: timestamp('created_at')\n\t\t.notNull()\n\t\t.default(sql`CURRENT_TIMESTAMP`),\n\tupdatedAt: timestamp('updated_at')\n\t\t.notNull()\n\t\t.default(sql`CURRENT_TIMESTAMP`),\n\tnameEn: varchar('name_en', { length: 50 }).notNull(),\n\tnameKr: varchar('name_kr', { length: 50 }).notNull(),\n\tstageNameEn: varchar('stage_name_en', { length: 50 }).notNull(),\n\tstageNameKr: varchar('stage_name_kr', { length: 50 }).notNull(),\n\timage: varchar('image', { length: 255 }).notNull(),\n\tinstagram: varchar('instagram', { length: 255 }).notNull(),\n});\n\nexport const artistsToMembers = mysqlTable(\n\t'artist_to_member',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\tmemberId: int('member_id').notNull(),\n\t\tartistId: int('artist_id').notNull(),\n\t},\n\t(table) => ({\n\t\tmemberArtistIndex: index('artist_to_member__artist_id__member_id__idx').on(\n\t\t\ttable.memberId,\n\t\t\ttable.artistId,\n\t\t),\n\t}),\n);\n\nexport const albums = mysqlTable(\n\t'albums',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\tcreatedAt: timestamp('created_at')\n\t\t\t.notNull()\n\t\t\t.default(sql`CURRENT_TIMESTAMP`),\n\t\tupdatedAt: timestamp('updated_at')\n\t\t\t.notNull()\n\t\t\t.default(sql`CURRENT_TIMESTAMP`),\n\t\tartistId: int('artist_id').notNull(),\n\t\tname: varchar('name', { length: 50 }).notNull(),\n\t\tregion: mysqlEnum('region', ['en', 'kr', 'jp', 'other']).notNull(),\n\t\treleaseDate: date('release_date').notNull(),\n\t\timage: varchar('image', { length: 255 }).notNull(),\n\t\tspotifyId: varchar('spotify_id', { length: 32 }),\n\t},\n\t(table) => ({\n\t\tartistIndex: index('albums__artist_id__idx').on(table.artistId),\n\t\tnameIndex: index('albums__name__idx').on(table.name),\n\t}),\n);\n\n// relations\nexport const artistRelations = relations(artists, ({ many }) => ({\n\talbums: many(albums),\n\tmembers: many(artistsToMembers),\n}));\n\nexport const albumRelations = relations(albums, ({ one }) => ({\n\tartist: one(artists, {\n\t\tfields: [albums.artistId],\n\t\treferences: [artists.id],\n\t}),\n}));\n\nexport const memberRelations = relations(members, ({ many }) => ({\n\tartists: many(artistsToMembers),\n}));\n\nexport const artistsToMembersRelations = relations(artistsToMembers, ({ one }) => ({\n\tartist: one(artists, {\n\t\tfields: [artistsToMembers.artistId],\n\t\treferences: [artists.id],\n\t}),\n\tmember: one(members, {\n\t\tfields: [artistsToMembers.memberId],\n\t\treferences: [members.id],\n\t}),\n}));\n"
  },
  {
    "path": "integration-tests/tests/relational/issues-schemas/duplicates/pg/pg.duplicates.test.ts",
    "content": "import 'dotenv/config';\nimport Docker from 'dockerode';\nimport { sql } from 'drizzle-orm';\nimport { drizzle, type NodePgDatabase } from 'drizzle-orm/node-postgres';\nimport getPort from 'get-port';\nimport pg from 'pg';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\nimport * as schema from './pg.duplicates.ts';\n\nconst { Client } = pg;\n\nconst ENABLE_LOGGING = false;\n\n/*\n\tTest cases:\n\t- querying nested relation without PK with additional fields\n*/\n\nlet pgContainer: Docker.Container;\nlet db: NodePgDatabase<typeof schema>;\nlet client: pg.Client;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 5432 });\n\tconst image = 'postgres:14';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tpgContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: [\n\t\t\t'POSTGRES_PASSWORD=postgres',\n\t\t\t'POSTGRES_USER=postgres',\n\t\t\t'POSTGRES_DB=postgres',\n\t\t],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5432/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait pgContainer.start();\n\n\treturn `postgres://postgres:postgres@localhost:${port}/postgres`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['PG_CONNECTION_STRING'] ?? (await createDockerDB());\n\n\tconst sleep = 250;\n\tlet timeLeft = 5000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = new Client(connectionString);\n\t\t\tawait client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to Postgres');\n\t\tawait client?.end().catch(console.error);\n\t\tawait pgContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\tdb = drizzle(client, { schema, logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait pgContainer?.stop().catch(console.error);\n});\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop table if exists \"members\"`);\n\tawait db.execute(sql`drop table if exists \"artist_to_member\"`);\n\tawait db.execute(sql`drop table if exists \"artists\"`);\n\tawait db.execute(sql`drop table if exists \"albums\"`);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \"members\" (\n\t\t\t    \"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t    \"created_at\" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\t\t\t    \"updated_at\" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP\n\t\t\t\t);\n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \"artist_to_member\" (\n\t\t\t    \"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t    \"member_id\" int NOT NULL,\n\t\t\t    \"artist_id\" int NOT NULL);\n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \"artists\" (\n\t\t\t    \"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t    \"created_at\" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\t\t\t    \"updated_at\" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\t\t\t    \"company_id\" int NOT NULL);\n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \"albums\" (\n\t\t\t    \"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t    \"created_at\" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\t\t\t    \"updated_at\" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\t\t\t    \"artist_id\" int NOT NULL);\n\t\t`,\n\t);\n});\n\ntest('Simple case from GH', async () => {\n\tawait db.insert(schema.artists).values([\n\t\t{\n\t\t\tid: 1,\n\t\t\tcompanyId: 1,\n\t\t},\n\t\t{\n\t\t\tid: 2,\n\t\t\tcompanyId: 1,\n\t\t},\n\t\t{\n\t\t\tid: 3,\n\t\t\tcompanyId: 1,\n\t\t},\n\t]);\n\n\tawait db.insert(schema.albums).values([\n\t\t{ id: 1, artistId: 1 },\n\t\t{ id: 2, artistId: 2 },\n\t\t{ id: 3, artistId: 3 },\n\t]);\n\n\tawait db.insert(schema.members).values([\n\t\t{ id: 1 },\n\t\t{ id: 2 },\n\t\t{ id: 3 },\n\t]);\n\n\tawait db.insert(schema.artistsToMembers).values([\n\t\t{ memberId: 1, artistId: 1 },\n\t\t{ memberId: 2, artistId: 1 },\n\t\t{ memberId: 2, artistId: 2 },\n\t\t{ memberId: 3, artistId: 3 },\n\t]);\n\n\tconst response = await db.query.artists.findFirst({\n\t\twhere: (artists, { eq }) => eq(artists.id, 1),\n\t\twith: {\n\t\t\talbums: true,\n\t\t\tmembers: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tmember: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tcreatedAt: Date;\n\t\t\tupdatedAt: Date;\n\t\t\tcompanyId: number;\n\t\t\talbums: {\n\t\t\t\tid: number;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tupdatedAt: Date;\n\t\t\t\tartistId: number;\n\t\t\t}[];\n\t\t\tmembers: {\n\t\t\t\tmember: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t\tupdatedAt: Date;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.members.length).eq(2);\n\texpect(response?.albums.length).eq(1);\n\n\texpect(response?.albums[0]).toEqual({\n\t\tid: 1,\n\t\tcreatedAt: response?.albums[0]?.createdAt,\n\t\tupdatedAt: response?.albums[0]?.updatedAt,\n\t\tartistId: 1,\n\t});\n});\n"
  },
  {
    "path": "integration-tests/tests/relational/issues-schemas/duplicates/pg/pg.duplicates.ts",
    "content": "import { relations, sql } from 'drizzle-orm';\nimport { index, integer, pgTable, serial, timestamp } from 'drizzle-orm/pg-core';\n\nexport const artists = pgTable(\n\t'artists',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\tcreatedAt: timestamp('created_at')\n\t\t\t.notNull()\n\t\t\t.default(sql`CURRENT_TIMESTAMP`),\n\t\tupdatedAt: timestamp('updated_at')\n\t\t\t.notNull()\n\t\t\t.default(sql`CURRENT_TIMESTAMP`),\n\t\tcompanyId: integer('company_id').notNull(),\n\t},\n);\n\nexport const members = pgTable('members', {\n\tid: serial('id').primaryKey(),\n\tcreatedAt: timestamp('created_at')\n\t\t.notNull()\n\t\t.default(sql`CURRENT_TIMESTAMP`),\n\tupdatedAt: timestamp('updated_at')\n\t\t.notNull()\n\t\t.default(sql`CURRENT_TIMESTAMP`),\n});\n\nexport const artistsToMembers = pgTable(\n\t'artist_to_member',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\tmemberId: integer('member_id').notNull(),\n\t\tartistId: integer('artist_id').notNull(),\n\t},\n\t(table) => ({\n\t\tmemberArtistIndex: index('artist_to_member__artist_id__member_id__idx').on(\n\t\t\ttable.memberId,\n\t\t\ttable.artistId,\n\t\t),\n\t}),\n);\n\nexport const albums = pgTable(\n\t'albums',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\tcreatedAt: timestamp('created_at')\n\t\t\t.notNull()\n\t\t\t.default(sql`CURRENT_TIMESTAMP`),\n\t\tupdatedAt: timestamp('updated_at')\n\t\t\t.notNull()\n\t\t\t.default(sql`CURRENT_TIMESTAMP`),\n\t\tartistId: integer('artist_id').notNull(),\n\t},\n\t(table) => ({\n\t\tartistIndex: index('albums__artist_id__idx').on(table.artistId),\n\t}),\n);\n\n// relations\nexport const artistRelations = relations(artists, ({ many }) => ({\n\talbums: many(albums),\n\tmembers: many(artistsToMembers),\n}));\n\nexport const albumRelations = relations(albums, ({ one }) => ({\n\tartist: one(artists, {\n\t\tfields: [albums.artistId],\n\t\treferences: [artists.id],\n\t}),\n}));\n\nexport const memberRelations = relations(members, ({ many }) => ({\n\tartists: many(artistsToMembers),\n}));\n\nexport const artistsToMembersRelations = relations(artistsToMembers, ({ one }) => ({\n\tartist: one(artists, {\n\t\tfields: [artistsToMembers.artistId],\n\t\treferences: [artists.id],\n\t}),\n\tmember: one(members, {\n\t\tfields: [artistsToMembers.memberId],\n\t\treferences: [members.id],\n\t}),\n}));\n"
  },
  {
    "path": "integration-tests/tests/relational/issues-schemas/wrong-mapping/pg.schema.ts",
    "content": "import { relations } from 'drizzle-orm';\nimport { boolean, integer, pgTable, primaryKey, text, uuid } from 'drizzle-orm/pg-core';\n\nexport const menuItems = pgTable('menu_items', {\n\tid: uuid('id').defaultRandom().primaryKey(),\n});\n\nexport const modifierGroups = pgTable('modifier_groups', {\n\tid: uuid('id').defaultRandom().primaryKey(),\n});\n\nexport const menuItemModifierGroups = pgTable(\n\t'menu_item_modifier_groups',\n\t{\n\t\tmenuItemId: uuid('menu_item_id')\n\t\t\t.notNull()\n\t\t\t.references(() => menuItems.id),\n\t\tmodifierGroupId: uuid('modifier_group_id')\n\t\t\t.notNull()\n\t\t\t.references(() => modifierGroups.id),\n\t\torder: integer('order').default(0),\n\t},\n\t(table) => ({\n\t\tmenuItemIdModifierGroupIdOrderPk: primaryKey(\n\t\t\ttable.menuItemId,\n\t\t\ttable.modifierGroupId,\n\t\t\ttable.order,\n\t\t),\n\t}),\n);\n\nexport const ingredients = pgTable('ingredients', {\n\tid: uuid('id').defaultRandom().primaryKey(),\n\tname: text('name').notNull(),\n\tdescription: text('description'),\n\timageUrl: text('image_url'),\n\tinStock: boolean('in_stock').default(true),\n});\n\nexport const modifiers = pgTable('modifiers', {\n\tid: uuid('id').defaultRandom().primaryKey(),\n\tingredientId: uuid('ingredient_id').references(() => ingredients.id),\n\titemId: uuid('item_id').references(() => menuItems.id),\n});\n\nexport const menuItemIngredients = pgTable(\n\t'menu_item_ingredients',\n\t{\n\t\tmenuItemId: uuid('menu_item_id')\n\t\t\t.notNull()\n\t\t\t.references(() => menuItems.id),\n\t\tingredientId: uuid('ingredient_id')\n\t\t\t.notNull()\n\t\t\t.references(() => ingredients.id),\n\t\torder: integer('order').default(0),\n\t},\n\t(table) => ({\n\t\tmenuItemIdIngredientIdOrderPk: primaryKey(\n\t\t\ttable.menuItemId,\n\t\t\ttable.ingredientId,\n\t\t\ttable.order,\n\t\t),\n\t}),\n);\n\nexport const modifierGroupModifiers = pgTable(\n\t'modifier_group_modifiers',\n\t{\n\t\tmodifierGroupId: uuid('modifier_group_id')\n\t\t\t.notNull()\n\t\t\t.references(() => modifierGroups.id),\n\t\tmodifierId: uuid('modifier_id')\n\t\t\t.notNull()\n\t\t\t.references(() => modifiers.id),\n\t\torder: integer('order').default(0),\n\t},\n\t(table) => ({\n\t\tmodifierGroupIdModifierIdOrderPk: primaryKey(\n\t\t\ttable.modifierGroupId,\n\t\t\ttable.modifierId,\n\t\t\ttable.order,\n\t\t),\n\t}),\n);\n\nexport const menuItemRelations = relations(menuItems, ({ many }) => ({\n\tingredients: many(menuItemIngredients),\n\tmodifierGroups: many(menuItemModifierGroups),\n\t// category: one(menuCategories, {\n\t// \tfields: [menuItems.categoryId],\n\t// \treferences: [menuCategories.id],\n\t// }),\n}));\n\nexport const menuItemIngredientRelations = relations(\n\tmenuItemIngredients,\n\t({ one }) => ({\n\t\tmenuItem: one(menuItems, {\n\t\t\tfields: [menuItemIngredients.menuItemId],\n\t\t\treferences: [menuItems.id],\n\t\t}),\n\t\tingredient: one(ingredients, {\n\t\t\tfields: [menuItemIngredients.ingredientId],\n\t\t\treferences: [ingredients.id],\n\t\t}),\n\t}),\n);\n\nexport const ingredientRelations = relations(ingredients, ({ many }) => ({\n\tmenuItems: many(menuItemIngredients),\n}));\n\nexport const modifierGroupRelations = relations(modifierGroups, ({ many }) => ({\n\tmenuItems: many(menuItemModifierGroups),\n\tmodifiers: many(modifierGroupModifiers),\n}));\n\nexport const modifierRelations = relations(modifiers, ({ one, many }) => ({\n\tmodifierGroups: many(modifierGroupModifiers),\n\tingredient: one(ingredients, {\n\t\tfields: [modifiers.ingredientId],\n\t\treferences: [ingredients.id],\n\t}),\n\titem: one(menuItems, {\n\t\tfields: [modifiers.itemId],\n\t\treferences: [menuItems.id],\n\t}),\n}));\n\nexport const menuItemModifierGroupRelations = relations(\n\tmenuItemModifierGroups,\n\t({ one }) => ({\n\t\tmenuItem: one(menuItems, {\n\t\t\tfields: [menuItemModifierGroups.menuItemId],\n\t\t\treferences: [menuItems.id],\n\t\t}),\n\t\tmodifierGroup: one(modifierGroups, {\n\t\t\tfields: [menuItemModifierGroups.modifierGroupId],\n\t\t\treferences: [modifierGroups.id],\n\t\t}),\n\t}),\n);\n\nexport const modifierGroupModifierRelations = relations(\n\tmodifierGroupModifiers,\n\t({ one }) => ({\n\t\tmodifierGroup: one(modifierGroups, {\n\t\t\tfields: [modifierGroupModifiers.modifierGroupId],\n\t\t\treferences: [modifierGroups.id],\n\t\t}),\n\t\tmodifier: one(modifiers, {\n\t\t\tfields: [modifierGroupModifiers.modifierId],\n\t\t\treferences: [modifiers.id],\n\t\t}),\n\t}),\n);\n"
  },
  {
    "path": "integration-tests/tests/relational/issues-schemas/wrong-mapping/pg.test.ts",
    "content": "import 'dotenv/config';\nimport Docker from 'dockerode';\nimport { desc, sql } from 'drizzle-orm';\nimport { drizzle, type NodePgDatabase } from 'drizzle-orm/node-postgres';\nimport getPort from 'get-port';\nimport pg from 'pg';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expectTypeOf, test } from 'vitest';\nimport * as schema from './pg.schema.ts';\n\nconst { Client } = pg;\n\nconst ENABLE_LOGGING = false;\n\n/*\n\tTest cases:\n\t- querying nested relation without PK with additional fields\n*/\n\nlet pgContainer: Docker.Container;\nlet db: NodePgDatabase<typeof schema>;\nlet client: pg.Client;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 5432 });\n\tconst image = 'postgres:14';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tpgContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: [\n\t\t\t'POSTGRES_PASSWORD=postgres',\n\t\t\t'POSTGRES_USER=postgres',\n\t\t\t'POSTGRES_DB=postgres',\n\t\t],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5432/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait pgContainer.start();\n\n\treturn `postgres://postgres:postgres@localhost:${port}/postgres`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['PG_CONNECTION_STRING'] ?? (await createDockerDB());\n\n\tconst sleep = 250;\n\tlet timeLeft = 5000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = new Client(connectionString);\n\t\t\tawait client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to Postgres');\n\t\tawait client?.end().catch(console.error);\n\t\tawait pgContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\tdb = drizzle(client, { schema, logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait pgContainer?.stop().catch(console.error);\n});\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop schema public cascade`);\n\tawait db.execute(sql`create schema public`);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"ingredients\" (\n\t\t\t    \"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\t\t    \"name\" text NOT NULL,\n\t\t\t    \"description\" text,\n\t\t\t    \"image_url\" text,\n\t\t\t    \"in_stock\" boolean DEFAULT true\n\t\t\t);\n\n\t\t\tCREATE TABLE IF NOT EXISTS \"menu_item_ingredients\" (\n\t\t\t    \"menu_item_id\" uuid NOT NULL,\n\t\t\t    \"ingredient_id\" uuid NOT NULL,\n\t\t\t    \"order\" integer DEFAULT 0\n\t\t\t);\n\n\t\t\tALTER TABLE \"menu_item_ingredients\" ADD CONSTRAINT \"menu_item_ingredients_menu_item_id_ingredient_id_order\" PRIMARY KEY(\"menu_item_id\",\"ingredient_id\",\"order\");\n\n\t\t\tCREATE TABLE IF NOT EXISTS \"menu_item_modifier_groups\" (\n\t\t\t    \"menu_item_id\" uuid NOT NULL,\n\t\t\t    \"modifier_group_id\" uuid NOT NULL,\n\t\t\t    \"order\" integer DEFAULT 0\n\t\t\t);\n\n\t\t\tALTER TABLE \"menu_item_modifier_groups\" ADD CONSTRAINT \"menu_item_modifier_groups_menu_item_id_modifier_group_id_order\" PRIMARY KEY(\"menu_item_id\",\"modifier_group_id\",\"order\");\n\n\t\t\tCREATE TABLE IF NOT EXISTS \"menu_items\" (\n\t\t\t    \"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL\n\t\t\t);\n\n\t\t\tCREATE TABLE IF NOT EXISTS \"modifier_group_modifiers\" (\n\t\t\t    \"modifier_group_id\" uuid NOT NULL,\n\t\t\t    \"modifier_id\" uuid NOT NULL,\n\t\t\t    \"order\" integer DEFAULT 0\n\t\t\t);\n\n\t\t\tALTER TABLE \"modifier_group_modifiers\" ADD CONSTRAINT \"modifier_group_modifiers_modifier_group_id_modifier_id_order\" PRIMARY KEY(\"modifier_group_id\",\"modifier_id\",\"order\");\n\n\t\t\tCREATE TABLE IF NOT EXISTS \"modifier_groups\" (\n\t\t\t    \"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL\n\t\t\t);\n\n\t\t\tCREATE TABLE IF NOT EXISTS \"modifiers\" (\n\t\t\t    \"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\t\t    \"ingredient_id\" uuid,\n\t\t\t    \"item_id\" uuid\n\t\t\t);\n\n\t\t\tDO $$ BEGIN\n\t\t\t ALTER TABLE \"menu_item_ingredients\" ADD CONSTRAINT \"menu_item_ingredients_menu_item_id_menu_items_id_fk\" FOREIGN KEY (\"menu_item_id\") REFERENCES \"menu_items\"(\"id\") ON DELETE no action ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;\n\n\t\t\tDO $$ BEGIN\n\t\t\t ALTER TABLE \"menu_item_ingredients\" ADD CONSTRAINT \"menu_item_ingredients_ingredient_id_ingredients_id_fk\" FOREIGN KEY (\"ingredient_id\") REFERENCES \"ingredients\"(\"id\") ON DELETE no action ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;\n\n\t\t\tDO $$ BEGIN\n\t\t\t ALTER TABLE \"menu_item_modifier_groups\" ADD CONSTRAINT \"menu_item_modifier_groups_menu_item_id_menu_items_id_fk\" FOREIGN KEY (\"menu_item_id\") REFERENCES \"menu_items\"(\"id\") ON DELETE no action ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;\n\n\t\t\tDO $$ BEGIN\n\t\t\t ALTER TABLE \"menu_item_modifier_groups\" ADD CONSTRAINT \"menu_item_modifier_groups_modifier_group_id_modifier_groups_id_fk\" FOREIGN KEY (\"modifier_group_id\") REFERENCES \"modifier_groups\"(\"id\") ON DELETE no action ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;\n\n\t\t\tDO $$ BEGIN\n\t\t\t ALTER TABLE \"modifier_group_modifiers\" ADD CONSTRAINT \"modifier_group_modifiers_modifier_group_id_modifier_groups_id_fk\" FOREIGN KEY (\"modifier_group_id\") REFERENCES \"modifier_groups\"(\"id\") ON DELETE no action ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;\n\n\t\t\tDO $$ BEGIN\n\t\t\t ALTER TABLE \"modifier_group_modifiers\" ADD CONSTRAINT \"modifier_group_modifiers_modifier_id_modifiers_id_fk\" FOREIGN KEY (\"modifier_id\") REFERENCES \"modifiers\"(\"id\") ON DELETE no action ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;\n\n\t\t\tDO $$ BEGIN\n\t\t\t ALTER TABLE \"modifiers\" ADD CONSTRAINT \"modifiers_ingredient_id_ingredients_id_fk\" FOREIGN KEY (\"ingredient_id\") REFERENCES \"ingredients\"(\"id\") ON DELETE no action ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;\n\n\t\t\tDO $$ BEGIN\n\t\t\t ALTER TABLE \"modifiers\" ADD CONSTRAINT \"modifiers_item_id_menu_items_id_fk\" FOREIGN KEY (\"item_id\") REFERENCES \"menu_items\"(\"id\") ON DELETE no action ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;\n\t\t`,\n\t);\n});\n\ntest('Simple case from GH', async () => {\n\tconst firstMenuItemId = uuid();\n\tconst secondMenuItemId = uuid();\n\n\tconst firstModGroupsId = uuid();\n\tconst secondModGroupsId = uuid();\n\n\tawait db.insert(schema.menuItems).values([{ id: firstMenuItemId }, { id: secondMenuItemId }]);\n\tawait db.insert(schema.modifierGroups).values([{ id: firstModGroupsId }, { id: secondModGroupsId }]);\n\tawait db.insert(schema.menuItemModifierGroups).values([{\n\t\tmodifierGroupId: firstModGroupsId,\n\t\tmenuItemId: firstMenuItemId,\n\t}, {\n\t\tmodifierGroupId: firstModGroupsId,\n\t\tmenuItemId: secondMenuItemId,\n\t}, {\n\t\tmodifierGroupId: secondModGroupsId,\n\t\tmenuItemId: firstMenuItemId,\n\t}]);\n\n\tconst firstIngredientId = uuid();\n\tconst secondIngredientId = uuid();\n\n\tawait db.insert(schema.ingredients).values([{\n\t\tid: firstIngredientId,\n\t\tname: 'first',\n\t}, {\n\t\tid: secondIngredientId,\n\t\tname: 'second',\n\t}]);\n\n\tconst firstModifierId = uuid();\n\tconst secondModifierId = uuid();\n\n\tawait db.insert(schema.modifiers).values([{\n\t\tid: firstModifierId,\n\t\tingredientId: firstIngredientId,\n\t\titemId: firstMenuItemId,\n\t}, {\n\t\tid: secondModifierId,\n\t\tingredientId: secondIngredientId,\n\t\titemId: secondMenuItemId,\n\t}]);\n\n\tawait db.insert(schema.modifierGroupModifiers).values([\n\t\t{\n\t\t\tmodifierGroupId: firstModGroupsId,\n\t\t\tmodifierId: firstModifierId,\n\t\t},\n\t\t{\n\t\t\tmodifierGroupId: secondModGroupsId,\n\t\t\tmodifierId: secondModifierId,\n\t\t},\n\t]);\n\n\tconst response = await db.query.menuItems\n\t\t.findMany({\n\t\t\twith: {\n\t\t\t\tmodifierGroups: {\n\t\t\t\t\twith: {\n\t\t\t\t\t\tmodifierGroup: {\n\t\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\t\tmodifiers: {\n\t\t\t\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\t\t\t\tmodifier: {\n\t\t\t\t\t\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\t\t\t\t\t\tingredient: true,\n\t\t\t\t\t\t\t\t\t\t\t\titem: true,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\torderBy: desc(schema.modifierGroupModifiers.order),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\torderBy: schema.menuItemModifierGroups.order,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: string;\n\t\t\tmodifierGroups: {\n\t\t\t\tmenuItemId: string;\n\t\t\t\tmodifierGroupId: string;\n\t\t\t\torder: number | null;\n\t\t\t\tmodifierGroup: {\n\t\t\t\t\tid: string;\n\t\t\t\t\tmodifiers: {\n\t\t\t\t\t\tmodifierGroupId: string;\n\t\t\t\t\t\torder: number | null;\n\t\t\t\t\t\tmodifierId: string;\n\t\t\t\t\t\tmodifier: {\n\t\t\t\t\t\t\tid: string;\n\t\t\t\t\t\t\tingredientId: string | null;\n\t\t\t\t\t\t\titemId: string | null;\n\t\t\t\t\t\t\tingredient: {\n\t\t\t\t\t\t\t\tid: string;\n\t\t\t\t\t\t\t\tname: string;\n\t\t\t\t\t\t\t\tdescription: string | null;\n\t\t\t\t\t\t\t\timageUrl: string | null;\n\t\t\t\t\t\t\t\tinStock: boolean | null;\n\t\t\t\t\t\t\t} | null;\n\t\t\t\t\t\t\titem: {\n\t\t\t\t\t\t\t\tid: string;\n\t\t\t\t\t\t\t} | null;\n\t\t\t\t\t\t};\n\t\t\t\t\t}[];\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\t// TODO: don't rely on items order\n\t// expect(response.length).eq(2);\n\t// expect(response[0]?.modifierGroups.length).eq(1);\n\t// expect(response[0]?.modifierGroups[0]?.modifierGroup.modifiers.length).eq(1);\n\n\t// TODO: add correct IDs\n\t// expect(response[0]?.modifierGroups[0]?.modifierGroup.modifiers[0]?.modifier.ingredient?.id).eq(\n\t// \t'0b2b9abc-5975-4a1d-ba3d-6fc3b3149902',\n\t// );\n\t// expect(response[0]?.modifierGroups[0]?.modifierGroup.modifiers[0]?.modifier.item?.id).eq(\n\t// \t'a867133e-60b7-4003-aaa0-deeefad7e518',\n\t// );\n});\n"
  },
  {
    "path": "integration-tests/tests/relational/mysql.planetscale.test.ts",
    "content": "import 'dotenv/config';\n\nimport { Client } from '@planetscale/database';\nimport { desc, DrizzleError, eq, gt, gte, or, placeholder, sql, TransactionRollbackError } from 'drizzle-orm';\nimport { drizzle, type PlanetScaleDatabase } from 'drizzle-orm/planetscale-serverless';\nimport { beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\nimport * as schema from './mysql.schema.ts';\n\nconst { usersTable, postsTable, commentsTable, usersToGroupsTable, groupsTable } = schema;\n\nconst ENABLE_LOGGING = false;\n\n/*\n\tTest cases:\n\t- querying nested relation without PK with additional fields\n*/\n\nlet db: PlanetScaleDatabase<typeof schema>;\n\nbeforeAll(async () => {\n\tdb = drizzle(\n\t\tnew Client({\n\t\t\turl: process.env['PLANETSCALE_CONNECTION_STRING']!,\n\t\t\t// host: process.env['DATABASE_HOST']!,\n\t\t\t// username: process.env['DATABASE_USERNAME']!,\n\t\t\t// password: process.env['DATABASE_PASSWORD']!,\n\t\t}),\n\t\t{ schema, logger: ENABLE_LOGGING },\n\t);\n\n\tawait Promise.all([\n\t\tdb.execute(sql`drop table if exists \\`users\\``),\n\t\tdb.execute(sql`drop table if exists \\`groups\\``),\n\t\tdb.execute(sql`drop table if exists \\`users_to_groups\\``),\n\t\tdb.execute(sql`drop table if exists \\`posts\\``),\n\t\tdb.execute(sql`drop table if exists \\`comments\\``),\n\t\tdb.execute(sql`drop table if exists \\`comment_likes\\``),\n\t]);\n\tawait Promise.all([\n\t\tdb.execute(\n\t\t\tsql`\n\t\t\t\tCREATE TABLE IF NOT EXISTS \\`users\\` (\n\t\t\t\t\t  \\`id\\` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n\t\t\t\t\t  \\`name\\` text NOT NULL,\n\t\t\t\t\t  \\`verified\\` boolean DEFAULT false NOT NULL,\n\t\t\t\t\t  \\`invited_by\\` bigint\n\t\t\t\t);\n\t\t\t`,\n\t\t),\n\t\tdb.execute(\n\t\t\tsql`\n\t\t\t\tCREATE TABLE IF NOT EXISTS \\`groups\\` (\n\t\t\t\t\t\\`id\\` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n\t\t\t\t\t\\`name\\` text NOT NULL,\n\t\t\t\t\t\\`description\\` text\n\t\t\t\t);\n\t\t\t`,\n\t\t),\n\t\tdb.execute(\n\t\t\tsql`\n\t\t\t\tCREATE TABLE IF NOT EXISTS \\`users_to_groups\\` (\n\t\t\t\t\t\\`id\\` serial PRIMARY KEY AUTO_INCREMENT NOT NULL,\n\t\t\t\t\t\\`user_id\\` bigint,\n\t\t\t\t\t\\`group_id\\` bigint\n\t\t\t\t);\n\t\t\t`,\n\t\t),\n\t\tdb.execute(\n\t\t\tsql`\n\t\t\t\tCREATE TABLE IF NOT EXISTS \\`posts\\` (\n\t\t\t\t\t\\`id\\` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n\t\t\t\t\t\\`content\\` text NOT NULL,\n\t\t\t\t\t\\`owner_id\\` bigint,\n\t\t\t\t\t\\`created_at\\` timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL\n\t\t\t\t);\n\t\t\t`,\n\t\t),\n\t\tdb.execute(\n\t\t\tsql`\n\t\t\t\tCREATE TABLE IF NOT EXISTS \\`comments\\` (\n\t\t\t\t\t\\`id\\` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n\t\t\t\t\t\\`content\\` text NOT NULL,\n\t\t\t\t\t\\`creator\\` bigint,\n\t\t\t\t\t\\`post_id\\` bigint,\n\t\t\t\t\t\\`created_at\\` timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL\n\t\t\t\t);\n\t\t\t`,\n\t\t),\n\t\tdb.execute(\n\t\t\tsql`\n\t\t\t\tCREATE TABLE IF NOT EXISTS \\`comment_likes\\` (\n\t\t\t\t\t\\`id\\` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n\t\t\t\t\t\\`creator\\` bigint,\n\t\t\t\t\t\\`comment_id\\` bigint,\n\t\t\t\t\t\\`created_at\\` timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL\n\t\t\t\t);\n\t\t\t`,\n\t\t),\n\t]);\n});\n\nbeforeEach(async () => {\n\tawait Promise.all([\n\t\tdb.delete(usersTable),\n\t\tdb.delete(postsTable),\n\t\tdb.delete(commentsTable),\n\t\tdb.delete(groupsTable),\n\t\tdb.delete(usersToGroupsTable),\n\t\tdb.execute(sql`delete from \\`comment_likes\\``),\n\t]);\n\tawait Promise.all([\n\t\tdb.execute(sql`ALTER TABLE \\`users\\` AUTO_INCREMENT = 1`),\n\t\tdb.execute(sql`ALTER TABLE \\`groups\\` AUTO_INCREMENT = 1`),\n\t\tdb.execute(sql`ALTER TABLE \\`users_to_groups\\` AUTO_INCREMENT = 1`),\n\t\tdb.execute(sql`ALTER TABLE \\`posts\\` AUTO_INCREMENT = 1`),\n\t\tdb.execute(sql`ALTER TABLE \\`comments\\` AUTO_INCREMENT = 1`),\n\t\tdb.execute(sql`ALTER TABLE \\`comment_likes\\` AUTO_INCREMENT = 1`),\n\t]);\n});\n\n/*\n\t[Find Many] One relation users+posts\n*/\n\ntest('[Find Many] Get users with posts', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts and users', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tlowerName: 'dan',\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.2',\n\t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n\t\t}, { id: 3, ownerId: 1, content: 'Post1.3', createdAt: usersWithPosts[0]?.posts[2]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlowerName: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 5,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlowerName: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields + limits', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(2);\n\texpect(usersWithPosts[1]?.posts.length).eq(2);\n\texpect(usersWithPosts[2]?.posts.length).eq(3);\n\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [\n\t\t\t{\n\t\t\t\tid: 3,\n\t\t\t\townerId: 1,\n\t\t\t\tcontent: '3',\n\t\t\t\tcreatedAt: usersWithPosts[2]?.posts[2]?.createdAt,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 2,\n\t\t\t\townerId: 1,\n\t\t\t\tcontent: '2',\n\t\t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 1,\n\t\t\t\townerId: 1,\n\t\t\t\tcontent: '1',\n\t\t\t\tcreatedAt: usersWithPosts[2]?.posts[0]?.createdAt,\n\t\t\t},\n\t\t],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 2,\n\t\t\tcontent: '5',\n\t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n\t\t}, { id: 4, ownerId: 2, content: '4', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: '7',\n\t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n\t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial. Did not select posts id, but used it in where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(true + false)', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tposts: {\n\t\t\tid: number;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(false)', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in transaction', async () => {\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.insert(usersTable).values([\n\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t{ id: 3, name: 'Alex' },\n\t\t]);\n\n\t\tawait tx.insert(postsTable).values([\n\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t]);\n\n\t\tusersWithPosts = await tx.query.usersTable.findMany({\n\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in rollbacked transaction', async () => {\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\tawait expect(db.transaction(async (tx) => {\n\t\tawait tx.insert(usersTable).values([\n\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t{ id: 3, name: 'Alex' },\n\t\t]);\n\n\t\tawait tx.insert(postsTable).values([\n\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t]);\n\n\t\ttx.rollback();\n\n\t\tusersWithPosts = await tx.query.usersTable.findMany({\n\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t})).rejects.toThrowError(new TransactionRollbackError());\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(0);\n});\n\n// select only custom\ntest('[Find Many] Get only custom fields', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 1, content: 'Post1.2' },\n\t\t{ id: 3, ownerId: 1, content: 'Post1.3' },\n\t\t{ id: 4, ownerId: 2, content: 'Post2' },\n\t\t{ id: 5, ownerId: 2, content: 'Post2.1' },\n\t\t{ id: 6, ownerId: 3, content: 'Post3' },\n\t\t{ id: 7, ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts[0]?.lowerName).toEqual('dan');\n\texpect(usersWithPosts[1]?.lowerName).toEqual('andrew');\n\texpect(usersWithPosts[2]?.lowerName).toEqual('alex');\n\n\texpect(usersWithPosts[0]?.posts).toContainEqual({\n\t\tlowerName: 'post1',\n\t});\n\n\texpect(usersWithPosts[0]?.posts).toContainEqual({\n\t\tlowerName: 'post1.2',\n\t});\n\n\texpect(usersWithPosts[0]?.posts).toContainEqual({\n\t\tlowerName: 'post1.3',\n\t});\n\n\texpect(usersWithPosts[1]?.posts).toContainEqual({\n\t\tlowerName: 'post2',\n\t});\n\n\texpect(usersWithPosts[1]?.posts).toContainEqual({\n\t\tlowerName: 'post2.1',\n\t});\n\n\texpect(usersWithPosts[2]?.posts).toContainEqual({\n\t\tlowerName: 'post3',\n\t});\n\n\texpect(usersWithPosts[2]?.posts).toContainEqual({\n\t\tlowerName: 'post3.1',\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// select only custom find one\ntest('[Find One] Get only custom fields', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(3);\n\n\texpect(usersWithPosts?.lowerName).toEqual('dan');\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tlowerName: 'post1',\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tlowerName: 'post1.2',\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tlowerName: 'post1.3',\n\t});\n});\n\ntest('[Find One] Get only custom fields + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// columns {}\ntest('[Find Many] Get select {}', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findMany({\n\t\t\tcolumns: {},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// columns {}\ntest('[Find One] Get select {}', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findFirst({\n\t\t\tcolumns: {},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// deep select {}\ntest('[Find Many] Get deep select {}', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findMany({\n\t\t\tcolumns: {},\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\tcolumns: {},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// deep select {}\ntest('[Find One] Get deep select {}', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findFirst({\n\t\t\tcolumns: {},\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\tcolumns: {},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n/*\n\tPrepared statements for users+posts\n*/\ntest('[Find Many] Get users with posts + prepared limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('limit'),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = await prepared.execute({ limit: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared limit + offset', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = await prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, placeholder('id'))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = await prepared.execute({ id: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared + limit + offset + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twhere: (({ id }, { eq, or }) => or(eq(id, placeholder('id')), eq(id, 3))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, placeholder('pid'))),\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = await prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1, id: 2, pid: 6 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\t[Find One] One relation users+posts\n*/\n\ntest('[Find One] Get users with posts', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + limit posts', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts no results found', async () => {\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts).toBeUndefined();\n});\n\ntest('[Find One] Get users with posts + limit posts and users', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(3);\n\n\texpect(usersWithPosts?.lowerName).toEqual('dan');\n\texpect(usersWithPosts?.id).toEqual(1);\n\texpect(usersWithPosts?.verified).toEqual(false);\n\texpect(usersWithPosts?.invitedBy).toEqual(null);\n\texpect(usersWithPosts?.name).toEqual('Dan');\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tid: 1,\n\t\townerId: 1,\n\t\tcontent: 'Post1',\n\t\tcreatedAt: usersWithPosts?.posts[0]?.createdAt,\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tid: 2,\n\t\townerId: 1,\n\t\tcontent: 'Post1.2',\n\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tid: 3,\n\t\townerId: 1,\n\t\tcontent: 'Post1.3',\n\t\tcreatedAt: usersWithPosts?.posts[2]?.createdAt,\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields + limits', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: '7',\n\t\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial. Did not select posts id, but used it in where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(true + false)', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(false)', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\tOne relation users+users. Self referencing\n*/\n\ntest('Get user with invitee', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user + limit with invitee', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew', invitedBy: 1 },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t\tlimit: 2,\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields + limits', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(3);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + order by', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[3]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where + partial', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial.  Did not select users id, but used it in where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(true+false)', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t\tverified: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(false)', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tname: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, verified: false, invitedBy: null },\n\t});\n});\n\n/*\n\tTwo first-level relations users+users and users+posts\n*/\n\ntest('Get user with invitee and posts', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + limits + custom fields in each', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_invitee_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_content') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + custom fields in each', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\tresponse[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tresponse[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tresponse[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(2);\n\texpect(response[1]?.posts.length).eq(2);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.1',\n\t\t\tlower: 'post1.1',\n\t\t\tcreatedAt: response[0]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 4,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tlower: 'post2.1',\n\t\t\tcreatedAt: response[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 6,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tlower: 'post3.1',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\torderBy: (posts, { desc }) => [desc(posts.id)],\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(4);\n\n\texpect(response[3]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(2);\n\n\texpect(response[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 1, content: 'Post1.1', createdAt: response[3]?.posts[0]?.createdAt }, {\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2.1', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 3,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 2), eq(users.id, 3))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 2)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(2);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 3)),\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(1);\n\n\texpect(response[0]?.invitee).not.toBeNull();\n\texpect(response[0]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + custom', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + partial + custom', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; content: string }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan' },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew' },\n\t\tposts: [],\n\t});\n});\n\n/*\n\tOne two-level relation users+posts+comments\n*/\n\ntest('Get user with posts and posts with comments', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcomments: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tcontent: string;\n\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t\tcreator: number | null;\n\t\t\t\t\tpostId: number | null;\n\t\t\t\t}[];\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\t// expect(response[2]).toEqual({\n\t// \tid: 3,\n\t// \tname: 'Alex',\n\t// \tverified: false,\n\t// \tinvitedBy: null,\n\t// \tposts: [{\n\t// \t\tid: 3,\n\t// \t\townerId: 3,\n\t// \t\tcontent: 'Post3',\n\t// \t\tcreatedAt: response[2]?.posts[0]?.createdAt,\n\t// \t\tcomments: [\n\t// \t\t\t{\n\t// \t\t\t\tid: ,\n\t// \t\t\t\tcontent: 'Comment3',\n\t// \t\t\t\tcreator: 3,\n\t// \t\t\t\tpostId: 3,\n\t// \t\t\t\tcreatedAt: response[2]?.posts[0]?.comments[0]?.createdAt,\n\t// \t\t\t},\n\t// \t\t],\n\t// \t}],\n\t// });\n});\n\n// Get user with limit posts and limit comments\n\n// Get user with custom field + post + comment with custom field\n\n// Get user with limit + posts orderBy + comment orderBy\n\n// Get user with where + posts where + comment where\n\n// Get user with where + posts partial where + comment where\n\n// Get user with where + posts partial where + comment partial(false) where\n\n// Get user with where partial(false) + posts partial where partial(false) + comment partial(false+true) where\n\n// Get user with where + posts partial where + comment where. Didn't select field from where in posts\n\n// Get user with where + posts partial where + comment where. Didn't select field from where for all\n\n// Get with limit+offset in each\n\n/*\n\tOne two-level + One first-level relation users+posts+comments and users+users\n*/\n\n/*\n\tOne three-level relation users+posts+comments+comment_owner\n*/\n\ntest('Get user with posts and posts with comments and comments with owner', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tcomments: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcreator: number | null;\n\t\t\t\tpostId: number | null;\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n});\n\ntest('Get user with posts and posts with comments and comments with owner where exists', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\twhere: (table, { exists, eq }) => exists(db.select({ one: sql`1` }).from(usersTable).where(eq(sql`1`, table.id))),\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tcomments: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcreator: number | null;\n\t\t\t\tpostId: number | null;\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).eq(1);\n\texpect(response[0]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n});\n\n/*\n\tOne three-level relation + 1 first-level relatioon\n\t1. users+posts+comments+comment_owner\n\t2. users+users\n*/\n\n/*\n\tOne four-level relation users+posts+comments+coment_likes\n*/\n\n/*\n\t[Find Many] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find Many] Get users with groups', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\tlimit: 1,\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(0);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(2);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\n/*\n\t[Find One] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find One] Get users with groups', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find One] Get groups with users + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get groups with users + orderBy + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get users with groups + custom', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: {\n\t\t\t\t\t\textras: {\n\t\t\t\t\t\t\tlower: sql<string>`lower(${groupsTable.name})`.as('lower_name'),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tlower: 'group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tlower: 'group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tlower: 'group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tlower: 'group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get groups with users + custom', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\textras: (table, { sql }) => ({\n\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t}),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: {\n\t\t\t\t\t\textras: (table, { sql }) => ({\n\t\t\t\t\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tlower: 'group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tlower: 'dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tlower: 'group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tlower: 'andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tlower: 'group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('.toSQL()', () => {\n\tconst query = db.query.usersTable.findFirst().toSQL();\n\n\texpect(query).toHaveProperty('sql', expect.any(String));\n\texpect(query).toHaveProperty('params', expect.any(Array));\n});\n\n// + custom + where + orderby\n\n// + custom + where + orderby + limit\n\n// + partial\n\n// + partial(false)\n\n// + partial + orderBy + where (all not selected)\n\n/*\n\tOne four-level relation users+posts+comments+coment_likes\n\t+ users+users_to_groups+groups\n*/\n\n/*\n\tReally hard case\n\t1. users+posts+comments+coment_likes\n\t2. users+users_to_groups+groups\n\t3. users+users\n*/\n"
  },
  {
    "path": "integration-tests/tests/relational/mysql.schema.ts",
    "content": "import {\n\ttype AnyMySqlColumn,\n\tbigint,\n\tboolean,\n\tmysqlSchema,\n\tmysqlTable,\n\tprimaryKey,\n\tserial,\n\ttext,\n\ttimestamp,\n} from 'drizzle-orm/mysql-core';\n\nimport { relations } from 'drizzle-orm';\n\nexport const usersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tinvitedBy: bigint('invited_by', { mode: 'number' }).references(\n\t\t(): AnyMySqlColumn => usersTable.id,\n\t),\n});\n\nconst schemaV1 = mysqlSchema('schemaV1');\n\nexport const usersV1 = schemaV1.table('usersV1', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tinvitedBy: bigint('invited_by', { mode: 'number' }),\n});\n\nexport const usersTableV1 = schemaV1.table('users_table_V1', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tinvitedBy: bigint('invited_by', { mode: 'number' }),\n});\n\nexport const usersConfig = relations(usersTable, ({ one, many }) => ({\n\tinvitee: one(usersTable, {\n\t\tfields: [usersTable.invitedBy],\n\t\treferences: [usersTable.id],\n\t}),\n\tusersToGroups: many(usersToGroupsTable),\n\tposts: many(postsTable),\n\tcomments: many(commentsTable),\n}));\n\nexport const groupsTable = mysqlTable('groups', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tdescription: text('description'),\n});\nexport const groupsConfig = relations(groupsTable, ({ many }) => ({\n\tusersToGroups: many(usersToGroupsTable),\n}));\n\nexport const usersToGroupsTable = mysqlTable(\n\t'users_to_groups',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\tuserId: bigint('user_id', { mode: 'number' }).notNull().references(\n\t\t\t() => usersTable.id,\n\t\t),\n\t\tgroupId: bigint('group_id', { mode: 'number' }).notNull().references(\n\t\t\t() => groupsTable.id,\n\t\t),\n\t},\n\t(t) => ({\n\t\tpk: primaryKey(t.userId, t.groupId),\n\t}),\n);\nexport const usersToGroupsConfig = relations(usersToGroupsTable, ({ one }) => ({\n\tgroup: one(groupsTable, {\n\t\tfields: [usersToGroupsTable.groupId],\n\t\treferences: [groupsTable.id],\n\t}),\n\tuser: one(usersTable, {\n\t\tfields: [usersToGroupsTable.userId],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n\nexport const postsTable = mysqlTable('posts', {\n\tid: serial('id').primaryKey(),\n\tcontent: text('content').notNull(),\n\townerId: bigint('owner_id', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tcreatedAt: timestamp('created_at')\n\t\t.notNull()\n\t\t.defaultNow(),\n});\nexport const postsConfig = relations(postsTable, ({ one, many }) => ({\n\tauthor: one(usersTable, {\n\t\tfields: [postsTable.ownerId],\n\t\treferences: [usersTable.id],\n\t}),\n\tcomments: many(commentsTable),\n}));\n\nexport const commentsTable = mysqlTable('comments', {\n\tid: serial('id').primaryKey(),\n\tcontent: text('content').notNull(),\n\tcreator: bigint('creator', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tpostId: bigint('post_id', { mode: 'number' }).references(() => postsTable.id),\n\tcreatedAt: timestamp('created_at')\n\t\t.notNull()\n\t\t.defaultNow(),\n});\nexport const commentsConfig = relations(commentsTable, ({ one, many }) => ({\n\tpost: one(postsTable, {\n\t\tfields: [commentsTable.postId],\n\t\treferences: [postsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentsTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n\tlikes: many(commentLikesTable),\n}));\n\nexport const commentLikesTable = mysqlTable('comment_likes', {\n\tid: serial('id').primaryKey(),\n\tcreator: bigint('creator', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tcommentId: bigint('comment_id', { mode: 'number' }).references(\n\t\t() => commentsTable.id,\n\t),\n\tcreatedAt: timestamp('created_at')\n\t\t.notNull()\n\t\t.defaultNow(),\n});\nexport const commentLikesConfig = relations(commentLikesTable, ({ one }) => ({\n\tcomment: one(commentsTable, {\n\t\tfields: [commentLikesTable.commentId],\n\t\treferences: [commentsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentLikesTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n"
  },
  {
    "path": "integration-tests/tests/relational/mysql.test.ts",
    "content": "import 'dotenv/config';\nimport Docker from 'dockerode';\nimport { desc, DrizzleError, eq, gt, gte, or, placeholder, sql, TransactionRollbackError } from 'drizzle-orm';\nimport { drizzle, type MySql2Database } from 'drizzle-orm/mysql2';\nimport getPort from 'get-port';\nimport * as mysql from 'mysql2/promise';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\nimport * as schema from './mysql.schema.ts';\n\nconst { usersTable, postsTable, commentsTable, usersToGroupsTable, groupsTable, usersV1, usersTableV1 } = schema;\n\nconst ENABLE_LOGGING = false;\n\n/*\n\tTest cases:\n\t- querying nested relation without PK with additional fields\n*/\n\ndeclare module 'vitest' {\n\texport interface TestContext {\n\t\tdocker: Docker;\n\t\tmysqlContainer: Docker.Container;\n\t\tmysqlDb: MySql2Database<typeof schema>;\n\t\tmysqlClient: mysql.Connection;\n\t}\n}\n\nlet globalDocker: Docker;\nlet mysqlContainer: Docker.Container;\nlet db: MySql2Database<typeof schema>;\nlet client: mysql.Connection;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = (globalDocker = new Docker());\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'mysql:8';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tmysqlContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait mysqlContainer.start();\n\n\treturn `mysql://root:mysql@127.0.0.1:${port}/drizzle`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['MYSQL_CONNECTION_STRING'] ?? await createDockerDB();\n\n\tconst sleep = 1000;\n\tlet timeLeft = 30000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = await mysql.createConnection(connectionString);\n\t\t\tawait client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to MySQL');\n\t\tawait client?.end().catch(console.error);\n\t\tawait mysqlContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\tdb = drizzle(client, { schema, logger: ENABLE_LOGGING, mode: 'default' });\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait mysqlContainer?.stop().catch(console.error);\n});\n\nbeforeEach(async (ctx) => {\n\tctx.mysqlDb = db;\n\tctx.mysqlClient = client;\n\tctx.docker = globalDocker;\n\tctx.mysqlContainer = mysqlContainer;\n\n\tawait ctx.mysqlDb.execute(sql`drop table if exists \\`users\\``);\n\tawait ctx.mysqlDb.execute(sql`drop table if exists \\`schemaV1\\`.\\`usersV1\\``);\n\tawait ctx.mysqlDb.execute(sql`drop table if exists \\`schemaV1\\`.\\`users_table_V1\\``);\n\tawait ctx.mysqlDb.execute(sql`drop table if exists \\`groups\\``);\n\tawait ctx.mysqlDb.execute(sql`drop table if exists \\`users_to_groups\\``);\n\tawait ctx.mysqlDb.execute(sql`drop table if exists \\`posts\\``);\n\tawait ctx.mysqlDb.execute(sql`drop table if exists \\`comments\\``);\n\tawait ctx.mysqlDb.execute(sql`drop table if exists \\`comment_likes\\``);\n\n\tawait ctx.mysqlDb.execute(sql`create schema if not exists \\`schemaV1\\``);\n\n\tawait ctx.mysqlDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \\`users\\` (\n\t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n\t\t\t\t\\`name\\` text NOT NULL,\n\t\t\t\t\\`verified\\` boolean DEFAULT false NOT NULL,\n\t\t\t\t\\`invited_by\\` bigint REFERENCES \\`users\\`(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.mysqlDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \\`schemaV1\\`.\\`usersV1\\` (\n\t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n\t\t\t\t\\`name\\` text NOT NULL,\n\t\t\t\t\\`verified\\` boolean DEFAULT false NOT NULL,\n\t\t\t\t\\`invited_by\\` bigint REFERENCES \\`users\\`(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.mysqlDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \\`schemaV1\\`.\\`users_table_V1\\` (\n\t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n\t\t\t\t\\`name\\` text NOT NULL,\n\t\t\t\t\\`verified\\` boolean DEFAULT false NOT NULL,\n\t\t\t\t\\`invited_by\\` bigint REFERENCES \\`users\\`(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.mysqlDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \\`groups\\` (\n\t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n\t\t\t\t\\`name\\` text NOT NULL,\n\t\t\t\t\\`description\\` text\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.mysqlDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \\`users_to_groups\\` (\n\t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n\t\t\t\t\\`user_id\\` bigint REFERENCES \\`users\\`(\\`id\\`),\n\t\t\t\t\\`group_id\\` bigint REFERENCES \\`groups\\`(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.mysqlDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \\`posts\\` (\n\t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n\t\t\t\t\\`content\\` text NOT NULL,\n\t\t\t\t\\`owner_id\\` bigint REFERENCES \\`users\\`(\\`id\\`),\n\t\t\t\t\\`created_at\\` timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.mysqlDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \\`comments\\` (\n\t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n\t\t\t\t\\`content\\` text NOT NULL,\n\t\t\t\t\\`creator\\` bigint REFERENCES \\`users\\`(\\`id\\`),\n\t\t\t\t\\`post_id\\` bigint REFERENCES \\`posts\\`(\\`id\\`),\n\t\t\t\t\\`created_at\\` timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.mysqlDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \\`comment_likes\\` (\n\t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n\t\t\t\t\\`creator\\` bigint REFERENCES \\`users\\`(\\`id\\`),\n\t\t\t\t\\`comment_id\\` bigint REFERENCES \\`comments\\`(\\`id\\`),\n\t\t\t\t\\`created_at\\` timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n});\n\n/*\n\t[Find Many] One relation users+posts\n*/\n\ntest('[Find Many] Get users with posts', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts and users', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tlowerName: 'dan',\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.2',\n\t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n\t\t}, { id: 3, ownerId: 1, content: 'Post1.3', createdAt: usersWithPosts[0]?.posts[2]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlowerName: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 5,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlowerName: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields + limits', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + orderBy', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(2);\n\texpect(usersWithPosts[1]?.posts.length).eq(2);\n\texpect(usersWithPosts[2]?.posts.length).eq(3);\n\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 3, ownerId: 1, content: '3', createdAt: usersWithPosts[2]?.posts[2]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: '2',\n\t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n\t\t}, { id: 1, ownerId: 1, content: '1', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 2,\n\t\t\tcontent: '5',\n\t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n\t\t}, { id: 4, ownerId: 2, content: '4', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: '7',\n\t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n\t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial. Did not select posts id, but used it in where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(true + false)', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tposts: {\n\t\t\tid: number;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(false)', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in transaction', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.insert(usersTable).values([\n\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t{ id: 3, name: 'Alex' },\n\t\t]);\n\n\t\tawait tx.insert(postsTable).values([\n\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t]);\n\n\t\tusersWithPosts = await tx.query.usersTable.findMany({\n\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in rollbacked transaction', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\tawait expect(db.transaction(async (tx) => {\n\t\tawait tx.insert(usersTable).values([\n\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t{ id: 3, name: 'Alex' },\n\t\t]);\n\n\t\tawait tx.insert(postsTable).values([\n\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t]);\n\n\t\ttx.rollback();\n\n\t\tusersWithPosts = await tx.query.usersTable.findMany({\n\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t})).rejects.toThrowError(new TransactionRollbackError());\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(0);\n});\n\n// select only custom\ntest('[Find Many] Get only custom fields', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 1, content: 'Post1.2' },\n\t\t{ id: 3, ownerId: 1, content: 'Post1.3' },\n\t\t{ id: 4, ownerId: 2, content: 'Post2' },\n\t\t{ id: 5, ownerId: 2, content: 'Post2.1' },\n\t\t{ id: 6, ownerId: 3, content: 'Post3' },\n\t\t{ id: 7, ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts[0]?.lowerName).toEqual('dan');\n\texpect(usersWithPosts[1]?.lowerName).toEqual('andrew');\n\texpect(usersWithPosts[2]?.lowerName).toEqual('alex');\n\n\texpect(usersWithPosts[0]?.posts).toContainEqual({\n\t\tlowerName: 'post1',\n\t});\n\n\texpect(usersWithPosts[0]?.posts).toContainEqual({\n\t\tlowerName: 'post1.2',\n\t});\n\n\texpect(usersWithPosts[0]?.posts).toContainEqual({\n\t\tlowerName: 'post1.3',\n\t});\n\n\texpect(usersWithPosts[1]?.posts).toContainEqual({\n\t\tlowerName: 'post2',\n\t});\n\n\texpect(usersWithPosts[1]?.posts).toContainEqual({\n\t\tlowerName: 'post2.1',\n\t});\n\n\texpect(usersWithPosts[2]?.posts).toContainEqual({\n\t\tlowerName: 'post3',\n\t});\n\n\texpect(usersWithPosts[2]?.posts).toContainEqual({\n\t\tlowerName: 'post3.1',\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + limit', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + orderBy', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// select only custom find one\ntest('[Find One] Get only custom fields', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(3);\n\n\texpect(usersWithPosts?.lowerName).toEqual('dan');\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tlowerName: 'post1',\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tlowerName: 'post1.2',\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tlowerName: 'post1.3',\n\t});\n});\n\ntest('[Find One] Get only custom fields + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + limit', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + orderBy', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// columns {}\ntest('[Find Many] Get select {}', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait expect(\n\t\tasync () =>\n\t\t\tawait db.query.usersTable.findMany({\n\t\t\t\tcolumns: {},\n\t\t\t}),\n\t).rejects.toThrow(DrizzleError);\n});\n\n// columns {}\ntest('[Find One] Get select {}', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findFirst({\n\t\t\tcolumns: {},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// deep select {}\ntest('[Find Many] Get deep select {}', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findMany({\n\t\t\tcolumns: {},\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\tcolumns: {},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// deep select {}\ntest('[Find One] Get deep select {}', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findFirst({\n\t\t\tcolumns: {},\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\tcolumns: {},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n/*\n\tPrepared statements for users+posts\n*/\ntest('[Find Many] Get users with posts + prepared limit', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('limit'),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = await prepared.execute({ limit: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared limit + offset', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = await prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, placeholder('id'))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = await prepared.execute({ id: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared + limit + offset + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twhere: (({ id }, { eq, or }) => or(eq(id, placeholder('id')), eq(id, 3))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, placeholder('pid'))),\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = await prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1, id: 2, pid: 6 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\t[Find One] One relation users+posts\n*/\n\ntest('[Find One] Get users with posts', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + limit posts', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts no results found', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts).toBeUndefined();\n});\n\ntest('[Find One] Get users with posts + limit posts and users', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(3);\n\n\texpect(usersWithPosts?.lowerName).toEqual('dan');\n\texpect(usersWithPosts?.id).toEqual(1);\n\texpect(usersWithPosts?.verified).toEqual(false);\n\texpect(usersWithPosts?.invitedBy).toEqual(null);\n\texpect(usersWithPosts?.name).toEqual('Dan');\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tid: 1,\n\t\townerId: 1,\n\t\tcontent: 'Post1',\n\t\tcreatedAt: usersWithPosts?.posts[0]?.createdAt,\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tid: 2,\n\t\townerId: 1,\n\t\tcontent: 'Post1.2',\n\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tid: 3,\n\t\townerId: 1,\n\t\tcontent: 'Post1.3',\n\t\tcreatedAt: usersWithPosts?.posts[2]?.createdAt,\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields + limits', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + orderBy', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: '7',\n\t\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial. Did not select posts id, but used it in where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(true + false)', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(false)', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\tOne relation users+users. Self referencing\n*/\n\ntest('Get user with invitee', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user + limit with invitee', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew', invitedBy: 1 },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t\tlimit: 2,\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields + limits', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(3);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + order by', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[3]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where + partial', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial.  Did not select users id, but used it in where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(true+false)', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t\tverified: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(false)', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tname: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, verified: false, invitedBy: null },\n\t});\n});\n\n/*\n\tTwo first-level relations users+users and users+posts\n*/\n\ntest('Get user with invitee and posts', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + limits + custom fields in each', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_invitee_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_content') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + custom fields in each', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\tresponse[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tresponse[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tresponse[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(2);\n\texpect(response[1]?.posts.length).eq(2);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.1',\n\t\t\tlower: 'post1.1',\n\t\t\tcreatedAt: response[0]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 4,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tlower: 'post2.1',\n\t\t\tcreatedAt: response[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 6,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tlower: 'post3.1',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\torderBy: (posts, { desc }) => [desc(posts.id)],\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(4);\n\n\texpect(response[3]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(2);\n\n\texpect(response[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 1, content: 'Post1.1', createdAt: response[3]?.posts[0]?.createdAt }, {\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2.1', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 3,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 2), eq(users.id, 3))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 2)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(2);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 3)),\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(1);\n\n\texpect(response[0]?.invitee).not.toBeNull();\n\texpect(response[0]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + custom', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + partial + custom', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; content: string }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan' },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew' },\n\t\tposts: [],\n\t});\n});\n\n/*\n\tOne two-level relation users+posts+comments\n*/\n\ntest('Get user with posts and posts with comments', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcomments: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tcontent: string;\n\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t\tcreator: number | null;\n\t\t\t\t\tpostId: number | null;\n\t\t\t\t}[];\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\t// expect(response[2]).toEqual({\n\t// \tid: 3,\n\t// \tname: 'Alex',\n\t// \tverified: false,\n\t// \tinvitedBy: null,\n\t// \tposts: [{\n\t// \t\tid: 3,\n\t// \t\townerId: 3,\n\t// \t\tcontent: 'Post3',\n\t// \t\tcreatedAt: response[2]?.posts[0]?.createdAt,\n\t// \t\tcomments: [\n\t// \t\t\t{\n\t// \t\t\t\tid: ,\n\t// \t\t\t\tcontent: 'Comment3',\n\t// \t\t\t\tcreator: 3,\n\t// \t\t\t\tpostId: 3,\n\t// \t\t\t\tcreatedAt: response[2]?.posts[0]?.comments[0]?.createdAt,\n\t// \t\t\t},\n\t// \t\t],\n\t// \t}],\n\t// });\n});\n\n// Get user with limit posts and limit comments\n\n// Get user with custom field + post + comment with custom field\n\n// Get user with limit + posts orderBy + comment orderBy\n\n// Get user with where + posts where + comment where\n\n// Get user with where + posts partial where + comment where\n\n// Get user with where + posts partial where + comment partial(false) where\n\n// Get user with where partial(false) + posts partial where partial(false) + comment partial(false+true) where\n\n// Get user with where + posts partial where + comment where. Didn't select field from where in posts\n\n// Get user with where + posts partial where + comment where. Didn't select field from where for all\n\n// Get with limit+offset in each\n\n/*\n\tOne two-level + One first-level relation users+posts+comments and users+users\n*/\n\n/*\n\tOne three-level relation users+posts+comments+comment_owner\n*/\n\ntest('Get user with posts and posts with comments and comments with owner', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tcomments: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcreator: number | null;\n\t\t\t\tpostId: number | null;\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n});\n\ntest('Get user with posts and posts with comments and comments with owner where exists', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\twhere: (table, { exists, eq }) => exists(db.select({ one: sql`1` }).from(usersTable).where(eq(sql`1`, table.id))),\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tcomments: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcreator: number | null;\n\t\t\t\tpostId: number | null;\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).eq(1);\n\texpect(response[0]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n});\n\n/*\n\tOne three-level relation + 1 first-level relatioon\n\t1. users+posts+comments+comment_owner\n\t2. users+users\n*/\n\n/*\n\tOne four-level relation users+posts+comments+coment_likes\n*/\n\n/*\n\t[Find Many] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find Many] Get users with groups', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\tlimit: 1,\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(0);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(2);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + orderBy', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy + limit', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\n/*\n\t[Find One] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find One] Get users with groups', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find One] Get groups with users + where', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + orderBy', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy + limit', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get groups with users + orderBy + limit', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get users with groups + custom', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: {\n\t\t\t\t\t\textras: {\n\t\t\t\t\t\t\tlower: sql<string>`lower(${groupsTable.name})`.as('lower_name'),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tlower: 'group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tlower: 'group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tlower: 'group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tlower: 'group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get groups with users + custom', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\textras: (table, { sql }) => ({\n\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t}),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: {\n\t\t\t\t\t\textras: (table, { sql }) => ({\n\t\t\t\t\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tlower: 'group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tlower: 'dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tlower: 'group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tlower: 'andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tlower: 'group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get schema users - dbName & tsName match', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersV1).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tconst schemaUsers = await db.query.usersV1.findMany();\n\n\texpectTypeOf(schemaUsers).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t}[]>();\n\n\tschemaUsers.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(schemaUsers.length).eq(3);\n\texpect(schemaUsers[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n\texpect(schemaUsers[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n\texpect(schemaUsers[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n});\n\ntest('[Find Many] Get schema users - dbName & tsName mismatch', async (t) => {\n\tconst { mysqlDb: db } = t;\n\n\tawait db.insert(usersTableV1).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tconst schemaUsers = await db.query.usersTableV1.findMany();\n\n\texpectTypeOf(schemaUsers).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t}[]>();\n\n\tschemaUsers.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(schemaUsers.length).eq(3);\n\texpect(schemaUsers[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n\texpect(schemaUsers[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n\texpect(schemaUsers[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n});\n\ntest('.toSQL()', () => {\n\tconst query = db.query.usersTable.findFirst().toSQL();\n\n\texpect(query).toHaveProperty('sql', expect.any(String));\n\texpect(query).toHaveProperty('params', expect.any(Array));\n});\n\n// + custom + where + orderby\n\n// + custom + where + orderby + limit\n\n// + partial\n\n// + partial(false)\n\n// + partial + orderBy + where (all not selected)\n\n/*\n\tOne four-level relation users+posts+comments+coment_likes\n\t+ users+users_to_groups+groups\n*/\n\n/*\n\tReally hard case\n\t1. users+posts+comments+coment_likes\n\t2. users+users_to_groups+groups\n\t3. users+users\n*/\n"
  },
  {
    "path": "integration-tests/tests/relational/pg.postgresjs.test.ts",
    "content": "import 'dotenv/config';\nimport Docker from 'dockerode';\nimport { desc, DrizzleError, eq, gt, gte, or, placeholder, sql, TransactionRollbackError } from 'drizzle-orm';\nimport { drizzle, type PostgresJsDatabase } from 'drizzle-orm/postgres-js';\nimport getPort from 'get-port';\nimport postgres from 'postgres';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\nimport * as schema from './pg.schema.ts';\n\nconst ENABLE_LOGGING = false;\n\nconst { usersTable, postsTable, commentsTable, usersToGroupsTable, groupsTable, usersV1, usersTableV1 } = schema;\n\n/*\n\tTest cases:\n\t- querying nested relation without PK with additional fields\n*/\n\ndeclare module 'vitest' {\n\texport interface TestContext {\n\t\tdocker: Docker;\n\t\tpgContainer: Docker.Container;\n\t\tpgjsDb: PostgresJsDatabase<typeof schema>;\n\t\tpgjsClient: postgres.Sql<{}>;\n\t}\n}\n\nlet globalDocker: Docker;\nlet pgContainer: Docker.Container;\nlet db: PostgresJsDatabase<typeof schema>;\nlet client: postgres.Sql<{}>;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = (globalDocker = new Docker());\n\tconst port = await getPort({ port: 5432 });\n\tconst image = 'postgres:14';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tpgContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: [\n\t\t\t'POSTGRES_PASSWORD=postgres',\n\t\t\t'POSTGRES_USER=postgres',\n\t\t\t'POSTGRES_DB=postgres',\n\t\t],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5432/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait pgContainer.start();\n\n\treturn `postgres://postgres:postgres@localhost:${port}/postgres`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['PG_CONNECTION_STRING'] ?? (await createDockerDB());\n\n\tconst sleep = 250;\n\tlet timeLeft = 5000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = postgres(connectionString, {\n\t\t\t\tmax: 1,\n\t\t\t\tonnotice: () => {\n\t\t\t\t\t// disable notices\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait client`select 1`;\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to Postgres');\n\t\tawait client?.end().catch(console.error);\n\t\tawait pgContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\tdb = drizzle(client, { schema, logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait pgContainer?.stop().catch(console.error);\n});\n\nbeforeEach(async (ctx) => {\n\tctx.pgjsDb = db;\n\tctx.pgjsClient = client;\n\tctx.docker = globalDocker;\n\tctx.pgContainer = pgContainer;\n\n\tawait ctx.pgjsDb.execute(sql`drop schema public cascade`);\n\tawait ctx.pgjsDb.execute(sql`drop schema if exists \"schemaV1\" cascade`);\n\tawait ctx.pgjsDb.execute(sql`create schema public`);\n\tawait ctx.pgjsDb.execute(sql`create schema \"schemaV1\"`);\n\tawait ctx.pgjsDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \"users\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"name\" text NOT NULL,\n\t\t\t\t\"verified\" boolean DEFAULT false NOT NULL,\n\t\t\t\t\"invited_by\" int REFERENCES \"users\"(\"id\")\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgjsDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \"schemaV1\".\"usersV1\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"name\" text NOT NULL,\n\t\t\t\t\"verified\" boolean DEFAULT false NOT NULL,\n\t\t\t\t\"invited_by\" int\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgjsDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \"schemaV1\".\"users_table_V1\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"name\" text NOT NULL,\n\t\t\t\t\"verified\" boolean DEFAULT false NOT NULL,\n\t\t\t\t\"invited_by\" int\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgjsDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"groups\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"name\" text NOT NULL,\n\t\t\t\t\"description\" text\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgjsDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"users_to_groups\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"user_id\" int REFERENCES \"users\"(\"id\"),\n\t\t\t\t\"group_id\" int REFERENCES \"groups\"(\"id\")\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgjsDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"posts\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"content\" text NOT NULL,\n\t\t\t\t\"owner_id\" int REFERENCES \"users\"(\"id\"),\n\t\t\t\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgjsDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"comments\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"content\" text NOT NULL,\n\t\t\t\t\"creator\" int REFERENCES \"users\"(\"id\"),\n\t\t\t\t\"post_id\" int REFERENCES \"posts\"(\"id\"),\n\t\t\t\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgjsDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"comment_likes\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"creator\" int REFERENCES \"users\"(\"id\"),\n\t\t\t\t\"comment_id\" int REFERENCES \"comments\"(\"id\"),\n\t\t\t\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n});\n\n/*\n\t[Find Many] One relation users+posts\n*/\n\ntest('[Find Many] Get users with posts', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts and users', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tlowerName: 'dan',\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.2',\n\t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n\t\t}, { id: 3, ownerId: 1, content: 'Post1.3', createdAt: usersWithPosts[0]?.posts[2]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlowerName: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 5,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlowerName: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields + limits', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + orderBy', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(2);\n\texpect(usersWithPosts[1]?.posts.length).eq(2);\n\texpect(usersWithPosts[2]?.posts.length).eq(3);\n\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 3, ownerId: 1, content: '3', createdAt: usersWithPosts[2]?.posts[2]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: '2',\n\t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n\t\t}, { id: 1, ownerId: 1, content: '1', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 2,\n\t\t\tcontent: '5',\n\t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n\t\t}, { id: 4, ownerId: 2, content: '4', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: '7',\n\t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n\t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial. Did not select posts id, but used it in where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(true + false)', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tposts: {\n\t\t\tid: number;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(false)', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in transaction', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.insert(usersTable).values([\n\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t{ id: 3, name: 'Alex' },\n\t\t]);\n\n\t\tawait tx.insert(postsTable).values([\n\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t]);\n\n\t\tusersWithPosts = await tx.query.usersTable.findMany({\n\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in rollbacked transaction', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\tawait expect(db.transaction(async (tx) => {\n\t\tawait tx.insert(usersTable).values([\n\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t{ id: 3, name: 'Alex' },\n\t\t]);\n\n\t\tawait tx.insert(postsTable).values([\n\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t]);\n\n\t\ttx.rollback();\n\n\t\tusersWithPosts = await tx.query.usersTable.findMany({\n\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t})).rejects.toThrowError(new TransactionRollbackError());\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(0);\n});\n\n// select only custom\ntest('[Find Many] Get only custom fields', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1' }, {\n\t\t\tlowerName: 'post1.2',\n\t\t}, { lowerName: 'post1.3' }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'andrew',\n\t\tposts: [{ lowerName: 'post2' }, {\n\t\t\tlowerName: 'post2.1',\n\t\t}],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'alex',\n\t\tposts: [{ lowerName: 'post3' }, {\n\t\t\tlowerName: 'post3.1',\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + limit', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + orderBy', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// select only custom find one\ntest('[Find One] Get only custom fields', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(3);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1' }, {\n\t\t\tlowerName: 'post1.2',\n\t\t}, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + limit', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + orderBy', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// columns {}\ntest('[Find Many] Get select {}', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findMany({\n\t\t\tcolumns: {},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// columns {}\ntest('[Find One] Get select {}', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findFirst({\n\t\t\tcolumns: {},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// deep select {}\ntest('[Find Many] Get deep select {}', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findMany({\n\t\t\tcolumns: {},\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\tcolumns: {},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// deep select {}\ntest('[Find One] Get deep select {}', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findFirst({\n\t\t\tcolumns: {},\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\tcolumns: {},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n/*\n\tPrepared statements for users+posts\n*/\ntest('[Find Many] Get users with posts + prepared limit', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('limit'),\n\t\t\t},\n\t\t},\n\t}).prepare('query1');\n\n\tconst usersWithPosts = await prepared.execute({ limit: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared limit + offset', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare('query2');\n\n\tconst usersWithPosts = await prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, placeholder('id'))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t}).prepare('query3');\n\n\tconst usersWithPosts = await prepared.execute({ id: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared + limit + offset + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twhere: (({ id }, { eq, or }) => or(eq(id, placeholder('id')), eq(id, 3))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, placeholder('pid'))),\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare('query4');\n\n\tconst usersWithPosts = await prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1, id: 2, pid: 6 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\t[Find One] One relation users+posts\n*/\n\ntest('[Find One] Get users with posts', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + limit posts', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts no results found', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts).toBeUndefined();\n});\n\ntest('[Find One] Get users with posts + limit posts and users', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(3);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tlowerName: 'dan',\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.2',\n\t\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t\t}, { id: 3, ownerId: 1, content: 'Post1.3', createdAt: usersWithPosts?.posts[2]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields + limits', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + orderBy', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: '7',\n\t\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial. Did not select posts id, but used it in where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(true + false)', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(false)', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\tOne relation users+users. Self referencing\n*/\n\ntest('Get user with invitee', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user + limit with invitee', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew', invitedBy: 1 },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t\tlimit: 2,\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields + limits', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(3);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + order by', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[3]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where + partial', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial.  Did not select users id, but used it in where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(true+false)', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t\tverified: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(false)', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tname: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, verified: false, invitedBy: null },\n\t});\n});\n\n/*\n\tTwo first-level relations users+users and users+posts\n*/\n\ntest('Get user with invitee and posts', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + limits + custom fields in each', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_invitee_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_content') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + custom fields in each', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(2);\n\texpect(response[1]?.posts.length).eq(2);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.1',\n\t\t\tlower: 'post1.1',\n\t\t\tcreatedAt: response[0]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 4,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tlower: 'post2.1',\n\t\t\tcreatedAt: response[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 6,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tlower: 'post3.1',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\torderBy: (posts, { desc }) => [desc(posts.id)],\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(4);\n\n\texpect(response[3]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(2);\n\n\texpect(response[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 1, content: 'Post1.1', createdAt: response[3]?.posts[0]?.createdAt }, {\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2.1', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 3,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 2), eq(users.id, 3))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 2)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(2);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 3)),\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(1);\n\n\texpect(response[0]?.invitee).not.toBeNull();\n\texpect(response[0]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + custom', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + partial + custom', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; content: string }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan' },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew' },\n\t\tposts: [],\n\t});\n});\n\n/*\n\tOne two-level relation users+posts+comments\n*/\n\ntest('Get user with posts and posts with comments', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcomments: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tcontent: string;\n\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t\tcreator: number | null;\n\t\t\t\t\tpostId: number | null;\n\t\t\t\t}[];\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\t// expect(response[2]).toEqual({\n\t// \tid: 3,\n\t// \tname: 'Alex',\n\t// \tverified: false,\n\t// \tinvitedBy: null,\n\t// \tposts: [{\n\t// \t\tid: 3,\n\t// \t\townerId: 3,\n\t// \t\tcontent: 'Post3',\n\t// \t\tcreatedAt: response[2]?.posts[0]?.createdAt,\n\t// \t\tcomments: [\n\t// \t\t\t{\n\t// \t\t\t\tid: ,\n\t// \t\t\t\tcontent: 'Comment3',\n\t// \t\t\t\tcreator: 3,\n\t// \t\t\t\tpostId: 3,\n\t// \t\t\t\tcreatedAt: response[2]?.posts[0]?.comments[0]?.createdAt,\n\t// \t\t\t},\n\t// \t\t],\n\t// \t}],\n\t// });\n});\n\n// Get user with limit posts and limit comments\n\n// Get user with custom field + post + comment with custom field\n\n// Get user with limit + posts orderBy + comment orderBy\n\n// Get user with where + posts where + comment where\n\n// Get user with where + posts partial where + comment where\n\n// Get user with where + posts partial where + comment partial(false) where\n\n// Get user with where partial(false) + posts partial where partial(false) + comment partial(false+true) where\n\n// Get user with where + posts partial where + comment where. Didn't select field from where in posts\n\n// Get user with where + posts partial where + comment where. Didn't select field from where for all\n\n// Get with limit+offset in each\n\n/*\n\tOne two-level + One first-level relation users+posts+comments and users+users\n*/\n\n/*\n\tOne three-level relation users+posts+comments+comment_owner\n*/\n\ntest('Get user with posts and posts with comments and comments with owner', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tcomments: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcreator: number | null;\n\t\t\t\tpostId: number | null;\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n});\n\ntest('Get user with posts and posts with comments and comments with owner where exists', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\twhere: (table, { notExists, eq }) =>\n\t\t\tnotExists(db.select({ one: sql`1` }).from(usersTable).where(eq(sql`1`, table.id))),\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tcomments: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcreator: number | null;\n\t\t\t\tpostId: number | null;\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).eq(2);\n\texpect(response[0]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n});\n\n/*\n\tOne three-level relation + 1 first-level relatioon\n\t1. users+posts+comments+comment_owner\n\t2. users+users\n*/\n\n/*\n\tOne four-level relation users+posts+comments+coment_likes\n*/\n\n/*\n\t[Find Many] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find Many] Get users with groups', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t\torderBy: usersToGroupsTable.groupId,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: expect.arrayContaining([\n\t\t\t{\n\t\t\t\tgroup: {\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'Group2',\n\t\t\t\t\tdescription: null,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tgroup: {\n\t\t\t\t\tid: 3,\n\t\t\t\t\tname: 'Group3',\n\t\t\t\t\tdescription: null,\n\t\t\t\t},\n\t\t\t},\n\t\t]),\n\t});\n});\n\ntest('[Find Many] Get groups with users', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\tlimit: 1,\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(0);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(2);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + orderBy', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy + limit', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\n/*\n\t[Find One] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find One] Get users with groups', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find One] Get groups with users + where', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + orderBy', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy + limit', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get groups with users + orderBy + limit', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get users with groups + custom', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: {\n\t\t\t\t\t\textras: {\n\t\t\t\t\t\t\tlower: sql<string>`lower(${groupsTable.name})`.as('lower_name'),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\torderBy: usersToGroupsTable.groupId,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tlower: 'group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tlower: 'group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [\n\t\t\t{\n\t\t\t\tgroup: {\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'Group2',\n\t\t\t\t\tlower: 'group2',\n\t\t\t\t\tdescription: null,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tgroup: {\n\t\t\t\t\tid: 3,\n\t\t\t\t\tname: 'Group3',\n\t\t\t\t\tlower: 'group3',\n\t\t\t\t\tdescription: null,\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t});\n});\n\ntest('Get groups with users + custom', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\textras: (table, { sql }) => ({\n\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t}),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: {\n\t\t\t\t\t\textras: (table, { sql }) => ({\n\t\t\t\t\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tlower: 'group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tlower: 'dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tlower: 'group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tlower: 'andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tlower: 'group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get schema users - dbName & tsName match', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersV1).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tconst schemaUsers = await db.query.usersV1.findMany();\n\n\texpectTypeOf(schemaUsers).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t}[]>();\n\n\tschemaUsers.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(schemaUsers.length).eq(3);\n\texpect(schemaUsers[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n\texpect(schemaUsers[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n\texpect(schemaUsers[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n});\n\ntest('[Find Many] Get schema users - dbName & tsName mismatch', async (t) => {\n\tconst { pgjsDb: db } = t;\n\n\tawait db.insert(usersTableV1).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tconst schemaUsers = await db.query.usersTableV1.findMany();\n\n\texpectTypeOf(schemaUsers).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t}[]>();\n\n\tschemaUsers.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(schemaUsers.length).eq(3);\n\texpect(schemaUsers[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n\texpect(schemaUsers[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n\texpect(schemaUsers[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n});\n\ntest('.toSQL()', () => {\n\tconst query = db.query.usersTable.findFirst().toSQL();\n\n\texpect(query).toHaveProperty('sql', expect.any(String));\n\texpect(query).toHaveProperty('params', expect.any(Array));\n});\n\n// + custom + where + orderby\n\n// + custom + where + orderby + limit\n\n// + partial\n\n// + partial(false)\n\n// + partial + orderBy + where (all not selected)\n\n/*\n\tOne four-level relation users+posts+comments+coment_likes\n\t+ users+users_to_groups+groups\n*/\n\n/*\n\tReally hard case\n\t1. users+posts+comments+coment_likes\n\t2. users+users_to_groups+groups\n\t3. users+users\n*/\n"
  },
  {
    "path": "integration-tests/tests/relational/pg.schema.ts",
    "content": "import {\n\tboolean,\n\tinteger,\n\ttype PgColumn,\n\tpgSchema,\n\tpgTable,\n\tprimaryKey,\n\tserial,\n\ttext,\n\ttimestamp,\n} from 'drizzle-orm/pg-core';\n\nimport { relations } from 'drizzle-orm';\n\nexport const usersTable = pgTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tinvitedBy: integer('invited_by').references((): PgColumn => usersTable.id),\n});\n\nexport const schemaV1 = pgSchema('schemaV1');\n\nexport const usersV1 = schemaV1.table('usersV1', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tinvitedBy: integer('invited_by'),\n});\n\nexport const usersTableV1 = schemaV1.table('users_table_V1', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tinvitedBy: integer('invited_by'),\n});\n\nexport const usersConfig = relations(usersTable, ({ one, many }) => ({\n\tinvitee: one(usersTable, { fields: [usersTable.invitedBy], references: [usersTable.id] }),\n\tusersToGroups: many(usersToGroupsTable),\n\tposts: many(postsTable),\n}));\n\nexport const groupsTable = pgTable('groups', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tdescription: text('description'),\n});\n\nexport const groupsConfig = relations(groupsTable, ({ many }) => ({\n\tusersToGroups: many(usersToGroupsTable),\n}));\n\nexport const usersToGroupsTable = pgTable('users_to_groups', {\n\tid: serial('id').primaryKey(),\n\tuserId: integer('user_id').notNull().references(() => usersTable.id),\n\tgroupId: integer('group_id').notNull().references(() => groupsTable.id),\n}, (t) => ({\n\tpk: primaryKey(t.groupId, t.userId),\n}));\n\nexport const usersToGroupsConfig = relations(usersToGroupsTable, ({ one }) => ({\n\tgroup: one(groupsTable, { fields: [usersToGroupsTable.groupId], references: [groupsTable.id] }),\n\tuser: one(usersTable, { fields: [usersToGroupsTable.userId], references: [usersTable.id] }),\n}));\n\nexport const postsTable = pgTable('posts', {\n\tid: serial('id').primaryKey(),\n\tcontent: text('content').notNull(),\n\townerId: integer('owner_id').references(() => usersTable.id),\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n});\n\nexport const postsConfig = relations(postsTable, ({ one, many }) => ({\n\tauthor: one(usersTable, { fields: [postsTable.ownerId], references: [usersTable.id] }),\n\tcomments: many(commentsTable),\n}));\n\nexport const commentsTable = pgTable('comments', {\n\tid: serial('id').primaryKey(),\n\tcontent: text('content').notNull(),\n\tcreator: integer('creator').references(() => usersTable.id),\n\tpostId: integer('post_id').references(() => postsTable.id),\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n});\n\nexport const commentsConfig = relations(commentsTable, ({ one, many }) => ({\n\tpost: one(postsTable, { fields: [commentsTable.postId], references: [postsTable.id] }),\n\tauthor: one(usersTable, { fields: [commentsTable.creator], references: [usersTable.id] }),\n\tlikes: many(commentLikesTable),\n}));\n\nexport const commentLikesTable = pgTable('comment_likes', {\n\tid: serial('id').primaryKey(),\n\tcreator: integer('creator').references(() => usersTable.id),\n\tcommentId: integer('comment_id').references(() => commentsTable.id),\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n});\n\nexport const commentLikesConfig = relations(commentLikesTable, ({ one }) => ({\n\tcomment: one(commentsTable, { fields: [commentLikesTable.commentId], references: [commentsTable.id] }),\n\tauthor: one(usersTable, { fields: [commentLikesTable.creator], references: [usersTable.id] }),\n}));\n"
  },
  {
    "path": "integration-tests/tests/relational/pg.test.ts",
    "content": "import 'dotenv/config';\nimport Docker from 'dockerode';\nimport { desc, DrizzleError, eq, gt, gte, or, placeholder, sql, TransactionRollbackError } from 'drizzle-orm';\nimport { drizzle, type NodePgDatabase } from 'drizzle-orm/node-postgres';\nimport getPort from 'get-port';\nimport pg from 'pg';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\nimport * as schema from './pg.schema.ts';\n\nconst { Client } = pg;\n\nconst { usersTable, postsTable, commentsTable, usersToGroupsTable, groupsTable, usersV1, usersTableV1 } = schema;\n\nconst ENABLE_LOGGING = false;\n\n/*\n\tTest cases:\n\t- querying nested relation without PK with additional fields\n*/\n\ndeclare module 'vitest' {\n\texport interface TestContext {\n\t\tdocker: Docker;\n\t\tpgContainer: Docker.Container;\n\t\tpgDb: NodePgDatabase<typeof schema>;\n\t\tpgClient: pg.Client;\n\t}\n}\n\nlet globalDocker: Docker;\nlet pgContainer: Docker.Container;\nlet db: NodePgDatabase<typeof schema>;\nlet client: pg.Client;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = (globalDocker = new Docker());\n\tconst port = await getPort({ port: 5432 });\n\tconst image = 'postgres:14';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tpgContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: [\n\t\t\t'POSTGRES_PASSWORD=postgres',\n\t\t\t'POSTGRES_USER=postgres',\n\t\t\t'POSTGRES_DB=postgres',\n\t\t],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5432/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait pgContainer.start();\n\n\treturn `postgres://postgres:postgres@localhost:${port}/postgres`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['PG_CONNECTION_STRING'] ?? (await createDockerDB());\n\n\tconst sleep = 250;\n\tlet timeLeft = 5000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = new Client(connectionString);\n\t\t\tawait client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to Postgres');\n\t\tawait client?.end().catch(console.error);\n\t\tawait pgContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\tdb = drizzle(client, { schema, logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait pgContainer?.stop().catch(console.error);\n});\n\nbeforeEach(async (ctx) => {\n\tctx.pgDb = db;\n\tctx.pgClient = client;\n\tctx.docker = globalDocker;\n\tctx.pgContainer = pgContainer;\n\n\tawait ctx.pgDb.execute(sql`drop schema public cascade`);\n\tawait ctx.pgDb.execute(sql`drop schema if exists \"schemaV1\" cascade`);\n\tawait ctx.pgDb.execute(sql`create schema public`);\n\tawait ctx.pgDb.execute(sql`create schema \"schemaV1\"`);\n\tawait ctx.pgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \"users\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"name\" text NOT NULL,\n\t\t\t\t\"verified\" boolean DEFAULT false NOT NULL,\n\t\t\t\t\"invited_by\" int REFERENCES \"users\"(\"id\")\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \"schemaV1\".\"usersV1\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"name\" text NOT NULL,\n\t\t\t\t\"verified\" boolean DEFAULT false NOT NULL,\n\t\t\t\t\"invited_by\" int\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \"schemaV1\".\"users_table_V1\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"name\" text NOT NULL,\n\t\t\t\t\"verified\" boolean DEFAULT false NOT NULL,\n\t\t\t\t\"invited_by\" int\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"groups\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"name\" text NOT NULL,\n\t\t\t\t\"description\" text\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"users_to_groups\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"user_id\" int REFERENCES \"users\"(\"id\"),\n\t\t\t\t\"group_id\" int REFERENCES \"groups\"(\"id\")\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"posts\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"content\" text NOT NULL,\n\t\t\t\t\"owner_id\" int REFERENCES \"users\"(\"id\"),\n\t\t\t\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"comments\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"content\" text NOT NULL,\n\t\t\t\t\"creator\" int REFERENCES \"users\"(\"id\"),\n\t\t\t\t\"post_id\" int REFERENCES \"posts\"(\"id\"),\n\t\t\t\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.pgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"comment_likes\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"creator\" int REFERENCES \"users\"(\"id\"),\n\t\t\t\t\"comment_id\" int REFERENCES \"comments\"(\"id\"),\n\t\t\t\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n});\n\n/*\n\t[Find Many] One relation users+posts\n*/\n\ntest('[Find Many] Get users with posts', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts and users', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tlowerName: 'dan',\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.2',\n\t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n\t\t}, { id: 3, ownerId: 1, content: 'Post1.3', createdAt: usersWithPosts[0]?.posts[2]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlowerName: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 5,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlowerName: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields + limits', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + orderBy', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(2);\n\texpect(usersWithPosts[1]?.posts.length).eq(2);\n\texpect(usersWithPosts[2]?.posts.length).eq(3);\n\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 3, ownerId: 1, content: '3', createdAt: usersWithPosts[2]?.posts[2]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: '2',\n\t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n\t\t}, { id: 1, ownerId: 1, content: '1', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 2,\n\t\t\tcontent: '5',\n\t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n\t\t}, { id: 4, ownerId: 2, content: '4', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: '7',\n\t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n\t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial. Did not select posts id, but used it in where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(true + false)', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tposts: {\n\t\t\tid: number;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(false)', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in transaction', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.insert(usersTable).values([\n\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t{ id: 3, name: 'Alex' },\n\t\t]);\n\n\t\tawait tx.insert(postsTable).values([\n\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t]);\n\n\t\tusersWithPosts = await tx.query.usersTable.findMany({\n\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in rollbacked transaction', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\tawait expect(db.transaction(async (tx) => {\n\t\tawait tx.insert(usersTable).values([\n\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t{ id: 3, name: 'Alex' },\n\t\t]);\n\n\t\tawait tx.insert(postsTable).values([\n\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t]);\n\n\t\ttx.rollback();\n\n\t\tusersWithPosts = await tx.query.usersTable.findMany({\n\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t})).rejects.toThrowError(new TransactionRollbackError());\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(0);\n});\n\n// select only custom\ntest('[Find Many] Get only custom fields', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1' }, {\n\t\t\tlowerName: 'post1.2',\n\t\t}, { lowerName: 'post1.3' }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'andrew',\n\t\tposts: [{ lowerName: 'post2' }, {\n\t\t\tlowerName: 'post2.1',\n\t\t}],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'alex',\n\t\tposts: [{ lowerName: 'post3' }, {\n\t\t\tlowerName: 'post3.1',\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + limit', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + orderBy', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// select only custom find one\ntest('[Find One] Get only custom fields', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(3);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1' }, {\n\t\t\tlowerName: 'post1.2',\n\t\t}, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tcontentLower: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tcontentLower: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ contentLower: 'post1.2' }, { contentLower: 'post1.3' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + limit', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + orderBy', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// columns {}\ntest('[Find Many] Get select {}', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findMany({\n\t\t\tcolumns: {},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// columns {}\ntest('[Find One] Get select {}', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findFirst({\n\t\t\tcolumns: {},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// deep select {}\ntest('[Find Many] Get deep select {}', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findMany({\n\t\t\tcolumns: {},\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\tcolumns: {},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// deep select {}\ntest('[Find One] Get deep select {}', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findFirst({\n\t\t\tcolumns: {},\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\tcolumns: {},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n/*\n\tPrepared statements for users+posts\n*/\ntest('[Find Many] Get users with posts + prepared limit', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('limit'),\n\t\t\t},\n\t\t},\n\t}).prepare('query1');\n\n\tconst usersWithPosts = await prepared.execute({ limit: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared limit + offset', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare('query2');\n\n\tconst usersWithPosts = await prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, placeholder('id'))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t}).prepare('query3');\n\n\tconst usersWithPosts = await prepared.execute({ id: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared + limit + offset + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twhere: (({ id }, { eq, or }) => or(eq(id, placeholder('id')), eq(id, 3))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, placeholder('pid'))),\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare('query4');\n\n\tconst usersWithPosts = await prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1, id: 2, pid: 6 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\t[Find One] One relation users+posts\n*/\n\ntest('[Find One] Get users with posts', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + limit posts', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts no results found', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts).toBeUndefined();\n});\n\ntest('[Find One] Get users with posts + limit posts and users', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(3);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tlowerName: 'dan',\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.2',\n\t\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t\t}, { id: 3, ownerId: 1, content: 'Post1.3', createdAt: usersWithPosts?.posts[2]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields + limits', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + orderBy', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: '7',\n\t\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial. Did not select posts id, but used it in where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(true + false)', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(false)', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\tOne relation users+users. Self referencing\n*/\n\ntest('Get user with invitee', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user + limit with invitee', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew', invitedBy: 1 },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t\tlimit: 2,\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields + limits', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(3);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + order by', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[3]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where + partial', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial.  Did not select users id, but used it in where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(true+false)', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t\tverified: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(false)', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tname: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, verified: false, invitedBy: null },\n\t});\n});\n\n/*\n\tTwo first-level relations users+users and users+posts\n*/\n\ntest('Get user with invitee and posts', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + limits + custom fields in each', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_invitee_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_content') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + custom fields in each', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(2);\n\texpect(response[1]?.posts.length).eq(2);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.1',\n\t\t\tlower: 'post1.1',\n\t\t\tcreatedAt: response[0]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 4,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tlower: 'post2.1',\n\t\t\tcreatedAt: response[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 6,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tlower: 'post3.1',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\torderBy: (posts, { desc }) => [desc(posts.id)],\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(4);\n\n\texpect(response[3]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(2);\n\n\texpect(response[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 1, content: 'Post1.1', createdAt: response[3]?.posts[0]?.createdAt }, {\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2.1', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 3,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 2), eq(users.id, 3))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 2)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(2);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 3)),\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(1);\n\n\texpect(response[0]?.invitee).not.toBeNull();\n\texpect(response[0]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + custom', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + partial + custom', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; content: string }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan' },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew' },\n\t\tposts: [],\n\t});\n});\n\n/*\n\tOne two-level relation users+posts+comments\n*/\n\ntest('Get user with posts and posts with comments', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcomments: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tcontent: string;\n\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t\tcreator: number | null;\n\t\t\t\t\tpostId: number | null;\n\t\t\t\t}[];\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\t// expect(response[2]).toEqual({\n\t// \tid: 3,\n\t// \tname: 'Alex',\n\t// \tverified: false,\n\t// \tinvitedBy: null,\n\t// \tposts: [{\n\t// \t\tid: 3,\n\t// \t\townerId: 3,\n\t// \t\tcontent: 'Post3',\n\t// \t\tcreatedAt: response[2]?.posts[0]?.createdAt,\n\t// \t\tcomments: [\n\t// \t\t\t{\n\t// \t\t\t\tid: ,\n\t// \t\t\t\tcontent: 'Comment3',\n\t// \t\t\t\tcreator: 3,\n\t// \t\t\t\tpostId: 3,\n\t// \t\t\t\tcreatedAt: response[2]?.posts[0]?.comments[0]?.createdAt,\n\t// \t\t\t},\n\t// \t\t],\n\t// \t}],\n\t// });\n});\n\n// Get user with limit posts and limit comments\n\n// Get user with custom field + post + comment with custom field\n\n// Get user with limit + posts orderBy + comment orderBy\n\n// Get user with where + posts where + comment where\n\n// Get user with where + posts partial where + comment where\n\n// Get user with where + posts partial where + comment partial(false) where\n\n// Get user with where partial(false) + posts partial where partial(false) + comment partial(false+true) where\n\n// Get user with where + posts partial where + comment where. Didn't select field from where in posts\n\n// Get user with where + posts partial where + comment where. Didn't select field from where for all\n\n// Get with limit+offset in each\n\n/*\n\tOne two-level + One first-level relation users+posts+comments and users+users\n*/\n\n/*\n\tOne three-level relation users+posts+comments+comment_owner\n*/\n\ntest('Get user with posts and posts with comments and comments with owner', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tcomments: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcreator: number | null;\n\t\t\t\tpostId: number | null;\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n});\n\ntest('Get user with posts and posts with comments and comments with owner where exists', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\twhere: (table, { exists, eq }) => exists(db.select({ one: sql`1` }).from(usersTable).where(eq(sql`1`, table.id))),\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tcomments: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcreator: number | null;\n\t\t\t\tpostId: number | null;\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).eq(1);\n\texpect(response[0]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n});\n\n/*\n\tOne three-level relation + 1 first-level relation\n\t1. users+posts+comments+comment_owner\n\t2. users+users\n*/\n\n/*\n\tOne four-level relation users+posts+comments+comment_likes\n*/\n\n/*\n\t[Find Many] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find Many] Get users with groups', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t\torderBy: usersToGroupsTable.userId,\n\t\t\t},\n\t\t},\n\t\torderBy: usersTable.id,\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: expect.arrayContaining([\n\t\t\t{\n\t\t\t\tgroup: {\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'Group2',\n\t\t\t\t\tdescription: null,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tgroup: {\n\t\t\t\t\tid: 3,\n\t\t\t\t\tname: 'Group3',\n\t\t\t\t\tdescription: null,\n\t\t\t\t},\n\t\t\t},\n\t\t]),\n\t});\n});\n\ntest('[Find Many] Get groups with users', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\tlimit: 1,\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(0);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(2);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + orderBy', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy + limit', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\n/*\n\t[Find One] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find One] Get users with groups', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find One] Get groups with users + where', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + orderBy', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy + limit', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get groups with users + orderBy + limit', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get users with groups + custom', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: {\n\t\t\t\t\t\textras: {\n\t\t\t\t\t\t\tlower: sql<string>`lower(${groupsTable.name})`.as('lower_name'),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\torderBy: usersToGroupsTable.groupId,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tlower: 'group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tlower: 'group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [\n\t\t\t{\n\t\t\t\tgroup: {\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'Group2',\n\t\t\t\t\tlower: 'group2',\n\t\t\t\t\tdescription: null,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tgroup: {\n\t\t\t\t\tid: 3,\n\t\t\t\t\tname: 'Group3',\n\t\t\t\t\tlower: 'group3',\n\t\t\t\t\tdescription: null,\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t});\n});\n\ntest('Get groups with users + custom', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\textras: (table, { sql }) => ({\n\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t}),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: {\n\t\t\t\t\t\textras: (table, { sql }) => ({\n\t\t\t\t\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tlower: 'group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tlower: 'dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tlower: 'group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tlower: 'andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tlower: 'group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Filter by columns not present in select', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t},\n\t\twhere: eq(usersTable.name, 'Dan'),\n\t});\n\n\texpect(response).toEqual({ id: 1 });\n});\n\ntest('[Find Many] Get schema users - dbName & tsName match', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersV1).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tconst schemaUsers = await db.query.usersV1.findMany();\n\n\texpectTypeOf(schemaUsers).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t}[]>();\n\n\tschemaUsers.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(schemaUsers.length).eq(3);\n\texpect(schemaUsers[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n\texpect(schemaUsers[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n\texpect(schemaUsers[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n});\n\ntest('[Find Many] Get schema users - dbName & tsName mismatch', async (t) => {\n\tconst { pgDb: db } = t;\n\n\tawait db.insert(usersTableV1).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tconst schemaUsers = await db.query.usersTableV1.findMany();\n\n\texpectTypeOf(schemaUsers).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t}[]>();\n\n\tschemaUsers.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(schemaUsers.length).eq(3);\n\texpect(schemaUsers[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n\texpect(schemaUsers[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n\texpect(schemaUsers[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t});\n});\n\ntest('.toSQL()', () => {\n\tconst query = db.query.usersTable.findFirst().toSQL();\n\n\texpect(query).toHaveProperty('sql', expect.any(String));\n\texpect(query).toHaveProperty('params', expect.any(Array));\n});\n\n// test('Filter by relational column', async (t) => {\n// \tconst { pgDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ id: 1, ownerId: 1, content: 'Content1' },\n// \t\t{ id: 2, ownerId: 2, content: 'Post2' },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\twith: {\n// \t\t\tposts: true,\n// \t\t},\n// \t\twhere: (users) => sql`json_array_length(${users.posts}) > 0`,\n// \t\torderBy: usersTable.id,\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(response.length).toEqual(2);\n\n// \texpect(response[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{\n// \t\t\tid: 1,\n// \t\t\tcontent: 'Content1',\n// \t\t\townerId: 1,\n// \t\t\tcreatedAt: expect.any(Date),\n// \t\t}],\n// \t});\n\n// \texpect(response[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{\n// \t\t\tid: 2,\n// \t\t\tcontent: 'Post2',\n// \t\t\townerId: 2,\n// \t\t\tcreatedAt: expect.any(Date),\n// \t\t}],\n// \t});\n// });\n\n// + custom + where + orderby\n\n// + custom + where + orderby + limit\n\n// + partial\n\n// + partial(false)\n\n// + partial + orderBy + where (all not selected)\n\n/*\n\tOne four-level relation users+posts+comments+coment_likes\n\t+ users+users_to_groups+groups\n*/\n\n/*\n\tReally hard case\n\t1. users+posts+comments+coment_likes\n\t2. users+users_to_groups+groups\n\t3. users+users\n*/\n"
  },
  {
    "path": "integration-tests/tests/relational/singlestore.schema.ts",
    "content": "import { bigint, boolean, primaryKey, serial, singlestoreTable, text, timestamp } from 'drizzle-orm/singlestore-core';\n\nimport { relations } from 'drizzle-orm';\n\nexport const usersTable = singlestoreTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tinvitedBy: bigint('invited_by', { mode: 'number' }),\n});\nexport const usersConfig = relations(usersTable, ({ one, many }) => ({\n\tinvitee: one(usersTable, {\n\t\tfields: [usersTable.invitedBy],\n\t\treferences: [usersTable.id],\n\t}),\n\tusersToGroups: many(usersToGroupsTable),\n\tposts: many(postsTable),\n\tcomments: many(commentsTable),\n}));\n\nexport const groupsTable = singlestoreTable('groups', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tdescription: text('description'),\n});\nexport const groupsConfig = relations(groupsTable, ({ many }) => ({\n\tusersToGroups: many(usersToGroupsTable),\n}));\n\nexport const usersToGroupsTable = singlestoreTable(\n\t'users_to_groups',\n\t{\n\t\tid: serial('id').primaryKey(),\n\t\tuserId: bigint('user_id', { mode: 'number' }).notNull(),\n\t\tgroupId: bigint('group_id', { mode: 'number' }).notNull(),\n\t},\n\t(t) => ({\n\t\tpk: primaryKey(t.userId, t.groupId),\n\t}),\n);\nexport const usersToGroupsConfig = relations(usersToGroupsTable, ({ one }) => ({\n\tgroup: one(groupsTable, {\n\t\tfields: [usersToGroupsTable.groupId],\n\t\treferences: [groupsTable.id],\n\t}),\n\tuser: one(usersTable, {\n\t\tfields: [usersToGroupsTable.userId],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n\nexport const postsTable = singlestoreTable('posts', {\n\tid: serial('id').primaryKey(),\n\tcontent: text('content').notNull(),\n\townerId: bigint('owner_id', { mode: 'number' }),\n\tcreatedAt: timestamp('created_at')\n\t\t.notNull()\n\t\t.defaultNow(),\n});\nexport const postsConfig = relations(postsTable, ({ one, many }) => ({\n\tauthor: one(usersTable, {\n\t\tfields: [postsTable.ownerId],\n\t\treferences: [usersTable.id],\n\t}),\n\tcomments: many(commentsTable),\n}));\n\nexport const commentsTable = singlestoreTable('comments', {\n\tid: serial('id').primaryKey(),\n\tcontent: text('content').notNull(),\n\tcreator: bigint('creator', { mode: 'number' }),\n\tpostId: bigint('post_id', { mode: 'number' }),\n\tcreatedAt: timestamp('created_at')\n\t\t.notNull()\n\t\t.defaultNow(),\n});\nexport const commentsConfig = relations(commentsTable, ({ one, many }) => ({\n\tpost: one(postsTable, {\n\t\tfields: [commentsTable.postId],\n\t\treferences: [postsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentsTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n\tlikes: many(commentLikesTable),\n}));\n\nexport const commentLikesTable = singlestoreTable('comment_likes', {\n\tid: serial('id').primaryKey(),\n\tcreator: bigint('creator', { mode: 'number' }),\n\tcommentId: bigint('comment_id', { mode: 'number' }),\n\tcreatedAt: timestamp('created_at')\n\t\t.notNull()\n\t\t.defaultNow(),\n});\nexport const commentLikesConfig = relations(commentLikesTable, ({ one }) => ({\n\tcomment: one(commentsTable, {\n\t\tfields: [commentLikesTable.commentId],\n\t\treferences: [commentsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentLikesTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n"
  },
  {
    "path": "integration-tests/tests/relational/singlestore.test.ts",
    "content": "// import retry from 'async-retry';\n// import Docker from 'dockerode';\n// import 'dotenv/config';\n// import { desc, DrizzleError, eq, gt, gte, or, placeholder, sql, TransactionRollbackError } from 'drizzle-orm';\n// import { drizzle, type SingleStoreDriverDatabase } from 'drizzle-orm/singlestore';\n// import getPort from 'get-port';\n// import * as mysql from 'mysql2/promise';\n// import { v4 as uuid } from 'uuid';\n// import { afterAll, beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\n// import * as schema from './singlestore.schema.ts';\n\n// const { usersTable, postsTable, commentsTable, usersToGroupsTable, groupsTable } = schema;\n\n// const ENABLE_LOGGING = false;\n\n// /*\n// \tTest cases:\n// \t- querying nested relation without PK with additional fields\n// */\n\n// declare module 'vitest' {\n// \texport interface TestContext {\n// \t\tdocker: Docker;\n// \t\tsinglestoreContainer: Docker.Container;\n// \t\tsinglestoreDb: SingleStoreDriverDatabase<typeof schema>;\n// \t\tsinglestoreClient: mysql.Connection;\n// \t}\n// }\n\n// let globalDocker: Docker;\n// let singlestoreContainer: Docker.Container;\n// let db: SingleStoreDriverDatabase<typeof schema>;\n// let client: mysql.Connection;\n\n// async function createDockerDB(): Promise<string> {\n// \tconst docker = new Docker();\n// \tconst port = await getPort({ port: 3306 });\n// \tconst image = 'ghcr.io/singlestore-labs/singlestoredb-dev:latest';\n\n// \tconst pullStream = await docker.pull(image);\n// \tawait new Promise((resolve, reject) =>\n// \t\tdocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n// \t);\n\n// \tsinglestoreContainer = await docker.createContainer({\n// \t\tImage: image,\n// \t\tEnv: ['ROOT_PASSWORD=singlestore'],\n// \t\tname: `drizzle-integration-tests-${uuid()}`,\n// \t\tHostConfig: {\n// \t\t\tAutoRemove: true,\n// \t\t\tPortBindings: {\n// \t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \tawait singlestoreContainer.start();\n// \tawait new Promise((resolve) => setTimeout(resolve, 4000));\n\n// \treturn `singlestore://root:singlestore@localhost:${port}/`;\n// }\n\n// beforeAll(async () => {\n// \tconst connectionString = process.env['SINGLESTORE_CONNECTION_STRING'] ?? (await createDockerDB());\n// \tclient = await retry(async () => {\n// \t\tclient = await mysql.createConnection(connectionString);\n// \t\tawait client.connect();\n// \t\treturn client;\n// \t}, {\n// \t\tretries: 20,\n// \t\tfactor: 1,\n// \t\tminTimeout: 250,\n// \t\tmaxTimeout: 250,\n// \t\trandomize: false,\n// \t\tonRetry() {\n// \t\t\tclient?.end();\n// \t\t},\n// \t});\n\n// \tawait client.query(`CREATE DATABASE IF NOT EXISTS drizzle;`);\n// \tawait client.changeUser({ database: 'drizzle' });\n// \tdb = drizzle(client, { schema, logger: ENABLE_LOGGING });\n// });\n\n// afterAll(async () => {\n// \tawait client?.end().catch(console.error);\n// \tawait singlestoreContainer?.stop().catch(console.error);\n// });\n\n// beforeEach(async (ctx) => {\n// \tctx.singlestoreDb = db;\n// \tctx.singlestoreClient = client;\n// \tctx.docker = globalDocker;\n// \tctx.singlestoreContainer = singlestoreContainer;\n\n// \tawait ctx.singlestoreDb.execute(sql`drop table if exists \\`users\\``);\n// \tawait ctx.singlestoreDb.execute(sql`drop table if exists \\`groups\\``);\n// \tawait ctx.singlestoreDb.execute(sql`drop table if exists \\`users_to_groups\\``);\n// \tawait ctx.singlestoreDb.execute(sql`drop table if exists \\`posts\\``);\n// \tawait ctx.singlestoreDb.execute(sql`drop table if exists \\`comments\\``);\n// \tawait ctx.singlestoreDb.execute(sql`drop table if exists \\`comment_likes\\``);\n\n// \tawait ctx.singlestoreDb.execute(\n// \t\tsql`\n// \t\t\tCREATE TABLE \\`users\\` (\n// \t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n// \t\t\t\t\\`name\\` text NOT NULL,\n// \t\t\t\t\\`verified\\` boolean DEFAULT false NOT NULL,\n// \t\t\t\t\\`invited_by\\` bigint\n// \t\t\t);\n// \t\t`,\n// \t);\n// \tawait ctx.singlestoreDb.execute(\n// \t\tsql`\n// \t\t\tCREATE TABLE \\`groups\\` (\n// \t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n// \t\t\t\t\\`name\\` text NOT NULL,\n// \t\t\t\t\\`description\\` text\n// \t\t\t);\n// \t\t`,\n// \t);\n// \tawait ctx.singlestoreDb.execute(\n// \t\tsql`\n// \t\t\tCREATE TABLE \\`users_to_groups\\` (\n// \t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n// \t\t\t\t\\`user_id\\` bigint,\n// \t\t\t\t\\`group_id\\` bigint\n// \t\t\t);\n// \t\t`,\n// \t);\n// \tawait ctx.singlestoreDb.execute(\n// \t\tsql`\n// \t\t\tCREATE TABLE \\`posts\\` (\n// \t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n// \t\t\t\t\\`content\\` text NOT NULL,\n// \t\t\t\t\\`owner_id\\` bigint,\n// \t\t\t\t\\`created_at\\` timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL\n// \t\t\t);\n// \t\t`,\n// \t);\n// \tawait ctx.singlestoreDb.execute(\n// \t\tsql`\n// \t\t\tCREATE TABLE \\`comments\\` (\n// \t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n// \t\t\t\t\\`content\\` text NOT NULL,\n// \t\t\t\t\\`creator\\` bigint,\n// \t\t\t\t\\`post_id\\` bigint,\n// \t\t\t\t\\`created_at\\` timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL\n// \t\t\t);\n// \t\t`,\n// \t);\n// \tawait ctx.singlestoreDb.execute(\n// \t\tsql`\n// \t\t\tCREATE TABLE \\`comment_likes\\` (\n// \t\t\t\t\\`id\\` serial PRIMARY KEY NOT NULL,\n// \t\t\t\t\\`creator\\` bigint,\n// \t\t\t\t\\`comment_id\\` bigint,\n// \t\t\t\t\\`created_at\\` timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL\n// \t\t\t);\n// \t\t`,\n// \t);\n// });\n\n// /*\n// \t[Find Many] One relation users+posts\n// */\n\n// test('[Find Many] Get users with posts', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\twith: {\n// \t\t\tposts: true,\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(usersWithPosts.length).eq(3);\n// \texpect(usersWithPosts[0]?.posts.length).eq(1);\n// \texpect(usersWithPosts[1]?.posts.length).eq(1);\n// \texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n// \texpect(usersWithPosts[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(usersWithPosts[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(usersWithPosts[2]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test.skip('[Find Many] Get users with posts + limit posts', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tlimit: 1,\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n// \tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n// \tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n// \tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(usersWithPosts.length).eq(3);\n// \texpect(usersWithPosts[0]?.posts.length).eq(1);\n// \texpect(usersWithPosts[1]?.posts.length).eq(1);\n// \texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n// \texpect(usersWithPosts[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(usersWithPosts[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(usersWithPosts[2]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test.skip('[Find Many] Get users with posts + limit posts and users', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\tlimit: 2,\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tlimit: 1,\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n// \tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n// \tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(usersWithPosts.length).eq(2);\n// \texpect(usersWithPosts[0]?.posts.length).eq(1);\n// \texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n// \texpect(usersWithPosts[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(usersWithPosts[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test('[Find Many] Get users with posts + custom fields', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\twith: {\n// \t\t\tposts: true,\n// \t\t},\n// \t\textras: ({ name }) => ({\n// \t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n// \t\t}),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tlowerName: string;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n// \tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n// \tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n// \tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(usersWithPosts.length).toEqual(3);\n// \texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n// \texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n// \texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n// \texpect(usersWithPosts[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tlowerName: 'dan',\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }, {\n// \t\t\tid: 2,\n// \t\t\townerId: 1,\n// \t\t\tcontent: 'Post1.2',\n// \t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n// \t\t}, { id: 3, ownerId: 1, content: 'Post1.3', createdAt: usersWithPosts[0]?.posts[2]?.createdAt }],\n// \t});\n// \texpect(usersWithPosts[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tlowerName: 'andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }, {\n// \t\t\tid: 5,\n// \t\t\townerId: 2,\n// \t\t\tcontent: 'Post2.1',\n// \t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n// \t\t}],\n// \t});\n// \texpect(usersWithPosts[2]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tlowerName: 'alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }, {\n// \t\t\tid: 7,\n// \t\t\townerId: 3,\n// \t\t\tcontent: 'Post3.1',\n// \t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find Many] Get users with posts + custom fields + limits', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\tlimit: 1,\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tlimit: 1,\n// \t\t\t},\n// \t\t},\n// \t\textras: (usersTable, { sql }) => ({\n// \t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n// \t\t}),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tlowerName: string;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).toEqual(1);\n// \texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n// \texpect(usersWithPosts[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tlowerName: 'dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test.skip('[Find Many] Get users with posts + orderBy', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: '1' },\n// \t\t{ ownerId: 1, content: '2' },\n// \t\t{ ownerId: 1, content: '3' },\n// \t\t{ ownerId: 2, content: '4' },\n// \t\t{ ownerId: 2, content: '5' },\n// \t\t{ ownerId: 3, content: '6' },\n// \t\t{ ownerId: 3, content: '7' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n// \t\t\t},\n// \t\t},\n// \t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).eq(3);\n// \texpect(usersWithPosts[0]?.posts.length).eq(2);\n// \texpect(usersWithPosts[1]?.posts.length).eq(2);\n// \texpect(usersWithPosts[2]?.posts.length).eq(3);\n\n// \texpect(usersWithPosts[2]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 3, ownerId: 1, content: '3', createdAt: usersWithPosts[2]?.posts[2]?.createdAt }, {\n// \t\t\tid: 2,\n// \t\t\townerId: 1,\n// \t\t\tcontent: '2',\n// \t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n// \t\t}, { id: 1, ownerId: 1, content: '1', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(usersWithPosts[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{\n// \t\t\tid: 5,\n// \t\t\townerId: 2,\n// \t\t\tcontent: '5',\n// \t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n// \t\t}, { id: 4, ownerId: 2, content: '4', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(usersWithPosts[0]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{\n// \t\t\tid: 7,\n// \t\t\townerId: 3,\n// \t\t\tcontent: '7',\n// \t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n// \t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test('[Find Many] Get users with posts + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).eq(1);\n// \texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n// \texpect(usersWithPosts[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test('[Find Many] Get users with posts + where + partial', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\tcolumns: {\n// \t\t\tid: true,\n// \t\t\tname: true,\n// \t\t},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tid: true,\n// \t\t\t\t\tcontent: true,\n// \t\t\t\t},\n// \t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\t},\n// \t\t},\n// \t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).eq(1);\n// \texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n// \texpect(usersWithPosts[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tposts: [{ id: 1, content: 'Post1' }],\n// \t});\n// });\n\n// test('[Find Many] Get users with posts + where + partial. Did not select posts id, but used it in where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\tcolumns: {\n// \t\t\tid: true,\n// \t\t\tname: true,\n// \t\t},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tid: true,\n// \t\t\t\t\tcontent: true,\n// \t\t\t\t},\n// \t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\t},\n// \t\t},\n// \t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).eq(1);\n// \texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n// \texpect(usersWithPosts[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tposts: [{ id: 1, content: 'Post1' }],\n// \t});\n// });\n\n// test('[Find Many] Get users with posts + where + partial(true + false)', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\tcolumns: {\n// \t\t\tid: true,\n// \t\t\tname: false,\n// \t\t},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tid: true,\n// \t\t\t\t\tcontent: false,\n// \t\t\t\t},\n// \t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\t},\n// \t\t},\n// \t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).eq(1);\n// \texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n// \texpect(usersWithPosts[0]).toEqual({\n// \t\tid: 1,\n// \t\tposts: [{ id: 1 }],\n// \t});\n// });\n\n// test('[Find Many] Get users with posts + where + partial(false)', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\tcolumns: {\n// \t\t\tname: false,\n// \t\t},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tcontent: false,\n// \t\t\t\t},\n// \t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\t},\n// \t\t},\n// \t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).eq(1);\n// \texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n// \texpect(usersWithPosts[0]).toEqual({\n// \t\tid: 1,\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test('[Find Many] Get users with posts in transaction', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tlet usersWithPosts: {\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[] = [];\n\n// \tawait db.transaction(async (tx) => {\n// \t\tawait tx.insert(usersTable).values([\n// \t\t\t{ id: 1, name: 'Dan' },\n// \t\t\t{ id: 2, name: 'Andrew' },\n// \t\t\t{ id: 3, name: 'Alex' },\n// \t\t]);\n\n// \t\tawait tx.insert(postsTable).values([\n// \t\t\t{ ownerId: 1, content: 'Post1' },\n// \t\t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t\t{ ownerId: 2, content: 'Post2' },\n// \t\t\t{ ownerId: 3, content: 'Post3' },\n// \t\t]);\n\n// \t\tusersWithPosts = await tx.query.usersTable.findMany({\n// \t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\twith: {\n// \t\t\t\tposts: {\n// \t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\t\t},\n// \t\t\t},\n// \t\t});\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).eq(1);\n// \texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n// \texpect(usersWithPosts[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test('[Find Many] Get users with posts in rollbacked transaction', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tlet usersWithPosts: {\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[] = [];\n\n// \tawait expect(db.transaction(async (tx) => {\n// \t\tawait tx.insert(usersTable).values([\n// \t\t\t{ id: 1, name: 'Dan' },\n// \t\t\t{ id: 2, name: 'Andrew' },\n// \t\t\t{ id: 3, name: 'Alex' },\n// \t\t]);\n\n// \t\tawait tx.insert(postsTable).values([\n// \t\t\t{ ownerId: 1, content: 'Post1' },\n// \t\t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t\t{ ownerId: 2, content: 'Post2' },\n// \t\t\t{ ownerId: 3, content: 'Post3' },\n// \t\t]);\n\n// \t\ttx.rollback();\n\n// \t\tusersWithPosts = await tx.query.usersTable.findMany({\n// \t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\twith: {\n// \t\t\t\tposts: {\n// \t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\t\t},\n// \t\t\t},\n// \t\t});\n// \t})).rejects.toThrowError(new TransactionRollbackError());\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).eq(0);\n// });\n\n// // select only custom\n// test('[Find Many] Get only custom fields', async () => {\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ id: 1, ownerId: 1, content: 'Post1' },\n// \t\t{ id: 2, ownerId: 1, content: 'Post1.2' },\n// \t\t{ id: 3, ownerId: 1, content: 'Post1.3' },\n// \t\t{ id: 4, ownerId: 2, content: 'Post2' },\n// \t\t{ id: 5, ownerId: 2, content: 'Post2.1' },\n// \t\t{ id: 6, ownerId: 3, content: 'Post3' },\n// \t\t{ id: 7, ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\tcolumns: {},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\textras: ({ content }) => ({\n// \t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n// \t\t\t\t}),\n// \t\t\t},\n// \t\t},\n// \t\textras: ({ name }) => ({\n// \t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n// \t\t}),\n// \t});\n\n// \t// Type Assertion\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tlowerName: string;\n// \t\tposts: {\n// \t\t\tlowerName: string;\n// \t\t}[];\n// \t}[]>();\n\n// \t// General Assertions\n// \texpect(usersWithPosts).toHaveLength(3);\n\n// \t// Helper function to find user by lowerName\n// \tconst findUser = (lowerName: string) => usersWithPosts.find((user) => user.lowerName === lowerName);\n\n// \t// Assertions for each user\n// \tconst dan = findUser('dan');\n// \tconst andrew = findUser('andrew');\n// \tconst alex = findUser('alex');\n\n// \texpect(dan).toBeDefined();\n// \texpect(andrew).toBeDefined();\n// \texpect(alex).toBeDefined();\n\n// \t// Verify the number of posts for each user\n// \texpect(dan?.posts).toHaveLength(3);\n// \texpect(andrew?.posts).toHaveLength(2);\n// \texpect(alex?.posts).toHaveLength(2);\n\n// \t// Define expected posts for each user\n// \tconst expectedDanPosts = ['post1', 'post1.2', 'post1.3'];\n// \tconst expectedAndrewPosts = ['post2', 'post2.1'];\n// \tconst expectedAlexPosts = ['post3', 'post3.1'];\n\n// \t// Helper function to extract lowerNames from posts\n// \tconst getPostLowerNames = (posts: { lowerName: string }[]) => posts.map((post) => post.lowerName);\n\n// \t// Assertions for Dan's posts\n// \texpect(getPostLowerNames(dan!.posts)).toEqual(expect.arrayContaining(expectedDanPosts));\n// \texpect(getPostLowerNames(dan!.posts)).toHaveLength(expectedDanPosts.length);\n\n// \t// Assertions for Andrew's posts\n// \texpect(getPostLowerNames(andrew!.posts)).toEqual(expect.arrayContaining(expectedAndrewPosts));\n// \texpect(getPostLowerNames(andrew!.posts)).toHaveLength(expectedAndrewPosts.length);\n\n// \t// Assertions for Alex's posts\n// \texpect(getPostLowerNames(alex!.posts)).toEqual(expect.arrayContaining(expectedAlexPosts));\n// \texpect(getPostLowerNames(alex!.posts)).toHaveLength(expectedAlexPosts.length);\n// });\n\n// // select only custom with where clause (Order Agnostic)\n// test('[Find Many] Get only custom fields + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \t// Insert Users\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \t// Insert Posts\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \t// Query Users with Posts where users.id = 1 and posts.id >= 2\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\tcolumns: {},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\twhere: gte(postsTable.id, 2),\n// \t\t\t\textras: ({ content }) => ({\n// \t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n// \t\t\t\t}),\n// \t\t\t},\n// \t\t},\n// \t\twhere: eq(usersTable.id, 1),\n// \t\textras: ({ name }) => ({\n// \t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n// \t\t}),\n// \t});\n\n// \t// Type Assertion\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tlowerName: string;\n// \t\tposts: {\n// \t\t\tlowerName: string;\n// \t\t}[];\n// \t}[]>();\n\n// \t// General Assertions\n// \texpect(usersWithPosts).toHaveLength(1);\n\n// \t// Since we expect only one user, we can extract it directly\n// \tconst danWithPosts = usersWithPosts[0];\n\n// \t// Assert that the user exists and has the correct lowerName\n// \texpect(danWithPosts).toBeDefined();\n// \texpect(danWithPosts?.lowerName).toBe('dan');\n\n// \t// Assert that the user has the expected number of posts\n// \texpect(danWithPosts?.posts).toHaveLength(2);\n\n// \t// Define the expected posts\n// \tconst expectedPosts = ['post1.2', 'post1.3'];\n\n// \t// Extract the lowerName of each post\n// \tconst actualPostLowerNames = danWithPosts?.posts.map((post) => post.lowerName);\n\n// \t// Assert that all expected posts are present, regardless of order\n// \tfor (const expectedPost of expectedPosts) {\n// \t\texpect(actualPostLowerNames).toContain(expectedPost);\n// \t}\n\n// \t// Additionally, ensure no unexpected posts are present\n// \texpect(actualPostLowerNames).toHaveLength(expectedPosts.length);\n// });\n\n// test.skip('[Find Many] Get only custom fields + where + limit', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\tcolumns: {},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\twhere: gte(postsTable.id, 2),\n// \t\t\t\tlimit: 1,\n// \t\t\t\textras: ({ content }) => ({\n// \t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n// \t\t\t\t}),\n// \t\t\t},\n// \t\t},\n// \t\twhere: eq(usersTable.id, 1),\n// \t\textras: ({ name }) => ({\n// \t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n// \t\t}),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tlowerName: string;\n// \t\tposts: {\n// \t\t\tlowerName: string;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).toEqual(1);\n// \texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n// \texpect(usersWithPosts).toContainEqual({\n// \t\tlowerName: 'dan',\n// \t\tposts: [{ lowerName: 'post1.2' }],\n// \t});\n// });\n\n// test.skip('[Find Many] Get only custom fields + where + orderBy', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findMany({\n// \t\tcolumns: {},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\twhere: gte(postsTable.id, 2),\n// \t\t\t\torderBy: [desc(postsTable.id)],\n// \t\t\t\textras: ({ content }) => ({\n// \t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n// \t\t\t\t}),\n// \t\t\t},\n// \t\t},\n// \t\twhere: eq(usersTable.id, 1),\n// \t\textras: ({ name }) => ({\n// \t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n// \t\t}),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tlowerName: string;\n// \t\tposts: {\n// \t\t\tlowerName: string;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).toEqual(1);\n// \texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n// \texpect(usersWithPosts).toContainEqual({\n// \t\tlowerName: 'dan',\n// \t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n// \t});\n// });\n\n// // select only custom find one (Order Agnostic)\n// test('[Find One] Get only custom fields (Order Agnostic)', async () => {\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \t// Query to find the first user without any specific order\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\tcolumns: {},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\textras: ({ content }) => ({\n// \t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n// \t\t\t\t}),\n// \t\t\t},\n// \t\t},\n// \t\textras: ({ name }) => ({\n// \t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n// \t\t}),\n// \t});\n\n// \t// Type Assertion\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tlowerName: string;\n// \t\t\tposts: {\n// \t\t\t\tlowerName: string;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \t// General Assertions\n// \texpect(usersWithPosts).toBeDefined();\n\n// \t// Since findFirst without orderBy can return any user, we'll verify the returned user and their posts\n// \tif (usersWithPosts) {\n// \t\t// Define expected users and their corresponding posts\n// \t\tconst expectedUsers: { [key: string]: string[] } = {\n// \t\t\tdan: ['post1', 'post1.2', 'post1.3'],\n// \t\t\tandrew: ['post2', 'post2.1'],\n// \t\t\talex: ['post3', 'post3.1'],\n// \t\t};\n\n// \t\t// Verify that the returned user is one of the expected users\n// \t\texpect(Object.keys(expectedUsers)).toContain(usersWithPosts.lowerName);\n\n// \t\t// Get the expected posts for the returned user\n// \t\tconst expectedPosts = expectedUsers[usersWithPosts.lowerName] as string[];\n\n// \t\t// Verify the number of posts\n// \t\texpect(usersWithPosts.posts).toHaveLength(expectedPosts.length);\n\n// \t\t// Extract the lowerName of each post\n// \t\tconst actualPostLowerNames = usersWithPosts.posts.map((post) => post.lowerName);\n\n// \t\t// Assert that all expected posts are present, regardless of order\n// \t\tfor (const expectedPost of expectedPosts) {\n// \t\t\texpect(actualPostLowerNames).toContain(expectedPost.toLowerCase());\n// \t\t}\n// \t}\n// });\n\n// // select only custom find one with where clause (Order Agnostic)\n// test('[Find One] Get only custom fields + where (Order Agnostic)', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \t// Query to find the first user with id = 1 and posts with id >= 2\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\tcolumns: {},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\twhere: gte(postsTable.id, 2),\n// \t\t\t\textras: ({ content }) => ({\n// \t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n// \t\t\t\t}),\n// \t\t\t},\n// \t\t},\n// \t\twhere: eq(usersTable.id, 1),\n// \t\textras: ({ name }) => ({\n// \t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n// \t\t}),\n// \t});\n\n// \t// Type Assertion\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tlowerName: string;\n// \t\t\tposts: {\n// \t\t\t\tlowerName: string;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \t// General Assertions\n// \texpect(usersWithPosts).toBeDefined();\n\n// \tif (usersWithPosts) {\n// \t\t// Assert that the returned user has the expected lowerName\n// \t\texpect(usersWithPosts.lowerName).toBe('dan');\n\n// \t\t// Assert that the user has exactly two posts\n// \t\texpect(usersWithPosts.posts).toHaveLength(2);\n\n// \t\t// Define the expected posts\n// \t\tconst expectedPosts = ['post1.2', 'post1.3'];\n\n// \t\t// Extract the lowerName of each post\n// \t\tconst actualPostLowerNames = usersWithPosts.posts.map((post) => post.lowerName);\n\n// \t\t// Assert that all expected posts are present, regardless of order\n// \t\tfor (const expectedPost of expectedPosts) {\n// \t\t\texpect(actualPostLowerNames).toContain(expectedPost.toLowerCase());\n// \t\t}\n\n// \t\t// Additionally, ensure no unexpected posts are present\n// \t\texpect(actualPostLowerNames).toHaveLength(expectedPosts.length);\n// \t}\n// });\n\n// test.skip('[Find One] Get only custom fields + where + limit', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\tcolumns: {},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\twhere: gte(postsTable.id, 2),\n// \t\t\t\tlimit: 1,\n// \t\t\t\textras: ({ content }) => ({\n// \t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n// \t\t\t\t}),\n// \t\t\t},\n// \t\t},\n// \t\twhere: eq(usersTable.id, 1),\n// \t\textras: ({ name }) => ({\n// \t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n// \t\t}),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tlowerName: string;\n// \t\t\tposts: {\n// \t\t\t\tlowerName: string;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(usersWithPosts?.posts.length).toEqual(1);\n\n// \texpect(usersWithPosts).toEqual({\n// \t\tlowerName: 'dan',\n// \t\tposts: [{ lowerName: 'post1.2' }],\n// \t});\n// });\n\n// test.skip('[Find One] Get only custom fields + where + orderBy', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\tcolumns: {},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\twhere: gte(postsTable.id, 2),\n// \t\t\t\torderBy: [desc(postsTable.id)],\n// \t\t\t\textras: ({ content }) => ({\n// \t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n// \t\t\t\t}),\n// \t\t\t},\n// \t\t},\n// \t\twhere: eq(usersTable.id, 1),\n// \t\textras: ({ name }) => ({\n// \t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n// \t\t}),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tlowerName: string;\n// \t\t\tposts: {\n// \t\t\t\tlowerName: string;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(usersWithPosts?.posts.length).toEqual(2);\n\n// \texpect(usersWithPosts).toEqual({\n// \t\tlowerName: 'dan',\n// \t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n// \t});\n// });\n\n// // columns {}\n// test('[Find Many] Get select {}', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait expect(\n// \t\tasync () =>\n// \t\t\tawait db.query.usersTable.findMany({\n// \t\t\t\tcolumns: {},\n// \t\t\t}),\n// \t).rejects.toThrow(DrizzleError);\n// });\n\n// // columns {}\n// test('[Find One] Get select {}', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait expect(async () =>\n// \t\tawait db.query.usersTable.findFirst({\n// \t\t\tcolumns: {},\n// \t\t})\n// \t).rejects.toThrow(DrizzleError);\n// });\n\n// // deep select {}\n// test('[Find Many] Get deep select {}', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tawait expect(async () =>\n// \t\tawait db.query.usersTable.findMany({\n// \t\t\tcolumns: {},\n// \t\t\twith: {\n// \t\t\t\tposts: {\n// \t\t\t\t\tcolumns: {},\n// \t\t\t\t},\n// \t\t\t},\n// \t\t})\n// \t).rejects.toThrow(DrizzleError);\n// });\n\n// // deep select {}\n// test('[Find One] Get deep select {}', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tawait expect(async () =>\n// \t\tawait db.query.usersTable.findFirst({\n// \t\t\tcolumns: {},\n// \t\t\twith: {\n// \t\t\t\tposts: {\n// \t\t\t\t\tcolumns: {},\n// \t\t\t\t},\n// \t\t\t},\n// \t\t})\n// \t).rejects.toThrow(DrizzleError);\n// });\n\n// /*\n// \tPrepared statements for users+posts\n// */\n// test.skip('[Find Many] Get users with posts + prepared limit', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst prepared = db.query.usersTable.findMany({\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tlimit: placeholder('limit'),\n// \t\t\t},\n// \t\t},\n// \t}).prepare();\n\n// \tconst usersWithPosts = await prepared.execute({ limit: 1 });\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).eq(3);\n// \texpect(usersWithPosts[0]?.posts.length).eq(1);\n// \texpect(usersWithPosts[1]?.posts.length).eq(1);\n// \texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n// \texpect(usersWithPosts).toContainEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(usersWithPosts).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(usersWithPosts).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test.skip('[Find Many] Get users with posts + prepared limit + offset', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst prepared = db.query.usersTable.findMany({\n// \t\tlimit: placeholder('uLimit'),\n// \t\toffset: placeholder('uOffset'),\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tlimit: placeholder('pLimit'),\n// \t\t\t},\n// \t\t},\n// \t}).prepare();\n\n// \tconst usersWithPosts = await prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1 });\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).eq(2);\n// \texpect(usersWithPosts[0]?.posts.length).eq(1);\n// \texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n// \texpect(usersWithPosts).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(usersWithPosts).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test('[Find Many] Get users with posts + prepared where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst prepared = db.query.usersTable.findMany({\n// \t\twhere: (({ id }, { eq }) => eq(id, placeholder('id'))),\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\t},\n// \t\t},\n// \t}).prepare();\n\n// \tconst usersWithPosts = await prepared.execute({ id: 1 });\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).eq(1);\n// \texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n// \texpect(usersWithPosts[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test.skip('[Find Many] Get users with posts + prepared + limit + offset + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst prepared = db.query.usersTable.findMany({\n// \t\tlimit: placeholder('uLimit'),\n// \t\toffset: placeholder('uOffset'),\n// \t\twhere: (({ id }, { eq, or }) => or(eq(id, placeholder('id')), eq(id, 3))),\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\twhere: (({ id }, { eq }) => eq(id, placeholder('pid'))),\n// \t\t\t\tlimit: placeholder('pLimit'),\n// \t\t\t},\n// \t\t},\n// \t}).prepare();\n\n// \tconst usersWithPosts = await prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1, id: 2, pid: 6 });\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(usersWithPosts.length).eq(1);\n// \texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n// \texpect(usersWithPosts).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// /*\n// \t[Find One] One relation users+posts\n// */\n\n// test.only('[Find One] Get users with posts', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\twith: {\n// \t\t\tposts: true,\n// \t\t},\n// \t});\n\n// \t// Type Assertion\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: {\n// \t\t\t\tid: number;\n// \t\t\t\tcontent: string;\n// \t\t\t\townerId: number | null;\n// \t\t\t\tcreatedAt: Date;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \t// General Assertions\n// \texpect(usersWithPosts).toBeDefined();\n\n// \tif (usersWithPosts) {\n// \t\tconst { id, name, posts } = usersWithPosts;\n\n// \t\t// Verify that the user is one of the inserted users\n// \t\tconst validUsers: { [key: number]: string } = {\n// \t\t\t1: 'dan',\n// \t\t\t2: 'andrew',\n// \t\t\t3: 'alex',\n// \t\t};\n// \t\texpect(validUsers[id]).toBe(name.toLowerCase());\n\n// \t\t// Assert that the user has exactly one post\n// \t\texpect(posts).toHaveLength(1);\n\n// \t\tconst post = posts[0];\n\n// \t\t// Verify that the post belongs to the user\n// \t\texpect(post?.ownerId).toBe(id);\n\n// \t\t// Verify that the post content matches the user\n// \t\tconst expectedPostContent = `Post${id}`;\n// \t\texpect(post?.content.toLowerCase()).toBe(expectedPostContent.toLowerCase());\n\n// \t\t// Optionally, verify the presence of `createdAt`\n// \t\texpect(post?.createdAt).toBeInstanceOf(Date);\n// \t}\n// });\n\n// test.skip('[Find One] Get users with posts + limit posts', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tlimit: 1,\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: {\n// \t\t\t\tid: number;\n// \t\t\t\tcontent: string;\n// \t\t\t\townerId: number | null;\n// \t\t\t\tcreatedAt: Date;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(usersWithPosts!.posts.length).eq(1);\n\n// \texpect(usersWithPosts).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test.skip('[Find One] Get users with posts no results found', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tlimit: 1,\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: {\n// \t\t\t\tid: number;\n// \t\t\t\tcontent: string;\n// \t\t\t\townerId: number | null;\n// \t\t\t\tcreatedAt: Date;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(usersWithPosts).toBeUndefined();\n// });\n\n// test.skip('[Find One] Get users with posts + limit posts and users', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tlimit: 1,\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: {\n// \t\t\t\tid: number;\n// \t\t\t\tcontent: string;\n// \t\t\t\townerId: number | null;\n// \t\t\t\tcreatedAt: Date;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(usersWithPosts!.posts.length).eq(1);\n\n// \texpect(usersWithPosts).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test('[Find One] Get users with posts + custom fields', async () => {\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\twith: {\n// \t\t\tposts: true,\n// \t\t},\n// \t\textras: ({ name }) => ({\n// \t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n// \t\t}),\n// \t});\n\n// \t// Type Assertion\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tlowerName: string;\n// \t\t\tposts: {\n// \t\t\t\tid: number;\n// \t\t\t\tcontent: string;\n// \t\t\t\townerId: number | null;\n// \t\t\t\tcreatedAt: Date;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \t// General Assertions\n// \texpect(usersWithPosts).toBeDefined();\n\n// \tif (usersWithPosts) {\n// \t\tconst { id, lowerName, posts } = usersWithPosts;\n\n// \t\t// Define valid users and their expected lower names\n// \t\tconst validUsers: { [key: number]: string } = {\n// \t\t\t1: 'dan',\n// \t\t\t2: 'andrew',\n// \t\t\t3: 'alex',\n// \t\t};\n\n// \t\t// Verify that the returned user's lowerName matches the expected value\n// \t\texpect(validUsers[id]).toBe(lowerName);\n\n// \t\t// Define the expected posts based on the user ID\n// \t\tconst expectedPostsByUser: Record<number, string[]> = {\n// \t\t\t1: ['post1', 'post1.2', 'post1.3'],\n// \t\t\t2: ['post2', 'post2.1'],\n// \t\t\t3: ['post3', 'post3.1'],\n// \t\t};\n\n// \t\t// Get the expected posts for the returned user\n// \t\tconst expectedPosts = expectedPostsByUser[id] || [];\n\n// \t\t// Extract the lowerName of each post\n// \t\tconst actualPostContents = posts.map((post) => post.content.toLowerCase());\n\n// \t\t// Assert that all expected posts are present, regardless of order\n// \t\tfor (const expectedPost of expectedPosts) {\n// \t\t\texpect(actualPostContents).toContain(expectedPost.toLowerCase());\n// \t\t}\n\n// \t\t// Optionally, ensure that no unexpected posts are present\n// \t\texpect(actualPostContents).toHaveLength(expectedPosts.length);\n// \t}\n// });\n\n// test.skip('[Find One] Get users with posts + custom fields + limits', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.2' },\n// \t\t{ ownerId: 1, content: 'Post1.3' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tlimit: 1,\n// \t\t\t},\n// \t\t},\n// \t\textras: (usersTable, { sql }) => ({\n// \t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n// \t\t}),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tlowerName: string;\n// \t\t\tposts: {\n// \t\t\t\tid: number;\n// \t\t\t\tcontent: string;\n// \t\t\t\townerId: number | null;\n// \t\t\t\tcreatedAt: Date;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(usersWithPosts!.posts.length).toEqual(1);\n\n// \texpect(usersWithPosts).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tlowerName: 'dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test.skip('[Find One] Get users with posts + orderBy', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: '1' },\n// \t\t{ ownerId: 1, content: '2' },\n// \t\t{ ownerId: 1, content: '3' },\n// \t\t{ ownerId: 2, content: '4' },\n// \t\t{ ownerId: 2, content: '5' },\n// \t\t{ ownerId: 3, content: '6' },\n// \t\t{ ownerId: 3, content: '7' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n// \t\t\t},\n// \t\t},\n// \t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: {\n// \t\t\t\tid: number;\n// \t\t\t\tcontent: string;\n// \t\t\t\townerId: number | null;\n// \t\t\t\tcreatedAt: Date;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(usersWithPosts!.posts.length).eq(2);\n\n// \texpect(usersWithPosts).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{\n// \t\t\tid: 7,\n// \t\t\townerId: 3,\n// \t\t\tcontent: '7',\n// \t\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n// \t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test('[Find One] Get users with posts + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: {\n// \t\t\t\tid: number;\n// \t\t\t\tcontent: string;\n// \t\t\t\townerId: number | null;\n// \t\t\t\tcreatedAt: Date;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(usersWithPosts!.posts.length).eq(1);\n\n// \texpect(usersWithPosts).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test('[Find One] Get users with posts + where + partial', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\tcolumns: {\n// \t\t\tid: true,\n// \t\t\tname: true,\n// \t\t},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tid: true,\n// \t\t\t\t\tcontent: true,\n// \t\t\t\t},\n// \t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\t},\n// \t\t},\n// \t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tposts: {\n// \t\t\t\tid: number;\n// \t\t\t\tcontent: string;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(usersWithPosts!.posts.length).eq(1);\n\n// \texpect(usersWithPosts).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tposts: [{ id: 1, content: 'Post1' }],\n// \t});\n// });\n\n// test.skip('[Find One] Get users with posts + where + partial. Did not select posts id, but used it in where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\tcolumns: {\n// \t\t\tid: true,\n// \t\t\tname: true,\n// \t\t},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tid: true,\n// \t\t\t\t\tcontent: true,\n// \t\t\t\t},\n// \t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\t},\n// \t\t},\n// \t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tposts: {\n// \t\t\t\tid: number;\n// \t\t\t\tcontent: string;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(usersWithPosts!.posts.length).eq(1);\n\n// \texpect(usersWithPosts).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tposts: [{ id: 1, content: 'Post1' }],\n// \t});\n// });\n\n// test.skip('[Find One] Get users with posts + where + partial(true + false)', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\tcolumns: {\n// \t\t\tid: true,\n// \t\t\tname: false,\n// \t\t},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tid: true,\n// \t\t\t\t\tcontent: false,\n// \t\t\t\t},\n// \t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\t},\n// \t\t},\n// \t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tposts: {\n// \t\t\t\tid: number;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(usersWithPosts!.posts.length).eq(1);\n\n// \texpect(usersWithPosts).toEqual({\n// \t\tid: 1,\n// \t\tposts: [{ id: 1 }],\n// \t});\n// });\n\n// test.skip('[Find One] Get users with posts + where + partial(false)', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst usersWithPosts = await db.query.usersTable.findFirst({\n// \t\tcolumns: {\n// \t\t\tname: false,\n// \t\t},\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tcontent: false,\n// \t\t\t\t},\n// \t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t\t\t},\n// \t\t},\n// \t\twhere: (({ id }, { eq }) => eq(id, 1)),\n// \t});\n\n// \texpectTypeOf(usersWithPosts).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: {\n// \t\t\t\tid: number;\n// \t\t\t\townerId: number | null;\n// \t\t\t\tcreatedAt: Date;\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(usersWithPosts!.posts.length).eq(1);\n\n// \texpect(usersWithPosts).toEqual({\n// \t\tid: 1,\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// /*\n// \tOne relation users+users. Self referencing\n// */\n\n// test.skip('Get user with invitee', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tconst usersWithInvitee = await db.query.usersTable.findMany({\n// \t\twith: {\n// \t\t\tinvitee: true,\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(usersWithInvitee.length).eq(4);\n// \texpect(usersWithInvitee[0]?.invitee).toBeNull();\n// \texpect(usersWithInvitee[1]?.invitee).toBeNull();\n// \texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n// \texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n// \texpect(usersWithInvitee[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t});\n// \texpect(usersWithInvitee[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t});\n// \texpect(usersWithInvitee[2]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n// \t});\n// \texpect(usersWithInvitee[3]).toEqual({\n// \t\tid: 4,\n// \t\tname: 'John',\n// \t\tverified: false,\n// \t\tinvitedBy: 2,\n// \t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n// \t});\n// });\n\n// test.skip('Get user + limit with invitee', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew', invitedBy: 1 },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tconst usersWithInvitee = await db.query.usersTable.findMany({\n// \t\twith: {\n// \t\t\tinvitee: true,\n// \t\t},\n// \t\tlimit: 2,\n// \t});\n\n// \texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(usersWithInvitee.length).eq(2);\n// \texpect(usersWithInvitee[0]?.invitee).toBeNull();\n// \texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n// \texpect(usersWithInvitee[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t});\n// \texpect(usersWithInvitee[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n// \t});\n// });\n\n// test.skip('Get user with invitee and custom fields', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tconst usersWithInvitee = await db.query.usersTable.findMany({\n// \t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n// \t\twith: {\n// \t\t\tinvitee: {\n// \t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tlower: string;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tlower: string;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(usersWithInvitee.length).eq(4);\n// \texpect(usersWithInvitee[0]?.invitee).toBeNull();\n// \texpect(usersWithInvitee[1]?.invitee).toBeNull();\n// \texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n// \texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n// \texpect(usersWithInvitee[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tlower: 'dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t});\n// \texpect(usersWithInvitee[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tlower: 'andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t});\n// \texpect(usersWithInvitee[2]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tlower: 'alex',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n// \t});\n// \texpect(usersWithInvitee[3]).toEqual({\n// \t\tid: 4,\n// \t\tname: 'John',\n// \t\tlower: 'john',\n// \t\tverified: false,\n// \t\tinvitedBy: 2,\n// \t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: false, invitedBy: null },\n// \t});\n// });\n\n// test.skip('Get user with invitee and custom fields + limits', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tconst usersWithInvitee = await db.query.usersTable.findMany({\n// \t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n// \t\tlimit: 3,\n// \t\twith: {\n// \t\t\tinvitee: {\n// \t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tlower: string;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tlower: string;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(usersWithInvitee.length).eq(3);\n// \texpect(usersWithInvitee[0]?.invitee).toBeNull();\n// \texpect(usersWithInvitee[1]?.invitee).toBeNull();\n// \texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\n// \texpect(usersWithInvitee[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tlower: 'dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t});\n// \texpect(usersWithInvitee[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tlower: 'andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t});\n// \texpect(usersWithInvitee[2]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tlower: 'alex',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n// \t});\n// });\n\n// test.skip('Get user with invitee + order by', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tconst usersWithInvitee = await db.query.usersTable.findMany({\n// \t\torderBy: (users, { desc }) => [desc(users.id)],\n// \t\twith: {\n// \t\t\tinvitee: true,\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \texpect(usersWithInvitee.length).eq(4);\n// \texpect(usersWithInvitee[3]?.invitee).toBeNull();\n// \texpect(usersWithInvitee[2]?.invitee).toBeNull();\n// \texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n// \texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\n// \texpect(usersWithInvitee[3]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t});\n// \texpect(usersWithInvitee[2]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t});\n// \texpect(usersWithInvitee[1]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n// \t});\n// \texpect(usersWithInvitee[0]).toEqual({\n// \t\tid: 4,\n// \t\tname: 'John',\n// \t\tverified: false,\n// \t\tinvitedBy: 2,\n// \t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n// \t});\n// });\n\n// test.skip('Get user with invitee + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tconst usersWithInvitee = await db.query.usersTable.findMany({\n// \t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n// \t\twith: {\n// \t\t\tinvitee: true,\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \texpect(usersWithInvitee.length).eq(2);\n// \texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n// \texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n// \texpect(usersWithInvitee).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n// \t});\n// \texpect(usersWithInvitee).toContainEqual({\n// \t\tid: 4,\n// \t\tname: 'John',\n// \t\tverified: false,\n// \t\tinvitedBy: 2,\n// \t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n// \t});\n// });\n\n// test.skip('Get user with invitee + where + partial', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tconst usersWithInvitee = await db.query.usersTable.findMany({\n// \t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n// \t\tcolumns: {\n// \t\t\tid: true,\n// \t\t\tname: true,\n// \t\t},\n// \t\twith: {\n// \t\t\tinvitee: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tid: true,\n// \t\t\t\t\tname: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \texpect(usersWithInvitee.length).eq(2);\n// \texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n// \texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n// \texpect(usersWithInvitee).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tinvitee: { id: 1, name: 'Dan' },\n// \t});\n// \texpect(usersWithInvitee).toContainEqual({\n// \t\tid: 4,\n// \t\tname: 'John',\n// \t\tinvitee: { id: 2, name: 'Andrew' },\n// \t});\n// });\n\n// test.skip('Get user with invitee + where + partial.  Did not select users id, but used it in where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tconst usersWithInvitee = await db.query.usersTable.findMany({\n// \t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n// \t\tcolumns: {\n// \t\t\tname: true,\n// \t\t},\n// \t\twith: {\n// \t\t\tinvitee: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tid: true,\n// \t\t\t\t\tname: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n// \t\t{\n// \t\t\tname: string;\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \texpect(usersWithInvitee.length).eq(2);\n// \texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n// \texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n// \texpect(usersWithInvitee).toContainEqual({\n// \t\tname: 'Alex',\n// \t\tinvitee: { id: 1, name: 'Dan' },\n// \t});\n// \texpect(usersWithInvitee).toContainEqual({\n// \t\tname: 'John',\n// \t\tinvitee: { id: 2, name: 'Andrew' },\n// \t});\n// });\n\n// test.skip('Get user with invitee + where + partial(true+false)', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tconst usersWithInvitee = await db.query.usersTable.findMany({\n// \t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n// \t\tcolumns: {\n// \t\t\tid: true,\n// \t\t\tname: true,\n// \t\t\tverified: false,\n// \t\t},\n// \t\twith: {\n// \t\t\tinvitee: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tid: true,\n// \t\t\t\t\tname: true,\n// \t\t\t\t\tverified: false,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \texpect(usersWithInvitee.length).eq(2);\n// \texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n// \texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n// \texpect(usersWithInvitee).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tinvitee: { id: 1, name: 'Dan' },\n// \t});\n// \texpect(usersWithInvitee).toContainEqual({\n// \t\tid: 4,\n// \t\tname: 'John',\n// \t\tinvitee: { id: 2, name: 'Andrew' },\n// \t});\n// });\n\n// test.skip('Get user with invitee + where + partial(false)', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tconst usersWithInvitee = await db.query.usersTable.findMany({\n// \t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n// \t\tcolumns: {\n// \t\t\tverified: false,\n// \t\t},\n// \t\twith: {\n// \t\t\tinvitee: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tname: false,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \texpect(usersWithInvitee.length).eq(2);\n// \texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n// \texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n// \texpect(usersWithInvitee).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, verified: false, invitedBy: null },\n// \t});\n// \texpect(usersWithInvitee).toContainEqual({\n// \t\tid: 4,\n// \t\tname: 'John',\n// \t\tinvitedBy: 2,\n// \t\tinvitee: { id: 2, verified: false, invitedBy: null },\n// \t});\n// });\n\n// /*\n// \tTwo first-level relations users+users and users+posts\n// */\n\n// test.skip('Get user with invitee and posts', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\twith: {\n// \t\t\tinvitee: true,\n// \t\t\tposts: true,\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).eq(4);\n\n// \texpect(response[0]?.invitee).toBeNull();\n// \texpect(response[1]?.invitee).toBeNull();\n// \texpect(response[2]?.invitee).not.toBeNull();\n// \texpect(response[3]?.invitee).not.toBeNull();\n\n// \texpect(response[0]?.posts.length).eq(1);\n// \texpect(response[1]?.posts.length).eq(1);\n// \texpect(response[2]?.posts.length).eq(1);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(response).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n// \t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(response).toContainEqual({\n// \t\tid: 4,\n// \t\tname: 'John',\n// \t\tverified: false,\n// \t\tinvitedBy: 2,\n// \t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n// \t\tposts: [],\n// \t});\n// });\n\n// test.skip('Get user with invitee and posts + limit posts and users', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\tlimit: 3,\n// \t\twith: {\n// \t\t\tinvitee: true,\n// \t\t\tposts: {\n// \t\t\t\tlimit: 1,\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).eq(3);\n\n// \texpect(response[0]?.invitee).toBeNull();\n// \texpect(response[1]?.invitee).toBeNull();\n// \texpect(response[2]?.invitee).not.toBeNull();\n\n// \texpect(response[0]?.posts.length).eq(1);\n// \texpect(response[1]?.posts.length).eq(1);\n// \texpect(response[2]?.posts.length).eq(1);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(response).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n// \t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test.skip('Get user with invitee and posts + limits + custom fields in each', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\tlimit: 3,\n// \t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n// \t\twith: {\n// \t\t\tinvitee: {\n// \t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_invitee_name') }),\n// \t\t\t},\n// \t\t\tposts: {\n// \t\t\t\tlimit: 1,\n// \t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_content') }),\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tlower: string;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tlower: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).eq(3);\n\n// \texpect(response[0]?.invitee).toBeNull();\n// \texpect(response[1]?.invitee).toBeNull();\n// \texpect(response[2]?.invitee).not.toBeNull();\n\n// \texpect(response[0]?.posts.length).eq(1);\n// \texpect(response[1]?.posts.length).eq(1);\n// \texpect(response[2]?.posts.length).eq(1);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tlower: 'dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tlower: 'andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(response).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tlower: 'alex',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n// \t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test.skip('Get user with invitee and posts + custom fields in each', async () => {\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n// \t\twith: {\n// \t\t\tinvitee: {\n// \t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n// \t\t\t},\n// \t\t\tposts: {\n// \t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_name') }),\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tlower: string;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tlower: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \tresponse[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n// \tresponse[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n// \tresponse[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).eq(4);\n\n// \texpect(response[0]?.invitee).toBeNull();\n// \texpect(response[1]?.invitee).toBeNull();\n// \texpect(response[2]?.invitee).not.toBeNull();\n// \texpect(response[3]?.invitee).not.toBeNull();\n\n// \texpect(response[0]?.posts.length).eq(2);\n// \texpect(response[1]?.posts.length).eq(2);\n// \texpect(response[2]?.posts.length).eq(2);\n// \texpect(response[3]?.posts.length).eq(0);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tlower: 'dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }, {\n// \t\t\tid: 2,\n// \t\t\townerId: 1,\n// \t\t\tcontent: 'Post1.1',\n// \t\t\tlower: 'post1.1',\n// \t\t\tcreatedAt: response[0]?.posts[1]?.createdAt,\n// \t\t}],\n// \t});\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tlower: 'andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }, {\n// \t\t\tid: 4,\n// \t\t\townerId: 2,\n// \t\t\tcontent: 'Post2.1',\n// \t\t\tlower: 'post2.1',\n// \t\t\tcreatedAt: response[1]?.posts[1]?.createdAt,\n// \t\t}],\n// \t});\n// \texpect(response).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tlower: 'alex',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n// \t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }, {\n// \t\t\tid: 6,\n// \t\t\townerId: 3,\n// \t\t\tcontent: 'Post3.1',\n// \t\t\tlower: 'post3.1',\n// \t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n// \t\t}],\n// \t});\n// \texpect(response).toContainEqual({\n// \t\tid: 4,\n// \t\tname: 'John',\n// \t\tlower: 'john',\n// \t\tverified: false,\n// \t\tinvitedBy: 2,\n// \t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: false, invitedBy: null },\n// \t\tposts: [],\n// \t});\n// });\n\n// test.skip('Get user with invitee and posts + orderBy', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\torderBy: (users, { desc }) => [desc(users.id)],\n// \t\twith: {\n// \t\t\tinvitee: true,\n// \t\t\tposts: {\n// \t\t\t\torderBy: (posts, { desc }) => [desc(posts.id)],\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \texpect(response.length).eq(4);\n\n// \texpect(response[3]?.invitee).toBeNull();\n// \texpect(response[2]?.invitee).toBeNull();\n// \texpect(response[1]?.invitee).not.toBeNull();\n// \texpect(response[0]?.invitee).not.toBeNull();\n\n// \texpect(response[0]?.posts.length).eq(0);\n// \texpect(response[1]?.posts.length).eq(1);\n// \texpect(response[2]?.posts.length).eq(2);\n// \texpect(response[3]?.posts.length).eq(2);\n\n// \texpect(response[3]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t\tposts: [{ id: 2, ownerId: 1, content: 'Post1.1', createdAt: response[3]?.posts[0]?.createdAt }, {\n// \t\t\tid: 1,\n// \t\t\townerId: 1,\n// \t\t\tcontent: 'Post1',\n// \t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n// \t\t}],\n// \t});\n// \texpect(response[2]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t\tposts: [{ id: 4, ownerId: 2, content: 'Post2.1', createdAt: response[2]?.posts[0]?.createdAt }, {\n// \t\t\tid: 3,\n// \t\t\townerId: 2,\n// \t\t\tcontent: 'Post2',\n// \t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n// \t\t}],\n// \t});\n// \texpect(response[1]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n// \t\tposts: [{\n// \t\t\tid: 5,\n// \t\t\townerId: 3,\n// \t\t\tcontent: 'Post3',\n// \t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n// \t\t}],\n// \t});\n// \texpect(response[0]).toEqual({\n// \t\tid: 4,\n// \t\tname: 'John',\n// \t\tverified: false,\n// \t\tinvitedBy: 2,\n// \t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n// \t\tposts: [],\n// \t});\n// });\n\n// test.skip('Get user with invitee and posts + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\twhere: (users, { eq, or }) => (or(eq(users.id, 2), eq(users.id, 3))),\n// \t\twith: {\n// \t\t\tinvitee: true,\n// \t\t\tposts: {\n// \t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 2)),\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).eq(2);\n\n// \texpect(response[0]?.invitee).toBeNull();\n// \texpect(response[1]?.invitee).not.toBeNull();\n\n// \texpect(response[0]?.posts.length).eq(1);\n// \texpect(response[1]?.posts.length).eq(0);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tinvitee: null,\n// \t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[0]?.posts[0]?.createdAt }],\n// \t});\n// \texpect(response).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n// \t\tposts: [],\n// \t});\n// });\n\n// test.skip('Get user with invitee and posts + limit posts and users + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t\t{ ownerId: 3, content: 'Post3.1' },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n// \t\tlimit: 1,\n// \t\twith: {\n// \t\t\tinvitee: true,\n// \t\t\tposts: {\n// \t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 3)),\n// \t\t\t\tlimit: 1,\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \texpect(response.length).eq(1);\n\n// \texpect(response[0]?.invitee).not.toBeNull();\n// \texpect(response[0]?.posts.length).eq(1);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n// \t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[0]?.posts[0]?.createdAt }],\n// \t});\n// });\n\n// test.skip('Get user with invitee and posts + orderBy + where + custom', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\torderBy: [desc(usersTable.id)],\n// \t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n// \t\textras: {\n// \t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n// \t\t},\n// \t\twith: {\n// \t\t\tinvitee: true,\n// \t\t\tposts: {\n// \t\t\t\twhere: eq(postsTable.ownerId, 3),\n// \t\t\t\torderBy: [desc(postsTable.id)],\n// \t\t\t\textras: {\n// \t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tlower: string;\n// \t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \texpect(response.length).eq(2);\n\n// \texpect(response[1]?.invitee).not.toBeNull();\n// \texpect(response[0]?.invitee).not.toBeNull();\n\n// \texpect(response[0]?.posts.length).eq(0);\n// \texpect(response[1]?.posts.length).eq(1);\n\n// \texpect(response[1]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tlower: 'alex',\n// \t\tverified: false,\n// \t\tinvitedBy: 1,\n// \t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n// \t\tposts: [{\n// \t\t\tid: 5,\n// \t\t\townerId: 3,\n// \t\t\tcontent: 'Post3',\n// \t\t\tlower: 'post3',\n// \t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n// \t\t}],\n// \t});\n// \texpect(response[0]).toEqual({\n// \t\tid: 4,\n// \t\tname: 'John',\n// \t\tlower: 'john',\n// \t\tverified: false,\n// \t\tinvitedBy: 2,\n// \t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n// \t\tposts: [],\n// \t});\n// });\n\n// test.skip('Get user with invitee and posts + orderBy + where + partial + custom', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n// \t\t{ id: 4, name: 'John', invitedBy: 2 },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ ownerId: 1, content: 'Post1' },\n// \t\t{ ownerId: 1, content: 'Post1.1' },\n// \t\t{ ownerId: 2, content: 'Post2' },\n// \t\t{ ownerId: 2, content: 'Post2.1' },\n// \t\t{ ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\torderBy: [desc(usersTable.id)],\n// \t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n// \t\textras: {\n// \t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n// \t\t},\n// \t\tcolumns: {\n// \t\t\tid: true,\n// \t\t\tname: true,\n// \t\t},\n// \t\twith: {\n// \t\t\tinvitee: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tid: true,\n// \t\t\t\t\tname: true,\n// \t\t\t\t},\n// \t\t\t\textras: {\n// \t\t\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n// \t\t\t\t},\n// \t\t\t},\n// \t\t\tposts: {\n// \t\t\t\tcolumns: {\n// \t\t\t\t\tid: true,\n// \t\t\t\t\tcontent: true,\n// \t\t\t\t},\n// \t\t\t\twhere: eq(postsTable.ownerId, 3),\n// \t\t\t\torderBy: [desc(postsTable.id)],\n// \t\t\t\textras: {\n// \t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tlower: string;\n// \t\t\tposts: { id: number; lower: string; content: string }[];\n// \t\t\tinvitee: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tlower: string;\n// \t\t\t} | null;\n// \t\t}[]\n// \t>();\n\n// \texpect(response.length).eq(2);\n\n// \texpect(response[1]?.invitee).not.toBeNull();\n// \texpect(response[0]?.invitee).not.toBeNull();\n\n// \texpect(response[0]?.posts.length).eq(0);\n// \texpect(response[1]?.posts.length).eq(1);\n\n// \texpect(response[1]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tlower: 'alex',\n// \t\tinvitee: { id: 1, name: 'Dan', lower: 'dan' },\n// \t\tposts: [{\n// \t\t\tid: 5,\n// \t\t\tcontent: 'Post3',\n// \t\t\tlower: 'post3',\n// \t\t}],\n// \t});\n// \texpect(response[0]).toEqual({\n// \t\tid: 4,\n// \t\tname: 'John',\n// \t\tlower: 'john',\n// \t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew' },\n// \t\tposts: [],\n// \t});\n// });\n\n// /*\n// \tOne two-level relation users+posts+comments\n// */\n\n// test.skip('Get user with posts and posts with comments', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ id: 1, ownerId: 1, content: 'Post1' },\n// \t\t{ id: 2, ownerId: 2, content: 'Post2' },\n// \t\t{ id: 3, ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tawait db.insert(commentsTable).values([\n// \t\t{ postId: 1, content: 'Comment1', creator: 2 },\n// \t\t{ postId: 2, content: 'Comment2', creator: 2 },\n// \t\t{ postId: 3, content: 'Comment3', creator: 3 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\twith: {\n// \t\t\t\t\tcomments: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tposts: {\n// \t\t\t\tid: number;\n// \t\t\t\tcontent: string;\n// \t\t\t\townerId: number | null;\n// \t\t\t\tcreatedAt: Date;\n// \t\t\t\tcomments: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tcontent: string;\n// \t\t\t\t\tcreatedAt: Date;\n// \t\t\t\t\tcreator: number | null;\n// \t\t\t\t\tpostId: number | null;\n// \t\t\t\t}[];\n// \t\t\t}[];\n// \t\t}[]\n// \t>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).eq(3);\n// \texpect(response[0]?.posts.length).eq(1);\n// \texpect(response[1]?.posts.length).eq(1);\n// \texpect(response[2]?.posts.length).eq(1);\n\n// \texpect(response[0]?.posts[0]?.comments.length).eq(1);\n// \texpect(response[1]?.posts[0]?.comments.length).eq(1);\n// \texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n// \texpect(response[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{\n// \t\t\tid: 1,\n// \t\t\townerId: 1,\n// \t\t\tcontent: 'Post1',\n// \t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n// \t\t\tcomments: [\n// \t\t\t\t{\n// \t\t\t\t\tid: 1,\n// \t\t\t\t\tcontent: 'Comment1',\n// \t\t\t\t\tcreator: 2,\n// \t\t\t\t\tpostId: 1,\n// \t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n// \t\t\t\t},\n// \t\t\t],\n// \t\t}],\n// \t});\n// \texpect(response[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{\n// \t\t\tid: 2,\n// \t\t\townerId: 2,\n// \t\t\tcontent: 'Post2',\n// \t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n// \t\t\tcomments: [\n// \t\t\t\t{\n// \t\t\t\t\tid: 2,\n// \t\t\t\t\tcontent: 'Comment2',\n// \t\t\t\t\tcreator: 2,\n// \t\t\t\t\tpostId: 2,\n// \t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n// \t\t\t\t},\n// \t\t\t],\n// \t\t}],\n// \t});\n// \t// expect(response[2]).toEqual({\n// \t// \tid: 3,\n// \t// \tname: 'Alex',\n// \t// \tverified: false,\n// \t// \tinvitedBy: null,\n// \t// \tposts: [{\n// \t// \t\tid: 3,\n// \t// \t\townerId: 3,\n// \t// \t\tcontent: 'Post3',\n// \t// \t\tcreatedAt: response[2]?.posts[0]?.createdAt,\n// \t// \t\tcomments: [\n// \t// \t\t\t{\n// \t// \t\t\t\tid: ,\n// \t// \t\t\t\tcontent: 'Comment3',\n// \t// \t\t\t\tcreator: 3,\n// \t// \t\t\t\tpostId: 3,\n// \t// \t\t\t\tcreatedAt: response[2]?.posts[0]?.comments[0]?.createdAt,\n// \t// \t\t\t},\n// \t// \t\t],\n// \t// \t}],\n// \t// });\n// });\n\n// // Get user with limit posts and limit comments\n\n// // Get user with custom field + post + comment with custom field\n\n// // Get user with limit + posts orderBy + comment orderBy\n\n// // Get user with where + posts where + comment where\n\n// // Get user with where + posts partial where + comment where\n\n// // Get user with where + posts partial where + comment partial(false) where\n\n// // Get user with where partial(false) + posts partial where partial(false) + comment partial(false+true) where\n\n// // Get user with where + posts partial where + comment where. Didn't select field from where in posts\n\n// // Get user with where + posts partial where + comment where. Didn't select field from where for all\n\n// // Get with limit+offset in each\n\n// /*\n// \tOne two-level + One first-level relation users+posts+comments and users+users\n// */\n\n// /*\n// \tOne three-level relation users+posts+comments+comment_owner\n// */\n\n// test.skip('Get user with posts and posts with comments and comments with owner', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ id: 1, ownerId: 1, content: 'Post1' },\n// \t\t{ id: 2, ownerId: 2, content: 'Post2' },\n// \t\t{ id: 3, ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tawait db.insert(commentsTable).values([\n// \t\t{ postId: 1, content: 'Comment1', creator: 2 },\n// \t\t{ postId: 2, content: 'Comment2', creator: 2 },\n// \t\t{ postId: 3, content: 'Comment3', creator: 3 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\twith: {\n// \t\t\t\t\tcomments: {\n// \t\t\t\t\t\twith: {\n// \t\t\t\t\t\t\tauthor: true,\n// \t\t\t\t\t\t},\n// \t\t\t\t\t},\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t\tcomments: {\n// \t\t\t\tid: number;\n// \t\t\t\tcontent: string;\n// \t\t\t\tcreatedAt: Date;\n// \t\t\t\tcreator: number | null;\n// \t\t\t\tpostId: number | null;\n// \t\t\t\tauthor: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tverified: boolean;\n// \t\t\t\t\tinvitedBy: number | null;\n// \t\t\t\t} | null;\n// \t\t\t}[];\n// \t\t}[];\n// \t}[]>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).eq(3);\n// \texpect(response[0]?.posts.length).eq(1);\n// \texpect(response[1]?.posts.length).eq(1);\n// \texpect(response[2]?.posts.length).eq(1);\n\n// \texpect(response[0]?.posts[0]?.comments.length).eq(1);\n// \texpect(response[1]?.posts[0]?.comments.length).eq(1);\n// \texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n// \texpect(response[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{\n// \t\t\tid: 1,\n// \t\t\townerId: 1,\n// \t\t\tcontent: 'Post1',\n// \t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n// \t\t\tcomments: [\n// \t\t\t\t{\n// \t\t\t\t\tid: 1,\n// \t\t\t\t\tcontent: 'Comment1',\n// \t\t\t\t\tcreator: 2,\n// \t\t\t\t\tauthor: {\n// \t\t\t\t\t\tid: 2,\n// \t\t\t\t\t\tname: 'Andrew',\n// \t\t\t\t\t\tverified: false,\n// \t\t\t\t\t\tinvitedBy: null,\n// \t\t\t\t\t},\n// \t\t\t\t\tpostId: 1,\n// \t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n// \t\t\t\t},\n// \t\t\t],\n// \t\t}],\n// \t});\n// \texpect(response[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{\n// \t\t\tid: 2,\n// \t\t\townerId: 2,\n// \t\t\tcontent: 'Post2',\n// \t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n// \t\t\tcomments: [\n// \t\t\t\t{\n// \t\t\t\t\tid: 2,\n// \t\t\t\t\tcontent: 'Comment2',\n// \t\t\t\t\tcreator: 2,\n// \t\t\t\t\tauthor: {\n// \t\t\t\t\t\tid: 2,\n// \t\t\t\t\t\tname: 'Andrew',\n// \t\t\t\t\t\tverified: false,\n// \t\t\t\t\t\tinvitedBy: null,\n// \t\t\t\t\t},\n// \t\t\t\t\tpostId: 2,\n// \t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n// \t\t\t\t},\n// \t\t\t],\n// \t\t}],\n// \t});\n// });\n\n// test.skip('Get user with posts and posts with comments and comments with owner where exists', async () => {\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(postsTable).values([\n// \t\t{ id: 1, ownerId: 1, content: 'Post1' },\n// \t\t{ id: 2, ownerId: 2, content: 'Post2' },\n// \t\t{ id: 3, ownerId: 3, content: 'Post3' },\n// \t]);\n\n// \tawait db.insert(commentsTable).values([\n// \t\t{ postId: 1, content: 'Comment1', creator: 2 },\n// \t\t{ postId: 2, content: 'Comment2', creator: 2 },\n// \t\t{ postId: 3, content: 'Comment3', creator: 3 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\twith: {\n// \t\t\tposts: {\n// \t\t\t\twith: {\n// \t\t\t\t\tcomments: {\n// \t\t\t\t\t\twith: {\n// \t\t\t\t\t\t\tauthor: true,\n// \t\t\t\t\t\t},\n// \t\t\t\t\t},\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t\twhere: (table, { exists, eq }) => exists(db.select({ one: sql`1` }).from(usersTable).where(eq(sql`1`, table.id))),\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tposts: {\n// \t\t\tid: number;\n// \t\t\tcontent: string;\n// \t\t\townerId: number | null;\n// \t\t\tcreatedAt: Date;\n// \t\t\tcomments: {\n// \t\t\t\tid: number;\n// \t\t\t\tcontent: string;\n// \t\t\t\tcreatedAt: Date;\n// \t\t\t\tcreator: number | null;\n// \t\t\t\tpostId: number | null;\n// \t\t\t\tauthor: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tverified: boolean;\n// \t\t\t\t\tinvitedBy: number | null;\n// \t\t\t\t} | null;\n// \t\t\t}[];\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(response.length).eq(1);\n// \texpect(response[0]?.posts.length).eq(1);\n\n// \texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\n// \texpect(response[0]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tposts: [{\n// \t\t\tid: 1,\n// \t\t\townerId: 1,\n// \t\t\tcontent: 'Post1',\n// \t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n// \t\t\tcomments: [\n// \t\t\t\t{\n// \t\t\t\t\tid: 1,\n// \t\t\t\t\tcontent: 'Comment1',\n// \t\t\t\t\tcreator: 2,\n// \t\t\t\t\tauthor: {\n// \t\t\t\t\t\tid: 2,\n// \t\t\t\t\t\tname: 'Andrew',\n// \t\t\t\t\t\tverified: false,\n// \t\t\t\t\t\tinvitedBy: null,\n// \t\t\t\t\t},\n// \t\t\t\t\tpostId: 1,\n// \t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n// \t\t\t\t},\n// \t\t\t],\n// \t\t}],\n// \t});\n// });\n\n// /*\n// \tOne three-level relation + 1 first-level relatioon\n// \t1. users+posts+comments+comment_owner\n// \t2. users+users\n// */\n\n// /*\n// \tOne four-level relation users+posts+comments+coment_likes\n// */\n\n// /*\n// \t[Find Many] Many-to-many cases\n\n// \tUsers+users_to_groups+groups\n// */\n\n// test.skip('[Find Many] Get users with groups', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tgroup: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tusersToGroups: {\n// \t\t\tgroup: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tdescription: string | null;\n// \t\t\t};\n// \t\t}[];\n// \t}[]>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).toEqual(3);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(1);\n// \texpect(response[1]?.usersToGroups.length).toEqual(1);\n// \texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Group1',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Group2',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Group3',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}, {\n// \t\t\tgroup: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Group2',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find Many] Get groups with users', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.groupsTable.findMany({\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tuser: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tdescription: string | null;\n// \t\tusersToGroups: {\n// \t\t\tuser: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t};\n// \t\t}[];\n// \t}[]>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).toEqual(3);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(1);\n// \texpect(response[1]?.usersToGroups.length).toEqual(2);\n// \texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 1,\n// \t\tname: 'Group1',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Dan',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Group2',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Andrew',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}, {\n// \t\t\tuser: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Alex',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Group3',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Alex',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find Many] Get users with groups + limit', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 2, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\tlimit: 2,\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\tlimit: 1,\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tgroup: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tusersToGroups: {\n// \t\t\tgroup: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tdescription: string | null;\n// \t\t\t};\n// \t\t}[];\n// \t}[]>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).toEqual(2);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(1);\n// \texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Group1',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Group2',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find Many] Get groups with users + limit', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.groupsTable.findMany({\n// \t\tlimit: 2,\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\tlimit: 1,\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tuser: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tdescription: string | null;\n// \t\tusersToGroups: {\n// \t\t\tuser: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t};\n// \t\t}[];\n// \t}[]>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).toEqual(2);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(1);\n// \texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 1,\n// \t\tname: 'Group1',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Dan',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Group2',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Andrew',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find Many] Get users with groups + limit + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 2, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\tlimit: 1,\n// \t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tgroup: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tusersToGroups: {\n// \t\t\tgroup: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tdescription: string | null;\n// \t\t\t};\n// \t\t}[];\n// \t}[]>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).toEqual(1);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Group1',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find Many] Get groups with users + limit + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.groupsTable.findMany({\n// \t\tlimit: 1,\n// \t\twhere: gt(groupsTable.id, 1),\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n// \t\t\t\tlimit: 1,\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tuser: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tdescription: string | null;\n// \t\tusersToGroups: {\n// \t\t\tuser: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t};\n// \t\t}[];\n// \t}[]>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).toEqual(1);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Group2',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Andrew',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find Many] Get users with groups + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 2, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tgroup: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tusersToGroups: {\n// \t\t\tgroup: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tdescription: string | null;\n// \t\t\t};\n// \t\t}[];\n// \t}[]>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).toEqual(2);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(0);\n// \texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [],\n// \t});\n\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Group2',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find Many] Get groups with users + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.groupsTable.findMany({\n// \t\twhere: gt(groupsTable.id, 1),\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tuser: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tdescription: string | null;\n// \t\tusersToGroups: {\n// \t\t\tuser: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t};\n// \t\t}[];\n// \t}[]>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).toEqual(2);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(1);\n// \texpect(response[1]?.usersToGroups.length).toEqual(0);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Group2',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Andrew',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Group3',\n// \t\tdescription: null,\n// \t\tusersToGroups: [],\n// \t});\n// });\n\n// test.skip('[Find Many] Get users with groups + orderBy', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\torderBy: (users, { desc }) => [desc(users.id)],\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tgroup: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tusersToGroups: {\n// \t\t\tgroup: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tdescription: string | null;\n// \t\t\t};\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(response.length).toEqual(3);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(2);\n// \texpect(response[1]?.usersToGroups.length).toEqual(1);\n// \texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n// \texpect(response[2]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Group1',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Group2',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response[0]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Group3',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}, {\n// \t\t\tgroup: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Group2',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find Many] Get groups with users + orderBy', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.groupsTable.findMany({\n// \t\torderBy: [desc(groupsTable.id)],\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tuser: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tdescription: string | null;\n// \t\tusersToGroups: {\n// \t\t\tuser: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tverified: boolean;\n// \t\t\t\tinvitedBy: number | null;\n// \t\t\t};\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(response.length).toEqual(3);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(1);\n// \texpect(response[1]?.usersToGroups.length).toEqual(2);\n// \texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n// \texpect(response[2]).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Group1',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Dan',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Group2',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Alex',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}, {\n// \t\t\tuser: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Andrew',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response[0]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Group3',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Alex',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find Many] Get users with groups + orderBy + limit', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\torderBy: (users, { desc }) => [desc(users.id)],\n// \t\tlimit: 2,\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\tlimit: 1,\n// \t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tgroup: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<{\n// \t\tid: number;\n// \t\tname: string;\n// \t\tverified: boolean;\n// \t\tinvitedBy: number | null;\n// \t\tusersToGroups: {\n// \t\t\tgroup: {\n// \t\t\t\tid: number;\n// \t\t\t\tname: string;\n// \t\t\t\tdescription: string | null;\n// \t\t\t};\n// \t\t}[];\n// \t}[]>();\n\n// \texpect(response.length).toEqual(2);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(1);\n// \texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n// \texpect(response[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Group2',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response[0]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Group3',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// /*\n// \t[Find One] Many-to-many cases\n\n// \tUsers+users_to_groups+groups\n// */\n\n// test.skip('[Find One] Get users with groups', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findFirst({\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tgroup: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tusersToGroups: {\n// \t\t\t\tgroup: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tdescription: string | null;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(response?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Group1',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find One] Get groups with users', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.groupsTable.findFirst({\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tuser: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tdescription: string | null;\n// \t\t\tusersToGroups: {\n// \t\t\t\tuser: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tverified: boolean;\n// \t\t\t\t\tinvitedBy: number | null;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(response?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Group1',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Dan',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find One] Get users with groups + limit', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 2, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findFirst({\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\tlimit: 1,\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tgroup: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tusersToGroups: {\n// \t\t\t\tgroup: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tdescription: string | null;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(response?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Group1',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find One] Get groups with users + limit', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.groupsTable.findFirst({\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\tlimit: 1,\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tuser: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tdescription: string | null;\n// \t\t\tusersToGroups: {\n// \t\t\t\tuser: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tverified: boolean;\n// \t\t\t\t\tinvitedBy: number | null;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(response?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Group1',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Dan',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find One] Get users with groups + limit + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 2, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findFirst({\n// \t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tgroup: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tusersToGroups: {\n// \t\t\t\tgroup: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tdescription: string | null;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(response?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Group1',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find One] Get groups with users + limit + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.groupsTable.findFirst({\n// \t\twhere: gt(groupsTable.id, 1),\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n// \t\t\t\tlimit: 1,\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tuser: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tdescription: string | null;\n// \t\t\tusersToGroups: {\n// \t\t\t\tuser: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tverified: boolean;\n// \t\t\t\t\tinvitedBy: number | null;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(response?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Group2',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Andrew',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find One] Get users with groups + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 2, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findFirst({\n// \t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tgroup: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tusersToGroups: {\n// \t\t\t\tgroup: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tdescription: string | null;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(response?.usersToGroups.length).toEqual(0);\n\n// \texpect(response).toEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [],\n// \t});\n// });\n\n// test.skip('[Find One] Get groups with users + where', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.groupsTable.findFirst({\n// \t\twhere: gt(groupsTable.id, 1),\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tuser: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tdescription: string | null;\n// \t\t\tusersToGroups: {\n// \t\t\t\tuser: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tverified: boolean;\n// \t\t\t\t\tinvitedBy: number | null;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(response?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Group2',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Andrew',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find One] Get users with groups + orderBy', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findFirst({\n// \t\torderBy: (users, { desc }) => [desc(users.id)],\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tgroup: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tusersToGroups: {\n// \t\t\t\tgroup: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tdescription: string | null;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(response?.usersToGroups.length).toEqual(2);\n\n// \texpect(response).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Group3',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}, {\n// \t\t\tgroup: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Group2',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find One] Get groups with users + orderBy', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.groupsTable.findFirst({\n// \t\torderBy: [desc(groupsTable.id)],\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tuser: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tdescription: string | null;\n// \t\t\tusersToGroups: {\n// \t\t\t\tuser: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tverified: boolean;\n// \t\t\t\t\tinvitedBy: number | null;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(response?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Group3',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Alex',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('[Find One] Get users with groups + orderBy + limit', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findFirst({\n// \t\torderBy: (users, { desc }) => [desc(users.id)],\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\tlimit: 1,\n// \t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tgroup: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tusersToGroups: {\n// \t\t\t\tgroup: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tdescription: string | null;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t} | undefined\n// \t>();\n\n// \texpect(response?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Group3',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('Get groups with users + orderBy + limit', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.groupsTable.findMany({\n// \t\torderBy: [desc(groupsTable.id)],\n// \t\tlimit: 2,\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\tlimit: 1,\n// \t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tuser: true,\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tdescription: string | null;\n// \t\t\tusersToGroups: {\n// \t\t\t\tuser: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tverified: boolean;\n// \t\t\t\t\tinvitedBy: number | null;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t}[]\n// \t>();\n\n// \texpect(response.length).toEqual(2);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(1);\n// \texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n// \texpect(response[1]).toEqual({\n// \t\tid: 2,\n// \t\tname: 'Group2',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Alex',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response[0]).toEqual({\n// \t\tid: 3,\n// \t\tname: 'Group3',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Alex',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('Get users with groups + custom', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.usersTable.findMany({\n// \t\textras: {\n// \t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n// \t\t},\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tgroup: {\n// \t\t\t\t\t\textras: {\n// \t\t\t\t\t\t\tlower: sql<string>`lower(${groupsTable.name})`.as('lower_name'),\n// \t\t\t\t\t\t},\n// \t\t\t\t\t},\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tverified: boolean;\n// \t\t\tinvitedBy: number | null;\n// \t\t\tlower: string;\n// \t\t\tusersToGroups: {\n// \t\t\t\tgroup: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tdescription: string | null;\n// \t\t\t\t\tlower: string;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t}[]\n// \t>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).toEqual(3);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(1);\n// \texpect(response[1]?.usersToGroups.length).toEqual(1);\n// \texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 1,\n// \t\tname: 'Dan',\n// \t\tlower: 'dan',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Group1',\n// \t\t\t\tlower: 'group1',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Andrew',\n// \t\tlower: 'andrew',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Group2',\n// \t\t\t\tlower: 'group2',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Alex',\n// \t\tlower: 'alex',\n// \t\tverified: false,\n// \t\tinvitedBy: null,\n// \t\tusersToGroups: [{\n// \t\t\tgroup: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Group3',\n// \t\t\t\tlower: 'group3',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}, {\n// \t\t\tgroup: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Group2',\n// \t\t\t\tlower: 'group2',\n// \t\t\t\tdescription: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test.skip('Get groups with users + custom', async (t) => {\n// \tconst { singlestoreDb: db } = t;\n\n// \tawait db.insert(usersTable).values([\n// \t\t{ id: 1, name: 'Dan' },\n// \t\t{ id: 2, name: 'Andrew' },\n// \t\t{ id: 3, name: 'Alex' },\n// \t]);\n\n// \tawait db.insert(groupsTable).values([\n// \t\t{ id: 1, name: 'Group1' },\n// \t\t{ id: 2, name: 'Group2' },\n// \t\t{ id: 3, name: 'Group3' },\n// \t]);\n\n// \tawait db.insert(usersToGroupsTable).values([\n// \t\t{ userId: 1, groupId: 1 },\n// \t\t{ userId: 2, groupId: 2 },\n// \t\t{ userId: 3, groupId: 3 },\n// \t\t{ userId: 3, groupId: 2 },\n// \t]);\n\n// \tconst response = await db.query.groupsTable.findMany({\n// \t\textras: (table, { sql }) => ({\n// \t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n// \t\t}),\n// \t\twith: {\n// \t\t\tusersToGroups: {\n// \t\t\t\tcolumns: {},\n// \t\t\t\twith: {\n// \t\t\t\t\tuser: {\n// \t\t\t\t\t\textras: (table, { sql }) => ({\n// \t\t\t\t\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n// \t\t\t\t\t\t}),\n// \t\t\t\t\t},\n// \t\t\t\t},\n// \t\t\t},\n// \t\t},\n// \t});\n\n// \texpectTypeOf(response).toEqualTypeOf<\n// \t\t{\n// \t\t\tid: number;\n// \t\t\tname: string;\n// \t\t\tdescription: string | null;\n// \t\t\tlower: string;\n// \t\t\tusersToGroups: {\n// \t\t\t\tuser: {\n// \t\t\t\t\tid: number;\n// \t\t\t\t\tname: string;\n// \t\t\t\t\tverified: boolean;\n// \t\t\t\t\tinvitedBy: number | null;\n// \t\t\t\t\tlower: string;\n// \t\t\t\t};\n// \t\t\t}[];\n// \t\t}[]\n// \t>();\n\n// \tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n// \texpect(response.length).toEqual(3);\n\n// \texpect(response[0]?.usersToGroups.length).toEqual(1);\n// \texpect(response[1]?.usersToGroups.length).toEqual(2);\n// \texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n// \texpect(response).toContainEqual({\n// \t\tid: 1,\n// \t\tname: 'Group1',\n// \t\tlower: 'group1',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 1,\n// \t\t\t\tname: 'Dan',\n// \t\t\t\tlower: 'dan',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response).toContainEqual({\n// \t\tid: 2,\n// \t\tname: 'Group2',\n// \t\tlower: 'group2',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 2,\n// \t\t\t\tname: 'Andrew',\n// \t\t\t\tlower: 'andrew',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}, {\n// \t\t\tuser: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Alex',\n// \t\t\t\tlower: 'alex',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n\n// \texpect(response).toContainEqual({\n// \t\tid: 3,\n// \t\tname: 'Group3',\n// \t\tlower: 'group3',\n// \t\tdescription: null,\n// \t\tusersToGroups: [{\n// \t\t\tuser: {\n// \t\t\t\tid: 3,\n// \t\t\t\tname: 'Alex',\n// \t\t\t\tlower: 'alex',\n// \t\t\t\tverified: false,\n// \t\t\t\tinvitedBy: null,\n// \t\t\t},\n// \t\t}],\n// \t});\n// });\n\n// test('.toSQL()', () => {\n// \tconst query = db.query.usersTable.findFirst().toSQL();\n\n// \texpect(query).toHaveProperty('sql', expect.any(String));\n// \texpect(query).toHaveProperty('params', expect.any(Array));\n// });\n\n// // + custom + where + orderby\n\n// // + custom + where + orderby + limit\n\n// // + partial\n\n// // + partial(false)\n\n// // + partial + orderBy + where (all not selected)\n\n// /*\n// \tOne four-level relation users+posts+comments+coment_likes\n// \t+ users+users_to_groups+groups\n// */\n\n// /*\n// \tReally hard case\n// \t1. users+posts+comments+coment_likes\n// \t2. users+users_to_groups+groups\n// \t3. users+users\n// */\n// eslint-disable-next-line unicorn/no-empty-file\n"
  },
  {
    "path": "integration-tests/tests/relational/sqlite.schema.ts",
    "content": "import { type AnySQLiteColumn, integer, primaryKey, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nimport { relations, sql } from 'drizzle-orm';\n\nexport const usersTable = sqliteTable('users', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tverified: integer('verified').notNull().default(0),\n\tinvitedBy: integer('invited_by').references((): AnySQLiteColumn => usersTable.id),\n});\nexport const usersConfig = relations(usersTable, ({ one, many }) => ({\n\tinvitee: one(usersTable, {\n\t\tfields: [usersTable.invitedBy],\n\t\treferences: [usersTable.id],\n\t}),\n\tusersToGroups: many(usersToGroupsTable),\n\tposts: many(postsTable),\n}));\n\nexport const groupsTable = sqliteTable('groups', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tdescription: text('description'),\n});\nexport const groupsConfig = relations(groupsTable, ({ many }) => ({\n\tusersToGroups: many(usersToGroupsTable),\n}));\n\nexport const usersToGroupsTable = sqliteTable(\n\t'users_to_groups',\n\t{\n\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\tuserId: integer('user_id', { mode: 'number' }).notNull().references(\n\t\t\t() => usersTable.id,\n\t\t),\n\t\tgroupId: integer('group_id', { mode: 'number' }).notNull().references(\n\t\t\t() => groupsTable.id,\n\t\t),\n\t},\n\t(t) => ({\n\t\tpk: primaryKey(t.userId, t.groupId),\n\t}),\n);\nexport const usersToGroupsConfig = relations(usersToGroupsTable, ({ one }) => ({\n\tgroup: one(groupsTable, {\n\t\tfields: [usersToGroupsTable.groupId],\n\t\treferences: [groupsTable.id],\n\t}),\n\tuser: one(usersTable, {\n\t\tfields: [usersToGroupsTable.userId],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n\nexport const postsTable = sqliteTable('posts', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcontent: text('content').notNull(),\n\townerId: integer('owner_id', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tcreatedAt: integer('created_at', { mode: 'timestamp_ms' })\n\t\t.notNull().default(sql`current_timestamp`),\n});\nexport const postsConfig = relations(postsTable, ({ one, many }) => ({\n\tauthor: one(usersTable, {\n\t\tfields: [postsTable.ownerId],\n\t\treferences: [usersTable.id],\n\t}),\n\tcomments: many(commentsTable),\n}));\n\nexport const commentsTable = sqliteTable('comments', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcontent: text('content').notNull(),\n\tcreator: integer('creator', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tpostId: integer('post_id', { mode: 'number' }).references(() => postsTable.id),\n\tcreatedAt: integer('created_at', { mode: 'timestamp_ms' })\n\t\t.notNull().default(sql`current_timestamp`),\n});\nexport const commentsConfig = relations(commentsTable, ({ one, many }) => ({\n\tpost: one(postsTable, {\n\t\tfields: [commentsTable.postId],\n\t\treferences: [postsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentsTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n\tlikes: many(commentLikesTable),\n}));\n\nexport const commentLikesTable = sqliteTable('comment_likes', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcreator: integer('creator', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tcommentId: integer('comment_id', { mode: 'number' }).references(\n\t\t() => commentsTable.id,\n\t),\n\tcreatedAt: integer('created_at', { mode: 'timestamp_ms' })\n\t\t.notNull().default(sql`current_timestamp`),\n});\nexport const commentLikesConfig = relations(commentLikesTable, ({ one }) => ({\n\tcomment: one(commentsTable, {\n\t\tfields: [commentLikesTable.commentId],\n\t\treferences: [commentsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentLikesTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n"
  },
  {
    "path": "integration-tests/tests/relational/tables.ts",
    "content": "import { relations } from 'drizzle-orm';\nimport { foreignKey, int, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const users = sqliteTable('users', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: int('city_id').references(() => cities.id).notNull(),\n\thomeCityId: int('home_city_id').references(() => cities.id),\n\tcreatedAt: integer('created_at', { mode: 'timestamp' }).notNull(),\n});\nexport const usersConfig = relations(users, ({ one, many }) => ({\n\tcity: one(cities, { relationName: 'UsersInCity', fields: [users.cityId], references: [cities.id] }),\n\thomeCity: one(cities, { fields: [users.homeCityId], references: [cities.id] }),\n\tposts: many(posts),\n\tcomments: many(comments),\n}));\n\nexport const cities = sqliteTable('cities', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n});\nexport const citiesConfig = relations(cities, ({ many }) => ({\n\tusers: many(users, { relationName: 'UsersInCity' }),\n}));\n\nexport const posts = sqliteTable('posts', {\n\tid: integer('id').primaryKey(),\n\ttitle: text('title').notNull(),\n\tauthorId: int('author_id').references(() => users.id),\n});\nexport const postsConfig = relations(posts, ({ one, many }) => ({\n\tauthor: one(users, { fields: [posts.authorId], references: [users.id] }),\n\tcomments: many(comments),\n}));\n\nexport const comments = sqliteTable('comments', {\n\tid: integer('id').primaryKey(),\n\tpostId: int('post_id').references(() => posts.id).notNull(),\n\tauthorId: int('author_id').references(() => users.id),\n\ttext: text('text').notNull(),\n});\nexport const commentsConfig = relations(comments, ({ one }) => ({\n\tpost: one(posts, { fields: [comments.postId], references: [posts.id] }),\n\tauthor: one(users, { fields: [comments.authorId], references: [users.id] }),\n}));\n\nexport const books = sqliteTable('books', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n});\nexport const booksConfig = relations(books, ({ many }) => ({\n\tauthors: many(bookAuthors),\n}));\n\nexport const bookAuthors = sqliteTable('book_authors', {\n\tbookId: int('book_id').references(() => books.id).notNull(),\n\tauthorId: int('author_id').references(() => users.id).notNull(),\n\trole: text('role').notNull(),\n});\nexport const bookAuthorsConfig = relations(bookAuthors, ({ one }) => ({\n\tbook: one(books, { fields: [bookAuthors.bookId], references: [books.id] }),\n\tauthor: one(users, { fields: [bookAuthors.authorId], references: [users.id] }),\n}));\n\nexport const node = sqliteTable('node', {\n\tid: integer('id').primaryKey(),\n\tparentId: int('parent_id'),\n\tleftId: int('left_id'),\n\trightId: int('right_id'),\n}, (node) => ({\n\tfk1: foreignKey(() => ({ columns: [node.parentId], foreignColumns: [node.id] })),\n\tfk2: foreignKey(() => ({ columns: [node.leftId], foreignColumns: [node.id] })),\n\tfk3: foreignKey(() => ({ columns: [node.rightId], foreignColumns: [node.id] })),\n}));\nexport const nodeRelations = relations(node, ({ one }) => ({\n\tparent: one(node, { fields: [node.parentId], references: [node.id] }),\n\tleft: one(node, { fields: [node.leftId], references: [node.id] }),\n\tright: one(node, { fields: [node.rightId], references: [node.id] }),\n}));\n"
  },
  {
    "path": "integration-tests/tests/relational/turso.test.ts",
    "content": "import 'dotenv/config';\nimport { type Client, createClient } from '@libsql/client';\nimport { desc, DrizzleError, eq, gt, gte, or, placeholder, sql, TransactionRollbackError } from 'drizzle-orm';\nimport { drizzle, type LibSQLDatabase } from 'drizzle-orm/libsql';\nimport { beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\nimport * as schema from './sqlite.schema.ts';\n\nconst { usersTable, postsTable, commentsTable, usersToGroupsTable, groupsTable } = schema;\n\nconst ENABLE_LOGGING = false;\n\n/*\n\tTest cases:\n\t- querying nested relation without PK with additional fields\n*/\n\nlet db: LibSQLDatabase<typeof schema>;\n\nbeforeAll(async () => {\n\tconst url = process.env['LIBSQL_URL'];\n\tconst authToken = process.env['LIBSQL_AUTH_TOKEN'];\n\tif (!url) {\n\t\tthrow new Error('LIBSQL_URL is not set');\n\t}\n\tconst sleep = 250;\n\tlet timeLeft = 5000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tlet client: Client;\n\tdo {\n\t\ttry {\n\t\t\tclient = createClient({ url, authToken });\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to libsql');\n\t\tthrow lastError;\n\t}\n\tdb = drizzle(client!, { logger: ENABLE_LOGGING, schema });\n});\n\nbeforeEach(async () => {\n\tawait db.run(sql`drop table if exists \\`groups\\``);\n\tawait db.run(sql`drop table if exists \\`users\\``);\n\tawait db.run(sql`drop table if exists \\`users_to_groups\\``);\n\tawait db.run(sql`drop table if exists \\`posts\\``);\n\tawait db.run(sql`drop table if exists \\`comments\\``);\n\tawait db.run(sql`drop table if exists \\`comment_likes\\``);\n\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`users\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`name\\` text NOT NULL,\n\t\t\t    \\`verified\\` integer DEFAULT 0 NOT NULL,\n\t\t\t    \\`invited_by\\` integer\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`groups\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`name\\` text NOT NULL,\n\t\t\t    \\`description\\` text\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`users_to_groups\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`user_id\\` integer NOT NULL,\n\t\t\t    \\`group_id\\` integer NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`posts\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`content\\` text NOT NULL,\n\t\t\t    \\`owner_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`comments\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`content\\` text NOT NULL,\n\t\t\t    \\`creator\\` integer,\n\t\t\t    \\`post_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`comment_likes\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`creator\\` integer,\n\t\t\t    \\`comment_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n});\n\n/*\n\t[Find Many] One relation users+posts\n*/\n\ntest('[Find Many] Get users with posts', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts and users', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tlowerName: 'dan',\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.2',\n\t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n\t\t}, { id: 3, ownerId: 1, content: 'Post1.3', createdAt: usersWithPosts[0]?.posts[2]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlowerName: 'andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 5,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlowerName: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields + limits', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\n// TODO check order\ntest.skip('[Find Many] Get users with posts + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(2);\n\texpect(usersWithPosts[1]?.posts.length).eq(2);\n\texpect(usersWithPosts[2]?.posts.length).eq(3);\n\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: '1', createdAt: usersWithPosts[2]?.posts[2]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: '2',\n\t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n\t\t}, { id: 3, ownerId: 1, content: '3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 2,\n\t\t\tcontent: '5',\n\t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n\t\t}, { id: 4, ownerId: 2, content: '4', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: '7',\n\t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n\t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial. Did not select posts id, but used it in where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(true + false)', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tposts: {\n\t\t\tid: number;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(false)', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in transaction', async () => {\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.insert(usersTable).values([\n\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t{ id: 3, name: 'Alex' },\n\t\t]).run();\n\n\t\tawait tx.insert(postsTable).values([\n\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t]).run();\n\n\t\tusersWithPosts = await tx.query.usersTable.findMany({\n\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in rollbacked transaction', async () => {\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\texpect(db.transaction(async (tx) => {\n\t\tawait tx.insert(usersTable).values([\n\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t{ id: 3, name: 'Alex' },\n\t\t]).run();\n\n\t\tawait tx.insert(postsTable).values([\n\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t]).run();\n\n\t\tawait tx.rollback();\n\n\t\tusersWithPosts = await tx.query.usersTable.findMany({\n\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t})).rejects.toThrowError(new TransactionRollbackError());\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(0);\n});\n\n// select only custom\ntest('[Find Many] Get only custom fields', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 1, content: 'Post1.2' },\n\t\t{ id: 3, ownerId: 1, content: 'Post1.3' },\n\t\t{ id: 4, ownerId: 2, content: 'Post2' },\n\t\t{ id: 5, ownerId: 2, content: 'Post2.1' },\n\t\t{ id: 6, ownerId: 3, content: 'Post3' },\n\t\t{ id: 7, ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts[0]?.lowerName).toEqual('dan');\n\texpect(usersWithPosts[1]?.lowerName).toEqual('andrew');\n\texpect(usersWithPosts[2]?.lowerName).toEqual('alex');\n\n\texpect(usersWithPosts[0]?.posts).toContainEqual({\n\t\tlowerName: 'post1',\n\t});\n\n\texpect(usersWithPosts[0]?.posts).toContainEqual({\n\t\tlowerName: 'post1.2',\n\t});\n\n\texpect(usersWithPosts[0]?.posts).toContainEqual({\n\t\tlowerName: 'post1.3',\n\t});\n\n\texpect(usersWithPosts[1]?.posts).toContainEqual({\n\t\tlowerName: 'post2',\n\t});\n\n\texpect(usersWithPosts[1]?.posts).toContainEqual({\n\t\tlowerName: 'post2.1',\n\t});\n\n\texpect(usersWithPosts[2]?.posts).toContainEqual({\n\t\tlowerName: 'post3',\n\t});\n\n\texpect(usersWithPosts[2]?.posts).toContainEqual({\n\t\tlowerName: 'post3.1',\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// select only custom find one\ntest('[Find One] Get only custom fields', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(3);\n\n\texpect(usersWithPosts?.lowerName).toEqual('dan');\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tlowerName: 'post1',\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tlowerName: 'post1.2',\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tlowerName: 'post1.3',\n\t});\n});\n\ntest('[Find One] Get only custom fields + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// columns {}\ntest('[Find Many] Get select {}', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findMany({\n\t\t\tcolumns: {},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// columns {}\ntest('[Find One] Get select {}', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findFirst({\n\t\t\tcolumns: {},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// deep select {}\ntest('[Find Many] Get deep select {}', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findMany({\n\t\t\tcolumns: {},\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\tcolumns: {},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n// deep select {}\ntest('[Find One] Get deep select {}', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tawait expect(async () =>\n\t\tawait db.query.usersTable.findFirst({\n\t\t\tcolumns: {},\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\tcolumns: {},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t).rejects.toThrow(DrizzleError);\n});\n\n/*\n\tPrepared statements for users+posts\n*/\ntest('[Find Many] Get users with posts + prepared limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('limit'),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = await prepared.all({ limit: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared limit + offset', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = await prepared.all({ pLimit: 1, uLimit: 3, uOffset: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, placeholder('id'))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = await prepared.all({ id: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared + limit + offset + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twhere: (({ id }, { eq, or }) => or(eq(id, placeholder('id')), eq(id, 3))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, placeholder('pid'))),\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare();\n\n\tconst usersWithPosts = await prepared.all({ pLimit: 1, uLimit: 3, uOffset: 1, id: 2, pid: 6 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\t[Find One] One relation users+posts\n*/\n\ntest('[Find One] Get users with posts', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + limit posts', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts no results found', async () => {\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts).toBeUndefined();\n});\n\ntest('[Find One] Get users with posts + limit posts and users', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(3);\n\n\texpect(usersWithPosts?.lowerName).toEqual('dan');\n\texpect(usersWithPosts?.id).toEqual(1);\n\texpect(usersWithPosts?.verified).toEqual(0);\n\texpect(usersWithPosts?.invitedBy).toEqual(null);\n\texpect(usersWithPosts?.name).toEqual('Dan');\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tid: 1,\n\t\townerId: 1,\n\t\tcontent: 'Post1',\n\t\tcreatedAt: usersWithPosts?.posts[0]?.createdAt,\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tid: 2,\n\t\townerId: 1,\n\t\tcontent: 'Post1.2',\n\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t});\n\n\texpect(usersWithPosts?.posts).toContainEqual({\n\t\tid: 3,\n\t\townerId: 1,\n\t\tcontent: 'Post1.3',\n\t\tcreatedAt: usersWithPosts?.posts[2]?.createdAt,\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields + limits', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\n// TODO. Check order\ntest.skip('[Find One] Get users with posts + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.id)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: '7',\n\t\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial. Did not select posts id, but used it in where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(true + false)', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(false)', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\tOne relation users+users. Self referencing\n*/\n\ntest('Get user with invitee', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: 0, invitedBy: null },\n\t});\n});\n\ntest('Get user + limit with invitee', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew', invitedBy: 1 },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t\tlimit: 2,\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: 0, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: 0, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields + limits', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(3);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: 0, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + order by', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[3]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: 0, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: 0, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where + partial', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial.  Did not select users id, but used it in where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(true+false)', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t\tverified: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(false)', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tname: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, verified: 0, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, verified: 0, invitedBy: null },\n\t});\n});\n\n/*\n\tTwo first-level relations users+users and users+posts\n*/\n\ntest('Get user with invitee and posts', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: 0, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + limits + custom fields in each', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_invitee_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_content') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: 0, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + custom fields in each', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\tresponse[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tresponse[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tresponse[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(2);\n\texpect(response[1]?.posts.length).eq(2);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.1',\n\t\t\tlower: 'post1.1',\n\t\t\tcreatedAt: response[0]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 4,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tlower: 'post2.1',\n\t\t\tcreatedAt: response[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: 0, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 6,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tlower: 'post3.1',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: 0, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\n// TODO Check order\ntest.skip('Get user with invitee and posts + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\torderBy: (posts, { desc }) => [desc(posts.id)],\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(4);\n\n\texpect(response[3]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(2);\n\n\texpect(response[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 1, content: 'Post1.1', createdAt: response[3]?.posts[0]?.createdAt }, {\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2.1', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 3,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: 0, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 2), eq(users.id, 3))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 2)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(2);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 3)),\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(1);\n\n\texpect(response[0]?.invitee).not.toBeNull();\n\texpect(response[0]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + custom', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: 0,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: 0, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + partial + custom', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; content: string }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan' },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew' },\n\t\tposts: [],\n\t});\n});\n\n/*\n\tOne two-level relation users+posts+comments\n*/\n\ntest('Get user with posts and posts with comments', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcomments: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tcontent: string;\n\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t\tcreator: number | null;\n\t\t\t\t\tpostId: number | null;\n\t\t\t\t}[];\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\t// expect(response[2]).toEqual({\n\t// \tid: 3,\n\t// \tname: 'Alex',\n\t// \tverified: 0,\n\t// \tinvitedBy: null,\n\t// \tposts: [{\n\t// \t\tid: 3,\n\t// \t\townerId: 3,\n\t// \t\tcontent: 'Post3',\n\t// \t\tcreatedAt: response[2]?.posts[0]?.createdAt,\n\t// \t\tcomments: [\n\t// \t\t\t{\n\t// \t\t\t\tid: ,\n\t// \t\t\t\tcontent: 'Comment3',\n\t// \t\t\t\tcreator: 3,\n\t// \t\t\t\tpostId: 3,\n\t// \t\t\t\tcreatedAt: response[2]?.posts[0]?.comments[0]?.createdAt,\n\t// \t\t\t},\n\t// \t\t],\n\t// \t}],\n\t// });\n});\n\n// Get user with limit posts and limit comments\n\n// Get user with custom field + post + comment with custom field\n\n// Get user with limit + posts orderBy + comment orderBy\n\n// Get user with where + posts where + comment where\n\n// Get user with where + posts partial where + comment where\n\n// Get user with where + posts partial where + comment partial(false) where\n\n// Get user with where partial(false) + posts partial where partial(false) + comment partial(false+true) where\n\n// Get user with where + posts partial where + comment where. Didn't select field from where in posts\n\n// Get user with where + posts partial where + comment where. Didn't select field from where for all\n\n// Get with limit+offset in each\n\n/*\n\tOne two-level + One first-level relation users+posts+comments and users+users\n*/\n\n/*\n\tOne three-level relation users+posts+comments+comment_owner\n*/\n\ntest('Get user with posts and posts with comments and comments with owner', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]).run();\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tcomments: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcreator: number | null;\n\t\t\t\tpostId: number | null;\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: 0,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: 0,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n});\n\n/*\n\tOne three-level relation + 1 first-level relatioon\n\t1. users+posts+comments+comment_owner\n\t2. users+users\n*/\n\n/*\n\tOne four-level relation users+posts+comments+coment_likes\n*/\n\n/*\n\t[Find Many] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find Many] Get users with groups', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\torderBy: usersToGroupsTable.groupId,\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\tlimit: 1,\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(0);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(2);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: number;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\n/*\n\t[Find One] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find One] Get users with groups', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find One] Get groups with users + where', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + orderBy', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get groups with users + orderBy + limit', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get users with groups + custom', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.usersTable.findMany({\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: {\n\t\t\t\t\t\textras: {\n\t\t\t\t\t\t\tlower: sql<string>`lower(${groupsTable.name})`.as('lower_name'),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\tresponse[0]?.usersToGroups.sort((a, b) => (a.group.id > b.group.id) ? 1 : -1);\n\tresponse[1]?.usersToGroups.sort((a, b) => (a.group.id > b.group.id) ? 1 : -1);\n\tresponse[2]?.usersToGroups.sort((a, b) => (a.group.id > b.group.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tlower: 'group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tlower: 'group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: 0,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tlower: 'group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tlower: 'group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get groups with users + custom', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]).run();\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]).run();\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]).run();\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\textras: (table, { sql }) => ({\n\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t}),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: {\n\t\t\t\t\t\textras: (table, { sql }) => ({\n\t\t\t\t\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: number;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tlower: 'group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tlower: 'dan',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tlower: 'group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tlower: 'andrew',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tlower: 'group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: 0,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('async api', async () => {\n\tawait db.insert(usersTable).values([{ id: 1, name: 'Dan' }]);\n\tconst users = await db.query.usersTable.findMany();\n\texpect(users).toEqual([{ id: 1, name: 'Dan', verified: 0, invitedBy: null }]);\n});\n\ntest('async api - prepare', async () => {\n\tconst insertStmt = db.insert(usersTable).values([{ id: 1, name: 'Dan' }]).prepare();\n\tawait insertStmt.execute();\n\tconst queryStmt = db.query.usersTable.findMany().prepare();\n\tconst users = await queryStmt.execute();\n\texpect(users).toEqual([{ id: 1, name: 'Dan', verified: 0, invitedBy: null }]);\n});\n\ntest('.toSQL()', () => {\n\tconst query = db.query.usersTable.findFirst().toSQL();\n\n\texpect(query).toHaveProperty('sql', expect.any(String));\n\texpect(query).toHaveProperty('params', expect.any(Array));\n});\n\n// + custom + where + orderby\n\n// + custom + where + orderby + limit\n\n// + partial\n\n// + partial(false)\n\n// + partial + orderBy + where (all not selected)\n\n/*\n\tOne four-level relation users+posts+comments+coment_likes\n\t+ users+users_to_groups+groups\n*/\n\n/*\n\tReally hard case\n\t1. users+posts+comments+coment_likes\n\t2. users+users_to_groups+groups\n\t3. users+users\n*/\n"
  },
  {
    "path": "integration-tests/tests/relational/vercel.test.ts",
    "content": "import 'dotenv/config';\nimport { createClient, type VercelClient } from '@vercel/postgres';\nimport Docker from 'dockerode';\nimport { desc, eq, gt, gte, or, placeholder, sql, TransactionRollbackError } from 'drizzle-orm';\nimport { drizzle, type VercelPgDatabase } from 'drizzle-orm/vercel-postgres';\nimport getPort from 'get-port';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\nimport * as schema from './pg.schema.ts';\n\nconst { usersTable, postsTable, commentsTable, usersToGroupsTable, groupsTable } = schema;\n\nconst ENABLE_LOGGING = false;\n\n/*\n\tTest cases:\n\t- querying nested relation without PK with additional fields\n*/\n\ndeclare module 'vitest' {\n\texport interface TestContext {\n\t\tdocker: Docker;\n\t\tvpgContainer: Docker.Container;\n\t\tvpgDb: VercelPgDatabase<typeof schema>;\n\t\tvpgClient: VercelClient;\n\t}\n}\n\nlet globalDocker: Docker;\nlet pgContainer: Docker.Container;\nlet db: VercelPgDatabase<typeof schema>;\nlet client: VercelClient;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = (globalDocker = new Docker());\n\tconst port = await getPort({ port: 5432 });\n\tconst image = 'postgres:14';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tpgContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: [\n\t\t\t'POSTGRES_PASSWORD=postgres',\n\t\t\t'POSTGRES_USER=postgres',\n\t\t\t'POSTGRES_DB=postgres',\n\t\t],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'5432/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait pgContainer.start();\n\n\treturn `postgres://postgres:postgres@localhost:${port}/postgres`;\n}\n\nbeforeAll(async () => {\n\tconst connectionString = process.env['PG_CONNECTION_STRING'] ?? (await createDockerDB());\n\n\tconst sleep = 250;\n\tlet timeLeft = 5000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = createClient({ connectionString });\n\t\t\tawait client.connect();\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to Postgres');\n\t\tawait client?.end().catch(console.error);\n\t\tawait pgContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\tdb = drizzle(client, { schema, logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait pgContainer?.stop().catch(console.error);\n});\n\nbeforeEach(async (ctx) => {\n\tctx.vpgDb = db;\n\tctx.vpgClient = client;\n\tctx.docker = globalDocker;\n\tctx.vpgContainer = pgContainer;\n\n\tawait ctx.vpgDb.execute(sql`drop schema public cascade`);\n\tawait ctx.vpgDb.execute(sql`create schema public`);\n\tawait ctx.vpgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE \"users\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"name\" text NOT NULL,\n\t\t\t\t\"verified\" boolean DEFAULT false NOT NULL,\n\t\t\t\t\"invited_by\" int REFERENCES \"users\"(\"id\")\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.vpgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"groups\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"name\" text NOT NULL,\n\t\t\t\t\"description\" text\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.vpgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"users_to_groups\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"user_id\" int REFERENCES \"users\"(\"id\"),\n\t\t\t\t\"group_id\" int REFERENCES \"groups\"(\"id\")\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.vpgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"posts\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"content\" text NOT NULL,\n\t\t\t\t\"owner_id\" int REFERENCES \"users\"(\"id\"),\n\t\t\t\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.vpgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"comments\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"content\" text NOT NULL,\n\t\t\t\t\"creator\" int REFERENCES \"users\"(\"id\"),\n\t\t\t\t\"post_id\" int REFERENCES \"posts\"(\"id\"),\n\t\t\t\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait ctx.vpgDb.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"comment_likes\" (\n\t\t\t\t\"id\" serial PRIMARY KEY NOT NULL,\n\t\t\t\t\"creator\" int REFERENCES \"users\"(\"id\"),\n\t\t\t\t\"comment_id\" int REFERENCES \"comments\"(\"id\"),\n\t\t\t\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n});\n\n/*\n\t[Find Many] One relation users+posts\n*/\n\ntest('[Find Many] Get users with posts', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + limit posts and users', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\tusersWithPosts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[0]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[1]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\tusersWithPosts[2]?.posts.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tlowerName: 'dan',\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.2',\n\t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n\t\t}, { id: 3, ownerId: 1, content: 'Post1.3', createdAt: usersWithPosts[0]?.posts[2]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlowerName: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 5,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlowerName: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with posts + custom fields + limits', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + orderBy', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(2);\n\texpect(usersWithPosts[1]?.posts.length).eq(2);\n\texpect(usersWithPosts[2]?.posts.length).eq(3);\n\n\texpect(usersWithPosts[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 3, ownerId: 1, content: '3', createdAt: usersWithPosts[2]?.posts[2]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: '2',\n\t\t\tcreatedAt: usersWithPosts[2]?.posts[1]?.createdAt,\n\t\t}, { id: 1, ownerId: 1, content: '1', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 2,\n\t\t\tcontent: '5',\n\t\t\tcreatedAt: usersWithPosts[1]?.posts[1]?.createdAt,\n\t\t}, { id: 4, ownerId: 2, content: '4', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: '7',\n\t\t\tcreatedAt: usersWithPosts[0]?.posts[1]?.createdAt,\n\t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial. Did not select posts id, but used it in where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(true + false)', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tposts: {\n\t\t\tid: number;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + where + partial(false)', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in transaction', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.insert(usersTable).values([\n\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t{ id: 3, name: 'Alex' },\n\t\t]);\n\n\t\tawait tx.insert(postsTable).values([\n\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t]);\n\n\t\tusersWithPosts = await tx.query.usersTable.findMany({\n\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts in rollbacked transaction', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tlet usersWithPosts: {\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[] = [];\n\n\tawait expect(db.transaction(async (tx) => {\n\t\tawait tx.insert(usersTable).values([\n\t\t\t{ id: 1, name: 'Dan' },\n\t\t\t{ id: 2, name: 'Andrew' },\n\t\t\t{ id: 3, name: 'Alex' },\n\t\t]);\n\n\t\tawait tx.insert(postsTable).values([\n\t\t\t{ ownerId: 1, content: 'Post1' },\n\t\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t\t{ ownerId: 2, content: 'Post2' },\n\t\t\t{ ownerId: 3, content: 'Post3' },\n\t\t]);\n\n\t\ttx.rollback();\n\n\t\tusersWithPosts = await tx.query.usersTable.findMany({\n\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\twith: {\n\t\t\t\tposts: {\n\t\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t})).rejects.toThrowError(new TransactionRollbackError());\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(0);\n});\n\n// select only custom\ntest('[Find Many] Get only custom fields', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(3);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(3);\n\texpect(usersWithPosts[1]?.posts.length).toEqual(2);\n\texpect(usersWithPosts[2]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1' }, {\n\t\t\tlowerName: 'post1.2',\n\t\t}, { lowerName: 'post1.3' }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'andrew',\n\t\tposts: [{ lowerName: 'post2' }, {\n\t\t\tlowerName: 'post2.1',\n\t\t}],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'alex',\n\t\tposts: [{ lowerName: 'post3' }, {\n\t\t\tlowerName: 'post3.1',\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + limit', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find Many] Get only custom fields + where + orderBy', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tlowerName: string;\n\t\tposts: {\n\t\t\tlowerName: string;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).toEqual(1);\n\texpect(usersWithPosts[0]?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// select only custom find one\ntest('[Find One] Get only custom fields', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(3);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1' }, {\n\t\t\tlowerName: 'post1.2',\n\t\t}, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }, { lowerName: 'post1.3' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + limit', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.2' }],\n\t});\n});\n\ntest('[Find One] Get only custom fields + where + orderBy', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t\twhere: gte(postsTable.id, 2),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: ({ content }) => ({\n\t\t\t\t\tlowerName: sql<string>`lower(${content})`.as('content_lower'),\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\twhere: eq(usersTable.id, 1),\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tlowerName: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts?.posts.length).toEqual(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tlowerName: 'dan',\n\t\tposts: [{ lowerName: 'post1.3' }, { lowerName: 'post1.2' }],\n\t});\n});\n\n// columns {}\ntest('[Find Many] Get select {}', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tconst users = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t});\n\n\texpectTypeOf(users).toEqualTypeOf<{}[]>();\n\n\texpect(users.length).toBe(3);\n\n\texpect(users[0]).toEqual({});\n\texpect(users[1]).toEqual({});\n\texpect(users[2]).toEqual({});\n});\n\n// columns {}\ntest('[Find One] Get select {}', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tconst users = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t});\n\n\texpectTypeOf(users).toEqualTypeOf<{} | undefined>();\n\n\texpect(users).toEqual({});\n});\n\n// deep select {}\ntest('[Find Many] Get deep select {}', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst users = await db.query.usersTable.findMany({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(users).toEqualTypeOf<{ posts: {}[] }[]>();\n\n\texpect(users.length).toBe(3);\n\n\texpect(users[0]).toEqual({ posts: [{}] });\n\texpect(users[1]).toEqual({ posts: [{}] });\n\texpect(users[2]).toEqual({ posts: [{}] });\n});\n\n// deep select {}\ntest('[Find One] Get deep select {}', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst users = await db.query.usersTable.findFirst({\n\t\tcolumns: {},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(users).toEqualTypeOf<{ posts: {}[] } | undefined>();\n\n\texpect(users).toEqual({ posts: [{}] });\n});\n\n/*\n\tPrepared statements for users+posts\n*/\ntest('[Find Many] Get users with posts + prepared limit', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('limit'),\n\t\t\t},\n\t\t},\n\t}).prepare('query1');\n\n\tconst usersWithPosts = await prepared.execute({ limit: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(3);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\texpect(usersWithPosts[2]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared limit + offset', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare('query2');\n\n\tconst usersWithPosts = await prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(2);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\texpect(usersWithPosts[1]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[1]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\twhere: (({ id }, { eq }) => eq(id, placeholder('id'))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t}).prepare('query3');\n\n\tconst usersWithPosts = await prepared.execute({ id: 1 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find Many] Get users with posts + prepared + limit + offset + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst prepared = db.query.usersTable.findMany({\n\t\tlimit: placeholder('uLimit'),\n\t\toffset: placeholder('uOffset'),\n\t\twhere: (({ id }, { eq, or }) => or(eq(id, placeholder('id')), eq(id, 3))),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, placeholder('pid'))),\n\t\t\t\tlimit: placeholder('pLimit'),\n\t\t\t},\n\t\t},\n\t}).prepare('query4');\n\n\tconst usersWithPosts = await prepared.execute({ pLimit: 1, uLimit: 3, uOffset: 1, id: 2, pid: 6 });\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t}[];\n\t}[]>();\n\n\texpect(usersWithPosts.length).eq(1);\n\texpect(usersWithPosts[0]?.posts.length).eq(1);\n\n\texpect(usersWithPosts).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 6, ownerId: 3, content: 'Post3', createdAt: usersWithPosts[0]?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\t[Find One] One relation users+posts\n*/\n\ntest('[Find One] Get users with posts', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + limit posts', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts no results found', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts).toBeUndefined();\n});\n\ntest('[Find One] Get users with posts + limit posts and users', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: true,\n\t\t},\n\t\textras: ({ name }) => ({\n\t\t\tlowerName: sql<string>`lower(${name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(3);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tlowerName: 'dan',\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.2',\n\t\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t\t}, { id: 3, ownerId: 1, content: 'Post1.3', createdAt: usersWithPosts?.posts[2]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + custom fields + limits', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.2' },\n\t\t{ ownerId: 1, content: 'Post1.3' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t\textras: (usersTable, { sql }) => ({\n\t\t\tlowerName: sql<string>`lower(${usersTable.name})`.as('name_lower'),\n\t\t}),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlowerName: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).toEqual(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlowerName: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + orderBy', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: '1' },\n\t\t{ ownerId: 1, content: '2' },\n\t\t{ ownerId: 1, content: '3' },\n\t\t{ ownerId: 2, content: '4' },\n\t\t{ ownerId: 2, content: '5' },\n\t\t{ ownerId: 3, content: '6' },\n\t\t{ ownerId: 3, content: '7' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\torderBy: (postsTable, { desc }) => [desc(postsTable.content)],\n\t\t\t},\n\t\t},\n\t\torderBy: (usersTable, { desc }) => [desc(usersTable.id)],\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(2);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 7,\n\t\t\townerId: 3,\n\t\t\tcontent: '7',\n\t\t\tcreatedAt: usersWithPosts?.posts[1]?.createdAt,\n\t\t}, { id: 6, ownerId: 3, content: '6', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial. Did not select posts id, but used it in where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tposts: [{ id: 1, content: 'Post1' }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(true + false)', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tposts: [{ id: 1 }],\n\t});\n});\n\ntest('[Find One] Get users with posts + where + partial(false)', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst usersWithPosts = await db.query.usersTable.findFirst({\n\t\tcolumns: {\n\t\t\tname: false,\n\t\t},\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tcontent: false,\n\t\t\t\t},\n\t\t\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t\t\t},\n\t\t},\n\t\twhere: (({ id }, { eq }) => eq(id, 1)),\n\t});\n\n\texpectTypeOf(usersWithPosts).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(usersWithPosts!.posts.length).eq(1);\n\n\texpect(usersWithPosts).toEqual({\n\t\tid: 1,\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{ id: 1, ownerId: 1, createdAt: usersWithPosts?.posts[0]?.createdAt }],\n\t});\n});\n\n/*\n\tOne relation users+users. Self referencing\n*/\n\ntest('Get user with invitee', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user + limit with invitee', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew', invitedBy: 1 },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t\tlimit: 2,\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[3]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee and custom fields + limits', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (invitee, { sql }) => ({ lower: sql<string>`lower(${invitee.name})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tlower: string;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tusersWithInvitee.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(usersWithInvitee.length).eq(3);\n\texpect(usersWithInvitee[0]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + order by', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(4);\n\texpect(usersWithInvitee[3]?.invitee).toBeNull();\n\texpect(usersWithInvitee[2]?.invitee).toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t});\n\texpect(usersWithInvitee[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t});\n});\n\ntest('Get user with invitee + where + partial', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial.  Did not select users id, but used it in where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(true+false)', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t\tverified: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitee: { id: 1, name: 'Dan' },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitee: { id: 2, name: 'Andrew' },\n\t});\n});\n\ntest('Get user with invitee + where + partial(false)', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tconst usersWithInvitee = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tcolumns: {\n\t\t\tverified: false,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tname: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(usersWithInvitee).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(usersWithInvitee.length).eq(2);\n\texpect(usersWithInvitee[0]?.invitee).not.toBeNull();\n\texpect(usersWithInvitee[1]?.invitee).not.toBeNull();\n\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, verified: false, invitedBy: null },\n\t});\n\texpect(usersWithInvitee).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, verified: false, invitedBy: null },\n\t});\n});\n\n/*\n\tTwo first-level relations users+users and users+posts\n*/\n\ntest('Get user with invitee and posts', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: true,\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 3, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + limits + custom fields in each', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 3,\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_invitee_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tlimit: 1,\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_content') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + custom fields in each', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\textras: (users, { sql }) => ({ lower: sql<string>`lower(${users.name})`.as('lower_name') }),\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\textras: (posts, { sql }) => ({ lower: sql<string>`lower(${posts.content})`.as('lower_name') }),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tlower: string;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(4);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).not.toBeNull();\n\texpect(response[3]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(2);\n\texpect(response[1]?.posts.length).eq(2);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 1, ownerId: 1, content: 'Post1', lower: 'post1', createdAt: response[0]?.posts[0]?.createdAt }, {\n\t\t\tid: 2,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1.1',\n\t\t\tlower: 'post1.1',\n\t\t\tcreatedAt: response[0]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 3, ownerId: 2, content: 'Post2', lower: 'post2', createdAt: response[1]?.posts[0]?.createdAt }, {\n\t\t\tid: 4,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2.1',\n\t\t\tlower: 'post2.1',\n\t\t\tcreatedAt: response[1]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', lower: 'post3', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 6,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3.1',\n\t\t\tlower: 'post3.1',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\torderBy: (posts, { desc }) => [desc(posts.id)],\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(4);\n\n\texpect(response[3]?.invitee).toBeNull();\n\texpect(response[2]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(2);\n\texpect(response[3]?.posts.length).eq(2);\n\n\texpect(response[3]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 1, content: 'Post1.1', createdAt: response[3]?.posts[0]?.createdAt }, {\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[2]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 4, ownerId: 2, content: 'Post2.1', createdAt: response[2]?.posts[0]?.createdAt }, {\n\t\t\tid: 3,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[2]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tcreatedAt: response[3]?.posts[1]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 2), eq(users.id, 3))),\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 2)),\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(2);\n\n\texpect(response[0]?.invitee).toBeNull();\n\texpect(response[1]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tinvitee: null,\n\t\tposts: [{ id: 2, ownerId: 2, content: 'Post2', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + limit posts and users + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t\t{ ownerId: 3, content: 'Post3.1' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (users, { eq, or }) => (or(eq(users.id, 3), eq(users.id, 4))),\n\t\tlimit: 1,\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: (posts, { eq }) => (eq(posts.ownerId, 3)),\n\t\t\t\tlimit: 1,\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: { id: number; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(1);\n\n\texpect(response[0]?.invitee).not.toBeNull();\n\texpect(response[0]?.posts.length).eq(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{ id: 5, ownerId: 3, content: 'Post3', createdAt: response[0]?.posts[0]?.createdAt }],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + custom', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tinvitee: true,\n\t\t\tposts: {\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; ownerId: number | null; content: string; createdAt: Date }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: 1,\n\t\tinvitee: { id: 1, name: 'Dan', verified: false, invitedBy: null },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\townerId: 3,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tverified: false,\n\t\tinvitedBy: 2,\n\t\tinvitee: { id: 2, name: 'Andrew', verified: false, invitedBy: null },\n\t\tposts: [],\n\t});\n});\n\ntest('Get user with invitee and posts + orderBy + where + partial + custom', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex', invitedBy: 1 },\n\t\t{ id: 4, name: 'John', invitedBy: 2 },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ ownerId: 1, content: 'Post1' },\n\t\t{ ownerId: 1, content: 'Post1.1' },\n\t\t{ ownerId: 2, content: 'Post2' },\n\t\t{ ownerId: 2, content: 'Post2.1' },\n\t\t{ ownerId: 3, content: 'Post3' },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: [desc(usersTable.id)],\n\t\twhere: or(eq(usersTable.id, 3), eq(usersTable.id, 4)),\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\tcolumns: {\n\t\t\tid: true,\n\t\t\tname: true,\n\t\t},\n\t\twith: {\n\t\t\tinvitee: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tname: true,\n\t\t\t\t},\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t\tposts: {\n\t\t\t\tcolumns: {\n\t\t\t\t\tid: true,\n\t\t\t\t\tcontent: true,\n\t\t\t\t},\n\t\t\t\twhere: eq(postsTable.ownerId, 3),\n\t\t\t\torderBy: [desc(postsTable.id)],\n\t\t\t\textras: {\n\t\t\t\t\tlower: sql<string>`lower(${postsTable.content})`.as('lower_name'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tlower: string;\n\t\t\tposts: { id: number; lower: string; content: string }[];\n\t\t\tinvitee: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tlower: string;\n\t\t\t} | null;\n\t\t}[]\n\t>();\n\n\texpect(response.length).eq(2);\n\n\texpect(response[1]?.invitee).not.toBeNull();\n\texpect(response[0]?.invitee).not.toBeNull();\n\n\texpect(response[0]?.posts.length).eq(0);\n\texpect(response[1]?.posts.length).eq(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tinvitee: { id: 1, name: 'Dan', lower: 'dan' },\n\t\tposts: [{\n\t\t\tid: 5,\n\t\t\tcontent: 'Post3',\n\t\t\tlower: 'post3',\n\t\t}],\n\t});\n\texpect(response[0]).toEqual({\n\t\tid: 4,\n\t\tname: 'John',\n\t\tlower: 'john',\n\t\tinvitee: { id: 2, name: 'Andrew', lower: 'andrew' },\n\t\tposts: [],\n\t});\n});\n\n/*\n\tOne two-level relation users+posts+comments\n*/\n\ntest('Get user with posts and posts with comments', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tposts: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\townerId: number | null;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcomments: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tcontent: string;\n\t\t\t\t\tcreatedAt: Date;\n\t\t\t\t\tcreator: number | null;\n\t\t\t\t\tpostId: number | null;\n\t\t\t\t}[];\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\t// expect(response[2]).toEqual({\n\t// \tid: 3,\n\t// \tname: 'Alex',\n\t// \tverified: false,\n\t// \tinvitedBy: null,\n\t// \tposts: [{\n\t// \t\tid: 3,\n\t// \t\townerId: 3,\n\t// \t\tcontent: 'Post3',\n\t// \t\tcreatedAt: response[2]?.posts[0]?.createdAt,\n\t// \t\tcomments: [\n\t// \t\t\t{\n\t// \t\t\t\tid: ,\n\t// \t\t\t\tcontent: 'Comment3',\n\t// \t\t\t\tcreator: 3,\n\t// \t\t\t\tpostId: 3,\n\t// \t\t\t\tcreatedAt: response[2]?.posts[0]?.comments[0]?.createdAt,\n\t// \t\t\t},\n\t// \t\t],\n\t// \t}],\n\t// });\n});\n\n// Get user with limit posts and limit comments\n\n// Get user with custom field + post + comment with custom field\n\n// Get user with limit + posts orderBy + comment orderBy\n\n// Get user with where + posts where + comment where\n\n// Get user with where + posts partial where + comment where\n\n// Get user with where + posts partial where + comment partial(false) where\n\n// Get user with where partial(false) + posts partial where partial(false) + comment partial(false+true) where\n\n// Get user with where + posts partial where + comment where. Didn't select field from where in posts\n\n// Get user with where + posts partial where + comment where. Didn't select field from where for all\n\n// Get with limit+offset in each\n\n/*\n\tOne two-level + One first-level relation users+posts+comments and users+users\n*/\n\n/*\n\tOne three-level relation users+posts+comments+comment_owner\n*/\n\ntest('Get user with posts and posts with comments and comments with owner', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(postsTable).values([\n\t\t{ id: 1, ownerId: 1, content: 'Post1' },\n\t\t{ id: 2, ownerId: 2, content: 'Post2' },\n\t\t{ id: 3, ownerId: 3, content: 'Post3' },\n\t]);\n\n\tawait db.insert(commentsTable).values([\n\t\t{ postId: 1, content: 'Comment1', creator: 2 },\n\t\t{ postId: 2, content: 'Comment2', creator: 2 },\n\t\t{ postId: 3, content: 'Comment3', creator: 3 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tposts: {\n\t\t\t\twith: {\n\t\t\t\t\tcomments: {\n\t\t\t\t\t\twith: {\n\t\t\t\t\t\t\tauthor: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tposts: {\n\t\t\tid: number;\n\t\t\tcontent: string;\n\t\t\townerId: number | null;\n\t\t\tcreatedAt: Date;\n\t\t\tcomments: {\n\t\t\t\tid: number;\n\t\t\t\tcontent: string;\n\t\t\t\tcreatedAt: Date;\n\t\t\t\tcreator: number | null;\n\t\t\t\tpostId: number | null;\n\t\t\t\tauthor: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t} | null;\n\t\t\t}[];\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).eq(3);\n\texpect(response[0]?.posts.length).eq(1);\n\texpect(response[1]?.posts.length).eq(1);\n\texpect(response[2]?.posts.length).eq(1);\n\n\texpect(response[0]?.posts[0]?.comments.length).eq(1);\n\texpect(response[1]?.posts[0]?.comments.length).eq(1);\n\texpect(response[2]?.posts[0]?.comments.length).eq(1);\n\n\texpect(response[0]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 1,\n\t\t\townerId: 1,\n\t\t\tcontent: 'Post1',\n\t\t\tcreatedAt: response[0]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tcontent: 'Comment1',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 1,\n\t\t\t\t\tcreatedAt: response[0]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tposts: [{\n\t\t\tid: 2,\n\t\t\townerId: 2,\n\t\t\tcontent: 'Post2',\n\t\t\tcreatedAt: response[1]?.posts[0]?.createdAt,\n\t\t\tcomments: [\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tcontent: 'Comment2',\n\t\t\t\t\tcreator: 2,\n\t\t\t\t\tauthor: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Andrew',\n\t\t\t\t\t\tverified: false,\n\t\t\t\t\t\tinvitedBy: null,\n\t\t\t\t\t},\n\t\t\t\t\tpostId: 2,\n\t\t\t\t\tcreatedAt: response[1]?.posts[0]?.comments[0]?.createdAt,\n\t\t\t\t},\n\t\t\t],\n\t\t}],\n\t});\n});\n\n/*\n\tOne three-level relation + 1 first-level relatioon\n\t1. users+posts+comments+comment_owner\n\t2. users+users\n*/\n\n/*\n\tOne four-level relation users+posts+comments+coment_likes\n*/\n\n/*\n\t[Find Many] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find Many] Get users with groups', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + limit + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\tlimit: 1,\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + limit + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\tlimit: 1,\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(1);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(0);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(2);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get groups with users + orderBy', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tdescription: string | null;\n\t\tusersToGroups: {\n\t\t\tuser: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tverified: boolean;\n\t\t\t\tinvitedBy: number | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[2]).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find Many] Get users with groups + orderBy + limit', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tinvitedBy: number | null;\n\t\tusersToGroups: {\n\t\t\tgroup: {\n\t\t\t\tid: number;\n\t\t\t\tname: string;\n\t\t\t\tdescription: string | null;\n\t\t\t};\n\t\t}[];\n\t}[]>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\n/*\n\t[Find One] Many-to-many cases\n\n\tUsers+users_to_groups+groups\n*/\n\ntest('[Find One] Get users with groups', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + limit + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 1),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + limit + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tlimit: 1,\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 2, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\twhere: (_, { eq, or }) => or(eq(usersTable.id, 1), eq(usersTable.id, 2)),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.groupId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(0);\n\n\texpect(response).toEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [],\n\t});\n});\n\ntest('[Find One] Get groups with users + where', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\twhere: gt(groupsTable.id, 1),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\twhere: eq(usersToGroupsTable.userId, 2),\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get groups with users + orderBy', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findFirst({\n\t\torderBy: [desc(groupsTable.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('[Find One] Get users with groups + orderBy + limit', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findFirst({\n\t\torderBy: (users, { desc }) => [desc(users.id)],\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: [desc(usersToGroupsTable.groupId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t} | undefined\n\t>();\n\n\texpect(response?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get groups with users + orderBy + limit', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\torderBy: [desc(groupsTable.id)],\n\t\tlimit: 2,\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tlimit: 1,\n\t\t\t\torderBy: (utg, { desc }) => [desc(utg.userId)],\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\texpect(response.length).toEqual(2);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\n\texpect(response[1]).toEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response[0]).toEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get users with groups + custom', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.usersTable.findMany({\n\t\textras: {\n\t\t\tlower: sql<string>`lower(${usersTable.name})`.as('lower_name'),\n\t\t},\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tgroup: {\n\t\t\t\t\t\textras: {\n\t\t\t\t\t\t\tlower: sql<string>`lower(${groupsTable.name})`.as('lower_name'),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: boolean;\n\t\t\tinvitedBy: number | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tgroup: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tdescription: string | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(1);\n\texpect(response[2]?.usersToGroups.length).toEqual(2);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Dan',\n\t\tlower: 'dan',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Group1',\n\t\t\t\tlower: 'group1',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Andrew',\n\t\tlower: 'andrew',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tlower: 'group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Alex',\n\t\tlower: 'alex',\n\t\tverified: false,\n\t\tinvitedBy: null,\n\t\tusersToGroups: [{\n\t\t\tgroup: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Group3',\n\t\t\t\tlower: 'group3',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}, {\n\t\t\tgroup: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Group2',\n\t\t\t\tlower: 'group2',\n\t\t\t\tdescription: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('Get groups with users + custom', async (t) => {\n\tconst { vpgDb: db } = t;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'Dan' },\n\t\t{ id: 2, name: 'Andrew' },\n\t\t{ id: 3, name: 'Alex' },\n\t]);\n\n\tawait db.insert(groupsTable).values([\n\t\t{ id: 1, name: 'Group1' },\n\t\t{ id: 2, name: 'Group2' },\n\t\t{ id: 3, name: 'Group3' },\n\t]);\n\n\tawait db.insert(usersToGroupsTable).values([\n\t\t{ userId: 1, groupId: 1 },\n\t\t{ userId: 2, groupId: 2 },\n\t\t{ userId: 3, groupId: 3 },\n\t\t{ userId: 3, groupId: 2 },\n\t]);\n\n\tconst response = await db.query.groupsTable.findMany({\n\t\textras: (table, { sql }) => ({\n\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t}),\n\t\twith: {\n\t\t\tusersToGroups: {\n\t\t\t\tcolumns: {},\n\t\t\t\twith: {\n\t\t\t\t\tuser: {\n\t\t\t\t\t\textras: (table, { sql }) => ({\n\t\t\t\t\t\t\tlower: sql<string>`lower(${table.name})`.as('lower_name'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\texpectTypeOf(response).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tdescription: string | null;\n\t\t\tlower: string;\n\t\t\tusersToGroups: {\n\t\t\t\tuser: {\n\t\t\t\t\tid: number;\n\t\t\t\t\tname: string;\n\t\t\t\t\tverified: boolean;\n\t\t\t\t\tinvitedBy: number | null;\n\t\t\t\t\tlower: string;\n\t\t\t\t};\n\t\t\t}[];\n\t\t}[]\n\t>();\n\n\tresponse.sort((a, b) => (a.id > b.id) ? 1 : -1);\n\n\texpect(response.length).toEqual(3);\n\n\texpect(response[0]?.usersToGroups.length).toEqual(1);\n\texpect(response[1]?.usersToGroups.length).toEqual(2);\n\texpect(response[2]?.usersToGroups.length).toEqual(1);\n\n\texpect(response).toContainEqual({\n\t\tid: 1,\n\t\tname: 'Group1',\n\t\tlower: 'group1',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Dan',\n\t\t\t\tlower: 'dan',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 2,\n\t\tname: 'Group2',\n\t\tlower: 'group2',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Andrew',\n\t\t\t\tlower: 'andrew',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}, {\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n\n\texpect(response).toContainEqual({\n\t\tid: 3,\n\t\tname: 'Group3',\n\t\tlower: 'group3',\n\t\tdescription: null,\n\t\tusersToGroups: [{\n\t\t\tuser: {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Alex',\n\t\t\t\tlower: 'alex',\n\t\t\t\tverified: false,\n\t\t\t\tinvitedBy: null,\n\t\t\t},\n\t\t}],\n\t});\n});\n\ntest('.toSQL()', () => {\n\tconst query = db.query.usersTable.findFirst().toSQL();\n\n\texpect(query).toHaveProperty('sql', expect.any(String));\n\texpect(query).toHaveProperty('params', expect.any(Array));\n});\n\n// + custom + where + orderby\n\n// + custom + where + orderby + limit\n\n// + partial\n\n// + partial(false)\n\n// + partial + orderBy + where (all not selected)\n\n/*\n\tOne four-level relation users+posts+comments+coment_likes\n\t+ users+users_to_groups+groups\n*/\n\n/*\n\tReally hard case\n\t1. users+posts+comments+coment_likes\n\t2. users+users_to_groups+groups\n\t3. users+users\n*/\n"
  },
  {
    "path": "integration-tests/tests/replicas/mysql.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { boolean, mysqlTable, serial, text, withReplicas } from 'drizzle-orm/mysql-core';\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport { describe, expect, it, vi } from 'vitest';\n\nconst usersTable = mysqlTable('users', {\n\tid: serial('id' as string).primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n});\n\nconst users = mysqlTable('users', {\n\tid: serial('id' as string).primaryKey(),\n});\n\ndescribe('[select] read replicas mysql', () => {\n\tit('primary select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\t\tconst spyRead2 = vi.spyOn(read2, 'select');\n\n\t\tconst query = db.$primary.select().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(query.toSQL().sql).toEqual('select `id` from `users`');\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n\n\tit('random replica select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\t\tconst spyRead2 = vi.spyOn(read2, 'select');\n\n\t\tconst query1 = db.select({ count: sql`count(*)`.as('count') }).from(users).limit(1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\texpect(query1.toSQL().sql).toEqual('select count(*) as `count` from `users` limit ?');\n\n\t\tconst query2 = db.select().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select `id` from `users`');\n\t});\n\n\tit('single read replica select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\n\t\tconst query1 = db.select().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select `id` from `users`');\n\n\t\tconst query2 = db.select().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(query2.toSQL().sql).toEqual('select `id` from `users`');\n\t});\n\n\tit('single read replica select + primary select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\n\t\tconst query1 = db.select({ id: users.id }).from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select `id` from `users`');\n\n\t\tconst query2 = db.$primary.select().from(users);\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select `id` from `users`');\n\t});\n\n\tit('always first read select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\t\tconst spyRead2 = vi.spyOn(read2, 'select');\n\n\t\tconst query1 = db.select().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select `id` from `users`');\n\n\t\tconst query2 = db.select().from(users);\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query2.toSQL().sql).toEqual('select `id` from `users`');\n\t});\n});\n\ndescribe('[selectDistinct] read replicas mysql', () => {\n\tit('primary selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\t\tconst spyRead2 = vi.spyOn(read2, 'selectDistinct');\n\n\t\tconst query = db.$primary.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query.toSQL().sql).toEqual('select distinct `id` from `users`');\n\t});\n\n\tit('random replica selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\t\tconst spyRead2 = vi.spyOn(read2, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct `id` from `users`');\n\n\t\tconst query2 = db.selectDistinct().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct `id` from `users`');\n\t});\n\n\tit('single read replica selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct `id` from `users`');\n\n\t\tconst query2 = db.selectDistinct().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct `id` from `users`');\n\t});\n\n\tit('single read replica selectDistinct + primary selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct `id` from `users`');\n\n\t\tconst query2 = db.$primary.selectDistinct().from(users);\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct `id` from `users`');\n\t});\n\n\tit('always first read selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\t\tconst spyRead2 = vi.spyOn(read2, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct `id` from `users`');\n\n\t\tconst query2 = db.selectDistinct().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct `id` from `users`');\n\t});\n});\n\ndescribe('[with] read replicas mysql', () => {\n\tit('primary with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\t\tconst spyRead2 = vi.spyOn(read2, 'with');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\t\tconst obj3 = {} as any;\n\t\tconst obj4 = {} as any;\n\n\t\tdb.$primary.with(obj1, obj2, obj3, obj4);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(obj1, obj2, obj3, obj4);\n\t});\n\n\tit('random replica with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\t\tconst spyRead2 = vi.spyOn(read2, 'with');\n\n\t\tdb.with();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.with();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('single read replica with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\n\t\tdb.with();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.with();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t});\n\n\tit('single read replica with + primary with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\n\t\tdb.with();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$primary.with();\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('always first read with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\t\tconst spyRead2 = vi.spyOn(read2, 'with');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\t\tconst obj3 = {} as any;\n\n\t\tdb.with(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\n\t\tdb.with(obj2, obj3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj2, obj3);\n\t});\n});\n\ndescribe('[update] replicas mysql', () => {\n\tit('primary update', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'update');\n\t\tconst spyRead1 = vi.spyOn(read1, 'update');\n\t\tconst spyRead2 = vi.spyOn(read2, 'update');\n\n\t\tconst query1 = db.update(users).set({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('update `users` set `id` = ?');\n\n\t\tconst query2 = db.update(users).set({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query2.toSQL().sql).toEqual('update `users` set `id` = ?');\n\n\t\tconst query3 = db.$primary.update(users).set({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query3.toSQL().sql).toEqual('update `users` set `id` = ?');\n\t});\n});\n\ndescribe('[delete] replicas mysql', () => {\n\tit('primary delete', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'delete');\n\t\tconst spyRead1 = vi.spyOn(read1, 'delete');\n\t\tconst spyRead2 = vi.spyOn(read2, 'delete');\n\n\t\tconst query1 = db.delete(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(users);\n\t\texpect(query1.toSQL().sql).toEqual('delete from `users`');\n\n\t\tconst query2 = db.delete(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(2, users);\n\t\texpect(query2.toSQL().sql).toEqual('delete from `users`');\n\n\t\tdb.$primary.delete({} as any);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[insert] replicas mysql', () => {\n\tit('primary insert', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'insert');\n\t\tconst spyRead1 = vi.spyOn(read1, 'insert');\n\t\tconst spyRead2 = vi.spyOn(read2, 'insert');\n\n\t\tconst query = db.insert(users).values({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(users);\n\t\texpect(query.toSQL().sql).toEqual('insert into `users` (`id`) values (?)');\n\n\t\tdb.insert(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(2, users);\n\n\t\tdb.$primary.insert({} as any);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[execute] replicas mysql', () => {\n\tit('primary execute', async () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'execute');\n\t\tconst spyRead1 = vi.spyOn(read1, 'execute');\n\t\tconst spyRead2 = vi.spyOn(read2, 'execute');\n\n\t\texpect(db.execute(sql``)).rejects.toThrow();\n\n\t\t// try {\n\t\t// \tdb.execute(sql``);\n\t\t// } catch { /* empty */ }\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\texpect(db.execute(sql``)).rejects.toThrow();\n\t\t// try {\n\t\t// \tdb.execute(sql``);\n\t\t// } catch { /* empty */ }\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\texpect(db.execute(sql``)).rejects.toThrow();\n\t\t// try {\n\t\t// \tdb.execute(sql``);\n\t\t// } catch { /* empty */ }\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[transaction] replicas mysql', () => {\n\tit('primary transaction', async () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'transaction');\n\t\tconst spyRead1 = vi.spyOn(read1, 'transaction');\n\t\tconst spyRead2 = vi.spyOn(read2, 'transaction');\n\t\tconst txFn1 = async (tx: any) => {\n\t\t\ttx.select().from({} as any);\n\t\t};\n\n\t\texpect(db.transaction(txFn1)).rejects.toThrow();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(txFn1);\n\n\t\tconst txFn2 = async (tx: any) => {\n\t\t\ttx.select().from({} as any);\n\t\t};\n\n\t\texpect(db.transaction(txFn2)).rejects.toThrow();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(2, txFn2);\n\n\t\texpect(db.transaction(async (tx) => {\n\t\t\ttx.select().from({} as any);\n\t\t})).rejects.toThrow();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[findFirst] read replicas mysql', () => {\n\tit('primary findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findFirst');\n\t\tconst obj = {} as any;\n\n\t\tdb.$primary.query.usersTable.findFirst(obj);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(obj);\n\t});\n\n\tit('random replica findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findFirst');\n\t\tconst par1 = {} as any;\n\n\t\tdb.query.usersTable.findFirst(par1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(par1);\n\n\t\tconst query = db.query.usersTable.findFirst();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable` limit ?');\n\t});\n\n\tit('single read replica findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\n\t\tdb.query.usersTable.findFirst();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.query.usersTable.findFirst();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t});\n\n\tit('single read replica findFirst + primary findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\n\t\tdb.query.usersTable.findFirst();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$primary.query.usersTable.findFirst();\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('always first read findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findFirst');\n\n\t\tdb.query.usersTable.findFirst();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.query.usersTable.findFirst();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[findMany] read replicas mysql', () => {\n\tit('primary findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findMany');\n\t\tconst obj = {} as any;\n\n\t\tconst query = db.$primary.query.usersTable.findMany(obj);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(obj);\n\t\texpect(query.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n\t});\n\n\tit('random replica findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findMany');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\n\t\tconst query1 = db.query.usersTable.findMany(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\n\t\tconst query2 = db.query.usersTable.findMany(obj2);\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n\t\texpect(spyRead2).toHaveBeenCalledWith(obj2);\n\t});\n\n\tit('single read replica findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\n\t\tconst query1 = db.query.usersTable.findMany(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\t\texpect(query1.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n\n\t\tconst query2 = db.query.usersTable.findMany(obj2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenNthCalledWith(2, obj2);\n\t\texpect(query2.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n\t});\n\n\tit('single read replica findMany + primary findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\n\t\tconst query1 = db.query.usersTable.findMany(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\t\texpect(query1.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n\n\t\tconst query2 = db.$primary.query.usersTable.findMany(obj2);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(1, obj2);\n\t\texpect(query2.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n\t});\n\n\tit('always first read findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable }, mode: 'default' });\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findMany');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\n\t\tconst query1 = db.query.usersTable.findMany(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\t\texpect(query1.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n\n\t\tconst query2 = db.query.usersTable.findMany(obj2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenNthCalledWith(2, obj2);\n\t\texpect(query2.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n\t});\n});\n\ndescribe('[$count] read replicas postgres', () => {\n\tit('primary $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\t\tconst spyRead2 = vi.spyOn(read2, '$count');\n\n\t\tdb.$primary.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n\n\tit('random replica $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\t\tconst spyRead2 = vi.spyOn(read2, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.$count(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('single read replica $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$count(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t});\n\n\tit('single read replica $count + primary $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$primary.$count(users);\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('always first read $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\t\tconst spyRead2 = vi.spyOn(read2, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.$count(users);\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/tests/replicas/postgres.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { drizzle } from 'drizzle-orm/node-postgres';\nimport { boolean, jsonb, pgTable, serial, text, timestamp, withReplicas } from 'drizzle-orm/pg-core';\nimport { describe, expect, it, vi } from 'vitest';\n\nconst usersTable = pgTable('users', {\n\tid: serial('id' as string).primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: jsonb('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n});\n\nconst users = pgTable('users', {\n\tid: serial('id' as string).primaryKey(),\n});\n\ndescribe('[select] read replicas postgres', () => {\n\tit('primary select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\t\tconst spyRead2 = vi.spyOn(read2, 'select');\n\n\t\tconst query = db.$primary.select().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(query.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n\n\tit('random replica select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\t\tconst spyRead2 = vi.spyOn(read2, 'select');\n\n\t\tconst query1 = db.select({ count: sql`count(*)`.as('count') }).from(users).limit(1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\texpect(query1.toSQL().sql).toEqual('select count(*) as \"count\" from \"users\" limit $1');\n\n\t\tconst query2 = db.select().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\t});\n\n\tit('single read replica select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\n\t\tconst query1 = db.select().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\n\t\tconst query2 = db.select().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(query2.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\t});\n\n\tit('single read replica select + primary select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\n\t\tconst query1 = db.select({ id: users.id }).from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\n\t\tconst query2 = db.$primary.select().from(users);\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\t});\n\n\tit('always first read select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\t\tconst spyRead2 = vi.spyOn(read2, 'select');\n\n\t\tconst query1 = db.select().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\n\t\tconst query2 = db.select().from(users);\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query2.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\t});\n});\n\ndescribe('[selectDistinct] read replicas postgres', () => {\n\tit('primary selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\t\tconst spyRead2 = vi.spyOn(read2, 'selectDistinct');\n\n\t\tconst query = db.$primary.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\t});\n\n\tit('random replica selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\t\tconst spyRead2 = vi.spyOn(read2, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\n\t\tconst query2 = db.selectDistinct().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\t});\n\n\tit('single read replica selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\n\t\tconst query2 = db.selectDistinct().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\t});\n\n\tit('single read replica selectDistinct + primary selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\n\t\tconst query2 = db.$primary.selectDistinct().from(users);\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\t});\n\n\tit('always first read selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\t\tconst spyRead2 = vi.spyOn(read2, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\n\t\tconst query2 = db.selectDistinct().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\t});\n});\n\ndescribe('[with] read replicas postgres', () => {\n\tit('primary with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\t\tconst spyRead2 = vi.spyOn(read2, 'with');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\t\tconst obj3 = {} as any;\n\t\tconst obj4 = {} as any;\n\n\t\tdb.$primary.with(obj1, obj2, obj3, obj4);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(obj1, obj2, obj3, obj4);\n\t});\n\n\tit('random replica with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\t\tconst spyRead2 = vi.spyOn(read2, 'with');\n\n\t\tdb.with();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.with();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('single read replica with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\n\t\tdb.with();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.with();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t});\n\n\tit('single read replica with + primary with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\n\t\tdb.with();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$primary.with();\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('always first read with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\t\tconst spyRead2 = vi.spyOn(read2, 'with');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\t\tconst obj3 = {} as any;\n\n\t\tdb.with(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\n\t\tdb.with(obj2, obj3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj2, obj3);\n\t});\n});\n\ndescribe('[update] replicas postgres', () => {\n\tit('primary update', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'update');\n\t\tconst spyRead1 = vi.spyOn(read1, 'update');\n\t\tconst spyRead2 = vi.spyOn(read2, 'update');\n\n\t\tconst query1 = db.update(users).set({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('update \"users\" set \"id\" = $1');\n\n\t\tconst query2 = db.update(users).set({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query2.toSQL().sql).toEqual('update \"users\" set \"id\" = $1');\n\n\t\tconst query3 = db.$primary.update(users).set({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query3.toSQL().sql).toEqual('update \"users\" set \"id\" = $1');\n\t});\n});\n\ndescribe('[delete] replicas postgres', () => {\n\tit('primary delete', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'delete');\n\t\tconst spyRead1 = vi.spyOn(read1, 'delete');\n\t\tconst spyRead2 = vi.spyOn(read2, 'delete');\n\n\t\tconst query1 = db.delete(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(users);\n\t\texpect(query1.toSQL().sql).toEqual('delete from \"users\"');\n\n\t\tconst query2 = db.delete(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(2, users);\n\t\texpect(query2.toSQL().sql).toEqual('delete from \"users\"');\n\n\t\tdb.$primary.delete({} as any);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[insert] replicas postgres', () => {\n\tit('primary insert', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'insert');\n\t\tconst spyRead1 = vi.spyOn(read1, 'insert');\n\t\tconst spyRead2 = vi.spyOn(read2, 'insert');\n\n\t\tconst query = db.insert(users).values({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(users);\n\t\texpect(query.toSQL().sql).toEqual('insert into \"users\" (\"id\") values ($1)');\n\n\t\tdb.insert(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(2, users);\n\n\t\tdb.$primary.insert({} as any);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[execute] replicas postgres', () => {\n\tit('primary execute', async () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'execute');\n\t\tconst spyRead1 = vi.spyOn(read1, 'execute');\n\t\tconst spyRead2 = vi.spyOn(read2, 'execute');\n\n\t\texpect(db.execute(sql``)).rejects.toThrow();\n\n\t\t// try {\n\t\t// \tdb.execute(sql``);\n\t\t// } catch { /* empty */ }\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\texpect(db.execute(sql``)).rejects.toThrow();\n\t\t// try {\n\t\t// \tdb.execute(sql``);\n\t\t// } catch { /* empty */ }\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\texpect(db.execute(sql``)).rejects.toThrow();\n\t\t// try {\n\t\t// \tdb.execute(sql``);\n\t\t// } catch { /* empty */ }\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[transaction] replicas postgres', () => {\n\tit('primary transaction', async () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'transaction');\n\t\tconst spyRead1 = vi.spyOn(read1, 'transaction');\n\t\tconst spyRead2 = vi.spyOn(read2, 'transaction');\n\t\tconst txFn1 = async (tx: any) => {\n\t\t\ttx.select().from({} as any);\n\t\t};\n\n\t\texpect(db.transaction(txFn1)).rejects.toThrow();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(txFn1);\n\n\t\tconst txFn2 = async (tx: any) => {\n\t\t\ttx.select().from({} as any);\n\t\t};\n\n\t\texpect(db.transaction(txFn2)).rejects.toThrow();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(2, txFn2);\n\n\t\texpect(db.transaction(async (tx) => {\n\t\t\ttx.select().from({} as any);\n\t\t})).rejects.toThrow();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[findFirst] read replicas postgres', () => {\n\tit('primary findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findFirst');\n\t\tconst obj = {} as any;\n\n\t\tdb.$primary.query.usersTable.findFirst(obj);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(obj);\n\t});\n\n\tit('random replica findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findFirst');\n\t\tconst par1 = {} as any;\n\n\t\tdb.query.usersTable.findFirst(par1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(par1);\n\n\t\tconst query = db.query.usersTable.findFirst();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query.toSQL().sql).toEqual(\n\t\t\t'select \"id\", \"name\", \"verified\", \"jsonb\", \"created_at\" from \"users\" \"usersTable\" limit $1',\n\t\t);\n\t});\n\n\tit('single read replica findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\n\t\tdb.query.usersTable.findFirst();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.query.usersTable.findFirst();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t});\n\n\tit('single read replica findFirst + primary findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\n\t\tdb.query.usersTable.findFirst();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$primary.query.usersTable.findFirst();\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('always first read findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findFirst');\n\n\t\tdb.query.usersTable.findFirst();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.query.usersTable.findFirst();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[findMany] read replicas postgres', () => {\n\tit('primary findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findMany');\n\t\tconst obj = {} as any;\n\n\t\tconst query = db.$primary.query.usersTable.findMany(obj);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(obj);\n\t\texpect(query.toSQL().sql).toEqual(\n\t\t\t'select \"id\", \"name\", \"verified\", \"jsonb\", \"created_at\" from \"users\" \"usersTable\"',\n\t\t);\n\t});\n\n\tit('random replica findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findMany');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\n\t\tconst query1 = db.query.usersTable.findMany(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual(\n\t\t\t'select \"id\", \"name\", \"verified\", \"jsonb\", \"created_at\" from \"users\" \"usersTable\"',\n\t\t);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\n\t\tconst query2 = db.query.usersTable.findMany(obj2);\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual(\n\t\t\t'select \"id\", \"name\", \"verified\", \"jsonb\", \"created_at\" from \"users\" \"usersTable\"',\n\t\t);\n\t\texpect(spyRead2).toHaveBeenCalledWith(obj2);\n\t});\n\n\tit('single read replica findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\n\t\tconst query1 = db.query.usersTable.findMany(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\t\texpect(query1.toSQL().sql).toEqual(\n\t\t\t'select \"id\", \"name\", \"verified\", \"jsonb\", \"created_at\" from \"users\" \"usersTable\"',\n\t\t);\n\n\t\tconst query2 = db.query.usersTable.findMany(obj2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenNthCalledWith(2, obj2);\n\t\texpect(query2.toSQL().sql).toEqual(\n\t\t\t'select \"id\", \"name\", \"verified\", \"jsonb\", \"created_at\" from \"users\" \"usersTable\"',\n\t\t);\n\t});\n\n\tit('single read replica findMany + primary findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\n\t\tconst query1 = db.query.usersTable.findMany(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\t\texpect(query1.toSQL().sql).toEqual(\n\t\t\t'select \"id\", \"name\", \"verified\", \"jsonb\", \"created_at\" from \"users\" \"usersTable\"',\n\t\t);\n\n\t\tconst query2 = db.$primary.query.usersTable.findMany(obj2);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(1, obj2);\n\t\texpect(query2.toSQL().sql).toEqual(\n\t\t\t'select \"id\", \"name\", \"verified\", \"jsonb\", \"created_at\" from \"users\" \"usersTable\"',\n\t\t);\n\t});\n\n\tit('always first read findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findMany');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\n\t\tconst query1 = db.query.usersTable.findMany(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\t\texpect(query1.toSQL().sql).toEqual(\n\t\t\t'select \"id\", \"name\", \"verified\", \"jsonb\", \"created_at\" from \"users\" \"usersTable\"',\n\t\t);\n\n\t\tconst query2 = db.query.usersTable.findMany(obj2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenNthCalledWith(2, obj2);\n\t\texpect(query2.toSQL().sql).toEqual(\n\t\t\t'select \"id\", \"name\", \"verified\", \"jsonb\", \"created_at\" from \"users\" \"usersTable\"',\n\t\t);\n\t});\n});\n\ndescribe('[$count] read replicas postgres', () => {\n\tit('primary $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\t\tconst spyRead2 = vi.spyOn(read2, '$count');\n\n\t\tdb.$primary.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n\n\tit('random replica $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\t\tconst spyRead2 = vi.spyOn(read2, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.select().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n\n\tit('single read replica $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$count(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t});\n\n\tit('single read replica $count + primary $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$primary.$count(users);\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('always first read $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\t\tconst spyRead2 = vi.spyOn(read2, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.$count(users);\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/tests/replicas/singlestore.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { drizzle } from 'drizzle-orm/singlestore';\nimport { serial, singlestoreTable, withReplicas } from 'drizzle-orm/singlestore-core';\nimport { describe, expect, it, vi } from 'vitest';\n\n// const usersTable = singlestoreTable('users', {\n// \tid: serial('id' as string).primaryKey(),\n// \tname: text('name').notNull(),\n// \tverified: boolean('verified').notNull().default(false),\n// });\n\nconst users = singlestoreTable('users', {\n\tid: serial('id' as string).primaryKey(),\n});\n\ndescribe('[select] read replicas singlestore', () => {\n\tit('primary select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\t\tconst spyRead2 = vi.spyOn(read2, 'select');\n\n\t\tconst query = db.$primary.select().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(query.toSQL().sql).toEqual('select `id` from `users`');\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n\n\tit('random replica select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\t\tconst spyRead2 = vi.spyOn(read2, 'select');\n\n\t\tconst query1 = db.select({ count: sql`count(*)`.as('count') }).from(users).limit(1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\texpect(query1.toSQL().sql).toEqual('select count(*) as `count` from `users` limit ?');\n\n\t\tconst query2 = db.select().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select `id` from `users`');\n\t});\n\n\tit('single read replica select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\n\t\tconst query1 = db.select().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select `id` from `users`');\n\n\t\tconst query2 = db.select().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(query2.toSQL().sql).toEqual('select `id` from `users`');\n\t});\n\n\tit('single read replica select + primary select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\n\t\tconst query1 = db.select({ id: users.id }).from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select `id` from `users`');\n\n\t\tconst query2 = db.$primary.select().from(users);\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select `id` from `users`');\n\t});\n\n\tit('always first read select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\t\tconst spyRead2 = vi.spyOn(read2, 'select');\n\n\t\tconst query1 = db.select().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select `id` from `users`');\n\n\t\tconst query2 = db.select().from(users);\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query2.toSQL().sql).toEqual('select `id` from `users`');\n\t});\n});\n\ndescribe('[selectDistinct] read replicas singlestore', () => {\n\tit('primary selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\t\tconst spyRead2 = vi.spyOn(read2, 'selectDistinct');\n\n\t\tconst query = db.$primary.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query.toSQL().sql).toEqual('select distinct `id` from `users`');\n\t});\n\n\tit('random replica selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\t\tconst spyRead2 = vi.spyOn(read2, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct `id` from `users`');\n\n\t\tconst query2 = db.selectDistinct().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct `id` from `users`');\n\t});\n\n\tit('single read replica selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct `id` from `users`');\n\n\t\tconst query2 = db.selectDistinct().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct `id` from `users`');\n\t});\n\n\tit('single read replica selectDistinct + primary selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct `id` from `users`');\n\n\t\tconst query2 = db.$primary.selectDistinct().from(users);\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct `id` from `users`');\n\t});\n\n\tit('always first read selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\t\tconst spyRead2 = vi.spyOn(read2, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct `id` from `users`');\n\n\t\tconst query2 = db.selectDistinct().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct `id` from `users`');\n\t});\n});\n\ndescribe('[with] read replicas singlestore', () => {\n\tit('primary with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\t\tconst spyRead2 = vi.spyOn(read2, 'with');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\t\tconst obj3 = {} as any;\n\t\tconst obj4 = {} as any;\n\n\t\tdb.$primary.with(obj1, obj2, obj3, obj4);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(obj1, obj2, obj3, obj4);\n\t});\n\n\tit('random replica with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\t\tconst spyRead2 = vi.spyOn(read2, 'with');\n\n\t\tdb.with();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.with();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('single read replica with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\n\t\tdb.with();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.with();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t});\n\n\tit('single read replica with + primary with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\n\t\tdb.with();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$primary.with();\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('always first read with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\t\tconst spyRead2 = vi.spyOn(read2, 'with');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\t\tconst obj3 = {} as any;\n\n\t\tdb.with(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\n\t\tdb.with(obj2, obj3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj2, obj3);\n\t});\n});\n\ndescribe('[update] replicas singlestore', () => {\n\tit('primary update', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'update');\n\t\tconst spyRead1 = vi.spyOn(read1, 'update');\n\t\tconst spyRead2 = vi.spyOn(read2, 'update');\n\n\t\tconst query1 = db.update(users).set({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('update `users` set `id` = ?');\n\n\t\tconst query2 = db.update(users).set({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query2.toSQL().sql).toEqual('update `users` set `id` = ?');\n\n\t\tconst query3 = db.$primary.update(users).set({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query3.toSQL().sql).toEqual('update `users` set `id` = ?');\n\t});\n});\n\ndescribe('[delete] replicas singlestore', () => {\n\tit('primary delete', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'delete');\n\t\tconst spyRead1 = vi.spyOn(read1, 'delete');\n\t\tconst spyRead2 = vi.spyOn(read2, 'delete');\n\n\t\tconst query1 = db.delete(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(users);\n\t\texpect(query1.toSQL().sql).toEqual('delete from `users`');\n\n\t\tconst query2 = db.delete(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(2, users);\n\t\texpect(query2.toSQL().sql).toEqual('delete from `users`');\n\n\t\tdb.$primary.delete({} as any);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[insert] replicas singlestore', () => {\n\tit('primary insert', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'insert');\n\t\tconst spyRead1 = vi.spyOn(read1, 'insert');\n\t\tconst spyRead2 = vi.spyOn(read2, 'insert');\n\n\t\tconst query = db.insert(users).values({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(users);\n\t\texpect(query.toSQL().sql).toEqual('insert into `users` (`id`) values (?)');\n\n\t\tdb.insert(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(2, users);\n\n\t\tdb.$primary.insert({} as any);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[execute] replicas singlestore', () => {\n\tit('primary execute', async () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'execute');\n\t\tconst spyRead1 = vi.spyOn(read1, 'execute');\n\t\tconst spyRead2 = vi.spyOn(read2, 'execute');\n\n\t\texpect(db.execute(sql``)).rejects.toThrow();\n\n\t\t// try {\n\t\t// \tdb.execute(sql``);\n\t\t// } catch { /* empty */ }\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\texpect(db.execute(sql``)).rejects.toThrow();\n\t\t// try {\n\t\t// \tdb.execute(sql``);\n\t\t// } catch { /* empty */ }\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\texpect(db.execute(sql``)).rejects.toThrow();\n\t\t// try {\n\t\t// \tdb.execute(sql``);\n\t\t// } catch { /* empty */ }\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[transaction] replicas singlestore', () => {\n\tit('primary transaction', async () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'transaction');\n\t\tconst spyRead1 = vi.spyOn(read1, 'transaction');\n\t\tconst spyRead2 = vi.spyOn(read2, 'transaction');\n\t\tconst txFn1 = async (tx: any) => {\n\t\t\ttx.select().from({} as any);\n\t\t};\n\n\t\texpect(db.transaction(txFn1)).rejects.toThrow();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(txFn1);\n\n\t\tconst txFn2 = async (tx: any) => {\n\t\t\ttx.select().from({} as any);\n\t\t};\n\n\t\texpect(db.transaction(txFn2)).rejects.toThrow();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(2, txFn2);\n\n\t\texpect(db.transaction(async (tx) => {\n\t\t\ttx.select().from({} as any);\n\t\t})).rejects.toThrow();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\n// We are waiting for SingleStore support for `json_array` function\n// describe('[findFirst] read replicas singlestore', () => {\n// \t// it('primary findFirst', () => {\n// \t// \tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read1 = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n// \t// \tconst db = withReplicas(primaryDb, [read1, read2]);\n\n// \t// \tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n// \t// \tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n// \t// \tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findFirst');\n// \t// \tconst obj = {} as any;\n\n// \t// \tdb.$primary.query.usersTable.findFirst(obj);\n\n// \t// \texpect(spyPrimary).toHaveBeenCalledTimes(1);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyRead2).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyPrimary).toHaveBeenCalledWith(obj);\n// \t// });\n\n// \t// it('random replica findFirst', () => {\n// \t// \tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read1 = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n// \t// \tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n// \t// \tconst db = withReplicas(primaryDb, [read1, read2], () => {\n// \t// \t\treturn randomMockReplica();\n// \t// \t});\n\n// \t// \tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n// \t// \tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n// \t// \tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findFirst');\n// \t// \tconst par1 = {} as any;\n\n// \t// \tdb.query.usersTable.findFirst(par1);\n\n// \t// \texpect(spyPrimary).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(1);\n// \t// \texpect(spyRead2).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyRead1).toHaveBeenCalledWith(par1);\n\n// \t// \tconst query = db.query.usersTable.findFirst();\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(1);\n// \t// \texpect(spyRead2).toHaveBeenCalledTimes(1);\n// \t// \texpect(query.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable` limit ?');\n// \t// });\n\n// \t// We are waiting for SingleStore support for `json_array` function\n// \t// it('single read replica findFirst', () => {\n// \t// \tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read1 = drizzle.mock({ schema: { usersTable } });\n\n// \t// \tconst db = withReplicas(primaryDb, [read1]);\n\n// \t// \tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n// \t// \tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\n// \t// \tdb.query.usersTable.findFirst();\n\n// \t// \texpect(spyPrimary).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n// \t// \tdb.query.usersTable.findFirst();\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(2);\n// \t// });\n\n// \t// We are waiting for SingleStore support for `json_array` function\n// \t// it('single read replica findFirst + primary findFirst', () => {\n// \t// \tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read1 = drizzle.mock({ schema: { usersTable } });\n\n// \t// \tconst db = withReplicas(primaryDb, [read1]);\n\n// \t// \tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n// \t// \tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\n// \t// \tdb.query.usersTable.findFirst();\n\n// \t// \texpect(spyPrimary).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n// \t// \tdb.$primary.query.usersTable.findFirst();\n// \t// \texpect(spyPrimary).toHaveBeenCalledTimes(1);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(1);\n// \t// });\n\n// \t// We are waiting for SingleStore support for `json_array` function\n// \t// it('always first read findFirst', () => {\n// \t// \tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read1 = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n// \t// \tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n// \t// \t\treturn replicas[0]!;\n// \t// \t});\n\n// \t// \tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n// \t// \tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n// \t// \tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findFirst');\n\n// \t// \tdb.query.usersTable.findFirst();\n\n// \t// \texpect(spyPrimary).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(1);\n// \t// \texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n// \t// \tdb.query.usersTable.findFirst();\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(2);\n// \t// \texpect(spyRead2).toHaveBeenCalledTimes(0);\n// \t// });\n// });\n\n// describe('[findMany] read replicas singlestore', () => {\n// \t// We are waiting for SingleStore support for `json_array` function\n// \t// it('primary findMany', () => {\n// \t// \tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read1 = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n// \t// \tconst db = withReplicas(primaryDb, [read1, read2]);\n\n// \t// \tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n// \t// \tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n// \t// \tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findMany');\n// \t// \tconst obj = {} as any;\n\n// \t// \tconst query = db.$primary.query.usersTable.findMany(obj);\n\n// \t// \texpect(spyPrimary).toHaveBeenCalledTimes(1);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyRead2).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyPrimary).toHaveBeenCalledWith(obj);\n// \t// \texpect(query.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n// \t// });\n\n// \t// We are waiting for SingleStore support for `json_array` function\n// \t// it('random replica findMany', () => {\n// \t// \tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read1 = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n// \t// \tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n// \t// \tconst db = withReplicas(primaryDb, [read1, read2], () => {\n// \t// \t\treturn randomMockReplica();\n// \t// \t});\n\n// \t// \tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n// \t// \tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n// \t// \tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findMany');\n// \t// \tconst obj1 = {} as any;\n// \t// \tconst obj2 = {} as any;\n\n// \t// \tconst query1 = db.query.usersTable.findMany(obj1);\n\n// \t// \texpect(spyPrimary).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(1);\n// \t// \texpect(spyRead2).toHaveBeenCalledTimes(0);\n// \t// \texpect(query1.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n// \t// \texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\n// \t// \tconst query2 = db.query.usersTable.findMany(obj2);\n\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(1);\n// \t// \texpect(spyRead2).toHaveBeenCalledTimes(1);\n// \t// \texpect(query2.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n// \t// \texpect(spyRead2).toHaveBeenCalledWith(obj2);\n// \t// });\n\n// \t// We are waiting for SingleStore support for `json_array` function\n// \t// it('single read replica findMany', () => {\n// \t// \tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read1 = drizzle.mock({ schema: { usersTable } });\n\n// \t// \tconst db = withReplicas(primaryDb, [read1]);\n\n// \t// \tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n// \t// \tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n// \t// \tconst obj1 = {} as any;\n// \t// \tconst obj2 = {} as any;\n\n// \t// \tconst query1 = db.query.usersTable.findMany(obj1);\n\n// \t// \texpect(spyPrimary).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(1);\n// \t// \texpect(spyRead1).toHaveBeenCalledWith(obj1);\n// \t// \texpect(query1.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n\n// \t// \tconst query2 = db.query.usersTable.findMany(obj2);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(2);\n// \t// \texpect(spyRead1).toHaveBeenNthCalledWith(2, obj2);\n// \t// \texpect(query2.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n// \t// });\n\n// \t// We are waiting for SingleStore support for `json_array` function\n// \t// it('single read replica findMany + primary findMany', () => {\n// \t// \tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read1 = drizzle.mock({ schema: { usersTable } });\n\n// \t// \tconst db = withReplicas(primaryDb, [read1]);\n\n// \t// \tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n// \t// \tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n// \t// \tconst obj1 = {} as any;\n// \t// \tconst obj2 = {} as any;\n\n// \t// \tconst query1 = db.query.usersTable.findMany(obj1);\n\n// \t// \texpect(spyPrimary).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(1);\n// \t// \texpect(spyRead1).toHaveBeenCalledWith(obj1);\n// \t// \texpect(query1.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n\n// \t// \tconst query2 = db.$primary.query.usersTable.findMany(obj2);\n\n// \t// \texpect(spyPrimary).toHaveBeenCalledTimes(1);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(1);\n// \t// \texpect(spyPrimary).toHaveBeenNthCalledWith(1, obj2);\n// \t// \texpect(query2.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n// \t// });\n\n// \t// We are waiting for SingleStore support for `json_array` function\n// \t// it('always first read findMany', () => {\n// \t// \tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read1 = drizzle.mock({ schema: { usersTable } });\n// \t// \tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n// \t// \tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n// \t// \t\treturn replicas[0]!;\n// \t// \t});\n\n// \t// \tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n// \t// \tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n// \t// \tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findMany');\n// \t// \tconst obj1 = {} as any;\n// \t// \tconst obj2 = {} as any;\n\n// \t// \tconst query1 = db.query.usersTable.findMany(obj1);\n\n// \t// \texpect(spyPrimary).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(1);\n// \t// \texpect(spyRead2).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyRead1).toHaveBeenCalledWith(obj1);\n// \t// \texpect(query1.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n\n// \t// \tconst query2 = db.query.usersTable.findMany(obj2);\n// \t// \texpect(spyRead1).toHaveBeenCalledTimes(2);\n// \t// \texpect(spyRead2).toHaveBeenCalledTimes(0);\n// \t// \texpect(spyRead1).toHaveBeenNthCalledWith(2, obj2);\n// \t// \texpect(query2.toSQL().sql).toEqual('select `id`, `name`, `verified` from `users` `usersTable`');\n// \t// });\n// });\n\ndescribe('[$count] read replicas postgres', () => {\n\tit('primary $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\t\tconst spyRead2 = vi.spyOn(read2, '$count');\n\n\t\tdb.$primary.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n\n\tit('random replica $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\t\tconst spyRead2 = vi.spyOn(read2, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.select().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n\n\tit('single read replica $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$count(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t});\n\n\tit('single read replica $count + primary $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$primary.$count(users);\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('always first read $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\t\tconst spyRead2 = vi.spyOn(read2, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.$count(users);\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/tests/replicas/sqlite.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport { drizzle } from 'drizzle-orm/libsql';\nimport { int, sqliteTable, text, withReplicas } from 'drizzle-orm/sqlite-core';\nimport { describe, expect, it, vi } from 'vitest';\n\nconst usersTable = sqliteTable('users', {\n\tid: int('id' as string).primaryKey(),\n\tname: text('name').notNull(),\n\tverified: text('verified').notNull().default('true'),\n});\n\nconst users = sqliteTable('users', {\n\tid: int('id' as string).primaryKey(),\n});\n\ndescribe('[select] read replicas sqlite', () => {\n\tit('primary select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\t\tconst spyRead2 = vi.spyOn(read2, 'select');\n\n\t\tconst query = db.$primary.select().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(query.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n\n\tit('random replica select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\t\tconst spyRead2 = vi.spyOn(read2, 'select');\n\n\t\tconst query1 = db.select({ count: sql`count(*)`.as('count') }).from(users).limit(1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\texpect(query1.toSQL().sql).toEqual('select count(*) as \"count\" from \"users\" limit ?');\n\n\t\tconst query2 = db.select().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\t});\n\n\tit('single read replica select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\n\t\tconst query1 = db.select().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\n\t\tconst query2 = db.select().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(query2.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\t});\n\n\tit('single read replica select + primary select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\n\t\tconst query1 = db.select({ id: users.id }).from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\n\t\tconst query2 = db.$primary.select().from(users);\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\t});\n\n\tit('always first read select', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'select');\n\t\tconst spyRead1 = vi.spyOn(read1, 'select');\n\t\tconst spyRead2 = vi.spyOn(read2, 'select');\n\n\t\tconst query1 = db.select().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\n\t\tconst query2 = db.select().from(users);\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query2.toSQL().sql).toEqual('select \"id\" from \"users\"');\n\t});\n});\n\ndescribe('[selectDistinct] read replicas sqlite', () => {\n\tit('primary selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\t\tconst spyRead2 = vi.spyOn(read2, 'selectDistinct');\n\n\t\tconst query = db.$primary.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\t});\n\n\tit('random replica selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\t\tconst spyRead2 = vi.spyOn(read2, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\n\t\tconst query2 = db.selectDistinct().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\t});\n\n\tit('single read replica selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\n\t\tconst query2 = db.selectDistinct().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\t});\n\n\tit('single read replica selectDistinct + primary selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\n\t\tconst query2 = db.$primary.selectDistinct().from(users);\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\t});\n\n\tit('always first read selectDistinct', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'selectDistinct');\n\t\tconst spyRead1 = vi.spyOn(read1, 'selectDistinct');\n\t\tconst spyRead2 = vi.spyOn(read2, 'selectDistinct');\n\n\t\tconst query1 = db.selectDistinct().from(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\n\t\tconst query2 = db.selectDistinct().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query2.toSQL().sql).toEqual('select distinct \"id\" from \"users\"');\n\t});\n});\n\ndescribe('[with] read replicas sqlite', () => {\n\tit('primary with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\t\tconst spyRead2 = vi.spyOn(read2, 'with');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\t\tconst obj3 = {} as any;\n\t\tconst obj4 = {} as any;\n\n\t\tdb.$primary.with(obj1, obj2, obj3, obj4);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(obj1, obj2, obj3, obj4);\n\t});\n\n\tit('random replica with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\t\tconst spyRead2 = vi.spyOn(read2, 'with');\n\n\t\tdb.with();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.with();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('single read replica with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\n\t\tdb.with();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.with();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t});\n\n\tit('single read replica with + primary with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\n\t\tdb.with();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$primary.with();\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('always first read with', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'with');\n\t\tconst spyRead1 = vi.spyOn(read1, 'with');\n\t\tconst spyRead2 = vi.spyOn(read2, 'with');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\t\tconst obj3 = {} as any;\n\n\t\tdb.with(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\n\t\tdb.with(obj2, obj3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj2, obj3);\n\t});\n});\n\ndescribe('[update] replicas sqlite', () => {\n\tit('primary update', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'update');\n\t\tconst spyRead1 = vi.spyOn(read1, 'update');\n\t\tconst spyRead2 = vi.spyOn(read2, 'update');\n\n\t\tconst query1 = db.update(users).set({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('update \"users\" set \"id\" = ?');\n\n\t\tconst query2 = db.update(users).set({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query2.toSQL().sql).toEqual('update \"users\" set \"id\" = ?');\n\n\t\tconst query3 = db.$primary.update(users).set({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query3.toSQL().sql).toEqual('update \"users\" set \"id\" = ?');\n\t});\n});\n\ndescribe('[delete] replicas sqlite', () => {\n\tit('primary delete', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'delete');\n\t\tconst spyRead1 = vi.spyOn(read1, 'delete');\n\t\tconst spyRead2 = vi.spyOn(read2, 'delete');\n\n\t\tconst query1 = db.delete(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(users);\n\t\texpect(query1.toSQL().sql).toEqual('delete from \"users\"');\n\n\t\tconst query2 = db.delete(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(2, users);\n\t\texpect(query2.toSQL().sql).toEqual('delete from \"users\"');\n\n\t\tdb.$primary.delete({} as any);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[insert] replicas sqlite', () => {\n\tit('primary insert', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'insert');\n\t\tconst spyRead1 = vi.spyOn(read1, 'insert');\n\t\tconst spyRead2 = vi.spyOn(read2, 'insert');\n\n\t\tconst query = db.insert(users).values({ id: 1 });\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(users);\n\t\texpect(query.toSQL().sql).toEqual('insert into \"users\" (\"id\") values (?)');\n\n\t\tdb.insert(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(2, users);\n\n\t\tdb.$primary.insert({} as any);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[execute] replicas sqlite', () => {\n\tit('primary execute', async () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'all');\n\t\tconst spyRead1 = vi.spyOn(read1, 'all');\n\t\tconst spyRead2 = vi.spyOn(read2, 'all');\n\n\t\texpect(db.all(sql``)).rejects.toThrow();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\texpect(db.all(sql``)).rejects.toThrow();\n\t\t// try {\n\t\t// \tdb.execute(sql``);\n\t\t// } catch { /* empty */ }\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\texpect(db.all(sql``)).rejects.toThrow();\n\t\t// try {\n\t\t// \tdb.execute(sql``);\n\t\t// } catch { /* empty */ }\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[transaction] replicas sqlite', () => {\n\tit('primary transaction', async () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, 'transaction');\n\t\tconst spyRead1 = vi.spyOn(read1, 'transaction');\n\t\tconst spyRead2 = vi.spyOn(read2, 'transaction');\n\t\tconst txFn1 = async (tx: any) => {\n\t\t\ttx.select().from({} as any);\n\t\t};\n\n\t\texpect(db.transaction(txFn1)).rejects.toThrow();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(txFn1);\n\n\t\tconst txFn2 = async (tx: any) => {\n\t\t\ttx.select().from({} as any);\n\t\t};\n\n\t\texpect(db.transaction(txFn2)).rejects.toThrow();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(2, txFn2);\n\n\t\texpect(db.transaction(async (tx) => {\n\t\t\ttx.select().from({} as any);\n\t\t})).rejects.toThrow();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(3);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[findFirst] read replicas sqlite', () => {\n\tit('primary findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findFirst');\n\t\tconst obj = {} as any;\n\n\t\tdb.$primary.query.usersTable.findFirst(obj);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(obj);\n\t});\n\n\tit('random replica findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findFirst');\n\t\tconst par1 = {} as any;\n\n\t\tdb.query.usersTable.findFirst(par1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(par1);\n\n\t\tconst query = db.query.usersTable.findFirst();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query.toSQL().sql).toEqual('select \"id\", \"name\", \"verified\" from \"users\" \"usersTable\" limit ?');\n\t});\n\n\tit('single read replica findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\n\t\tdb.query.usersTable.findFirst();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.query.usersTable.findFirst();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t});\n\n\tit('single read replica findFirst + primary findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\n\t\tdb.query.usersTable.findFirst();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$primary.query.usersTable.findFirst();\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('always first read findFirst', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findFirst');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findFirst');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findFirst');\n\n\t\tdb.query.usersTable.findFirst();\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.query.usersTable.findFirst();\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n\ndescribe('[findMany] read replicas sqlite', () => {\n\tit('primary findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findMany');\n\t\tconst obj = {} as any;\n\n\t\tconst query = db.$primary.query.usersTable.findMany(obj);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyPrimary).toHaveBeenCalledWith(obj);\n\t\texpect(query.toSQL().sql).toEqual('select \"id\", \"name\", \"verified\" from \"users\" \"usersTable\"');\n\t});\n\n\tit('random replica findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findMany');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\n\t\tconst query1 = db.query.usersTable.findMany(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(query1.toSQL().sql).toEqual('select \"id\", \"name\", \"verified\" from \"users\" \"usersTable\"');\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\n\t\tconst query2 = db.query.usersTable.findMany(obj2);\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(1);\n\t\texpect(query2.toSQL().sql).toEqual('select \"id\", \"name\", \"verified\" from \"users\" \"usersTable\"');\n\t\texpect(spyRead2).toHaveBeenCalledWith(obj2);\n\t});\n\n\tit('single read replica findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\n\t\tconst query1 = db.query.usersTable.findMany(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\t\texpect(query1.toSQL().sql).toEqual('select \"id\", \"name\", \"verified\" from \"users\" \"usersTable\"');\n\n\t\tconst query2 = db.query.usersTable.findMany(obj2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead1).toHaveBeenNthCalledWith(2, obj2);\n\t\texpect(query2.toSQL().sql).toEqual('select \"id\", \"name\", \"verified\" from \"users\" \"usersTable\"');\n\t});\n\n\tit('single read replica findMany + primary findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\n\t\tconst query1 = db.query.usersTable.findMany(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\t\texpect(query1.toSQL().sql).toEqual('select \"id\", \"name\", \"verified\" from \"users\" \"usersTable\"');\n\n\t\tconst query2 = db.$primary.query.usersTable.findMany(obj2);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyPrimary).toHaveBeenNthCalledWith(1, obj2);\n\t\texpect(query2.toSQL().sql).toEqual('select \"id\", \"name\", \"verified\" from \"users\" \"usersTable\"');\n\t});\n\n\tit('always first read findMany', () => {\n\t\tconst primaryDb = drizzle.mock({ schema: { usersTable } });\n\t\tconst read1 = drizzle.mock({ schema: { usersTable } });\n\t\tconst read2 = drizzle.mock({ schema: { usersTable } });\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb['query']['usersTable'], 'findMany');\n\t\tconst spyRead1 = vi.spyOn(read1['query']['usersTable'], 'findMany');\n\t\tconst spyRead2 = vi.spyOn(read2['query']['usersTable'], 'findMany');\n\t\tconst obj1 = {} as any;\n\t\tconst obj2 = {} as any;\n\n\t\tconst query1 = db.query.usersTable.findMany(obj1);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledWith(obj1);\n\t\texpect(query1.toSQL().sql).toEqual('select \"id\", \"name\", \"verified\" from \"users\" \"usersTable\"');\n\n\t\tconst query2 = db.query.usersTable.findMany(obj2);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenNthCalledWith(2, obj2);\n\t\texpect(query2.toSQL().sql).toEqual('select \"id\", \"name\", \"verified\" from \"users\" \"usersTable\"');\n\t});\n});\n\ndescribe('[$count] read replicas postgres', () => {\n\tit('primary $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\t\tconst spyRead2 = vi.spyOn(read2, '$count');\n\n\t\tdb.$primary.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n\n\tit('random replica $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst randomMockReplica = vi.fn().mockReturnValueOnce(read1).mockReturnValueOnce(read2);\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], () => {\n\t\t\treturn randomMockReplica();\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\t\tconst spyRead2 = vi.spyOn(read2, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.select().from(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n\n\tit('single read replica $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$count(users);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t});\n\n\tit('single read replica $count + primary $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1]);\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\n\t\tdb.$primary.$count(users);\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t});\n\n\tit('always first read $count', () => {\n\t\tconst primaryDb = drizzle.mock();\n\t\tconst read1 = drizzle.mock();\n\t\tconst read2 = drizzle.mock();\n\n\t\tconst db = withReplicas(primaryDb, [read1, read2], (replicas) => {\n\t\t\treturn replicas[0]!;\n\t\t});\n\n\t\tconst spyPrimary = vi.spyOn(primaryDb, '$count');\n\t\tconst spyRead1 = vi.spyOn(read1, '$count');\n\t\tconst spyRead2 = vi.spyOn(read2, '$count');\n\n\t\tdb.$count(users);\n\n\t\texpect(spyPrimary).toHaveBeenCalledTimes(0);\n\t\texpect(spyRead1).toHaveBeenCalledTimes(1);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\n\t\tdb.$count(users);\n\n\t\texpect(spyRead1).toHaveBeenCalledTimes(2);\n\t\texpect(spyRead2).toHaveBeenCalledTimes(0);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/tests/seeder/mysql.test.ts",
    "content": "import Docker from 'dockerode';\nimport { sql } from 'drizzle-orm';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport { reset, seed } from 'drizzle-seed';\nimport getPort from 'get-port';\nimport type { Connection } from 'mysql2/promise';\nimport { createConnection } from 'mysql2/promise';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, afterEach, beforeAll, expect, test } from 'vitest';\nimport * as schema from './mysqlSchema.ts';\n\nlet mysqlContainer: Docker.Container;\nlet client: Connection;\nlet db: MySql2Database;\n\nasync function createDockerDB(): Promise<string> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'mysql:8';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tdocker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))\n\t);\n\n\tmysqlContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait mysqlContainer.start();\n\n\treturn `mysql://root:mysql@127.0.0.1:${port}/drizzle`;\n}\n\nconst createNorthwindTables = async () => {\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`customer\\` (\n\t\t\t\t\\`id\\` varchar(256) NOT NULL,\n\t\t\t\t\\`company_name\\` text NOT NULL,\n\t\t\t\t\\`contact_name\\` text NOT NULL,\n\t\t\t\t\\`contact_title\\` text NOT NULL,\n\t\t\t\t\\`address\\` text NOT NULL,\n\t\t\t\t\\`city\\` text NOT NULL,\n\t\t\t\t\\`postal_code\\` text,\n\t\t\t\t\\`region\\` text,\n\t\t\t\t\\`country\\` text NOT NULL,\n\t\t\t\t\\`phone\\` text NOT NULL,\n\t\t\t\t\\`fax\\` text,\n\t\t\t\tCONSTRAINT \\`customer_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`order_detail\\` (\n\t\t\t\t\\`unit_price\\` float NOT NULL,\n\t\t\t\t\\`quantity\\` int NOT NULL,\n\t\t\t\t\\`discount\\` float NOT NULL,\n\t\t\t\t\\`order_id\\` int NOT NULL,\n\t\t\t\t\\`product_id\\` int NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`employee\\` (\n\t\t\t\t\\`id\\` int NOT NULL,\n\t\t\t\t\\`last_name\\` text NOT NULL,\n\t\t\t\t\\`first_name\\` text,\n\t\t\t\t\\`title\\` text NOT NULL,\n\t\t\t\t\\`title_of_courtesy\\` text NOT NULL,\n\t\t\t\t\\`birth_date\\` timestamp NOT NULL,\n\t\t\t\t\\`hire_date\\` timestamp NOT NULL,\n\t\t\t\t\\`address\\` text NOT NULL,\n\t\t\t\t\\`city\\` text NOT NULL,\n\t\t\t\t\\`postal_code\\` text NOT NULL,\n\t\t\t\t\\`country\\` text NOT NULL,\n\t\t\t\t\\`home_phone\\` text NOT NULL,\n\t\t\t\t\\`extension\\` int NOT NULL,\n\t\t\t\t\\`notes\\` text NOT NULL,\n\t\t\t\t\\`reports_to\\` int,\n\t\t\t\t\\`photo_path\\` text,\n\t\t\t\tCONSTRAINT \\`employee_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`order\\` (\n\t\t\t\t\\`id\\` int NOT NULL,\n\t\t\t\t\\`order_date\\` timestamp NOT NULL,\n\t\t\t\t\\`required_date\\` timestamp NOT NULL,\n\t\t\t\t\\`shipped_date\\` timestamp,\n\t\t\t\t\\`ship_via\\` int NOT NULL,\n\t\t\t\t\\`freight\\` float NOT NULL,\n\t\t\t\t\\`ship_name\\` text NOT NULL,\n\t\t\t\t\\`ship_city\\` text NOT NULL,\n\t\t\t\t\\`ship_region\\` text,\n\t\t\t\t\\`ship_postal_code\\` text,\n\t\t\t\t\\`ship_country\\` text NOT NULL,\n\t\t\t\t\\`customer_id\\` varchar(256) NOT NULL,\n\t\t\t\t\\`employee_id\\` int NOT NULL,\n\t\t\t\tCONSTRAINT \\`order_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`product\\` (\n\t\t\t\t\\`id\\` int NOT NULL,\n\t\t\t\t\\`name\\` text NOT NULL,\n\t\t\t\t\\`quantity_per_unit\\` text NOT NULL,\n\t\t\t\t\\`unit_price\\` float NOT NULL,\n\t\t\t\t\\`units_in_stock\\` int NOT NULL,\n\t\t\t\t\\`units_on_order\\` int NOT NULL,\n\t\t\t\t\\`reorder_level\\` int NOT NULL,\n\t\t\t\t\\`discontinued\\` int NOT NULL,\n\t\t\t\t\\`supplier_id\\` int NOT NULL,\n\t\t\t\tCONSTRAINT \\`product_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`supplier\\` (\n\t\t\t\t\\`id\\` int NOT NULL,\n\t\t\t\t\\`company_name\\` text NOT NULL,\n\t\t\t\t\\`contact_name\\` text NOT NULL,\n\t\t\t\t\\`contact_title\\` text NOT NULL,\n\t\t\t\t\\`address\\` text NOT NULL,\n\t\t\t\t\\`city\\` text NOT NULL,\n\t\t\t\t\\`region\\` text,\n\t\t\t\t\\`postal_code\\` text NOT NULL,\n\t\t\t\t\\`country\\` text NOT NULL,\n\t\t\t\t\\`phone\\` text NOT NULL,\n\t\t\t\tCONSTRAINT \\`supplier_id\\` PRIMARY KEY(\\`id\\`)\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`order_detail\\` ADD CONSTRAINT \\`order_detail_order_id_order_id_fk\\` FOREIGN KEY (\\`order_id\\`) REFERENCES \\`order\\`(\\`id\\`) ON DELETE cascade ON UPDATE no action;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`order_detail\\` ADD CONSTRAINT \\`order_detail_product_id_product_id_fk\\` FOREIGN KEY (\\`product_id\\`) REFERENCES \\`product\\`(\\`id\\`) ON DELETE cascade ON UPDATE no action;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`employee\\` ADD CONSTRAINT \\`employee_reports_to_employee_id_fk\\` FOREIGN KEY (\\`reports_to\\`) REFERENCES \\`employee\\`(\\`id\\`) ON DELETE no action ON UPDATE no action;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`order\\` ADD CONSTRAINT \\`order_customer_id_customer_id_fk\\` FOREIGN KEY (\\`customer_id\\`) REFERENCES \\`customer\\`(\\`id\\`) ON DELETE cascade ON UPDATE no action;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`order\\` ADD CONSTRAINT \\`order_employee_id_employee_id_fk\\` FOREIGN KEY (\\`employee_id\\`) REFERENCES \\`employee\\`(\\`id\\`) ON DELETE cascade ON UPDATE no action;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tALTER TABLE \\`product\\` ADD CONSTRAINT \\`product_supplier_id_supplier_id_fk\\` FOREIGN KEY (\\`supplier_id\\`) REFERENCES \\`supplier\\`(\\`id\\`) ON DELETE cascade ON UPDATE no action;\n\t\t`,\n\t);\n};\n\nconst createAllDataTypesTable = async () => {\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`all_data_types\\` (\n\t\t\t\t\\`integer\\` int,\n\t\t\t\t\\`tinyint\\` tinyint,\n\t\t\t\t\\`smallint\\` smallint,\n\t\t\t\t\\`mediumint\\` mediumint,\n\t\t\t\t\\`bigint\\` bigint,\n\t\t\t\t\\`bigint_number\\` bigint,\n\t\t\t\t\\`real\\` real,\n\t\t\t\t\\`decimal\\` decimal,\n\t\t\t\t\\`double\\` double,\n\t\t\t\t\\`float\\` float,\n\t\t\t\t\\`serial\\` serial AUTO_INCREMENT,\n\t\t\t\t\\`binary\\` binary(255),\n\t\t\t\t\\`varbinary\\` varbinary(256),\n\t\t\t\t\\`char\\` char(255),\n\t\t\t\t\\`varchar\\` varchar(256),\n\t\t\t\t\\`text\\` text,\n\t\t\t\t\\`boolean\\` boolean,\n\t\t\t\t\\`date_string\\` date,\n\t\t\t\t\\`date\\` date,\n\t\t\t\t\\`datetime\\` datetime,\n\t\t\t\t\\`datetimeString\\` datetime,\n\t\t\t\t\\`time\\` time,\n\t\t\t\t\\`year\\` year,\n\t\t\t\t\\`timestamp_date\\` timestamp,\n\t\t\t\t\\`timestamp_string\\` timestamp,\n\t\t\t\t\\`json\\` json,\n\t\t\t\t\\`popularity\\` enum('unknown','known','popular')\n\t\t\t);\n\t\t`,\n\t);\n};\n\nconst createAllGeneratorsTables = async () => {\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`datetime_table\\` (\n\t\t\t\t\\`datetime\\` datetime\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE \\`year_table\\` (\n\t\t\t\t\\`year\\` year\n\t\t\t);\n\t\t`,\n\t);\n};\n\nbeforeAll(async () => {\n\tconst connectionString = await createDockerDB();\n\n\tconst sleep = 1000;\n\tlet timeLeft = 40000;\n\tlet connected = false;\n\tlet lastError: unknown | undefined;\n\tdo {\n\t\ttry {\n\t\t\tclient = await createConnection(connectionString);\n\t\t\tawait client.connect();\n\t\t\tdb = drizzle(client);\n\t\t\tconnected = true;\n\t\t\tbreak;\n\t\t} catch (e) {\n\t\t\tlastError = e;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, sleep));\n\t\t\ttimeLeft -= sleep;\n\t\t}\n\t} while (timeLeft > 0);\n\tif (!connected) {\n\t\tconsole.error('Cannot connect to MySQL');\n\t\tawait client?.end().catch(console.error);\n\t\tawait mysqlContainer?.stop().catch(console.error);\n\t\tthrow lastError;\n\t}\n\n\tawait createNorthwindTables();\n\tawait createAllDataTypesTable();\n\tawait createAllGeneratorsTables();\n});\n\nafterAll(async () => {\n\tawait client?.end().catch(console.error);\n\tawait mysqlContainer?.stop().catch(console.error);\n});\n\nafterEach(async () => {\n\tawait reset(db, schema);\n});\n\ntest('basic seed test', async () => {\n\tawait seed(db, schema);\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(10);\n\texpect(details.length).toBe(10);\n\texpect(employees.length).toBe(10);\n\texpect(orders.length).toBe(10);\n\texpect(products.length).toBe(10);\n\texpect(suppliers.length).toBe(10);\n});\n\ntest('seed with options.count:11 test', async () => {\n\tawait seed(db, schema, { count: 11 });\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(11);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(11);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('redefine(refine) customers count', async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 12,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(12);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(11);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('redefine(refine) all tables count', async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 12,\n\t\t},\n\t\tdetails: {\n\t\t\tcount: 13,\n\t\t},\n\t\temployees: {\n\t\t\tcount: 14,\n\t\t},\n\t\torders: {\n\t\t\tcount: 15,\n\t\t},\n\t\tproducts: {\n\t\t\tcount: 16,\n\t\t},\n\t\tsuppliers: {\n\t\t\tcount: 17,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(12);\n\texpect(details.length).toBe(13);\n\texpect(employees.length).toBe(14);\n\texpect(orders.length).toBe(15);\n\texpect(products.length).toBe(16);\n\texpect(suppliers.length).toBe(17);\n});\n\ntest(\"redefine(refine) orders count using 'with' in customers\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 13,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest(\"sequential using of 'with'\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 12,\n\t\t\twith: {\n\t\t\t\tdetails: 3,\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(24);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\n// All data types test -------------------------------\ntest('basic seed test for all mysql data types', async () => {\n\tawait seed(db, schema, { count: 1000 });\n\n\tconst allDataTypes = await db.select().from(schema.allDataTypes);\n\n\t// every value in each 10 rows does not equal undefined.\n\tconst predicate = allDataTypes.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\n\texpect(predicate).toBe(true);\n});\n\n// All generators test-------------------------------\nconst count = 10000;\n\ntest('datetime generator test', async () => {\n\tawait seed(db, { datetimeTable: schema.datetimeTable }).refine((funcs) => ({\n\t\tdatetimeTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tdatetime: funcs.datetime(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.datetimeTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('year generator test', async () => {\n\tawait seed(db, { yearTable: schema.yearTable }).refine((funcs) => ({\n\t\tyearTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tyear: funcs.year(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.yearTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n"
  },
  {
    "path": "integration-tests/tests/seeder/mysqlSchema.ts",
    "content": "import type { AnyMySqlColumn } from 'drizzle-orm/mysql-core';\nimport {\n\tbigint,\n\tbinary,\n\tboolean,\n\tchar,\n\tdate,\n\tdatetime,\n\tdecimal,\n\tdouble,\n\tfloat,\n\tint,\n\tjson,\n\tmediumint,\n\tmysqlEnum,\n\tmysqlTable,\n\treal,\n\tserial,\n\tsmallint,\n\ttext,\n\ttime,\n\ttimestamp,\n\ttinyint,\n\tvarbinary,\n\tvarchar,\n\tyear,\n} from 'drizzle-orm/mysql-core';\n\nexport const customers = mysqlTable('customer', {\n\tid: varchar('id', { length: 256 }).primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tpostalCode: text('postal_code'),\n\tregion: text('region'),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n\tfax: text('fax'),\n});\n\nexport const employees = mysqlTable(\n\t'employee',\n\t{\n\t\tid: int('id').primaryKey(),\n\t\tlastName: text('last_name').notNull(),\n\t\tfirstName: text('first_name'),\n\t\ttitle: text('title').notNull(),\n\t\ttitleOfCourtesy: text('title_of_courtesy').notNull(),\n\t\tbirthDate: timestamp('birth_date').notNull(),\n\t\thireDate: timestamp('hire_date').notNull(),\n\t\taddress: text('address').notNull(),\n\t\tcity: text('city').notNull(),\n\t\tpostalCode: text('postal_code').notNull(),\n\t\tcountry: text('country').notNull(),\n\t\thomePhone: text('home_phone').notNull(),\n\t\textension: int('extension').notNull(),\n\t\tnotes: text('notes').notNull(),\n\t\treportsTo: int('reports_to').references((): AnyMySqlColumn => employees.id),\n\t\tphotoPath: text('photo_path'),\n\t},\n);\n\nexport const orders = mysqlTable('order', {\n\tid: int('id').primaryKey(),\n\torderDate: timestamp('order_date').notNull(),\n\trequiredDate: timestamp('required_date').notNull(),\n\tshippedDate: timestamp('shipped_date'),\n\tshipVia: int('ship_via').notNull(),\n\tfreight: float('freight').notNull(),\n\tshipName: text('ship_name').notNull(),\n\tshipCity: text('ship_city').notNull(),\n\tshipRegion: text('ship_region'),\n\tshipPostalCode: text('ship_postal_code'),\n\tshipCountry: text('ship_country').notNull(),\n\n\tcustomerId: varchar('customer_id', { length: 256 })\n\t\t.notNull()\n\t\t.references(() => customers.id, { onDelete: 'cascade' }),\n\n\temployeeId: int('employee_id')\n\t\t.notNull()\n\t\t.references(() => employees.id, { onDelete: 'cascade' }),\n});\n\nexport const suppliers = mysqlTable('supplier', {\n\tid: int('id').primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tregion: text('region'),\n\tpostalCode: text('postal_code').notNull(),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n});\n\nexport const products = mysqlTable('product', {\n\tid: int('id').primaryKey(),\n\tname: text('name').notNull(),\n\tquantityPerUnit: text('quantity_per_unit').notNull(),\n\tunitPrice: float('unit_price').notNull(),\n\tunitsInStock: int('units_in_stock').notNull(),\n\tunitsOnOrder: int('units_on_order').notNull(),\n\treorderLevel: int('reorder_level').notNull(),\n\tdiscontinued: int('discontinued').notNull(),\n\n\tsupplierId: int('supplier_id')\n\t\t.notNull()\n\t\t.references(() => suppliers.id, { onDelete: 'cascade' }),\n});\n\nexport const details = mysqlTable('order_detail', {\n\tunitPrice: float('unit_price').notNull(),\n\tquantity: int('quantity').notNull(),\n\tdiscount: float('discount').notNull(),\n\n\torderId: int('order_id')\n\t\t.notNull()\n\t\t.references(() => orders.id, { onDelete: 'cascade' }),\n\n\tproductId: int('product_id')\n\t\t.notNull()\n\t\t.references(() => products.id, { onDelete: 'cascade' }),\n});\n\n// All data types table -------------------------------\nexport const allDataTypes = mysqlTable('all_data_types', {\n\tint: int('integer'),\n\ttinyint: tinyint('tinyint'),\n\tsmallint: smallint('smallint'),\n\tmediumint: mediumint('mediumint'),\n\tbiginteger: bigint('bigint', { mode: 'bigint' }),\n\tbigintNumber: bigint('bigint_number', { mode: 'number' }),\n\treal: real('real'),\n\tdecimal: decimal('decimal'),\n\tdouble: double('double'),\n\tfloat: float('float'),\n\tserial: serial('serial'),\n\tbinary: binary('binary', { length: 255 }),\n\tvarbinary: varbinary('varbinary', { length: 256 }),\n\tchar: char('char', { length: 255 }),\n\tvarchar: varchar('varchar', { length: 256 }),\n\ttext: text('text'),\n\tboolean: boolean('boolean'),\n\tdateString: date('date_string', { mode: 'string' }),\n\tdate: date('date', { mode: 'date' }),\n\tdatetime: datetime('datetime', { mode: 'date' }),\n\tdatetimeString: datetime('datetimeString', { mode: 'string' }),\n\ttime: time('time'),\n\tyear: year('year'),\n\ttimestampDate: timestamp('timestamp_date', { mode: 'date' }),\n\ttimestampString: timestamp('timestamp_string', { mode: 'string' }),\n\tjson: json('json'),\n\tmysqlEnum: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n\n// All generators tables -------------------------------\nexport const datetimeTable = mysqlTable('datetime_table', {\n\tdatetime: datetime('datetime'),\n});\n\nexport const yearTable = mysqlTable('year_table', {\n\tyear: year('year'),\n});\n"
  },
  {
    "path": "integration-tests/tests/seeder/pg.test.ts",
    "content": "import { PGlite } from '@electric-sql/pglite';\nimport { sql } from 'drizzle-orm';\nimport type { PgliteDatabase } from 'drizzle-orm/pglite';\nimport { drizzle } from 'drizzle-orm/pglite';\nimport { cities, countries, firstNames, lastNames, reset, seed } from 'drizzle-seed';\nimport { afterAll, afterEach, beforeAll, expect, test } from 'vitest';\nimport * as schema from './pgSchema.ts';\n\nlet client: PGlite;\nlet db: PgliteDatabase;\n\nconst createNorthwindTables = async () => {\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"customer\" (\n\t\t\t\t\"id\" varchar(256) PRIMARY KEY NOT NULL,\n\t\t\t\t\"company_name\" text NOT NULL,\n\t\t\t\t\"contact_name\" text NOT NULL,\n\t\t\t\t\"contact_title\" text NOT NULL,\n\t\t\t\t\"address\" text NOT NULL,\n\t\t\t\t\"city\" text NOT NULL,\n\t\t\t\t\"postal_code\" text,\n\t\t\t\t\"region\" text,\n\t\t\t\t\"country\" text NOT NULL,\n\t\t\t\t\"phone\" text NOT NULL,\n\t\t\t\t\"fax\" text\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"order_detail\" (\n\t\t\t\t\"unit_price\" numeric NOT NULL,\n\t\t\t\t\"quantity\" integer NOT NULL,\n\t\t\t\t\"discount\" numeric NOT NULL,\n\t\t\t\t\"order_id\" integer NOT NULL,\n\t\t\t\t\"product_id\" integer NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"employee\" (\n\t\t\t\t\"id\" integer PRIMARY KEY NOT NULL,\n\t\t\t\t\"last_name\" text NOT NULL,\n\t\t\t\t\"first_name\" text,\n\t\t\t\t\"title\" text NOT NULL,\n\t\t\t\t\"title_of_courtesy\" text NOT NULL,\n\t\t\t\t\"birth_date\" timestamp NOT NULL,\n\t\t\t\t\"hire_date\" timestamp NOT NULL,\n\t\t\t\t\"address\" text NOT NULL,\n\t\t\t\t\"city\" text NOT NULL,\n\t\t\t\t\"postal_code\" text NOT NULL,\n\t\t\t\t\"country\" text NOT NULL,\n\t\t\t\t\"home_phone\" text NOT NULL,\n\t\t\t\t\"extension\" integer NOT NULL,\n\t\t\t\t\"notes\" text NOT NULL,\n\t\t\t\t\"reports_to\" integer,\n\t\t\t\t\"photo_path\" text\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"order\" (\n\t\t\t\t\"id\" integer PRIMARY KEY NOT NULL,\n\t\t\t\t\"order_date\" timestamp NOT NULL,\n\t\t\t\t\"required_date\" timestamp NOT NULL,\n\t\t\t\t\"shipped_date\" timestamp,\n\t\t\t\t\"ship_via\" integer NOT NULL,\n\t\t\t\t\"freight\" numeric NOT NULL,\n\t\t\t\t\"ship_name\" text NOT NULL,\n\t\t\t\t\"ship_city\" text NOT NULL,\n\t\t\t\t\"ship_region\" text,\n\t\t\t\t\"ship_postal_code\" text,\n\t\t\t\t\"ship_country\" text NOT NULL,\n\t\t\t\t\"customer_id\" text NOT NULL,\n\t\t\t\t\"employee_id\" integer NOT NULL\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"product\" (\n\t\t\t\t\"id\" integer PRIMARY KEY NOT NULL,\n\t\t\t\t\"name\" text NOT NULL,\n\t\t\t\t\"quantity_per_unit\" text NOT NULL,\n\t\t\t\t\"unit_price\" numeric NOT NULL,\n\t\t\t\t\"units_in_stock\" integer NOT NULL,\n\t\t\t\t\"units_on_order\" integer NOT NULL,\n\t\t\t\t\"reorder_level\" integer NOT NULL,\n\t\t\t\t\"discontinued\" integer NOT NULL,\n\t\t\t\t\"supplier_id\" integer NOT NULL\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"supplier\" (\n\t\t\t\t\"id\" integer PRIMARY KEY NOT NULL,\n\t\t\t\t\"company_name\" text NOT NULL,\n\t\t\t\t\"contact_name\" text NOT NULL,\n\t\t\t\t\"contact_title\" text NOT NULL,\n\t\t\t\t\"address\" text NOT NULL,\n\t\t\t\t\"city\" text NOT NULL,\n\t\t\t\t\"region\" text,\n\t\t\t\t\"postal_code\" text NOT NULL,\n\t\t\t\t\"country\" text NOT NULL,\n\t\t\t\t\"phone\" text NOT NULL\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t ALTER TABLE \"seeder_lib_pg\".\"order_detail\" ADD CONSTRAINT \"order_detail_order_id_order_id_fk\" FOREIGN KEY (\"order_id\") REFERENCES \"seeder_lib_pg\".\"order\"(\"id\") ON DELETE cascade ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t ALTER TABLE \"seeder_lib_pg\".\"order_detail\" ADD CONSTRAINT \"order_detail_product_id_product_id_fk\" FOREIGN KEY (\"product_id\") REFERENCES \"seeder_lib_pg\".\"product\"(\"id\") ON DELETE cascade ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t ALTER TABLE \"seeder_lib_pg\".\"employee\" ADD CONSTRAINT \"employee_reports_to_employee_id_fk\" FOREIGN KEY (\"reports_to\") REFERENCES \"seeder_lib_pg\".\"employee\"(\"id\") ON DELETE no action ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t ALTER TABLE \"seeder_lib_pg\".\"order\" ADD CONSTRAINT \"order_customer_id_customer_id_fk\" FOREIGN KEY (\"customer_id\") REFERENCES \"seeder_lib_pg\".\"customer\"(\"id\") ON DELETE cascade ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t ALTER TABLE \"seeder_lib_pg\".\"order\" ADD CONSTRAINT \"order_employee_id_employee_id_fk\" FOREIGN KEY (\"employee_id\") REFERENCES \"seeder_lib_pg\".\"employee\"(\"id\") ON DELETE cascade ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t ALTER TABLE \"seeder_lib_pg\".\"product\" ADD CONSTRAINT \"product_supplier_id_supplier_id_fk\" FOREIGN KEY (\"supplier_id\") REFERENCES \"seeder_lib_pg\".\"supplier\"(\"id\") ON DELETE cascade ON UPDATE no action;\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;    \n\t\t`,\n\t);\n};\n\nconst createAllDataTypesTable = async () => {\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t CREATE TYPE \"seeder_lib_pg\".\"mood_enum\" AS ENUM('sad', 'ok', 'happy');\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"all_data_types\" (\n\t\t\t\t\"integer\" integer,\n\t\t\t\t\"smallint\" smallint,\n\t\t\t\t\"bigint\" bigint,\n\t\t\t\t\"bigint_number\" bigint,\n\t\t\t\t\"serial\" serial,\n\t\t\t\t\"smallserial\" smallserial,\n\t\t\t\t\"bigserial\" bigserial,\n\t\t\t\t\"bigserial_number\" bigserial,\n\t\t\t\t\"boolean\" boolean,\n\t\t\t\t\"text\" text,\n\t\t\t\t\"varchar\" varchar(256),\n\t\t\t\t\"char\" char(256),\n\t\t\t\t\"numeric\" numeric,\n\t\t\t\t\"decimal\" numeric,\n\t\t\t\t\"real\" real,\n\t\t\t\t\"double_precision\" double precision,\n\t\t\t\t\"json\" json,\n\t\t\t\t\"jsonb\" jsonb,\n\t\t\t\t\"time\" time,\n\t\t\t\t\"timestamp_date\" timestamp,\n\t\t\t\t\"timestamp_string\" timestamp,\n\t\t\t\t\"date_string\" date,\n\t\t\t\t\"date\" date,\n\t\t\t\t\"interval\" interval,\n\t\t\t\t\"point\" \"point\",\n\t\t\t\t\"point_tuple\" \"point\",\n\t\t\t\t\"line\" \"line\",\n\t\t\t\t\"line_tuple\" \"line\",\n\t\t\t\t\"mood_enum\" \"seeder_lib_pg\".\"mood_enum\",\n\t\t\t\t\"uuid\" \"uuid\"\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"all_array_data_types\" (\n\t\t\t\t\"integer_array\" integer[],\n\t\t\t\t\"smallint_array\" smallint[],\n\t\t\t\t\"bigint_array\" bigint[],\n\t\t\t\t\"bigint_number_array\" bigint[],\n\t\t\t\t\"boolean_array\" boolean[],\n\t\t\t\t\"text_array\" text[],\n\t\t\t\t\"varchar_array\" varchar(256)[],\n\t\t\t\t\"char_array\" char(256)[],\n\t\t\t\t\"numeric_array\" numeric[],\n\t\t\t\t\"decimal_array\" numeric[],\n\t\t\t\t\"real_array\" real[],\n\t\t\t\t\"double_precision_array\" double precision[],\n\t\t\t\t\"json_array\" json[],\n\t\t\t\t\"jsonb_array\" jsonb[],\n\t\t\t\t\"time_array\" time[],\n\t\t\t\t\"timestamp_date_array\" timestamp[],\n\t\t\t\t\"timestamp_string_array\" timestamp[],\n\t\t\t\t\"date_string_array\" date[],\n\t\t\t\t\"date_array\" date[],\n\t\t\t\t\"interval_array\" interval[],\n\t\t\t\t\"point_array\" \"point\"[],\n\t\t\t\t\"point_tuple_array\" \"point\"[],\n\t\t\t\t\"line_array\" \"line\"[],\n\t\t\t\t\"line_tuple_array\" \"line\"[],\n\t\t\t\t\"mood_enum_array\" \"seeder_lib_pg\".\"mood_enum\"[]\n\t\t\t);\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"nd_arrays\" (\n\t\t\t\t\"integer_1d_array\" integer[3],\n\t\t\t\t\"integer_2d_array\" integer[3][4],\n\t\t\t\t\"integer_3d_array\" integer[3][4][5],\n\t\t\t\t\"integer_4d_array\" integer[3][4][5][6]\n\t\t\t);\n\t\t`,\n\t);\n};\n\nconst createAllGeneratorsTables = async () => {\n\tawait db.execute(\n\t\tsql`\n\t\t\t    DO $$ BEGIN\n\t\t\t CREATE TYPE \"seeder_lib_pg\".\"enum\" AS ENUM('sad', 'ok', 'happy');\n\t\t\tEXCEPTION\n\t\t\t WHEN duplicate_object THEN null;\n\t\t\tEND $$;  \n\t\t`,\n\t);\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"default_table\" (\n\t\t\t\t\"default_string\" text\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"default_array_table\" (\n\t\t\t\t\"default_string\" text[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"boolean_table\" (\n\t\t\t\t\"boolean\" boolean\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"boolean_array_table\" (\n\t\t\t\t\"boolean\" boolean[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"city_table\" (\n\t\t\t\t\"city\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"city_unique_table\" (\n\t\t\t\t\"city_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"city_unique_table_city_unique_unique\" UNIQUE(\"city_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"city_array_table\" (\n\t\t\t\t\"city\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"company_name_table\" (\n\t\t\t\t\"company_name\" text\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"company_name_unique_table\" (\n\t\t\t\t\"company_name_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"company_name_unique_table_company_name_unique_unique\" UNIQUE(\"company_name_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"company_name_array_table\" (\n\t\t\t\t\"company_name\" text[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"country_table\" (\n\t\t\t\t\"country\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"country_unique_table\" (\n\t\t\t\t\"country_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"country_unique_table_country_unique_unique\" UNIQUE(\"country_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"country_array_table\" (\n\t\t\t\t\"country\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"date_table\" (\n\t\t\t\t\"date\" date\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"date_array_table\" (\n\t\t\t\t\"date\" date[],\n\t\t\t\t\"date_string\" date[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"email_table\" (\n\t\t\t\t\"email\" varchar(256),\n\t\t\t\tCONSTRAINT \"email_table_email_unique\" UNIQUE(\"email\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"email_array_table\" (\n\t\t\t\t\"email\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"enum_table\" (\n\t\t\t\t\"mood_enum\" \"seeder_lib_pg\".\"enum\"\n\t\t\t);  \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"first_name_table\" (\n\t\t\t\t\"first_name\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"first_name_unique_table\" (\n\t\t\t\t\"first_name_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"first_name_unique_table_first_name_unique_unique\" UNIQUE(\"first_name_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"first_name_array_table\" (\n\t\t\t\t\"first_name\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"full_name__table\" (\n\t\t\t\t\"full_name_\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"full_name_unique_table\" (\n\t\t\t\t\"full_name_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"full_name_unique_table_full_name_unique_unique\" UNIQUE(\"full_name_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"full_name_array_table\" (\n\t\t\t\t\"full_name\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"int_primary_key_table\" (\n\t\t\t\t\"int_primary_key\" integer,\n\t\t\t\tCONSTRAINT \"int_primary_key_table_int_primary_key_unique\" UNIQUE(\"int_primary_key\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"int_table\" (\n\t\t\t\t\"int\" integer\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"int_unique_table\" (\n\t\t\t\t\"int_unique\" integer,\n\t\t\t\tCONSTRAINT \"int_unique_table_int_unique_unique\" UNIQUE(\"int_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"int_array_table\" (\n\t\t\t\t\"int\" integer[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"interval_table\" (\n\t\t\t\t\"interval\" interval\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"interval_unique_table\" (\n\t\t\t\t\"interval_unique\" interval,\n\t\t\t\tCONSTRAINT \"interval_unique_table_interval_unique_unique\" UNIQUE(\"interval_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"interval_array_table\" (\n\t\t\t\t\"interval\" interval[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"job_title_table\" (\n\t\t\t\t\"job_title\" text\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"job_title_array_table\" (\n\t\t\t\t\"job_title\" text[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"json_table\" (\n\t\t\t\t\"json\" json\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"json_array_table\" (\n\t\t\t\t\"json\" json[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"last_name_table\" (\n\t\t\t\t\"last_name\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"last_name_unique_table\" (\n\t\t\t\t\"last_name_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"last_name_unique_table_last_name_unique_unique\" UNIQUE(\"last_name_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"last_name_array_table\" (\n\t\t\t\t\"last_name\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"line_table\" (\n\t\t\t\t\"line\" \"line\"\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"line_array_table\" (\n\t\t\t\t\"line\" \"line\"[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"lorem_ipsum_table\" (\n\t\t\t\t\"lorem_ipsum\" text\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"lorem_ipsum_array_table\" (\n\t\t\t\t\"lorem_ipsum\" text[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"number_table\" (\n\t\t\t\t\"number\" real\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"number_unique_table\" (\n\t\t\t\t\"number_unique\" real,\n\t\t\t\tCONSTRAINT \"number_unique_table_number_unique_unique\" UNIQUE(\"number_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"number_array_table\" (\n\t\t\t\t\"number\" real[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"phone_number_table\" (\n\t\t\t\t\"phoneNumber\" varchar(256),\n\t\t\t\t\"phone_number_template\" varchar(256),\n\t\t\t\t\"phone_number_prefixes\" varchar(256),\n\t\t\t\tCONSTRAINT \"phone_number_table_phoneNumber_unique\" UNIQUE(\"phoneNumber\"),\n\t\t\t\tCONSTRAINT \"phone_number_table_phone_number_template_unique\" UNIQUE(\"phone_number_template\"),\n\t\t\t\tCONSTRAINT \"phone_number_table_phone_number_prefixes_unique\" UNIQUE(\"phone_number_prefixes\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"phone_number_array_table\" (\n\t\t\t\t\"phoneNumber\" varchar(256)[],\n\t\t\t\t\"phone_number_template\" varchar(256)[],\n\t\t\t\t\"phone_number_prefixes\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"point_table\" (\n\t\t\t\t\"point\" \"point\"\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"point_array_table\" (\n\t\t\t\t\"point\" \"point\"[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"postcode_table\" (\n\t\t\t\t\"postcode\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"postcode_unique_table\" (\n\t\t\t\t\"postcode_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"postcode_unique_table_postcode_unique_unique\" UNIQUE(\"postcode_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"postcode_array_table\" (\n\t\t\t\t\"postcode\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"state_table\" (\n\t\t\t\t\"state\" text\n\t\t\t);   \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"state_array_table\" (\n\t\t\t\t\"state\" text[]\n\t\t\t);   \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"street_address_table\" (\n\t\t\t\t\"street_address\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"street_address_unique_table\" (\n\t\t\t\t\"street_address_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"street_address_unique_table_street_address_unique_unique\" UNIQUE(\"street_address_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"street_address_array_table\" (\n\t\t\t\t\"street_address\" varchar(256)[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"string_table\" (\n\t\t\t\t\"string\" text\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"string_unique_table\" (\n\t\t\t\t\"string_unique\" varchar(256),\n\t\t\t\tCONSTRAINT \"string_unique_table_string_unique_unique\" UNIQUE(\"string_unique\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"string_array_table\" (\n\t\t\t\t\"string\" text[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"time_table\" (\n\t\t\t\t\"time\" time\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"time_array_table\" (\n\t\t\t\t\"time\" time[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"timestamp_table\" (\n\t\t\t\t\"timestamp\" timestamp\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"timestamp_array_table\" (\n\t\t\t\t\"timestamp\" timestamp[]\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"values_from_array_table\" (\n\t\t\t\t\"values_from_array_not_null\" varchar(256) NOT NULL,\n\t\t\t\t\"values_from_array_weighted_not_null\" varchar(256) NOT NULL\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"values_from_array_unique_table\" (\n\t\t\t\t\"values_from_array\" varchar(256),\n\t\t\t\t\"values_from_array_not_null\" varchar(256) NOT NULL,\n\t\t\t\t\"values_from_array_weighted\" varchar(256),\n\t\t\t\t\"values_from_array_weighted_not_null\" varchar(256) NOT NULL,\n\t\t\t\tCONSTRAINT \"values_from_array_unique_table_values_from_array_unique\" UNIQUE(\"values_from_array\"),\n\t\t\t\tCONSTRAINT \"values_from_array_unique_table_values_from_array_not_null_unique\" UNIQUE(\"values_from_array_not_null\"),\n\t\t\t\tCONSTRAINT \"values_from_array_unique_table_values_from_array_weighted_unique\" UNIQUE(\"values_from_array_weighted\"),\n\t\t\t\tCONSTRAINT \"values_from_array_unique_table_values_from_array_weighted_not_null_unique\" UNIQUE(\"values_from_array_weighted_not_null\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"values_from_array_array_table\" (\n\t\t\t\t\"values_from_array\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"weighted_random_table\" (\n\t\t\t\t\"weighted_random\" varchar(256)\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\t    CREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"weighted_random_with_unique_gens_table\" (\n\t\t\t\t\"weighted_random_with_unique_gens\" varchar(256),\n\t\t\t\tCONSTRAINT \"weighted_random_with_unique_gens_table_weighted_random_with_unique_gens_unique\" UNIQUE(\"weighted_random_with_unique_gens\")\n\t\t\t);    \n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tCREATE TABLE IF NOT EXISTS \"seeder_lib_pg\".\"identity_columns_table\" (\n\t\t\t\t\t\t\t\"id\" integer GENERATED ALWAYS AS IDENTITY,\n\t\t\t\t\t\t\t\"id1\" integer,\n\t\t\t\t\t\t\t\"name\" text\n\t\t\t\t\t\t); \n\t\t`,\n\t);\n};\n\nbeforeAll(async () => {\n\tclient = new PGlite();\n\n\tdb = drizzle(client);\n\n\tawait db.execute(sql`CREATE SCHEMA IF NOT EXISTS \"seeder_lib_pg\";`);\n\n\tawait createNorthwindTables();\n\tawait createAllDataTypesTable();\n\tawait createAllGeneratorsTables();\n});\n\nafterEach(async () => {\n\tawait reset(db, schema);\n});\n\nafterAll(async () => {\n\tawait client.close();\n});\n\ntest('basic seed test', async () => {\n\tconst currSchema = {\n\t\tcustomers: schema.customers,\n\t\tdetails: schema.details,\n\t\temployees: schema.employees,\n\t\torders: schema.orders,\n\t\tproducts: schema.products,\n\t\tsuppliers: schema.suppliers,\n\t};\n\tawait seed(db, currSchema);\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(10);\n\texpect(details.length).toBe(10);\n\texpect(employees.length).toBe(10);\n\texpect(orders.length).toBe(10);\n\texpect(products.length).toBe(10);\n\texpect(suppliers.length).toBe(10);\n});\n\ntest('seed with options.count:11 test', async () => {\n\tconst currSchema = {\n\t\tcustomers: schema.customers,\n\t\tdetails: schema.details,\n\t\temployees: schema.employees,\n\t\torders: schema.orders,\n\t\tproducts: schema.products,\n\t\tsuppliers: schema.suppliers,\n\t};\n\tawait seed(db, currSchema, { count: 11 });\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(11);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(11);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('redefine(refine) customers count', async () => {\n\tconst currSchema = {\n\t\tcustomers: schema.customers,\n\t\tdetails: schema.details,\n\t\temployees: schema.employees,\n\t\torders: schema.orders,\n\t\tproducts: schema.products,\n\t\tsuppliers: schema.suppliers,\n\t};\n\tawait seed(db, currSchema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 12,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(12);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(11);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('redefine(refine) all tables count', async () => {\n\tconst currSchema = {\n\t\tcustomers: schema.customers,\n\t\tdetails: schema.details,\n\t\temployees: schema.employees,\n\t\torders: schema.orders,\n\t\tproducts: schema.products,\n\t\tsuppliers: schema.suppliers,\n\t};\n\tawait seed(db, currSchema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 12,\n\t\t},\n\t\tdetails: {\n\t\t\tcount: 13,\n\t\t},\n\t\temployees: {\n\t\t\tcount: 14,\n\t\t},\n\t\torders: {\n\t\t\tcount: 15,\n\t\t},\n\t\tproducts: {\n\t\t\tcount: 16,\n\t\t},\n\t\tsuppliers: {\n\t\t\tcount: 17,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(12);\n\texpect(details.length).toBe(13);\n\texpect(employees.length).toBe(14);\n\texpect(orders.length).toBe(15);\n\texpect(products.length).toBe(16);\n\texpect(suppliers.length).toBe(17);\n});\n\ntest(\"redefine(refine) orders count using 'with' in customers\", async () => {\n\tconst currSchema = {\n\t\tcustomers: schema.customers,\n\t\tdetails: schema.details,\n\t\temployees: schema.employees,\n\t\torders: schema.orders,\n\t\tproducts: schema.products,\n\t\tsuppliers: schema.suppliers,\n\t};\n\tawait seed(db, currSchema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 13,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest(\"sequential using of 'with'\", async () => {\n\tconst currSchema = {\n\t\tcustomers: schema.customers,\n\t\tdetails: schema.details,\n\t\temployees: schema.employees,\n\t\torders: schema.orders,\n\t\tproducts: schema.products,\n\t\tsuppliers: schema.suppliers,\n\t};\n\tawait seed(db, currSchema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 12,\n\t\t\twith: {\n\t\t\t\tdetails: 3,\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(24);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('seeding with identity columns', async () => {\n\tawait seed(db, { identityColumnsTable: schema.identityColumnsTable });\n\n\tconst result = await db.select().from(schema.identityColumnsTable);\n\n\texpect(result.length).toBe(10);\n});\n\n// All data types test -------------------------------\ntest('basic seed test for all postgres data types', async () => {\n\tawait seed(db, { allDataTypes: schema.allDataTypes }, { count: 10000 });\n\n\tconst allDataTypes = await db.select().from(schema.allDataTypes);\n\t// every value in each 10 rows does not equal undefined.\n\tconst predicate = allDataTypes.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\n\texpect(predicate).toBe(true);\n});\n\ntest('all array data types test', async () => {\n\tawait seed(db, { allArrayDataTypes: schema.allArrayDataTypes }, { count: 1000 });\n\n\tconst allArrayDataTypes = await db.select().from(schema.allArrayDataTypes);\n\t// every value in each rows does not equal undefined.\n\tconst predicate = allArrayDataTypes.every((row) =>\n\t\tObject.values(row).every((val) => val !== undefined && val !== null && val.length === 10)\n\t);\n\n\texpect(predicate).toBe(true);\n});\n\ntest('nd arrays', async () => {\n\tawait seed(db, { ndArrays: schema.ndArrays }, { count: 1000 });\n\n\tconst ndArrays = await db.select().from(schema.ndArrays);\n\t// every value in each rows does not equal undefined.\n\tconst predicate0 = ndArrays.every((row) =>\n\t\tObject.values(row).every((val) => val !== undefined && val !== null && val.length !== 0)\n\t);\n\tlet predicate1 = true, predicate2 = true, predicate3 = true, predicate4 = true;\n\n\tfor (const row of ndArrays) {\n\t\tpredicate1 = predicate1 && (row.integer1DArray?.length === 3);\n\n\t\tpredicate2 = predicate2 && (row.integer2DArray?.length === 4) && (row.integer2DArray[0]?.length === 3);\n\n\t\tpredicate3 = predicate3 && (row.integer3DArray?.length === 5) && (row.integer3DArray[0]?.length === 4)\n\t\t\t&& (row.integer3DArray[0][0]?.length === 3);\n\n\t\tpredicate4 = predicate4 && (row.integer4DArray?.length === 6) && (row.integer4DArray[0]?.length === 5)\n\t\t\t&& (row.integer4DArray[0][0]?.length === 4) && (row.integer4DArray[0][0][0]?.length === 3);\n\t}\n\n\texpect(predicate0 && predicate1 && predicate2 && predicate3 && predicate4).toBe(true);\n});\n\n// All generators test-------------------------------\nconst count = 1000;\n\ntest('enum generator test', async () => {\n\tawait seed(db, { enumTable: schema.enumTable }).refine(() => ({\n\t\tenumTable: {\n\t\t\tcount,\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.enumTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('default generator test', async () => {\n\tawait seed(db, { defaultTable: schema.defaultTable }).refine((funcs) => ({\n\t\tdefaultTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tdefaultString: funcs.default({ defaultValue: 'default string' }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.defaultTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('default array generator test', async () => {\n\tawait seed(db, { defaultTable: schema.defaultArrayTable }).refine((funcs) => ({\n\t\tdefaultTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tdefaultString: funcs.default({ defaultValue: 'default string', arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.defaultArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('valuesFromArray generator test', async () => {\n\tawait seed(db, { valuesFromArrayTable: schema.valuesFromArrayTable }).refine((funcs) => ({\n\t\tvaluesFromArrayTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tvaluesFromArrayNotNull: funcs.valuesFromArray({ values: lastNames }),\n\t\t\t\tvaluesFromArrayWeightedNotNull: funcs.valuesFromArray({\n\t\t\t\t\tvalues: [\n\t\t\t\t\t\t{ values: lastNames, weight: 0.3 },\n\t\t\t\t\t\t{ values: firstNames, weight: 0.7 },\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.valuesFromArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('valuesFromArray unique generator test', async () => {\n\t// valuesFromArrayUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { valuesFromArrayUniqueTable: schema.valuesFromArrayUniqueTable }, { seed: 1 }).refine((funcs) => ({\n\t\tvaluesFromArrayUniqueTable: {\n\t\t\tcount: 49998,\n\t\t\tcolumns: {\n\t\t\t\tvaluesFromArray: funcs.valuesFromArray({ values: lastNames.slice(0, 20), isUnique: true }),\n\t\t\t\tvaluesFromArrayNotNull: funcs.valuesFromArray({ values: lastNames, isUnique: true }),\n\t\t\t\tvaluesFromArrayWeighted: funcs.valuesFromArray({\n\t\t\t\t\tvalues: [\n\t\t\t\t\t\t{ values: lastNames.slice(0, 20000), weight: 0.3 },\n\t\t\t\t\t\t{ values: lastNames.slice(20000), weight: 0.7 },\n\t\t\t\t\t],\n\t\t\t\t\tisUnique: true,\n\t\t\t\t}),\n\t\t\t\tvaluesFromArrayWeightedNotNull: funcs.valuesFromArray({\n\t\t\t\t\tvalues: [\n\t\t\t\t\t\t{ values: lastNames.slice(0, 14920), weight: 0.3 },\n\t\t\t\t\t\t{ values: lastNames.slice(14920), weight: 0.7 },\n\t\t\t\t\t],\n\t\t\t\t\tisUnique: true,\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.valuesFromArrayUniqueTable);\n\t// console.log(valuesFromArrayUniqueTableData);\n\tconst predicate = data.length !== 0 && data.every((row) =>\n\t\trow['valuesFromArrayWeightedNotNull'] !== null\n\t\t&& row['valuesFromArrayNotNull'] !== null\n\t);\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { valuesFromArrayUniqueTable: schema.valuesFromArrayUniqueTable }).refine((funcs) => ({\n\t\t\tvaluesFromArrayUniqueTable: {\n\t\t\t\tcount: 49998,\n\t\t\t\tcolumns: {\n\t\t\t\t\tvaluesFromArrayWeightedNotNull: funcs.valuesFromArray({\n\t\t\t\t\t\tvalues: [\n\t\t\t\t\t\t\t{ values: lastNames.slice(0, 20000), weight: 0.3 },\n\t\t\t\t\t\t\t{ values: lastNames.slice(20000), weight: 0.7 },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tisUnique: true,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow(\n\t\t/^weighted values arrays is too small to generate values with specified probability for unique not null column\\..+/,\n\t);\n\n\tawait expect(\n\t\tseed(db, { valuesFromArrayUniqueTable: schema.valuesFromArrayUniqueTable }).refine((funcs) => ({\n\t\t\tvaluesFromArrayUniqueTable: {\n\t\t\t\tcount: 49998,\n\t\t\t\tcolumns: {\n\t\t\t\t\tvaluesFromArrayNotNull: funcs.valuesFromArray({\n\t\t\t\t\t\tvalues: lastNames.slice(20),\n\t\t\t\t\t\tisUnique: true,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('There are no enough values to fill unique column.');\n\n\tawait expect(\n\t\tseed(db, { valuesFromArrayUniqueTable: schema.valuesFromArrayUniqueTable }, { seed: 1 }).refine((funcs) => ({\n\t\t\tvaluesFromArrayUniqueTable: {\n\t\t\t\tcount: 49999,\n\t\t\t\tcolumns: {\n\t\t\t\t\tvaluesFromArrayNotNull: funcs.valuesFromArray({\n\t\t\t\t\t\tvalues: lastNames,\n\t\t\t\t\t\tisUnique: true,\n\t\t\t\t\t}),\n\t\t\t\t\tvaluesFromArrayWeightedNotNull: funcs.valuesFromArray({\n\t\t\t\t\t\tvalues: [\n\t\t\t\t\t\t\t{ values: lastNames.slice(0, 14854), weight: 0.3 },\n\t\t\t\t\t\t\t{ values: lastNames.slice(14854), weight: 0.7 },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tisUnique: true,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('There are no enough values to fill unique column.');\n});\n\ntest('valuesFromArray array generator test', async () => {\n\tawait seed(db, { valuesFromArrayTable: schema.valuesFromArrayArrayTable }).refine((funcs) => ({\n\t\tvaluesFromArrayTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tvaluesFromArray: funcs.valuesFromArray({ values: lastNames, arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.valuesFromArrayArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('intPrimaryKey generator test', async () => {\n\tawait seed(db, { intPrimaryKeyTable: schema.intPrimaryKeyTable }).refine((funcs) => ({\n\t\tintPrimaryKeyTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tintPrimaryKey: funcs.intPrimaryKey(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intPrimaryKeyTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('number generator test', async () => {\n\tawait seed(db, { numberTable: schema.numberTable }).refine((funcs) => ({\n\t\tnumberTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tnumber: funcs.number(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.numberTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('number unique generator test', async () => {\n\t// numberUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { numberUniqueTable: schema.numberUniqueTable }).refine((funcs) => ({\n\t\tnumberUniqueTable: {\n\t\t\tcount: 20070,\n\t\t\tcolumns: {\n\t\t\t\tnumberUnique: funcs.number({ isUnique: true, minValue: -100.23, maxValue: 100.46 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.numberUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) =>\n\t\t\tObject.values(row).every((val) => val !== undefined && val !== null && val >= -100.23 && val <= 100.46)\n\t\t);\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { numberUniqueTable: schema.numberUniqueTable }).refine((funcs) => ({\n\t\t\tnumberUniqueTable: {\n\t\t\t\tcount: 20071,\n\t\t\t\tcolumns: {\n\t\t\t\t\tnumberUnique: funcs.number({ isUnique: true, minValue: -100.23, maxValue: 100.46 }),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique integers in given range(min, max), try to make range wider.');\n});\n\ntest('number array generator test', async () => {\n\tawait seed(db, { numberTable: schema.numberArrayTable }).refine((funcs) => ({\n\t\tnumberTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tnumber: funcs.number({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.numberArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('int generator test', async () => {\n\tawait seed(db, { intTable: schema.intTable }).refine((funcs) => ({\n\t\tintTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tint: funcs.int(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('int unique generator test', async () => {\n\t// intUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { intUniqueTable: schema.intUniqueTable }).refine((funcs) => ({\n\t\tintUniqueTable: {\n\t\t\tcount: 201,\n\t\t\tcolumns: {\n\t\t\t\tintUnique: funcs.int({ isUnique: true, minValue: -100, maxValue: 100 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { intUniqueTable: schema.intUniqueTable }).refine((funcs) => ({\n\t\t\tintUniqueTable: {\n\t\t\t\tcount: 202,\n\t\t\t\tcolumns: {\n\t\t\t\t\tintUnique: funcs.int({ isUnique: true, minValue: -100, maxValue: 100 }),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique integers in given range(min, max), try to make range wider.');\n});\n\ntest('int array generator test', async () => {\n\tawait seed(db, { intTable: schema.intArrayTable }).refine((funcs) => ({\n\t\tintTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tint: funcs.int({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('boolean generator test', async () => {\n\tawait seed(db, { booleanTable: schema.booleanTable }).refine((funcs) => ({\n\t\tbooleanTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tboolean: funcs.boolean(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.booleanTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('boolean array generator test', async () => {\n\tawait seed(db, { booleanTable: schema.booleanArrayTable }).refine((funcs) => ({\n\t\tbooleanTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tboolean: funcs.boolean({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.booleanArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('date generator test', async () => {\n\tawait seed(db, { dateTable: schema.dateTable }).refine((funcs) => ({\n\t\tdateTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tdate: funcs.date(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.dateTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('date array generator test', async () => {\n\tawait seed(db, { dateTable: schema.dateArrayTable }).refine((funcs) => ({\n\t\tdateTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tdate: funcs.date({ arraySize: 3 }),\n\t\t\t\tdateString: funcs.date({ arraySize: 4 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.dateArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) =>\n\t\t\tObject.values(row).every((val) => val !== undefined && val !== null && [3, 4].includes(val.length))\n\t\t);\n\texpect(predicate).toBe(true);\n});\n\ntest('time generator test', async () => {\n\tawait seed(db, { timeTable: schema.timeTable }).refine((funcs) => ({\n\t\ttimeTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\ttime: funcs.time(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.timeTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('time array generator test', async () => {\n\tawait seed(db, { timeTable: schema.timeArrayTable }).refine((funcs) => ({\n\t\ttimeTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\ttime: funcs.time({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.timeArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('timestamp generator test', async () => {\n\tawait seed(db, { timestampTable: schema.timestampTable }).refine((funcs) => ({\n\t\ttimestampTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\ttimestamp: funcs.timestamp(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.timestampTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('timestamp array generator test', async () => {\n\tawait seed(db, { timestampTable: schema.timestampArrayTable }).refine((funcs) => ({\n\t\ttimestampTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\ttimestamp: funcs.timestamp({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.timestampArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('json generator test', async () => {\n\tawait seed(db, { jsonTable: schema.jsonTable }).refine((funcs) => ({\n\t\tjsonTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tjson: funcs.json(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.jsonTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('json array generator test', async () => {\n\tawait seed(db, { jsonTable: schema.jsonArrayTable }).refine((funcs) => ({\n\t\tjsonTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tjson: funcs.json({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.jsonArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('interval generator test', async () => {\n\tawait seed(db, { intervalTable: schema.intervalTable }).refine((funcs) => ({\n\t\tintervalTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tinterval: funcs.interval(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intervalTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('interval unique generator test', async () => {\n\t// intervalUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { intervalUniqueTable: schema.intervalUniqueTable }).refine((funcs) => ({\n\t\tintervalUniqueTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tintervalUnique: funcs.interval({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intervalUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('interval array generator test', async () => {\n\tawait seed(db, { intervalTable: schema.intervalArrayTable }).refine((funcs) => ({\n\t\tintervalTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tinterval: funcs.interval({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.intervalArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('string generator test', async () => {\n\tawait seed(db, { stringTable: schema.stringTable }).refine((funcs) => ({\n\t\tstringTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstring: funcs.string(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.stringTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('string unique generator test', async () => {\n\tawait seed(db, { stringUniqueTable: schema.stringUniqueTable }).refine((funcs) => ({\n\t\tstringUniqueTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstringUnique: funcs.string({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.stringUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('string array generator test', async () => {\n\tawait seed(db, { stringTable: schema.stringArrayTable }).refine((funcs) => ({\n\t\tstringTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstring: funcs.string({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.stringArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('email generator test', async () => {\n\tawait seed(db, { emailTable: schema.emailTable }).refine((funcs) => ({\n\t\temailTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\temail: funcs.email(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.emailTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('email array generator test', async () => {\n\tawait seed(db, { emailTable: schema.emailArrayTable }).refine((funcs) => ({\n\t\temailTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\temail: funcs.email({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.emailArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('firstName generator test', async () => {\n\tawait seed(db, { firstNameTable: schema.firstNameTable }).refine((funcs) => ({\n\t\tfirstNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tfirstName: funcs.firstName(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.firstNameTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('firstName unique generator test', async () => {\n\t// firstNameUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { firstNameUniqueTable: schema.firstNameUniqueTable }).refine((funcs) => ({\n\t\tfirstNameUniqueTable: {\n\t\t\tcount: 30274,\n\t\t\tcolumns: {\n\t\t\t\tfirstNameUnique: funcs.firstName({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.firstNameUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { firstNameUniqueTable: schema.firstNameUniqueTable }, { count: 30275 }).refine((funcs) => ({\n\t\t\tfirstNameUniqueTable: {\n\t\t\t\tcount: 30275,\n\t\t\t\tcolumns: {\n\t\t\t\t\tfirstNameUnique: funcs.firstName({ isUnique: true }),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique first names.');\n});\n\ntest('firstName array generator test', async () => {\n\tawait seed(db, { firstNameTable: schema.firstNameArrayTable }).refine((funcs) => ({\n\t\tfirstNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tfirstName: funcs.firstName({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.firstNameArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('lastName generator test', async () => {\n\tawait seed(db, { lastNameTable: schema.lastNameTable }).refine((funcs) => ({\n\t\tlastNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tlastName: funcs.lastName(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.lastNameTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('lastName unique generator test', async () => {\n\t// lastNameUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { lastNameUniqueTable: schema.lastNameUniqueTable }).refine((funcs) => ({\n\t\tlastNameUniqueTable: {\n\t\t\tcount: 49998,\n\t\t\tcolumns: {\n\t\t\t\tlastNameUnique: funcs.lastName({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.lastNameUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { lastNameUniqueTable: schema.lastNameUniqueTable }).refine((funcs) => ({\n\t\t\tlastNameUniqueTable: {\n\t\t\t\tcount: 49999,\n\t\t\t\tcolumns: {\n\t\t\t\t\tlastNameUnique: funcs.lastName({ isUnique: true }),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique last names.');\n});\n\ntest('lastName array generator test', async () => {\n\tawait seed(db, { lastNameTable: schema.lastNameArrayTable }).refine((funcs) => ({\n\t\tlastNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tlastName: funcs.lastName({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.lastNameArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('fullName generator test', async () => {\n\tawait seed(db, { fullNameTable: schema.fullNameTable }).refine((funcs) => ({\n\t\tfullNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tfullName: funcs.fullName(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.fullNameTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('fullName unique generator test', async () => {\n\t// fullNameUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { fullNameUniqueTable: schema.fullNameUniqueTable }).refine((funcs) => ({\n\t\tfullNameUniqueTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tfullNameUnique: funcs.fullName({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.fullNameUniqueTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('fullName array generator test', async () => {\n\tawait seed(db, { fullNameTable: schema.fullNameArrayTable }).refine((funcs) => ({\n\t\tfullNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tfullName: funcs.fullName({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.fullNameArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('country generator test', async () => {\n\tawait seed(db, { countryTable: schema.countryTable }).refine((funcs) => ({\n\t\tcountryTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcountry: funcs.country(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.countryTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('country unique generator test', async () => {\n\t// countryUniqueTable-----------------------------------------------------------------------------------\n\tawait seed(db, { countryUniqueTable: schema.countryUniqueTable }).refine((funcs) => ({\n\t\tcountryUniqueTable: {\n\t\t\tcount: countries.length,\n\t\t\tcolumns: {\n\t\t\t\tcountryUnique: funcs.country({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.countryUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { countryUniqueTable: schema.countryUniqueTable }).refine((funcs) => ({\n\t\t\tcountryUniqueTable: {\n\t\t\t\tcount: countries.length + 1,\n\t\t\t\tcolumns: {\n\t\t\t\t\tcountryUnique: funcs.country({ isUnique: true }),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique countries.');\n});\n\ntest('country array generator test', async () => {\n\tawait seed(db, { countryTable: schema.countryArrayTable }).refine((funcs) => ({\n\t\tcountryTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcountry: funcs.country({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.countryArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('city generator test', async () => {\n\tawait seed(db, { cityTable: schema.cityTable }).refine((funcs) => ({\n\t\tcityTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcity: funcs.city(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.cityTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('city unique generator test', async () => {\n\t// cityUniqueTable-----------------------------------------------------------------------------------\n\tawait reset(db, { cityUniqueTable: schema.cityUniqueTable });\n\tawait seed(db, { cityUniqueTable: schema.cityUniqueTable }).refine((funcs) => ({\n\t\tcityUniqueTable: {\n\t\t\tcount: cities.length,\n\t\t\tcolumns: {\n\t\t\t\tcityUnique: funcs.city({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.cityUniqueTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { cityUniqueTable: schema.cityUniqueTable }).refine((funcs) => ({\n\t\t\tcityUniqueTable: {\n\t\t\t\tcount: cities.length + 1,\n\t\t\t\tcolumns: {\n\t\t\t\t\tcityUnique: funcs.city({ isUnique: true }),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique cities.');\n});\n\ntest('city array generator test', async () => {\n\tawait seed(db, { cityTable: schema.cityArrayTable }).refine((funcs) => ({\n\t\tcityTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcity: funcs.city({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.cityArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('streetAddress generator test', async () => {\n\tawait seed(db, { streetAddressTable: schema.streetAddressTable }).refine((funcs) => ({\n\t\tstreetAddressTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstreetAddress: funcs.streetAddress(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.streetAddressTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('streetAddress unique generator test', async () => {\n\tawait seed(db, { streetAddressUniqueTable: schema.streetAddressUniqueTable }).refine((funcs) => ({\n\t\tstreetAddressUniqueTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstreetAddressUnique: funcs.streetAddress({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.streetAddressUniqueTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('streetAddress array generator test', async () => {\n\tawait seed(db, { streetAddressTable: schema.streetAddressArrayTable }).refine((funcs) => ({\n\t\tstreetAddressTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstreetAddress: funcs.streetAddress({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.streetAddressArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('jobTitle generator test', async () => {\n\tawait seed(db, { jobTitleTable: schema.jobTitleTable }).refine((funcs) => ({\n\t\tjobTitleTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tjobTitle: funcs.jobTitle(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.jobTitleTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('jobTitle array generator test', async () => {\n\tawait seed(db, { jobTitleTable: schema.jobTitleArrayTable }).refine((funcs) => ({\n\t\tjobTitleTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tjobTitle: funcs.jobTitle({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.jobTitleArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('postcode generator test', async () => {\n\tawait seed(db, { postcodeTable: schema.postcodeTable }).refine((funcs) => ({\n\t\tpostcodeTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tpostcode: funcs.postcode(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.postcodeTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('postcode unique generator test', async () => {\n\tawait seed(db, { postcodeUniqueTable: schema.postcodeUniqueTable }).refine((funcs) => ({\n\t\tpostcodeUniqueTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tpostcodeUnique: funcs.postcode({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.postcodeUniqueTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('postcode array generator test', async () => {\n\tawait seed(db, { postcodeTable: schema.postcodeArrayTable }).refine((funcs) => ({\n\t\tpostcodeTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tpostcode: funcs.postcode({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.postcodeArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('state generator test', async () => {\n\tawait seed(db, { stateTable: schema.stateTable }).refine((funcs) => ({\n\t\tstateTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstate: funcs.state(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.stateTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('state array generator test', async () => {\n\tawait seed(db, { stateTable: schema.stateArrayTable }).refine((funcs) => ({\n\t\tstateTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tstate: funcs.state({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.stateArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('companyName generator test', async () => {\n\tawait seed(db, { companyNameTable: schema.companyNameTable }).refine((funcs) => ({\n\t\tcompanyNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcompanyName: funcs.companyName(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.companyNameTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('companyName unique generator test', async () => {\n\tawait seed(db, { companyNameUniqueTable: schema.companyNameUniqueTable }).refine((funcs) => ({\n\t\tcompanyNameUniqueTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcompanyNameUnique: funcs.companyName({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.companyNameUniqueTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('companyName array generator test', async () => {\n\tawait seed(db, { companyNameTable: schema.companyNameArrayTable }).refine((funcs) => ({\n\t\tcompanyNameTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tcompanyName: funcs.companyName({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.companyNameArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('loremIpsum generator test', async () => {\n\tawait seed(db, { loremIpsumTable: schema.loremIpsumTable }).refine((funcs) => ({\n\t\tloremIpsumTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tloremIpsum: funcs.loremIpsum(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.loremIpsumTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('loremIpsum array generator test', async () => {\n\tawait seed(db, { loremIpsumTable: schema.loremIpsumArrayTable }).refine((funcs) => ({\n\t\tloremIpsumTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tloremIpsum: funcs.loremIpsum({ arraySize: 3 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.loremIpsumArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 3));\n\texpect(predicate).toBe(true);\n});\n\ntest('point generator test', async () => {\n\tawait seed(db, { pointTable: schema.pointTable }).refine((funcs) => ({\n\t\tpointTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tpoint: funcs.point(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.pointTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('point unique generator test', async () => {\n\tawait reset(db, { pointTable: schema.pointTable });\n\tawait seed(db, { pointTable: schema.pointTable }).refine((funcs) => ({\n\t\tpointTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tpoint: funcs.point({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.pointTable);\n\t// every value in each row does not equal undefined.\n\tlet predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\t// using Set because PGlite does not support unique point\n\tconst pointStrsSet = new Set<string>(data.map((row) => row.point!.map(String).join(',')));\n\tpredicate = pointStrsSet.size === data.length;\n\texpect(predicate).toBe(true);\n});\n\ntest('point array generator test', async () => {\n\tawait seed(db, { pointTable: schema.pointArrayTable }).refine((funcs) => ({\n\t\tpointTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tpoint: funcs.point({ arraySize: 2 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.pointArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 2));\n\texpect(predicate).toBe(true);\n});\n\ntest('line generator test', async () => {\n\tawait seed(db, { lineTable: schema.lineTable }).refine((funcs) => ({\n\t\tlineTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tline: funcs.line(),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.lineTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('line unique generator test', async () => {\n\tawait reset(db, { lineTable: schema.lineTable });\n\tawait seed(db, { lineTable: schema.lineTable }).refine((funcs) => ({\n\t\tlineTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tline: funcs.line({ isUnique: true }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.lineTable);\n\t// every value in each row does not equal undefined.\n\tlet predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\t// using Set because PGlite does not support unique point\n\tconst lineStrsSet = new Set<string>(data.map((row) => row.line!.map(String).join(',')));\n\tpredicate = lineStrsSet.size === data.length;\n\texpect(predicate).toBe(true);\n});\n\ntest('line array generator test', async () => {\n\tawait seed(db, { lineTable: schema.lineArrayTable }).refine((funcs) => ({\n\t\tlineTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tline: funcs.line({ arraySize: 2 }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.lineArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null && val.length === 2));\n\texpect(predicate).toBe(true);\n});\n\ntest('phoneNumber generator test', async () => {\n\tawait seed(db, { phoneNumberTable: schema.phoneNumberTable }).refine((funcs) => ({\n\t\tphoneNumberTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tphoneNumber: funcs.phoneNumber(),\n\t\t\t\tphoneNumberPrefixes: funcs.phoneNumber({\n\t\t\t\t\tprefixes: ['+380 99', '+380 67', '+1'],\n\t\t\t\t\tgeneratedDigitsNumbers: [7, 7, 10],\n\t\t\t\t}),\n\t\t\t\tphoneNumberTemplate: funcs.phoneNumber({ template: '+380 ## ## ### ##' }),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.phoneNumberTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('phoneNumber array generator test', async () => {\n\tawait seed(db, { phoneNumberTable: schema.phoneNumberArrayTable }).refine((funcs) => ({\n\t\tphoneNumberTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tphoneNumber: funcs.phoneNumber({ arraySize: 3 }),\n\t\t\t\tphoneNumberPrefixes: funcs.phoneNumber({\n\t\t\t\t\tprefixes: ['+380 99', '+380 67', '+1'],\n\t\t\t\t\tgeneratedDigitsNumbers: [7, 7, 10],\n\t\t\t\t\tarraySize: 4,\n\t\t\t\t}),\n\t\t\t\tphoneNumberTemplate: funcs.phoneNumber({\n\t\t\t\t\ttemplate: '+380 ## ## ### ##',\n\t\t\t\t\tarraySize: 5,\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.phoneNumberArrayTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) =>\n\t\t\tObject.values(row).every((val) => val !== undefined && val !== null && [3, 4, 5].includes(val.length))\n\t\t);\n\texpect(predicate).toBe(true);\n});\n\ntest('weightedRandom generator test', async () => {\n\tawait seed(db, { weightedRandomTable: schema.weightedRandomTable }).refine((funcs) => ({\n\t\tweightedRandomTable: {\n\t\t\tcount,\n\t\t\tcolumns: {\n\t\t\t\tweightedRandom: funcs.weightedRandom([\n\t\t\t\t\t{ value: funcs.default({ defaultValue: 'default value' }), weight: 0.3 },\n\t\t\t\t\t{ value: funcs.loremIpsum(), weight: 0.7 },\n\t\t\t\t]),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.weightedRandomTable);\n\t// every value in each row does not equal undefined.\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n});\n\ntest('weightedRandom with unique gens generator test', async () => {\n\tawait seed(db, { weightedRandomWithUniqueGensTable: schema.weightedRandomWithUniqueGensTable }).refine((funcs) => ({\n\t\tweightedRandomWithUniqueGensTable: {\n\t\t\tcount: 10000,\n\t\t\tcolumns: {\n\t\t\t\tweightedRandomWithUniqueGens: funcs.weightedRandom([\n\t\t\t\t\t{ weight: 0.3, value: funcs.email() },\n\t\t\t\t\t{ weight: 0.7, value: funcs.firstName({ isUnique: true }) },\n\t\t\t\t]),\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst data = await db.select().from(schema.weightedRandomWithUniqueGensTable);\n\tconst predicate = data.length !== 0\n\t\t&& data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\texpect(predicate).toBe(true);\n\n\tawait expect(\n\t\tseed(db, { weightedRandomWithUniqueGensTable: schema.weightedRandomWithUniqueGensTable }).refine((funcs) => ({\n\t\t\tweightedRandomWithUniqueGensTable: {\n\t\t\t\tcount: 40000,\n\t\t\t\tcolumns: {\n\t\t\t\t\tweightedRandomWithUniqueGens: funcs.weightedRandom([\n\t\t\t\t\t\t{ weight: 0.1, value: funcs.email() },\n\t\t\t\t\t\t{ weight: 0.9, value: funcs.firstName({ isUnique: true }) },\n\t\t\t\t\t]),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow('count exceeds max number of unique first names.');\n\n\tawait expect(\n\t\tseed(db, { weightedRandomWithUniqueGensTable: schema.weightedRandomWithUniqueGensTable }).refine((funcs) => ({\n\t\t\tweightedRandomWithUniqueGensTable: {\n\t\t\t\tcount: 10000,\n\t\t\t\tcolumns: {\n\t\t\t\t\tweightedRandomWithUniqueGens: funcs.weightedRandom([\n\t\t\t\t\t\t{ weight: 0.2, value: funcs.email() },\n\t\t\t\t\t\t{ weight: 0.9, value: funcs.firstName({ isUnique: true }) },\n\t\t\t\t\t]),\n\t\t\t\t},\n\t\t\t},\n\t\t})),\n\t).rejects.toThrow(\n\t\t'The weights for the Weighted Random feature must add up to exactly 1. Please review your weights to ensure they total 1 before proceeding',\n\t);\n});\n"
  },
  {
    "path": "integration-tests/tests/seeder/pgSchema.ts",
    "content": "import type { AnyPgColumn } from 'drizzle-orm/pg-core';\nimport {\n\tbigint,\n\tbigserial,\n\tboolean,\n\tchar,\n\tdate,\n\tdecimal,\n\tdoublePrecision,\n\tinteger,\n\tinterval,\n\tjson,\n\tjsonb,\n\tline,\n\tnumeric,\n\tpgEnum,\n\tpgSchema,\n\tpoint,\n\treal,\n\tserial,\n\tsmallint,\n\tsmallserial,\n\ttext,\n\ttime,\n\ttimestamp,\n\tuuid,\n\tvarchar,\n} from 'drizzle-orm/pg-core';\n\nexport const schema = pgSchema('seeder_lib_pg');\n\nexport const customers = schema.table('customer', {\n\tid: varchar('id', { length: 256 }).primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tpostalCode: text('postal_code'),\n\tregion: text('region'),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n\tfax: text('fax'),\n});\n\nexport const employees = schema.table(\n\t'employee',\n\t{\n\t\tid: integer('id').primaryKey(),\n\t\tlastName: text('last_name').notNull(),\n\t\tfirstName: text('first_name'),\n\t\ttitle: text('title').notNull(),\n\t\ttitleOfCourtesy: text('title_of_courtesy').notNull(),\n\t\tbirthDate: timestamp('birth_date').notNull(),\n\t\thireDate: timestamp('hire_date').notNull(),\n\t\taddress: text('address').notNull(),\n\t\tcity: text('city').notNull(),\n\t\tpostalCode: text('postal_code').notNull(),\n\t\tcountry: text('country').notNull(),\n\t\thomePhone: text('home_phone').notNull(),\n\t\textension: integer('extension').notNull(),\n\t\tnotes: text('notes').notNull(),\n\t\treportsTo: integer('reports_to').references((): AnyPgColumn => employees.id),\n\t\tphotoPath: text('photo_path'),\n\t},\n);\n\nexport const orders = schema.table('order', {\n\tid: integer('id').primaryKey(),\n\torderDate: timestamp('order_date').notNull(),\n\trequiredDate: timestamp('required_date').notNull(),\n\tshippedDate: timestamp('shipped_date'),\n\tshipVia: integer('ship_via').notNull(),\n\tfreight: numeric('freight').notNull(),\n\tshipName: text('ship_name').notNull(),\n\tshipCity: text('ship_city').notNull(),\n\tshipRegion: text('ship_region'),\n\tshipPostalCode: text('ship_postal_code'),\n\tshipCountry: text('ship_country').notNull(),\n\n\tcustomerId: text('customer_id')\n\t\t.notNull()\n\t\t.references(() => customers.id, { onDelete: 'cascade' }),\n\n\temployeeId: integer('employee_id')\n\t\t.notNull()\n\t\t.references(() => employees.id, { onDelete: 'cascade' }),\n});\n\nexport const suppliers = schema.table('supplier', {\n\tid: integer('id').primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tregion: text('region'),\n\tpostalCode: text('postal_code').notNull(),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n});\n\nexport const products = schema.table('product', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tquantityPerUnit: text('quantity_per_unit').notNull(),\n\tunitPrice: numeric('unit_price').notNull(),\n\tunitsInStock: integer('units_in_stock').notNull(),\n\tunitsOnOrder: integer('units_on_order').notNull(),\n\treorderLevel: integer('reorder_level').notNull(),\n\tdiscontinued: integer('discontinued').notNull(),\n\n\tsupplierId: integer('supplier_id')\n\t\t.notNull()\n\t\t.references(() => suppliers.id, { onDelete: 'cascade' }),\n});\n\nexport const details = schema.table('order_detail', {\n\tunitPrice: numeric('unit_price').notNull(),\n\tquantity: integer('quantity').notNull(),\n\tdiscount: numeric('discount').notNull(),\n\n\torderId: integer('order_id')\n\t\t.notNull()\n\t\t.references(() => orders.id, { onDelete: 'cascade' }),\n\n\tproductId: integer('product_id')\n\t\t.notNull()\n\t\t.references(() => products.id, { onDelete: 'cascade' }),\n});\n\n// All data types table -------------------------------\nexport const moodEnum = pgEnum('mood_enum', ['sad', 'ok', 'happy']);\n\nexport const allDataTypes = schema.table('all_data_types', {\n\tinteger: integer('integer'),\n\tsmallint: smallint('smallint'),\n\tbiginteger: bigint('bigint', { mode: 'bigint' }),\n\tbigintNumber: bigint('bigint_number', { mode: 'number' }),\n\tserial: serial('serial'),\n\tsmallserial: smallserial('smallserial'),\n\tbigserial: bigserial('bigserial', { mode: 'bigint' }),\n\tbigserialNumber: bigserial('bigserial_number', { mode: 'number' }),\n\tboolean: boolean('boolean'),\n\ttext: text('text'),\n\tvarchar: varchar('varchar', { length: 256 }),\n\tchar: char('char', { length: 256 }),\n\tnumeric: numeric('numeric'),\n\tdecimal: decimal('decimal'),\n\treal: real('real'),\n\tdoublePrecision: doublePrecision('double_precision'),\n\tjson: json('json'),\n\tjsonb: jsonb('jsonb'),\n\ttime: time('time'),\n\ttimestampDate: timestamp('timestamp_date', { mode: 'date' }),\n\ttimestampString: timestamp('timestamp_string', { mode: 'string' }),\n\tdateString: date('date_string', { mode: 'string' }),\n\tdate: date('date', { mode: 'date' }),\n\tinterval: interval('interval'),\n\tpoint: point('point', { mode: 'xy' }),\n\tpointTuple: point('point_tuple', { mode: 'tuple' }),\n\tline: line('line', { mode: 'abc' }),\n\tlineTuple: line('line_tuple', { mode: 'tuple' }),\n\tmoodEnum: moodEnum('mood_enum'),\n\tuuid: uuid('uuid'),\n});\n\nexport const allArrayDataTypes = schema.table('all_array_data_types', {\n\tintegerArray: integer('integer_array').array(),\n\tsmallintArray: smallint('smallint_array').array(),\n\tbigintegerArray: bigint('bigint_array', { mode: 'bigint' }).array(),\n\tbigintNumberArray: bigint('bigint_number_array', { mode: 'number' }).array(),\n\tbooleanArray: boolean('boolean_array').array(),\n\ttextArray: text('text_array').array(),\n\tvarcharArray: varchar('varchar_array', { length: 256 }).array(),\n\tcharArray: char('char_array', { length: 256 }).array(),\n\tnumericArray: numeric('numeric_array').array(),\n\tdecimalArray: decimal('decimal_array').array(),\n\trealArray: real('real_array').array(),\n\tdoublePrecisionArray: doublePrecision('double_precision_array').array(),\n\tjsonArray: json('json_array').array(),\n\tjsonbArray: jsonb('jsonb_array').array(),\n\ttimeArray: time('time_array').array(),\n\ttimestampDateArray: timestamp('timestamp_date_array', { mode: 'date' }).array(),\n\ttimestampStringArray: timestamp('timestamp_string_array', { mode: 'string' }).array(),\n\tdateStringArray: date('date_string_array', { mode: 'string' }).array(),\n\tdateArray: date('date_array', { mode: 'date' }).array(),\n\tintervalArray: interval('interval_array').array(),\n\tpointArray: point('point_array', { mode: 'xy' }).array(),\n\tpointTupleArray: point('point_tuple_array', { mode: 'tuple' }).array(),\n\tlineArray: line('line_array', { mode: 'abc' }).array(),\n\tlineTupleArray: line('line_tuple_array', { mode: 'tuple' }).array(),\n\tmoodEnumArray: moodEnum('mood_enum_array').array(),\n});\n\nexport const ndArrays = schema.table('nd_arrays', {\n\tinteger1DArray: integer('integer_1d_array').array(3),\n\tinteger2DArray: integer('integer_2d_array').array(3).array(4),\n\tinteger3DArray: integer('integer_3d_array').array(3).array(4).array(5),\n\tinteger4DArray: integer('integer_4d_array').array(3).array(4).array(5).array(6),\n});\n\n// All generators tables -------------------------------\nexport const enumTable = schema.table('enum_table', {\n\tmood: moodEnum('mood_enum'),\n});\n\nexport const defaultTable = schema.table('default_table', {\n\tdefaultString: text('default_string'),\n});\n\nexport const defaultArrayTable = schema.table('default_array_table', {\n\tdefaultString: text('default_string').array(),\n});\n\nexport const valuesFromArrayTable = schema.table('values_from_array_table', {\n\tvaluesFromArrayNotNull: varchar('values_from_array_not_null', { length: 256 }).notNull(),\n\tvaluesFromArrayWeightedNotNull: varchar('values_from_array_weighted_not_null', { length: 256 }).notNull(),\n});\n\nexport const valuesFromArrayUniqueTable = schema.table('values_from_array_unique_table', {\n\tvaluesFromArray: varchar('values_from_array', { length: 256 }).unique(),\n\tvaluesFromArrayNotNull: varchar('values_from_array_not_null', { length: 256 }).unique().notNull(),\n\tvaluesFromArrayWeighted: varchar('values_from_array_weighted', { length: 256 }).unique(),\n\tvaluesFromArrayWeightedNotNull: varchar('values_from_array_weighted_not_null', { length: 256 }).unique().notNull(),\n});\n\nexport const valuesFromArrayArrayTable = schema.table('values_from_array_array_table', {\n\tvaluesFromArray: varchar('values_from_array', { length: 256 }).array(),\n});\n\nexport const intPrimaryKeyTable = schema.table('int_primary_key_table', {\n\tintPrimaryKey: integer('int_primary_key').unique(),\n});\n\nexport const numberTable = schema.table('number_table', {\n\tnumber: real('number'),\n});\n\nexport const numberUniqueTable = schema.table('number_unique_table', {\n\tnumberUnique: real('number_unique').unique(),\n});\n\nexport const numberArrayTable = schema.table('number_array_table', {\n\tnumber: real('number').array(),\n});\n\nexport const intTable = schema.table('int_table', {\n\tint: integer('int'),\n});\n\nexport const intUniqueTable = schema.table('int_unique_table', {\n\tintUnique: integer('int_unique').unique(),\n});\n\nexport const intArrayTable = schema.table('int_array_table', {\n\tint: integer('int').array(),\n});\n\nexport const booleanTable = schema.table('boolean_table', {\n\tboolean: boolean('boolean'),\n});\n\nexport const booleanArrayTable = schema.table('boolean_array_table', {\n\tboolean: boolean('boolean').array(),\n});\n\nexport const dateTable = schema.table('date_table', {\n\tdate: date('date'),\n});\n\n// TODO: add tests for data type with different modes\nexport const dateArrayTable = schema.table('date_array_table', {\n\tdate: date('date', { mode: 'date' }).array(),\n\tdateString: date('date_string', { mode: 'string' }).array(),\n});\n\nexport const timeTable = schema.table('time_table', {\n\ttime: time('time'),\n});\n\nexport const timeArrayTable = schema.table('time_array_table', {\n\ttime: time('time').array(),\n});\n\nexport const timestampTable = schema.table('timestamp_table', {\n\ttimestamp: timestamp('timestamp'),\n});\n\nexport const timestampArrayTable = schema.table('timestamp_array_table', {\n\ttimestamp: timestamp('timestamp').array(),\n});\n\nexport const jsonTable = schema.table('json_table', {\n\tjson: json('json'),\n});\n\nexport const jsonArrayTable = schema.table('json_array_table', {\n\tjson: json('json').array(),\n});\n\nexport const intervalTable = schema.table('interval_table', {\n\tinterval: interval('interval'),\n});\n\nexport const intervalUniqueTable = schema.table('interval_unique_table', {\n\tintervalUnique: interval('interval_unique').unique(),\n});\n\nexport const intervalArrayTable = schema.table('interval_array_table', {\n\tinterval: interval('interval').array(),\n});\n\nexport const stringTable = schema.table('string_table', {\n\tstring: text('string'),\n});\n\nexport const stringUniqueTable = schema.table('string_unique_table', {\n\tstringUnique: varchar('string_unique', { length: 256 }).unique(),\n});\n\nexport const stringArrayTable = schema.table('string_array_table', {\n\tstring: text('string').array(),\n});\n\nexport const emailTable = schema.table('email_table', {\n\temail: varchar('email', { length: 256 }).unique(),\n});\n\nexport const emailArrayTable = schema.table('email_array_table', {\n\temail: varchar('email', { length: 256 }).array(),\n});\n\nexport const firstNameTable = schema.table('first_name_table', {\n\tfirstName: varchar('first_name', { length: 256 }),\n});\n\nexport const firstNameUniqueTable = schema.table('first_name_unique_table', {\n\tfirstNameUnique: varchar('first_name_unique', { length: 256 }).unique(),\n});\n\nexport const firstNameArrayTable = schema.table('first_name_array_table', {\n\tfirstName: varchar('first_name', { length: 256 }).array(),\n});\n\nexport const lastNameTable = schema.table('last_name_table', {\n\tlastName: varchar('last_name', { length: 256 }),\n});\n\nexport const lastNameUniqueTable = schema.table('last_name_unique_table', {\n\tlastNameUnique: varchar('last_name_unique', { length: 256 }).unique(),\n});\n\nexport const lastNameArrayTable = schema.table('last_name_array_table', {\n\tlastName: varchar('last_name', { length: 256 }).array(),\n});\n\nexport const fullNameTable = schema.table('full_name__table', {\n\tfullName: varchar('full_name_', { length: 256 }),\n});\n\nexport const fullNameUniqueTable = schema.table('full_name_unique_table', {\n\tfullNameUnique: varchar('full_name_unique', { length: 256 }).unique(),\n});\n\nexport const fullNameArrayTable = schema.table('full_name_array_table', {\n\tfullName: varchar('full_name', { length: 256 }).array(),\n});\n\nexport const countryTable = schema.table('country_table', {\n\tcountry: varchar('country', { length: 256 }),\n});\n\nexport const countryUniqueTable = schema.table('country_unique_table', {\n\tcountryUnique: varchar('country_unique', { length: 256 }).unique(),\n});\n\nexport const countryArrayTable = schema.table('country_array_table', {\n\tcountry: varchar('country', { length: 256 }).array(),\n});\n\nexport const cityTable = schema.table('city_table', {\n\tcity: varchar('city', { length: 256 }),\n});\n\nexport const cityUniqueTable = schema.table('city_unique_table', {\n\tcityUnique: varchar('city_unique', { length: 256 }).unique(),\n});\n\nexport const cityArrayTable = schema.table('city_array_table', {\n\tcity: varchar('city', { length: 256 }).array(),\n});\n\nexport const streetAddressTable = schema.table('street_address_table', {\n\tstreetAddress: varchar('street_address', { length: 256 }),\n});\n\nexport const streetAddressUniqueTable = schema.table('street_address_unique_table', {\n\tstreetAddressUnique: varchar('street_address_unique', { length: 256 }).unique(),\n});\n\nexport const streetAddressArrayTable = schema.table('street_address_array_table', {\n\tstreetAddress: varchar('street_address', { length: 256 }).array(),\n});\n\nexport const jobTitleTable = schema.table('job_title_table', {\n\tjobTitle: text('job_title'),\n});\n\nexport const jobTitleArrayTable = schema.table('job_title_array_table', {\n\tjobTitle: text('job_title').array(),\n});\n\nexport const postcodeTable = schema.table('postcode_table', {\n\tpostcode: varchar('postcode', { length: 256 }),\n});\n\nexport const postcodeUniqueTable = schema.table('postcode_unique_table', {\n\tpostcodeUnique: varchar('postcode_unique', { length: 256 }).unique(),\n});\n\nexport const postcodeArrayTable = schema.table('postcode_array_table', {\n\tpostcode: varchar('postcode', { length: 256 }).array(),\n});\n\nexport const stateTable = schema.table('state_table', {\n\tstate: text('state'),\n});\n\nexport const stateArrayTable = schema.table('state_array_table', {\n\tstate: text('state').array(),\n});\n\nexport const companyNameTable = schema.table('company_name_table', {\n\tcompanyName: text('company_name'),\n});\n\nexport const companyNameUniqueTable = schema.table('company_name_unique_table', {\n\tcompanyNameUnique: varchar('company_name_unique', { length: 256 }).unique(),\n});\n\nexport const companyNameArrayTable = schema.table('company_name_array_table', {\n\tcompanyName: text('company_name').array(),\n});\n\nexport const loremIpsumTable = schema.table('lorem_ipsum_table', {\n\tloremIpsum: text('lorem_ipsum'),\n});\n\nexport const loremIpsumArrayTable = schema.table('lorem_ipsum_array_table', {\n\tloremIpsum: text('lorem_ipsum').array(),\n});\n\nexport const pointTable = schema.table('point_table', {\n\tpoint: point('point'),\n});\n\nexport const pointArrayTable = schema.table('point_array_table', {\n\tpoint: point('point').array(),\n});\n\nexport const lineTable = schema.table('line_table', {\n\tline: line('line'),\n});\n\nexport const lineArrayTable = schema.table('line_array_table', {\n\tline: line('line').array(),\n});\n\n// export const pointUniqueTable = schema.table(\"point_unique_table\", {\n//     pointUnique: point(\"point_unique\").unique(),\n// });\n\n// export const lineUniqueTable = schema.table(\"line_unique_table\", {\n//     lineUnique: line(\"line_unique\").unique(),\n// });\n\nexport const phoneNumberTable = schema.table('phone_number_table', {\n\tphoneNumber: varchar('phoneNumber', { length: 256 }).unique(),\n\tphoneNumberTemplate: varchar('phone_number_template', { length: 256 }).unique(),\n\tphoneNumberPrefixes: varchar('phone_number_prefixes', { length: 256 }).unique(),\n});\n\nexport const phoneNumberArrayTable = schema.table('phone_number_array_table', {\n\tphoneNumber: varchar('phoneNumber', { length: 256 }).array(),\n\tphoneNumberTemplate: varchar('phone_number_template', { length: 256 }).array(),\n\tphoneNumberPrefixes: varchar('phone_number_prefixes', { length: 256 }).array(),\n});\n\nexport const weightedRandomTable = schema.table('weighted_random_table', {\n\tweightedRandom: varchar('weighted_random', { length: 256 }),\n});\n\nexport const weightedRandomWithUniqueGensTable = schema.table('weighted_random_with_unique_gens_table', {\n\tweightedRandomWithUniqueGens: varchar('weighted_random_with_unique_gens', { length: 256 }).unique(),\n});\n\nexport const identityColumnsTable = schema.table('identity_columns_table', {\n\tid: integer('id').generatedAlwaysAsIdentity(),\n\tid1: integer('id1'),\n\tname: text('name'),\n});\n"
  },
  {
    "path": "integration-tests/tests/seeder/sqlite.test.ts",
    "content": "import BetterSqlite3 from 'better-sqlite3';\nimport { sql } from 'drizzle-orm';\nimport type { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { reset, seed } from 'drizzle-seed';\nimport { afterAll, afterEach, beforeAll, expect, test } from 'vitest';\nimport * as schema from './sqliteSchema.ts';\n\nlet client: BetterSqlite3.Database;\nlet db: BetterSQLite3Database;\n\nbeforeAll(async () => {\n\tclient = new BetterSqlite3(':memory:');\n\n\tdb = drizzle(client);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`customer\\` (\n\t\\`id\\` text PRIMARY KEY NOT NULL,\n\t\\`company_name\\` text NOT NULL,\n\t\\`contact_name\\` text NOT NULL,\n\t\\`contact_title\\` text NOT NULL,\n\t\\`address\\` text NOT NULL,\n\t\\`city\\` text NOT NULL,\n\t\\`postal_code\\` text,\n\t\\`region\\` text,\n\t\\`country\\` text NOT NULL,\n\t\\`phone\\` text NOT NULL,\n\t\\`fax\\` text\n);\n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`order_detail\\` (\n\t\\`unit_price\\` numeric NOT NULL,\n\t\\`quantity\\` integer NOT NULL,\n\t\\`discount\\` numeric NOT NULL,\n\t\\`order_id\\` integer NOT NULL,\n\t\\`product_id\\` integer NOT NULL,\n\tFOREIGN KEY (\\`order_id\\`) REFERENCES \\`order\\`(\\`id\\`) ON UPDATE no action ON DELETE cascade,\n\tFOREIGN KEY (\\`product_id\\`) REFERENCES \\`product\\`(\\`id\\`) ON UPDATE no action ON DELETE cascade\n);\n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`employee\\` (\n\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\t\\`last_name\\` text NOT NULL,\n\t\\`first_name\\` text,\n\t\\`title\\` text NOT NULL,\n\t\\`title_of_courtesy\\` text NOT NULL,\n\t\\`birth_date\\` integer NOT NULL,\n\t\\`hire_date\\` integer NOT NULL,\n\t\\`address\\` text NOT NULL,\n\t\\`city\\` text NOT NULL,\n\t\\`postal_code\\` text NOT NULL,\n\t\\`country\\` text NOT NULL,\n\t\\`home_phone\\` text NOT NULL,\n\t\\`extension\\` integer NOT NULL,\n\t\\`notes\\` text NOT NULL,\n\t\\`reports_to\\` integer,\n\t\\`photo_path\\` text,\n\tFOREIGN KEY (\\`reports_to\\`) REFERENCES \\`employee\\`(\\`id\\`) ON UPDATE no action ON DELETE no action\n);        \n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`order\\` (\n\t\\`id\\` integer PRIMARY KEY NOT NULL,\n\t\\`order_date\\` integer NOT NULL,\n\t\\`required_date\\` integer NOT NULL,\n\t\\`shipped_date\\` integer,\n\t\\`ship_via\\` integer NOT NULL,\n\t\\`freight\\` numeric NOT NULL,\n\t\\`ship_name\\` text NOT NULL,\n\t\\`ship_city\\` text NOT NULL,\n\t\\`ship_region\\` text,\n\t\\`ship_postal_code\\` text,\n\t\\`ship_country\\` text NOT NULL,\n\t\\`customer_id\\` text NOT NULL,\n\t\\`employee_id\\` integer NOT NULL,\n\tFOREIGN KEY (\\`customer_id\\`) REFERENCES \\`customer\\`(\\`id\\`) ON UPDATE no action ON DELETE cascade,\n\tFOREIGN KEY (\\`employee_id\\`) REFERENCES \\`employee\\`(\\`id\\`) ON UPDATE no action ON DELETE cascade\n);        \n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`product\\` (\n\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\\`name\\` text NOT NULL,\n\t\\`quantity_per_unit\\` text NOT NULL,\n\t\\`unit_price\\` numeric NOT NULL,\n\t\\`units_in_stock\\` integer NOT NULL,\n\t\\`units_on_order\\` integer NOT NULL,\n\t\\`reorder_level\\` integer NOT NULL,\n\t\\`discontinued\\` integer NOT NULL,\n\t\\`supplier_id\\` integer NOT NULL,\n\tFOREIGN KEY (\\`supplier_id\\`) REFERENCES \\`supplier\\`(\\`id\\`) ON UPDATE no action ON DELETE cascade\n);        \n    `),\n\t);\n\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`supplier\\` (\n\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\\`company_name\\` text NOT NULL,\n\t\\`contact_name\\` text NOT NULL,\n\t\\`contact_title\\` text NOT NULL,\n\t\\`address\\` text NOT NULL,\n\t\\`city\\` text NOT NULL,\n\t\\`region\\` text,\n\t\\`postal_code\\` text NOT NULL,\n\t\\`country\\` text NOT NULL,\n\t\\`phone\\` text NOT NULL\n);        \n    `),\n\t);\n\n\t// All data types test -------------------------------\n\tdb.run(\n\t\tsql.raw(`\n    CREATE TABLE \\`all_data_types\\` (\n\t\\`integer_number\\` integer,\n\t\\`integer_boolean\\` integer,\n\t\\`integer_timestamp\\` integer,\n\t\\`integer_timestampms\\` integer,\n\t\\`real\\` real,\n\t\\`text\\` text,\n\t\\`text_json\\` text,\n\t\\`blob_bigint\\` blob,\n\t\\`blob_buffer\\` blob,\n\t\\`blob_json\\` blob,\n\t\\`numeric\\` numeric\n);\n    `),\n\t);\n});\n\nafterAll(async () => {\n\tclient.close();\n});\n\nafterEach(async () => {\n\tawait reset(db, schema);\n});\n\ntest('basic seed test', async () => {\n\tawait seed(db, schema);\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(10);\n\texpect(details.length).toBe(10);\n\texpect(employees.length).toBe(10);\n\texpect(orders.length).toBe(10);\n\texpect(products.length).toBe(10);\n\texpect(suppliers.length).toBe(10);\n});\n\ntest('seed with options.count:11 test', async () => {\n\tawait seed(db, schema, { count: 11 });\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(11);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(11);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('redefine(refine) customers count', async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 12,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(12);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(11);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest('redefine(refine) all tables count', async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 12,\n\t\t},\n\t\tdetails: {\n\t\t\tcount: 13,\n\t\t},\n\t\temployees: {\n\t\t\tcount: 14,\n\t\t},\n\t\torders: {\n\t\t\tcount: 15,\n\t\t},\n\t\tproducts: {\n\t\t\tcount: 16,\n\t\t},\n\t\tsuppliers: {\n\t\t\tcount: 17,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(12);\n\texpect(details.length).toBe(13);\n\texpect(employees.length).toBe(14);\n\texpect(orders.length).toBe(15);\n\texpect(products.length).toBe(16);\n\texpect(suppliers.length).toBe(17);\n});\n\ntest(\"redefine(refine) orders count using 'with' in customers\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 13,\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(11);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\ntest(\"sequential using of 'with'\", async () => {\n\tawait seed(db, schema, { count: 11 }).refine(() => ({\n\t\tcustomers: {\n\t\t\tcount: 4,\n\t\t\twith: {\n\t\t\t\torders: 2,\n\t\t\t},\n\t\t},\n\t\torders: {\n\t\t\tcount: 12,\n\t\t\twith: {\n\t\t\t\tdetails: 3,\n\t\t\t},\n\t\t},\n\t}));\n\n\tconst customers = await db.select().from(schema.customers);\n\tconst details = await db.select().from(schema.details);\n\tconst employees = await db.select().from(schema.employees);\n\tconst orders = await db.select().from(schema.orders);\n\tconst products = await db.select().from(schema.products);\n\tconst suppliers = await db.select().from(schema.suppliers);\n\n\texpect(customers.length).toBe(4);\n\texpect(details.length).toBe(24);\n\texpect(employees.length).toBe(11);\n\texpect(orders.length).toBe(8);\n\texpect(products.length).toBe(11);\n\texpect(suppliers.length).toBe(11);\n});\n\n// All data types test -------------------------------\ntest('basic seed test for all sqlite data types', async () => {\n\t// migrate(db, { migrationsFolder: path.join(__dirname, \"sqliteMigrations\") });\n\n\tawait seed(db, { allDataTypes: schema.allDataTypes }, { count: 10000 });\n\n\tconst allDataTypes = await db.select().from(schema.allDataTypes);\n\t// every value in each 10 rows does not equal undefined.\n\tconst predicate = allDataTypes.every((row) => Object.values(row).every((val) => val !== undefined && val !== null));\n\n\texpect(predicate).toBe(true);\n});\n"
  },
  {
    "path": "integration-tests/tests/seeder/sqliteSchema.ts",
    "content": "import { blob, foreignKey, integer, numeric, real, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const customers = sqliteTable('customer', {\n\tid: text('id').primaryKey(),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tpostalCode: text('postal_code'),\n\tregion: text('region'),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n\tfax: text('fax'),\n});\n\nexport const employees = sqliteTable(\n\t'employee',\n\t{\n\t\tid: integer('id').primaryKey(),\n\t\tlastName: text('last_name').notNull(),\n\t\tfirstName: text('first_name'),\n\t\ttitle: text('title').notNull(),\n\t\ttitleOfCourtesy: text('title_of_courtesy').notNull(),\n\t\tbirthDate: integer('birth_date', { mode: 'timestamp' }).notNull(),\n\t\thireDate: integer('hire_date', { mode: 'timestamp' }).notNull(),\n\t\taddress: text('address').notNull(),\n\t\tcity: text('city').notNull(),\n\t\tpostalCode: text('postal_code').notNull(),\n\t\tcountry: text('country').notNull(),\n\t\thomePhone: text('home_phone').notNull(),\n\t\textension: integer('extension').notNull(),\n\t\tnotes: text('notes').notNull(),\n\t\treportsTo: integer('reports_to'),\n\t\tphotoPath: text('photo_path'),\n\t},\n\t(table) => ({\n\t\treportsToFk: foreignKey(() => ({\n\t\t\tcolumns: [table.reportsTo],\n\t\t\tforeignColumns: [table.id],\n\t\t})),\n\t}),\n);\n\nexport const orders = sqliteTable('order', {\n\tid: integer('id').primaryKey(),\n\torderDate: integer('order_date', { mode: 'timestamp' }).notNull(),\n\trequiredDate: integer('required_date', { mode: 'timestamp' }).notNull(),\n\tshippedDate: integer('shipped_date', { mode: 'timestamp' }),\n\tshipVia: integer('ship_via').notNull(),\n\tfreight: numeric('freight').notNull(),\n\tshipName: text('ship_name').notNull(),\n\tshipCity: text('ship_city').notNull(),\n\tshipRegion: text('ship_region'),\n\tshipPostalCode: text('ship_postal_code'),\n\tshipCountry: text('ship_country').notNull(),\n\n\tcustomerId: text('customer_id')\n\t\t.notNull()\n\t\t.references(() => customers.id, { onDelete: 'cascade' }),\n\n\temployeeId: integer('employee_id')\n\t\t.notNull()\n\t\t.references(() => employees.id, { onDelete: 'cascade' }),\n});\n\nexport const suppliers = sqliteTable('supplier', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcompanyName: text('company_name').notNull(),\n\tcontactName: text('contact_name').notNull(),\n\tcontactTitle: text('contact_title').notNull(),\n\taddress: text('address').notNull(),\n\tcity: text('city').notNull(),\n\tregion: text('region'),\n\tpostalCode: text('postal_code').notNull(),\n\tcountry: text('country').notNull(),\n\tphone: text('phone').notNull(),\n});\n\nexport const products = sqliteTable('product', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tquantityPerUnit: text('quantity_per_unit').notNull(),\n\tunitPrice: numeric('unit_price').notNull(),\n\tunitsInStock: integer('units_in_stock').notNull(),\n\tunitsOnOrder: integer('units_on_order').notNull(),\n\treorderLevel: integer('reorder_level').notNull(),\n\tdiscontinued: integer('discontinued').notNull(),\n\n\tsupplierId: integer('supplier_id')\n\t\t.notNull()\n\t\t.references(() => suppliers.id, { onDelete: 'cascade' }),\n});\n\nexport const details = sqliteTable('order_detail', {\n\tunitPrice: numeric('unit_price').notNull(),\n\tquantity: integer('quantity').notNull(),\n\tdiscount: numeric('discount').notNull(),\n\n\torderId: integer('order_id')\n\t\t.notNull()\n\t\t.references(() => orders.id, { onDelete: 'cascade' }),\n\n\tproductId: integer('product_id')\n\t\t.notNull()\n\t\t.references(() => products.id, { onDelete: 'cascade' }),\n});\n\n// All data types table -------------------------------\nexport const allDataTypes = sqliteTable('all_data_types', {\n\tintegerNumber: integer('integer_number', { mode: 'number' }),\n\tintegerBoolean: integer('integer_boolean', { mode: 'boolean' }),\n\tintegerTimestamp: integer('integer_timestamp', { mode: 'timestamp' }),\n\tintegerTimestampms: integer('integer_timestampms', { mode: 'timestamp_ms' }),\n\treal: real('real'),\n\ttext: text('text', { mode: 'text' }),\n\ttextJson: text('text_json', { mode: 'json' }),\n\tblobBigint: blob('blob_bigint', { mode: 'bigint' }),\n\tblobBuffer: blob('blob_buffer', { mode: 'buffer' }),\n\tblobJson: blob('blob_json', { mode: 'json' }),\n\tnumeric: numeric('numeric'),\n});\n"
  },
  {
    "path": "integration-tests/tests/singlestore/singlestore-cache.ts",
    "content": "import { eq, getTableName, is, sql, Table } from 'drizzle-orm';\nimport type { MutationOption } from 'drizzle-orm/cache/core';\nimport { Cache } from 'drizzle-orm/cache/core';\nimport type { CacheConfig } from 'drizzle-orm/cache/core/types';\nimport {\n\talias,\n\tboolean,\n\tint,\n\tjson,\n\tserial,\n\ttype SingleStoreDatabase,\n\tsinglestoreTable,\n\ttext,\n\ttimestamp,\n} from 'drizzle-orm/singlestore-core';\nimport Keyv from 'keyv';\nimport { beforeEach, describe, expect, test, vi } from 'vitest';\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nexport class TestGlobalCache extends Cache {\n\tprivate globalTtl: number = 1000;\n\tprivate usedTablesPerKey: Record<string, string[]> = {};\n\n\tconstructor(private kv: Keyv = new Keyv()) {\n\t\tsuper();\n\t}\n\n\toverride strategy(): 'explicit' | 'all' {\n\t\treturn 'all';\n\t}\n\toverride async get(key: string, _tables: string[], _isTag: boolean): Promise<any[] | undefined> {\n\t\tconst res = await this.kv.get(key) ?? undefined;\n\t\treturn res;\n\t}\n\toverride async put(\n\t\tkey: string,\n\t\tresponse: any,\n\t\ttables: string[],\n\t\tisTag: boolean,\n\t\tconfig?: CacheConfig,\n\t): Promise<void> {\n\t\tawait this.kv.set(key, response, config ? config.ex : this.globalTtl);\n\t\tfor (const table of tables) {\n\t\t\tconst keys = this.usedTablesPerKey[table];\n\t\t\tif (keys === undefined) {\n\t\t\t\tthis.usedTablesPerKey[table] = [key];\n\t\t\t} else {\n\t\t\t\tkeys.push(key);\n\t\t\t}\n\t\t}\n\t}\n\toverride async onMutate(params: MutationOption): Promise<void> {\n\t\tconst tagsArray = params.tags ? Array.isArray(params.tags) ? params.tags : [params.tags] : [];\n\t\tconst tablesArray = params.tables ? Array.isArray(params.tables) ? params.tables : [params.tables] : [];\n\n\t\tconst keysToDelete = new Set<string>();\n\n\t\tfor (const table of tablesArray) {\n\t\t\tconst tableName = is(table, Table) ? getTableName(table) : table as string;\n\t\t\tconst keys = this.usedTablesPerKey[tableName] ?? [];\n\t\t\tfor (const key of keys) keysToDelete.add(key);\n\t\t}\n\n\t\tif (keysToDelete.size > 0 || tagsArray.length > 0) {\n\t\t\tfor (const tag of tagsArray) {\n\t\t\t\tawait this.kv.delete(tag);\n\t\t\t}\n\n\t\t\tfor (const key of keysToDelete) {\n\t\t\t\tawait this.kv.delete(key);\n\t\t\t\tfor (const table of tablesArray) {\n\t\t\t\t\tconst tableName = is(table, Table) ? getTableName(table) : table as string;\n\t\t\t\t\tthis.usedTablesPerKey[tableName] = [];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nexport class TestCache extends TestGlobalCache {\n\toverride strategy(): 'explicit' | 'all' {\n\t\treturn 'explicit';\n\t}\n}\n\ntype TestSingleStoreDB = SingleStoreDatabase<any, any>;\n\ndeclare module 'vitest' {\n\tinterface TestContext {\n\t\tcachedSingleStore: {\n\t\t\tdb: TestSingleStoreDB;\n\t\t\tdbGlobalCached: TestSingleStoreDB;\n\t\t};\n\t}\n}\n\nconst usersTable = singlestoreTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at').notNull().defaultNow(),\n});\n\nconst postsTable = singlestoreTable('posts', {\n\tid: serial().primaryKey(),\n\tdescription: text().notNull(),\n\tuserId: int('city_id'),\n});\n\nexport function tests() {\n\tdescribe('common_cache', () => {\n\t\tbeforeEach(async (ctx) => {\n\t\t\tconst { db, dbGlobalCached } = ctx.cachedSingleStore;\n\t\t\tawait db.execute(sql`drop table if exists users`);\n\t\t\tawait db.execute(sql`drop table if exists posts`);\n\t\t\tawait db.$cache?.invalidate({ tables: 'users' });\n\t\t\tawait dbGlobalCached.$cache?.invalidate({ tables: 'users' });\n\t\t\t// public users\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tverified boolean not null default false,\n\t\t\t\t\t\tjsonb json,\n\t\t\t\t\t\tcreated_at timestamp not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table posts (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tdescription text not null,\n\t\t\t\t\t\tuser_id int\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t});\n\n\t\ttest('test force invalidate', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedSingleStore;\n\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'invalidate');\n\t\t\tawait db.$cache?.invalidate({ tables: 'users' });\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t\t});\n\n\t\ttest('default global config - no cache should be hit', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedSingleStore;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('default global config + enable cache on select: get, put', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedSingleStore;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache();\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('default global config + enable cache on select + write: get, put, onMutate', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedSingleStore;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ config: { ex: 1 } });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tspyPut.mockClear();\n\t\t\tspyGet.mockClear();\n\t\t\tspyInvalidate.mockClear();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t\t});\n\n\t\ttest('default global config + enable cache on select + disable invalidate: get, put', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedSingleStore;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ tag: 'custom', autoInvalidate: false, config: { ex: 1 } });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\t// invalidate force\n\t\t\tawait db.$cache?.invalidate({ tags: ['custom'] });\n\t\t});\n\n\t\ttest('global: true + disable cache', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedSingleStore;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache(false);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('global: true - cache should be hit', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedSingleStore;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('global: true - cache: false on select - no cache hit', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedSingleStore;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache(false);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('global: true - disable invalidate - cache hit + no invalidate', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedSingleStore;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ autoInvalidate: false });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tspyPut.mockClear();\n\t\t\tspyGet.mockClear();\n\t\t\tspyInvalidate.mockClear();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t\t});\n\n\t\ttest('global: true - with custom tag', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedSingleStore;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ tag: 'custom', autoInvalidate: false });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\t// invalidate force\n\t\t\tawait db.$cache?.invalidate({ tags: ['custom'] });\n\t\t});\n\n\t\t// check select used tables\n\t\ttest('check simple select used tables', (ctx) => {\n\t\t\tconst { db } = ctx.cachedSingleStore;\n\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(usersTable).getUsedTables()).toStrictEqual(['users']);\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(sql`${usersTable}`).getUsedTables()).toStrictEqual(['users']);\n\t\t});\n\t\t// check select+join used tables\n\t\ttest('select+join', (ctx) => {\n\t\t\tconst { db } = ctx.cachedSingleStore;\n\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(usersTable).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).getUsedTables())\n\t\t\t\t.toStrictEqual(['users', 'posts']);\n\t\t\texpect(\n\t\t\t\t// @ts-expect-error\n\t\t\t\tdb.select().from(sql`${usersTable}`).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).getUsedTables(),\n\t\t\t).toStrictEqual(['users', 'posts']);\n\t\t});\n\t\t// check select+2join used tables\n\t\ttest('select+2joins', (ctx) => {\n\t\t\tconst { db } = ctx.cachedSingleStore;\n\n\t\t\texpect(\n\t\t\t\tdb.select().from(usersTable).leftJoin(\n\t\t\t\t\tpostsTable,\n\t\t\t\t\teq(usersTable.id, postsTable.userId),\n\t\t\t\t).leftJoin(\n\t\t\t\t\talias(postsTable, 'post2'),\n\t\t\t\t\teq(usersTable.id, postsTable.userId),\n\t\t\t\t)\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t.getUsedTables(),\n\t\t\t)\n\t\t\t\t.toStrictEqual(['users', 'posts']);\n\t\t\texpect(\n\t\t\t\tdb.select().from(sql`${usersTable}`).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).leftJoin(\n\t\t\t\t\talias(postsTable, 'post2'),\n\t\t\t\t\teq(usersTable.id, postsTable.userId),\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t).getUsedTables(),\n\t\t\t).toStrictEqual(['users', 'posts']);\n\t\t});\n\t\t// select subquery used tables\n\t\ttest('select+join', (ctx) => {\n\t\t\tconst { db } = ctx.cachedSingleStore;\n\n\t\t\tconst sq = db.select().from(usersTable).where(eq(usersTable.id, 42)).as('sq');\n\t\t\tdb.select().from(sq);\n\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(sq).getUsedTables()).toStrictEqual(['users']);\n\t\t});\n\t});\n}\n"
  },
  {
    "path": "integration-tests/tests/singlestore/singlestore-common.ts",
    "content": "/* eslint-disable @typescript-eslint/no-unused-vars */\nimport 'dotenv/config';\nimport Docker from 'dockerode';\nimport {\n\tand,\n\tasc,\n\tavg,\n\tavgDistinct,\n\tcount,\n\tcountDistinct,\n\teq,\n\texists,\n\tgetTableColumns,\n\tgt,\n\tgte,\n\tinArray,\n\tlt,\n\tmax,\n\tmin,\n\tName,\n\tnotInArray,\n\tplaceholder,\n\tsql,\n\tsum,\n\tsumDistinct,\n\tTransactionRollbackError,\n} from 'drizzle-orm';\nimport type { SingleStoreDatabase } from 'drizzle-orm/singlestore-core';\nimport {\n\talias,\n\tbigint,\n\tbinary,\n\tboolean,\n\tchar,\n\tdate,\n\tdatetime,\n\tdecimal,\n\tdouble,\n\texcept,\n\tfloat,\n\tgetTableConfig,\n\tindex,\n\tint,\n\tintersect,\n\tjson,\n\tmediumint,\n\tprimaryKey,\n\treal,\n\tserial,\n\tsinglestoreEnum,\n\tsinglestoreSchema,\n\tsinglestoreTable,\n\tsinglestoreTableCreator,\n\t/* singlestoreView, */\n\tsmallint,\n\ttext,\n\ttime,\n\ttimestamp,\n\ttinyint,\n\tunion,\n\tunionAll,\n\tunique,\n\tuniqueIndex,\n\tuniqueKeyName,\n\tvarbinary,\n\tvarchar,\n\tvector,\n\tyear,\n} from 'drizzle-orm/singlestore-core';\nimport { dotProduct, euclideanDistance } from 'drizzle-orm/singlestore-core/expressions';\nimport { migrate } from 'drizzle-orm/singlestore/migrator';\nimport getPort from 'get-port';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeEach, describe, expect, expectTypeOf, test } from 'vitest';\nimport { Expect, toLocalDate } from '~/utils.ts';\nimport type { Equal } from '~/utils.ts';\n\ntype TestSingleStoreDB = SingleStoreDatabase<any, any>;\n\ndeclare module 'vitest' {\n\tinterface TestContext {\n\t\tsinglestore: {\n\t\t\tdb: TestSingleStoreDB;\n\t\t};\n\t}\n}\n\nconst ENABLE_LOGGING = false;\n\nconst allTypesTable = singlestoreTable('all_types', {\n\tserial: serial('scol'),\n\tbigint53: bigint('bigint53', {\n\t\tmode: 'number',\n\t}),\n\tbigint64: bigint('bigint64', {\n\t\tmode: 'bigint',\n\t}),\n\tbinary: binary('binary'),\n\tboolean: boolean('boolean'),\n\tchar: char('char'),\n\tdate: date('date', {\n\t\tmode: 'date',\n\t}),\n\tdateStr: date('date_str', {\n\t\tmode: 'string',\n\t}),\n\tdatetime: datetime('datetime', {\n\t\tmode: 'date',\n\t}),\n\tdatetimeStr: datetime('datetime_str', {\n\t\tmode: 'string',\n\t}),\n\tdecimal: decimal('decimal'),\n\tdecimalNum: decimal('decimal_num', {\n\t\tscale: 30,\n\t\tmode: 'number',\n\t}),\n\tdecimalBig: decimal('decimal_big', {\n\t\tscale: 30,\n\t\tmode: 'bigint',\n\t}),\n\tdouble: double('double'),\n\tfloat: float('float'),\n\tint: int('int'),\n\tjson: json('json'),\n\tmedInt: mediumint('med_int'),\n\tsmallInt: smallint('small_int'),\n\treal: real('real'),\n\ttext: text('text'),\n\ttime: time('time'),\n\ttimestamp: timestamp('timestamp', {\n\t\tmode: 'date',\n\t}),\n\ttimestampStr: timestamp('timestamp_str', {\n\t\tmode: 'string',\n\t}),\n\ttinyInt: tinyint('tiny_int'),\n\tvarbin: varbinary('varbin', {\n\t\tlength: 16,\n\t}),\n\tvarchar: varchar('varchar', {\n\t\tlength: 255,\n\t}),\n\tyear: year('year'),\n\tenum: singlestoreEnum('enum', ['enV1', 'enV2']),\n});\n\nconst usersTable = singlestoreTable('userstest', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at').notNull().defaultNow(),\n});\n\nconst users2Table = singlestoreTable('users2', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: int('city_id'),\n});\n\nconst citiesTable = singlestoreTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nconst usersOnUpdate = singlestoreTable('users_on_update', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tupdateCounter: int('update_counter').default(sql`1`).$onUpdateFn(() => sql`update_counter + 1`),\n\tupdatedAt: datetime('updated_at', { mode: 'date' }).$onUpdateFn(() => new Date()),\n\talwaysNull: text('always_null').$type<string | null>().$onUpdateFn(() => null), // need to add $type because $onUpdate add a default value\n});\n\nconst datesTable = singlestoreTable('datestable', {\n\tdate: date('date'),\n\tdateAsString: date('date_as_string', { mode: 'string' }),\n\ttime: time('time'),\n\tdatetime: datetime('datetime'),\n\tdatetimeAsString: datetime('datetime_as_string', { mode: 'string' }),\n\ttimestamp: timestamp('timestamp'),\n\ttimestampAsString: timestamp('timestamp_as_string', { mode: 'string' }),\n\tyear: year('year'),\n});\n\nconst coursesTable = singlestoreTable('courses', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcategoryId: int('category_id'),\n});\n\nconst courseCategoriesTable = singlestoreTable('course_categories', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nconst orders = singlestoreTable('orders', {\n\tid: serial('id').primaryKey(),\n\tregion: text('region').notNull(),\n\tproduct: text('product').notNull().$default(() => 'random_string'),\n\tamount: int('amount').notNull(),\n\tquantity: int('quantity').notNull(),\n});\n\nconst usersMigratorTable = singlestoreTable('users12', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => {\n\treturn {\n\t\tname: uniqueIndex('').on(table.name).using('btree'),\n\t};\n});\n\n// To test aggregate functions\nconst aggregateTable = singlestoreTable('aggregate_table', {\n\tid: serial('id').notNull(),\n\tname: text('name').notNull(),\n\ta: int('a'),\n\tb: int('b'),\n\tc: int('c'),\n\tnullOnly: int('null_only'),\n});\n\nconst vectorSearchTable = singlestoreTable('vector_search', {\n\tid: serial('id').notNull(),\n\ttext: text('text').notNull(),\n\tembedding: vector('embedding', { dimensions: 10 }),\n});\n\n// To test another schema and multischema\nconst mySchema = singlestoreSchema(`mySchema`);\n\nconst usersMySchemaTable = mySchema.table('userstest', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at').notNull().defaultNow(),\n});\n\nconst users2MySchemaTable = mySchema.table('users2', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: int('city_id'),\n});\n\nconst citiesMySchemaTable = mySchema.table('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nlet singlestoreContainer: Docker.Container;\nexport async function createDockerDB(): Promise<{ connectionString: string; container: Docker.Container }> {\n\tconst docker = new Docker();\n\tconst port = await getPort({ port: 3306 });\n\tconst image = 'ghcr.io/singlestore-labs/singlestoredb-dev:latest';\n\n\tconst pullStream = await docker.pull(image);\n\tawait new Promise((resolve, reject) =>\n\t\tdocker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err)))\n\t);\n\n\tsinglestoreContainer = await docker.createContainer({\n\t\tImage: image,\n\t\tEnv: ['ROOT_PASSWORD=singlestore'],\n\t\tname: `drizzle-integration-tests-${uuid()}`,\n\t\tHostConfig: {\n\t\t\tAutoRemove: true,\n\t\t\tPortBindings: {\n\t\t\t\t'3306/tcp': [{ HostPort: `${port}` }],\n\t\t\t},\n\t\t},\n\t});\n\n\tawait singlestoreContainer.start();\n\tawait new Promise((resolve) => setTimeout(resolve, 4000));\n\n\treturn {\n\t\tconnectionString: `singlestore://root:singlestore@localhost:${port}/`,\n\t\tcontainer: singlestoreContainer,\n\t};\n}\n\nexport function tests(driver?: string) {\n\tdescribe('common', () => {\n\t\tafterAll(async () => {\n\t\t\tawait singlestoreContainer?.stop().catch(console.error);\n\t\t});\n\n\t\tbeforeEach(async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`drop table if exists userstest`);\n\t\t\tawait db.execute(sql`drop table if exists users2`);\n\t\t\tawait db.execute(sql`drop table if exists cities`);\n\t\t\tawait db.execute(sql`drop table if exists ${allTypesTable}`);\n\n\t\t\tawait db.execute(sql`drop schema if exists \\`mySchema\\``);\n\t\t\tawait db.execute(sql`create schema if not exists \\`mySchema\\``);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table userstest (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tverified boolean not null default false,\n\t\t\t\t\t\tjsonb json,\n\t\t\t\t\t\tcreated_at timestamp not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users2 (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tcity_id int\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table cities (\n\t\t\t\t\t\tid serial primary key,\n\t\t\t\t\t\tname text not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\t// mySchema\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`mySchema\\`.\\`userstest\\` (\n\t\t\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\t\t\\`verified\\` boolean not null default false,\n\t\t\t\t\t\t\\`jsonb\\` json,\n\t\t\t\t\t\t\\`created_at\\` timestamp not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`mySchema\\`.\\`cities\\` (\n\t\t\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\t\t\\`name\\` text not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`mySchema\\`.\\`users2\\` (\n\t\t\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\t\t\\`city_id\\` int \n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t});\n\n\t\tasync function setupReturningFunctionsTest(db: SingleStoreDatabase<any, any>) {\n\t\t\tawait db.execute(sql`drop table if exists \\`users_default_fn\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`users_default_fn\\` (\n\t\t\t\t\t\t\\`id\\` varchar(256) primary key,\n\t\t\t\t\t\t\\`name\\` text not null\n\t\t\t\t\t);\n\t\t\t\t`,\n\t\t\t);\n\t\t}\n\n\t\tasync function setupSetOperationTest(db: TestSingleStoreDB) {\n\t\t\tawait db.execute(sql`drop table if exists \\`users2\\``);\n\t\t\tawait db.execute(sql`drop table if exists \\`cities\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`users2\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`name\\` text not null,\n\t\t\t\t\t    \\`city_id\\` int\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`cities\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`name\\` text not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(citiesTable).values([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t{ id: 2, name: 'Jane', cityId: 2 },\n\t\t\t\t{ id: 3, name: 'Jack', cityId: 3 },\n\t\t\t\t{ id: 4, name: 'Peter', cityId: 3 },\n\t\t\t\t{ id: 5, name: 'Ben', cityId: 2 },\n\t\t\t\t{ id: 6, name: 'Jill', cityId: 1 },\n\t\t\t\t{ id: 7, name: 'Mary', cityId: 2 },\n\t\t\t\t{ id: 8, name: 'Sally', cityId: 1 },\n\t\t\t]);\n\t\t}\n\n\t\tasync function setupAggregateFunctionsTest(db: TestSingleStoreDB) {\n\t\t\tawait db.execute(sql`drop table if exists \\`aggregate_table\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`aggregate_table\\` (\n\t\t\t\t\t    \\`id\\` integer primary key auto_increment not null,\n\t\t\t\t\t    \\`name\\` text not null,\n\t\t\t\t\t    \\`a\\` integer,\n\t\t\t\t\t    \\`b\\` integer,\n\t\t\t\t\t    \\`c\\` integer,\n\t\t\t\t\t    \\`null_only\\` integer\n\t\t\t\t\t);\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.insert(aggregateTable).values([\n\t\t\t\t{ id: 1, name: 'value 1', a: 5, b: 10, c: 20 },\n\t\t\t\t{ id: 2, name: 'value 1', a: 5, b: 20, c: 30 },\n\t\t\t\t{ id: 3, name: 'value 2', a: 10, b: 50, c: 60 },\n\t\t\t\t{ id: 4, name: 'value 3', a: 20, b: 20, c: null },\n\t\t\t\t{ id: 5, name: 'value 4', a: null, b: 90, c: 120 },\n\t\t\t\t{ id: 6, name: 'value 5', a: 80, b: 10, c: null },\n\t\t\t\t{ id: 7, name: 'value 6', a: null, b: null, c: 150 },\n\t\t\t]);\n\t\t}\n\n\t\tasync function setupVectorSearchTest(db: TestSingleStoreDB) {\n\t\t\tawait db.execute(sql`drop table if exists \\`vector_search\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`vector_search\\` (\n\t\t\t\t\t\t\\`id\\` integer primary key auto_increment not null,\n\t\t\t\t\t\t\\`text\\` text not null,\n\t\t\t\t\t\t\\`embedding\\` vector(10) not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.insert(vectorSearchTable).values([\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\ttext: 'I like dogs',\n\t\t\t\t\tembedding: [0.6119, 0.1395, 0.2921, 0.3664, 0.4561, 0.7852, 0.1997, 0.5142, 0.5924, 0.0465],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\ttext: 'I like cats',\n\t\t\t\t\tembedding: [0.6075, 0.1705, 0.0651, 0.9489, 0.9656, 0.8084, 0.3046, 0.0977, 0.6842, 0.4402],\n\t\t\t\t},\n\t\t\t]);\n\t\t}\n\n\t\ttest('table config: unsigned ints', async () => {\n\t\t\tconst unsignedInts = singlestoreTable('cities1', {\n\t\t\t\tbigint: bigint('bigint', { mode: 'number', unsigned: true }),\n\t\t\t\tint: int('int', { unsigned: true }),\n\t\t\t\tsmallint: smallint('smallint', { unsigned: true }),\n\t\t\t\tmediumint: mediumint('mediumint', { unsigned: true }),\n\t\t\t\ttinyint: tinyint('tinyint', { unsigned: true }),\n\t\t\t});\n\n\t\t\tconst tableConfig = getTableConfig(unsignedInts);\n\n\t\t\tconst bigintColumn = tableConfig.columns.find((c) => c.name === 'bigint')!;\n\t\t\tconst intColumn = tableConfig.columns.find((c) => c.name === 'int')!;\n\t\t\tconst smallintColumn = tableConfig.columns.find((c) => c.name === 'smallint')!;\n\t\t\tconst mediumintColumn = tableConfig.columns.find((c) => c.name === 'mediumint')!;\n\t\t\tconst tinyintColumn = tableConfig.columns.find((c) => c.name === 'tinyint')!;\n\n\t\t\texpect(bigintColumn.getSQLType()).toBe('bigint unsigned');\n\t\t\texpect(intColumn.getSQLType()).toBe('int unsigned');\n\t\t\texpect(smallintColumn.getSQLType()).toBe('smallint unsigned');\n\t\t\texpect(mediumintColumn.getSQLType()).toBe('mediumint unsigned');\n\t\t\texpect(tinyintColumn.getSQLType()).toBe('tinyint unsigned');\n\t\t});\n\n\t\ttest('table config: signed ints', async () => {\n\t\t\tconst unsignedInts = singlestoreTable('cities1', {\n\t\t\t\tbigint: bigint('bigint', { mode: 'number' }),\n\t\t\t\tint: int('int'),\n\t\t\t\tsmallint: smallint('smallint'),\n\t\t\t\tmediumint: mediumint('mediumint'),\n\t\t\t\ttinyint: tinyint('tinyint'),\n\t\t\t});\n\n\t\t\tconst tableConfig = getTableConfig(unsignedInts);\n\n\t\t\tconst bigintColumn = tableConfig.columns.find((c) => c.name === 'bigint')!;\n\t\t\tconst intColumn = tableConfig.columns.find((c) => c.name === 'int')!;\n\t\t\tconst smallintColumn = tableConfig.columns.find((c) => c.name === 'smallint')!;\n\t\t\tconst mediumintColumn = tableConfig.columns.find((c) => c.name === 'mediumint')!;\n\t\t\tconst tinyintColumn = tableConfig.columns.find((c) => c.name === 'tinyint')!;\n\n\t\t\texpect(bigintColumn.getSQLType()).toBe('bigint');\n\t\t\texpect(intColumn.getSQLType()).toBe('int');\n\t\t\texpect(smallintColumn.getSQLType()).toBe('smallint');\n\t\t\texpect(mediumintColumn.getSQLType()).toBe('mediumint');\n\t\t\texpect(tinyintColumn.getSQLType()).toBe('tinyint');\n\t\t});\n\n\t\ttest('table config: primary keys name', async () => {\n\t\t\tconst table = singlestoreTable('cities', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstate: text('state'),\n\t\t\t}, (t) => ({\n\t\t\t\tf: primaryKey({ columns: [t.id, t.name], name: 'custom_pk' }),\n\t\t\t}));\n\n\t\t\tconst tableConfig = getTableConfig(table);\n\n\t\t\texpect(tableConfig.primaryKeys).toHaveLength(1);\n\t\t\texpect(tableConfig.primaryKeys[0]!.getName()).toBe('custom_pk');\n\t\t});\n\n\t\ttest('table configs: unique third param', async () => {\n\t\t\tconst cities1Table = singlestoreTable('cities1', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstate: text('state'),\n\t\t\t}, (t) => ({\n\t\t\t\tf: unique('custom_name').on(t.name, t.state),\n\t\t\t\tf1: unique('custom_name1').on(t.name, t.state),\n\t\t\t}));\n\n\t\t\tconst tableConfig = getTableConfig(cities1Table);\n\n\t\t\texpect(tableConfig.uniqueConstraints).toHaveLength(2);\n\n\t\t\texpect(tableConfig.uniqueConstraints[0]?.name).toBe('custom_name');\n\t\t\texpect(tableConfig.uniqueConstraints[0]?.columns.map((t) => t.name)).toEqual(['name', 'state']);\n\n\t\t\texpect(tableConfig.uniqueConstraints[1]?.name).toBe('custom_name1');\n\t\t\texpect(tableConfig.uniqueConstraints[1]?.columns.map((t) => t.name)).toEqual(['name', 'state']);\n\t\t});\n\n\t\ttest('table configs: unique in column', async () => {\n\t\t\tconst cities1Table = singlestoreTable('cities1', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull().unique(),\n\t\t\t\tstate: text('state').unique('custom'),\n\t\t\t\tfield: text('field').unique('custom_field'),\n\t\t\t});\n\n\t\t\tconst tableConfig = getTableConfig(cities1Table);\n\n\t\t\tconst columnName = tableConfig.columns.find((it) => it.name === 'name');\n\t\t\texpect(columnName?.uniqueName).toBe(uniqueKeyName(cities1Table, [columnName!.name]));\n\t\t\texpect(columnName?.isUnique).toBeTruthy();\n\n\t\t\tconst columnState = tableConfig.columns.find((it) => it.name === 'state');\n\t\t\texpect(columnState?.uniqueName).toBe('custom');\n\t\t\texpect(columnState?.isUnique).toBeTruthy();\n\n\t\t\tconst columnField = tableConfig.columns.find((it) => it.name === 'field');\n\t\t\texpect(columnField?.uniqueName).toBe('custom_field');\n\t\t\texpect(columnField?.isUnique).toBeTruthy();\n\t\t});\n\n\t\ttest('select all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\t\t\tconst result = await db.select().from(usersTable);\n\n\t\t\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\t// not timezone based timestamp, thats why it should not work here\n\t\t\t// t.assert(Math.abs(result[0]!.createdAt.getTime() - now) < 2000);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('select sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db.select({\n\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t}).from(usersTable);\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('select typed sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db.select({\n\t\t\t\tname: sql<string>`upper(${usersTable.name})`,\n\t\t\t}).from(usersTable);\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('select with empty array in inArray', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(inArray(usersTable.id, []))\n\t\t\t\t.orderBy(asc(usersTable.id));\n\n\t\t\texpect(result).toEqual([]);\n\t\t});\n\n\t\ttest('select with empty array in notInArray', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(notInArray(usersTable.id, []))\n\t\t\t\t.orderBy(asc(usersTable.id));\n\n\t\t\texpect(result).toEqual([{ name: 'JOHN' }, { name: 'JANE' }, { name: 'JANE' }]);\n\t\t});\n\n\t\ttest('select distinct', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst usersDistinctTable = singlestoreTable('users_distinct', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${usersDistinctTable}`);\n\t\t\tawait db.execute(sql`create table ${usersDistinctTable} (id int, name text)`);\n\n\t\t\tawait db.insert(usersDistinctTable).values([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'John' },\n\t\t\t\t{ id: 1, name: 'Jane' },\n\t\t\t]);\n\t\t\tconst users = await db.selectDistinct().from(usersDistinctTable).orderBy(\n\t\t\t\tusersDistinctTable.id,\n\t\t\t\tusersDistinctTable.name,\n\t\t\t);\n\n\t\t\tawait db.execute(sql`drop table ${usersDistinctTable}`);\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane' }, { id: 1, name: 'John' }, { id: 2, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst [result, _] = await db.insert(usersTable).values({ id: 1, name: 'John' });\n\n\t\t\texpect(result.insertId).toBe(1);\n\t\t});\n\n\t\ttest('delete returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\t\t\texpect(users[0].affectedRows).toBe(1);\n\t\t});\n\n\t\ttest('update returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\t\t\texpect(users[0].changedRows).toBe(1);\n\t\t});\n\n\t\ttest('update with returning all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\t\t\tconst updatedUsers = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\t\t\tconst users = await db.select().from(usersTable).where(eq(usersTable.id, 1));\n\n\t\t\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\t\t\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\t// not timezone based timestamp, thats why it should not work here\n\t\t\t// t.assert(Math.abs(users[0]!.createdAt.getTime() - now) < 2000);\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane', verified: false, jsonb: null, createdAt: users[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('update with returning partial', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\t\t\tconst updatedUsers = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\t\t\tconst users = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\t\t\teq(usersTable.id, 1),\n\t\t\t);\n\n\t\t\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n\t\t});\n\n\t\ttest('delete with returning all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst deletedUser = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\t\t\texpect(deletedUser[0].affectedRows).toBe(1);\n\t\t});\n\n\t\ttest('delete with returning partial', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst deletedUser = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\t\t\texpect(deletedUser[0].affectedRows).toBe(1);\n\t\t});\n\n\t\ttest('insert + select', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\t\t\tconst result = await db.select().from(usersTable);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\n\t\t\tawait db.insert(usersTable).values({ id: 2, name: 'Jane' });\n\t\t\tconst result2 = await db.select().from(usersTable).orderBy(asc(usersTable.id));\n\t\t\texpect(result2).toEqual([\n\t\t\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result2[0]!.createdAt },\n\t\t\t\t{ id: 2, name: 'Jane', verified: false, jsonb: null, createdAt: result2[1]!.createdAt },\n\t\t\t]);\n\t\t});\n\n\t\ttest('json insert', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: 'John', jsonb: ['foo', 'bar'] });\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t\tjsonb: usersTable.jsonb,\n\t\t\t}).from(usersTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', jsonb: ['foo', 'bar'] }]);\n\t\t});\n\n\t\ttest('insert with overridden default values', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: 'John', verified: true });\n\t\t\tconst result = await db.select().from(usersTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: true, jsonb: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('insert many', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t\t\t{ id: 3, name: 'Jane' },\n\t\t\t\t{ id: 4, name: 'Austin', verified: true },\n\t\t\t]);\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t\tjsonb: usersTable.jsonb,\n\t\t\t\tverified: usersTable.verified,\n\t\t\t}).from(usersTable)\n\t\t\t\t.orderBy(asc(usersTable.id));\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t\t\t]);\n\t\t});\n\n\t\ttest('insert many with returning', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst result = await db.insert(usersTable).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Austin', verified: true },\n\t\t\t]);\n\n\t\t\texpect(result[0].affectedRows).toBe(4);\n\t\t});\n\n\t\ttest('select with group by as field', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(usersTable.name)\n\t\t\t\t.orderBy(asc(usersTable.id));\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('select with exists', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\t\t\tconst user = alias(usersTable, 'user');\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable).where(\n\t\t\t\texists(\n\t\t\t\t\tdb.select({ one: sql`1` }).from(user).where(and(eq(usersTable.name, 'John'), eq(user.id, usersTable.id))),\n\t\t\t\t),\n\t\t\t)\n\t\t\t\t.orderBy(asc(usersTable.id));\n\n\t\t\texpect(result).toEqual([{ name: 'John' }]);\n\t\t});\n\n\t\ttest('select with group by as sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(sql`${usersTable.name}`)\n\t\t\t\t.orderBy(asc(usersTable.id));\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('$default function', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`orders\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`orders\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`region\\` text not null,\n\t\t\t\t\t    \\`product\\` text not null,\n\t\t\t\t\t    \\`amount\\` int not null,\n\t\t\t\t\t    \\`quantity\\` int not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(orders).values({ id: 1, region: 'Ukraine', amount: 1, quantity: 1 });\n\t\t\tconst selectedOrder = await db.select().from(orders);\n\n\t\t\texpect(selectedOrder).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t\tamount: 1,\n\t\t\t\tquantity: 1,\n\t\t\t\tregion: 'Ukraine',\n\t\t\t\tproduct: 'random_string',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('$default with empty array', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`s_orders\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`s_orders\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`region\\` text default 'Ukraine',\n\t\t\t\t\t    \\`product\\` text not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tconst users = singlestoreTable('s_orders', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tregion: text('region').default('Ukraine'),\n\t\t\t\tproduct: text('product').$defaultFn(() => 'random_string'),\n\t\t\t});\n\n\t\t\tawait db.insert(users).values({ id: 1 });\n\t\t\tconst selectedOrder = await db.select().from(users);\n\n\t\t\texpect(selectedOrder).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t\tregion: 'Ukraine',\n\t\t\t\tproduct: 'random_string',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('select with group by as sql + column', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(sql`${usersTable.name}`, usersTable.id)\n\t\t\t\t.orderBy(asc(usersTable.id));\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('select with group by as column + sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t\t\t.orderBy(asc(usersTable.id));\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('select with group by complex query', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t\t\t.orderBy(asc(usersTable.name))\n\t\t\t\t.limit(1);\n\n\t\t\texpect(result).toEqual([{ name: 'Jane' }]);\n\t\t});\n\n\t\ttest('build query', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst query = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, usersTable.name)\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql: `select \\`id\\`, \\`name\\` from \\`userstest\\` group by \\`userstest\\`.\\`id\\`, \\`userstest\\`.\\`name\\``,\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t});\n\n\t\ttest('Query check: Insert all defaults in 1 row', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tconst query = db\n\t\t\t\t.insert(users)\n\t\t\t\t.values({})\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql: 'insert into `users` (`id`, `name`, `state`) values (default, default, default)',\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t});\n\n\t\ttest('Query check: Insert all defaults in multiple rows', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state').default('UA'),\n\t\t\t});\n\n\t\t\tconst query = db\n\t\t\t\t.insert(users)\n\t\t\t\t.values([{}, {}])\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql:\n\t\t\t\t\t'insert into `users` (`id`, `name`, `state`) values (default, default, default), (default, default, default)',\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t});\n\n\t\ttest('Insert all defaults in 1 row', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('empty_insert_single', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial primary key, name text default 'Dan', state text)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values({ id: 1 });\n\n\t\t\tconst res = await db.select().from(users);\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'Dan', state: null }]);\n\t\t});\n\n\t\ttest('Insert all defaults in multiple rows', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('empty_insert_multiple', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial primary key, name text default 'Dan', state text)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values([{ id: 1 }, { id: 2 }]);\n\n\t\t\tconst res = await db.select().from(users).orderBy(asc(users.id));\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'Dan', state: null }, { id: 2, name: 'Dan', state: null }]);\n\t\t});\n\n\t\ttest('build query insert with onDuplicate', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst query = db.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John', jsonb: ['foo', 'bar'] })\n\t\t\t\t.onDuplicateKeyUpdate({ set: { id: 1, name: 'John1' } })\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql:\n\t\t\t\t\t'insert into `userstest` (`id`, `name`, `verified`, `jsonb`, `created_at`) values (?, ?, default, ?, default) on duplicate key update `id` = ?, `name` = ?',\n\t\t\t\tparams: [1, 'John', '[\"foo\",\"bar\"]', 1, 'John1'],\n\t\t\t});\n\t\t});\n\n\t\ttest('insert with onDuplicate', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John' });\n\n\t\t\tawait db.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John' })\n\t\t\t\t.onDuplicateKeyUpdate({ set: { name: 'John1' } });\n\n\t\t\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\t\t\teq(usersTable.id, 1),\n\t\t\t);\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John1' }]);\n\t\t});\n\n\t\ttest('insert conflict', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John' });\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb.insert(usersTable).values({ id: 1, name: 'John1' });\n\t\t\t})()).resolves.not.toThrowError();\n\t\t});\n\n\t\ttest('insert conflict with ignore', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John' });\n\n\t\t\tawait db.insert(usersTable)\n\t\t\t\t.ignore()\n\t\t\t\t.values({ id: 1, name: 'John1' });\n\n\t\t\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\t\t\teq(usersTable.id, 1),\n\t\t\t);\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: sql`${'John'}` });\n\t\t\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('partial join with alias', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tconst customerAlias = alias(usersTable, 'customer');\n\n\t\t\tawait db.insert(usersTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\t\tname: usersTable.name,\n\t\t\t\t\t},\n\t\t\t\t\tcustomer: {\n\t\t\t\t\t\tid: customerAlias.id,\n\t\t\t\t\t\tname: customerAlias.name,\n\t\t\t\t\t},\n\t\t\t\t}).from(usersTable)\n\t\t\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t\t\t.where(eq(usersTable.id, 10))\n\t\t\t\t.orderBy(asc(usersTable.id));\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tuser: { id: 10, name: 'Ivan' },\n\t\t\t\tcustomer: { id: 11, name: 'Hans' },\n\t\t\t}]);\n\t\t});\n\n\t\ttest('full join with alias', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst singlestoreTable = singlestoreTableCreator((name) => `prefixed_${name}`);\n\n\t\t\tconst users = singlestoreTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\t\t\tconst customers = alias(users, 'customer');\n\n\t\t\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select().from(users)\n\t\t\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t\t\t.where(eq(users.id, 10))\n\t\t\t\t.orderBy(asc(users.id));\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tusers: {\n\t\t\t\t\tid: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t},\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('select from alias', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst singlestoreTable = singlestoreTableCreator((name) => `prefixed_${name}`);\n\n\t\t\tconst users = singlestoreTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\t\t\tconst user = alias(users, 'user');\n\t\t\tconst customers = alias(users, 'customer');\n\n\t\t\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(user)\n\t\t\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t\t\t.where(eq(user.id, 10))\n\t\t\t\t.orderBy(asc(user.id));\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tuser: {\n\t\t\t\t\tid: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t},\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('insert with spaces', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: sql`'Jo   h     n'` });\n\t\t\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n\t\t});\n\n\t\ttest('prepared statement', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\t\t\tconst statement = db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t}).from(usersTable)\n\t\t\t\t.prepare();\n\t\t\tconst result = await statement.execute();\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert: placeholders on columns with encoder', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst date = new Date('2024-08-07T15:30:00Z');\n\n\t\t\tconst statement = db.insert(usersTable).values({\n\t\t\t\tid: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tcreatedAt: sql.placeholder('createdAt'),\n\t\t\t}).prepare();\n\n\t\t\tawait statement.execute({ createdAt: date });\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tcreatedAt: usersTable.createdAt,\n\t\t\t\t})\n\t\t\t\t.from(usersTable);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, createdAt: date },\n\t\t\t]);\n\t\t});\n\n\t\ttest('prepared statement reuse', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst stmt = db.insert(usersTable).values({\n\t\t\t\tverified: true,\n\t\t\t\tid: placeholder('id'),\n\t\t\t\tname: placeholder('name'),\n\t\t\t}).prepare();\n\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tawait stmt.execute({ id: i + 1, name: `John ${i}` });\n\t\t\t}\n\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t\tverified: usersTable.verified,\n\t\t\t}).from(usersTable)\n\t\t\t\t.orderBy(asc(usersTable.id));\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John 0', verified: true },\n\t\t\t\t{ id: 2, name: 'John 1', verified: true },\n\t\t\t\t{ id: 3, name: 'John 2', verified: true },\n\t\t\t\t{ id: 4, name: 'John 3', verified: true },\n\t\t\t\t{ id: 5, name: 'John 4', verified: true },\n\t\t\t\t{ id: 6, name: 'John 5', verified: true },\n\t\t\t\t{ id: 7, name: 'John 6', verified: true },\n\t\t\t\t{ id: 8, name: 'John 7', verified: true },\n\t\t\t\t{ id: 9, name: 'John 8', verified: true },\n\t\t\t\t{ id: 10, name: 'John 9', verified: true },\n\t\t\t]);\n\t\t});\n\n\t\ttest('prepared statement with placeholder in .where', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\t\t\tconst stmt = db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t}).from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, placeholder('id')))\n\t\t\t\t.prepare();\n\t\t\tconst result = await stmt.execute({ id: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('migrator', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.execute(sql`drop table if exists cities_migration`);\n\t\t\tawait db.execute(sql`drop table if exists users_migration`);\n\t\t\tawait db.execute(sql`drop table if exists users12`);\n\t\t\tawait db.execute(sql`drop table if exists __drizzle_migrations`);\n\n\t\t\tawait migrate(db, { migrationsFolder: './drizzle2/singlestore' });\n\n\t\t\tawait db.insert(usersMigratorTable).values({ id: 1, name: 'John', email: 'email' });\n\n\t\t\tconst result = await db.select().from(usersMigratorTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\t\t\tawait db.execute(sql`drop table cities_migration`);\n\t\t\tawait db.execute(sql`drop table users_migration`);\n\t\t\tawait db.execute(sql`drop table users12`);\n\t\t\tawait db.execute(sql`drop table __drizzle_migrations`);\n\t\t});\n\n\t\ttest('insert via db.execute + select via db.execute', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`insert into ${usersTable} (${new Name(usersTable.id.name)},${new Name(\n\t\t\t\t\tusersTable.name.name,\n\t\t\t\t)}) values (1,${'John'})`,\n\t\t\t);\n\n\t\t\tconst result = await db.execute<{ id: number; name: string }>(sql`select id, name from ${usersTable}`);\n\t\t\texpect(result[0]).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert via db.execute w/ query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst inserted = await db.execute(\n\t\t\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }),\n\t\t\t);\n\t\t\texpect(inserted[0].affectedRows).toBe(1);\n\t\t});\n\n\t\ttest('insert + select all possible dates', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`datestable\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`datestable\\` (\n\t\t\t\t\t    \\`date\\` date,\n\t\t\t\t\t    \\`date_as_string\\` date,\n\t\t\t\t\t    \\`time\\` time,\n\t\t\t\t\t    \\`datetime\\` datetime,\n\t\t\t\t\t    \\`datetime_as_string\\` datetime,\n\t\t\t\t\t    \\`timestamp\\` timestamp(6),\n\t\t\t\t\t    \\`timestamp_as_string\\` timestamp(6),\n\t\t\t\t\t    \\`year\\` year\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tconst date = new Date('2022-11-11');\n\t\t\tconst dateWithMilliseconds = new Date('2022-11-11 12:12:12.123');\n\n\t\t\tawait db.insert(datesTable).values({\n\t\t\t\tdate: date,\n\t\t\t\tdateAsString: '2022-11-11',\n\t\t\t\ttime: '12:12:12',\n\t\t\t\tdatetime: date,\n\t\t\t\tyear: 22,\n\t\t\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t\t\t\ttimestamp: dateWithMilliseconds,\n\t\t\t\ttimestampAsString: '2022-11-11 12:12:12.123',\n\t\t\t});\n\n\t\t\tconst res = await db.select().from(datesTable);\n\n\t\t\texpect(res[0]?.date).toBeInstanceOf(Date);\n\t\t\texpect(res[0]?.datetime).toBeInstanceOf(Date);\n\t\t\texpect(typeof res[0]?.dateAsString).toBe('string');\n\t\t\texpect(typeof res[0]?.datetimeAsString).toBe('string');\n\n\t\t\texpect(res).toEqual([{\n\t\t\t\tdate: toLocalDate(new Date('2022-11-11')),\n\t\t\t\tdateAsString: '2022-11-11',\n\t\t\t\ttime: '12:12:12',\n\t\t\t\tdatetime: new Date('2022-11-11'),\n\t\t\t\tyear: 2022,\n\t\t\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t\t\t\ttimestamp: new Date('2022-11-11 12:12:12.123'),\n\t\t\t\ttimestampAsString: '2022-11-11 12:12:12.123000',\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table if exists \\`datestable\\``);\n\t\t});\n\n\t\tconst tableWithEnums = singlestoreTable('enums_test_case', {\n\t\t\tid: serial('id').primaryKey(),\n\t\t\tenum1: singlestoreEnum('enum1', ['a', 'b', 'c']).notNull(),\n\t\t\tenum2: singlestoreEnum('enum2', ['a', 'b', 'c']).default('a'),\n\t\t\tenum3: singlestoreEnum('enum3', ['a', 'b', 'c']).notNull().default('b'),\n\t\t});\n\n\t\ttest('SingleStore enum test case #1', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`enums_test_case\\``);\n\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table \\`enums_test_case\\` (\n\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t    \\`enum1\\` ENUM('a', 'b', 'c') not null,\n\t\t\t\t    \\`enum2\\` ENUM('a', 'b', 'c') default 'a',\n\t\t\t\t    \\`enum3\\` ENUM('a', 'b', 'c') not null default 'b'\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.insert(tableWithEnums).values([\n\t\t\t\t{ id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n\t\t\t\t{ id: 2, enum1: 'a', enum3: 'c' },\n\t\t\t\t{ id: 3, enum1: 'a' },\n\t\t\t]);\n\n\t\t\tconst res = await db.select().from(tableWithEnums).orderBy(asc(tableWithEnums.id));\n\n\t\t\tawait db.execute(sql`drop table \\`enums_test_case\\``);\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{ id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n\t\t\t\t{ id: 2, enum1: 'a', enum2: 'a', enum3: 'c' },\n\t\t\t\t{ id: 3, enum1: 'a', enum2: 'a', enum3: 'b' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('left join (flat object fields)', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ id: 1, name: 'John', cityId: 1 }, { id: 2, name: 'Jane' }]);\n\n\t\t\tconst res = await db.select({\n\t\t\t\tuserId: users2Table.id,\n\t\t\t\tuserName: users2Table.name,\n\t\t\t\tcityId: citiesTable.id,\n\t\t\t\tcityName: citiesTable.name,\n\t\t\t}).from(users2Table)\n\t\t\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.orderBy(users2Table.id);\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{ userId: 1, userName: 'John', cityId: 1, cityName: 'Paris' },\n\t\t\t\t{ userId: 2, userName: 'Jane', cityId: null, cityName: null },\n\t\t\t]);\n\t\t});\n\n\t\ttest('left join (grouped fields)', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ id: 1, name: 'John', cityId: 1 }, { id: 2, name: 'Jane' }]);\n\n\t\t\tconst res = await db.select({\n\t\t\t\tid: users2Table.id,\n\t\t\t\tuser: {\n\t\t\t\t\tname: users2Table.name,\n\t\t\t\t\tnameUpper: sql<string>`upper(${users2Table.name})`,\n\t\t\t\t},\n\t\t\t\tcity: {\n\t\t\t\t\tid: citiesTable.id,\n\t\t\t\t\tname: citiesTable.name,\n\t\t\t\t\tnameUpper: sql<string>`upper(${citiesTable.name})`,\n\t\t\t\t},\n\t\t\t}).from(users2Table)\n\t\t\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.orderBy(asc(users2Table.id));\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tuser: { name: 'John', nameUpper: 'JOHN' },\n\t\t\t\t\tcity: { id: 1, name: 'Paris', nameUpper: 'PARIS' },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tuser: { name: 'Jane', nameUpper: 'JANE' },\n\t\t\t\t\tcity: null,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('select from a many subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst res = await db.select({\n\t\t\t\tpopulation: db.select({ count: count().as('count') }).from(users2Table).where(\n\t\t\t\t\teq(users2Table.cityId, citiesTable.id),\n\t\t\t\t).as(\n\t\t\t\t\t'population',\n\t\t\t\t),\n\t\t\t\tname: citiesTable.name,\n\t\t\t}).from(citiesTable);\n\n\t\t\texpectTypeOf(res).toEqualTypeOf<\n\t\t\t\t{\n\t\t\t\t\tpopulation: number;\n\t\t\t\t\tname: string;\n\t\t\t\t}[]\n\t\t\t>();\n\n\t\t\texpect(res).toStrictEqual(expect.arrayContaining([{\n\t\t\t\tpopulation: 1,\n\t\t\t\tname: 'Paris',\n\t\t\t}, {\n\t\t\t\tpopulation: 2,\n\t\t\t\tname: 'London',\n\t\t\t}]));\n\t\t});\n\n\t\ttest('select from a one subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst res = await db.select({\n\t\t\t\tcityName: db.select({ name: citiesTable.name }).from(citiesTable).where(eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t\t.as(\n\t\t\t\t\t\t'cityName',\n\t\t\t\t\t),\n\t\t\t\tname: users2Table.name,\n\t\t\t}).from(users2Table);\n\n\t\t\texpectTypeOf(res).toEqualTypeOf<\n\t\t\t\t{\n\t\t\t\t\tcityName: string;\n\t\t\t\t\tname: string;\n\t\t\t\t}[]\n\t\t\t>();\n\n\t\t\texpect(res).toStrictEqual(expect.arrayContaining([{\n\t\t\t\tcityName: 'Paris',\n\t\t\t\tname: 'John',\n\t\t\t}, {\n\t\t\t\tcityName: 'London',\n\t\t\t\tname: 'Jane',\n\t\t\t}, {\n\t\t\t\tcityName: 'London',\n\t\t\t\tname: 'Jack',\n\t\t\t}]));\n\t\t});\n\n\t\ttest('left join (all fields)', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ id: 1, name: 'John', cityId: 1 }, { id: 2, name: 'Jane' }]);\n\n\t\t\tconst res = await db.select().from(users2Table)\n\t\t\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.orderBy(asc(users2Table.id));\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{\n\t\t\t\t\tusers2: {\n\t\t\t\t\t\tid: 1,\n\t\t\t\t\t\tname: 'John',\n\t\t\t\t\t\tcityId: 1,\n\t\t\t\t\t},\n\t\t\t\t\tcities: {\n\t\t\t\t\t\tid: 1,\n\t\t\t\t\t\tname: 'Paris',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers2: {\n\t\t\t\t\t\tid: 2,\n\t\t\t\t\t\tname: 'Jane',\n\t\t\t\t\t\tcityId: null,\n\t\t\t\t\t},\n\t\t\t\t\tcities: null,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('join subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`courses\\``);\n\t\t\tawait db.execute(sql`drop table if exists \\`course_categories\\``);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`course_categories\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`name\\` text not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`courses\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`name\\` text not null,\n\t\t\t\t\t    \\`category_id\\` int\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(courseCategoriesTable).values([\n\t\t\t\t{ id: 1, name: 'Category 1' },\n\t\t\t\t{ id: 2, name: 'Category 2' },\n\t\t\t\t{ id: 3, name: 'Category 3' },\n\t\t\t\t{ id: 4, name: 'Category 4' },\n\t\t\t]);\n\n\t\t\tawait db.insert(coursesTable).values([\n\t\t\t\t{ id: 1, name: 'Development', categoryId: 2 },\n\t\t\t\t{ id: 2, name: 'IT & Software', categoryId: 3 },\n\t\t\t\t{ id: 3, name: 'Marketing', categoryId: 4 },\n\t\t\t\t{ id: 4, name: 'Design', categoryId: 1 },\n\t\t\t]);\n\n\t\t\tconst sq2 = db\n\t\t\t\t.select({\n\t\t\t\t\tcategoryId: courseCategoriesTable.id,\n\t\t\t\t\tcategory: courseCategoriesTable.name,\n\t\t\t\t\ttotal: sql<number>`count(${courseCategoriesTable.id})`,\n\t\t\t\t})\n\t\t\t\t.from(courseCategoriesTable)\n\t\t\t\t.groupBy(courseCategoriesTable.id, courseCategoriesTable.name)\n\t\t\t\t.as('sq2');\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tcourseName: coursesTable.name,\n\t\t\t\t\tcategoryId: sq2.categoryId,\n\t\t\t\t})\n\t\t\t\t.from(coursesTable)\n\t\t\t\t.leftJoin(sq2, eq(coursesTable.categoryId, sq2.categoryId))\n\t\t\t\t.orderBy(coursesTable.name);\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{ courseName: 'Design', categoryId: 1 },\n\t\t\t\t{ courseName: 'Development', categoryId: 2 },\n\t\t\t\t{ courseName: 'IT & Software', categoryId: 3 },\n\t\t\t\t{ courseName: 'Marketing', categoryId: 4 },\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop table if exists \\`courses\\``);\n\t\t\tawait db.execute(sql`drop table if exists \\`course_categories\\``);\n\t\t});\n\n\t\ttest('with ... select', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`orders\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`orders\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`region\\` text not null,\n\t\t\t\t\t    \\`product\\` text not null,\n\t\t\t\t\t    \\`amount\\` int not null,\n\t\t\t\t\t    \\`quantity\\` int not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(orders).values([\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t\t\t]);\n\n\t\t\tconst regionalSales = db\n\t\t\t\t.$with('regional_sales')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tregion: orders.region,\n\t\t\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(orders)\n\t\t\t\t\t\t.groupBy(orders.region),\n\t\t\t\t);\n\n\t\t\tconst topRegions = db\n\t\t\t\t.$with('top_regions')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tregion: regionalSales.region,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(regionalSales)\n\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\tgt(\n\t\t\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\t\t\tdb.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\tconst result = await db\n\t\t\t\t.with(regionalSales, topRegions)\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\tproduct: orders.product,\n\t\t\t\t\tproductUnits: sql<number>`cast(sum(${orders.quantity}) as unsigned)`,\n\t\t\t\t\tproductSales: sql<number>`cast(sum(${orders.amount}) as unsigned)`,\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t\t\t.groupBy(orders.region, orders.product)\n\t\t\t\t.orderBy(orders.region, orders.product);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tregion: 'Europe',\n\t\t\t\t\tproduct: 'A',\n\t\t\t\t\tproductUnits: 3,\n\t\t\t\t\tproductSales: 30,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'Europe',\n\t\t\t\t\tproduct: 'B',\n\t\t\t\t\tproductUnits: 5,\n\t\t\t\t\tproductSales: 50,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'US',\n\t\t\t\t\tproduct: 'A',\n\t\t\t\t\tproductUnits: 7,\n\t\t\t\t\tproductSales: 70,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'US',\n\t\t\t\t\tproduct: 'B',\n\t\t\t\t\tproductUnits: 9,\n\t\t\t\t\tproductSales: 90,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('with ... update', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst products = singlestoreTable('products', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tprice: decimal('price', {\n\t\t\t\t\tprecision: 15,\n\t\t\t\t\tscale: 2,\n\t\t\t\t}).notNull(),\n\t\t\t\tcheap: boolean('cheap').notNull().default(false),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${products}`);\n\t\t\tawait db.execute(sql`\n\t\t\t\tcreate table ${products} (\n\t\t\t\t    id serial primary key,\n\t\t\t\t    price decimal(15, 2) not null,\n\t\t\t\t    cheap boolean not null default false\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.insert(products).values([\n\t\t\t\t{ id: 1, price: '10.99' },\n\t\t\t\t{ id: 2, price: '25.85' },\n\t\t\t\t{ id: 3, price: '32.99' },\n\t\t\t\t{ id: 4, price: '2.50' },\n\t\t\t\t{ id: 5, price: '4.59' },\n\t\t\t]);\n\n\t\t\tconst averagePrice = db\n\t\t\t\t.$with('average_price')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tvalue: sql`avg(${products.price})`.as('value'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(products),\n\t\t\t\t);\n\n\t\t\tawait db\n\t\t\t\t.with(averagePrice)\n\t\t\t\t.update(products)\n\t\t\t\t.set({\n\t\t\t\t\tcheap: true,\n\t\t\t\t})\n\t\t\t\t.where(lt(products.price, sql`(select * from ${averagePrice})`));\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: products.id,\n\t\t\t\t})\n\t\t\t\t.from(products)\n\t\t\t\t.where(eq(products.cheap, true))\n\t\t\t\t.orderBy(asc(products.id));\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1 },\n\t\t\t\t{ id: 4 },\n\t\t\t\t{ id: 5 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('with ... delete', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`orders\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`orders\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`region\\` text not null,\n\t\t\t\t\t    \\`product\\` text not null,\n\t\t\t\t\t    \\`amount\\` int not null,\n\t\t\t\t\t    \\`quantity\\` int not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(orders).values([\n\t\t\t\t{ id: 1, region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t\t\t{ id: 2, region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t\t\t{ id: 3, region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t\t\t{ id: 4, region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t\t\t{ id: 5, region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t\t\t{ id: 6, region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t\t\t{ id: 7, region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t\t\t{ id: 8, region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t\t\t]);\n\n\t\t\tconst averageAmount = db\n\t\t\t\t.$with('average_amount')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tvalue: sql`avg(${orders.amount})`.as('value'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(orders),\n\t\t\t\t);\n\n\t\t\tawait db\n\t\t\t\t.with(averageAmount)\n\t\t\t\t.delete(orders)\n\t\t\t\t.where(gt(orders.amount, sql`(select * from ${averageAmount})`));\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: orders.id,\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.orderBy(asc(orders.id));\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1 },\n\t\t\t\t{ id: 2 },\n\t\t\t\t{ id: 3 },\n\t\t\t\t{ id: 4 },\n\t\t\t\t{ id: 5 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('select from subquery sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(users2Table).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({ name: sql<string>`concat(${users2Table.name}, \" modified\")`.as('name') })\n\t\t\t\t.from(users2Table)\n\t\t\t\t.orderBy(asc(users2Table.id))\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = await db.select({ name: sq.name }).from(sq);\n\n\t\t\texpect(res).toEqual([{ name: 'John modified' }, { name: 'Jane modified' }]);\n\t\t});\n\n\t\ttest('select a field without joining its table', (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\texpect(() => db.select({ name: users2Table.name }).from(usersTable).prepare()).toThrowError();\n\t\t});\n\n\t\ttest('select all fields from subquery without alias', (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst sq = db.$with('sq').as(db.select({ name: sql<string>`upper(${users2Table.name})` }).from(users2Table));\n\n\t\t\texpect(() => db.select().from(sq).prepare()).toThrowError();\n\t\t});\n\n\t\ttest('select count()', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }]);\n\n\t\t\tconst res = await db.select({ count: sql`count(*)` }).from(usersTable);\n\n\t\t\texpect(res).toEqual([{ count: 2 }]);\n\t\t});\n\n\t\ttest('select for ...', (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\t{\n\t\t\t\tconst query = db.select().from(users2Table).for('update').toSQL();\n\t\t\t\texpect(query.sql).toMatch(/ for update$/);\n\t\t\t}\n\t\t\t{\n\t\t\t\tconst query = db.select().from(users2Table).for('share', { skipLocked: true }).toSQL();\n\t\t\t\texpect(query.sql).toMatch(/ for share skip locked$/);\n\t\t\t}\n\t\t\t{\n\t\t\t\tconst query = db.select().from(users2Table).for('update', { noWait: true }).toSQL();\n\t\t\t\texpect(query.sql).toMatch(/ for update nowait$/);\n\t\t\t}\n\t\t});\n\n\t\ttest('having', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(citiesTable).values([{ id: 1, name: 'London' }, { id: 2, name: 'Paris' }, {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'New York',\n\t\t\t}]);\n\n\t\t\tawait db.insert(users2Table).values([{ id: 1, name: 'John', cityId: 1 }, { id: 2, name: 'Jane', cityId: 1 }, {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Jack',\n\t\t\t\tcityId: 2,\n\t\t\t}]);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: citiesTable.id,\n\t\t\t\t\tname: sql<string>`upper(${citiesTable.name})`.as('upper_name'),\n\t\t\t\t\tusersCount: sql<number>`count(${users2Table.id})`.as('users_count'),\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.leftJoin(users2Table, eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.where(({ name }) => sql`length(${name}) >= 3`)\n\t\t\t\t.groupBy(citiesTable.id)\n\t\t\t\t.having(({ usersCount }) => sql`${usersCount} > 0`)\n\t\t\t\t.orderBy(({ name }) => name);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tname: 'LONDON',\n\t\t\t\t\tusersCount: 2,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'PARIS',\n\t\t\t\t\tusersCount: 1,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\t// TODO: Unskip when views are supported\n\t\t/* test.skip('view', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst newYorkers1 = singlestoreView('new_yorkers')\n\t\t\t\t.as((qb) => qb.select().from(users2Table).where(eq(users2Table.cityId, 1)));\n\n\t\t\tconst newYorkers2 = singlestoreView('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: int('city_id').notNull(),\n\t\t\t}).as(sql`select * from ${users2Table} where ${eq(users2Table.cityId, 1)}`);\n\n\t\t\tconst newYorkers3 = singlestoreView('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: int('city_id').notNull(),\n\t\t\t}).existing();\n\n\t\t\tawait db.execute(sql`create view new_yorkers as ${getViewConfig(newYorkers1).query}`);\n\n\t\t\tawait db.insert(citiesTable).values([{ id: 1, name: 'New York' }, { id: 2, name: 'Paris' }]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t{ id: 3, name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers1).orderBy(asc(newYorkers1.id));\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers2).orderBy(asc(newYorkers2.id));\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers3).orderBy(asc(newYorkers3.id));\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1).orderBy(asc(newYorkers1.id));\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\tawait db.execute(sql`drop view ${newYorkers1}`);\n\t\t}); */\n\n\t\ttest('select from raw sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst result = await db.select({\n\t\t\t\tid: sql<number>`id`,\n\t\t\t\tname: sql<string>`name`,\n\t\t\t}).from(sql`(select 1 as id, 'John' as name) as users`);\n\n\t\t\tExpect<Equal<{ id: number; name: string }[], typeof result>>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('select from raw sql with joins', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: sql<number>`users.id`,\n\t\t\t\t\tname: sql<string>`users.name`,\n\t\t\t\t\tuserCity: sql<string>`users.city`,\n\t\t\t\t\tcityName: sql<string>`cities.name`,\n\t\t\t\t})\n\t\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, sql`cities.id = users.id`);\n\n\t\t\tExpect<Equal<{ id: number; name: string; userCity: string; cityName: string }[], typeof result>>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', userCity: 'New York', cityName: 'Paris' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('join on aliased sql from select', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: sql<number>`users.id`.as('userId'),\n\t\t\t\t\tname: sql<string>`users.name`,\n\t\t\t\t\tuserCity: sql<string>`users.city`,\n\t\t\t\t\tcityId: sql<number>`cities.id`.as('cityId'),\n\t\t\t\t\tcityName: sql<string>`cities.name`,\n\t\t\t\t})\n\t\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, (cols) => eq(cols.cityId, cols.userId));\n\n\t\t\tExpect<\n\t\t\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t\t\t>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('join on aliased sql from with clause', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = db.$with('users').as(\n\t\t\t\tdb.select({\n\t\t\t\t\tid: sql<number>`id`.as('userId'),\n\t\t\t\t\tname: sql<string>`name`.as('userName'),\n\t\t\t\t\tcity: sql<string>`city`.as('city'),\n\t\t\t\t}).from(\n\t\t\t\t\tsql`(select 1 as id, 'John' as name, 'New York' as city) as users`,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst cities = db.$with('cities').as(\n\t\t\t\tdb.select({\n\t\t\t\t\tid: sql<number>`id`.as('cityId'),\n\t\t\t\t\tname: sql<string>`name`.as('cityName'),\n\t\t\t\t}).from(\n\t\t\t\t\tsql`(select 1 as id, 'Paris' as name) as cities`,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst result = await db\n\t\t\t\t.with(users, cities)\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users.id,\n\t\t\t\t\tname: users.name,\n\t\t\t\t\tuserCity: users.city,\n\t\t\t\t\tcityId: cities.id,\n\t\t\t\t\tcityName: cities.name,\n\t\t\t\t})\n\t\t\t\t.from(users)\n\t\t\t\t.leftJoin(cities, (cols) => eq(cols.cityId, cols.userId));\n\n\t\t\tExpect<\n\t\t\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t\t\t>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('prefixed table', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst singlestoreTable = singlestoreTableCreator((name) => `myprefix_${name}`);\n\n\t\t\tconst users = singlestoreTable('test_prefixed_table_with_unique_name', {\n\t\t\t\tid: int('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table myprefix_test_prefixed_table_with_unique_name (id int not null primary key, name text not null)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values({ id: 1, name: 'John' });\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('orderBy with aliased column', (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst query = db.select({\n\t\t\t\ttest: sql`something`.as('test'),\n\t\t\t}).from(users2Table).orderBy((fields) => fields.test).toSQL();\n\n\t\t\texpect(query.sql).toBe('select something as `test` from `users2` order by `test`');\n\t\t});\n\n\t\ttest('timestamp timezone', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst date = new Date(Date.parse('2020-01-01T12:34:56+07:00'));\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: 'With default times' });\n\t\t\tawait db.insert(usersTable).values({\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Without default times',\n\t\t\t\tcreatedAt: date,\n\t\t\t});\n\t\t\tconst users = await db.select().from(usersTable).orderBy(asc(usersTable.id));\n\n\t\t\t// check that the timestamps are set correctly for default times\n\t\t\texpect(Math.abs(users[0]!.createdAt.getTime() - Date.now())).toBeLessThan(2000);\n\n\t\t\t// check that the timestamps are set correctly for non default times\n\t\t\texpect(Math.abs(users[1]!.createdAt.getTime() - date.getTime())).toBeLessThan(2000);\n\t\t});\n\n\t\ttest('transaction', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('users_transactions', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tbalance: int('balance').notNull(),\n\t\t\t});\n\t\t\tconst products = singlestoreTable('products_transactions', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tprice: int('price').notNull(),\n\t\t\t\tstock: int('stock').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`drop table if exists ${products}`);\n\n\t\t\tawait db.execute(sql`create table users_transactions (id serial not null primary key, balance int not null)`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table products_transactions (id serial not null primary key, price int not null, stock int not null)`,\n\t\t\t);\n\n\t\t\tconst [{ insertId: userId }] = await db.insert(users).values({ id: 1, balance: 100 });\n\t\t\tconst user = await db.select().from(users).where(eq(users.id, userId)).then((rows) => rows[0]!);\n\t\t\tconst [{ insertId: productId }] = await db.insert(products).values({ id: 1, price: 10, stock: 10 });\n\t\t\tconst product = await db.select().from(products).where(eq(products.id, productId)).then((rows) => rows[0]!);\n\n\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\tawait tx.update(users).set({ balance: user.balance - product.price }).where(eq(users.id, user.id));\n\t\t\t\tawait tx.update(products).set({ stock: product.stock - 1 }).where(eq(products.id, product.id));\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([{ id: 1, balance: 90 }]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t\tawait db.execute(sql`drop table ${products}`);\n\t\t});\n\n\t\ttest('transaction rollback', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('users_transactions_rollback', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tbalance: int('balance').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table users_transactions_rollback (id serial not null primary key, balance int not null)`,\n\t\t\t);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\t\tawait tx.insert(users).values({ balance: 100 });\n\t\t\t\t\ttx.rollback();\n\t\t\t\t});\n\t\t\t})()).rejects.toThrowError(TransactionRollbackError);\n\n\t\t\tconst result = await db.select().from(users);\n\n\t\t\texpect(result).toEqual([]);\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('join subquery with join', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst internalStaff = singlestoreTable('internal_staff', {\n\t\t\t\tuserId: int('user_id').notNull(),\n\t\t\t});\n\n\t\t\tconst customUser = singlestoreTable('custom_user', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t});\n\n\t\t\tconst ticket = singlestoreTable('ticket', {\n\t\t\t\tstaffId: int('staff_id').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${internalStaff}`);\n\t\t\tawait db.execute(sql`drop table if exists ${customUser}`);\n\t\t\tawait db.execute(sql`drop table if exists ${ticket}`);\n\n\t\t\tawait db.execute(sql`create table internal_staff (user_id integer not null)`);\n\t\t\tawait db.execute(sql`create table custom_user (id integer not null)`);\n\t\t\tawait db.execute(sql`create table ticket (staff_id integer not null)`);\n\n\t\t\tawait db.insert(internalStaff).values({ userId: 1 });\n\t\t\tawait db.insert(customUser).values({ id: 1 });\n\t\t\tawait db.insert(ticket).values({ staffId: 1 });\n\n\t\t\tconst subq = db\n\t\t\t\t.select()\n\t\t\t\t.from(internalStaff)\n\t\t\t\t.leftJoin(customUser, eq(internalStaff.userId, customUser.id))\n\t\t\t\t.as('internal_staff');\n\n\t\t\tconst mainQuery = await db\n\t\t\t\t.select()\n\t\t\t\t.from(ticket)\n\t\t\t\t.leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId));\n\n\t\t\texpect(mainQuery).toEqual([{\n\t\t\t\tticket: { staffId: 1 },\n\t\t\t\tinternal_staff: {\n\t\t\t\t\tinternal_staff: { userId: 1 },\n\t\t\t\t\tcustom_user: { id: 1 },\n\t\t\t\t},\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table ${internalStaff}`);\n\t\t\tawait db.execute(sql`drop table ${customUser}`);\n\t\t\tawait db.execute(sql`drop table ${ticket}`);\n\t\t});\n\n\t\t// TODO: Unskip when views are supported\n\t\t/* test.skip('subquery with view', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('users_subquery_view', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: int('city_id').notNull(),\n\t\t\t});\n\n\t\t\tconst newYorkers = singlestoreView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`drop view if exists ${newYorkers}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t\t\t);\n\t\t\tawait db.execute(sql`create view ${newYorkers} as select * from ${users} where city_id = 1`);\n\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t{ id: 2, name: 'Jane', cityId: 2 },\n\t\t\t\t{ id: 3, name: 'Jack', cityId: 1 },\n\t\t\t\t{ id: 4, name: 'Jill', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst sq = db.$with('sq').as(db.select().from(newYorkers));\n\t\t\tconst result = await db.with(sq).select().from(sq).orderBy(asc(sq.id));\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t{ id: 3, name: 'Jack', cityId: 1 },\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop view ${newYorkers}`);\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t}); */\n\n\t\t// TODO: Unskip when views are supported\n\t\t/* test.skip('join view as subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('users_join_view', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: int('city_id').notNull(),\n\t\t\t});\n\n\t\t\tconst newYorkers = singlestoreView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`drop view if exists ${newYorkers}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t\t\t);\n\t\t\tawait db.execute(sql`create view ${newYorkers} as select * from ${users} where city_id = 1`);\n\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t{ id: 2, name: 'Jane', cityId: 2 },\n\t\t\t\t{ id: 3, name: 'Jack', cityId: 1 },\n\t\t\t\t{ id: 4, name: 'Jill', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst sq = db.select().from(newYorkers).as('new_yorkers_sq');\n\n\t\t\tconst result = await db.select().from(users).leftJoin(sq, eq(users.id, sq.id)).orderBy(asc(users.id));\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\tnew_yorkers_sq: { id: 1, name: 'John', cityId: 1 },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 2, name: 'Jane', cityId: 2 },\n\t\t\t\t\tnew_yorkers_sq: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 3, name: 'Jack', cityId: 1 },\n\t\t\t\t\tnew_yorkers_sq: { id: 3, name: 'Jack', cityId: 1 },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 4, name: 'Jill', cityId: 2 },\n\t\t\t\t\tnew_yorkers_sq: null,\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tawait db.execute(sql`drop view ${newYorkers}`);\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t}); */\n\n\t\ttest('select iterator', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('users_iterator', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial not null primary key)`);\n\n\t\t\tawait db.insert(users).values([{ id: 1 }, { id: 2 }, { id: 3 }]);\n\n\t\t\tconst iter = db.select().from(users)\n\t\t\t\t.orderBy(asc(users.id))\n\t\t\t\t.iterator();\n\n\t\t\tconst result: typeof users.$inferSelect[] = [];\n\n\t\t\tfor await (const row of iter) {\n\t\t\t\tresult.push(row);\n\t\t\t}\n\n\t\t\texpect(result).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }]);\n\t\t});\n\n\t\ttest('select iterator w/ prepared statement', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('users_iterator', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial not null primary key)`);\n\n\t\t\tawait db.insert(users).values([{ id: 1 }, { id: 2 }, { id: 3 }]);\n\n\t\t\tconst prepared = db.select().from(users)\n\t\t\t\t.orderBy(asc(users.id))\n\t\t\t\t.prepare();\n\t\t\tconst iter = prepared.iterator();\n\t\t\tconst result: typeof users.$inferSelect[] = [];\n\n\t\t\tfor await (const row of iter) {\n\t\t\t\tresult.push(row);\n\t\t\t}\n\n\t\t\texpect(result).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }]);\n\t\t});\n\n\t\ttest('insert undefined', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text)`,\n\t\t\t);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.insert(users).values({ name: undefined });\n\t\t\t})()).resolves.not.toThrowError();\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('update undefined', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`create table ${users} (id serial not null primary key, name text)`,\n\t\t\t);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.update(users).set({ name: undefined });\n\t\t\t})()).rejects.toThrowError();\n\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.update(users).set({ id: 1, name: undefined });\n\t\t\t})()).resolves.not.toThrowError();\n\n\t\t\tawait db.execute(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('utc config for datetime', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.execute(sql`drop table if exists \\`datestable\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`datestable\\` (\n\t\t\t\t\t    \\`datetime_utc\\` datetime(6),\n\t\t\t\t\t    \\`datetime\\` datetime(6)\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tconst datesTable = singlestoreTable('datestable', {\n\t\t\t\tdatetimeUTC: datetime('datetime_utc', { mode: 'date' }),\n\t\t\t\tdatetime: datetime('datetime'),\n\t\t\t});\n\n\t\t\tconst dateObj = new Date('2022-11-11');\n\t\t\tconst dateUtc = new Date('2022-11-11T12:12:12.122Z');\n\n\t\t\tawait db.insert(datesTable).values({\n\t\t\t\tdatetimeUTC: dateUtc,\n\t\t\t\tdatetime: dateObj,\n\t\t\t});\n\n\t\t\tconst res = await db.select().from(datesTable);\n\n\t\t\tconst [rawSelect] = await db.execute(sql`select \\`datetime_utc\\` from \\`datestable\\``);\n\t\t\tconst selectedRow = (rawSelect as unknown as [{ datetime_utc: string }])[0];\n\n\t\t\texpect(selectedRow.datetime_utc).toBe('2022-11-11 12:12:12.122000');\n\t\t\texpect(new Date(selectedRow.datetime_utc.replace(' ', 'T') + 'Z')).toEqual(dateUtc);\n\n\t\t\texpect(res[0]?.datetime).toBeInstanceOf(Date);\n\t\t\texpect(res[0]?.datetimeUTC).toBeInstanceOf(Date);\n\n\t\t\texpect(res).toEqual([{\n\t\t\t\tdatetimeUTC: dateUtc,\n\t\t\t\tdatetime: new Date('2022-11-11'),\n\t\t\t}]);\n\n\t\t\tawait db.execute(sql`drop table if exists \\`datestable\\``);\n\t\t});\n\n\t\t// TODO (https://memsql.atlassian.net/browse/MCDB-63261) allow chaining limit and orderby in subquery\n\t\ttest('set operations (union) from query builder with subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait setupSetOperationTest(db);\n\t\t\tconst citiesQuery = db\n\t\t\t\t.select({\n\t\t\t\t\tid: citiesTable.id,\n\t\t\t\t\tname: citiesTable.name,\n\t\t\t\t\torderCol: sql`0`.as('orderCol'),\n\t\t\t\t})\n\t\t\t\t.from(citiesTable);\n\n\t\t\tconst usersQuery = db\n\t\t\t\t.select({\n\t\t\t\t\tid: users2Table.id,\n\t\t\t\t\tname: users2Table.name,\n\t\t\t\t\torderCol: sql`1`.as('orderCol'),\n\t\t\t\t})\n\t\t\t\t.from(users2Table);\n\n\t\t\tconst unionQuery = db\n\t\t\t\t.select({\n\t\t\t\t\tid: sql`id`,\n\t\t\t\t\tname: sql`name`,\n\t\t\t\t})\n\t\t\t\t.from(\n\t\t\t\t\tcitiesQuery.union(usersQuery).as('combined'),\n\t\t\t\t)\n\t\t\t\t.orderBy(sql`orderCol`, sql`id`)\n\t\t\t\t.limit(8);\n\n\t\t\tconst result = await unionQuery;\n\n\t\t\texpect(result).toHaveLength(8);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'Jane' },\n\t\t\t\t{ id: 3, name: 'Jack' },\n\t\t\t\t{ id: 4, name: 'Peter' },\n\t\t\t\t{ id: 5, name: 'Ben' },\n\t\t\t]);\n\n\t\t\t// union should throw if selected fields are not in the same order\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).union(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t\t.from(users2Table),\n\t\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (union) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await union(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t);\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tunion(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (union all) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t.from(citiesTable).orderBy(asc(sql`id`)).limit(2).unionAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).orderBy(asc(sql`id`)).limit(2),\n\t\t\t\t).as('sq');\n\n\t\t\tconst result = await db.select().from(sq).orderBy(asc(sql`id`)).limit(3);\n\n\t\t\texpect(result).toHaveLength(3);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).limit(2).unionAll(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t\t.from(citiesTable).limit(2),\n\t\t\t\t\t).orderBy(asc(sql`id`));\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (union all) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst sq = unionAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).as('sq');\n\n\t\t\tconst result = await db.select().from(sq).limit(1);\n\n\t\t\texpect(result).toHaveLength(1);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tunionAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).limit(1);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (intersect) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t.from(citiesTable).intersect(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t)\n\t\t\t\t.as('sq');\n\n\t\t\tconst result = await db.select().from(sq).orderBy(asc(sql`id`));\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t.from(citiesTable).intersect(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (intersect) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst sq = await intersect(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).as('sq');\n\n\t\t\tconst result = await db.select().from(sq).limit(1);\n\n\t\t\texpect(result).toHaveLength(0);\n\n\t\t\texpect(result).toEqual([]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tintersect(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).limit(1);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (except) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(citiesTable).except(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select()\n\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t);\n\n\t\t\texpect(result).toHaveLength(1);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('set operations (except) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst sq = except(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).as('sq');\n\n\t\t\tconst result = await db.select().from(sq).limit(3);\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toContainEqual({ id: 2, name: 'London' });\n\t\t\texpect(result).toContainEqual({ id: 3, name: 'Tampa' });\n\n\t\t\tawait expect((async () => {\n\t\t\t\texcept(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t.from(citiesTable),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).limit(3);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('define constraints as array', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst table = singlestoreTable('name', {\n\t\t\t\tid: int(),\n\t\t\t}, (t) => [\n\t\t\t\tindex('name').on(t.id),\n\t\t\t\tprimaryKey({ columns: [t.id], name: 'custom' }),\n\t\t\t]);\n\n\t\t\tconst { indexes, primaryKeys } = getTableConfig(table);\n\n\t\t\texpect(indexes.length).toBe(1);\n\t\t\texpect(primaryKeys.length).toBe(1);\n\t\t});\n\n\t\ttest('define constraints as array inside third param', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst table = singlestoreTable('name', {\n\t\t\t\tid: int(),\n\t\t\t}, (t) => [\n\t\t\t\t[index('name').on(t.id), primaryKey({ columns: [t.id], name: 'custom' })],\n\t\t\t]);\n\n\t\t\tconst { indexes, primaryKeys } = getTableConfig(table);\n\n\t\t\texpect(indexes.length).toBe(1);\n\t\t\texpect(primaryKeys.length).toBe(1);\n\t\t});\n\n\t\ttest.skip('set operations (mixed) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst sq1 = unionAll(\n\t\t\t\tdb\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\tdb.select().from(citiesTable).where(eq(citiesTable.id, 2)),\n\t\t\t).as('sq1');\n\n\t\t\tconst sq2 = await db.select().from(sq1).orderBy(asc(sql`id`)).as('sq2');\n\n\t\t\tconst sq3 = await db.select().from(sq2).limit(1).offset(1).as('sq3');\n\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.except(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select()\n\t\t\t\t\t\t.from(sq3),\n\t\t\t\t);\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t]);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(citiesTable).except(\n\t\t\t\t\t\t({ unionAll }) =>\n\t\t\t\t\t\t\tunionAll(\n\t\t\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t\t\t\tdb.select().from(citiesTable).where(eq(citiesTable.id, 2)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (mixed all) as function with subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst sq1 = except(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(gte(users2Table.id, 5)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 7)),\n\t\t\t).as('sq1');\n\n\t\t\tconst sq2 = await db.select().from(sq1).orderBy(asc(sql`id`)).as('sq2');\n\n\t\t\tconst sq3 = await db.select().from(sq2).limit(1).as('sq3');\n\n\t\t\tconst result = await union(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb.select().from(sq3),\n\t\t\t\tdb\n\t\t\t\t\t.select().from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t);\n\n\t\t\texpect(result).toHaveLength(4);\n\n\t\t\t// multiple results possible as a result of the filters >= 5 and ==7 because singlestore doesn't guarantee order\n\t\t\t// dynamically validate results\n\t\t\tconst hasValidEntry = (entry: { id: number; name: string }) => {\n\t\t\t\tif (entry.id === 1) return entry.name === 'John';\n\t\t\t\tif (entry.id > 1 && entry.id < 5) return entry.name === 'Tampa' || entry.name === 'London';\n\t\t\t\tif (entry.id >= 5 && entry.id !== 7) return true; // Accept any entry with id >= 5 and not 7\n\t\t\t\treturn false;\n\t\t\t};\n\n\t\t\tfor (const entry of result) {\n\t\t\t\texpect(hasValidEntry(entry)).toBe(true);\n\t\t\t}\n\n\t\t\tawait expect((async () => {\n\t\t\t\tunion(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\texcept(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t\t.from(users2Table).where(gte(users2Table.id, 5)),\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 7)),\n\t\t\t\t\t).limit(1),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select().from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t);\n\t\t\t})()).rejects.toThrowError();\n\t\t});\n\n\t\ttest('aggregate function: count', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: count() }).from(table);\n\t\t\tconst result2 = await db.select({ value: count(table.a) }).from(table);\n\t\t\tconst result3 = await db.select({ value: countDistinct(table.name) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe(7);\n\t\t\texpect(result2[0]?.value).toBe(5);\n\t\t\texpect(result3[0]?.value).toBe(6);\n\t\t});\n\n\t\ttest('aggregate function: avg', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: avg(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: avg(table.nullOnly) }).from(table);\n\t\t\tconst result3 = await db.select({ value: avgDistinct(table.b) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe('33.3333');\n\t\t\texpect(result2[0]?.value).toBe(null);\n\t\t\texpect(result3[0]?.value).toBe('42.5000');\n\t\t});\n\n\t\ttest('aggregate function: sum', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: sum(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: sum(table.nullOnly) }).from(table);\n\t\t\tconst result3 = await db.select({ value: sumDistinct(table.b) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe('200');\n\t\t\texpect(result2[0]?.value).toBe(null);\n\t\t\texpect(result3[0]?.value).toBe('170');\n\t\t});\n\n\t\ttest('aggregate function: max', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: max(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: max(table.nullOnly) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe(90);\n\t\t\texpect(result2[0]?.value).toBe(null);\n\t\t});\n\n\t\ttest('aggregate function: min', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: min(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: min(table.nullOnly) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe(10);\n\t\t\texpect(result2[0]?.value).toBe(null);\n\t\t});\n\n\t\ttest('simple vector search', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tconst table = vectorSearchTable;\n\t\t\tconst embedding = [0.42, 0.93, 0.88, 0.57, 0.32, 0.64, 0.76, 0.52, 0.19, 0.81]; // ChatGPT's 10 dimension embedding for \"dogs are cool\" not sure how accurate but it works\n\t\t\tawait setupVectorSearchTest(db);\n\n\t\t\tconst withRankEuclidean = db.select({\n\t\t\t\tid: table.id,\n\t\t\t\ttext: table.text,\n\t\t\t\trank: sql`row_number() over (order by ${euclideanDistance(table.embedding, embedding)})`.as('rank'),\n\t\t\t}).from(table).as('with_rank');\n\t\t\tconst withRankDotProduct = db.select({\n\t\t\t\tid: table.id,\n\t\t\t\ttext: table.text,\n\t\t\t\trank: sql`row_number() over (order by ${dotProduct(table.embedding, embedding)})`.as('rank'),\n\t\t\t}).from(table).as('with_rank');\n\t\t\tconst result1 = await db.select({ id: withRankEuclidean.id, text: withRankEuclidean.text }).from(\n\t\t\t\twithRankEuclidean,\n\t\t\t).where(eq(withRankEuclidean.rank, 1));\n\t\t\tconst result2 = await db.select({ id: withRankDotProduct.id, text: withRankDotProduct.text }).from(\n\t\t\t\twithRankDotProduct,\n\t\t\t).where(eq(withRankDotProduct.rank, 1));\n\n\t\t\texpect(result1.length).toEqual(1);\n\t\t\texpect(result1[0]).toEqual({ id: 1, text: 'I like dogs' });\n\n\t\t\texpect(result2.length).toEqual(1);\n\t\t\texpect(result2[0]).toEqual({ id: 1, text: 'I like dogs' });\n\t\t});\n\n\t\ttest('test $onUpdateFn and $onUpdate works as $default', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.execute(sql`drop table if exists ${usersOnUpdate}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${usersOnUpdate} (\n\t\t\t\t\tid serial not null primary key,\n\t\t\t\t\tname text not null,\n\t\t\t\t\tupdate_counter integer default 1 not null,\n\t\t\t\t\tupdated_at datetime(6),\n\t\t\t\t\talways_null text\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(usersOnUpdate).values([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'Jane' },\n\t\t\t\t{ id: 3, name: 'Jack' },\n\t\t\t\t{ id: 4, name: 'Jill' },\n\t\t\t]);\n\t\t\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\n\t\t\tconst justDates = await db.select({ updatedAt }).from(usersOnUpdate);\n\n\t\t\tconst response = await db.select({ ...rest }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\t\t\texpect(response).toEqual([\n\t\t\t\t{ name: 'John', id: 1, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jane', id: 2, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jack', id: 3, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jill', id: 4, updateCounter: 1, alwaysNull: null },\n\t\t\t]);\n\t\t\tconst msDelay = 750;\n\n\t\t\tfor (const eachUser of justDates) {\n\t\t\t\texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t\t\t}\n\t\t});\n\n\t\ttest('test $onUpdateFn and $onUpdate works updating', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.execute(sql`drop table if exists ${usersOnUpdate}`);\n\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${usersOnUpdate} (\n\t\t\t\t\tid serial not null primary key,\n\t\t\t\t\tname text not null,\n\t\t\t\t\tupdate_counter integer default 1 not null,\n\t\t\t\t\tupdated_at datetime(6),\n\t\t\t\t\talways_null text\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(usersOnUpdate).values([\n\t\t\t\t{ id: 1, name: 'John', alwaysNull: 'this will will be null after updating' },\n\t\t\t\t{ id: 2, name: 'Jane' },\n\t\t\t\t{ id: 3, name: 'Jack' },\n\t\t\t\t{ id: 4, name: 'Jill' },\n\t\t\t]);\n\t\t\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\t\t\tconst initial = await db.select({ id: usersOnUpdate.id, updatedAt: usersOnUpdate.updatedAt }).from(usersOnUpdate);\n\n\t\t\tawait db.update(usersOnUpdate).set({ name: 'Angel' }).where(eq(usersOnUpdate.id, 1));\n\n\t\t\tconst justDates = await db.select({ id: usersOnUpdate.id, updatedAt: usersOnUpdate.updatedAt }).from(\n\t\t\t\tusersOnUpdate,\n\t\t\t);\n\n\t\t\tconst response = await db.select().from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\t\t\texpect(response).toEqual([\n\t\t\t\t{ id: 1, name: 'Angel', updateCounter: 2, updatedAt: expect.any(Date), alwaysNull: null },\n\t\t\t\t{ id: 2, name: 'Jane', updateCounter: 1, updatedAt: expect.any(Date), alwaysNull: null },\n\t\t\t\t{ id: 3, name: 'Jack', updateCounter: 1, updatedAt: expect.any(Date), alwaysNull: null },\n\t\t\t\t{ id: 4, name: 'Jill', updateCounter: 1, updatedAt: expect.any(Date), alwaysNull: null },\n\t\t\t]);\n\n\t\t\tconst initialRecord = initial.find((record) => record.id === 1);\n\t\t\tconst updatedRecord = justDates.find((record) => record.id === 1);\n\n\t\t\texpect(initialRecord?.updatedAt?.valueOf()).not.toBe(updatedRecord?.updatedAt?.valueOf());\n\n\t\t\tconst msDelay = 2000;\n\n\t\t\tfor (const eachUser of justDates) {\n\t\t\t\texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t\t\t}\n\t\t});\n\n\t\t// mySchema tests\n\t\ttest('mySchema :: select all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ id: 1, name: 'John' });\n\t\t\tconst result = await db.select().from(usersMySchemaTable);\n\n\t\t\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\t// not timezone based timestamp, thats why it should not work here\n\t\t\t// t.assert(Math.abs(result[0]!.createdAt.getTime() - now) < 2000);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('mySchema :: select sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst users = await db.select({\n\t\t\t\tname: sql`upper(${usersMySchemaTable.name})`,\n\t\t\t}).from(usersMySchemaTable);\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('mySchema :: select typed sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst users = await db.select({\n\t\t\t\tname: sql<string>`upper(${usersMySchemaTable.name})`,\n\t\t\t}).from(usersMySchemaTable);\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('mySchema :: select distinct', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst usersDistinctTable = singlestoreTable('users_distinct', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${usersDistinctTable}`);\n\t\t\tawait db.execute(sql`create table ${usersDistinctTable} (id int, name text)`);\n\n\t\t\tawait db.insert(usersDistinctTable).values([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'John' },\n\t\t\t\t{ id: 1, name: 'Jane' },\n\t\t\t]);\n\t\t\tconst users = await db.selectDistinct().from(usersDistinctTable).orderBy(\n\t\t\t\tusersDistinctTable.id,\n\t\t\t\tusersDistinctTable.name,\n\t\t\t);\n\n\t\t\tawait db.execute(sql`drop table ${usersDistinctTable}`);\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane' }, { id: 1, name: 'John' }, { id: 2, name: 'John' }]);\n\t\t});\n\n\t\ttest('mySchema :: insert returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tconst [result, _] = await db.insert(usersMySchemaTable).values({ id: 1, name: 'John' });\n\n\t\t\texpect(result.insertId).toBe(1);\n\t\t});\n\n\t\ttest('mySchema :: delete returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst users = await db.delete(usersMySchemaTable).where(eq(usersMySchemaTable.name, 'John'));\n\n\t\t\texpect(users[0].affectedRows).toBe(1);\n\t\t});\n\n\t\ttest('mySchema :: update with returning partial', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ id: 1, name: 'John' });\n\t\t\tconst updatedUsers = await db.update(usersMySchemaTable).set({ name: 'Jane' }).where(\n\t\t\t\teq(usersMySchemaTable.name, 'John'),\n\t\t\t);\n\n\t\t\tconst users = await db.select({ id: usersMySchemaTable.id, name: usersMySchemaTable.name }).from(\n\t\t\t\tusersMySchemaTable,\n\t\t\t)\n\t\t\t\t.where(\n\t\t\t\t\teq(usersMySchemaTable.id, 1),\n\t\t\t\t);\n\n\t\t\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n\t\t});\n\n\t\ttest('mySchema :: delete with returning all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ name: 'John' });\n\t\t\tconst deletedUser = await db.delete(usersMySchemaTable).where(eq(usersMySchemaTable.name, 'John'));\n\n\t\t\texpect(deletedUser[0].affectedRows).toBe(1);\n\t\t});\n\n\t\ttest('mySchema :: insert + select', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ id: 1, name: 'John' });\n\t\t\tconst result = await db.select().from(usersMySchemaTable);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ id: 2, name: 'Jane' });\n\t\t\tconst result2 = await db.select().from(usersMySchemaTable).orderBy(asc(usersMySchemaTable.id));\n\t\t\texpect(result2).toEqual([\n\t\t\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result2[0]!.createdAt },\n\t\t\t\t{ id: 2, name: 'Jane', verified: false, jsonb: null, createdAt: result2[1]!.createdAt },\n\t\t\t]);\n\t\t});\n\n\t\ttest('mySchema :: insert with overridden default values', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ id: 1, name: 'John', verified: true });\n\t\t\tconst result = await db.select().from(usersMySchemaTable);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: true, jsonb: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('mySchema :: insert many', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t\t\t{ id: 3, name: 'Jane' },\n\t\t\t\t{ id: 4, name: 'Austin', verified: true },\n\t\t\t]);\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersMySchemaTable.id,\n\t\t\t\tname: usersMySchemaTable.name,\n\t\t\t\tjsonb: usersMySchemaTable.jsonb,\n\t\t\t\tverified: usersMySchemaTable.verified,\n\t\t\t}).from(usersMySchemaTable)\n\t\t\t\t.orderBy(asc(usersMySchemaTable.id));\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t\t\t]);\n\t\t});\n\n\t\ttest('mySchema :: select with group by as field', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Jane',\n\t\t\t}]);\n\n\t\t\tconst result = await db.select({ name: usersMySchemaTable.name }).from(usersMySchemaTable)\n\t\t\t\t.groupBy(usersMySchemaTable.name)\n\t\t\t\t.orderBy(asc(usersMySchemaTable.id));\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('mySchema :: select with group by as column + sql', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, {\n\t\t\t\tid: 3,\n\t\t\t\tname: 'Jane',\n\t\t\t}]);\n\n\t\t\tconst result = await db.select({ name: usersMySchemaTable.name }).from(usersMySchemaTable)\n\t\t\t\t.groupBy(usersMySchemaTable.id, sql`${usersMySchemaTable.name}`)\n\t\t\t\t.orderBy(asc(usersMySchemaTable.id));\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('mySchema :: build query', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst query = db.select({ id: usersMySchemaTable.id, name: usersMySchemaTable.name }).from(usersMySchemaTable)\n\t\t\t\t.groupBy(usersMySchemaTable.id, usersMySchemaTable.name)\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql:\n\t\t\t\t\t`select \\`id\\`, \\`name\\` from \\`mySchema\\`.\\`userstest\\` group by \\`mySchema\\`.\\`userstest\\`.\\`id\\`, \\`mySchema\\`.\\`userstest\\`.\\`name\\``,\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t});\n\n\t\ttest('mySchema :: insert with spaces', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ id: 1, name: sql`'Jo   h     n'` });\n\t\t\tconst result = await db.select({ id: usersMySchemaTable.id, name: usersMySchemaTable.name }).from(\n\t\t\t\tusersMySchemaTable,\n\t\t\t);\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n\t\t});\n\n\t\ttest('mySchema :: prepared statement with placeholder in .where', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ id: 1, name: 'John' });\n\t\t\tconst stmt = db.select({\n\t\t\t\tid: usersMySchemaTable.id,\n\t\t\t\tname: usersMySchemaTable.name,\n\t\t\t}).from(usersMySchemaTable)\n\t\t\t\t.where(eq(usersMySchemaTable.id, sql.placeholder('id')))\n\t\t\t\t.prepare();\n\t\t\tconst result = await stmt.execute({ id: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('mySchema :: select from tables with same name from different schema using alias', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\t\t\tawait db.execute(sql`truncate table \\`mySchema\\`.\\`userstest\\``);\n\n\t\t\tawait db.execute(sql`drop table if exists \\`userstest\\``);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \\`userstest\\` (\n\t\t\t\t\t    \\`id\\` serial primary key,\n\t\t\t\t\t    \\`name\\` text not null,\n\t\t\t\t\t    \\`verified\\` boolean not null default false,\n\t\t\t\t\t    \\`jsonb\\` json,\n\t\t\t\t\t    \\`created_at\\` timestamp not null default now()\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(usersMySchemaTable).values({ id: 10, name: 'Ivan' });\n\t\t\tawait db.insert(usersTable).values({ id: 11, name: 'Hans' });\n\n\t\t\tconst customerAlias = alias(usersTable, 'customer');\n\n\t\t\tconst result = await db\n\t\t\t\t.select().from(usersMySchemaTable)\n\t\t\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t\t\t.where(eq(usersMySchemaTable.id, 10));\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tuserstest: {\n\t\t\t\t\tid: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t\tverified: false,\n\t\t\t\t\tjsonb: null,\n\t\t\t\t\tcreatedAt: result[0]!.userstest.createdAt,\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t\tverified: false,\n\t\t\t\t\tjsonb: null,\n\t\t\t\t\tcreatedAt: result[0]!.customer!.createdAt,\n\t\t\t\t},\n\t\t\t}]);\n\t\t});\n\n\t\ttest('insert $returningId: serial as id', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst result = await db.insert(usersTable).values({ id: 1, name: 'John' }).$returningId();\n\n\t\t\texpectTypeOf(result).toEqualTypeOf<{\n\t\t\t\tid: number;\n\t\t\t}[]>();\n\n\t\t\texpect(result).toStrictEqual([{ id: 1 }]);\n\t\t});\n\n\t\ttest('insert $returningId: serial as id, batch insert', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst result = await db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'John1' }])\n\t\t\t\t.$returningId();\n\n\t\t\texpectTypeOf(result).toEqualTypeOf<{\n\t\t\t\tid: number;\n\t\t\t}[]>();\n\n\t\t\t// singlestore auto increments when batch inserting, so the ids increment by one\n\t\t\texpect(result).toStrictEqual([{ id: 2 }, { id: 3 }]);\n\t\t});\n\n\t\ttest('insert $returningId: $default as primary key', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst uniqueKeys = ['ao865jf3mcmkfkk8o5ri495z', 'dyqs529eom0iczo2efxzbcut'];\n\t\t\tlet iterator = 0;\n\n\t\t\tconst usersTableDefFn = singlestoreTable('users_default_fn', {\n\t\t\t\tcustomId: varchar('id', { length: 256 }).primaryKey().$defaultFn(() => {\n\t\t\t\t\tconst value = uniqueKeys[iterator]!;\n\t\t\t\t\titerator++;\n\t\t\t\t\treturn value;\n\t\t\t\t}),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait setupReturningFunctionsTest(db);\n\n\t\t\tconst result = await db.insert(usersTableDefFn).values([{ name: 'John' }, { name: 'John1' }])\n\t\t\t\t//    ^?\n\t\t\t\t.$returningId();\n\n\t\t\texpectTypeOf(result).toEqualTypeOf<{\n\t\t\t\tcustomId: string;\n\t\t\t}[]>();\n\n\t\t\texpect(result).toStrictEqual([{ customId: 'ao865jf3mcmkfkk8o5ri495z' }, {\n\t\t\t\tcustomId: 'dyqs529eom0iczo2efxzbcut',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('insert $returningId: $default as primary key with value', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst uniqueKeys = ['ao865jf3mcmkfkk8o5ri495z', 'dyqs529eom0iczo2efxzbcut'];\n\t\t\tlet iterator = 0;\n\n\t\t\tconst usersTableDefFn = singlestoreTable('users_default_fn', {\n\t\t\t\tcustomId: varchar('id', { length: 256 }).primaryKey().$defaultFn(() => {\n\t\t\t\t\tconst value = uniqueKeys[iterator]!;\n\t\t\t\t\titerator++;\n\t\t\t\t\treturn value;\n\t\t\t\t}),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait setupReturningFunctionsTest(db);\n\n\t\t\tconst result = await db.insert(usersTableDefFn).values([{ name: 'John', customId: 'test' }, { name: 'John1' }])\n\t\t\t\t//    ^?\n\t\t\t\t.$returningId();\n\n\t\t\texpectTypeOf(result).toEqualTypeOf<{\n\t\t\t\tcustomId: string;\n\t\t\t}[]>();\n\n\t\t\texpect(result).toStrictEqual([{ customId: 'test' }, { customId: 'ao865jf3mcmkfkk8o5ri495z' }]);\n\t\t});\n\n\t\t// TODO: Unkip this test when views are supported\n\t\t/* test.skip('mySchema :: view', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst newYorkers1 = mySchema.view('new_yorkers')\n\t\t\t\t.as((qb) => qb.select().from(users2MySchemaTable).where(eq(users2MySchemaTable.cityId, 1)));\n\n\t\t\tconst newYorkers2 = mySchema.view('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: int('city_id').notNull(),\n\t\t\t}).as(sql`select * from ${users2MySchemaTable} where ${eq(users2MySchemaTable.cityId, 1)}`);\n\n\t\t\tconst newYorkers3 = mySchema.view('new_yorkers', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: int('city_id').notNull(),\n\t\t\t}).existing();\n\n\t\t\tawait db.execute(sql`create view ${newYorkers1} as ${getViewConfig(newYorkers1).query}`);\n\n\t\t\tawait db.insert(citiesMySchemaTable).values([{ id: 1, name: 'New York' }, { id: 2, name: 'Paris' }]);\n\n\t\t\tawait db.insert(users2MySchemaTable).values([\n\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t{ id: 3, name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers1).orderBy(asc(newYorkers1.id));\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers2).orderBy(asc(newYorkers2.id));\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers3).orderBy(asc(newYorkers3.id));\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1).orderBy(asc(newYorkers1.id));\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\tawait db.execute(sql`drop view ${newYorkers1}`);\n\t\t}); */\n\n\t\ttest('limit 0', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db\n\t\t\t\t.select()\n\t\t\t\t.from(usersTable)\n\t\t\t\t.limit(0);\n\n\t\t\texpect(users).toEqual([]);\n\t\t});\n\n\t\ttest('limit -1', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\t\tconst users = await db\n\t\t\t\t.select()\n\t\t\t\t.from(usersTable)\n\t\t\t\t.limit(-1);\n\n\t\t\texpect(users.length).toBeGreaterThan(0);\n\t\t});\n\n\t\ttest('sql operator as cte', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(sql`create table ${users} (id serial not null primary key, name text not null)`);\n\t\t\tawait db.insert(users).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t]);\n\n\t\t\tconst sq1 = db.$with('sq', {\n\t\t\t\tuserId: users.id,\n\t\t\t\tdata: {\n\t\t\t\t\tname: users.name,\n\t\t\t\t},\n\t\t\t}).as(sql`select * from ${users} where ${users.name} = 'John'`);\n\t\t\tconst result1 = await db.with(sq1).select().from(sq1);\n\n\t\t\tconst sq2 = db.$with('sq', {\n\t\t\t\tuserId: users.id,\n\t\t\t\tdata: {\n\t\t\t\t\tname: users.name,\n\t\t\t\t},\n\t\t\t}).as(() => sql`select * from ${users} where ${users.name} = 'Jane'`);\n\t\t\tconst result2 = await db.with(sq2).select().from(sq1);\n\n\t\t\texpect(result1).toEqual([{ userId: 1, data: { name: 'John' } }]);\n\t\t\texpect(result2).toEqual([{ userId: 2, data: { name: 'Jane' } }]);\n\t\t});\n\n\t\ttest('cross join', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t]);\n\n\t\t\tawait db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'Seattle' },\n\t\t\t\t\t{ name: 'New York City' },\n\t\t\t\t]);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tuser: usersTable.name,\n\t\t\t\t\tcity: citiesTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.crossJoin(citiesTable)\n\t\t\t\t.orderBy(usersTable.name, citiesTable.name);\n\n\t\t\texpect(result).toStrictEqual([\n\t\t\t\t{ city: 'New York City', user: 'Jane' },\n\t\t\t\t{ city: 'Seattle', user: 'Jane' },\n\t\t\t\t{ city: 'New York City', user: 'John' },\n\t\t\t\t{ city: 'Seattle', user: 'John' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('left join (lateral)', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }]);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users2Table.id,\n\t\t\t\t\tuserName: users2Table.name,\n\t\t\t\t\tcityId: users2Table.cityId,\n\t\t\t\t})\n\t\t\t\t.from(users2Table)\n\t\t\t\t.where(eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tcityId: citiesTable.id,\n\t\t\t\t\tcityName: citiesTable.name,\n\t\t\t\t\tuserId: sq.userId,\n\t\t\t\t\tuserName: sq.userName,\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.leftJoinLateral(sq, sql`true`)\n\t\t\t\t.orderBy(citiesTable.id);\n\n\t\t\texpect(res).toStrictEqual([\n\t\t\t\t{ cityId: 1, cityName: 'Paris', userId: 1, userName: 'John' },\n\t\t\t\t{ cityId: 2, cityName: 'London', userId: null, userName: null },\n\t\t\t]);\n\t\t});\n\n\t\ttest('inner join (lateral)', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane' }]);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users2Table.id,\n\t\t\t\t\tuserName: users2Table.name,\n\t\t\t\t\tcityId: users2Table.cityId,\n\t\t\t\t})\n\t\t\t\t.from(users2Table)\n\t\t\t\t.where(eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tcityId: citiesTable.id,\n\t\t\t\t\tcityName: citiesTable.name,\n\t\t\t\t\tuserId: sq.userId,\n\t\t\t\t\tuserName: sq.userName,\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.innerJoinLateral(sq, sql`true`);\n\n\t\t\texpect(res).toStrictEqual([\n\t\t\t\t{ cityId: 1, cityName: 'Paris', userId: 1, userName: 'John' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('cross join (lateral)', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John', cityId: 1 }, { name: 'Jane', cityId: 2 }, {\n\t\t\t\tname: 'Patrick',\n\t\t\t\tcityId: 2,\n\t\t\t}]);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users2Table.id,\n\t\t\t\t\tuserName: users2Table.name,\n\t\t\t\t\tcityId: users2Table.cityId,\n\t\t\t\t})\n\t\t\t\t.from(users2Table)\n\t\t\t\t.where(eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tcityId: citiesTable.id,\n\t\t\t\t\tcityName: citiesTable.name,\n\t\t\t\t\tuserId: sq.userId,\n\t\t\t\t\tuserName: sq.userName,\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.crossJoinLateral(sq)\n\t\t\t\t.orderBy(sq.userId, citiesTable.id);\n\n\t\t\texpect(res).toStrictEqual([\n\t\t\t\t{\n\t\t\t\t\tcityId: 1,\n\t\t\t\t\tcityName: 'Paris',\n\t\t\t\t\tuserId: 1,\n\t\t\t\t\tuserName: 'John',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcityId: 2,\n\t\t\t\t\tcityName: 'London',\n\t\t\t\t\tuserId: 2,\n\t\t\t\t\tuserName: 'Jane',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcityId: 2,\n\t\t\t\t\tcityName: 'London',\n\t\t\t\t\tuserId: 3,\n\t\t\t\t\tuserName: 'Patrick',\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('test $onUpdateFn and $onUpdate works with sql value', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tconst users = singlestoreTable('users', {\n\t\t\t\tid: serial('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tupdatedAt: timestamp('updated_at')\n\t\t\t\t\t.notNull()\n\t\t\t\t\t.$onUpdate(() => sql`current_timestamp`),\n\t\t\t});\n\n\t\t\tawait db.execute(sql`drop table if exists ${users}`);\n\t\t\tawait db.execute(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${users} (\n\t\t\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\t\t\\`updated_at\\` timestamp not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values({\n\t\t\t\tname: 'John',\n\t\t\t});\n\t\t\tconst insertResp = await db.select({ updatedAt: users.updatedAt }).from(users);\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\n\t\t\tconst now = Date.now();\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\t\t\tawait db.update(users).set({\n\t\t\t\tname: 'John',\n\t\t\t});\n\t\t\tconst updateResp = await db.select({ updatedAt: users.updatedAt }).from(users);\n\n\t\t\texpect(insertResp[0]?.updatedAt.getTime() ?? 0).lessThan(now);\n\t\t\texpect(updateResp[0]?.updatedAt.getTime() ?? 0).greaterThan(now);\n\t\t});\n\n\t\ttest('all types', async (ctx) => {\n\t\t\tconst { db } = ctx.singlestore;\n\n\t\t\tawait db.execute(sql`\n\t\t\t\tCREATE TABLE \\`all_types\\` (\n\t\t\t\t\t\t\\`scol\\` serial,\n\t\t\t\t\t\t\\`bigint53\\` bigint,\n\t\t\t\t\t\t\\`bigint64\\` bigint,\n\t\t\t\t\t\t\\`binary\\` binary,\n\t\t\t\t\t\t\\`boolean\\` boolean,\n\t\t\t\t\t\t\\`char\\` char,\n\t\t\t\t\t\t\\`date\\` date,\n\t\t\t\t\t\t\\`date_str\\` date,\n\t\t\t\t\t\t\\`datetime\\` datetime,\n\t\t\t\t\t\t\\`datetime_str\\` datetime,\n\t\t\t\t\t\t\\`decimal\\` decimal,\n\t\t\t\t\t\t\\`decimal_num\\` decimal(30),\n\t\t\t\t\t\t\\`decimal_big\\` decimal(30),\n\t\t\t\t\t\t\\`double\\` double,\n\t\t\t\t\t\t\\`float\\` float,\n\t\t\t\t\t\t\\`int\\` int,\n\t\t\t\t\t\t\\`json\\` json,\n\t\t\t\t\t\t\\`med_int\\` mediumint,\n\t\t\t\t\t\t\\`small_int\\` smallint,\n\t\t\t\t\t\t\\`real\\` real,\n\t\t\t\t\t\t\\`text\\` text,\n\t\t\t\t\t\t\\`time\\` time,\n\t\t\t\t\t\t\\`timestamp\\` timestamp,\n\t\t\t\t\t\t\\`timestamp_str\\` timestamp,\n\t\t\t\t\t\t\\`tiny_int\\` tinyint,\n\t\t\t\t\t\t\\`varbin\\` varbinary(16),\n\t\t\t\t\t\t\\`varchar\\` varchar(255),\n\t\t\t\t\t\t\\`year\\` year,\n\t\t\t\t\t\t\\`enum\\` enum('enV1','enV2'),\n\t\t\t\t\t\tshard key(\\`scol\\`)\n\t\t\t\t\t);\n\t\t\t`);\n\n\t\t\tawait db.insert(allTypesTable).values({\n\t\t\t\tserial: 1,\n\t\t\t\tbigint53: 9007199254740991,\n\t\t\t\tbigint64: 5044565289845416380n,\n\t\t\t\tbinary: '1',\n\t\t\t\tboolean: true,\n\t\t\t\tchar: 'c',\n\t\t\t\tdate: new Date(1741743161623),\n\t\t\t\tdateStr: new Date(1741743161623).toISOString().slice(0, 19).replace('T', ' '),\n\t\t\t\tdatetime: new Date(1741743161623),\n\t\t\t\tdatetimeStr: new Date(1741743161623).toISOString().slice(0, 19).replace('T', ' '),\n\t\t\t\tdecimal: '47521',\n\t\t\t\tdecimalNum: 9007199254740991,\n\t\t\t\tdecimalBig: 5044565289845416380n,\n\t\t\t\tdouble: 15.35325689124218,\n\t\t\t\tenum: 'enV1',\n\t\t\t\tfloat: 1.048596,\n\t\t\t\treal: 1.048596,\n\t\t\t\ttext: 'C4-',\n\t\t\t\tint: 621,\n\t\t\t\tjson: {\n\t\t\t\t\tstr: 'strval',\n\t\t\t\t\tarr: ['str', 10],\n\t\t\t\t},\n\t\t\t\tmedInt: 560,\n\t\t\t\tsmallInt: 14,\n\t\t\t\ttime: '04:13:22',\n\t\t\t\ttimestamp: new Date(1741743161623),\n\t\t\t\ttimestampStr: new Date(1741743161623).toISOString().slice(0, 19).replace('T', ' '),\n\t\t\t\ttinyInt: 7,\n\t\t\t\tvarbin: '1010110101001101',\n\t\t\t\tvarchar: 'VCHAR',\n\t\t\t\tyear: 2025,\n\t\t\t});\n\n\t\t\tconst rawRes = await db.select().from(allTypesTable);\n\n\t\t\ttype ExpectedType = {\n\t\t\t\tserial: number;\n\t\t\t\tbigint53: number | null;\n\t\t\t\tbigint64: bigint | null;\n\t\t\t\tbinary: string | null;\n\t\t\t\tboolean: boolean | null;\n\t\t\t\tchar: string | null;\n\t\t\t\tdate: Date | null;\n\t\t\t\tdateStr: string | null;\n\t\t\t\tdatetime: Date | null;\n\t\t\t\tdatetimeStr: string | null;\n\t\t\t\tdecimal: string | null;\n\t\t\t\tdecimalNum: number | null;\n\t\t\t\tdecimalBig: bigint | null;\n\t\t\t\tdouble: number | null;\n\t\t\t\tfloat: number | null;\n\t\t\t\tint: number | null;\n\t\t\t\tjson: unknown;\n\t\t\t\tmedInt: number | null;\n\t\t\t\tsmallInt: number | null;\n\t\t\t\treal: number | null;\n\t\t\t\ttext: string | null;\n\t\t\t\ttime: string | null;\n\t\t\t\ttimestamp: Date | null;\n\t\t\t\ttimestampStr: string | null;\n\t\t\t\ttinyInt: number | null;\n\t\t\t\tvarbin: string | null;\n\t\t\t\tvarchar: string | null;\n\t\t\t\tyear: number | null;\n\t\t\t\tenum: 'enV1' | 'enV2' | null;\n\t\t\t}[];\n\n\t\t\tconst expectedRes: ExpectedType = [\n\t\t\t\t{\n\t\t\t\t\tserial: 1,\n\t\t\t\t\tbigint53: 9007199254740991,\n\t\t\t\t\tbigint64: 5044565289845416380n,\n\t\t\t\t\tbinary: '1',\n\t\t\t\t\tboolean: true,\n\t\t\t\t\tchar: 'c',\n\t\t\t\t\tdate: new Date('2025-03-12T00:00:00.000Z'),\n\t\t\t\t\tdateStr: '2025-03-12',\n\t\t\t\t\tdatetime: new Date('2025-03-12T01:32:41.000Z'),\n\t\t\t\t\tdatetimeStr: '2025-03-12 01:32:41',\n\t\t\t\t\tdecimal: '47521',\n\t\t\t\t\tdecimalNum: 9007199254740991,\n\t\t\t\t\tdecimalBig: 5044565289845416380n,\n\t\t\t\t\tdouble: 15.35325689124218,\n\t\t\t\t\tfloat: 1.0486,\n\t\t\t\t\tint: 621,\n\t\t\t\t\tjson: { arr: ['str', 10], str: 'strval' },\n\t\t\t\t\tmedInt: 560,\n\t\t\t\t\tsmallInt: 14,\n\t\t\t\t\treal: 1.048596,\n\t\t\t\t\ttext: 'C4-',\n\t\t\t\t\ttime: '04:13:22',\n\t\t\t\t\ttimestamp: new Date('2025-03-12T01:32:41.000Z'),\n\t\t\t\t\ttimestampStr: '2025-03-12 01:32:41',\n\t\t\t\t\ttinyInt: 7,\n\t\t\t\t\tvarbin: '1010110101001101',\n\t\t\t\t\tvarchar: 'VCHAR',\n\t\t\t\t\tyear: 2025,\n\t\t\t\t\tenum: 'enV1',\n\t\t\t\t},\n\t\t\t];\n\n\t\t\texpectTypeOf(rawRes).toEqualTypeOf<ExpectedType>();\n\t\t\texpect(rawRes).toStrictEqual(expectedRes);\n\t\t});\n\t});\n}\n"
  },
  {
    "path": "integration-tests/tests/singlestore/singlestore-custom.test.ts",
    "content": "import retry from 'async-retry';\nimport type Docker from 'dockerode';\nimport { asc, eq, Name, placeholder, sql } from 'drizzle-orm';\nimport type { SingleStoreDriverDatabase } from 'drizzle-orm/singlestore';\nimport { drizzle } from 'drizzle-orm/singlestore';\nimport {\n\talias,\n\tbinary,\n\tcustomType,\n\tdate,\n\tdatetime,\n\tserial,\n\tsinglestoreEnum,\n\tsinglestoreTable,\n\tsinglestoreTableCreator,\n\ttext,\n\ttime,\n\tvarchar,\n\tyear,\n} from 'drizzle-orm/singlestore-core';\nimport { migrate } from 'drizzle-orm/singlestore/migrator';\nimport * as mysql2 from 'mysql2/promise';\nimport { v4 as uuid } from 'uuid';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { toLocalDate } from '~/utils';\nimport { createDockerDB } from './singlestore-common';\n\nconst ENABLE_LOGGING = false;\n\nlet db: SingleStoreDriverDatabase;\nlet client: mysql2.Connection;\nlet container: Docker.Container | undefined;\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['SINGLESTORE_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['SINGLESTORE_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr, container: contrainerObj } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t\tcontainer = contrainerObj;\n\t}\n\tclient = await retry(async () => {\n\t\tclient = await mysql2.createConnection({ uri: connectionString, supportBigNumbers: true });\n\t\tawait client.connect();\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.end();\n\t\t},\n\t});\n\tawait client.query(`CREATE DATABASE IF NOT EXISTS drizzle;`);\n\tawait client.changeUser({ database: 'drizzle' });\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n\tawait container?.stop().catch(console.error);\n});\n\nbeforeEach((ctx) => {\n\tctx.singlestore = {\n\t\tdb,\n\t};\n});\n\nconst customSerial = customType<{ data: number; notNull: true; default: true }>({\n\tdataType() {\n\t\treturn 'serial';\n\t},\n});\n\nconst customText = customType<{ data: string }>({\n\tdataType() {\n\t\treturn 'text';\n\t},\n});\n\nconst customBoolean = customType<{ data: boolean }>({\n\tdataType() {\n\t\treturn 'boolean';\n\t},\n\tfromDriver(value) {\n\t\tif (typeof value === 'boolean') {\n\t\t\treturn value;\n\t\t}\n\t\treturn value === 1;\n\t},\n});\n\nconst customJson = <TData>(name: string) =>\n\tcustomType<{ data: TData; driverData: string }>({\n\t\tdataType() {\n\t\t\treturn 'json';\n\t\t},\n\t\ttoDriver(value: TData): string {\n\t\t\treturn JSON.stringify(value);\n\t\t},\n\t})(name);\n\nconst customTimestamp = customType<\n\t{ data: Date; driverData: string; config: { fsp: number } }\n>({\n\tdataType(config) {\n\t\tconst precision = config?.fsp === undefined ? '' : ` (${config.fsp})`;\n\t\treturn `timestamp${precision}`;\n\t},\n\tfromDriver(value: string): Date {\n\t\treturn new Date(value);\n\t},\n});\n\nconst customBinary = customType<{ data: string; driverData: Buffer; config: { length: number } }>({\n\tdataType(config) {\n\t\treturn config?.length === undefined\n\t\t\t? `binary`\n\t\t\t: `binary(${config.length})`;\n\t},\n\n\ttoDriver(value) {\n\t\treturn sql`UNHEX(${value})`;\n\t},\n\n\tfromDriver(value) {\n\t\treturn value.toString('hex');\n\t},\n});\n\nconst usersTable = singlestoreTable('userstest', {\n\tid: customSerial('id').primaryKey(),\n\tname: customText('name').notNull(),\n\tverified: customBoolean('verified').notNull().default(false),\n\tjsonb: customJson<string[]>('jsonb'),\n\tcreatedAt: customTimestamp('created_at').notNull().default(sql`now()`),\n});\n\nconst datesTable = singlestoreTable('datestable', {\n\tdate: date('date'),\n\tdateAsString: date('date_as_string', { mode: 'string' }),\n\ttime: time('time'),\n\tdatetime: datetime('datetime'),\n\tdatetimeAsString: datetime('datetime_as_string', { mode: 'string' }),\n\tyear: year('year'),\n});\n\nexport const testTable = singlestoreTable('test_table', {\n\tid: customBinary('id', { length: 16 }).primaryKey(),\n\tsqlId: binary('sql_id', { length: 16 }),\n\trawId: varchar('raw_id', { length: 64 }),\n});\n\nconst usersMigratorTable = singlestoreTable('users12', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n});\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop table if exists \\`userstest\\``);\n\tawait db.execute(sql`drop table if exists \\`datestable\\``);\n\tawait db.execute(sql`drop table if exists \\`test_table\\``);\n\t// await ctx.db.execute(sql`create schema public`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table \\`userstest\\` (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`verified\\` boolean not null default false,\n\t\t\t\t\\`jsonb\\` json,\n\t\t\t\t\\`created_at\\` timestamp not null default now()\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table \\`datestable\\` (\n\t\t\t\t\\`date\\` date,\n\t\t\t\t\\`date_as_string\\` date,\n\t\t\t\t\\`time\\` time,\n\t\t\t\t\\`datetime\\` datetime,\n\t\t\t\t\\`datetime_as_string\\` datetime,\n\t\t\t\t\\`year\\` year\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table \\`test_table\\` (\n\t\t\t\t\\`id\\` binary(16) primary key,\n\t\t\t\t\\`sql_id\\` binary(16),\n\t\t\t\t\\`raw_id\\` varchar(64)\n\t\t\t)\n\t\t`,\n\t);\n});\n\ntest('select all fields', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t// not timezone based timestamp, thats why it should not work here\n\t// t.assert(Math.abs(result[0]!.createdAt.getTime() - now) < 2000);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('select sql', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql`upper(${usersTable.name})`,\n\t}).from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('select typed sql', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql<string>`upper(${usersTable.name})`,\n\t}).from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('insert returning sql', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tconst [result, _] = await db.insert(usersTable).values({ id: 1, name: 'John' });\n\n\texpect(result.insertId).toBe(1);\n});\n\ntest('delete returning sql', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\texpect(users[0].affectedRows).toBe(1);\n});\n\ntest('update returning sql', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\texpect(users[0].changedRows).toBe(1);\n});\n\ntest('update with returning all fields', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\tconst updatedUsers = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\tconst users = await db.select().from(usersTable).where(eq(usersTable.id, 1));\n\n\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t// not timezone based timestamp, thats why it should not work here\n\t// t.assert(Math.abs(users[0]!.createdAt.getTime() - now) < 2000);\n\texpect(users).toEqual([{ id: 1, name: 'Jane', verified: false, jsonb: null, createdAt: users[0]!.createdAt }]);\n});\n\ntest('update with returning partial', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\tconst updatedUsers = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\tconst users = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n});\n\ntest('delete with returning all fields', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst deletedUser = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\texpect(deletedUser[0].affectedRows).toBe(1);\n});\n\ntest('delete with returning partial', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst deletedUser = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\texpect(deletedUser[0].affectedRows).toBe(1);\n});\n\ntest('insert + select', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\n\tawait db.insert(usersTable).values({ id: 2, name: 'Jane' });\n\tconst result2 = await db.select().from(usersTable).orderBy(asc(usersTable.id));\n\texpect(result2).toEqual([\n\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result2[0]!.createdAt },\n\t\t{ id: 2, name: 'Jane', verified: false, jsonb: null, createdAt: result2[1]!.createdAt },\n\t]);\n});\n\ntest('json insert', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ id: 1, name: 'John', jsonb: ['foo', 'bar'] });\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tjsonb: usersTable.jsonb,\n\t}).from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', jsonb: ['foo', 'bar'] }]);\n});\n\ntest('insert with overridden default values', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ id: 1, name: 'John', verified: true });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: true, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('insert many', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'John' },\n\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t{ id: 3, name: 'Jane' },\n\t\t{ id: 4, name: 'Austin', verified: true },\n\t]);\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tjsonb: usersTable.jsonb,\n\t\tverified: usersTable.verified,\n\t}).from(usersTable).orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t]);\n});\n\ntest('insert many with returning', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tconst result = await db.insert(usersTable).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Austin', verified: true },\n\t]);\n\n\texpect(result[0].affectedRows).toBe(4);\n});\n\ntest('select with group by as field', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.name).orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n});\n\ntest('select with group by as sql', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`).orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n});\n\ntest('select with group by as sql + column', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`, usersTable.id).orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n});\n\ntest('select with group by as column + sql', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`).orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n});\n\ntest('select with group by complex query', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t.orderBy(asc(usersTable.name))\n\t\t.limit(1);\n\n\texpect(result).toEqual([{ name: 'Jane' }]);\n});\n\ntest('build query', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tconst query = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, usersTable.name)\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql: `select \\`id\\`, \\`name\\` from \\`userstest\\` group by \\`userstest\\`.\\`id\\`, \\`userstest\\`.\\`name\\``,\n\t\tparams: [],\n\t});\n});\n\ntest('build query insert with onDuplicate', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tconst query = db.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onDuplicateKeyUpdate({ set: { name: 'John1' } })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql:\n\t\t\t'insert into `userstest` (`id`, `name`, `verified`, `jsonb`, `created_at`) values (default, ?, default, ?, default) on duplicate key update `name` = ?',\n\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t});\n});\n\ntest('insert with onDuplicate', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' });\n\n\tawait db.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' })\n\t\t.onDuplicateKeyUpdate({ set: { name: 'John1' } });\n\n\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(res).toEqual([{ id: 1, name: 'John1' }]);\n});\n\ntest('insert conflict', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' });\n\n\tawait expect((async () => {\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John1' });\n\t})()).resolves.not.toThrowError();\n});\n\ntest('insert conflict with ignore', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' });\n\n\tawait db.insert(usersTable)\n\t\t.ignore()\n\t\t.values({ id: 1, name: 'John1' });\n\n\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert sql', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ id: 1, name: sql`${'John'}` });\n\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('partial join with alias', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\tconst customerAlias = alias(usersTable, 'customer');\n\n\tawait db.insert(usersTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select({\n\t\t\tuser: {\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t},\n\t\t\tcustomer: {\n\t\t\t\tid: customerAlias.id,\n\t\t\t\tname: customerAlias.name,\n\t\t\t},\n\t\t}).from(usersTable)\n\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t.where(eq(usersTable.id, 10))\n\t\t.orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([{\n\t\tuser: { id: 10, name: 'Ivan' },\n\t\tcustomer: { id: 11, name: 'Hans' },\n\t}]);\n});\n\ntest('full join with alias', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tconst singlestoreTable = singlestoreTableCreator((name) => `prefixed_${name}`);\n\n\tconst users = singlestoreTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\tconst customers = alias(users, 'customer');\n\n\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select().from(users)\n\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t.where(eq(users.id, 10))\n\t\t.orderBy(asc(users.id));\n\n\texpect(result).toEqual([{\n\t\tusers: {\n\t\t\tid: 10,\n\t\t\tname: 'Ivan',\n\t\t},\n\t\tcustomer: {\n\t\t\tid: 11,\n\t\t\tname: 'Hans',\n\t\t},\n\t}]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('select from alias', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tconst singlestoreTable = singlestoreTableCreator((name) => `prefixed_${name}`);\n\n\tconst users = singlestoreTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\tconst user = alias(users, 'user');\n\tconst customers = alias(users, 'customer');\n\n\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select()\n\t\t.from(user)\n\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t.where(eq(user.id, 10))\n\t\t.orderBy(asc(user.id));\n\n\texpect(result).toEqual([{\n\t\tuser: {\n\t\t\tid: 10,\n\t\t\tname: 'Ivan',\n\t\t},\n\t\tcustomer: {\n\t\t\tid: 11,\n\t\t\tname: 'Hans',\n\t\t},\n\t}]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('insert with spaces', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ id: 1, name: sql`'Jo   h     n'` });\n\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n});\n\ntest('prepared statement', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\tconst statement = db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t}).from(usersTable)\n\t\t.prepare();\n\tconst result = await statement.execute();\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('prepared statement reuse', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tconst stmt = db.insert(usersTable).values({\n\t\tid: placeholder('id'),\n\t\tverified: true,\n\t\tname: placeholder('name'),\n\t}).prepare();\n\n\tfor (let i = 0; i < 10; i++) {\n\t\tawait stmt.execute({ id: i + 1, name: `John ${i}` });\n\t}\n\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tverified: usersTable.verified,\n\t}).from(usersTable).orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John 0', verified: true },\n\t\t{ id: 2, name: 'John 1', verified: true },\n\t\t{ id: 3, name: 'John 2', verified: true },\n\t\t{ id: 4, name: 'John 3', verified: true },\n\t\t{ id: 5, name: 'John 4', verified: true },\n\t\t{ id: 6, name: 'John 5', verified: true },\n\t\t{ id: 7, name: 'John 6', verified: true },\n\t\t{ id: 8, name: 'John 7', verified: true },\n\t\t{ id: 9, name: 'John 8', verified: true },\n\t\t{ id: 10, name: 'John 9', verified: true },\n\t]);\n});\n\ntest('prepared statement with placeholder in .where', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\tconst stmt = db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t}).from(usersTable)\n\t\t.where(eq(usersTable.id, placeholder('id')))\n\t\t.prepare();\n\tconst result = await stmt.execute({ id: 1 });\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('migrator', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.execute(sql`drop table if exists cities_migration`);\n\tawait db.execute(sql`drop table if exists users_migration`);\n\tawait db.execute(sql`drop table if exists users12`);\n\tawait db.execute(sql`drop table if exists __drizzle_migrations`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/singlestore' });\n\n\tawait db.insert(usersMigratorTable).values({ id: 1, name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql`drop table cities_migration`);\n\tawait db.execute(sql`drop table users_migration`);\n\tawait db.execute(sql`drop table users12`);\n\tawait db.execute(sql`drop table __drizzle_migrations`);\n});\n\ntest('insert via db.execute + select via db.execute', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.execute(\n\t\tsql`insert into ${usersTable} (${new Name(usersTable.id.name)}, ${new Name(\n\t\t\tusersTable.name.name,\n\t\t)}) values (1,${'John'})`,\n\t);\n\n\tconst result = await db.execute<{ id: number; name: string }>(sql`select id, name from ${usersTable}`);\n\texpect(result[0]).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tconst inserted = await db.execute(\n\t\tdb.insert(usersTable).values({ name: 'John' }),\n\t);\n\texpect(inserted[0].affectedRows).toBe(1);\n});\n\ntest('insert + select all possible dates', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tconst date = new Date('2022-11-11');\n\n\tawait db.insert(datesTable).values({\n\t\tdate: date,\n\t\tdateAsString: '2022-11-11',\n\t\ttime: '12:12:12',\n\t\tdatetime: date,\n\t\tyear: 22,\n\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t});\n\n\tconst res = await db.select().from(datesTable);\n\n\texpect(res[0]?.date).toBeInstanceOf(Date);\n\texpect(res[0]?.datetime).toBeInstanceOf(Date);\n\texpect(res[0]?.dateAsString).toBeTypeOf('string');\n\texpect(res[0]?.datetimeAsString).toBeTypeOf('string');\n\n\texpect(res).toEqual([{\n\t\tdate: toLocalDate(new Date('2022-11-11')),\n\t\tdateAsString: '2022-11-11',\n\t\ttime: '12:12:12',\n\t\tdatetime: new Date('2022-11-11'),\n\t\tyear: 2022,\n\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t}]);\n});\n\nconst tableWithEnums = singlestoreTable('enums_test_case', {\n\tid: serial('id').primaryKey(),\n\tenum1: singlestoreEnum('enum1', ['a', 'b', 'c']).notNull(),\n\tenum2: singlestoreEnum('enum2', ['a', 'b', 'c']).default('a'),\n\tenum3: singlestoreEnum('enum3', ['a', 'b', 'c']).notNull().default('b'),\n});\n\ntest('SingleStore enum test case #1', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tawait db.execute(sql`drop table if exists \\`enums_test_case\\``);\n\n\tawait db.execute(sql`\n\t\tcreate table \\`enums_test_case\\` (\n\t\t\t\\`id\\` serial primary key,\n\t\t\t\\`enum1\\` ENUM('a', 'b', 'c') not null,\n\t\t\t\\`enum2\\` ENUM('a', 'b', 'c') default 'a',\n\t\t\t\\`enum3\\` ENUM('a', 'b', 'c') not null default 'b'\n\t\t)\n\t`);\n\n\tawait db.insert(tableWithEnums).values([\n\t\t{ id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n\t\t{ id: 2, enum1: 'a', enum3: 'c' },\n\t\t{ id: 3, enum1: 'a' },\n\t]);\n\n\tconst res = await db.select().from(tableWithEnums).orderBy(asc(tableWithEnums.id));\n\n\tawait db.execute(sql`drop table \\`enums_test_case\\``);\n\n\texpect(res).toEqual([\n\t\t{ id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n\t\t{ id: 2, enum1: 'a', enum2: 'a', enum3: 'c' },\n\t\t{ id: 3, enum1: 'a', enum2: 'a', enum3: 'b' },\n\t]);\n});\n\ntest('custom binary', async (ctx) => {\n\tconst { db } = ctx.singlestore;\n\n\tconst id = uuid().replace(/-/g, '');\n\tawait db.insert(testTable).values({\n\t\tid,\n\t\tsqlId: sql`UNHEX(${id})`,\n\t\trawId: id,\n\t});\n\n\tconst res = await db.select().from(testTable);\n\n\texpect(res).toEqual([{\n\t\tid,\n\t\tsqlId: Buffer.from(id, 'hex').toString(),\n\t\trawId: id,\n\t}]);\n});\n"
  },
  {
    "path": "integration-tests/tests/singlestore/singlestore-prefixed.test.ts",
    "content": "import retry from 'async-retry';\nimport type Docker from 'dockerode';\nimport type { Equal } from 'drizzle-orm';\nimport { asc, eq, getTableName, gt, inArray, Name, sql, TransactionRollbackError } from 'drizzle-orm';\nimport type { SingleStoreDriverDatabase } from 'drizzle-orm/singlestore';\nimport { drizzle } from 'drizzle-orm/singlestore';\nimport {\n\talias,\n\tboolean,\n\tdate,\n\tdatetime,\n\tint,\n\tjson,\n\tserial,\n\tsinglestoreEnum,\n\tsinglestoreTable as singlestoreTableRaw,\n\tsinglestoreTableCreator,\n\t/* singlestoreView, */\n\ttext,\n\ttime,\n\ttimestamp,\n\tuniqueIndex,\n\tyear,\n} from 'drizzle-orm/singlestore-core';\nimport { migrate } from 'drizzle-orm/singlestore/migrator';\nimport * as mysql2 from 'mysql2/promise';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { Expect, toLocalDate } from '~/utils';\nimport { createDockerDB } from './singlestore-common';\n\nconst ENABLE_LOGGING = false;\n\nlet db: SingleStoreDriverDatabase;\nlet client: mysql2.Connection;\nlet container: Docker.Container | undefined;\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['SINGLESTORE_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['SINGLESTORE_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr, container: contrainerObj } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t\tcontainer = contrainerObj;\n\t}\n\tclient = await retry(async () => {\n\t\tclient = await mysql2.createConnection({ uri: connectionString, supportBigNumbers: true });\n\t\tawait client.connect();\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.end();\n\t\t},\n\t});\n\n\tawait client.query(`CREATE DATABASE IF NOT EXISTS drizzle;`);\n\tawait client.changeUser({ database: 'drizzle' });\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n\tawait container?.stop().catch(console.error);\n});\n\nconst tablePrefix = 'drizzle_tests_';\n\nconst singlestoreTable = singlestoreTableCreator((name) => `${tablePrefix}${name}`);\nconst usersTable = singlestoreTable('userstest', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json('jsonb').$type<string[]>(),\n\tcreatedAt: timestamp('created_at').notNull().defaultNow(),\n});\n\nconst users2Table = singlestoreTable('users2', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: int('city_id'),\n});\n\nconst citiesTable = singlestoreTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nbeforeEach(async () => {\n\tawait db.execute(sql`drop table if exists ${usersTable}`);\n\tawait db.execute(sql`drop table if exists ${users2Table}`);\n\tawait db.execute(sql`drop table if exists ${citiesTable}`);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${usersTable} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`verified\\` boolean not null default false,\n\t\t\t\t\\`jsonb\\` json,\n\t\t\t\t\\`created_at\\` timestamp not null default now()\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${users2Table} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`city_id\\` int\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${citiesTable} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null\n\t\t\t)\n\t\t`,\n\t);\n});\n\ntest('select all fields', async () => {\n\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t// not timezone based timestamp, thats why it should not work here\n\t// t.assert(Math.abs(result[0]!.createdAt.getTime() - now) < 2000);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('select sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql`upper(${usersTable.name})`,\n\t}).from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('select typed sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.select({\n\t\tname: sql<string>`upper(${usersTable.name})`,\n\t}).from(usersTable);\n\n\texpect(users).toEqual([{ name: 'JOHN' }]);\n});\n\ntest('select distinct', async () => {\n\tconst usersDistinctTable = singlestoreTable('users_distinct', {\n\t\tid: int('id').notNull(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${usersDistinctTable}`);\n\tawait db.execute(sql`create table ${usersDistinctTable} (id int, name text)`);\n\n\tawait db.insert(usersDistinctTable).values([\n\t\t{ id: 1, name: 'John' },\n\t\t{ id: 1, name: 'John' },\n\t\t{ id: 2, name: 'John' },\n\t\t{ id: 1, name: 'Jane' },\n\t]);\n\tconst users = await db.selectDistinct().from(usersDistinctTable).orderBy(\n\t\tusersDistinctTable.id,\n\t\tusersDistinctTable.name,\n\t);\n\n\tawait db.execute(sql`drop table ${usersDistinctTable}`);\n\n\texpect(users).toEqual([{ id: 1, name: 'Jane' }, { id: 1, name: 'John' }, { id: 2, name: 'John' }]);\n});\n\ntest('insert returning sql', async () => {\n\tconst [result, _] = await db.insert(usersTable).values({ id: 1, name: 'John' });\n\n\texpect(result.insertId).toBe(1);\n});\n\ntest('delete returning sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\texpect(users[0].affectedRows).toBe(1);\n});\n\ntest('update returning sql', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\texpect(users[0].changedRows).toBe(1);\n});\n\ntest('update with returning all fields', async () => {\n\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\tconst updatedUsers = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\tconst users = await db.select().from(usersTable).where(eq(usersTable.id, 1));\n\n\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t// not timezone based timestamp, thats why it should not work here\n\t// t.assert(Math.abs(users[0]!.createdAt.getTime() - now) < 2000);\n\texpect(users).toEqual([{ id: 1, name: 'Jane', verified: false, jsonb: null, createdAt: users[0]!.createdAt }]);\n});\n\ntest('update with returning partial', async () => {\n\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\tconst updatedUsers = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John'));\n\n\tconst users = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(updatedUsers[0].changedRows).toBe(1);\n\n\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n});\n\ntest('delete with returning all fields', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst deletedUser = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\texpect(deletedUser[0].affectedRows).toBe(1);\n});\n\ntest('delete with returning partial', async () => {\n\tawait db.insert(usersTable).values({ name: 'John' });\n\tconst deletedUser = await db.delete(usersTable).where(eq(usersTable.name, 'John'));\n\n\texpect(deletedUser[0].affectedRows).toBe(1);\n});\n\ntest('insert + select', async () => {\n\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\tconst result = await db.select().from(usersTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result[0]!.createdAt }]);\n\n\tawait db.insert(usersTable).values({ id: 2, name: 'Jane' });\n\tconst result2 = await db.select().from(usersTable).orderBy(asc(usersTable.id));\n\texpect(result2).toEqual([\n\t\t{ id: 1, name: 'John', verified: false, jsonb: null, createdAt: result2[0]!.createdAt },\n\t\t{ id: 2, name: 'Jane', verified: false, jsonb: null, createdAt: result2[1]!.createdAt },\n\t]);\n});\n\ntest('json insert', async () => {\n\tawait db.insert(usersTable).values({ id: 1, name: 'John', jsonb: ['foo', 'bar'] });\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tjsonb: usersTable.jsonb,\n\t}).from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', jsonb: ['foo', 'bar'] }]);\n});\n\ntest('insert with overridden default values', async () => {\n\tawait db.insert(usersTable).values({ id: 1, name: 'John', verified: true });\n\tconst result = await db.select().from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', verified: true, jsonb: null, createdAt: result[0]!.createdAt }]);\n});\n\ntest('insert many', async () => {\n\tawait db.insert(usersTable).values([\n\t\t{ id: 1, name: 'John' },\n\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t{ id: 3, name: 'Jane' },\n\t\t{ id: 4, name: 'Austin', verified: true },\n\t]);\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tjsonb: usersTable.jsonb,\n\t\tverified: usersTable.verified,\n\t}).from(usersTable)\n\t\t.orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', jsonb: null, verified: false },\n\t\t{ id: 2, name: 'Bruce', jsonb: ['foo', 'bar'], verified: false },\n\t\t{ id: 3, name: 'Jane', jsonb: null, verified: false },\n\t\t{ id: 4, name: 'Austin', jsonb: null, verified: true },\n\t]);\n});\n\ntest('insert many with returning', async () => {\n\tconst result = await db.insert(usersTable).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Bruce', jsonb: ['foo', 'bar'] },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Austin', verified: true },\n\t]);\n\n\texpect(result[0].affectedRows).toBe(4);\n});\n\ntest('select with group by as field', async () => {\n\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.name)\n\t\t.orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n});\n\ntest('select with group by as sql', async () => {\n\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`)\n\t\t.orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }]);\n});\n\ntest('select with group by as sql + column', async () => {\n\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(sql`${usersTable.name}`, usersTable.id)\n\t\t.orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n});\n\ntest('select with group by as column + sql', async () => {\n\tawait db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t.orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n});\n\ntest('select with group by complex query', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\n\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t.orderBy(asc(usersTable.name))\n\t\t.limit(1);\n\n\texpect(result).toEqual([{ name: 'Jane' }]);\n});\n\ntest('build query', async () => {\n\tconst query = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable)\n\t\t.groupBy(usersTable.id, usersTable.name)\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql: `select \\`id\\`, \\`name\\` from \\`${getTableName(usersTable)}\\` group by \\`${\n\t\t\tgetTableName(usersTable)\n\t\t}\\`.\\`id\\`, \\`${getTableName(usersTable)}\\`.\\`name\\``,\n\t\tparams: [],\n\t});\n});\n\ntest('build query insert with onDuplicate', async () => {\n\tconst query = db.insert(usersTable)\n\t\t.values({ name: 'John', jsonb: ['foo', 'bar'] })\n\t\t.onDuplicateKeyUpdate({ set: { name: 'John1' } })\n\t\t.toSQL();\n\n\texpect(query).toEqual({\n\t\tsql: `insert into \\`${\n\t\t\tgetTableName(usersTable)\n\t\t}\\` (\\`id\\`, \\`name\\`, \\`verified\\`, \\`jsonb\\`, \\`created_at\\`) values (default, ?, default, ?, default) on duplicate key update \\`name\\` = ?`,\n\t\tparams: ['John', '[\"foo\",\"bar\"]', 'John1'],\n\t});\n});\n\ntest('insert with onDuplicate', async () => {\n\tawait db.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' });\n\n\tawait db.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' })\n\t\t.onDuplicateKeyUpdate({ set: { name: 'John1' } });\n\n\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(res).toEqual([{ id: 1, name: 'John1' }]);\n});\n\ntest('insert conflict', async () => {\n\tawait db.insert(usersTable)\n\t\t.values({ name: 'John' });\n\n\tawait expect((async () => {\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John1' });\n\t})()).resolves.not.toThrowError();\n});\n\ntest('insert conflict with ignore', async () => {\n\tawait db.insert(usersTable)\n\t\t.values({ id: 1, name: 'John' });\n\n\tawait db.insert(usersTable)\n\t\t.ignore()\n\t\t.values({ id: 1, name: 'John1' });\n\n\tconst res = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\teq(usersTable.id, 1),\n\t);\n\n\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert sql', async () => {\n\tawait db.insert(usersTable).values({ id: 1, name: sql`${'John'}` });\n\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('partial join with alias', async () => {\n\tconst customerAlias = alias(usersTable, 'customer');\n\n\tawait db.insert(usersTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select({\n\t\t\tuser: {\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t},\n\t\t\tcustomer: {\n\t\t\t\tid: customerAlias.id,\n\t\t\t\tname: customerAlias.name,\n\t\t\t},\n\t\t}).from(usersTable)\n\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t.where(eq(usersTable.id, 10))\n\t\t.orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([{\n\t\tuser: { id: 10, name: 'Ivan' },\n\t\tcustomer: { id: 11, name: 'Hans' },\n\t}]);\n});\n\ntest('full join with alias', async () => {\n\tconst singlestoreTable = singlestoreTableCreator((name) => `prefixed_${name}`);\n\n\tconst users = singlestoreTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\tconst customers = alias(users, 'customer');\n\n\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select().from(users)\n\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t.where(eq(users.id, 10))\n\t\t.orderBy(asc(users.id));\n\n\texpect(result).toEqual([{\n\t\tusers: {\n\t\t\tid: 10,\n\t\t\tname: 'Ivan',\n\t\t},\n\t\tcustomer: {\n\t\t\tid: 11,\n\t\t\tname: 'Hans',\n\t\t},\n\t}]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('select from alias', async () => {\n\tconst singlestoreTable = singlestoreTableCreator((name) => `prefixed_${name}`);\n\n\tconst users = singlestoreTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial primary key, name text not null)`);\n\n\tconst user = alias(users, 'user');\n\tconst customers = alias(users, 'customer');\n\n\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\tconst result = await db\n\t\t.select()\n\t\t.from(user)\n\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t.where(eq(user.id, 10))\n\t\t.orderBy(asc(user.id));\n\n\texpect(result).toEqual([{\n\t\tuser: {\n\t\t\tid: 10,\n\t\t\tname: 'Ivan',\n\t\t},\n\t\tcustomer: {\n\t\t\tid: 11,\n\t\t\tname: 'Hans',\n\t\t},\n\t}]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('insert with spaces', async () => {\n\tawait db.insert(usersTable).values({ id: 1, name: sql`'Jo   h     n'` });\n\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n});\n\ntest('prepared statement', async () => {\n\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\tconst statement = db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t}).from(usersTable)\n\t\t.prepare();\n\tconst result = await statement.execute();\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('prepared statement reuse', async () => {\n\tconst stmt = db.insert(usersTable).values({\n\t\tverified: true,\n\t\tid: sql.placeholder('id'),\n\t\tname: sql.placeholder('name'),\n\t}).prepare();\n\n\tfor (let i = 0; i < 10; i++) {\n\t\tawait stmt.execute({ id: i + 1, name: `John ${i}` });\n\t}\n\n\tconst result = await db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t\tverified: usersTable.verified,\n\t}).from(usersTable)\n\t\t.orderBy(asc(usersTable.id));\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John 0', verified: true },\n\t\t{ id: 2, name: 'John 1', verified: true },\n\t\t{ id: 3, name: 'John 2', verified: true },\n\t\t{ id: 4, name: 'John 3', verified: true },\n\t\t{ id: 5, name: 'John 4', verified: true },\n\t\t{ id: 6, name: 'John 5', verified: true },\n\t\t{ id: 7, name: 'John 6', verified: true },\n\t\t{ id: 8, name: 'John 7', verified: true },\n\t\t{ id: 9, name: 'John 8', verified: true },\n\t\t{ id: 10, name: 'John 9', verified: true },\n\t]);\n});\n\ntest('prepared statement with placeholder in .where', async () => {\n\tawait db.insert(usersTable).values({ id: 1, name: 'John' });\n\tconst stmt = db.select({\n\t\tid: usersTable.id,\n\t\tname: usersTable.name,\n\t}).from(usersTable)\n\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t.prepare();\n\tconst result = await stmt.execute({ id: 1 });\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('migrator', async () => {\n\tconst usersMigratorTable = singlestoreTableRaw('users12', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\temail: text('email').notNull(),\n\t}, (table) => {\n\t\treturn {\n\t\t\tname: uniqueIndex('').on(table.name).using('btree'),\n\t\t};\n\t});\n\n\tawait db.execute(sql.raw(`drop table if exists cities_migration`));\n\tawait db.execute(sql.raw(`drop table if exists users_migration`));\n\tawait db.execute(sql.raw(`drop table if exists users12`));\n\tawait db.execute(sql.raw(`drop table if exists __drizzle_migrations`));\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/singlestore' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\n\tconst result = await db.select().from(usersMigratorTable);\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.execute(sql.raw(`drop table cities_migration`));\n\tawait db.execute(sql.raw(`drop table users_migration`));\n\tawait db.execute(sql.raw(`drop table users12`));\n\tawait db.execute(sql.raw(`drop table __drizzle_migrations`));\n});\n\ntest('insert via db.execute + select via db.execute', async () => {\n\tawait db.execute(\n\t\tsql`insert into ${usersTable} (${new Name(usersTable.id.name)}, ${new Name(\n\t\t\tusersTable.name.name,\n\t\t)}) values (1, ${'John'})`,\n\t);\n\n\tconst result = await db.execute<{ id: number; name: string }>(sql`select id, name from ${usersTable}`);\n\texpect(result[0]).toEqual([{ id: 1, name: 'John' }]);\n});\n\ntest('insert via db.execute w/ query builder', async () => {\n\tconst inserted = await db.execute(\n\t\tdb.insert(usersTable).values({ name: 'John' }),\n\t);\n\texpect(inserted[0].affectedRows).toBe(1);\n});\n\ntest('insert + select all possible dates', async () => {\n\tconst datesTable = singlestoreTable('datestable', {\n\t\tdate: date('date'),\n\t\tdateAsString: date('date_as_string', { mode: 'string' }),\n\t\ttime: time('time'),\n\t\tdatetime: datetime('datetime'),\n\t\tdatetimeAsString: datetime('datetime_as_string', { mode: 'string' }),\n\t\tyear: year('year'),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${datesTable}`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${datesTable} (\n\t\t\t\t\\`date\\` date,\n\t\t\t\t\\`date_as_string\\` date,\n\t\t\t\t\\`time\\` time,\n\t\t\t\t\\`datetime\\` datetime,\n\t\t\t\t\\`datetime_as_string\\` datetime,\n\t\t\t\t\\`year\\` year\n\t\t\t)\n\t\t`,\n\t);\n\n\tconst d = new Date('2022-11-11');\n\n\tawait db.insert(datesTable).values({\n\t\tdate: d,\n\t\tdateAsString: '2022-11-11',\n\t\ttime: '12:12:12',\n\t\tdatetime: d,\n\t\tyear: 22,\n\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t});\n\n\tconst res = await db.select().from(datesTable);\n\n\texpect(res[0]?.date).toBeInstanceOf(Date);\n\texpect(res[0]?.datetime).toBeInstanceOf(Date);\n\texpect(typeof res[0]?.dateAsString).toBe('string');\n\texpect(typeof res[0]?.datetimeAsString).toBe('string');\n\n\texpect(res).toEqual([{\n\t\tdate: toLocalDate(new Date('2022-11-11')),\n\t\tdateAsString: '2022-11-11',\n\t\ttime: '12:12:12',\n\t\tdatetime: new Date('2022-11-11'),\n\t\tyear: 2022,\n\t\tdatetimeAsString: '2022-11-11 12:12:12',\n\t}]);\n\n\tawait db.execute(sql`drop table ${datesTable}`);\n});\n\ntest('SingleStore enum test case #1', async () => {\n\tconst tableWithEnums = singlestoreTable('enums_test_case', {\n\t\tid: serial('id').primaryKey(),\n\t\tenum1: singlestoreEnum('enum1', ['a', 'b', 'c']).notNull(),\n\t\tenum2: singlestoreEnum('enum2', ['a', 'b', 'c']).default('a'),\n\t\tenum3: singlestoreEnum('enum3', ['a', 'b', 'c']).notNull().default('b'),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${tableWithEnums}`);\n\n\tawait db.execute(sql`\n\t\tcreate table ${tableWithEnums} (\n\t\t\t\\`id\\` serial primary key,\n\t\t\t\\`enum1\\` ENUM('a', 'b', 'c') not null,\n\t\t\t\\`enum2\\` ENUM('a', 'b', 'c') default 'a',\n\t\t\t\\`enum3\\` ENUM('a', 'b', 'c') not null default 'b'\n\t\t)\n\t`);\n\n\tawait db.insert(tableWithEnums).values([\n\t\t{ id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n\t\t{ id: 2, enum1: 'a', enum3: 'c' },\n\t\t{ id: 3, enum1: 'a' },\n\t]);\n\n\tconst res = await db.select().from(tableWithEnums).orderBy(asc(tableWithEnums.id));\n\n\tawait db.execute(sql`drop table ${tableWithEnums}`);\n\n\texpect(res).toEqual([\n\t\t{ id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },\n\t\t{ id: 2, enum1: 'a', enum2: 'a', enum3: 'c' },\n\t\t{ id: 3, enum1: 'a', enum2: 'a', enum3: 'b' },\n\t]);\n});\n\ntest('left join (flat object fields)', async () => {\n\tawait db.insert(citiesTable)\n\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }]);\n\n\tawait db.insert(users2Table).values([{ id: 1, name: 'John', cityId: 1 }, { id: 2, name: 'Jane' }]);\n\n\tconst res = await db.select({\n\t\tuserId: users2Table.id,\n\t\tuserName: users2Table.name,\n\t\tcityId: citiesTable.id,\n\t\tcityName: citiesTable.name,\n\t}).from(users2Table)\n\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id))\n\t\t.orderBy(asc(users2Table.id));\n\n\texpect(res).toEqual([\n\t\t{ userId: 1, userName: 'John', cityId: 1, cityName: 'Paris' },\n\t\t{ userId: 2, userName: 'Jane', cityId: null, cityName: null },\n\t]);\n});\n\ntest('left join (grouped fields)', async () => {\n\tawait db.insert(citiesTable)\n\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }]);\n\n\tawait db.insert(users2Table).values([{ id: 1, name: 'John', cityId: 1 }, { id: 2, name: 'Jane' }]);\n\n\tconst res = await db.select({\n\t\tid: users2Table.id,\n\t\tuser: {\n\t\t\tname: users2Table.name,\n\t\t\tnameUpper: sql<string>`upper(${users2Table.name})`,\n\t\t},\n\t\tcity: {\n\t\t\tid: citiesTable.id,\n\t\t\tname: citiesTable.name,\n\t\t\tnameUpper: sql<string>`upper(${citiesTable.name})`,\n\t\t},\n\t}).from(users2Table)\n\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id))\n\t\t.orderBy(asc(users2Table.id));\n\n\texpect(res).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\tuser: { name: 'John', nameUpper: 'JOHN' },\n\t\t\tcity: { id: 1, name: 'Paris', nameUpper: 'PARIS' },\n\t\t},\n\t\t{\n\t\t\tid: 2,\n\t\t\tuser: { name: 'Jane', nameUpper: 'JANE' },\n\t\t\tcity: null,\n\t\t},\n\t]);\n});\n\ntest('left join (all fields)', async () => {\n\tawait db.insert(citiesTable)\n\t\t.values([{ id: 1, name: 'Paris' }, { id: 2, name: 'London' }]);\n\n\tawait db.insert(users2Table).values([{ id: 1, name: 'John', cityId: 1 }, { id: 2, name: 'Jane' }]);\n\n\tconst res = await db.select().from(users2Table)\n\t\t.leftJoin(citiesTable, eq(users2Table.cityId, citiesTable.id))\n\t\t.orderBy(asc(users2Table.id));\n\n\texpect(res).toEqual([\n\t\t{\n\t\t\tusers2: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tcityId: 1,\n\t\t\t},\n\t\t\tcities: {\n\t\t\t\tid: 1,\n\t\t\t\tname: 'Paris',\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tusers2: {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'Jane',\n\t\t\t\tcityId: null,\n\t\t\t},\n\t\t\tcities: null,\n\t\t},\n\t]);\n});\n\ntest('join subquery', async () => {\n\tconst coursesTable = singlestoreTable('courses', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcategoryId: int('category_id'),\n\t});\n\n\tconst courseCategoriesTable = singlestoreTable('course_categories', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${coursesTable}`);\n\tawait db.execute(sql`drop table if exists ${courseCategoriesTable}`);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${courseCategoriesTable} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${coursesTable} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`category_id\\` int\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.insert(courseCategoriesTable).values([\n\t\t{ id: 1, name: 'Category 1' },\n\t\t{ id: 2, name: 'Category 2' },\n\t\t{ id: 3, name: 'Category 3' },\n\t\t{ id: 4, name: 'Category 4' },\n\t]);\n\n\tawait db.insert(coursesTable).values([\n\t\t{ id: 1, name: 'Development', categoryId: 2 },\n\t\t{ id: 2, name: 'IT & Software', categoryId: 3 },\n\t\t{ id: 3, name: 'Marketing', categoryId: 4 },\n\t\t{ id: 4, name: 'Design', categoryId: 1 },\n\t]);\n\n\tconst sq2 = db\n\t\t.select({\n\t\t\tcategoryId: courseCategoriesTable.id,\n\t\t\tcategory: courseCategoriesTable.name,\n\t\t\ttotal: sql<number>`count(${courseCategoriesTable.id})`,\n\t\t})\n\t\t.from(courseCategoriesTable)\n\t\t.groupBy(courseCategoriesTable.id, courseCategoriesTable.name)\n\t\t.orderBy(courseCategoriesTable.id)\n\t\t.as('sq2');\n\n\tconst res = await db\n\t\t.select({\n\t\t\tcourseName: coursesTable.name,\n\t\t\tcategoryId: sq2.categoryId,\n\t\t})\n\t\t.from(coursesTable)\n\t\t.leftJoin(sq2, eq(coursesTable.categoryId, sq2.categoryId))\n\t\t.orderBy(coursesTable.name);\n\n\tawait db.execute(sql`drop table ${coursesTable}`);\n\tawait db.execute(sql`drop table ${courseCategoriesTable}`);\n\n\texpect(res).toEqual([\n\t\t{ courseName: 'Design', categoryId: 1 },\n\t\t{ courseName: 'Development', categoryId: 2 },\n\t\t{ courseName: 'IT & Software', categoryId: 3 },\n\t\t{ courseName: 'Marketing', categoryId: 4 },\n\t]);\n});\n\ntest('with ... select', async () => {\n\tconst orders = singlestoreTable('orders', {\n\t\tid: serial('id').primaryKey(),\n\t\tregion: text('region').notNull(),\n\t\tproduct: text('product').notNull(),\n\t\tamount: int('amount').notNull(),\n\t\tquantity: int('quantity').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${orders}`);\n\tawait db.execute(\n\t\tsql`\n\t\t\tcreate table ${orders} (\n\t\t\t\t\\`id\\` serial primary key,\n\t\t\t\t\\`region\\` text not null,\n\t\t\t\t\\`product\\` text not null,\n\t\t\t\t\\`amount\\` int not null,\n\t\t\t\t\\`quantity\\` int not null\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.insert(orders).values([\n\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t]);\n\n\tconst regionalSales = db\n\t\t.$with('regional_sales')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.groupBy(orders.region),\n\t\t);\n\n\tconst topRegions = db\n\t\t.$with('top_regions')\n\t\t.as(\n\t\t\tdb\n\t\t\t\t.select({\n\t\t\t\t\tregion: regionalSales.region,\n\t\t\t\t})\n\t\t\t\t.from(regionalSales)\n\t\t\t\t.where(\n\t\t\t\t\tgt(\n\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\tdb.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t);\n\n\tconst result = await db\n\t\t.with(regionalSales, topRegions)\n\t\t.select({\n\t\t\tregion: orders.region,\n\t\t\tproduct: orders.product,\n\t\t\tproductUnits: sql<number>`cast(sum(${orders.quantity}) as unsigned)`,\n\t\t\tproductSales: sql<number>`cast(sum(${orders.amount}) as unsigned)`,\n\t\t})\n\t\t.from(orders)\n\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t.groupBy(orders.region, orders.product)\n\t\t.orderBy(orders.region, orders.product);\n\n\tawait db.execute(sql`drop table ${orders}`);\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tregion: 'Europe',\n\t\t\tproduct: 'A',\n\t\t\tproductUnits: 3,\n\t\t\tproductSales: 30,\n\t\t},\n\t\t{\n\t\t\tregion: 'Europe',\n\t\t\tproduct: 'B',\n\t\t\tproductUnits: 5,\n\t\t\tproductSales: 50,\n\t\t},\n\t\t{\n\t\t\tregion: 'US',\n\t\t\tproduct: 'A',\n\t\t\tproductUnits: 7,\n\t\t\tproductSales: 70,\n\t\t},\n\t\t{\n\t\t\tregion: 'US',\n\t\t\tproduct: 'B',\n\t\t\tproductUnits: 9,\n\t\t\tproductSales: 90,\n\t\t},\n\t]);\n});\n\ntest('select from subquery sql', async () => {\n\tawait db.insert(users2Table).values([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]);\n\n\tconst sq = db\n\t\t.select({ name: sql<string>`concat(${users2Table.name}, \" modified\")`.as('name') })\n\t\t.from(users2Table)\n\t\t.orderBy(asc(users2Table.id))\n\t\t.as('sq');\n\n\tconst res = await db.select({ name: sq.name }).from(sq);\n\n\texpect(res).toEqual([{ name: 'John modified' }, { name: 'Jane modified' }]);\n});\n\ntest('select a field without joining its table', () => {\n\texpect(() => db.select({ name: users2Table.name }).from(usersTable).prepare()).toThrowError();\n});\n\ntest('select all fields from subquery without alias', () => {\n\tconst sq = db.$with('sq').as(db.select({ name: sql<string>`upper(${users2Table.name})` }).from(users2Table));\n\n\texpect(() => db.select().from(sq).prepare()).toThrowError();\n});\n\ntest('select count()', async () => {\n\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }]);\n\n\tconst res = await db.select({ count: sql`count(*)` }).from(usersTable);\n\n\texpect(res).toEqual([{ count: 2 }]);\n});\n\ntest('select for ...', () => {\n\t{\n\t\tconst query = db.select().from(users2Table).for('update').toSQL();\n\t\texpect(query.sql).toMatch(/ for update$/);\n\t}\n\t{\n\t\tconst query = db.select().from(users2Table).for('share', { skipLocked: true }).toSQL();\n\t\texpect(query.sql).toMatch(/ for share skip locked$/);\n\t}\n\t{\n\t\tconst query = db.select().from(users2Table).for('update', { noWait: true }).toSQL();\n\t\texpect(query.sql).toMatch(/ for update nowait$/);\n\t}\n});\n\ntest('having', async () => {\n\tawait db.insert(citiesTable).values([{ id: 1, name: 'London' }, { id: 2, name: 'Paris' }, {\n\t\tid: 3,\n\t\tname: 'New York',\n\t}]);\n\n\tawait db.insert(users2Table).values([{ id: 1, name: 'John', cityId: 1 }, { id: 2, name: 'Jane', cityId: 1 }, {\n\t\tid: 3,\n\t\tname: 'Jack',\n\t\tcityId: 2,\n\t}]);\n\n\tconst result = await db\n\t\t.select({\n\t\t\tid: citiesTable.id,\n\t\t\tname: sql<string>`upper(${citiesTable.name})`.as('upper_name'),\n\t\t\tusersCount: sql<number>`count(${users2Table.id})`.as('users_count'),\n\t\t})\n\t\t.from(citiesTable)\n\t\t.leftJoin(users2Table, eq(users2Table.cityId, citiesTable.id))\n\t\t.where(({ name }) => sql`length(${name}) >= 3`)\n\t\t.groupBy(citiesTable.id)\n\t\t.having(({ usersCount }) => sql`${usersCount} > 0`)\n\t\t.orderBy(({ name }) => name);\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tid: 1,\n\t\t\tname: 'LONDON',\n\t\t\tusersCount: 2,\n\t\t},\n\t\t{\n\t\t\tid: 2,\n\t\t\tname: 'PARIS',\n\t\t\tusersCount: 1,\n\t\t},\n\t]);\n});\n\n// TODO: Unskip when views are supported\n/* test.skip('view', async () => {\n\tconst newYorkers1 = singlestoreView('new_yorkers')\n\t\t.as((qb) => qb.select().from(users2Table).where(eq(users2Table.cityId, 1)));\n\n\tconst newYorkers2 = singlestoreView('new_yorkers', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: int('city_id').notNull(),\n\t}).as(sql`select * from ${users2Table} where ${eq(users2Table.cityId, 1)}`);\n\n\tconst newYorkers3 = singlestoreView('new_yorkers', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: int('city_id').notNull(),\n\t}).existing();\n\n\tawait db.execute(sql`create view new_yorkers as ${getViewConfig(newYorkers1).query}`);\n\n\tawait db.insert(citiesTable).values([{ name: 'New York' }, { name: 'Paris' }]);\n\n\tawait db.insert(users2Table).values([\n\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t{ id: 3, name: 'Jack', cityId: 2 },\n\t]);\n\n\t{\n\t\tconst result = await db.select().from(newYorkers1).orderBy(asc(newYorkers1.id));\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select().from(newYorkers2).orderBy(asc(newYorkers2.id));\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select().from(newYorkers3).orderBy(asc(newYorkers3.id));\n\t\texpect(result).toEqual([\n\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t]);\n\t}\n\n\t{\n\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1).orderBy(asc(newYorkers1.id));\n\t\texpect(result).toEqual([\n\t\t\t{ name: 'John' },\n\t\t\t{ name: 'Jane' },\n\t\t]);\n\t}\n\n\tawait db.execute(sql`drop view ${newYorkers1}`);\n}); */\n\ntest('select from raw sql', async () => {\n\tconst result = await db.select({\n\t\tid: sql<number>`id`,\n\t\tname: sql<string>`name`,\n\t}).from(sql`(select 1 as id, 'John' as name) as users`);\n\n\tExpect<Equal<{ id: number; name: string }[], typeof result>>;\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John' },\n\t]);\n});\n\ntest('select from raw sql with joins', async () => {\n\tconst result = await db\n\t\t.select({\n\t\t\tid: sql<number>`users.id`,\n\t\t\tname: sql<string>`users.name`,\n\t\t\tuserCity: sql<string>`users.city`,\n\t\t\tcityName: sql<string>`cities.name`,\n\t\t})\n\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, sql`cities.id = users.id`);\n\n\tExpect<Equal<{ id: number; name: string; userCity: string; cityName: string }[], typeof result>>;\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', userCity: 'New York', cityName: 'Paris' },\n\t]);\n});\n\ntest('join on aliased sql from select', async () => {\n\tconst result = await db\n\t\t.select({\n\t\t\tuserId: sql<number>`users.id`.as('userId'),\n\t\t\tname: sql<string>`users.name`,\n\t\t\tuserCity: sql<string>`users.city`,\n\t\t\tcityId: sql<number>`cities.id`.as('cityId'),\n\t\t\tcityName: sql<string>`cities.name`,\n\t\t})\n\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, (cols) => eq(cols.cityId, cols.userId));\n\n\tExpect<Equal<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>>;\n\n\texpect(result).toEqual([\n\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t]);\n});\n\ntest('join on aliased sql from with clause', async () => {\n\tconst users = db.$with('users').as(\n\t\tdb.select({\n\t\t\tid: sql<number>`id`.as('userId'),\n\t\t\tname: sql<string>`name`.as('userName'),\n\t\t\tcity: sql<string>`city`.as('city'),\n\t\t}).from(\n\t\t\tsql`(select 1 as id, 'John' as name, 'New York' as city) as users`,\n\t\t),\n\t);\n\n\tconst cities = db.$with('cities').as(\n\t\tdb.select({\n\t\t\tid: sql<number>`id`.as('cityId'),\n\t\t\tname: sql<string>`name`.as('cityName'),\n\t\t}).from(\n\t\t\tsql`(select 1 as id, 'Paris' as name) as cities`,\n\t\t),\n\t);\n\n\tconst result = await db\n\t\t.with(users, cities)\n\t\t.select({\n\t\t\tuserId: users.id,\n\t\t\tname: users.name,\n\t\t\tuserCity: users.city,\n\t\t\tcityId: cities.id,\n\t\t\tcityName: cities.name,\n\t\t})\n\t\t.from(users)\n\t\t.leftJoin(cities, (cols) => eq(cols.cityId, cols.userId));\n\n\tExpect<Equal<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>>;\n\n\texpect(result).toEqual([\n\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t]);\n});\n\ntest('prefixed table', async () => {\n\tconst singlestoreTable = singlestoreTableCreator((name) => `myprefix_${name}`);\n\n\tconst users = singlestoreTable('test_prefixed_table_with_unique_name', {\n\t\tid: int('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table myprefix_test_prefixed_table_with_unique_name (id int not null primary key, name text not null)`,\n\t);\n\n\tawait db.insert(users).values({ id: 1, name: 'John' });\n\n\tconst result = await db.select().from(users);\n\n\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('orderBy with aliased column', () => {\n\tconst query = db.select({\n\t\ttest: sql`something`.as('test'),\n\t}).from(users2Table).orderBy((fields) => fields.test).toSQL();\n\n\texpect(query.sql).toBe(`select something as \\`test\\` from \\`${getTableName(users2Table)}\\` order by \\`test\\``);\n});\n\ntest('timestamp timezone', async () => {\n\tconst date = new Date(Date.parse('2020-01-01T12:34:56+07:00'));\n\n\tawait db.insert(usersTable).values({ id: 1, name: 'With default times' });\n\tawait db.insert(usersTable).values({\n\t\tid: 2,\n\t\tname: 'Without default times',\n\t\tcreatedAt: date,\n\t});\n\tconst users = await db.select().from(usersTable).orderBy(asc(usersTable.id));\n\n\t// check that the timestamps are set correctly for default times\n\texpect(Math.abs(users[0]!.createdAt.getTime() - Date.now())).toBeLessThan(2000);\n\n\t// check that the timestamps are set correctly for non default times\n\texpect(Math.abs(users[1]!.createdAt.getTime() - date.getTime())).toBeLessThan(2000);\n});\n\ntest('transaction', async () => {\n\tconst users = singlestoreTable('users_transactions', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: int('balance').notNull(),\n\t});\n\tconst products = singlestoreTable('products_transactions', {\n\t\tid: serial('id').primaryKey(),\n\t\tprice: int('price').notNull(),\n\t\tstock: int('stock').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`drop table if exists ${products}`);\n\n\tawait db.execute(sql`create table ${users} (id serial not null primary key, balance int not null)`);\n\tawait db.execute(\n\t\tsql`create table ${products} (id serial not null primary key, price int not null, stock int not null)`,\n\t);\n\n\tconst [{ insertId: userId }] = await db.insert(users).values({ id: 1, balance: 100 });\n\tconst user = await db.select().from(users).where(eq(users.id, userId)).then((rows) => rows[0]!);\n\tconst [{ insertId: productId }] = await db.insert(products).values({ id: 1, price: 10, stock: 10 });\n\tconst product = await db.select().from(products).where(eq(products.id, productId)).then((rows) => rows[0]!);\n\n\tawait db.transaction(async (tx) => {\n\t\tawait tx.update(users).set({ balance: user.balance - product.price }).where(eq(users.id, user.id));\n\t\tawait tx.update(products).set({ stock: product.stock - 1 }).where(eq(products.id, product.id));\n\t});\n\n\tconst result = await db.select().from(users);\n\n\tawait db.execute(sql`drop table ${users}`);\n\tawait db.execute(sql`drop table ${products}`);\n\n\texpect(result).toEqual([{ id: 1, balance: 90 }]);\n});\n\ntest('transaction rollback', async () => {\n\tconst users = singlestoreTable('users_transactions_rollback', {\n\t\tid: serial('id').primaryKey(),\n\t\tbalance: int('balance').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, balance int not null)`,\n\t);\n\n\tawait expect((async () => {\n\t\tawait db.transaction(async (tx) => {\n\t\t\tawait tx.insert(users).values({ balance: 100 });\n\t\t\ttx.rollback();\n\t\t});\n\t})()).rejects.toThrowError(TransactionRollbackError);\n\n\tconst result = await db.select().from(users);\n\n\tawait db.execute(sql`drop table ${users}`);\n\n\texpect(result).toEqual([]);\n});\n\ntest('join subquery with join', async () => {\n\tconst internalStaff = singlestoreTable('internal_staff', {\n\t\tuserId: int('user_id').notNull(),\n\t});\n\n\tconst customUser = singlestoreTable('custom_user', {\n\t\tid: int('id').notNull(),\n\t});\n\n\tconst ticket = singlestoreTable('ticket', {\n\t\tstaffId: int('staff_id').notNull(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${internalStaff}`);\n\tawait db.execute(sql`drop table if exists ${customUser}`);\n\tawait db.execute(sql`drop table if exists ${ticket}`);\n\n\tawait db.execute(sql`create table ${internalStaff} (user_id integer not null)`);\n\tawait db.execute(sql`create table ${customUser} (id integer not null)`);\n\tawait db.execute(sql`create table ${ticket} (staff_id integer not null)`);\n\n\tawait db.insert(internalStaff).values({ userId: 1 });\n\tawait db.insert(customUser).values({ id: 1 });\n\tawait db.insert(ticket).values({ staffId: 1 });\n\n\tconst subq = db\n\t\t.select()\n\t\t.from(internalStaff)\n\t\t.leftJoin(customUser, eq(internalStaff.userId, customUser.id))\n\t\t.as('internal_staff');\n\n\tconst mainQuery = await db\n\t\t.select()\n\t\t.from(ticket)\n\t\t.leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId));\n\n\tawait db.execute(sql`drop table ${internalStaff}`);\n\tawait db.execute(sql`drop table ${customUser}`);\n\tawait db.execute(sql`drop table ${ticket}`);\n\n\texpect(mainQuery).toEqual([{\n\t\tticket: { staffId: 1 },\n\t\tinternal_staff: {\n\t\t\tinternal_staff: { userId: 1 },\n\t\t\tcustom_user: { id: 1 },\n\t\t},\n\t}]);\n});\n\n// TODO: Unskip when views are supported\n/* test.skip('subquery with view', async () => {\n\tconst users = singlestoreTable('users_subquery_view', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: int('city_id').notNull(),\n\t});\n\n\tconst newYorkers = singlestoreView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`drop view if exists ${newYorkers}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t);\n\tawait db.execute(sql`create view ${newYorkers} as select * from ${users} where city_id = 1`);\n\n\tawait db.insert(users).values([\n\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t{ id: 2, name: 'Jane', cityId: 2 },\n\t\t{ id: 3, name: 'Jack', cityId: 1 },\n\t\t{ id: 4, name: 'Jill', cityId: 2 },\n\t]);\n\n\tconst sq = db.$with('sq').as(db.select().from(newYorkers));\n\tconst result = await db.with(sq).select().from(sq).orderBy(asc(sq.id));\n\n\tawait db.execute(sql`drop view ${newYorkers}`);\n\tawait db.execute(sql`drop table ${users}`);\n\n\texpect(result).toEqual([\n\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t{ id: 3, name: 'Jack', cityId: 1 },\n\t]);\n}); */\n\n// TODO: Unskip when views are supported\n/* test.skip('join view as subquery', async () => {\n\tconst users = singlestoreTable('users_join_view', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name').notNull(),\n\t\tcityId: int('city_id').notNull(),\n\t});\n\n\tconst newYorkers = singlestoreView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`drop view if exists ${newYorkers}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text not null, city_id integer not null)`,\n\t);\n\tawait db.execute(sql`create view ${newYorkers} as select * from ${users} where city_id = 1`);\n\n\tawait db.insert(users).values([\n\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t{ id: 2, name: 'Jane', cityId: 2 },\n\t\t{ id: 3, name: 'Jack', cityId: 1 },\n\t\t{ id: 4, name: 'Jill', cityId: 2 },\n\t]);\n\n\tconst sq = db.select().from(newYorkers).as('new_yorkers_sq');\n\n\tconst result = await db.select().from(users).leftJoin(sq, eq(users.id, sq.id)).orderBy(asc(users.id));\n\n\texpect(result).toEqual([\n\t\t{\n\t\t\tusers_join_view: { id: 1, name: 'John', cityId: 1 },\n\t\t\tnew_yorkers_sq: { id: 1, name: 'John', cityId: 1 },\n\t\t},\n\t\t{\n\t\t\tusers_join_view: { id: 2, name: 'Jane', cityId: 2 },\n\t\t\tnew_yorkers_sq: null,\n\t\t},\n\t\t{\n\t\t\tusers_join_view: { id: 3, name: 'Jack', cityId: 1 },\n\t\t\tnew_yorkers_sq: { id: 3, name: 'Jack', cityId: 1 },\n\t\t},\n\t\t{\n\t\t\tusers_join_view: { id: 4, name: 'Jill', cityId: 2 },\n\t\t\tnew_yorkers_sq: null,\n\t\t},\n\t]);\n\n\tawait db.execute(sql`drop view ${newYorkers}`);\n\tawait db.execute(sql`drop table ${users}`);\n}); */\n\ntest('select iterator', async () => {\n\tconst users = singlestoreTable('users_iterator', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial not null primary key)`);\n\n\tawait db.insert(users).values([{ id: 1 }, { id: 2 }, { id: 3 }]);\n\n\tconst iter = db.select().from(users)\n\t\t.orderBy(asc(users.id))\n\t\t.iterator();\n\n\tconst result: typeof users.$inferSelect[] = [];\n\n\tfor await (const row of iter) {\n\t\tresult.push(row);\n\t}\n\n\texpect(result).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }]);\n});\n\ntest('select iterator w/ prepared statement', async () => {\n\tconst users = singlestoreTable('users_iterator', {\n\t\tid: serial('id').primaryKey(),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\tawait db.execute(sql`create table ${users} (id serial not null primary key)`);\n\n\tawait db.insert(users).values([{ id: 1 }, { id: 2 }, { id: 3 }]);\n\n\tconst prepared = db.select().from(users)\n\t\t.orderBy(asc(users.id))\n\t\t.prepare();\n\tconst iter = prepared.iterator();\n\tconst result: typeof users.$inferSelect[] = [];\n\n\tfor await (const row of iter) {\n\t\tresult.push(row);\n\t}\n\n\texpect(result).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }]);\n});\n\ntest('insert undefined', async () => {\n\tconst users = singlestoreTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name'),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text)`,\n\t);\n\n\tawait expect((async () => {\n\t\tawait db.insert(users).values({ name: undefined });\n\t})()).resolves.not.toThrowError();\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n\ntest('update undefined', async () => {\n\tconst users = singlestoreTable('users', {\n\t\tid: serial('id').primaryKey(),\n\t\tname: text('name'),\n\t});\n\n\tawait db.execute(sql`drop table if exists ${users}`);\n\n\tawait db.execute(\n\t\tsql`create table ${users} (id serial not null primary key, name text)`,\n\t);\n\n\tawait expect((async () => {\n\t\tawait db.update(users).set({ name: undefined });\n\t})()).rejects.toThrowError();\n\n\tawait expect((async () => {\n\t\tawait db.update(users).set({ id: 1, name: undefined });\n\t})()).resolves.not.toThrowError();\n\n\tawait db.execute(sql`drop table ${users}`);\n});\n"
  },
  {
    "path": "integration-tests/tests/singlestore/singlestore-proxy.test.ts",
    "content": "import retry from 'async-retry';\nimport type { SingleStoreRemoteDatabase } from 'drizzle-orm/singlestore-proxy';\nimport { drizzle as proxyDrizzle } from 'drizzle-orm/singlestore-proxy';\nimport * as mysql2 from 'mysql2/promise';\nimport { afterAll, beforeAll, beforeEach } from 'vitest';\nimport { skipTests } from '~/common';\nimport { createDockerDB, tests } from './singlestore-common';\n\nconst ENABLE_LOGGING = false;\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nclass ServerSimulator {\n\tconstructor(private db: mysql2.Connection) {}\n\n\tasync query(sql: string, params: any[], method: 'all' | 'execute') {\n\t\tif (method === 'all') {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db.query({\n\t\t\t\t\tsql,\n\t\t\t\t\tvalues: params,\n\t\t\t\t\trowsAsArray: true,\n\t\t\t\t\ttypeCast: function(field: any, next: any) {\n\t\t\t\t\t\tif (field.type === 'TIMESTAMP' || field.type === 'DATETIME' || field.type === 'DATE') {\n\t\t\t\t\t\t\treturn field.string();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn next();\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn { data: result[0] as any };\n\t\t\t} catch (e: any) {\n\t\t\t\treturn { error: e };\n\t\t\t}\n\t\t} else if (method === 'execute') {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db.query({\n\t\t\t\t\tsql,\n\t\t\t\t\tvalues: params,\n\t\t\t\t\ttypeCast: function(field: any, next: any) {\n\t\t\t\t\t\tif (field.type === 'TIMESTAMP' || field.type === 'DATETIME' || field.type === 'DATE') {\n\t\t\t\t\t\t\treturn field.string();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn next();\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn { data: result as any };\n\t\t\t} catch (e: any) {\n\t\t\t\treturn { error: e };\n\t\t\t}\n\t\t} else {\n\t\t\treturn { error: 'Unknown method value' };\n\t\t}\n\t}\n\n\tasync migrations(queries: string[]) {\n\t\tawait this.db.query('START TRANSACTION');\n\t\ttry {\n\t\t\tfor (const query of queries) {\n\t\t\t\tawait this.db.query(query);\n\t\t\t}\n\t\t\tawait this.db.query('COMMIT');\n\t\t} catch (e) {\n\t\t\tawait this.db.query('ROLLBACK');\n\t\t\tthrow e;\n\t\t}\n\n\t\treturn {};\n\t}\n}\n\nlet db: SingleStoreRemoteDatabase;\nlet client: mysql2.Connection;\nlet serverSimulator: ServerSimulator;\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['SINGLESTORE_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['SINGLESTORE_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t}\n\tclient = await retry(async () => {\n\t\tclient = await mysql2.createConnection({ uri: connectionString, supportBigNumbers: true });\n\t\tawait client.connect();\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.end();\n\t\t},\n\t});\n\n\tawait client.query(`CREATE DATABASE IF NOT EXISTS drizzle;`);\n\tawait client.changeUser({ database: 'drizzle' });\n\n\tserverSimulator = new ServerSimulator(client);\n\tdb = proxyDrizzle(async (sql, params, method) => {\n\t\ttry {\n\t\t\tconst response = await serverSimulator.query(sql, params, method);\n\n\t\t\tif (response.error !== undefined) {\n\t\t\t\tthrow response.error;\n\t\t\t}\n\n\t\t\treturn { rows: response.data };\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error from singlestore proxy server:', e.message);\n\t\t\tthrow e;\n\t\t}\n\t}, { logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n});\n\nbeforeEach((ctx) => {\n\tctx.singlestore = {\n\t\tdb,\n\t};\n});\n\nskipTests([\n\t'select iterator w/ prepared statement',\n\t'select iterator',\n\t'nested transaction rollback',\n\t'nested transaction',\n\t'transaction rollback',\n\t'transaction',\n\t'transaction with options (set isolationLevel)',\n\t'migrator',\n]);\n\ntests();\n"
  },
  {
    "path": "integration-tests/tests/singlestore/singlestore.test.ts",
    "content": "import retry from 'async-retry';\nimport { drizzle } from 'drizzle-orm/singlestore';\nimport type { SingleStoreDriverDatabase } from 'drizzle-orm/singlestore';\nimport * as mysql2 from 'mysql2/promise';\nimport { afterAll, beforeAll, beforeEach } from 'vitest';\nimport { TestCache, TestGlobalCache, tests as cacheTests } from './singlestore-cache';\nimport { createDockerDB, tests } from './singlestore-common';\n\nconst ENABLE_LOGGING = false;\n\nlet db: SingleStoreDriverDatabase;\nlet dbGlobalCached: SingleStoreDriverDatabase;\nlet cachedDb: SingleStoreDriverDatabase;\nlet client: mysql2.Connection;\n\nbeforeAll(async () => {\n\tlet connectionString;\n\tif (process.env['SINGLESTORE_CONNECTION_STRING']) {\n\t\tconnectionString = process.env['SINGLESTORE_CONNECTION_STRING'];\n\t} else {\n\t\tconst { connectionString: conStr } = await createDockerDB();\n\t\tconnectionString = conStr;\n\t}\n\tclient = await retry(async () => {\n\t\tclient = await mysql2.createConnection({ uri: connectionString, supportBigNumbers: true });\n\t\tawait client.connect();\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.end();\n\t\t},\n\t});\n\n\tawait client.query(`CREATE DATABASE IF NOT EXISTS drizzle;`);\n\tawait client.changeUser({ database: 'drizzle' });\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestCache() });\n\tdbGlobalCached = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestGlobalCache() });\n});\n\nafterAll(async () => {\n\tawait client?.end();\n});\n\nbeforeEach((ctx) => {\n\tctx.singlestore = {\n\t\tdb,\n\t};\n\tctx.cachedSingleStore = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ncacheTests();\ntests();\n"
  },
  {
    "path": "integration-tests/tests/sqlite/better-sqlite.test.ts",
    "content": "import Database from 'better-sqlite3';\nimport { sql } from 'drizzle-orm';\nimport { type BetterSQLite3Database, drizzle } from 'drizzle-orm/better-sqlite3';\nimport { migrate } from 'drizzle-orm/better-sqlite3/migrator';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { anotherUsersMigratorTable, tests, usersMigratorTable } from './sqlite-common';\n\nconst ENABLE_LOGGING = false;\n\nlet db: BetterSQLite3Database;\nlet client: Database.Database;\n\nbeforeAll(async () => {\n\tconst dbPath = process.env['SQLITE_DB_PATH'] ?? ':memory:';\n\tclient = new Database(dbPath);\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tclient?.close();\n});\n\nbeforeEach((ctx) => {\n\tctx.sqlite = {\n\t\tdb,\n\t};\n});\n\ntest('migrator', async () => {\n\tdb.run(sql`drop table if exists another_users`);\n\tdb.run(sql`drop table if exists users12`);\n\tdb.run(sql`drop table if exists __drizzle_migrations`);\n\n\tmigrate(db, { migrationsFolder: './drizzle2/sqlite' });\n\n\tdb.insert(usersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result = db.select().from(usersMigratorTable).all();\n\n\tdb.insert(anotherUsersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result2 = db.select().from(anotherUsersMigratorTable).all();\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\texpect(result2).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tdb.run(sql`drop table another_users`);\n\tdb.run(sql`drop table users12`);\n\tdb.run(sql`drop table __drizzle_migrations`);\n});\n\nskipTests([\n\t/**\n\t * doesn't work properly:\n\t * \tExpect: should rollback transaction and don't insert/ update data\n\t * \tReceived: data inserted/ updated\n\t */\n\t'transaction rollback',\n\t'nested transaction rollback',\n]);\ntests();\n"
  },
  {
    "path": "integration-tests/tests/sqlite/d1-batch.test.ts",
    "content": "/// <reference types=\"@cloudflare/workers-types\" />\nimport 'dotenv/config';\nimport { D1Database, D1DatabaseAPI } from '@miniflare/d1';\nimport { createSQLiteDB } from '@miniflare/shared';\nimport { eq, relations, sql } from 'drizzle-orm';\nimport type { DrizzleD1Database } from 'drizzle-orm/d1';\nimport { drizzle } from 'drizzle-orm/d1';\nimport { type AnySQLiteColumn, integer, primaryKey, sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport { afterAll, beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\n\nconst ENABLE_LOGGING = false;\n\nexport const usersTable = sqliteTable('users', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tverified: integer('verified').notNull().default(0),\n\tinvitedBy: integer('invited_by').references((): AnySQLiteColumn => usersTable.id),\n});\nexport const usersConfig = relations(usersTable, ({ one, many }) => ({\n\tinvitee: one(usersTable, {\n\t\tfields: [usersTable.invitedBy],\n\t\treferences: [usersTable.id],\n\t}),\n\tusersToGroups: many(usersToGroupsTable),\n\tposts: many(postsTable),\n}));\n\nexport const groupsTable = sqliteTable('groups', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tdescription: text('description'),\n});\nexport const groupsConfig = relations(groupsTable, ({ many }) => ({\n\tusersToGroups: many(usersToGroupsTable),\n}));\n\nexport const usersToGroupsTable = sqliteTable(\n\t'users_to_groups',\n\t{\n\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\tuserId: integer('user_id', { mode: 'number' }).notNull().references(\n\t\t\t() => usersTable.id,\n\t\t),\n\t\tgroupId: integer('group_id', { mode: 'number' }).notNull().references(\n\t\t\t() => groupsTable.id,\n\t\t),\n\t},\n\t(t) => ({\n\t\tpk: primaryKey({ columns: [t.userId, t.groupId] }),\n\t}),\n);\nexport const usersToGroupsConfig = relations(usersToGroupsTable, ({ one }) => ({\n\tgroup: one(groupsTable, {\n\t\tfields: [usersToGroupsTable.groupId],\n\t\treferences: [groupsTable.id],\n\t}),\n\tuser: one(usersTable, {\n\t\tfields: [usersToGroupsTable.userId],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n\nexport const postsTable = sqliteTable('posts', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcontent: text('content').notNull(),\n\townerId: integer('owner_id', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tcreatedAt: integer('created_at', { mode: 'timestamp_ms' })\n\t\t.notNull().default(sql`current_timestamp`),\n});\nexport const postsConfig = relations(postsTable, ({ one, many }) => ({\n\tauthor: one(usersTable, {\n\t\tfields: [postsTable.ownerId],\n\t\treferences: [usersTable.id],\n\t}),\n\tcomments: many(commentsTable),\n}));\n\nexport const commentsTable = sqliteTable('comments', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcontent: text('content').notNull(),\n\tcreator: integer('creator', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tpostId: integer('post_id', { mode: 'number' }).references(() => postsTable.id),\n\tcreatedAt: integer('created_at', { mode: 'timestamp_ms' })\n\t\t.notNull().default(sql`current_timestamp`),\n});\nexport const commentsConfig = relations(commentsTable, ({ one, many }) => ({\n\tpost: one(postsTable, {\n\t\tfields: [commentsTable.postId],\n\t\treferences: [postsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentsTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n\tlikes: many(commentLikesTable),\n}));\n\nexport const commentLikesTable = sqliteTable('comment_likes', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcreator: integer('creator', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tcommentId: integer('comment_id', { mode: 'number' }).references(\n\t\t() => commentsTable.id,\n\t),\n\tcreatedAt: integer('created_at', { mode: 'timestamp_ms' })\n\t\t.notNull().default(sql`current_timestamp`),\n});\nexport const commentLikesConfig = relations(commentLikesTable, ({ one }) => ({\n\tcomment: one(commentsTable, {\n\t\tfields: [commentLikesTable.commentId],\n\t\treferences: [commentsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentLikesTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n\nconst schema = {\n\tusersTable,\n\tpostsTable,\n\tcommentsTable,\n\tusersToGroupsTable,\n\tgroupsTable,\n\tcommentLikesConfig,\n\tcommentsConfig,\n\tpostsConfig,\n\tusersToGroupsConfig,\n\tgroupsConfig,\n\tusersConfig,\n};\n\nlet db: DrizzleD1Database<typeof schema>;\n\nbeforeAll(async () => {\n\tconst sqliteDb = await createSQLiteDB(':memory:');\n\tconst d1db = new D1Database(new D1DatabaseAPI(sqliteDb));\n\tdb = drizzle(d1db, { logger: ENABLE_LOGGING, schema });\n});\n\nbeforeEach(async () => {\n\tawait db.run(sql`drop table if exists \\`groups\\``);\n\tawait db.run(sql`drop table if exists \\`users\\``);\n\tawait db.run(sql`drop table if exists \\`users_to_groups\\``);\n\tawait db.run(sql`drop table if exists \\`posts\\``);\n\tawait db.run(sql`drop table if exists \\`comments\\``);\n\tawait db.run(sql`drop table if exists \\`comment_likes\\``);\n\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`users\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`name\\` text NOT NULL,\n\t\t\t    \\`verified\\` integer DEFAULT 0 NOT NULL,\n\t\t\t    \\`invited_by\\` integer\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`groups\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`name\\` text NOT NULL,\n\t\t\t    \\`description\\` text\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`users_to_groups\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`user_id\\` integer NOT NULL,\n\t\t\t    \\`group_id\\` integer NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`posts\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`content\\` text NOT NULL,\n\t\t\t    \\`owner_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`comments\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`content\\` text NOT NULL,\n\t\t\t    \\`creator\\` integer,\n\t\t\t    \\`post_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`comment_likes\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`creator\\` integer,\n\t\t\t    \\`comment_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n});\n\nafterAll(async () => {\n\tawait db.run(sql`drop table if exists \\`groups\\``);\n\tawait db.run(sql`drop table if exists \\`users\\``);\n\tawait db.run(sql`drop table if exists \\`users_to_groups\\``);\n\tawait db.run(sql`drop table if exists \\`posts\\``);\n\tawait db.run(sql`drop table if exists \\`comments\\``);\n\tawait db.run(sql`drop table if exists \\`comment_likes\\``);\n});\n\ntest('batch api example', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({\n\t\t\tid: usersTable.id,\n\t\t\tinvitedBy: usersTable.invitedBy,\n\t\t}),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.select().from(usersTable),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\tD1Result,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t]>();\n\n\texpect(batchResponse.length).eq(3);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t\tinvitedBy: null,\n\t}]);\n\n\t// expect(batchResponse[1]).toEqual({\n\t// \tresults: [],\n\t// \tsuccess: true,\n\t// \tmeta: {\n\t// \t\tduration: 0.027083873748779297,\n\t// \t\tlast_row_id: 2,\n\t// \t\tchanges: 1,\n\t// \t\tserved_by: 'miniflare.db',\n\t// \t\tinternal_stats: null,\n\t// \t},\n\t// });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n});\n\n// batch api only relational many\ntest('insert + findMany', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.query.usersTable.findMany({}),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tD1Result,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t]>();\n\n\texpect(batchResponse.length).eq(3);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\t// expect(batchResponse[1]).toEqual({ columns: [], rows: [], rowsAffected: 1, lastInsertRowid: 2n });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n});\n\n// batch api relational many + one\ntest('insert + findMany + findFirst', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.query.usersTable.findMany({}),\n\t\tdb.query.usersTable.findFirst({}),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tD1Result,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t} | undefined,\n\t]>();\n\n\texpect(batchResponse.length).eq(4);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\t// expect(batchResponse[1]).toEqual({ columns: [], rows: [], rowsAffected: 1, lastInsertRowid: 2n });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[3]).toEqual(\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t);\n});\n\ntest('insert + db.all + db.get + db.values + db.run', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.run(sql`insert into users (id, name) values (2, 'Dan')`),\n\t\tdb.all<typeof usersTable.$inferSelect>(sql`select * from users`),\n\t\tdb.values(sql`select * from users`),\n\t\tdb.get<typeof usersTable.$inferSelect>(sql`select * from users`),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tD1Result,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\tunknown[][],\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t},\n\t]>();\n\n\texpect(batchResponse.length).eq(5);\n\n\texpect(batchResponse[0], 'insert').toEqual([{\n\t\tid: 1,\n\t}]);\n\n\t// expect(batchResponse[1]).toEqual({ columns: [], rows: [], rowsAffected: 1, lastInsertRowid: 2n });\n\n\texpect(batchResponse[2], 'all').toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invited_by: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invited_by: null },\n\t]);\n\n\texpect(batchResponse[3], 'values').toEqual([[1, 'John', 0, null], [2, 'Dan', 0, null]]);\n\n\texpect(batchResponse[4], 'get').toEqual(\n\t\t{ id: 1, name: 'John', verified: 0, invited_by: null },\n\t);\n});\n\n// batch api combined rqb + raw call\ntest('insert + findManyWith + db.all', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.query.usersTable.findMany({}),\n\t\tdb.all<typeof usersTable.$inferSelect>(sql`select * from users`),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tD1Result,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t]>();\n\n\texpect(batchResponse.length).eq(4);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\t// expect(batchResponse[1]).toEqual({ columns: [], rows: [], rowsAffected: 1, lastInsertRowid: 2n });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[3]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invited_by: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invited_by: null },\n\t]);\n});\n\n// batch api for insert + update + select\ntest('insert + update + select + select partial', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.update(usersTable).set({ name: 'Dan' }).where(eq(usersTable.id, 1)),\n\t\tdb.query.usersTable.findMany({}),\n\t\tdb.select().from(usersTable).where(eq(usersTable.id, 1)),\n\t\tdb.select({ id: usersTable.id, invitedBy: usersTable.invitedBy }).from(usersTable),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tD1Result,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t]>();\n\n\texpect(batchResponse.length).eq(5);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\t// expect(batchResponse[1]).toEqual({ columns: [], rows: [], rowsAffected: 1, lastInsertRowid: 1n });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[3]).toEqual([\n\t\t{ id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[4]).toEqual([\n\t\t{ id: 1, invitedBy: null },\n\t]);\n});\n\n// batch api for insert + delete + select\ntest('insert + delete + select + select partial', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.delete(usersTable).where(eq(usersTable.id, 1)).returning({ id: usersTable.id, invitedBy: usersTable.invitedBy }),\n\t\tdb.query.usersTable.findFirst({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tinvitedBy: true,\n\t\t\t},\n\t\t}),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tD1Result,\n\t\t{\n\t\t\tid: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tinvitedBy: number | null;\n\t\t} | undefined,\n\t]>();\n\n\texpect(batchResponse.length).eq(4);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\t// expect(batchResponse[1]).toEqual({ columns: [], rows: [], rowsAffected: 1, lastInsertRowid: 2n });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[3]).toEqual(\n\t\t{ id: 2, invitedBy: null },\n\t);\n});\n"
  },
  {
    "path": "integration-tests/tests/sqlite/d1.test.ts",
    "content": "import { D1Database, D1DatabaseAPI } from '@miniflare/d1';\nimport { createSQLiteDB } from '@miniflare/shared';\nimport { sql } from 'drizzle-orm';\nimport type { DrizzleD1Database } from 'drizzle-orm/d1';\nimport { drizzle } from 'drizzle-orm/d1';\nimport { migrate } from 'drizzle-orm/d1/migrator';\nimport { beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { randomString } from '~/utils';\nimport { anotherUsersMigratorTable, tests, usersMigratorTable } from './sqlite-common';\nimport { TestCache, TestGlobalCache, tests as cacheTests } from './sqlite-common-cache';\n\nconst ENABLE_LOGGING = false;\n\nlet db: DrizzleD1Database;\nlet dbGlobalCached: DrizzleD1Database;\nlet cachedDb: DrizzleD1Database;\n\nbeforeAll(async () => {\n\tconst sqliteDb = await createSQLiteDB(':memory:');\n\tconst d1db = new D1Database(new D1DatabaseAPI(sqliteDb));\n\tdb = drizzle(d1db, { logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(d1db, { logger: ENABLE_LOGGING, cache: new TestCache() });\n\tdbGlobalCached = drizzle(d1db, { logger: ENABLE_LOGGING, cache: new TestGlobalCache() });\n});\n\nbeforeEach((ctx) => {\n\tctx.sqlite = {\n\t\tdb,\n\t};\n\tctx.cachedSqlite = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ntest('migrator', async () => {\n\tawait db.run(sql`drop table if exists another_users`);\n\tawait db.run(sql`drop table if exists users12`);\n\tawait db.run(sql`drop table if exists __drizzle_migrations`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/sqlite' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result = await db.select().from(usersMigratorTable).all();\n\n\tawait db.insert(anotherUsersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result2 = await db.select().from(anotherUsersMigratorTable).all();\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\texpect(result2).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.run(sql`drop table another_users`);\n\tawait db.run(sql`drop table users12`);\n\tawait db.run(sql`drop table __drizzle_migrations`);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.run(sql`drop table if exists another_users`);\n\tawait db.run(sql`drop table if exists users12`);\n\tawait db.run(sql`drop table if exists ${sql.identifier(customTable)}`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/sqlite', migrationsTable: customTable });\n\n\t// test if the custom migrations table was created\n\tconst res = await db.all(sql`select * from ${sql.identifier(customTable)};`);\n\texpect(res.length > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.run(sql`drop table another_users`);\n\tawait db.run(sql`drop table users12`);\n\tawait db.run(sql`drop table ${sql.identifier(customTable)}`);\n});\n\nskipTests([\n\t// Cannot convert 49,50,55 to a BigInt\n\t'insert bigint values',\n\t// SyntaxError: Unexpected token , in JSON at position 2\n\t'json insert',\n\t'insert many',\n\t'insert many with returning',\n\t/**\n\t * TODO: Fix Bug! The objects should be equal\n\t *\n\t * See #528 for more details.\n\t * Tldr the D1 driver does not execute joins successfully\n\t */\n\t'partial join with alias',\n\t'full join with alias',\n\t'select from alias',\n\t'join view as subquery',\n\t'cross join',\n]);\ncacheTests();\ntests();\n"
  },
  {
    "path": "integration-tests/tests/sqlite/durable-objects/drizzle/0000_cuddly_black_bolt.sql",
    "content": "CREATE TABLE `another_users` (\n\t`id` integer PRIMARY KEY NOT NULL,\n\t`name` text NOT NULL,\n\t`email` text NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE `users12` (\n\t`id` integer PRIMARY KEY NOT NULL,\n\t`name` text NOT NULL,\n\t`email` text NOT NULL\n);\n"
  },
  {
    "path": "integration-tests/tests/sqlite/durable-objects/drizzle/meta/0000_snapshot.json",
    "content": "{\n  \"version\": \"6\",\n  \"dialect\": \"sqlite\",\n  \"id\": \"66be869a-d55d-4790-a382-de654dff1506\",\n  \"prevId\": \"00000000-0000-0000-0000-000000000000\",\n  \"tables\": {\n    \"another_users\": {\n      \"name\": \"another_users\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"integer\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {},\n      \"checkConstraints\": {}\n    },\n    \"users12\": {\n      \"name\": \"users12\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"integer\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {},\n      \"checkConstraints\": {}\n    }\n  },\n  \"views\": {},\n  \"enums\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  },\n  \"internal\": {\n    \"indexes\": {}\n  }\n}"
  },
  {
    "path": "integration-tests/tests/sqlite/durable-objects/drizzle/meta/_journal.json",
    "content": "{\n  \"version\": \"7\",\n  \"dialect\": \"sqlite\",\n  \"entries\": [\n    {\n      \"idx\": 0,\n      \"version\": \"6\",\n      \"when\": 1732696446109,\n      \"tag\": \"0000_cuddly_black_bolt\",\n      \"breakpoints\": true\n    }\n  ]\n}"
  },
  {
    "path": "integration-tests/tests/sqlite/durable-objects/drizzle/migrations.js",
    "content": "import m0000 from './0000_cuddly_black_bolt.sql';\nimport journal from './meta/_journal.json';\n\nexport default {\n\tjournal,\n\tmigrations: {\n\t\tm0000,\n\t},\n};\n"
  },
  {
    "path": "integration-tests/tests/sqlite/durable-objects/index.ts",
    "content": "/// <reference types=\"@cloudflare/workers-types\" />\n\nimport { expect } from 'chai';\nimport { DurableObject } from 'cloudflare:workers';\nimport {\n\tand,\n\tasc,\n\tavg,\n\tavgDistinct,\n\tcount,\n\tcountDistinct,\n\teq,\n\texists,\n\tgetTableColumns,\n\tgt,\n\tgte,\n\tinArray,\n\tlt,\n\tmax,\n\tmin,\n\tName,\n\tnotInArray,\n\tsql,\n\tsum,\n\tsumDistinct,\n} from 'drizzle-orm';\nimport { drizzle, type DrizzleSqliteDODatabase } from 'drizzle-orm/durable-sqlite';\nimport { migrate } from 'drizzle-orm/durable-sqlite/migrator';\nimport {\n\talias,\n\ttype BaseSQLiteDatabase,\n\tblob,\n\texcept,\n\tgetViewConfig,\n\tint,\n\tinteger,\n\tintersect,\n\tnumeric,\n\tprimaryKey,\n\tsqliteTable,\n\tsqliteTableCreator,\n\tsqliteView,\n\ttext,\n\tunion,\n\tunionAll,\n} from 'drizzle-orm/sqlite-core';\nimport { type Equal, Expect } from '~/utils';\nimport migrations from './drizzle/migrations';\n\nexport const usersTable = sqliteTable('users', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: integer('verified', { mode: 'boolean' }).notNull().default(false),\n\tjson: blob('json', { mode: 'json' }).$type<string[]>(),\n\tcreatedAt: integer('created_at', { mode: 'timestamp' }).notNull().default(sql`strftime('%s', 'now')`),\n});\n\nexport const usersOnUpdate = sqliteTable('users_on_update', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tupdateCounter: integer('update_counter').default(sql`1`).$onUpdateFn(() => sql`update_counter + 1`),\n\tupdatedAt: integer('updated_at', { mode: 'timestamp_ms' }).$onUpdate(() => new Date()),\n\talwaysNull: text('always_null').$type<string | null>().$onUpdate(() => null),\n});\n\nexport const users2Table = sqliteTable('users2', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: integer('city_id').references(() => citiesTable.id),\n});\n\nexport const citiesTable = sqliteTable('cities', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nexport const coursesTable = sqliteTable('courses', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcategoryId: integer('category_id').references(() => courseCategoriesTable.id),\n});\n\nexport const courseCategoriesTable = sqliteTable('course_categories', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nexport const orders = sqliteTable('orders', {\n\tid: integer('id').primaryKey(),\n\tregion: text('region').notNull(),\n\tproduct: text('product').notNull().$default(() => 'random_string'),\n\tamount: integer('amount').notNull(),\n\tquantity: integer('quantity').notNull(),\n});\n\nexport const usersMigratorTable = sqliteTable('users12', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n});\n\nexport const anotherUsersMigratorTable = sqliteTable('another_users', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n});\n\nexport const pkExampleTable = sqliteTable('pk_example', {\n\tid: integer('id').notNull(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n\tcompositePk: primaryKey({ columns: [table.id, table.name] }),\n}));\n\nexport const bigIntExample = sqliteTable('big_int_example', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tbigInt: blob('big_int', { mode: 'bigint' }).notNull(),\n});\n\n// To test aggregate functions\nexport const aggregateTable = sqliteTable('aggregate_table', {\n\tid: integer('id').primaryKey({ autoIncrement: true }).notNull(),\n\tname: text('name').notNull(),\n\ta: integer('a'),\n\tb: integer('b'),\n\tc: integer('c'),\n\tnullOnly: integer('null_only'),\n});\n\nasync function setupSetOperationTest(db: BaseSQLiteDatabase<any, any>) {\n\tawait db.run(sql`drop table if exists users2`);\n\tawait db.run(sql`drop table if exists cities`);\n\tawait db.run(sql`\n\t\tcreate table \\`cities\\` (\n\t\t\tid integer primary key,\n\t\t\tname text not null\n\t\t)\n\t`);\n\n\tawait db.run(sql`\n\t\tcreate table \\`users2\\` (\n\t\t\tid integer primary key,\n\t\t\tname text not null,\n\t\t\tcity_id integer references ${citiesTable}(${sql.identifier(citiesTable.id.name)})\n\t\t)\n\t`);\n\n\tawait db.insert(citiesTable).values([\n\t\t{ id: 1, name: 'New York' },\n\t\t{ id: 2, name: 'London' },\n\t\t{ id: 3, name: 'Tampa' },\n\t]);\n\n\tawait db.insert(users2Table).values([\n\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t{ id: 2, name: 'Jane', cityId: 2 },\n\t\t{ id: 3, name: 'Jack', cityId: 3 },\n\t\t{ id: 4, name: 'Peter', cityId: 3 },\n\t\t{ id: 5, name: 'Ben', cityId: 2 },\n\t\t{ id: 6, name: 'Jill', cityId: 1 },\n\t\t{ id: 7, name: 'Mary', cityId: 2 },\n\t\t{ id: 8, name: 'Sally', cityId: 1 },\n\t]);\n}\n\nasync function setupAggregateFunctionsTest(db: BaseSQLiteDatabase<any, any>) {\n\tawait db.run(sql`drop table if exists \"aggregate_table\"`);\n\tawait db.run(\n\t\tsql`\n\t\t\tcreate table \"aggregate_table\" (\n\t\t\t\t\"id\" integer primary key autoincrement not null,\n\t\t\t\t\"name\" text not null,\n\t\t\t\t\"a\" integer,\n\t\t\t\t\"b\" integer,\n\t\t\t\t\"c\" integer,\n\t\t\t\t\"null_only\" integer\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.insert(aggregateTable).values([\n\t\t{ name: 'value 1', a: 5, b: 10, c: 20 },\n\t\t{ name: 'value 1', a: 5, b: 20, c: 30 },\n\t\t{ name: 'value 2', a: 10, b: 50, c: 60 },\n\t\t{ name: 'value 3', a: 20, b: 20, c: null },\n\t\t{ name: 'value 4', a: null, b: 90, c: 120 },\n\t\t{ name: 'value 5', a: 80, b: 10, c: null },\n\t\t{ name: 'value 6', a: null, b: null, c: 150 },\n\t]);\n}\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nexport class MyDurableObject extends DurableObject {\n\tstorage: DurableObjectStorage;\n\tdb: DrizzleSqliteDODatabase;\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\t\tthis.storage = ctx.storage;\n\t\tthis.db = drizzle(this.storage, { logger: false });\n\t}\n\n\tasync migrate1(): Promise<void> {\n\t\ttry {\n\t\t\tthis.db.run(sql`drop table if exists another_users`);\n\t\t\tthis.db.run(sql`drop table if exists users12`);\n\t\t\tthis.db.run(sql`drop table if exists __drizzle_migrations`);\n\n\t\t\tmigrate(this.db, migrations);\n\n\t\t\tthis.db.insert(usersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\t\t\tconst result = this.db.select().from(usersMigratorTable).all();\n\n\t\t\tthis.db.insert(anotherUsersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\t\t\tconst result2 = this.db.select().from(anotherUsersMigratorTable).all();\n\n\t\t\texpect(result).deep.equal([{ id: 1, name: 'John', email: 'email' }]);\n\t\t\texpect(result2).deep.equal([{ id: 1, name: 'John', email: 'email' }]);\n\n\t\t\tthis.db.run(sql`drop table another_users`);\n\t\t\tthis.db.run(sql`drop table users12`);\n\t\t\tthis.db.run(sql`drop table __drizzle_migrations`);\n\t\t} catch {\n\t\t\tthrow new Error('migrate1 has broken');\n\t\t}\n\t}\n\n\tasync beforeEach(): Promise<void> {\n\t\tthis.db.run(sql`drop table if exists ${usersTable}`);\n\t\tthis.db.run(sql`drop table if exists ${users2Table}`);\n\t\tthis.db.run(sql`drop table if exists ${citiesTable}`);\n\t\tthis.db.run(sql`drop table if exists ${coursesTable}`);\n\t\tthis.db.run(sql`drop table if exists ${courseCategoriesTable}`);\n\t\tthis.db.run(sql`drop table if exists ${orders}`);\n\t\tthis.db.run(sql`drop table if exists ${bigIntExample}`);\n\t\tthis.db.run(sql`drop table if exists ${pkExampleTable}`);\n\t\tthis.db.run(sql`drop table if exists user_notifications_insert_into`);\n\t\tthis.db.run(sql`drop table if exists users_insert_into`);\n\t\tthis.db.run(sql`drop table if exists notifications_insert_into`);\n\n\t\tthis.db.run(sql`\n\t\t\tcreate table ${usersTable} (\n\t\t\t\tid integer primary key,\n\t\t\t\tname text not null,\n\t\t\t\tverified integer not null default 0,\n\t\t\t\tjson blob,\n\t\t\t\tcreated_at integer not null default (strftime('%s', 'now'))\n\t\t\t)\n\t\t`);\n\n\t\tthis.db.run(sql`\n\t\t\tcreate table ${citiesTable} (\n\t\t\t\tid integer primary key,\n\t\t\t\tname text not null\n\t\t\t)\n\t\t`);\n\t\tthis.db.run(sql`\n\t\t\tcreate table ${courseCategoriesTable} (\n\t\t\t\tid integer primary key,\n\t\t\t\tname text not null\n\t\t\t)\n\t\t`);\n\n\t\tthis.db.run(sql`\n\t\t\tcreate table ${users2Table} (\n\t\t\t\tid integer primary key,\n\t\t\t\tname text not null,\n\t\t\t\tcity_id integer references ${citiesTable}(${sql.identifier(citiesTable.id.name)})\n\t\t\t)\n\t\t`);\n\t\tthis.db.run(sql`\n\t\t\tcreate table ${coursesTable} (\n\t\t\t\tid integer primary key,\n\t\t\t\tname text not null,\n\t\t\t\tcategory_id integer references ${courseCategoriesTable}(${sql.identifier(courseCategoriesTable.id.name)})\n\t\t\t)\n\t\t`);\n\t\tthis.db.run(sql`\n\t\t\tcreate table ${orders} (\n\t\t\t\tid integer primary key,\n\t\t\t\tregion text not null,\n\t\t\t\tproduct text not null,\n\t\t\t\tamount integer not null,\n\t\t\t\tquantity integer not null\n\t\t\t)\n\t\t`);\n\t\tthis.db.run(sql`\n\t\t\tcreate table ${pkExampleTable} (\n\t\t\t\tid integer not null,\n\t\t\t\tname text not null,\n\t\t\t\temail text not null,\n\t\t\t\tprimary key (id, name)\n\t\t\t)\n\t\t`);\n\t\tthis.db.run(sql`\n\t\t\tcreate table ${bigIntExample} (\n\t\t\t  id integer primary key,\n\t\t\t  name text not null,\n\t\t\t  big_int blob not null\n\t\t\t)\n\t\t`);\n\t}\n\n\tasync insertBigIntValues(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tthis.db\n\t\t\t\t.insert(bigIntExample)\n\t\t\t\t.values({ name: 'one', bigInt: BigInt('0') })\n\t\t\t\t.run();\n\t\t\tthis.db\n\t\t\t\t.insert(bigIntExample)\n\t\t\t\t.values({ name: 'two', bigInt: BigInt('127') })\n\t\t\t\t.run();\n\t\t\tthis.db\n\t\t\t\t.insert(bigIntExample)\n\t\t\t\t.values({ name: 'three', bigInt: BigInt('32767') })\n\t\t\t\t.run();\n\t\t\tthis.db\n\t\t\t\t.insert(bigIntExample)\n\t\t\t\t.values({ name: 'four', bigInt: BigInt('1234567890') })\n\t\t\t\t.run();\n\t\t\tthis.db\n\t\t\t\t.insert(bigIntExample)\n\t\t\t\t.values({ name: 'five', bigInt: BigInt('12345678900987654321') })\n\t\t\t\t.run();\n\n\t\t\tconst result = this.db.select().from(bigIntExample).all();\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 1, name: 'one', bigInt: BigInt('0') },\n\t\t\t\t{ id: 2, name: 'two', bigInt: BigInt('127') },\n\t\t\t\t{ id: 3, name: 'three', bigInt: BigInt('32767') },\n\t\t\t\t{ id: 4, name: 'four', bigInt: BigInt('1234567890') },\n\t\t\t\t{ id: 5, name: 'five', bigInt: BigInt('12345678900987654321') },\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.log(error);\n\t\t\tthrow new Error('insertBigIntValues has broken');\n\t\t}\n\t}\n\tasync selectAllFields(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst now = Date.now();\n\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst result = this.db.select().from(usersTable).all();\n\t\t\texpect(result[0]!.createdAt).instanceOf(Date);\n\t\t\texpect(Math.abs(result[0]!.createdAt.getTime() - now)).lessThan(5000);\n\t\t\texpect(result).deep.equal([{\n\t\t\t\tid: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tverified: false,\n\t\t\t\tjson: null,\n\t\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t\t}]);\n\t\t} catch {\n\t\t\tthrow new Error('selectAllFields has broken');\n\t\t}\n\t}\n\n\tasync selectPartial(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst result = this.db.select({ name: usersTable.name }).from(usersTable).all();\n\n\t\t\texpect(result).deep.equal([{ name: 'John' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectPartial error`);\n\t\t}\n\t}\n\n\tasync selectSql(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = this.db\n\t\t\t\t.select({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.all();\n\n\t\t\texpect(users).deep.equal([{ name: 'JOHN' }]);\n\t\t} catch {\n\t\t\tthrow new Error('selectSql has broken');\n\t\t}\n\t}\n\n\tasync selectTypedSql(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = this.db\n\t\t\t\t.select({\n\t\t\t\t\tname: sql<string>`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.all();\n\n\t\t\texpect(users).deep.equal([{ name: 'JOHN' }]);\n\t\t} catch {\n\t\t\tthrow new Error('selectTypedSql has broken');\n\t\t}\n\t}\n\n\tasync selectWithEmptyArrayInInArray(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tawait this.db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t\tconst result = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(inArray(usersTable.id, []));\n\n\t\t\texpect(result).deep.equal([]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('selectWithEmptyArrayInInArray has broken');\n\t\t}\n\t}\n\n\tasync selectWithEmptyArrayInNotInArray(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tawait this.db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t\tconst result = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(notInArray(usersTable.id, []));\n\n\t\t\texpect(result).deep.equal([{ name: 'JOHN' }, { name: 'JANE' }, { name: 'JANE' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('selectWithEmptyArrayInNotInArray has broken');\n\t\t}\n\t}\n\n\tasync selectDistinct(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tconst usersDistinctTable = sqliteTable('users_distinct', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${usersDistinctTable}`);\n\t\t\tthis.db.run(sql`create table ${usersDistinctTable} (id integer, name text)`);\n\n\t\t\tthis.db\n\t\t\t\t.insert(usersDistinctTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t\t{ id: 2, name: 'John' },\n\t\t\t\t\t{ id: 1, name: 'Jane' },\n\t\t\t\t])\n\t\t\t\t.run();\n\t\t\tconst users = this.db.selectDistinct().from(usersDistinctTable).orderBy(\n\t\t\t\tusersDistinctTable.id,\n\t\t\t\tusersDistinctTable.name,\n\t\t\t).all();\n\n\t\t\tthis.db.run(sql`drop table ${usersDistinctTable}`);\n\n\t\t\texpect(users).deep.equal([\n\t\t\t\t{ id: 1, name: 'Jane' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'John' },\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('selectDistinct has broken');\n\t\t}\n\t}\n\n\tasync returingSql(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tconst users = this.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ name: 'John' })\n\t\t\t\t.returning({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.all();\n\n\t\t\texpect(users).deep.equal([{ name: 'JOHN' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('returingSql has broken');\n\t\t}\n\t}\n\n\tasync $defaultFunction(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tawait this.db.insert(orders).values({ id: 1, region: 'Ukraine', amount: 1, quantity: 1 });\n\t\t\tconst selectedOrder = await this.db.select().from(orders);\n\n\t\t\texpect(selectedOrder).deep.equal([\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tamount: 1,\n\t\t\t\t\tquantity: 1,\n\t\t\t\t\tregion: 'Ukraine',\n\t\t\t\t\tproduct: 'random_string',\n\t\t\t\t},\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('defaultFunction has broken');\n\t\t}\n\t}\n\n\tasync deleteReturningSql(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = this.db\n\t\t\t\t.delete(usersTable)\n\t\t\t\t.where(eq(usersTable.name, 'John'))\n\t\t\t\t.returning({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.all();\n\n\t\t\texpect(users).deep.equal([{ name: 'JOHN' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('deleteReturningSql has broken');\n\t\t}\n\t}\n\n\tasync queryCheckInsertSingleEmptyRow(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tconst query = this.db.insert(users).values({}).toSQL();\n\n\t\t\texpect(query).deep.equal({\n\t\t\t\tsql: 'insert into \"users\" (\"id\", \"name\", \"state\") values (null, ?, null)',\n\t\t\t\tparams: ['Dan'],\n\t\t\t});\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('queryCheckInsertSingleEmptyRow has broken');\n\t\t}\n\t}\n\n\tasync queryCheckInsertMultipleEmptyRow(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tconst query = this.db.insert(users).values([{}, {}]).toSQL();\n\n\t\t\texpect(query).deep.equal({\n\t\t\t\tsql: 'insert into \"users\" (\"id\", \"name\", \"state\") values (null, ?, null), (null, ?, null)',\n\t\t\t\tparams: ['Dan', 'Dan'],\n\t\t\t});\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('queryCheckInsertMultipleEmptyRow has broken');\n\t\t}\n\t}\n\n\tasync insertAllDefaultsIn1Row(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tconst users = sqliteTable('empty_insert_single', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${users}`);\n\n\t\t\tthis.db.run(sql`create table ${users} (id integer primary key, name text default 'Dan', state text)`);\n\n\t\t\tthis.db.insert(users).values({}).run();\n\n\t\t\tconst res = this.db.select().from(users).all();\n\n\t\t\texpect(res).deep.equal([{ id: 1, name: 'Dan', state: null }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('insertAllDefaultsIn1Row has broken');\n\t\t}\n\t}\n\n\tasync insertAllDefaultsInMultipleRows(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tconst users = sqliteTable('empty_insert_multiple', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${users}`);\n\n\t\t\tthis.db.run(sql`create table ${users} (id integer primary key, name text default 'Dan', state text)`);\n\n\t\t\tthis.db.insert(users).values([{}, {}]).run();\n\n\t\t\tconst res = this.db.select().from(users).all();\n\n\t\t\texpect(res).deep.equal([\n\t\t\t\t{ id: 1, name: 'Dan', state: null },\n\t\t\t\t{ id: 2, name: 'Dan', state: null },\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('insertAllDefaultsInMultipleRows has broken');\n\t\t}\n\t}\n\n\tasync updateReturningSql(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = this.db\n\t\t\t\t.update(usersTable)\n\t\t\t\t.set({ name: 'Jane' })\n\t\t\t\t.where(eq(usersTable.name, 'John'))\n\t\t\t\t.returning({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.all();\n\n\t\t\texpect(users).deep.equal([{ name: 'JANE' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('updateReturningSql has broken');\n\t\t}\n\t}\n\n\tasync insertWithAutoIncrement(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'George' }, { name: 'Austin' }])\n\t\t\t\t.run();\n\t\t\tconst result = this.db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).all();\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'Jane' },\n\t\t\t\t{ id: 3, name: 'George' },\n\t\t\t\t{ id: 4, name: 'Austin' },\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('insertWithAutoIncrement has broken');\n\t\t}\n\t}\n\n\tasync insertDataWithDefaultValues(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst result = this.db.select().from(usersTable).all();\n\n\t\t\texpect(result).deep.equal([{\n\t\t\t\tid: 1,\n\t\t\t\tname: 'John',\n\t\t\t\tverified: false,\n\t\t\t\tjson: null,\n\t\t\t\tcreatedAt: result[0]!.createdAt,\n\t\t\t}]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('insertDataWithDefaultValues has broken');\n\t\t}\n\t}\n\n\tasync insertDataWithOverridenDefaultValues(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tthis.db.insert(usersTable).values({ name: 'John', verified: true }).run();\n\t\t\tconst result = this.db.select().from(usersTable).all();\n\n\t\t\texpect(result).deep.equal([{ id: 1, name: 'John', verified: true, json: null, createdAt: result[0]!.createdAt }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('insertDataWithOverridenDefaultValues has broken');\n\t\t}\n\t}\n\n\tasync updateWithReturningFields(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst now = Date.now();\n\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = this.db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning()\n\t\t\t\t.all();\n\n\t\t\texpect(users[0]!.createdAt).instanceOf(Date);\n\t\t\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).lessThan(5000);\n\t\t\texpect(users).deep.equal([{ id: 1, name: 'Jane', verified: false, json: null, createdAt: users[0]!.createdAt }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('updateWithReturningFields has broken');\n\t\t}\n\t}\n\n\tasync updateWithReturningPartial(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = this.db\n\t\t\t\t.update(usersTable)\n\t\t\t\t.set({ name: 'Jane' })\n\t\t\t\t.where(eq(usersTable.name, 'John'))\n\t\t\t\t.returning({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.all();\n\n\t\t\texpect(users).deep.equal([{ id: 1, name: 'Jane' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('updateWithReturningFields has broken');\n\t\t}\n\t}\n\n\tasync updateWithReturningAllFields(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\n\t\t\tconst now = Date.now();\n\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = this.db.delete(usersTable).where(eq(usersTable.name, 'John')).returning().all();\n\n\t\t\texpect(users[0]!.createdAt).instanceOf(Date);\n\t\t\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).lessThan(5000);\n\t\t\texpect(users).deep.equal([{ id: 1, name: 'John', verified: false, json: null, createdAt: users[0]!.createdAt }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error('updateWithReturningFields has broken');\n\t\t}\n\t}\n\n\tasync deleteWithReturningPartial(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = this.db\n\t\t\t\t.delete(usersTable)\n\t\t\t\t.where(eq(usersTable.name, 'John'))\n\t\t\t\t.returning({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.all();\n\n\t\t\texpect(users).deep.equal([{ id: 1, name: 'John' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`deleteWithReturningPartial error`);\n\t\t}\n\t}\n\n\tasync insertAndSelect(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst result = this.db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).all();\n\n\t\t\texpect(result).deep.equal([{ id: 1, name: 'John' }]);\n\n\t\t\tthis.db.insert(usersTable).values({ name: 'Jane' }).run();\n\t\t\tconst result2 = this.db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).all();\n\n\t\t\texpect(result2).deep.equal([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'Jane' },\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertAndSelect error`);\n\t\t}\n\t}\n\n\tasync jsonInsert(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ name: 'John', json: ['foo', 'bar'] })\n\t\t\t\t.run();\n\t\t\tconst result = this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t\tjson: usersTable.json,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([{ id: 1, name: 'John', json: ['foo', 'bar'] }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`jsonInsert error`);\n\t\t}\n\t}\n\n\tasync insertMany(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ name: 'John' }, { name: 'Bruce', json: ['foo', 'bar'] }, { name: 'Jane' }, {\n\t\t\t\t\tname: 'Austin',\n\t\t\t\t\tverified: true,\n\t\t\t\t}])\n\t\t\t\t.run();\n\t\t\tconst result = this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t\tjson: usersTable.json,\n\t\t\t\t\tverified: usersTable.verified,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 1, name: 'John', json: null, verified: false },\n\t\t\t\t{ id: 2, name: 'Bruce', json: ['foo', 'bar'], verified: false },\n\t\t\t\t{ id: 3, name: 'Jane', json: null, verified: false },\n\t\t\t\t{ id: 4, name: 'Austin', json: null, verified: true },\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertMany error`);\n\t\t}\n\t}\n\n\tasync insertManyWithReturning(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst result = this.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ name: 'John' }, { name: 'Bruce', json: ['foo', 'bar'] }, { name: 'Jane' }, {\n\t\t\t\t\tname: 'Austin',\n\t\t\t\t\tverified: true,\n\t\t\t\t}])\n\t\t\t\t.returning({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t\tjson: usersTable.json,\n\t\t\t\t\tverified: usersTable.verified,\n\t\t\t\t})\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 1, name: 'John', json: null, verified: false },\n\t\t\t\t{ id: 2, name: 'Bruce', json: ['foo', 'bar'], verified: false },\n\t\t\t\t{ id: 3, name: 'Jane', json: null, verified: false },\n\t\t\t\t{ id: 4, name: 'Austin', json: null, verified: true },\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertManyWithReturning error`);\n\t\t}\n\t}\n\n\tasync partialJoinWithAlias(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst customerAlias = alias(usersTable, 'customer');\n\n\t\t\tawait this.db.insert(usersTable).values([\n\t\t\t\t{ id: 10, name: 'Ivan' },\n\t\t\t\t{ id: 11, name: 'Hans' },\n\t\t\t]);\n\n\t\t\tconst result = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\t\tname: usersTable.name,\n\t\t\t\t\t},\n\t\t\t\t\tcustomer: {\n\t\t\t\t\t\tid: customerAlias.id,\n\t\t\t\t\t\tname: customerAlias.name,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t\t\t.where(eq(usersTable.id, 10));\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{\n\t\t\t\t\tuser: { id: 10, name: 'Ivan' },\n\t\t\t\t\tcustomer: { id: 11, name: 'Hans' },\n\t\t\t\t},\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`partialJoinWithAlias error`);\n\t\t}\n\t}\n\n\tasync fullJoinWithAlias(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst sqliteTable = sqliteTableCreator((name) => `prefixed_${name}`);\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${users}`);\n\t\t\tthis.db.run(sql`create table ${users} (id integer primary key, name text not null)`);\n\n\t\t\tconst customers = alias(users, 'customer');\n\n\t\t\tthis.db\n\t\t\t\t.insert(users)\n\t\t\t\t.values([\n\t\t\t\t\t{ id: 10, name: 'Ivan' },\n\t\t\t\t\t{ id: 11, name: 'Hans' },\n\t\t\t\t])\n\t\t\t\t.run();\n\t\t\tconst result = this.db.select().from(users).leftJoin(customers, eq(customers.id, 11)).where(eq(users.id, 10))\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{\n\t\t\t\t\tusers: {\n\t\t\t\t\t\tid: 10,\n\t\t\t\t\t\tname: 'Ivan',\n\t\t\t\t\t},\n\t\t\t\t\tcustomer: {\n\t\t\t\t\t\tid: 11,\n\t\t\t\t\t\tname: 'Hans',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tthis.db.run(sql`drop table ${users}`);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`fullJoinWithAlias error`);\n\t\t}\n\t}\n\n\tasync selectFromAlias(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst sqliteTable = sqliteTableCreator((name) => `prefixed_${name}`);\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${users}`);\n\t\t\tthis.db.run(sql`create table ${users} (id integer primary key, name text not null)`);\n\n\t\t\tconst user = alias(users, 'user');\n\t\t\tconst customers = alias(users, 'customer');\n\n\t\t\tthis.db\n\t\t\t\t.insert(users)\n\t\t\t\t.values([\n\t\t\t\t\t{ id: 10, name: 'Ivan' },\n\t\t\t\t\t{ id: 11, name: 'Hans' },\n\t\t\t\t])\n\t\t\t\t.run();\n\t\t\tconst result = this.db.select().from(user).leftJoin(customers, eq(customers.id, 11)).where(eq(user.id, 10)).all();\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tid: 10,\n\t\t\t\t\t\tname: 'Ivan',\n\t\t\t\t\t},\n\t\t\t\t\tcustomer: {\n\t\t\t\t\t\tid: 11,\n\t\t\t\t\t\tname: 'Hans',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tthis.db.run(sql`drop table ${users}`);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectFromAlias error`);\n\t\t}\n\t}\n\n\tasync insertWithSpaces(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ name: sql`'Jo   h     n'` })\n\t\t\t\t.run();\n\t\t\tconst result = await this.db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).all();\n\n\t\t\texpect(result).deep.equal([{ id: 1, name: 'Jo   h     n' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertWithSpaces error`);\n\t\t}\n\t}\n\n\tasync preparedStatement(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst statement = this.db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).prepare();\n\t\t\tconst result = statement.all();\n\n\t\t\texpect(result).deep.equal([{ id: 1, name: 'John' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`preparedStatement error`);\n\t\t}\n\t}\n\n\tasync preparedStatementReuse(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst stmt = this.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ name: sql.placeholder('name') })\n\t\t\t\t.prepare();\n\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tstmt.run({ name: `John ${i}` });\n\t\t\t}\n\n\t\t\tconst result = this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 1, name: 'John 0' },\n\t\t\t\t{ id: 2, name: 'John 1' },\n\t\t\t\t{ id: 3, name: 'John 2' },\n\t\t\t\t{ id: 4, name: 'John 3' },\n\t\t\t\t{ id: 5, name: 'John 4' },\n\t\t\t\t{ id: 6, name: 'John 5' },\n\t\t\t\t{ id: 7, name: 'John 6' },\n\t\t\t\t{ id: 8, name: 'John 7' },\n\t\t\t\t{ id: 9, name: 'John 8' },\n\t\t\t\t{ id: 10, name: 'John 9' },\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`preparedStatementReuse error`);\n\t\t}\n\t}\n\n\tasync insertPlaceholdersOnColumnsWithEncoder(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst stmt = this.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({\n\t\t\t\t\tname: 'John',\n\t\t\t\t\tverified: sql.placeholder('verified'),\n\t\t\t\t})\n\t\t\t\t.prepare();\n\n\t\t\tstmt.run({ verified: true });\n\t\t\tstmt.run({ verified: false });\n\n\t\t\tconst result = this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tverified: usersTable.verified,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 1, verified: true },\n\t\t\t\t{ id: 2, verified: false },\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertPlaceholdersOnColumnsWithEncoder error`);\n\t\t}\n\t}\n\n\tasync preparedStatementWithPlaceholderInWhere(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst stmt = this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t\t\t.prepare();\n\t\t\tconst result = stmt.all({ id: 1 });\n\n\t\t\texpect(result).deep.equal([{ id: 1, name: 'John' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`preparedStatementWithPlaceholderInWhere error`);\n\t\t}\n\t}\n\n\tasync preparedStatementWithPlaceholderInLimit(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst stmt = this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t\t\t.limit(sql.placeholder('limit'))\n\t\t\t\t.prepare();\n\n\t\t\tconst result = await stmt.all({ id: 1, limit: 1 });\n\n\t\t\texpect(result).deep.equal([{ id: 1, name: 'John' }]);\n\t\t\texpect(result).length(1);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`preparedStatementWithPlaceholderInLimit error`);\n\t\t}\n\t}\n\n\tasync preparedStatementWithPlaceholderInOffset(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ name: 'John' }, { name: 'John1' }])\n\t\t\t\t.run();\n\t\t\tconst stmt = this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.limit(sql.placeholder('limit'))\n\t\t\t\t.offset(sql.placeholder('offset'))\n\t\t\t\t.prepare();\n\n\t\t\tconst result = stmt.all({ limit: 1, offset: 1 });\n\n\t\t\texpect(result).deep.equal([{ id: 2, name: 'John1' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`preparedStatementWithPlaceholderInOffset error`);\n\t\t}\n\t}\n\n\tasync preparedStatementBuiltUsing$dynamic(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tfunction withLimitOffset(qb: any) {\n\t\t\t\treturn qb.limit(sql.placeholder('limit')).offset(sql.placeholder('offset'));\n\t\t\t}\n\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ name: 'John' }, { name: 'John1' }])\n\t\t\t\t.run();\n\t\t\tconst stmt = this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.$dynamic();\n\t\t\twithLimitOffset(stmt).prepare('stmt_limit');\n\n\t\t\tconst result = await stmt.all({ limit: 1, offset: 1 });\n\n\t\t\texpect(result).deep.equal([{ id: 2, name: 'John1' }]);\n\t\t\texpect(result).length(1);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`preparedStatementBuiltUsing error`);\n\t\t}\n\t}\n\n\tasync selectWithGroupByAsField(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }])\n\t\t\t\t.run();\n\n\t\t\tconst result = this.db.select({ name: usersTable.name }).from(usersTable).groupBy(usersTable.name).all();\n\n\t\t\texpect(result).deep.equal([{ name: 'Jane' }, { name: 'John' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectWithGroupByAsField error`);\n\t\t}\n\t}\n\n\tasync selectWithExists(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }])\n\t\t\t\t.run();\n\n\t\t\tconst user = alias(usersTable, 'user');\n\t\t\tconst result = this.db\n\t\t\t\t.select({ name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(\n\t\t\t\t\texists(\n\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t.select({ one: sql`1` })\n\t\t\t\t\t\t\t.from(user)\n\t\t\t\t\t\t\t.where(and(eq(usersTable.name, 'John'), eq(user.id, usersTable.id))),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([{ name: 'John' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectWithExists error`);\n\t\t}\n\t}\n\n\tasync selectWithGroupByAsSql(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }])\n\t\t\t\t.run();\n\n\t\t\tconst result = this.db\n\t\t\t\t.select({ name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.groupBy(sql`${usersTable.name}`)\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([{ name: 'Jane' }, { name: 'John' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectWithGroupByAsSql error`);\n\t\t}\n\t}\n\n\tasync selectWithGroupByAsSqlPlusColumn(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }])\n\t\t\t\t.run();\n\n\t\t\tconst result = this.db\n\t\t\t\t.select({ name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.groupBy(sql`${usersTable.name}`, usersTable.id)\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectWithGroupByAsSqlPlusColumn error`);\n\t\t}\n\t}\n\n\tasync selectWithGroupByAsColumnPlusSql(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }])\n\t\t\t\t.run();\n\n\t\t\tconst result = this.db\n\t\t\t\t.select({ name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectWithGroupByAsColumnPlusSql error`);\n\t\t}\n\t}\n\n\tasync selectWithGroupByComplexQuery(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }])\n\t\t\t\t.run();\n\n\t\t\tconst result = this.db\n\t\t\t\t.select({ name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t\t\t.orderBy(asc(usersTable.name))\n\t\t\t\t.limit(1)\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([{ name: 'Jane' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectWithGroupByComplexQuery error`);\n\t\t}\n\t}\n\n\tasync buildQuery(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst query = this.db\n\t\t\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, usersTable.name)\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).deep.equal({\n\t\t\t\tsql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\", \"users\".\"name\"',\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`buildQuery error`);\n\t\t}\n\t}\n\n\tasync insertViaDbRunPlusSelectViaDbAll(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.run(sql`insert into ${usersTable} (${new Name(usersTable.name.name)}) values (${'John'})`);\n\n\t\t\tconst result = this.db.all<{ id: number; name: string }>(sql`select id, name from \"users\"`);\n\t\t\texpect(result).deep.equal([{ id: 1, name: 'John' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertViaDbRunPlusSelectViaDbAll error`);\n\t\t}\n\t}\n\n\tasync insertViaDbGet(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst inserted = this.db.get<{ id: number; name: string }>(\n\t\t\t\tsql`insert into ${usersTable} (${new Name(\n\t\t\t\t\tusersTable.name.name,\n\t\t\t\t)}) values (${'John'}) returning ${usersTable.id}, ${usersTable.name}`,\n\t\t\t);\n\t\t\texpect(inserted).deep.equal({ id: 1, name: 'John' });\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertViaDbGet error`);\n\t\t}\n\t}\n\n\tasync insertViaDbRunPlusSelectViaDbGet(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.run(sql`insert into ${usersTable} (${new Name(usersTable.name.name)}) values (${'John'})`);\n\n\t\t\tconst result = this.db.get<{ id: number; name: string }>(\n\t\t\t\tsql`select ${usersTable.id}, ${usersTable.name} from ${usersTable}`,\n\t\t\t);\n\t\t\texpect(result).deep.equal({ id: 1, name: 'John' });\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertViaDbRunPlusSelectViaDbGet error`);\n\t\t}\n\t}\n\n\tasync insertViaDbGetQueryBuilder(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst inserted = this.db.get<Pick<typeof usersTable.$inferSelect, 'id' | 'name'>>(\n\t\t\t\tthis.db.insert(usersTable).values({ name: 'John' }).returning({ id: usersTable.id, name: usersTable.name }),\n\t\t\t);\n\t\t\texpect(inserted).deep.equal({ id: 1, name: 'John' });\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertViaDbGetQueryBuilder error`);\n\t\t}\n\t}\n\n\tasync joinSubquery(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(courseCategoriesTable)\n\t\t\t\t.values([{ name: 'Category 1' }, { name: 'Category 2' }, { name: 'Category 3' }, { name: 'Category 4' }])\n\t\t\t\t.run();\n\n\t\t\tthis.db\n\t\t\t\t.insert(coursesTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'Development', categoryId: 2 },\n\t\t\t\t\t{ name: 'IT & Software', categoryId: 3 },\n\t\t\t\t\t{ name: 'Marketing', categoryId: 4 },\n\t\t\t\t\t{ name: 'Design', categoryId: 1 },\n\t\t\t\t])\n\t\t\t\t.run();\n\n\t\t\tconst sq2 = this.db\n\t\t\t\t.select({\n\t\t\t\t\tcategoryId: courseCategoriesTable.id,\n\t\t\t\t\tcategory: courseCategoriesTable.name,\n\t\t\t\t\ttotal: sql<number>`count(${courseCategoriesTable.id})`,\n\t\t\t\t})\n\t\t\t\t.from(courseCategoriesTable)\n\t\t\t\t.groupBy(courseCategoriesTable.id, courseCategoriesTable.name)\n\t\t\t\t.as('sq2');\n\n\t\t\tconst res = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tcourseName: coursesTable.name,\n\t\t\t\t\tcategoryId: sq2.categoryId,\n\t\t\t\t})\n\t\t\t\t.from(coursesTable)\n\t\t\t\t.leftJoin(sq2, eq(coursesTable.categoryId, sq2.categoryId))\n\t\t\t\t.orderBy(coursesTable.name)\n\t\t\t\t.all();\n\n\t\t\texpect(res).deep.equal([\n\t\t\t\t{ courseName: 'Design', categoryId: 1 },\n\t\t\t\t{ courseName: 'Development', categoryId: 2 },\n\t\t\t\t{ courseName: 'IT & Software', categoryId: 3 },\n\t\t\t\t{ courseName: 'Marketing', categoryId: 4 },\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`joinSubquery error`);\n\t\t}\n\t}\n\n\tasync withSelect(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(orders)\n\t\t\t\t.values([\n\t\t\t\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t\t\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t\t\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t\t\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t\t\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t\t\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t\t\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t\t\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t\t\t\t])\n\t\t\t\t.run();\n\n\t\t\tconst regionalSales = this.db.$with('regional_sales').as(\n\t\t\t\tthis.db\n\t\t\t\t\t.select({\n\t\t\t\t\t\tregion: orders.region,\n\t\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t\t})\n\t\t\t\t\t.from(orders)\n\t\t\t\t\t.groupBy(orders.region),\n\t\t\t);\n\n\t\t\tconst topRegions = this.db.$with('top_regions').as(\n\t\t\t\tthis.db\n\t\t\t\t\t.select({\n\t\t\t\t\t\tregion: regionalSales.region,\n\t\t\t\t\t})\n\t\t\t\t\t.from(regionalSales)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tgt(\n\t\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\t\tthis.db.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst result = this.db\n\t\t\t\t.with(regionalSales, topRegions)\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\tproduct: orders.product,\n\t\t\t\t\tproductUnits: sql<number>`cast(sum(${orders.quantity}) as int)`,\n\t\t\t\t\tproductSales: sql<number>`cast(sum(${orders.amount}) as int)`,\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.where(inArray(orders.region, this.db.select({ region: topRegions.region }).from(topRegions)))\n\t\t\t\t.groupBy(orders.region, orders.product)\n\t\t\t\t.orderBy(orders.region, orders.product)\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{\n\t\t\t\t\tregion: 'Europe',\n\t\t\t\t\tproduct: 'A',\n\t\t\t\t\tproductUnits: 3,\n\t\t\t\t\tproductSales: 30,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'Europe',\n\t\t\t\t\tproduct: 'B',\n\t\t\t\t\tproductUnits: 5,\n\t\t\t\t\tproductSales: 50,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'US',\n\t\t\t\t\tproduct: 'A',\n\t\t\t\t\tproductUnits: 7,\n\t\t\t\t\tproductSales: 70,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'US',\n\t\t\t\t\tproduct: 'B',\n\t\t\t\t\tproductUnits: 9,\n\t\t\t\t\tproductSales: 90,\n\t\t\t\t},\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`withSelect error`);\n\t\t}\n\t}\n\n\tasync withUpdate(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst products = sqliteTable('products', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tprice: numeric('price').notNull(),\n\t\t\t\tcheap: integer('cheap', { mode: 'boolean' }).notNull().default(false),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${products}`);\n\t\t\tthis.db.run(sql`\n\t\t\t\tcreate table ${products} (\n\t\t\t\t\tid integer primary key,\n\t\t\t\t\tprice numeric not null,\n\t\t\t\t\tcheap integer not null default 0\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait this.db\n\t\t\t\t.insert(products)\n\t\t\t\t.values([{ price: '10.99' }, { price: '25.85' }, { price: '32.99' }, { price: '2.50' }, { price: '4.59' }]);\n\n\t\t\tconst averagePrice = this.db.$with('average_price').as(\n\t\t\t\tthis.db\n\t\t\t\t\t.select({\n\t\t\t\t\t\tvalue: sql`avg(${products.price})`.as('value'),\n\t\t\t\t\t})\n\t\t\t\t\t.from(products),\n\t\t\t);\n\n\t\t\tconst result = await this.db\n\t\t\t\t.with(averagePrice)\n\t\t\t\t.update(products)\n\t\t\t\t.set({\n\t\t\t\t\tcheap: true,\n\t\t\t\t})\n\t\t\t\t.where(lt(products.price, sql`(select * from ${averagePrice})`))\n\t\t\t\t.returning({\n\t\t\t\t\tid: products.id,\n\t\t\t\t});\n\n\t\t\texpect(result).deep.equal([{ id: 1 }, { id: 4 }, { id: 5 }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`withUpdate error`);\n\t\t}\n\t}\n\n\tasync withInsert(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tusername: text('username').notNull(),\n\t\t\t\tadmin: integer('admin', { mode: 'boolean' }).notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${users}`);\n\t\t\tthis.db.run(sql`create table ${users} (username text not null, admin integer not null default 0)`);\n\n\t\t\tconst userCount = this.db.$with('user_count').as(\n\t\t\t\tthis.db\n\t\t\t\t\t.select({\n\t\t\t\t\t\tvalue: sql`count(*)`.as('value'),\n\t\t\t\t\t})\n\t\t\t\t\t.from(users),\n\t\t\t);\n\n\t\t\tconst result = await this.db\n\t\t\t\t.with(userCount)\n\t\t\t\t.insert(users)\n\t\t\t\t.values([{ username: 'user1', admin: sql`((select * from ${userCount}) = 0)` }])\n\t\t\t\t.returning({\n\t\t\t\t\tadmin: users.admin,\n\t\t\t\t});\n\n\t\t\texpect(result).deep.equal([{ admin: true }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`withInsert error`);\n\t\t}\n\t}\n\n\tasync withDelete(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tawait this.db.insert(orders).values([\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t\t\t]);\n\n\t\t\tconst averageAmount = this.db.$with('average_amount').as(\n\t\t\t\tthis.db\n\t\t\t\t\t.select({\n\t\t\t\t\t\tvalue: sql`avg(${orders.amount})`.as('value'),\n\t\t\t\t\t})\n\t\t\t\t\t.from(orders),\n\t\t\t);\n\n\t\t\tconst result = this.db\n\t\t\t\t.with(averageAmount)\n\t\t\t\t.delete(orders)\n\t\t\t\t.where(gt(orders.amount, sql`(select * from ${averageAmount})`))\n\t\t\t\t.returning({\n\t\t\t\t\tid: orders.id,\n\t\t\t\t})\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([{ id: 6 }, { id: 7 }, { id: 8 }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`withDelete error`);\n\t\t}\n\t}\n\n\tasync selectFromSubquerySql(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(users2Table)\n\t\t\t\t.values([{ name: 'John' }, { name: 'Jane' }])\n\t\t\t\t.run();\n\n\t\t\tconst sq = this.db\n\t\t\t\t.select({ name: sql<string>`${users2Table.name} || ' modified'`.as('name') })\n\t\t\t\t.from(users2Table)\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = this.db.select({ name: sq.name }).from(sq).all();\n\n\t\t\texpect(res).deep.equal([{ name: 'John modified' }, { name: 'Jane modified' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectFromSubquerySql error`);\n\t\t}\n\t}\n\n\tasync selectAFieldWithoutJoiningItsTable(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\texpect(() => this.db.select({ name: users2Table.name }).from(usersTable).prepare()).throw();\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectAFieldWithoutJoiningItsTable error`);\n\t\t}\n\t}\n\n\tasync selectAllFieldsFromSubqueryWithoutAlias(): Promise<void> {\n\t\ttry {\n\t\t\tconst sq = this.db.$with('sq').as(\n\t\t\t\tthis.db.select({ name: sql<string>`upper(${users2Table.name})` }).from(users2Table),\n\t\t\t);\n\n\t\t\texpect(() => this.db.select().from(sq).prepare()).throw();\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectAllFieldsFromSubqueryWithoutAlias error`);\n\t\t}\n\t}\n\n\tasync selectCount(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ name: 'John' }, { name: 'Jane' }])\n\t\t\t\t.run();\n\n\t\t\tconst res = this.db\n\t\t\t\t.select({ count: sql`count(*)` })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.all();\n\n\t\t\texpect(res).deep.equal([{ count: 2 }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectCount error`);\n\t\t}\n\t}\n\n\tasync having(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ name: 'London' }, { name: 'Paris' }, { name: 'New York' }])\n\t\t\t\t.run();\n\n\t\t\tthis.db\n\t\t\t\t.insert(users2Table)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t\t{ name: 'Jane', cityId: 1 },\n\t\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t\t])\n\t\t\t\t.run();\n\n\t\t\tconst result = this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: citiesTable.id,\n\t\t\t\t\tname: sql<string>`upper(${citiesTable.name})`.as('upper_name'),\n\t\t\t\t\tusersCount: sql<number>`count(${users2Table.id})`.as('users_count'),\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.leftJoin(users2Table, eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.where(({ name }) => sql`length(${name}) >= 3`)\n\t\t\t\t.groupBy(citiesTable.id)\n\t\t\t\t.having(({ usersCount }) => sql`${usersCount} > 0`)\n\t\t\t\t.orderBy(({ name }) => name)\n\t\t\t\t.all();\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tname: 'LONDON',\n\t\t\t\t\tusersCount: 2,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'PARIS',\n\t\t\t\t\tusersCount: 1,\n\t\t\t\t},\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`having error`);\n\t\t}\n\t}\n\n\tasync view(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst newYorkers1 = sqliteView('new_yorkers').as((qb) =>\n\t\t\t\tqb.select().from(users2Table).where(eq(users2Table.cityId, 1))\n\t\t\t);\n\n\t\t\tconst newYorkers2 = sqliteView('new_yorkers', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t}).as(sql`select * from ${users2Table} where ${eq(users2Table.cityId, 1)}`);\n\n\t\t\tconst newYorkers3 = sqliteView('new_yorkers', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t}).existing();\n\n\t\t\tthis.db.run(sql`create view if not exists new_yorkers as ${getViewConfig(newYorkers1).query}`);\n\n\t\t\tthis.db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([{ name: 'New York' }, { name: 'Paris' }])\n\t\t\t\t.run();\n\n\t\t\tthis.db\n\t\t\t\t.insert(users2Table)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t\t{ name: 'Jane', cityId: 1 },\n\t\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t\t])\n\t\t\t\t.run();\n\n\t\t\t{\n\t\t\t\tconst result = this.db.select().from(newYorkers1).all();\n\t\t\t\texpect(result).deep.equal([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = this.db.select().from(newYorkers2).all();\n\t\t\t\texpect(result).deep.equal([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = this.db.select().from(newYorkers3).all();\n\t\t\t\texpect(result).deep.equal([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = this.db.select({ name: newYorkers1.name }).from(newYorkers1).all();\n\t\t\t\texpect(result).deep.equal([{ name: 'John' }, { name: 'Jane' }]);\n\t\t\t}\n\n\t\t\tthis.db.run(sql`drop view ${newYorkers1}`);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`view error`);\n\t\t}\n\t}\n\n\tasync insertNullTimestamp(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst test = sqliteTable('test', {\n\t\t\t\tt: integer('t', { mode: 'timestamp' }),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`create table ${test} (t timestamp)`);\n\n\t\t\tthis.db.insert(test).values({ t: null }).run();\n\t\t\tconst res = await this.db.select().from(test).all();\n\t\t\texpect(res).deep.equal([{ t: null }]);\n\n\t\t\tthis.db.run(sql`drop table ${test}`);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertNullTimestamp error`);\n\t\t}\n\t}\n\n\tasync selectFromRawSql(): Promise<void> {\n\t\ttry {\n\t\t\tconst result = this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: sql<number>`id`,\n\t\t\t\t\tname: sql<string>`name`,\n\t\t\t\t})\n\t\t\t\t.from(sql`(select 1 as id, 'John' as name) as users`)\n\t\t\t\t.all();\n\n\t\t\tExpect<Equal<{ id: number; name: string }[], typeof result>>;\n\n\t\t\texpect(result).deep.equal([{ id: 1, name: 'John' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectFromRawSql error`);\n\t\t}\n\t}\n\n\tasync selectFromRawSqlWithJoins(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst result = this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: sql<number>`users.id`,\n\t\t\t\t\tname: sql<string>`users.name`.as('userName'),\n\t\t\t\t\tuserCity: sql<string>`users.city`,\n\t\t\t\t\tcityName: sql<string>`cities.name`.as('cityName'),\n\t\t\t\t})\n\t\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, sql`cities.id = users.id`)\n\t\t\t\t.all();\n\n\t\t\tExpect<Equal<{ id: number; name: string; userCity: string; cityName: string }[], typeof result>>;\n\n\t\t\texpect(result).deep.equal([{ id: 1, name: 'John', userCity: 'New York', cityName: 'Paris' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectFromRawSqlWithJoins error`);\n\t\t}\n\t}\n\n\tasync joinOnAliasedSqlFromSelect(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst result = this.db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: sql<number>`users.id`.as('userId'),\n\t\t\t\t\tname: sql<string>`users.name`.as('userName'),\n\t\t\t\t\tuserCity: sql<string>`users.city`,\n\t\t\t\t\tcityId: sql<number>`cities.id`.as('cityId'),\n\t\t\t\t\tcityName: sql<string>`cities.name`.as('cityName'),\n\t\t\t\t})\n\t\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, (cols) => eq(cols.cityId, cols.userId))\n\t\t\t\t.all();\n\n\t\t\tExpect<\n\t\t\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t\t\t>;\n\n\t\t\texpect(result).deep.equal([{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`joinOnAliasedSqlFromSelect error`);\n\t\t}\n\t}\n\n\tasync joinOnAliasedSqlFromWithClause(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst users = this.db.$with('users').as(\n\t\t\t\tthis.db\n\t\t\t\t\t.select({\n\t\t\t\t\t\tid: sql<number>`id`.as('userId'),\n\t\t\t\t\t\tname: sql<string>`name`.as('userName'),\n\t\t\t\t\t\tcity: sql<string>`city`.as('city'),\n\t\t\t\t\t})\n\t\t\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`),\n\t\t\t);\n\n\t\t\tconst cities = this.db.$with('cities').as(\n\t\t\t\tthis.db\n\t\t\t\t\t.select({\n\t\t\t\t\t\tid: sql<number>`id`.as('cityId'),\n\t\t\t\t\t\tname: sql<string>`name`.as('cityName'),\n\t\t\t\t\t})\n\t\t\t\t\t.from(sql`(select 1 as id, 'Paris' as name) as cities`),\n\t\t\t);\n\n\t\t\tconst result = this.db\n\t\t\t\t.with(users, cities)\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users.id,\n\t\t\t\t\tname: users.name,\n\t\t\t\t\tuserCity: users.city,\n\t\t\t\t\tcityId: cities.id,\n\t\t\t\t\tcityName: cities.name,\n\t\t\t\t})\n\t\t\t\t.from(users)\n\t\t\t\t.leftJoin(cities, (cols) => eq(cols.cityId, cols.userId))\n\t\t\t\t.all();\n\n\t\t\tExpect<\n\t\t\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t\t\t>;\n\n\t\t\texpect(result).deep.equal([{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`joinOnAliasedSqlFromWithClause error`);\n\t\t}\n\t}\n\n\tasync prefixedTable(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst sqliteTable = sqliteTableCreator((name) => `myprefix_${name}`);\n\n\t\t\tconst users = sqliteTable('test_prefixed_table_with_unique_name', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${users}`);\n\n\t\t\tthis.db.run(\n\t\t\t\tsql`create table myprefix_test_prefixed_table_with_unique_name (id integer not null primary key, name text not null)`,\n\t\t\t);\n\n\t\t\tthis.db.insert(users).values({ id: 1, name: 'John' }).run();\n\n\t\t\tconst result = this.db.select().from(users).all();\n\n\t\t\texpect(result).deep.equal([{ id: 1, name: 'John' }]);\n\n\t\t\tthis.db.run(sql`drop table ${users}`);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`prefixedTable error`);\n\t\t}\n\t}\n\n\tasync orderByWithAliasedColumn(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst query = this.db\n\t\t\t\t.select({\n\t\t\t\t\ttest: sql`something`.as('test'),\n\t\t\t\t})\n\t\t\t\t.from(users2Table)\n\t\t\t\t.orderBy((fields) => fields.test)\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query.sql).equal('select something as \"test\" from \"users2\" order by \"test\"');\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`orderByWithAliasedColumn error`);\n\t\t}\n\t}\n\n\tasync transaction(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst users = sqliteTable('users_transactions', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tbalance: integer('balance').notNull(),\n\t\t\t});\n\t\t\tconst products = sqliteTable('products_transactions', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tprice: integer('price').notNull(),\n\t\t\t\tstock: integer('stock').notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${users}`);\n\t\t\tthis.db.run(sql`drop table if exists ${products}`);\n\n\t\t\tthis.db.run(sql`create table users_transactions (id integer not null primary key, balance integer not null)`);\n\t\t\tthis.db.run(\n\t\t\t\tsql`create table products_transactions (id integer not null primary key, price integer not null, stock integer not null)`,\n\t\t\t);\n\n\t\t\tconst user = this.db.insert(users).values({ balance: 100 }).returning().get();\n\t\t\tconst product = this.db.insert(products).values({ price: 10, stock: 10 }).returning().get();\n\n\t\t\tthis.db.transaction(async (tx) => {\n\t\t\t\ttx.update(users)\n\t\t\t\t\t.set({ balance: user.balance - product.price })\n\t\t\t\t\t.where(eq(users.id, user.id))\n\t\t\t\t\t.run();\n\t\t\t\ttx.update(products)\n\t\t\t\t\t.set({ stock: product.stock - 1 })\n\t\t\t\t\t.where(eq(products.id, product.id))\n\t\t\t\t\t.run();\n\t\t\t});\n\n\t\t\tconst result = this.db.select().from(users).all();\n\n\t\t\texpect(result).deep.equal([{ id: 1, balance: 90 }]);\n\n\t\t\tthis.db.run(sql`drop table ${users}`);\n\t\t\tthis.db.run(sql`drop table ${products}`);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`transaction error`);\n\t\t}\n\t}\n\n\t// async transactionRollback(): Promise<void>{\n\t// \tconst users = sqliteTable('users_transactions_rollback', {\n\t// \t\tid: integer('id').primaryKey(),\n\t// \t\tbalance: integer('balance').notNull(),\n\t// \t});\n\n\t// \tthis.db.run(sql`drop table if exists ${users}`);\n\n\t// \tthis.db.run(\n\t// \t\tsql`create table users_transactions_rollback (id integer not null primary key, balance integer not null)`,\n\t// \t);\n\t// \tawait expect(async () => {\n\t// \t\tthis.db.transaction(async (tx) => {\n\t// \t\t\ttx.insert(users).values({ balance: 100 }).run();\n\t// \t\t\ttx.rollback();\n\t// \t\t});\n\t// \t}).re(TransactionRollbackError);\n\n\t// \tconst result = await db.select().from(users).all();\n\n\t// \texpect(result).toEqual([]);\n\n\t// \tawait db.run(sql`drop table ${users}`);\n\t// };\n\n\tasync nestedTransaction(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst users = sqliteTable('users_nested_transactions', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tbalance: integer('balance').notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${users}`);\n\n\t\t\tthis.db.run(\n\t\t\t\tsql`create table users_nested_transactions (id integer not null primary key, balance integer not null)`,\n\t\t\t);\n\n\t\t\tthis.db.transaction((tx) => {\n\t\t\t\ttx.insert(users).values({ balance: 100 }).run();\n\n\t\t\t\ttx.transaction((tx) => {\n\t\t\t\t\ttx.update(users).set({ balance: 200 }).run();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst result = this.db.select().from(users).all();\n\n\t\t\texpect(result).deep.equal([{ id: 1, balance: 200 }]);\n\n\t\t\tthis.db.run(sql`drop table ${users}`);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`nestedTransaction error`);\n\t\t}\n\t}\n\n\t// async nestedTransactionRollback(): Promise<void>{\n\t// \tconst users = sqliteTable('users_nested_transactions_rollback', {\n\t// \t\tid: integer('id').primaryKey(),\n\t// \t\tbalance: integer('balance').notNull(),\n\t// \t});\n\n\t// \tthis.db.run(sql`drop table if exists ${users}`);\n\n\t// \tthis.db.run(\n\t// \t\tsql`create table users_nested_transactions_rollback (id integer not null primary key, balance integer not null)`,\n\t// \t);\n\n\t// \tthis.db.transaction((tx) => {\n\t// \t\tthis.tx.insert(users).values({ balance: 100 }).run();\n\n\t// \t\texpect(async () => {\n\t// \t\t\tawait tx.transaction(async (tx) => {\n\t// \t\t\t\tawait tx.update(users).set({ balance: 200 }).run();\n\t// \t\t\t\ttx.rollback();\n\t// \t\t\t});\n\t// \t\t}).rejects.toThrowError(TransactionRollbackError);\n\t// \t});\n\n\t// \tconst result = await db.select().from(users).all();\n\n\t// \texpect(result).toEqual([{ id: 1, balance: 100 }]);\n\n\t// \tawait db.run(sql`drop table ${users}`);\n\t// };\n\n\tasync joinSubqueryWithJoin(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst internalStaff = sqliteTable('internal_staff', {\n\t\t\t\tuserId: integer('user_id').notNull(),\n\t\t\t});\n\n\t\t\tconst customUser = sqliteTable('custom_user', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t});\n\n\t\t\tconst ticket = sqliteTable('ticket', {\n\t\t\t\tstaffId: integer('staff_id').notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${internalStaff}`);\n\t\t\tthis.db.run(sql`drop table if exists ${customUser}`);\n\t\t\tthis.db.run(sql`drop table if exists ${ticket}`);\n\n\t\t\tthis.db.run(sql`create table internal_staff (user_id integer not null)`);\n\t\t\tthis.db.run(sql`create table custom_user (id integer not null)`);\n\t\t\tthis.db.run(sql`create table ticket (staff_id integer not null)`);\n\n\t\t\tthis.db.insert(internalStaff).values({ userId: 1 }).run();\n\t\t\tthis.db.insert(customUser).values({ id: 1 }).run();\n\t\t\tthis.db.insert(ticket).values({ staffId: 1 }).run();\n\n\t\t\tconst subq = this.db.select().from(internalStaff).leftJoin(customUser, eq(internalStaff.userId, customUser.id))\n\t\t\t\t.as('internal_staff');\n\n\t\t\tconst mainQuery = this.db.select().from(ticket).leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId))\n\t\t\t\t.all();\n\n\t\t\texpect(mainQuery).deep.equal([\n\t\t\t\t{\n\t\t\t\t\tticket: { staffId: 1 },\n\t\t\t\t\tinternal_staff: {\n\t\t\t\t\t\tinternal_staff: { userId: 1 },\n\t\t\t\t\t\tcustom_user: { id: 1 },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tthis.db.run(sql`drop table ${internalStaff}`);\n\t\t\tthis.db.run(sql`drop table ${customUser}`);\n\t\t\tthis.db.run(sql`drop table ${ticket}`);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`joinSubqueryWithJoin error`);\n\t\t}\n\t}\n\n\tasync joinViewAsSubquery(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst users = sqliteTable('users_join_view', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t});\n\n\t\t\tconst newYorkers = sqliteView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\t\t\tthis.db.run(sql`drop table if exists ${users}`);\n\t\t\tthis.db.run(sql`drop view if exists ${newYorkers}`);\n\n\t\t\tthis.db.run(\n\t\t\t\tsql`create table ${users} (id integer not null primary key, name text not null, city_id integer not null)`,\n\t\t\t);\n\t\t\tthis.db.run(sql`create view if not exists ${newYorkers} as ${getViewConfig(newYorkers).query}`);\n\n\t\t\tthis.db\n\t\t\t\t.insert(users)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t\t{ name: 'Jack', cityId: 1 },\n\t\t\t\t\t{ name: 'Jill', cityId: 2 },\n\t\t\t\t])\n\t\t\t\t.run();\n\n\t\t\tconst sq = this.db.select().from(newYorkers).as('new_yorkers_sq');\n\n\t\t\tconst result = await this.db.select().from(users).leftJoin(sq, eq(users.id, sq.id)).all();\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\tnew_yorkers_sq: { id: 1, name: 'John', cityId: 1 },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 2, name: 'Jane', cityId: 2 },\n\t\t\t\t\tnew_yorkers_sq: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 3, name: 'Jack', cityId: 1 },\n\t\t\t\t\tnew_yorkers_sq: { id: 3, name: 'Jack', cityId: 1 },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 4, name: 'Jill', cityId: 2 },\n\t\t\t\t\tnew_yorkers_sq: null,\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tthis.db.run(sql`drop view ${newYorkers}`);\n\t\t\tthis.db.run(sql`drop table ${users}`);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`joinViewAsSubquery error`);\n\t\t}\n\t}\n\n\tasync insertWithOnConflictDoNothing(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.insert(usersTable).values({ id: 1, name: 'John' }).run();\n\n\t\t\tthis.db.insert(usersTable).values({ id: 1, name: 'John' }).onConflictDoNothing().run();\n\n\t\t\tconst res = this.db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\t\t\teq(usersTable.id, 1),\n\t\t\t).all();\n\n\t\t\texpect(res).deep.equal([{ id: 1, name: 'John' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertWithOnConflictDoNothing error`);\n\t\t}\n\t}\n\n\tasync insertWithOnConflictDoNothinUsingCompositePk(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.insert(pkExampleTable).values({ id: 1, name: 'John', email: 'john@example.com' }).run();\n\n\t\t\tthis.db.insert(pkExampleTable).values({ id: 1, name: 'John', email: 'john1@example.com' }).onConflictDoNothing()\n\t\t\t\t.run();\n\n\t\t\tconst res = await this.db\n\t\t\t\t.select({ id: pkExampleTable.id, name: pkExampleTable.name, email: pkExampleTable.email })\n\t\t\t\t.from(pkExampleTable)\n\t\t\t\t.where(eq(pkExampleTable.id, 1))\n\t\t\t\t.all();\n\n\t\t\texpect(res).deep.equal([{ id: 1, name: 'John', email: 'john@example.com' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertWithOnConflictDoNothinUsingCompositePk error`);\n\t\t}\n\t}\n\n\tasync insertWithOnConflictDoNothingUsingTarget(): Promise<void> {\n\t\ttry {\n\t\t\tthis.db.insert(usersTable).values({ id: 1, name: 'John' }).run();\n\n\t\t\tthis.db.insert(usersTable).values({ id: 1, name: 'John' }).onConflictDoNothing({ target: usersTable.id }).run();\n\n\t\t\tconst res = this.db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\t\t\teq(usersTable.id, 1),\n\t\t\t).all();\n\n\t\t\texpect(res).deep.equal([{ id: 1, name: 'John' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertWithOnConflictDoNothingUsingTarget error`);\n\t\t}\n\t}\n\n\tasync insertWithOnConflictDoNothingUsingCompositePkAsTarget(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.insert(pkExampleTable).values({ id: 1, name: 'John', email: 'john@example.com' }).run();\n\n\t\t\tthis.db\n\t\t\t\t.insert(pkExampleTable)\n\t\t\t\t.values({ id: 1, name: 'John', email: 'john1@example.com' })\n\t\t\t\t.onConflictDoNothing({ target: [pkExampleTable.id, pkExampleTable.name] })\n\t\t\t\t.run();\n\n\t\t\tconst res = this.db\n\t\t\t\t.select({ id: pkExampleTable.id, name: pkExampleTable.name, email: pkExampleTable.email })\n\t\t\t\t.from(pkExampleTable)\n\t\t\t\t.where(eq(pkExampleTable.id, 1))\n\t\t\t\t.all();\n\n\t\t\texpect(res).deep.equal([{ id: 1, name: 'John', email: 'john@example.com' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertWithOnConflictDoNothingUsingCompositePkAsTarget error`);\n\t\t}\n\t}\n\n\tasync insertWithOnConflictDoUpdate(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.insert(usersTable).values({ id: 1, name: 'John' }).run();\n\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John' })\n\t\t\t\t.onConflictDoUpdate({ target: usersTable.id, set: { name: 'John1' } })\n\t\t\t\t.run();\n\n\t\t\tconst res = this.db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).where(\n\t\t\t\teq(usersTable.id, 1),\n\t\t\t).all();\n\n\t\t\texpect(res).deep.equal([{ id: 1, name: 'John1' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertWithOnConflictDoUpdate error`);\n\t\t}\n\t}\n\n\tasync insertWithOnConflictDoUpdateWhere(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ id: 1, name: 'John', verified: false }])\n\t\t\t\t.run();\n\n\t\t\tthis.db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John1', verified: true })\n\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\ttarget: usersTable.id,\n\t\t\t\t\tset: { name: 'John1', verified: true },\n\t\t\t\t\twhere: eq(usersTable.verified, false),\n\t\t\t\t})\n\t\t\t\t.run();\n\n\t\t\tconst res = this.db\n\t\t\t\t.select({ id: usersTable.id, name: usersTable.name, verified: usersTable.verified })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, 1))\n\t\t\t\t.all();\n\n\t\t\texpect(res).deep.equal([{ id: 1, name: 'John1', verified: true }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertWithOnConflictDoUpdateWhere error`);\n\t\t}\n\t}\n\n\tasync insertWithOnConflictDoUpdateUsingCompositePk(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.insert(pkExampleTable).values({ id: 1, name: 'John', email: 'john@example.com' }).run();\n\n\t\t\tthis.db\n\t\t\t\t.insert(pkExampleTable)\n\t\t\t\t.values({ id: 1, name: 'John', email: 'john@example.com' })\n\t\t\t\t.onConflictDoUpdate({ target: [pkExampleTable.id, pkExampleTable.name], set: { email: 'john1@example.com' } })\n\t\t\t\t.run();\n\n\t\t\tconst res = this.db\n\t\t\t\t.select({ id: pkExampleTable.id, name: pkExampleTable.name, email: pkExampleTable.email })\n\t\t\t\t.from(pkExampleTable)\n\t\t\t\t.where(eq(pkExampleTable.id, 1))\n\t\t\t\t.all();\n\n\t\t\texpect(res).deep.equal([{ id: 1, name: 'John', email: 'john1@example.com' }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`insertWithOnConflictDoUpdateUsingCompositePk error`);\n\t\t}\n\t}\n\n\tasync insertUndefined(): Promise<void> {\n\t\tconst users = sqliteTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tname: text('name'),\n\t\t});\n\n\t\tthis.db.run(sql`drop table if exists ${users}`);\n\n\t\tthis.db.run(\n\t\t\tsql`create table ${users} (id integer primary key, name text)`,\n\t\t);\n\n\t\texpect((() => {\n\t\t\tthis.db.insert(users).values({ name: undefined }).run();\n\t\t})()).not.throw();\n\n\t\tthis.db.run(sql`drop table ${users}`);\n\t}\n\n\tasync updateUndefined(): Promise<void> {\n\t\tconst users = sqliteTable('users', {\n\t\t\tid: integer('id').primaryKey(),\n\t\t\tname: text('name'),\n\t\t});\n\n\t\tthis.db.run(sql`drop table if exists ${users}`);\n\n\t\tthis.db.run(\n\t\t\tsql`create table ${users} (id integer primary key, name text)`,\n\t\t);\n\n\t\texpect((() => {\n\t\t\tthis.db.update(users).set({ name: undefined }).run();\n\t\t})()).throw();\n\t\texpect((() => {\n\t\t\tthis.db.update(users).set({ id: 1, name: undefined }).run();\n\t\t})()).not.throw();\n\n\t\tthis.db.run(sql`drop table ${users}`);\n\t}\n\n\tasync apiCRUD(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${users}`);\n\n\t\t\tthis.db.run(sql`create table ${users} (id integer primary key, name text)`);\n\n\t\t\tthis.db.insert(users).values({ id: 1, name: 'John' }).run();\n\n\t\t\tconst res = this.db.select().from(users).all();\n\n\t\t\texpect(res).deep.equal([{ id: 1, name: 'John' }]);\n\n\t\t\tthis.db.update(users).set({ name: 'John1' }).where(eq(users.id, 1)).all();\n\n\t\t\tconst res1 = this.db.select().from(users).all();\n\n\t\t\texpect(res1).deep.equal([{ id: 1, name: 'John1' }]);\n\n\t\t\tthis.db.delete(users).where(eq(users.id, 1)).run();\n\n\t\t\tconst res2 = this.db.select().from(users).all();\n\n\t\t\texpect(res2).deep.equal([]);\n\n\t\t\tthis.db.run(sql`drop table ${users}`);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`apiCRUD error`);\n\t\t}\n\t}\n\n\tasync apiInsertPlusSelectPreparePlusAsyncExecute(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${users}`);\n\n\t\t\tthis.db.run(sql`create table ${users} (id integer primary key, name text)`);\n\n\t\t\tconst insertStmt = this.db.insert(users).values({ id: 1, name: 'John' }).prepare();\n\t\t\tinsertStmt.execute().sync();\n\n\t\t\tconst selectStmt = this.db.select().from(users).prepare();\n\t\t\tconst res = selectStmt.execute().sync();\n\n\t\t\texpect(res).deep.equal([{ id: 1, name: 'John' }]);\n\n\t\t\tconst updateStmt = this.db.update(users).set({ name: 'John1' }).where(eq(users.id, 1)).prepare();\n\t\t\tupdateStmt.execute().sync();\n\n\t\t\tconst res1 = selectStmt.execute().sync();\n\n\t\t\texpect(res1).deep.equal([{ id: 1, name: 'John1' }]);\n\n\t\t\tconst deleteStmt = this.db.delete(users).where(eq(users.id, 1)).prepare();\n\t\t\tdeleteStmt.execute().sync();\n\n\t\t\tconst res2 = selectStmt.execute().sync();\n\n\t\t\texpect(res2).deep.equal([]);\n\n\t\t\tthis.db.run(sql`drop table ${users}`);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`apiInsertPlusSelectPreparePlusAsyncExecute error`);\n\t\t}\n\t}\n\n\tasync apiInsertSelectPreparePlusSyncExecute(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${users}`);\n\n\t\t\tthis.db.run(sql`create table ${users} (id integer primary key, name text)`);\n\n\t\t\tconst insertStmt = this.db.insert(users).values({ id: 1, name: 'John' }).prepare();\n\t\t\tinsertStmt.execute().sync();\n\n\t\t\tconst selectStmt = this.db.select().from(users).prepare();\n\t\t\tconst res = selectStmt.execute().sync();\n\n\t\t\texpect(res).deep.equal([{ id: 1, name: 'John' }]);\n\n\t\t\tconst updateStmt = this.db.update(users).set({ name: 'John1' }).where(eq(users.id, 1)).prepare();\n\t\t\tupdateStmt.execute().sync();\n\n\t\t\tconst res1 = selectStmt.execute().sync();\n\n\t\t\texpect(res1).deep.equal([{ id: 1, name: 'John1' }]);\n\n\t\t\tconst deleteStmt = this.db.delete(users).where(eq(users.id, 1)).prepare();\n\t\t\tdeleteStmt.execute().sync();\n\n\t\t\tconst res2 = selectStmt.execute().sync();\n\n\t\t\texpect(res2).deep.equal([]);\n\n\t\t\tthis.db.run(sql`drop table ${users}`);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`apiInsertSelectPreparePlusSyncExecute error`);\n\t\t}\n\t}\n\n\tasync selectPlusGetForEmptyResult(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${users}`);\n\n\t\t\tthis.db.run(sql`create table ${users} (id integer primary key, name text)`);\n\n\t\t\tconst res = this.db.select().from(users).where(eq(users.id, 1)).get();\n\n\t\t\texpect(res).eq(undefined);\n\n\t\t\tthis.db.run(sql`drop table ${users}`);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`selectPlusGetForEmptyResult error`);\n\t\t}\n\t}\n\n\tasync setOperationsUnionFromQueryBuilderWithSubquery(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tawait setupSetOperationTest(this.db);\n\n\t\t\tconst sq = this.db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.union(this.db.select({ id: users2Table.id, name: users2Table.name }).from(users2Table))\n\t\t\t\t.orderBy(asc(sql`name`))\n\t\t\t\t.as('sq');\n\n\t\t\tconst result = await this.db.select().from(sq).limit(5).offset(5);\n\n\t\t\texpect(result).length(5);\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 7, name: 'Mary' },\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 4, name: 'Peter' },\n\t\t\t\t{ id: 8, name: 'Sally' },\n\t\t\t]);\n\n\t\t\texpect(() => {\n\t\t\t\tthis.db\n\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t.from(citiesTable).union(\n\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t\t.from(users2Table),\n\t\t\t\t\t).orderBy(asc(sql`name`)).all();\n\t\t\t}).throw();\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`setOperationsUnionFromQueryBuilderWithSubquery error`);\n\t\t}\n\t}\n\n\tasync setOperationsUnionAsFunction(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tawait setupSetOperationTest(this.db);\n\n\t\t\tconst result = union(\n\t\t\t\tthis.db.select({ id: citiesTable.id, name: citiesTable.name }).from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tthis.db.select({ id: users2Table.id, name: users2Table.name }).from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tthis.db.select({ id: users2Table.id, name: users2Table.name }).from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).orderBy(asc(sql`name`)).all();\n\n\t\t\texpect(result).length(2);\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t]);\n\n\t\t\texpect(() => {\n\t\t\t\tunion(\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).orderBy(asc(sql`name`)).run();\n\t\t\t}).throw();\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`setOperationsUnionAsFunction error`);\n\t\t}\n\t}\n\n\tasync setOperationsUnionAllFromQueryBuilder(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tawait setupSetOperationTest(this.db);\n\n\t\t\tconst result = this.db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.unionAll(this.db.select({ id: citiesTable.id, name: citiesTable.name }).from(citiesTable))\n\t\t\t\t.orderBy(asc(citiesTable.id))\n\t\t\t\t.limit(5)\n\t\t\t\t.offset(1).all();\n\n\t\t\texpect(result).length(5);\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\texpect(() => {\n\t\t\t\tthis.db\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).unionAll(\n\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t\t.from(citiesTable),\n\t\t\t\t\t).orderBy(asc(citiesTable.id)).limit(5).offset(1).run();\n\t\t\t}).throw();\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`setOperationsUnionAllFromQueryBuilder error`);\n\t\t}\n\t}\n\n\tasync setOperationsUnionAllAsFunction(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tawait setupSetOperationTest(this.db);\n\n\t\t\tconst result = unionAll(\n\t\t\t\tthis.db.select({ id: citiesTable.id, name: citiesTable.name }).from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tthis.db.select({ id: users2Table.id, name: users2Table.name }).from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tthis.db.select({ id: users2Table.id, name: users2Table.name }).from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).all();\n\n\t\t\texpect(result).length(3);\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t]);\n\n\t\t\texpect(() => {\n\t\t\t\tunionAll(\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).run();\n\t\t\t}).throw();\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`setOperationsUnionAllAsFunction error`);\n\t\t}\n\t}\n\n\tasync setOperationsIntersectFromQueryBuilder(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tawait setupSetOperationTest(this.db);\n\n\t\t\tconst result = this.db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.intersect(\n\t\t\t\t\tthis.db.select({ id: citiesTable.id, name: citiesTable.name }).from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t)\n\t\t\t\t.orderBy(asc(sql`name`)).all();\n\n\t\t\texpect(result).length(2);\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\texpect(() => {\n\t\t\t\tthis.db\n\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t.from(citiesTable).intersect(\n\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t).orderBy(asc(sql`name`)).run();\n\t\t\t}).throw();\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`setOperationsIntersectFromQueryBuilder error`);\n\t\t}\n\t}\n\n\tasync setOperationsIntersectAsFunction(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tawait setupSetOperationTest(this.db);\n\n\t\t\tconst result = intersect(\n\t\t\t\tthis.db.select({ id: citiesTable.id, name: citiesTable.name }).from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tthis.db.select({ id: users2Table.id, name: users2Table.name }).from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tthis.db.select({ id: users2Table.id, name: users2Table.name }).from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).all();\n\n\t\t\texpect(result).length(0);\n\n\t\t\texpect(result).deep.equal([]);\n\n\t\t\texpect(() => {\n\t\t\t\tintersect(\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).run();\n\t\t\t}).throw();\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`setOperationsIntersectAsFunction error`);\n\t\t}\n\t}\n\n\tasync setOperationsExceptFromQueryBuilder(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tawait setupSetOperationTest(this.db);\n\n\t\t\tconst result = this.db\n\t\t\t\t.select()\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.except(this.db.select().from(citiesTable).where(gt(citiesTable.id, 1))).all();\n\n\t\t\texpect(result).length(1);\n\n\t\t\texpect(result).deep.equal([{ id: 1, name: 'New York' }]);\n\n\t\t\texpect(() => {\n\t\t\t\tthis.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(citiesTable).except(\n\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t);\n\t\t\t}).throw();\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`setOperationsExceptFromQueryBuilder error`);\n\t\t}\n\t}\n\n\tasync setOperationsExceptAsFunction(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tawait setupSetOperationTest(this.db);\n\n\t\t\tconst result = except(\n\t\t\t\tthis.db.select({ id: citiesTable.id, name: citiesTable.name }).from(citiesTable),\n\t\t\t\tthis.db.select({ id: citiesTable.id, name: citiesTable.name }).from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tthis.db.select({ id: users2Table.id, name: users2Table.name }).from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).orderBy(asc(sql`id`)).all();\n\n\t\t\texpect(result).length(2);\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\t\t\texpect(() => {\n\t\t\t\texcept(\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t.from(citiesTable),\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).orderBy(asc(sql`id`)).run();\n\t\t\t}).throw();\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`setOperationsExceptAsFunction error`);\n\t\t}\n\t}\n\n\tasync setOperationsMixedFromQueryBuilder(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tawait setupSetOperationTest(this.db);\n\n\t\t\tconst result = this.db\n\t\t\t\t.select()\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.except(({ unionAll }) =>\n\t\t\t\t\tunionAll(\n\t\t\t\t\t\tthis.db.select().from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t\tthis.db.select().from(citiesTable).where(eq(citiesTable.id, 2)),\n\t\t\t\t\t)\n\t\t\t\t).all();\n\n\t\t\texpect(result).length(2);\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t]);\n\n\t\t\texpect(() => {\n\t\t\t\tthis.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(citiesTable).except(\n\t\t\t\t\t\t({ unionAll }) =>\n\t\t\t\t\t\t\tunionAll(\n\t\t\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t\t\t.select()\n\t\t\t\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t\t\t\tthis.db.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 2)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t).run();\n\t\t\t}).throw();\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`setOperationsMixedFromQueryBuilder error`);\n\t\t}\n\t}\n\n\tasync setOperationsMixedAllAsFunctionWithSubquery(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tawait setupSetOperationTest(this.db);\n\n\t\t\tconst sq = union(\n\t\t\t\tthis.db.select({ id: users2Table.id, name: users2Table.name }).from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\texcept(\n\t\t\t\t\tthis.db.select({ id: users2Table.id, name: users2Table.name }).from(users2Table).where(\n\t\t\t\t\t\tgte(users2Table.id, 5),\n\t\t\t\t\t),\n\t\t\t\t\tthis.db.select({ id: users2Table.id, name: users2Table.name }).from(users2Table).where(eq(users2Table.id, 7)),\n\t\t\t\t),\n\t\t\t\tthis.db.select().from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t)\n\t\t\t\t.orderBy(asc(sql`id`))\n\t\t\t\t.as('sq');\n\n\t\t\tconst result = await this.db.select().from(sq).limit(4).offset(1);\n\n\t\t\texpect(result).length(4);\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t\t{ id: 5, name: 'Ben' },\n\t\t\t\t{ id: 6, name: 'Jill' },\n\t\t\t]);\n\n\t\t\texpect(() => {\n\t\t\t\tunion(\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\texcept(\n\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t\t.from(users2Table).where(gte(users2Table.id, 5)),\n\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 7)),\n\t\t\t\t\t),\n\t\t\t\t\tthis.db\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t).orderBy(asc(sql`id`)).run();\n\t\t\t}).throw();\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`setOperationsMixedAllAsFunctionWithSubquery error`);\n\t\t}\n\t}\n\n\tasync aggregateFunctionCount(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(this.db);\n\n\t\t\tconst result1 = await this.db.select({ value: count() }).from(table);\n\t\t\tconst result2 = await this.db.select({ value: count(table.a) }).from(table);\n\t\t\tconst result3 = await this.db.select({ value: countDistinct(table.name) }).from(table);\n\n\t\t\texpect(result1[0]?.value).eq(7);\n\t\t\texpect(result2[0]?.value).eq(5);\n\t\t\texpect(result3[0]?.value).eq(6);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`aggregateFunctionCount error`);\n\t\t}\n\t}\n\n\tasync aggregatFunctionAvg(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(this.db);\n\n\t\t\tconst result1 = await this.db.select({ value: avg(table.a) }).from(table);\n\t\t\tconst result2 = await this.db.select({ value: avg(table.nullOnly) }).from(table);\n\t\t\tconst result3 = await this.db.select({ value: avgDistinct(table.b) }).from(table);\n\n\t\t\texpect(result1[0]?.value).eq('24');\n\t\t\texpect(result2[0]?.value).eq(null);\n\t\t\texpect(result3[0]?.value).eq('42.5');\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`aggregatFunctionAvg error`);\n\t\t}\n\t}\n\n\tasync aggregateFunctionSum(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(this.db);\n\n\t\t\tconst result1 = await this.db.select({ value: sum(table.b) }).from(table);\n\t\t\tconst result2 = await this.db.select({ value: sum(table.nullOnly) }).from(table);\n\t\t\tconst result3 = await this.db.select({ value: sumDistinct(table.b) }).from(table);\n\n\t\t\texpect(result1[0]?.value).eq('200');\n\t\t\texpect(result2[0]?.value).eq(null);\n\t\t\texpect(result3[0]?.value).eq('170');\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`aggregateFunctionSum error`);\n\t\t}\n\t}\n\n\tasync aggregateFunctionMax(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(this.db);\n\n\t\t\tconst result1 = await this.db.select({ value: max(table.b) }).from(table);\n\t\t\tconst result2 = await this.db.select({ value: max(table.nullOnly) }).from(table);\n\n\t\t\texpect(result1[0]?.value).eq(90);\n\t\t\texpect(result2[0]?.value).eq(null);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`aggregateFunctionMax error`);\n\t\t}\n\t}\n\n\tasync aggregateFunctionMin(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(this.db);\n\n\t\t\tconst result1 = await this.db.select({ value: min(table.b) }).from(table);\n\t\t\tconst result2 = await this.db.select({ value: min(table.nullOnly) }).from(table);\n\n\t\t\texpect(result1[0]?.value).eq(10);\n\t\t\texpect(result2[0]?.value).eq(null);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`aggregateFunctionMin error`);\n\t\t}\n\t}\n\n\tasync test$onUpdateFnAnd$onUpdateWorksAs$default(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.run(sql`drop table if exists ${usersOnUpdate}`);\n\n\t\t\tthis.db.run(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${usersOnUpdate} (\n\t\t\t\t\tid integer primary key autoincrement,\n\t\t\t\t\tname text not null,\n\t\t\t\t\tupdate_counter integer default 1 not null,\n\t\t\t\t\tupdated_at integer,\n\t\t\t\t\talways_null text\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tthis.db\n\t\t\t\t.insert(usersOnUpdate)\n\t\t\t\t.values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jack' }, { name: 'Jill' }])\n\t\t\t\t.run();\n\t\t\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\n\t\t\tconst justDates = await this.db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\t\t\tconst response = await this.db\n\t\t\t\t.select({ ...rest })\n\t\t\t\t.from(usersOnUpdate)\n\t\t\t\t.orderBy(asc(usersOnUpdate.id));\n\n\t\t\texpect(response).deep.equal([\n\t\t\t\t{ name: 'John', id: 1, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jane', id: 2, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jack', id: 3, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jill', id: 4, updateCounter: 1, alwaysNull: null },\n\t\t\t]);\n\t\t\tconst msDelay = 250;\n\n\t\t\tfor (const eachUser of justDates) {\n\t\t\t\texpect(eachUser.updatedAt!.valueOf()).greaterThan(Date.now() - msDelay);\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`test$onUpdateFnAnd$onUpdateWorksAs$default error`);\n\t\t}\n\t}\n\n\tasync test$onUpdateFnAnd$onUpdateWorksUpdating(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tthis.db.run(sql`drop table if exists ${usersOnUpdate}`);\n\n\t\t\tthis.db.run(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${usersOnUpdate} (\n\t\t\t\t\tid integer primary key autoincrement,\n\t\t\t\t\tname text not null,\n\t\t\t\t\tupdate_counter integer default 1,\n\t\t\t\t\tupdated_at integer,\n\t\t\t\t\talways_null text\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait this.db\n\t\t\t\t.insert(usersOnUpdate)\n\t\t\t\t.values([{ name: 'John', alwaysNull: 'this will be null after updating' }, { name: 'Jane' }, { name: 'Jack' }, {\n\t\t\t\t\tname: 'Jill',\n\t\t\t\t}]);\n\t\t\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\n\t\t\tawait this.db.update(usersOnUpdate).set({ name: 'Angel' }).where(eq(usersOnUpdate.id, 1));\n\t\t\tawait this.db.update(usersOnUpdate).set({ updateCounter: null }).where(eq(usersOnUpdate.id, 2));\n\n\t\t\tconst justDates = await this.db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\t\t\tconst response = await this.db\n\t\t\t\t.select({ ...rest })\n\t\t\t\t.from(usersOnUpdate)\n\t\t\t\t.orderBy(asc(usersOnUpdate.id));\n\n\t\t\texpect(response).deep.equal([\n\t\t\t\t{ name: 'Angel', id: 1, updateCounter: 2, alwaysNull: null },\n\t\t\t\t{ name: 'Jane', id: 2, updateCounter: null, alwaysNull: null },\n\t\t\t\t{ name: 'Jack', id: 3, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jill', id: 4, updateCounter: 1, alwaysNull: null },\n\t\t\t]);\n\t\t\tconst msDelay = 250;\n\n\t\t\tfor (const eachUser of justDates) {\n\t\t\t\texpect(eachUser.updatedAt!.valueOf()).greaterThan(Date.now() - msDelay);\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`test$onUpdateFnAnd$onUpdateWorksUpdating error`);\n\t\t}\n\t}\n\n\tasync $countSeparate(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst countTestTable = sqliteTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${countTestTable}`);\n\t\t\tthis.db.run(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait this.db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await this.db.$count(countTestTable);\n\n\t\t\tthis.db.run(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).eq(4);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`$countSeparate error`);\n\t\t}\n\t}\n\n\tasync $countEmbedded(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst countTestTable = sqliteTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${countTestTable}`);\n\t\t\tthis.db.run(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait this.db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tcount: this.db.$count(countTestTable),\n\t\t\t\t})\n\t\t\t\t.from(countTestTable);\n\n\t\t\tthis.db.run(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).deep.equal([{ count: 4 }, { count: 4 }, { count: 4 }, { count: 4 }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`$countEmbedded error`);\n\t\t}\n\t}\n\n\tasync $countSeparateReuse(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst countTestTable = sqliteTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${countTestTable}`);\n\t\t\tthis.db.run(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait this.db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = this.db.$count(countTestTable);\n\n\t\t\tconst count1 = await count;\n\n\t\t\tawait this.db.insert(countTestTable).values({ id: 5, name: 'fifth' });\n\n\t\t\tconst count2 = await count;\n\n\t\t\tawait this.db.insert(countTestTable).values({ id: 6, name: 'sixth' });\n\n\t\t\tconst count3 = await count;\n\n\t\t\tthis.db.run(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count1).eq(4);\n\t\t\texpect(count2).eq(5);\n\t\t\texpect(count3).eq(6);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`$countSeparateReuse error`);\n\t\t}\n\t}\n\n\tasync $countEmbeddedReuse(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst countTestTable = sqliteTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${countTestTable}`);\n\t\t\tthis.db.run(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait this.db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = this.db\n\t\t\t\t.select({\n\t\t\t\t\tcount: this.db.$count(countTestTable),\n\t\t\t\t})\n\t\t\t\t.from(countTestTable);\n\n\t\t\tconst count1 = await count;\n\n\t\t\tawait this.db.insert(countTestTable).values({ id: 5, name: 'fifth' });\n\n\t\t\tconst count2 = await count;\n\n\t\t\tawait this.db.insert(countTestTable).values({ id: 6, name: 'sixth' });\n\n\t\t\tconst count3 = await count;\n\n\t\t\tthis.db.run(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count1).deep.equal([{ count: 4 }, { count: 4 }, { count: 4 }, { count: 4 }]);\n\t\t\texpect(count2).deep.equal([{ count: 5 }, { count: 5 }, { count: 5 }, { count: 5 }, { count: 5 }]);\n\t\t\texpect(count3).deep.equal([{ count: 6 }, { count: 6 }, { count: 6 }, { count: 6 }, { count: 6 }, { count: 6 }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`$countEmbeddedReuse error`);\n\t\t}\n\t}\n\n\tasync $countSeparateWithFilters(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst countTestTable = sqliteTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${countTestTable}`);\n\t\t\tthis.db.run(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait this.db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await this.db.$count(countTestTable, gt(countTestTable.id, 1));\n\n\t\t\tthis.db.run(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).deep.equal(3);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`$countSeparateWithFilters error`);\n\t\t}\n\t}\n\n\tasync $countEmbeddedWithFilters(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tconst countTestTable = sqliteTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tthis.db.run(sql`drop table if exists ${countTestTable}`);\n\t\t\tthis.db.run(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait this.db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tcount: this.db.$count(countTestTable, gt(countTestTable.id, 1)),\n\t\t\t\t})\n\t\t\t\t.from(countTestTable);\n\n\t\t\tawait this.db.run(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).deep.equal([{ count: 3 }, { count: 3 }, { count: 3 }, { count: 3 }]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`$countEmbeddedWithFilters error`);\n\t\t}\n\t}\n\n\tasync updateWithLimitAndOrderBy(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tawait this.db.insert(usersTable).values([\n\t\t\t\t{ name: 'Barry', verified: false },\n\t\t\t\t{ name: 'Alan', verified: false },\n\t\t\t\t{ name: 'Carl', verified: false },\n\t\t\t]);\n\n\t\t\tawait this.db.update(usersTable).set({ verified: true }).limit(2).orderBy(asc(usersTable.name));\n\n\t\t\tconst result = await this.db\n\t\t\t\t.select({ name: usersTable.name, verified: usersTable.verified })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.orderBy(asc(usersTable.name));\n\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ name: 'Alan', verified: true },\n\t\t\t\t{ name: 'Barry', verified: true },\n\t\t\t\t{ name: 'Carl', verified: false },\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`updateWithLimitAndOrderBy error`);\n\t\t}\n\t}\n\n\tasync deleteWithLimitAndOrderBy(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.beforeEach();\n\t\t\tawait this.db.insert(usersTable).values([\n\t\t\t\t{ name: 'Barry', verified: false },\n\t\t\t\t{ name: 'Alan', verified: false },\n\t\t\t\t{ name: 'Carl', verified: false },\n\t\t\t]);\n\n\t\t\tawait this.db.delete(usersTable).where(eq(usersTable.verified, false)).limit(1).orderBy(asc(usersTable.name));\n\n\t\t\tconst result = await this.db\n\t\t\t\t.select({ name: usersTable.name, verified: usersTable.verified })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.orderBy(asc(usersTable.name));\n\t\t\texpect(result).deep.equal([\n\t\t\t\t{ name: 'Barry', verified: false },\n\t\t\t\t{ name: 'Carl', verified: false },\n\t\t\t]);\n\t\t} catch (error: any) {\n\t\t\tconsole.error(error);\n\t\t\tthrow new Error(`deleteWithLimitAndOrderBy error`);\n\t\t}\n\t}\n}\n\nexport default {\n\t/**\n\t * This is the standard fetch handler for a Cloudflare Worker\n\t *\n\t * @param request - The request submitted to the Worker from the client\n\t * @param env - The interface to reference bindings declared in wrangler.toml\n\t * @param ctx - The execution context of the Worker\n\t * @returns The response to be sent back to the client\n\t */\n\tasync fetch(request, env): Promise<Response> {\n\t\ttry {\n\t\t\tconst id: DurableObjectId = env.MY_DURABLE_OBJECT.idFromName('durable-object');\n\t\t\tconst stub = env.MY_DURABLE_OBJECT.get(id);\n\n\t\t\tawait stub.migrate1();\n\n\t\t\tawait stub.insertBigIntValues();\n\n\t\t\tawait stub.selectAllFields();\n\t\t\tawait stub.selectPartial();\n\t\t\tawait stub.selectSql();\n\t\t\tawait stub.selectTypedSql();\n\t\t\tawait stub.selectWithEmptyArrayInInArray();\n\t\t\tawait stub.selectWithEmptyArrayInNotInArray();\n\t\t\tawait stub.selectDistinct();\n\t\t\tawait stub.returingSql();\n\t\t\tawait stub.$defaultFunction();\n\t\t\tawait stub.deleteReturningSql();\n\t\t\tawait stub.queryCheckInsertSingleEmptyRow();\n\t\t\tawait stub.queryCheckInsertMultipleEmptyRow();\n\t\t\tawait stub.insertAllDefaultsIn1Row();\n\t\t\tawait stub.insertAllDefaultsInMultipleRows();\n\t\t\tawait stub.updateReturningSql();\n\t\t\tawait stub.insertWithAutoIncrement();\n\t\t\tawait stub.insertDataWithDefaultValues();\n\t\t\tawait stub.insertDataWithOverridenDefaultValues();\n\t\t\tawait stub.updateWithReturningFields();\n\t\t\tawait stub.updateWithReturningPartial();\n\t\t\tawait stub.updateWithReturningAllFields();\n\t\t\tawait stub.deleteWithReturningPartial();\n\t\t\tawait stub.insertAndSelect();\n\n\t\t\tawait stub.jsonInsert();\n\t\t\tawait stub.insertMany();\n\t\t\tawait stub.insertManyWithReturning();\n\n\t\t\tawait stub.partialJoinWithAlias();\n\t\t\tawait stub.fullJoinWithAlias();\n\t\t\tawait stub.selectFromAlias();\n\t\t\tawait stub.insertWithSpaces();\n\t\t\tawait stub.preparedStatement();\n\t\t\tawait stub.preparedStatementReuse();\n\t\t\tawait stub.insertPlaceholdersOnColumnsWithEncoder();\n\t\t\tawait stub.preparedStatementWithPlaceholderInWhere();\n\t\t\tawait stub.preparedStatementWithPlaceholderInLimit();\n\t\t\tawait stub.preparedStatementWithPlaceholderInOffset();\n\t\t\tawait stub.preparedStatementBuiltUsing$dynamic();\n\n\t\t\tawait stub.selectWithGroupByAsField();\n\t\t\tawait stub.selectWithExists();\n\t\t\tawait stub.selectWithGroupByAsSql();\n\t\t\tawait stub.selectWithGroupByAsSqlPlusColumn();\n\t\t\tawait stub.selectWithGroupByAsColumnPlusSql();\n\t\t\tawait stub.selectWithGroupByComplexQuery();\n\t\t\tawait stub.buildQuery();\n\t\t\tawait stub.insertViaDbRunPlusSelectViaDbAll();\n\t\t\tawait stub.insertViaDbGet();\n\t\t\tawait stub.insertViaDbRunPlusSelectViaDbGet();\n\t\t\tawait stub.insertViaDbGetQueryBuilder();\n\t\t\tawait stub.joinSubquery();\n\t\t\tawait stub.withSelect();\n\t\t\tawait stub.withUpdate();\n\t\t\tawait stub.withInsert();\n\n\t\t\tawait stub.withDelete();\n\t\t\tawait stub.selectFromSubquerySql();\n\t\t\tawait stub.selectAFieldWithoutJoiningItsTable();\n\t\t\tawait stub.selectCount();\n\t\t\tawait stub.having();\n\t\t\tawait stub.insertNullTimestamp();\n\t\t\tawait stub.selectFromRawSql();\n\t\t\tawait stub.selectFromRawSqlWithJoins();\n\t\t\tawait stub.joinOnAliasedSqlFromSelect();\n\t\t\tawait stub.joinOnAliasedSqlFromWithClause();\n\t\t\tawait stub.prefixedTable();\n\t\t\tawait stub.orderByWithAliasedColumn();\n\t\t\tawait stub.transaction();\n\t\t\tawait stub.nestedTransaction();\n\t\t\tawait stub.joinSubqueryWithJoin();\n\t\t\tawait stub.joinViewAsSubquery();\n\t\t\tawait stub.insertWithOnConflictDoNothing();\n\t\t\tawait stub.insertWithOnConflictDoNothinUsingCompositePk();\n\t\t\tawait stub.insertWithOnConflictDoNothingUsingTarget();\n\t\t\tawait stub.insertWithOnConflictDoNothingUsingCompositePkAsTarget();\n\t\t\tawait stub.insertWithOnConflictDoUpdate();\n\t\t\tawait stub.insertWithOnConflictDoUpdateWhere();\n\t\t\tawait stub.insertWithOnConflictDoUpdateUsingCompositePk();\n\t\t\tawait stub.apiCRUD();\n\t\t\tawait stub.apiInsertPlusSelectPreparePlusAsyncExecute();\n\t\t\tawait stub.apiInsertSelectPreparePlusSyncExecute();\n\t\t\tawait stub.selectPlusGetForEmptyResult();\n\t\t\tawait stub.setOperationsUnionFromQueryBuilderWithSubquery();\n\t\t\tawait stub.setOperationsUnionAsFunction();\n\t\t\tawait stub.setOperationsUnionAllFromQueryBuilder();\n\t\t\tawait stub.setOperationsUnionAllAsFunction();\n\t\t\tawait stub.setOperationsIntersectFromQueryBuilder();\n\t\t\tawait stub.setOperationsIntersectAsFunction();\n\t\t\tawait stub.setOperationsExceptFromQueryBuilder();\n\t\t\tawait stub.setOperationsExceptAsFunction();\n\t\t\tawait stub.setOperationsMixedFromQueryBuilder();\n\t\t\tawait stub.setOperationsMixedAllAsFunctionWithSubquery();\n\t\t\tawait stub.aggregateFunctionCount();\n\t\t\tawait stub.aggregatFunctionAvg();\n\t\t\tawait stub.aggregateFunctionSum();\n\t\t\tawait stub.aggregateFunctionMax();\n\t\t\tawait stub.aggregateFunctionMin();\n\t\t\tawait stub.test$onUpdateFnAnd$onUpdateWorksAs$default();\n\t\t\tawait stub.test$onUpdateFnAnd$onUpdateWorksUpdating();\n\t\t\tawait stub.$countSeparate();\n\t\t\tawait stub.$countEmbedded();\n\t\t\tawait stub.$countEmbeddedReuse();\n\t\t\tawait stub.$countSeparateWithFilters();\n\t\t\tawait stub.$countEmbeddedWithFilters();\n\t\t\tawait stub.updateWithLimitAndOrderBy();\n\t\t\tawait stub.deleteWithLimitAndOrderBy();\n\t\t\tawait stub.updateUndefined();\n\t\t\tawait stub.insertUndefined();\n\n\t\t\treturn new Response();\n\t\t} catch (error: any) {\n\t\t\treturn new Response(error.message);\n\t\t}\n\t},\n} satisfies ExportedHandler<Env>;\n"
  },
  {
    "path": "integration-tests/tests/sqlite/durable-objects/worker-configuration.d.ts",
    "content": "// Generated by Wrangler by running `wrangler types`\n\ninterface Env {\n\tMY_DURABLE_OBJECT: DurableObjectNamespace<import('.').MyDurableObject>;\n}\n"
  },
  {
    "path": "integration-tests/tests/sqlite/durable-objects/wrangler.toml",
    "content": "#:schema node_modules/wrangler/config-schema.json\nname = \"sqlite-durable-objects\"\nmain = \"index.ts\"\ncompatibility_date = \"2024-11-12\"\ncompatibility_flags = [ \"nodejs_compat\" ]\n\n# Bind a Durable Object. Durable objects are a scale-to-zero compute primitive based on the actor model.\n# Durable Objects can live for as long as needed. Use these when you need a long-running \"server\", such as in realtime apps.\n# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#durable-objects\n[[durable_objects.bindings]]\nname = \"MY_DURABLE_OBJECT\"\nclass_name = \"MyDurableObject\"\n\n# Durable Object migrations.\n# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#migrations\n[[migrations]]\ntag = \"v1\"\nnew_sqlite_classes = [\"MyDurableObject\"]\n\n[[rules]] \ntype = \"Text\"\nglobs = [\"**/*.sql\"]\nfallthrough = true\n\n\n"
  },
  {
    "path": "integration-tests/tests/sqlite/libsql-batch.test.ts",
    "content": "import { createClient } from '@libsql/client';\nimport type { Client, ResultSet } from '@libsql/client';\nimport retry from 'async-retry';\nimport { eq, relations, sql } from 'drizzle-orm';\nimport { drizzle, type LibSQLDatabase } from 'drizzle-orm/libsql';\nimport type { AnySQLiteColumn } from 'drizzle-orm/sqlite-core';\nimport { integer, primaryKey, sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport { afterAll, beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\n\nconst ENABLE_LOGGING = false;\n\nexport const usersTable = sqliteTable('users', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tverified: integer('verified').notNull().default(0),\n\tinvitedBy: integer('invited_by').references((): AnySQLiteColumn => usersTable.id),\n});\nexport const usersConfig = relations(usersTable, ({ one, many }) => ({\n\tinvitee: one(usersTable, {\n\t\tfields: [usersTable.invitedBy],\n\t\treferences: [usersTable.id],\n\t}),\n\tusersToGroups: many(usersToGroupsTable),\n\tposts: many(postsTable),\n}));\n\nexport const groupsTable = sqliteTable('groups', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tdescription: text('description'),\n});\nexport const groupsConfig = relations(groupsTable, ({ many }) => ({\n\tusersToGroups: many(usersToGroupsTable),\n}));\n\nexport const usersToGroupsTable = sqliteTable(\n\t'users_to_groups',\n\t{\n\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\tuserId: integer('user_id', { mode: 'number' }).notNull().references(\n\t\t\t() => usersTable.id,\n\t\t),\n\t\tgroupId: integer('group_id', { mode: 'number' }).notNull().references(\n\t\t\t() => groupsTable.id,\n\t\t),\n\t},\n\t(t) => ({\n\t\tpk: primaryKey({ columns: [t.userId, t.groupId] }),\n\t}),\n);\nexport const usersToGroupsConfig = relations(usersToGroupsTable, ({ one }) => ({\n\tgroup: one(groupsTable, {\n\t\tfields: [usersToGroupsTable.groupId],\n\t\treferences: [groupsTable.id],\n\t}),\n\tuser: one(usersTable, {\n\t\tfields: [usersToGroupsTable.userId],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n\nexport const postsTable = sqliteTable('posts', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcontent: text('content').notNull(),\n\townerId: integer('owner_id', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tcreatedAt: integer('created_at', { mode: 'timestamp_ms' })\n\t\t.notNull().default(sql`current_timestamp`),\n});\nexport const postsConfig = relations(postsTable, ({ one, many }) => ({\n\tauthor: one(usersTable, {\n\t\tfields: [postsTable.ownerId],\n\t\treferences: [usersTable.id],\n\t}),\n\tcomments: many(commentsTable),\n}));\n\nexport const commentsTable = sqliteTable('comments', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcontent: text('content').notNull(),\n\tcreator: integer('creator', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tpostId: integer('post_id', { mode: 'number' }).references(() => postsTable.id),\n\tcreatedAt: integer('created_at', { mode: 'timestamp_ms' })\n\t\t.notNull().default(sql`current_timestamp`),\n});\nexport const commentsConfig = relations(commentsTable, ({ one, many }) => ({\n\tpost: one(postsTable, {\n\t\tfields: [commentsTable.postId],\n\t\treferences: [postsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentsTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n\tlikes: many(commentLikesTable),\n}));\n\nexport const commentLikesTable = sqliteTable('comment_likes', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcreator: integer('creator', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tcommentId: integer('comment_id', { mode: 'number' }).references(\n\t\t() => commentsTable.id,\n\t),\n\tcreatedAt: integer('created_at', { mode: 'timestamp_ms' })\n\t\t.notNull().default(sql`current_timestamp`),\n});\nexport const commentLikesConfig = relations(commentLikesTable, ({ one }) => ({\n\tcomment: one(commentsTable, {\n\t\tfields: [commentLikesTable.commentId],\n\t\treferences: [commentsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentLikesTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n\nconst schema = {\n\tusersTable,\n\tpostsTable,\n\tcommentsTable,\n\tusersToGroupsTable,\n\tgroupsTable,\n\tcommentLikesConfig,\n\tcommentsConfig,\n\tpostsConfig,\n\tusersToGroupsConfig,\n\tgroupsConfig,\n\tusersConfig,\n};\n\nlet db: LibSQLDatabase<typeof schema>;\nlet client: Client;\n\nbeforeAll(async () => {\n\tconst url = process.env['LIBSQL_URL'];\n\tconst authToken = process.env['LIBSQL_AUTH_TOKEN'];\n\tif (!url) {\n\t\tthrow new Error('LIBSQL_URL is not set');\n\t}\n\tclient = await retry(async () => {\n\t\tclient = createClient({ url, authToken });\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.close();\n\t\t},\n\t});\n\tdb = drizzle(client, { schema, logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\t// client?.close();\n});\n\nbeforeEach(async () => {\n\tawait db.run(sql`drop table if exists \\`groups\\``);\n\tawait db.run(sql`drop table if exists \\`users\\``);\n\tawait db.run(sql`drop table if exists \\`users_to_groups\\``);\n\tawait db.run(sql`drop table if exists \\`posts\\``);\n\tawait db.run(sql`drop table if exists \\`comments\\``);\n\tawait db.run(sql`drop table if exists \\`comment_likes\\``);\n\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`users\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`name\\` text NOT NULL,\n\t\t\t    \\`verified\\` integer DEFAULT 0 NOT NULL,\n\t\t\t    \\`invited_by\\` integer\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`groups\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`name\\` text NOT NULL,\n\t\t\t    \\`description\\` text\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`users_to_groups\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`user_id\\` integer NOT NULL,\n\t\t\t    \\`group_id\\` integer NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`posts\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`content\\` text NOT NULL,\n\t\t\t    \\`owner_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`comments\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`content\\` text NOT NULL,\n\t\t\t    \\`creator\\` integer,\n\t\t\t    \\`post_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`comment_likes\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`creator\\` integer,\n\t\t\t    \\`comment_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n});\n\nafterAll(async () => {\n\tawait db.run(sql`drop table if exists \\`groups\\``);\n\tawait db.run(sql`drop table if exists \\`users\\``);\n\tawait db.run(sql`drop table if exists \\`users_to_groups\\``);\n\tawait db.run(sql`drop table if exists \\`posts\\``);\n\tawait db.run(sql`drop table if exists \\`comments\\``);\n\tawait db.run(sql`drop table if exists \\`comment_likes\\``);\n\n\tclient.close();\n});\n\ntest('batch api example', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({\n\t\t\tid: usersTable.id,\n\t\t\tinvitedBy: usersTable.invitedBy,\n\t\t}),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.select().from(usersTable),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\tResultSet,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t]>();\n\n\texpect(batchResponse.length).eq(3);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t\tinvitedBy: null,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ columnTypes: [], columns: [], rows: [], rowsAffected: 1, lastInsertRowid: 2n });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n});\n\n// batch api only relational many\ntest('insert + findMany', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.query.usersTable.findMany({}),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tResultSet,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t]>();\n\n\texpect(batchResponse.length).eq(3);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ columnTypes: [], columns: [], rows: [], rowsAffected: 1, lastInsertRowid: 2n });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n});\n\n// batch api relational many + one\ntest('insert + findMany + findFirst', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.query.usersTable.findMany({}),\n\t\tdb.query.usersTable.findFirst({}),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tResultSet,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t} | undefined,\n\t]>();\n\n\texpect(batchResponse.length).eq(4);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ columnTypes: [], columns: [], rows: [], rowsAffected: 1, lastInsertRowid: 2n });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[3]).toEqual(\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t);\n});\n\ntest('insert + db.all + db.get + db.values + db.run', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.run(sql`insert into users (id, name) values (2, 'Dan')`),\n\t\tdb.all<typeof usersTable.$inferSelect>(sql`select * from users`),\n\t\tdb.values(sql`select * from users`),\n\t\tdb.get<typeof usersTable.$inferSelect>(sql`select * from users`),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tResultSet,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\tunknown[][],\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t},\n\t]>();\n\n\texpect(batchResponse.length).eq(5);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ columnTypes: [], columns: [], rows: [], rowsAffected: 1, lastInsertRowid: 2n });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invited_by: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invited_by: null },\n\t]);\n\n\texpect(batchResponse[3].map((row) => Array.prototype.slice.call(row))).toEqual([\n\t\t[1, 'John', 0, null],\n\t\t[2, 'Dan', 0, null],\n\t]);\n\n\texpect(batchResponse[4]).toEqual(\n\t\t{ id: 1, name: 'John', verified: 0, invited_by: null },\n\t);\n});\n\n// batch api combined rqb + raw call\ntest('insert + findManyWith + db.all', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.query.usersTable.findMany({}),\n\t\tdb.all<typeof usersTable.$inferSelect>(sql`select * from users`),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tResultSet,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t]>();\n\n\texpect(batchResponse.length).eq(4);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ columnTypes: [], columns: [], rows: [], rowsAffected: 1, lastInsertRowid: 2n });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[3]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invited_by: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invited_by: null },\n\t]);\n});\n\n// batch api for insert + update + select\ntest('insert + update + select + select partial', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.update(usersTable).set({ name: 'Dan' }).where(eq(usersTable.id, 1)),\n\t\tdb.query.usersTable.findMany({}),\n\t\tdb.select().from(usersTable).where(eq(usersTable.id, 1)),\n\t\tdb.select({ id: usersTable.id, invitedBy: usersTable.invitedBy }).from(usersTable),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tResultSet,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t]>();\n\n\texpect(batchResponse.length).eq(5);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ columnTypes: [], columns: [], rows: [], rowsAffected: 1, lastInsertRowid: 1n });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[3]).toEqual([\n\t\t{ id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[4]).toEqual([\n\t\t{ id: 1, invitedBy: null },\n\t]);\n});\n\n// batch api for insert + delete + select\ntest('insert + delete + select + select partial', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.delete(usersTable).where(eq(usersTable.id, 1)).returning({ id: usersTable.id, invitedBy: usersTable.invitedBy }),\n\t\tdb.query.usersTable.findFirst({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tinvitedBy: true,\n\t\t\t},\n\t\t}),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tResultSet,\n\t\t{\n\t\t\tid: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tinvitedBy: number | null;\n\t\t} | undefined,\n\t]>();\n\n\texpect(batchResponse.length).eq(4);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ columnTypes: [], columns: [], rows: [], rowsAffected: 1, lastInsertRowid: 2n });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[3]).toEqual(\n\t\t{ id: 2, invitedBy: null },\n\t);\n});\n"
  },
  {
    "path": "integration-tests/tests/sqlite/libsql-http.test.ts",
    "content": "import { type Client, createClient } from '@libsql/client/http';\nimport retry from 'async-retry';\nimport { asc, eq, getTableColumns, sql } from 'drizzle-orm';\nimport type { LibSQLDatabase } from 'drizzle-orm/libsql';\nimport { drizzle } from 'drizzle-orm/libsql/http';\nimport { migrate } from 'drizzle-orm/libsql/migrator';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { randomString } from '~/utils';\nimport { anotherUsersMigratorTable, tests, usersMigratorTable, usersOnUpdate } from './sqlite-common';\n\nconst ENABLE_LOGGING = false;\n\nlet db: LibSQLDatabase;\nlet client: Client;\n\nbeforeAll(async () => {\n\tconst url = process.env['LIBSQL_REMOTE_URL'];\n\tconst authToken = process.env['LIBSQL_REMOTE_TOKEN'];\n\tif (!url) {\n\t\tthrow new Error('LIBSQL_REMOTE_URL is not set');\n\t}\n\tclient = await retry(async () => {\n\t\tclient = createClient({ url, authToken });\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.close();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tclient?.close();\n});\n\nbeforeEach((ctx) => {\n\tctx.sqlite = {\n\t\tdb,\n\t};\n});\n\ntest('migrator', async () => {\n\tawait db.run(sql`drop table if exists another_users`);\n\tawait db.run(sql`drop table if exists users12`);\n\tawait db.run(sql`drop table if exists __drizzle_migrations`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/sqlite' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result = await db.select().from(usersMigratorTable).all();\n\n\tawait db.insert(anotherUsersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result2 = await db.select().from(anotherUsersMigratorTable).all();\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\texpect(result2).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.run(sql`drop table another_users`);\n\tawait db.run(sql`drop table users12`);\n\tawait db.run(sql`drop table __drizzle_migrations`);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.run(sql`drop table if exists another_users`);\n\tawait db.run(sql`drop table if exists users12`);\n\tawait db.run(sql`drop table if exists ${sql.identifier(customTable)}`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/sqlite', migrationsTable: customTable });\n\n\t// test if the custom migrations table was created\n\tconst res = await db.all(sql`select * from ${sql.identifier(customTable)};`);\n\texpect(res.length > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.run(sql`drop table another_users`);\n\tawait db.run(sql`drop table users12`);\n\tawait db.run(sql`drop table ${sql.identifier(customTable)}`);\n});\n\ntest('test $onUpdateFn and $onUpdate works as $default', async (ctx) => {\n\tconst { db } = ctx.sqlite;\n\n\tawait db.run(sql`drop table if exists ${usersOnUpdate}`);\n\n\tawait db.run(\n\t\tsql`\n\t\t\tcreate table ${usersOnUpdate} (\n\t\t\tid integer primary key autoincrement,\n\t\t\tname text not null,\n\t\t\tupdate_counter integer default 1 not null,\n\t\t\tupdated_at integer,\n\t\t\talways_null text\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.insert(usersOnUpdate).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Jack' },\n\t\t{ name: 'Jill' },\n\t]);\n\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\n\tconst justDates = await db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\tconst response = await db.select({ ...rest }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\texpect(response).toEqual([\n\t\t{ name: 'John', id: 1, updateCounter: 1, alwaysNull: null },\n\t\t{ name: 'Jane', id: 2, updateCounter: 1, alwaysNull: null },\n\t\t{ name: 'Jack', id: 3, updateCounter: 1, alwaysNull: null },\n\t\t{ name: 'Jill', id: 4, updateCounter: 1, alwaysNull: null },\n\t]);\n\tconst msDelay = 1750;\n\n\tfor (const eachUser of justDates) {\n\t\texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t}\n});\n\ntest('test $onUpdateFn and $onUpdate works updating', async (ctx) => {\n\tconst { db } = ctx.sqlite;\n\n\tawait db.run(sql`drop table if exists ${usersOnUpdate}`);\n\n\tawait db.run(\n\t\tsql`\n\t\t\tcreate table ${usersOnUpdate} (\n\t\t\tid integer primary key autoincrement,\n\t\t\tname text not null,\n\t\t\tupdate_counter integer default 1,\n\t\t\tupdated_at integer,\n\t\t\talways_null text\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.insert(usersOnUpdate).values([\n\t\t{ name: 'John', alwaysNull: 'this will be null after updating' },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Jack' },\n\t\t{ name: 'Jill' },\n\t]);\n\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\n\tawait db.update(usersOnUpdate).set({ name: 'Angel' }).where(eq(usersOnUpdate.id, 1));\n\tawait db.update(usersOnUpdate).set({ updateCounter: null }).where(eq(usersOnUpdate.id, 2));\n\n\tconst justDates = await db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\tconst response = await db.select({ ...rest }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\texpect(response).toEqual([\n\t\t{ name: 'Angel', id: 1, updateCounter: 2, alwaysNull: null },\n\t\t{ name: 'Jane', id: 2, updateCounter: null, alwaysNull: null },\n\t\t{ name: 'Jack', id: 3, updateCounter: 1, alwaysNull: null },\n\t\t{ name: 'Jill', id: 4, updateCounter: 1, alwaysNull: null },\n\t]);\n\tconst msDelay = 1750;\n\n\tfor (const eachUser of justDates) {\n\t\texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t}\n});\n\nskipTests([\n\t'delete with limit and order by',\n\t'update with limit and order by',\n\t'test $onUpdateFn and $onUpdate works as $default',\n\t'test $onUpdateFn and $onUpdate works updating',\n]);\n\ntests();\n"
  },
  {
    "path": "integration-tests/tests/sqlite/libsql-node.test.ts",
    "content": "import { type Client, createClient } from '@libsql/client/node';\nimport retry from 'async-retry';\nimport { sql } from 'drizzle-orm';\nimport type { LibSQLDatabase } from 'drizzle-orm/libsql';\nimport { migrate } from 'drizzle-orm/libsql/migrator';\nimport { drizzle } from 'drizzle-orm/libsql/node';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { randomString } from '~/utils';\nimport { anotherUsersMigratorTable, tests, usersMigratorTable } from './sqlite-common';\n\nconst ENABLE_LOGGING = false;\n\nlet db: LibSQLDatabase;\nlet client: Client;\n\nbeforeAll(async () => {\n\tconst url = process.env['LIBSQL_URL'];\n\tconst authToken = process.env['LIBSQL_AUTH_TOKEN'];\n\tif (!url) {\n\t\tthrow new Error('LIBSQL_URL is not set');\n\t}\n\tclient = await retry(async () => {\n\t\tclient = createClient({ url, authToken });\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.close();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tclient?.close();\n});\n\nbeforeEach((ctx) => {\n\tctx.sqlite = {\n\t\tdb,\n\t};\n});\n\ntest('migrator', async () => {\n\tawait db.run(sql`drop table if exists another_users`);\n\tawait db.run(sql`drop table if exists users12`);\n\tawait db.run(sql`drop table if exists __drizzle_migrations`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/sqlite' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result = await db.select().from(usersMigratorTable).all();\n\n\tawait db.insert(anotherUsersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result2 = await db.select().from(anotherUsersMigratorTable).all();\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\texpect(result2).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.run(sql`drop table another_users`);\n\tawait db.run(sql`drop table users12`);\n\tawait db.run(sql`drop table __drizzle_migrations`);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.run(sql`drop table if exists another_users`);\n\tawait db.run(sql`drop table if exists users12`);\n\tawait db.run(sql`drop table if exists ${sql.identifier(customTable)}`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/sqlite', migrationsTable: customTable });\n\n\t// test if the custom migrations table was created\n\tconst res = await db.all(sql`select * from ${sql.identifier(customTable)};`);\n\texpect(res.length > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.run(sql`drop table another_users`);\n\tawait db.run(sql`drop table users12`);\n\tawait db.run(sql`drop table ${sql.identifier(customTable)}`);\n});\n\nskipTests([\n\t'delete with limit and order by',\n\t'update with limit and order by',\n]);\n\ntests();\n"
  },
  {
    "path": "integration-tests/tests/sqlite/libsql-sqlite3.test.ts",
    "content": "import { type Client, createClient } from '@libsql/client/sqlite3';\nimport retry from 'async-retry';\nimport { sql } from 'drizzle-orm';\nimport type { LibSQLDatabase } from 'drizzle-orm/libsql';\nimport { migrate } from 'drizzle-orm/libsql/migrator';\nimport { drizzle } from 'drizzle-orm/libsql/sqlite3';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { randomString } from '~/utils';\nimport { anotherUsersMigratorTable, tests, usersMigratorTable } from './sqlite-common';\n\nconst ENABLE_LOGGING = false;\n\nlet db: LibSQLDatabase;\nlet client: Client;\n\nbeforeAll(async () => {\n\tconst url = ':memory:';\n\tclient = await retry(async () => {\n\t\tclient = createClient({ url });\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.close();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tclient?.close();\n});\n\nbeforeEach((ctx) => {\n\tctx.sqlite = {\n\t\tdb,\n\t};\n});\n\ntest('migrator', async () => {\n\tawait db.run(sql`drop table if exists another_users`);\n\tawait db.run(sql`drop table if exists users12`);\n\tawait db.run(sql`drop table if exists __drizzle_migrations`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/sqlite' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result = await db.select().from(usersMigratorTable).all();\n\n\tawait db.insert(anotherUsersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result2 = await db.select().from(anotherUsersMigratorTable).all();\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\texpect(result2).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.run(sql`drop table another_users`);\n\tawait db.run(sql`drop table users12`);\n\tawait db.run(sql`drop table __drizzle_migrations`);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.run(sql`drop table if exists another_users`);\n\tawait db.run(sql`drop table if exists users12`);\n\tawait db.run(sql`drop table if exists ${sql.identifier(customTable)}`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/sqlite', migrationsTable: customTable });\n\n\t// test if the custom migrations table was created\n\tconst res = await db.all(sql`select * from ${sql.identifier(customTable)};`);\n\texpect(res.length > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.run(sql`drop table another_users`);\n\tawait db.run(sql`drop table users12`);\n\tawait db.run(sql`drop table ${sql.identifier(customTable)}`);\n});\n\nskipTests([\n\t'delete with limit and order by',\n\t'update with limit and order by',\n\t'transaction',\n\t'transaction rollback',\n\t'nested transaction',\n\t'nested transaction rollback',\n]);\n\ntests();\n"
  },
  {
    "path": "integration-tests/tests/sqlite/libsql-ws.test.ts",
    "content": "import { type Client, createClient } from '@libsql/client/ws';\nimport retry from 'async-retry';\nimport { asc, eq, getTableColumns, sql } from 'drizzle-orm';\nimport type { LibSQLDatabase } from 'drizzle-orm/libsql';\nimport { migrate } from 'drizzle-orm/libsql/migrator';\nimport { drizzle } from 'drizzle-orm/libsql/ws';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { randomString } from '~/utils';\nimport { anotherUsersMigratorTable, tests, usersMigratorTable, usersOnUpdate } from './sqlite-common';\n\nconst ENABLE_LOGGING = false;\n\nlet db: LibSQLDatabase;\nlet client: Client;\n\nbeforeAll(async () => {\n\tconst url = process.env['LIBSQL_REMOTE_URL'];\n\tconst authToken = process.env['LIBSQL_REMOTE_TOKEN'];\n\tif (!url) {\n\t\tthrow new Error('LIBSQL_REMOTE_URL is not set');\n\t}\n\tclient = await retry(async () => {\n\t\tclient = createClient({ url, authToken });\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.close();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n});\n\nafterAll(async () => {\n\tclient?.close();\n});\n\nbeforeEach((ctx) => {\n\tctx.sqlite = {\n\t\tdb,\n\t};\n});\n\ntest('migrator', async () => {\n\tawait db.run(sql`drop table if exists another_users`);\n\tawait db.run(sql`drop table if exists users12`);\n\tawait db.run(sql`drop table if exists __drizzle_migrations`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/sqlite' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result = await db.select().from(usersMigratorTable).all();\n\n\tawait db.insert(anotherUsersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result2 = await db.select().from(anotherUsersMigratorTable).all();\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\texpect(result2).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.run(sql`drop table another_users`);\n\tawait db.run(sql`drop table users12`);\n\tawait db.run(sql`drop table __drizzle_migrations`);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.run(sql`drop table if exists another_users`);\n\tawait db.run(sql`drop table if exists users12`);\n\tawait db.run(sql`drop table if exists ${sql.identifier(customTable)}`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/sqlite', migrationsTable: customTable });\n\n\t// test if the custom migrations table was created\n\tconst res = await db.all(sql`select * from ${sql.identifier(customTable)};`);\n\texpect(res.length > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.run(sql`drop table another_users`);\n\tawait db.run(sql`drop table users12`);\n\tawait db.run(sql`drop table ${sql.identifier(customTable)}`);\n});\n\ntest('test $onUpdateFn and $onUpdate works as $default', async (ctx) => {\n\tconst { db } = ctx.sqlite;\n\n\tawait db.run(sql`drop table if exists ${usersOnUpdate}`);\n\n\tawait db.run(\n\t\tsql`\n\t\t\tcreate table ${usersOnUpdate} (\n\t\t\tid integer primary key autoincrement,\n\t\t\tname text not null,\n\t\t\tupdate_counter integer default 1 not null,\n\t\t\tupdated_at integer,\n\t\t\talways_null text\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.insert(usersOnUpdate).values([\n\t\t{ name: 'John' },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Jack' },\n\t\t{ name: 'Jill' },\n\t]);\n\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\n\tconst justDates = await db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\tconst response = await db.select({ ...rest }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\texpect(response).toEqual([\n\t\t{ name: 'John', id: 1, updateCounter: 1, alwaysNull: null },\n\t\t{ name: 'Jane', id: 2, updateCounter: 1, alwaysNull: null },\n\t\t{ name: 'Jack', id: 3, updateCounter: 1, alwaysNull: null },\n\t\t{ name: 'Jill', id: 4, updateCounter: 1, alwaysNull: null },\n\t]);\n\tconst msDelay = 1250;\n\n\tfor (const eachUser of justDates) {\n\t\texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t}\n});\n\ntest('test $onUpdateFn and $onUpdate works updating', async (ctx) => {\n\tconst { db } = ctx.sqlite;\n\n\tawait db.run(sql`drop table if exists ${usersOnUpdate}`);\n\n\tawait db.run(\n\t\tsql`\n\t\t\tcreate table ${usersOnUpdate} (\n\t\t\tid integer primary key autoincrement,\n\t\t\tname text not null,\n\t\t\tupdate_counter integer default 1,\n\t\t\tupdated_at integer,\n\t\t\talways_null text\n\t\t\t)\n\t\t`,\n\t);\n\n\tawait db.insert(usersOnUpdate).values([\n\t\t{ name: 'John', alwaysNull: 'this will be null after updating' },\n\t\t{ name: 'Jane' },\n\t\t{ name: 'Jack' },\n\t\t{ name: 'Jill' },\n\t]);\n\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\n\tawait db.update(usersOnUpdate).set({ name: 'Angel' }).where(eq(usersOnUpdate.id, 1));\n\tawait db.update(usersOnUpdate).set({ updateCounter: null }).where(eq(usersOnUpdate.id, 2));\n\n\tconst justDates = await db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\tconst response = await db.select({ ...rest }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\texpect(response).toEqual([\n\t\t{ name: 'Angel', id: 1, updateCounter: 2, alwaysNull: null },\n\t\t{ name: 'Jane', id: 2, updateCounter: null, alwaysNull: null },\n\t\t{ name: 'Jack', id: 3, updateCounter: 1, alwaysNull: null },\n\t\t{ name: 'Jill', id: 4, updateCounter: 1, alwaysNull: null },\n\t]);\n\tconst msDelay = 1250;\n\n\tfor (const eachUser of justDates) {\n\t\texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t}\n});\n\nskipTests([\n\t'delete with limit and order by',\n\t'update with limit and order by',\n\t'join view as subquery',\n\t'test $onUpdateFn and $onUpdate works as $default',\n\t'test $onUpdateFn and $onUpdate works updating',\n\t'prepared statement reuse',\n]);\n\ntests();\n"
  },
  {
    "path": "integration-tests/tests/sqlite/libsql.test.ts",
    "content": "import { type Client, createClient } from '@libsql/client';\nimport retry from 'async-retry';\nimport { sql } from 'drizzle-orm';\nimport { drizzle, type LibSQLDatabase } from 'drizzle-orm/libsql';\nimport { migrate } from 'drizzle-orm/libsql/migrator';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { randomString } from '~/utils';\nimport { anotherUsersMigratorTable, tests, usersMigratorTable } from './sqlite-common';\nimport { TestCache, TestGlobalCache, tests as cacheTests } from './sqlite-common-cache';\n\nconst ENABLE_LOGGING = false;\n\nlet db: LibSQLDatabase;\nlet dbGlobalCached: LibSQLDatabase;\nlet cachedDb: LibSQLDatabase;\nlet client: Client;\n\nbeforeAll(async () => {\n\tconst url = process.env['LIBSQL_URL'];\n\tconst authToken = process.env['LIBSQL_AUTH_TOKEN'];\n\tif (!url) {\n\t\tthrow new Error('LIBSQL_URL is not set');\n\t}\n\tclient = await retry(async () => {\n\t\tclient = createClient({ url, authToken });\n\t\treturn client;\n\t}, {\n\t\tretries: 20,\n\t\tfactor: 1,\n\t\tminTimeout: 250,\n\t\tmaxTimeout: 250,\n\t\trandomize: false,\n\t\tonRetry() {\n\t\t\tclient?.close();\n\t\t},\n\t});\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n\tcachedDb = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestCache() });\n\tdbGlobalCached = drizzle(client, { logger: ENABLE_LOGGING, cache: new TestGlobalCache() });\n});\n\nafterAll(async () => {\n\tclient?.close();\n});\n\nbeforeEach((ctx) => {\n\tctx.sqlite = {\n\t\tdb,\n\t};\n\tctx.cachedSqlite = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\ntest('migrator', async () => {\n\tawait db.run(sql`drop table if exists another_users`);\n\tawait db.run(sql`drop table if exists users12`);\n\tawait db.run(sql`drop table if exists __drizzle_migrations`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/sqlite' });\n\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result = await db.select().from(usersMigratorTable).all();\n\n\tawait db.insert(anotherUsersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result2 = await db.select().from(anotherUsersMigratorTable).all();\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\texpect(result2).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.run(sql`drop table another_users`);\n\tawait db.run(sql`drop table users12`);\n\tawait db.run(sql`drop table __drizzle_migrations`);\n});\n\ntest('migrator : migrate with custom table', async () => {\n\tconst customTable = randomString();\n\tawait db.run(sql`drop table if exists another_users`);\n\tawait db.run(sql`drop table if exists users12`);\n\tawait db.run(sql`drop table if exists ${sql.identifier(customTable)}`);\n\n\tawait migrate(db, { migrationsFolder: './drizzle2/sqlite', migrationsTable: customTable });\n\n\t// test if the custom migrations table was created\n\tconst res = await db.all(sql`select * from ${sql.identifier(customTable)};`);\n\texpect(res.length > 0).toBeTruthy();\n\n\t// test if the migrated table are working as expected\n\tawait db.insert(usersMigratorTable).values({ name: 'John', email: 'email' });\n\tconst result = await db.select().from(usersMigratorTable);\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tawait db.run(sql`drop table another_users`);\n\tawait db.run(sql`drop table users12`);\n\tawait db.run(sql`drop table ${sql.identifier(customTable)}`);\n});\n\nskipTests([\n\t'delete with limit and order by',\n\t'update with limit and order by',\n]);\n\ncacheTests();\ntests();\n"
  },
  {
    "path": "integration-tests/tests/sqlite/sql-js.test.ts",
    "content": "import { sql } from 'drizzle-orm';\nimport type { SQLJsDatabase } from 'drizzle-orm/sql-js';\nimport { drizzle } from 'drizzle-orm/sql-js';\nimport { migrate } from 'drizzle-orm/sql-js/migrator';\nimport type { Database } from 'sql.js';\nimport initSqlJs from 'sql.js';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { anotherUsersMigratorTable, tests, usersMigratorTable } from './sqlite-common';\n\nconst ENABLE_LOGGING = false;\n\nlet db: SQLJsDatabase;\nlet client: Database;\n\nbeforeAll(async () => {\n\tconst SQL = await initSqlJs();\n\tclient = new SQL.Database();\n\tdb = drizzle(client, { logger: ENABLE_LOGGING });\n});\n\nbeforeEach((ctx) => {\n\tctx.sqlite = {\n\t\tdb,\n\t};\n});\n\nafterAll(async () => {\n\tclient?.close();\n});\n\ntest('migrator', async () => {\n\tdb.run(sql`drop table if exists another_users`);\n\tdb.run(sql`drop table if exists users12`);\n\tdb.run(sql`drop table if exists __drizzle_migrations`);\n\n\tmigrate(db, { migrationsFolder: './drizzle2/sqlite' });\n\n\tdb.insert(usersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result = db.select().from(usersMigratorTable).all();\n\n\tdb.insert(anotherUsersMigratorTable).values({ name: 'John', email: 'email' }).run();\n\tconst result2 = db.select().from(anotherUsersMigratorTable).all();\n\n\texpect(result).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\texpect(result2).toEqual([{ id: 1, name: 'John', email: 'email' }]);\n\n\tdb.run(sql`drop table another_users`);\n\tdb.run(sql`drop table users12`);\n\tdb.run(sql`drop table __drizzle_migrations`);\n});\n\nskipTests([\n\t/**\n\t * doesn't work properly:\n\t * \tExpect: should rollback transaction and don't insert/ update data\n\t * \tReceived: data inserted/ updated\n\t */\n\t'transaction rollback',\n\t'nested transaction rollback',\n\t'delete with limit and order by',\n\t'update with limit and order by',\n]);\ntests();\n"
  },
  {
    "path": "integration-tests/tests/sqlite/sqlite-common-cache.ts",
    "content": "import { eq, getTableName, is, sql, Table } from 'drizzle-orm';\nimport type { MutationOption } from 'drizzle-orm/cache/core';\nimport { Cache } from 'drizzle-orm/cache/core';\nimport type { CacheConfig } from 'drizzle-orm/cache/core/types';\nimport { alias, type BaseSQLiteDatabase, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport Keyv from 'keyv';\nimport { beforeEach, describe, expect, test, vi } from 'vitest';\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nexport class TestGlobalCache extends Cache {\n\tprivate globalTtl: number = 1000;\n\tprivate usedTablesPerKey: Record<string, string[]> = {};\n\n\tconstructor(private kv: Keyv = new Keyv()) {\n\t\tsuper();\n\t}\n\n\toverride strategy(): 'explicit' | 'all' {\n\t\treturn 'all';\n\t}\n\toverride async get(key: string, _tables: string[], _isTag: boolean): Promise<any[] | undefined> {\n\t\tconst res = await this.kv.get(key) ?? undefined;\n\t\treturn res;\n\t}\n\toverride async put(\n\t\tkey: string,\n\t\tresponse: any,\n\t\ttables: string[],\n\t\tisTag: boolean,\n\t\tconfig?: CacheConfig,\n\t): Promise<void> {\n\t\tawait this.kv.set(key, response, config ? config.ex : this.globalTtl);\n\t\tfor (const table of tables) {\n\t\t\tconst keys = this.usedTablesPerKey[table];\n\t\t\tif (keys === undefined) {\n\t\t\t\tthis.usedTablesPerKey[table] = [key];\n\t\t\t} else {\n\t\t\t\tkeys.push(key);\n\t\t\t}\n\t\t}\n\t}\n\toverride async onMutate(params: MutationOption): Promise<void> {\n\t\tconst tagsArray = params.tags ? Array.isArray(params.tags) ? params.tags : [params.tags] : [];\n\t\tconst tablesArray = params.tables ? Array.isArray(params.tables) ? params.tables : [params.tables] : [];\n\n\t\tconst keysToDelete = new Set<string>();\n\n\t\tfor (const table of tablesArray) {\n\t\t\tconst tableName = is(table, Table) ? getTableName(table) : table as string;\n\t\t\tconst keys = this.usedTablesPerKey[tableName] ?? [];\n\t\t\tfor (const key of keys) keysToDelete.add(key);\n\t\t}\n\n\t\tif (keysToDelete.size > 0 || tagsArray.length > 0) {\n\t\t\tfor (const tag of tagsArray) {\n\t\t\t\tawait this.kv.delete(tag);\n\t\t\t}\n\n\t\t\tfor (const key of keysToDelete) {\n\t\t\t\tawait this.kv.delete(key);\n\t\t\t\tfor (const table of tablesArray) {\n\t\t\t\t\tconst tableName = is(table, Table) ? getTableName(table) : table as string;\n\t\t\t\t\tthis.usedTablesPerKey[tableName] = [];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nexport class TestCache extends TestGlobalCache {\n\toverride strategy(): 'explicit' | 'all' {\n\t\treturn 'explicit';\n\t}\n}\n\ndeclare module 'vitest' {\n\tinterface TestContext {\n\t\tcachedSqlite: {\n\t\t\tdb: BaseSQLiteDatabase<any, any>;\n\t\t\tdbGlobalCached: BaseSQLiteDatabase<any, any>;\n\t\t};\n\t\tsqlite: {\n\t\t\tdb: BaseSQLiteDatabase<'async' | 'sync', any, Record<string, never>>;\n\t\t};\n\t}\n}\n\nconst usersTable = sqliteTable('users', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tverified: integer('verified', { mode: 'boolean' }).notNull().default(false),\n\tjsonb: text('jsonb', { mode: 'json' }).$type<string[]>(),\n\tcreatedAt: integer('created_at', { mode: 'timestamp' }),\n});\n\nconst postsTable = sqliteTable('posts', {\n\tid: integer().primaryKey({ autoIncrement: true }),\n\tdescription: text().notNull(),\n\tuserId: integer('user_id').references(() => usersTable.id),\n});\n\nexport function tests() {\n\tdescribe('common_cache', () => {\n\t\tbeforeEach(async (ctx) => {\n\t\t\tconst { db, dbGlobalCached } = ctx.cachedSqlite;\n\t\t\tawait db.run(sql`drop table if exists users`);\n\t\t\tawait db.run(sql`drop table if exists posts`);\n\t\t\tawait db.$cache?.invalidate({ tables: 'users' });\n\t\t\tawait dbGlobalCached.$cache?.invalidate({ tables: 'users' });\n\t\t\t// public users\n\t\t\tawait db.run(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table users (\n\t\t\t\t\t\tid integer primary key AUTOINCREMENT,\n\t\t\t\t\t\tname text not null,\n\t\t\t\t\t\tverified integer not null default 0,\n\t\t\t\t\t\tjsonb text,\n\t\t\t\t\t\tcreated_at integer\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.run(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table posts (\n\t\t\t\t\t\tid integer primary key AUTOINCREMENT,\n\t\t\t\t\t\tdescription text not null,\n\t\t\t\t\t\tuser_id int\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\t\t});\n\n\t\ttest('test force invalidate', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedSqlite;\n\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'invalidate');\n\t\t\tawait db.$cache?.invalidate({ tables: 'users' });\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t\t});\n\n\t\ttest('default global config - no cache should be hit', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedSqlite;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('default global config + enable cache on select: get, put', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedSqlite;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache();\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('default global config + enable cache on select + write: get, put, onMutate', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedSqlite;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ config: { ex: 1 } });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tspyPut.mockClear();\n\t\t\tspyGet.mockClear();\n\t\t\tspyInvalidate.mockClear();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t\t});\n\n\t\ttest('default global config + enable cache on select + disable invalidate: get, put', async (ctx) => {\n\t\t\tconst { db } = ctx.cachedSqlite;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ tag: 'custom', autoInvalidate: false, config: { ex: 1 } });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\t// invalidate force\n\t\t\tawait db.$cache?.invalidate({ tags: ['custom'] });\n\t\t});\n\n\t\ttest('global: true + disable cache', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedSqlite;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache(false);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('global: true - cache should be hit', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedSqlite;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('global: true - cache: false on select - no cache hit', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedSqlite;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache(false);\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\t\t});\n\n\t\ttest('global: true - disable invalidate - cache hit + no invalidate', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedSqlite;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ autoInvalidate: false });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tspyPut.mockClear();\n\t\t\tspyGet.mockClear();\n\t\t\tspyInvalidate.mockClear();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(0);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(1);\n\t\t});\n\n\t\ttest('global: true - with custom tag', async (ctx) => {\n\t\t\tconst { dbGlobalCached: db } = ctx.cachedSqlite;\n\n\t\t\t// @ts-expect-error\n\t\t\tconst spyPut = vi.spyOn(db.$cache, 'put');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyGet = vi.spyOn(db.$cache, 'get');\n\t\t\t// @ts-expect-error\n\t\t\tconst spyInvalidate = vi.spyOn(db.$cache, 'onMutate');\n\n\t\t\tawait db.select().from(usersTable).$withCache({ tag: 'custom', autoInvalidate: false });\n\n\t\t\texpect(spyPut).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyGet).toHaveBeenCalledTimes(1);\n\t\t\texpect(spyInvalidate).toHaveBeenCalledTimes(0);\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' });\n\n\t\t\t// invalidate force\n\t\t\tawait db.$cache?.invalidate({ tags: ['custom'] });\n\t\t});\n\n\t\t// check select used tables\n\t\ttest('check simple select used tables', (ctx) => {\n\t\t\tconst { db } = ctx.cachedSqlite;\n\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(usersTable).getUsedTables()).toStrictEqual(['users']);\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(sql`${usersTable}`).getUsedTables()).toStrictEqual(['users']);\n\t\t});\n\t\t// check select+join used tables\n\t\ttest('select+join', (ctx) => {\n\t\t\tconst { db } = ctx.cachedSqlite;\n\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(usersTable).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).getUsedTables())\n\t\t\t\t.toStrictEqual(['users', 'posts']);\n\t\t\texpect(\n\t\t\t\t// @ts-expect-error\n\t\t\t\tdb.select().from(sql`${usersTable}`).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).getUsedTables(),\n\t\t\t).toStrictEqual(['users', 'posts']);\n\t\t});\n\t\t// check select+2join used tables\n\t\ttest('select+2joins', (ctx) => {\n\t\t\tconst { db } = ctx.cachedSqlite;\n\n\t\t\texpect(\n\t\t\t\tdb.select().from(usersTable).leftJoin(\n\t\t\t\t\tpostsTable,\n\t\t\t\t\teq(usersTable.id, postsTable.userId),\n\t\t\t\t).leftJoin(\n\t\t\t\t\talias(postsTable, 'post2'),\n\t\t\t\t\teq(usersTable.id, postsTable.userId),\n\t\t\t\t)\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t.getUsedTables(),\n\t\t\t)\n\t\t\t\t.toStrictEqual(['users', 'posts']);\n\t\t\texpect(\n\t\t\t\tdb.select().from(sql`${usersTable}`).leftJoin(postsTable, eq(usersTable.id, postsTable.userId)).leftJoin(\n\t\t\t\t\talias(postsTable, 'post2'),\n\t\t\t\t\teq(usersTable.id, postsTable.userId),\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t).getUsedTables(),\n\t\t\t).toStrictEqual(['users', 'posts']);\n\t\t});\n\t\t// select subquery used tables\n\t\ttest('select+join', (ctx) => {\n\t\t\tconst { db } = ctx.cachedSqlite;\n\n\t\t\tconst sq = db.select().from(usersTable).where(eq(usersTable.id, 42)).as('sq');\n\n\t\t\t// @ts-expect-error\n\t\t\texpect(db.select().from(sq).getUsedTables()).toStrictEqual(['users']);\n\t\t});\n\t});\n}\n"
  },
  {
    "path": "integration-tests/tests/sqlite/sqlite-common.ts",
    "content": "import {\n\tand,\n\tasc,\n\tavg,\n\tavgDistinct,\n\tcount,\n\tcountDistinct,\n\teq,\n\texists,\n\tgetTableColumns,\n\tgt,\n\tgte,\n\tinArray,\n\tlt,\n\tmax,\n\tmin,\n\tName,\n\tnotInArray,\n\tsql,\n\tsum,\n\tsumDistinct,\n\tTransactionRollbackError,\n} from 'drizzle-orm';\nimport {\n\talias,\n\ttype BaseSQLiteDatabase,\n\tblob,\n\texcept,\n\tforeignKey,\n\tgetTableConfig,\n\tgetViewConfig,\n\tindex,\n\tint,\n\tinteger,\n\tintersect,\n\tnumeric,\n\tprimaryKey,\n\treal,\n\tsqliteTable,\n\tsqliteTableCreator,\n\tsqliteView,\n\ttext,\n\tunion,\n\tunionAll,\n\tunique,\n\tuniqueKeyName,\n} from 'drizzle-orm/sqlite-core';\nimport { beforeEach, describe, expect, expectTypeOf, test } from 'vitest';\nimport type { Equal } from '~/utils';\nimport { Expect } from '~/utils';\n\ndeclare module 'vitest' {\n\tinterface TestContext {\n\t\tsqlite: {\n\t\t\tdb: BaseSQLiteDatabase<'async' | 'sync', any, Record<string, never>>;\n\t\t};\n\t}\n}\n\nconst allTypesTable = sqliteTable('all_types', {\n\tint: integer('int', {\n\t\tmode: 'number',\n\t}),\n\tbool: integer('bool', {\n\t\tmode: 'boolean',\n\t}),\n\ttime: integer('time', {\n\t\tmode: 'timestamp',\n\t}),\n\ttimeMs: integer('time_ms', {\n\t\tmode: 'timestamp_ms',\n\t}),\n\tbigint: blob('bigint', {\n\t\tmode: 'bigint',\n\t}),\n\tbuffer: blob('buffer', {\n\t\tmode: 'buffer',\n\t}),\n\tjson: blob('json', {\n\t\tmode: 'json',\n\t}),\n\tnumeric: numeric('numeric'),\n\tnumericNum: numeric('numeric_num', {\n\t\tmode: 'number',\n\t}),\n\tnumericBig: numeric('numeric_big', {\n\t\tmode: 'bigint',\n\t}),\n\treal: real('real'),\n\ttext: text('text', {\n\t\tmode: 'text',\n\t}),\n\tjsonText: text('json_text', {\n\t\tmode: 'json',\n\t}),\n});\n\nexport const usersTable = sqliteTable('users', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: integer('verified', { mode: 'boolean' }).notNull().default(false),\n\tjson: blob('json', { mode: 'json' }).$type<string[]>(),\n\tcreatedAt: integer('created_at', { mode: 'timestamp' }).notNull().default(sql`strftime('%s', 'now')`),\n});\n\nexport const usersOnUpdate = sqliteTable('users_on_update', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tupdateCounter: integer('update_counter').default(sql`1`).$onUpdateFn(() => sql`update_counter + 1`),\n\tupdatedAt: integer('updated_at', { mode: 'timestamp_ms' }).$onUpdate(() => new Date()),\n\talwaysNull: text('always_null').$type<string | null>().$onUpdate(() => null),\n\t// uppercaseName: text('uppercase_name').$onUpdateFn(() =>\n\t// \tsql`upper(s.name)`\n\t// ),  This doesn't seem to be supported in sqlite\n});\n\nexport const users2Table = sqliteTable('users2', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcityId: integer('city_id').references(() => citiesTable.id),\n});\n\nexport const citiesTable = sqliteTable('cities', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nconst coursesTable = sqliteTable('courses', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tcategoryId: integer('category_id').references(() => courseCategoriesTable.id),\n});\n\nconst courseCategoriesTable = sqliteTable('course_categories', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n});\n\nconst orders = sqliteTable('orders', {\n\tid: integer('id').primaryKey(),\n\tregion: text('region').notNull(),\n\tproduct: text('product').notNull().$default(() => 'random_string'),\n\tamount: integer('amount').notNull(),\n\tquantity: integer('quantity').notNull(),\n});\n\nexport const usersMigratorTable = sqliteTable('users12', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n});\n\nexport const anotherUsersMigratorTable = sqliteTable('another_users', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n});\n\nconst pkExampleTable = sqliteTable('pk_example', {\n\tid: integer('id').notNull(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n\tcompositePk: primaryKey({ columns: [table.id, table.name] }),\n}));\n\nconst conflictChainExampleTable = sqliteTable('conflict_chain_example', {\n\tid: integer('id').notNull().unique(),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n\tcompositePk: primaryKey({ columns: [table.id, table.name] }),\n}));\n\nconst bigIntExample = sqliteTable('big_int_example', {\n\tid: integer('id').primaryKey(),\n\tname: text('name').notNull(),\n\tbigInt: blob('big_int', { mode: 'bigint' }).notNull(),\n});\n\n// To test aggregate functions\nconst aggregateTable = sqliteTable('aggregate_table', {\n\tid: integer('id').primaryKey({ autoIncrement: true }).notNull(),\n\tname: text('name').notNull(),\n\ta: integer('a'),\n\tb: integer('b'),\n\tc: integer('c'),\n\tnullOnly: integer('null_only'),\n});\n\nexport function tests() {\n\tdescribe('common', () => {\n\t\tbeforeEach(async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.run(sql`drop table if exists ${usersTable}`);\n\t\t\tawait db.run(sql`drop table if exists ${users2Table}`);\n\t\t\tawait db.run(sql`drop table if exists ${citiesTable}`);\n\t\t\tawait db.run(sql`drop table if exists ${coursesTable}`);\n\t\t\tawait db.run(sql`drop table if exists ${courseCategoriesTable}`);\n\t\t\tawait db.run(sql`drop table if exists ${orders}`);\n\t\t\tawait db.run(sql`drop table if exists ${bigIntExample}`);\n\t\t\tawait db.run(sql`drop table if exists ${pkExampleTable}`);\n\t\t\tawait db.run(sql`drop table if exists ${conflictChainExampleTable}`);\n\t\t\tawait db.run(sql`drop table if exists ${allTypesTable}`);\n\t\t\tawait db.run(sql`drop table if exists user_notifications_insert_into`);\n\t\t\tawait db.run(sql`drop table if exists users_insert_into`);\n\t\t\tawait db.run(sql`drop table if exists notifications_insert_into`);\n\n\t\t\tawait db.run(sql`\n\t\t\t\tcreate table ${usersTable} (\n\t\t\t\t\tid integer primary key,\n\t\t\t\t\tname text not null,\n\t\t\t\t\tverified integer not null default 0,\n\t\t\t\t\tjson blob,\n\t\t\t\t\tcreated_at integer not null default (strftime('%s', 'now'))\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.run(sql`\n\t\t\t\tcreate table ${citiesTable} (\n\t\t\t\t\tid integer primary key,\n\t\t\t\t\tname text not null\n\t\t\t\t)\n\t\t\t`);\n\t\t\tawait db.run(sql`\n\t\t\t\tcreate table ${courseCategoriesTable} (\n\t\t\t\t\tid integer primary key,\n\t\t\t\t\tname text not null\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.run(sql`\n\t\t\t\tcreate table ${users2Table} (\n\t\t\t\t\tid integer primary key,\n\t\t\t\t\tname text not null,\n\t\t\t\t\tcity_id integer references ${citiesTable}(${sql.identifier(citiesTable.id.name)})\n\t\t\t\t)\n\t\t\t`);\n\t\t\tawait db.run(sql`\n\t\t\t\tcreate table ${coursesTable} (\n\t\t\t\t\tid integer primary key,\n\t\t\t\t\tname text not null,\n\t\t\t\t\tcategory_id integer references ${courseCategoriesTable}(${sql.identifier(courseCategoriesTable.id.name)})\n\t\t\t\t)\n\t\t\t`);\n\t\t\tawait db.run(sql`\n\t\t\t\tcreate table ${orders} (\n\t\t\t\t\tid integer primary key,\n\t\t\t\t\tregion text not null,\n\t\t\t\t\tproduct text not null,\n\t\t\t\t\tamount integer not null,\n\t\t\t\t\tquantity integer not null\n\t\t\t\t)\n\t\t\t`);\n\t\t\tawait db.run(sql`\n\t\t\t\tcreate table ${pkExampleTable} (\n\t\t\t\t\tid integer not null,\n\t\t\t\t\tname text not null,\n\t\t\t\t\temail text not null,\n\t\t\t\t\tprimary key (id, name)\n\t\t\t\t)\n\t\t\t`);\n\t\t\tawait db.run(sql`\n\t\t\t\tcreate table ${conflictChainExampleTable} (\n\t\t\t\t\tid integer not null unique,\n\t\t\t\t\tname text not null,\n\t\t\t\t\temail text not null,\n\t\t\t\t\tprimary key (id, name)\n\t\t\t\t)\n\t\t\t`);\n\t\t\tawait db.run(sql`\n\t\t\t\tcreate table ${bigIntExample} (\n\t\t\t\t  id integer primary key,\n\t\t\t\t  name text not null,\n\t\t\t\t  big_int blob not null\n\t\t\t\t)\n\t\t\t`);\n\t\t});\n\n\t\tasync function setupSetOperationTest(db: BaseSQLiteDatabase<any, any>) {\n\t\t\tawait db.run(sql`drop table if exists users2`);\n\t\t\tawait db.run(sql`drop table if exists cities`);\n\t\t\tawait db.run(sql`\n\t\t\t\tcreate table \\`cities\\` (\n\t\t\t\t    id integer primary key,\n\t\t\t\t    name text not null\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.run(sql`\n\t\t\t\tcreate table \\`users2\\` (\n\t\t\t\t    id integer primary key,\n\t\t\t\t    name text not null,\n\t\t\t\t    city_id integer references ${citiesTable}(${sql.identifier(citiesTable.id.name)})\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.insert(citiesTable).values([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t{ id: 2, name: 'Jane', cityId: 2 },\n\t\t\t\t{ id: 3, name: 'Jack', cityId: 3 },\n\t\t\t\t{ id: 4, name: 'Peter', cityId: 3 },\n\t\t\t\t{ id: 5, name: 'Ben', cityId: 2 },\n\t\t\t\t{ id: 6, name: 'Jill', cityId: 1 },\n\t\t\t\t{ id: 7, name: 'Mary', cityId: 2 },\n\t\t\t\t{ id: 8, name: 'Sally', cityId: 1 },\n\t\t\t]);\n\t\t}\n\n\t\tasync function setupAggregateFunctionsTest(db: BaseSQLiteDatabase<any, any>) {\n\t\t\tawait db.run(sql`drop table if exists \"aggregate_table\"`);\n\t\t\tawait db.run(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table \"aggregate_table\" (\n\t\t\t\t\t    \"id\" integer primary key autoincrement not null,\n\t\t\t\t\t    \"name\" text not null,\n\t\t\t\t\t    \"a\" integer,\n\t\t\t\t\t    \"b\" integer,\n\t\t\t\t\t    \"c\" integer,\n\t\t\t\t\t    \"null_only\" integer\n\t\t\t\t\t);\n\t\t\t\t`,\n\t\t\t);\n\t\t\tawait db.insert(aggregateTable).values([\n\t\t\t\t{ name: 'value 1', a: 5, b: 10, c: 20 },\n\t\t\t\t{ name: 'value 1', a: 5, b: 20, c: 30 },\n\t\t\t\t{ name: 'value 2', a: 10, b: 50, c: 60 },\n\t\t\t\t{ name: 'value 3', a: 20, b: 20, c: null },\n\t\t\t\t{ name: 'value 4', a: null, b: 90, c: 120 },\n\t\t\t\t{ name: 'value 5', a: 80, b: 10, c: null },\n\t\t\t\t{ name: 'value 6', a: null, b: null, c: 150 },\n\t\t\t]);\n\t\t}\n\n\t\ttest('table config: foreign keys name', async () => {\n\t\t\tconst table = sqliteTable('cities', {\n\t\t\t\tid: int('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstate: text('state'),\n\t\t\t}, (t) => ({\n\t\t\t\tf: foreignKey({ foreignColumns: [t.id], columns: [t.id], name: 'custom_fk' }),\n\t\t\t\tf1: foreignKey({ foreignColumns: [t.id], columns: [t.id], name: 'custom_fk_deprecated' }),\n\t\t\t}));\n\n\t\t\tconst tableConfig = getTableConfig(table);\n\n\t\t\texpect(tableConfig.foreignKeys).toHaveLength(2);\n\t\t\texpect(tableConfig.foreignKeys[0]!.getName()).toBe('custom_fk');\n\t\t\texpect(tableConfig.foreignKeys[1]!.getName()).toBe('custom_fk_deprecated');\n\t\t});\n\n\t\ttest('table config: primary keys name', async () => {\n\t\t\tconst table = sqliteTable('cities', {\n\t\t\t\tid: int('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tstate: text('state'),\n\t\t\t}, (t) => ({\n\t\t\t\tf: primaryKey({ columns: [t.id, t.name], name: 'custom_pk' }),\n\t\t\t}));\n\n\t\t\tconst tableConfig = getTableConfig(table);\n\n\t\t\texpect(tableConfig.primaryKeys).toHaveLength(1);\n\t\t\texpect(tableConfig.primaryKeys[0]!.getName()).toBe('custom_pk');\n\t\t});\n\n\t\ttest('insert bigint values', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(bigIntExample).values({ name: 'one', bigInt: BigInt('0') }).run();\n\t\t\tawait db.insert(bigIntExample).values({ name: 'two', bigInt: BigInt('127') }).run();\n\t\t\tawait db.insert(bigIntExample).values({ name: 'three', bigInt: BigInt('32767') }).run();\n\t\t\tawait db.insert(bigIntExample).values({ name: 'four', bigInt: BigInt('1234567890') }).run();\n\t\t\tawait db.insert(bigIntExample).values({ name: 'five', bigInt: BigInt('12345678900987654321') }).run();\n\n\t\t\tconst result = await db.select().from(bigIntExample).all();\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'one', bigInt: BigInt('0') },\n\t\t\t\t{ id: 2, name: 'two', bigInt: BigInt('127') },\n\t\t\t\t{ id: 3, name: 'three', bigInt: BigInt('32767') },\n\t\t\t\t{ id: 4, name: 'four', bigInt: BigInt('1234567890') },\n\t\t\t\t{ id: 5, name: 'five', bigInt: BigInt('12345678900987654321') },\n\t\t\t]);\n\t\t});\n\n\t\ttest('select all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst now = Date.now();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst result = await db.select().from(usersTable).all();\n\t\t\texpect(result[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\texpect(Math.abs(result[0]!.createdAt.getTime() - now)).toBeLessThan(5000);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, json: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('select partial', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable).all();\n\n\t\t\texpect(result).toEqual([{ name: 'John' }]);\n\t\t});\n\n\t\ttest('select sql', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = await db.select({\n\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t}).from(usersTable).all();\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('select typed sql', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = await db.select({\n\t\t\t\tname: sql<string>`upper(${usersTable.name})`,\n\t\t\t}).from(usersTable).all();\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('select with empty array in inArray', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(inArray(usersTable.id, []));\n\n\t\t\texpect(result).toEqual([]);\n\t\t});\n\n\t\ttest('select with empty array in notInArray', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(notInArray(usersTable.id, []));\n\n\t\t\texpect(result).toEqual([{ name: 'JOHN' }, { name: 'JANE' }, { name: 'JANE' }]);\n\t\t});\n\n\t\ttest('select distinct', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst usersDistinctTable = sqliteTable('users_distinct', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${usersDistinctTable}`);\n\t\t\tawait db.run(sql`create table ${usersDistinctTable} (id integer, name text)`);\n\n\t\t\tawait db.insert(usersDistinctTable).values([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'John' },\n\t\t\t\t{ id: 1, name: 'Jane' },\n\t\t\t]).run();\n\t\t\tconst users = await db.selectDistinct().from(usersDistinctTable).orderBy(\n\t\t\t\tusersDistinctTable.id,\n\t\t\t\tusersDistinctTable.name,\n\t\t\t).all();\n\n\t\t\tawait db.run(sql`drop table ${usersDistinctTable}`);\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane' }, { id: 1, name: 'John' }, { id: 2, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = await db.insert(usersTable).values({ name: 'John' }).returning({\n\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t}).all();\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('$default function', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(orders).values({ id: 1, region: 'Ukraine', amount: 1, quantity: 1 });\n\t\t\tconst selectedOrder = await db.select().from(orders);\n\n\t\t\texpect(selectedOrder).toEqual([{\n\t\t\t\tid: 1,\n\t\t\t\tamount: 1,\n\t\t\t\tquantity: 1,\n\t\t\t\tregion: 'Ukraine',\n\t\t\t\tproduct: 'random_string',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('delete returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning({\n\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t}).all();\n\n\t\t\texpect(users).toEqual([{ name: 'JOHN' }]);\n\t\t});\n\n\t\ttest('query check: insert single empty row', (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tconst query = db\n\t\t\t\t.insert(users)\n\t\t\t\t.values({})\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql: 'insert into \"users\" (\"id\", \"name\", \"state\") values (null, ?, null)',\n\t\t\t\tparams: ['Dan'],\n\t\t\t});\n\t\t});\n\n\t\ttest('query check: insert multiple empty rows', (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tconst query = db\n\t\t\t\t.insert(users)\n\t\t\t\t.values([{}, {}])\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql: 'insert into \"users\" (\"id\", \"name\", \"state\") values (null, ?, null), (null, ?, null)',\n\t\t\t\tparams: ['Dan', 'Dan'],\n\t\t\t});\n\t\t});\n\n\t\ttest('Insert all defaults in 1 row', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('empty_insert_single', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.run(\n\t\t\t\tsql`create table ${users} (id integer primary key, name text default 'Dan', state text)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values({}).run();\n\n\t\t\tconst res = await db.select().from(users).all();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'Dan', state: null }]);\n\t\t});\n\n\t\ttest('Insert all defaults in multiple rows', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('empty_insert_multiple', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').default('Dan'),\n\t\t\t\tstate: text('state'),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.run(\n\t\t\t\tsql`create table ${users} (id integer primary key, name text default 'Dan', state text)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values([{}, {}]).run();\n\n\t\t\tconst res = await db.select().from(users).all();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'Dan', state: null }, { id: 2, name: 'Dan', state: null }]);\n\t\t});\n\n\t\ttest('update returning sql', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning({\n\t\t\t\tname: sql`upper(${usersTable.name})`,\n\t\t\t}).all();\n\n\t\t\texpect(users).toEqual([{ name: 'JANE' }]);\n\t\t});\n\n\t\ttest('insert with auto increment', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'George' },\n\t\t\t\t{ name: 'Austin' },\n\t\t\t]).run();\n\t\t\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).all();\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 2, name: 'Jane' },\n\t\t\t\t{ id: 3, name: 'George' },\n\t\t\t\t{ id: 4, name: 'Austin' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('insert with default values', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst result = await db.select().from(usersTable).all();\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: false, json: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('insert with overridden default values', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John', verified: true }).run();\n\t\t\tconst result = await db.select().from(usersTable).all();\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', verified: true, json: null, createdAt: result[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('update with returning all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst now = Date.now();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning()\n\t\t\t\t.all();\n\n\t\t\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(5000);\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane', verified: false, json: null, createdAt: users[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('update with returning partial', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = await db.update(usersTable).set({ name: 'Jane' }).where(eq(usersTable.name, 'John')).returning({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t}).all();\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'Jane' }]);\n\t\t});\n\n\t\ttest('delete with returning all fields', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst now = Date.now();\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning().all();\n\n\t\t\texpect(users[0]!.createdAt).toBeInstanceOf(Date);\n\t\t\texpect(Math.abs(users[0]!.createdAt.getTime() - now)).toBeLessThan(5000);\n\t\t\texpect(users).toEqual([{ id: 1, name: 'John', verified: false, json: null, createdAt: users[0]!.createdAt }]);\n\t\t});\n\n\t\ttest('delete with returning partial', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst users = await db.delete(usersTable).where(eq(usersTable.name, 'John')).returning({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t}).all();\n\n\t\t\texpect(users).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert + select', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).all();\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\n\t\t\tawait db.insert(usersTable).values({ name: 'Jane' }).run();\n\t\t\tconst result2 = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).all();\n\n\t\t\texpect(result2).toEqual([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]);\n\t\t});\n\n\t\ttest('json insert', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John', json: ['foo', 'bar'] }).run();\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t\tjson: usersTable.json,\n\t\t\t}).from(usersTable).all();\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John', json: ['foo', 'bar'] }]);\n\t\t});\n\n\t\ttest('insert many', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Bruce', json: ['foo', 'bar'] },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Austin', verified: true },\n\t\t\t]).run();\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t\tjson: usersTable.json,\n\t\t\t\tverified: usersTable.verified,\n\t\t\t}).from(usersTable).all();\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', json: null, verified: false },\n\t\t\t\t{ id: 2, name: 'Bruce', json: ['foo', 'bar'], verified: false },\n\t\t\t\t{ id: 3, name: 'Jane', json: null, verified: false },\n\t\t\t\t{ id: 4, name: 'Austin', json: null, verified: true },\n\t\t\t]);\n\t\t});\n\n\t\ttest('insert many with returning', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst result = await db.insert(usersTable).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Bruce', json: ['foo', 'bar'] },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Austin', verified: true },\n\t\t\t])\n\t\t\t\t.returning({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t\tjson: usersTable.json,\n\t\t\t\t\tverified: usersTable.verified,\n\t\t\t\t})\n\t\t\t\t.all();\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', json: null, verified: false },\n\t\t\t\t{ id: 2, name: 'Bruce', json: ['foo', 'bar'], verified: false },\n\t\t\t\t{ id: 3, name: 'Jane', json: null, verified: false },\n\t\t\t\t{ id: 4, name: 'Austin', json: null, verified: true },\n\t\t\t]);\n\t\t});\n\n\t\ttest('partial join with alias', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\t\t\tconst customerAlias = alias(usersTable, 'customer');\n\n\t\t\tawait db.insert(usersTable).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\t\tname: usersTable.name,\n\t\t\t\t\t},\n\t\t\t\t\tcustomer: {\n\t\t\t\t\t\tid: customerAlias.id,\n\t\t\t\t\t\tname: customerAlias.name,\n\t\t\t\t\t},\n\t\t\t\t}).from(usersTable)\n\t\t\t\t.leftJoin(customerAlias, eq(customerAlias.id, 11))\n\t\t\t\t.where(eq(usersTable.id, 10));\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tuser: { id: 10, name: 'Ivan' },\n\t\t\t\tcustomer: { id: 11, name: 'Hans' },\n\t\t\t}]);\n\t\t});\n\n\t\ttest('full join with alias', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst sqliteTable = sqliteTableCreator((name) => `prefixed_${name}`);\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\t\t\tawait db.run(sql`create table ${users} (id integer primary key, name text not null)`);\n\n\t\t\tconst customers = alias(users, 'customer');\n\n\t\t\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]).run();\n\t\t\tconst result = await db\n\t\t\t\t.select().from(users)\n\t\t\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t\t\t.where(eq(users.id, 10))\n\t\t\t\t.all();\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tusers: {\n\t\t\t\t\tid: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t},\n\t\t\t}]);\n\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('select from alias', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst sqliteTable = sqliteTableCreator((name) => `prefixed_${name}`);\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\t\t\tawait db.run(sql`create table ${users} (id integer primary key, name text not null)`);\n\n\t\t\tconst user = alias(users, 'user');\n\t\t\tconst customers = alias(users, 'customer');\n\n\t\t\tawait db.insert(users).values([{ id: 10, name: 'Ivan' }, { id: 11, name: 'Hans' }]).run();\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(user)\n\t\t\t\t.leftJoin(customers, eq(customers.id, 11))\n\t\t\t\t.where(eq(user.id, 10))\n\t\t\t\t.all();\n\n\t\t\texpect(result).toEqual([{\n\t\t\t\tuser: {\n\t\t\t\t\tid: 10,\n\t\t\t\t\tname: 'Ivan',\n\t\t\t\t},\n\t\t\t\tcustomer: {\n\t\t\t\t\tid: 11,\n\t\t\t\t\tname: 'Hans',\n\t\t\t\t},\n\t\t\t}]);\n\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('insert with spaces', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: sql`'Jo   h     n'` }).run();\n\t\t\tconst result = await db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).all();\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'Jo   h     n' }]);\n\t\t});\n\n\t\ttest('prepared statement', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst statement = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable).prepare();\n\t\t\tconst result = await statement.all();\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('prepared statement reuse', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst stmt = db.insert(usersTable).values({ name: sql.placeholder('name') }).prepare();\n\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tawait stmt.run({ name: `John ${i}` });\n\t\t\t}\n\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t}).from(usersTable).all();\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John 0' },\n\t\t\t\t{ id: 2, name: 'John 1' },\n\t\t\t\t{ id: 3, name: 'John 2' },\n\t\t\t\t{ id: 4, name: 'John 3' },\n\t\t\t\t{ id: 5, name: 'John 4' },\n\t\t\t\t{ id: 6, name: 'John 5' },\n\t\t\t\t{ id: 7, name: 'John 6' },\n\t\t\t\t{ id: 8, name: 'John 7' },\n\t\t\t\t{ id: 9, name: 'John 8' },\n\t\t\t\t{ id: 10, name: 'John 9' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('insert: placeholders on columns with encoder', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst stmt = db.insert(usersTable).values({\n\t\t\t\tname: 'John',\n\t\t\t\tverified: sql.placeholder('verified'),\n\t\t\t}).prepare();\n\n\t\t\tawait stmt.run({ verified: true });\n\t\t\tawait stmt.run({ verified: false });\n\n\t\t\tconst result = await db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tverified: usersTable.verified,\n\t\t\t}).from(usersTable).all();\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, verified: true },\n\t\t\t\t{ id: 2, verified: false },\n\t\t\t]);\n\t\t});\n\n\t\ttest('prepared statement with placeholder in .where', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst stmt = db.select({\n\t\t\t\tid: usersTable.id,\n\t\t\t\tname: usersTable.name,\n\t\t\t}).from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t\t\t.prepare();\n\t\t\tconst result = await stmt.all({ id: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('prepared statement with placeholder in .limit', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ name: 'John' }).run();\n\t\t\tconst stmt = db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, sql.placeholder('id')))\n\t\t\t\t.limit(sql.placeholder('limit'))\n\t\t\t\t.prepare();\n\n\t\t\tconst result = await stmt.all({ id: 1, limit: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t\texpect(result).toHaveLength(1);\n\t\t});\n\n\t\ttest('prepared statement with placeholder in .offset', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]).run();\n\t\t\tconst stmt = db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.limit(sql.placeholder('limit'))\n\t\t\t\t.offset(sql.placeholder('offset'))\n\t\t\t\t.prepare();\n\n\t\t\tconst result = await stmt.all({ limit: 1, offset: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 2, name: 'John1' }]);\n\t\t});\n\n\t\ttest('prepared statement built using $dynamic', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tfunction withLimitOffset(qb: any) {\n\t\t\t\treturn qb.limit(sql.placeholder('limit')).offset(sql.placeholder('offset'));\n\t\t\t}\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]).run();\n\t\t\tconst stmt = db\n\t\t\t\t.select({\n\t\t\t\t\tid: usersTable.id,\n\t\t\t\t\tname: usersTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.$dynamic();\n\t\t\twithLimitOffset(stmt).prepare('stmt_limit');\n\n\t\t\tconst result = await stmt.all({ limit: 1, offset: 1 });\n\n\t\t\texpect(result).toEqual([{ id: 2, name: 'John1' }]);\n\t\t\texpect(result).toHaveLength(1);\n\t\t});\n\n\t\ttest('select with group by as field', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]).run();\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(usersTable.name)\n\t\t\t\t.all();\n\n\t\t\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n\t\t});\n\n\t\ttest('select with exists', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]).run();\n\n\t\t\tconst user = alias(usersTable, 'user');\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable).where(\n\t\t\t\texists(\n\t\t\t\t\tdb.select({ one: sql`1` }).from(user).where(and(eq(usersTable.name, 'John'), eq(user.id, usersTable.id))),\n\t\t\t\t),\n\t\t\t).all();\n\n\t\t\texpect(result).toEqual([{ name: 'John' }]);\n\t\t});\n\n\t\ttest('select with group by as sql', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]).run();\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(sql`${usersTable.name}`)\n\t\t\t\t.all();\n\n\t\t\texpect(result).toEqual([{ name: 'Jane' }, { name: 'John' }]);\n\t\t});\n\n\t\ttest('select with group by as sql + column', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]).run();\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(sql`${usersTable.name}`, usersTable.id)\n\t\t\t\t.all();\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('select with group by as column + sql', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]).run();\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t\t\t.all();\n\n\t\t\texpect(result).toEqual([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]);\n\t\t});\n\n\t\ttest('select with group by complex query', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]).run();\n\n\t\t\tconst result = await db.select({ name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, sql`${usersTable.name}`)\n\t\t\t\t.orderBy(asc(usersTable.name))\n\t\t\t\t.limit(1)\n\t\t\t\t.all();\n\n\t\t\texpect(result).toEqual([{ name: 'Jane' }]);\n\t\t});\n\n\t\ttest('build query', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst query = db.select({ id: usersTable.id, name: usersTable.name }).from(usersTable)\n\t\t\t\t.groupBy(usersTable.id, usersTable.name)\n\t\t\t\t.toSQL();\n\n\t\t\texpect(query).toEqual({\n\t\t\t\tsql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\", \"users\".\"name\"',\n\t\t\t\tparams: [],\n\t\t\t});\n\t\t});\n\n\t\ttest('insert via db.run + select via db.all', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.run(sql`insert into ${usersTable} (${new Name(usersTable.name.name)}) values (${'John'})`);\n\n\t\t\tconst result = await db.all<{ id: number; name: string }>(sql`select id, name from \"users\"`);\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert via db.get', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst inserted = await db.get<{ id: number; name: string }>(\n\t\t\t\tsql`insert into ${usersTable} (${new Name(\n\t\t\t\t\tusersTable.name.name,\n\t\t\t\t)}) values (${'John'}) returning ${usersTable.id}, ${usersTable.name}`,\n\t\t\t);\n\t\t\texpect(inserted).toEqual({ id: 1, name: 'John' });\n\t\t});\n\n\t\ttest('insert via db.run + select via db.get', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.run(sql`insert into ${usersTable} (${new Name(usersTable.name.name)}) values (${'John'})`);\n\n\t\t\tconst result = await db.get<{ id: number; name: string }>(\n\t\t\t\tsql`select ${usersTable.id}, ${usersTable.name} from ${usersTable}`,\n\t\t\t);\n\t\t\texpect(result).toEqual({ id: 1, name: 'John' });\n\t\t});\n\n\t\ttest('insert via db.get w/ query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst inserted = await db.get<Pick<typeof usersTable.$inferSelect, 'id' | 'name'>>(\n\t\t\t\tdb.insert(usersTable).values({ name: 'John' }).returning({ id: usersTable.id, name: usersTable.name }),\n\t\t\t);\n\t\t\texpect(inserted).toEqual({ id: 1, name: 'John' });\n\t\t});\n\n\t\ttest('select from a many subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst res = await db.select({\n\t\t\t\tpopulation: db.select({ count: count().as('count') }).from(users2Table).where(\n\t\t\t\t\teq(users2Table.cityId, citiesTable.id),\n\t\t\t\t).as(\n\t\t\t\t\t'population',\n\t\t\t\t),\n\t\t\t\tname: citiesTable.name,\n\t\t\t}).from(citiesTable);\n\n\t\t\texpectTypeOf(res).toEqualTypeOf<{\n\t\t\t\tpopulation: number;\n\t\t\t\tname: string;\n\t\t\t}[]>();\n\n\t\t\texpect(res).toStrictEqual([{\n\t\t\t\tpopulation: 1,\n\t\t\t\tname: 'Paris',\n\t\t\t}, {\n\t\t\t\tpopulation: 2,\n\t\t\t\tname: 'London',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('select from a one subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(citiesTable)\n\t\t\t\t.values([{ name: 'Paris' }, { name: 'London' }]);\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]);\n\n\t\t\tconst res = await db.select({\n\t\t\t\tcityName: db.select({ name: citiesTable.name }).from(citiesTable).where(eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t\t.as(\n\t\t\t\t\t\t'cityName',\n\t\t\t\t\t),\n\t\t\t\tname: users2Table.name,\n\t\t\t}).from(users2Table);\n\n\t\t\texpectTypeOf(res).toEqualTypeOf<{\n\t\t\t\tcityName: string;\n\t\t\t\tname: string;\n\t\t\t}[]>();\n\n\t\t\texpect(res).toStrictEqual([{\n\t\t\t\tcityName: 'Paris',\n\t\t\t\tname: 'John',\n\t\t\t}, {\n\t\t\t\tcityName: 'London',\n\t\t\t\tname: 'Jane',\n\t\t\t}, {\n\t\t\t\tcityName: 'London',\n\t\t\t\tname: 'Jack',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('join subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(courseCategoriesTable).values([\n\t\t\t\t{ name: 'Category 1' },\n\t\t\t\t{ name: 'Category 2' },\n\t\t\t\t{ name: 'Category 3' },\n\t\t\t\t{ name: 'Category 4' },\n\t\t\t]).run();\n\n\t\t\tawait db.insert(coursesTable).values([\n\t\t\t\t{ name: 'Development', categoryId: 2 },\n\t\t\t\t{ name: 'IT & Software', categoryId: 3 },\n\t\t\t\t{ name: 'Marketing', categoryId: 4 },\n\t\t\t\t{ name: 'Design', categoryId: 1 },\n\t\t\t]).run();\n\n\t\t\tconst sq2 = db\n\t\t\t\t.select({\n\t\t\t\t\tcategoryId: courseCategoriesTable.id,\n\t\t\t\t\tcategory: courseCategoriesTable.name,\n\t\t\t\t\ttotal: sql<number>`count(${courseCategoriesTable.id})`,\n\t\t\t\t})\n\t\t\t\t.from(courseCategoriesTable)\n\t\t\t\t.groupBy(courseCategoriesTable.id, courseCategoriesTable.name)\n\t\t\t\t.as('sq2');\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tcourseName: coursesTable.name,\n\t\t\t\t\tcategoryId: sq2.categoryId,\n\t\t\t\t})\n\t\t\t\t.from(coursesTable)\n\t\t\t\t.leftJoin(sq2, eq(coursesTable.categoryId, sq2.categoryId))\n\t\t\t\t.orderBy(coursesTable.name)\n\t\t\t\t.all();\n\n\t\t\texpect(res).toEqual([\n\t\t\t\t{ courseName: 'Design', categoryId: 1 },\n\t\t\t\t{ courseName: 'Development', categoryId: 2 },\n\t\t\t\t{ courseName: 'IT & Software', categoryId: 3 },\n\t\t\t\t{ courseName: 'Marketing', categoryId: 4 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('with ... select', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(orders).values([\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t\t\t]).run();\n\n\t\t\tconst regionalSales = await db\n\t\t\t\t.$with('regional_sales')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tregion: orders.region,\n\t\t\t\t\t\t\ttotalSales: sql<number>`sum(${orders.amount})`.as('total_sales'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(orders)\n\t\t\t\t\t\t.groupBy(orders.region),\n\t\t\t\t);\n\n\t\t\tconst topRegions = await db\n\t\t\t\t.$with('top_regions')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tregion: regionalSales.region,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(regionalSales)\n\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\tgt(\n\t\t\t\t\t\t\t\tregionalSales.totalSales,\n\t\t\t\t\t\t\t\tdb.select({ sales: sql`sum(${regionalSales.totalSales})/10` }).from(regionalSales),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\tconst result = await db\n\t\t\t\t.with(regionalSales, topRegions)\n\t\t\t\t.select({\n\t\t\t\t\tregion: orders.region,\n\t\t\t\t\tproduct: orders.product,\n\t\t\t\t\tproductUnits: sql<number>`cast(sum(${orders.quantity}) as int)`,\n\t\t\t\t\tproductSales: sql<number>`cast(sum(${orders.amount}) as int)`,\n\t\t\t\t})\n\t\t\t\t.from(orders)\n\t\t\t\t.where(inArray(orders.region, db.select({ region: topRegions.region }).from(topRegions)))\n\t\t\t\t.groupBy(orders.region, orders.product)\n\t\t\t\t.orderBy(orders.region, orders.product)\n\t\t\t\t.all();\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tregion: 'Europe',\n\t\t\t\t\tproduct: 'A',\n\t\t\t\t\tproductUnits: 3,\n\t\t\t\t\tproductSales: 30,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'Europe',\n\t\t\t\t\tproduct: 'B',\n\t\t\t\t\tproductUnits: 5,\n\t\t\t\t\tproductSales: 50,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'US',\n\t\t\t\t\tproduct: 'A',\n\t\t\t\t\tproductUnits: 7,\n\t\t\t\t\tproductSales: 70,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tregion: 'US',\n\t\t\t\t\tproduct: 'B',\n\t\t\t\t\tproductUnits: 9,\n\t\t\t\t\tproductSales: 90,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('with ... update', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst products = sqliteTable('products', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tprice: numeric('price').notNull(),\n\t\t\t\tcheap: integer('cheap', { mode: 'boolean' }).notNull().default(false),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${products}`);\n\t\t\tawait db.run(sql`\n\t\t\t\tcreate table ${products} (\n\t\t\t\t    id integer primary key,\n\t\t\t\t    price numeric not null,\n\t\t\t\t    cheap integer not null default 0\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tawait db.insert(products).values([\n\t\t\t\t{ price: '10.99' },\n\t\t\t\t{ price: '25.85' },\n\t\t\t\t{ price: '32.99' },\n\t\t\t\t{ price: '2.50' },\n\t\t\t\t{ price: '4.59' },\n\t\t\t]);\n\n\t\t\tconst averagePrice = db\n\t\t\t\t.$with('average_price')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tvalue: sql`avg(${products.price})`.as('value'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(products),\n\t\t\t\t);\n\n\t\t\tconst result = await db\n\t\t\t\t.with(averagePrice)\n\t\t\t\t.update(products)\n\t\t\t\t.set({\n\t\t\t\t\tcheap: true,\n\t\t\t\t})\n\t\t\t\t.where(lt(products.price, sql`(select * from ${averagePrice})`))\n\t\t\t\t.returning({\n\t\t\t\t\tid: products.id,\n\t\t\t\t});\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1 },\n\t\t\t\t{ id: 4 },\n\t\t\t\t{ id: 5 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('with ... insert', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tusername: text('username').notNull(),\n\t\t\t\tadmin: integer('admin', { mode: 'boolean' }).notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\t\t\tawait db.run(sql`create table ${users} (username text not null, admin integer not null default 0)`);\n\n\t\t\tconst userCount = db\n\t\t\t\t.$with('user_count')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tvalue: sql`count(*)`.as('value'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(users),\n\t\t\t\t);\n\n\t\t\tconst result = await db\n\t\t\t\t.with(userCount)\n\t\t\t\t.insert(users)\n\t\t\t\t.values([\n\t\t\t\t\t{ username: 'user1', admin: sql`((select * from ${userCount}) = 0)` },\n\t\t\t\t])\n\t\t\t\t.returning({\n\t\t\t\t\tadmin: users.admin,\n\t\t\t\t});\n\n\t\t\texpect(result).toEqual([{ admin: true }]);\n\t\t});\n\n\t\ttest('with ... delete', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(orders).values([\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 10, quantity: 1 },\n\t\t\t\t{ region: 'Europe', product: 'A', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 20, quantity: 2 },\n\t\t\t\t{ region: 'Europe', product: 'B', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 30, quantity: 3 },\n\t\t\t\t{ region: 'US', product: 'A', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 40, quantity: 4 },\n\t\t\t\t{ region: 'US', product: 'B', amount: 50, quantity: 5 },\n\t\t\t]);\n\n\t\t\tconst averageAmount = db\n\t\t\t\t.$with('average_amount')\n\t\t\t\t.as(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tvalue: sql`avg(${orders.amount})`.as('value'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(orders),\n\t\t\t\t);\n\n\t\t\tconst result = await db\n\t\t\t\t.with(averageAmount)\n\t\t\t\t.delete(orders)\n\t\t\t\t.where(gt(orders.amount, sql`(select * from ${averageAmount})`))\n\t\t\t\t.returning({\n\t\t\t\t\tid: orders.id,\n\t\t\t\t});\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 6 },\n\t\t\t\t{ id: 7 },\n\t\t\t\t{ id: 8 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('select from subquery sql', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(users2Table).values([{ name: 'John' }, { name: 'Jane' }]).run();\n\n\t\t\tconst sq = db\n\t\t\t\t.select({ name: sql<string>`${users2Table.name} || ' modified'`.as('name') })\n\t\t\t\t.from(users2Table)\n\t\t\t\t.as('sq');\n\n\t\t\tconst res = await db.select({ name: sq.name }).from(sq).all();\n\n\t\t\texpect(res).toEqual([{ name: 'John modified' }, { name: 'Jane modified' }]);\n\t\t});\n\n\t\ttest('select a field without joining its table', (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\texpect(() => db.select({ name: users2Table.name }).from(usersTable).prepare()).toThrowError();\n\t\t});\n\n\t\ttest('select all fields from subquery without alias', (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst sq = db.$with('sq').as(db.select({ name: sql<string>`upper(${users2Table.name})` }).from(users2Table));\n\n\t\t\texpect(() => db.select().from(sq).prepare()).toThrowError();\n\t\t});\n\n\t\ttest('select count()', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }]).run();\n\n\t\t\tconst res = await db.select({ count: sql`count(*)` }).from(usersTable).all();\n\n\t\t\texpect(res).toEqual([{ count: 2 }]);\n\t\t});\n\n\t\ttest('having', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(citiesTable).values([{ name: 'London' }, { name: 'Paris' }, { name: 'New York' }]).run();\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 1 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]).run();\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: citiesTable.id,\n\t\t\t\t\tname: sql<string>`upper(${citiesTable.name})`.as('upper_name'),\n\t\t\t\t\tusersCount: sql<number>`count(${users2Table.id})`.as('users_count'),\n\t\t\t\t})\n\t\t\t\t.from(citiesTable)\n\t\t\t\t.leftJoin(users2Table, eq(users2Table.cityId, citiesTable.id))\n\t\t\t\t.where(({ name }) => sql`length(${name}) >= 3`)\n\t\t\t\t.groupBy(citiesTable.id)\n\t\t\t\t.having(({ usersCount }) => sql`${usersCount} > 0`)\n\t\t\t\t.orderBy(({ name }) => name)\n\t\t\t\t.all();\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\tname: 'LONDON',\n\t\t\t\t\tusersCount: 2,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'PARIS',\n\t\t\t\t\tusersCount: 1,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\ttest('view', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst newYorkers1 = sqliteView('new_yorkers')\n\t\t\t\t.as((qb) => qb.select().from(users2Table).where(eq(users2Table.cityId, 1)));\n\n\t\t\tconst newYorkers2 = sqliteView('new_yorkers', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t}).as(sql`select * from ${users2Table} where ${eq(users2Table.cityId, 1)}`);\n\n\t\t\tconst newYorkers3 = sqliteView('new_yorkers', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t}).existing();\n\n\t\t\tawait db.run(sql`create view if not exists new_yorkers as ${getViewConfig(newYorkers1).query}`);\n\n\t\t\tawait db.insert(citiesTable).values([{ name: 'New York' }, { name: 'Paris' }]).run();\n\n\t\t\tawait db.insert(users2Table).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 1 },\n\t\t\t\t{ name: 'Jack', cityId: 2 },\n\t\t\t]).run();\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers1).all();\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers2).all();\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select().from(newYorkers3).all();\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\t{ id: 2, name: 'Jane', cityId: 1 },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tconst result = await db.select({ name: newYorkers1.name }).from(newYorkers1).all();\n\t\t\t\texpect(result).toEqual([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\tawait db.run(sql`drop view ${newYorkers1}`);\n\t\t});\n\n\t\ttest('insert null timestamp', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst test = sqliteTable('test', {\n\t\t\t\tt: integer('t', { mode: 'timestamp' }),\n\t\t\t});\n\n\t\t\tawait db.run(sql`create table ${test} (t timestamp)`);\n\n\t\t\tawait db.insert(test).values({ t: null }).run();\n\t\t\tconst res = await db.select().from(test).all();\n\t\t\texpect(res).toEqual([{ t: null }]);\n\n\t\t\tawait db.run(sql`drop table ${test}`);\n\t\t});\n\n\t\ttest('select from raw sql', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst result = await db.select({\n\t\t\t\tid: sql<number>`id`,\n\t\t\t\tname: sql<string>`name`,\n\t\t\t}).from(sql`(select 1 as id, 'John' as name) as users`).all();\n\n\t\t\tExpect<Equal<{ id: number; name: string }[], typeof result>>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('select from raw sql with joins', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: sql<number>`users.id`,\n\t\t\t\t\tname: sql<string>`users.name`.as('userName'),\n\t\t\t\t\tuserCity: sql<string>`users.city`,\n\t\t\t\t\tcityName: sql<string>`cities.name`.as('cityName'),\n\t\t\t\t})\n\t\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, sql`cities.id = users.id`)\n\t\t\t\t.all();\n\n\t\t\tExpect<Equal<{ id: number; name: string; userCity: string; cityName: string }[], typeof result>>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John', userCity: 'New York', cityName: 'Paris' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('join on aliased sql from select', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tuserId: sql<number>`users.id`.as('userId'),\n\t\t\t\t\tname: sql<string>`users.name`.as('userName'),\n\t\t\t\t\tuserCity: sql<string>`users.city`,\n\t\t\t\t\tcityId: sql<number>`cities.id`.as('cityId'),\n\t\t\t\t\tcityName: sql<string>`cities.name`.as('cityName'),\n\t\t\t\t})\n\t\t\t\t.from(sql`(select 1 as id, 'John' as name, 'New York' as city) as users`)\n\t\t\t\t.leftJoin(sql`(select 1 as id, 'Paris' as name) as cities`, (cols) => eq(cols.cityId, cols.userId))\n\t\t\t\t.all();\n\n\t\t\tExpect<\n\t\t\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t\t\t>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('join on aliased sql from with clause', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = db.$with('users').as(\n\t\t\t\tdb.select({\n\t\t\t\t\tid: sql<number>`id`.as('userId'),\n\t\t\t\t\tname: sql<string>`name`.as('userName'),\n\t\t\t\t\tcity: sql<string>`city`.as('city'),\n\t\t\t\t}).from(\n\t\t\t\t\tsql`(select 1 as id, 'John' as name, 'New York' as city) as users`,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst cities = db.$with('cities').as(\n\t\t\t\tdb.select({\n\t\t\t\t\tid: sql<number>`id`.as('cityId'),\n\t\t\t\t\tname: sql<string>`name`.as('cityName'),\n\t\t\t\t}).from(\n\t\t\t\t\tsql`(select 1 as id, 'Paris' as name) as cities`,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst result = await db\n\t\t\t\t.with(users, cities)\n\t\t\t\t.select({\n\t\t\t\t\tuserId: users.id,\n\t\t\t\t\tname: users.name,\n\t\t\t\t\tuserCity: users.city,\n\t\t\t\t\tcityId: cities.id,\n\t\t\t\t\tcityName: cities.name,\n\t\t\t\t})\n\t\t\t\t.from(users)\n\t\t\t\t.leftJoin(cities, (cols) => eq(cols.cityId, cols.userId))\n\t\t\t\t.all();\n\n\t\t\tExpect<\n\t\t\t\tEqual<{ userId: number; name: string; userCity: string; cityId: number; cityName: string }[], typeof result>\n\t\t\t>;\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ userId: 1, name: 'John', userCity: 'New York', cityId: 1, cityName: 'Paris' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('prefixed table', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst sqliteTable = sqliteTableCreator((name) => `myprefix_${name}`);\n\n\t\t\tconst users = sqliteTable('test_prefixed_table_with_unique_name', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.run(\n\t\t\t\tsql`create table myprefix_test_prefixed_table_with_unique_name (id integer not null primary key, name text not null)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values({ id: 1, name: 'John' }).run();\n\n\t\t\tconst result = await db.select().from(users).all();\n\n\t\t\texpect(result).toEqual([{ id: 1, name: 'John' }]);\n\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('orderBy with aliased column', (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst query = db.select({\n\t\t\t\ttest: sql`something`.as('test'),\n\t\t\t}).from(users2Table).orderBy((fields) => fields.test).toSQL();\n\n\t\t\texpect(query.sql).toBe('select something as \"test\" from \"users2\" order by \"test\"');\n\t\t});\n\n\t\ttest('transaction', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users_transactions', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tbalance: integer('balance').notNull(),\n\t\t\t});\n\t\t\tconst products = sqliteTable('products_transactions', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tprice: integer('price').notNull(),\n\t\t\t\tstock: integer('stock').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\t\t\tawait db.run(sql`drop table if exists ${products}`);\n\n\t\t\tawait db.run(sql`create table users_transactions (id integer not null primary key, balance integer not null)`);\n\t\t\tawait db.run(\n\t\t\t\tsql`create table products_transactions (id integer not null primary key, price integer not null, stock integer not null)`,\n\t\t\t);\n\n\t\t\tconst user = await db.insert(users).values({ balance: 100 }).returning().get();\n\t\t\tconst product = await db.insert(products).values({ price: 10, stock: 10 }).returning().get();\n\n\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\tawait tx.update(users).set({ balance: user.balance - product.price }).where(eq(users.id, user.id)).run();\n\t\t\t\tawait tx.update(products).set({ stock: product.stock - 1 }).where(eq(products.id, product.id)).run();\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(users).all();\n\n\t\t\texpect(result).toEqual([{ id: 1, balance: 90 }]);\n\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t\tawait db.run(sql`drop table ${products}`);\n\t\t});\n\n\t\ttest('transaction rollback', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users_transactions_rollback', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tbalance: integer('balance').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.run(\n\t\t\t\tsql`create table users_transactions_rollback (id integer not null primary key, balance integer not null)`,\n\t\t\t);\n\t\t\tawait expect(async () => {\n\t\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\t\tawait tx.insert(users).values({ balance: 100 }).run();\n\t\t\t\t\ttx.rollback();\n\t\t\t\t});\n\t\t\t}).rejects.toThrowError(TransactionRollbackError);\n\n\t\t\tconst result = await db.select().from(users).all();\n\n\t\t\texpect(result).toEqual([]);\n\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('nested transaction', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users_nested_transactions', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tbalance: integer('balance').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.run(\n\t\t\t\tsql`create table users_nested_transactions (id integer not null primary key, balance integer not null)`,\n\t\t\t);\n\n\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\tawait tx.insert(users).values({ balance: 100 }).run();\n\n\t\t\t\tawait tx.transaction(async (tx) => {\n\t\t\t\t\tawait tx.update(users).set({ balance: 200 }).run();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(users).all();\n\n\t\t\texpect(result).toEqual([{ id: 1, balance: 200 }]);\n\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('nested transaction rollback', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users_nested_transactions_rollback', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tbalance: integer('balance').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.run(\n\t\t\t\tsql`create table users_nested_transactions_rollback (id integer not null primary key, balance integer not null)`,\n\t\t\t);\n\n\t\t\tawait db.transaction(async (tx) => {\n\t\t\t\tawait tx.insert(users).values({ balance: 100 }).run();\n\n\t\t\t\tawait expect(async () => {\n\t\t\t\t\tawait tx.transaction(async (tx) => {\n\t\t\t\t\t\tawait tx.update(users).set({ balance: 200 }).run();\n\t\t\t\t\t\ttx.rollback();\n\t\t\t\t\t});\n\t\t\t\t}).rejects.toThrowError(TransactionRollbackError);\n\t\t\t});\n\n\t\t\tconst result = await db.select().from(users).all();\n\n\t\t\texpect(result).toEqual([{ id: 1, balance: 100 }]);\n\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('join subquery with join', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst internalStaff = sqliteTable('internal_staff', {\n\t\t\t\tuserId: integer('user_id').notNull(),\n\t\t\t});\n\n\t\t\tconst customUser = sqliteTable('custom_user', {\n\t\t\t\tid: integer('id').notNull(),\n\t\t\t});\n\n\t\t\tconst ticket = sqliteTable('ticket', {\n\t\t\t\tstaffId: integer('staff_id').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${internalStaff}`);\n\t\t\tawait db.run(sql`drop table if exists ${customUser}`);\n\t\t\tawait db.run(sql`drop table if exists ${ticket}`);\n\n\t\t\tawait db.run(sql`create table internal_staff (user_id integer not null)`);\n\t\t\tawait db.run(sql`create table custom_user (id integer not null)`);\n\t\t\tawait db.run(sql`create table ticket (staff_id integer not null)`);\n\n\t\t\tawait db.insert(internalStaff).values({ userId: 1 }).run();\n\t\t\tawait db.insert(customUser).values({ id: 1 }).run();\n\t\t\tawait db.insert(ticket).values({ staffId: 1 }).run();\n\n\t\t\tconst subq = await db\n\t\t\t\t.select()\n\t\t\t\t.from(internalStaff)\n\t\t\t\t.leftJoin(customUser, eq(internalStaff.userId, customUser.id))\n\t\t\t\t.as('internal_staff');\n\n\t\t\tconst mainQuery = await db\n\t\t\t\t.select()\n\t\t\t\t.from(ticket)\n\t\t\t\t.leftJoin(subq, eq(subq.internal_staff.userId, ticket.staffId))\n\t\t\t\t.all();\n\n\t\t\texpect(mainQuery).toEqual([{\n\t\t\t\tticket: { staffId: 1 },\n\t\t\t\tinternal_staff: {\n\t\t\t\t\tinternal_staff: { userId: 1 },\n\t\t\t\t\tcustom_user: { id: 1 },\n\t\t\t\t},\n\t\t\t}]);\n\n\t\t\tawait db.run(sql`drop table ${internalStaff}`);\n\t\t\tawait db.run(sql`drop table ${customUser}`);\n\t\t\tawait db.run(sql`drop table ${ticket}`);\n\t\t});\n\n\t\ttest('join view as subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users_join_view', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tcityId: integer('city_id').notNull(),\n\t\t\t});\n\n\t\t\tconst newYorkers = sqliteView('new_yorkers').as((qb) => qb.select().from(users).where(eq(users.cityId, 1)));\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\t\t\tawait db.run(sql`drop view if exists ${newYorkers}`);\n\n\t\t\tawait db.run(\n\t\t\t\tsql`create table ${users} (id integer not null primary key, name text not null, city_id integer not null)`,\n\t\t\t);\n\t\t\tawait db.run(sql`create view if not exists ${newYorkers} as ${getViewConfig(newYorkers).query}`);\n\n\t\t\tdb.insert(users).values([\n\t\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t\t{ name: 'Jack', cityId: 1 },\n\t\t\t\t{ name: 'Jill', cityId: 2 },\n\t\t\t]).run();\n\n\t\t\tconst sq = db.select().from(newYorkers).as('new_yorkers_sq');\n\n\t\t\tconst result = await db.select().from(users).leftJoin(sq, eq(users.id, sq.id)).all();\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 1, name: 'John', cityId: 1 },\n\t\t\t\t\tnew_yorkers_sq: { id: 1, name: 'John', cityId: 1 },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 2, name: 'Jane', cityId: 2 },\n\t\t\t\t\tnew_yorkers_sq: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 3, name: 'Jack', cityId: 1 },\n\t\t\t\t\tnew_yorkers_sq: { id: 3, name: 'Jack', cityId: 1 },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tusers_join_view: { id: 4, name: 'Jill', cityId: 2 },\n\t\t\t\t\tnew_yorkers_sq: null,\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tawait db.run(sql`drop view ${newYorkers}`);\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('insert with onConflict do nothing', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: 'John' }).run();\n\n\t\t\tawait db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John' })\n\t\t\t\t.onConflictDoNothing()\n\t\t\t\t.run();\n\n\t\t\tconst res = await db\n\t\t\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, 1))\n\t\t\t\t.all();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert with onConflict do nothing using composite pk', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db\n\t\t\t\t.insert(pkExampleTable)\n\t\t\t\t.values({ id: 1, name: 'John', email: 'john@example.com' })\n\t\t\t\t.run();\n\n\t\t\tawait db\n\t\t\t\t.insert(pkExampleTable)\n\t\t\t\t.values({ id: 1, name: 'John', email: 'john1@example.com' })\n\t\t\t\t.onConflictDoNothing()\n\t\t\t\t.run();\n\n\t\t\tconst res = await db\n\t\t\t\t.select({ id: pkExampleTable.id, name: pkExampleTable.name, email: pkExampleTable.email })\n\t\t\t\t.from(pkExampleTable)\n\t\t\t\t.where(eq(pkExampleTable.id, 1))\n\t\t\t\t.all();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John', email: 'john@example.com' }]);\n\t\t});\n\n\t\ttest('insert with onConflict do nothing using target', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: 'John' }).run();\n\n\t\t\tawait db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John' })\n\t\t\t\t.onConflictDoNothing({ target: usersTable.id })\n\t\t\t\t.run();\n\n\t\t\tconst res = await db\n\t\t\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, 1))\n\t\t\t\t.all();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n\t\t});\n\n\t\ttest('insert with onConflict do nothing using composite pk as target', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db\n\t\t\t\t.insert(pkExampleTable)\n\t\t\t\t.values({ id: 1, name: 'John', email: 'john@example.com' })\n\t\t\t\t.run();\n\n\t\t\tawait db\n\t\t\t\t.insert(pkExampleTable)\n\t\t\t\t.values({ id: 1, name: 'John', email: 'john1@example.com' })\n\t\t\t\t.onConflictDoNothing({ target: [pkExampleTable.id, pkExampleTable.name] })\n\t\t\t\t.run();\n\n\t\t\tconst res = await db\n\t\t\t\t.select({ id: pkExampleTable.id, name: pkExampleTable.name, email: pkExampleTable.email })\n\t\t\t\t.from(pkExampleTable)\n\t\t\t\t.where(eq(pkExampleTable.id, 1))\n\t\t\t\t.all();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John', email: 'john@example.com' }]);\n\t\t});\n\n\t\ttest('insert with onConflict do update', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values({ id: 1, name: 'John' }).run();\n\n\t\t\tawait db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John' })\n\t\t\t\t.onConflictDoUpdate({ target: usersTable.id, set: { name: 'John1' } })\n\t\t\t\t.run();\n\n\t\t\tconst res = await db\n\t\t\t\t.select({ id: usersTable.id, name: usersTable.name })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, 1))\n\t\t\t\t.all();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John1' }]);\n\t\t});\n\n\t\ttest('insert with onConflict do update where', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([{ id: 1, name: 'John', verified: false }])\n\t\t\t\t.run();\n\n\t\t\tawait db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values({ id: 1, name: 'John1', verified: true })\n\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\ttarget: usersTable.id,\n\t\t\t\t\tset: { name: 'John1', verified: true },\n\t\t\t\t\twhere: eq(usersTable.verified, false),\n\t\t\t\t})\n\t\t\t\t.run();\n\n\t\t\tconst res = await db\n\t\t\t\t.select({ id: usersTable.id, name: usersTable.name, verified: usersTable.verified })\n\t\t\t\t.from(usersTable)\n\t\t\t\t.where(eq(usersTable.id, 1))\n\t\t\t\t.all();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John1', verified: true }]);\n\t\t});\n\n\t\ttest('insert with onConflict do update using composite pk', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(pkExampleTable).values({ id: 1, name: 'John', email: 'john@example.com' }).run();\n\n\t\t\tawait db\n\t\t\t\t.insert(pkExampleTable)\n\t\t\t\t.values({ id: 1, name: 'John', email: 'john@example.com' })\n\t\t\t\t.onConflictDoUpdate({ target: [pkExampleTable.id, pkExampleTable.name], set: { email: 'john1@example.com' } })\n\t\t\t\t.run();\n\n\t\t\tconst res = await db\n\t\t\t\t.select({ id: pkExampleTable.id, name: pkExampleTable.name, email: pkExampleTable.email })\n\t\t\t\t.from(pkExampleTable)\n\t\t\t\t.where(eq(pkExampleTable.id, 1))\n\t\t\t\t.all();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John', email: 'john1@example.com' }]);\n\t\t});\n\n\t\ttest('insert with onConflict chained (.update -> .nothing)', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(conflictChainExampleTable).values([{ id: 1, name: 'John', email: 'john@example.com' }, {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'John Second',\n\t\t\t\temail: '2john@example.com',\n\t\t\t}]).run();\n\n\t\t\tawait db\n\t\t\t\t.insert(conflictChainExampleTable)\n\t\t\t\t.values([{ id: 1, name: 'John', email: 'john@example.com' }, {\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'Anthony',\n\t\t\t\t\temail: 'idthief@example.com',\n\t\t\t\t}])\n\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\ttarget: [conflictChainExampleTable.id, conflictChainExampleTable.name],\n\t\t\t\t\tset: { email: 'john1@example.com' },\n\t\t\t\t})\n\t\t\t\t.onConflictDoNothing({ target: conflictChainExampleTable.id })\n\t\t\t\t.run();\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: conflictChainExampleTable.id,\n\t\t\t\t\tname: conflictChainExampleTable.name,\n\t\t\t\t\temail: conflictChainExampleTable.email,\n\t\t\t\t})\n\t\t\t\t.from(conflictChainExampleTable)\n\t\t\t\t.orderBy(conflictChainExampleTable.id)\n\t\t\t\t.all();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John', email: 'john1@example.com' }, {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'John Second',\n\t\t\t\temail: '2john@example.com',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('insert with onConflict chained (.nothing -> .update)', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(conflictChainExampleTable).values([{ id: 1, name: 'John', email: 'john@example.com' }, {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'John Second',\n\t\t\t\temail: '2john@example.com',\n\t\t\t}]).run();\n\n\t\t\tawait db\n\t\t\t\t.insert(conflictChainExampleTable)\n\t\t\t\t.values([{ id: 1, name: 'John', email: 'john@example.com' }, {\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'Anthony',\n\t\t\t\t\temail: 'idthief@example.com',\n\t\t\t\t}])\n\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\ttarget: [conflictChainExampleTable.id, conflictChainExampleTable.name],\n\t\t\t\t\tset: { email: 'john1@example.com' },\n\t\t\t\t})\n\t\t\t\t.onConflictDoNothing({ target: conflictChainExampleTable.id })\n\t\t\t\t.run();\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: conflictChainExampleTable.id,\n\t\t\t\t\tname: conflictChainExampleTable.name,\n\t\t\t\t\temail: conflictChainExampleTable.email,\n\t\t\t\t})\n\t\t\t\t.from(conflictChainExampleTable)\n\t\t\t\t.orderBy(conflictChainExampleTable.id)\n\t\t\t\t.all();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John', email: 'john1@example.com' }, {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'John Second',\n\t\t\t\temail: '2john@example.com',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('insert with onConflict chained (.update -> .update)', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(conflictChainExampleTable).values([{ id: 1, name: 'John', email: 'john@example.com' }, {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'John Second',\n\t\t\t\temail: '2john@example.com',\n\t\t\t}]).run();\n\n\t\t\tawait db\n\t\t\t\t.insert(conflictChainExampleTable)\n\t\t\t\t.values([{ id: 1, name: 'John', email: 'john@example.com' }, {\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'Anthony',\n\t\t\t\t\temail: 'idthief@example.com',\n\t\t\t\t}])\n\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\ttarget: [conflictChainExampleTable.id, conflictChainExampleTable.name],\n\t\t\t\t\tset: { email: 'john1@example.com' },\n\t\t\t\t})\n\t\t\t\t.onConflictDoUpdate({ target: conflictChainExampleTable.id, set: { email: 'john2@example.com' } })\n\t\t\t\t.run();\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: conflictChainExampleTable.id,\n\t\t\t\t\tname: conflictChainExampleTable.name,\n\t\t\t\t\temail: conflictChainExampleTable.email,\n\t\t\t\t})\n\t\t\t\t.from(conflictChainExampleTable)\n\t\t\t\t.orderBy(conflictChainExampleTable.id)\n\t\t\t\t.all();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John', email: 'john1@example.com' }, {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'John Second',\n\t\t\t\temail: 'john2@example.com',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('insert with onConflict chained (.nothing -> .nothing)', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(conflictChainExampleTable).values([{ id: 1, name: 'John', email: 'john@example.com' }, {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'John Second',\n\t\t\t\temail: '2john@example.com',\n\t\t\t}]).run();\n\n\t\t\tawait db\n\t\t\t\t.insert(conflictChainExampleTable)\n\t\t\t\t.values([{ id: 1, name: 'John', email: 'john@example.com' }, {\n\t\t\t\t\tid: 2,\n\t\t\t\t\tname: 'Anthony',\n\t\t\t\t\temail: 'idthief@example.com',\n\t\t\t\t}])\n\t\t\t\t.onConflictDoNothing({\n\t\t\t\t\ttarget: [conflictChainExampleTable.id, conflictChainExampleTable.name],\n\t\t\t\t})\n\t\t\t\t.onConflictDoNothing({ target: conflictChainExampleTable.id })\n\t\t\t\t.run();\n\n\t\t\tconst res = await db\n\t\t\t\t.select({\n\t\t\t\t\tid: conflictChainExampleTable.id,\n\t\t\t\t\tname: conflictChainExampleTable.name,\n\t\t\t\t\temail: conflictChainExampleTable.email,\n\t\t\t\t})\n\t\t\t\t.from(conflictChainExampleTable)\n\t\t\t\t.orderBy(conflictChainExampleTable.id)\n\t\t\t\t.all();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John', email: 'john@example.com' }, {\n\t\t\t\tid: 2,\n\t\t\t\tname: 'John Second',\n\t\t\t\temail: '2john@example.com',\n\t\t\t}]);\n\t\t});\n\n\t\ttest('insert undefined', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.run(\n\t\t\t\tsql`create table ${users} (id integer primary key, name text)`,\n\t\t\t);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.insert(users).values({ name: undefined }).run();\n\t\t\t})()).resolves.not.toThrowError();\n\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('update undefined', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\n\t\t\tawait db.run(\n\t\t\t\tsql`create table ${users} (id integer primary key, name text)`,\n\t\t\t);\n\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.update(users).set({ name: undefined }).run();\n\t\t\t})()).rejects.toThrowError();\n\t\t\tawait expect((async () => {\n\t\t\t\tawait db.update(users).set({ id: 1, name: undefined }).run();\n\t\t\t})()).resolves.not.toThrowError();\n\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('async api - CRUD', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tdb.run(sql`drop table if exists ${users}`);\n\n\t\t\tdb.run(\n\t\t\t\tsql`create table ${users} (id integer primary key, name text)`,\n\t\t\t);\n\n\t\t\tawait db.insert(users).values({ id: 1, name: 'John' });\n\n\t\t\tconst res = await db.select().from(users);\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n\n\t\t\tawait db.update(users).set({ name: 'John1' }).where(eq(users.id, 1));\n\n\t\t\tconst res1 = await db.select().from(users);\n\n\t\t\texpect(res1).toEqual([{ id: 1, name: 'John1' }]);\n\n\t\t\tawait db.delete(users).where(eq(users.id, 1));\n\n\t\t\tconst res2 = await db.select().from(users);\n\n\t\t\texpect(res2).toEqual([]);\n\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('async api - insert + select w/ prepare + async execute', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tdb.run(sql`drop table if exists ${users}`);\n\n\t\t\tdb.run(\n\t\t\t\tsql`create table ${users} (id integer primary key, name text)`,\n\t\t\t);\n\n\t\t\tconst insertStmt = db.insert(users).values({ id: 1, name: 'John' }).prepare();\n\t\t\tawait insertStmt.execute();\n\n\t\t\tconst selectStmt = db.select().from(users).prepare();\n\t\t\tconst res = await selectStmt.execute();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n\n\t\t\tconst updateStmt = db.update(users).set({ name: 'John1' }).where(eq(users.id, 1)).prepare();\n\t\t\tawait updateStmt.execute();\n\n\t\t\tconst res1 = await selectStmt.execute();\n\n\t\t\texpect(res1).toEqual([{ id: 1, name: 'John1' }]);\n\n\t\t\tconst deleteStmt = db.delete(users).where(eq(users.id, 1)).prepare();\n\t\t\tawait deleteStmt.execute();\n\n\t\t\tconst res2 = await selectStmt.execute();\n\n\t\t\texpect(res2).toEqual([]);\n\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('async api - insert + select w/ prepare + sync execute', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tdb.run(sql`drop table if exists ${users}`);\n\n\t\t\tdb.run(\n\t\t\t\tsql`create table ${users} (id integer primary key, name text)`,\n\t\t\t);\n\n\t\t\tconst insertStmt = db.insert(users).values({ id: 1, name: 'John' }).prepare();\n\t\t\tawait insertStmt.execute();\n\n\t\t\tconst selectStmt = db.select().from(users).prepare();\n\t\t\tconst res = await selectStmt.execute();\n\n\t\t\texpect(res).toEqual([{ id: 1, name: 'John' }]);\n\n\t\t\tconst updateStmt = db.update(users).set({ name: 'John1' }).where(eq(users.id, 1)).prepare();\n\t\t\tawait updateStmt.execute();\n\n\t\t\tconst res1 = await selectStmt.execute();\n\n\t\t\texpect(res1).toEqual([{ id: 1, name: 'John1' }]);\n\n\t\t\tconst deleteStmt = db.delete(users).where(eq(users.id, 1)).prepare();\n\t\t\tawait deleteStmt.execute();\n\n\t\t\tconst res2 = await selectStmt.execute();\n\n\t\t\texpect(res2).toEqual([]);\n\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('select + .get() for empty result', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey(),\n\t\t\t\tname: text('name'),\n\t\t\t});\n\n\t\t\tdb.run(sql`drop table if exists ${users}`);\n\n\t\t\tdb.run(\n\t\t\t\tsql`create table ${users} (id integer primary key, name text)`,\n\t\t\t);\n\n\t\t\tconst res = await db.select().from(users).where(eq(users.id, 1)).get();\n\n\t\t\texpect(res).toBeUndefined();\n\n\t\t\tawait db.run(sql`drop table ${users}`);\n\t\t});\n\n\t\ttest('set operations (union) from query builder with subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst sq = db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t.from(citiesTable).union(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table),\n\t\t\t\t).orderBy(asc(sql`name`)).as('sq');\n\n\t\t\tconst result = await db.select().from(sq).limit(5).offset(5);\n\n\t\t\texpect(result).toHaveLength(5);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 7, name: 'Mary' },\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 4, name: 'Peter' },\n\t\t\t\t{ id: 8, name: 'Sally' },\n\t\t\t]);\n\n\t\t\tawait expect(async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t.from(citiesTable).union(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t\t.from(users2Table),\n\t\t\t\t\t).orderBy(asc(sql`name`));\n\t\t\t}).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (union) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await union(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).orderBy(asc(sql`name`));\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t]);\n\n\t\t\tawait expect(async () => {\n\t\t\t\tunion(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).orderBy(asc(sql`name`));\n\t\t\t}).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (union all) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t.from(citiesTable).unionAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable),\n\t\t\t\t).orderBy(asc(citiesTable.id)).limit(5).offset(1);\n\n\t\t\texpect(result).toHaveLength(5);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait expect(async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).unionAll(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t\t.from(citiesTable),\n\t\t\t\t\t).orderBy(asc(citiesTable.id)).limit(5).offset(1);\n\t\t\t}).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (union all) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await unionAll(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t);\n\n\t\t\texpect(result).toHaveLength(3);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t\t{ id: 1, name: 'John' },\n\t\t\t]);\n\n\t\t\tawait expect(async () => {\n\t\t\t\tunionAll(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t);\n\t\t\t}).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (intersect) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t.from(citiesTable).intersect(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t).orderBy(asc(sql`name`));\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait expect(async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t.from(citiesTable).intersect(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t).orderBy(asc(sql`name`));\n\t\t\t}).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (intersect) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await intersect(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t);\n\n\t\t\texpect(result).toHaveLength(0);\n\n\t\t\texpect(result).toEqual([]);\n\n\t\t\tawait expect(async () => {\n\t\t\t\tintersect(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t);\n\t\t\t}).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (except) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(citiesTable).except(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select()\n\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t);\n\n\t\t\texpect(result).toHaveLength(1);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t]);\n\n\t\t\tawait expect(async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(citiesTable).except(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t);\n\t\t\t}).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (except) as function', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await except(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t).orderBy(asc(sql`id`));\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t]);\n\n\t\t\tawait expect(async () => {\n\t\t\t\texcept(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t.from(citiesTable),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: citiesTable.id, name: citiesTable.name })\n\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 1)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t).orderBy(asc(sql`id`));\n\t\t\t}).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (mixed) from query builder', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst result = await db\n\t\t\t\t.select()\n\t\t\t\t.from(citiesTable).except(\n\t\t\t\t\t({ unionAll }) =>\n\t\t\t\t\t\tunionAll(\n\t\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t\t.select()\n\t\t\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t\t\tdb.select().from(citiesTable).where(eq(citiesTable.id, 2)),\n\t\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\texpect(result).toHaveLength(2);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 1, name: 'New York' },\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t]);\n\n\t\t\tawait expect(async () => {\n\t\t\t\tdb\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(citiesTable).except(\n\t\t\t\t\t\t({ unionAll }) =>\n\t\t\t\t\t\t\tunionAll(\n\t\t\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t\t\t.select()\n\t\t\t\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t\t\t\t\tdb.select({ name: citiesTable.name, id: citiesTable.id })\n\t\t\t\t\t\t\t\t\t.from(citiesTable).where(eq(citiesTable.id, 2)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t}).rejects.toThrowError();\n\t\t});\n\n\t\ttest('set operations (mixed all) as function with subquery', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait setupSetOperationTest(db);\n\n\t\t\tconst sq = union(\n\t\t\t\tdb\n\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\texcept(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(gte(users2Table.id, 5)),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 7)),\n\t\t\t\t),\n\t\t\t\tdb\n\t\t\t\t\t.select().from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t).orderBy(asc(sql`id`)).as('sq');\n\n\t\t\tconst result = await db.select().from(sq).limit(4).offset(1);\n\n\t\t\texpect(result).toHaveLength(4);\n\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: 2, name: 'London' },\n\t\t\t\t{ id: 3, name: 'Tampa' },\n\t\t\t\t{ id: 5, name: 'Ben' },\n\t\t\t\t{ id: 6, name: 'Jill' },\n\t\t\t]);\n\n\t\t\tawait expect(async () => {\n\t\t\t\tunion(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 1)),\n\t\t\t\t\texcept(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t\t.from(users2Table).where(gte(users2Table.id, 5)),\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.select({ id: users2Table.id, name: users2Table.name })\n\t\t\t\t\t\t\t.from(users2Table).where(eq(users2Table.id, 7)),\n\t\t\t\t\t),\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({ name: users2Table.name, id: users2Table.id })\n\t\t\t\t\t\t.from(citiesTable).where(gt(citiesTable.id, 1)),\n\t\t\t\t).orderBy(asc(sql`id`));\n\t\t\t}).rejects.toThrowError();\n\t\t});\n\n\t\ttest('define constraints as array', async (_ctx) => {\n\t\t\tconst table = sqliteTable('name', {\n\t\t\t\tid: int(),\n\t\t\t}, (t) => [\n\t\t\t\tindex('name').on(t.id),\n\t\t\t\tprimaryKey({ columns: [t.id], name: 'custom' }),\n\t\t\t]);\n\n\t\t\tconst { indexes, primaryKeys } = getTableConfig(table);\n\n\t\t\texpect(indexes.length).toBe(1);\n\t\t\texpect(primaryKeys.length).toBe(1);\n\t\t});\n\n\t\ttest('define constraints as array inside third param', async (_ctx) => {\n\t\t\tconst table = sqliteTable('name', {\n\t\t\t\tid: int(),\n\t\t\t}, (t) => [\n\t\t\t\tindex('name').on(t.id),\n\t\t\t\tprimaryKey({ columns: [t.id], name: 'custom' }),\n\t\t\t]);\n\n\t\t\tconst { indexes, primaryKeys } = getTableConfig(table);\n\n\t\t\texpect(indexes.length).toBe(1);\n\t\t\texpect(primaryKeys.length).toBe(1);\n\t\t});\n\n\t\ttest('aggregate function: count', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: count() }).from(table);\n\t\t\tconst result2 = await db.select({ value: count(table.a) }).from(table);\n\t\t\tconst result3 = await db.select({ value: countDistinct(table.name) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe(7);\n\t\t\texpect(result2[0]?.value).toBe(5);\n\t\t\texpect(result3[0]?.value).toBe(6);\n\t\t});\n\n\t\ttest('aggregate function: avg', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: avg(table.a) }).from(table);\n\t\t\tconst result2 = await db.select({ value: avg(table.nullOnly) }).from(table);\n\t\t\tconst result3 = await db.select({ value: avgDistinct(table.b) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe('24');\n\t\t\texpect(result2[0]?.value).toBeNull();\n\t\t\texpect(result3[0]?.value).toBe('42.5');\n\t\t});\n\n\t\ttest('aggregate function: sum', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: sum(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: sum(table.nullOnly) }).from(table);\n\t\t\tconst result3 = await db.select({ value: sumDistinct(table.b) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe('200');\n\t\t\texpect(result2[0]?.value).toBeNull();\n\t\t\texpect(result3[0]?.value).toBe('170');\n\t\t});\n\n\t\ttest('aggregate function: max', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: max(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: max(table.nullOnly) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe(90);\n\t\t\texpect(result2[0]?.value).toBeNull();\n\t\t});\n\n\t\ttest('aggregate function: min', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\t\t\tconst table = aggregateTable;\n\t\t\tawait setupAggregateFunctionsTest(db);\n\n\t\t\tconst result1 = await db.select({ value: min(table.b) }).from(table);\n\t\t\tconst result2 = await db.select({ value: min(table.nullOnly) }).from(table);\n\n\t\t\texpect(result1[0]?.value).toBe(10);\n\t\t\texpect(result2[0]?.value).toBeNull();\n\t\t});\n\n\t\ttest('test $onUpdateFn and $onUpdate works as $default', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.run(sql`drop table if exists ${usersOnUpdate}`);\n\n\t\t\tawait db.run(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${usersOnUpdate} (\n\t\t\t\t\tid integer primary key autoincrement,\n\t\t\t\t\tname text not null,\n\t\t\t\t\tupdate_counter integer default 1 not null,\n\t\t\t\t\tupdated_at integer,\n\t\t\t\t\talways_null text\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(usersOnUpdate).values([\n\t\t\t\t{ name: 'John' },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Jack' },\n\t\t\t\t{ name: 'Jill' },\n\t\t\t]);\n\t\t\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\n\t\t\tconst justDates = await db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\t\t\tconst response = await db.select({ ...rest }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\t\t\texpect(response).toEqual([\n\t\t\t\t{ name: 'John', id: 1, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jane', id: 2, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jack', id: 3, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jill', id: 4, updateCounter: 1, alwaysNull: null },\n\t\t\t]);\n\t\t\tconst msDelay = 250;\n\n\t\t\tfor (const eachUser of justDates) {\n\t\t\t\texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t\t\t}\n\t\t});\n\n\t\ttest('test $onUpdateFn and $onUpdate works updating', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.run(sql`drop table if exists ${usersOnUpdate}`);\n\n\t\t\tawait db.run(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${usersOnUpdate} (\n\t\t\t\t\tid integer primary key autoincrement,\n\t\t\t\t\tname text not null,\n\t\t\t\t\tupdate_counter integer default 1,\n\t\t\t\t\tupdated_at integer,\n\t\t\t\t\talways_null text\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tawait db.insert(usersOnUpdate).values([\n\t\t\t\t{ name: 'John', alwaysNull: 'this will be null after updating' },\n\t\t\t\t{ name: 'Jane' },\n\t\t\t\t{ name: 'Jack' },\n\t\t\t\t{ name: 'Jill' },\n\t\t\t]);\n\t\t\tconst { updatedAt, ...rest } = getTableColumns(usersOnUpdate);\n\n\t\t\tawait db.update(usersOnUpdate).set({ name: 'Angel' }).where(eq(usersOnUpdate.id, 1));\n\t\t\tawait db.update(usersOnUpdate).set({ updateCounter: null }).where(eq(usersOnUpdate.id, 2));\n\n\t\t\tconst justDates = await db.select({ updatedAt }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\t\t\tconst response = await db.select({ ...rest }).from(usersOnUpdate).orderBy(asc(usersOnUpdate.id));\n\n\t\t\texpect(response).toEqual([\n\t\t\t\t{ name: 'Angel', id: 1, updateCounter: 2, alwaysNull: null },\n\t\t\t\t{ name: 'Jane', id: 2, updateCounter: null, alwaysNull: null },\n\t\t\t\t{ name: 'Jack', id: 3, updateCounter: 1, alwaysNull: null },\n\t\t\t\t{ name: 'Jill', id: 4, updateCounter: 1, alwaysNull: null },\n\t\t\t]);\n\t\t\tconst msDelay = 250;\n\n\t\t\tfor (const eachUser of justDates) {\n\t\t\t\texpect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay);\n\t\t\t}\n\t\t});\n\n\t\ttest('test $onUpdateFn and $onUpdate works with sql value', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst users = sqliteTable('users', {\n\t\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t\tupdatedAt: integer('updated_at')\n\t\t\t\t\t.notNull()\n\t\t\t\t\t.$onUpdate(() =>\n\t\t\t\t\t\tsql`(strftime('%s', 'now') * 1000) + (strftime('%f', 'now') - strftime('%S', 'now')) * 1000`\n\t\t\t\t\t),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${users}`);\n\t\t\tawait db.run(\n\t\t\t\tsql`\n\t\t\t\t\tcreate table ${users} (\n\t\t\t\t\t\t\\`id\\` integer primary key autoincrement,\n\t\t\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\t\t\\`updated_at\\` integer not null\n\t\t\t\t\t)\n\t\t\t\t`,\n\t\t\t);\n\n\t\t\tconst insertResp = await db.insert(users).values({\n\t\t\t\tname: 'John',\n\t\t\t}).returning({\n\t\t\t\tupdatedAt: users.updatedAt,\n\t\t\t});\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\n\t\t\tconst now = Date.now();\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\t\t\tconst updateResp = await db.update(users).set({\n\t\t\t\tname: 'John',\n\t\t\t}).returning({\n\t\t\t\tupdatedAt: users.updatedAt,\n\t\t\t});\n\n\t\t\texpect(insertResp[0]?.updatedAt ?? 0).lessThan(now);\n\t\t\texpect(updateResp[0]?.updatedAt ?? 0).greaterThan(now);\n\t\t});\n\n\t\ttest('$count separate', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst countTestTable = sqliteTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.run(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await db.$count(countTestTable);\n\n\t\t\tawait db.run(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).toStrictEqual(4);\n\t\t});\n\n\t\ttest('$count embedded', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst countTestTable = sqliteTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.run(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await db.select({\n\t\t\t\tcount: db.$count(countTestTable),\n\t\t\t}).from(countTestTable);\n\n\t\t\tawait db.run(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).toStrictEqual([\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('$count separate reuse', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst countTestTable = sqliteTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.run(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = db.$count(countTestTable);\n\n\t\t\tconst count1 = await count;\n\n\t\t\tawait db.insert(countTestTable).values({ id: 5, name: 'fifth' });\n\n\t\t\tconst count2 = await count;\n\n\t\t\tawait db.insert(countTestTable).values({ id: 6, name: 'sixth' });\n\n\t\t\tconst count3 = await count;\n\n\t\t\tawait db.run(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count1).toStrictEqual(4);\n\t\t\texpect(count2).toStrictEqual(5);\n\t\t\texpect(count3).toStrictEqual(6);\n\t\t});\n\n\t\ttest('$count embedded reuse', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst countTestTable = sqliteTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.run(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = db.select({\n\t\t\t\tcount: db.$count(countTestTable),\n\t\t\t}).from(countTestTable);\n\n\t\t\tconst count1 = await count;\n\n\t\t\tawait db.insert(countTestTable).values({ id: 5, name: 'fifth' });\n\n\t\t\tconst count2 = await count;\n\n\t\t\tawait db.insert(countTestTable).values({ id: 6, name: 'sixth' });\n\n\t\t\tconst count3 = await count;\n\n\t\t\tawait db.run(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count1).toStrictEqual([\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t\t{ count: 4 },\n\t\t\t]);\n\t\t\texpect(count2).toStrictEqual([\n\t\t\t\t{ count: 5 },\n\t\t\t\t{ count: 5 },\n\t\t\t\t{ count: 5 },\n\t\t\t\t{ count: 5 },\n\t\t\t\t{ count: 5 },\n\t\t\t]);\n\t\t\texpect(count3).toStrictEqual([\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t\t{ count: 6 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('$count separate with filters', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst countTestTable = sqliteTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.run(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await db.$count(countTestTable, gt(countTestTable.id, 1));\n\n\t\t\tawait db.run(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).toStrictEqual(3);\n\t\t});\n\n\t\ttest('$count embedded with filters', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tconst countTestTable = sqliteTable('count_test', {\n\t\t\t\tid: int('id').notNull(),\n\t\t\t\tname: text('name').notNull(),\n\t\t\t});\n\n\t\t\tawait db.run(sql`drop table if exists ${countTestTable}`);\n\t\t\tawait db.run(sql`create table ${countTestTable} (id int, name text)`);\n\n\t\t\tawait db.insert(countTestTable).values([\n\t\t\t\t{ id: 1, name: 'First' },\n\t\t\t\t{ id: 2, name: 'Second' },\n\t\t\t\t{ id: 3, name: 'Third' },\n\t\t\t\t{ id: 4, name: 'Fourth' },\n\t\t\t]);\n\n\t\t\tconst count = await db.select({\n\t\t\t\tcount: db.$count(countTestTable, gt(countTestTable.id, 1)),\n\t\t\t}).from(countTestTable);\n\n\t\t\tawait db.run(sql`drop table ${countTestTable}`);\n\n\t\t\texpect(count).toStrictEqual([\n\t\t\t\t{ count: 3 },\n\t\t\t\t{ count: 3 },\n\t\t\t\t{ count: 3 },\n\t\t\t\t{ count: 3 },\n\t\t\t]);\n\t\t});\n\n\t\ttest('update with limit and order by', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([\n\t\t\t\t{ name: 'Barry', verified: false },\n\t\t\t\t{ name: 'Alan', verified: false },\n\t\t\t\t{ name: 'Carl', verified: false },\n\t\t\t]);\n\n\t\t\tawait db.update(usersTable).set({ verified: true }).limit(2).orderBy(asc(usersTable.name));\n\n\t\t\tconst result = await db.select({ name: usersTable.name, verified: usersTable.verified }).from(usersTable).orderBy(\n\t\t\t\tasc(usersTable.name),\n\t\t\t);\n\n\t\t\texpect(result).toStrictEqual([\n\t\t\t\t{ name: 'Alan', verified: true },\n\t\t\t\t{ name: 'Barry', verified: true },\n\t\t\t\t{ name: 'Carl', verified: false },\n\t\t\t]);\n\t\t});\n\n\t\ttest('delete with limit and order by', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.insert(usersTable).values([\n\t\t\t\t{ name: 'Barry', verified: false },\n\t\t\t\t{ name: 'Alan', verified: false },\n\t\t\t\t{ name: 'Carl', verified: false },\n\t\t\t]);\n\n\t\t\tawait db.delete(usersTable).where(eq(usersTable.verified, false)).limit(1).orderBy(asc(usersTable.name));\n\n\t\t\tconst result = await db.select({ name: usersTable.name, verified: usersTable.verified }).from(usersTable).orderBy(\n\t\t\t\tasc(usersTable.name),\n\t\t\t);\n\t\t\texpect(result).toStrictEqual([\n\t\t\t\t{ name: 'Barry', verified: false },\n\t\t\t\t{ name: 'Carl', verified: false },\n\t\t\t]);\n\t\t});\n\n\t\ttest('cross join', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db\n\t\t\t\t.insert(usersTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'John' },\n\t\t\t\t\t{ name: 'Jane' },\n\t\t\t\t]);\n\n\t\t\tawait db\n\t\t\t\t.insert(citiesTable)\n\t\t\t\t.values([\n\t\t\t\t\t{ name: 'Seattle' },\n\t\t\t\t\t{ name: 'New York City' },\n\t\t\t\t]);\n\n\t\t\tconst result = await db\n\t\t\t\t.select({\n\t\t\t\t\tuser: usersTable.name,\n\t\t\t\t\tcity: citiesTable.name,\n\t\t\t\t})\n\t\t\t\t.from(usersTable)\n\t\t\t\t.crossJoin(citiesTable)\n\t\t\t\t.orderBy(usersTable.name, citiesTable.name);\n\n\t\t\texpect(result).toStrictEqual([\n\t\t\t\t{ city: 'New York City', user: 'Jane' },\n\t\t\t\t{ city: 'Seattle', user: 'Jane' },\n\t\t\t\t{ city: 'New York City', user: 'John' },\n\t\t\t\t{ city: 'Seattle', user: 'John' },\n\t\t\t]);\n\t\t});\n\n\t\ttest('all types', async (ctx) => {\n\t\t\tconst { db } = ctx.sqlite;\n\n\t\t\tawait db.run(sql`\n\t\t\t\tCREATE TABLE \\`all_types\\`(\n\t\t\t\t\t\\`int\\` integer,\n\t\t\t\t\t\\`bool\\` integer,\n\t\t\t\t\t\\`time\\` integer,\n\t\t\t\t\t\\`time_ms\\` integer,\n\t\t\t\t\t\\`bigint\\` blob,\n\t\t\t\t\t\\`buffer\\` blob,\n\t\t\t\t\t\\`json\\` blob,\n\t\t\t\t\t\\`numeric\\` numeric,\n\t\t\t\t\t\\`numeric_num\\` numeric,\n\t\t\t\t\t\\`numeric_big\\` numeric,\n\t\t\t\t\t\\`real\\` real,\n\t\t\t\t\t\\`text\\` text,\n\t\t\t\t\t\\`json_text\\` text\n\t\t\t\t\t);\n\t\t\t`);\n\n\t\t\tawait db.insert(allTypesTable).values({\n\t\t\t\tint: 1,\n\t\t\t\tbool: true,\n\t\t\t\tbigint: 5044565289845416380n,\n\t\t\t\tbuffer: Buffer.from([\n\t\t\t\t\t0x44,\n\t\t\t\t\t0x65,\n\t\t\t\t\t0x73,\n\t\t\t\t\t0x70,\n\t\t\t\t\t0x61,\n\t\t\t\t\t0x69,\n\t\t\t\t\t0x72,\n\t\t\t\t\t0x20,\n\t\t\t\t\t0x6F,\n\t\t\t\t\t0x20,\n\t\t\t\t\t0x64,\n\t\t\t\t\t0x65,\n\t\t\t\t\t0x73,\n\t\t\t\t\t0x70,\n\t\t\t\t\t0x61,\n\t\t\t\t\t0x69,\n\t\t\t\t\t0x72,\n\t\t\t\t\t0x2E,\n\t\t\t\t\t0x2E,\n\t\t\t\t\t0x2E,\n\t\t\t\t]),\n\t\t\t\tjson: {\n\t\t\t\t\tstr: 'strval',\n\t\t\t\t\tarr: ['str', 10],\n\t\t\t\t},\n\t\t\t\tjsonText: {\n\t\t\t\t\tstr: 'strvalb',\n\t\t\t\t\tarr: ['strb', 11],\n\t\t\t\t},\n\t\t\t\tnumeric: '475452353476',\n\t\t\t\tnumericNum: 9007199254740991,\n\t\t\t\tnumericBig: 5044565289845416380n,\n\t\t\t\treal: 1.048596,\n\t\t\t\ttext: 'TEXT STRING',\n\t\t\t\ttime: new Date(1741743161623),\n\t\t\t\ttimeMs: new Date(1741743161623),\n\t\t\t});\n\n\t\t\tconst rawRes = await db.select().from(allTypesTable);\n\n\t\t\texpect(typeof rawRes[0]?.numericBig).toStrictEqual('bigint');\n\n\t\t\ttype ExpectedType = {\n\t\t\t\tint: number | null;\n\t\t\t\tbool: boolean | null;\n\t\t\t\ttime: Date | null;\n\t\t\t\ttimeMs: Date | null;\n\t\t\t\tbigint: bigint | null;\n\t\t\t\tbuffer: Buffer | null;\n\t\t\t\tjson: unknown;\n\t\t\t\tnumeric: string | null;\n\t\t\t\tnumericNum: number | null;\n\t\t\t\tnumericBig: bigint | null;\n\t\t\t\treal: number | null;\n\t\t\t\ttext: string | null;\n\t\t\t\tjsonText: unknown;\n\t\t\t}[];\n\n\t\t\tconst expectedRes: ExpectedType = [\n\t\t\t\t{\n\t\t\t\t\tint: 1,\n\t\t\t\t\tbool: true,\n\t\t\t\t\ttime: new Date('2025-03-12T01:32:41.000Z'),\n\t\t\t\t\ttimeMs: new Date('2025-03-12T01:32:41.623Z'),\n\t\t\t\t\tbigint: 5044565289845416380n,\n\t\t\t\t\tbuffer: Buffer.from([\n\t\t\t\t\t\t0x44,\n\t\t\t\t\t\t0x65,\n\t\t\t\t\t\t0x73,\n\t\t\t\t\t\t0x70,\n\t\t\t\t\t\t0x61,\n\t\t\t\t\t\t0x69,\n\t\t\t\t\t\t0x72,\n\t\t\t\t\t\t0x20,\n\t\t\t\t\t\t0x6F,\n\t\t\t\t\t\t0x20,\n\t\t\t\t\t\t0x64,\n\t\t\t\t\t\t0x65,\n\t\t\t\t\t\t0x73,\n\t\t\t\t\t\t0x70,\n\t\t\t\t\t\t0x61,\n\t\t\t\t\t\t0x69,\n\t\t\t\t\t\t0x72,\n\t\t\t\t\t\t0x2E,\n\t\t\t\t\t\t0x2E,\n\t\t\t\t\t\t0x2E,\n\t\t\t\t\t]),\n\t\t\t\t\tjson: { str: 'strval', arr: ['str', 10] },\n\t\t\t\t\tnumeric: '475452353476',\n\t\t\t\t\tnumericNum: 9007199254740991,\n\t\t\t\t\tnumericBig: 5044565289845416380n,\n\t\t\t\t\treal: 1.048596,\n\t\t\t\t\ttext: 'TEXT STRING',\n\t\t\t\t\tjsonText: { str: 'strvalb', arr: ['strb', 11] },\n\t\t\t\t},\n\t\t\t];\n\n\t\t\texpectTypeOf(rawRes).toEqualTypeOf<ExpectedType>();\n\t\t\texpect(rawRes).toStrictEqual(expectedRes);\n\t\t});\n\t});\n\n\ttest('table configs: unique third param', () => {\n\t\tconst cities1Table = sqliteTable('cities1', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name').notNull(),\n\t\t\tstate: text('state'),\n\t\t}, (t) => ({\n\t\t\tf: unique().on(t.name, t.state),\n\t\t\tf1: unique('custom').on(t.name, t.state),\n\t\t}));\n\n\t\tconst tableConfig = getTableConfig(cities1Table);\n\n\t\texpect(tableConfig.uniqueConstraints).toHaveLength(2);\n\n\t\texpect(tableConfig.uniqueConstraints[0]?.columns.map((t) => t.name)).toEqual(['name', 'state']);\n\t\texpect(\n\t\t\ttableConfig.uniqueConstraints[0]?.name,\n\t\t).toEqual(\n\t\t\tuniqueKeyName(cities1Table, tableConfig.uniqueConstraints[0]?.columns?.map((column) => column.name) ?? []),\n\t\t);\n\n\t\texpect(tableConfig.uniqueConstraints[1]?.columns.map((t) => t.name)).toEqual(['name', 'state']);\n\t\texpect(tableConfig.uniqueConstraints[1]?.name).toBe('custom');\n\t});\n\n\ttest('table configs: unique in column', () => {\n\t\tconst cities1Table = sqliteTable('cities1', {\n\t\t\tid: int('id').primaryKey(),\n\t\t\tname: text('name').notNull().unique(),\n\t\t\tstate: text('state').unique('custom'),\n\t\t\tfield: text('field').unique(),\n\t\t});\n\n\t\tconst tableConfig = getTableConfig(cities1Table);\n\n\t\tconst columnName = tableConfig.columns.find((it) => it.name === 'name');\n\t\texpect(columnName?.isUnique).toBeTruthy();\n\t\texpect(columnName?.uniqueName).toBe(uniqueKeyName(cities1Table, [columnName!.name]));\n\n\t\tconst columnState = tableConfig.columns.find((it) => it.name === 'state');\n\t\texpect(columnState?.isUnique).toBeTruthy();\n\t\texpect(columnState?.uniqueName).toBe('custom');\n\n\t\tconst columnField = tableConfig.columns.find((it) => it.name === 'field');\n\t\texpect(columnField?.isUnique).toBeTruthy();\n\t\texpect(columnField?.uniqueName).toBe(uniqueKeyName(cities1Table, [columnField!.name]));\n\t});\n\n\ttest('limit 0', async (ctx) => {\n\t\tconst { db } = ctx.sqlite;\n\n\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\tconst users = await db\n\t\t\t.select()\n\t\t\t.from(usersTable)\n\t\t\t.limit(0);\n\n\t\texpect(users).toEqual([]);\n\t});\n\n\ttest('limit -1', async (ctx) => {\n\t\tconst { db } = ctx.sqlite;\n\n\t\tawait db.insert(usersTable).values({ name: 'John' });\n\t\tconst users = await db\n\t\t\t.select()\n\t\t\t.from(usersTable)\n\t\t\t.limit(-1);\n\n\t\texpect(users.length).toBeGreaterThan(0);\n\t});\n\n\ttest('update ... from', async (ctx) => {\n\t\tconst { db } = ctx.sqlite;\n\n\t\tawait db.run(sql`drop table if exists \\`cities\\``);\n\t\tawait db.run(sql`drop table if exists \\`users2\\``);\n\t\tawait db.run(sql`\n\t\t\tcreate table \\`cities\\` (\n\t\t\t\t\\`id\\` integer primary key autoincrement,\n\t\t\t\t\\`name\\` text not null\n\t\t\t)\n\t\t`);\n\t\tawait db.run(sql`\n\t\t\tcreate table \\`users2\\` (\n\t\t\t\t\\`id\\` integer primary key autoincrement,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`city_id\\` integer references \\`cities\\`(\\`id\\`)\n\t\t\t)\n\t\t`);\n\n\t\tawait db.insert(citiesTable).values([\n\t\t\t{ name: 'New York City' },\n\t\t\t{ name: 'Seattle' },\n\t\t]);\n\t\tawait db.insert(users2Table).values([\n\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t]);\n\n\t\tconst result = await db\n\t\t\t.update(users2Table)\n\t\t\t.set({\n\t\t\t\tcityId: citiesTable.id,\n\t\t\t})\n\t\t\t.from(citiesTable)\n\t\t\t.where(and(eq(citiesTable.name, 'Seattle'), eq(users2Table.name, 'John')))\n\t\t\t.returning();\n\n\t\texpect(result).toStrictEqual([{\n\t\t\tid: 1,\n\t\t\tname: 'John',\n\t\t\tcityId: 2,\n\t\t}]);\n\t});\n\n\ttest('update ... from with alias', async (ctx) => {\n\t\tconst { db } = ctx.sqlite;\n\n\t\tawait db.run(sql`drop table if exists \\`users2\\``);\n\t\tawait db.run(sql`drop table if exists \\`cities\\``);\n\t\tawait db.run(sql`\n\t\t\tcreate table \\`cities\\` (\n\t\t\t\t\\`id\\` integer primary key autoincrement,\n\t\t\t\t\\`name\\` text not null\n\t\t\t)\n\t\t`);\n\t\tawait db.run(sql`\n\t\t\tcreate table \\`users2\\` (\n\t\t\t\t\\`id\\` integer primary key autoincrement,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`city_id\\` integer references \\`cities\\`(\\`id\\`)\n\t\t\t)\n\t\t`);\n\n\t\tawait db.insert(citiesTable).values([\n\t\t\t{ name: 'New York City' },\n\t\t\t{ name: 'Seattle' },\n\t\t]);\n\t\tawait db.insert(users2Table).values([\n\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t]);\n\n\t\tconst cities = alias(citiesTable, 'c');\n\t\tconst result = await db\n\t\t\t.update(users2Table)\n\t\t\t.set({\n\t\t\t\tcityId: cities.id,\n\t\t\t})\n\t\t\t.from(cities)\n\t\t\t.where(and(eq(cities.name, 'Seattle'), eq(users2Table.name, 'John')))\n\t\t\t.returning();\n\n\t\texpect(result).toStrictEqual([{\n\t\t\tid: 1,\n\t\t\tname: 'John',\n\t\t\tcityId: 2,\n\t\t}]);\n\n\t\tawait db.run(sql`drop table if exists \\`users2\\``);\n\t});\n\n\ttest('update ... from with join', async (ctx) => {\n\t\tconst { db } = ctx.sqlite;\n\n\t\tconst states = sqliteTable('states', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\t\tconst cities = sqliteTable('cities', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t\tstateId: integer('state_id').references(() => states.id),\n\t\t});\n\t\tconst users = sqliteTable('users', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t\tcityId: integer('city_id').notNull().references(() => cities.id),\n\t\t});\n\n\t\tawait db.run(sql`drop table if exists \\`states\\``);\n\t\tawait db.run(sql`drop table if exists \\`cities\\``);\n\t\tawait db.run(sql`drop table if exists \\`users\\``);\n\t\tawait db.run(sql`\n\t\t\tcreate table \\`states\\` (\n\t\t\t\t\\`id\\` integer primary key autoincrement,\n\t\t\t\t\\`name\\` text not null\n\t\t\t)\n\t\t`);\n\t\tawait db.run(sql`\n\t\t\tcreate table \\`cities\\` (\n\t\t\t\t\\`id\\` integer primary key autoincrement,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`state_id\\` integer references \\`states\\`(\\`id\\`)\n\t\t\t)\n\t\t`);\n\t\tawait db.run(sql`\n\t\t\tcreate table \\`users\\` (\n\t\t\t\t\\`id\\` integer primary key autoincrement,\n\t\t\t\t\\`name\\` text not null,\n\t\t\t\t\\`city_id\\` integer not null references \\`cities\\`(\\`id\\`)\n\t\t\t)\n\t\t`);\n\n\t\tawait db.insert(states).values([\n\t\t\t{ name: 'New York' },\n\t\t\t{ name: 'Washington' },\n\t\t]);\n\t\tawait db.insert(cities).values([\n\t\t\t{ name: 'New York City', stateId: 1 },\n\t\t\t{ name: 'Seattle', stateId: 2 },\n\t\t\t{ name: 'London' },\n\t\t]);\n\t\tawait db.insert(users).values([\n\t\t\t{ name: 'John', cityId: 1 },\n\t\t\t{ name: 'Jane', cityId: 2 },\n\t\t\t{ name: 'Jack', cityId: 3 },\n\t\t]);\n\n\t\tconst result1 = await db\n\t\t\t.update(users)\n\t\t\t.set({\n\t\t\t\tcityId: cities.id,\n\t\t\t})\n\t\t\t.from(cities)\n\t\t\t.leftJoin(states, eq(cities.stateId, states.id))\n\t\t\t.where(and(eq(cities.name, 'Seattle'), eq(users.name, 'John')))\n\t\t\t.returning();\n\t\tconst result2 = await db\n\t\t\t.update(users)\n\t\t\t.set({\n\t\t\t\tcityId: cities.id,\n\t\t\t})\n\t\t\t.from(cities)\n\t\t\t.leftJoin(states, eq(cities.stateId, states.id))\n\t\t\t.where(and(eq(cities.name, 'London'), eq(users.name, 'Jack')))\n\t\t\t.returning();\n\n\t\texpect(result1).toStrictEqual([{\n\t\t\tid: 1,\n\t\t\tname: 'John',\n\t\t\tcityId: 2,\n\t\t}]);\n\t\texpect(result2).toStrictEqual([{\n\t\t\tid: 3,\n\t\t\tname: 'Jack',\n\t\t\tcityId: 3,\n\t\t}]);\n\t});\n\n\ttest('insert into ... select', async (ctx) => {\n\t\tconst { db } = ctx.sqlite;\n\n\t\tconst notifications = sqliteTable('notifications_insert_into', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\tsentAt: integer('sent_at', { mode: 'timestamp' }).notNull().default(sql`current_timestamp`),\n\t\t\tmessage: text('message').notNull(),\n\t\t});\n\t\tconst users = sqliteTable('users_insert_into', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\t\tconst userNotications = sqliteTable('user_notifications_insert_into', {\n\t\t\tuserId: integer('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),\n\t\t\tnotificationId: integer('notification_id').notNull().references(() => notifications.id, { onDelete: 'cascade' }),\n\t\t}, (t) => ({\n\t\t\tpk: primaryKey({ columns: [t.userId, t.notificationId] }),\n\t\t}));\n\n\t\tawait db.run(sql`drop table if exists notifications_insert_into`);\n\t\tawait db.run(sql`drop table if exists users_insert_into`);\n\t\tawait db.run(sql`drop table if exists user_notifications_insert_into`);\n\t\tawait db.run(sql`\n\t\t\tcreate table notifications_insert_into (\n\t\t\t\tid integer primary key autoincrement,\n\t\t\t\tsent_at integer not null default (current_timestamp),\n\t\t\t\tmessage text not null\n\t\t\t)\n\t\t`);\n\t\tawait db.run(sql`\n\t\t\tcreate table users_insert_into (\n\t\t\t\tid integer primary key autoincrement,\n\t\t\t\tname text not null\n\t\t\t)\n\t\t`);\n\t\tawait db.run(sql`\n\t\t\tcreate table user_notifications_insert_into (\n\t\t\t\tuser_id integer references users_insert_into(id) on delete cascade,\n\t\t\t\tnotification_id integer references notifications_insert_into(id) on delete cascade,\n\t\t\t\tprimary key (user_id, notification_id)\n\t\t\t)\n\t\t`);\n\n\t\tconst newNotification = await db\n\t\t\t.insert(notifications)\n\t\t\t.values({ message: 'You are one of the 3 lucky winners!' })\n\t\t\t.returning({ id: notifications.id })\n\t\t\t.then((result) => result[0]);\n\t\tawait db.insert(users).values([\n\t\t\t{ name: 'Alice' },\n\t\t\t{ name: 'Bob' },\n\t\t\t{ name: 'Charlie' },\n\t\t\t{ name: 'David' },\n\t\t\t{ name: 'Eve' },\n\t\t]);\n\n\t\tconst sentNotifications = await db\n\t\t\t.insert(userNotications)\n\t\t\t.select(\n\t\t\t\tdb\n\t\t\t\t\t.select({\n\t\t\t\t\t\tuserId: users.id,\n\t\t\t\t\t\tnotificationId: sql`${newNotification!.id}`.as('notification_id'),\n\t\t\t\t\t})\n\t\t\t\t\t.from(users)\n\t\t\t\t\t.where(inArray(users.name, ['Alice', 'Charlie', 'Eve']))\n\t\t\t\t\t.orderBy(asc(users.id)),\n\t\t\t)\n\t\t\t.returning();\n\n\t\texpect(sentNotifications).toStrictEqual([\n\t\t\t{ userId: 1, notificationId: newNotification!.id },\n\t\t\t{ userId: 3, notificationId: newNotification!.id },\n\t\t\t{ userId: 5, notificationId: newNotification!.id },\n\t\t]);\n\t});\n\n\ttest('insert into ... select with keys in different order', async (ctx) => {\n\t\tconst { db } = ctx.sqlite;\n\n\t\tconst users1 = sqliteTable('users1', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\t\tconst users2 = sqliteTable('users2', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\tawait db.run(sql`drop table if exists users1`);\n\t\tawait db.run(sql`drop table if exists users2`);\n\t\tawait db.run(sql`\n\t\t\tcreate table users1 (\n\t\t\t\tid integer primary key autoincrement,\n\t\t\t\tname text not null\n\t\t\t)\n\t\t`);\n\t\tawait db.run(sql`\n\t\t\tcreate table users2 (\n\t\t\t\tid integer primary key autoincrement,\n\t\t\t\tname text not null\n\t\t\t)\n\t\t`);\n\n\t\tawait expect(async () => {\n\t\t\tdb\n\t\t\t\t.insert(users1)\n\t\t\t\t.select(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.select({\n\t\t\t\t\t\t\tname: users2.name,\n\t\t\t\t\t\t\tid: users2.id,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.from(users2),\n\t\t\t\t);\n\t\t}).rejects.toThrowError();\n\t});\n\n\ttest('Object keys as column names', async (ctx) => {\n\t\tconst { db } = ctx.sqlite;\n\n\t\t// Tests the following:\n\t\t// Column with optional config without providing a value\n\t\t// Column with optional config providing a value\n\t\t// Column without config\n\t\tconst users = sqliteTable('users', {\n\t\t\tid: integer().primaryKey({ autoIncrement: true }),\n\t\t\tcreatedAt: integer({ mode: 'timestamp' }),\n\t\t\tname: text(),\n\t\t});\n\n\t\tawait db.run(sql`drop table if exists users`);\n\t\tawait db.run(\n\t\t\tsql`\n\t\t\t\tcreate table users (\n\t\t\t\t\t\\`id\\` integer primary key autoincrement,\n\t\t\t\t\t\\`createdAt\\` integer,\n\t\t\t\t\t\\`name\\` text\n\t\t\t\t)\n\t\t\t`,\n\t\t);\n\n\t\tawait db.insert(users).values([\n\t\t\t{ createdAt: new Date(Date.now() - 2592000000), name: 'John' },\n\t\t\t{ createdAt: new Date(Date.now() - 86400000), name: 'Jane' },\n\t\t]);\n\t\tconst result = await db\n\t\t\t.select({ id: users.id, name: users.name })\n\t\t\t.from(users)\n\t\t\t.where(gt(users.createdAt, new Date(Date.now() - 2592000000)));\n\n\t\texpect(result).toEqual([\n\t\t\t{ id: 2, name: 'Jane' },\n\t\t]);\n\n\t\tawait db.run(sql`drop table users`);\n\t});\n\n\ttest('sql operator as cte', async (ctx) => {\n\t\tconst { db } = ctx.sqlite;\n\n\t\tconst users = sqliteTable('users', {\n\t\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\t\tname: text('name').notNull(),\n\t\t});\n\n\t\tawait db.run(sql`drop table if exists ${users}`);\n\t\tawait db.run(sql`create table ${users} (id integer not null primary key autoincrement, name text not null)`);\n\t\tawait db.insert(users).values([\n\t\t\t{ name: 'John' },\n\t\t\t{ name: 'Jane' },\n\t\t]);\n\n\t\tconst sq1 = db.$with('sq', {\n\t\t\tuserId: users.id,\n\t\t\tdata: {\n\t\t\t\tname: users.name,\n\t\t\t},\n\t\t}).as(sql`select * from ${users} where ${users.name} = 'John'`);\n\t\tconst result1 = await db.with(sq1).select().from(sq1);\n\n\t\tconst sq2 = db.$with('sq', {\n\t\t\tuserId: users.id,\n\t\t\tdata: {\n\t\t\t\tname: users.name,\n\t\t\t},\n\t\t}).as(() => sql`select * from ${users} where ${users.name} = 'Jane'`);\n\t\tconst result2 = await db.with(sq2).select().from(sq1);\n\n\t\texpect(result1).toEqual([{ userId: 1, data: { name: 'John' } }]);\n\t\texpect(result2).toEqual([{ userId: 2, data: { name: 'Jane' } }]);\n\t});\n}\n"
  },
  {
    "path": "integration-tests/tests/sqlite/sqlite-proxy-batch.test.ts",
    "content": "/* eslint-disable drizzle-internal/require-entity-kind */\nimport type BetterSqlite3 from 'better-sqlite3';\nimport Database from 'better-sqlite3';\nimport { eq, relations, sql } from 'drizzle-orm';\nimport type { AnySQLiteColumn } from 'drizzle-orm/sqlite-core';\nimport { integer, primaryKey, sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport type { SqliteRemoteDatabase, SqliteRemoteResult } from 'drizzle-orm/sqlite-proxy';\nimport { drizzle as proxyDrizzle } from 'drizzle-orm/sqlite-proxy';\nimport { afterAll, beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest';\n\nexport const usersTable = sqliteTable('users', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tverified: integer('verified').notNull().default(0),\n\tinvitedBy: integer('invited_by').references((): AnySQLiteColumn => usersTable.id),\n});\nexport const usersConfig = relations(usersTable, ({ one, many }) => ({\n\tinvitee: one(usersTable, {\n\t\tfields: [usersTable.invitedBy],\n\t\treferences: [usersTable.id],\n\t}),\n\tusersToGroups: many(usersToGroupsTable),\n\tposts: many(postsTable),\n}));\n\nexport const groupsTable = sqliteTable('groups', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tname: text('name').notNull(),\n\tdescription: text('description'),\n});\nexport const groupsConfig = relations(groupsTable, ({ many }) => ({\n\tusersToGroups: many(usersToGroupsTable),\n}));\n\nexport const usersToGroupsTable = sqliteTable(\n\t'users_to_groups',\n\t{\n\t\tid: integer('id').primaryKey({ autoIncrement: true }),\n\t\tuserId: integer('user_id', { mode: 'number' }).notNull().references(\n\t\t\t() => usersTable.id,\n\t\t),\n\t\tgroupId: integer('group_id', { mode: 'number' }).notNull().references(\n\t\t\t() => groupsTable.id,\n\t\t),\n\t},\n\t(t) => ({\n\t\tpk: primaryKey({ columns: [t.userId, t.groupId] }),\n\t}),\n);\nexport const usersToGroupsConfig = relations(usersToGroupsTable, ({ one }) => ({\n\tgroup: one(groupsTable, {\n\t\tfields: [usersToGroupsTable.groupId],\n\t\treferences: [groupsTable.id],\n\t}),\n\tuser: one(usersTable, {\n\t\tfields: [usersToGroupsTable.userId],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n\nexport const postsTable = sqliteTable('posts', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcontent: text('content').notNull(),\n\townerId: integer('owner_id', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tcreatedAt: integer('created_at', { mode: 'timestamp_ms' })\n\t\t.notNull().default(sql`current_timestamp`),\n});\nexport const postsConfig = relations(postsTable, ({ one, many }) => ({\n\tauthor: one(usersTable, {\n\t\tfields: [postsTable.ownerId],\n\t\treferences: [usersTable.id],\n\t}),\n\tcomments: many(commentsTable),\n}));\n\nexport const commentsTable = sqliteTable('comments', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcontent: text('content').notNull(),\n\tcreator: integer('creator', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tpostId: integer('post_id', { mode: 'number' }).references(() => postsTable.id),\n\tcreatedAt: integer('created_at', { mode: 'timestamp_ms' })\n\t\t.notNull().default(sql`current_timestamp`),\n});\nexport const commentsConfig = relations(commentsTable, ({ one, many }) => ({\n\tpost: one(postsTable, {\n\t\tfields: [commentsTable.postId],\n\t\treferences: [postsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentsTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n\tlikes: many(commentLikesTable),\n}));\n\nexport const commentLikesTable = sqliteTable('comment_likes', {\n\tid: integer('id').primaryKey({ autoIncrement: true }),\n\tcreator: integer('creator', { mode: 'number' }).references(\n\t\t() => usersTable.id,\n\t),\n\tcommentId: integer('comment_id', { mode: 'number' }).references(\n\t\t() => commentsTable.id,\n\t),\n\tcreatedAt: integer('created_at', { mode: 'timestamp_ms' })\n\t\t.notNull().default(sql`current_timestamp`),\n});\nexport const commentLikesConfig = relations(commentLikesTable, ({ one }) => ({\n\tcomment: one(commentsTable, {\n\t\tfields: [commentLikesTable.commentId],\n\t\treferences: [commentsTable.id],\n\t}),\n\tauthor: one(usersTable, {\n\t\tfields: [commentLikesTable.creator],\n\t\treferences: [usersTable.id],\n\t}),\n}));\n\nconst schema = {\n\tusersTable,\n\tpostsTable,\n\tcommentsTable,\n\tusersToGroupsTable,\n\tgroupsTable,\n\tcommentLikesConfig,\n\tcommentsConfig,\n\tpostsConfig,\n\tusersToGroupsConfig,\n\tgroupsConfig,\n\tusersConfig,\n};\n\nclass ServerSimulator {\n\tconstructor(private db: BetterSqlite3.Database) {}\n\n\tasync batch(queries: { sql: string; params: any[]; method: string }[]) {\n\t\tconst results: { rows: any }[] = [];\n\t\tfor (const query of queries) {\n\t\t\tconst { method, sql, params } = query;\n\n\t\t\tif (method === 'run') {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = this.db.prepare(sql).run(params);\n\t\t\t\t\tresults.push(result as any);\n\t\t\t\t} catch (e: any) {\n\t\t\t\t\treturn { error: e.message };\n\t\t\t\t}\n\t\t\t} else if (method === 'all' || method === 'values') {\n\t\t\t\ttry {\n\t\t\t\t\tconst rows = this.db.prepare(sql).raw().all(params);\n\t\t\t\t\tresults.push({ rows: rows });\n\t\t\t\t} catch (e: any) {\n\t\t\t\t\treturn { error: e.message };\n\t\t\t\t}\n\t\t\t} else if (method === 'get') {\n\t\t\t\ttry {\n\t\t\t\t\tconst row = this.db.prepare(sql).raw().get(params);\n\t\t\t\t\tresults.push({ rows: row });\n\t\t\t\t} catch (e: any) {\n\t\t\t\t\treturn { error: e.message };\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn { error: 'Unknown method value' };\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t}\n\n\tasync query(sql: string, params: any[], method: string) {\n\t\tif (method === 'run') {\n\t\t\ttry {\n\t\t\t\tconst result = this.db.prepare(sql).run(params);\n\t\t\t\treturn { data: result as any };\n\t\t\t} catch (e: any) {\n\t\t\t\treturn { error: e.message };\n\t\t\t}\n\t\t} else if (method === 'all' || method === 'values') {\n\t\t\ttry {\n\t\t\t\tconst rows = this.db.prepare(sql).raw().all(params);\n\t\t\t\treturn { data: rows };\n\t\t\t} catch (e: any) {\n\t\t\t\treturn { error: e.message };\n\t\t\t}\n\t\t} else if (method === 'get') {\n\t\t\ttry {\n\t\t\t\tconst row = this.db.prepare(sql).raw().get(params);\n\t\t\t\treturn { data: row };\n\t\t\t} catch (e: any) {\n\t\t\t\treturn { error: e.message };\n\t\t\t}\n\t\t} else {\n\t\t\treturn { error: 'Unknown method value' };\n\t\t}\n\t}\n\n\tmigrations(queries: string[]) {\n\t\tthis.db.exec('BEGIN');\n\t\ttry {\n\t\t\tfor (const query of queries) {\n\t\t\t\tthis.db.exec(query);\n\t\t\t}\n\t\t\tthis.db.exec('COMMIT');\n\t\t} catch {\n\t\t\tthis.db.exec('ROLLBACK');\n\t\t}\n\n\t\treturn {};\n\t}\n}\n\nlet db: SqliteRemoteDatabase<typeof schema>;\nlet client: Database.Database;\nlet serverSimulator: ServerSimulator;\n\nbeforeAll(async () => {\n\tconst dbPath = process.env['SQLITE_DB_PATH'] ?? ':memory:';\n\tclient = new Database(dbPath);\n\tserverSimulator = new ServerSimulator(client);\n\n\tdb = proxyDrizzle(async (sql, params, method) => {\n\t\ttry {\n\t\t\t// console.log(sql, params, method);\n\t\t\tconst rows = await serverSimulator.query(sql, params, method);\n\n\t\t\t// console.log('rowsTest', rows);\n\n\t\t\tif (rows.error !== undefined) {\n\t\t\t\tthrow new Error(rows.error);\n\t\t\t}\n\n\t\t\treturn { rows: rows.data };\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error from sqlite proxy server:', e.response.data);\n\t\t\tthrow e;\n\t\t}\n\t}, async (queries) => {\n\t\ttry {\n\t\t\tconst result = await serverSimulator.batch(queries);\n\n\t\t\tif ((result as any).error !== undefined) {\n\t\t\t\tthrow new Error((result as any).error);\n\t\t\t}\n\n\t\t\treturn result as { rows: any }[];\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error from sqlite proxy server:', e);\n\t\t\tthrow e;\n\t\t}\n\t}, { schema });\n});\n\nbeforeEach(async () => {\n\tawait db.run(sql`drop table if exists \\`groups\\``);\n\tawait db.run(sql`drop table if exists \\`users\\``);\n\tawait db.run(sql`drop table if exists \\`users_to_groups\\``);\n\tawait db.run(sql`drop table if exists \\`posts\\``);\n\tawait db.run(sql`drop table if exists \\`comments\\``);\n\tawait db.run(sql`drop table if exists \\`comment_likes\\``);\n\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`users\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`name\\` text NOT NULL,\n\t\t\t    \\`verified\\` integer DEFAULT 0 NOT NULL,\n\t\t\t    \\`invited_by\\` integer\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`groups\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`name\\` text NOT NULL,\n\t\t\t    \\`description\\` text\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`users_to_groups\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`user_id\\` integer NOT NULL,\n\t\t\t    \\`group_id\\` integer NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`posts\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`content\\` text NOT NULL,\n\t\t\t    \\`owner_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`comments\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`content\\` text NOT NULL,\n\t\t\t    \\`creator\\` integer,\n\t\t\t    \\`post_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n\tawait db.run(\n\t\tsql`\n\t\t\tCREATE TABLE \\`comment_likes\\` (\n\t\t\t    \\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\t\t    \\`creator\\` integer,\n\t\t\t    \\`comment_id\\` integer,\n\t\t\t    \\`created_at\\` integer DEFAULT current_timestamp NOT NULL\n\t\t\t);\n\t\t`,\n\t);\n});\n\nafterAll(async () => {\n\tawait db.run(sql`drop table if exists \\`groups\\``);\n\tawait db.run(sql`drop table if exists \\`users\\``);\n\tawait db.run(sql`drop table if exists \\`users_to_groups\\``);\n\tawait db.run(sql`drop table if exists \\`posts\\``);\n\tawait db.run(sql`drop table if exists \\`comments\\``);\n\tawait db.run(sql`drop table if exists \\`comment_likes\\``);\n\n\tclient.close();\n});\n\ntest('findMany + findOne api example', async () => {\n\tconst user = await db.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id });\n\tconst insertRes = await db.insert(usersTable).values({ id: 2, name: 'Dan' });\n\tconst manyUsers = await db.query.usersTable.findMany({});\n\tconst oneUser = await db.query.usersTable.findFirst({});\n\n\texpectTypeOf(user).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t}[]\n\t>;\n\n\texpectTypeOf(insertRes).toEqualTypeOf<SqliteRemoteResult>;\n\n\texpectTypeOf(manyUsers).toEqualTypeOf<{\n\t\tid: number;\n\t\tname: string;\n\t\tverified: number;\n\t\tinvitedBy: number | null;\n\t}[]>;\n\n\texpectTypeOf(oneUser).toEqualTypeOf<\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t} | undefined\n\t>;\n\n\texpect(user).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\texpect(insertRes).toEqual({ rows: { changes: 1, lastInsertRowid: 2 } });\n\n\texpect(manyUsers).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n\n\texpect(oneUser).toEqual(\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t);\n});\n\ntest('batch api example', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({\n\t\t\tid: usersTable.id,\n\t\t\tinvitedBy: usersTable.invitedBy,\n\t\t}),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.select().from(usersTable),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\tSqliteRemoteResult,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t]>();\n\n\texpect(batchResponse.length).eq(3);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t\tinvitedBy: null,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ changes: 1, lastInsertRowid: 2 });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n});\n\n// batch api only relational many\ntest('insert + findMany', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.query.usersTable.findMany({}),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tSqliteRemoteResult,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t]>();\n\n\texpect(batchResponse.length).eq(3);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ changes: 1, lastInsertRowid: 2 });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n});\n\n// batch api relational many + one\ntest('insert + findMany + findFirst', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.query.usersTable.findMany({}),\n\t\tdb.query.usersTable.findFirst({}),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tSqliteRemoteResult,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t} | undefined,\n\t]>();\n\n\texpect(batchResponse.length).eq(4);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ changes: 1, lastInsertRowid: 2 });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[3]).toEqual(\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t);\n});\n\ntest.skip('insert + db.all + db.get + db.values + db.run', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.run(sql`insert into users (id, name) values (2, 'Dan')`),\n\t\tdb.all<typeof usersTable.$inferSelect>(sql`select * from users`),\n\t\tdb.values(sql`select * from users`),\n\t\tdb.get<typeof usersTable.$inferSelect>(sql`select * from users`),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tSqliteRemoteResult,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\tunknown[][],\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t},\n\t]>();\n\n\texpect(batchResponse.length).eq(5);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ changes: 1, lastInsertRowid: 2 });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invited_by: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invited_by: null },\n\t]);\n\n\texpect(batchResponse[3].map((row) => Array.prototype.slice.call(row))).toEqual([\n\t\t[1, 'John', 0, null],\n\t\t[2, 'Dan', 0, null],\n\t]);\n\n\texpect(batchResponse[4]).toEqual(\n\t\t{ id: 1, name: 'John', verified: 0, invited_by: null },\n\t);\n});\n\n// batch api combined rqb + raw call\ntest('insert + findManyWith + db.all', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.query.usersTable.findMany({}),\n\t\tdb.all<typeof usersTable.$inferSelect>(sql`select * from users`),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tSqliteRemoteResult,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t]>();\n\n\texpect(batchResponse.length).eq(4);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ changes: 1, lastInsertRowid: 2 });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'John', verified: 0, invitedBy: null },\n\t\t{ id: 2, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[3]).toEqual([\n\t\t[1, 'John', 0, null],\n\t\t[2, 'Dan', 0, null],\n\t\t// { id: 1, name: 'John', verified: 0, invited_by: null },\n\t\t// { id: 2, name: 'Dan', verified: 0, invited_by: null },\n\t]);\n});\n\n// batch api for insert + update + select\ntest('insert + update + select + select partial', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.update(usersTable).set({ name: 'Dan' }).where(eq(usersTable.id, 1)),\n\t\tdb.query.usersTable.findMany({}),\n\t\tdb.select().from(usersTable).where(eq(usersTable.id, 1)),\n\t\tdb.select({ id: usersTable.id, invitedBy: usersTable.invitedBy }).from(usersTable),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tSqliteRemoteResult,\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tname: string;\n\t\t\tverified: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t]>();\n\n\texpect(batchResponse.length).eq(5);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ changes: 1, lastInsertRowid: 1 });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[3]).toEqual([\n\t\t{ id: 1, name: 'Dan', verified: 0, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[4]).toEqual([\n\t\t{ id: 1, invitedBy: null },\n\t]);\n});\n\n// batch api for insert + delete + select\ntest('insert + delete + select + select partial', async () => {\n\tconst batchResponse = await db.batch([\n\t\tdb.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),\n\t\tdb.insert(usersTable).values({ id: 2, name: 'Dan' }),\n\t\tdb.delete(usersTable).where(eq(usersTable.id, 1)).returning({ id: usersTable.id, invitedBy: usersTable.invitedBy }),\n\t\tdb.query.usersTable.findFirst({\n\t\t\tcolumns: {\n\t\t\t\tid: true,\n\t\t\t\tinvitedBy: true,\n\t\t\t},\n\t\t}),\n\t]);\n\n\texpectTypeOf(batchResponse).toEqualTypeOf<[\n\t\t{\n\t\t\tid: number;\n\t\t}[],\n\t\tSqliteRemoteResult,\n\t\t{\n\t\t\tid: number;\n\t\t\tinvitedBy: number | null;\n\t\t}[],\n\t\t{\n\t\t\tid: number;\n\t\t\tinvitedBy: number | null;\n\t\t} | undefined,\n\t]>();\n\n\texpect(batchResponse.length).eq(4);\n\n\texpect(batchResponse[0]).toEqual([{\n\t\tid: 1,\n\t}]);\n\n\texpect(batchResponse[1]).toEqual({ changes: 1, lastInsertRowid: 2 });\n\n\texpect(batchResponse[2]).toEqual([\n\t\t{ id: 1, invitedBy: null },\n\t]);\n\n\texpect(batchResponse[3]).toEqual(\n\t\t{ id: 2, invitedBy: null },\n\t);\n});\n"
  },
  {
    "path": "integration-tests/tests/sqlite/sqlite-proxy.test.ts",
    "content": "/* eslint-disable drizzle-internal/require-entity-kind */\nimport type BetterSqlite3 from 'better-sqlite3';\nimport Database from 'better-sqlite3';\nimport { Name, sql } from 'drizzle-orm';\nimport type { SqliteRemoteDatabase } from 'drizzle-orm/sqlite-proxy';\nimport { drizzle as proxyDrizzle } from 'drizzle-orm/sqlite-proxy';\nimport { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';\nimport { skipTests } from '~/common';\nimport { tests, usersTable } from './sqlite-common';\nimport { TestCache, TestGlobalCache, tests as cacheTests } from './sqlite-common-cache';\n\nclass ServerSimulator {\n\tconstructor(private db: BetterSqlite3.Database) {}\n\n\tasync query(sql: string, params: any[], method: string) {\n\t\tif (method === 'run') {\n\t\t\ttry {\n\t\t\t\tconst result = this.db.prepare(sql).run(params);\n\t\t\t\treturn { data: result as any };\n\t\t\t} catch (e: any) {\n\t\t\t\treturn { error: e.message };\n\t\t\t}\n\t\t} else if (method === 'all' || method === 'values') {\n\t\t\ttry {\n\t\t\t\tconst rows = this.db.prepare(sql).raw().all(params);\n\t\t\t\treturn { data: rows };\n\t\t\t} catch (e: any) {\n\t\t\t\treturn { error: e.message };\n\t\t\t}\n\t\t} else if (method === 'get') {\n\t\t\ttry {\n\t\t\t\tconst row = this.db.prepare(sql).raw().get(params);\n\t\t\t\treturn { data: row };\n\t\t\t} catch (e: any) {\n\t\t\t\treturn { error: e.message };\n\t\t\t}\n\t\t} else {\n\t\t\treturn { error: 'Unknown method value' };\n\t\t}\n\t}\n\n\tmigrations(queries: string[]) {\n\t\tthis.db.exec('BEGIN');\n\t\ttry {\n\t\t\tfor (const query of queries) {\n\t\t\t\tthis.db.exec(query);\n\t\t\t}\n\t\t\tthis.db.exec('COMMIT');\n\t\t} catch {\n\t\t\tthis.db.exec('ROLLBACK');\n\t\t}\n\n\t\treturn {};\n\t}\n}\n\nlet db: SqliteRemoteDatabase;\nlet dbGlobalCached: SqliteRemoteDatabase;\nlet cachedDb: SqliteRemoteDatabase;\nlet client: Database.Database;\nlet serverSimulator: ServerSimulator;\n\nbeforeAll(async () => {\n\tconst dbPath = process.env['SQLITE_DB_PATH'] ?? ':memory:';\n\tclient = new Database(dbPath);\n\tserverSimulator = new ServerSimulator(client);\n\n\tconst callback = async (sql: string, params: any[], method: string) => {\n\t\ttry {\n\t\t\tconst rows = await serverSimulator.query(sql, params, method);\n\n\t\t\tif (rows.error !== undefined) {\n\t\t\t\tthrow new Error(rows.error);\n\t\t\t}\n\n\t\t\treturn { rows: rows.data };\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error from sqlite proxy server:', e.response?.data ?? e.message);\n\t\t\tthrow e;\n\t\t}\n\t};\n\tdb = proxyDrizzle(callback);\n\tcachedDb = proxyDrizzle(callback, { cache: new TestCache() });\n\tdbGlobalCached = proxyDrizzle(callback, { cache: new TestGlobalCache() });\n});\n\nbeforeEach((ctx) => {\n\tctx.sqlite = {\n\t\tdb,\n\t};\n\tctx.cachedSqlite = {\n\t\tdb: cachedDb,\n\t\tdbGlobalCached,\n\t};\n});\n\nafterAll(async () => {\n\tclient?.close();\n});\n\nskipTests([\n\t// Different driver respond\n\t'insert via db.get w/ query builder',\n\t'insert via db.run + select via db.get',\n\t'insert via db.get',\n\t'insert via db.run + select via db.all',\n]);\ncacheTests();\ntests();\n\nbeforeEach(async () => {\n\tawait db.run(sql`drop table if exists ${usersTable}`);\n\n\tawait db.run(sql`\n\t\tcreate table ${usersTable} (\n\t\t id integer primary key,\n\t\t name text not null,\n\t\t verified integer not null default 0,\n\t\t json blob,\n\t\t created_at integer not null default (strftime('%s', 'now'))\n\t\t)\n\t`);\n});\n\ntest('insert via db.get w/ query builder', async () => {\n\tconst inserted = await db.get<Pick<typeof usersTable.$inferSelect, 'id' | 'name'>>(\n\t\tdb.insert(usersTable).values({ name: 'John' }).returning({ id: usersTable.id, name: usersTable.name }),\n\t);\n\texpect(inserted).toEqual([1, 'John']);\n});\n\ntest('insert via db.run + select via db.get', async () => {\n\tawait db.run(sql`insert into ${usersTable} (${new Name(usersTable.name.name)}) values (${'John'})`);\n\n\tconst result = await db.get<{ id: number; name: string }>(\n\t\tsql`select ${usersTable.id}, ${usersTable.name} from ${usersTable}`,\n\t);\n\texpect(result).toEqual([1, 'John']);\n});\n\ntest('insert via db.get', async () => {\n\tconst inserted = await db.get<{ id: number; name: string }>(\n\t\tsql`insert into ${usersTable} (${new Name(\n\t\t\tusersTable.name.name,\n\t\t)}) values (${'John'}) returning ${usersTable.id}, ${usersTable.name}`,\n\t);\n\texpect(inserted).toEqual([1, 'John']);\n});\n\ntest('insert via db.run + select via db.all', async (ctx) => {\n\tconst { db } = ctx.sqlite;\n\n\tawait db.run(sql`insert into ${usersTable} (${new Name(usersTable.name.name)}) values (${'John'})`);\n\n\tconst result = await db.all<{ id: number; name: string }>(sql`select id, name from \"users\"`);\n\texpect(result).toEqual([[1, 'John']]);\n});\n"
  },
  {
    "path": "integration-tests/tests/utils/is-config.test.ts",
    "content": "import 'dotenv/config';\nimport { PGlite as pglite } from '@electric-sql/pglite';\nimport { createClient as libsql } from '@libsql/client';\nimport { Client as neonClient, neon, neonConfig, Pool as neonPool } from '@neondatabase/serverless';\nimport { connect as planetscale } from '@planetscale/database';\nimport { connect as tidb } from '@tidbcloud/serverless';\nimport { createClient as vcClient, sql as vcSql } from '@vercel/postgres';\nimport betterSqlite3 from 'better-sqlite3';\nimport { type DrizzleConfig, isConfig } from 'drizzle-orm';\nimport { createConnection as ms2Connection, createPool as ms2Pool } from 'mysql2';\nimport { createConnection as ms2pConnection, createPool as ms2pPool } from 'mysql2/promise';\nimport pg from 'pg';\nimport postgres from 'postgres';\nimport { describe, expect } from 'vitest';\nimport ws from 'ws';\n\nneonConfig.webSocketConstructor = ws;\n\nif (\n\t!process.env['PG_CONNECTION_STRING'] || !process.env['MYSQL_CONNECTION_STRING']\n\t|| !process.env['PLANETSCALE_CONNECTION_STRING'] || !process.env['TIDB_CONNECTION_STRING']\n\t|| !process.env['NEON_CONNECTION_STRING']\n\t// todo get back after we will have a pool for vercel\n\t// || !process.env['VERCEL_CONNECTION_STRING']\n) {\n\tthrow new Error('process.env is missing some connection strings!');\n}\n\n// process.env['POSTGRES_URL'] = process.env['VERCEL_CONNECTION_STRING'];\n\ndescribe('Objects', (it) => {\n\tit('Passes configs', () => {\n\t\texpect(isConfig({} as DrizzleConfig)).toEqual(true);\n\n\t\texpect(\n\t\t\tisConfig({\n\t\t\t\tcasing: 'camelCase',\n\t\t\t} as DrizzleConfig),\n\t\t).toEqual(true);\n\n\t\texpect(\n\t\t\tisConfig({\n\t\t\t\tlogger: true,\n\t\t\t} as DrizzleConfig),\n\t\t).toEqual(true);\n\n\t\texpect(\n\t\t\tisConfig({\n\t\t\t\tlogger: {\n\t\t\t\t\tlogQuery: () => {},\n\t\t\t\t},\n\t\t\t} as DrizzleConfig),\n\t\t).toEqual(true);\n\n\t\texpect(\n\t\t\tisConfig({\n\t\t\t\tschema: {\n\t\t\t\t\tany: true,\n\t\t\t\t},\n\t\t\t} as DrizzleConfig<any>),\n\t\t).toEqual(true);\n\n\t\texpect(\n\t\t\tisConfig({\n\t\t\t\tcasing: 'camelCase',\n\t\t\t\tlogger: true,\n\t\t\t\tschema: {\n\t\t\t\t\tany: true,\n\t\t\t\t},\n\t\t\t} as DrizzleConfig<any>),\n\t\t).toEqual(true);\n\n\t\texpect(\n\t\t\tisConfig({\n\t\t\t\tcasing: 'camelCase',\n\t\t\t\ttrash: true,\n\t\t\t} as DrizzleConfig),\n\t\t).toEqual(true);\n\t});\n\n\tit('Rejects non-configs', () => {\n\t\texpect(isConfig('')).toEqual(false);\n\n\t\texpect(isConfig('data')).toEqual(false);\n\n\t\texpect(isConfig(true)).toEqual(false);\n\n\t\texpect(isConfig(false)).toEqual(false);\n\n\t\texpect(isConfig(null)).toEqual(false);\n\n\t\texpect(isConfig(undefined)).toEqual(false);\n\n\t\texpect(isConfig(5)).toEqual(false);\n\n\t\texpect(isConfig(BigInt(5))).toEqual(false);\n\n\t\texpect(isConfig(new Date())).toEqual(false);\n\n\t\texpect(\n\t\t\tisConfig({\n\t\t\t\ttrash: true,\n\t\t\t} as DrizzleConfig),\n\t\t).toEqual(false);\n\t});\n});\n\ndescribe('Rejects drivers', (it) => {\n\tit('libsql', () => {\n\t\tconst cl = libsql({\n\t\t\turl: ':memory:',\n\t\t});\n\n\t\texpect(isConfig(cl)).toEqual(false);\n\t});\n\n\tit('better-sqlite3', () => {\n\t\tconst cl = new betterSqlite3(':memory:');\n\n\t\texpect(isConfig(cl)).toEqual(false);\n\t});\n\n\tit('pglite', () => {\n\t\tconst cl = new pglite('memory://');\n\n\t\texpect(isConfig(cl)).toEqual(false);\n\t});\n\n\tit('node-postgres:Pool', () => {\n\t\tconst cl = new pg.Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\n\t\texpect(isConfig(cl)).toEqual(false);\n\t});\n\n\tit('node-postgres:Client', async () => {\n\t\tconst cl = new pg.Client({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst res = isConfig(cl);\n\n\t\tawait cl.end();\n\n\t\texpect(res).toEqual(false);\n\t});\n\n\tit('node-postgres:PoolClient', async () => {\n\t\tconst cl = new pg.Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst con = await cl.connect();\n\n\t\tconst res = isConfig(con);\n\n\t\tcon.release();\n\n\t\texpect(res).toEqual(false);\n\t});\n\n\tit('postgres-js', () => {\n\t\tconst cl = postgres(process.env['PG_CONNECTION_STRING']!);\n\n\t\texpect(isConfig(cl)).toEqual(false);\n\t});\n\n\tit('vercel:sql', () => {\n\t\texpect(isConfig(vcSql)).toEqual(false);\n\t});\n\n\t// it('vercel:Pool', () => {\n\t// \tconst cl = vcPool({\n\t// \t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t// \t});\n\n\t// \texpect(isConfig(cl)).toEqual(false);\n\t// });\n\n\tit('vercel:Client', async () => {\n\t\tconst cl = vcClient({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING']?.replace('-pooler', ''),\n\t\t});\n\n\t\tconst res = isConfig(cl);\n\n\t\texpect(res).toEqual(false);\n\t});\n\n\t// it('vercel:PoolClient', async () => {\n\t// \tconst cl = vcPool({\n\t// \t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t// \t});\n\n\t// \tconst con = await cl.connect();\n\n\t// \tconst res = isConfig(con);\n\n\t// \tcon.release();\n\n\t// \texpect(res).toEqual(false);\n\t// });\n\n\tit('neon-serverless:Pool', async () => {\n\t\tconst cl = new neonPool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING']!,\n\t\t});\n\n\t\texpect(isConfig(cl)).toEqual(false);\n\t});\n\n\tit('neon-serverless:Client', async () => {\n\t\tconst cl = new neonClient({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING']!,\n\t\t});\n\n\t\tconst res = isConfig(cl);\n\n\t\tawait cl.end();\n\n\t\texpect(res).toEqual(false);\n\t});\n\n\tit('neon-serverless:PoolClient', async () => {\n\t\tconst cl = new neonPool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING']!,\n\t\t});\n\n\t\tconst con = await cl.connect();\n\n\t\tconst res = isConfig(con);\n\n\t\tcon.release();\n\n\t\texpect(res).toEqual(false);\n\t});\n\n\tit('neon-http', async () => {\n\t\tconst cl = neon(process.env['NEON_CONNECTION_STRING']!);\n\n\t\texpect(isConfig(cl)).toEqual(false);\n\t});\n\n\tit('planetscale', async () => {\n\t\tconst cl = planetscale({\n\t\t\turl: process.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t});\n\n\t\texpect(isConfig(cl)).toEqual(false);\n\t});\n\n\tit('mysql2:Pool', async () => {\n\t\tconst cl = ms2Pool({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\texpect(isConfig(cl)).toEqual(false);\n\t});\n\n\tit('mysql2:Connection', async () => {\n\t\tconst cl = ms2Connection({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\texpect(isConfig(cl)).toEqual(false);\n\t});\n\n\tit('mysql2/promise:Pool', async () => {\n\t\tconst cl = await ms2pPool({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst res = isConfig(cl);\n\n\t\tawait cl.end();\n\n\t\texpect(res).toEqual(false);\n\t});\n\n\tit('mysql2/promise:Connection', async () => {\n\t\tconst cl = await ms2pConnection({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst res = isConfig(cl);\n\n\t\tawait cl.end();\n\n\t\texpect(res).toEqual(false);\n\t});\n\n\tit('tidb', async () => {\n\t\tconst cl = tidb({\n\t\t\turl: process.env['TIDB_CONNECTION_STRING'],\n\t\t});\n\n\t\texpect(isConfig(cl)).toEqual(false);\n\t});\n});\n\ndescribe('Accepts drivers in .client', (it) => {\n\tit('libsql', () => {\n\t\tconst cl = libsql({\n\t\t\turl: ':memory:',\n\t\t});\n\n\t\texpect(isConfig({ client: cl })).toEqual(true);\n\t});\n\n\tit('better-sqlite3', () => {\n\t\tconst cl = new betterSqlite3(':memory:');\n\n\t\texpect(isConfig({ client: cl })).toEqual(true);\n\t});\n\n\tit('pglite', () => {\n\t\tconst cl = new pglite('memory://');\n\n\t\texpect(isConfig({ client: cl })).toEqual(true);\n\t});\n\n\tit('node-postgres:Pool', () => {\n\t\tconst cl = new pg.Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\n\t\texpect(isConfig({ client: cl })).toEqual(true);\n\t});\n\n\tit('node-postgres:Client', async () => {\n\t\tconst cl = new pg.Client({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst res = isConfig({ client: cl });\n\n\t\tawait cl.end();\n\n\t\texpect(res).toEqual(true);\n\t});\n\n\tit('node-postgres:PoolClient', async () => {\n\t\tconst cl = new pg.Pool({\n\t\t\tconnectionString: process.env['PG_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst con = await cl.connect();\n\n\t\tconst res = isConfig({ client: con });\n\n\t\tcon.release();\n\n\t\texpect(res).toEqual(true);\n\t});\n\n\tit('postgres-js', () => {\n\t\tconst cl = postgres(process.env['PG_CONNECTION_STRING']!);\n\n\t\texpect(isConfig({ client: cl })).toEqual(true);\n\t});\n\n\tit('vercel:sql', () => {\n\t\texpect(isConfig({ client: vcSql })).toEqual(true);\n\t});\n\n\t// it('vercel:Pool', () => {\n\t// \tconst cl = vcPool({\n\t// \t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t// \t});\n\n\t// \texpect(isConfig({client:cl})).toEqual(true);\n\t// });\n\n\tit('vercel:Client', async () => {\n\t\tconst cl = vcClient({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING']?.replace('-pooler', ''),\n\t\t});\n\n\t\tconst res = isConfig({ client: cl });\n\n\t\texpect(res).toEqual(true);\n\t});\n\n\t// it('vercel:PoolClient', async () => {\n\t// \tconst cl = vcPool({\n\t// \t\tconnectionString: process.env['VERCEL_CONNECTION_STRING'],\n\t// \t});\n\n\t// \tconst con = await cl.connect();\n\n\t// \tconst res = isConfig({ client: con });\n\n\t// \tcon.release();\n\n\t// \texpect(res).toEqual(true);\n\t// });\n\n\tit('neon-serverless:Pool', async () => {\n\t\tconst cl = new neonPool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING']!,\n\t\t});\n\n\t\texpect(isConfig({ client: cl })).toEqual(true);\n\t});\n\n\tit('neon-serverless:Client', async () => {\n\t\tconst cl = new neonClient({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING']!,\n\t\t});\n\n\t\tconst res = isConfig({ client: cl });\n\n\t\tawait cl.end();\n\n\t\texpect(res).toEqual(true);\n\t});\n\n\tit('neon-serverless:PoolClient', async () => {\n\t\tconst cl = new neonPool({\n\t\t\tconnectionString: process.env['NEON_CONNECTION_STRING']!,\n\t\t});\n\n\t\tconst con = await cl.connect();\n\n\t\tconst res = isConfig({ client: con });\n\n\t\tcon.release();\n\n\t\texpect(res).toEqual(true);\n\t});\n\n\tit('neon-http', async () => {\n\t\tconst cl = neon(process.env['NEON_CONNECTION_STRING']!);\n\n\t\texpect(isConfig({ client: cl })).toEqual(true);\n\t});\n\n\tit('planetscale', async () => {\n\t\tconst cl = planetscale({\n\t\t\turl: process.env['PLANETSCALE_CONNECTION_STRING'],\n\t\t});\n\n\t\texpect(isConfig({ client: cl })).toEqual(true);\n\t});\n\n\tit('mysql2:Pool', async () => {\n\t\tconst cl = ms2Pool({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\texpect(isConfig({ client: cl })).toEqual(true);\n\t});\n\n\tit('mysql2:Connection', async () => {\n\t\tconst cl = ms2Connection({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\texpect(isConfig({ client: cl })).toEqual(true);\n\t});\n\n\tit('mysql2/promise:Pool', async () => {\n\t\tconst cl = await ms2pPool({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst res = isConfig({ client: cl });\n\n\t\tawait cl.end();\n\n\t\texpect(res).toEqual(true);\n\t});\n\n\tit('mysql2/promise:Connection', async () => {\n\t\tconst cl = await ms2pConnection({\n\t\t\turi: process.env['MYSQL_CONNECTION_STRING'],\n\t\t});\n\n\t\tconst res = isConfig({ client: cl });\n\n\t\tawait cl.end();\n\n\t\texpect(res).toEqual(true);\n\t});\n\n\tit('tidb', async () => {\n\t\tconst cl = tidb({\n\t\t\turl: process.env['TIDB_CONNECTION_STRING'],\n\t\t});\n\n\t\texpect(isConfig({ client: cl })).toEqual(true);\n\t});\n});\n"
  },
  {
    "path": "integration-tests/tests/utils.ts",
    "content": "// shut up eslint you cannot possibly comprehend what's happening here\n// eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars\nexport function Expect<T extends true>() {}\n\nexport type Equal<X, Y extends X> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true\n\t: false;\n\nexport function toLocalDate(date: Date) {\n\tconst localTime = new Date(date.getTime() - date.getTimezoneOffset() * 60000);\n\tlocalTime.setUTCHours(0);\n\treturn localTime;\n}\n\nexport const randomString = () =>\n\tArray.from({ length: 10 }, () => 'abcdefghijklmnopqrstuvwxyz'[Math.floor(Math.random() * 26)]).join('');\n"
  },
  {
    "path": "integration-tests/tests/version.test.ts",
    "content": "import 'dotenv/config';\n\nimport * as version from 'drizzle-orm/version';\nimport { expect, test } from 'vitest';\nimport { z } from 'zod';\n\ntest('shape', () => {\n\tconst shape = z.object({\n\t\tcompatibilityVersion: z.number(),\n\t\tnpmVersion: z.string(),\n\t});\n\texpect(() => shape.parse(version)).not.toThrowError();\n});\n"
  },
  {
    "path": "integration-tests/tests/xata/xata.ts",
    "content": "// Generated by Xata Codegen 0.29.3. Please do not edit.\nimport { buildClient } from '@xata.io/client';\nimport type { BaseClientOptions, SchemaInference } from '@xata.io/client';\n\nconst tables = [] as const;\n\nexport type SchemaTables = typeof tables;\nexport type InferredTypes = SchemaInference<SchemaTables>;\n\nexport type DatabaseSchema = {};\n\nconst DatabaseClient = buildClient();\n\nconst defaultOptions = {\n\tdatabaseURL: 'https://Andrii-Sherman-s-workspace-2r5ujp.us-east-1.xata.sh/db/integration-tests',\n};\n\n// eslint-disable-next-line drizzle-internal/require-entity-kind\nexport class XataClient extends DatabaseClient<DatabaseSchema> {\n\tconstructor(options?: BaseClientOptions) {\n\t\tsuper({ ...defaultOptions, ...options }, tables);\n\t}\n}\n\nlet instance: XataClient | undefined;\n\nexport const getXataClient = () => {\n\tif (instance) return instance;\n\n\tinstance = new XataClient();\n\treturn instance;\n};\n"
  },
  {
    "path": "integration-tests/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"checkJs\": false,\n\t\t\"noEmit\": true,\n\t\t\"paths\": {\n\t\t\t\"~/*\": [\"./tests/*\"]\n\t\t}\n\t},\n\t\"include\": [\"tests\", \"type-tests\"],\n\t\"exclude\": [\"**/playground\", \"**/.sst\", \"tests/prisma/*/client/**/*.js\"]\n}\n"
  },
  {
    "path": "integration-tests/type-tests/join-nodenext/gel.ts",
    "content": "import { eq } from 'drizzle-orm';\nimport { drizzle } from 'drizzle-orm/gel';\nimport { gelTable, text, uuid } from 'drizzle-orm/gel-core';\nimport { expectTypeOf } from 'vitest';\n\nconst account = gelTable('accounts', {\n\tid: uuid('id').primaryKey().notNull(),\n\tuserId: uuid('user_id')\n\t\t.notNull()\n\t\t.references(() => users.id),\n\tmeta: text().notNull(),\n});\n\nconst users = gelTable('users', {\n\tid: uuid('id').primaryKey(),\n\tname: text('name').notNull(),\n\tusername: text('username').notNull().unique(),\n});\n\nconst db = drizzle.mock();\n\n(async () => {\n\tconst res = await db.select()\n\t\t.from(users)\n\t\t.innerJoin(account, eq(users.id, account.id));\n\n\texpectTypeOf(res).toEqualTypeOf<{\n\t\taccounts: {\n\t\t\tid: string;\n\t\t\tuserId: string;\n\t\t\tmeta: string;\n\t\t};\n\t\tusers: {\n\t\t\tid: string;\n\t\t\tname: string;\n\t\t\tusername: string;\n\t\t};\n\t}[]>();\n});\n"
  },
  {
    "path": "integration-tests/type-tests/join-nodenext/mysql.ts",
    "content": "import { eq } from 'drizzle-orm';\nimport { mysqlTable, text } from 'drizzle-orm/mysql-core';\nimport { drizzle } from 'drizzle-orm/mysql2';\nimport { expectTypeOf } from 'vitest';\n\nconst account = mysqlTable('accounts', {\n\tid: text('id').primaryKey().notNull(),\n\tuserId: text('user_id')\n\t\t.notNull()\n\t\t.references(() => users.id),\n\tmeta: text().notNull(),\n});\n\nconst users = mysqlTable('users', {\n\tid: text('id').primaryKey(),\n\tname: text('name').notNull(),\n\tusername: text('username').notNull().unique(),\n});\n\nconst db = drizzle.mock();\n\n(async () => {\n\tconst res = await db.select()\n\t\t.from(users)\n\t\t.innerJoin(account, eq(users.id, account.id));\n\n\texpectTypeOf(res).toEqualTypeOf<{\n\t\taccounts: {\n\t\t\tid: string;\n\t\t\tuserId: string;\n\t\t\tmeta: string;\n\t\t};\n\t\tusers: {\n\t\t\tid: string;\n\t\t\tname: string;\n\t\t\tusername: string;\n\t\t};\n\t}[]>();\n});\n"
  },
  {
    "path": "integration-tests/type-tests/join-nodenext/package.json",
    "content": "{\n\t\"type\": \"commonjs\"\n}\n"
  },
  {
    "path": "integration-tests/type-tests/join-nodenext/pg.ts",
    "content": "import { eq } from 'drizzle-orm';\nimport { pgTable, text, uuid } from 'drizzle-orm/pg-core';\nimport { drizzle } from 'drizzle-orm/pglite';\nimport { expectTypeOf } from 'vitest';\n\nconst account = pgTable('accounts', {\n\tid: uuid('id').primaryKey().notNull(),\n\tuserId: uuid('user_id')\n\t\t.notNull()\n\t\t.references(() => users.id),\n\tmeta: text().notNull(),\n});\n\nconst users = pgTable('users', {\n\tid: uuid('id').primaryKey(),\n\tname: text('name').notNull(),\n\tusername: text('username').notNull().unique(),\n});\n\nconst db = drizzle.mock();\n\n(async () => {\n\tconst res = await db.select()\n\t\t.from(users)\n\t\t.innerJoin(account, eq(users.id, account.id));\n\n\texpectTypeOf(res).toEqualTypeOf<{\n\t\taccounts: {\n\t\t\tid: string;\n\t\t\tuserId: string;\n\t\t\tmeta: string;\n\t\t};\n\t\tusers: {\n\t\t\tid: string;\n\t\t\tname: string;\n\t\t\tusername: string;\n\t\t};\n\t}[]>();\n});\n"
  },
  {
    "path": "integration-tests/type-tests/join-nodenext/singlestore.ts",
    "content": "import { eq } from 'drizzle-orm';\nimport { drizzle } from 'drizzle-orm/singlestore';\nimport { singlestoreTable, text } from 'drizzle-orm/singlestore-core';\nimport { expectTypeOf } from 'vitest';\n\nconst account = singlestoreTable('accounts', {\n\tid: text('id').primaryKey().notNull(),\n\tuserId: text('user_id')\n\t\t.notNull(),\n\tmeta: text().notNull(),\n});\n\nconst users = singlestoreTable('users', {\n\tid: text('id').primaryKey(),\n\tname: text('name').notNull(),\n\tusername: text('username').notNull().unique(),\n});\n\nconst db = drizzle.mock();\n\n(async () => {\n\tconst res = await db.select()\n\t\t.from(users)\n\t\t.innerJoin(account, eq(users.id, account.id));\n\n\texpectTypeOf(res).toEqualTypeOf<{\n\t\taccounts: {\n\t\t\tid: string;\n\t\t\tuserId: string;\n\t\t\tmeta: string;\n\t\t};\n\t\tusers: {\n\t\t\tid: string;\n\t\t\tname: string;\n\t\t\tusername: string;\n\t\t};\n\t}[]>();\n});\n"
  },
  {
    "path": "integration-tests/type-tests/join-nodenext/sqlite.ts",
    "content": "import { eq } from 'drizzle-orm';\nimport { drizzle } from 'drizzle-orm/libsql';\nimport { sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport { expectTypeOf } from 'vitest';\n\nconst account = sqliteTable('accounts', {\n\tid: text('id').primaryKey().notNull(),\n\tuserId: text('user_id')\n\t\t.notNull()\n\t\t.references(() => users.id),\n\tmeta: text().notNull(),\n});\n\nconst users = sqliteTable('users', {\n\tid: text('id').primaryKey(),\n\tname: text('name').notNull(),\n\tusername: text('username').notNull().unique(),\n});\n\nconst db = drizzle.mock();\n\n(async () => {\n\tconst res = await db.select()\n\t\t.from(users)\n\t\t.innerJoin(account, eq(users.id, account.id));\n\n\texpectTypeOf(res).toEqualTypeOf<{\n\t\taccounts: {\n\t\t\tid: string;\n\t\t\tuserId: string;\n\t\t\tmeta: string;\n\t\t};\n\t\tusers: {\n\t\t\tid: string;\n\t\t\tname: string;\n\t\t\tusername: string;\n\t\t};\n\t}[]>();\n});\n"
  },
  {
    "path": "integration-tests/type-tests/join-nodenext/tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t\"useDefineForClassFields\": true,\n\t\t\"module\": \"nodenext\",\n\t\t\"target\": \"es2022\",\n\t\t\"moduleResolution\": \"node16\",\n\t\t\"skipLibCheck\": true,\n\t\t\"allowImportingTsExtensions\": true,\n\t\t\"moduleDetection\": \"force\",\n\t\t\"noEmit\": true,\n\t\t\"strict\": true,\n\t\t\"noUnusedLocals\": true,\n\t\t\"noUnusedParameters\": true,\n\t\t\"noFallthroughCasesInSwitch\": true,\n\t\t\"noUncheckedSideEffectImports\": true\n\t},\n\t\"noEmit\": true,\n\t\"include\": [\"./*.ts\"]\n}\n"
  },
  {
    "path": "integration-tests/vitest-ci.config.ts",
    "content": "import 'dotenv/config';\nimport tsconfigPaths from 'vite-tsconfig-paths';\nimport { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n\ttest: {\n\t\ttypecheck: {\n\t\t\ttsconfig: 'tsconfig.json',\n\t\t},\n\t\ttestTimeout: 100000,\n\t\thookTimeout: 200000,\n\t\tisolate: true,\n\t\tpoolOptions: {\n\t\t\tthreads: {\n\t\t\t\tsingleThread: true,\n\t\t\t},\n\t\t},\n\t\tmaxWorkers: 1,\n\t\tfileParallelism: false,\n\t},\n\tplugins: [tsconfigPaths()],\n});\n"
  },
  {
    "path": "integration-tests/vitest.config.ts",
    "content": "import 'dotenv/config';\nimport tsconfigPaths from 'vite-tsconfig-paths';\nimport { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n\ttest: {\n\t\tinclude: [\n\t\t\t'tests/seeder/**/*.test.ts',\n\t\t\t'tests/extensions/postgis/**/*',\n\t\t\t'tests/relational/**/*.test.ts',\n\t\t\t'tests/pg/**/*.test.ts',\n\t\t\t'tests/mysql/**/*.test.ts',\n\t\t\t'tests/singlestore/**/*.test.ts',\n\t\t\t'tests/sqlite/**/*.test.ts',\n\t\t\t'tests/replicas/**/*',\n\t\t\t'tests/imports/**/*',\n\t\t\t'tests/extensions/vectors/**/*',\n\t\t\t'tests/version.test.ts',\n\t\t\t'tests/pg/node-postgres.test.ts',\n\t\t\t'tests/utils/is-config.test.ts',\n\t\t\t'js-tests/driver-init/commonjs/*.test.cjs',\n\t\t\t'js-tests/driver-init/module/*.test.mjs',\n\t\t\t'tests/gel/**/*.test.ts',\n\t\t],\n\t\texclude: [\n\t\t\t...(process.env.SKIP_EXTERNAL_DB_TESTS\n\t\t\t\t? [\n\t\t\t\t\t'tests/relational/mysql.planetscale.test.ts',\n\t\t\t\t\t'tests/pg/neon-serverless.test.ts',\n\t\t\t\t\t'tests/mysql/tidb-serverless.test.ts',\n\t\t\t\t\t'tests/mysql/mysql-planetscale.test.ts',\n\t\t\t\t\t'tests/sqlite/libsql.test.ts',\n\t\t\t\t\t'tests/sqlite/libsql-batch.test.ts',\n\t\t\t\t\t'tests/pg/neon-http.test.ts',\n\t\t\t\t\t'tests/pg/neon-http-batch.test.ts',\n\t\t\t\t\t'tests/utils/is-config.test.ts', // Uses external DBs in some cases\n\t\t\t\t\t'js-tests/driver-init/commonjs/neon-http.test.cjs',\n\t\t\t\t\t'js-tests/driver-init/commonjs/neon-ws.test.cjs',\n\t\t\t\t\t'js-tests/driver-init/commonjs/planetscale.test.cjs',\n\t\t\t\t\t'js-tests/driver-init/commonjs/tidb.test.cjs',\n\t\t\t\t\t'js-tests/driver-init/commonjs/vercel.test.cjs',\n\t\t\t\t\t'js-tests/driver-init/module/neon-http.test.mjs',\n\t\t\t\t\t'js-tests/driver-init/module/neon-ws.test.mjs',\n\t\t\t\t\t'js-tests/driver-init/module/planetscale.test.mjs',\n\t\t\t\t\t'js-tests/driver-init/module/tidb.test.mjs',\n\t\t\t\t\t'js-tests/driver-init/module/vercel.test.mjs',\n\t\t\t\t]\n\t\t\t\t: []),\n\t\t\t'tests/pg/awsdatapi.test.ts',\n\t\t\t'tests/awsdatapi.alltypes.test.ts',\n\t\t\t'tests/pg/vercel-pg.test.ts',\n\t\t\t'tests/relational/vercel.test.ts',\n\t\t\t// Have a strange \"invalid SQL: ERROR: must be owner of schema public\" error. Will need to check with xata team\n\t\t\t'tests/pg/xata-http.test.ts',\n\t\t\t'tests/pg/neon-http-batch.ts',\n\t\t\t// todo: remove\n\t\t\t'js-tests/driver-init/module/vercel.test.mjs',\n\t\t\t'js-tests/driver-init/commonjs/vercel.test.cjs',\n\t\t\t// move back after decide on speed\n\t\t\t'tests/sqlite/libsql-ws.test.ts',\n\t\t\t'tests/sqlite/libsql-http.test.ts',\n\t\t\t'tests/mysql/tidb-serverless.test.ts',\n\t\t\t// waiting for json_array from singlestore team\n\t\t\t'tests/relational/singlestore.test.ts',\n\t\t\t'js-tests/driver-init/module/planetscale.test.mjs',\n\t\t\t'js-tests/driver-init/module/planetscale.test.cjs',\n\t\t\t'js-tests/driver-init/commonjs/planetscale.test.cjs',\n\t\t],\n\t\ttypecheck: {\n\t\t\ttsconfig: 'tsconfig.json',\n\t\t},\n\t\ttestTimeout: 100000,\n\t\thookTimeout: 200000,\n\t\tisolate: true,\n\t\tpoolOptions: {\n\t\t\tthreads: {\n\t\t\t\tsingleThread: true,\n\t\t\t},\n\t\t},\n\t\tmaxWorkers: 1,\n\t\tfileParallelism: false,\n\t},\n\tplugins: [tsconfigPaths()],\n});\n"
  },
  {
    "path": "package.json",
    "content": "{\n\t\"name\": \"drizzle-root\",\n\t\"private\": true,\n\t\"scripts\": {\n\t\t\"build:orm\": \"turbo run build --filter drizzle-orm --color\",\n\t\t\"build\": \"turbo run build test:types //#lint --color\",\n\t\t\"b\": \"pnpm build\",\n\t\t\"pack\": \"turbo run pack --color\",\n\t\t\"test\": \"turbo run test --color\",\n\t\t\"t\": \"pnpm test\",\n\t\t\"test:types\": \"turbo run test:types --color\",\n\t\t\"lint\": \"dprint check --list-different\",\n\t\t\"lint:fix\": \"dprint fmt\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@arethetypeswrong/cli\": \"0.15.3\",\n\t\t\"@trivago/prettier-plugin-sort-imports\": \"^5.2.2\",\n\t\t\"@typescript-eslint/eslint-plugin\": \"^6.7.3\",\n\t\t\"@typescript-eslint/experimental-utils\": \"^5.62.0\",\n\t\t\"@typescript-eslint/parser\": \"^6.7.3\",\n\t\t\"bun-types\": \"^1.2.0\",\n\t\t\"concurrently\": \"^8.2.1\",\n\t\t\"dprint\": \"^0.46.2\",\n\t\t\"drizzle-kit\": \"^0.19.13\",\n\t\t\"drizzle-orm\": \"workspace:./drizzle-orm/dist\",\n\t\t\"drizzle-orm-old\": \"npm:drizzle-orm@^0.27.2\",\n\t\t\"eslint\": \"^8.50.0\",\n\t\t\"eslint-plugin-drizzle-internal\": \"link:eslint/eslint-plugin-drizzle-internal\",\n\t\t\"eslint-plugin-import\": \"^2.28.1\",\n\t\t\"eslint-plugin-no-instanceof\": \"^1.0.1\",\n\t\t\"eslint-plugin-unicorn\": \"^48.0.1\",\n\t\t\"eslint-plugin-unused-imports\": \"^3.0.0\",\n\t\t\"glob\": \"^10.3.10\",\n\t\t\"prettier\": \"^3.0.3\",\n\t\t\"recast\": \"^0.23.9\",\n\t\t\"resolve-tspaths\": \"^0.8.16\",\n\t\t\"tsup\": \"^8.3.5\",\n\t\t\"tsx\": \"^4.10.5\",\n\t\t\"turbo\": \"^2.2.3\",\n\t\t\"typescript\": \"5.6.3\"\n\t},\n\t\"packageManager\": \"pnpm@10.6.3\"\n}\n"
  },
  {
    "path": "patches/typescript@5.6.3.patch",
    "content": "diff --git a/lib/tsserver.js b/lib/tsserver.js\nindex 3f1ce62663e3c32aa487f0fc7dcb3dd940e7cd24..559f2f70531180c5d54d98b18ae54a67eab54e1d 100644\n--- a/lib/tsserver.js\n+++ b/lib/tsserver.js\n@@ -15203,7 +15203,7 @@ function isInternalDeclaration(node, sourceFile) {\n // src/compiler/utilities.ts\n var resolvingEmptyArray = [];\n var externalHelpersModuleNameText = \"tslib\";\n-var defaultMaximumTruncationLength = 160;\n+var defaultMaximumTruncationLength = 1e6;\n var noTruncationMaximumTruncationLength = 1e6;\n function getDeclarationOfKind(symbol, kind) {\n   const declarations = symbol.declarations;\n"
  },
  {
    "path": "pnpm-workspace.yaml",
    "content": "packages:\n  - drizzle-orm\n  - drizzle-kit\n  - drizzle-zod\n  - drizzle-typebox\n  - drizzle-valibot\n  - drizzle-arktype\n  - drizzle-seed\n  - integration-tests\n  - eslint-plugin-drizzle\nonlyBuiltDependencies:\n  - '@contrast/fn-inspect'\n  - '@newrelic/native-metrics'\n  - '@prisma/client'\n  - '@prisma/engines'\n  - better-sqlite3\n  - bufferutil\n  - cpu-features\n  - dprint\n  - es5-ext\n  - esbuild\n  - prisma\n  - protobufjs\n  - sqlite3\n  - ssh2\n  - utf-8-validate\n  - workerd\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t\"isolatedModules\": true,\n\t\t\"composite\": false,\n\t\t\"target\": \"esnext\",\n\t\t\"module\": \"esnext\",\n\t\t\"moduleResolution\": \"bundler\",\n\t\t\"lib\": [\"es2022\", \"es2020\", \"es2018\", \"es2017\", \"es7\", \"es6\", \"es5\"],\n\t\t\"declaration\": false, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */\n\t\t\"declarationMap\": false,\n\t\t\"sourceMap\": true,\n\t\t\"allowJs\": true,\n\t\t\"incremental\": false,\n\t\t\"stripInternal\": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */\n\t\t\"allowSyntheticDefaultImports\": true, /* Allow 'import x from y' when a module doesn't have a default export. */\n\t\t\"esModuleInterop\": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */\n\t\t\"forceConsistentCasingInFileNames\": true, /* Ensure that casing is correct in imports. */\n\t\t\"strict\": true, /* Enable all strict type-checking options. */\n\t\t\"noImplicitAny\": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */\n\t\t\"strictNullChecks\": true, /* When type checking, take into account 'null' and 'undefined'. */\n\t\t\"strictFunctionTypes\": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */\n\t\t\"strictBindCallApply\": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */\n\t\t\"strictPropertyInitialization\": true, /* Check for class properties that are declared but not set in the constructor. */\n\t\t\"noImplicitThis\": true, /* Enable error reporting when 'this' is given the type 'any'. */\n\t\t\"useUnknownInCatchVariables\": true, /* Default catch clause variables as 'unknown' instead of 'any'. */\n\t\t\"alwaysStrict\": true, /* Ensure 'use strict' is always emitted. */\n\t\t\"exactOptionalPropertyTypes\": false, /* Interpret optional property types as written, rather than adding 'undefined'. */\n\t\t\"noImplicitReturns\": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */\n\t\t\"noFallthroughCasesInSwitch\": true, /* Enable error reporting for fallthrough cases in switch statements. */\n\t\t\"noUncheckedIndexedAccess\": true, /* Add 'undefined' to a type when accessed using an index. */\n\t\t\"noImplicitOverride\": true, /* Ensure overriding members in derived classes are marked with an override modifier. */\n\t\t\"noPropertyAccessFromIndexSignature\": true, /* Enforces using indexed accessors for keys declared using an indexed type. */\n\t\t\"allowUnusedLabels\": false, /* Disable error reporting for unused labels. */\n\t\t\"allowUnreachableCode\": false, /* Disable error reporting for unreachable code. */\n\t\t\"skipLibCheck\": true, /* Skip type checking all .d.ts files. */\n\t\t\"noErrorTruncation\": true, /* Disable truncating types in error messages. */\n\t\t\"checkJs\": true,\n\t\t\"allowImportingTsExtensions\": true\n\t},\n\t\"exclude\": [\"**/dist\"]\n}\n"
  },
  {
    "path": "turbo.json",
    "content": "{\n\t\"$schema\": \"https://turbo.build/schema.json\",\n\t\"tasks\": {\n\t\t\"//#lint\": {\n\t\t\t\"dependsOn\": [\n\t\t\t\t\"^test:types\",\n\t\t\t\t\"drizzle-orm#build\"\n\t\t\t],\n\t\t\t\"inputs\": [\n\t\t\t\t\"**/*.ts\",\n\t\t\t\t\"!**/node_modules\",\n\t\t\t\t\"!**/dist\",\n\t\t\t\t\"!**/dist-dts\"\n\t\t\t],\n\t\t\t\"outputLogs\": \"new-only\"\n\t\t},\n\t\t\"test:types\": {\n\t\t\t\"dependsOn\": [\n\t\t\t\t\"^test:types\",\n\t\t\t\t\"drizzle-orm#build\",\n\t\t\t\t\"drizzle-seed#build\"\n\t\t\t],\n\t\t\t\"inputs\": [\n\t\t\t\t\"src/**/*.ts\",\n\t\t\t\t\"tests/**/*.ts\",\n\t\t\t\t\"tsconfig.json\",\n\t\t\t\t\"tests/tsconfig.json\",\n\t\t\t\t\"../tsconfig.json\"\n\t\t\t],\n\t\t\t\"outputLogs\": \"new-only\"\n\t\t},\n\t\t\"drizzle-orm#build\": {\n\t\t\t\"inputs\": [\n\t\t\t\t\"src/**/*.ts\",\n\t\t\t\t\"package.json\",\n\t\t\t\t\"README.md\",\n\t\t\t\t\"../README.md\",\n\t\t\t\t\"tsconfig.json\",\n\t\t\t\t\"tsconfig.*.json\",\n\t\t\t\t\"tsup.config.ts\",\n\t\t\t\t\"scripts/build.ts\",\n\t\t\t\t\"scripts/fix-imports.ts\",\n\t\t\t\t\"../tsconfig.json\"\n\t\t\t],\n\t\t\t\"outputs\": [\n\t\t\t\t\"dist/**\",\n\t\t\t\t\"dist-dts/**\"\n\t\t\t],\n\t\t\t\"outputLogs\": \"new-only\"\n\t\t},\n\t\t\"drizzle-kit#build\": {\n\t\t\t\"dependsOn\": [\n\t\t\t\t\"drizzle-orm#build\"\n\t\t\t],\n\t\t\t\"inputs\": [\n\t\t\t\t\"src/**/*.ts\",\n\t\t\t\t\"package.json\",\n\t\t\t\t\"README.md\",\n\t\t\t\t\"../README.md\",\n\t\t\t\t\"tsconfig.json\",\n\t\t\t\t\"tsconfig.*.json\",\n\t\t\t\t\"tsup.config.ts\",\n\t\t\t\t\"scripts/build.ts\",\n\t\t\t\t\"scripts/fix-imports.ts\",\n\t\t\t\t\"../tsconfig.json\"\n\t\t\t],\n\t\t\t\"outputs\": [\n\t\t\t\t\"dist/**\",\n\t\t\t\t\"dist-dts/**\"\n\t\t\t],\n\t\t\t\"outputLogs\": \"new-only\"\n\t\t},\n\t\t\"drizzle-zod#build\": {\n\t\t\t\"dependsOn\": [\n\t\t\t\t\"drizzle-orm#build\"\n\t\t\t],\n\t\t\t\"inputs\": [\n\t\t\t\t\"src/**/*.ts\",\n\t\t\t\t\"package.json\",\n\t\t\t\t\"README.md\",\n\t\t\t\t\"../README.md\",\n\t\t\t\t\"tsconfig.json\",\n\t\t\t\t\"tsconfig.*.json\",\n\t\t\t\t\"tsup.config.ts\",\n\t\t\t\t\"scripts/build.ts\",\n\t\t\t\t\"scripts/fix-imports.ts\",\n\t\t\t\t\"../tsconfig.json\"\n\t\t\t],\n\t\t\t\"outputs\": [\n\t\t\t\t\"dist/**\",\n\t\t\t\t\"dist-dts/**\"\n\t\t\t],\n\t\t\t\"outputLogs\": \"new-only\"\n\t\t},\n\t\t\"drizzle-typebox#build\": {\n\t\t\t\"dependsOn\": [\n\t\t\t\t\"drizzle-orm#build\"\n\t\t\t],\n\t\t\t\"inputs\": [\n\t\t\t\t\"src/**/*.ts\",\n\t\t\t\t\"package.json\",\n\t\t\t\t\"README.md\",\n\t\t\t\t\"../README.md\",\n\t\t\t\t\"tsconfig.json\",\n\t\t\t\t\"tsconfig.*.json\",\n\t\t\t\t\"tsup.config.ts\",\n\t\t\t\t\"scripts/build.ts\",\n\t\t\t\t\"scripts/fix-imports.ts\",\n\t\t\t\t\"../tsconfig.json\"\n\t\t\t],\n\t\t\t\"outputs\": [\n\t\t\t\t\"dist/**\",\n\t\t\t\t\"dist-dts/**\"\n\t\t\t],\n\t\t\t\"outputLogs\": \"new-only\"\n\t\t},\n\t\t\"drizzle-valibot#build\": {\n\t\t\t\"dependsOn\": [\n\t\t\t\t\"drizzle-orm#build\"\n\t\t\t],\n\t\t\t\"inputs\": [\n\t\t\t\t\"src/**/*.ts\",\n\t\t\t\t\"package.json\",\n\t\t\t\t\"README.md\",\n\t\t\t\t\"../README.md\",\n\t\t\t\t\"tsconfig.json\",\n\t\t\t\t\"tsconfig.*.json\",\n\t\t\t\t\"tsup.config.ts\",\n\t\t\t\t\"scripts/build.ts\",\n\t\t\t\t\"scripts/fix-imports.ts\",\n\t\t\t\t\"../tsconfig.json\"\n\t\t\t],\n\t\t\t\"outputs\": [\n\t\t\t\t\"dist/**\",\n\t\t\t\t\"dist-dts/**\"\n\t\t\t],\n\t\t\t\"outputLogs\": \"new-only\"\n\t\t},\n\t\t\"drizzle-arktype#build\": {\n\t\t\t\"dependsOn\": [\n\t\t\t\t\"drizzle-orm#build\"\n\t\t\t],\n\t\t\t\"inputs\": [\n\t\t\t\t\"src/**/*.ts\",\n\t\t\t\t\"package.json\",\n\t\t\t\t\"README.md\",\n\t\t\t\t\"../README.md\",\n\t\t\t\t\"tsconfig.json\",\n\t\t\t\t\"tsconfig.*.json\",\n\t\t\t\t\"tsup.config.ts\",\n\t\t\t\t\"scripts/build.ts\",\n\t\t\t\t\"scripts/fix-imports.ts\",\n\t\t\t\t\"../tsconfig.json\"\n\t\t\t],\n\t\t\t\"outputs\": [\n\t\t\t\t\"dist/**\",\n\t\t\t\t\"dist-dts/**\"\n\t\t\t],\n\t\t\t\"outputLogs\": \"new-only\"\n\t\t},\n\t\t\"eslint-plugin-drizzle#build\": {\n\t\t\t\"dependsOn\": [\n\t\t\t\t\"drizzle-orm#build\"\n\t\t\t],\n\t\t\t\"inputs\": [\n\t\t\t\t\"src/**/*.ts\",\n\t\t\t\t\"package.json\",\n\t\t\t\t\"README.md\",\n\t\t\t\t\"../README.md\",\n\t\t\t\t\"tsconfig.json\",\n\t\t\t\t\"tsconfig.*.json\",\n\t\t\t\t\"tsup.config.ts\",\n\t\t\t\t\"scripts/build.ts\",\n\t\t\t\t\"scripts/fix-imports.ts\",\n\t\t\t\t\"../tsconfig.json\"\n\t\t\t],\n\t\t\t\"outputs\": [\n\t\t\t\t\"dist/**\",\n\t\t\t\t\"dist-dts/**\"\n\t\t\t],\n\t\t\t\"outputLogs\": \"new-only\"\n\t\t},\n\t\t\"drizzle-seed#build\": {\n\t\t\t\"dependsOn\": [\n\t\t\t\t\"drizzle-orm#build\"\n\t\t\t],\n\t\t\t\"inputs\": [\n\t\t\t\t\"src/**/*.ts\",\n\t\t\t\t\"package.json\",\n\t\t\t\t\"README.md\",\n\t\t\t\t\"../README.md\",\n\t\t\t\t\"tsconfig.json\",\n\t\t\t\t\"tsconfig.*.json\",\n\t\t\t\t\"tsup.config.ts\",\n\t\t\t\t\"scripts/build.ts\",\n\t\t\t\t\"scripts/fix-imports.ts\",\n\t\t\t\t\"../tsconfig.json\"\n\t\t\t],\n\t\t\t\"outputs\": [\n\t\t\t\t\"dist/**\",\n\t\t\t\t\"dist-dts/**\"\n\t\t\t],\n\t\t\t\"outputLogs\": \"new-only\"\n\t\t},\n\t\t\"integration-tests#build\": {\n\t\t\t\"dependsOn\": [\n\t\t\t\t\"drizzle-orm#build\",\n\t\t\t\t\"drizzle-seed#build\"\n\t\t\t],\n\t\t\t\"inputs\": [\n\t\t\t\t\"src/**/*.ts\",\n\t\t\t\t\"package.json\",\n\t\t\t\t\"README.md\",\n\t\t\t\t\"../README.md\",\n\t\t\t\t\"tsconfig.json\",\n\t\t\t\t\"tsconfig.*.json\",\n\t\t\t\t\"tsup.config.ts\",\n\t\t\t\t\"scripts/build.ts\",\n\t\t\t\t\"scripts/fix-imports.ts\",\n\t\t\t\t\"../tsconfig.json\"\n\t\t\t],\n\t\t\t\"outputs\": [\n\t\t\t\t\"dist/**\",\n\t\t\t\t\"dist-dts/**\"\n\t\t\t],\n\t\t\t\"outputLogs\": \"new-only\"\n\t\t},\n\t\t\"pack\": {\n\t\t\t\"dependsOn\": [\n\t\t\t\t\"build\",\n\t\t\t\t\"test:types\"\n\t\t\t],\n\t\t\t\"inputs\": [\n\t\t\t\t\"dist/**\"\n\t\t\t],\n\t\t\t\"outputs\": [\n\t\t\t\t\"package.tgz\"\n\t\t\t],\n\t\t\t\"outputLogs\": \"new-only\"\n\t\t},\n\t\t\"test\": {\n\t\t\t\"dependsOn\": [\n\t\t\t\t\"build\",\n\t\t\t\t\"test:types\"\n\t\t\t],\n\t\t\t\"inputs\": [\n\t\t\t\t\"tests/**/*.test.ts\",\n\t\t\t\t\"tests/**/*.test.cjs\",\n\t\t\t\t\"tests/**/*.test.mjs\"\n\t\t\t],\n\t\t\t\"outputLogs\": \"new-only\"\n\t\t}\n\t}\n}\n"
  }
]